diff options
Diffstat (limited to 'drivers/gpio/gpio-mlxbf2.c')
| -rw-r--r-- | drivers/gpio/gpio-mlxbf2.c | 32 | 
1 files changed, 25 insertions, 7 deletions
diff --git a/drivers/gpio/gpio-mlxbf2.c b/drivers/gpio/gpio-mlxbf2.c index 77a41151c921..6abe01bc39c3 100644 --- a/drivers/gpio/gpio-mlxbf2.c +++ b/drivers/gpio/gpio-mlxbf2.c @@ -17,6 +17,7 @@  #include <linux/platform_device.h>  #include <linux/pm.h>  #include <linux/resource.h> +#include <linux/seq_file.h>  #include <linux/spinlock.h>  #include <linux/types.h> @@ -65,10 +66,10 @@ struct mlxbf2_gpio_context_save_regs {  /* BlueField-2 gpio block context structure. */  struct mlxbf2_gpio_context {  	struct gpio_chip gc; -	struct irq_chip irq_chip;  	/* YU GPIO blocks address */  	void __iomem *gpio_io; +	struct device *dev;  	struct mlxbf2_gpio_context_save_regs *csave_regs;  }; @@ -237,6 +238,7 @@ static void mlxbf2_gpio_irq_enable(struct irq_data *irqd)  	unsigned long flags;  	u32 val; +	gpiochip_enable_irq(gc, irqd_to_hwirq(irqd));  	raw_spin_lock_irqsave(&gs->gc.bgpio_lock, flags);  	val = readl(gs->gpio_io + YU_GPIO_CAUSE_OR_CLRCAUSE);  	val |= BIT(offset); @@ -261,6 +263,7 @@ static void mlxbf2_gpio_irq_disable(struct irq_data *irqd)  	val &= ~BIT(offset);  	writel(val, gs->gpio_io + YU_GPIO_CAUSE_OR_EVTEN0);  	raw_spin_unlock_irqrestore(&gs->gc.bgpio_lock, flags); +	gpiochip_disable_irq(gc, irqd_to_hwirq(irqd));  }  static irqreturn_t mlxbf2_gpio_irq_handler(int irq, void *ptr) @@ -322,6 +325,24 @@ mlxbf2_gpio_irq_set_type(struct irq_data *irqd, unsigned int type)  	return 0;  } +static void mlxbf2_gpio_irq_print_chip(struct irq_data *irqd, +				       struct seq_file *p) +{ +	struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd); +	struct mlxbf2_gpio_context *gs = gpiochip_get_data(gc); + +	seq_printf(p, dev_name(gs->dev)); +} + +static const struct irq_chip mlxbf2_gpio_irq_chip = { +	.irq_set_type = mlxbf2_gpio_irq_set_type, +	.irq_enable = mlxbf2_gpio_irq_enable, +	.irq_disable = mlxbf2_gpio_irq_disable, +	.irq_print_chip = mlxbf2_gpio_irq_print_chip, +	.flags = IRQCHIP_IMMUTABLE, +	GPIOCHIP_IRQ_RESOURCE_HELPERS, +}; +  /* BlueField-2 GPIO driver initialization routine. */  static int  mlxbf2_gpio_probe(struct platform_device *pdev) @@ -340,6 +361,8 @@ mlxbf2_gpio_probe(struct platform_device *pdev)  	if (!gs)  		return -ENOMEM; +	gs->dev = dev; +  	/* YU GPIO block address */  	gs->gpio_io = devm_platform_ioremap_resource(pdev, 0);  	if (IS_ERR(gs->gpio_io)) @@ -376,13 +399,8 @@ mlxbf2_gpio_probe(struct platform_device *pdev)  	irq = platform_get_irq(pdev, 0);  	if (irq >= 0) { -		gs->irq_chip.name = name; -		gs->irq_chip.irq_set_type = mlxbf2_gpio_irq_set_type; -		gs->irq_chip.irq_enable = mlxbf2_gpio_irq_enable; -		gs->irq_chip.irq_disable = mlxbf2_gpio_irq_disable; -  		girq = &gs->gc.irq; -		girq->chip = &gs->irq_chip; +		gpio_irq_chip_set_chip(girq, &mlxbf2_gpio_irq_chip);  		girq->handler = handle_simple_irq;  		girq->default_type = IRQ_TYPE_NONE;  		/* This will let us handle the parent IRQ in the driver */  |