1 /* drivers/mfd/rt5033_irq.c
2 * RT5033 Multifunction Device Driver
3 * Charger / Buck / LDOs / FlashLED
5 * Copyright (C) 2013 Richtek Technology Corp.
6 * Author: Patrick Chang <patrick_chang@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; either version 2
11 * of the License, or (at your option) any later version.
13 #include <linux/mfd/rt5033.h>
14 #include <linux/mfd/rt5033_irq.h>
15 #include <linux/gpio.h>
16 #include <linux/device.h>
18 #define ALIAS_NAME "rt5033_mfd_irq"
20 #define RT5033_CHG_IRQ 0x60
21 #define RT5033_LED_IRQ 0x66
22 #define RT5033_PMIC_IRQ 0x68
23 #define RT5033_OFF_EVENT 0x6B
25 #define RT5033_CHG_IRQ_CTRL 0x63
26 #define RT5033_CHG_IRQ1_CTRL RT5033_CHG_IRQ_CTRL
27 #define RT5033_CHG_IRQ2_CTRL (RT5033_CHG_IRQ_CTRL + 1)
28 #define RT5033_CHG_IRQ3_CTRL (RT5033_CHG_IRQ_CTRL + 2)
29 #define RT5033_LED_IRQ_CTRL 0x67
30 #define RT5033_PMIC_IRQ_CTRL 0x69
32 #define IRQ_NAME(irq) [irq] = irq##_NAME
33 static const char *rt5033_irq_names[] = {
34 IRQ_NAME(RT5033_ADPBAD_IRQ),
35 IRQ_NAME(RT5033_PPBATLV_IRQ),
36 IRQ_NAME(RT5033_CHTMRFI_IRQ),
37 IRQ_NAME(RT5033_VINOVPI_IRQ),
38 IRQ_NAME(RT5033_TSDI_IRQ),
39 IRQ_NAME(RT5033_CHMIVRI_IRQ),
40 IRQ_NAME(RT5033_CHTREGI_IRQ),
41 IRQ_NAME(RT5033_IEOC_IRQ),
42 IRQ_NAME(RT5033_CHRCHGI_IRQ),
43 IRQ_NAME(RT5033_CHTERMI_IRQ),
44 IRQ_NAME(RT5033_CHBATOVI_IRQ),
45 IRQ_NAME(RT5033_CHRVPI_IRQ),
46 IRQ_NAME(RT5033_BSTLOWVI_IRQ),
47 IRQ_NAME(RT5033_BSTOLI_IRQ),
48 IRQ_NAME(RT5033_BSTVMIDOVP_IRQ),
49 IRQ_NAME(RT5033_VF_L_IRQ),
50 IRQ_NAME(RT5033_LEDCS2_SHORT_IRQ),
51 IRQ_NAME(RT5033_LEDCS1_SHORT_IRQ),
52 IRQ_NAME(RT5033_BUCK_OCP_IRQ),
53 IRQ_NAME(RT5033_BUCK_LV_IRQ),
54 IRQ_NAME(RT5033_SAFE_LDO_LV_IRQ),
55 IRQ_NAME(RT5033_LDO_LV_IRQ),
56 IRQ_NAME(RT5033_OT_IRQ),
57 IRQ_NAME(RT5033_VDDA_UV_IRQ),
60 const char *rt5033_get_irq_name_by_index(int index)
62 return rt5033_irq_names[index];
64 EXPORT_SYMBOL(rt5033_get_irq_name_by_index);
66 enum RT5033_IRQ_OFFSET {
67 RT5033_CHG_IRQ_OFFSET = 0,
68 RT5033_CHG_IRQ1_OFFSET = 0,
69 RT5033_CHG_IRQ2_OFFSET,
70 RT5033_CHG_IRQ3_OFFSET,
71 RT5033_LED_IRQ_OFFSET,
72 RT5033_PMIC_IRQ_OFFSET,
75 struct rt5033_irq_data {
80 static const u8 rt5033_mask_reg[] = {
88 #define DECLARE_IRQ_CTRL(idx, _offset, _mask) \
89 [(idx)] = { .offset = (_offset), .mask = (_mask) }
91 static const struct rt5033_irq_data rt5033_irqs[] = {
92 DECLARE_IRQ_CTRL(RT5033_ADPBAD_IRQ, 0, 1 << 0),
93 DECLARE_IRQ_CTRL(RT5033_PPBATLV_IRQ, 0, 1 << 4),
94 DECLARE_IRQ_CTRL(RT5033_CHTERMI_IRQ, 0, 1 << 5),
95 DECLARE_IRQ_CTRL(RT5033_VINOVPI_IRQ, 0, 1 << 6),
96 DECLARE_IRQ_CTRL(RT5033_TSDI_IRQ, 0, 1 << 7),
97 DECLARE_IRQ_CTRL(RT5033_CHMIVRI_IRQ, 1, 1 << 0),
98 DECLARE_IRQ_CTRL(RT5033_CHTREGI_IRQ, 1, 1 << 1),
99 DECLARE_IRQ_CTRL(RT5033_CHTMRFI_IRQ, 1, 1 << 2),
100 DECLARE_IRQ_CTRL(RT5033_CHRCHGI_IRQ, 1, 1 << 3),
101 DECLARE_IRQ_CTRL(RT5033_IEOC_IRQ, 1, 1 << 4),
102 DECLARE_IRQ_CTRL(RT5033_CHBATOVI_IRQ, 1, 1 << 5),
103 DECLARE_IRQ_CTRL(RT5033_CHRVPI_IRQ, 1, 1 << 7),
105 DECLARE_IRQ_CTRL(RT5033_BSTLOWVI_IRQ, 2, 1 << 5),
106 DECLARE_IRQ_CTRL(RT5033_BSTOLI_IRQ, 2, 1 << 6),
107 DECLARE_IRQ_CTRL(RT5033_BSTVMIDOVP_IRQ, 2, 1 << 7),
109 DECLARE_IRQ_CTRL(RT5033_VF_L_IRQ, 3, 1 << 3),
110 DECLARE_IRQ_CTRL(RT5033_LEDCS2_SHORT_IRQ, 3, 1 << 6),
111 DECLARE_IRQ_CTRL(RT5033_LEDCS1_SHORT_IRQ, 3, 1 << 7),
113 DECLARE_IRQ_CTRL(RT5033_BUCK_OCP_IRQ, 4, 1 << 2),
114 DECLARE_IRQ_CTRL(RT5033_BUCK_LV_IRQ, 4, 1 << 3),
115 DECLARE_IRQ_CTRL(RT5033_SAFE_LDO_LV_IRQ, 4, 1 << 4),
116 DECLARE_IRQ_CTRL(RT5033_LDO_LV_IRQ, 4, 1 << 5),
117 DECLARE_IRQ_CTRL(RT5033_OT_IRQ, 4, 1 << 6),
118 DECLARE_IRQ_CTRL(RT5033_VDDA_UV_IRQ, 4, 1 << 7),
122 static void rt5033_irq_lock(struct irq_data *data)
124 rt5033_mfd_chip_t *chip = irq_get_chip_data(data->irq);
125 mutex_lock(&chip->irq_lock);
128 static void rt5033_irq_sync_unlock(struct irq_data *data)
130 rt5033_mfd_chip_t *chip = irq_get_chip_data(data->irq);
131 rt5033_block_write_device(chip->i2c_client,
133 RT5033_CHG_IRQ_REGS_NR,
134 chip->irq_masks_cache +
135 RT5033_CHG_IRQ_OFFSET);
137 rt5033_block_write_device(chip->i2c_client,
139 RT5033_LED_IRQ_REGS_NR,
140 chip->irq_masks_cache +
141 RT5033_LED_IRQ_OFFSET);
143 rt5033_block_write_device(chip->i2c_client,
144 RT5033_PMIC_IRQ_CTRL,
145 RT5033_PMIC_IRQ_REGS_NR,
146 chip->irq_masks_cache +
147 RT5033_PMIC_IRQ_OFFSET);
149 mutex_unlock(&chip->irq_lock);
152 static const inline struct rt5033_irq_data *
153 irq_to_rt5033_irq(rt5033_mfd_chip_t *chip, int irq)
155 return &rt5033_irqs[irq - chip->irq_base];
158 static void rt5033_irq_mask(struct irq_data *data)
160 rt5033_mfd_chip_t *chip = irq_get_chip_data(data->irq);
161 const struct rt5033_irq_data *irq_data = irq_to_rt5033_irq(chip,
164 chip->irq_masks_cache[irq_data->offset] |= irq_data->mask;
168 static void rt5033_irq_unmask(struct irq_data *data)
170 rt5033_mfd_chip_t *chip = irq_get_chip_data(data->irq);
171 const struct rt5033_irq_data *irq_data = irq_to_rt5033_irq(chip,
174 chip->irq_masks_cache[irq_data->offset] &= ~irq_data->mask;
177 static struct irq_chip rt5033_irq_chip = {
179 .irq_bus_lock = rt5033_irq_lock,
180 .irq_bus_sync_unlock = rt5033_irq_sync_unlock,
181 .irq_mask = rt5033_irq_mask,
182 .irq_unmask = rt5033_irq_unmask,
185 rt5033_irq_status_t *rt5033_get_irq_status(rt5033_mfd_chip_t *mfd_chip,
186 rt5033_irq_status_sel_t sel)
192 case RT5033_PREV_STATUS:
193 index = mfd_chip->irq_status_index ^ 0x01;
195 case RT5033_NOW_STATUS:
197 index = mfd_chip->irq_status_index;
200 return &mfd_chip->irq_status[index];
202 EXPORT_SYMBOL(rt5033_get_irq_status);
204 static int rt5033_read_irq_status(rt5033_mfd_chip_t *chip)
207 struct i2c_client *iic = chip->i2c_client;
208 rt5033_irq_status_t *now_irq_status;
210 now_irq_status = rt5033_get_irq_status(chip, RT5033_NOW_STATUS);
212 #ifdef CONFIG_CHARGER_RT5033
213 ret = rt5033_block_read_device(iic, RT5033_CHG_IRQ,
214 sizeof(now_irq_status->chg_irq_status),
215 now_irq_status->chg_irq_status);
218 "Failed on reading CHG irq status\n");
222 printk("charger irq = 0x%x 0x%x 0x%x\n", (int)now_irq_status->chg_irq_status[0],
223 (int)now_irq_status->chg_irq_status[1],
224 now_irq_status->chg_irq_status[2]);
226 #ifdef CONFIG_FLED_RT5033
227 ret = rt5033_block_read_device(iic, RT5033_LED_IRQ,
228 sizeof(now_irq_status->fled_irq_status),
229 now_irq_status->fled_irq_status);
232 "Failed on reading FlashLED irq status\n");
235 printk("fled irq = 0x%x\n", (int)now_irq_status->fled_irq_status[0]);
236 #endif /* CONFIG_FLED_RT5033 */
238 #ifdef CONFIG_REGULATOR_RT5033
239 ret = rt5033_block_read_device(iic, RT5033_PMIC_IRQ,
240 sizeof(now_irq_status->pmic_irq_status),
241 now_irq_status->pmic_irq_status);
244 "Failed on reading PMIC irq status\n");
247 printk("regulator irq = 0x%x\n", (int)now_irq_status->pmic_irq_status[0]);
248 #endif /* CONFIG_REGULATOR_RT5033 */
253 static void rt5033_irq_work(rt5033_mfd_chip_t *chip)
257 rt5033_irq_status_t *status;
258 pr_info("%s : handle IRQ event\n", __func__);
259 ret = rt5033_read_irq_status(chip);
261 pr_err("%s :Error : can't read irq status (%d)\n",
265 status = rt5033_get_irq_status(chip, RT5033_NOW_STATUS);
267 for (i = 0; i < RT5033_IRQ_REGS_NR; i++)
268 status->regs[i] &= ~chip->irq_masks_cache[i];
270 for (i = 0; i < RT5033_IRQS_NR; i++) {
271 if (status->regs[rt5033_irqs[i].offset] & rt5033_irqs[i].mask) {
272 pr_info("%s : Trigger IRQ %s, irq : %d \n",
273 __func__, rt5033_get_irq_name_by_index(i),
276 handle_nested_irq(chip->irq_base + i);
280 chip->irq_status_index ^= 0x01; // exchange irq index;
283 static irqreturn_t rt5033_irq_handler(int irq, void *data)
285 rt5033_mfd_chip_t *chip = data;
288 printk("RT5033 IRQ triggered\n");
289 wake_lock_timeout(&chip->irq_wake_lock, msecs_to_jiffies(500));
290 mutex_lock(&chip->suspend_flag_lock);
291 if (chip->suspend_flag) {
292 printk("I2C host controller might not be ready,"
293 " pend this IRQ event...\n");
294 chip->pending_irq = true;
296 rt5033_irq_work(chip);
297 mutex_unlock(&chip->suspend_flag_lock);;
301 static int rt5033_irq_ctrl_regs[] = {
302 RT5033_CHG_IRQ1_CTRL,
303 RT5033_CHG_IRQ2_CTRL,
304 RT5033_CHG_IRQ3_CTRL,
306 RT5033_PMIC_IRQ_CTRL,
309 static uint8_t rt5033_irqs_ctrl_mask_all_val[] = {
317 static int rt5033_mask_all_irqs(struct i2c_client *iic)
322 rt5033_mfd_chip_t *chip = i2c_get_clientdata(iic);
324 for (i = 0; i < ARRAY_SIZE(rt5033_irq_ctrl_regs); i++) {
325 rc = rt5033_reg_write(iic, rt5033_irq_ctrl_regs[i],
326 rt5033_irqs_ctrl_mask_all_val[i]);
327 chip->irq_masks_cache[i] = rt5033_irqs_ctrl_mask_all_val[i];
329 pr_info("Error : can't write reg[0x%x] = 0x%x\n",
330 rt5033_irq_ctrl_regs[i],
331 rt5033_irqs_ctrl_mask_all_val[i]);
339 static int rt5033_irq_init_read(rt5033_mfd_chip_t *chip)
342 ret = rt5033_read_irq_status(chip);
343 chip->irq_status_index ^= 0x01;
348 int rt5033_init_irq(rt5033_mfd_chip_t *chip)
350 int i, ret, curr_irq;
351 ret = rt5033_mask_all_irqs(chip->i2c_client);
354 pr_err("%s : Can't mask all irqs(%d)\n", __func__, ret);
355 goto err_mask_all_irqs;
358 rt5033_irq_init_read(chip);
359 mutex_init(&chip->irq_lock);
361 /* Register with genirq */
362 for (i = 0; i < RT5033_IRQS_NR; i++) {
363 curr_irq = i + chip->irq_base;
364 irq_set_chip_data(curr_irq, chip);
365 irq_set_chip_and_handler(curr_irq, &rt5033_irq_chip,
367 irq_set_nested_thread(curr_irq, 1);
369 set_irq_flags(curr_irq, IRQF_VALID);
371 irq_set_noprobe(curr_irq);
375 ret = gpio_request(chip->pdata->irq_gpio, "rt5033_mfd_irq");
377 pr_err("%s : Request GPIO %d failed\n",
378 __func__, (int)chip->pdata->irq_gpio);
379 goto err_gpio_request;
382 ret = gpio_direction_input(chip->pdata->irq_gpio);
384 pr_err("Set GPIO direction to input : failed\n");
385 goto err_set_gpio_input;
388 chip->irq = gpio_to_irq(chip->pdata->irq_gpio);
389 ret = request_threaded_irq(chip->irq, NULL, rt5033_irq_handler,
390 IRQF_TRIGGER_FALLING | IRQF_ONESHOT | IRQF_NO_SUSPEND,
393 pr_err("%s : Failed : request IRQ (%d)\n", __func__, ret);
394 goto err_request_irq;
398 ret = enable_irq_wake(chip->irq);
400 pr_info("%s : enable_irq_wake(%d) failed for (%d)\n",
401 __func__, chip->irq, ret);
408 gpio_free(chip->pdata->irq_gpio);
410 for (curr_irq = chip->irq_base;
411 curr_irq < chip->irq_base + RT5033_IRQS_NR;
414 set_irq_flags(curr_irq, 0);
416 irq_set_chip_and_handler(curr_irq, NULL, NULL);
417 irq_set_chip_data(curr_irq, NULL);
420 mutex_destroy(&chip->irq_lock);
426 int rt5033_exit_irq(rt5033_mfd_chip_t *chip)
430 for (curr_irq = chip->irq_base;
431 curr_irq < chip->irq_base + RT5033_IRQS_NR;
434 set_irq_flags(curr_irq, 0);
436 irq_set_chip_and_handler(curr_irq, NULL, NULL);
437 irq_set_chip_data(curr_irq, NULL);
441 free_irq(chip->irq, chip);
442 mutex_destroy(&chip->irq_lock);
446 int rt5033_irq_suspend(rt5033_mfd_chip_t *chip)
448 mutex_lock(&chip->suspend_flag_lock);
449 chip->suspend_flag = true;
450 mutex_unlock(&chip->suspend_flag_lock);
453 int rt5033_irq_resume(rt5033_mfd_chip_t *chip)
455 mutex_lock(&chip->suspend_flag_lock);
456 if (chip->pending_irq) {
457 pr_info("%s : there is pending IRQ event\n",
459 rt5033_irq_work(chip);
460 chip->pending_irq = false;
462 chip->suspend_flag = false;
463 mutex_unlock(&chip->suspend_flag_lock);
466 #endif /* CONFIG_PM */