Message ID | 20250512-dev-adp5589-fw-v3-0-092b14b79a88@analog.com |
---|---|
Headers | show |
Series | mfd: adp5585: support keymap events and drop legacy Input driver | expand |
On Mon, 12 May 2025, Nuno Sá via B4 Relay wrote: > From: Nuno Sá <nuno.sa@analog.com> > > Not all devices (features) of the adp5585 device are mandatory to be > used in all platforms. Hence, check what's given in FW and dynamically > create the mfd_cell array to be given to devm_mfd_add_devices(). > > Signed-off-by: Nuno Sá <nuno.sa@analog.com> > --- > drivers/mfd/adp5585.c | 45 +++++++++++++++++++++++++++++++++++++++++---- > 1 file changed, 41 insertions(+), 4 deletions(-) > > diff --git a/drivers/mfd/adp5585.c b/drivers/mfd/adp5585.c > index 160e0b38106a6d78f7d4b7c866cb603d96ea673e..02f9e8c1c6a1d8b9516c060e0024d69886e9fb7a 100644 > --- a/drivers/mfd/adp5585.c > +++ b/drivers/mfd/adp5585.c > @@ -17,7 +17,13 @@ > #include <linux/regmap.h> > #include <linux/types.h> > > -static const struct mfd_cell adp5585_devs[] = { > +enum { > + ADP5585_DEV_GPIO, > + ADP5585_DEV_PWM, > + ADP5585_DEV_MAX > +}; > + > +static const struct mfd_cell adp5585_devs[ADP5585_DEV_MAX] = { > { .name = "adp5585-gpio", }, > { .name = "adp5585-pwm", }, > }; > @@ -110,12 +116,40 @@ static const struct regmap_config adp5585_regmap_configs[] = { > }, > }; > > +static int adp5585_parse_fw(struct device *dev, struct adp5585_dev *adp5585, > + struct mfd_cell **devs) > +{ > + unsigned int has_pwm = 0, has_gpio = 0, rc = 0; > + > + if (device_property_present(dev, "#pwm-cells")) > + has_pwm = 1; This is a little sloppy. Instead of using throwaway local variables, do what you're going to do in the if statement. > + if (device_property_present(dev, "#gpio-cells")) > + has_gpio = 1; > + > + if (!has_pwm && !has_gpio) > + return -ENODEV; Are we really dictating which child devices to register based on random DT properties? Why not register them anyway and have them fail if the information they need is not available? Missing / incorrect properties usually get a -EINVAL. > + *devs = devm_kcalloc(dev, has_pwm + has_gpio, sizeof(struct mfd_cell), > + GFP_KERNEL); > + if (!*devs) > + return -ENOMEM; > + > + if (has_pwm) > + (*devs)[rc++] = adp5585_devs[ADP5585_DEV_PWM]; > + if (has_gpio) > + (*devs)[rc++] = adp5585_devs[ADP5585_DEV_GPIO]; Passing around pointers to pointers for allocation (and later, pointer to functions) is not the way we wish to operate. See how all of the other MFD drivers handle selective sub-drivers. > + return rc; > +} > + > static int adp5585_i2c_probe(struct i2c_client *i2c) > { > const struct regmap_config *regmap_config; > struct adp5585_dev *adp5585; > + struct mfd_cell *devs; > unsigned int id; > - int ret; > + int ret, n_devs; > > adp5585 = devm_kzalloc(&i2c->dev, sizeof(*adp5585), GFP_KERNEL); > if (!adp5585) > @@ -138,9 +172,12 @@ static int adp5585_i2c_probe(struct i2c_client *i2c) > return dev_err_probe(&i2c->dev, -ENODEV, > "Invalid device ID 0x%02x\n", id); > > + n_devs = adp5585_parse_fw(&i2c->dev, adp5585, &devs); > + if (n_devs < 0) > + return n_devs; > + > ret = devm_mfd_add_devices(&i2c->dev, PLATFORM_DEVID_AUTO, > - adp5585_devs, ARRAY_SIZE(adp5585_devs), > - NULL, 0, NULL); > + devs, n_devs, NULL, 0, NULL); > if (ret) > return dev_err_probe(&i2c->dev, ret, > "Failed to add child devices\n"); > > -- > 2.49.0 > >
On Tue, 2025-05-13 at 15:39 +0100, Lee Jones wrote: > On Mon, 12 May 2025, Nuno Sá via B4 Relay wrote: > > > From: Nuno Sá <nuno.sa@analog.com> > > > > Use the helper macro. No functional change intended... > > > > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > > Signed-off-by: Nuno Sá <nuno.sa@analog.com> > > --- > > drivers/mfd/adp5585.c | 5 +++-- > > 1 file changed, 3 insertions(+), 2 deletions(-) > > > > diff --git a/drivers/mfd/adp5585.c b/drivers/mfd/adp5585.c > > index > > d693b1ead05128e02f671ca465f9c72cab3b3395..19d4a0ab1bb4c261e82559630624059529 > > 765fbd 100644 > > --- a/drivers/mfd/adp5585.c > > +++ b/drivers/mfd/adp5585.c > > @@ -4,6 +4,7 @@ > > * > > * Copyright 2022 NXP > > * Copyright 2024 Ideas on Board Oy > > + * Copyright 2025 Analog Devices Inc. > > If you're going to sneak in irrelevant changes, at least mention it in > passing in the change log. I actually thought this was needy and is present since v1... Can mention it in the commit message in the next version. > > > */ > > > > #include <linux/array_size.h> > > @@ -24,8 +25,8 @@ enum { > > }; > > > > static const struct mfd_cell adp5585_devs[ADP5585_DEV_MAX] = { > > - { .name = "adp5585-gpio", }, > > - { .name = "adp5585-pwm", }, > > + MFD_CELL_NAME("adp5585-gpio"), > > + MFD_CELL_NAME("adp5585-pwm"), > > }; > > > > static const struct regmap_range adp5585_volatile_ranges[] = { > > > > -- > > 2.49.0 > > > >
On Mon, 12 May 2025, Nuno Sá via B4 Relay wrote: > Hi all, > > Here it goes v3. There was some major refactoring in this version due to > Lee's and Laurent's feedback. There are some splits (and some explicit > requests) resulting in new patches being added. The biggest change is the > effort in trying to minimize the usage of specific child device bits in > the top level device (mainly stuff related to the keymap). I think now > it's fairly self contained and the only thing that we really need to > handle in the top device are the unlock and reset events as those can be > supported through both the input and gpio devices (via gpio_keys). This > results in a bit of more runtime complexity but well, that's life... > > Another change is Lee's suggestion of making use of templates (for > regmap and chip specific data) and fill things up at probe. > > I also refactored a bit the event handling so it's more generic now. > There were lot's of changes so odds are that I might have forgotten some > feedback and so, my apologies in advance :). > > I also dropped the tags in: > > patch 16/22 ("gpio: adp5585: support gpi events") as it has some > significant changes (replacing .init_valid_masks() with .request() and > .free()) Please run this set through checkpatch.pl before submitting again. Not sure if we've discussed this, but W=1 wouldn't hurt either.
On Wed, 2025-05-14 at 09:25 +0100, Lee Jones wrote: > On Mon, 12 May 2025, Nuno Sá via B4 Relay wrote: > > > Hi all, > > > > Here it goes v3. There was some major refactoring in this version due to > > Lee's and Laurent's feedback. There are some splits (and some explicit > > requests) resulting in new patches being added. The biggest change is the > > effort in trying to minimize the usage of specific child device bits in > > the top level device (mainly stuff related to the keymap). I think now > > it's fairly self contained and the only thing that we really need to > > handle in the top device are the unlock and reset events as those can be > > supported through both the input and gpio devices (via gpio_keys). This > > results in a bit of more runtime complexity but well, that's life... > > > > Another change is Lee's suggestion of making use of templates (for > > regmap and chip specific data) and fill things up at probe. > > > > I also refactored a bit the event handling so it's more generic now. > > There were lot's of changes so odds are that I might have forgotten some > > feedback and so, my apologies in advance :). > > > > I also dropped the tags in: > > > > patch 16/22 ("gpio: adp5585: support gpi events") as it has some > > significant changes (replacing .init_valid_masks() with .request() and > > .free()) > > Please run this set through checkpatch.pl before submitting again. > I've done that... It gave some issues but not sure there's anything to be done: ● 26ffbc19b2ce: mfd: adp5585: refactor how regmap defaults are handled ● checkpatch.pl: drivers/mfd/adp5585.c:94: WARNING: struct regmap_config should normally be const ● checkpatch.pl: drivers/mfd/adp5585.c:149: WARNING: struct regmap_config should normally be const The above is something we need given that we want to fill reg defaults during probe. Maybe we can go around that but not sure if it's worth it. ● 6183fc9ef938: gpio: adp5585: add support for the adp5589 expander ● checkpatch.pl: drivers/gpio/gpio-adp5585.c:26: CHECK: Macro argument reuse 'n' - possible side-effects? Again, not sure it's worth it to "fix" it and it was just copy pasted from the header. ● 3e0f3ba80ea5: Input: adp5589: remove the driver ● checkpatch.pl: drivers/input/keyboard/adp5589-keys.c:14: WARNING: added, moved or deleted file(s), does MAINTAINERS need updating? the above is lack of an entry in the original file... > Not sure if we've discussed this, but W=1 wouldn't hurt either. I used the kernel test bot... I assume W=1 is part of the builds. - Nuno Sá