Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F148992049
D36180.1789338568.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
6 KB
Referenced Files
None
Subscribers
None
D36180.1789338568.diff
View Options
Index: sys/arm64/rockchip/rk_iodomain.c
===================================================================
--- sys/arm64/rockchip/rk_iodomain.c
+++ sys/arm64/rockchip/rk_iodomain.c
@@ -46,28 +46,30 @@
#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;
uint32_t bit;
};
-struct rk_iodomain_softc;
-
struct rk_iodomain_conf {
struct rk_iodomain_supply *supply;
int nsupply;
uint32_t grf_reg;
- void (*init)(struct rk_iodomain_softc *sc);
+ enum rk_iodomain_type type;
};
-struct rk_iodomain_softc {
- device_t dev;
- struct syscon *grf;
- phandle_t node;
- struct rk_iodomain_conf *conf;
-};
-
static struct rk_iodomain_supply rk3288_supply[] = {
{"lcdc-supply", 0},
{"dvp-supply", 1},
@@ -85,6 +87,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 +101,7 @@
.supply = rk3399_supply,
.nsupply = nitems(rk3399_supply),
.grf_reg = RK3399_GRF_IO_VSEL,
+ .type = RK3399,
};
static struct rk_iodomain_supply rk3399_pmu_supply[] = {
@@ -104,60 +108,39 @@
{"pmu1830-supply", 9},
};
-static void rk3399_pmu_init(struct rk_iodomain_softc *sc);
static struct rk_iodomain_conf rk3399_pmu_conf = {
.supply = rk3399_pmu_supply,
.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}
};
-static void
-rk3399_pmu_init(struct rk_iodomain_softc *sc)
-{
- SYSCON_WRITE_4(sc->grf, RK3399_PMUGRF_SOC_CON0,
- (1 << 8) | (1 << (8 + 16))); /* set pmu1830_volsel */
-}
-
-static void
-rk_iodomain_set(struct rk_iodomain_softc *sc)
-{
- regulator_t supply;
- uint32_t reg = 0;
- uint32_t mask = 0;
- 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);
- }
- }
-
- SYSCON_WRITE_4(sc->grf, sc->conf->grf_reg, reg | mask);
- if (sc->conf->init != NULL)
- sc->conf->init(sc);
-}
-
static int
rk_iodomain_probe(device_t dev)
{
@@ -175,22 +158,98 @@
static int
rk_iodomain_attach(device_t dev)
{
- struct rk_iodomain_softc *sc;
+ struct rk_iodomain_conf *conf;
+ struct syscon *grf;
+ regulator_t supply;
+ phandle_t node;
+ uint32_t reg = 0;
+ uint32_t mask = 0;
+ int uvolt, i;
int rv;
- sc = device_get_softc(dev);
- sc->dev = dev;
- sc->node = ofw_bus_get_node(dev);
+ node = ofw_bus_get_node(dev);
- rv = syscon_get_handle_default(dev, &sc->grf);
+ rv = syscon_get_handle_default(dev, &grf);
if (rv != 0) {
device_printf(dev, "Cannot get grf handle\n");
return (ENXIO);
}
- sc->conf = (struct rk_iodomain_conf *)ofw_bus_search_compatible(dev, compat_data)->ocd_data;
- rk_iodomain_set(sc);
+ conf = (struct rk_iodomain_conf *)ofw_bus_search_compatible(dev, compat_data)->ocd_data;
+ for (i = 0; i < conf->nsupply; i++) {
+ if (regulator_get_by_ofw_property(dev, node,
+ conf->supply[i].name, &supply) != 0) {
+ device_printf(dev,
+ "Cannot get property for regulator %s\n",
+ conf->supply[i].name);
+ return (ENXIO);
+ }
+
+ if (regulator_get_voltage(supply, &uvolt) != 0) {
+ device_printf(dev,
+ "Cannot get current voltage for regulator %s\n",
+ conf->supply[i].name);
+ goto end;
+ }
+
+ if (conf->type != RK3568) {
+ /* RK3328 and RK3399 iodomain */
+ mask |= (1 << conf->supply[i].bit) << 16;
+ if (uvolt == 1800000)
+ reg |= (1 << conf->supply[i].bit);
+ else if (uvolt != 3000000)
+ device_printf(dev,
+ "%s regulator is at %duV, ignoring\n",
+ conf->supply[i].name, uvolt);
+ } else {
+ /* RK3568 iodomain */
+ if (bootverbose) {
+ device_printf(dev,
+ "Setting regulator %s voltage=%duV\n",
+ conf->supply[i].name, uvolt);
+ }
+ switch(i) {
+ case 0: /* pmuio1 */
+ break;
+ case 1: /* pmuio2 */
+ SYSCON_WRITE_4(grf, RK3568_PMUGRF_IO_VSEL2,
+ (1 << (conf->supply[i].bit + 16)) |
+ (uvolt > MAX_1V8 ?
+ 0 : 1 << conf->supply[i].bit));
+ SYSCON_WRITE_4(grf, RK3568_PMUGRF_IO_VSEL2,
+ (1 << (conf->supply[i].bit + 4 + 16)) |
+ (uvolt > MAX_1V8 ?
+ 1 << (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(grf, RK3568_PMUGRF_IO_VSEL0,
+ (1 << (conf->supply[i].bit + 16)) |
+ (uvolt > MAX_1V8 ?
+ 0 : 1 << conf->supply[i].bit));
+ SYSCON_WRITE_4(grf, RK3568_PMUGRF_IO_VSEL1,
+ (1 << (conf->supply[i].bit + 16)) |
+ (uvolt > MAX_1V8 ?
+ 1 << conf->supply[i].bit : 0));
+ break;
+ default:
+ device_printf(dev, "Index out of range\n");
+ }
+ }
+ }
+end:
+ if (conf->type != RK3568)
+ SYSCON_WRITE_4(grf, conf->grf_reg, reg | mask);
+ if (conf->type == RK3399)
+ SYSCON_WRITE_4(grf, RK3399_PMUGRF_SOC_CON0,
+ (1 << 8) | (1 << (8 + 16))); /* set pmu1830_volsel */
+
return (0);
}
@@ -213,8 +272,9 @@
static driver_t rk_iodomain_driver = {
"rk_iodomain",
rk_iodomain_methods,
- sizeof(struct rk_iodomain_softc),
+ 0,
};
+
EARLY_DRIVER_MODULE(rk_iodomain, simplebus, rk_iodomain_driver, 0, 0,
BUS_PASS_INTERRUPT + BUS_PASS_ORDER_MIDDLE);
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sun, Sep 13, 10:29 PM (13 h, 59 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
29603634
Default Alt Text
D36180.1789338568.diff (6 KB)
Attached To
Mode
D36180: Proposed update to rk_iodomain for RK3568 support
Attached
Detach File
Event Timeline
Log In to Comment