From 10cfbaabc159e475861229d9b5e95b3d96168215 Mon Sep 17 00:00:00 2001 From: Andre Przywara Date: Sun, 23 Jun 2019 15:09:46 +0100 Subject: sunxi: move SUNXI_GPIO to Kconfig Probably for no particular reason SUNXI_GPIO was still defined the "old way", in header files only. Introduce SUNXI_GPIO to the Kconfig file in drivers/gpio to remove another line from our dreadful config_whitelist.txt. Signed-off-by: Andre Przywara Tested-by: Corentin Labbe # Pine-H64 Reviewed-by: Jagan Teki --- drivers/gpio/Kconfig | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'drivers') diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig index fa1c99700f7..4532ed32110 100644 --- a/drivers/gpio/Kconfig +++ b/drivers/gpio/Kconfig @@ -215,6 +215,12 @@ config SANDBOX_GPIO_COUNT of 'anonymous' GPIOs that do not belong to any device or bank. Select a suitable value depending on your needs. +config SUNXI_GPIO + bool "Allwinner GPIO driver" + depends on ARCH_SUNXI + help + Support the GPIO device in Allwinner SoCs. + config XILINX_GPIO bool "Xilinx GPIO driver" depends on DM_GPIO -- cgit v1.3.1 From 0d3c77f5c3527090019eaff0ddbfc8d25b4c2959 Mon Sep 17 00:00:00 2001 From: Andre Przywara Date: Sun, 23 Jun 2019 15:09:47 +0100 Subject: sunxi: gpio: Enable support for H6 pin controller The Allwinner H6 pin controller is not really special, at least not when it comes to normal GPIO operation. Add the H6 compatible strings to the list of recognised strings, to make GPIOs work for H6 boards. Signed-off-by: Andre Przywara Tested-by: Corentin Labbe # Pine-H64 Reviewed-by: Jagan Teki --- drivers/gpio/sunxi_gpio.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'drivers') diff --git a/drivers/gpio/sunxi_gpio.c b/drivers/gpio/sunxi_gpio.c index cbed8d42b77..719efc2cef0 100644 --- a/drivers/gpio/sunxi_gpio.c +++ b/drivers/gpio/sunxi_gpio.c @@ -354,12 +354,14 @@ static const struct udevice_id sunxi_gpio_ids[] = { ID("allwinner,sun8i-v3s-pinctrl", a_all), ID("allwinner,sun9i-a80-pinctrl", a_all), ID("allwinner,sun50i-a64-pinctrl", a_all), + ID("allwinner,sun50i-h6-pinctrl", a_all), ID("allwinner,sun6i-a31-r-pinctrl", l_2), ID("allwinner,sun8i-a23-r-pinctrl", l_1), ID("allwinner,sun8i-a83t-r-pinctrl", l_1), ID("allwinner,sun8i-h3-r-pinctrl", l_1), ID("allwinner,sun9i-a80-r-pinctrl", l_3), ID("allwinner,sun50i-a64-r-pinctrl", l_1), + ID("allwinner,sun50i-h6-r-pinctrl", l_2), { } }; -- cgit v1.3.1 From 106c1300a5a54c61d9368e5afdb5282e7e4ef3d8 Mon Sep 17 00:00:00 2001 From: Andre Przywara Date: Sun, 23 Jun 2019 15:09:48 +0100 Subject: sunxi: clocks: Add H6 USB clock gates and resets To enable USB support in U-Boot, add the required clock and reset gates to the H6 clock driver. Once enabled, the generic EHCI/OCHI drivers will pick them up from there automatically. Signed-off-by: Andre Przywara Tested-by: Corentin Labbe # Pine-H64 Reviewed-by: Jagan Teki --- drivers/clk/sunxi/clk_h6.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'drivers') diff --git a/drivers/clk/sunxi/clk_h6.c b/drivers/clk/sunxi/clk_h6.c index 0bb00f449ac..105c15d8694 100644 --- a/drivers/clk/sunxi/clk_h6.c +++ b/drivers/clk/sunxi/clk_h6.c @@ -28,6 +28,22 @@ static struct ccu_clk_gate h6_gates[] = { [CLK_BUS_SPI1] = GATE(0x96c, BIT(1)), [CLK_BUS_EMAC] = GATE(0x97c, BIT(0)), + + [CLK_USB_PHY0] = GATE(0xa70, BIT(29)), + [CLK_USB_OHCI0] = GATE(0xa70, BIT(31)), + + [CLK_USB_PHY1] = GATE(0xa74, BIT(29)), + + [CLK_USB_HSIC] = GATE(0xa7c, BIT(26)), + [CLK_USB_HSIC_12M] = GATE(0xa7c, BIT(27)), + [CLK_USB_PHY3] = GATE(0xa7c, BIT(29)), + [CLK_USB_OHCI3] = GATE(0xa7c, BIT(31)), + + [CLK_BUS_OHCI0] = GATE(0xa8c, BIT(0)), + [CLK_BUS_OHCI3] = GATE(0xa8c, BIT(3)), + [CLK_BUS_EHCI0] = GATE(0xa8c, BIT(4)), + [CLK_BUS_EHCI3] = GATE(0xa8c, BIT(7)), + [CLK_BUS_OTG] = GATE(0xa8c, BIT(8)), }; static struct ccu_reset h6_resets[] = { @@ -43,6 +59,19 @@ static struct ccu_reset h6_resets[] = { [RST_BUS_SPI1] = RESET(0x96c, BIT(17)), [RST_BUS_EMAC] = RESET(0x97c, BIT(16)), + + [RST_USB_PHY0] = RESET(0xa70, BIT(30)), + + [RST_USB_PHY1] = RESET(0xa74, BIT(30)), + + [RST_USB_HSIC] = RESET(0xa7c, BIT(28)), + [RST_USB_PHY3] = RESET(0xa7c, BIT(30)), + + [RST_BUS_OHCI0] = RESET(0xa8c, BIT(16)), + [RST_BUS_OHCI3] = RESET(0xa8c, BIT(19)), + [RST_BUS_EHCI0] = RESET(0xa8c, BIT(20)), + [RST_BUS_EHCI3] = RESET(0xa8c, BIT(23)), + [RST_BUS_OTG] = RESET(0xa8c, BIT(24)), }; static const struct ccu_desc h6_ccu_desc = { -- cgit v1.3.1 From 35fa673e0e5f9e947f0bae9d170bd9c8b449a751 Mon Sep 17 00:00:00 2001 From: Andre Przywara Date: Sun, 23 Jun 2019 15:09:49 +0100 Subject: sunxi: phy: Add USB PHY support for Allwinner H6 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 Tested-by: Corentin Labbe # Pine-H64 Reviewed-by: Jagan Teki --- drivers/phy/allwinner/phy-sun4i-usb.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'drivers') diff --git a/drivers/phy/allwinner/phy-sun4i-usb.c b/drivers/phy/allwinner/phy-sun4i-usb.c index f206fa3f5d4..5e8f87717f8 100644 --- a/drivers/phy/allwinner/phy-sun4i-usb.c +++ b/drivers/phy/allwinner/phy-sun4i-usb.c @@ -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}, { } }; -- cgit v1.3.1