1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2016, NVIDIA CORPORATION.
11 #include <dm/device_compat.h>
12 #include <linux/err.h>
14 struct sandbox_clk_test
{
15 struct clk clks
[SANDBOX_CLK_TEST_NON_DEVM_COUNT
];
16 struct clk
*clkps
[SANDBOX_CLK_TEST_ID_COUNT
];
20 static const char * const sandbox_clk_test_names
[] = {
21 [SANDBOX_CLK_TEST_ID_FIXED
] = "fixed",
22 [SANDBOX_CLK_TEST_ID_SPI
] = "spi",
23 [SANDBOX_CLK_TEST_ID_I2C
] = "i2c",
26 int sandbox_clk_test_get(struct udevice
*dev
)
28 struct sandbox_clk_test
*sbct
= dev_get_priv(dev
);
31 for (i
= 0; i
< SANDBOX_CLK_TEST_NON_DEVM_COUNT
; i
++) {
32 ret
= clk_get_by_name(dev
, sandbox_clk_test_names
[i
],
41 int sandbox_clk_test_devm_get(struct udevice
*dev
)
43 struct sandbox_clk_test
*sbct
= dev_get_priv(dev
);
46 clk
= devm_clk_get(dev
, "no-an-existing-clock");
48 dev_err(dev
, "devm_clk_get() should have failed\n");
52 clk
= devm_clk_get(dev
, "uart2");
55 sbct
->clkps
[SANDBOX_CLK_TEST_ID_DEVM1
] = clk
;
57 clk
= devm_clk_get_optional(dev
, "uart1");
60 sbct
->clkps
[SANDBOX_CLK_TEST_ID_DEVM2
] = clk
;
62 sbct
->clkps
[SANDBOX_CLK_TEST_ID_DEVM_NULL
] = NULL
;
63 clk
= devm_clk_get_optional(dev
, "not_an_existing_clock");
72 int sandbox_clk_test_get_bulk(struct udevice
*dev
)
74 struct sandbox_clk_test
*sbct
= dev_get_priv(dev
);
76 return clk_get_bulk(dev
, &sbct
->bulk
);
79 ulong
sandbox_clk_test_get_rate(struct udevice
*dev
, int id
)
81 struct sandbox_clk_test
*sbct
= dev_get_priv(dev
);
83 if (id
< 0 || id
>= SANDBOX_CLK_TEST_ID_COUNT
)
86 return clk_get_rate(sbct
->clkps
[id
]);
89 ulong
sandbox_clk_test_set_rate(struct udevice
*dev
, int id
, ulong rate
)
91 struct sandbox_clk_test
*sbct
= dev_get_priv(dev
);
93 if (id
< 0 || id
>= SANDBOX_CLK_TEST_ID_COUNT
)
96 return clk_set_rate(sbct
->clkps
[id
], rate
);
99 int sandbox_clk_test_enable(struct udevice
*dev
, int id
)
101 struct sandbox_clk_test
*sbct
= dev_get_priv(dev
);
103 if (id
< 0 || id
>= SANDBOX_CLK_TEST_ID_COUNT
)
106 return clk_enable(sbct
->clkps
[id
]);
109 int sandbox_clk_test_enable_bulk(struct udevice
*dev
)
111 struct sandbox_clk_test
*sbct
= dev_get_priv(dev
);
113 return clk_enable_bulk(&sbct
->bulk
);
116 int sandbox_clk_test_disable(struct udevice
*dev
, int id
)
118 struct sandbox_clk_test
*sbct
= dev_get_priv(dev
);
120 if (id
< 0 || id
>= SANDBOX_CLK_TEST_ID_COUNT
)
123 return clk_disable(sbct
->clkps
[id
]);
126 int sandbox_clk_test_disable_bulk(struct udevice
*dev
)
128 struct sandbox_clk_test
*sbct
= dev_get_priv(dev
);
130 return clk_disable_bulk(&sbct
->bulk
);
133 int sandbox_clk_test_free(struct udevice
*dev
)
135 struct sandbox_clk_test
*sbct
= dev_get_priv(dev
);
138 devm_clk_put(dev
, sbct
->clkps
[SANDBOX_CLK_TEST_ID_DEVM1
]);
139 for (i
= 0; i
< SANDBOX_CLK_TEST_NON_DEVM_COUNT
; i
++) {
140 ret
= clk_free(&sbct
->clks
[i
]);
148 int sandbox_clk_test_release_bulk(struct udevice
*dev
)
150 struct sandbox_clk_test
*sbct
= dev_get_priv(dev
);
152 return clk_release_bulk(&sbct
->bulk
);
155 int sandbox_clk_test_valid(struct udevice
*dev
)
157 struct sandbox_clk_test
*sbct
= dev_get_priv(dev
);
160 for (i
= 0; i
< SANDBOX_CLK_TEST_ID_COUNT
; i
++) {
161 if (!clk_valid(sbct
->clkps
[i
]))
162 if (i
!= SANDBOX_CLK_TEST_ID_DEVM_NULL
)
169 static int sandbox_clk_test_probe(struct udevice
*dev
)
171 struct sandbox_clk_test
*sbct
= dev_get_priv(dev
);
174 for (i
= 0; i
< SANDBOX_CLK_TEST_ID_DEVM1
; i
++)
175 sbct
->clkps
[i
] = &sbct
->clks
[i
];
176 for (i
= SANDBOX_CLK_TEST_ID_DEVM1
; i
< SANDBOX_CLK_TEST_ID_COUNT
; i
++)
177 sbct
->clkps
[i
] = NULL
;
182 static const struct udevice_id sandbox_clk_test_ids
[] = {
183 { .compatible
= "sandbox,clk-test" },
187 U_BOOT_DRIVER(sandbox_clk_test
) = {
188 .name
= "sandbox_clk_test",
190 .of_match
= sandbox_clk_test_ids
,
191 .probe
= sandbox_clk_test_probe
,
192 .priv_auto_alloc_size
= sizeof(struct sandbox_clk_test
),