Commit 04491ab0 authored by Tony Lindgren's avatar Tony Lindgren

Merge branch 'omap-for-v4.21/ti-sysc' into omap-for-v4.21/driver

parents 3be5e10d 4014c08b
...@@ -2345,6 +2345,17 @@ static int __init _init_mpu_rt_base(struct omap_hwmod *oh, void *data, ...@@ -2345,6 +2345,17 @@ static int __init _init_mpu_rt_base(struct omap_hwmod *oh, void *data,
return 0; return 0;
} }
static void __init parse_module_flags(struct omap_hwmod *oh,
struct device_node *np)
{
if (of_find_property(np, "ti,no-reset-on-init", NULL))
oh->flags |= HWMOD_INIT_NO_RESET;
if (of_find_property(np, "ti,no-idle-on-init", NULL))
oh->flags |= HWMOD_INIT_NO_IDLE;
if (of_find_property(np, "ti,no-idle", NULL))
oh->flags |= HWMOD_NO_IDLE;
}
/** /**
* _init - initialize internal data for the hwmod @oh * _init - initialize internal data for the hwmod @oh
* @oh: struct omap_hwmod * * @oh: struct omap_hwmod *
...@@ -2392,12 +2403,12 @@ static int __init _init(struct omap_hwmod *oh, void *data) ...@@ -2392,12 +2403,12 @@ static int __init _init(struct omap_hwmod *oh, void *data)
} }
if (np) { if (np) {
if (of_find_property(np, "ti,no-reset-on-init", NULL)) struct device_node *child;
oh->flags |= HWMOD_INIT_NO_RESET;
if (of_find_property(np, "ti,no-idle-on-init", NULL)) parse_module_flags(oh, np);
oh->flags |= HWMOD_INIT_NO_IDLE; child = of_get_next_child(np, NULL);
if (of_find_property(np, "ti,no-idle", NULL)) if (child)
oh->flags |= HWMOD_NO_IDLE; parse_module_flags(oh, child);
} }
oh->_state = _HWMOD_STATE_INITIALIZED; oh->_state = _HWMOD_STATE_INITIALIZED;
......
...@@ -91,6 +91,9 @@ struct sysc { ...@@ -91,6 +91,9 @@ struct sysc {
struct delayed_work idle_work; struct delayed_work idle_work;
}; };
static void sysc_parse_dts_quirks(struct sysc *ddata, struct device_node *np,
bool is_child);
void sysc_write(struct sysc *ddata, int offset, u32 value) void sysc_write(struct sysc *ddata, int offset, u32 value)
{ {
writel_relaxed(value, ddata->module_va + offset); writel_relaxed(value, ddata->module_va + offset);
...@@ -379,6 +382,7 @@ static int sysc_check_one_child(struct sysc *ddata, ...@@ -379,6 +382,7 @@ static int sysc_check_one_child(struct sysc *ddata,
dev_warn(ddata->dev, "really a child ti,hwmods property?"); dev_warn(ddata->dev, "really a child ti,hwmods property?");
sysc_check_quirk_stdout(ddata, np); sysc_check_quirk_stdout(ddata, np);
sysc_parse_dts_quirks(ddata, np, true);
return 0; return 0;
} }
...@@ -1279,23 +1283,37 @@ static const struct sysc_dts_quirk sysc_dts_quirks[] = { ...@@ -1279,23 +1283,37 @@ static const struct sysc_dts_quirk sysc_dts_quirks[] = {
.mask = SYSC_QUIRK_NO_RESET_ON_INIT, }, .mask = SYSC_QUIRK_NO_RESET_ON_INIT, },
}; };
static int sysc_init_dts_quirks(struct sysc *ddata) static void sysc_parse_dts_quirks(struct sysc *ddata, struct device_node *np,
bool is_child)
{ {
struct device_node *np = ddata->dev->of_node;
const struct property *prop; const struct property *prop;
int i, len, error; int i, len;
u32 val;
ddata->legacy_mode = of_get_property(np, "ti,hwmods", NULL);
for (i = 0; i < ARRAY_SIZE(sysc_dts_quirks); i++) { for (i = 0; i < ARRAY_SIZE(sysc_dts_quirks); i++) {
prop = of_get_property(np, sysc_dts_quirks[i].name, &len); const char *name = sysc_dts_quirks[i].name;
prop = of_get_property(np, name, &len);
if (!prop) if (!prop)
continue; continue;
ddata->cfg.quirks |= sysc_dts_quirks[i].mask; ddata->cfg.quirks |= sysc_dts_quirks[i].mask;
if (is_child) {
dev_warn(ddata->dev,
"dts flag should be at module level for %s\n",
name);
}
} }
}
static int sysc_init_dts_quirks(struct sysc *ddata)
{
struct device_node *np = ddata->dev->of_node;
int error;
u32 val;
ddata->legacy_mode = of_get_property(np, "ti,hwmods", NULL);
sysc_parse_dts_quirks(ddata, np, false);
error = of_property_read_u32(np, "ti,sysc-delay-us", &val); error = of_property_read_u32(np, "ti,sysc-delay-us", &val);
if (!error) { if (!error) {
if (val > 255) { if (val > 255) {
......
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