linux/drivers/mmc/core/sdio_bus.c
<<
>>
Prefs
   1/*
   2 *  linux/drivers/mmc/core/sdio_bus.c
   3 *
   4 *  Copyright 2007 Pierre Ossman
   5 *
   6 * This program is free software; you can redistribute it and/or modify
   7 * it under the terms of the GNU General Public License as published by
   8 * the Free Software Foundation; either version 2 of the License, or (at
   9 * your option) any later version.
  10 *
  11 * SDIO function driver model
  12 */
  13
  14#include <linux/device.h>
  15#include <linux/err.h>
  16#include <linux/export.h>
  17#include <linux/slab.h>
  18#include <linux/pm_runtime.h>
  19#include <linux/pm_domain.h>
  20#include <linux/acpi.h>
  21
  22#include <linux/mmc/card.h>
  23#include <linux/mmc/host.h>
  24#include <linux/mmc/sdio_func.h>
  25#include <linux/of.h>
  26
  27#include "core.h"
  28#include "card.h"
  29#include "sdio_cis.h"
  30#include "sdio_bus.h"
  31
  32#define to_sdio_driver(d)       container_of(d, struct sdio_driver, drv)
  33
  34/* show configuration fields */
  35#define sdio_config_attr(field, format_string)                          \
  36static ssize_t                                                          \
  37field##_show(struct device *dev, struct device_attribute *attr, char *buf)                              \
  38{                                                                       \
  39        struct sdio_func *func;                                         \
  40                                                                        \
  41        func = dev_to_sdio_func (dev);                                  \
  42        return sprintf (buf, format_string, func->field);               \
  43}                                                                       \
  44static DEVICE_ATTR_RO(field)
  45
  46sdio_config_attr(class, "0x%02x\n");
  47sdio_config_attr(vendor, "0x%04x\n");
  48sdio_config_attr(device, "0x%04x\n");
  49
  50static ssize_t modalias_show(struct device *dev, struct device_attribute *attr, char *buf)
  51{
  52        struct sdio_func *func = dev_to_sdio_func (dev);
  53
  54        return sprintf(buf, "sdio:c%02Xv%04Xd%04X\n",
  55                        func->class, func->vendor, func->device);
  56}
  57static DEVICE_ATTR_RO(modalias);
  58
  59static struct attribute *sdio_dev_attrs[] = {
  60        &dev_attr_class.attr,
  61        &dev_attr_vendor.attr,
  62        &dev_attr_device.attr,
  63        &dev_attr_modalias.attr,
  64        NULL,
  65};
  66ATTRIBUTE_GROUPS(sdio_dev);
  67
  68static const struct sdio_device_id *sdio_match_one(struct sdio_func *func,
  69        const struct sdio_device_id *id)
  70{
  71        if (id->class != (__u8)SDIO_ANY_ID && id->class != func->class)
  72                return NULL;
  73        if (id->vendor != (__u16)SDIO_ANY_ID && id->vendor != func->vendor)
  74                return NULL;
  75        if (id->device != (__u16)SDIO_ANY_ID && id->device != func->device)
  76                return NULL;
  77        return id;
  78}
  79
  80static const struct sdio_device_id *sdio_match_device(struct sdio_func *func,
  81        struct sdio_driver *sdrv)
  82{
  83        const struct sdio_device_id *ids;
  84
  85        ids = sdrv->id_table;
  86
  87        if (ids) {
  88                while (ids->class || ids->vendor || ids->device) {
  89                        if (sdio_match_one(func, ids))
  90                                return ids;
  91                        ids++;
  92                }
  93        }
  94
  95        return NULL;
  96}
  97
  98static int sdio_bus_match(struct device *dev, struct device_driver *drv)
  99{
 100        struct sdio_func *func = dev_to_sdio_func(dev);
 101        struct sdio_driver *sdrv = to_sdio_driver(drv);
 102
 103        if (sdio_match_device(func, sdrv))
 104                return 1;
 105
 106        return 0;
 107}
 108
 109static int
 110sdio_bus_uevent(struct device *dev, struct kobj_uevent_env *env)
 111{
 112        struct sdio_func *func = dev_to_sdio_func(dev);
 113
 114        if (add_uevent_var(env,
 115                        "SDIO_CLASS=%02X", func->class))
 116                return -ENOMEM;
 117
 118        if (add_uevent_var(env, 
 119                        "SDIO_ID=%04X:%04X", func->vendor, func->device))
 120                return -ENOMEM;
 121
 122        if (add_uevent_var(env,
 123                        "MODALIAS=sdio:c%02Xv%04Xd%04X",
 124                        func->class, func->vendor, func->device))
 125                return -ENOMEM;
 126
 127        return 0;
 128}
 129
 130static int sdio_bus_probe(struct device *dev)
 131{
 132        struct sdio_driver *drv = to_sdio_driver(dev->driver);
 133        struct sdio_func *func = dev_to_sdio_func(dev);
 134        const struct sdio_device_id *id;
 135        int ret;
 136
 137        id = sdio_match_device(func, drv);
 138        if (!id)
 139                return -ENODEV;
 140
 141        ret = dev_pm_domain_attach(dev, false);
 142        if (ret == -EPROBE_DEFER)
 143                return ret;
 144
 145        /* Unbound SDIO functions are always suspended.
 146         * During probe, the function is set active and the usage count
 147         * is incremented.  If the driver supports runtime PM,
 148         * it should call pm_runtime_put_noidle() in its probe routine and
 149         * pm_runtime_get_noresume() in its remove routine.
 150         */
 151        if (func->card->host->caps & MMC_CAP_POWER_OFF_CARD) {
 152                ret = pm_runtime_get_sync(dev);
 153                if (ret < 0)
 154                        goto disable_runtimepm;
 155        }
 156
 157        /* Set the default block size so the driver is sure it's something
 158         * sensible. */
 159        sdio_claim_host(func);
 160        ret = sdio_set_block_size(func, 0);
 161        sdio_release_host(func);
 162        if (ret)
 163                goto disable_runtimepm;
 164
 165        ret = drv->probe(func, id);
 166        if (ret)
 167                goto disable_runtimepm;
 168
 169        return 0;
 170
 171disable_runtimepm:
 172        if (func->card->host->caps & MMC_CAP_POWER_OFF_CARD)
 173                pm_runtime_put_noidle(dev);
 174        dev_pm_domain_detach(dev, false);
 175        return ret;
 176}
 177
 178static int sdio_bus_remove(struct device *dev)
 179{
 180        struct sdio_driver *drv = to_sdio_driver(dev->driver);
 181        struct sdio_func *func = dev_to_sdio_func(dev);
 182        int ret = 0;
 183
 184        /* Make sure card is powered before invoking ->remove() */
 185        if (func->card->host->caps & MMC_CAP_POWER_OFF_CARD)
 186                pm_runtime_get_sync(dev);
 187
 188        drv->remove(func);
 189
 190        if (func->irq_handler) {
 191                pr_warn("WARNING: driver %s did not remove its interrupt handler!\n",
 192                        drv->name);
 193                sdio_claim_host(func);
 194                sdio_release_irq(func);
 195                sdio_release_host(func);
 196        }
 197
 198        /* First, undo the increment made directly above */
 199        if (func->card->host->caps & MMC_CAP_POWER_OFF_CARD)
 200                pm_runtime_put_noidle(dev);
 201
 202        /* Then undo the runtime PM settings in sdio_bus_probe() */
 203        if (func->card->host->caps & MMC_CAP_POWER_OFF_CARD)
 204                pm_runtime_put_sync(dev);
 205
 206        dev_pm_domain_detach(dev, false);
 207
 208        return ret;
 209}
 210
 211static const struct dev_pm_ops sdio_bus_pm_ops = {
 212        SET_SYSTEM_SLEEP_PM_OPS(pm_generic_suspend, pm_generic_resume)
 213        SET_RUNTIME_PM_OPS(
 214                pm_generic_runtime_suspend,
 215                pm_generic_runtime_resume,
 216                NULL
 217        )
 218};
 219
 220static struct bus_type sdio_bus_type = {
 221        .name           = "sdio",
 222        .dev_groups     = sdio_dev_groups,
 223        .match          = sdio_bus_match,
 224        .uevent         = sdio_bus_uevent,
 225        .probe          = sdio_bus_probe,
 226        .remove         = sdio_bus_remove,
 227        .pm             = &sdio_bus_pm_ops,
 228};
 229
 230int sdio_register_bus(void)
 231{
 232        return bus_register(&sdio_bus_type);
 233}
 234
 235void sdio_unregister_bus(void)
 236{
 237        bus_unregister(&sdio_bus_type);
 238}
 239
 240/**
 241 *      sdio_register_driver - register a function driver
 242 *      @drv: SDIO function driver
 243 */
 244int sdio_register_driver(struct sdio_driver *drv)
 245{
 246        drv->drv.name = drv->name;
 247        drv->drv.bus = &sdio_bus_type;
 248        return driver_register(&drv->drv);
 249}
 250EXPORT_SYMBOL_GPL(sdio_register_driver);
 251
 252/**
 253 *      sdio_unregister_driver - unregister a function driver
 254 *      @drv: SDIO function driver
 255 */
 256void sdio_unregister_driver(struct sdio_driver *drv)
 257{
 258        drv->drv.bus = &sdio_bus_type;
 259        driver_unregister(&drv->drv);
 260}
 261EXPORT_SYMBOL_GPL(sdio_unregister_driver);
 262
 263static void sdio_release_func(struct device *dev)
 264{
 265        struct sdio_func *func = dev_to_sdio_func(dev);
 266
 267        sdio_free_func_cis(func);
 268
 269        kfree(func->info);
 270        kfree(func->tmpbuf);
 271        kfree(func);
 272}
 273
 274/*
 275 * Allocate and initialise a new SDIO function structure.
 276 */
 277struct sdio_func *sdio_alloc_func(struct mmc_card *card)
 278{
 279        struct sdio_func *func;
 280
 281        func = kzalloc(sizeof(struct sdio_func), GFP_KERNEL);
 282        if (!func)
 283                return ERR_PTR(-ENOMEM);
 284
 285        /*
 286         * allocate buffer separately to make sure it's properly aligned for
 287         * DMA usage (incl. 64 bit DMA)
 288         */
 289        func->tmpbuf = kmalloc(4, GFP_KERNEL);
 290        if (!func->tmpbuf) {
 291                kfree(func);
 292                return ERR_PTR(-ENOMEM);
 293        }
 294
 295        func->card = card;
 296
 297        device_initialize(&func->dev);
 298
 299        func->dev.parent = &card->dev;
 300        func->dev.bus = &sdio_bus_type;
 301        func->dev.release = sdio_release_func;
 302
 303        return func;
 304}
 305
 306#ifdef CONFIG_ACPI
 307static void sdio_acpi_set_handle(struct sdio_func *func)
 308{
 309        struct mmc_host *host = func->card->host;
 310        u64 addr = ((u64)host->slotno << 16) | func->num;
 311
 312        acpi_preset_companion(&func->dev, ACPI_COMPANION(host->parent), addr);
 313}
 314#else
 315static inline void sdio_acpi_set_handle(struct sdio_func *func) {}
 316#endif
 317
 318static void sdio_set_of_node(struct sdio_func *func)
 319{
 320        struct mmc_host *host = func->card->host;
 321
 322        func->dev.of_node = mmc_of_find_child_device(host, func->num);
 323}
 324
 325/*
 326 * Register a new SDIO function with the driver model.
 327 */
 328int sdio_add_func(struct sdio_func *func)
 329{
 330        int ret;
 331
 332        dev_set_name(&func->dev, "%s:%d", mmc_card_id(func->card), func->num);
 333
 334        sdio_set_of_node(func);
 335        sdio_acpi_set_handle(func);
 336        device_enable_async_suspend(&func->dev);
 337        ret = device_add(&func->dev);
 338        if (ret == 0)
 339                sdio_func_set_present(func);
 340
 341        return ret;
 342}
 343
 344/*
 345 * Unregister a SDIO function with the driver model, and
 346 * (eventually) free it.
 347 * This function can be called through error paths where sdio_add_func() was
 348 * never executed (because a failure occurred at an earlier point).
 349 */
 350void sdio_remove_func(struct sdio_func *func)
 351{
 352        if (!sdio_func_present(func))
 353                return;
 354
 355        device_del(&func->dev);
 356        of_node_put(func->dev.of_node);
 357        put_device(&func->dev);
 358}
 359
 360