diff options
author | Shawn Lin <shawn.lin@rock-chips.com> | 2018-02-24 01:17:22 -0500 |
---|---|---|
committer | Ulf Hansson <ulf.hansson@linaro.org> | 2018-02-27 09:11:49 -0500 |
commit | a4faa4929ed3be15e2d500d2405f992f6dedc8eb (patch) | |
tree | a12761f1e87cb579821dc5304b76a53f36ca4b06 | |
parent | 325501d9360eb42c7c51e6daa0d733844c1e790b (diff) |
mmc: dw_mmc: Factor out dw_mci_init_slot_caps
Factor out dw_mci_init_slot_caps to consolidate parsing
all differents types of capabilities from host contrllers.
No functional change intended.
Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
Fixes: 800d78bfccb3 ("mmc: dw_mmc: add support for implementation specific callbacks")
Cc: <stable@vger.kernel.org>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
-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) { |