From: Lee Jones <lee@kernel.org>
To: Svyatoslav Ryhel <clamor95@gmail.com>
Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com>,
Rob Herring <robh@kernel.org>,
Krzysztof Kozlowski <krzk+dt@kernel.org>,
Conor Dooley <conor+dt@kernel.org>,
Pavel Machek <pavel@kernel.org>,
David Lechner <dlechner@baylibre.com>,
Tony Lindgren <tony@atomide.com>,
linux-input@vger.kernel.org, devicetree@vger.kernel.org,
linux-kernel@vger.kernel.org, linux-leds@vger.kernel.org
Subject: Re: [PATCH v5 5/6] mfd: motorola-cpcap: diverge configuration per-board
Date: Wed, 20 May 2026 16:07:58 +0100 [thread overview]
Message-ID: <20260520150758.GG2767592@google.com> (raw)
In-Reply-To: <20260510110804.33045-6-clamor95@gmail.com>
On Sun, 10 May 2026, Svyatoslav Ryhel wrote:
> MFD have rigid subdevice structure which does not allow flexible dynamic
> subdevice linking. Address this by diverging CPCAP subdevice composition
> to take into account board specific configuration.
>
> Create a common default subdevice composition, rename existing subdevice
> composition into cpcap_mapphone_mfd_devices since it targets mainly
> Mapphone board.
>
> Removed st,6556002 as it is no longer applicable to all cases and
> duplicates motorola,cpcap, which is used as the default composition.
>
> Signed-off-by: Svyatoslav Ryhel <clamor95@gmail.com>
> ---
> drivers/mfd/motorola-cpcap.c | 142 ++++++++++++++++-------------
> include/linux/mfd/motorola-cpcap.h | 6 ++
> 2 files changed, 87 insertions(+), 61 deletions(-)
Looking much better, thanks.
Nit: A patch-level changelog really is much more helpful to reviewers.
> diff --git a/drivers/mfd/motorola-cpcap.c b/drivers/mfd/motorola-cpcap.c
> index d8243b956f87..f5a7fdd89dd5 100644
> --- a/drivers/mfd/motorola-cpcap.c
> +++ b/drivers/mfd/motorola-cpcap.c
> @@ -12,6 +12,7 @@
> #include <linux/kernel.h>
> #include <linux/module.h>
> #include <linux/mod_devicetable.h>
> +#include <linux/property.h>
> #include <linux/regmap.h>
> #include <linux/sysfs.h>
>
> @@ -30,6 +31,7 @@ struct cpcap_ddata {
> struct regmap_irq_chip_data *irqdata[CPCAP_NR_IRQ_CHIPS];
> const struct regmap_config *regmap_conf;
> struct regmap *regmap;
> + enum cpcap_variant variant;
> };
>
> static int cpcap_sense_irq(struct regmap *regmap, int irq)
> @@ -195,20 +197,6 @@ static int cpcap_init_irq(struct cpcap_ddata *cpcap)
> return 0;
> }
>
> -static const struct of_device_id cpcap_of_match[] = {
> - { .compatible = "motorola,cpcap", },
> - { .compatible = "st,6556002", },
> - {},
> -};
> -MODULE_DEVICE_TABLE(of, cpcap_of_match);
> -
> -static const struct spi_device_id cpcap_spi_ids[] = {
> - { .name = "cpcap", },
> - { .name = "6556002", },
> - {},
> -};
> -MODULE_DEVICE_TABLE(spi, cpcap_spi_ids);
> -
> static const struct regmap_config cpcap_regmap_config = {
> .reg_bits = 16,
> .reg_stride = 4,
> @@ -241,62 +229,76 @@ static int cpcap_resume(struct device *dev)
>
> static DEFINE_SIMPLE_DEV_PM_OPS(cpcap_pm, cpcap_suspend, cpcap_resume);
>
> -static const struct mfd_cell cpcap_mfd_devices[] = {
> - {
> - .name = "cpcap_adc",
> - .of_compatible = "motorola,mapphone-cpcap-adc",
> - }, {
> - .name = "cpcap_battery",
> - .of_compatible = "motorola,cpcap-battery",
> - }, {
> - .name = "cpcap-charger",
> - .of_compatible = "motorola,mapphone-cpcap-charger",
> - }, {
> - .name = "cpcap-regulator",
> - .of_compatible = "motorola,mapphone-cpcap-regulator",
> - }, {
> - .name = "cpcap-rtc",
> - .of_compatible = "motorola,cpcap-rtc",
> - }, {
> - .name = "cpcap-pwrbutton",
> - .of_compatible = "motorola,cpcap-pwrbutton",
> - }, {
> - .name = "cpcap-usb-phy",
> - .of_compatible = "motorola,mapphone-cpcap-usb-phy",
> - }, {
> - .name = "cpcap-led",
> - .id = 0,
> - .of_compatible = "motorola,cpcap-led-red",
> - }, {
> - .name = "cpcap-led",
> - .id = 1,
> - .of_compatible = "motorola,cpcap-led-green",
> - }, {
> - .name = "cpcap-led",
> - .id = 2,
> - .of_compatible = "motorola,cpcap-led-blue",
> - }, {
> - .name = "cpcap-led",
> - .id = 3,
> - .of_compatible = "motorola,cpcap-led-adl",
> - }, {
> - .name = "cpcap-led",
> - .id = 4,
> - .of_compatible = "motorola,cpcap-led-cp",
> - }, {
> - .name = "cpcap-codec",
> - }
> +static const struct mfd_cell cpcap_default_mfd_devices[] = {
> + MFD_CELL_OF("cpcap_adc", NULL, NULL, 0, 0, "motorola,cpcap-adc"),
> + MFD_CELL_OF("cpcap_battery", NULL, NULL, 0, 0,
> + "motorola,cpcap-battery"),
> + MFD_CELL_OF("cpcap-regulator", NULL, NULL, 0, 0,
> + "motorola,cpcap-regulator"),
> + MFD_CELL_OF("cpcap-rtc", NULL, NULL, 0, 0, "motorola,cpcap-rtc"),
> + MFD_CELL_OF("cpcap-pwrbutton", NULL, NULL, 0, 0,
> + "motorola,cpcap-pwrbutton"),
> + MFD_CELL_OF("cpcap-usb-phy", NULL, NULL, 0, 0,
> + "motorola,cpcap-usb-phy"),
> + MFD_CELL_OF("cpcap-led", NULL, NULL, 0, 0, "motorola,cpcap-led-red"),
> + MFD_CELL_OF("cpcap-led", NULL, NULL, 0, 1, "motorola,cpcap-led-green"),
> + MFD_CELL_OF("cpcap-led", NULL, NULL, 0, 2, "motorola,cpcap-led-blue"),
> + MFD_CELL_OF("cpcap-led", NULL, NULL, 0, 3, "motorola,cpcap-led-adl"),
> + MFD_CELL_OF("cpcap-led", NULL, NULL, 0, 4, "motorola,cpcap-led-cp"),
> + MFD_CELL_NAME("cpcap-codec"),
> +};
Nit: I wouldn't complain if you wanted to have all of these on a single
line for neatness.
> +static const struct mfd_cell cpcap_mapphone_mfd_devices[] = {
> + MFD_CELL_OF("cpcap_adc", NULL, NULL, 0, 0,
> + "motorola,mapphone-cpcap-adc"),
> + MFD_CELL_OF("cpcap_battery", NULL, NULL, 0, 0,
> + "motorola,cpcap-battery"),
> + MFD_CELL_OF("cpcap-charger", NULL, NULL, 0, 0,
> + "motorola,mapphone-cpcap-charger"),
> + MFD_CELL_OF("cpcap-regulator", NULL, NULL, 0, 0,
> + "motorola,mapphone-cpcap-regulator"),
> + MFD_CELL_OF("cpcap-rtc", NULL, NULL, 0, 0, "motorola,cpcap-rtc"),
> + MFD_CELL_OF("cpcap-pwrbutton", NULL, NULL, 0, 0,
> + "motorola,cpcap-pwrbutton"),
> + MFD_CELL_OF("cpcap-usb-phy", NULL, NULL, 0, 0,
> + "motorola,mapphone-cpcap-usb-phy"),
> + MFD_CELL_OF("cpcap-led", NULL, NULL, 0, 0, "motorola,cpcap-led-red"),
> + MFD_CELL_OF("cpcap-led", NULL, NULL, 0, 1, "motorola,cpcap-led-green"),
> + MFD_CELL_OF("cpcap-led", NULL, NULL, 0, 2, "motorola,cpcap-led-blue"),
> + MFD_CELL_OF("cpcap-led", NULL, NULL, 0, 3, "motorola,cpcap-led-adl"),
> + MFD_CELL_OF("cpcap-led", NULL, NULL, 0, 4, "motorola,cpcap-led-cp"),
> + MFD_CELL_NAME("cpcap-codec"),
> };
A lot of these are duplicated, right?
I would have a comment set, then the differences in separate containers.
> static int cpcap_probe(struct spi_device *spi)
> {
> struct cpcap_ddata *cpcap;
> + const struct mfd_cell *cells;
> + unsigned int num_cells;
> int ret;
>
> cpcap = devm_kzalloc(&spi->dev, sizeof(*cpcap), GFP_KERNEL);
> if (!cpcap)
> return -ENOMEM;
>
> + cpcap->variant = (enum cpcap_variant)spi_get_device_match_data(spi);
> + if (!cpcap->variant)
> + return -ENODEV;
Isn't this covered in the 'default' below?
> + switch (cpcap->variant) {
> + case CPCAP_DEFAULT:
> + cells = cpcap_default_mfd_devices;
> + num_cells = ARRAY_SIZE(cpcap_default_mfd_devices);
> + break;
> + case CPCAP_MAPPHONE:
> + cells = cpcap_mapphone_mfd_devices;
> + num_cells = ARRAY_SIZE(cpcap_mapphone_mfd_devices);
> + break;
> + default:
> + return dev_err_probe(&spi->dev, -EINVAL,
> + "Unknown device %d\n", cpcap->variant);
This should be -ENODEV.
> + }
> +
> cpcap->spi = spi;
> spi_set_drvdata(spi, cpcap);
>
> @@ -331,10 +333,28 @@ static int cpcap_probe(struct spi_device *spi)
> spi->dev.coherent_dma_mask = 0;
> spi->dev.dma_mask = &spi->dev.coherent_dma_mask;
>
> - return devm_mfd_add_devices(&spi->dev, 0, cpcap_mfd_devices,
> - ARRAY_SIZE(cpcap_mfd_devices), NULL, 0, NULL);
> + return devm_mfd_add_devices(&spi->dev, 0, cells, num_cells, NULL, 0, NULL);
> }
>
> +static const struct of_device_id cpcap_of_match[] = {
> + {
> + .compatible = "motorola,cpcap",
> + .data = (void *)CPCAP_DEFAULT
Single line should be fine.
> + }, {
> + .compatible = "motorola,mapphone-cpcap",
> + .data = (void *)CPCAP_MAPPHONE
> + },
> + { /* sentinel */ }
> +};
> +MODULE_DEVICE_TABLE(of, cpcap_of_match);
> +
> +static const struct spi_device_id cpcap_spi_ids[] = {
> + { "cpcap", CPCAP_DEFAULT },
> + { "mapphone-cpcap", CPCAP_MAPPHONE },
> + { /* sentinel */ }
> +};
> +MODULE_DEVICE_TABLE(spi, cpcap_spi_ids);
> +
> static struct spi_driver cpcap_driver = {
> .driver = {
> .name = "cpcap-core",
> diff --git a/include/linux/mfd/motorola-cpcap.h b/include/linux/mfd/motorola-cpcap.h
> index 981e5777deb7..1a85b06272c8 100644
> --- a/include/linux/mfd/motorola-cpcap.h
> +++ b/include/linux/mfd/motorola-cpcap.h
> @@ -25,6 +25,12 @@
> #define CPCAP_REVISION_2_0 0x10
> #define CPCAP_REVISION_2_1 0x11
>
> +enum cpcap_variant {
> + CPCAP_DEFAULT = 1,
> + CPCAP_MAPPHONE,
> + CPCAP_MAX
> +};
> +
> /* CPCAP registers */
> #define CPCAP_REG_INT1 0x0000 /* Interrupt 1 */
> #define CPCAP_REG_INT2 0x0004 /* Interrupt 2 */
> --
> 2.51.0
>
--
Lee Jones
next prev parent reply other threads:[~2026-05-20 15:08 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-10 11:07 [PATCH v5 0/6] mfd: cpcap: convert documentation to schema and add Mot board support Svyatoslav Ryhel
2026-05-10 11:07 ` [PATCH v5 1/6] dt-bindings: leds: leds-cpcap: convert to DT schema Svyatoslav Ryhel
2026-05-10 12:44 ` Rob Herring (Arm)
2026-05-10 11:08 ` [PATCH v5 2/6] dt-bindings: input: cpcap-pwrbutton: " Svyatoslav Ryhel
2026-05-10 12:44 ` Rob Herring (Arm)
2026-05-10 11:08 ` [PATCH v5 3/6] dt-bindings: mfd: motorola-cpcap: " Svyatoslav Ryhel
2026-05-11 21:19 ` sashiko-bot
2026-05-12 12:53 ` Rob Herring
2026-05-12 13:00 ` Svyatoslav Ryhel
2026-05-10 11:08 ` [PATCH v5 4/6] dt-bindings: mfd: motorola-cpcap: document Mapphone and Mot CPCAP Svyatoslav Ryhel
2026-05-11 21:37 ` sashiko-bot
2026-05-10 11:08 ` [PATCH v5 5/6] mfd: motorola-cpcap: diverge configuration per-board Svyatoslav Ryhel
2026-05-11 22:08 ` sashiko-bot
2026-05-20 15:07 ` Lee Jones [this message]
2026-05-20 15:29 ` Svyatoslav Ryhel
2026-05-20 16:05 ` Lee Jones
2026-05-20 16:30 ` Svyatoslav Ryhel
2026-05-20 17:02 ` Lee Jones
2026-05-20 17:25 ` Svyatoslav Ryhel
2026-05-10 11:08 ` [PATCH v5 6/6] mfd: motorola-cpcap: add support for Mot CPCAP composition Svyatoslav Ryhel
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260520150758.GG2767592@google.com \
--to=lee@kernel.org \
--cc=clamor95@gmail.com \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=dlechner@baylibre.com \
--cc=dmitry.torokhov@gmail.com \
--cc=krzk+dt@kernel.org \
--cc=linux-input@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-leds@vger.kernel.org \
--cc=pavel@kernel.org \
--cc=robh@kernel.org \
--cc=tony@atomide.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.