xref: /OK3568_Linux_fs/u-boot/drivers/clk/clk_sandbox_test.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright (c) 2016, NVIDIA CORPORATION.
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * SPDX-License-Identifier: GPL-2.0
5*4882a593Smuzhiyun  */
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #include <common.h>
8*4882a593Smuzhiyun #include <dm.h>
9*4882a593Smuzhiyun #include <clk.h>
10*4882a593Smuzhiyun #include <asm/clk.h>
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun struct sandbox_clk_test {
13*4882a593Smuzhiyun 	struct clk clks[SANDBOX_CLK_TEST_ID_COUNT];
14*4882a593Smuzhiyun 	struct clk_bulk bulk;
15*4882a593Smuzhiyun };
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun static const char * const sandbox_clk_test_names[] = {
18*4882a593Smuzhiyun 	[SANDBOX_CLK_TEST_ID_FIXED] = "fixed",
19*4882a593Smuzhiyun 	[SANDBOX_CLK_TEST_ID_SPI] = "spi",
20*4882a593Smuzhiyun 	[SANDBOX_CLK_TEST_ID_I2C] = "i2c",
21*4882a593Smuzhiyun };
22*4882a593Smuzhiyun 
sandbox_clk_test_get(struct udevice * dev)23*4882a593Smuzhiyun int sandbox_clk_test_get(struct udevice *dev)
24*4882a593Smuzhiyun {
25*4882a593Smuzhiyun 	struct sandbox_clk_test *sbct = dev_get_priv(dev);
26*4882a593Smuzhiyun 	int i, ret;
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun 	for (i = 0; i < SANDBOX_CLK_TEST_ID_COUNT; i++) {
29*4882a593Smuzhiyun 		ret = clk_get_by_name(dev, sandbox_clk_test_names[i],
30*4882a593Smuzhiyun 				      &sbct->clks[i]);
31*4882a593Smuzhiyun 		if (ret)
32*4882a593Smuzhiyun 			return ret;
33*4882a593Smuzhiyun 	}
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun 	return 0;
36*4882a593Smuzhiyun }
37*4882a593Smuzhiyun 
sandbox_clk_test_get_bulk(struct udevice * dev)38*4882a593Smuzhiyun int sandbox_clk_test_get_bulk(struct udevice *dev)
39*4882a593Smuzhiyun {
40*4882a593Smuzhiyun 	struct sandbox_clk_test *sbct = dev_get_priv(dev);
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun 	return clk_get_bulk(dev, &sbct->bulk);
43*4882a593Smuzhiyun }
44*4882a593Smuzhiyun 
sandbox_clk_test_get_rate(struct udevice * dev,int id)45*4882a593Smuzhiyun ulong sandbox_clk_test_get_rate(struct udevice *dev, int id)
46*4882a593Smuzhiyun {
47*4882a593Smuzhiyun 	struct sandbox_clk_test *sbct = dev_get_priv(dev);
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun 	if (id < 0 || id >= SANDBOX_CLK_TEST_ID_COUNT)
50*4882a593Smuzhiyun 		return -EINVAL;
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun 	return clk_get_rate(&sbct->clks[id]);
53*4882a593Smuzhiyun }
54*4882a593Smuzhiyun 
sandbox_clk_test_set_rate(struct udevice * dev,int id,ulong rate)55*4882a593Smuzhiyun ulong sandbox_clk_test_set_rate(struct udevice *dev, int id, ulong rate)
56*4882a593Smuzhiyun {
57*4882a593Smuzhiyun 	struct sandbox_clk_test *sbct = dev_get_priv(dev);
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun 	if (id < 0 || id >= SANDBOX_CLK_TEST_ID_COUNT)
60*4882a593Smuzhiyun 		return -EINVAL;
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun 	return clk_set_rate(&sbct->clks[id], rate);
63*4882a593Smuzhiyun }
64*4882a593Smuzhiyun 
sandbox_clk_test_enable(struct udevice * dev,int id)65*4882a593Smuzhiyun int sandbox_clk_test_enable(struct udevice *dev, int id)
66*4882a593Smuzhiyun {
67*4882a593Smuzhiyun 	struct sandbox_clk_test *sbct = dev_get_priv(dev);
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun 	if (id < 0 || id >= SANDBOX_CLK_TEST_ID_COUNT)
70*4882a593Smuzhiyun 		return -EINVAL;
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun 	return clk_enable(&sbct->clks[id]);
73*4882a593Smuzhiyun }
74*4882a593Smuzhiyun 
sandbox_clk_test_enable_bulk(struct udevice * dev)75*4882a593Smuzhiyun int sandbox_clk_test_enable_bulk(struct udevice *dev)
76*4882a593Smuzhiyun {
77*4882a593Smuzhiyun 	struct sandbox_clk_test *sbct = dev_get_priv(dev);
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun 	return clk_enable_bulk(&sbct->bulk);
80*4882a593Smuzhiyun }
81*4882a593Smuzhiyun 
sandbox_clk_test_disable(struct udevice * dev,int id)82*4882a593Smuzhiyun int sandbox_clk_test_disable(struct udevice *dev, int id)
83*4882a593Smuzhiyun {
84*4882a593Smuzhiyun 	struct sandbox_clk_test *sbct = dev_get_priv(dev);
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun 	if (id < 0 || id >= SANDBOX_CLK_TEST_ID_COUNT)
87*4882a593Smuzhiyun 		return -EINVAL;
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun 	return clk_disable(&sbct->clks[id]);
90*4882a593Smuzhiyun }
91*4882a593Smuzhiyun 
sandbox_clk_test_disable_bulk(struct udevice * dev)92*4882a593Smuzhiyun int sandbox_clk_test_disable_bulk(struct udevice *dev)
93*4882a593Smuzhiyun {
94*4882a593Smuzhiyun 	struct sandbox_clk_test *sbct = dev_get_priv(dev);
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun 	return clk_disable_bulk(&sbct->bulk);
97*4882a593Smuzhiyun }
98*4882a593Smuzhiyun 
sandbox_clk_test_free(struct udevice * dev)99*4882a593Smuzhiyun int sandbox_clk_test_free(struct udevice *dev)
100*4882a593Smuzhiyun {
101*4882a593Smuzhiyun 	struct sandbox_clk_test *sbct = dev_get_priv(dev);
102*4882a593Smuzhiyun 	int i, ret;
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun 	for (i = 0; i < SANDBOX_CLK_TEST_ID_COUNT; i++) {
105*4882a593Smuzhiyun 		ret = clk_free(&sbct->clks[i]);
106*4882a593Smuzhiyun 		if (ret)
107*4882a593Smuzhiyun 			return ret;
108*4882a593Smuzhiyun 	}
109*4882a593Smuzhiyun 
110*4882a593Smuzhiyun 	return 0;
111*4882a593Smuzhiyun }
112*4882a593Smuzhiyun 
sandbox_clk_test_release_bulk(struct udevice * dev)113*4882a593Smuzhiyun int sandbox_clk_test_release_bulk(struct udevice *dev)
114*4882a593Smuzhiyun {
115*4882a593Smuzhiyun 	struct sandbox_clk_test *sbct = dev_get_priv(dev);
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun 	return clk_release_bulk(&sbct->bulk);
118*4882a593Smuzhiyun }
119*4882a593Smuzhiyun 
sandbox_clk_test_valid(struct udevice * dev)120*4882a593Smuzhiyun int sandbox_clk_test_valid(struct udevice *dev)
121*4882a593Smuzhiyun {
122*4882a593Smuzhiyun 	struct sandbox_clk_test *sbct = dev_get_priv(dev);
123*4882a593Smuzhiyun 	int i;
124*4882a593Smuzhiyun 
125*4882a593Smuzhiyun 	for (i = 0; i < SANDBOX_CLK_TEST_ID_COUNT; i++) {
126*4882a593Smuzhiyun 		if (!clk_valid(&sbct->clks[i]))
127*4882a593Smuzhiyun 			return -EINVAL;
128*4882a593Smuzhiyun 	}
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun 	return 0;
131*4882a593Smuzhiyun }
132*4882a593Smuzhiyun 
133*4882a593Smuzhiyun static const struct udevice_id sandbox_clk_test_ids[] = {
134*4882a593Smuzhiyun 	{ .compatible = "sandbox,clk-test" },
135*4882a593Smuzhiyun 	{ }
136*4882a593Smuzhiyun };
137*4882a593Smuzhiyun 
138*4882a593Smuzhiyun U_BOOT_DRIVER(sandbox_clk_test) = {
139*4882a593Smuzhiyun 	.name = "sandbox_clk_test",
140*4882a593Smuzhiyun 	.id = UCLASS_MISC,
141*4882a593Smuzhiyun 	.of_match = sandbox_clk_test_ids,
142*4882a593Smuzhiyun 	.priv_auto_alloc_size = sizeof(struct sandbox_clk_test),
143*4882a593Smuzhiyun };
144