aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mmc
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/mmc')
-rw-r--r--drivers/mmc/tifm_sd.c49
1 files changed, 30 insertions, 19 deletions
diff --git a/drivers/mmc/tifm_sd.c b/drivers/mmc/tifm_sd.c
index 8e69514e415d..f692a2ec09c5 100644
--- a/drivers/mmc/tifm_sd.c
+++ b/drivers/mmc/tifm_sd.c
@@ -7,6 +7,8 @@
7 * it under the terms of the GNU General Public License version 2 as 7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation. 8 * published by the Free Software Foundation.
9 * 9 *
10 * Special thanks to Brad Campbell for extensive testing of this driver.
11 *
10 */ 12 */
11 13
12 14
@@ -39,6 +41,7 @@ module_param(fixed_timeout, bool, 0644);
39 41
40#define TIFM_MMCSD_ERRMASK 0x01e0 /* set bits: CCRC, CTO, DCRC, DTO */ 42#define TIFM_MMCSD_ERRMASK 0x01e0 /* set bits: CCRC, CTO, DCRC, DTO */
41#define TIFM_MMCSD_EOC 0x0001 /* end of command phase */ 43#define TIFM_MMCSD_EOC 0x0001 /* end of command phase */
44#define TIFM_MMCSD_CD 0x0002 /* card detect */
42#define TIFM_MMCSD_CB 0x0004 /* card enter busy state */ 45#define TIFM_MMCSD_CB 0x0004 /* card enter busy state */
43#define TIFM_MMCSD_BRS 0x0008 /* block received/sent */ 46#define TIFM_MMCSD_BRS 0x0008 /* block received/sent */
44#define TIFM_MMCSD_EOFB 0x0010 /* card exit busy state */ 47#define TIFM_MMCSD_EOFB 0x0010 /* card exit busy state */
@@ -48,6 +51,8 @@ module_param(fixed_timeout, bool, 0644);
48#define TIFM_MMCSD_CCRC 0x0100 /* command crc error */ 51#define TIFM_MMCSD_CCRC 0x0100 /* command crc error */
49#define TIFM_MMCSD_AF 0x0400 /* fifo almost full */ 52#define TIFM_MMCSD_AF 0x0400 /* fifo almost full */
50#define TIFM_MMCSD_AE 0x0800 /* fifo almost empty */ 53#define TIFM_MMCSD_AE 0x0800 /* fifo almost empty */
54#define TIFM_MMCSD_OCRB 0x1000 /* OCR busy */
55#define TIFM_MMCSD_CIRQ 0x2000 /* card irq (cmd40/sdio) */
51#define TIFM_MMCSD_CERR 0x4000 /* card status error */ 56#define TIFM_MMCSD_CERR 0x4000 /* card status error */
52 57
53#define TIFM_MMCSD_ODTO 0x0040 /* open drain / extended timeout */ 58#define TIFM_MMCSD_ODTO 0x0040 /* open drain / extended timeout */
@@ -83,16 +88,16 @@ enum {
83}; 88};
84 89
85struct tifm_sd { 90struct tifm_sd {
86 struct tifm_dev *dev; 91 struct tifm_dev *dev;
87 92
88 unsigned short eject:1, 93 unsigned short eject:1,
89 open_drain:1, 94 open_drain:1,
90 no_dma:1; 95 no_dma:1;
91 unsigned short cmd_flags; 96 unsigned short cmd_flags;
92 97
93 unsigned int clk_freq; 98 unsigned int clk_freq;
94 unsigned int clk_div; 99 unsigned int clk_div;
95 unsigned long timeout_jiffies; 100 unsigned long timeout_jiffies;
96 101
97 struct tasklet_struct finish_tasklet; 102 struct tasklet_struct finish_tasklet;
98 struct timer_list timer; 103 struct timer_list timer;
@@ -627,7 +632,8 @@ static void tifm_sd_request(struct mmc_host *mmc, struct mmc_request *mrq)
627 } 632 }
628 633
629 if (host->req) { 634 if (host->req) {
630 printk(KERN_ERR DRIVER_NAME ": unfinished request detected\n"); 635 printk(KERN_ERR "%s : unfinished request detected\n",
636 sock->dev.bus_id);
631 spin_unlock_irqrestore(&sock->lock, flags); 637 spin_unlock_irqrestore(&sock->lock, flags);
632 goto err_out; 638 goto err_out;
633 } 639 }
@@ -737,7 +743,8 @@ static void tifm_sd_end_cmd(unsigned long data)
737 host->req = NULL; 743 host->req = NULL;
738 744
739 if (!mrq) { 745 if (!mrq) {
740 printk(KERN_ERR DRIVER_NAME ": no request to complete?\n"); 746 printk(KERN_ERR " %s : no request to complete?\n",
747 sock->dev.bus_id);
741 spin_unlock_irqrestore(&sock->lock, flags); 748 spin_unlock_irqrestore(&sock->lock, flags);
742 return; 749 return;
743 } 750 }
@@ -775,8 +782,10 @@ static void tifm_sd_abort(unsigned long data)
775{ 782{
776 struct tifm_sd *host = (struct tifm_sd*)data; 783 struct tifm_sd *host = (struct tifm_sd*)data;
777 784
778 printk(KERN_ERR DRIVER_NAME 785 printk(KERN_ERR
779 ": card failed to respond for a long period of time\n"); 786 "%s : card failed to respond for a long period of time "
787 "(%x, %x)\n",
788 host->dev->dev.bus_id, host->req->cmd->opcode, host->cmd_flags);
780 789
781 tifm_eject(host->dev); 790 tifm_eject(host->dev);
782} 791}
@@ -790,8 +799,11 @@ static void tifm_sd_ios(struct mmc_host *mmc, struct mmc_ios *ios)
790 799
791 spin_lock_irqsave(&sock->lock, flags); 800 spin_lock_irqsave(&sock->lock, flags);
792 801
793 dev_dbg(&sock->dev, "Setting bus width %d, power %d\n", ios->bus_width, 802 dev_dbg(&sock->dev, "ios: clock = %u, vdd = %x, bus_mode = %x, "
794 ios->power_mode); 803 "chip_select = %x, power_mode = %x, bus_width = %x\n",
804 ios->clock, ios->vdd, ios->bus_mode, ios->chip_select,
805 ios->power_mode, ios->bus_width);
806
795 if (ios->bus_width == MMC_BUS_WIDTH_4) { 807 if (ios->bus_width == MMC_BUS_WIDTH_4) {
796 writel(TIFM_MMCSD_4BBUS | readl(sock->addr + SOCK_MMCSD_CONFIG), 808 writel(TIFM_MMCSD_4BBUS | readl(sock->addr + SOCK_MMCSD_CONFIG),
797 sock->addr + SOCK_MMCSD_CONFIG); 809 sock->addr + SOCK_MMCSD_CONFIG);
@@ -937,7 +949,8 @@ static int tifm_sd_probe(struct tifm_dev *sock)
937 949
938 if (!(TIFM_SOCK_STATE_OCCUPIED 950 if (!(TIFM_SOCK_STATE_OCCUPIED
939 & readl(sock->addr + SOCK_PRESENT_STATE))) { 951 & readl(sock->addr + SOCK_PRESENT_STATE))) {
940 printk(KERN_WARNING DRIVER_NAME ": card gone, unexpectedly\n"); 952 printk(KERN_WARNING "%s : card gone, unexpectedly\n",
953 sock->dev.bus_id);
941 return rc; 954 return rc;
942 } 955 }
943 956
@@ -974,11 +987,9 @@ static int tifm_sd_probe(struct tifm_dev *sock)
974 987
975 if (!rc) 988 if (!rc)
976 rc = mmc_add_host(mmc); 989 rc = mmc_add_host(mmc);
977 if (rc) 990 if (!rc)
978 goto out_free_mmc; 991 return 0;
979 992
980 return 0;
981out_free_mmc:
982 mmc_free_host(mmc); 993 mmc_free_host(mmc);
983 return rc; 994 return rc;
984} 995}