Skip to content

Commit

Permalink
Merge tag 'mmc-4.1-rc1' of git://git.linaro.org/people/ulf.hansson/mmc
Browse files Browse the repository at this point in the history
Pull MMC fixes from Ulf Hansson:
 "Here is two mmc core fixes for v.4.1 rc1:

   - fix error code propagation in mmc_pwrseq_simple_alloc()

   - revert 'mmc: core: Convert mmc_driver to device_driver'"

* tag 'mmc-4.1-rc1' of git://git.linaro.org/people/ulf.hansson/mmc:
  Revert "mmc: core: Convert mmc_driver to device_driver"
  mmc: pwrseq: Fix error code propagation in mmc_pwrseq_simple_alloc()
  • Loading branch information
Linus Torvalds committed Apr 22, 2015
2 parents 3cfe213 + 96541ba commit 5e6c94a
Show file tree
Hide file tree
Showing 5 changed files with 70 additions and 39 deletions.
34 changes: 17 additions & 17 deletions drivers/mmc/card/block.c
Original file line number Diff line number Diff line change
Expand Up @@ -2418,9 +2418,8 @@ static const struct mmc_fixup blk_fixups[] =
END_FIXUP
};

static int mmc_blk_probe(struct device *dev)
static int mmc_blk_probe(struct mmc_card *card)
{
struct mmc_card *card = mmc_dev_to_card(dev);
struct mmc_blk_data *md, *part_md;
char cap_str[10];

Expand All @@ -2445,7 +2444,7 @@ static int mmc_blk_probe(struct device *dev)
if (mmc_blk_alloc_parts(card, md))
goto out;

dev_set_drvdata(dev, md);
dev_set_drvdata(&card->dev, md);

if (mmc_add_disk(md))
goto out;
Expand Down Expand Up @@ -2475,10 +2474,9 @@ static int mmc_blk_probe(struct device *dev)
return 0;
}

static int mmc_blk_remove(struct device *dev)
static void mmc_blk_remove(struct mmc_card *card)
{
struct mmc_card *card = mmc_dev_to_card(dev);
struct mmc_blk_data *md = dev_get_drvdata(dev);
struct mmc_blk_data *md = dev_get_drvdata(&card->dev);

mmc_blk_remove_parts(card, md);
pm_runtime_get_sync(&card->dev);
Expand All @@ -2489,15 +2487,13 @@ static int mmc_blk_remove(struct device *dev)
pm_runtime_disable(&card->dev);
pm_runtime_put_noidle(&card->dev);
mmc_blk_remove_req(md);
dev_set_drvdata(dev, NULL);

return 0;
dev_set_drvdata(&card->dev, NULL);
}

static int _mmc_blk_suspend(struct device *dev)
static int _mmc_blk_suspend(struct mmc_card *card)
{
struct mmc_blk_data *part_md;
struct mmc_blk_data *md = dev_get_drvdata(dev);
struct mmc_blk_data *md = dev_get_drvdata(&card->dev);

if (md) {
mmc_queue_suspend(&md->queue);
Expand All @@ -2508,15 +2504,17 @@ static int _mmc_blk_suspend(struct device *dev)
return 0;
}

static void mmc_blk_shutdown(struct device *dev)
static void mmc_blk_shutdown(struct mmc_card *card)
{
_mmc_blk_suspend(dev);
_mmc_blk_suspend(card);
}

#ifdef CONFIG_PM_SLEEP
static int mmc_blk_suspend(struct device *dev)
{
return _mmc_blk_suspend(dev);
struct mmc_card *card = mmc_dev_to_card(dev);

return _mmc_blk_suspend(card);
}

static int mmc_blk_resume(struct device *dev)
Expand All @@ -2541,9 +2539,11 @@ static int mmc_blk_resume(struct device *dev)

static SIMPLE_DEV_PM_OPS(mmc_blk_pm_ops, mmc_blk_suspend, mmc_blk_resume);

static struct device_driver mmc_driver = {
.name = "mmcblk",
.pm = &mmc_blk_pm_ops,
static struct mmc_driver mmc_driver = {
.drv = {
.name = "mmcblk",
.pm = &mmc_blk_pm_ops,
},
.probe = mmc_blk_probe,
.remove = mmc_blk_remove,
.shutdown = mmc_blk_shutdown,
Expand Down
18 changes: 7 additions & 11 deletions drivers/mmc/card/mmc_test.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
#include <linux/mmc/host.h>
#include <linux/mmc/mmc.h>
#include <linux/slab.h>
#include <linux/device.h>

#include <linux/scatterlist.h>
#include <linux/swap.h> /* For nr_free_buffer_pages() */
Expand Down Expand Up @@ -2996,9 +2995,8 @@ static int mmc_test_register_dbgfs_file(struct mmc_card *card)
return ret;
}

static int mmc_test_probe(struct device *dev)
static int mmc_test_probe(struct mmc_card *card)
{
struct mmc_card *card = mmc_dev_to_card(dev);
int ret;

if (!mmc_card_mmc(card) && !mmc_card_sd(card))
Expand All @@ -3013,22 +3011,20 @@ static int mmc_test_probe(struct device *dev)
return 0;
}

static int mmc_test_remove(struct device *dev)
static void mmc_test_remove(struct mmc_card *card)
{
struct mmc_card *card = mmc_dev_to_card(dev);

mmc_test_free_result(card);
mmc_test_free_dbgfs_file(card);

return 0;
}

static void mmc_test_shutdown(struct device *dev)
static void mmc_test_shutdown(struct mmc_card *card)
{
}

static struct device_driver mmc_driver = {
.name = "mmc_test",
static struct mmc_driver mmc_driver = {
.drv = {
.name = "mmc_test",
},
.probe = mmc_test_probe,
.remove = mmc_test_remove,
.shutdown = mmc_test_shutdown,
Expand Down
41 changes: 33 additions & 8 deletions drivers/mmc/core/bus.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@
#include "sdio_cis.h"
#include "bus.h"

#define to_mmc_driver(d) container_of(d, struct mmc_driver, drv)

static ssize_t type_show(struct device *dev,
struct device_attribute *attr, char *buf)
{
Expand Down Expand Up @@ -105,14 +107,33 @@ mmc_bus_uevent(struct device *dev, struct kobj_uevent_env *env)
return retval;
}

static int mmc_bus_probe(struct device *dev)
{
struct mmc_driver *drv = to_mmc_driver(dev->driver);
struct mmc_card *card = mmc_dev_to_card(dev);

return drv->probe(card);
}

static int mmc_bus_remove(struct device *dev)
{
struct mmc_driver *drv = to_mmc_driver(dev->driver);
struct mmc_card *card = mmc_dev_to_card(dev);

drv->remove(card);

return 0;
}

static void mmc_bus_shutdown(struct device *dev)
{
struct mmc_driver *drv = to_mmc_driver(dev->driver);
struct mmc_card *card = mmc_dev_to_card(dev);
struct mmc_host *host = card->host;
int ret;

if (dev->driver && dev->driver->shutdown)
dev->driver->shutdown(dev);
if (dev->driver && drv->shutdown)
drv->shutdown(card);

if (host->bus_ops->shutdown) {
ret = host->bus_ops->shutdown(host);
Expand Down Expand Up @@ -181,6 +202,8 @@ static struct bus_type mmc_bus_type = {
.dev_groups = mmc_dev_groups,
.match = mmc_bus_match,
.uevent = mmc_bus_uevent,
.probe = mmc_bus_probe,
.remove = mmc_bus_remove,
.shutdown = mmc_bus_shutdown,
.pm = &mmc_bus_pm_ops,
};
Expand All @@ -199,22 +222,24 @@ void mmc_unregister_bus(void)
* mmc_register_driver - register a media driver
* @drv: MMC media driver
*/
int mmc_register_driver(struct device_driver *drv)
int mmc_register_driver(struct mmc_driver *drv)
{
drv->bus = &mmc_bus_type;
return driver_register(drv);
drv->drv.bus = &mmc_bus_type;
return driver_register(&drv->drv);
}

EXPORT_SYMBOL(mmc_register_driver);

/**
* mmc_unregister_driver - unregister a media driver
* @drv: MMC media driver
*/
void mmc_unregister_driver(struct device_driver *drv)
void mmc_unregister_driver(struct mmc_driver *drv)
{
drv->bus = &mmc_bus_type;
driver_unregister(drv);
drv->drv.bus = &mmc_bus_type;
driver_unregister(&drv->drv);
}

EXPORT_SYMBOL(mmc_unregister_driver);

static void mmc_release_card(struct device *dev)
Expand Down
2 changes: 1 addition & 1 deletion drivers/mmc/core/pwrseq.c
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ int mmc_pwrseq_alloc(struct mmc_host *host)

pwrseq = match->alloc(host, &pdev->dev);
if (IS_ERR(pwrseq)) {
ret = PTR_ERR(host->pwrseq);
ret = PTR_ERR(pwrseq);
goto err;
}

Expand Down
14 changes: 12 additions & 2 deletions include/linux/mmc/card.h
Original file line number Diff line number Diff line change
Expand Up @@ -512,8 +512,18 @@ static inline int mmc_card_broken_irq_polling(const struct mmc_card *c)

#define mmc_dev_to_card(d) container_of(d, struct mmc_card, dev)

extern int mmc_register_driver(struct device_driver *);
extern void mmc_unregister_driver(struct device_driver *);
/*
* MMC device driver (e.g., Flash card, I/O card...)
*/
struct mmc_driver {
struct device_driver drv;
int (*probe)(struct mmc_card *);
void (*remove)(struct mmc_card *);
void (*shutdown)(struct mmc_card *);
};

extern int mmc_register_driver(struct mmc_driver *);
extern void mmc_unregister_driver(struct mmc_driver *);

extern void mmc_fixup_device(struct mmc_card *card,
const struct mmc_fixup *table);
Expand Down

0 comments on commit 5e6c94a

Please sign in to comment.