aboutsummaryrefslogtreecommitdiff
path: root/include/clk.h
blob: ca20c3dd27c1c5de8a66c3049c6d042e2b05d433 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/*
 * Copyright (c) 2015 Google, Inc
 * Written by Simon Glass <sjg@chromium.org>
 *
 * SPDX-License-Identifier:	GPL-2.0+
 */

#ifndef _CLK_H_
#define _CLK_H_

#include <errno.h>
#include <linux/types.h>

struct udevice;

int soc_clk_dump(void);

struct clk_ops {
	/**
	 * get_rate() - Get current clock rate
	 *
	 * @dev:	Device to check (UCLASS_CLK)
	 * @return clock rate in Hz, or -ve error code
	 */
	ulong (*get_rate)(struct udevice *dev);

	/**
	 * set_rate() - Set current clock rate
	 *
	 * @dev:	Device to adjust
	 * @rate:	New clock rate in Hz
	 * @return new rate, or -ve error code
	 */
	ulong (*set_rate)(struct udevice *dev, ulong rate);

	/**
	 * enable() - Enable the clock for a peripheral
	 *
	 * @dev:	clock provider
	 * @periph:	Peripheral ID to enable
	 * @return zero on success, or -ve error code
	 */
	int (*enable)(struct udevice *dev, int periph);

	/**
	 * get_periph_rate() - Get clock rate for a peripheral
	 *
	 * @dev:	Device to check (UCLASS_CLK)
	 * @periph:	Peripheral ID to check
	 * @return clock rate in Hz, or -ve error code
	 */
	ulong (*get_periph_rate)(struct udevice *dev, int periph);

	/**
	 * set_periph_rate() - Set current clock rate for a peripheral
	 *
	 * @dev:	Device to update (UCLASS_CLK)
	 * @periph:	Peripheral ID to update
	 * @return new clock rate in Hz, or -ve error code
	 */
	ulong (*set_periph_rate)(struct udevice *dev, int periph, ulong rate);
};

#define clk_get_ops(dev)	((struct clk_ops *)(dev)->driver->ops)

/**
 * clk_get_rate() - Get current clock rate
 *
 * @dev:	Device to check (UCLASS_CLK)
 * @return clock rate in Hz, or -ve error code
 */
ulong clk_get_rate(struct udevice *dev);

/**
 * clk_set_rate() - Set current clock rate
 *
 * @dev:	Device to adjust
 * @rate:	New clock rate in Hz
 * @return new rate, or -ve error code
 */
ulong clk_set_rate(struct udevice *dev, ulong rate);

/**
 * clk_enable() - Enable the clock for a peripheral
 *
 * @dev:	clock provider
 * @periph:	Peripheral ID to enable
 * @return zero on success, or -ve error code
 */
int clk_enable(struct udevice *dev, int periph);

/**
 * clk_get_periph_rate() - Get current clock rate for a peripheral
 *
 * @dev:	Device to check (UCLASS_CLK)
 * @return clock rate in Hz, -ve error code
 */
ulong clk_get_periph_rate(struct udevice *dev, int periph);

/**
 * clk_set_periph_rate() - Set current clock rate for a peripheral
 *
 * @dev:	Device to update (UCLASS_CLK)
 * @periph:	Peripheral ID to update
 * @return new clock rate in Hz, or -ve error code
 */
ulong clk_set_periph_rate(struct udevice *dev, int periph, ulong rate);

#if CONFIG_IS_ENABLED(OF_CONTROL)
/**
 * clk_get_by_index() - look up a clock referenced by a device
 *
 * Parse a device's 'clocks' list, returning information on the indexed clock,
 * ensuring that it is activated.
 *
 * @dev:	Device containing the clock reference
 * @index:	Clock index to return (0 = first)
 * @clk_devp:	Returns clock device
 * @return:	Peripheral ID for the device to control. This is the first
 *		argument after the clock node phandle. If there is no arguemnt,
 *		returns 0. Return -ve error code on any error
 */
int clk_get_by_index(struct udevice *dev, int index, struct udevice **clk_devp);
#else
static inline int clk_get_by_index(struct udevice *dev, int index,
				   struct udevice **clk_devp)
{
	return -ENOSYS;
}
#endif

#endif /* _CLK_H_ */