Date: | 2010-07-14 20:25:06 (13 years 8 months ago) |
---|---|
Author: | Lars C. |
Commit: | 1b3e64ae72a98fd5945a255570e9cc7bfe3b918f |
Message: | MTD: nand: jz4740: supply memory bank address through platform
resource |
Files: |
drivers/mtd/nand/jz4740_nand.c (9 diffs) |
Change Details
drivers/mtd/nand/jz4740_nand.c | ||
---|---|---|
52 | 52 | #define JZ_NAND_CTRL_ENABLE_CHIP(x) BIT(x << 1) |
53 | 53 | #define JZ_NAND_CTRL_ASSERT_CHIP(x) BIT((x << 1) + 1) |
54 | 54 | |
55 | #define JZ_NAND_DATA_ADDR ((void __iomem *)0xB8000000) | |
56 | #define JZ_NAND_CMD_ADDR (JZ_NAND_DATA_ADDR + 0x8000) | |
57 | #define JZ_NAND_ADDR_ADDR (JZ_NAND_DATA_ADDR + 0x10000) | |
58 | ||
59 | 55 | struct jz_nand { |
60 | 56 | struct mtd_info mtd; |
61 | 57 | struct nand_chip chip; |
62 | 58 | void __iomem *base; |
63 | 59 | struct resource *mem; |
64 | 60 | |
61 | void __iomem *bank_base; | |
62 | struct resource *bank_mem; | |
63 | ||
65 | 64 | struct jz_nand_platform_data *pdata; |
66 | 65 | bool is_reading; |
67 | 66 | }; |
... | ... | |
71 | 70 | return container_of(mtd, struct jz_nand, mtd); |
72 | 71 | } |
73 | 72 | |
73 | #define JZ_NAND_MEM_ADDR_OFFSET 0x10000 | |
74 | #define JZ_NAND_MEM_CMD_OFFSET 0x08000 | |
75 | ||
74 | 76 | static void jz_nand_cmd_ctrl(struct mtd_info *mtd, int dat, unsigned int ctrl) |
75 | 77 | { |
76 | 78 | struct jz_nand *nand = mtd_to_jz_nand(mtd); |
... | ... | |
80 | 82 | if (ctrl & NAND_CTRL_CHANGE) { |
81 | 83 | BUG_ON((ctrl & NAND_ALE) && (ctrl & NAND_CLE)); |
82 | 84 | if (ctrl & NAND_ALE) |
83 | chip->IO_ADDR_W = JZ_NAND_ADDR_ADDR; | |
85 | chip->IO_ADDR_W = nand->bank_base + JZ_NAND_MEM_ADDR_OFFSET; | |
84 | 86 | else if (ctrl & NAND_CLE) |
85 | chip->IO_ADDR_W = JZ_NAND_CMD_ADDR; | |
87 | chip->IO_ADDR_W = nand->bank_base + JZ_NAND_MEM_CMD_OFFSET; | |
86 | 88 | else |
87 | chip->IO_ADDR_W = JZ_NAND_DATA_ADDR; | |
89 | chip->IO_ADDR_W = nand->bank_base; | |
88 | 90 | |
89 | 91 | reg = readl(nand->base + JZ_REG_NAND_CTRL); |
90 | 92 | if (ctrl & NAND_NCE) |
... | ... | |
296 | 298 | static const char *part_probes[] = {"cmdline", NULL}; |
297 | 299 | #endif |
298 | 300 | |
301 | static int jz_nand_ioremap_resource(struct platform_device *pdev, | |
302 | const char *name, struct resource **res, void __iomem **base) | |
303 | { | |
304 | int ret; | |
305 | ||
306 | *res = platform_get_resource_byname(pdev, IORESOURCE_MEM, name); | |
307 | if (!*res) { | |
308 | dev_err(&pdev->dev, "Failed to get platform %s memory\n", name); | |
309 | ret = -ENXIO; | |
310 | goto err; | |
311 | } | |
312 | ||
313 | *res = request_mem_region((*res)->start, resource_size(*res), | |
314 | pdev->name); | |
315 | if (!*res) { | |
316 | dev_err(&pdev->dev, "Failed to request %s memory region\n", name); | |
317 | ret = -EBUSY; | |
318 | goto err; | |
319 | } | |
320 | ||
321 | *base = ioremap((*res)->start, resource_size(*res)); | |
322 | if (!*base) { | |
323 | dev_err(&pdev->dev, "Failed to ioremap %s memory region\n", name); | |
324 | ret = -EBUSY; | |
325 | goto err_release_mem; | |
326 | } | |
327 | ||
328 | return 0; | |
329 | ||
330 | err_release_mem: | |
331 | release_mem_region((*res)->start, resource_size(*res)); | |
332 | err: | |
333 | *res = NULL; | |
334 | *base = NULL; | |
335 | return ret; | |
336 | } | |
337 | ||
299 | 338 | static int __devinit jz_nand_probe(struct platform_device *pdev) |
300 | 339 | { |
301 | 340 | int ret; |
... | ... | |
314 | 353 | return -ENOMEM; |
315 | 354 | } |
316 | 355 | |
317 | nand->mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); | |
318 | if (!nand->mem) { | |
319 | dev_err(&pdev->dev, "Failed to get platform mmio memory\n"); | |
320 | ret = -ENXIO; | |
356 | ret = jz_nand_ioremap_resource(pdev, "mmio", &nand->mem, &nand->base); | |
357 | if (ret) | |
321 | 358 | goto err_free; |
322 | } | |
323 | ||
324 | nand->mem = request_mem_region(nand->mem->start, | |
325 | resource_size(nand->mem), pdev->name); | |
326 | if (!nand->mem) { | |
327 | dev_err(&pdev->dev, "Failed to request mmio memory region\n"); | |
328 | ret = -EBUSY; | |
329 | goto err_free; | |
330 | } | |
331 | ||
332 | nand->base = ioremap(nand->mem->start, resource_size(nand->mem)); | |
333 | if (!nand->base) { | |
334 | dev_err(&pdev->dev, "Failed to ioremap mmio memory region\n"); | |
335 | ret = -EBUSY; | |
336 | goto err_release_mem; | |
337 | } | |
359 | ret = jz_nand_ioremap_resource(pdev, "bank", &nand->bank_mem, | |
360 | &nand->bank_base); | |
361 | if (ret) | |
362 | goto err_iounmap_mmio; | |
338 | 363 | |
339 | 364 | if (pdata && gpio_is_valid(pdata->busy_gpio)) { |
340 | 365 | ret = gpio_request(pdata->busy_gpio, "NAND busy pin"); |
... | ... | |
342 | 367 | dev_err(&pdev->dev, |
343 | 368 | "Failed to request busy gpio %d: %d\n", |
344 | 369 | pdata->busy_gpio, ret); |
345 | goto err_iounmap; | |
370 | goto err_iounmap_mem; | |
346 | 371 | } |
347 | 372 | } |
348 | 373 | |
... | ... | |
371 | 396 | if (pdata && gpio_is_valid(pdata->busy_gpio)) |
372 | 397 | chip->dev_ready = jz_nand_dev_ready; |
373 | 398 | |
374 | chip->IO_ADDR_R = JZ_NAND_DATA_ADDR; | |
375 | chip->IO_ADDR_W = JZ_NAND_DATA_ADDR; | |
399 | chip->IO_ADDR_R = nand->bank_base; | |
400 | chip->IO_ADDR_W = nand->bank_base; | |
376 | 401 | |
377 | 402 | nand->pdata = pdata; |
378 | 403 | platform_set_drvdata(pdev, nand); |
... | ... | |
418 | 443 | dev_info(&pdev->dev, "Successfully registered JZ4740 NAND driver\n"); |
419 | 444 | |
420 | 445 | return 0; |
446 | ||
421 | 447 | err_nand_release: |
422 | 448 | nand_release(&nand->mtd); |
423 | 449 | err_gpio_free: |
424 | 450 | platform_set_drvdata(pdev, NULL); |
425 | 451 | gpio_free(pdata->busy_gpio); |
426 | err_iounmap: | |
452 | err_iounmap_mem: | |
453 | iounmap(nand->bank_base); | |
454 | err_iounmap_mmio: | |
427 | 455 | iounmap(nand->base); |
428 | err_release_mem: | |
429 | release_mem_region(nand->mem->start, resource_size(nand->mem)); | |
430 | 456 | err_free: |
431 | 457 | kfree(nand); |
432 | 458 | return ret; |
... | ... | |
438 | 464 | |
439 | 465 | nand_release(&nand->mtd); |
440 | 466 | |
467 | iounmap(nand->bank_base); | |
468 | release_mem_region(nand->bank_mem->start, resource_size(nand->bank_mem)); | |
441 | 469 | iounmap(nand->base); |
442 | 470 | release_mem_region(nand->mem->start, resource_size(nand->mem)); |
443 | 471 |
Branches:
ben-wpan
ben-wpan-stefan
5396a9238205f20f811ea57898980d3ca82df0b6
jz-2.6.34
jz-2.6.34-rc5
jz-2.6.34-rc6
jz-2.6.34-rc7
jz-2.6.35
jz-2.6.36
jz-2.6.37
jz-2.6.38
jz-2.6.39
jz-3.0
jz-3.1
jz-3.11
jz-3.12
jz-3.13
jz-3.15
jz-3.16
jz-3.18-dt
jz-3.2
jz-3.3
jz-3.4
jz-3.5
jz-3.6
jz-3.6-rc2-pwm
jz-3.9
jz-3.9-clk
jz-3.9-rc8
jz47xx
jz47xx-2.6.38
master
Tags:
od-2011-09-04
od-2011-09-18
v2.6.34-rc5
v2.6.34-rc6
v2.6.34-rc7
v3.9