xref: /OK3568_Linux_fs/kernel/include/linux/i3c/device.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Copyright (C) 2018 Cadence Design Systems Inc.
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Author: Boris Brezillon <boris.brezillon@bootlin.com>
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #ifndef I3C_DEV_H
9*4882a593Smuzhiyun #define I3C_DEV_H
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun #include <linux/bitops.h>
12*4882a593Smuzhiyun #include <linux/device.h>
13*4882a593Smuzhiyun #include <linux/i2c.h>
14*4882a593Smuzhiyun #include <linux/kconfig.h>
15*4882a593Smuzhiyun #include <linux/mod_devicetable.h>
16*4882a593Smuzhiyun #include <linux/module.h>
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun /**
19*4882a593Smuzhiyun  * enum i3c_error_code - I3C error codes
20*4882a593Smuzhiyun  *
21*4882a593Smuzhiyun  * These are the standard error codes as defined by the I3C specification.
22*4882a593Smuzhiyun  * When -EIO is returned by the i3c_device_do_priv_xfers() or
23*4882a593Smuzhiyun  * i3c_device_send_hdr_cmds() one can check the error code in
24*4882a593Smuzhiyun  * &struct_i3c_priv_xfer.err or &struct i3c_hdr_cmd.err to get a better idea of
25*4882a593Smuzhiyun  * what went wrong.
26*4882a593Smuzhiyun  *
27*4882a593Smuzhiyun  * @I3C_ERROR_UNKNOWN: unknown error, usually means the error is not I3C
28*4882a593Smuzhiyun  *		       related
29*4882a593Smuzhiyun  * @I3C_ERROR_M0: M0 error
30*4882a593Smuzhiyun  * @I3C_ERROR_M1: M1 error
31*4882a593Smuzhiyun  * @I3C_ERROR_M2: M2 error
32*4882a593Smuzhiyun  */
33*4882a593Smuzhiyun enum i3c_error_code {
34*4882a593Smuzhiyun 	I3C_ERROR_UNKNOWN = 0,
35*4882a593Smuzhiyun 	I3C_ERROR_M0 = 1,
36*4882a593Smuzhiyun 	I3C_ERROR_M1,
37*4882a593Smuzhiyun 	I3C_ERROR_M2,
38*4882a593Smuzhiyun };
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun /**
41*4882a593Smuzhiyun  * enum i3c_hdr_mode - HDR mode ids
42*4882a593Smuzhiyun  * @I3C_HDR_DDR: DDR mode
43*4882a593Smuzhiyun  * @I3C_HDR_TSP: TSP mode
44*4882a593Smuzhiyun  * @I3C_HDR_TSL: TSL mode
45*4882a593Smuzhiyun  */
46*4882a593Smuzhiyun enum i3c_hdr_mode {
47*4882a593Smuzhiyun 	I3C_HDR_DDR,
48*4882a593Smuzhiyun 	I3C_HDR_TSP,
49*4882a593Smuzhiyun 	I3C_HDR_TSL,
50*4882a593Smuzhiyun };
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun /**
53*4882a593Smuzhiyun  * struct i3c_priv_xfer - I3C SDR private transfer
54*4882a593Smuzhiyun  * @rnw: encodes the transfer direction. true for a read, false for a write
55*4882a593Smuzhiyun  * @len: transfer length in bytes of the transfer
56*4882a593Smuzhiyun  * @data: input/output buffer
57*4882a593Smuzhiyun  * @data.in: input buffer. Must point to a DMA-able buffer
58*4882a593Smuzhiyun  * @data.out: output buffer. Must point to a DMA-able buffer
59*4882a593Smuzhiyun  * @err: I3C error code
60*4882a593Smuzhiyun  */
61*4882a593Smuzhiyun struct i3c_priv_xfer {
62*4882a593Smuzhiyun 	u8 rnw;
63*4882a593Smuzhiyun 	u16 len;
64*4882a593Smuzhiyun 	union {
65*4882a593Smuzhiyun 		void *in;
66*4882a593Smuzhiyun 		const void *out;
67*4882a593Smuzhiyun 	} data;
68*4882a593Smuzhiyun 	enum i3c_error_code err;
69*4882a593Smuzhiyun };
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun /**
72*4882a593Smuzhiyun  * enum i3c_dcr - I3C DCR values
73*4882a593Smuzhiyun  * @I3C_DCR_GENERIC_DEVICE: generic I3C device
74*4882a593Smuzhiyun  */
75*4882a593Smuzhiyun enum i3c_dcr {
76*4882a593Smuzhiyun 	I3C_DCR_GENERIC_DEVICE = 0,
77*4882a593Smuzhiyun };
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun #define I3C_PID_MANUF_ID(pid)		(((pid) & GENMASK_ULL(47, 33)) >> 33)
80*4882a593Smuzhiyun #define I3C_PID_RND_LOWER_32BITS(pid)	(!!((pid) & BIT_ULL(32)))
81*4882a593Smuzhiyun #define I3C_PID_RND_VAL(pid)		((pid) & GENMASK_ULL(31, 0))
82*4882a593Smuzhiyun #define I3C_PID_PART_ID(pid)		(((pid) & GENMASK_ULL(31, 16)) >> 16)
83*4882a593Smuzhiyun #define I3C_PID_INSTANCE_ID(pid)	(((pid) & GENMASK_ULL(15, 12)) >> 12)
84*4882a593Smuzhiyun #define I3C_PID_EXTRA_INFO(pid)		((pid) & GENMASK_ULL(11, 0))
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun #define I3C_BCR_DEVICE_ROLE(bcr)	((bcr) & GENMASK(7, 6))
87*4882a593Smuzhiyun #define I3C_BCR_I3C_SLAVE		(0 << 6)
88*4882a593Smuzhiyun #define I3C_BCR_I3C_MASTER		(1 << 6)
89*4882a593Smuzhiyun #define I3C_BCR_HDR_CAP			BIT(5)
90*4882a593Smuzhiyun #define I3C_BCR_BRIDGE			BIT(4)
91*4882a593Smuzhiyun #define I3C_BCR_OFFLINE_CAP		BIT(3)
92*4882a593Smuzhiyun #define I3C_BCR_IBI_PAYLOAD		BIT(2)
93*4882a593Smuzhiyun #define I3C_BCR_IBI_REQ_CAP		BIT(1)
94*4882a593Smuzhiyun #define I3C_BCR_MAX_DATA_SPEED_LIM	BIT(0)
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun /**
97*4882a593Smuzhiyun  * struct i3c_device_info - I3C device information
98*4882a593Smuzhiyun  * @pid: Provisional ID
99*4882a593Smuzhiyun  * @bcr: Bus Characteristic Register
100*4882a593Smuzhiyun  * @dcr: Device Characteristic Register
101*4882a593Smuzhiyun  * @static_addr: static/I2C address
102*4882a593Smuzhiyun  * @dyn_addr: dynamic address
103*4882a593Smuzhiyun  * @hdr_cap: supported HDR modes
104*4882a593Smuzhiyun  * @max_read_ds: max read speed information
105*4882a593Smuzhiyun  * @max_write_ds: max write speed information
106*4882a593Smuzhiyun  * @max_ibi_len: max IBI payload length
107*4882a593Smuzhiyun  * @max_read_turnaround: max read turn-around time in micro-seconds
108*4882a593Smuzhiyun  * @max_read_len: max private SDR read length in bytes
109*4882a593Smuzhiyun  * @max_write_len: max private SDR write length in bytes
110*4882a593Smuzhiyun  *
111*4882a593Smuzhiyun  * These are all basic information that should be advertised by an I3C device.
112*4882a593Smuzhiyun  * Some of them are optional depending on the device type and device
113*4882a593Smuzhiyun  * capabilities.
114*4882a593Smuzhiyun  * For each I3C slave attached to a master with
115*4882a593Smuzhiyun  * i3c_master_add_i3c_dev_locked(), the core will send the relevant CCC command
116*4882a593Smuzhiyun  * to retrieve these data.
117*4882a593Smuzhiyun  */
118*4882a593Smuzhiyun struct i3c_device_info {
119*4882a593Smuzhiyun 	u64 pid;
120*4882a593Smuzhiyun 	u8 bcr;
121*4882a593Smuzhiyun 	u8 dcr;
122*4882a593Smuzhiyun 	u8 static_addr;
123*4882a593Smuzhiyun 	u8 dyn_addr;
124*4882a593Smuzhiyun 	u8 hdr_cap;
125*4882a593Smuzhiyun 	u8 max_read_ds;
126*4882a593Smuzhiyun 	u8 max_write_ds;
127*4882a593Smuzhiyun 	u8 max_ibi_len;
128*4882a593Smuzhiyun 	u32 max_read_turnaround;
129*4882a593Smuzhiyun 	u16 max_read_len;
130*4882a593Smuzhiyun 	u16 max_write_len;
131*4882a593Smuzhiyun };
132*4882a593Smuzhiyun 
133*4882a593Smuzhiyun /*
134*4882a593Smuzhiyun  * I3C device internals are kept hidden from I3C device users. It's just
135*4882a593Smuzhiyun  * simpler to refactor things when everything goes through getter/setters, and
136*4882a593Smuzhiyun  * I3C device drivers should not have to worry about internal representation
137*4882a593Smuzhiyun  * anyway.
138*4882a593Smuzhiyun  */
139*4882a593Smuzhiyun struct i3c_device;
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun /* These macros should be used to i3c_device_id entries. */
142*4882a593Smuzhiyun #define I3C_MATCH_MANUF_AND_PART (I3C_MATCH_MANUF | I3C_MATCH_PART)
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun #define I3C_DEVICE(_manufid, _partid, _drvdata)				\
145*4882a593Smuzhiyun 	{								\
146*4882a593Smuzhiyun 		.match_flags = I3C_MATCH_MANUF_AND_PART,		\
147*4882a593Smuzhiyun 		.manuf_id = _manufid,					\
148*4882a593Smuzhiyun 		.part_id = _partid,					\
149*4882a593Smuzhiyun 		.data = _drvdata,					\
150*4882a593Smuzhiyun 	}
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun #define I3C_DEVICE_EXTRA_INFO(_manufid, _partid, _info, _drvdata)	\
153*4882a593Smuzhiyun 	{								\
154*4882a593Smuzhiyun 		.match_flags = I3C_MATCH_MANUF_AND_PART |		\
155*4882a593Smuzhiyun 			       I3C_MATCH_EXTRA_INFO,			\
156*4882a593Smuzhiyun 		.manuf_id = _manufid,					\
157*4882a593Smuzhiyun 		.part_id = _partid,					\
158*4882a593Smuzhiyun 		.extra_info = _info,					\
159*4882a593Smuzhiyun 		.data = _drvdata,					\
160*4882a593Smuzhiyun 	}
161*4882a593Smuzhiyun 
162*4882a593Smuzhiyun #define I3C_CLASS(_dcr, _drvdata)					\
163*4882a593Smuzhiyun 	{								\
164*4882a593Smuzhiyun 		.match_flags = I3C_MATCH_DCR,				\
165*4882a593Smuzhiyun 		.dcr = _dcr,						\
166*4882a593Smuzhiyun 	}
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun /**
169*4882a593Smuzhiyun  * struct i3c_driver - I3C device driver
170*4882a593Smuzhiyun  * @driver: inherit from device_driver
171*4882a593Smuzhiyun  * @probe: I3C device probe method
172*4882a593Smuzhiyun  * @remove: I3C device remove method
173*4882a593Smuzhiyun  * @id_table: I3C device match table. Will be used by the framework to decide
174*4882a593Smuzhiyun  *	      which device to bind to this driver
175*4882a593Smuzhiyun  */
176*4882a593Smuzhiyun struct i3c_driver {
177*4882a593Smuzhiyun 	struct device_driver driver;
178*4882a593Smuzhiyun 	int (*probe)(struct i3c_device *dev);
179*4882a593Smuzhiyun 	int (*remove)(struct i3c_device *dev);
180*4882a593Smuzhiyun 	const struct i3c_device_id *id_table;
181*4882a593Smuzhiyun };
182*4882a593Smuzhiyun 
drv_to_i3cdrv(struct device_driver * drv)183*4882a593Smuzhiyun static inline struct i3c_driver *drv_to_i3cdrv(struct device_driver *drv)
184*4882a593Smuzhiyun {
185*4882a593Smuzhiyun 	return container_of(drv, struct i3c_driver, driver);
186*4882a593Smuzhiyun }
187*4882a593Smuzhiyun 
188*4882a593Smuzhiyun struct device *i3cdev_to_dev(struct i3c_device *i3cdev);
189*4882a593Smuzhiyun struct i3c_device *dev_to_i3cdev(struct device *dev);
190*4882a593Smuzhiyun 
191*4882a593Smuzhiyun const struct i3c_device_id *
192*4882a593Smuzhiyun i3c_device_match_id(struct i3c_device *i3cdev,
193*4882a593Smuzhiyun 		    const struct i3c_device_id *id_table);
194*4882a593Smuzhiyun 
i3cdev_set_drvdata(struct i3c_device * i3cdev,void * data)195*4882a593Smuzhiyun static inline void i3cdev_set_drvdata(struct i3c_device *i3cdev,
196*4882a593Smuzhiyun 				      void *data)
197*4882a593Smuzhiyun {
198*4882a593Smuzhiyun 	struct device *dev = i3cdev_to_dev(i3cdev);
199*4882a593Smuzhiyun 
200*4882a593Smuzhiyun 	dev_set_drvdata(dev, data);
201*4882a593Smuzhiyun }
202*4882a593Smuzhiyun 
i3cdev_get_drvdata(struct i3c_device * i3cdev)203*4882a593Smuzhiyun static inline void *i3cdev_get_drvdata(struct i3c_device *i3cdev)
204*4882a593Smuzhiyun {
205*4882a593Smuzhiyun 	struct device *dev = i3cdev_to_dev(i3cdev);
206*4882a593Smuzhiyun 
207*4882a593Smuzhiyun 	return dev_get_drvdata(dev);
208*4882a593Smuzhiyun }
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun int i3c_driver_register_with_owner(struct i3c_driver *drv,
211*4882a593Smuzhiyun 				   struct module *owner);
212*4882a593Smuzhiyun void i3c_driver_unregister(struct i3c_driver *drv);
213*4882a593Smuzhiyun 
214*4882a593Smuzhiyun #define i3c_driver_register(__drv)		\
215*4882a593Smuzhiyun 	i3c_driver_register_with_owner(__drv, THIS_MODULE)
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun /**
218*4882a593Smuzhiyun  * module_i3c_driver() - Register a module providing an I3C driver
219*4882a593Smuzhiyun  * @__drv: the I3C driver to register
220*4882a593Smuzhiyun  *
221*4882a593Smuzhiyun  * Provide generic init/exit functions that simply register/unregister an I3C
222*4882a593Smuzhiyun  * driver.
223*4882a593Smuzhiyun  * Should be used by any driver that does not require extra init/cleanup steps.
224*4882a593Smuzhiyun  */
225*4882a593Smuzhiyun #define module_i3c_driver(__drv)		\
226*4882a593Smuzhiyun 	module_driver(__drv, i3c_driver_register, i3c_driver_unregister)
227*4882a593Smuzhiyun 
228*4882a593Smuzhiyun /**
229*4882a593Smuzhiyun  * i3c_i2c_driver_register() - Register an i2c and an i3c driver
230*4882a593Smuzhiyun  * @i3cdrv: the I3C driver to register
231*4882a593Smuzhiyun  * @i2cdrv: the I2C driver to register
232*4882a593Smuzhiyun  *
233*4882a593Smuzhiyun  * This function registers both @i2cdev and @i3cdev, and fails if one of these
234*4882a593Smuzhiyun  * registrations fails. This is mainly useful for devices that support both I2C
235*4882a593Smuzhiyun  * and I3C modes.
236*4882a593Smuzhiyun  * Note that when CONFIG_I3C is not enabled, this function only registers the
237*4882a593Smuzhiyun  * I2C driver.
238*4882a593Smuzhiyun  *
239*4882a593Smuzhiyun  * Return: 0 if both registrations succeeds, a negative error code otherwise.
240*4882a593Smuzhiyun  */
i3c_i2c_driver_register(struct i3c_driver * i3cdrv,struct i2c_driver * i2cdrv)241*4882a593Smuzhiyun static inline int i3c_i2c_driver_register(struct i3c_driver *i3cdrv,
242*4882a593Smuzhiyun 					  struct i2c_driver *i2cdrv)
243*4882a593Smuzhiyun {
244*4882a593Smuzhiyun 	int ret;
245*4882a593Smuzhiyun 
246*4882a593Smuzhiyun 	ret = i2c_add_driver(i2cdrv);
247*4882a593Smuzhiyun 	if (ret || !IS_ENABLED(CONFIG_I3C))
248*4882a593Smuzhiyun 		return ret;
249*4882a593Smuzhiyun 
250*4882a593Smuzhiyun 	ret = i3c_driver_register(i3cdrv);
251*4882a593Smuzhiyun 	if (ret)
252*4882a593Smuzhiyun 		i2c_del_driver(i2cdrv);
253*4882a593Smuzhiyun 
254*4882a593Smuzhiyun 	return ret;
255*4882a593Smuzhiyun }
256*4882a593Smuzhiyun 
257*4882a593Smuzhiyun /**
258*4882a593Smuzhiyun  * i3c_i2c_driver_unregister() - Unregister an i2c and an i3c driver
259*4882a593Smuzhiyun  * @i3cdrv: the I3C driver to register
260*4882a593Smuzhiyun  * @i2cdrv: the I2C driver to register
261*4882a593Smuzhiyun  *
262*4882a593Smuzhiyun  * This function unregisters both @i3cdrv and @i2cdrv.
263*4882a593Smuzhiyun  * Note that when CONFIG_I3C is not enabled, this function only unregisters the
264*4882a593Smuzhiyun  * @i2cdrv.
265*4882a593Smuzhiyun  */
i3c_i2c_driver_unregister(struct i3c_driver * i3cdrv,struct i2c_driver * i2cdrv)266*4882a593Smuzhiyun static inline void i3c_i2c_driver_unregister(struct i3c_driver *i3cdrv,
267*4882a593Smuzhiyun 					     struct i2c_driver *i2cdrv)
268*4882a593Smuzhiyun {
269*4882a593Smuzhiyun 	if (IS_ENABLED(CONFIG_I3C))
270*4882a593Smuzhiyun 		i3c_driver_unregister(i3cdrv);
271*4882a593Smuzhiyun 
272*4882a593Smuzhiyun 	i2c_del_driver(i2cdrv);
273*4882a593Smuzhiyun }
274*4882a593Smuzhiyun 
275*4882a593Smuzhiyun /**
276*4882a593Smuzhiyun  * module_i3c_i2c_driver() - Register a module providing an I3C and an I2C
277*4882a593Smuzhiyun  *			     driver
278*4882a593Smuzhiyun  * @__i3cdrv: the I3C driver to register
279*4882a593Smuzhiyun  * @__i2cdrv: the I3C driver to register
280*4882a593Smuzhiyun  *
281*4882a593Smuzhiyun  * Provide generic init/exit functions that simply register/unregister an I3C
282*4882a593Smuzhiyun  * and an I2C driver.
283*4882a593Smuzhiyun  * This macro can be used even if CONFIG_I3C is disabled, in this case, only
284*4882a593Smuzhiyun  * the I2C driver will be registered.
285*4882a593Smuzhiyun  * Should be used by any driver that does not require extra init/cleanup steps.
286*4882a593Smuzhiyun  */
287*4882a593Smuzhiyun #define module_i3c_i2c_driver(__i3cdrv, __i2cdrv)	\
288*4882a593Smuzhiyun 	module_driver(__i3cdrv,				\
289*4882a593Smuzhiyun 		      i3c_i2c_driver_register,		\
290*4882a593Smuzhiyun 		      i3c_i2c_driver_unregister)
291*4882a593Smuzhiyun 
292*4882a593Smuzhiyun int i3c_device_do_priv_xfers(struct i3c_device *dev,
293*4882a593Smuzhiyun 			     struct i3c_priv_xfer *xfers,
294*4882a593Smuzhiyun 			     int nxfers);
295*4882a593Smuzhiyun 
296*4882a593Smuzhiyun void i3c_device_get_info(struct i3c_device *dev, struct i3c_device_info *info);
297*4882a593Smuzhiyun 
298*4882a593Smuzhiyun struct i3c_ibi_payload {
299*4882a593Smuzhiyun 	unsigned int len;
300*4882a593Smuzhiyun 	const void *data;
301*4882a593Smuzhiyun };
302*4882a593Smuzhiyun 
303*4882a593Smuzhiyun /**
304*4882a593Smuzhiyun  * struct i3c_ibi_setup - IBI setup object
305*4882a593Smuzhiyun  * @max_payload_len: maximum length of the payload associated to an IBI. If one
306*4882a593Smuzhiyun  *		     IBI appears to have a payload that is bigger than this
307*4882a593Smuzhiyun  *		     number, the IBI will be rejected.
308*4882a593Smuzhiyun  * @num_slots: number of pre-allocated IBI slots. This should be chosen so that
309*4882a593Smuzhiyun  *	       the system never runs out of IBI slots, otherwise you'll lose
310*4882a593Smuzhiyun  *	       IBIs.
311*4882a593Smuzhiyun  * @handler: IBI handler, every time an IBI is received. This handler is called
312*4882a593Smuzhiyun  *	     in a workqueue context. It is allowed to sleep and send new
313*4882a593Smuzhiyun  *	     messages on the bus, though it's recommended to keep the
314*4882a593Smuzhiyun  *	     processing done there as fast as possible to avoid delaying
315*4882a593Smuzhiyun  *	     processing of other queued on the same workqueue.
316*4882a593Smuzhiyun  *
317*4882a593Smuzhiyun  * Temporary structure used to pass information to i3c_device_request_ibi().
318*4882a593Smuzhiyun  * This object can be allocated on the stack since i3c_device_request_ibi()
319*4882a593Smuzhiyun  * copies every bit of information and do not use it after
320*4882a593Smuzhiyun  * i3c_device_request_ibi() has returned.
321*4882a593Smuzhiyun  */
322*4882a593Smuzhiyun struct i3c_ibi_setup {
323*4882a593Smuzhiyun 	unsigned int max_payload_len;
324*4882a593Smuzhiyun 	unsigned int num_slots;
325*4882a593Smuzhiyun 	void (*handler)(struct i3c_device *dev,
326*4882a593Smuzhiyun 			const struct i3c_ibi_payload *payload);
327*4882a593Smuzhiyun };
328*4882a593Smuzhiyun 
329*4882a593Smuzhiyun int i3c_device_request_ibi(struct i3c_device *dev,
330*4882a593Smuzhiyun 			   const struct i3c_ibi_setup *setup);
331*4882a593Smuzhiyun void i3c_device_free_ibi(struct i3c_device *dev);
332*4882a593Smuzhiyun int i3c_device_enable_ibi(struct i3c_device *dev);
333*4882a593Smuzhiyun int i3c_device_disable_ibi(struct i3c_device *dev);
334*4882a593Smuzhiyun 
335*4882a593Smuzhiyun #endif /* I3C_DEV_H */
336