hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/drivers/bus/ti-sysc.c
....@@ -38,6 +38,7 @@
3838 SOC_2420,
3939 SOC_2430,
4040 SOC_3430,
41
+ SOC_AM35,
4142 SOC_3630,
4243 SOC_4430,
4344 SOC_4460,
....@@ -1113,6 +1114,11 @@
11131114 if (ddata->cfg.quirks & (SYSC_QUIRK_SWSUP_SIDLE |
11141115 SYSC_QUIRK_SWSUP_SIDLE_ACT)) {
11151116 best_mode = SYSC_IDLE_NO;
1117
+
1118
+ /* Clear WAKEUP */
1119
+ if (regbits->enwkup_shift >= 0 &&
1120
+ ddata->cfg.sysc_val & BIT(regbits->enwkup_shift))
1121
+ reg &= ~BIT(regbits->enwkup_shift);
11161122 } else {
11171123 best_mode = fls(ddata->cfg.sidlemodes) - 1;
11181124 if (best_mode > SYSC_IDLE_MASK) {
....@@ -1231,6 +1237,13 @@
12311237 dev_err(dev, "%s: invalid sidlemode\n", __func__);
12321238 return ret;
12331239 }
1240
+ }
1241
+
1242
+ if (ddata->cfg.quirks & SYSC_QUIRK_SWSUP_SIDLE_ACT) {
1243
+ /* Set WAKEUP */
1244
+ if (regbits->enwkup_shift >= 0 &&
1245
+ ddata->cfg.sysc_val & BIT(regbits->enwkup_shift))
1246
+ reg |= BIT(regbits->enwkup_shift);
12341247 }
12351248
12361249 reg &= ~(SYSC_IDLE_MASK << regbits->sidle_shift);
....@@ -1496,14 +1509,16 @@
14961509 SYSC_QUIRK("smartreflex", 0, -ENODEV, 0x38, -ENODEV, 0x00000000, 0xffffffff,
14971510 SYSC_QUIRK_LEGACY_IDLE),
14981511 SYSC_QUIRK("uart", 0, 0x50, 0x54, 0x58, 0x00000046, 0xffffffff,
1499
- SYSC_QUIRK_SWSUP_SIDLE | SYSC_QUIRK_LEGACY_IDLE),
1512
+ SYSC_QUIRK_SWSUP_SIDLE_ACT | SYSC_QUIRK_LEGACY_IDLE),
15001513 SYSC_QUIRK("uart", 0, 0x50, 0x54, 0x58, 0x00000052, 0xffffffff,
1501
- SYSC_QUIRK_SWSUP_SIDLE | SYSC_QUIRK_LEGACY_IDLE),
1514
+ SYSC_QUIRK_SWSUP_SIDLE_ACT | SYSC_QUIRK_LEGACY_IDLE),
15021515 /* Uarts on omap4 and later */
15031516 SYSC_QUIRK("uart", 0, 0x50, 0x54, 0x58, 0x50411e03, 0xffff00ff,
1504
- SYSC_QUIRK_SWSUP_SIDLE | SYSC_QUIRK_LEGACY_IDLE),
1517
+ SYSC_QUIRK_SWSUP_SIDLE_ACT | SYSC_QUIRK_LEGACY_IDLE),
15051518 SYSC_QUIRK("uart", 0, 0x50, 0x54, 0x58, 0x47422e03, 0xffffffff,
1506
- SYSC_QUIRK_SWSUP_SIDLE | SYSC_QUIRK_LEGACY_IDLE),
1519
+ SYSC_QUIRK_SWSUP_SIDLE_ACT | SYSC_QUIRK_LEGACY_IDLE),
1520
+ SYSC_QUIRK("uart", 0, 0x50, 0x54, 0x58, 0x47424e03, 0xffffffff,
1521
+ SYSC_QUIRK_SWSUP_SIDLE_ACT | SYSC_QUIRK_LEGACY_IDLE),
15071522
15081523 /* Quirks that need to be set based on the module address */
15091524 SYSC_QUIRK("mcpdm", 0x40132000, 0, 0x10, -ENODEV, 0x50000800, 0xffffffff,
....@@ -1748,7 +1763,7 @@
17481763 if (!ddata->module_va)
17491764 return -EIO;
17501765
1751
- /* DISP_CONTROL */
1766
+ /* DISP_CONTROL, shut down lcd and digit on disable if enabled */
17521767 val = sysc_read(ddata, dispc_offset + 0x40);
17531768 lcd_en = val & lcd_en_mask;
17541769 digit_en = val & digit_en_mask;
....@@ -1760,7 +1775,7 @@
17601775 else
17611776 irq_mask |= BIT(2) | BIT(3); /* EVSYNC bits */
17621777 }
1763
- if (disable & (lcd_en | digit_en))
1778
+ if (disable && (lcd_en || digit_en))
17641779 sysc_write(ddata, dispc_offset + 0x40,
17651780 val & ~(lcd_en_mask | digit_en_mask));
17661781
....@@ -1816,7 +1831,7 @@
18161831 dev_warn(ddata->dev, "%s: timed out %08x !+ %08x\n",
18171832 __func__, val, irq_mask);
18181833
1819
- if (sysc_soc->soc == SOC_3430) {
1834
+ if (sysc_soc->soc == SOC_3430 || sysc_soc->soc == SOC_AM35) {
18201835 /* Clear DSS_SDI_CONTROL */
18211836 sysc_write(ddata, 0x44, 0);
18221837
....@@ -2078,11 +2093,12 @@
20782093 sysc_val = sysc_read_sysconfig(ddata);
20792094 sysc_val |= sysc_mask;
20802095 sysc_write(ddata, sysc_offset, sysc_val);
2096
+ /* Flush posted write */
2097
+ sysc_val = sysc_read_sysconfig(ddata);
20812098 }
20822099
20832100 if (ddata->cfg.srst_udelay)
2084
- usleep_range(ddata->cfg.srst_udelay,
2085
- ddata->cfg.srst_udelay * 2);
2101
+ fsleep(ddata->cfg.srst_udelay);
20862102
20872103 if (ddata->post_reset_quirk)
20882104 ddata->post_reset_quirk(ddata);
....@@ -2956,6 +2972,7 @@
29562972 static const struct soc_device_attribute sysc_soc_match[] = {
29572973 SOC_FLAG("OMAP242*", SOC_2420),
29582974 SOC_FLAG("OMAP243*", SOC_2430),
2975
+ SOC_FLAG("AM35*", SOC_AM35),
29592976 SOC_FLAG("OMAP3[45]*", SOC_3430),
29602977 SOC_FLAG("OMAP3[67]*", SOC_3630),
29612978 SOC_FLAG("OMAP443*", SOC_4430),
....@@ -3039,7 +3056,7 @@
30393056
30403057 match = soc_device_match(sysc_soc_match);
30413058 if (match && match->data)
3042
- sysc_soc->soc = (int)match->data;
3059
+ sysc_soc->soc = (enum sysc_soc)(uintptr_t)match->data;
30433060
30443061 /* Ignore devices that are not available on HS and EMU SoCs */
30453062 if (!sysc_soc->general_purpose) {
....@@ -3143,7 +3160,7 @@
31433160 * can be dropped if we stop supporting old beagleboard revisions
31443161 * A to B4 at some point.
31453162 */
3146
- if (sysc_soc->soc == SOC_3430)
3163
+ if (sysc_soc->soc == SOC_3430 || sysc_soc->soc == SOC_AM35)
31473164 error = -ENXIO;
31483165 else
31493166 error = -EBUSY;