mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2025-01-19 04:14:49 +08:00
gpio: ftgpio010: Make irqchip immutable
This turns the FTGPIO010 irqchip immutable. Tested on the D-Link DIR-685. Cc: Marc Zyngier <maz@kernel.org> Signed-off-by: Linus Walleij <linus.walleij@linaro.org> Acked-by: Marc Zyngier <maz@kernel.org> Signed-off-by: Bartosz Golaszewski <brgl@bgdev.pl>
This commit is contained in:
parent
02743c4091
commit
ab637d4836
@ -41,14 +41,12 @@
|
|||||||
* struct ftgpio_gpio - Gemini GPIO state container
|
* struct ftgpio_gpio - Gemini GPIO state container
|
||||||
* @dev: containing device for this instance
|
* @dev: containing device for this instance
|
||||||
* @gc: gpiochip for this instance
|
* @gc: gpiochip for this instance
|
||||||
* @irq: irqchip for this instance
|
|
||||||
* @base: remapped I/O-memory base
|
* @base: remapped I/O-memory base
|
||||||
* @clk: silicon clock
|
* @clk: silicon clock
|
||||||
*/
|
*/
|
||||||
struct ftgpio_gpio {
|
struct ftgpio_gpio {
|
||||||
struct device *dev;
|
struct device *dev;
|
||||||
struct gpio_chip gc;
|
struct gpio_chip gc;
|
||||||
struct irq_chip irq;
|
|
||||||
void __iomem *base;
|
void __iomem *base;
|
||||||
struct clk *clk;
|
struct clk *clk;
|
||||||
};
|
};
|
||||||
@ -70,6 +68,7 @@ static void ftgpio_gpio_mask_irq(struct irq_data *d)
|
|||||||
val = readl(g->base + GPIO_INT_EN);
|
val = readl(g->base + GPIO_INT_EN);
|
||||||
val &= ~BIT(irqd_to_hwirq(d));
|
val &= ~BIT(irqd_to_hwirq(d));
|
||||||
writel(val, g->base + GPIO_INT_EN);
|
writel(val, g->base + GPIO_INT_EN);
|
||||||
|
gpiochip_disable_irq(gc, irqd_to_hwirq(d));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ftgpio_gpio_unmask_irq(struct irq_data *d)
|
static void ftgpio_gpio_unmask_irq(struct irq_data *d)
|
||||||
@ -78,6 +77,7 @@ static void ftgpio_gpio_unmask_irq(struct irq_data *d)
|
|||||||
struct ftgpio_gpio *g = gpiochip_get_data(gc);
|
struct ftgpio_gpio *g = gpiochip_get_data(gc);
|
||||||
u32 val;
|
u32 val;
|
||||||
|
|
||||||
|
gpiochip_enable_irq(gc, irqd_to_hwirq(d));
|
||||||
val = readl(g->base + GPIO_INT_EN);
|
val = readl(g->base + GPIO_INT_EN);
|
||||||
val |= BIT(irqd_to_hwirq(d));
|
val |= BIT(irqd_to_hwirq(d));
|
||||||
writel(val, g->base + GPIO_INT_EN);
|
writel(val, g->base + GPIO_INT_EN);
|
||||||
@ -221,6 +221,16 @@ static int ftgpio_gpio_set_config(struct gpio_chip *gc, unsigned int offset,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const struct irq_chip ftgpio_irq_chip = {
|
||||||
|
.name = "FTGPIO010",
|
||||||
|
.irq_ack = ftgpio_gpio_ack_irq,
|
||||||
|
.irq_mask = ftgpio_gpio_mask_irq,
|
||||||
|
.irq_unmask = ftgpio_gpio_unmask_irq,
|
||||||
|
.irq_set_type = ftgpio_gpio_set_irq_type,
|
||||||
|
.flags = IRQCHIP_IMMUTABLE,
|
||||||
|
GPIOCHIP_IRQ_RESOURCE_HELPERS,
|
||||||
|
};
|
||||||
|
|
||||||
static int ftgpio_gpio_probe(struct platform_device *pdev)
|
static int ftgpio_gpio_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct device *dev = &pdev->dev;
|
struct device *dev = &pdev->dev;
|
||||||
@ -277,14 +287,8 @@ static int ftgpio_gpio_probe(struct platform_device *pdev)
|
|||||||
if (!IS_ERR(g->clk))
|
if (!IS_ERR(g->clk))
|
||||||
g->gc.set_config = ftgpio_gpio_set_config;
|
g->gc.set_config = ftgpio_gpio_set_config;
|
||||||
|
|
||||||
g->irq.name = "FTGPIO010";
|
|
||||||
g->irq.irq_ack = ftgpio_gpio_ack_irq;
|
|
||||||
g->irq.irq_mask = ftgpio_gpio_mask_irq;
|
|
||||||
g->irq.irq_unmask = ftgpio_gpio_unmask_irq;
|
|
||||||
g->irq.irq_set_type = ftgpio_gpio_set_irq_type;
|
|
||||||
|
|
||||||
girq = &g->gc.irq;
|
girq = &g->gc.irq;
|
||||||
girq->chip = &g->irq;
|
gpio_irq_chip_set_chip(girq, &ftgpio_irq_chip);
|
||||||
girq->parent_handler = ftgpio_gpio_irq_handler;
|
girq->parent_handler = ftgpio_gpio_irq_handler;
|
||||||
girq->num_parents = 1;
|
girq->num_parents = 1;
|
||||||
girq->parents = devm_kcalloc(dev, 1, sizeof(*girq->parents),
|
girq->parents = devm_kcalloc(dev, 1, sizeof(*girq->parents),
|
||||||
|
Loading…
Reference in New Issue
Block a user