diff options
| author | Dmitry Torokhov <[email protected]> | 2023-08-30 16:06:38 -0700 | 
|---|---|---|
| committer | Dmitry Torokhov <[email protected]> | 2023-08-30 16:06:38 -0700 | 
| commit | 1ac731c529cd4d6adbce134754b51ff7d822b145 (patch) | |
| tree | 143ab3f35ca5f3b69f583c84e6964b17139c2ec1 /drivers/gpio/gpio-hlwd.c | |
| parent | 07b4c950f27bef0362dc6ad7ee713aab61d58149 (diff) | |
| parent | 54116d442e001e1b6bd482122043b1870998a1f3 (diff) | |
Merge branch 'next' into for-linus
Prepare input updates for 6.6 merge window.
Diffstat (limited to 'drivers/gpio/gpio-hlwd.c')
| -rw-r--r-- | drivers/gpio/gpio-hlwd.c | 33 | 
1 files changed, 25 insertions, 8 deletions
diff --git a/drivers/gpio/gpio-hlwd.c b/drivers/gpio/gpio-hlwd.c index 4e13e937f832..c208ac1c54a6 100644 --- a/drivers/gpio/gpio-hlwd.c +++ b/drivers/gpio/gpio-hlwd.c @@ -11,6 +11,7 @@  #include <linux/module.h>  #include <linux/of.h>  #include <linux/of_platform.h> +#include <linux/seq_file.h>  #include <linux/slab.h>  /* @@ -48,7 +49,7 @@  struct hlwd_gpio {  	struct gpio_chip gpioc; -	struct irq_chip irqc; +	struct device *dev;  	void __iomem *regs;  	int irq;  	u32 edge_emulation; @@ -123,6 +124,7 @@ static void hlwd_gpio_irq_mask(struct irq_data *data)  	mask &= ~BIT(data->hwirq);  	iowrite32be(mask, hlwd->regs + HW_GPIOB_INTMASK);  	raw_spin_unlock_irqrestore(&hlwd->gpioc.bgpio_lock, flags); +	gpiochip_disable_irq(&hlwd->gpioc, irqd_to_hwirq(data));  }  static void hlwd_gpio_irq_unmask(struct irq_data *data) @@ -132,6 +134,7 @@ static void hlwd_gpio_irq_unmask(struct irq_data *data)  	unsigned long flags;  	u32 mask; +	gpiochip_enable_irq(&hlwd->gpioc, irqd_to_hwirq(data));  	raw_spin_lock_irqsave(&hlwd->gpioc.bgpio_lock, flags);  	mask = ioread32be(hlwd->regs + HW_GPIOB_INTMASK);  	mask |= BIT(data->hwirq); @@ -202,6 +205,24 @@ static int hlwd_gpio_irq_set_type(struct irq_data *data, unsigned int flow_type)  	return 0;  } +static void hlwd_gpio_irq_print_chip(struct irq_data *data, struct seq_file *p) +{ +	struct hlwd_gpio *hlwd = +		gpiochip_get_data(irq_data_get_irq_chip_data(data)); + +	seq_printf(p, dev_name(hlwd->dev)); +} + +static const struct irq_chip hlwd_gpio_irq_chip = { +	.irq_mask = hlwd_gpio_irq_mask, +	.irq_unmask = hlwd_gpio_irq_unmask, +	.irq_enable = hlwd_gpio_irq_enable, +	.irq_set_type = hlwd_gpio_irq_set_type, +	.irq_print_chip = hlwd_gpio_irq_print_chip, +	.flags = IRQCHIP_IMMUTABLE, +	GPIOCHIP_IRQ_RESOURCE_HELPERS, +}; +  static int hlwd_gpio_probe(struct platform_device *pdev)  {  	struct hlwd_gpio *hlwd; @@ -216,6 +237,8 @@ static int hlwd_gpio_probe(struct platform_device *pdev)  	if (IS_ERR(hlwd->regs))  		return PTR_ERR(hlwd->regs); +	hlwd->dev = &pdev->dev; +  	/*  	 * Claim all GPIOs using the OWNER register. This will not work on  	 * systems where the AHBPROT memory firewall hasn't been configured to @@ -259,14 +282,8 @@ static int hlwd_gpio_probe(struct platform_device *pdev)  			return hlwd->irq;  		} -		hlwd->irqc.name = dev_name(&pdev->dev); -		hlwd->irqc.irq_mask = hlwd_gpio_irq_mask; -		hlwd->irqc.irq_unmask = hlwd_gpio_irq_unmask; -		hlwd->irqc.irq_enable = hlwd_gpio_irq_enable; -		hlwd->irqc.irq_set_type = hlwd_gpio_irq_set_type; -  		girq = &hlwd->gpioc.irq; -		girq->chip = &hlwd->irqc; +		gpio_irq_chip_set_chip(girq, &hlwd_gpio_irq_chip);  		girq->parent_handler = hlwd_gpio_irqhandler;  		girq->num_parents = 1;  		girq->parents = devm_kcalloc(&pdev->dev, 1,  |