2 * drivers/mfd/rt5025-irq.c
3 * Driver foo Richtek RT5025 PMIC irq
5 * Copyright (C) 2013 Richtek Electronics
6 * cy_huang <cy_huang@richtek.com>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
13 #include <linux/module.h>
14 #include <linux/kernel.h>
15 #include <linux/err.h>
16 #include <linux/i2c.h>
17 #include <linux/platform_device.h>
18 #include <linux/slab.h>
19 #include <linux/wakelock.h>
20 #include <linux/delay.h>
22 #include <linux/gpio.h>
23 #include <linux/irq.h>
24 #include <linux/interrupt.h>
25 #include <linux/workqueue.h>
27 #include <linux/mfd/rt5025.h>
28 #include <linux/mfd/rt5025-irq.h>
30 struct rt5025_irq_info {
31 struct i2c_client *i2c;
33 struct rt5025_chip *chip;
34 struct workqueue_struct *wq;
35 struct rt5025_event_callback *event_cb;
36 struct delayed_work delayed_work;
37 struct wake_lock irq_wake_lock;
44 static void rt5025_work_func(struct work_struct *work)
46 struct delayed_work *delayed_work = (struct delayed_work *)container_of(work, struct delayed_work, work);
47 struct rt5025_irq_info *ii = (struct rt5025_irq_info *)container_of(delayed_work, struct rt5025_irq_info, delayed_work);
48 unsigned char irq_stat[6] = {0};
49 unsigned char irq_enable[6] = {0};
50 uint32_t chg_event = 0, pwr_event = 0;
52 //Add this to prevent i2c xfer before i2c chip is in suspend mode
55 queue_delayed_work(ii->wq, &ii->delayed_work, msecs_to_jiffies(1));
59 #ifdef CONFIG_POWER_RT5025
60 if (!ii->chip->power_info || !ii->chip->jeita_info || !ii->chip->battery_info)
62 queue_delayed_work(ii->wq, &ii->delayed_work, msecs_to_jiffies(1));
68 if (rt5025_reg_block_read(ii->i2c, RT5025_REG_IRQEN1, 10, irq_stat) >= 0)
71 /* backup the irq enable bit */
72 irq_enable[0] = rt5025_reg_read(ii->i2c, RT5025_REG_IRQEN1);
73 irq_enable[1] = rt5025_reg_read(ii->i2c, RT5025_REG_IRQEN2);
74 irq_enable[2] = rt5025_reg_read(ii->i2c, RT5025_REG_IRQEN3);
75 irq_enable[3] = rt5025_reg_read(ii->i2c, RT5025_REG_IRQEN4);
76 irq_enable[4] = rt5025_reg_read(ii->i2c, RT5025_REG_IRQEN5);
77 irq_enable[5] = rt5025_reg_read(ii->i2c, RT5025_REG_GAUGEIRQEN);
79 rt5025_reg_write(ii->i2c, RT5025_REG_IRQEN2, irq_enable[1]&(~RT5025_CHTERMI_MASK));
81 /* disable all irq enable bit first */
82 rt5025_reg_write(ii->i2c, RT5025_REG_IRQEN1, irq_enable[0]&RT5025_ADAPIRQ_MASK);
83 rt5025_reg_write(ii->i2c, RT5025_REG_IRQEN2, 0x00);
84 rt5025_reg_write(ii->i2c, RT5025_REG_IRQEN3, 0x00);
85 rt5025_reg_write(ii->i2c, RT5025_REG_IRQEN4, 0x00);
86 rt5025_reg_write(ii->i2c, RT5025_REG_IRQEN5, 0x00);
87 rt5025_reg_write(ii->i2c, RT5025_REG_GAUGEIRQEN, 0x00);
89 /* read irq status bit */
90 irq_stat[0] = rt5025_reg_read(ii->i2c, RT5025_REG_IRQSTATUS1);
91 irq_stat[1] = rt5025_reg_read(ii->i2c, RT5025_REG_IRQSTATUS2);
92 irq_stat[2] = rt5025_reg_read(ii->i2c, RT5025_REG_IRQSTATUS3);
93 irq_stat[3] = rt5025_reg_read(ii->i2c, RT5025_REG_IRQSTATUS4);
94 irq_stat[4] = rt5025_reg_read(ii->i2c, RT5025_REG_IRQSTATUS5);
95 irq_stat[5] = rt5025_reg_read(ii->i2c, RT5025_REG_GAUGEIRQFLG);
96 RTINFO("irq1->0x%02x, irq2->0x%02x, irq3->0x%02x\n", irq_stat[0], irq_stat[1], irq_stat[2]);
97 RTINFO("irq4->0x%02x, irq5->0x%02x, irq6->0x%02x\n", irq_stat[3], irq_stat[4], irq_stat[5]);
98 RTINFO("stat value = %02x\n", rt5025_reg_read(ii->i2c, RT5025_REG_CHGSTAT));
100 chg_event = irq_stat[0]<<16 | irq_stat[1]<<8 | irq_stat[2];
101 pwr_event = irq_stat[3]<<8 | irq_stat[4];
102 #ifdef CONFIG_POWER_RT5025
103 if ((chg_event & CHARGER_DETECT_MASK))
105 if (chg_event & CHG_EVENT_CHTERMI)
107 ii->chip->power_info->chg_term++;
108 if (ii->chip->power_info->chg_term > 3)
109 ii->chip->power_info->chg_term = 4;
112 if (chg_event & CHG_EVENT_CHRCHGI)
113 ii->chip->power_info->chg_term = 0;
115 if (chg_event & (CHG_EVENT_CHSLPI_INAC | CHG_EVENT_CHSLPI_INUSB))
117 ii->chip->power_info->chg_term = 0;
120 if (chg_event & (CHG_EVENT_INAC_PLUGIN | CHG_EVENT_INUSB_PLUGIN))
124 rt5025_set_charging_buck(ii->i2c, 0);
126 rt5025_set_charging_buck(ii->i2c, 1);
128 rt5025_set_charging_buck(ii->i2c, 0);
130 rt5025_set_charging_buck(ii->i2c, 1);
135 if (ii->chip->power_info->chg_term <= 3)
136 rt5025_power_charge_detect(ii->chip->power_info);
139 #endif /* CONFIG_POWER_RT5025 */
143 ii->event_cb->charger_event_callback(chg_event);
145 ii->event_cb->power_event_callkback(pwr_event);
150 dev_err(ii->dev, "read irq stat io fail\n");
154 #ifdef CONFIG_POWER_RT5025
155 if (irq_stat[5] & RT5025_FLG_TEMP)
156 rt5025_swjeita_irq_handler(ii->chip->jeita_info, irq_stat[5] & RT5025_FLG_TEMP);
157 if (irq_stat[5] & RT5025_FLG_VOLT)
158 rt5025_gauge_irq_handler(ii->chip->battery_info, irq_stat[5] & RT5025_FLG_VOLT);
159 #endif /* CONFIG_POWER_RT5025 */
165 rt5025_reg_write(ii->i2c, RT5025_REG_IRQEN2, irq_enable[1]);
167 /* restore all irq enable bit */
168 rt5025_reg_write(ii->i2c, RT5025_REG_IRQEN1, irq_enable[0]);
169 rt5025_reg_write(ii->i2c, RT5025_REG_IRQEN2, irq_enable[1]);
170 rt5025_reg_write(ii->i2c, RT5025_REG_IRQEN3, irq_enable[2]);
171 rt5025_reg_write(ii->i2c, RT5025_REG_IRQEN4, irq_enable[3]);
172 rt5025_reg_write(ii->i2c, RT5025_REG_IRQEN5, irq_enable[4]);
173 if (rt5025_reg_read(ii->i2c, RT5025_REG_GAUGEIRQEN) == 0)
174 rt5025_reg_write(ii->i2c, RT5025_REG_GAUGEIRQEN, irq_enable[5]);
177 //enable_irq(ii->irq);
180 static irqreturn_t rt5025_interrupt(int irqno, void *param)
182 struct rt5025_irq_info *ii = (struct rt5025_irq_info *)param;
184 //disable_irq_nosync(ii->irq);
185 wake_lock_timeout(&ii->irq_wake_lock, 1*HZ);
186 queue_delayed_work(ii->wq, &ii->delayed_work, 0);
190 static int __devinit rt5025_interrupt_init(struct rt5025_irq_info* ii)
195 ii->wq = create_workqueue("rt5025_wq");
196 INIT_DELAYED_WORK(&ii->delayed_work, rt5025_work_func);
199 if (gpio_is_valid(ii->intr_pin))
201 ret = gpio_request(ii->intr_pin, "rt5025_interrupt");
205 ret = gpio_direction_input(ii->intr_pin);
210 if (request_irq(ii->irq, rt5025_interrupt, IRQ_TYPE_EDGE_FALLING|IRQF_DISABLED, "RT5025_IRQ", ii))
212 dev_err(ii->dev, "couldn't allocate IRQ_NO(%d) !\n", ii->irq);
215 enable_irq_wake(ii->irq);
216 queue_delayed_work(ii->wq, &ii->delayed_work, msecs_to_jiffies(100));
219 if (!gpio_get_value(ii->intr_pin))
221 //disable_irq_nosync(ii->irq);
222 queue_delayed_work(ii->wq, &ii->delayed_work, 0);
232 static void __devexit rt5025_interrupt_deinit(struct rt5025_irq_info* ii)
235 free_irq(ii->irq, ii);
239 cancel_delayed_work_sync(&ii->delayed_work);
240 flush_workqueue(ii->wq);
241 destroy_workqueue(ii->wq);
245 static int __devinit rt5025_irq_reg_init(struct rt5025_irq_info* ii, struct rt5025_irq_data* irq_data)
248 // will just enable the interrupt that we want
249 rt5025_reg_write(ii->i2c, RT5025_REG_IRQEN1, irq_data->irq_enable1.val);
250 rt5025_reg_write(ii->i2c, RT5025_REG_IRQEN2, irq_data->irq_enable2.val);
251 rt5025_reg_write(ii->i2c, RT5025_REG_IRQEN3, irq_data->irq_enable3.val);
252 rt5025_reg_write(ii->i2c, RT5025_REG_IRQEN4, irq_data->irq_enable4.val);
253 rt5025_reg_write(ii->i2c, RT5025_REG_IRQEN5, irq_data->irq_enable5.val);
257 static int __devinit rt5025_irq_probe(struct platform_device *pdev)
259 struct rt5025_chip *chip = dev_get_drvdata(pdev->dev.parent);
260 struct rt5025_platform_data *pdata = chip->dev->platform_data;
261 struct rt5025_irq_info *ii;
264 ii = kzalloc(sizeof(*ii), GFP_KERNEL);
269 ii->dev = &pdev->dev;
271 ii->intr_pin = pdata->intr_pin;
272 ii->irq = chip->irq;//gpio_to_irq(pdata->intr_pin);
274 ii->event_cb = pdata->cb;
275 wake_lock_init(&ii->irq_wake_lock, WAKE_LOCK_SUSPEND, "rt_irq_wake");
278 rt5025_irq_reg_init(ii, pdata->irq_data);
279 rt5025_interrupt_init(ii);
281 platform_set_drvdata(pdev, ii);
286 static int __devexit rt5025_irq_remove(struct platform_device *pdev)
288 struct rt5025_irq_info *ii = platform_get_drvdata(pdev);
290 wake_lock_destroy(&ii->irq_wake_lock);
291 rt5025_interrupt_deinit(ii);
292 platform_set_drvdata(pdev, NULL);
298 static void rt5025_irq_shutdown(struct platform_device *pdev)
300 struct rt5025_irq_info *ii = platform_get_drvdata(pdev);
303 free_irq(ii->irq, ii);
307 cancel_delayed_work_sync(&ii->delayed_work);
308 flush_workqueue(ii->wq);
313 static int rt5025_irq_suspend(struct platform_device *pdev, pm_message_t state)
315 struct rt5025_irq_info *ii = platform_get_drvdata(pdev);
322 static int rt5025_irq_resume(struct platform_device *pdev)
324 struct rt5025_irq_info *ii = platform_get_drvdata(pdev);
331 static struct platform_driver rt5025_irq_driver =
334 .name = RT5025_DEVICE_NAME "-irq",
335 .owner = THIS_MODULE,
337 .probe = rt5025_irq_probe,
338 .remove = __devexit_p(rt5025_irq_remove),
339 .shutdown = rt5025_irq_shutdown,
340 .suspend = rt5025_irq_suspend,
341 .resume = rt5025_irq_resume,
344 static int __init rt5025_irq_init(void)
346 return platform_driver_register(&rt5025_irq_driver);
348 module_init(rt5025_irq_init);
350 static void __exit rt5025_irq_exit(void)
352 platform_driver_unregister(&rt5025_irq_driver);
354 module_exit(rt5025_irq_exit);
356 MODULE_LICENSE("GPL v2");
357 MODULE_AUTHOR("CY Huang <cy_huang@richtek.com");
358 MODULE_DESCRIPTION("IRQ driver for RT5025");
359 MODULE_ALIAS("platform:" RT5025_DEVICE_NAME "-irq");
360 MODULE_VERSION(RT5025_DRV_VER);