Few more omap driver fixes and improvments for v4.21 merge window
This series of changes improves the TI module flag handling to allow booting with older dts files until the module flags have been moved to the interconnect target module level. And there's a of_node_name_eq() clean-up patch from Rob Herring for the GPMC driver. -----BEGIN PGP SIGNATURE----- iQJFBAABCAAvFiEEkgNvrZJU/QSQYIcQG9Q+yVyrpXMFAlwRTwcRHHRvbnlAYXRv bWlkZS5jb20ACgkQG9Q+yVyrpXPnBBAAqJ4gEf94aqX1xHEK25nP1A26Hu/0lsox vhF/K4fgyyFjQ3UiXPD5GCMsly/1B4ZHNE2q/wPj2OLf29qYf61yN4rmE5uXLZIq /nNeqNkl6/bfDwUGk1CEhPpMD107LUWl/smI2R8IgE1c+BFn5jGeHIlhueca6kBo QeQ+4opEJC/snYaz0eKa4GxLkTiABeV2xifQTKZbwHgBWUTxJHUx/DPZOZa8ClMl 0nZmtKahAn4qpeshnlg6XrTWHIROvk4nGii6vYyRIGsSHopcTTULGNd4uz7fWd2A zGcNNXC5Bd5CjA3yvTn1HAq9WfUuWka2PORaWJRRGvnDS1nHXgMafAHBqdFN5Rv6 aoHoxldNIO5ROmDxuogdrr7KCu3GCUq2CU+GxgPldnEdrU0vnU4DDfXKzgbFmc+X zY0u4kRn5bqzXVQU0LcYJFZ0jl/1qHCczuomeMj4+r3MxV0JmL3UuvHUXAiIk/w8 TIusND01up06iNrDvLwMAQd2iECIBTFQoLhPSbVgY87rTRGgDUthJcPacyYOYXi9 z0T4gW2n+L+Tz/RHKNab2VAU12hHRcA37VXHJiYiJjjvdC6GWGYTk2sD8s6q9Ntm MnN8ioB7OcphOX0TsKi4qnWVXBZ7xSKYKCl9r5RnGQWQcf1BCSBYfw5b/6vrnHxR W9QpaiYzLBs= =xcO5 -----END PGP SIGNATURE----- Merge tag 'omap-for-v4.21/driver-part2-signed' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap into next/drivers Few more omap driver fixes and improvments for v4.21 merge window This series of changes improves the TI module flag handling to allow booting with older dts files until the module flags have been moved to the interconnect target module level. And there's a of_node_name_eq() clean-up patch from Rob Herring for the GPMC driver. * tag 'omap-for-v4.21/driver-part2-signed' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap: memory: omap-gpmc: Use of_node_name_eq for node name comparisons bus: ti-sysc: Check for no-reset and no-idle flags at the child level ARM: OMAP2+: Check also the first dts child for hwmod flags Signed-off-by: Olof Johansson <olof@lixom.net>
This commit is contained in:
commit
a6f119a069
|
@ -2345,6 +2345,17 @@ static int __init _init_mpu_rt_base(struct omap_hwmod *oh, void *data,
|
|||
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
|
||||
* @oh: struct omap_hwmod *
|
||||
|
@ -2392,12 +2403,12 @@ static int __init _init(struct omap_hwmod *oh, void *data)
|
|||
}
|
||||
|
||||
if (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;
|
||||
struct device_node *child;
|
||||
|
||||
parse_module_flags(oh, np);
|
||||
child = of_get_next_child(np, NULL);
|
||||
if (child)
|
||||
parse_module_flags(oh, child);
|
||||
}
|
||||
|
||||
oh->_state = _HWMOD_STATE_INITIALIZED;
|
||||
|
|
|
@ -91,6 +91,9 @@ struct sysc {
|
|||
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)
|
||||
{
|
||||
writel_relaxed(value, ddata->module_va + offset);
|
||||
|
@ -379,6 +382,7 @@ static int sysc_check_one_child(struct sysc *ddata,
|
|||
dev_warn(ddata->dev, "really a child ti,hwmods property?");
|
||||
|
||||
sysc_check_quirk_stdout(ddata, np);
|
||||
sysc_parse_dts_quirks(ddata, np, true);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1279,23 +1283,37 @@ static const struct sysc_dts_quirk sysc_dts_quirks[] = {
|
|||
.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;
|
||||
int i, len, error;
|
||||
u32 val;
|
||||
|
||||
ddata->legacy_mode = of_get_property(np, "ti,hwmods", NULL);
|
||||
int i, len;
|
||||
|
||||
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)
|
||||
continue;
|
||||
|
||||
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);
|
||||
if (!error) {
|
||||
if (val > 255) {
|
||||
|
|
|
@ -2060,7 +2060,7 @@ static int gpmc_probe_generic_child(struct platform_device *pdev,
|
|||
* timings.
|
||||
*/
|
||||
name = gpmc_cs_get_name(cs);
|
||||
if (name && of_node_cmp(child->name, name) == 0)
|
||||
if (name && of_node_name_eq(child, name))
|
||||
goto no_timings;
|
||||
|
||||
ret = gpmc_cs_request(cs, resource_size(&res), &base);
|
||||
|
@ -2068,7 +2068,7 @@ static int gpmc_probe_generic_child(struct platform_device *pdev,
|
|||
dev_err(&pdev->dev, "cannot request GPMC CS %d\n", cs);
|
||||
return ret;
|
||||
}
|
||||
gpmc_cs_set_name(cs, child->name);
|
||||
gpmc_cs_set_name(cs, child->full_name);
|
||||
|
||||
gpmc_read_settings_dt(child, &gpmc_s);
|
||||
gpmc_read_timings_dt(child, &gpmc_t);
|
||||
|
@ -2113,7 +2113,7 @@ static int gpmc_probe_generic_child(struct platform_device *pdev,
|
|||
goto err;
|
||||
}
|
||||
|
||||
if (of_node_cmp(child->name, "nand") == 0) {
|
||||
if (of_node_name_eq(child, "nand")) {
|
||||
/* Warn about older DT blobs with no compatible property */
|
||||
if (!of_property_read_bool(child, "compatible")) {
|
||||
dev_warn(&pdev->dev,
|
||||
|
@ -2123,7 +2123,7 @@ static int gpmc_probe_generic_child(struct platform_device *pdev,
|
|||
}
|
||||
}
|
||||
|
||||
if (of_node_cmp(child->name, "onenand") == 0) {
|
||||
if (of_node_name_eq(child, "onenand")) {
|
||||
/* Warn about older DT blobs with no compatible property */
|
||||
if (!of_property_read_bool(child, "compatible")) {
|
||||
dev_warn(&pdev->dev,
|
||||
|
|
Loading…
Reference in New Issue