aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mmc/host/sdhci.c
diff options
context:
space:
mode:
authorAdrian Hunter <adrian.hunter@intel.com>2011-10-03 08:33:34 -0400
committerChris Ball <cjb@laptop.org>2011-10-26 16:32:20 -0400
commit66fd8ad5100b5003046aa744a4f12fa31bb831f9 (patch)
treec71aa6ff8b5c4c2919b93630a2315017f4610986 /drivers/mmc/host/sdhci.c
parent08a7e1dfaa63bf5132b5b7231fcf9a33473c78f5 (diff)
mmc: sdhci-pci: add runtime pm support
Ths patch allows runtime PM for sdhci-pci, runtime suspending after inactivity of 50ms and ensuring runtime resume before SDHC registers are accessed. During runtime suspend, interrupts are masked. The host controller state is restored at runtime resume. For Medfield, the host controller's card detect mechanism is supplanted by an always-on GPIO which provides for card detect wake-up. Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> Signed-off-by: Chris Ball <cjb@laptop.org>
Diffstat (limited to 'drivers/mmc/host/sdhci.c')
-rw-r--r--drivers/mmc/host/sdhci.c255
1 files changed, 211 insertions, 44 deletions
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
index 9394860602fe..155deb8629af 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -21,6 +21,7 @@
21#include <linux/slab.h> 21#include <linux/slab.h>
22#include <linux/scatterlist.h> 22#include <linux/scatterlist.h>
23#include <linux/regulator/consumer.h> 23#include <linux/regulator/consumer.h>
24#include <linux/pm_runtime.h>
24 25
25#include <linux/leds.h> 26#include <linux/leds.h>
26 27
@@ -42,6 +43,7 @@
42#define MAX_TUNING_LOOP 40 43#define MAX_TUNING_LOOP 40
43 44
44static unsigned int debug_quirks = 0; 45static unsigned int debug_quirks = 0;
46static unsigned int debug_quirks2;
45 47
46static void sdhci_finish_data(struct sdhci_host *); 48static void sdhci_finish_data(struct sdhci_host *);
47 49
@@ -50,6 +52,20 @@ static void sdhci_finish_command(struct sdhci_host *);
50static int sdhci_execute_tuning(struct mmc_host *mmc); 52static int sdhci_execute_tuning(struct mmc_host *mmc);
51static void sdhci_tuning_timer(unsigned long data); 53static void sdhci_tuning_timer(unsigned long data);
52 54
55#ifdef CONFIG_PM_RUNTIME
56static int sdhci_runtime_pm_get(struct sdhci_host *host);
57static int sdhci_runtime_pm_put(struct sdhci_host *host);
58#else
59static inline int sdhci_runtime_pm_get(struct sdhci_host *host)
60{
61 return 0;
62}
63static inline int sdhci_runtime_pm_put(struct sdhci_host *host)
64{
65 return 0;
66}
67#endif
68
53static void sdhci_dumpregs(struct sdhci_host *host) 69static void sdhci_dumpregs(struct sdhci_host *host)
54{ 70{
55 printk(KERN_DEBUG DRIVER_NAME ": =========== REGISTER DUMP (%s)===========\n", 71 printk(KERN_DEBUG DRIVER_NAME ": =========== REGISTER DUMP (%s)===========\n",
@@ -133,6 +149,9 @@ static void sdhci_set_card_detection(struct sdhci_host *host, bool enable)
133 if (host->quirks & SDHCI_QUIRK_BROKEN_CARD_DETECTION) 149 if (host->quirks & SDHCI_QUIRK_BROKEN_CARD_DETECTION)
134 return; 150 return;
135 151
152 if (host->quirks2 & SDHCI_QUIRK2_OWN_CARD_DETECTION)
153 return;
154
136 present = sdhci_readl(host, SDHCI_PRESENT_STATE) & 155 present = sdhci_readl(host, SDHCI_PRESENT_STATE) &
137 SDHCI_CARD_PRESENT; 156 SDHCI_CARD_PRESENT;
138 irqs = present ? SDHCI_INT_CARD_REMOVE : SDHCI_INT_CARD_INSERT; 157 irqs = present ? SDHCI_INT_CARD_REMOVE : SDHCI_INT_CARD_INSERT;
@@ -252,11 +271,14 @@ static void sdhci_led_control(struct led_classdev *led,
252 271
253 spin_lock_irqsave(&host->lock, flags); 272 spin_lock_irqsave(&host->lock, flags);
254 273
274 if (host->runtime_suspended)
275 goto out;
276
255 if (brightness == LED_OFF) 277 if (brightness == LED_OFF)
256 sdhci_deactivate_led(host); 278 sdhci_deactivate_led(host);
257 else 279 else
258 sdhci_activate_led(host); 280 sdhci_activate_led(host);
259 281out:
260 spin_unlock_irqrestore(&host->lock, flags); 282 spin_unlock_irqrestore(&host->lock, flags);
261} 283}
262#endif 284#endif
@@ -1210,6 +1232,8 @@ static void sdhci_request(struct mmc_host *mmc, struct mmc_request *mrq)
1210 1232
1211 host = mmc_priv(mmc); 1233 host = mmc_priv(mmc);
1212 1234
1235 sdhci_runtime_pm_get(host);
1236
1213 spin_lock_irqsave(&host->lock, flags); 1237 spin_lock_irqsave(&host->lock, flags);
1214 1238
1215 WARN_ON(host->mrq != NULL); 1239 WARN_ON(host->mrq != NULL);
@@ -1270,14 +1294,11 @@ static void sdhci_request(struct mmc_host *mmc, struct mmc_request *mrq)
1270 spin_unlock_irqrestore(&host->lock, flags); 1294 spin_unlock_irqrestore(&host->lock, flags);
1271} 1295}
1272 1296
1273static void sdhci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) 1297static void sdhci_do_set_ios(struct sdhci_host *host, struct mmc_ios *ios)
1274{ 1298{
1275 struct sdhci_host *host;
1276 unsigned long flags; 1299 unsigned long flags;
1277 u8 ctrl; 1300 u8 ctrl;
1278 1301
1279 host = mmc_priv(mmc);
1280
1281 spin_lock_irqsave(&host->lock, flags); 1302 spin_lock_irqsave(&host->lock, flags);
1282 1303
1283 if (host->flags & SDHCI_DEVICE_DEAD) 1304 if (host->flags & SDHCI_DEVICE_DEAD)
@@ -1427,7 +1448,16 @@ out:
1427 spin_unlock_irqrestore(&host->lock, flags); 1448 spin_unlock_irqrestore(&host->lock, flags);
1428} 1449}
1429 1450
1430static int check_ro(struct sdhci_host *host) 1451static void sdhci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
1452{
1453 struct sdhci_host *host = mmc_priv(mmc);
1454
1455 sdhci_runtime_pm_get(host);
1456 sdhci_do_set_ios(host, ios);
1457 sdhci_runtime_pm_put(host);
1458}
1459
1460static int sdhci_check_ro(struct sdhci_host *host)
1431{ 1461{
1432 unsigned long flags; 1462 unsigned long flags;
1433 int is_readonly; 1463 int is_readonly;
@@ -1451,19 +1481,16 @@ static int check_ro(struct sdhci_host *host)
1451 1481
1452#define SAMPLE_COUNT 5 1482#define SAMPLE_COUNT 5
1453 1483
1454static int sdhci_get_ro(struct mmc_host *mmc) 1484static int sdhci_do_get_ro(struct sdhci_host *host)
1455{ 1485{
1456 struct sdhci_host *host;
1457 int i, ro_count; 1486 int i, ro_count;
1458 1487
1459 host = mmc_priv(mmc);
1460
1461 if (!(host->quirks & SDHCI_QUIRK_UNSTABLE_RO_DETECT)) 1488 if (!(host->quirks & SDHCI_QUIRK_UNSTABLE_RO_DETECT))
1462 return check_ro(host); 1489 return sdhci_check_ro(host);
1463 1490
1464 ro_count = 0; 1491 ro_count = 0;
1465 for (i = 0; i < SAMPLE_COUNT; i++) { 1492 for (i = 0; i < SAMPLE_COUNT; i++) {
1466 if (check_ro(host)) { 1493 if (sdhci_check_ro(host)) {
1467 if (++ro_count > SAMPLE_COUNT / 2) 1494 if (++ro_count > SAMPLE_COUNT / 2)
1468 return 1; 1495 return 1;
1469 } 1496 }
@@ -1480,38 +1507,56 @@ static void sdhci_hw_reset(struct mmc_host *mmc)
1480 host->ops->hw_reset(host); 1507 host->ops->hw_reset(host);
1481} 1508}
1482 1509
1483static void sdhci_enable_sdio_irq(struct mmc_host *mmc, int enable) 1510static int sdhci_get_ro(struct mmc_host *mmc)
1484{ 1511{
1485 struct sdhci_host *host; 1512 struct sdhci_host *host = mmc_priv(mmc);
1486 unsigned long flags; 1513 int ret;
1487
1488 host = mmc_priv(mmc);
1489 1514
1490 spin_lock_irqsave(&host->lock, flags); 1515 sdhci_runtime_pm_get(host);
1516 ret = sdhci_do_get_ro(host);
1517 sdhci_runtime_pm_put(host);
1518 return ret;
1519}
1491 1520
1521static void sdhci_enable_sdio_irq_nolock(struct sdhci_host *host, int enable)
1522{
1492 if (host->flags & SDHCI_DEVICE_DEAD) 1523 if (host->flags & SDHCI_DEVICE_DEAD)
1493 goto out; 1524 goto out;
1494 1525
1495 if (enable) 1526 if (enable)
1527 host->flags |= SDHCI_SDIO_IRQ_ENABLED;
1528 else
1529 host->flags &= ~SDHCI_SDIO_IRQ_ENABLED;
1530
1531 /* SDIO IRQ will be enabled as appropriate in runtime resume */
1532 if (host->runtime_suspended)
1533 goto out;
1534
1535 if (enable)
1496 sdhci_unmask_irqs(host, SDHCI_INT_CARD_INT); 1536 sdhci_unmask_irqs(host, SDHCI_INT_CARD_INT);
1497 else 1537 else
1498 sdhci_mask_irqs(host, SDHCI_INT_CARD_INT); 1538 sdhci_mask_irqs(host, SDHCI_INT_CARD_INT);
1499out: 1539out:
1500 mmiowb(); 1540 mmiowb();
1541}
1542
1543static void sdhci_enable_sdio_irq(struct mmc_host *mmc, int enable)
1544{
1545 struct sdhci_host *host = mmc_priv(mmc);
1546 unsigned long flags;
1501 1547
1548 spin_lock_irqsave(&host->lock, flags);
1549 sdhci_enable_sdio_irq_nolock(host, enable);
1502 spin_unlock_irqrestore(&host->lock, flags); 1550 spin_unlock_irqrestore(&host->lock, flags);
1503} 1551}
1504 1552
1505static int sdhci_start_signal_voltage_switch(struct mmc_host *mmc, 1553static int sdhci_do_start_signal_voltage_switch(struct sdhci_host *host,
1506 struct mmc_ios *ios) 1554 struct mmc_ios *ios)
1507{ 1555{
1508 struct sdhci_host *host;
1509 u8 pwr; 1556 u8 pwr;
1510 u16 clk, ctrl; 1557 u16 clk, ctrl;
1511 u32 present_state; 1558 u32 present_state;
1512 1559
1513 host = mmc_priv(mmc);
1514
1515 /* 1560 /*
1516 * Signal Voltage Switching is only applicable for Host Controllers 1561 * Signal Voltage Switching is only applicable for Host Controllers
1517 * v3.00 and above. 1562 * v3.00 and above.
@@ -1604,6 +1649,20 @@ static int sdhci_start_signal_voltage_switch(struct mmc_host *mmc,
1604 return 0; 1649 return 0;
1605} 1650}
1606 1651
1652static int sdhci_start_signal_voltage_switch(struct mmc_host *mmc,
1653 struct mmc_ios *ios)
1654{
1655 struct sdhci_host *host = mmc_priv(mmc);
1656 int err;
1657
1658 if (host->version < SDHCI_SPEC_300)
1659 return 0;
1660 sdhci_runtime_pm_get(host);
1661 err = sdhci_do_start_signal_voltage_switch(host, ios);
1662 sdhci_runtime_pm_put(host);
1663 return err;
1664}
1665
1607static int sdhci_execute_tuning(struct mmc_host *mmc) 1666static int sdhci_execute_tuning(struct mmc_host *mmc)
1608{ 1667{
1609 struct sdhci_host *host; 1668 struct sdhci_host *host;
@@ -1615,6 +1674,7 @@ static int sdhci_execute_tuning(struct mmc_host *mmc)
1615 1674
1616 host = mmc_priv(mmc); 1675 host = mmc_priv(mmc);
1617 1676
1677 sdhci_runtime_pm_get(host);
1618 disable_irq(host->irq); 1678 disable_irq(host->irq);
1619 spin_lock(&host->lock); 1679 spin_lock(&host->lock);
1620 1680
@@ -1632,6 +1692,7 @@ static int sdhci_execute_tuning(struct mmc_host *mmc)
1632 else { 1692 else {
1633 spin_unlock(&host->lock); 1693 spin_unlock(&host->lock);
1634 enable_irq(host->irq); 1694 enable_irq(host->irq);
1695 sdhci_runtime_pm_put(host);
1635 return 0; 1696 return 0;
1636 } 1697 }
1637 1698
@@ -1657,7 +1718,7 @@ static int sdhci_execute_tuning(struct mmc_host *mmc)
1657 timeout = 150; 1718 timeout = 150;
1658 do { 1719 do {
1659 struct mmc_command cmd = {0}; 1720 struct mmc_command cmd = {0};
1660 struct mmc_request mrq = {0}; 1721 struct mmc_request mrq = {NULL};
1661 1722
1662 if (!tuning_loop_counter && !timeout) 1723 if (!tuning_loop_counter && !timeout)
1663 break; 1724 break;
@@ -1775,18 +1836,16 @@ out:
1775 sdhci_clear_set_irqs(host, SDHCI_INT_DATA_AVAIL, ier); 1836 sdhci_clear_set_irqs(host, SDHCI_INT_DATA_AVAIL, ier);
1776 spin_unlock(&host->lock); 1837 spin_unlock(&host->lock);
1777 enable_irq(host->irq); 1838 enable_irq(host->irq);
1839 sdhci_runtime_pm_put(host);
1778 1840
1779 return err; 1841 return err;
1780} 1842}
1781 1843
1782static void sdhci_enable_preset_value(struct mmc_host *mmc, bool enable) 1844static void sdhci_do_enable_preset_value(struct sdhci_host *host, bool enable)
1783{ 1845{
1784 struct sdhci_host *host;
1785 u16 ctrl; 1846 u16 ctrl;
1786 unsigned long flags; 1847 unsigned long flags;
1787 1848
1788 host = mmc_priv(mmc);
1789
1790 /* Host Controller v3.00 defines preset value registers */ 1849 /* Host Controller v3.00 defines preset value registers */
1791 if (host->version < SDHCI_SPEC_300) 1850 if (host->version < SDHCI_SPEC_300)
1792 return; 1851 return;
@@ -1802,14 +1861,25 @@ static void sdhci_enable_preset_value(struct mmc_host *mmc, bool enable)
1802 if (enable && !(ctrl & SDHCI_CTRL_PRESET_VAL_ENABLE)) { 1861 if (enable && !(ctrl & SDHCI_CTRL_PRESET_VAL_ENABLE)) {
1803 ctrl |= SDHCI_CTRL_PRESET_VAL_ENABLE; 1862 ctrl |= SDHCI_CTRL_PRESET_VAL_ENABLE;
1804 sdhci_writew(host, ctrl, SDHCI_HOST_CONTROL2); 1863 sdhci_writew(host, ctrl, SDHCI_HOST_CONTROL2);
1864 host->flags |= SDHCI_PV_ENABLED;
1805 } else if (!enable && (ctrl & SDHCI_CTRL_PRESET_VAL_ENABLE)) { 1865 } else if (!enable && (ctrl & SDHCI_CTRL_PRESET_VAL_ENABLE)) {
1806 ctrl &= ~SDHCI_CTRL_PRESET_VAL_ENABLE; 1866 ctrl &= ~SDHCI_CTRL_PRESET_VAL_ENABLE;
1807 sdhci_writew(host, ctrl, SDHCI_HOST_CONTROL2); 1867 sdhci_writew(host, ctrl, SDHCI_HOST_CONTROL2);
1868 host->flags &= ~SDHCI_PV_ENABLED;
1808 } 1869 }
1809 1870
1810 spin_unlock_irqrestore(&host->lock, flags); 1871 spin_unlock_irqrestore(&host->lock, flags);
1811} 1872}
1812 1873
1874static void sdhci_enable_preset_value(struct mmc_host *mmc, bool enable)
1875{
1876 struct sdhci_host *host = mmc_priv(mmc);
1877
1878 sdhci_runtime_pm_get(host);
1879 sdhci_do_enable_preset_value(host, enable);
1880 sdhci_runtime_pm_put(host);
1881}
1882
1813static const struct mmc_host_ops sdhci_ops = { 1883static const struct mmc_host_ops sdhci_ops = {
1814 .request = sdhci_request, 1884 .request = sdhci_request,
1815 .set_ios = sdhci_set_ios, 1885 .set_ios = sdhci_set_ios,
@@ -1836,19 +1906,19 @@ static void sdhci_tasklet_card(unsigned long param)
1836 1906
1837 spin_lock_irqsave(&host->lock, flags); 1907 spin_lock_irqsave(&host->lock, flags);
1838 1908
1839 if (!(sdhci_readl(host, SDHCI_PRESENT_STATE) & SDHCI_CARD_PRESENT)) { 1909 /* Check host->mrq first in case we are runtime suspended */
1840 if (host->mrq) { 1910 if (host->mrq &&
1841 printk(KERN_ERR "%s: Card removed during transfer!\n", 1911 !(sdhci_readl(host, SDHCI_PRESENT_STATE) & SDHCI_CARD_PRESENT)) {
1842 mmc_hostname(host->mmc)); 1912 printk(KERN_ERR "%s: Card removed during transfer!\n",
1843 printk(KERN_ERR "%s: Resetting controller.\n", 1913 mmc_hostname(host->mmc));
1844 mmc_hostname(host->mmc)); 1914 printk(KERN_ERR "%s: Resetting controller.\n",
1915 mmc_hostname(host->mmc));
1845 1916
1846 sdhci_reset(host, SDHCI_RESET_CMD); 1917 sdhci_reset(host, SDHCI_RESET_CMD);
1847 sdhci_reset(host, SDHCI_RESET_DATA); 1918 sdhci_reset(host, SDHCI_RESET_DATA);
1848 1919
1849 host->mrq->cmd->error = -ENOMEDIUM; 1920 host->mrq->cmd->error = -ENOMEDIUM;
1850 tasklet_schedule(&host->finish_tasklet); 1921 tasklet_schedule(&host->finish_tasklet);
1851 }
1852 } 1922 }
1853 1923
1854 spin_unlock_irqrestore(&host->lock, flags); 1924 spin_unlock_irqrestore(&host->lock, flags);
@@ -1864,14 +1934,16 @@ static void sdhci_tasklet_finish(unsigned long param)
1864 1934
1865 host = (struct sdhci_host*)param; 1935 host = (struct sdhci_host*)param;
1866 1936
1937 spin_lock_irqsave(&host->lock, flags);
1938
1867 /* 1939 /*
1868 * If this tasklet gets rescheduled while running, it will 1940 * If this tasklet gets rescheduled while running, it will
1869 * be run again afterwards but without any active request. 1941 * be run again afterwards but without any active request.
1870 */ 1942 */
1871 if (!host->mrq) 1943 if (!host->mrq) {
1944 spin_unlock_irqrestore(&host->lock, flags);
1872 return; 1945 return;
1873 1946 }
1874 spin_lock_irqsave(&host->lock, flags);
1875 1947
1876 del_timer(&host->timer); 1948 del_timer(&host->timer);
1877 1949
@@ -1915,6 +1987,7 @@ static void sdhci_tasklet_finish(unsigned long param)
1915 spin_unlock_irqrestore(&host->lock, flags); 1987 spin_unlock_irqrestore(&host->lock, flags);
1916 1988
1917 mmc_request_done(host->mmc, mrq); 1989 mmc_request_done(host->mmc, mrq);
1990 sdhci_runtime_pm_put(host);
1918} 1991}
1919 1992
1920static void sdhci_timeout_timer(unsigned long data) 1993static void sdhci_timeout_timer(unsigned long data)
@@ -2146,12 +2219,19 @@ static void sdhci_data_irq(struct sdhci_host *host, u32 intmask)
2146static irqreturn_t sdhci_irq(int irq, void *dev_id) 2219static irqreturn_t sdhci_irq(int irq, void *dev_id)
2147{ 2220{
2148 irqreturn_t result; 2221 irqreturn_t result;
2149 struct sdhci_host* host = dev_id; 2222 struct sdhci_host *host = dev_id;
2150 u32 intmask; 2223 u32 intmask;
2151 int cardint = 0; 2224 int cardint = 0;
2152 2225
2153 spin_lock(&host->lock); 2226 spin_lock(&host->lock);
2154 2227
2228 if (host->runtime_suspended) {
2229 spin_unlock(&host->lock);
2230 printk(KERN_WARNING "%s: got irq while runtime suspended\n",
2231 mmc_hostname(host->mmc));
2232 return IRQ_HANDLED;
2233 }
2234
2155 intmask = sdhci_readl(host, SDHCI_INT_STATUS); 2235 intmask = sdhci_readl(host, SDHCI_INT_STATUS);
2156 2236
2157 if (!intmask || intmask == 0xffffffff) { 2237 if (!intmask || intmask == 0xffffffff) {
@@ -2285,7 +2365,6 @@ int sdhci_resume_host(struct sdhci_host *host)
2285 return ret; 2365 return ret;
2286 } 2366 }
2287 2367
2288
2289 if (host->flags & (SDHCI_USE_SDMA | SDHCI_USE_ADMA)) { 2368 if (host->flags & (SDHCI_USE_SDMA | SDHCI_USE_ADMA)) {
2290 if (host->ops->enable_dma) 2369 if (host->ops->enable_dma)
2291 host->ops->enable_dma(host); 2370 host->ops->enable_dma(host);
@@ -2324,6 +2403,90 @@ EXPORT_SYMBOL_GPL(sdhci_enable_irq_wakeups);
2324 2403
2325#endif /* CONFIG_PM */ 2404#endif /* CONFIG_PM */
2326 2405
2406#ifdef CONFIG_PM_RUNTIME
2407
2408static int sdhci_runtime_pm_get(struct sdhci_host *host)
2409{
2410 return pm_runtime_get_sync(host->mmc->parent);
2411}
2412
2413static int sdhci_runtime_pm_put(struct sdhci_host *host)
2414{
2415 pm_runtime_mark_last_busy(host->mmc->parent);
2416 return pm_runtime_put_autosuspend(host->mmc->parent);
2417}
2418
2419int sdhci_runtime_suspend_host(struct sdhci_host *host)
2420{
2421 unsigned long flags;
2422 int ret = 0;
2423
2424 /* Disable tuning since we are suspending */
2425 if (host->version >= SDHCI_SPEC_300 &&
2426 host->tuning_mode == SDHCI_TUNING_MODE_1) {
2427 del_timer_sync(&host->tuning_timer);
2428 host->flags &= ~SDHCI_NEEDS_RETUNING;
2429 }
2430
2431 spin_lock_irqsave(&host->lock, flags);
2432 sdhci_mask_irqs(host, SDHCI_INT_ALL_MASK);
2433 spin_unlock_irqrestore(&host->lock, flags);
2434
2435 synchronize_irq(host->irq);
2436
2437 spin_lock_irqsave(&host->lock, flags);
2438 host->runtime_suspended = true;
2439 spin_unlock_irqrestore(&host->lock, flags);
2440
2441 return ret;
2442}
2443EXPORT_SYMBOL_GPL(sdhci_runtime_suspend_host);
2444
2445int sdhci_runtime_resume_host(struct sdhci_host *host)
2446{
2447 unsigned long flags;
2448 int ret = 0, host_flags = host->flags;
2449
2450 if (host_flags & (SDHCI_USE_SDMA | SDHCI_USE_ADMA)) {
2451 if (host->ops->enable_dma)
2452 host->ops->enable_dma(host);
2453 }
2454
2455 sdhci_init(host, 0);
2456
2457 /* Force clock and power re-program */
2458 host->pwr = 0;
2459 host->clock = 0;
2460 sdhci_do_set_ios(host, &host->mmc->ios);
2461
2462 sdhci_do_start_signal_voltage_switch(host, &host->mmc->ios);
2463 if (host_flags & SDHCI_PV_ENABLED)
2464 sdhci_do_enable_preset_value(host, true);
2465
2466 /* Set the re-tuning expiration flag */
2467 if ((host->version >= SDHCI_SPEC_300) && host->tuning_count &&
2468 (host->tuning_mode == SDHCI_TUNING_MODE_1))
2469 host->flags |= SDHCI_NEEDS_RETUNING;
2470
2471 spin_lock_irqsave(&host->lock, flags);
2472
2473 host->runtime_suspended = false;
2474
2475 /* Enable SDIO IRQ */
2476 if ((host->flags & SDHCI_SDIO_IRQ_ENABLED))
2477 sdhci_enable_sdio_irq_nolock(host, true);
2478
2479 /* Enable Card Detection */
2480 sdhci_enable_card_detection(host);
2481
2482 spin_unlock_irqrestore(&host->lock, flags);
2483
2484 return ret;
2485}
2486EXPORT_SYMBOL_GPL(sdhci_runtime_resume_host);
2487
2488#endif
2489
2327/*****************************************************************************\ 2490/*****************************************************************************\
2328 * * 2491 * *
2329 * Device allocation/registration * 2492 * Device allocation/registration *
@@ -2366,6 +2529,8 @@ int sdhci_add_host(struct sdhci_host *host)
2366 2529
2367 if (debug_quirks) 2530 if (debug_quirks)
2368 host->quirks = debug_quirks; 2531 host->quirks = debug_quirks;
2532 if (debug_quirks2)
2533 host->quirks2 = debug_quirks2;
2369 2534
2370 sdhci_reset(host, SDHCI_RESET_ALL); 2535 sdhci_reset(host, SDHCI_RESET_ALL);
2371 2536
@@ -2888,9 +3053,11 @@ module_init(sdhci_drv_init);
2888module_exit(sdhci_drv_exit); 3053module_exit(sdhci_drv_exit);
2889 3054
2890module_param(debug_quirks, uint, 0444); 3055module_param(debug_quirks, uint, 0444);
3056module_param(debug_quirks2, uint, 0444);
2891 3057
2892MODULE_AUTHOR("Pierre Ossman <pierre@ossman.eu>"); 3058MODULE_AUTHOR("Pierre Ossman <pierre@ossman.eu>");
2893MODULE_DESCRIPTION("Secure Digital Host Controller Interface core driver"); 3059MODULE_DESCRIPTION("Secure Digital Host Controller Interface core driver");
2894MODULE_LICENSE("GPL"); 3060MODULE_LICENSE("GPL");
2895 3061
2896MODULE_PARM_DESC(debug_quirks, "Force certain quirks."); 3062MODULE_PARM_DESC(debug_quirks, "Force certain quirks.");
3063MODULE_PARM_DESC(debug_quirks2, "Force certain other quirks.");