1 // SPDX-License-Identifier: GPL-2.0-only
3 * Intel La Jolla Cove Adapter USB-I2C driver
5 * Copyright (c) 2021, Intel Corporation.
8 #include <linux/acpi.h>
10 #include <linux/mfd/ljca.h>
11 #include <linux/module.h>
12 #include <linux/platform_device.h>
24 enum i2c_address_mode
{
25 I2C_ADDRESS_MODE_7BIT
,
26 I2C_ADDRESS_MODE_10BIT
,
34 #define DEFAULT_I2C_CONTROLLER_ID 1
35 #define DEFAULT_I2C_CAPACITY 0
36 #define DEFAULT_I2C_INTR_PIN 0
39 #define I2C_SLAVE_TRANSFER_WRITE (0)
40 #define I2C_SLAVE_TRANSFER_READ (1)
43 #define I2C_INIT_FLAG_MODE_MASK (0x1 << 0)
44 #define I2C_INIT_FLAG_MODE_POLLING (0x0 << 0)
45 #define I2C_INIT_FLAG_MODE_INTERRUPT (0x1 << 0)
47 #define I2C_FLAG_ADDR_16BIT (0x1 << 0)
49 #define I2C_INIT_FLAG_FREQ_MASK (0x3 << 1)
50 #define I2C_FLAG_FREQ_100K (0x0 << 1)
51 #define I2C_FLAG_FREQ_400K (0x1 << 1)
52 #define I2C_FLAG_FREQ_1M (0x2 << 1)
58 u16 flag
; /* speed, 8/16bit addr, addr increase, etc */
64 /* I2C raw commands: Init/Start/Read/Write/Stop */
65 struct i2c_rw_packet
{
71 #define LJCA_I2C_MAX_XFER_SIZE 256
72 #define LJCA_I2C_BUF_SIZE \
73 (LJCA_I2C_MAX_XFER_SIZE + sizeof(struct i2c_rw_packet))
76 struct platform_device
*pdev
;
77 struct ljca_i2c_info
*ctr_info
;
78 struct i2c_adapter adap
;
80 u8 obuf
[LJCA_I2C_BUF_SIZE
];
81 u8 ibuf
[LJCA_I2C_BUF_SIZE
];
84 static u8
ljca_i2c_format_slave_addr(u8 slave_addr
, enum i2c_address_mode mode
)
86 if (mode
== I2C_ADDRESS_MODE_7BIT
)
87 return slave_addr
<< 1;
92 static int ljca_i2c_init(struct ljca_i2c_dev
*ljca_i2c
, u8 id
)
94 struct i2c_rw_packet
*w_packet
= (struct i2c_rw_packet
*)ljca_i2c
->obuf
;
96 memset(w_packet
, 0, sizeof(*w_packet
));
98 w_packet
->len
= cpu_to_le16(1);
99 w_packet
->data
[0] = I2C_FLAG_FREQ_400K
;
101 return ljca_transfer(ljca_i2c
->pdev
, I2C_INIT
, w_packet
,
102 sizeof(*w_packet
) + 1, NULL
, NULL
);
105 static int ljca_i2c_start(struct ljca_i2c_dev
*ljca_i2c
, u8 slave_addr
,
108 struct i2c_rw_packet
*w_packet
= (struct i2c_rw_packet
*)ljca_i2c
->obuf
;
109 struct i2c_rw_packet
*r_packet
= (struct i2c_rw_packet
*)ljca_i2c
->ibuf
;
113 memset(w_packet
, 0, sizeof(*w_packet
));
114 w_packet
->id
= ljca_i2c
->ctr_info
->id
;
115 w_packet
->len
= cpu_to_le16(1);
117 ljca_i2c_format_slave_addr(slave_addr
, I2C_ADDRESS_MODE_7BIT
);
118 w_packet
->data
[0] |= (type
== READ_XFER_TYPE
) ?
119 I2C_SLAVE_TRANSFER_READ
:
120 I2C_SLAVE_TRANSFER_WRITE
;
122 ret
= ljca_transfer(ljca_i2c
->pdev
, I2C_START
, w_packet
,
123 sizeof(*w_packet
) + 1, r_packet
, &ibuf_len
);
125 if (ret
|| ibuf_len
< sizeof(*r_packet
))
128 if ((s16
)le16_to_cpu(r_packet
->len
) < 0 ||
129 r_packet
->id
!= w_packet
->id
) {
130 dev_err(&ljca_i2c
->adap
.dev
,
131 "i2c start failed len:%d id:%d %d\n",
132 (s16
)le16_to_cpu(r_packet
->len
), r_packet
->id
,
140 static int ljca_i2c_stop(struct ljca_i2c_dev
*ljca_i2c
, u8 slave_addr
)
142 struct i2c_rw_packet
*w_packet
= (struct i2c_rw_packet
*)ljca_i2c
->obuf
;
143 struct i2c_rw_packet
*r_packet
= (struct i2c_rw_packet
*)ljca_i2c
->ibuf
;
147 memset(w_packet
, 0, sizeof(*w_packet
));
148 w_packet
->id
= ljca_i2c
->ctr_info
->id
;
149 w_packet
->len
= cpu_to_le16(1);
150 w_packet
->data
[0] = 0;
152 ret
= ljca_transfer(ljca_i2c
->pdev
, I2C_STOP
, w_packet
,
153 sizeof(*w_packet
) + 1, r_packet
, &ibuf_len
);
155 if (ret
|| ibuf_len
< sizeof(*r_packet
))
158 if ((s16
)le16_to_cpu(r_packet
->len
) < 0 ||
159 r_packet
->id
!= w_packet
->id
) {
160 dev_err(&ljca_i2c
->adap
.dev
,
161 "i2c stop failed len:%d id:%d %d\n",
162 (s16
)le16_to_cpu(r_packet
->len
), r_packet
->id
,
170 static int ljca_i2c_pure_read(struct ljca_i2c_dev
*ljca_i2c
, u8
*data
, int len
)
172 struct i2c_rw_packet
*w_packet
= (struct i2c_rw_packet
*)ljca_i2c
->obuf
;
173 struct i2c_rw_packet
*r_packet
= (struct i2c_rw_packet
*)ljca_i2c
->ibuf
;
177 if (len
> LJCA_I2C_MAX_XFER_SIZE
)
180 memset(w_packet
, 0, sizeof(*w_packet
));
181 w_packet
->id
= ljca_i2c
->ctr_info
->id
;
182 w_packet
->len
= cpu_to_le16(len
);
183 ret
= ljca_transfer(ljca_i2c
->pdev
, I2C_READ
, w_packet
,
184 sizeof(*w_packet
) + 1, r_packet
, &ibuf_len
);
186 dev_err(&ljca_i2c
->adap
.dev
, "I2C_READ failed ret:%d\n", ret
);
190 if (ibuf_len
< sizeof(*r_packet
))
193 if ((s16
)le16_to_cpu(r_packet
->len
) != len
||
194 r_packet
->id
!= w_packet
->id
) {
195 dev_err(&ljca_i2c
->adap
.dev
,
196 "i2c raw read failed len:%d id:%d %d\n",
197 (s16
)le16_to_cpu(r_packet
->len
), r_packet
->id
,
202 memcpy(data
, r_packet
->data
, len
);
207 static int ljca_i2c_read(struct ljca_i2c_dev
*ljca_i2c
, u8 slave_addr
, u8
*data
,
212 ret
= ljca_i2c_start(ljca_i2c
, slave_addr
, READ_XFER_TYPE
);
216 ret
= ljca_i2c_pure_read(ljca_i2c
, data
, len
);
218 dev_err(&ljca_i2c
->adap
.dev
, "i2c raw read failed ret:%d\n",
224 return ljca_i2c_stop(ljca_i2c
, slave_addr
);
227 static int ljca_i2c_pure_write(struct ljca_i2c_dev
*ljca_i2c
, u8
*data
, u8 len
)
229 struct i2c_rw_packet
*w_packet
= (struct i2c_rw_packet
*)ljca_i2c
->obuf
;
230 struct i2c_rw_packet
*r_packet
= (struct i2c_rw_packet
*)ljca_i2c
->ibuf
;
234 if (len
> LJCA_I2C_MAX_XFER_SIZE
)
237 memset(w_packet
, 0, sizeof(*w_packet
));
238 w_packet
->id
= ljca_i2c
->ctr_info
->id
;
239 w_packet
->len
= cpu_to_le16(len
);
240 memcpy(w_packet
->data
, data
, len
);
242 ret
= ljca_transfer(ljca_i2c
->pdev
, I2C_WRITE
, w_packet
,
243 sizeof(*w_packet
) + w_packet
->len
, r_packet
,
246 if (ret
|| ibuf_len
< sizeof(*r_packet
))
249 if ((s16
)le16_to_cpu(r_packet
->len
) != len
||
250 r_packet
->id
!= w_packet
->id
) {
251 dev_err(&ljca_i2c
->adap
.dev
,
252 "i2c write failed len:%d id:%d/%d\n",
253 (s16
)le16_to_cpu(r_packet
->len
), r_packet
->id
,
261 static int ljca_i2c_write(struct ljca_i2c_dev
*ljca_i2c
, u8 slave_addr
,
269 ret
= ljca_i2c_start(ljca_i2c
, slave_addr
, WRITE_XFER_TYPE
);
273 ret
= ljca_i2c_pure_write(ljca_i2c
, data
, len
);
277 return ljca_i2c_stop(ljca_i2c
, slave_addr
);
280 static int ljca_i2c_xfer(struct i2c_adapter
*adapter
, struct i2c_msg
*msg
,
283 struct ljca_i2c_dev
*ljca_i2c
;
284 struct i2c_msg
*cur_msg
;
287 ljca_i2c
= i2c_get_adapdata(adapter
);
291 for (i
= 0; !ret
&& i
< num
; i
++) {
293 dev_dbg(&adapter
->dev
, "i:%d msg:(%d %d)\n", i
, cur_msg
->flags
,
295 if (cur_msg
->flags
& I2C_M_RD
)
296 ret
= ljca_i2c_read(ljca_i2c
, cur_msg
->addr
,
297 cur_msg
->buf
, cur_msg
->len
);
300 ret
= ljca_i2c_write(ljca_i2c
, cur_msg
->addr
,
301 cur_msg
->buf
, cur_msg
->len
);
310 static u32
ljca_i2c_func(struct i2c_adapter
*adap
)
312 return I2C_FUNC_I2C
| I2C_FUNC_SMBUS_EMUL
;
315 static const struct i2c_adapter_quirks ljca_i2c_quirks
= {
316 .max_read_len
= LJCA_I2C_MAX_XFER_SIZE
,
317 .max_write_len
= LJCA_I2C_MAX_XFER_SIZE
,
320 static const struct i2c_algorithm ljca_i2c_algo
= {
321 .master_xfer
= ljca_i2c_xfer
,
322 .functionality
= ljca_i2c_func
,
325 static void try_bind_acpi(struct platform_device
*pdev
,
326 struct ljca_i2c_dev
*ljca_i2c
)
328 struct acpi_device
*parent
, *child
;
329 struct acpi_device
*cur
= ACPI_COMPANION(&pdev
->dev
);
332 char uid2
[2] = { 0 };
337 hid1
= acpi_device_hid(cur
);
338 uid1
= acpi_device_uid(cur
);
339 snprintf(uid2
, sizeof(uid2
), "%d", ljca_i2c
->ctr_info
->id
);
341 dev_dbg(&pdev
->dev
, "hid %s uid %s new uid%s\n", hid1
, uid1
, uid2
);
343 * If the pdev is bound to the right acpi device, just forward it to the
344 * adapter. Otherwise, we find that of current adapter manually.
346 if (!strcmp(uid1
, uid2
)) {
347 ACPI_COMPANION_SET(&ljca_i2c
->adap
.dev
, cur
);
351 parent
= ACPI_COMPANION(pdev
->dev
.parent
);
355 list_for_each_entry(child
, &parent
->children
, node
) {
356 if (acpi_dev_hid_uid_match(child
, hid1
, uid2
)) {
357 ACPI_COMPANION_SET(&ljca_i2c
->adap
.dev
, child
);
363 static int ljca_i2c_probe(struct platform_device
*pdev
)
365 struct ljca_i2c_dev
*ljca_i2c
;
366 struct ljca_platform_data
*pdata
= dev_get_platdata(&pdev
->dev
);
369 ljca_i2c
= devm_kzalloc(&pdev
->dev
, sizeof(*ljca_i2c
), GFP_KERNEL
);
373 ljca_i2c
->pdev
= pdev
;
374 ljca_i2c
->ctr_info
= &pdata
->i2c_info
;
376 ljca_i2c
->adap
.owner
= THIS_MODULE
;
377 ljca_i2c
->adap
.class = I2C_CLASS_HWMON
;
378 ljca_i2c
->adap
.algo
= &ljca_i2c_algo
;
379 ljca_i2c
->adap
.dev
.parent
= &pdev
->dev
;
381 try_bind_acpi(pdev
, ljca_i2c
);
383 ljca_i2c
->adap
.dev
.of_node
= pdev
->dev
.of_node
;
384 i2c_set_adapdata(&ljca_i2c
->adap
, ljca_i2c
);
385 snprintf(ljca_i2c
->adap
.name
, sizeof(ljca_i2c
->adap
.name
), "%s-%s-%d",
386 "ljca-i2c", dev_name(pdev
->dev
.parent
),
387 ljca_i2c
->ctr_info
->id
);
389 platform_set_drvdata(pdev
, ljca_i2c
);
391 ret
= ljca_i2c_init(ljca_i2c
, ljca_i2c
->ctr_info
->id
);
393 dev_err(&pdev
->dev
, "i2c init failed id:%d\n",
394 ljca_i2c
->ctr_info
->id
);
398 return i2c_add_adapter(&ljca_i2c
->adap
);
401 static int ljca_i2c_remove(struct platform_device
*pdev
)
403 struct ljca_i2c_dev
*ljca_i2c
= platform_get_drvdata(pdev
);
405 i2c_del_adapter(&ljca_i2c
->adap
);
410 static struct platform_driver ljca_i2c_driver
= {
411 .driver
.name
= "ljca-i2c",
412 .probe
= ljca_i2c_probe
,
413 .remove
= ljca_i2c_remove
,
416 module_platform_driver(ljca_i2c_driver
);
418 MODULE_AUTHOR("Ye Xiang <xiang.ye@intel.com>");
419 MODULE_AUTHOR("Zhang Lixu <lixu.zhang@intel.com>");
420 MODULE_DESCRIPTION("Intel La Jolla Cove Adapter USB-I2C driver");
421 MODULE_LICENSE("GPL v2");
422 MODULE_ALIAS("platform:ljca-i2c");