* [PATCHv3 1/2] mfd: cpcap: implement irq sense helper @ 2017-03-21 22:50 Sebastian Reichel 2017-03-21 22:50 ` [PATCHv3 2/2] input: cpcap-pwrbutton: new driver Sebastian Reichel ` (2 more replies) 0 siblings, 3 replies; 12+ messages in thread From: Sebastian Reichel @ 2017-03-21 22:50 UTC (permalink / raw) To: Sebastian Reichel, Lee Jones Cc: Tony Lindgren, Dmitry Torokhov, Rob Herring, Mark Rutland, linux-input, devicetree, linux-kernel CPCAP can sense if IRQ is currently set or not. This functionality is required for a few subdevices, such as the power button and usb phy modules. Acked-by: Tony Lindgren <tony@atomide.com> Signed-off-by: Sebastian Reichel <sre@kernel.org> --- Changes since PATCHv2: - Collect Acked-by/Tested-by - Fix typo in EXPORT_SYMBOL_GPL --- drivers/mfd/motorola-cpcap.c | 25 +++++++++++++++++++++++++ include/linux/mfd/motorola-cpcap.h | 2 ++ 2 files changed, 27 insertions(+) diff --git a/drivers/mfd/motorola-cpcap.c b/drivers/mfd/motorola-cpcap.c index 6aeada7d7ce5..a1e364b42e47 100644 --- a/drivers/mfd/motorola-cpcap.c +++ b/drivers/mfd/motorola-cpcap.c @@ -32,6 +32,31 @@ struct cpcap_ddata { struct regmap *regmap; }; +static int cpcap_sense_irq(struct regmap *regmap, int irq) +{ + int reg = CPCAP_REG_INTS1 + (irq / 16) * 4; + int mask = 1 << (irq % 16); + int err, val; + + if (irq < 0 || irq > 64) + return -EINVAL; + + err = regmap_read(regmap, reg, &val); + if (err) + return err; + + return !!(val & mask); +} + +int cpcap_sense_virq(struct regmap *regmap, int virq) +{ + struct regmap_irq_chip_data *d = irq_get_chip_data(virq); + int base = regmap_irq_chip_get_base(d); + + return cpcap_sense_irq(regmap, virq - base); +} +EXPORT_SYMBOL_GPL(cpcap_sense_virq); + static int cpcap_check_revision(struct cpcap_ddata *cpcap) { u16 vendor, rev; diff --git a/include/linux/mfd/motorola-cpcap.h b/include/linux/mfd/motorola-cpcap.h index b4031c2b2214..7629e0d24d26 100644 --- a/include/linux/mfd/motorola-cpcap.h +++ b/include/linux/mfd/motorola-cpcap.h @@ -290,3 +290,5 @@ static inline int cpcap_get_vendor(struct device *dev, return 0; } + +int cpcap_sense_virq(struct regmap *regmap, int virq); -- 2.11.0 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCHv3 2/2] input: cpcap-pwrbutton: new driver 2017-03-21 22:50 [PATCHv3 1/2] mfd: cpcap: implement irq sense helper Sebastian Reichel @ 2017-03-21 22:50 ` Sebastian Reichel [not found] ` <20170321225042.28057-1-sre-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org> 2017-04-11 14:21 ` [GIT PULL] Immutable branch between MFD and Input due for the v4.12 merge window Lee Jones 2 siblings, 0 replies; 12+ messages in thread From: Sebastian Reichel @ 2017-03-21 22:50 UTC (permalink / raw) To: Sebastian Reichel, Lee Jones Cc: Tony Lindgren, Dmitry Torokhov, Rob Herring, Mark Rutland, linux-input, devicetree, linux-kernel Motorola CPCAP is a PMIC found in multiple smartphones. This driver adds support for the power/on button and has been tested in Droid 4. Acked-by: Rob Herring <robh@kernel.org> Acked-by: Dmitry Torokhov <dmitry.torokhov@gmail.com> Tested-by: Tony Lindgren <tony@atomide.com> Signed-off-by: Sebastian Reichel <sre@kernel.org> --- Changes since PATCHv2: - Collect Acked-by/Tested-by As merge strategy I suggest, that Lee takes the first patch and provides a immutable branch with for the input subsystem, which can pull in the immutable branch + the second patch. Alternatively both can go through mfd of course and Dmitry gave his Ack for that strategy in PATCHv2. --- .../devicetree/bindings/input/cpcap-pwrbutton.txt | 20 ++++ drivers/input/misc/Kconfig | 10 ++ drivers/input/misc/Makefile | 1 + drivers/input/misc/cpcap-pwrbutton.c | 117 +++++++++++++++++++++ 4 files changed, 148 insertions(+) create mode 100644 Documentation/devicetree/bindings/input/cpcap-pwrbutton.txt create mode 100644 drivers/input/misc/cpcap-pwrbutton.c diff --git a/Documentation/devicetree/bindings/input/cpcap-pwrbutton.txt b/Documentation/devicetree/bindings/input/cpcap-pwrbutton.txt new file mode 100644 index 000000000000..0dd0076daf71 --- /dev/null +++ b/Documentation/devicetree/bindings/input/cpcap-pwrbutton.txt @@ -0,0 +1,20 @@ +Motorola CPCAP on key + +This module is part of the CPCAP. For more details about the whole +chip see Documentation/devicetree/bindings/mfd/motorola-cpcap.txt. + +This module provides a simple power button event via an Interrupt. + +Required properties: +- compatible: should be one of the following + - "motorola,cpcap-pwrbutton" +- interrupts: irq specifier for CPCAP's ON IRQ + +Example: + +&cpcap { + cpcap_pwrbutton: pwrbutton { + compatible = "motorola,cpcap-pwrbutton"; + interrupts = <23 IRQ_TYPE_NONE>; + }; +}; diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig index 5b6c52210d20..9f7b72249eac 100644 --- a/drivers/input/misc/Kconfig +++ b/drivers/input/misc/Kconfig @@ -316,6 +316,16 @@ config INPUT_COBALT_BTNS To compile this driver as a module, choose M here: the module will be called cobalt_btns. +config INPUT_CPCAP_PWRBUTTON + tristate "CPCAP OnKey" + depends on MFD_CPCAP + help + Say Y here if you want to enable power key reporting via the + Motorola CPCAP chip. + + To compile this driver as a module, choose M here. The module will + be called cpcap-pwrbutton. + config INPUT_WISTRON_BTNS tristate "x86 Wistron laptop button interface" depends on X86_32 diff --git a/drivers/input/misc/Makefile b/drivers/input/misc/Makefile index b10523f2878e..b923a9828c88 100644 --- a/drivers/input/misc/Makefile +++ b/drivers/input/misc/Makefile @@ -24,6 +24,7 @@ obj-$(CONFIG_INPUT_CM109) += cm109.o obj-$(CONFIG_INPUT_CMA3000) += cma3000_d0x.o obj-$(CONFIG_INPUT_CMA3000_I2C) += cma3000_d0x_i2c.o obj-$(CONFIG_INPUT_COBALT_BTNS) += cobalt_btns.o +obj-$(CONFIG_INPUT_CPCAP_PWRBUTTON) += cpcap-pwrbutton.o obj-$(CONFIG_INPUT_DA9052_ONKEY) += da9052_onkey.o obj-$(CONFIG_INPUT_DA9055_ONKEY) += da9055_onkey.o obj-$(CONFIG_INPUT_DA9063_ONKEY) += da9063_onkey.o diff --git a/drivers/input/misc/cpcap-pwrbutton.c b/drivers/input/misc/cpcap-pwrbutton.c new file mode 100644 index 000000000000..0abef63217e2 --- /dev/null +++ b/drivers/input/misc/cpcap-pwrbutton.c @@ -0,0 +1,117 @@ +/** + * CPCAP Power Button Input Driver + * + * Copyright (C) 2017 Sebastian Reichel <sre@kernel.org> + * + * This file is subject to the terms and conditions of the GNU General + * Public License. See the file "COPYING" in the main directory of this + * archive for more details. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include <linux/module.h> +#include <linux/init.h> +#include <linux/kernel.h> +#include <linux/errno.h> +#include <linux/input.h> +#include <linux/interrupt.h> +#include <linux/regmap.h> +#include <linux/of.h> +#include <linux/platform_device.h> +#include <linux/mfd/motorola-cpcap.h> + +#define CPCAP_IRQ_ON 23 +#define CPCAP_IRQ_ON_BITMASK (1 << (CPCAP_IRQ_ON % 16)) + +struct cpcap_power_button { + struct regmap *regmap; + struct input_dev *idev; + struct device *dev; +}; + +static irqreturn_t powerbutton_irq(int irq, void *_button) +{ + struct cpcap_power_button *button = _button; + int val; + + val = cpcap_sense_virq(button->regmap, irq); + if (val < 0) { + dev_err(button->dev, "irq read failed: %d", val); + return IRQ_HANDLED; + } + + pm_wakeup_event(button->dev, 0); + input_report_key(button->idev, KEY_POWER, val); + input_sync(button->idev); + + return IRQ_HANDLED; +} + +static int cpcap_power_button_probe(struct platform_device *pdev) +{ + struct cpcap_power_button *button; + int irq = platform_get_irq(pdev, 0); + int err; + + button = devm_kmalloc(&pdev->dev, sizeof(*button), GFP_KERNEL); + if (!button) + return -ENOMEM; + + button->idev = devm_input_allocate_device(&pdev->dev); + if (!button->idev) + return -ENOMEM; + + button->regmap = dev_get_regmap(pdev->dev.parent, NULL); + if (!button->regmap) + return -ENODEV; + + button->dev = &pdev->dev; + + button->idev->name = "cpcap-pwrbutton"; + button->idev->phys = "cpcap-pwrbutton/input0"; + button->idev->dev.parent = button->dev; + input_set_capability(button->idev, EV_KEY, KEY_POWER); + + err = devm_request_threaded_irq(&pdev->dev, irq, NULL, + powerbutton_irq, IRQF_ONESHOT, "cpcap_pwrbutton", button); + if (err < 0) { + dev_err(&pdev->dev, "IRQ request failed: %d\n", err); + return err; + } + + err = input_register_device(button->idev); + if (err) { + dev_err(&pdev->dev, "Input register failed: %d\n", err); + return err; + } + + device_init_wakeup(&pdev->dev, true); + + return 0; +} + +#ifdef CONFIG_OF +static const struct of_device_id cpcap_pwrbutton_dt_match_table[] = { + { .compatible = "motorola,cpcap-pwrbutton" }, + {}, +}; +MODULE_DEVICE_TABLE(of, cpcap_pwrbutton_dt_match_table); +#endif + +static struct platform_driver cpcap_power_button_driver = { + .probe = cpcap_power_button_probe, + .driver = { + .name = "cpcap-pwrbutton", + .of_match_table = of_match_ptr(cpcap_pwrbutton_dt_match_table), + }, +}; +module_platform_driver(cpcap_power_button_driver); + +MODULE_ALIAS("platform:cpcap-pwrbutton"); +MODULE_DESCRIPTION("CPCAP Power Button"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Sebastian Reichel <sre@kernel.org>"); -- 2.11.0 ^ permalink raw reply related [flat|nested] 12+ messages in thread
[parent not found: <20170321225042.28057-1-sre-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>]
* Re: [PATCHv3 1/2] mfd: cpcap: implement irq sense helper [not found] ` <20170321225042.28057-1-sre-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org> @ 2017-03-23 14:23 ` Lee Jones 2017-03-24 8:42 ` [PATCHv4] " Sebastian Reichel 0 siblings, 1 reply; 12+ messages in thread From: Lee Jones @ 2017-03-23 14:23 UTC (permalink / raw) To: Sebastian Reichel Cc: Tony Lindgren, Dmitry Torokhov, Rob Herring, Mark Rutland, linux-input-u79uwXL29TY76Z2rM5mHXA, devicetree-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA On Tue, 21 Mar 2017, Sebastian Reichel wrote: > CPCAP can sense if IRQ is currently set or not. This > functionality is required for a few subdevices, such > as the power button and usb phy modules. > > Acked-by: Tony Lindgren <tony-4v6yS6AI5VpBDgjK7y7TUQ@public.gmane.org> > Signed-off-by: Sebastian Reichel <sre-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org> > --- > Changes since PATCHv2: > - Collect Acked-by/Tested-by > - Fix typo in EXPORT_SYMBOL_GPL > --- > drivers/mfd/motorola-cpcap.c | 25 +++++++++++++++++++++++++ > include/linux/mfd/motorola-cpcap.h | 2 ++ > 2 files changed, 27 insertions(+) > > diff --git a/drivers/mfd/motorola-cpcap.c b/drivers/mfd/motorola-cpcap.c > index 6aeada7d7ce5..a1e364b42e47 100644 > --- a/drivers/mfd/motorola-cpcap.c > +++ b/drivers/mfd/motorola-cpcap.c > @@ -32,6 +32,31 @@ struct cpcap_ddata { > struct regmap *regmap; > }; > > +static int cpcap_sense_irq(struct regmap *regmap, int irq) > +{ > + int reg = CPCAP_REG_INTS1 + (irq / 16) * 4; > + int mask = 1 << (irq % 16); Can you place all this bit-wise hoop jumping in macros please? Also please use the BIT() macro. > + int err, val; > + > + if (irq < 0 || irq > 64) > + return -EINVAL; What's wrong with IRQ 65? I'm *guessing* there isn't one. You can make this clearer by defining CPCAP_SENSE_IRQ_MAX. > + err = regmap_read(regmap, reg, &val); > + if (err) > + return err; > + > + return !!(val & mask); > +} > + > +int cpcap_sense_virq(struct regmap *regmap, int virq) > +{ > + struct regmap_irq_chip_data *d = irq_get_chip_data(virq); > + int base = regmap_irq_chip_get_base(d); > + > + return cpcap_sense_irq(regmap, virq - base); > +} > +EXPORT_SYMBOL_GPL(cpcap_sense_virq); > + > static int cpcap_check_revision(struct cpcap_ddata *cpcap) > { > u16 vendor, rev; > diff --git a/include/linux/mfd/motorola-cpcap.h b/include/linux/mfd/motorola-cpcap.h > index b4031c2b2214..7629e0d24d26 100644 > --- a/include/linux/mfd/motorola-cpcap.h > +++ b/include/linux/mfd/motorola-cpcap.h > @@ -290,3 +290,5 @@ static inline int cpcap_get_vendor(struct device *dev, > > return 0; > } > + > +int cpcap_sense_virq(struct regmap *regmap, int virq); extern? -- Lee Jones Linaro STMicroelectronics Landing Team Lead Linaro.org │ Open source software for ARM SoCs Follow Linaro: Facebook | Twitter | Blog -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCHv4] mfd: cpcap: implement irq sense helper 2017-03-23 14:23 ` [PATCHv3 1/2] mfd: cpcap: implement irq sense helper Lee Jones @ 2017-03-24 8:42 ` Sebastian Reichel 2017-03-28 10:27 ` Lee Jones 0 siblings, 1 reply; 12+ messages in thread From: Sebastian Reichel @ 2017-03-24 8:42 UTC (permalink / raw) To: Sebastian Reichel, Lee Jones Cc: Tony Lindgren, Dmitry Torokhov, Rob Herring, Mark Rutland, linux-input, devicetree, linux-kernel CPCAP can sense if IRQ is currently set or not. This functionality is required for a few subdevices, such as the power button and usb phy modules. Acked-by: Tony Lindgren <tony@atomide.com> Signed-off-by: Sebastian Reichel <sre@kernel.org> --- Hi Lee, I hope this is fine with you. I tried to come up with a sensible macro for reg, but everything I came up with actually reduced readability. -- Sebastian Changes since PATCHv3: - add explicit extern to function definition - use BIT macro for mask variable - avoid magic numbers --- drivers/mfd/motorola-cpcap.c | 28 ++++++++++++++++++++++++++++ include/linux/mfd/motorola-cpcap.h | 2 ++ 2 files changed, 30 insertions(+) diff --git a/drivers/mfd/motorola-cpcap.c b/drivers/mfd/motorola-cpcap.c index 6aeada7d7ce5..c80997a377a1 100644 --- a/drivers/mfd/motorola-cpcap.c +++ b/drivers/mfd/motorola-cpcap.c @@ -23,6 +23,8 @@ #define CPCAP_NR_IRQ_REG_BANKS 6 #define CPCAP_NR_IRQ_CHIPS 3 +#define CPCAP_REGISTER_SIZE 4 +#define CPCAP_REGISTER_BITS 16 struct cpcap_ddata { struct spi_device *spi; @@ -32,6 +34,32 @@ struct cpcap_ddata { struct regmap *regmap; }; +static int cpcap_sense_irq(struct regmap *regmap, int irq) +{ + int regnum = irq / CPCAP_REGISTER_BITS; + int mask = BIT(irq % CPCAP_REGISTER_BITS); + int reg = CPCAP_REG_INTS1 + (regnum * CPCAP_REGISTER_SIZE); + int err, val; + + if (reg < CPCAP_REG_INTS1 || reg > CPCAP_REG_INTS4) + return -EINVAL; + + err = regmap_read(regmap, reg, &val); + if (err) + return err; + + return !!(val & mask); +} + +int cpcap_sense_virq(struct regmap *regmap, int virq) +{ + struct regmap_irq_chip_data *d = irq_get_chip_data(virq); + int base = regmap_irq_chip_get_base(d); + + return cpcap_sense_irq(regmap, virq - base); +} +EXPORT_SYMBOL_GPL(cpcap_sense_virq); + static int cpcap_check_revision(struct cpcap_ddata *cpcap) { u16 vendor, rev; diff --git a/include/linux/mfd/motorola-cpcap.h b/include/linux/mfd/motorola-cpcap.h index b4031c2b2214..793aa695faa0 100644 --- a/include/linux/mfd/motorola-cpcap.h +++ b/include/linux/mfd/motorola-cpcap.h @@ -290,3 +290,5 @@ static inline int cpcap_get_vendor(struct device *dev, return 0; } + +extern int cpcap_sense_virq(struct regmap *regmap, int virq); -- 2.11.0 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCHv4] mfd: cpcap: implement irq sense helper 2017-03-24 8:42 ` [PATCHv4] " Sebastian Reichel @ 2017-03-28 10:27 ` Lee Jones 2017-03-28 14:54 ` Sebastian Reichel 0 siblings, 1 reply; 12+ messages in thread From: Lee Jones @ 2017-03-28 10:27 UTC (permalink / raw) To: Sebastian Reichel Cc: Tony Lindgren, Dmitry Torokhov, Rob Herring, Mark Rutland, linux-input, devicetree, linux-kernel On Fri, 24 Mar 2017, Sebastian Reichel wrote: > CPCAP can sense if IRQ is currently set or not. This > functionality is required for a few subdevices, such > as the power button and usb phy modules. > > Acked-by: Tony Lindgren <tony@atomide.com> > Signed-off-by: Sebastian Reichel <sre@kernel.org> > > --- > Hi Lee, > > I hope this is fine with you. I tried to come up > with a sensible macro for reg, but everything I > came up with actually reduced readability. > > -- Sebastian > > Changes since PATCHv3: > - add explicit extern to function definition > - use BIT macro for mask variable > - avoid magic numbers > --- > drivers/mfd/motorola-cpcap.c | 28 ++++++++++++++++++++++++++++ > include/linux/mfd/motorola-cpcap.h | 2 ++ > 2 files changed, 30 insertions(+) > > diff --git a/drivers/mfd/motorola-cpcap.c b/drivers/mfd/motorola-cpcap.c > index 6aeada7d7ce5..c80997a377a1 100644 > --- a/drivers/mfd/motorola-cpcap.c > +++ b/drivers/mfd/motorola-cpcap.c > @@ -23,6 +23,8 @@ > > #define CPCAP_NR_IRQ_REG_BANKS 6 > #define CPCAP_NR_IRQ_CHIPS 3 > +#define CPCAP_REGISTER_SIZE 4 > +#define CPCAP_REGISTER_BITS 16 > > struct cpcap_ddata { > struct spi_device *spi; > @@ -32,6 +34,32 @@ struct cpcap_ddata { > struct regmap *regmap; > }; > > +static int cpcap_sense_irq(struct regmap *regmap, int irq) > +{ > + int regnum = irq / CPCAP_REGISTER_BITS; > + int mask = BIT(irq % CPCAP_REGISTER_BITS); > + int reg = CPCAP_REG_INTS1 + (regnum * CPCAP_REGISTER_SIZE); > + int err, val; > + > + if (reg < CPCAP_REG_INTS1 || reg > CPCAP_REG_INTS4) > + return -EINVAL; > + > + err = regmap_read(regmap, reg, &val); > + if (err) > + return err; > + > + return !!(val & mask); > +} > + > +int cpcap_sense_virq(struct regmap *regmap, int virq) > +{ > + struct regmap_irq_chip_data *d = irq_get_chip_data(virq); > + int base = regmap_irq_chip_get_base(d); What base is this? Could it be used to avoid some calculations in cpcap_sense_irq()? > + return cpcap_sense_irq(regmap, virq - base); > +} > +EXPORT_SYMBOL_GPL(cpcap_sense_virq); > + > static int cpcap_check_revision(struct cpcap_ddata *cpcap) > { > u16 vendor, rev; > diff --git a/include/linux/mfd/motorola-cpcap.h b/include/linux/mfd/motorola-cpcap.h > index b4031c2b2214..793aa695faa0 100644 > --- a/include/linux/mfd/motorola-cpcap.h > +++ b/include/linux/mfd/motorola-cpcap.h > @@ -290,3 +290,5 @@ static inline int cpcap_get_vendor(struct device *dev, > > return 0; > } > + > +extern int cpcap_sense_virq(struct regmap *regmap, int virq); -- Lee Jones Linaro STMicroelectronics Landing Team Lead Linaro.org │ Open source software for ARM SoCs Follow Linaro: Facebook | Twitter | Blog ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCHv4] mfd: cpcap: implement irq sense helper 2017-03-28 10:27 ` Lee Jones @ 2017-03-28 14:54 ` Sebastian Reichel 2017-03-29 8:04 ` Lee Jones 0 siblings, 1 reply; 12+ messages in thread From: Sebastian Reichel @ 2017-03-28 14:54 UTC (permalink / raw) To: Lee Jones Cc: Tony Lindgren, Dmitry Torokhov, Rob Herring, Mark Rutland, linux-input, devicetree, linux-kernel [-- Attachment #1: Type: text/plain, Size: 954 bytes --] Hi Lee, On Tue, Mar 28, 2017 at 11:27:16AM +0100, Lee Jones wrote: > > +int cpcap_sense_virq(struct regmap *regmap, int virq) > > +{ > > + struct regmap_irq_chip_data *d = irq_get_chip_data(virq); > > + int base = regmap_irq_chip_get_base(d); > > What base is this? This function takes an Linux irq number. That number is a virtual irq number, which has nothing to do with the hardware. For example a platform could look like this: linux irq device base device irq --------------------------------------------- 0-63 SoC 0 0-63 64-127 SoC-GPIO 64 0-63 128-191 CPCAP 128 0-63 For the above example the function would map 128-191 to 0-63 as used by the device. > Could it be used to avoid some calculations in cpcap_sense_irq()? No. > > + return cpcap_sense_irq(regmap, virq - base); > > +} > > +EXPORT_SYMBOL_GPL(cpcap_sense_virq); -- Sebastian [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 833 bytes --] ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCHv4] mfd: cpcap: implement irq sense helper 2017-03-28 14:54 ` Sebastian Reichel @ 2017-03-29 8:04 ` Lee Jones 2017-03-29 12:18 ` [PATCHv5] " Sebastian Reichel 0 siblings, 1 reply; 12+ messages in thread From: Lee Jones @ 2017-03-29 8:04 UTC (permalink / raw) To: Sebastian Reichel Cc: Tony Lindgren, Dmitry Torokhov, Rob Herring, Mark Rutland, linux-input, devicetree, linux-kernel On Tue, 28 Mar 2017, Sebastian Reichel wrote: > Hi Lee, > > On Tue, Mar 28, 2017 at 11:27:16AM +0100, Lee Jones wrote: > > > +int cpcap_sense_virq(struct regmap *regmap, int virq) > > > +{ > > > + struct regmap_irq_chip_data *d = irq_get_chip_data(virq); > > > + int base = regmap_irq_chip_get_base(d); > > > > What base is this? > > This function takes an Linux irq number. That number is a virtual > irq number, which has nothing to do with the hardware. For example > a platform could look like this: > > linux irq device base device irq > --------------------------------------------- > 0-63 SoC 0 0-63 > 64-127 SoC-GPIO 64 0-63 > 128-191 CPCAP 128 0-63 > > For the above example the function would map 128-191 to 0-63 as > used by the device. In which case may I suggest that you rename the variable, since 'base' is commonly used in the kernel to mean base of a particular IP's memory block. > > Could it be used to avoid some calculations in cpcap_sense_irq()? > > No. > > > > + return cpcap_sense_irq(regmap, virq - base); > > > +} > > > +EXPORT_SYMBOL_GPL(cpcap_sense_virq); > > -- Sebastian -- Lee Jones Linaro STMicroelectronics Landing Team Lead Linaro.org │ Open source software for ARM SoCs Follow Linaro: Facebook | Twitter | Blog ^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCHv5] mfd: cpcap: implement irq sense helper 2017-03-29 8:04 ` Lee Jones @ 2017-03-29 12:18 ` Sebastian Reichel 2017-04-03 10:26 ` Lee Jones 0 siblings, 1 reply; 12+ messages in thread From: Sebastian Reichel @ 2017-03-29 12:18 UTC (permalink / raw) To: Sebastian Reichel, Lee Jones Cc: Tony Lindgren, Dmitry Torokhov, Rob Herring, Mark Rutland, linux-input, devicetree, linux-kernel CPCAP can sense if IRQ is currently set or not. This functionality is required for a few subdevices, such as the power button and usb phy modules. Acked-by: Tony Lindgren <tony@atomide.com> Signed-off-by: Sebastian Reichel <sre@kernel.org> --- Changes since PATCHv3: - add extern to function definition - use BIT macro for mask variable - avoid magic numbers Changes since PATCHv4: - rename base to irq_base --- drivers/mfd/motorola-cpcap.c | 28 ++++++++++++++++++++++++++++ include/linux/mfd/motorola-cpcap.h | 2 ++ 2 files changed, 30 insertions(+) diff --git a/drivers/mfd/motorola-cpcap.c b/drivers/mfd/motorola-cpcap.c index 6aeada7d7ce5..a9097efcefa5 100644 --- a/drivers/mfd/motorola-cpcap.c +++ b/drivers/mfd/motorola-cpcap.c @@ -23,6 +23,8 @@ #define CPCAP_NR_IRQ_REG_BANKS 6 #define CPCAP_NR_IRQ_CHIPS 3 +#define CPCAP_REGISTER_SIZE 4 +#define CPCAP_REGISTER_BITS 16 struct cpcap_ddata { struct spi_device *spi; @@ -32,6 +34,32 @@ struct cpcap_ddata { struct regmap *regmap; }; +static int cpcap_sense_irq(struct regmap *regmap, int irq) +{ + int regnum = irq / CPCAP_REGISTER_BITS; + int mask = BIT(irq % CPCAP_REGISTER_BITS); + int reg = CPCAP_REG_INTS1 + (regnum * CPCAP_REGISTER_SIZE); + int err, val; + + if (reg < CPCAP_REG_INTS1 || reg > CPCAP_REG_INTS4) + return -EINVAL; + + err = regmap_read(regmap, reg, &val); + if (err) + return err; + + return !!(val & mask); +} + +int cpcap_sense_virq(struct regmap *regmap, int virq) +{ + struct regmap_irq_chip_data *d = irq_get_chip_data(virq); + int irq_base = regmap_irq_chip_get_base(d); + + return cpcap_sense_irq(regmap, virq - irq_base); +} +EXPORT_SYMBOL_GPL(cpcap_sense_virq); + static int cpcap_check_revision(struct cpcap_ddata *cpcap) { u16 vendor, rev; diff --git a/include/linux/mfd/motorola-cpcap.h b/include/linux/mfd/motorola-cpcap.h index b4031c2b2214..793aa695faa0 100644 --- a/include/linux/mfd/motorola-cpcap.h +++ b/include/linux/mfd/motorola-cpcap.h @@ -290,3 +290,5 @@ static inline int cpcap_get_vendor(struct device *dev, return 0; } + +extern int cpcap_sense_virq(struct regmap *regmap, int virq); -- 2.11.0 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCHv5] mfd: cpcap: implement irq sense helper 2017-03-29 12:18 ` [PATCHv5] " Sebastian Reichel @ 2017-04-03 10:26 ` Lee Jones 2017-04-10 14:27 ` Sebastian Reichel 0 siblings, 1 reply; 12+ messages in thread From: Lee Jones @ 2017-04-03 10:26 UTC (permalink / raw) To: Sebastian Reichel Cc: Tony Lindgren, Dmitry Torokhov, Rob Herring, Mark Rutland, linux-input, devicetree, linux-kernel On Wed, 29 Mar 2017, Sebastian Reichel wrote: > CPCAP can sense if IRQ is currently set or not. This > functionality is required for a few subdevices, such > as the power button and usb phy modules. > > Acked-by: Tony Lindgren <tony@atomide.com> > Signed-off-by: Sebastian Reichel <sre@kernel.org> > --- > Changes since PATCHv3: > - add extern to function definition > - use BIT macro for mask variable > - avoid magic numbers > Changes since PATCHv4: > - rename base to irq_base > --- > drivers/mfd/motorola-cpcap.c | 28 ++++++++++++++++++++++++++++ > include/linux/mfd/motorola-cpcap.h | 2 ++ > 2 files changed, 30 insertions(+) Applied, thanks. > diff --git a/drivers/mfd/motorola-cpcap.c b/drivers/mfd/motorola-cpcap.c > index 6aeada7d7ce5..a9097efcefa5 100644 > --- a/drivers/mfd/motorola-cpcap.c > +++ b/drivers/mfd/motorola-cpcap.c > @@ -23,6 +23,8 @@ > > #define CPCAP_NR_IRQ_REG_BANKS 6 > #define CPCAP_NR_IRQ_CHIPS 3 > +#define CPCAP_REGISTER_SIZE 4 > +#define CPCAP_REGISTER_BITS 16 > > struct cpcap_ddata { > struct spi_device *spi; > @@ -32,6 +34,32 @@ struct cpcap_ddata { > struct regmap *regmap; > }; > > +static int cpcap_sense_irq(struct regmap *regmap, int irq) > +{ > + int regnum = irq / CPCAP_REGISTER_BITS; > + int mask = BIT(irq % CPCAP_REGISTER_BITS); > + int reg = CPCAP_REG_INTS1 + (regnum * CPCAP_REGISTER_SIZE); > + int err, val; > + > + if (reg < CPCAP_REG_INTS1 || reg > CPCAP_REG_INTS4) > + return -EINVAL; > + > + err = regmap_read(regmap, reg, &val); > + if (err) > + return err; > + > + return !!(val & mask); > +} > + > +int cpcap_sense_virq(struct regmap *regmap, int virq) > +{ > + struct regmap_irq_chip_data *d = irq_get_chip_data(virq); > + int irq_base = regmap_irq_chip_get_base(d); > + > + return cpcap_sense_irq(regmap, virq - irq_base); > +} > +EXPORT_SYMBOL_GPL(cpcap_sense_virq); > + > static int cpcap_check_revision(struct cpcap_ddata *cpcap) > { > u16 vendor, rev; > diff --git a/include/linux/mfd/motorola-cpcap.h b/include/linux/mfd/motorola-cpcap.h > index b4031c2b2214..793aa695faa0 100644 > --- a/include/linux/mfd/motorola-cpcap.h > +++ b/include/linux/mfd/motorola-cpcap.h > @@ -290,3 +290,5 @@ static inline int cpcap_get_vendor(struct device *dev, > > return 0; > } > + > +extern int cpcap_sense_virq(struct regmap *regmap, int virq); -- Lee Jones Linaro STMicroelectronics Landing Team Lead Linaro.org │ Open source software for ARM SoCs Follow Linaro: Facebook | Twitter | Blog ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCHv5] mfd: cpcap: implement irq sense helper 2017-04-03 10:26 ` Lee Jones @ 2017-04-10 14:27 ` Sebastian Reichel 2017-04-11 14:21 ` Lee Jones 0 siblings, 1 reply; 12+ messages in thread From: Sebastian Reichel @ 2017-04-10 14:27 UTC (permalink / raw) To: Lee Jones Cc: Tony Lindgren, Dmitry Torokhov, Rob Herring, Mark Rutland, linux-input, devicetree, linux-kernel [-- Attachment #1: Type: text/plain, Size: 912 bytes --] Hi Lee, On Mon, Apr 03, 2017 at 11:26:15AM +0100, Lee Jones wrote: > On Wed, 29 Mar 2017, Sebastian Reichel wrote: > > > CPCAP can sense if IRQ is currently set or not. This > > functionality is required for a few subdevices, such > > as the power button and usb phy modules. > > > > Acked-by: Tony Lindgren <tony@atomide.com> > > Signed-off-by: Sebastian Reichel <sre@kernel.org> > > --- > > Changes since PATCHv3: > > - add extern to function definition > > - use BIT macro for mask variable > > - avoid magic numbers > > Changes since PATCHv4: > > - rename base to irq_base > > --- > > drivers/mfd/motorola-cpcap.c | 28 ++++++++++++++++++++++++++++ > > include/linux/mfd/motorola-cpcap.h | 2 ++ > > 2 files changed, 30 insertions(+) > > Applied, thanks. Thanks, will you also pick up the input patch? https://patchwork.kernel.org/patch/9637807/ -- Sebastian [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 833 bytes --] ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCHv5] mfd: cpcap: implement irq sense helper 2017-04-10 14:27 ` Sebastian Reichel @ 2017-04-11 14:21 ` Lee Jones 0 siblings, 0 replies; 12+ messages in thread From: Lee Jones @ 2017-04-11 14:21 UTC (permalink / raw) To: Sebastian Reichel Cc: Tony Lindgren, Dmitry Torokhov, Rob Herring, Mark Rutland, linux-input-u79uwXL29TY76Z2rM5mHXA, devicetree-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA On Mon, 10 Apr 2017, Sebastian Reichel wrote: > On Mon, Apr 03, 2017 at 11:26:15AM +0100, Lee Jones wrote: > > On Wed, 29 Mar 2017, Sebastian Reichel wrote: > > > > > CPCAP can sense if IRQ is currently set or not. This > > > functionality is required for a few subdevices, such > > > as the power button and usb phy modules. > > > > > > Acked-by: Tony Lindgren <tony-4v6yS6AI5VpBDgjK7y7TUQ@public.gmane.org> > > > Signed-off-by: Sebastian Reichel <sre-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org> > > > --- > > > Changes since PATCHv3: > > > - add extern to function definition > > > - use BIT macro for mask variable > > > - avoid magic numbers > > > Changes since PATCHv4: > > > - rename base to irq_base > > > --- > > > drivers/mfd/motorola-cpcap.c | 28 ++++++++++++++++++++++++++++ > > > include/linux/mfd/motorola-cpcap.h | 2 ++ > > > 2 files changed, 30 insertions(+) > > > > Applied, thanks. > > Thanks, will you also pick up the input patch? > > https://patchwork.kernel.org/patch/9637807/ Done, and pull-request sent. -- Lee Jones Linaro STMicroelectronics Landing Team Lead Linaro.org │ Open source software for ARM SoCs Follow Linaro: Facebook | Twitter | Blog -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 12+ messages in thread
* [GIT PULL] Immutable branch between MFD and Input due for the v4.12 merge window 2017-03-21 22:50 [PATCHv3 1/2] mfd: cpcap: implement irq sense helper Sebastian Reichel 2017-03-21 22:50 ` [PATCHv3 2/2] input: cpcap-pwrbutton: new driver Sebastian Reichel [not found] ` <20170321225042.28057-1-sre-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org> @ 2017-04-11 14:21 ` Lee Jones 2 siblings, 0 replies; 12+ messages in thread From: Lee Jones @ 2017-04-11 14:21 UTC (permalink / raw) To: Sebastian Reichel Cc: Tony Lindgren, Dmitry Torokhov, Rob Herring, Mark Rutland, linux-input, devicetree, linux-kernel Dmitry, Enjoy! The following changes since commit c1ae3cfa0e89fa1a7ecc4c99031f5e9ae99d9201: Linux 4.11-rc1 (2017-03-05 12:59:56 -0800) are available in the git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/lee/mfd.git ib-mfd-input-v4.12 for you to fetch changes up to 6d99971842f6b0779738d8c168d9ed92ef1ff5fc: input: cpcap-pwrbutton: New driver (2017-04-11 15:18:09 +0100) ---------------------------------------------------------------- Immutable branch between MFD and Input due for the v4.12 merge window ---------------------------------------------------------------- Sebastian Reichel (2): mfd: cpcap: Implement IRQ sense helper input: cpcap-pwrbutton: New driver .../devicetree/bindings/input/cpcap-pwrbutton.txt | 20 ++++ drivers/input/misc/Kconfig | 10 ++ drivers/input/misc/Makefile | 1 + drivers/input/misc/cpcap-pwrbutton.c | 117 +++++++++++++++++++++ drivers/mfd/motorola-cpcap.c | 28 +++++ include/linux/mfd/motorola-cpcap.h | 2 + 6 files changed, 178 insertions(+) create mode 100644 Documentation/devicetree/bindings/input/cpcap-pwrbutton.txt create mode 100644 drivers/input/misc/cpcap-pwrbutton.c -- Lee Jones Linaro STMicroelectronics Landing Team Lead Linaro.org │ Open source software for ARM SoCs Follow Linaro: Facebook | Twitter | Blog ^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2017-04-11 14:21 UTC | newest] Thread overview: 12+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2017-03-21 22:50 [PATCHv3 1/2] mfd: cpcap: implement irq sense helper Sebastian Reichel 2017-03-21 22:50 ` [PATCHv3 2/2] input: cpcap-pwrbutton: new driver Sebastian Reichel [not found] ` <20170321225042.28057-1-sre-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org> 2017-03-23 14:23 ` [PATCHv3 1/2] mfd: cpcap: implement irq sense helper Lee Jones 2017-03-24 8:42 ` [PATCHv4] " Sebastian Reichel 2017-03-28 10:27 ` Lee Jones 2017-03-28 14:54 ` Sebastian Reichel 2017-03-29 8:04 ` Lee Jones 2017-03-29 12:18 ` [PATCHv5] " Sebastian Reichel 2017-04-03 10:26 ` Lee Jones 2017-04-10 14:27 ` Sebastian Reichel 2017-04-11 14:21 ` Lee Jones 2017-04-11 14:21 ` [GIT PULL] Immutable branch between MFD and Input due for the v4.12 merge window Lee Jones
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).