| .. | .. |
|---|
| 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; |
|---|