Changeset 48749


Ignore:
Timestamp:
2016-02-19T17:39:12+01:00 (2 years ago)
Author:
blogic
Message:

ralink: fix mt7628 ehci support

the u2_phy init was missing

Backport of r48747

Signed-off-by: John Crispin <blogic@…>

Location:
branches/chaos_calmer/target/linux/ramips
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/chaos_calmer/target/linux/ramips/dts/mt7628an.dtsi

    r47229 r48749  
    338338        }; 
    339339 
    340         usbphy: usbphy { 
     340        usbphy: usbphy@10120000 { 
    341341                compatible = "ralink,mt7628an-usbphy", "ralink,mt7620a-usbphy"; 
     342                reg = <0x10120000 1000>; 
    342343                #phy-cells = <1>; 
    343344 
    344                 resets = <&rstctrl 22>; 
    345                 reset-names = "host"; 
     345                resets = <&rstctrl 22 &rstctrl 25>; 
     346                reset-names = "host", "device"; 
    346347        }; 
    347348 
  • branches/chaos_calmer/target/linux/ramips/patches-3.18/0037-USB-phy-add-ralink-SoC-driver.patch

    r47335 r48749  
    11--- a/drivers/phy/Kconfig 
    22+++ b/drivers/phy/Kconfig 
    3 @@ -239,6 +239,11 @@ config PHY_XGENE 
     3@@ -239,6 +239,11 @@ 
    44        help 
    55          This option enables support for APM X-Gene SoC multi-purpose PHY. 
     
    1515--- a/drivers/phy/Makefile 
    1616+++ b/drivers/phy/Makefile 
    17 @@ -31,3 +31,4 @@ obj-$(CONFIG_PHY_ST_SPEAR1340_MIPHY)  += 
     17@@ -31,3 +31,4 @@ 
    1818 obj-$(CONFIG_PHY_XGENE)                        += phy-xgene.o 
    1919 obj-$(CONFIG_PHY_STIH407_USB)          += phy-stih407-usb.o 
     
    2222--- /dev/null 
    2323+++ b/drivers/phy/phy-ralink-usb.c 
    24 @@ -0,0 +1,175 @@ 
     24@@ -0,0 +1,228 @@ 
    2525+/* 
    2626+ * Allwinner ralink USB phy driver 
    2727+ * 
    28 + * Copyright (C) 2014 John Crispin <blogic@openwrt.org> 
     28+ * Copyright (C) 2016 John Crispin <blogic@openwrt.org> 
    2929+ * 
    3030+ * Based on code from 
     
    5959+#define RT_SYSC_REG_USB_PHY_CFG                0x05c 
    6060+ 
     61+#define OFS_U2_PHY_AC0                  0x00 
     62+#define OFS_U2_PHY_AC1                  0x04 
     63+#define OFS_U2_PHY_AC2                  0x08 
     64+#define OFS_U2_PHY_ACR0                 0x10 
     65+#define OFS_U2_PHY_ACR1                 0x14 
     66+#define OFS_U2_PHY_ACR2                 0x18 
     67+#define OFS_U2_PHY_ACR3                 0x1C 
     68+#define OFS_U2_PHY_ACR4                 0x20 
     69+#define OFS_U2_PHY_AMON0                0x24 
     70+#define OFS_U2_PHY_DCR0                 0x60 
     71+#define OFS_U2_PHY_DCR1                 0x64 
     72+#define OFS_U2_PHY_DTM0                 0x68 
     73+#define OFS_U2_PHY_DTM1                 0x6C 
     74+ 
    6175+#define RT_RSTCTRL_UDEV                        BIT(25) 
    6276+#define RT_RSTCTRL_UHST                        BIT(22) 
     
    7185+#define UDEV_WAKEUP                    BIT(0) 
    7286+ 
    73 +static atomic_t usb_pwr_ref = ATOMIC_INIT(0); 
    74 +static struct reset_control *rstdev; 
    75 +static struct reset_control *rsthost; 
    76 +static u32 phy_clk; 
    77 +static struct phy *rt_phy; 
    78 + 
    79 +static void usb_phy_enable(int state) 
    80 +{ 
    81 +       if (state) 
    82 +               rt_sysc_m32(0, phy_clk, RT_SYSC_REG_CLKCFG1); 
     87+struct ralink_usb_phy { 
     88+       struct reset_control    *rstdev; 
     89+       struct reset_control    *rsthost; 
     90+       u32                     clk; 
     91+       struct phy              *phy; 
     92+       void __iomem            *base; 
     93+}; 
     94+ 
     95+static void u2_phy_w32(struct ralink_usb_phy *phy, u32 val, u32 reg) 
     96+{ 
     97+       iowrite32(val, phy->base + reg); 
     98+} 
     99+ 
     100+static u32 u2_phy_r32(struct ralink_usb_phy *phy, u32 reg) 
     101+{ 
     102+       return ioread32(phy->base + reg); 
     103+} 
     104+ 
     105+static void 
     106+u2_phy_init(struct ralink_usb_phy *phy) 
     107+{ 
     108+       u2_phy_r32(phy, OFS_U2_PHY_AC2); 
     109+       u2_phy_r32(phy, OFS_U2_PHY_ACR0); 
     110+       u2_phy_r32(phy, OFS_U2_PHY_DCR0); 
     111+ 
     112+       u2_phy_w32(phy, 0x00ffff02, OFS_U2_PHY_DCR0); 
     113+       u2_phy_r32(phy, OFS_U2_PHY_DCR0); 
     114+       u2_phy_w32(phy, 0x00555502, OFS_U2_PHY_DCR0); 
     115+       u2_phy_r32(phy, OFS_U2_PHY_DCR0); 
     116+       u2_phy_w32(phy, 0x00aaaa02, OFS_U2_PHY_DCR0); 
     117+       u2_phy_r32(phy, OFS_U2_PHY_DCR0); 
     118+       u2_phy_w32(phy, 0x00000402, OFS_U2_PHY_DCR0); 
     119+       u2_phy_r32(phy, OFS_U2_PHY_DCR0); 
     120+       u2_phy_w32(phy, 0x0048086a, OFS_U2_PHY_AC0); 
     121+       u2_phy_w32(phy, 0x4400001c, OFS_U2_PHY_AC1); 
     122+       u2_phy_w32(phy, 0xc0200000, OFS_U2_PHY_ACR3); 
     123+       u2_phy_w32(phy, 0x02000000, OFS_U2_PHY_DTM0); 
     124+} 
     125+ 
     126+static int ralink_usb_phy_power_on(struct phy *_phy) 
     127+{ 
     128+       struct ralink_usb_phy *phy = phy_get_drvdata(_phy); 
     129+       u32 t; 
     130+ 
     131+       /* enable the phy */ 
     132+       rt_sysc_m32(0, phy->clk, RT_SYSC_REG_CLKCFG1); 
     133+ 
     134+       /* setup host mode */ 
     135+       rt_sysc_m32(0, RT_SYSCFG1_USB0_HOST_MODE, RT_SYSC_REG_SYSCFG1); 
     136+ 
     137+       /* deassert the reset lines */ 
     138+       reset_control_deassert(phy->rsthost); 
     139+       reset_control_deassert(phy->rstdev); 
     140+ 
     141+       /* 
     142+        * The SDK kernel had a delay of 100ms. however on device 
     143+        * testing showed that 10ms is enough 
     144+        */ 
     145+       mdelay(10); 
     146+ 
     147+       if (!IS_ERR(phy->base)) 
     148+               u2_phy_init(phy); 
     149+ 
     150+       /* print some status info */ 
     151+       t = rt_sysc_r32(RT_SYSC_REG_USB_PHY_CFG); 
     152+       dev_info(&phy->phy->dev, "remote usb device wakeup %s\n", 
     153+               (t & UDEV_WAKEUP) ? ("enabled") : ("disabled")); 
     154+       if (t & USB_PHY_UTMI_8B60M) 
     155+               dev_info(&phy->phy->dev, "UTMI 8bit 60MHz\n"); 
    83156+       else 
    84 +               rt_sysc_m32(phy_clk, 0, RT_SYSC_REG_CLKCFG1); 
    85 +       mdelay(100); 
    86 +} 
    87 + 
    88 +static int ralink_usb_phy_init(struct phy *_phy) 
    89 +{ 
     157+               dev_info(&phy->phy->dev, "UTMI 16bit 30MHz\n"); 
     158+ 
    90159+       return 0; 
    91160+} 
    92161+ 
    93 +static int ralink_usb_phy_exit(struct phy *_phy) 
    94 +{ 
     162+static int ralink_usb_phy_power_off(struct phy *_phy) 
     163+{ 
     164+       struct ralink_usb_phy *phy = phy_get_drvdata(_phy); 
     165+ 
     166+       /* assert the reset lines */ 
     167+       reset_control_assert(phy->rstdev); 
     168+       reset_control_assert(phy->rsthost); 
     169+ 
     170+       /* disable the phy */ 
     171+       rt_sysc_m32(phy->clk, 0, RT_SYSC_REG_CLKCFG1); 
     172+ 
    95173+       return 0; 
    96174+} 
    97175+ 
    98 +static int ralink_usb_phy_power_on(struct phy *_phy) 
    99 +{ 
    100 +       if (atomic_inc_return(&usb_pwr_ref) == 1) { 
    101 +               int host = 1; 
    102 +               u32 t; 
    103 + 
    104 +               usb_phy_enable(1); 
    105 + 
    106 +               if (host) { 
    107 +                       rt_sysc_m32(0, RT_SYSCFG1_USB0_HOST_MODE, RT_SYSC_REG_SYSCFG1); 
    108 +                       if (!IS_ERR(rsthost)) 
    109 +                               reset_control_deassert(rsthost); 
    110 +                       if (!IS_ERR(rstdev)) 
    111 +                               reset_control_deassert(rstdev); 
    112 +               } else { 
    113 +                       rt_sysc_m32(RT_SYSCFG1_USB0_HOST_MODE, 0, RT_SYSC_REG_SYSCFG1); 
    114 +                       if (!IS_ERR(rstdev)) 
    115 +                               reset_control_deassert(rstdev); 
    116 +               } 
    117 +               mdelay(100); 
    118 + 
    119 +               t = rt_sysc_r32(RT_SYSC_REG_USB_PHY_CFG); 
    120 +               dev_info(&_phy->dev, "remote usb device wakeup %s\n", 
    121 +                       (t & UDEV_WAKEUP) ? ("enabbled") : ("disabled")); 
    122 +               if (t & USB_PHY_UTMI_8B60M) 
    123 +                       dev_info(&_phy->dev, "UTMI 8bit 60MHz\n"); 
    124 +               else 
    125 +                       dev_info(&_phy->dev, "UTMI 16bit 30MHz\n"); 
    126 +       } 
    127 + 
    128 +       return 0; 
    129 +} 
    130 + 
    131 +static int ralink_usb_phy_power_off(struct phy *_phy) 
    132 +{ 
    133 +       if (atomic_dec_return(&usb_pwr_ref) == 0) { 
    134 +               usb_phy_enable(0); 
    135 +               if (!IS_ERR(rstdev)) 
    136 +                       reset_control_assert(rstdev); 
    137 +               if (!IS_ERR(rsthost)) 
    138 +                       reset_control_assert(rsthost); 
    139 +       } 
    140 + 
    141 +       return 0; 
    142 +} 
    143 + 
    144176+static struct phy_ops ralink_usb_phy_ops = { 
    145 +       .init           = ralink_usb_phy_init, 
    146 +       .exit           = ralink_usb_phy_exit, 
    147177+       .power_on       = ralink_usb_phy_power_on, 
    148178+       .power_off      = ralink_usb_phy_power_off, 
     
    150180+}; 
    151181+ 
    152 +static struct phy *ralink_usb_phy_xlate(struct device *dev, 
    153 +                                       struct of_phandle_args *args) 
    154 +{ 
    155 +       return rt_phy; 
    156 +} 
    157 + 
    158182+static const struct of_device_id ralink_usb_phy_of_match[] = { 
    159 +       { .compatible = "ralink,rt3xxx-usbphy", .data = (void *) (RT_CLKCFG1_UPHY1_CLK_EN | RT_CLKCFG1_UPHY0_CLK_EN) }, 
    160 +       { .compatible = "ralink,mt7620a-usbphy", .data = (void *) (MT7620_CLKCFG1_UPHY1_CLK_EN | MT7620_CLKCFG1_UPHY0_CLK_EN) }, 
     183+       { 
     184+               .compatible = "ralink,rt3xxx-usbphy", 
     185+               .data = (void *) (RT_CLKCFG1_UPHY1_CLK_EN | 
     186+                                 RT_CLKCFG1_UPHY0_CLK_EN) 
     187+       }, 
     188+       { 
     189+               .compatible = "ralink,mt7620a-usbphy", 
     190+               .data = (void *) (MT7620_CLKCFG1_UPHY1_CLK_EN | 
     191+                                 MT7620_CLKCFG1_UPHY0_CLK_EN) }, 
    161192+       { }, 
    162193+}; 
     
    165196+static int ralink_usb_phy_probe(struct platform_device *pdev) 
    166197+{ 
     198+       struct resource *res; 
    167199+       struct device *dev = &pdev->dev; 
    168200+       struct phy_provider *phy_provider; 
    169201+       const struct of_device_id *match; 
     202+       struct ralink_usb_phy *phy; 
     203+ 
     204+       phy = devm_kzalloc(dev, sizeof(*phy), GFP_KERNEL); 
     205+       if (!phy) 
     206+               return -ENOMEM; 
    170207+ 
    171208+       match = of_match_device(ralink_usb_phy_of_match, &pdev->dev); 
    172 +       phy_clk = (int) match->data; 
    173 + 
    174 +       rsthost = devm_reset_control_get(&pdev->dev, "host"); 
    175 +       rstdev = devm_reset_control_get(&pdev->dev, "device"); 
    176 + 
    177 +       rt_phy = devm_phy_create(dev, NULL, &ralink_usb_phy_ops, NULL); 
    178 +       if (IS_ERR(rt_phy)) { 
     209+       if (!match) 
     210+               return -ENODEV; 
     211+ 
     212+       phy->clk = (int) match->data; 
     213+ 
     214+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 
     215+       phy->base = devm_ioremap_resource(&pdev->dev, res); 
     216+ 
     217+       phy->rsthost = devm_reset_control_get(&pdev->dev, "host"); 
     218+       if (IS_ERR(phy->rsthost)) { 
     219+               dev_err(dev, "host reset is missing\n"); 
     220+               return PTR_ERR(phy->rsthost); 
     221+       } 
     222+ 
     223+       phy->rstdev = devm_reset_control_get(&pdev->dev, "device"); 
     224+       if (IS_ERR(phy->rstdev)) { 
     225+               dev_err(dev, "device reset is missing\n"); 
     226+               return PTR_ERR(phy->rstdev); 
     227+       } 
     228+ 
     229+       phy->phy = devm_phy_create(dev, NULL, &ralink_usb_phy_ops, NULL); 
     230+       if (IS_ERR(phy->phy)) { 
    179231+               dev_err(dev, "failed to create PHY\n"); 
    180 +               return PTR_ERR(rt_phy); 
    181 +       } 
    182 + 
    183 +       phy_provider = devm_of_phy_provider_register(dev, ralink_usb_phy_xlate); 
     232+               return PTR_ERR(phy->phy); 
     233+       } 
     234+       phy_set_drvdata(phy->phy, phy); 
     235+ 
     236+       phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate); 
    184237+ 
    185238+       return PTR_ERR_OR_ZERO(phy_provider); 
Note: See TracChangeset for help on using the changeset viewer.