pinctrl: cherryview: Move custom community members to separate data struct
[linux-2.6-microblaze.git] / drivers / pinctrl / intel / pinctrl-cherryview.c
index 9ef2461..6b2fbc0 100644 (file)
@@ -72,6 +72,16 @@ struct intel_pad_context {
        u32 padctrl1;
 };
 
+/**
+ * struct intel_community_context - community context for Cherryview
+ * @intr_lines: Mapping between 16 HW interrupt wires and GPIO offset (in GPIO number space)
+ * @saved_intmask: Interrupt mask saved for system sleep
+ */
+struct intel_community_context {
+       unsigned int intr_lines[16];
+       u32 saved_intmask;
+};
+
 /**
  * struct chv_pinctrl - CHV pinctrl private structure
  * @dev: Pointer to the parent device
@@ -84,11 +94,6 @@ struct intel_pad_context {
  * @ncommunities: Number of communities in this pin controller
  * @context: Configuration saved over system sleep
  * @irq: Our parent irq
- * @intr_lines: Mapping between 16 HW interrupt wires and GPIO offset (in GPIO number space)
- * @saved_intmask: Interrupt mask saved for system sleep
- *
- * The first group in @groups is expected to contain all pins that can be
- * used as GPIOs.
  */
 struct chv_pinctrl {
        struct device *dev;
@@ -101,9 +106,6 @@ struct chv_pinctrl {
        size_t ncommunities;
        struct intel_pinctrl_context context;
        int irq;
-
-       unsigned int intr_lines[16];
-       u32 saved_intmask;
 };
 
 #define        PINMODE_INVERT_OE       BIT(15)
@@ -818,12 +820,13 @@ static int chv_gpio_request_enable(struct pinctrl_dev *pctldev,
                        return -EBUSY;
                }
        } else {
+               struct intel_community_context *cctx = &pctrl->context.communities[0];
                int i;
 
                /* Reset the interrupt mapping */
-               for (i = 0; i < ARRAY_SIZE(pctrl->intr_lines); i++) {
-                       if (pctrl->intr_lines[i] == offset) {
-                               pctrl->intr_lines[i] = 0;
+               for (i = 0; i < ARRAY_SIZE(cctx->intr_lines); i++) {
+                       if (cctx->intr_lines[i] == offset) {
+                               cctx->intr_lines[i] = 0;
                                break;
                        }
                }
@@ -1313,6 +1316,7 @@ static unsigned chv_gpio_irq_startup(struct irq_data *d)
        if (irqd_get_trigger_type(d) == IRQ_TYPE_NONE) {
                struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
                struct chv_pinctrl *pctrl = gpiochip_get_data(gc);
+               struct intel_community_context *cctx = &pctrl->context.communities[0];
                unsigned int pin = irqd_to_hwirq(d);
                irq_flow_handler_t handler;
                unsigned long flags;
@@ -1329,9 +1333,9 @@ static unsigned chv_gpio_irq_startup(struct irq_data *d)
                else
                        handler = handle_edge_irq;
 
-               if (!pctrl->intr_lines[intsel]) {
+               if (!cctx->intr_lines[intsel]) {
                        irq_set_handler_locked(d, handler);
-                       pctrl->intr_lines[intsel] = pin;
+                       cctx->intr_lines[intsel] = pin;
                }
                raw_spin_unlock_irqrestore(&chv_lock, flags);
        }
@@ -1344,6 +1348,7 @@ static int chv_gpio_irq_type(struct irq_data *d, unsigned int type)
 {
        struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
        struct chv_pinctrl *pctrl = gpiochip_get_data(gc);
+       struct intel_community_context *cctx = &pctrl->context.communities[0];
        unsigned int pin = irqd_to_hwirq(d);
        unsigned long flags;
        u32 value;
@@ -1388,7 +1393,7 @@ static int chv_gpio_irq_type(struct irq_data *d, unsigned int type)
        value &= CHV_PADCTRL0_INTSEL_MASK;
        value >>= CHV_PADCTRL0_INTSEL_SHIFT;
 
-       pctrl->intr_lines[value] = pin;
+       cctx->intr_lines[value] = pin;
 
        if (type & IRQ_TYPE_EDGE_BOTH)
                irq_set_handler_locked(d, handle_edge_irq);
@@ -1405,6 +1410,7 @@ static void chv_gpio_irq_handler(struct irq_desc *desc)
        struct gpio_chip *gc = irq_desc_get_handler_data(desc);
        struct chv_pinctrl *pctrl = gpiochip_get_data(gc);
        const struct intel_community *community = &pctrl->communities[0];
+       struct intel_community_context *cctx = &pctrl->context.communities[0];
        struct irq_chip *chip = irq_desc_get_chip(desc);
        unsigned long pending;
        unsigned long flags;
@@ -1419,7 +1425,7 @@ static void chv_gpio_irq_handler(struct irq_desc *desc)
        for_each_set_bit(intr_line, &pending, community->nirqs) {
                unsigned int irq, offset;
 
-               offset = pctrl->intr_lines[intr_line];
+               offset = cctx->intr_lines[intr_line];
                irq = irq_find_mapping(gc->irq.domain, offset);
                generic_handle_irq(irq);
        }
@@ -1677,6 +1683,12 @@ static int chv_pinctrl_probe(struct platform_device *pdev)
                return -ENOMEM;
 #endif
 
+       pctrl->context.communities = devm_kcalloc(dev, pctrl->soc->ncommunities,
+                                                 sizeof(*pctrl->context.communities),
+                                                 GFP_KERNEL);
+       if (!pctrl->context.communities)
+               return -ENOMEM;
+
        irq = platform_get_irq(pdev, 0);
        if (irq < 0)
                return irq;
@@ -1725,12 +1737,13 @@ static int chv_pinctrl_remove(struct platform_device *pdev)
 static int chv_pinctrl_suspend_noirq(struct device *dev)
 {
        struct chv_pinctrl *pctrl = dev_get_drvdata(dev);
+       struct intel_community_context *cctx = &pctrl->context.communities[0];
        unsigned long flags;
        int i;
 
        raw_spin_lock_irqsave(&chv_lock, flags);
 
-       pctrl->saved_intmask = chv_pctrl_readl(pctrl, CHV_INTMASK);
+       cctx->saved_intmask = chv_pctrl_readl(pctrl, CHV_INTMASK);
 
        for (i = 0; i < pctrl->soc->npins; i++) {
                const struct pinctrl_pin_desc *desc;
@@ -1754,6 +1767,7 @@ static int chv_pinctrl_suspend_noirq(struct device *dev)
 static int chv_pinctrl_resume_noirq(struct device *dev)
 {
        struct chv_pinctrl *pctrl = dev_get_drvdata(dev);
+       struct intel_community_context *cctx = &pctrl->context.communities[0];
        unsigned long flags;
        int i;
 
@@ -1797,7 +1811,7 @@ static int chv_pinctrl_resume_noirq(struct device *dev)
         * the interrupt mask register as well.
         */
        chv_pctrl_writel(pctrl, CHV_INTSTAT, 0xffff);
-       chv_pctrl_writel(pctrl, CHV_INTMASK, pctrl->saved_intmask);
+       chv_pctrl_writel(pctrl, CHV_INTMASK, cctx->saved_intmask);
 
        raw_spin_unlock_irqrestore(&chv_lock, flags);