linux/drivers/mmc/core/host.c
<<
>>
Prefs
   1/*
   2 *  linux/drivers/mmc/core/host.c
   3 *
   4 *  Copyright (C) 2003 Russell King, All Rights Reserved.
   5 *  Copyright (C) 2007-2008 Pierre Ossman
   6 *  Copyright (C) 2010 Linus Walleij
   7 *
   8 * This program is free software; you can redistribute it and/or modify
   9 * it under the terms of the GNU General Public License version 2 as
  10 * published by the Free Software Foundation.
  11 *
  12 *  MMC host class device management
  13 */
  14
  15#include <linux/device.h>
  16#include <linux/err.h>
  17#include <linux/idr.h>
  18#include <linux/of.h>
  19#include <linux/of_gpio.h>
  20#include <linux/pagemap.h>
  21#include <linux/export.h>
  22#include <linux/leds.h>
  23#include <linux/slab.h>
  24
  25#include <linux/mmc/host.h>
  26#include <linux/mmc/card.h>
  27#include <linux/mmc/slot-gpio.h>
  28
  29#include "core.h"
  30#include "host.h"
  31#include "slot-gpio.h"
  32#include "sdio_ops.h"
  33
  34#define cls_dev_to_mmc_host(d)  container_of(d, struct mmc_host, class_dev)
  35
  36static DEFINE_IDA(mmc_host_ida);
  37
  38static void mmc_host_classdev_release(struct device *dev)
  39{
  40        struct mmc_host *host = cls_dev_to_mmc_host(dev);
  41        ida_simple_remove(&mmc_host_ida, host->index);
  42        kfree(host);
  43}
  44
  45static struct class mmc_host_class = {
  46        .name           = "mmc_host",
  47        .dev_release    = mmc_host_classdev_release,
  48};
  49
  50int mmc_register_host_class(void)
  51{
  52        return class_register(&mmc_host_class);
  53}
  54
  55void mmc_unregister_host_class(void)
  56{
  57        class_unregister(&mmc_host_class);
  58}
  59
  60void mmc_retune_enable(struct mmc_host *host)
  61{
  62        host->can_retune = 1;
  63        if (host->retune_period)
  64                mod_timer(&host->retune_timer,
  65                          jiffies + host->retune_period * HZ);
  66}
  67
  68/*
  69 * Pause re-tuning for a small set of operations.  The pause begins after the
  70 * next command and after first doing re-tuning.
  71 */
  72void mmc_retune_pause(struct mmc_host *host)
  73{
  74        if (!host->retune_paused) {
  75                host->retune_paused = 1;
  76                mmc_retune_needed(host);
  77                mmc_retune_hold(host);
  78        }
  79}
  80EXPORT_SYMBOL(mmc_retune_pause);
  81
  82void mmc_retune_unpause(struct mmc_host *host)
  83{
  84        if (host->retune_paused) {
  85                host->retune_paused = 0;
  86                mmc_retune_release(host);
  87        }
  88}
  89EXPORT_SYMBOL(mmc_retune_unpause);
  90
  91void mmc_retune_disable(struct mmc_host *host)
  92{
  93        mmc_retune_unpause(host);
  94        host->can_retune = 0;
  95        del_timer_sync(&host->retune_timer);
  96        host->retune_now = 0;
  97        host->need_retune = 0;
  98}
  99
 100void mmc_retune_timer_stop(struct mmc_host *host)
 101{
 102        del_timer_sync(&host->retune_timer);
 103}
 104EXPORT_SYMBOL(mmc_retune_timer_stop);
 105
 106void mmc_retune_hold(struct mmc_host *host)
 107{
 108        if (!host->hold_retune)
 109                host->retune_now = 1;
 110        host->hold_retune += 1;
 111}
 112
 113void mmc_retune_release(struct mmc_host *host)
 114{
 115        if (host->hold_retune)
 116                host->hold_retune -= 1;
 117        else
 118                WARN_ON(1);
 119}
 120EXPORT_SYMBOL(mmc_retune_release);
 121
 122int mmc_retune(struct mmc_host *host)
 123{
 124        bool return_to_hs400 = false;
 125        int err;
 126
 127        if (host->retune_now)
 128                host->retune_now = 0;
 129        else
 130                return 0;
 131
 132        if (!host->need_retune || host->doing_retune || !host->card)
 133                return 0;
 134
 135        host->need_retune = 0;
 136
 137        host->doing_retune = 1;
 138
 139        if (host->ios.timing == MMC_TIMING_MMC_HS400) {
 140                err = mmc_hs400_to_hs200(host->card);
 141                if (err)
 142                        goto out;
 143
 144                return_to_hs400 = true;
 145
 146                if (host->ops->prepare_hs400_tuning)
 147                        host->ops->prepare_hs400_tuning(host, &host->ios);
 148        }
 149
 150        err = mmc_execute_tuning(host->card);
 151        if (err)
 152                goto out;
 153
 154        if (return_to_hs400)
 155                err = mmc_hs200_to_hs400(host->card);
 156out:
 157        host->doing_retune = 0;
 158
 159        return err;
 160}
 161
 162static void mmc_retune_timer(unsigned long data)
 163{
 164        struct mmc_host *host = (struct mmc_host *)data;
 165
 166        mmc_retune_needed(host);
 167}
 168
 169/**
 170 *      mmc_of_parse() - parse host's device-tree node
 171 *      @host: host whose node should be parsed.
 172 *
 173 * To keep the rest of the MMC subsystem unaware of whether DT has been
 174 * used to to instantiate and configure this host instance or not, we
 175 * parse the properties and set respective generic mmc-host flags and
 176 * parameters.
 177 */
 178int mmc_of_parse(struct mmc_host *host)
 179{
 180        struct device_node *np;
 181        u32 bus_width;
 182        int ret;
 183        bool cd_cap_invert, cd_gpio_invert = false;
 184        bool ro_cap_invert, ro_gpio_invert = false;
 185
 186        if (!host->parent || !host->parent->of_node)
 187                return 0;
 188
 189        np = host->parent->of_node;
 190
 191        /* "bus-width" is translated to MMC_CAP_*_BIT_DATA flags */
 192        if (of_property_read_u32(np, "bus-width", &bus_width) < 0) {
 193                dev_dbg(host->parent,
 194                        "\"bus-width\" property is missing, assuming 1 bit.\n");
 195                bus_width = 1;
 196        }
 197
 198        switch (bus_width) {
 199        case 8:
 200                host->caps |= MMC_CAP_8_BIT_DATA;
 201                /* Hosts capable of 8-bit transfers can also do 4 bits */
 202        case 4:
 203                host->caps |= MMC_CAP_4_BIT_DATA;
 204                break;
 205        case 1:
 206                break;
 207        default:
 208                dev_err(host->parent,
 209                        "Invalid \"bus-width\" value %u!\n", bus_width);
 210                return -EINVAL;
 211        }
 212
 213        /* f_max is obtained from the optional "max-frequency" property */
 214        of_property_read_u32(np, "max-frequency", &host->f_max);
 215
 216        /*
 217         * Configure CD and WP pins. They are both by default active low to
 218         * match the SDHCI spec. If GPIOs are provided for CD and / or WP, the
 219         * mmc-gpio helpers are used to attach, configure and use them. If
 220         * polarity inversion is specified in DT, one of MMC_CAP2_CD_ACTIVE_HIGH
 221         * and MMC_CAP2_RO_ACTIVE_HIGH capability-2 flags is set. If the
 222         * "broken-cd" property is provided, the MMC_CAP_NEEDS_POLL capability
 223         * is set. If the "non-removable" property is found, the
 224         * MMC_CAP_NONREMOVABLE capability is set and no card-detection
 225         * configuration is performed.
 226         */
 227
 228        /* Parse Card Detection */
 229        if (of_property_read_bool(np, "non-removable")) {
 230                host->caps |= MMC_CAP_NONREMOVABLE;
 231        } else {
 232                cd_cap_invert = of_property_read_bool(np, "cd-inverted");
 233
 234                if (of_property_read_bool(np, "broken-cd"))
 235                        host->caps |= MMC_CAP_NEEDS_POLL;
 236
 237                ret = mmc_gpiod_request_cd(host, "cd", 0, true,
 238                                           0, &cd_gpio_invert);
 239                if (!ret)
 240                        dev_info(host->parent, "Got CD GPIO\n");
 241                else if (ret != -ENOENT && ret != -ENOSYS)
 242                        return ret;
 243
 244                /*
 245                 * There are two ways to flag that the CD line is inverted:
 246                 * through the cd-inverted flag and by the GPIO line itself
 247                 * being inverted from the GPIO subsystem. This is a leftover
 248                 * from the times when the GPIO subsystem did not make it
 249                 * possible to flag a line as inverted.
 250                 *
 251                 * If the capability on the host AND the GPIO line are
 252                 * both inverted, the end result is that the CD line is
 253                 * not inverted.
 254                 */
 255                if (cd_cap_invert ^ cd_gpio_invert)
 256                        host->caps2 |= MMC_CAP2_CD_ACTIVE_HIGH;
 257        }
 258
 259        /* Parse Write Protection */
 260        ro_cap_invert = of_property_read_bool(np, "wp-inverted");
 261
 262        ret = mmc_gpiod_request_ro(host, "wp", 0, false, 0, &ro_gpio_invert);
 263        if (!ret)
 264                dev_info(host->parent, "Got WP GPIO\n");
 265        else if (ret != -ENOENT && ret != -ENOSYS)
 266                return ret;
 267
 268        if (of_property_read_bool(np, "disable-wp"))
 269                host->caps2 |= MMC_CAP2_NO_WRITE_PROTECT;
 270
 271        /* See the comment on CD inversion above */
 272        if (ro_cap_invert ^ ro_gpio_invert)
 273                host->caps2 |= MMC_CAP2_RO_ACTIVE_HIGH;
 274
 275        if (of_property_read_bool(np, "cap-sd-highspeed"))
 276                host->caps |= MMC_CAP_SD_HIGHSPEED;
 277        if (of_property_read_bool(np, "cap-mmc-highspeed"))
 278                host->caps |= MMC_CAP_MMC_HIGHSPEED;
 279        if (of_property_read_bool(np, "sd-uhs-sdr12"))
 280                host->caps |= MMC_CAP_UHS_SDR12;
 281        if (of_property_read_bool(np, "sd-uhs-sdr25"))
 282                host->caps |= MMC_CAP_UHS_SDR25;
 283        if (of_property_read_bool(np, "sd-uhs-sdr50"))
 284                host->caps |= MMC_CAP_UHS_SDR50;
 285        if (of_property_read_bool(np, "sd-uhs-sdr104"))
 286                host->caps |= MMC_CAP_UHS_SDR104;
 287        if (of_property_read_bool(np, "sd-uhs-ddr50"))
 288                host->caps |= MMC_CAP_UHS_DDR50;
 289        if (of_property_read_bool(np, "cap-power-off-card"))
 290                host->caps |= MMC_CAP_POWER_OFF_CARD;
 291        if (of_property_read_bool(np, "cap-mmc-hw-reset"))
 292                host->caps |= MMC_CAP_HW_RESET;
 293        if (of_property_read_bool(np, "cap-sdio-irq"))
 294                host->caps |= MMC_CAP_SDIO_IRQ;
 295        if (of_property_read_bool(np, "full-pwr-cycle"))
 296                host->caps2 |= MMC_CAP2_FULL_PWR_CYCLE;
 297        if (of_property_read_bool(np, "keep-power-in-suspend"))
 298                host->pm_caps |= MMC_PM_KEEP_POWER;
 299        if (of_property_read_bool(np, "wakeup-source") ||
 300            of_property_read_bool(np, "enable-sdio-wakeup")) /* legacy */
 301                host->pm_caps |= MMC_PM_WAKE_SDIO_IRQ;
 302        if (of_property_read_bool(np, "mmc-ddr-3_3v"))
 303                host->caps |= MMC_CAP_3_3V_DDR;
 304        if (of_property_read_bool(np, "mmc-ddr-1_8v"))
 305                host->caps |= MMC_CAP_1_8V_DDR;
 306        if (of_property_read_bool(np, "mmc-ddr-1_2v"))
 307                host->caps |= MMC_CAP_1_2V_DDR;
 308        if (of_property_read_bool(np, "mmc-hs200-1_8v"))
 309                host->caps2 |= MMC_CAP2_HS200_1_8V_SDR;
 310        if (of_property_read_bool(np, "mmc-hs200-1_2v"))
 311                host->caps2 |= MMC_CAP2_HS200_1_2V_SDR;
 312        if (of_property_read_bool(np, "mmc-hs400-1_8v"))
 313                host->caps2 |= MMC_CAP2_HS400_1_8V | MMC_CAP2_HS200_1_8V_SDR;
 314        if (of_property_read_bool(np, "mmc-hs400-1_2v"))
 315                host->caps2 |= MMC_CAP2_HS400_1_2V | MMC_CAP2_HS200_1_2V_SDR;
 316        if (of_property_read_bool(np, "mmc-hs400-enhanced-strobe"))
 317                host->caps2 |= MMC_CAP2_HS400_ES;
 318        if (of_property_read_bool(np, "no-sdio"))
 319                host->caps2 |= MMC_CAP2_NO_SDIO;
 320        if (of_property_read_bool(np, "no-sd"))
 321                host->caps2 |= MMC_CAP2_NO_SD;
 322        if (of_property_read_bool(np, "no-mmc"))
 323                host->caps2 |= MMC_CAP2_NO_MMC;
 324
 325        host->dsr_req = !of_property_read_u32(np, "dsr", &host->dsr);
 326        if (host->dsr_req && (host->dsr & ~0xffff)) {
 327                dev_err(host->parent,
 328                        "device tree specified broken value for DSR: 0x%x, ignoring\n",
 329                        host->dsr);
 330                host->dsr_req = 0;
 331        }
 332
 333        return 0;
 334}
 335
 336EXPORT_SYMBOL(mmc_of_parse);
 337
 338/**
 339 *      mmc_alloc_host - initialise the per-host structure.
 340 *      @extra: sizeof private data structure
 341 *      @dev: pointer to host device model structure
 342 *
 343 *      Initialise the per-host structure.
 344 */
 345struct mmc_host *mmc_alloc_host(int extra, struct device *dev)
 346{
 347        int err;
 348        struct mmc_host *host;
 349
 350        host = kzalloc(sizeof(struct mmc_host) + extra, GFP_KERNEL);
 351        if (!host)
 352                return NULL;
 353
 354        /* scanning will be enabled when we're ready */
 355        host->rescan_disable = 1;
 356
 357        err = ida_simple_get(&mmc_host_ida, 0, 0, GFP_KERNEL);
 358        if (err < 0) {
 359                kfree(host);
 360                return NULL;
 361        }
 362
 363        host->index = err;
 364
 365        dev_set_name(&host->class_dev, "mmc%d", host->index);
 366
 367        host->parent = dev;
 368        host->class_dev.parent = dev;
 369        host->class_dev.class = &mmc_host_class;
 370        device_initialize(&host->class_dev);
 371        device_enable_async_suspend(&host->class_dev);
 372
 373        if (mmc_gpio_alloc(host)) {
 374                put_device(&host->class_dev);
 375                ida_simple_remove(&mmc_host_ida, host->index);
 376                kfree(host);
 377                return NULL;
 378        }
 379
 380        spin_lock_init(&host->lock);
 381        init_waitqueue_head(&host->wq);
 382        INIT_DELAYED_WORK(&host->detect, mmc_rescan);
 383        INIT_DELAYED_WORK(&host->sdio_irq_work, sdio_irq_work);
 384        setup_timer(&host->retune_timer, mmc_retune_timer, (unsigned long)host);
 385
 386        /*
 387         * By default, hosts do not support SGIO or large requests.
 388         * They have to set these according to their abilities.
 389         */
 390        host->max_segs = 1;
 391        host->max_seg_size = PAGE_CACHE_SIZE;
 392
 393        host->max_req_size = PAGE_CACHE_SIZE;
 394        host->max_blk_size = 512;
 395        host->max_blk_count = PAGE_CACHE_SIZE / 512;
 396
 397        return host;
 398}
 399
 400EXPORT_SYMBOL(mmc_alloc_host);
 401
 402/**
 403 *      mmc_add_host - initialise host hardware
 404 *      @host: mmc host
 405 *
 406 *      Register the host with the driver model. The host must be
 407 *      prepared to start servicing requests before this function
 408 *      completes.
 409 */
 410int mmc_add_host(struct mmc_host *host)
 411{
 412        int err;
 413
 414        WARN_ON((host->caps & MMC_CAP_SDIO_IRQ) &&
 415                !host->ops->enable_sdio_irq);
 416
 417        err = device_add(&host->class_dev);
 418        if (err)
 419                return err;
 420
 421        led_trigger_register_simple(dev_name(&host->class_dev), &host->led);
 422
 423#ifdef CONFIG_DEBUG_FS
 424        mmc_add_host_debugfs(host);
 425#endif
 426
 427        mmc_start_host(host);
 428        mmc_register_pm_notifier(host);
 429
 430        return 0;
 431}
 432
 433EXPORT_SYMBOL(mmc_add_host);
 434
 435/**
 436 *      mmc_remove_host - remove host hardware
 437 *      @host: mmc host
 438 *
 439 *      Unregister and remove all cards associated with this host,
 440 *      and power down the MMC bus. No new requests will be issued
 441 *      after this function has returned.
 442 */
 443void mmc_remove_host(struct mmc_host *host)
 444{
 445        mmc_unregister_pm_notifier(host);
 446        mmc_stop_host(host);
 447
 448#ifdef CONFIG_DEBUG_FS
 449        mmc_remove_host_debugfs(host);
 450#endif
 451
 452        device_del(&host->class_dev);
 453
 454        led_trigger_unregister_simple(host->led);
 455}
 456
 457EXPORT_SYMBOL(mmc_remove_host);
 458
 459/**
 460 *      mmc_free_host - free the host structure
 461 *      @host: mmc host
 462 *
 463 *      Free the host once all references to it have been dropped.
 464 */
 465void mmc_free_host(struct mmc_host *host)
 466{
 467        put_device(&host->class_dev);
 468}
 469
 470EXPORT_SYMBOL(mmc_free_host);
 471