aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnders Berg <anders.berg@avagotech.com>2014-10-03 07:08:02 -0400
committerWolfram Sang <wsa@the-dreams.de>2014-10-03 08:11:53 -0400
commit08678b850cd0c49cc49c7fed0c93f720f85368e8 (patch)
treed8c2d3c7d9f0b8870eaafcaf7664288839676746
parent2374a5399b7263eb1afc6b5522a56ebf9f0b8636 (diff)
i2c: axxia: Add I2C driver for AXM55xx
Add I2C bus driver for the controller found in the LSI Axxia family SoCs. The driver implements 10-bit addressing and SMBus transfer modes via emulation (including SMBus block data read). Signed-off-by: Anders Berg <anders.berg@avagotech.com> Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
-rw-r--r--Documentation/devicetree/bindings/i2c/i2c-axxia.txt30
-rw-r--r--drivers/i2c/busses/Kconfig11
-rw-r--r--drivers/i2c/busses/Makefile1
-rw-r--r--drivers/i2c/busses/i2c-axxia.c559
4 files changed, 601 insertions, 0 deletions
diff --git a/Documentation/devicetree/bindings/i2c/i2c-axxia.txt b/Documentation/devicetree/bindings/i2c/i2c-axxia.txt
new file mode 100644
index 000000000000..2296d782b4c2
--- /dev/null
+++ b/Documentation/devicetree/bindings/i2c/i2c-axxia.txt
@@ -0,0 +1,30 @@
1LSI Axxia I2C
2
3Required properties :
4- compatible : Must be "lsi,api2c"
5- reg : Offset and length of the register set for the device
6- interrupts : the interrupt specifier
7- #address-cells : Must be <1>;
8- #size-cells : Must be <0>;
9- clock-names : Must contain "i2c".
10- clocks: Must contain an entry for each name in clock-names. See the common
11 clock bindings.
12
13Optional properties :
14- clock-frequency : Desired I2C bus clock frequency in Hz. If not specified,
15 the default 100 kHz frequency will be used. As only Normal and Fast modes
16 are supported, possible values are 100000 and 400000.
17
18Example :
19
20i2c@02010084000 {
21 compatible = "lsi,api2c";
22 device_type = "i2c";
23 #address-cells = <1>;
24 #size-cells = <0>;
25 reg = <0x20 0x10084000 0x00 0x1000>;
26 interrupts = <0 19 4>;
27 clocks = <&clk_per>;
28 clock-names = "i2c";
29 clock-frequency = <400000>;
30};
diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig
index 1f3b9cb1faa7..e1d491b0b9c9 100644
--- a/drivers/i2c/busses/Kconfig
+++ b/drivers/i2c/busses/Kconfig
@@ -337,6 +337,17 @@ config I2C_AU1550
337 This driver can also be built as a module. If so, the module 337 This driver can also be built as a module. If so, the module
338 will be called i2c-au1550. 338 will be called i2c-au1550.
339 339
340config I2C_AXXIA
341 tristate "Axxia I2C controller"
342 depends on ARCH_AXXIA || COMPILE_TEST
343 default ARCH_AXXIA
344 help
345 Say yes if you want to support the I2C bus on Axxia platforms.
346
347 Please note that this controller is limited to transfers of maximum
348 255 bytes in length. Any attempt to to a larger transfer will return
349 an error.
350
340config I2C_BCM2835 351config I2C_BCM2835
341 tristate "Broadcom BCM2835 I2C controller" 352 tristate "Broadcom BCM2835 I2C controller"
342 depends on ARCH_BCM2835 353 depends on ARCH_BCM2835
diff --git a/drivers/i2c/busses/Makefile b/drivers/i2c/busses/Makefile
index 49bf07e5ef4d..9fb33fab9bfd 100644
--- a/drivers/i2c/busses/Makefile
+++ b/drivers/i2c/busses/Makefile
@@ -31,6 +31,7 @@ obj-$(CONFIG_I2C_POWERMAC) += i2c-powermac.o
31# Embedded system I2C/SMBus host controller drivers 31# Embedded system I2C/SMBus host controller drivers
32obj-$(CONFIG_I2C_AT91) += i2c-at91.o 32obj-$(CONFIG_I2C_AT91) += i2c-at91.o
33obj-$(CONFIG_I2C_AU1550) += i2c-au1550.o 33obj-$(CONFIG_I2C_AU1550) += i2c-au1550.o
34obj-$(CONFIG_I2C_AXXIA) += i2c-axxia.o
34obj-$(CONFIG_I2C_BCM2835) += i2c-bcm2835.o 35obj-$(CONFIG_I2C_BCM2835) += i2c-bcm2835.o
35obj-$(CONFIG_I2C_BLACKFIN_TWI) += i2c-bfin-twi.o 36obj-$(CONFIG_I2C_BLACKFIN_TWI) += i2c-bfin-twi.o
36obj-$(CONFIG_I2C_CADENCE) += i2c-cadence.o 37obj-$(CONFIG_I2C_CADENCE) += i2c-cadence.o
diff --git a/drivers/i2c/busses/i2c-axxia.c b/drivers/i2c/busses/i2c-axxia.c
new file mode 100644
index 000000000000..768a598d8d03
--- /dev/null
+++ b/drivers/i2c/busses/i2c-axxia.c
@@ -0,0 +1,559 @@
1/*
2 * This driver implements I2C master functionality using the LSI API2C
3 * controller.
4 *
5 * NOTE: The controller has a limitation in that it can only do transfers of
6 * maximum 255 bytes at a time. If a larger transfer is attempted, error code
7 * (-EINVAL) is returned.
8 *
9 * This software is licensed under the terms of the GNU General Public
10 * License version 2, as published by the Free Software Foundation, and
11 * may be copied, distributed, and modified under those terms.
12 */
13#include <linux/clk.h>
14#include <linux/clkdev.h>
15#include <linux/err.h>
16#include <linux/i2c.h>
17#include <linux/init.h>
18#include <linux/interrupt.h>
19#include <linux/module.h>
20#include <linux/io.h>
21#include <linux/kernel.h>
22#include <linux/platform_device.h>
23
24#define SCL_WAIT_TIMEOUT_NS 25000000
25#define I2C_XFER_TIMEOUT (msecs_to_jiffies(250))
26#define I2C_STOP_TIMEOUT (msecs_to_jiffies(100))
27#define FIFO_SIZE 8
28
29#define GLOBAL_CONTROL 0x00
30#define GLOBAL_MST_EN BIT(0)
31#define GLOBAL_SLV_EN BIT(1)
32#define GLOBAL_IBML_EN BIT(2)
33#define INTERRUPT_STATUS 0x04
34#define INTERRUPT_ENABLE 0x08
35#define INT_SLV BIT(1)
36#define INT_MST BIT(0)
37#define WAIT_TIMER_CONTROL 0x0c
38#define WT_EN BIT(15)
39#define WT_VALUE(_x) ((_x) & 0x7fff)
40#define IBML_TIMEOUT 0x10
41#define IBML_LOW_MEXT 0x14
42#define IBML_LOW_SEXT 0x18
43#define TIMER_CLOCK_DIV 0x1c
44#define I2C_BUS_MONITOR 0x20
45#define SOFT_RESET 0x24
46#define MST_COMMAND 0x28
47#define CMD_BUSY (1<<3)
48#define CMD_MANUAL (0x00 | CMD_BUSY)
49#define CMD_AUTO (0x01 | CMD_BUSY)
50#define MST_RX_XFER 0x2c
51#define MST_TX_XFER 0x30
52#define MST_ADDR_1 0x34
53#define MST_ADDR_2 0x38
54#define MST_DATA 0x3c
55#define MST_TX_FIFO 0x40
56#define MST_RX_FIFO 0x44
57#define MST_INT_ENABLE 0x48
58#define MST_INT_STATUS 0x4c
59#define MST_STATUS_RFL (1 << 13) /* RX FIFO serivce */
60#define MST_STATUS_TFL (1 << 12) /* TX FIFO service */
61#define MST_STATUS_SNS (1 << 11) /* Manual mode done */
62#define MST_STATUS_SS (1 << 10) /* Automatic mode done */
63#define MST_STATUS_SCC (1 << 9) /* Stop complete */
64#define MST_STATUS_IP (1 << 8) /* Invalid parameter */
65#define MST_STATUS_TSS (1 << 7) /* Timeout */
66#define MST_STATUS_AL (1 << 6) /* Arbitration lost */
67#define MST_STATUS_ND (1 << 5) /* NAK on data phase */
68#define MST_STATUS_NA (1 << 4) /* NAK on address phase */
69#define MST_STATUS_NAK (MST_STATUS_NA | \
70 MST_STATUS_ND)
71#define MST_STATUS_ERR (MST_STATUS_NAK | \
72 MST_STATUS_AL | \
73 MST_STATUS_IP | \
74 MST_STATUS_TSS)
75#define MST_TX_BYTES_XFRD 0x50
76#define MST_RX_BYTES_XFRD 0x54
77#define SCL_HIGH_PERIOD 0x80
78#define SCL_LOW_PERIOD 0x84
79#define SPIKE_FLTR_LEN 0x88
80#define SDA_SETUP_TIME 0x8c
81#define SDA_HOLD_TIME 0x90
82
83/**
84 * axxia_i2c_dev - I2C device context
85 * @base: pointer to register struct
86 * @msg: pointer to current message
87 * @msg_xfrd: number of bytes transferred in msg
88 * @msg_err: error code for completed message
89 * @msg_complete: xfer completion object
90 * @dev: device reference
91 * @adapter: core i2c abstraction
92 * @i2c_clk: clock reference for i2c input clock
93 * @bus_clk_rate: current i2c bus clock rate
94 */
95struct axxia_i2c_dev {
96 void __iomem *base;
97 struct i2c_msg *msg;
98 size_t msg_xfrd;
99 int msg_err;
100 struct completion msg_complete;
101 struct device *dev;
102 struct i2c_adapter adapter;
103 struct clk *i2c_clk;
104 u32 bus_clk_rate;
105};
106
107static void i2c_int_disable(struct axxia_i2c_dev *idev, u32 mask)
108{
109 u32 int_en;
110
111 int_en = readl(idev->base + MST_INT_ENABLE);
112 writel(int_en & ~mask, idev->base + MST_INT_ENABLE);
113}
114
115static void i2c_int_enable(struct axxia_i2c_dev *idev, u32 mask)
116{
117 u32 int_en;
118
119 int_en = readl(idev->base + MST_INT_ENABLE);
120 writel(int_en | mask, idev->base + MST_INT_ENABLE);
121}
122
123/**
124 * ns_to_clk - Convert time (ns) to clock cycles for the given clock frequency.
125 */
126static u32 ns_to_clk(u64 ns, u32 clk_mhz)
127{
128 return div_u64(ns * clk_mhz, 1000);
129}
130
131static int axxia_i2c_init(struct axxia_i2c_dev *idev)
132{
133 u32 divisor = clk_get_rate(idev->i2c_clk) / idev->bus_clk_rate;
134 u32 clk_mhz = clk_get_rate(idev->i2c_clk) / 1000000;
135 u32 t_setup;
136 u32 t_high, t_low;
137 u32 tmo_clk;
138 u32 prescale;
139 unsigned long timeout;
140
141 dev_dbg(idev->dev, "rate=%uHz per_clk=%uMHz -> ratio=1:%u\n",
142 idev->bus_clk_rate, clk_mhz, divisor);
143
144 /* Reset controller */
145 writel(0x01, idev->base + SOFT_RESET);
146 timeout = jiffies + msecs_to_jiffies(100);
147 while (readl(idev->base + SOFT_RESET) & 1) {
148 if (time_after(jiffies, timeout)) {
149 dev_warn(idev->dev, "Soft reset failed\n");
150 break;
151 }
152 }
153
154 /* Enable Master Mode */
155 writel(0x1, idev->base + GLOBAL_CONTROL);
156
157 if (idev->bus_clk_rate <= 100000) {
158 /* Standard mode SCL 50/50, tSU:DAT = 250 ns */
159 t_high = divisor * 1 / 2;
160 t_low = divisor * 1 / 2;
161 t_setup = ns_to_clk(250, clk_mhz);
162 } else {
163 /* Fast mode SCL 33/66, tSU:DAT = 100 ns */
164 t_high = divisor * 1 / 3;
165 t_low = divisor * 2 / 3;
166 t_setup = ns_to_clk(100, clk_mhz);
167 }
168
169 /* SCL High Time */
170 writel(t_high, idev->base + SCL_HIGH_PERIOD);
171 /* SCL Low Time */
172 writel(t_low, idev->base + SCL_LOW_PERIOD);
173 /* SDA Setup Time */
174 writel(t_setup, idev->base + SDA_SETUP_TIME);
175 /* SDA Hold Time, 300ns */
176 writel(ns_to_clk(300, clk_mhz), idev->base + SDA_HOLD_TIME);
177 /* Filter <50ns spikes */
178 writel(ns_to_clk(50, clk_mhz), idev->base + SPIKE_FLTR_LEN);
179
180 /* Configure Time-Out Registers */
181 tmo_clk = ns_to_clk(SCL_WAIT_TIMEOUT_NS, clk_mhz);
182
183 /* Find prescaler value that makes tmo_clk fit in 15-bits counter. */
184 for (prescale = 0; prescale < 15; ++prescale) {
185 if (tmo_clk <= 0x7fff)
186 break;
187 tmo_clk >>= 1;
188 }
189 if (tmo_clk > 0x7fff)
190 tmo_clk = 0x7fff;
191
192 /* Prescale divider (log2) */
193 writel(prescale, idev->base + TIMER_CLOCK_DIV);
194 /* Timeout in divided clocks */
195 writel(WT_EN | WT_VALUE(tmo_clk), idev->base + WAIT_TIMER_CONTROL);
196
197 /* Mask all master interrupt bits */
198 i2c_int_disable(idev, ~0);
199
200 /* Interrupt enable */
201 writel(0x01, idev->base + INTERRUPT_ENABLE);
202
203 return 0;
204}
205
206static int i2c_m_rd(const struct i2c_msg *msg)
207{
208 return (msg->flags & I2C_M_RD) != 0;
209}
210
211static int i2c_m_ten(const struct i2c_msg *msg)
212{
213 return (msg->flags & I2C_M_TEN) != 0;
214}
215
216static int i2c_m_recv_len(const struct i2c_msg *msg)
217{
218 return (msg->flags & I2C_M_RECV_LEN) != 0;
219}
220
221/**
222 * axxia_i2c_empty_rx_fifo - Fetch data from RX FIFO and update SMBus block
223 * transfer length if this is the first byte of such a transfer.
224 */
225static int axxia_i2c_empty_rx_fifo(struct axxia_i2c_dev *idev)
226{
227 struct i2c_msg *msg = idev->msg;
228 size_t rx_fifo_avail = readl(idev->base + MST_RX_FIFO);
229 int bytes_to_transfer = min(rx_fifo_avail, msg->len - idev->msg_xfrd);
230
231 while (bytes_to_transfer-- > 0) {
232 int c = readl(idev->base + MST_DATA);
233
234 if (idev->msg_xfrd == 0 && i2c_m_recv_len(msg)) {
235 /*
236 * Check length byte for SMBus block read
237 */
238 if (c <= 0 || c > I2C_SMBUS_BLOCK_MAX) {
239 idev->msg_err = -EPROTO;
240 i2c_int_disable(idev, ~0);
241 complete(&idev->msg_complete);
242 break;
243 }
244 msg->len = 1 + c;
245 writel(msg->len, idev->base + MST_RX_XFER);
246 }
247 msg->buf[idev->msg_xfrd++] = c;
248 }
249
250 return 0;
251}
252
253/**
254 * axxia_i2c_fill_tx_fifo - Fill TX FIFO from current message buffer.
255 * @return: Number of bytes left to transfer.
256 */
257static int axxia_i2c_fill_tx_fifo(struct axxia_i2c_dev *idev)
258{
259 struct i2c_msg *msg = idev->msg;
260 size_t tx_fifo_avail = FIFO_SIZE - readl(idev->base + MST_TX_FIFO);
261 int bytes_to_transfer = min(tx_fifo_avail, msg->len - idev->msg_xfrd);
262 int ret = msg->len - idev->msg_xfrd - bytes_to_transfer;
263
264 while (bytes_to_transfer-- > 0)
265 writel(msg->buf[idev->msg_xfrd++], idev->base + MST_DATA);
266
267 return ret;
268}
269
270static irqreturn_t axxia_i2c_isr(int irq, void *_dev)
271{
272 struct axxia_i2c_dev *idev = _dev;
273 u32 status;
274
275 if (!(readl(idev->base + INTERRUPT_STATUS) & INT_MST))
276 return IRQ_NONE;
277
278 /* Read interrupt status bits */
279 status = readl(idev->base + MST_INT_STATUS);
280
281 if (!idev->msg) {
282 dev_warn(idev->dev, "unexpected interrupt\n");
283 goto out;
284 }
285
286 /* RX FIFO needs service? */
287 if (i2c_m_rd(idev->msg) && (status & MST_STATUS_RFL))
288 axxia_i2c_empty_rx_fifo(idev);
289
290 /* TX FIFO needs service? */
291 if (!i2c_m_rd(idev->msg) && (status & MST_STATUS_TFL)) {
292 if (axxia_i2c_fill_tx_fifo(idev) == 0)
293 i2c_int_disable(idev, MST_STATUS_TFL);
294 }
295
296 if (status & MST_STATUS_SCC) {
297 /* Stop completed */
298 i2c_int_disable(idev, ~0);
299 complete(&idev->msg_complete);
300 } else if (status & MST_STATUS_SNS) {
301 /* Transfer done */
302 i2c_int_disable(idev, ~0);
303 if (i2c_m_rd(idev->msg) && idev->msg_xfrd < idev->msg->len)
304 axxia_i2c_empty_rx_fifo(idev);
305 complete(&idev->msg_complete);
306 } else if (unlikely(status & MST_STATUS_ERR)) {
307 /* Transfer error */
308 i2c_int_disable(idev, ~0);
309 if (status & MST_STATUS_AL)
310 idev->msg_err = -EAGAIN;
311 else if (status & MST_STATUS_NAK)
312 idev->msg_err = -ENXIO;
313 else
314 idev->msg_err = -EIO;
315 dev_dbg(idev->dev, "error %#x, addr=%#x rx=%u/%u tx=%u/%u\n",
316 status,
317 idev->msg->addr,
318 readl(idev->base + MST_RX_BYTES_XFRD),
319 readl(idev->base + MST_RX_XFER),
320 readl(idev->base + MST_TX_BYTES_XFRD),
321 readl(idev->base + MST_TX_XFER));
322 complete(&idev->msg_complete);
323 }
324
325out:
326 /* Clear interrupt */
327 writel(INT_MST, idev->base + INTERRUPT_STATUS);
328
329 return IRQ_HANDLED;
330}
331
332static int axxia_i2c_xfer_msg(struct axxia_i2c_dev *idev, struct i2c_msg *msg)
333{
334 u32 int_mask = MST_STATUS_ERR | MST_STATUS_SNS;
335 u32 rx_xfer, tx_xfer;
336 u32 addr_1, addr_2;
337 int ret;
338
339 if (msg->len > 255) {
340 dev_warn(idev->dev, "unsupported length %u\n", msg->len);
341 return -EINVAL;
342 }
343
344 idev->msg = msg;
345 idev->msg_xfrd = 0;
346 idev->msg_err = 0;
347 reinit_completion(&idev->msg_complete);
348
349 if (i2c_m_ten(msg)) {
350 /* 10-bit address
351 * addr_1: 5'b11110 | addr[9:8] | (R/nW)
352 * addr_2: addr[7:0]
353 */
354 addr_1 = 0xF0 | ((msg->addr >> 7) & 0x06);
355 addr_2 = msg->addr & 0xFF;
356 } else {
357 /* 7-bit address
358 * addr_1: addr[6:0] | (R/nW)
359 * addr_2: dont care
360 */
361 addr_1 = (msg->addr << 1) & 0xFF;
362 addr_2 = 0;
363 }
364
365 if (i2c_m_rd(msg)) {
366 /* I2C read transfer */
367 rx_xfer = i2c_m_recv_len(msg) ? I2C_SMBUS_BLOCK_MAX : msg->len;
368 tx_xfer = 0;
369 addr_1 |= 1; /* Set the R/nW bit of the address */
370 } else {
371 /* I2C write transfer */
372 rx_xfer = 0;
373 tx_xfer = msg->len;
374 }
375
376 writel(rx_xfer, idev->base + MST_RX_XFER);
377 writel(tx_xfer, idev->base + MST_TX_XFER);
378 writel(addr_1, idev->base + MST_ADDR_1);
379 writel(addr_2, idev->base + MST_ADDR_2);
380
381 if (i2c_m_rd(msg))
382 int_mask |= MST_STATUS_RFL;
383 else if (axxia_i2c_fill_tx_fifo(idev) != 0)
384 int_mask |= MST_STATUS_TFL;
385
386 /* Start manual mode */
387 writel(CMD_MANUAL, idev->base + MST_COMMAND);
388
389 i2c_int_enable(idev, int_mask);
390
391 ret = wait_for_completion_timeout(&idev->msg_complete,
392 I2C_XFER_TIMEOUT);
393
394 i2c_int_disable(idev, int_mask);
395
396 if (readl(idev->base + MST_COMMAND) & CMD_BUSY)
397 dev_warn(idev->dev, "busy after xfer\n");
398
399 if (ret == 0)
400 idev->msg_err = -ETIMEDOUT;
401
402 if (unlikely(idev->msg_err) && idev->msg_err != -ENXIO)
403 axxia_i2c_init(idev);
404
405 return idev->msg_err;
406}
407
408static int axxia_i2c_stop(struct axxia_i2c_dev *idev)
409{
410 u32 int_mask = MST_STATUS_ERR | MST_STATUS_SCC;
411 int ret;
412
413 reinit_completion(&idev->msg_complete);
414
415 /* Issue stop */
416 writel(0xb, idev->base + MST_COMMAND);
417 i2c_int_enable(idev, int_mask);
418 ret = wait_for_completion_timeout(&idev->msg_complete,
419 I2C_STOP_TIMEOUT);
420 i2c_int_disable(idev, int_mask);
421 if (ret == 0)
422 return -ETIMEDOUT;
423
424 if (readl(idev->base + MST_COMMAND) & CMD_BUSY)
425 dev_warn(idev->dev, "busy after stop\n");
426
427 return 0;
428}
429
430static int
431axxia_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
432{
433 struct axxia_i2c_dev *idev = i2c_get_adapdata(adap);
434 int i;
435 int ret = 0;
436
437 for (i = 0; ret == 0 && i < num; ++i)
438 ret = axxia_i2c_xfer_msg(idev, &msgs[i]);
439
440 axxia_i2c_stop(idev);
441
442 return ret ? : i;
443}
444
445static u32 axxia_i2c_func(struct i2c_adapter *adap)
446{
447 u32 caps = (I2C_FUNC_I2C | I2C_FUNC_10BIT_ADDR |
448 I2C_FUNC_SMBUS_EMUL | I2C_FUNC_SMBUS_BLOCK_DATA);
449 return caps;
450}
451
452static const struct i2c_algorithm axxia_i2c_algo = {
453 .master_xfer = axxia_i2c_xfer,
454 .functionality = axxia_i2c_func,
455};
456
457static int axxia_i2c_probe(struct platform_device *pdev)
458{
459 struct device_node *np = pdev->dev.of_node;
460 struct axxia_i2c_dev *idev = NULL;
461 struct resource *res;
462 void __iomem *base;
463 int irq;
464 int ret = 0;
465
466 idev = devm_kzalloc(&pdev->dev, sizeof(*idev), GFP_KERNEL);
467 if (!idev)
468 return -ENOMEM;
469
470 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
471 base = devm_ioremap_resource(&pdev->dev, res);
472 if (IS_ERR(base))
473 return PTR_ERR(base);
474
475 irq = platform_get_irq(pdev, 0);
476 if (irq < 0) {
477 dev_err(&pdev->dev, "missing interrupt resource\n");
478 return irq;
479 }
480
481 idev->i2c_clk = devm_clk_get(&pdev->dev, "i2c");
482 if (IS_ERR(idev->i2c_clk)) {
483 dev_err(&pdev->dev, "missing clock\n");
484 return PTR_ERR(idev->i2c_clk);
485 }
486
487 idev->base = base;
488 idev->dev = &pdev->dev;
489 init_completion(&idev->msg_complete);
490
491 of_property_read_u32(np, "clock-frequency", &idev->bus_clk_rate);
492 if (idev->bus_clk_rate == 0)
493 idev->bus_clk_rate = 100000; /* default clock rate */
494
495 ret = axxia_i2c_init(idev);
496 if (ret) {
497 dev_err(&pdev->dev, "failed to initialize\n");
498 return ret;
499 }
500
501 ret = devm_request_irq(&pdev->dev, irq, axxia_i2c_isr, 0,
502 pdev->name, idev);
503 if (ret) {
504 dev_err(&pdev->dev, "failed to claim IRQ%d\n", irq);
505 return ret;
506 }
507
508 clk_prepare_enable(idev->i2c_clk);
509
510 i2c_set_adapdata(&idev->adapter, idev);
511 strlcpy(idev->adapter.name, pdev->name, sizeof(idev->adapter.name));
512 idev->adapter.owner = THIS_MODULE;
513 idev->adapter.algo = &axxia_i2c_algo;
514 idev->adapter.dev.parent = &pdev->dev;
515 idev->adapter.dev.of_node = pdev->dev.of_node;
516
517 platform_set_drvdata(pdev, idev);
518
519 ret = i2c_add_adapter(&idev->adapter);
520 if (ret) {
521 dev_err(&pdev->dev, "failed to add adapter\n");
522 return ret;
523 }
524
525 return 0;
526}
527
528static int axxia_i2c_remove(struct platform_device *pdev)
529{
530 struct axxia_i2c_dev *idev = platform_get_drvdata(pdev);
531
532 clk_disable_unprepare(idev->i2c_clk);
533 i2c_del_adapter(&idev->adapter);
534
535 return 0;
536}
537
538/* Match table for of_platform binding */
539static const struct of_device_id axxia_i2c_of_match[] = {
540 { .compatible = "lsi,api2c", },
541 {},
542};
543
544MODULE_DEVICE_TABLE(of, axxia_i2c_of_match);
545
546static struct platform_driver axxia_i2c_driver = {
547 .probe = axxia_i2c_probe,
548 .remove = axxia_i2c_remove,
549 .driver = {
550 .name = "axxia-i2c",
551 .of_match_table = axxia_i2c_of_match,
552 },
553};
554
555module_platform_driver(axxia_i2c_driver);
556
557MODULE_DESCRIPTION("Axxia I2C Bus driver");
558MODULE_AUTHOR("Anders Berg <anders.berg@lsi.com>");
559MODULE_LICENSE("GPL v2");