mirror of
https://github.com/coolsnowwolf/lede.git
synced 2025-04-16 04:13:31 +00:00
rockchip: backport upstream rk3576 support for kernel 6.6
This commit is contained in:
parent
8decff2d88
commit
ab8cac3519
@ -137,6 +137,7 @@ CONFIG_CLK_RK3368=y
|
|||||||
CONFIG_CLK_RK3399=y
|
CONFIG_CLK_RK3399=y
|
||||||
CONFIG_CLK_RK3528=y
|
CONFIG_CLK_RK3528=y
|
||||||
CONFIG_CLK_RK3568=y
|
CONFIG_CLK_RK3568=y
|
||||||
|
CONFIG_CLK_RK3576=y
|
||||||
CONFIG_CLK_RK3588=y
|
CONFIG_CLK_RK3588=y
|
||||||
CONFIG_CLONE_BACKWARDS=y
|
CONFIG_CLONE_BACKWARDS=y
|
||||||
CONFIG_CMA=y
|
CONFIG_CMA=y
|
||||||
|
@ -0,0 +1,73 @@
|
|||||||
|
From e1aaecacfa135cd264a0db331d3ab8b2a04a54a3 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Detlev Casanova <detlev.casanova@collabora.com>
|
||||||
|
Date: Thu, 22 Aug 2024 15:53:37 -0400
|
||||||
|
Subject: [PATCH] soc: rockchip: grf: Add rk3576 default GRF values
|
||||||
|
|
||||||
|
Set SW controlled i3c weak pull up and disable JTAG function on SDMMC IO.
|
||||||
|
|
||||||
|
The i3c weak pull up is activated to let all gpio banks be controlled
|
||||||
|
by the pinctrl driver.
|
||||||
|
|
||||||
|
Disabling the JTAG function lets the SDMMC core use its full IO width.
|
||||||
|
|
||||||
|
Signed-off-by: Detlev Casanova <detlev.casanova@collabora.com>
|
||||||
|
Acked-by: Dragan Simic <dsimic@manjaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20240822195706.920567-3-detlev.casanova@collabora.com
|
||||||
|
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
|
||||||
|
---
|
||||||
|
drivers/soc/rockchip/grf.c | 30 +++++++++++++++++++++++++++++-
|
||||||
|
1 file changed, 29 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
--- a/drivers/soc/rockchip/grf.c
|
||||||
|
+++ b/drivers/soc/rockchip/grf.c
|
||||||
|
@@ -121,6 +121,29 @@ static const struct rockchip_grf_info rk
|
||||||
|
.num_values = ARRAY_SIZE(rk3566_defaults),
|
||||||
|
};
|
||||||
|
|
||||||
|
+#define RK3576_SYSGRF_SOC_CON1 0x0004
|
||||||
|
+
|
||||||
|
+static const struct rockchip_grf_value rk3576_defaults_sys_grf[] __initconst = {
|
||||||
|
+ { "i3c0 weakpull", RK3576_SYSGRF_SOC_CON1, HIWORD_UPDATE(3, 3, 6) },
|
||||||
|
+ { "i3c1 weakpull", RK3576_SYSGRF_SOC_CON1, HIWORD_UPDATE(3, 3, 8) },
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static const struct rockchip_grf_info rk3576_sysgrf __initconst = {
|
||||||
|
+ .values = rk3576_defaults_sys_grf,
|
||||||
|
+ .num_values = ARRAY_SIZE(rk3576_defaults_sys_grf),
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+#define RK3576_IOCGRF_MISC_CON 0x04F0
|
||||||
|
+
|
||||||
|
+static const struct rockchip_grf_value rk3576_defaults_ioc_grf[] __initconst = {
|
||||||
|
+ { "jtag switching", RK3576_IOCGRF_MISC_CON, HIWORD_UPDATE(0, 1, 1) },
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static const struct rockchip_grf_info rk3576_iocgrf __initconst = {
|
||||||
|
+ .values = rk3576_defaults_ioc_grf,
|
||||||
|
+ .num_values = ARRAY_SIZE(rk3576_defaults_ioc_grf),
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
#define RK3588_GRF_SOC_CON6 0x0318
|
||||||
|
|
||||||
|
static const struct rockchip_grf_value rk3588_defaults[] __initconst = {
|
||||||
|
@@ -132,7 +155,6 @@ static const struct rockchip_grf_info rk
|
||||||
|
.num_values = ARRAY_SIZE(rk3588_defaults),
|
||||||
|
};
|
||||||
|
|
||||||
|
-
|
||||||
|
static const struct of_device_id rockchip_grf_dt_match[] __initconst = {
|
||||||
|
{
|
||||||
|
.compatible = "rockchip,rk3036-grf",
|
||||||
|
@@ -159,6 +181,12 @@ static const struct of_device_id rockchi
|
||||||
|
.compatible = "rockchip,rk3566-pipe-grf",
|
||||||
|
.data = (void *)&rk3566_pipegrf,
|
||||||
|
}, {
|
||||||
|
+ .compatible = "rockchip,rk3576-sys-grf",
|
||||||
|
+ .data = (void *)&rk3576_sysgrf,
|
||||||
|
+ }, {
|
||||||
|
+ .compatible = "rockchip,rk3576-ioc-grf",
|
||||||
|
+ .data = (void *)&rk3576_iocgrf,
|
||||||
|
+ }, {
|
||||||
|
.compatible = "rockchip,rk3588-sys-grf",
|
||||||
|
.data = (void *)&rk3588_sysgrf,
|
||||||
|
},
|
@ -0,0 +1,307 @@
|
|||||||
|
From 69c6343ed03486c86271c7a4fdd5a2af4637c38b Mon Sep 17 00:00:00 2001
|
||||||
|
From: Steven Liu <steven.liu@rock-chips.com>
|
||||||
|
Date: Thu, 22 Aug 2024 15:53:39 -0400
|
||||||
|
Subject: [PATCH] pinctrl: rockchip: Add rk3576 pinctrl support
|
||||||
|
|
||||||
|
Add support for the 5 rk3576 GPIO banks.
|
||||||
|
|
||||||
|
Signed-off-by: Steven Liu <steven.liu@rock-chips.com>
|
||||||
|
Signed-off-by: Detlev Casanova <detlev.casanova@collabora.com>
|
||||||
|
Acked-by: Dragan Simic <dsimic@manjaro.org>
|
||||||
|
Reviewed-by: Heiko Stuebner <heiko@sntech.de>
|
||||||
|
Link: https://lore.kernel.org/20240822195706.920567-5-detlev.casanova@collabora.com
|
||||||
|
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
|
||||||
|
---
|
||||||
|
drivers/pinctrl/pinctrl-rockchip.c | 207 +++++++++++++++++++++++++++++
|
||||||
|
drivers/pinctrl/pinctrl-rockchip.h | 1 +
|
||||||
|
2 files changed, 208 insertions(+)
|
||||||
|
|
||||||
|
--- a/drivers/pinctrl/pinctrl-rockchip.c
|
||||||
|
+++ b/drivers/pinctrl/pinctrl-rockchip.c
|
||||||
|
@@ -84,6 +84,27 @@
|
||||||
|
}, \
|
||||||
|
}
|
||||||
|
|
||||||
|
+#define PIN_BANK_IOMUX_FLAGS_OFFSET_PULL_FLAGS(id, pins, label, iom0, \
|
||||||
|
+ iom1, iom2, iom3, \
|
||||||
|
+ offset0, offset1, \
|
||||||
|
+ offset2, offset3, pull0, \
|
||||||
|
+ pull1, pull2, pull3) \
|
||||||
|
+ { \
|
||||||
|
+ .bank_num = id, \
|
||||||
|
+ .nr_pins = pins, \
|
||||||
|
+ .name = label, \
|
||||||
|
+ .iomux = { \
|
||||||
|
+ { .type = iom0, .offset = offset0 }, \
|
||||||
|
+ { .type = iom1, .offset = offset1 }, \
|
||||||
|
+ { .type = iom2, .offset = offset2 }, \
|
||||||
|
+ { .type = iom3, .offset = offset3 }, \
|
||||||
|
+ }, \
|
||||||
|
+ .pull_type[0] = pull0, \
|
||||||
|
+ .pull_type[1] = pull1, \
|
||||||
|
+ .pull_type[2] = pull2, \
|
||||||
|
+ .pull_type[3] = pull3, \
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
#define PIN_BANK_DRV_FLAGS(id, pins, label, type0, type1, type2, type3) \
|
||||||
|
{ \
|
||||||
|
.bank_num = id, \
|
||||||
|
@@ -1120,6 +1141,11 @@ static int rockchip_get_mux(struct rockc
|
||||||
|
if (bank->recalced_mask & BIT(pin))
|
||||||
|
rockchip_get_recalced_mux(bank, pin, ®, &bit, &mask);
|
||||||
|
|
||||||
|
+ if (ctrl->type == RK3576) {
|
||||||
|
+ if ((bank->bank_num == 0) && (pin >= RK_PB4) && (pin <= RK_PB7))
|
||||||
|
+ reg += 0x1ff4; /* GPIO0_IOC_GPIO0B_IOMUX_SEL_H */
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (ctrl->type == RK3588) {
|
||||||
|
if (bank->bank_num == 0) {
|
||||||
|
if ((pin >= RK_PB4) && (pin <= RK_PD7)) {
|
||||||
|
@@ -1234,6 +1260,11 @@ static int rockchip_set_mux(struct rockc
|
||||||
|
if (bank->recalced_mask & BIT(pin))
|
||||||
|
rockchip_get_recalced_mux(bank, pin, ®, &bit, &mask);
|
||||||
|
|
||||||
|
+ if (ctrl->type == RK3576) {
|
||||||
|
+ if ((bank->bank_num == 0) && (pin >= RK_PB4) && (pin <= RK_PB7))
|
||||||
|
+ reg += 0x1ff4; /* GPIO0_IOC_GPIO0B_IOMUX_SEL_H */
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (ctrl->type == RK3588) {
|
||||||
|
if (bank->bank_num == 0) {
|
||||||
|
if ((pin >= RK_PB4) && (pin <= RK_PD7)) {
|
||||||
|
@@ -2038,6 +2069,142 @@ static int rk3568_calc_drv_reg_and_bit(s
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+#define RK3576_DRV_BITS_PER_PIN 4
|
||||||
|
+#define RK3576_DRV_PINS_PER_REG 4
|
||||||
|
+#define RK3576_DRV_GPIO0_AL_OFFSET 0x10
|
||||||
|
+#define RK3576_DRV_GPIO0_BH_OFFSET 0x2014
|
||||||
|
+#define RK3576_DRV_GPIO1_OFFSET 0x6020
|
||||||
|
+#define RK3576_DRV_GPIO2_OFFSET 0x6040
|
||||||
|
+#define RK3576_DRV_GPIO3_OFFSET 0x6060
|
||||||
|
+#define RK3576_DRV_GPIO4_AL_OFFSET 0x6080
|
||||||
|
+#define RK3576_DRV_GPIO4_CL_OFFSET 0xA090
|
||||||
|
+#define RK3576_DRV_GPIO4_DL_OFFSET 0xB098
|
||||||
|
+
|
||||||
|
+static int rk3576_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
|
||||||
|
+ int pin_num, struct regmap **regmap,
|
||||||
|
+ int *reg, u8 *bit)
|
||||||
|
+{
|
||||||
|
+ struct rockchip_pinctrl *info = bank->drvdata;
|
||||||
|
+
|
||||||
|
+ *regmap = info->regmap_base;
|
||||||
|
+
|
||||||
|
+ if (bank->bank_num == 0 && pin_num < 12)
|
||||||
|
+ *reg = RK3576_DRV_GPIO0_AL_OFFSET;
|
||||||
|
+ else if (bank->bank_num == 0)
|
||||||
|
+ *reg = RK3576_DRV_GPIO0_BH_OFFSET - 0xc;
|
||||||
|
+ else if (bank->bank_num == 1)
|
||||||
|
+ *reg = RK3576_DRV_GPIO1_OFFSET;
|
||||||
|
+ else if (bank->bank_num == 2)
|
||||||
|
+ *reg = RK3576_DRV_GPIO2_OFFSET;
|
||||||
|
+ else if (bank->bank_num == 3)
|
||||||
|
+ *reg = RK3576_DRV_GPIO3_OFFSET;
|
||||||
|
+ else if (bank->bank_num == 4 && pin_num < 16)
|
||||||
|
+ *reg = RK3576_DRV_GPIO4_AL_OFFSET;
|
||||||
|
+ else if (bank->bank_num == 4 && pin_num < 24)
|
||||||
|
+ *reg = RK3576_DRV_GPIO4_CL_OFFSET - 0x10;
|
||||||
|
+ else if (bank->bank_num == 4)
|
||||||
|
+ *reg = RK3576_DRV_GPIO4_DL_OFFSET - 0x18;
|
||||||
|
+ else
|
||||||
|
+ dev_err(info->dev, "unsupported bank_num %d\n", bank->bank_num);
|
||||||
|
+
|
||||||
|
+ *reg += ((pin_num / RK3576_DRV_PINS_PER_REG) * 4);
|
||||||
|
+ *bit = pin_num % RK3576_DRV_PINS_PER_REG;
|
||||||
|
+ *bit *= RK3576_DRV_BITS_PER_PIN;
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+#define RK3576_PULL_BITS_PER_PIN 2
|
||||||
|
+#define RK3576_PULL_PINS_PER_REG 8
|
||||||
|
+#define RK3576_PULL_GPIO0_AL_OFFSET 0x20
|
||||||
|
+#define RK3576_PULL_GPIO0_BH_OFFSET 0x2028
|
||||||
|
+#define RK3576_PULL_GPIO1_OFFSET 0x6110
|
||||||
|
+#define RK3576_PULL_GPIO2_OFFSET 0x6120
|
||||||
|
+#define RK3576_PULL_GPIO3_OFFSET 0x6130
|
||||||
|
+#define RK3576_PULL_GPIO4_AL_OFFSET 0x6140
|
||||||
|
+#define RK3576_PULL_GPIO4_CL_OFFSET 0xA148
|
||||||
|
+#define RK3576_PULL_GPIO4_DL_OFFSET 0xB14C
|
||||||
|
+
|
||||||
|
+static int rk3576_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
|
||||||
|
+ int pin_num, struct regmap **regmap,
|
||||||
|
+ int *reg, u8 *bit)
|
||||||
|
+{
|
||||||
|
+ struct rockchip_pinctrl *info = bank->drvdata;
|
||||||
|
+
|
||||||
|
+ *regmap = info->regmap_base;
|
||||||
|
+
|
||||||
|
+ if (bank->bank_num == 0 && pin_num < 12)
|
||||||
|
+ *reg = RK3576_PULL_GPIO0_AL_OFFSET;
|
||||||
|
+ else if (bank->bank_num == 0)
|
||||||
|
+ *reg = RK3576_PULL_GPIO0_BH_OFFSET - 0x4;
|
||||||
|
+ else if (bank->bank_num == 1)
|
||||||
|
+ *reg = RK3576_PULL_GPIO1_OFFSET;
|
||||||
|
+ else if (bank->bank_num == 2)
|
||||||
|
+ *reg = RK3576_PULL_GPIO2_OFFSET;
|
||||||
|
+ else if (bank->bank_num == 3)
|
||||||
|
+ *reg = RK3576_PULL_GPIO3_OFFSET;
|
||||||
|
+ else if (bank->bank_num == 4 && pin_num < 16)
|
||||||
|
+ *reg = RK3576_PULL_GPIO4_AL_OFFSET;
|
||||||
|
+ else if (bank->bank_num == 4 && pin_num < 24)
|
||||||
|
+ *reg = RK3576_PULL_GPIO4_CL_OFFSET - 0x8;
|
||||||
|
+ else if (bank->bank_num == 4)
|
||||||
|
+ *reg = RK3576_PULL_GPIO4_DL_OFFSET - 0xc;
|
||||||
|
+ else
|
||||||
|
+ dev_err(info->dev, "unsupported bank_num %d\n", bank->bank_num);
|
||||||
|
+
|
||||||
|
+ *reg += ((pin_num / RK3576_PULL_PINS_PER_REG) * 4);
|
||||||
|
+ *bit = pin_num % RK3576_PULL_PINS_PER_REG;
|
||||||
|
+ *bit *= RK3576_PULL_BITS_PER_PIN;
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+#define RK3576_SMT_BITS_PER_PIN 1
|
||||||
|
+#define RK3576_SMT_PINS_PER_REG 8
|
||||||
|
+#define RK3576_SMT_GPIO0_AL_OFFSET 0x30
|
||||||
|
+#define RK3576_SMT_GPIO0_BH_OFFSET 0x2040
|
||||||
|
+#define RK3576_SMT_GPIO1_OFFSET 0x6210
|
||||||
|
+#define RK3576_SMT_GPIO2_OFFSET 0x6220
|
||||||
|
+#define RK3576_SMT_GPIO3_OFFSET 0x6230
|
||||||
|
+#define RK3576_SMT_GPIO4_AL_OFFSET 0x6240
|
||||||
|
+#define RK3576_SMT_GPIO4_CL_OFFSET 0xA248
|
||||||
|
+#define RK3576_SMT_GPIO4_DL_OFFSET 0xB24C
|
||||||
|
+
|
||||||
|
+static int rk3576_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
|
||||||
|
+ int pin_num,
|
||||||
|
+ struct regmap **regmap,
|
||||||
|
+ int *reg, u8 *bit)
|
||||||
|
+{
|
||||||
|
+ struct rockchip_pinctrl *info = bank->drvdata;
|
||||||
|
+
|
||||||
|
+ *regmap = info->regmap_base;
|
||||||
|
+
|
||||||
|
+ if (bank->bank_num == 0 && pin_num < 12)
|
||||||
|
+ *reg = RK3576_SMT_GPIO0_AL_OFFSET;
|
||||||
|
+ else if (bank->bank_num == 0)
|
||||||
|
+ *reg = RK3576_SMT_GPIO0_BH_OFFSET - 0x4;
|
||||||
|
+ else if (bank->bank_num == 1)
|
||||||
|
+ *reg = RK3576_SMT_GPIO1_OFFSET;
|
||||||
|
+ else if (bank->bank_num == 2)
|
||||||
|
+ *reg = RK3576_SMT_GPIO2_OFFSET;
|
||||||
|
+ else if (bank->bank_num == 3)
|
||||||
|
+ *reg = RK3576_SMT_GPIO3_OFFSET;
|
||||||
|
+ else if (bank->bank_num == 4 && pin_num < 16)
|
||||||
|
+ *reg = RK3576_SMT_GPIO4_AL_OFFSET;
|
||||||
|
+ else if (bank->bank_num == 4 && pin_num < 24)
|
||||||
|
+ *reg = RK3576_SMT_GPIO4_CL_OFFSET - 0x8;
|
||||||
|
+ else if (bank->bank_num == 4)
|
||||||
|
+ *reg = RK3576_SMT_GPIO4_DL_OFFSET - 0xc;
|
||||||
|
+ else
|
||||||
|
+ dev_err(info->dev, "unsupported bank_num %d\n", bank->bank_num);
|
||||||
|
+
|
||||||
|
+ *reg += ((pin_num / RK3576_SMT_PINS_PER_REG) * 4);
|
||||||
|
+ *bit = pin_num % RK3576_SMT_PINS_PER_REG;
|
||||||
|
+ *bit *= RK3576_SMT_BITS_PER_PIN;
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
#define RK3588_PMU1_IOC_REG (0x0000)
|
||||||
|
#define RK3588_PMU2_IOC_REG (0x4000)
|
||||||
|
#define RK3588_BUS_IOC_REG (0x8000)
|
||||||
|
@@ -2332,6 +2499,10 @@ static int rockchip_set_drive_perpin(str
|
||||||
|
rmask_bits = RK3568_DRV_BITS_PER_PIN;
|
||||||
|
ret = (1 << (strength + 1)) - 1;
|
||||||
|
goto config;
|
||||||
|
+ } else if (ctrl->type == RK3576) {
|
||||||
|
+ rmask_bits = RK3576_DRV_BITS_PER_PIN;
|
||||||
|
+ ret = ((strength & BIT(2)) >> 2) | ((strength & BIT(0)) << 2) | (strength & BIT(1));
|
||||||
|
+ goto config;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ctrl->type == RV1126) {
|
||||||
|
@@ -2469,6 +2640,7 @@ static int rockchip_get_pull(struct rock
|
||||||
|
case RK3368:
|
||||||
|
case RK3399:
|
||||||
|
case RK3568:
|
||||||
|
+ case RK3576:
|
||||||
|
case RK3588:
|
||||||
|
pull_type = bank->pull_type[pin_num / 8];
|
||||||
|
data >>= bit;
|
||||||
|
@@ -2528,6 +2700,7 @@ static int rockchip_set_pull(struct rock
|
||||||
|
case RK3368:
|
||||||
|
case RK3399:
|
||||||
|
case RK3568:
|
||||||
|
+ case RK3576:
|
||||||
|
case RK3588:
|
||||||
|
pull_type = bank->pull_type[pin_num / 8];
|
||||||
|
ret = -EINVAL;
|
||||||
|
@@ -2793,6 +2966,7 @@ static bool rockchip_pinconf_pull_valid(
|
||||||
|
case RK3368:
|
||||||
|
case RK3399:
|
||||||
|
case RK3568:
|
||||||
|
+ case RK3576:
|
||||||
|
case RK3588:
|
||||||
|
return (pull != PIN_CONFIG_BIAS_PULL_PIN_DEFAULT);
|
||||||
|
}
|
||||||
|
@@ -3956,6 +4130,37 @@ static struct rockchip_pin_ctrl rk3568_p
|
||||||
|
.schmitt_calc_reg = rk3568_calc_schmitt_reg_and_bit,
|
||||||
|
};
|
||||||
|
|
||||||
|
+#define RK3576_PIN_BANK(ID, LABEL, OFFSET0, OFFSET1, OFFSET2, OFFSET3) \
|
||||||
|
+ PIN_BANK_IOMUX_FLAGS_OFFSET_PULL_FLAGS(ID, 32, LABEL, \
|
||||||
|
+ IOMUX_WIDTH_4BIT, \
|
||||||
|
+ IOMUX_WIDTH_4BIT, \
|
||||||
|
+ IOMUX_WIDTH_4BIT, \
|
||||||
|
+ IOMUX_WIDTH_4BIT, \
|
||||||
|
+ OFFSET0, OFFSET1, \
|
||||||
|
+ OFFSET2, OFFSET3, \
|
||||||
|
+ PULL_TYPE_IO_1V8_ONLY, \
|
||||||
|
+ PULL_TYPE_IO_1V8_ONLY, \
|
||||||
|
+ PULL_TYPE_IO_1V8_ONLY, \
|
||||||
|
+ PULL_TYPE_IO_1V8_ONLY)
|
||||||
|
+
|
||||||
|
+static struct rockchip_pin_bank rk3576_pin_banks[] = {
|
||||||
|
+ RK3576_PIN_BANK(0, "gpio0", 0, 0x8, 0x2004, 0x200C),
|
||||||
|
+ RK3576_PIN_BANK(1, "gpio1", 0x4020, 0x4028, 0x4030, 0x4038),
|
||||||
|
+ RK3576_PIN_BANK(2, "gpio2", 0x4040, 0x4048, 0x4050, 0x4058),
|
||||||
|
+ RK3576_PIN_BANK(3, "gpio3", 0x4060, 0x4068, 0x4070, 0x4078),
|
||||||
|
+ RK3576_PIN_BANK(4, "gpio4", 0x4080, 0x4088, 0xA390, 0xB398),
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static struct rockchip_pin_ctrl rk3576_pin_ctrl __maybe_unused = {
|
||||||
|
+ .pin_banks = rk3576_pin_banks,
|
||||||
|
+ .nr_banks = ARRAY_SIZE(rk3576_pin_banks),
|
||||||
|
+ .label = "RK3576-GPIO",
|
||||||
|
+ .type = RK3576,
|
||||||
|
+ .pull_calc_reg = rk3576_calc_pull_reg_and_bit,
|
||||||
|
+ .drv_calc_reg = rk3576_calc_drv_reg_and_bit,
|
||||||
|
+ .schmitt_calc_reg = rk3576_calc_schmitt_reg_and_bit,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
static struct rockchip_pin_bank rk3588_pin_banks[] = {
|
||||||
|
RK3588_PIN_BANK_FLAGS(0, 32, "gpio0",
|
||||||
|
IOMUX_WIDTH_4BIT, PULL_TYPE_IO_1V8_ONLY),
|
||||||
|
@@ -4012,6 +4217,8 @@ static const struct of_device_id rockchi
|
||||||
|
.data = &rk3399_pin_ctrl },
|
||||||
|
{ .compatible = "rockchip,rk3568-pinctrl",
|
||||||
|
.data = &rk3568_pin_ctrl },
|
||||||
|
+ { .compatible = "rockchip,rk3576-pinctrl",
|
||||||
|
+ .data = &rk3576_pin_ctrl },
|
||||||
|
{ .compatible = "rockchip,rk3588-pinctrl",
|
||||||
|
.data = &rk3588_pin_ctrl },
|
||||||
|
{},
|
||||||
|
--- a/drivers/pinctrl/pinctrl-rockchip.h
|
||||||
|
+++ b/drivers/pinctrl/pinctrl-rockchip.h
|
||||||
|
@@ -197,6 +197,7 @@ enum rockchip_pinctrl_type {
|
||||||
|
RK3368,
|
||||||
|
RK3399,
|
||||||
|
RK3568,
|
||||||
|
+ RK3576,
|
||||||
|
RK3588,
|
||||||
|
};
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,51 @@
|
|||||||
|
From e781bffc296766b55dbd048890d558655031e8d1 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Elaine Zhang <zhangqing@rock-chips.com>
|
||||||
|
Date: Wed, 28 Aug 2024 15:42:52 +0000
|
||||||
|
Subject: [PATCH] clk: rockchip: Add new pll type pll_rk3588_ddr
|
||||||
|
|
||||||
|
That PLL type is similar to the other rk3588 pll types but the actual
|
||||||
|
rate is twice the configured rate.
|
||||||
|
Therefore, the returned calculated rate must be multiplied by two.
|
||||||
|
|
||||||
|
Signed-off-by: Elaine Zhang <zhangqing@rock-chips.com>
|
||||||
|
Signed-off-by: Detlev Casanova <detlev.casanova@collabora.com>
|
||||||
|
Acked-by: Dragan Simic <dsimic@manjaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/0102019199a76ec4-9d5846d4-d76a-4e69-a241-c88c2983d607-000000@eu-west-1.amazonses.com
|
||||||
|
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
|
||||||
|
---
|
||||||
|
drivers/clk/rockchip/clk-pll.c | 6 +++++-
|
||||||
|
drivers/clk/rockchip/clk.h | 1 +
|
||||||
|
2 files changed, 6 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
--- a/drivers/clk/rockchip/clk-pll.c
|
||||||
|
+++ b/drivers/clk/rockchip/clk-pll.c
|
||||||
|
@@ -914,7 +914,10 @@ static unsigned long rockchip_rk3588_pll
|
||||||
|
}
|
||||||
|
rate64 = rate64 >> cur.s;
|
||||||
|
|
||||||
|
- return (unsigned long)rate64;
|
||||||
|
+ if (pll->type == pll_rk3588_ddr)
|
||||||
|
+ return (unsigned long)rate64 * 2;
|
||||||
|
+ else
|
||||||
|
+ return (unsigned long)rate64;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int rockchip_rk3588_pll_set_params(struct rockchip_clk_pll *pll,
|
||||||
|
@@ -1167,6 +1170,7 @@ struct clk *rockchip_clk_register_pll(st
|
||||||
|
break;
|
||||||
|
case pll_rk3588:
|
||||||
|
case pll_rk3588_core:
|
||||||
|
+ case pll_rk3588_ddr:
|
||||||
|
if (!pll->rate_table)
|
||||||
|
init.ops = &rockchip_rk3588_pll_clk_norate_ops;
|
||||||
|
else
|
||||||
|
--- a/drivers/clk/rockchip/clk.h
|
||||||
|
+++ b/drivers/clk/rockchip/clk.h
|
||||||
|
@@ -287,6 +287,7 @@ enum rockchip_pll_type {
|
||||||
|
pll_rk3399,
|
||||||
|
pll_rk3588,
|
||||||
|
pll_rk3588_core,
|
||||||
|
+ pll_rk3588_ddr,
|
||||||
|
};
|
||||||
|
|
||||||
|
#define RK3036_PLL_RATE(_rate, _refdiv, _fbdiv, _postdiv1, \
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,58 @@
|
|||||||
|
From eb3b3f520518003cd363239fc160bdd7ed327319 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Heiko Stuebner <heiko@sntech.de>
|
||||||
|
Date: Tue, 10 Sep 2024 00:31:49 +0200
|
||||||
|
Subject: [PATCH] dt-bindings: clock, reset: fix top-comment indentation rk3576
|
||||||
|
headers
|
||||||
|
|
||||||
|
Block comments should align the * on each line, as checkpatch rightfully
|
||||||
|
pointed out, so fix that style issue on the newly added rk3576 headers.
|
||||||
|
|
||||||
|
Fixes: 49c04453db81 ("dt-bindings: clock, reset: Add support for rk3576")
|
||||||
|
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
|
||||||
|
Link: https://lore.kernel.org/r/20240909223149.85364-1-heiko@sntech.de
|
||||||
|
Signed-off-by: Stephen Boyd <sboyd@kernel.org>
|
||||||
|
---
|
||||||
|
include/dt-bindings/clock/rockchip,rk3576-cru.h | 12 ++++++------
|
||||||
|
include/dt-bindings/reset/rockchip,rk3576-cru.h | 12 ++++++------
|
||||||
|
2 files changed, 12 insertions(+), 12 deletions(-)
|
||||||
|
|
||||||
|
--- a/include/dt-bindings/clock/rockchip,rk3576-cru.h
|
||||||
|
+++ b/include/dt-bindings/clock/rockchip,rk3576-cru.h
|
||||||
|
@@ -1,11 +1,11 @@
|
||||||
|
/* SPDX-License-Identifier: (GPL-2.0 OR MIT) */
|
||||||
|
/*
|
||||||
|
-* Copyright (c) 2023 Rockchip Electronics Co. Ltd.
|
||||||
|
-* Copyright (c) 2024 Collabora Ltd.
|
||||||
|
-*
|
||||||
|
-* Author: Elaine Zhang <zhangqing@rock-chips.com>
|
||||||
|
-* Author: Detlev Casanova <detlev.casanova@collabora.com>
|
||||||
|
-*/
|
||||||
|
+ * Copyright (c) 2023 Rockchip Electronics Co. Ltd.
|
||||||
|
+ * Copyright (c) 2024 Collabora Ltd.
|
||||||
|
+ *
|
||||||
|
+ * Author: Elaine Zhang <zhangqing@rock-chips.com>
|
||||||
|
+ * Author: Detlev Casanova <detlev.casanova@collabora.com>
|
||||||
|
+ */
|
||||||
|
|
||||||
|
#ifndef _DT_BINDINGS_CLK_ROCKCHIP_RK3576_H
|
||||||
|
#define _DT_BINDINGS_CLK_ROCKCHIP_RK3576_H
|
||||||
|
--- a/include/dt-bindings/reset/rockchip,rk3576-cru.h
|
||||||
|
+++ b/include/dt-bindings/reset/rockchip,rk3576-cru.h
|
||||||
|
@@ -1,11 +1,11 @@
|
||||||
|
/* SPDX-License-Identifier: (GPL-2.0 OR MIT) */
|
||||||
|
/*
|
||||||
|
-* Copyright (c) 2023 Rockchip Electronics Co. Ltd.
|
||||||
|
-* Copyright (c) 2024 Collabora Ltd.
|
||||||
|
-*
|
||||||
|
-* Author: Elaine Zhang <zhangqing@rock-chips.com>
|
||||||
|
-* Author: Detlev Casanova <detlev.casanova@collabora.com>
|
||||||
|
-*/
|
||||||
|
+ * Copyright (c) 2023 Rockchip Electronics Co. Ltd.
|
||||||
|
+ * Copyright (c) 2024 Collabora Ltd.
|
||||||
|
+ *
|
||||||
|
+ * Author: Elaine Zhang <zhangqing@rock-chips.com>
|
||||||
|
+ * Author: Detlev Casanova <detlev.casanova@collabora.com>
|
||||||
|
+ */
|
||||||
|
|
||||||
|
#ifndef _DT_BINDINGS_RESET_ROCKCHIP_RK3576_H
|
||||||
|
#define _DT_BINDINGS_RESET_ROCKCHIP_RK3576_H
|
@ -0,0 +1,63 @@
|
|||||||
|
From 77c5e7b623032502ee49fe7e7868eaca6786d7ed Mon Sep 17 00:00:00 2001
|
||||||
|
From: Finley Xiao <finley.xiao@rock-chips.com>
|
||||||
|
Date: Wed, 14 Aug 2024 18:26:41 -0400
|
||||||
|
Subject: [PATCH] dt-bindings: power: Add support for RK3576 SoC
|
||||||
|
|
||||||
|
Define power domain IDs as described in the TRM and add compatible for
|
||||||
|
rockchip,rk3576-power-controller
|
||||||
|
|
||||||
|
Signed-off-by: Finley Xiao <finley.xiao@rock-chips.com>
|
||||||
|
Co-Developed-by: Detlev Casanova <detlev.casanova@collabora.com>
|
||||||
|
Signed-off-by: Detlev Casanova <detlev.casanova@collabora.com>
|
||||||
|
Acked-by: Conor Dooley <conor.dooley@microchip.com>
|
||||||
|
Link: https://lore.kernel.org/r/20240814222824.3170-2-detlev.casanova@collabora.com
|
||||||
|
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
|
||||||
|
---
|
||||||
|
.../power/rockchip,power-controller.yaml | 1 +
|
||||||
|
.../dt-bindings/power/rockchip,rk3576-power.h | 30 +++++++++++++++++++
|
||||||
|
2 files changed, 31 insertions(+)
|
||||||
|
create mode 100644 include/dt-bindings/power/rockchip,rk3576-power.h
|
||||||
|
|
||||||
|
--- a/Documentation/devicetree/bindings/power/rockchip,power-controller.yaml
|
||||||
|
+++ b/Documentation/devicetree/bindings/power/rockchip,power-controller.yaml
|
||||||
|
@@ -41,6 +41,7 @@ properties:
|
||||||
|
- rockchip,rk3368-power-controller
|
||||||
|
- rockchip,rk3399-power-controller
|
||||||
|
- rockchip,rk3568-power-controller
|
||||||
|
+ - rockchip,rk3576-power-controller
|
||||||
|
- rockchip,rk3588-power-controller
|
||||||
|
- rockchip,rv1126-power-controller
|
||||||
|
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/include/dt-bindings/power/rockchip,rk3576-power.h
|
||||||
|
@@ -0,0 +1,30 @@
|
||||||
|
+/* SPDX-License-Identifier: (GPL-2.0 OR MIT) */
|
||||||
|
+#ifndef __DT_BINDINGS_POWER_RK3576_POWER_H__
|
||||||
|
+#define __DT_BINDINGS_POWER_RK3576_POWER_H__
|
||||||
|
+
|
||||||
|
+/* VD_NPU */
|
||||||
|
+#define RK3576_PD_NPU 0
|
||||||
|
+#define RK3576_PD_NPUTOP 1
|
||||||
|
+#define RK3576_PD_NPU0 2
|
||||||
|
+#define RK3576_PD_NPU1 3
|
||||||
|
+
|
||||||
|
+/* VD_GPU */
|
||||||
|
+#define RK3576_PD_GPU 4
|
||||||
|
+
|
||||||
|
+/* VD_LOGIC */
|
||||||
|
+#define RK3576_PD_NVM 5
|
||||||
|
+#define RK3576_PD_SDGMAC 6
|
||||||
|
+#define RK3576_PD_USB 7
|
||||||
|
+#define RK3576_PD_PHP 8
|
||||||
|
+#define RK3576_PD_SUBPHP 9
|
||||||
|
+#define RK3576_PD_AUDIO 10
|
||||||
|
+#define RK3576_PD_VEPU0 11
|
||||||
|
+#define RK3576_PD_VEPU1 12
|
||||||
|
+#define RK3576_PD_VPU 13
|
||||||
|
+#define RK3576_PD_VDEC 14
|
||||||
|
+#define RK3576_PD_VI 15
|
||||||
|
+#define RK3576_PD_VO0 16
|
||||||
|
+#define RK3576_PD_VO1 17
|
||||||
|
+#define RK3576_PD_VOP 18
|
||||||
|
+
|
||||||
|
+#endif
|
@ -0,0 +1,98 @@
|
|||||||
|
From cfee1b50775869de9076d021ea11a8438854dcba Mon Sep 17 00:00:00 2001
|
||||||
|
From: Finley Xiao <finley.xiao@rock-chips.com>
|
||||||
|
Date: Wed, 14 Aug 2024 18:26:42 -0400
|
||||||
|
Subject: [PATCH] pmdomain: rockchip: Add support for RK3576 SoC
|
||||||
|
|
||||||
|
Add configuration for RK3576 SoC and list the power domains.
|
||||||
|
|
||||||
|
Signed-off-by: Finley Xiao <finley.xiao@rock-chips.com>
|
||||||
|
Signed-off-by: Detlev Casanova <detlev.casanova@collabora.com>
|
||||||
|
Reviewed-by: Elaine Zhang<zhangqing@rock-chips.com>
|
||||||
|
Link: https://lore.kernel.org/r/20240814222824.3170-3-detlev.casanova@collabora.com
|
||||||
|
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
|
||||||
|
---
|
||||||
|
drivers/pmdomain/rockchip/pm-domains.c | 45 ++++++++++++++++++++++++++
|
||||||
|
1 file changed, 45 insertions(+)
|
||||||
|
|
||||||
|
--- a/drivers/pmdomain/rockchip/pm-domains.c
|
||||||
|
+++ b/drivers/pmdomain/rockchip/pm-domains.c
|
||||||
|
@@ -31,6 +31,7 @@
|
||||||
|
#include <dt-bindings/power/rk3368-power.h>
|
||||||
|
#include <dt-bindings/power/rk3399-power.h>
|
||||||
|
#include <dt-bindings/power/rk3568-power.h>
|
||||||
|
+#include <dt-bindings/power/rockchip,rk3576-power.h>
|
||||||
|
#include <dt-bindings/power/rk3588-power.h>
|
||||||
|
|
||||||
|
struct rockchip_domain_info {
|
||||||
|
@@ -173,6 +174,9 @@ struct rockchip_pmu {
|
||||||
|
#define DOMAIN_RK3568(name, pwr, req, wakeup) \
|
||||||
|
DOMAIN_M(name, pwr, pwr, req, req, req, wakeup)
|
||||||
|
|
||||||
|
+#define DOMAIN_RK3576(name, p_offset, pwr, status, r_status, r_offset, req, idle, wakeup) \
|
||||||
|
+ DOMAIN_M_O_R(name, p_offset, pwr, status, 0, r_status, r_status, r_offset, req, idle, idle, wakeup)
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* Dynamic Memory Controller may need to coordinate with us -- see
|
||||||
|
* rockchip_pmu_block().
|
||||||
|
@@ -1111,6 +1115,28 @@ static const struct rockchip_domain_info
|
||||||
|
[RK3568_PD_PIPE] = DOMAIN_RK3568("pipe", BIT(8), BIT(11), false),
|
||||||
|
};
|
||||||
|
|
||||||
|
+static const struct rockchip_domain_info rk3576_pm_domains[] = {
|
||||||
|
+ [RK3576_PD_NPU] = DOMAIN_RK3576("npu", 0x0, BIT(0), BIT(0), 0, 0x0, 0, 0, false),
|
||||||
|
+ [RK3576_PD_NVM] = DOMAIN_RK3576("nvm", 0x0, BIT(6), 0, BIT(6), 0x4, BIT(2), BIT(18), false),
|
||||||
|
+ [RK3576_PD_SDGMAC] = DOMAIN_RK3576("sdgmac", 0x0, BIT(7), 0, BIT(7), 0x4, BIT(1), BIT(17), false),
|
||||||
|
+ [RK3576_PD_AUDIO] = DOMAIN_RK3576("audio", 0x0, BIT(8), 0, BIT(8), 0x4, BIT(0), BIT(16), false),
|
||||||
|
+ [RK3576_PD_PHP] = DOMAIN_RK3576("php", 0x0, BIT(9), 0, BIT(9), 0x0, BIT(15), BIT(15), false),
|
||||||
|
+ [RK3576_PD_SUBPHP] = DOMAIN_RK3576("subphp", 0x0, BIT(10), 0, BIT(10), 0x0, 0, 0, false),
|
||||||
|
+ [RK3576_PD_VOP] = DOMAIN_RK3576("vop", 0x0, BIT(11), 0, BIT(11), 0x0, 0x6000, 0x6000, false),
|
||||||
|
+ [RK3576_PD_VO1] = DOMAIN_RK3576("vo1", 0x0, BIT(14), 0, BIT(14), 0x0, BIT(12), BIT(12), false),
|
||||||
|
+ [RK3576_PD_VO0] = DOMAIN_RK3576("vo0", 0x0, BIT(15), 0, BIT(15), 0x0, BIT(11), BIT(11), false),
|
||||||
|
+ [RK3576_PD_USB] = DOMAIN_RK3576("usb", 0x4, BIT(0), 0, BIT(16), 0x0, BIT(10), BIT(10), true),
|
||||||
|
+ [RK3576_PD_VI] = DOMAIN_RK3576("vi", 0x4, BIT(1), 0, BIT(17), 0x0, BIT(9), BIT(9), false),
|
||||||
|
+ [RK3576_PD_VEPU0] = DOMAIN_RK3576("vepu0", 0x4, BIT(2), 0, BIT(18), 0x0, BIT(7), BIT(7), false),
|
||||||
|
+ [RK3576_PD_VEPU1] = DOMAIN_RK3576("vepu1", 0x4, BIT(3), 0, BIT(19), 0x0, BIT(8), BIT(8), false),
|
||||||
|
+ [RK3576_PD_VDEC] = DOMAIN_RK3576("vdec", 0x4, BIT(4), 0, BIT(20), 0x0, BIT(6), BIT(6), false),
|
||||||
|
+ [RK3576_PD_VPU] = DOMAIN_RK3576("vpu", 0x4, BIT(5), 0, BIT(21), 0x0, BIT(5), BIT(5), false),
|
||||||
|
+ [RK3576_PD_NPUTOP] = DOMAIN_RK3576("nputop", 0x4, BIT(6), 0, BIT(22), 0x0, 0x18, 0x18, false),
|
||||||
|
+ [RK3576_PD_NPU0] = DOMAIN_RK3576("npu0", 0x4, BIT(7), 0, BIT(23), 0x0, BIT(1), BIT(1), false),
|
||||||
|
+ [RK3576_PD_NPU1] = DOMAIN_RK3576("npu1", 0x4, BIT(8), 0, BIT(24), 0x0, BIT(2), BIT(2), false),
|
||||||
|
+ [RK3576_PD_GPU] = DOMAIN_RK3576("gpu", 0x4, BIT(9), 0, BIT(25), 0x0, BIT(0), BIT(0), false),
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
static const struct rockchip_domain_info rk3588_pm_domains[] = {
|
||||||
|
[RK3588_PD_GPU] = DOMAIN_RK3588("gpu", 0x0, BIT(0), 0, 0x0, 0, BIT(1), 0x0, BIT(0), BIT(0), false),
|
||||||
|
[RK3588_PD_NPU] = DOMAIN_RK3588("npu", 0x0, BIT(1), BIT(1), 0x0, 0, 0, 0x0, 0, 0, false),
|
||||||
|
@@ -1289,6 +1315,21 @@ static const struct rockchip_pmu_info rk
|
||||||
|
.domain_info = rk3568_pm_domains,
|
||||||
|
};
|
||||||
|
|
||||||
|
+static const struct rockchip_pmu_info rk3576_pmu = {
|
||||||
|
+ .pwr_offset = 0x210,
|
||||||
|
+ .status_offset = 0x230,
|
||||||
|
+ .chain_status_offset = 0x248,
|
||||||
|
+ .mem_status_offset = 0x250,
|
||||||
|
+ .mem_pwr_offset = 0x300,
|
||||||
|
+ .req_offset = 0x110,
|
||||||
|
+ .idle_offset = 0x128,
|
||||||
|
+ .ack_offset = 0x120,
|
||||||
|
+ .repair_status_offset = 0x570,
|
||||||
|
+
|
||||||
|
+ .num_domains = ARRAY_SIZE(rk3576_pm_domains),
|
||||||
|
+ .domain_info = rk3576_pm_domains,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
static const struct rockchip_pmu_info rk3588_pmu = {
|
||||||
|
.pwr_offset = 0x14c,
|
||||||
|
.status_offset = 0x180,
|
||||||
|
@@ -1365,6 +1406,10 @@ static const struct of_device_id rockchi
|
||||||
|
.data = (void *)&rk3568_pmu,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
+ .compatible = "rockchip,rk3576-power-controller",
|
||||||
|
+ .data = (void *)&rk3576_pmu,
|
||||||
|
+ },
|
||||||
|
+ {
|
||||||
|
.compatible = "rockchip,rk3588-power-controller",
|
||||||
|
.data = (void *)&rk3588_pmu,
|
||||||
|
},
|
@ -0,0 +1,80 @@
|
|||||||
|
From 8b579881de295d49a75f6312547f7813b1551a83 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Detlev Casanova <detlev.casanova@collabora.com>
|
||||||
|
Date: Thu, 29 Aug 2024 16:20:47 -0400
|
||||||
|
Subject: [PATCH] pmdomain: rockchip: Add gating support
|
||||||
|
|
||||||
|
Some rockchip SoC need to ungate power domains before their power status
|
||||||
|
can be changed.
|
||||||
|
|
||||||
|
Each power domain has a gate mask that is set to 1 to ungate it when
|
||||||
|
manipulating power status, then set back to 0 to gate it again.
|
||||||
|
|
||||||
|
Signed-off-by: Detlev Casanova <detlev.casanova@collabora.com>
|
||||||
|
Link: https://lore.kernel.org/r/20240829202732.75961-2-detlev.casanova@collabora.com
|
||||||
|
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
|
||||||
|
---
|
||||||
|
drivers/pmdomain/rockchip/pm-domains.c | 25 +++++++++++++++++++++++++
|
||||||
|
1 file changed, 25 insertions(+)
|
||||||
|
|
||||||
|
--- a/drivers/pmdomain/rockchip/pm-domains.c
|
||||||
|
+++ b/drivers/pmdomain/rockchip/pm-domains.c
|
||||||
|
@@ -44,6 +44,7 @@ struct rockchip_domain_info {
|
||||||
|
bool active_wakeup;
|
||||||
|
int pwr_w_mask;
|
||||||
|
int req_w_mask;
|
||||||
|
+ int clk_ungate_mask;
|
||||||
|
int mem_status_mask;
|
||||||
|
int repair_status_mask;
|
||||||
|
u32 pwr_offset;
|
||||||
|
@@ -61,6 +62,7 @@ struct rockchip_pmu_info {
|
||||||
|
u32 chain_status_offset;
|
||||||
|
u32 mem_status_offset;
|
||||||
|
u32 repair_status_offset;
|
||||||
|
+ u32 clk_ungate_offset;
|
||||||
|
|
||||||
|
u32 core_pwrcnt_offset;
|
||||||
|
u32 gpu_pwrcnt_offset;
|
||||||
|
@@ -301,6 +303,26 @@ static unsigned int rockchip_pmu_read_ac
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static int rockchip_pmu_ungate_clk(struct rockchip_pm_domain *pd, bool ungate)
|
||||||
|
+{
|
||||||
|
+ const struct rockchip_domain_info *pd_info = pd->info;
|
||||||
|
+ struct rockchip_pmu *pmu = pd->pmu;
|
||||||
|
+ unsigned int val;
|
||||||
|
+ int clk_ungate_w_mask = pd_info->clk_ungate_mask << 16;
|
||||||
|
+
|
||||||
|
+ if (!pd_info->clk_ungate_mask)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ if (!pmu->info->clk_ungate_offset)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ val = ungate ? (pd_info->clk_ungate_mask | clk_ungate_w_mask) :
|
||||||
|
+ clk_ungate_w_mask;
|
||||||
|
+ regmap_write(pmu->regmap, pmu->info->clk_ungate_offset, val);
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static int rockchip_pmu_set_idle_request(struct rockchip_pm_domain *pd,
|
||||||
|
bool idle)
|
||||||
|
{
|
||||||
|
@@ -541,6 +563,8 @@ static int rockchip_pd_power(struct rock
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ rockchip_pmu_ungate_clk(pd, true);
|
||||||
|
+
|
||||||
|
if (!power_on) {
|
||||||
|
rockchip_pmu_save_qos(pd);
|
||||||
|
|
||||||
|
@@ -557,6 +581,7 @@ static int rockchip_pd_power(struct rock
|
||||||
|
rockchip_pmu_restore_qos(pd);
|
||||||
|
}
|
||||||
|
|
||||||
|
+ rockchip_pmu_ungate_clk(pd, false);
|
||||||
|
clk_bulk_disable(pd->num_clks, pd->clks);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,109 @@
|
|||||||
|
From d030e94d8127d79d941a94211250060431720614 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Detlev Casanova <detlev.casanova@collabora.com>
|
||||||
|
Date: Thu, 29 Aug 2024 16:20:48 -0400
|
||||||
|
Subject: [PATCH] pmdomain: rockchip: Add gating masks for rk3576
|
||||||
|
|
||||||
|
The RK3576 SoC needs to ungate the power domains before their status can
|
||||||
|
be modified.
|
||||||
|
|
||||||
|
The values have been taken from the rockchip downstream driver.
|
||||||
|
|
||||||
|
Signed-off-by: Detlev Casanova <detlev.casanova@collabora.com>
|
||||||
|
Link: https://lore.kernel.org/r/20240829202732.75961-3-detlev.casanova@collabora.com
|
||||||
|
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
|
||||||
|
---
|
||||||
|
drivers/pmdomain/rockchip/pm-domains.c | 62 +++++++++++++++++---------
|
||||||
|
1 file changed, 41 insertions(+), 21 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/pmdomain/rockchip/pm-domains.c
|
||||||
|
+++ b/drivers/pmdomain/rockchip/pm-domains.c
|
||||||
|
@@ -145,6 +145,25 @@ struct rockchip_pmu {
|
||||||
|
.active_wakeup = wakeup, \
|
||||||
|
}
|
||||||
|
|
||||||
|
+#define DOMAIN_M_O_R_G(_name, p_offset, pwr, status, m_offset, m_status, r_status, r_offset, req, idle, ack, g_mask, wakeup) \
|
||||||
|
+{ \
|
||||||
|
+ .name = _name, \
|
||||||
|
+ .pwr_offset = p_offset, \
|
||||||
|
+ .pwr_w_mask = (pwr) << 16, \
|
||||||
|
+ .pwr_mask = (pwr), \
|
||||||
|
+ .status_mask = (status), \
|
||||||
|
+ .mem_offset = m_offset, \
|
||||||
|
+ .mem_status_mask = (m_status), \
|
||||||
|
+ .repair_status_mask = (r_status), \
|
||||||
|
+ .req_offset = r_offset, \
|
||||||
|
+ .req_w_mask = (req) << 16, \
|
||||||
|
+ .req_mask = (req), \
|
||||||
|
+ .idle_mask = (idle), \
|
||||||
|
+ .clk_ungate_mask = (g_mask), \
|
||||||
|
+ .ack_mask = (ack), \
|
||||||
|
+ .active_wakeup = wakeup, \
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
#define DOMAIN_RK3036(_name, req, ack, idle, wakeup) \
|
||||||
|
{ \
|
||||||
|
.name = _name, \
|
||||||
|
@@ -176,8 +195,8 @@ struct rockchip_pmu {
|
||||||
|
#define DOMAIN_RK3568(name, pwr, req, wakeup) \
|
||||||
|
DOMAIN_M(name, pwr, pwr, req, req, req, wakeup)
|
||||||
|
|
||||||
|
-#define DOMAIN_RK3576(name, p_offset, pwr, status, r_status, r_offset, req, idle, wakeup) \
|
||||||
|
- DOMAIN_M_O_R(name, p_offset, pwr, status, 0, r_status, r_status, r_offset, req, idle, idle, wakeup)
|
||||||
|
+#define DOMAIN_RK3576(name, p_offset, pwr, status, r_status, r_offset, req, idle, g_mask, wakeup) \
|
||||||
|
+ DOMAIN_M_O_R_G(name, p_offset, pwr, status, 0, r_status, r_status, r_offset, req, idle, idle, g_mask, wakeup)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Dynamic Memory Controller may need to coordinate with us -- see
|
||||||
|
@@ -1141,25 +1160,25 @@ static const struct rockchip_domain_info
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct rockchip_domain_info rk3576_pm_domains[] = {
|
||||||
|
- [RK3576_PD_NPU] = DOMAIN_RK3576("npu", 0x0, BIT(0), BIT(0), 0, 0x0, 0, 0, false),
|
||||||
|
- [RK3576_PD_NVM] = DOMAIN_RK3576("nvm", 0x0, BIT(6), 0, BIT(6), 0x4, BIT(2), BIT(18), false),
|
||||||
|
- [RK3576_PD_SDGMAC] = DOMAIN_RK3576("sdgmac", 0x0, BIT(7), 0, BIT(7), 0x4, BIT(1), BIT(17), false),
|
||||||
|
- [RK3576_PD_AUDIO] = DOMAIN_RK3576("audio", 0x0, BIT(8), 0, BIT(8), 0x4, BIT(0), BIT(16), false),
|
||||||
|
- [RK3576_PD_PHP] = DOMAIN_RK3576("php", 0x0, BIT(9), 0, BIT(9), 0x0, BIT(15), BIT(15), false),
|
||||||
|
- [RK3576_PD_SUBPHP] = DOMAIN_RK3576("subphp", 0x0, BIT(10), 0, BIT(10), 0x0, 0, 0, false),
|
||||||
|
- [RK3576_PD_VOP] = DOMAIN_RK3576("vop", 0x0, BIT(11), 0, BIT(11), 0x0, 0x6000, 0x6000, false),
|
||||||
|
- [RK3576_PD_VO1] = DOMAIN_RK3576("vo1", 0x0, BIT(14), 0, BIT(14), 0x0, BIT(12), BIT(12), false),
|
||||||
|
- [RK3576_PD_VO0] = DOMAIN_RK3576("vo0", 0x0, BIT(15), 0, BIT(15), 0x0, BIT(11), BIT(11), false),
|
||||||
|
- [RK3576_PD_USB] = DOMAIN_RK3576("usb", 0x4, BIT(0), 0, BIT(16), 0x0, BIT(10), BIT(10), true),
|
||||||
|
- [RK3576_PD_VI] = DOMAIN_RK3576("vi", 0x4, BIT(1), 0, BIT(17), 0x0, BIT(9), BIT(9), false),
|
||||||
|
- [RK3576_PD_VEPU0] = DOMAIN_RK3576("vepu0", 0x4, BIT(2), 0, BIT(18), 0x0, BIT(7), BIT(7), false),
|
||||||
|
- [RK3576_PD_VEPU1] = DOMAIN_RK3576("vepu1", 0x4, BIT(3), 0, BIT(19), 0x0, BIT(8), BIT(8), false),
|
||||||
|
- [RK3576_PD_VDEC] = DOMAIN_RK3576("vdec", 0x4, BIT(4), 0, BIT(20), 0x0, BIT(6), BIT(6), false),
|
||||||
|
- [RK3576_PD_VPU] = DOMAIN_RK3576("vpu", 0x4, BIT(5), 0, BIT(21), 0x0, BIT(5), BIT(5), false),
|
||||||
|
- [RK3576_PD_NPUTOP] = DOMAIN_RK3576("nputop", 0x4, BIT(6), 0, BIT(22), 0x0, 0x18, 0x18, false),
|
||||||
|
- [RK3576_PD_NPU0] = DOMAIN_RK3576("npu0", 0x4, BIT(7), 0, BIT(23), 0x0, BIT(1), BIT(1), false),
|
||||||
|
- [RK3576_PD_NPU1] = DOMAIN_RK3576("npu1", 0x4, BIT(8), 0, BIT(24), 0x0, BIT(2), BIT(2), false),
|
||||||
|
- [RK3576_PD_GPU] = DOMAIN_RK3576("gpu", 0x4, BIT(9), 0, BIT(25), 0x0, BIT(0), BIT(0), false),
|
||||||
|
+ [RK3576_PD_NPU] = DOMAIN_RK3576("npu", 0x0, BIT(0), BIT(0), 0, 0x0, 0, 0, 0, false),
|
||||||
|
+ [RK3576_PD_NVM] = DOMAIN_RK3576("nvm", 0x0, BIT(6), 0, BIT(6), 0x4, BIT(2), BIT(18), BIT(2), false),
|
||||||
|
+ [RK3576_PD_SDGMAC] = DOMAIN_RK3576("sdgmac", 0x0, BIT(7), 0, BIT(7), 0x4, BIT(1), BIT(17), 0x6, false),
|
||||||
|
+ [RK3576_PD_AUDIO] = DOMAIN_RK3576("audio", 0x0, BIT(8), 0, BIT(8), 0x4, BIT(0), BIT(16), BIT(0), false),
|
||||||
|
+ [RK3576_PD_PHP] = DOMAIN_RK3576("php", 0x0, BIT(9), 0, BIT(9), 0x0, BIT(15), BIT(15), BIT(15), false),
|
||||||
|
+ [RK3576_PD_SUBPHP] = DOMAIN_RK3576("subphp", 0x0, BIT(10), 0, BIT(10), 0x0, 0, 0, 0, false),
|
||||||
|
+ [RK3576_PD_VOP] = DOMAIN_RK3576("vop", 0x0, BIT(11), 0, BIT(11), 0x0, 0x6000, 0x6000, 0x6000, false),
|
||||||
|
+ [RK3576_PD_VO1] = DOMAIN_RK3576("vo1", 0x0, BIT(14), 0, BIT(14), 0x0, BIT(12), BIT(12), 0x7000, false),
|
||||||
|
+ [RK3576_PD_VO0] = DOMAIN_RK3576("vo0", 0x0, BIT(15), 0, BIT(15), 0x0, BIT(11), BIT(11), 0x6800, false),
|
||||||
|
+ [RK3576_PD_USB] = DOMAIN_RK3576("usb", 0x4, BIT(0), 0, BIT(16), 0x0, BIT(10), BIT(10), 0x6400, true),
|
||||||
|
+ [RK3576_PD_VI] = DOMAIN_RK3576("vi", 0x4, BIT(1), 0, BIT(17), 0x0, BIT(9), BIT(9), BIT(9), false),
|
||||||
|
+ [RK3576_PD_VEPU0] = DOMAIN_RK3576("vepu0", 0x4, BIT(2), 0, BIT(18), 0x0, BIT(7), BIT(7), 0x280, false),
|
||||||
|
+ [RK3576_PD_VEPU1] = DOMAIN_RK3576("vepu1", 0x4, BIT(3), 0, BIT(19), 0x0, BIT(8), BIT(8), BIT(8), false),
|
||||||
|
+ [RK3576_PD_VDEC] = DOMAIN_RK3576("vdec", 0x4, BIT(4), 0, BIT(20), 0x0, BIT(6), BIT(6), BIT(6), false),
|
||||||
|
+ [RK3576_PD_VPU] = DOMAIN_RK3576("vpu", 0x4, BIT(5), 0, BIT(21), 0x0, BIT(5), BIT(5), BIT(5), false),
|
||||||
|
+ [RK3576_PD_NPUTOP] = DOMAIN_RK3576("nputop", 0x4, BIT(6), 0, BIT(22), 0x0, 0x18, 0x18, 0x18, false),
|
||||||
|
+ [RK3576_PD_NPU0] = DOMAIN_RK3576("npu0", 0x4, BIT(7), 0, BIT(23), 0x0, BIT(1), BIT(1), 0x1a, false),
|
||||||
|
+ [RK3576_PD_NPU1] = DOMAIN_RK3576("npu1", 0x4, BIT(8), 0, BIT(24), 0x0, BIT(2), BIT(2), 0x1c, false),
|
||||||
|
+ [RK3576_PD_GPU] = DOMAIN_RK3576("gpu", 0x4, BIT(9), 0, BIT(25), 0x0, BIT(0), BIT(0), BIT(0), false),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct rockchip_domain_info rk3588_pm_domains[] = {
|
||||||
|
@@ -1350,6 +1369,7 @@ static const struct rockchip_pmu_info rk
|
||||||
|
.idle_offset = 0x128,
|
||||||
|
.ack_offset = 0x120,
|
||||||
|
.repair_status_offset = 0x570,
|
||||||
|
+ .clk_ungate_offset = 0x140,
|
||||||
|
|
||||||
|
.num_domains = ARRAY_SIZE(rk3576_pm_domains),
|
||||||
|
.domain_info = rk3576_pm_domains,
|
@ -0,0 +1,119 @@
|
|||||||
|
From 86e2ed4e9a9680013ec9ab7c0428c9b8c5108efe Mon Sep 17 00:00:00 2001
|
||||||
|
From: Frank Wang <frank.wang@rock-chips.com>
|
||||||
|
Date: Wed, 16 Oct 2024 15:37:10 +0800
|
||||||
|
Subject: [PATCH] phy: rockchip: inno-usb2: convert clock management to bulk
|
||||||
|
|
||||||
|
Since some Rockchip SoCs (e.g RK3576) have more than one clock,
|
||||||
|
this converts the clock management from single to bulk method to
|
||||||
|
make the driver more flexible.
|
||||||
|
|
||||||
|
Signed-off-by: Frank Wang <frank.wang@rock-chips.com>
|
||||||
|
Reviewed-by: Heiko Stuebner <heiko@sntech.de>
|
||||||
|
Link: https://lore.kernel.org/r/20241016073713.14133-1-frawang.cn@gmail.com
|
||||||
|
Signed-off-by: Vinod Koul <vkoul@kernel.org>
|
||||||
|
---
|
||||||
|
drivers/phy/rockchip/phy-rockchip-inno-usb2.c | 45 +++++++++++++++----
|
||||||
|
1 file changed, 37 insertions(+), 8 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/phy/rockchip/phy-rockchip-inno-usb2.c
|
||||||
|
+++ b/drivers/phy/rockchip/phy-rockchip-inno-usb2.c
|
||||||
|
@@ -225,9 +225,10 @@ struct rockchip_usb2phy_port {
|
||||||
|
* @dev: pointer to device.
|
||||||
|
* @grf: General Register Files regmap.
|
||||||
|
* @usbgrf: USB General Register Files regmap.
|
||||||
|
- * @clk: clock struct of phy input clk.
|
||||||
|
+ * @clks: array of phy input clocks.
|
||||||
|
* @clk480m: clock struct of phy output clk.
|
||||||
|
* @clk480m_hw: clock struct of phy output clk management.
|
||||||
|
+ * @num_clks: number of phy input clocks.
|
||||||
|
* @phy_reset: phy reset control.
|
||||||
|
* @chg_state: states involved in USB charger detection.
|
||||||
|
* @chg_type: USB charger types.
|
||||||
|
@@ -242,9 +243,10 @@ struct rockchip_usb2phy {
|
||||||
|
struct device *dev;
|
||||||
|
struct regmap *grf;
|
||||||
|
struct regmap *usbgrf;
|
||||||
|
- struct clk *clk;
|
||||||
|
+ struct clk_bulk_data *clks;
|
||||||
|
struct clk *clk480m;
|
||||||
|
struct clk_hw clk480m_hw;
|
||||||
|
+ int num_clks;
|
||||||
|
struct reset_control *phy_reset;
|
||||||
|
enum usb_chg_state chg_state;
|
||||||
|
enum power_supply_type chg_type;
|
||||||
|
@@ -306,6 +308,13 @@ static int rockchip_usb2phy_reset(struct
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void rockchip_usb2phy_clk_bulk_disable(void *data)
|
||||||
|
+{
|
||||||
|
+ struct rockchip_usb2phy *rphy = data;
|
||||||
|
+
|
||||||
|
+ clk_bulk_disable_unprepare(rphy->num_clks, rphy->clks);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static int rockchip_usb2phy_clk480m_prepare(struct clk_hw *hw)
|
||||||
|
{
|
||||||
|
struct rockchip_usb2phy *rphy =
|
||||||
|
@@ -372,7 +381,9 @@ rockchip_usb2phy_clk480m_register(struct
|
||||||
|
{
|
||||||
|
struct device_node *node = rphy->dev->of_node;
|
||||||
|
struct clk_init_data init;
|
||||||
|
+ struct clk *refclk = NULL;
|
||||||
|
const char *clk_name;
|
||||||
|
+ int i;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
init.flags = 0;
|
||||||
|
@@ -382,8 +393,15 @@ rockchip_usb2phy_clk480m_register(struct
|
||||||
|
/* optional override of the clockname */
|
||||||
|
of_property_read_string(node, "clock-output-names", &init.name);
|
||||||
|
|
||||||
|
- if (rphy->clk) {
|
||||||
|
- clk_name = __clk_get_name(rphy->clk);
|
||||||
|
+ for (i = 0; i < rphy->num_clks; i++) {
|
||||||
|
+ if (!strncmp(rphy->clks[i].id, "phyclk", 6)) {
|
||||||
|
+ refclk = rphy->clks[i].clk;
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (!IS_ERR(refclk)) {
|
||||||
|
+ clk_name = __clk_get_name(refclk);
|
||||||
|
init.parent_names = &clk_name;
|
||||||
|
init.num_parents = 1;
|
||||||
|
} else {
|
||||||
|
@@ -1385,11 +1403,13 @@ static int rockchip_usb2phy_probe(struct
|
||||||
|
if (IS_ERR(rphy->phy_reset))
|
||||||
|
return PTR_ERR(rphy->phy_reset);
|
||||||
|
|
||||||
|
- rphy->clk = devm_clk_get_optional_enabled(dev, "phyclk");
|
||||||
|
- if (IS_ERR(rphy->clk)) {
|
||||||
|
- return dev_err_probe(&pdev->dev, PTR_ERR(rphy->clk),
|
||||||
|
- "failed to get phyclk\n");
|
||||||
|
- }
|
||||||
|
+ ret = devm_clk_bulk_get_all(dev, &rphy->clks);
|
||||||
|
+ if (ret == -EPROBE_DEFER)
|
||||||
|
+ return dev_err_probe(&pdev->dev, -EPROBE_DEFER,
|
||||||
|
+ "failed to get phy clock\n");
|
||||||
|
+
|
||||||
|
+ /* Clocks are optional */
|
||||||
|
+ rphy->num_clks = ret < 0 ? 0 : ret;
|
||||||
|
|
||||||
|
ret = rockchip_usb2phy_clk480m_register(rphy);
|
||||||
|
if (ret) {
|
||||||
|
@@ -1397,6 +1417,14 @@ static int rockchip_usb2phy_probe(struct
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ ret = clk_bulk_prepare_enable(rphy->num_clks, rphy->clks);
|
||||||
|
+ if (ret)
|
||||||
|
+ return dev_err_probe(dev, ret, "failed to enable phy clock\n");
|
||||||
|
+
|
||||||
|
+ ret = devm_add_action_or_reset(dev, rockchip_usb2phy_clk_bulk_disable, rphy);
|
||||||
|
+ if (ret)
|
||||||
|
+ return ret;
|
||||||
|
+
|
||||||
|
if (rphy->phy_cfg->phy_tuning) {
|
||||||
|
ret = rphy->phy_cfg->phy_tuning(rphy);
|
||||||
|
if (ret)
|
@ -0,0 +1,143 @@
|
|||||||
|
From 3d7de6e870ece5a32153382df9df6fb87613335e Mon Sep 17 00:00:00 2001
|
||||||
|
From: William Wu <william.wu@rock-chips.com>
|
||||||
|
Date: Wed, 16 Oct 2024 15:37:13 +0800
|
||||||
|
Subject: [PATCH] phy: rockchip: inno-usb2: Add usb2 phys support for rk3576
|
||||||
|
|
||||||
|
The RK3576 SoC has two independent USB2.0 PHYs, and each PHY has
|
||||||
|
one port. This adds device specific data for it.
|
||||||
|
|
||||||
|
Signed-off-by: William Wu <william.wu@rock-chips.com>
|
||||||
|
Signed-off-by: Frank Wang <frank.wang@rock-chips.com>
|
||||||
|
Reviewed-by: Heiko Stuebner <heiko@sntech.de>
|
||||||
|
Link: https://lore.kernel.org/r/20241016073713.14133-4-frawang.cn@gmail.com
|
||||||
|
Signed-off-by: Vinod Koul <vkoul@kernel.org>
|
||||||
|
---
|
||||||
|
drivers/phy/rockchip/phy-rockchip-inno-usb2.c | 103 ++++++++++++++++++
|
||||||
|
1 file changed, 103 insertions(+)
|
||||||
|
|
||||||
|
--- a/drivers/phy/rockchip/phy-rockchip-inno-usb2.c
|
||||||
|
+++ b/drivers/phy/rockchip/phy-rockchip-inno-usb2.c
|
||||||
|
@@ -1494,6 +1494,30 @@ put_child:
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static int rk3576_usb2phy_tuning(struct rockchip_usb2phy *rphy)
|
||||||
|
+{
|
||||||
|
+ int ret;
|
||||||
|
+ u32 reg = rphy->phy_cfg->reg;
|
||||||
|
+
|
||||||
|
+ /* Deassert SIDDQ to power on analog block */
|
||||||
|
+ ret = regmap_write(rphy->grf, reg + 0x0010, GENMASK(29, 29) | 0x0000);
|
||||||
|
+ if (ret)
|
||||||
|
+ return ret;
|
||||||
|
+
|
||||||
|
+ /* Do reset after exit IDDQ mode */
|
||||||
|
+ ret = rockchip_usb2phy_reset(rphy);
|
||||||
|
+ if (ret)
|
||||||
|
+ return ret;
|
||||||
|
+
|
||||||
|
+ /* HS DC Voltage Level Adjustment 4'b1001 : +5.89% */
|
||||||
|
+ ret |= regmap_write(rphy->grf, reg + 0x000c, GENMASK(27, 24) | 0x0900);
|
||||||
|
+
|
||||||
|
+ /* HS Transmitter Pre-Emphasis Current Control 2'b10 : 2x */
|
||||||
|
+ ret |= regmap_write(rphy->grf, reg + 0x0010, GENMASK(20, 19) | 0x0010);
|
||||||
|
+
|
||||||
|
+ return ret;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static int rk3588_usb2phy_tuning(struct rockchip_usb2phy *rphy)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
@@ -1856,6 +1880,84 @@ static const struct rockchip_usb2phy_cfg
|
||||||
|
{ /* sentinel */ }
|
||||||
|
};
|
||||||
|
|
||||||
|
+static const struct rockchip_usb2phy_cfg rk3576_phy_cfgs[] = {
|
||||||
|
+ {
|
||||||
|
+ .reg = 0x0,
|
||||||
|
+ .num_ports = 1,
|
||||||
|
+ .phy_tuning = rk3576_usb2phy_tuning,
|
||||||
|
+ .clkout_ctl = { 0x0008, 0, 0, 1, 0 },
|
||||||
|
+ .port_cfgs = {
|
||||||
|
+ [USB2PHY_PORT_OTG] = {
|
||||||
|
+ .phy_sus = { 0x0000, 8, 0, 0, 0x1d1 },
|
||||||
|
+ .bvalid_det_en = { 0x00c0, 1, 1, 0, 1 },
|
||||||
|
+ .bvalid_det_st = { 0x00c4, 1, 1, 0, 1 },
|
||||||
|
+ .bvalid_det_clr = { 0x00c8, 1, 1, 0, 1 },
|
||||||
|
+ .ls_det_en = { 0x00c0, 0, 0, 0, 1 },
|
||||||
|
+ .ls_det_st = { 0x00c4, 0, 0, 0, 1 },
|
||||||
|
+ .ls_det_clr = { 0x00c8, 0, 0, 0, 1 },
|
||||||
|
+ .disfall_en = { 0x00c0, 6, 6, 0, 1 },
|
||||||
|
+ .disfall_st = { 0x00c4, 6, 6, 0, 1 },
|
||||||
|
+ .disfall_clr = { 0x00c8, 6, 6, 0, 1 },
|
||||||
|
+ .disrise_en = { 0x00c0, 5, 5, 0, 1 },
|
||||||
|
+ .disrise_st = { 0x00c4, 5, 5, 0, 1 },
|
||||||
|
+ .disrise_clr = { 0x00c8, 5, 5, 0, 1 },
|
||||||
|
+ .utmi_avalid = { 0x0080, 1, 1, 0, 1 },
|
||||||
|
+ .utmi_bvalid = { 0x0080, 0, 0, 0, 1 },
|
||||||
|
+ .utmi_ls = { 0x0080, 5, 4, 0, 1 },
|
||||||
|
+ }
|
||||||
|
+ },
|
||||||
|
+ .chg_det = {
|
||||||
|
+ .cp_det = { 0x0080, 8, 8, 0, 1 },
|
||||||
|
+ .dcp_det = { 0x0080, 8, 8, 0, 1 },
|
||||||
|
+ .dp_det = { 0x0080, 9, 9, 1, 0 },
|
||||||
|
+ .idm_sink_en = { 0x0010, 5, 5, 1, 0 },
|
||||||
|
+ .idp_sink_en = { 0x0010, 5, 5, 0, 1 },
|
||||||
|
+ .idp_src_en = { 0x0010, 14, 14, 0, 1 },
|
||||||
|
+ .rdm_pdwn_en = { 0x0010, 14, 14, 0, 1 },
|
||||||
|
+ .vdm_src_en = { 0x0010, 7, 6, 0, 3 },
|
||||||
|
+ .vdp_src_en = { 0x0010, 7, 6, 0, 3 },
|
||||||
|
+ },
|
||||||
|
+ },
|
||||||
|
+ {
|
||||||
|
+ .reg = 0x2000,
|
||||||
|
+ .num_ports = 1,
|
||||||
|
+ .phy_tuning = rk3576_usb2phy_tuning,
|
||||||
|
+ .clkout_ctl = { 0x2008, 0, 0, 1, 0 },
|
||||||
|
+ .port_cfgs = {
|
||||||
|
+ [USB2PHY_PORT_OTG] = {
|
||||||
|
+ .phy_sus = { 0x2000, 8, 0, 0, 0x1d1 },
|
||||||
|
+ .bvalid_det_en = { 0x20c0, 1, 1, 0, 1 },
|
||||||
|
+ .bvalid_det_st = { 0x20c4, 1, 1, 0, 1 },
|
||||||
|
+ .bvalid_det_clr = { 0x20c8, 1, 1, 0, 1 },
|
||||||
|
+ .ls_det_en = { 0x20c0, 0, 0, 0, 1 },
|
||||||
|
+ .ls_det_st = { 0x20c4, 0, 0, 0, 1 },
|
||||||
|
+ .ls_det_clr = { 0x20c8, 0, 0, 0, 1 },
|
||||||
|
+ .disfall_en = { 0x20c0, 6, 6, 0, 1 },
|
||||||
|
+ .disfall_st = { 0x20c4, 6, 6, 0, 1 },
|
||||||
|
+ .disfall_clr = { 0x20c8, 6, 6, 0, 1 },
|
||||||
|
+ .disrise_en = { 0x20c0, 5, 5, 0, 1 },
|
||||||
|
+ .disrise_st = { 0x20c4, 5, 5, 0, 1 },
|
||||||
|
+ .disrise_clr = { 0x20c8, 5, 5, 0, 1 },
|
||||||
|
+ .utmi_avalid = { 0x2080, 1, 1, 0, 1 },
|
||||||
|
+ .utmi_bvalid = { 0x2080, 0, 0, 0, 1 },
|
||||||
|
+ .utmi_ls = { 0x2080, 5, 4, 0, 1 },
|
||||||
|
+ }
|
||||||
|
+ },
|
||||||
|
+ .chg_det = {
|
||||||
|
+ .cp_det = { 0x2080, 8, 8, 0, 1 },
|
||||||
|
+ .dcp_det = { 0x2080, 8, 8, 0, 1 },
|
||||||
|
+ .dp_det = { 0x2080, 9, 9, 1, 0 },
|
||||||
|
+ .idm_sink_en = { 0x2010, 5, 5, 1, 0 },
|
||||||
|
+ .idp_sink_en = { 0x2010, 5, 5, 0, 1 },
|
||||||
|
+ .idp_src_en = { 0x2010, 14, 14, 0, 1 },
|
||||||
|
+ .rdm_pdwn_en = { 0x2010, 14, 14, 0, 1 },
|
||||||
|
+ .vdm_src_en = { 0x2010, 7, 6, 0, 3 },
|
||||||
|
+ .vdp_src_en = { 0x2010, 7, 6, 0, 3 },
|
||||||
|
+ },
|
||||||
|
+ },
|
||||||
|
+ { /* sentinel */ }
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
static const struct rockchip_usb2phy_cfg rk3588_phy_cfgs[] = {
|
||||||
|
{
|
||||||
|
.reg = 0x0000,
|
||||||
|
@@ -2026,6 +2128,7 @@ static const struct of_device_id rockchi
|
||||||
|
{ .compatible = "rockchip,rk3366-usb2phy", .data = &rk3366_phy_cfgs },
|
||||||
|
{ .compatible = "rockchip,rk3399-usb2phy", .data = &rk3399_phy_cfgs },
|
||||||
|
{ .compatible = "rockchip,rk3568-usb2phy", .data = &rk3568_phy_cfgs },
|
||||||
|
+ { .compatible = "rockchip,rk3576-usb2phy", .data = &rk3576_phy_cfgs },
|
||||||
|
{ .compatible = "rockchip,rk3588-usb2phy", .data = &rk3588_phy_cfgs },
|
||||||
|
{ .compatible = "rockchip,rv1108-usb2phy", .data = &rv1108_phy_cfgs },
|
||||||
|
{}
|
@ -0,0 +1,73 @@
|
|||||||
|
From a76de028c619dd18f89786805bcc7bb4d379ea9f Mon Sep 17 00:00:00 2001
|
||||||
|
From: Frank Wang <frank.wang@rock-chips.com>
|
||||||
|
Date: Mon, 14 Oct 2024 10:03:42 +0800
|
||||||
|
Subject: [PATCH] phy: rockchip: usbdp: add rk3576 device match data
|
||||||
|
|
||||||
|
This adds RK3576 device match data support.
|
||||||
|
|
||||||
|
Signed-off-by: Frank Wang <frank.wang@rock-chips.com>
|
||||||
|
Acked-by: Dragan Simic <dsimic@manjaro.org>
|
||||||
|
Reviewed-by: Heiko Stuebner <heiko@sntech.de>
|
||||||
|
Link: https://lore.kernel.org/r/20241014020342.15974-2-frawang.cn@gmail.com
|
||||||
|
Signed-off-by: Vinod Koul <vkoul@kernel.org>
|
||||||
|
---
|
||||||
|
drivers/phy/rockchip/phy-rockchip-usbdp.c | 41 +++++++++++++++++++++++
|
||||||
|
1 file changed, 41 insertions(+)
|
||||||
|
|
||||||
|
--- a/drivers/phy/rockchip/phy-rockchip-usbdp.c
|
||||||
|
+++ b/drivers/phy/rockchip/phy-rockchip-usbdp.c
|
||||||
|
@@ -1538,6 +1538,43 @@ static const char * const rk_udphy_rst_l
|
||||||
|
"init", "cmn", "lane", "pcs_apb", "pma_apb"
|
||||||
|
};
|
||||||
|
|
||||||
|
+static const struct rk_udphy_cfg rk3576_udphy_cfgs = {
|
||||||
|
+ .num_phys = 1,
|
||||||
|
+ .phy_ids = { 0x2b010000 },
|
||||||
|
+ .num_rsts = ARRAY_SIZE(rk_udphy_rst_list),
|
||||||
|
+ .rst_list = rk_udphy_rst_list,
|
||||||
|
+ .grfcfg = {
|
||||||
|
+ /* u2phy-grf */
|
||||||
|
+ .bvalid_phy_con = RK_UDPHY_GEN_GRF_REG(0x0010, 1, 0, 0x2, 0x3),
|
||||||
|
+ .bvalid_grf_con = RK_UDPHY_GEN_GRF_REG(0x0000, 15, 14, 0x1, 0x3),
|
||||||
|
+
|
||||||
|
+ /* usb-grf */
|
||||||
|
+ .usb3otg0_cfg = RK_UDPHY_GEN_GRF_REG(0x0030, 15, 0, 0x1100, 0x0188),
|
||||||
|
+
|
||||||
|
+ /* usbdpphy-grf */
|
||||||
|
+ .low_pwrn = RK_UDPHY_GEN_GRF_REG(0x0004, 13, 13, 0, 1),
|
||||||
|
+ .rx_lfps = RK_UDPHY_GEN_GRF_REG(0x0004, 14, 14, 0, 1),
|
||||||
|
+ },
|
||||||
|
+ .vogrfcfg = {
|
||||||
|
+ {
|
||||||
|
+ .hpd_trigger = RK_UDPHY_GEN_GRF_REG(0x0000, 11, 10, 1, 3),
|
||||||
|
+ .dp_lane_reg = 0x0000,
|
||||||
|
+ },
|
||||||
|
+ },
|
||||||
|
+ .dp_tx_ctrl_cfg = {
|
||||||
|
+ rk3588_dp_tx_drv_ctrl_rbr_hbr_typec,
|
||||||
|
+ rk3588_dp_tx_drv_ctrl_rbr_hbr_typec,
|
||||||
|
+ rk3588_dp_tx_drv_ctrl_hbr2,
|
||||||
|
+ rk3588_dp_tx_drv_ctrl_hbr3,
|
||||||
|
+ },
|
||||||
|
+ .dp_tx_ctrl_cfg_typec = {
|
||||||
|
+ rk3588_dp_tx_drv_ctrl_rbr_hbr_typec,
|
||||||
|
+ rk3588_dp_tx_drv_ctrl_rbr_hbr_typec,
|
||||||
|
+ rk3588_dp_tx_drv_ctrl_hbr2,
|
||||||
|
+ rk3588_dp_tx_drv_ctrl_hbr3,
|
||||||
|
+ },
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
static const struct rk_udphy_cfg rk3588_udphy_cfgs = {
|
||||||
|
.num_phys = 2,
|
||||||
|
.phy_ids = {
|
||||||
|
@@ -1585,6 +1622,10 @@ static const struct rk_udphy_cfg rk3588_
|
||||||
|
|
||||||
|
static const struct of_device_id rk_udphy_dt_match[] = {
|
||||||
|
{
|
||||||
|
+ .compatible = "rockchip,rk3576-usbdp-phy",
|
||||||
|
+ .data = &rk3576_udphy_cfgs
|
||||||
|
+ },
|
||||||
|
+ {
|
||||||
|
.compatible = "rockchip,rk3588-usbdp-phy",
|
||||||
|
.data = &rk3588_udphy_cfgs
|
||||||
|
},
|
@ -0,0 +1,37 @@
|
|||||||
|
From 591ae6bed250e4067db926313ff7279d23a1c7d1 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ye Zhang <ye.zhang@rock-chips.com>
|
||||||
|
Date: Tue, 12 Nov 2024 09:54:05 +0800
|
||||||
|
Subject: [PATCH] gpio: rockchip: explan the format of the GPIO version ID
|
||||||
|
|
||||||
|
Remove redundant comments and provide a detailed explanation of the
|
||||||
|
GPIO version ID.
|
||||||
|
|
||||||
|
Signed-off-by: Ye Zhang <ye.zhang@rock-chips.com>
|
||||||
|
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
|
||||||
|
Reviewed-by: Sebastian Reichel <sebastian.reichel@collabora.com>
|
||||||
|
Link: https://lore.kernel.org/r/20241112015408.3139996-2-ye.zhang@rock-chips.com
|
||||||
|
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
|
||||||
|
---
|
||||||
|
drivers/gpio/gpio-rockchip.c | 10 ++++++++--
|
||||||
|
1 file changed, 8 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/gpio/gpio-rockchip.c
|
||||||
|
+++ b/drivers/gpio/gpio-rockchip.c
|
||||||
|
@@ -26,9 +26,15 @@
|
||||||
|
#include "../pinctrl/core.h"
|
||||||
|
#include "../pinctrl/pinctrl-rockchip.h"
|
||||||
|
|
||||||
|
+/*
|
||||||
|
+ * Version ID Register
|
||||||
|
+ * Bits [31:24] - Major Version
|
||||||
|
+ * Bits [23:16] - Minor Version
|
||||||
|
+ * Bits [15:0] - Revision Number
|
||||||
|
+ */
|
||||||
|
#define GPIO_TYPE_V1 (0) /* GPIO Version ID reserved */
|
||||||
|
-#define GPIO_TYPE_V2 (0x01000C2B) /* GPIO Version ID 0x01000C2B */
|
||||||
|
-#define GPIO_TYPE_V2_1 (0x0101157C) /* GPIO Version ID 0x0101157C */
|
||||||
|
+#define GPIO_TYPE_V2 (0x01000C2B)
|
||||||
|
+#define GPIO_TYPE_V2_1 (0x0101157C)
|
||||||
|
|
||||||
|
static const struct rockchip_gpio_regs gpio_regs_v1 = {
|
||||||
|
.port_dr = 0x00,
|
@ -0,0 +1,46 @@
|
|||||||
|
From 41209307cad7f14c387c68375a93b50e54261a53 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ye Zhang <ye.zhang@rock-chips.com>
|
||||||
|
Date: Tue, 12 Nov 2024 09:54:06 +0800
|
||||||
|
Subject: [PATCH] gpio: rockchip: change the GPIO version judgment logic
|
||||||
|
|
||||||
|
Have a list of valid IDs and default to -ENODEV.
|
||||||
|
|
||||||
|
Signed-off-by: Ye Zhang <ye.zhang@rock-chips.com>
|
||||||
|
Reviewed-by: Sebastian Reichel <sebastian.reichel@collabora.com>
|
||||||
|
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
|
||||||
|
Link: https://lore.kernel.org/r/20241112015408.3139996-3-ye.zhang@rock-chips.com
|
||||||
|
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
|
||||||
|
---
|
||||||
|
drivers/gpio/gpio-rockchip.c | 12 +++++++++---
|
||||||
|
1 file changed, 9 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/gpio/gpio-rockchip.c
|
||||||
|
+++ b/drivers/gpio/gpio-rockchip.c
|
||||||
|
@@ -667,8 +667,9 @@ static int rockchip_get_bank_data(struct
|
||||||
|
clk_prepare_enable(bank->clk);
|
||||||
|
id = readl(bank->reg_base + gpio_regs_v2.version_id);
|
||||||
|
|
||||||
|
- /* If not gpio v2, that is default to v1. */
|
||||||
|
- if (id == GPIO_TYPE_V2 || id == GPIO_TYPE_V2_1) {
|
||||||
|
+ switch (id) {
|
||||||
|
+ case GPIO_TYPE_V2:
|
||||||
|
+ case GPIO_TYPE_V2_1:
|
||||||
|
bank->gpio_regs = &gpio_regs_v2;
|
||||||
|
bank->gpio_type = GPIO_TYPE_V2;
|
||||||
|
bank->db_clk = of_clk_get(bank->of_node, 1);
|
||||||
|
@@ -677,9 +678,14 @@ static int rockchip_get_bank_data(struct
|
||||||
|
clk_disable_unprepare(bank->clk);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
- } else {
|
||||||
|
+ break;
|
||||||
|
+ case GPIO_TYPE_V1:
|
||||||
|
bank->gpio_regs = &gpio_regs_v1;
|
||||||
|
bank->gpio_type = GPIO_TYPE_V1;
|
||||||
|
+ break;
|
||||||
|
+ default:
|
||||||
|
+ dev_err(bank->dev, "unsupported version ID: 0x%08x\n", id);
|
||||||
|
+ return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
@ -0,0 +1,34 @@
|
|||||||
|
From 8bcbd0379c05c66ce2e842c7e8901aa317cdf04e Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ye Zhang <ye.zhang@rock-chips.com>
|
||||||
|
Date: Tue, 12 Nov 2024 09:54:07 +0800
|
||||||
|
Subject: [PATCH] gpio: rockchip: support new version GPIO
|
||||||
|
|
||||||
|
Support the next version GPIO controller on SoCs like rk3576.
|
||||||
|
|
||||||
|
Signed-off-by: Ye Zhang <ye.zhang@rock-chips.com>
|
||||||
|
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
|
||||||
|
Reviewed-by: Sebastian Reichel <sebastian.reichel@collabora.com>
|
||||||
|
Link: https://lore.kernel.org/r/20241112015408.3139996-4-ye.zhang@rock-chips.com
|
||||||
|
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
|
||||||
|
---
|
||||||
|
drivers/gpio/gpio-rockchip.c | 2 ++
|
||||||
|
1 file changed, 2 insertions(+)
|
||||||
|
|
||||||
|
--- a/drivers/gpio/gpio-rockchip.c
|
||||||
|
+++ b/drivers/gpio/gpio-rockchip.c
|
||||||
|
@@ -35,6 +35,7 @@
|
||||||
|
#define GPIO_TYPE_V1 (0) /* GPIO Version ID reserved */
|
||||||
|
#define GPIO_TYPE_V2 (0x01000C2B)
|
||||||
|
#define GPIO_TYPE_V2_1 (0x0101157C)
|
||||||
|
+#define GPIO_TYPE_V2_2 (0x010219C8)
|
||||||
|
|
||||||
|
static const struct rockchip_gpio_regs gpio_regs_v1 = {
|
||||||
|
.port_dr = 0x00,
|
||||||
|
@@ -670,6 +671,7 @@ static int rockchip_get_bank_data(struct
|
||||||
|
switch (id) {
|
||||||
|
case GPIO_TYPE_V2:
|
||||||
|
case GPIO_TYPE_V2_1:
|
||||||
|
+ case GPIO_TYPE_V2_2:
|
||||||
|
bank->gpio_regs = &gpio_regs_v2;
|
||||||
|
bank->gpio_type = GPIO_TYPE_V2;
|
||||||
|
bank->db_clk = of_clk_get(bank->of_node, 1);
|
@ -0,0 +1,260 @@
|
|||||||
|
From 59903441f5e49d46478fefcccec41e2ba896b740 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Shawn Lin <shawn.lin@rock-chips.com>
|
||||||
|
Date: Wed, 28 Aug 2024 15:24:55 +0000
|
||||||
|
Subject: [PATCH] mmc: dw_mmc-rockchip: Add internal phase support
|
||||||
|
|
||||||
|
Some Rockchip devices put the phase settings into the dw_mmc controller.
|
||||||
|
|
||||||
|
When the feature is present, the ciu-drive and ciu-sample clocks are
|
||||||
|
not used and the phase configuration is done directly through the mmc
|
||||||
|
controller.
|
||||||
|
|
||||||
|
Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
|
||||||
|
Signed-off-by: Detlev Casanova <detlev.casanova@collabora.com>
|
||||||
|
Acked-by: Shawn Lin <shawn.lin@rock-chips.com>
|
||||||
|
Reviewed-by: Heiko Stuebner <heiko@sntech.de>
|
||||||
|
Link: https://lore.kernel.org/r/010201919996fdae-8a9f843e-00a8-4131-98bf-a9da4ed04bfd-000000@eu-west-1.amazonses.com
|
||||||
|
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
|
||||||
|
---
|
||||||
|
drivers/mmc/host/dw_mmc-rockchip.c | 171 +++++++++++++++++++++++++++--
|
||||||
|
1 file changed, 160 insertions(+), 11 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/mmc/host/dw_mmc-rockchip.c
|
||||||
|
+++ b/drivers/mmc/host/dw_mmc-rockchip.c
|
||||||
|
@@ -15,7 +15,17 @@
|
||||||
|
#include "dw_mmc.h"
|
||||||
|
#include "dw_mmc-pltfm.h"
|
||||||
|
|
||||||
|
-#define RK3288_CLKGEN_DIV 2
|
||||||
|
+#define RK3288_CLKGEN_DIV 2
|
||||||
|
+#define SDMMC_TIMING_CON0 0x130
|
||||||
|
+#define SDMMC_TIMING_CON1 0x134
|
||||||
|
+#define ROCKCHIP_MMC_DELAY_SEL BIT(10)
|
||||||
|
+#define ROCKCHIP_MMC_DEGREE_MASK 0x3
|
||||||
|
+#define ROCKCHIP_MMC_DEGREE_OFFSET 1
|
||||||
|
+#define ROCKCHIP_MMC_DELAYNUM_OFFSET 2
|
||||||
|
+#define ROCKCHIP_MMC_DELAYNUM_MASK (0xff << ROCKCHIP_MMC_DELAYNUM_OFFSET)
|
||||||
|
+#define ROCKCHIP_MMC_DELAY_ELEMENT_PSEC 60
|
||||||
|
+#define HIWORD_UPDATE(val, mask, shift) \
|
||||||
|
+ ((val) << (shift) | (mask) << ((shift) + 16))
|
||||||
|
|
||||||
|
static const unsigned int freqs[] = { 100000, 200000, 300000, 400000 };
|
||||||
|
|
||||||
|
@@ -24,8 +34,143 @@ struct dw_mci_rockchip_priv_data {
|
||||||
|
struct clk *sample_clk;
|
||||||
|
int default_sample_phase;
|
||||||
|
int num_phases;
|
||||||
|
+ bool internal_phase;
|
||||||
|
};
|
||||||
|
|
||||||
|
+/*
|
||||||
|
+ * Each fine delay is between 44ps-77ps. Assume each fine delay is 60ps to
|
||||||
|
+ * simplify calculations. So 45degs could be anywhere between 33deg and 57.8deg.
|
||||||
|
+ */
|
||||||
|
+static int rockchip_mmc_get_internal_phase(struct dw_mci *host, bool sample)
|
||||||
|
+{
|
||||||
|
+ unsigned long rate = clk_get_rate(host->ciu_clk);
|
||||||
|
+ u32 raw_value;
|
||||||
|
+ u16 degrees;
|
||||||
|
+ u32 delay_num = 0;
|
||||||
|
+
|
||||||
|
+ /* Constant signal, no measurable phase shift */
|
||||||
|
+ if (!rate)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ if (sample)
|
||||||
|
+ raw_value = mci_readl(host, TIMING_CON1);
|
||||||
|
+ else
|
||||||
|
+ raw_value = mci_readl(host, TIMING_CON0);
|
||||||
|
+
|
||||||
|
+ raw_value >>= ROCKCHIP_MMC_DEGREE_OFFSET;
|
||||||
|
+ degrees = (raw_value & ROCKCHIP_MMC_DEGREE_MASK) * 90;
|
||||||
|
+
|
||||||
|
+ if (raw_value & ROCKCHIP_MMC_DELAY_SEL) {
|
||||||
|
+ /* degrees/delaynum * 1000000 */
|
||||||
|
+ unsigned long factor = (ROCKCHIP_MMC_DELAY_ELEMENT_PSEC / 10) *
|
||||||
|
+ 36 * (rate / 10000);
|
||||||
|
+
|
||||||
|
+ delay_num = (raw_value & ROCKCHIP_MMC_DELAYNUM_MASK);
|
||||||
|
+ delay_num >>= ROCKCHIP_MMC_DELAYNUM_OFFSET;
|
||||||
|
+ degrees += DIV_ROUND_CLOSEST(delay_num * factor, 1000000);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return degrees % 360;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int rockchip_mmc_get_phase(struct dw_mci *host, bool sample)
|
||||||
|
+{
|
||||||
|
+ struct dw_mci_rockchip_priv_data *priv = host->priv;
|
||||||
|
+ struct clk *clock = sample ? priv->sample_clk : priv->drv_clk;
|
||||||
|
+
|
||||||
|
+ if (priv->internal_phase)
|
||||||
|
+ return rockchip_mmc_get_internal_phase(host, sample);
|
||||||
|
+ else
|
||||||
|
+ return clk_get_phase(clock);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int rockchip_mmc_set_internal_phase(struct dw_mci *host, bool sample, int degrees)
|
||||||
|
+{
|
||||||
|
+ unsigned long rate = clk_get_rate(host->ciu_clk);
|
||||||
|
+ u8 nineties, remainder;
|
||||||
|
+ u8 delay_num;
|
||||||
|
+ u32 raw_value;
|
||||||
|
+ u32 delay;
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * The below calculation is based on the output clock from
|
||||||
|
+ * MMC host to the card, which expects the phase clock inherits
|
||||||
|
+ * the clock rate from its parent, namely the output clock
|
||||||
|
+ * provider of MMC host. However, things may go wrong if
|
||||||
|
+ * (1) It is orphan.
|
||||||
|
+ * (2) It is assigned to the wrong parent.
|
||||||
|
+ *
|
||||||
|
+ * This check help debug the case (1), which seems to be the
|
||||||
|
+ * most likely problem we often face and which makes it difficult
|
||||||
|
+ * for people to debug unstable mmc tuning results.
|
||||||
|
+ */
|
||||||
|
+ if (!rate) {
|
||||||
|
+ dev_err(host->dev, "%s: invalid clk rate\n", __func__);
|
||||||
|
+ return -EINVAL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ nineties = degrees / 90;
|
||||||
|
+ remainder = (degrees % 90);
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * Due to the inexact nature of the "fine" delay, we might
|
||||||
|
+ * actually go non-monotonic. We don't go _too_ monotonic
|
||||||
|
+ * though, so we should be OK. Here are options of how we may
|
||||||
|
+ * work:
|
||||||
|
+ *
|
||||||
|
+ * Ideally we end up with:
|
||||||
|
+ * 1.0, 2.0, ..., 69.0, 70.0, ..., 89.0, 90.0
|
||||||
|
+ *
|
||||||
|
+ * On one extreme (if delay is actually 44ps):
|
||||||
|
+ * .73, 1.5, ..., 50.6, 51.3, ..., 65.3, 90.0
|
||||||
|
+ * The other (if delay is actually 77ps):
|
||||||
|
+ * 1.3, 2.6, ..., 88.6. 89.8, ..., 114.0, 90
|
||||||
|
+ *
|
||||||
|
+ * It's possible we might make a delay that is up to 25
|
||||||
|
+ * degrees off from what we think we're making. That's OK
|
||||||
|
+ * though because we should be REALLY far from any bad range.
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * Convert to delay; do a little extra work to make sure we
|
||||||
|
+ * don't overflow 32-bit / 64-bit numbers.
|
||||||
|
+ */
|
||||||
|
+ delay = 10000000; /* PSECS_PER_SEC / 10000 / 10 */
|
||||||
|
+ delay *= remainder;
|
||||||
|
+ delay = DIV_ROUND_CLOSEST(delay,
|
||||||
|
+ (rate / 1000) * 36 *
|
||||||
|
+ (ROCKCHIP_MMC_DELAY_ELEMENT_PSEC / 10));
|
||||||
|
+
|
||||||
|
+ delay_num = (u8) min_t(u32, delay, 255);
|
||||||
|
+
|
||||||
|
+ raw_value = delay_num ? ROCKCHIP_MMC_DELAY_SEL : 0;
|
||||||
|
+ raw_value |= delay_num << ROCKCHIP_MMC_DELAYNUM_OFFSET;
|
||||||
|
+ raw_value |= nineties;
|
||||||
|
+
|
||||||
|
+ if (sample)
|
||||||
|
+ mci_writel(host, TIMING_CON1, HIWORD_UPDATE(raw_value, 0x07ff, 1));
|
||||||
|
+ else
|
||||||
|
+ mci_writel(host, TIMING_CON0, HIWORD_UPDATE(raw_value, 0x07ff, 1));
|
||||||
|
+
|
||||||
|
+ dev_dbg(host->dev, "set %s_phase(%d) delay_nums=%u actual_degrees=%d\n",
|
||||||
|
+ sample ? "sample" : "drv", degrees, delay_num,
|
||||||
|
+ rockchip_mmc_get_phase(host, sample)
|
||||||
|
+ );
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int rockchip_mmc_set_phase(struct dw_mci *host, bool sample, int degrees)
|
||||||
|
+{
|
||||||
|
+ struct dw_mci_rockchip_priv_data *priv = host->priv;
|
||||||
|
+ struct clk *clock = sample ? priv->sample_clk : priv->drv_clk;
|
||||||
|
+
|
||||||
|
+ if (priv->internal_phase)
|
||||||
|
+ return rockchip_mmc_set_internal_phase(host, sample, degrees);
|
||||||
|
+ else
|
||||||
|
+ return clk_set_phase(clock, degrees);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static void dw_mci_rk3288_set_ios(struct dw_mci *host, struct mmc_ios *ios)
|
||||||
|
{
|
||||||
|
struct dw_mci_rockchip_priv_data *priv = host->priv;
|
||||||
|
@@ -64,7 +209,7 @@ static void dw_mci_rk3288_set_ios(struct
|
||||||
|
|
||||||
|
/* Make sure we use phases which we can enumerate with */
|
||||||
|
if (!IS_ERR(priv->sample_clk) && ios->timing <= MMC_TIMING_SD_HS)
|
||||||
|
- clk_set_phase(priv->sample_clk, priv->default_sample_phase);
|
||||||
|
+ rockchip_mmc_set_phase(host, true, priv->default_sample_phase);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set the drive phase offset based on speed mode to achieve hold times.
|
||||||
|
@@ -127,7 +272,7 @@ static void dw_mci_rk3288_set_ios(struct
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
- clk_set_phase(priv->drv_clk, phase);
|
||||||
|
+ rockchip_mmc_set_phase(host, false, phase);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -151,6 +296,7 @@ static int dw_mci_rk3288_execute_tuning(
|
||||||
|
int longest_range_len = -1;
|
||||||
|
int longest_range = -1;
|
||||||
|
int middle_phase;
|
||||||
|
+ int phase;
|
||||||
|
|
||||||
|
if (IS_ERR(priv->sample_clk)) {
|
||||||
|
dev_err(host->dev, "Tuning clock (sample_clk) not defined.\n");
|
||||||
|
@@ -164,8 +310,10 @@ static int dw_mci_rk3288_execute_tuning(
|
||||||
|
|
||||||
|
/* Try each phase and extract good ranges */
|
||||||
|
for (i = 0; i < priv->num_phases; ) {
|
||||||
|
- clk_set_phase(priv->sample_clk,
|
||||||
|
- TUNING_ITERATION_TO_PHASE(i, priv->num_phases));
|
||||||
|
+ rockchip_mmc_set_phase(host, true,
|
||||||
|
+ TUNING_ITERATION_TO_PHASE(
|
||||||
|
+ i,
|
||||||
|
+ priv->num_phases));
|
||||||
|
|
||||||
|
v = !mmc_send_tuning(mmc, opcode, NULL);
|
||||||
|
|
||||||
|
@@ -211,7 +359,8 @@ static int dw_mci_rk3288_execute_tuning(
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ranges[0].start == 0 && ranges[0].end == priv->num_phases - 1) {
|
||||||
|
- clk_set_phase(priv->sample_clk, priv->default_sample_phase);
|
||||||
|
+ rockchip_mmc_set_phase(host, true, priv->default_sample_phase);
|
||||||
|
+
|
||||||
|
dev_info(host->dev, "All phases work, using default phase %d.",
|
||||||
|
priv->default_sample_phase);
|
||||||
|
goto free;
|
||||||
|
@@ -248,12 +397,10 @@ static int dw_mci_rk3288_execute_tuning(
|
||||||
|
|
||||||
|
middle_phase = ranges[longest_range].start + longest_range_len / 2;
|
||||||
|
middle_phase %= priv->num_phases;
|
||||||
|
- dev_info(host->dev, "Successfully tuned phase to %d\n",
|
||||||
|
- TUNING_ITERATION_TO_PHASE(middle_phase, priv->num_phases));
|
||||||
|
+ phase = TUNING_ITERATION_TO_PHASE(middle_phase, priv->num_phases);
|
||||||
|
+ dev_info(host->dev, "Successfully tuned phase to %d\n", phase);
|
||||||
|
|
||||||
|
- clk_set_phase(priv->sample_clk,
|
||||||
|
- TUNING_ITERATION_TO_PHASE(middle_phase,
|
||||||
|
- priv->num_phases));
|
||||||
|
+ rockchip_mmc_set_phase(host, true, phase);
|
||||||
|
|
||||||
|
free:
|
||||||
|
kfree(ranges);
|
||||||
|
@@ -287,6 +434,8 @@ static int dw_mci_rk3288_parse_dt(struct
|
||||||
|
|
||||||
|
host->priv = priv;
|
||||||
|
|
||||||
|
+ priv->internal_phase = false;
|
||||||
|
+
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,111 @@
|
|||||||
|
From 73abb1f16e28d5a41d0abea779a3f0b75cf8823e Mon Sep 17 00:00:00 2001
|
||||||
|
From: Detlev Casanova <detlev.casanova@collabora.com>
|
||||||
|
Date: Wed, 28 Aug 2024 15:24:56 +0000
|
||||||
|
Subject: [PATCH] mmc: dw_mmc-rockchip: Add support for rk3576 SoCs
|
||||||
|
|
||||||
|
On rk3576 the tunable clocks are inside the controller itself, removing
|
||||||
|
the need for the "ciu-drive" and "ciu-sample" clocks.
|
||||||
|
|
||||||
|
That makes it a new type of controller that has its own dt_parse function.
|
||||||
|
|
||||||
|
Signed-off-by: Detlev Casanova <detlev.casanova@collabora.com>
|
||||||
|
Reviewed-by: Heiko Stuebner <heiko@sntech.de>
|
||||||
|
Link: https://lore.kernel.org/r/010201919997044d-c3a008d1-afbc-462f-a928-fc1ece785bdb-000000@eu-west-1.amazonses.com
|
||||||
|
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
|
||||||
|
---
|
||||||
|
drivers/mmc/host/dw_mmc-rockchip.c | 48 ++++++++++++++++++++++++++----
|
||||||
|
1 file changed, 43 insertions(+), 5 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/mmc/host/dw_mmc-rockchip.c
|
||||||
|
+++ b/drivers/mmc/host/dw_mmc-rockchip.c
|
||||||
|
@@ -407,7 +407,7 @@ free:
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static int dw_mci_rk3288_parse_dt(struct dw_mci *host)
|
||||||
|
+static int dw_mci_common_parse_dt(struct dw_mci *host)
|
||||||
|
{
|
||||||
|
struct device_node *np = host->dev->of_node;
|
||||||
|
struct dw_mci_rockchip_priv_data *priv;
|
||||||
|
@@ -417,13 +417,29 @@ static int dw_mci_rk3288_parse_dt(struct
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
if (of_property_read_u32(np, "rockchip,desired-num-phases",
|
||||||
|
- &priv->num_phases))
|
||||||
|
+ &priv->num_phases))
|
||||||
|
priv->num_phases = 360;
|
||||||
|
|
||||||
|
if (of_property_read_u32(np, "rockchip,default-sample-phase",
|
||||||
|
- &priv->default_sample_phase))
|
||||||
|
+ &priv->default_sample_phase))
|
||||||
|
priv->default_sample_phase = 0;
|
||||||
|
|
||||||
|
+ host->priv = priv;
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int dw_mci_rk3288_parse_dt(struct dw_mci *host)
|
||||||
|
+{
|
||||||
|
+ struct dw_mci_rockchip_priv_data *priv;
|
||||||
|
+ int err;
|
||||||
|
+
|
||||||
|
+ err = dw_mci_common_parse_dt(host);
|
||||||
|
+ if (err)
|
||||||
|
+ return err;
|
||||||
|
+
|
||||||
|
+ priv = host->priv;
|
||||||
|
+
|
||||||
|
priv->drv_clk = devm_clk_get(host->dev, "ciu-drive");
|
||||||
|
if (IS_ERR(priv->drv_clk))
|
||||||
|
dev_dbg(host->dev, "ciu-drive not available\n");
|
||||||
|
@@ -432,13 +448,25 @@ static int dw_mci_rk3288_parse_dt(struct
|
||||||
|
if (IS_ERR(priv->sample_clk))
|
||||||
|
dev_dbg(host->dev, "ciu-sample not available\n");
|
||||||
|
|
||||||
|
- host->priv = priv;
|
||||||
|
-
|
||||||
|
priv->internal_phase = false;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static int dw_mci_rk3576_parse_dt(struct dw_mci *host)
|
||||||
|
+{
|
||||||
|
+ struct dw_mci_rockchip_priv_data *priv;
|
||||||
|
+ int err = dw_mci_common_parse_dt(host);
|
||||||
|
+ if (err)
|
||||||
|
+ return err;
|
||||||
|
+
|
||||||
|
+ priv = host->priv;
|
||||||
|
+
|
||||||
|
+ priv->internal_phase = true;
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static int dw_mci_rockchip_init(struct dw_mci *host)
|
||||||
|
{
|
||||||
|
int ret, i;
|
||||||
|
@@ -480,11 +508,21 @@ static const struct dw_mci_drv_data rk32
|
||||||
|
.init = dw_mci_rockchip_init,
|
||||||
|
};
|
||||||
|
|
||||||
|
+static const struct dw_mci_drv_data rk3576_drv_data = {
|
||||||
|
+ .common_caps = MMC_CAP_CMD23,
|
||||||
|
+ .set_ios = dw_mci_rk3288_set_ios,
|
||||||
|
+ .execute_tuning = dw_mci_rk3288_execute_tuning,
|
||||||
|
+ .parse_dt = dw_mci_rk3576_parse_dt,
|
||||||
|
+ .init = dw_mci_rockchip_init,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
static const struct of_device_id dw_mci_rockchip_match[] = {
|
||||||
|
{ .compatible = "rockchip,rk2928-dw-mshc",
|
||||||
|
.data = &rk2928_drv_data },
|
||||||
|
{ .compatible = "rockchip,rk3288-dw-mshc",
|
||||||
|
.data = &rk3288_drv_data },
|
||||||
|
+ { .compatible = "rockchip,rk3576-dw-mshc",
|
||||||
|
+ .data = &rk3576_drv_data },
|
||||||
|
{},
|
||||||
|
};
|
||||||
|
MODULE_DEVICE_TABLE(of, dw_mci_rockchip_match);
|
@ -0,0 +1,40 @@
|
|||||||
|
From 78a60497a020ff526ae067125eef0dee10df5771 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Detlev Casanova <detlev.casanova@collabora.com>
|
||||||
|
Date: Fri, 23 Aug 2024 10:11:13 -0400
|
||||||
|
Subject: [PATCH] ethernet: stmmac: dwmac-rk: Fix typo for RK3588 code
|
||||||
|
|
||||||
|
Fix SELET -> SELECT in RK3588_GMAC_CLK_SELET_CRU and
|
||||||
|
RK3588_GMAC_CLK_SELET_IO
|
||||||
|
|
||||||
|
Signed-off-by: Detlev Casanova <detlev.casanova@collabora.com>
|
||||||
|
Reviewed-by: Heiko Stuebner <heiko@sntech.de>
|
||||||
|
Link: https://patch.msgid.link/20240823141318.51201-2-detlev.casanova@collabora.com
|
||||||
|
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||||
|
---
|
||||||
|
drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c | 8 ++++----
|
||||||
|
1 file changed, 4 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
|
||||||
|
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
|
||||||
|
@@ -1143,8 +1143,8 @@ static const struct rk_gmac_ops rk3568_o
|
||||||
|
#define RK3588_GMAC_CLK_RMII_MODE(id) GRF_BIT(5 * (id))
|
||||||
|
#define RK3588_GMAC_CLK_RGMII_MODE(id) GRF_CLR_BIT(5 * (id))
|
||||||
|
|
||||||
|
-#define RK3588_GMAC_CLK_SELET_CRU(id) GRF_BIT(5 * (id) + 4)
|
||||||
|
-#define RK3588_GMAC_CLK_SELET_IO(id) GRF_CLR_BIT(5 * (id) + 4)
|
||||||
|
+#define RK3588_GMAC_CLK_SELECT_CRU(id) GRF_BIT(5 * (id) + 4)
|
||||||
|
+#define RK3588_GMAC_CLK_SELECT_IO(id) GRF_CLR_BIT(5 * (id) + 4)
|
||||||
|
|
||||||
|
#define RK3588_GMA_CLK_RMII_DIV2(id) GRF_BIT(5 * (id) + 2)
|
||||||
|
#define RK3588_GMA_CLK_RMII_DIV20(id) GRF_CLR_BIT(5 * (id) + 2)
|
||||||
|
@@ -1242,8 +1242,8 @@ err:
|
||||||
|
static void rk3588_set_clock_selection(struct rk_priv_data *bsp_priv, bool input,
|
||||||
|
bool enable)
|
||||||
|
{
|
||||||
|
- unsigned int val = input ? RK3588_GMAC_CLK_SELET_IO(bsp_priv->id) :
|
||||||
|
- RK3588_GMAC_CLK_SELET_CRU(bsp_priv->id);
|
||||||
|
+ unsigned int val = input ? RK3588_GMAC_CLK_SELECT_IO(bsp_priv->id) :
|
||||||
|
+ RK3588_GMAC_CLK_SELECT_CRU(bsp_priv->id);
|
||||||
|
|
||||||
|
val |= enable ? RK3588_GMAC_CLK_RMII_NOGATE(bsp_priv->id) :
|
||||||
|
RK3588_GMAC_CLK_RMII_GATE(bsp_priv->id);
|
@ -0,0 +1,189 @@
|
|||||||
|
From f9cc9997cba9defaf00c8e70d25f88271cbd6d4d Mon Sep 17 00:00:00 2001
|
||||||
|
From: David Wu <david.wu@rock-chips.com>
|
||||||
|
Date: Fri, 23 Aug 2024 10:11:15 -0400
|
||||||
|
Subject: [PATCH] ethernet: stmmac: dwmac-rk: Add GMAC support for RK3576
|
||||||
|
|
||||||
|
Add constants and callback functions for the dwmac on RK3576 soc.
|
||||||
|
|
||||||
|
Signed-off-by: David Wu <david.wu@rock-chips.com>
|
||||||
|
[rebase, extracted bindings]
|
||||||
|
Signed-off-by: Detlev Casanova <detlev.casanova@collabora.com>
|
||||||
|
Reviewed-by: Heiko Stuebner <heiko@sntech.de>
|
||||||
|
Link: https://patch.msgid.link/20240823141318.51201-4-detlev.casanova@collabora.com
|
||||||
|
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||||
|
---
|
||||||
|
.../net/ethernet/stmicro/stmmac/dwmac-rk.c | 156 ++++++++++++++++++
|
||||||
|
1 file changed, 156 insertions(+)
|
||||||
|
|
||||||
|
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
|
||||||
|
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
|
||||||
|
@@ -1118,6 +1118,161 @@ static const struct rk_gmac_ops rk3568_o
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
+/* VCCIO0_1_3_IOC */
|
||||||
|
+#define RK3576_VCCIO0_1_3_IOC_CON2 0X6408
|
||||||
|
+#define RK3576_VCCIO0_1_3_IOC_CON3 0X640c
|
||||||
|
+#define RK3576_VCCIO0_1_3_IOC_CON4 0X6410
|
||||||
|
+#define RK3576_VCCIO0_1_3_IOC_CON5 0X6414
|
||||||
|
+
|
||||||
|
+#define RK3576_GMAC_RXCLK_DLY_ENABLE GRF_BIT(15)
|
||||||
|
+#define RK3576_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(15)
|
||||||
|
+#define RK3576_GMAC_TXCLK_DLY_ENABLE GRF_BIT(7)
|
||||||
|
+#define RK3576_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(7)
|
||||||
|
+
|
||||||
|
+#define RK3576_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 8)
|
||||||
|
+#define RK3576_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0)
|
||||||
|
+
|
||||||
|
+/* SDGMAC_GRF */
|
||||||
|
+#define RK3576_GRF_GMAC_CON0 0X0020
|
||||||
|
+#define RK3576_GRF_GMAC_CON1 0X0024
|
||||||
|
+
|
||||||
|
+#define RK3576_GMAC_RMII_MODE GRF_BIT(3)
|
||||||
|
+#define RK3576_GMAC_RGMII_MODE GRF_CLR_BIT(3)
|
||||||
|
+
|
||||||
|
+#define RK3576_GMAC_CLK_SELECT_IO GRF_BIT(7)
|
||||||
|
+#define RK3576_GMAC_CLK_SELECT_CRU GRF_CLR_BIT(7)
|
||||||
|
+
|
||||||
|
+#define RK3576_GMAC_CLK_RMII_DIV2 GRF_BIT(5)
|
||||||
|
+#define RK3576_GMAC_CLK_RMII_DIV20 GRF_CLR_BIT(5)
|
||||||
|
+
|
||||||
|
+#define RK3576_GMAC_CLK_RGMII_DIV1 \
|
||||||
|
+ (GRF_CLR_BIT(6) | GRF_CLR_BIT(5))
|
||||||
|
+#define RK3576_GMAC_CLK_RGMII_DIV5 \
|
||||||
|
+ (GRF_BIT(6) | GRF_BIT(5))
|
||||||
|
+#define RK3576_GMAC_CLK_RGMII_DIV50 \
|
||||||
|
+ (GRF_BIT(6) | GRF_CLR_BIT(5))
|
||||||
|
+
|
||||||
|
+#define RK3576_GMAC_CLK_RMII_GATE GRF_BIT(4)
|
||||||
|
+#define RK3576_GMAC_CLK_RMII_NOGATE GRF_CLR_BIT(4)
|
||||||
|
+
|
||||||
|
+static void rk3576_set_to_rgmii(struct rk_priv_data *bsp_priv,
|
||||||
|
+ int tx_delay, int rx_delay)
|
||||||
|
+{
|
||||||
|
+ struct device *dev = &bsp_priv->pdev->dev;
|
||||||
|
+ unsigned int offset_con;
|
||||||
|
+
|
||||||
|
+ if (IS_ERR(bsp_priv->grf) || IS_ERR(bsp_priv->php_grf)) {
|
||||||
|
+ dev_err(dev, "Missing rockchip,grf or rockchip,php-grf property\n");
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ offset_con = bsp_priv->id == 1 ? RK3576_GRF_GMAC_CON1 :
|
||||||
|
+ RK3576_GRF_GMAC_CON0;
|
||||||
|
+
|
||||||
|
+ regmap_write(bsp_priv->grf, offset_con, RK3576_GMAC_RGMII_MODE);
|
||||||
|
+
|
||||||
|
+ offset_con = bsp_priv->id == 1 ? RK3576_VCCIO0_1_3_IOC_CON4 :
|
||||||
|
+ RK3576_VCCIO0_1_3_IOC_CON2;
|
||||||
|
+
|
||||||
|
+ /* m0 && m1 delay enabled */
|
||||||
|
+ regmap_write(bsp_priv->php_grf, offset_con,
|
||||||
|
+ DELAY_ENABLE(RK3576, tx_delay, rx_delay));
|
||||||
|
+ regmap_write(bsp_priv->php_grf, offset_con + 0x4,
|
||||||
|
+ DELAY_ENABLE(RK3576, tx_delay, rx_delay));
|
||||||
|
+
|
||||||
|
+ /* m0 && m1 delay value */
|
||||||
|
+ regmap_write(bsp_priv->php_grf, offset_con,
|
||||||
|
+ RK3576_GMAC_CLK_TX_DL_CFG(tx_delay) |
|
||||||
|
+ RK3576_GMAC_CLK_RX_DL_CFG(rx_delay));
|
||||||
|
+ regmap_write(bsp_priv->php_grf, offset_con + 0x4,
|
||||||
|
+ RK3576_GMAC_CLK_TX_DL_CFG(tx_delay) |
|
||||||
|
+ RK3576_GMAC_CLK_RX_DL_CFG(rx_delay));
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void rk3576_set_to_rmii(struct rk_priv_data *bsp_priv)
|
||||||
|
+{
|
||||||
|
+ struct device *dev = &bsp_priv->pdev->dev;
|
||||||
|
+ unsigned int offset_con;
|
||||||
|
+
|
||||||
|
+ if (IS_ERR(bsp_priv->grf)) {
|
||||||
|
+ dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ offset_con = bsp_priv->id == 1 ? RK3576_GRF_GMAC_CON1 :
|
||||||
|
+ RK3576_GRF_GMAC_CON0;
|
||||||
|
+
|
||||||
|
+ regmap_write(bsp_priv->grf, offset_con, RK3576_GMAC_RMII_MODE);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void rk3576_set_gmac_speed(struct rk_priv_data *bsp_priv, int speed)
|
||||||
|
+{
|
||||||
|
+ struct device *dev = &bsp_priv->pdev->dev;
|
||||||
|
+ unsigned int val = 0, offset_con;
|
||||||
|
+
|
||||||
|
+ switch (speed) {
|
||||||
|
+ case 10:
|
||||||
|
+ if (bsp_priv->phy_iface == PHY_INTERFACE_MODE_RMII)
|
||||||
|
+ val = RK3576_GMAC_CLK_RMII_DIV20;
|
||||||
|
+ else
|
||||||
|
+ val = RK3576_GMAC_CLK_RGMII_DIV50;
|
||||||
|
+ break;
|
||||||
|
+ case 100:
|
||||||
|
+ if (bsp_priv->phy_iface == PHY_INTERFACE_MODE_RMII)
|
||||||
|
+ val = RK3576_GMAC_CLK_RMII_DIV2;
|
||||||
|
+ else
|
||||||
|
+ val = RK3576_GMAC_CLK_RGMII_DIV5;
|
||||||
|
+ break;
|
||||||
|
+ case 1000:
|
||||||
|
+ if (bsp_priv->phy_iface != PHY_INTERFACE_MODE_RMII)
|
||||||
|
+ val = RK3576_GMAC_CLK_RGMII_DIV1;
|
||||||
|
+ else
|
||||||
|
+ goto err;
|
||||||
|
+ break;
|
||||||
|
+ default:
|
||||||
|
+ goto err;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ offset_con = bsp_priv->id == 1 ? RK3576_GRF_GMAC_CON1 :
|
||||||
|
+ RK3576_GRF_GMAC_CON0;
|
||||||
|
+
|
||||||
|
+ regmap_write(bsp_priv->grf, offset_con, val);
|
||||||
|
+
|
||||||
|
+ return;
|
||||||
|
+err:
|
||||||
|
+ dev_err(dev, "unknown speed value for GMAC speed=%d", speed);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void rk3576_set_clock_selection(struct rk_priv_data *bsp_priv, bool input,
|
||||||
|
+ bool enable)
|
||||||
|
+{
|
||||||
|
+ unsigned int val = input ? RK3576_GMAC_CLK_SELECT_IO :
|
||||||
|
+ RK3576_GMAC_CLK_SELECT_CRU;
|
||||||
|
+ unsigned int offset_con;
|
||||||
|
+
|
||||||
|
+ val |= enable ? RK3576_GMAC_CLK_RMII_NOGATE :
|
||||||
|
+ RK3576_GMAC_CLK_RMII_GATE;
|
||||||
|
+
|
||||||
|
+ offset_con = bsp_priv->id == 1 ? RK3576_GRF_GMAC_CON1 :
|
||||||
|
+ RK3576_GRF_GMAC_CON0;
|
||||||
|
+
|
||||||
|
+ regmap_write(bsp_priv->grf, offset_con, val);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static const struct rk_gmac_ops rk3576_ops = {
|
||||||
|
+ .set_to_rgmii = rk3576_set_to_rgmii,
|
||||||
|
+ .set_to_rmii = rk3576_set_to_rmii,
|
||||||
|
+ .set_rgmii_speed = rk3576_set_gmac_speed,
|
||||||
|
+ .set_rmii_speed = rk3576_set_gmac_speed,
|
||||||
|
+ .set_clock_selection = rk3576_set_clock_selection,
|
||||||
|
+ .regs_valid = true,
|
||||||
|
+ .regs = {
|
||||||
|
+ 0x2a220000, /* gmac0 */
|
||||||
|
+ 0x2a230000, /* gmac1 */
|
||||||
|
+ 0x0, /* sentinel */
|
||||||
|
+ },
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
/* sys_grf */
|
||||||
|
#define RK3588_GRF_GMAC_CON7 0X031c
|
||||||
|
#define RK3588_GRF_GMAC_CON8 0X0320
|
||||||
|
@@ -1914,6 +2069,7 @@ static const struct of_device_id rk_gmac
|
||||||
|
{ .compatible = "rockchip,rk3368-gmac", .data = &rk3368_ops },
|
||||||
|
{ .compatible = "rockchip,rk3399-gmac", .data = &rk3399_ops },
|
||||||
|
{ .compatible = "rockchip,rk3568-gmac", .data = &rk3568_ops },
|
||||||
|
+ { .compatible = "rockchip,rk3576-gmac", .data = &rk3576_ops },
|
||||||
|
{ .compatible = "rockchip,rk3588-gmac", .data = &rk3588_ops },
|
||||||
|
{ .compatible = "rockchip,rv1108-gmac", .data = &rv1108_ops },
|
||||||
|
{ .compatible = "rockchip,rv1126-gmac", .data = &rv1126_ops },
|
File diff suppressed because it is too large
Load Diff
@ -1,6 +1,6 @@
|
|||||||
--- a/arch/arm64/boot/dts/rockchip/Makefile
|
--- a/arch/arm64/boot/dts/rockchip/Makefile
|
||||||
+++ b/arch/arm64/boot/dts/rockchip/Makefile
|
+++ b/arch/arm64/boot/dts/rockchip/Makefile
|
||||||
@@ -38,6 +38,8 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-gr
|
@@ -39,6 +39,8 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-gr
|
||||||
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-gru-scarlet-dumo.dtb
|
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-gru-scarlet-dumo.dtb
|
||||||
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-gru-scarlet-inx.dtb
|
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-gru-scarlet-inx.dtb
|
||||||
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-gru-scarlet-kd.dtb
|
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-gru-scarlet-kd.dtb
|
||||||
@ -9,7 +9,7 @@
|
|||||||
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-hugsun-x99.dtb
|
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-hugsun-x99.dtb
|
||||||
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-khadas-edge.dtb
|
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-khadas-edge.dtb
|
||||||
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-khadas-edge-captain.dtb
|
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-khadas-edge-captain.dtb
|
||||||
@@ -59,6 +61,7 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-ro
|
@@ -60,6 +62,7 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-ro
|
||||||
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-roc-pc-plus.dtb
|
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-roc-pc-plus.dtb
|
||||||
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-rock-4c-plus.dtb
|
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-rock-4c-plus.dtb
|
||||||
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-rock-4se.dtb
|
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-rock-4se.dtb
|
||||||
|
@ -250,7 +250,7 @@ Signed-off-by: David Wu <david.wu@rock-chips.com>
|
|||||||
.set_rgmii_speed = rk3568_set_gmac_speed,
|
.set_rgmii_speed = rk3568_set_gmac_speed,
|
||||||
.set_rmii_speed = rk3568_set_gmac_speed,
|
.set_rmii_speed = rk3568_set_gmac_speed,
|
||||||
.regs_valid = true,
|
.regs_valid = true,
|
||||||
@@ -1580,7 +1750,7 @@ static int gmac_clk_enable(struct rk_pri
|
@@ -1735,7 +1905,7 @@ static int gmac_clk_enable(struct rk_pri
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -259,7 +259,7 @@ Signed-off-by: David Wu <david.wu@rock-chips.com>
|
|||||||
{
|
{
|
||||||
struct regulator *ldo = bsp_priv->regulator;
|
struct regulator *ldo = bsp_priv->regulator;
|
||||||
int ret;
|
int ret;
|
||||||
@@ -1679,6 +1849,18 @@ static struct rk_priv_data *rk_gmac_setu
|
@@ -1834,6 +2004,18 @@ static struct rk_priv_data *rk_gmac_setu
|
||||||
"rockchip,grf");
|
"rockchip,grf");
|
||||||
bsp_priv->php_grf = syscon_regmap_lookup_by_phandle(dev->of_node,
|
bsp_priv->php_grf = syscon_regmap_lookup_by_phandle(dev->of_node,
|
||||||
"rockchip,php-grf");
|
"rockchip,php-grf");
|
||||||
@ -278,7 +278,7 @@ Signed-off-by: David Wu <david.wu@rock-chips.com>
|
|||||||
|
|
||||||
if (plat->phy_node) {
|
if (plat->phy_node) {
|
||||||
bsp_priv->integrated_phy = of_property_read_bool(plat->phy_node,
|
bsp_priv->integrated_phy = of_property_read_bool(plat->phy_node,
|
||||||
@@ -1756,11 +1938,19 @@ static int rk_gmac_powerup(struct rk_pri
|
@@ -1911,11 +2093,19 @@ static int rk_gmac_powerup(struct rk_pri
|
||||||
dev_info(dev, "init for RMII\n");
|
dev_info(dev, "init for RMII\n");
|
||||||
bsp_priv->ops->set_to_rmii(bsp_priv);
|
bsp_priv->ops->set_to_rmii(bsp_priv);
|
||||||
break;
|
break;
|
||||||
@ -299,7 +299,7 @@ Signed-off-by: David Wu <david.wu@rock-chips.com>
|
|||||||
if (ret) {
|
if (ret) {
|
||||||
gmac_clk_enable(bsp_priv, false);
|
gmac_clk_enable(bsp_priv, false);
|
||||||
return ret;
|
return ret;
|
||||||
@@ -1781,7 +1971,7 @@ static void rk_gmac_powerdown(struct rk_
|
@@ -1936,7 +2126,7 @@ static void rk_gmac_powerdown(struct rk_
|
||||||
|
|
||||||
pm_runtime_put_sync(&gmac->pdev->dev);
|
pm_runtime_put_sync(&gmac->pdev->dev);
|
||||||
|
|
||||||
@ -308,7 +308,7 @@ Signed-off-by: David Wu <david.wu@rock-chips.com>
|
|||||||
gmac_clk_enable(gmac, false);
|
gmac_clk_enable(gmac, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1802,6 +1992,9 @@ static void rk_fix_speed(void *priv, uns
|
@@ -1957,6 +2147,9 @@ static void rk_fix_speed(void *priv, uns
|
||||||
if (bsp_priv->ops->set_rmii_speed)
|
if (bsp_priv->ops->set_rmii_speed)
|
||||||
bsp_priv->ops->set_rmii_speed(bsp_priv, speed);
|
bsp_priv->ops->set_rmii_speed(bsp_priv, speed);
|
||||||
break;
|
break;
|
||||||
|
@ -0,0 +1,375 @@
|
|||||||
|
From: Frank Wang <frawang.cn@gmail.com>
|
||||||
|
To: vkoul@kernel.org, kishon@kernel.org, robh@kernel.org,
|
||||||
|
krzk+dt@kernel.org, conor+dt@kernel.org, heiko@sntech.de
|
||||||
|
Cc: linux-phy@lists.infradead.org, devicetree@vger.kernel.org,
|
||||||
|
linux-arm-kernel@lists.infradead.org,
|
||||||
|
linux-kernel@vger.kernel.org, linux-rockchip@lists.infradead.org,
|
||||||
|
william.wu@rock-chips.com, tim.chen@rock-chips.com,
|
||||||
|
Kever Yang <kever.yang@rock-chips.com>,
|
||||||
|
Frank Wang <frank.wang@rock-chips.com>
|
||||||
|
Subject: [PATCH v3 2/2] phy: rockchip-naneng-combo: add rk3576 support
|
||||||
|
Date: Fri, 18 Oct 2024 14:25:26 +0800 [thread overview]
|
||||||
|
Message-ID: <20241018062526.33994-2-frawang.cn@gmail.com> (raw)
|
||||||
|
In-Reply-To: <20241018062526.33994-1-frawang.cn@gmail.com>
|
||||||
|
|
||||||
|
From: Kever Yang <kever.yang@rock-chips.com>
|
||||||
|
|
||||||
|
Rockchip RK3576 integrates two naneng-combo PHY, PHY0 is used for
|
||||||
|
PCIE and SATA, PHY1 is used for PCIE, SATA and USB3.
|
||||||
|
|
||||||
|
This adds device specific data support.
|
||||||
|
|
||||||
|
Signed-off-by: Kever Yang <kever.yang@rock-chips.com>
|
||||||
|
Signed-off-by: William Wu <william.wu@rock-chips.com>
|
||||||
|
Signed-off-by: Frank Wang <frank.wang@rock-chips.com>
|
||||||
|
---
|
||||||
|
Changelog:
|
||||||
|
v3:
|
||||||
|
- add detail commit contents.
|
||||||
|
- using FIELD_PREP() instead of bit shift.
|
||||||
|
- leave a blank line after each switch break case.
|
||||||
|
|
||||||
|
v2:
|
||||||
|
- using constants macro instead of magic values.
|
||||||
|
- add more comments for PHY tuning operations.
|
||||||
|
|
||||||
|
v1:
|
||||||
|
- https://patchwork.kernel.org/project/linux-phy/patch/20241015013351.4884-2-frawang.cn@gmail.com/
|
||||||
|
|
||||||
|
.../rockchip/phy-rockchip-naneng-combphy.c | 279 ++++++++++++++++++
|
||||||
|
1 file changed, 279 insertions(+)
|
||||||
|
|
||||||
|
--- a/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c
|
||||||
|
+++ b/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c
|
||||||
|
@@ -37,6 +37,10 @@
|
||||||
|
#define PHYREG8 0x1C
|
||||||
|
#define PHYREG8_SSC_EN BIT(4)
|
||||||
|
|
||||||
|
+#define PHYREG10 0x24
|
||||||
|
+#define PHYREG10_SSC_PCM_MASK GENMASK(3, 0)
|
||||||
|
+#define PHYREG10_SSC_PCM_3500PPM 7
|
||||||
|
+
|
||||||
|
#define PHYREG11 0x28
|
||||||
|
#define PHYREG11_SU_TRIM_0_7 0xF0
|
||||||
|
|
||||||
|
@@ -61,17 +65,26 @@
|
||||||
|
#define PHYREG16 0x3C
|
||||||
|
#define PHYREG16_SSC_CNT_VALUE 0x5f
|
||||||
|
|
||||||
|
+#define PHYREG17 0x40
|
||||||
|
+
|
||||||
|
#define PHYREG18 0x44
|
||||||
|
#define PHYREG18_PLL_LOOP 0x32
|
||||||
|
|
||||||
|
+#define PHYREG21 0x50
|
||||||
|
+#define PHYREG21_RX_SQUELCH_VAL 0x0D
|
||||||
|
+
|
||||||
|
#define PHYREG27 0x6C
|
||||||
|
#define PHYREG27_RX_TRIM_RK3588 0x4C
|
||||||
|
|
||||||
|
+#define PHYREG30 0x74
|
||||||
|
+
|
||||||
|
#define PHYREG32 0x7C
|
||||||
|
#define PHYREG32_SSC_MASK GENMASK(7, 4)
|
||||||
|
+#define PHYREG32_SSC_DIR_MASK GENMASK(5, 4)
|
||||||
|
#define PHYREG32_SSC_DIR_SHIFT 4
|
||||||
|
#define PHYREG32_SSC_UPWARD 0
|
||||||
|
#define PHYREG32_SSC_DOWNWARD 1
|
||||||
|
+#define PHYREG32_SSC_OFFSET_MASK GENMASK(7, 6)
|
||||||
|
#define PHYREG32_SSC_OFFSET_SHIFT 6
|
||||||
|
#define PHYREG32_SSC_OFFSET_500PPM 1
|
||||||
|
|
||||||
|
@@ -79,6 +92,7 @@
|
||||||
|
#define PHYREG33_PLL_KVCO_MASK GENMASK(4, 2)
|
||||||
|
#define PHYREG33_PLL_KVCO_SHIFT 2
|
||||||
|
#define PHYREG33_PLL_KVCO_VALUE 2
|
||||||
|
+#define PHYREG33_PLL_KVCO_VALUE_RK3576 4
|
||||||
|
|
||||||
|
struct rockchip_combphy_priv;
|
||||||
|
|
||||||
|
@@ -98,6 +112,7 @@ struct rockchip_combphy_grfcfg {
|
||||||
|
struct combphy_reg pipe_rxterm_set;
|
||||||
|
struct combphy_reg pipe_txelec_set;
|
||||||
|
struct combphy_reg pipe_txcomp_set;
|
||||||
|
+ struct combphy_reg pipe_clk_24m;
|
||||||
|
struct combphy_reg pipe_clk_25m;
|
||||||
|
struct combphy_reg pipe_clk_100m;
|
||||||
|
struct combphy_reg pipe_phymode_sel;
|
||||||
|
@@ -584,6 +599,266 @@ static const struct rockchip_combphy_cfg
|
||||||
|
.combphy_cfg = rk3568_combphy_cfg,
|
||||||
|
};
|
||||||
|
|
||||||
|
+static int rk3576_combphy_cfg(struct rockchip_combphy_priv *priv)
|
||||||
|
+{
|
||||||
|
+ const struct rockchip_combphy_grfcfg *cfg = priv->cfg->grfcfg;
|
||||||
|
+ unsigned long rate;
|
||||||
|
+ u32 val;
|
||||||
|
+
|
||||||
|
+ switch (priv->type) {
|
||||||
|
+ case PHY_TYPE_PCIE:
|
||||||
|
+ /* Set SSC downward spread spectrum */
|
||||||
|
+ val = FIELD_PREP(PHYREG32_SSC_MASK, PHYREG32_SSC_DOWNWARD);
|
||||||
|
+ rockchip_combphy_updatel(priv, PHYREG32_SSC_MASK, val, PHYREG32);
|
||||||
|
+
|
||||||
|
+ rockchip_combphy_param_write(priv->phy_grf, &cfg->con0_for_pcie, true);
|
||||||
|
+ rockchip_combphy_param_write(priv->phy_grf, &cfg->con1_for_pcie, true);
|
||||||
|
+ rockchip_combphy_param_write(priv->phy_grf, &cfg->con2_for_pcie, true);
|
||||||
|
+ rockchip_combphy_param_write(priv->phy_grf, &cfg->con3_for_pcie, true);
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
+ case PHY_TYPE_USB3:
|
||||||
|
+ /* Set SSC downward spread spectrum */
|
||||||
|
+ val = FIELD_PREP(PHYREG32_SSC_MASK, PHYREG32_SSC_DOWNWARD);
|
||||||
|
+ rockchip_combphy_updatel(priv, PHYREG32_SSC_MASK, val, PHYREG32);
|
||||||
|
+
|
||||||
|
+ /* Enable adaptive CTLE for USB3.0 Rx */
|
||||||
|
+ val = readl(priv->mmio + PHYREG15);
|
||||||
|
+ val |= PHYREG15_CTLE_EN;
|
||||||
|
+ writel(val, priv->mmio + PHYREG15);
|
||||||
|
+
|
||||||
|
+ /* Set PLL KVCO fine tuning signals */
|
||||||
|
+ rockchip_combphy_updatel(priv, PHYREG33_PLL_KVCO_MASK, BIT(3), PHYREG33);
|
||||||
|
+
|
||||||
|
+ /* Set PLL LPF R1 to su_trim[10:7]=1001 */
|
||||||
|
+ writel(PHYREG12_PLL_LPF_ADJ_VALUE, priv->mmio + PHYREG12);
|
||||||
|
+
|
||||||
|
+ /* Set PLL input clock divider 1/2 */
|
||||||
|
+ val = FIELD_PREP(PHYREG6_PLL_DIV_MASK, PHYREG6_PLL_DIV_2);
|
||||||
|
+ rockchip_combphy_updatel(priv, PHYREG6_PLL_DIV_MASK, val, PHYREG6);
|
||||||
|
+
|
||||||
|
+ /* Set PLL loop divider */
|
||||||
|
+ writel(PHYREG18_PLL_LOOP, priv->mmio + PHYREG18);
|
||||||
|
+
|
||||||
|
+ /* Set PLL KVCO to min and set PLL charge pump current to max */
|
||||||
|
+ writel(PHYREG11_SU_TRIM_0_7, priv->mmio + PHYREG11);
|
||||||
|
+
|
||||||
|
+ /* Set Rx squelch input filler bandwidth */
|
||||||
|
+ writel(PHYREG21_RX_SQUELCH_VAL, priv->mmio + PHYREG21);
|
||||||
|
+
|
||||||
|
+ rockchip_combphy_param_write(priv->phy_grf, &cfg->pipe_txcomp_sel, false);
|
||||||
|
+ rockchip_combphy_param_write(priv->phy_grf, &cfg->pipe_txelec_sel, false);
|
||||||
|
+ rockchip_combphy_param_write(priv->phy_grf, &cfg->usb_mode_set, true);
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
+ case PHY_TYPE_SATA:
|
||||||
|
+ /* Enable adaptive CTLE for SATA Rx */
|
||||||
|
+ val = readl(priv->mmio + PHYREG15);
|
||||||
|
+ val |= PHYREG15_CTLE_EN;
|
||||||
|
+ writel(val, priv->mmio + PHYREG15);
|
||||||
|
+
|
||||||
|
+ /* Set tx_rterm = 50 ohm and rx_rterm = 43.5 ohm */
|
||||||
|
+ val = PHYREG7_TX_RTERM_50OHM << PHYREG7_TX_RTERM_SHIFT;
|
||||||
|
+ val |= PHYREG7_RX_RTERM_44OHM << PHYREG7_RX_RTERM_SHIFT;
|
||||||
|
+ writel(val, priv->mmio + PHYREG7);
|
||||||
|
+
|
||||||
|
+ rockchip_combphy_param_write(priv->phy_grf, &cfg->con0_for_sata, true);
|
||||||
|
+ rockchip_combphy_param_write(priv->phy_grf, &cfg->con1_for_sata, true);
|
||||||
|
+ rockchip_combphy_param_write(priv->phy_grf, &cfg->con2_for_sata, true);
|
||||||
|
+ rockchip_combphy_param_write(priv->phy_grf, &cfg->con3_for_sata, true);
|
||||||
|
+ rockchip_combphy_param_write(priv->pipe_grf, &cfg->pipe_con0_for_sata, true);
|
||||||
|
+ rockchip_combphy_param_write(priv->pipe_grf, &cfg->pipe_con1_for_sata, true);
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
+ default:
|
||||||
|
+ dev_err(priv->dev, "incompatible PHY type\n");
|
||||||
|
+ return -EINVAL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ rate = clk_get_rate(priv->refclk);
|
||||||
|
+
|
||||||
|
+ switch (rate) {
|
||||||
|
+ case REF_CLOCK_24MHz:
|
||||||
|
+ rockchip_combphy_param_write(priv->phy_grf, &cfg->pipe_clk_24m, true);
|
||||||
|
+ if (priv->type == PHY_TYPE_USB3 || priv->type == PHY_TYPE_SATA) {
|
||||||
|
+ /* Set ssc_cnt[9:0]=0101111101 & 31.5KHz */
|
||||||
|
+ val = FIELD_PREP(PHYREG15_SSC_CNT_MASK, PHYREG15_SSC_CNT_VALUE);
|
||||||
|
+ rockchip_combphy_updatel(priv, PHYREG15_SSC_CNT_MASK,
|
||||||
|
+ val, PHYREG15);
|
||||||
|
+
|
||||||
|
+ writel(PHYREG16_SSC_CNT_VALUE, priv->mmio + PHYREG16);
|
||||||
|
+ } else if (priv->type == PHY_TYPE_PCIE) {
|
||||||
|
+ /* PLL KVCO tuning fine */
|
||||||
|
+ val = FIELD_PREP(PHYREG33_PLL_KVCO_MASK, PHYREG33_PLL_KVCO_VALUE_RK3576);
|
||||||
|
+ rockchip_combphy_updatel(priv, PHYREG33_PLL_KVCO_MASK,
|
||||||
|
+ val, PHYREG33);
|
||||||
|
+
|
||||||
|
+ /* Set up rx_pck invert and rx msb to disable */
|
||||||
|
+ writel(0x00, priv->mmio + PHYREG27);
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * Set up SU adjust signal:
|
||||||
|
+ * su_trim[7:0], PLL KVCO adjust bits[2:0] to min
|
||||||
|
+ * su_trim[15:8], PLL LPF R1 adujst bits[9:7]=3'b011
|
||||||
|
+ * su_trim[31:24], CKDRV adjust
|
||||||
|
+ */
|
||||||
|
+ writel(0x90, priv->mmio + PHYREG11);
|
||||||
|
+ writel(0x02, priv->mmio + PHYREG12);
|
||||||
|
+ writel(0x57, priv->mmio + PHYREG14);
|
||||||
|
+
|
||||||
|
+ writel(PHYREG16_SSC_CNT_VALUE, priv->mmio + PHYREG16);
|
||||||
|
+ }
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
+ case REF_CLOCK_25MHz:
|
||||||
|
+ rockchip_combphy_param_write(priv->phy_grf, &cfg->pipe_clk_25m, true);
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
+ case REF_CLOCK_100MHz:
|
||||||
|
+ rockchip_combphy_param_write(priv->phy_grf, &cfg->pipe_clk_100m, true);
|
||||||
|
+ if (priv->type == PHY_TYPE_PCIE) {
|
||||||
|
+ /* gate_tx_pck_sel length select work for L1SS */
|
||||||
|
+ writel(0xc0, priv->mmio + PHYREG30);
|
||||||
|
+
|
||||||
|
+ /* PLL KVCO tuning fine */
|
||||||
|
+ val = FIELD_PREP(PHYREG33_PLL_KVCO_MASK, PHYREG33_PLL_KVCO_VALUE_RK3576);
|
||||||
|
+ rockchip_combphy_updatel(priv, PHYREG33_PLL_KVCO_MASK,
|
||||||
|
+ val, PHYREG33);
|
||||||
|
+
|
||||||
|
+ /* Set up rx_trim: PLL LPF C1 85pf R1 1.25kohm */
|
||||||
|
+ writel(0x4c, priv->mmio + PHYREG27);
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * Set up SU adjust signal:
|
||||||
|
+ * su_trim[7:0], PLL KVCO adjust bits[2:0] to min
|
||||||
|
+ * su_trim[15:8], bypass PLL loop divider code, and
|
||||||
|
+ * PLL LPF R1 adujst bits[9:7]=3'b101
|
||||||
|
+ * su_trim[23:16], CKRCV adjust
|
||||||
|
+ * su_trim[31:24], CKDRV adjust
|
||||||
|
+ */
|
||||||
|
+ writel(0x90, priv->mmio + PHYREG11);
|
||||||
|
+ writel(0x43, priv->mmio + PHYREG12);
|
||||||
|
+ writel(0x88, priv->mmio + PHYREG13);
|
||||||
|
+ writel(0x56, priv->mmio + PHYREG14);
|
||||||
|
+ } else if (priv->type == PHY_TYPE_SATA) {
|
||||||
|
+ /* downward spread spectrum +500ppm */
|
||||||
|
+ val = FIELD_PREP(PHYREG32_SSC_DIR_MASK, PHYREG32_SSC_DOWNWARD);
|
||||||
|
+ val |= FIELD_PREP(PHYREG32_SSC_OFFSET_MASK, PHYREG32_SSC_OFFSET_500PPM);
|
||||||
|
+ rockchip_combphy_updatel(priv, PHYREG32_SSC_MASK, val, PHYREG32);
|
||||||
|
+
|
||||||
|
+ /* ssc ppm adjust to 3500ppm */
|
||||||
|
+ rockchip_combphy_updatel(priv, PHYREG10_SSC_PCM_MASK,
|
||||||
|
+ PHYREG10_SSC_PCM_3500PPM,
|
||||||
|
+ PHYREG10);
|
||||||
|
+ }
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
+ default:
|
||||||
|
+ dev_err(priv->dev, "Unsupported rate: %lu\n", rate);
|
||||||
|
+ return -EINVAL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (priv->ext_refclk) {
|
||||||
|
+ rockchip_combphy_param_write(priv->phy_grf, &cfg->pipe_clk_ext, true);
|
||||||
|
+ if (priv->type == PHY_TYPE_PCIE && rate == REF_CLOCK_100MHz) {
|
||||||
|
+ val = FIELD_PREP(PHYREG33_PLL_KVCO_MASK, PHYREG33_PLL_KVCO_VALUE_RK3576);
|
||||||
|
+ rockchip_combphy_updatel(priv, PHYREG33_PLL_KVCO_MASK,
|
||||||
|
+ val, PHYREG33);
|
||||||
|
+
|
||||||
|
+ /* Set up rx_trim: PLL LPF C1 85pf R1 2.5kohm */
|
||||||
|
+ writel(0x0c, priv->mmio + PHYREG27);
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * Set up SU adjust signal:
|
||||||
|
+ * su_trim[7:0], PLL KVCO adjust bits[2:0] to min
|
||||||
|
+ * su_trim[15:8], bypass PLL loop divider code, and
|
||||||
|
+ * PLL LPF R1 adujst bits[9:7]=3'b101.
|
||||||
|
+ * su_trim[23:16], CKRCV adjust
|
||||||
|
+ * su_trim[31:24], CKDRV adjust
|
||||||
|
+ */
|
||||||
|
+ writel(0x90, priv->mmio + PHYREG11);
|
||||||
|
+ writel(0x43, priv->mmio + PHYREG12);
|
||||||
|
+ writel(0x88, priv->mmio + PHYREG13);
|
||||||
|
+ writel(0x56, priv->mmio + PHYREG14);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (priv->enable_ssc) {
|
||||||
|
+ val = readl(priv->mmio + PHYREG8);
|
||||||
|
+ val |= PHYREG8_SSC_EN;
|
||||||
|
+ writel(val, priv->mmio + PHYREG8);
|
||||||
|
+
|
||||||
|
+ if (priv->type == PHY_TYPE_PCIE && rate == REF_CLOCK_24MHz) {
|
||||||
|
+ /* Set PLL loop divider */
|
||||||
|
+ writel(0x00, priv->mmio + PHYREG17);
|
||||||
|
+ writel(PHYREG18_PLL_LOOP, priv->mmio + PHYREG18);
|
||||||
|
+
|
||||||
|
+ /* Set up rx_pck invert and rx msb to disable */
|
||||||
|
+ writel(0x00, priv->mmio + PHYREG27);
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * Set up SU adjust signal:
|
||||||
|
+ * su_trim[7:0], PLL KVCO adjust bits[2:0] to min
|
||||||
|
+ * su_trim[15:8], PLL LPF R1 adujst bits[9:7]=3'b101
|
||||||
|
+ * su_trim[23:16], CKRCV adjust
|
||||||
|
+ * su_trim[31:24], CKDRV adjust
|
||||||
|
+ */
|
||||||
|
+ writel(0x90, priv->mmio + PHYREG11);
|
||||||
|
+ writel(0x02, priv->mmio + PHYREG12);
|
||||||
|
+ writel(0x08, priv->mmio + PHYREG13);
|
||||||
|
+ writel(0x57, priv->mmio + PHYREG14);
|
||||||
|
+ writel(0x40, priv->mmio + PHYREG15);
|
||||||
|
+
|
||||||
|
+ writel(PHYREG16_SSC_CNT_VALUE, priv->mmio + PHYREG16);
|
||||||
|
+
|
||||||
|
+ val = FIELD_PREP(PHYREG33_PLL_KVCO_MASK, PHYREG33_PLL_KVCO_VALUE_RK3576);
|
||||||
|
+ writel(val, priv->mmio + PHYREG33);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static const struct rockchip_combphy_grfcfg rk3576_combphy_grfcfgs = {
|
||||||
|
+ /* pipe-phy-grf */
|
||||||
|
+ .pcie_mode_set = { 0x0000, 5, 0, 0x00, 0x11 },
|
||||||
|
+ .usb_mode_set = { 0x0000, 5, 0, 0x00, 0x04 },
|
||||||
|
+ .pipe_rxterm_set = { 0x0000, 12, 12, 0x00, 0x01 },
|
||||||
|
+ .pipe_txelec_set = { 0x0004, 1, 1, 0x00, 0x01 },
|
||||||
|
+ .pipe_txcomp_set = { 0x0004, 4, 4, 0x00, 0x01 },
|
||||||
|
+ .pipe_clk_24m = { 0x0004, 14, 13, 0x00, 0x00 },
|
||||||
|
+ .pipe_clk_25m = { 0x0004, 14, 13, 0x00, 0x01 },
|
||||||
|
+ .pipe_clk_100m = { 0x0004, 14, 13, 0x00, 0x02 },
|
||||||
|
+ .pipe_phymode_sel = { 0x0008, 1, 1, 0x00, 0x01 },
|
||||||
|
+ .pipe_rate_sel = { 0x0008, 2, 2, 0x00, 0x01 },
|
||||||
|
+ .pipe_rxterm_sel = { 0x0008, 8, 8, 0x00, 0x01 },
|
||||||
|
+ .pipe_txelec_sel = { 0x0008, 12, 12, 0x00, 0x01 },
|
||||||
|
+ .pipe_txcomp_sel = { 0x0008, 15, 15, 0x00, 0x01 },
|
||||||
|
+ .pipe_clk_ext = { 0x000c, 9, 8, 0x02, 0x01 },
|
||||||
|
+ .pipe_phy_status = { 0x0034, 6, 6, 0x01, 0x00 },
|
||||||
|
+ .con0_for_pcie = { 0x0000, 15, 0, 0x00, 0x1000 },
|
||||||
|
+ .con1_for_pcie = { 0x0004, 15, 0, 0x00, 0x0000 },
|
||||||
|
+ .con2_for_pcie = { 0x0008, 15, 0, 0x00, 0x0101 },
|
||||||
|
+ .con3_for_pcie = { 0x000c, 15, 0, 0x00, 0x0200 },
|
||||||
|
+ .con0_for_sata = { 0x0000, 15, 0, 0x00, 0x0129 },
|
||||||
|
+ .con1_for_sata = { 0x0004, 15, 0, 0x00, 0x0000 },
|
||||||
|
+ .con2_for_sata = { 0x0008, 15, 0, 0x00, 0x80c1 },
|
||||||
|
+ .con3_for_sata = { 0x000c, 15, 0, 0x00, 0x0407 },
|
||||||
|
+ /* php-grf */
|
||||||
|
+ .pipe_con0_for_sata = { 0x001C, 2, 0, 0x00, 0x2 },
|
||||||
|
+ .pipe_con1_for_sata = { 0x0020, 2, 0, 0x00, 0x2 },
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static const struct rockchip_combphy_cfg rk3576_combphy_cfgs = {
|
||||||
|
+ .num_phys = 2,
|
||||||
|
+ .phy_ids = {
|
||||||
|
+ 0x2b050000,
|
||||||
|
+ 0x2b060000
|
||||||
|
+ },
|
||||||
|
+ .grfcfg = &rk3576_combphy_grfcfgs,
|
||||||
|
+ .combphy_cfg = rk3576_combphy_cfg,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
static int rk3588_combphy_cfg(struct rockchip_combphy_priv *priv)
|
||||||
|
{
|
||||||
|
const struct rockchip_combphy_grfcfg *cfg = priv->cfg->grfcfg;
|
||||||
|
@@ -776,6 +1051,10 @@ static const struct of_device_id rockchi
|
||||||
|
.data = &rk3568_combphy_cfgs,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
+ .compatible = "rockchip,rk3576-naneng-combphy",
|
||||||
|
+ .data = &rk3576_combphy_cfgs,
|
||||||
|
+ },
|
||||||
|
+ {
|
||||||
|
.compatible = "rockchip,rk3588-naneng-combphy",
|
||||||
|
.data = &rk3588_combphy_cfgs,
|
||||||
|
},
|
@ -35,7 +35,7 @@ to status_led in accordance with the board schematics.
|
|||||||
|
|
||||||
--- a/arch/arm64/boot/dts/rockchip/Makefile
|
--- a/arch/arm64/boot/dts/rockchip/Makefile
|
||||||
+++ b/arch/arm64/boot/dts/rockchip/Makefile
|
+++ b/arch/arm64/boot/dts/rockchip/Makefile
|
||||||
@@ -17,6 +17,7 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-ev
|
@@ -18,6 +18,7 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-na
|
||||||
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-nanopi-r2c-plus.dtb
|
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-nanopi-r2c-plus.dtb
|
||||||
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-nanopi-r2s.dtb
|
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-nanopi-r2s.dtb
|
||||||
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-nanopi-r2s-plus.dtb
|
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-nanopi-r2s-plus.dtb
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
--- a/arch/arm64/boot/dts/rockchip/Makefile
|
--- a/arch/arm64/boot/dts/rockchip/Makefile
|
||||||
+++ b/arch/arm64/boot/dts/rockchip/Makefile
|
+++ b/arch/arm64/boot/dts/rockchip/Makefile
|
||||||
@@ -81,10 +81,12 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-an
|
@@ -82,10 +82,12 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-an
|
||||||
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-anbernic-rg503.dtb
|
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-anbernic-rg503.dtb
|
||||||
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-pinenote-v1.1.dtb
|
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-pinenote-v1.1.dtb
|
||||||
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-pinenote-v1.2.dtb
|
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-pinenote-v1.2.dtb
|
||||||
@ -13,7 +13,7 @@
|
|||||||
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-soquartz-blade.dtb
|
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-soquartz-blade.dtb
|
||||||
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-soquartz-cm4.dtb
|
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-soquartz-cm4.dtb
|
||||||
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-soquartz-model-a.dtb
|
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-soquartz-model-a.dtb
|
||||||
@@ -98,9 +100,20 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3568-lu
|
@@ -99,9 +101,20 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3568-lu
|
||||||
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3568-nanopi-r5c.dtb
|
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3568-nanopi-r5c.dtb
|
||||||
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3568-nanopi-r5s.dtb
|
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3568-nanopi-r5s.dtb
|
||||||
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3568-odroid-m1.dtb
|
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3568-odroid-m1.dtb
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
--- a/arch/arm64/boot/dts/rockchip/Makefile
|
--- a/arch/arm64/boot/dts/rockchip/Makefile
|
||||||
+++ b/arch/arm64/boot/dts/rockchip/Makefile
|
+++ b/arch/arm64/boot/dts/rockchip/Makefile
|
||||||
@@ -68,6 +68,12 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-ro
|
@@ -69,6 +69,12 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-ro
|
||||||
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-rock-pi-4b.dtb
|
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-rock-pi-4b.dtb
|
||||||
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-rock-pi-4b-plus.dtb
|
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-rock-pi-4b-plus.dtb
|
||||||
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-rock-pi-4c.dtb
|
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-rock-pi-4c.dtb
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
--- a/arch/arm64/boot/dts/rockchip/Makefile
|
--- a/arch/arm64/boot/dts/rockchip/Makefile
|
||||||
+++ b/arch/arm64/boot/dts/rockchip/Makefile
|
+++ b/arch/arm64/boot/dts/rockchip/Makefile
|
||||||
@@ -80,6 +80,13 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-ro
|
@@ -81,6 +81,13 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-ro
|
||||||
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-sapphire.dtb
|
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-sapphire.dtb
|
||||||
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-sapphire-excavator.dtb
|
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-sapphire-excavator.dtb
|
||||||
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399pro-rock-pi-n10.dtb
|
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399pro-rock-pi-n10.dtb
|
||||||
|
@ -12,7 +12,7 @@ Change-Id: I2c1d32907168caf8a8afee6d1f742795b3d13536
|
|||||||
|
|
||||||
--- a/drivers/pinctrl/pinctrl-rockchip.c
|
--- a/drivers/pinctrl/pinctrl-rockchip.c
|
||||||
+++ b/drivers/pinctrl/pinctrl-rockchip.c
|
+++ b/drivers/pinctrl/pinctrl-rockchip.c
|
||||||
@@ -2005,6 +2005,150 @@ static int rk3568_calc_pull_reg_and_bit(
|
@@ -2036,6 +2036,150 @@ static int rk3568_calc_pull_reg_and_bit(
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -163,7 +163,7 @@ Change-Id: I2c1d32907168caf8a8afee6d1f742795b3d13536
|
|||||||
#define RK3568_DRV_PMU_OFFSET 0x70
|
#define RK3568_DRV_PMU_OFFSET 0x70
|
||||||
#define RK3568_DRV_GRF_OFFSET 0x200
|
#define RK3568_DRV_GRF_OFFSET 0x200
|
||||||
#define RK3568_DRV_BITS_PER_PIN 8
|
#define RK3568_DRV_BITS_PER_PIN 8
|
||||||
@@ -2328,6 +2472,10 @@ static int rockchip_set_drive_perpin(str
|
@@ -2495,6 +2639,10 @@ static int rockchip_set_drive_perpin(str
|
||||||
rmask_bits = RK3588_DRV_BITS_PER_PIN;
|
rmask_bits = RK3588_DRV_BITS_PER_PIN;
|
||||||
ret = strength;
|
ret = strength;
|
||||||
goto config;
|
goto config;
|
||||||
@ -174,31 +174,31 @@ Change-Id: I2c1d32907168caf8a8afee6d1f742795b3d13536
|
|||||||
} else if (ctrl->type == RK3568) {
|
} else if (ctrl->type == RK3568) {
|
||||||
rmask_bits = RK3568_DRV_BITS_PER_PIN;
|
rmask_bits = RK3568_DRV_BITS_PER_PIN;
|
||||||
ret = (1 << (strength + 1)) - 1;
|
ret = (1 << (strength + 1)) - 1;
|
||||||
@@ -2468,6 +2616,7 @@ static int rockchip_get_pull(struct rock
|
@@ -2639,6 +2787,7 @@ static int rockchip_get_pull(struct rock
|
||||||
case RK3328:
|
case RK3328:
|
||||||
case RK3368:
|
case RK3368:
|
||||||
case RK3399:
|
case RK3399:
|
||||||
+ case RK3528:
|
+ case RK3528:
|
||||||
case RK3568:
|
case RK3568:
|
||||||
|
case RK3576:
|
||||||
case RK3588:
|
case RK3588:
|
||||||
pull_type = bank->pull_type[pin_num / 8];
|
@@ -2699,6 +2848,7 @@ static int rockchip_set_pull(struct rock
|
||||||
@@ -2527,6 +2676,7 @@ static int rockchip_set_pull(struct rock
|
|
||||||
case RK3328:
|
case RK3328:
|
||||||
case RK3368:
|
case RK3368:
|
||||||
case RK3399:
|
case RK3399:
|
||||||
+ case RK3528:
|
+ case RK3528:
|
||||||
case RK3568:
|
case RK3568:
|
||||||
|
case RK3576:
|
||||||
case RK3588:
|
case RK3588:
|
||||||
pull_type = bank->pull_type[pin_num / 8];
|
@@ -2965,6 +3115,7 @@ static bool rockchip_pinconf_pull_valid(
|
||||||
@@ -2792,6 +2942,7 @@ static bool rockchip_pinconf_pull_valid(
|
|
||||||
case RK3328:
|
case RK3328:
|
||||||
case RK3368:
|
case RK3368:
|
||||||
case RK3399:
|
case RK3399:
|
||||||
+ case RK3528:
|
+ case RK3528:
|
||||||
case RK3568:
|
case RK3568:
|
||||||
|
case RK3576:
|
||||||
case RK3588:
|
case RK3588:
|
||||||
return (pull != PIN_CONFIG_BIAS_PULL_PIN_DEFAULT);
|
@@ -4091,6 +4242,49 @@ static struct rockchip_pin_ctrl rk3399_p
|
||||||
@@ -3917,6 +4068,49 @@ static struct rockchip_pin_ctrl rk3399_p
|
|
||||||
.drv_calc_reg = rk3399_calc_drv_reg_and_bit,
|
.drv_calc_reg = rk3399_calc_drv_reg_and_bit,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -248,7 +248,7 @@ Change-Id: I2c1d32907168caf8a8afee6d1f742795b3d13536
|
|||||||
static struct rockchip_pin_bank rk3568_pin_banks[] = {
|
static struct rockchip_pin_bank rk3568_pin_banks[] = {
|
||||||
PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU | IOMUX_WIDTH_4BIT,
|
PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU | IOMUX_WIDTH_4BIT,
|
||||||
IOMUX_SOURCE_PMU | IOMUX_WIDTH_4BIT,
|
IOMUX_SOURCE_PMU | IOMUX_WIDTH_4BIT,
|
||||||
@@ -4010,6 +4204,8 @@ static const struct of_device_id rockchi
|
@@ -4215,6 +4409,8 @@ static const struct of_device_id rockchi
|
||||||
.data = &rk3368_pin_ctrl },
|
.data = &rk3368_pin_ctrl },
|
||||||
{ .compatible = "rockchip,rk3399-pinctrl",
|
{ .compatible = "rockchip,rk3399-pinctrl",
|
||||||
.data = &rk3399_pin_ctrl },
|
.data = &rk3399_pin_ctrl },
|
||||||
@ -256,7 +256,7 @@ Change-Id: I2c1d32907168caf8a8afee6d1f742795b3d13536
|
|||||||
+ .data = &rk3528_pin_ctrl },
|
+ .data = &rk3528_pin_ctrl },
|
||||||
{ .compatible = "rockchip,rk3568-pinctrl",
|
{ .compatible = "rockchip,rk3568-pinctrl",
|
||||||
.data = &rk3568_pin_ctrl },
|
.data = &rk3568_pin_ctrl },
|
||||||
{ .compatible = "rockchip,rk3588-pinctrl",
|
{ .compatible = "rockchip,rk3576-pinctrl",
|
||||||
--- a/drivers/pinctrl/pinctrl-rockchip.h
|
--- a/drivers/pinctrl/pinctrl-rockchip.h
|
||||||
+++ b/drivers/pinctrl/pinctrl-rockchip.h
|
+++ b/drivers/pinctrl/pinctrl-rockchip.h
|
||||||
@@ -196,6 +196,7 @@ enum rockchip_pinctrl_type {
|
@@ -196,6 +196,7 @@ enum rockchip_pinctrl_type {
|
||||||
@ -265,5 +265,5 @@ Change-Id: I2c1d32907168caf8a8afee6d1f742795b3d13536
|
|||||||
RK3399,
|
RK3399,
|
||||||
+ RK3528,
|
+ RK3528,
|
||||||
RK3568,
|
RK3568,
|
||||||
|
RK3576,
|
||||||
RK3588,
|
RK3588,
|
||||||
};
|
|
||||||
|
@ -12,15 +12,15 @@ Change-Id: Ic57f7f3a564f7d71b680e3c435d0460474b5a4a0
|
|||||||
|
|
||||||
--- a/drivers/pmdomain/rockchip/pm-domains.c
|
--- a/drivers/pmdomain/rockchip/pm-domains.c
|
||||||
+++ b/drivers/pmdomain/rockchip/pm-domains.c
|
+++ b/drivers/pmdomain/rockchip/pm-domains.c
|
||||||
@@ -45,6 +45,7 @@ struct rockchip_domain_info {
|
@@ -47,6 +47,7 @@ struct rockchip_domain_info {
|
||||||
int req_w_mask;
|
int clk_ungate_mask;
|
||||||
int mem_status_mask;
|
int mem_status_mask;
|
||||||
int repair_status_mask;
|
int repair_status_mask;
|
||||||
+ bool always_on;
|
+ bool always_on;
|
||||||
u32 pwr_offset;
|
u32 pwr_offset;
|
||||||
u32 mem_offset;
|
u32 mem_offset;
|
||||||
u32 req_offset;
|
u32 req_offset;
|
||||||
@@ -612,6 +613,26 @@ static void rockchip_pd_detach_dev(struc
|
@@ -660,6 +661,26 @@ static void rockchip_pd_detach_dev(struc
|
||||||
pm_clk_destroy(dev);
|
pm_clk_destroy(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -47,7 +47,7 @@ Change-Id: Ic57f7f3a564f7d71b680e3c435d0460474b5a4a0
|
|||||||
static int rockchip_pm_add_one_domain(struct rockchip_pmu *pmu,
|
static int rockchip_pm_add_one_domain(struct rockchip_pmu *pmu,
|
||||||
struct device_node *node)
|
struct device_node *node)
|
||||||
{
|
{
|
||||||
@@ -730,6 +751,11 @@ static int rockchip_pm_add_one_domain(st
|
@@ -778,6 +799,11 @@ static int rockchip_pm_add_one_domain(st
|
||||||
pd->genpd.flags = GENPD_FLAG_PM_CLK;
|
pd->genpd.flags = GENPD_FLAG_PM_CLK;
|
||||||
if (pd_info->active_wakeup)
|
if (pd_info->active_wakeup)
|
||||||
pd->genpd.flags |= GENPD_FLAG_ACTIVE_WAKEUP;
|
pd->genpd.flags |= GENPD_FLAG_ACTIVE_WAKEUP;
|
||||||
|
@ -20,9 +20,9 @@ Change-Id: If024916eb7b52ec86ff7533aedefc1bda457b612
|
|||||||
#include <dt-bindings/power/rk3399-power.h>
|
#include <dt-bindings/power/rk3399-power.h>
|
||||||
+#include <dt-bindings/power/rk3528-power.h>
|
+#include <dt-bindings/power/rk3528-power.h>
|
||||||
#include <dt-bindings/power/rk3568-power.h>
|
#include <dt-bindings/power/rk3568-power.h>
|
||||||
|
#include <dt-bindings/power/rockchip,rk3576-power.h>
|
||||||
#include <dt-bindings/power/rk3588-power.h>
|
#include <dt-bindings/power/rk3588-power.h>
|
||||||
|
@@ -128,6 +129,20 @@ struct rockchip_pmu {
|
||||||
@@ -125,6 +126,20 @@ struct rockchip_pmu {
|
|
||||||
.active_wakeup = wakeup, \
|
.active_wakeup = wakeup, \
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -43,7 +43,7 @@ Change-Id: If024916eb7b52ec86ff7533aedefc1bda457b612
|
|||||||
#define DOMAIN_M_O_R(_name, p_offset, pwr, status, m_offset, m_status, r_status, r_offset, req, idle, ack, wakeup) \
|
#define DOMAIN_M_O_R(_name, p_offset, pwr, status, m_offset, m_status, r_status, r_offset, req, idle, ack, wakeup) \
|
||||||
{ \
|
{ \
|
||||||
.name = _name, \
|
.name = _name, \
|
||||||
@@ -171,6 +186,9 @@ struct rockchip_pmu {
|
@@ -193,6 +208,9 @@ struct rockchip_pmu {
|
||||||
#define DOMAIN_RK3399(name, pwr, status, req, wakeup) \
|
#define DOMAIN_RK3399(name, pwr, status, req, wakeup) \
|
||||||
DOMAIN(name, pwr, status, req, req, req, wakeup)
|
DOMAIN(name, pwr, status, req, req, req, wakeup)
|
||||||
|
|
||||||
@ -53,7 +53,7 @@ Change-Id: If024916eb7b52ec86ff7533aedefc1bda457b612
|
|||||||
#define DOMAIN_RK3568(name, pwr, req, wakeup) \
|
#define DOMAIN_RK3568(name, pwr, req, wakeup) \
|
||||||
DOMAIN_M(name, pwr, pwr, req, req, req, wakeup)
|
DOMAIN_M(name, pwr, pwr, req, req, req, wakeup)
|
||||||
|
|
||||||
@@ -1125,6 +1143,18 @@ static const struct rockchip_domain_info
|
@@ -1173,6 +1191,18 @@ static const struct rockchip_domain_info
|
||||||
[RK3399_PD_SDIOAUDIO] = DOMAIN_RK3399("sdioaudio", BIT(31), BIT(31), BIT(29), true),
|
[RK3399_PD_SDIOAUDIO] = DOMAIN_RK3399("sdioaudio", BIT(31), BIT(31), BIT(29), true),
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -72,7 +72,7 @@ Change-Id: If024916eb7b52ec86ff7533aedefc1bda457b612
|
|||||||
static const struct rockchip_domain_info rk3568_pm_domains[] = {
|
static const struct rockchip_domain_info rk3568_pm_domains[] = {
|
||||||
[RK3568_PD_NPU] = DOMAIN_RK3568("npu", BIT(1), BIT(2), false),
|
[RK3568_PD_NPU] = DOMAIN_RK3568("npu", BIT(1), BIT(2), false),
|
||||||
[RK3568_PD_GPU] = DOMAIN_RK3568("gpu", BIT(0), BIT(1), false),
|
[RK3568_PD_GPU] = DOMAIN_RK3568("gpu", BIT(0), BIT(1), false),
|
||||||
@@ -1304,6 +1334,17 @@ static const struct rockchip_pmu_info rk
|
@@ -1374,6 +1404,17 @@ static const struct rockchip_pmu_info rk
|
||||||
.domain_info = rk3399_pm_domains,
|
.domain_info = rk3399_pm_domains,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -90,7 +90,7 @@ Change-Id: If024916eb7b52ec86ff7533aedefc1bda457b612
|
|||||||
static const struct rockchip_pmu_info rk3568_pmu = {
|
static const struct rockchip_pmu_info rk3568_pmu = {
|
||||||
.pwr_offset = 0xa0,
|
.pwr_offset = 0xa0,
|
||||||
.status_offset = 0x98,
|
.status_offset = 0x98,
|
||||||
@@ -1387,6 +1428,10 @@ static const struct of_device_id rockchi
|
@@ -1473,6 +1514,10 @@ static const struct of_device_id rockchi
|
||||||
.data = (void *)&rk3399_pmu,
|
.data = (void *)&rk3399_pmu,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -79,12 +79,13 @@ Change-Id: I09745b6a31484d6a27f04e608268d9738c1fe224
|
|||||||
depends on ARM64 || COMPILE_TEST
|
depends on ARM64 || COMPILE_TEST
|
||||||
--- a/drivers/clk/rockchip/Makefile
|
--- a/drivers/clk/rockchip/Makefile
|
||||||
+++ b/drivers/clk/rockchip/Makefile
|
+++ b/drivers/clk/rockchip/Makefile
|
||||||
@@ -27,5 +27,6 @@ obj-$(CONFIG_CLK_RK3308) += clk-r
|
@@ -27,6 +27,7 @@ obj-$(CONFIG_CLK_RK3308) += clk-r
|
||||||
obj-$(CONFIG_CLK_RK3328) += clk-rk3328.o
|
obj-$(CONFIG_CLK_RK3328) += clk-rk3328.o
|
||||||
obj-$(CONFIG_CLK_RK3368) += clk-rk3368.o
|
obj-$(CONFIG_CLK_RK3368) += clk-rk3368.o
|
||||||
obj-$(CONFIG_CLK_RK3399) += clk-rk3399.o
|
obj-$(CONFIG_CLK_RK3399) += clk-rk3399.o
|
||||||
+obj-$(CONFIG_CLK_RK3528) += clk-rk3528.o
|
+obj-$(CONFIG_CLK_RK3528) += clk-rk3528.o
|
||||||
obj-$(CONFIG_CLK_RK3568) += clk-rk3568.o
|
obj-$(CONFIG_CLK_RK3568) += clk-rk3568.o
|
||||||
|
obj-$(CONFIG_CLK_RK3576) += clk-rk3576.o rst-rk3576.o
|
||||||
obj-$(CONFIG_CLK_RK3588) += clk-rk3588.o rst-rk3588.o
|
obj-$(CONFIG_CLK_RK3588) += clk-rk3588.o rst-rk3588.o
|
||||||
--- a/drivers/clk/rockchip/clk.c
|
--- a/drivers/clk/rockchip/clk.c
|
||||||
+++ b/drivers/clk/rockchip/clk.c
|
+++ b/drivers/clk/rockchip/clk.c
|
||||||
@ -140,7 +141,7 @@ Change-Id: I09745b6a31484d6a27f04e608268d9738c1fe224
|
|||||||
#define RK3568_PLL_CON(x) RK2928_PLL_CON(x)
|
#define RK3568_PLL_CON(x) RK2928_PLL_CON(x)
|
||||||
#define RK3568_MODE_CON0 0xc0
|
#define RK3568_MODE_CON0 0xc0
|
||||||
#define RK3568_MISC_CON0 0xc4
|
#define RK3568_MISC_CON0 0xc4
|
||||||
@@ -408,6 +436,7 @@ struct rockchip_pll_clock {
|
@@ -461,6 +489,7 @@ struct rockchip_pll_clock {
|
||||||
};
|
};
|
||||||
|
|
||||||
#define ROCKCHIP_PLL_SYNC_RATE BIT(0)
|
#define ROCKCHIP_PLL_SYNC_RATE BIT(0)
|
||||||
@ -148,7 +149,7 @@ Change-Id: I09745b6a31484d6a27f04e608268d9738c1fe224
|
|||||||
|
|
||||||
#define PLL(_type, _id, _name, _pnames, _flags, _con, _mode, _mshift, \
|
#define PLL(_type, _id, _name, _pnames, _flags, _con, _mode, _mshift, \
|
||||||
_lshift, _pflags, _rtable) \
|
_lshift, _pflags, _rtable) \
|
||||||
@@ -516,6 +545,7 @@ enum rockchip_clk_branch_type {
|
@@ -569,6 +598,7 @@ enum rockchip_clk_branch_type {
|
||||||
branch_muxgrf,
|
branch_muxgrf,
|
||||||
branch_divider,
|
branch_divider,
|
||||||
branch_fraction_divider,
|
branch_fraction_divider,
|
||||||
@ -156,7 +157,7 @@ Change-Id: I09745b6a31484d6a27f04e608268d9738c1fe224
|
|||||||
branch_gate,
|
branch_gate,
|
||||||
branch_mmc,
|
branch_mmc,
|
||||||
branch_inverter,
|
branch_inverter,
|
||||||
@@ -836,6 +866,19 @@ struct rockchip_clk_branch {
|
@@ -889,6 +919,19 @@ struct rockchip_clk_branch {
|
||||||
.name = cname, \
|
.name = cname, \
|
||||||
.parent_names = (const char *[]){ pname }, \
|
.parent_names = (const char *[]){ pname }, \
|
||||||
.num_parents = 1, \
|
.num_parents = 1, \
|
||||||
|
@ -217,11 +217,11 @@ Change-Id: I8a69a1239ed3ae91bfe44c96287210da758f9cf9
|
|||||||
#define RK3568_GRF_GMAC0_CON0 0x0380
|
#define RK3568_GRF_GMAC0_CON0 0x0380
|
||||||
#define RK3568_GRF_GMAC0_CON1 0x0384
|
#define RK3568_GRF_GMAC0_CON1 0x0384
|
||||||
#define RK3568_GRF_GMAC1_CON0 0x0388
|
#define RK3568_GRF_GMAC1_CON0 0x0388
|
||||||
@@ -2106,6 +2301,7 @@ static const struct of_device_id rk_gmac
|
@@ -2261,6 +2456,7 @@ static const struct of_device_id rk_gmac
|
||||||
{ .compatible = "rockchip,rk3366-gmac", .data = &rk3366_ops },
|
{ .compatible = "rockchip,rk3366-gmac", .data = &rk3366_ops },
|
||||||
{ .compatible = "rockchip,rk3368-gmac", .data = &rk3368_ops },
|
{ .compatible = "rockchip,rk3368-gmac", .data = &rk3368_ops },
|
||||||
{ .compatible = "rockchip,rk3399-gmac", .data = &rk3399_ops },
|
{ .compatible = "rockchip,rk3399-gmac", .data = &rk3399_ops },
|
||||||
+ { .compatible = "rockchip,rk3528-gmac", .data = &rk3528_ops },
|
+ { .compatible = "rockchip,rk3528-gmac", .data = &rk3528_ops },
|
||||||
{ .compatible = "rockchip,rk3568-gmac", .data = &rk3568_ops },
|
{ .compatible = "rockchip,rk3568-gmac", .data = &rk3568_ops },
|
||||||
|
{ .compatible = "rockchip,rk3576-gmac", .data = &rk3576_ops },
|
||||||
{ .compatible = "rockchip,rk3588-gmac", .data = &rk3588_ops },
|
{ .compatible = "rockchip,rk3588-gmac", .data = &rk3588_ops },
|
||||||
{ .compatible = "rockchip,rv1108-gmac", .data = &rv1108_ops },
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
--- a/drivers/phy/rockchip/phy-rockchip-inno-usb2.c
|
--- a/drivers/phy/rockchip/phy-rockchip-inno-usb2.c
|
||||||
+++ b/drivers/phy/rockchip/phy-rockchip-inno-usb2.c
|
+++ b/drivers/phy/rockchip/phy-rockchip-inno-usb2.c
|
||||||
@@ -1761,6 +1761,53 @@ static const struct rockchip_usb2phy_cfg
|
@@ -1813,6 +1813,53 @@ static const struct rockchip_usb2phy_cfg
|
||||||
{ /* sentinel */ }
|
{ /* sentinel */ }
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -54,11 +54,11 @@
|
|||||||
static const struct rockchip_usb2phy_cfg rk3568_phy_cfgs[] = {
|
static const struct rockchip_usb2phy_cfg rk3568_phy_cfgs[] = {
|
||||||
{
|
{
|
||||||
.reg = 0xfe8a0000,
|
.reg = 0xfe8a0000,
|
||||||
@@ -1997,6 +2044,7 @@ static const struct of_device_id rockchi
|
@@ -2127,6 +2174,7 @@ static const struct of_device_id rockchi
|
||||||
{ .compatible = "rockchip,rk3328-usb2phy", .data = &rk3328_phy_cfgs },
|
{ .compatible = "rockchip,rk3328-usb2phy", .data = &rk3328_phy_cfgs },
|
||||||
{ .compatible = "rockchip,rk3366-usb2phy", .data = &rk3366_phy_cfgs },
|
{ .compatible = "rockchip,rk3366-usb2phy", .data = &rk3366_phy_cfgs },
|
||||||
{ .compatible = "rockchip,rk3399-usb2phy", .data = &rk3399_phy_cfgs },
|
{ .compatible = "rockchip,rk3399-usb2phy", .data = &rk3399_phy_cfgs },
|
||||||
+ { .compatible = "rockchip,rk3528-usb2phy", .data = &rk3528_phy_cfgs },
|
+ { .compatible = "rockchip,rk3528-usb2phy", .data = &rk3528_phy_cfgs },
|
||||||
{ .compatible = "rockchip,rk3568-usb2phy", .data = &rk3568_phy_cfgs },
|
{ .compatible = "rockchip,rk3568-usb2phy", .data = &rk3568_phy_cfgs },
|
||||||
|
{ .compatible = "rockchip,rk3576-usb2phy", .data = &rk3576_phy_cfgs },
|
||||||
{ .compatible = "rockchip,rk3588-usb2phy", .data = &rk3588_phy_cfgs },
|
{ .compatible = "rockchip,rk3588-usb2phy", .data = &rk3588_phy_cfgs },
|
||||||
{ .compatible = "rockchip,rv1108-usb2phy", .data = &rv1108_phy_cfgs },
|
|
||||||
|
@ -19,7 +19,7 @@ Signed-off-by: Jianwei Zheng <jianwei.zheng@rock-chips.com>
|
|||||||
|
|
||||||
--- a/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c
|
--- a/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c
|
||||||
+++ b/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c
|
+++ b/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c
|
||||||
@@ -83,7 +83,7 @@
|
@@ -97,7 +97,7 @@
|
||||||
struct rockchip_combphy_priv;
|
struct rockchip_combphy_priv;
|
||||||
|
|
||||||
struct combphy_reg {
|
struct combphy_reg {
|
||||||
@ -28,7 +28,7 @@ Signed-off-by: Jianwei Zheng <jianwei.zheng@rock-chips.com>
|
|||||||
u16 bitend;
|
u16 bitend;
|
||||||
u16 bitstart;
|
u16 bitstart;
|
||||||
u16 disable;
|
u16 disable;
|
||||||
@@ -93,11 +93,13 @@ struct combphy_reg {
|
@@ -107,6 +107,7 @@ struct combphy_reg {
|
||||||
struct rockchip_combphy_grfcfg {
|
struct rockchip_combphy_grfcfg {
|
||||||
struct combphy_reg pcie_mode_set;
|
struct combphy_reg pcie_mode_set;
|
||||||
struct combphy_reg usb_mode_set;
|
struct combphy_reg usb_mode_set;
|
||||||
@ -36,13 +36,7 @@ Signed-off-by: Jianwei Zheng <jianwei.zheng@rock-chips.com>
|
|||||||
struct combphy_reg sgmii_mode_set;
|
struct combphy_reg sgmii_mode_set;
|
||||||
struct combphy_reg qsgmii_mode_set;
|
struct combphy_reg qsgmii_mode_set;
|
||||||
struct combphy_reg pipe_rxterm_set;
|
struct combphy_reg pipe_rxterm_set;
|
||||||
struct combphy_reg pipe_txelec_set;
|
@@ -393,6 +394,120 @@ static int rockchip_combphy_probe(struct
|
||||||
struct combphy_reg pipe_txcomp_set;
|
|
||||||
+ struct combphy_reg pipe_clk_24m;
|
|
||||||
struct combphy_reg pipe_clk_25m;
|
|
||||||
struct combphy_reg pipe_clk_100m;
|
|
||||||
struct combphy_reg pipe_phymode_sel;
|
|
||||||
@@ -378,6 +380,120 @@ static int rockchip_combphy_probe(struct
|
|
||||||
return PTR_ERR_OR_ZERO(phy_provider);
|
return PTR_ERR_OR_ZERO(phy_provider);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -163,7 +157,7 @@ Signed-off-by: Jianwei Zheng <jianwei.zheng@rock-chips.com>
|
|||||||
static int rk3568_combphy_cfg(struct rockchip_combphy_priv *priv)
|
static int rk3568_combphy_cfg(struct rockchip_combphy_priv *priv)
|
||||||
{
|
{
|
||||||
const struct rockchip_combphy_grfcfg *cfg = priv->cfg->grfcfg;
|
const struct rockchip_combphy_grfcfg *cfg = priv->cfg->grfcfg;
|
||||||
@@ -772,6 +888,10 @@ static const struct rockchip_combphy_cfg
|
@@ -1047,6 +1162,10 @@ static const struct rockchip_combphy_cfg
|
||||||
|
|
||||||
static const struct of_device_id rockchip_combphy_of_match[] = {
|
static const struct of_device_id rockchip_combphy_of_match[] = {
|
||||||
{
|
{
|
||||||
|
@ -17,16 +17,16 @@ Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
|
|||||||
|
|
||||||
--- a/drivers/mmc/host/dw_mmc-rockchip.c
|
--- a/drivers/mmc/host/dw_mmc-rockchip.c
|
||||||
+++ b/drivers/mmc/host/dw_mmc-rockchip.c
|
+++ b/drivers/mmc/host/dw_mmc-rockchip.c
|
||||||
@@ -24,6 +24,8 @@ struct dw_mci_rockchip_priv_data {
|
@@ -35,6 +35,8 @@ struct dw_mci_rockchip_priv_data {
|
||||||
struct clk *sample_clk;
|
|
||||||
int default_sample_phase;
|
int default_sample_phase;
|
||||||
int num_phases;
|
int num_phases;
|
||||||
|
bool internal_phase;
|
||||||
+ int last_degree;
|
+ int last_degree;
|
||||||
+ bool use_v2_tuning;
|
+ bool use_v2_tuning;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void dw_mci_rk3288_set_ios(struct dw_mci *host, struct mmc_ios *ios)
|
/*
|
||||||
@@ -134,6 +136,58 @@ static void dw_mci_rk3288_set_ios(struct
|
@@ -279,6 +281,58 @@ static void dw_mci_rk3288_set_ios(struct
|
||||||
#define TUNING_ITERATION_TO_PHASE(i, num_phases) \
|
#define TUNING_ITERATION_TO_PHASE(i, num_phases) \
|
||||||
(DIV_ROUND_UP((i) * 360, num_phases))
|
(DIV_ROUND_UP((i) * 360, num_phases))
|
||||||
|
|
||||||
@ -85,7 +85,7 @@ Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
|
|||||||
static int dw_mci_rk3288_execute_tuning(struct dw_mci_slot *slot, u32 opcode)
|
static int dw_mci_rk3288_execute_tuning(struct dw_mci_slot *slot, u32 opcode)
|
||||||
{
|
{
|
||||||
struct dw_mci *host = slot->host;
|
struct dw_mci *host = slot->host;
|
||||||
@@ -157,6 +211,12 @@ static int dw_mci_rk3288_execute_tuning(
|
@@ -303,6 +357,12 @@ static int dw_mci_rk3288_execute_tuning(
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -98,9 +98,17 @@ Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
|
|||||||
ranges = kmalloc_array(priv->num_phases / 2 + 1,
|
ranges = kmalloc_array(priv->num_phases / 2 + 1,
|
||||||
sizeof(*ranges), GFP_KERNEL);
|
sizeof(*ranges), GFP_KERNEL);
|
||||||
if (!ranges)
|
if (!ranges)
|
||||||
@@ -277,6 +337,9 @@ static int dw_mci_rk3288_parse_dt(struct
|
@@ -431,6 +491,7 @@ static int dw_mci_common_parse_dt(struct
|
||||||
&priv->default_sample_phase))
|
|
||||||
priv->default_sample_phase = 0;
|
static int dw_mci_rk3288_parse_dt(struct dw_mci *host)
|
||||||
|
{
|
||||||
|
+ struct device_node *np = host->dev->of_node;
|
||||||
|
struct dw_mci_rockchip_priv_data *priv;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
@@ -440,6 +501,9 @@ static int dw_mci_rk3288_parse_dt(struct
|
||||||
|
|
||||||
|
priv = host->priv;
|
||||||
|
|
||||||
+ if (of_property_read_bool(np, "rockchip,use-v2-tuning"))
|
+ if (of_property_read_bool(np, "rockchip,use-v2-tuning"))
|
||||||
+ priv->use_v2_tuning = true;
|
+ priv->use_v2_tuning = true;
|
||||||
|
@ -179,7 +179,7 @@ Signed-off-by: hmz007 <hmz007@gmail.com>
|
|||||||
GATE(0, "clk_ddrupctl", "clk_ddr", CLK_IGNORE_UNUSED,
|
GATE(0, "clk_ddrupctl", "clk_ddr", CLK_IGNORE_UNUSED,
|
||||||
--- a/drivers/clk/rockchip/clk.h
|
--- a/drivers/clk/rockchip/clk.h
|
||||||
+++ b/drivers/clk/rockchip/clk.h
|
+++ b/drivers/clk/rockchip/clk.h
|
||||||
@@ -515,7 +515,8 @@ struct clk *rockchip_clk_register_mmc(co
|
@@ -568,7 +568,8 @@ struct clk *rockchip_clk_register_mmc(co
|
||||||
* DDRCLK flags, including method of setting the rate
|
* DDRCLK flags, including method of setting the rate
|
||||||
* ROCKCHIP_DDRCLK_SIP: use SIP call to bl31 to change ddrclk rate.
|
* ROCKCHIP_DDRCLK_SIP: use SIP call to bl31 to change ddrclk rate.
|
||||||
*/
|
*/
|
||||||
|
@ -9,7 +9,7 @@ Signed-off-by: hmz007 <hmz007@gmail.com>
|
|||||||
|
|
||||||
--- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi
|
--- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi
|
||||||
+++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi
|
+++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi
|
||||||
@@ -1034,6 +1034,13 @@
|
@@ -1033,6 +1033,13 @@
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user