diff options
author | Russell King <rmk@dyn-67.arm.linux.org.uk> | 2005-08-19 04:41:24 -0400 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2005-08-19 04:41:24 -0400 |
commit | 00b137cfda5276b3d2c87d44236fe4c5ee68b405 (patch) | |
tree | 2ecf68ba041d4cb94be9bf6b5e640a94ee0974a2 /drivers/mmc/mmc.c | |
parent | d366b6436386875b1310ce8f70e3f9dea4647bac (diff) |
[MMC] Add MMC class devices
Create a mmc_host class to allow enumeration of MMC host controllers
even though they have no card(s) inserted.
Patch based on work by Pierre Ossman.
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'drivers/mmc/mmc.c')
-rw-r--r-- | drivers/mmc/mmc.c | 23 |
1 files changed, 10 insertions, 13 deletions
diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c index e02e5df80be9..3c5904834fe8 100644 --- a/drivers/mmc/mmc.c +++ b/drivers/mmc/mmc.c | |||
@@ -796,17 +796,13 @@ struct mmc_host *mmc_alloc_host(int extra, struct device *dev) | |||
796 | { | 796 | { |
797 | struct mmc_host *host; | 797 | struct mmc_host *host; |
798 | 798 | ||
799 | host = kmalloc(sizeof(struct mmc_host) + extra, GFP_KERNEL); | 799 | host = mmc_alloc_host_sysfs(extra, dev); |
800 | if (host) { | 800 | if (host) { |
801 | memset(host, 0, sizeof(struct mmc_host) + extra); | ||
802 | |||
803 | spin_lock_init(&host->lock); | 801 | spin_lock_init(&host->lock); |
804 | init_waitqueue_head(&host->wq); | 802 | init_waitqueue_head(&host->wq); |
805 | INIT_LIST_HEAD(&host->cards); | 803 | INIT_LIST_HEAD(&host->cards); |
806 | INIT_WORK(&host->detect, mmc_rescan, host); | 804 | INIT_WORK(&host->detect, mmc_rescan, host); |
807 | 805 | ||
808 | host->dev = dev; | ||
809 | |||
810 | /* | 806 | /* |
811 | * By default, hosts do not support SGIO or large requests. | 807 | * By default, hosts do not support SGIO or large requests. |
812 | * They have to set these according to their abilities. | 808 | * They have to set these according to their abilities. |
@@ -828,15 +824,15 @@ EXPORT_SYMBOL(mmc_alloc_host); | |||
828 | */ | 824 | */ |
829 | int mmc_add_host(struct mmc_host *host) | 825 | int mmc_add_host(struct mmc_host *host) |
830 | { | 826 | { |
831 | static unsigned int host_num; | 827 | int ret; |
832 | 828 | ||
833 | snprintf(host->host_name, sizeof(host->host_name), | 829 | ret = mmc_add_host_sysfs(host); |
834 | "mmc%d", host_num++); | 830 | if (ret == 0) { |
835 | 831 | mmc_power_off(host); | |
836 | mmc_power_off(host); | 832 | mmc_detect_change(host); |
837 | mmc_detect_change(host); | 833 | } |
838 | 834 | ||
839 | return 0; | 835 | return ret; |
840 | } | 836 | } |
841 | 837 | ||
842 | EXPORT_SYMBOL(mmc_add_host); | 838 | EXPORT_SYMBOL(mmc_add_host); |
@@ -859,6 +855,7 @@ void mmc_remove_host(struct mmc_host *host) | |||
859 | } | 855 | } |
860 | 856 | ||
861 | mmc_power_off(host); | 857 | mmc_power_off(host); |
858 | mmc_remove_host_sysfs(host); | ||
862 | } | 859 | } |
863 | 860 | ||
864 | EXPORT_SYMBOL(mmc_remove_host); | 861 | EXPORT_SYMBOL(mmc_remove_host); |
@@ -872,7 +869,7 @@ EXPORT_SYMBOL(mmc_remove_host); | |||
872 | void mmc_free_host(struct mmc_host *host) | 869 | void mmc_free_host(struct mmc_host *host) |
873 | { | 870 | { |
874 | flush_scheduled_work(); | 871 | flush_scheduled_work(); |
875 | kfree(host); | 872 | mmc_free_host_sysfs(host); |
876 | } | 873 | } |
877 | 874 | ||
878 | EXPORT_SYMBOL(mmc_free_host); | 875 | EXPORT_SYMBOL(mmc_free_host); |