diff mbox series

[v2,2/7] drivers: misc: k3_avs: Use soc_match_device instead of compatible.

Message ID 20240528-b4-upstream-j721s2-avs-v2-2-df940f2309d0@ti.com
State Changes Requested
Delegated to: Tom Rini
Headers show
Series Add AVS support for J721S2 | expand

Commit Message

Manorit Chawdhry May 28, 2024, 8:13 a.m. UTC
vd_data remains the same for most of the SoCs but there are some
differences in power domains and clocks that don't need a change to
compatible and can be handled at SoC level.

Change the data population logic from compatible to soc_match_device to
add support for newer devices.

Signed-off-by: Manorit Chawdhry <m-chawdhry@ti.com>
---
 drivers/misc/k3_avs.c | 189 +++++++++++++++++++++++++++-----------------------
 1 file changed, 103 insertions(+), 86 deletions(-)

Comments

Kumar, Udit May 29, 2024, 4:21 a.m. UTC | #1
Hi Manorit

On 5/28/2024 1:43 PM, Manorit Chawdhry wrote:
> vd_data remains the same for most of the SoCs but there are some
> differences in power domains and clocks that don't need a change to
> compatible and can be handled at SoC level.
>
> Change the data population logic from compatible to soc_match_device to
> add support for newer devices.
>
> Signed-off-by: Manorit Chawdhry <m-chawdhry@ti.com>
> ---
>   drivers/misc/k3_avs.c | 189 +++++++++++++++++++++++++++-----------------------
>   1 file changed, 103 insertions(+), 86 deletions(-)
>
> diff --git a/drivers/misc/k3_avs.c b/drivers/misc/k3_avs.c
> index 87471cc3b16a..a0d7bb7595b3 100644
> --- a/drivers/misc/k3_avs.c
> +++ b/drivers/misc/k3_avs.c
> @@ -12,6 +12,7 @@
>   #include <asm/io.h>
>   #include <i2c.h>
>   #include <k3-avs.h>
> +#include <soc.h>
>   #include <dm/device_compat.h>
>   #include <linux/bitops.h>
>   #include <linux/delay.h>
> @@ -111,6 +112,95 @@ static u32 am6_efuse_xlate(struct k3_avs_privdata *priv, int idx, int opp)
>   	return 300000 + 20000 * val;
>   }
>   
> [..]
> +const struct soc_attr vtm_soc_list[] = {
> +	{ .family = "AM65X", .data = (void *)&am654_vd_config },
> +	{ .family = "J721E", .data = (void *)&j721e_vd_config },
> +	{ .family = "J7200", .data = (void *)&j721e_vd_config },
> +	{}
> +};

We may end up updating this driver for each SOC family,

Even if VTM IP remain same in two SOC family.

In my view, driver should be specific to IP not specific to SOC or SOC 
family.


> [..]
>
Tom Rini June 13, 2024, 2:20 p.m. UTC | #2
On Tue, May 28, 2024 at 01:43:01PM +0530, Manorit Chawdhry wrote:

> vd_data remains the same for most of the SoCs but there are some
> differences in power domains and clocks that don't need a change to
> compatible and can be handled at SoC level.
> 
> Change the data population logic from compatible to soc_match_device to
> add support for newer devices.
> 
> Signed-off-by: Manorit Chawdhry <m-chawdhry@ti.com>

On am65x_evm_r5_usbdfu am65x_evm_r5_usbmsc:
       arm:  +   am65x_evm_r5_usbmsc
+(am65x_evm_r5_usbmsc) In function 'k3_avs_configure',
+(am65x_evm_r5_usbmsc)     inlined from 'k3_avs_probe' at drivers/misc/k3_avs.c:459:8:
+(am65x_evm_r5_usbmsc) drivers/misc/k3_avs.c:333:12: error: 'conf' is used uninitialized [-Werror=uninitialized]
+(am65x_evm_r5_usbmsc)   333 |         if (!conf) {
+(am65x_evm_r5_usbmsc)       |            ^
+(am65x_evm_r5_usbmsc) drivers/misc/k3_avs.c: In function 'k3_avs_probe':
+(am65x_evm_r5_usbmsc) drivers/misc/k3_avs.c:323:27: note: 'conf' was declared here
+(am65x_evm_r5_usbmsc)   323 |         struct vd_config *conf;
+(am65x_evm_r5_usbmsc)       |                           ^~~~
+(am65x_evm_r5_usbmsc) cc1: all warnings being treated as errors
+(am65x_evm_r5_usbmsc) make[3]: *** [scripts/Makefile.build:256: drivers/misc/k3_avs.o] Error 1
+(am65x_evm_r5_usbmsc) make[2]: *** [scripts/Makefile.build:397: drivers/misc] Error 2
+(am65x_evm_r5_usbmsc) make[1]: *** [Makefile:1892: drivers] Error 2
+(am65x_evm_r5_usbmsc) make: *** [Makefile:177: sub-make] Error 2
diff mbox series

Patch

diff --git a/drivers/misc/k3_avs.c b/drivers/misc/k3_avs.c
index 87471cc3b16a..a0d7bb7595b3 100644
--- a/drivers/misc/k3_avs.c
+++ b/drivers/misc/k3_avs.c
@@ -12,6 +12,7 @@ 
 #include <asm/io.h>
 #include <i2c.h>
 #include <k3-avs.h>
+#include <soc.h>
 #include <dm/device_compat.h>
 #include <linux/bitops.h>
 #include <linux/delay.h>
@@ -111,6 +112,95 @@  static u32 am6_efuse_xlate(struct k3_avs_privdata *priv, int idx, int opp)
 	return 300000 + 20000 * val;
 }
 
+static struct vd_data am654_vd_data[] = {
+	{
+		.id = AM6_VDD_CORE,
+		.dev_id = 82, /* AM6_DEV_CBASS0 */
+		.clk_id = 0, /* main sysclk0 */
+		.opp = AM6_OPP_NOM,
+		.opps = {
+			[AM6_OPP_NOM] = {
+				.volt = 1000000,
+				.freq = 250000000, /* CBASS0 */
+			},
+		},
+	},
+	{
+		.id = AM6_VDD_MPU0,
+		.dev_id = 202, /* AM6_DEV_COMPUTE_CLUSTER_A53_0 */
+		.clk_id = 0, /* ARM clock */
+		.opp = AM6_OPP_NOM,
+		.opps = {
+			[AM6_OPP_NOM] = {
+				.volt = 1100000,
+				.freq = 800000000,
+			},
+			[AM6_OPP_OD] = {
+				.volt = 1200000,
+				.freq = 1000000000,
+			},
+			[AM6_OPP_TURBO] = {
+				.volt = 1240000,
+				.freq = 1100000000,
+			},
+		},
+	},
+	{
+		.id = AM6_VDD_MPU1,
+		.opp = AM6_OPP_NOM,
+		.dev_id = 204, /* AM6_DEV_COMPUTE_CLUSTER_A53_2 */
+		.clk_id = 0, /* ARM clock */
+		.opps = {
+			[AM6_OPP_NOM] = {
+				.volt = 1100000,
+				.freq = 800000000,
+			},
+			[AM6_OPP_OD] = {
+				.volt = 1200000,
+				.freq = 1000000000,
+			},
+			[AM6_OPP_TURBO] = {
+				.volt = 1240000,
+				.freq = 1100000000,
+			},
+		},
+	},
+	{ .id = -1 },
+};
+
+static struct vd_data j721e_vd_data[] = {
+	{
+		.id = J721E_VDD_MPU,
+		.opp = AM6_OPP_NOM,
+		.dev_id = 202, /* J721E_DEV_A72SS0_CORE0 */
+		.clk_id = 2, /* ARM clock */
+		.opps = {
+			[AM6_OPP_NOM] = {
+				.volt = 880000, /* TBD in DM */
+				.freq = 2000000000,
+			},
+		},
+	},
+	{ .id = -1 },
+};
+
+static struct vd_config j721e_vd_config = {
+	.efuse_xlate = am6_efuse_xlate,
+	.vds = j721e_vd_data,
+};
+
+static struct vd_config am654_vd_config = {
+	.efuse_xlate = am6_efuse_xlate,
+	.vds = am654_vd_data,
+};
+
+const struct soc_attr vtm_soc_list[] = {
+	{ .family = "AM65X", .data = (void *)&am654_vd_config },
+	{ .family = "J721E", .data = (void *)&j721e_vd_config },
+	{ .family = "J7200", .data = (void *)&j721e_vd_config },
+	{}
+};
+
 static int k3_avs_program_voltage(struct k3_avs_privdata *priv,
 				  struct vd_data *vd,
 				  int opp_id)
@@ -234,8 +324,16 @@  static int k3_avs_configure(struct udevice *dev, struct k3_avs_privdata *priv)
 	int ret;
 	char pname[20];
 	struct vd_data *vd;
+	const struct soc_attr *soc;
+
+	soc = soc_device_match(vtm_soc_list);
+	if (soc && soc->data)
+		conf = (void *)soc->data;
 
-	conf = (void *)dev_get_driver_data(dev);
+	if (!conf) {
+		printf("No SoC support for AVS\n");
+		return -ENOSYS;
+	}
 
 	priv->vd_config = conf;
 
@@ -400,93 +498,12 @@  static int k3_avs_probe(struct udevice *dev)
 	return 0;
 }
 
-static struct vd_data am654_vd_data[] = {
-	{
-		.id = AM6_VDD_CORE,
-		.dev_id = 82, /* AM6_DEV_CBASS0 */
-		.clk_id = 0, /* main sysclk0 */
-		.opp = AM6_OPP_NOM,
-		.opps = {
-			[AM6_OPP_NOM] = {
-				.volt = 1000000,
-				.freq = 250000000, /* CBASS0 */
-			},
-		},
-	},
-	{
-		.id = AM6_VDD_MPU0,
-		.dev_id = 202, /* AM6_DEV_COMPUTE_CLUSTER_A53_0 */
-		.clk_id = 0, /* ARM clock */
-		.opp = AM6_OPP_NOM,
-		.opps = {
-			[AM6_OPP_NOM] = {
-				.volt = 1100000,
-				.freq = 800000000,
-			},
-			[AM6_OPP_OD] = {
-				.volt = 1200000,
-				.freq = 1000000000,
-			},
-			[AM6_OPP_TURBO] = {
-				.volt = 1240000,
-				.freq = 1100000000,
-			},
-		},
-	},
-	{
-		.id = AM6_VDD_MPU1,
-		.opp = AM6_OPP_NOM,
-		.dev_id = 204, /* AM6_DEV_COMPUTE_CLUSTER_A53_2 */
-		.clk_id = 0, /* ARM clock */
-		.opps = {
-			[AM6_OPP_NOM] = {
-				.volt = 1100000,
-				.freq = 800000000,
-			},
-			[AM6_OPP_OD] = {
-				.volt = 1200000,
-				.freq = 1000000000,
-			},
-			[AM6_OPP_TURBO] = {
-				.volt = 1240000,
-				.freq = 1100000000,
-			},
-		},
-	},
-	{ .id = -1 },
-};
-
-static struct vd_data j721e_vd_data[] = {
-	{
-		.id = J721E_VDD_MPU,
-		.opp = AM6_OPP_NOM,
-		.dev_id = 202, /* J721E_DEV_A72SS0_CORE0 */
-		.clk_id = 2, /* ARM clock */
-		.opps = {
-			[AM6_OPP_NOM] = {
-				.volt = 880000, /* TBD in DM */
-				.freq = 2000000000,
-			},
-		},
-	},
-	{ .id = -1 },
-};
-
-static struct vd_config j721e_vd_config = {
-	.efuse_xlate = am6_efuse_xlate,
-	.vds = j721e_vd_data,
-};
-
-static struct vd_config am654_vd_config = {
-	.efuse_xlate = am6_efuse_xlate,
-	.vds = am654_vd_data,
-};
 
 static const struct udevice_id k3_avs_ids[] = {
-	{ .compatible = "ti,am654-avs", .data = (ulong)&am654_vd_config },
-	{ .compatible = "ti,j721e-avs", .data = (ulong)&j721e_vd_config },
-	{ .compatible = "ti,j721e-vtm", .data = (ulong)&j721e_vd_config },
-	{ .compatible = "ti,j7200-vtm", .data = (ulong)&j721e_vd_config },
+	{ .compatible = "ti,am654-avs" },
+	{ .compatible = "ti,j721e-avs" },
+	{ .compatible = "ti,j721e-vtm" },
+	{ .compatible = "ti,j7200-vtm" },
 	{}
 };