mfd: qcom-pm8008: Convert irq chip to config regs
authorAidan MacDonald <aidanmacdonald.0x0@gmail.com>
Thu, 16 Feb 2023 22:22:12 +0000 (22:22 +0000)
committerLee Jones <lee@kernel.org>
Wed, 26 Apr 2023 10:40:28 +0000 (11:40 +0100)
Replace type and virtual registers, which are both deprecated,
with config registers. This also simplifies the driver because
IRQ types are set in one place, the set_type_config() callback.

Signed-off-by: Aidan MacDonald <aidanmacdonald.0x0@gmail.com>
[Lee: Squashed in fix-up patch from Stephen Rothwell adapting to new .set_type_config() API]
Signed-off-by: Stephen Rothwell <sfr@canb.auug.org.au>
Signed-off-by: Lee Jones <lee@kernel.org>
Link: https://lore.kernel.org/r/20230216222214.138671-3-aidanmacdonald.0x0@gmail.com
drivers/mfd/qcom-pm8008.c

index 39fd2a792e736236cf9602d436355eb3fafdc67f..d502ecf0559039188731fb6ad214ea5ddad2caf8 100644 (file)
@@ -66,15 +66,16 @@ static struct regmap_irq_sub_irq_map pm8008_sub_reg_offsets[] = {
        REGMAP_IRQ_MAIN_REG_OFFSET(p3_offs),
 };
 
-static unsigned int pm8008_virt_regs[] = {
-       PM8008_POLARITY_HI_BASE,
-       PM8008_POLARITY_LO_BASE,
-};
-
 enum {
+       SET_TYPE_INDEX,
        POLARITY_HI_INDEX,
        POLARITY_LO_INDEX,
-       PM8008_NUM_VIRT_REGS,
+};
+
+static unsigned int pm8008_config_regs[] = {
+       PM8008_TYPE_BASE,
+       PM8008_POLARITY_HI_BASE,
+       PM8008_POLARITY_LO_BASE,
 };
 
 static struct regmap_irq pm8008_irqs[] = {
@@ -88,32 +89,37 @@ static struct regmap_irq pm8008_irqs[] = {
        REGMAP_IRQ_REG(PM8008_IRQ_GPIO2,        PM8008_GPIO2,   BIT(0)),
 };
 
-static int pm8008_set_type_virt(unsigned int **virt_buf,
-                                     unsigned int type, unsigned long hwirq,
-                                     int reg)
+static int pm8008_set_type_config(unsigned int **buf, unsigned int type,
+                                 const struct regmap_irq *irq_data, int idx,
+                                 void *irq_drv_data)
 {
        switch (type) {
        case IRQ_TYPE_EDGE_FALLING:
        case IRQ_TYPE_LEVEL_LOW:
-               virt_buf[POLARITY_HI_INDEX][reg] &= ~pm8008_irqs[hwirq].mask;
-               virt_buf[POLARITY_LO_INDEX][reg] |= pm8008_irqs[hwirq].mask;
+               buf[POLARITY_HI_INDEX][idx] &= ~irq_data->mask;
+               buf[POLARITY_LO_INDEX][idx] |= irq_data->mask;
                break;
 
        case IRQ_TYPE_EDGE_RISING:
        case IRQ_TYPE_LEVEL_HIGH:
-               virt_buf[POLARITY_HI_INDEX][reg] |= pm8008_irqs[hwirq].mask;
-               virt_buf[POLARITY_LO_INDEX][reg] &= ~pm8008_irqs[hwirq].mask;
+               buf[POLARITY_HI_INDEX][idx] |= irq_data->mask;
+               buf[POLARITY_LO_INDEX][idx] &= ~irq_data->mask;
                break;
 
        case IRQ_TYPE_EDGE_BOTH:
-               virt_buf[POLARITY_HI_INDEX][reg] |= pm8008_irqs[hwirq].mask;
-               virt_buf[POLARITY_LO_INDEX][reg] |= pm8008_irqs[hwirq].mask;
+               buf[POLARITY_HI_INDEX][idx] |= irq_data->mask;
+               buf[POLARITY_LO_INDEX][idx] |= irq_data->mask;
                break;
 
        default:
                return -EINVAL;
        }
 
+       if (type & IRQ_TYPE_EDGE_BOTH)
+               buf[SET_TYPE_INDEX][idx] |= irq_data->mask;
+       else
+               buf[SET_TYPE_INDEX][idx] &= ~irq_data->mask;
+
        return 0;
 }
 
@@ -121,21 +127,20 @@ static struct regmap_irq_chip pm8008_irq_chip = {
        .name                   = "pm8008_irq",
        .main_status            = I2C_INTR_STATUS_BASE,
        .num_main_regs          = 1,
-       .num_virt_regs          = PM8008_NUM_VIRT_REGS,
        .irqs                   = pm8008_irqs,
        .num_irqs               = ARRAY_SIZE(pm8008_irqs),
        .num_regs               = PM8008_NUM_PERIPHS,
        .not_fixed_stride       = true,
        .sub_reg_offsets        = pm8008_sub_reg_offsets,
-       .set_type_virt          = pm8008_set_type_virt,
        .status_base            = PM8008_STATUS_BASE,
        .mask_base              = PM8008_MASK_BASE,
        .unmask_base            = PM8008_UNMASK_BASE,
        .mask_unmask_non_inverted = true,
-       .type_base              = PM8008_TYPE_BASE,
        .ack_base               = PM8008_ACK_BASE,
-       .virt_reg_base          = pm8008_virt_regs,
-       .num_type_reg           = PM8008_NUM_PERIPHS,
+       .config_base            = pm8008_config_regs,
+       .num_config_bases       = ARRAY_SIZE(pm8008_config_regs),
+       .num_config_regs        = PM8008_NUM_PERIPHS,
+       .set_type_config        = pm8008_set_type_config,
 };
 
 static struct regmap_config qcom_mfd_regmap_cfg = {
@@ -185,11 +190,7 @@ static int pm8008_probe_irq_peripherals(struct device *dev,
        for (i = 0; i < ARRAY_SIZE(pm8008_irqs); i++) {
                type = &pm8008_irqs[i].type;
 
-               type->type_reg_offset     = pm8008_irqs[i].reg_offset;
-               type->type_rising_val     = pm8008_irqs[i].mask;
-               type->type_falling_val    = pm8008_irqs[i].mask;
-               type->type_level_high_val = 0;
-               type->type_level_low_val  = 0;
+               type->type_reg_offset = pm8008_irqs[i].reg_offset;
 
                if (type->type_reg_offset == PM8008_MISC)
                        type->types_supported = IRQ_TYPE_EDGE_RISING;