Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F109385901
D36138.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
5 KB
Referenced Files
None
Subscribers
None
D36138.diff
View Options
diff --git a/sys/arm64/rockchip/rk_iodomain.c b/sys/arm64/rockchip/rk_iodomain.c
--- a/sys/arm64/rockchip/rk_iodomain.c
+++ b/sys/arm64/rockchip/rk_iodomain.c
@@ -46,6 +46,17 @@
#define RK3288_GRF_IO_VSEL 0x380
#define RK3399_GRF_IO_VSEL 0xe640
#define RK3399_PMUGRF_SOC_CON0 0x180
+#define RK3568_PMUGRF_IO_VSEL0 0x0140
+#define RK3568_PMUGRF_IO_VSEL1 0x0144
+#define RK3568_PMUGRF_IO_VSEL2 0x0148
+
+#define MAX_1V8 1850000
+
+enum rk_iodomain_type {
+ RK3328 = 1,
+ RK3399,
+ RK3568,
+};
struct rk_iodomain_supply {
char *name;
@@ -59,6 +70,7 @@
int nsupply;
uint32_t grf_reg;
void (*init)(struct rk_iodomain_softc *sc);
+ enum rk_iodomain_type type;
};
struct rk_iodomain_softc {
@@ -85,6 +97,7 @@
.supply = rk3288_supply,
.nsupply = nitems(rk3288_supply),
.grf_reg = RK3288_GRF_IO_VSEL,
+ .type = RK3328,
};
static struct rk_iodomain_supply rk3399_supply[] = {
@@ -98,6 +111,7 @@
.supply = rk3399_supply,
.nsupply = nitems(rk3399_supply),
.grf_reg = RK3399_GRF_IO_VSEL,
+ .type = RK3399,
};
static struct rk_iodomain_supply rk3399_pmu_supply[] = {
@@ -110,12 +124,31 @@
.nsupply = nitems(rk3399_pmu_supply),
.grf_reg = RK3399_PMUGRF_SOC_CON0,
.init = rk3399_pmu_init,
+ .type = RK3399,
+};
+
+static struct rk_iodomain_supply rk3568_pmu_supply[] = {
+ {"pmuio1-supply", 0},
+ {"pmuio2-supply", 1},
+ {"vccio1-supply", 1},
+ {"vccio2-supply", 2},
+ {"vccio3-supply", 3},
+ {"vccio4-supply", 4},
+ {"vccio5-supply", 5},
+ {"vccio6-supply", 6},
+ {"vccio7-supply", 7},
+};
+static struct rk_iodomain_conf rk3568_pmu_conf = {
+ .supply = rk3568_pmu_supply,
+ .nsupply = nitems(rk3568_pmu_supply),
+ .type = RK3568,
};
static struct ofw_compat_data compat_data[] = {
{"rockchip,rk3288-io-voltage-domain", (uintptr_t)&rk3288_conf},
{"rockchip,rk3399-io-voltage-domain", (uintptr_t)&rk3399_conf},
{"rockchip,rk3399-pmu-io-voltage-domain", (uintptr_t)&rk3399_pmu_conf},
+ {"rockchip,rk3568-pmu-io-voltage-domain", (uintptr_t)&rk3568_pmu_conf},
{NULL, 0}
};
@@ -127,7 +160,7 @@
(1 << 8) | (1 << (8 + 16))); /* set pmu1830_volsel */
}
-static void
+static int
rk_iodomain_set(struct rk_iodomain_softc *sc)
{
regulator_t supply;
@@ -136,26 +169,77 @@
int uvolt, i;
for (i = 0; i < sc->conf->nsupply; i++) {
- mask |= (1 << sc->conf->supply[i].bit) << 16;
if (regulator_get_by_ofw_property(sc->dev, sc->node,
- sc->conf->supply[i].name, &supply) == 0) {
- if (regulator_get_voltage(supply, &uvolt) == 0) {
- if (uvolt == 1800000)
- reg |= (1 << sc->conf->supply[i].bit);
- else if (uvolt != 3000000)
- device_printf(sc->dev,
- "%s regulator is at %duV, ignoring\n",
- sc->conf->supply[i].name, uvolt);
- } else
- device_printf(sc->dev, "Cannot get current "
- "voltage for regulator %s\n",
- sc->conf->supply[i].name);
+ sc->conf->supply[i].name, &supply) != 0) {
+ device_printf(sc->dev,
+ "Cannot get property for regulator %s\n",
+ sc->conf->supply[i].name);
+ return (ENXIO);
+ }
+
+ if (regulator_get_voltage(supply, &uvolt) != 0) {
+ device_printf(sc->dev,
+ "Cannot get current voltage for regulator %s\n",
+ sc->conf->supply[i].name);
+ return (ENXIO);
}
- }
- SYSCON_WRITE_4(sc->grf, sc->conf->grf_reg, reg | mask);
+ if (sc->conf->type != RK3568) {
+ /* RK3328 and RK3399 iodomain */
+ mask |= (1 << sc->conf->supply[i].bit) << 16;
+ if (uvolt == 1800000)
+ reg |= (1 << sc->conf->supply[i].bit);
+ else if (uvolt != 3000000)
+ device_printf(sc->dev,
+ "%s regulator is at %duV, ignoring\n",
+ sc->conf->supply[i].name, uvolt);
+ } else {
+ /* RK3568 iodomain */
+ if (bootverbose) {
+ device_printf(sc->dev,
+ "Setting regulator %s voltage=%duV\n",
+ sc->conf->supply[i].name, uvolt);
+ }
+ switch(i) {
+ case 0: /* pmuio1 */
+ break;
+ case 1: /* pmuio2 */
+ SYSCON_WRITE_4(sc->grf, RK3568_PMUGRF_IO_VSEL2,
+ (1 << (sc->conf->supply[i].bit + 16)) |
+ (uvolt > MAX_1V8 ?
+ 0 : 1 << sc->conf->supply[i].bit));
+ SYSCON_WRITE_4(sc->grf, RK3568_PMUGRF_IO_VSEL2,
+ (1 << (sc->conf->supply[i].bit + 4 + 16)) |
+ (uvolt > MAX_1V8 ?
+ 1 << (sc->conf->supply[i].bit + 4) : 0));
+ case 3: /* vccio2 */
+ break;
+ case 2: /* vccio1 */
+ case 4: /* vccio3 */
+ case 5: /* vccio4 */
+ case 6: /* vccio5 */
+ case 7: /* vccio6 */
+ case 8: /* vccio7 */
+ SYSCON_WRITE_4(sc->grf, RK3568_PMUGRF_IO_VSEL0,
+ (1 << (sc->conf->supply[i].bit + 16)) |
+ (uvolt > MAX_1V8 ?
+ 0 : 1 << sc->conf->supply[i].bit));
+ SYSCON_WRITE_4(sc->grf, RK3568_PMUGRF_IO_VSEL1,
+ (1 << (sc->conf->supply[i].bit + 16)) |
+ (uvolt > MAX_1V8 ?
+ 1 << sc->conf->supply[i].bit : 0));
+ break;
+ default:
+ device_printf(sc->dev, "Index out of range\n");
+ }
+ }
+ }
+ if (sc->conf->type != RK3568)
+ SYSCON_WRITE_4(sc->grf, sc->conf->grf_reg, reg | mask);
if (sc->conf->init != NULL)
sc->conf->init(sc);
+
+ return (0);
}
static int
@@ -189,9 +273,9 @@
}
sc->conf = (struct rk_iodomain_conf *)ofw_bus_search_compatible(dev, compat_data)->ocd_data;
- rk_iodomain_set(sc);
+ rv = rk_iodomain_set(sc);
- return (0);
+ return (rv);
}
static int
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Wed, Feb 5, 9:29 AM (4 h, 44 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
16471732
Default Alt Text
D36138.diff (5 KB)
Attached To
Mode
D36138: Add RockChip RK356X support to existing RockChip iodomain driver
Attached
Detach File
Event Timeline
Log In to Comment