ti-sysc.c (c4d41d00552754cc8cdd66a52da9b7c203884d49) ti-sysc.c (6cfcd5563b4fadbf49ba8fa481978e5e86d30322)
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * ti-sysc.c - Texas Instruments sysc interconnect target driver
4 */
5
6#include <linux/io.h>
7#include <linux/clk.h>
8#include <linux/clkdev.h>

--- 222 unchanged lines hidden (view full) ---

231 sysc_mask = BIT(ddata->cap->regbits->srst_shift);
232
233 if (ddata->cfg.quirks & SYSS_QUIRK_RESETDONE_INVERTED)
234 syss_done = 0;
235 else
236 syss_done = ddata->cfg.syss_mask;
237
238 if (syss_offset >= 0) {
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * ti-sysc.c - Texas Instruments sysc interconnect target driver
4 */
5
6#include <linux/io.h>
7#include <linux/clk.h>
8#include <linux/clkdev.h>

--- 222 unchanged lines hidden (view full) ---

231 sysc_mask = BIT(ddata->cap->regbits->srst_shift);
232
233 if (ddata->cfg.quirks & SYSS_QUIRK_RESETDONE_INVERTED)
234 syss_done = 0;
235 else
236 syss_done = ddata->cfg.syss_mask;
237
238 if (syss_offset >= 0) {
239 error = readx_poll_timeout_atomic(sysc_read_sysstatus, ddata,
240 rstval, (rstval & ddata->cfg.syss_mask) ==
241 syss_done, 100, MAX_MODULE_SOFTRESET_WAIT);
239 error = readx_poll_timeout(sysc_read_sysstatus, ddata, rstval,
240 (rstval & ddata->cfg.syss_mask) ==
241 syss_done,
242 100, MAX_MODULE_SOFTRESET_WAIT);
242
243 } else if (ddata->cfg.quirks & SYSC_QUIRK_RESET_STATUS) {
243
244 } else if (ddata->cfg.quirks & SYSC_QUIRK_RESET_STATUS) {
244 error = readx_poll_timeout_atomic(sysc_read_sysconfig, ddata,
245 rstval, !(rstval & sysc_mask),
246 100, MAX_MODULE_SOFTRESET_WAIT);
245 error = readx_poll_timeout(sysc_read_sysconfig, ddata, rstval,
246 !(rstval & sysc_mask),
247 100, MAX_MODULE_SOFTRESET_WAIT);
247 }
248
249 return error;
250}
251
252static int sysc_add_named_clock_from_child(struct sysc *ddata,
253 const char *name,
254 const char *optfck_name)

--- 1018 unchanged lines hidden (view full) ---

1273}
1274
1275static int __maybe_unused sysc_noirq_suspend(struct device *dev)
1276{
1277 struct sysc *ddata;
1278
1279 ddata = dev_get_drvdata(dev);
1280
248 }
249
250 return error;
251}
252
253static int sysc_add_named_clock_from_child(struct sysc *ddata,
254 const char *name,
255 const char *optfck_name)

--- 1018 unchanged lines hidden (view full) ---

1274}
1275
1276static int __maybe_unused sysc_noirq_suspend(struct device *dev)
1277{
1278 struct sysc *ddata;
1279
1280 ddata = dev_get_drvdata(dev);
1281
1281 if (ddata->cfg.quirks &
1282 (SYSC_QUIRK_LEGACY_IDLE | SYSC_QUIRK_NO_IDLE))
1282 if (ddata->cfg.quirks & SYSC_QUIRK_LEGACY_IDLE)
1283 return 0;
1284
1285 return pm_runtime_force_suspend(dev);
1286}
1287
1288static int __maybe_unused sysc_noirq_resume(struct device *dev)
1289{
1290 struct sysc *ddata;
1291
1292 ddata = dev_get_drvdata(dev);
1293
1283 return 0;
1284
1285 return pm_runtime_force_suspend(dev);
1286}
1287
1288static int __maybe_unused sysc_noirq_resume(struct device *dev)
1289{
1290 struct sysc *ddata;
1291
1292 ddata = dev_get_drvdata(dev);
1293
1294 if (ddata->cfg.quirks &
1295 (SYSC_QUIRK_LEGACY_IDLE | SYSC_QUIRK_NO_IDLE))
1294 if (ddata->cfg.quirks & SYSC_QUIRK_LEGACY_IDLE)
1296 return 0;
1297
1298 return pm_runtime_force_resume(dev);
1299}
1300
1301static const struct dev_pm_ops sysc_pm_ops = {
1302 SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(sysc_noirq_suspend, sysc_noirq_resume)
1303 SET_RUNTIME_PM_OPS(sysc_runtime_suspend,

--- 420 unchanged lines hidden (view full) ---

1724
1725 if (!lock) {
1726 kick0_val = 0x83e70b13;
1727 kick1_val = 0x95a4f1e0;
1728 }
1729
1730 local_irq_save(flags);
1731 /* RTC_STATUS BUSY bit may stay active for 1/32768 seconds (~30 usec) */
1295 return 0;
1296
1297 return pm_runtime_force_resume(dev);
1298}
1299
1300static const struct dev_pm_ops sysc_pm_ops = {
1301 SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(sysc_noirq_suspend, sysc_noirq_resume)
1302 SET_RUNTIME_PM_OPS(sysc_runtime_suspend,

--- 420 unchanged lines hidden (view full) ---

1723
1724 if (!lock) {
1725 kick0_val = 0x83e70b13;
1726 kick1_val = 0x95a4f1e0;
1727 }
1728
1729 local_irq_save(flags);
1730 /* RTC_STATUS BUSY bit may stay active for 1/32768 seconds (~30 usec) */
1732 error = readl_poll_timeout_atomic(ddata->module_va + 0x44, val,
1733 !(val & BIT(0)), 100, 50);
1731 error = readl_poll_timeout(ddata->module_va + 0x44, val,
1732 !(val & BIT(0)), 100, 50);
1734 if (error)
1735 dev_warn(ddata->dev, "rtc busy timeout\n");
1736 /* Now we have ~15 microseconds to read/write various registers */
1737 sysc_write(ddata, 0x6c, kick0_val);
1738 sysc_write(ddata, 0x70, kick1_val);
1739 local_irq_restore(flags);
1740}
1741

--- 1118 unchanged lines hidden (view full) ---

2860 break;
2861 }
2862 }
2863 mutex_unlock(&sysc_soc->list_lock);
2864
2865 return error;
2866}
2867
1733 if (error)
1734 dev_warn(ddata->dev, "rtc busy timeout\n");
1735 /* Now we have ~15 microseconds to read/write various registers */
1736 sysc_write(ddata, 0x6c, kick0_val);
1737 sysc_write(ddata, 0x70, kick1_val);
1738 local_irq_restore(flags);
1739}
1740

--- 1118 unchanged lines hidden (view full) ---

2859 break;
2860 }
2861 }
2862 mutex_unlock(&sysc_soc->list_lock);
2863
2864 return error;
2865}
2866
2867/*
2868 * Ignore timers tagged with no-reset and no-idle. These are likely in use,
2869 * for example by drivers/clocksource/timer-ti-dm-systimer.c. If more checks
2870 * are needed, we could also look at the timer register configuration.
2871 */
2872static int sysc_check_active_timer(struct sysc *ddata)
2873{
2874 if (ddata->cap->type != TI_SYSC_OMAP2_TIMER &&
2875 ddata->cap->type != TI_SYSC_OMAP4_TIMER)
2876 return 0;
2877
2878 if ((ddata->cfg.quirks & SYSC_QUIRK_NO_RESET_ON_INIT) &&
2879 (ddata->cfg.quirks & SYSC_QUIRK_NO_IDLE))
2880 return -EBUSY;
2881
2882 return 0;
2883}
2884
2868static const struct of_device_id sysc_match_table[] = {
2869 { .compatible = "simple-bus", },
2870 { /* sentinel */ },
2871};
2872
2873static int sysc_probe(struct platform_device *pdev)
2874{
2875 struct ti_sysc_platform_data *pdata = dev_get_platdata(&pdev->dev);

--- 40 unchanged lines hidden (view full) ---

2916 return error;
2917
2918 sysc_init_early_quirks(ddata);
2919
2920 error = sysc_check_disabled_devices(ddata);
2921 if (error)
2922 return error;
2923
2885static const struct of_device_id sysc_match_table[] = {
2886 { .compatible = "simple-bus", },
2887 { /* sentinel */ },
2888};
2889
2890static int sysc_probe(struct platform_device *pdev)
2891{
2892 struct ti_sysc_platform_data *pdata = dev_get_platdata(&pdev->dev);

--- 40 unchanged lines hidden (view full) ---

2933 return error;
2934
2935 sysc_init_early_quirks(ddata);
2936
2937 error = sysc_check_disabled_devices(ddata);
2938 if (error)
2939 return error;
2940
2941 error = sysc_check_active_timer(ddata);
2942 if (error)
2943 return error;
2944
2924 error = sysc_get_clocks(ddata);
2925 if (error)
2926 return error;
2927
2928 error = sysc_init_resets(ddata);
2929 if (error)
2930 goto unprepare;
2931

--- 129 unchanged lines hidden ---
2945 error = sysc_get_clocks(ddata);
2946 if (error)
2947 return error;
2948
2949 error = sysc_init_resets(ddata);
2950 if (error)
2951 goto unprepare;
2952

--- 129 unchanged lines hidden ---