Re: [PATCH v1 4/7] mfd: intel_soc_pmic_bxtwc: Chain power button IRQs as well

2018-09-10 Thread Lee Jones
On Thu, 30 Aug 2018, Andy Shevchenko wrote:

> Power button IRQ actually has a second level of interrupts to
> distinguish between UI and POWER buttons. Moreover, current
> implementation looks awkward in approach to handle second level IRQs by
> first level related IRQ chip.
> 
> To address above issues, split power button IRQ to be chained as well.
> 
> Signed-off-by: Andy Shevchenko 
> ---
>  drivers/mfd/intel_soc_pmic_bxtwc.c | 41 ++
>  include/linux/mfd/intel_soc_pmic.h |  1 +
>  2 files changed, 32 insertions(+), 10 deletions(-)

Applied, thanks.

-- 
Lee Jones [李琼斯]
Linaro Services Technical Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog


Re: [PATCH v1 4/7] mfd: intel_soc_pmic_bxtwc: Chain power button IRQs as well

2018-09-10 Thread Lee Jones
On Thu, 30 Aug 2018, Andy Shevchenko wrote:

> Power button IRQ actually has a second level of interrupts to
> distinguish between UI and POWER buttons. Moreover, current
> implementation looks awkward in approach to handle second level IRQs by
> first level related IRQ chip.
> 
> To address above issues, split power button IRQ to be chained as well.
> 
> Signed-off-by: Andy Shevchenko 
> ---
>  drivers/mfd/intel_soc_pmic_bxtwc.c | 41 ++
>  include/linux/mfd/intel_soc_pmic.h |  1 +
>  2 files changed, 32 insertions(+), 10 deletions(-)

Applied, thanks.

-- 
Lee Jones [李琼斯]
Linaro Services Technical Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog


Re: [PATCH v1 4/7] mfd: intel_soc_pmic_bxtwc: Chain power button IRQs as well

2018-08-31 Thread Mika Westerberg
On Thu, Aug 30, 2018 at 07:52:52PM +0300, Andy Shevchenko wrote:
> Power button IRQ actually has a second level of interrupts to
> distinguish between UI and POWER buttons. Moreover, current
> implementation looks awkward in approach to handle second level IRQs by
> first level related IRQ chip.
> 
> To address above issues, split power button IRQ to be chained as well.
> 
> Signed-off-by: Andy Shevchenko 

Reviewed-by: Mika Westerberg 


Re: [PATCH v1 4/7] mfd: intel_soc_pmic_bxtwc: Chain power button IRQs as well

2018-08-31 Thread Mika Westerberg
On Thu, Aug 30, 2018 at 07:52:52PM +0300, Andy Shevchenko wrote:
> Power button IRQ actually has a second level of interrupts to
> distinguish between UI and POWER buttons. Moreover, current
> implementation looks awkward in approach to handle second level IRQs by
> first level related IRQ chip.
> 
> To address above issues, split power button IRQ to be chained as well.
> 
> Signed-off-by: Andy Shevchenko 

Reviewed-by: Mika Westerberg 


[PATCH v1 4/7] mfd: intel_soc_pmic_bxtwc: Chain power button IRQs as well

2018-08-30 Thread Andy Shevchenko
Power button IRQ actually has a second level of interrupts to
distinguish between UI and POWER buttons. Moreover, current
implementation looks awkward in approach to handle second level IRQs by
first level related IRQ chip.

To address above issues, split power button IRQ to be chained as well.

Signed-off-by: Andy Shevchenko 
---
 drivers/mfd/intel_soc_pmic_bxtwc.c | 41 ++
 include/linux/mfd/intel_soc_pmic.h |  1 +
 2 files changed, 32 insertions(+), 10 deletions(-)

diff --git a/drivers/mfd/intel_soc_pmic_bxtwc.c 
b/drivers/mfd/intel_soc_pmic_bxtwc.c
index 15bc052704a6..9ca1f8c015de 100644
--- a/drivers/mfd/intel_soc_pmic_bxtwc.c
+++ b/drivers/mfd/intel_soc_pmic_bxtwc.c
@@ -31,8 +31,8 @@
 
 /* Interrupt Status Registers */
 #define BXTWC_IRQLVL1  0x4E02
-#define BXTWC_PWRBTNIRQ0x4E03
 
+#define BXTWC_PWRBTNIRQ0x4E03
 #define BXTWC_THRM0IRQ 0x4E04
 #define BXTWC_THRM1IRQ 0x4E05
 #define BXTWC_THRM2IRQ 0x4E06
@@ -47,10 +47,9 @@
 
 /* Interrupt MASK Registers */
 #define BXTWC_MIRQLVL1 0x4E0E
-#define BXTWC_MPWRTNIRQ0x4E0F
-
 #define BXTWC_MIRQLVL1_MCHGR   BIT(5)
 
+#define BXTWC_MPWRBTNIRQ   0x4E0F
 #define BXTWC_MTHRM0IRQ0x4E12
 #define BXTWC_MTHRM1IRQ0x4E13
 #define BXTWC_MTHRM2IRQ0x4E14
@@ -66,9 +65,7 @@
 /* Whiskey Cove PMIC share same ACPI ID between different platforms */
 #define BROXTON_PMIC_WC_HRV4
 
-/* Manage in two IRQ chips since mask registers are not consecutive */
 enum bxtwc_irqs {
-   /* Level 1 */
BXTWC_PWRBTN_LVL1_IRQ = 0,
BXTWC_TMU_LVL1_IRQ,
BXTWC_THRM_LVL1_IRQ,
@@ -77,9 +74,11 @@ enum bxtwc_irqs {
BXTWC_CHGR_LVL1_IRQ,
BXTWC_GPIO_LVL1_IRQ,
BXTWC_CRIT_LVL1_IRQ,
+};
 
-   /* Level 2 */
-   BXTWC_PWRBTN_IRQ,
+enum bxtwc_irqs_pwrbtn {
+   BXTWC_PWRBTN_IRQ = 0,
+   BXTWC_UIBTN_IRQ,
 };
 
 enum bxtwc_irqs_bcu {
@@ -113,7 +112,10 @@ static const struct regmap_irq bxtwc_regmap_irqs[] = {
REGMAP_IRQ_REG(BXTWC_CHGR_LVL1_IRQ, 0, BIT(5)),
REGMAP_IRQ_REG(BXTWC_GPIO_LVL1_IRQ, 0, BIT(6)),
REGMAP_IRQ_REG(BXTWC_CRIT_LVL1_IRQ, 0, BIT(7)),
-   REGMAP_IRQ_REG(BXTWC_PWRBTN_IRQ, 1, 0x03),
+};
+
+static const struct regmap_irq bxtwc_regmap_irqs_pwrbtn[] = {
+   REGMAP_IRQ_REG(BXTWC_PWRBTN_IRQ, 0, 0x01),
 };
 
 static const struct regmap_irq bxtwc_regmap_irqs_bcu[] = {
@@ -125,7 +127,7 @@ static const struct regmap_irq bxtwc_regmap_irqs_adc[] = {
 };
 
 static const struct regmap_irq bxtwc_regmap_irqs_chgr[] = {
-   REGMAP_IRQ_REG(BXTWC_USBC_IRQ, 0, BIT(5)),
+   REGMAP_IRQ_REG(BXTWC_USBC_IRQ, 0, 0x20),
REGMAP_IRQ_REG(BXTWC_CHGR0_IRQ, 0, 0x1f),
REGMAP_IRQ_REG(BXTWC_CHGR1_IRQ, 1, 0x1f),
 };
@@ -144,7 +146,16 @@ static struct regmap_irq_chip bxtwc_regmap_irq_chip = {
.mask_base = BXTWC_MIRQLVL1,
.irqs = bxtwc_regmap_irqs,
.num_irqs = ARRAY_SIZE(bxtwc_regmap_irqs),
-   .num_regs = 2,
+   .num_regs = 1,
+};
+
+static struct regmap_irq_chip bxtwc_regmap_irq_chip_pwrbtn = {
+   .name = "bxtwc_irq_chip_pwrbtn",
+   .status_base = BXTWC_PWRBTNIRQ,
+   .mask_base = BXTWC_MPWRBTNIRQ,
+   .irqs = bxtwc_regmap_irqs_pwrbtn,
+   .num_irqs = ARRAY_SIZE(bxtwc_regmap_irqs_pwrbtn),
+   .num_regs = 1,
 };
 
 static struct regmap_irq_chip bxtwc_regmap_irq_chip_tmu = {
@@ -472,6 +483,16 @@ static int bxtwc_probe(struct platform_device *pdev)
return ret;
}
 
+   ret = bxtwc_add_chained_irq_chip(pmic, pmic->irq_chip_data,
+BXTWC_PWRBTN_LVL1_IRQ,
+IRQF_ONESHOT,
+_regmap_irq_chip_pwrbtn,
+>irq_chip_data_pwrbtn);
+   if (ret) {
+   dev_err(>dev, "Failed to add PWRBTN IRQ chip\n");
+   return ret;
+   }
+
ret = bxtwc_add_chained_irq_chip(pmic, pmic->irq_chip_data,
 BXTWC_TMU_LVL1_IRQ,
 IRQF_ONESHOT,
diff --git a/include/linux/mfd/intel_soc_pmic.h 
b/include/linux/mfd/intel_soc_pmic.h
index 5aacdb017a9f..806a4f095312 100644
--- a/include/linux/mfd/intel_soc_pmic.h
+++ b/include/linux/mfd/intel_soc_pmic.h
@@ -25,6 +25,7 @@ struct intel_soc_pmic {
int irq;
struct regmap *regmap;
struct regmap_irq_chip_data *irq_chip_data;
+   struct regmap_irq_chip_data *irq_chip_data_pwrbtn;
struct regmap_irq_chip_data *irq_chip_data_tmu;
struct regmap_irq_chip_data *irq_chip_data_bcu;
struct regmap_irq_chip_data *irq_chip_data_adc;
-- 
2.18.0



[PATCH v1 4/7] mfd: intel_soc_pmic_bxtwc: Chain power button IRQs as well

2018-08-30 Thread Andy Shevchenko
Power button IRQ actually has a second level of interrupts to
distinguish between UI and POWER buttons. Moreover, current
implementation looks awkward in approach to handle second level IRQs by
first level related IRQ chip.

To address above issues, split power button IRQ to be chained as well.

Signed-off-by: Andy Shevchenko 
---
 drivers/mfd/intel_soc_pmic_bxtwc.c | 41 ++
 include/linux/mfd/intel_soc_pmic.h |  1 +
 2 files changed, 32 insertions(+), 10 deletions(-)

diff --git a/drivers/mfd/intel_soc_pmic_bxtwc.c 
b/drivers/mfd/intel_soc_pmic_bxtwc.c
index 15bc052704a6..9ca1f8c015de 100644
--- a/drivers/mfd/intel_soc_pmic_bxtwc.c
+++ b/drivers/mfd/intel_soc_pmic_bxtwc.c
@@ -31,8 +31,8 @@
 
 /* Interrupt Status Registers */
 #define BXTWC_IRQLVL1  0x4E02
-#define BXTWC_PWRBTNIRQ0x4E03
 
+#define BXTWC_PWRBTNIRQ0x4E03
 #define BXTWC_THRM0IRQ 0x4E04
 #define BXTWC_THRM1IRQ 0x4E05
 #define BXTWC_THRM2IRQ 0x4E06
@@ -47,10 +47,9 @@
 
 /* Interrupt MASK Registers */
 #define BXTWC_MIRQLVL1 0x4E0E
-#define BXTWC_MPWRTNIRQ0x4E0F
-
 #define BXTWC_MIRQLVL1_MCHGR   BIT(5)
 
+#define BXTWC_MPWRBTNIRQ   0x4E0F
 #define BXTWC_MTHRM0IRQ0x4E12
 #define BXTWC_MTHRM1IRQ0x4E13
 #define BXTWC_MTHRM2IRQ0x4E14
@@ -66,9 +65,7 @@
 /* Whiskey Cove PMIC share same ACPI ID between different platforms */
 #define BROXTON_PMIC_WC_HRV4
 
-/* Manage in two IRQ chips since mask registers are not consecutive */
 enum bxtwc_irqs {
-   /* Level 1 */
BXTWC_PWRBTN_LVL1_IRQ = 0,
BXTWC_TMU_LVL1_IRQ,
BXTWC_THRM_LVL1_IRQ,
@@ -77,9 +74,11 @@ enum bxtwc_irqs {
BXTWC_CHGR_LVL1_IRQ,
BXTWC_GPIO_LVL1_IRQ,
BXTWC_CRIT_LVL1_IRQ,
+};
 
-   /* Level 2 */
-   BXTWC_PWRBTN_IRQ,
+enum bxtwc_irqs_pwrbtn {
+   BXTWC_PWRBTN_IRQ = 0,
+   BXTWC_UIBTN_IRQ,
 };
 
 enum bxtwc_irqs_bcu {
@@ -113,7 +112,10 @@ static const struct regmap_irq bxtwc_regmap_irqs[] = {
REGMAP_IRQ_REG(BXTWC_CHGR_LVL1_IRQ, 0, BIT(5)),
REGMAP_IRQ_REG(BXTWC_GPIO_LVL1_IRQ, 0, BIT(6)),
REGMAP_IRQ_REG(BXTWC_CRIT_LVL1_IRQ, 0, BIT(7)),
-   REGMAP_IRQ_REG(BXTWC_PWRBTN_IRQ, 1, 0x03),
+};
+
+static const struct regmap_irq bxtwc_regmap_irqs_pwrbtn[] = {
+   REGMAP_IRQ_REG(BXTWC_PWRBTN_IRQ, 0, 0x01),
 };
 
 static const struct regmap_irq bxtwc_regmap_irqs_bcu[] = {
@@ -125,7 +127,7 @@ static const struct regmap_irq bxtwc_regmap_irqs_adc[] = {
 };
 
 static const struct regmap_irq bxtwc_regmap_irqs_chgr[] = {
-   REGMAP_IRQ_REG(BXTWC_USBC_IRQ, 0, BIT(5)),
+   REGMAP_IRQ_REG(BXTWC_USBC_IRQ, 0, 0x20),
REGMAP_IRQ_REG(BXTWC_CHGR0_IRQ, 0, 0x1f),
REGMAP_IRQ_REG(BXTWC_CHGR1_IRQ, 1, 0x1f),
 };
@@ -144,7 +146,16 @@ static struct regmap_irq_chip bxtwc_regmap_irq_chip = {
.mask_base = BXTWC_MIRQLVL1,
.irqs = bxtwc_regmap_irqs,
.num_irqs = ARRAY_SIZE(bxtwc_regmap_irqs),
-   .num_regs = 2,
+   .num_regs = 1,
+};
+
+static struct regmap_irq_chip bxtwc_regmap_irq_chip_pwrbtn = {
+   .name = "bxtwc_irq_chip_pwrbtn",
+   .status_base = BXTWC_PWRBTNIRQ,
+   .mask_base = BXTWC_MPWRBTNIRQ,
+   .irqs = bxtwc_regmap_irqs_pwrbtn,
+   .num_irqs = ARRAY_SIZE(bxtwc_regmap_irqs_pwrbtn),
+   .num_regs = 1,
 };
 
 static struct regmap_irq_chip bxtwc_regmap_irq_chip_tmu = {
@@ -472,6 +483,16 @@ static int bxtwc_probe(struct platform_device *pdev)
return ret;
}
 
+   ret = bxtwc_add_chained_irq_chip(pmic, pmic->irq_chip_data,
+BXTWC_PWRBTN_LVL1_IRQ,
+IRQF_ONESHOT,
+_regmap_irq_chip_pwrbtn,
+>irq_chip_data_pwrbtn);
+   if (ret) {
+   dev_err(>dev, "Failed to add PWRBTN IRQ chip\n");
+   return ret;
+   }
+
ret = bxtwc_add_chained_irq_chip(pmic, pmic->irq_chip_data,
 BXTWC_TMU_LVL1_IRQ,
 IRQF_ONESHOT,
diff --git a/include/linux/mfd/intel_soc_pmic.h 
b/include/linux/mfd/intel_soc_pmic.h
index 5aacdb017a9f..806a4f095312 100644
--- a/include/linux/mfd/intel_soc_pmic.h
+++ b/include/linux/mfd/intel_soc_pmic.h
@@ -25,6 +25,7 @@ struct intel_soc_pmic {
int irq;
struct regmap *regmap;
struct regmap_irq_chip_data *irq_chip_data;
+   struct regmap_irq_chip_data *irq_chip_data_pwrbtn;
struct regmap_irq_chip_data *irq_chip_data_tmu;
struct regmap_irq_chip_data *irq_chip_data_bcu;
struct regmap_irq_chip_data *irq_chip_data_adc;
-- 
2.18.0