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>
20 #include <linux/gpio.h>
21 #include <linux/irq.h>
22 #include <linux/interrupt.h>
23 #include <linux/workqueue.h>
25 #include <linux/mfd/rt5025.h>
26 #include <linux/mfd/rt5025-irq.h>
28 struct rt5025_irq_info {
29 struct i2c_client *i2c;
31 struct rt5025_chip *chip;
32 struct workqueue_struct *wq;
33 struct rt5025_event_callback *event_cb;
34 struct delayed_work delayed_work;
39 static void rt5025_work_func(struct work_struct *work)
41 struct delayed_work *delayed_work = (struct delayed_work *)container_of(work, struct delayed_work, work);
42 struct rt5025_irq_info *ii = (struct rt5025_irq_info *)container_of(delayed_work, struct rt5025_irq_info, delayed_work);
43 unsigned char irq_stat[10] = {0};
44 uint32_t chg_event = 0, pwr_event = 0;
46 #ifdef CONFIG_POWER_RT5025
47 if (!ii->chip->power_info)
49 queue_delayed_work(ii->wq, &ii->delayed_work, msecs_to_jiffies(1));
54 //if (rt5025_reg_block_read(ii->i2c, RT5025_REG_IRQEN1, 10, irq_stat) >= 0)
56 irq_stat[1] = rt5025_reg_read(ii->i2c, 0x31);
57 irq_stat[3] = rt5025_reg_read(ii->i2c, 0x33);
58 irq_stat[5] = rt5025_reg_read(ii->i2c, 0x35);
59 irq_stat[7] = rt5025_reg_read(ii->i2c, 0x37);
60 irq_stat[9] = rt5025_reg_read(ii->i2c, 0x39);
61 RTINFO("irq1->%02x, irq2->%02x, irq3->%02x\n", irq_stat[1], irq_stat[3], irq_stat[5]);
62 RTINFO("irq4->%02x, irq5->%02x\n", irq_stat[7], irq_stat[9]);
63 RTINFO("stat value = %02x\n", rt5025_reg_read(ii->i2c, RT5025_REG_CHGSTAT));
65 chg_event = irq_stat[1]<<16 | irq_stat[3]<<8 | irq_stat[5];
66 pwr_event = irq_stat[7]<<8 | irq_stat[9];
67 #ifdef CONFIG_POWER_RT5025
68 if (chg_event & CHARGER_DETECT_MASK)
69 rt5025_power_charge_detect(ii->chip->power_info);
70 #endif /* CONFIG_POWER_RT5025 */
74 ii->event_cb->charger_event_callback(chg_event);
76 ii->event_cb->power_event_callkback(pwr_event);
81 dev_err(ii->dev, "read irq stat io fail\n");
85 #ifdef CONFIG_POWER_RT5025
86 rt5025_power_passirq_to_gauge(ii->chip->power_info);
87 #endif /* CONFIG_POWER_RT5025 */
89 //enable_irq(ii->irq);
92 static irqreturn_t rt5025_interrupt(int irqno, void *param)
94 struct rt5025_irq_info *ii = (struct rt5025_irq_info *)param;
96 //disable_irq_nosync(ii->irq);
97 queue_delayed_work(ii->wq, &ii->delayed_work, 0);
101 static int __devinit rt5025_interrupt_init(struct rt5025_irq_info* ii)
106 ii->wq = create_workqueue("rt5025_wq");
107 INIT_DELAYED_WORK(&ii->delayed_work, rt5025_work_func);
110 if (gpio_is_valid(ii->intr_pin))
112 ret = gpio_request(ii->intr_pin, "rt5025_interrupt");
116 ret = gpio_direction_input(ii->intr_pin);
121 if (request_irq(ii->irq, rt5025_interrupt, IRQ_TYPE_EDGE_FALLING|IRQF_DISABLED, "RT5025_IRQ", ii))
123 dev_err(ii->dev, "couldn't allocate IRQ_NO(%d) !\n", ii->irq);
126 enable_irq_wake(ii->irq);
127 queue_delayed_work(ii->wq, &ii->delayed_work, msecs_to_jiffies(100));
130 if (!gpio_get_value(ii->intr_pin))
132 //disable_irq_nosync(ii->irq);
133 queue_delayed_work(ii->wq, &ii->delayed_work, 0);
143 static void __devexit rt5025_interrupt_deinit(struct rt5025_irq_info* ii)
146 free_irq(ii->irq, ii);
150 cancel_delayed_work_sync(&ii->delayed_work);
151 flush_workqueue(ii->wq);
152 destroy_workqueue(ii->wq);
156 static int __devinit rt5025_irq_reg_init(struct rt5025_irq_info* ii, struct rt5025_irq_data* irq_data)
159 // will just enable the interrupt that we want
160 rt5025_reg_write(ii->i2c, RT5025_REG_IRQEN1, irq_data->irq_enable1.val);
161 rt5025_reg_write(ii->i2c, RT5025_REG_IRQEN2, irq_data->irq_enable2.val);
162 rt5025_reg_write(ii->i2c, RT5025_REG_IRQEN3, irq_data->irq_enable3.val);
163 rt5025_reg_write(ii->i2c, RT5025_REG_IRQEN4, irq_data->irq_enable4.val);
164 rt5025_reg_write(ii->i2c, RT5025_REG_IRQEN5, irq_data->irq_enable5.val);
168 static int __devinit rt5025_irq_probe(struct platform_device *pdev)
170 struct rt5025_chip *chip = dev_get_drvdata(pdev->dev.parent);
171 struct rt5025_platform_data *pdata = chip->dev->platform_data;
172 struct rt5025_irq_info *ii;
173 printk("%s,line=%d\n", __func__,__LINE__);
176 ii = kzalloc(sizeof(*ii), GFP_KERNEL);
181 ii->dev = &pdev->dev;
183 ii->intr_pin = pdata->intr_pin;
184 ii->irq = chip->irq;//gpio_to_irq(pdata->intr_pin);
186 ii->event_cb = pdata->cb;
188 rt5025_irq_reg_init(ii, pdata->irq_data);
189 rt5025_interrupt_init(ii);
191 platform_set_drvdata(pdev, ii);
195 static int __devexit rt5025_irq_remove(struct platform_device *pdev)
197 struct rt5025_irq_info *ii = platform_get_drvdata(pdev);
199 rt5025_interrupt_deinit(ii);
200 platform_set_drvdata(pdev, NULL);
204 static struct platform_driver rt5025_irq_driver =
207 .name = RT5025_DEVICE_NAME "-irq",
208 .owner = THIS_MODULE,
210 .probe = rt5025_irq_probe,
211 .remove = __devexit_p(rt5025_irq_remove),
214 static int __init rt5025_irq_init(void)
216 return platform_driver_register(&rt5025_irq_driver);
218 subsys_initcall_sync(rt5025_irq_init);
220 static void __exit rt5025_irq_exit(void)
222 platform_driver_unregister(&rt5025_irq_driver);
224 module_exit(rt5025_irq_exit);
226 MODULE_LICENSE("GPL v2");
227 MODULE_AUTHOR("CY Huang <cy_huang@richtek.com");
228 MODULE_DESCRIPTION("IRQ driver for RT5025");
229 MODULE_ALIAS("platform:" RT5025_DEVICE_NAME "-irq");