u-boot/drivers/clk/sunxi/clk_f1c100s.c
Samuel Holland 49b2b0a2b6 clk: sunxi: Store the array sizes in the CCU descriptor
The reset array size is currently used for bounds checking in the reset
driver. The same bounds check should really be done in the clock driver.

Currently, the array size is provided to the reset driver separately
from the CCU descriptor, which is a bit strange. Let's do this the usual
way, with the array sizes next to the arrays themselves.

Signed-off-by: Samuel Holland <samuel@sholland.org>
Reviewed-by: Andre Przywara <andre.przywara@arm.com>
[Andre: add F1C100s support]
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
2022-07-18 09:37:49 +01:00

76 lines
2.1 KiB
C

// SPDX-License-Identifier: (GPL-2.0+)
/*
* Copyright (C) 2019 George Hilliard <thirtythreeforty@gmail.com>.
*/
#include <common.h>
#include <clk-uclass.h>
#include <dm.h>
#include <errno.h>
#include <clk/sunxi.h>
#include <dt-bindings/clock/suniv-ccu-f1c100s.h>
#include <dt-bindings/reset/suniv-ccu-f1c100s.h>
static struct ccu_clk_gate f1c100s_gates[] = {
[CLK_BUS_MMC0] = GATE(0x060, BIT(8)),
[CLK_BUS_MMC1] = GATE(0x060, BIT(9)),
[CLK_BUS_SPI0] = GATE(0x060, BIT(20)),
[CLK_BUS_SPI1] = GATE(0x060, BIT(21)),
[CLK_BUS_OTG] = GATE(0x060, BIT(24)),
[CLK_BUS_I2C0] = GATE(0x068, BIT(16)),
[CLK_BUS_I2C1] = GATE(0x068, BIT(17)),
[CLK_BUS_I2C2] = GATE(0x068, BIT(18)),
[CLK_BUS_PIO] = GATE(0x068, BIT(19)),
[CLK_BUS_UART0] = GATE(0x06c, BIT(20)),
[CLK_BUS_UART1] = GATE(0x06c, BIT(21)),
[CLK_BUS_UART2] = GATE(0x06c, BIT(22)),
[CLK_USB_PHY0] = GATE(0x0cc, BIT(1)),
};
static struct ccu_reset f1c100s_resets[] = {
[RST_USB_PHY0] = RESET(0x0cc, BIT(0)),
[RST_BUS_MMC0] = RESET(0x2c0, BIT(8)),
[RST_BUS_MMC1] = RESET(0x2c0, BIT(9)),
[RST_BUS_SPI0] = RESET(0x2c0, BIT(20)),
[RST_BUS_SPI1] = RESET(0x2c0, BIT(21)),
[RST_BUS_OTG] = RESET(0x2c0, BIT(24)),
[RST_BUS_I2C0] = RESET(0x2d0, BIT(16)),
[RST_BUS_I2C1] = RESET(0x2d0, BIT(17)),
[RST_BUS_I2C2] = RESET(0x2d0, BIT(18)),
[RST_BUS_UART0] = RESET(0x2d0, BIT(20)),
[RST_BUS_UART1] = RESET(0x2d0, BIT(21)),
[RST_BUS_UART2] = RESET(0x2d0, BIT(22)),
};
static const struct ccu_desc f1c100s_ccu_desc = {
.gates = f1c100s_gates,
.resets = f1c100s_resets,
.num_gates = ARRAY_SIZE(f1c100s_gates),
.num_resets = ARRAY_SIZE(f1c100s_resets),
};
static int f1c100s_clk_bind(struct udevice *dev)
{
return sunxi_reset_bind(dev, ARRAY_SIZE(f1c100s_resets));
}
static const struct udevice_id f1c100s_clk_ids[] = {
{ .compatible = "allwinner,suniv-f1c100s-ccu",
.data = (ulong)&f1c100s_ccu_desc },
{ }
};
U_BOOT_DRIVER(clk_suniv_f1c100s) = {
.name = "suniv_f1c100s_ccu",
.id = UCLASS_CLK,
.of_match = f1c100s_clk_ids,
.priv_auto = sizeof(struct ccu_priv),
.ops = &sunxi_clk_ops,
.probe = sunxi_clk_probe,
.bind = f1c100s_clk_bind,
};