Home | History | Annotate | Line # | Download | only in xscale
      1  1.14    andvar /*	$NetBSD: pxa2x0_mci.c,v 1.14 2023/03/28 20:01:57 andvar Exp $	*/
      2   1.1    nonaka /*	$OpenBSD: pxa2x0_mmc.c,v 1.5 2009/02/23 18:09:55 miod Exp $	*/
      3   1.1    nonaka 
      4   1.1    nonaka /*
      5   1.1    nonaka  * Copyright (c) 2007 Uwe Stuehler <uwe (at) openbsd.org>
      6   1.1    nonaka  *
      7   1.1    nonaka  * Permission to use, copy, modify, and distribute this software for any
      8   1.1    nonaka  * purpose with or without fee is hereby granted, provided that the above
      9   1.1    nonaka  * copyright notice and this permission notice appear in all copies.
     10   1.1    nonaka  *
     11   1.1    nonaka  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
     12   1.1    nonaka  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
     13   1.1    nonaka  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
     14   1.1    nonaka  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
     15   1.1    nonaka  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
     16   1.1    nonaka  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
     17   1.1    nonaka  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
     18   1.1    nonaka  */
     19   1.1    nonaka 
     20   1.1    nonaka /*-
     21  1.10    nonaka  * Copyright (C) 2007-2010 NONAKA Kimihiro <nonaka (at) netbsd.org>
     22   1.1    nonaka  * All rights reserved.
     23   1.1    nonaka  *
     24   1.1    nonaka  * Redistribution and use in source and binary forms, with or without
     25   1.1    nonaka  * modification, are permitted provided that the following conditions
     26   1.1    nonaka  * are met:
     27   1.1    nonaka  * 1. Redistributions of source code must retain the above copyright
     28   1.1    nonaka  *    notice, this list of conditions and the following disclaimer.
     29   1.1    nonaka  * 2. Redistributions in binary form must reproduce the above copyright
     30   1.1    nonaka  *    notice, this list of conditions and the following disclaimer in the
     31   1.1    nonaka  *    documentation and/or other materials provided with the distribution.
     32   1.1    nonaka  *
     33  1.10    nonaka  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     34  1.10    nonaka  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     35  1.10    nonaka  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     36  1.10    nonaka  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     37  1.10    nonaka  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     38  1.10    nonaka  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     39  1.10    nonaka  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     40  1.10    nonaka  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     41  1.10    nonaka  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     42  1.10    nonaka  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     43   1.1    nonaka  */
     44   1.1    nonaka 
     45   1.1    nonaka /*
     46   1.1    nonaka  * MMC/SD/SDIO controller driver for Intel PXA2xx processors
     47   1.1    nonaka  *
     48   1.1    nonaka  * Power management is beyond control of the processor's SD/SDIO/MMC
     49   1.1    nonaka  * block, so this driver depends on the attachment driver to provide
     50   1.1    nonaka  * us with some callback functions via the "tag" member in our softc.
     51   1.1    nonaka  * Bus power management calls are then dispatched to the attachment
     52   1.1    nonaka  * driver.
     53   1.1    nonaka  */
     54   1.1    nonaka 
     55   1.1    nonaka #include <sys/cdefs.h>
     56  1.14    andvar __KERNEL_RCSID(0, "$NetBSD: pxa2x0_mci.c,v 1.14 2023/03/28 20:01:57 andvar Exp $");
     57   1.1    nonaka 
     58   1.1    nonaka #include <sys/param.h>
     59   1.1    nonaka #include <sys/device.h>
     60   1.1    nonaka #include <sys/systm.h>
     61   1.1    nonaka #include <sys/kernel.h>
     62   1.1    nonaka #include <sys/proc.h>
     63   1.1    nonaka #include <sys/bus.h>
     64   1.1    nonaka #include <sys/mutex.h>
     65   1.1    nonaka #include <sys/condvar.h>
     66   1.1    nonaka 
     67   1.1    nonaka #include <machine/intr.h>
     68   1.1    nonaka 
     69   1.1    nonaka #include <dev/sdmmc/sdmmcvar.h>
     70   1.1    nonaka #include <dev/sdmmc/sdmmcchip.h>
     71   1.1    nonaka 
     72   1.1    nonaka #include <arm/xscale/pxa2x0cpu.h>
     73   1.1    nonaka #include <arm/xscale/pxa2x0reg.h>
     74   1.1    nonaka #include <arm/xscale/pxa2x0var.h>
     75   1.1    nonaka #include <arm/xscale/pxa2x0_dmac.h>
     76   1.1    nonaka #include <arm/xscale/pxa2x0_gpio.h>
     77   1.1    nonaka #include <arm/xscale/pxa2x0_mci.h>
     78   1.1    nonaka 
     79   1.1    nonaka #ifdef PXAMCI_DEBUG
     80   1.5    nonaka int pxamci_debug = 9;
     81   1.1    nonaka #define DPRINTF(n,s)	do { if ((n) <= pxamci_debug) printf s; } while (0)
     82   1.1    nonaka #else
     83   1.1    nonaka #define DPRINTF(n,s)	do {} while (0)
     84   1.1    nonaka #endif
     85   1.1    nonaka 
     86   1.5    nonaka #ifndef PXAMCI_DEBUG
     87   1.5    nonaka #define	STOPCLK_TIMO	2	/* sec */
     88   1.5    nonaka #define	EXECCMD_TIMO	2	/* sec */
     89   1.1    nonaka #else
     90   1.5    nonaka #define	STOPCLK_TIMO	2	/* sec */
     91   1.5    nonaka #define	EXECCMD_TIMO	5	/* sec */
     92   1.1    nonaka #endif
     93   1.1    nonaka 
     94   1.1    nonaka static int	pxamci_host_reset(sdmmc_chipset_handle_t);
     95   1.1    nonaka static uint32_t	pxamci_host_ocr(sdmmc_chipset_handle_t);
     96   1.1    nonaka static int	pxamci_host_maxblklen(sdmmc_chipset_handle_t);
     97   1.1    nonaka static int	pxamci_card_detect(sdmmc_chipset_handle_t);
     98   1.1    nonaka static int	pxamci_write_protect(sdmmc_chipset_handle_t);
     99   1.1    nonaka static int	pxamci_bus_power(sdmmc_chipset_handle_t, uint32_t);
    100   1.1    nonaka static int	pxamci_bus_clock(sdmmc_chipset_handle_t, int);
    101   1.1    nonaka static int	pxamci_bus_width(sdmmc_chipset_handle_t, int);
    102   1.7  kiyohara static int	pxamci_bus_rod(sdmmc_chipset_handle_t, int);
    103   1.1    nonaka static void	pxamci_exec_command(sdmmc_chipset_handle_t,
    104   1.1    nonaka 		    struct sdmmc_command *);
    105   1.1    nonaka static void	pxamci_card_enable_intr(sdmmc_chipset_handle_t, int);
    106   1.1    nonaka static void	pxamci_card_intr_ack(sdmmc_chipset_handle_t);
    107   1.1    nonaka 
    108   1.1    nonaka static struct sdmmc_chip_functions pxamci_chip_functions = {
    109   1.1    nonaka 	/* host controller reset */
    110   1.1    nonaka 	.host_reset		= pxamci_host_reset,
    111   1.1    nonaka 
    112   1.1    nonaka 	/* host controller capabilities */
    113   1.1    nonaka 	.host_ocr		= pxamci_host_ocr,
    114   1.1    nonaka 	.host_maxblklen		= pxamci_host_maxblklen,
    115   1.1    nonaka 
    116   1.1    nonaka 	/* card detection */
    117   1.1    nonaka 	.card_detect		= pxamci_card_detect,
    118   1.1    nonaka 
    119   1.1    nonaka 	/* write protect */
    120   1.1    nonaka 	.write_protect		= pxamci_write_protect,
    121   1.1    nonaka 
    122   1.1    nonaka 	/* bus power, clock frequency, width */
    123   1.1    nonaka 	.bus_power		= pxamci_bus_power,
    124   1.1    nonaka 	.bus_clock		= pxamci_bus_clock,
    125   1.1    nonaka 	.bus_width		= pxamci_bus_width,
    126   1.7  kiyohara 	.bus_rod		= pxamci_bus_rod,
    127   1.1    nonaka 
    128   1.1    nonaka 	/* command execution */
    129   1.1    nonaka 	.exec_command		= pxamci_exec_command,
    130   1.1    nonaka 
    131   1.1    nonaka 	/* card interrupt */
    132   1.1    nonaka 	.card_enable_intr	= pxamci_card_enable_intr,
    133   1.1    nonaka 	.card_intr_ack		= pxamci_card_intr_ack,
    134   1.1    nonaka };
    135   1.1    nonaka 
    136   1.1    nonaka static int	pxamci_intr(void *);
    137   1.1    nonaka static void	pxamci_intr_cmd(struct pxamci_softc *);
    138   1.1    nonaka static void	pxamci_intr_data(struct pxamci_softc *);
    139   1.1    nonaka static void	pxamci_intr_done(struct pxamci_softc *);
    140   1.1    nonaka static void	pxamci_dmac_iintr(struct dmac_xfer *, int);
    141   1.1    nonaka static void	pxamci_dmac_ointr(struct dmac_xfer *, int);
    142   1.1    nonaka 
    143   1.1    nonaka static void	pxamci_stop_clock(struct pxamci_softc *);
    144   1.1    nonaka 
    145   1.1    nonaka #define CSR_READ_1(sc, reg) \
    146   1.1    nonaka 	bus_space_read_1((sc)->sc_iot, (sc)->sc_ioh, (reg))
    147   1.1    nonaka #define CSR_WRITE_1(sc, reg, val) \
    148   1.1    nonaka 	bus_space_write_1((sc)->sc_iot, (sc)->sc_ioh, (reg), (val))
    149   1.1    nonaka #define CSR_READ_4(sc, reg) \
    150   1.1    nonaka 	bus_space_read_4((sc)->sc_iot, (sc)->sc_ioh, (reg))
    151   1.1    nonaka #define CSR_WRITE_4(sc, reg, val) \
    152   1.1    nonaka 	bus_space_write_4((sc)->sc_iot, (sc)->sc_ioh, (reg), (val))
    153   1.1    nonaka #define CSR_SET_4(sc, reg, val) \
    154   1.1    nonaka 	CSR_WRITE_4(sc, reg, CSR_READ_4(sc, reg) | (val))
    155   1.1    nonaka #define CSR_CLR_4(sc, reg, val) \
    156   1.1    nonaka 	CSR_WRITE_4(sc, reg, CSR_READ_4(sc, reg) & ~(val))
    157   1.1    nonaka 
    158   1.5    nonaka #if 0	/* XXX */
    159   1.5    nonaka #define	DMA_ALIGNED(addr) \
    160   1.5    nonaka 	(((u_long)(addr) & 0x7) == 0 || !CPU_IS_PXA250)
    161   1.5    nonaka #else
    162   1.5    nonaka #define	DMA_ALIGNED(addr) \
    163   1.5    nonaka 	(((u_long)(addr) & 0x1f) == 0)
    164   1.5    nonaka #endif
    165   1.5    nonaka 
    166   1.1    nonaka static void
    167   1.1    nonaka pxamci_enable_intr(struct pxamci_softc *sc, uint32_t mask)
    168   1.1    nonaka {
    169   1.1    nonaka 	int s;
    170   1.1    nonaka 
    171   1.1    nonaka 	s = splsdmmc();
    172   1.1    nonaka 	sc->sc_imask &= ~mask;
    173   1.1    nonaka 	CSR_WRITE_4(sc, MMC_I_MASK, sc->sc_imask);
    174   1.1    nonaka 	splx(s);
    175   1.1    nonaka }
    176   1.1    nonaka 
    177   1.1    nonaka static void
    178   1.1    nonaka pxamci_disable_intr(struct pxamci_softc *sc, uint32_t mask)
    179   1.1    nonaka {
    180   1.1    nonaka 	int s;
    181   1.1    nonaka 
    182   1.1    nonaka 	s = splsdmmc();
    183   1.1    nonaka 	sc->sc_imask |= mask;
    184   1.1    nonaka 	CSR_WRITE_4(sc, MMC_I_MASK, sc->sc_imask);
    185   1.1    nonaka 	splx(s);
    186   1.1    nonaka }
    187   1.1    nonaka 
    188   1.1    nonaka int
    189   1.1    nonaka pxamci_attach_sub(device_t self, struct pxaip_attach_args *pxa)
    190   1.1    nonaka {
    191   1.1    nonaka 	struct pxamci_softc *sc = device_private(self);
    192   1.1    nonaka 	struct sdmmcbus_attach_args saa;
    193   1.1    nonaka 
    194   1.1    nonaka 	sc->sc_dev = self;
    195   1.1    nonaka 
    196   1.1    nonaka 	aprint_normal(": MMC/SD Controller\n");
    197   1.1    nonaka 	aprint_naive("\n");
    198   1.1    nonaka 
    199   1.1    nonaka 	/* Enable the clocks to the MMC controller. */
    200   1.1    nonaka 	pxa2x0_clkman_config(CKEN_MMC, 1);
    201   1.1    nonaka 
    202   1.1    nonaka 	sc->sc_iot = pxa->pxa_iot;
    203   1.1    nonaka 	if (bus_space_map(sc->sc_iot, PXA2X0_MMC_BASE, PXA2X0_MMC_SIZE, 0,
    204   1.1    nonaka 	    &sc->sc_ioh)) {
    205   1.1    nonaka 		aprint_error_dev(sc->sc_dev, "couldn't map registers\n");
    206   1.1    nonaka 		goto out;
    207   1.1    nonaka 	}
    208   1.1    nonaka 
    209   1.1    nonaka 	/*
    210   1.1    nonaka 	 * Establish the card detection and MMC interrupt handlers and
    211   1.1    nonaka 	 * mask all interrupts until we are prepared to handle them.
    212   1.1    nonaka 	 */
    213   1.1    nonaka 	pxamci_disable_intr(sc, MMC_I_ALL);
    214   1.1    nonaka 	sc->sc_ih = pxa2x0_intr_establish(PXA2X0_INT_MMC, IPL_SDMMC,
    215   1.1    nonaka 	    pxamci_intr, sc);
    216   1.1    nonaka 	if (sc->sc_ih == NULL) {
    217   1.1    nonaka 		aprint_error_dev(sc->sc_dev,
    218   1.1    nonaka 		    "couldn't establish MMC interrupt\n");
    219   1.1    nonaka 		goto free_map;
    220   1.1    nonaka 	}
    221   1.1    nonaka 
    222   1.1    nonaka 	/*
    223   1.1    nonaka 	 * Reset the host controller and unmask normal interrupts.
    224   1.1    nonaka 	 */
    225   1.1    nonaka 	(void) pxamci_host_reset(sc);
    226   1.1    nonaka 
    227   1.1    nonaka 	/* Setup bus clock */
    228   1.1    nonaka 	if (CPU_IS_PXA270) {
    229   1.1    nonaka 		sc->sc_clkmin = PXA270_MMC_CLKRT_MIN / 1000;
    230   1.1    nonaka 		sc->sc_clkmax = PXA270_MMC_CLKRT_MAX / 1000;
    231   1.1    nonaka 	} else {
    232   1.1    nonaka 		sc->sc_clkmin = PXA250_MMC_CLKRT_MIN / 1000;
    233   1.1    nonaka 		sc->sc_clkmax = PXA250_MMC_CLKRT_MAX / 1000;
    234   1.1    nonaka 	}
    235   1.1    nonaka 	sc->sc_clkbase = sc->sc_clkmin;
    236   1.1    nonaka 	pxamci_bus_clock(sc, sc->sc_clkbase);
    237   1.1    nonaka 
    238   1.1    nonaka 	/* Setup max block length */
    239   1.1    nonaka 	if (CPU_IS_PXA270) {
    240   1.1    nonaka 		sc->sc_maxblklen = 2048;
    241   1.1    nonaka 	} else {
    242   1.1    nonaka 		sc->sc_maxblklen = 512;
    243   1.1    nonaka 	}
    244   1.1    nonaka 
    245   1.1    nonaka 	/* Set default bus width */
    246   1.1    nonaka 	sc->sc_buswidth = 1;
    247   1.1    nonaka 
    248   1.1    nonaka 	/* setting DMA */
    249   1.1    nonaka 	if (!ISSET(sc->sc_caps, PMC_CAPS_NO_DMA)) {
    250   1.3    nonaka 		aprint_normal_dev(sc->sc_dev, "using DMA transfer\n");
    251   1.3    nonaka 
    252   1.1    nonaka 		sc->sc_rxdr.ds_addr = PXA2X0_MMC_BASE + MMC_RXFIFO;
    253   1.1    nonaka 		sc->sc_rxdr.ds_len = 1;
    254   1.9  jmcneill 		sc->sc_rxdx = pxa2x0_dmac_allocate_xfer();
    255   1.1    nonaka 		if (sc->sc_rxdx == NULL) {
    256   1.1    nonaka 			aprint_error_dev(sc->sc_dev,
    257   1.1    nonaka 			    "couldn't alloc rx dma xfer\n");
    258   1.1    nonaka 			goto free_intr;
    259   1.1    nonaka 		}
    260   1.1    nonaka 		sc->sc_rxdx->dx_cookie = sc;
    261   1.1    nonaka 		sc->sc_rxdx->dx_priority = DMAC_PRIORITY_NORMAL;
    262   1.1    nonaka 		sc->sc_rxdx->dx_dev_width = DMAC_DEV_WIDTH_1;
    263   1.1    nonaka 		sc->sc_rxdx->dx_burst_size = DMAC_BURST_SIZE_32;
    264   1.1    nonaka 		sc->sc_rxdx->dx_done = pxamci_dmac_iintr;
    265   1.1    nonaka 		sc->sc_rxdx->dx_peripheral = DMAC_PERIPH_MMCRX;
    266   1.1    nonaka 		sc->sc_rxdx->dx_flow = DMAC_FLOW_CTRL_SRC;
    267   1.1    nonaka 		sc->sc_rxdx->dx_loop_notify = DMAC_DONT_LOOP;
    268   1.1    nonaka 		sc->sc_rxdx->dx_desc[DMAC_DESC_SRC].xd_addr_hold = true;
    269   1.1    nonaka 		sc->sc_rxdx->dx_desc[DMAC_DESC_SRC].xd_nsegs = 1;
    270   1.1    nonaka 		sc->sc_rxdx->dx_desc[DMAC_DESC_SRC].xd_dma_segs = &sc->sc_rxdr;
    271   1.1    nonaka 		sc->sc_rxdx->dx_desc[DMAC_DESC_DST].xd_addr_hold = false;
    272   1.1    nonaka 
    273   1.1    nonaka 		sc->sc_txdr.ds_addr = PXA2X0_MMC_BASE + MMC_TXFIFO;
    274   1.1    nonaka 		sc->sc_txdr.ds_len = 1;
    275   1.9  jmcneill 		sc->sc_txdx = pxa2x0_dmac_allocate_xfer();
    276   1.1    nonaka 		if (sc->sc_txdx == NULL) {
    277   1.1    nonaka 			aprint_error_dev(sc->sc_dev,
    278   1.1    nonaka 			    "couldn't alloc tx dma xfer\n");
    279   1.1    nonaka 			goto free_xfer;
    280   1.1    nonaka 		}
    281   1.1    nonaka 		sc->sc_txdx->dx_cookie = sc;
    282   1.1    nonaka 		sc->sc_txdx->dx_priority = DMAC_PRIORITY_NORMAL;
    283   1.1    nonaka 		sc->sc_txdx->dx_dev_width = DMAC_DEV_WIDTH_1;
    284   1.1    nonaka 		sc->sc_txdx->dx_burst_size = DMAC_BURST_SIZE_32;
    285   1.1    nonaka 		sc->sc_txdx->dx_done = pxamci_dmac_ointr;
    286   1.1    nonaka 		sc->sc_txdx->dx_peripheral = DMAC_PERIPH_MMCTX;
    287   1.1    nonaka 		sc->sc_txdx->dx_flow = DMAC_FLOW_CTRL_DEST;
    288   1.1    nonaka 		sc->sc_txdx->dx_loop_notify = DMAC_DONT_LOOP;
    289   1.1    nonaka 		sc->sc_txdx->dx_desc[DMAC_DESC_DST].xd_addr_hold = true;
    290   1.1    nonaka 		sc->sc_txdx->dx_desc[DMAC_DESC_DST].xd_nsegs = 1;
    291   1.1    nonaka 		sc->sc_txdx->dx_desc[DMAC_DESC_DST].xd_dma_segs = &sc->sc_txdr;
    292   1.1    nonaka 		sc->sc_txdx->dx_desc[DMAC_DESC_SRC].xd_addr_hold = false;
    293   1.1    nonaka 	}
    294   1.1    nonaka 
    295   1.1    nonaka 	/*
    296   1.1    nonaka 	 * Attach the generic SD/MMC bus driver.  (The bus driver must
    297   1.1    nonaka 	 * not invoke any chipset functions before it is attached.)
    298   1.1    nonaka 	 */
    299   1.1    nonaka 	memset(&saa, 0, sizeof(saa));
    300   1.1    nonaka 	saa.saa_busname = "sdmmc";
    301   1.1    nonaka 	saa.saa_sct = &pxamci_chip_functions;
    302   1.1    nonaka 	saa.saa_sch = sc;
    303   1.1    nonaka 	saa.saa_dmat = pxa->pxa_dmat;
    304   1.1    nonaka 	saa.saa_clkmin = sc->sc_clkmin;
    305   1.1    nonaka 	saa.saa_clkmax = sc->sc_clkmax;
    306   1.1    nonaka 	saa.saa_caps = 0;
    307   1.1    nonaka 	if (!ISSET(sc->sc_caps, PMC_CAPS_NO_DMA))
    308   1.6  kiyohara 		SET(saa.saa_caps, SMC_CAPS_DMA | SMC_CAPS_MULTI_SEG_DMA);
    309   1.1    nonaka 	if (CPU_IS_PXA270 && ISSET(sc->sc_caps, PMC_CAPS_4BIT))
    310   1.1    nonaka 		SET(saa.saa_caps, SMC_CAPS_4BIT_MODE);
    311   1.1    nonaka 
    312  1.12   thorpej 	sc->sc_sdmmc = config_found(sc->sc_dev, &saa, NULL, CFARGS_NONE);
    313   1.1    nonaka 	if (sc->sc_sdmmc == NULL) {
    314   1.1    nonaka 		aprint_error_dev(sc->sc_dev, "couldn't attach bus\n");
    315   1.1    nonaka 		goto free_xfer;
    316   1.1    nonaka 	}
    317   1.1    nonaka 	return 0;
    318   1.1    nonaka 
    319   1.1    nonaka free_xfer:
    320   1.1    nonaka 	if (!ISSET(sc->sc_caps, PMC_CAPS_NO_DMA)) {
    321   1.1    nonaka 		if (sc->sc_rxdx)
    322   1.1    nonaka 			pxa2x0_dmac_free_xfer(sc->sc_rxdx);
    323   1.1    nonaka 		if (sc->sc_txdx)
    324   1.1    nonaka 			pxa2x0_dmac_free_xfer(sc->sc_txdx);
    325   1.1    nonaka 	}
    326   1.1    nonaka free_intr:
    327   1.1    nonaka 	pxa2x0_intr_disestablish(sc->sc_ih);
    328   1.1    nonaka 	sc->sc_ih = NULL;
    329   1.1    nonaka free_map:
    330   1.1    nonaka 	bus_space_unmap(sc->sc_iot, sc->sc_ioh, PXA2X0_MMC_SIZE);
    331   1.1    nonaka out:
    332   1.1    nonaka 	pxa2x0_clkman_config(CKEN_MMC, 0);
    333   1.1    nonaka 	return 1;
    334   1.1    nonaka }
    335   1.1    nonaka 
    336   1.1    nonaka /*
    337   1.1    nonaka  * Notify card attach/detach event.
    338   1.1    nonaka  */
    339   1.1    nonaka void
    340   1.1    nonaka pxamci_card_detect_event(struct pxamci_softc *sc)
    341   1.1    nonaka {
    342   1.1    nonaka 
    343   1.1    nonaka 	sdmmc_needs_discover(sc->sc_sdmmc);
    344   1.1    nonaka }
    345   1.1    nonaka 
    346   1.1    nonaka /*
    347   1.1    nonaka  * Reset the host controller.  Called during initialization, when
    348   1.1    nonaka  * cards are removed, upon resume, and during error recovery.
    349   1.1    nonaka  */
    350   1.1    nonaka static int
    351   1.1    nonaka pxamci_host_reset(sdmmc_chipset_handle_t sch)
    352   1.1    nonaka {
    353   1.1    nonaka 	struct pxamci_softc *sc = (struct pxamci_softc *)sch;
    354   1.1    nonaka 	int s;
    355   1.1    nonaka 
    356   1.1    nonaka 	s = splsdmmc();
    357   1.1    nonaka 
    358   1.1    nonaka 	CSR_WRITE_4(sc, MMC_SPI, 0);
    359   1.1    nonaka 	CSR_WRITE_4(sc, MMC_RESTO, 0x7f);
    360   1.1    nonaka 	CSR_WRITE_4(sc, MMC_I_MASK, sc->sc_imask);
    361   1.1    nonaka 
    362   1.1    nonaka 	/* Make sure to initialize the card before the next command. */
    363   1.1    nonaka 	CLR(sc->sc_flags, PMF_CARDINITED);
    364   1.1    nonaka 
    365   1.1    nonaka 	splx(s);
    366   1.1    nonaka 
    367   1.1    nonaka 	return 0;
    368   1.1    nonaka }
    369   1.1    nonaka 
    370   1.1    nonaka static uint32_t
    371   1.1    nonaka pxamci_host_ocr(sdmmc_chipset_handle_t sch)
    372   1.1    nonaka {
    373   1.1    nonaka 	struct pxamci_softc *sc = (struct pxamci_softc *)sch;
    374   1.1    nonaka 	int rv;
    375   1.1    nonaka 
    376   1.1    nonaka 	if (__predict_true(sc->sc_tag.get_ocr != NULL)) {
    377   1.1    nonaka 		rv = (*sc->sc_tag.get_ocr)(sc->sc_tag.cookie);
    378   1.1    nonaka 		return rv;
    379   1.1    nonaka 	}
    380   1.1    nonaka 
    381   1.1    nonaka 	DPRINTF(0,("%s: driver lacks get_ocr() function.\n",
    382   1.1    nonaka 	    device_xname(sc->sc_dev)));
    383   1.1    nonaka 	return ENXIO;
    384   1.1    nonaka }
    385   1.1    nonaka 
    386   1.1    nonaka static int
    387   1.1    nonaka pxamci_host_maxblklen(sdmmc_chipset_handle_t sch)
    388   1.1    nonaka {
    389   1.1    nonaka 	struct pxamci_softc *sc = (struct pxamci_softc *)sch;
    390   1.1    nonaka 
    391   1.1    nonaka 	return sc->sc_maxblklen;
    392   1.1    nonaka }
    393   1.1    nonaka 
    394   1.1    nonaka static int
    395   1.1    nonaka pxamci_card_detect(sdmmc_chipset_handle_t sch)
    396   1.1    nonaka {
    397   1.1    nonaka 	struct pxamci_softc *sc = (struct pxamci_softc *)sch;
    398   1.1    nonaka 
    399   1.1    nonaka 	if (__predict_true(sc->sc_tag.card_detect != NULL)) {
    400   1.1    nonaka 		return (*sc->sc_tag.card_detect)(sc->sc_tag.cookie);
    401   1.1    nonaka 	}
    402   1.1    nonaka 
    403   1.1    nonaka 	DPRINTF(0,("%s: driver lacks card_detect() function.\n",
    404   1.1    nonaka 	    device_xname(sc->sc_dev)));
    405   1.1    nonaka 	return 1;	/* always detect */
    406   1.1    nonaka }
    407   1.1    nonaka 
    408   1.1    nonaka static int
    409   1.1    nonaka pxamci_write_protect(sdmmc_chipset_handle_t sch)
    410   1.1    nonaka {
    411   1.1    nonaka 	struct pxamci_softc *sc = (struct pxamci_softc *)sch;
    412   1.1    nonaka 
    413   1.1    nonaka 	if (__predict_true(sc->sc_tag.write_protect != NULL)) {
    414   1.1    nonaka 		return (*sc->sc_tag.write_protect)(sc->sc_tag.cookie);
    415   1.1    nonaka 	}
    416   1.1    nonaka 
    417   1.1    nonaka 	DPRINTF(0,("%s: driver lacks write_protect() function.\n",
    418   1.1    nonaka 	    device_xname(sc->sc_dev)));
    419   1.1    nonaka 	return 0;	/* non-protect */
    420   1.1    nonaka }
    421   1.1    nonaka 
    422   1.1    nonaka /*
    423   1.1    nonaka  * Set or change SD bus voltage and enable or disable SD bus power.
    424   1.1    nonaka  * Return zero on success.
    425   1.1    nonaka  */
    426   1.1    nonaka static int
    427   1.1    nonaka pxamci_bus_power(sdmmc_chipset_handle_t sch, uint32_t ocr)
    428   1.1    nonaka {
    429   1.1    nonaka 	struct pxamci_softc *sc = (struct pxamci_softc *)sch;
    430   1.1    nonaka 
    431   1.1    nonaka 	/*
    432   1.1    nonaka 	 * Bus power management is beyond control of the SD/SDIO/MMC
    433   1.1    nonaka 	 * block of the PXA2xx processors, so we have to hand this
    434   1.1    nonaka 	 * task off to the attachment driver.
    435   1.1    nonaka 	 */
    436   1.1    nonaka 	if (__predict_true(sc->sc_tag.set_power != NULL)) {
    437   1.1    nonaka 		return (*sc->sc_tag.set_power)(sc->sc_tag.cookie, ocr);
    438   1.1    nonaka 	}
    439   1.1    nonaka 
    440   1.1    nonaka 	DPRINTF(0,("%s: driver lacks set_power() function\n",
    441   1.1    nonaka 	    device_xname(sc->sc_dev)));
    442   1.1    nonaka 	return ENXIO;
    443   1.1    nonaka }
    444   1.1    nonaka 
    445   1.1    nonaka /*
    446   1.1    nonaka  * Set or change MMCLK frequency or disable the MMC clock.
    447   1.1    nonaka  * Return zero on success.
    448   1.1    nonaka  */
    449   1.1    nonaka static int
    450   1.1    nonaka pxamci_bus_clock(sdmmc_chipset_handle_t sch, int freq)
    451   1.1    nonaka {
    452   1.1    nonaka 	struct pxamci_softc *sc = (struct pxamci_softc *)sch;
    453   1.1    nonaka 	int actfreq;
    454   1.1    nonaka 	int div;
    455   1.1    nonaka 	int rv = 0;
    456   1.1    nonaka 	int s;
    457   1.1    nonaka 
    458   1.1    nonaka 	s = splsdmmc();
    459   1.1    nonaka 
    460   1.1    nonaka 	/*
    461   1.1    nonaka 	 * Stop MMC clock before changing the frequency.
    462   1.1    nonaka 	 */
    463   1.1    nonaka 	pxamci_stop_clock(sc);
    464   1.1    nonaka 
    465   1.1    nonaka 	/* Just stop the clock. */
    466   1.1    nonaka 	if (freq == 0)
    467   1.1    nonaka 		goto out;
    468   1.1    nonaka 
    469   1.1    nonaka 	/*
    470   1.1    nonaka 	 * PXA27x Errata...
    471   1.1    nonaka 	 *
    472   1.1    nonaka 	 * <snip>
    473   1.1    nonaka 	 * E40. SDIO: SDIO Devices Not Working at 19.5 Mbps
    474   1.1    nonaka 	 *
    475   1.1    nonaka 	 * SD/SDIO controller can only support up to 9.75 Mbps data
    476   1.1    nonaka 	 * transfer rate for SDIO card.
    477   1.1    nonaka 	 * </snip>
    478   1.1    nonaka 	 *
    479   1.1    nonaka 	 * If we don't limit the frequency, CRC errors will be
    480   1.1    nonaka 	 * reported by the controller after we set the bus speed.
    481   1.1    nonaka 	 * XXX slow down incrementally.
    482   1.1    nonaka 	 */
    483   1.1    nonaka 	if (CPU_IS_PXA270) {
    484   1.1    nonaka 		if (freq > 9750) {
    485   1.1    nonaka 			freq = 9750;
    486   1.1    nonaka 		}
    487   1.1    nonaka 	}
    488   1.1    nonaka 
    489   1.1    nonaka 	/*
    490   1.1    nonaka 	 * Pick the smallest divider that produces a frequency not
    491   1.1    nonaka 	 * more than `freq' KHz.
    492   1.1    nonaka 	 */
    493   1.1    nonaka 	actfreq = sc->sc_clkmax;
    494   1.1    nonaka 	for (div = 0; div < 7; actfreq /= 2, div++) {
    495   1.1    nonaka 		if (actfreq <= freq)
    496   1.1    nonaka 			break;
    497   1.1    nonaka 	}
    498   1.1    nonaka 	if (div == 7) {
    499   1.1    nonaka 		aprint_error_dev(sc->sc_dev,
    500   1.1    nonaka 		    "unsupported bus frequency of %d KHz\n", freq);
    501   1.1    nonaka 		rv = 1;
    502   1.1    nonaka 		goto out;
    503   1.1    nonaka 	}
    504   1.1    nonaka 
    505   1.1    nonaka 	DPRINTF(1,("%s: freq = %d, actfreq = %d, div = %d\n",
    506   1.1    nonaka 	    device_xname(sc->sc_dev), freq, actfreq, div));
    507   1.1    nonaka 
    508   1.1    nonaka 	sc->sc_clkbase = actfreq;
    509   1.1    nonaka 	sc->sc_clkrt = div;
    510   1.1    nonaka 
    511   1.3    nonaka 	CSR_WRITE_4(sc, MMC_CLKRT, sc->sc_clkrt);
    512   1.3    nonaka 	CSR_WRITE_4(sc, MMC_STRPCL, STRPCL_START);
    513   1.3    nonaka 
    514   1.1    nonaka  out:
    515   1.1    nonaka 	splx(s);
    516   1.1    nonaka 
    517   1.1    nonaka 	return rv;
    518   1.1    nonaka }
    519   1.1    nonaka 
    520   1.1    nonaka static int
    521   1.1    nonaka pxamci_bus_width(sdmmc_chipset_handle_t sch, int width)
    522   1.1    nonaka {
    523   1.1    nonaka 	struct pxamci_softc *sc = (struct pxamci_softc *)sch;
    524   1.1    nonaka 	int rv = 0;
    525   1.1    nonaka 	int s;
    526   1.1    nonaka 
    527   1.1    nonaka 	s = splsdmmc();
    528   1.1    nonaka 
    529   1.1    nonaka 	switch (width) {
    530   1.1    nonaka 	case 1:
    531   1.1    nonaka 		break;
    532   1.1    nonaka 	case 4:
    533   1.1    nonaka 		if (CPU_IS_PXA270)
    534   1.1    nonaka 			break;
    535   1.1    nonaka 		/*FALLTHROUGH*/
    536   1.1    nonaka 	default:
    537   1.1    nonaka 		DPRINTF(0,("%s: unsupported bus width (%d)\n",
    538   1.1    nonaka 		    device_xname(sc->sc_dev), width));
    539   1.1    nonaka 		rv = 1;
    540   1.1    nonaka 		goto out;
    541   1.1    nonaka 	}
    542   1.1    nonaka 
    543   1.1    nonaka 	sc->sc_buswidth = width;
    544   1.1    nonaka 
    545   1.1    nonaka  out:
    546   1.1    nonaka 	splx(s);
    547   1.1    nonaka 
    548   1.1    nonaka 	return rv;
    549   1.1    nonaka }
    550   1.1    nonaka 
    551   1.7  kiyohara static int
    552   1.7  kiyohara pxamci_bus_rod(sdmmc_chipset_handle_t sch, int on)
    553   1.7  kiyohara {
    554   1.7  kiyohara 
    555   1.7  kiyohara 	/* not support */
    556   1.7  kiyohara 	return -1;
    557   1.7  kiyohara }
    558   1.7  kiyohara 
    559   1.1    nonaka static void
    560   1.1    nonaka pxamci_exec_command(sdmmc_chipset_handle_t sch, struct sdmmc_command *cmd)
    561   1.1    nonaka {
    562   1.1    nonaka 	struct pxamci_softc *sc = (struct pxamci_softc *)sch;
    563   1.1    nonaka 	uint32_t cmdat;
    564   1.1    nonaka 	int error;
    565   1.1    nonaka 	int timo;
    566   1.1    nonaka 	int s;
    567   1.1    nonaka 
    568   1.4    nonaka 	DPRINTF(1,("%s: start cmd %d arg=%#x data=%p dlen=%d flags=%#x\n",
    569   1.4    nonaka 	    device_xname(sc->sc_dev), cmd->c_opcode, cmd->c_arg, cmd->c_data,
    570   1.4    nonaka 	    cmd->c_datalen, cmd->c_flags));
    571   1.1    nonaka 
    572   1.1    nonaka 	s = splsdmmc();
    573   1.1    nonaka 
    574   1.1    nonaka 	/* Stop the bus clock (MMCLK). [15.8.3] */
    575   1.1    nonaka 	pxamci_stop_clock(sc);
    576   1.1    nonaka 
    577   1.1    nonaka 	/* Set the command and argument. */
    578   1.1    nonaka 	CSR_WRITE_4(sc, MMC_CMD, cmd->c_opcode & CMD_MASK);
    579   1.1    nonaka 	CSR_WRITE_4(sc, MMC_ARGH, (cmd->c_arg >> 16) & ARGH_MASK);
    580   1.1    nonaka 	CSR_WRITE_4(sc, MMC_ARGL, cmd->c_arg & ARGL_MASK);
    581   1.1    nonaka 
    582   1.1    nonaka 	/* Response type */
    583   1.1    nonaka 	if (!ISSET(cmd->c_flags, SCF_RSP_PRESENT))
    584   1.1    nonaka 		cmdat = CMDAT_RESPONSE_FORMAT_NO;
    585   1.1    nonaka 	else if (ISSET(cmd->c_flags, SCF_RSP_136))
    586   1.1    nonaka 		cmdat = CMDAT_RESPONSE_FORMAT_R2;
    587   1.1    nonaka 	else if (!ISSET(cmd->c_flags, SCF_RSP_CRC))
    588   1.1    nonaka 		cmdat = CMDAT_RESPONSE_FORMAT_R3;
    589   1.1    nonaka 	else
    590   1.1    nonaka 		cmdat = CMDAT_RESPONSE_FORMAT_R1;
    591   1.1    nonaka 
    592   1.1    nonaka 	if (ISSET(cmd->c_flags, SCF_RSP_BSY))
    593   1.1    nonaka 		cmdat |= CMDAT_BUSY;
    594   1.1    nonaka 	if (!ISSET(cmd->c_flags, SCF_CMD_READ))
    595   1.1    nonaka 		cmdat |= CMDAT_WRITE;
    596   1.1    nonaka 	if (sc->sc_buswidth == 4)
    597   1.1    nonaka 		cmdat |= CMDAT_SD_4DAT;
    598   1.1    nonaka 
    599   1.1    nonaka 	/* Fragment the data into proper blocks. */
    600   1.1    nonaka 	if (cmd->c_datalen > 0) {
    601   1.1    nonaka 		int blklen = MIN(cmd->c_datalen, cmd->c_blklen);
    602   1.1    nonaka 		int numblk = cmd->c_datalen / blklen;
    603   1.1    nonaka 
    604   1.1    nonaka 		if (cmd->c_datalen % blklen > 0) {
    605   1.1    nonaka 			/* XXX: Split this command. (1.7.4) */
    606   1.1    nonaka 			aprint_error_dev(sc->sc_dev,
    607   1.1    nonaka 			    "data not a multiple of %u bytes\n", blklen);
    608   1.1    nonaka 			cmd->c_error = EINVAL;
    609   1.1    nonaka 			goto out;
    610   1.1    nonaka 		}
    611   1.1    nonaka 
    612   1.1    nonaka 		/* Check limit imposed by block count. */
    613   1.1    nonaka 		if (numblk > NOB_MASK) {
    614   1.1    nonaka 			aprint_error_dev(sc->sc_dev, "too much data\n");
    615   1.1    nonaka 			cmd->c_error = EINVAL;
    616   1.1    nonaka 			goto out;
    617   1.1    nonaka 		}
    618   1.1    nonaka 
    619   1.1    nonaka 		CSR_WRITE_4(sc, MMC_BLKLEN, blklen);
    620   1.1    nonaka 		CSR_WRITE_4(sc, MMC_NOB, numblk);
    621   1.1    nonaka 		CSR_WRITE_4(sc, MMC_RDTO, RDTO_MASK);
    622   1.1    nonaka 
    623   1.1    nonaka 		cmdat |= CMDAT_DATA_EN;
    624   1.1    nonaka 
    625   1.1    nonaka 		/* setting DMA */
    626   1.5    nonaka 		if (!ISSET(sc->sc_caps, PMC_CAPS_NO_DMA)
    627   1.5    nonaka 		 && DMA_ALIGNED(cmd->c_data)) {
    628   1.1    nonaka 			struct dmac_xfer_desc *dx_desc;
    629   1.1    nonaka 
    630   1.5    nonaka 			DPRINTF(1,("%s: using DMA\n",device_xname(sc->sc_dev)));
    631   1.5    nonaka 
    632   1.1    nonaka 			cmdat |= CMDAT_MMC_DMA_EN;
    633   1.1    nonaka 
    634   1.1    nonaka 			if (ISSET(cmd->c_flags, SCF_CMD_READ)) {
    635   1.1    nonaka 				dx_desc = &sc->sc_rxdx->dx_desc[DMAC_DESC_DST];
    636   1.1    nonaka 				dx_desc->xd_nsegs = cmd->c_dmamap->dm_nsegs;
    637   1.1    nonaka 				dx_desc->xd_dma_segs = cmd->c_dmamap->dm_segs;
    638   1.1    nonaka 				error = pxa2x0_dmac_start_xfer(sc->sc_rxdx);
    639   1.1    nonaka 			} else {
    640   1.1    nonaka 				dx_desc = &sc->sc_txdx->dx_desc[DMAC_DESC_SRC];
    641   1.1    nonaka 				dx_desc->xd_nsegs = cmd->c_dmamap->dm_nsegs;
    642   1.1    nonaka 				dx_desc->xd_dma_segs = cmd->c_dmamap->dm_segs;
    643   1.1    nonaka 				/* workaround for erratum #91 */
    644   1.1    nonaka 				error = 0;
    645   1.1    nonaka 				if (!CPU_IS_PXA270) {
    646   1.1    nonaka 					error =
    647   1.1    nonaka 					    pxa2x0_dmac_start_xfer(sc->sc_txdx);
    648   1.1    nonaka 				}
    649   1.1    nonaka 			}
    650   1.1    nonaka 			if (error) {
    651   1.1    nonaka 				aprint_error_dev(sc->sc_dev,
    652   1.1    nonaka 				    "couldn't start dma xfer. (error=%d)\n",
    653   1.1    nonaka 				    error);
    654   1.1    nonaka 				cmd->c_error = EIO;
    655   1.1    nonaka 				goto err;
    656   1.1    nonaka 			}
    657   1.1    nonaka 		} else {
    658   1.5    nonaka 			DPRINTF(1,("%s: using PIO\n",device_xname(sc->sc_dev)));
    659   1.5    nonaka 
    660   1.1    nonaka 			cmd->c_resid = cmd->c_datalen;
    661   1.1    nonaka 			cmd->c_buf = cmd->c_data;
    662   1.1    nonaka 
    663   1.1    nonaka 			pxamci_enable_intr(sc, MMC_I_RXFIFO_RD_REQ
    664   1.1    nonaka 					       | MMC_I_TXFIFO_WR_REQ
    665   1.1    nonaka 					       | MMC_I_DAT_ERR);
    666   1.1    nonaka 		}
    667   1.1    nonaka 	}
    668   1.1    nonaka 
    669   1.1    nonaka 	sc->sc_cmd = cmd;
    670   1.1    nonaka 
    671   1.1    nonaka 	/*
    672   1.1    nonaka 	 * "After reset, the MMC card must be initialized by sending
    673   1.1    nonaka 	 * 80 clocks to it on the MMCLK signal." [15.4.3.2]
    674   1.1    nonaka 	 */
    675   1.1    nonaka 	if (!ISSET(sc->sc_flags, PMF_CARDINITED)) {
    676   1.1    nonaka 		DPRINTF(1,("%s: first command\n", device_xname(sc->sc_dev)));
    677   1.1    nonaka 		cmdat |= CMDAT_INIT;
    678   1.1    nonaka 		SET(sc->sc_flags, PMF_CARDINITED);
    679   1.1    nonaka 	}
    680   1.1    nonaka 
    681   1.1    nonaka 	/* Begin the transfer and start the bus clock. */
    682   1.1    nonaka 	CSR_WRITE_4(sc, MMC_CMDAT, cmdat);
    683   1.1    nonaka 	CSR_WRITE_4(sc, MMC_CLKRT, sc->sc_clkrt);
    684   1.1    nonaka 	CSR_WRITE_4(sc, MMC_STRPCL, STRPCL_START);
    685   1.1    nonaka 
    686   1.1    nonaka 	/* Wait for it to complete */
    687   1.1    nonaka 	pxamci_enable_intr(sc, MMC_I_END_CMD_RES|MMC_I_RES_ERR);
    688   1.1    nonaka 	for (timo = EXECCMD_TIMO; (sc->sc_cmd == cmd) && (timo > 0); timo--) {
    689   1.1    nonaka 		tsleep(sc, PWAIT, "mmcmd", hz);
    690   1.1    nonaka 	}
    691   1.1    nonaka 
    692   1.1    nonaka 	/* If it completed in time, SCF_ITSDONE is already set. */
    693   1.1    nonaka 	if (sc->sc_cmd == cmd) {
    694   1.1    nonaka 		cmd->c_error = ETIMEDOUT;
    695   1.1    nonaka err:
    696   1.1    nonaka 		SET(cmd->c_flags, SCF_ITSDONE);
    697   1.1    nonaka 		sc->sc_cmd = NULL;
    698   1.1    nonaka 		goto out;
    699   1.1    nonaka 	}
    700   1.1    nonaka 
    701   1.1    nonaka out:
    702   1.1    nonaka 	splx(s);
    703   1.1    nonaka 
    704   1.1    nonaka 	DPRINTF(1,("%s: cmd %d done (flags=%08x error=%d)\n",
    705   1.1    nonaka 	  device_xname(sc->sc_dev), cmd->c_opcode, cmd->c_flags, cmd->c_error));
    706   1.1    nonaka }
    707   1.1    nonaka 
    708   1.1    nonaka static void
    709   1.1    nonaka pxamci_card_enable_intr(sdmmc_chipset_handle_t sch, int enable)
    710   1.1    nonaka {
    711   1.1    nonaka 	struct pxamci_softc *sc = (struct pxamci_softc *)sch;
    712   1.1    nonaka 
    713   1.1    nonaka 	if (enable) {
    714   1.1    nonaka 		pxamci_enable_intr(sc, MMC_I_SDIO_INT);
    715   1.1    nonaka 	} else {
    716   1.1    nonaka 		pxamci_disable_intr(sc, MMC_I_SDIO_INT);
    717   1.1    nonaka 	}
    718   1.1    nonaka }
    719   1.1    nonaka 
    720   1.1    nonaka static void
    721   1.1    nonaka pxamci_card_intr_ack(sdmmc_chipset_handle_t sch)
    722   1.1    nonaka {
    723   1.1    nonaka 
    724   1.1    nonaka 	/* Nothing to do */
    725   1.1    nonaka }
    726   1.1    nonaka 
    727   1.1    nonaka static void
    728   1.1    nonaka pxamci_stop_clock(struct pxamci_softc *sc)
    729   1.1    nonaka {
    730   1.1    nonaka 	int timo = STOPCLK_TIMO;
    731   1.1    nonaka 
    732   1.1    nonaka 	if (ISSET(CSR_READ_4(sc, MMC_STAT), STAT_CLK_EN)) {
    733   1.1    nonaka 		CSR_CLR_4(sc, MMC_I_MASK, MMC_I_CLK_IS_OFF);
    734   1.1    nonaka 		CSR_WRITE_4(sc, MMC_STRPCL, STRPCL_STOP);
    735   1.1    nonaka 		while (ISSET(CSR_READ_4(sc, MMC_STAT), STAT_CLK_EN)
    736   1.1    nonaka 		    && (timo-- > 0)) {
    737   1.1    nonaka 			tsleep(sc, PWAIT, "mmclk", hz);
    738   1.1    nonaka 		}
    739   1.1    nonaka 	}
    740   1.1    nonaka 	if (timo == 0)
    741   1.1    nonaka 		aprint_error_dev(sc->sc_dev, "clock stop timeout\n");
    742   1.1    nonaka }
    743   1.1    nonaka 
    744   1.1    nonaka /*
    745  1.14    andvar  * SD/MMC controller interrupt handler
    746   1.1    nonaka  */
    747   1.1    nonaka static int
    748   1.1    nonaka pxamci_intr(void *arg)
    749   1.1    nonaka {
    750   1.1    nonaka 	struct pxamci_softc *sc = arg;
    751   1.1    nonaka 	int status;
    752   1.1    nonaka #ifdef PXAMCI_DEBUG
    753   1.1    nonaka 	int ostatus;
    754   1.1    nonaka 
    755   1.1    nonaka 	ostatus =
    756   1.1    nonaka #endif
    757   1.1    nonaka 	status = CSR_READ_4(sc, MMC_I_REG) & ~CSR_READ_4(sc, MMC_I_MASK);
    758   1.5    nonaka 	DPRINTF(10,("%s: intr status = %08x\n", device_xname(sc->sc_dev),
    759   1.1    nonaka 	    status));
    760   1.1    nonaka 
    761   1.1    nonaka 	/*
    762   1.1    nonaka 	 * Notify the process waiting in pxamci_clock_stop() when
    763   1.1    nonaka 	 * the clock has really stopped.
    764   1.1    nonaka 	 */
    765   1.1    nonaka 	if (ISSET(status, MMC_I_CLK_IS_OFF)) {
    766   1.1    nonaka 		DPRINTF(2,("%s: clock is now off\n", device_xname(sc->sc_dev)));
    767   1.1    nonaka 		wakeup(sc);
    768   1.1    nonaka 		pxamci_disable_intr(sc, MMC_I_CLK_IS_OFF);
    769   1.1    nonaka 		CLR(status, MMC_I_CLK_IS_OFF);
    770   1.1    nonaka 	}
    771   1.1    nonaka 
    772   1.1    nonaka 	if (sc->sc_cmd == NULL)
    773   1.1    nonaka 		goto end;
    774   1.1    nonaka 
    775   1.1    nonaka 	if (ISSET(status, MMC_I_RES_ERR)) {
    776   1.1    nonaka 		DPRINTF(9, ("%s: handling MMC_I_RES_ERR\n",
    777   1.1    nonaka 		    device_xname(sc->sc_dev)));
    778   1.1    nonaka 		pxamci_disable_intr(sc, MMC_I_RES_ERR);
    779   1.1    nonaka 		CLR(status, MMC_I_RES_ERR|MMC_I_END_CMD_RES);
    780   1.1    nonaka 		if (!ISSET(sc->sc_caps, PMC_CAPS_NO_DMA)
    781   1.5    nonaka 		 && (sc->sc_cmd->c_datalen > 0)
    782   1.5    nonaka 		 && DMA_ALIGNED(sc->sc_cmd->c_data)) {
    783   1.1    nonaka 			if (ISSET(sc->sc_cmd->c_flags, SCF_CMD_READ)) {
    784   1.1    nonaka 				pxa2x0_dmac_abort_xfer(sc->sc_rxdx);
    785   1.1    nonaka 			} else {
    786   1.1    nonaka 				pxa2x0_dmac_abort_xfer(sc->sc_txdx);
    787   1.1    nonaka 			}
    788   1.1    nonaka 		}
    789   1.1    nonaka 		sc->sc_cmd->c_error = ENOEXEC;
    790   1.1    nonaka 		pxamci_intr_done(sc);
    791   1.1    nonaka 		goto end;
    792   1.1    nonaka 	}
    793   1.1    nonaka 
    794   1.1    nonaka 	if (ISSET(status, MMC_I_END_CMD_RES)) {
    795   1.1    nonaka 		DPRINTF(9,("%s: handling MMC_I_END_CMD_RES\n",
    796   1.1    nonaka 		    device_xname(sc->sc_dev)));
    797   1.1    nonaka 		pxamci_intr_cmd(sc);
    798   1.1    nonaka 		pxamci_disable_intr(sc, MMC_I_END_CMD_RES);
    799   1.1    nonaka 		CLR(status, MMC_I_END_CMD_RES);
    800   1.1    nonaka 		/* ignore programming done condition */
    801   1.1    nonaka 		if (ISSET(status, MMC_I_PRG_DONE)) {
    802   1.1    nonaka 			pxamci_disable_intr(sc, MMC_I_PRG_DONE);
    803   1.1    nonaka 			CLR(status, MMC_I_PRG_DONE);
    804   1.1    nonaka 		}
    805   1.1    nonaka 		if (sc->sc_cmd == NULL)
    806   1.1    nonaka 			goto end;
    807   1.1    nonaka 	}
    808   1.1    nonaka 
    809   1.1    nonaka 	if (ISSET(status, MMC_I_DAT_ERR)) {
    810   1.1    nonaka 		DPRINTF(9, ("%s: handling MMC_I_DAT_ERR\n",
    811   1.1    nonaka 		    device_xname(sc->sc_dev)));
    812   1.3    nonaka 		sc->sc_cmd->c_error = EIO;
    813   1.5    nonaka 		if (!ISSET(sc->sc_caps, PMC_CAPS_NO_DMA)
    814   1.5    nonaka 		 && DMA_ALIGNED(sc->sc_cmd->c_data)) {
    815   1.2    nonaka 			if (ISSET(sc->sc_cmd->c_flags, SCF_CMD_READ)) {
    816   1.2    nonaka 				pxa2x0_dmac_abort_xfer(sc->sc_rxdx);
    817   1.2    nonaka 			} else {
    818   1.2    nonaka 				pxa2x0_dmac_abort_xfer(sc->sc_txdx);
    819   1.2    nonaka 			}
    820   1.1    nonaka 		}
    821   1.8    nonaka 		pxamci_intr_done(sc);
    822   1.8    nonaka 		pxamci_disable_intr(sc, MMC_I_DAT_ERR);
    823   1.8    nonaka 		CLR(status, MMC_I_DAT_ERR);
    824   1.1    nonaka 		/* ignore transmission done condition */
    825   1.1    nonaka 		if (ISSET(status, MMC_I_DATA_TRAN_DONE)) {
    826   1.1    nonaka 			pxamci_disable_intr(sc, MMC_I_DATA_TRAN_DONE);
    827   1.1    nonaka 			CLR(status, MMC_I_DATA_TRAN_DONE);
    828   1.1    nonaka 		}
    829   1.1    nonaka 		goto end;
    830   1.1    nonaka 	}
    831   1.1    nonaka 
    832   1.1    nonaka 	if (ISSET(status, MMC_I_DATA_TRAN_DONE)) {
    833   1.1    nonaka 		DPRINTF(9,("%s: handling MMC_I_DATA_TRAN_DONE\n",
    834   1.1    nonaka 		    device_xname(sc->sc_dev)));
    835   1.1    nonaka 		pxamci_intr_done(sc);
    836   1.1    nonaka 		pxamci_disable_intr(sc, MMC_I_DATA_TRAN_DONE);
    837   1.1    nonaka 		CLR(status, MMC_I_DATA_TRAN_DONE);
    838   1.1    nonaka 	}
    839   1.1    nonaka 
    840   1.3    nonaka 	if (ISSET(status, MMC_I_TXFIFO_WR_REQ|MMC_I_RXFIFO_RD_REQ)) {
    841   1.5    nonaka 		DPRINTF(10,("%s: handling MMC_I_xxFIFO_xx_REQ\n",
    842   1.3    nonaka 		    device_xname(sc->sc_dev)));
    843   1.3    nonaka 		pxamci_intr_data(sc);
    844   1.3    nonaka 		CLR(status, MMC_I_TXFIFO_WR_REQ|MMC_I_RXFIFO_RD_REQ);
    845   1.3    nonaka 	}
    846   1.3    nonaka 
    847   1.1    nonaka 	if (ISSET(status, STAT_SDIO_INT)) {
    848   1.1    nonaka 		DPRINTF(9,("%s: handling STAT_SDIO_INT\n",
    849   1.1    nonaka 		    device_xname(sc->sc_dev)));
    850   1.1    nonaka 		sdmmc_card_intr(sc->sc_sdmmc);
    851   1.1    nonaka 		CLR(status, STAT_SDIO_INT);
    852   1.1    nonaka 	}
    853   1.1    nonaka 
    854   1.1    nonaka end:
    855   1.1    nonaka 	/* Avoid further unhandled interrupts. */
    856   1.1    nonaka 	if (status != 0) {
    857   1.1    nonaka 		pxamci_disable_intr(sc, status);
    858   1.1    nonaka #ifdef PXAMCI_DEBUG
    859   1.1    nonaka 		aprint_error_dev(sc->sc_dev,
    860   1.1    nonaka 		    "unhandled interrupt 0x%x out of 0x%x\n", status, ostatus);
    861   1.1    nonaka #endif
    862   1.1    nonaka 	}
    863   1.1    nonaka 	return 1;
    864   1.1    nonaka }
    865   1.1    nonaka 
    866   1.1    nonaka static void
    867   1.1    nonaka pxamci_intr_cmd(struct pxamci_softc *sc)
    868   1.1    nonaka {
    869   1.1    nonaka 	struct sdmmc_command *cmd = sc->sc_cmd;
    870   1.1    nonaka 	uint32_t status;
    871   1.1    nonaka 	int error;
    872   1.1    nonaka 	int i;
    873   1.1    nonaka 
    874   1.1    nonaka 	KASSERT(sc->sc_cmd != NULL);
    875   1.1    nonaka 
    876   1.1    nonaka #define STAT_ERR	(STAT_READ_TIME_OUT \
    877   1.1    nonaka 			 | STAT_TIMEOUT_RESPONSE \
    878   1.1    nonaka 			 | STAT_CRC_WRITE_ERROR \
    879   1.1    nonaka 			 | STAT_CRC_READ_ERROR \
    880   1.1    nonaka 			 | STAT_SPI_READ_ERROR_TOKEN)
    881   1.1    nonaka 
    882   1.1    nonaka 	if (ISSET(cmd->c_flags, SCF_RSP_136)) {
    883   1.1    nonaka 		for (i = 3; i >= 0; i--) {
    884   1.1    nonaka 			uint32_t h = CSR_READ_4(sc, MMC_RES) & 0xffff;
    885   1.1    nonaka 			uint32_t l = CSR_READ_4(sc, MMC_RES) & 0xffff;
    886   1.1    nonaka 			cmd->c_resp[i] = (h << 16) | l;
    887   1.1    nonaka 		}
    888   1.1    nonaka 		cmd->c_error = 0;
    889   1.1    nonaka 	} else if (ISSET(cmd->c_flags, SCF_RSP_PRESENT)) {
    890   1.1    nonaka 		/*
    891   1.1    nonaka 		 * Grrr... The processor manual is not clear about
    892   1.1    nonaka 		 * the layout of the response FIFO.  It just states
    893   1.1    nonaka 		 * that the FIFO is 16 bits wide, has a depth of 8,
    894   1.1    nonaka 		 * and that the CRC is not copied into the FIFO.
    895   1.1    nonaka 		 *
    896   1.1    nonaka 		 * A 16-bit word in the FIFO is filled from highest
    897   1.1    nonaka 		 * to lowest bit as the response comes in.  The two
    898   1.1    nonaka 		 * start bits and the 6 command index bits are thus
    899   1.1    nonaka 		 * stored in the upper 8 bits of the first 16-bit
    900   1.1    nonaka 		 * word that we read back from the FIFO.
    901   1.1    nonaka 		 *
    902   1.1    nonaka 		 * Since the sdmmc(4) framework expects the host
    903   1.1    nonaka 		 * controller to discard the first 8 bits of the
    904   1.1    nonaka 		 * response, what we must do is discard the upper
    905   1.1    nonaka 		 * byte of the first 16-bit word.
    906   1.1    nonaka 		 */
    907   1.1    nonaka 		uint32_t h = CSR_READ_4(sc, MMC_RES) & 0xffff;
    908   1.1    nonaka 		uint32_t m = CSR_READ_4(sc, MMC_RES) & 0xffff;
    909   1.1    nonaka 		uint32_t l = CSR_READ_4(sc, MMC_RES) & 0xffff;
    910   1.1    nonaka 		cmd->c_resp[0] = (h << 24) | (m << 8) | (l >> 8);
    911   1.1    nonaka 		for (i = 1; i < 4; i++)
    912   1.1    nonaka 			cmd->c_resp[i] = 0;
    913   1.1    nonaka 		cmd->c_error = 0;
    914   1.1    nonaka 	}
    915   1.1    nonaka 
    916   1.1    nonaka 	status = CSR_READ_4(sc, MMC_STAT);
    917   1.1    nonaka 
    918   1.1    nonaka 	if (!ISSET(cmd->c_flags, SCF_RSP_PRESENT))
    919   1.1    nonaka 		CLR(status, STAT_TIMEOUT_RESPONSE);
    920   1.1    nonaka 
    921   1.1    nonaka 	/* XXX only for R6, not for R2 */
    922   1.1    nonaka 	if (!ISSET(cmd->c_flags, SCF_RSP_IDX))
    923   1.1    nonaka 		CLR(status, STAT_RES_CRC_ERR);
    924   1.1    nonaka 
    925   1.1    nonaka 	if (ISSET(status, STAT_TIMEOUT_RESPONSE))
    926   1.1    nonaka 		cmd->c_error = ETIMEDOUT;
    927   1.1    nonaka 	else if (ISSET(status, STAT_RES_CRC_ERR)
    928   1.1    nonaka 	      && ISSET(cmd->c_flags, SCF_RSP_CRC)
    929   1.1    nonaka 	      && CPU_IS_PXA270) {
    930   1.1    nonaka 		/* workaround for erratum #42 */
    931   1.1    nonaka 		if (ISSET(cmd->c_flags, SCF_RSP_136)
    932   1.1    nonaka 		 && (cmd->c_resp[0] & 0x80000000U)) {
    933   1.1    nonaka 			DPRINTF(1,("%s: ignore CRC error\n",
    934   1.1    nonaka 			    device_xname(sc->sc_dev)));
    935   1.1    nonaka 		} else
    936   1.1    nonaka 			cmd->c_error = EIO;
    937   1.1    nonaka 	} else if (ISSET(status, STAT_ERR))
    938   1.1    nonaka 		cmd->c_error = EIO;
    939   1.1    nonaka 
    940   1.1    nonaka 	if (cmd->c_error == 0 && cmd->c_datalen > 0) {
    941   1.1    nonaka 		if (!ISSET(sc->sc_caps, PMC_CAPS_NO_DMA)
    942   1.5    nonaka 		 && DMA_ALIGNED(cmd->c_data)) {
    943   1.5    nonaka 			/* workaround for erratum #91 */
    944   1.5    nonaka 			if (CPU_IS_PXA270
    945   1.5    nonaka 			 && !ISSET(cmd->c_flags, SCF_CMD_READ)) {
    946   1.5    nonaka 				error = pxa2x0_dmac_start_xfer(sc->sc_txdx);
    947   1.5    nonaka 				if (error) {
    948   1.5    nonaka 					aprint_error_dev(sc->sc_dev,
    949   1.5    nonaka 					    "couldn't start dma xfer."
    950   1.5    nonaka 					    " (error=%d)\n", error);
    951   1.5    nonaka 					cmd->c_error = EIO;
    952   1.5    nonaka 					pxamci_intr_done(sc);
    953   1.5    nonaka 					return;
    954   1.5    nonaka 				}
    955   1.1    nonaka 			}
    956   1.3    nonaka 			pxamci_enable_intr(sc,
    957   1.3    nonaka 			    MMC_I_DATA_TRAN_DONE|MMC_I_DAT_ERR);
    958   1.1    nonaka 		}
    959   1.1    nonaka 	} else {
    960   1.1    nonaka 		pxamci_intr_done(sc);
    961   1.1    nonaka 	}
    962   1.1    nonaka }
    963   1.1    nonaka 
    964   1.1    nonaka static void
    965   1.1    nonaka pxamci_intr_data(struct pxamci_softc *sc)
    966   1.1    nonaka {
    967   1.1    nonaka 	struct sdmmc_command *cmd = sc->sc_cmd;
    968   1.1    nonaka 	int intr;
    969   1.1    nonaka 	int n;
    970   1.1    nonaka 
    971   1.5    nonaka 	DPRINTF(10,("%s: pxamci_intr_data: cmd = %p, resid = %d\n",
    972   1.1    nonaka 	    device_xname(sc->sc_dev), cmd, cmd->c_resid));
    973   1.1    nonaka 
    974   1.1    nonaka 	n = MIN(32, cmd->c_resid);
    975   1.1    nonaka 	cmd->c_resid -= n;
    976   1.1    nonaka 
    977   1.1    nonaka 	if (ISSET(cmd->c_flags, SCF_CMD_READ)) {
    978   1.1    nonaka 		intr = MMC_I_RXFIFO_RD_REQ;
    979   1.1    nonaka 		while (n-- > 0)
    980   1.1    nonaka 			*cmd->c_buf++ = CSR_READ_1(sc, MMC_RXFIFO);
    981   1.1    nonaka 	} else {
    982   1.1    nonaka 		int short_xfer = n < 32;
    983   1.1    nonaka 
    984   1.1    nonaka 		intr = MMC_I_TXFIFO_WR_REQ;
    985   1.1    nonaka 		while (n-- > 0)
    986   1.1    nonaka 			CSR_WRITE_1(sc, MMC_TXFIFO, *cmd->c_buf++);
    987   1.1    nonaka 		if (short_xfer)
    988   1.1    nonaka 			CSR_WRITE_4(sc, MMC_PRTBUF, 1);
    989   1.1    nonaka 	}
    990   1.1    nonaka 
    991   1.1    nonaka 	if (cmd->c_resid > 0) {
    992   1.1    nonaka 		pxamci_enable_intr(sc, intr);
    993   1.1    nonaka 	} else {
    994   1.1    nonaka 		pxamci_disable_intr(sc, intr);
    995   1.3    nonaka 		pxamci_enable_intr(sc, MMC_I_DATA_TRAN_DONE);
    996   1.1    nonaka 	}
    997   1.1    nonaka }
    998   1.1    nonaka 
    999   1.1    nonaka /*
   1000   1.1    nonaka  * Wake up the process sleeping in pxamci_exec_command().
   1001   1.1    nonaka  */
   1002   1.1    nonaka static void
   1003   1.1    nonaka pxamci_intr_done(struct pxamci_softc *sc)
   1004   1.1    nonaka {
   1005   1.1    nonaka 
   1006   1.1    nonaka 	DPRINTF(1,("%s: pxamci_intr_done: mmc status = %#x\n",
   1007   1.3    nonaka 	    device_xname(sc->sc_dev), CSR_READ_4(sc, MMC_STAT)));
   1008   1.1    nonaka 
   1009   1.3    nonaka 	pxamci_disable_intr(sc, MMC_I_TXFIFO_WR_REQ|MMC_I_RXFIFO_RD_REQ|
   1010   1.3    nonaka 	    MMC_I_DATA_TRAN_DONE|MMC_I_END_CMD_RES|MMC_I_RES_ERR|MMC_I_DAT_ERR);
   1011   1.1    nonaka 	SET(sc->sc_cmd->c_flags, SCF_ITSDONE);
   1012   1.1    nonaka 	sc->sc_cmd = NULL;
   1013   1.1    nonaka 	wakeup(sc);
   1014   1.1    nonaka }
   1015   1.1    nonaka 
   1016   1.1    nonaka static void
   1017   1.1    nonaka pxamci_dmac_iintr(struct dmac_xfer *dx, int status)
   1018   1.1    nonaka {
   1019   1.1    nonaka 	struct pxamci_softc *sc = dx->dx_cookie;
   1020   1.1    nonaka 
   1021   1.5    nonaka 	DPRINTF(1,("%s: pxamci_dmac_iintr: status = %#x\n",
   1022   1.5    nonaka 	    device_xname(sc->sc_dev), status));
   1023   1.5    nonaka 
   1024   1.1    nonaka 	if (status) {
   1025   1.1    nonaka 		aprint_error_dev(sc->sc_dev, "pxamci_dmac_iintr: "
   1026   1.1    nonaka 		    "non-zero completion status %d\n", status);
   1027   1.1    nonaka 	}
   1028   1.1    nonaka }
   1029   1.1    nonaka 
   1030   1.1    nonaka static void
   1031   1.1    nonaka pxamci_dmac_ointr(struct dmac_xfer *dx, int status)
   1032   1.1    nonaka {
   1033   1.1    nonaka 	struct pxamci_softc *sc = dx->dx_cookie;
   1034   1.1    nonaka 
   1035   1.5    nonaka 	DPRINTF(1,("%s: pxamci_dmac_ointr: status = %#x\n",
   1036   1.5    nonaka 	    device_xname(sc->sc_dev), status));
   1037   1.5    nonaka 
   1038   1.5    nonaka 	if (status == 0) {
   1039   1.5    nonaka 		if (sc->sc_cmd != NULL && (sc->sc_cmd->c_datalen & 31) != 0) {
   1040   1.5    nonaka 			CSR_WRITE_4(sc, MMC_PRTBUF, 1);
   1041   1.5    nonaka 		}
   1042   1.5    nonaka 	} else {
   1043   1.1    nonaka 		aprint_error_dev(sc->sc_dev, "pxamci_dmac_ointr: "
   1044   1.1    nonaka 		    "non-zero completion status %d\n", status);
   1045   1.1    nonaka 	}
   1046   1.1    nonaka }
   1047