]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - drivers/mfd/mt6397-core.c
Merge tag 'selinux-pr-20191007' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux.git] / drivers / mfd / mt6397-core.c
index 337bcccdb9146856f89779bdb22fdf9f5f8cfaab..310dae26ddff6283a0b83c05cd5c31b73834cf97 100644 (file)
@@ -5,34 +5,34 @@
  */
 
 #include <linux/interrupt.h>
+#include <linux/ioport.h>
 #include <linux/module.h>
 #include <linux/of_device.h>
 #include <linux/of_irq.h>
 #include <linux/regmap.h>
 #include <linux/mfd/core.h>
-#include <linux/mfd/mt6397/core.h>
 #include <linux/mfd/mt6323/core.h>
-#include <linux/mfd/mt6397/registers.h>
+#include <linux/mfd/mt6397/core.h>
 #include <linux/mfd/mt6323/registers.h>
+#include <linux/mfd/mt6397/registers.h>
+
+#define MT6323_RTC_BASE                0x8000
+#define MT6323_RTC_SIZE                0x40
 
 #define MT6397_RTC_BASE                0xe000
 #define MT6397_RTC_SIZE                0x3e
 
-#define MT6323_CID_CODE                0x23
-#define MT6391_CID_CODE                0x91
-#define MT6397_CID_CODE                0x97
+#define MT6323_PWRC_BASE       0x8000
+#define MT6323_PWRC_SIZE       0x40
+
+static const struct resource mt6323_rtc_resources[] = {
+       DEFINE_RES_MEM(MT6323_RTC_BASE, MT6323_RTC_SIZE),
+       DEFINE_RES_IRQ(MT6323_IRQ_STATUS_RTC),
+};
 
 static const struct resource mt6397_rtc_resources[] = {
-       {
-               .start = MT6397_RTC_BASE,
-               .end   = MT6397_RTC_BASE + MT6397_RTC_SIZE,
-               .flags = IORESOURCE_MEM,
-       },
-       {
-               .start = MT6397_IRQ_RTC,
-               .end   = MT6397_IRQ_RTC,
-               .flags = IORESOURCE_IRQ,
-       },
+       DEFINE_RES_MEM(MT6397_RTC_BASE, MT6397_RTC_SIZE),
+       DEFINE_RES_IRQ(MT6397_IRQ_RTC),
 };
 
 static const struct resource mt6323_keys_resources[] = {
@@ -45,8 +45,17 @@ static const struct resource mt6397_keys_resources[] = {
        DEFINE_RES_IRQ(MT6397_IRQ_HOMEKEY),
 };
 
+static const struct resource mt6323_pwrc_resources[] = {
+       DEFINE_RES_MEM(MT6323_PWRC_BASE, MT6323_PWRC_SIZE),
+};
+
 static const struct mfd_cell mt6323_devs[] = {
        {
+               .name = "mt6323-rtc",
+               .num_resources = ARRAY_SIZE(mt6323_rtc_resources),
+               .resources = mt6323_rtc_resources,
+               .of_compatible = "mediatek,mt6323-rtc",
+       }, {
                .name = "mt6323-regulator",
                .of_compatible = "mediatek,mt6323-regulator"
        }, {
@@ -57,6 +66,11 @@ static const struct mfd_cell mt6323_devs[] = {
                .num_resources = ARRAY_SIZE(mt6323_keys_resources),
                .resources = mt6323_keys_resources,
                .of_compatible = "mediatek,mt6323-keys"
+       }, {
+               .name = "mt6323-pwrc",
+               .num_resources = ARRAY_SIZE(mt6323_pwrc_resources),
+               .resources = mt6323_pwrc_resources,
+               .of_compatible = "mediatek,mt6323-pwrc"
        },
 };
 
@@ -86,148 +100,6 @@ static const struct mfd_cell mt6397_devs[] = {
        }
 };
 
-static void mt6397_irq_lock(struct irq_data *data)
-{
-       struct mt6397_chip *mt6397 = irq_data_get_irq_chip_data(data);
-
-       mutex_lock(&mt6397->irqlock);
-}
-
-static void mt6397_irq_sync_unlock(struct irq_data *data)
-{
-       struct mt6397_chip *mt6397 = irq_data_get_irq_chip_data(data);
-
-       regmap_write(mt6397->regmap, mt6397->int_con[0],
-                    mt6397->irq_masks_cur[0]);
-       regmap_write(mt6397->regmap, mt6397->int_con[1],
-                    mt6397->irq_masks_cur[1]);
-
-       mutex_unlock(&mt6397->irqlock);
-}
-
-static void mt6397_irq_disable(struct irq_data *data)
-{
-       struct mt6397_chip *mt6397 = irq_data_get_irq_chip_data(data);
-       int shift = data->hwirq & 0xf;
-       int reg = data->hwirq >> 4;
-
-       mt6397->irq_masks_cur[reg] &= ~BIT(shift);
-}
-
-static void mt6397_irq_enable(struct irq_data *data)
-{
-       struct mt6397_chip *mt6397 = irq_data_get_irq_chip_data(data);
-       int shift = data->hwirq & 0xf;
-       int reg = data->hwirq >> 4;
-
-       mt6397->irq_masks_cur[reg] |= BIT(shift);
-}
-
-#ifdef CONFIG_PM_SLEEP
-static int mt6397_irq_set_wake(struct irq_data *irq_data, unsigned int on)
-{
-       struct mt6397_chip *mt6397 = irq_data_get_irq_chip_data(irq_data);
-       int shift = irq_data->hwirq & 0xf;
-       int reg = irq_data->hwirq >> 4;
-
-       if (on)
-               mt6397->wake_mask[reg] |= BIT(shift);
-       else
-               mt6397->wake_mask[reg] &= ~BIT(shift);
-
-       return 0;
-}
-#else
-#define mt6397_irq_set_wake NULL
-#endif
-
-static struct irq_chip mt6397_irq_chip = {
-       .name = "mt6397-irq",
-       .irq_bus_lock = mt6397_irq_lock,
-       .irq_bus_sync_unlock = mt6397_irq_sync_unlock,
-       .irq_enable = mt6397_irq_enable,
-       .irq_disable = mt6397_irq_disable,
-       .irq_set_wake = mt6397_irq_set_wake,
-};
-
-static void mt6397_irq_handle_reg(struct mt6397_chip *mt6397, int reg,
-               int irqbase)
-{
-       unsigned int status;
-       int i, irq, ret;
-
-       ret = regmap_read(mt6397->regmap, reg, &status);
-       if (ret) {
-               dev_err(mt6397->dev, "Failed to read irq status: %d\n", ret);
-               return;
-       }
-
-       for (i = 0; i < 16; i++) {
-               if (status & BIT(i)) {
-                       irq = irq_find_mapping(mt6397->irq_domain, irqbase + i);
-                       if (irq)
-                               handle_nested_irq(irq);
-               }
-       }
-
-       regmap_write(mt6397->regmap, reg, status);
-}
-
-static irqreturn_t mt6397_irq_thread(int irq, void *data)
-{
-       struct mt6397_chip *mt6397 = data;
-
-       mt6397_irq_handle_reg(mt6397, mt6397->int_status[0], 0);
-       mt6397_irq_handle_reg(mt6397, mt6397->int_status[1], 16);
-
-       return IRQ_HANDLED;
-}
-
-static int mt6397_irq_domain_map(struct irq_domain *d, unsigned int irq,
-                                       irq_hw_number_t hw)
-{
-       struct mt6397_chip *mt6397 = d->host_data;
-
-       irq_set_chip_data(irq, mt6397);
-       irq_set_chip_and_handler(irq, &mt6397_irq_chip, handle_level_irq);
-       irq_set_nested_thread(irq, 1);
-       irq_set_noprobe(irq);
-
-       return 0;
-}
-
-static const struct irq_domain_ops mt6397_irq_domain_ops = {
-       .map = mt6397_irq_domain_map,
-};
-
-static int mt6397_irq_init(struct mt6397_chip *mt6397)
-{
-       int ret;
-
-       mutex_init(&mt6397->irqlock);
-
-       /* Mask all interrupt sources */
-       regmap_write(mt6397->regmap, mt6397->int_con[0], 0x0);
-       regmap_write(mt6397->regmap, mt6397->int_con[1], 0x0);
-
-       mt6397->irq_domain = irq_domain_add_linear(mt6397->dev->of_node,
-               MT6397_IRQ_NR, &mt6397_irq_domain_ops, mt6397);
-       if (!mt6397->irq_domain) {
-               dev_err(mt6397->dev, "could not create irq domain\n");
-               return -ENOMEM;
-       }
-
-       ret = devm_request_threaded_irq(mt6397->dev, mt6397->irq, NULL,
-               mt6397_irq_thread, IRQF_ONESHOT, "mt6397-pmic", mt6397);
-       if (ret) {
-               dev_err(mt6397->dev, "failed to register irq=%d; err: %d\n",
-                       mt6397->irq, ret);
-               return ret;
-       }
-
-       return 0;
-}
-
 #ifdef CONFIG_PM_SLEEP
 static int mt6397_irq_suspend(struct device *dev)
 {
@@ -290,7 +162,7 @@ static int mt6397_probe(struct platform_device *pdev)
                return pmic->irq;
 
        switch (id & 0xff) {
-       case MT6323_CID_CODE:
+       case MT6323_CHIP_ID:
                pmic->int_con[0] = MT6323_INT_CON0;
                pmic->int_con[1] = MT6323_INT_CON1;
                pmic->int_status[0] = MT6323_INT_STATUS0;
@@ -304,8 +176,8 @@ static int mt6397_probe(struct platform_device *pdev)
                                           0, pmic->irq_domain);
                break;
 
-       case MT6397_CID_CODE:
-       case MT6391_CID_CODE:
+       case MT6391_CHIP_ID:
+       case MT6397_CHIP_ID:
                pmic->int_con[0] = MT6397_INT_CON0;
                pmic->int_con[1] = MT6397_INT_CON1;
                pmic->int_status[0] = MT6397_INT_STATUS0;