Files
pmaports-rtwo/device/community/linux-pine64-pinephonepro/megi_patches/0062-phy-rockchip-inno-usb2-Add-support-for-RV1106-RV1103.patch
T

164 lines
5.8 KiB
Diff

From 1f8ae7f533822f0195a942b255bb5107b414a615 Mon Sep 17 00:00:00 2001
From: Ondrej Jirman <megi@xff.cz>
Date: Fri, 21 Jun 2024 01:42:38 +0200
Subject: [PATCH 62/90] phy: rockchip-inno-usb2: Add support for RV1106/RV1103
Ported from BSP driver.
Signed-off-by: Ondrej Jirman <megi@xff.cz>
---
drivers/phy/rockchip/phy-rockchip-inno-usb2.c | 102 ++++++++++++++++++
1 file changed, 102 insertions(+)
diff --git a/drivers/phy/rockchip/phy-rockchip-inno-usb2.c b/drivers/phy/rockchip/phy-rockchip-inno-usb2.c
index 7d8a533f24ae..7831e2993b9f 100644
--- a/drivers/phy/rockchip/phy-rockchip-inno-usb2.c
+++ b/drivers/phy/rockchip/phy-rockchip-inno-usb2.c
@@ -143,6 +143,7 @@ struct rockchip_usb2phy_port_cfg {
struct usb2phy_reg bvalid_det_en;
struct usb2phy_reg bvalid_det_st;
struct usb2phy_reg bvalid_det_clr;
+ struct usb2phy_reg bvalid_grf_sel;
struct usb2phy_reg disfall_en;
struct usb2phy_reg disfall_st;
struct usb2phy_reg disfall_clr;
@@ -1291,6 +1292,7 @@ static int rockchip_usb2phy_otg_port_init(struct rockchip_usb2phy *rphy,
struct rockchip_usb2phy_port *rport,
struct device_node *child_np)
{
+ struct regmap *base = rphy->grf;
int ret, id;
rport->port_id = USB2PHY_PORT_OTG;
@@ -1324,6 +1326,23 @@ static int rockchip_usb2phy_otg_port_init(struct rockchip_usb2phy *rphy,
goto out;
}
+ /*
+ * Set the utmi bvalid come from the usb phy or grf.
+ * For most of Rockchip SoCs, them have VBUSDET pin
+ * for the usb phy to detect the USB VBUS and set
+ * the bvalid signal, so select the bvalid from the
+ * usb phy by default. And for those SoCs which don't
+ * have VBUSDET pin (e.g. RV1103), it needs to select
+ * the bvaid from the grf and set bvalid to be valid
+ * (high) by default.
+ */
+ if (rport->port_cfg->bvalid_grf_sel.enable != 0) {
+ if (of_machine_is_compatible("rockchip,rv1103"))
+ property_enable(base, &rport->port_cfg->bvalid_grf_sel, true);
+ else
+ property_enable(base, &rport->port_cfg->bvalid_grf_sel, false);
+ }
+
if (!IS_ERR(rphy->edev)) {
rport->event_nb.notifier_call = rockchip_otg_event;
@@ -1504,6 +1523,40 @@ static int rockchip_usb2phy_probe(struct platform_device *pdev)
return ret;
}
+static int rv1106_usb2phy_tuning(struct rockchip_usb2phy *rphy)
+{
+ int ret = 0;
+
+ /* Always enable pre-emphasis in SOF & EOP & chirp & non-chirp state */
+ ret |= regmap_update_bits(rphy->phy_base, 0x30, GENMASK(2, 0), 0x07);
+
+// if (rockchip_get_cpu_version()) {
+// /* Set Tx HS pre_emphasize strength to 3'b001 */
+// ret |= regmap_update_bits(rphy->phy_base, 0x40, GENMASK(5, 3), (0x01 << 3));
+// } else {
+ /* Set Tx HS pre_emphasize strength to 3'b011 */
+ ret |= regmap_update_bits(rphy->phy_base, 0x40, GENMASK(5, 3), (0x03 << 3));
+// }
+
+ /* Set RX Squelch trigger point configure to 4'b0000(112.5 mV) */
+ ret |= regmap_update_bits(rphy->phy_base, 0x64, GENMASK(6, 3), (0x00 << 3));
+
+ /* Turn off differential receiver by default to save power */
+ ret |= regmap_clear_bits(rphy->phy_base, 0x100, BIT(6));
+
+ /* Set 45ohm HS ODT value to 5'b10111 to increase driver strength */
+ ret |= regmap_update_bits(rphy->phy_base, 0x11c, GENMASK(4, 0), 0x17);
+
+ /* Set Tx HS eye height tuning to 3'b011(462 mV)*/
+ ret |= regmap_update_bits(rphy->phy_base, 0x124, GENMASK(4, 2), (0x03 << 2));
+
+ /* Bypass Squelch detector calibration */
+ ret |= regmap_update_bits(rphy->phy_base, 0x1a4, GENMASK(7, 4), (0x01 << 4));
+ ret |= regmap_update_bits(rphy->phy_base, 0x1b4, GENMASK(7, 4), (0x01 << 4));
+
+ return ret;
+}
+
static int rk3128_usb2phy_tuning(struct rockchip_usb2phy *rphy)
{
/* Turn off differential receiver in suspend mode */
@@ -2324,6 +2377,54 @@ static const struct rockchip_usb2phy_cfg rk3588_phy_cfgs[] = {
{ /* sentinel */ }
};
+static const struct rockchip_usb2phy_cfg rv1106_phy_cfgs[] = {
+ {
+ .reg = 0xff3e0000,
+ .num_ports = 1,
+ .phy_tuning = rv1106_usb2phy_tuning,
+ .clkout_ctl = { 0x0058, 4, 4, 1, 0 },
+ .port_cfgs = {
+ [USB2PHY_PORT_OTG] = {
+ .phy_sus = { 0x0050, 8, 0, 0, 0x1d1 },
+ .bvalid_det_en = { 0x0100, 2, 2, 0, 1 },
+ .bvalid_det_st = { 0x0104, 2, 2, 0, 1 },
+ .bvalid_det_clr = { 0x0108, 2, 2, 0, 1 },
+ .bvalid_grf_sel = { 0x0058, 15, 14, 0, 3 },
+ /*
+ .iddig_output = { 0x0050, 10, 10, 0, 1 },
+ .iddig_en = { 0x0050, 9, 9, 0, 1 },
+ */
+ .idfall_det_en = { 0x0100, 5, 5, 0, 1 },
+ .idfall_det_st = { 0x0104, 5, 5, 0, 1 },
+ .idfall_det_clr = { 0x0108, 5, 5, 0, 1 },
+ .idrise_det_en = { 0x0100, 4, 4, 0, 1 },
+ .idrise_det_st = { 0x0104, 4, 4, 0, 1 },
+ .idrise_det_clr = { 0x0108, 4, 4, 0, 1 },
+ .ls_det_en = { 0x0100, 0, 0, 0, 1 },
+ .ls_det_st = { 0x0104, 0, 0, 0, 1 },
+ .ls_det_clr = { 0x0108, 0, 0, 0, 1 },
+ .utmi_avalid = { 0x0060, 10, 10, 0, 1 },
+ .utmi_bvalid = { 0x0060, 9, 9, 0, 1 },
+ //.utmi_iddig = { 0x0060, 6, 6, 0, 1 },
+ .utmi_ls = { 0x0060, 5, 4, 0, 1 },
+ },
+ },
+ .chg_det = {
+ //.chg_mode = { 0x0050, 8, 0, 0, 0x1d7 },
+ .cp_det = { 0x0060, 13, 13, 0, 1 },
+ .dcp_det = { 0x0060, 12, 12, 0, 1 },
+ .dp_det = { 0x0060, 14, 14, 0, 1 },
+ .idm_sink_en = { 0x0058, 8, 8, 0, 1 },
+ .idp_sink_en = { 0x0058, 7, 7, 0, 1 },
+ .idp_src_en = { 0x0058, 9, 9, 0, 1 },
+ .rdm_pdwn_en = { 0x0058, 10, 10, 0, 1 },
+ .vdm_src_en = { 0x0058, 12, 12, 0, 1 },
+ .vdp_src_en = { 0x0058, 11, 11, 0, 1 },
+ },
+ },
+ { /* sentinel */ }
+};
+
static const struct rockchip_usb2phy_cfg rv1108_phy_cfgs[] = {
{
.reg = 0x100,
@@ -2381,6 +2482,7 @@ static const struct of_device_id rockchip_usb2phy_dt_match[] = {
{ .compatible = "rockchip,rk3576-usb2phy", .data = &rk3576_phy_cfgs },
{ .compatible = "rockchip,rk3588-usb2phy", .data = &rk3588_phy_cfgs },
{ .compatible = "rockchip,rv1108-usb2phy", .data = &rv1108_phy_cfgs },
+ { .compatible = "rockchip,rv1106-usb2phy", .data = &rv1106_phy_cfgs },
{}
};
MODULE_DEVICE_TABLE(of, rockchip_usb2phy_dt_match);
--
2.55.0