xref: /openbmc/linux/drivers/usb/host/xhci-mtk.c (revision 64ba3d59)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * MediaTek xHCI Host Controller Driver
4  *
5  * Copyright (c) 2015 MediaTek Inc.
6  * Author:
7  *  Chunfeng Yun <chunfeng.yun@mediatek.com>
8  */
9 
10 #include <linux/clk.h>
11 #include <linux/dma-mapping.h>
12 #include <linux/iopoll.h>
13 #include <linux/kernel.h>
14 #include <linux/mfd/syscon.h>
15 #include <linux/module.h>
16 #include <linux/of.h>
17 #include <linux/platform_device.h>
18 #include <linux/pm_runtime.h>
19 #include <linux/regmap.h>
20 #include <linux/regulator/consumer.h>
21 
22 #include "xhci.h"
23 #include "xhci-mtk.h"
24 
25 /* ip_pw_ctrl0 register */
26 #define CTRL0_IP_SW_RST	BIT(0)
27 
28 /* ip_pw_ctrl1 register */
29 #define CTRL1_IP_HOST_PDN	BIT(0)
30 
31 /* ip_pw_ctrl2 register */
32 #define CTRL2_IP_DEV_PDN	BIT(0)
33 
34 /* ip_pw_sts1 register */
35 #define STS1_IP_SLEEP_STS	BIT(30)
36 #define STS1_U3_MAC_RST	BIT(16)
37 #define STS1_XHCI_RST		BIT(11)
38 #define STS1_SYS125_RST	BIT(10)
39 #define STS1_REF_RST		BIT(8)
40 #define STS1_SYSPLL_STABLE	BIT(0)
41 
42 /* ip_xhci_cap register */
43 #define CAP_U3_PORT_NUM(p)	((p) & 0xff)
44 #define CAP_U2_PORT_NUM(p)	(((p) >> 8) & 0xff)
45 
46 /* u3_ctrl_p register */
47 #define CTRL_U3_PORT_HOST_SEL	BIT(2)
48 #define CTRL_U3_PORT_PDN	BIT(1)
49 #define CTRL_U3_PORT_DIS	BIT(0)
50 
51 /* u2_ctrl_p register */
52 #define CTRL_U2_PORT_HOST_SEL	BIT(2)
53 #define CTRL_U2_PORT_PDN	BIT(1)
54 #define CTRL_U2_PORT_DIS	BIT(0)
55 
56 /* u2_phy_pll register */
57 #define CTRL_U2_FORCE_PLL_STB	BIT(28)
58 
59 /* usb remote wakeup registers in syscon */
60 /* mt8173 etc */
61 #define PERI_WK_CTRL1	0x4
62 #define WC1_IS_C(x)	(((x) & 0xf) << 26)  /* cycle debounce */
63 #define WC1_IS_EN	BIT(25)
64 #define WC1_IS_P	BIT(6)  /* polarity for ip sleep */
65 
66 /* mt2712 etc */
67 #define PERI_SSUSB_SPM_CTRL	0x0
68 #define SSC_IP_SLEEP_EN	BIT(4)
69 #define SSC_SPM_INT_EN		BIT(1)
70 
71 enum ssusb_uwk_vers {
72 	SSUSB_UWK_V1 = 1,
73 	SSUSB_UWK_V2,
74 };
75 
76 static int xhci_mtk_host_enable(struct xhci_hcd_mtk *mtk)
77 {
78 	struct mu3c_ippc_regs __iomem *ippc = mtk->ippc_regs;
79 	u32 value, check_val;
80 	int u3_ports_disabled = 0;
81 	int ret;
82 	int i;
83 
84 	if (!mtk->has_ippc)
85 		return 0;
86 
87 	/* power on host ip */
88 	value = readl(&ippc->ip_pw_ctr1);
89 	value &= ~CTRL1_IP_HOST_PDN;
90 	writel(value, &ippc->ip_pw_ctr1);
91 
92 	/* power on and enable u3 ports except skipped ones */
93 	for (i = 0; i < mtk->num_u3_ports; i++) {
94 		if ((0x1 << i) & mtk->u3p_dis_msk) {
95 			u3_ports_disabled++;
96 			continue;
97 		}
98 
99 		value = readl(&ippc->u3_ctrl_p[i]);
100 		value &= ~(CTRL_U3_PORT_PDN | CTRL_U3_PORT_DIS);
101 		value |= CTRL_U3_PORT_HOST_SEL;
102 		writel(value, &ippc->u3_ctrl_p[i]);
103 	}
104 
105 	/* power on and enable all u2 ports */
106 	for (i = 0; i < mtk->num_u2_ports; i++) {
107 		value = readl(&ippc->u2_ctrl_p[i]);
108 		value &= ~(CTRL_U2_PORT_PDN | CTRL_U2_PORT_DIS);
109 		value |= CTRL_U2_PORT_HOST_SEL;
110 		writel(value, &ippc->u2_ctrl_p[i]);
111 	}
112 
113 	/*
114 	 * wait for clocks to be stable, and clock domains reset to
115 	 * be inactive after power on and enable ports
116 	 */
117 	check_val = STS1_SYSPLL_STABLE | STS1_REF_RST |
118 			STS1_SYS125_RST | STS1_XHCI_RST;
119 
120 	if (mtk->num_u3_ports > u3_ports_disabled)
121 		check_val |= STS1_U3_MAC_RST;
122 
123 	ret = readl_poll_timeout(&ippc->ip_pw_sts1, value,
124 			  (check_val == (value & check_val)), 100, 20000);
125 	if (ret) {
126 		dev_err(mtk->dev, "clocks are not stable (0x%x)\n", value);
127 		return ret;
128 	}
129 
130 	return 0;
131 }
132 
133 static int xhci_mtk_host_disable(struct xhci_hcd_mtk *mtk)
134 {
135 	struct mu3c_ippc_regs __iomem *ippc = mtk->ippc_regs;
136 	u32 value;
137 	int ret;
138 	int i;
139 
140 	if (!mtk->has_ippc)
141 		return 0;
142 
143 	/* power down u3 ports except skipped ones */
144 	for (i = 0; i < mtk->num_u3_ports; i++) {
145 		if ((0x1 << i) & mtk->u3p_dis_msk)
146 			continue;
147 
148 		value = readl(&ippc->u3_ctrl_p[i]);
149 		value |= CTRL_U3_PORT_PDN;
150 		writel(value, &ippc->u3_ctrl_p[i]);
151 	}
152 
153 	/* power down all u2 ports */
154 	for (i = 0; i < mtk->num_u2_ports; i++) {
155 		value = readl(&ippc->u2_ctrl_p[i]);
156 		value |= CTRL_U2_PORT_PDN;
157 		writel(value, &ippc->u2_ctrl_p[i]);
158 	}
159 
160 	/* power down host ip */
161 	value = readl(&ippc->ip_pw_ctr1);
162 	value |= CTRL1_IP_HOST_PDN;
163 	writel(value, &ippc->ip_pw_ctr1);
164 
165 	/* wait for host ip to sleep */
166 	ret = readl_poll_timeout(&ippc->ip_pw_sts1, value,
167 			  (value & STS1_IP_SLEEP_STS), 100, 100000);
168 	if (ret) {
169 		dev_err(mtk->dev, "ip sleep failed!!!\n");
170 		return ret;
171 	}
172 	return 0;
173 }
174 
175 static int xhci_mtk_ssusb_config(struct xhci_hcd_mtk *mtk)
176 {
177 	struct mu3c_ippc_regs __iomem *ippc = mtk->ippc_regs;
178 	u32 value;
179 
180 	if (!mtk->has_ippc)
181 		return 0;
182 
183 	/* reset whole ip */
184 	value = readl(&ippc->ip_pw_ctr0);
185 	value |= CTRL0_IP_SW_RST;
186 	writel(value, &ippc->ip_pw_ctr0);
187 	udelay(1);
188 	value = readl(&ippc->ip_pw_ctr0);
189 	value &= ~CTRL0_IP_SW_RST;
190 	writel(value, &ippc->ip_pw_ctr0);
191 
192 	/*
193 	 * device ip is default power-on in fact
194 	 * power down device ip, otherwise ip-sleep will fail
195 	 */
196 	value = readl(&ippc->ip_pw_ctr2);
197 	value |= CTRL2_IP_DEV_PDN;
198 	writel(value, &ippc->ip_pw_ctr2);
199 
200 	value = readl(&ippc->ip_xhci_cap);
201 	mtk->num_u3_ports = CAP_U3_PORT_NUM(value);
202 	mtk->num_u2_ports = CAP_U2_PORT_NUM(value);
203 	dev_dbg(mtk->dev, "%s u2p:%d, u3p:%d\n", __func__,
204 			mtk->num_u2_ports, mtk->num_u3_ports);
205 
206 	return xhci_mtk_host_enable(mtk);
207 }
208 
209 static int xhci_mtk_clks_get(struct xhci_hcd_mtk *mtk)
210 {
211 	struct device *dev = mtk->dev;
212 
213 	mtk->sys_clk = devm_clk_get(dev, "sys_ck");
214 	if (IS_ERR(mtk->sys_clk)) {
215 		dev_err(dev, "fail to get sys_ck\n");
216 		return PTR_ERR(mtk->sys_clk);
217 	}
218 
219 	mtk->xhci_clk = devm_clk_get_optional(dev, "xhci_ck");
220 	if (IS_ERR(mtk->xhci_clk))
221 		return PTR_ERR(mtk->xhci_clk);
222 
223 	mtk->ref_clk = devm_clk_get_optional(dev, "ref_ck");
224 	if (IS_ERR(mtk->ref_clk))
225 		return PTR_ERR(mtk->ref_clk);
226 
227 	mtk->mcu_clk = devm_clk_get_optional(dev, "mcu_ck");
228 	if (IS_ERR(mtk->mcu_clk))
229 		return PTR_ERR(mtk->mcu_clk);
230 
231 	mtk->dma_clk = devm_clk_get_optional(dev, "dma_ck");
232 	return PTR_ERR_OR_ZERO(mtk->dma_clk);
233 }
234 
235 static int xhci_mtk_clks_enable(struct xhci_hcd_mtk *mtk)
236 {
237 	int ret;
238 
239 	ret = clk_prepare_enable(mtk->ref_clk);
240 	if (ret) {
241 		dev_err(mtk->dev, "failed to enable ref_clk\n");
242 		goto ref_clk_err;
243 	}
244 
245 	ret = clk_prepare_enable(mtk->sys_clk);
246 	if (ret) {
247 		dev_err(mtk->dev, "failed to enable sys_clk\n");
248 		goto sys_clk_err;
249 	}
250 
251 	ret = clk_prepare_enable(mtk->xhci_clk);
252 	if (ret) {
253 		dev_err(mtk->dev, "failed to enable xhci_clk\n");
254 		goto xhci_clk_err;
255 	}
256 
257 	ret = clk_prepare_enable(mtk->mcu_clk);
258 	if (ret) {
259 		dev_err(mtk->dev, "failed to enable mcu_clk\n");
260 		goto mcu_clk_err;
261 	}
262 
263 	ret = clk_prepare_enable(mtk->dma_clk);
264 	if (ret) {
265 		dev_err(mtk->dev, "failed to enable dma_clk\n");
266 		goto dma_clk_err;
267 	}
268 
269 	return 0;
270 
271 dma_clk_err:
272 	clk_disable_unprepare(mtk->mcu_clk);
273 mcu_clk_err:
274 	clk_disable_unprepare(mtk->xhci_clk);
275 xhci_clk_err:
276 	clk_disable_unprepare(mtk->sys_clk);
277 sys_clk_err:
278 	clk_disable_unprepare(mtk->ref_clk);
279 ref_clk_err:
280 	return ret;
281 }
282 
283 static void xhci_mtk_clks_disable(struct xhci_hcd_mtk *mtk)
284 {
285 	clk_disable_unprepare(mtk->dma_clk);
286 	clk_disable_unprepare(mtk->mcu_clk);
287 	clk_disable_unprepare(mtk->xhci_clk);
288 	clk_disable_unprepare(mtk->sys_clk);
289 	clk_disable_unprepare(mtk->ref_clk);
290 }
291 
292 /* only clocks can be turn off for ip-sleep wakeup mode */
293 static void usb_wakeup_ip_sleep_set(struct xhci_hcd_mtk *mtk, bool enable)
294 {
295 	u32 reg, msk, val;
296 
297 	switch (mtk->uwk_vers) {
298 	case SSUSB_UWK_V1:
299 		reg = mtk->uwk_reg_base + PERI_WK_CTRL1;
300 		msk = WC1_IS_EN | WC1_IS_C(0xf) | WC1_IS_P;
301 		val = enable ? (WC1_IS_EN | WC1_IS_C(0x8)) : 0;
302 		break;
303 	case SSUSB_UWK_V2:
304 		reg = mtk->uwk_reg_base + PERI_SSUSB_SPM_CTRL;
305 		msk = SSC_IP_SLEEP_EN | SSC_SPM_INT_EN;
306 		val = enable ? msk : 0;
307 		break;
308 	default:
309 		return;
310 	}
311 	regmap_update_bits(mtk->uwk, reg, msk, val);
312 }
313 
314 static int usb_wakeup_of_property_parse(struct xhci_hcd_mtk *mtk,
315 				struct device_node *dn)
316 {
317 	struct of_phandle_args args;
318 	int ret;
319 
320 	/* Wakeup function is optional */
321 	mtk->uwk_en = of_property_read_bool(dn, "wakeup-source");
322 	if (!mtk->uwk_en)
323 		return 0;
324 
325 	ret = of_parse_phandle_with_fixed_args(dn,
326 				"mediatek,syscon-wakeup", 2, 0, &args);
327 	if (ret)
328 		return ret;
329 
330 	mtk->uwk_reg_base = args.args[0];
331 	mtk->uwk_vers = args.args[1];
332 	mtk->uwk = syscon_node_to_regmap(args.np);
333 	of_node_put(args.np);
334 	dev_info(mtk->dev, "uwk - reg:0x%x, version:%d\n",
335 			mtk->uwk_reg_base, mtk->uwk_vers);
336 
337 	return PTR_ERR_OR_ZERO(mtk->uwk);
338 
339 }
340 
341 static void usb_wakeup_set(struct xhci_hcd_mtk *mtk, bool enable)
342 {
343 	if (mtk->uwk_en)
344 		usb_wakeup_ip_sleep_set(mtk, enable);
345 }
346 
347 static int xhci_mtk_setup(struct usb_hcd *hcd);
348 static const struct xhci_driver_overrides xhci_mtk_overrides __initconst = {
349 	.reset = xhci_mtk_setup,
350 	.check_bandwidth = xhci_mtk_check_bandwidth,
351 	.reset_bandwidth = xhci_mtk_reset_bandwidth,
352 };
353 
354 static struct hc_driver __read_mostly xhci_mtk_hc_driver;
355 
356 static int xhci_mtk_ldos_enable(struct xhci_hcd_mtk *mtk)
357 {
358 	int ret;
359 
360 	ret = regulator_enable(mtk->vbus);
361 	if (ret) {
362 		dev_err(mtk->dev, "failed to enable vbus\n");
363 		return ret;
364 	}
365 
366 	ret = regulator_enable(mtk->vusb33);
367 	if (ret) {
368 		dev_err(mtk->dev, "failed to enable vusb33\n");
369 		regulator_disable(mtk->vbus);
370 		return ret;
371 	}
372 	return 0;
373 }
374 
375 static void xhci_mtk_ldos_disable(struct xhci_hcd_mtk *mtk)
376 {
377 	regulator_disable(mtk->vbus);
378 	regulator_disable(mtk->vusb33);
379 }
380 
381 static void xhci_mtk_quirks(struct device *dev, struct xhci_hcd *xhci)
382 {
383 	struct usb_hcd *hcd = xhci_to_hcd(xhci);
384 	struct xhci_hcd_mtk *mtk = hcd_to_mtk(hcd);
385 
386 	/*
387 	 * As of now platform drivers don't provide MSI support so we ensure
388 	 * here that the generic code does not try to make a pci_dev from our
389 	 * dev struct in order to setup MSI
390 	 */
391 	xhci->quirks |= XHCI_PLAT;
392 	xhci->quirks |= XHCI_MTK_HOST;
393 	/*
394 	 * MTK host controller gives a spurious successful event after a
395 	 * short transfer. Ignore it.
396 	 */
397 	xhci->quirks |= XHCI_SPURIOUS_SUCCESS;
398 	if (mtk->lpm_support)
399 		xhci->quirks |= XHCI_LPM_SUPPORT;
400 }
401 
402 /* called during probe() after chip reset completes */
403 static int xhci_mtk_setup(struct usb_hcd *hcd)
404 {
405 	struct xhci_hcd_mtk *mtk = hcd_to_mtk(hcd);
406 	int ret;
407 
408 	if (usb_hcd_is_primary_hcd(hcd)) {
409 		ret = xhci_mtk_ssusb_config(mtk);
410 		if (ret)
411 			return ret;
412 	}
413 
414 	ret = xhci_gen_setup(hcd, xhci_mtk_quirks);
415 	if (ret)
416 		return ret;
417 
418 	if (usb_hcd_is_primary_hcd(hcd)) {
419 		ret = xhci_mtk_sch_init(mtk);
420 		if (ret)
421 			return ret;
422 	}
423 
424 	return ret;
425 }
426 
427 static int xhci_mtk_probe(struct platform_device *pdev)
428 {
429 	struct device *dev = &pdev->dev;
430 	struct device_node *node = dev->of_node;
431 	struct xhci_hcd_mtk *mtk;
432 	const struct hc_driver *driver;
433 	struct xhci_hcd *xhci;
434 	struct resource *res;
435 	struct usb_hcd *hcd;
436 	int ret = -ENODEV;
437 	int irq;
438 
439 	if (usb_disabled())
440 		return -ENODEV;
441 
442 	driver = &xhci_mtk_hc_driver;
443 	mtk = devm_kzalloc(dev, sizeof(*mtk), GFP_KERNEL);
444 	if (!mtk)
445 		return -ENOMEM;
446 
447 	mtk->dev = dev;
448 	mtk->vbus = devm_regulator_get(dev, "vbus");
449 	if (IS_ERR(mtk->vbus)) {
450 		dev_err(dev, "fail to get vbus\n");
451 		return PTR_ERR(mtk->vbus);
452 	}
453 
454 	mtk->vusb33 = devm_regulator_get(dev, "vusb33");
455 	if (IS_ERR(mtk->vusb33)) {
456 		dev_err(dev, "fail to get vusb33\n");
457 		return PTR_ERR(mtk->vusb33);
458 	}
459 
460 	ret = xhci_mtk_clks_get(mtk);
461 	if (ret)
462 		return ret;
463 
464 	mtk->lpm_support = of_property_read_bool(node, "usb3-lpm-capable");
465 	/* optional property, ignore the error if it does not exist */
466 	of_property_read_u32(node, "mediatek,u3p-dis-msk",
467 			     &mtk->u3p_dis_msk);
468 
469 	ret = usb_wakeup_of_property_parse(mtk, node);
470 	if (ret) {
471 		dev_err(dev, "failed to parse uwk property\n");
472 		return ret;
473 	}
474 
475 	pm_runtime_enable(dev);
476 	pm_runtime_get_sync(dev);
477 	device_enable_async_suspend(dev);
478 
479 	ret = xhci_mtk_ldos_enable(mtk);
480 	if (ret)
481 		goto disable_pm;
482 
483 	ret = xhci_mtk_clks_enable(mtk);
484 	if (ret)
485 		goto disable_ldos;
486 
487 	irq = platform_get_irq(pdev, 0);
488 	if (irq < 0) {
489 		ret = irq;
490 		goto disable_clk;
491 	}
492 
493 	hcd = usb_create_hcd(driver, dev, dev_name(dev));
494 	if (!hcd) {
495 		ret = -ENOMEM;
496 		goto disable_clk;
497 	}
498 
499 	/*
500 	 * USB 2.0 roothub is stored in the platform_device.
501 	 * Swap it with mtk HCD.
502 	 */
503 	mtk->hcd = platform_get_drvdata(pdev);
504 	platform_set_drvdata(pdev, mtk);
505 
506 	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "mac");
507 	hcd->regs = devm_ioremap_resource(dev, res);
508 	if (IS_ERR(hcd->regs)) {
509 		ret = PTR_ERR(hcd->regs);
510 		goto put_usb2_hcd;
511 	}
512 	hcd->rsrc_start = res->start;
513 	hcd->rsrc_len = resource_size(res);
514 
515 	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "ippc");
516 	if (res) {	/* ippc register is optional */
517 		mtk->ippc_regs = devm_ioremap_resource(dev, res);
518 		if (IS_ERR(mtk->ippc_regs)) {
519 			ret = PTR_ERR(mtk->ippc_regs);
520 			goto put_usb2_hcd;
521 		}
522 		mtk->has_ippc = true;
523 	} else {
524 		mtk->has_ippc = false;
525 	}
526 
527 	device_init_wakeup(dev, true);
528 
529 	xhci = hcd_to_xhci(hcd);
530 	xhci->main_hcd = hcd;
531 
532 	/*
533 	 * imod_interval is the interrupt moderation value in nanoseconds.
534 	 * The increment interval is 8 times as much as that defined in
535 	 * the xHCI spec on MTK's controller.
536 	 */
537 	xhci->imod_interval = 5000;
538 	device_property_read_u32(dev, "imod-interval-ns", &xhci->imod_interval);
539 
540 	xhci->shared_hcd = usb_create_shared_hcd(driver, dev,
541 			dev_name(dev), hcd);
542 	if (!xhci->shared_hcd) {
543 		ret = -ENOMEM;
544 		goto disable_device_wakeup;
545 	}
546 
547 	ret = usb_add_hcd(hcd, irq, IRQF_SHARED);
548 	if (ret)
549 		goto put_usb3_hcd;
550 
551 	if (HCC_MAX_PSA(xhci->hcc_params) >= 4)
552 		xhci->shared_hcd->can_do_streams = 1;
553 
554 	ret = usb_add_hcd(xhci->shared_hcd, irq, IRQF_SHARED);
555 	if (ret)
556 		goto dealloc_usb2_hcd;
557 
558 	return 0;
559 
560 dealloc_usb2_hcd:
561 	usb_remove_hcd(hcd);
562 
563 put_usb3_hcd:
564 	xhci_mtk_sch_exit(mtk);
565 	usb_put_hcd(xhci->shared_hcd);
566 
567 disable_device_wakeup:
568 	device_init_wakeup(dev, false);
569 
570 put_usb2_hcd:
571 	usb_put_hcd(hcd);
572 
573 disable_clk:
574 	xhci_mtk_clks_disable(mtk);
575 
576 disable_ldos:
577 	xhci_mtk_ldos_disable(mtk);
578 
579 disable_pm:
580 	pm_runtime_put_sync(dev);
581 	pm_runtime_disable(dev);
582 	return ret;
583 }
584 
585 static int xhci_mtk_remove(struct platform_device *dev)
586 {
587 	struct xhci_hcd_mtk *mtk = platform_get_drvdata(dev);
588 	struct usb_hcd	*hcd = mtk->hcd;
589 	struct xhci_hcd	*xhci = hcd_to_xhci(hcd);
590 	struct usb_hcd  *shared_hcd = xhci->shared_hcd;
591 
592 	pm_runtime_put_noidle(&dev->dev);
593 	pm_runtime_disable(&dev->dev);
594 
595 	usb_remove_hcd(shared_hcd);
596 	xhci->shared_hcd = NULL;
597 	device_init_wakeup(&dev->dev, false);
598 
599 	usb_remove_hcd(hcd);
600 	usb_put_hcd(shared_hcd);
601 	usb_put_hcd(hcd);
602 	xhci_mtk_sch_exit(mtk);
603 	xhci_mtk_clks_disable(mtk);
604 	xhci_mtk_ldos_disable(mtk);
605 
606 	return 0;
607 }
608 
609 /*
610  * if ip sleep fails, and all clocks are disabled, access register will hang
611  * AHB bus, so stop polling roothubs to avoid regs access on bus suspend.
612  * and no need to check whether ip sleep failed or not; this will cause SPM
613  * to wake up system immediately after system suspend complete if ip sleep
614  * fails, it is what we wanted.
615  */
616 static int __maybe_unused xhci_mtk_suspend(struct device *dev)
617 {
618 	struct xhci_hcd_mtk *mtk = dev_get_drvdata(dev);
619 	struct usb_hcd *hcd = mtk->hcd;
620 	struct xhci_hcd *xhci = hcd_to_xhci(hcd);
621 
622 	xhci_dbg(xhci, "%s: stop port polling\n", __func__);
623 	clear_bit(HCD_FLAG_POLL_RH, &hcd->flags);
624 	del_timer_sync(&hcd->rh_timer);
625 	clear_bit(HCD_FLAG_POLL_RH, &xhci->shared_hcd->flags);
626 	del_timer_sync(&xhci->shared_hcd->rh_timer);
627 
628 	xhci_mtk_host_disable(mtk);
629 	xhci_mtk_clks_disable(mtk);
630 	usb_wakeup_set(mtk, true);
631 	return 0;
632 }
633 
634 static int __maybe_unused xhci_mtk_resume(struct device *dev)
635 {
636 	struct xhci_hcd_mtk *mtk = dev_get_drvdata(dev);
637 	struct usb_hcd *hcd = mtk->hcd;
638 	struct xhci_hcd *xhci = hcd_to_xhci(hcd);
639 
640 	usb_wakeup_set(mtk, false);
641 	xhci_mtk_clks_enable(mtk);
642 	xhci_mtk_host_enable(mtk);
643 
644 	xhci_dbg(xhci, "%s: restart port polling\n", __func__);
645 	set_bit(HCD_FLAG_POLL_RH, &xhci->shared_hcd->flags);
646 	usb_hcd_poll_rh_status(xhci->shared_hcd);
647 	set_bit(HCD_FLAG_POLL_RH, &hcd->flags);
648 	usb_hcd_poll_rh_status(hcd);
649 	return 0;
650 }
651 
652 static const struct dev_pm_ops xhci_mtk_pm_ops = {
653 	SET_SYSTEM_SLEEP_PM_OPS(xhci_mtk_suspend, xhci_mtk_resume)
654 };
655 #define DEV_PM_OPS IS_ENABLED(CONFIG_PM) ? &xhci_mtk_pm_ops : NULL
656 
657 #ifdef CONFIG_OF
658 static const struct of_device_id mtk_xhci_of_match[] = {
659 	{ .compatible = "mediatek,mt8173-xhci"},
660 	{ .compatible = "mediatek,mtk-xhci"},
661 	{ },
662 };
663 MODULE_DEVICE_TABLE(of, mtk_xhci_of_match);
664 #endif
665 
666 static struct platform_driver mtk_xhci_driver = {
667 	.probe	= xhci_mtk_probe,
668 	.remove	= xhci_mtk_remove,
669 	.driver	= {
670 		.name = "xhci-mtk",
671 		.pm = DEV_PM_OPS,
672 		.of_match_table = of_match_ptr(mtk_xhci_of_match),
673 	},
674 };
675 MODULE_ALIAS("platform:xhci-mtk");
676 
677 static int __init xhci_mtk_init(void)
678 {
679 	xhci_init_driver(&xhci_mtk_hc_driver, &xhci_mtk_overrides);
680 	return platform_driver_register(&mtk_xhci_driver);
681 }
682 module_init(xhci_mtk_init);
683 
684 static void __exit xhci_mtk_exit(void)
685 {
686 	platform_driver_unregister(&mtk_xhci_driver);
687 }
688 module_exit(xhci_mtk_exit);
689 
690 MODULE_AUTHOR("Chunfeng Yun <chunfeng.yun@mediatek.com>");
691 MODULE_DESCRIPTION("MediaTek xHCI Host Controller Driver");
692 MODULE_LICENSE("GPL v2");
693