Message ID | 20200604211039.12689-4-michael@walle.cc (mailing list archive) |
---|---|
State | Not Applicable |
Headers | show |
Series | Add support for Kontron sl28cpld | expand |
Hi Michael, I love your patch! Perhaps something to improve: [auto build test WARNING on next-20200604] [cannot apply to gpio/for-next hwmon/hwmon-next ljones-mfd/for-mfd-next shawnguo/for-next v5.7 v5.7-rc7 v5.7-rc6 v5.7] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system. BTW, we also suggest to use '--base' option to specify the base tree in git format-patch, please see https://stackoverflow.com/a/37406982] url: https://github.com/0day-ci/linux/commits/Michael-Walle/Add-support-for-Kontron-sl28cpld/20200605-051333 base: d4899e5542c15062cc55cac0ca99025bb64edc61 config: mips-allyesconfig (attached as .config) compiler: mips-linux-gcc (GCC) 9.3.0 reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # save the attached .config to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=mips If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@intel.com> All warnings (new ones prefixed by >>, old ones prefixed by <<): drivers/irqchip/irq-sl28cpld.c: In function 'sl28cpld_intc_probe': >> drivers/irqchip/irq-sl28cpld.c:56:10: warning: comparison of unsigned expression < 0 is always false [-Wtype-limits] 56 | if (irq < 0) | ^ vim +56 drivers/irqchip/irq-sl28cpld.c 35 36 static int sl28cpld_intc_probe(struct platform_device *pdev) 37 { 38 struct device *dev = &pdev->dev; 39 struct sl28cpld_intc *irqchip; 40 unsigned int irq; 41 u32 base; 42 int ret; 43 44 if (!dev->parent) 45 return -ENODEV; 46 47 irqchip = devm_kzalloc(dev, sizeof(*irqchip), GFP_KERNEL); 48 if (!irqchip) 49 return -ENOMEM; 50 51 irqchip->regmap = dev_get_regmap(dev->parent, NULL); 52 if (!irqchip->regmap) 53 return -ENODEV; 54 55 irq = platform_get_irq(pdev, 0); > 56 if (irq < 0) 57 return irq; 58 59 ret = device_property_read_u32(&pdev->dev, "reg", &base); 60 if (ret) 61 return -EINVAL; 62 63 irqchip->chip.name = "sl28cpld-intc"; 64 irqchip->chip.irqs = sl28cpld_irqs; 65 irqchip->chip.num_irqs = ARRAY_SIZE(sl28cpld_irqs); 66 irqchip->chip.num_regs = 1; 67 irqchip->chip.status_base = base + INTC_IP; 68 irqchip->chip.mask_base = base + INTC_IE; 69 irqchip->chip.mask_invert = true, 70 irqchip->chip.ack_base = base + INTC_IP; 71 72 return devm_regmap_add_irq_chip_np(&pdev->dev, dev->of_node, 73 irqchip->regmap, irq, 74 IRQF_SHARED | IRQF_ONESHOT, 0, 75 &irqchip->chip, &irqchip->irq_data); 76 } 77 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
On Fri, Jun 5, 2020 at 12:13 AM Michael Walle <michael@walle.cc> wrote: > > 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. ... > +config SL28CPLD_INTC > + bool Same Q: Why not module? ... > +static const struct of_device_id sl28cpld_intc_of_match[] = { > + { .compatible = "kontron,sl28cpld-intc" }, > + {}, There is no point to have comma in terminator line. > +};
Hi Michael,
I love your patch! Perhaps something to improve:
[auto build test WARNING on next-20200604]
[cannot apply to gpio/for-next hwmon/hwmon-next ljones-mfd/for-mfd-next shawnguo/for-next v5.7 v5.7-rc7 v5.7-rc6 v5.7]
[if your patch is applied to the wrong git tree, please drop us a note to help
improve the system. BTW, we also suggest to use '--base' option to specify the
base tree in git format-patch, please see https://stackoverflow.com/a/37406982]
url: https://github.com/0day-ci/linux/commits/Michael-Walle/Add-support-for-Kontron-sl28cpld/20200605-051333
base: d4899e5542c15062cc55cac0ca99025bb64edc61
:::::: branch date: 26 hours ago
:::::: commit date: 26 hours ago
compiler: gcc-9 (Debian 9.3.0-13) 9.3.0
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
cppcheck warnings: (new ones prefixed by >>)
>> drivers/irqchip/irq-sl28cpld.c:56:10: warning: Checking if unsigned variable 'irq' is less than zero. [unsignedLessThanZero]
if (irq < 0)
^
# https://github.com/0day-ci/linux/commit/b13743c1f1a52746beaa071e5d008c84d59fbd7f
git remote add linux-review https://github.com/0day-ci/linux
git remote update linux-review
git checkout b13743c1f1a52746beaa071e5d008c84d59fbd7f
vim +/irq +56 drivers/irqchip/irq-sl28cpld.c
b13743c1f1a527 Michael Walle 2020-06-04 35
b13743c1f1a527 Michael Walle 2020-06-04 36 static int sl28cpld_intc_probe(struct platform_device *pdev)
b13743c1f1a527 Michael Walle 2020-06-04 37 {
b13743c1f1a527 Michael Walle 2020-06-04 38 struct device *dev = &pdev->dev;
b13743c1f1a527 Michael Walle 2020-06-04 39 struct sl28cpld_intc *irqchip;
b13743c1f1a527 Michael Walle 2020-06-04 40 unsigned int irq;
b13743c1f1a527 Michael Walle 2020-06-04 41 u32 base;
b13743c1f1a527 Michael Walle 2020-06-04 42 int ret;
b13743c1f1a527 Michael Walle 2020-06-04 43
b13743c1f1a527 Michael Walle 2020-06-04 44 if (!dev->parent)
b13743c1f1a527 Michael Walle 2020-06-04 45 return -ENODEV;
b13743c1f1a527 Michael Walle 2020-06-04 46
b13743c1f1a527 Michael Walle 2020-06-04 47 irqchip = devm_kzalloc(dev, sizeof(*irqchip), GFP_KERNEL);
b13743c1f1a527 Michael Walle 2020-06-04 48 if (!irqchip)
b13743c1f1a527 Michael Walle 2020-06-04 49 return -ENOMEM;
b13743c1f1a527 Michael Walle 2020-06-04 50
b13743c1f1a527 Michael Walle 2020-06-04 51 irqchip->regmap = dev_get_regmap(dev->parent, NULL);
b13743c1f1a527 Michael Walle 2020-06-04 52 if (!irqchip->regmap)
b13743c1f1a527 Michael Walle 2020-06-04 53 return -ENODEV;
b13743c1f1a527 Michael Walle 2020-06-04 54
b13743c1f1a527 Michael Walle 2020-06-04 55 irq = platform_get_irq(pdev, 0);
b13743c1f1a527 Michael Walle 2020-06-04 @56 if (irq < 0)
b13743c1f1a527 Michael Walle 2020-06-04 57 return irq;
b13743c1f1a527 Michael Walle 2020-06-04 58
b13743c1f1a527 Michael Walle 2020-06-04 59 ret = device_property_read_u32(&pdev->dev, "reg", &base);
b13743c1f1a527 Michael Walle 2020-06-04 60 if (ret)
b13743c1f1a527 Michael Walle 2020-06-04 61 return -EINVAL;
b13743c1f1a527 Michael Walle 2020-06-04 62
b13743c1f1a527 Michael Walle 2020-06-04 63 irqchip->chip.name = "sl28cpld-intc";
b13743c1f1a527 Michael Walle 2020-06-04 64 irqchip->chip.irqs = sl28cpld_irqs;
b13743c1f1a527 Michael Walle 2020-06-04 65 irqchip->chip.num_irqs = ARRAY_SIZE(sl28cpld_irqs);
b13743c1f1a527 Michael Walle 2020-06-04 66 irqchip->chip.num_regs = 1;
b13743c1f1a527 Michael Walle 2020-06-04 67 irqchip->chip.status_base = base + INTC_IP;
b13743c1f1a527 Michael Walle 2020-06-04 68 irqchip->chip.mask_base = base + INTC_IE;
b13743c1f1a527 Michael Walle 2020-06-04 69 irqchip->chip.mask_invert = true,
b13743c1f1a527 Michael Walle 2020-06-04 70 irqchip->chip.ack_base = base + INTC_IP;
b13743c1f1a527 Michael Walle 2020-06-04 71
b13743c1f1a527 Michael Walle 2020-06-04 72 return devm_regmap_add_irq_chip_np(&pdev->dev, dev->of_node,
b13743c1f1a527 Michael Walle 2020-06-04 73 irqchip->regmap, irq,
b13743c1f1a527 Michael Walle 2020-06-04 74 IRQF_SHARED | IRQF_ONESHOT, 0,
b13743c1f1a527 Michael Walle 2020-06-04 75 &irqchip->chip, &irqchip->irq_data);
b13743c1f1a527 Michael Walle 2020-06-04 76 }
b13743c1f1a527 Michael Walle 2020-06-04 77
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
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
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