[PATCH 2/2] clk: sunxi: Add support for the D1 CCU
Andre Przywara
andre.przywara at arm.com
Wed May 4 22:23:48 CEST 2022
On Sat, 30 Apr 2022 22:38:37 -0500
Samuel Holland <samuel at sholland.org> wrote:
Hi,
> Since the D1 CCU binding is defined, we can add support for its
> gates/resets, following the pattern of the existing drivers.
>
> Signed-off-by: Samuel Holland <samuel at sholland.org>
Compared against the manual, diff'ed the binding headers against Linux,
and hacked to be able to compile-test. Looks good to me:
Reviewed-by: Andre Przywara <andre.przywara at arm.com>
Cheers,
Andre
P.S. I will hold this back for now, as it wouldn't be used, but
consider it good to go when needed.
> ---
>
> drivers/clk/sunxi/Kconfig | 6 +
> drivers/clk/sunxi/Makefile | 1 +
> drivers/clk/sunxi/clk_d1.c | 101 ++++++++++++++
> include/dt-bindings/clock/sun20i-d1-ccu.h | 156 ++++++++++++++++++++++
> include/dt-bindings/reset/sun20i-d1-ccu.h | 77 +++++++++++
> 5 files changed, 341 insertions(+)
> create mode 100644 drivers/clk/sunxi/clk_d1.c
> create mode 100644 include/dt-bindings/clock/sun20i-d1-ccu.h
> create mode 100644 include/dt-bindings/reset/sun20i-d1-ccu.h
>
> diff --git a/drivers/clk/sunxi/Kconfig b/drivers/clk/sunxi/Kconfig
> index f19908113e..b8e0779092 100644
> --- a/drivers/clk/sunxi/Kconfig
> +++ b/drivers/clk/sunxi/Kconfig
> @@ -80,6 +80,12 @@ config CLK_SUN8I_H3
> This enables common clock driver support for platforms based
> on Allwinner H3/H5 SoC.
>
> +config CLK_SUN20I_D1
> + bool "Clock driver for Allwinner D1"
> + help
> + This enables common clock driver support for platforms based
> + on Allwinner D1 SoC.
> +
> config CLK_SUN50I_H6
> bool "Clock driver for Allwinner H6"
> default MACH_SUN50I_H6
> diff --git a/drivers/clk/sunxi/Makefile b/drivers/clk/sunxi/Makefile
> index 48a48a2f00..78fee96eae 100644
> --- a/drivers/clk/sunxi/Makefile
> +++ b/drivers/clk/sunxi/Makefile
> @@ -18,6 +18,7 @@ obj-$(CONFIG_CLK_SUN8I_R40) += clk_r40.o
> obj-$(CONFIG_CLK_SUN8I_V3S) += clk_v3s.o
> obj-$(CONFIG_CLK_SUN9I_A80) += clk_a80.o
> obj-$(CONFIG_CLK_SUN8I_H3) += clk_h3.o
> +obj-$(CONFIG_CLK_SUN20I_D1) += clk_d1.o
> obj-$(CONFIG_CLK_SUN50I_H6) += clk_h6.o
> obj-$(CONFIG_CLK_SUN50I_H6_R) += clk_h6_r.o
> obj-$(CONFIG_CLK_SUN50I_H616) += clk_h616.o
> diff --git a/drivers/clk/sunxi/clk_d1.c b/drivers/clk/sunxi/clk_d1.c
> new file mode 100644
> index 0000000000..9412b77a54
> --- /dev/null
> +++ b/drivers/clk/sunxi/clk_d1.c
> @@ -0,0 +1,101 @@
> +// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
> +/*
> + * Copyright (C) 2021 Samuel Holland <samuel at sholland.org>
> + */
> +
> +#include <common.h>
> +#include <clk-uclass.h>
> +#include <dm.h>
> +#include <errno.h>
> +#include <clk/sunxi.h>
> +#include <dt-bindings/clock/sun20i-d1-ccu.h>
> +#include <dt-bindings/reset/sun20i-d1-ccu.h>
> +#include <linux/bitops.h>
> +
> +static struct ccu_clk_gate d1_gates[] = {
> + [CLK_BUS_MMC0] = GATE(0x84c, BIT(0)),
> + [CLK_BUS_MMC1] = GATE(0x84c, BIT(1)),
> + [CLK_BUS_MMC2] = GATE(0x84c, BIT(2)),
> + [CLK_BUS_UART0] = GATE(0x90c, BIT(0)),
> + [CLK_BUS_UART1] = GATE(0x90c, BIT(1)),
> + [CLK_BUS_UART2] = GATE(0x90c, BIT(2)),
> + [CLK_BUS_UART3] = GATE(0x90c, BIT(3)),
> + [CLK_BUS_UART4] = GATE(0x90c, BIT(4)),
> + [CLK_BUS_UART5] = GATE(0x90c, BIT(5)),
> + [CLK_BUS_I2C0] = GATE(0x91c, BIT(0)),
> + [CLK_BUS_I2C1] = GATE(0x91c, BIT(1)),
> + [CLK_BUS_I2C2] = GATE(0x91c, BIT(2)),
> + [CLK_BUS_I2C3] = GATE(0x91c, BIT(3)),
> + [CLK_SPI0] = GATE(0x940, BIT(31)),
> + [CLK_SPI1] = GATE(0x944, BIT(31)),
> + [CLK_BUS_SPI0] = GATE(0x96c, BIT(0)),
> + [CLK_BUS_SPI1] = GATE(0x96c, BIT(1)),
> +
> + [CLK_BUS_EMAC] = GATE(0x97c, BIT(0)),
> +
> + [CLK_USB_OHCI0] = GATE(0xa70, BIT(31)),
> + [CLK_USB_OHCI1] = GATE(0xa74, BIT(31)),
> + [CLK_BUS_OHCI0] = GATE(0xa8c, BIT(0)),
> + [CLK_BUS_OHCI1] = GATE(0xa8c, BIT(1)),
> + [CLK_BUS_EHCI0] = GATE(0xa8c, BIT(4)),
> + [CLK_BUS_EHCI1] = GATE(0xa8c, BIT(5)),
> + [CLK_BUS_OTG] = GATE(0xa8c, BIT(8)),
> + [CLK_BUS_LRADC] = GATE(0xa9c, BIT(0)),
> +
> + [CLK_RISCV] = GATE(0xd04, BIT(31)),
> +};
> +
> +static struct ccu_reset d1_resets[] = {
> + [RST_BUS_MMC0] = RESET(0x84c, BIT(16)),
> + [RST_BUS_MMC1] = RESET(0x84c, BIT(17)),
> + [RST_BUS_MMC2] = RESET(0x84c, BIT(18)),
> + [RST_BUS_UART0] = RESET(0x90c, BIT(16)),
> + [RST_BUS_UART1] = RESET(0x90c, BIT(17)),
> + [RST_BUS_UART2] = RESET(0x90c, BIT(18)),
> + [RST_BUS_UART3] = RESET(0x90c, BIT(19)),
> + [RST_BUS_UART4] = RESET(0x90c, BIT(20)),
> + [RST_BUS_UART5] = RESET(0x90c, BIT(21)),
> + [RST_BUS_I2C0] = RESET(0x91c, BIT(16)),
> + [RST_BUS_I2C1] = RESET(0x91c, BIT(17)),
> + [RST_BUS_I2C2] = RESET(0x91c, BIT(18)),
> + [RST_BUS_I2C3] = RESET(0x91c, BIT(19)),
> + [RST_BUS_SPI0] = RESET(0x96c, BIT(16)),
> + [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_BUS_OHCI0] = RESET(0xa8c, BIT(16)),
> + [RST_BUS_OHCI1] = RESET(0xa8c, BIT(17)),
> + [RST_BUS_EHCI0] = RESET(0xa8c, BIT(20)),
> + [RST_BUS_EHCI1] = RESET(0xa8c, BIT(21)),
> + [RST_BUS_OTG] = RESET(0xa8c, BIT(24)),
> + [RST_BUS_LRADC] = RESET(0xa9c, BIT(16)),
> +};
> +
> +static const struct ccu_desc d1_ccu_desc = {
> + .gates = d1_gates,
> + .resets = d1_resets,
> +};
> +
> +static int d1_clk_bind(struct udevice *dev)
> +{
> + return sunxi_reset_bind(dev, ARRAY_SIZE(d1_resets));
> +}
> +
> +static const struct udevice_id d1_ccu_ids[] = {
> + { .compatible = "allwinner,sun20i-d1-ccu",
> + .data = (ulong)&d1_ccu_desc },
> + { }
> +};
> +
> +U_BOOT_DRIVER(clk_sun20i_d1) = {
> + .name = "sun20i_d1_ccu",
> + .id = UCLASS_CLK,
> + .of_match = d1_ccu_ids,
> + .priv_auto = sizeof(struct ccu_priv),
> + .ops = &sunxi_clk_ops,
> + .probe = sunxi_clk_probe,
> + .bind = d1_clk_bind,
> +};
> diff --git a/include/dt-bindings/clock/sun20i-d1-ccu.h b/include/dt-bindings/clock/sun20i-d1-ccu.h
> new file mode 100644
> index 0000000000..e3ac53315e
> --- /dev/null
> +++ b/include/dt-bindings/clock/sun20i-d1-ccu.h
> @@ -0,0 +1,156 @@
> +/* SPDX-License-Identifier: (GPL-2.0+ or MIT) */
> +/*
> + * Copyright (C) 2020 huangzhenwei at allwinnertech.com
> + * Copyright (C) 2021 Samuel Holland <samuel at sholland.org>
> + */
> +
> +#ifndef _DT_BINDINGS_CLK_SUN20I_D1_CCU_H_
> +#define _DT_BINDINGS_CLK_SUN20I_D1_CCU_H_
> +
> +#define CLK_PLL_CPUX 0
> +#define CLK_PLL_DDR0 1
> +#define CLK_PLL_PERIPH0_4X 2
> +#define CLK_PLL_PERIPH0_2X 3
> +#define CLK_PLL_PERIPH0_800M 4
> +#define CLK_PLL_PERIPH0 5
> +#define CLK_PLL_PERIPH0_DIV3 6
> +#define CLK_PLL_VIDEO0_4X 7
> +#define CLK_PLL_VIDEO0_2X 8
> +#define CLK_PLL_VIDEO0 9
> +#define CLK_PLL_VIDEO1_4X 10
> +#define CLK_PLL_VIDEO1_2X 11
> +#define CLK_PLL_VIDEO1 12
> +#define CLK_PLL_VE 13
> +#define CLK_PLL_AUDIO0_4X 14
> +#define CLK_PLL_AUDIO0_2X 15
> +#define CLK_PLL_AUDIO0 16
> +#define CLK_PLL_AUDIO1 17
> +#define CLK_PLL_AUDIO1_DIV2 18
> +#define CLK_PLL_AUDIO1_DIV5 19
> +#define CLK_CPUX 20
> +#define CLK_CPUX_AXI 21
> +#define CLK_CPUX_APB 22
> +#define CLK_PSI_AHB 23
> +#define CLK_APB0 24
> +#define CLK_APB1 25
> +#define CLK_MBUS 26
> +#define CLK_DE 27
> +#define CLK_BUS_DE 28
> +#define CLK_DI 29
> +#define CLK_BUS_DI 30
> +#define CLK_G2D 31
> +#define CLK_BUS_G2D 32
> +#define CLK_CE 33
> +#define CLK_BUS_CE 34
> +#define CLK_VE 35
> +#define CLK_BUS_VE 36
> +#define CLK_BUS_DMA 37
> +#define CLK_BUS_MSGBOX0 38
> +#define CLK_BUS_MSGBOX1 39
> +#define CLK_BUS_MSGBOX2 40
> +#define CLK_BUS_SPINLOCK 41
> +#define CLK_BUS_HSTIMER 42
> +#define CLK_AVS 43
> +#define CLK_BUS_DBG 44
> +#define CLK_BUS_PWM 45
> +#define CLK_BUS_IOMMU 46
> +#define CLK_DRAM 47
> +#define CLK_MBUS_DMA 48
> +#define CLK_MBUS_VE 49
> +#define CLK_MBUS_CE 50
> +#define CLK_MBUS_TVIN 51
> +#define CLK_MBUS_CSI 52
> +#define CLK_MBUS_G2D 53
> +#define CLK_MBUS_RISCV 54
> +#define CLK_BUS_DRAM 55
> +#define CLK_MMC0 56
> +#define CLK_MMC1 57
> +#define CLK_MMC2 58
> +#define CLK_BUS_MMC0 59
> +#define CLK_BUS_MMC1 60
> +#define CLK_BUS_MMC2 61
> +#define CLK_BUS_UART0 62
> +#define CLK_BUS_UART1 63
> +#define CLK_BUS_UART2 64
> +#define CLK_BUS_UART3 65
> +#define CLK_BUS_UART4 66
> +#define CLK_BUS_UART5 67
> +#define CLK_BUS_I2C0 68
> +#define CLK_BUS_I2C1 69
> +#define CLK_BUS_I2C2 70
> +#define CLK_BUS_I2C3 71
> +#define CLK_SPI0 72
> +#define CLK_SPI1 73
> +#define CLK_BUS_SPI0 74
> +#define CLK_BUS_SPI1 75
> +#define CLK_EMAC_25M 76
> +#define CLK_BUS_EMAC 77
> +#define CLK_IR_TX 78
> +#define CLK_BUS_IR_TX 79
> +#define CLK_BUS_GPADC 80
> +#define CLK_BUS_THS 81
> +#define CLK_I2S0 82
> +#define CLK_I2S1 83
> +#define CLK_I2S2 84
> +#define CLK_I2S2_ASRC 85
> +#define CLK_BUS_I2S0 86
> +#define CLK_BUS_I2S1 87
> +#define CLK_BUS_I2S2 88
> +#define CLK_SPDIF_TX 89
> +#define CLK_SPDIF_RX 90
> +#define CLK_BUS_SPDIF 91
> +#define CLK_DMIC 92
> +#define CLK_BUS_DMIC 93
> +#define CLK_AUDIO_DAC 94
> +#define CLK_AUDIO_ADC 95
> +#define CLK_BUS_AUDIO 96
> +#define CLK_USB_OHCI0 97
> +#define CLK_USB_OHCI1 98
> +#define CLK_BUS_OHCI0 99
> +#define CLK_BUS_OHCI1 100
> +#define CLK_BUS_EHCI0 101
> +#define CLK_BUS_EHCI1 102
> +#define CLK_BUS_OTG 103
> +#define CLK_BUS_LRADC 104
> +#define CLK_BUS_DPSS_TOP 105
> +#define CLK_HDMI_24M 106
> +#define CLK_HDMI_CEC_32K 107
> +#define CLK_HDMI_CEC 108
> +#define CLK_BUS_HDMI 109
> +#define CLK_MIPI_DSI 110
> +#define CLK_BUS_MIPI_DSI 111
> +#define CLK_TCON_LCD0 112
> +#define CLK_BUS_TCON_LCD0 113
> +#define CLK_TCON_TV 114
> +#define CLK_BUS_TCON_TV 115
> +#define CLK_TVE 116
> +#define CLK_BUS_TVE_TOP 117
> +#define CLK_BUS_TVE 118
> +#define CLK_TVD 119
> +#define CLK_BUS_TVD_TOP 120
> +#define CLK_BUS_TVD 121
> +#define CLK_LEDC 122
> +#define CLK_BUS_LEDC 123
> +#define CLK_CSI_TOP 124
> +#define CLK_CSI_MCLK 125
> +#define CLK_BUS_CSI 126
> +#define CLK_TPADC 127
> +#define CLK_BUS_TPADC 128
> +#define CLK_BUS_TZMA 129
> +#define CLK_DSP 130
> +#define CLK_BUS_DSP_CFG 131
> +#define CLK_RISCV 132
> +#define CLK_RISCV_AXI 133
> +#define CLK_BUS_RISCV_CFG 134
> +#define CLK_FANOUT_24M 135
> +#define CLK_FANOUT_12M 136
> +#define CLK_FANOUT_16M 137
> +#define CLK_FANOUT_25M 138
> +#define CLK_FANOUT_32K 139
> +#define CLK_FANOUT_27M 140
> +#define CLK_FANOUT_PCLK 141
> +#define CLK_FANOUT0 142
> +#define CLK_FANOUT1 143
> +#define CLK_FANOUT2 144
> +
> +#endif /* _DT_BINDINGS_CLK_SUN20I_D1_CCU_H_ */
> diff --git a/include/dt-bindings/reset/sun20i-d1-ccu.h b/include/dt-bindings/reset/sun20i-d1-ccu.h
> new file mode 100644
> index 0000000000..de9ff52032
> --- /dev/null
> +++ b/include/dt-bindings/reset/sun20i-d1-ccu.h
> @@ -0,0 +1,77 @@
> +/* SPDX-License-Identifier: (GPL-2.0+ or MIT) */
> +/*
> + * Copyright (c) 2020 huangzhenwei at allwinnertech.com
> + * Copyright (C) 2021 Samuel Holland <samuel at sholland.org>
> + */
> +
> +#ifndef _DT_BINDINGS_RST_SUN20I_D1_CCU_H_
> +#define _DT_BINDINGS_RST_SUN20I_D1_CCU_H_
> +
> +#define RST_MBUS 0
> +#define RST_BUS_DE 1
> +#define RST_BUS_DI 2
> +#define RST_BUS_G2D 3
> +#define RST_BUS_CE 4
> +#define RST_BUS_VE 5
> +#define RST_BUS_DMA 6
> +#define RST_BUS_MSGBOX0 7
> +#define RST_BUS_MSGBOX1 8
> +#define RST_BUS_MSGBOX2 9
> +#define RST_BUS_SPINLOCK 10
> +#define RST_BUS_HSTIMER 11
> +#define RST_BUS_DBG 12
> +#define RST_BUS_PWM 13
> +#define RST_BUS_DRAM 14
> +#define RST_BUS_MMC0 15
> +#define RST_BUS_MMC1 16
> +#define RST_BUS_MMC2 17
> +#define RST_BUS_UART0 18
> +#define RST_BUS_UART1 19
> +#define RST_BUS_UART2 20
> +#define RST_BUS_UART3 21
> +#define RST_BUS_UART4 22
> +#define RST_BUS_UART5 23
> +#define RST_BUS_I2C0 24
> +#define RST_BUS_I2C1 25
> +#define RST_BUS_I2C2 26
> +#define RST_BUS_I2C3 27
> +#define RST_BUS_SPI0 28
> +#define RST_BUS_SPI1 29
> +#define RST_BUS_EMAC 30
> +#define RST_BUS_IR_TX 31
> +#define RST_BUS_GPADC 32
> +#define RST_BUS_THS 33
> +#define RST_BUS_I2S0 34
> +#define RST_BUS_I2S1 35
> +#define RST_BUS_I2S2 36
> +#define RST_BUS_SPDIF 37
> +#define RST_BUS_DMIC 38
> +#define RST_BUS_AUDIO 39
> +#define RST_USB_PHY0 40
> +#define RST_USB_PHY1 41
> +#define RST_BUS_OHCI0 42
> +#define RST_BUS_OHCI1 43
> +#define RST_BUS_EHCI0 44
> +#define RST_BUS_EHCI1 45
> +#define RST_BUS_OTG 46
> +#define RST_BUS_LRADC 47
> +#define RST_BUS_DPSS_TOP 48
> +#define RST_BUS_HDMI_SUB 49
> +#define RST_BUS_HDMI_MAIN 50
> +#define RST_BUS_MIPI_DSI 51
> +#define RST_BUS_TCON_LCD0 52
> +#define RST_BUS_TCON_TV 53
> +#define RST_BUS_LVDS0 54
> +#define RST_BUS_TVE 55
> +#define RST_BUS_TVE_TOP 56
> +#define RST_BUS_TVD 57
> +#define RST_BUS_TVD_TOP 58
> +#define RST_BUS_LEDC 59
> +#define RST_BUS_CSI 60
> +#define RST_BUS_TPADC 61
> +#define RST_DSP 62
> +#define RST_BUS_DSP_CFG 63
> +#define RST_BUS_DSP_DBG 64
> +#define RST_BUS_RISCV_CFG 65
> +
> +#endif /* _DT_BINDINGS_RST_SUN20I_D1_CCU_H_ */
More information about the U-Boot
mailing list