178eb2a41SJagan Teki // SPDX-License-Identifier: (GPL-2.0+ OR MIT) 278eb2a41SJagan Teki /* 378eb2a41SJagan Teki * Copyright (C) 2018 Amarula Solutions. 478eb2a41SJagan Teki * Author: Jagan Teki <jagan@amarulasolutions.com> 578eb2a41SJagan Teki */ 678eb2a41SJagan Teki 778eb2a41SJagan Teki #include <common.h> 878eb2a41SJagan Teki #include <clk-uclass.h> 978eb2a41SJagan Teki #include <dm.h> 1078eb2a41SJagan Teki #include <errno.h> 1178eb2a41SJagan Teki #include <asm/arch/ccu.h> 1278eb2a41SJagan Teki #include <dt-bindings/clock/sun8i-r40-ccu.h> 1378eb2a41SJagan Teki #include <dt-bindings/reset/sun8i-r40-ccu.h> 1478eb2a41SJagan Teki 1578eb2a41SJagan Teki static struct ccu_clk_gate r40_gates[] = { 1678eb2a41SJagan Teki [CLK_BUS_OTG] = GATE(0x060, BIT(25)), 1778eb2a41SJagan Teki [CLK_BUS_EHCI0] = GATE(0x060, BIT(26)), 1878eb2a41SJagan Teki [CLK_BUS_EHCI1] = GATE(0x060, BIT(27)), 1978eb2a41SJagan Teki [CLK_BUS_EHCI2] = GATE(0x060, BIT(28)), 2078eb2a41SJagan Teki [CLK_BUS_OHCI0] = GATE(0x060, BIT(29)), 2178eb2a41SJagan Teki [CLK_BUS_OHCI1] = GATE(0x060, BIT(30)), 2278eb2a41SJagan Teki [CLK_BUS_OHCI2] = GATE(0x060, BIT(31)), 2378eb2a41SJagan Teki 244acc7119SJagan Teki [CLK_BUS_UART0] = GATE(0x06c, BIT(16)), 254acc7119SJagan Teki [CLK_BUS_UART1] = GATE(0x06c, BIT(17)), 264acc7119SJagan Teki [CLK_BUS_UART2] = GATE(0x06c, BIT(18)), 274acc7119SJagan Teki [CLK_BUS_UART3] = GATE(0x06c, BIT(19)), 284acc7119SJagan Teki [CLK_BUS_UART4] = GATE(0x06c, BIT(20)), 294acc7119SJagan Teki [CLK_BUS_UART5] = GATE(0x06c, BIT(21)), 304acc7119SJagan Teki [CLK_BUS_UART6] = GATE(0x06c, BIT(22)), 314acc7119SJagan Teki [CLK_BUS_UART7] = GATE(0x06c, BIT(23)), 324acc7119SJagan Teki 3378eb2a41SJagan Teki [CLK_USB_PHY0] = GATE(0x0cc, BIT(8)), 3478eb2a41SJagan Teki [CLK_USB_PHY1] = GATE(0x0cc, BIT(9)), 3578eb2a41SJagan Teki [CLK_USB_PHY2] = GATE(0x0cc, BIT(10)), 3678eb2a41SJagan Teki [CLK_USB_OHCI0] = GATE(0x0cc, BIT(16)), 3778eb2a41SJagan Teki [CLK_USB_OHCI1] = GATE(0x0cc, BIT(17)), 3878eb2a41SJagan Teki [CLK_USB_OHCI2] = GATE(0x0cc, BIT(18)), 3978eb2a41SJagan Teki }; 4078eb2a41SJagan Teki 4178eb2a41SJagan Teki static struct ccu_reset r40_resets[] = { 4278eb2a41SJagan Teki [RST_USB_PHY0] = RESET(0x0cc, BIT(0)), 4378eb2a41SJagan Teki [RST_USB_PHY1] = RESET(0x0cc, BIT(1)), 4478eb2a41SJagan Teki [RST_USB_PHY2] = RESET(0x0cc, BIT(2)), 4578eb2a41SJagan Teki 4678eb2a41SJagan Teki [RST_BUS_OTG] = RESET(0x2c0, BIT(25)), 4778eb2a41SJagan Teki [RST_BUS_EHCI0] = RESET(0x2c0, BIT(26)), 4878eb2a41SJagan Teki [RST_BUS_EHCI1] = RESET(0x2c0, BIT(27)), 4978eb2a41SJagan Teki [RST_BUS_EHCI2] = RESET(0x2c0, BIT(28)), 5078eb2a41SJagan Teki [RST_BUS_OHCI0] = RESET(0x2c0, BIT(29)), 5178eb2a41SJagan Teki [RST_BUS_OHCI1] = RESET(0x2c0, BIT(30)), 5278eb2a41SJagan Teki [RST_BUS_OHCI2] = RESET(0x2c0, BIT(31)), 53*8606f960SJagan Teki 54*8606f960SJagan Teki [RST_BUS_UART0] = RESET(0x2d8, BIT(16)), 55*8606f960SJagan Teki [RST_BUS_UART1] = RESET(0x2d8, BIT(17)), 56*8606f960SJagan Teki [RST_BUS_UART2] = RESET(0x2d8, BIT(18)), 57*8606f960SJagan Teki [RST_BUS_UART3] = RESET(0x2d8, BIT(19)), 58*8606f960SJagan Teki [RST_BUS_UART4] = RESET(0x2d8, BIT(20)), 59*8606f960SJagan Teki [RST_BUS_UART5] = RESET(0x2d8, BIT(21)), 60*8606f960SJagan Teki [RST_BUS_UART6] = RESET(0x2d8, BIT(22)), 61*8606f960SJagan Teki [RST_BUS_UART7] = RESET(0x2d8, BIT(23)), 6278eb2a41SJagan Teki }; 6378eb2a41SJagan Teki 6478eb2a41SJagan Teki static const struct ccu_desc r40_ccu_desc = { 6578eb2a41SJagan Teki .gates = r40_gates, 6678eb2a41SJagan Teki .resets = r40_resets, 6778eb2a41SJagan Teki }; 6878eb2a41SJagan Teki 6978eb2a41SJagan Teki static int r40_clk_bind(struct udevice *dev) 7078eb2a41SJagan Teki { 7178eb2a41SJagan Teki return sunxi_reset_bind(dev, ARRAY_SIZE(r40_resets)); 7278eb2a41SJagan Teki } 7378eb2a41SJagan Teki 7478eb2a41SJagan Teki static const struct udevice_id r40_clk_ids[] = { 7578eb2a41SJagan Teki { .compatible = "allwinner,sun8i-r40-ccu", 7678eb2a41SJagan Teki .data = (ulong)&r40_ccu_desc }, 7778eb2a41SJagan Teki { } 7878eb2a41SJagan Teki }; 7978eb2a41SJagan Teki 8078eb2a41SJagan Teki U_BOOT_DRIVER(clk_sun8i_r40) = { 8178eb2a41SJagan Teki .name = "sun8i_r40_ccu", 8278eb2a41SJagan Teki .id = UCLASS_CLK, 8378eb2a41SJagan Teki .of_match = r40_clk_ids, 8478eb2a41SJagan Teki .priv_auto_alloc_size = sizeof(struct ccu_priv), 8578eb2a41SJagan Teki .ops = &sunxi_clk_ops, 8678eb2a41SJagan Teki .probe = sunxi_clk_probe, 8778eb2a41SJagan Teki .bind = r40_clk_bind, 8878eb2a41SJagan Teki }; 89