From nobody Thu Apr 2 14:13:09 2026 Received: from srv01.abscue.de (abscue.de [89.58.28.240]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 51F0E2D2397; Sun, 29 Mar 2026 07:28:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=89.58.28.240 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774769282; cv=none; b=EpErv0hZB+TS+2cbDRIWkMatimvCSbIoWkvIqKZXqVFenEGRJdNOmcdL65GkY2r/dq4X7Zdc5qLyVGUI2Zizo1hwDeYsh+u15QeJdonnnTUK9uEUtq7fEuAfV1FT2l+TLPpf9YKFjwFvKnoEg3aw5MGiW93ddeDgt8zX3wQgspk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774769282; c=relaxed/simple; bh=Tl09DoUDI1WlaEUHifoyQ4Al5NOut7mqf6EZMe4sI2s=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=hA2NnSHwKPLelO/XlnatCJKlDSUsLNL0wyXi1fBGiKBqTq7/pLyhbB/dC03EGOLa7gbKQ5/datePAZrri2fGUnzB0mwrbyq682WK6pwmj2MQGQJ0Qz54BP8DgL7zPp5CRabTcQG7aFYUxhfZhbc45O+tl+cg77WHp+bxdm1Fg2I= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=abscue.de; spf=pass smtp.mailfrom=abscue.de; dkim=pass (2048-bit key) header.d=abscue.de header.i=@abscue.de header.b=U+9Qs3SZ; arc=none smtp.client-ip=89.58.28.240 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=abscue.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=abscue.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=abscue.de header.i=@abscue.de header.b="U+9Qs3SZ" Received: from fluffy-mammal.metal.fwg-cag.de (87-94-78-46.co.dnainternet.fi [87.94.78.46]) by srv01.abscue.de (Postfix) with ESMTPSA id E3AE41C00AB; Sun, 29 Mar 2026 09:27:51 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=abscue.de; s=dkim; t=1774769272; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=GFndEwzrEeElHMwydsTfrQcvJvh+4gQQGNsvs8BcG4I=; b=U+9Qs3SZPg77N7kyZLrzIyPXNELvM12jnmS5XFnAbPizvudZupWlL2Pv5PPVIrnGOx3ycw bNKzug67Q0UuiOD9oi5q3lZNOBQTjNRqBzvxz+MA2V34H98gZqNn4XPgV7jlc3SBpqzSF5 8nrkEFkPnWR6CkwfsqKdRwULNMjCE9535Nl4T8GSYFhzSg2uttOJnyh8N7mp1oqD+gdX2/ zmf0IqPXpCXgHp4liWIhjmKmRPl9CoOrqe1j/AjknmogEVEEQb4AeYynE/OnsBydSC3dE4 UDqHKde2PkGPaYTKBKF2V9qvjJsFPvyHn1Op9lpslUB4u2vmZb3BS6wSY3+rGQ== From: =?utf-8?q?Otto_Pfl=C3=BCger?= Date: Sun, 29 Mar 2026 09:27:47 +0200 Subject: [PATCH v3 3/5] mfd: sprd-sc27xx: Switch to devm_mfd_add_devices() Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260329-sc27xx-mfd-cells-v3-3-9158dee41f74@abscue.de> References: <20260329-sc27xx-mfd-cells-v3-0-9158dee41f74@abscue.de> In-Reply-To: <20260329-sc27xx-mfd-cells-v3-0-9158dee41f74@abscue.de> To: Alexandre Belloni , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Orson Zhai , Baolin Wang , Chunyan Zhang , Lee Jones , Pavel Machek , Liam Girdwood , Mark Brown , Sebastian Reichel Cc: linux-rtc@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-leds@vger.kernel.org, linux-pm@vger.kernel.org, =?utf-8?q?Otto_Pfl=C3=BCger?= X-Mailer: b4 0.14.3 To allow instantiating subdevices such as the regulator and poweroff devices that do not have corresponding device tree nodes with a "compatible" property, use devm_mfd_add_devices() with MFD cells instead of devm_of_platform_populate(). Since different PMICs in the SC27xx series contain different components, use separate MFD cell tables for each PMIC model. Define cells for all components that have upstream drivers at this point. Signed-off-by: Otto Pfl=C3=BCger --- drivers/mfd/sprd-sc27xx-spi.c | 62 ++++++++++++++++++++++++++++++++++++---= ---- 1 file changed, 53 insertions(+), 9 deletions(-) diff --git a/drivers/mfd/sprd-sc27xx-spi.c b/drivers/mfd/sprd-sc27xx-spi.c index d6b4350779e6..aa052f646623 100644 --- a/drivers/mfd/sprd-sc27xx-spi.c +++ b/drivers/mfd/sprd-sc27xx-spi.c @@ -14,6 +14,11 @@ #include #include =20 +enum sprd_pmic_type { + PMIC_TYPE_SC2730 =3D 1, + PMIC_TYPE_SC2731, +}; + #define SPRD_PMIC_INT_MASK_STATUS 0x0 #define SPRD_PMIC_INT_RAW_STATUS 0x4 #define SPRD_PMIC_INT_EN 0x8 @@ -50,6 +55,29 @@ struct sprd_pmic_data { u32 charger_det; }; =20 +static const struct mfd_cell sc2730_devices[] =3D { + MFD_CELL_OF("sc2730-adc", NULL, NULL, 0, 0, "sprd,sc2730-adc"), + MFD_CELL_OF("sc2730-bltc", NULL, NULL, 0, 0, "sprd,sc2730-bltc"), + MFD_CELL_OF("sc2730-efuse", NULL, NULL, 0, 0, "sprd,sc2730-efuse"), + MFD_CELL_OF("sc2730-eic", NULL, NULL, 0, 0, "sprd,sc2730-eic"), + MFD_CELL_OF("sc2730-fgu", NULL, NULL, 0, 0, "sprd,sc2730-fgu"), + MFD_CELL_OF("sc2730-rtc", NULL, NULL, 0, 0, "sprd,sc2730-rtc"), + MFD_CELL_OF("sc2730-vibrator", NULL, NULL, 0, 0, "sprd,sc2730-vibrator"), +}; + +static const struct mfd_cell sc2731_devices[] =3D { + MFD_CELL_OF("sc2731-adc", NULL, NULL, 0, 0, "sprd,sc2731-adc"), + MFD_CELL_OF("sc2731-bltc", NULL, NULL, 0, 0, "sprd,sc2731-bltc"), + MFD_CELL_OF("sc2731-charger", NULL, NULL, 0, 0, "sprd,sc2731-charger"), + MFD_CELL_OF("sc2731-efuse", NULL, NULL, 0, 0, "sprd,sc2731-efuse"), + MFD_CELL_OF("sc2731-eic", NULL, NULL, 0, 0, "sprd,sc2731-eic"), + MFD_CELL_OF("sc2731-fgu", NULL, NULL, 0, 0, "sprd,sc2731-fgu"), + MFD_CELL_NAME("sc2731-poweroff"), + MFD_CELL_NAME("sc2731-regulator"), + MFD_CELL_OF("sc2731-rtc", NULL, NULL, 0, 0, "sprd,sc2731-rtc"), + MFD_CELL_OF("sc2731-vibrator", NULL, NULL, 0, 0, "sprd,sc2731-vibrator"), +}; + /* * Since different PMICs of SC27xx series can have different interrupt * base address and irq number, we should save irq number and irq base @@ -152,12 +180,26 @@ static const struct regmap_config sprd_pmic_config = =3D { static int sprd_pmic_probe(struct spi_device *spi) { struct sprd_pmic *ddata; + enum sprd_pmic_type pmic_type; const struct sprd_pmic_data *pdata; - int ret, i; + const struct mfd_cell *cells; + int ret, i, num_cells; + + pmic_type =3D (uintptr_t)of_device_get_match_data(&spi->dev); =20 - pdata =3D of_device_get_match_data(&spi->dev); - if (!pdata) { - dev_err(&spi->dev, "No matching driver data found\n"); + switch (pmic_type) { + case PMIC_TYPE_SC2730: + pdata =3D &sc2730_data; + cells =3D sc2730_devices; + num_cells =3D ARRAY_SIZE(sc2730_devices); + break; + case PMIC_TYPE_SC2731: + pdata =3D &sc2731_data; + cells =3D sc2731_devices; + num_cells =3D ARRAY_SIZE(sc2731_devices); + break; + default: + dev_err(&spi->dev, "Invalid device ID\n"); return -EINVAL; } =20 @@ -204,7 +246,9 @@ static int sprd_pmic_probe(struct spi_device *spi) return ret; } =20 - ret =3D devm_of_platform_populate(&spi->dev); + ret =3D devm_mfd_add_devices(&spi->dev, PLATFORM_DEVID_AUTO, + cells, num_cells, NULL, 0, + regmap_irq_get_domain(ddata->irq_data)); if (ret) { dev_err(&spi->dev, "Failed to populate sub-devices %d\n", ret); return ret; @@ -241,15 +285,15 @@ static DEFINE_SIMPLE_DEV_PM_OPS(sprd_pmic_pm_ops, sprd_pmic_suspend, sprd_pmic_resume); =20 static const struct of_device_id sprd_pmic_match[] =3D { - { .compatible =3D "sprd,sc2730", .data =3D &sc2730_data }, - { .compatible =3D "sprd,sc2731", .data =3D &sc2731_data }, + { .compatible =3D "sprd,sc2730", .data =3D (void *)PMIC_TYPE_SC2730 }, + { .compatible =3D "sprd,sc2731", .data =3D (void *)PMIC_TYPE_SC2731 }, {}, }; MODULE_DEVICE_TABLE(of, sprd_pmic_match); =20 static const struct spi_device_id sprd_pmic_spi_ids[] =3D { - { .name =3D "sc2730", .driver_data =3D (unsigned long)&sc2730_data }, - { .name =3D "sc2731", .driver_data =3D (unsigned long)&sc2731_data }, + { .name =3D "sc2730", .driver_data =3D PMIC_TYPE_SC2730 }, + { .name =3D "sc2731", .driver_data =3D PMIC_TYPE_SC2731 }, {}, }; MODULE_DEVICE_TABLE(spi, sprd_pmic_spi_ids); --=20 2.51.0