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/dev/sdhci/sdhci_fsl_fdt.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  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
    3  *
    4  * Copyright (c) 2020 - 2021 Alstom Group.
    5  * Copyright (c) 2020 - 2021 Semihalf.
    6  *
    7  * Redistribution and use in source and binary forms, with or without
    8  * modification, are permitted provided that the following conditions
    9  * are met:
   10  * 1. Redistributions of source code must retain the above copyright
   11  *    notice, this list of conditions and the following disclaimer.
   12  * 2. Redistributions in binary form must reproduce the above copyright
   13  *    notice, this list of conditions and the following disclaimer in the
   14  *    documentation and/or other materials provided with the distribution.
   15  *
   16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
   20  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   21  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   22  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   24  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   26  * SUCH DAMAGE.
   27  */
   28 
   29 /* eSDHC controller driver for NXP QorIQ Layerscape SoCs. */
   30 
   31 #include <sys/cdefs.h>
   32 __FBSDID("$FreeBSD$");
   33 
   34 #include <sys/param.h>
   35 #include <sys/endian.h>
   36 #include <sys/kernel.h>
   37 #include <sys/module.h>
   38 #include <sys/rman.h>
   39 #include <sys/sysctl.h>
   40 #include <sys/taskqueue.h>
   41 
   42 #include <machine/bus.h>
   43 #include <machine/resource.h>
   44 
   45 #include <dev/extres/clk/clk.h>
   46 #include <dev/extres/syscon/syscon.h>
   47 #include <dev/mmc/bridge.h>
   48 #include <dev/mmc/mmcbrvar.h>
   49 #include <dev/mmc/mmc_fdt_helpers.h>
   50 #include <dev/ofw/ofw_bus.h>
   51 #include <dev/ofw/ofw_bus_subr.h>
   52 #include <dev/sdhci/sdhci.h>
   53 #include <dev/sdhci/sdhci_fdt_gpio.h>
   54 
   55 #include "mmcbr_if.h"
   56 #include "sdhci_if.h"
   57 #include "syscon_if.h"
   58 
   59 #define RD4     (sc->read)
   60 #define WR4     (sc->write)
   61 
   62 #define SDHCI_FSL_PRES_STATE            0x24
   63 #define SDHCI_FSL_PRES_SDSTB            (1 << 3)
   64 #define SDHCI_FSL_PRES_COMPAT_MASK      0x000f0f07
   65 
   66 #define SDHCI_FSL_PROT_CTRL             0x28
   67 #define SDHCI_FSL_PROT_CTRL_WIDTH_1BIT  (0 << 1)
   68 #define SDHCI_FSL_PROT_CTRL_WIDTH_4BIT  (1 << 1)
   69 #define SDHCI_FSL_PROT_CTRL_WIDTH_8BIT  (2 << 1)
   70 #define SDHCI_FSL_PROT_CTRL_WIDTH_MASK  (3 << 1)
   71 #define SDHCI_FSL_PROT_CTRL_BYTE_SWAP   (0 << 4)
   72 #define SDHCI_FSL_PROT_CTRL_BYTE_NATIVE (2 << 4)
   73 #define SDHCI_FSL_PROT_CTRL_BYTE_MASK   (3 << 4)
   74 #define SDHCI_FSL_PROT_CTRL_DMA_MASK    (3 << 8)
   75 #define SDHCI_FSL_PROT_CTRL_VOLT_SEL    (1 << 10)
   76 
   77 #define SDHCI_FSL_IRQSTAT               0x30
   78 #define SDHCI_FSL_IRQSTAT_BRR           (1 << 5)
   79 #define SDHCI_FSL_IRQSTAT_CINTSEN       (1 << 8)
   80 #define SDHCI_FSL_IRQSTAT_RTE           (1 << 12)
   81 #define SDHCI_FSL_IRQSTAT_TNE           (1 << 26)
   82 
   83 #define SDHCI_FSL_SYS_CTRL              0x2c
   84 #define SDHCI_FSL_CLK_IPGEN             (1 << 0)
   85 #define SDHCI_FSL_CLK_SDCLKEN           (1 << 3)
   86 #define SDHCI_FSL_CLK_DIVIDER_MASK      0x000000f0
   87 #define SDHCI_FSL_CLK_DIVIDER_SHIFT     4
   88 #define SDHCI_FSL_CLK_PRESCALE_MASK     0x0000ff00
   89 #define SDHCI_FSL_CLK_PRESCALE_SHIFT    8
   90 
   91 #define SDHCI_FSL_WTMK_LVL              0x44
   92 #define SDHCI_FSL_WTMK_RD_512B          (0 << 0)
   93 #define SDHCI_FSL_WTMK_WR_512B          (0 << 15)
   94 
   95 #define SDHCI_FSL_AUTOCERR              0x3C
   96 #define SDHCI_FSL_AUTOCERR_UHMS_HS200   (3 << 16)
   97 #define SDHCI_FSL_AUTOCERR_UHMS         (7 << 16)
   98 #define SDHCI_FSL_AUTOCERR_EXTN         (1 << 22)
   99 #define SDHCI_FSL_AUTOCERR_SMPCLKSEL    (1 << 23)
  100 #define SDHCI_FSL_AUTOCERR_UHMS_SHIFT   16
  101 
  102 #define SDHCI_FSL_HOST_VERSION          0xfc
  103 #define SDHCI_FSL_VENDOR_V23            0x13
  104 
  105 #define SDHCI_FSL_CAPABILITIES2         0x114
  106 
  107 #define SDHCI_FSL_TBCTL                 0x120
  108 
  109 #define SDHCI_FSL_TBSTAT                0x124
  110 #define SDHCI_FSL_TBCTL_TBEN            (1 << 2)
  111 #define SDHCI_FSL_TBCTL_HS400_EN        (1 << 4)
  112 #define SDHCI_FSL_TBCTL_SAMP_CMD_DQS    (1 << 5)
  113 #define SDHCI_FSL_TBCTL_HS400_WND_ADJ   (1 << 6)
  114 #define SDHCI_FSL_TBCTL_TB_MODE_MASK    0x3
  115 #define SDHCI_FSL_TBCTL_MODE_1          0
  116 #define SDHCI_FSL_TBCTL_MODE_2          1
  117 #define SDHCI_FSL_TBCTL_MODE_3          2
  118 #define SDHCI_FSL_TBCTL_MODE_SW         3
  119 
  120 #define SDHCI_FSL_TBPTR                 0x128
  121 #define SDHCI_FSL_TBPTR_WND_START_SHIFT 8
  122 #define SDHCI_FSL_TBPTR_WND_MASK        0x7F
  123 
  124 #define SDHCI_FSL_SDCLKCTL              0x144
  125 #define SDHCI_FSL_SDCLKCTL_CMD_CLK_CTL  (1 << 15)
  126 #define SDHCI_FSL_SDCLKCTL_LPBK_CLK_SEL (1 << 31)
  127 
  128 #define SDHCI_FSL_SDTIMINGCTL           0x148
  129 #define SDHCI_FSL_SDTIMINGCTL_FLW_CTL   (1 << 15)
  130 
  131 #define SDHCI_FSL_DLLCFG0               0x160
  132 #define SDHCI_FSL_DLLCFG0_FREQ_SEL      (1 << 27)
  133 #define SDHCI_FSL_DLLCFG0_RESET         (1 << 30)
  134 #define SDHCI_FSL_DLLCFG0_EN            (1 << 31)
  135 
  136 #define SDHCI_FSL_DLLCFG1               0x164
  137 #define SDHCI_FSL_DLLCFG1_PULSE_STRETCH (1 << 31)
  138 
  139 #define SDHCI_FSL_DLLSTAT0              0x170
  140 #define SDHCI_FSL_DLLSTAT0_SLV_STS      (1 << 27)
  141 
  142 #define SDHCI_FSL_ESDHC_CTRL            0x40c
  143 #define SDHCI_FSL_ESDHC_CTRL_SNOOP      (1 << 6)
  144 #define SDHCI_FSL_ESDHC_CTRL_FAF        (1 << 18)
  145 #define SDHCI_FSL_ESDHC_CTRL_CLK_DIV2   (1 << 19)
  146 
  147 #define SCFG_SDHCIOVSELCR               0x408
  148 #define SCFG_SDHCIOVSELCR_TGLEN         (1 << 0)
  149 #define SCFG_SDHCIOVSELCR_VS            (1 << 31)
  150 #define SCFG_SDHCIOVSELCR_VSELVAL_MASK  (3 << 1)
  151 #define SCFG_SDHCIOVSELCR_VSELVAL_1_8   0x0
  152 #define SCFG_SDHCIOVSELCR_VSELVAL_3_3   0x2
  153 
  154 #define SDHCI_FSL_CAN_VDD_MASK          \
  155     (SDHCI_CAN_VDD_180 | SDHCI_CAN_VDD_300 | SDHCI_CAN_VDD_330)
  156 
  157 /* Some platforms do not detect pulse width correctly. */
  158 #define SDHCI_FSL_UNRELIABLE_PULSE_DET  (1 << 0)
  159 /* On some platforms switching voltage to 1.8V is not supported */
  160 #define SDHCI_FSL_UNSUPP_1_8V           (1 << 1)
  161 /* Hardware tuning can fail, fallback to SW tuning in that case. */
  162 #define SDHCI_FSL_TUNING_ERRATUM_TYPE1  (1 << 2)
  163 /*
  164  * Pointer window might not be set properly on some platforms.
  165  * Check window and perform SW tuning.
  166  */
  167 #define SDHCI_FSL_TUNING_ERRATUM_TYPE2  (1 << 3)
  168 /*
  169  * In HS400 mode only 4, 8, 12 clock dividers can be used.
  170  * Use the smallest value, bigger than requested in that case.
  171  */
  172 #define SDHCI_FSL_HS400_LIMITED_CLK_DIV (1 << 4)
  173 
  174 /*
  175  * Some SoCs don't have a fixed regulator. Switching voltage
  176  * requires special routine including syscon registers.
  177  */
  178 #define SDHCI_FSL_MISSING_VCCQ_REG      (1 << 5)
  179 
  180 /*
  181  * HS400 tuning is done in HS200 mode, but it has to be done using
  182  * the target frequency. In order to apply the errata above we need to
  183  * know the target mode during tuning procedure. Use this flag for just that.
  184  */
  185 #define SDHCI_FSL_HS400_FLAG            (1 << 0)
  186 
  187 #define SDHCI_FSL_MAX_RETRIES           20000   /* DELAY(10) * this = 200ms */
  188 
  189 struct sdhci_fsl_fdt_softc {
  190         device_t                                dev;
  191         const struct sdhci_fsl_fdt_soc_data     *soc_data;
  192         struct resource                         *mem_res;
  193         struct resource                         *irq_res;
  194         void                                    *irq_cookie;
  195         uint32_t                                baseclk_hz;
  196         uint32_t                                maxclk_hz;
  197         struct sdhci_fdt_gpio                   *gpio;
  198         struct sdhci_slot                       slot;
  199         bool                                    slot_init_done;
  200         uint32_t                                cmd_and_mode;
  201         uint16_t                                sdclk_bits;
  202         struct mmc_helper                       fdt_helper;
  203         uint32_t                                div_ratio;
  204         uint8_t                                 vendor_ver;
  205         uint32_t                                flags;
  206 
  207         uint32_t (* read)(struct sdhci_fsl_fdt_softc *, bus_size_t);
  208         void (* write)(struct sdhci_fsl_fdt_softc *, bus_size_t, uint32_t);
  209 };
  210 
  211 struct sdhci_fsl_fdt_soc_data {
  212         int quirks;
  213         int baseclk_div;
  214         uint8_t errata;
  215         char *syscon_compat;
  216 };
  217 
  218 static const struct sdhci_fsl_fdt_soc_data sdhci_fsl_fdt_ls1012a_soc_data = {
  219         .quirks = 0,
  220         .baseclk_div = 1,
  221         .errata = SDHCI_FSL_MISSING_VCCQ_REG | SDHCI_FSL_TUNING_ERRATUM_TYPE2,
  222         .syscon_compat = "fsl,ls1012a-scfg",
  223 };
  224 
  225 static const struct sdhci_fsl_fdt_soc_data sdhci_fsl_fdt_ls1028a_soc_data = {
  226         .quirks = SDHCI_QUIRK_DONT_SET_HISPD_BIT |
  227             SDHCI_QUIRK_BROKEN_AUTO_STOP | SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK,
  228         .baseclk_div = 2,
  229         .errata = SDHCI_FSL_UNRELIABLE_PULSE_DET |
  230             SDHCI_FSL_HS400_LIMITED_CLK_DIV,
  231 };
  232 
  233 static const struct sdhci_fsl_fdt_soc_data sdhci_fsl_fdt_ls1046a_soc_data = {
  234         .quirks = SDHCI_QUIRK_DONT_SET_HISPD_BIT | SDHCI_QUIRK_BROKEN_AUTO_STOP,
  235         .baseclk_div = 2,
  236         .errata = SDHCI_FSL_MISSING_VCCQ_REG | SDHCI_FSL_TUNING_ERRATUM_TYPE2,
  237         .syscon_compat = "fsl,ls1046a-scfg",
  238 };
  239 
  240 static const struct sdhci_fsl_fdt_soc_data sdhci_fsl_fdt_lx2160a_soc_data = {
  241         .quirks = 0,
  242         .baseclk_div = 2,
  243         .errata = SDHCI_FSL_UNRELIABLE_PULSE_DET |
  244             SDHCI_FSL_HS400_LIMITED_CLK_DIV,
  245 };
  246 
  247 static const struct sdhci_fsl_fdt_soc_data sdhci_fsl_fdt_gen_data = {
  248         .quirks = 0,
  249         .baseclk_div = 1,
  250 };
  251 
  252 static const struct ofw_compat_data sdhci_fsl_fdt_compat_data[] = {
  253         {"fsl,ls1012a-esdhc",   (uintptr_t)&sdhci_fsl_fdt_ls1012a_soc_data},
  254         {"fsl,ls1028a-esdhc",   (uintptr_t)&sdhci_fsl_fdt_ls1028a_soc_data},
  255         {"fsl,ls1046a-esdhc",   (uintptr_t)&sdhci_fsl_fdt_ls1046a_soc_data},
  256         {"fsl,esdhc",           (uintptr_t)&sdhci_fsl_fdt_gen_data},
  257         {NULL,                  0}
  258 };
  259 
  260 static uint32_t
  261 read_be(struct sdhci_fsl_fdt_softc *sc, bus_size_t off)
  262 {
  263 
  264         return (be32toh(bus_read_4(sc->mem_res, off)));
  265 }
  266 
  267 static void
  268 write_be(struct sdhci_fsl_fdt_softc *sc, bus_size_t off, uint32_t val)
  269 {
  270 
  271         bus_write_4(sc->mem_res, off, htobe32(val));
  272 }
  273 
  274 static uint32_t
  275 read_le(struct sdhci_fsl_fdt_softc *sc, bus_size_t off)
  276 {
  277 
  278         return (bus_read_4(sc->mem_res, off));
  279 }
  280 
  281 static void
  282 write_le(struct sdhci_fsl_fdt_softc *sc, bus_size_t off, uint32_t val)
  283 {
  284 
  285         bus_write_4(sc->mem_res, off, val);
  286 }
  287 
  288 
  289 static uint16_t
  290 sdhci_fsl_fdt_get_clock(struct sdhci_fsl_fdt_softc *sc)
  291 {
  292         uint16_t val;
  293 
  294         val = sc->sdclk_bits | SDHCI_CLOCK_INT_EN;
  295         if (RD4(sc, SDHCI_FSL_PRES_STATE) & SDHCI_FSL_PRES_SDSTB)
  296                 val |= SDHCI_CLOCK_INT_STABLE;
  297         if (RD4(sc, SDHCI_FSL_SYS_CTRL) & SDHCI_FSL_CLK_SDCLKEN)
  298                 val |= SDHCI_CLOCK_CARD_EN;
  299 
  300         return (val);
  301 }
  302 
  303 /*
  304  * Calculate clock prescaler and divisor values based on the following formula:
  305  * `frequency = base clock / (prescaler * divisor)`.
  306  */
  307 #define SDHCI_FSL_FDT_CLK_DIV(sc, base, freq, pre, div)                 \
  308         do {                                                            \
  309                 (pre) = (sc)->vendor_ver < SDHCI_FSL_VENDOR_V23 ? 2 : 1;\
  310                 while ((freq) < (base) / ((pre) * 16) && (pre) < 256)   \
  311                         (pre) <<= 1;                                    \
  312                 /* div/pre can't both be set to 1, according to PM. */  \
  313                 (div) = ((pre) == 1 ? 2 : 1);                           \
  314                 while ((freq) < (base) / ((pre) * (div)) && (div) < 16) \
  315                         ++(div);                                        \
  316         } while (0)
  317 
  318 static void
  319 fsl_sdhc_fdt_set_clock(struct sdhci_fsl_fdt_softc *sc, struct sdhci_slot *slot,
  320     uint16_t val)
  321 {
  322         uint32_t prescale, div, val32, div_ratio;
  323 
  324         sc->sdclk_bits = val & SDHCI_DIVIDERS_MASK;
  325         val32 = RD4(sc, SDHCI_CLOCK_CONTROL);
  326 
  327         if ((val & SDHCI_CLOCK_CARD_EN) == 0) {
  328                 WR4(sc, SDHCI_CLOCK_CONTROL, val32 & ~SDHCI_FSL_CLK_SDCLKEN);
  329                 return;
  330         }
  331 
  332         /*
  333          * Ignore dividers provided by core in `sdhci_set_clock` and calculate
  334          * them anew with higher accuracy.
  335          */
  336         SDHCI_FSL_FDT_CLK_DIV(sc, sc->baseclk_hz, slot->clock, prescale, div);
  337 
  338         div_ratio = prescale * div;
  339 
  340         /*
  341          * According to limited clock division erratum, clock dividers in hs400
  342          * can be only 4, 8 or 12
  343          */
  344         if ((sc->soc_data->errata & SDHCI_FSL_HS400_LIMITED_CLK_DIV) &&
  345             (sc->slot.host.ios.timing == bus_timing_mmc_hs400 ||
  346              (sc->flags & SDHCI_FSL_HS400_FLAG))) {
  347                 if (div_ratio <= 4) {
  348                         prescale = 4;
  349                         div = 1;
  350                 } else if (div_ratio <= 8) {
  351                         prescale = 4;
  352                         div = 2;
  353                 } else if (div_ratio <= 12) {
  354                         prescale = 4;
  355                         div = 3;
  356                 } else {
  357                         device_printf(sc->dev, "Unsupported clock divider.\n");
  358                 }
  359         }
  360 
  361         sc->div_ratio = prescale * div;
  362         if (bootverbose)
  363                 device_printf(sc->dev,
  364                     "Desired SD/MMC freq: %d, actual: %d; base %d prescale %d divisor %d\n",
  365                     slot->clock, sc->baseclk_hz / (prescale * div),
  366                     sc->baseclk_hz, prescale, div);
  367 
  368         prescale >>= 1;
  369         div -= 1;
  370 
  371         val32 &= ~(SDHCI_FSL_CLK_DIVIDER_MASK | SDHCI_FSL_CLK_PRESCALE_MASK);
  372         val32 |= div << SDHCI_FSL_CLK_DIVIDER_SHIFT;
  373         val32 |= prescale << SDHCI_FSL_CLK_PRESCALE_SHIFT;
  374         val32 |= SDHCI_FSL_CLK_IPGEN | SDHCI_FSL_CLK_SDCLKEN;
  375         WR4(sc, SDHCI_CLOCK_CONTROL, val32);
  376 }
  377 
  378 static uint8_t
  379 sdhci_fsl_fdt_read_1(device_t dev, struct sdhci_slot *slot, bus_size_t off)
  380 {
  381         struct sdhci_fsl_fdt_softc *sc;
  382         uint32_t wrk32, val32;
  383 
  384         sc = device_get_softc(dev);
  385 
  386         switch (off) {
  387         case SDHCI_HOST_CONTROL:
  388                 wrk32 = RD4(sc, SDHCI_FSL_PROT_CTRL);
  389                 val32 = wrk32 & (SDHCI_CTRL_LED | SDHCI_CTRL_CARD_DET |
  390                     SDHCI_CTRL_FORCE_CARD);
  391                 if (wrk32 & SDHCI_FSL_PROT_CTRL_WIDTH_4BIT)
  392                         val32 |= SDHCI_CTRL_4BITBUS;
  393                 else if (wrk32 & SDHCI_FSL_PROT_CTRL_WIDTH_8BIT)
  394                         val32 |= SDHCI_CTRL_8BITBUS;
  395                 return (val32);
  396         case SDHCI_POWER_CONTROL:
  397                 return (SDHCI_POWER_ON | SDHCI_POWER_300);
  398         default:
  399                 break;
  400         }
  401 
  402         return ((RD4(sc, off & ~3) >> (off & 3) * 8) & UINT8_MAX);
  403 }
  404 
  405 static uint16_t
  406 sdhci_fsl_fdt_read_2(device_t dev, struct sdhci_slot *slot, bus_size_t off)
  407 {
  408         struct sdhci_fsl_fdt_softc *sc;
  409         uint32_t val32;
  410 
  411         sc = device_get_softc(dev);
  412 
  413         switch (off) {
  414         case SDHCI_CLOCK_CONTROL:
  415                 return (sdhci_fsl_fdt_get_clock(sc));
  416         case SDHCI_HOST_VERSION:
  417                 return (RD4(sc, SDHCI_FSL_HOST_VERSION) & UINT16_MAX);
  418         case SDHCI_TRANSFER_MODE:
  419                 return (sc->cmd_and_mode & UINT16_MAX);
  420         case SDHCI_COMMAND_FLAGS:
  421                 return (sc->cmd_and_mode >> 16);
  422         case SDHCI_SLOT_INT_STATUS:
  423         /*
  424          * eSDHC hardware manages only a single slot.
  425          * Synthesize a slot interrupt status register for slot 1 below.
  426          */
  427                 val32 = RD4(sc, SDHCI_INT_STATUS);
  428                 val32 &= RD4(sc, SDHCI_SIGNAL_ENABLE);
  429                 return (!!val32);
  430         default:
  431                 return ((RD4(sc, off & ~3) >> (off & 3) * 8) & UINT16_MAX);
  432         }
  433 }
  434 
  435 static uint32_t
  436 sdhci_fsl_fdt_read_4(device_t dev, struct sdhci_slot *slot, bus_size_t off)
  437 {
  438         struct sdhci_fsl_fdt_softc *sc;
  439         uint32_t wrk32, val32;
  440 
  441         sc = device_get_softc(dev);
  442 
  443         if (off == SDHCI_BUFFER)
  444                 return (bus_read_4(sc->mem_res, off));
  445         if (off == SDHCI_CAPABILITIES2)
  446                 off = SDHCI_FSL_CAPABILITIES2;
  447 
  448         val32 = RD4(sc, off);
  449 
  450         if (off == SDHCI_PRESENT_STATE) {
  451                 wrk32 = val32;
  452                 val32 &= SDHCI_FSL_PRES_COMPAT_MASK;
  453                 val32 |= (wrk32 >> 4) & SDHCI_STATE_DAT_MASK;
  454                 val32 |= (wrk32 << 1) & SDHCI_STATE_CMD;
  455         }
  456 
  457         return (val32);
  458 }
  459 
  460 static void
  461 sdhci_fsl_fdt_read_multi_4(device_t dev, struct sdhci_slot *slot, bus_size_t off,
  462     uint32_t *data, bus_size_t count)
  463 {
  464         struct sdhci_fsl_fdt_softc *sc;
  465 
  466         sc = device_get_softc(dev);
  467         bus_read_multi_4(sc->mem_res, off, data, count);
  468 }
  469 
  470 static void
  471 sdhci_fsl_fdt_write_1(device_t dev, struct sdhci_slot *slot, bus_size_t off,
  472     uint8_t val)
  473 {
  474         struct sdhci_fsl_fdt_softc *sc;
  475         uint32_t val32;
  476 
  477         sc = device_get_softc(dev);
  478 
  479         switch (off) {
  480         case SDHCI_HOST_CONTROL:
  481                 val32 = RD4(sc, SDHCI_FSL_PROT_CTRL);
  482                 val32 &= ~SDHCI_FSL_PROT_CTRL_WIDTH_MASK;
  483                 val32 |= (val & SDHCI_CTRL_LED);
  484 
  485                 if (val & SDHCI_CTRL_8BITBUS)
  486                         val32 |= SDHCI_FSL_PROT_CTRL_WIDTH_8BIT;
  487                 else
  488                         /* Bus width is 1-bit when this flag is not set. */
  489                         val32 |= (val & SDHCI_CTRL_4BITBUS);
  490                 /* Enable SDMA by masking out this field. */
  491                 val32 &= ~SDHCI_FSL_PROT_CTRL_DMA_MASK;
  492                 val32 &= ~(SDHCI_CTRL_CARD_DET | SDHCI_CTRL_FORCE_CARD);
  493                 val32 |= (val & (SDHCI_CTRL_CARD_DET |
  494                     SDHCI_CTRL_FORCE_CARD));
  495                 WR4(sc, SDHCI_FSL_PROT_CTRL, val32);
  496                 return;
  497         case SDHCI_POWER_CONTROL:
  498                 return;
  499         default:
  500                 val32 = RD4(sc, off & ~3);
  501                 val32 &= ~(UINT8_MAX << (off & 3) * 8);
  502                 val32 |= (val << (off & 3) * 8);
  503                 WR4(sc, off & ~3, val32);
  504                 return;
  505         }
  506 }
  507 
  508 static void
  509 sdhci_fsl_fdt_write_2(device_t dev, struct sdhci_slot *slot, bus_size_t off,
  510     uint16_t val)
  511 {
  512         struct sdhci_fsl_fdt_softc *sc;
  513         uint32_t val32;
  514 
  515         sc = device_get_softc(dev);
  516 
  517         switch (off) {
  518         case SDHCI_CLOCK_CONTROL:
  519                 fsl_sdhc_fdt_set_clock(sc, slot, val);
  520                 return;
  521         /*
  522          * eSDHC hardware combines command and mode into a single
  523          * register. Cache it here, so that command isn't written
  524          * until after mode.
  525          */
  526         case SDHCI_TRANSFER_MODE:
  527                 sc->cmd_and_mode = val;
  528                 return;
  529         case SDHCI_COMMAND_FLAGS:
  530                 sc->cmd_and_mode =
  531                     (sc->cmd_and_mode & UINT16_MAX) | (val << 16);
  532                 WR4(sc, SDHCI_TRANSFER_MODE, sc->cmd_and_mode);
  533                 sc->cmd_and_mode = 0;
  534                 return;
  535         case SDHCI_HOST_CONTROL2:
  536                 /*
  537                  * Switching to HS400 requires a special procedure,
  538                  * which is done in sdhci_fsl_fdt_set_uhs_timing.
  539                  */
  540                 if ((val & SDHCI_CTRL2_UHS_MASK) == SDHCI_CTRL2_MMC_HS400)
  541                         val &= ~SDHCI_CTRL2_MMC_HS400;
  542         default:
  543                 val32 = RD4(sc, off & ~3);
  544                 val32 &= ~(UINT16_MAX << (off & 3) * 8);
  545                 val32 |= ((val & UINT16_MAX) << (off & 3) * 8);
  546                 WR4(sc, off & ~3, val32);
  547                 return;
  548         }
  549 }
  550 
  551 static void
  552 sdhci_fsl_fdt_write_4(device_t dev, struct sdhci_slot *slot, bus_size_t off,
  553     uint32_t val)
  554 {
  555         struct sdhci_fsl_fdt_softc *sc;
  556 
  557         sc = device_get_softc(dev);
  558 
  559         switch (off) {
  560         case SDHCI_BUFFER:
  561                 bus_write_4(sc->mem_res, off, val);
  562                 return;
  563         /*
  564          * eSDHC hardware lacks support for the SDMA buffer boundary
  565          * feature and instead generates SDHCI_INT_DMA_END interrupts
  566          * after each completed DMA data transfer.
  567          * Since this duplicates the SDHCI_INT_DATA_END functionality,
  568          * mask out the unneeded SDHCI_INT_DMA_END interrupt.
  569          */
  570         case SDHCI_INT_ENABLE:
  571         case SDHCI_SIGNAL_ENABLE:
  572                 val &= ~SDHCI_INT_DMA_END;
  573         /* FALLTHROUGH. */
  574         default:
  575                 WR4(sc, off, val);
  576                 return;
  577         }
  578 }
  579 
  580 static void
  581 sdhci_fsl_fdt_write_multi_4(device_t dev, struct sdhci_slot *slot,
  582     bus_size_t off, uint32_t *data, bus_size_t count)
  583 {
  584         struct sdhci_fsl_fdt_softc *sc;
  585 
  586         sc = device_get_softc(dev);
  587         bus_write_multi_4(sc->mem_res, off, data, count);
  588 }
  589 
  590 static void
  591 sdhci_fsl_fdt_irq(void *arg)
  592 {
  593         struct sdhci_fsl_fdt_softc *sc;
  594 
  595         sc = arg;
  596         sdhci_generic_intr(&sc->slot);
  597         return;
  598 }
  599 
  600 static int
  601 sdhci_fsl_fdt_update_ios(device_t brdev, device_t reqdev)
  602 {
  603         int err;
  604         struct sdhci_fsl_fdt_softc *sc;
  605         struct mmc_ios *ios;
  606         struct sdhci_slot *slot;
  607 
  608         err = sdhci_generic_update_ios(brdev, reqdev);
  609         if (err != 0)
  610                 return (err);
  611 
  612         sc = device_get_softc(brdev);
  613         slot = device_get_ivars(reqdev);
  614         ios = &slot->host.ios;
  615 
  616         switch (ios->power_mode) {
  617         case power_on:
  618                 break;
  619         case power_off:
  620                 if (bootverbose)
  621                         device_printf(sc->dev, "Powering down sd/mmc\n");
  622 
  623                 if (sc->fdt_helper.vmmc_supply)
  624                         regulator_disable(sc->fdt_helper.vmmc_supply);
  625                 if (sc->fdt_helper.vqmmc_supply)
  626                         regulator_disable(sc->fdt_helper.vqmmc_supply);
  627                 break;
  628         case power_up:
  629                 if (bootverbose)
  630                         device_printf(sc->dev, "Powering up sd/mmc\n");
  631 
  632                 if (sc->fdt_helper.vmmc_supply)
  633                         regulator_enable(sc->fdt_helper.vmmc_supply);
  634                 if (sc->fdt_helper.vqmmc_supply)
  635                         regulator_enable(sc->fdt_helper.vqmmc_supply);
  636                 break;
  637         };
  638 
  639         return (0);
  640 }
  641 
  642 static int
  643 sdhci_fsl_fdt_switch_syscon_voltage(device_t dev,
  644     struct sdhci_fsl_fdt_softc *sc, enum mmc_vccq vccq)
  645 {
  646         struct syscon *syscon;
  647         phandle_t syscon_node;
  648         uint32_t reg;
  649 
  650         if (sc->soc_data->syscon_compat == NULL) {
  651                 device_printf(dev, "Empty syscon compat string.\n");
  652                 return (ENXIO);
  653         }
  654 
  655         syscon_node = ofw_bus_find_compatible(OF_finddevice("/"),
  656             sc->soc_data->syscon_compat);
  657 
  658         if (syscon_get_by_ofw_node(dev, syscon_node, &syscon) != 0) {
  659                 device_printf(dev, "Could not find syscon node.\n");
  660                 return (ENXIO);
  661         }
  662 
  663         reg = SYSCON_READ_4(syscon, SCFG_SDHCIOVSELCR);
  664         reg &= ~SCFG_SDHCIOVSELCR_VSELVAL_MASK;
  665         reg |= SCFG_SDHCIOVSELCR_TGLEN;
  666 
  667         switch (vccq) {
  668         case vccq_180:
  669                 reg |= SCFG_SDHCIOVSELCR_VSELVAL_1_8;
  670                 SYSCON_WRITE_4(syscon, SCFG_SDHCIOVSELCR, reg);
  671 
  672                 DELAY(5000);
  673 
  674                 reg = SYSCON_READ_4(syscon, SCFG_SDHCIOVSELCR);
  675                 reg |= SCFG_SDHCIOVSELCR_VS;
  676                 break;
  677         case vccq_330:
  678                 reg |= SCFG_SDHCIOVSELCR_VSELVAL_3_3;
  679                 SYSCON_WRITE_4(syscon, SCFG_SDHCIOVSELCR, reg);
  680 
  681                 DELAY(5000);
  682 
  683                 reg = SYSCON_READ_4(syscon, SCFG_SDHCIOVSELCR);
  684                 reg &= ~SCFG_SDHCIOVSELCR_VS;
  685                 break;
  686         default:
  687                 device_printf(dev, "Unsupported voltage requested.\n");
  688                 return (ENXIO);
  689         }
  690 
  691         SYSCON_WRITE_4(syscon, SCFG_SDHCIOVSELCR, reg);
  692 
  693         return (0);
  694 }
  695 
  696 static int
  697 sdhci_fsl_fdt_switch_vccq(device_t brdev, device_t reqdev)
  698 {
  699         struct sdhci_fsl_fdt_softc *sc;
  700         struct sdhci_slot *slot;
  701         regulator_t vqmmc_supply;
  702         uint32_t val_old, val;
  703         int uvolt, err = 0;
  704 
  705         sc = device_get_softc(brdev);
  706         slot = device_get_ivars(reqdev);
  707 
  708         val_old = val = RD4(sc, SDHCI_FSL_PROT_CTRL);
  709 
  710         switch (slot->host.ios.vccq) {
  711         case vccq_180:
  712                 if (sc->soc_data->errata & SDHCI_FSL_UNSUPP_1_8V)
  713                         return (EOPNOTSUPP);
  714 
  715                 val |= SDHCI_FSL_PROT_CTRL_VOLT_SEL;
  716                 uvolt = 1800000;
  717                 break;
  718         case vccq_330:
  719                 val &= ~SDHCI_FSL_PROT_CTRL_VOLT_SEL;
  720                 uvolt = 3300000;
  721                 break;
  722         default:
  723                 return (EOPNOTSUPP);
  724         }
  725 
  726         WR4(sc, SDHCI_FSL_PROT_CTRL, val);
  727 
  728         if (sc->soc_data->errata & SDHCI_FSL_MISSING_VCCQ_REG) {
  729                 err = sdhci_fsl_fdt_switch_syscon_voltage(brdev, sc,
  730                     slot->host.ios.vccq);
  731                 if (err != 0)
  732                         goto vccq_fail;
  733         }
  734 
  735         vqmmc_supply = sc->fdt_helper.vqmmc_supply;
  736         /*
  737          * Even though we expect to find a fixed regulator in this controller
  738          * family, let's play safe.
  739          */
  740         if (vqmmc_supply != NULL) {
  741                 err = regulator_set_voltage(vqmmc_supply, uvolt, uvolt);
  742                 if (err != 0)
  743                         goto vccq_fail;
  744         }
  745 
  746         return (0);
  747 
  748 vccq_fail:
  749         device_printf(sc->dev, "Cannot set vqmmc to %d<->%d\n", uvolt, uvolt);
  750         WR4(sc, SDHCI_FSL_PROT_CTRL, val_old);
  751 
  752         return (err);
  753 }
  754 
  755 static int
  756 sdhci_fsl_fdt_get_ro(device_t bus, device_t child)
  757 {
  758         struct sdhci_fsl_fdt_softc *sc;
  759 
  760         sc = device_get_softc(bus);
  761         return (sdhci_fdt_gpio_get_readonly(sc->gpio));
  762 }
  763 
  764 static bool
  765 sdhci_fsl_fdt_get_card_present(device_t dev, struct sdhci_slot *slot)
  766 {
  767         struct sdhci_fsl_fdt_softc *sc;
  768 
  769         sc = device_get_softc(dev);
  770         return (sdhci_fdt_gpio_get_present(sc->gpio));
  771 }
  772 
  773 static uint32_t
  774 sdhci_fsl_fdt_vddrange_to_mask(device_t dev, uint32_t *vdd_ranges, int len)
  775 {
  776         uint32_t vdd_min, vdd_max;
  777         uint32_t vdd_mask = 0;
  778         int i;
  779 
  780         /* Ranges are organized as pairs of values. */
  781         if ((len % 2) != 0) {
  782                 device_printf(dev, "Invalid voltage range\n");
  783                 return (0);
  784         }
  785         len = len / 2;
  786 
  787         for (i = 0; i < len; i++) {
  788                 vdd_min = vdd_ranges[2 * i];
  789                 vdd_max = vdd_ranges[2 * i + 1];
  790 
  791                 if (vdd_min > vdd_max || vdd_min < 1650 || vdd_min > 3600 ||
  792                     vdd_max < 1650 || vdd_max > 3600) {
  793                         device_printf(dev, "Voltage range %d - %d is out of bounds\n",
  794                             vdd_min, vdd_max);
  795                         return (0);
  796                 }
  797 
  798                 if (vdd_min <= 1800 && vdd_max >= 1800)
  799                         vdd_mask |= SDHCI_CAN_VDD_180;
  800                 if (vdd_min <= 3000 && vdd_max >= 3000)
  801                         vdd_mask |= SDHCI_CAN_VDD_300;
  802                 if (vdd_min <= 3300 && vdd_max >= 3300)
  803                         vdd_mask |= SDHCI_CAN_VDD_330;
  804         }
  805 
  806         return (vdd_mask);
  807 }
  808 
  809 static void
  810 sdhci_fsl_fdt_of_parse(device_t dev)
  811 {
  812         struct sdhci_fsl_fdt_softc *sc;
  813         phandle_t node;
  814         pcell_t *voltage_ranges;
  815         uint32_t vdd_mask = 0;
  816         ssize_t num_ranges;
  817 
  818         sc = device_get_softc(dev);
  819         node = ofw_bus_get_node(dev);
  820 
  821         /* Call mmc_fdt_parse in order to get mmc related properties. */
  822         mmc_fdt_parse(dev, node, &sc->fdt_helper, &sc->slot.host);
  823 
  824         sc->slot.caps = sdhci_fsl_fdt_read_4(dev, &sc->slot,
  825             SDHCI_CAPABILITIES) & ~(SDHCI_CAN_DO_SUSPEND);
  826         sc->slot.caps2 = sdhci_fsl_fdt_read_4(dev, &sc->slot,
  827             SDHCI_CAPABILITIES2);
  828 
  829         /* Parse the "voltage-ranges" dts property. */
  830         num_ranges = OF_getencprop_alloc(node, "voltage-ranges",
  831             (void **) &voltage_ranges);
  832         if (num_ranges <= 0)
  833                 return;
  834         vdd_mask = sdhci_fsl_fdt_vddrange_to_mask(dev, voltage_ranges,
  835             num_ranges / sizeof(uint32_t));
  836         OF_prop_free(voltage_ranges);
  837 
  838         /* Overwrite voltage caps only if we got something from dts. */
  839         if (vdd_mask != 0 &&
  840             (vdd_mask != (sc->slot.caps & SDHCI_FSL_CAN_VDD_MASK))) {
  841                 sc->slot.caps &= ~(SDHCI_FSL_CAN_VDD_MASK);
  842                 sc->slot.caps |= vdd_mask;
  843                 sc->slot.quirks |= SDHCI_QUIRK_MISSING_CAPS;
  844         }
  845 }
  846 
  847 static int
  848 sdhci_fsl_poll_register(struct sdhci_fsl_fdt_softc *sc,
  849     uint32_t reg, uint32_t mask, int value)
  850 {
  851         int retries;
  852 
  853         retries = SDHCI_FSL_MAX_RETRIES;
  854 
  855         while ((RD4(sc, reg) & mask) != value) {
  856                 if (!retries--)
  857                         return (ENXIO);
  858 
  859                 DELAY(10);
  860         }
  861 
  862         return (0);
  863 }
  864 
  865 static int
  866 sdhci_fsl_fdt_attach(device_t dev)
  867 {
  868         struct sdhci_fsl_fdt_softc *sc;
  869         struct mmc_host *host;
  870         uint32_t val, buf_order;
  871         uintptr_t ocd_data;
  872         uint64_t clk_hz;
  873         phandle_t node;
  874         int rid, ret;
  875         clk_t clk;
  876 
  877         node = ofw_bus_get_node(dev);
  878         sc = device_get_softc(dev);
  879         ocd_data = ofw_bus_search_compatible(dev,
  880             sdhci_fsl_fdt_compat_data)->ocd_data;
  881         sc->dev = dev;
  882         sc->flags = 0;
  883         host = &sc->slot.host;
  884         rid = 0;
  885 
  886         /*
  887          * LX2160A needs its own soc_data in order to apply SoC
  888          * specific quriks. Since the controller is identified
  889          * only with a generic compatible string we need to do this dance here.
  890          */
  891         if (ofw_bus_node_is_compatible(OF_finddevice("/"), "fsl,lx2160a"))
  892                 sc->soc_data = &sdhci_fsl_fdt_lx2160a_soc_data;
  893         else
  894                 sc->soc_data = (struct sdhci_fsl_fdt_soc_data *)ocd_data;
  895 
  896         sc->slot.quirks = sc->soc_data->quirks;
  897 
  898         sc->mem_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,
  899             RF_ACTIVE);
  900         if (sc->mem_res == NULL) {
  901                 device_printf(dev,
  902                     "Could not allocate resources for controller\n");
  903                 return (ENOMEM);
  904         }
  905 
  906         rid = 0;
  907         sc->irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
  908             RF_ACTIVE);
  909         if (sc->irq_res == NULL) {
  910                 device_printf(dev,
  911                     "Could not allocate irq resources for controller\n");
  912                 ret = ENOMEM;
  913                 goto err_free_mem;
  914         }
  915 
  916         ret = bus_setup_intr(dev, sc->irq_res, INTR_TYPE_BIO | INTR_MPSAFE,
  917             NULL, sdhci_fsl_fdt_irq, sc, &sc->irq_cookie);
  918         if (ret != 0) {
  919                 device_printf(dev, "Could not setup IRQ handler\n");
  920                 goto err_free_irq_res;
  921         }
  922 
  923         ret = clk_get_by_ofw_index(dev, node, 0, &clk);
  924         if (ret != 0) {
  925                 device_printf(dev, "Parent clock not found\n");
  926                 goto err_free_irq;
  927         }
  928 
  929         ret = clk_get_freq(clk, &clk_hz);
  930         if (ret != 0) {
  931                 device_printf(dev,
  932                     "Could not get parent clock frequency\n");
  933                 goto err_free_irq;
  934         }
  935 
  936         sc->baseclk_hz = clk_hz / sc->soc_data->baseclk_div;
  937 
  938         /* Figure out eSDHC block endianness before we touch any HW regs. */
  939         if (OF_hasprop(node, "little-endian")) {
  940                 sc->read = read_le;
  941                 sc->write = write_le;
  942                 buf_order = SDHCI_FSL_PROT_CTRL_BYTE_NATIVE;
  943         } else {
  944                 sc->read = read_be;
  945                 sc->write = write_be;
  946                 buf_order = SDHCI_FSL_PROT_CTRL_BYTE_SWAP;
  947         }
  948 
  949         sc->vendor_ver = (RD4(sc, SDHCI_FSL_HOST_VERSION) &
  950             SDHCI_VENDOR_VER_MASK) >> SDHCI_VENDOR_VER_SHIFT;
  951 
  952         sdhci_fsl_fdt_of_parse(dev);
  953         sc->maxclk_hz = host->f_max ? host->f_max : sc->baseclk_hz;
  954 
  955         /*
  956          * Setting this register affects byte order in SDHCI_BUFFER only.
  957          * If the eSDHC block is connected over a big-endian bus, the data
  958          * read from/written to the buffer will be already byte swapped.
  959          * In such a case, setting SDHCI_FSL_PROT_CTRL_BYTE_SWAP will convert
  960          * the byte order again, resulting in a native byte order.
  961          * The read/write callbacks accommodate for this behavior.
  962          */
  963         val = RD4(sc, SDHCI_FSL_PROT_CTRL);
  964         val &= ~SDHCI_FSL_PROT_CTRL_BYTE_MASK;
  965         WR4(sc, SDHCI_FSL_PROT_CTRL, val | buf_order);
  966 
  967         /*
  968          * Gate the SD clock and set its source to
  969          * peripheral clock / baseclk_div. The frequency in baseclk_hz is set
  970          * to match this.
  971          */
  972         val = RD4(sc, SDHCI_CLOCK_CONTROL);
  973         WR4(sc, SDHCI_CLOCK_CONTROL, val & ~SDHCI_FSL_CLK_SDCLKEN);
  974         val = RD4(sc, SDHCI_FSL_ESDHC_CTRL);
  975         WR4(sc, SDHCI_FSL_ESDHC_CTRL, val | SDHCI_FSL_ESDHC_CTRL_CLK_DIV2);
  976         sc->slot.max_clk = sc->maxclk_hz;
  977         sc->gpio = sdhci_fdt_gpio_setup(dev, &sc->slot);
  978 
  979         /*
  980          * Set the buffer watermark level to 128 words (512 bytes) for both
  981          * read and write. The hardware has a restriction that when the read or
  982          * write ready status is asserted, that means you can read exactly the
  983          * number of words set in the watermark register before you have to
  984          * re-check the status and potentially wait for more data. The main
  985          * sdhci driver provides no hook for doing status checking on less than
  986          * a full block boundary, so we set the watermark level to be a full
  987          * block. Reads and writes where the block size is less than the
  988          * watermark size will work correctly too, no need to change the
  989          * watermark for different size blocks. However, 128 is the maximum
  990          * allowed for the watermark, so PIO is limitted to 512 byte blocks.
  991          */
  992         WR4(sc, SDHCI_FSL_WTMK_LVL, SDHCI_FSL_WTMK_WR_512B |
  993             SDHCI_FSL_WTMK_RD_512B);
  994 
  995         ret = sdhci_init_slot(dev, &sc->slot, 0);
  996         if (ret != 0)
  997                 goto err_free_gpio;
  998         sc->slot_init_done = true;
  999         sdhci_start_slot(&sc->slot);
 1000 
 1001         return (bus_generic_attach(dev));
 1002 
 1003 err_free_gpio:
 1004         sdhci_fdt_gpio_teardown(sc->gpio);
 1005 err_free_irq:
 1006         bus_teardown_intr(dev, sc->irq_res, sc->irq_cookie);
 1007 err_free_irq_res:
 1008         bus_free_resource(dev, SYS_RES_IRQ, sc->irq_res);
 1009 err_free_mem:
 1010         bus_free_resource(dev, SYS_RES_MEMORY, sc->mem_res);
 1011         return (ret);
 1012 }
 1013 
 1014 static int
 1015 sdhci_fsl_fdt_detach(device_t dev)
 1016 {
 1017         struct sdhci_fsl_fdt_softc *sc;
 1018 
 1019         sc = device_get_softc(dev);
 1020         if (sc->slot_init_done)
 1021                 sdhci_cleanup_slot(&sc->slot);
 1022         if (sc->gpio != NULL)
 1023                 sdhci_fdt_gpio_teardown(sc->gpio);
 1024         if (sc->irq_cookie != NULL)
 1025                 bus_teardown_intr(dev, sc->irq_res, sc->irq_cookie);
 1026         if (sc->irq_res != NULL)
 1027                 bus_free_resource(dev, SYS_RES_IRQ, sc->irq_res);
 1028         if (sc->mem_res != NULL)
 1029                 bus_free_resource(dev, SYS_RES_MEMORY, sc->mem_res);
 1030         return (0);
 1031 }
 1032 
 1033 static int
 1034 sdhci_fsl_fdt_probe(device_t dev)
 1035 {
 1036 
 1037         if (!ofw_bus_status_okay(dev))
 1038                 return (ENXIO);
 1039 
 1040         if (!ofw_bus_search_compatible(dev,
 1041            sdhci_fsl_fdt_compat_data)->ocd_data)
 1042                 return (ENXIO);
 1043 
 1044         device_set_desc(dev, "NXP QorIQ Layerscape eSDHC controller");
 1045         return (BUS_PROBE_DEFAULT);
 1046 }
 1047 
 1048 static int
 1049 sdhci_fsl_fdt_read_ivar(device_t bus, device_t child, int which,
 1050     uintptr_t *result)
 1051 {
 1052         struct sdhci_slot *slot = device_get_ivars(child);
 1053 
 1054         if (which == MMCBR_IVAR_MAX_DATA && (slot->opt & SDHCI_HAVE_DMA)) {
 1055                 /*
 1056                  * In the absence of SDMA buffer boundary functionality,
 1057                  * limit the maximum data length per read/write command
 1058                  * to bounce buffer size.
 1059                  */
 1060                 *result = howmany(slot->sdma_bbufsz, 512);
 1061                 return (0);
 1062         }
 1063         return (sdhci_generic_read_ivar(bus, child, which, result));
 1064 }
 1065 
 1066 static int
 1067 sdhci_fsl_fdt_write_ivar(device_t bus, device_t child, int which,
 1068     uintptr_t value)
 1069 {
 1070         struct sdhci_fsl_fdt_softc *sc;
 1071         struct sdhci_slot *slot = device_get_ivars(child);
 1072         uint32_t prescale, div;
 1073 
 1074         /* Don't depend on clock resolution limits from sdhci core. */
 1075         if (which == MMCBR_IVAR_CLOCK) {
 1076                 if (value == 0) {
 1077                         slot->host.ios.clock = 0;
 1078                         return (0);
 1079                 }
 1080 
 1081                 sc = device_get_softc(bus);
 1082 
 1083                 SDHCI_FSL_FDT_CLK_DIV(sc, sc->baseclk_hz, value, prescale, div);
 1084                 slot->host.ios.clock = sc->baseclk_hz / (prescale * div);
 1085 
 1086                 return (0);
 1087         }
 1088 
 1089         return (sdhci_generic_write_ivar(bus, child, which, value));
 1090 }
 1091 
 1092 static void
 1093 sdhci_fsl_fdt_reset(device_t dev, struct sdhci_slot *slot, uint8_t mask)
 1094 {
 1095         struct sdhci_fsl_fdt_softc *sc;
 1096         uint32_t val;
 1097 
 1098         sdhci_generic_reset(dev, slot, mask);
 1099 
 1100         if (!(mask & SDHCI_RESET_ALL))
 1101                 return;
 1102 
 1103         sc = device_get_softc(dev);
 1104 
 1105         /* Some registers have to be cleared by hand. */
 1106         if (slot->version >= SDHCI_SPEC_300) {
 1107                 val = RD4(sc, SDHCI_FSL_TBCTL);
 1108                 val &= ~SDHCI_FSL_TBCTL_TBEN;
 1109                 WR4(sc, SDHCI_FSL_TBCTL, val);
 1110         }
 1111 
 1112         /*
 1113          * Pulse width detection is not reliable on some boards. Perform
 1114          * workaround by clearing register's bit according to errata.
 1115          */
 1116         if (sc->soc_data->errata & SDHCI_FSL_UNRELIABLE_PULSE_DET) {
 1117                 val = RD4(sc, SDHCI_FSL_DLLCFG1);
 1118                 val &= ~SDHCI_FSL_DLLCFG1_PULSE_STRETCH;
 1119                 WR4(sc, SDHCI_FSL_DLLCFG1, val);
 1120         }
 1121 
 1122         sc->flags = 0;
 1123 }
 1124 
 1125 static void
 1126 sdhci_fsl_switch_tuning_block(device_t dev, bool enable)
 1127 {
 1128         struct sdhci_fsl_fdt_softc *sc;
 1129         uint32_t reg;
 1130 
 1131         sc = device_get_softc(dev);
 1132 
 1133         reg = RD4(sc, SDHCI_FSL_TBCTL);
 1134 
 1135         if (enable)
 1136                 reg |= SDHCI_FSL_TBCTL_TBEN;
 1137         else
 1138                 reg &= ~SDHCI_FSL_TBCTL_TBEN;
 1139 
 1140         WR4(sc, SDHCI_FSL_TBCTL, reg);
 1141 }
 1142 
 1143 static int
 1144 sdhci_fsl_sw_tuning(struct sdhci_fsl_fdt_softc *sc, device_t bus,
 1145     device_t child, bool hs400, uint32_t wnd_start, uint32_t wnd_end)
 1146 {
 1147         uint32_t reg;
 1148         int error;
 1149 
 1150         if (sc->soc_data->errata & SDHCI_FSL_TUNING_ERRATUM_TYPE1 ||
 1151             abs(wnd_start - wnd_end) <= (4 * sc->div_ratio + 2)) {
 1152                 wnd_start = 5 * sc->div_ratio;
 1153                 wnd_end = 3 * sc->div_ratio;
 1154         } else {
 1155                 wnd_start = 8 * sc->div_ratio;
 1156                 wnd_end = 4 * sc->div_ratio;
 1157         }
 1158 
 1159         reg = RD4(sc, SDHCI_FSL_TBPTR);
 1160         reg &= ~SDHCI_FSL_TBPTR_WND_MASK;
 1161         reg &= ~(SDHCI_FSL_TBPTR_WND_MASK << SDHCI_FSL_TBPTR_WND_START_SHIFT);
 1162         reg |= wnd_start << SDHCI_FSL_TBPTR_WND_START_SHIFT;
 1163         reg |= wnd_end;
 1164         WR4(sc, SDHCI_FSL_TBPTR, reg);
 1165 
 1166         /*
 1167          * Normally those are supposed to be set in sdhci_execute_tuning.
 1168          * However in our case we need a small delay between setting the two.
 1169          */
 1170         reg = RD4(sc, SDHCI_FSL_AUTOCERR);
 1171         reg |= SDHCI_FSL_AUTOCERR_EXTN;
 1172         WR4(sc, SDHCI_FSL_AUTOCERR, reg);
 1173         DELAY(10);
 1174         reg |= SDHCI_FSL_AUTOCERR_SMPCLKSEL;
 1175         WR4(sc, SDHCI_FSL_AUTOCERR, reg);
 1176 
 1177         reg = RD4(sc, SDHCI_FSL_TBCTL);
 1178         reg &= ~SDHCI_FSL_TBCTL_TB_MODE_MASK;
 1179         reg |= SDHCI_FSL_TBCTL_MODE_SW;
 1180         WR4(sc, SDHCI_FSL_TBCTL, reg);
 1181 
 1182         error = sdhci_generic_tune(bus, child, hs400);
 1183         if (error != 0) {
 1184                 device_printf(bus,
 1185                     "Failed to execute generic tune while performing software tuning.\n");
 1186         }
 1187 
 1188         return (error);
 1189 }
 1190 
 1191 static int
 1192 sdhci_fsl_fdt_tune(device_t bus, device_t child, bool hs400)
 1193 {
 1194         struct sdhci_fsl_fdt_softc *sc;
 1195         uint32_t wnd_start, wnd_end;
 1196         uint32_t clk_divider, reg;
 1197         struct sdhci_slot *slot;
 1198         int error;
 1199 
 1200         sc = device_get_softc(bus);
 1201         slot = device_get_ivars(child);
 1202         error = 0;
 1203         clk_divider = sc->baseclk_hz / slot->clock;
 1204 
 1205         switch (sc->slot.host.ios.timing) {
 1206         case bus_timing_mmc_hs400:
 1207                 return (EINVAL);
 1208         case bus_timing_mmc_hs200:
 1209         case bus_timing_uhs_ddr50:
 1210         case bus_timing_uhs_sdr104:
 1211                 break;
 1212         case bus_timing_uhs_sdr50:
 1213                 if (slot->opt & SDHCI_SDR50_NEEDS_TUNING)
 1214                         break;
 1215         default:
 1216                 return (0);
 1217         }
 1218 
 1219         /*
 1220          * For tuning mode SD clock divider must be within 3 to 16.
 1221          * We also need to match the frequency to whatever mode is used.
 1222          * For that reason we're just bailing if the dividers don't match
 1223          * that requirement.
 1224          */
 1225         if (clk_divider < 3 || clk_divider > 16)
 1226                 return (ENXIO);
 1227 
 1228         if (hs400)
 1229                 sc->flags |= SDHCI_FSL_HS400_FLAG;
 1230 
 1231         /* Disable clock. */
 1232         fsl_sdhc_fdt_set_clock(sc, slot, sc->sdclk_bits);
 1233 
 1234         /* Wait for PRSSTAT[SDSTB] to be set by hardware. */
 1235         error = sdhci_fsl_poll_register(sc, SDHCI_FSL_PRES_STATE,
 1236             SDHCI_FSL_PRES_SDSTB, SDHCI_FSL_PRES_SDSTB);
 1237         if (error != 0)
 1238                 device_printf(bus,
 1239                     "Timeout while waiting for clock to stabilize.\n");
 1240 
 1241         /* Flush async IO. */
 1242         reg = RD4(sc, SDHCI_FSL_ESDHC_CTRL);
 1243         reg |= SDHCI_FSL_ESDHC_CTRL_FAF;
 1244         WR4(sc, SDHCI_FSL_ESDHC_CTRL, reg);
 1245 
 1246         /* Wait for ESDHC[FAF] to be cleared by hardware. */
 1247         error = sdhci_fsl_poll_register(sc, SDHCI_FSL_ESDHC_CTRL,
 1248             SDHCI_FSL_ESDHC_CTRL_FAF, 0);
 1249         if (error)
 1250                 device_printf(bus,
 1251                     "Timeout while waiting for hardware.\n");
 1252 
 1253         /*
 1254          * Set TBCTL[TB_EN] register and program valid tuning mode.
 1255          * According to RM MODE_3 means that:
 1256          * "eSDHC takes care of the re-tuning during data transfer
 1257          * (auto re-tuning).".
 1258          * Tuning mode can only be changed while the clock is disabled.
 1259          */
 1260         reg = RD4(sc, SDHCI_FSL_TBCTL);
 1261         reg &= ~SDHCI_FSL_TBCTL_TB_MODE_MASK;
 1262         reg |= SDHCI_FSL_TBCTL_TBEN | SDHCI_FSL_TBCTL_MODE_3;
 1263         WR4(sc, SDHCI_FSL_TBCTL, reg);
 1264 
 1265         /* Enable clock. */
 1266         fsl_sdhc_fdt_set_clock(sc, slot, SDHCI_CLOCK_CARD_EN | sc->sdclk_bits);
 1267 
 1268         /* Wait for clock to stabilize. */
 1269         error = sdhci_fsl_poll_register(sc, SDHCI_FSL_PRES_STATE,
 1270             SDHCI_FSL_PRES_SDSTB, SDHCI_FSL_PRES_SDSTB);
 1271         if (error)
 1272                 device_printf(bus,
 1273                     "Timeout while waiting for clock to stabilize.\n");
 1274 
 1275         /* Perform hardware tuning. */
 1276         error = sdhci_generic_tune(bus, child, hs400);
 1277 
 1278         reg = RD4(sc, SDHCI_FSL_TBPTR);
 1279         wnd_start = reg >> SDHCI_FSL_TBPTR_WND_START_SHIFT;
 1280         wnd_start &= SDHCI_FSL_TBPTR_WND_MASK;
 1281         wnd_end = reg & SDHCI_FSL_TBPTR_WND_MASK;
 1282 
 1283         /*
 1284          * For erratum type2 affected platforms, the controller can erroneously
 1285          * declare that the tuning was successful. Verify the tuning window to
 1286          * make sure that we're fine.
 1287          */
 1288         if (error == 0 &&
 1289             sc->soc_data->errata & SDHCI_FSL_TUNING_ERRATUM_TYPE2 &&
 1290             abs(wnd_start - wnd_end) > (4 * sc->div_ratio + 2)) {
 1291                 error = EIO;
 1292         }
 1293 
 1294         /* If hardware tuning failed, try software tuning. */
 1295         if (error != 0 &&
 1296             (sc->soc_data->errata &
 1297             (SDHCI_FSL_TUNING_ERRATUM_TYPE1 |
 1298             SDHCI_FSL_TUNING_ERRATUM_TYPE2))) {
 1299                 error = sdhci_fsl_sw_tuning(sc, bus, child, hs400, wnd_start,
 1300                     wnd_end);
 1301                 if (error != 0)
 1302                         device_printf(bus, "Software tuning failed.\n");
 1303         }
 1304 
 1305         if (error != 0) {
 1306                 sdhci_fsl_switch_tuning_block(bus, false);
 1307                 return (error);
 1308         }
 1309         if (hs400) {
 1310                 reg = RD4(sc, SDHCI_FSL_SDTIMINGCTL);
 1311                 reg |= SDHCI_FSL_SDTIMINGCTL_FLW_CTL;
 1312                 WR4(sc, SDHCI_FSL_SDTIMINGCTL, reg);
 1313         }
 1314 
 1315         return (0);
 1316 }
 1317 
 1318 static int
 1319 sdhci_fsl_fdt_retune(device_t bus, device_t child, bool reset)
 1320 {
 1321         struct sdhci_slot *slot;
 1322         struct sdhci_fsl_fdt_softc *sc;
 1323 
 1324         slot = device_get_ivars(child);
 1325         sc = device_get_softc(bus);
 1326 
 1327         if (!(slot->opt & SDHCI_TUNING_ENABLED))
 1328                 return (0);
 1329 
 1330         /* HS400 must be tuned in HS200 mode. */
 1331         if (slot->host.ios.timing == bus_timing_mmc_hs400)
 1332                 return (EINVAL);
 1333 
 1334         /*
 1335          * Only re-tuning with full reset is supported.
 1336          * The controller is normally put in "mode 3", which means that
 1337          * periodic re-tuning is done automatically. See comment in
 1338          * sdhci_fsl_fdt_tune for details.
 1339          * Because of that re-tuning should only be triggered as a result
 1340          * of a CRC error.
 1341          */
 1342          if (!reset)
 1343                 return (ENOTSUP);
 1344 
 1345         return (sdhci_fsl_fdt_tune(bus, child,
 1346             sc->flags & SDHCI_FSL_HS400_FLAG));
 1347 }
 1348 static void
 1349 sdhci_fsl_disable_hs400_mode(device_t dev, struct sdhci_fsl_fdt_softc *sc)
 1350 {
 1351         uint32_t reg;
 1352         int error;
 1353 
 1354         /* Check if HS400 is enabled right now. */
 1355         reg = RD4(sc, SDHCI_FSL_TBCTL);
 1356         if ((reg & SDHCI_FSL_TBCTL_HS400_EN) == 0)
 1357                 return;
 1358 
 1359         reg = RD4(sc, SDHCI_FSL_SDTIMINGCTL);
 1360         reg &= ~SDHCI_FSL_SDTIMINGCTL_FLW_CTL;
 1361         WR4(sc, SDHCI_FSL_SDTIMINGCTL, reg);
 1362 
 1363         reg = RD4(sc, SDHCI_FSL_SDCLKCTL);
 1364         reg &= ~SDHCI_FSL_SDCLKCTL_CMD_CLK_CTL;
 1365         WR4(sc, SDHCI_FSL_SDCLKCTL, reg);
 1366 
 1367         fsl_sdhc_fdt_set_clock(sc, &sc->slot, sc->sdclk_bits);
 1368         error = sdhci_fsl_poll_register(sc, SDHCI_FSL_PRES_STATE,
 1369             SDHCI_FSL_PRES_SDSTB, SDHCI_FSL_PRES_SDSTB);
 1370         if (error != 0)
 1371                 device_printf(dev,
 1372                     "Internal clock never stabilized.\n");
 1373 
 1374         reg = RD4(sc, SDHCI_FSL_TBCTL);
 1375         reg &= ~SDHCI_FSL_TBCTL_HS400_EN;
 1376         WR4(sc, SDHCI_FSL_TBCTL, reg);
 1377 
 1378         fsl_sdhc_fdt_set_clock(sc, &sc->slot, SDHCI_CLOCK_CARD_EN |
 1379             sc->sdclk_bits);
 1380 
 1381         error = sdhci_fsl_poll_register(sc, SDHCI_FSL_PRES_STATE,
 1382             SDHCI_FSL_PRES_SDSTB, SDHCI_FSL_PRES_SDSTB);
 1383         if (error != 0)
 1384                 device_printf(dev,
 1385                     "Internal clock never stabilized.\n");
 1386 
 1387         reg = RD4(sc, SDHCI_FSL_DLLCFG0);
 1388         reg &= ~(SDHCI_FSL_DLLCFG0_EN |
 1389             SDHCI_FSL_DLLCFG0_FREQ_SEL);
 1390         WR4(sc, SDHCI_FSL_DLLCFG0, reg);
 1391 
 1392         reg = RD4(sc, SDHCI_FSL_TBCTL);
 1393         reg &= ~SDHCI_FSL_TBCTL_HS400_WND_ADJ;
 1394         WR4(sc, SDHCI_FSL_TBCTL, reg);
 1395 
 1396         sdhci_fsl_switch_tuning_block(dev, false);
 1397 }
 1398 
 1399 static void
 1400 sdhci_fsl_enable_hs400_mode(device_t dev, struct sdhci_slot *slot,
 1401     struct sdhci_fsl_fdt_softc *sc)
 1402 {
 1403         uint32_t reg;
 1404         int error;
 1405 
 1406         sdhci_fsl_switch_tuning_block(dev, true);
 1407         fsl_sdhc_fdt_set_clock(sc, slot, sc->sdclk_bits);
 1408 
 1409         error = sdhci_fsl_poll_register(sc, SDHCI_FSL_PRES_STATE,
 1410             SDHCI_FSL_PRES_SDSTB, SDHCI_FSL_PRES_SDSTB);
 1411         if (error != 0)
 1412                 device_printf(dev,
 1413                     "Timeout while waiting for clock to stabilize.\n");
 1414 
 1415         reg = RD4(sc, SDHCI_FSL_TBCTL);
 1416         reg |= SDHCI_FSL_TBCTL_HS400_EN;
 1417         WR4(sc, SDHCI_FSL_TBCTL, reg);
 1418         reg = RD4(sc, SDHCI_FSL_SDCLKCTL);
 1419         reg |= SDHCI_FSL_SDCLKCTL_CMD_CLK_CTL;
 1420         WR4(sc, SDHCI_FSL_SDCLKCTL, reg);
 1421 
 1422         fsl_sdhc_fdt_set_clock(sc, slot, SDHCI_CLOCK_CARD_EN |
 1423             sc->sdclk_bits);
 1424         error = sdhci_fsl_poll_register(sc, SDHCI_FSL_PRES_STATE,
 1425             SDHCI_FSL_PRES_SDSTB, SDHCI_FSL_PRES_SDSTB);
 1426         if (error != 0)
 1427                 device_printf(dev,
 1428                     "Timeout while waiting for clock to stabilize.\n");
 1429 
 1430         reg = RD4(sc, SDHCI_FSL_DLLCFG0);
 1431         reg |= SDHCI_FSL_DLLCFG0_EN | SDHCI_FSL_DLLCFG0_RESET |
 1432             SDHCI_FSL_DLLCFG0_FREQ_SEL;
 1433         WR4(sc, SDHCI_FSL_DLLCFG0, reg);
 1434 
 1435         /*
 1436          * The reset bit is not a self clearing one.
 1437          * Give it some time and clear it manually.
 1438          */
 1439         DELAY(100);
 1440         reg &= ~SDHCI_FSL_DLLCFG0_RESET;
 1441         WR4(sc, SDHCI_FSL_DLLCFG0, reg);
 1442 
 1443         error = sdhci_fsl_poll_register(sc, SDHCI_FSL_DLLSTAT0,
 1444             SDHCI_FSL_DLLSTAT0_SLV_STS, SDHCI_FSL_DLLSTAT0_SLV_STS);
 1445         if (error != 0)
 1446                 device_printf(dev,
 1447                     "Timeout while waiting for DLL0.\n");
 1448 
 1449         reg = RD4(sc, SDHCI_FSL_TBCTL);
 1450         reg |= SDHCI_FSL_TBCTL_HS400_WND_ADJ;
 1451         WR4(sc, SDHCI_FSL_TBCTL, reg);
 1452 
 1453         fsl_sdhc_fdt_set_clock(sc, slot, sc->sdclk_bits);
 1454 
 1455         error = sdhci_fsl_poll_register(sc, SDHCI_FSL_PRES_STATE,
 1456             SDHCI_FSL_PRES_SDSTB, SDHCI_FSL_PRES_SDSTB);
 1457         if (error != 0)
 1458                 device_printf(dev,
 1459                     "timeout while waiting for clock to stabilize.\n");
 1460 
 1461         reg = RD4(sc, SDHCI_FSL_ESDHC_CTRL);
 1462         reg |= SDHCI_FSL_ESDHC_CTRL_FAF;
 1463         WR4(sc, SDHCI_FSL_ESDHC_CTRL, reg);
 1464 
 1465         error = sdhci_fsl_poll_register(sc, SDHCI_FSL_ESDHC_CTRL,
 1466             SDHCI_FSL_ESDHC_CTRL_FAF, 0);
 1467         if (error != 0)
 1468                 device_printf(dev,
 1469                     "Timeout while waiting for hardware.\n");
 1470 
 1471         fsl_sdhc_fdt_set_clock(sc, slot, SDHCI_CLOCK_CARD_EN |
 1472             sc->sdclk_bits);
 1473 
 1474         error = sdhci_fsl_poll_register(sc, SDHCI_FSL_PRES_STATE,
 1475             SDHCI_FSL_PRES_SDSTB, SDHCI_FSL_PRES_SDSTB);
 1476         if (error != 0)
 1477                 device_printf(dev,
 1478                     "Timeout while waiting for clock to stabilize.\n");
 1479 }
 1480 
 1481 static void
 1482 sdhci_fsl_fdt_set_uhs_timing(device_t dev, struct sdhci_slot *slot)
 1483 {
 1484         struct sdhci_fsl_fdt_softc *sc;
 1485         const struct mmc_ios *ios;
 1486         uint32_t mode, reg;
 1487 
 1488         sc = device_get_softc(dev);
 1489         ios = &slot->host.ios;
 1490         mode = 0;
 1491 
 1492         /*
 1493          * When we switch to HS400 this function is called twice.
 1494          * First after the timing is set, and then after the clock
 1495          * is changed to the target frequency.
 1496          * The controller can be switched to HS400 only after the latter
 1497          * is done.
 1498          */
 1499         if (slot->host.ios.timing == bus_timing_mmc_hs400 &&
 1500             ios->clock > SD_SDR50_MAX)
 1501                 sdhci_fsl_enable_hs400_mode(dev, slot, sc);
 1502         else if (slot->host.ios.timing < bus_timing_mmc_hs400) {
 1503                 sdhci_fsl_disable_hs400_mode(dev, sc);
 1504 
 1505                 /*
 1506                  * Switching to HS400 requires a custom procedure executed in
 1507                  * sdhci_fsl_enable_hs400_mode in case above.
 1508                  * For all other modes we just need to set the corresponding flag.
 1509                  */
 1510                 reg = RD4(sc, SDHCI_FSL_AUTOCERR);
 1511                 reg &= ~SDHCI_FSL_AUTOCERR_UHMS;
 1512                 if (ios->clock > SD_SDR50_MAX)
 1513                         mode = SDHCI_CTRL2_UHS_SDR104;
 1514                 else if (ios->clock > SD_SDR25_MAX)
 1515                         mode = SDHCI_CTRL2_UHS_SDR50;
 1516                 else if (ios->clock > SD_SDR12_MAX) {
 1517                         if (ios->timing == bus_timing_uhs_ddr50 ||
 1518                             ios->timing == bus_timing_mmc_ddr52)
 1519                                 mode = SDHCI_CTRL2_UHS_DDR50;
 1520                         else
 1521                                 mode = SDHCI_CTRL2_UHS_SDR25;
 1522                 } else if (ios->clock > SD_MMC_CARD_ID_FREQUENCY)
 1523                         mode = SDHCI_CTRL2_UHS_SDR12;
 1524 
 1525                 reg |= mode << SDHCI_FSL_AUTOCERR_UHMS_SHIFT;
 1526                 WR4(sc, SDHCI_FSL_AUTOCERR, reg);
 1527         }
 1528 }
 1529 
 1530 static const device_method_t sdhci_fsl_fdt_methods[] = {
 1531         /* Device interface. */
 1532         DEVMETHOD(device_probe,                 sdhci_fsl_fdt_probe),
 1533         DEVMETHOD(device_attach,                sdhci_fsl_fdt_attach),
 1534         DEVMETHOD(device_detach,                sdhci_fsl_fdt_detach),
 1535 
 1536         /* Bus interface. */
 1537         DEVMETHOD(bus_read_ivar,                sdhci_fsl_fdt_read_ivar),
 1538         DEVMETHOD(bus_write_ivar,               sdhci_fsl_fdt_write_ivar),
 1539 
 1540         /* MMC bridge interface. */
 1541         DEVMETHOD(mmcbr_request,                sdhci_generic_request),
 1542         DEVMETHOD(mmcbr_get_ro,                 sdhci_fsl_fdt_get_ro),
 1543         DEVMETHOD(mmcbr_acquire_host,           sdhci_generic_acquire_host),
 1544         DEVMETHOD(mmcbr_release_host,           sdhci_generic_release_host),
 1545         DEVMETHOD(mmcbr_switch_vccq,            sdhci_fsl_fdt_switch_vccq),
 1546         DEVMETHOD(mmcbr_update_ios,             sdhci_fsl_fdt_update_ios),
 1547         DEVMETHOD(mmcbr_tune,                   sdhci_fsl_fdt_tune),
 1548         DEVMETHOD(mmcbr_retune,                 sdhci_fsl_fdt_retune),
 1549 
 1550         /* SDHCI accessors. */
 1551         DEVMETHOD(sdhci_read_1,                 sdhci_fsl_fdt_read_1),
 1552         DEVMETHOD(sdhci_read_2,                 sdhci_fsl_fdt_read_2),
 1553         DEVMETHOD(sdhci_read_4,                 sdhci_fsl_fdt_read_4),
 1554         DEVMETHOD(sdhci_read_multi_4,           sdhci_fsl_fdt_read_multi_4),
 1555         DEVMETHOD(sdhci_write_1,                sdhci_fsl_fdt_write_1),
 1556         DEVMETHOD(sdhci_write_2,                sdhci_fsl_fdt_write_2),
 1557         DEVMETHOD(sdhci_write_4,                sdhci_fsl_fdt_write_4),
 1558         DEVMETHOD(sdhci_write_multi_4,          sdhci_fsl_fdt_write_multi_4),
 1559         DEVMETHOD(sdhci_get_card_present,       sdhci_fsl_fdt_get_card_present),
 1560         DEVMETHOD(sdhci_reset,                  sdhci_fsl_fdt_reset),
 1561         DEVMETHOD(sdhci_set_uhs_timing,         sdhci_fsl_fdt_set_uhs_timing),
 1562         DEVMETHOD_END
 1563 };
 1564 
 1565 static driver_t sdhci_fsl_fdt_driver = {
 1566         "sdhci_fsl_fdt",
 1567         sdhci_fsl_fdt_methods,
 1568         sizeof(struct sdhci_fsl_fdt_softc),
 1569 };
 1570 
 1571 DRIVER_MODULE(sdhci_fsl_fdt, simplebus, sdhci_fsl_fdt_driver, NULL, NULL);
 1572 SDHCI_DEPEND(sdhci_fsl_fdt);
 1573 
 1574 #ifndef MMCCAM
 1575 MMC_DECLARE_BRIDGE(sdhci_fsl_fdt);
 1576 #endif

Cache object: d55ce8192c9ce52ca793ac052350022d


[ 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.