The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/arm/ti/ti_mmchs.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*-
    2  * Copyright (c) 2011
    3  *      Ben Gray <ben.r.gray@gmail.com>.
    4  * All rights reserved.
    5  *
    6  * Redistribution and use in source and binary forms, with or without
    7  * modification, are permitted provided that the following conditions
    8  * are met:
    9  * 1. Redistributions of source code must retain the above copyright
   10  *    notice, this list of conditions and the following disclaimer.
   11  * 2. Redistributions in binary form must reproduce the above copyright
   12  *    notice, this list of conditions and the following disclaimer in the
   13  *    documentation and/or other materials provided with the distribution.
   14  *
   15  * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   16  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   17  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   18  * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
   19  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   20  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   21  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   22  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   23  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   24  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   25  * SUCH DAMAGE.
   26  */
   27 
   28 /**
   29  * Driver for the MMC/SD/SDIO module on the TI OMAP series of SoCs.
   30  *
   31  * This driver is heavily based on the SD/MMC driver for the AT91 (at91_mci.c).
   32  *
   33  * It's important to realise that the MMC state machine is already in the kernel
   34  * and this driver only exposes the specific interfaces of the controller.
   35  *
   36  * This driver is still very much a work in progress, I've verified that basic
   37  * sector reading can be performed. But I've yet to test it with a file system
   38  * or even writing.  In addition I've only tested the driver with an SD card,
   39  * I've no idea if MMC cards work.
   40  *
   41  */
   42 #include <sys/cdefs.h>
   43 __FBSDID("$FreeBSD: releng/10.0/sys/arm/ti/ti_mmchs.c 253053 2013-07-09 02:50:05Z rpaulo $");
   44 
   45 #include <sys/param.h>
   46 #include <sys/systm.h>
   47 #include <sys/bio.h>
   48 #include <sys/bus.h>
   49 #include <sys/conf.h>
   50 #include <sys/endian.h>
   51 #include <sys/kernel.h>
   52 #include <sys/kthread.h>
   53 #include <sys/lock.h>
   54 #include <sys/malloc.h>
   55 #include <sys/module.h>
   56 #include <sys/mutex.h>
   57 #include <sys/queue.h>
   58 #include <sys/resource.h>
   59 #include <sys/rman.h>
   60 #include <sys/time.h>
   61 #include <sys/timetc.h>
   62 #include <sys/gpio.h>
   63 
   64 #include <machine/bus.h>
   65 #include <machine/cpu.h>
   66 #include <machine/cpufunc.h>
   67 #include <machine/resource.h>
   68 #include <machine/frame.h>
   69 #include <machine/intr.h>
   70 
   71 #include <dev/mmc/bridge.h>
   72 #include <dev/mmc/mmcreg.h>
   73 #include <dev/mmc/mmcbrvar.h>
   74 
   75 #include <dev/fdt/fdt_common.h>
   76 #include <dev/ofw/openfirm.h>
   77 #include <dev/ofw/ofw_bus.h>
   78 #include <dev/ofw/ofw_bus_subr.h>
   79 
   80 #include "gpio_if.h"
   81 
   82 #include "mmcbr_if.h"
   83 #include "mmcbus_if.h"
   84 
   85 #include <arm/ti/ti_sdma.h>
   86 #include <arm/ti/ti_edma3.h>
   87 #include <arm/ti/ti_mmchs.h>
   88 #include <arm/ti/ti_cpuid.h>
   89 #include <arm/ti/ti_prcm.h>
   90 
   91 #include <arm/ti/twl/twl.h>
   92 #include <arm/ti/twl/twl_vreg.h>
   93 
   94 #ifdef DEBUG
   95 #define ti_mmchs_dbg(sc, fmt, args...) \
   96         device_printf((sc)->sc_dev, fmt, ## args);
   97 #else
   98 #define ti_mmchs_dbg(sc, fmt, args...)
   99 #endif
  100 
  101 /**
  102  *      Structure that stores the driver context
  103  */
  104 struct ti_mmchs_softc {
  105         device_t                sc_dev;
  106         uint32_t                device_id;
  107         struct resource*        sc_irq_res;
  108         struct resource*        sc_mem_res;
  109 
  110         void*                   sc_irq_h;
  111 
  112         bus_dma_tag_t           sc_dmatag;
  113         bus_dmamap_t            sc_dmamap;
  114         int                     sc_dmamapped;
  115 
  116         unsigned int            sc_dmach_rd;
  117         unsigned int            sc_dmach_wr;
  118         int                     dma_rx_trig;
  119         int                     dma_tx_trig;
  120 
  121         device_t                sc_gpio_dev;
  122         int                     sc_wp_gpio_pin;  /* GPIO pin for MMC write protect */
  123 
  124         device_t                sc_vreg_dev;
  125         const char*             sc_vreg_name;
  126 
  127         struct mtx              sc_mtx;
  128 
  129         struct mmc_host         host;
  130         struct mmc_request*     req;
  131         struct mmc_command*     curcmd;
  132 
  133         int                     flags;
  134 #define CMD_STARTED     1
  135 #define STOP_STARTED    2
  136 
  137         int                     bus_busy;  /* TODO: Needed ? */
  138 
  139         void*                   sc_cmd_data_vaddr;
  140         int                     sc_cmd_data_len;
  141 
  142         /* The offset applied to each of the register base addresses, OMAP4
  143          * register sets are offset 0x100 from the OMAP3 series.
  144          */
  145         unsigned long           sc_reg_off;
  146 
  147         /* The physical address of the MMCHS_DATA register, used for the DMA xfers */
  148         unsigned long           sc_data_reg_paddr;
  149 
  150         /* The reference clock frequency */
  151         unsigned int            sc_ref_freq;
  152 
  153         enum mmc_power_mode     sc_cur_power_mode;
  154 };
  155 
  156 /**
  157  *      Macros for driver mutex locking
  158  */
  159 #define TI_MMCHS_LOCK(_sc)              mtx_lock(&(_sc)->sc_mtx)
  160 #define TI_MMCHS_UNLOCK(_sc)            mtx_unlock(&(_sc)->sc_mtx)
  161 #define TI_MMCHS_LOCK_INIT(_sc) \
  162         mtx_init(&_sc->sc_mtx, device_get_nameunit(_sc->sc_dev), \
  163                  "ti_mmchs", MTX_DEF)
  164 #define TI_MMCHS_LOCK_DESTROY(_sc)      mtx_destroy(&_sc->sc_mtx);
  165 #define TI_MMCHS_ASSERT_LOCKED(_sc)     mtx_assert(&_sc->sc_mtx, MA_OWNED);
  166 #define TI_MMCHS_ASSERT_UNLOCKED(_sc)   mtx_assert(&_sc->sc_mtx, MA_NOTOWNED);
  167 
  168 static void ti_mmchs_start(struct ti_mmchs_softc *sc);
  169 
  170 /**
  171  *      ti_mmchs_read_4 - reads a 32-bit value from a register
  172  *      ti_mmchs_write_4 - writes a 32-bit value to a register
  173  *      @sc: pointer to the driver context
  174  *      @off: register offset to read from
  175  *      @val: the value to write into the register
  176  *
  177  *      LOCKING:
  178  *      None
  179  *
  180  *      RETURNS:
  181  *      The 32-bit value read from the register
  182  */
  183 static inline uint32_t
  184 ti_mmchs_read_4(struct ti_mmchs_softc *sc, bus_size_t off)
  185 {
  186         return bus_read_4(sc->sc_mem_res, (sc->sc_reg_off + off));
  187 }
  188 
  189 static inline void
  190 ti_mmchs_write_4(struct ti_mmchs_softc *sc, bus_size_t off, uint32_t val)
  191 {
  192         bus_write_4(sc->sc_mem_res, (sc->sc_reg_off + off), val);
  193 }
  194 
  195 /**
  196  *      ti_mmchs_reset_controller -
  197  *      @arg: caller supplied arg
  198  *      @segs: array of segments (although in our case should only be one)
  199  *      @nsegs: number of segments (in our case should be 1)
  200  *      @error:
  201  *
  202  *
  203  *
  204  */
  205 static void
  206 ti_mmchs_reset_controller(struct ti_mmchs_softc *sc, uint32_t bit)
  207 {
  208         unsigned long attempts;
  209         uint32_t sysctl;
  210 
  211         ti_mmchs_dbg(sc, "reseting controller - bit 0x%08x\n", bit);
  212 
  213         sysctl = ti_mmchs_read_4(sc, MMCHS_SYSCTL);
  214         ti_mmchs_write_4(sc, MMCHS_SYSCTL, sysctl | bit);
  215         /* 
  216          * AM335x and OMAP4 >= ES2 have an updated reset logic.
  217          * Monitor a 0->1 transition first.
  218          */
  219         if ((ti_chip() == CHIP_AM335X) || 
  220             ((ti_chip() == CHIP_OMAP_4) && (ti_revision() > OMAP4430_REV_ES1_0))) {
  221                 attempts = 10000;
  222                 while (!(ti_mmchs_read_4(sc, MMCHS_SYSCTL) & bit) && (attempts-- > 0))
  223                         continue;
  224         }
  225 
  226         attempts = 10000;
  227         while ((ti_mmchs_read_4(sc, MMCHS_SYSCTL) & bit) && (attempts-- > 0))
  228                 continue;
  229 
  230         if (ti_mmchs_read_4(sc, MMCHS_SYSCTL) & bit)
  231                 device_printf(sc->sc_dev, "Error - Timeout waiting on controller reset\n");
  232 }
  233 
  234 /**
  235  *      ti_mmchs_getaddr - called by the DMA function to simply return the phys addr
  236  *      @arg: caller supplied arg
  237  *      @segs: array of segments (although in our case should only be one)
  238  *      @nsegs: number of segments (in our case should be 1)
  239  *      @error:
  240  *
  241  *      This function is called by bus_dmamap_load() after it has compiled an array
  242  *      of segments, each segment is a phsyical chunk of memory. However in our case
  243  *      we should only have one segment, because we don't (yet?) support DMA scatter
  244  *      gather. To ensure we only have one segment, the DMA tag was created by
  245  *      bus_dma_tag_create() (called from ti_mmchs_attach) with nsegments set to 1.
  246  *
  247  */
  248 static void
  249 ti_mmchs_getaddr(void *arg, bus_dma_segment_t *segs, int nsegs, int error)
  250 {
  251         if (error != 0)
  252                 return;
  253 
  254         *(bus_addr_t *)arg = segs[0].ds_addr;
  255 }
  256 
  257 #ifndef SOC_TI_AM335X
  258 /**
  259  *      ti_mmchs_dma_intr - interrupt handler for DMA events triggered by the controller
  260  *      @ch: the dma channel number
  261  *      @status: bit field of the status bytes
  262  *      @data: callback data, in this case a pointer to the controller struct
  263  *
  264  *
  265  *      LOCKING:
  266  *      Called from interrupt context
  267  *
  268  */
  269 static void
  270 ti_mmchs_dma_intr(unsigned int ch, uint32_t status, void *data)
  271 {
  272         /* Ignore for now ... we don't need this interrupt as we already have the
  273          * interrupt from the MMC controller.
  274          */
  275 }
  276 #endif
  277 
  278 /**
  279  *      ti_mmchs_intr_xfer_compl - called if a 'transfer complete' IRQ was received
  280  *      @sc: pointer to the driver context
  281  *      @cmd: the command that was sent previously
  282  *
  283  *      This function is simply responsible for syncing up the DMA buffer.
  284  *
  285  *      LOCKING:
  286  *      Called from interrupt context
  287  *
  288  *      RETURNS:
  289  *      Return value indicates if the transaction is complete, not done = 0, done != 0
  290  */
  291 static int
  292 ti_mmchs_intr_xfer_compl(struct ti_mmchs_softc *sc, struct mmc_command *cmd)
  293 {
  294         uint32_t cmd_reg;
  295 
  296         /* Read command register to test whether this command was a read or write. */
  297         cmd_reg = ti_mmchs_read_4(sc, MMCHS_CMD);
  298 
  299         /* Sync-up the DMA buffer so the caller can access the new memory */
  300         if (cmd_reg & MMCHS_CMD_DDIR) {
  301                 bus_dmamap_sync(sc->sc_dmatag, sc->sc_dmamap, BUS_DMASYNC_POSTREAD);
  302                 bus_dmamap_unload(sc->sc_dmatag, sc->sc_dmamap);
  303         }
  304         else {
  305                 bus_dmamap_sync(sc->sc_dmatag, sc->sc_dmamap, BUS_DMASYNC_POSTWRITE);
  306                 bus_dmamap_unload(sc->sc_dmatag, sc->sc_dmamap);
  307         }
  308         sc->sc_dmamapped--;
  309 
  310         /* Debugging dump of the data received */
  311 #if 0
  312         {
  313                 int i;
  314                 uint8_t *p = (uint8_t*) sc->sc_cmd_data_vaddr;
  315                 for (i=0; i<sc->sc_cmd_data_len; i++) {
  316                         if ((i % 16) == 0)
  317                                 printf("\n0x%04x : ", i);
  318                         printf("%02X ", *p++);
  319                 }
  320                 printf("\n");
  321         }
  322 #endif
  323 
  324         /* We are done, transfer complete */
  325         return 1;
  326 }
  327 
  328 /**
  329  *      ti_mmchs_intr_cmd_compl - called if a 'command complete' IRQ was received
  330  *      @sc: pointer to the driver context
  331  *      @cmd: the command that was sent previously
  332  *
  333  *
  334  *      LOCKING:
  335  *      Called from interrupt context
  336  *
  337  *      RETURNS:
  338  *      Return value indicates if the transaction is complete, not done = 0, done != 0
  339  */
  340 static int
  341 ti_mmchs_intr_cmd_compl(struct ti_mmchs_softc *sc, struct mmc_command *cmd)
  342 {
  343         uint32_t cmd_reg;
  344 
  345         /* Copy the response into the request struct ... if a response was
  346          * expected */
  347         if (cmd != NULL && (cmd->flags & MMC_RSP_PRESENT)) {
  348                 if (cmd->flags & MMC_RSP_136) {
  349                         cmd->resp[3] = ti_mmchs_read_4(sc, MMCHS_RSP10);
  350                         cmd->resp[2] = ti_mmchs_read_4(sc, MMCHS_RSP32);
  351                         cmd->resp[1] = ti_mmchs_read_4(sc, MMCHS_RSP54);
  352                         cmd->resp[0] = ti_mmchs_read_4(sc, MMCHS_RSP76);
  353                 } else {
  354                         cmd->resp[0] = ti_mmchs_read_4(sc, MMCHS_RSP10);
  355                 }
  356         }
  357 
  358         /* Check if the command was expecting some data transfer, if not
  359          * we are done. */
  360         cmd_reg = ti_mmchs_read_4(sc, MMCHS_CMD);
  361         return ((cmd_reg & MMCHS_CMD_DP) == 0);
  362 }
  363 
  364 /**
  365  *      ti_mmchs_intr_error - handles error interrupts
  366  *      @sc: pointer to the driver context
  367  *      @cmd: the command that was sent previously
  368  *      @stat_reg: the value that was in the status register
  369  *
  370  *
  371  *      LOCKING:
  372  *      Called from interrupt context
  373  *
  374  *      RETURNS:
  375  *      Return value indicates if the transaction is complete, not done = 0, done != 0
  376  */
  377 static int
  378 ti_mmchs_intr_error(struct ti_mmchs_softc *sc, struct mmc_command *cmd,
  379                                          uint32_t stat_reg)
  380 {
  381         ti_mmchs_dbg(sc, "error in xfer - stat 0x%08x\n", stat_reg);
  382 
  383         /* Ignore CRC errors on CMD2 and ACMD47, per relevant standards */
  384         if ((stat_reg & MMCHS_STAT_CCRC) && (cmd->opcode == MMC_SEND_OP_COND ||
  385             cmd->opcode == ACMD_SD_SEND_OP_COND))
  386                 cmd->error = MMC_ERR_NONE;
  387         else if (stat_reg & (MMCHS_STAT_CTO | MMCHS_STAT_DTO))
  388                 cmd->error = MMC_ERR_TIMEOUT;
  389         else if (stat_reg & (MMCHS_STAT_CCRC | MMCHS_STAT_DCRC))
  390                 cmd->error = MMC_ERR_BADCRC;
  391         else
  392                 cmd->error = MMC_ERR_FAILED;
  393 
  394         /* If a dma transaction we should also stop the dma transfer */
  395         if (ti_mmchs_read_4(sc, MMCHS_CMD) & MMCHS_CMD_DE) {
  396 
  397                 /* Abort the DMA transfer (DDIR bit tells direction) */
  398                 if (ti_mmchs_read_4(sc, MMCHS_CMD) & MMCHS_CMD_DDIR)
  399 #ifdef SOC_TI_AM335X
  400                         printf("%s: DMA unimplemented\n", __func__);
  401 #else
  402                         ti_sdma_stop_xfer(sc->sc_dmach_rd);
  403 #endif
  404                 else
  405 #ifdef SOC_TI_AM335X
  406                         printf("%s: DMA unimplemented\n", __func__);
  407 #else
  408                         ti_sdma_stop_xfer(sc->sc_dmach_wr);
  409 #endif
  410 
  411                 /* If an error occure abort the DMA operation and free the dma map */
  412                 if ((sc->sc_dmamapped > 0) && (cmd->error != MMC_ERR_NONE)) {
  413                         bus_dmamap_unload(sc->sc_dmatag, sc->sc_dmamap);
  414                         sc->sc_dmamapped--;
  415                 }
  416         }
  417 
  418         /* Command error occured? ... if so issue a soft reset for the cmd fsm */
  419         if (stat_reg & (MMCHS_STAT_CCRC | MMCHS_STAT_CTO)) {
  420                 ti_mmchs_reset_controller(sc, MMCHS_SYSCTL_SRC);
  421         }
  422 
  423         /* Data error occured? ... if so issue a soft reset for the data line */
  424         if (stat_reg & (MMCHS_STAT_DEB | MMCHS_STAT_DCRC | MMCHS_STAT_DTO)) {
  425                 ti_mmchs_reset_controller(sc, MMCHS_SYSCTL_SRD);
  426         }
  427 
  428         /* On any error the command is cancelled ... so we are done */
  429         return 1;
  430 }
  431 
  432 /**
  433  *      ti_mmchs_intr - interrupt handler for MMC/SD/SDIO controller
  434  *      @arg: pointer to the driver context
  435  *
  436  *      Interrupt handler for the MMC/SD/SDIO controller, responsible for handling
  437  *      the IRQ and clearing the status flags.
  438  *
  439  *      LOCKING:
  440  *      Called from interrupt context
  441  *
  442  *      RETURNS:
  443  *      nothing
  444  */
  445 static void
  446 ti_mmchs_intr(void *arg)
  447 {
  448         struct ti_mmchs_softc *sc = (struct ti_mmchs_softc *) arg;
  449         uint32_t stat_reg;
  450         int done = 0;
  451 
  452         TI_MMCHS_LOCK(sc);
  453 
  454         stat_reg = ti_mmchs_read_4(sc, MMCHS_STAT) & (ti_mmchs_read_4(sc,
  455             MMCHS_IE) | MMCHS_STAT_ERRI);
  456 
  457         if (sc->curcmd == NULL) {
  458                 device_printf(sc->sc_dev, "Error: current cmd NULL, already done?\n");
  459                 ti_mmchs_write_4(sc, MMCHS_STAT, stat_reg);
  460                 TI_MMCHS_UNLOCK(sc);
  461                 return;
  462         }
  463 
  464         if (stat_reg & MMCHS_STAT_ERRI) {
  465                 /* An error has been tripped in the status register */
  466                 done = ti_mmchs_intr_error(sc, sc->curcmd, stat_reg);
  467 
  468         } else {
  469 
  470                 /* NOTE: This implementation could be a bit inefficent, I don't think
  471                  * it is necessary to handle both the 'command complete' and 'transfer
  472                  * complete' for data transfers ... presumably just transfer complete
  473                  * is enough.
  474                  */
  475 
  476                 /* No error */
  477                 sc->curcmd->error = MMC_ERR_NONE;
  478 
  479                 /* Check if the command completed */
  480                 if (stat_reg & MMCHS_STAT_CC) {
  481                         done = ti_mmchs_intr_cmd_compl(sc, sc->curcmd);
  482                 }
  483 
  484                 /* Check if the transfer has completed */
  485                 if (stat_reg & MMCHS_STAT_TC) {
  486                         done = ti_mmchs_intr_xfer_compl(sc, sc->curcmd);
  487                 }
  488 
  489         }
  490 
  491         /* Clear all the interrupt status bits by writing the value back */
  492         ti_mmchs_write_4(sc, MMCHS_STAT, stat_reg);
  493 
  494         /* This may mark the command as done if there is no stop request */
  495         /* TODO: This is a bit ugly, needs fix-up */
  496         if (done) {
  497                 ti_mmchs_start(sc);
  498         }
  499 
  500         TI_MMCHS_UNLOCK(sc);
  501 }
  502 
  503 #ifdef SOC_TI_AM335X
  504 static void
  505 ti_mmchs_edma3_rx_xfer_setup(struct ti_mmchs_softc *sc, uint32_t src_paddr,
  506     uint32_t dst_paddr, uint16_t blk_size, uint16_t num_blks)
  507 {
  508         struct ti_edma3cc_param_set ps;
  509 
  510         bzero(&ps, sizeof(struct ti_edma3cc_param_set));
  511         ps.src          = src_paddr;
  512         ps.dst          = dst_paddr;
  513         ps.dstbidx      = 4;
  514         ps.dstcidx      = blk_size;
  515         ps.acnt         = 4;
  516         ps.bcnt         = blk_size/4;
  517         ps.ccnt         = num_blks;
  518         ps.link         = 0xffff;
  519         ps.opt.tcc      = sc->dma_rx_trig;
  520         ps.opt.tcinten  = 1;
  521         ps.opt.fwid     = 2; /* fifo width is 32 */
  522         ps.opt.sam      = 1;
  523         ps.opt.syncdim  = 1;
  524 
  525         ti_edma3_param_write(sc->dma_rx_trig, &ps);
  526         ti_edma3_enable_transfer_event(sc->dma_rx_trig);
  527 }
  528 
  529 static void
  530 ti_mmchs_edma3_tx_xfer_setup(struct ti_mmchs_softc *sc, uint32_t src_paddr,
  531     uint32_t dst_paddr, uint16_t blk_size, uint16_t num_blks)
  532 {
  533         struct ti_edma3cc_param_set ps;
  534 
  535         bzero(&ps, sizeof(struct ti_edma3cc_param_set));
  536         ps.src          = src_paddr;
  537         ps.dst          = dst_paddr;
  538         ps.srccidx      = blk_size;
  539         ps.bcnt         = blk_size/4;
  540         ps.ccnt         = num_blks;
  541         ps.srcbidx      = 4;
  542         ps.acnt         = 0x4;
  543         ps.link         = 0xffff;
  544         ps.opt.tcc      = sc->dma_tx_trig;
  545         ps.opt.tcinten  = 1;
  546         ps.opt.fwid     = 2; /* fifo width is 32 */
  547         ps.opt.dam      = 1;
  548         ps.opt.syncdim  = 1;
  549 
  550         ti_edma3_param_write(sc->dma_tx_trig, &ps);
  551         ti_edma3_enable_transfer_event(sc->dma_tx_trig);
  552 }
  553 #endif
  554 
  555 /**
  556  *      ti_mmchs_start_cmd - starts the given command
  557  *      @sc: pointer to the driver context
  558  *      @cmd: the command to start
  559  *
  560  *      The call tree for this function is
  561  *              - ti_mmchs_start_cmd
  562  *                      - ti_mmchs_start
  563  *                              - ti_mmchs_request
  564  *
  565  *      LOCKING:
  566  *      Caller should be holding the OMAP_MMC lock.
  567  *
  568  *      RETURNS:
  569  *      nothing
  570  */
  571 static void
  572 ti_mmchs_start_cmd(struct ti_mmchs_softc *sc, struct mmc_command *cmd)
  573 {
  574         uint32_t cmd_reg, con_reg, ise_reg;
  575         struct mmc_data *data;
  576         struct mmc_request *req;
  577         void *vaddr;
  578         bus_addr_t paddr;
  579 #ifndef SOC_TI_AM335X
  580         uint32_t pktsize;
  581 #endif
  582         sc->curcmd = cmd;
  583         data = cmd->data;
  584         req = cmd->mrq;
  585 
  586         /* Ensure the STR and MIT bits are cleared, these are only used for special
  587          * command types.
  588          */
  589         con_reg = ti_mmchs_read_4(sc, MMCHS_CON);
  590         con_reg &= ~(MMCHS_CON_STR | MMCHS_CON_MIT);
  591 
  592         /* Load the command into bits 29:24 of the CMD register */
  593         cmd_reg = (uint32_t)(cmd->opcode & 0x3F) << 24;
  594 
  595         /* Set the default set of interrupts */
  596         ise_reg = (MMCHS_STAT_CERR | MMCHS_STAT_CTO | MMCHS_STAT_CC | MMCHS_STAT_CEB);
  597 
  598         /* Enable CRC checking if requested */
  599         if (cmd->flags & MMC_RSP_CRC)
  600                 ise_reg |= MMCHS_STAT_CCRC;
  601 
  602         /* Enable reply index checking if the response supports it */
  603         if (cmd->flags & MMC_RSP_OPCODE)
  604                 ise_reg |= MMCHS_STAT_CIE;
  605 
  606         /* Set the expected response length */
  607         if (MMC_RSP(cmd->flags) == MMC_RSP_NONE) {
  608                 cmd_reg |= MMCHS_CMD_RSP_TYPE_NO;
  609         } else {
  610                 if (cmd->flags & MMC_RSP_136)
  611                         cmd_reg |= MMCHS_CMD_RSP_TYPE_136;
  612                 else if (cmd->flags & MMC_RSP_BUSY)
  613                         cmd_reg |= MMCHS_CMD_RSP_TYPE_48_BSY;
  614                 else
  615                         cmd_reg |= MMCHS_CMD_RSP_TYPE_48;
  616 
  617                 /* Enable command index/crc checks if necessary expected */
  618                 if (cmd->flags & MMC_RSP_CRC)
  619                         cmd_reg |= MMCHS_CMD_CCCE;
  620                 if (cmd->flags & MMC_RSP_OPCODE)
  621                         cmd_reg |= MMCHS_CMD_CICE;
  622         }
  623 
  624         /* Set the bits for the special commands CMD12 (MMC_STOP_TRANSMISSION) and
  625          * CMD52 (SD_IO_RW_DIRECT) */
  626         if (cmd->opcode == MMC_STOP_TRANSMISSION)
  627                 cmd_reg |= MMCHS_CMD_CMD_TYPE_IO_ABORT;
  628 
  629         /* Check if there is any data to write */
  630         if (data == NULL) {
  631                 /* Clear the block count */
  632                 ti_mmchs_write_4(sc, MMCHS_BLK, 0);
  633 
  634                 /* The no data case is fairly simple */
  635                 ti_mmchs_write_4(sc, MMCHS_CON, con_reg);
  636                 ti_mmchs_write_4(sc, MMCHS_IE, ise_reg);
  637                 ti_mmchs_write_4(sc, MMCHS_ISE, ise_reg);
  638                 ti_mmchs_write_4(sc, MMCHS_ARG, cmd->arg);
  639                 ti_mmchs_write_4(sc, MMCHS_CMD, cmd_reg);
  640                 return;
  641         }
  642 
  643         /* Indicate that data is present */
  644         cmd_reg |= MMCHS_CMD_DP | MMCHS_CMD_MSBS | MMCHS_CMD_BCE;
  645 
  646         /* Indicate a read operation */
  647         if (data->flags & MMC_DATA_READ)
  648                 cmd_reg |= MMCHS_CMD_DDIR;
  649 
  650         /* Streaming mode */
  651         if (data->flags & MMC_DATA_STREAM) {
  652                 con_reg |= MMCHS_CON_STR;
  653         }
  654 
  655         /* Multi-block mode */
  656         if (data->flags & MMC_DATA_MULTI) {
  657                 cmd_reg |= MMCHS_CMD_MSBS;
  658         }
  659 
  660         /* Enable extra interrupt sources for the transfer */
  661         ise_reg |= (MMCHS_STAT_TC | MMCHS_STAT_DTO | MMCHS_STAT_DEB | MMCHS_STAT_CEB);
  662         if (cmd->flags & MMC_RSP_CRC)
  663                 ise_reg |= MMCHS_STAT_DCRC;
  664 
  665         /* Enable the DMA transfer bit */
  666         cmd_reg |= MMCHS_CMD_DE;
  667 
  668         /* Set the block size and block count */
  669         ti_mmchs_write_4(sc, MMCHS_BLK, (1 << 16) | data->len);
  670 
  671         /* Setup the DMA stuff */
  672         if (data->flags & (MMC_DATA_READ | MMC_DATA_WRITE)) {
  673 
  674                 vaddr = data->data;
  675                 data->xfer_len = 0;
  676 
  677                 /* Map the buffer buf into bus space using the dmamap map. */
  678                 if (bus_dmamap_load(sc->sc_dmatag, sc->sc_dmamap, vaddr, data->len,
  679                     ti_mmchs_getaddr, &paddr, 0) != 0) {
  680 
  681                         if (req->cmd->flags & STOP_STARTED)
  682                                 req->stop->error = MMC_ERR_NO_MEMORY;
  683                         else
  684                                 req->cmd->error = MMC_ERR_NO_MEMORY;
  685                         sc->req = NULL;
  686                         sc->curcmd = NULL;
  687                         req->done(req);
  688                         return;
  689                 }
  690 
  691 #ifndef SOC_TI_AM335X
  692                 /* Calculate the packet size, the max packet size is 512 bytes
  693                  * (or 128 32-bit elements).
  694                  */
  695                 pktsize = min((data->len / 4), (512 / 4));
  696 #endif
  697                 /* Sync the DMA buffer and setup the DMA controller */
  698                 if (data->flags & MMC_DATA_READ) {
  699                         bus_dmamap_sync(sc->sc_dmatag, sc->sc_dmamap, BUS_DMASYNC_PREREAD);
  700 #ifdef SOC_TI_AM335X
  701                         ti_mmchs_edma3_rx_xfer_setup(sc, sc->sc_data_reg_paddr, 
  702                             paddr, data->len, 1);
  703 #else
  704                         ti_sdma_start_xfer_packet(sc->sc_dmach_rd, sc->sc_data_reg_paddr,
  705                             paddr, 1, (data->len / 4), pktsize);
  706 #endif
  707                 } else {
  708                         bus_dmamap_sync(sc->sc_dmatag, sc->sc_dmamap, BUS_DMASYNC_PREWRITE);
  709 #ifdef SOC_TI_AM335X
  710                         ti_mmchs_edma3_tx_xfer_setup(sc, paddr,
  711                             sc->sc_data_reg_paddr, data->len, 1);
  712 #else
  713                         ti_sdma_start_xfer_packet(sc->sc_dmach_wr, paddr,
  714                             sc->sc_data_reg_paddr, 1, (data->len / 4), pktsize);
  715 #endif
  716                 }
  717 
  718                 /* Increase the mapped count */
  719                 sc->sc_dmamapped++;
  720 
  721                 sc->sc_cmd_data_vaddr = vaddr;
  722                 sc->sc_cmd_data_len = data->len;
  723         }
  724 
  725         /* Finally kick off the command */
  726         ti_mmchs_write_4(sc, MMCHS_CON, con_reg);
  727         ti_mmchs_write_4(sc, MMCHS_IE, ise_reg);
  728         ti_mmchs_write_4(sc, MMCHS_ISE, ise_reg);
  729         ti_mmchs_write_4(sc, MMCHS_ARG, cmd->arg);
  730         ti_mmchs_write_4(sc, MMCHS_CMD, cmd_reg);
  731 
  732         /* and we're done */
  733 }
  734 
  735 /**
  736  *      ti_mmchs_start - starts a request stored in the driver context
  737  *      @sc: pointer to the driver context
  738  *
  739  *      This function is called by ti_mmchs_request() in response to a read/write
  740  *      request from the MMC core module.
  741  *
  742  *      LOCKING:
  743  *      Caller should be holding the OMAP_MMC lock.
  744  *
  745  *      RETURNS:
  746  *      nothing
  747  */
  748 static void
  749 ti_mmchs_start(struct ti_mmchs_softc *sc)
  750 {
  751         struct mmc_request *req;
  752 
  753         /* Sanity check we have a request */
  754         req = sc->req;
  755         if (req == NULL)
  756                 return;
  757 
  758         /* assert locked */
  759         if (!(sc->flags & CMD_STARTED)) {
  760                 sc->flags |= CMD_STARTED;
  761                 ti_mmchs_start_cmd(sc, req->cmd);
  762                 return;
  763         }
  764 
  765         if (!(sc->flags & STOP_STARTED) && req->stop) {
  766                 sc->flags |= STOP_STARTED;
  767                 ti_mmchs_start_cmd(sc, req->stop);
  768                 return;
  769         }
  770 
  771         /* We must be done -- bad idea to do this while locked? */
  772         sc->req = NULL;
  773         sc->curcmd = NULL;
  774         req->done(req);
  775 }
  776 
  777 /**
  778  *      ti_mmchs_request - entry point for all read/write/cmd requests
  779  *      @brdev: mmc bridge device handle
  780  *      @reqdev: the device doing the requesting ?
  781  *      @req: the action requested
  782  *
  783  *      LOCKING:
  784  *      None, internally takes the OMAP_MMC lock.
  785  *
  786  *      RETURNS:
  787  *      0 on success
  788  *      EBUSY if the driver is already performing a request
  789  */
  790 static int
  791 ti_mmchs_request(device_t brdev, device_t reqdev, struct mmc_request *req)
  792 {
  793         struct ti_mmchs_softc *sc = device_get_softc(brdev);
  794 
  795         TI_MMCHS_LOCK(sc);
  796 
  797         /*
  798          * XXX do we want to be able to queue up multiple commands?
  799          * XXX sounds like a good idea, but all protocols are sync, so
  800          * XXX maybe the idea is naive...
  801          */
  802         if (sc->req != NULL) {
  803                 TI_MMCHS_UNLOCK(sc);
  804                 return (EBUSY);
  805         }
  806 
  807         /* Store the request and start the command */
  808         sc->req = req;
  809         sc->flags = 0;
  810         ti_mmchs_start(sc);
  811 
  812         TI_MMCHS_UNLOCK(sc);
  813 
  814         return (0);
  815 }
  816 
  817 /**
  818  *      ti_mmchs_get_ro - returns the status of the read-only setting
  819  *      @brdev: mmc bridge device handle
  820  *      @reqdev: device doing the request
  821  *
  822  *      This function is relies on hint'ed values to determine which GPIO is used
  823  *      to determine if the write protect is enabled. On the BeagleBoard the pin
  824  *      is GPIO_23.
  825  *
  826  *      LOCKING:
  827  *      -
  828  *
  829  *      RETURNS:
  830  *      0 if not read-only
  831  *      1 if read only
  832  */
  833 static int
  834 ti_mmchs_get_ro(device_t brdev, device_t reqdev)
  835 {
  836         struct ti_mmchs_softc *sc = device_get_softc(brdev);
  837         unsigned int readonly = 0;
  838 
  839         TI_MMCHS_LOCK(sc);
  840 
  841         if ((sc->sc_wp_gpio_pin != -1) && (sc->sc_gpio_dev != NULL)) {
  842                 if (GPIO_PIN_GET(sc->sc_gpio_dev, sc->sc_wp_gpio_pin, &readonly) != 0)
  843                         readonly = 0;
  844                 else
  845                         readonly = (readonly == 0) ? 0 : 1;
  846         }
  847 
  848         TI_MMCHS_UNLOCK(sc);
  849 
  850         return (readonly);
  851 }
  852 
  853 /**
  854  *      ti_mmchs_send_init_stream - sets bus/controller settings
  855  *      @brdev: mmc bridge device handle
  856  *      @reqdev: device doing the request
  857  *
  858  *      Send init stream sequence to card before sending IDLE command
  859  *
  860  *      LOCKING:
  861  *
  862  *
  863  *      RETURNS:
  864  *      0 if function succeeded
  865  */
  866 static void
  867 ti_mmchs_send_init_stream(struct ti_mmchs_softc *sc)
  868 {
  869         unsigned long timeout;
  870         uint32_t ie, ise, con;
  871 
  872         ti_mmchs_dbg(sc, "Performing init sequence\n");
  873 
  874         /* Prior to issuing any command, the MMCHS controller has to execute a
  875          * special INIT procedure. The MMCHS controller has to generate a clock
  876          * during 1ms. During the INIT procedure, the MMCHS controller generates 80
  877          * clock periods. In order to keep the 1ms gap, the MMCHS controller should
  878          * be configured to generate a clock whose frequency is smaller or equal to
  879          * 80 KHz. If the MMCHS controller divider bitfield width doesn't allow to
  880          * choose big values, the MMCHS controller driver should perform the INIT
  881          * procedure twice or three times. Twice is generally enough.
  882          *
  883          * The INIt procedure is executed by setting MMCHS1.MMCHS_CON[1] INIT
  884          * bitfield to 1 and by sending a dummy command, writing 0x00000000 in
  885          * MMCHS1.MMCHS_CMD register.
  886          */
  887 
  888         /* Disable interrupt status events but enable interrupt generation.
  889          * This doesn't seem right to me, but if the interrupt generation is not
  890          * enabled the CC bit doesn't seem to be set in the STAT register.
  891          */
  892 
  893         /* Enable interrupt generation */
  894         ie = ti_mmchs_read_4(sc, MMCHS_IE);
  895         ti_mmchs_write_4(sc, MMCHS_IE, 0x307F0033);
  896 
  897         /* Disable generation of status events (stops interrupt triggering) */
  898         ise = ti_mmchs_read_4(sc, MMCHS_ISE);
  899         ti_mmchs_write_4(sc, MMCHS_ISE, 0);
  900 
  901         /* Set the initialise stream bit */
  902         con = ti_mmchs_read_4(sc, MMCHS_CON);
  903         con |= MMCHS_CON_INIT;
  904         ti_mmchs_write_4(sc, MMCHS_CON, con);
  905 
  906         /* Write a dummy command 0x00 */
  907         ti_mmchs_write_4(sc, MMCHS_CMD, 0x00000000);
  908 
  909         /* Loop waiting for the command to finish */
  910         timeout = hz;
  911         do {
  912                 pause("MMCINIT", 1);
  913                 if (timeout-- == 0) {
  914                         device_printf(sc->sc_dev, "Error: first stream init timed out\n");
  915                         break;
  916                 }
  917         } while (!(ti_mmchs_read_4(sc, MMCHS_STAT) & MMCHS_STAT_CC));
  918 
  919         /* Clear the command complete status bit */
  920         ti_mmchs_write_4(sc, MMCHS_STAT, MMCHS_STAT_CC);
  921 
  922         /* Write another dummy command 0x00 */
  923         ti_mmchs_write_4(sc, MMCHS_CMD, 0x00000000);
  924 
  925         /* Loop waiting for the second command to finish */
  926         timeout = hz;
  927         do {
  928                 pause("MMCINIT", 1);
  929                 if (timeout-- == 0) {
  930                         device_printf(sc->sc_dev, "Error: second stream init timed out\n");
  931                         break;
  932                 }
  933         } while (!(ti_mmchs_read_4(sc, MMCHS_STAT) & MMCHS_STAT_CC));
  934 
  935         /* Clear the stream init bit */
  936         con &= ~MMCHS_CON_INIT;
  937         ti_mmchs_write_4(sc, MMCHS_CON, con);
  938 
  939         /* Clear the status register, then restore the IE and ISE registers */
  940         ti_mmchs_write_4(sc, MMCHS_STAT, 0xffffffff);
  941         ti_mmchs_read_4(sc, MMCHS_STAT);
  942 
  943         ti_mmchs_write_4(sc, MMCHS_ISE, ise);
  944         ti_mmchs_write_4(sc, MMCHS_IE, ie);
  945 }
  946 
  947 /**
  948  *      ti_mmchs_update_ios - sets bus/controller settings
  949  *      @brdev: mmc bridge device handle
  950  *      @reqdev: device doing the request
  951  *
  952  *      Called to set the bus and controller settings that need to be applied to
  953  *      the actual HW.  Currently this function just sets the bus width and the
  954  *      clock speed.
  955  *
  956  *      LOCKING:
  957  *
  958  *
  959  *      RETURNS:
  960  *      0 if function succeeded
  961  */
  962 static int
  963 ti_mmchs_update_ios(device_t brdev, device_t reqdev)
  964 {
  965         struct ti_mmchs_softc *sc;
  966         struct mmc_host *host;
  967         struct mmc_ios *ios;
  968         uint32_t clkdiv;
  969         uint32_t hctl_reg;
  970         uint32_t con_reg;
  971         uint32_t sysctl_reg;
  972 #ifndef SOC_TI_AM335X
  973         uint16_t mv;
  974 #endif
  975         unsigned long timeout;
  976         int do_card_init = 0;
  977 
  978         sc = device_get_softc(brdev);
  979         host = &sc->host;
  980         ios = &host->ios;
  981 
  982         /* Read the initial values of the registers */
  983         hctl_reg = ti_mmchs_read_4(sc, MMCHS_HCTL);
  984         con_reg = ti_mmchs_read_4(sc, MMCHS_CON);
  985 
  986         /* Set the bus width */
  987         switch (ios->bus_width) {
  988                 case bus_width_1:
  989                         hctl_reg &= ~MMCHS_HCTL_DTW;
  990                         con_reg &= ~MMCHS_CON_DW8;
  991                         break;
  992                 case bus_width_4:
  993                         hctl_reg |= MMCHS_HCTL_DTW;
  994                         con_reg &= ~MMCHS_CON_DW8;
  995                         break;
  996                 case bus_width_8:
  997                         con_reg |= MMCHS_CON_DW8;
  998                         break;
  999         }
 1000 
 1001         /* Finally write all these settings back to the registers */
 1002         ti_mmchs_write_4(sc, MMCHS_HCTL, hctl_reg);
 1003         ti_mmchs_write_4(sc, MMCHS_CON, con_reg);
 1004 
 1005         /* Check if we need to change the external voltage regulator */
 1006         if (sc->sc_cur_power_mode != ios->power_mode) {
 1007 
 1008                 if (ios->power_mode == power_up) {
 1009 
 1010                         /* Set the power level */
 1011                         hctl_reg = ti_mmchs_read_4(sc, MMCHS_HCTL);
 1012                         hctl_reg &= ~(MMCHS_HCTL_SDVS_MASK | MMCHS_HCTL_SDBP);
 1013 
 1014                         if ((ios->vdd == -1) || (ios->vdd >= vdd_240)) {
 1015 #ifndef SOC_TI_AM335X
 1016                                 mv = 3000;
 1017 #endif
 1018                                 hctl_reg |= MMCHS_HCTL_SDVS_V30;
 1019                         } else {
 1020 #ifndef SOC_TI_AM335X
 1021                                 mv = 1800;
 1022 #endif
 1023                                 hctl_reg |= MMCHS_HCTL_SDVS_V18;
 1024                         }
 1025 
 1026                         ti_mmchs_write_4(sc, MMCHS_HCTL, hctl_reg);
 1027 
 1028 #ifdef SOC_TI_AM335X
 1029                         printf("%s: TWL unimplemented\n", __func__);
 1030 #else
 1031                         /* Set the desired voltage on the regulator */
 1032                         if (sc->sc_vreg_dev && sc->sc_vreg_name)
 1033                                 twl_vreg_set_voltage(sc->sc_vreg_dev, sc->sc_vreg_name, mv);
 1034 #endif
 1035                         /* Enable the bus power */
 1036                         ti_mmchs_write_4(sc, MMCHS_HCTL, (hctl_reg | MMCHS_HCTL_SDBP));
 1037                         timeout = hz;
 1038                         while (!(ti_mmchs_read_4(sc, MMCHS_HCTL) & MMCHS_HCTL_SDBP)) {
 1039                                 if (timeout-- == 0)
 1040                                         break;
 1041                                 pause("MMC_PWRON", 1);
 1042                         }
 1043 
 1044                 } else if (ios->power_mode == power_off) {
 1045                         /* Disable the bus power */
 1046                         hctl_reg = ti_mmchs_read_4(sc, MMCHS_HCTL);
 1047                         ti_mmchs_write_4(sc, MMCHS_HCTL, (hctl_reg & ~MMCHS_HCTL_SDBP));
 1048 
 1049 #ifdef SOC_TI_AM335X
 1050                         printf("%s: TWL unimplemented\n", __func__);
 1051 #else
 1052                         /* Turn the power off on the voltage regulator */
 1053                         if (sc->sc_vreg_dev && sc->sc_vreg_name)
 1054                                 twl_vreg_set_voltage(sc->sc_vreg_dev, sc->sc_vreg_name, 0);
 1055 #endif
 1056                 } else if (ios->power_mode == power_on) {
 1057                         /* Force a card re-initialisation sequence */
 1058                         do_card_init = 1;
 1059                 }
 1060 
 1061                 /* Save the new power state */
 1062                 sc->sc_cur_power_mode = ios->power_mode;
 1063         }
 1064 
 1065         /* need the MMCHS_SYSCTL register */
 1066         sysctl_reg = ti_mmchs_read_4(sc, MMCHS_SYSCTL);
 1067 
 1068         /* Just in case this hasn't been setup before, set the timeout to the default */
 1069         sysctl_reg &= ~MMCHS_SYSCTL_DTO_MASK;
 1070         sysctl_reg |= MMCHS_SYSCTL_DTO(0xe);
 1071 
 1072         /* Disable the clock output while configuring the new clock */
 1073         sysctl_reg &= ~(MMCHS_SYSCTL_ICE | MMCHS_SYSCTL_CEN);
 1074         ti_mmchs_write_4(sc, MMCHS_SYSCTL, sysctl_reg);
 1075 
 1076         /* bus mode? */
 1077         if (ios->clock == 0) {
 1078                 clkdiv = 0;
 1079         } else {
 1080                 clkdiv = sc->sc_ref_freq / ios->clock;
 1081                 if (clkdiv < 1)
 1082                         clkdiv = 1;
 1083                 if ((sc->sc_ref_freq / clkdiv) > ios->clock)
 1084                         clkdiv += 1;
 1085                 if (clkdiv > 250)
 1086                         clkdiv = 250;
 1087         }
 1088 
 1089         /* Set the new clock divider */
 1090         sysctl_reg &= ~MMCHS_SYSCTL_CLKD_MASK;
 1091         sysctl_reg |= MMCHS_SYSCTL_CLKD(clkdiv);
 1092 
 1093         /* Write the new settings ... */
 1094         ti_mmchs_write_4(sc, MMCHS_SYSCTL, sysctl_reg);
 1095         /* ... write the internal clock enable bit ... */
 1096         ti_mmchs_write_4(sc, MMCHS_SYSCTL, sysctl_reg | MMCHS_SYSCTL_ICE);
 1097         /* ... wait for the clock to stablise ... */
 1098         while (((sysctl_reg = ti_mmchs_read_4(sc, MMCHS_SYSCTL)) &
 1099             MMCHS_SYSCTL_ICS) == 0) {
 1100                 continue;
 1101         }
 1102         /* ... then enable */
 1103         sysctl_reg |= MMCHS_SYSCTL_CEN;
 1104         ti_mmchs_write_4(sc, MMCHS_SYSCTL, sysctl_reg);
 1105 
 1106         /* If the power state has changed to 'power_on' then run the init sequence*/
 1107         if (do_card_init) {
 1108                 ti_mmchs_send_init_stream(sc);
 1109         }
 1110 
 1111         /* Set the bus mode (opendrain or normal) */
 1112         con_reg = ti_mmchs_read_4(sc, MMCHS_CON);
 1113         if (ios->bus_mode == opendrain)
 1114                 con_reg |= MMCHS_CON_OD;
 1115         else
 1116                 con_reg &= ~MMCHS_CON_OD;
 1117         ti_mmchs_write_4(sc, MMCHS_CON, con_reg);
 1118 
 1119         return (0);
 1120 }
 1121 
 1122 /**
 1123  *      ti_mmchs_acquire_host -
 1124  *      @brdev: mmc bridge device handle
 1125  *      @reqdev: device doing the request
 1126  *
 1127  *      TODO: Is this function needed ?
 1128  *
 1129  *      LOCKING:
 1130  *      none
 1131  *
 1132  *      RETURNS:
 1133  *      0 function succeeded
 1134  *
 1135  */
 1136 static int
 1137 ti_mmchs_acquire_host(device_t brdev, device_t reqdev)
 1138 {
 1139         struct ti_mmchs_softc *sc = device_get_softc(brdev);
 1140         int err = 0;
 1141 
 1142         TI_MMCHS_LOCK(sc);
 1143 
 1144         while (sc->bus_busy) {
 1145                 msleep(sc, &sc->sc_mtx, PZERO, "mmc", hz / 5);
 1146         }
 1147 
 1148         sc->bus_busy++;
 1149 
 1150         TI_MMCHS_UNLOCK(sc);
 1151 
 1152         return (err);
 1153 }
 1154 
 1155 /**
 1156  *      ti_mmchs_release_host -
 1157  *      @brdev: mmc bridge device handle
 1158  *      @reqdev: device doing the request
 1159  *
 1160  *      TODO: Is this function needed ?
 1161  *
 1162  *      LOCKING:
 1163  *      none
 1164  *
 1165  *      RETURNS:
 1166  *      0 function succeeded
 1167  *
 1168  */
 1169 static int
 1170 ti_mmchs_release_host(device_t brdev, device_t reqdev)
 1171 {
 1172         struct ti_mmchs_softc *sc = device_get_softc(brdev);
 1173 
 1174         TI_MMCHS_LOCK(sc);
 1175 
 1176         sc->bus_busy--;
 1177         wakeup(sc);
 1178 
 1179         TI_MMCHS_UNLOCK(sc);
 1180 
 1181         return (0);
 1182 }
 1183 
 1184 /**
 1185  *      ti_mmchs_read_ivar - returns driver conf variables
 1186  *      @bus:
 1187  *      @child:
 1188  *      @which: The variable to get the result for
 1189  *      @result: Upon return will store the variable value
 1190  *
 1191  *
 1192  *
 1193  *      LOCKING:
 1194  *      None, caller must hold locks
 1195  *
 1196  *      RETURNS:
 1197  *      0 on success
 1198  *      EINVAL if the variable requested is invalid
 1199  */
 1200 static int
 1201 ti_mmchs_read_ivar(device_t bus, device_t child, int which, uintptr_t *result)
 1202 {
 1203         struct ti_mmchs_softc *sc = device_get_softc(bus);
 1204 
 1205         switch (which) {
 1206                 case MMCBR_IVAR_BUS_MODE:
 1207                         *(int *)result = sc->host.ios.bus_mode;
 1208                         break;
 1209                 case MMCBR_IVAR_BUS_WIDTH:
 1210                         *(int *)result = sc->host.ios.bus_width;
 1211                         break;
 1212                 case MMCBR_IVAR_CHIP_SELECT:
 1213                         *(int *)result = sc->host.ios.chip_select;
 1214                         break;
 1215                 case MMCBR_IVAR_CLOCK:
 1216                         *(int *)result = sc->host.ios.clock;
 1217                         break;
 1218                 case MMCBR_IVAR_F_MIN:
 1219                         *(int *)result = sc->host.f_min;
 1220                         break;
 1221                 case MMCBR_IVAR_F_MAX:
 1222                         *(int *)result = sc->host.f_max;
 1223                         break;
 1224                 case MMCBR_IVAR_HOST_OCR:
 1225                         *(int *)result = sc->host.host_ocr;
 1226                         break;
 1227                 case MMCBR_IVAR_MODE:
 1228                         *(int *)result = sc->host.mode;
 1229                         break;
 1230                 case MMCBR_IVAR_OCR:
 1231                         *(int *)result = sc->host.ocr;
 1232                         break;
 1233                 case MMCBR_IVAR_POWER_MODE:
 1234                         *(int *)result = sc->host.ios.power_mode;
 1235                         break;
 1236                 case MMCBR_IVAR_VDD:
 1237                         *(int *)result = sc->host.ios.vdd;
 1238                         break;
 1239                 case MMCBR_IVAR_CAPS:
 1240                         *(int *)result = sc->host.caps;
 1241                         break;
 1242                 case MMCBR_IVAR_MAX_DATA:
 1243                         *(int *)result = 1;
 1244                         break;
 1245                 default:
 1246                         return (EINVAL);
 1247         }
 1248         return (0);
 1249 }
 1250 
 1251 /**
 1252  *      ti_mmchs_write_ivar - writes a driver conf variables
 1253  *      @bus:
 1254  *      @child:
 1255  *      @which: The variable to set
 1256  *      @value: The value to write into the variable
 1257  *
 1258  *
 1259  *
 1260  *      LOCKING:
 1261  *      None, caller must hold locks
 1262  *
 1263  *      RETURNS:
 1264  *      0 on success
 1265  *      EINVAL if the variable requested is invalid
 1266  */
 1267 static int
 1268 ti_mmchs_write_ivar(device_t bus, device_t child, int which, uintptr_t value)
 1269 {
 1270         struct ti_mmchs_softc *sc = device_get_softc(bus);
 1271 
 1272         switch (which) {
 1273                 case MMCBR_IVAR_BUS_MODE:
 1274                         sc->host.ios.bus_mode = value;
 1275                         break;
 1276                 case MMCBR_IVAR_BUS_WIDTH:
 1277                         sc->host.ios.bus_width = value;
 1278                         break;
 1279                 case MMCBR_IVAR_CHIP_SELECT:
 1280                         sc->host.ios.chip_select = value;
 1281                         break;
 1282                 case MMCBR_IVAR_CLOCK:
 1283                         sc->host.ios.clock = value;
 1284                         break;
 1285                 case MMCBR_IVAR_MODE:
 1286                         sc->host.mode = value;
 1287                         break;
 1288                 case MMCBR_IVAR_OCR:
 1289                         sc->host.ocr = value;
 1290                         break;
 1291                 case MMCBR_IVAR_POWER_MODE:
 1292                         sc->host.ios.power_mode = value;
 1293                         break;
 1294                 case MMCBR_IVAR_VDD:
 1295                         sc->host.ios.vdd = value;
 1296                         break;
 1297                         /* These are read-only */
 1298                 case MMCBR_IVAR_CAPS:
 1299                 case MMCBR_IVAR_HOST_OCR:
 1300                 case MMCBR_IVAR_F_MIN:
 1301                 case MMCBR_IVAR_F_MAX:
 1302                 case MMCBR_IVAR_MAX_DATA:
 1303                         return (EINVAL);
 1304                 default:
 1305                         return (EINVAL);
 1306         }
 1307         return (0);
 1308 }
 1309 
 1310 /**
 1311  *      ti_mmchs_hw_init - initialises the MMC/SD/SIO controller
 1312  *      @dev: mmc device handle
 1313  *
 1314  *      Called by the driver attach function during driver initialisation. This
 1315  *      function is responsibly to setup the controller ready for transactions.
 1316  *
 1317  *      LOCKING:
 1318  *      No locking, assumed to only be called during initialisation.
 1319  *
 1320  *      RETURNS:
 1321  *      nothing
 1322  */
 1323 static void
 1324 ti_mmchs_hw_init(device_t dev)
 1325 {
 1326         struct ti_mmchs_softc *sc = device_get_softc(dev);
 1327         clk_ident_t clk;
 1328         unsigned long timeout;
 1329         uint32_t sysctl;
 1330         uint32_t capa;
 1331         uint32_t con, sysconfig;
 1332 
 1333         /* 1: Enable the controller and interface/functional clocks */
 1334         clk = MMC0_CLK + sc->device_id;
 1335 
 1336         if (ti_prcm_clk_enable(clk) != 0) {
 1337                 device_printf(dev, "Error: failed to enable MMC clock\n");
 1338                 return;
 1339         }
 1340 
 1341         /* 1a: Get the frequency of the source clock */
 1342         if (ti_prcm_clk_get_source_freq(clk, &sc->sc_ref_freq) != 0) {
 1343                 device_printf(dev, "Error: failed to get source clock freq\n");
 1344                 return;
 1345         }
 1346 
 1347         /* 2: Issue a softreset to the controller */
 1348         sysconfig = ti_mmchs_read_4(sc, MMCHS_SYSCONFIG);
 1349         sysconfig |= MMCHS_SYSCONFIG_SRST;
 1350         ti_mmchs_write_4(sc, MMCHS_SYSCONFIG, sysconfig);
 1351         timeout = 100;
 1352         while ((ti_mmchs_read_4(sc, MMCHS_SYSSTATUS) & 0x01) == 0x0) {
 1353                 DELAY(1000);
 1354                 if (timeout-- == 0) {
 1355                         device_printf(dev, "Error: reset operation timed out\n");
 1356                         return;
 1357                 }
 1358         }
 1359 
 1360         /* 3: Reset both the command and data state machines */
 1361         sysctl = ti_mmchs_read_4(sc, MMCHS_SYSCTL);
 1362         ti_mmchs_write_4(sc, MMCHS_SYSCTL, sysctl | MMCHS_SYSCTL_SRA);
 1363         timeout = 100;
 1364         while ((ti_mmchs_read_4(sc, MMCHS_SYSCTL) & MMCHS_SYSCTL_SRA) != 0x0) {
 1365                 DELAY(1000);
 1366                 if (timeout-- == 0) {
 1367                         device_printf(dev, "Error: reset operation timed out\n");
 1368                         return;
 1369                 }
 1370         }
 1371 
 1372         /* 4: Set initial host configuration (1-bit mode, pwroff) and capabilities */
 1373         ti_mmchs_write_4(sc, MMCHS_HCTL, MMCHS_HCTL_SDVS_V30);
 1374 
 1375         capa = ti_mmchs_read_4(sc, MMCHS_CAPA);
 1376         ti_mmchs_write_4(sc, MMCHS_CAPA, capa | MMCHS_CAPA_VS30 | MMCHS_CAPA_VS18);
 1377 
 1378         /* 5: Set the initial bus configuration
 1379          *       0  CTPL_MMC_SD      : Control Power for DAT1 line
 1380          *       0  WPP_ACTIVE_HIGH  : Write protect polarity
 1381          *       0  CDP_ACTIVE_HIGH  : Card detect polarity
 1382          *       0  CTO_ENABLED      : MMC interrupt command
 1383          *       0  DW8_DISABLED     : 8-bit mode MMC select
 1384          *       0  MODE_FUNC        : Mode select
 1385          *       0  STREAM_DISABLED  : Stream command
 1386          *       0  HR_DISABLED      : Broadcast host response
 1387          *       0  INIT_DISABLED    : Send initialization stream
 1388          *       0  OD_DISABLED      : No Open Drain
 1389          */
 1390         con = ti_mmchs_read_4(sc, MMCHS_CON) & MMCHS_CON_DVAL_MASK;
 1391         ti_mmchs_write_4(sc, MMCHS_CON, con);
 1392 
 1393 }
 1394 
 1395 /**
 1396  *      ti_mmchs_fini - shutdown the MMC/SD/SIO controller
 1397  *      @dev: mmc device handle
 1398  *
 1399  *      Responsible for shutting done the MMC controller, this function may be
 1400  *      called as part of a reset sequence.
 1401  *
 1402  *      LOCKING:
 1403  *      No locking, assumed to be called during tear-down/reset.
 1404  *
 1405  *      RETURNS:
 1406  *      nothing
 1407  */
 1408 static void
 1409 ti_mmchs_hw_fini(device_t dev)
 1410 {
 1411         struct ti_mmchs_softc *sc = device_get_softc(dev);
 1412 
 1413         /* Disable all interrupts */
 1414         ti_mmchs_write_4(sc, MMCHS_ISE, 0x00000000);
 1415         ti_mmchs_write_4(sc, MMCHS_IE, 0x00000000);
 1416 
 1417         /* Disable the functional and interface clocks */
 1418         ti_prcm_clk_disable(MMC0_CLK + sc->device_id);
 1419 }
 1420 
 1421 /**
 1422  *      ti_mmchs_init_dma_channels - initalise the DMA channels
 1423  *      @sc: driver soft context
 1424  *
 1425  *      Attempts to activate an RX and TX DMA channel for the MMC device.
 1426  *
 1427  *      LOCKING:
 1428  *      No locking, assumed to be called during tear-down/reset.
 1429  *
 1430  *      RETURNS:
 1431  *      0 on success, a negative error code on failure.
 1432  */
 1433 static int
 1434 ti_mmchs_init_dma_channels(struct ti_mmchs_softc *sc)
 1435 {
 1436 #ifdef SOC_TI_AM335X
 1437         switch (sc->device_id) {
 1438                 case 0:
 1439                         sc->dma_tx_trig = TI_EDMA3_EVENT_SDTXEVT0;
 1440                         sc->dma_rx_trig = TI_EDMA3_EVENT_SDRXEVT0;
 1441                         break;
 1442                 case 1:
 1443                         sc->dma_tx_trig = TI_EDMA3_EVENT_SDTXEVT1;
 1444                         sc->dma_rx_trig = TI_EDMA3_EVENT_SDRXEVT1;
 1445                         break;
 1446                 default:
 1447                         return(EINVAL);
 1448         }
 1449 
 1450 #define EVTQNUM         0
 1451         /* TODO EDMA3 have 3 queues, so we need some queue allocation call */
 1452         ti_edma3_init(EVTQNUM);
 1453         ti_edma3_request_dma_ch(sc->dma_tx_trig, sc->dma_tx_trig, EVTQNUM);
 1454         ti_edma3_request_dma_ch(sc->dma_rx_trig, sc->dma_rx_trig, EVTQNUM);
 1455 #else
 1456         int err;
 1457         uint32_t rev;
 1458 
 1459         /* Get the current chip revision */
 1460         rev = ti_revision();
 1461         if ((OMAP_REV_DEVICE(rev) != OMAP4430_DEV) && (sc->device_id > 3))
 1462                 return(EINVAL);
 1463 
 1464         /* Get the DMA MMC triggers */
 1465         switch (sc->device_id) {
 1466                 case 1:
 1467                         sc->dma_tx_trig = 60;
 1468                         sc->dma_rx_trig = 61;
 1469                         break;
 1470                 case 2:
 1471                         sc->dma_tx_trig = 46;
 1472                         sc->dma_rx_trig = 47;
 1473                         break;
 1474                 case 3:
 1475                         sc->dma_tx_trig = 76;
 1476                         sc->dma_rx_trig = 77;
 1477                         break;
 1478                 /* The following are OMAP4 only */
 1479                 case 4:
 1480                         sc->dma_tx_trig = 56;
 1481                         sc->dma_rx_trig = 57;
 1482                         break;
 1483                 case 5:
 1484                         sc->dma_tx_trig = 58;
 1485                         sc->dma_rx_trig = 59;
 1486                         break;
 1487                 default:
 1488                         return(EINVAL);
 1489         }
 1490 
 1491         /* Activate a RX channel from the OMAP DMA driver */
 1492         err = ti_sdma_activate_channel(&sc->sc_dmach_rd, ti_mmchs_dma_intr, sc);
 1493         if (err != 0)
 1494                 return(err);
 1495 
 1496         /* Setup the RX channel for MMC data transfers */
 1497         ti_sdma_set_xfer_burst(sc->sc_dmach_rd, TI_SDMA_BURST_NONE,
 1498             TI_SDMA_BURST_64);
 1499         ti_sdma_set_xfer_data_type(sc->sc_dmach_rd, TI_SDMA_DATA_32BITS_SCALAR);
 1500         ti_sdma_sync_params(sc->sc_dmach_rd, sc->dma_rx_trig,
 1501             TI_SDMA_SYNC_PACKET | TI_SDMA_SYNC_TRIG_ON_SRC);
 1502         ti_sdma_set_addr_mode(sc->sc_dmach_rd, TI_SDMA_ADDR_CONSTANT,
 1503             TI_SDMA_ADDR_POST_INCREMENT);
 1504 
 1505         /* Activate and configure the TX DMA channel */
 1506         err = ti_sdma_activate_channel(&sc->sc_dmach_wr, ti_mmchs_dma_intr, sc);
 1507         if (err != 0)
 1508                 return(err);
 1509 
 1510         /* Setup the TX channel for MMC data transfers */
 1511         ti_sdma_set_xfer_burst(sc->sc_dmach_wr, TI_SDMA_BURST_64,
 1512             TI_SDMA_BURST_NONE);
 1513         ti_sdma_set_xfer_data_type(sc->sc_dmach_wr, TI_SDMA_DATA_32BITS_SCALAR);
 1514         ti_sdma_sync_params(sc->sc_dmach_wr, sc->dma_tx_trig,
 1515             TI_SDMA_SYNC_PACKET | TI_SDMA_SYNC_TRIG_ON_DST);
 1516         ti_sdma_set_addr_mode(sc->sc_dmach_wr, TI_SDMA_ADDR_POST_INCREMENT,
 1517             TI_SDMA_ADDR_CONSTANT);
 1518 #endif
 1519         return(0);
 1520 }
 1521 
 1522 /**
 1523  *      ti_mmchs_deactivate - deactivates the driver
 1524  *      @dev: mmc device handle
 1525  *
 1526  *      Unmaps the register set and releases the IRQ resource.
 1527  *
 1528  *      LOCKING:
 1529  *      None required
 1530  *
 1531  *      RETURNS:
 1532  *      nothing
 1533  */
 1534 static void
 1535 ti_mmchs_deactivate(device_t dev)
 1536 {
 1537         struct ti_mmchs_softc *sc= device_get_softc(dev);
 1538 
 1539         /* Remove the IRQ handler */
 1540         if (sc->sc_irq_h != NULL) {
 1541                 bus_teardown_intr(dev, sc->sc_irq_res, sc->sc_irq_h);
 1542                 sc->sc_irq_h = NULL;
 1543         }
 1544 
 1545         /* Do the generic detach */
 1546         bus_generic_detach(sc->sc_dev);
 1547 
 1548 #ifdef SOC_TI_AM335X
 1549         printf("%s: DMA unimplemented\n", __func__);
 1550 #else
 1551         /* Deactivate the DMA channels */
 1552         ti_sdma_deactivate_channel(sc->sc_dmach_rd);
 1553         ti_sdma_deactivate_channel(sc->sc_dmach_wr);
 1554 #endif
 1555 
 1556         /* Unmap the MMC controller registers */
 1557         if (sc->sc_mem_res != 0) {
 1558                 bus_release_resource(dev, SYS_RES_MEMORY, rman_get_rid(sc->sc_irq_res),
 1559                     sc->sc_mem_res);
 1560                 sc->sc_mem_res = NULL;
 1561         }
 1562 
 1563         /* Release the IRQ resource */
 1564         if (sc->sc_irq_res != NULL) {
 1565                 bus_release_resource(dev, SYS_RES_IRQ, rman_get_rid(sc->sc_irq_res),
 1566                     sc->sc_irq_res);
 1567                 sc->sc_irq_res = NULL;
 1568         }
 1569 
 1570         return;
 1571 }
 1572 
 1573 /**
 1574  *      ti_mmchs_activate - activates the driver
 1575  *      @dev: mmc device handle
 1576  *
 1577  *      Maps in the register set and requests an IRQ handler for the MMC controller.
 1578  *
 1579  *      LOCKING:
 1580  *      None required
 1581  *
 1582  *      RETURNS:
 1583  *      0 on sucess
 1584  *      ENOMEM if failed to map register set
 1585  */
 1586 static int
 1587 ti_mmchs_activate(device_t dev)
 1588 {
 1589         struct ti_mmchs_softc *sc = device_get_softc(dev);
 1590         int rid;
 1591         int err;
 1592 
 1593         /* Get the memory resource for the register mapping */
 1594         rid = 0;
 1595         sc->sc_mem_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,
 1596             RF_ACTIVE);
 1597         if (sc->sc_mem_res == NULL)
 1598                 panic("%s: Cannot map registers", device_get_name(dev));
 1599 
 1600         /* Allocate an IRQ resource for the MMC controller */
 1601         rid = 0;
 1602         sc->sc_irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
 1603             RF_ACTIVE | RF_SHAREABLE);
 1604         if (sc->sc_irq_res == NULL)
 1605                 goto errout;
 1606 
 1607         /* Allocate DMA tags and maps */
 1608         err = bus_dma_tag_create(bus_get_dma_tag(dev), 1, 0,
 1609             BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL,
 1610             NULL, MAXPHYS, 1, MAXPHYS, BUS_DMA_ALLOCNOW, NULL,
 1611             NULL, &sc->sc_dmatag);
 1612         if (err != 0)
 1613                 goto errout;
 1614 
 1615         err = bus_dmamap_create(sc->sc_dmatag, 0,  &sc->sc_dmamap);
 1616         if (err != 0)
 1617                 goto errout;
 1618 
 1619         /* Initialise the DMA channels to be used by the controller */
 1620         err = ti_mmchs_init_dma_channels(sc);
 1621         if (err != 0)
 1622                 goto errout;
 1623 
 1624         /* Set the register offset */
 1625         if (ti_chip() == CHIP_OMAP_3)
 1626                 sc->sc_reg_off = OMAP3_MMCHS_REG_OFFSET;
 1627         else if (ti_chip() == CHIP_OMAP_4)
 1628                 sc->sc_reg_off = OMAP4_MMCHS_REG_OFFSET;
 1629         else if (ti_chip() == CHIP_AM335X)
 1630                 sc->sc_reg_off = AM335X_MMCHS_REG_OFFSET;
 1631         else
 1632                 panic("Unknown OMAP device\n");
 1633 
 1634         /* Get the physical address of the MMC data register, needed for DMA */
 1635         sc->sc_data_reg_paddr = BUS_SPACE_PHYSADDR(sc->sc_mem_res, 
 1636             sc->sc_reg_off + MMCHS_DATA);
 1637 
 1638         /* Set the initial power state to off */
 1639         sc->sc_cur_power_mode = power_off;
 1640 
 1641         return (0);
 1642 
 1643 errout:
 1644         ti_mmchs_deactivate(dev);
 1645         return (ENOMEM);
 1646 }
 1647 
 1648 /**
 1649  *      ti_mmchs_probe - probe function for the driver
 1650  *      @dev: mmc device handle
 1651  *
 1652  *
 1653  *
 1654  *      RETURNS:
 1655  *      always returns 0
 1656  */
 1657 static int
 1658 ti_mmchs_probe(device_t dev)
 1659 {
 1660         if (!ofw_bus_is_compatible(dev, "ti,mmchs"))
 1661                 return (ENXIO);
 1662 
 1663         device_set_desc(dev, "TI MMC/SD/SDIO High Speed Interface");
 1664         return (0);
 1665 }
 1666 
 1667 /**
 1668  *      ti_mmchs_attach - attach function for the driver
 1669  *      @dev: mmc device handle
 1670  *
 1671  *      Driver initialisation, sets-up the bus mappings, DMA mapping/channels and
 1672  *      the actual controller by calling ti_mmchs_init().
 1673  *
 1674  *      RETURNS:
 1675  *      Returns 0 on success or a negative error code.
 1676  */
 1677 static int
 1678 ti_mmchs_attach(device_t dev)
 1679 {
 1680         struct ti_mmchs_softc *sc = device_get_softc(dev);
 1681         int unit = device_get_unit(dev);
 1682         phandle_t node;
 1683         pcell_t did;
 1684         int err;
 1685 
 1686         /* Save the device and bus tag */
 1687         sc->sc_dev = dev;
 1688 
 1689         /* Get the mmchs device id from FDT */
 1690         node = ofw_bus_get_node(dev);
 1691         if ((OF_getprop(node, "mmchs-device-id", &did, sizeof(did))) <= 0) {
 1692             device_printf(dev, "missing mmchs-device-id attribute in FDT\n");
 1693                 return (ENXIO);
 1694         }
 1695         sc->device_id = fdt32_to_cpu(did);
 1696 
 1697         /* Initiate the mtex lock */
 1698         TI_MMCHS_LOCK_INIT(sc);
 1699 
 1700         /* Indicate the DMA channels haven't yet been allocated */
 1701         sc->sc_dmach_rd = (unsigned int)-1;
 1702         sc->sc_dmach_wr = (unsigned int)-1;
 1703 
 1704         /* Get the hint'ed write detect pin */
 1705         /* TODO: take this from FDT */
 1706         if (resource_int_value("ti_mmchs", unit, "wp_gpio", &sc->sc_wp_gpio_pin) != 0){
 1707                 sc->sc_wp_gpio_pin = -1;
 1708         } else {
 1709                 /* Get the GPIO device, we need this for the write protect pin */
 1710                 sc->sc_gpio_dev = devclass_get_device(devclass_find("gpio"), 0);
 1711                 if (sc->sc_gpio_dev == NULL)
 1712                         device_printf(dev, "Error: failed to get the GPIO device\n");
 1713                 else
 1714                         GPIO_PIN_SETFLAGS(sc->sc_gpio_dev, sc->sc_wp_gpio_pin,
 1715                                           GPIO_PIN_INPUT);
 1716         }
 1717 
 1718         /* Get the TWL voltage regulator device, we need this to for setting the
 1719          * voltage of the bus on certain OMAP platforms.
 1720          */
 1721         sc->sc_vreg_name = NULL;
 1722 
 1723         /* TODO: add voltage regulator knob to FDT */
 1724 #ifdef notyet
 1725         sc->sc_vreg_dev = devclass_get_device(devclass_find("twl_vreg"), 0);
 1726         if (sc->sc_vreg_dev == NULL) {
 1727                 device_printf(dev, "Error: failed to get the votlage regulator"
 1728                     " device\n");
 1729                 sc->sc_vreg_name = NULL;
 1730         }
 1731 #endif
 1732 
 1733         /* Activate the device */
 1734         err = ti_mmchs_activate(dev);
 1735         if (err)
 1736                 goto out;
 1737 
 1738         /* Initialise the controller */
 1739         ti_mmchs_hw_init(dev);
 1740 
 1741         /* Activate the interrupt and attach a handler */
 1742         err = bus_setup_intr(dev, sc->sc_irq_res, INTR_TYPE_MISC | INTR_MPSAFE,
 1743             NULL, ti_mmchs_intr, sc, &sc->sc_irq_h);
 1744         if (err != 0)
 1745                 goto out;
 1746 
 1747         /* Add host details */
 1748         sc->host.f_min = sc->sc_ref_freq / 1023;
 1749         sc->host.f_max = sc->sc_ref_freq;
 1750         sc->host.host_ocr = MMC_OCR_290_300 | MMC_OCR_300_310;
 1751         sc->host.caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA;
 1752 
 1753         device_add_child(dev, "mmc", 0);
 1754 
 1755         device_set_ivars(dev, &sc->host);
 1756         err = bus_generic_attach(dev);
 1757 
 1758 out:
 1759         if (err) {
 1760                 TI_MMCHS_LOCK_DESTROY(sc);
 1761                 ti_mmchs_deactivate(dev);
 1762 
 1763 #ifdef SOC_TI_AM335X
 1764                 printf("%s: DMA unimplemented\n", __func__);
 1765 #else
 1766                 if (sc->sc_dmach_rd != (unsigned int)-1)
 1767                         ti_sdma_deactivate_channel(sc->sc_dmach_rd);
 1768                 if (sc->sc_dmach_wr != (unsigned int)-1)
 1769                         ti_sdma_deactivate_channel(sc->sc_dmach_wr);
 1770 #endif
 1771         }
 1772 
 1773         return (err);
 1774 }
 1775 
 1776 /**
 1777  *      ti_mmchs_detach - dettach function for the driver
 1778  *      @dev: mmc device handle
 1779  *
 1780  *      Shutdowns the controll and release resources allocated by the driver.
 1781  *
 1782  *      RETURNS:
 1783  *      Always returns 0.
 1784  */
 1785 static int
 1786 ti_mmchs_detach(device_t dev)
 1787 {
 1788 #ifndef SOC_TI_AM335X
 1789         struct ti_mmchs_softc *sc = device_get_softc(dev);
 1790 #endif
 1791 
 1792         ti_mmchs_hw_fini(dev);
 1793         ti_mmchs_deactivate(dev);
 1794 
 1795 #ifdef SOC_TI_AM335X
 1796                 printf("%s: DMA unimplemented\n", __func__);
 1797 #else
 1798         ti_sdma_deactivate_channel(sc->sc_dmach_wr);
 1799         ti_sdma_deactivate_channel(sc->sc_dmach_rd);
 1800 #endif
 1801 
 1802         return (0);
 1803 }
 1804 
 1805 static device_method_t ti_mmchs_methods[] = {
 1806         /* device_if */
 1807         DEVMETHOD(device_probe, ti_mmchs_probe),
 1808         DEVMETHOD(device_attach, ti_mmchs_attach),
 1809         DEVMETHOD(device_detach, ti_mmchs_detach),
 1810 
 1811         /* Bus interface */
 1812         DEVMETHOD(bus_read_ivar,        ti_mmchs_read_ivar),
 1813         DEVMETHOD(bus_write_ivar,       ti_mmchs_write_ivar),
 1814 
 1815         /* mmcbr_if - MMC state machine callbacks */
 1816         DEVMETHOD(mmcbr_update_ios, ti_mmchs_update_ios),
 1817         DEVMETHOD(mmcbr_request, ti_mmchs_request),
 1818         DEVMETHOD(mmcbr_get_ro, ti_mmchs_get_ro),
 1819         DEVMETHOD(mmcbr_acquire_host, ti_mmchs_acquire_host),
 1820         DEVMETHOD(mmcbr_release_host, ti_mmchs_release_host),
 1821 
 1822         {0, 0},
 1823 };
 1824 
 1825 static driver_t ti_mmchs_driver = {
 1826         "ti_mmchs",
 1827         ti_mmchs_methods,
 1828         sizeof(struct ti_mmchs_softc),
 1829 };
 1830 static devclass_t ti_mmchs_devclass;
 1831 
 1832 DRIVER_MODULE(ti_mmchs, simplebus, ti_mmchs_driver, ti_mmchs_devclass, 0, 0);
 1833 MODULE_DEPEND(ti_mmchs, ti_prcm, 1, 1, 1);
 1834 #ifdef SOC_TI_AM335X
 1835 MODULE_DEPEND(ti_mmchs, ti_edma, 1, 1, 1);
 1836 #else
 1837 MODULE_DEPEND(ti_mmchs, ti_sdma, 1, 1, 1);
 1838 #endif
 1839 MODULE_DEPEND(ti_mmchs, ti_gpio, 1, 1, 1);
 1840 
 1841 /* FIXME: MODULE_DEPEND(ti_mmchs, twl_vreg, 1, 1, 1); */

Cache object: 8175078d4388bd031f3ce282489cf409


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.