diff options
author | Etienne Carriere <etienne.carriere@linaro.org> | 2021-09-03 16:22:18 +0200 |
---|---|---|
committer | Jérôme Forissier <jerome@forissier.org> | 2021-10-26 21:13:27 +0200 |
commit | 7e6a39fece279eaa050892caeee62776588f3ac3 (patch) | |
tree | 9943a34cee774435fb0f611718f7c4a016e7061d /core | |
parent | 44fb08105df5748bb32725db517752728255c37f (diff) |
drivers: clk: add platform data per compatible identifier
Add a platform data reference field in struct dt_device_match so
that a driver knows data related to the compatible it is probed for.
Signed-off-by: Etienne Carriere <etienne.carriere@linaro.org>
Acked-by: Jens Wiklander <jens.wiklander@linaro.org>
Diffstat (limited to 'core')
-rw-r--r-- | core/drivers/clk/clk_dt.c | 15 | ||||
-rw-r--r-- | core/drivers/clk/fixed_clk.c | 3 | ||||
-rw-r--r-- | core/include/drivers/clk_dt.h | 2 | ||||
-rw-r--r-- | core/include/kernel/dt.h | 1 |
4 files changed, 15 insertions, 6 deletions
diff --git a/core/drivers/clk/clk_dt.c b/core/drivers/clk/clk_dt.c index 2434004c..c4922f27 100644 --- a/core/drivers/clk/clk_dt.c +++ b/core/drivers/clk/clk_dt.c @@ -179,7 +179,9 @@ struct clk *clk_dt_get_by_idx(const void *fdt, int nodeoffset, return clk_dt_get_by_idx_prop("clocks", fdt, nodeoffset, clk_idx); } -static const struct clk_driver *clk_get_compatible_driver(const char *compat) +static const struct clk_driver * +clk_get_compatible_driver(const char *compat, + const struct dt_device_match **out_dm) { const struct dt_driver *drv = NULL; const struct dt_device_match *dm = NULL; @@ -191,8 +193,12 @@ static const struct clk_driver *clk_get_compatible_driver(const char *compat) clk_drv = (const struct clk_driver *)drv->driver; for (dm = drv->match_table; dm && dm->compatible; dm++) { - if (strcmp(dm->compatible, compat) == 0) + if (strcmp(dm->compatible, compat) == 0) { + if (out_dm) + *out_dm = dm; + return clk_drv; + } } } @@ -247,6 +253,7 @@ static TEE_Result clk_dt_node_clock_setup_driver(const void *fdt, int node) const char *compat = NULL; TEE_Result res = TEE_ERROR_GENERIC; const struct clk_driver *clk_drv = NULL; + const struct dt_device_match *dm = NULL; count = fdt_stringlist_count(fdt, node, "compatible"); if (count < 0) @@ -257,11 +264,11 @@ static TEE_Result clk_dt_node_clock_setup_driver(const void *fdt, int node) if (!compat) return TEE_ERROR_GENERIC; - clk_drv = clk_get_compatible_driver(compat); + clk_drv = clk_get_compatible_driver(compat, &dm); if (!clk_drv) continue; - res = clk_drv->probe(fdt, node); + res = clk_drv->probe(fdt, node, dm->compat_data); if (res != TEE_SUCCESS) { EMSG("Failed to probe clock driver for compatible %s", compat); diff --git a/core/drivers/clk/fixed_clk.c b/core/drivers/clk/fixed_clk.c index bbe3b2de..511b28da 100644 --- a/core/drivers/clk/fixed_clk.c +++ b/core/drivers/clk/fixed_clk.c @@ -25,7 +25,8 @@ static const struct clk_ops fixed_clk_clk_ops = { .get_rate = fixed_clk_get_rate, }; -static TEE_Result fixed_clock_setup(const void *fdt, int offs) +static TEE_Result fixed_clock_setup(const void *fdt, int offs, + const void *compat_data __unused) { const uint32_t *freq = NULL; const char *name = NULL; diff --git a/core/include/drivers/clk_dt.h b/core/include/drivers/clk_dt.h index fded283d..14cc16bb 100644 --- a/core/include/drivers/clk_dt.h +++ b/core/include/drivers/clk_dt.h @@ -27,7 +27,7 @@ struct clk_dt_phandle_args { * probe: probe function for the clock driver */ struct clk_driver { - TEE_Result (*probe)(const void *fdt, int nodeoffset); + TEE_Result (*probe)(const void *fdt, int nodeoffset, const void *data); }; /** diff --git a/core/include/kernel/dt.h b/core/include/kernel/dt.h index e2b2d121..20db34e1 100644 --- a/core/include/kernel/dt.h +++ b/core/include/kernel/dt.h @@ -57,6 +57,7 @@ struct dt_node_info { struct dt_device_match { const char *compatible; + const void *compat_data; }; enum dt_driver_type { |