diff options
Diffstat (limited to 'drivers/mmc/host/sdhci-pci.c')
-rw-r--r-- | drivers/mmc/host/sdhci-pci.c | 49 |
1 files changed, 26 insertions, 23 deletions
diff --git a/drivers/mmc/host/sdhci-pci.c b/drivers/mmc/host/sdhci-pci.c index f8b5f37007b2..936bbca19c0a 100644 --- a/drivers/mmc/host/sdhci-pci.c +++ b/drivers/mmc/host/sdhci-pci.c | |||
@@ -18,11 +18,9 @@ | |||
18 | #include <linux/dma-mapping.h> | 18 | #include <linux/dma-mapping.h> |
19 | #include <linux/slab.h> | 19 | #include <linux/slab.h> |
20 | #include <linux/device.h> | 20 | #include <linux/device.h> |
21 | |||
22 | #include <linux/mmc/host.h> | 21 | #include <linux/mmc/host.h> |
23 | 22 | #include <linux/scatterlist.h> | |
24 | #include <asm/scatterlist.h> | 23 | #include <linux/io.h> |
25 | #include <asm/io.h> | ||
26 | 24 | ||
27 | #include "sdhci.h" | 25 | #include "sdhci.h" |
28 | 26 | ||
@@ -46,14 +44,14 @@ struct sdhci_pci_slot; | |||
46 | struct sdhci_pci_fixes { | 44 | struct sdhci_pci_fixes { |
47 | unsigned int quirks; | 45 | unsigned int quirks; |
48 | 46 | ||
49 | int (*probe)(struct sdhci_pci_chip*); | 47 | int (*probe) (struct sdhci_pci_chip *); |
50 | 48 | ||
51 | int (*probe_slot)(struct sdhci_pci_slot*); | 49 | int (*probe_slot) (struct sdhci_pci_slot *); |
52 | void (*remove_slot)(struct sdhci_pci_slot*, int); | 50 | void (*remove_slot) (struct sdhci_pci_slot *, int); |
53 | 51 | ||
54 | int (*suspend)(struct sdhci_pci_chip*, | 52 | int (*suspend) (struct sdhci_pci_chip *, |
55 | pm_message_t); | 53 | pm_message_t); |
56 | int (*resume)(struct sdhci_pci_chip*); | 54 | int (*resume) (struct sdhci_pci_chip *); |
57 | }; | 55 | }; |
58 | 56 | ||
59 | struct sdhci_pci_slot { | 57 | struct sdhci_pci_slot { |
@@ -329,6 +327,11 @@ static int jmicron_probe(struct sdhci_pci_chip *chip) | |||
329 | return ret; | 327 | return ret; |
330 | } | 328 | } |
331 | 329 | ||
330 | /* quirk for unsable RO-detection on JM388 chips */ | ||
331 | if (chip->pdev->device == PCI_DEVICE_ID_JMICRON_JMB388_SD || | ||
332 | chip->pdev->device == PCI_DEVICE_ID_JMICRON_JMB388_ESD) | ||
333 | chip->quirks |= SDHCI_QUIRK_UNSTABLE_RO_DETECT; | ||
334 | |||
332 | return 0; | 335 | return 0; |
333 | } | 336 | } |
334 | 337 | ||
@@ -402,7 +405,7 @@ static int jmicron_suspend(struct sdhci_pci_chip *chip, pm_message_t state) | |||
402 | 405 | ||
403 | if (chip->pdev->device == PCI_DEVICE_ID_JMICRON_JMB38X_MMC || | 406 | if (chip->pdev->device == PCI_DEVICE_ID_JMICRON_JMB38X_MMC || |
404 | chip->pdev->device == PCI_DEVICE_ID_JMICRON_JMB388_ESD) { | 407 | chip->pdev->device == PCI_DEVICE_ID_JMICRON_JMB388_ESD) { |
405 | for (i = 0;i < chip->num_slots;i++) | 408 | for (i = 0; i < chip->num_slots; i++) |
406 | jmicron_enable_mmc(chip->slots[i]->host, 0); | 409 | jmicron_enable_mmc(chip->slots[i]->host, 0); |
407 | } | 410 | } |
408 | 411 | ||
@@ -415,7 +418,7 @@ static int jmicron_resume(struct sdhci_pci_chip *chip) | |||
415 | 418 | ||
416 | if (chip->pdev->device == PCI_DEVICE_ID_JMICRON_JMB38X_MMC || | 419 | if (chip->pdev->device == PCI_DEVICE_ID_JMICRON_JMB38X_MMC || |
417 | chip->pdev->device == PCI_DEVICE_ID_JMICRON_JMB388_ESD) { | 420 | chip->pdev->device == PCI_DEVICE_ID_JMICRON_JMB388_ESD) { |
418 | for (i = 0;i < chip->num_slots;i++) | 421 | for (i = 0; i < chip->num_slots; i++) |
419 | jmicron_enable_mmc(chip->slots[i]->host, 1); | 422 | jmicron_enable_mmc(chip->slots[i]->host, 1); |
420 | } | 423 | } |
421 | 424 | ||
@@ -798,7 +801,7 @@ static struct sdhci_ops sdhci_pci_ops = { | |||
798 | 801 | ||
799 | #ifdef CONFIG_PM | 802 | #ifdef CONFIG_PM |
800 | 803 | ||
801 | static int sdhci_pci_suspend (struct pci_dev *pdev, pm_message_t state) | 804 | static int sdhci_pci_suspend(struct pci_dev *pdev, pm_message_t state) |
802 | { | 805 | { |
803 | struct sdhci_pci_chip *chip; | 806 | struct sdhci_pci_chip *chip; |
804 | struct sdhci_pci_slot *slot; | 807 | struct sdhci_pci_slot *slot; |
@@ -810,7 +813,7 @@ static int sdhci_pci_suspend (struct pci_dev *pdev, pm_message_t state) | |||
810 | if (!chip) | 813 | if (!chip) |
811 | return 0; | 814 | return 0; |
812 | 815 | ||
813 | for (i = 0;i < chip->num_slots;i++) { | 816 | for (i = 0; i < chip->num_slots; i++) { |
814 | slot = chip->slots[i]; | 817 | slot = chip->slots[i]; |
815 | if (!slot) | 818 | if (!slot) |
816 | continue; | 819 | continue; |
@@ -818,7 +821,7 @@ static int sdhci_pci_suspend (struct pci_dev *pdev, pm_message_t state) | |||
818 | ret = sdhci_suspend_host(slot->host, state); | 821 | ret = sdhci_suspend_host(slot->host, state); |
819 | 822 | ||
820 | if (ret) { | 823 | if (ret) { |
821 | for (i--;i >= 0;i--) | 824 | for (i--; i >= 0; i--) |
822 | sdhci_resume_host(chip->slots[i]->host); | 825 | sdhci_resume_host(chip->slots[i]->host); |
823 | return ret; | 826 | return ret; |
824 | } | 827 | } |
@@ -833,7 +836,7 @@ static int sdhci_pci_suspend (struct pci_dev *pdev, pm_message_t state) | |||
833 | if (chip->fixes && chip->fixes->suspend) { | 836 | if (chip->fixes && chip->fixes->suspend) { |
834 | ret = chip->fixes->suspend(chip, state); | 837 | ret = chip->fixes->suspend(chip, state); |
835 | if (ret) { | 838 | if (ret) { |
836 | for (i = chip->num_slots - 1;i >= 0;i--) | 839 | for (i = chip->num_slots - 1; i >= 0; i--) |
837 | sdhci_resume_host(chip->slots[i]->host); | 840 | sdhci_resume_host(chip->slots[i]->host); |
838 | return ret; | 841 | return ret; |
839 | } | 842 | } |
@@ -855,7 +858,7 @@ static int sdhci_pci_suspend (struct pci_dev *pdev, pm_message_t state) | |||
855 | return 0; | 858 | return 0; |
856 | } | 859 | } |
857 | 860 | ||
858 | static int sdhci_pci_resume (struct pci_dev *pdev) | 861 | static int sdhci_pci_resume(struct pci_dev *pdev) |
859 | { | 862 | { |
860 | struct sdhci_pci_chip *chip; | 863 | struct sdhci_pci_chip *chip; |
861 | struct sdhci_pci_slot *slot; | 864 | struct sdhci_pci_slot *slot; |
@@ -877,7 +880,7 @@ static int sdhci_pci_resume (struct pci_dev *pdev) | |||
877 | return ret; | 880 | return ret; |
878 | } | 881 | } |
879 | 882 | ||
880 | for (i = 0;i < chip->num_slots;i++) { | 883 | for (i = 0; i < chip->num_slots; i++) { |
881 | slot = chip->slots[i]; | 884 | slot = chip->slots[i]; |
882 | if (!slot) | 885 | if (!slot) |
883 | continue; | 886 | continue; |
@@ -1059,7 +1062,7 @@ static int __devinit sdhci_pci_probe(struct pci_dev *pdev, | |||
1059 | } | 1062 | } |
1060 | 1063 | ||
1061 | chip->pdev = pdev; | 1064 | chip->pdev = pdev; |
1062 | chip->fixes = (const struct sdhci_pci_fixes*)ent->driver_data; | 1065 | chip->fixes = (const struct sdhci_pci_fixes *)ent->driver_data; |
1063 | if (chip->fixes) | 1066 | if (chip->fixes) |
1064 | chip->quirks = chip->fixes->quirks; | 1067 | chip->quirks = chip->fixes->quirks; |
1065 | chip->num_slots = slots; | 1068 | chip->num_slots = slots; |
@@ -1074,10 +1077,10 @@ static int __devinit sdhci_pci_probe(struct pci_dev *pdev, | |||
1074 | 1077 | ||
1075 | slots = chip->num_slots; /* Quirk may have changed this */ | 1078 | slots = chip->num_slots; /* Quirk may have changed this */ |
1076 | 1079 | ||
1077 | for (i = 0;i < slots;i++) { | 1080 | for (i = 0; i < slots; i++) { |
1078 | slot = sdhci_pci_probe_slot(pdev, chip, first_bar + i); | 1081 | slot = sdhci_pci_probe_slot(pdev, chip, first_bar + i); |
1079 | if (IS_ERR(slot)) { | 1082 | if (IS_ERR(slot)) { |
1080 | for (i--;i >= 0;i--) | 1083 | for (i--; i >= 0; i--) |
1081 | sdhci_pci_remove_slot(chip->slots[i]); | 1084 | sdhci_pci_remove_slot(chip->slots[i]); |
1082 | ret = PTR_ERR(slot); | 1085 | ret = PTR_ERR(slot); |
1083 | goto free; | 1086 | goto free; |
@@ -1105,7 +1108,7 @@ static void __devexit sdhci_pci_remove(struct pci_dev *pdev) | |||
1105 | chip = pci_get_drvdata(pdev); | 1108 | chip = pci_get_drvdata(pdev); |
1106 | 1109 | ||
1107 | if (chip) { | 1110 | if (chip) { |
1108 | for (i = 0;i < chip->num_slots; i++) | 1111 | for (i = 0; i < chip->num_slots; i++) |
1109 | sdhci_pci_remove_slot(chip->slots[i]); | 1112 | sdhci_pci_remove_slot(chip->slots[i]); |
1110 | 1113 | ||
1111 | pci_set_drvdata(pdev, NULL); | 1114 | pci_set_drvdata(pdev, NULL); |
@@ -1116,9 +1119,9 @@ static void __devexit sdhci_pci_remove(struct pci_dev *pdev) | |||
1116 | } | 1119 | } |
1117 | 1120 | ||
1118 | static struct pci_driver sdhci_driver = { | 1121 | static struct pci_driver sdhci_driver = { |
1119 | .name = "sdhci-pci", | 1122 | .name = "sdhci-pci", |
1120 | .id_table = pci_ids, | 1123 | .id_table = pci_ids, |
1121 | .probe = sdhci_pci_probe, | 1124 | .probe = sdhci_pci_probe, |
1122 | .remove = __devexit_p(sdhci_pci_remove), | 1125 | .remove = __devexit_p(sdhci_pci_remove), |
1123 | .suspend = sdhci_pci_suspend, | 1126 | .suspend = sdhci_pci_suspend, |
1124 | .resume = sdhci_pci_resume, | 1127 | .resume = sdhci_pci_resume, |