Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

PCMCIA: soc_common: push socket probe down into SoC specific support

Move the individual socket probing and initialization down into the
SoC specific support files, thereby allowing soc_common_drv_pcmcia_probe
to be eliminated. soc_common.c now no longer deals with distinct groups
of sockets.

Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.net>

authored by

Russell King - ARM Linux and committed by
Dominik Brodowski
da4f0073 be85458e

+103 -104
+47 -30
drivers/pcmcia/pxa2xx_base.c
··· 228 228 #define SKT_DEV_INFO_SIZE(n) \ 229 229 (sizeof(struct skt_dev_info) + (n)*sizeof(struct soc_pcmcia_socket)) 230 230 231 + static int pxa2xx_drv_pcmcia_add_one(struct soc_pcmcia_socket *skt) 232 + { 233 + skt->res_skt.start = _PCMCIA(skt->nr); 234 + skt->res_skt.end = _PCMCIA(skt->nr) + PCMCIASp - 1; 235 + skt->res_skt.name = skt_names[skt->nr]; 236 + skt->res_skt.flags = IORESOURCE_MEM; 237 + 238 + skt->res_io.start = _PCMCIAIO(skt->nr); 239 + skt->res_io.end = _PCMCIAIO(skt->nr) + PCMCIAIOSp - 1; 240 + skt->res_io.name = "io"; 241 + skt->res_io.flags = IORESOURCE_MEM | IORESOURCE_BUSY; 242 + 243 + skt->res_mem.start = _PCMCIAMem(skt->nr); 244 + skt->res_mem.end = _PCMCIAMem(skt->nr) + PCMCIAMemSp - 1; 245 + skt->res_mem.name = "memory"; 246 + skt->res_mem.flags = IORESOURCE_MEM; 247 + 248 + skt->res_attr.start = _PCMCIAAttr(skt->nr); 249 + skt->res_attr.end = _PCMCIAAttr(skt->nr) + PCMCIAAttrSp - 1; 250 + skt->res_attr.name = "attribute"; 251 + skt->res_attr.flags = IORESOURCE_MEM; 252 + 253 + return soc_pcmcia_add_one(skt); 254 + } 255 + 231 256 int __pxa2xx_drv_pcmcia_probe(struct device *dev) 232 257 { 233 258 int i, ret; ··· 265 240 266 241 ops = (struct pcmcia_low_level *)dev->platform_data; 267 242 243 + /* Provide our PXA2xx specific timing routines. */ 244 + ops->set_timing = pxa2xx_pcmcia_set_timing; 245 + #ifdef CONFIG_CPU_FREQ 246 + ops->frequency_change = pxa2xx_pcmcia_frequency_change; 247 + #endif 248 + 268 249 sinfo = kzalloc(SKT_DEV_INFO_SIZE(ops->nr), GFP_KERNEL); 269 250 if (!sinfo) 270 251 return -ENOMEM; ··· 281 250 for (i = 0; i < ops->nr; i++) { 282 251 skt = &sinfo->skt[i]; 283 252 284 - skt->nr = ops->first + i; 285 - skt->irq = NO_IRQ; 253 + skt->nr = ops->first + i; 254 + skt->irq = NO_IRQ; 255 + skt->dev = dev; 256 + skt->ops = ops; 257 + skt->socket.owner = ops->owner; 258 + skt->socket.dev.parent = dev; 286 259 287 - skt->res_skt.start = _PCMCIA(skt->nr); 288 - skt->res_skt.end = _PCMCIA(skt->nr) + PCMCIASp - 1; 289 - skt->res_skt.name = skt_names[skt->nr]; 290 - skt->res_skt.flags = IORESOURCE_MEM; 291 - 292 - skt->res_io.start = _PCMCIAIO(skt->nr); 293 - skt->res_io.end = _PCMCIAIO(skt->nr) + PCMCIAIOSp - 1; 294 - skt->res_io.name = "io"; 295 - skt->res_io.flags = IORESOURCE_MEM | IORESOURCE_BUSY; 296 - 297 - skt->res_mem.start = _PCMCIAMem(skt->nr); 298 - skt->res_mem.end = _PCMCIAMem(skt->nr) + PCMCIAMemSp - 1; 299 - skt->res_mem.name = "memory"; 300 - skt->res_mem.flags = IORESOURCE_MEM; 301 - 302 - skt->res_attr.start = _PCMCIAAttr(skt->nr); 303 - skt->res_attr.end = _PCMCIAAttr(skt->nr) + PCMCIAAttrSp - 1; 304 - skt->res_attr.name = "attribute"; 305 - skt->res_attr.flags = IORESOURCE_MEM; 260 + ret = pxa2xx_drv_pcmcia_add_one(skt); 261 + if (ret) 262 + break; 306 263 } 307 264 308 - /* Provide our PXA2xx specific timing routines. */ 309 - ops->set_timing = pxa2xx_pcmcia_set_timing; 310 - #ifdef CONFIG_CPU_FREQ 311 - ops->frequency_change = pxa2xx_pcmcia_frequency_change; 312 - #endif 313 - 314 - ret = soc_common_drv_pcmcia_probe(dev, ops, sinfo); 315 - 316 - if (!ret) 265 + if (ret) { 266 + while (--i >= 0) 267 + soc_pcmcia_remove_one(&sinfo->skt[i]); 268 + kfree(sinfo); 269 + } else { 317 270 pxa2xx_configure_sockets(dev); 271 + dev_set_drvdata(dev, sinfo); 272 + } 318 273 319 274 return ret; 320 275 }
+56 -35
drivers/pcmcia/sa11xx_base.c
··· 171 171 #define SKT_DEV_INFO_SIZE(n) \ 172 172 (sizeof(struct skt_dev_info) + (n)*sizeof(struct soc_pcmcia_socket)) 173 173 174 + static int sa11xx_drv_pcmcia_add_one(struct soc_pcmcia_socket *skt) 175 + { 176 + skt->res_skt.start = _PCMCIA(skt->nr); 177 + skt->res_skt.end = _PCMCIA(skt->nr) + PCMCIASp - 1; 178 + skt->res_skt.name = skt_names[skt->nr]; 179 + skt->res_skt.flags = IORESOURCE_MEM; 180 + 181 + skt->res_io.start = _PCMCIAIO(skt->nr); 182 + skt->res_io.end = _PCMCIAIO(skt->nr) + PCMCIAIOSp - 1; 183 + skt->res_io.name = "io"; 184 + skt->res_io.flags = IORESOURCE_MEM | IORESOURCE_BUSY; 185 + 186 + skt->res_mem.start = _PCMCIAMem(skt->nr); 187 + skt->res_mem.end = _PCMCIAMem(skt->nr) + PCMCIAMemSp - 1; 188 + skt->res_mem.name = "memory"; 189 + skt->res_mem.flags = IORESOURCE_MEM; 190 + 191 + skt->res_attr.start = _PCMCIAAttr(skt->nr); 192 + skt->res_attr.end = _PCMCIAAttr(skt->nr) + PCMCIAAttrSp - 1; 193 + skt->res_attr.name = "attribute"; 194 + skt->res_attr.flags = IORESOURCE_MEM; 195 + 196 + return soc_pcmcia_add_one(skt); 197 + } 198 + 174 199 int sa11xx_drv_pcmcia_probe(struct device *dev, struct pcmcia_low_level *ops, 175 200 int first, int nr) 176 201 { 177 202 struct skt_dev_info *sinfo; 178 203 struct soc_pcmcia_socket *skt; 179 204 int i; 180 - 181 - sinfo = kzalloc(SKT_DEV_INFO_SIZE(nr), GFP_KERNEL); 182 - if (!sinfo) 183 - return -ENOMEM; 184 - 185 - sinfo->nskt = nr; 186 - 187 - /* Initiliaze processor specific parameters */ 188 - for (i = 0; i < nr; i++) { 189 - skt = &sinfo->skt[i]; 190 - 191 - skt->nr = first + i; 192 - skt->irq = NO_IRQ; 193 - 194 - skt->res_skt.start = _PCMCIA(skt->nr); 195 - skt->res_skt.end = _PCMCIA(skt->nr) + PCMCIASp - 1; 196 - skt->res_skt.name = skt_names[skt->nr]; 197 - skt->res_skt.flags = IORESOURCE_MEM; 198 - 199 - skt->res_io.start = _PCMCIAIO(skt->nr); 200 - skt->res_io.end = _PCMCIAIO(skt->nr) + PCMCIAIOSp - 1; 201 - skt->res_io.name = "io"; 202 - skt->res_io.flags = IORESOURCE_MEM | IORESOURCE_BUSY; 203 - 204 - skt->res_mem.start = _PCMCIAMem(skt->nr); 205 - skt->res_mem.end = _PCMCIAMem(skt->nr) + PCMCIAMemSp - 1; 206 - skt->res_mem.name = "memory"; 207 - skt->res_mem.flags = IORESOURCE_MEM; 208 - 209 - skt->res_attr.start = _PCMCIAAttr(skt->nr); 210 - skt->res_attr.end = _PCMCIAAttr(skt->nr) + PCMCIAAttrSp - 1; 211 - skt->res_attr.name = "attribute"; 212 - skt->res_attr.flags = IORESOURCE_MEM; 213 - } 214 205 215 206 /* 216 207 * set default MECR calculation if the board specific ··· 217 226 ops->frequency_change = sa1100_pcmcia_frequency_change; 218 227 #endif 219 228 220 - return soc_common_drv_pcmcia_probe(dev, ops, sinfo); 229 + sinfo = kzalloc(SKT_DEV_INFO_SIZE(nr), GFP_KERNEL); 230 + if (!sinfo) 231 + return -ENOMEM; 232 + 233 + sinfo->nskt = nr; 234 + 235 + /* Initiliaze processor specific parameters */ 236 + for (i = 0; i < nr; i++) { 237 + skt = &sinfo->skt[i]; 238 + 239 + skt->nr = first + i; 240 + skt->irq = NO_IRQ; 241 + skt->dev = dev; 242 + skt->ops = ops; 243 + skt->socket.owner = ops->owner; 244 + skt->socket.dev.parent = dev; 245 + 246 + ret = sa11xx_drv_pcmcia_add_one(skt); 247 + if (ret) 248 + break; 249 + } 250 + 251 + if (ret) { 252 + while (--i >= 0) 253 + soc_pcmcia_remove_one(&sinfo->skt[i]); 254 + kfree(sinfo); 255 + } else { 256 + dev_set_drvdata(dev, sinfo); 257 + } 258 + 259 + return ret; 221 260 } 222 261 EXPORT_SYMBOL(sa11xx_drv_pcmcia_probe); 223 262
-37
drivers/pcmcia/soc_common.c
··· 741 741 } 742 742 EXPORT_SYMBOL(soc_pcmcia_add_one); 743 743 744 - int soc_common_drv_pcmcia_probe(struct device *dev, struct pcmcia_low_level *ops, 745 - struct skt_dev_info *sinfo) 746 - { 747 - struct soc_pcmcia_socket *skt; 748 - int ret, i; 749 - 750 - /* 751 - * Initialise the per-socket structure. 752 - */ 753 - for (i = ret = 0; i < sinfo->nskt; i++) { 754 - skt = &sinfo->skt[i]; 755 - 756 - skt->socket.owner = ops->owner; 757 - skt->socket.dev.parent = dev; 758 - 759 - skt->dev = dev; 760 - skt->ops = ops; 761 - 762 - ret = soc_pcmcia_add_one(skt); 763 - if (ret) 764 - break; 765 - 766 - WARN_ON(skt->socket.sock != i); 767 - } 768 - 769 - if (ret) { 770 - while (--i >= 0) 771 - soc_pcmcia_remove_one(&sinfo->skt[i]); 772 - kfree(sinfo); 773 - } else { 774 - dev_set_drvdata(dev, sinfo); 775 - } 776 - 777 - return ret; 778 - } 779 - EXPORT_SYMBOL(soc_common_drv_pcmcia_probe); 780 - 781 744 MODULE_AUTHOR("John Dorsey <john+@cs.cmu.edu>"); 782 745 MODULE_DESCRIPTION("Linux PCMCIA Card Services: Common SoC support"); 783 746 MODULE_LICENSE("Dual MPL/GPL");
-2
drivers/pcmcia/soc_common.h
··· 138 138 void soc_pcmcia_remove_one(struct soc_pcmcia_socket *skt); 139 139 int soc_pcmcia_add_one(struct soc_pcmcia_socket *skt); 140 140 141 - extern int soc_common_drv_pcmcia_probe(struct device *dev, struct pcmcia_low_level *ops, struct skt_dev_info *sinfo); 142 - 143 141 144 142 #ifdef CONFIG_PCMCIA_DEBUG 145 143