u-boot/include/clk/sunxi.h
Samuel Holland 46fa23f9ee clk: sunxi: Use a single driver for all variants
Now that all of the variants use the same bind/probe functions and ops,
there is no need to have a separate driver for each variant. Since most
SoCs contain two variants (the main CCU and PRCM CCU), this saves a bit
of firmware size and RAM.

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

98 lines
1.7 KiB
C

// SPDX-License-Identifier: GPL-2.0+
/*
* Copyright (C) 2018 Amarula Solutions.
* Author: Jagan Teki <jagan@amarulasolutions.com>
*/
#ifndef _CLK_SUNXI_H
#define _CLK_SUNXI_H
#include <linux/bitops.h>
/**
* enum ccu_flags - ccu clock/reset flags
*
* @CCU_CLK_F_IS_VALID: is given clock gate is valid?
* @CCU_RST_F_IS_VALID: is given reset control is valid?
*/
enum ccu_flags {
CCU_CLK_F_IS_VALID = BIT(0),
CCU_RST_F_IS_VALID = BIT(1),
CCU_CLK_F_DUMMY_GATE = BIT(2),
};
/**
* struct ccu_clk_gate - ccu clock gate
* @off: gate offset
* @bit: gate bit
* @flags: ccu clock gate flags
*/
struct ccu_clk_gate {
u16 off;
u32 bit;
enum ccu_flags flags;
};
#define GATE(_off, _bit) { \
.off = _off, \
.bit = _bit, \
.flags = CCU_CLK_F_IS_VALID, \
}
#define GATE_DUMMY { \
.flags = CCU_CLK_F_DUMMY_GATE, \
}
/**
* struct ccu_reset - ccu reset
* @off: reset offset
* @bit: reset bit
* @flags: ccu reset control flags
*/
struct ccu_reset {
u16 off;
u32 bit;
enum ccu_flags flags;
};
#define RESET(_off, _bit) { \
.off = _off, \
.bit = _bit, \
.flags = CCU_RST_F_IS_VALID, \
}
/**
* struct ccu_desc - clock control unit descriptor
*
* @gates: clock gates
* @resets: reset unit
*/
struct ccu_desc {
const struct ccu_clk_gate *gates;
const struct ccu_reset *resets;
u8 num_gates;
u8 num_resets;
};
/**
* struct ccu_priv - sunxi clock control unit
*
* @base: base address
* @desc: ccu descriptor
*/
struct ccu_priv {
void *base;
const struct ccu_desc *desc;
};
extern struct clk_ops sunxi_clk_ops;
/**
* sunxi_reset_bind() - reset binding
*
* @dev: reset device
* Return: 0 success, or error value
*/
int sunxi_reset_bind(struct udevice *dev);
#endif /* _CLK_SUNXI_H */