* Re: [PATCH v4 5/6 RESEND] mfd: motorola-cpcap: diverge configuration per-board [not found] ` <20260428153611.142816-6-clamor95@gmail.com> @ 2026-05-07 14:05 ` Lee Jones 2026-05-07 14:33 ` Svyatoslav Ryhel 2026-05-07 14:42 ` Svyatoslav Ryhel 0 siblings, 2 replies; 7+ messages in thread From: Lee Jones @ 2026-05-07 14:05 UTC (permalink / raw) To: Svyatoslav Ryhel Cc: Dmitry Torokhov, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Pavel Machek, David Lechner, Tony Lindgren, linux-input, devicetree, linux-kernel, linux-leds On Tue, 28 Apr 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> > --- Changelog? > drivers/mfd/motorola-cpcap.c | 101 ++++++++++++++++++++++++++++------- > 1 file changed, 83 insertions(+), 18 deletions(-) > > diff --git a/drivers/mfd/motorola-cpcap.c b/drivers/mfd/motorola-cpcap.c > index d8243b956f87..516d1e33affa 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> > > @@ -24,10 +25,16 @@ > #define CPCAP_REGISTER_SIZE 4 > #define CPCAP_REGISTER_BITS 16 > > +struct cpcap_chip_data { > + const struct mfd_cell *mfd_devices; > + unsigned int num_devices; > +}; This is a red flag. > struct cpcap_ddata { > struct spi_device *spi; > struct regmap_irq *irqs; > struct regmap_irq_chip_data *irqdata[CPCAP_NR_IRQ_CHIPS]; > + const struct cpcap_chip_data *cdata; > const struct regmap_config *regmap_conf; > struct regmap *regmap; > }; > @@ -195,20 +202,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,7 +234,56 @@ 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[] = { > +static const struct mfd_cell cpcap_default_mfd_devices[] = { > + { > + .name = "cpcap_adc", > + .of_compatible = "motorola,cpcap-adc", > + }, { > + .name = "cpcap_battery", > + .of_compatible = "motorola,cpcap-battery", > + }, { > + .name = "cpcap-regulator", > + .of_compatible = "motorola,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,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 cpcap_chip_data cpcap_default_data = { > + .mfd_devices = cpcap_default_mfd_devices, > + .num_devices = ARRAY_SIZE(cpcap_default_mfd_devices), > +}; > + > +static const struct mfd_cell cpcap_mapphone_mfd_devices[] = { > { > .name = "cpcap_adc", > .of_compatible = "motorola,mapphone-cpcap-adc", > @@ -285,7 +327,12 @@ static const struct mfd_cell cpcap_mfd_devices[] = { > .of_compatible = "motorola,cpcap-led-cp", > }, { > .name = "cpcap-codec", > - } > + }, > +}; > + > +static const struct cpcap_chip_data cpcap_mapphone_data = { > + .mfd_devices = cpcap_mapphone_mfd_devices, > + .num_devices = ARRAY_SIZE(cpcap_mapphone_mfd_devices), > }; > > static int cpcap_probe(struct spi_device *spi) > @@ -297,9 +344,17 @@ static int cpcap_probe(struct spi_device *spi) > if (!cpcap) > return -ENOMEM; > > + cpcap->cdata = device_get_match_data(&spi->dev); > + if (!cpcap->cdata) > + return -ENODEV; > + > cpcap->spi = spi; > spi_set_drvdata(spi, cpcap); > > @@ -331,16 +382,24 @@ 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, cpcap->cdata->mfd_devices, > + cpcap->cdata->num_devices, NULL, 0, NULL); > } > > +static const struct of_device_id cpcap_of_match[] = { > + { .compatible = "motorola,cpcap", .data = &cpcap_default_data }, > + { .compatible = "motorola,mapphone-cpcap", .data = &cpcap_mapphone_data }, We don't allow data from one device registration API (MFD) to be passed through another (OF) because it tends to lead to all sorts of "creative solutions". Pass a value instead and match on that in a switch() statement like all of the other MFD drivers do. > + { /* sentinel */ } > +}; > +MODULE_DEVICE_TABLE(of, cpcap_of_match); > + > +static const struct spi_device_id cpcap_spi_ids[] = { > + { .name = "cpcap", .driver_data = (kernel_ulong_t)&cpcap_default_data }, > + { .name = "mapphone-cpcap", .driver_data = (kernel_ulong_t)&cpcap_mapphone_data }, > + { /* sentinel */ } > +}; > +MODULE_DEVICE_TABLE(spi, cpcap_spi_ids); > + > static struct spi_driver cpcap_driver = { > .driver = { > .name = "cpcap-core", > -- > 2.51.0 > > -- Lee Jones ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v4 5/6 RESEND] mfd: motorola-cpcap: diverge configuration per-board 2026-05-07 14:05 ` [PATCH v4 5/6 RESEND] mfd: motorola-cpcap: diverge configuration per-board Lee Jones @ 2026-05-07 14:33 ` Svyatoslav Ryhel 2026-05-13 14:05 ` Lee Jones 2026-05-07 14:42 ` Svyatoslav Ryhel 1 sibling, 1 reply; 7+ messages in thread From: Svyatoslav Ryhel @ 2026-05-07 14:33 UTC (permalink / raw) To: Lee Jones Cc: Dmitry Torokhov, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Pavel Machek, David Lechner, Tony Lindgren, linux-input, devicetree, linux-kernel, linux-leds чт, 7 трав. 2026 р. о 17:05 Lee Jones <lee@kernel.org> пише: > > On Tue, 28 Apr 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> > > --- > > Changelog? > Changelog is in the cover. > > drivers/mfd/motorola-cpcap.c | 101 ++++++++++++++++++++++++++++------- > > 1 file changed, 83 insertions(+), 18 deletions(-) > > > > diff --git a/drivers/mfd/motorola-cpcap.c b/drivers/mfd/motorola-cpcap.c > > index d8243b956f87..516d1e33affa 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> > > > > @@ -24,10 +25,16 @@ > > #define CPCAP_REGISTER_SIZE 4 > > #define CPCAP_REGISTER_BITS 16 > > > > +struct cpcap_chip_data { > > + const struct mfd_cell *mfd_devices; > > + unsigned int num_devices; > > +}; > > This is a red flag. > > > struct cpcap_ddata { > > struct spi_device *spi; > > struct regmap_irq *irqs; > > struct regmap_irq_chip_data *irqdata[CPCAP_NR_IRQ_CHIPS]; > > + const struct cpcap_chip_data *cdata; > > const struct regmap_config *regmap_conf; > > struct regmap *regmap; > > }; > > @@ -195,20 +202,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,7 +234,56 @@ 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[] = { > > +static const struct mfd_cell cpcap_default_mfd_devices[] = { > > + { > > + .name = "cpcap_adc", > > + .of_compatible = "motorola,cpcap-adc", > > + }, { > > + .name = "cpcap_battery", > > + .of_compatible = "motorola,cpcap-battery", > > + }, { > > + .name = "cpcap-regulator", > > + .of_compatible = "motorola,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,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 cpcap_chip_data cpcap_default_data = { > > + .mfd_devices = cpcap_default_mfd_devices, > > + .num_devices = ARRAY_SIZE(cpcap_default_mfd_devices), > > +}; > > + > > +static const struct mfd_cell cpcap_mapphone_mfd_devices[] = { > > { > > .name = "cpcap_adc", > > .of_compatible = "motorola,mapphone-cpcap-adc", > > @@ -285,7 +327,12 @@ static const struct mfd_cell cpcap_mfd_devices[] = { > > .of_compatible = "motorola,cpcap-led-cp", > > }, { > > .name = "cpcap-codec", > > - } > > + }, > > +}; > > + > > +static const struct cpcap_chip_data cpcap_mapphone_data = { > > + .mfd_devices = cpcap_mapphone_mfd_devices, > > + .num_devices = ARRAY_SIZE(cpcap_mapphone_mfd_devices), > > }; > > > > static int cpcap_probe(struct spi_device *spi) > > @@ -297,9 +344,17 @@ static int cpcap_probe(struct spi_device *spi) > > if (!cpcap) > > return -ENOMEM; > > > > + cpcap->cdata = device_get_match_data(&spi->dev); > > + if (!cpcap->cdata) > > + return -ENODEV; > > + > > cpcap->spi = spi; > > spi_set_drvdata(spi, cpcap); > > > > @@ -331,16 +382,24 @@ 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, cpcap->cdata->mfd_devices, > > + cpcap->cdata->num_devices, NULL, 0, NULL); > > } > > > > +static const struct of_device_id cpcap_of_match[] = { > > + { .compatible = "motorola,cpcap", .data = &cpcap_default_data }, > > + { .compatible = "motorola,mapphone-cpcap", .data = &cpcap_mapphone_data }, > > We don't allow data from one device registration API (MFD) to be passed > through another (OF) because it tends to lead to all sorts of "creative > solutions". Pass a value instead and match on that in a switch() > statement like all of the other MFD drivers do. > You don't allow this. I have not seen this enforced anywhere in the kernel except the mfd subsystem. Fine, does not matter, if this makes you happy I will adjust. > > + { /* sentinel */ } > > +}; > > +MODULE_DEVICE_TABLE(of, cpcap_of_match); > > + > > +static const struct spi_device_id cpcap_spi_ids[] = { > > + { .name = "cpcap", .driver_data = (kernel_ulong_t)&cpcap_default_data }, > > + { .name = "mapphone-cpcap", .driver_data = (kernel_ulong_t)&cpcap_mapphone_data }, > > + { /* sentinel */ } > > +}; > > +MODULE_DEVICE_TABLE(spi, cpcap_spi_ids); > > + > > static struct spi_driver cpcap_driver = { > > .driver = { > > .name = "cpcap-core", > > -- > > 2.51.0 > > > > > > -- > Lee Jones ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v4 5/6 RESEND] mfd: motorola-cpcap: diverge configuration per-board 2026-05-07 14:33 ` Svyatoslav Ryhel @ 2026-05-13 14:05 ` Lee Jones 0 siblings, 0 replies; 7+ messages in thread From: Lee Jones @ 2026-05-13 14:05 UTC (permalink / raw) To: Svyatoslav Ryhel Cc: Dmitry Torokhov, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Pavel Machek, David Lechner, Tony Lindgren, linux-input, devicetree, linux-kernel, linux-leds On Thu, 07 May 2026, Svyatoslav Ryhel wrote: > чт, 7 трав. 2026 р. о 17:05 Lee Jones <lee@kernel.org> пише: > > > > On Tue, 28 Apr 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> > > > --- > > > > Changelog? > > > > Changelog is in the cover. > > > > drivers/mfd/motorola-cpcap.c | 101 ++++++++++++++++++++++++++++------- > > > 1 file changed, 83 insertions(+), 18 deletions(-) > > > > > > diff --git a/drivers/mfd/motorola-cpcap.c b/drivers/mfd/motorola-cpcap.c > > > index d8243b956f87..516d1e33affa 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> > > > > > > @@ -24,10 +25,16 @@ > > > #define CPCAP_REGISTER_SIZE 4 > > > #define CPCAP_REGISTER_BITS 16 > > > > > > +struct cpcap_chip_data { > > > + const struct mfd_cell *mfd_devices; > > > + unsigned int num_devices; > > > +}; > > > > This is a red flag. > > > > > struct cpcap_ddata { > > > struct spi_device *spi; > > > struct regmap_irq *irqs; > > > struct regmap_irq_chip_data *irqdata[CPCAP_NR_IRQ_CHIPS]; > > > + const struct cpcap_chip_data *cdata; > > > const struct regmap_config *regmap_conf; > > > struct regmap *regmap; > > > }; > > > @@ -195,20 +202,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,7 +234,56 @@ 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[] = { > > > +static const struct mfd_cell cpcap_default_mfd_devices[] = { > > > + { > > > + .name = "cpcap_adc", > > > + .of_compatible = "motorola,cpcap-adc", > > > + }, { > > > + .name = "cpcap_battery", > > > + .of_compatible = "motorola,cpcap-battery", > > > + }, { > > > + .name = "cpcap-regulator", > > > + .of_compatible = "motorola,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,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 cpcap_chip_data cpcap_default_data = { > > > + .mfd_devices = cpcap_default_mfd_devices, > > > + .num_devices = ARRAY_SIZE(cpcap_default_mfd_devices), > > > +}; > > > + > > > +static const struct mfd_cell cpcap_mapphone_mfd_devices[] = { > > > { > > > .name = "cpcap_adc", > > > .of_compatible = "motorola,mapphone-cpcap-adc", > > > @@ -285,7 +327,12 @@ static const struct mfd_cell cpcap_mfd_devices[] = { > > > .of_compatible = "motorola,cpcap-led-cp", > > > }, { > > > .name = "cpcap-codec", > > > - } > > > + }, > > > +}; > > > + > > > +static const struct cpcap_chip_data cpcap_mapphone_data = { > > > + .mfd_devices = cpcap_mapphone_mfd_devices, > > > + .num_devices = ARRAY_SIZE(cpcap_mapphone_mfd_devices), > > > }; > > > > > > static int cpcap_probe(struct spi_device *spi) > > > @@ -297,9 +344,17 @@ static int cpcap_probe(struct spi_device *spi) > > > if (!cpcap) > > > return -ENOMEM; > > > > > > + cpcap->cdata = device_get_match_data(&spi->dev); > > > + if (!cpcap->cdata) > > > + return -ENODEV; > > > + > > > cpcap->spi = spi; > > > spi_set_drvdata(spi, cpcap); > > > > > > @@ -331,16 +382,24 @@ 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, cpcap->cdata->mfd_devices, > > > + cpcap->cdata->num_devices, NULL, 0, NULL); > > > } > > > > > > +static const struct of_device_id cpcap_of_match[] = { > > > + { .compatible = "motorola,cpcap", .data = &cpcap_default_data }, > > > + { .compatible = "motorola,mapphone-cpcap", .data = &cpcap_mapphone_data }, > > > > We don't allow data from one device registration API (MFD) to be passed > > through another (OF) because it tends to lead to all sorts of "creative > > solutions". Pass a value instead and match on that in a switch() > > statement like all of the other MFD drivers do. > > > > You don't allow this. I have not seen this enforced anywhere in the > kernel except the mfd subsystem. Fine, does not matter, if this makes > you happy I will adjust. Where else would this rule be applicable? I can't think of anywhere. -- Lee Jones ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v4 5/6 RESEND] mfd: motorola-cpcap: diverge configuration per-board 2026-05-07 14:05 ` [PATCH v4 5/6 RESEND] mfd: motorola-cpcap: diverge configuration per-board Lee Jones 2026-05-07 14:33 ` Svyatoslav Ryhel @ 2026-05-07 14:42 ` Svyatoslav Ryhel 2026-05-13 14:04 ` Lee Jones 1 sibling, 1 reply; 7+ messages in thread From: Svyatoslav Ryhel @ 2026-05-07 14:42 UTC (permalink / raw) To: Lee Jones Cc: Dmitry Torokhov, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Pavel Machek, David Lechner, Tony Lindgren, linux-input, devicetree, linux-kernel, linux-leds чт, 7 трав. 2026 р. о 17:05 Lee Jones <lee@kernel.org> пише: > > On Tue, 28 Apr 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> > > --- > > Changelog? > > > drivers/mfd/motorola-cpcap.c | 101 ++++++++++++++++++++++++++++------- > > 1 file changed, 83 insertions(+), 18 deletions(-) > > > > diff --git a/drivers/mfd/motorola-cpcap.c b/drivers/mfd/motorola-cpcap.c > > index d8243b956f87..516d1e33affa 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> > > > > @@ -24,10 +25,16 @@ > > #define CPCAP_REGISTER_SIZE 4 > > #define CPCAP_REGISTER_BITS 16 > > > > +struct cpcap_chip_data { > > + const struct mfd_cell *mfd_devices; > > + unsigned int num_devices; > > +}; > > This is a red flag. > > > struct cpcap_ddata { > > struct spi_device *spi; > > struct regmap_irq *irqs; > > struct regmap_irq_chip_data *irqdata[CPCAP_NR_IRQ_CHIPS]; > > + const struct cpcap_chip_data *cdata; > > const struct regmap_config *regmap_conf; > > struct regmap *regmap; > > }; > > @@ -195,20 +202,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,7 +234,56 @@ 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[] = { > > +static const struct mfd_cell cpcap_default_mfd_devices[] = { > > + { > > + .name = "cpcap_adc", > > + .of_compatible = "motorola,cpcap-adc", > > + }, { > > + .name = "cpcap_battery", > > + .of_compatible = "motorola,cpcap-battery", > > + }, { > > + .name = "cpcap-regulator", > > + .of_compatible = "motorola,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,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", > > + }, > > +}; Lee, would you mind if I convert these mfd_cell structures to use macros in this commit since I am refactoring them anyway? > > + > > +static const struct cpcap_chip_data cpcap_default_data = { > > + .mfd_devices = cpcap_default_mfd_devices, > > + .num_devices = ARRAY_SIZE(cpcap_default_mfd_devices), > > +}; > > + > > +static const struct mfd_cell cpcap_mapphone_mfd_devices[] = { > > { > > .name = "cpcap_adc", > > .of_compatible = "motorola,mapphone-cpcap-adc", > > @@ -285,7 +327,12 @@ static const struct mfd_cell cpcap_mfd_devices[] = { > > .of_compatible = "motorola,cpcap-led-cp", > > }, { > > .name = "cpcap-codec", > > - } > > + }, > > +}; > > + > > +static const struct cpcap_chip_data cpcap_mapphone_data = { > > + .mfd_devices = cpcap_mapphone_mfd_devices, > > + .num_devices = ARRAY_SIZE(cpcap_mapphone_mfd_devices), > > }; > > > > static int cpcap_probe(struct spi_device *spi) > > @@ -297,9 +344,17 @@ static int cpcap_probe(struct spi_device *spi) > > if (!cpcap) > > return -ENOMEM; > > > > + cpcap->cdata = device_get_match_data(&spi->dev); > > + if (!cpcap->cdata) > > + return -ENODEV; > > + > > cpcap->spi = spi; > > spi_set_drvdata(spi, cpcap); > > > > @@ -331,16 +382,24 @@ 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, cpcap->cdata->mfd_devices, > > + cpcap->cdata->num_devices, NULL, 0, NULL); > > } > > > > +static const struct of_device_id cpcap_of_match[] = { > > + { .compatible = "motorola,cpcap", .data = &cpcap_default_data }, > > + { .compatible = "motorola,mapphone-cpcap", .data = &cpcap_mapphone_data }, > > We don't allow data from one device registration API (MFD) to be passed > through another (OF) because it tends to lead to all sorts of "creative > solutions". Pass a value instead and match on that in a switch() > statement like all of the other MFD drivers do. > > > + { /* sentinel */ } > > +}; > > +MODULE_DEVICE_TABLE(of, cpcap_of_match); > > + > > +static const struct spi_device_id cpcap_spi_ids[] = { > > + { .name = "cpcap", .driver_data = (kernel_ulong_t)&cpcap_default_data }, > > + { .name = "mapphone-cpcap", .driver_data = (kernel_ulong_t)&cpcap_mapphone_data }, > > + { /* sentinel */ } > > +}; > > +MODULE_DEVICE_TABLE(spi, cpcap_spi_ids); > > + > > static struct spi_driver cpcap_driver = { > > .driver = { > > .name = "cpcap-core", > > -- > > 2.51.0 > > > > > > -- > Lee Jones ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v4 5/6 RESEND] mfd: motorola-cpcap: diverge configuration per-board 2026-05-07 14:42 ` Svyatoslav Ryhel @ 2026-05-13 14:04 ` Lee Jones 0 siblings, 0 replies; 7+ messages in thread From: Lee Jones @ 2026-05-13 14:04 UTC (permalink / raw) To: Svyatoslav Ryhel Cc: Dmitry Torokhov, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Pavel Machek, David Lechner, Tony Lindgren, linux-input, devicetree, linux-kernel, linux-leds On Thu, 07 May 2026, Svyatoslav Ryhel wrote: > чт, 7 трав. 2026 р. о 17:05 Lee Jones <lee@kernel.org> пише: > > > > On Tue, 28 Apr 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> > > > --- > > > > Changelog? > > > > > drivers/mfd/motorola-cpcap.c | 101 ++++++++++++++++++++++++++++------- > > > 1 file changed, 83 insertions(+), 18 deletions(-) > > > > > > diff --git a/drivers/mfd/motorola-cpcap.c b/drivers/mfd/motorola-cpcap.c > > > index d8243b956f87..516d1e33affa 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> > > > > > > @@ -24,10 +25,16 @@ > > > #define CPCAP_REGISTER_SIZE 4 > > > #define CPCAP_REGISTER_BITS 16 > > > > > > +struct cpcap_chip_data { > > > + const struct mfd_cell *mfd_devices; > > > + unsigned int num_devices; > > > +}; > > > > This is a red flag. > > > > > struct cpcap_ddata { > > > struct spi_device *spi; > > > struct regmap_irq *irqs; > > > struct regmap_irq_chip_data *irqdata[CPCAP_NR_IRQ_CHIPS]; > > > + const struct cpcap_chip_data *cdata; > > > const struct regmap_config *regmap_conf; > > > struct regmap *regmap; > > > }; > > > @@ -195,20 +202,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,7 +234,56 @@ 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[] = { > > > +static const struct mfd_cell cpcap_default_mfd_devices[] = { > > > + { > > > + .name = "cpcap_adc", > > > + .of_compatible = "motorola,cpcap-adc", > > > + }, { > > > + .name = "cpcap_battery", > > > + .of_compatible = "motorola,cpcap-battery", > > > + }, { > > > + .name = "cpcap-regulator", > > > + .of_compatible = "motorola,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,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", > > > + }, > > > +}; > > Lee, would you mind if I convert these mfd_cell structures to use > macros in this commit since I am refactoring them anyway? Sure. -- Lee Jones ^ permalink raw reply [flat|nested] 7+ messages in thread
[parent not found: <20260428153611.142816-7-clamor95@gmail.com>]
* Re: [PATCH v4 6/6 RESEND] mfd: motorola-cpcap: add support for Mot CPCAP composition [not found] ` <20260428153611.142816-7-clamor95@gmail.com> @ 2026-05-07 14:07 ` Lee Jones 2026-05-07 14:36 ` Svyatoslav Ryhel 0 siblings, 1 reply; 7+ messages in thread From: Lee Jones @ 2026-05-07 14:07 UTC (permalink / raw) To: Svyatoslav Ryhel Cc: Dmitry Torokhov, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Pavel Machek, David Lechner, Tony Lindgren, linux-input, devicetree, linux-kernel, linux-leds On Tue, 28 Apr 2026, Svyatoslav Ryhel wrote: > Add a MFD subdevice composition used in Tegra20 based Mot board > (Motorola Atrix 4G and Droid X2). > > Signed-off-by: Svyatoslav Ryhel <clamor95@gmail.com> > --- > drivers/mfd/motorola-cpcap.c | 50 ++++++++++++++++++++++++++++++++++++ > 1 file changed, 50 insertions(+) > > diff --git a/drivers/mfd/motorola-cpcap.c b/drivers/mfd/motorola-cpcap.c > index 516d1e33affa..fdec92f5c6b0 100644 > --- a/drivers/mfd/motorola-cpcap.c > +++ b/drivers/mfd/motorola-cpcap.c > @@ -335,6 +335,54 @@ static const struct cpcap_chip_data cpcap_mapphone_data = { > .num_devices = ARRAY_SIZE(cpcap_mapphone_mfd_devices), > }; > > +/* > + * The Mot board features a USB-PHY and charger similar to the ones in > + * Mapphone; however, because Mot is based on Tegra20, it is incompatible > + * with the existing implementation, which is tightly interconnected with > + * the OMAP USB PHY. > + */ > +static const struct mfd_cell cpcap_mot_mfd_devices[] = { > + { > + .name = "cpcap_adc", > + .of_compatible = "motorola,mot-cpcap-adc", > + }, { > + .name = "cpcap_battery", > + .of_compatible = "motorola,cpcap-battery", > + }, { > + .name = "cpcap-regulator", > + .of_compatible = "motorola,mot-cpcap-regulator", > + }, { > + .name = "cpcap-rtc", > + .of_compatible = "motorola,cpcap-rtc", > + }, { > + .name = "cpcap-pwrbutton", > + .of_compatible = "motorola,cpcap-pwrbutton", > + }, { > + .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", MFD_CELL_OF() for all. > + }, { > + .name = "cpcap-codec", > + }, MFD_CELL_NAME() > +}; > + > +static const struct cpcap_chip_data cpcap_mot_data = { > + .mfd_devices = cpcap_mot_mfd_devices, > + .num_devices = ARRAY_SIZE(cpcap_mot_mfd_devices), > +}; > + > static int cpcap_probe(struct spi_device *spi) > { > struct cpcap_ddata *cpcap; > @@ -389,6 +437,7 @@ static int cpcap_probe(struct spi_device *spi) > static const struct of_device_id cpcap_of_match[] = { > { .compatible = "motorola,cpcap", .data = &cpcap_default_data }, > { .compatible = "motorola,mapphone-cpcap", .data = &cpcap_mapphone_data }, > + { .compatible = "motorola,mot-cpcap", .data = &cpcap_mot_data }, > { /* sentinel */ } > }; > MODULE_DEVICE_TABLE(of, cpcap_of_match); > @@ -396,6 +445,7 @@ MODULE_DEVICE_TABLE(of, cpcap_of_match); > static const struct spi_device_id cpcap_spi_ids[] = { > { .name = "cpcap", .driver_data = (kernel_ulong_t)&cpcap_default_data }, > { .name = "mapphone-cpcap", .driver_data = (kernel_ulong_t)&cpcap_mapphone_data }, > + { .name = "mot-cpcap", .driver_data = (kernel_ulong_t)&cpcap_mot_data }, > { /* sentinel */ } > }; > MODULE_DEVICE_TABLE(spi, cpcap_spi_ids); > -- > 2.51.0 > -- Lee Jones ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v4 6/6 RESEND] mfd: motorola-cpcap: add support for Mot CPCAP composition 2026-05-07 14:07 ` [PATCH v4 6/6 RESEND] mfd: motorola-cpcap: add support for Mot CPCAP composition Lee Jones @ 2026-05-07 14:36 ` Svyatoslav Ryhel 0 siblings, 0 replies; 7+ messages in thread From: Svyatoslav Ryhel @ 2026-05-07 14:36 UTC (permalink / raw) To: Lee Jones Cc: Dmitry Torokhov, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Pavel Machek, David Lechner, Tony Lindgren, linux-input, devicetree, linux-kernel, linux-leds чт, 7 трав. 2026 р. о 17:07 Lee Jones <lee@kernel.org> пише: > > On Tue, 28 Apr 2026, Svyatoslav Ryhel wrote: > > > Add a MFD subdevice composition used in Tegra20 based Mot board > > (Motorola Atrix 4G and Droid X2). > > > > Signed-off-by: Svyatoslav Ryhel <clamor95@gmail.com> > > --- > > drivers/mfd/motorola-cpcap.c | 50 ++++++++++++++++++++++++++++++++++++ > > 1 file changed, 50 insertions(+) > > > > diff --git a/drivers/mfd/motorola-cpcap.c b/drivers/mfd/motorola-cpcap.c > > index 516d1e33affa..fdec92f5c6b0 100644 > > --- a/drivers/mfd/motorola-cpcap.c > > +++ b/drivers/mfd/motorola-cpcap.c > > @@ -335,6 +335,54 @@ static const struct cpcap_chip_data cpcap_mapphone_data = { > > .num_devices = ARRAY_SIZE(cpcap_mapphone_mfd_devices), > > }; > > > > +/* > > + * The Mot board features a USB-PHY and charger similar to the ones in > > + * Mapphone; however, because Mot is based on Tegra20, it is incompatible > > + * with the existing implementation, which is tightly interconnected with > > + * the OMAP USB PHY. > > + */ > > +static const struct mfd_cell cpcap_mot_mfd_devices[] = { > > + { > > + .name = "cpcap_adc", > > + .of_compatible = "motorola,mot-cpcap-adc", > > + }, { > > + .name = "cpcap_battery", > > + .of_compatible = "motorola,cpcap-battery", > > + }, { > > + .name = "cpcap-regulator", > > + .of_compatible = "motorola,mot-cpcap-regulator", > > + }, { > > + .name = "cpcap-rtc", > > + .of_compatible = "motorola,cpcap-rtc", > > + }, { > > + .name = "cpcap-pwrbutton", > > + .of_compatible = "motorola,cpcap-pwrbutton", > > + }, { > > + .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", > > MFD_CELL_OF() for all. > > > + }, { > > + .name = "cpcap-codec", > > + }, > > MFD_CELL_NAME() > I was not aware these macros exist. Thank you for pointing to them. > > +}; > > + > > +static const struct cpcap_chip_data cpcap_mot_data = { > > + .mfd_devices = cpcap_mot_mfd_devices, > > + .num_devices = ARRAY_SIZE(cpcap_mot_mfd_devices), > > +}; > > + > > static int cpcap_probe(struct spi_device *spi) > > { > > struct cpcap_ddata *cpcap; > > @@ -389,6 +437,7 @@ static int cpcap_probe(struct spi_device *spi) > > static const struct of_device_id cpcap_of_match[] = { > > { .compatible = "motorola,cpcap", .data = &cpcap_default_data }, > > { .compatible = "motorola,mapphone-cpcap", .data = &cpcap_mapphone_data }, > > + { .compatible = "motorola,mot-cpcap", .data = &cpcap_mot_data }, > > { /* sentinel */ } > > }; > > MODULE_DEVICE_TABLE(of, cpcap_of_match); > > @@ -396,6 +445,7 @@ MODULE_DEVICE_TABLE(of, cpcap_of_match); > > static const struct spi_device_id cpcap_spi_ids[] = { > > { .name = "cpcap", .driver_data = (kernel_ulong_t)&cpcap_default_data }, > > { .name = "mapphone-cpcap", .driver_data = (kernel_ulong_t)&cpcap_mapphone_data }, > > + { .name = "mot-cpcap", .driver_data = (kernel_ulong_t)&cpcap_mot_data }, > > { /* sentinel */ } > > }; > > MODULE_DEVICE_TABLE(spi, cpcap_spi_ids); > > -- > > 2.51.0 > > > > -- > Lee Jones ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2026-05-13 14:05 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20260428153611.142816-1-clamor95@gmail.com>
[not found] ` <20260428153611.142816-6-clamor95@gmail.com>
2026-05-07 14:05 ` [PATCH v4 5/6 RESEND] mfd: motorola-cpcap: diverge configuration per-board Lee Jones
2026-05-07 14:33 ` Svyatoslav Ryhel
2026-05-13 14:05 ` Lee Jones
2026-05-07 14:42 ` Svyatoslav Ryhel
2026-05-13 14:04 ` Lee Jones
[not found] ` <20260428153611.142816-7-clamor95@gmail.com>
2026-05-07 14:07 ` [PATCH v4 6/6 RESEND] mfd: motorola-cpcap: add support for Mot CPCAP composition Lee Jones
2026-05-07 14:36 ` Svyatoslav Ryhel
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox