mmc: core: fix merge bug
[firefly-linux-kernel-4.4.55.git] / drivers / mmc / core / sdio_bus.c
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/slab.h>
17
18 #include <linux/mmc/card.h>
19 #include <linux/mmc/sdio_func.h>
20
21 #include "sdio_cis.h"
22 #include "sdio_bus.h"
23
24 #ifdef CONFIG_MMC_EMBEDDED_SDIO
25 #include <linux/mmc/host.h>
26 #endif
27
28 /* show configuration fields */
29 #define sdio_config_attr(field, format_string)                          \
30 static ssize_t                                                          \
31 field##_show(struct device *dev, struct device_attribute *attr, char *buf)                              \
32 {                                                                       \
33         struct sdio_func *func;                                         \
34                                                                         \
35         func = dev_to_sdio_func (dev);                                  \
36         return sprintf (buf, format_string, func->field);               \
37 }
38
39 sdio_config_attr(class, "0x%02x\n");
40 sdio_config_attr(vendor, "0x%04x\n");
41 sdio_config_attr(device, "0x%04x\n");
42
43 static ssize_t modalias_show(struct device *dev, struct device_attribute *attr, char *buf)
44 {
45         struct sdio_func *func = dev_to_sdio_func (dev);
46
47         return sprintf(buf, "sdio:c%02Xv%04Xd%04X\n",
48                         func->class, func->vendor, func->device);
49 }
50
51 static struct device_attribute sdio_dev_attrs[] = {
52         __ATTR_RO(class),
53         __ATTR_RO(vendor),
54         __ATTR_RO(device),
55         __ATTR_RO(modalias),
56         __ATTR_NULL,
57 };
58
59 static const struct sdio_device_id *sdio_match_one(struct sdio_func *func,
60         const struct sdio_device_id *id)
61 {
62         if (id->class != (__u8)SDIO_ANY_ID && id->class != func->class)
63                 return NULL;
64         if (id->vendor != (__u16)SDIO_ANY_ID && id->vendor != func->vendor)
65                 return NULL;
66         if (id->device != (__u16)SDIO_ANY_ID && id->device != func->device)
67                 return NULL;
68         return id;
69 }
70
71 static const struct sdio_device_id *sdio_match_device(struct sdio_func *func,
72         struct sdio_driver *sdrv)
73 {
74         const struct sdio_device_id *ids;
75
76         ids = sdrv->id_table;
77
78         if (ids) {
79                 while (ids->class || ids->vendor || ids->device) {
80                         if (sdio_match_one(func, ids))
81                                 return ids;
82                         ids++;
83                 }
84         }
85
86         return NULL;
87 }
88
89 static int sdio_bus_match(struct device *dev, struct device_driver *drv)
90 {
91         struct sdio_func *func = dev_to_sdio_func(dev);
92         struct sdio_driver *sdrv = to_sdio_driver(drv);
93
94         if (sdio_match_device(func, sdrv))
95                 return 1;
96
97         return 0;
98 }
99
100 static int
101 sdio_bus_uevent(struct device *dev, struct kobj_uevent_env *env)
102 {
103         struct sdio_func *func = dev_to_sdio_func(dev);
104
105         if (add_uevent_var(env,
106                         "SDIO_CLASS=%02X", func->class))
107                 return -ENOMEM;
108
109         if (add_uevent_var(env, 
110                         "SDIO_ID=%04X:%04X", func->vendor, func->device))
111                 return -ENOMEM;
112
113         if (add_uevent_var(env,
114                         "MODALIAS=sdio:c%02Xv%04Xd%04X",
115                         func->class, func->vendor, func->device))
116                 return -ENOMEM;
117
118         return 0;
119 }
120
121 static int sdio_bus_probe(struct device *dev)
122 {
123         struct sdio_driver *drv = to_sdio_driver(dev->driver);
124         struct sdio_func *func = dev_to_sdio_func(dev);
125         const struct sdio_device_id *id;
126         int ret;
127
128         id = sdio_match_device(func, drv);
129         if (!id)
130                 return -ENODEV;
131
132         /* Set the default block size so the driver is sure it's something
133          * sensible. */
134         sdio_claim_host(func);
135         ret = sdio_set_block_size(func, 0);
136         sdio_release_host(func);
137         if (ret)
138                 return ret;
139
140         return drv->probe(func, id);
141 }
142
143 static int sdio_bus_remove(struct device *dev)
144 {
145         struct sdio_driver *drv = to_sdio_driver(dev->driver);
146         struct sdio_func *func = dev_to_sdio_func(dev);
147
148         drv->remove(func);
149
150         if (func->irq_handler) {
151                 printk(KERN_WARNING "WARNING: driver %s did not remove "
152                         "its interrupt handler!\n", drv->name);
153                 sdio_claim_host(func);
154                 sdio_release_irq(func);
155                 sdio_release_host(func);
156         }
157
158         return 0;
159 }
160
161 static struct bus_type sdio_bus_type = {
162         .name           = "sdio",
163         .dev_attrs      = sdio_dev_attrs,
164         .match          = sdio_bus_match,
165         .uevent         = sdio_bus_uevent,
166         .probe          = sdio_bus_probe,
167         .remove         = sdio_bus_remove,
168 };
169
170 int sdio_register_bus(void)
171 {
172         return bus_register(&sdio_bus_type);
173 }
174
175 void sdio_unregister_bus(void)
176 {
177         bus_unregister(&sdio_bus_type);
178 }
179
180 /**
181  *      sdio_register_driver - register a function driver
182  *      @drv: SDIO function driver
183  */
184 int sdio_register_driver(struct sdio_driver *drv)
185 {
186         drv->drv.name = drv->name;
187         drv->drv.bus = &sdio_bus_type;
188         return driver_register(&drv->drv);
189 }
190 EXPORT_SYMBOL_GPL(sdio_register_driver);
191
192 /**
193  *      sdio_unregister_driver - unregister a function driver
194  *      @drv: SDIO function driver
195  */
196 void sdio_unregister_driver(struct sdio_driver *drv)
197 {
198         drv->drv.bus = &sdio_bus_type;
199         driver_unregister(&drv->drv);
200 }
201 EXPORT_SYMBOL_GPL(sdio_unregister_driver);
202
203 static void sdio_release_func(struct device *dev)
204 {
205         struct sdio_func *func = dev_to_sdio_func(dev);
206
207 #ifdef CONFIG_MMC_EMBEDDED_SDIO
208         /*
209          * If this device is embedded then we never allocated
210          * cis tables for this func
211          */
212         if (!func->card->host->embedded_sdio_data.funcs)
213 #endif
214                 sdio_free_func_cis(func);
215
216         if (func->info)
217                 kfree(func->info);
218
219         kfree(func);
220 }
221
222 /*
223  * Allocate and initialise a new SDIO function structure.
224  */
225 struct sdio_func *sdio_alloc_func(struct mmc_card *card)
226 {
227         struct sdio_func *func;
228
229         func = kzalloc(sizeof(struct sdio_func), GFP_KERNEL);
230         if (!func)
231                 return ERR_PTR(-ENOMEM);
232
233         func->card = card;
234
235         device_initialize(&func->dev);
236
237         func->dev.parent = &card->dev;
238         func->dev.bus = &sdio_bus_type;
239         func->dev.release = sdio_release_func;
240
241         return func;
242 }
243
244 /*
245  * Register a new SDIO function with the driver model.
246  */
247 int sdio_add_func(struct sdio_func *func)
248 {
249         int ret;
250
251         dev_set_name(&func->dev, "%s:%d", mmc_card_id(func->card), func->num);
252
253         ret = device_add(&func->dev);
254         if (ret == 0)
255                 sdio_func_set_present(func);
256
257         return ret;
258 }
259
260 /*
261  * Unregister a SDIO function with the driver model, and
262  * (eventually) free it.
263  * This function can be called through error paths where sdio_add_func() was
264  * never executed (because a failure occurred at an earlier point).
265  */
266 void sdio_remove_func(struct sdio_func *func)
267 {
268         if (!sdio_func_present(func))
269                 return;
270
271         device_del(&func->dev);
272         put_device(&func->dev);
273 }
274