cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

xhci-mtk.c (20991B)


      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/dma-mapping.h>
     11#include <linux/iopoll.h>
     12#include <linux/kernel.h>
     13#include <linux/mfd/syscon.h>
     14#include <linux/module.h>
     15#include <linux/of.h>
     16#include <linux/platform_device.h>
     17#include <linux/pm_runtime.h>
     18#include <linux/pm_wakeirq.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/* xHCI CSR */
     60#define LS_EOF_CFG		0x930
     61#define LSEOF_OFFSET		0x89
     62
     63#define FS_EOF_CFG		0x934
     64#define FSEOF_OFFSET		0x2e
     65
     66#define SS_GEN1_EOF_CFG		0x93c
     67#define SSG1EOF_OFFSET		0x78
     68
     69#define HFCNTR_CFG		0x944
     70#define ITP_DELTA_CLK		(0xa << 1)
     71#define ITP_DELTA_CLK_MASK	GENMASK(5, 1)
     72#define FRMCNT_LEV1_RANG	(0x12b << 8)
     73#define FRMCNT_LEV1_RANG_MASK	GENMASK(19, 8)
     74
     75#define SS_GEN2_EOF_CFG		0x990
     76#define SSG2EOF_OFFSET		0x3c
     77
     78#define XSEOF_OFFSET_MASK	GENMASK(11, 0)
     79
     80/* usb remote wakeup registers in syscon */
     81
     82/* mt8173 etc */
     83#define PERI_WK_CTRL1	0x4
     84#define WC1_IS_C(x)	(((x) & 0xf) << 26)  /* cycle debounce */
     85#define WC1_IS_EN	BIT(25)
     86#define WC1_IS_P	BIT(6)  /* polarity for ip sleep */
     87
     88/* mt8183 */
     89#define PERI_WK_CTRL0	0x0
     90#define WC0_IS_C(x)	((u32)(((x) & 0xf) << 28))  /* cycle debounce */
     91#define WC0_IS_P	BIT(12)	/* polarity */
     92#define WC0_IS_EN	BIT(6)
     93
     94/* mt8192 */
     95#define WC0_SSUSB0_CDEN		BIT(6)
     96#define WC0_IS_SPM_EN		BIT(1)
     97
     98/* mt8195 */
     99#define PERI_WK_CTRL0_8195	0x04
    100#define WC0_IS_P_95		BIT(30)	/* polarity */
    101#define WC0_IS_C_95(x)		((u32)(((x) & 0x7) << 27))
    102#define WC0_IS_EN_P3_95		BIT(26)
    103#define WC0_IS_EN_P2_95		BIT(25)
    104#define WC0_IS_EN_P1_95		BIT(24)
    105
    106#define PERI_WK_CTRL1_8195	0x20
    107#define WC1_IS_C_95(x)		((u32)(((x) & 0xf) << 28))
    108#define WC1_IS_P_95		BIT(12)
    109#define WC1_IS_EN_P0_95		BIT(6)
    110
    111/* mt2712 etc */
    112#define PERI_SSUSB_SPM_CTRL	0x0
    113#define SSC_IP_SLEEP_EN	BIT(4)
    114#define SSC_SPM_INT_EN		BIT(1)
    115
    116enum ssusb_uwk_vers {
    117	SSUSB_UWK_V1 = 1,
    118	SSUSB_UWK_V2,
    119	SSUSB_UWK_V1_1 = 101,	/* specific revision 1.01 */
    120	SSUSB_UWK_V1_2,		/* specific revision 1.2 */
    121	SSUSB_UWK_V1_3,		/* mt8195 IP0 */
    122	SSUSB_UWK_V1_4,		/* mt8195 IP1 */
    123	SSUSB_UWK_V1_5,		/* mt8195 IP2 */
    124	SSUSB_UWK_V1_6,		/* mt8195 IP3 */
    125};
    126
    127/*
    128 * MT8195 has 4 controllers, the controller1~3's default SOF/ITP interval
    129 * is calculated from the frame counter clock 24M, but in fact, the clock
    130 * is 48M, add workaround for it.
    131 */
    132static void xhci_mtk_set_frame_interval(struct xhci_hcd_mtk *mtk)
    133{
    134	struct device *dev = mtk->dev;
    135	struct usb_hcd *hcd = mtk->hcd;
    136	u32 value;
    137
    138	if (!of_device_is_compatible(dev->of_node, "mediatek,mt8195-xhci"))
    139		return;
    140
    141	value = readl(hcd->regs + HFCNTR_CFG);
    142	value &= ~(ITP_DELTA_CLK_MASK | FRMCNT_LEV1_RANG_MASK);
    143	value |= (ITP_DELTA_CLK | FRMCNT_LEV1_RANG);
    144	writel(value, hcd->regs + HFCNTR_CFG);
    145
    146	value = readl(hcd->regs + LS_EOF_CFG);
    147	value &= ~XSEOF_OFFSET_MASK;
    148	value |= LSEOF_OFFSET;
    149	writel(value, hcd->regs + LS_EOF_CFG);
    150
    151	value = readl(hcd->regs + FS_EOF_CFG);
    152	value &= ~XSEOF_OFFSET_MASK;
    153	value |= FSEOF_OFFSET;
    154	writel(value, hcd->regs + FS_EOF_CFG);
    155
    156	value = readl(hcd->regs + SS_GEN1_EOF_CFG);
    157	value &= ~XSEOF_OFFSET_MASK;
    158	value |= SSG1EOF_OFFSET;
    159	writel(value, hcd->regs + SS_GEN1_EOF_CFG);
    160
    161	value = readl(hcd->regs + SS_GEN2_EOF_CFG);
    162	value &= ~XSEOF_OFFSET_MASK;
    163	value |= SSG2EOF_OFFSET;
    164	writel(value, hcd->regs + SS_GEN2_EOF_CFG);
    165}
    166
    167static int xhci_mtk_host_enable(struct xhci_hcd_mtk *mtk)
    168{
    169	struct mu3c_ippc_regs __iomem *ippc = mtk->ippc_regs;
    170	u32 value, check_val;
    171	int u3_ports_disabled = 0;
    172	int ret;
    173	int i;
    174
    175	if (!mtk->has_ippc)
    176		return 0;
    177
    178	/* power on host ip */
    179	value = readl(&ippc->ip_pw_ctr1);
    180	value &= ~CTRL1_IP_HOST_PDN;
    181	writel(value, &ippc->ip_pw_ctr1);
    182
    183	/* power on and enable u3 ports except skipped ones */
    184	for (i = 0; i < mtk->num_u3_ports; i++) {
    185		if ((0x1 << i) & mtk->u3p_dis_msk) {
    186			u3_ports_disabled++;
    187			continue;
    188		}
    189
    190		value = readl(&ippc->u3_ctrl_p[i]);
    191		value &= ~(CTRL_U3_PORT_PDN | CTRL_U3_PORT_DIS);
    192		value |= CTRL_U3_PORT_HOST_SEL;
    193		writel(value, &ippc->u3_ctrl_p[i]);
    194	}
    195
    196	/* power on and enable all u2 ports except skipped ones */
    197	for (i = 0; i < mtk->num_u2_ports; i++) {
    198		if (BIT(i) & mtk->u2p_dis_msk)
    199			continue;
    200
    201		value = readl(&ippc->u2_ctrl_p[i]);
    202		value &= ~(CTRL_U2_PORT_PDN | CTRL_U2_PORT_DIS);
    203		value |= CTRL_U2_PORT_HOST_SEL;
    204		writel(value, &ippc->u2_ctrl_p[i]);
    205	}
    206
    207	/*
    208	 * wait for clocks to be stable, and clock domains reset to
    209	 * be inactive after power on and enable ports
    210	 */
    211	check_val = STS1_SYSPLL_STABLE | STS1_REF_RST |
    212			STS1_SYS125_RST | STS1_XHCI_RST;
    213
    214	if (mtk->num_u3_ports > u3_ports_disabled)
    215		check_val |= STS1_U3_MAC_RST;
    216
    217	ret = readl_poll_timeout(&ippc->ip_pw_sts1, value,
    218			  (check_val == (value & check_val)), 100, 20000);
    219	if (ret) {
    220		dev_err(mtk->dev, "clocks are not stable (0x%x)\n", value);
    221		return ret;
    222	}
    223
    224	return 0;
    225}
    226
    227static int xhci_mtk_host_disable(struct xhci_hcd_mtk *mtk)
    228{
    229	struct mu3c_ippc_regs __iomem *ippc = mtk->ippc_regs;
    230	u32 value;
    231	int ret;
    232	int i;
    233
    234	if (!mtk->has_ippc)
    235		return 0;
    236
    237	/* power down u3 ports except skipped ones */
    238	for (i = 0; i < mtk->num_u3_ports; i++) {
    239		if ((0x1 << i) & mtk->u3p_dis_msk)
    240			continue;
    241
    242		value = readl(&ippc->u3_ctrl_p[i]);
    243		value |= CTRL_U3_PORT_PDN;
    244		writel(value, &ippc->u3_ctrl_p[i]);
    245	}
    246
    247	/* power down all u2 ports except skipped ones */
    248	for (i = 0; i < mtk->num_u2_ports; i++) {
    249		if (BIT(i) & mtk->u2p_dis_msk)
    250			continue;
    251
    252		value = readl(&ippc->u2_ctrl_p[i]);
    253		value |= CTRL_U2_PORT_PDN;
    254		writel(value, &ippc->u2_ctrl_p[i]);
    255	}
    256
    257	/* power down host ip */
    258	value = readl(&ippc->ip_pw_ctr1);
    259	value |= CTRL1_IP_HOST_PDN;
    260	writel(value, &ippc->ip_pw_ctr1);
    261
    262	/* wait for host ip to sleep */
    263	ret = readl_poll_timeout(&ippc->ip_pw_sts1, value,
    264			  (value & STS1_IP_SLEEP_STS), 100, 100000);
    265	if (ret)
    266		dev_err(mtk->dev, "ip sleep failed!!!\n");
    267	else /* workaound for platforms using low level latch */
    268		usleep_range(100, 200);
    269
    270	return ret;
    271}
    272
    273static int xhci_mtk_ssusb_config(struct xhci_hcd_mtk *mtk)
    274{
    275	struct mu3c_ippc_regs __iomem *ippc = mtk->ippc_regs;
    276	u32 value;
    277
    278	if (!mtk->has_ippc)
    279		return 0;
    280
    281	/* reset whole ip */
    282	value = readl(&ippc->ip_pw_ctr0);
    283	value |= CTRL0_IP_SW_RST;
    284	writel(value, &ippc->ip_pw_ctr0);
    285	udelay(1);
    286	value = readl(&ippc->ip_pw_ctr0);
    287	value &= ~CTRL0_IP_SW_RST;
    288	writel(value, &ippc->ip_pw_ctr0);
    289
    290	/*
    291	 * device ip is default power-on in fact
    292	 * power down device ip, otherwise ip-sleep will fail
    293	 */
    294	value = readl(&ippc->ip_pw_ctr2);
    295	value |= CTRL2_IP_DEV_PDN;
    296	writel(value, &ippc->ip_pw_ctr2);
    297
    298	value = readl(&ippc->ip_xhci_cap);
    299	mtk->num_u3_ports = CAP_U3_PORT_NUM(value);
    300	mtk->num_u2_ports = CAP_U2_PORT_NUM(value);
    301	dev_dbg(mtk->dev, "%s u2p:%d, u3p:%d\n", __func__,
    302			mtk->num_u2_ports, mtk->num_u3_ports);
    303
    304	return xhci_mtk_host_enable(mtk);
    305}
    306
    307/* only clocks can be turn off for ip-sleep wakeup mode */
    308static void usb_wakeup_ip_sleep_set(struct xhci_hcd_mtk *mtk, bool enable)
    309{
    310	u32 reg, msk, val;
    311
    312	switch (mtk->uwk_vers) {
    313	case SSUSB_UWK_V1:
    314		reg = mtk->uwk_reg_base + PERI_WK_CTRL1;
    315		msk = WC1_IS_EN | WC1_IS_C(0xf) | WC1_IS_P;
    316		val = enable ? (WC1_IS_EN | WC1_IS_C(0x8)) : 0;
    317		break;
    318	case SSUSB_UWK_V1_1:
    319		reg = mtk->uwk_reg_base + PERI_WK_CTRL0;
    320		msk = WC0_IS_EN | WC0_IS_C(0xf) | WC0_IS_P;
    321		val = enable ? (WC0_IS_EN | WC0_IS_C(0x1)) : 0;
    322		break;
    323	case SSUSB_UWK_V1_2:
    324		reg = mtk->uwk_reg_base + PERI_WK_CTRL0;
    325		msk = WC0_SSUSB0_CDEN | WC0_IS_SPM_EN;
    326		val = enable ? msk : 0;
    327		break;
    328	case SSUSB_UWK_V1_3:
    329		reg = mtk->uwk_reg_base + PERI_WK_CTRL1_8195;
    330		msk = WC1_IS_EN_P0_95 | WC1_IS_C_95(0xf) | WC1_IS_P_95;
    331		val = enable ? (WC1_IS_EN_P0_95 | WC1_IS_C_95(0x1)) : 0;
    332		break;
    333	case SSUSB_UWK_V1_4:
    334		reg = mtk->uwk_reg_base + PERI_WK_CTRL0_8195;
    335		msk = WC0_IS_EN_P1_95 | WC0_IS_C_95(0x7) | WC0_IS_P_95;
    336		val = enable ? (WC0_IS_EN_P1_95 | WC0_IS_C_95(0x1)) : 0;
    337		break;
    338	case SSUSB_UWK_V1_5:
    339		reg = mtk->uwk_reg_base + PERI_WK_CTRL0_8195;
    340		msk = WC0_IS_EN_P2_95 | WC0_IS_C_95(0x7) | WC0_IS_P_95;
    341		val = enable ? (WC0_IS_EN_P2_95 | WC0_IS_C_95(0x1)) : 0;
    342		break;
    343	case SSUSB_UWK_V1_6:
    344		reg = mtk->uwk_reg_base + PERI_WK_CTRL0_8195;
    345		msk = WC0_IS_EN_P3_95 | WC0_IS_C_95(0x7) | WC0_IS_P_95;
    346		val = enable ? (WC0_IS_EN_P3_95 | WC0_IS_C_95(0x1)) : 0;
    347		break;
    348	case SSUSB_UWK_V2:
    349		reg = mtk->uwk_reg_base + PERI_SSUSB_SPM_CTRL;
    350		msk = SSC_IP_SLEEP_EN | SSC_SPM_INT_EN;
    351		val = enable ? msk : 0;
    352		break;
    353	default:
    354		return;
    355	}
    356	regmap_update_bits(mtk->uwk, reg, msk, val);
    357}
    358
    359static int usb_wakeup_of_property_parse(struct xhci_hcd_mtk *mtk,
    360				struct device_node *dn)
    361{
    362	struct of_phandle_args args;
    363	int ret;
    364
    365	/* Wakeup function is optional */
    366	mtk->uwk_en = of_property_read_bool(dn, "wakeup-source");
    367	if (!mtk->uwk_en)
    368		return 0;
    369
    370	ret = of_parse_phandle_with_fixed_args(dn,
    371				"mediatek,syscon-wakeup", 2, 0, &args);
    372	if (ret)
    373		return ret;
    374
    375	mtk->uwk_reg_base = args.args[0];
    376	mtk->uwk_vers = args.args[1];
    377	mtk->uwk = syscon_node_to_regmap(args.np);
    378	of_node_put(args.np);
    379	dev_info(mtk->dev, "uwk - reg:0x%x, version:%d\n",
    380			mtk->uwk_reg_base, mtk->uwk_vers);
    381
    382	return PTR_ERR_OR_ZERO(mtk->uwk);
    383}
    384
    385static void usb_wakeup_set(struct xhci_hcd_mtk *mtk, bool enable)
    386{
    387	if (mtk->uwk_en)
    388		usb_wakeup_ip_sleep_set(mtk, enable);
    389}
    390
    391static int xhci_mtk_clks_get(struct xhci_hcd_mtk *mtk)
    392{
    393	struct clk_bulk_data *clks = mtk->clks;
    394
    395	clks[0].id = "sys_ck";
    396	clks[1].id = "xhci_ck";
    397	clks[2].id = "ref_ck";
    398	clks[3].id = "mcu_ck";
    399	clks[4].id = "dma_ck";
    400
    401	return devm_clk_bulk_get_optional(mtk->dev, BULK_CLKS_NUM, clks);
    402}
    403
    404static int xhci_mtk_vregs_get(struct xhci_hcd_mtk *mtk)
    405{
    406	struct regulator_bulk_data *supplies = mtk->supplies;
    407
    408	supplies[0].supply = "vbus";
    409	supplies[1].supply = "vusb33";
    410
    411	return devm_regulator_bulk_get(mtk->dev, BULK_VREGS_NUM, supplies);
    412}
    413
    414static void xhci_mtk_quirks(struct device *dev, struct xhci_hcd *xhci)
    415{
    416	struct usb_hcd *hcd = xhci_to_hcd(xhci);
    417	struct xhci_hcd_mtk *mtk = hcd_to_mtk(hcd);
    418
    419	/*
    420	 * As of now platform drivers don't provide MSI support so we ensure
    421	 * here that the generic code does not try to make a pci_dev from our
    422	 * dev struct in order to setup MSI
    423	 */
    424	xhci->quirks |= XHCI_PLAT;
    425	xhci->quirks |= XHCI_MTK_HOST;
    426	/*
    427	 * MTK host controller gives a spurious successful event after a
    428	 * short transfer. Ignore it.
    429	 */
    430	xhci->quirks |= XHCI_SPURIOUS_SUCCESS;
    431	if (mtk->lpm_support)
    432		xhci->quirks |= XHCI_LPM_SUPPORT;
    433	if (mtk->u2_lpm_disable)
    434		xhci->quirks |= XHCI_HW_LPM_DISABLE;
    435
    436	/*
    437	 * MTK xHCI 0.96: PSA is 1 by default even if doesn't support stream,
    438	 * and it's 3 when support it.
    439	 */
    440	if (xhci->hci_version < 0x100 && HCC_MAX_PSA(xhci->hcc_params) == 4)
    441		xhci->quirks |= XHCI_BROKEN_STREAMS;
    442}
    443
    444/* called during probe() after chip reset completes */
    445static int xhci_mtk_setup(struct usb_hcd *hcd)
    446{
    447	struct xhci_hcd_mtk *mtk = hcd_to_mtk(hcd);
    448	int ret;
    449
    450	if (usb_hcd_is_primary_hcd(hcd)) {
    451		ret = xhci_mtk_ssusb_config(mtk);
    452		if (ret)
    453			return ret;
    454
    455		/* workaround only for mt8195 */
    456		xhci_mtk_set_frame_interval(mtk);
    457	}
    458
    459	ret = xhci_gen_setup(hcd, xhci_mtk_quirks);
    460	if (ret)
    461		return ret;
    462
    463	if (usb_hcd_is_primary_hcd(hcd))
    464		ret = xhci_mtk_sch_init(mtk);
    465
    466	return ret;
    467}
    468
    469static const struct xhci_driver_overrides xhci_mtk_overrides __initconst = {
    470	.reset = xhci_mtk_setup,
    471	.add_endpoint = xhci_mtk_add_ep,
    472	.drop_endpoint = xhci_mtk_drop_ep,
    473	.check_bandwidth = xhci_mtk_check_bandwidth,
    474	.reset_bandwidth = xhci_mtk_reset_bandwidth,
    475};
    476
    477static struct hc_driver __read_mostly xhci_mtk_hc_driver;
    478
    479static int xhci_mtk_probe(struct platform_device *pdev)
    480{
    481	struct device *dev = &pdev->dev;
    482	struct device_node *node = dev->of_node;
    483	struct xhci_hcd_mtk *mtk;
    484	const struct hc_driver *driver;
    485	struct xhci_hcd *xhci;
    486	struct resource *res;
    487	struct usb_hcd *hcd;
    488	int ret = -ENODEV;
    489	int wakeup_irq;
    490	int irq;
    491
    492	if (usb_disabled())
    493		return -ENODEV;
    494
    495	driver = &xhci_mtk_hc_driver;
    496	mtk = devm_kzalloc(dev, sizeof(*mtk), GFP_KERNEL);
    497	if (!mtk)
    498		return -ENOMEM;
    499
    500	mtk->dev = dev;
    501
    502	ret = xhci_mtk_vregs_get(mtk);
    503	if (ret)
    504		return dev_err_probe(dev, ret, "Failed to get regulators\n");
    505
    506	ret = xhci_mtk_clks_get(mtk);
    507	if (ret)
    508		return ret;
    509
    510	irq = platform_get_irq_byname_optional(pdev, "host");
    511	if (irq < 0) {
    512		if (irq == -EPROBE_DEFER)
    513			return irq;
    514
    515		/* for backward compatibility */
    516		irq = platform_get_irq(pdev, 0);
    517		if (irq < 0)
    518			return irq;
    519	}
    520
    521	wakeup_irq = platform_get_irq_byname_optional(pdev, "wakeup");
    522	if (wakeup_irq == -EPROBE_DEFER)
    523		return wakeup_irq;
    524
    525	mtk->lpm_support = of_property_read_bool(node, "usb3-lpm-capable");
    526	mtk->u2_lpm_disable = of_property_read_bool(node, "usb2-lpm-disable");
    527	/* optional property, ignore the error if it does not exist */
    528	of_property_read_u32(node, "mediatek,u3p-dis-msk",
    529			     &mtk->u3p_dis_msk);
    530	of_property_read_u32(node, "mediatek,u2p-dis-msk",
    531			     &mtk->u2p_dis_msk);
    532
    533	ret = usb_wakeup_of_property_parse(mtk, node);
    534	if (ret) {
    535		dev_err(dev, "failed to parse uwk property\n");
    536		return ret;
    537	}
    538
    539	pm_runtime_set_active(dev);
    540	pm_runtime_use_autosuspend(dev);
    541	pm_runtime_set_autosuspend_delay(dev, 4000);
    542	pm_runtime_enable(dev);
    543	pm_runtime_get_sync(dev);
    544
    545	ret = regulator_bulk_enable(BULK_VREGS_NUM, mtk->supplies);
    546	if (ret)
    547		goto disable_pm;
    548
    549	ret = clk_bulk_prepare_enable(BULK_CLKS_NUM, mtk->clks);
    550	if (ret)
    551		goto disable_ldos;
    552
    553	hcd = usb_create_hcd(driver, dev, dev_name(dev));
    554	if (!hcd) {
    555		ret = -ENOMEM;
    556		goto disable_clk;
    557	}
    558
    559	/*
    560	 * USB 2.0 roothub is stored in the platform_device.
    561	 * Swap it with mtk HCD.
    562	 */
    563	mtk->hcd = platform_get_drvdata(pdev);
    564	platform_set_drvdata(pdev, mtk);
    565
    566	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "mac");
    567	hcd->regs = devm_ioremap_resource(dev, res);
    568	if (IS_ERR(hcd->regs)) {
    569		ret = PTR_ERR(hcd->regs);
    570		goto put_usb2_hcd;
    571	}
    572	hcd->rsrc_start = res->start;
    573	hcd->rsrc_len = resource_size(res);
    574
    575	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "ippc");
    576	if (res) {	/* ippc register is optional */
    577		mtk->ippc_regs = devm_ioremap_resource(dev, res);
    578		if (IS_ERR(mtk->ippc_regs)) {
    579			ret = PTR_ERR(mtk->ippc_regs);
    580			goto put_usb2_hcd;
    581		}
    582		mtk->has_ippc = true;
    583	}
    584
    585	device_init_wakeup(dev, true);
    586
    587	xhci = hcd_to_xhci(hcd);
    588	xhci->main_hcd = hcd;
    589
    590	/*
    591	 * imod_interval is the interrupt moderation value in nanoseconds.
    592	 * The increment interval is 8 times as much as that defined in
    593	 * the xHCI spec on MTK's controller.
    594	 */
    595	xhci->imod_interval = 5000;
    596	device_property_read_u32(dev, "imod-interval-ns", &xhci->imod_interval);
    597
    598	xhci->shared_hcd = usb_create_shared_hcd(driver, dev,
    599			dev_name(dev), hcd);
    600	if (!xhci->shared_hcd) {
    601		ret = -ENOMEM;
    602		goto disable_device_wakeup;
    603	}
    604
    605	ret = usb_add_hcd(hcd, irq, IRQF_SHARED);
    606	if (ret)
    607		goto put_usb3_hcd;
    608
    609	if (HCC_MAX_PSA(xhci->hcc_params) >= 4 &&
    610	    !(xhci->quirks & XHCI_BROKEN_STREAMS))
    611		xhci->shared_hcd->can_do_streams = 1;
    612
    613	ret = usb_add_hcd(xhci->shared_hcd, irq, IRQF_SHARED);
    614	if (ret)
    615		goto dealloc_usb2_hcd;
    616
    617	if (wakeup_irq > 0) {
    618		ret = dev_pm_set_dedicated_wake_irq_reverse(dev, wakeup_irq);
    619		if (ret) {
    620			dev_err(dev, "set wakeup irq %d failed\n", wakeup_irq);
    621			goto dealloc_usb3_hcd;
    622		}
    623		dev_info(dev, "wakeup irq %d\n", wakeup_irq);
    624	}
    625
    626	device_enable_async_suspend(dev);
    627	pm_runtime_mark_last_busy(dev);
    628	pm_runtime_put_autosuspend(dev);
    629	pm_runtime_forbid(dev);
    630
    631	return 0;
    632
    633dealloc_usb3_hcd:
    634	usb_remove_hcd(xhci->shared_hcd);
    635	xhci->shared_hcd = NULL;
    636
    637dealloc_usb2_hcd:
    638	usb_remove_hcd(hcd);
    639
    640put_usb3_hcd:
    641	xhci_mtk_sch_exit(mtk);
    642	usb_put_hcd(xhci->shared_hcd);
    643
    644disable_device_wakeup:
    645	device_init_wakeup(dev, false);
    646
    647put_usb2_hcd:
    648	usb_put_hcd(hcd);
    649
    650disable_clk:
    651	clk_bulk_disable_unprepare(BULK_CLKS_NUM, mtk->clks);
    652
    653disable_ldos:
    654	regulator_bulk_disable(BULK_VREGS_NUM, mtk->supplies);
    655
    656disable_pm:
    657	pm_runtime_put_noidle(dev);
    658	pm_runtime_disable(dev);
    659	return ret;
    660}
    661
    662static int xhci_mtk_remove(struct platform_device *pdev)
    663{
    664	struct xhci_hcd_mtk *mtk = platform_get_drvdata(pdev);
    665	struct usb_hcd	*hcd = mtk->hcd;
    666	struct xhci_hcd	*xhci = hcd_to_xhci(hcd);
    667	struct usb_hcd  *shared_hcd = xhci->shared_hcd;
    668	struct device *dev = &pdev->dev;
    669
    670	pm_runtime_get_sync(dev);
    671	xhci->xhc_state |= XHCI_STATE_REMOVING;
    672	dev_pm_clear_wake_irq(dev);
    673	device_init_wakeup(dev, false);
    674
    675	usb_remove_hcd(shared_hcd);
    676	xhci->shared_hcd = NULL;
    677	usb_remove_hcd(hcd);
    678	usb_put_hcd(shared_hcd);
    679	usb_put_hcd(hcd);
    680	xhci_mtk_sch_exit(mtk);
    681	clk_bulk_disable_unprepare(BULK_CLKS_NUM, mtk->clks);
    682	regulator_bulk_disable(BULK_VREGS_NUM, mtk->supplies);
    683
    684	pm_runtime_disable(dev);
    685	pm_runtime_put_noidle(dev);
    686	pm_runtime_set_suspended(dev);
    687
    688	return 0;
    689}
    690
    691static int __maybe_unused xhci_mtk_suspend(struct device *dev)
    692{
    693	struct xhci_hcd_mtk *mtk = dev_get_drvdata(dev);
    694	struct usb_hcd *hcd = mtk->hcd;
    695	struct xhci_hcd *xhci = hcd_to_xhci(hcd);
    696	int ret;
    697
    698	xhci_dbg(xhci, "%s: stop port polling\n", __func__);
    699	clear_bit(HCD_FLAG_POLL_RH, &hcd->flags);
    700	del_timer_sync(&hcd->rh_timer);
    701	clear_bit(HCD_FLAG_POLL_RH, &xhci->shared_hcd->flags);
    702	del_timer_sync(&xhci->shared_hcd->rh_timer);
    703
    704	ret = xhci_mtk_host_disable(mtk);
    705	if (ret)
    706		goto restart_poll_rh;
    707
    708	clk_bulk_disable_unprepare(BULK_CLKS_NUM, mtk->clks);
    709	usb_wakeup_set(mtk, true);
    710	return 0;
    711
    712restart_poll_rh:
    713	xhci_dbg(xhci, "%s: restart port polling\n", __func__);
    714	set_bit(HCD_FLAG_POLL_RH, &xhci->shared_hcd->flags);
    715	usb_hcd_poll_rh_status(xhci->shared_hcd);
    716	set_bit(HCD_FLAG_POLL_RH, &hcd->flags);
    717	usb_hcd_poll_rh_status(hcd);
    718	return ret;
    719}
    720
    721static int __maybe_unused xhci_mtk_resume(struct device *dev)
    722{
    723	struct xhci_hcd_mtk *mtk = dev_get_drvdata(dev);
    724	struct usb_hcd *hcd = mtk->hcd;
    725	struct xhci_hcd *xhci = hcd_to_xhci(hcd);
    726	int ret;
    727
    728	usb_wakeup_set(mtk, false);
    729	ret = clk_bulk_prepare_enable(BULK_CLKS_NUM, mtk->clks);
    730	if (ret)
    731		goto enable_wakeup;
    732
    733	ret = xhci_mtk_host_enable(mtk);
    734	if (ret)
    735		goto disable_clks;
    736
    737	xhci_dbg(xhci, "%s: restart port polling\n", __func__);
    738	set_bit(HCD_FLAG_POLL_RH, &xhci->shared_hcd->flags);
    739	usb_hcd_poll_rh_status(xhci->shared_hcd);
    740	set_bit(HCD_FLAG_POLL_RH, &hcd->flags);
    741	usb_hcd_poll_rh_status(hcd);
    742	return 0;
    743
    744disable_clks:
    745	clk_bulk_disable_unprepare(BULK_CLKS_NUM, mtk->clks);
    746enable_wakeup:
    747	usb_wakeup_set(mtk, true);
    748	return ret;
    749}
    750
    751static int __maybe_unused xhci_mtk_runtime_suspend(struct device *dev)
    752{
    753	struct xhci_hcd_mtk  *mtk = dev_get_drvdata(dev);
    754	struct xhci_hcd *xhci = hcd_to_xhci(mtk->hcd);
    755	int ret = 0;
    756
    757	if (xhci->xhc_state)
    758		return -ESHUTDOWN;
    759
    760	if (device_may_wakeup(dev))
    761		ret = xhci_mtk_suspend(dev);
    762
    763	/* -EBUSY: let PM automatically reschedule another autosuspend */
    764	return ret ? -EBUSY : 0;
    765}
    766
    767static int __maybe_unused xhci_mtk_runtime_resume(struct device *dev)
    768{
    769	struct xhci_hcd_mtk  *mtk = dev_get_drvdata(dev);
    770	struct xhci_hcd *xhci = hcd_to_xhci(mtk->hcd);
    771	int ret = 0;
    772
    773	if (xhci->xhc_state)
    774		return -ESHUTDOWN;
    775
    776	if (device_may_wakeup(dev))
    777		ret = xhci_mtk_resume(dev);
    778
    779	return ret;
    780}
    781
    782static const struct dev_pm_ops xhci_mtk_pm_ops = {
    783	SET_SYSTEM_SLEEP_PM_OPS(xhci_mtk_suspend, xhci_mtk_resume)
    784	SET_RUNTIME_PM_OPS(xhci_mtk_runtime_suspend,
    785			   xhci_mtk_runtime_resume, NULL)
    786};
    787
    788#define DEV_PM_OPS (IS_ENABLED(CONFIG_PM) ? &xhci_mtk_pm_ops : NULL)
    789
    790static const struct of_device_id mtk_xhci_of_match[] = {
    791	{ .compatible = "mediatek,mt8173-xhci"},
    792	{ .compatible = "mediatek,mt8195-xhci"},
    793	{ .compatible = "mediatek,mtk-xhci"},
    794	{ },
    795};
    796MODULE_DEVICE_TABLE(of, mtk_xhci_of_match);
    797
    798static struct platform_driver mtk_xhci_driver = {
    799	.probe	= xhci_mtk_probe,
    800	.remove	= xhci_mtk_remove,
    801	.driver	= {
    802		.name = "xhci-mtk",
    803		.pm = DEV_PM_OPS,
    804		.of_match_table = mtk_xhci_of_match,
    805	},
    806};
    807
    808static int __init xhci_mtk_init(void)
    809{
    810	xhci_init_driver(&xhci_mtk_hc_driver, &xhci_mtk_overrides);
    811	return platform_driver_register(&mtk_xhci_driver);
    812}
    813module_init(xhci_mtk_init);
    814
    815static void __exit xhci_mtk_exit(void)
    816{
    817	platform_driver_unregister(&mtk_xhci_driver);
    818}
    819module_exit(xhci_mtk_exit);
    820
    821MODULE_AUTHOR("Chunfeng Yun <chunfeng.yun@mediatek.com>");
    822MODULE_DESCRIPTION("MediaTek xHCI Host Controller Driver");
    823MODULE_LICENSE("GPL v2");