.. | .. |
---|
38 | 38 | SOC_2420, |
---|
39 | 39 | SOC_2430, |
---|
40 | 40 | SOC_3430, |
---|
| 41 | + SOC_AM35, |
---|
41 | 42 | SOC_3630, |
---|
42 | 43 | SOC_4430, |
---|
43 | 44 | SOC_4460, |
---|
.. | .. |
---|
1113 | 1114 | if (ddata->cfg.quirks & (SYSC_QUIRK_SWSUP_SIDLE | |
---|
1114 | 1115 | SYSC_QUIRK_SWSUP_SIDLE_ACT)) { |
---|
1115 | 1116 | 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); |
---|
1116 | 1122 | } else { |
---|
1117 | 1123 | best_mode = fls(ddata->cfg.sidlemodes) - 1; |
---|
1118 | 1124 | if (best_mode > SYSC_IDLE_MASK) { |
---|
.. | .. |
---|
1231 | 1237 | dev_err(dev, "%s: invalid sidlemode\n", __func__); |
---|
1232 | 1238 | return ret; |
---|
1233 | 1239 | } |
---|
| 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); |
---|
1234 | 1247 | } |
---|
1235 | 1248 | |
---|
1236 | 1249 | reg &= ~(SYSC_IDLE_MASK << regbits->sidle_shift); |
---|
.. | .. |
---|
1496 | 1509 | SYSC_QUIRK("smartreflex", 0, -ENODEV, 0x38, -ENODEV, 0x00000000, 0xffffffff, |
---|
1497 | 1510 | SYSC_QUIRK_LEGACY_IDLE), |
---|
1498 | 1511 | 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), |
---|
1500 | 1513 | 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), |
---|
1502 | 1515 | /* Uarts on omap4 and later */ |
---|
1503 | 1516 | 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), |
---|
1505 | 1518 | 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), |
---|
1507 | 1522 | |
---|
1508 | 1523 | /* Quirks that need to be set based on the module address */ |
---|
1509 | 1524 | SYSC_QUIRK("mcpdm", 0x40132000, 0, 0x10, -ENODEV, 0x50000800, 0xffffffff, |
---|
.. | .. |
---|
1748 | 1763 | if (!ddata->module_va) |
---|
1749 | 1764 | return -EIO; |
---|
1750 | 1765 | |
---|
1751 | | - /* DISP_CONTROL */ |
---|
| 1766 | + /* DISP_CONTROL, shut down lcd and digit on disable if enabled */ |
---|
1752 | 1767 | val = sysc_read(ddata, dispc_offset + 0x40); |
---|
1753 | 1768 | lcd_en = val & lcd_en_mask; |
---|
1754 | 1769 | digit_en = val & digit_en_mask; |
---|
.. | .. |
---|
1760 | 1775 | else |
---|
1761 | 1776 | irq_mask |= BIT(2) | BIT(3); /* EVSYNC bits */ |
---|
1762 | 1777 | } |
---|
1763 | | - if (disable & (lcd_en | digit_en)) |
---|
| 1778 | + if (disable && (lcd_en || digit_en)) |
---|
1764 | 1779 | sysc_write(ddata, dispc_offset + 0x40, |
---|
1765 | 1780 | val & ~(lcd_en_mask | digit_en_mask)); |
---|
1766 | 1781 | |
---|
.. | .. |
---|
1816 | 1831 | dev_warn(ddata->dev, "%s: timed out %08x !+ %08x\n", |
---|
1817 | 1832 | __func__, val, irq_mask); |
---|
1818 | 1833 | |
---|
1819 | | - if (sysc_soc->soc == SOC_3430) { |
---|
| 1834 | + if (sysc_soc->soc == SOC_3430 || sysc_soc->soc == SOC_AM35) { |
---|
1820 | 1835 | /* Clear DSS_SDI_CONTROL */ |
---|
1821 | 1836 | sysc_write(ddata, 0x44, 0); |
---|
1822 | 1837 | |
---|
.. | .. |
---|
2078 | 2093 | sysc_val = sysc_read_sysconfig(ddata); |
---|
2079 | 2094 | sysc_val |= sysc_mask; |
---|
2080 | 2095 | sysc_write(ddata, sysc_offset, sysc_val); |
---|
| 2096 | + /* Flush posted write */ |
---|
| 2097 | + sysc_val = sysc_read_sysconfig(ddata); |
---|
2081 | 2098 | } |
---|
2082 | 2099 | |
---|
2083 | 2100 | if (ddata->cfg.srst_udelay) |
---|
2084 | | - usleep_range(ddata->cfg.srst_udelay, |
---|
2085 | | - ddata->cfg.srst_udelay * 2); |
---|
| 2101 | + fsleep(ddata->cfg.srst_udelay); |
---|
2086 | 2102 | |
---|
2087 | 2103 | if (ddata->post_reset_quirk) |
---|
2088 | 2104 | ddata->post_reset_quirk(ddata); |
---|
.. | .. |
---|
2956 | 2972 | static const struct soc_device_attribute sysc_soc_match[] = { |
---|
2957 | 2973 | SOC_FLAG("OMAP242*", SOC_2420), |
---|
2958 | 2974 | SOC_FLAG("OMAP243*", SOC_2430), |
---|
| 2975 | + SOC_FLAG("AM35*", SOC_AM35), |
---|
2959 | 2976 | SOC_FLAG("OMAP3[45]*", SOC_3430), |
---|
2960 | 2977 | SOC_FLAG("OMAP3[67]*", SOC_3630), |
---|
2961 | 2978 | SOC_FLAG("OMAP443*", SOC_4430), |
---|
.. | .. |
---|
3039 | 3056 | |
---|
3040 | 3057 | match = soc_device_match(sysc_soc_match); |
---|
3041 | 3058 | if (match && match->data) |
---|
3042 | | - sysc_soc->soc = (int)match->data; |
---|
| 3059 | + sysc_soc->soc = (enum sysc_soc)(uintptr_t)match->data; |
---|
3043 | 3060 | |
---|
3044 | 3061 | /* Ignore devices that are not available on HS and EMU SoCs */ |
---|
3045 | 3062 | if (!sysc_soc->general_purpose) { |
---|
.. | .. |
---|
3143 | 3160 | * can be dropped if we stop supporting old beagleboard revisions |
---|
3144 | 3161 | * A to B4 at some point. |
---|
3145 | 3162 | */ |
---|
3146 | | - if (sysc_soc->soc == SOC_3430) |
---|
| 3163 | + if (sysc_soc->soc == SOC_3430 || sysc_soc->soc == SOC_AM35) |
---|
3147 | 3164 | error = -ENXIO; |
---|
3148 | 3165 | else |
---|
3149 | 3166 | error = -EBUSY; |
---|