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