@@ -273,6 +273,7 @@ static struct variant_data variant_stm32_sdmmc = {
273
273
.datactrl_mask_sdio = MCI_DPSM_ST_SDIOEN ,
274
274
.stm32_idmabsize_mask = GENMASK (12 , 5 ),
275
275
.stm32_idmabsize_align = BIT (5 ),
276
+ .supports_sdio_irq = true,
276
277
.busy_timeout = true,
277
278
.busy_detect = true,
278
279
.busy_detect_flag = MCI_STM32_BUSYD0 ,
@@ -300,6 +301,7 @@ static struct variant_data variant_stm32_sdmmcv2 = {
300
301
.datactrl_mask_sdio = MCI_DPSM_ST_SDIOEN ,
301
302
.stm32_idmabsize_mask = GENMASK (16 , 5 ),
302
303
.stm32_idmabsize_align = BIT (5 ),
304
+ .supports_sdio_irq = true,
303
305
.dma_lli = true,
304
306
.busy_timeout = true,
305
307
.busy_detect = true,
@@ -328,6 +330,7 @@ static struct variant_data variant_stm32_sdmmcv3 = {
328
330
.datactrl_mask_sdio = MCI_DPSM_ST_SDIOEN ,
329
331
.stm32_idmabsize_mask = GENMASK (16 , 6 ),
330
332
.stm32_idmabsize_align = BIT (6 ),
333
+ .supports_sdio_irq = true,
331
334
.dma_lli = true,
332
335
.busy_timeout = true,
333
336
.busy_detect = true,
@@ -421,8 +424,9 @@ void mmci_write_pwrreg(struct mmci_host *host, u32 pwr)
421
424
*/
422
425
static void mmci_write_datactrlreg (struct mmci_host * host , u32 datactrl )
423
426
{
424
- /* Keep busy mode in DPSM if enabled */
425
- datactrl |= host -> datactrl_reg & host -> variant -> busy_dpsm_flag ;
427
+ /* Keep busy mode in DPSM and SDIO mask if enabled */
428
+ datactrl |= host -> datactrl_reg & (host -> variant -> busy_dpsm_flag |
429
+ host -> variant -> datactrl_mask_sdio );
426
430
427
431
if (host -> datactrl_reg != datactrl ) {
428
432
host -> datactrl_reg = datactrl ;
@@ -1762,6 +1766,25 @@ static irqreturn_t mmci_pio_irq(int irq, void *dev_id)
1762
1766
return IRQ_HANDLED ;
1763
1767
}
1764
1768
1769
+ static void mmci_write_sdio_irq_bit (struct mmci_host * host , int enable )
1770
+ {
1771
+ void __iomem * base = host -> base ;
1772
+ u32 mask = readl_relaxed (base + MMCIMASK0 );
1773
+
1774
+ if (enable )
1775
+ writel_relaxed (mask | MCI_ST_SDIOITMASK , base + MMCIMASK0 );
1776
+ else
1777
+ writel_relaxed (mask & ~MCI_ST_SDIOITMASK , base + MMCIMASK0 );
1778
+ }
1779
+
1780
+ static void mmci_signal_sdio_irq (struct mmci_host * host , u32 status )
1781
+ {
1782
+ if (status & MCI_ST_SDIOIT ) {
1783
+ mmci_write_sdio_irq_bit (host , 0 );
1784
+ sdio_signal_irq (host -> mmc );
1785
+ }
1786
+ }
1787
+
1765
1788
/*
1766
1789
* Handle completion of command and data transfers.
1767
1790
*/
@@ -1806,6 +1829,9 @@ static irqreturn_t mmci_irq(int irq, void *dev_id)
1806
1829
mmci_data_irq (host , host -> data , status );
1807
1830
}
1808
1831
1832
+ if (host -> variant -> supports_sdio_irq )
1833
+ mmci_signal_sdio_irq (host , status );
1834
+
1809
1835
/*
1810
1836
* Busy detection has been handled by mmci_cmd_irq() above.
1811
1837
* Clear the status bit to prevent polling in IRQ context.
@@ -2042,6 +2068,35 @@ static int mmci_sig_volt_switch(struct mmc_host *mmc, struct mmc_ios *ios)
2042
2068
return ret ;
2043
2069
}
2044
2070
2071
+ static void mmci_enable_sdio_irq (struct mmc_host * mmc , int enable )
2072
+ {
2073
+ struct mmci_host * host = mmc_priv (mmc );
2074
+ unsigned long flags ;
2075
+
2076
+ if (enable )
2077
+ /* Keep the SDIO mode bit if SDIO irqs are enabled */
2078
+ pm_runtime_get_sync (mmc_dev (mmc ));
2079
+
2080
+ spin_lock_irqsave (& host -> lock , flags );
2081
+ mmci_write_sdio_irq_bit (host , enable );
2082
+ spin_unlock_irqrestore (& host -> lock , flags );
2083
+
2084
+ if (!enable ) {
2085
+ pm_runtime_mark_last_busy (mmc_dev (mmc ));
2086
+ pm_runtime_put_autosuspend (mmc_dev (mmc ));
2087
+ }
2088
+ }
2089
+
2090
+ static void mmci_ack_sdio_irq (struct mmc_host * mmc )
2091
+ {
2092
+ struct mmci_host * host = mmc_priv (mmc );
2093
+ unsigned long flags ;
2094
+
2095
+ spin_lock_irqsave (& host -> lock , flags );
2096
+ mmci_write_sdio_irq_bit (host , 1 );
2097
+ spin_unlock_irqrestore (& host -> lock , flags );
2098
+ }
2099
+
2045
2100
static struct mmc_host_ops mmci_ops = {
2046
2101
.request = mmci_request ,
2047
2102
.pre_req = mmci_pre_request ,
@@ -2317,6 +2372,16 @@ static int mmci_probe(struct amba_device *dev,
2317
2372
mmc -> caps |= MMC_CAP_WAIT_WHILE_BUSY ;
2318
2373
}
2319
2374
2375
+ if (variant -> supports_sdio_irq && host -> mmc -> caps & MMC_CAP_SDIO_IRQ ) {
2376
+ mmc -> caps2 |= MMC_CAP2_SDIO_IRQ_NOTHREAD ;
2377
+
2378
+ mmci_ops .enable_sdio_irq = mmci_enable_sdio_irq ;
2379
+ mmci_ops .ack_sdio_irq = mmci_ack_sdio_irq ;
2380
+
2381
+ mmci_write_datactrlreg (host ,
2382
+ host -> variant -> datactrl_mask_sdio );
2383
+ }
2384
+
2320
2385
/* Variants with mandatory busy timeout in HW needs R1B responses. */
2321
2386
if (variant -> busy_timeout )
2322
2387
mmc -> caps |= MMC_CAP_NEED_RSP_BUSY ;
0 commit comments