2 * Wondermedia I2C Master Mode Driver
4 * Copyright (C) 2012 Tony Prisk <linux@prisktech.co.nz>
6 * Derived from GPLv2+ licensed source:
7 * - Copyright (C) 2008 WonderMedia Technologies, Inc.
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License version 2, or
11 * (at your option) any later version. as published by the Free Software
15 #include <linux/clk.h>
16 #include <linux/delay.h>
17 #include <linux/err.h>
18 #include <linux/i2c.h>
19 #include <linux/interrupt.h>
21 #include <linux/module.h>
23 #include <linux/of_address.h>
24 #include <linux/of_irq.h>
25 #include <linux/platform_device.h>
35 #define REG_SLAVE_CR 0x10
36 #define REG_SLAVE_SR 0x12
37 #define REG_SLAVE_ISR 0x14
38 #define REG_SLAVE_IMR 0x16
39 #define REG_SLAVE_DR 0x18
40 #define REG_SLAVE_TR 0x1A
42 /* REG_CR Bit fields */
43 #define CR_TX_NEXT_ACK 0x0000
44 #define CR_ENABLE 0x0001
45 #define CR_TX_NEXT_NO_ACK 0x0002
46 #define CR_TX_END 0x0004
47 #define CR_CPU_RDY 0x0008
48 #define SLAV_MODE_SEL 0x8000
50 /* REG_TCR Bit fields */
51 #define TCR_STANDARD_MODE 0x0000
52 #define TCR_MASTER_WRITE 0x0000
53 #define TCR_HS_MODE 0x2000
54 #define TCR_MASTER_READ 0x4000
55 #define TCR_FAST_MODE 0x8000
56 #define TCR_SLAVE_ADDR_MASK 0x007F
58 /* REG_ISR Bit fields */
59 #define ISR_NACK_ADDR 0x0001
60 #define ISR_BYTE_END 0x0002
61 #define ISR_SCL_TIMEOUT 0x0004
62 #define ISR_WRITE_ALL 0x0007
64 /* REG_IMR Bit fields */
65 #define IMR_ENABLE_ALL 0x0007
67 /* REG_CSR Bit fields */
68 #define CSR_RCV_NOT_ACK 0x0001
69 #define CSR_RCV_ACK_MASK 0x0001
70 #define CSR_READY_MASK 0x0002
73 #define SCL_TIMEOUT(x) (((x) & 0xFF) << 8)
79 #define MCR_APB_166M 12
81 #define I2C_MODE_STANDARD 0
82 #define I2C_MODE_FAST 1
84 #define WMT_I2C_TIMEOUT (msecs_to_jiffies(1000))
87 struct i2c_adapter adapter
;
88 struct completion complete
;
97 static int wmt_i2c_wait_bus_not_busy(struct wmt_i2c_dev
*i2c_dev
)
99 unsigned long timeout
;
101 timeout
= jiffies
+ WMT_I2C_TIMEOUT
;
102 while (!(readw(i2c_dev
->base
+ REG_CSR
) & CSR_READY_MASK
)) {
103 if (time_after(jiffies
, timeout
)) {
104 dev_warn(i2c_dev
->dev
, "timeout waiting for bus ready\n");
113 static int wmt_check_status(struct wmt_i2c_dev
*i2c_dev
)
117 if (i2c_dev
->cmd_status
& ISR_NACK_ADDR
)
120 if (i2c_dev
->cmd_status
& ISR_SCL_TIMEOUT
)
126 static int wmt_i2c_write(struct i2c_adapter
*adap
, struct i2c_msg
*pmsg
,
129 struct wmt_i2c_dev
*i2c_dev
= i2c_get_adapdata(adap
);
132 unsigned long wait_result
;
135 if (!(pmsg
->flags
& I2C_M_NOSTART
)) {
136 ret
= wmt_i2c_wait_bus_not_busy(i2c_dev
);
141 if (pmsg
->len
== 0) {
143 * We still need to run through the while (..) once, so
144 * start at -1 and break out early from the loop
147 writew(0, i2c_dev
->base
+ REG_CDR
);
149 writew(pmsg
->buf
[0] & 0xFF, i2c_dev
->base
+ REG_CDR
);
152 if (!(pmsg
->flags
& I2C_M_NOSTART
)) {
153 val
= readw(i2c_dev
->base
+ REG_CR
);
155 writew(val
, i2c_dev
->base
+ REG_CR
);
157 val
= readw(i2c_dev
->base
+ REG_CR
);
159 writew(val
, i2c_dev
->base
+ REG_CR
);
162 reinit_completion(&i2c_dev
->complete
);
164 if (i2c_dev
->mode
== I2C_MODE_STANDARD
)
165 tcr_val
= TCR_STANDARD_MODE
;
167 tcr_val
= TCR_FAST_MODE
;
169 tcr_val
|= (TCR_MASTER_WRITE
| (pmsg
->addr
& TCR_SLAVE_ADDR_MASK
));
171 writew(tcr_val
, i2c_dev
->base
+ REG_TCR
);
173 if (pmsg
->flags
& I2C_M_NOSTART
) {
174 val
= readw(i2c_dev
->base
+ REG_CR
);
176 writew(val
, i2c_dev
->base
+ REG_CR
);
179 while (xfer_len
< pmsg
->len
) {
180 wait_result
= wait_for_completion_timeout(&i2c_dev
->complete
,
181 msecs_to_jiffies(500));
183 if (wait_result
== 0)
186 ret
= wmt_check_status(i2c_dev
);
192 val
= readw(i2c_dev
->base
+ REG_CSR
);
193 if ((val
& CSR_RCV_ACK_MASK
) == CSR_RCV_NOT_ACK
) {
194 dev_dbg(i2c_dev
->dev
, "write RCV NACK error\n");
198 if (pmsg
->len
== 0) {
199 val
= CR_TX_END
| CR_CPU_RDY
| CR_ENABLE
;
200 writew(val
, i2c_dev
->base
+ REG_CR
);
204 if (xfer_len
== pmsg
->len
) {
206 writew(CR_ENABLE
, i2c_dev
->base
+ REG_CR
);
208 writew(pmsg
->buf
[xfer_len
] & 0xFF, i2c_dev
->base
+
210 writew(CR_CPU_RDY
| CR_ENABLE
, i2c_dev
->base
+ REG_CR
);
217 static int wmt_i2c_read(struct i2c_adapter
*adap
, struct i2c_msg
*pmsg
,
220 struct wmt_i2c_dev
*i2c_dev
= i2c_get_adapdata(adap
);
223 unsigned long wait_result
;
226 if (!(pmsg
->flags
& I2C_M_NOSTART
)) {
227 ret
= wmt_i2c_wait_bus_not_busy(i2c_dev
);
232 val
= readw(i2c_dev
->base
+ REG_CR
);
234 writew(val
, i2c_dev
->base
+ REG_CR
);
236 val
= readw(i2c_dev
->base
+ REG_CR
);
237 val
&= ~CR_TX_NEXT_NO_ACK
;
238 writew(val
, i2c_dev
->base
+ REG_CR
);
240 if (!(pmsg
->flags
& I2C_M_NOSTART
)) {
241 val
= readw(i2c_dev
->base
+ REG_CR
);
243 writew(val
, i2c_dev
->base
+ REG_CR
);
246 if (pmsg
->len
== 1) {
247 val
= readw(i2c_dev
->base
+ REG_CR
);
248 val
|= CR_TX_NEXT_NO_ACK
;
249 writew(val
, i2c_dev
->base
+ REG_CR
);
252 reinit_completion(&i2c_dev
->complete
);
254 if (i2c_dev
->mode
== I2C_MODE_STANDARD
)
255 tcr_val
= TCR_STANDARD_MODE
;
257 tcr_val
= TCR_FAST_MODE
;
259 tcr_val
|= TCR_MASTER_READ
| (pmsg
->addr
& TCR_SLAVE_ADDR_MASK
);
261 writew(tcr_val
, i2c_dev
->base
+ REG_TCR
);
263 if (pmsg
->flags
& I2C_M_NOSTART
) {
264 val
= readw(i2c_dev
->base
+ REG_CR
);
266 writew(val
, i2c_dev
->base
+ REG_CR
);
269 while (xfer_len
< pmsg
->len
) {
270 wait_result
= wait_for_completion_timeout(&i2c_dev
->complete
,
271 msecs_to_jiffies(500));
276 ret
= wmt_check_status(i2c_dev
);
280 pmsg
->buf
[xfer_len
] = readw(i2c_dev
->base
+ REG_CDR
) >> 8;
283 if (xfer_len
== pmsg
->len
- 1) {
284 val
= readw(i2c_dev
->base
+ REG_CR
);
285 val
|= (CR_TX_NEXT_NO_ACK
| CR_CPU_RDY
);
286 writew(val
, i2c_dev
->base
+ REG_CR
);
288 val
= readw(i2c_dev
->base
+ REG_CR
);
290 writew(val
, i2c_dev
->base
+ REG_CR
);
297 static int wmt_i2c_xfer(struct i2c_adapter
*adap
,
298 struct i2c_msg msgs
[],
301 struct i2c_msg
*pmsg
;
305 for (i
= 0; ret
>= 0 && i
< num
; i
++) {
306 is_last
= ((i
+ 1) == num
);
309 if (pmsg
->flags
& I2C_M_RD
)
310 ret
= wmt_i2c_read(adap
, pmsg
, is_last
);
312 ret
= wmt_i2c_write(adap
, pmsg
, is_last
);
315 return (ret
< 0) ? ret
: i
;
318 static u32
wmt_i2c_func(struct i2c_adapter
*adap
)
320 return I2C_FUNC_I2C
| I2C_FUNC_SMBUS_EMUL
| I2C_FUNC_NOSTART
;
323 static const struct i2c_algorithm wmt_i2c_algo
= {
324 .master_xfer
= wmt_i2c_xfer
,
325 .functionality
= wmt_i2c_func
,
328 static irqreturn_t
wmt_i2c_isr(int irq
, void *data
)
330 struct wmt_i2c_dev
*i2c_dev
= data
;
332 /* save the status and write-clear it */
333 i2c_dev
->cmd_status
= readw(i2c_dev
->base
+ REG_ISR
);
334 writew(i2c_dev
->cmd_status
, i2c_dev
->base
+ REG_ISR
);
336 complete(&i2c_dev
->complete
);
341 static int wmt_i2c_reset_hardware(struct wmt_i2c_dev
*i2c_dev
)
345 err
= clk_prepare_enable(i2c_dev
->clk
);
347 dev_err(i2c_dev
->dev
, "failed to enable clock\n");
351 err
= clk_set_rate(i2c_dev
->clk
, 20000000);
353 dev_err(i2c_dev
->dev
, "failed to set clock = 20Mhz\n");
354 clk_disable_unprepare(i2c_dev
->clk
);
358 writew(0, i2c_dev
->base
+ REG_CR
);
359 writew(MCR_APB_166M
, i2c_dev
->base
+ REG_MCR
);
360 writew(ISR_WRITE_ALL
, i2c_dev
->base
+ REG_ISR
);
361 writew(IMR_ENABLE_ALL
, i2c_dev
->base
+ REG_IMR
);
362 writew(CR_ENABLE
, i2c_dev
->base
+ REG_CR
);
363 readw(i2c_dev
->base
+ REG_CSR
); /* read clear */
364 writew(ISR_WRITE_ALL
, i2c_dev
->base
+ REG_ISR
);
366 if (i2c_dev
->mode
== I2C_MODE_STANDARD
)
367 writew(SCL_TIMEOUT(128) | TR_STD
, i2c_dev
->base
+ REG_TR
);
369 writew(SCL_TIMEOUT(128) | TR_HS
, i2c_dev
->base
+ REG_TR
);
374 static int wmt_i2c_probe(struct platform_device
*pdev
)
376 struct device_node
*np
= pdev
->dev
.of_node
;
377 struct wmt_i2c_dev
*i2c_dev
;
378 struct i2c_adapter
*adap
;
379 struct resource
*res
;
383 i2c_dev
= devm_kzalloc(&pdev
->dev
, sizeof(*i2c_dev
), GFP_KERNEL
);
387 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
388 i2c_dev
->base
= devm_ioremap_resource(&pdev
->dev
, res
);
389 if (IS_ERR(i2c_dev
->base
))
390 return PTR_ERR(i2c_dev
->base
);
392 i2c_dev
->irq
= irq_of_parse_and_map(np
, 0);
394 dev_err(&pdev
->dev
, "irq missing or invalid\n");
398 i2c_dev
->clk
= of_clk_get(np
, 0);
399 if (IS_ERR(i2c_dev
->clk
)) {
400 dev_err(&pdev
->dev
, "unable to request clock\n");
401 return PTR_ERR(i2c_dev
->clk
);
404 i2c_dev
->mode
= I2C_MODE_STANDARD
;
405 err
= of_property_read_u32(np
, "clock-frequency", &clk_rate
);
406 if ((!err
) && (clk_rate
== 400000))
407 i2c_dev
->mode
= I2C_MODE_FAST
;
409 i2c_dev
->dev
= &pdev
->dev
;
411 err
= devm_request_irq(&pdev
->dev
, i2c_dev
->irq
, wmt_i2c_isr
, 0,
414 dev_err(&pdev
->dev
, "failed to request irq %i\n", i2c_dev
->irq
);
418 adap
= &i2c_dev
->adapter
;
419 i2c_set_adapdata(adap
, i2c_dev
);
420 strlcpy(adap
->name
, "WMT I2C adapter", sizeof(adap
->name
));
421 adap
->owner
= THIS_MODULE
;
422 adap
->algo
= &wmt_i2c_algo
;
423 adap
->dev
.parent
= &pdev
->dev
;
424 adap
->dev
.of_node
= pdev
->dev
.of_node
;
426 init_completion(&i2c_dev
->complete
);
428 err
= wmt_i2c_reset_hardware(i2c_dev
);
430 dev_err(&pdev
->dev
, "error initializing hardware\n");
434 err
= i2c_add_adapter(adap
);
438 platform_set_drvdata(pdev
, i2c_dev
);
443 static int wmt_i2c_remove(struct platform_device
*pdev
)
445 struct wmt_i2c_dev
*i2c_dev
= platform_get_drvdata(pdev
);
447 /* Disable interrupts, clock and delete adapter */
448 writew(0, i2c_dev
->base
+ REG_IMR
);
449 clk_disable_unprepare(i2c_dev
->clk
);
450 i2c_del_adapter(&i2c_dev
->adapter
);
455 static const struct of_device_id wmt_i2c_dt_ids
[] = {
456 { .compatible
= "wm,wm8505-i2c" },
460 static struct platform_driver wmt_i2c_driver
= {
461 .probe
= wmt_i2c_probe
,
462 .remove
= wmt_i2c_remove
,
465 .of_match_table
= wmt_i2c_dt_ids
,
469 module_platform_driver(wmt_i2c_driver
);
471 MODULE_DESCRIPTION("Wondermedia I2C master-mode bus adapter");
472 MODULE_AUTHOR("Tony Prisk <linux@prisktech.co.nz>");
473 MODULE_LICENSE("GPL");
474 MODULE_DEVICE_TABLE(of
, wmt_i2c_dt_ids
);