firmware: scmi: fix sandbox and related tests for clock discovery

Updates sandbox SCMI clock driver and tests since enabling CCF will
mandate clock discovery that is all exposed SCMI clocks shall be
discovered at initialization. For this reason, sandbox SCMI clock
driver must emulate all clocks exposed by SCMI server, not only those
effectively consumed by some other U-Boot devices.

Therefore the sandbox SCMI test driver exposes 3 clocks (IDs 0, 1 and 2)
and sandbox SCMI clock consumer driver gets 2 of them.

Cc: Simon Glass <sjg@chromium.org>
Reviewed-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
Signed-off-by: Etienne Carriere <etienne.carriere@linaro.org>
This commit is contained in:
Etienne Carriere 2022-02-21 09:22:41 +01:00 committed by Tom Rini
parent 6983710a31
commit 10d3e5d20b
4 changed files with 16 additions and 14 deletions

View file

@ -1392,7 +1392,7 @@
sandbox_scmi {
compatible = "sandbox,scmi-devices";
clocks = <&clk_scmi 7>, <&clk_scmi 3>;
clocks = <&clk_scmi 2>, <&clk_scmi 0>;
resets = <&reset_scmi 3>;
regul0-supply = <&regul0_scmi>;
regul1-supply = <&regul1_scmi>;

View file

@ -17,7 +17,6 @@ struct sandbox_scmi_service;
* @rate: Clock rate in Hertz
*/
struct sandbox_scmi_clk {
uint id;
bool enabled;
ulong rate;
};

View file

@ -34,8 +34,9 @@
*/
static struct sandbox_scmi_clk scmi_clk[] = {
{ .id = 7, .rate = 1000 },
{ .id = 3, .rate = 333 },
{ .rate = 333 },
{ .rate = 200 },
{ .rate = 1000 },
};
static struct sandbox_scmi_reset scmi_reset[] = {
@ -81,11 +82,8 @@ static void debug_print_agent_state(struct udevice *dev, char *str)
static struct sandbox_scmi_clk *get_scmi_clk_state(uint clock_id)
{
size_t n;
for (n = 0; n < ARRAY_SIZE(scmi_clk); n++)
if (scmi_clk[n].id == clock_id)
return scmi_clk + n;
if (clock_id < ARRAY_SIZE(scmi_clk))
return scmi_clk + clock_id;
return NULL;
}

View file

@ -52,7 +52,7 @@ static int ut_assert_scmi_state_postprobe(struct unit_test_state *uts,
ut_assertnonnull(scmi_ctx);
agent = scmi_ctx->agent;
ut_assertnonnull(agent);
ut_asserteq(2, agent->clk_count);
ut_asserteq(3, agent->clk_count);
ut_assertnonnull(agent->clk);
ut_asserteq(1, agent->reset_count);
ut_assertnonnull(agent->reset);
@ -125,14 +125,19 @@ static int dm_test_scmi_clocks(struct unit_test_state *uts)
ut_assertnonnull(agent);
/* Test SCMI clocks rate manipulation */
ut_asserteq(333, agent->clk[0].rate);
ut_asserteq(200, agent->clk[1].rate);
ut_asserteq(1000, agent->clk[2].rate);
ut_asserteq(1000, clk_get_rate(&scmi_devices->clk[0]));
ut_asserteq(333, clk_get_rate(&scmi_devices->clk[1]));
ret_dev = clk_set_rate(&scmi_devices->clk[1], 1088);
ut_assert(!ret_dev || ret_dev == 1088);
ut_asserteq(1000, agent->clk[0].rate);
ut_asserteq(1088, agent->clk[1].rate);
ut_asserteq(1088, agent->clk[0].rate);
ut_asserteq(200, agent->clk[1].rate);
ut_asserteq(1000, agent->clk[2].rate);
ut_asserteq(1000, clk_get_rate(&scmi_devices->clk[0]));
ut_asserteq(1088, clk_get_rate(&scmi_devices->clk[1]));
@ -148,8 +153,8 @@ static int dm_test_scmi_clocks(struct unit_test_state *uts)
ut_asserteq(0, clk_enable(&scmi_devices->clk[1]));
ut_assert(!agent->clk[0].enabled);
ut_assert(agent->clk[1].enabled);
ut_assert(agent->clk[0].enabled);
ut_assert(!agent->clk[1].enabled);
ut_assert(!agent->clk[2].enabled);
ut_assertok(clk_disable(&scmi_devices->clk[1]));