Commit 42b9c5c9 authored by Tony Lindgren's avatar Tony Lindgren

bus: ti-sysc: Add support for early quirks based on register address

At least mcpdm needs an optional external clock enabled to function and
this clock typically comes from the PMIC. We can detect mcpdm based on
the interconnect target module address and set a quirk flag early.

To do this, let's initialize the clocks a bit later and add a new
function for sysc_init_early_quirks(). Note that we cannot yet enable
the early quirks for mcpdm until the optional external clocks are
handled in the in the following patch.
Signed-off-by: default avatarTony Lindgren <tony@atomide.com>
parent b11c1ea1
...@@ -959,6 +959,42 @@ static const struct sysc_revision_quirk sysc_revision_quirks[] = { ...@@ -959,6 +959,42 @@ static const struct sysc_revision_quirk sysc_revision_quirks[] = {
#endif #endif
}; };
/*
* Early quirks based on module base and register offsets only that are
* needed before the module revision can be read
*/
static void sysc_init_early_quirks(struct sysc *ddata)
{
const struct sysc_revision_quirk *q;
int i;
for (i = 0; i < ARRAY_SIZE(sysc_revision_quirks); i++) {
q = &sysc_revision_quirks[i];
if (!q->base)
continue;
if (q->base != ddata->module_pa)
continue;
if (q->rev_offset >= 0 &&
q->rev_offset != ddata->offsets[SYSC_REVISION])
continue;
if (q->sysc_offset >= 0 &&
q->sysc_offset != ddata->offsets[SYSC_SYSCONFIG])
continue;
if (q->syss_offset >= 0 &&
q->syss_offset != ddata->offsets[SYSC_SYSSTATUS])
continue;
ddata->name = q->name;
ddata->cfg.quirks |= q->quirks;
}
}
/* Quirks that also consider the revision register value */
static void sysc_init_revision_quirks(struct sysc *ddata) static void sysc_init_revision_quirks(struct sysc *ddata)
{ {
const struct sysc_revision_quirk *q; const struct sysc_revision_quirk *q;
...@@ -1829,10 +1865,6 @@ static int sysc_probe(struct platform_device *pdev) ...@@ -1829,10 +1865,6 @@ static int sysc_probe(struct platform_device *pdev)
if (error) if (error)
goto unprepare; goto unprepare;
error = sysc_get_clocks(ddata);
if (error)
return error;
error = sysc_map_and_check_registers(ddata); error = sysc_map_and_check_registers(ddata);
if (error) if (error)
goto unprepare; goto unprepare;
...@@ -1853,6 +1885,12 @@ static int sysc_probe(struct platform_device *pdev) ...@@ -1853,6 +1885,12 @@ static int sysc_probe(struct platform_device *pdev)
if (error) if (error)
goto unprepare; goto unprepare;
sysc_init_early_quirks(ddata);
error = sysc_get_clocks(ddata);
if (error)
return error;
error = sysc_init_resets(ddata); error = sysc_init_resets(ddata);
if (error) if (error)
return error; return error;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment