Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'drivers-ti-sysc-for-v6.10-signed' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap into soc/drivers

Driver updates for ti-sysc

A change to update the handling of no-reset-on-init quirk to make it init
time only like it should be. And a change to add the missing copyrights.

Also a series of changes to simplify the driver by dropping the old unused
handling for interconnect targets tagged pm_runtime_irq_safe().

These are all non-urgent changes and can be queued whenever suitable.

* tag 'drivers-ti-sysc-for-v6.10-signed' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap:
bus: ti-sysc: Drop legacy idle quirk handling
bus: ti-sysc: Drop legacy quirk handling for smartreflex
bus: ti-sysc: Drop legacy quirk handling for uarts
bus: ti-sysc: Add a description and copyrights
bus: ti-sysc: Move check for no-reset-on-init

Link: https://lore.kernel.org/r/pull-1714283210-549557@atomide.com
Signed-off-by: Arnd Bergmann <arnd@arndb.de>

+34 -132
+34 -131
drivers/bus/ti-sysc.c
··· 1 1 // SPDX-License-Identifier: GPL-2.0 2 2 /* 3 3 * ti-sysc.c - Texas Instruments sysc interconnect target driver 4 + * 5 + * TI SoCs have an interconnect target wrapper IP for many devices. The wrapper 6 + * IP manages clock gating, resets, and PM capabilities for the connected devices. 7 + * 8 + * Copyright (C) 2017-2024 Texas Instruments Incorporated - https://www.ti.com/ 9 + * 10 + * Many features are based on the earlier omap_hwmod arch code with thanks to all 11 + * the people who developed and debugged the code over the years: 12 + * 13 + * Copyright (C) 2009-2011 Nokia Corporation 14 + * Copyright (C) 2011-2021 Texas Instruments Incorporated - https://www.ti.com/ 4 15 */ 5 16 6 17 #include <linux/io.h> ··· 1469 1458 1470 1459 ddata = dev_get_drvdata(dev); 1471 1460 1472 - if (ddata->cfg.quirks & 1473 - (SYSC_QUIRK_LEGACY_IDLE | SYSC_QUIRK_NO_IDLE)) 1461 + if (ddata->cfg.quirks & SYSC_QUIRK_NO_IDLE) 1474 1462 return 0; 1475 1463 1476 1464 if (!ddata->enabled) ··· 1487 1477 1488 1478 ddata = dev_get_drvdata(dev); 1489 1479 1490 - if (ddata->cfg.quirks & 1491 - (SYSC_QUIRK_LEGACY_IDLE | SYSC_QUIRK_NO_IDLE)) 1480 + if (ddata->cfg.quirks & SYSC_QUIRK_NO_IDLE) 1492 1481 return 0; 1493 1482 1494 1483 if (ddata->cfg.quirks & SYSC_QUIRK_REINIT_ON_RESUME) { ··· 1538 1529 } 1539 1530 1540 1531 static const struct sysc_revision_quirk sysc_revision_quirks[] = { 1541 - /* These drivers need to be fixed to not use pm_runtime_irq_safe() */ 1542 - SYSC_QUIRK("uart", 0, 0x50, 0x54, 0x58, 0x00000046, 0xffffffff, 1543 - SYSC_QUIRK_SWSUP_SIDLE_ACT | SYSC_QUIRK_LEGACY_IDLE), 1544 - SYSC_QUIRK("uart", 0, 0x50, 0x54, 0x58, 0x00000052, 0xffffffff, 1545 - SYSC_QUIRK_SWSUP_SIDLE_ACT | SYSC_QUIRK_LEGACY_IDLE), 1546 - /* Uarts on omap4 and later */ 1547 - SYSC_QUIRK("uart", 0, 0x50, 0x54, 0x58, 0x50411e03, 0xffff00ff, 1548 - SYSC_QUIRK_SWSUP_SIDLE_ACT | SYSC_QUIRK_LEGACY_IDLE), 1549 - SYSC_QUIRK("uart", 0, 0x50, 0x54, 0x58, 0x47422e03, 0xffffffff, 1550 - SYSC_QUIRK_SWSUP_SIDLE_ACT | SYSC_QUIRK_LEGACY_IDLE), 1551 - SYSC_QUIRK("uart", 0, 0x50, 0x54, 0x58, 0x47424e03, 0xffffffff, 1552 - SYSC_QUIRK_SWSUP_SIDLE_ACT | SYSC_QUIRK_LEGACY_IDLE), 1553 - 1554 1532 /* Quirks that need to be set based on the module address */ 1555 1533 SYSC_QUIRK("mcpdm", 0x40132000, 0, 0x10, -ENODEV, 0x50000800, 0xffffffff, 1556 1534 SYSC_QUIRK_EXT_OPT_CLOCK | SYSC_QUIRK_NO_RESET_ON_INIT | ··· 1595 1599 SYSC_QUIRK_SWSUP_SIDLE | SYSC_QUIRK_SWSUP_MSTANDBY), 1596 1600 SYSC_QUIRK("sata", 0, 0xfc, 0x1100, -ENODEV, 0x5e412000, 0xffffffff, 1597 1601 SYSC_QUIRK_SWSUP_SIDLE | SYSC_QUIRK_SWSUP_MSTANDBY), 1602 + SYSC_QUIRK("uart", 0, 0x50, 0x54, 0x58, 0x00000046, 0xffffffff, 1603 + SYSC_QUIRK_SWSUP_SIDLE_ACT), 1604 + SYSC_QUIRK("uart", 0, 0x50, 0x54, 0x58, 0x00000052, 0xffffffff, 1605 + SYSC_QUIRK_SWSUP_SIDLE_ACT), 1606 + /* Uarts on omap4 and later */ 1607 + SYSC_QUIRK("uart", 0, 0x50, 0x54, 0x58, 0x50411e03, 0xffff00ff, 1608 + SYSC_QUIRK_SWSUP_SIDLE_ACT), 1609 + SYSC_QUIRK("uart", 0, 0x50, 0x54, 0x58, 0x47422e03, 0xffffffff, 1610 + SYSC_QUIRK_SWSUP_SIDLE_ACT), 1611 + SYSC_QUIRK("uart", 0, 0x50, 0x54, 0x58, 0x47424e03, 0xffffffff, 1612 + SYSC_QUIRK_SWSUP_SIDLE_ACT), 1598 1613 SYSC_QUIRK("usb_host_hs", 0, 0, 0x10, 0x14, 0x50700100, 0xffffffff, 1599 1614 SYSC_QUIRK_SWSUP_SIDLE | SYSC_QUIRK_SWSUP_MSTANDBY), 1600 1615 SYSC_QUIRK("usb_host_hs", 0, 0, 0x10, -ENODEV, 0x50700101, 0xffffffff, ··· 2152 2145 sysc_offset = ddata->offsets[SYSC_SYSCONFIG]; 2153 2146 2154 2147 if (ddata->legacy_mode || 2155 - ddata->cap->regbits->srst_shift < 0 || 2156 - ddata->cfg.quirks & SYSC_QUIRK_NO_RESET_ON_INIT) 2148 + ddata->cap->regbits->srst_shift < 0) 2157 2149 return 0; 2158 2150 2159 2151 sysc_mask = BIT(ddata->cap->regbits->srst_shift); ··· 2246 2240 goto err_main_clocks; 2247 2241 } 2248 2242 2249 - error = sysc_reset(ddata); 2250 - if (error) 2251 - dev_err(ddata->dev, "Reset failed with %d\n", error); 2243 + if (!(ddata->cfg.quirks & SYSC_QUIRK_NO_RESET_ON_INIT)) { 2244 + error = sysc_reset(ddata); 2245 + if (error) 2246 + dev_err(ddata->dev, "Reset failed with %d\n", error); 2252 2247 2253 - if (error && !ddata->legacy_mode) 2254 - sysc_disable_module(ddata->dev); 2248 + if (error && !ddata->legacy_mode) 2249 + sysc_disable_module(ddata->dev); 2250 + } 2255 2251 2256 2252 err_main_clocks: 2257 2253 if (error) ··· 2455 2447 return pm_generic_runtime_resume(dev); 2456 2448 } 2457 2449 2458 - #ifdef CONFIG_PM_SLEEP 2459 - static int sysc_child_suspend_noirq(struct device *dev) 2460 - { 2461 - struct sysc *ddata; 2462 - int error; 2463 - 2464 - ddata = sysc_child_to_parent(dev); 2465 - 2466 - dev_dbg(ddata->dev, "%s %s\n", __func__, 2467 - ddata->name ? ddata->name : ""); 2468 - 2469 - error = pm_generic_suspend_noirq(dev); 2470 - if (error) { 2471 - dev_err(dev, "%s error at %i: %i\n", 2472 - __func__, __LINE__, error); 2473 - 2474 - return error; 2475 - } 2476 - 2477 - if (!pm_runtime_status_suspended(dev)) { 2478 - error = pm_generic_runtime_suspend(dev); 2479 - if (error) { 2480 - dev_dbg(dev, "%s busy at %i: %i\n", 2481 - __func__, __LINE__, error); 2482 - 2483 - return 0; 2484 - } 2485 - 2486 - error = sysc_runtime_suspend(ddata->dev); 2487 - if (error) { 2488 - dev_err(dev, "%s error at %i: %i\n", 2489 - __func__, __LINE__, error); 2490 - 2491 - return error; 2492 - } 2493 - 2494 - ddata->child_needs_resume = true; 2495 - } 2496 - 2497 - return 0; 2498 - } 2499 - 2500 - static int sysc_child_resume_noirq(struct device *dev) 2501 - { 2502 - struct sysc *ddata; 2503 - int error; 2504 - 2505 - ddata = sysc_child_to_parent(dev); 2506 - 2507 - dev_dbg(ddata->dev, "%s %s\n", __func__, 2508 - ddata->name ? ddata->name : ""); 2509 - 2510 - if (ddata->child_needs_resume) { 2511 - ddata->child_needs_resume = false; 2512 - 2513 - error = sysc_runtime_resume(ddata->dev); 2514 - if (error) 2515 - dev_err(ddata->dev, 2516 - "%s runtime resume error: %i\n", 2517 - __func__, error); 2518 - 2519 - error = pm_generic_runtime_resume(dev); 2520 - if (error) 2521 - dev_err(ddata->dev, 2522 - "%s generic runtime resume: %i\n", 2523 - __func__, error); 2524 - } 2525 - 2526 - return pm_generic_resume_noirq(dev); 2527 - } 2528 - #endif 2529 - 2530 - static struct dev_pm_domain sysc_child_pm_domain = { 2531 - .ops = { 2532 - SET_RUNTIME_PM_OPS(sysc_child_runtime_suspend, 2533 - sysc_child_runtime_resume, 2534 - NULL) 2535 - USE_PLATFORM_PM_SLEEP_OPS 2536 - SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(sysc_child_suspend_noirq, 2537 - sysc_child_resume_noirq) 2538 - } 2539 - }; 2540 - 2541 2450 /* Caller needs to take list_lock if ever used outside of cpu_pm */ 2542 2451 static void sysc_reinit_modules(struct sysc_soc_info *soc) 2543 2452 { ··· 2525 2600 mutex_unlock(&sysc_soc->list_lock); 2526 2601 } 2527 2602 2528 - /** 2529 - * sysc_legacy_idle_quirk - handle children in omap_device compatible way 2530 - * @ddata: device driver data 2531 - * @child: child device driver 2532 - * 2533 - * Allow idle for child devices as done with _od_runtime_suspend(). 2534 - * Otherwise many child devices will not idle because of the permanent 2535 - * parent usecount set in pm_runtime_irq_safe(). 2536 - * 2537 - * Note that the long term solution is to just modify the child device 2538 - * drivers to not set pm_runtime_irq_safe() and then this can be just 2539 - * dropped. 2540 - */ 2541 - static void sysc_legacy_idle_quirk(struct sysc *ddata, struct device *child) 2542 - { 2543 - if (ddata->cfg.quirks & SYSC_QUIRK_LEGACY_IDLE) 2544 - dev_pm_domain_set(child, &sysc_child_pm_domain); 2545 - } 2546 - 2547 2603 static int sysc_notifier_call(struct notifier_block *nb, 2548 2604 unsigned long event, void *device) 2549 2605 { ··· 2541 2635 error = sysc_child_add_clocks(ddata, dev); 2542 2636 if (error) 2543 2637 return error; 2544 - sysc_legacy_idle_quirk(ddata, dev); 2545 2638 break; 2546 2639 default: 2547 2640 break; ··· 2764 2859 .type = TI_SYSC_OMAP34XX_SR, 2765 2860 .sysc_mask = SYSC_OMAP2_CLOCKACTIVITY, 2766 2861 .regbits = &sysc_regbits_omap34xx_sr, 2767 - .mod_quirks = SYSC_QUIRK_USE_CLOCKACT | SYSC_QUIRK_UNCACHED | 2768 - SYSC_QUIRK_LEGACY_IDLE, 2862 + .mod_quirks = SYSC_QUIRK_USE_CLOCKACT | SYSC_QUIRK_UNCACHED, 2769 2863 }; 2770 2864 2771 2865 /* ··· 2785 2881 .type = TI_SYSC_OMAP36XX_SR, 2786 2882 .sysc_mask = SYSC_OMAP3_SR_ENAWAKEUP, 2787 2883 .regbits = &sysc_regbits_omap36xx_sr, 2788 - .mod_quirks = SYSC_QUIRK_UNCACHED | SYSC_QUIRK_LEGACY_IDLE, 2884 + .mod_quirks = SYSC_QUIRK_UNCACHED, 2789 2885 }; 2790 2886 2791 2887 static const struct sysc_capabilities sysc_omap4_sr = { 2792 2888 .type = TI_SYSC_OMAP4_SR, 2793 2889 .regbits = &sysc_regbits_omap36xx_sr, 2794 - .mod_quirks = SYSC_QUIRK_LEGACY_IDLE, 2795 2890 }; 2796 2891 2797 2892 /*
-1
include/linux/platform_data/ti-sysc.h
··· 71 71 #define SYSC_QUIRK_SWSUP_SIDLE_ACT BIT(12) 72 72 #define SYSC_QUIRK_SWSUP_SIDLE BIT(11) 73 73 #define SYSC_QUIRK_EXT_OPT_CLOCK BIT(10) 74 - #define SYSC_QUIRK_LEGACY_IDLE BIT(9) 75 74 #define SYSC_QUIRK_RESET_STATUS BIT(8) 76 75 #define SYSC_QUIRK_NO_IDLE BIT(7) 77 76 #define SYSC_QUIRK_NO_IDLE_ON_INIT BIT(6)