0001
0002
0003
0004
0005
0006
0007
0008 #ifndef I3C_DEV_H
0009 #define I3C_DEV_H
0010
0011 #include <linux/bitops.h>
0012 #include <linux/device.h>
0013 #include <linux/i2c.h>
0014 #include <linux/kconfig.h>
0015 #include <linux/mod_devicetable.h>
0016 #include <linux/module.h>
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033 enum i3c_error_code {
0034 I3C_ERROR_UNKNOWN = 0,
0035 I3C_ERROR_M0 = 1,
0036 I3C_ERROR_M1,
0037 I3C_ERROR_M2,
0038 };
0039
0040
0041
0042
0043
0044
0045
0046 enum i3c_hdr_mode {
0047 I3C_HDR_DDR,
0048 I3C_HDR_TSP,
0049 I3C_HDR_TSL,
0050 };
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061 struct i3c_priv_xfer {
0062 u8 rnw;
0063 u16 len;
0064 union {
0065 void *in;
0066 const void *out;
0067 } data;
0068 enum i3c_error_code err;
0069 };
0070
0071
0072
0073
0074
0075 enum i3c_dcr {
0076 I3C_DCR_GENERIC_DEVICE = 0,
0077 };
0078
0079 #define I3C_PID_MANUF_ID(pid) (((pid) & GENMASK_ULL(47, 33)) >> 33)
0080 #define I3C_PID_RND_LOWER_32BITS(pid) (!!((pid) & BIT_ULL(32)))
0081 #define I3C_PID_RND_VAL(pid) ((pid) & GENMASK_ULL(31, 0))
0082 #define I3C_PID_PART_ID(pid) (((pid) & GENMASK_ULL(31, 16)) >> 16)
0083 #define I3C_PID_INSTANCE_ID(pid) (((pid) & GENMASK_ULL(15, 12)) >> 12)
0084 #define I3C_PID_EXTRA_INFO(pid) ((pid) & GENMASK_ULL(11, 0))
0085
0086 #define I3C_BCR_DEVICE_ROLE(bcr) ((bcr) & GENMASK(7, 6))
0087 #define I3C_BCR_I3C_SLAVE (0 << 6)
0088 #define I3C_BCR_I3C_MASTER (1 << 6)
0089 #define I3C_BCR_HDR_CAP BIT(5)
0090 #define I3C_BCR_BRIDGE BIT(4)
0091 #define I3C_BCR_OFFLINE_CAP BIT(3)
0092 #define I3C_BCR_IBI_PAYLOAD BIT(2)
0093 #define I3C_BCR_IBI_REQ_CAP BIT(1)
0094 #define I3C_BCR_MAX_DATA_SPEED_LIM BIT(0)
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117
0118 struct i3c_device_info {
0119 u64 pid;
0120 u8 bcr;
0121 u8 dcr;
0122 u8 static_addr;
0123 u8 dyn_addr;
0124 u8 hdr_cap;
0125 u8 max_read_ds;
0126 u8 max_write_ds;
0127 u8 max_ibi_len;
0128 u32 max_read_turnaround;
0129 u16 max_read_len;
0130 u16 max_write_len;
0131 };
0132
0133
0134
0135
0136
0137
0138
0139 struct i3c_device;
0140
0141
0142 #define I3C_MATCH_MANUF_AND_PART (I3C_MATCH_MANUF | I3C_MATCH_PART)
0143
0144 #define I3C_DEVICE(_manufid, _partid, _drvdata) \
0145 { \
0146 .match_flags = I3C_MATCH_MANUF_AND_PART, \
0147 .manuf_id = _manufid, \
0148 .part_id = _partid, \
0149 .data = _drvdata, \
0150 }
0151
0152 #define I3C_DEVICE_EXTRA_INFO(_manufid, _partid, _info, _drvdata) \
0153 { \
0154 .match_flags = I3C_MATCH_MANUF_AND_PART | \
0155 I3C_MATCH_EXTRA_INFO, \
0156 .manuf_id = _manufid, \
0157 .part_id = _partid, \
0158 .extra_info = _info, \
0159 .data = _drvdata, \
0160 }
0161
0162 #define I3C_CLASS(_dcr, _drvdata) \
0163 { \
0164 .match_flags = I3C_MATCH_DCR, \
0165 .dcr = _dcr, \
0166 }
0167
0168
0169
0170
0171
0172
0173
0174
0175
0176 struct i3c_driver {
0177 struct device_driver driver;
0178 int (*probe)(struct i3c_device *dev);
0179 void (*remove)(struct i3c_device *dev);
0180 const struct i3c_device_id *id_table;
0181 };
0182
0183 static inline struct i3c_driver *drv_to_i3cdrv(struct device_driver *drv)
0184 {
0185 return container_of(drv, struct i3c_driver, driver);
0186 }
0187
0188 struct device *i3cdev_to_dev(struct i3c_device *i3cdev);
0189 struct i3c_device *dev_to_i3cdev(struct device *dev);
0190
0191 const struct i3c_device_id *
0192 i3c_device_match_id(struct i3c_device *i3cdev,
0193 const struct i3c_device_id *id_table);
0194
0195 static inline void i3cdev_set_drvdata(struct i3c_device *i3cdev,
0196 void *data)
0197 {
0198 struct device *dev = i3cdev_to_dev(i3cdev);
0199
0200 dev_set_drvdata(dev, data);
0201 }
0202
0203 static inline void *i3cdev_get_drvdata(struct i3c_device *i3cdev)
0204 {
0205 struct device *dev = i3cdev_to_dev(i3cdev);
0206
0207 return dev_get_drvdata(dev);
0208 }
0209
0210 int i3c_driver_register_with_owner(struct i3c_driver *drv,
0211 struct module *owner);
0212 void i3c_driver_unregister(struct i3c_driver *drv);
0213
0214 #define i3c_driver_register(__drv) \
0215 i3c_driver_register_with_owner(__drv, THIS_MODULE)
0216
0217
0218
0219
0220
0221
0222
0223
0224
0225 #define module_i3c_driver(__drv) \
0226 module_driver(__drv, i3c_driver_register, i3c_driver_unregister)
0227
0228
0229
0230
0231
0232
0233
0234
0235
0236
0237
0238
0239
0240
0241 static inline int i3c_i2c_driver_register(struct i3c_driver *i3cdrv,
0242 struct i2c_driver *i2cdrv)
0243 {
0244 int ret;
0245
0246 ret = i2c_add_driver(i2cdrv);
0247 if (ret || !IS_ENABLED(CONFIG_I3C))
0248 return ret;
0249
0250 ret = i3c_driver_register(i3cdrv);
0251 if (ret)
0252 i2c_del_driver(i2cdrv);
0253
0254 return ret;
0255 }
0256
0257
0258
0259
0260
0261
0262
0263
0264
0265
0266 static inline void i3c_i2c_driver_unregister(struct i3c_driver *i3cdrv,
0267 struct i2c_driver *i2cdrv)
0268 {
0269 if (IS_ENABLED(CONFIG_I3C))
0270 i3c_driver_unregister(i3cdrv);
0271
0272 i2c_del_driver(i2cdrv);
0273 }
0274
0275
0276
0277
0278
0279
0280
0281
0282
0283
0284
0285
0286
0287 #define module_i3c_i2c_driver(__i3cdrv, __i2cdrv) \
0288 module_driver(__i3cdrv, \
0289 i3c_i2c_driver_register, \
0290 i3c_i2c_driver_unregister)
0291
0292 int i3c_device_do_priv_xfers(struct i3c_device *dev,
0293 struct i3c_priv_xfer *xfers,
0294 int nxfers);
0295
0296 void i3c_device_get_info(struct i3c_device *dev, struct i3c_device_info *info);
0297
0298 struct i3c_ibi_payload {
0299 unsigned int len;
0300 const void *data;
0301 };
0302
0303
0304
0305
0306
0307
0308
0309
0310
0311
0312
0313
0314
0315
0316
0317
0318
0319
0320
0321
0322 struct i3c_ibi_setup {
0323 unsigned int max_payload_len;
0324 unsigned int num_slots;
0325 void (*handler)(struct i3c_device *dev,
0326 const struct i3c_ibi_payload *payload);
0327 };
0328
0329 int i3c_device_request_ibi(struct i3c_device *dev,
0330 const struct i3c_ibi_setup *setup);
0331 void i3c_device_free_ibi(struct i3c_device *dev);
0332 int i3c_device_enable_ibi(struct i3c_device *dev);
0333 int i3c_device_disable_ibi(struct i3c_device *dev);
0334
0335 #endif