xref: /rk3399_rockchip-uboot/drivers/phy/phy-rockchip-inno-usb2.c (revision 8abfec86d2d0f87e330fb3ec3ebcda0ac8846d8c)
1f0c40dcdSWu Liang feng /*
2f0c40dcdSWu Liang feng  * Copyright 2017 Rockchip Electronics Co., Ltd
3f0c40dcdSWu Liang feng  *
4f0c40dcdSWu Liang feng  * SPDX-License-Identifier:    GPL-2.0+
5f0c40dcdSWu Liang feng  */
6f0c40dcdSWu Liang feng 
7f0c40dcdSWu Liang feng #include <common.h>
8f0c40dcdSWu Liang feng #include <dm.h>
99b3cc842SFrank Wang #include <dm/lists.h>
10f0c40dcdSWu Liang feng #include <generic-phy.h>
11e475bd5dSRen Jianing #include <linux/ioport.h>
1286df9e88SFrank Wang #include <power/regulator.h>
13e475bd5dSRen Jianing #include <regmap.h>
14e475bd5dSRen Jianing #include <syscon.h>
15f90455d7SKever Yang #include <asm/io.h>
16f90455d7SKever Yang #include <asm/arch/clock.h>
17675552f7SFrank Wang #include <asm/arch/cpu.h>
184367cef2SWilliam Wu #include <reset-uclass.h>
19f0c40dcdSWu Liang feng 
20eb7c7240SFrank Wang #include "../usb/gadget/dwc2_udc_otg_priv.h"
21eb7c7240SFrank Wang 
22f0c40dcdSWu Liang feng #define U2PHY_BIT_WRITEABLE_SHIFT	16
23f0c40dcdSWu Liang feng #define CHG_DCD_MAX_RETRIES		6
24f0c40dcdSWu Liang feng #define CHG_PRI_MAX_RETRIES		2
25f0c40dcdSWu Liang feng #define CHG_DCD_POLL_TIME		100	/* millisecond */
26f0c40dcdSWu Liang feng #define CHG_PRIMARY_DET_TIME		40	/* millisecond */
27f0c40dcdSWu Liang feng #define CHG_SECONDARY_DET_TIME		40	/* millisecond */
28f0c40dcdSWu Liang feng 
29f0c40dcdSWu Liang feng struct rockchip_usb2phy;
30f0c40dcdSWu Liang feng 
31f0c40dcdSWu Liang feng enum power_supply_type {
32f0c40dcdSWu Liang feng 	POWER_SUPPLY_TYPE_UNKNOWN = 0,
33f0c40dcdSWu Liang feng 	POWER_SUPPLY_TYPE_USB,		/* Standard Downstream Port */
34f0c40dcdSWu Liang feng 	POWER_SUPPLY_TYPE_USB_DCP,	/* Dedicated Charging Port */
35f0c40dcdSWu Liang feng 	POWER_SUPPLY_TYPE_USB_CDP,	/* Charging Downstream Port */
36f0c40dcdSWu Liang feng 	POWER_SUPPLY_TYPE_USB_FLOATING,	/* DCP without shorting D+/D- */
37f0c40dcdSWu Liang feng };
38f0c40dcdSWu Liang feng 
39f0c40dcdSWu Liang feng enum rockchip_usb2phy_port_id {
40f0c40dcdSWu Liang feng 	USB2PHY_PORT_OTG,
41f0c40dcdSWu Liang feng 	USB2PHY_PORT_HOST,
42f0c40dcdSWu Liang feng 	USB2PHY_NUM_PORTS,
43f0c40dcdSWu Liang feng };
44f0c40dcdSWu Liang feng 
45f0c40dcdSWu Liang feng struct usb2phy_reg {
46f0c40dcdSWu Liang feng 	u32	offset;
47f0c40dcdSWu Liang feng 	u32	bitend;
48f0c40dcdSWu Liang feng 	u32	bitstart;
49f0c40dcdSWu Liang feng 	u32	disable;
50f0c40dcdSWu Liang feng 	u32	enable;
51f0c40dcdSWu Liang feng };
52f0c40dcdSWu Liang feng 
53f0c40dcdSWu Liang feng /**
54f0c40dcdSWu Liang feng  * struct rockchip_chg_det_reg: usb charger detect registers
55f0c40dcdSWu Liang feng  * @cp_det: charging port detected successfully.
56f0c40dcdSWu Liang feng  * @dcp_det: dedicated charging port detected successfully.
57f0c40dcdSWu Liang feng  * @dp_det: assert data pin connect successfully.
58f0c40dcdSWu Liang feng  * @idm_sink_en: open dm sink curren.
59f0c40dcdSWu Liang feng  * @idp_sink_en: open dp sink current.
60f0c40dcdSWu Liang feng  * @idp_src_en: open dm source current.
61f0c40dcdSWu Liang feng  * @rdm_pdwn_en: open dm pull down resistor.
62f0c40dcdSWu Liang feng  * @vdm_src_en: open dm voltage source.
63f0c40dcdSWu Liang feng  * @vdp_src_en: open dp voltage source.
64f0c40dcdSWu Liang feng  * @opmode: utmi operational mode.
65f0c40dcdSWu Liang feng  */
66f0c40dcdSWu Liang feng struct rockchip_chg_det_reg {
67f0c40dcdSWu Liang feng 	struct usb2phy_reg	cp_det;
68f0c40dcdSWu Liang feng 	struct usb2phy_reg	dcp_det;
69f0c40dcdSWu Liang feng 	struct usb2phy_reg	dp_det;
70f0c40dcdSWu Liang feng 	struct usb2phy_reg	idm_sink_en;
71f0c40dcdSWu Liang feng 	struct usb2phy_reg	idp_sink_en;
72f0c40dcdSWu Liang feng 	struct usb2phy_reg	idp_src_en;
73f0c40dcdSWu Liang feng 	struct usb2phy_reg	rdm_pdwn_en;
74f0c40dcdSWu Liang feng 	struct usb2phy_reg	vdm_src_en;
75f0c40dcdSWu Liang feng 	struct usb2phy_reg	vdp_src_en;
76f0c40dcdSWu Liang feng 	struct usb2phy_reg	opmode;
77f0c40dcdSWu Liang feng };
78f0c40dcdSWu Liang feng 
79f0c40dcdSWu Liang feng /**
80f0c40dcdSWu Liang feng  * struct rockchip_usb2phy_port_cfg: usb-phy port configuration.
81f0c40dcdSWu Liang feng  * @phy_sus: phy suspend register.
82f0c40dcdSWu Liang feng  * @bvalid_det_en: vbus valid rise detection enable register.
83f0c40dcdSWu Liang feng  * @bvalid_det_st: vbus valid rise detection status register.
84f0c40dcdSWu Liang feng  * @bvalid_det_clr: vbus valid rise detection clear register.
85f0c40dcdSWu Liang feng  * @ls_det_en: linestate detection enable register.
86f0c40dcdSWu Liang feng  * @ls_det_st: linestate detection state register.
87f0c40dcdSWu Liang feng  * @ls_det_clr: linestate detection clear register.
88f0c40dcdSWu Liang feng  * @iddig_output: iddig output from grf.
89f0c40dcdSWu Liang feng  * @iddig_en: utmi iddig select between grf and phy,
90f0c40dcdSWu Liang feng  *	      0: from phy; 1: from grf
91f0c40dcdSWu Liang feng  * @idfall_det_en: id fall detection enable register.
92f0c40dcdSWu Liang feng  * @idfall_det_st: id fall detection state register.
93f0c40dcdSWu Liang feng  * @idfall_det_clr: id fall detection clear register.
94f0c40dcdSWu Liang feng  * @idrise_det_en: id rise detection enable register.
95f0c40dcdSWu Liang feng  * @idrise_det_st: id rise detection state register.
96f0c40dcdSWu Liang feng  * @idrise_det_clr: id rise detection clear register.
97f0c40dcdSWu Liang feng  * @utmi_avalid: utmi vbus avalid status register.
98f0c40dcdSWu Liang feng  * @utmi_bvalid: utmi vbus bvalid status register.
99f0c40dcdSWu Liang feng  * @utmi_iddig: otg port id pin status register.
100f0c40dcdSWu Liang feng  * @utmi_ls: utmi linestate state register.
101f0c40dcdSWu Liang feng  * @utmi_hstdet: utmi host disconnect register.
102f0c40dcdSWu Liang feng  * @vbus_det_en: vbus detect function power down register.
103f0c40dcdSWu Liang feng  */
104f0c40dcdSWu Liang feng struct rockchip_usb2phy_port_cfg {
105f0c40dcdSWu Liang feng 	struct usb2phy_reg	phy_sus;
106f0c40dcdSWu Liang feng 	struct usb2phy_reg	bvalid_det_en;
107f0c40dcdSWu Liang feng 	struct usb2phy_reg	bvalid_det_st;
108f0c40dcdSWu Liang feng 	struct usb2phy_reg	bvalid_det_clr;
109f0c40dcdSWu Liang feng 	struct usb2phy_reg	ls_det_en;
110f0c40dcdSWu Liang feng 	struct usb2phy_reg	ls_det_st;
111f0c40dcdSWu Liang feng 	struct usb2phy_reg	ls_det_clr;
112f0c40dcdSWu Liang feng 	struct usb2phy_reg	iddig_output;
113f0c40dcdSWu Liang feng 	struct usb2phy_reg	iddig_en;
114f0c40dcdSWu Liang feng 	struct usb2phy_reg	idfall_det_en;
115f0c40dcdSWu Liang feng 	struct usb2phy_reg	idfall_det_st;
116f0c40dcdSWu Liang feng 	struct usb2phy_reg	idfall_det_clr;
117f0c40dcdSWu Liang feng 	struct usb2phy_reg	idrise_det_en;
118f0c40dcdSWu Liang feng 	struct usb2phy_reg	idrise_det_st;
119f0c40dcdSWu Liang feng 	struct usb2phy_reg	idrise_det_clr;
120f0c40dcdSWu Liang feng 	struct usb2phy_reg	utmi_avalid;
121f0c40dcdSWu Liang feng 	struct usb2phy_reg	utmi_bvalid;
122f0c40dcdSWu Liang feng 	struct usb2phy_reg	utmi_iddig;
123f0c40dcdSWu Liang feng 	struct usb2phy_reg	utmi_ls;
124f0c40dcdSWu Liang feng 	struct usb2phy_reg	utmi_hstdet;
125f0c40dcdSWu Liang feng 	struct usb2phy_reg	vbus_det_en;
126f0c40dcdSWu Liang feng };
127f0c40dcdSWu Liang feng 
128f0c40dcdSWu Liang feng /**
129f0c40dcdSWu Liang feng  * struct rockchip_usb2phy_cfg: usb-phy configuration.
130f0c40dcdSWu Liang feng  * @reg: the address offset of grf for usb-phy config.
131f0c40dcdSWu Liang feng  * @num_ports: specify how many ports that the phy has.
132f0c40dcdSWu Liang feng  * @phy_tuning: phy default parameters tunning.
133f0c40dcdSWu Liang feng  * @clkout_ctl: keep on/turn off output clk of phy.
134f0c40dcdSWu Liang feng  * @chg_det: charger detection registers.
135f0c40dcdSWu Liang feng  */
136f0c40dcdSWu Liang feng struct rockchip_usb2phy_cfg {
137f0c40dcdSWu Liang feng 	u32	reg;
138f0c40dcdSWu Liang feng 	u32	num_ports;
139f0c40dcdSWu Liang feng 	int (*phy_tuning)(struct rockchip_usb2phy *);
140f0c40dcdSWu Liang feng 	struct usb2phy_reg	clkout_ctl;
141f0c40dcdSWu Liang feng 	const struct rockchip_usb2phy_port_cfg	port_cfgs[USB2PHY_NUM_PORTS];
142f0c40dcdSWu Liang feng 	const struct rockchip_chg_det_reg	chg_det;
143f0c40dcdSWu Liang feng };
144f0c40dcdSWu Liang feng 
145f0c40dcdSWu Liang feng /**
146f0c40dcdSWu Liang feng  * @dcd_retries: The retry count used to track Data contact
147f0c40dcdSWu Liang feng  *		 detection process.
148f0c40dcdSWu Liang feng  * @primary_retries: The retry count used to do usb bc detection
149f0c40dcdSWu Liang feng  *		     primary stage.
150f0c40dcdSWu Liang feng  * @grf: General Register Files register base.
151f0c40dcdSWu Liang feng  * @usbgrf_base : USB General Register Files register base.
1525c59af98SJianwei Zheng  * @phy_base: the base address of USB PHY.
1534367cef2SWilliam Wu  * @phy_rst: phy reset control.
154f0c40dcdSWu Liang feng  * @phy_cfg: phy register configuration, assigned by driver data.
155f0c40dcdSWu Liang feng  */
156f0c40dcdSWu Liang feng struct rockchip_usb2phy {
157f0c40dcdSWu Liang feng 	u8		dcd_retries;
158f0c40dcdSWu Liang feng 	u8		primary_retries;
159e475bd5dSRen Jianing 	struct regmap	*grf_base;
160e475bd5dSRen Jianing 	struct regmap	*usbgrf_base;
1615c59af98SJianwei Zheng 	void __iomem	*phy_base;
16286df9e88SFrank Wang 	struct udevice	*vbus_supply[USB2PHY_NUM_PORTS];
1634367cef2SWilliam Wu 	struct reset_ctl phy_rst;
164f0c40dcdSWu Liang feng 	const struct rockchip_usb2phy_cfg	*phy_cfg;
165f0c40dcdSWu Liang feng };
166f0c40dcdSWu Liang feng 
167e475bd5dSRen Jianing static inline struct regmap *get_reg_base(struct rockchip_usb2phy *rphy)
168f0c40dcdSWu Liang feng {
169f0c40dcdSWu Liang feng 	return !rphy->usbgrf_base ? rphy->grf_base : rphy->usbgrf_base;
170f0c40dcdSWu Liang feng }
171f0c40dcdSWu Liang feng 
172e475bd5dSRen Jianing static inline int property_enable(struct regmap *base,
173f0c40dcdSWu Liang feng 				  const struct usb2phy_reg *reg, bool en)
174f0c40dcdSWu Liang feng {
175f0c40dcdSWu Liang feng 	u32 val, mask, tmp;
176f0c40dcdSWu Liang feng 
177f0c40dcdSWu Liang feng 	tmp = en ? reg->enable : reg->disable;
178f0c40dcdSWu Liang feng 	mask = GENMASK(reg->bitend, reg->bitstart);
179f0c40dcdSWu Liang feng 	val = (tmp << reg->bitstart) | (mask << U2PHY_BIT_WRITEABLE_SHIFT);
180f0c40dcdSWu Liang feng 
181e475bd5dSRen Jianing 	return regmap_write(base, reg->offset, val);
182f0c40dcdSWu Liang feng }
183f0c40dcdSWu Liang feng 
184e475bd5dSRen Jianing static inline bool property_enabled(struct regmap *base,
185f0c40dcdSWu Liang feng 				    const struct usb2phy_reg *reg)
186f0c40dcdSWu Liang feng {
187f0c40dcdSWu Liang feng 	u32 tmp, orig;
188f0c40dcdSWu Liang feng 	u32 mask = GENMASK(reg->bitend, reg->bitstart);
189f0c40dcdSWu Liang feng 
190e475bd5dSRen Jianing 	regmap_read(base, reg->offset, &orig);
191f0c40dcdSWu Liang feng 
192f0c40dcdSWu Liang feng 	tmp = (orig & mask) >> reg->bitstart;
193f0c40dcdSWu Liang feng 
194f0c40dcdSWu Liang feng 	return tmp == reg->enable;
195f0c40dcdSWu Liang feng }
196f0c40dcdSWu Liang feng 
197f0c40dcdSWu Liang feng static const char *chg_to_string(enum power_supply_type chg_type)
198f0c40dcdSWu Liang feng {
199f0c40dcdSWu Liang feng 	switch (chg_type) {
200f0c40dcdSWu Liang feng 	case POWER_SUPPLY_TYPE_USB:
201f0c40dcdSWu Liang feng 		return "USB_SDP_CHARGER";
202f0c40dcdSWu Liang feng 	case POWER_SUPPLY_TYPE_USB_DCP:
203f0c40dcdSWu Liang feng 		return "USB_DCP_CHARGER";
204f0c40dcdSWu Liang feng 	case POWER_SUPPLY_TYPE_USB_CDP:
205f0c40dcdSWu Liang feng 		return "USB_CDP_CHARGER";
206f0c40dcdSWu Liang feng 	case POWER_SUPPLY_TYPE_USB_FLOATING:
207f0c40dcdSWu Liang feng 		return "USB_FLOATING_CHARGER";
208f0c40dcdSWu Liang feng 	default:
209f0c40dcdSWu Liang feng 		return "INVALID_CHARGER";
210f0c40dcdSWu Liang feng 	}
211f0c40dcdSWu Liang feng }
212f0c40dcdSWu Liang feng 
213f0c40dcdSWu Liang feng static void rockchip_chg_enable_dcd(struct rockchip_usb2phy *rphy,
214f0c40dcdSWu Liang feng 				    bool en)
215f0c40dcdSWu Liang feng {
216e475bd5dSRen Jianing 	struct regmap *base = get_reg_base(rphy);
217f0c40dcdSWu Liang feng 
218f0c40dcdSWu Liang feng 	property_enable(base, &rphy->phy_cfg->chg_det.rdm_pdwn_en, en);
219f0c40dcdSWu Liang feng 	property_enable(base, &rphy->phy_cfg->chg_det.idp_src_en, en);
220f0c40dcdSWu Liang feng }
221f0c40dcdSWu Liang feng 
222f0c40dcdSWu Liang feng static void rockchip_chg_enable_primary_det(struct rockchip_usb2phy *rphy,
223f0c40dcdSWu Liang feng 					    bool en)
224f0c40dcdSWu Liang feng {
225e475bd5dSRen Jianing 	struct regmap *base = get_reg_base(rphy);
226f0c40dcdSWu Liang feng 
227f0c40dcdSWu Liang feng 	property_enable(base, &rphy->phy_cfg->chg_det.vdp_src_en, en);
228f0c40dcdSWu Liang feng 	property_enable(base, &rphy->phy_cfg->chg_det.idm_sink_en, en);
229f0c40dcdSWu Liang feng }
230f0c40dcdSWu Liang feng 
231f0c40dcdSWu Liang feng static void rockchip_chg_enable_secondary_det(struct rockchip_usb2phy *rphy,
232f0c40dcdSWu Liang feng 					      bool en)
233f0c40dcdSWu Liang feng {
234e475bd5dSRen Jianing 	struct regmap *base = get_reg_base(rphy);
235f0c40dcdSWu Liang feng 
236f0c40dcdSWu Liang feng 	property_enable(base, &rphy->phy_cfg->chg_det.vdm_src_en, en);
237f0c40dcdSWu Liang feng 	property_enable(base, &rphy->phy_cfg->chg_det.idp_sink_en, en);
238f0c40dcdSWu Liang feng }
239f0c40dcdSWu Liang feng 
240f0c40dcdSWu Liang feng static bool rockchip_chg_primary_det_retry(struct rockchip_usb2phy *rphy)
241f0c40dcdSWu Liang feng {
242f0c40dcdSWu Liang feng 	bool vout = false;
243e475bd5dSRen Jianing 	struct regmap *base = get_reg_base(rphy);
244f0c40dcdSWu Liang feng 
245f0c40dcdSWu Liang feng 	while (rphy->primary_retries--) {
246f0c40dcdSWu Liang feng 		/* voltage source on DP, probe on DM */
247f0c40dcdSWu Liang feng 		rockchip_chg_enable_primary_det(rphy, true);
248f0c40dcdSWu Liang feng 		mdelay(CHG_PRIMARY_DET_TIME);
249e475bd5dSRen Jianing 		vout = property_enabled(base, &rphy->phy_cfg->chg_det.cp_det);
250f0c40dcdSWu Liang feng 		if (vout)
251f0c40dcdSWu Liang feng 			break;
252f0c40dcdSWu Liang feng 	}
253f0c40dcdSWu Liang feng 
254a607e103SFrank Wang 	rockchip_chg_enable_primary_det(rphy, false);
255f0c40dcdSWu Liang feng 	return vout;
256f0c40dcdSWu Liang feng }
257f0c40dcdSWu Liang feng 
258f0c40dcdSWu Liang feng int rockchip_chg_get_type(void)
259f0c40dcdSWu Liang feng {
260a607e103SFrank Wang 	const struct rockchip_usb2phy_port_cfg *port_cfg;
261f0c40dcdSWu Liang feng 	enum power_supply_type chg_type;
26206565514SFrank Wang 	struct rockchip_usb2phy *rphy;
26306565514SFrank Wang 	struct udevice *udev;
264e475bd5dSRen Jianing 	struct regmap *base;
265f0c40dcdSWu Liang feng 	bool is_dcd, vout;
266f0c40dcdSWu Liang feng 	int ret;
267f0c40dcdSWu Liang feng 
2680c0ee602SFrank Wang 	ret = uclass_get_device_by_name(UCLASS_PHY, "usb2-phy", &udev);
26906565514SFrank Wang 	if (ret == -ENODEV) {
270a9b1eb66SFrank Wang 		ret = uclass_get_device_by_name(UCLASS_PHY, "usb2phy", &udev);
271a9b1eb66SFrank Wang 		if (ret) {
272a9b1eb66SFrank Wang 			pr_err("%s: get usb2 phy node failed: %d\n", __func__, ret);
273f0c40dcdSWu Liang feng 			return ret;
274f0c40dcdSWu Liang feng 		}
275a9b1eb66SFrank Wang 	}
276f0c40dcdSWu Liang feng 
27706565514SFrank Wang 	rphy = dev_get_priv(udev);
27806565514SFrank Wang 	base = get_reg_base(rphy);
27906565514SFrank Wang 	port_cfg = &rphy->phy_cfg->port_cfgs[USB2PHY_PORT_OTG];
280a607e103SFrank Wang 
281bebadd87SFrank Wang 	/* Check USB-Vbus status first */
282bebadd87SFrank Wang 	if (!property_enabled(base, &port_cfg->utmi_bvalid)) {
283bebadd87SFrank Wang 		pr_info("%s: no charger found\n", __func__);
284bebadd87SFrank Wang 		return POWER_SUPPLY_TYPE_UNKNOWN;
285bebadd87SFrank Wang 	}
286bebadd87SFrank Wang 
287baa12648SJianwei Zheng #ifdef CONFIG_ROCKCHIP_RK3036
288baa12648SJianwei Zheng 	chg_type = POWER_SUPPLY_TYPE_USB;
289baa12648SJianwei Zheng 	goto out;
290baa12648SJianwei Zheng #endif
291baa12648SJianwei Zheng 
292a607e103SFrank Wang 	/* Suspend USB-PHY and put the controller in non-driving mode */
293a607e103SFrank Wang 	property_enable(base, &port_cfg->phy_sus, true);
29406565514SFrank Wang 	property_enable(base, &rphy->phy_cfg->chg_det.opmode, false);
295a607e103SFrank Wang 
29606565514SFrank Wang 	rphy->dcd_retries = CHG_DCD_MAX_RETRIES;
29706565514SFrank Wang 	rphy->primary_retries = CHG_PRI_MAX_RETRIES;
298f0c40dcdSWu Liang feng 
299f0c40dcdSWu Liang feng 	/* stage 1, start DCD processing stage */
30006565514SFrank Wang 	rockchip_chg_enable_dcd(rphy, true);
301f0c40dcdSWu Liang feng 
30206565514SFrank Wang 	while (rphy->dcd_retries--) {
303f0c40dcdSWu Liang feng 		mdelay(CHG_DCD_POLL_TIME);
304f0c40dcdSWu Liang feng 
305f0c40dcdSWu Liang feng 		/* get data contact detection status */
306e475bd5dSRen Jianing 		is_dcd = property_enabled(base, &rphy->phy_cfg->chg_det.dp_det);
307f0c40dcdSWu Liang feng 
30806565514SFrank Wang 		if (is_dcd || !rphy->dcd_retries) {
309f0c40dcdSWu Liang feng 			/*
310f0c40dcdSWu Liang feng 			 * stage 2, turn off DCD circuitry, then
311f0c40dcdSWu Liang feng 			 * voltage source on DP, probe on DM.
312f0c40dcdSWu Liang feng 			 */
31306565514SFrank Wang 			rockchip_chg_enable_dcd(rphy, false);
31406565514SFrank Wang 			rockchip_chg_enable_primary_det(rphy, true);
315f0c40dcdSWu Liang feng 			break;
316f0c40dcdSWu Liang feng 		}
317f0c40dcdSWu Liang feng 	}
318f0c40dcdSWu Liang feng 
319f0c40dcdSWu Liang feng 	mdelay(CHG_PRIMARY_DET_TIME);
320e475bd5dSRen Jianing 	vout = property_enabled(base, &rphy->phy_cfg->chg_det.cp_det);
32106565514SFrank Wang 	rockchip_chg_enable_primary_det(rphy, false);
322f0c40dcdSWu Liang feng 	if (vout) {
323f0c40dcdSWu Liang feng 		/* stage 3, voltage source on DM, probe on DP */
32406565514SFrank Wang 		rockchip_chg_enable_secondary_det(rphy, true);
325f0c40dcdSWu Liang feng 	} else {
32606565514SFrank Wang 		if (!rphy->dcd_retries) {
327f0c40dcdSWu Liang feng 			/* floating charger found */
328f0c40dcdSWu Liang feng 			chg_type = POWER_SUPPLY_TYPE_USB_FLOATING;
329f0c40dcdSWu Liang feng 			goto out;
330f0c40dcdSWu Liang feng 		} else {
331f0c40dcdSWu Liang feng 			/*
332f0c40dcdSWu Liang feng 			 * Retry some times to make sure that it's
333f0c40dcdSWu Liang feng 			 * really a USB SDP charger.
334f0c40dcdSWu Liang feng 			 */
33506565514SFrank Wang 			vout = rockchip_chg_primary_det_retry(rphy);
336f0c40dcdSWu Liang feng 			if (vout) {
337f0c40dcdSWu Liang feng 				/* stage 3, voltage source on DM, probe on DP */
33806565514SFrank Wang 				rockchip_chg_enable_secondary_det(rphy, true);
339f0c40dcdSWu Liang feng 			} else {
340f0c40dcdSWu Liang feng 				/* USB SDP charger found */
341f0c40dcdSWu Liang feng 				chg_type = POWER_SUPPLY_TYPE_USB;
342f0c40dcdSWu Liang feng 				goto out;
343f0c40dcdSWu Liang feng 			}
344f0c40dcdSWu Liang feng 		}
345f0c40dcdSWu Liang feng 	}
346f0c40dcdSWu Liang feng 
347f0c40dcdSWu Liang feng 	mdelay(CHG_SECONDARY_DET_TIME);
348e475bd5dSRen Jianing 	vout = property_enabled(base, &rphy->phy_cfg->chg_det.dcp_det);
349f0c40dcdSWu Liang feng 	/* stage 4, turn off voltage source */
35006565514SFrank Wang 	rockchip_chg_enable_secondary_det(rphy, false);
351f0c40dcdSWu Liang feng 	if (vout)
352f0c40dcdSWu Liang feng 		chg_type = POWER_SUPPLY_TYPE_USB_DCP;
353f0c40dcdSWu Liang feng 	else
354f0c40dcdSWu Liang feng 		chg_type = POWER_SUPPLY_TYPE_USB_CDP;
355f0c40dcdSWu Liang feng 
356f0c40dcdSWu Liang feng out:
357a607e103SFrank Wang 	/* Resume USB-PHY and put the controller in normal mode */
35806565514SFrank Wang 	property_enable(base, &rphy->phy_cfg->chg_det.opmode, true);
359a607e103SFrank Wang 	property_enable(base, &port_cfg->phy_sus, false);
360a607e103SFrank Wang 
3619c4c00b2SJoseph Chen 	debug("charger is %s\n", chg_to_string(chg_type));
362f0c40dcdSWu Liang feng 
363f0c40dcdSWu Liang feng 	return chg_type;
364f0c40dcdSWu Liang feng }
365f0c40dcdSWu Liang feng 
36657ab23a6SFrank Wang int rockchip_u2phy_vbus_detect(void)
36757ab23a6SFrank Wang {
36870878a45SMeng Dongyang 	int chg_type;
36970878a45SMeng Dongyang 
37070878a45SMeng Dongyang 	chg_type = rockchip_chg_get_type();
37170878a45SMeng Dongyang 
37270878a45SMeng Dongyang 	return (chg_type == POWER_SUPPLY_TYPE_USB ||
37370878a45SMeng Dongyang 		chg_type == POWER_SUPPLY_TYPE_USB_CDP) ? 1 : 0;
37457ab23a6SFrank Wang }
37557ab23a6SFrank Wang 
376eb7c7240SFrank Wang void otg_phy_init(struct dwc2_udc *dev)
377eb7c7240SFrank Wang {
378eb7c7240SFrank Wang 	const struct rockchip_usb2phy_port_cfg *port_cfg;
37906565514SFrank Wang 	struct rockchip_usb2phy *rphy;
38006565514SFrank Wang 	struct udevice *udev;
381e475bd5dSRen Jianing 	struct regmap *base;
382eb7c7240SFrank Wang 	int ret;
383eb7c7240SFrank Wang 
3840c0ee602SFrank Wang 	ret = uclass_get_device_by_name(UCLASS_PHY, "usb2-phy", &udev);
38506565514SFrank Wang 	if (ret == -ENODEV) {
386a9b1eb66SFrank Wang 		ret = uclass_get_device_by_name(UCLASS_PHY, "usb2phy", &udev);
387a9b1eb66SFrank Wang 		if (ret) {
388a9b1eb66SFrank Wang 			pr_err("%s: get usb2 phy node failed: %d\n", __func__, ret);
389eb7c7240SFrank Wang 			return;
390eb7c7240SFrank Wang 		}
391a9b1eb66SFrank Wang 	}
392eb7c7240SFrank Wang 
39306565514SFrank Wang 	rphy = dev_get_priv(udev);
39406565514SFrank Wang 	base = get_reg_base(rphy);
39506565514SFrank Wang 	port_cfg = &rphy->phy_cfg->port_cfgs[USB2PHY_PORT_OTG];
396eb7c7240SFrank Wang 
397eb7c7240SFrank Wang 	/* Set the USB-PHY COMMONONN to 1'b0 to ensure USB's clocks */
39846943c07SJianwei Zheng 	if(rphy->phy_cfg->clkout_ctl.disable)
39946943c07SJianwei Zheng 		property_enable(base, &rphy->phy_cfg->clkout_ctl, true);
400eb7c7240SFrank Wang 
401eb7c7240SFrank Wang 	/* Reset USB-PHY */
402eb7c7240SFrank Wang 	property_enable(base, &port_cfg->phy_sus, true);
403eb7c7240SFrank Wang 	udelay(20);
404eb7c7240SFrank Wang 	property_enable(base, &port_cfg->phy_sus, false);
405eb7c7240SFrank Wang 	mdelay(2);
406eb7c7240SFrank Wang }
407eb7c7240SFrank Wang 
4084367cef2SWilliam Wu static int rockchip_usb2phy_reset(struct rockchip_usb2phy *rphy)
4094367cef2SWilliam Wu {
4104367cef2SWilliam Wu 	int ret;
4114367cef2SWilliam Wu 
4124367cef2SWilliam Wu 	if (rphy->phy_rst.dev) {
4134367cef2SWilliam Wu 		ret = reset_assert(&rphy->phy_rst);
4144367cef2SWilliam Wu 		if (ret < 0) {
4154367cef2SWilliam Wu 			pr_err("u2phy assert reset failed: %d", ret);
4164367cef2SWilliam Wu 			return ret;
4174367cef2SWilliam Wu 		}
4184367cef2SWilliam Wu 
4194367cef2SWilliam Wu 		udelay(20);
4204367cef2SWilliam Wu 
4214367cef2SWilliam Wu 		ret = reset_deassert(&rphy->phy_rst);
4224367cef2SWilliam Wu 		if (ret < 0) {
4234367cef2SWilliam Wu 			pr_err("u2phy deassert reset failed: %d", ret);
4244367cef2SWilliam Wu 			return ret;
4254367cef2SWilliam Wu 		}
4264367cef2SWilliam Wu 
4274367cef2SWilliam Wu 		udelay(100);
4284367cef2SWilliam Wu 	}
4294367cef2SWilliam Wu 
4304367cef2SWilliam Wu 	return 0;
4314367cef2SWilliam Wu }
4324367cef2SWilliam Wu 
433f0c40dcdSWu Liang feng static int rockchip_usb2phy_init(struct phy *phy)
434f0c40dcdSWu Liang feng {
4359b3cc842SFrank Wang 	struct udevice *parent = phy->dev->parent;
4369b3cc842SFrank Wang 	struct rockchip_usb2phy *rphy = dev_get_priv(parent);
437f0c40dcdSWu Liang feng 	const struct rockchip_usb2phy_port_cfg *port_cfg;
438e475bd5dSRen Jianing 	struct regmap *base = get_reg_base(rphy);
439f0c40dcdSWu Liang feng 
440f0c40dcdSWu Liang feng 	if (phy->id == USB2PHY_PORT_OTG) {
441f0c40dcdSWu Liang feng 		port_cfg = &rphy->phy_cfg->port_cfgs[USB2PHY_PORT_OTG];
442f0c40dcdSWu Liang feng 	} else if (phy->id == USB2PHY_PORT_HOST) {
443f0c40dcdSWu Liang feng 		port_cfg = &rphy->phy_cfg->port_cfgs[USB2PHY_PORT_HOST];
444f0c40dcdSWu Liang feng 	} else {
445f0c40dcdSWu Liang feng 		dev_err(phy->dev, "phy id %lu not support", phy->id);
446f0c40dcdSWu Liang feng 		return -EINVAL;
447f0c40dcdSWu Liang feng 	}
448f0c40dcdSWu Liang feng 
449f0c40dcdSWu Liang feng 	property_enable(base, &port_cfg->phy_sus, false);
450f0c40dcdSWu Liang feng 
451f0c40dcdSWu Liang feng 	/* waiting for the utmi_clk to become stable */
452f0c40dcdSWu Liang feng 	udelay(2000);
453f0c40dcdSWu Liang feng 
454f0c40dcdSWu Liang feng 	return 0;
455f0c40dcdSWu Liang feng }
456f0c40dcdSWu Liang feng 
457f0c40dcdSWu Liang feng static int rockchip_usb2phy_exit(struct phy *phy)
458f0c40dcdSWu Liang feng {
4599b3cc842SFrank Wang 	struct udevice *parent = phy->dev->parent;
4609b3cc842SFrank Wang 	struct rockchip_usb2phy *rphy = dev_get_priv(parent);
461f0c40dcdSWu Liang feng 	const struct rockchip_usb2phy_port_cfg *port_cfg;
462e475bd5dSRen Jianing 	struct regmap *base = get_reg_base(rphy);
463f0c40dcdSWu Liang feng 
464f0c40dcdSWu Liang feng 	if (phy->id == USB2PHY_PORT_OTG) {
465f0c40dcdSWu Liang feng 		port_cfg = &rphy->phy_cfg->port_cfgs[USB2PHY_PORT_OTG];
466f0c40dcdSWu Liang feng 	} else if (phy->id == USB2PHY_PORT_HOST) {
467f0c40dcdSWu Liang feng 		port_cfg = &rphy->phy_cfg->port_cfgs[USB2PHY_PORT_HOST];
468f0c40dcdSWu Liang feng 	} else {
469f0c40dcdSWu Liang feng 		dev_err(phy->dev, "phy id %lu not support", phy->id);
470f0c40dcdSWu Liang feng 		return -EINVAL;
471f0c40dcdSWu Liang feng 	}
472f0c40dcdSWu Liang feng 
473f0c40dcdSWu Liang feng 	property_enable(base, &port_cfg->phy_sus, true);
474f0c40dcdSWu Liang feng 
475f0c40dcdSWu Liang feng 	return 0;
476f0c40dcdSWu Liang feng }
477f0c40dcdSWu Liang feng 
47886df9e88SFrank Wang static int rockchip_usb2phy_power_on(struct phy *phy)
47986df9e88SFrank Wang {
480b0ac9faaSWilliam Wu 	struct udevice *parent = phy->dev->parent;
481b0ac9faaSWilliam Wu 	struct rockchip_usb2phy *rphy = dev_get_priv(parent);
482b0ac9faaSWilliam Wu 	struct udevice *vbus = rphy->vbus_supply[phy->id];
48386df9e88SFrank Wang 	int ret;
48486df9e88SFrank Wang 
48586df9e88SFrank Wang 	if (vbus) {
48686df9e88SFrank Wang 		ret = regulator_set_enable(vbus, true);
48786df9e88SFrank Wang 		if (ret) {
48886df9e88SFrank Wang 			pr_err("%s: Failed to set VBus supply\n", __func__);
48986df9e88SFrank Wang 			return ret;
49086df9e88SFrank Wang 		}
49186df9e88SFrank Wang 	}
49286df9e88SFrank Wang 
49386df9e88SFrank Wang 	return 0;
49486df9e88SFrank Wang }
49586df9e88SFrank Wang 
49686df9e88SFrank Wang static int rockchip_usb2phy_power_off(struct phy *phy)
49786df9e88SFrank Wang {
498b0ac9faaSWilliam Wu 	struct udevice *parent = phy->dev->parent;
499b0ac9faaSWilliam Wu 	struct rockchip_usb2phy *rphy = dev_get_priv(parent);
500b0ac9faaSWilliam Wu 	struct udevice *vbus = rphy->vbus_supply[phy->id];
50186df9e88SFrank Wang 	int ret;
50286df9e88SFrank Wang 
50386df9e88SFrank Wang 	if (vbus) {
50486df9e88SFrank Wang 		ret = regulator_set_enable(vbus, false);
50586df9e88SFrank Wang 		if (ret) {
50686df9e88SFrank Wang 			pr_err("%s: Failed to set VBus supply\n", __func__);
50786df9e88SFrank Wang 			return ret;
50886df9e88SFrank Wang 		}
50986df9e88SFrank Wang 	}
51086df9e88SFrank Wang 
51186df9e88SFrank Wang 	return 0;
51286df9e88SFrank Wang }
51386df9e88SFrank Wang 
5149b3cc842SFrank Wang static int rockchip_usb2phy_of_xlate(struct phy *phy,
5159b3cc842SFrank Wang 				     struct ofnode_phandle_args *args)
5169b3cc842SFrank Wang {
5179b3cc842SFrank Wang 	const char *dev_name = phy->dev->name;
51886df9e88SFrank Wang 	struct udevice *parent = phy->dev->parent;
51986df9e88SFrank Wang 	struct rockchip_usb2phy *rphy = dev_get_priv(parent);
5209b3cc842SFrank Wang 
5219b3cc842SFrank Wang 	if (!strcasecmp(dev_name, "host-port")) {
5229b3cc842SFrank Wang 		phy->id = USB2PHY_PORT_HOST;
52386df9e88SFrank Wang 		device_get_supply_regulator(phy->dev, "phy-supply",
52486df9e88SFrank Wang 					    &rphy->vbus_supply[USB2PHY_PORT_HOST]);
5259b3cc842SFrank Wang 	} else if (!strcasecmp(dev_name, "otg-port")) {
5269b3cc842SFrank Wang 		phy->id = USB2PHY_PORT_OTG;
52786df9e88SFrank Wang 		device_get_supply_regulator(phy->dev, "phy-supply",
52886df9e88SFrank Wang 					    &rphy->vbus_supply[USB2PHY_PORT_OTG]);
5294b06b44bSFrank Wang 		if (!rphy->vbus_supply[USB2PHY_PORT_OTG])
5304b06b44bSFrank Wang 			device_get_supply_regulator(phy->dev, "vbus-supply",
5314b06b44bSFrank Wang 						    &rphy->vbus_supply[USB2PHY_PORT_OTG]);
5329b3cc842SFrank Wang 	} else {
5339b3cc842SFrank Wang 		pr_err("%s: invalid dev name\n", __func__);
5349b3cc842SFrank Wang 		return -EINVAL;
5359b3cc842SFrank Wang 	}
5369b3cc842SFrank Wang 
5379b3cc842SFrank Wang 	return 0;
5389b3cc842SFrank Wang }
5399b3cc842SFrank Wang 
5409b3cc842SFrank Wang static int rockchip_usb2phy_bind(struct udevice *dev)
5419b3cc842SFrank Wang {
5429b3cc842SFrank Wang 	struct udevice *child;
5439b3cc842SFrank Wang 	ofnode subnode;
5449b3cc842SFrank Wang 	const char *node_name;
5459b3cc842SFrank Wang 	int ret;
5469b3cc842SFrank Wang 
5479b3cc842SFrank Wang 	dev_for_each_subnode(subnode, dev) {
5489b3cc842SFrank Wang 		if (!ofnode_valid(subnode)) {
5499b3cc842SFrank Wang 			debug("%s: %s subnode not found", __func__, dev->name);
5509b3cc842SFrank Wang 			return -ENXIO;
5519b3cc842SFrank Wang 		}
5529b3cc842SFrank Wang 
5539b3cc842SFrank Wang 		node_name = ofnode_get_name(subnode);
5549b3cc842SFrank Wang 		debug("%s: subnode %s\n", __func__, node_name);
5559b3cc842SFrank Wang 
5569b3cc842SFrank Wang 		ret = device_bind_driver_to_node(dev, "rockchip_usb2phy_port",
5579b3cc842SFrank Wang 						 node_name, subnode, &child);
5589b3cc842SFrank Wang 		if (ret) {
5599b3cc842SFrank Wang 			pr_err("%s: '%s' cannot bind 'rockchip_usb2phy_port'\n",
5609b3cc842SFrank Wang 			       __func__, node_name);
5619b3cc842SFrank Wang 			return ret;
5629b3cc842SFrank Wang 		}
5639b3cc842SFrank Wang 	}
5649b3cc842SFrank Wang 
5659b3cc842SFrank Wang 	return 0;
5669b3cc842SFrank Wang }
5679b3cc842SFrank Wang 
568f0c40dcdSWu Liang feng static int rockchip_usb2phy_probe(struct udevice *dev)
569f0c40dcdSWu Liang feng {
570f0c40dcdSWu Liang feng 	const struct rockchip_usb2phy_cfg *phy_cfgs;
571c86f0a42SFrank Wang 	struct rockchip_usb2phy *rphy = dev_get_priv(dev);
572c86f0a42SFrank Wang 	struct udevice *parent = dev->parent;
573e475bd5dSRen Jianing 	struct udevice *syscon;
574e475bd5dSRen Jianing 	struct resource res;
575f0c40dcdSWu Liang feng 	u32 reg, index;
576e475bd5dSRen Jianing 	int ret;
577f0c40dcdSWu Liang feng 
5785c59af98SJianwei Zheng 	rphy->phy_base = (void __iomem *)dev_read_addr(dev);
5795c59af98SJianwei Zheng 	if (IS_ERR(rphy->phy_base)) {
5805c59af98SJianwei Zheng 		dev_err(dev, "get the base address of usb phy failed\n");
5815c59af98SJianwei Zheng 	}
5825c59af98SJianwei Zheng 
583c86f0a42SFrank Wang 	if (!strncmp(parent->name, "root_driver", 11) &&
584e475bd5dSRen Jianing 	    dev_read_bool(dev, "rockchip,grf")) {
585e475bd5dSRen Jianing 		ret = uclass_get_device_by_phandle(UCLASS_SYSCON, dev,
586e475bd5dSRen Jianing 						   "rockchip,grf", &syscon);
587e475bd5dSRen Jianing 		if (ret) {
588e475bd5dSRen Jianing 			dev_err(dev, "get syscon grf failed\n");
589e475bd5dSRen Jianing 			return ret;
590e475bd5dSRen Jianing 		}
591e475bd5dSRen Jianing 
592e475bd5dSRen Jianing 		rphy->grf_base = syscon_get_regmap(syscon);
593e475bd5dSRen Jianing 	} else {
594e475bd5dSRen Jianing 		rphy->grf_base = syscon_get_regmap(parent);
595e475bd5dSRen Jianing 	}
596f0c40dcdSWu Liang feng 
597f0c40dcdSWu Liang feng 	if (rphy->grf_base <= 0) {
598e475bd5dSRen Jianing 		dev_err(dev, "get syscon grf regmap failed\n");
599f0c40dcdSWu Liang feng 		return -EINVAL;
600f0c40dcdSWu Liang feng 	}
601f0c40dcdSWu Liang feng 
602c86f0a42SFrank Wang 	if (dev_read_bool(dev, "rockchip,usbgrf")) {
603e475bd5dSRen Jianing 		ret = uclass_get_device_by_phandle(UCLASS_SYSCON, dev,
604e475bd5dSRen Jianing 						   "rockchip,usbgrf", &syscon);
605e475bd5dSRen Jianing 		if (ret) {
606f0c40dcdSWu Liang feng 			dev_err(dev, "get syscon usbgrf failed\n");
607e475bd5dSRen Jianing 			return ret;
608e475bd5dSRen Jianing 		}
609e475bd5dSRen Jianing 
610e475bd5dSRen Jianing 		rphy->usbgrf_base = syscon_get_regmap(syscon);
611e475bd5dSRen Jianing 		if (rphy->usbgrf_base <= 0) {
612e475bd5dSRen Jianing 			dev_err(dev, "get syscon usbgrf regmap failed\n");
613f0c40dcdSWu Liang feng 			return -EINVAL;
614f0c40dcdSWu Liang feng 		}
615f0c40dcdSWu Liang feng 	} else {
616f0c40dcdSWu Liang feng 		rphy->usbgrf_base = NULL;
617f0c40dcdSWu Liang feng 	}
618f0c40dcdSWu Liang feng 
619e475bd5dSRen Jianing 	if (!strncmp(parent->name, "root_driver", 11)) {
620e475bd5dSRen Jianing 		ret = dev_read_resource(dev, 0, &res);
621e475bd5dSRen Jianing 		reg = res.start;
622e475bd5dSRen Jianing 	} else {
623e475bd5dSRen Jianing 		ret = ofnode_read_u32(dev_ofnode(dev), "reg", &reg);
624e475bd5dSRen Jianing 	}
625e475bd5dSRen Jianing 
626e475bd5dSRen Jianing 	if (ret) {
627c86f0a42SFrank Wang 		dev_err(dev, "could not read reg\n");
628c86f0a42SFrank Wang 		return -EINVAL;
629c86f0a42SFrank Wang 	}
630c86f0a42SFrank Wang 
6314367cef2SWilliam Wu 	ret = reset_get_by_name(dev, "phy", &rphy->phy_rst);
6324367cef2SWilliam Wu 	if (ret)
6334367cef2SWilliam Wu 		dev_dbg(dev, "no u2phy reset control specified\n");
6344367cef2SWilliam Wu 
635f0c40dcdSWu Liang feng 	phy_cfgs =
636f0c40dcdSWu Liang feng 		(const struct rockchip_usb2phy_cfg *)dev_get_driver_data(dev);
637f0c40dcdSWu Liang feng 	if (!phy_cfgs) {
638f0c40dcdSWu Liang feng 		dev_err(dev, "unable to get phy_cfgs\n");
639f0c40dcdSWu Liang feng 		return -EINVAL;
640f0c40dcdSWu Liang feng 	}
641f0c40dcdSWu Liang feng 
642f0c40dcdSWu Liang feng 	/* find out a proper config which can be matched with dt. */
643f0c40dcdSWu Liang feng 	index = 0;
644b30b0946SFrank Wang 	do {
645f0c40dcdSWu Liang feng 		if (phy_cfgs[index].reg == reg) {
646f0c40dcdSWu Liang feng 			rphy->phy_cfg = &phy_cfgs[index];
647f0c40dcdSWu Liang feng 			break;
648f0c40dcdSWu Liang feng 		}
649f0c40dcdSWu Liang feng 		++index;
650b30b0946SFrank Wang 	} while (phy_cfgs[index].reg);
651f0c40dcdSWu Liang feng 
652f0c40dcdSWu Liang feng 	if (!rphy->phy_cfg) {
653f0c40dcdSWu Liang feng 		dev_err(dev, "no phy-config can be matched\n");
654f0c40dcdSWu Liang feng 		return -EINVAL;
655f0c40dcdSWu Liang feng 	}
656f0c40dcdSWu Liang feng 
657a636a6d7SWilliam Wu 	if (rphy->phy_cfg->phy_tuning)
658a636a6d7SWilliam Wu 		rphy->phy_cfg->phy_tuning(rphy);
659a636a6d7SWilliam Wu 
660f0c40dcdSWu Liang feng 	return 0;
661f0c40dcdSWu Liang feng }
662f0c40dcdSWu Liang feng 
663a636a6d7SWilliam Wu static int rk322x_usb2phy_tuning(struct rockchip_usb2phy *rphy)
664a636a6d7SWilliam Wu {
665e475bd5dSRen Jianing 	struct regmap *base = get_reg_base(rphy);
666a636a6d7SWilliam Wu 	int ret = 0;
667a636a6d7SWilliam Wu 
668a636a6d7SWilliam Wu 	/* Open pre-emphasize in non-chirp state for PHY0 otg port */
669a636a6d7SWilliam Wu 	if (rphy->phy_cfg->reg == 0x760)
670e475bd5dSRen Jianing 		ret = regmap_write(base, 0x76c, 0x00070004);
671a636a6d7SWilliam Wu 
672a636a6d7SWilliam Wu 	return ret;
673a636a6d7SWilliam Wu }
674a636a6d7SWilliam Wu 
675675552f7SFrank Wang static int rk3308_usb2phy_tuning(struct rockchip_usb2phy *rphy)
676675552f7SFrank Wang {
677675552f7SFrank Wang 	struct regmap *base = get_reg_base(rphy);
678675552f7SFrank Wang 	unsigned int tmp, orig;
679675552f7SFrank Wang 	int ret;
680675552f7SFrank Wang 
681675552f7SFrank Wang 	if (soc_is_rk3308bs()) {
682675552f7SFrank Wang 		/* Enable otg/host port pre-emphasis during non-chirp phase */
683675552f7SFrank Wang 		ret = regmap_read(base, 0, &orig);
684675552f7SFrank Wang 		if (ret)
685675552f7SFrank Wang 			return ret;
686675552f7SFrank Wang 		tmp = orig & ~GENMASK(2, 0);
687675552f7SFrank Wang 		tmp |= BIT(2) & GENMASK(2, 0);
688675552f7SFrank Wang 		ret = regmap_write(base, 0, tmp);
689675552f7SFrank Wang 		if (ret)
690675552f7SFrank Wang 			return ret;
691675552f7SFrank Wang 
692675552f7SFrank Wang 		/* Set otg port squelch trigger point configure to 100mv */
693675552f7SFrank Wang 		ret = regmap_read(base, 0x004, &orig);
694675552f7SFrank Wang 		if (ret)
695675552f7SFrank Wang 			return ret;
696675552f7SFrank Wang 		tmp = orig & ~GENMASK(7, 5);
697675552f7SFrank Wang 		tmp |= 0x40 & GENMASK(7, 5);
698675552f7SFrank Wang 		ret = regmap_write(base, 0x004, tmp);
699675552f7SFrank Wang 		if (ret)
700675552f7SFrank Wang 			return ret;
701675552f7SFrank Wang 
702675552f7SFrank Wang 		ret = regmap_read(base, 0x008, &orig);
703675552f7SFrank Wang 		if (ret)
704675552f7SFrank Wang 			return ret;
705675552f7SFrank Wang 		tmp = orig & ~BIT(0);
706675552f7SFrank Wang 		tmp |= 0x1 & BIT(0);
707675552f7SFrank Wang 		ret = regmap_write(base, 0x008, tmp);
708675552f7SFrank Wang 		if (ret)
709675552f7SFrank Wang 			return ret;
710675552f7SFrank Wang 
711675552f7SFrank Wang 		/* Enable host port pre-emphasis during non-chirp phase */
712675552f7SFrank Wang 		ret = regmap_read(base, 0x400, &orig);
713675552f7SFrank Wang 		if (ret)
714675552f7SFrank Wang 			return ret;
715675552f7SFrank Wang 		tmp = orig & ~GENMASK(2, 0);
716675552f7SFrank Wang 		tmp |= BIT(2) & GENMASK(2, 0);
717675552f7SFrank Wang 		ret = regmap_write(base, 0x400, tmp);
718675552f7SFrank Wang 		if (ret)
719675552f7SFrank Wang 			return ret;
720675552f7SFrank Wang 
721675552f7SFrank Wang 		/* Set host port squelch trigger point configure to 100mv */
722675552f7SFrank Wang 		ret = regmap_read(base, 0x404, &orig);
723675552f7SFrank Wang 		if (ret)
724675552f7SFrank Wang 			return ret;
725675552f7SFrank Wang 		tmp = orig & ~GENMASK(7, 5);
726675552f7SFrank Wang 		tmp |= 0x40 & GENMASK(7, 5);
727675552f7SFrank Wang 		ret = regmap_write(base, 0x404, tmp);
728675552f7SFrank Wang 		if (ret)
729675552f7SFrank Wang 			return ret;
730675552f7SFrank Wang 
731675552f7SFrank Wang 		ret = regmap_read(base, 0x408, &orig);
732675552f7SFrank Wang 		if (ret)
733675552f7SFrank Wang 			return ret;
734675552f7SFrank Wang 		tmp = orig & ~BIT(0);
735675552f7SFrank Wang 		tmp |= 0x1 & BIT(0);
736675552f7SFrank Wang 		ret = regmap_write(base, 0x408, tmp);
737675552f7SFrank Wang 		if (ret)
738675552f7SFrank Wang 			return ret;
739675552f7SFrank Wang 	}
740675552f7SFrank Wang 
741675552f7SFrank Wang 	return 0;
742675552f7SFrank Wang }
743675552f7SFrank Wang 
744134d55e1SJianwei Zheng static int rk3328_usb2phy_tuning(struct rockchip_usb2phy *rphy)
745134d55e1SJianwei Zheng {
746134d55e1SJianwei Zheng 	struct regmap *base = get_reg_base(rphy);
747134d55e1SJianwei Zheng 	unsigned int tmp, orig;
748134d55e1SJianwei Zheng 	int ret;
749134d55e1SJianwei Zheng 
750134d55e1SJianwei Zheng 	if (soc_is_px30s()) {
751134d55e1SJianwei Zheng 		/* Enable otg/host port pre-emphasis during non-chirp phase */
752134d55e1SJianwei Zheng 		ret = regmap_read(base, 0x8000, &orig);
753134d55e1SJianwei Zheng 		if (ret)
754134d55e1SJianwei Zheng 			return ret;
755134d55e1SJianwei Zheng 		tmp = orig & ~GENMASK(2, 0);
756134d55e1SJianwei Zheng 		tmp |= BIT(2) & GENMASK(2, 0);
757134d55e1SJianwei Zheng 		ret = regmap_write(base, 0x8000, tmp);
758134d55e1SJianwei Zheng 		if (ret)
759134d55e1SJianwei Zheng 			return ret;
760134d55e1SJianwei Zheng 
761134d55e1SJianwei Zheng 		/* Set otg port squelch trigger point configure to 100mv */
762134d55e1SJianwei Zheng 		ret = regmap_read(base, 0x8004, &orig);
763134d55e1SJianwei Zheng 		if (ret)
764134d55e1SJianwei Zheng 			return ret;
765134d55e1SJianwei Zheng 		tmp = orig & ~GENMASK(7, 5);
766134d55e1SJianwei Zheng 		tmp |= 0x40 & GENMASK(7, 5);
767134d55e1SJianwei Zheng 		ret = regmap_write(base, 0x8004, tmp);
768134d55e1SJianwei Zheng 		if (ret)
769134d55e1SJianwei Zheng 			return ret;
770134d55e1SJianwei Zheng 
771134d55e1SJianwei Zheng 		ret = regmap_read(base, 0x8008, &orig);
772134d55e1SJianwei Zheng 		if (ret)
773134d55e1SJianwei Zheng 			return ret;
774134d55e1SJianwei Zheng 		tmp = orig & ~BIT(0);
775134d55e1SJianwei Zheng 		tmp |= 0x1 & BIT(0);
776134d55e1SJianwei Zheng 		ret = regmap_write(base, 0x8008, tmp);
777134d55e1SJianwei Zheng 		if (ret)
778134d55e1SJianwei Zheng 			return ret;
779134d55e1SJianwei Zheng 
780134d55e1SJianwei Zheng 		/* Enable host port pre-emphasis during non-chirp phase */
781134d55e1SJianwei Zheng 		ret = regmap_read(base, 0x8400, &orig);
782134d55e1SJianwei Zheng 		if (ret)
783134d55e1SJianwei Zheng 			return ret;
784134d55e1SJianwei Zheng 		tmp = orig & ~GENMASK(2, 0);
785134d55e1SJianwei Zheng 		tmp |= BIT(2) & GENMASK(2, 0);
786134d55e1SJianwei Zheng 		ret = regmap_write(base, 0x8400, tmp);
787134d55e1SJianwei Zheng 		if (ret)
788134d55e1SJianwei Zheng 			return ret;
789134d55e1SJianwei Zheng 
790134d55e1SJianwei Zheng 		/* Set host port squelch trigger point configure to 100mv */
791134d55e1SJianwei Zheng 		ret = regmap_read(base, 0x8404, &orig);
792134d55e1SJianwei Zheng 		if (ret)
793134d55e1SJianwei Zheng 			return ret;
794134d55e1SJianwei Zheng 		tmp = orig & ~GENMASK(7, 5);
795134d55e1SJianwei Zheng 		tmp |= 0x40 & GENMASK(7, 5);
796134d55e1SJianwei Zheng 		ret = regmap_write(base, 0x8404, tmp);
797134d55e1SJianwei Zheng 		if (ret)
798134d55e1SJianwei Zheng 			return ret;
799134d55e1SJianwei Zheng 
800134d55e1SJianwei Zheng 		ret = regmap_read(base, 0x8408, &orig);
801134d55e1SJianwei Zheng 		if (ret)
802134d55e1SJianwei Zheng 			return ret;
803134d55e1SJianwei Zheng 		tmp = orig & ~BIT(0);
804134d55e1SJianwei Zheng 		tmp |= 0x1 & BIT(0);
805134d55e1SJianwei Zheng 		ret = regmap_write(base, 0x8408, tmp);
806134d55e1SJianwei Zheng 		if (ret)
807134d55e1SJianwei Zheng 			return ret;
808134d55e1SJianwei Zheng 	}
809134d55e1SJianwei Zheng 
810134d55e1SJianwei Zheng 	return 0;
811134d55e1SJianwei Zheng }
812134d55e1SJianwei Zheng 
81371c0b475SJianwei Zheng static int rv1106_usb2phy_tuning(struct rockchip_usb2phy *rphy)
81471c0b475SJianwei Zheng {
81571c0b475SJianwei Zheng 	u32 reg;
81671c0b475SJianwei Zheng 
81771c0b475SJianwei Zheng 	/* Set HS disconnect detect mode to single ended detect mode */
81871c0b475SJianwei Zheng 	reg = readl(rphy->phy_base + 0x70);
81971c0b475SJianwei Zheng 	writel(reg | BIT(2), rphy->phy_base + 0x70);
82071c0b475SJianwei Zheng 
82171c0b475SJianwei Zheng 	return 0;
82271c0b475SJianwei Zheng }
82371c0b475SJianwei Zheng 
8245c59af98SJianwei Zheng static int rk3528_usb2phy_tuning(struct rockchip_usb2phy *rphy)
8255c59af98SJianwei Zheng {
8265c59af98SJianwei Zheng 	u32 reg;
8275c59af98SJianwei Zheng 	int ret = 0;
8285c59af98SJianwei Zheng 
8295c59af98SJianwei Zheng 	if (IS_ERR(rphy->phy_base)) {
8305c59af98SJianwei Zheng 		return PTR_ERR(rphy->phy_base);
8315c59af98SJianwei Zheng 	}
8325c59af98SJianwei Zheng 
8335c59af98SJianwei Zheng 	/* Turn off otg port differential receiver in suspend mode */
8345c59af98SJianwei Zheng 	reg = readl(rphy->phy_base + 0x30);
8355c59af98SJianwei Zheng 	writel(reg & ~BIT(2), rphy->phy_base + 0x30);
8365c59af98SJianwei Zheng 
8375c59af98SJianwei Zheng 	/* Turn off host port differential receiver in suspend mode */
8385c59af98SJianwei Zheng 	reg = readl(rphy->phy_base + 0x0430);
8395c59af98SJianwei Zheng 	writel(reg & ~BIT(2), rphy->phy_base + 0x0430);
8405c59af98SJianwei Zheng 
8415c59af98SJianwei Zheng 	/* Set otg port HS eye height to 400mv(default is 450mv) */
8425c59af98SJianwei Zheng 	reg = readl(rphy->phy_base + 0x30);
8435c59af98SJianwei Zheng 	reg &= ~GENMASK(6, 4);
8445c59af98SJianwei Zheng 	reg |= (0x00 << 4);
8455c59af98SJianwei Zheng 	writel(reg, rphy->phy_base + 0x30);
8465c59af98SJianwei Zheng 
8475c59af98SJianwei Zheng 	/* Set host port HS eye height to 400mv(default is 450mv) */
8485c59af98SJianwei Zheng 	reg = readl(rphy->phy_base + 0x430);
8495c59af98SJianwei Zheng 	reg &= ~GENMASK(6, 4);
8505c59af98SJianwei Zheng 	reg |= (0x00 << 4);
8515c59af98SJianwei Zheng 	writel(reg, rphy->phy_base + 0x430);
8525c59af98SJianwei Zheng 
8535c59af98SJianwei Zheng 	/* Choose the Tx fs/ls data as linestate from TX driver for otg port */
8545c59af98SJianwei Zheng 	reg = readl(rphy->phy_base + 0x94);
8555c59af98SJianwei Zheng 	reg &= ~GENMASK(6, 3);
8565c59af98SJianwei Zheng 	reg |= (0x03 << 3);
8575c59af98SJianwei Zheng 	writel(reg, rphy->phy_base + 0x94);
8585c59af98SJianwei Zheng 
8595c59af98SJianwei Zheng 	/* Turn on output clk of phy*/
8605c59af98SJianwei Zheng 	reg = readl(rphy->phy_base + 0x41c);
8615c59af98SJianwei Zheng 	reg &= ~GENMASK(7, 2);
8625c59af98SJianwei Zheng 	reg |= (0x27 << 2);
8635c59af98SJianwei Zheng 	writel(reg, rphy->phy_base + 0x41c);
8645c59af98SJianwei Zheng 
8655c59af98SJianwei Zheng 	return ret;
8665c59af98SJianwei Zheng }
8675c59af98SJianwei Zheng 
8681a36d2eeSFrank Wang static int rk3562_usb2phy_tuning(struct rockchip_usb2phy *rphy)
8691a36d2eeSFrank Wang {
8701a36d2eeSFrank Wang 	u32 reg;
8711a36d2eeSFrank Wang 	int ret = 0;
8721a36d2eeSFrank Wang 
8731a36d2eeSFrank Wang 	if (IS_ERR(rphy->phy_base)) {
8741a36d2eeSFrank Wang 		return PTR_ERR(rphy->phy_base);
8751a36d2eeSFrank Wang 	}
8761a36d2eeSFrank Wang 
8771a36d2eeSFrank Wang 	/* Turn off differential receiver by default to save power */
8781a36d2eeSFrank Wang 	reg = readl(rphy->phy_base + 0x30);
8791a36d2eeSFrank Wang 	writel(reg & ~BIT(2), rphy->phy_base + 0x30);
8801a36d2eeSFrank Wang 
8811a36d2eeSFrank Wang 	reg = readl(rphy->phy_base + 0x0430);
8821a36d2eeSFrank Wang 	writel(reg & ~BIT(2), rphy->phy_base + 0x0430);
8831a36d2eeSFrank Wang 
8841a36d2eeSFrank Wang 	/* Enable pre-emphasis during non-chirp phase */
8851a36d2eeSFrank Wang 	reg = readl(rphy->phy_base);
8861a36d2eeSFrank Wang 	reg &= ~GENMASK(2, 0);
8871a36d2eeSFrank Wang 	reg |= 0x04;
8881a36d2eeSFrank Wang 	writel(reg, rphy->phy_base);
8891a36d2eeSFrank Wang 
8901a36d2eeSFrank Wang 	reg = readl(rphy->phy_base + 0x0400);
8911a36d2eeSFrank Wang 	reg &= ~GENMASK(2, 0);
8921a36d2eeSFrank Wang 	reg |= 0x04;
8931a36d2eeSFrank Wang 	writel(reg, rphy->phy_base + 0x0400);
8941a36d2eeSFrank Wang 
8951a36d2eeSFrank Wang 	/* Set HS eye height to 425mv(default is 400mv) */
8961a36d2eeSFrank Wang 	reg = readl(rphy->phy_base + 0x0030);
8971a36d2eeSFrank Wang 	reg &= ~GENMASK(6, 4);
8981a36d2eeSFrank Wang 	reg |= (0x05 << 4);
8991a36d2eeSFrank Wang 	writel(reg, rphy->phy_base + 0x0030);
9001a36d2eeSFrank Wang 
9011a36d2eeSFrank Wang 	reg = readl(rphy->phy_base + 0x0430);
9021a36d2eeSFrank Wang 	reg &= ~GENMASK(6, 4);
9031a36d2eeSFrank Wang 	reg |= (0x05 << 4);
9041a36d2eeSFrank Wang 	writel(reg, rphy->phy_base + 0x0430);
9051a36d2eeSFrank Wang 
9061a36d2eeSFrank Wang 	return ret;
9071a36d2eeSFrank Wang }
9081a36d2eeSFrank Wang 
9094367cef2SWilliam Wu static int rk3588_usb2phy_tuning(struct rockchip_usb2phy *rphy)
9104367cef2SWilliam Wu {
9114367cef2SWilliam Wu 	struct regmap *base = get_reg_base(rphy);
9124367cef2SWilliam Wu 	int ret;
9134367cef2SWilliam Wu 
9144367cef2SWilliam Wu 	/* Deassert SIDDQ to power on analog block */
9154367cef2SWilliam Wu 	ret = regmap_write(base, 0x0008, GENMASK(29, 29) | 0x0000);
9164367cef2SWilliam Wu 	if (ret)
9174367cef2SWilliam Wu 		return ret;
9184367cef2SWilliam Wu 
9194367cef2SWilliam Wu 	/* Do reset after exit IDDQ mode */
9204367cef2SWilliam Wu 	ret = rockchip_usb2phy_reset(rphy);
9214367cef2SWilliam Wu 	if (ret)
9224367cef2SWilliam Wu 		return ret;
9234367cef2SWilliam Wu 
9244367cef2SWilliam Wu 	/* HS DC Voltage Level Adjustment 4'b1001 : +5.89% */
9254367cef2SWilliam Wu 	ret = regmap_write(base, 0x0004, GENMASK(27, 24) | 0x0900);
9264367cef2SWilliam Wu 	if (ret)
9274367cef2SWilliam Wu 		return ret;
9284367cef2SWilliam Wu 
9294367cef2SWilliam Wu 	/* HS Transmitter Pre-Emphasis Current Control 2'b10 : 2x */
9304367cef2SWilliam Wu 	ret = regmap_write(base, 0x0008, GENMASK(20, 19) | 0x0010);
9314367cef2SWilliam Wu 	if (ret)
9324367cef2SWilliam Wu 		return ret;
9334367cef2SWilliam Wu 
9344367cef2SWilliam Wu 	return 0;
9354367cef2SWilliam Wu }
9364367cef2SWilliam Wu 
937f0c40dcdSWu Liang feng static struct phy_ops rockchip_usb2phy_ops = {
938f0c40dcdSWu Liang feng 	.init = rockchip_usb2phy_init,
939f0c40dcdSWu Liang feng 	.exit = rockchip_usb2phy_exit,
94086df9e88SFrank Wang 	.power_on = rockchip_usb2phy_power_on,
94186df9e88SFrank Wang 	.power_off = rockchip_usb2phy_power_off,
9429b3cc842SFrank Wang 	.of_xlate = rockchip_usb2phy_of_xlate,
943f0c40dcdSWu Liang feng };
944f0c40dcdSWu Liang feng 
945b31aa7beSWilliam Wu static const struct rockchip_usb2phy_cfg rk1808_phy_cfgs[] = {
946b31aa7beSWilliam Wu 	{
947b31aa7beSWilliam Wu 		.reg = 0x100,
948b31aa7beSWilliam Wu 		.num_ports	= 2,
949b31aa7beSWilliam Wu 		.clkout_ctl	= { 0x108, 4, 4, 1, 0 },
950b31aa7beSWilliam Wu 		.port_cfgs	= {
951b31aa7beSWilliam Wu 			[USB2PHY_PORT_OTG] = {
952b31aa7beSWilliam Wu 				.phy_sus	= { 0x0100, 8, 0, 0, 0x1d1 },
953b31aa7beSWilliam Wu 				.bvalid_det_en	= { 0x0110, 2, 2, 0, 1 },
954b31aa7beSWilliam Wu 				.bvalid_det_st	= { 0x0114, 2, 2, 0, 1 },
955b31aa7beSWilliam Wu 				.bvalid_det_clr = { 0x0118, 2, 2, 0, 1 },
956b31aa7beSWilliam Wu 				.iddig_output	= { 0x0100, 10, 10, 0, 1 },
957b31aa7beSWilliam Wu 				.iddig_en	= { 0x0100, 9, 9, 0, 1 },
958b31aa7beSWilliam Wu 				.idfall_det_en	= { 0x0110, 5, 5, 0, 1 },
959b31aa7beSWilliam Wu 				.idfall_det_st	= { 0x0114, 5, 5, 0, 1 },
960b31aa7beSWilliam Wu 				.idfall_det_clr = { 0x0118, 5, 5, 0, 1 },
961b31aa7beSWilliam Wu 				.idrise_det_en	= { 0x0110, 4, 4, 0, 1 },
962b31aa7beSWilliam Wu 				.idrise_det_st	= { 0x0114, 4, 4, 0, 1 },
963b31aa7beSWilliam Wu 				.idrise_det_clr = { 0x0118, 4, 4, 0, 1 },
964b31aa7beSWilliam Wu 				.ls_det_en	= { 0x0110, 0, 0, 0, 1 },
965b31aa7beSWilliam Wu 				.ls_det_st	= { 0x0114, 0, 0, 0, 1 },
966b31aa7beSWilliam Wu 				.ls_det_clr	= { 0x0118, 0, 0, 0, 1 },
967b31aa7beSWilliam Wu 				.utmi_avalid	= { 0x0120, 10, 10, 0, 1 },
968b31aa7beSWilliam Wu 				.utmi_bvalid	= { 0x0120, 9, 9, 0, 1 },
969b31aa7beSWilliam Wu 				.utmi_iddig	= { 0x0120, 6, 6, 0, 1 },
970b31aa7beSWilliam Wu 				.utmi_ls	= { 0x0120, 5, 4, 0, 1 },
971b31aa7beSWilliam Wu 				.vbus_det_en	= { 0x001c, 15, 15, 1, 0 },
972b31aa7beSWilliam Wu 			},
973b31aa7beSWilliam Wu 			[USB2PHY_PORT_HOST] = {
974b31aa7beSWilliam Wu 				.phy_sus	= { 0x104, 8, 0, 0, 0x1d1 },
975b31aa7beSWilliam Wu 				.ls_det_en	= { 0x110, 1, 1, 0, 1 },
976b31aa7beSWilliam Wu 				.ls_det_st	= { 0x114, 1, 1, 0, 1 },
977b31aa7beSWilliam Wu 				.ls_det_clr	= { 0x118, 1, 1, 0, 1 },
978b31aa7beSWilliam Wu 				.utmi_ls	= { 0x120, 17, 16, 0, 1 },
979b31aa7beSWilliam Wu 				.utmi_hstdet	= { 0x120, 19, 19, 0, 1 }
980b31aa7beSWilliam Wu 			}
981b31aa7beSWilliam Wu 		},
982b31aa7beSWilliam Wu 		.chg_det = {
983b31aa7beSWilliam Wu 			.opmode		= { 0x0100, 3, 0, 5, 1 },
984b31aa7beSWilliam Wu 			.cp_det		= { 0x0120, 24, 24, 0, 1 },
985b31aa7beSWilliam Wu 			.dcp_det	= { 0x0120, 23, 23, 0, 1 },
986b31aa7beSWilliam Wu 			.dp_det		= { 0x0120, 25, 25, 0, 1 },
987b31aa7beSWilliam Wu 			.idm_sink_en	= { 0x0108, 8, 8, 0, 1 },
988b31aa7beSWilliam Wu 			.idp_sink_en	= { 0x0108, 7, 7, 0, 1 },
989b31aa7beSWilliam Wu 			.idp_src_en	= { 0x0108, 9, 9, 0, 1 },
990b31aa7beSWilliam Wu 			.rdm_pdwn_en	= { 0x0108, 10, 10, 0, 1 },
991b31aa7beSWilliam Wu 			.vdm_src_en	= { 0x0108, 12, 12, 0, 1 },
992b31aa7beSWilliam Wu 			.vdp_src_en	= { 0x0108, 11, 11, 0, 1 },
993b31aa7beSWilliam Wu 		},
994b31aa7beSWilliam Wu 	},
995b31aa7beSWilliam Wu 	{ /* sentinel */ }
996b31aa7beSWilliam Wu };
997b31aa7beSWilliam Wu 
998baa12648SJianwei Zheng static const struct rockchip_usb2phy_cfg rk3036_phy_cfgs[] = {
999baa12648SJianwei Zheng 	{
1000baa12648SJianwei Zheng 		.reg = 0x17c,
1001baa12648SJianwei Zheng 		.num_ports	= 2,
1002baa12648SJianwei Zheng 		.clkout_ctl	= { 0x017c, 11, 11, 1, 0 },
1003baa12648SJianwei Zheng 		.port_cfgs	= {
1004baa12648SJianwei Zheng 			[USB2PHY_PORT_OTG] = {
1005baa12648SJianwei Zheng 				.phy_sus	= { 0x017c, 8, 0, 0, 0x1d1 },
1006baa12648SJianwei Zheng 				.bvalid_det_en	= { 0x017c, 14, 14, 0, 1 },
1007baa12648SJianwei Zheng 				.bvalid_det_st	= { 0x017c, 15, 15, 0, 1 },
1008baa12648SJianwei Zheng 				.bvalid_det_clr	= { 0x017c, 15, 15, 0, 1 },
1009baa12648SJianwei Zheng 				.iddig_output	= { 0x017c, 10, 10, 0, 1 },
1010baa12648SJianwei Zheng 				.iddig_en	= { 0x017c, 9, 9, 0, 1 },
1011baa12648SJianwei Zheng 				.idfall_det_en  = { 0x01a0, 2, 2, 0, 1 },
1012baa12648SJianwei Zheng 				.idfall_det_st  = { 0x01a0, 3, 3, 0, 1 },
1013baa12648SJianwei Zheng 				.idfall_det_clr = { 0x01a0, 3, 3, 0, 1 },
1014baa12648SJianwei Zheng 				.idrise_det_en  = { 0x01a0, 0, 0, 0, 1 },
1015baa12648SJianwei Zheng 				.idrise_det_st  = { 0x01a0, 1, 1, 0, 1 },
1016baa12648SJianwei Zheng 				.idrise_det_clr = { 0x01a0, 1, 1, 0, 1 },
1017baa12648SJianwei Zheng 				.ls_det_en	= { 0x017c, 12, 12, 0, 1 },
1018baa12648SJianwei Zheng 				.ls_det_st	= { 0x017c, 13, 13, 0, 1 },
1019baa12648SJianwei Zheng 				.ls_det_clr	= { 0x017c, 13, 13, 0, 1 },
1020baa12648SJianwei Zheng 				.utmi_bvalid	= { 0x014c, 5, 5, 0, 1 },
1021baa12648SJianwei Zheng 				.utmi_iddig	= { 0x014c, 8, 8, 0, 1 },
1022baa12648SJianwei Zheng 				.utmi_ls	= { 0x014c, 7, 6, 0, 1 },
1023baa12648SJianwei Zheng 			},
1024baa12648SJianwei Zheng 			[USB2PHY_PORT_HOST] = {
1025baa12648SJianwei Zheng 				.phy_sus	= { 0x0194, 8, 0, 0, 0x1d1 },
1026baa12648SJianwei Zheng 				.ls_det_en	= { 0x0194, 14, 14, 0, 1 },
1027baa12648SJianwei Zheng 				.ls_det_st	= { 0x0194, 15, 15, 0, 1 },
1028baa12648SJianwei Zheng 				.ls_det_clr	= { 0x0194, 15, 15, 0, 1 }
1029baa12648SJianwei Zheng 			}
1030baa12648SJianwei Zheng 		},
1031baa12648SJianwei Zheng 	},
1032baa12648SJianwei Zheng 	{ /* sentinel */ }
1033baa12648SJianwei Zheng };
1034baa12648SJianwei Zheng 
1035f0c40dcdSWu Liang feng static const struct rockchip_usb2phy_cfg rk312x_phy_cfgs[] = {
1036f0c40dcdSWu Liang feng 	{
1037f0c40dcdSWu Liang feng 		.reg = 0x17c,
1038f0c40dcdSWu Liang feng 		.num_ports	= 2,
1039f0c40dcdSWu Liang feng 		.clkout_ctl	= { 0x0190, 15, 15, 1, 0 },
1040f0c40dcdSWu Liang feng 		.port_cfgs	= {
1041f0c40dcdSWu Liang feng 			[USB2PHY_PORT_OTG] = {
1042f0c40dcdSWu Liang feng 				.phy_sus	= { 0x017c, 8, 0, 0, 0x1d1 },
1043f0c40dcdSWu Liang feng 				.bvalid_det_en	= { 0x017c, 14, 14, 0, 1 },
1044f0c40dcdSWu Liang feng 				.bvalid_det_st	= { 0x017c, 15, 15, 0, 1 },
1045f0c40dcdSWu Liang feng 				.bvalid_det_clr	= { 0x017c, 15, 15, 0, 1 },
1046f0c40dcdSWu Liang feng 				.iddig_output	= { 0x017c, 10, 10, 0, 1 },
1047f0c40dcdSWu Liang feng 				.iddig_en	= { 0x017c, 9, 9, 0, 1 },
1048f0c40dcdSWu Liang feng 				.idfall_det_en  = { 0x01a0, 2, 2, 0, 1 },
1049f0c40dcdSWu Liang feng 				.idfall_det_st  = { 0x01a0, 3, 3, 0, 1 },
1050f0c40dcdSWu Liang feng 				.idfall_det_clr = { 0x01a0, 3, 3, 0, 1 },
1051f0c40dcdSWu Liang feng 				.idrise_det_en  = { 0x01a0, 0, 0, 0, 1 },
1052f0c40dcdSWu Liang feng 				.idrise_det_st  = { 0x01a0, 1, 1, 0, 1 },
1053f0c40dcdSWu Liang feng 				.idrise_det_clr = { 0x01a0, 1, 1, 0, 1 },
1054f0c40dcdSWu Liang feng 				.ls_det_en	= { 0x017c, 12, 12, 0, 1 },
1055f0c40dcdSWu Liang feng 				.ls_det_st	= { 0x017c, 13, 13, 0, 1 },
1056f0c40dcdSWu Liang feng 				.ls_det_clr	= { 0x017c, 13, 13, 0, 1 },
1057f0c40dcdSWu Liang feng 				.utmi_bvalid	= { 0x014c, 5, 5, 0, 1 },
1058f0c40dcdSWu Liang feng 				.utmi_iddig	= { 0x014c, 8, 8, 0, 1 },
1059f0c40dcdSWu Liang feng 				.utmi_ls	= { 0x014c, 7, 6, 0, 1 },
1060f0c40dcdSWu Liang feng 			},
1061f0c40dcdSWu Liang feng 			[USB2PHY_PORT_HOST] = {
1062f0c40dcdSWu Liang feng 				.phy_sus	= { 0x0194, 8, 0, 0, 0x1d1 },
1063f0c40dcdSWu Liang feng 				.ls_det_en	= { 0x0194, 14, 14, 0, 1 },
1064f0c40dcdSWu Liang feng 				.ls_det_st	= { 0x0194, 15, 15, 0, 1 },
1065f0c40dcdSWu Liang feng 				.ls_det_clr	= { 0x0194, 15, 15, 0, 1 }
1066f0c40dcdSWu Liang feng 			}
1067f0c40dcdSWu Liang feng 		},
1068f0c40dcdSWu Liang feng 		.chg_det = {
1069f0c40dcdSWu Liang feng 			.opmode		= { 0x017c, 3, 0, 5, 1 },
1070f0c40dcdSWu Liang feng 			.cp_det		= { 0x02c0, 6, 6, 0, 1 },
1071f0c40dcdSWu Liang feng 			.dcp_det	= { 0x02c0, 5, 5, 0, 1 },
1072f0c40dcdSWu Liang feng 			.dp_det		= { 0x02c0, 7, 7, 0, 1 },
1073f0c40dcdSWu Liang feng 			.idm_sink_en	= { 0x0184, 8, 8, 0, 1 },
1074f0c40dcdSWu Liang feng 			.idp_sink_en	= { 0x0184, 7, 7, 0, 1 },
1075f0c40dcdSWu Liang feng 			.idp_src_en	= { 0x0184, 9, 9, 0, 1 },
1076f0c40dcdSWu Liang feng 			.rdm_pdwn_en	= { 0x0184, 10, 10, 0, 1 },
1077f0c40dcdSWu Liang feng 			.vdm_src_en	= { 0x0184, 12, 12, 0, 1 },
1078f0c40dcdSWu Liang feng 			.vdp_src_en	= { 0x0184, 11, 11, 0, 1 },
1079f0c40dcdSWu Liang feng 		},
1080f0c40dcdSWu Liang feng 	},
1081f0c40dcdSWu Liang feng 	{ /* sentinel */ }
1082f0c40dcdSWu Liang feng };
1083f0c40dcdSWu Liang feng 
1084a636a6d7SWilliam Wu static const struct rockchip_usb2phy_cfg rk322x_phy_cfgs[] = {
1085a636a6d7SWilliam Wu 	{
1086a636a6d7SWilliam Wu 		.reg = 0x760,
1087a636a6d7SWilliam Wu 		.num_ports	= 2,
1088a636a6d7SWilliam Wu 		.phy_tuning	= rk322x_usb2phy_tuning,
1089a636a6d7SWilliam Wu 		.clkout_ctl	= { 0x0768, 4, 4, 1, 0 },
1090a636a6d7SWilliam Wu 		.port_cfgs	= {
1091a636a6d7SWilliam Wu 			[USB2PHY_PORT_OTG] = {
1092a636a6d7SWilliam Wu 				.phy_sus	= { 0x0760, 8, 0, 0, 0x1d1 },
1093a636a6d7SWilliam Wu 				.bvalid_det_en	= { 0x0680, 3, 3, 0, 1 },
1094a636a6d7SWilliam Wu 				.bvalid_det_st	= { 0x0690, 3, 3, 0, 1 },
1095a636a6d7SWilliam Wu 				.bvalid_det_clr	= { 0x06a0, 3, 3, 0, 1 },
1096a636a6d7SWilliam Wu 				.iddig_output	= { 0x0760, 10, 10, 0, 1 },
1097a636a6d7SWilliam Wu 				.iddig_en	= { 0x0760, 9, 9, 0, 1 },
1098a636a6d7SWilliam Wu 				.idfall_det_en	= { 0x0680, 6, 6, 0, 1 },
1099a636a6d7SWilliam Wu 				.idfall_det_st	= { 0x0690, 6, 6, 0, 1 },
1100a636a6d7SWilliam Wu 				.idfall_det_clr	= { 0x06a0, 6, 6, 0, 1 },
1101a636a6d7SWilliam Wu 				.idrise_det_en	= { 0x0680, 5, 5, 0, 1 },
1102a636a6d7SWilliam Wu 				.idrise_det_st	= { 0x0690, 5, 5, 0, 1 },
1103a636a6d7SWilliam Wu 				.idrise_det_clr	= { 0x06a0, 5, 5, 0, 1 },
1104a636a6d7SWilliam Wu 				.ls_det_en	= { 0x0680, 2, 2, 0, 1 },
1105a636a6d7SWilliam Wu 				.ls_det_st	= { 0x0690, 2, 2, 0, 1 },
1106a636a6d7SWilliam Wu 				.ls_det_clr	= { 0x06a0, 2, 2, 0, 1 },
1107a636a6d7SWilliam Wu 				.utmi_bvalid	= { 0x0480, 4, 4, 0, 1 },
1108a636a6d7SWilliam Wu 				.utmi_iddig	= { 0x0480, 1, 1, 0, 1 },
1109a636a6d7SWilliam Wu 				.utmi_ls	= { 0x0480, 3, 2, 0, 1 },
1110a636a6d7SWilliam Wu 				.vbus_det_en	= { 0x0788, 15, 15, 1, 0 },
1111a636a6d7SWilliam Wu 			},
1112a636a6d7SWilliam Wu 			[USB2PHY_PORT_HOST] = {
1113a636a6d7SWilliam Wu 				.phy_sus	= { 0x0764, 8, 0, 0, 0x1d1 },
1114a636a6d7SWilliam Wu 				.ls_det_en	= { 0x0680, 4, 4, 0, 1 },
1115a636a6d7SWilliam Wu 				.ls_det_st	= { 0x0690, 4, 4, 0, 1 },
1116a636a6d7SWilliam Wu 				.ls_det_clr	= { 0x06a0, 4, 4, 0, 1 }
1117a636a6d7SWilliam Wu 			}
1118a636a6d7SWilliam Wu 		},
1119a636a6d7SWilliam Wu 		.chg_det = {
1120a636a6d7SWilliam Wu 			.opmode		= { 0x0760, 3, 0, 5, 1 },
1121a636a6d7SWilliam Wu 			.cp_det		= { 0x0884, 4, 4, 0, 1 },
1122a636a6d7SWilliam Wu 			.dcp_det	= { 0x0884, 3, 3, 0, 1 },
1123a636a6d7SWilliam Wu 			.dp_det		= { 0x0884, 5, 5, 0, 1 },
1124a636a6d7SWilliam Wu 			.idm_sink_en	= { 0x0768, 8, 8, 0, 1 },
1125a636a6d7SWilliam Wu 			.idp_sink_en	= { 0x0768, 7, 7, 0, 1 },
1126a636a6d7SWilliam Wu 			.idp_src_en	= { 0x0768, 9, 9, 0, 1 },
1127a636a6d7SWilliam Wu 			.rdm_pdwn_en	= { 0x0768, 10, 10, 0, 1 },
1128a636a6d7SWilliam Wu 			.vdm_src_en	= { 0x0768, 12, 12, 0, 1 },
1129a636a6d7SWilliam Wu 			.vdp_src_en	= { 0x0768, 11, 11, 0, 1 },
1130a636a6d7SWilliam Wu 		},
1131a636a6d7SWilliam Wu 	},
1132a636a6d7SWilliam Wu 	{
1133a636a6d7SWilliam Wu 		.reg = 0x800,
1134a636a6d7SWilliam Wu 		.num_ports	= 2,
1135a636a6d7SWilliam Wu 		.clkout_ctl	= { 0x0808, 4, 4, 1, 0 },
1136a636a6d7SWilliam Wu 		.port_cfgs	= {
1137a636a6d7SWilliam Wu 			[USB2PHY_PORT_OTG] = {
1138a636a6d7SWilliam Wu 				.phy_sus	= { 0x804, 8, 0, 0, 0x1d1 },
1139a636a6d7SWilliam Wu 				.ls_det_en	= { 0x0684, 1, 1, 0, 1 },
1140a636a6d7SWilliam Wu 				.ls_det_st	= { 0x0694, 1, 1, 0, 1 },
1141a636a6d7SWilliam Wu 				.ls_det_clr	= { 0x06a4, 1, 1, 0, 1 }
1142a636a6d7SWilliam Wu 			},
1143a636a6d7SWilliam Wu 			[USB2PHY_PORT_HOST] = {
1144a636a6d7SWilliam Wu 				.phy_sus	= { 0x800, 8, 0, 0, 0x1d1 },
1145a636a6d7SWilliam Wu 				.ls_det_en	= { 0x0684, 0, 0, 0, 1 },
1146a636a6d7SWilliam Wu 				.ls_det_st	= { 0x0694, 0, 0, 0, 1 },
1147a636a6d7SWilliam Wu 				.ls_det_clr	= { 0x06a4, 0, 0, 0, 1 }
1148a636a6d7SWilliam Wu 			}
1149a636a6d7SWilliam Wu 		},
1150a636a6d7SWilliam Wu 	},
1151a636a6d7SWilliam Wu 	{ /* sentinel */ }
1152a636a6d7SWilliam Wu };
1153a636a6d7SWilliam Wu 
1154675552f7SFrank Wang static const struct rockchip_usb2phy_cfg rk3308_phy_cfgs[] = {
1155675552f7SFrank Wang 	{
1156675552f7SFrank Wang 		.reg = 0x100,
1157675552f7SFrank Wang 		.num_ports	= 2,
1158675552f7SFrank Wang 		.phy_tuning	= rk3308_usb2phy_tuning,
1159675552f7SFrank Wang 		.clkout_ctl	= { 0x0108, 4, 4, 1, 0 },
1160675552f7SFrank Wang 		.port_cfgs	= {
1161675552f7SFrank Wang 			[USB2PHY_PORT_OTG] = {
1162675552f7SFrank Wang 				.phy_sus	= { 0x0100, 8, 0, 0, 0x1d1 },
1163675552f7SFrank Wang 				.bvalid_det_en	= { 0x3020, 2, 2, 0, 1 },
1164675552f7SFrank Wang 				.bvalid_det_st	= { 0x3024, 2, 2, 0, 1 },
1165675552f7SFrank Wang 				.bvalid_det_clr = { 0x3028, 2, 2, 0, 1 },
1166675552f7SFrank Wang 				.iddig_output	= { 0x0100, 10, 10, 0, 1 },
1167675552f7SFrank Wang 				.iddig_en	= { 0x0100, 9, 9, 0, 1 },
1168675552f7SFrank Wang 				.idfall_det_en	= { 0x3020, 5, 5, 0, 1 },
1169675552f7SFrank Wang 				.idfall_det_st	= { 0x3024, 5, 5, 0, 1 },
1170675552f7SFrank Wang 				.idfall_det_clr = { 0x3028, 5, 5, 0, 1 },
1171675552f7SFrank Wang 				.idrise_det_en	= { 0x3020, 4, 4, 0, 1 },
1172675552f7SFrank Wang 				.idrise_det_st	= { 0x3024, 4, 4, 0, 1 },
1173675552f7SFrank Wang 				.idrise_det_clr = { 0x3028, 4, 4, 0, 1 },
1174675552f7SFrank Wang 				.ls_det_en	= { 0x3020, 0, 0, 0, 1 },
1175675552f7SFrank Wang 				.ls_det_st	= { 0x3024, 0, 0, 0, 1 },
1176675552f7SFrank Wang 				.ls_det_clr	= { 0x3028, 0, 0, 0, 1 },
1177675552f7SFrank Wang 				.utmi_avalid	= { 0x0120, 10, 10, 0, 1 },
1178675552f7SFrank Wang 				.utmi_bvalid	= { 0x0120, 9, 9, 0, 1 },
1179675552f7SFrank Wang 				.utmi_iddig	= { 0x0120, 6, 6, 0, 1 },
1180675552f7SFrank Wang 				.utmi_ls	= { 0x0120, 5, 4, 0, 1 },
1181675552f7SFrank Wang 				.vbus_det_en	= { 0x001c, 15, 15, 1, 0 },
1182675552f7SFrank Wang 			},
1183675552f7SFrank Wang 			[USB2PHY_PORT_HOST] = {
1184675552f7SFrank Wang 				.phy_sus	= { 0x0104, 8, 0, 0, 0x1d1 },
1185675552f7SFrank Wang 				.ls_det_en	= { 0x3020, 1, 1, 0, 1 },
1186675552f7SFrank Wang 				.ls_det_st	= { 0x3024, 1, 1, 0, 1 },
1187675552f7SFrank Wang 				.ls_det_clr	= { 0x3028, 1, 1, 0, 1 },
1188675552f7SFrank Wang 				.utmi_ls	= { 0x120, 17, 16, 0, 1 },
1189675552f7SFrank Wang 				.utmi_hstdet	= { 0x120, 19, 19, 0, 1 }
1190675552f7SFrank Wang 			}
1191675552f7SFrank Wang 		},
1192675552f7SFrank Wang 		.chg_det = {
1193675552f7SFrank Wang 			.opmode		= { 0x0100, 3, 0, 5, 1 },
1194675552f7SFrank Wang 			.cp_det		= { 0x0120, 24, 24, 0, 1 },
1195675552f7SFrank Wang 			.dcp_det	= { 0x0120, 23, 23, 0, 1 },
1196675552f7SFrank Wang 			.dp_det		= { 0x0120, 25, 25, 0, 1 },
1197675552f7SFrank Wang 			.idm_sink_en	= { 0x0108, 8, 8, 0, 1 },
1198675552f7SFrank Wang 			.idp_sink_en	= { 0x0108, 7, 7, 0, 1 },
1199675552f7SFrank Wang 			.idp_src_en	= { 0x0108, 9, 9, 0, 1 },
1200675552f7SFrank Wang 			.rdm_pdwn_en	= { 0x0108, 10, 10, 0, 1 },
1201675552f7SFrank Wang 			.vdm_src_en	= { 0x0108, 12, 12, 0, 1 },
1202675552f7SFrank Wang 			.vdp_src_en	= { 0x0108, 11, 11, 0, 1 },
1203675552f7SFrank Wang 		},
1204675552f7SFrank Wang 	},
1205675552f7SFrank Wang 	{ /* sentinel */ }
1206675552f7SFrank Wang };
1207675552f7SFrank Wang 
1208f0c40dcdSWu Liang feng static const struct rockchip_usb2phy_cfg rk3328_phy_cfgs[] = {
1209f0c40dcdSWu Liang feng 	{
1210f0c40dcdSWu Liang feng 		.reg = 0x100,
1211f0c40dcdSWu Liang feng 		.num_ports	= 2,
1212134d55e1SJianwei Zheng 		.phy_tuning = rk3328_usb2phy_tuning,
1213f0c40dcdSWu Liang feng 		.clkout_ctl	= { 0x108, 4, 4, 1, 0 },
1214f0c40dcdSWu Liang feng 		.port_cfgs	= {
1215f0c40dcdSWu Liang feng 			[USB2PHY_PORT_OTG] = {
1216f0c40dcdSWu Liang feng 				.phy_sus	= { 0x0100, 8, 0, 0, 0x1d1 },
1217f0c40dcdSWu Liang feng 				.bvalid_det_en	= { 0x0110, 2, 2, 0, 1 },
1218f0c40dcdSWu Liang feng 				.bvalid_det_st	= { 0x0114, 2, 2, 0, 1 },
1219f0c40dcdSWu Liang feng 				.bvalid_det_clr = { 0x0118, 2, 2, 0, 1 },
1220f0c40dcdSWu Liang feng 				.iddig_output	= { 0x0100, 10, 10, 0, 1 },
1221f0c40dcdSWu Liang feng 				.iddig_en	= { 0x0100, 9, 9, 0, 1 },
1222f0c40dcdSWu Liang feng 				.idfall_det_en	= { 0x0110, 5, 5, 0, 1 },
1223f0c40dcdSWu Liang feng 				.idfall_det_st	= { 0x0114, 5, 5, 0, 1 },
1224f0c40dcdSWu Liang feng 				.idfall_det_clr = { 0x0118, 5, 5, 0, 1 },
1225f0c40dcdSWu Liang feng 				.idrise_det_en	= { 0x0110, 4, 4, 0, 1 },
1226f0c40dcdSWu Liang feng 				.idrise_det_st	= { 0x0114, 4, 4, 0, 1 },
1227f0c40dcdSWu Liang feng 				.idrise_det_clr = { 0x0118, 4, 4, 0, 1 },
1228f0c40dcdSWu Liang feng 				.ls_det_en	= { 0x0110, 0, 0, 0, 1 },
1229f0c40dcdSWu Liang feng 				.ls_det_st	= { 0x0114, 0, 0, 0, 1 },
1230f0c40dcdSWu Liang feng 				.ls_det_clr	= { 0x0118, 0, 0, 0, 1 },
1231f0c40dcdSWu Liang feng 				.utmi_avalid	= { 0x0120, 10, 10, 0, 1 },
1232f0c40dcdSWu Liang feng 				.utmi_bvalid	= { 0x0120, 9, 9, 0, 1 },
1233f0c40dcdSWu Liang feng 				.utmi_iddig	= { 0x0120, 6, 6, 0, 1 },
1234f0c40dcdSWu Liang feng 				.utmi_ls	= { 0x0120, 5, 4, 0, 1 },
1235f0c40dcdSWu Liang feng 				.vbus_det_en	= { 0x001c, 15, 15, 1, 0 },
1236f0c40dcdSWu Liang feng 			},
1237f0c40dcdSWu Liang feng 			[USB2PHY_PORT_HOST] = {
1238f0c40dcdSWu Liang feng 				.phy_sus	= { 0x104, 8, 0, 0, 0x1d1 },
1239f0c40dcdSWu Liang feng 				.ls_det_en	= { 0x110, 1, 1, 0, 1 },
1240f0c40dcdSWu Liang feng 				.ls_det_st	= { 0x114, 1, 1, 0, 1 },
1241f0c40dcdSWu Liang feng 				.ls_det_clr	= { 0x118, 1, 1, 0, 1 },
1242f0c40dcdSWu Liang feng 				.utmi_ls	= { 0x120, 17, 16, 0, 1 },
1243f0c40dcdSWu Liang feng 				.utmi_hstdet	= { 0x120, 19, 19, 0, 1 }
1244f0c40dcdSWu Liang feng 			}
1245f0c40dcdSWu Liang feng 		},
1246f0c40dcdSWu Liang feng 		.chg_det = {
1247f0c40dcdSWu Liang feng 			.opmode		= { 0x0100, 3, 0, 5, 1 },
1248f0c40dcdSWu Liang feng 			.cp_det		= { 0x0120, 24, 24, 0, 1 },
1249f0c40dcdSWu Liang feng 			.dcp_det	= { 0x0120, 23, 23, 0, 1 },
1250f0c40dcdSWu Liang feng 			.dp_det		= { 0x0120, 25, 25, 0, 1 },
1251f0c40dcdSWu Liang feng 			.idm_sink_en	= { 0x0108, 8, 8, 0, 1 },
1252f0c40dcdSWu Liang feng 			.idp_sink_en	= { 0x0108, 7, 7, 0, 1 },
1253f0c40dcdSWu Liang feng 			.idp_src_en	= { 0x0108, 9, 9, 0, 1 },
1254f0c40dcdSWu Liang feng 			.rdm_pdwn_en	= { 0x0108, 10, 10, 0, 1 },
1255f0c40dcdSWu Liang feng 			.vdm_src_en	= { 0x0108, 12, 12, 0, 1 },
1256f0c40dcdSWu Liang feng 			.vdp_src_en	= { 0x0108, 11, 11, 0, 1 },
1257f0c40dcdSWu Liang feng 		},
1258f0c40dcdSWu Liang feng 	},
1259f0c40dcdSWu Liang feng 	{ /* sentinel */ }
1260f0c40dcdSWu Liang feng };
1261f0c40dcdSWu Liang feng 
12622d39b251SWilliam Wu static const struct rockchip_usb2phy_cfg rk3368_phy_cfgs[] = {
12632d39b251SWilliam Wu 	{
12642d39b251SWilliam Wu 		.reg = 0x700,
12652d39b251SWilliam Wu 		.num_ports	= 2,
12662d39b251SWilliam Wu 		.clkout_ctl	= { 0x0724, 15, 15, 1, 0 },
12672d39b251SWilliam Wu 		.port_cfgs	= {
12682d39b251SWilliam Wu 			[USB2PHY_PORT_OTG] = {
12692d39b251SWilliam Wu 				.phy_sus	= { 0x0700, 8, 0, 0, 0x1d1 },
12702d39b251SWilliam Wu 				.bvalid_det_en	= { 0x0680, 3, 3, 0, 1 },
12712d39b251SWilliam Wu 				.bvalid_det_st	= { 0x0690, 3, 3, 0, 1 },
12722d39b251SWilliam Wu 				.bvalid_det_clr = { 0x06a0, 3, 3, 0, 1 },
12732d39b251SWilliam Wu 				.ls_det_en	= { 0x0680, 2, 2, 0, 1 },
12742d39b251SWilliam Wu 				.ls_det_st	= { 0x0690, 2, 2, 0, 1 },
12752d39b251SWilliam Wu 				.ls_det_clr	= { 0x06a0, 2, 2, 0, 1 },
12762d39b251SWilliam Wu 				.utmi_bvalid	= { 0x04bc, 23, 23, 0, 1 },
12772d39b251SWilliam Wu 				.utmi_ls	= { 0x04bc, 25, 24, 0, 1 },
12782d39b251SWilliam Wu 			},
12792d39b251SWilliam Wu 			[USB2PHY_PORT_HOST] = {
12802d39b251SWilliam Wu 				.phy_sus	= { 0x0728, 8, 0, 0, 0x1d1 },
12812d39b251SWilliam Wu 				.ls_det_en	= { 0x0680, 4, 4, 0, 1 },
12822d39b251SWilliam Wu 				.ls_det_st	= { 0x0690, 4, 4, 0, 1 },
12832d39b251SWilliam Wu 				.ls_det_clr	= { 0x06a0, 4, 4, 0, 1 }
12842d39b251SWilliam Wu 			}
12852d39b251SWilliam Wu 		},
12862d39b251SWilliam Wu 		.chg_det = {
12872d39b251SWilliam Wu 			.opmode		= { 0x0700, 3, 0, 5, 1 },
12882d39b251SWilliam Wu 			.cp_det		= { 0x04b8, 30, 30, 0, 1 },
12892d39b251SWilliam Wu 			.dcp_det	= { 0x04b8, 29, 29, 0, 1 },
12902d39b251SWilliam Wu 			.dp_det		= { 0x04b8, 31, 31, 0, 1 },
12912d39b251SWilliam Wu 			.idm_sink_en	= { 0x0718, 8, 8, 0, 1 },
12922d39b251SWilliam Wu 			.idp_sink_en	= { 0x0718, 7, 7, 0, 1 },
12932d39b251SWilliam Wu 			.idp_src_en	= { 0x0718, 9, 9, 0, 1 },
12942d39b251SWilliam Wu 			.rdm_pdwn_en	= { 0x0718, 10, 10, 0, 1 },
12952d39b251SWilliam Wu 			.vdm_src_en	= { 0x0718, 12, 12, 0, 1 },
12962d39b251SWilliam Wu 			.vdp_src_en	= { 0x0718, 11, 11, 0, 1 },
12972d39b251SWilliam Wu 		},
12982d39b251SWilliam Wu 	},
12992d39b251SWilliam Wu 	{ /* sentinel */ }
13002d39b251SWilliam Wu };
13012d39b251SWilliam Wu 
130284f12a43SWilliam Wu static const struct rockchip_usb2phy_cfg rk3399_phy_cfgs[] = {
130384f12a43SWilliam Wu 	{
130484f12a43SWilliam Wu 		.reg		= 0xe450,
130584f12a43SWilliam Wu 		.num_ports	= 2,
130684f12a43SWilliam Wu 		.clkout_ctl	= { 0xe450, 4, 4, 1, 0 },
130784f12a43SWilliam Wu 		.port_cfgs	= {
130884f12a43SWilliam Wu 			[USB2PHY_PORT_OTG] = {
130984f12a43SWilliam Wu 				.phy_sus = { 0xe454, 8, 0, 0x052, 0x1d1 },
131084f12a43SWilliam Wu 				.bvalid_det_en	= { 0xe3c0, 3, 3, 0, 1 },
131184f12a43SWilliam Wu 				.bvalid_det_st	= { 0xe3e0, 3, 3, 0, 1 },
131284f12a43SWilliam Wu 				.bvalid_det_clr	= { 0xe3d0, 3, 3, 0, 1 },
131384f12a43SWilliam Wu 				.idfall_det_en	= { 0xe3c0, 5, 5, 0, 1 },
131484f12a43SWilliam Wu 				.idfall_det_st	= { 0xe3e0, 5, 5, 0, 1 },
131584f12a43SWilliam Wu 				.idfall_det_clr	= { 0xe3d0, 5, 5, 0, 1 },
131684f12a43SWilliam Wu 				.idrise_det_en	= { 0xe3c0, 4, 4, 0, 1 },
131784f12a43SWilliam Wu 				.idrise_det_st	= { 0xe3e0, 4, 4, 0, 1 },
131884f12a43SWilliam Wu 				.idrise_det_clr	= { 0xe3d0, 4, 4, 0, 1 },
131984f12a43SWilliam Wu 				.ls_det_en	= { 0xe3c0, 2, 2, 0, 1 },
132084f12a43SWilliam Wu 				.ls_det_st	= { 0xe3e0, 2, 2, 0, 1 },
132184f12a43SWilliam Wu 				.ls_det_clr	= { 0xe3d0, 2, 2, 0, 1 },
132284f12a43SWilliam Wu 				.utmi_avalid	= { 0xe2ac, 7, 7, 0, 1 },
132384f12a43SWilliam Wu 				.utmi_bvalid	= { 0xe2ac, 12, 12, 0, 1 },
132484f12a43SWilliam Wu 				.utmi_iddig	= { 0xe2ac, 8, 8, 0, 1 },
132584f12a43SWilliam Wu 				.utmi_ls	= { 0xe2ac, 14, 13, 0, 1 },
132684f12a43SWilliam Wu 				.vbus_det_en    = { 0x449c, 15, 15, 1, 0 },
132784f12a43SWilliam Wu 			},
132884f12a43SWilliam Wu 			[USB2PHY_PORT_HOST] = {
132984f12a43SWilliam Wu 				.phy_sus	= { 0xe458, 1, 0, 0x2, 0x1 },
133084f12a43SWilliam Wu 				.ls_det_en	= { 0xe3c0, 6, 6, 0, 1 },
133184f12a43SWilliam Wu 				.ls_det_st	= { 0xe3e0, 6, 6, 0, 1 },
133284f12a43SWilliam Wu 				.ls_det_clr	= { 0xe3d0, 6, 6, 0, 1 },
133384f12a43SWilliam Wu 				.utmi_ls	= { 0xe2ac, 22, 21, 0, 1 },
133484f12a43SWilliam Wu 				.utmi_hstdet	= { 0xe2ac, 23, 23, 0, 1 }
133584f12a43SWilliam Wu 			}
133684f12a43SWilliam Wu 		},
133784f12a43SWilliam Wu 		.chg_det = {
133884f12a43SWilliam Wu 			.opmode		= { 0xe454, 3, 0, 5, 1 },
133984f12a43SWilliam Wu 			.cp_det		= { 0xe2ac, 2, 2, 0, 1 },
134084f12a43SWilliam Wu 			.dcp_det	= { 0xe2ac, 1, 1, 0, 1 },
134184f12a43SWilliam Wu 			.dp_det		= { 0xe2ac, 0, 0, 0, 1 },
134284f12a43SWilliam Wu 			.idm_sink_en	= { 0xe450, 8, 8, 0, 1 },
134384f12a43SWilliam Wu 			.idp_sink_en	= { 0xe450, 7, 7, 0, 1 },
134484f12a43SWilliam Wu 			.idp_src_en	= { 0xe450, 9, 9, 0, 1 },
134584f12a43SWilliam Wu 			.rdm_pdwn_en	= { 0xe450, 10, 10, 0, 1 },
134684f12a43SWilliam Wu 			.vdm_src_en	= { 0xe450, 12, 12, 0, 1 },
134784f12a43SWilliam Wu 			.vdp_src_en	= { 0xe450, 11, 11, 0, 1 },
134884f12a43SWilliam Wu 		},
134984f12a43SWilliam Wu 	},
135084f12a43SWilliam Wu 	{
135184f12a43SWilliam Wu 		.reg		= 0xe460,
135284f12a43SWilliam Wu 		.num_ports	= 2,
135384f12a43SWilliam Wu 		.clkout_ctl	= { 0xe460, 4, 4, 1, 0 },
135484f12a43SWilliam Wu 		.port_cfgs	= {
135584f12a43SWilliam Wu 			[USB2PHY_PORT_OTG] = {
135684f12a43SWilliam Wu 				.phy_sus = { 0xe464, 8, 0, 0x052, 0x1d1 },
135784f12a43SWilliam Wu 				.bvalid_det_en  = { 0xe3c0, 8, 8, 0, 1 },
135884f12a43SWilliam Wu 				.bvalid_det_st  = { 0xe3e0, 8, 8, 0, 1 },
135984f12a43SWilliam Wu 				.bvalid_det_clr = { 0xe3d0, 8, 8, 0, 1 },
136084f12a43SWilliam Wu 				.idfall_det_en	= { 0xe3c0, 10, 10, 0, 1 },
136184f12a43SWilliam Wu 				.idfall_det_st	= { 0xe3e0, 10, 10, 0, 1 },
136284f12a43SWilliam Wu 				.idfall_det_clr	= { 0xe3d0, 10, 10, 0, 1 },
136384f12a43SWilliam Wu 				.idrise_det_en	= { 0xe3c0, 9, 9, 0, 1 },
136484f12a43SWilliam Wu 				.idrise_det_st	= { 0xe3e0, 9, 9, 0, 1 },
136584f12a43SWilliam Wu 				.idrise_det_clr	= { 0xe3d0, 9, 9, 0, 1 },
136684f12a43SWilliam Wu 				.ls_det_en	= { 0xe3c0, 7, 7, 0, 1 },
136784f12a43SWilliam Wu 				.ls_det_st	= { 0xe3e0, 7, 7, 0, 1 },
136884f12a43SWilliam Wu 				.ls_det_clr	= { 0xe3d0, 7, 7, 0, 1 },
136984f12a43SWilliam Wu 				.utmi_avalid	= { 0xe2ac, 10, 10, 0, 1 },
137084f12a43SWilliam Wu 				.utmi_bvalid    = { 0xe2ac, 16, 16, 0, 1 },
137184f12a43SWilliam Wu 				.utmi_iddig	= { 0xe2ac, 11, 11, 0, 1 },
137284f12a43SWilliam Wu 				.utmi_ls	= { 0xe2ac, 18, 17, 0, 1 },
137384f12a43SWilliam Wu 				.vbus_det_en    = { 0x451c, 15, 15, 1, 0 },
137484f12a43SWilliam Wu 			},
137584f12a43SWilliam Wu 			[USB2PHY_PORT_HOST] = {
137684f12a43SWilliam Wu 				.phy_sus	= { 0xe468, 1, 0, 0x2, 0x1 },
137784f12a43SWilliam Wu 				.ls_det_en	= { 0xe3c0, 11, 11, 0, 1 },
137884f12a43SWilliam Wu 				.ls_det_st	= { 0xe3e0, 11, 11, 0, 1 },
137984f12a43SWilliam Wu 				.ls_det_clr	= { 0xe3d0, 11, 11, 0, 1 },
138084f12a43SWilliam Wu 				.utmi_ls	= { 0xe2ac, 26, 25, 0, 1 },
138184f12a43SWilliam Wu 				.utmi_hstdet	= { 0xe2ac, 27, 27, 0, 1 }
138284f12a43SWilliam Wu 			}
138384f12a43SWilliam Wu 		},
138484f12a43SWilliam Wu 		.chg_det = {
138584f12a43SWilliam Wu 			.opmode		= { 0xe464, 3, 0, 5, 1 },
138684f12a43SWilliam Wu 			.cp_det		= { 0xe2ac, 5, 5, 0, 1 },
138784f12a43SWilliam Wu 			.dcp_det	= { 0xe2ac, 4, 4, 0, 1 },
138884f12a43SWilliam Wu 			.dp_det		= { 0xe2ac, 3, 3, 0, 1 },
138984f12a43SWilliam Wu 			.idm_sink_en	= { 0xe460, 8, 8, 0, 1 },
139084f12a43SWilliam Wu 			.idp_sink_en	= { 0xe460, 7, 7, 0, 1 },
139184f12a43SWilliam Wu 			.idp_src_en	= { 0xe460, 9, 9, 0, 1 },
139284f12a43SWilliam Wu 			.rdm_pdwn_en	= { 0xe460, 10, 10, 0, 1 },
139384f12a43SWilliam Wu 			.vdm_src_en	= { 0xe460, 12, 12, 0, 1 },
139484f12a43SWilliam Wu 			.vdp_src_en	= { 0xe460, 11, 11, 0, 1 },
139584f12a43SWilliam Wu 		},
139684f12a43SWilliam Wu 	},
139784f12a43SWilliam Wu 	{ /* sentinel */ }
139884f12a43SWilliam Wu };
139984f12a43SWilliam Wu 
1400b0ac9faaSWilliam Wu static const struct rockchip_usb2phy_cfg rv1106_phy_cfgs[] = {
1401b0ac9faaSWilliam Wu 	{
1402b0ac9faaSWilliam Wu 		.reg = 0xff3e0000,
1403b0ac9faaSWilliam Wu 		.num_ports	= 1,
140471c0b475SJianwei Zheng 		.phy_tuning	= rv1106_usb2phy_tuning,
1405b0ac9faaSWilliam Wu 		.clkout_ctl	= { 0x0058, 4, 4, 1, 0 },
1406b0ac9faaSWilliam Wu 		.port_cfgs	= {
1407b0ac9faaSWilliam Wu 			[USB2PHY_PORT_OTG] = {
1408b0ac9faaSWilliam Wu 				.phy_sus	= { 0x0050, 8, 0, 0, 0x1d1 },
1409b0ac9faaSWilliam Wu 				.bvalid_det_en	= { 0x0100, 2, 2, 0, 1 },
1410b0ac9faaSWilliam Wu 				.bvalid_det_st	= { 0x0104, 2, 2, 0, 1 },
1411b0ac9faaSWilliam Wu 				.bvalid_det_clr = { 0x0108, 2, 2, 0, 1 },
1412b0ac9faaSWilliam Wu 				.iddig_output	= { 0x0050, 10, 10, 0, 1 },
1413b0ac9faaSWilliam Wu 				.iddig_en	= { 0x0050, 9, 9, 0, 1 },
1414b0ac9faaSWilliam Wu 				.idfall_det_en	= { 0x0100, 5, 5, 0, 1 },
1415b0ac9faaSWilliam Wu 				.idfall_det_st	= { 0x0104, 5, 5, 0, 1 },
1416b0ac9faaSWilliam Wu 				.idfall_det_clr = { 0x0108, 5, 5, 0, 1 },
1417b0ac9faaSWilliam Wu 				.idrise_det_en	= { 0x0100, 4, 4, 0, 1 },
1418b0ac9faaSWilliam Wu 				.idrise_det_st	= { 0x0104, 4, 4, 0, 1 },
1419b0ac9faaSWilliam Wu 				.idrise_det_clr = { 0x0108, 4, 4, 0, 1 },
1420b0ac9faaSWilliam Wu 				.ls_det_en	= { 0x0100, 0, 0, 0, 1 },
1421b0ac9faaSWilliam Wu 				.ls_det_st	= { 0x0104, 0, 0, 0, 1 },
1422b0ac9faaSWilliam Wu 				.ls_det_clr	= { 0x0108, 0, 0, 0, 1 },
1423b0ac9faaSWilliam Wu 				.utmi_avalid	= { 0x0060, 10, 10, 0, 1 },
1424b0ac9faaSWilliam Wu 				.utmi_bvalid	= { 0x0060, 9, 9, 0, 1 },
1425b0ac9faaSWilliam Wu 				.utmi_iddig	= { 0x0060, 6, 6, 0, 1 },
1426b0ac9faaSWilliam Wu 				.utmi_ls	= { 0x0060, 5, 4, 0, 1 },
1427b0ac9faaSWilliam Wu 			},
1428b0ac9faaSWilliam Wu 		},
1429b0ac9faaSWilliam Wu 		.chg_det = {
1430b0ac9faaSWilliam Wu 			.opmode	= { 0x0050, 3, 0, 5, 1 },
1431b0ac9faaSWilliam Wu 			.cp_det		= { 0x0060, 13, 13, 0, 1 },
1432b0ac9faaSWilliam Wu 			.dcp_det	= { 0x0060, 12, 12, 0, 1 },
1433b0ac9faaSWilliam Wu 			.dp_det		= { 0x0060, 14, 14, 0, 1 },
1434b0ac9faaSWilliam Wu 			.idm_sink_en	= { 0x0058, 8, 8, 0, 1 },
1435b0ac9faaSWilliam Wu 			.idp_sink_en	= { 0x0058, 7, 7, 0, 1 },
1436b0ac9faaSWilliam Wu 			.idp_src_en	= { 0x0058, 9, 9, 0, 1 },
1437b0ac9faaSWilliam Wu 			.rdm_pdwn_en	= { 0x0058, 10, 10, 0, 1 },
1438b0ac9faaSWilliam Wu 			.vdm_src_en	= { 0x0058, 12, 12, 0, 1 },
1439b0ac9faaSWilliam Wu 			.vdp_src_en	= { 0x0058, 11, 11, 0, 1 },
1440b0ac9faaSWilliam Wu 		},
1441b0ac9faaSWilliam Wu 	},
1442b0ac9faaSWilliam Wu 	{ /* sentinel */ }
1443b0ac9faaSWilliam Wu };
1444b0ac9faaSWilliam Wu 
1445f0c40dcdSWu Liang feng static const struct rockchip_usb2phy_cfg rv1108_phy_cfgs[] = {
1446f0c40dcdSWu Liang feng 	{
1447f0c40dcdSWu Liang feng 		.reg = 0x100,
1448f0c40dcdSWu Liang feng 		.num_ports	= 2,
1449f0c40dcdSWu Liang feng 		.clkout_ctl	= { 0x108, 4, 4, 1, 0 },
1450f0c40dcdSWu Liang feng 		.port_cfgs	= {
1451f0c40dcdSWu Liang feng 			[USB2PHY_PORT_OTG] = {
14529482282bSMengDongyang 				.phy_sus	= { 0x0ffa0100, 8, 0, 0, 0x1d1 },
1453f0c40dcdSWu Liang feng 				.bvalid_det_en	= { 0x0680, 3, 3, 0, 1 },
1454f0c40dcdSWu Liang feng 				.bvalid_det_st	= { 0x0690, 3, 3, 0, 1 },
1455f0c40dcdSWu Liang feng 				.bvalid_det_clr = { 0x06a0, 3, 3, 0, 1 },
1456f0c40dcdSWu Liang feng 				.ls_det_en	= { 0x0680, 2, 2, 0, 1 },
1457f0c40dcdSWu Liang feng 				.ls_det_st	= { 0x0690, 2, 2, 0, 1 },
1458f0c40dcdSWu Liang feng 				.ls_det_clr	= { 0x06a0, 2, 2, 0, 1 },
1459f0c40dcdSWu Liang feng 				.utmi_bvalid	= { 0x0804, 10, 10, 0, 1 },
1460f0c40dcdSWu Liang feng 				.utmi_ls	= { 0x0804, 13, 12, 0, 1 },
1461f0c40dcdSWu Liang feng 			},
1462f0c40dcdSWu Liang feng 			[USB2PHY_PORT_HOST] = {
14639482282bSMengDongyang 				.phy_sus	= { 0x0ffa0104, 8, 0, 0, 0x1d1 },
1464f0c40dcdSWu Liang feng 				.ls_det_en	= { 0x0680, 4, 4, 0, 1 },
1465f0c40dcdSWu Liang feng 				.ls_det_st	= { 0x0690, 4, 4, 0, 1 },
1466f0c40dcdSWu Liang feng 				.ls_det_clr	= { 0x06a0, 4, 4, 0, 1 },
1467f0c40dcdSWu Liang feng 				.utmi_ls	= { 0x0804, 9, 8, 0, 1 },
1468f0c40dcdSWu Liang feng 				.utmi_hstdet	= { 0x0804, 7, 7, 0, 1 }
1469f0c40dcdSWu Liang feng 			}
1470f0c40dcdSWu Liang feng 		},
1471f0c40dcdSWu Liang feng 		.chg_det = {
14729482282bSMengDongyang 			.opmode		= { 0x0ffa0100, 3, 0, 5, 1 },
1473f0c40dcdSWu Liang feng 			.cp_det		= { 0x0804, 1, 1, 0, 1 },
1474f0c40dcdSWu Liang feng 			.dcp_det	= { 0x0804, 0, 0, 0, 1 },
1475f0c40dcdSWu Liang feng 			.dp_det		= { 0x0804, 2, 2, 0, 1 },
14769482282bSMengDongyang 			.idm_sink_en	= { 0x0ffa0108, 8, 8, 0, 1 },
14779482282bSMengDongyang 			.idp_sink_en	= { 0x0ffa0108, 7, 7, 0, 1 },
14789482282bSMengDongyang 			.idp_src_en	= { 0x0ffa0108, 9, 9, 0, 1 },
14799482282bSMengDongyang 			.rdm_pdwn_en	= { 0x0ffa0108, 10, 10, 0, 1 },
14809482282bSMengDongyang 			.vdm_src_en	= { 0x0ffa0108, 12, 12, 0, 1 },
14819482282bSMengDongyang 			.vdp_src_en	= { 0x0ffa0108, 11, 11, 0, 1 },
1482f0c40dcdSWu Liang feng 		},
1483f0c40dcdSWu Liang feng 	},
1484f0c40dcdSWu Liang feng 	{ /* sentinel */ }
1485f0c40dcdSWu Liang feng };
1486f0c40dcdSWu Liang feng 
148746943c07SJianwei Zheng static const struct rockchip_usb2phy_cfg rk3528_phy_cfgs[] = {
148846943c07SJianwei Zheng 	{
148946943c07SJianwei Zheng 		.reg = 0xffdf0000,
149046943c07SJianwei Zheng 		.num_ports	= 2,
14915c59af98SJianwei Zheng 		.phy_tuning	= rk3528_usb2phy_tuning,
149246943c07SJianwei Zheng 		.port_cfgs	= {
149346943c07SJianwei Zheng 			[USB2PHY_PORT_OTG] = {
149446943c07SJianwei Zheng 				.phy_sus	= { 0x6004c, 8, 0, 0, 0x1d1 },
149546943c07SJianwei Zheng 				.bvalid_det_en	= { 0x60074, 2, 2, 0, 1 },
149646943c07SJianwei Zheng 				.bvalid_det_st	= { 0x60078, 2, 2, 0, 1 },
149746943c07SJianwei Zheng 				.bvalid_det_clr = { 0x6007c, 2, 2, 0, 1 },
149846943c07SJianwei Zheng 				.iddig_output	= { 0x6004c, 10, 10, 0, 1 },
149946943c07SJianwei Zheng 				.iddig_en	= { 0x6004c, 9, 9, 0, 1 },
150046943c07SJianwei Zheng 				.idfall_det_en	= { 0x60074, 5, 5, 0, 1 },
150146943c07SJianwei Zheng 				.idfall_det_st	= { 0x60078, 5, 5, 0, 1 },
150246943c07SJianwei Zheng 				.idfall_det_clr = { 0x6007c, 5, 5, 0, 1 },
150346943c07SJianwei Zheng 				.idrise_det_en	= { 0x60074, 4, 4, 0, 1 },
150446943c07SJianwei Zheng 				.idrise_det_st	= { 0x60078, 4, 4, 0, 1 },
150546943c07SJianwei Zheng 				.idrise_det_clr = { 0x6007c, 4, 4, 0, 1 },
150646943c07SJianwei Zheng 				.ls_det_en	= { 0x60074, 0, 0, 0, 1 },
150746943c07SJianwei Zheng 				.ls_det_st	= { 0x60078, 0, 0, 0, 1 },
150846943c07SJianwei Zheng 				.ls_det_clr	= { 0x6007c, 0, 0, 0, 1 },
150946943c07SJianwei Zheng 				.utmi_avalid	= { 0x6006c, 1, 1, 0, 1 },
151046943c07SJianwei Zheng 				.utmi_bvalid	= { 0x6006c, 0, 0, 0, 1 },
151146943c07SJianwei Zheng 				.utmi_iddig	= { 0x6006c, 6, 6, 0, 1 },
151246943c07SJianwei Zheng 				.utmi_ls	= { 0x6006c, 5, 4, 0, 1 },
151346943c07SJianwei Zheng 			},
151446943c07SJianwei Zheng 			[USB2PHY_PORT_HOST] = {
151546943c07SJianwei Zheng 				.phy_sus	= { 0x6005c, 8, 0, 0x1d2, 0x1d1 },
151646943c07SJianwei Zheng 				.ls_det_en	= { 0x60090, 0, 0, 0, 1 },
151746943c07SJianwei Zheng 				.ls_det_st	= { 0x60094, 0, 0, 0, 1 },
151846943c07SJianwei Zheng 				.ls_det_clr	= { 0x60098, 0, 0, 0, 1 },
151946943c07SJianwei Zheng 				.utmi_ls	= { 0x6006c, 13, 12, 0, 1 },
152046943c07SJianwei Zheng 				.utmi_hstdet	= { 0x6006c, 15, 15, 0, 1 }
152146943c07SJianwei Zheng 			}
152246943c07SJianwei Zheng 		},
152346943c07SJianwei Zheng 		.chg_det = {
152446943c07SJianwei Zheng 			.opmode		= { 0x6004c, 3, 0, 5, 1 },
152546943c07SJianwei Zheng 			.cp_det		= { 0x6006c, 19, 19, 0, 1 },
152646943c07SJianwei Zheng 			.dcp_det	= { 0x6006c, 18, 18, 0, 1 },
152746943c07SJianwei Zheng 			.dp_det		= { 0x6006c, 20, 20, 0, 1 },
152846943c07SJianwei Zheng 			.idm_sink_en	= { 0x60058, 1, 1, 0, 1 },
152946943c07SJianwei Zheng 			.idp_sink_en	= { 0x60058, 0, 0, 0, 1 },
153046943c07SJianwei Zheng 			.idp_src_en	= { 0x60058, 2, 2, 0, 1 },
153146943c07SJianwei Zheng 			.rdm_pdwn_en	= { 0x60058, 3, 3, 0, 1 },
153246943c07SJianwei Zheng 			.vdm_src_en	= { 0x60058, 5, 5, 0, 1 },
153346943c07SJianwei Zheng 			.vdp_src_en	= { 0x60058, 4, 4, 0, 1 },
153446943c07SJianwei Zheng 		},
153546943c07SJianwei Zheng 	}
153646943c07SJianwei Zheng };
153746943c07SJianwei Zheng 
15381a36d2eeSFrank Wang static const struct rockchip_usb2phy_cfg rk3562_phy_cfgs[] = {
15391a36d2eeSFrank Wang 	{
15401a36d2eeSFrank Wang 		.reg = 0xff740000,
15411a36d2eeSFrank Wang 		.num_ports	= 2,
15421a36d2eeSFrank Wang 		.phy_tuning	= rk3562_usb2phy_tuning,
15431a36d2eeSFrank Wang 		.clkout_ctl	= { 0x0108, 4, 4, 1, 0 },
15441a36d2eeSFrank Wang 		.port_cfgs	= {
15451a36d2eeSFrank Wang 			[USB2PHY_PORT_OTG] = {
15461a36d2eeSFrank Wang 				.phy_sus	= { 0x0100, 8, 0, 0, 0x1d1 },
15471a36d2eeSFrank Wang 				.bvalid_det_en	= { 0x0110, 2, 2, 0, 1 },
15481a36d2eeSFrank Wang 				.bvalid_det_st	= { 0x0114, 2, 2, 0, 1 },
15491a36d2eeSFrank Wang 				.bvalid_det_clr = { 0x0118, 2, 2, 0, 1 },
15501a36d2eeSFrank Wang 				.iddig_output	= { 0x0100, 10, 10, 0, 1 },
15511a36d2eeSFrank Wang 				.iddig_en	= { 0x0100, 9, 9, 0, 1 },
15521a36d2eeSFrank Wang 				.idfall_det_en	= { 0x0110, 5, 5, 0, 1 },
15531a36d2eeSFrank Wang 				.idfall_det_st	= { 0x0114, 5, 5, 0, 1 },
15541a36d2eeSFrank Wang 				.idfall_det_clr = { 0x0118, 5, 5, 0, 1 },
15551a36d2eeSFrank Wang 				.idrise_det_en	= { 0x0110, 4, 4, 0, 1 },
15561a36d2eeSFrank Wang 				.idrise_det_st	= { 0x0114, 4, 4, 0, 1 },
15571a36d2eeSFrank Wang 				.idrise_det_clr = { 0x0118, 4, 4, 0, 1 },
15581a36d2eeSFrank Wang 				.ls_det_en	= { 0x0110, 0, 0, 0, 1 },
15591a36d2eeSFrank Wang 				.ls_det_st	= { 0x0114, 0, 0, 0, 1 },
15601a36d2eeSFrank Wang 				.ls_det_clr	= { 0x0118, 0, 0, 0, 1 },
15611a36d2eeSFrank Wang 				.utmi_avalid	= { 0x0120, 10, 10, 0, 1 },
15621a36d2eeSFrank Wang 				.utmi_bvalid	= { 0x0120, 9, 9, 0, 1 },
15631a36d2eeSFrank Wang 				.utmi_iddig	= { 0x0120, 6, 6, 0, 1 },
15641a36d2eeSFrank Wang 				.utmi_ls	= { 0x0120, 5, 4, 0, 1 },
15651a36d2eeSFrank Wang 			},
15661a36d2eeSFrank Wang 			[USB2PHY_PORT_HOST] = {
15671a36d2eeSFrank Wang 				.phy_sus	= { 0x0104, 8, 0, 0x1d2, 0x1d1 },
15681a36d2eeSFrank Wang 				.ls_det_en	= { 0x0110, 1, 1, 0, 1 },
15691a36d2eeSFrank Wang 				.ls_det_st	= { 0x0114, 1, 1, 0, 1 },
15701a36d2eeSFrank Wang 				.ls_det_clr	= { 0x0118, 1, 1, 0, 1 },
15711a36d2eeSFrank Wang 				.utmi_ls	= { 0x0120, 17, 16, 0, 1 },
15721a36d2eeSFrank Wang 				.utmi_hstdet	= { 0x0120, 19, 19, 0, 1 }
15731a36d2eeSFrank Wang 			}
15741a36d2eeSFrank Wang 		},
15751a36d2eeSFrank Wang 		.chg_det = {
15761a36d2eeSFrank Wang 			.opmode		= { 0x0100, 3, 0, 5, 1 },
15771a36d2eeSFrank Wang 			.cp_det		= { 0x0120, 24, 24, 0, 1 },
15781a36d2eeSFrank Wang 			.dcp_det	= { 0x0120, 23, 23, 0, 1 },
15791a36d2eeSFrank Wang 			.dp_det		= { 0x0120, 25, 25, 0, 1 },
15801a36d2eeSFrank Wang 			.idm_sink_en	= { 0x0108, 8, 8, 0, 1 },
15811a36d2eeSFrank Wang 			.idp_sink_en	= { 0x0108, 7, 7, 0, 1 },
15821a36d2eeSFrank Wang 			.idp_src_en	= { 0x0108, 9, 9, 0, 1 },
15831a36d2eeSFrank Wang 			.rdm_pdwn_en	= { 0x0108, 10, 10, 0, 1 },
15841a36d2eeSFrank Wang 			.vdm_src_en	= { 0x0108, 12, 12, 0, 1 },
15851a36d2eeSFrank Wang 			.vdp_src_en	= { 0x0108, 11, 11, 0, 1 },
15861a36d2eeSFrank Wang 		},
15871a36d2eeSFrank Wang 	},
15881a36d2eeSFrank Wang 	{ /* sentinel */ }
15891a36d2eeSFrank Wang };
15901a36d2eeSFrank Wang 
1591e475bd5dSRen Jianing static const struct rockchip_usb2phy_cfg rk3568_phy_cfgs[] = {
1592e475bd5dSRen Jianing 	{
1593e475bd5dSRen Jianing 		.reg = 0xfe8a0000,
1594e475bd5dSRen Jianing 		.num_ports	= 2,
1595e475bd5dSRen Jianing 		.clkout_ctl	= { 0x0008, 4, 4, 1, 0 },
1596e475bd5dSRen Jianing 		.port_cfgs	= {
1597e475bd5dSRen Jianing 			[USB2PHY_PORT_OTG] = {
15987329ce57SRen Jianing 				.phy_sus	= { 0x0000, 8, 0, 0x052, 0x1d1 },
1599e475bd5dSRen Jianing 				.bvalid_det_en	= { 0x0080, 2, 2, 0, 1 },
1600e475bd5dSRen Jianing 				.bvalid_det_st	= { 0x0084, 2, 2, 0, 1 },
1601e475bd5dSRen Jianing 				.bvalid_det_clr = { 0x0088, 2, 2, 0, 1 },
1602e475bd5dSRen Jianing 				.iddig_output	= { 0x0000, 10, 10, 0, 1 },
1603e475bd5dSRen Jianing 				.iddig_en	= { 0x0000, 9, 9, 0, 1 },
1604e475bd5dSRen Jianing 				.idfall_det_en	= { 0x0080, 5, 5, 0, 1 },
1605e475bd5dSRen Jianing 				.idfall_det_st	= { 0x0084, 5, 5, 0, 1 },
16067329ce57SRen Jianing 				.idfall_det_clr = { 0x0088, 5, 5, 0, 1 },
1607e475bd5dSRen Jianing 				.idrise_det_en	= { 0x0080, 4, 4, 0, 1 },
1608e475bd5dSRen Jianing 				.idrise_det_st	= { 0x0084, 4, 4, 0, 1 },
16097329ce57SRen Jianing 				.idrise_det_clr = { 0x0088, 4, 4, 0, 1 },
1610e475bd5dSRen Jianing 				.ls_det_en	= { 0x0080, 0, 0, 0, 1 },
1611e475bd5dSRen Jianing 				.ls_det_st	= { 0x0084, 0, 0, 0, 1 },
16127329ce57SRen Jianing 				.ls_det_clr	= { 0x0088, 0, 0, 0, 1 },
1613e475bd5dSRen Jianing 				.utmi_avalid	= { 0x00c0, 10, 10, 0, 1 },
1614e475bd5dSRen Jianing 				.utmi_bvalid	= { 0x00c0, 9, 9, 0, 1 },
1615e475bd5dSRen Jianing 				.utmi_iddig	= { 0x00c0, 6, 6, 0, 1 },
1616e475bd5dSRen Jianing 				.utmi_ls	= { 0x00c0, 5, 4, 0, 1 },
1617e475bd5dSRen Jianing 			},
1618e475bd5dSRen Jianing 			[USB2PHY_PORT_HOST] = {
16197329ce57SRen Jianing 				.phy_sus	= { 0x0004, 8, 0, 0x1d2, 0x1d1 },
1620e475bd5dSRen Jianing 				.ls_det_en	= { 0x0080, 1, 1, 0, 1 },
1621e475bd5dSRen Jianing 				.ls_det_st	= { 0x0084, 1, 1, 0, 1 },
16227329ce57SRen Jianing 				.ls_det_clr	= { 0x0088, 1, 1, 0, 1 },
1623e475bd5dSRen Jianing 				.utmi_ls	= { 0x00c0, 17, 16, 0, 1 },
1624e475bd5dSRen Jianing 				.utmi_hstdet	= { 0x00c0, 19, 19, 0, 1 }
1625e475bd5dSRen Jianing 			}
1626e475bd5dSRen Jianing 		},
1627e475bd5dSRen Jianing 		.chg_det = {
1628e475bd5dSRen Jianing 			.opmode		= { 0x0000, 3, 0, 5, 1 },
1629e475bd5dSRen Jianing 			.cp_det		= { 0x00c0, 24, 24, 0, 1 },
1630e475bd5dSRen Jianing 			.dcp_det	= { 0x00c0, 23, 23, 0, 1 },
1631e475bd5dSRen Jianing 			.dp_det		= { 0x00c0, 25, 25, 0, 1 },
1632e475bd5dSRen Jianing 			.idm_sink_en	= { 0x0008, 8, 8, 0, 1 },
1633e475bd5dSRen Jianing 			.idp_sink_en	= { 0x0008, 7, 7, 0, 1 },
1634e475bd5dSRen Jianing 			.idp_src_en	= { 0x0008, 9, 9, 0, 1 },
1635e475bd5dSRen Jianing 			.rdm_pdwn_en	= { 0x0008, 10, 10, 0, 1 },
1636e475bd5dSRen Jianing 			.vdm_src_en	= { 0x0008, 12, 12, 0, 1 },
1637e475bd5dSRen Jianing 			.vdp_src_en	= { 0x0008, 11, 11, 0, 1 },
1638e475bd5dSRen Jianing 		},
1639e475bd5dSRen Jianing 	},
1640e475bd5dSRen Jianing 	{
1641e475bd5dSRen Jianing 		.reg = 0xfe8b0000,
1642e475bd5dSRen Jianing 		.num_ports	= 2,
1643e475bd5dSRen Jianing 		.clkout_ctl	= { 0x0008, 4, 4, 1, 0 },
1644e475bd5dSRen Jianing 		.port_cfgs	= {
1645e475bd5dSRen Jianing 			[USB2PHY_PORT_OTG] = {
16467329ce57SRen Jianing 				.phy_sus	= { 0x0000, 8, 0, 0x1d2, 0x1d1 },
1647e475bd5dSRen Jianing 				.ls_det_en	= { 0x0080, 0, 0, 0, 1 },
1648e475bd5dSRen Jianing 				.ls_det_st	= { 0x0084, 0, 0, 0, 1 },
16497329ce57SRen Jianing 				.ls_det_clr	= { 0x0088, 0, 0, 0, 1 },
1650e475bd5dSRen Jianing 				.utmi_ls	= { 0x00c0, 5, 4, 0, 1 },
1651e475bd5dSRen Jianing 				.utmi_hstdet	= { 0x00c0, 7, 7, 0, 1 }
1652e475bd5dSRen Jianing 			},
1653e475bd5dSRen Jianing 			[USB2PHY_PORT_HOST] = {
16547329ce57SRen Jianing 				.phy_sus	= { 0x0004, 8, 0, 0x1d2, 0x1d1 },
1655e475bd5dSRen Jianing 				.ls_det_en	= { 0x0080, 1, 1, 0, 1 },
1656e475bd5dSRen Jianing 				.ls_det_st	= { 0x0084, 1, 1, 0, 1 },
16577329ce57SRen Jianing 				.ls_det_clr	= { 0x0088, 1, 1, 0, 1 },
1658e475bd5dSRen Jianing 				.utmi_ls	= { 0x00c0, 17, 16, 0, 1 },
1659e475bd5dSRen Jianing 				.utmi_hstdet	= { 0x00c0, 19, 19, 0, 1 }
1660e475bd5dSRen Jianing 			}
1661e475bd5dSRen Jianing 		},
1662e475bd5dSRen Jianing 	},
1663e475bd5dSRen Jianing 	{ /* sentinel */ }
1664e475bd5dSRen Jianing };
1665b30b0946SFrank Wang 
1666b30b0946SFrank Wang static const struct rockchip_usb2phy_cfg rk3588_phy_cfgs[] = {
1667b30b0946SFrank Wang 	{
1668b30b0946SFrank Wang 		.reg = 0x0000,
1669b30b0946SFrank Wang 		.num_ports	= 1,
16704367cef2SWilliam Wu 		.phy_tuning	= rk3588_usb2phy_tuning,
1671b30b0946SFrank Wang 		.clkout_ctl	= { 0x0000, 0, 0, 1, 0 },
1672b30b0946SFrank Wang 		.port_cfgs	= {
1673b30b0946SFrank Wang 			[USB2PHY_PORT_OTG] = {
16742322cbe1SFrank Wang 				.phy_sus	= { 0x000c, 11, 11, 0, 1 },
1675b30b0946SFrank Wang 				.ls_det_en	= { 0x0080, 0, 0, 0, 1 },
1676b30b0946SFrank Wang 				.ls_det_st	= { 0x0084, 0, 0, 0, 1 },
1677b30b0946SFrank Wang 				.ls_det_clr	= { 0x0088, 0, 0, 0, 1 },
16784b06b44bSFrank Wang 				.utmi_iddig	= { 0x00c0, 5, 5, 0, 1 },
1679b30b0946SFrank Wang 				.utmi_ls	= { 0x00c0, 10, 9, 0, 1 },
1680b30b0946SFrank Wang 			}
1681b30b0946SFrank Wang 		},
1682b30b0946SFrank Wang 		.chg_det = {
16832322cbe1SFrank Wang 			.opmode		= { 0x0008, 2, 2, 1, 0 },
1684b30b0946SFrank Wang 			.cp_det		= { 0x00c0, 0, 0, 0, 1 },
1685b30b0946SFrank Wang 			.dcp_det	= { 0x00c0, 0, 0, 0, 1 },
16862322cbe1SFrank Wang 			.dp_det		= { 0x00c0, 1, 1, 1, 0 },
1687b30b0946SFrank Wang 			.idm_sink_en	= { 0x0008, 5, 5, 1, 0 },
1688b30b0946SFrank Wang 			.idp_sink_en	= { 0x0008, 5, 5, 0, 1 },
1689b30b0946SFrank Wang 			.idp_src_en	= { 0x0008, 14, 14, 0, 1 },
1690b30b0946SFrank Wang 			.rdm_pdwn_en	= { 0x0008, 14, 14, 0, 1 },
1691b30b0946SFrank Wang 			.vdm_src_en	= { 0x0008, 7, 6, 0, 3 },
1692b30b0946SFrank Wang 			.vdp_src_en	= { 0x0008, 7, 6, 0, 3 },
1693b30b0946SFrank Wang 		},
1694b30b0946SFrank Wang 	},
1695b30b0946SFrank Wang 	{
1696b30b0946SFrank Wang 		.reg = 0x4000,
1697b30b0946SFrank Wang 		.num_ports	= 1,
16984367cef2SWilliam Wu 		.phy_tuning	= rk3588_usb2phy_tuning,
1699b30b0946SFrank Wang 		.clkout_ctl	= { 0x0000, 0, 0, 1, 0 },
1700b30b0946SFrank Wang 		.port_cfgs	= {
1701b30b0946SFrank Wang 			/* Select suspend control from controller */
1702b30b0946SFrank Wang 			[USB2PHY_PORT_OTG] = {
1703b30b0946SFrank Wang 				.phy_sus	= { 0x000c, 11, 11, 0, 0 },
1704b30b0946SFrank Wang 				.ls_det_en	= { 0x0080, 0, 0, 0, 1 },
1705b30b0946SFrank Wang 				.ls_det_st	= { 0x0084, 0, 0, 0, 1 },
1706b30b0946SFrank Wang 				.ls_det_clr	= { 0x0088, 0, 0, 0, 1 },
1707b30b0946SFrank Wang 				.utmi_ls	= { 0x00c0, 10, 9, 0, 1 },
1708b30b0946SFrank Wang 			}
1709b30b0946SFrank Wang 		},
1710b30b0946SFrank Wang 	},
1711b30b0946SFrank Wang 	{
1712b30b0946SFrank Wang 		.reg = 0x8000,
1713b30b0946SFrank Wang 		.num_ports	= 1,
17144367cef2SWilliam Wu 		.phy_tuning	= rk3588_usb2phy_tuning,
1715b30b0946SFrank Wang 		.clkout_ctl	= { 0x0000, 0, 0, 1, 0 },
1716b30b0946SFrank Wang 		.port_cfgs	= {
1717b30b0946SFrank Wang 			[USB2PHY_PORT_HOST] = {
1718b30b0946SFrank Wang 				.phy_sus	= { 0x0008, 2, 2, 0, 1 },
1719b30b0946SFrank Wang 				.ls_det_en	= { 0x0080, 0, 0, 0, 1 },
1720b30b0946SFrank Wang 				.ls_det_st	= { 0x0084, 0, 0, 0, 1 },
1721b30b0946SFrank Wang 				.ls_det_clr	= { 0x0088, 0, 0, 0, 1 },
1722b30b0946SFrank Wang 				.utmi_ls	= { 0x00c0, 10, 9, 0, 1 },
1723b30b0946SFrank Wang 			}
1724b30b0946SFrank Wang 		},
1725b30b0946SFrank Wang 	},
1726b30b0946SFrank Wang 	{
1727b30b0946SFrank Wang 		.reg = 0xc000,
1728b30b0946SFrank Wang 		.num_ports	= 1,
17294367cef2SWilliam Wu 		.phy_tuning	= rk3588_usb2phy_tuning,
1730b30b0946SFrank Wang 		.clkout_ctl	= { 0x0000, 0, 0, 1, 0 },
1731b30b0946SFrank Wang 		.port_cfgs	= {
1732b30b0946SFrank Wang 			[USB2PHY_PORT_HOST] = {
1733b30b0946SFrank Wang 				.phy_sus	= { 0x0008, 2, 2, 0, 1 },
1734b30b0946SFrank Wang 				.ls_det_en	= { 0x0080, 0, 0, 0, 1 },
1735b30b0946SFrank Wang 				.ls_det_st	= { 0x0084, 0, 0, 0, 1 },
1736b30b0946SFrank Wang 				.ls_det_clr	= { 0x0088, 0, 0, 0, 1 },
1737b30b0946SFrank Wang 				.utmi_ls	= { 0x00c0, 10, 9, 0, 1 },
1738b30b0946SFrank Wang 			}
1739b30b0946SFrank Wang 		},
1740b30b0946SFrank Wang 	},
1741b30b0946SFrank Wang 	{ /* sentinel */ }
1742b30b0946SFrank Wang };
1743b30b0946SFrank Wang 
1744f0c40dcdSWu Liang feng static const struct udevice_id rockchip_usb2phy_ids[] = {
1745*8abfec86SJianwei Zheng #ifdef CONFIG_ROCKCHIP_RK1808
1746b31aa7beSWilliam Wu 	{ .compatible = "rockchip,rk1808-usb2phy", .data = (ulong)&rk1808_phy_cfgs },
1747*8abfec86SJianwei Zheng #endif
1748*8abfec86SJianwei Zheng #ifdef CONFIG_ROCKCHIP_RK3036
1749baa12648SJianwei Zheng 	{ .compatible = "rockchip,rk3036-usb2phy", .data = (ulong)&rk3036_phy_cfgs },
1750*8abfec86SJianwei Zheng #endif
1751*8abfec86SJianwei Zheng #if defined CONFIG_ROCKCHIP_RK3128 || defined CONFIG_ROCKCHIP_RK3126
1752f0c40dcdSWu Liang feng 	{ .compatible = "rockchip,rk3128-usb2phy", .data = (ulong)&rk312x_phy_cfgs },
1753*8abfec86SJianwei Zheng #endif
1754*8abfec86SJianwei Zheng #ifdef CONFIG_ROCKCHIP_RK322X
1755a636a6d7SWilliam Wu 	{ .compatible = "rockchip,rk322x-usb2phy", .data = (ulong)&rk322x_phy_cfgs },
1756*8abfec86SJianwei Zheng #endif
1757*8abfec86SJianwei Zheng #ifdef CONFIG_ROCKCHIP_RK3308
1758675552f7SFrank Wang 	{ .compatible = "rockchip,rk3308-usb2phy", .data = (ulong)&rk3308_phy_cfgs },
1759*8abfec86SJianwei Zheng #endif
1760*8abfec86SJianwei Zheng #ifdef CONFIG_ROCKCHIP_RK3328
1761f0c40dcdSWu Liang feng 	{ .compatible = "rockchip,rk3328-usb2phy", .data = (ulong)&rk3328_phy_cfgs },
1762*8abfec86SJianwei Zheng #endif
1763*8abfec86SJianwei Zheng #ifdef CONFIG_ROCKCHIP_RK3368
17642d39b251SWilliam Wu 	{ .compatible = "rockchip,rk3368-usb2phy", .data = (ulong)&rk3368_phy_cfgs },
1765*8abfec86SJianwei Zheng #endif
1766*8abfec86SJianwei Zheng #ifdef CONFIG_ROCKCHIP_RK3399
176784f12a43SWilliam Wu 	{ .compatible = "rockchip,rk3399-usb2phy", .data = (ulong)&rk3399_phy_cfgs },
1768*8abfec86SJianwei Zheng #endif
1769*8abfec86SJianwei Zheng #ifdef CONFIG_ROCKCHIP_RK3528
177046943c07SJianwei Zheng 	{ .compatible = "rockchip,rk3528-usb2phy", .data = (ulong)&rk3528_phy_cfgs },
1771*8abfec86SJianwei Zheng #endif
1772*8abfec86SJianwei Zheng #ifdef CONFIG_ROCKCHIP_RK3562
17731a36d2eeSFrank Wang 	{ .compatible = "rockchip,rk3562-usb2phy", .data = (ulong)&rk3562_phy_cfgs },
1774*8abfec86SJianwei Zheng #endif
1775*8abfec86SJianwei Zheng #ifdef CONFIG_ROCKCHIP_RK3568
1776e475bd5dSRen Jianing 	{ .compatible = "rockchip,rk3568-usb2phy", .data = (ulong)&rk3568_phy_cfgs },
1777*8abfec86SJianwei Zheng #endif
1778*8abfec86SJianwei Zheng #ifdef CONFIG_ROCKCHIP_RK3588
1779b30b0946SFrank Wang 	{ .compatible = "rockchip,rk3588-usb2phy", .data = (ulong)&rk3588_phy_cfgs },
1780*8abfec86SJianwei Zheng #endif
1781*8abfec86SJianwei Zheng #ifdef CONFIG_ROCKCHIP_RV1106
1782b0ac9faaSWilliam Wu 	{ .compatible = "rockchip,rv1106-usb2phy", .data = (ulong)&rv1106_phy_cfgs },
1783*8abfec86SJianwei Zheng #endif
1784*8abfec86SJianwei Zheng #ifdef CONFIG_ROCKCHIP_RV1108
1785f0c40dcdSWu Liang feng 	{ .compatible = "rockchip,rv1108-usb2phy", .data = (ulong)&rv1108_phy_cfgs },
1786*8abfec86SJianwei Zheng #endif
1787f0c40dcdSWu Liang feng 	{ }
1788f0c40dcdSWu Liang feng };
1789f0c40dcdSWu Liang feng 
17909b3cc842SFrank Wang U_BOOT_DRIVER(rockchip_usb2phy_port) = {
17919b3cc842SFrank Wang 	.name		= "rockchip_usb2phy_port",
17929b3cc842SFrank Wang 	.id		= UCLASS_PHY,
17939b3cc842SFrank Wang 	.ops		= &rockchip_usb2phy_ops,
17949b3cc842SFrank Wang };
17959b3cc842SFrank Wang 
1796f0c40dcdSWu Liang feng U_BOOT_DRIVER(rockchip_usb2phy) = {
1797f0c40dcdSWu Liang feng 	.name		= "rockchip_usb2phy",
1798f0c40dcdSWu Liang feng 	.id		= UCLASS_PHY,
1799f0c40dcdSWu Liang feng 	.of_match	= rockchip_usb2phy_ids,
1800f0c40dcdSWu Liang feng 	.probe		= rockchip_usb2phy_probe,
18019b3cc842SFrank Wang 	.bind		= rockchip_usb2phy_bind,
1802f0c40dcdSWu Liang feng 	.priv_auto_alloc_size = sizeof(struct rockchip_usb2phy),
1803f0c40dcdSWu Liang feng };
1804