diff options
| author | Robert Baldyga <r.baldyga@samsung.com> | 2014-05-21 02:52:48 -0400 |
|---|---|---|
| committer | Lee Jones <lee.jones@linaro.org> | 2014-06-17 10:17:00 -0400 |
| commit | 342d669c1ee421323f552a62729d3a3d0065093c (patch) | |
| tree | 2b19ea7f3df22d56cdab3bba96266e0ca6bd12cd | |
| parent | d0540f91cf74fab90e1143d8d40da8a5b5fabc8a (diff) | |
mfd: max77693: Handle IRQs using regmap
This patch modifies mfd driver to use regmap for handling interrupts.
It allows to simplify irq handling process. This modifications needed
to make small changes in function drivers, which use interrupts.
Signed-off-by: Robert Baldyga <r.baldyga@samsung.com>
Reviewed-by: Krzysztof Kozlowski <k.kozlowski@samsung.com>
Acked-by: Chanwoo Choi <cw00.choi@samsung.com>
Signed-off-by: Lee Jones <lee.jones@linaro.org>
| -rw-r--r-- | drivers/extcon/extcon-max77693.c | 3 | ||||
| -rw-r--r-- | drivers/mfd/Kconfig | 1 | ||||
| -rw-r--r-- | drivers/mfd/Makefile | 2 | ||||
| -rw-r--r-- | drivers/mfd/max77693-irq.c | 346 | ||||
| -rw-r--r-- | drivers/mfd/max77693.c | 158 | ||||
| -rw-r--r-- | include/linux/mfd/max77693-private.h | 46 |
6 files changed, 195 insertions, 361 deletions
diff --git a/drivers/extcon/extcon-max77693.c b/drivers/extcon/extcon-max77693.c index ba84a6e77e03..c7278b1649da 100644 --- a/drivers/extcon/extcon-max77693.c +++ b/drivers/extcon/extcon-max77693.c | |||
| @@ -1154,7 +1154,8 @@ static int max77693_muic_probe(struct platform_device *pdev) | |||
| 1154 | struct max77693_muic_irq *muic_irq = &muic_irqs[i]; | 1154 | struct max77693_muic_irq *muic_irq = &muic_irqs[i]; |
| 1155 | unsigned int virq = 0; | 1155 | unsigned int virq = 0; |
| 1156 | 1156 | ||
| 1157 | virq = irq_create_mapping(max77693->irq_domain, muic_irq->irq); | 1157 | virq = regmap_irq_get_virq(max77693->irq_data_muic, |
| 1158 | muic_irq->irq); | ||
| 1158 | if (!virq) { | 1159 | if (!virq) { |
| 1159 | ret = -EINVAL; | 1160 | ret = -EINVAL; |
| 1160 | goto err_irq; | 1161 | goto err_irq; |
diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig index ee8204cc31e9..2feac14d1085 100644 --- a/drivers/mfd/Kconfig +++ b/drivers/mfd/Kconfig | |||
| @@ -384,6 +384,7 @@ config MFD_MAX77693 | |||
| 384 | depends on I2C=y | 384 | depends on I2C=y |
| 385 | select MFD_CORE | 385 | select MFD_CORE |
| 386 | select REGMAP_I2C | 386 | select REGMAP_I2C |
| 387 | select REGMAP_IRQ | ||
| 387 | help | 388 | help |
| 388 | Say yes here to add support for Maxim Semiconductor MAX77693. | 389 | Say yes here to add support for Maxim Semiconductor MAX77693. |
| 389 | This is a companion Power Management IC with Flash, Haptic, Charger, | 390 | This is a companion Power Management IC with Flash, Haptic, Charger, |
diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile index 8afedba535c7..8c6e7bba4660 100644 --- a/drivers/mfd/Makefile +++ b/drivers/mfd/Makefile | |||
| @@ -116,7 +116,7 @@ obj-$(CONFIG_MFD_DA9063) += da9063.o | |||
| 116 | 116 | ||
| 117 | obj-$(CONFIG_MFD_MAX14577) += max14577.o | 117 | obj-$(CONFIG_MFD_MAX14577) += max14577.o |
| 118 | obj-$(CONFIG_MFD_MAX77686) += max77686.o max77686-irq.o | 118 | obj-$(CONFIG_MFD_MAX77686) += max77686.o max77686-irq.o |
| 119 | obj-$(CONFIG_MFD_MAX77693) += max77693.o max77693-irq.o | 119 | obj-$(CONFIG_MFD_MAX77693) += max77693.o |
| 120 | obj-$(CONFIG_MFD_MAX8907) += max8907.o | 120 | obj-$(CONFIG_MFD_MAX8907) += max8907.o |
| 121 | max8925-objs := max8925-core.o max8925-i2c.o | 121 | max8925-objs := max8925-core.o max8925-i2c.o |
| 122 | obj-$(CONFIG_MFD_MAX8925) += max8925.o | 122 | obj-$(CONFIG_MFD_MAX8925) += max8925.o |
diff --git a/drivers/mfd/max77693-irq.c b/drivers/mfd/max77693-irq.c deleted file mode 100644 index 7d8f99f94f27..000000000000 --- a/drivers/mfd/max77693-irq.c +++ /dev/null | |||
| @@ -1,346 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * max77693-irq.c - Interrupt controller support for MAX77693 | ||
| 3 | * | ||
| 4 | * Copyright (C) 2012 Samsung Electronics Co.Ltd | ||
| 5 | * SangYoung Son <hello.son@samsung.com> | ||
| 6 | * | ||
| 7 | * This program is not provided / owned by Maxim Integrated Products. | ||
| 8 | * | ||
| 9 | * This program is free software; you can redistribute it and/or modify | ||
| 10 | * it under the terms of the GNU General Public License as published by | ||
| 11 | * the Free Software Foundation; either version 2 of the License, or | ||
| 12 | * (at your option) any later version. | ||
| 13 | * | ||
| 14 | * This program is distributed in the hope that it will be useful, | ||
| 15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 17 | * GNU General Public License for more details. | ||
| 18 | * | ||
| 19 | * You should have received a copy of the GNU General Public License | ||
| 20 | * along with this program; if not, write to the Free Software | ||
| 21 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 22 | * | ||
| 23 | * This driver is based on max8997-irq.c | ||
| 24 | */ | ||
| 25 | |||
| 26 | #include <linux/err.h> | ||
| 27 | #include <linux/irq.h> | ||
| 28 | #include <linux/interrupt.h> | ||
| 29 | #include <linux/module.h> | ||
| 30 | #include <linux/irqdomain.h> | ||
| 31 | #include <linux/mfd/max77693.h> | ||
| 32 | #include <linux/mfd/max77693-private.h> | ||
| 33 | #include <linux/regmap.h> | ||
| 34 | |||
| 35 | static const unsigned int max77693_mask_reg[] = { | ||
| 36 | [LED_INT] = MAX77693_LED_REG_FLASH_INT_MASK, | ||
| 37 | [TOPSYS_INT] = MAX77693_PMIC_REG_TOPSYS_INT_MASK, | ||
| 38 | [CHG_INT] = MAX77693_CHG_REG_CHG_INT_MASK, | ||
| 39 | [MUIC_INT1] = MAX77693_MUIC_REG_INTMASK1, | ||
| 40 | [MUIC_INT2] = MAX77693_MUIC_REG_INTMASK2, | ||
| 41 | [MUIC_INT3] = MAX77693_MUIC_REG_INTMASK3, | ||
| 42 | }; | ||
| 43 | |||
| 44 | static struct regmap *max77693_get_regmap(struct max77693_dev *max77693, | ||
| 45 | enum max77693_irq_source src) | ||
| 46 | { | ||
| 47 | switch (src) { | ||
| 48 | case LED_INT ... CHG_INT: | ||
| 49 | return max77693->regmap; | ||
| 50 | case MUIC_INT1 ... MUIC_INT3: | ||
| 51 | return max77693->regmap_muic; | ||
| 52 | default: | ||
| 53 | return ERR_PTR(-EINVAL); | ||
| 54 | } | ||
| 55 | } | ||
| 56 | |||
| 57 | struct max77693_irq_data { | ||
| 58 | int mask; | ||
| 59 | enum max77693_irq_source group; | ||
| 60 | }; | ||
| 61 | |||
| 62 | #define DECLARE_IRQ(idx, _group, _mask) \ | ||
| 63 | [(idx)] = { .group = (_group), .mask = (_mask) } | ||
| 64 | static const struct max77693_irq_data max77693_irqs[] = { | ||
| 65 | DECLARE_IRQ(MAX77693_LED_IRQ_FLED2_OPEN, LED_INT, 1 << 0), | ||
| 66 | DECLARE_IRQ(MAX77693_LED_IRQ_FLED2_SHORT, LED_INT, 1 << 1), | ||
| 67 | DECLARE_IRQ(MAX77693_LED_IRQ_FLED1_OPEN, LED_INT, 1 << 2), | ||
| 68 | DECLARE_IRQ(MAX77693_LED_IRQ_FLED1_SHORT, LED_INT, 1 << 3), | ||
| 69 | DECLARE_IRQ(MAX77693_LED_IRQ_MAX_FLASH, LED_INT, 1 << 4), | ||
| 70 | |||
| 71 | DECLARE_IRQ(MAX77693_TOPSYS_IRQ_T120C_INT, TOPSYS_INT, 1 << 0), | ||
| 72 | DECLARE_IRQ(MAX77693_TOPSYS_IRQ_T140C_INT, TOPSYS_INT, 1 << 1), | ||
| 73 | DECLARE_IRQ(MAX77693_TOPSYS_IRQ_LOWSYS_INT, TOPSYS_INT, 1 << 3), | ||
| 74 | |||
| 75 | DECLARE_IRQ(MAX77693_CHG_IRQ_BYP_I, CHG_INT, 1 << 0), | ||
| 76 | DECLARE_IRQ(MAX77693_CHG_IRQ_THM_I, CHG_INT, 1 << 2), | ||
| 77 | DECLARE_IRQ(MAX77693_CHG_IRQ_BAT_I, CHG_INT, 1 << 3), | ||
| 78 | DECLARE_IRQ(MAX77693_CHG_IRQ_CHG_I, CHG_INT, 1 << 4), | ||
| 79 | DECLARE_IRQ(MAX77693_CHG_IRQ_CHGIN_I, CHG_INT, 1 << 6), | ||
| 80 | |||
| 81 | DECLARE_IRQ(MAX77693_MUIC_IRQ_INT1_ADC, MUIC_INT1, 1 << 0), | ||
| 82 | DECLARE_IRQ(MAX77693_MUIC_IRQ_INT1_ADC_LOW, MUIC_INT1, 1 << 1), | ||
| 83 | DECLARE_IRQ(MAX77693_MUIC_IRQ_INT1_ADC_ERR, MUIC_INT1, 1 << 2), | ||
| 84 | DECLARE_IRQ(MAX77693_MUIC_IRQ_INT1_ADC1K, MUIC_INT1, 1 << 3), | ||
| 85 | |||
| 86 | DECLARE_IRQ(MAX77693_MUIC_IRQ_INT2_CHGTYP, MUIC_INT2, 1 << 0), | ||
| 87 | DECLARE_IRQ(MAX77693_MUIC_IRQ_INT2_CHGDETREUN, MUIC_INT2, 1 << 1), | ||
| 88 | DECLARE_IRQ(MAX77693_MUIC_IRQ_INT2_DCDTMR, MUIC_INT2, 1 << 2), | ||
| 89 | DECLARE_IRQ(MAX77693_MUIC_IRQ_INT2_DXOVP, MUIC_INT2, 1 << 3), | ||
| 90 | DECLARE_IRQ(MAX77693_MUIC_IRQ_INT2_VBVOLT, MUIC_INT2, 1 << 4), | ||
| 91 | DECLARE_IRQ(MAX77693_MUIC_IRQ_INT2_VIDRM, MUIC_INT2, 1 << 5), | ||
| 92 | |||
| 93 | DECLARE_IRQ(MAX77693_MUIC_IRQ_INT3_EOC, MUIC_INT3, 1 << 0), | ||
| 94 | DECLARE_IRQ(MAX77693_MUIC_IRQ_INT3_CGMBC, MUIC_INT3, 1 << 1), | ||
| 95 | DECLARE_IRQ(MAX77693_MUIC_IRQ_INT3_OVP, MUIC_INT3, 1 << 2), | ||
| 96 | DECLARE_IRQ(MAX77693_MUIC_IRQ_INT3_MBCCHG_ERR, MUIC_INT3, 1 << 3), | ||
| 97 | DECLARE_IRQ(MAX77693_MUIC_IRQ_INT3_CHG_ENABLED, MUIC_INT3, 1 << 4), | ||
| 98 | DECLARE_IRQ(MAX77693_MUIC_IRQ_INT3_BAT_DET, MUIC_INT3, 1 << 5), | ||
| 99 | }; | ||
| 100 | |||
| 101 | static void max77693_irq_lock(struct irq_data *data) | ||
| 102 | { | ||
| 103 | struct max77693_dev *max77693 = irq_get_chip_data(data->irq); | ||
| 104 | |||
| 105 | mutex_lock(&max77693->irqlock); | ||
| 106 | } | ||
| 107 | |||
| 108 | static void max77693_irq_sync_unlock(struct irq_data *data) | ||
| 109 | { | ||
| 110 | struct max77693_dev *max77693 = irq_get_chip_data(data->irq); | ||
| 111 | int i; | ||
| 112 | |||
| 113 | for (i = 0; i < MAX77693_IRQ_GROUP_NR; i++) { | ||
| 114 | u8 mask_reg = max77693_mask_reg[i]; | ||
| 115 | struct regmap *map = max77693_get_regmap(max77693, i); | ||
| 116 | |||
| 117 | if (mask_reg == MAX77693_REG_INVALID || | ||
| 118 | IS_ERR_OR_NULL(map)) | ||
| 119 | continue; | ||
| 120 | max77693->irq_masks_cache[i] = max77693->irq_masks_cur[i]; | ||
| 121 | |||
| 122 | regmap_write(map, max77693_mask_reg[i], | ||
| 123 | max77693->irq_masks_cur[i]); | ||
| 124 | } | ||
| 125 | |||
| 126 | mutex_unlock(&max77693->irqlock); | ||
| 127 | } | ||
| 128 | |||
| 129 | static const inline struct max77693_irq_data * | ||
| 130 | irq_to_max77693_irq(struct max77693_dev *max77693, int irq) | ||
| 131 | { | ||
| 132 | struct irq_data *data = irq_get_irq_data(irq); | ||
| 133 | return &max77693_irqs[data->hwirq]; | ||
| 134 | } | ||
| 135 | |||
| 136 | static void max77693_irq_mask(struct irq_data *data) | ||
| 137 | { | ||
| 138 | struct max77693_dev *max77693 = irq_get_chip_data(data->irq); | ||
| 139 | const struct max77693_irq_data *irq_data = | ||
| 140 | irq_to_max77693_irq(max77693, data->irq); | ||
| 141 | |||
| 142 | if (irq_data->group >= MAX77693_IRQ_GROUP_NR) | ||
