15ab43d0fSKunihiko Hayashi // SPDX-License-Identifier: GPL-2.0 25ab43d0fSKunihiko Hayashi /* 35ab43d0fSKunihiko Hayashi * phy-uniphier-usb3ss.c - SS-PHY driver for Socionext UniPhier USB3 controller 45ab43d0fSKunihiko Hayashi * Copyright 2015-2018 Socionext Inc. 55ab43d0fSKunihiko Hayashi * Author: 65ab43d0fSKunihiko Hayashi * Kunihiko Hayashi <hayashi.kunihiko@socionext.com> 75ab43d0fSKunihiko Hayashi * Contributors: 85ab43d0fSKunihiko Hayashi * Motoya Tanigawa <tanigawa.motoya@socionext.com> 95ab43d0fSKunihiko Hayashi * Masami Hiramatsu <masami.hiramatsu@linaro.org> 105ab43d0fSKunihiko Hayashi */ 115ab43d0fSKunihiko Hayashi 125ab43d0fSKunihiko Hayashi #include <linux/bitfield.h> 135ab43d0fSKunihiko Hayashi #include <linux/bitops.h> 145ab43d0fSKunihiko Hayashi #include <linux/clk.h> 155ab43d0fSKunihiko Hayashi #include <linux/io.h> 165ab43d0fSKunihiko Hayashi #include <linux/module.h> 175ab43d0fSKunihiko Hayashi #include <linux/of.h> 185ab43d0fSKunihiko Hayashi #include <linux/of_platform.h> 195ab43d0fSKunihiko Hayashi #include <linux/phy/phy.h> 205ab43d0fSKunihiko Hayashi #include <linux/platform_device.h> 215ab43d0fSKunihiko Hayashi #include <linux/regulator/consumer.h> 225ab43d0fSKunihiko Hayashi #include <linux/reset.h> 235ab43d0fSKunihiko Hayashi 245ab43d0fSKunihiko Hayashi #define SSPHY_TESTI 0x0 255ab43d0fSKunihiko Hayashi #define TESTI_DAT_MASK GENMASK(13, 6) 265ab43d0fSKunihiko Hayashi #define TESTI_ADR_MASK GENMASK(5, 1) 275ab43d0fSKunihiko Hayashi #define TESTI_WR_EN BIT(0) 285ab43d0fSKunihiko Hayashi 29*898c7a9eSRyuta NAKANISHI #define SSPHY_TESTO 0x4 30*898c7a9eSRyuta NAKANISHI #define TESTO_DAT_MASK GENMASK(7, 0) 31*898c7a9eSRyuta NAKANISHI 325ab43d0fSKunihiko Hayashi #define PHY_F(regno, msb, lsb) { (regno), (msb), (lsb) } 335ab43d0fSKunihiko Hayashi 345ab43d0fSKunihiko Hayashi #define CDR_CPD_TRIM PHY_F(7, 3, 0) /* RxPLL charge pump current */ 355ab43d0fSKunihiko Hayashi #define CDR_CPF_TRIM PHY_F(8, 3, 0) /* RxPLL charge pump current 2 */ 365ab43d0fSKunihiko Hayashi #define TX_PLL_TRIM PHY_F(9, 3, 0) /* TxPLL charge pump current */ 375ab43d0fSKunihiko Hayashi #define BGAP_TRIM PHY_F(11, 3, 0) /* Bandgap voltage */ 385ab43d0fSKunihiko Hayashi #define CDR_TRIM PHY_F(13, 6, 5) /* Clock Data Recovery setting */ 395ab43d0fSKunihiko Hayashi #define VCO_CTRL PHY_F(26, 7, 4) /* VCO control */ 405ab43d0fSKunihiko Hayashi #define VCOPLL_CTRL PHY_F(27, 2, 0) /* TxPLL VCO tuning */ 415ab43d0fSKunihiko Hayashi #define VCOPLL_CM PHY_F(28, 1, 0) /* TxPLL voltage */ 425ab43d0fSKunihiko Hayashi 435ab43d0fSKunihiko Hayashi #define MAX_PHY_PARAMS 7 445ab43d0fSKunihiko Hayashi 455ab43d0fSKunihiko Hayashi struct uniphier_u3ssphy_param { 465ab43d0fSKunihiko Hayashi struct { 475ab43d0fSKunihiko Hayashi int reg_no; 485ab43d0fSKunihiko Hayashi int msb; 495ab43d0fSKunihiko Hayashi int lsb; 505ab43d0fSKunihiko Hayashi } field; 515ab43d0fSKunihiko Hayashi u8 value; 525ab43d0fSKunihiko Hayashi }; 535ab43d0fSKunihiko Hayashi 545ab43d0fSKunihiko Hayashi struct uniphier_u3ssphy_priv { 555ab43d0fSKunihiko Hayashi struct device *dev; 565ab43d0fSKunihiko Hayashi void __iomem *base; 575ab43d0fSKunihiko Hayashi struct clk *clk, *clk_ext, *clk_parent, *clk_parent_gio; 585ab43d0fSKunihiko Hayashi struct reset_control *rst, *rst_parent, *rst_parent_gio; 595ab43d0fSKunihiko Hayashi struct regulator *vbus; 605ab43d0fSKunihiko Hayashi const struct uniphier_u3ssphy_soc_data *data; 615ab43d0fSKunihiko Hayashi }; 625ab43d0fSKunihiko Hayashi 635ab43d0fSKunihiko Hayashi struct uniphier_u3ssphy_soc_data { 645ab43d0fSKunihiko Hayashi bool is_legacy; 655ab43d0fSKunihiko Hayashi int nparams; 665ab43d0fSKunihiko Hayashi const struct uniphier_u3ssphy_param param[MAX_PHY_PARAMS]; 675ab43d0fSKunihiko Hayashi }; 685ab43d0fSKunihiko Hayashi 695ab43d0fSKunihiko Hayashi static void uniphier_u3ssphy_testio_write(struct uniphier_u3ssphy_priv *priv, 705ab43d0fSKunihiko Hayashi u32 data) 715ab43d0fSKunihiko Hayashi { 725ab43d0fSKunihiko Hayashi /* need to read TESTO twice after accessing TESTI */ 735ab43d0fSKunihiko Hayashi writel(data, priv->base + SSPHY_TESTI); 745ab43d0fSKunihiko Hayashi readl(priv->base + SSPHY_TESTO); 755ab43d0fSKunihiko Hayashi readl(priv->base + SSPHY_TESTO); 765ab43d0fSKunihiko Hayashi } 775ab43d0fSKunihiko Hayashi 785ab43d0fSKunihiko Hayashi static void uniphier_u3ssphy_set_param(struct uniphier_u3ssphy_priv *priv, 795ab43d0fSKunihiko Hayashi const struct uniphier_u3ssphy_param *p) 805ab43d0fSKunihiko Hayashi { 815ab43d0fSKunihiko Hayashi u32 val; 825ab43d0fSKunihiko Hayashi u8 field_mask = GENMASK(p->field.msb, p->field.lsb); 835ab43d0fSKunihiko Hayashi u8 data; 845ab43d0fSKunihiko Hayashi 855ab43d0fSKunihiko Hayashi /* read previous data */ 865ab43d0fSKunihiko Hayashi val = FIELD_PREP(TESTI_DAT_MASK, 1); 875ab43d0fSKunihiko Hayashi val |= FIELD_PREP(TESTI_ADR_MASK, p->field.reg_no); 885ab43d0fSKunihiko Hayashi uniphier_u3ssphy_testio_write(priv, val); 89*898c7a9eSRyuta NAKANISHI val = readl(priv->base + SSPHY_TESTO) & TESTO_DAT_MASK; 905ab43d0fSKunihiko Hayashi 915ab43d0fSKunihiko Hayashi /* update value */ 92*898c7a9eSRyuta NAKANISHI val &= ~field_mask; 935ab43d0fSKunihiko Hayashi data = field_mask & (p->value << p->field.lsb); 94*898c7a9eSRyuta NAKANISHI val = FIELD_PREP(TESTI_DAT_MASK, data | val); 955ab43d0fSKunihiko Hayashi val |= FIELD_PREP(TESTI_ADR_MASK, p->field.reg_no); 965ab43d0fSKunihiko Hayashi uniphier_u3ssphy_testio_write(priv, val); 975ab43d0fSKunihiko Hayashi uniphier_u3ssphy_testio_write(priv, val | TESTI_WR_EN); 985ab43d0fSKunihiko Hayashi uniphier_u3ssphy_testio_write(priv, val); 995ab43d0fSKunihiko Hayashi 1005ab43d0fSKunihiko Hayashi /* read current data as dummy */ 1015ab43d0fSKunihiko Hayashi val = FIELD_PREP(TESTI_DAT_MASK, 1); 1025ab43d0fSKunihiko Hayashi val |= FIELD_PREP(TESTI_ADR_MASK, p->field.reg_no); 1035ab43d0fSKunihiko Hayashi uniphier_u3ssphy_testio_write(priv, val); 1045ab43d0fSKunihiko Hayashi readl(priv->base + SSPHY_TESTO); 1055ab43d0fSKunihiko Hayashi } 1065ab43d0fSKunihiko Hayashi 1075ab43d0fSKunihiko Hayashi static int uniphier_u3ssphy_power_on(struct phy *phy) 1085ab43d0fSKunihiko Hayashi { 1095ab43d0fSKunihiko Hayashi struct uniphier_u3ssphy_priv *priv = phy_get_drvdata(phy); 1105ab43d0fSKunihiko Hayashi int ret; 1115ab43d0fSKunihiko Hayashi 1125ab43d0fSKunihiko Hayashi ret = clk_prepare_enable(priv->clk_ext); 1135ab43d0fSKunihiko Hayashi if (ret) 1145ab43d0fSKunihiko Hayashi return ret; 1155ab43d0fSKunihiko Hayashi 1165ab43d0fSKunihiko Hayashi ret = clk_prepare_enable(priv->clk); 1175ab43d0fSKunihiko Hayashi if (ret) 1185ab43d0fSKunihiko Hayashi goto out_clk_ext_disable; 1195ab43d0fSKunihiko Hayashi 1205ab43d0fSKunihiko Hayashi ret = reset_control_deassert(priv->rst); 1215ab43d0fSKunihiko Hayashi if (ret) 1225ab43d0fSKunihiko Hayashi goto out_clk_disable; 1235ab43d0fSKunihiko Hayashi 1245ab43d0fSKunihiko Hayashi if (priv->vbus) { 1255ab43d0fSKunihiko Hayashi ret = regulator_enable(priv->vbus); 1265ab43d0fSKunihiko Hayashi if (ret) 1275ab43d0fSKunihiko Hayashi goto out_rst_assert; 1285ab43d0fSKunihiko Hayashi } 1295ab43d0fSKunihiko Hayashi 1305ab43d0fSKunihiko Hayashi return 0; 1315ab43d0fSKunihiko Hayashi 1325ab43d0fSKunihiko Hayashi out_rst_assert: 1335ab43d0fSKunihiko Hayashi reset_control_assert(priv->rst); 1345ab43d0fSKunihiko Hayashi out_clk_disable: 1355ab43d0fSKunihiko Hayashi clk_disable_unprepare(priv->clk); 1365ab43d0fSKunihiko Hayashi out_clk_ext_disable: 1375ab43d0fSKunihiko Hayashi clk_disable_unprepare(priv->clk_ext); 1385ab43d0fSKunihiko Hayashi 1395ab43d0fSKunihiko Hayashi return ret; 1405ab43d0fSKunihiko Hayashi } 1415ab43d0fSKunihiko Hayashi 1425ab43d0fSKunihiko Hayashi static int uniphier_u3ssphy_power_off(struct phy *phy) 1435ab43d0fSKunihiko Hayashi { 1445ab43d0fSKunihiko Hayashi struct uniphier_u3ssphy_priv *priv = phy_get_drvdata(phy); 1455ab43d0fSKunihiko Hayashi 1465ab43d0fSKunihiko Hayashi if (priv->vbus) 1475ab43d0fSKunihiko Hayashi regulator_disable(priv->vbus); 1485ab43d0fSKunihiko Hayashi 1495ab43d0fSKunihiko Hayashi reset_control_assert(priv->rst); 1505ab43d0fSKunihiko Hayashi clk_disable_unprepare(priv->clk); 1515ab43d0fSKunihiko Hayashi clk_disable_unprepare(priv->clk_ext); 1525ab43d0fSKunihiko Hayashi 1535ab43d0fSKunihiko Hayashi return 0; 1545ab43d0fSKunihiko Hayashi } 1555ab43d0fSKunihiko Hayashi 1565ab43d0fSKunihiko Hayashi static int uniphier_u3ssphy_init(struct phy *phy) 1575ab43d0fSKunihiko Hayashi { 1585ab43d0fSKunihiko Hayashi struct uniphier_u3ssphy_priv *priv = phy_get_drvdata(phy); 1595ab43d0fSKunihiko Hayashi int i, ret; 1605ab43d0fSKunihiko Hayashi 1615ab43d0fSKunihiko Hayashi ret = clk_prepare_enable(priv->clk_parent); 1625ab43d0fSKunihiko Hayashi if (ret) 1635ab43d0fSKunihiko Hayashi return ret; 1645ab43d0fSKunihiko Hayashi 1655ab43d0fSKunihiko Hayashi ret = clk_prepare_enable(priv->clk_parent_gio); 1665ab43d0fSKunihiko Hayashi if (ret) 1675ab43d0fSKunihiko Hayashi goto out_clk_disable; 1685ab43d0fSKunihiko Hayashi 1695ab43d0fSKunihiko Hayashi ret = reset_control_deassert(priv->rst_parent); 1705ab43d0fSKunihiko Hayashi if (ret) 1715ab43d0fSKunihiko Hayashi goto out_clk_gio_disable; 1725ab43d0fSKunihiko Hayashi 1735ab43d0fSKunihiko Hayashi ret = reset_control_deassert(priv->rst_parent_gio); 1745ab43d0fSKunihiko Hayashi if (ret) 1755ab43d0fSKunihiko Hayashi goto out_rst_assert; 1765ab43d0fSKunihiko Hayashi 1775ab43d0fSKunihiko Hayashi if (priv->data->is_legacy) 1785ab43d0fSKunihiko Hayashi return 0; 1795ab43d0fSKunihiko Hayashi 1805ab43d0fSKunihiko Hayashi for (i = 0; i < priv->data->nparams; i++) 1815ab43d0fSKunihiko Hayashi uniphier_u3ssphy_set_param(priv, &priv->data->param[i]); 1825ab43d0fSKunihiko Hayashi 1835ab43d0fSKunihiko Hayashi return 0; 1845ab43d0fSKunihiko Hayashi 1855ab43d0fSKunihiko Hayashi out_rst_assert: 1865ab43d0fSKunihiko Hayashi reset_control_assert(priv->rst_parent); 1875ab43d0fSKunihiko Hayashi out_clk_gio_disable: 1885ab43d0fSKunihiko Hayashi clk_disable_unprepare(priv->clk_parent_gio); 1895ab43d0fSKunihiko Hayashi out_clk_disable: 1905ab43d0fSKunihiko Hayashi clk_disable_unprepare(priv->clk_parent); 1915ab43d0fSKunihiko Hayashi 1925ab43d0fSKunihiko Hayashi return ret; 1935ab43d0fSKunihiko Hayashi } 1945ab43d0fSKunihiko Hayashi 1955ab43d0fSKunihiko Hayashi static int uniphier_u3ssphy_exit(struct phy *phy) 1965ab43d0fSKunihiko Hayashi { 1975ab43d0fSKunihiko Hayashi struct uniphier_u3ssphy_priv *priv = phy_get_drvdata(phy); 1985ab43d0fSKunihiko Hayashi 1995ab43d0fSKunihiko Hayashi reset_control_assert(priv->rst_parent_gio); 2005ab43d0fSKunihiko Hayashi reset_control_assert(priv->rst_parent); 2015ab43d0fSKunihiko Hayashi clk_disable_unprepare(priv->clk_parent_gio); 2025ab43d0fSKunihiko Hayashi clk_disable_unprepare(priv->clk_parent); 2035ab43d0fSKunihiko Hayashi 2045ab43d0fSKunihiko Hayashi return 0; 2055ab43d0fSKunihiko Hayashi } 2065ab43d0fSKunihiko Hayashi 2075ab43d0fSKunihiko Hayashi static const struct phy_ops uniphier_u3ssphy_ops = { 2085ab43d0fSKunihiko Hayashi .init = uniphier_u3ssphy_init, 2095ab43d0fSKunihiko Hayashi .exit = uniphier_u3ssphy_exit, 2105ab43d0fSKunihiko Hayashi .power_on = uniphier_u3ssphy_power_on, 2115ab43d0fSKunihiko Hayashi .power_off = uniphier_u3ssphy_power_off, 2125ab43d0fSKunihiko Hayashi .owner = THIS_MODULE, 2135ab43d0fSKunihiko Hayashi }; 2145ab43d0fSKunihiko Hayashi 2155ab43d0fSKunihiko Hayashi static int uniphier_u3ssphy_probe(struct platform_device *pdev) 2165ab43d0fSKunihiko Hayashi { 2175ab43d0fSKunihiko Hayashi struct device *dev = &pdev->dev; 2185ab43d0fSKunihiko Hayashi struct uniphier_u3ssphy_priv *priv; 2195ab43d0fSKunihiko Hayashi struct phy_provider *phy_provider; 2205ab43d0fSKunihiko Hayashi struct phy *phy; 2215ab43d0fSKunihiko Hayashi 2225ab43d0fSKunihiko Hayashi priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); 2235ab43d0fSKunihiko Hayashi if (!priv) 2245ab43d0fSKunihiko Hayashi return -ENOMEM; 2255ab43d0fSKunihiko Hayashi 2265ab43d0fSKunihiko Hayashi priv->dev = dev; 2275ab43d0fSKunihiko Hayashi priv->data = of_device_get_match_data(dev); 2285ab43d0fSKunihiko Hayashi if (WARN_ON(!priv->data || 2295ab43d0fSKunihiko Hayashi priv->data->nparams > MAX_PHY_PARAMS)) 2305ab43d0fSKunihiko Hayashi return -EINVAL; 2315ab43d0fSKunihiko Hayashi 23240d76346SKunihiko Hayashi priv->base = devm_platform_ioremap_resource(pdev, 0); 2335ab43d0fSKunihiko Hayashi if (IS_ERR(priv->base)) 2345ab43d0fSKunihiko Hayashi return PTR_ERR(priv->base); 2355ab43d0fSKunihiko Hayashi 2365ab43d0fSKunihiko Hayashi if (!priv->data->is_legacy) { 2375ab43d0fSKunihiko Hayashi priv->clk = devm_clk_get(dev, "phy"); 2385ab43d0fSKunihiko Hayashi if (IS_ERR(priv->clk)) 2395ab43d0fSKunihiko Hayashi return PTR_ERR(priv->clk); 2405ab43d0fSKunihiko Hayashi 241752d31a3SChunfeng Yun priv->clk_ext = devm_clk_get_optional(dev, "phy-ext"); 242752d31a3SChunfeng Yun if (IS_ERR(priv->clk_ext)) 2435ab43d0fSKunihiko Hayashi return PTR_ERR(priv->clk_ext); 2445ab43d0fSKunihiko Hayashi 2455ab43d0fSKunihiko Hayashi priv->rst = devm_reset_control_get_shared(dev, "phy"); 2465ab43d0fSKunihiko Hayashi if (IS_ERR(priv->rst)) 2475ab43d0fSKunihiko Hayashi return PTR_ERR(priv->rst); 2485ab43d0fSKunihiko Hayashi } else { 2495ab43d0fSKunihiko Hayashi priv->clk_parent_gio = devm_clk_get(dev, "gio"); 2505ab43d0fSKunihiko Hayashi if (IS_ERR(priv->clk_parent_gio)) 2515ab43d0fSKunihiko Hayashi return PTR_ERR(priv->clk_parent_gio); 2525ab43d0fSKunihiko Hayashi 2535ab43d0fSKunihiko Hayashi priv->rst_parent_gio = 2545ab43d0fSKunihiko Hayashi devm_reset_control_get_shared(dev, "gio"); 2555ab43d0fSKunihiko Hayashi if (IS_ERR(priv->rst_parent_gio)) 2565ab43d0fSKunihiko Hayashi return PTR_ERR(priv->rst_parent_gio); 2575ab43d0fSKunihiko Hayashi } 2585ab43d0fSKunihiko Hayashi 2595ab43d0fSKunihiko Hayashi priv->clk_parent = devm_clk_get(dev, "link"); 2605ab43d0fSKunihiko Hayashi if (IS_ERR(priv->clk_parent)) 2615ab43d0fSKunihiko Hayashi return PTR_ERR(priv->clk_parent); 2625ab43d0fSKunihiko Hayashi 2635ab43d0fSKunihiko Hayashi priv->rst_parent = devm_reset_control_get_shared(dev, "link"); 2645ab43d0fSKunihiko Hayashi if (IS_ERR(priv->rst_parent)) 2655ab43d0fSKunihiko Hayashi return PTR_ERR(priv->rst_parent); 2665ab43d0fSKunihiko Hayashi 2675ab43d0fSKunihiko Hayashi priv->vbus = devm_regulator_get_optional(dev, "vbus"); 2685ab43d0fSKunihiko Hayashi if (IS_ERR(priv->vbus)) { 2695ab43d0fSKunihiko Hayashi if (PTR_ERR(priv->vbus) == -EPROBE_DEFER) 2705ab43d0fSKunihiko Hayashi return PTR_ERR(priv->vbus); 2715ab43d0fSKunihiko Hayashi priv->vbus = NULL; 2725ab43d0fSKunihiko Hayashi } 2735ab43d0fSKunihiko Hayashi 2745ab43d0fSKunihiko Hayashi phy = devm_phy_create(dev, dev->of_node, &uniphier_u3ssphy_ops); 2755ab43d0fSKunihiko Hayashi if (IS_ERR(phy)) 2765ab43d0fSKunihiko Hayashi return PTR_ERR(phy); 2775ab43d0fSKunihiko Hayashi 2785ab43d0fSKunihiko Hayashi phy_set_drvdata(phy, priv); 2795ab43d0fSKunihiko Hayashi phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate); 2805ab43d0fSKunihiko Hayashi 2815ab43d0fSKunihiko Hayashi return PTR_ERR_OR_ZERO(phy_provider); 2825ab43d0fSKunihiko Hayashi } 2835ab43d0fSKunihiko Hayashi 2845ab43d0fSKunihiko Hayashi static const struct uniphier_u3ssphy_soc_data uniphier_pro4_data = { 2855ab43d0fSKunihiko Hayashi .is_legacy = true, 2865ab43d0fSKunihiko Hayashi }; 2875ab43d0fSKunihiko Hayashi 2885ab43d0fSKunihiko Hayashi static const struct uniphier_u3ssphy_soc_data uniphier_pxs2_data = { 2895ab43d0fSKunihiko Hayashi .is_legacy = false, 2905ab43d0fSKunihiko Hayashi .nparams = 7, 2915ab43d0fSKunihiko Hayashi .param = { 2925ab43d0fSKunihiko Hayashi { CDR_CPD_TRIM, 10 }, 2935ab43d0fSKunihiko Hayashi { CDR_CPF_TRIM, 3 }, 2945ab43d0fSKunihiko Hayashi { TX_PLL_TRIM, 5 }, 2955ab43d0fSKunihiko Hayashi { BGAP_TRIM, 9 }, 2965ab43d0fSKunihiko Hayashi { CDR_TRIM, 2 }, 2975ab43d0fSKunihiko Hayashi { VCOPLL_CTRL, 7 }, 2985ab43d0fSKunihiko Hayashi { VCOPLL_CM, 1 }, 2995ab43d0fSKunihiko Hayashi }, 3005ab43d0fSKunihiko Hayashi }; 3015ab43d0fSKunihiko Hayashi 3025ab43d0fSKunihiko Hayashi static const struct uniphier_u3ssphy_soc_data uniphier_ld20_data = { 3035ab43d0fSKunihiko Hayashi .is_legacy = false, 3045ab43d0fSKunihiko Hayashi .nparams = 3, 3055ab43d0fSKunihiko Hayashi .param = { 3065ab43d0fSKunihiko Hayashi { CDR_CPD_TRIM, 6 }, 3075ab43d0fSKunihiko Hayashi { CDR_TRIM, 2 }, 3085ab43d0fSKunihiko Hayashi { VCO_CTRL, 5 }, 3095ab43d0fSKunihiko Hayashi }, 3105ab43d0fSKunihiko Hayashi }; 3115ab43d0fSKunihiko Hayashi 3125ab43d0fSKunihiko Hayashi static const struct of_device_id uniphier_u3ssphy_match[] = { 3135ab43d0fSKunihiko Hayashi { 3145ab43d0fSKunihiko Hayashi .compatible = "socionext,uniphier-pro4-usb3-ssphy", 3155ab43d0fSKunihiko Hayashi .data = &uniphier_pro4_data, 3165ab43d0fSKunihiko Hayashi }, 3175ab43d0fSKunihiko Hayashi { 3189376fa63SKunihiko Hayashi .compatible = "socionext,uniphier-pro5-usb3-ssphy", 3199376fa63SKunihiko Hayashi .data = &uniphier_pro4_data, 3209376fa63SKunihiko Hayashi }, 3219376fa63SKunihiko Hayashi { 3225ab43d0fSKunihiko Hayashi .compatible = "socionext,uniphier-pxs2-usb3-ssphy", 3235ab43d0fSKunihiko Hayashi .data = &uniphier_pxs2_data, 3245ab43d0fSKunihiko Hayashi }, 3255ab43d0fSKunihiko Hayashi { 3265ab43d0fSKunihiko Hayashi .compatible = "socionext,uniphier-ld20-usb3-ssphy", 3275ab43d0fSKunihiko Hayashi .data = &uniphier_ld20_data, 3285ab43d0fSKunihiko Hayashi }, 3295ab43d0fSKunihiko Hayashi { 3305ab43d0fSKunihiko Hayashi .compatible = "socionext,uniphier-pxs3-usb3-ssphy", 3315ab43d0fSKunihiko Hayashi .data = &uniphier_ld20_data, 3325ab43d0fSKunihiko Hayashi }, 333877e8d28SKunihiko Hayashi { 334877e8d28SKunihiko Hayashi .compatible = "socionext,uniphier-nx1-usb3-ssphy", 335877e8d28SKunihiko Hayashi .data = &uniphier_ld20_data, 336877e8d28SKunihiko Hayashi }, 3375ab43d0fSKunihiko Hayashi { /* sentinel */ } 3385ab43d0fSKunihiko Hayashi }; 3395ab43d0fSKunihiko Hayashi MODULE_DEVICE_TABLE(of, uniphier_u3ssphy_match); 3405ab43d0fSKunihiko Hayashi 3415ab43d0fSKunihiko Hayashi static struct platform_driver uniphier_u3ssphy_driver = { 3425ab43d0fSKunihiko Hayashi .probe = uniphier_u3ssphy_probe, 3435ab43d0fSKunihiko Hayashi .driver = { 3445ab43d0fSKunihiko Hayashi .name = "uniphier-usb3-ssphy", 3455ab43d0fSKunihiko Hayashi .of_match_table = uniphier_u3ssphy_match, 3465ab43d0fSKunihiko Hayashi }, 3475ab43d0fSKunihiko Hayashi }; 3485ab43d0fSKunihiko Hayashi 3495ab43d0fSKunihiko Hayashi module_platform_driver(uniphier_u3ssphy_driver); 3505ab43d0fSKunihiko Hayashi 3515ab43d0fSKunihiko Hayashi MODULE_AUTHOR("Kunihiko Hayashi <hayashi.kunihiko@socionext.com>"); 3525ab43d0fSKunihiko Hayashi MODULE_DESCRIPTION("UniPhier SS-PHY driver for USB3 controller"); 3535ab43d0fSKunihiko Hayashi MODULE_LICENSE("GPL v2"); 354