mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-19 12:00:00 +00:00
gpio: tegra186: Make the irqchip immutable
Prevent gpiolib from messing with the irqchip by advertising the irq_chip structure as immutable, making it const, and adding the various calls that gpiolib relies upon. Acked-by: Thierry Reding <treding@nvidia.com> Reviewed-by: Bartosz Golaszewski <brgl@bgdev.pl> Signed-off-by: Marc Zyngier <maz@kernel.org> Link: https://lore.kernel.org/r/20220419141846.598305-5-maz@kernel.org
This commit is contained in:
parent
36b78aae4b
commit
bba00555ed
@ -80,7 +80,6 @@ struct tegra_gpio_soc {
|
||||
|
||||
struct tegra_gpio {
|
||||
struct gpio_chip gpio;
|
||||
struct irq_chip intc;
|
||||
unsigned int num_irq;
|
||||
unsigned int *irq;
|
||||
|
||||
@ -372,6 +371,8 @@ static void tegra186_irq_mask(struct irq_data *data)
|
||||
value = readl(base + TEGRA186_GPIO_ENABLE_CONFIG);
|
||||
value &= ~TEGRA186_GPIO_ENABLE_CONFIG_INTERRUPT;
|
||||
writel(value, base + TEGRA186_GPIO_ENABLE_CONFIG);
|
||||
|
||||
gpiochip_disable_irq(&gpio->gpio, data->hwirq);
|
||||
}
|
||||
|
||||
static void tegra186_irq_unmask(struct irq_data *data)
|
||||
@ -385,6 +386,8 @@ static void tegra186_irq_unmask(struct irq_data *data)
|
||||
if (WARN_ON(base == NULL))
|
||||
return;
|
||||
|
||||
gpiochip_enable_irq(&gpio->gpio, data->hwirq);
|
||||
|
||||
value = readl(base + TEGRA186_GPIO_ENABLE_CONFIG);
|
||||
value |= TEGRA186_GPIO_ENABLE_CONFIG_INTERRUPT;
|
||||
writel(value, base + TEGRA186_GPIO_ENABLE_CONFIG);
|
||||
@ -456,6 +459,24 @@ static int tegra186_irq_set_wake(struct irq_data *data, unsigned int on)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void tegra186_irq_print_chip(struct irq_data *data, struct seq_file *p)
|
||||
{
|
||||
struct gpio_chip *gc = irq_data_get_irq_chip_data(data);
|
||||
|
||||
seq_printf(p, dev_name(gc->parent));
|
||||
}
|
||||
|
||||
static const struct irq_chip tegra186_gpio_irq_chip = {
|
||||
.irq_ack = tegra186_irq_ack,
|
||||
.irq_mask = tegra186_irq_mask,
|
||||
.irq_unmask = tegra186_irq_unmask,
|
||||
.irq_set_type = tegra186_irq_set_type,
|
||||
.irq_set_wake = tegra186_irq_set_wake,
|
||||
.irq_print_chip = tegra186_irq_print_chip,
|
||||
.flags = IRQCHIP_IMMUTABLE,
|
||||
GPIOCHIP_IRQ_RESOURCE_HELPERS,
|
||||
};
|
||||
|
||||
static void tegra186_gpio_irq(struct irq_desc *desc)
|
||||
{
|
||||
struct tegra_gpio *gpio = irq_desc_get_handler_data(desc);
|
||||
@ -760,15 +781,8 @@ static int tegra186_gpio_probe(struct platform_device *pdev)
|
||||
gpio->gpio.of_xlate = tegra186_gpio_of_xlate;
|
||||
#endif /* CONFIG_OF_GPIO */
|
||||
|
||||
gpio->intc.name = dev_name(&pdev->dev);
|
||||
gpio->intc.irq_ack = tegra186_irq_ack;
|
||||
gpio->intc.irq_mask = tegra186_irq_mask;
|
||||
gpio->intc.irq_unmask = tegra186_irq_unmask;
|
||||
gpio->intc.irq_set_type = tegra186_irq_set_type;
|
||||
gpio->intc.irq_set_wake = tegra186_irq_set_wake;
|
||||
|
||||
irq = &gpio->gpio.irq;
|
||||
irq->chip = &gpio->intc;
|
||||
gpio_irq_chip_set_chip(irq, &tegra186_gpio_irq_chip);
|
||||
irq->fwnode = of_node_to_fwnode(pdev->dev.of_node);
|
||||
irq->child_to_parent_hwirq = tegra186_gpio_child_to_parent_hwirq;
|
||||
irq->populate_parent_alloc_arg = tegra186_gpio_populate_parent_fwspec;
|
||||
|
Loading…
x
Reference in New Issue
Block a user