xref: /linux/drivers/mmc/core/bus.c (revision f8324e20f8289dffc646d64366332e05eaacab25)
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/device.h>
15 #include <linux/err.h>
16 #include <linux/slab.h>
17 
18 #include <linux/mmc/card.h>
19 #include <linux/mmc/host.h>
20 
21 #include "core.h"
22 #include "sdio_cis.h"
23 #include "bus.h"
24 
25 #define dev_to_mmc_card(d)	container_of(d, struct mmc_card, dev)
26 #define to_mmc_driver(d)	container_of(d, struct mmc_driver, drv)
27 
28 static ssize_t mmc_type_show(struct device *dev,
29 	struct device_attribute *attr, char *buf)
30 {
31 	struct mmc_card *card = dev_to_mmc_card(dev);
32 
33 	switch (card->type) {
34 	case MMC_TYPE_MMC:
35 		return sprintf(buf, "MMC\n");
36 	case MMC_TYPE_SD:
37 		return sprintf(buf, "SD\n");
38 	case MMC_TYPE_SDIO:
39 		return sprintf(buf, "SDIO\n");
40 	default:
41 		return -EFAULT;
42 	}
43 }
44 
45 static struct device_attribute mmc_dev_attrs[] = {
46 	__ATTR(type, S_IRUGO, mmc_type_show, NULL),
47 	__ATTR_NULL,
48 };
49 
50 /*
51  * This currently matches any MMC driver to any MMC card - drivers
52  * themselves make the decision whether to drive this card in their
53  * probe method.
54  */
55 static int mmc_bus_match(struct device *dev, struct device_driver *drv)
56 {
57 	return 1;
58 }
59 
60 static int
61 mmc_bus_uevent(struct device *dev, struct kobj_uevent_env *env)
62 {
63 	struct mmc_card *card = dev_to_mmc_card(dev);
64 	const char *type;
65 	int retval = 0;
66 
67 	switch (card->type) {
68 	case MMC_TYPE_MMC:
69 		type = "MMC";
70 		break;
71 	case MMC_TYPE_SD:
72 		type = "SD";
73 		break;
74 	case MMC_TYPE_SDIO:
75 		type = "SDIO";
76 		break;
77 	default:
78 		type = NULL;
79 	}
80 
81 	if (type) {
82 		retval = add_uevent_var(env, "MMC_TYPE=%s", type);
83 		if (retval)
84 			return retval;
85 	}
86 
87 	retval = add_uevent_var(env, "MMC_NAME=%s", mmc_card_name(card));
88 	if (retval)
89 		return retval;
90 
91 	/*
92 	 * Request the mmc_block device.  Note: that this is a direct request
93 	 * for the module it carries no information as to what is inserted.
94 	 */
95 	retval = add_uevent_var(env, "MODALIAS=mmc:block");
96 
97 	return retval;
98 }
99 
100 static int mmc_bus_probe(struct device *dev)
101 {
102 	struct mmc_driver *drv = to_mmc_driver(dev->driver);
103 	struct mmc_card *card = dev_to_mmc_card(dev);
104 
105 	return drv->probe(card);
106 }
107 
108 static int mmc_bus_remove(struct device *dev)
109 {
110 	struct mmc_driver *drv = to_mmc_driver(dev->driver);
111 	struct mmc_card *card = dev_to_mmc_card(dev);
112 
113 	drv->remove(card);
114 
115 	return 0;
116 }
117 
118 static int mmc_bus_suspend(struct device *dev, pm_message_t state)
119 {
120 	struct mmc_driver *drv = to_mmc_driver(dev->driver);
121 	struct mmc_card *card = dev_to_mmc_card(dev);
122 	int ret = 0;
123 
124 	if (dev->driver && drv->suspend)
125 		ret = drv->suspend(card, state);
126 	return ret;
127 }
128 
129 static int mmc_bus_resume(struct device *dev)
130 {
131 	struct mmc_driver *drv = to_mmc_driver(dev->driver);
132 	struct mmc_card *card = dev_to_mmc_card(dev);
133 	int ret = 0;
134 
135 	if (dev->driver && drv->resume)
136 		ret = drv->resume(card);
137 	return ret;
138 }
139 
140 static struct bus_type mmc_bus_type = {
141 	.name		= "mmc",
142 	.dev_attrs	= mmc_dev_attrs,
143 	.match		= mmc_bus_match,
144 	.uevent		= mmc_bus_uevent,
145 	.probe		= mmc_bus_probe,
146 	.remove		= mmc_bus_remove,
147 	.suspend	= mmc_bus_suspend,
148 	.resume		= mmc_bus_resume,
149 };
150 
151 int mmc_register_bus(void)
152 {
153 	return bus_register(&mmc_bus_type);
154 }
155 
156 void mmc_unregister_bus(void)
157 {
158 	bus_unregister(&mmc_bus_type);
159 }
160 
161 /**
162  *	mmc_register_driver - register a media driver
163  *	@drv: MMC media driver
164  */
165 int mmc_register_driver(struct mmc_driver *drv)
166 {
167 	drv->drv.bus = &mmc_bus_type;
168 	return driver_register(&drv->drv);
169 }
170 
171 EXPORT_SYMBOL(mmc_register_driver);
172 
173 /**
174  *	mmc_unregister_driver - unregister a media driver
175  *	@drv: MMC media driver
176  */
177 void mmc_unregister_driver(struct mmc_driver *drv)
178 {
179 	drv->drv.bus = &mmc_bus_type;
180 	driver_unregister(&drv->drv);
181 }
182 
183 EXPORT_SYMBOL(mmc_unregister_driver);
184 
185 static void mmc_release_card(struct device *dev)
186 {
187 	struct mmc_card *card = dev_to_mmc_card(dev);
188 
189 	sdio_free_common_cis(card);
190 
191 	if (card->info)
192 		kfree(card->info);
193 
194 	kfree(card);
195 }
196 
197 /*
198  * Allocate and initialise a new MMC card structure.
199  */
200 struct mmc_card *mmc_alloc_card(struct mmc_host *host, struct device_type *type)
201 {
202 	struct mmc_card *card;
203 
204 	card = kzalloc(sizeof(struct mmc_card), GFP_KERNEL);
205 	if (!card)
206 		return ERR_PTR(-ENOMEM);
207 
208 	card->host = host;
209 
210 	device_initialize(&card->dev);
211 
212 	card->dev.parent = mmc_classdev(host);
213 	card->dev.bus = &mmc_bus_type;
214 	card->dev.release = mmc_release_card;
215 	card->dev.type = type;
216 
217 	return card;
218 }
219 
220 /*
221  * Register a new MMC card with the driver model.
222  */
223 int mmc_add_card(struct mmc_card *card)
224 {
225 	int ret;
226 	const char *type;
227 
228 	dev_set_name(&card->dev, "%s:%04x", mmc_hostname(card->host), card->rca);
229 
230 	switch (card->type) {
231 	case MMC_TYPE_MMC:
232 		type = "MMC";
233 		break;
234 	case MMC_TYPE_SD:
235 		type = "SD";
236 		if (mmc_card_blockaddr(card))
237 			type = "SDHC";
238 		break;
239 	case MMC_TYPE_SDIO:
240 		type = "SDIO";
241 		break;
242 	default:
243 		type = "?";
244 		break;
245 	}
246 
247 	if (mmc_host_is_spi(card->host)) {
248 		printk(KERN_INFO "%s: new %s%s card on SPI\n",
249 			mmc_hostname(card->host),
250 			mmc_card_highspeed(card) ? "high speed " : "",
251 			type);
252 	} else {
253 		printk(KERN_INFO "%s: new %s%s card at address %04x\n",
254 			mmc_hostname(card->host),
255 			mmc_card_highspeed(card) ? "high speed " : "",
256 			type, card->rca);
257 	}
258 
259 	ret = device_add(&card->dev);
260 	if (ret)
261 		return ret;
262 
263 #ifdef CONFIG_DEBUG_FS
264 	mmc_add_card_debugfs(card);
265 #endif
266 
267 	mmc_card_set_present(card);
268 
269 	return 0;
270 }
271 
272 /*
273  * Unregister a new MMC card with the driver model, and
274  * (eventually) free it.
275  */
276 void mmc_remove_card(struct mmc_card *card)
277 {
278 #ifdef CONFIG_DEBUG_FS
279 	mmc_remove_card_debugfs(card);
280 #endif
281 
282 	if (mmc_card_present(card)) {
283 		if (mmc_host_is_spi(card->host)) {
284 			printk(KERN_INFO "%s: SPI card removed\n",
285 				mmc_hostname(card->host));
286 		} else {
287 			printk(KERN_INFO "%s: card %04x removed\n",
288 				mmc_hostname(card->host), card->rca);
289 		}
290 		device_del(&card->dev);
291 	}
292 
293 	put_device(&card->dev);
294 }
295 
296