Commit 8a828570 authored by Andy Shevchenko's avatar Andy Shevchenko

pinctrl: cherryview: Move custom community members to separate data struct

This is a preparatory patch for bigger clean up pending for Cherryview driver.
There is no functional change intended.
Signed-off-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Acked-by: default avatarMika Westerberg <mika.westerberg@linux.intel.com>
parent 0e2d769d
...@@ -72,6 +72,16 @@ struct intel_pad_context { ...@@ -72,6 +72,16 @@ struct intel_pad_context {
u32 padctrl1; 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 * struct chv_pinctrl - CHV pinctrl private structure
* @dev: Pointer to the parent device * @dev: Pointer to the parent device
...@@ -84,8 +94,6 @@ struct intel_pad_context { ...@@ -84,8 +94,6 @@ struct intel_pad_context {
* @ncommunities: Number of communities in this pin controller * @ncommunities: Number of communities in this pin controller
* @context: Configuration saved over system sleep * @context: Configuration saved over system sleep
* @irq: Our parent irq * @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
*/ */
struct chv_pinctrl { struct chv_pinctrl {
struct device *dev; struct device *dev;
...@@ -98,9 +106,6 @@ struct chv_pinctrl { ...@@ -98,9 +106,6 @@ struct chv_pinctrl {
size_t ncommunities; size_t ncommunities;
struct intel_pinctrl_context context; struct intel_pinctrl_context context;
int irq; int irq;
unsigned int intr_lines[16];
u32 saved_intmask;
}; };
#define PINMODE_INVERT_OE BIT(15) #define PINMODE_INVERT_OE BIT(15)
...@@ -815,12 +820,13 @@ static int chv_gpio_request_enable(struct pinctrl_dev *pctldev, ...@@ -815,12 +820,13 @@ static int chv_gpio_request_enable(struct pinctrl_dev *pctldev,
return -EBUSY; return -EBUSY;
} }
} else { } else {
struct intel_community_context *cctx = &pctrl->context.communities[0];
int i; int i;
/* Reset the interrupt mapping */ /* Reset the interrupt mapping */
for (i = 0; i < ARRAY_SIZE(pctrl->intr_lines); i++) { for (i = 0; i < ARRAY_SIZE(cctx->intr_lines); i++) {
if (pctrl->intr_lines[i] == offset) { if (cctx->intr_lines[i] == offset) {
pctrl->intr_lines[i] = 0; cctx->intr_lines[i] = 0;
break; break;
} }
} }
...@@ -1310,6 +1316,7 @@ static unsigned chv_gpio_irq_startup(struct irq_data *d) ...@@ -1310,6 +1316,7 @@ static unsigned chv_gpio_irq_startup(struct irq_data *d)
if (irqd_get_trigger_type(d) == IRQ_TYPE_NONE) { if (irqd_get_trigger_type(d) == IRQ_TYPE_NONE) {
struct gpio_chip *gc = irq_data_get_irq_chip_data(d); struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
struct chv_pinctrl *pctrl = gpiochip_get_data(gc); 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 int pin = irqd_to_hwirq(d);
irq_flow_handler_t handler; irq_flow_handler_t handler;
unsigned long flags; unsigned long flags;
...@@ -1326,9 +1333,9 @@ static unsigned chv_gpio_irq_startup(struct irq_data *d) ...@@ -1326,9 +1333,9 @@ static unsigned chv_gpio_irq_startup(struct irq_data *d)
else else
handler = handle_edge_irq; handler = handle_edge_irq;
if (!pctrl->intr_lines[intsel]) { if (!cctx->intr_lines[intsel]) {
irq_set_handler_locked(d, handler); irq_set_handler_locked(d, handler);
pctrl->intr_lines[intsel] = pin; cctx->intr_lines[intsel] = pin;
} }
raw_spin_unlock_irqrestore(&chv_lock, flags); raw_spin_unlock_irqrestore(&chv_lock, flags);
} }
...@@ -1341,6 +1348,7 @@ static int chv_gpio_irq_type(struct irq_data *d, unsigned int type) ...@@ -1341,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 gpio_chip *gc = irq_data_get_irq_chip_data(d);
struct chv_pinctrl *pctrl = gpiochip_get_data(gc); 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 int pin = irqd_to_hwirq(d);
unsigned long flags; unsigned long flags;
u32 value; u32 value;
...@@ -1385,7 +1393,7 @@ static int chv_gpio_irq_type(struct irq_data *d, unsigned int type) ...@@ -1385,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_MASK;
value >>= CHV_PADCTRL0_INTSEL_SHIFT; value >>= CHV_PADCTRL0_INTSEL_SHIFT;
pctrl->intr_lines[value] = pin; cctx->intr_lines[value] = pin;
if (type & IRQ_TYPE_EDGE_BOTH) if (type & IRQ_TYPE_EDGE_BOTH)
irq_set_handler_locked(d, handle_edge_irq); irq_set_handler_locked(d, handle_edge_irq);
...@@ -1402,6 +1410,7 @@ static void chv_gpio_irq_handler(struct irq_desc *desc) ...@@ -1402,6 +1410,7 @@ static void chv_gpio_irq_handler(struct irq_desc *desc)
struct gpio_chip *gc = irq_desc_get_handler_data(desc); struct gpio_chip *gc = irq_desc_get_handler_data(desc);
struct chv_pinctrl *pctrl = gpiochip_get_data(gc); struct chv_pinctrl *pctrl = gpiochip_get_data(gc);
const struct intel_community *community = &pctrl->communities[0]; 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); struct irq_chip *chip = irq_desc_get_chip(desc);
unsigned long pending; unsigned long pending;
unsigned long flags; unsigned long flags;
...@@ -1416,7 +1425,7 @@ static void chv_gpio_irq_handler(struct irq_desc *desc) ...@@ -1416,7 +1425,7 @@ static void chv_gpio_irq_handler(struct irq_desc *desc)
for_each_set_bit(intr_line, &pending, community->nirqs) { for_each_set_bit(intr_line, &pending, community->nirqs) {
unsigned int irq, offset; unsigned int irq, offset;
offset = pctrl->intr_lines[intr_line]; offset = cctx->intr_lines[intr_line];
irq = irq_find_mapping(gc->irq.domain, offset); irq = irq_find_mapping(gc->irq.domain, offset);
generic_handle_irq(irq); generic_handle_irq(irq);
} }
...@@ -1674,6 +1683,12 @@ static int chv_pinctrl_probe(struct platform_device *pdev) ...@@ -1674,6 +1683,12 @@ static int chv_pinctrl_probe(struct platform_device *pdev)
return -ENOMEM; return -ENOMEM;
#endif #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); irq = platform_get_irq(pdev, 0);
if (irq < 0) if (irq < 0)
return irq; return irq;
...@@ -1722,12 +1737,13 @@ static int chv_pinctrl_remove(struct platform_device *pdev) ...@@ -1722,12 +1737,13 @@ static int chv_pinctrl_remove(struct platform_device *pdev)
static int chv_pinctrl_suspend_noirq(struct device *dev) static int chv_pinctrl_suspend_noirq(struct device *dev)
{ {
struct chv_pinctrl *pctrl = dev_get_drvdata(dev); struct chv_pinctrl *pctrl = dev_get_drvdata(dev);
struct intel_community_context *cctx = &pctrl->context.communities[0];
unsigned long flags; unsigned long flags;
int i; int i;
raw_spin_lock_irqsave(&chv_lock, flags); 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++) { for (i = 0; i < pctrl->soc->npins; i++) {
const struct pinctrl_pin_desc *desc; const struct pinctrl_pin_desc *desc;
...@@ -1751,6 +1767,7 @@ static int chv_pinctrl_suspend_noirq(struct device *dev) ...@@ -1751,6 +1767,7 @@ static int chv_pinctrl_suspend_noirq(struct device *dev)
static int chv_pinctrl_resume_noirq(struct device *dev) static int chv_pinctrl_resume_noirq(struct device *dev)
{ {
struct chv_pinctrl *pctrl = dev_get_drvdata(dev); struct chv_pinctrl *pctrl = dev_get_drvdata(dev);
struct intel_community_context *cctx = &pctrl->context.communities[0];
unsigned long flags; unsigned long flags;
int i; int i;
...@@ -1794,7 +1811,7 @@ static int chv_pinctrl_resume_noirq(struct device *dev) ...@@ -1794,7 +1811,7 @@ static int chv_pinctrl_resume_noirq(struct device *dev)
* the interrupt mask register as well. * the interrupt mask register as well.
*/ */
chv_pctrl_writel(pctrl, CHV_INTSTAT, 0xffff); 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); raw_spin_unlock_irqrestore(&chv_lock, flags);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment