linux/drivers/mmc/core/bus.c
<<
>>
Prefs
   1/*
   2 *  linux/drivers/mmc/core/bus.c
   3 *
   4 *  Copyright (C) 2003 Russell King, All Rights Reserved.
   5 *  Copyright (C) 2007 Pierre Ossman
   6 *
   7 * This program is free software; you can redistribute it and/or modify
   8 * it under the terms of the GNU General Public License version 2 as
   9 * published by the Free Software Foundation.
  10 *
  11 *  MMC card bus driver model
  12 */
  13
  14#include <linux/export.h>
  15#include <linux/device.h>
  16#include <linux/err.h>
  17#include <linux/slab.h>
  18#include <linux/stat.h>
  19#include <linux/pm_runtime.h>
  20
  21#include <linux/mmc/card.h>
  22#include <linux/mmc/host.h>
  23
  24#include "core.h"
  25#include "sdio_cis.h"
  26#include "bus.h"
  27
  28#define to_mmc_driver(d)        container_of(d, struct mmc_driver, drv)
  29
  30static ssize_t mmc_type_show(struct device *dev,
  31        struct device_attribute *attr, char *buf)
  32{
  33        struct mmc_card *card = mmc_dev_to_card(dev);
  34
  35        switch (card->type) {
  36        case MMC_TYPE_MMC:
  37                return sprintf(buf, "MMC\n");
  38        case MMC_TYPE_SD:
  39                return sprintf(buf, "SD\n");
  40        case MMC_TYPE_SDIO:
  41                return sprintf(buf, "SDIO\n");
  42        case MMC_TYPE_SD_COMBO:
  43                return sprintf(buf, "SDcombo\n");
  44        default:
  45                return -EFAULT;
  46        }
  47}
  48
  49static struct device_attribute mmc_dev_attrs[] = {
  50        __ATTR(type, S_IRUGO, mmc_type_show, NULL),
  51        __ATTR_NULL,
  52};
  53
  54/*
  55 * This currently matches any MMC driver to any MMC card - drivers
  56 * themselves make the decision whether to drive this card in their
  57 * probe method.
  58 */
  59static int mmc_bus_match(struct device *dev, struct device_driver *drv)
  60{
  61        return 1;
  62}
  63
  64static int
  65mmc_bus_uevent(struct device *dev, struct kobj_uevent_env *env)
  66{
  67        struct mmc_card *card = mmc_dev_to_card(dev);
  68        const char *type;
  69        int retval = 0;
  70
  71        switch (card->type) {
  72        case MMC_TYPE_MMC:
  73                type = "MMC";
  74                break;
  75        case MMC_TYPE_SD:
  76                type = "SD";
  77                break;
  78        case MMC_TYPE_SDIO:
  79                type = "SDIO";
  80                break;
  81        case MMC_TYPE_SD_COMBO:
  82                type = "SDcombo";
  83                break;
  84        default:
  85                type = NULL;
  86        }
  87
  88        if (type) {
  89                retval = add_uevent_var(env, "MMC_TYPE=%s", type);
  90                if (retval)
  91                        return retval;
  92        }
  93
  94        retval = add_uevent_var(env, "MMC_NAME=%s", mmc_card_name(card));
  95        if (retval)
  96                return retval;
  97
  98        /*
  99         * Request the mmc_block device.  Note: that this is a direct request
 100         * for the module it carries no information as to what is inserted.
 101         */
 102        retval = add_uevent_var(env, "MODALIAS=mmc:block");
 103
 104        return retval;
 105}
 106
 107static int mmc_bus_probe(struct device *dev)
 108{
 109        struct mmc_driver *drv = to_mmc_driver(dev->driver);
 110        struct mmc_card *card = mmc_dev_to_card(dev);
 111
 112        return drv->probe(card);
 113}
 114
 115static int mmc_bus_remove(struct device *dev)
 116{
 117        struct mmc_driver *drv = to_mmc_driver(dev->driver);
 118        struct mmc_card *card = mmc_dev_to_card(dev);
 119
 120        drv->remove(card);
 121
 122        return 0;
 123}
 124
 125#ifdef CONFIG_PM_SLEEP
 126static int mmc_bus_suspend(struct device *dev)
 127{
 128        struct mmc_driver *drv = to_mmc_driver(dev->driver);
 129        struct mmc_card *card = mmc_dev_to_card(dev);
 130        int ret = 0;
 131
 132        if (dev->driver && drv->suspend)
 133                ret = drv->suspend(card);
 134        return ret;
 135}
 136
 137static int mmc_bus_resume(struct device *dev)
 138{
 139        struct mmc_driver *drv = to_mmc_driver(dev->driver);
 140        struct mmc_card *card = mmc_dev_to_card(dev);
 141        int ret = 0;
 142
 143        if (dev->driver && drv->resume)
 144                ret = drv->resume(card);
 145        return ret;
 146}
 147#endif
 148
 149#ifdef CONFIG_PM_RUNTIME
 150
 151static int mmc_runtime_suspend(struct device *dev)
 152{
 153        struct mmc_card *card = mmc_dev_to_card(dev);
 154
 155        return mmc_power_save_host(card->host);
 156}
 157
 158static int mmc_runtime_resume(struct device *dev)
 159{
 160        struct mmc_card *card = mmc_dev_to_card(dev);
 161
 162        return mmc_power_restore_host(card->host);
 163}
 164
 165static int mmc_runtime_idle(struct device *dev)
 166{
 167        return pm_runtime_suspend(dev);
 168}
 169
 170#endif /* !CONFIG_PM_RUNTIME */
 171
 172static const struct dev_pm_ops mmc_bus_pm_ops = {
 173        SET_RUNTIME_PM_OPS(mmc_runtime_suspend, mmc_runtime_resume,
 174                        mmc_runtime_idle)
 175        SET_SYSTEM_SLEEP_PM_OPS(mmc_bus_suspend, mmc_bus_resume)
 176};
 177
 178static struct bus_type mmc_bus_type = {
 179        .name           = "mmc",
 180        .dev_attrs      = mmc_dev_attrs,
 181        .match          = mmc_bus_match,
 182        .uevent         = mmc_bus_uevent,
 183        .probe          = mmc_bus_probe,
 184        .remove         = mmc_bus_remove,
 185        .pm             = &mmc_bus_pm_ops,
 186};
 187
 188int mmc_register_bus(void)
 189{
 190        return bus_register(&mmc_bus_type);
 191}
 192
 193void mmc_unregister_bus(void)
 194{
 195        bus_unregister(&mmc_bus_type);
 196}
 197
 198/**
 199 *      mmc_register_driver - register a media driver
 200 *      @drv: MMC media driver
 201 */
 202int mmc_register_driver(struct mmc_driver *drv)
 203{
 204        drv->drv.bus = &mmc_bus_type;
 205        return driver_register(&drv->drv);
 206}
 207
 208EXPORT_SYMBOL(mmc_register_driver);
 209
 210/**
 211 *      mmc_unregister_driver - unregister a media driver
 212 *      @drv: MMC media driver
 213 */
 214void mmc_unregister_driver(struct mmc_driver *drv)
 215{
 216        drv->drv.bus = &mmc_bus_type;
 217        driver_unregister(&drv->drv);
 218}
 219
 220EXPORT_SYMBOL(mmc_unregister_driver);
 221
 222static void mmc_release_card(struct device *dev)
 223{
 224        struct mmc_card *card = mmc_dev_to_card(dev);
 225
 226        sdio_free_common_cis(card);
 227
 228        kfree(card->info);
 229
 230        kfree(card);
 231}
 232
 233/*
 234 * Allocate and initialise a new MMC card structure.
 235 */
 236struct mmc_card *mmc_alloc_card(struct mmc_host *host, struct device_type *type)
 237{
 238        struct mmc_card *card;
 239
 240        card = kzalloc(sizeof(struct mmc_card), GFP_KERNEL);
 241        if (!card)
 242                return ERR_PTR(-ENOMEM);
 243
 244        card->host = host;
 245
 246        device_initialize(&card->dev);
 247
 248        card->dev.parent = mmc_classdev(host);
 249        card->dev.bus = &mmc_bus_type;
 250        card->dev.release = mmc_release_card;
 251        card->dev.type = type;
 252
 253        return card;
 254}
 255
 256/*
 257 * Register a new MMC card with the driver model.
 258 */
 259int mmc_add_card(struct mmc_card *card)
 260{
 261        int ret;
 262        const char *type;
 263        const char *uhs_bus_speed_mode = "";
 264        static const char *const uhs_speeds[] = {
 265                [UHS_SDR12_BUS_SPEED] = "SDR12 ",
 266                [UHS_SDR25_BUS_SPEED] = "SDR25 ",
 267                [UHS_SDR50_BUS_SPEED] = "SDR50 ",
 268                [UHS_SDR104_BUS_SPEED] = "SDR104 ",
 269                [UHS_DDR50_BUS_SPEED] = "DDR50 ",
 270        };
 271
 272
 273        dev_set_name(&card->dev, "%s:%04x", mmc_hostname(card->host), card->rca);
 274
 275        switch (card->type) {
 276        case MMC_TYPE_MMC:
 277                type = "MMC";
 278                break;
 279        case MMC_TYPE_SD:
 280                type = "SD";
 281                if (mmc_card_blockaddr(card)) {
 282                        if (mmc_card_ext_capacity(card))
 283                                type = "SDXC";
 284                        else
 285                                type = "SDHC";
 286                }
 287                break;
 288        case MMC_TYPE_SDIO:
 289                type = "SDIO";
 290                break;
 291        case MMC_TYPE_SD_COMBO:
 292                type = "SD-combo";
 293                if (mmc_card_blockaddr(card))
 294                        type = "SDHC-combo";
 295                break;
 296        default:
 297                type = "?";
 298                break;
 299        }
 300
 301        if (mmc_sd_card_uhs(card) &&
 302                (card->sd_bus_speed < ARRAY_SIZE(uhs_speeds)))
 303                uhs_bus_speed_mode = uhs_speeds[card->sd_bus_speed];
 304
 305        if (mmc_host_is_spi(card->host)) {
 306                pr_info("%s: new %s%s%s card on SPI\n",
 307                        mmc_hostname(card->host),
 308                        mmc_card_highspeed(card) ? "high speed " : "",
 309                        mmc_card_ddr_mode(card) ? "DDR " : "",
 310                        type);
 311        } else {
 312                pr_info("%s: new %s%s%s%s%s card at address %04x\n",
 313                        mmc_hostname(card->host),
 314                        mmc_card_uhs(card) ? "ultra high speed " :
 315                        (mmc_card_highspeed(card) ? "high speed " : ""),
 316                        (mmc_card_hs200(card) ? "HS200 " : ""),
 317                        mmc_card_ddr_mode(card) ? "DDR " : "",
 318                        uhs_bus_speed_mode, type, card->rca);
 319        }
 320
 321#ifdef CONFIG_DEBUG_FS
 322        mmc_add_card_debugfs(card);
 323#endif
 324        mmc_init_context_info(card->host);
 325
 326        ret = device_add(&card->dev);
 327        if (ret)
 328                return ret;
 329
 330        mmc_card_set_present(card);
 331
 332        return 0;
 333}
 334
 335/*
 336 * Unregister a new MMC card with the driver model, and
 337 * (eventually) free it.
 338 */
 339void mmc_remove_card(struct mmc_card *card)
 340{
 341#ifdef CONFIG_DEBUG_FS
 342        mmc_remove_card_debugfs(card);
 343#endif
 344
 345        if (mmc_card_present(card)) {
 346                if (mmc_host_is_spi(card->host)) {
 347                        pr_info("%s: SPI card removed\n",
 348                                mmc_hostname(card->host));
 349                } else {
 350                        pr_info("%s: card %04x removed\n",
 351                                mmc_hostname(card->host), card->rca);
 352                }
 353                device_del(&card->dev);
 354        }
 355
 356        put_device(&card->dev);
 357}
 358
 359