xref: /linux/drivers/usb/host/xhci-mtk.c (revision c9f289701540baeef9ac7c9977d67a7259f404db)
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_disabed = 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_disabed++;
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_disabed)
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 };
351 
352 static struct hc_driver __read_mostly xhci_mtk_hc_driver;
353 
354 static int xhci_mtk_ldos_enable(struct xhci_hcd_mtk *mtk)
355 {
356 	int ret;
357 
358 	ret = regulator_enable(mtk->vbus);
359 	if (ret) {
360 		dev_err(mtk->dev, "failed to enable vbus\n");
361 		return ret;
362 	}
363 
364 	ret = regulator_enable(mtk->vusb33);
365 	if (ret) {
366 		dev_err(mtk->dev, "failed to enable vusb33\n");
367 		regulator_disable(mtk->vbus);
368 		return ret;
369 	}
370 	return 0;
371 }
372 
373 static void xhci_mtk_ldos_disable(struct xhci_hcd_mtk *mtk)
374 {
375 	regulator_disable(mtk->vbus);
376 	regulator_disable(mtk->vusb33);
377 }
378 
379 static void xhci_mtk_quirks(struct device *dev, struct xhci_hcd *xhci)
380 {
381 	struct usb_hcd *hcd = xhci_to_hcd(xhci);
382 	struct xhci_hcd_mtk *mtk = hcd_to_mtk(hcd);
383 
384 	/*
385 	 * As of now platform drivers don't provide MSI support so we ensure
386 	 * here that the generic code does not try to make a pci_dev from our
387 	 * dev struct in order to setup MSI
388 	 */
389 	xhci->quirks |= XHCI_PLAT;
390 	xhci->quirks |= XHCI_MTK_HOST;
391 	/*
392 	 * MTK host controller gives a spurious successful event after a
393 	 * short transfer. Ignore it.
394 	 */
395 	xhci->quirks |= XHCI_SPURIOUS_SUCCESS;
396 	if (mtk->lpm_support)
397 		xhci->quirks |= XHCI_LPM_SUPPORT;
398 }
399 
400 /* called during probe() after chip reset completes */
401 static int xhci_mtk_setup(struct usb_hcd *hcd)
402 {
403 	struct xhci_hcd_mtk *mtk = hcd_to_mtk(hcd);
404 	int ret;
405 
406 	if (usb_hcd_is_primary_hcd(hcd)) {
407 		ret = xhci_mtk_ssusb_config(mtk);
408 		if (ret)
409 			return ret;
410 	}
411 
412 	ret = xhci_gen_setup(hcd, xhci_mtk_quirks);
413 	if (ret)
414 		return ret;
415 
416 	if (usb_hcd_is_primary_hcd(hcd)) {
417 		ret = xhci_mtk_sch_init(mtk);
418 		if (ret)
419 			return ret;
420 	}
421 
422 	return ret;
423 }
424 
425 static int xhci_mtk_probe(struct platform_device *pdev)
426 {
427 	struct device *dev = &pdev->dev;
428 	struct device_node *node = dev->of_node;
429 	struct xhci_hcd_mtk *mtk;
430 	const struct hc_driver *driver;
431 	struct xhci_hcd *xhci;
432 	struct resource *res;
433 	struct usb_hcd *hcd;
434 	int ret = -ENODEV;
435 	int irq;
436 
437 	if (usb_disabled())
438 		return -ENODEV;
439 
440 	driver = &xhci_mtk_hc_driver;
441 	mtk = devm_kzalloc(dev, sizeof(*mtk), GFP_KERNEL);
442 	if (!mtk)
443 		return -ENOMEM;
444 
445 	mtk->dev = dev;
446 	mtk->vbus = devm_regulator_get(dev, "vbus");
447 	if (IS_ERR(mtk->vbus)) {
448 		dev_err(dev, "fail to get vbus\n");
449 		return PTR_ERR(mtk->vbus);
450 	}
451 
452 	mtk->vusb33 = devm_regulator_get(dev, "vusb33");
453 	if (IS_ERR(mtk->vusb33)) {
454 		dev_err(dev, "fail to get vusb33\n");
455 		return PTR_ERR(mtk->vusb33);
456 	}
457 
458 	ret = xhci_mtk_clks_get(mtk);
459 	if (ret)
460 		return ret;
461 
462 	mtk->lpm_support = of_property_read_bool(node, "usb3-lpm-capable");
463 	/* optional property, ignore the error if it does not exist */
464 	of_property_read_u32(node, "mediatek,u3p-dis-msk",
465 			     &mtk->u3p_dis_msk);
466 
467 	ret = usb_wakeup_of_property_parse(mtk, node);
468 	if (ret) {
469 		dev_err(dev, "failed to parse uwk property\n");
470 		return ret;
471 	}
472 
473 	pm_runtime_enable(dev);
474 	pm_runtime_get_sync(dev);
475 	device_enable_async_suspend(dev);
476 
477 	ret = xhci_mtk_ldos_enable(mtk);
478 	if (ret)
479 		goto disable_pm;
480 
481 	ret = xhci_mtk_clks_enable(mtk);
482 	if (ret)
483 		goto disable_ldos;
484 
485 	irq = platform_get_irq(pdev, 0);
486 	if (irq < 0) {
487 		ret = irq;
488 		goto disable_clk;
489 	}
490 
491 	hcd = usb_create_hcd(driver, dev, dev_name(dev));
492 	if (!hcd) {
493 		ret = -ENOMEM;
494 		goto disable_clk;
495 	}
496 
497 	/*
498 	 * USB 2.0 roothub is stored in the platform_device.
499 	 * Swap it with mtk HCD.
500 	 */
501 	mtk->hcd = platform_get_drvdata(pdev);
502 	platform_set_drvdata(pdev, mtk);
503 
504 	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "mac");
505 	hcd->regs = devm_ioremap_resource(dev, res);
506 	if (IS_ERR(hcd->regs)) {
507 		ret = PTR_ERR(hcd->regs);
508 		goto put_usb2_hcd;
509 	}
510 	hcd->rsrc_start = res->start;
511 	hcd->rsrc_len = resource_size(res);
512 
513 	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "ippc");
514 	if (res) {	/* ippc register is optional */
515 		mtk->ippc_regs = devm_ioremap_resource(dev, res);
516 		if (IS_ERR(mtk->ippc_regs)) {
517 			ret = PTR_ERR(mtk->ippc_regs);
518 			goto put_usb2_hcd;
519 		}
520 		mtk->has_ippc = true;
521 	} else {
522 		mtk->has_ippc = false;
523 	}
524 
525 	device_init_wakeup(dev, true);
526 
527 	xhci = hcd_to_xhci(hcd);
528 	xhci->main_hcd = hcd;
529 
530 	/*
531 	 * imod_interval is the interrupt moderation value in nanoseconds.
532 	 * The increment interval is 8 times as much as that defined in
533 	 * the xHCI spec on MTK's controller.
534 	 */
535 	xhci->imod_interval = 5000;
536 	device_property_read_u32(dev, "imod-interval-ns", &xhci->imod_interval);
537 
538 	xhci->shared_hcd = usb_create_shared_hcd(driver, dev,
539 			dev_name(dev), hcd);
540 	if (!xhci->shared_hcd) {
541 		ret = -ENOMEM;
542 		goto disable_device_wakeup;
543 	}
544 
545 	ret = usb_add_hcd(hcd, irq, IRQF_SHARED);
546 	if (ret)
547 		goto put_usb3_hcd;
548 
549 	if (HCC_MAX_PSA(xhci->hcc_params) >= 4)
550 		xhci->shared_hcd->can_do_streams = 1;
551 
552 	ret = usb_add_hcd(xhci->shared_hcd, irq, IRQF_SHARED);
553 	if (ret)
554 		goto dealloc_usb2_hcd;
555 
556 	return 0;
557 
558 dealloc_usb2_hcd:
559 	usb_remove_hcd(hcd);
560 
561 put_usb3_hcd:
562 	xhci_mtk_sch_exit(mtk);
563 	usb_put_hcd(xhci->shared_hcd);
564 
565 disable_device_wakeup:
566 	device_init_wakeup(dev, false);
567 
568 put_usb2_hcd:
569 	usb_put_hcd(hcd);
570 
571 disable_clk:
572 	xhci_mtk_clks_disable(mtk);
573 
574 disable_ldos:
575 	xhci_mtk_ldos_disable(mtk);
576 
577 disable_pm:
578 	pm_runtime_put_sync(dev);
579 	pm_runtime_disable(dev);
580 	return ret;
581 }
582 
583 static int xhci_mtk_remove(struct platform_device *dev)
584 {
585 	struct xhci_hcd_mtk *mtk = platform_get_drvdata(dev);
586 	struct usb_hcd	*hcd = mtk->hcd;
587 	struct xhci_hcd	*xhci = hcd_to_xhci(hcd);
588 	struct usb_hcd  *shared_hcd = xhci->shared_hcd;
589 
590 	usb_remove_hcd(shared_hcd);
591 	xhci->shared_hcd = NULL;
592 	device_init_wakeup(&dev->dev, false);
593 
594 	usb_remove_hcd(hcd);
595 	usb_put_hcd(shared_hcd);
596 	usb_put_hcd(hcd);
597 	xhci_mtk_sch_exit(mtk);
598 	xhci_mtk_clks_disable(mtk);
599 	xhci_mtk_ldos_disable(mtk);
600 	pm_runtime_put_sync(&dev->dev);
601 	pm_runtime_disable(&dev->dev);
602 
603 	return 0;
604 }
605 
606 /*
607  * if ip sleep fails, and all clocks are disabled, access register will hang
608  * AHB bus, so stop polling roothubs to avoid regs access on bus suspend.
609  * and no need to check whether ip sleep failed or not; this will cause SPM
610  * to wake up system immediately after system suspend complete if ip sleep
611  * fails, it is what we wanted.
612  */
613 static int __maybe_unused xhci_mtk_suspend(struct device *dev)
614 {
615 	struct xhci_hcd_mtk *mtk = dev_get_drvdata(dev);
616 	struct usb_hcd *hcd = mtk->hcd;
617 	struct xhci_hcd *xhci = hcd_to_xhci(hcd);
618 
619 	xhci_dbg(xhci, "%s: stop port polling\n", __func__);
620 	clear_bit(HCD_FLAG_POLL_RH, &hcd->flags);
621 	del_timer_sync(&hcd->rh_timer);
622 	clear_bit(HCD_FLAG_POLL_RH, &xhci->shared_hcd->flags);
623 	del_timer_sync(&xhci->shared_hcd->rh_timer);
624 
625 	xhci_mtk_host_disable(mtk);
626 	xhci_mtk_clks_disable(mtk);
627 	usb_wakeup_set(mtk, true);
628 	return 0;
629 }
630 
631 static int __maybe_unused xhci_mtk_resume(struct device *dev)
632 {
633 	struct xhci_hcd_mtk *mtk = dev_get_drvdata(dev);
634 	struct usb_hcd *hcd = mtk->hcd;
635 	struct xhci_hcd *xhci = hcd_to_xhci(hcd);
636 
637 	usb_wakeup_set(mtk, false);
638 	xhci_mtk_clks_enable(mtk);
639 	xhci_mtk_host_enable(mtk);
640 
641 	xhci_dbg(xhci, "%s: restart port polling\n", __func__);
642 	set_bit(HCD_FLAG_POLL_RH, &xhci->shared_hcd->flags);
643 	usb_hcd_poll_rh_status(xhci->shared_hcd);
644 	set_bit(HCD_FLAG_POLL_RH, &hcd->flags);
645 	usb_hcd_poll_rh_status(hcd);
646 	return 0;
647 }
648 
649 static const struct dev_pm_ops xhci_mtk_pm_ops = {
650 	SET_SYSTEM_SLEEP_PM_OPS(xhci_mtk_suspend, xhci_mtk_resume)
651 };
652 #define DEV_PM_OPS IS_ENABLED(CONFIG_PM) ? &xhci_mtk_pm_ops : NULL
653 
654 #ifdef CONFIG_OF
655 static const struct of_device_id mtk_xhci_of_match[] = {
656 	{ .compatible = "mediatek,mt8173-xhci"},
657 	{ .compatible = "mediatek,mtk-xhci"},
658 	{ },
659 };
660 MODULE_DEVICE_TABLE(of, mtk_xhci_of_match);
661 #endif
662 
663 static struct platform_driver mtk_xhci_driver = {
664 	.probe	= xhci_mtk_probe,
665 	.remove	= xhci_mtk_remove,
666 	.driver	= {
667 		.name = "xhci-mtk",
668 		.pm = DEV_PM_OPS,
669 		.of_match_table = of_match_ptr(mtk_xhci_of_match),
670 	},
671 };
672 MODULE_ALIAS("platform:xhci-mtk");
673 
674 static int __init xhci_mtk_init(void)
675 {
676 	xhci_init_driver(&xhci_mtk_hc_driver, &xhci_mtk_overrides);
677 	return platform_driver_register(&mtk_xhci_driver);
678 }
679 module_init(xhci_mtk_init);
680 
681 static void __exit xhci_mtk_exit(void)
682 {
683 	platform_driver_unregister(&mtk_xhci_driver);
684 }
685 module_exit(xhci_mtk_exit);
686 
687 MODULE_AUTHOR("Chunfeng Yun <chunfeng.yun@mediatek.com>");
688 MODULE_DESCRIPTION("MediaTek xHCI Host Controller Driver");
689 MODULE_LICENSE("GPL v2");
690