1 /* drivers/i2c/busses/i2c_rk2818.c
3 * Copyright (C) 2010 ROCKCHIP, Inc.
5 * This software is licensed under the terms of the GNU General Public
6 * License version 2, as published by the Free Software Foundation, and
7 * may be copied, distributed, and modified under those terms.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
15 #include <linux/kernel.h>
16 #include <linux/delay.h>
17 #include <linux/module.h>
18 #include <linux/completion.h>
19 #include <linux/init.h>
20 #include <linux/interrupt.h>
21 #include <linux/spinlock.h>
22 #include <linux/err.h>
23 #include <linux/platform_device.h>
24 #include <linux/cpufreq.h>
25 #include <linux/device.h>
26 #include <linux/clk.h>
27 #include <linux/delay.h>
28 #include <linux/i2c.h>
29 #include <mach/board.h>
32 #include "i2c-rk2818.h"
33 #define DRV_NAME "rk2818_i2c"
35 #define RK2818_I2C_TIMEOUT (msecs_to_jiffies(500))
36 #define RK2818_DELAY_TIME 2
39 #define i2c_dbg(dev, format, arg...) \
40 dev_printk(KERN_INFO , dev , format , ## arg)
42 #define i2c_dbg(dev, format, arg...)
46 RK2818_ERROR_NONE = 0,
47 RK2818_ERROR_ARBITR_LOSE,
52 RK2818_EVENT_NONE = 0,
53 /* master has received ack(MTX mode)
54 means that data has been sent to slave.
56 RK2818_EVENT_MTX_RCVD_ACK,
57 /* master needs to send ack to slave(MRX mode)
58 means that data has been received from slave.
60 RK2818_EVENT_MRX_NEED_ACK,
64 struct rk2818_i2c_data {
66 struct i2c_adapter adap;
68 struct resource *ioarea;
70 unsigned int suspended:1;
71 unsigned long scl_rate;
72 unsigned long i2c_rate;
80 struct completion cmd_complete;
81 enum rk2818_event cmd_event;
82 enum rk2818_error cmd_err;
86 #ifdef CONFIG_CPU_FREQ
87 struct notifier_block freq_transition;
91 static void rk2818_i2c_init_hw(struct rk2818_i2c_data *i2c);
93 static inline void rk2818_i2c_disable_irqs(struct rk2818_i2c_data *i2c)
97 tmp = readl(i2c->regs + I2C_IER);
98 writel(tmp & IRQ_ALL_DISABLE, i2c->regs + I2C_IER);
100 static inline void rk2818_i2c_enable_irqs(struct rk2818_i2c_data *i2c)
104 tmp = readl(i2c->regs + I2C_IER);
105 writel(tmp | IRQ_MST_ENABLE, i2c->regs + I2C_IER);
108 /* scl = pclk/(5 *(rem+1) * 2^(exp+1)) */
109 static void rk2818_i2c_calcdivisor(unsigned long pclk,
110 unsigned long scl_rate,
111 unsigned long *real_rate,
112 unsigned int *rem, unsigned int *exp)
114 unsigned int calc_rem = 0;
115 unsigned int calc_exp = 0;
117 for(calc_exp = 0; calc_exp < I2CCDVR_EXP_MAX; calc_exp++)
119 calc_rem = pclk / (5 * scl_rate * (1 <<(calc_exp +1)));
120 if(calc_rem < I2CCDVR_REM_MAX)
123 if(calc_rem >= I2CCDVR_REM_MAX || calc_exp >= I2CCDVR_EXP_MAX)
125 calc_rem = I2CCDVR_REM_MAX - 1;
126 calc_exp = I2CCDVR_EXP_MAX - 1;
130 *real_rate = pclk/(5 * (calc_rem + 1) * (1 <<(calc_exp +1)));
133 /* set i2c bus scl rate */
134 static void rk2818_i2c_clockrate(struct rk2818_i2c_data *i2c)
136 struct rk2818_i2c_platform_data *pdata = i2c->dev->platform_data;
137 unsigned int rem = 0, exp = 0;
138 unsigned long scl_rate, real_rate = 0, tmp;
140 i2c->i2c_rate = clk_get_rate(i2c->clk);
142 scl_rate = (i2c->scl_rate) ? i2c->scl_rate : ((pdata->scl_rate)? pdata->scl_rate:100000);
144 rk2818_i2c_calcdivisor(i2c->i2c_rate, scl_rate, &real_rate, &rem, &exp);
146 tmp = readl(i2c->regs + I2C_OPR);
148 tmp |= rem<<I2CCDVR_EXP_BITS;
149 writel(tmp, i2c->regs + I2C_OPR);
150 if(real_rate > 400000)
151 dev_warn(i2c->dev, "i2c_rate[%luKhz], scl_rate[%luKhz], real_rate[%luKhz] > 400Khz\n",
152 i2c->i2c_rate/1000, scl_rate/1000, real_rate/1000);
154 i2c_dbg(i2c->dev, "i2c_rate[%luKhz], scl_rate[%luKhz], real_rate[%luKhz]\n",
155 i2c->i2c_rate/1000, scl_rate/1000, real_rate/1000);
158 static int rk2818_event_occurred(struct rk2818_i2c_data *i2c)
162 isr = readl(i2c->regs + I2C_ISR);
163 i2c_dbg(i2c->dev,"event occurred, isr = %lx\n", isr);
164 if(isr & I2C_ISR_ARBITR_LOSE)
166 isr &= ~I2C_ISR_ARBITR_LOSE;
167 writel(isr, i2c->regs + I2C_ISR);
168 i2c->cmd_err = RK2818_ERROR_ARBITR_LOSE;
169 dev_err(i2c->dev, "<error>arbitration loss\n");
173 switch(i2c->cmd_event)
175 case RK2818_EVENT_MTX_RCVD_ACK:
176 if(isr & I2C_ISR_MTX_RCVD_ACK)
178 isr &= ~I2C_ISR_MTX_RCVD_ACK;
179 writel(isr, i2c->regs + I2C_ISR);
183 case RK2818_EVENT_MRX_NEED_ACK:
184 if(isr & I2C_ISR_MRX_NEED_ACK)
186 isr &= ~I2C_ISR_MRX_NEED_ACK;
187 writel(isr, i2c->regs + I2C_ISR);
194 i2c->cmd_err = RK2818_ERROR_UNKNOWN;
198 static irqreturn_t rk2818_i2c_irq(int irq, void *data)
200 struct rk2818_i2c_data *i2c = (struct rk2818_i2c_data *)data;
203 rk2818_i2c_disable_irqs(i2c);
204 spin_lock(&i2c->cmd_lock);
205 res = rk2818_event_occurred(i2c);
207 //if(res || i2c->cmd_err != RK2818_ERROR_NONE)
208 complete(&i2c->cmd_complete);
209 spin_unlock(&i2c->cmd_lock);
212 static int wait_for_completion_poll_timeout(struct rk2818_i2c_data *i2c, unsigned long timeout)
214 unsigned int time = RK2818_DELAY_TIME;
217 while(!time_after(jiffies, timeout))
219 res = rk2818_event_occurred(i2c);
221 //if(res || (i2c->cmd_err != RK2818_ERROR_NONE && i2c->cmd_err != RK2818_ERROR_UNKNOWN))
229 static int rk2818_wait_event(struct rk2818_i2c_data *i2c,
230 enum rk2818_event mr_event)
234 if(unlikely(irqs_disabled()))
236 dev_err(i2c->dev, "irqs are disabled on this system!\n");
239 spin_lock_irq(&i2c->cmd_lock);
240 i2c->cmd_err = RK2818_ERROR_NONE;
241 i2c->cmd_event = mr_event;
243 init_completion(&i2c->cmd_complete);
245 spin_unlock_irq(&i2c->cmd_lock);
247 rk2818_i2c_enable_irqs(i2c);
248 if(i2c->mode == I2C_MODE_IRQ)
249 ret = wait_for_completion_interruptible_timeout(&i2c->cmd_complete,
252 ret = wait_for_completion_poll_timeout(i2c, RK2818_I2C_TIMEOUT);
256 dev_err(i2c->dev, "i2c wait for event %04x, retrun %d \n", mr_event, ret);
266 static int rk2818_wait_while_busy(struct rk2818_i2c_data *i2c)
268 unsigned long timeout = jiffies + RK2818_I2C_TIMEOUT;
270 unsigned int time = RK2818_DELAY_TIME;
272 while(!time_after(jiffies, timeout))
274 lsr = readl(i2c->regs + I2C_LSR);
275 if(!(lsr & I2C_LSR_BUSY))
282 static int rk2818_i2c_stop(struct rk2818_i2c_data *i2c)
284 unsigned long timeout = jiffies + RK2818_I2C_TIMEOUT;
285 unsigned int time = RK2818_DELAY_TIME;
287 writel(I2C_LCMR_STOP|I2C_LCMR_RESUME, i2c->regs + I2C_LCMR);
288 while(!time_after(jiffies, timeout))
290 if(!(readl(i2c->regs + I2C_LCMR) & I2C_LCMR_STOP))
292 i2c_dbg(i2c->dev, "i2c stop successfully\n");
301 static int rk2818_send_2nd_addr(struct rk2818_i2c_data *i2c,
302 struct i2c_msg *msg, int start)
305 unsigned long addr_2nd = msg->addr & 0xff;
306 unsigned long conr = readl(i2c->regs + I2C_CONR);
308 conr |= I2C_CONR_MTX_MODE;
309 //conr &= I2C_CONR_ACK;
310 writel(conr, i2c->regs + I2C_CONR);
312 i2c_dbg(i2c->dev, "i2c send addr_2nd: %lx\n", addr_2nd);
313 writel(addr_2nd, i2c->regs + I2C_MTXR);
314 writel(I2C_LCMR_RESUME, i2c->regs + I2C_LCMR);
315 if((ret = rk2818_wait_event(i2c, RK2818_EVENT_MTX_RCVD_ACK)) != 0)
317 dev_err(i2c->dev, "after sent addr_2nd, i2c wait for ACK timeout\n");
322 static int rk2818_send_address(struct rk2818_i2c_data *i2c,
323 struct i2c_msg *msg, int start)
325 unsigned long addr_1st;
326 unsigned long conr = readl(i2c->regs + I2C_CONR);
329 if(msg->flags & I2C_M_TEN)
330 addr_1st = (0xf0 | (((unsigned long) msg->addr & 0x300) >> 7)) & 0xff;
332 addr_1st = ((msg->addr << 1) & 0xff);
334 if (msg->flags & I2C_M_RD)
339 conr |= I2C_CONR_MTX_MODE;
340 //conr &= I2C_CONR_ACK;
341 writel(conr, i2c->regs + I2C_CONR);
342 i2c_dbg(i2c->dev, "i2c send addr_1st: %lx\n", addr_1st);
344 writel(addr_1st, i2c->regs + I2C_MTXR);
348 if((ret = rk2818_wait_while_busy(i2c)) != 0)
350 dev_err(i2c->dev, "i2c is busy, when send address\n");
353 writel(I2C_LCMR_START, i2c->regs + I2C_LCMR);
356 writel(I2C_LCMR_START|I2C_LCMR_RESUME, i2c->regs + I2C_LCMR);
358 if((ret = rk2818_wait_event(i2c, RK2818_EVENT_MTX_RCVD_ACK)) != 0)
360 dev_err(i2c->dev, "after sent addr_1st, i2c wait for ACK timeout\n");
363 if(start && (msg->flags & I2C_M_TEN))
364 ret = rk2818_send_2nd_addr(i2c, msg, start);
368 static int rk2818_i2c_send_msg(struct rk2818_i2c_data *i2c, struct i2c_msg *msg)
371 unsigned long conr = readl(i2c->regs + I2C_CONR);
373 conr = readl(i2c->regs + I2C_CONR);
374 conr |= I2C_CONR_MTX_MODE;
375 writel(conr, i2c->regs + I2C_CONR);
376 for(i = 0; i < msg->len; i++)
378 i2c_dbg(i2c->dev, "i2c send buf[%d]: %x\n", i, msg->buf[i]);
379 writel(msg->buf[i], i2c->regs + I2C_MTXR);
381 conr = readl(i2c->regs + I2C_CONR);
382 conr &= I2C_CONR_ACK;
383 writel(conr, i2c->regs + I2C_CONR);
385 writel(I2C_LCMR_RESUME, i2c->regs + I2C_LCMR);
387 if((ret = rk2818_wait_event(i2c, RK2818_EVENT_MTX_RCVD_ACK)) != 0)
392 static int rk2818_i2c_recv_msg(struct rk2818_i2c_data *i2c, struct i2c_msg *msg)
395 unsigned long conr = readl(i2c->regs + I2C_CONR);
397 conr = readl(i2c->regs + I2C_CONR);
398 conr &= I2C_CONR_MRX_MODE;
399 writel(conr, i2c->regs + I2C_CONR);
401 for(i = 0; i < msg->len; i++)
403 writel(I2C_LCMR_RESUME, i2c->regs + I2C_LCMR);
404 if((ret = rk2818_wait_event(i2c, RK2818_EVENT_MRX_NEED_ACK)) != 0)
406 conr = readl(i2c->regs + I2C_CONR);
407 conr &= I2C_CONR_ACK;
408 writel(conr, i2c->regs + I2C_CONR);
409 msg->buf[i] = (uint8_t)readl(i2c->regs + I2C_MRXR);
410 i2c_dbg(i2c->dev, "i2c recv >>>>>>>>>>>> buf[%d]: %x\n", i, msg->buf[i]);
414 static int rk2818_xfer_msg(struct i2c_adapter *adap,
415 struct i2c_msg *msg, int start, int stop)
417 struct rk2818_i2c_data *i2c = (struct rk2818_i2c_data *)adap->algo_data;
418 unsigned long conr = readl(i2c->regs + I2C_CONR);
425 dev_err(i2c->dev, "<error>msg->len = %d\n", msg->len);
429 if((ret = rk2818_send_address(i2c, msg, start))!= 0)
431 dev_err(i2c->dev, "<error>rk2818_send_address timeout\n");
434 if(msg->flags & I2C_M_RD)
436 if((ret = rk2818_i2c_recv_msg(i2c, msg)) != 0)
438 dev_err(i2c->dev, "<error>rk2818_i2c_recv_msg timeout\n");
444 if((ret = rk2818_i2c_send_msg(i2c, msg)) != 0)
446 dev_err(i2c->dev, "<error>rk2818_i2c_send_msg timeout\n");
454 conr = readl(i2c->regs + I2C_CONR);
455 conr |= I2C_CONR_NAK;
456 writel(conr, i2c->regs + I2C_CONR);
457 if((ret = rk2818_i2c_stop(i2c)) != 0)
459 dev_err(i2c->dev, "<error>rk2818_i2c_stop timeout\n");
467 static int rk2818_i2c_xfer(struct i2c_adapter *adap,
468 struct i2c_msg *msgs, int num)
472 struct rk2818_i2c_data *i2c = (struct rk2818_i2c_data *)adap->algo_data;
473 unsigned long conr = readl(i2c->regs + I2C_CONR);
475 if(i2c->suspended ==1)
477 if(msgs[0].scl_rate <= 400000 && msgs[0].scl_rate > 0)
478 i2c->scl_rate = msgs[0].scl_rate;
480 i2c->scl_rate = 400000;
482 conr |= I2C_CONR_MPORT_ENABLE;
483 writel(conr, i2c->regs + I2C_CONR);
485 rk2818_i2c_init_hw(i2c);
487 conr = readl(i2c->regs + I2C_CONR);
488 conr &= I2C_CONR_ACK;
489 writel(conr, i2c->regs + I2C_CONR);
491 for (i = 0; i < num; i++)
493 ret = rk2818_xfer_msg(adap, &msgs[i], (i == 0), (i == (num - 1)));
497 dev_err(i2c->dev, "rk2818_xfer_msg error, ret = %d\n", ret);
501 conr = readl(i2c->regs + I2C_CONR);
502 conr &= I2C_CONR_MPORT_DISABLE;
503 writel(conr, i2c->regs + I2C_CONR);
507 static u32 rk2818_i2c_func(struct i2c_adapter *adap)
509 return I2C_FUNC_I2C | I2C_FUNC_10BIT_ADDR;
512 static const struct i2c_algorithm rk2818_i2c_algorithm = {
513 .master_xfer = rk2818_i2c_xfer,
514 .functionality = rk2818_i2c_func,
518 static void rk2818_i2c_init_hw(struct rk2818_i2c_data *i2c)
520 unsigned long lcmr = 0x00000000;
522 unsigned long opr = readl(i2c->regs + I2C_OPR);
523 opr |= I2C_OPR_RESET_STATUS;
524 writel(opr, i2c->regs + I2C_OPR);
526 writel(lcmr, i2c->regs + I2C_LCMR);
528 rk2818_i2c_disable_irqs(i2c);
530 rk2818_i2c_clockrate(i2c);
532 opr = readl(i2c->regs + I2C_OPR);
533 opr |= I2C_OPR_CORE_ENABLE;
534 writel(opr, i2c->regs + I2C_OPR);
539 #ifdef CONFIG_CPU_FREQ
541 #define freq_to_i2c(_n) container_of(_n, struct rk2818_i2c_data, freq_transition)
543 static int rk2818_i2c_cpufreq_transition(struct notifier_block *nb,
544 unsigned long val, void *data)
546 struct rk2818_i2c_data *i2c = freq_to_i2c(nb);
549 delta_f = clk_get_rate(i2c->clk) - i2c->i2c_rate;
551 if ((val == CPUFREQ_POSTCHANGE && delta_f < 0) ||
552 (val == CPUFREQ_PRECHANGE && delta_f > 0))
554 spin_lock_irqsave(&i2c->cmd_lock, flags);
555 rk2818_i2c_clockrate(i2c);
556 spin_unlock_irqrestore(&i2c->cmd_lock, flags);
561 static inline int rk2818_i2c_register_cpufreq(struct rk2818_i2c_data *i2c)
563 i2c->freq_transition.notifier_call = rk2818_i2c_cpufreq_transition;
565 return cpufreq_register_notifier(&i2c->freq_transition,
566 CPUFREQ_TRANSITION_NOTIFIER);
569 static inline void rk2818_i2c_unregister_cpufreq(struct rk2818_i2c_data *i2c)
571 cpufreq_unregister_notifier(&i2c->freq_transition,
572 CPUFREQ_TRANSITION_NOTIFIER);
576 static inline int rk2818_i2c_register_cpufreq(struct rk2818_i2c_data *i2c)
581 static inline void rk2818_i2c_unregister_cpufreq(struct rk2818_i2c_data *i2c)
586 static int rk2818_i2c_probe(struct platform_device *pdev)
588 struct rk2818_i2c_data *i2c;
589 struct rk2818_i2c_platform_data *pdata;
590 struct resource *res;
593 pdata = pdev->dev.platform_data;
596 dev_err(&pdev->dev, "<error>no platform data\n");
599 i2c = kzalloc(sizeof(struct rk2818_i2c_data), GFP_KERNEL);
602 dev_err(&pdev->dev, "<error>no memory for state\n");
605 i2c->mode = pdata->mode;
606 i2c->scl_rate = (pdata->scl_rate) ? pdata->scl_rate : 100000;
608 strlcpy(i2c->adap.name, DRV_NAME, sizeof(i2c->adap.name));
609 i2c->adap.owner = THIS_MODULE;
610 i2c->adap.algo = &rk2818_i2c_algorithm;
611 i2c->adap.class = I2C_CLASS_HWMON;
612 spin_lock_init(&i2c->cmd_lock);
614 i2c->dev = &pdev->dev;
616 i2c->clk = clk_get(&pdev->dev, "i2c");
617 if (IS_ERR(i2c->clk)) {
618 dev_err(&pdev->dev, "<error>cannot get clock\n");
623 clk_enable(i2c->clk);
625 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
627 dev_err(&pdev->dev, "<error>cannot find IO resource\n");
632 i2c->ioarea = request_mem_region(res->start, res->end - res->start + 1,
635 if (i2c->ioarea == NULL) {
636 dev_err(&pdev->dev, "<error>cannot request IO\n");
641 i2c->regs = ioremap(res->start, res->end - res->start + 1);
643 if (i2c->regs == NULL) {
644 dev_err(&pdev->dev, "<error>annot map IO\n");
648 i2c->adap.algo_data = i2c;
649 i2c->adap.dev.parent = &pdev->dev;
654 rk2818_i2c_init_hw(i2c);
656 i2c->irq = ret = platform_get_irq(pdev, 0);
658 dev_err(&pdev->dev, "cannot find IRQ\n");
661 if(i2c->mode == I2C_MODE_IRQ)
663 ret = request_irq(i2c->irq, rk2818_i2c_irq, IRQF_DISABLED,
664 dev_name(&pdev->dev), i2c);
667 dev_err(&pdev->dev, "cannot claim IRQ %d\n", i2c->irq);
671 ret = rk2818_i2c_register_cpufreq(i2c);
673 dev_err(&pdev->dev, "failed to register cpufreq notifier\n");
677 i2c->adap.nr = pdata->bus_num;
678 ret = i2c_add_numbered_adapter(&i2c->adap);
680 dev_err(&pdev->dev, "failed to add bus to i2c core\n");
684 platform_set_drvdata(pdev, i2c);
686 dev_info(&pdev->dev, "%s: RK2818 I2C adapter\n", dev_name(&i2c->adap.dev));
690 rk2818_i2c_unregister_cpufreq(i2c);
693 if(i2c->mode == I2C_MODE_IRQ)
694 free_irq(i2c->irq, i2c);
700 release_resource(i2c->ioarea);
704 clk_disable(i2c->clk);
713 static int rk2818_i2c_remove(struct platform_device *pdev)
715 struct rk2818_i2c_data *i2c = platform_get_drvdata(pdev);
717 rk2818_i2c_unregister_cpufreq(i2c);
719 i2c_del_adapter(&i2c->adap);
720 if(i2c->mode == I2C_MODE_IRQ)
721 free_irq(i2c->irq, i2c);
723 clk_disable(i2c->clk);
728 release_resource(i2c->ioarea);
736 static int rk2818_i2c_suspend(struct platform_device *pdev, pm_message_t state)
738 struct rk2818_i2c_data *i2c = platform_get_drvdata(pdev);
743 static int rk2818_i2c_resume(struct platform_device *pdev)
745 struct rk2818_i2c_data *i2c = platform_get_drvdata(pdev);
748 rk2818_i2c_init_hw(i2c);
753 #define rk2818_i2c_suspend NULL
754 #define rk2818_i2c_resume NULL
758 static struct platform_driver rk2818_i2c_driver = {
759 .probe = rk2818_i2c_probe,
760 .remove = rk2818_i2c_remove,
761 .suspend = rk2818_i2c_suspend,
762 .resume = rk2818_i2c_resume,
764 .owner = THIS_MODULE,
769 static int __init rk2818_i2c_adap_init(void)
771 return platform_driver_register(&rk2818_i2c_driver);
774 static void __exit rk2818_i2c_adap_exit(void)
776 platform_driver_unregister(&rk2818_i2c_driver);
779 subsys_initcall(rk2818_i2c_adap_init);
780 module_exit(rk2818_i2c_adap_exit);
782 MODULE_DESCRIPTION("Driver for RK2818 I2C Bus");
783 MODULE_AUTHOR("kfx, kfx@rock-chips.com");
784 MODULE_LICENSE("GPL");