uboot/drivers/mmc/tangier_sdhci.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * Copyright (c) 2017 Intel Corporation
   4 */
   5#include <common.h>
   6#include <dm.h>
   7#include <dm/device.h>
   8#include <linux/io.h>
   9#include <linux/sizes.h>
  10#include <malloc.h>
  11#include <mmc.h>
  12#include <sdhci.h>
  13
  14#define SDHCI_TANGIER_FMAX      200000000
  15#define SDHCI_TANGIER_FMIN      400000
  16
  17struct sdhci_tangier_plat {
  18        struct mmc_config cfg;
  19        struct mmc mmc;
  20        void __iomem *ioaddr;
  21};
  22
  23static int sdhci_tangier_bind(struct udevice *dev)
  24{
  25        struct sdhci_tangier_plat *plat = dev_get_plat(dev);
  26
  27        return sdhci_bind(dev, &plat->mmc, &plat->cfg);
  28}
  29
  30static int sdhci_tangier_probe(struct udevice *dev)
  31{
  32        struct mmc_uclass_priv *upriv = dev_get_uclass_priv(dev);
  33        struct sdhci_tangier_plat *plat = dev_get_plat(dev);
  34        struct sdhci_host *host = dev_get_priv(dev);
  35        fdt_addr_t base;
  36        int ret;
  37
  38        base = dev_read_addr(dev);
  39        if (base == FDT_ADDR_T_NONE)
  40                return -EINVAL;
  41
  42        plat->ioaddr = devm_ioremap(dev, base, SZ_1K);
  43        if (!plat->ioaddr)
  44                return -ENOMEM;
  45
  46        host->name = dev->name;
  47        host->ioaddr = plat->ioaddr;
  48        host->quirks = SDHCI_QUIRK_NO_HISPD_BIT | SDHCI_QUIRK_BROKEN_VOLTAGE |
  49                       SDHCI_QUIRK_32BIT_DMA_ADDR | SDHCI_QUIRK_WAIT_SEND_CMD;
  50
  51        /* MMC_VDD_32_33 | MMC_VDD_33_34 | MMC_VDD_165_195 */
  52        host->voltages = MMC_VDD_165_195;
  53
  54        host->mmc = &plat->mmc;
  55        host->mmc->dev = dev;
  56        ret = sdhci_setup_cfg(&plat->cfg, host, SDHCI_TANGIER_FMAX,
  57                        SDHCI_TANGIER_FMIN);
  58        if (ret)
  59                return ret;
  60
  61        upriv->mmc = &plat->mmc;
  62        host->mmc->priv = host;
  63
  64        return sdhci_probe(dev);
  65}
  66
  67static const struct udevice_id sdhci_tangier_match[] = {
  68        { .compatible = "intel,sdhci-tangier" },
  69        { /* sentinel */ }
  70};
  71
  72U_BOOT_DRIVER(sdhci_tangier) = {
  73        .name           = "sdhci-tangier",
  74        .id             = UCLASS_MMC,
  75        .of_match       = sdhci_tangier_match,
  76        .bind           = sdhci_tangier_bind,
  77        .probe          = sdhci_tangier_probe,
  78        .ops            = &sdhci_ops,
  79        .priv_auto      = sizeof(struct sdhci_host),
  80        .plat_auto      = sizeof(struct sdhci_tangier_plat),
  81};
  82