1 // SPDX-License-Identifier: GPL-2.0-only
3 * I2C bus driver for Conexant Digicolor SoCs
5 * Author: Baruch Siach <baruch@tkos.co.il>
7 * Copyright (C) 2015 Paradox Innovation Ltd.
10 #include <linux/clk.h>
11 #include <linux/completion.h>
12 #include <linux/delay.h>
13 #include <linux/i2c.h>
14 #include <linux/interrupt.h>
16 #include <linux/kernel.h>
17 #include <linux/module.h>
19 #include <linux/platform_device.h>
21 #define TIMEOUT_MS 100
23 #define II_CONTROL 0x0
24 #define II_CONTROL_LOCAL_RESET BIT(0)
26 #define II_CLOCKTIME 0x1
28 #define II_COMMAND 0x2
29 #define II_CMD_START 1
30 #define II_CMD_RESTART 2
31 #define II_CMD_SEND_ACK 3
32 #define II_CMD_GET_ACK 6
33 #define II_CMD_GET_NOACK 7
34 #define II_CMD_STOP 10
35 #define II_COMMAND_GO BIT(7)
36 #define II_COMMAND_COMPLETION_STATUS(r) (((r) >> 5) & 3)
37 #define II_CMD_STATUS_NORMAL 0
38 #define II_CMD_STATUS_ACK_GOOD 1
39 #define II_CMD_STATUS_ACK_BAD 2
40 #define II_CMD_STATUS_ABORT 3
43 #define II_INTFLAG_CLEAR 0x8
44 #define II_INTENABLE 0xa
47 struct i2c_adapter adap
;
51 unsigned int frequency
;
54 unsigned int msgbuf_ptr
;
57 struct completion done
;
71 static void dc_i2c_cmd(struct dc_i2c
*i2c
, u8 cmd
)
73 writeb_relaxed(cmd
| II_COMMAND_GO
, i2c
->regs
+ II_COMMAND
);
76 static u8
dc_i2c_addr_cmd(struct i2c_msg
*msg
)
78 u8 addr
= (msg
->addr
& 0x7f) << 1;
80 if (msg
->flags
& I2C_M_RD
)
86 static void dc_i2c_data(struct dc_i2c
*i2c
, u8 data
)
88 writeb_relaxed(data
, i2c
->regs
+ II_DATA
);
91 static void dc_i2c_write_byte(struct dc_i2c
*i2c
, u8 byte
)
93 dc_i2c_data(i2c
, byte
);
94 dc_i2c_cmd(i2c
, II_CMD_SEND_ACK
);
97 static void dc_i2c_write_buf(struct dc_i2c
*i2c
)
99 dc_i2c_write_byte(i2c
, i2c
->msg
->buf
[i2c
->msgbuf_ptr
++]);
102 static void dc_i2c_next_read(struct dc_i2c
*i2c
)
104 bool last
= (i2c
->msgbuf_ptr
+ 1 == i2c
->msg
->len
);
106 dc_i2c_cmd(i2c
, last
? II_CMD_GET_NOACK
: II_CMD_GET_ACK
);
109 static void dc_i2c_stop(struct dc_i2c
*i2c
)
111 i2c
->state
= STATE_STOP
;
113 dc_i2c_cmd(i2c
, II_CMD_STOP
);
115 complete(&i2c
->done
);
118 static u8
dc_i2c_read_byte(struct dc_i2c
*i2c
)
120 return readb_relaxed(i2c
->regs
+ II_DATA
);
123 static void dc_i2c_read_buf(struct dc_i2c
*i2c
)
125 i2c
->msg
->buf
[i2c
->msgbuf_ptr
++] = dc_i2c_read_byte(i2c
);
126 dc_i2c_next_read(i2c
);
129 static void dc_i2c_set_irq(struct dc_i2c
*i2c
, int enable
)
132 writeb_relaxed(1, i2c
->regs
+ II_INTFLAG_CLEAR
);
133 writeb_relaxed(!!enable
, i2c
->regs
+ II_INTENABLE
);
136 static int dc_i2c_cmd_status(struct dc_i2c
*i2c
)
138 u8 cmd
= readb_relaxed(i2c
->regs
+ II_COMMAND
);
140 return II_COMMAND_COMPLETION_STATUS(cmd
);
143 static void dc_i2c_start_msg(struct dc_i2c
*i2c
, int first
)
145 struct i2c_msg
*msg
= i2c
->msg
;
147 if (!(msg
->flags
& I2C_M_NOSTART
)) {
148 i2c
->state
= STATE_START
;
149 dc_i2c_cmd(i2c
, first
? II_CMD_START
: II_CMD_RESTART
);
150 } else if (msg
->flags
& I2C_M_RD
) {
151 i2c
->state
= STATE_READ
;
152 dc_i2c_next_read(i2c
);
154 i2c
->state
= STATE_WRITE
;
155 dc_i2c_write_buf(i2c
);
159 static irqreturn_t
dc_i2c_irq(int irq
, void *dev_id
)
161 struct dc_i2c
*i2c
= dev_id
;
162 int cmd_status
= dc_i2c_cmd_status(i2c
);
165 writeb_relaxed(1, i2c
->regs
+ II_INTFLAG_CLEAR
);
167 spin_lock(&i2c
->lock
);
169 if (cmd_status
== II_CMD_STATUS_ACK_BAD
170 || cmd_status
== II_CMD_STATUS_ABORT
) {
172 complete(&i2c
->done
);
176 switch (i2c
->state
) {
178 addr_cmd
= dc_i2c_addr_cmd(i2c
->msg
);
179 dc_i2c_write_byte(i2c
, addr_cmd
);
180 i2c
->state
= STATE_ADDR
;
183 if (i2c
->msg
->flags
& I2C_M_RD
) {
184 dc_i2c_next_read(i2c
);
185 i2c
->state
= STATE_READ
;
188 i2c
->state
= STATE_WRITE
;
191 if (i2c
->msgbuf_ptr
< i2c
->msg
->len
)
192 dc_i2c_write_buf(i2c
);
197 if (i2c
->msgbuf_ptr
< i2c
->msg
->len
)
198 dc_i2c_read_buf(i2c
);
203 i2c
->state
= STATE_IDLE
;
204 complete(&i2c
->done
);
209 spin_unlock(&i2c
->lock
);
213 static int dc_i2c_xfer_msg(struct dc_i2c
*i2c
, struct i2c_msg
*msg
, int first
,
216 unsigned long time_left
= msecs_to_jiffies(TIMEOUT_MS
);
219 spin_lock_irqsave(&i2c
->lock
, flags
);
225 reinit_completion(&i2c
->done
);
226 dc_i2c_set_irq(i2c
, 1);
227 dc_i2c_start_msg(i2c
, first
);
228 spin_unlock_irqrestore(&i2c
->lock
, flags
);
230 time_left
= wait_for_completion_timeout(&i2c
->done
, time_left
);
231 dc_i2c_set_irq(i2c
, 0);
232 if (time_left
== 0) {
233 i2c
->state
= STATE_IDLE
;
243 static int dc_i2c_xfer(struct i2c_adapter
*adap
, struct i2c_msg
*msgs
, int num
)
245 struct dc_i2c
*i2c
= adap
->algo_data
;
248 for (i
= 0; i
< num
; i
++) {
249 ret
= dc_i2c_xfer_msg(i2c
, &msgs
[i
], i
== 0, i
== num
- 1);
257 static int dc_i2c_init_hw(struct dc_i2c
*i2c
)
259 unsigned long clk_rate
= clk_get_rate(i2c
->clk
);
260 unsigned int clocktime
;
262 writeb_relaxed(II_CONTROL_LOCAL_RESET
, i2c
->regs
+ II_CONTROL
);
264 writeb_relaxed(0, i2c
->regs
+ II_CONTROL
);
267 clocktime
= DIV_ROUND_UP(clk_rate
, 64 * i2c
->frequency
);
268 if (clocktime
< 1 || clocktime
> 0xff) {
269 dev_err(i2c
->dev
, "can't set bus speed of %u Hz\n",
273 writeb_relaxed(clocktime
- 1, i2c
->regs
+ II_CLOCKTIME
);
278 static u32
dc_i2c_func(struct i2c_adapter
*adap
)
280 return I2C_FUNC_I2C
| I2C_FUNC_SMBUS_EMUL
| I2C_FUNC_NOSTART
;
283 static const struct i2c_algorithm dc_i2c_algorithm
= {
285 .functionality
= dc_i2c_func
,
288 static int dc_i2c_probe(struct platform_device
*pdev
)
290 struct device_node
*np
= pdev
->dev
.of_node
;
294 i2c
= devm_kzalloc(&pdev
->dev
, sizeof(struct dc_i2c
), GFP_KERNEL
);
298 if (of_property_read_u32(pdev
->dev
.of_node
, "clock-frequency",
300 i2c
->frequency
= I2C_MAX_STANDARD_MODE_FREQ
;
302 i2c
->dev
= &pdev
->dev
;
303 platform_set_drvdata(pdev
, i2c
);
305 spin_lock_init(&i2c
->lock
);
306 init_completion(&i2c
->done
);
308 i2c
->clk
= devm_clk_get(&pdev
->dev
, NULL
);
309 if (IS_ERR(i2c
->clk
))
310 return PTR_ERR(i2c
->clk
);
312 i2c
->regs
= devm_platform_ioremap_resource(pdev
, 0);
313 if (IS_ERR(i2c
->regs
))
314 return PTR_ERR(i2c
->regs
);
316 irq
= platform_get_irq(pdev
, 0);
320 ret
= devm_request_irq(&pdev
->dev
, irq
, dc_i2c_irq
, 0,
321 dev_name(&pdev
->dev
), i2c
);
325 strscpy(i2c
->adap
.name
, "Conexant Digicolor I2C adapter",
326 sizeof(i2c
->adap
.name
));
327 i2c
->adap
.owner
= THIS_MODULE
;
328 i2c
->adap
.algo
= &dc_i2c_algorithm
;
329 i2c
->adap
.dev
.parent
= &pdev
->dev
;
330 i2c
->adap
.dev
.of_node
= np
;
331 i2c
->adap
.algo_data
= i2c
;
333 ret
= dc_i2c_init_hw(i2c
);
337 ret
= clk_prepare_enable(i2c
->clk
);
341 ret
= i2c_add_adapter(&i2c
->adap
);
343 clk_disable_unprepare(i2c
->clk
);
350 static void dc_i2c_remove(struct platform_device
*pdev
)
352 struct dc_i2c
*i2c
= platform_get_drvdata(pdev
);
354 i2c_del_adapter(&i2c
->adap
);
355 clk_disable_unprepare(i2c
->clk
);
358 static const struct of_device_id dc_i2c_match
[] = {
359 { .compatible
= "cnxt,cx92755-i2c" },
362 MODULE_DEVICE_TABLE(of
, dc_i2c_match
);
364 static struct platform_driver dc_i2c_driver
= {
365 .probe
= dc_i2c_probe
,
366 .remove
= dc_i2c_remove
,
368 .name
= "digicolor-i2c",
369 .of_match_table
= dc_i2c_match
,
372 module_platform_driver(dc_i2c_driver
);
374 MODULE_AUTHOR("Baruch Siach <baruch@tkos.co.il>");
375 MODULE_DESCRIPTION("Conexant Digicolor I2C controller driver");
376 MODULE_LICENSE("GPL v2");