S3C24XX SD/MMC driver
v5 cover S3C24XX SD/MMC driver
The S3C24XX SD/MMC driver follows this, see
previous releases for notes.
Signature · 3 lines
Ben ([email protected], http://www.fluff.org/) 'a smiley only costs 4 bytes'
PATCH v5 1/16 MMC: S3C24XX MMC/SD driver.
From: Thomas Kleffel <[email protected]>
This is the latest S3C MMC/SD driver by Thomas Kleffel with cleanups as suggested by AKPM done by Ben Dooks.
include/asm-arm/arch-s3c2410/regs-sdi.h +17 -3
@@ -28,9 +28,15 @@#define S3C2410_SDIDCNT (0x30)#define S3C2410_SDIDSTA (0x34)#define S3C2410_SDIFSTA (0x38) +#define S3C2410_SDIDATA (0x3C)#define S3C2410_SDIIMSK (0x40) +#define S3C2440_SDIDATA (0x40) +#define S3C2440_SDIIMSK (0x3C) + +#define S3C2440_SDICON_SDRESET (1<<8) +#define S3C2440_SDICON_MMCCLOCK (1<<5)#define S3C2410_SDICON_BYTEORDER (1<<4)#define S3C2410_SDICON_SDIOIRQ (1<<3)#define S3C2410_SDICON_RWAITEN (1<<2)
@@ -42,7 +48,8 @@#define S3C2410_SDICMDCON_LONGRSP (1<<10)#define S3C2410_SDICMDCON_WAITRSP (1<<9)#define S3C2410_SDICMDCON_CMDSTART (1<<8) -#define S3C2410_SDICMDCON_INDEX (0xff) +#define S3C2410_SDICMDCON_SENDERHOST (1<<6) +#define S3C2410_SDICMDCON_INDEX (0x3f)#define S3C2410_SDICMDSTAT_CRCFAIL (1<<12)#define S3C2410_SDICMDSTAT_CMDSENT (1<<11)
@@ -51,6 +58,9 @@#define S3C2410_SDICMDSTAT_XFERING (1<<8)#define S3C2410_SDICMDSTAT_INDEX (0xff) +#define S3C2440_SDIDCON_DS_BYTE (0<<22) +#define S3C2440_SDIDCON_DS_HALFWORD (1<<22) +#define S3C2440_SDIDCON_DS_WORD (2<<22)#define S3C2410_SDIDCON_IRQPERIOD (1<<21)#define S3C2410_SDIDCON_TXAFTERRESP (1<<20)#define S3C2410_SDIDCON_RXAFTERCMD (1<<19)
@@ -59,6 +69,7 @@#define S3C2410_SDIDCON_WIDEBUS (1<<16)#define S3C2410_SDIDCON_DMAEN (1<<15)#define S3C2410_SDIDCON_STOP (1<<14) +#define S3C2440_SDIDCON_DATSTART (1<<14)#define S3C2410_SDIDCON_DATMODE (3<<12)#define S3C2410_SDIDCON_BLKNUM (0x7ff)
@@ -68,6 +79,7 @@#define S3C2410_SDIDCON_XFER_RXSTART (2<<12)#define S3C2410_SDIDCON_XFER_TXSTART (3<<12) +#define S3C2410_SDIDCON_BLKNUM_MASK (0xFFF)#define S3C2410_SDIDCNT_BLKNUM_SHIFT (12)#define S3C2410_SDIDSTA_RDYWAITREQ (1<<10)
@@ -82,10 +94,12 @@#define S3C2410_SDIDSTA_TXDATAON (1<<1)#define S3C2410_SDIDSTA_RXDATAON (1<<0) +#define S3C2440_SDIFSTA_FIFORESET (1<<16) +#define S3C2440_SDIFSTA_FIFOFAIL (3<<14)/* 3 is correct (2 bits) */ #define S3C2410_SDIFSTA_TFDET (1<<13)#define S3C2410_SDIFSTA_RFDET (1<<12) -#define S3C2410_SDIFSTA_TXHALF (1<<11) -#define S3C2410_SDIFSTA_TXEMPTY (1<<10) +#define S3C2410_SDIFSTA_TFHALF (1<<11) +#define S3C2410_SDIFSTA_TFEMPTY (1<<10)#define S3C2410_SDIFSTA_RFLAST (1<<9)#define S3C2410_SDIFSTA_RFFULL (1<<8)#define S3C2410_SDIFSTA_RFHALF (1<<7)
drivers/mmc/host/s3cmci.c new file +1343 -0
1,343 lines not on this page · raw message
drivers/mmc/host/s3cmci.h new file +69 -0
69 lines not on this page · raw message
drivers/mmc/host/Kconfig +11 -0
@@ -142,3 +142,14 @@ config MMC_SPI If unsure, or if your system has no SPI master driver, say N. +config MMC_S3C + tristate "Samsung S3C SD/MMC Card Interface support" + depends on ARCH_S3C2410 && MMC + help + This selects a driver for the MCI interface found in + Samsung's S3C2410, S3C2412, S3C2440, S3C2442 CPUs. + If you have a board based on one of those and a MMC/SD + slot, say Y or M here. + + If unsure, say N. +
drivers/mmc/host/Makefile +1 -1
@@ -18,4 +18,4 @@ obj-$(CONFIG_MMC_OMAP) += omap.o obj-$(CONFIG_MMC_AT91) += at91_mci.o obj-$(CONFIG_MMC_TIFM_SD) += tifm_sd.o obj-$(CONFIG_MMC_SPI) += mmc_spi.o - +obj-$(CONFIG_MMC_S3C) += s3cmci.o
Signature · 3 lines
Ben ([email protected], http://www.fluff.org/) 'a smiley only costs 4 bytes'
PATCH v5 2/16 MMC: S3C24XX MMC/SD driver write fixes
In reply to [email protected]From: Harald Welte <[email protected]>
This patch is a workaround of some S3C2410 MMC chip bug
drivers/mmc/host/s3cmci.c +13 -3
@@ -461,9 +461,19 @@ static irqreturn_t s3cmci_irq(int irq, vif (mci_csta &S3C2410_SDICMDSTAT_CRCFAIL ) {if (cmd->flags &MMC_RSP_CRC ) { - cmd->error = -EILSEQ ; - host->status ="error: bad command crc" ; - goto fail_transfer; +if (host->mrq->cmd->flags &MMC_RSP_136 ) { +dbg (host, dbg_irq, +"fixup: ignore CRC fail with long rsp\n" ); + }else { +/* note, we used to fail the transfer +* here, but it seems that this is just +* the hardware getting it wrong. +* +* cmd->error = -EILSEQ; +* host->status = "error: bad command crc"; +* goto fail_transfer; +*/ + } } mci_cclear |=S3C2410_SDICMDSTAT_CRCFAIL ;
Signature · 3 lines
Ben ([email protected], http://www.fluff.org/) 'a smiley only costs 4 bytes'
PATCH v5 3/16 MMC: DMA free fix for S3C24XX SD/MMC driver
In reply to [email protected]From: Harald Welte <[email protected]>
Bugfix to ensure DMA channel allocated is freed on exit.
drivers/mmc/host/s3cmci.c +1 -0
@@ -1254,6 +1254,7 @@ static int s3cmci_remove(struct platformclk_put (host->clk);tasklet_disable (&host->pio_tasklet); +s3c2410_dma_free (S3CMCI_DMA , &s3cmci_dma_client);free_irq (host->irq_cd, host);free_irq (host->irq, host);
Signature · 3 lines
Ben ([email protected], http://www.fluff.org/) 'a smiley only costs 4 bytes'
PATCH v5 4/16 MMC: S3C24XX MMC/SD stop fix
In reply to [email protected]From: Thomas Kleffel <[email protected]>
Fix the request finalisation by ensuring the controller is stopped.
drivers/mmc/host/s3cmci.c +2 -2
@@ -677,7 +677,7 @@ static void finalize_request(struct s3cm/* Cleanup controller */ writel (0 , host->base +S3C2410_SDICMDARG ); -writel (0 , host->base +S3C2410_SDIDCON ); +writel (S3C2410_SDIDCON_STOP , host->base +S3C2410_SDIDCON );writel (0 , host->base +S3C2410_SDICMDCON );writel (0 , host->base + host->sdiimsk);
@@ -803,7 +803,7 @@ static int s3cmci_setup_data(struct s3cmdbg (host, dbg_err,"mci_setup_data() transfer stillin progress.\n" ); -writel (0 , host->base +S3C2410_SDIDCON ); +writel (S3C2410_SDIDCON_STOP , host->base +S3C2410_SDIDCON );s3cmci_reset (host);if ((stoptries--) ==0 ) {
Signature · 3 lines
Ben ([email protected], http://www.fluff.org/) 'a smiley only costs 4 bytes'
PATCH v5 5/16 MMC: Fix S3C24XX IRQ enable during PIO transfers
In reply to [email protected]From: Roman Moracik <[email protected]>
Fix Bug #677 - I/O errors on heavy microSD writes for 2.6.22.x.
drivers/mmc/host/s3cmci.c +4 -3
@@ -335,6 +335,8 @@ static void pio_tasklet(unsigned long dastruct s3cmci_host *host = (struct s3cmci_host *) data; +disable_irq (host->irq); +if (host->pio_active ==XFER_WRITE )do_pio_write (host);
@@ -352,9 +354,9 @@ static void pio_tasklet(unsigned long da host->mrq->data->error = -EINVAL ; } -disable_irq (host->irq);finalize_request (host); - } + }else +enable_irq (host->irq); }/*
@@ -630,7 +632,6 @@ out:spin_unlock_irqrestore (&host->complete_lock, iflags);return ; - fail_request: host->mrq->data->error = -EINVAL ; host->complete_what =COMPLETION_FINALIZE ;
Signature · 3 lines
Ben ([email protected], http://www.fluff.org/) 'a smiley only costs 4 bytes'
PATCH v5 6/16 MMC: S3C24XX: Add platform data for MMC/SD driver
In reply to [email protected]This patch adds platform data support to the s3mci driver. This allows flexible board-specific configuration of set_power, card detect and read only pins.
drivers/mmc/host/s3cmci.c +41 -3
@@ -21,6 +21,8 @@#include <asm/arch/regs-sdi.h> #include <asm/arch/regs-gpio.h> +#include <asm/plat-s3c24xx/mci.h> +#include "s3cmci.h" #define DRIVER_NAME "s3c-mci"
@@ -1011,6 +1013,9 @@ static void s3cmci_set_ios(struct mmc_hos3c2410_gpio_cfgpin (S3C2410_GPE9 ,S3C2410_GPE9_SDDAT2 );s3c2410_gpio_cfgpin (S3C2410_GPE10 ,S3C2410_GPE10_SDDAT3 ); +if (host->pdata->set_power) + host->pdata->set_power (ios->power_mode, ios->vdd); +if (!host->is2440) mci_con |=S3C2410_SDICON_FIFORESET ;
@@ -1024,6 +1029,9 @@ static void s3cmci_set_ios(struct mmc_hoif (host->is2440) mci_con |=S3C2440_SDICON_SDRESET ; +if (host->pdata->set_power) + host->pdata->set_power (ios->power_mode, ios->vdd); +break ; }
@@ -1072,9 +1080,25 @@ static void s3cmci_reset(struct s3cmci_hwritel (con, host->base +S3C2410_SDICON ); } +static int s3cmci_get_ro (struct mmc_host *mmc) +{ +struct s3cmci_host *host =mmc_priv (mmc); + +if (host->pdata->gpio_wprotect ==0 ) +return 0 ; + +return s3c2410_gpio_getpin (host->pdata->gpio_wprotect); +} +static struct mmc_host_ops s3cmci_ops = { .request = s3cmci_request, .set_ios = s3cmci_set_ios, + .get_ro = s3cmci_get_ro, +}; + +static struct s3c24xx_mci_pdata s3cmci_def_pdata = { +/* This is currently here to avoid a number of if (host->pdata) +* checks. Any zero fields to ensure reaonable defaults are picked. */ };static int __devinit s3cmci_probe (struct platform_device *pdev,int is2440)
@@ -1094,6 +1118,12 @@ static int __devinit s3cmci_probe(struct host->pdev = pdev; host->is2440 = is2440; + host->pdata = pdev->dev.platform_data; +if (!host->pdata) { + pdev->dev.platform_data = &s3cmci_def_pdata; + host->pdata = &s3cmci_def_pdata; + } +spin_lock_init (&host->complete_lock);tasklet_init (&host->pio_tasklet, pio_tasklet, (unsigned long ) host);
@@ -1112,7 +1142,8 @@ static int __devinit s3cmci_probe(struct host->pio_active =XFER_NONE ; host->dma =S3CMCI_DMA ; - host->irq_cd =IRQ_EINT2 ; + host->irq_cd =s3c2410_gpio_getirq (host->pdata->gpio_detect); +s3c2410_gpio_cfgpin (host->pdata->gpio_detect,S3C2410_GPIO_IRQ ); host->mem =platform_get_resource (pdev,IORESOURCE_MEM ,0 );if (!host->mem) {
@@ -1158,7 +1189,7 @@ static int __devinit s3cmci_probe(structdisable_irq (host->irq); -s3c2410_gpio_cfgpin (S3C2410_GPF2 ,S3C2410_GPF2_EINT2 ); +s3c2410_gpio_cfgpin (host->pdata->gpio_detect,S3C2410_GPIO_IRQ );set_irq_type (host->irq_cd,IRQT_BOTHEDGE );if (request_irq (host->irq_cd, s3cmci_irq_cd,0 ,DRIVER_NAME , host)) {
@@ -1168,6 +1199,10 @@ static int __devinit s3cmci_probe(struct goto probe_free_irq; } +if (host->pdata->gpio_wprotect) +s3c2410_gpio_cfgpin (host->pdata->gpio_wprotect, +S3C2410_GPIO_INPUT ); +if (s3c2410_dma_request (S3CMCI_DMA , &s3cmci_dma_client,NULL )) {dev_err (&pdev->dev,"unable to get DMA channel.\n" ); ret = -EBUSY ;
@@ -1191,11 +1226,14 @@ static int __devinit s3cmci_probe(struct host->clk_rate =clk_get_rate (host->clk); mmc->ops = &s3cmci_ops; - mmc->ocr_avail =MMC_VDD_32_33 ; + mmc->ocr_avail =MMC_VDD_32_33 |MMC_VDD_33_34 ; mmc->caps =MMC_CAP_4_BIT_DATA ; mmc->f_min = host->clk_rate / (host->clk_div *256 ); mmc->f_max = host->clk_rate / host->clk_div; +if (host->pdata->ocr_avail) + mmc->ocr_avail = host->pdata->ocr_avail; + mmc->max_blk_count =4095 ; mmc->max_blk_size =4095 ; mmc->max_req_size =4095 *512 ;
drivers/mmc/host/s3cmci.h +1 -0
@@ -22,6 +22,7 @@ enum s3cmci_waitfor {struct s3cmci_host {struct platform_device *pdev; +struct s3c24xx_mci_pdata *pdata;struct mmc_host *mmc;struct resource *mem;struct clk *clk;
include/asm-arm/plat-s3c24xx/mci.h new file +12 -0
@@ -0,0 +1,12 @@ +#ifndef _ARCH_MCI_H +#define _ARCH_MCI_H + +struct s3c24xx_mci_pdata { +unsigned int gpio_detect; +unsigned int gpio_wprotect; +unsigned long ocr_avail; +void (*set_power)(unsigned char power_mode, +unsigned short vdd); +}; + +#endif /* _ARCH_NCI_H */
Signature · 3 lines
Ben ([email protected], http://www.fluff.org/) 'a smiley only costs 4 bytes'
PATCH v5 7/16 MMC: S3C24XX: Add support to invert write protect line
In reply to [email protected]Support for inverting the sense of the MMC driver's write protect detection line.
drivers/mmc/host/s3cmci.c +9 -2
@@ -1083,11 +1083,18 @@ static void s3cmci_reset(struct s3cmci_hstatic int s3cmci_get_ro (struct mmc_host *mmc) {struct s3cmci_host *host =mmc_priv (mmc); +struct s3c24xx_mci_pdata *pdata = host->pdata; +int ret; -if (host->pdata->gpio_wprotect ==0 ) +if (pdata->gpio_wprotect ==0 )return 0 ; -return s3c2410_gpio_getpin (host->pdata->gpio_wprotect); + ret =s3c2410_gpio_getpin (pdata->gpio_wprotect); + +if (pdata->wprotect_invert) + ret = !ret; + +return ret; }static struct mmc_host_ops s3cmci_ops = {
include/asm-arm/plat-s3c24xx/mci.h +2 -0
@@ -2,6 +2,8 @@#define _ARCH_MCI_Hstruct s3c24xx_mci_pdata { +unsigned int wprotect_invert :1 ; +unsigned int gpio_detect;unsigned int gpio_wprotect;unsigned long ocr_avail;
Signature · 3 lines
Ben ([email protected], http://www.fluff.org/) 'a smiley only costs 4 bytes'
PATCH v5 8/16 MMC: S3C24XX: Ensure host->mrq->data is valid
In reply to [email protected]Fix a crash if host->mrq->data is NULL on ending a transfer.
drivers/mmc/host/s3cmci.c +2 -1
@@ -353,7 +353,8 @@ static void pio_tasklet(unsigned long da (host->pio_active ==XFER_READ ) ?"read" :"write" , host->pio_count, host->pio_words); - host->mrq->data->error = -EINVAL ; +if (host->mrq->data) + host->mrq->data->error = -EINVAL ; }finalize_request (host);
Signature · 3 lines
Ben ([email protected], http://www.fluff.org/) 'a smiley only costs 4 bytes'
PATCH v5 9/16 MMC: S3C24XX: Allow card-detect on non-IRQ capable pin
In reply to [email protected]Add support to the S3C24XX MMC driver to have the card detect be on a pin that is not IRQ capable.
drivers/mmc/host/s3cmci.c +17 -11
@@ -1150,8 +1150,6 @@ static int __devinit s3cmci_probe(struct host->pio_active =XFER_NONE ; host->dma =S3CMCI_DMA ; - host->irq_cd =s3c2410_gpio_getirq (host->pdata->gpio_detect); -s3c2410_gpio_cfgpin (host->pdata->gpio_detect,S3C2410_GPIO_IRQ ); host->mem =platform_get_resource (pdev,IORESOURCE_MEM ,0 );if (!host->mem) {
@@ -1197,14 +1195,20 @@ static int __devinit s3cmci_probe(structdisable_irq (host->irq); -s3c2410_gpio_cfgpin (host->pdata->gpio_detect,S3C2410_GPIO_IRQ ); -set_irq_type (host->irq_cd,IRQT_BOTHEDGE ); + host->irq_cd =s3c2410_gpio_getirq (host->pdata->gpio_detect); -if (request_irq (host->irq_cd, s3cmci_irq_cd,0 ,DRIVER_NAME , host)) { -dev_err (&pdev->dev, -"failed to request card detect interrupt.\n" ); - ret = -ENOENT ; - goto probe_free_irq; +if (host->irq_cd >=0 ) { +if (request_irq (host->irq_cd, s3cmci_irq_cd, +IRQF_TRIGGER_RISING |IRQF_TRIGGER_FALLING , +DRIVER_NAME , host)) { +dev_err (&pdev->dev,"can't get card detect irq.\n" ); + ret = -ENOENT ; + goto probe_free_irq; + } + }else { +dev_warn (&pdev->dev,"host detect has no irq available\n" ); +s3c2410_gpio_cfgpin (host->pdata->gpio_detect, +S3C2410_GPIO_INPUT ); }if (host->pdata->gpio_wprotect)
@@ -1273,7 +1277,8 @@ static int __devinit s3cmci_probe(structclk_put (host->clk); probe_free_irq_cd: -free_irq (host->irq_cd, host); +if (host->irq_cd >=0 ) +free_irq (host->irq_cd, host); probe_free_irq:free_irq (host->irq, host);
@@ -1303,7 +1308,8 @@ static int s3cmci_remove(struct platformtasklet_disable (&host->pio_tasklet);s3c2410_dma_free (S3CMCI_DMA , &s3cmci_dma_client); -free_irq (host->irq_cd, host); +if (host->irq_cd >=0 ) +free_irq (host->irq_cd, host);free_irq (host->irq, host);iounmap (host->base);
Signature · 3 lines
Ben ([email protected], http://www.fluff.org/) 'a smiley only costs 4 bytes'
PATCH v5 10/16 MMC: S3C24XX: Fix s3c2410_dma_request() return code check.
In reply to [email protected]The driver should be checking for a negative error code from s3c2410_dma_request(), not non-zero. Newer kernels now return the DMA channel number that was allocated by the request.
drivers/mmc/host/s3cmci.c +1 -1
@@ -1215,7 +1215,7 @@ static int __devinit s3cmci_probe(structs3c2410_gpio_cfgpin (host->pdata->gpio_wprotect,S3C2410_GPIO_INPUT ); -if (s3c2410_dma_request (S3CMCI_DMA , &s3cmci_dma_client,NULL )) { +if (s3c2410_dma_request (S3CMCI_DMA , &s3cmci_dma_client,NULL ) <0 ) {dev_err (&pdev->dev,"unable to get DMA channel.\n" ); ret = -EBUSY ; goto probe_free_irq_cd;
Signature · 3 lines
Ben ([email protected], http://www.fluff.org/) 'a smiley only costs 4 bytes'
PATCH v5 11/16 MMC: S3C24XX: Add MODULE_ALIAS() entries for the platform devices
In reply to [email protected]Add MODULE_ALIAS() declerations for all the supported platform devices for this driver.
drivers/mmc/host/s3cmci.c +3 -0
@@ -1405,3 +1405,6 @@ module_exit(s3cmci_exit);MODULE_DESCRIPTION ("Samsung S3C MMC/SD Card Interface driver" );MODULE_LICENSE ("GPL v2" );MODULE_AUTHOR ("Thomas Kleffel <[email protected]>" ); +MODULE_ALIAS ("platform:s3c2410-sdi" ); +MODULE_ALIAS ("platform:s3c2412-sdi" ); +MODULE_ALIAS ("platform:s3c2440-sdi" );
Signature · 3 lines
Ben ([email protected], http://www.fluff.org/) 'a smiley only costs 4 bytes'
PATCH v5 12/16 MMC: S3C24XX: Fix use of msecs where jiffies are needed
In reply to [email protected]mmc_detect_change() takes jiffies, not msecs. Convert the previous value of msecs into jiffies before calling.
drivers/mmc/host/s3cmci.c +1 -1
@@ -584,7 +584,7 @@ static irqreturn_t s3cmci_irq_cd(int irqdbg (host, dbg_irq,"card detect\n" ); -mmc_detect_change (host->mmc,500 ); +mmc_detect_change (host->mmc,msecs_to_jiffies (500 ));return IRQ_HANDLED ; }
Signature · 3 lines
Ben ([email protected], http://www.fluff.org/) 'a smiley only costs 4 bytes'
PATCH v5 13/16 MMC: S3C24XX: Add media presence test to request handling.
In reply to [email protected]Ensure that we have physical media present before attempting to send a request to a card. This ensures that we do not get flooded by errors from commands that can never be completed timing out.
drivers/mmc/host/s3cmci.c +18 -1
@@ -984,6 +984,18 @@ static void s3cmci_send_request(struct menable_irq (host->irq); } +static int s3cmci_card_present (struct s3cmci_host *host) +{ +struct s3c24xx_mci_pdata *pdata = host->pdata; +int ret; + +if (pdata->gpio_detect ==0 ) +return -ENOSYS ; + + ret =s3c2410_gpio_getpin (pdata->gpio_detect) ?0 :1 ; +return ret ^ pdata->detect_invert; +} +static void s3cmci_request (struct mmc_host *mmc,struct mmc_request *mrq) {struct s3cmci_host *host =mmc_priv (mmc);
@@ -992,7 +1004,12 @@ static void s3cmci_request(struct mmc_ho host->cmd_is_stop =0 ; host->mrq = mrq; -s3cmci_send_request (mmc); +if (s3cmci_card_present (host) ==0 ) { +dbg (host, dbg_err,"%s: no medium present\n" , __func__); + host->mrq->cmd->error = -ENOMEDIUM ; +mmc_request_done (mmc, mrq); + }else +s3cmci_send_request (mmc); }static void s3cmci_set_ios (struct mmc_host *mmc,struct mmc_ios *ios)
include/asm-arm/plat-s3c24xx/mci.h +1 -0
@@ -3,6 +3,7 @@struct s3c24xx_mci_pdata {unsigned int wprotect_invert :1 ; +unsigned int detect_invert :1 ;/* set => detect active high. */ unsigned int gpio_detect;unsigned int gpio_wprotect;
Signature · 3 lines
Ben ([email protected], http://www.fluff.org/) 'a smiley only costs 4 bytes'
PATCH v5 14/16 MMC: S3C24XX: Update error debugging.
In reply to [email protected]Add better debugging to show where errors are being generated, as some error codes can come from several different code paths.
Also fix the error return path from s3cmci_setup_data() to return the error it returned to the request.
drivers/mmc/host/s3cmci.c +10 -2
@@ -450,6 +450,7 @@ static irqreturn_t s3cmci_irq(int irq, v }if (mci_csta &S3C2410_SDICMDSTAT_CMDTIMEOUT ) { +dbg (host, dbg_err,"CMDSTAT: error CMDTIMEOUT\n" ); cmd->error = -ETIMEDOUT ; host->status ="error: command timeout" ; goto fail_transfer;
@@ -505,12 +506,14 @@ static irqreturn_t s3cmci_irq(int irq, v/* Check for FIFO failure */ if (host->is2440) {if (mci_fsta &S3C2440_SDIFSTA_FIFOFAIL ) { +dbg (host, dbg_err,"FIFO failure\n" ); host->mrq->data->error = -EILSEQ ; host->status ="error: 2440 fifo failure" ; goto fail_transfer; } }else {if (mci_dsta &S3C2410_SDIDSTA_FIFOFAIL ) { +dbg (host, dbg_err,"FIFO failure\n" ); cmd->data->error = -EILSEQ ; host->status ="error: fifo failure" ; goto fail_transfer;
@@ -518,18 +521,21 @@ static irqreturn_t s3cmci_irq(int irq, v }if (mci_dsta &S3C2410_SDIDSTA_RXCRCFAIL ) { +dbg (host, dbg_err,"bad data crc (outgoing)\n" ); cmd->data->error = -EILSEQ ; host->status ="error: bad data crc (outgoing)" ; goto fail_transfer; }if (mci_dsta &S3C2410_SDIDSTA_CRCFAIL ) { +dbg (host, dbg_err,"bad data crc (incoming)\n" ); cmd->data->error = -EILSEQ ; host->status ="error: bad data crc (incoming)" ; goto fail_transfer; }if (mci_dsta &S3C2410_SDIDSTA_DATATIMEOUT ) { +dbg (host, dbg_err,"data timeout\n" ); cmd->data->error = -ETIMEDOUT ; host->status ="error: data timeout" ; goto fail_transfer;
@@ -956,8 +962,9 @@ static void s3cmci_send_request(struct m host->dcnt++;if (res) { - cmd->error = -EINVAL ; - cmd->data->error = -EINVAL ; +dbg (host, dbg_err,"setup data error %d\n" , res); + cmd->error = res; + cmd->data->error = res;mmc_request_done (mmc, mrq);return ;
@@ -969,6 +976,7 @@ static void s3cmci_send_request(struct m res =s3cmci_prepare_pio (host, cmd->data);if (res) { +dbg (host, dbg_err,"data prepare error %d\n" , res); cmd->error = res; cmd->data->error = res;
Signature · 3 lines
Ben ([email protected], http://www.fluff.org/) 'a smiley only costs 4 bytes'
PATCH v5 15/16 MMC: S3C24XX: Add maintainer entry
In reply to [email protected]Add Ben Dooks as S3C24XX SD/MMC driver maintainer.
MAINTAINERS +7 -0
@@ -3544,6 +3544,13 @@ L: [email protected] W: http://www.ibm.com/developerworks/linux/linux390/ S: Supported +S3C24XX SD/MMC Driver +P: Ben Dooks +M: [email protected] +L: [email protected] (subscribers-only) +L: [email protected] +S: Supported + SAA7146 VIDEO4LINUX-2 DRIVER P: Michael Hunold M: [email protected]
Signature · 3 lines
Ben ([email protected], http://www.fluff.org/) 'a smiley only costs 4 bytes'
PATCH v5 16/16 MMC: S3C24XX: Refuse incorrectly aligned transfers
In reply to [email protected]The hardware does not support any multi-block transfers with an block-size that is not 32bit aligned. Also the driver itself does not support single block non-32bit transfers either.
Ensure that the s3cmci_setup_data() returns the appropriate error if we encounter this.
drivers/mmc/host/s3cmci.c +11 -0
@@ -807,6 +807,17 @@ static int s3cmci_setup_data(struct s3cmreturn 0 ; } +if ((data->blksz &3 ) !=0 ) { +/* We cannot deal with unaligned blocks with more than +* one block being transfered. */ + +if (data->blocks >1 ) +return -EINVAL ; + +/* No support yet for non-word block transfers. */ +return -EINVAL ; + } +while (readl (host->base +S3C2410_SDIDSTA ) & (S3C2410_SDIDSTA_TXDATAON |S3C2410_SDIDSTA_RXDATAON )) {
Signature · 3 lines
Ben ([email protected], http://www.fluff.org/) 'a smiley only costs 4 bytes'
Quoted 2 lines · On Mon, Jun 30, 2008 at 10:40:23PM +0100, [email protected] wrote:
The S3C24XX SD/MMC driver follows this, see
previous releases for notes.
ARGH! forgot to set From address in quilt to "Ben Dooks <[email protected]>"
Quoted 9 lines
Signature · 8 lines
Ben ([email protected], http://www.fluff.org/) 'a smiley only costs 4 bytes' -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Signature · 3 lines
Ben ([email protected], http://www.fluff.org/) 'a smiley only costs 4 bytes'
Quoted 3 lines · On Mon, 30 Jun 2008 22:40:23 +0100 [email protected] wrote:
The S3C24XX SD/MMC driver follows this, see
previous releases for notes.
I've applied the whole lot and tweaked the author as per your request.
Rgds
Signature · 9 lines
-- Pierre Ossman Linux kernel, MMC maintainer http://www.kernel.org rdesktop, core developer http://www.rdesktop.org WARNING: This correspondence is being monitored by the Swedish government. Make sure your server uses encryption for SMTP traffic and consider using PGP for end-to-end encryption.