sunxi: phy: Add USB PHY support for Allwinner H6
authorAndre Przywara <andre.przywara@arm.com>
Sun, 23 Jun 2019 14:09:49 +0000 (15:09 +0100)
committerJagan Teki <jagan@amarulasolutions.com>
Tue, 16 Jul 2019 11:43:15 +0000 (17:13 +0530)
The USB PHY used in the Allwinner H6 SoC has some pecularities (as usual),
which require a small addition to the USB PHY driver:
In this case the second PHY is PHY3, not PHY1, so we need to skip number
1 and 2 in the code. Just use the respective code from Linux for that.

Signed-off-by: Andre Przywara <andre.przywara@arm.com>
Tested-by: Corentin Labbe <clabbe.montjoie@gmail.com> # Pine-H64
Reviewed-by: Jagan Teki <jagan@amarulasolutions.com>
drivers/phy/allwinner/phy-sun4i-usb.c

index f206fa3f5d48250512c89881bf20ddf4860f9c37..5e8f87717f8f59874ad6b6d472a8762b7011bfb9 100644 (file)
@@ -75,6 +75,7 @@ enum sun4i_usb_phy_type {
        sun8i_h3_phy,
        sun8i_v3s_phy,
        sun50i_a64_phy,
+       sun50i_h6_phy,
 };
 
 struct sun4i_usb_phy_cfg {
@@ -85,6 +86,7 @@ struct sun4i_usb_phy_cfg {
        bool dedicated_clocks;
        bool enable_pmu_unk1;
        bool phy0_dual_route;
+       int missing_phys;
 };
 
 struct sun4i_usb_phy_info {
@@ -349,6 +351,9 @@ static int sun4i_usb_phy_xlate(struct phy *phy,
        if (args->args_count >= data->cfg->num_phys)
                return -EINVAL;
 
+       if (data->cfg->missing_phys & BIT(args->args[0]))
+               return -ENODEV;
+
        if (args->args_count)
                phy->id = args->args[0];
        else
@@ -429,6 +434,9 @@ static int sun4i_usb_phy_probe(struct udevice *dev)
                struct sun4i_usb_phy_info *info = &phy_info[i];
                char name[16];
 
+               if (data->cfg->missing_phys & BIT(i))
+                       continue;
+
                phy->gpio_vbus = sunxi_name_to_gpio(info->gpio_vbus);
                if (phy->gpio_vbus >= 0) {
                        ret = gpio_request(phy->gpio_vbus, "usb_vbus");
@@ -583,6 +591,17 @@ static const struct sun4i_usb_phy_cfg sun50i_a64_cfg = {
        .phy0_dual_route = true,
 };
 
+static const struct sun4i_usb_phy_cfg sun50i_h6_cfg = {
+       .num_phys = 4,
+       .type = sun50i_h6_phy,
+       .disc_thresh = 3,
+       .phyctl_offset = REG_PHYCTL_A33,
+       .dedicated_clocks = true,
+       .enable_pmu_unk1 = true,
+       .phy0_dual_route = true,
+       .missing_phys = BIT(1) | BIT(2),
+};
+
 static const struct udevice_id sun4i_usb_phy_ids[] = {
        { .compatible = "allwinner,sun4i-a10-usb-phy", .data = (ulong)&sun4i_a10_cfg },
        { .compatible = "allwinner,sun5i-a13-usb-phy", .data = (ulong)&sun5i_a13_cfg },
@@ -594,6 +613,7 @@ static const struct udevice_id sun4i_usb_phy_ids[] = {
        { .compatible = "allwinner,sun8i-h3-usb-phy", .data = (ulong)&sun8i_h3_cfg },
        { .compatible = "allwinner,sun8i-v3s-usb-phy", .data = (ulong)&sun8i_v3s_cfg },
        { .compatible = "allwinner,sun50i-a64-usb-phy", .data = (ulong)&sun50i_a64_cfg},
+       { .compatible = "allwinner,sun50i-h6-usb-phy", .data = (ulong)&sun50i_h6_cfg},
        { }
 };