aboutsummaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
authorEtienne Carriere <etienne.carriere@linaro.org>2021-09-03 16:22:18 +0200
committerJérôme Forissier <jerome@forissier.org>2021-10-26 21:13:27 +0200
commit7e6a39fece279eaa050892caeee62776588f3ac3 (patch)
tree9943a34cee774435fb0f611718f7c4a016e7061d /core
parent44fb08105df5748bb32725db517752728255c37f (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.c15
-rw-r--r--core/drivers/clk/fixed_clk.c3
-rw-r--r--core/include/drivers/clk_dt.h2
-rw-r--r--core/include/kernel/dt.h1
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 {