blob: cac5c5faf05641f775c72288d6dffa1803ec632c [file] [log] [blame]
Jagan Teki1d150b42018-12-22 21:32:49 +05301// SPDX-License-Identifier: GPL-2.0+
2/*
3 * Copyright (C) 2018 Amarula Solutions.
4 * Author: Jagan Teki <jagan@amarulasolutions.com>
5 */
6
7#ifndef _ASM_ARCH_CCU_H
8#define _ASM_ARCH_CCU_H
9
Simon Glass4dcacfc2020-05-10 11:40:13 -060010#ifndef __ASSEMBLY__
11#include <linux/bitops.h>
12#endif
13
Jagan Teki1d150b42018-12-22 21:32:49 +053014/**
Jagan Teki7f6c2a82019-01-18 22:18:13 +053015 * enum ccu_flags - ccu clock/reset flags
Jagan Teki1d150b42018-12-22 21:32:49 +053016 *
17 * @CCU_CLK_F_IS_VALID: is given clock gate is valid?
Jagan Teki7f6c2a82019-01-18 22:18:13 +053018 * @CCU_RST_F_IS_VALID: is given reset control is valid?
Jagan Teki1d150b42018-12-22 21:32:49 +053019 */
20enum ccu_flags {
21 CCU_CLK_F_IS_VALID = BIT(0),
Jagan Teki7f6c2a82019-01-18 22:18:13 +053022 CCU_RST_F_IS_VALID = BIT(1),
Jagan Teki1d150b42018-12-22 21:32:49 +053023};
24
25/**
26 * struct ccu_clk_gate - ccu clock gate
27 * @off: gate offset
28 * @bit: gate bit
29 * @flags: ccu clock gate flags
30 */
31struct ccu_clk_gate {
32 u16 off;
33 u32 bit;
34 enum ccu_flags flags;
35};
36
37#define GATE(_off, _bit) { \
38 .off = _off, \
39 .bit = _bit, \
40 .flags = CCU_CLK_F_IS_VALID, \
41}
42
43/**
Jagan Teki7f6c2a82019-01-18 22:18:13 +053044 * struct ccu_reset - ccu reset
45 * @off: reset offset
46 * @bit: reset bit
47 * @flags: ccu reset control flags
48 */
49struct ccu_reset {
50 u16 off;
51 u32 bit;
52 enum ccu_flags flags;
53};
54
55#define RESET(_off, _bit) { \
56 .off = _off, \
57 .bit = _bit, \
58 .flags = CCU_RST_F_IS_VALID, \
59}
60
61/**
Jagan Teki1d150b42018-12-22 21:32:49 +053062 * struct ccu_desc - clock control unit descriptor
63 *
64 * @gates: clock gates
Jagan Teki7f6c2a82019-01-18 22:18:13 +053065 * @resets: reset unit
Jagan Teki1d150b42018-12-22 21:32:49 +053066 */
67struct ccu_desc {
68 const struct ccu_clk_gate *gates;
Jagan Teki7f6c2a82019-01-18 22:18:13 +053069 const struct ccu_reset *resets;
Jagan Teki1d150b42018-12-22 21:32:49 +053070};
71
72/**
73 * struct ccu_priv - sunxi clock control unit
74 *
75 * @base: base address
76 * @desc: ccu descriptor
77 */
78struct ccu_priv {
79 void *base;
80 const struct ccu_desc *desc;
81};
82
83/**
84 * sunxi_clk_probe - common sunxi clock probe
85 * @dev: clock device
86 */
87int sunxi_clk_probe(struct udevice *dev);
88
89extern struct clk_ops sunxi_clk_ops;
90
Jagan Teki7f6c2a82019-01-18 22:18:13 +053091/**
92 * sunxi_reset_bind() - reset binding
93 *
94 * @dev: reset device
95 * @count: reset count
96 * @return 0 success, or error value
97 */
98int sunxi_reset_bind(struct udevice *dev, ulong count);
99
Jagan Teki1d150b42018-12-22 21:32:49 +0530100#endif /* _ASM_ARCH_CCU_H */