aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShawn Lin <shawn.lin@rock-chips.com>2018-02-24 01:17:22 -0500
committerUlf Hansson <ulf.hansson@linaro.org>2018-02-27 09:11:49 -0500
commita4faa4929ed3be15e2d500d2405f992f6dedc8eb (patch)
treea12761f1e87cb579821dc5304b76a53f36ca4b06
parent325501d9360eb42c7c51e6daa0d733844c1e790b (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.c73
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
2781static 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
2781static int dw_mci_init_slot(struct dw_mci *host) 2820static 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) {