Linux Audio

Check our new training course

Loading...
Note: File does not exist in v4.6.
  1// SPDX-License-Identifier: GPL-2.0
  2/*
  3 * USB Glue for Amlogic G12A SoCs
  4 *
  5 * Copyright (c) 2019 BayLibre, SAS
  6 * Author: Neil Armstrong <narmstrong@baylibre.com>
  7 */
  8
  9/*
 10 * The USB is organized with a glue around the DWC3 Controller IP as :
 11 * - Control registers for each USB2 Ports
 12 * - Control registers for the USB PHY layer
 13 * - SuperSpeed PHY can be enabled only if port is used
 14 * - Dynamic OTG switching with ID change interrupt
 15 */
 16
 17#include <linux/module.h>
 18#include <linux/kernel.h>
 19#include <linux/platform_device.h>
 20#include <linux/clk.h>
 21#include <linux/of.h>
 22#include <linux/of_platform.h>
 23#include <linux/pm_runtime.h>
 24#include <linux/regmap.h>
 25#include <linux/bitfield.h>
 26#include <linux/bitops.h>
 27#include <linux/reset.h>
 28#include <linux/phy/phy.h>
 29#include <linux/usb/otg.h>
 30#include <linux/usb/role.h>
 31#include <linux/regulator/consumer.h>
 32
 33/* USB2 Ports Control Registers, offsets are per-port */
 34
 35#define U2P_REG_SIZE						0x20
 36
 37#define U2P_R0							0x0
 38	#define U2P_R0_HOST_DEVICE				BIT(0)
 39	#define U2P_R0_POWER_OK					BIT(1)
 40	#define U2P_R0_HAST_MODE				BIT(2)
 41	#define U2P_R0_POWER_ON_RESET				BIT(3)
 42	#define U2P_R0_ID_PULLUP				BIT(4)
 43	#define U2P_R0_DRV_VBUS					BIT(5)
 44
 45#define U2P_R1							0x4
 46	#define U2P_R1_PHY_READY				BIT(0)
 47	#define U2P_R1_ID_DIG					BIT(1)
 48	#define U2P_R1_OTG_SESSION_VALID			BIT(2)
 49	#define U2P_R1_VBUS_VALID				BIT(3)
 50
 51/* USB Glue Control Registers */
 52
 53#define G12A_GLUE_OFFSET					0x80
 54
 55#define USB_R0							0x00
 56	#define USB_R0_P30_LANE0_TX2RX_LOOPBACK			BIT(17)
 57	#define USB_R0_P30_LANE0_EXT_PCLK_REQ			BIT(18)
 58	#define USB_R0_P30_PCS_RX_LOS_MASK_VAL_MASK		GENMASK(28, 19)
 59	#define USB_R0_U2D_SS_SCALEDOWN_MODE_MASK		GENMASK(30, 29)
 60	#define USB_R0_U2D_ACT					BIT(31)
 61
 62#define USB_R1							0x04
 63	#define USB_R1_U3H_BIGENDIAN_GS				BIT(0)
 64	#define USB_R1_U3H_PME_ENABLE				BIT(1)
 65	#define USB_R1_U3H_HUB_PORT_OVERCURRENT_MASK		GENMASK(4, 2)
 66	#define USB_R1_U3H_HUB_PORT_PERM_ATTACH_MASK		GENMASK(9, 7)
 67	#define USB_R1_U3H_HOST_U2_PORT_DISABLE_MASK		GENMASK(13, 12)
 68	#define USB_R1_U3H_HOST_U3_PORT_DISABLE			BIT(16)
 69	#define USB_R1_U3H_HOST_PORT_POWER_CONTROL_PRESENT	BIT(17)
 70	#define USB_R1_U3H_HOST_MSI_ENABLE			BIT(18)
 71	#define USB_R1_U3H_FLADJ_30MHZ_REG_MASK			GENMASK(24, 19)
 72	#define USB_R1_P30_PCS_TX_SWING_FULL_MASK		GENMASK(31, 25)
 73
 74#define USB_R2							0x08
 75	#define USB_R2_P30_PCS_TX_DEEMPH_3P5DB_MASK		GENMASK(25, 20)
 76	#define USB_R2_P30_PCS_TX_DEEMPH_6DB_MASK		GENMASK(31, 26)
 77
 78#define USB_R3							0x0c
 79	#define USB_R3_P30_SSC_ENABLE				BIT(0)
 80	#define USB_R3_P30_SSC_RANGE_MASK			GENMASK(3, 1)
 81	#define USB_R3_P30_SSC_REF_CLK_SEL_MASK			GENMASK(12, 4)
 82	#define USB_R3_P30_REF_SSP_EN				BIT(13)
 83
 84#define USB_R4							0x10
 85	#define USB_R4_P21_PORT_RESET_0				BIT(0)
 86	#define USB_R4_P21_SLEEP_M0				BIT(1)
 87	#define USB_R4_MEM_PD_MASK				GENMASK(3, 2)
 88	#define USB_R4_P21_ONLY					BIT(4)
 89
 90#define USB_R5							0x14
 91	#define USB_R5_ID_DIG_SYNC				BIT(0)
 92	#define USB_R5_ID_DIG_REG				BIT(1)
 93	#define USB_R5_ID_DIG_CFG_MASK				GENMASK(3, 2)
 94	#define USB_R5_ID_DIG_EN_0				BIT(4)
 95	#define USB_R5_ID_DIG_EN_1				BIT(5)
 96	#define USB_R5_ID_DIG_CURR				BIT(6)
 97	#define USB_R5_ID_DIG_IRQ				BIT(7)
 98	#define USB_R5_ID_DIG_TH_MASK				GENMASK(15, 8)
 99	#define USB_R5_ID_DIG_CNT_MASK				GENMASK(23, 16)
100
101#define PHY_COUNT						3
102#define USB2_OTG_PHY						1
103
104static struct clk_bulk_data meson_gxl_clocks[] = {
105	{ .id = "usb_ctrl" },
106	{ .id = "ddr" },
107};
108
109static struct clk_bulk_data meson_g12a_clocks[] = {
110	{ .id = NULL },
111};
112
113static struct clk_bulk_data meson_a1_clocks[] = {
114	{ .id = "usb_ctrl" },
115	{ .id = "usb_bus" },
116	{ .id = "xtal_usb_ctrl" },
117};
118
119static const char *meson_gxm_phy_names[] = {
120	"usb2-phy0", "usb2-phy1", "usb2-phy2",
121};
122
123static const char *meson_g12a_phy_names[] = {
124	"usb2-phy0", "usb2-phy1", "usb3-phy0",
125};
126
127/*
128 * Amlogic A1 has a single physical PHY, in slot 1, but still has the
129 * two U2 PHY controls register blocks like G12A.
130 * Handling the first PHY on slot 1 would need a large amount of code
131 * changes, and the current management is generic enough to handle it
132 * correctly when only the "usb2-phy1" phy is specified on-par with the
133 * DT bindings.
134 */
135static const char *meson_a1_phy_names[] = {
136	"usb2-phy0", "usb2-phy1"
137};
138
139struct dwc3_meson_g12a;
140
141struct dwc3_meson_g12a_drvdata {
142	bool otg_switch_supported;
143	bool otg_phy_host_port_disable;
144	struct clk_bulk_data *clks;
145	int num_clks;
146	const char **phy_names;
147	int num_phys;
148	int (*setup_regmaps)(struct dwc3_meson_g12a *priv, void __iomem *base);
149	int (*usb2_init_phy)(struct dwc3_meson_g12a *priv, int i,
150			     enum phy_mode mode);
151	int (*set_phy_mode)(struct dwc3_meson_g12a *priv, int i,
152			    enum phy_mode mode);
153	int (*usb_init)(struct dwc3_meson_g12a *priv);
154	int (*usb_post_init)(struct dwc3_meson_g12a *priv);
155};
156
157static int dwc3_meson_gxl_setup_regmaps(struct dwc3_meson_g12a *priv,
158					void __iomem *base);
159static int dwc3_meson_g12a_setup_regmaps(struct dwc3_meson_g12a *priv,
160					 void __iomem *base);
161
162static int dwc3_meson_g12a_usb2_init_phy(struct dwc3_meson_g12a *priv, int i,
163					 enum phy_mode mode);
164static int dwc3_meson_gxl_usb2_init_phy(struct dwc3_meson_g12a *priv, int i,
165					enum phy_mode mode);
166
167static int dwc3_meson_g12a_set_phy_mode(struct dwc3_meson_g12a *priv,
168					int i, enum phy_mode mode);
169static int dwc3_meson_gxl_set_phy_mode(struct dwc3_meson_g12a *priv,
170				       int i, enum phy_mode mode);
171
172static int dwc3_meson_g12a_usb_init(struct dwc3_meson_g12a *priv);
173static int dwc3_meson_gxl_usb_init(struct dwc3_meson_g12a *priv);
174
175static int dwc3_meson_gxl_usb_post_init(struct dwc3_meson_g12a *priv);
176
177/*
178 * For GXL and GXM SoCs:
179 * USB Phy muxing between the DWC2 Device controller and the DWC3 Host
180 * controller is buggy when switching from Device to Host when USB port
181 * is unpopulated, it causes the DWC3 to hard crash.
182 * When populated (including OTG switching with ID pin), the switch works
183 * like a charm like on the G12A platforms.
184 * In order to still switch from Host to Device on an USB Type-A port,
185 * an U2_PORT_DISABLE bit has been added to disconnect the DWC3 Host
186 * controller from the port, but when used the DWC3 controller must be
187 * reset to recover usage of the port.
188 */
189
190static struct dwc3_meson_g12a_drvdata gxl_drvdata = {
191	.otg_switch_supported = true,
192	.otg_phy_host_port_disable = true,
193	.clks = meson_gxl_clocks,
194	.num_clks = ARRAY_SIZE(meson_g12a_clocks),
195	.phy_names = meson_a1_phy_names,
196	.num_phys = ARRAY_SIZE(meson_a1_phy_names),
197	.setup_regmaps = dwc3_meson_gxl_setup_regmaps,
198	.usb2_init_phy = dwc3_meson_gxl_usb2_init_phy,
199	.set_phy_mode = dwc3_meson_gxl_set_phy_mode,
200	.usb_init = dwc3_meson_gxl_usb_init,
201	.usb_post_init = dwc3_meson_gxl_usb_post_init,
202};
203
204static struct dwc3_meson_g12a_drvdata gxm_drvdata = {
205	.otg_switch_supported = true,
206	.otg_phy_host_port_disable = true,
207	.clks = meson_gxl_clocks,
208	.num_clks = ARRAY_SIZE(meson_g12a_clocks),
209	.phy_names = meson_gxm_phy_names,
210	.num_phys = ARRAY_SIZE(meson_gxm_phy_names),
211	.setup_regmaps = dwc3_meson_gxl_setup_regmaps,
212	.usb2_init_phy = dwc3_meson_gxl_usb2_init_phy,
213	.set_phy_mode = dwc3_meson_gxl_set_phy_mode,
214	.usb_init = dwc3_meson_gxl_usb_init,
215	.usb_post_init = dwc3_meson_gxl_usb_post_init,
216};
217
218static struct dwc3_meson_g12a_drvdata g12a_drvdata = {
219	.otg_switch_supported = true,
220	.clks = meson_g12a_clocks,
221	.num_clks = ARRAY_SIZE(meson_g12a_clocks),
222	.phy_names = meson_g12a_phy_names,
223	.num_phys = ARRAY_SIZE(meson_g12a_phy_names),
224	.setup_regmaps = dwc3_meson_g12a_setup_regmaps,
225	.usb2_init_phy = dwc3_meson_g12a_usb2_init_phy,
226	.set_phy_mode = dwc3_meson_g12a_set_phy_mode,
227	.usb_init = dwc3_meson_g12a_usb_init,
228};
229
230static struct dwc3_meson_g12a_drvdata a1_drvdata = {
231	.otg_switch_supported = false,
232	.clks = meson_a1_clocks,
233	.num_clks = ARRAY_SIZE(meson_a1_clocks),
234	.phy_names = meson_a1_phy_names,
235	.num_phys = ARRAY_SIZE(meson_a1_phy_names),
236	.setup_regmaps = dwc3_meson_g12a_setup_regmaps,
237	.usb2_init_phy = dwc3_meson_g12a_usb2_init_phy,
238	.set_phy_mode = dwc3_meson_g12a_set_phy_mode,
239	.usb_init = dwc3_meson_g12a_usb_init,
240};
241
242struct dwc3_meson_g12a {
243	struct device		*dev;
244	struct regmap		*u2p_regmap[PHY_COUNT];
245	struct regmap		*usb_glue_regmap;
246	struct reset_control	*reset;
247	struct phy		*phys[PHY_COUNT];
248	enum usb_dr_mode	otg_mode;
249	enum phy_mode		otg_phy_mode;
250	unsigned int		usb2_ports;
251	unsigned int		usb3_ports;
252	struct regulator	*vbus;
253	struct usb_role_switch_desc switch_desc;
254	struct usb_role_switch	*role_switch;
255	const struct dwc3_meson_g12a_drvdata *drvdata;
256};
257
258static int dwc3_meson_gxl_set_phy_mode(struct dwc3_meson_g12a *priv,
259					 int i, enum phy_mode mode)
260{
261	return phy_set_mode(priv->phys[i], mode);
262}
263
264static int dwc3_meson_gxl_usb2_init_phy(struct dwc3_meson_g12a *priv, int i,
265					enum phy_mode mode)
266{
267	/* On GXL PHY must be started in device mode for DWC2 init */
268	return priv->drvdata->set_phy_mode(priv, i,
269				(i == USB2_OTG_PHY) ? PHY_MODE_USB_DEVICE
270						    : PHY_MODE_USB_HOST);
271}
272
273static int dwc3_meson_g12a_set_phy_mode(struct dwc3_meson_g12a *priv,
274					 int i, enum phy_mode mode)
275{
276	if (mode == PHY_MODE_USB_HOST)
277		regmap_update_bits(priv->u2p_regmap[i], U2P_R0,
278				U2P_R0_HOST_DEVICE,
279				U2P_R0_HOST_DEVICE);
280	else
281		regmap_update_bits(priv->u2p_regmap[i], U2P_R0,
282				U2P_R0_HOST_DEVICE, 0);
283
284	return 0;
285}
286
287static int dwc3_meson_g12a_usb2_init_phy(struct dwc3_meson_g12a *priv, int i,
288					 enum phy_mode mode)
289{
290	int ret;
291
292	regmap_update_bits(priv->u2p_regmap[i], U2P_R0,
293			U2P_R0_POWER_ON_RESET,
294			U2P_R0_POWER_ON_RESET);
295
296	if (priv->drvdata->otg_switch_supported && i == USB2_OTG_PHY) {
297		regmap_update_bits(priv->u2p_regmap[i], U2P_R0,
298				   U2P_R0_ID_PULLUP | U2P_R0_DRV_VBUS,
299				   U2P_R0_ID_PULLUP | U2P_R0_DRV_VBUS);
300
301		ret = priv->drvdata->set_phy_mode(priv, i, mode);
302	} else
303		ret = priv->drvdata->set_phy_mode(priv, i,
304						  PHY_MODE_USB_HOST);
305
306	if (ret)
307		return ret;
308
309	regmap_update_bits(priv->u2p_regmap[i], U2P_R0,
310			U2P_R0_POWER_ON_RESET, 0);
311
312	return 0;
313}
314
315static int dwc3_meson_g12a_usb2_init(struct dwc3_meson_g12a *priv,
316				     enum phy_mode mode)
317{
318	int i, ret;
319
320	for (i = 0; i < priv->drvdata->num_phys; ++i) {
321		if (!priv->phys[i])
322			continue;
323
324		if (!strstr(priv->drvdata->phy_names[i], "usb2"))
325			continue;
326
327		ret = priv->drvdata->usb2_init_phy(priv, i, mode);
328		if (ret)
329			return ret;
330	}
331
332	return 0;
333}
334
335static void dwc3_meson_g12a_usb3_init(struct dwc3_meson_g12a *priv)
336{
337	regmap_update_bits(priv->usb_glue_regmap, USB_R3,
338			USB_R3_P30_SSC_RANGE_MASK |
339			USB_R3_P30_REF_SSP_EN,
340			USB_R3_P30_SSC_ENABLE |
341			FIELD_PREP(USB_R3_P30_SSC_RANGE_MASK, 2) |
342			USB_R3_P30_REF_SSP_EN);
343	udelay(2);
344
345	regmap_update_bits(priv->usb_glue_regmap, USB_R2,
346			USB_R2_P30_PCS_TX_DEEMPH_3P5DB_MASK,
347			FIELD_PREP(USB_R2_P30_PCS_TX_DEEMPH_3P5DB_MASK, 0x15));
348
349	regmap_update_bits(priv->usb_glue_regmap, USB_R2,
350			USB_R2_P30_PCS_TX_DEEMPH_6DB_MASK,
351			FIELD_PREP(USB_R2_P30_PCS_TX_DEEMPH_6DB_MASK, 0x20));
352
353	udelay(2);
354
355	regmap_update_bits(priv->usb_glue_regmap, USB_R1,
356			USB_R1_U3H_HOST_PORT_POWER_CONTROL_PRESENT,
357			USB_R1_U3H_HOST_PORT_POWER_CONTROL_PRESENT);
358
359	regmap_update_bits(priv->usb_glue_regmap, USB_R1,
360			USB_R1_P30_PCS_TX_SWING_FULL_MASK,
361			FIELD_PREP(USB_R1_P30_PCS_TX_SWING_FULL_MASK, 127));
362}
363
364static void dwc3_meson_g12a_usb_otg_apply_mode(struct dwc3_meson_g12a *priv,
365					       enum phy_mode mode)
366{
367	if (mode == PHY_MODE_USB_DEVICE) {
368		if (priv->otg_mode != USB_DR_MODE_OTG &&
369		    priv->drvdata->otg_phy_host_port_disable)
370			/* Isolate the OTG PHY port from the Host Controller */
371			regmap_update_bits(priv->usb_glue_regmap, USB_R1,
372				USB_R1_U3H_HOST_U2_PORT_DISABLE_MASK,
373				FIELD_PREP(USB_R1_U3H_HOST_U2_PORT_DISABLE_MASK,
374					   BIT(USB2_OTG_PHY)));
375
376		regmap_update_bits(priv->usb_glue_regmap, USB_R0,
377				USB_R0_U2D_ACT, USB_R0_U2D_ACT);
378		regmap_update_bits(priv->usb_glue_regmap, USB_R0,
379				USB_R0_U2D_SS_SCALEDOWN_MODE_MASK, 0);
380		regmap_update_bits(priv->usb_glue_regmap, USB_R4,
381				USB_R4_P21_SLEEP_M0, USB_R4_P21_SLEEP_M0);
382	} else {
383		if (priv->otg_mode != USB_DR_MODE_OTG &&
384		    priv->drvdata->otg_phy_host_port_disable) {
385			regmap_update_bits(priv->usb_glue_regmap, USB_R1,
386				USB_R1_U3H_HOST_U2_PORT_DISABLE_MASK, 0);
387			msleep(500);
388		}
389		regmap_update_bits(priv->usb_glue_regmap, USB_R0,
390				USB_R0_U2D_ACT, 0);
391		regmap_update_bits(priv->usb_glue_regmap, USB_R4,
392				USB_R4_P21_SLEEP_M0, 0);
393	}
394}
395
396static int dwc3_meson_g12a_usb_init_glue(struct dwc3_meson_g12a *priv,
397					 enum phy_mode mode)
398{
399	int ret;
400
401	ret = dwc3_meson_g12a_usb2_init(priv, mode);
402	if (ret)
403		return ret;
404
405	regmap_update_bits(priv->usb_glue_regmap, USB_R1,
406			USB_R1_U3H_FLADJ_30MHZ_REG_MASK,
407			FIELD_PREP(USB_R1_U3H_FLADJ_30MHZ_REG_MASK, 0x20));
408
409	regmap_update_bits(priv->usb_glue_regmap, USB_R5,
410			USB_R5_ID_DIG_EN_0,
411			USB_R5_ID_DIG_EN_0);
412	regmap_update_bits(priv->usb_glue_regmap, USB_R5,
413			USB_R5_ID_DIG_EN_1,
414			USB_R5_ID_DIG_EN_1);
415	regmap_update_bits(priv->usb_glue_regmap, USB_R5,
416			USB_R5_ID_DIG_TH_MASK,
417			FIELD_PREP(USB_R5_ID_DIG_TH_MASK, 0xff));
418
419	/* If we have an actual SuperSpeed port, initialize it */
420	if (priv->usb3_ports)
421		dwc3_meson_g12a_usb3_init(priv);
422
423	dwc3_meson_g12a_usb_otg_apply_mode(priv, mode);
424
425	return 0;
426}
427
428static const struct regmap_config phy_meson_g12a_usb_glue_regmap_conf = {
429	.name = "usb-glue",
430	.reg_bits = 8,
431	.val_bits = 32,
432	.reg_stride = 4,
433	.max_register = USB_R5,
434};
435
436static int dwc3_meson_g12a_get_phys(struct dwc3_meson_g12a *priv)
437{
438	const char *phy_name;
439	int i;
440
441	for (i = 0 ; i < priv->drvdata->num_phys ; ++i) {
442		phy_name = priv->drvdata->phy_names[i];
443		priv->phys[i] = devm_phy_optional_get(priv->dev, phy_name);
444		if (!priv->phys[i])
445			continue;
446
447		if (IS_ERR(priv->phys[i]))
448			return PTR_ERR(priv->phys[i]);
449
450		if (strstr(phy_name, "usb3"))
451			priv->usb3_ports++;
452		else
453			priv->usb2_ports++;
454	}
455
456	dev_info(priv->dev, "USB2 ports: %d\n", priv->usb2_ports);
457	dev_info(priv->dev, "USB3 ports: %d\n", priv->usb3_ports);
458
459	return 0;
460}
461
462static enum phy_mode dwc3_meson_g12a_get_id(struct dwc3_meson_g12a *priv)
463{
464	u32 reg;
465
466	regmap_read(priv->usb_glue_regmap, USB_R5, &reg);
467
468	if (reg & (USB_R5_ID_DIG_SYNC | USB_R5_ID_DIG_REG))
469		return PHY_MODE_USB_DEVICE;
470
471	return PHY_MODE_USB_HOST;
472}
473
474static int dwc3_meson_g12a_otg_mode_set(struct dwc3_meson_g12a *priv,
475					enum phy_mode mode)
476{
477	int ret;
478
479	if (!priv->drvdata->otg_switch_supported || !priv->phys[USB2_OTG_PHY])
480		return -EINVAL;
481
482	if (mode == PHY_MODE_USB_HOST)
483		dev_info(priv->dev, "switching to Host Mode\n");
484	else
485		dev_info(priv->dev, "switching to Device Mode\n");
486
487	if (priv->vbus) {
488		if (mode == PHY_MODE_USB_DEVICE)
489			ret = regulator_disable(priv->vbus);
490		else
491			ret = regulator_enable(priv->vbus);
492		if (ret)
493			return ret;
494	}
495
496	priv->otg_phy_mode = mode;
497
498	ret = priv->drvdata->set_phy_mode(priv, USB2_OTG_PHY, mode);
499	if (ret)
500		return ret;
501
502	dwc3_meson_g12a_usb_otg_apply_mode(priv, mode);
503
504	return 0;
505}
506
507static int dwc3_meson_g12a_role_set(struct usb_role_switch *sw,
508				    enum usb_role role)
509{
510	struct dwc3_meson_g12a *priv = usb_role_switch_get_drvdata(sw);
511	enum phy_mode mode;
512
513	if (role == USB_ROLE_NONE)
514		return 0;
515
516	mode = (role == USB_ROLE_HOST) ? PHY_MODE_USB_HOST
517				       : PHY_MODE_USB_DEVICE;
518
519	if (mode == priv->otg_phy_mode)
520		return 0;
521
522	if (priv->drvdata->otg_phy_host_port_disable)
523		dev_warn_once(priv->dev, "Manual OTG switch is broken on this "\
524					 "SoC, when manual switching from "\
525					 "Host to device, DWC3 controller "\
526					 "will need to be resetted in order "\
527					 "to recover usage of the Host port");
528
529	return dwc3_meson_g12a_otg_mode_set(priv, mode);
530}
531
532static enum usb_role dwc3_meson_g12a_role_get(struct usb_role_switch *sw)
533{
534	struct dwc3_meson_g12a *priv = usb_role_switch_get_drvdata(sw);
535
536	return priv->otg_phy_mode == PHY_MODE_USB_HOST ?
537		USB_ROLE_HOST : USB_ROLE_DEVICE;
538}
539
540static irqreturn_t dwc3_meson_g12a_irq_thread(int irq, void *data)
541{
542	struct dwc3_meson_g12a *priv = data;
543	enum phy_mode otg_id;
544
545	otg_id = dwc3_meson_g12a_get_id(priv);
546	if (otg_id != priv->otg_phy_mode) {
547		if (dwc3_meson_g12a_otg_mode_set(priv, otg_id))
548			dev_warn(priv->dev, "Failed to switch OTG mode\n");
549	}
550
551	regmap_update_bits(priv->usb_glue_regmap, USB_R5,
552			   USB_R5_ID_DIG_IRQ, 0);
553
554	return IRQ_HANDLED;
555}
556
557static struct device *dwc3_meson_g12_find_child(struct device *dev,
558						const char *compatible)
559{
560	struct platform_device *pdev;
561	struct device_node *np;
562
563	np = of_get_compatible_child(dev->of_node, compatible);
564	if (!np)
565		return NULL;
566
567	pdev = of_find_device_by_node(np);
568	of_node_put(np);
569	if (!pdev)
570		return NULL;
571
572	return &pdev->dev;
573}
574
575static int dwc3_meson_g12a_otg_init(struct platform_device *pdev,
576				    struct dwc3_meson_g12a *priv)
577{
578	enum phy_mode otg_id;
579	int ret, irq;
580	struct device *dev = &pdev->dev;
581
582	if (!priv->drvdata->otg_switch_supported)
583		return 0;
584
585	if (priv->otg_mode == USB_DR_MODE_OTG) {
586		/* Ack irq before registering */
587		regmap_update_bits(priv->usb_glue_regmap, USB_R5,
588				   USB_R5_ID_DIG_IRQ, 0);
589
590		irq = platform_get_irq(pdev, 0);
591		ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
592						dwc3_meson_g12a_irq_thread,
593						IRQF_ONESHOT, pdev->name, priv);
594		if (ret)
595			return ret;
596	}
597
598	/* Setup OTG mode corresponding to the ID pin */
599	if (priv->otg_mode == USB_DR_MODE_OTG) {
600		otg_id = dwc3_meson_g12a_get_id(priv);
601		if (otg_id != priv->otg_phy_mode) {
602			if (dwc3_meson_g12a_otg_mode_set(priv, otg_id))
603				dev_warn(dev, "Failed to switch OTG mode\n");
604		}
605	}
606
607	/* Setup role switcher */
608	priv->switch_desc.usb2_port = dwc3_meson_g12_find_child(dev,
609								"snps,dwc3");
610	priv->switch_desc.udc = dwc3_meson_g12_find_child(dev, "snps,dwc2");
611	priv->switch_desc.allow_userspace_control = true;
612	priv->switch_desc.set = dwc3_meson_g12a_role_set;
613	priv->switch_desc.get = dwc3_meson_g12a_role_get;
614	priv->switch_desc.driver_data = priv;
615
616	priv->role_switch = usb_role_switch_register(dev, &priv->switch_desc);
617	if (IS_ERR(priv->role_switch))
618		dev_warn(dev, "Unable to register Role Switch\n");
619
620	return 0;
621}
622
623static int dwc3_meson_gxl_setup_regmaps(struct dwc3_meson_g12a *priv,
624					void __iomem *base)
625{
626	/* GXL controls the PHY mode in the PHY registers unlike G12A */
627	priv->usb_glue_regmap = devm_regmap_init_mmio(priv->dev, base,
628					&phy_meson_g12a_usb_glue_regmap_conf);
629	if (IS_ERR(priv->usb_glue_regmap))
630		return PTR_ERR(priv->usb_glue_regmap);
631
632	return 0;
633}
634
635static int dwc3_meson_g12a_setup_regmaps(struct dwc3_meson_g12a *priv,
636					 void __iomem *base)
637{
638	int i;
639
640	priv->usb_glue_regmap = devm_regmap_init_mmio(priv->dev,
641					base + G12A_GLUE_OFFSET,
642					&phy_meson_g12a_usb_glue_regmap_conf);
643	if (IS_ERR(priv->usb_glue_regmap))
644		return PTR_ERR(priv->usb_glue_regmap);
645
646	/* Create a regmap for each USB2 PHY control register set */
647	for (i = 0; i < priv->usb2_ports; i++) {
648		struct regmap_config u2p_regmap_config = {
649			.reg_bits = 8,
650			.val_bits = 32,
651			.reg_stride = 4,
652			.max_register = U2P_R1,
653		};
654
655		u2p_regmap_config.name = devm_kasprintf(priv->dev, GFP_KERNEL,
656							"u2p-%d", i);
657		if (!u2p_regmap_config.name)
658			return -ENOMEM;
659
660		priv->u2p_regmap[i] = devm_regmap_init_mmio(priv->dev,
661						base + (i * U2P_REG_SIZE),
662						&u2p_regmap_config);
663		if (IS_ERR(priv->u2p_regmap[i]))
664			return PTR_ERR(priv->u2p_regmap[i]);
665	}
666
667	return 0;
668}
669
670static int dwc3_meson_g12a_usb_init(struct dwc3_meson_g12a *priv)
671{
672	return dwc3_meson_g12a_usb_init_glue(priv, priv->otg_phy_mode);
673}
674
675static int dwc3_meson_gxl_usb_init(struct dwc3_meson_g12a *priv)
676{
677	return dwc3_meson_g12a_usb_init_glue(priv, PHY_MODE_USB_DEVICE);
678}
679
680static int dwc3_meson_gxl_usb_post_init(struct dwc3_meson_g12a *priv)
681{
682	int ret;
683
684	ret = priv->drvdata->set_phy_mode(priv, USB2_OTG_PHY,
685					  priv->otg_phy_mode);
686	if (ret)
687		return ret;
688
689	dwc3_meson_g12a_usb_otg_apply_mode(priv, priv->otg_phy_mode);
690
691	return 0;
692}
693
694static int dwc3_meson_g12a_probe(struct platform_device *pdev)
695{
696	struct dwc3_meson_g12a	*priv;
697	struct device		*dev = &pdev->dev;
698	struct device_node	*np = dev->of_node;
699	void __iomem *base;
700	int ret, i;
701
702	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
703	if (!priv)
704		return -ENOMEM;
705
706	base = devm_platform_ioremap_resource(pdev, 0);
707	if (IS_ERR(base))
708		return PTR_ERR(base);
709
710	priv->drvdata = of_device_get_match_data(&pdev->dev);
711	priv->dev = dev;
712
713	priv->vbus = devm_regulator_get_optional(dev, "vbus");
714	if (IS_ERR(priv->vbus)) {
715		if (PTR_ERR(priv->vbus) == -EPROBE_DEFER)
716			return PTR_ERR(priv->vbus);
717		priv->vbus = NULL;
718	}
719
720	ret = devm_clk_bulk_get(dev,
721				priv->drvdata->num_clks,
722				priv->drvdata->clks);
723	if (ret)
724		return ret;
725
726	ret = clk_bulk_prepare_enable(priv->drvdata->num_clks,
727				      priv->drvdata->clks);
728	if (ret)
729		return ret;
730
731	platform_set_drvdata(pdev, priv);
732
733	priv->reset = devm_reset_control_get_shared(dev, NULL);
734	if (IS_ERR(priv->reset)) {
735		ret = PTR_ERR(priv->reset);
736		dev_err(dev, "failed to get device reset, err=%d\n", ret);
737		goto err_disable_clks;
738	}
739
740	ret = reset_control_reset(priv->reset);
741	if (ret)
742		goto err_disable_clks;
743
744	ret = dwc3_meson_g12a_get_phys(priv);
745	if (ret)
746		goto err_disable_clks;
747
748	ret = priv->drvdata->setup_regmaps(priv, base);
749	if (ret)
750		return ret;
751
752	if (priv->vbus) {
753		ret = regulator_enable(priv->vbus);
754		if (ret)
755			goto err_disable_clks;
756	}
757
758	/* Get dr_mode */
759	priv->otg_mode = usb_get_dr_mode(dev);
760
761	if (priv->otg_mode == USB_DR_MODE_PERIPHERAL)
762		priv->otg_phy_mode = PHY_MODE_USB_DEVICE;
763	else
764		priv->otg_phy_mode = PHY_MODE_USB_HOST;
765
766	ret = priv->drvdata->usb_init(priv);
767	if (ret)
768		goto err_disable_clks;
769
770	/* Init PHYs */
771	for (i = 0 ; i < PHY_COUNT ; ++i) {
772		ret = phy_init(priv->phys[i]);
773		if (ret)
774			goto err_disable_clks;
775	}
776
777	/* Set PHY Power */
778	for (i = 0 ; i < PHY_COUNT ; ++i) {
779		ret = phy_power_on(priv->phys[i]);
780		if (ret)
781			goto err_phys_exit;
782	}
783
784	if (priv->drvdata->usb_post_init) {
785		ret = priv->drvdata->usb_post_init(priv);
786		if (ret)
787			goto err_phys_power;
788	}
789
790	ret = of_platform_populate(np, NULL, NULL, dev);
791	if (ret)
792		goto err_phys_power;
793
794	ret = dwc3_meson_g12a_otg_init(pdev, priv);
795	if (ret)
796		goto err_phys_power;
797
798	pm_runtime_set_active(dev);
799	pm_runtime_enable(dev);
800	pm_runtime_get_sync(dev);
801
802	return 0;
803
804err_phys_power:
805	for (i = 0 ; i < PHY_COUNT ; ++i)
806		phy_power_off(priv->phys[i]);
807
808err_phys_exit:
809	for (i = 0 ; i < PHY_COUNT ; ++i)
810		phy_exit(priv->phys[i]);
811
812err_disable_clks:
813	clk_bulk_disable_unprepare(priv->drvdata->num_clks,
814				   priv->drvdata->clks);
815
816	return ret;
817}
818
819static int dwc3_meson_g12a_remove(struct platform_device *pdev)
820{
821	struct dwc3_meson_g12a *priv = platform_get_drvdata(pdev);
822	struct device *dev = &pdev->dev;
823	int i;
824
825	if (priv->drvdata->otg_switch_supported)
826		usb_role_switch_unregister(priv->role_switch);
827
828	of_platform_depopulate(dev);
829
830	for (i = 0 ; i < PHY_COUNT ; ++i) {
831		phy_power_off(priv->phys[i]);
832		phy_exit(priv->phys[i]);
833	}
834
835	pm_runtime_disable(dev);
836	pm_runtime_put_noidle(dev);
837	pm_runtime_set_suspended(dev);
838
839	clk_bulk_disable_unprepare(priv->drvdata->num_clks,
840				   priv->drvdata->clks);
841
842	return 0;
843}
844
845static int __maybe_unused dwc3_meson_g12a_runtime_suspend(struct device *dev)
846{
847	struct dwc3_meson_g12a	*priv = dev_get_drvdata(dev);
848
849	clk_bulk_disable_unprepare(priv->drvdata->num_clks,
850				   priv->drvdata->clks);
851
852	return 0;
853}
854
855static int __maybe_unused dwc3_meson_g12a_runtime_resume(struct device *dev)
856{
857	struct dwc3_meson_g12a	*priv = dev_get_drvdata(dev);
858
859	return clk_bulk_prepare_enable(priv->drvdata->num_clks,
860				       priv->drvdata->clks);
861}
862
863static int __maybe_unused dwc3_meson_g12a_suspend(struct device *dev)
864{
865	struct dwc3_meson_g12a *priv = dev_get_drvdata(dev);
866	int i, ret;
867
868	if (priv->vbus && priv->otg_phy_mode == PHY_MODE_USB_HOST) {
869		ret = regulator_disable(priv->vbus);
870		if (ret)
871			return ret;
872	}
873
874	for (i = 0 ; i < PHY_COUNT ; ++i) {
875		phy_power_off(priv->phys[i]);
876		phy_exit(priv->phys[i]);
877	}
878
879	reset_control_assert(priv->reset);
880
881	return 0;
882}
883
884static int __maybe_unused dwc3_meson_g12a_resume(struct device *dev)
885{
886	struct dwc3_meson_g12a *priv = dev_get_drvdata(dev);
887	int i, ret;
888
889	reset_control_deassert(priv->reset);
890
891	ret = priv->drvdata->usb_init(priv);
892	if (ret)
893		return ret;
894
895	/* Init PHYs */
896	for (i = 0 ; i < PHY_COUNT ; ++i) {
897		ret = phy_init(priv->phys[i]);
898		if (ret)
899			return ret;
900	}
901
902	/* Set PHY Power */
903	for (i = 0 ; i < PHY_COUNT ; ++i) {
904		ret = phy_power_on(priv->phys[i]);
905		if (ret)
906			return ret;
907	}
908
909       if (priv->vbus && priv->otg_phy_mode == PHY_MODE_USB_HOST) {
910               ret = regulator_enable(priv->vbus);
911		if (ret)
912			return ret;
913	}
914
915	return 0;
916}
917
918static const struct dev_pm_ops dwc3_meson_g12a_dev_pm_ops = {
919	SET_SYSTEM_SLEEP_PM_OPS(dwc3_meson_g12a_suspend, dwc3_meson_g12a_resume)
920	SET_RUNTIME_PM_OPS(dwc3_meson_g12a_runtime_suspend,
921			   dwc3_meson_g12a_runtime_resume, NULL)
922};
923
924static const struct of_device_id dwc3_meson_g12a_match[] = {
925	{
926		.compatible = "amlogic,meson-gxl-usb-ctrl",
927		.data = &gxl_drvdata,
928	},
929	{
930		.compatible = "amlogic,meson-gxm-usb-ctrl",
931		.data = &gxm_drvdata,
932	},
933	{
934		.compatible = "amlogic,meson-g12a-usb-ctrl",
935		.data = &g12a_drvdata,
936	},
937	{
938		.compatible = "amlogic,meson-a1-usb-ctrl",
939		.data = &a1_drvdata,
940	},
941	{ /* Sentinel */ }
942};
943MODULE_DEVICE_TABLE(of, dwc3_meson_g12a_match);
944
945static struct platform_driver dwc3_meson_g12a_driver = {
946	.probe		= dwc3_meson_g12a_probe,
947	.remove		= dwc3_meson_g12a_remove,
948	.driver		= {
949		.name	= "dwc3-meson-g12a",
950		.of_match_table = dwc3_meson_g12a_match,
951		.pm	= &dwc3_meson_g12a_dev_pm_ops,
952	},
953};
954
955module_platform_driver(dwc3_meson_g12a_driver);
956MODULE_LICENSE("GPL v2");
957MODULE_DESCRIPTION("Amlogic Meson G12A USB Glue Layer");
958MODULE_AUTHOR("Neil Armstrong <narmstrong@baylibre.com>");