rk31:pmu:rt5025:modify some irq error
[firefly-linux-kernel-4.4.55.git] / drivers / mfd / rt5025-irq.c
1 /*
2  *  drivers/mfd/rt5025-irq.c
3  *  Driver foo Richtek RT5025 PMIC irq
4  *
5  *  Copyright (C) 2013 Richtek Electronics
6  *  cy_huang <cy_huang@richtek.com>
7  *
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.
11  */
12
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>
21
22 #include <linux/gpio.h>
23 #include <linux/irq.h>
24 #include <linux/interrupt.h>
25 #include <linux/workqueue.h>
26
27 #include <linux/mfd/rt5025.h>
28 #include <linux/mfd/rt5025-irq.h>
29
30 struct rt5025_irq_info {
31         struct i2c_client *i2c;
32         struct device *dev;
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;
38         int intr_pin;
39         int irq;
40         int suspend;
41         int init_once;
42 };
43
44 static void rt5025_work_func(struct work_struct *work)
45 {
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;
51
52         //Add this to prevent i2c xfer before i2c chip is in suspend mode
53         if (ii->suspend)
54         {
55                 queue_delayed_work(ii->wq, &ii->delayed_work, msecs_to_jiffies(1));
56                 return;
57         }
58
59         #ifdef CONFIG_POWER_RT5025
60         if (!ii->chip->power_info || !ii->chip->jeita_info || !ii->chip->battery_info)
61         {
62                 queue_delayed_work(ii->wq, &ii->delayed_work, msecs_to_jiffies(1));
63                 return;
64         }
65         #endif
66
67         #if 0
68         if (rt5025_reg_block_read(ii->i2c, RT5025_REG_IRQEN1, 10, irq_stat) >= 0)
69         {
70         #endif
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);
78                 #if 0
79                 /* disable all irq enable bit first */
80                 rt5025_reg_write(ii->i2c, RT5025_REG_IRQEN1, irq_enable[0]&RT5025_ADAPIRQ_MASK);
81                 rt5025_reg_write(ii->i2c, RT5025_REG_IRQEN2, 0x00);
82                 rt5025_reg_write(ii->i2c, RT5025_REG_IRQEN3, 0x00);
83                 rt5025_reg_write(ii->i2c, RT5025_REG_IRQEN4, 0x00);
84                 rt5025_reg_write(ii->i2c, RT5025_REG_IRQEN5, 0x00);
85                 rt5025_reg_write(ii->i2c, RT5025_REG_GAUGEIRQEN, 0x00);
86                 #endif //#if 0
87                 /* read irq status bit */
88                 irq_stat[0] = rt5025_reg_read(ii->i2c, RT5025_REG_IRQSTATUS1);
89                 irq_stat[1] = rt5025_reg_read(ii->i2c, RT5025_REG_IRQSTATUS2);
90                 irq_stat[2] = rt5025_reg_read(ii->i2c, RT5025_REG_IRQSTATUS3);
91                 irq_stat[3] = rt5025_reg_read(ii->i2c, RT5025_REG_IRQSTATUS4);
92                 irq_stat[4] = rt5025_reg_read(ii->i2c, RT5025_REG_IRQSTATUS5);
93                 irq_stat[5] = rt5025_reg_read(ii->i2c, RT5025_REG_GAUGEIRQFLG);
94                 RTINFO("irq1->0x%02x, irq2->0x%02x, irq3->0x%02x\n", irq_stat[0], irq_stat[1], irq_stat[2]);
95                 RTINFO("irq4->0x%02x, irq5->0x%02x, irq6->0x%02x\n", irq_stat[3], irq_stat[4], irq_stat[5]);
96                 RTINFO("stat value = %02x\n", rt5025_reg_read(ii->i2c, RT5025_REG_CHGSTAT));
97
98                 chg_event = irq_stat[0]<<16 | irq_stat[1]<<8 | irq_stat[2];
99                 pwr_event = irq_stat[3]<<8 | irq_stat[4];
100                 #ifdef CONFIG_POWER_RT5025
101                 if ((chg_event & CHARGER_DETECT_MASK))
102                 {
103                         if (chg_event & CHG_EVENT_CHTERMI)
104                         {
105                                 ii->chip->power_info->chg_term++;
106                                 if (ii->chip->power_info->chg_term > 3)
107                                         ii->chip->power_info->chg_term = 4;
108                         }
109
110                         if (chg_event & CHG_EVENT_CHRCHGI)
111                                 ii->chip->power_info->chg_term = 0;
112
113                         if (chg_event & (CHG_EVENT_CHSLPI_INAC | CHG_EVENT_CHSLPI_INUSB))
114                         {
115                                 ii->chip->power_info->chg_term = 0;
116                         }
117
118                         if (chg_event & (CHG_EVENT_INAC_PLUGIN | CHG_EVENT_INUSB_PLUGIN))
119                         {
120                                 if (!ii->init_once)
121                                 {
122                                         rt5025_set_charging_buck(ii->i2c, 0);
123                                         mdelay(50);
124                                         rt5025_set_charging_buck(ii->i2c, 1);
125                                         mdelay(100);
126                                         rt5025_set_charging_buck(ii->i2c, 0);
127                                         mdelay(50);
128                                         rt5025_set_charging_buck(ii->i2c, 1);
129                                         mdelay(400);
130                                 }
131                         }
132
133                         if (ii->chip->power_info->chg_term <= 3)
134                                 rt5025_power_charge_detect(ii->chip->power_info);
135
136                 }
137                 #endif /* CONFIG_POWER_RT5025 */
138                 if (ii->event_cb)
139                 {
140                         if (chg_event)
141                                 ii->event_cb->charger_event_callback(chg_event);
142                         if (pwr_event)
143                                 ii->event_cb->power_event_callkback(pwr_event);
144                 }
145         #if 0
146         }
147         else
148                 dev_err(ii->dev, "read irq stat io fail\n");
149         #endif
150         
151
152         #ifdef CONFIG_POWER_RT5025
153         if (irq_stat[5] & RT5025_FLG_TEMP)
154                 rt5025_swjeita_irq_handler(ii->chip->jeita_info, irq_stat[5] & RT5025_FLG_TEMP);
155         if (irq_stat[5] & RT5025_FLG_VOLT)
156                 rt5025_gauge_irq_handler(ii->chip->battery_info, irq_stat[5] & RT5025_FLG_VOLT);
157         #endif /* CONFIG_POWER_RT5025 */
158
159         if (ii->init_once)
160                 ii->init_once = 0;
161
162         #if 0
163         /* restore all irq enable bit */
164         rt5025_reg_write(ii->i2c, RT5025_REG_IRQEN1, irq_enable[0]);
165         rt5025_reg_write(ii->i2c, RT5025_REG_IRQEN2, irq_enable[1]);
166         rt5025_reg_write(ii->i2c, RT5025_REG_IRQEN3, irq_enable[2]);
167         rt5025_reg_write(ii->i2c, RT5025_REG_IRQEN4, irq_enable[3]);
168         rt5025_reg_write(ii->i2c, RT5025_REG_IRQEN5, irq_enable[4]);
169         if (rt5025_reg_read(ii->i2c, RT5025_REG_GAUGEIRQEN) == 0)
170                 rt5025_reg_write(ii->i2c, RT5025_REG_GAUGEIRQEN, irq_enable[5]);
171         #endif //#if 0
172
173         //enable_irq(ii->irq);
174 }
175
176 static irqreturn_t rt5025_interrupt(int irqno, void *param)
177 {
178         struct rt5025_irq_info *ii = (struct rt5025_irq_info *)param;
179
180         //disable_irq_nosync(ii->irq);
181         wake_lock_timeout(&ii->irq_wake_lock, 1*HZ);
182         queue_delayed_work(ii->wq, &ii->delayed_work, 0);
183         return IRQ_HANDLED;
184 }
185
186 static int __devinit rt5025_interrupt_init(struct rt5025_irq_info* ii)
187 {
188         int ret = 0;
189
190         RTINFO("\n");
191         ii->wq = create_workqueue("rt5025_wq");
192         INIT_DELAYED_WORK(&ii->delayed_work, rt5025_work_func);
193
194         #if 0
195         if (gpio_is_valid(ii->intr_pin))
196         {
197                 ret = gpio_request(ii->intr_pin, "rt5025_interrupt");
198                 if (ret)
199                         return ret;
200
201                 ret = gpio_direction_input(ii->intr_pin);
202                 if (ret)
203                         return ret;
204         #endif
205
206                 if (request_irq(ii->irq, rt5025_interrupt, IRQ_TYPE_EDGE_FALLING|IRQF_DISABLED, "RT5025_IRQ", ii))
207                 {
208                         dev_err(ii->dev, "couldn't allocate IRQ_NO(%d) !\n", ii->irq);
209                         return -EINVAL;
210                 }
211                 enable_irq_wake(ii->irq);
212                 queue_delayed_work(ii->wq, &ii->delayed_work, msecs_to_jiffies(100));
213         #if 0
214
215                 if (!gpio_get_value(ii->intr_pin))
216                 {
217                         //disable_irq_nosync(ii->irq);
218                         queue_delayed_work(ii->wq, &ii->delayed_work, 0);
219                 }
220         }
221         else
222                 return -EINVAL;
223         #endif
224
225         return ret;
226 }
227
228 static void __devexit rt5025_interrupt_deinit(struct rt5025_irq_info* ii)
229 {
230         if (ii->irq)
231                 free_irq(ii->irq, ii);
232
233         if (ii->wq)
234         {
235                 cancel_delayed_work_sync(&ii->delayed_work);
236                 flush_workqueue(ii->wq);
237                 destroy_workqueue(ii->wq);
238         }
239 }
240
241 static int __devinit rt5025_irq_reg_init(struct rt5025_irq_info* ii, struct rt5025_irq_data* irq_data)
242 {
243         RTINFO("\n");
244         // will just enable the interrupt that we want
245         rt5025_reg_write(ii->i2c, RT5025_REG_IRQEN1, irq_data->irq_enable1.val);
246         rt5025_reg_write(ii->i2c, RT5025_REG_IRQEN2, irq_data->irq_enable2.val);
247         rt5025_reg_write(ii->i2c, RT5025_REG_IRQEN3, irq_data->irq_enable3.val);
248         rt5025_reg_write(ii->i2c, RT5025_REG_IRQEN4, irq_data->irq_enable4.val);
249         rt5025_reg_write(ii->i2c, RT5025_REG_IRQEN5, irq_data->irq_enable5.val);
250         return 0;
251 }
252
253 static int __devinit rt5025_irq_probe(struct platform_device *pdev)
254 {
255         struct rt5025_chip *chip = dev_get_drvdata(pdev->dev.parent);
256         struct rt5025_platform_data *pdata = chip->dev->platform_data;
257         struct rt5025_irq_info *ii;
258
259         RTINFO("\n");
260         ii = kzalloc(sizeof(*ii), GFP_KERNEL);
261         if (!ii)
262                 return -ENOMEM;
263
264         ii->i2c = chip->i2c;
265         ii->dev = &pdev->dev;
266         ii->chip = chip;
267         ii->intr_pin = pdata->intr_pin;
268         ii->irq = chip->irq;//gpio_to_irq(pdata->intr_pin);
269         if (pdata->cb)
270                 ii->event_cb = pdata->cb;
271         wake_lock_init(&ii->irq_wake_lock, WAKE_LOCK_SUSPEND, "rt_irq_wake");
272         ii->init_once = 1;
273
274         rt5025_irq_reg_init(ii, pdata->irq_data);
275         rt5025_interrupt_init(ii);
276
277         platform_set_drvdata(pdev, ii);
278         RTINFO("\n");
279         return 0;
280 }
281
282 static int __devexit rt5025_irq_remove(struct platform_device *pdev)
283 {
284         struct rt5025_irq_info *ii = platform_get_drvdata(pdev);
285
286         wake_lock_destroy(&ii->irq_wake_lock);
287         rt5025_interrupt_deinit(ii);
288         platform_set_drvdata(pdev, NULL);
289         kfree(ii);
290         RTINFO("\n");
291         return 0;
292 }
293
294 static void rt5025_irq_shutdown(struct platform_device *pdev)
295 {
296         struct rt5025_irq_info *ii = platform_get_drvdata(pdev);
297
298         if (ii->irq)
299                 free_irq(ii->irq, ii);
300
301         if (ii->wq)
302         {
303                 cancel_delayed_work_sync(&ii->delayed_work);
304                 flush_workqueue(ii->wq);
305         }
306         RTINFO("\n");
307 }
308
309 static int rt5025_irq_suspend(struct platform_device *pdev, pm_message_t state)
310 {
311         struct rt5025_irq_info *ii = platform_get_drvdata(pdev);
312
313         RTINFO("\n");
314         ii->suspend = 1;
315         return 0;
316 }
317
318 static int rt5025_irq_resume(struct platform_device *pdev)
319 {
320         struct rt5025_irq_info *ii = platform_get_drvdata(pdev);
321
322         RTINFO("\n");
323         ii->suspend = 0;
324         return 0;
325 }
326
327 static struct platform_driver rt5025_irq_driver = 
328 {
329         .driver = {
330                 .name = RT5025_DEVICE_NAME "-irq",
331                 .owner = THIS_MODULE,
332         },
333         .probe = rt5025_irq_probe,
334         .remove = __devexit_p(rt5025_irq_remove),
335         .shutdown = rt5025_irq_shutdown,
336         .suspend = rt5025_irq_suspend,
337         .resume = rt5025_irq_resume,
338 };
339
340 static int __init rt5025_irq_init(void)
341 {
342         return platform_driver_register(&rt5025_irq_driver);
343 }
344 module_init(rt5025_irq_init);
345
346 static void __exit rt5025_irq_exit(void)
347 {
348         platform_driver_unregister(&rt5025_irq_driver);
349 }
350 module_exit(rt5025_irq_exit);
351
352 MODULE_LICENSE("GPL v2");
353 MODULE_AUTHOR("CY Huang <cy_huang@richtek.com");
354 MODULE_DESCRIPTION("IRQ driver for RT5025");
355 MODULE_ALIAS("platform:" RT5025_DEVICE_NAME "-irq");
356 MODULE_VERSION(RT5025_DRV_VER);