pinctrl: stmfx: Convert to immutable irq_chip

Convert the driver to immutable irq-chip with a bit of
intuition.

This driver rolls it's own resource handling and does not
use GPIOCHIP_IRQ_RESOURCE_HELPERS.

Cc: Marc Zyngier <maz@kernel.org>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Link: https://lore.kernel.org/r/20230403-immutable-irqchips-v1-8-503788a7f6e6@linaro.org
This commit is contained in:
Linus Walleij 2023-04-04 11:43:10 +02:00
Родитель c36f8c06eb
Коммит 7341944c78
1 изменённых файлов: 24 добавлений и 12 удалений

Просмотреть файл

@ -85,7 +85,6 @@ struct stmfx_pinctrl {
struct pinctrl_dev *pctl_dev; struct pinctrl_dev *pctl_dev;
struct pinctrl_desc pctl_desc; struct pinctrl_desc pctl_desc;
struct gpio_chip gpio_chip; struct gpio_chip gpio_chip;
struct irq_chip irq_chip;
struct mutex lock; /* IRQ bus lock */ struct mutex lock; /* IRQ bus lock */
unsigned long gpio_valid_mask; unsigned long gpio_valid_mask;
/* Cache of IRQ_GPI_* registers for bus_lock */ /* Cache of IRQ_GPI_* registers for bus_lock */
@ -427,6 +426,7 @@ static void stmfx_pinctrl_irq_mask(struct irq_data *data)
u32 mask = get_mask(data->hwirq); u32 mask = get_mask(data->hwirq);
pctl->irq_gpi_src[reg] &= ~mask; pctl->irq_gpi_src[reg] &= ~mask;
gpiochip_disable_irq(gpio_chip, irqd_to_hwirq(data));
} }
static void stmfx_pinctrl_irq_unmask(struct irq_data *data) static void stmfx_pinctrl_irq_unmask(struct irq_data *data)
@ -436,6 +436,7 @@ static void stmfx_pinctrl_irq_unmask(struct irq_data *data)
u32 reg = get_reg(data->hwirq); u32 reg = get_reg(data->hwirq);
u32 mask = get_mask(data->hwirq); u32 mask = get_mask(data->hwirq);
gpiochip_enable_irq(gpio_chip, irqd_to_hwirq(data));
pctl->irq_gpi_src[reg] |= mask; pctl->irq_gpi_src[reg] |= mask;
} }
@ -592,6 +593,26 @@ static irqreturn_t stmfx_pinctrl_irq_thread_fn(int irq, void *dev_id)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
static void stmfx_pinctrl_irq_print_chip(struct irq_data *d, struct seq_file *p)
{
struct gpio_chip *gpio_chip = irq_data_get_irq_chip_data(d);
struct stmfx_pinctrl *pctl = gpiochip_get_data(gpio_chip);
seq_printf(p, dev_name(pctl->dev));
}
static const struct irq_chip stmfx_pinctrl_irq_chip = {
.irq_mask = stmfx_pinctrl_irq_mask,
.irq_unmask = stmfx_pinctrl_irq_unmask,
.irq_set_type = stmfx_pinctrl_irq_set_type,
.irq_bus_lock = stmfx_pinctrl_irq_bus_lock,
.irq_bus_sync_unlock = stmfx_pinctrl_irq_bus_sync_unlock,
.irq_request_resources = stmfx_gpio_irq_request_resources,
.irq_release_resources = stmfx_gpio_irq_release_resources,
.irq_print_chip = stmfx_pinctrl_irq_print_chip,
.flags = IRQCHIP_IMMUTABLE,
};
static int stmfx_pinctrl_gpio_function_enable(struct stmfx_pinctrl *pctl) static int stmfx_pinctrl_gpio_function_enable(struct stmfx_pinctrl *pctl)
{ {
struct pinctrl_gpio_range *gpio_range; struct pinctrl_gpio_range *gpio_range;
@ -678,17 +699,8 @@ static int stmfx_pinctrl_probe(struct platform_device *pdev)
pctl->gpio_chip.ngpio = pctl->pctl_desc.npins; pctl->gpio_chip.ngpio = pctl->pctl_desc.npins;
pctl->gpio_chip.can_sleep = true; pctl->gpio_chip.can_sleep = true;
pctl->irq_chip.name = dev_name(pctl->dev);
pctl->irq_chip.irq_mask = stmfx_pinctrl_irq_mask;
pctl->irq_chip.irq_unmask = stmfx_pinctrl_irq_unmask;
pctl->irq_chip.irq_set_type = stmfx_pinctrl_irq_set_type;
pctl->irq_chip.irq_bus_lock = stmfx_pinctrl_irq_bus_lock;
pctl->irq_chip.irq_bus_sync_unlock = stmfx_pinctrl_irq_bus_sync_unlock;
pctl->irq_chip.irq_request_resources = stmfx_gpio_irq_request_resources;
pctl->irq_chip.irq_release_resources = stmfx_gpio_irq_release_resources;
girq = &pctl->gpio_chip.irq; girq = &pctl->gpio_chip.irq;
girq->chip = &pctl->irq_chip; gpio_irq_chip_set_chip(girq, &stmfx_pinctrl_irq_chip);
/* This will let us handle the parent IRQ in the driver */ /* This will let us handle the parent IRQ in the driver */
girq->parent_handler = NULL; girq->parent_handler = NULL;
girq->num_parents = 0; girq->num_parents = 0;
@ -710,7 +722,7 @@ static int stmfx_pinctrl_probe(struct platform_device *pdev)
ret = devm_request_threaded_irq(pctl->dev, irq, NULL, ret = devm_request_threaded_irq(pctl->dev, irq, NULL,
stmfx_pinctrl_irq_thread_fn, stmfx_pinctrl_irq_thread_fn,
IRQF_ONESHOT, IRQF_ONESHOT,
pctl->irq_chip.name, pctl); dev_name(pctl->dev), pctl);
if (ret) { if (ret) {
dev_err(pctl->dev, "cannot request irq%d\n", irq); dev_err(pctl->dev, "cannot request irq%d\n", irq);
return ret; return ret;