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: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Acked-by: Mika Westerberg <mika.westerberg@linux.intel.com>
This commit is contained in:
parent
0e2d769d4b
commit
8a82857077
|
@ -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,8 +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
|
||||
*/
|
||||
struct chv_pinctrl {
|
||||
struct device *dev;
|
||||
|
@ -98,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)
|
||||
|
@ -815,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;
|
||||
}
|
||||
}
|
||||
|
@ -1310,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;
|
||||
|
@ -1326,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);
|
||||
}
|
||||
|
@ -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 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;
|
||||
|
@ -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_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);
|
||||
|
@ -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 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;
|
||||
|
@ -1416,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);
|
||||
}
|
||||
|
@ -1674,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;
|
||||
|
@ -1722,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;
|
||||
|
@ -1751,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;
|
||||
|
||||
|
@ -1794,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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue