lkml.org 
[lkml]   [2020]   [Jun]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v4 03/11] irqchip: add sl28cpld interrupt controller support
    Date
    Add support for the interrupt controller inside the sl28 CPLD management
    controller.

    The interrupt controller can handle at most 8 interrupts and is really
    simplistic and consists only of an interrupt mask and an interrupt
    pending register.

    Signed-off-by: Michael Walle <michael@walle.cc>
    ---
    drivers/irqchip/Kconfig | 3 +
    drivers/irqchip/Makefile | 1 +
    drivers/irqchip/irq-sl28cpld.c | 102 +++++++++++++++++++++++++++++++++
    drivers/mfd/Kconfig | 2 +
    4 files changed, 108 insertions(+)
    create mode 100644 drivers/irqchip/irq-sl28cpld.c

    diff --git a/drivers/irqchip/Kconfig b/drivers/irqchip/Kconfig
    index 3e473f4eb175..c4b840bc982e 100644
    --- a/drivers/irqchip/Kconfig
    +++ b/drivers/irqchip/Kconfig
    @@ -246,6 +246,9 @@ config RENESAS_RZA1_IRQC
    Enable support for the Renesas RZ/A1 Interrupt Controller, to use up
    to 8 external interrupts with configurable sense select.

    +config SL28CPLD_INTC
    + bool
    +
    config ST_IRQCHIP
    bool
    select REGMAP
    diff --git a/drivers/irqchip/Makefile b/drivers/irqchip/Makefile
    index 3a4ce283189a..bcd9797a5aed 100644
    --- a/drivers/irqchip/Makefile
    +++ b/drivers/irqchip/Makefile
    @@ -110,3 +110,4 @@ obj-$(CONFIG_LOONGSON_HTPIC) += irq-loongson-htpic.o
    obj-$(CONFIG_LOONGSON_HTVEC) += irq-loongson-htvec.o
    obj-$(CONFIG_LOONGSON_PCH_PIC) += irq-loongson-pch-pic.o
    obj-$(CONFIG_LOONGSON_PCH_MSI) += irq-loongson-pch-msi.o
    +obj-$(CONFIG_SL28CPLD_INTC) += irq-sl28cpld.o
    diff --git a/drivers/irqchip/irq-sl28cpld.c b/drivers/irqchip/irq-sl28cpld.c
    new file mode 100644
    index 000000000000..2151f1b390d7
    --- /dev/null
    +++ b/drivers/irqchip/irq-sl28cpld.c
    @@ -0,0 +1,102 @@
    +// SPDX-License-Identifier: GPL-2.0-only
    +/*
    + * sl28cpld interrupt controller driver.
    + *
    + * Copyright 2019 Kontron Europe GmbH
    + */
    +
    +#include <linux/interrupt.h>
    +#include <linux/kernel.h>
    +#include <linux/mod_devicetable.h>
    +#include <linux/module.h>
    +#include <linux/platform_device.h>
    +#include <linux/property.h>
    +#include <linux/regmap.h>
    +
    +#define INTC_IE 0x00
    +#define INTC_IP 0x01
    +
    +static const struct regmap_irq sl28cpld_irqs[] = {
    + REGMAP_IRQ_REG_LINE(0, 8),
    + REGMAP_IRQ_REG_LINE(1, 8),
    + REGMAP_IRQ_REG_LINE(2, 8),
    + REGMAP_IRQ_REG_LINE(3, 8),
    + REGMAP_IRQ_REG_LINE(4, 8),
    + REGMAP_IRQ_REG_LINE(5, 8),
    + REGMAP_IRQ_REG_LINE(6, 8),
    + REGMAP_IRQ_REG_LINE(7, 8),
    +};
    +
    +struct sl28cpld_intc {
    + struct regmap *regmap;
    + struct regmap_irq_chip chip;
    + struct regmap_irq_chip_data *irq_data;
    +};
    +
    +static int sl28cpld_intc_probe(struct platform_device *pdev)
    +{
    + struct device *dev = &pdev->dev;
    + struct sl28cpld_intc *irqchip;
    + unsigned int irq;
    + u32 base;
    + int ret;
    +
    + if (!dev->parent)
    + return -ENODEV;
    +
    + irqchip = devm_kzalloc(dev, sizeof(*irqchip), GFP_KERNEL);
    + if (!irqchip)
    + return -ENOMEM;
    +
    + irqchip->regmap = dev_get_regmap(dev->parent, NULL);
    + if (!irqchip->regmap)
    + return -ENODEV;
    +
    + irq = platform_get_irq(pdev, 0);
    + if (irq < 0)
    + return irq;
    +
    + ret = device_property_read_u32(&pdev->dev, "reg", &base);
    + if (ret)
    + return -EINVAL;
    +
    + irqchip->chip.name = "sl28cpld-intc";
    + irqchip->chip.irqs = sl28cpld_irqs;
    + irqchip->chip.num_irqs = ARRAY_SIZE(sl28cpld_irqs);
    + irqchip->chip.num_regs = 1;
    + irqchip->chip.status_base = base + INTC_IP;
    + irqchip->chip.mask_base = base + INTC_IE;
    + irqchip->chip.mask_invert = true,
    + irqchip->chip.ack_base = base + INTC_IP;
    +
    + return devm_regmap_add_irq_chip_np(&pdev->dev, dev->of_node,
    + irqchip->regmap, irq,
    + IRQF_SHARED | IRQF_ONESHOT, 0,
    + &irqchip->chip, &irqchip->irq_data);
    +}
    +
    +static const struct of_device_id sl28cpld_intc_of_match[] = {
    + { .compatible = "kontron,sl28cpld-intc" },
    + {},
    +};
    +MODULE_DEVICE_TABLE(of, sl28cpld_intc_of_match);
    +
    +static const struct platform_device_id sl28cpld_intc_id_table[] = {
    + { "sl28cpld-intc" },
    + {}
    +};
    +MODULE_DEVICE_TABLE(platform, sl28cpld_intc_id_table);
    +
    +static struct platform_driver sl28cpld_intc_driver = {
    + .probe = sl28cpld_intc_probe,
    + .id_table = sl28cpld_intc_id_table,
    + .driver = {
    + .name = KBUILD_MODNAME,
    + .of_match_table = sl28cpld_intc_of_match,
    + }
    +};
    +module_platform_driver(sl28cpld_intc_driver);
    +
    +MODULE_DESCRIPTION("sl28cpld Interrupt Controller Driver");
    +MODULE_AUTHOR("Michael Walle <michael@walle.cc>");
    +MODULE_LICENSE("GPL");
    diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
    index 5c0cd514d197..9c84c5746698 100644
    --- a/drivers/mfd/Kconfig
    +++ b/drivers/mfd/Kconfig
    @@ -2114,6 +2114,8 @@ config MFD_SL28CPLD
    depends on I2C=y
    depends on OF
    select REGMAP_I2C
    + select REGMAP_IRQ
    + select SL28CPLD_INTC
    select MFD_CORE
    help
    This option enables support for the board management controller
    --
    2.20.1
    \
     
     \ /
      Last update: 2020-06-04 23:12    [W:4.103 / U:0.048 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site