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

Configure Feed

Select the types of activity you want to include in your feed.

Fix AT91RM9200 build breakage

The at91_cf driver got out of sync with certain changes in the PCMCIA
layer, notably getting rid of some duplication of data ... causing the
version merged to kernel.org to fail compiling.

This patch gives the at91_cf platform device a new iomem resource, using
it so this new pcmcia scheme works. It also cleans up some whitepsace
bugs that have accumulated over time (mostly too-long lines).

Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

authored by

David Brownell and committed by
Linus Torvalds
2c536200 64541d19

+42 -21
+11 -1
arch/arm/mach-at91rm9200/devices.c
··· 194 194 #if defined(CONFIG_AT91_CF) || defined(CONFIG_AT91_CF_MODULE) 195 195 static struct at91_cf_data cf_data; 196 196 197 + static struct resource at91_cf_resources[] = { 198 + [0] = { 199 + .start = AT91_CF_BASE, 200 + /* ties up CS4, CS5, and CS6 */ 201 + .end = AT91_CF_BASE + (0x30000000 - 1), 202 + .flags = IORESOURCE_MEM | IORESOURCE_MEM_8AND16BIT, 203 + }, 204 + }; 205 + 197 206 static struct platform_device at91rm9200_cf_device = { 198 207 .name = "at91_cf", 199 208 .id = -1, 200 209 .dev = { 201 210 .platform_data = &cf_data, 202 211 }, 203 - .num_resources = 0, 212 + .resource = at91_cf_resources, 213 + .num_resources = ARRAY_SIZE(at91_cf_resources), 204 214 }; 205 215 206 216 void __init at91_add_device_cf(struct at91_cf_data *data)
+31 -20
drivers/pcmcia/at91_cf.c
··· 28 28 #include <asm/arch/gpio.h> 29 29 30 30 31 - #define CF_SIZE 0x30000000 /* CS5+CS6: unavailable */ 32 - 33 31 /* 34 32 * A0..A10 work in each range; A23 indicates I/O space; A25 is CFRNW; 35 33 * some other bit in {A24,A22..A11} is nREG to flag memory access ··· 74 76 /* kick pccard as needed */ 75 77 if (present != cf->present) { 76 78 cf->present = present; 77 - pr_debug("%s: card %s\n", driver_name, present ? "present" : "gone"); 79 + pr_debug("%s: card %s\n", driver_name, 80 + present ? "present" : "gone"); 78 81 pcmcia_parse_events(&cf->socket, SS_DETECT); 79 82 } 80 83 } ··· 92 93 93 94 cf = container_of(s, struct at91_cf_socket, socket); 94 95 95 - /* NOTE: we assume 3VCARD, not XVCARD... */ 96 + /* NOTE: CF is always 3VCARD */ 96 97 if (at91_cf_present(cf)) { 97 98 int rdy = cf->board->irq_pin; /* RDY/nIRQ */ 98 99 int vcc = cf->board->vcc_pin; ··· 108 109 return 0; 109 110 } 110 111 111 - static int at91_cf_set_socket(struct pcmcia_socket *sock, struct socket_state_t *s) 112 + static int 113 + at91_cf_set_socket(struct pcmcia_socket *sock, struct socket_state_t *s) 112 114 { 113 115 struct at91_cf_socket *cf; 114 116 ··· 184 184 } 185 185 186 186 /* pcmcia layer maps/unmaps mem regions */ 187 - static int at91_cf_set_mem_map(struct pcmcia_socket *s, struct pccard_mem_map *map) 187 + static int 188 + at91_cf_set_mem_map(struct pcmcia_socket *s, struct pccard_mem_map *map) 188 189 { 189 190 struct at91_cf_socket *cf; 190 191 ··· 219 218 struct at91_cf_socket *cf; 220 219 struct at91_cf_data *board = dev->platform_data; 221 220 struct platform_device *pdev = to_platform_device(dev); 221 + struct resource *io; 222 222 unsigned int csa; 223 223 int status; 224 224 225 225 if (!board || !board->det_pin || !board->rst_pin) 226 + return -ENODEV; 227 + 228 + io = platform_get_resource(pdev, IORESOURCE_MEM, 0); 229 + if (!io) 226 230 return -ENODEV; 227 231 228 232 cf = kcalloc(1, sizeof *cf, GFP_KERNEL); ··· 256 250 * REVISIT: these timings are in terms of MCK cycles, so 257 251 * when MCK changes (cpufreq etc) so must these values... 258 252 */ 259 - at91_sys_write(AT91_SMC_CSR(4), AT91_SMC_ACSS_STD | AT91_SMC_DBW_16 | AT91_SMC_BAT | AT91_SMC_WSEN 260 - | AT91_SMC_NWS_(32) /* wait states */ 261 - | AT91_SMC_RWSETUP_(6) /* setup time */ 262 - | AT91_SMC_RWHOLD_(4) /* hold time */ 253 + at91_sys_write(AT91_SMC_CSR(4), 254 + AT91_SMC_ACSS_STD 255 + | AT91_SMC_DBW_16 256 + | AT91_SMC_BAT 257 + | AT91_SMC_WSEN 258 + | AT91_SMC_NWS_(32) /* wait states */ 259 + | AT91_SMC_RWSETUP_(6) /* setup time */ 260 + | AT91_SMC_RWHOLD_(4) /* hold time */ 263 261 ); 264 262 265 263 /* must be a GPIO; ergo must trigger on both edges */ ··· 284 274 if (status < 0) 285 275 goto fail0a; 286 276 cf->socket.pci_irq = board->irq_pin; 287 - } 288 - else 277 + } else 289 278 cf->socket.pci_irq = NR_IRQS + 1; 290 279 291 280 /* pcmcia layer only remaps "real" memory not iospace */ ··· 293 284 goto fail1; 294 285 295 286 /* reserve CS4, CS5, and CS6 regions; but use just CS4 */ 296 - if (!request_mem_region(AT91_CF_BASE, CF_SIZE, driver_name)) 287 + if (!request_mem_region(io->start, io->end + 1 - io->start, 288 + driver_name)) 297 289 goto fail1; 298 290 299 291 pr_info("%s: irqs det #%d, io #%d\n", driver_name, ··· 307 297 cf->socket.features = SS_CAP_PCCARD | SS_CAP_STATIC_MAP 308 298 | SS_CAP_MEM_ALIGN; 309 299 cf->socket.map_size = SZ_2K; 310 - cf->socket.io[0].NumPorts = SZ_2K; 300 + cf->socket.io[0].res = io; 311 301 312 302 status = pcmcia_register_socket(&cf->socket); 313 303 if (status < 0) ··· 317 307 318 308 fail2: 319 309 iounmap((void __iomem *) cf->socket.io_offset); 320 - release_mem_region(AT91_CF_BASE, CF_SIZE); 310 + release_mem_region(io->start, io->end + 1 - io->start); 321 311 fail1: 322 312 if (board->irq_pin) 323 313 free_irq(board->irq_pin, cf); ··· 331 321 332 322 static int __exit at91_cf_remove(struct device *dev) 333 323 { 334 - struct at91_cf_socket *cf = dev_get_drvdata(dev); 335 - unsigned int csa; 324 + struct at91_cf_socket *cf = dev_get_drvdata(dev); 325 + struct resource *io = cf->socket.io[0].res; 326 + unsigned int csa; 336 327 337 328 pcmcia_unregister_socket(&cf->socket); 338 329 free_irq(cf->board->irq_pin, cf); 339 330 free_irq(cf->board->det_pin, cf); 340 331 iounmap((void __iomem *) cf->socket.io_offset); 341 - release_mem_region(AT91_CF_BASE, CF_SIZE); 332 + release_mem_region(io->start, io->end + 1 - io->start); 342 333 343 334 csa = at91_sys_read(AT91_EBI_CSA); 344 335 at91_sys_write(AT91_EBI_CSA, csa & ~AT91_EBI_CS4A); ··· 353 342 .bus = &platform_bus_type, 354 343 .probe = at91_cf_probe, 355 344 .remove = __exit_p(at91_cf_remove), 356 - .suspend = pcmcia_socket_dev_suspend, 357 - .resume = pcmcia_socket_dev_resume, 345 + .suspend = pcmcia_socket_dev_suspend, 346 + .resume = pcmcia_socket_dev_resume, 358 347 }; 359 348 360 349 /*--------------------------------------------------------------------------*/