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

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
Loading
Loading
Loading
Loading
+31 −14
Original line number Diff line number Diff line
@@ -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);