diff options
Diffstat (limited to 'drivers/mmc')
-rw-r--r-- | drivers/mmc/host/Kconfig | 1 | ||||
-rw-r--r-- | drivers/mmc/host/mvsdio.c | 63 |
2 files changed, 15 insertions, 49 deletions
diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig index 1dee533634c9..1526b8a10b09 100644 --- a/drivers/mmc/host/Kconfig +++ b/drivers/mmc/host/Kconfig | |||
@@ -455,6 +455,7 @@ config MMC_TIFM_SD | |||
455 | config MMC_MVSDIO | 455 | config MMC_MVSDIO |
456 | tristate "Marvell MMC/SD/SDIO host driver" | 456 | tristate "Marvell MMC/SD/SDIO host driver" |
457 | depends on PLAT_ORION | 457 | depends on PLAT_ORION |
458 | depends on OF | ||
458 | ---help--- | 459 | ---help--- |
459 | This selects the Marvell SDIO host driver. | 460 | This selects the Marvell SDIO host driver. |
460 | SDIO may currently be found on the Kirkwood 88F6281 and 88F6192 | 461 | SDIO may currently be found on the Kirkwood 88F6281 and 88F6192 |
diff --git a/drivers/mmc/host/mvsdio.c b/drivers/mmc/host/mvsdio.c index 18c70380ea93..42296e55b9de 100644 --- a/drivers/mmc/host/mvsdio.c +++ b/drivers/mmc/host/mvsdio.c | |||
@@ -20,8 +20,6 @@ | |||
20 | #include <linux/scatterlist.h> | 20 | #include <linux/scatterlist.h> |
21 | #include <linux/irq.h> | 21 | #include <linux/irq.h> |
22 | #include <linux/clk.h> | 22 | #include <linux/clk.h> |
23 | #include <linux/gpio.h> | ||
24 | #include <linux/of_gpio.h> | ||
25 | #include <linux/of_irq.h> | 23 | #include <linux/of_irq.h> |
26 | #include <linux/mmc/host.h> | 24 | #include <linux/mmc/host.h> |
27 | #include <linux/mmc/slot-gpio.h> | 25 | #include <linux/mmc/slot-gpio.h> |
@@ -36,12 +34,6 @@ | |||
36 | static int maxfreq; | 34 | static int maxfreq; |
37 | static int nodma; | 35 | static int nodma; |
38 | 36 | ||
39 | struct mvsdio_platform_data { | ||
40 | unsigned int clock; | ||
41 | int gpio_card_detect; | ||
42 | int gpio_write_protect; | ||
43 | }; | ||
44 | |||
45 | struct mvsd_host { | 37 | struct mvsd_host { |
46 | void __iomem *base; | 38 | void __iomem *base; |
47 | struct mmc_request *mrq; | 39 | struct mmc_request *mrq; |
@@ -709,6 +701,10 @@ static int mvsd_probe(struct platform_device *pdev) | |||
709 | struct resource *r; | 701 | struct resource *r; |
710 | int ret, irq; | 702 | int ret, irq; |
711 | 703 | ||
704 | if (!np) { | ||
705 | dev_err(&pdev->dev, "no DT node\n"); | ||
706 | return -ENODEV; | ||
707 | } | ||
712 | r = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 708 | r = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
713 | irq = platform_get_irq(pdev, 0); | 709 | irq = platform_get_irq(pdev, 0); |
714 | if (!r || irq < 0) | 710 | if (!r || irq < 0) |
@@ -732,8 +728,12 @@ static int mvsd_probe(struct platform_device *pdev) | |||
732 | * fixed rate clock). | 728 | * fixed rate clock). |
733 | */ | 729 | */ |
734 | host->clk = devm_clk_get(&pdev->dev, NULL); | 730 | host->clk = devm_clk_get(&pdev->dev, NULL); |
735 | if (!IS_ERR(host->clk)) | 731 | if (IS_ERR(host->clk)) { |
736 | clk_prepare_enable(host->clk); | 732 | dev_err(&pdev->dev, "no clock associated\n"); |
733 | ret = -EINVAL; | ||
734 | goto out; | ||
735 | } | ||
736 | clk_prepare_enable(host->clk); | ||
737 | 737 | ||
738 | mmc->ops = &mvsd_ops; | 738 | mmc->ops = &mvsd_ops; |
739 | 739 | ||
@@ -749,45 +749,10 @@ static int mvsd_probe(struct platform_device *pdev) | |||
749 | mmc->max_seg_size = mmc->max_blk_size * mmc->max_blk_count; | 749 | mmc->max_seg_size = mmc->max_blk_size * mmc->max_blk_count; |
750 | mmc->max_req_size = mmc->max_blk_size * mmc->max_blk_count; | 750 | mmc->max_req_size = mmc->max_blk_size * mmc->max_blk_count; |
751 | 751 | ||
752 | if (np) { | 752 | host->base_clock = clk_get_rate(host->clk) / 2; |
753 | if (IS_ERR(host->clk)) { | 753 | ret = mmc_of_parse(mmc); |
754 | dev_err(&pdev->dev, "DT platforms must have a clock associated\n"); | 754 | if (ret < 0) |
755 | ret = -EINVAL; | 755 | goto out; |
756 | goto out; | ||
757 | } | ||
758 | |||
759 | host->base_clock = clk_get_rate(host->clk) / 2; | ||
760 | ret = mmc_of_parse(mmc); | ||
761 | if (ret < 0) | ||
762 | goto out; | ||
763 | } else { | ||
764 | const struct mvsdio_platform_data *mvsd_data; | ||
765 | |||
766 | mvsd_data = pdev->dev.platform_data; | ||
767 | if (!mvsd_data) { | ||
768 | ret = -ENXIO; | ||
769 | goto out; | ||
770 | } | ||
771 | mmc->caps = MMC_CAP_4_BIT_DATA | MMC_CAP_SDIO_IRQ | | ||
772 | MMC_CAP_SD_HIGHSPEED | MMC_CAP_MMC_HIGHSPEED; | ||
773 | host->base_clock = mvsd_data->clock / 2; | ||
774 | /* GPIO 0 regarded as invalid for backward compatibility */ | ||
775 | if (mvsd_data->gpio_card_detect && | ||
776 | gpio_is_valid(mvsd_data->gpio_card_detect)) { | ||
777 | ret = mmc_gpio_request_cd(mmc, | ||
778 | mvsd_data->gpio_card_detect, | ||
779 | 0); | ||
780 | if (ret) | ||
781 | goto out; | ||
782 | } else { | ||
783 | mmc->caps |= MMC_CAP_NEEDS_POLL; | ||
784 | } | ||
785 | |||
786 | if (mvsd_data->gpio_write_protect && | ||
787 | gpio_is_valid(mvsd_data->gpio_write_protect)) | ||
788 | mmc_gpio_request_ro(mmc, mvsd_data->gpio_write_protect); | ||
789 | } | ||
790 | |||
791 | if (maxfreq) | 756 | if (maxfreq) |
792 | mmc->f_max = maxfreq; | 757 | mmc->f_max = maxfreq; |
793 | 758 | ||