mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-06 02:50:43 +00:00
TI sysc driver changes for v4.20 merge window
This series gets rid of the SYSC_QUIRK_RESOURCE_PROVIDER to make device detection happen mostly only if #define DEBUG is set. Few core devices still need to be detected to set legacy quirks. We also add support for booting am335x, am437x and dra7 SoCs with L4 devices defined in device tree instead of legacy platform data. And finally we simplify suspend with just SET_NOIRQ_SYSTEM_SLEEP_PM_OPS and dropping the custom functions that were attempting to work around issues that really turned out to be child device driver related issues. Apologies for a late pull request, debugging the suspend issues took a while and I did not want to send these changes until that got sorted out. -----BEGIN PGP SIGNATURE----- iQJFBAABCAAvFiEEkgNvrZJU/QSQYIcQG9Q+yVyrpXMFAlu1AGARHHRvbnlAYXRv bWlkZS5jb20ACgkQG9Q+yVyrpXMSuBAAvHJ6gKO2bv8AONDj6r1TBSoSjB7BwunL lnkDVKAzj/cNtahfqDuNLwFH0ftaQ21sS34qhFvvR3UVPBR+6BDz/NtUByh33ylh jvm3ZJ6AjscuOr9JH78yWQ08Xpqrbf02G4H3yzvFJMjIS9jA4HpEDDg6WKvGJMe7 aGFOFQP1DGrQbr+i6suCPY8wt2O/KOCV1euedJEql6Rt438d4uCygYxyV0aQJr6J kjM0T7Im8+3Y5RHkcCGP5sHAKVijBiduhzPgBTWYgpVGXc5Fo0aZMD7MdFwAZNlB 2cwX3cEhpDtbB9lnf7/N9zPrpnUrzreN/b1Xq9Dp8nvWdhudBRQsuuMccMgtU+IR e6s2EbEXSx/H8aVd2YH0ZJF1hA92AVOoesUHZ7NlmyDW4WkbGijy3YdzSiRfohBD AJ2INcmgSE0jhKKaB77+oWt5ey3Me+UIkArCKaNT/4BtNzDk6UrwkmLU4nFjjx2g eSvtih97oSHX59L6kQb0SINHuKRNc5i05bq2lIKt6RDiDxwa5FD2UaqojApTFRL9 KOCfOjRAc+22SY0PP4CUVoEUvD2xibrjKci3Uho5/vgeHTA9tE9c8Gw3OyNXj7Tg z7JTvwy49gV3qqAU6iEmFB5uvBXyKMe6nB7f2DyJ7IgRYcjwkoy15b5tcRBpT9SM N2iAVnfn23k= =f9xh -----END PGP SIGNATURE----- Merge tag 'omap-for-v4.20/ti-sysc-take2-signed' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap into next/drivers TI sysc driver changes for v4.20 merge window This series gets rid of the SYSC_QUIRK_RESOURCE_PROVIDER to make device detection happen mostly only if #define DEBUG is set. Few core devices still need to be detected to set legacy quirks. We also add support for booting am335x, am437x and dra7 SoCs with L4 devices defined in device tree instead of legacy platform data. And finally we simplify suspend with just SET_NOIRQ_SYSTEM_SLEEP_PM_OPS and dropping the custom functions that were attempting to work around issues that really turned out to be child device driver related issues. Apologies for a late pull request, debugging the suspend issues took a while and I did not want to send these changes until that got sorted out. * tag 'omap-for-v4.20/ti-sysc-take2-signed' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap: bus: ti-sysc: Just use SET_NOIRQ_SYSTEM_SLEEP_PM_OPS bus: ti-sysc: Make some warnings debug only bus: ti-sysc: Detect devices for debug on dra7 bus: ti-sysc: Detect timer and gpio on dra7 bus: ti-sysc: Detect devices on am335x when DEBUG is enabled bus: ti-sysc: Detect more devices on am473x for debugging bus: ti-sysc: Update revision masks to support am437x bus: ti-sysc: Defer suspend as needed Signed-off-by: Arnd Bergmann <arnd@arndb.de>
This commit is contained in:
commit
e51e8d5de9
2 changed files with 48 additions and 124 deletions
|
@ -701,69 +701,7 @@ static int __maybe_unused sysc_runtime_resume(struct device *dev)
|
|||
return error;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
static int sysc_suspend(struct device *dev)
|
||||
{
|
||||
struct sysc *ddata;
|
||||
int error;
|
||||
|
||||
ddata = dev_get_drvdata(dev);
|
||||
|
||||
if (ddata->cfg.quirks & (SYSC_QUIRK_RESOURCE_PROVIDER |
|
||||
SYSC_QUIRK_LEGACY_IDLE))
|
||||
return 0;
|
||||
|
||||
if (!ddata->enabled)
|
||||
return 0;
|
||||
|
||||
dev_dbg(ddata->dev, "%s %s\n", __func__,
|
||||
ddata->name ? ddata->name : "");
|
||||
|
||||
error = pm_runtime_put_sync_suspend(dev);
|
||||
if (error < 0) {
|
||||
dev_warn(ddata->dev, "%s not idle %i %s\n",
|
||||
__func__, error,
|
||||
ddata->name ? ddata->name : "");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
ddata->needs_resume = true;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int sysc_resume(struct device *dev)
|
||||
{
|
||||
struct sysc *ddata;
|
||||
int error;
|
||||
|
||||
ddata = dev_get_drvdata(dev);
|
||||
|
||||
if (ddata->cfg.quirks & (SYSC_QUIRK_RESOURCE_PROVIDER |
|
||||
SYSC_QUIRK_LEGACY_IDLE))
|
||||
return 0;
|
||||
|
||||
if (ddata->needs_resume) {
|
||||
dev_dbg(ddata->dev, "%s %s\n", __func__,
|
||||
ddata->name ? ddata->name : "");
|
||||
|
||||
error = pm_runtime_get_sync(dev);
|
||||
if (error < 0) {
|
||||
dev_err(ddata->dev, "%s error %i %s\n",
|
||||
__func__, error,
|
||||
ddata->name ? ddata->name : "");
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
ddata->needs_resume = false;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int sysc_noirq_suspend(struct device *dev)
|
||||
static int __maybe_unused sysc_noirq_suspend(struct device *dev)
|
||||
{
|
||||
struct sysc *ddata;
|
||||
|
||||
|
@ -772,21 +710,10 @@ static int sysc_noirq_suspend(struct device *dev)
|
|||
if (ddata->cfg.quirks & SYSC_QUIRK_LEGACY_IDLE)
|
||||
return 0;
|
||||
|
||||
if (!(ddata->cfg.quirks & SYSC_QUIRK_RESOURCE_PROVIDER))
|
||||
return 0;
|
||||
|
||||
if (!ddata->enabled)
|
||||
return 0;
|
||||
|
||||
dev_dbg(ddata->dev, "%s %s\n", __func__,
|
||||
ddata->name ? ddata->name : "");
|
||||
|
||||
ddata->needs_resume = true;
|
||||
|
||||
return sysc_runtime_suspend(dev);
|
||||
return pm_runtime_force_suspend(dev);
|
||||
}
|
||||
|
||||
static int sysc_noirq_resume(struct device *dev)
|
||||
static int __maybe_unused sysc_noirq_resume(struct device *dev)
|
||||
{
|
||||
struct sysc *ddata;
|
||||
|
||||
|
@ -795,24 +722,10 @@ static int sysc_noirq_resume(struct device *dev)
|
|||
if (ddata->cfg.quirks & SYSC_QUIRK_LEGACY_IDLE)
|
||||
return 0;
|
||||
|
||||
if (!(ddata->cfg.quirks & SYSC_QUIRK_RESOURCE_PROVIDER))
|
||||
return 0;
|
||||
|
||||
if (ddata->needs_resume) {
|
||||
dev_dbg(ddata->dev, "%s %s\n", __func__,
|
||||
ddata->name ? ddata->name : "");
|
||||
|
||||
ddata->needs_resume = false;
|
||||
|
||||
return sysc_runtime_resume(dev);
|
||||
return pm_runtime_force_resume(dev);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static const struct dev_pm_ops sysc_pm_ops = {
|
||||
SET_SYSTEM_SLEEP_PM_OPS(sysc_suspend, sysc_resume)
|
||||
SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(sysc_noirq_suspend, sysc_noirq_resume)
|
||||
SET_RUNTIME_PM_OPS(sysc_runtime_suspend,
|
||||
sysc_runtime_resume,
|
||||
|
@ -845,28 +758,8 @@ struct sysc_revision_quirk {
|
|||
}
|
||||
|
||||
static const struct sysc_revision_quirk sysc_revision_quirks[] = {
|
||||
/* These need to use noirq_suspend */
|
||||
SYSC_QUIRK("control", 0, 0, 0x10, -1, 0x40000900, 0xffffffff,
|
||||
SYSC_QUIRK_RESOURCE_PROVIDER),
|
||||
SYSC_QUIRK("i2c", 0, 0, 0x10, 0x90, 0x5040000a, 0xffffffff,
|
||||
SYSC_QUIRK_RESOURCE_PROVIDER),
|
||||
SYSC_QUIRK("mcspi", 0, 0, 0x10, -1, 0x40300a0b, 0xffffffff,
|
||||
SYSC_QUIRK_RESOURCE_PROVIDER),
|
||||
SYSC_QUIRK("prcm", 0, 0, -1, -1, 0x40000100, 0xffffffff,
|
||||
SYSC_QUIRK_RESOURCE_PROVIDER),
|
||||
SYSC_QUIRK("ocp2scp", 0, 0, 0x10, 0x14, 0x50060005, 0xffffffff,
|
||||
SYSC_QUIRK_RESOURCE_PROVIDER),
|
||||
SYSC_QUIRK("padconf", 0, 0, 0x10, -1, 0x4fff0800, 0xffffffff,
|
||||
SYSC_QUIRK_RESOURCE_PROVIDER),
|
||||
SYSC_QUIRK("scm", 0, 0, 0x10, -1, 0x40000900, 0xffffffff,
|
||||
SYSC_QUIRK_RESOURCE_PROVIDER),
|
||||
SYSC_QUIRK("scrm", 0, 0, -1, -1, 0x00000010, 0xffffffff,
|
||||
SYSC_QUIRK_RESOURCE_PROVIDER),
|
||||
SYSC_QUIRK("sdma", 0, 0, 0x2c, 0x28, 0x00010900, 0xffffffff,
|
||||
SYSC_QUIRK_RESOURCE_PROVIDER),
|
||||
|
||||
/* These drivers need to be fixed to not use pm_runtime_irq_safe() */
|
||||
SYSC_QUIRK("gpio", 0, 0, 0x10, 0x114, 0x50600801, 0xffffffff,
|
||||
SYSC_QUIRK("gpio", 0, 0, 0x10, 0x114, 0x50600801, 0xffff00ff,
|
||||
SYSC_QUIRK_LEGACY_IDLE | SYSC_QUIRK_OPT_CLKS_IN_RESET),
|
||||
SYSC_QUIRK("mmu", 0, 0, 0x10, 0x14, 0x00000020, 0xffffffff,
|
||||
SYSC_QUIRK_LEGACY_IDLE),
|
||||
|
@ -881,38 +774,70 @@ static const struct sysc_revision_quirk sysc_revision_quirks[] = {
|
|||
SYSC_QUIRK("timer", 0, 0, 0x10, 0x14, 0x00000015, 0xffffffff,
|
||||
SYSC_QUIRK_LEGACY_IDLE),
|
||||
/* Some timers on omap4 and later */
|
||||
SYSC_QUIRK("timer", 0, 0, 0x10, -1, 0x4fff1301, 0xffffffff,
|
||||
SYSC_QUIRK("timer", 0, 0, 0x10, -1, 0x50002100, 0xffffffff,
|
||||
SYSC_QUIRK_LEGACY_IDLE),
|
||||
SYSC_QUIRK("timer", 0, 0, 0x10, -1, 0x4fff1301, 0xffff00ff,
|
||||
SYSC_QUIRK_LEGACY_IDLE),
|
||||
SYSC_QUIRK("uart", 0, 0x50, 0x54, 0x58, 0x00000052, 0xffffffff,
|
||||
SYSC_QUIRK_LEGACY_IDLE),
|
||||
/* Uarts on omap4 and later */
|
||||
SYSC_QUIRK("uart", 0, 0x50, 0x54, 0x58, 0x50411e03, 0xffffffff,
|
||||
SYSC_QUIRK("uart", 0, 0x50, 0x54, 0x58, 0x50411e03, 0xffff00ff,
|
||||
SYSC_QUIRK_LEGACY_IDLE),
|
||||
|
||||
/* These devices don't yet suspend properly without legacy setting */
|
||||
SYSC_QUIRK("sdio", 0, 0, 0x10, -1, 0x40202301, 0xffffffff,
|
||||
SYSC_QUIRK_LEGACY_IDLE),
|
||||
SYSC_QUIRK("wdt", 0, 0, 0x10, 0x14, 0x502a0500, 0xffffffff,
|
||||
SYSC_QUIRK_LEGACY_IDLE),
|
||||
SYSC_QUIRK("wdt", 0, 0, 0x10, 0x14, 0x502a0d00, 0xffffffff,
|
||||
SYSC_QUIRK("uart", 0, 0x50, 0x54, 0x58, 0x47422e03, 0xffffffff,
|
||||
SYSC_QUIRK_LEGACY_IDLE),
|
||||
|
||||
#ifdef DEBUG
|
||||
SYSC_QUIRK("adc", 0, 0, 0x10, -1, 0x47300001, 0xffffffff, 0),
|
||||
SYSC_QUIRK("atl", 0, 0, -1, -1, 0x0a070100, 0xffffffff, 0),
|
||||
SYSC_QUIRK("aess", 0, 0, 0x10, -1, 0x40000000, 0xffffffff, 0),
|
||||
SYSC_QUIRK("cm", 0, 0, -1, -1, 0x40000301, 0xffffffff, 0),
|
||||
SYSC_QUIRK("control", 0, 0, 0x10, -1, 0x40000900, 0xffffffff, 0),
|
||||
SYSC_QUIRK("cpgmac", 0, 0x1200, 0x1208, 0x1204, 0x4edb1902,
|
||||
0xffff00f0, 0),
|
||||
SYSC_QUIRK("dcan", 0, 0, -1, -1, 0xffffffff, 0xffffffff, 0),
|
||||
SYSC_QUIRK("dcan", 0, 0, -1, -1, 0x00001401, 0xffffffff, 0),
|
||||
SYSC_QUIRK("dwc3", 0, 0, 0x10, -1, 0x500a0200, 0xffffffff, 0),
|
||||
SYSC_QUIRK("epwmss", 0, 0, 0x4, -1, 0x47400001, 0xffffffff, 0),
|
||||
SYSC_QUIRK("gpu", 0, 0x1fc00, 0x1fc10, -1, 0, 0, 0),
|
||||
SYSC_QUIRK("hdq1w", 0, 0, 0x14, 0x18, 0x00000006, 0xffffffff, 0),
|
||||
SYSC_QUIRK("hdq1w", 0, 0, 0x14, 0x18, 0x0000000a, 0xffffffff, 0),
|
||||
SYSC_QUIRK("hsi", 0, 0, 0x10, 0x14, 0x50043101, 0xffffffff, 0),
|
||||
SYSC_QUIRK("iss", 0, 0, 0x10, -1, 0x40000101, 0xffffffff, 0),
|
||||
SYSC_QUIRK("i2c", 0, 0, 0x10, 0x90, 0x5040000a, 0xfffff0f0, 0),
|
||||
SYSC_QUIRK("lcdc", 0, 0, 0x54, -1, 0x4f201000, 0xffffffff, 0),
|
||||
SYSC_QUIRK("mcasp", 0, 0, 0x4, -1, 0x44306302, 0xffffffff, 0),
|
||||
SYSC_QUIRK("mcasp", 0, 0, 0x4, -1, 0x44307b02, 0xffffffff, 0),
|
||||
SYSC_QUIRK("mcbsp", 0, -1, 0x8c, -1, 0, 0, 0),
|
||||
SYSC_QUIRK("mcspi", 0, 0, 0x10, -1, 0x40300a0b, 0xffff00ff, 0),
|
||||
SYSC_QUIRK("mcspi", 0, 0, 0x110, 0x114, 0x40300a0b, 0xffffffff, 0),
|
||||
SYSC_QUIRK("mailbox", 0, 0, 0x10, -1, 0x00000400, 0xffffffff, 0),
|
||||
SYSC_QUIRK("m3", 0, 0, -1, -1, 0x5f580105, 0x0fff0f00, 0),
|
||||
SYSC_QUIRK("ocp2scp", 0, 0, 0x10, 0x14, 0x50060005, 0xfffffff0, 0),
|
||||
SYSC_QUIRK("ocp2scp", 0, 0, -1, -1, 0x50060007, 0xffffffff, 0),
|
||||
SYSC_QUIRK("padconf", 0, 0, 0x10, -1, 0x4fff0800, 0xffffffff, 0),
|
||||
SYSC_QUIRK("prcm", 0, 0, -1, -1, 0x40000100, 0xffffffff, 0),
|
||||
SYSC_QUIRK("prcm", 0, 0, -1, -1, 0x00004102, 0xffffffff, 0),
|
||||
SYSC_QUIRK("prcm", 0, 0, -1, -1, 0x40000400, 0xffffffff, 0),
|
||||
SYSC_QUIRK("scm", 0, 0, 0x10, -1, 0x40000900, 0xffffffff, 0),
|
||||
SYSC_QUIRK("scm", 0, 0, -1, -1, 0x4e8b0100, 0xffffffff, 0),
|
||||
SYSC_QUIRK("scm", 0, 0, -1, -1, 0x4f000100, 0xffffffff, 0),
|
||||
SYSC_QUIRK("scm", 0, 0, -1, -1, 0x40000900, 0xffffffff, 0),
|
||||
SYSC_QUIRK("scrm", 0, 0, -1, -1, 0x00000010, 0xffffffff, 0),
|
||||
SYSC_QUIRK("sdio", 0, 0, 0x10, -1, 0x40202301, 0xffff0ff0, 0),
|
||||
SYSC_QUIRK("sdio", 0, 0x2fc, 0x110, 0x114, 0x31010000, 0xffffffff, 0),
|
||||
SYSC_QUIRK("sdma", 0, 0, 0x2c, 0x28, 0x00010900, 0xffffffff, 0),
|
||||
SYSC_QUIRK("slimbus", 0, 0, 0x10, -1, 0x40000902, 0xffffffff, 0),
|
||||
SYSC_QUIRK("slimbus", 0, 0, 0x10, -1, 0x40002903, 0xffffffff, 0),
|
||||
SYSC_QUIRK("spinlock", 0, 0, 0x10, -1, 0x50020000, 0xffffffff, 0),
|
||||
SYSC_QUIRK("rng", 0, 0x1fe0, 0x1fe4, -1, 0x00000020, 0xffffffff, 0),
|
||||
SYSC_QUIRK("rtc", 0, 0x74, 0x78, -1, 0x4eb01908, 0xffff00f0, 0),
|
||||
SYSC_QUIRK("timer32k", 0, 0, 0x4, -1, 0x00000060, 0xffffffff, 0),
|
||||
SYSC_QUIRK("usbhstll", 0, 0, 0x10, 0x14, 0x00000004, 0xffffffff, 0),
|
||||
SYSC_QUIRK("usb_host_hs", 0, 0, 0x10, 0x14, 0x50700100, 0xffffffff, 0),
|
||||
SYSC_QUIRK("usb_otg_hs", 0, 0x400, 0x404, 0x408, 0x00000050,
|
||||
0xffffffff, 0),
|
||||
SYSC_QUIRK("wdt", 0, 0, 0x10, 0x14, 0x502a0500, 0xfffff0f0, 0),
|
||||
SYSC_QUIRK("vfpe", 0, 0, 0x104, -1, 0x4d001200, 0xffffffff, 0),
|
||||
#endif
|
||||
};
|
||||
|
||||
|
@ -1221,7 +1146,7 @@ static int sysc_child_suspend_noirq(struct device *dev)
|
|||
if (!pm_runtime_status_suspended(dev)) {
|
||||
error = pm_generic_runtime_suspend(dev);
|
||||
if (error) {
|
||||
dev_warn(dev, "%s busy at %i: %i\n",
|
||||
dev_dbg(dev, "%s busy at %i: %i\n",
|
||||
__func__, __LINE__, error);
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -46,7 +46,6 @@ struct sysc_regbits {
|
|||
s8 emufree_shift;
|
||||
};
|
||||
|
||||
#define SYSC_QUIRK_RESOURCE_PROVIDER BIT(9)
|
||||
#define SYSC_QUIRK_LEGACY_IDLE BIT(8)
|
||||
#define SYSC_QUIRK_RESET_STATUS BIT(7)
|
||||
#define SYSC_QUIRK_NO_IDLE_ON_INIT BIT(6)
|
||||
|
|
Loading…
Reference in a new issue