xref: /openbmc/linux/drivers/mfd/mt6358-irq.c (revision dc0c386e)
12b91c28fSHsin-Hsiung Wang // SPDX-License-Identifier: GPL-2.0
22b91c28fSHsin-Hsiung Wang //
32b91c28fSHsin-Hsiung Wang // Copyright (c) 2020 MediaTek Inc.
42b91c28fSHsin-Hsiung Wang 
52b91c28fSHsin-Hsiung Wang #include <linux/interrupt.h>
6*dc0c386eSRob Herring #include <linux/irq.h>
7*dc0c386eSRob Herring #include <linux/irqdomain.h>
8738654beSFabien Parent #include <linux/mfd/mt6357/core.h>
9738654beSFabien Parent #include <linux/mfd/mt6357/registers.h>
102b91c28fSHsin-Hsiung Wang #include <linux/mfd/mt6358/core.h>
112b91c28fSHsin-Hsiung Wang #include <linux/mfd/mt6358/registers.h>
12e545b8f3SHsin-Hsiung Wang #include <linux/mfd/mt6359/core.h>
13e545b8f3SHsin-Hsiung Wang #include <linux/mfd/mt6359/registers.h>
142b91c28fSHsin-Hsiung Wang #include <linux/mfd/mt6397/core.h>
152b91c28fSHsin-Hsiung Wang #include <linux/module.h>
162b91c28fSHsin-Hsiung Wang #include <linux/platform_device.h>
172b91c28fSHsin-Hsiung Wang #include <linux/regmap.h>
182b91c28fSHsin-Hsiung Wang 
19d8570c18SHsin-Hsiung Wang #define MTK_PMIC_REG_WIDTH 16
20d8570c18SHsin-Hsiung Wang 
21738654beSFabien Parent static const struct irq_top_t mt6357_ints[] = {
22738654beSFabien Parent 	MT6357_TOP_GEN(BUCK),
23738654beSFabien Parent 	MT6357_TOP_GEN(LDO),
24738654beSFabien Parent 	MT6357_TOP_GEN(PSC),
25738654beSFabien Parent 	MT6357_TOP_GEN(SCK),
26738654beSFabien Parent 	MT6357_TOP_GEN(BM),
27738654beSFabien Parent 	MT6357_TOP_GEN(HK),
28738654beSFabien Parent 	MT6357_TOP_GEN(AUD),
29738654beSFabien Parent 	MT6357_TOP_GEN(MISC),
30738654beSFabien Parent };
31738654beSFabien Parent 
32d8570c18SHsin-Hsiung Wang static const struct irq_top_t mt6358_ints[] = {
332b91c28fSHsin-Hsiung Wang 	MT6358_TOP_GEN(BUCK),
342b91c28fSHsin-Hsiung Wang 	MT6358_TOP_GEN(LDO),
352b91c28fSHsin-Hsiung Wang 	MT6358_TOP_GEN(PSC),
362b91c28fSHsin-Hsiung Wang 	MT6358_TOP_GEN(SCK),
372b91c28fSHsin-Hsiung Wang 	MT6358_TOP_GEN(BM),
382b91c28fSHsin-Hsiung Wang 	MT6358_TOP_GEN(HK),
392b91c28fSHsin-Hsiung Wang 	MT6358_TOP_GEN(AUD),
402b91c28fSHsin-Hsiung Wang 	MT6358_TOP_GEN(MISC),
412b91c28fSHsin-Hsiung Wang };
422b91c28fSHsin-Hsiung Wang 
43e545b8f3SHsin-Hsiung Wang static const struct irq_top_t mt6359_ints[] = {
44e545b8f3SHsin-Hsiung Wang 	MT6359_TOP_GEN(BUCK),
45e545b8f3SHsin-Hsiung Wang 	MT6359_TOP_GEN(LDO),
46e545b8f3SHsin-Hsiung Wang 	MT6359_TOP_GEN(PSC),
47e545b8f3SHsin-Hsiung Wang 	MT6359_TOP_GEN(SCK),
48e545b8f3SHsin-Hsiung Wang 	MT6359_TOP_GEN(BM),
49e545b8f3SHsin-Hsiung Wang 	MT6359_TOP_GEN(HK),
50e545b8f3SHsin-Hsiung Wang 	MT6359_TOP_GEN(AUD),
51e545b8f3SHsin-Hsiung Wang 	MT6359_TOP_GEN(MISC),
52e545b8f3SHsin-Hsiung Wang };
53e545b8f3SHsin-Hsiung Wang 
54738654beSFabien Parent static struct pmic_irq_data mt6357_irqd = {
55738654beSFabien Parent 	.num_top = ARRAY_SIZE(mt6357_ints),
56738654beSFabien Parent 	.num_pmic_irqs = MT6357_IRQ_NR,
57738654beSFabien Parent 	.top_int_status_reg = MT6357_TOP_INT_STATUS0,
58738654beSFabien Parent 	.pmic_ints = mt6357_ints,
59738654beSFabien Parent };
60738654beSFabien Parent 
61d8570c18SHsin-Hsiung Wang static struct pmic_irq_data mt6358_irqd = {
62d8570c18SHsin-Hsiung Wang 	.num_top = ARRAY_SIZE(mt6358_ints),
63d8570c18SHsin-Hsiung Wang 	.num_pmic_irqs = MT6358_IRQ_NR,
64d8570c18SHsin-Hsiung Wang 	.top_int_status_reg = MT6358_TOP_INT_STATUS0,
65d8570c18SHsin-Hsiung Wang 	.pmic_ints = mt6358_ints,
66d8570c18SHsin-Hsiung Wang };
67d8570c18SHsin-Hsiung Wang 
68e545b8f3SHsin-Hsiung Wang static struct pmic_irq_data mt6359_irqd = {
69e545b8f3SHsin-Hsiung Wang 	.num_top = ARRAY_SIZE(mt6359_ints),
70e545b8f3SHsin-Hsiung Wang 	.num_pmic_irqs = MT6359_IRQ_NR,
71e545b8f3SHsin-Hsiung Wang 	.top_int_status_reg = MT6359_TOP_INT_STATUS0,
72e545b8f3SHsin-Hsiung Wang 	.pmic_ints = mt6359_ints,
73e545b8f3SHsin-Hsiung Wang };
74e545b8f3SHsin-Hsiung Wang 
pmic_irq_enable(struct irq_data * data)752b91c28fSHsin-Hsiung Wang static void pmic_irq_enable(struct irq_data *data)
762b91c28fSHsin-Hsiung Wang {
772b91c28fSHsin-Hsiung Wang 	unsigned int hwirq = irqd_to_hwirq(data);
782b91c28fSHsin-Hsiung Wang 	struct mt6397_chip *chip = irq_data_get_irq_chip_data(data);
792b91c28fSHsin-Hsiung Wang 	struct pmic_irq_data *irqd = chip->irq_data;
802b91c28fSHsin-Hsiung Wang 
812b91c28fSHsin-Hsiung Wang 	irqd->enable_hwirq[hwirq] = true;
822b91c28fSHsin-Hsiung Wang }
832b91c28fSHsin-Hsiung Wang 
pmic_irq_disable(struct irq_data * data)842b91c28fSHsin-Hsiung Wang static void pmic_irq_disable(struct irq_data *data)
852b91c28fSHsin-Hsiung Wang {
862b91c28fSHsin-Hsiung Wang 	unsigned int hwirq = irqd_to_hwirq(data);
872b91c28fSHsin-Hsiung Wang 	struct mt6397_chip *chip = irq_data_get_irq_chip_data(data);
882b91c28fSHsin-Hsiung Wang 	struct pmic_irq_data *irqd = chip->irq_data;
892b91c28fSHsin-Hsiung Wang 
902b91c28fSHsin-Hsiung Wang 	irqd->enable_hwirq[hwirq] = false;
912b91c28fSHsin-Hsiung Wang }
922b91c28fSHsin-Hsiung Wang 
pmic_irq_lock(struct irq_data * data)932b91c28fSHsin-Hsiung Wang static void pmic_irq_lock(struct irq_data *data)
942b91c28fSHsin-Hsiung Wang {
952b91c28fSHsin-Hsiung Wang 	struct mt6397_chip *chip = irq_data_get_irq_chip_data(data);
962b91c28fSHsin-Hsiung Wang 
972b91c28fSHsin-Hsiung Wang 	mutex_lock(&chip->irqlock);
982b91c28fSHsin-Hsiung Wang }
992b91c28fSHsin-Hsiung Wang 
pmic_irq_sync_unlock(struct irq_data * data)1002b91c28fSHsin-Hsiung Wang static void pmic_irq_sync_unlock(struct irq_data *data)
1012b91c28fSHsin-Hsiung Wang {
1022b91c28fSHsin-Hsiung Wang 	unsigned int i, top_gp, gp_offset, en_reg, int_regs, shift;
1032b91c28fSHsin-Hsiung Wang 	struct mt6397_chip *chip = irq_data_get_irq_chip_data(data);
1042b91c28fSHsin-Hsiung Wang 	struct pmic_irq_data *irqd = chip->irq_data;
1052b91c28fSHsin-Hsiung Wang 
1062b91c28fSHsin-Hsiung Wang 	for (i = 0; i < irqd->num_pmic_irqs; i++) {
1072b91c28fSHsin-Hsiung Wang 		if (irqd->enable_hwirq[i] == irqd->cache_hwirq[i])
1082b91c28fSHsin-Hsiung Wang 			continue;
1092b91c28fSHsin-Hsiung Wang 
1102b91c28fSHsin-Hsiung Wang 		/* Find out the IRQ group */
1112b91c28fSHsin-Hsiung Wang 		top_gp = 0;
1122b91c28fSHsin-Hsiung Wang 		while ((top_gp + 1) < irqd->num_top &&
113d8570c18SHsin-Hsiung Wang 		       i >= irqd->pmic_ints[top_gp + 1].hwirq_base)
1142b91c28fSHsin-Hsiung Wang 			top_gp++;
1152b91c28fSHsin-Hsiung Wang 
1162b91c28fSHsin-Hsiung Wang 		/* Find the IRQ registers */
117d8570c18SHsin-Hsiung Wang 		gp_offset = i - irqd->pmic_ints[top_gp].hwirq_base;
118d8570c18SHsin-Hsiung Wang 		int_regs = gp_offset / MTK_PMIC_REG_WIDTH;
119d8570c18SHsin-Hsiung Wang 		shift = gp_offset % MTK_PMIC_REG_WIDTH;
120d8570c18SHsin-Hsiung Wang 		en_reg = irqd->pmic_ints[top_gp].en_reg +
121d8570c18SHsin-Hsiung Wang 			 (irqd->pmic_ints[top_gp].en_reg_shift * int_regs);
1222b91c28fSHsin-Hsiung Wang 
1232b91c28fSHsin-Hsiung Wang 		regmap_update_bits(chip->regmap, en_reg, BIT(shift),
1242b91c28fSHsin-Hsiung Wang 				   irqd->enable_hwirq[i] << shift);
1252b91c28fSHsin-Hsiung Wang 
1262b91c28fSHsin-Hsiung Wang 		irqd->cache_hwirq[i] = irqd->enable_hwirq[i];
1272b91c28fSHsin-Hsiung Wang 	}
1282b91c28fSHsin-Hsiung Wang 	mutex_unlock(&chip->irqlock);
1292b91c28fSHsin-Hsiung Wang }
1302b91c28fSHsin-Hsiung Wang 
1312b91c28fSHsin-Hsiung Wang static struct irq_chip mt6358_irq_chip = {
1322b91c28fSHsin-Hsiung Wang 	.name = "mt6358-irq",
1332b91c28fSHsin-Hsiung Wang 	.flags = IRQCHIP_SKIP_SET_WAKE,
1342b91c28fSHsin-Hsiung Wang 	.irq_enable = pmic_irq_enable,
1352b91c28fSHsin-Hsiung Wang 	.irq_disable = pmic_irq_disable,
1362b91c28fSHsin-Hsiung Wang 	.irq_bus_lock = pmic_irq_lock,
1372b91c28fSHsin-Hsiung Wang 	.irq_bus_sync_unlock = pmic_irq_sync_unlock,
1382b91c28fSHsin-Hsiung Wang };
1392b91c28fSHsin-Hsiung Wang 
mt6358_irq_sp_handler(struct mt6397_chip * chip,unsigned int top_gp)1402b91c28fSHsin-Hsiung Wang static void mt6358_irq_sp_handler(struct mt6397_chip *chip,
1412b91c28fSHsin-Hsiung Wang 				  unsigned int top_gp)
1422b91c28fSHsin-Hsiung Wang {
1432b91c28fSHsin-Hsiung Wang 	unsigned int irq_status, sta_reg, status;
1442b91c28fSHsin-Hsiung Wang 	unsigned int hwirq, virq;
1452b91c28fSHsin-Hsiung Wang 	int i, j, ret;
146d8570c18SHsin-Hsiung Wang 	struct pmic_irq_data *irqd = chip->irq_data;
1472b91c28fSHsin-Hsiung Wang 
148d8570c18SHsin-Hsiung Wang 	for (i = 0; i < irqd->pmic_ints[top_gp].num_int_regs; i++) {
149d8570c18SHsin-Hsiung Wang 		sta_reg = irqd->pmic_ints[top_gp].sta_reg +
150d8570c18SHsin-Hsiung Wang 			irqd->pmic_ints[top_gp].sta_reg_shift * i;
1512b91c28fSHsin-Hsiung Wang 
1522b91c28fSHsin-Hsiung Wang 		ret = regmap_read(chip->regmap, sta_reg, &irq_status);
1532b91c28fSHsin-Hsiung Wang 		if (ret) {
1542b91c28fSHsin-Hsiung Wang 			dev_err(chip->dev,
1552b91c28fSHsin-Hsiung Wang 				"Failed to read IRQ status, ret=%d\n", ret);
1562b91c28fSHsin-Hsiung Wang 			return;
1572b91c28fSHsin-Hsiung Wang 		}
1582b91c28fSHsin-Hsiung Wang 
1592b91c28fSHsin-Hsiung Wang 		if (!irq_status)
1602b91c28fSHsin-Hsiung Wang 			continue;
1612b91c28fSHsin-Hsiung Wang 
1622b91c28fSHsin-Hsiung Wang 		status = irq_status;
1632b91c28fSHsin-Hsiung Wang 		do {
1642b91c28fSHsin-Hsiung Wang 			j = __ffs(status);
1652b91c28fSHsin-Hsiung Wang 
166d8570c18SHsin-Hsiung Wang 			hwirq = irqd->pmic_ints[top_gp].hwirq_base +
167d8570c18SHsin-Hsiung Wang 				MTK_PMIC_REG_WIDTH * i + j;
1682b91c28fSHsin-Hsiung Wang 
1692b91c28fSHsin-Hsiung Wang 			virq = irq_find_mapping(chip->irq_domain, hwirq);
1702b91c28fSHsin-Hsiung Wang 			if (virq)
1712b91c28fSHsin-Hsiung Wang 				handle_nested_irq(virq);
1722b91c28fSHsin-Hsiung Wang 
1732b91c28fSHsin-Hsiung Wang 			status &= ~BIT(j);
1742b91c28fSHsin-Hsiung Wang 		} while (status);
1752b91c28fSHsin-Hsiung Wang 
1762b91c28fSHsin-Hsiung Wang 		regmap_write(chip->regmap, sta_reg, irq_status);
1772b91c28fSHsin-Hsiung Wang 	}
1782b91c28fSHsin-Hsiung Wang }
1792b91c28fSHsin-Hsiung Wang 
mt6358_irq_handler(int irq,void * data)1802b91c28fSHsin-Hsiung Wang static irqreturn_t mt6358_irq_handler(int irq, void *data)
1812b91c28fSHsin-Hsiung Wang {
1822b91c28fSHsin-Hsiung Wang 	struct mt6397_chip *chip = data;
183d8570c18SHsin-Hsiung Wang 	struct pmic_irq_data *irqd = chip->irq_data;
1842b91c28fSHsin-Hsiung Wang 	unsigned int bit, i, top_irq_status = 0;
1852b91c28fSHsin-Hsiung Wang 	int ret;
1862b91c28fSHsin-Hsiung Wang 
1872b91c28fSHsin-Hsiung Wang 	ret = regmap_read(chip->regmap,
188d8570c18SHsin-Hsiung Wang 			  irqd->top_int_status_reg,
1892b91c28fSHsin-Hsiung Wang 			  &top_irq_status);
1902b91c28fSHsin-Hsiung Wang 	if (ret) {
1912b91c28fSHsin-Hsiung Wang 		dev_err(chip->dev,
1922b91c28fSHsin-Hsiung Wang 			"Failed to read status from the device, ret=%d\n", ret);
1932b91c28fSHsin-Hsiung Wang 		return IRQ_NONE;
1942b91c28fSHsin-Hsiung Wang 	}
1952b91c28fSHsin-Hsiung Wang 
196d8570c18SHsin-Hsiung Wang 	for (i = 0; i < irqd->num_top; i++) {
197d8570c18SHsin-Hsiung Wang 		bit = BIT(irqd->pmic_ints[i].top_offset);
1982b91c28fSHsin-Hsiung Wang 		if (top_irq_status & bit) {
1992b91c28fSHsin-Hsiung Wang 			mt6358_irq_sp_handler(chip, i);
2002b91c28fSHsin-Hsiung Wang 			top_irq_status &= ~bit;
2012b91c28fSHsin-Hsiung Wang 			if (!top_irq_status)
2022b91c28fSHsin-Hsiung Wang 				break;
2032b91c28fSHsin-Hsiung Wang 		}
2042b91c28fSHsin-Hsiung Wang 	}
2052b91c28fSHsin-Hsiung Wang 
2062b91c28fSHsin-Hsiung Wang 	return IRQ_HANDLED;
2072b91c28fSHsin-Hsiung Wang }
2082b91c28fSHsin-Hsiung Wang 
pmic_irq_domain_map(struct irq_domain * d,unsigned int irq,irq_hw_number_t hw)2092b91c28fSHsin-Hsiung Wang static int pmic_irq_domain_map(struct irq_domain *d, unsigned int irq,
2102b91c28fSHsin-Hsiung Wang 			       irq_hw_number_t hw)
2112b91c28fSHsin-Hsiung Wang {
2122b91c28fSHsin-Hsiung Wang 	struct mt6397_chip *mt6397 = d->host_data;
2132b91c28fSHsin-Hsiung Wang 
2142b91c28fSHsin-Hsiung Wang 	irq_set_chip_data(irq, mt6397);
2152b91c28fSHsin-Hsiung Wang 	irq_set_chip_and_handler(irq, &mt6358_irq_chip, handle_level_irq);
2162b91c28fSHsin-Hsiung Wang 	irq_set_nested_thread(irq, 1);
2172b91c28fSHsin-Hsiung Wang 	irq_set_noprobe(irq);
2182b91c28fSHsin-Hsiung Wang 
2192b91c28fSHsin-Hsiung Wang 	return 0;
2202b91c28fSHsin-Hsiung Wang }
2212b91c28fSHsin-Hsiung Wang 
2222b91c28fSHsin-Hsiung Wang static const struct irq_domain_ops mt6358_irq_domain_ops = {
2232b91c28fSHsin-Hsiung Wang 	.map = pmic_irq_domain_map,
2242b91c28fSHsin-Hsiung Wang 	.xlate = irq_domain_xlate_twocell,
2252b91c28fSHsin-Hsiung Wang };
2262b91c28fSHsin-Hsiung Wang 
mt6358_irq_init(struct mt6397_chip * chip)2272b91c28fSHsin-Hsiung Wang int mt6358_irq_init(struct mt6397_chip *chip)
2282b91c28fSHsin-Hsiung Wang {
2292b91c28fSHsin-Hsiung Wang 	int i, j, ret;
2302b91c28fSHsin-Hsiung Wang 	struct pmic_irq_data *irqd;
2312b91c28fSHsin-Hsiung Wang 
232d8570c18SHsin-Hsiung Wang 	switch (chip->chip_id) {
233738654beSFabien Parent 	case MT6357_CHIP_ID:
234738654beSFabien Parent 		chip->irq_data = &mt6357_irqd;
235738654beSFabien Parent 		break;
236738654beSFabien Parent 
237d8570c18SHsin-Hsiung Wang 	case MT6358_CHIP_ID:
238c47383f8SJohnson Wang 	case MT6366_CHIP_ID:
239d8570c18SHsin-Hsiung Wang 		chip->irq_data = &mt6358_irqd;
240d8570c18SHsin-Hsiung Wang 		break;
2412b91c28fSHsin-Hsiung Wang 
242e545b8f3SHsin-Hsiung Wang 	case MT6359_CHIP_ID:
243e545b8f3SHsin-Hsiung Wang 		chip->irq_data = &mt6359_irqd;
244e545b8f3SHsin-Hsiung Wang 		break;
245e545b8f3SHsin-Hsiung Wang 
246d8570c18SHsin-Hsiung Wang 	default:
247d8570c18SHsin-Hsiung Wang 		dev_err(chip->dev, "unsupported chip: 0x%x\n", chip->chip_id);
248d8570c18SHsin-Hsiung Wang 		return -ENODEV;
249d8570c18SHsin-Hsiung Wang 	}
2502b91c28fSHsin-Hsiung Wang 
2512b91c28fSHsin-Hsiung Wang 	mutex_init(&chip->irqlock);
252d8570c18SHsin-Hsiung Wang 	irqd = chip->irq_data;
2532b91c28fSHsin-Hsiung Wang 	irqd->enable_hwirq = devm_kcalloc(chip->dev,
2542b91c28fSHsin-Hsiung Wang 					  irqd->num_pmic_irqs,
2552b91c28fSHsin-Hsiung Wang 					  sizeof(*irqd->enable_hwirq),
2562b91c28fSHsin-Hsiung Wang 					  GFP_KERNEL);
2572b91c28fSHsin-Hsiung Wang 	if (!irqd->enable_hwirq)
2582b91c28fSHsin-Hsiung Wang 		return -ENOMEM;
2592b91c28fSHsin-Hsiung Wang 
2602b91c28fSHsin-Hsiung Wang 	irqd->cache_hwirq = devm_kcalloc(chip->dev,
2612b91c28fSHsin-Hsiung Wang 					 irqd->num_pmic_irqs,
2622b91c28fSHsin-Hsiung Wang 					 sizeof(*irqd->cache_hwirq),
2632b91c28fSHsin-Hsiung Wang 					 GFP_KERNEL);
2642b91c28fSHsin-Hsiung Wang 	if (!irqd->cache_hwirq)
2652b91c28fSHsin-Hsiung Wang 		return -ENOMEM;
2662b91c28fSHsin-Hsiung Wang 
2672b91c28fSHsin-Hsiung Wang 	/* Disable all interrupts for initializing */
2682b91c28fSHsin-Hsiung Wang 	for (i = 0; i < irqd->num_top; i++) {
269d8570c18SHsin-Hsiung Wang 		for (j = 0; j < irqd->pmic_ints[i].num_int_regs; j++)
2702b91c28fSHsin-Hsiung Wang 			regmap_write(chip->regmap,
271d8570c18SHsin-Hsiung Wang 				     irqd->pmic_ints[i].en_reg +
272d8570c18SHsin-Hsiung Wang 				     irqd->pmic_ints[i].en_reg_shift * j, 0);
2732b91c28fSHsin-Hsiung Wang 	}
2742b91c28fSHsin-Hsiung Wang 
2752b91c28fSHsin-Hsiung Wang 	chip->irq_domain = irq_domain_add_linear(chip->dev->of_node,
2762b91c28fSHsin-Hsiung Wang 						 irqd->num_pmic_irqs,
2772b91c28fSHsin-Hsiung Wang 						 &mt6358_irq_domain_ops, chip);
2782b91c28fSHsin-Hsiung Wang 	if (!chip->irq_domain) {
2792b91c28fSHsin-Hsiung Wang 		dev_err(chip->dev, "Could not create IRQ domain\n");
2802b91c28fSHsin-Hsiung Wang 		return -ENODEV;
2812b91c28fSHsin-Hsiung Wang 	}
2822b91c28fSHsin-Hsiung Wang 
2832b91c28fSHsin-Hsiung Wang 	ret = devm_request_threaded_irq(chip->dev, chip->irq, NULL,
2842b91c28fSHsin-Hsiung Wang 					mt6358_irq_handler, IRQF_ONESHOT,
2852b91c28fSHsin-Hsiung Wang 					mt6358_irq_chip.name, chip);
2862b91c28fSHsin-Hsiung Wang 	if (ret) {
2872b91c28fSHsin-Hsiung Wang 		dev_err(chip->dev, "Failed to register IRQ=%d, ret=%d\n",
2882b91c28fSHsin-Hsiung Wang 			chip->irq, ret);
2892b91c28fSHsin-Hsiung Wang 		return ret;
2902b91c28fSHsin-Hsiung Wang 	}
2912b91c28fSHsin-Hsiung Wang 
2922b91c28fSHsin-Hsiung Wang 	enable_irq_wake(chip->irq);
2932b91c28fSHsin-Hsiung Wang 	return ret;
2942b91c28fSHsin-Hsiung Wang }
295