Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F115907970
D36138.id109156.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
4 KB
Referenced Files
None
Subscribers
None
D36138.id109156.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}
};
@@ -136,24 +169,70 @@
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)
+ goto end;
+
+ if (regulator_get_voltage(supply, &uvolt) != 0) {
+ device_printf(sc->dev,
+ "Cannot get current voltage for regulator %s\n",
+ sc->conf->supply[i].name);
+ goto end;
}
- }
- 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 - 1 + 16)) |
+ (uvolt > MAX_1V8 ?
+ 0 : 1 << (sc->conf->supply[i].bit - 1)));
+ SYSCON_WRITE_4(sc->grf, RK3568_PMUGRF_IO_VSEL1,
+ (1 << (sc->conf->supply[i].bit - 1 + 16)) |
+ (uvolt > MAX_1V8 ?
+ 1 << (sc->conf->supply[i].bit - 1) : 0));
+ break;
+ default:
+ device_printf(sc->dev, "Index out of range\n");
+ }
+ }
+ }
+end:
+ 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);
}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Thu, May 1, 6:58 AM (21 h, 8 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
17875497
Default Alt Text
D36138.id109156.diff (4 KB)
Attached To
Mode
D36138: Add RockChip RK356X support to existing RockChip iodomain driver
Attached
Detach File
Event Timeline
Log In to Comment