xref: /rk3399_rockchip-uboot/drivers/power/io-domain/rockchip-io-domain.c (revision 1e1a2c06fb13cd5d9efe6194d11663d52ec7da6d)
14f43646eSJianqun Xu /* SPDX-License-Identifier:     GPL-2.0+ */
24f43646eSJianqun Xu /*
34f43646eSJianqun Xu  * (C) Copyright 2018 Rockchip Electronics Co., Ltd
44f43646eSJianqun Xu  */
54f43646eSJianqun Xu 
64f43646eSJianqun Xu #include <common.h>
74f43646eSJianqun Xu #include <dm.h>
84f43646eSJianqun Xu #include <dm/of_access.h>
94f43646eSJianqun Xu #include <regmap.h>
104f43646eSJianqun Xu #include <syscon.h>
114f43646eSJianqun Xu #include <asm/arch/clock.h>
124f43646eSJianqun Xu #include <fdtdec.h>
134f43646eSJianqun Xu #include <linux/compat.h>
144f43646eSJianqun Xu #include <linux/err.h>
154f43646eSJianqun Xu #include <power/regulator.h>
164f43646eSJianqun Xu 
174f43646eSJianqun Xu #define MAX_SUPPLIES		16
184f43646eSJianqun Xu 
194f43646eSJianqun Xu /*
204f43646eSJianqun Xu  * The max voltage for 1.8V and 3.3V come from the Rockchip datasheet under
214f43646eSJianqun Xu  * "Recommended Operating Conditions" for "Digital GPIO".   When the typical
224f43646eSJianqun Xu  * is 3.3V the max is 3.6V.  When the typical is 1.8V the max is 1.98V.
234f43646eSJianqun Xu  *
244f43646eSJianqun Xu  * They are used like this:
254f43646eSJianqun Xu  * - If the voltage on a rail is above the "1.8" voltage (1.98V) we'll tell the
264f43646eSJianqun Xu  *   SoC we're at 3.3.
274f43646eSJianqun Xu  * - If the voltage on a rail is above the "3.3" voltage (3.6V) we'll consider
284f43646eSJianqun Xu  *   that to be an error.
294f43646eSJianqun Xu  */
304f43646eSJianqun Xu #define MAX_VOLTAGE_1_8	1980000
314f43646eSJianqun Xu #define MAX_VOLTAGE_3_3	3600000
324f43646eSJianqun Xu 
334f43646eSJianqun Xu #define PX30_IO_VSEL			0x180
344f43646eSJianqun Xu #define PX30_IO_VSEL_VCCIO6_SRC		BIT(0)
354f43646eSJianqun Xu #define PX30_IO_VSEL_VCCIO6_SUPPLY_NUM	1
364f43646eSJianqun Xu 
374f43646eSJianqun Xu #define RK3288_SOC_CON2			0x24c
384f43646eSJianqun Xu #define RK3288_SOC_CON2_FLASH0		BIT(7)
394f43646eSJianqun Xu #define RK3288_SOC_FLASH_SUPPLY_NUM	2
404f43646eSJianqun Xu 
414f43646eSJianqun Xu #define RK3308_SOC_CON0			0x300
424f43646eSJianqun Xu #define RK3308_SOC_CON0_VCCIO3		BIT(8)
434f43646eSJianqun Xu #define RK3308_SOC_VCCIO3_SUPPLY_NUM	3
444f43646eSJianqun Xu 
454f43646eSJianqun Xu #define RK3328_SOC_CON4			0x410
464f43646eSJianqun Xu #define RK3328_SOC_CON4_VCCIO2		BIT(7)
474f43646eSJianqun Xu #define RK3328_SOC_VCCIO2_SUPPLY_NUM	1
484f43646eSJianqun Xu 
494f43646eSJianqun Xu #define RK3366_SOC_CON6			0x418
504f43646eSJianqun Xu #define RK3366_SOC_CON6_FLASH0		BIT(14)
514f43646eSJianqun Xu #define RK3366_SOC_FLASH_SUPPLY_NUM	2
524f43646eSJianqun Xu 
534f43646eSJianqun Xu #define RK3368_SOC_CON15		0x43c
544f43646eSJianqun Xu #define RK3368_SOC_CON15_FLASH0		BIT(14)
554f43646eSJianqun Xu #define RK3368_SOC_FLASH_SUPPLY_NUM	2
564f43646eSJianqun Xu 
574f43646eSJianqun Xu #define RK3399_PMUGRF_CON0		0x180
584f43646eSJianqun Xu #define RK3399_PMUGRF_CON0_VSEL		BIT(8)
594f43646eSJianqun Xu #define RK3399_PMUGRF_VSEL_SUPPLY_NUM	9
604f43646eSJianqun Xu 
61fcff2851SJianqun Xu #define RK3568_PMU_GRF_IO_VSEL0		(0x0140)
62fcff2851SJianqun Xu #define RK3568_PMU_GRF_IO_VSEL1		(0x0144)
63fcff2851SJianqun Xu #define RK3568_PMU_GRF_IO_VSEL2		(0x0148)
6423049166SJianqun Xu 
65*1e1a2c06SSugar Zhang #define RV1126_PMU_GRF_IO_RETENTION	(0x0144)
66*1e1a2c06SSugar Zhang 
674f43646eSJianqun Xu struct rockchip_iodomain_priv;
684f43646eSJianqun Xu 
694f43646eSJianqun Xu /**
704f43646eSJianqun Xu  * @supplies: voltage settings matching the register bits.
714f43646eSJianqun Xu  */
724f43646eSJianqun Xu struct rockchip_iodomain_soc_data {
734f43646eSJianqun Xu 	int grf_offset;
744f43646eSJianqun Xu 	const char *supply_names[MAX_SUPPLIES];
754f43646eSJianqun Xu 	void (*init)(struct rockchip_iodomain_priv *iod);
764f43646eSJianqun Xu };
774f43646eSJianqun Xu 
784f43646eSJianqun Xu struct rockchip_iodomain_supply {
794f43646eSJianqun Xu 	struct rockchip_iodomain_priv *iod;
804f43646eSJianqun Xu 	struct udevice *reg;
814f43646eSJianqun Xu 	int idx;
824f43646eSJianqun Xu };
834f43646eSJianqun Xu 
844f43646eSJianqun Xu struct rockchip_iodomain_priv {
854f43646eSJianqun Xu 	struct regmap *regmap_base;
864f43646eSJianqun Xu 	struct rockchip_iodomain_soc_data *sdata;
874f43646eSJianqun Xu 	struct rockchip_iodomain_supply supplies[MAX_SUPPLIES];
8823049166SJianqun Xu 	int (*write)(struct rockchip_iodomain_supply *supply, int uV);
894f43646eSJianqun Xu };
904f43646eSJianqun Xu 
rockchip_ofdata_to_platdata(struct udevice * dev)914f43646eSJianqun Xu static int rockchip_ofdata_to_platdata(struct udevice *dev)
924f43646eSJianqun Xu {
934f43646eSJianqun Xu 	struct rockchip_iodomain_priv *priv = dev_get_priv(dev);
942e312f93SJianqun Xu 	struct syscon_uc_info *syscon_priv;
954f43646eSJianqun Xu 	struct regmap *regmap;
964f43646eSJianqun Xu 
972e312f93SJianqun Xu 	syscon_priv = dev_get_uclass_priv(dev_get_parent(dev));
982e312f93SJianqun Xu 	regmap = syscon_priv->regmap;
994f43646eSJianqun Xu 	if (IS_ERR(regmap))
1004f43646eSJianqun Xu 		return PTR_ERR(regmap);
1014f43646eSJianqun Xu 
1024f43646eSJianqun Xu 	priv->regmap_base = regmap;
1034f43646eSJianqun Xu 
1044f43646eSJianqun Xu 	return 0;
1054f43646eSJianqun Xu }
1064f43646eSJianqun Xu 
rk3568_pmu_iodomain_write(struct rockchip_iodomain_supply * supply,int uV)10723049166SJianqun Xu static int rk3568_pmu_iodomain_write(struct rockchip_iodomain_supply *supply,
10823049166SJianqun Xu 				     int uV)
10923049166SJianqun Xu {
11023049166SJianqun Xu 	struct rockchip_iodomain_priv *priv = supply->iod;
11123049166SJianqun Xu 	struct regmap *regmap = priv->regmap_base;
11223049166SJianqun Xu 	u32 is_3v3 = uV > MAX_VOLTAGE_1_8;
11323049166SJianqun Xu 	u32 val0, val1;
11423049166SJianqun Xu 	int b;
11523049166SJianqun Xu 
11623049166SJianqun Xu 	switch (supply->idx) {
11723049166SJianqun Xu 	case 0: /* pmuio1 */
11823049166SJianqun Xu 	case 1: /* pmuio2 */
11923049166SJianqun Xu 		b = supply->idx;
12023049166SJianqun Xu 		val0 = BIT(16 + b) | (is_3v3 ? 0 : BIT(b));
12123049166SJianqun Xu 		b = supply->idx + 4;
12223049166SJianqun Xu 		val1 = BIT(16 + b) | (is_3v3 ? BIT(b) : 0);
12323049166SJianqun Xu 
12423049166SJianqun Xu 		regmap_write(regmap, RK3568_PMU_GRF_IO_VSEL2, val0);
12523049166SJianqun Xu 		regmap_write(regmap, RK3568_PMU_GRF_IO_VSEL2, val1);
12623049166SJianqun Xu 		break;
12723049166SJianqun Xu 	case 2: /* vccio1 */
12823049166SJianqun Xu 	case 3: /* vccio2 */
12923049166SJianqun Xu 	case 4: /* vccio3 */
13023049166SJianqun Xu 	case 5: /* vccio4 */
13123049166SJianqun Xu 	case 6: /* vccio5 */
13223049166SJianqun Xu 	case 7: /* vccio6 */
13323049166SJianqun Xu 	case 8: /* vccio7 */
13423049166SJianqun Xu 		b = supply->idx - 1;
13523049166SJianqun Xu 		val0 = BIT(16 + b) | (is_3v3 ? 0 : BIT(b));
13623049166SJianqun Xu 		val1 = BIT(16 + b) | (is_3v3 ? BIT(b) : 0);
13723049166SJianqun Xu 
13823049166SJianqun Xu 		regmap_write(regmap, RK3568_PMU_GRF_IO_VSEL0, val0);
13923049166SJianqun Xu 		regmap_write(regmap, RK3568_PMU_GRF_IO_VSEL1, val1);
14023049166SJianqun Xu 		break;
14123049166SJianqun Xu 	default:
14223049166SJianqun Xu 		return -EINVAL;
14323049166SJianqun Xu 	};
14423049166SJianqun Xu 
14523049166SJianqun Xu 	return 0;
14623049166SJianqun Xu }
14723049166SJianqun Xu 
rv1126_iodomain_write(struct rockchip_iodomain_supply * supply,int uV)148*1e1a2c06SSugar Zhang static int rv1126_iodomain_write(struct rockchip_iodomain_supply *supply,
149*1e1a2c06SSugar Zhang 				 int uV)
150*1e1a2c06SSugar Zhang {
151*1e1a2c06SSugar Zhang 	struct rockchip_iodomain_priv *priv = supply->iod;
152*1e1a2c06SSugar Zhang 	struct regmap *regmap = priv->regmap_base;
153*1e1a2c06SSugar Zhang 	u32 val, vret_hold, vret_release;
154*1e1a2c06SSugar Zhang 
155*1e1a2c06SSugar Zhang 	/* set value bit */
156*1e1a2c06SSugar Zhang 	val = (uV > MAX_VOLTAGE_1_8) ? 0 : 1;
157*1e1a2c06SSugar Zhang 	val <<= supply->idx;
158*1e1a2c06SSugar Zhang 	/* apply hiword-mask */
159*1e1a2c06SSugar Zhang 	val |= (BIT(supply->idx) << 16);
160*1e1a2c06SSugar Zhang 
161*1e1a2c06SSugar Zhang 	vret_hold = (BIT(supply->idx) << 16);
162*1e1a2c06SSugar Zhang 	vret_release = (BIT(supply->idx) << 16) | BIT(supply->idx);
163*1e1a2c06SSugar Zhang 
164*1e1a2c06SSugar Zhang 	printf("%s: %d uv, vsel: 0x%x\n",
165*1e1a2c06SSugar Zhang 	       priv->sdata->supply_names[supply->idx], uV, val);
166*1e1a2c06SSugar Zhang 
167*1e1a2c06SSugar Zhang 	regmap_write(regmap, RV1126_PMU_GRF_IO_RETENTION, vret_hold);
168*1e1a2c06SSugar Zhang 	regmap_write(regmap, priv->sdata->grf_offset, val);
169*1e1a2c06SSugar Zhang 	regmap_write(regmap, RV1126_PMU_GRF_IO_RETENTION, vret_release);
170*1e1a2c06SSugar Zhang 
171*1e1a2c06SSugar Zhang 	return 0;
172*1e1a2c06SSugar Zhang }
173*1e1a2c06SSugar Zhang 
rockchip_iodomain_write(struct rockchip_iodomain_supply * supply,int uV)1744f43646eSJianqun Xu static int rockchip_iodomain_write(struct rockchip_iodomain_supply *supply,
1754f43646eSJianqun Xu 				   int uV)
1764f43646eSJianqun Xu {
1774f43646eSJianqun Xu 	struct rockchip_iodomain_priv *priv = supply->iod;
1784f43646eSJianqun Xu 	struct regmap *regmap = priv->regmap_base;
1794f43646eSJianqun Xu 	u32 val;
1804f43646eSJianqun Xu 	int ret;
1814f43646eSJianqun Xu 
1824f43646eSJianqun Xu 	/* set value bit */
1834f43646eSJianqun Xu 	val = (uV > MAX_VOLTAGE_1_8) ? 0 : 1;
1844f43646eSJianqun Xu 	val <<= supply->idx;
1854f43646eSJianqun Xu 
1864f43646eSJianqun Xu 	/* apply hiword-mask */
1874f43646eSJianqun Xu 	val |= (BIT(supply->idx) << 16);
1884f43646eSJianqun Xu 
1894f43646eSJianqun Xu 	ret = regmap_write(regmap, priv->sdata->grf_offset, val);
1904f43646eSJianqun Xu 	if (ret) {
1914f43646eSJianqun Xu 		dev_err(priv->dev, "Couldn't write to GRF\n");
1924f43646eSJianqun Xu 		return ret;
1934f43646eSJianqun Xu 	}
1944f43646eSJianqun Xu 
1954f43646eSJianqun Xu 	return 0;
1964f43646eSJianqun Xu }
1974f43646eSJianqun Xu 
px30_iodomain_init(struct rockchip_iodomain_priv * iod)1984f43646eSJianqun Xu static void px30_iodomain_init(struct rockchip_iodomain_priv *iod)
1994f43646eSJianqun Xu {
2004f43646eSJianqun Xu 	int ret;
2014f43646eSJianqun Xu 	u32 val;
2024f43646eSJianqun Xu 
2034f43646eSJianqun Xu 	/* if no VCCIO0 supply we should leave things alone */
2044f43646eSJianqun Xu 	if (!iod->supplies[PX30_IO_VSEL_VCCIO6_SUPPLY_NUM].reg)
2054f43646eSJianqun Xu 		return;
2064f43646eSJianqun Xu 
2074f43646eSJianqun Xu 	/*
2084f43646eSJianqun Xu 	 * set vccio0 iodomain to also use this framework
2094f43646eSJianqun Xu 	 * instead of a special gpio.
2104f43646eSJianqun Xu 	 */
2114f43646eSJianqun Xu 	val = PX30_IO_VSEL_VCCIO6_SRC | (PX30_IO_VSEL_VCCIO6_SRC << 16);
2124f43646eSJianqun Xu 	ret = regmap_write(iod->regmap_base, PX30_IO_VSEL, val);
2134f43646eSJianqun Xu 	if (ret < 0)
2144f43646eSJianqun Xu 		dev_warn(iod->dev, "couldn't update vccio0 ctrl\n");
2154f43646eSJianqun Xu }
2164f43646eSJianqun Xu 
rk3288_iodomain_init(struct rockchip_iodomain_priv * iod)2174f43646eSJianqun Xu static void rk3288_iodomain_init(struct rockchip_iodomain_priv *iod)
2184f43646eSJianqun Xu {
2194f43646eSJianqun Xu 	int ret;
2204f43646eSJianqun Xu 	u32 val;
2214f43646eSJianqun Xu 
2224f43646eSJianqun Xu 	/* if no flash supply we should leave things alone */
2234f43646eSJianqun Xu 	if (!iod->supplies[RK3288_SOC_FLASH_SUPPLY_NUM].reg)
2244f43646eSJianqun Xu 		return;
2254f43646eSJianqun Xu 
2264f43646eSJianqun Xu 	/*
2274f43646eSJianqun Xu 	 * set flash0 iodomain to also use this framework
2284f43646eSJianqun Xu 	 * instead of a special gpio.
2294f43646eSJianqun Xu 	 */
2304f43646eSJianqun Xu 	val = RK3288_SOC_CON2_FLASH0 | (RK3288_SOC_CON2_FLASH0 << 16);
2314f43646eSJianqun Xu 	ret = regmap_write(iod->regmap_base, RK3288_SOC_CON2, val);
2324f43646eSJianqun Xu 	if (ret < 0)
2334f43646eSJianqun Xu 		dev_warn(iod->dev, "couldn't update flash0 ctrl\n");
2344f43646eSJianqun Xu }
2354f43646eSJianqun Xu 
rk3308_iodomain_init(struct rockchip_iodomain_priv * iod)2364f43646eSJianqun Xu static void rk3308_iodomain_init(struct rockchip_iodomain_priv *iod)
2374f43646eSJianqun Xu {
2384f43646eSJianqun Xu 	int ret;
2394f43646eSJianqun Xu 	u32 val;
2404f43646eSJianqun Xu 
2414f43646eSJianqun Xu 	/* if no vccio3 supply we should leave things alone */
2424f43646eSJianqun Xu 	if (!iod->supplies[RK3308_SOC_VCCIO3_SUPPLY_NUM].reg)
2434f43646eSJianqun Xu 		return;
2444f43646eSJianqun Xu 
2454f43646eSJianqun Xu 	/*
2464f43646eSJianqun Xu 	 * set vccio3 iodomain to also use this framework
2474f43646eSJianqun Xu 	 * instead of a special gpio.
2484f43646eSJianqun Xu 	 */
2494f43646eSJianqun Xu 	val = RK3308_SOC_CON0_VCCIO3 | (RK3308_SOC_CON0_VCCIO3 << 16);
2504f43646eSJianqun Xu 	ret = regmap_write(iod->regmap_base, RK3308_SOC_CON0, val);
2514f43646eSJianqun Xu 	if (ret < 0)
2524f43646eSJianqun Xu 		dev_warn(iod->dev, "couldn't update vccio3 vsel ctrl\n");
2534f43646eSJianqun Xu }
2544f43646eSJianqun Xu 
rk3328_iodomain_init(struct rockchip_iodomain_priv * iod)2554f43646eSJianqun Xu static void rk3328_iodomain_init(struct rockchip_iodomain_priv *iod)
2564f43646eSJianqun Xu {
2574f43646eSJianqun Xu 	int ret;
2584f43646eSJianqun Xu 	u32 val;
2594f43646eSJianqun Xu 
2604f43646eSJianqun Xu 	/* if no vccio2 supply we should leave things alone */
2614f43646eSJianqun Xu 	if (!iod->supplies[RK3328_SOC_VCCIO2_SUPPLY_NUM].reg)
2624f43646eSJianqun Xu 		return;
2634f43646eSJianqun Xu 
2644f43646eSJianqun Xu 	/*
2654f43646eSJianqun Xu 	 * set vccio2 iodomain to also use this framework
2664f43646eSJianqun Xu 	 * instead of a special gpio.
2674f43646eSJianqun Xu 	 */
2684f43646eSJianqun Xu 	val = RK3328_SOC_CON4_VCCIO2 | (RK3328_SOC_CON4_VCCIO2 << 16);
2694f43646eSJianqun Xu 	ret = regmap_write(iod->regmap_base, RK3328_SOC_CON4, val);
2704f43646eSJianqun Xu 	if (ret < 0)
2714f43646eSJianqun Xu 		dev_warn(iod->dev, "couldn't update vccio2 vsel ctrl\n");
2724f43646eSJianqun Xu }
2734f43646eSJianqun Xu 
rk3366_iodomain_init(struct rockchip_iodomain_priv * iod)2744f43646eSJianqun Xu static void rk3366_iodomain_init(struct rockchip_iodomain_priv *iod)
2754f43646eSJianqun Xu {
2764f43646eSJianqun Xu 	int ret;
2774f43646eSJianqun Xu 	u32 val;
2784f43646eSJianqun Xu 
2794f43646eSJianqun Xu 	/* if no flash supply we should leave things alone */
2804f43646eSJianqun Xu 	if (!iod->supplies[RK3366_SOC_FLASH_SUPPLY_NUM].reg)
2814f43646eSJianqun Xu 		return;
2824f43646eSJianqun Xu 
2834f43646eSJianqun Xu 	/*
2844f43646eSJianqun Xu 	 * set flash0 iodomain to also use this framework
2854f43646eSJianqun Xu 	 * instead of a special gpio.
2864f43646eSJianqun Xu 	 */
2874f43646eSJianqun Xu 	val = RK3366_SOC_CON6_FLASH0 | (RK3366_SOC_CON6_FLASH0 << 16);
2884f43646eSJianqun Xu 	ret = regmap_write(iod->regmap_base, RK3368_SOC_CON15, val);
2894f43646eSJianqun Xu 	if (ret < 0)
2904f43646eSJianqun Xu 		dev_warn(iod->dev, "couldn't update flash0 ctrl\n");
2914f43646eSJianqun Xu }
2924f43646eSJianqun Xu 
rk3368_iodomain_init(struct rockchip_iodomain_priv * iod)2934f43646eSJianqun Xu static void rk3368_iodomain_init(struct rockchip_iodomain_priv *iod)
2944f43646eSJianqun Xu {
2954f43646eSJianqun Xu 	int ret;
2964f43646eSJianqun Xu 	u32 val;
2974f43646eSJianqun Xu 
2984f43646eSJianqun Xu 	/* if no flash supply we should leave things alone */
2994f43646eSJianqun Xu 	if (!iod->supplies[RK3368_SOC_FLASH_SUPPLY_NUM].reg)
3004f43646eSJianqun Xu 		return;
3014f43646eSJianqun Xu 
3024f43646eSJianqun Xu 	/*
3034f43646eSJianqun Xu 	 * set flash0 iodomain to also use this framework
3044f43646eSJianqun Xu 	 * instead of a special gpio.
3054f43646eSJianqun Xu 	 */
3064f43646eSJianqun Xu 	val = RK3368_SOC_CON15_FLASH0 | (RK3368_SOC_CON15_FLASH0 << 16);
3074f43646eSJianqun Xu 	ret = regmap_write(iod->regmap_base, RK3368_SOC_CON15, val);
3084f43646eSJianqun Xu 	if (ret < 0)
3094f43646eSJianqun Xu 		dev_warn(iod->dev, "couldn't update flash0 ctrl\n");
3104f43646eSJianqun Xu }
3114f43646eSJianqun Xu 
rk3399_pmu_iodomain_init(struct rockchip_iodomain_priv * iod)3124f43646eSJianqun Xu static void rk3399_pmu_iodomain_init(struct rockchip_iodomain_priv *iod)
3134f43646eSJianqun Xu {
3144f43646eSJianqun Xu 	int ret;
3154f43646eSJianqun Xu 	u32 val;
3164f43646eSJianqun Xu 
3174f43646eSJianqun Xu 	/* if no pmu io supply we should leave things alone */
3184f43646eSJianqun Xu 	if (!iod->supplies[RK3399_PMUGRF_VSEL_SUPPLY_NUM].reg)
3194f43646eSJianqun Xu 		return;
3204f43646eSJianqun Xu 
3214f43646eSJianqun Xu 	/*
3224f43646eSJianqun Xu 	 * set pmu io iodomain to also use this framework
3234f43646eSJianqun Xu 	 * instead of a special gpio.
3244f43646eSJianqun Xu 	 */
3254f43646eSJianqun Xu 	val = RK3399_PMUGRF_CON0_VSEL | (RK3399_PMUGRF_CON0_VSEL << 16);
3264f43646eSJianqun Xu 	ret = regmap_write(iod->regmap_base, RK3399_PMUGRF_CON0, val);
3274f43646eSJianqun Xu 	if (ret < 0)
3284f43646eSJianqun Xu 		dev_warn(iod->dev, "couldn't update pmu io iodomain ctrl\n");
3294f43646eSJianqun Xu }
3304f43646eSJianqun Xu 
3314f43646eSJianqun Xu static const struct rockchip_iodomain_soc_data soc_data_px30 = {
3324f43646eSJianqun Xu 	.grf_offset = 0x180,
3334f43646eSJianqun Xu 	.supply_names = {
3344f43646eSJianqun Xu 		NULL,
3354f43646eSJianqun Xu 		"vccio6",
3364f43646eSJianqun Xu 		"vccio1",
3374f43646eSJianqun Xu 		"vccio2",
3384f43646eSJianqun Xu 		"vccio3",
3394f43646eSJianqun Xu 		"vccio4",
3404f43646eSJianqun Xu 		"vccio5",
3414f43646eSJianqun Xu 		"vccio-oscgpi",
3424f43646eSJianqun Xu 	},
3434f43646eSJianqun Xu 	.init = px30_iodomain_init,
3444f43646eSJianqun Xu };
3454f43646eSJianqun Xu 
3464f43646eSJianqun Xu static const struct rockchip_iodomain_soc_data soc_data_px30_pmu = {
3474f43646eSJianqun Xu 	.grf_offset = 0x100,
3484f43646eSJianqun Xu 	.supply_names = {
3494f43646eSJianqun Xu 		NULL,
3504f43646eSJianqun Xu 		NULL,
3514f43646eSJianqun Xu 		NULL,
3524f43646eSJianqun Xu 		NULL,
3534f43646eSJianqun Xu 		NULL,
3544f43646eSJianqun Xu 		NULL,
3554f43646eSJianqun Xu 		NULL,
3564f43646eSJianqun Xu 		NULL,
3574f43646eSJianqun Xu 		NULL,
3584f43646eSJianqun Xu 		NULL,
3594f43646eSJianqun Xu 		NULL,
3604f43646eSJianqun Xu 		NULL,
3614f43646eSJianqun Xu 		NULL,
3624f43646eSJianqun Xu 		NULL,
3634f43646eSJianqun Xu 		"pmuio1",
3644f43646eSJianqun Xu 		"pmuio2",
3654f43646eSJianqun Xu 	},
3664f43646eSJianqun Xu };
3674f43646eSJianqun Xu 
3684f43646eSJianqun Xu /*
3694f43646eSJianqun Xu  * On the rk3188 the io-domains are handled by a shared register with the
3704f43646eSJianqun Xu  * lower 8 bits being still being continuing drive-strength settings.
3714f43646eSJianqun Xu  */
3724f43646eSJianqun Xu static const struct rockchip_iodomain_soc_data soc_data_rk3188 = {
3734f43646eSJianqun Xu 	.grf_offset = 0x104,
3744f43646eSJianqun Xu 	.supply_names = {
3754f43646eSJianqun Xu 		NULL,
3764f43646eSJianqun Xu 		NULL,
3774f43646eSJianqun Xu 		NULL,
3784f43646eSJianqun Xu 		NULL,
3794f43646eSJianqun Xu 		NULL,
3804f43646eSJianqun Xu 		NULL,
3814f43646eSJianqun Xu 		NULL,
3824f43646eSJianqun Xu 		NULL,
3834f43646eSJianqun Xu 		"ap0",
3844f43646eSJianqun Xu 		"ap1",
3854f43646eSJianqun Xu 		"cif",
3864f43646eSJianqun Xu 		"flash",
3874f43646eSJianqun Xu 		"vccio0",
3884f43646eSJianqun Xu 		"vccio1",
3894f43646eSJianqun Xu 		"lcdc0",
3904f43646eSJianqun Xu 		"lcdc1",
3914f43646eSJianqun Xu 	},
3924f43646eSJianqun Xu };
3934f43646eSJianqun Xu 
3944f43646eSJianqun Xu static const struct rockchip_iodomain_soc_data soc_data_rk322x = {
3954f43646eSJianqun Xu 	.grf_offset = 0x418,
3964f43646eSJianqun Xu 	.supply_names = {
3974f43646eSJianqun Xu 		"vccio1",
3984f43646eSJianqun Xu 		"vccio2",
3994f43646eSJianqun Xu 		"vccio3",
4004f43646eSJianqun Xu 		"vccio4",
4014f43646eSJianqun Xu 	},
4024f43646eSJianqun Xu };
4034f43646eSJianqun Xu 
4044f43646eSJianqun Xu static const struct rockchip_iodomain_soc_data soc_data_rk3288 = {
4054f43646eSJianqun Xu 	.grf_offset = 0x380,
4064f43646eSJianqun Xu 	.supply_names = {
4074f43646eSJianqun Xu 		"lcdc",		/* LCDC_VDD */
4084f43646eSJianqun Xu 		"dvp",		/* DVPIO_VDD */
4094f43646eSJianqun Xu 		"flash0",	/* FLASH0_VDD (emmc) */
4104f43646eSJianqun Xu 		"flash1",	/* FLASH1_VDD (sdio1) */
4114f43646eSJianqun Xu 		"wifi",		/* APIO3_VDD  (sdio0) */
4124f43646eSJianqun Xu 		"bb",		/* APIO5_VDD */
4134f43646eSJianqun Xu 		"audio",	/* APIO4_VDD */
4144f43646eSJianqun Xu 		"sdcard",	/* SDMMC0_VDD (sdmmc) */
4154f43646eSJianqun Xu 		"gpio30",	/* APIO1_VDD */
4164f43646eSJianqun Xu 		"gpio1830",	/* APIO2_VDD */
4174f43646eSJianqun Xu 	},
4184f43646eSJianqun Xu 	.init = rk3288_iodomain_init,
4194f43646eSJianqun Xu };
4204f43646eSJianqun Xu 
4214f43646eSJianqun Xu static const struct rockchip_iodomain_soc_data soc_data_rk3308 = {
4224f43646eSJianqun Xu 	.grf_offset = 0x300,
4234f43646eSJianqun Xu 	.supply_names = {
4244f43646eSJianqun Xu 		"vccio0",
4254f43646eSJianqun Xu 		"vccio1",
4264f43646eSJianqun Xu 		"vccio2",
4274f43646eSJianqun Xu 		"vccio3",
4284f43646eSJianqun Xu 		"vccio4",
4294f43646eSJianqun Xu 		"vccio5",
4304f43646eSJianqun Xu 	},
4314f43646eSJianqun Xu 	.init = rk3308_iodomain_init,
4324f43646eSJianqun Xu };
4334f43646eSJianqun Xu 
4344f43646eSJianqun Xu static const struct rockchip_iodomain_soc_data soc_data_rk3328 = {
4354f43646eSJianqun Xu 	.grf_offset = 0x410,
4364f43646eSJianqun Xu 	.supply_names = {
4374f43646eSJianqun Xu 		"vccio1",
4384f43646eSJianqun Xu 		"vccio2",
4394f43646eSJianqun Xu 		"vccio3",
4404f43646eSJianqun Xu 		"vccio4",
4414f43646eSJianqun Xu 		"vccio5",
4424f43646eSJianqun Xu 		"vccio6",
4434f43646eSJianqun Xu 		"pmuio",
4444f43646eSJianqun Xu 	},
4454f43646eSJianqun Xu 	.init = rk3328_iodomain_init,
4464f43646eSJianqun Xu };
4474f43646eSJianqun Xu 
4484f43646eSJianqun Xu static const struct rockchip_iodomain_soc_data soc_data_rk3366 = {
4494f43646eSJianqun Xu 	.grf_offset = 0x900,
4504f43646eSJianqun Xu 	.supply_names = {
4514f43646eSJianqun Xu 		"lcdc",         /* LCDC_IOVDD */
4524f43646eSJianqun Xu 		"dvpts",        /* DVP_IOVDD */
4534f43646eSJianqun Xu 		"flash",        /* FLASH_IOVDD (emmc) */
4544f43646eSJianqun Xu 		"wifibt",       /* APIO1_IOVDD */
4554f43646eSJianqun Xu 		NULL,
4564f43646eSJianqun Xu 		"audio",        /* AUDIO_IODVDD */
4574f43646eSJianqun Xu 		"sdcard",       /* SDMMC_IOVDD (sdmmc) */
4584f43646eSJianqun Xu 		"tphdsor",      /* APIO2_IOVDD */
4594f43646eSJianqun Xu 	},
4604f43646eSJianqun Xu 	.init = rk3366_iodomain_init,
4614f43646eSJianqun Xu };
4624f43646eSJianqun Xu 
4634f43646eSJianqun Xu static const struct rockchip_iodomain_soc_data soc_data_rk3368 = {
4644f43646eSJianqun Xu 	.grf_offset = 0x900,
4654f43646eSJianqun Xu 	.supply_names = {
4664f43646eSJianqun Xu 		NULL,		/* reserved */
4674f43646eSJianqun Xu 		"dvp",		/* DVPIO_VDD */
4684f43646eSJianqun Xu 		"flash0",	/* FLASH0_VDD (emmc) */
4694f43646eSJianqun Xu 		"wifi",		/* APIO2_VDD (sdio0) */
4704f43646eSJianqun Xu 		NULL,
4714f43646eSJianqun Xu 		"audio",	/* APIO3_VDD */
4724f43646eSJianqun Xu 		"sdcard",	/* SDMMC0_VDD (sdmmc) */
4734f43646eSJianqun Xu 		"gpio30",	/* APIO1_VDD */
4744f43646eSJianqun Xu 		"gpio1830",	/* APIO4_VDD (gpujtag) */
4754f43646eSJianqun Xu 	},
4764f43646eSJianqun Xu 	.init = rk3368_iodomain_init,
4774f43646eSJianqun Xu };
4784f43646eSJianqun Xu 
4794f43646eSJianqun Xu static const struct rockchip_iodomain_soc_data soc_data_rk3368_pmu = {
4804f43646eSJianqun Xu 	.grf_offset = 0x100,
4814f43646eSJianqun Xu 	.supply_names = {
4824f43646eSJianqun Xu 		NULL,
4834f43646eSJianqun Xu 		NULL,
4844f43646eSJianqun Xu 		NULL,
4854f43646eSJianqun Xu 		NULL,
4864f43646eSJianqun Xu 		"pmu",	        /*PMU IO domain*/
4874f43646eSJianqun Xu 		"vop",	        /*LCDC IO domain*/
4884f43646eSJianqun Xu 	},
4894f43646eSJianqun Xu };
4904f43646eSJianqun Xu 
4914f43646eSJianqun Xu static const struct rockchip_iodomain_soc_data soc_data_rk3399 = {
4924f43646eSJianqun Xu 	.grf_offset = 0xe640,
4934f43646eSJianqun Xu 	.supply_names = {
4944f43646eSJianqun Xu 		"bt656",		/* APIO2_VDD */
4954f43646eSJianqun Xu 		"audio",		/* APIO5_VDD */
4964f43646eSJianqun Xu 		"sdmmc",		/* SDMMC0_VDD */
4974f43646eSJianqun Xu 		"gpio1830",		/* APIO4_VDD */
4984f43646eSJianqun Xu 	},
4994f43646eSJianqun Xu };
5004f43646eSJianqun Xu 
5014f43646eSJianqun Xu static const struct rockchip_iodomain_soc_data soc_data_rk3399_pmu = {
5024f43646eSJianqun Xu 	.grf_offset = 0x180,
5034f43646eSJianqun Xu 	.supply_names = {
5044f43646eSJianqun Xu 		NULL,
5054f43646eSJianqun Xu 		NULL,
5064f43646eSJianqun Xu 		NULL,
5074f43646eSJianqun Xu 		NULL,
5084f43646eSJianqun Xu 		NULL,
5094f43646eSJianqun Xu 		NULL,
5104f43646eSJianqun Xu 		NULL,
5114f43646eSJianqun Xu 		NULL,
5124f43646eSJianqun Xu 		NULL,
5134f43646eSJianqun Xu 		"pmu1830",		/* PMUIO2_VDD */
5144f43646eSJianqun Xu 	},
5154f43646eSJianqun Xu 	.init = rk3399_pmu_iodomain_init,
5164f43646eSJianqun Xu };
5174f43646eSJianqun Xu 
51823049166SJianqun Xu static const struct rockchip_iodomain_soc_data soc_data_rk3568_pmu = {
519fcff2851SJianqun Xu 	.grf_offset = 0x140,
52023049166SJianqun Xu 	.supply_names = {
52123049166SJianqun Xu 		"pmuio1",
522fcff2851SJianqun Xu 		"pmuio2",
52323049166SJianqun Xu 		"vccio1",
52423049166SJianqun Xu 		"vccio2",
52523049166SJianqun Xu 		"vccio3",
52623049166SJianqun Xu 		"vccio4",
52723049166SJianqun Xu 		"vccio5",
52823049166SJianqun Xu 		"vccio6",
52923049166SJianqun Xu 		"vccio7",
53023049166SJianqun Xu 	},
53123049166SJianqun Xu };
53223049166SJianqun Xu 
5334f43646eSJianqun Xu static const struct rockchip_iodomain_soc_data soc_data_rv1108 = {
5344f43646eSJianqun Xu 	.grf_offset = 0x404,
5354f43646eSJianqun Xu 	.supply_names = {
5364f43646eSJianqun Xu 		NULL,
5374f43646eSJianqun Xu 		NULL,
5384f43646eSJianqun Xu 		NULL,
5394f43646eSJianqun Xu 		NULL,
5404f43646eSJianqun Xu 		NULL,
5414f43646eSJianqun Xu 		NULL,
5424f43646eSJianqun Xu 		NULL,
5434f43646eSJianqun Xu 		NULL,
5444f43646eSJianqun Xu 		NULL,
5454f43646eSJianqun Xu 		NULL,
5464f43646eSJianqun Xu 		NULL,
5474f43646eSJianqun Xu 		"vccio1",
5484f43646eSJianqun Xu 		"vccio2",
5494f43646eSJianqun Xu 		"vccio3",
5504f43646eSJianqun Xu 		"vccio5",
5514f43646eSJianqun Xu 		"vccio6",
5524f43646eSJianqun Xu 	},
5534f43646eSJianqun Xu 
5544f43646eSJianqun Xu };
5554f43646eSJianqun Xu 
5564f43646eSJianqun Xu static const struct rockchip_iodomain_soc_data soc_data_rv1108_pmu = {
5574f43646eSJianqun Xu 	.grf_offset = 0x104,
5584f43646eSJianqun Xu 	.supply_names = {
5594f43646eSJianqun Xu 		"pmu",
5604f43646eSJianqun Xu 	},
5614f43646eSJianqun Xu };
5624f43646eSJianqun Xu 
563042310d6SJianqun Xu static const struct rockchip_iodomain_soc_data soc_data_rv1126_pmu = {
564042310d6SJianqun Xu 	.grf_offset = 0x140,
565042310d6SJianqun Xu 	.supply_names = {
566042310d6SJianqun Xu 		NULL,
567042310d6SJianqun Xu 		"vccio1",
568042310d6SJianqun Xu 		"vccio2",
569042310d6SJianqun Xu 		"vccio3",
570042310d6SJianqun Xu 		"vccio4",
571042310d6SJianqun Xu 		"vccio5",
572042310d6SJianqun Xu 		"vccio6",
573042310d6SJianqun Xu 		"vccio7",
574042310d6SJianqun Xu 		"pmuio0",
575042310d6SJianqun Xu 		"pmuio1",
576042310d6SJianqun Xu 	},
577042310d6SJianqun Xu };
578042310d6SJianqun Xu 
of_get_regulator(ofnode node,const char * supply)5794f43646eSJianqun Xu static struct udevice *of_get_regulator(ofnode node, const char *supply)
5804f43646eSJianqun Xu {
5814f43646eSJianqun Xu 	char sname[32]; /* 32 is max size of property name */
5829ed86f10SJoseph Chen 	struct udevice *sudev = NULL;
5834f43646eSJianqun Xu 	ofnode snode;
5844f43646eSJianqun Xu 	u32 phandle;
5854f43646eSJianqun Xu 	int ret;
5864f43646eSJianqun Xu 
5874f43646eSJianqun Xu 	snprintf(sname, 32, "%s-supply", supply);
5884f43646eSJianqun Xu 
5894f43646eSJianqun Xu 	/* Get regulator and clk */
5904f43646eSJianqun Xu 	if (!ofnode_read_u32(node, sname, &phandle)) {
5914f43646eSJianqun Xu 		snode = ofnode_get_by_phandle(phandle);
5924f43646eSJianqun Xu 		ret = regulator_get_by_devname(snode.np->name, &sudev);
5934f43646eSJianqun Xu 		if (ret) {
59461ab4d72SDavid Wu 			printf("%s: Get (%s) regulator: %s failed, ret=%d\n",
5954f43646eSJianqun Xu 			       __func__,
59661ab4d72SDavid Wu 			       sname, snode.np->full_name, ret);
5974f43646eSJianqun Xu 			return NULL;
5984f43646eSJianqun Xu 		}
5994f43646eSJianqun Xu 		debug("IO-DOMAIN: supply: %s\n", snode.np->full_name);
6004f43646eSJianqun Xu 	}
6014f43646eSJianqun Xu 
6024f43646eSJianqun Xu 	return sudev;
6034f43646eSJianqun Xu }
6044f43646eSJianqun Xu 
rockchip_iodomain_probe(struct udevice * dev)6054f43646eSJianqun Xu static int rockchip_iodomain_probe(struct udevice *dev)
6064f43646eSJianqun Xu {
6074f43646eSJianqun Xu 	struct rockchip_iodomain_priv *priv = dev_get_priv(dev);
6084f43646eSJianqun Xu 	struct rockchip_iodomain_soc_data *sdata;
6094f43646eSJianqun Xu 	int i, ret;
6104f43646eSJianqun Xu 
6114f43646eSJianqun Xu 	sdata = (struct rockchip_iodomain_soc_data *)dev_get_driver_data(dev);
6124f43646eSJianqun Xu 	priv->sdata = sdata;
61323049166SJianqun Xu 	if (sdata == &soc_data_rk3568_pmu)
61423049166SJianqun Xu 		priv->write = rk3568_pmu_iodomain_write;
615*1e1a2c06SSugar Zhang 	else if (sdata == &soc_data_rv1126_pmu)
616*1e1a2c06SSugar Zhang 		priv->write = rv1126_iodomain_write;
61723049166SJianqun Xu 	else
61823049166SJianqun Xu 		priv->write = rockchip_iodomain_write;
6194f43646eSJianqun Xu 
6204f43646eSJianqun Xu 	if (!priv->regmap_base)
6214f43646eSJianqun Xu 		return -1;
6224f43646eSJianqun Xu 
6234f43646eSJianqun Xu 	for (i = 0; i < MAX_SUPPLIES; i++) {
6244f43646eSJianqun Xu 		const char *supply_name = priv->sdata->supply_names[i];
6254f43646eSJianqun Xu 		struct rockchip_iodomain_supply *supply = &priv->supplies[i];
6264f43646eSJianqun Xu 		struct udevice *reg;
6274f43646eSJianqun Xu 		u32 uV;
6284f43646eSJianqun Xu 
6294f43646eSJianqun Xu 		if (!supply_name)
6304f43646eSJianqun Xu 			continue;
6314f43646eSJianqun Xu 
6324f43646eSJianqun Xu 		reg = of_get_regulator(dev_ofnode(dev), supply_name);
63396a4cf48SJianqun Xu 		if (!reg)
63496a4cf48SJianqun Xu 			continue;
6354f43646eSJianqun Xu 
6364f43646eSJianqun Xu 		uV = regulator_get_value(reg);
63796a4cf48SJianqun Xu 		if (uV <= 0) {
63896a4cf48SJianqun Xu 			printf("voltage(%d uV) is invalid from %s\n", uV, reg->name);
63996a4cf48SJianqun Xu 			continue;
6404f43646eSJianqun Xu 		}
6414f43646eSJianqun Xu 
6424f43646eSJianqun Xu 		if (uV > MAX_VOLTAGE_3_3) {
6434f43646eSJianqun Xu 			printf("%d uV is too high from %s\n", uV, reg->name);
64496a4cf48SJianqun Xu 			continue;
6454f43646eSJianqun Xu 		}
6464f43646eSJianqun Xu 
6474f43646eSJianqun Xu 		/* setup our supply */
6484f43646eSJianqun Xu 		supply->idx = i;
6494f43646eSJianqun Xu 		supply->iod = priv;
6504f43646eSJianqun Xu 		supply->reg = reg;
6514f43646eSJianqun Xu 
652458cbae4SDavid Wu 		ret = priv->write(supply, uV);
6534f43646eSJianqun Xu 		if (ret)
6544f43646eSJianqun Xu 			supply->reg = NULL;
6554f43646eSJianqun Xu 	}
6564f43646eSJianqun Xu 
6574f43646eSJianqun Xu 	if (priv->sdata->init)
6584f43646eSJianqun Xu 		priv->sdata->init(priv);
6594f43646eSJianqun Xu 
6604f43646eSJianqun Xu 	return 0;
6614f43646eSJianqun Xu }
6624f43646eSJianqun Xu 
6634f43646eSJianqun Xu static const struct udevice_id rockchip_iodomain_match[] = {
6644f43646eSJianqun Xu 	{
6654f43646eSJianqun Xu 		.compatible = "rockchip,px30-io-voltage-domain",
6664f43646eSJianqun Xu 		.data = (ulong)&soc_data_px30
6674f43646eSJianqun Xu 	},
6684f43646eSJianqun Xu 	{
6694f43646eSJianqun Xu 		.compatible = "rockchip,px30-pmu-io-voltage-domain",
6704f43646eSJianqun Xu 		.data = (ulong)&soc_data_px30_pmu
6714f43646eSJianqun Xu 	},
6724f43646eSJianqun Xu 	{
6734f43646eSJianqun Xu 		.compatible = "rockchip,rk3188-io-voltage-domain",
6744f43646eSJianqun Xu 		.data = (ulong)&soc_data_rk3188
6754f43646eSJianqun Xu 	},
6764f43646eSJianqun Xu 	{
6774f43646eSJianqun Xu 		.compatible = "rockchip,rk322x-io-voltage-domain",
6784f43646eSJianqun Xu 		.data = (ulong)&soc_data_rk322x
6794f43646eSJianqun Xu 	},
6804f43646eSJianqun Xu 	{
6814f43646eSJianqun Xu 		.compatible = "rockchip,rk3288-io-voltage-domain",
6824f43646eSJianqun Xu 		.data = (ulong)&soc_data_rk3288
6834f43646eSJianqun Xu 	},
6844f43646eSJianqun Xu 	{
6854f43646eSJianqun Xu 		.compatible = "rockchip,rk3308-io-voltage-domain",
6864f43646eSJianqun Xu 		.data = (ulong)&soc_data_rk3308
6874f43646eSJianqun Xu 	},
6884f43646eSJianqun Xu 	{
6894f43646eSJianqun Xu 		.compatible = "rockchip,rk3328-io-voltage-domain",
6904f43646eSJianqun Xu 		.data = (ulong)&soc_data_rk3328
6914f43646eSJianqun Xu 	},
6924f43646eSJianqun Xu 	{
6934f43646eSJianqun Xu 		.compatible = "rockchip,rk3366-io-voltage-domain",
6944f43646eSJianqun Xu 		.data = (ulong)&soc_data_rk3366
6954f43646eSJianqun Xu 	},
6964f43646eSJianqun Xu 	{
6974f43646eSJianqun Xu 		.compatible = "rockchip,rk3368-io-voltage-domain",
6984f43646eSJianqun Xu 		.data = (ulong)&soc_data_rk3368
6994f43646eSJianqun Xu 	},
7004f43646eSJianqun Xu 	{
7014f43646eSJianqun Xu 		.compatible = "rockchip,rk3368-pmu-io-voltage-domain",
7024f43646eSJianqun Xu 		.data = (ulong)&soc_data_rk3368_pmu
7034f43646eSJianqun Xu 	},
7044f43646eSJianqun Xu 	{
7054f43646eSJianqun Xu 		.compatible = "rockchip,rk3399-io-voltage-domain",
7064f43646eSJianqun Xu 		.data = (ulong)&soc_data_rk3399
7074f43646eSJianqun Xu 	},
7084f43646eSJianqun Xu 	{
7094f43646eSJianqun Xu 		.compatible = "rockchip,rk3399-pmu-io-voltage-domain",
7104f43646eSJianqun Xu 		.data = (ulong)&soc_data_rk3399_pmu
7114f43646eSJianqun Xu 	},
7124f43646eSJianqun Xu 	{
71323049166SJianqun Xu 		.compatible = "rockchip,rk3568-pmu-io-voltage-domain",
71423049166SJianqun Xu 		.data = (ulong)&soc_data_rk3568_pmu
71523049166SJianqun Xu 	},
71623049166SJianqun Xu 	{
7174f43646eSJianqun Xu 		.compatible = "rockchip,rv1108-io-voltage-domain",
7184f43646eSJianqun Xu 		.data = (ulong)&soc_data_rv1108
7194f43646eSJianqun Xu 	},
7204f43646eSJianqun Xu 	{
7214f43646eSJianqun Xu 		.compatible = "rockchip,rv1108-pmu-io-voltage-domain",
7224f43646eSJianqun Xu 		.data = (ulong)&soc_data_rv1108_pmu
7234f43646eSJianqun Xu 	},
724042310d6SJianqun Xu 	{
725042310d6SJianqun Xu 		.compatible = "rockchip,rv1126-pmu-io-voltage-domain",
726042310d6SJianqun Xu 		.data = (ulong)&soc_data_rv1126_pmu
727042310d6SJianqun Xu 	},
7284f43646eSJianqun Xu 	{ /* sentinel */ },
7294f43646eSJianqun Xu };
7304f43646eSJianqun Xu 
7314f43646eSJianqun Xu U_BOOT_DRIVER(io_domain) = {
7324f43646eSJianqun Xu 	.name		= "io_domain",
7334f43646eSJianqun Xu 	.id		= UCLASS_IO_DOMAIN,
7344f43646eSJianqun Xu 	.of_match	= rockchip_iodomain_match,
7354f43646eSJianqun Xu 	.priv_auto_alloc_size = sizeof(struct rockchip_iodomain_priv),
7364f43646eSJianqun Xu 	.ofdata_to_platdata	= rockchip_ofdata_to_platdata,
7374f43646eSJianqun Xu 	.probe		= rockchip_iodomain_probe,
7384f43646eSJianqun Xu };
739