blob: c4a9dee5ebfac76ee26d8a82e1cf5fae70035fa1 [file] [log] [blame]
Jagan Teki0d47bc72018-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
Samuel Holland21d314a2021-09-12 11:48:43 -05007#ifndef _CLK_SUNXI_H
8#define _CLK_SUNXI_H
Jagan Teki0d47bc72018-12-22 21:32:49 +05309
Simon Glasscd93d622020-05-10 11:40:13 -060010#include <linux/bitops.h>
Simon Glasscd93d622020-05-10 11:40:13 -060011
Jagan Teki0d47bc72018-12-22 21:32:49 +053012/**
Jagan Teki99ba4302019-01-18 22:18:13 +053013 * enum ccu_flags - ccu clock/reset flags
Jagan Teki0d47bc72018-12-22 21:32:49 +053014 *
15 * @CCU_CLK_F_IS_VALID: is given clock gate is valid?
Jagan Teki99ba4302019-01-18 22:18:13 +053016 * @CCU_RST_F_IS_VALID: is given reset control is valid?
Jagan Teki0d47bc72018-12-22 21:32:49 +053017 */
18enum ccu_flags {
19 CCU_CLK_F_IS_VALID = BIT(0),
Jagan Teki99ba4302019-01-18 22:18:13 +053020 CCU_RST_F_IS_VALID = BIT(1),
Andre Przywarad6cb09d2022-05-05 01:25:43 +010021 CCU_CLK_F_DUMMY_GATE = BIT(2),
Jagan Teki0d47bc72018-12-22 21:32:49 +053022};
23
24/**
25 * struct ccu_clk_gate - ccu clock gate
26 * @off: gate offset
27 * @bit: gate bit
28 * @flags: ccu clock gate flags
29 */
30struct ccu_clk_gate {
31 u16 off;
32 u32 bit;
33 enum ccu_flags flags;
34};
35
36#define GATE(_off, _bit) { \
37 .off = _off, \
38 .bit = _bit, \
39 .flags = CCU_CLK_F_IS_VALID, \
40}
41
Andre Przywarad6cb09d2022-05-05 01:25:43 +010042#define GATE_DUMMY { \
43 .flags = CCU_CLK_F_DUMMY_GATE, \
44}
45
Jagan Teki0d47bc72018-12-22 21:32:49 +053046/**
Jagan Teki99ba4302019-01-18 22:18:13 +053047 * struct ccu_reset - ccu reset
48 * @off: reset offset
49 * @bit: reset bit
50 * @flags: ccu reset control flags
51 */
52struct ccu_reset {
53 u16 off;
54 u32 bit;
55 enum ccu_flags flags;
56};
57
58#define RESET(_off, _bit) { \
59 .off = _off, \
60 .bit = _bit, \
61 .flags = CCU_RST_F_IS_VALID, \
62}
63
64/**
Jagan Teki0d47bc72018-12-22 21:32:49 +053065 * struct ccu_desc - clock control unit descriptor
66 *
67 * @gates: clock gates
Jagan Teki99ba4302019-01-18 22:18:13 +053068 * @resets: reset unit
Jagan Teki0d47bc72018-12-22 21:32:49 +053069 */
70struct ccu_desc {
71 const struct ccu_clk_gate *gates;
Jagan Teki99ba4302019-01-18 22:18:13 +053072 const struct ccu_reset *resets;
Jagan Teki0d47bc72018-12-22 21:32:49 +053073};
74
75/**
76 * struct ccu_priv - sunxi clock control unit
77 *
78 * @base: base address
79 * @desc: ccu descriptor
80 */
81struct ccu_priv {
82 void *base;
83 const struct ccu_desc *desc;
84};
85
86/**
87 * sunxi_clk_probe - common sunxi clock probe
88 * @dev: clock device
89 */
90int sunxi_clk_probe(struct udevice *dev);
91
92extern struct clk_ops sunxi_clk_ops;
93
Jagan Teki99ba4302019-01-18 22:18:13 +053094/**
95 * sunxi_reset_bind() - reset binding
96 *
97 * @dev: reset device
98 * @count: reset count
Heinrich Schuchardt185f8122022-01-19 18:05:50 +010099 * Return: 0 success, or error value
Jagan Teki99ba4302019-01-18 22:18:13 +0530100 */
101int sunxi_reset_bind(struct udevice *dev, ulong count);
102
Samuel Holland21d314a2021-09-12 11:48:43 -0500103#endif /* _CLK_SUNXI_H */