[PATCH] iscsi endianness annotations
[powerpc.git] / drivers / mmc / omap.c
index 827753c..1e96a2f 100644 (file)
@@ -91,7 +91,6 @@
 
 
 #define DRIVER_NAME "mmci-omap"
-#define RSP_TYPE(x)    ((x) & ~(MMC_RSP_BUSY|MMC_RSP_OPCODE))
 
 /* Specifies how often in millisecs to poll for card status changes
  * when the cover switch is open */
@@ -204,18 +203,22 @@ mmc_omap_start_command(struct mmc_omap_host *host, struct mmc_command *cmd)
        cmdtype = 0;
 
        /* Our hardware needs to know exact type */
-       switch (RSP_TYPE(mmc_resp_type(cmd))) {
-       case RSP_TYPE(MMC_RSP_R1):
-               /* resp 1, resp 1b */
+       switch (mmc_resp_type(cmd)) {
+       case MMC_RSP_NONE:
+               break;
+       case MMC_RSP_R1:
+       case MMC_RSP_R1B:
+               /* resp 1, 1b, 6, 7 */
                resptype = 1;
                break;
-       case RSP_TYPE(MMC_RSP_R2):
+       case MMC_RSP_R2:
                resptype = 2;
                break;
-       case RSP_TYPE(MMC_RSP_R3):
+       case MMC_RSP_R3:
                resptype = 3;
                break;
        default:
+               dev_err(mmc_dev(host->mmc), "Invalid response type: %04x\n", mmc_resp_type(cmd));
                break;
        }
 
@@ -581,15 +584,9 @@ static void mmc_omap_switch_timer(unsigned long arg)
        schedule_work(&host->switch_work);
 }
 
-/* FIXME: Handle card insertion and removal properly. Maybe use a mask
- * for MMC state? */
-static void mmc_omap_switch_callback(unsigned long data, u8 mmc_mask)
+static void mmc_omap_switch_handler(struct work_struct *work)
 {
-}
-
-static void mmc_omap_switch_handler(void *data)
-{
-       struct mmc_omap_host *host = (struct mmc_omap_host *) data;
+       struct mmc_omap_host *host = container_of(work, struct mmc_omap_host, switch_work);
        struct mmc_card *card;
        static int complained = 0;
        int cards = 0, cover_open;
@@ -691,8 +688,7 @@ mmc_omap_prepare_dma(struct mmc_omap_host *host, struct mmc_data *data)
        }
 
        /* Max limit for DMA frame count is 0xffff */
-       if (unlikely(count > 0xffff))
-               BUG();
+       BUG_ON(count > 0xffff);
 
        OMAP_MMC_WRITE(host, BUF, buf);
        omap_set_dma_transfer_params(dma_ch, OMAP_DMA_DATA_TYPE_S16,
@@ -824,7 +820,6 @@ mmc_omap_prepare_data(struct mmc_omap_host *host, struct mmc_request *req)
                return;
        }
 
-
        block_size = data->blksz;
 
        OMAP_MMC_WRITE(host, NBLK, data->blocks - 1);
@@ -896,7 +891,6 @@ static void mmc_omap_request(struct mmc_host *mmc, struct mmc_request *req)
 static void innovator_fpga_socket_power(int on)
 {
 #if defined(CONFIG_MACH_OMAP_INNOVATOR) && defined(CONFIG_ARCH_OMAP15XX)
-
        if (on) {
                fpga_write(fpga_read(OMAP1510_FPGA_POWER) | (1 << 3),
                     OMAP1510_FPGA_POWER);
@@ -978,7 +972,7 @@ static void mmc_omap_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
        case MMC_POWER_UP:
        case MMC_POWER_ON:
                mmc_omap_power(host, 1);
-               dsor |= 1<<11;
+               dsor |= 1 << 11;
                break;
        }
 
@@ -997,8 +991,8 @@ static void mmc_omap_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
                /* Send clock cycles, poll completion */
                OMAP_MMC_WRITE(host, IE, 0);
                OMAP_MMC_WRITE(host, STAT, 0xffff);
-               OMAP_MMC_WRITE(host, CMD, 1<<7);
-               while (0 == (OMAP_MMC_READ(host, STAT) & 1));
+               OMAP_MMC_WRITE(host, CMD, 1 << 7);
+               while ((OMAP_MMC_READ(host, STAT) & 1) == 0);
                OMAP_MMC_WRITE(host, STAT, 1);
        }
        clk_disable(host->fclk);
@@ -1022,25 +1016,29 @@ static int __init mmc_omap_probe(struct platform_device *pdev)
        struct omap_mmc_conf *minfo = pdev->dev.platform_data;
        struct mmc_host *mmc;
        struct mmc_omap_host *host = NULL;
-       struct resource *r;
+       struct resource *res;
        int ret = 0;
        int irq;
-       
-       r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+
+       if (minfo == NULL) {
+               dev_err(&pdev->dev, "platform data missing\n");
+               return -ENXIO;
+       }
+
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        irq = platform_get_irq(pdev, 0);
-       if (!r || irq < 0)
+       if (res == NULL || irq < 0)
                return -ENXIO;
 
-       r = request_mem_region(pdev->resource[0].start,
-                               pdev->resource[0].end - pdev->resource[0].start + 1,
-                              pdev->name);
-       if (!r)
+       res = request_mem_region(res->start, res->end - res->start + 1,
+                                pdev->name);
+       if (res == NULL)
                return -EBUSY;
 
        mmc = mmc_alloc_host(sizeof(struct mmc_omap_host), &pdev->dev);
-       if (!mmc) {
+       if (mmc == NULL) {
                ret = -ENOMEM;
-               goto out;
+               goto err_free_mem_region;
        }
 
        host = mmc_priv(mmc);
@@ -1052,13 +1050,13 @@ static int __init mmc_omap_probe(struct platform_device *pdev)
        host->dma_timer.data = (unsigned long) host;
 
        host->id = pdev->id;
-       host->mem_res = r;
+       host->mem_res = res;
        host->irq = irq;
 
        if (cpu_is_omap24xx()) {
                host->iclk = clk_get(&pdev->dev, "mmc_ick");
                if (IS_ERR(host->iclk))
-                       goto out;
+                       goto err_free_mmc_host;
                clk_enable(host->iclk);
        }
 
@@ -1069,7 +1067,7 @@ static int __init mmc_omap_probe(struct platform_device *pdev)
 
        if (IS_ERR(host->fclk)) {
                ret = PTR_ERR(host->fclk);
-               goto out;
+               goto err_free_iclk;
        }
 
        /* REVISIT:
@@ -1082,15 +1080,15 @@ static int __init mmc_omap_probe(struct platform_device *pdev)
        host->use_dma = 1;
        host->dma_ch = -1;
 
-       host->irq = pdev->resource[1].start;
+       host->irq = irq;
        host->phys_base = host->mem_res->start;
        host->virt_base = (void __iomem *) IO_ADDRESS(host->phys_base);
 
        mmc->ops = &mmc_omap_ops;
        mmc->f_min = 400000;
        mmc->f_max = 24000000;
-       mmc->ocr_avail = MMC_VDD_32_33|MMC_VDD_33_34;
-       mmc->caps = MMC_CAP_BYTEBLOCK;
+       mmc->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34;
+       mmc->caps = MMC_CAP_MULTIWRITE | MMC_CAP_BYTEBLOCK;
 
        if (minfo->wire4)
                 mmc->caps |= MMC_CAP_4_BIT_DATA;
@@ -1101,29 +1099,29 @@ static int __init mmc_omap_probe(struct platform_device *pdev)
         */
        mmc->max_phys_segs = 32;
        mmc->max_hw_segs = 32;
-       mmc->max_sectors = 256; /* NBLK max 11-bits, OMAP also limited by DMA */
-       mmc->max_seg_size = mmc->max_sectors * 512;
+       mmc->max_blk_size = 2048;       /* BLEN is 11 bits (+1) */
+       mmc->max_blk_count = 2048;      /* NBLK is 11 bits (+1) */
+       mmc->max_req_size = mmc->max_blk_size * mmc->max_blk_count;
+       mmc->max_seg_size = mmc->max_req_size;
 
        if (host->power_pin >= 0) {
                if ((ret = omap_request_gpio(host->power_pin)) != 0) {
                        dev_err(mmc_dev(host->mmc),
                                "Unable to get GPIO pin for MMC power\n");
-                       goto out;
+                       goto err_free_fclk;
                }
                omap_set_gpio_direction(host->power_pin, 0);
        }
 
        ret = request_irq(host->irq, mmc_omap_irq, 0, DRIVER_NAME, host);
        if (ret)
-               goto out;
+               goto err_free_power_gpio;
 
        host->dev = &pdev->dev;
        platform_set_drvdata(pdev, host);
 
-       mmc_add_host(mmc);
-
        if (host->switch_pin >= 0) {
-               INIT_WORK(&host->switch_work, mmc_omap_switch_handler, host);
+               INIT_WORK(&host->switch_work, mmc_omap_switch_handler);
                init_timer(&host->switch_timer);
                host->switch_timer.function = mmc_omap_switch_timer;
                host->switch_timer.data = (unsigned long) host;
@@ -1159,10 +1157,11 @@ static int __init mmc_omap_probe(struct platform_device *pdev)
                        schedule_work(&host->switch_work);
        }
 
-no_switch:
+       mmc_add_host(mmc);
+
        return 0;
 
-out:
+no_switch:
        /* FIXME: Free other resources too. */
        if (host) {
                if (host->iclk && !IS_ERR(host->iclk))
@@ -1171,6 +1170,20 @@ out:
                        clk_put(host->fclk);
                mmc_free_host(host->mmc);
        }
+err_free_power_gpio:
+       if (host->power_pin >= 0)
+               omap_free_gpio(host->power_pin);
+err_free_fclk:
+       clk_put(host->fclk);
+err_free_iclk:
+       if (host->iclk != NULL) {
+               clk_disable(host->iclk);
+               clk_put(host->iclk);
+       }
+err_free_mmc_host:
+       mmc_free_host(host->mmc);
+err_free_mem_region:
+       release_mem_region(res->start, res->end - res->start + 1);
        return ret;
 }
 
@@ -1180,30 +1193,31 @@ static int mmc_omap_remove(struct platform_device *pdev)
 
        platform_set_drvdata(pdev, NULL);
 
-       if (host) {
-               mmc_remove_host(host->mmc);
-               free_irq(host->irq, host);
-
-               if (host->power_pin >= 0)
-                       omap_free_gpio(host->power_pin);
-               if (host->switch_pin >= 0) {
-                       device_remove_file(&pdev->dev, &dev_attr_enable_poll);
-                       device_remove_file(&pdev->dev, &dev_attr_cover_switch);
-                       free_irq(OMAP_GPIO_IRQ(host->switch_pin), host);
-                       omap_free_gpio(host->switch_pin);
-                       host->switch_pin = -1;
-                       del_timer_sync(&host->switch_timer);
-                       flush_scheduled_work();
-               }
-               if (host->iclk && !IS_ERR(host->iclk))
-                       clk_put(host->iclk);
-               if (host->fclk && !IS_ERR(host->fclk))
-                       clk_put(host->fclk);
-               mmc_free_host(host->mmc);
+       BUG_ON(host == NULL);
+
+       mmc_remove_host(host->mmc);
+       free_irq(host->irq, host);
+
+       if (host->power_pin >= 0)
+               omap_free_gpio(host->power_pin);
+       if (host->switch_pin >= 0) {
+               device_remove_file(&pdev->dev, &dev_attr_enable_poll);
+               device_remove_file(&pdev->dev, &dev_attr_cover_switch);
+               free_irq(OMAP_GPIO_IRQ(host->switch_pin), host);
+               omap_free_gpio(host->switch_pin);
+               host->switch_pin = -1;
+               del_timer_sync(&host->switch_timer);
+               flush_scheduled_work();
        }
+       if (host->iclk && !IS_ERR(host->iclk))
+               clk_put(host->iclk);
+       if (host->fclk && !IS_ERR(host->fclk))
+               clk_put(host->fclk);
 
        release_mem_region(pdev->resource[0].start,
-                       pdev->resource[0].end - pdev->resource[0].start + 1);
+                          pdev->resource[0].end - pdev->resource[0].start + 1);
+
+       mmc_free_host(host->mmc);
 
        return 0;
 }