xref: /openbmc/u-boot/drivers/clk/clk_sandbox_test.c (revision 1fe243a1e42fe99da0fa45c8c727f9c3d599c6c9)
183d290c5STom Rini // SPDX-License-Identifier: GPL-2.0
2135aa950SStephen Warren /*
3135aa950SStephen Warren  * Copyright (c) 2016, NVIDIA CORPORATION.
4135aa950SStephen Warren  */
5135aa950SStephen Warren 
6135aa950SStephen Warren #include <common.h>
7135aa950SStephen Warren #include <dm.h>
8135aa950SStephen Warren #include <clk.h>
9135aa950SStephen Warren #include <asm/clk.h>
10135aa950SStephen Warren 
11135aa950SStephen Warren struct sandbox_clk_test {
12135aa950SStephen Warren 	struct clk clks[SANDBOX_CLK_TEST_ID_COUNT];
1365388d0dSNeil Armstrong 	struct clk_bulk bulk;
14135aa950SStephen Warren };
15135aa950SStephen Warren 
16135aa950SStephen Warren static const char * const sandbox_clk_test_names[] = {
17135aa950SStephen Warren 	[SANDBOX_CLK_TEST_ID_FIXED] = "fixed",
18135aa950SStephen Warren 	[SANDBOX_CLK_TEST_ID_SPI] = "spi",
19135aa950SStephen Warren 	[SANDBOX_CLK_TEST_ID_I2C] = "i2c",
20135aa950SStephen Warren };
21135aa950SStephen Warren 
sandbox_clk_test_get(struct udevice * dev)22135aa950SStephen Warren int sandbox_clk_test_get(struct udevice *dev)
23135aa950SStephen Warren {
24135aa950SStephen Warren 	struct sandbox_clk_test *sbct = dev_get_priv(dev);
25135aa950SStephen Warren 	int i, ret;
26135aa950SStephen Warren 
27135aa950SStephen Warren 	for (i = 0; i < SANDBOX_CLK_TEST_ID_COUNT; i++) {
28135aa950SStephen Warren 		ret = clk_get_by_name(dev, sandbox_clk_test_names[i],
29135aa950SStephen Warren 				      &sbct->clks[i]);
30135aa950SStephen Warren 		if (ret)
31135aa950SStephen Warren 			return ret;
32135aa950SStephen Warren 	}
33135aa950SStephen Warren 
34135aa950SStephen Warren 	return 0;
35135aa950SStephen Warren }
36135aa950SStephen Warren 
sandbox_clk_test_get_bulk(struct udevice * dev)3765388d0dSNeil Armstrong int sandbox_clk_test_get_bulk(struct udevice *dev)
3865388d0dSNeil Armstrong {
3965388d0dSNeil Armstrong 	struct sandbox_clk_test *sbct = dev_get_priv(dev);
4065388d0dSNeil Armstrong 
4165388d0dSNeil Armstrong 	return clk_get_bulk(dev, &sbct->bulk);
4265388d0dSNeil Armstrong }
4365388d0dSNeil Armstrong 
sandbox_clk_test_get_rate(struct udevice * dev,int id)44135aa950SStephen Warren ulong sandbox_clk_test_get_rate(struct udevice *dev, int id)
45135aa950SStephen Warren {
46135aa950SStephen Warren 	struct sandbox_clk_test *sbct = dev_get_priv(dev);
47135aa950SStephen Warren 
48135aa950SStephen Warren 	if (id < 0 || id >= SANDBOX_CLK_TEST_ID_COUNT)
49135aa950SStephen Warren 		return -EINVAL;
50135aa950SStephen Warren 
51135aa950SStephen Warren 	return clk_get_rate(&sbct->clks[id]);
52135aa950SStephen Warren }
53135aa950SStephen Warren 
sandbox_clk_test_set_rate(struct udevice * dev,int id,ulong rate)54135aa950SStephen Warren ulong sandbox_clk_test_set_rate(struct udevice *dev, int id, ulong rate)
55135aa950SStephen Warren {
56135aa950SStephen Warren 	struct sandbox_clk_test *sbct = dev_get_priv(dev);
57135aa950SStephen Warren 
58135aa950SStephen Warren 	if (id < 0 || id >= SANDBOX_CLK_TEST_ID_COUNT)
59135aa950SStephen Warren 		return -EINVAL;
60135aa950SStephen Warren 
61135aa950SStephen Warren 	return clk_set_rate(&sbct->clks[id], rate);
62135aa950SStephen Warren }
63135aa950SStephen Warren 
sandbox_clk_test_enable(struct udevice * dev,int id)64135aa950SStephen Warren int sandbox_clk_test_enable(struct udevice *dev, int id)
65135aa950SStephen Warren {
66135aa950SStephen Warren 	struct sandbox_clk_test *sbct = dev_get_priv(dev);
67135aa950SStephen Warren 
68135aa950SStephen Warren 	if (id < 0 || id >= SANDBOX_CLK_TEST_ID_COUNT)
69135aa950SStephen Warren 		return -EINVAL;
70135aa950SStephen Warren 
71135aa950SStephen Warren 	return clk_enable(&sbct->clks[id]);
72135aa950SStephen Warren }
73135aa950SStephen Warren 
sandbox_clk_test_enable_bulk(struct udevice * dev)7465388d0dSNeil Armstrong int sandbox_clk_test_enable_bulk(struct udevice *dev)
7565388d0dSNeil Armstrong {
7665388d0dSNeil Armstrong 	struct sandbox_clk_test *sbct = dev_get_priv(dev);
7765388d0dSNeil Armstrong 
7865388d0dSNeil Armstrong 	return clk_enable_bulk(&sbct->bulk);
7965388d0dSNeil Armstrong }
8065388d0dSNeil Armstrong 
sandbox_clk_test_disable(struct udevice * dev,int id)81135aa950SStephen Warren int sandbox_clk_test_disable(struct udevice *dev, int id)
82135aa950SStephen Warren {
83135aa950SStephen Warren 	struct sandbox_clk_test *sbct = dev_get_priv(dev);
84135aa950SStephen Warren 
85135aa950SStephen Warren 	if (id < 0 || id >= SANDBOX_CLK_TEST_ID_COUNT)
86135aa950SStephen Warren 		return -EINVAL;
87135aa950SStephen Warren 
88135aa950SStephen Warren 	return clk_disable(&sbct->clks[id]);
89135aa950SStephen Warren }
90135aa950SStephen Warren 
sandbox_clk_test_disable_bulk(struct udevice * dev)9165388d0dSNeil Armstrong int sandbox_clk_test_disable_bulk(struct udevice *dev)
9265388d0dSNeil Armstrong {
9365388d0dSNeil Armstrong 	struct sandbox_clk_test *sbct = dev_get_priv(dev);
9465388d0dSNeil Armstrong 
9565388d0dSNeil Armstrong 	return clk_disable_bulk(&sbct->bulk);
9665388d0dSNeil Armstrong }
9765388d0dSNeil Armstrong 
sandbox_clk_test_free(struct udevice * dev)98135aa950SStephen Warren int sandbox_clk_test_free(struct udevice *dev)
99135aa950SStephen Warren {
100135aa950SStephen Warren 	struct sandbox_clk_test *sbct = dev_get_priv(dev);
101135aa950SStephen Warren 	int i, ret;
102135aa950SStephen Warren 
103135aa950SStephen Warren 	for (i = 0; i < SANDBOX_CLK_TEST_ID_COUNT; i++) {
104135aa950SStephen Warren 		ret = clk_free(&sbct->clks[i]);
105135aa950SStephen Warren 		if (ret)
106135aa950SStephen Warren 			return ret;
107135aa950SStephen Warren 	}
108135aa950SStephen Warren 
109135aa950SStephen Warren 	return 0;
110135aa950SStephen Warren }
111135aa950SStephen Warren 
sandbox_clk_test_release_bulk(struct udevice * dev)11265388d0dSNeil Armstrong int sandbox_clk_test_release_bulk(struct udevice *dev)
11365388d0dSNeil Armstrong {
11465388d0dSNeil Armstrong 	struct sandbox_clk_test *sbct = dev_get_priv(dev);
11565388d0dSNeil Armstrong 
11665388d0dSNeil Armstrong 	return clk_release_bulk(&sbct->bulk);
11765388d0dSNeil Armstrong }
11865388d0dSNeil Armstrong 
sandbox_clk_test_valid(struct udevice * dev)119*1fe243a1SFabrice Gasnier int sandbox_clk_test_valid(struct udevice *dev)
120*1fe243a1SFabrice Gasnier {
121*1fe243a1SFabrice Gasnier 	struct sandbox_clk_test *sbct = dev_get_priv(dev);
122*1fe243a1SFabrice Gasnier 	int i;
123*1fe243a1SFabrice Gasnier 
124*1fe243a1SFabrice Gasnier 	for (i = 0; i < SANDBOX_CLK_TEST_ID_COUNT; i++) {
125*1fe243a1SFabrice Gasnier 		if (!clk_valid(&sbct->clks[i]))
126*1fe243a1SFabrice Gasnier 			return -EINVAL;
127*1fe243a1SFabrice Gasnier 	}
128*1fe243a1SFabrice Gasnier 
129*1fe243a1SFabrice Gasnier 	return 0;
130*1fe243a1SFabrice Gasnier }
131*1fe243a1SFabrice Gasnier 
132135aa950SStephen Warren static const struct udevice_id sandbox_clk_test_ids[] = {
133135aa950SStephen Warren 	{ .compatible = "sandbox,clk-test" },
134135aa950SStephen Warren 	{ }
135135aa950SStephen Warren };
136135aa950SStephen Warren 
137135aa950SStephen Warren U_BOOT_DRIVER(sandbox_clk_test) = {
138135aa950SStephen Warren 	.name = "sandbox_clk_test",
139135aa950SStephen Warren 	.id = UCLASS_MISC,
140135aa950SStephen Warren 	.of_match = sandbox_clk_test_ids,
141135aa950SStephen Warren 	.priv_auto_alloc_size = sizeof(struct sandbox_clk_test),
142135aa950SStephen Warren };
143