All of lore.kernel.org
 help / color / mirror / Atom feed
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

  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.