diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/mmc/host/dw_mmc.c | 73 |
1 files changed, 43 insertions, 30 deletions
diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c index 0aa39975f33b..4033cf96c7d7 100644 --- a/drivers/mmc/host/dw_mmc.c +++ b/drivers/mmc/host/dw_mmc.c | |||
| @@ -2778,12 +2778,50 @@ static irqreturn_t dw_mci_interrupt(int irq, void *dev_id) | |||
| 2778 | return IRQ_HANDLED; | 2778 | return IRQ_HANDLED; |
| 2779 | } | 2779 | } |
| 2780 | 2780 | ||
| 2781 | static int dw_mci_init_slot_caps(struct dw_mci_slot *slot) | ||
| 2782 | { | ||
| 2783 | struct dw_mci *host = slot->host; | ||
| 2784 | const struct dw_mci_drv_data *drv_data = host->drv_data; | ||
| 2785 | struct mmc_host *mmc = slot->mmc; | ||
| 2786 | int ctrl_id; | ||
| 2787 | |||
| 2788 | if (host->pdata->caps) | ||
| 2789 | mmc->caps = host->pdata->caps; | ||
| 2790 | |||
| 2791 | /* | ||
| 2792 | * Support MMC_CAP_ERASE by default. | ||
| 2793 | * It needs to use trim/discard/erase commands. | ||
| 2794 | */ | ||
| 2795 | mmc->caps |= MMC_CAP_ERASE; | ||
| 2796 | |||
| 2797 | if (host->pdata->pm_caps) | ||
| 2798 | mmc->pm_caps = host->pdata->pm_caps; | ||
| 2799 | |||
| 2800 | if (host->dev->of_node) { | ||
| 2801 | ctrl_id = of_alias_get_id(host->dev->of_node, "mshc"); | ||
| 2802 | if (ctrl_id < 0) | ||
| 2803 | ctrl_id = 0; | ||
| 2804 | } else { | ||
| 2805 | ctrl_id = to_platform_device(host->dev)->id; | ||
| 2806 | } | ||
| 2807 | if (drv_data && drv_data->caps) | ||
| 2808 | mmc->caps |= drv_data->caps[ctrl_id]; | ||
| 2809 | |||
| 2810 | if (host->pdata->caps2) | ||
| 2811 | mmc->caps2 = host->pdata->caps2; | ||
| 2812 | |||
| 2813 | /* Process SDIO IRQs through the sdio_irq_work. */ | ||
| 2814 | if (mmc->caps & MMC_CAP_SDIO_IRQ) | ||
| 2815 | mmc->caps2 |= MMC_CAP2_SDIO_IRQ_NOTHREAD; | ||
| 2816 | |||
| 2817 | return 0; | ||
| 2818 | } | ||
| 2819 | |||
| 2781 | static int dw_mci_init_slot(struct dw_mci *host) | 2820 | static int dw_mci_init_slot(struct dw_mci *host) |
| 2782 | { | 2821 | { |
| 2783 | struct mmc_host *mmc; | 2822 | struct mmc_host *mmc; |
| 2784 | struct dw_mci_slot *slot; | 2823 | struct dw_mci_slot *slot; |
| 2785 | const struct dw_mci_drv_data *drv_data = host->drv_data; | 2824 | int ret; |
| 2786 | int ctrl_id, ret; | ||
| 2787 | u32 freq[2]; | 2825 | u32 freq[2]; |
| 2788 | 2826 | ||
| 2789 | mmc = mmc_alloc_host(sizeof(struct dw_mci_slot), host->dev); | 2827 | mmc = mmc_alloc_host(sizeof(struct dw_mci_slot), host->dev); |
| @@ -2817,38 +2855,13 @@ static int dw_mci_init_slot(struct dw_mci *host) | |||
| 2817 | if (!mmc->ocr_avail) | 2855 | if (!mmc->ocr_avail) |
| 2818 | mmc->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34; | 2856 | mmc->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34; |
| 2819 | 2857 | ||
| 2820 | if (host->pdata->caps) | ||
| 2821 | mmc->caps = host->pdata->caps; | ||
| 2822 | |||
| 2823 | /* | ||
| 2824 | * Support MMC_CAP_ERASE by default. | ||
| 2825 | * It needs to use trim/discard/erase commands. | ||
| 2826 | */ | ||
| 2827 | mmc->caps |= MMC_CAP_ERASE; | ||
| 2828 | |||
| 2829 | if (host->pdata->pm_caps) | ||
| 2830 | mmc->pm_caps = host->pdata->pm_caps; | ||
| 2831 | |||
| 2832 | if (host->dev->of_node) { | ||
| 2833 | ctrl_id = of_alias_get_id(host->dev->of_node, "mshc"); | ||
| 2834 | if (ctrl_id < 0) | ||
| 2835 | ctrl_id = 0; | ||
| 2836 | } else { | ||
| 2837 | ctrl_id = to_platform_device(host->dev)->id; | ||
| 2838 | } | ||
| 2839 | if (drv_data && drv_data->caps) | ||
| 2840 | mmc->caps |= drv_data->caps[ctrl_id]; | ||
| 2841 | |||
| 2842 | if (host->pdata->caps2) | ||
| 2843 | mmc->caps2 = host->pdata->caps2; | ||
| 2844 | |||
| 2845 | ret = mmc_of_parse(mmc); | 2858 | ret = mmc_of_parse(mmc); |
| 2846 | if (ret) | 2859 | if (ret) |
| 2847 | goto err_host_allocated; | 2860 | goto err_host_allocated; |
| 2848 | 2861 | ||
| 2849 | /* Process SDIO IRQs through the sdio_irq_work. */ | 2862 | ret = dw_mci_init_slot_caps(slot); |
| 2850 | if (mmc->caps & MMC_CAP_SDIO_IRQ) | 2863 | if (ret) |
| 2851 | mmc->caps2 |= MMC_CAP2_SDIO_IRQ_NOTHREAD; | 2864 | goto err_host_allocated; |
| 2852 | 2865 | ||
| 2853 | /* Useful defaults if platform data is unset. */ | 2866 | /* Useful defaults if platform data is unset. */ |
| 2854 | if (host->use_dma == TRANS_MODE_IDMAC) { | 2867 | if (host->use_dma == TRANS_MODE_IDMAC) { |
