linux/drivers/mmc/host/wbsd.c
<<
>>
Prefs
   1/*
   2 *  linux/drivers/mmc/host/wbsd.c - Winbond W83L51xD SD/MMC driver
   3 *
   4 *  Copyright (C) 2004-2007 Pierre Ossman, All Rights Reserved.
   5 *
   6 * This program is free software; you can redistribute it and/or modify
   7 * it under the terms of the GNU General Public License as published by
   8 * the Free Software Foundation; either version 2 of the License, or (at
   9 * your option) any later version.
  10 *
  11 *
  12 * Warning!
  13 *
  14 * Changes to the FIFO system should be done with extreme care since
  15 * the hardware is full of bugs related to the FIFO. Known issues are:
  16 *
  17 * - FIFO size field in FSR is always zero.
  18 *
  19 * - FIFO interrupts tend not to work as they should. Interrupts are
  20 *   triggered only for full/empty events, not for threshold values.
  21 *
  22 * - On APIC systems the FIFO empty interrupt is sometimes lost.
  23 */
  24
  25#include <linux/module.h>
  26#include <linux/moduleparam.h>
  27#include <linux/init.h>
  28#include <linux/ioport.h>
  29#include <linux/platform_device.h>
  30#include <linux/interrupt.h>
  31#include <linux/dma-mapping.h>
  32#include <linux/delay.h>
  33#include <linux/pnp.h>
  34#include <linux/highmem.h>
  35#include <linux/mmc/host.h>
  36#include <linux/scatterlist.h>
  37#include <linux/slab.h>
  38
  39#include <asm/io.h>
  40#include <asm/dma.h>
  41
  42#include "wbsd.h"
  43
  44#define DRIVER_NAME "wbsd"
  45
  46#define DBG(x...) \
  47        pr_debug(DRIVER_NAME ": " x)
  48#define DBGF(f, x...) \
  49        pr_debug(DRIVER_NAME " [%s()]: " f, __func__ , ##x)
  50
  51/*
  52 * Device resources
  53 */
  54
  55#ifdef CONFIG_PNP
  56
  57static const struct pnp_device_id pnp_dev_table[] = {
  58        { "WEC0517", 0 },
  59        { "WEC0518", 0 },
  60        { "", 0 },
  61};
  62
  63MODULE_DEVICE_TABLE(pnp, pnp_dev_table);
  64
  65#endif /* CONFIG_PNP */
  66
  67static const int config_ports[] = { 0x2E, 0x4E };
  68static const int unlock_codes[] = { 0x83, 0x87 };
  69
  70static const int valid_ids[] = {
  71        0x7112,
  72};
  73
  74#ifdef CONFIG_PNP
  75static unsigned int param_nopnp = 0;
  76#else
  77static const unsigned int param_nopnp = 1;
  78#endif
  79static unsigned int param_io = 0x248;
  80static unsigned int param_irq = 6;
  81static int param_dma = 2;
  82
  83/*
  84 * Basic functions
  85 */
  86
  87static inline void wbsd_unlock_config(struct wbsd_host *host)
  88{
  89        BUG_ON(host->config == 0);
  90
  91        outb(host->unlock_code, host->config);
  92        outb(host->unlock_code, host->config);
  93}
  94
  95static inline void wbsd_lock_config(struct wbsd_host *host)
  96{
  97        BUG_ON(host->config == 0);
  98
  99        outb(LOCK_CODE, host->config);
 100}
 101
 102static inline void wbsd_write_config(struct wbsd_host *host, u8 reg, u8 value)
 103{
 104        BUG_ON(host->config == 0);
 105
 106        outb(reg, host->config);
 107        outb(value, host->config + 1);
 108}
 109
 110static inline u8 wbsd_read_config(struct wbsd_host *host, u8 reg)
 111{
 112        BUG_ON(host->config == 0);
 113
 114        outb(reg, host->config);
 115        return inb(host->config + 1);
 116}
 117
 118static inline void wbsd_write_index(struct wbsd_host *host, u8 index, u8 value)
 119{
 120        outb(index, host->base + WBSD_IDXR);
 121        outb(value, host->base + WBSD_DATAR);
 122}
 123
 124static inline u8 wbsd_read_index(struct wbsd_host *host, u8 index)
 125{
 126        outb(index, host->base + WBSD_IDXR);
 127        return inb(host->base + WBSD_DATAR);
 128}
 129
 130/*
 131 * Common routines
 132 */
 133
 134static void wbsd_init_device(struct wbsd_host *host)
 135{
 136        u8 setup, ier;
 137
 138        /*
 139         * Reset chip (SD/MMC part) and fifo.
 140         */
 141        setup = wbsd_read_index(host, WBSD_IDX_SETUP);
 142        setup |= WBSD_FIFO_RESET | WBSD_SOFT_RESET;
 143        wbsd_write_index(host, WBSD_IDX_SETUP, setup);
 144
 145        /*
 146         * Set DAT3 to input
 147         */
 148        setup &= ~WBSD_DAT3_H;
 149        wbsd_write_index(host, WBSD_IDX_SETUP, setup);
 150        host->flags &= ~WBSD_FIGNORE_DETECT;
 151
 152        /*
 153         * Read back default clock.
 154         */
 155        host->clk = wbsd_read_index(host, WBSD_IDX_CLK);
 156
 157        /*
 158         * Power down port.
 159         */
 160        outb(WBSD_POWER_N, host->base + WBSD_CSR);
 161
 162        /*
 163         * Set maximum timeout.
 164         */
 165        wbsd_write_index(host, WBSD_IDX_TAAC, 0x7F);
 166
 167        /*
 168         * Test for card presence
 169         */
 170        if (inb(host->base + WBSD_CSR) & WBSD_CARDPRESENT)
 171                host->flags |= WBSD_FCARD_PRESENT;
 172        else
 173                host->flags &= ~WBSD_FCARD_PRESENT;
 174
 175        /*
 176         * Enable interesting interrupts.
 177         */
 178        ier = 0;
 179        ier |= WBSD_EINT_CARD;
 180        ier |= WBSD_EINT_FIFO_THRE;
 181        ier |= WBSD_EINT_CRC;
 182        ier |= WBSD_EINT_TIMEOUT;
 183        ier |= WBSD_EINT_TC;
 184
 185        outb(ier, host->base + WBSD_EIR);
 186
 187        /*
 188         * Clear interrupts.
 189         */
 190        inb(host->base + WBSD_ISR);
 191}
 192
 193static void wbsd_reset(struct wbsd_host *host)
 194{
 195        u8 setup;
 196
 197        pr_err("%s: Resetting chip\n", mmc_hostname(host->mmc));
 198
 199        /*
 200         * Soft reset of chip (SD/MMC part).
 201         */
 202        setup = wbsd_read_index(host, WBSD_IDX_SETUP);
 203        setup |= WBSD_SOFT_RESET;
 204        wbsd_write_index(host, WBSD_IDX_SETUP, setup);
 205}
 206
 207static void wbsd_request_end(struct wbsd_host *host, struct mmc_request *mrq)
 208{
 209        unsigned long dmaflags;
 210
 211        if (host->dma >= 0) {
 212                /*
 213                 * Release ISA DMA controller.
 214                 */
 215                dmaflags = claim_dma_lock();
 216                disable_dma(host->dma);
 217                clear_dma_ff(host->dma);
 218                release_dma_lock(dmaflags);
 219
 220                /*
 221                 * Disable DMA on host.
 222                 */
 223                wbsd_write_index(host, WBSD_IDX_DMA, 0);
 224        }
 225
 226        host->mrq = NULL;
 227
 228        /*
 229         * MMC layer might call back into the driver so first unlock.
 230         */
 231        spin_unlock(&host->lock);
 232        mmc_request_done(host->mmc, mrq);
 233        spin_lock(&host->lock);
 234}
 235
 236/*
 237 * Scatter/gather functions
 238 */
 239
 240static inline void wbsd_init_sg(struct wbsd_host *host, struct mmc_data *data)
 241{
 242        /*
 243         * Get info. about SG list from data structure.
 244         */
 245        host->cur_sg = data->sg;
 246        host->num_sg = data->sg_len;
 247
 248        host->offset = 0;
 249        host->remain = host->cur_sg->length;
 250}
 251
 252static inline int wbsd_next_sg(struct wbsd_host *host)
 253{
 254        /*
 255         * Skip to next SG entry.
 256         */
 257        host->cur_sg++;
 258        host->num_sg--;
 259
 260        /*
 261         * Any entries left?
 262         */
 263        if (host->num_sg > 0) {
 264                host->offset = 0;
 265                host->remain = host->cur_sg->length;
 266        }
 267
 268        return host->num_sg;
 269}
 270
 271static inline char *wbsd_sg_to_buffer(struct wbsd_host *host)
 272{
 273        return sg_virt(host->cur_sg);
 274}
 275
 276static inline void wbsd_sg_to_dma(struct wbsd_host *host, struct mmc_data *data)
 277{
 278        unsigned int len, i;
 279        struct scatterlist *sg;
 280        char *dmabuf = host->dma_buffer;
 281        char *sgbuf;
 282
 283        sg = data->sg;
 284        len = data->sg_len;
 285
 286        for (i = 0; i < len; i++) {
 287                sgbuf = sg_virt(&sg[i]);
 288                memcpy(dmabuf, sgbuf, sg[i].length);
 289                dmabuf += sg[i].length;
 290        }
 291}
 292
 293static inline void wbsd_dma_to_sg(struct wbsd_host *host, struct mmc_data *data)
 294{
 295        unsigned int len, i;
 296        struct scatterlist *sg;
 297        char *dmabuf = host->dma_buffer;
 298        char *sgbuf;
 299
 300        sg = data->sg;
 301        len = data->sg_len;
 302
 303        for (i = 0; i < len; i++) {
 304                sgbuf = sg_virt(&sg[i]);
 305                memcpy(sgbuf, dmabuf, sg[i].length);
 306                dmabuf += sg[i].length;
 307        }
 308}
 309
 310/*
 311 * Command handling
 312 */
 313
 314static inline void wbsd_get_short_reply(struct wbsd_host *host,
 315                                        struct mmc_command *cmd)
 316{
 317        /*
 318         * Correct response type?
 319         */
 320        if (wbsd_read_index(host, WBSD_IDX_RSPLEN) != WBSD_RSP_SHORT) {
 321                cmd->error = -EILSEQ;
 322                return;
 323        }
 324
 325        cmd->resp[0]  = wbsd_read_index(host, WBSD_IDX_RESP12) << 24;
 326        cmd->resp[0] |= wbsd_read_index(host, WBSD_IDX_RESP13) << 16;
 327        cmd->resp[0] |= wbsd_read_index(host, WBSD_IDX_RESP14) << 8;
 328        cmd->resp[0] |= wbsd_read_index(host, WBSD_IDX_RESP15) << 0;
 329        cmd->resp[1]  = wbsd_read_index(host, WBSD_IDX_RESP16) << 24;
 330}
 331
 332static inline void wbsd_get_long_reply(struct wbsd_host *host,
 333        struct mmc_command *cmd)
 334{
 335        int i;
 336
 337        /*
 338         * Correct response type?
 339         */
 340        if (wbsd_read_index(host, WBSD_IDX_RSPLEN) != WBSD_RSP_LONG) {
 341                cmd->error = -EILSEQ;
 342                return;
 343        }
 344
 345        for (i = 0; i < 4; i++) {
 346                cmd->resp[i] =
 347                        wbsd_read_index(host, WBSD_IDX_RESP1 + i * 4) << 24;
 348                cmd->resp[i] |=
 349                        wbsd_read_index(host, WBSD_IDX_RESP2 + i * 4) << 16;
 350                cmd->resp[i] |=
 351                        wbsd_read_index(host, WBSD_IDX_RESP3 + i * 4) << 8;
 352                cmd->resp[i] |=
 353                        wbsd_read_index(host, WBSD_IDX_RESP4 + i * 4) << 0;
 354        }
 355}
 356
 357static void wbsd_send_command(struct wbsd_host *host, struct mmc_command *cmd)
 358{
 359        int i;
 360        u8 status, isr;
 361
 362        /*
 363         * Clear accumulated ISR. The interrupt routine
 364         * will fill this one with events that occur during
 365         * transfer.
 366         */
 367        host->isr = 0;
 368
 369        /*
 370         * Send the command (CRC calculated by host).
 371         */
 372        outb(cmd->opcode, host->base + WBSD_CMDR);
 373        for (i = 3; i >= 0; i--)
 374                outb((cmd->arg >> (i * 8)) & 0xff, host->base + WBSD_CMDR);
 375
 376        cmd->error = 0;
 377
 378        /*
 379         * Wait for the request to complete.
 380         */
 381        do {
 382                status = wbsd_read_index(host, WBSD_IDX_STATUS);
 383        } while (status & WBSD_CARDTRAFFIC);
 384
 385        /*
 386         * Do we expect a reply?
 387         */
 388        if (cmd->flags & MMC_RSP_PRESENT) {
 389                /*
 390                 * Read back status.
 391                 */
 392                isr = host->isr;
 393
 394                /* Card removed? */
 395                if (isr & WBSD_INT_CARD)
 396                        cmd->error = -ENOMEDIUM;
 397                /* Timeout? */
 398                else if (isr & WBSD_INT_TIMEOUT)
 399                        cmd->error = -ETIMEDOUT;
 400                /* CRC? */
 401                else if ((cmd->flags & MMC_RSP_CRC) && (isr & WBSD_INT_CRC))
 402                        cmd->error = -EILSEQ;
 403                /* All ok */
 404                else {
 405                        if (cmd->flags & MMC_RSP_136)
 406                                wbsd_get_long_reply(host, cmd);
 407                        else
 408                                wbsd_get_short_reply(host, cmd);
 409                }
 410        }
 411}
 412
 413/*
 414 * Data functions
 415 */
 416
 417static void wbsd_empty_fifo(struct wbsd_host *host)
 418{
 419        struct mmc_data *data = host->mrq->cmd->data;
 420        char *buffer;
 421        int i, fsr, fifo;
 422
 423        /*
 424         * Handle excessive data.
 425         */
 426        if (host->num_sg == 0)
 427                return;
 428
 429        buffer = wbsd_sg_to_buffer(host) + host->offset;
 430
 431        /*
 432         * Drain the fifo. This has a tendency to loop longer
 433         * than the FIFO length (usually one block).
 434         */
 435        while (!((fsr = inb(host->base + WBSD_FSR)) & WBSD_FIFO_EMPTY)) {
 436                /*
 437                 * The size field in the FSR is broken so we have to
 438                 * do some guessing.
 439                 */
 440                if (fsr & WBSD_FIFO_FULL)
 441                        fifo = 16;
 442                else if (fsr & WBSD_FIFO_FUTHRE)
 443                        fifo = 8;
 444                else
 445                        fifo = 1;
 446
 447                for (i = 0; i < fifo; i++) {
 448                        *buffer = inb(host->base + WBSD_DFR);
 449                        buffer++;
 450                        host->offset++;
 451                        host->remain--;
 452
 453                        data->bytes_xfered++;
 454
 455                        /*
 456                         * End of scatter list entry?
 457                         */
 458                        if (host->remain == 0) {
 459                                /*
 460                                 * Get next entry. Check if last.
 461                                 */
 462                                if (!wbsd_next_sg(host))
 463                                        return;
 464
 465                                buffer = wbsd_sg_to_buffer(host);
 466                        }
 467                }
 468        }
 469
 470        /*
 471         * This is a very dirty hack to solve a
 472         * hardware problem. The chip doesn't trigger
 473         * FIFO threshold interrupts properly.
 474         */
 475        if ((data->blocks * data->blksz - data->bytes_xfered) < 16)
 476                tasklet_schedule(&host->fifo_tasklet);
 477}
 478
 479static void wbsd_fill_fifo(struct wbsd_host *host)
 480{
 481        struct mmc_data *data = host->mrq->cmd->data;
 482        char *buffer;
 483        int i, fsr, fifo;
 484
 485        /*
 486         * Check that we aren't being called after the
 487         * entire buffer has been transferred.
 488         */
 489        if (host->num_sg == 0)
 490                return;
 491
 492        buffer = wbsd_sg_to_buffer(host) + host->offset;
 493
 494        /*
 495         * Fill the fifo. This has a tendency to loop longer
 496         * than the FIFO length (usually one block).
 497         */
 498        while (!((fsr = inb(host->base + WBSD_FSR)) & WBSD_FIFO_FULL)) {
 499                /*
 500                 * The size field in the FSR is broken so we have to
 501                 * do some guessing.
 502                 */
 503                if (fsr & WBSD_FIFO_EMPTY)
 504                        fifo = 0;
 505                else if (fsr & WBSD_FIFO_EMTHRE)
 506                        fifo = 8;
 507                else
 508                        fifo = 15;
 509
 510                for (i = 16; i > fifo; i--) {
 511                        outb(*buffer, host->base + WBSD_DFR);
 512                        buffer++;
 513                        host->offset++;
 514                        host->remain--;
 515
 516                        data->bytes_xfered++;
 517
 518                        /*
 519                         * End of scatter list entry?
 520                         */
 521                        if (host->remain == 0) {
 522                                /*
 523                                 * Get next entry. Check if last.
 524                                 */
 525                                if (!wbsd_next_sg(host))
 526                                        return;
 527
 528                                buffer = wbsd_sg_to_buffer(host);
 529                        }
 530                }
 531        }
 532
 533        /*
 534         * The controller stops sending interrupts for
 535         * 'FIFO empty' under certain conditions. So we
 536         * need to be a bit more pro-active.
 537         */
 538        tasklet_schedule(&host->fifo_tasklet);
 539}
 540
 541static void wbsd_prepare_data(struct wbsd_host *host, struct mmc_data *data)
 542{
 543        u16 blksize;
 544        u8 setup;
 545        unsigned long dmaflags;
 546        unsigned int size;
 547
 548        /*
 549         * Calculate size.
 550         */
 551        size = data->blocks * data->blksz;
 552
 553        /*
 554         * Check timeout values for overflow.
 555         * (Yes, some cards cause this value to overflow).
 556         */
 557        if (data->timeout_ns > 127000000)
 558                wbsd_write_index(host, WBSD_IDX_TAAC, 127);
 559        else {
 560                wbsd_write_index(host, WBSD_IDX_TAAC,
 561                        data->timeout_ns / 1000000);
 562        }
 563
 564        if (data->timeout_clks > 255)
 565                wbsd_write_index(host, WBSD_IDX_NSAC, 255);
 566        else
 567                wbsd_write_index(host, WBSD_IDX_NSAC, data->timeout_clks);
 568
 569        /*
 570         * Inform the chip of how large blocks will be
 571         * sent. It needs this to determine when to
 572         * calculate CRC.
 573         *
 574         * Space for CRC must be included in the size.
 575         * Two bytes are needed for each data line.
 576         */
 577        if (host->bus_width == MMC_BUS_WIDTH_1) {
 578                blksize = data->blksz + 2;
 579
 580                wbsd_write_index(host, WBSD_IDX_PBSMSB, (blksize >> 4) & 0xF0);
 581                wbsd_write_index(host, WBSD_IDX_PBSLSB, blksize & 0xFF);
 582        } else if (host->bus_width == MMC_BUS_WIDTH_4) {
 583                blksize = data->blksz + 2 * 4;
 584
 585                wbsd_write_index(host, WBSD_IDX_PBSMSB,
 586                        ((blksize >> 4) & 0xF0) | WBSD_DATA_WIDTH);
 587                wbsd_write_index(host, WBSD_IDX_PBSLSB, blksize & 0xFF);
 588        } else {
 589                data->error = -EINVAL;
 590                return;
 591        }
 592
 593        /*
 594         * Clear the FIFO. This is needed even for DMA
 595         * transfers since the chip still uses the FIFO
 596         * internally.
 597         */
 598        setup = wbsd_read_index(host, WBSD_IDX_SETUP);
 599        setup |= WBSD_FIFO_RESET;
 600        wbsd_write_index(host, WBSD_IDX_SETUP, setup);
 601
 602        /*
 603         * DMA transfer?
 604         */
 605        if (host->dma >= 0) {
 606                /*
 607                 * The buffer for DMA is only 64 kB.
 608                 */
 609                BUG_ON(size > 0x10000);
 610                if (size > 0x10000) {
 611                        data->error = -EINVAL;
 612                        return;
 613                }
 614
 615                /*
 616                 * Transfer data from the SG list to
 617                 * the DMA buffer.
 618                 */
 619                if (data->flags & MMC_DATA_WRITE)
 620                        wbsd_sg_to_dma(host, data);
 621
 622                /*
 623                 * Initialise the ISA DMA controller.
 624                 */
 625                dmaflags = claim_dma_lock();
 626                disable_dma(host->dma);
 627                clear_dma_ff(host->dma);
 628                if (data->flags & MMC_DATA_READ)
 629                        set_dma_mode(host->dma, DMA_MODE_READ & ~0x40);
 630                else
 631                        set_dma_mode(host->dma, DMA_MODE_WRITE & ~0x40);
 632                set_dma_addr(host->dma, host->dma_addr);
 633                set_dma_count(host->dma, size);
 634
 635                enable_dma(host->dma);
 636                release_dma_lock(dmaflags);
 637
 638                /*
 639                 * Enable DMA on the host.
 640                 */
 641                wbsd_write_index(host, WBSD_IDX_DMA, WBSD_DMA_ENABLE);
 642        } else {
 643                /*
 644                 * This flag is used to keep printk
 645                 * output to a minimum.
 646                 */
 647                host->firsterr = 1;
 648
 649                /*
 650                 * Initialise the SG list.
 651                 */
 652                wbsd_init_sg(host, data);
 653
 654                /*
 655                 * Turn off DMA.
 656                 */
 657                wbsd_write_index(host, WBSD_IDX_DMA, 0);
 658
 659                /*
 660                 * Set up FIFO threshold levels (and fill
 661                 * buffer if doing a write).
 662                 */
 663                if (data->flags & MMC_DATA_READ) {
 664                        wbsd_write_index(host, WBSD_IDX_FIFOEN,
 665                                WBSD_FIFOEN_FULL | 8);
 666                } else {
 667                        wbsd_write_index(host, WBSD_IDX_FIFOEN,
 668                                WBSD_FIFOEN_EMPTY | 8);
 669                        wbsd_fill_fifo(host);
 670                }
 671        }
 672
 673        data->error = 0;
 674}
 675
 676static void wbsd_finish_data(struct wbsd_host *host, struct mmc_data *data)
 677{
 678        unsigned long dmaflags;
 679        int count;
 680        u8 status;
 681
 682        WARN_ON(host->mrq == NULL);
 683
 684        /*
 685         * Send a stop command if needed.
 686         */
 687        if (data->stop)
 688                wbsd_send_command(host, data->stop);
 689
 690        /*
 691         * Wait for the controller to leave data
 692         * transfer state.
 693         */
 694        do {
 695                status = wbsd_read_index(host, WBSD_IDX_STATUS);
 696        } while (status & (WBSD_BLOCK_READ | WBSD_BLOCK_WRITE));
 697
 698        /*
 699         * DMA transfer?
 700         */
 701        if (host->dma >= 0) {
 702                /*
 703                 * Disable DMA on the host.
 704                 */
 705                wbsd_write_index(host, WBSD_IDX_DMA, 0);
 706
 707                /*
 708                 * Turn of ISA DMA controller.
 709                 */
 710                dmaflags = claim_dma_lock();
 711                disable_dma(host->dma);
 712                clear_dma_ff(host->dma);
 713                count = get_dma_residue(host->dma);
 714                release_dma_lock(dmaflags);
 715
 716                data->bytes_xfered = host->mrq->data->blocks *
 717                        host->mrq->data->blksz - count;
 718                data->bytes_xfered -= data->bytes_xfered % data->blksz;
 719
 720                /*
 721                 * Any leftover data?
 722                 */
 723                if (count) {
 724                        pr_err("%s: Incomplete DMA transfer. "
 725                                "%d bytes left.\n",
 726                                mmc_hostname(host->mmc), count);
 727
 728                        if (!data->error)
 729                                data->error = -EIO;
 730                } else {
 731                        /*
 732                         * Transfer data from DMA buffer to
 733                         * SG list.
 734                         */
 735                        if (data->flags & MMC_DATA_READ)
 736                                wbsd_dma_to_sg(host, data);
 737                }
 738
 739                if (data->error) {
 740                        if (data->bytes_xfered)
 741                                data->bytes_xfered -= data->blksz;
 742                }
 743        }
 744
 745        wbsd_request_end(host, host->mrq);
 746}
 747
 748/*****************************************************************************\
 749 *                                                                           *
 750 * MMC layer callbacks                                                       *
 751 *                                                                           *
 752\*****************************************************************************/
 753
 754static void wbsd_request(struct mmc_host *mmc, struct mmc_request *mrq)
 755{
 756        struct wbsd_host *host = mmc_priv(mmc);
 757        struct mmc_command *cmd;
 758
 759        /*
 760         * Disable tasklets to avoid a deadlock.
 761         */
 762        spin_lock_bh(&host->lock);
 763
 764        BUG_ON(host->mrq != NULL);
 765
 766        cmd = mrq->cmd;
 767
 768        host->mrq = mrq;
 769
 770        /*
 771         * Check that there is actually a card in the slot.
 772         */
 773        if (!(host->flags & WBSD_FCARD_PRESENT)) {
 774                cmd->error = -ENOMEDIUM;
 775                goto done;
 776        }
 777
 778        if (cmd->data) {
 779                /*
 780                 * The hardware is so delightfully stupid that it has a list
 781                 * of "data" commands. If a command isn't on this list, it'll
 782                 * just go back to the idle state and won't send any data
 783                 * interrupts.
 784                 */
 785                switch (cmd->opcode) {
 786                case 11:
 787                case 17:
 788                case 18:
 789                case 20:
 790                case 24:
 791                case 25:
 792                case 26:
 793                case 27:
 794                case 30:
 795                case 42:
 796                case 56:
 797                        break;
 798
 799                /* ACMDs. We don't keep track of state, so we just treat them
 800                 * like any other command. */
 801                case 51:
 802                        break;
 803
 804                default:
 805                        pr_warn("%s: Data command %d is not supported by this controller\n",
 806                                mmc_hostname(host->mmc), cmd->opcode);
 807                        cmd->error = -EINVAL;
 808
 809                        goto done;
 810                }
 811        }
 812
 813        /*
 814         * Does the request include data?
 815         */
 816        if (cmd->data) {
 817                wbsd_prepare_data(host, cmd->data);
 818
 819                if (cmd->data->error)
 820                        goto done;
 821        }
 822
 823        wbsd_send_command(host, cmd);
 824
 825        /*
 826         * If this is a data transfer the request
 827         * will be finished after the data has
 828         * transferred.
 829         */
 830        if (cmd->data && !cmd->error) {
 831                /*
 832                 * Dirty fix for hardware bug.
 833                 */
 834                if (host->dma == -1)
 835                        tasklet_schedule(&host->fifo_tasklet);
 836
 837                spin_unlock_bh(&host->lock);
 838
 839                return;
 840        }
 841
 842done:
 843        wbsd_request_end(host, mrq);
 844
 845        spin_unlock_bh(&host->lock);
 846}
 847
 848static void wbsd_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
 849{
 850        struct wbsd_host *host = mmc_priv(mmc);
 851        u8 clk, setup, pwr;
 852
 853        spin_lock_bh(&host->lock);
 854
 855        /*
 856         * Reset the chip on each power off.
 857         * Should clear out any weird states.
 858         */
 859        if (ios->power_mode == MMC_POWER_OFF)
 860                wbsd_init_device(host);
 861
 862        if (ios->clock >= 24000000)
 863                clk = WBSD_CLK_24M;
 864        else if (ios->clock >= 16000000)
 865                clk = WBSD_CLK_16M;
 866        else if (ios->clock >= 12000000)
 867                clk = WBSD_CLK_12M;
 868        else
 869                clk = WBSD_CLK_375K;
 870
 871        /*
 872         * Only write to the clock register when
 873         * there is an actual change.
 874         */
 875        if (clk != host->clk) {
 876                wbsd_write_index(host, WBSD_IDX_CLK, clk);
 877                host->clk = clk;
 878        }
 879
 880        /*
 881         * Power up card.
 882         */
 883        if (ios->power_mode != MMC_POWER_OFF) {
 884                pwr = inb(host->base + WBSD_CSR);
 885                pwr &= ~WBSD_POWER_N;
 886                outb(pwr, host->base + WBSD_CSR);
 887        }
 888
 889        /*
 890         * MMC cards need to have pin 1 high during init.
 891         * It wreaks havoc with the card detection though so
 892         * that needs to be disabled.
 893         */
 894        setup = wbsd_read_index(host, WBSD_IDX_SETUP);
 895        if (ios->chip_select == MMC_CS_HIGH) {
 896                BUG_ON(ios->bus_width != MMC_BUS_WIDTH_1);
 897                setup |= WBSD_DAT3_H;
 898                host->flags |= WBSD_FIGNORE_DETECT;
 899        } else {
 900                if (setup & WBSD_DAT3_H) {
 901                        setup &= ~WBSD_DAT3_H;
 902
 903                        /*
 904                         * We cannot resume card detection immediately
 905                         * because of capacitance and delays in the chip.
 906                         */
 907                        mod_timer(&host->ignore_timer, jiffies + HZ / 100);
 908                }
 909        }
 910        wbsd_write_index(host, WBSD_IDX_SETUP, setup);
 911
 912        /*
 913         * Store bus width for later. Will be used when
 914         * setting up the data transfer.
 915         */
 916        host->bus_width = ios->bus_width;
 917
 918        spin_unlock_bh(&host->lock);
 919}
 920
 921static int wbsd_get_ro(struct mmc_host *mmc)
 922{
 923        struct wbsd_host *host = mmc_priv(mmc);
 924        u8 csr;
 925
 926        spin_lock_bh(&host->lock);
 927
 928        csr = inb(host->base + WBSD_CSR);
 929        csr |= WBSD_MSLED;
 930        outb(csr, host->base + WBSD_CSR);
 931
 932        mdelay(1);
 933
 934        csr = inb(host->base + WBSD_CSR);
 935        csr &= ~WBSD_MSLED;
 936        outb(csr, host->base + WBSD_CSR);
 937
 938        spin_unlock_bh(&host->lock);
 939
 940        return !!(csr & WBSD_WRPT);
 941}
 942
 943static const struct mmc_host_ops wbsd_ops = {
 944        .request        = wbsd_request,
 945        .set_ios        = wbsd_set_ios,
 946        .get_ro         = wbsd_get_ro,
 947};
 948
 949/*****************************************************************************\
 950 *                                                                           *
 951 * Interrupt handling                                                        *
 952 *                                                                           *
 953\*****************************************************************************/
 954
 955/*
 956 * Helper function to reset detection ignore
 957 */
 958
 959static void wbsd_reset_ignore(struct timer_list *t)
 960{
 961        struct wbsd_host *host = from_timer(host, t, ignore_timer);
 962
 963        BUG_ON(host == NULL);
 964
 965        DBG("Resetting card detection ignore\n");
 966
 967        spin_lock_bh(&host->lock);
 968
 969        host->flags &= ~WBSD_FIGNORE_DETECT;
 970
 971        /*
 972         * Card status might have changed during the
 973         * blackout.
 974         */
 975        tasklet_schedule(&host->card_tasklet);
 976
 977        spin_unlock_bh(&host->lock);
 978}
 979
 980/*
 981 * Tasklets
 982 */
 983
 984static inline struct mmc_data *wbsd_get_data(struct wbsd_host *host)
 985{
 986        WARN_ON(!host->mrq);
 987        if (!host->mrq)
 988                return NULL;
 989
 990        WARN_ON(!host->mrq->cmd);
 991        if (!host->mrq->cmd)
 992                return NULL;
 993
 994        WARN_ON(!host->mrq->cmd->data);
 995        if (!host->mrq->cmd->data)
 996                return NULL;
 997
 998        return host->mrq->cmd->data;
 999}
1000
1001static void wbsd_tasklet_card(unsigned long param)
1002{
1003        struct wbsd_host *host = (struct wbsd_host *)param;
1004        u8 csr;
1005        int delay = -1;
1006
1007        spin_lock(&host->lock);
1008
1009        if (host->flags & WBSD_FIGNORE_DETECT) {
1010                spin_unlock(&host->lock);
1011                return;
1012        }
1013
1014        csr = inb(host->base + WBSD_CSR);
1015        WARN_ON(csr == 0xff);
1016
1017        if (csr & WBSD_CARDPRESENT) {
1018                if (!(host->flags & WBSD_FCARD_PRESENT)) {
1019                        DBG("Card inserted\n");
1020                        host->flags |= WBSD_FCARD_PRESENT;
1021
1022                        delay = 500;
1023                }
1024        } else if (host->flags & WBSD_FCARD_PRESENT) {
1025                DBG("Card removed\n");
1026                host->flags &= ~WBSD_FCARD_PRESENT;
1027
1028                if (host->mrq) {
1029                        pr_err("%s: Card removed during transfer!\n",
1030                                mmc_hostname(host->mmc));
1031                        wbsd_reset(host);
1032
1033                        host->mrq->cmd->error = -ENOMEDIUM;
1034                        tasklet_schedule(&host->finish_tasklet);
1035                }
1036
1037                delay = 0;
1038        }
1039
1040        /*
1041         * Unlock first since we might get a call back.
1042         */
1043
1044        spin_unlock(&host->lock);
1045
1046        if (delay != -1)
1047                mmc_detect_change(host->mmc, msecs_to_jiffies(delay));
1048}
1049
1050static void wbsd_tasklet_fifo(unsigned long param)
1051{
1052        struct wbsd_host *host = (struct wbsd_host *)param;
1053        struct mmc_data *data;
1054
1055        spin_lock(&host->lock);
1056
1057        if (!host->mrq)
1058                goto end;
1059
1060        data = wbsd_get_data(host);
1061        if (!data)
1062                goto end;
1063
1064        if (data->flags & MMC_DATA_WRITE)
1065                wbsd_fill_fifo(host);
1066        else
1067                wbsd_empty_fifo(host);
1068
1069        /*
1070         * Done?
1071         */
1072        if (host->num_sg == 0) {
1073                wbsd_write_index(host, WBSD_IDX_FIFOEN, 0);
1074                tasklet_schedule(&host->finish_tasklet);
1075        }
1076
1077end:
1078        spin_unlock(&host->lock);
1079}
1080
1081static void wbsd_tasklet_crc(unsigned long param)
1082{
1083        struct wbsd_host *host = (struct wbsd_host *)param;
1084        struct mmc_data *data;
1085
1086        spin_lock(&host->lock);
1087
1088        if (!host->mrq)
1089                goto end;
1090
1091        data = wbsd_get_data(host);
1092        if (!data)
1093                goto end;
1094
1095        DBGF("CRC error\n");
1096
1097        data->error = -EILSEQ;
1098
1099        tasklet_schedule(&host->finish_tasklet);
1100
1101end:
1102        spin_unlock(&host->lock);
1103}
1104
1105static void wbsd_tasklet_timeout(unsigned long param)
1106{
1107        struct wbsd_host *host = (struct wbsd_host *)param;
1108        struct mmc_data *data;
1109
1110        spin_lock(&host->lock);
1111
1112        if (!host->mrq)
1113                goto end;
1114
1115        data = wbsd_get_data(host);
1116        if (!data)
1117                goto end;
1118
1119        DBGF("Timeout\n");
1120
1121        data->error = -ETIMEDOUT;
1122
1123        tasklet_schedule(&host->finish_tasklet);
1124
1125end:
1126        spin_unlock(&host->lock);
1127}
1128
1129static void wbsd_tasklet_finish(unsigned long param)
1130{
1131        struct wbsd_host *host = (struct wbsd_host *)param;
1132        struct mmc_data *data;
1133
1134        spin_lock(&host->lock);
1135
1136        WARN_ON(!host->mrq);
1137        if (!host->mrq)
1138                goto end;
1139
1140        data = wbsd_get_data(host);
1141        if (!data)
1142                goto end;
1143
1144        wbsd_finish_data(host, data);
1145
1146end:
1147        spin_unlock(&host->lock);
1148}
1149
1150/*
1151 * Interrupt handling
1152 */
1153
1154static irqreturn_t wbsd_irq(int irq, void *dev_id)
1155{
1156        struct wbsd_host *host = dev_id;
1157        int isr;
1158
1159        isr = inb(host->base + WBSD_ISR);
1160
1161        /*
1162         * Was it actually our hardware that caused the interrupt?
1163         */
1164        if (isr == 0xff || isr == 0x00)
1165                return IRQ_NONE;
1166
1167        host->isr |= isr;
1168
1169        /*
1170         * Schedule tasklets as needed.
1171         */
1172        if (isr & WBSD_INT_CARD)
1173                tasklet_schedule(&host->card_tasklet);
1174        if (isr & WBSD_INT_FIFO_THRE)
1175                tasklet_schedule(&host->fifo_tasklet);
1176        if (isr & WBSD_INT_CRC)
1177                tasklet_hi_schedule(&host->crc_tasklet);
1178        if (isr & WBSD_INT_TIMEOUT)
1179                tasklet_hi_schedule(&host->timeout_tasklet);
1180        if (isr & WBSD_INT_TC)
1181                tasklet_schedule(&host->finish_tasklet);
1182
1183        return IRQ_HANDLED;
1184}
1185
1186/*****************************************************************************\
1187 *                                                                           *
1188 * Device initialisation and shutdown                                        *
1189 *                                                                           *
1190\*****************************************************************************/
1191
1192/*
1193 * Allocate/free MMC structure.
1194 */
1195
1196static int wbsd_alloc_mmc(struct device *dev)
1197{
1198        struct mmc_host *mmc;
1199        struct wbsd_host *host;
1200
1201        /*
1202         * Allocate MMC structure.
1203         */
1204        mmc = mmc_alloc_host(sizeof(struct wbsd_host), dev);
1205        if (!mmc)
1206                return -ENOMEM;
1207
1208        host = mmc_priv(mmc);
1209        host->mmc = mmc;
1210
1211        host->dma = -1;
1212
1213        /*
1214         * Set host parameters.
1215         */
1216        mmc->ops = &wbsd_ops;
1217        mmc->f_min = 375000;
1218        mmc->f_max = 24000000;
1219        mmc->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34;
1220        mmc->caps = MMC_CAP_4_BIT_DATA;
1221
1222        spin_lock_init(&host->lock);
1223
1224        /*
1225         * Set up timers
1226         */
1227        timer_setup(&host->ignore_timer, wbsd_reset_ignore, 0);
1228
1229        /*
1230         * Maximum number of segments. Worst case is one sector per segment
1231         * so this will be 64kB/512.
1232         */
1233        mmc->max_segs = 128;
1234
1235        /*
1236         * Maximum request size. Also limited by 64KiB buffer.
1237         */
1238        mmc->max_req_size = 65536;
1239
1240        /*
1241         * Maximum segment size. Could be one segment with the maximum number
1242         * of bytes.
1243         */
1244        mmc->max_seg_size = mmc->max_req_size;
1245
1246        /*
1247         * Maximum block size. We have 12 bits (= 4095) but have to subtract
1248         * space for CRC. So the maximum is 4095 - 4*2 = 4087.
1249         */
1250        mmc->max_blk_size = 4087;
1251
1252        /*
1253         * Maximum block count. There is no real limit so the maximum
1254         * request size will be the only restriction.
1255         */
1256        mmc->max_blk_count = mmc->max_req_size;
1257
1258        dev_set_drvdata(dev, mmc);
1259
1260        return 0;
1261}
1262
1263static void wbsd_free_mmc(struct device *dev)
1264{
1265        struct mmc_host *mmc;
1266        struct wbsd_host *host;
1267
1268        mmc = dev_get_drvdata(dev);
1269        if (!mmc)
1270                return;
1271
1272        host = mmc_priv(mmc);
1273        BUG_ON(host == NULL);
1274
1275        del_timer_sync(&host->ignore_timer);
1276
1277        mmc_free_host(mmc);
1278
1279        dev_set_drvdata(dev, NULL);
1280}
1281
1282/*
1283 * Scan for known chip id:s
1284 */
1285
1286static int wbsd_scan(struct wbsd_host *host)
1287{
1288        int i, j, k;
1289        int id;
1290
1291        /*
1292         * Iterate through all ports, all codes to
1293         * find hardware that is in our known list.
1294         */
1295        for (i = 0; i < ARRAY_SIZE(config_ports); i++) {
1296                if (!request_region(config_ports[i], 2, DRIVER_NAME))
1297                        continue;
1298
1299                for (j = 0; j < ARRAY_SIZE(unlock_codes); j++) {
1300                        id = 0xFFFF;
1301
1302                        host->config = config_ports[i];
1303                        host->unlock_code = unlock_codes[j];
1304
1305                        wbsd_unlock_config(host);
1306
1307                        outb(WBSD_CONF_ID_HI, config_ports[i]);
1308                        id = inb(config_ports[i] + 1) << 8;
1309
1310                        outb(WBSD_CONF_ID_LO, config_ports[i]);
1311                        id |= inb(config_ports[i] + 1);
1312
1313                        wbsd_lock_config(host);
1314
1315                        for (k = 0; k < ARRAY_SIZE(valid_ids); k++) {
1316                                if (id == valid_ids[k]) {
1317                                        host->chip_id = id;
1318
1319                                        return 0;
1320                                }
1321                        }
1322
1323                        if (id != 0xFFFF) {
1324                                DBG("Unknown hardware (id %x) found at %x\n",
1325                                        id, config_ports[i]);
1326                        }
1327                }
1328
1329                release_region(config_ports[i], 2);
1330        }
1331
1332        host->config = 0;
1333        host->unlock_code = 0;
1334
1335        return -ENODEV;
1336}
1337
1338/*
1339 * Allocate/free io port ranges
1340 */
1341
1342static int wbsd_request_region(struct wbsd_host *host, int base)
1343{
1344        if (base & 0x7)
1345                return -EINVAL;
1346
1347        if (!request_region(base, 8, DRIVER_NAME))
1348                return -EIO;
1349
1350        host->base = base;
1351
1352        return 0;
1353}
1354
1355static void wbsd_release_regions(struct wbsd_host *host)
1356{
1357        if (host->base)
1358                release_region(host->base, 8);
1359
1360        host->base = 0;
1361
1362        if (host->config)
1363                release_region(host->config, 2);
1364
1365        host->config = 0;
1366}
1367
1368/*
1369 * Allocate/free DMA port and buffer
1370 */
1371
1372static void wbsd_request_dma(struct wbsd_host *host, int dma)
1373{
1374        if (dma < 0)
1375                return;
1376
1377        if (request_dma(dma, DRIVER_NAME))
1378                goto err;
1379
1380        /*
1381         * We need to allocate a special buffer in
1382         * order for ISA to be able to DMA to it.
1383         */
1384        host->dma_buffer = kmalloc(WBSD_DMA_SIZE,
1385                GFP_NOIO | GFP_DMA | __GFP_RETRY_MAYFAIL | __GFP_NOWARN);
1386        if (!host->dma_buffer)
1387                goto free;
1388
1389        /*
1390         * Translate the address to a physical address.
1391         */
1392        host->dma_addr = dma_map_single(mmc_dev(host->mmc), host->dma_buffer,
1393                WBSD_DMA_SIZE, DMA_BIDIRECTIONAL);
1394        if (dma_mapping_error(mmc_dev(host->mmc), host->dma_addr))
1395                goto kfree;
1396
1397        /*
1398         * ISA DMA must be aligned on a 64k basis.
1399         */
1400        if ((host->dma_addr & 0xffff) != 0)
1401                goto unmap;
1402        /*
1403         * ISA cannot access memory above 16 MB.
1404         */
1405        else if (host->dma_addr >= 0x1000000)
1406                goto unmap;
1407
1408        host->dma = dma;
1409
1410        return;
1411
1412unmap:
1413        /*
1414         * If we've gotten here then there is some kind of alignment bug
1415         */
1416        BUG_ON(1);
1417
1418        dma_unmap_single(mmc_dev(host->mmc), host->dma_addr,
1419                WBSD_DMA_SIZE, DMA_BIDIRECTIONAL);
1420        host->dma_addr = 0;
1421
1422kfree:
1423        kfree(host->dma_buffer);
1424        host->dma_buffer = NULL;
1425
1426free:
1427        free_dma(dma);
1428
1429err:
1430        pr_warn(DRIVER_NAME ": Unable to allocate DMA %d - falling back on FIFO\n",
1431                dma);
1432}
1433
1434static void wbsd_release_dma(struct wbsd_host *host)
1435{
1436        /*
1437         * host->dma_addr is valid here iff host->dma_buffer is not NULL.
1438         */
1439        if (host->dma_buffer) {
1440                dma_unmap_single(mmc_dev(host->mmc), host->dma_addr,
1441                        WBSD_DMA_SIZE, DMA_BIDIRECTIONAL);
1442                kfree(host->dma_buffer);
1443        }
1444        if (host->dma >= 0)
1445                free_dma(host->dma);
1446
1447        host->dma = -1;
1448        host->dma_buffer = NULL;
1449        host->dma_addr = 0;
1450}
1451
1452/*
1453 * Allocate/free IRQ.
1454 */
1455
1456static int wbsd_request_irq(struct wbsd_host *host, int irq)
1457{
1458        int ret;
1459
1460        /*
1461         * Set up tasklets. Must be done before requesting interrupt.
1462         */
1463        tasklet_init(&host->card_tasklet, wbsd_tasklet_card,
1464                        (unsigned long)host);
1465        tasklet_init(&host->fifo_tasklet, wbsd_tasklet_fifo,
1466                        (unsigned long)host);
1467        tasklet_init(&host->crc_tasklet, wbsd_tasklet_crc,
1468                        (unsigned long)host);
1469        tasklet_init(&host->timeout_tasklet, wbsd_tasklet_timeout,
1470                        (unsigned long)host);
1471        tasklet_init(&host->finish_tasklet, wbsd_tasklet_finish,
1472                        (unsigned long)host);
1473
1474        /*
1475         * Allocate interrupt.
1476         */
1477        ret = request_irq(irq, wbsd_irq, IRQF_SHARED, DRIVER_NAME, host);
1478        if (ret)
1479                return ret;
1480
1481        host->irq = irq;
1482
1483        return 0;
1484}
1485
1486static void  wbsd_release_irq(struct wbsd_host *host)
1487{
1488        if (!host->irq)
1489                return;
1490
1491        free_irq(host->irq, host);
1492
1493        host->irq = 0;
1494
1495        tasklet_kill(&host->card_tasklet);
1496        tasklet_kill(&host->fifo_tasklet);
1497        tasklet_kill(&host->crc_tasklet);
1498        tasklet_kill(&host->timeout_tasklet);
1499        tasklet_kill(&host->finish_tasklet);
1500}
1501
1502/*
1503 * Allocate all resources for the host.
1504 */
1505
1506static int wbsd_request_resources(struct wbsd_host *host,
1507        int base, int irq, int dma)
1508{
1509        int ret;
1510
1511        /*
1512         * Allocate I/O ports.
1513         */
1514        ret = wbsd_request_region(host, base);
1515        if (ret)
1516                return ret;
1517
1518        /*
1519         * Allocate interrupt.
1520         */
1521        ret = wbsd_request_irq(host, irq);
1522        if (ret)
1523                return ret;
1524
1525        /*
1526         * Allocate DMA.
1527         */
1528        wbsd_request_dma(host, dma);
1529
1530        return 0;
1531}
1532
1533/*
1534 * Release all resources for the host.
1535 */
1536
1537static void wbsd_release_resources(struct wbsd_host *host)
1538{
1539        wbsd_release_dma(host);
1540        wbsd_release_irq(host);
1541        wbsd_release_regions(host);
1542}
1543
1544/*
1545 * Configure the resources the chip should use.
1546 */
1547
1548static void wbsd_chip_config(struct wbsd_host *host)
1549{
1550        wbsd_unlock_config(host);
1551
1552        /*
1553         * Reset the chip.
1554         */
1555        wbsd_write_config(host, WBSD_CONF_SWRST, 1);
1556        wbsd_write_config(host, WBSD_CONF_SWRST, 0);
1557
1558        /*
1559         * Select SD/MMC function.
1560         */
1561        wbsd_write_config(host, WBSD_CONF_DEVICE, DEVICE_SD);
1562
1563        /*
1564         * Set up card detection.
1565         */
1566        wbsd_write_config(host, WBSD_CONF_PINS, WBSD_PINS_DETECT_GP11);
1567
1568        /*
1569         * Configure chip
1570         */
1571        wbsd_write_config(host, WBSD_CONF_PORT_HI, host->base >> 8);
1572        wbsd_write_config(host, WBSD_CONF_PORT_LO, host->base & 0xff);
1573
1574        wbsd_write_config(host, WBSD_CONF_IRQ, host->irq);
1575
1576        if (host->dma >= 0)
1577                wbsd_write_config(host, WBSD_CONF_DRQ, host->dma);
1578
1579        /*
1580         * Enable and power up chip.
1581         */
1582        wbsd_write_config(host, WBSD_CONF_ENABLE, 1);
1583        wbsd_write_config(host, WBSD_CONF_POWER, 0x20);
1584
1585        wbsd_lock_config(host);
1586}
1587
1588/*
1589 * Check that configured resources are correct.
1590 */
1591
1592static int wbsd_chip_validate(struct wbsd_host *host)
1593{
1594        int base, irq, dma;
1595
1596        wbsd_unlock_config(host);
1597
1598        /*
1599         * Select SD/MMC function.
1600         */
1601        wbsd_write_config(host, WBSD_CONF_DEVICE, DEVICE_SD);
1602
1603        /*
1604         * Read configuration.
1605         */
1606        base = wbsd_read_config(host, WBSD_CONF_PORT_HI) << 8;
1607        base |= wbsd_read_config(host, WBSD_CONF_PORT_LO);
1608
1609        irq = wbsd_read_config(host, WBSD_CONF_IRQ);
1610
1611        dma = wbsd_read_config(host, WBSD_CONF_DRQ);
1612
1613        wbsd_lock_config(host);
1614
1615        /*
1616         * Validate against given configuration.
1617         */
1618        if (base != host->base)
1619                return 0;
1620        if (irq != host->irq)
1621                return 0;
1622        if ((dma != host->dma) && (host->dma != -1))
1623                return 0;
1624
1625        return 1;
1626}
1627
1628/*
1629 * Powers down the SD function
1630 */
1631
1632static void wbsd_chip_poweroff(struct wbsd_host *host)
1633{
1634        wbsd_unlock_config(host);
1635
1636        wbsd_write_config(host, WBSD_CONF_DEVICE, DEVICE_SD);
1637        wbsd_write_config(host, WBSD_CONF_ENABLE, 0);
1638
1639        wbsd_lock_config(host);
1640}
1641
1642/*****************************************************************************\
1643 *                                                                           *
1644 * Devices setup and shutdown                                                *
1645 *                                                                           *
1646\*****************************************************************************/
1647
1648static int wbsd_init(struct device *dev, int base, int irq, int dma,
1649        int pnp)
1650{
1651        struct wbsd_host *host = NULL;
1652        struct mmc_host *mmc = NULL;
1653        int ret;
1654
1655        ret = wbsd_alloc_mmc(dev);
1656        if (ret)
1657                return ret;
1658
1659        mmc = dev_get_drvdata(dev);
1660        host = mmc_priv(mmc);
1661
1662        /*
1663         * Scan for hardware.
1664         */
1665        ret = wbsd_scan(host);
1666        if (ret) {
1667                if (pnp && (ret == -ENODEV)) {
1668                        pr_warn(DRIVER_NAME ": Unable to confirm device presence - you may experience lock-ups\n");
1669                } else {
1670                        wbsd_free_mmc(dev);
1671                        return ret;
1672                }
1673        }
1674
1675        /*
1676         * Request resources.
1677         */
1678        ret = wbsd_request_resources(host, base, irq, dma);
1679        if (ret) {
1680                wbsd_release_resources(host);
1681                wbsd_free_mmc(dev);
1682                return ret;
1683        }
1684
1685        /*
1686         * See if chip needs to be configured.
1687         */
1688        if (pnp) {
1689                if ((host->config != 0) && !wbsd_chip_validate(host)) {
1690                        pr_warn(DRIVER_NAME ": PnP active but chip not configured! You probably have a buggy BIOS. Configuring chip manually.\n");
1691                        wbsd_chip_config(host);
1692                }
1693        } else
1694                wbsd_chip_config(host);
1695
1696        /*
1697         * Power Management stuff. No idea how this works.
1698         * Not tested.
1699         */
1700#ifdef CONFIG_PM
1701        if (host->config) {
1702                wbsd_unlock_config(host);
1703                wbsd_write_config(host, WBSD_CONF_PME, 0xA0);
1704                wbsd_lock_config(host);
1705        }
1706#endif
1707        /*
1708         * Allow device to initialise itself properly.
1709         */
1710        mdelay(5);
1711
1712        /*
1713         * Reset the chip into a known state.
1714         */
1715        wbsd_init_device(host);
1716
1717        mmc_add_host(mmc);
1718
1719        pr_info("%s: W83L51xD", mmc_hostname(mmc));
1720        if (host->chip_id != 0)
1721                printk(" id %x", (int)host->chip_id);
1722        printk(" at 0x%x irq %d", (int)host->base, (int)host->irq);
1723        if (host->dma >= 0)
1724                printk(" dma %d", (int)host->dma);
1725        else
1726                printk(" FIFO");
1727        if (pnp)
1728                printk(" PnP");
1729        printk("\n");
1730
1731        return 0;
1732}
1733
1734static void wbsd_shutdown(struct device *dev, int pnp)
1735{
1736        struct mmc_host *mmc = dev_get_drvdata(dev);
1737        struct wbsd_host *host;
1738
1739        if (!mmc)
1740                return;
1741
1742        host = mmc_priv(mmc);
1743
1744        mmc_remove_host(mmc);
1745
1746        /*
1747         * Power down the SD/MMC function.
1748         */
1749        if (!pnp)
1750                wbsd_chip_poweroff(host);
1751
1752        wbsd_release_resources(host);
1753
1754        wbsd_free_mmc(dev);
1755}
1756
1757/*
1758 * Non-PnP
1759 */
1760
1761static int wbsd_probe(struct platform_device *dev)
1762{
1763        /* Use the module parameters for resources */
1764        return wbsd_init(&dev->dev, param_io, param_irq, param_dma, 0);
1765}
1766
1767static int wbsd_remove(struct platform_device *dev)
1768{
1769        wbsd_shutdown(&dev->dev, 0);
1770
1771        return 0;
1772}
1773
1774/*
1775 * PnP
1776 */
1777
1778#ifdef CONFIG_PNP
1779
1780static int
1781wbsd_pnp_probe(struct pnp_dev *pnpdev, const struct pnp_device_id *dev_id)
1782{
1783        int io, irq, dma;
1784
1785        /*
1786         * Get resources from PnP layer.
1787         */
1788        io = pnp_port_start(pnpdev, 0);
1789        irq = pnp_irq(pnpdev, 0);
1790        if (pnp_dma_valid(pnpdev, 0))
1791                dma = pnp_dma(pnpdev, 0);
1792        else
1793                dma = -1;
1794
1795        DBGF("PnP resources: port %3x irq %d dma %d\n", io, irq, dma);
1796
1797        return wbsd_init(&pnpdev->dev, io, irq, dma, 1);
1798}
1799
1800static void wbsd_pnp_remove(struct pnp_dev *dev)
1801{
1802        wbsd_shutdown(&dev->dev, 1);
1803}
1804
1805#endif /* CONFIG_PNP */
1806
1807/*
1808 * Power management
1809 */
1810
1811#ifdef CONFIG_PM
1812
1813static int wbsd_platform_suspend(struct platform_device *dev,
1814                                 pm_message_t state)
1815{
1816        struct mmc_host *mmc = platform_get_drvdata(dev);
1817        struct wbsd_host *host;
1818
1819        if (mmc == NULL)
1820                return 0;
1821
1822        DBGF("Suspending...\n");
1823
1824        host = mmc_priv(mmc);
1825
1826        wbsd_chip_poweroff(host);
1827        return 0;
1828}
1829
1830static int wbsd_platform_resume(struct platform_device *dev)
1831{
1832        struct mmc_host *mmc = platform_get_drvdata(dev);
1833        struct wbsd_host *host;
1834
1835        if (mmc == NULL)
1836                return 0;
1837
1838        DBGF("Resuming...\n");
1839
1840        host = mmc_priv(mmc);
1841
1842        wbsd_chip_config(host);
1843
1844        /*
1845         * Allow device to initialise itself properly.
1846         */
1847        mdelay(5);
1848
1849        wbsd_init_device(host);
1850        return 0;
1851}
1852
1853#ifdef CONFIG_PNP
1854
1855static int wbsd_pnp_suspend(struct pnp_dev *pnp_dev, pm_message_t state)
1856{
1857        struct mmc_host *mmc = dev_get_drvdata(&pnp_dev->dev);
1858
1859        if (mmc == NULL)
1860                return 0;
1861
1862        DBGF("Suspending...\n");
1863        return 0;
1864}
1865
1866static int wbsd_pnp_resume(struct pnp_dev *pnp_dev)
1867{
1868        struct mmc_host *mmc = dev_get_drvdata(&pnp_dev->dev);
1869        struct wbsd_host *host;
1870
1871        if (mmc == NULL)
1872                return 0;
1873
1874        DBGF("Resuming...\n");
1875
1876        host = mmc_priv(mmc);
1877
1878        /*
1879         * See if chip needs to be configured.
1880         */
1881        if (host->config != 0) {
1882                if (!wbsd_chip_validate(host)) {
1883                        pr_warn(DRIVER_NAME ": PnP active but chip not configured! You probably have a buggy BIOS. Configuring chip manually.\n");
1884                        wbsd_chip_config(host);
1885                }
1886        }
1887
1888        /*
1889         * Allow device to initialise itself properly.
1890         */
1891        mdelay(5);
1892
1893        wbsd_init_device(host);
1894        return 0;
1895}
1896
1897#endif /* CONFIG_PNP */
1898
1899#else /* CONFIG_PM */
1900
1901#define wbsd_platform_suspend NULL
1902#define wbsd_platform_resume NULL
1903
1904#define wbsd_pnp_suspend NULL
1905#define wbsd_pnp_resume NULL
1906
1907#endif /* CONFIG_PM */
1908
1909static struct platform_device *wbsd_device;
1910
1911static struct platform_driver wbsd_driver = {
1912        .probe          = wbsd_probe,
1913        .remove         = wbsd_remove,
1914
1915        .suspend        = wbsd_platform_suspend,
1916        .resume         = wbsd_platform_resume,
1917        .driver         = {
1918                .name   = DRIVER_NAME,
1919        },
1920};
1921
1922#ifdef CONFIG_PNP
1923
1924static struct pnp_driver wbsd_pnp_driver = {
1925        .name           = DRIVER_NAME,
1926        .id_table       = pnp_dev_table,
1927        .probe          = wbsd_pnp_probe,
1928        .remove         = wbsd_pnp_remove,
1929
1930        .suspend        = wbsd_pnp_suspend,
1931        .resume         = wbsd_pnp_resume,
1932};
1933
1934#endif /* CONFIG_PNP */
1935
1936/*
1937 * Module loading/unloading
1938 */
1939
1940static int __init wbsd_drv_init(void)
1941{
1942        int result;
1943
1944        pr_info(DRIVER_NAME
1945                ": Winbond W83L51xD SD/MMC card interface driver\n");
1946        pr_info(DRIVER_NAME ": Copyright(c) Pierre Ossman\n");
1947
1948#ifdef CONFIG_PNP
1949
1950        if (!param_nopnp) {
1951                result = pnp_register_driver(&wbsd_pnp_driver);
1952                if (result < 0)
1953                        return result;
1954        }
1955#endif /* CONFIG_PNP */
1956
1957        if (param_nopnp) {
1958                result = platform_driver_register(&wbsd_driver);
1959                if (result < 0)
1960                        return result;
1961
1962                wbsd_device = platform_device_alloc(DRIVER_NAME, -1);
1963                if (!wbsd_device) {
1964                        platform_driver_unregister(&wbsd_driver);
1965                        return -ENOMEM;
1966                }
1967
1968                result = platform_device_add(wbsd_device);
1969                if (result) {
1970                        platform_device_put(wbsd_device);
1971                        platform_driver_unregister(&wbsd_driver);
1972                        return result;
1973                }
1974        }
1975
1976        return 0;
1977}
1978
1979static void __exit wbsd_drv_exit(void)
1980{
1981#ifdef CONFIG_PNP
1982
1983        if (!param_nopnp)
1984                pnp_unregister_driver(&wbsd_pnp_driver);
1985
1986#endif /* CONFIG_PNP */
1987
1988        if (param_nopnp) {
1989                platform_device_unregister(wbsd_device);
1990
1991                platform_driver_unregister(&wbsd_driver);
1992        }
1993
1994        DBG("unloaded\n");
1995}
1996
1997module_init(wbsd_drv_init);
1998module_exit(wbsd_drv_exit);
1999#ifdef CONFIG_PNP
2000module_param_hw_named(nopnp, param_nopnp, uint, other, 0444);
2001#endif
2002module_param_hw_named(io, param_io, uint, ioport, 0444);
2003module_param_hw_named(irq, param_irq, uint, irq, 0444);
2004module_param_hw_named(dma, param_dma, int, dma, 0444);
2005
2006MODULE_LICENSE("GPL");
2007MODULE_AUTHOR("Pierre Ossman <pierre@ossman.eu>");
2008MODULE_DESCRIPTION("Winbond W83L51xD SD/MMC card interface driver");
2009
2010#ifdef CONFIG_PNP
2011MODULE_PARM_DESC(nopnp, "Scan for device instead of relying on PNP. (default 0)");
2012#endif
2013MODULE_PARM_DESC(io, "I/O base to allocate. Must be 8 byte aligned. (default 0x248)");
2014MODULE_PARM_DESC(irq, "IRQ to allocate. (default 6)");
2015MODULE_PARM_DESC(dma, "DMA channel to allocate. -1 for no DMA. (default 2)");
2016