[PATCH 05/11] rockchip: io-domain: Add support for RK3399

Kever Yang kever.yang at rock-chips.com
Mon Mar 11 10:30:38 CET 2024


On 2024/2/18 02:35, Jonas Karlman wrote:
> Port the RK3399 part of the Rockchip IO-domain driver from linux.
>
> This differs from linux version in that pmu io iodomain bit is enabled
> in the write ops instead of in an init ops as in linux, this way we can
> avoid keeping a full state of all supply that have been configured.
>
> Signed-off-by: Jonas Karlman <jonas at kwiboo.se>


Reviewed-by: Kever Yang <kever.yang at rock-chips.com>

Thanks,
- Kever

> ---
>   drivers/misc/rockchip-io-domain.c | 79 +++++++++++++++++++++++++++++--
>   1 file changed, 75 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/misc/rockchip-io-domain.c b/drivers/misc/rockchip-io-domain.c
> index 3f6227f993f9..0ffea32ef07f 100644
> --- a/drivers/misc/rockchip-io-domain.c
> +++ b/drivers/misc/rockchip-io-domain.c
> @@ -5,7 +5,6 @@
>    * Ported from linux drivers/soc/rockchip/io-domain.c
>    */
>   
> -#include <common.h>
>   #include <dm.h>
>   #include <dm/device_compat.h>
>   #include <regmap.h>
> @@ -28,6 +27,10 @@
>   #define MAX_VOLTAGE_1_8		1980000
>   #define MAX_VOLTAGE_3_3		3600000
>   
> +#define RK3399_PMUGRF_CON0		0x180
> +#define RK3399_PMUGRF_CON0_VSEL		BIT(8)
> +#define RK3399_PMUGRF_VSEL_SUPPLY_NUM	9
> +
>   #define RK3568_PMU_GRF_IO_VSEL0		0x0140
>   #define RK3568_PMU_GRF_IO_VSEL1		0x0144
>   #define RK3568_PMU_GRF_IO_VSEL2		0x0148
> @@ -35,10 +38,10 @@
>   struct rockchip_iodomain_soc_data {
>   	int grf_offset;
>   	const char *supply_names[MAX_SUPPLIES];
> -	int (*write)(struct regmap *grf, int idx, int uV);
> +	int (*write)(struct regmap *grf, uint offset, int idx, int uV);
>   };
>   
> -static int rk3568_iodomain_write(struct regmap *grf, int idx, int uV)
> +static int rk3568_iodomain_write(struct regmap *grf, uint offset, int idx, int uV)
>   {
>   	u32 is_3v3 = uV > MAX_VOLTAGE_1_8;
>   	u32 val0, val1;
> @@ -78,6 +81,64 @@ static int rk3568_iodomain_write(struct regmap *grf, int idx, int uV)
>   	return 0;
>   }
>   
> +static int rockchip_iodomain_write(struct regmap *grf, uint offset, int idx, int uV)
> +{
> +	u32 val;
> +
> +	/* set value bit */
> +	val = (uV > MAX_VOLTAGE_1_8) ? 0 : 1;
> +	val <<= idx;
> +
> +	/* apply hiword-mask */
> +	val |= (BIT(idx) << 16);
> +
> +	return regmap_write(grf, offset, val);
> +}
> +
> +static int rk3399_pmu_iodomain_write(struct regmap *grf, uint offset, int idx, int uV)
> +{
> +	int ret = rockchip_iodomain_write(grf, offset, idx, uV);
> +
> +	if (!ret && idx == RK3399_PMUGRF_VSEL_SUPPLY_NUM) {
> +		/*
> +		 * set pmu io iodomain to also use this framework
> +		 * instead of a special gpio.
> +		 */
> +		u32 val = RK3399_PMUGRF_CON0_VSEL | (RK3399_PMUGRF_CON0_VSEL << 16);
> +		ret = regmap_write(grf, RK3399_PMUGRF_CON0, val);
> +	}
> +
> +	return ret;
> +}
> +
> +static const struct rockchip_iodomain_soc_data soc_data_rk3399 = {
> +	.grf_offset = 0xe640,
> +	.supply_names = {
> +		"bt656-supply",		/* APIO2_VDD */
> +		"audio-supply",		/* APIO5_VDD */
> +		"sdmmc-supply",		/* SDMMC0_VDD */
> +		"gpio1830-supply",	/* APIO4_VDD */
> +	},
> +	.write = rockchip_iodomain_write,
> +};
> +
> +static const struct rockchip_iodomain_soc_data soc_data_rk3399_pmu = {
> +	.grf_offset = 0x180,
> +	.supply_names = {
> +		NULL,
> +		NULL,
> +		NULL,
> +		NULL,
> +		NULL,
> +		NULL,
> +		NULL,
> +		NULL,
> +		NULL,
> +		"pmu1830-supply",	/* PMUIO2_VDD */
> +	},
> +	.write = rk3399_pmu_iodomain_write,
> +};
> +
>   static const struct rockchip_iodomain_soc_data soc_data_rk3568_pmu = {
>   	.grf_offset = 0x140,
>   	.supply_names = {
> @@ -95,6 +156,14 @@ static const struct rockchip_iodomain_soc_data soc_data_rk3568_pmu = {
>   };
>   
>   static const struct udevice_id rockchip_iodomain_ids[] = {
> +	{
> +		.compatible = "rockchip,rk3399-io-voltage-domain",
> +		.data = (ulong)&soc_data_rk3399,
> +	},
> +	{
> +		.compatible = "rockchip,rk3399-pmu-io-voltage-domain",
> +		.data = (ulong)&soc_data_rk3399_pmu,
> +	},
>   	{
>   		.compatible = "rockchip,rk3568-pmu-io-voltage-domain",
>   		.data = (ulong)&soc_data_rk3568_pmu,
> @@ -152,7 +221,9 @@ static int rockchip_iodomain_probe(struct udevice *dev)
>   			continue;
>   		}
>   
> -		soc_data->write(grf, i, uV);
> +		ret = soc_data->write(grf, soc_data->grf_offset, i, uV);
> +		if (ret)
> +			dev_err(dev, "%s: Couldn't write to GRF\n", supply_name);
>   	}
>   
>   	return 0;


More information about the U-Boot mailing list