Three fixes for omaps for v5.4-rc cycle
Two regression fixes for omap3 iommu. I missed applying two omap3 related iommu pdata quirks patches earlier because the kbuild test robot produced errors on them for missing dependencies. Fix ti-sysc interconnect target module driver handling for watchdog quirk. I must have tested this earlier only with watchdog service running, but clearly it does not do what it needs to do. -----BEGIN PGP SIGNATURE----- iQJFBAABCAAvFiEEkgNvrZJU/QSQYIcQG9Q+yVyrpXMFAl2wgcERHHRvbnlAYXRv bWlkZS5jb20ACgkQG9Q+yVyrpXN1Vw/+JqxMt2izYIZiVln4uWia37Zypl7yjwFH 6HXgmVPOY0NT17gOYwjX4Fnmvrwe5SsT7obvjPSMCQTNUykffoB2CxiYBMTJ6XPx 5KQMzPT8JCXWBxNNkU+ksHxNjFYhF3s0VIUJX3NGCsCv0YXdjPjWmmZ1udvDvEX1 WDN+YfYrCGWd8TLUGrI4FbWT3eibF1xkVc1y+9jv20gVhsEO1dXYTz5rRjrZAlEE Le9aG831P4OkncmiUC/bdY2P05l8VXg+fkN3NdOlFwQJRZtHRw23ZyFMPs32SniV h/3cLuF4hKjE5StgodEhXgQhCvCdShTM9nwAYWDNqCpG+kOHcnI6qpOwJy2WoPNe JodDqifQgBZc8y7ut37rY9GqssT/VsgKxmhTFdherbadGYpVzF5plVhqqL/yV5OR KaIVZv/NVsUpXQSGGBoUYe4eZuTIoMTKlm0knN0RE0u+XMRSES5JBZ0f8A4tAc7j GqKG+zU83D7uJeq3Swa7/TC/8crcZ0W72kMcWpt1xmwJo3K0SFFfyoBdaltzJBxq pcRNHijfqWdjeDbfL3N/73BeL0Ond8ZnBhl6mlFGsM7NbA9rsMBg3IbYND24+QsV OmEDWRHW8i+X6MAFhQvHHRGPXblzetENTGpArKTBIyw9JxFLX476XLB8zfQw9Br2 DUq5EREa8CM= =17ur -----END PGP SIGNATURE----- Merge tag 'omap-for-v5.4/fixes-rc4-signed' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap into arm/fixes Three fixes for omaps for v5.4-rc cycle Two regression fixes for omap3 iommu. I missed applying two omap3 related iommu pdata quirks patches earlier because the kbuild test robot produced errors on them for missing dependencies. Fix ti-sysc interconnect target module driver handling for watchdog quirk. I must have tested this earlier only with watchdog service running, but clearly it does not do what it needs to do. * tag 'omap-for-v5.4/fixes-rc4-signed' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap: bus: ti-sysc: Fix watchdog quirk handling ARM: OMAP2+: Add pdata for OMAP3 ISP IOMMU ARM: OMAP2+: Plug in device_enable/idle ops for IOMMUs Link: https://lore.kernel.org/r/pull-1571848757-282222@atomide.com Signed-off-by: Olof Johansson <olof@lixom.net>
This commit is contained in:
commit
f82bc13540
|
@ -89,6 +89,13 @@ static struct iommu_platform_data omap3_iommu_pdata = {
|
||||||
.reset_name = "mmu",
|
.reset_name = "mmu",
|
||||||
.assert_reset = omap_device_assert_hardreset,
|
.assert_reset = omap_device_assert_hardreset,
|
||||||
.deassert_reset = omap_device_deassert_hardreset,
|
.deassert_reset = omap_device_deassert_hardreset,
|
||||||
|
.device_enable = omap_device_enable,
|
||||||
|
.device_idle = omap_device_idle,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct iommu_platform_data omap3_iommu_isp_pdata = {
|
||||||
|
.device_enable = omap_device_enable,
|
||||||
|
.device_idle = omap_device_idle,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int omap3_sbc_t3730_twl_callback(struct device *dev,
|
static int omap3_sbc_t3730_twl_callback(struct device *dev,
|
||||||
|
@ -424,6 +431,8 @@ static struct iommu_platform_data omap4_iommu_pdata = {
|
||||||
.reset_name = "mmu_cache",
|
.reset_name = "mmu_cache",
|
||||||
.assert_reset = omap_device_assert_hardreset,
|
.assert_reset = omap_device_assert_hardreset,
|
||||||
.deassert_reset = omap_device_deassert_hardreset,
|
.deassert_reset = omap_device_deassert_hardreset,
|
||||||
|
.device_enable = omap_device_enable,
|
||||||
|
.device_idle = omap_device_idle,
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -617,6 +626,8 @@ static struct of_dev_auxdata omap_auxdata_lookup[] = {
|
||||||
#ifdef CONFIG_ARCH_OMAP3
|
#ifdef CONFIG_ARCH_OMAP3
|
||||||
OF_DEV_AUXDATA("ti,omap2-iommu", 0x5d000000, "5d000000.mmu",
|
OF_DEV_AUXDATA("ti,omap2-iommu", 0x5d000000, "5d000000.mmu",
|
||||||
&omap3_iommu_pdata),
|
&omap3_iommu_pdata),
|
||||||
|
OF_DEV_AUXDATA("ti,omap2-iommu", 0x480bd400, "480bd400.mmu",
|
||||||
|
&omap3_iommu_isp_pdata),
|
||||||
OF_DEV_AUXDATA("ti,omap3-smartreflex-core", 0x480cb000,
|
OF_DEV_AUXDATA("ti,omap3-smartreflex-core", 0x480cb000,
|
||||||
"480cb000.smartreflex", &omap_sr_pdata[OMAP_SR_CORE]),
|
"480cb000.smartreflex", &omap_sr_pdata[OMAP_SR_CORE]),
|
||||||
OF_DEV_AUXDATA("ti,omap3-smartreflex-mpu-iva", 0x480c9000,
|
OF_DEV_AUXDATA("ti,omap3-smartreflex-mpu-iva", 0x480c9000,
|
||||||
|
|
|
@ -74,6 +74,7 @@ static const char * const clock_names[SYSC_MAX_CLOCKS] = {
|
||||||
* @clk_disable_quirk: module specific clock disable quirk
|
* @clk_disable_quirk: module specific clock disable quirk
|
||||||
* @reset_done_quirk: module specific reset done quirk
|
* @reset_done_quirk: module specific reset done quirk
|
||||||
* @module_enable_quirk: module specific enable quirk
|
* @module_enable_quirk: module specific enable quirk
|
||||||
|
* @module_disable_quirk: module specific disable quirk
|
||||||
*/
|
*/
|
||||||
struct sysc {
|
struct sysc {
|
||||||
struct device *dev;
|
struct device *dev;
|
||||||
|
@ -100,6 +101,7 @@ struct sysc {
|
||||||
void (*clk_disable_quirk)(struct sysc *sysc);
|
void (*clk_disable_quirk)(struct sysc *sysc);
|
||||||
void (*reset_done_quirk)(struct sysc *sysc);
|
void (*reset_done_quirk)(struct sysc *sysc);
|
||||||
void (*module_enable_quirk)(struct sysc *sysc);
|
void (*module_enable_quirk)(struct sysc *sysc);
|
||||||
|
void (*module_disable_quirk)(struct sysc *sysc);
|
||||||
};
|
};
|
||||||
|
|
||||||
static void sysc_parse_dts_quirks(struct sysc *ddata, struct device_node *np,
|
static void sysc_parse_dts_quirks(struct sysc *ddata, struct device_node *np,
|
||||||
|
@ -959,6 +961,9 @@ static int sysc_disable_module(struct device *dev)
|
||||||
if (ddata->offsets[SYSC_SYSCONFIG] == -ENODEV)
|
if (ddata->offsets[SYSC_SYSCONFIG] == -ENODEV)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
if (ddata->module_disable_quirk)
|
||||||
|
ddata->module_disable_quirk(ddata);
|
||||||
|
|
||||||
regbits = ddata->cap->regbits;
|
regbits = ddata->cap->regbits;
|
||||||
reg = sysc_read(ddata, ddata->offsets[SYSC_SYSCONFIG]);
|
reg = sysc_read(ddata, ddata->offsets[SYSC_SYSCONFIG]);
|
||||||
|
|
||||||
|
@ -1248,6 +1253,9 @@ static const struct sysc_revision_quirk sysc_revision_quirks[] = {
|
||||||
SYSC_MODULE_QUIRK_SGX),
|
SYSC_MODULE_QUIRK_SGX),
|
||||||
SYSC_QUIRK("wdt", 0, 0, 0x10, 0x14, 0x502a0500, 0xfffff0f0,
|
SYSC_QUIRK("wdt", 0, 0, 0x10, 0x14, 0x502a0500, 0xfffff0f0,
|
||||||
SYSC_MODULE_QUIRK_WDT),
|
SYSC_MODULE_QUIRK_WDT),
|
||||||
|
/* Watchdog on am3 and am4 */
|
||||||
|
SYSC_QUIRK("wdt", 0x44e35000, 0, 0x10, 0x14, 0x502a0500, 0xfffff0f0,
|
||||||
|
SYSC_MODULE_QUIRK_WDT | SYSC_QUIRK_SWSUP_SIDLE),
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
SYSC_QUIRK("adc", 0, 0, 0x10, -1, 0x47300001, 0xffffffff, 0),
|
SYSC_QUIRK("adc", 0, 0, 0x10, -1, 0x47300001, 0xffffffff, 0),
|
||||||
|
@ -1440,14 +1448,14 @@ static void sysc_reset_done_quirk_wdt(struct sysc *ddata)
|
||||||
!(val & 0x10), 100,
|
!(val & 0x10), 100,
|
||||||
MAX_MODULE_SOFTRESET_WAIT);
|
MAX_MODULE_SOFTRESET_WAIT);
|
||||||
if (error)
|
if (error)
|
||||||
dev_warn(ddata->dev, "wdt disable spr failed\n");
|
dev_warn(ddata->dev, "wdt disable step1 failed\n");
|
||||||
|
|
||||||
sysc_write(ddata, wps, 0x5555);
|
sysc_write(ddata, spr, 0x5555);
|
||||||
error = readl_poll_timeout(ddata->module_va + wps, val,
|
error = readl_poll_timeout(ddata->module_va + wps, val,
|
||||||
!(val & 0x10), 100,
|
!(val & 0x10), 100,
|
||||||
MAX_MODULE_SOFTRESET_WAIT);
|
MAX_MODULE_SOFTRESET_WAIT);
|
||||||
if (error)
|
if (error)
|
||||||
dev_warn(ddata->dev, "wdt disable wps failed\n");
|
dev_warn(ddata->dev, "wdt disable step2 failed\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sysc_init_module_quirks(struct sysc *ddata)
|
static void sysc_init_module_quirks(struct sysc *ddata)
|
||||||
|
@ -1471,8 +1479,10 @@ static void sysc_init_module_quirks(struct sysc *ddata)
|
||||||
if (ddata->cfg.quirks & SYSC_MODULE_QUIRK_SGX)
|
if (ddata->cfg.quirks & SYSC_MODULE_QUIRK_SGX)
|
||||||
ddata->module_enable_quirk = sysc_module_enable_quirk_sgx;
|
ddata->module_enable_quirk = sysc_module_enable_quirk_sgx;
|
||||||
|
|
||||||
if (ddata->cfg.quirks & SYSC_MODULE_QUIRK_WDT)
|
if (ddata->cfg.quirks & SYSC_MODULE_QUIRK_WDT) {
|
||||||
ddata->reset_done_quirk = sysc_reset_done_quirk_wdt;
|
ddata->reset_done_quirk = sysc_reset_done_quirk_wdt;
|
||||||
|
ddata->module_disable_quirk = sysc_reset_done_quirk_wdt;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sysc_clockdomain_init(struct sysc *ddata)
|
static int sysc_clockdomain_init(struct sysc *ddata)
|
||||||
|
|
Loading…
Reference in New Issue