Merge git://git.infradead.org/mtd-2.6
* git://git.infradead.org/mtd-2.6: (226 commits) mtd: tests: annotate as DANGEROUS in Kconfig mtd: tests: don't use mtd0 as a default mtd: clean up usage of MTD_DOCPROBE_ADDRESS jffs2: add compr=lzo and compr=zlib options jffs2: implement mount option parsing and compression overriding mtd: nand: initialize ops.mode mtd: provide an alias for the redboot module name mtd: m25p80: don't probe device which has status of 'disabled' mtd: nand_h1900 never worked mtd: Add DiskOnChip G3 support mtd: m25p80: add EON flash EN25Q32B into spi flash id table mtd: mark block device queue as non-rotational mtd: r852: make r852_pm_ops static mtd: m25p80: add support for at25df321a spi data flash mtd: mxc_nand: preset_v1_v2: unlock all NAND flash blocks mtd: nand: switch `check_pattern()' to standard `memcmp()' mtd: nand: invalidate cache on unaligned reads mtd: nand: do not scan bad blocks with NAND_BBT_NO_OOB set mtd: nand: wait to set BBT version mtd: nand: scrub BBT on ECC errors ... Fix up trivial conflicts: - arch/arm/mach-at91/board-usb-a9260.c Merged into board-usb-a926x.c - drivers/mtd/maps/lantiq-flash.c add_mtd_partitions -> mtd_device_register vs changed to use mtd_device_parse_register.
This commit is contained in:
@@ -41,8 +41,6 @@ config MTD_PHYSMAP_START
|
||||
are mapped on your particular target board. Refer to the
|
||||
memory map which should hopefully be in the documentation for
|
||||
your board.
|
||||
Ignore this option if you use run-time physmap configuration
|
||||
(i.e., run-time calling physmap_configure()).
|
||||
|
||||
config MTD_PHYSMAP_LEN
|
||||
hex "Physical length of flash mapping"
|
||||
@@ -55,8 +53,6 @@ config MTD_PHYSMAP_LEN
|
||||
than the total amount of flash present. Refer to the memory
|
||||
map which should hopefully be in the documentation for your
|
||||
board.
|
||||
Ignore this option if you use run-time physmap configuration
|
||||
(i.e., run-time calling physmap_configure()).
|
||||
|
||||
config MTD_PHYSMAP_BANKWIDTH
|
||||
int "Bank width in octets"
|
||||
@@ -67,8 +63,6 @@ config MTD_PHYSMAP_BANKWIDTH
|
||||
in octets. For example, if you have a data bus width of 32
|
||||
bits, you would set the bus width octet value to 4. This is
|
||||
used internally by the CFI drivers.
|
||||
Ignore this option if you use run-time physmap configuration
|
||||
(i.e., run-time calling physmap_configure()).
|
||||
|
||||
config MTD_PHYSMAP_OF
|
||||
tristate "Flash device in physical memory map based on OF description"
|
||||
@@ -260,7 +254,6 @@ config MTD_BCM963XX
|
||||
config MTD_LANTIQ
|
||||
tristate "Lantiq SoC NOR support"
|
||||
depends on LANTIQ
|
||||
select MTD_PARTITIONS
|
||||
help
|
||||
Support for NOR flash attached to the Lantiq SoC's External Bus Unit.
|
||||
|
||||
@@ -339,10 +332,6 @@ config MTD_SOLUTIONENGINE
|
||||
This enables access to the flash chips on the Hitachi SolutionEngine and
|
||||
similar boards. Say 'Y' if you are building a kernel for such a board.
|
||||
|
||||
config MTD_ARM_INTEGRATOR
|
||||
tristate "CFI Flash device mapped on ARM Integrator/P720T"
|
||||
depends on ARM && MTD_CFI
|
||||
|
||||
config MTD_CDB89712
|
||||
tristate "Cirrus CDB89712 evaluation board mappings"
|
||||
depends on MTD_CFI && ARCH_CDB89712
|
||||
@@ -398,13 +387,6 @@ config MTD_AUTCPU12
|
||||
This enables access to the NV-RAM on autronix autcpu12 board.
|
||||
If you have such a board, say 'Y'.
|
||||
|
||||
config MTD_EDB7312
|
||||
tristate "CFI Flash device mapped on EDB7312"
|
||||
depends on ARCH_EDB7312 && MTD_CFI
|
||||
help
|
||||
This enables access to the CFI Flash on the Cogent EDB7312 board.
|
||||
If you have such a board, say 'Y' here.
|
||||
|
||||
config MTD_IMPA7
|
||||
tristate "JEDEC Flash device mapped on impA7"
|
||||
depends on ARM && MTD_JEDECPROBE
|
||||
@@ -412,14 +394,6 @@ config MTD_IMPA7
|
||||
This enables access to the NOR Flash on the impA7 board of
|
||||
implementa GmbH. If you have such a board, say 'Y' here.
|
||||
|
||||
config MTD_CEIVA
|
||||
tristate "JEDEC Flash device mapped on Ceiva/Polaroid PhotoMax Digital Picture Frame"
|
||||
depends on MTD_JEDECPROBE && ARCH_CEIVA
|
||||
help
|
||||
This enables access to the flash chips on the Ceiva/Polaroid
|
||||
PhotoMax Digital Picture Frame.
|
||||
If you have such a device, say 'Y'.
|
||||
|
||||
config MTD_H720X
|
||||
tristate "Hynix evaluation board mappings"
|
||||
depends on MTD_CFI && ( ARCH_H7201 || ARCH_H7202 )
|
||||
|
@@ -19,7 +19,6 @@ obj-$(CONFIG_MTD_CK804XROM) += ck804xrom.o
|
||||
obj-$(CONFIG_MTD_TSUNAMI) += tsunami_flash.o
|
||||
obj-$(CONFIG_MTD_PXA2XX) += pxa2xx-flash.o
|
||||
obj-$(CONFIG_MTD_MBX860) += mbx860.o
|
||||
obj-$(CONFIG_MTD_CEIVA) += ceiva.o
|
||||
obj-$(CONFIG_MTD_OCTAGON) += octagon-5066.o
|
||||
obj-$(CONFIG_MTD_PHYSMAP) += physmap.o
|
||||
obj-$(CONFIG_MTD_PHYSMAP_OF) += physmap_of.o
|
||||
@@ -40,7 +39,6 @@ obj-$(CONFIG_MTD_DBOX2) += dbox2-flash.o
|
||||
obj-$(CONFIG_MTD_SOLUTIONENGINE)+= solutionengine.o
|
||||
obj-$(CONFIG_MTD_PCI) += pci.o
|
||||
obj-$(CONFIG_MTD_AUTCPU12) += autcpu12-nvram.o
|
||||
obj-$(CONFIG_MTD_EDB7312) += edb7312.o
|
||||
obj-$(CONFIG_MTD_IMPA7) += impa7.o
|
||||
obj-$(CONFIG_MTD_FORTUNET) += fortunet.o
|
||||
obj-$(CONFIG_MTD_UCLINUX) += uclinux.o
|
||||
|
@@ -41,7 +41,6 @@ struct async_state {
|
||||
uint32_t flash_ambctl0, flash_ambctl1;
|
||||
uint32_t save_ambctl0, save_ambctl1;
|
||||
unsigned long irq_flags;
|
||||
struct mtd_partition *parts;
|
||||
};
|
||||
|
||||
static void switch_to_flash(struct async_state *state)
|
||||
@@ -165,18 +164,8 @@ static int __devinit bfin_flash_probe(struct platform_device *pdev)
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
ret = parse_mtd_partitions(state->mtd, part_probe_types, &pdata->parts, 0);
|
||||
if (ret > 0) {
|
||||
pr_devinit(KERN_NOTICE DRIVER_NAME ": Using commandline partition definition\n");
|
||||
mtd_device_register(state->mtd, pdata->parts, ret);
|
||||
state->parts = pdata->parts;
|
||||
} else if (pdata->nr_parts) {
|
||||
pr_devinit(KERN_NOTICE DRIVER_NAME ": Using board partition definition\n");
|
||||
mtd_device_register(state->mtd, pdata->parts, pdata->nr_parts);
|
||||
} else {
|
||||
pr_devinit(KERN_NOTICE DRIVER_NAME ": no partition info available, registering whole flash at once\n");
|
||||
mtd_device_register(state->mtd, NULL, 0);
|
||||
}
|
||||
mtd_device_parse_register(state->mtd, part_probe_types, 0,
|
||||
pdata->parts, pdata->nr_parts);
|
||||
|
||||
platform_set_drvdata(pdev, state);
|
||||
|
||||
@@ -188,7 +177,6 @@ static int __devexit bfin_flash_remove(struct platform_device *pdev)
|
||||
struct async_state *state = platform_get_drvdata(pdev);
|
||||
gpio_free(state->enet_flash_pin);
|
||||
mtd_device_unregister(state->mtd);
|
||||
kfree(state->parts);
|
||||
map_destroy(state->mtd);
|
||||
kfree(state);
|
||||
return 0;
|
||||
|
@@ -1,341 +0,0 @@
|
||||
/*
|
||||
* Ceiva flash memory driver.
|
||||
* Copyright (C) 2002 Rob Scott <rscott@mtrob.fdns.net>
|
||||
*
|
||||
* Note: this driver supports jedec compatible devices. Modification
|
||||
* for CFI compatible devices should be straight forward: change
|
||||
* jedec_probe to cfi_probe.
|
||||
*
|
||||
* Based on: sa1100-flash.c, which has the following copyright:
|
||||
* Flash memory access on SA11x0 based devices
|
||||
*
|
||||
* (C) 2000 Nicolas Pitre <nico@fluxnic.net>
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/map.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/mtd/concat.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/sizes.h>
|
||||
|
||||
/*
|
||||
* This isn't complete yet, so...
|
||||
*/
|
||||
#define CONFIG_MTD_CEIVA_STATICMAP
|
||||
|
||||
#ifdef CONFIG_MTD_CEIVA_STATICMAP
|
||||
/*
|
||||
* See include/linux/mtd/partitions.h for definition of the mtd_partition
|
||||
* structure.
|
||||
*
|
||||
* Please note:
|
||||
* 1. The flash size given should be the largest flash size that can
|
||||
* be accommodated.
|
||||
*
|
||||
* 2. The bus width must defined in clps_setup_flash.
|
||||
*
|
||||
* The MTD layer will detect flash chip aliasing and reduce the size of
|
||||
* the map accordingly.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef CONFIG_ARCH_CEIVA
|
||||
/* Flash / Partition sizing */
|
||||
/* For the 28F8003, we use the block mapping to calcuate the sizes */
|
||||
#define MAX_SIZE_KiB (16 + 8 + 8 + 96 + (7*128))
|
||||
#define BOOT_PARTITION_SIZE_KiB (16)
|
||||
#define PARAMS_PARTITION_SIZE_KiB (8)
|
||||
#define KERNEL_PARTITION_SIZE_KiB (4*128)
|
||||
/* Use both remaining portion of first flash, and all of second flash */
|
||||
#define ROOT_PARTITION_SIZE_KiB (3*128) + (8*128)
|
||||
|
||||
static struct mtd_partition ceiva_partitions[] = {
|
||||
{
|
||||
.name = "Ceiva BOOT partition",
|
||||
.size = BOOT_PARTITION_SIZE_KiB*1024,
|
||||
.offset = 0,
|
||||
|
||||
},{
|
||||
.name = "Ceiva parameters partition",
|
||||
.size = PARAMS_PARTITION_SIZE_KiB*1024,
|
||||
.offset = (16 + 8) * 1024,
|
||||
},{
|
||||
.name = "Ceiva kernel partition",
|
||||
.size = (KERNEL_PARTITION_SIZE_KiB)*1024,
|
||||
.offset = 0x20000,
|
||||
|
||||
},{
|
||||
.name = "Ceiva root filesystem partition",
|
||||
.offset = MTDPART_OFS_APPEND,
|
||||
.size = (ROOT_PARTITION_SIZE_KiB)*1024,
|
||||
}
|
||||
};
|
||||
#endif
|
||||
|
||||
static int __init clps_static_partitions(struct mtd_partition **parts)
|
||||
{
|
||||
int nb_parts = 0;
|
||||
|
||||
#ifdef CONFIG_ARCH_CEIVA
|
||||
if (machine_is_ceiva()) {
|
||||
*parts = ceiva_partitions;
|
||||
nb_parts = ARRAY_SIZE(ceiva_partitions);
|
||||
}
|
||||
#endif
|
||||
return nb_parts;
|
||||
}
|
||||
#endif
|
||||
|
||||
struct clps_info {
|
||||
unsigned long base;
|
||||
unsigned long size;
|
||||
int width;
|
||||
void *vbase;
|
||||
struct map_info *map;
|
||||
struct mtd_info *mtd;
|
||||
struct resource *res;
|
||||
};
|
||||
|
||||
#define NR_SUBMTD 4
|
||||
|
||||
static struct clps_info info[NR_SUBMTD];
|
||||
|
||||
static int __init clps_setup_mtd(struct clps_info *clps, int nr, struct mtd_info **rmtd)
|
||||
{
|
||||
struct mtd_info *subdev[nr];
|
||||
struct map_info *maps;
|
||||
int i, found = 0, ret = 0;
|
||||
|
||||
/*
|
||||
* Allocate the map_info structs in one go.
|
||||
*/
|
||||
maps = kzalloc(sizeof(struct map_info) * nr, GFP_KERNEL);
|
||||
if (!maps)
|
||||
return -ENOMEM;
|
||||
/*
|
||||
* Claim and then map the memory regions.
|
||||
*/
|
||||
for (i = 0; i < nr; i++) {
|
||||
if (clps[i].base == (unsigned long)-1)
|
||||
break;
|
||||
|
||||
clps[i].res = request_mem_region(clps[i].base, clps[i].size, "clps flash");
|
||||
if (!clps[i].res) {
|
||||
ret = -EBUSY;
|
||||
break;
|
||||
}
|
||||
|
||||
clps[i].map = maps + i;
|
||||
|
||||
clps[i].map->name = "clps flash";
|
||||
clps[i].map->phys = clps[i].base;
|
||||
|
||||
clps[i].vbase = ioremap(clps[i].base, clps[i].size);
|
||||
if (!clps[i].vbase) {
|
||||
ret = -ENOMEM;
|
||||
break;
|
||||
}
|
||||
|
||||
clps[i].map->virt = (void __iomem *)clps[i].vbase;
|
||||
clps[i].map->bankwidth = clps[i].width;
|
||||
clps[i].map->size = clps[i].size;
|
||||
|
||||
simple_map_init(&clps[i].map);
|
||||
|
||||
clps[i].mtd = do_map_probe("jedec_probe", clps[i].map);
|
||||
if (clps[i].mtd == NULL) {
|
||||
ret = -ENXIO;
|
||||
break;
|
||||
}
|
||||
clps[i].mtd->owner = THIS_MODULE;
|
||||
subdev[i] = clps[i].mtd;
|
||||
|
||||
printk(KERN_INFO "clps flash: JEDEC device at 0x%08lx, %dMiB, "
|
||||
"%d-bit\n", clps[i].base, clps[i].mtd->size >> 20,
|
||||
clps[i].width * 8);
|
||||
found += 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* ENXIO is special. It means we didn't find a chip when
|
||||
* we probed. We need to tear down the mapping, free the
|
||||
* resource and mark it as such.
|
||||
*/
|
||||
if (ret == -ENXIO) {
|
||||
iounmap(clps[i].vbase);
|
||||
clps[i].vbase = NULL;
|
||||
release_resource(clps[i].res);
|
||||
clps[i].res = NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* If we found one device, don't bother with concat support.
|
||||
* If we found multiple devices, use concat if we have it
|
||||
* available, otherwise fail.
|
||||
*/
|
||||
if (ret == 0 || ret == -ENXIO) {
|
||||
if (found == 1) {
|
||||
*rmtd = subdev[0];
|
||||
ret = 0;
|
||||
} else if (found > 1) {
|
||||
/*
|
||||
* We detected multiple devices. Concatenate
|
||||
* them together.
|
||||
*/
|
||||
*rmtd = mtd_concat_create(subdev, found,
|
||||
"clps flash");
|
||||
if (*rmtd == NULL)
|
||||
ret = -ENXIO;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* If we failed, clean up.
|
||||
*/
|
||||
if (ret) {
|
||||
do {
|
||||
if (clps[i].mtd)
|
||||
map_destroy(clps[i].mtd);
|
||||
if (clps[i].vbase)
|
||||
iounmap(clps[i].vbase);
|
||||
if (clps[i].res)
|
||||
release_resource(clps[i].res);
|
||||
} while (i--);
|
||||
|
||||
kfree(maps);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void __exit clps_destroy_mtd(struct clps_info *clps, struct mtd_info *mtd)
|
||||
{
|
||||
int i;
|
||||
|
||||
mtd_device_unregister(mtd);
|
||||
|
||||
if (mtd != clps[0].mtd)
|
||||
mtd_concat_destroy(mtd);
|
||||
|
||||
for (i = NR_SUBMTD; i >= 0; i--) {
|
||||
if (clps[i].mtd)
|
||||
map_destroy(clps[i].mtd);
|
||||
if (clps[i].vbase)
|
||||
iounmap(clps[i].vbase);
|
||||
if (clps[i].res)
|
||||
release_resource(clps[i].res);
|
||||
}
|
||||
kfree(clps[0].map);
|
||||
}
|
||||
|
||||
/*
|
||||
* We define the memory space, size, and width for the flash memory
|
||||
* space here.
|
||||
*/
|
||||
|
||||
static int __init clps_setup_flash(void)
|
||||
{
|
||||
int nr = 0;
|
||||
|
||||
#ifdef CONFIG_ARCH_CEIVA
|
||||
if (machine_is_ceiva()) {
|
||||
info[0].base = CS0_PHYS_BASE;
|
||||
info[0].size = SZ_32M;
|
||||
info[0].width = CEIVA_FLASH_WIDTH;
|
||||
info[1].base = CS1_PHYS_BASE;
|
||||
info[1].size = SZ_32M;
|
||||
info[1].width = CEIVA_FLASH_WIDTH;
|
||||
nr = 2;
|
||||
}
|
||||
#endif
|
||||
return nr;
|
||||
}
|
||||
|
||||
static struct mtd_partition *parsed_parts;
|
||||
static const char *probes[] = { "cmdlinepart", "RedBoot", NULL };
|
||||
|
||||
static void __init clps_locate_partitions(struct mtd_info *mtd)
|
||||
{
|
||||
const char *part_type = NULL;
|
||||
int nr_parts = 0;
|
||||
do {
|
||||
/*
|
||||
* Partition selection stuff.
|
||||
*/
|
||||
nr_parts = parse_mtd_partitions(mtd, probes, &parsed_parts, 0);
|
||||
if (nr_parts > 0) {
|
||||
part_type = "command line";
|
||||
break;
|
||||
}
|
||||
#ifdef CONFIG_MTD_CEIVA_STATICMAP
|
||||
nr_parts = clps_static_partitions(&parsed_parts);
|
||||
if (nr_parts > 0) {
|
||||
part_type = "static";
|
||||
break;
|
||||
}
|
||||
printk("found: %d partitions\n", nr_parts);
|
||||
#endif
|
||||
} while (0);
|
||||
|
||||
if (nr_parts == 0) {
|
||||
printk(KERN_NOTICE "clps flash: no partition info "
|
||||
"available, registering whole flash\n");
|
||||
mtd_device_register(mtd, NULL, 0);
|
||||
} else {
|
||||
printk(KERN_NOTICE "clps flash: using %s partition "
|
||||
"definition\n", part_type);
|
||||
mtd_device_register(mtd, parsed_parts, nr_parts);
|
||||
}
|
||||
|
||||
/* Always succeeds. */
|
||||
}
|
||||
|
||||
static void __exit clps_destroy_partitions(void)
|
||||
{
|
||||
kfree(parsed_parts);
|
||||
}
|
||||
|
||||
static struct mtd_info *mymtd;
|
||||
|
||||
static int __init clps_mtd_init(void)
|
||||
{
|
||||
int ret;
|
||||
int nr;
|
||||
|
||||
nr = clps_setup_flash();
|
||||
if (nr < 0)
|
||||
return nr;
|
||||
|
||||
ret = clps_setup_mtd(info, nr, &mymtd);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
clps_locate_partitions(mymtd);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __exit clps_mtd_cleanup(void)
|
||||
{
|
||||
clps_destroy_mtd(info, mymtd);
|
||||
clps_destroy_partitions();
|
||||
}
|
||||
|
||||
module_init(clps_mtd_init);
|
||||
module_exit(clps_mtd_cleanup);
|
||||
|
||||
MODULE_AUTHOR("Rob Scott");
|
||||
MODULE_DESCRIPTION("Cirrus Logic JEDEC map driver");
|
||||
MODULE_LICENSE("GPL");
|
@@ -145,14 +145,10 @@ static struct map_info dc21285_map = {
|
||||
|
||||
|
||||
/* Partition stuff */
|
||||
static struct mtd_partition *dc21285_parts;
|
||||
static const char *probes[] = { "RedBoot", "cmdlinepart", NULL };
|
||||
|
||||
static int __init init_dc21285(void)
|
||||
{
|
||||
|
||||
int nrparts;
|
||||
|
||||
/* Determine bankwidth */
|
||||
switch (*CSR_SA110_CNTL & (3<<14)) {
|
||||
case SA110_CNTL_ROMWIDTH_8:
|
||||
@@ -200,8 +196,7 @@ static int __init init_dc21285(void)
|
||||
|
||||
dc21285_mtd->owner = THIS_MODULE;
|
||||
|
||||
nrparts = parse_mtd_partitions(dc21285_mtd, probes, &dc21285_parts, 0);
|
||||
mtd_device_register(dc21285_mtd, dc21285_parts, nrparts);
|
||||
mtd_device_parse_register(dc21285_mtd, probes, 0, NULL, 0);
|
||||
|
||||
if(machine_is_ebsa285()) {
|
||||
/*
|
||||
@@ -224,8 +219,6 @@ static int __init init_dc21285(void)
|
||||
static void __exit cleanup_dc21285(void)
|
||||
{
|
||||
mtd_device_unregister(dc21285_mtd);
|
||||
if (dc21285_parts)
|
||||
kfree(dc21285_parts);
|
||||
map_destroy(dc21285_mtd);
|
||||
iounmap(dc21285_map.virt);
|
||||
}
|
||||
|
@@ -1,134 +0,0 @@
|
||||
/*
|
||||
* Handle mapping of the NOR flash on Cogent EDB7312 boards
|
||||
*
|
||||
* Copyright 2002 SYSGO Real-Time Solutions GmbH
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <asm/io.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/map.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
|
||||
#define WINDOW_ADDR 0x00000000 /* physical properties of flash */
|
||||
#define WINDOW_SIZE 0x01000000
|
||||
#define BUSWIDTH 2
|
||||
#define FLASH_BLOCKSIZE_MAIN 0x20000
|
||||
#define FLASH_NUMBLOCKS_MAIN 128
|
||||
/* can be "cfi_probe", "jedec_probe", "map_rom", NULL }; */
|
||||
#define PROBETYPES { "cfi_probe", NULL }
|
||||
|
||||
#define MSG_PREFIX "EDB7312-NOR:" /* prefix for our printk()'s */
|
||||
#define MTDID "edb7312-nor" /* for mtdparts= partitioning */
|
||||
|
||||
static struct mtd_info *mymtd;
|
||||
|
||||
struct map_info edb7312nor_map = {
|
||||
.name = "NOR flash on EDB7312",
|
||||
.size = WINDOW_SIZE,
|
||||
.bankwidth = BUSWIDTH,
|
||||
.phys = WINDOW_ADDR,
|
||||
};
|
||||
|
||||
/*
|
||||
* MTD partitioning stuff
|
||||
*/
|
||||
static struct mtd_partition static_partitions[3] =
|
||||
{
|
||||
{
|
||||
.name = "ARMboot",
|
||||
.size = 0x40000,
|
||||
.offset = 0
|
||||
},
|
||||
{
|
||||
.name = "Kernel",
|
||||
.size = 0x200000,
|
||||
.offset = 0x40000
|
||||
},
|
||||
{
|
||||
.name = "RootFS",
|
||||
.size = 0xDC0000,
|
||||
.offset = 0x240000
|
||||
},
|
||||
};
|
||||
|
||||
static const char *probes[] = { "RedBoot", "cmdlinepart", NULL };
|
||||
|
||||
static int mtd_parts_nb = 0;
|
||||
static struct mtd_partition *mtd_parts = 0;
|
||||
|
||||
static int __init init_edb7312nor(void)
|
||||
{
|
||||
static const char *rom_probe_types[] = PROBETYPES;
|
||||
const char **type;
|
||||
const char *part_type = 0;
|
||||
|
||||
printk(KERN_NOTICE MSG_PREFIX "0x%08x at 0x%08x\n",
|
||||
WINDOW_SIZE, WINDOW_ADDR);
|
||||
edb7312nor_map.virt = ioremap(WINDOW_ADDR, WINDOW_SIZE);
|
||||
|
||||
if (!edb7312nor_map.virt) {
|
||||
printk(MSG_PREFIX "failed to ioremap\n");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
simple_map_init(&edb7312nor_map);
|
||||
|
||||
mymtd = 0;
|
||||
type = rom_probe_types;
|
||||
for(; !mymtd && *type; type++) {
|
||||
mymtd = do_map_probe(*type, &edb7312nor_map);
|
||||
}
|
||||
if (mymtd) {
|
||||
mymtd->owner = THIS_MODULE;
|
||||
|
||||
mtd_parts_nb = parse_mtd_partitions(mymtd, probes, &mtd_parts, MTDID);
|
||||
if (mtd_parts_nb > 0)
|
||||
part_type = "detected";
|
||||
|
||||
if (mtd_parts_nb == 0) {
|
||||
mtd_parts = static_partitions;
|
||||
mtd_parts_nb = ARRAY_SIZE(static_partitions);
|
||||
part_type = "static";
|
||||
}
|
||||
|
||||
if (mtd_parts_nb == 0)
|
||||
printk(KERN_NOTICE MSG_PREFIX "no partition info available\n");
|
||||
else
|
||||
printk(KERN_NOTICE MSG_PREFIX
|
||||
"using %s partition definition\n", part_type);
|
||||
/* Register the whole device first. */
|
||||
mtd_device_register(mymtd, NULL, 0);
|
||||
mtd_device_register(mymtd, mtd_parts, mtd_parts_nb);
|
||||
return 0;
|
||||
}
|
||||
|
||||
iounmap((void *)edb7312nor_map.virt);
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
static void __exit cleanup_edb7312nor(void)
|
||||
{
|
||||
if (mymtd) {
|
||||
mtd_device_unregister(mymtd);
|
||||
map_destroy(mymtd);
|
||||
}
|
||||
if (edb7312nor_map.virt) {
|
||||
iounmap((void *)edb7312nor_map.virt);
|
||||
edb7312nor_map.virt = 0;
|
||||
}
|
||||
}
|
||||
|
||||
module_init(init_edb7312nor);
|
||||
module_exit(cleanup_edb7312nor);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Marius Groeger <mag@sysgo.de>");
|
||||
MODULE_DESCRIPTION("Generic configurable MTD map driver");
|
@@ -187,7 +187,6 @@ static const char *part_probe_types[] = { "cmdlinepart", "RedBoot", NULL };
|
||||
*/
|
||||
static int __devinit gpio_flash_probe(struct platform_device *pdev)
|
||||
{
|
||||
int nr_parts;
|
||||
size_t i, arr_size;
|
||||
struct physmap_flash_data *pdata;
|
||||
struct resource *memory;
|
||||
@@ -252,20 +251,9 @@ static int __devinit gpio_flash_probe(struct platform_device *pdev)
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
nr_parts = parse_mtd_partitions(state->mtd, part_probe_types,
|
||||
&pdata->parts, 0);
|
||||
if (nr_parts > 0) {
|
||||
pr_devinit(KERN_NOTICE PFX "Using commandline partition definition\n");
|
||||
kfree(pdata->parts);
|
||||
} else if (pdata->nr_parts) {
|
||||
pr_devinit(KERN_NOTICE PFX "Using board partition definition\n");
|
||||
nr_parts = pdata->nr_parts;
|
||||
} else {
|
||||
pr_devinit(KERN_NOTICE PFX "no partition info available, registering whole flash at once\n");
|
||||
nr_parts = 0;
|
||||
}
|
||||
|
||||
mtd_device_register(state->mtd, pdata->parts, nr_parts);
|
||||
mtd_device_parse_register(state->mtd, part_probe_types, 0,
|
||||
pdata->parts, pdata->nr_parts);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@@ -58,18 +58,11 @@ static struct mtd_partition h720x_partitions[] = {
|
||||
|
||||
#define NUM_PARTITIONS ARRAY_SIZE(h720x_partitions)
|
||||
|
||||
static int nr_mtd_parts;
|
||||
static struct mtd_partition *mtd_parts;
|
||||
static const char *probes[] = { "cmdlinepart", NULL };
|
||||
|
||||
/*
|
||||
* Initialize FLASH support
|
||||
*/
|
||||
static int __init h720x_mtd_init(void)
|
||||
{
|
||||
|
||||
char *part_type = NULL;
|
||||
|
||||
h720x_map.virt = ioremap(h720x_map.phys, h720x_map.size);
|
||||
|
||||
if (!h720x_map.virt) {
|
||||
@@ -92,16 +85,8 @@ static int __init h720x_mtd_init(void)
|
||||
if (mymtd) {
|
||||
mymtd->owner = THIS_MODULE;
|
||||
|
||||
nr_mtd_parts = parse_mtd_partitions(mymtd, probes, &mtd_parts, 0);
|
||||
if (nr_mtd_parts > 0)
|
||||
part_type = "command line";
|
||||
if (nr_mtd_parts <= 0) {
|
||||
mtd_parts = h720x_partitions;
|
||||
nr_mtd_parts = NUM_PARTITIONS;
|
||||
part_type = "builtin";
|
||||
}
|
||||
printk(KERN_INFO "Using %s partition table\n", part_type);
|
||||
mtd_device_register(mymtd, mtd_parts, nr_mtd_parts);
|
||||
mtd_device_parse_register(mymtd, NULL, 0,
|
||||
h720x_partitions, NUM_PARTITIONS);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -120,10 +105,6 @@ static void __exit h720x_mtd_cleanup(void)
|
||||
map_destroy(mymtd);
|
||||
}
|
||||
|
||||
/* Free partition info, if commandline partition was used */
|
||||
if (mtd_parts && (mtd_parts != h720x_partitions))
|
||||
kfree (mtd_parts);
|
||||
|
||||
if (h720x_map.virt) {
|
||||
iounmap((void *)h720x_map.virt);
|
||||
h720x_map.virt = 0;
|
||||
|
@@ -49,7 +49,7 @@ static struct map_info impa7_map[NUM_FLASHBANKS] = {
|
||||
/*
|
||||
* MTD partitioning stuff
|
||||
*/
|
||||
static struct mtd_partition static_partitions[] =
|
||||
static struct mtd_partition partitions[] =
|
||||
{
|
||||
{
|
||||
.name = "FileSystem",
|
||||
@@ -58,16 +58,10 @@ static struct mtd_partition static_partitions[] =
|
||||
},
|
||||
};
|
||||
|
||||
static int mtd_parts_nb[NUM_FLASHBANKS];
|
||||
static struct mtd_partition *mtd_parts[NUM_FLASHBANKS];
|
||||
|
||||
static const char *probes[] = { "cmdlinepart", NULL };
|
||||
|
||||
static int __init init_impa7(void)
|
||||
{
|
||||
static const char *rom_probe_types[] = PROBETYPES;
|
||||
const char **type;
|
||||
const char *part_type = 0;
|
||||
int i;
|
||||
static struct { u_long addr; u_long size; } pt[NUM_FLASHBANKS] = {
|
||||
{ WINDOW_ADDR0, WINDOW_SIZE0 },
|
||||
@@ -97,23 +91,9 @@ static int __init init_impa7(void)
|
||||
if (impa7_mtd[i]) {
|
||||
impa7_mtd[i]->owner = THIS_MODULE;
|
||||
devicesfound++;
|
||||
mtd_parts_nb[i] = parse_mtd_partitions(impa7_mtd[i],
|
||||
probes,
|
||||
&mtd_parts[i],
|
||||
0);
|
||||
if (mtd_parts_nb[i] > 0) {
|
||||
part_type = "command line";
|
||||
} else {
|
||||
mtd_parts[i] = static_partitions;
|
||||
mtd_parts_nb[i] = ARRAY_SIZE(static_partitions);
|
||||
part_type = "static";
|
||||
}
|
||||
|
||||
printk(KERN_NOTICE MSG_PREFIX
|
||||
"using %s partition definition\n",
|
||||
part_type);
|
||||
mtd_device_register(impa7_mtd[i],
|
||||
mtd_parts[i], mtd_parts_nb[i]);
|
||||
mtd_device_parse_register(impa7_mtd[i], NULL, 0,
|
||||
partitions,
|
||||
ARRAY_SIZE(partitions));
|
||||
}
|
||||
else
|
||||
iounmap((void *)impa7_map[i].virt);
|
||||
|
@@ -44,7 +44,6 @@ struct vr_nor_mtd {
|
||||
void __iomem *csr_base;
|
||||
struct map_info map;
|
||||
struct mtd_info *info;
|
||||
int nr_parts;
|
||||
struct pci_dev *dev;
|
||||
};
|
||||
|
||||
@@ -71,13 +70,9 @@ static void __devexit vr_nor_destroy_partitions(struct vr_nor_mtd *p)
|
||||
|
||||
static int __devinit vr_nor_init_partitions(struct vr_nor_mtd *p)
|
||||
{
|
||||
struct mtd_partition *parts;
|
||||
static const char *part_probes[] = { "cmdlinepart", NULL };
|
||||
|
||||
/* register the flash bank */
|
||||
/* partition the flash bank */
|
||||
p->nr_parts = parse_mtd_partitions(p->info, part_probes, &parts, 0);
|
||||
return mtd_device_register(p->info, parts, p->nr_parts);
|
||||
return mtd_device_parse_register(p->info, NULL, 0, NULL, 0);
|
||||
}
|
||||
|
||||
static void __devexit vr_nor_destroy_mtd_setup(struct vr_nor_mtd *p)
|
||||
|
@@ -38,7 +38,6 @@
|
||||
struct ixp2000_flash_info {
|
||||
struct mtd_info *mtd;
|
||||
struct map_info map;
|
||||
struct mtd_partition *partitions;
|
||||
struct resource *res;
|
||||
};
|
||||
|
||||
@@ -125,8 +124,6 @@ static int ixp2000_flash_remove(struct platform_device *dev)
|
||||
if (info->map.map_priv_1)
|
||||
iounmap((void *) info->map.map_priv_1);
|
||||
|
||||
kfree(info->partitions);
|
||||
|
||||
if (info->res) {
|
||||
release_resource(info->res);
|
||||
kfree(info->res);
|
||||
@@ -229,13 +226,7 @@ static int ixp2000_flash_probe(struct platform_device *dev)
|
||||
}
|
||||
info->mtd->owner = THIS_MODULE;
|
||||
|
||||
err = parse_mtd_partitions(info->mtd, probes, &info->partitions, 0);
|
||||
if (err > 0) {
|
||||
err = mtd_device_register(info->mtd, info->partitions, err);
|
||||
if(err)
|
||||
dev_err(&dev->dev, "Could not parse partitions\n");
|
||||
}
|
||||
|
||||
err = mtd_device_parse_register(info->mtd, probes, 0, NULL, 0);
|
||||
if (err)
|
||||
goto Error;
|
||||
|
||||
|
@@ -145,7 +145,6 @@ static void ixp4xx_write16(struct map_info *map, map_word d, unsigned long adr)
|
||||
struct ixp4xx_flash_info {
|
||||
struct mtd_info *mtd;
|
||||
struct map_info map;
|
||||
struct mtd_partition *partitions;
|
||||
struct resource *res;
|
||||
};
|
||||
|
||||
@@ -168,8 +167,6 @@ static int ixp4xx_flash_remove(struct platform_device *dev)
|
||||
if (info->map.virt)
|
||||
iounmap(info->map.virt);
|
||||
|
||||
kfree(info->partitions);
|
||||
|
||||
if (info->res) {
|
||||
release_resource(info->res);
|
||||
kfree(info->res);
|
||||
@@ -185,8 +182,6 @@ static int ixp4xx_flash_probe(struct platform_device *dev)
|
||||
{
|
||||
struct flash_platform_data *plat = dev->dev.platform_data;
|
||||
struct ixp4xx_flash_info *info;
|
||||
const char *part_type = NULL;
|
||||
int nr_parts = 0;
|
||||
int err = -1;
|
||||
|
||||
if (!plat)
|
||||
@@ -252,28 +247,12 @@ static int ixp4xx_flash_probe(struct platform_device *dev)
|
||||
/* Use the fast version */
|
||||
info->map.write = ixp4xx_write16;
|
||||
|
||||
nr_parts = parse_mtd_partitions(info->mtd, probes, &info->partitions,
|
||||
dev->resource->start);
|
||||
if (nr_parts > 0) {
|
||||
part_type = "dynamic";
|
||||
} else {
|
||||
info->partitions = plat->parts;
|
||||
nr_parts = plat->nr_parts;
|
||||
part_type = "static";
|
||||
}
|
||||
if (nr_parts == 0)
|
||||
printk(KERN_NOTICE "IXP4xx flash: no partition info "
|
||||
"available, registering whole flash\n");
|
||||
else
|
||||
printk(KERN_NOTICE "IXP4xx flash: using %s partition "
|
||||
"definition\n", part_type);
|
||||
|
||||
err = mtd_device_register(info->mtd, info->partitions, nr_parts);
|
||||
if (err)
|
||||
err = mtd_device_parse_register(info->mtd, probes, dev->resource->start,
|
||||
plat->parts, plat->nr_parts);
|
||||
if (err) {
|
||||
printk(KERN_ERR "Could not parse partitions\n");
|
||||
|
||||
if (err)
|
||||
goto Error;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
|
@@ -107,16 +107,12 @@ ltq_copy_to(struct map_info *map, unsigned long to,
|
||||
spin_unlock_irqrestore(&ebu_lock, flags);
|
||||
}
|
||||
|
||||
static const char const *part_probe_types[] = { "cmdlinepart", NULL };
|
||||
|
||||
static int __init
|
||||
ltq_mtd_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct physmap_flash_data *ltq_mtd_data = dev_get_platdata(&pdev->dev);
|
||||
struct ltq_mtd *ltq_mtd;
|
||||
struct mtd_partition *parts;
|
||||
struct resource *res;
|
||||
int nr_parts = 0;
|
||||
struct cfi_private *cfi;
|
||||
int err;
|
||||
|
||||
@@ -172,17 +168,8 @@ ltq_mtd_probe(struct platform_device *pdev)
|
||||
cfi->addr_unlock1 ^= 1;
|
||||
cfi->addr_unlock2 ^= 1;
|
||||
|
||||
nr_parts = parse_mtd_partitions(ltq_mtd->mtd,
|
||||
part_probe_types, &parts, 0);
|
||||
if (nr_parts > 0) {
|
||||
dev_info(&pdev->dev,
|
||||
"using %d partitions from cmdline", nr_parts);
|
||||
} else {
|
||||
nr_parts = ltq_mtd_data->nr_parts;
|
||||
parts = ltq_mtd_data->parts;
|
||||
}
|
||||
|
||||
err = mtd_device_register(ltq_mtd->mtd, parts, nr_parts);
|
||||
err = mtd_device_parse_register(ltq_mtd->mtd, NULL, 0,
|
||||
ltq_mtd_data->parts, ltq_mtd_data->nr_parts);
|
||||
if (err) {
|
||||
dev_err(&pdev->dev, "failed to add partitions\n");
|
||||
goto err_destroy;
|
||||
|
@@ -33,9 +33,6 @@ struct latch_addr_flash_info {
|
||||
/* cache; could be found out of res */
|
||||
unsigned long win_mask;
|
||||
|
||||
int nr_parts;
|
||||
struct mtd_partition *parts;
|
||||
|
||||
spinlock_t lock;
|
||||
};
|
||||
|
||||
@@ -97,8 +94,6 @@ static void lf_copy_from(struct map_info *map, void *to,
|
||||
|
||||
static char *rom_probe_types[] = { "cfi_probe", NULL };
|
||||
|
||||
static char *part_probe_types[] = { "cmdlinepart", NULL };
|
||||
|
||||
static int latch_addr_flash_remove(struct platform_device *dev)
|
||||
{
|
||||
struct latch_addr_flash_info *info;
|
||||
@@ -112,8 +107,6 @@ static int latch_addr_flash_remove(struct platform_device *dev)
|
||||
latch_addr_data = dev->dev.platform_data;
|
||||
|
||||
if (info->mtd != NULL) {
|
||||
if (info->nr_parts)
|
||||
kfree(info->parts);
|
||||
mtd_device_unregister(info->mtd);
|
||||
map_destroy(info->mtd);
|
||||
}
|
||||
@@ -206,21 +199,8 @@ static int __devinit latch_addr_flash_probe(struct platform_device *dev)
|
||||
}
|
||||
info->mtd->owner = THIS_MODULE;
|
||||
|
||||
err = parse_mtd_partitions(info->mtd, (const char **)part_probe_types,
|
||||
&info->parts, 0);
|
||||
if (err > 0) {
|
||||
mtd_device_register(info->mtd, info->parts, err);
|
||||
return 0;
|
||||
}
|
||||
if (latch_addr_data->nr_parts) {
|
||||
pr_notice("Using latch-addr-flash partition information\n");
|
||||
mtd_device_register(info->mtd,
|
||||
latch_addr_data->parts,
|
||||
latch_addr_data->nr_parts);
|
||||
return 0;
|
||||
}
|
||||
|
||||
mtd_device_register(info->mtd, NULL, 0);
|
||||
mtd_device_parse_register(info->mtd, NULL, 0,
|
||||
latch_addr_data->parts, latch_addr_data->nr_parts);
|
||||
return 0;
|
||||
|
||||
iounmap:
|
||||
|
@@ -22,22 +22,6 @@
|
||||
#include <linux/mtd/map.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
|
||||
#ifdef CONFIG_MTD_DEBUG
|
||||
static int debug = CONFIG_MTD_DEBUG_VERBOSE;
|
||||
module_param(debug, int, 0);
|
||||
MODULE_PARM_DESC(debug, "Set Debug Level 0=quiet, 5=noisy");
|
||||
#undef DEBUG
|
||||
#define DEBUG(n, format, arg...) \
|
||||
if (n <= debug) { \
|
||||
printk(KERN_DEBUG __FILE__ ":%s(): " format "\n", __func__ , ## arg); \
|
||||
}
|
||||
|
||||
#else
|
||||
#undef DEBUG
|
||||
#define DEBUG(n, arg...)
|
||||
static const int debug = 0;
|
||||
#endif
|
||||
|
||||
#define info(format, arg...) printk(KERN_INFO "pcmciamtd: " format "\n" , ## arg)
|
||||
|
||||
#define DRIVER_DESC "PCMCIA Flash memory card driver"
|
||||
@@ -105,13 +89,13 @@ static caddr_t remap_window(struct map_info *map, unsigned long to)
|
||||
int ret;
|
||||
|
||||
if (!pcmcia_dev_present(dev->p_dev)) {
|
||||
DEBUG(1, "device removed");
|
||||
pr_debug("device removed\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
offset = to & ~(dev->win_size-1);
|
||||
if (offset != dev->offset) {
|
||||
DEBUG(2, "Remapping window from 0x%8.8x to 0x%8.8x",
|
||||
pr_debug("Remapping window from 0x%8.8x to 0x%8.8x\n",
|
||||
dev->offset, offset);
|
||||
ret = pcmcia_map_mem_page(dev->p_dev, win, offset);
|
||||
if (ret != 0)
|
||||
@@ -132,7 +116,7 @@ static map_word pcmcia_read8_remap(struct map_info *map, unsigned long ofs)
|
||||
return d;
|
||||
|
||||
d.x[0] = readb(addr);
|
||||
DEBUG(3, "ofs = 0x%08lx (%p) data = 0x%02lx", ofs, addr, d.x[0]);
|
||||
pr_debug("ofs = 0x%08lx (%p) data = 0x%02lx\n", ofs, addr, d.x[0]);
|
||||
return d;
|
||||
}
|
||||
|
||||
@@ -147,7 +131,7 @@ static map_word pcmcia_read16_remap(struct map_info *map, unsigned long ofs)
|
||||
return d;
|
||||
|
||||
d.x[0] = readw(addr);
|
||||
DEBUG(3, "ofs = 0x%08lx (%p) data = 0x%04lx", ofs, addr, d.x[0]);
|
||||
pr_debug("ofs = 0x%08lx (%p) data = 0x%04lx\n", ofs, addr, d.x[0]);
|
||||
return d;
|
||||
}
|
||||
|
||||
@@ -157,7 +141,7 @@ static void pcmcia_copy_from_remap(struct map_info *map, void *to, unsigned long
|
||||
struct pcmciamtd_dev *dev = (struct pcmciamtd_dev *)map->map_priv_1;
|
||||
unsigned long win_size = dev->win_size;
|
||||
|
||||
DEBUG(3, "to = %p from = %lu len = %zd", to, from, len);
|
||||
pr_debug("to = %p from = %lu len = %zd\n", to, from, len);
|
||||
while(len) {
|
||||
int toread = win_size - (from & (win_size-1));
|
||||
caddr_t addr;
|
||||
@@ -169,7 +153,7 @@ static void pcmcia_copy_from_remap(struct map_info *map, void *to, unsigned long
|
||||
if(!addr)
|
||||
return;
|
||||
|
||||
DEBUG(4, "memcpy from %p to %p len = %d", addr, to, toread);
|
||||
pr_debug("memcpy from %p to %p len = %d\n", addr, to, toread);
|
||||
memcpy_fromio(to, addr, toread);
|
||||
len -= toread;
|
||||
to += toread;
|
||||
@@ -185,7 +169,7 @@ static void pcmcia_write8_remap(struct map_info *map, map_word d, unsigned long
|
||||
if(!addr)
|
||||
return;
|
||||
|
||||
DEBUG(3, "adr = 0x%08lx (%p) data = 0x%02lx", adr, addr, d.x[0]);
|
||||
pr_debug("adr = 0x%08lx (%p) data = 0x%02lx\n", adr, addr, d.x[0]);
|
||||
writeb(d.x[0], addr);
|
||||
}
|
||||
|
||||
@@ -196,7 +180,7 @@ static void pcmcia_write16_remap(struct map_info *map, map_word d, unsigned long
|
||||
if(!addr)
|
||||
return;
|
||||
|
||||
DEBUG(3, "adr = 0x%08lx (%p) data = 0x%04lx", adr, addr, d.x[0]);
|
||||
pr_debug("adr = 0x%08lx (%p) data = 0x%04lx\n", adr, addr, d.x[0]);
|
||||
writew(d.x[0], addr);
|
||||
}
|
||||
|
||||
@@ -206,7 +190,7 @@ static void pcmcia_copy_to_remap(struct map_info *map, unsigned long to, const v
|
||||
struct pcmciamtd_dev *dev = (struct pcmciamtd_dev *)map->map_priv_1;
|
||||
unsigned long win_size = dev->win_size;
|
||||
|
||||
DEBUG(3, "to = %lu from = %p len = %zd", to, from, len);
|
||||
pr_debug("to = %lu from = %p len = %zd\n", to, from, len);
|
||||
while(len) {
|
||||
int towrite = win_size - (to & (win_size-1));
|
||||
caddr_t addr;
|
||||
@@ -218,7 +202,7 @@ static void pcmcia_copy_to_remap(struct map_info *map, unsigned long to, const v
|
||||
if(!addr)
|
||||
return;
|
||||
|
||||
DEBUG(4, "memcpy from %p to %p len = %d", from, addr, towrite);
|
||||
pr_debug("memcpy from %p to %p len = %d\n", from, addr, towrite);
|
||||
memcpy_toio(addr, from, towrite);
|
||||
len -= towrite;
|
||||
to += towrite;
|
||||
@@ -240,7 +224,7 @@ static map_word pcmcia_read8(struct map_info *map, unsigned long ofs)
|
||||
return d;
|
||||
|
||||
d.x[0] = readb(win_base + ofs);
|
||||
DEBUG(3, "ofs = 0x%08lx (%p) data = 0x%02lx",
|
||||
pr_debug("ofs = 0x%08lx (%p) data = 0x%02lx\n",
|
||||
ofs, win_base + ofs, d.x[0]);
|
||||
return d;
|
||||
}
|
||||
@@ -255,7 +239,7 @@ static map_word pcmcia_read16(struct map_info *map, unsigned long ofs)
|
||||
return d;
|
||||
|
||||
d.x[0] = readw(win_base + ofs);
|
||||
DEBUG(3, "ofs = 0x%08lx (%p) data = 0x%04lx",
|
||||
pr_debug("ofs = 0x%08lx (%p) data = 0x%04lx\n",
|
||||
ofs, win_base + ofs, d.x[0]);
|
||||
return d;
|
||||
}
|
||||
@@ -268,7 +252,7 @@ static void pcmcia_copy_from(struct map_info *map, void *to, unsigned long from,
|
||||
if(DEV_REMOVED(map))
|
||||
return;
|
||||
|
||||
DEBUG(3, "to = %p from = %lu len = %zd", to, from, len);
|
||||
pr_debug("to = %p from = %lu len = %zd\n", to, from, len);
|
||||
memcpy_fromio(to, win_base + from, len);
|
||||
}
|
||||
|
||||
@@ -280,7 +264,7 @@ static void pcmcia_write8(struct map_info *map, map_word d, unsigned long adr)
|
||||
if(DEV_REMOVED(map))
|
||||
return;
|
||||
|
||||
DEBUG(3, "adr = 0x%08lx (%p) data = 0x%02lx",
|
||||
pr_debug("adr = 0x%08lx (%p) data = 0x%02lx\n",
|
||||
adr, win_base + adr, d.x[0]);
|
||||
writeb(d.x[0], win_base + adr);
|
||||
}
|
||||
@@ -293,7 +277,7 @@ static void pcmcia_write16(struct map_info *map, map_word d, unsigned long adr)
|
||||
if(DEV_REMOVED(map))
|
||||
return;
|
||||
|
||||
DEBUG(3, "adr = 0x%08lx (%p) data = 0x%04lx",
|
||||
pr_debug("adr = 0x%08lx (%p) data = 0x%04lx\n",
|
||||
adr, win_base + adr, d.x[0]);
|
||||
writew(d.x[0], win_base + adr);
|
||||
}
|
||||
@@ -306,7 +290,7 @@ static void pcmcia_copy_to(struct map_info *map, unsigned long to, const void *f
|
||||
if(DEV_REMOVED(map))
|
||||
return;
|
||||
|
||||
DEBUG(3, "to = %lu from = %p len = %zd", to, from, len);
|
||||
pr_debug("to = %lu from = %p len = %zd\n", to, from, len);
|
||||
memcpy_toio(win_base + to, from, len);
|
||||
}
|
||||
|
||||
@@ -316,7 +300,7 @@ static void pcmciamtd_set_vpp(struct map_info *map, int on)
|
||||
struct pcmciamtd_dev *dev = (struct pcmciamtd_dev *)map->map_priv_1;
|
||||
struct pcmcia_device *link = dev->p_dev;
|
||||
|
||||
DEBUG(2, "dev = %p on = %d vpp = %d\n", dev, on, dev->vpp);
|
||||
pr_debug("dev = %p on = %d vpp = %d\n\n", dev, on, dev->vpp);
|
||||
pcmcia_fixup_vpp(link, on ? dev->vpp : 0);
|
||||
}
|
||||
|
||||
@@ -325,7 +309,7 @@ static void pcmciamtd_release(struct pcmcia_device *link)
|
||||
{
|
||||
struct pcmciamtd_dev *dev = link->priv;
|
||||
|
||||
DEBUG(3, "link = 0x%p", link);
|
||||
pr_debug("link = 0x%p\n", link);
|
||||
|
||||
if (link->resource[2]->end) {
|
||||
if(dev->win_base) {
|
||||
@@ -337,7 +321,6 @@ static void pcmciamtd_release(struct pcmcia_device *link)
|
||||
}
|
||||
|
||||
|
||||
#ifdef CONFIG_MTD_DEBUG
|
||||
static int pcmciamtd_cistpl_format(struct pcmcia_device *p_dev,
|
||||
tuple_t *tuple,
|
||||
void *priv_data)
|
||||
@@ -347,7 +330,7 @@ static int pcmciamtd_cistpl_format(struct pcmcia_device *p_dev,
|
||||
if (!pcmcia_parse_tuple(tuple, &parse)) {
|
||||
cistpl_format_t *t = &parse.format;
|
||||
(void)t; /* Shut up, gcc */
|
||||
DEBUG(2, "Format type: %u, Error Detection: %u, offset = %u, length =%u",
|
||||
pr_debug("Format type: %u, Error Detection: %u, offset = %u, length =%u\n",
|
||||
t->type, t->edc, t->offset, t->length);
|
||||
}
|
||||
return -ENOSPC;
|
||||
@@ -363,12 +346,11 @@ static int pcmciamtd_cistpl_jedec(struct pcmcia_device *p_dev,
|
||||
if (!pcmcia_parse_tuple(tuple, &parse)) {
|
||||
cistpl_jedec_t *t = &parse.jedec;
|
||||
for (i = 0; i < t->nid; i++)
|
||||
DEBUG(2, "JEDEC: 0x%02x 0x%02x",
|
||||
pr_debug("JEDEC: 0x%02x 0x%02x\n",
|
||||
t->id[i].mfr, t->id[i].info);
|
||||
}
|
||||
return -ENOSPC;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int pcmciamtd_cistpl_device(struct pcmcia_device *p_dev,
|
||||
tuple_t *tuple,
|
||||
@@ -382,14 +364,14 @@ static int pcmciamtd_cistpl_device(struct pcmcia_device *p_dev,
|
||||
if (pcmcia_parse_tuple(tuple, &parse))
|
||||
return -EINVAL;
|
||||
|
||||
DEBUG(2, "Common memory:");
|
||||
pr_debug("Common memory:\n");
|
||||
dev->pcmcia_map.size = t->dev[0].size;
|
||||
/* from here on: DEBUG only */
|
||||
for (i = 0; i < t->ndev; i++) {
|
||||
DEBUG(2, "Region %d, type = %u", i, t->dev[i].type);
|
||||
DEBUG(2, "Region %d, wp = %u", i, t->dev[i].wp);
|
||||
DEBUG(2, "Region %d, speed = %u ns", i, t->dev[i].speed);
|
||||
DEBUG(2, "Region %d, size = %u bytes", i, t->dev[i].size);
|
||||
pr_debug("Region %d, type = %u\n", i, t->dev[i].type);
|
||||
pr_debug("Region %d, wp = %u\n", i, t->dev[i].wp);
|
||||
pr_debug("Region %d, speed = %u ns\n", i, t->dev[i].speed);
|
||||
pr_debug("Region %d, size = %u bytes\n", i, t->dev[i].size);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -409,12 +391,12 @@ static int pcmciamtd_cistpl_geo(struct pcmcia_device *p_dev,
|
||||
dev->pcmcia_map.bankwidth = t->geo[0].buswidth;
|
||||
/* from here on: DEBUG only */
|
||||
for (i = 0; i < t->ngeo; i++) {
|
||||
DEBUG(2, "region: %d bankwidth = %u", i, t->geo[i].buswidth);
|
||||
DEBUG(2, "region: %d erase_block = %u", i, t->geo[i].erase_block);
|
||||
DEBUG(2, "region: %d read_block = %u", i, t->geo[i].read_block);
|
||||
DEBUG(2, "region: %d write_block = %u", i, t->geo[i].write_block);
|
||||
DEBUG(2, "region: %d partition = %u", i, t->geo[i].partition);
|
||||
DEBUG(2, "region: %d interleave = %u", i, t->geo[i].interleave);
|
||||
pr_debug("region: %d bankwidth = %u\n", i, t->geo[i].buswidth);
|
||||
pr_debug("region: %d erase_block = %u\n", i, t->geo[i].erase_block);
|
||||
pr_debug("region: %d read_block = %u\n", i, t->geo[i].read_block);
|
||||
pr_debug("region: %d write_block = %u\n", i, t->geo[i].write_block);
|
||||
pr_debug("region: %d partition = %u\n", i, t->geo[i].partition);
|
||||
pr_debug("region: %d interleave = %u\n", i, t->geo[i].interleave);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -432,13 +414,11 @@ static void card_settings(struct pcmciamtd_dev *dev, struct pcmcia_device *p_dev
|
||||
if (p_dev->prod_id[i])
|
||||
strcat(dev->mtd_name, p_dev->prod_id[i]);
|
||||
}
|
||||
DEBUG(2, "Found name: %s", dev->mtd_name);
|
||||
pr_debug("Found name: %s\n", dev->mtd_name);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_MTD_DEBUG
|
||||
pcmcia_loop_tuple(p_dev, CISTPL_FORMAT, pcmciamtd_cistpl_format, NULL);
|
||||
pcmcia_loop_tuple(p_dev, CISTPL_JEDEC_C, pcmciamtd_cistpl_jedec, NULL);
|
||||
#endif
|
||||
pcmcia_loop_tuple(p_dev, CISTPL_DEVICE, pcmciamtd_cistpl_device, dev);
|
||||
pcmcia_loop_tuple(p_dev, CISTPL_DEVICE_GEO, pcmciamtd_cistpl_geo, dev);
|
||||
|
||||
@@ -450,12 +430,12 @@ static void card_settings(struct pcmciamtd_dev *dev, struct pcmcia_device *p_dev
|
||||
|
||||
if(force_size) {
|
||||
dev->pcmcia_map.size = force_size << 20;
|
||||
DEBUG(2, "size forced to %dM", force_size);
|
||||
pr_debug("size forced to %dM\n", force_size);
|
||||
}
|
||||
|
||||
if(bankwidth) {
|
||||
dev->pcmcia_map.bankwidth = bankwidth;
|
||||
DEBUG(2, "bankwidth forced to %d", bankwidth);
|
||||
pr_debug("bankwidth forced to %d\n", bankwidth);
|
||||
}
|
||||
|
||||
dev->pcmcia_map.name = dev->mtd_name;
|
||||
@@ -464,7 +444,7 @@ static void card_settings(struct pcmciamtd_dev *dev, struct pcmcia_device *p_dev
|
||||
*new_name = 1;
|
||||
}
|
||||
|
||||
DEBUG(1, "Device: Size: %lu Width:%d Name: %s",
|
||||
pr_debug("Device: Size: %lu Width:%d Name: %s\n",
|
||||
dev->pcmcia_map.size,
|
||||
dev->pcmcia_map.bankwidth << 3, dev->mtd_name);
|
||||
}
|
||||
@@ -479,7 +459,7 @@ static int pcmciamtd_config(struct pcmcia_device *link)
|
||||
static char *probes[] = { "jedec_probe", "cfi_probe" };
|
||||
int new_name = 0;
|
||||
|
||||
DEBUG(3, "link=0x%p", link);
|
||||
pr_debug("link=0x%p\n", link);
|
||||
|
||||
card_settings(dev, link, &new_name);
|
||||
|
||||
@@ -512,11 +492,11 @@ static int pcmciamtd_config(struct pcmcia_device *link)
|
||||
|
||||
do {
|
||||
int ret;
|
||||
DEBUG(2, "requesting window with size = %luKiB memspeed = %d",
|
||||
pr_debug("requesting window with size = %luKiB memspeed = %d\n",
|
||||
(unsigned long) resource_size(link->resource[2]) >> 10,
|
||||
mem_speed);
|
||||
ret = pcmcia_request_window(link, link->resource[2], mem_speed);
|
||||
DEBUG(2, "ret = %d dev->win_size = %d", ret, dev->win_size);
|
||||
pr_debug("ret = %d dev->win_size = %d\n", ret, dev->win_size);
|
||||
if(ret) {
|
||||
j++;
|
||||
link->resource[2]->start = 0;
|
||||
@@ -524,21 +504,21 @@ static int pcmciamtd_config(struct pcmcia_device *link)
|
||||
force_size << 20 : MAX_PCMCIA_ADDR;
|
||||
link->resource[2]->end >>= j;
|
||||
} else {
|
||||
DEBUG(2, "Got window of size %luKiB", (unsigned long)
|
||||
pr_debug("Got window of size %luKiB\n", (unsigned long)
|
||||
resource_size(link->resource[2]) >> 10);
|
||||
dev->win_size = resource_size(link->resource[2]);
|
||||
break;
|
||||
}
|
||||
} while (link->resource[2]->end >= 0x1000);
|
||||
|
||||
DEBUG(2, "dev->win_size = %d", dev->win_size);
|
||||
pr_debug("dev->win_size = %d\n", dev->win_size);
|
||||
|
||||
if(!dev->win_size) {
|
||||
dev_err(&dev->p_dev->dev, "Cannot allocate memory window\n");
|
||||
pcmciamtd_release(link);
|
||||
return -ENODEV;
|
||||
}
|
||||
DEBUG(1, "Allocated a window of %dKiB", dev->win_size >> 10);
|
||||
pr_debug("Allocated a window of %dKiB\n", dev->win_size >> 10);
|
||||
|
||||
/* Get write protect status */
|
||||
dev->win_base = ioremap(link->resource[2]->start,
|
||||
@@ -549,7 +529,7 @@ static int pcmciamtd_config(struct pcmcia_device *link)
|
||||
pcmciamtd_release(link);
|
||||
return -ENODEV;
|
||||
}
|
||||
DEBUG(1, "mapped window dev = %p @ %pR, base = %p",
|
||||
pr_debug("mapped window dev = %p @ %pR, base = %p\n",
|
||||
dev, link->resource[2], dev->win_base);
|
||||
|
||||
dev->offset = 0;
|
||||
@@ -564,7 +544,7 @@ static int pcmciamtd_config(struct pcmcia_device *link)
|
||||
}
|
||||
|
||||
link->config_index = 0;
|
||||
DEBUG(2, "Setting Configuration");
|
||||
pr_debug("Setting Configuration\n");
|
||||
ret = pcmcia_enable_device(link);
|
||||
if (ret != 0) {
|
||||
if (dev->win_base) {
|
||||
@@ -580,17 +560,17 @@ static int pcmciamtd_config(struct pcmcia_device *link)
|
||||
mtd = do_map_probe("map_rom", &dev->pcmcia_map);
|
||||
} else {
|
||||
for(i = 0; i < ARRAY_SIZE(probes); i++) {
|
||||
DEBUG(1, "Trying %s", probes[i]);
|
||||
pr_debug("Trying %s\n", probes[i]);
|
||||
mtd = do_map_probe(probes[i], &dev->pcmcia_map);
|
||||
if(mtd)
|
||||
break;
|
||||
|
||||
DEBUG(1, "FAILED: %s", probes[i]);
|
||||
pr_debug("FAILED: %s\n", probes[i]);
|
||||
}
|
||||
}
|
||||
|
||||
if(!mtd) {
|
||||
DEBUG(1, "Can not find an MTD");
|
||||
pr_debug("Can not find an MTD\n");
|
||||
pcmciamtd_release(link);
|
||||
return -ENODEV;
|
||||
}
|
||||
@@ -617,7 +597,7 @@ static int pcmciamtd_config(struct pcmcia_device *link)
|
||||
/* If the memory found is fits completely into the mapped PCMCIA window,
|
||||
use the faster non-remapping read/write functions */
|
||||
if(mtd->size <= dev->win_size) {
|
||||
DEBUG(1, "Using non remapping memory functions");
|
||||
pr_debug("Using non remapping memory functions\n");
|
||||
dev->pcmcia_map.map_priv_2 = (unsigned long)dev->win_base;
|
||||
if (dev->pcmcia_map.bankwidth == 1) {
|
||||
dev->pcmcia_map.read = pcmcia_read8;
|
||||
@@ -645,7 +625,7 @@ static int pcmciamtd_config(struct pcmcia_device *link)
|
||||
|
||||
static int pcmciamtd_suspend(struct pcmcia_device *dev)
|
||||
{
|
||||
DEBUG(2, "EVENT_PM_RESUME");
|
||||
pr_debug("EVENT_PM_RESUME\n");
|
||||
|
||||
/* get_lock(link); */
|
||||
|
||||
@@ -654,7 +634,7 @@ static int pcmciamtd_suspend(struct pcmcia_device *dev)
|
||||
|
||||
static int pcmciamtd_resume(struct pcmcia_device *dev)
|
||||
{
|
||||
DEBUG(2, "EVENT_PM_SUSPEND");
|
||||
pr_debug("EVENT_PM_SUSPEND\n");
|
||||
|
||||
/* free_lock(link); */
|
||||
|
||||
@@ -666,7 +646,7 @@ static void pcmciamtd_detach(struct pcmcia_device *link)
|
||||
{
|
||||
struct pcmciamtd_dev *dev = link->priv;
|
||||
|
||||
DEBUG(3, "link=0x%p", link);
|
||||
pr_debug("link=0x%p\n", link);
|
||||
|
||||
if(dev->mtd_info) {
|
||||
mtd_device_unregister(dev->mtd_info);
|
||||
@@ -686,7 +666,7 @@ static int pcmciamtd_probe(struct pcmcia_device *link)
|
||||
/* Create new memory card device */
|
||||
dev = kzalloc(sizeof(*dev), GFP_KERNEL);
|
||||
if (!dev) return -ENOMEM;
|
||||
DEBUG(1, "dev=0x%p", dev);
|
||||
pr_debug("dev=0x%p\n", dev);
|
||||
|
||||
dev->p_dev = link;
|
||||
link->priv = dev;
|
||||
@@ -755,7 +735,7 @@ static int __init init_pcmciamtd(void)
|
||||
|
||||
static void __exit exit_pcmciamtd(void)
|
||||
{
|
||||
DEBUG(1, DRIVER_DESC " unloading");
|
||||
pr_debug(DRIVER_DESC " unloading");
|
||||
pcmcia_unregister_driver(&pcmciamtd_driver);
|
||||
}
|
||||
|
||||
|
@@ -27,8 +27,6 @@ struct physmap_flash_info {
|
||||
struct mtd_info *mtd[MAX_RESOURCES];
|
||||
struct mtd_info *cmtd;
|
||||
struct map_info map[MAX_RESOURCES];
|
||||
int nr_parts;
|
||||
struct mtd_partition *parts;
|
||||
};
|
||||
|
||||
static int physmap_flash_remove(struct platform_device *dev)
|
||||
@@ -46,8 +44,6 @@ static int physmap_flash_remove(struct platform_device *dev)
|
||||
|
||||
if (info->cmtd) {
|
||||
mtd_device_unregister(info->cmtd);
|
||||
if (info->nr_parts)
|
||||
kfree(info->parts);
|
||||
if (info->cmtd != info->mtd[0])
|
||||
mtd_concat_destroy(info->cmtd);
|
||||
}
|
||||
@@ -175,23 +171,8 @@ static int physmap_flash_probe(struct platform_device *dev)
|
||||
if (err)
|
||||
goto err_out;
|
||||
|
||||
err = parse_mtd_partitions(info->cmtd, part_probe_types,
|
||||
&info->parts, 0);
|
||||
if (err > 0) {
|
||||
mtd_device_register(info->cmtd, info->parts, err);
|
||||
info->nr_parts = err;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (physmap_data->nr_parts) {
|
||||
printk(KERN_NOTICE "Using physmap partition information\n");
|
||||
mtd_device_register(info->cmtd, physmap_data->parts,
|
||||
physmap_data->nr_parts);
|
||||
return 0;
|
||||
}
|
||||
|
||||
mtd_device_register(info->cmtd, NULL, 0);
|
||||
|
||||
mtd_device_parse_register(info->cmtd, part_probe_types, 0,
|
||||
physmap_data->parts, physmap_data->nr_parts);
|
||||
return 0;
|
||||
|
||||
err_out:
|
||||
@@ -245,21 +226,6 @@ static struct platform_device physmap_flash = {
|
||||
.num_resources = 1,
|
||||
.resource = &physmap_flash_resource,
|
||||
};
|
||||
|
||||
void physmap_configure(unsigned long addr, unsigned long size,
|
||||
int bankwidth, void (*set_vpp)(struct map_info *, int))
|
||||
{
|
||||
physmap_flash_resource.start = addr;
|
||||
physmap_flash_resource.end = addr + size - 1;
|
||||
physmap_flash_data.width = bankwidth;
|
||||
physmap_flash_data.set_vpp = set_vpp;
|
||||
}
|
||||
|
||||
void physmap_set_partitions(struct mtd_partition *parts, int num_parts)
|
||||
{
|
||||
physmap_flash_data.nr_parts = num_parts;
|
||||
physmap_flash_data.parts = parts;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int __init physmap_init(void)
|
||||
|
@@ -34,58 +34,10 @@ struct of_flash_list {
|
||||
|
||||
struct of_flash {
|
||||
struct mtd_info *cmtd;
|
||||
struct mtd_partition *parts;
|
||||
int list_size; /* number of elements in of_flash_list */
|
||||
struct of_flash_list list[0];
|
||||
};
|
||||
|
||||
#define OF_FLASH_PARTS(info) ((info)->parts)
|
||||
static int parse_obsolete_partitions(struct platform_device *dev,
|
||||
struct of_flash *info,
|
||||
struct device_node *dp)
|
||||
{
|
||||
int i, plen, nr_parts;
|
||||
const struct {
|
||||
__be32 offset, len;
|
||||
} *part;
|
||||
const char *names;
|
||||
|
||||
part = of_get_property(dp, "partitions", &plen);
|
||||
if (!part)
|
||||
return 0; /* No partitions found */
|
||||
|
||||
dev_warn(&dev->dev, "Device tree uses obsolete partition map binding\n");
|
||||
|
||||
nr_parts = plen / sizeof(part[0]);
|
||||
|
||||
info->parts = kzalloc(nr_parts * sizeof(*info->parts), GFP_KERNEL);
|
||||
if (!info->parts)
|
||||
return -ENOMEM;
|
||||
|
||||
names = of_get_property(dp, "partition-names", &plen);
|
||||
|
||||
for (i = 0; i < nr_parts; i++) {
|
||||
info->parts[i].offset = be32_to_cpu(part->offset);
|
||||
info->parts[i].size = be32_to_cpu(part->len) & ~1;
|
||||
if (be32_to_cpu(part->len) & 1) /* bit 0 set signifies read only partition */
|
||||
info->parts[i].mask_flags = MTD_WRITEABLE;
|
||||
|
||||
if (names && (plen > 0)) {
|
||||
int len = strlen(names) + 1;
|
||||
|
||||
info->parts[i].name = (char *)names;
|
||||
plen -= len;
|
||||
names += len;
|
||||
} else {
|
||||
info->parts[i].name = "unnamed";
|
||||
}
|
||||
|
||||
part++;
|
||||
}
|
||||
|
||||
return nr_parts;
|
||||
}
|
||||
|
||||
static int of_flash_remove(struct platform_device *dev)
|
||||
{
|
||||
struct of_flash *info;
|
||||
@@ -101,11 +53,8 @@ static int of_flash_remove(struct platform_device *dev)
|
||||
mtd_concat_destroy(info->cmtd);
|
||||
}
|
||||
|
||||
if (info->cmtd) {
|
||||
if (OF_FLASH_PARTS(info))
|
||||
kfree(OF_FLASH_PARTS(info));
|
||||
if (info->cmtd)
|
||||
mtd_device_unregister(info->cmtd);
|
||||
}
|
||||
|
||||
for (i = 0; i < info->list_size; i++) {
|
||||
if (info->list[i].mtd)
|
||||
@@ -165,7 +114,8 @@ static struct mtd_info * __devinit obsolete_probe(struct platform_device *dev,
|
||||
specifies the list of partition probers to use. If none is given then the
|
||||
default is use. These take precedence over other device tree
|
||||
information. */
|
||||
static const char *part_probe_types_def[] = { "cmdlinepart", "RedBoot", NULL };
|
||||
static const char *part_probe_types_def[] = { "cmdlinepart", "RedBoot",
|
||||
"ofpart", "ofoldpart", NULL };
|
||||
static const char ** __devinit of_get_probes(struct device_node *dp)
|
||||
{
|
||||
const char *cp;
|
||||
@@ -218,6 +168,7 @@ static int __devinit of_flash_probe(struct platform_device *dev)
|
||||
int reg_tuple_size;
|
||||
struct mtd_info **mtd_list = NULL;
|
||||
resource_size_t res_size;
|
||||
struct mtd_part_parser_data ppdata;
|
||||
|
||||
match = of_match_device(of_flash_match, &dev->dev);
|
||||
if (!match)
|
||||
@@ -331,29 +282,12 @@ static int __devinit of_flash_probe(struct platform_device *dev)
|
||||
if (err)
|
||||
goto err_out;
|
||||
|
||||
ppdata.of_node = dp;
|
||||
part_probe_types = of_get_probes(dp);
|
||||
err = parse_mtd_partitions(info->cmtd, part_probe_types,
|
||||
&info->parts, 0);
|
||||
if (err < 0) {
|
||||
of_free_probes(part_probe_types);
|
||||
goto err_out;
|
||||
}
|
||||
mtd_device_parse_register(info->cmtd, part_probe_types, &ppdata,
|
||||
NULL, 0);
|
||||
of_free_probes(part_probe_types);
|
||||
|
||||
if (err == 0) {
|
||||
err = of_mtd_parse_partitions(&dev->dev, dp, &info->parts);
|
||||
if (err < 0)
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
if (err == 0) {
|
||||
err = parse_obsolete_partitions(dev, info, dp);
|
||||
if (err < 0)
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
mtd_device_register(info->cmtd, info->parts, err);
|
||||
|
||||
kfree(mtd_list);
|
||||
|
||||
return 0;
|
||||
|
@@ -44,8 +44,6 @@ struct platram_info {
|
||||
struct device *dev;
|
||||
struct mtd_info *mtd;
|
||||
struct map_info map;
|
||||
struct mtd_partition *partitions;
|
||||
bool free_partitions;
|
||||
struct resource *area;
|
||||
struct platdata_mtd_ram *pdata;
|
||||
};
|
||||
@@ -95,10 +93,6 @@ static int platram_remove(struct platform_device *pdev)
|
||||
|
||||
if (info->mtd) {
|
||||
mtd_device_unregister(info->mtd);
|
||||
if (info->partitions) {
|
||||
if (info->free_partitions)
|
||||
kfree(info->partitions);
|
||||
}
|
||||
map_destroy(info->mtd);
|
||||
}
|
||||
|
||||
@@ -228,21 +222,8 @@ static int platram_probe(struct platform_device *pdev)
|
||||
/* check to see if there are any available partitions, or wether
|
||||
* to add this device whole */
|
||||
|
||||
if (!pdata->nr_partitions) {
|
||||
/* try to probe using the supplied probe type */
|
||||
if (pdata->probes) {
|
||||
err = parse_mtd_partitions(info->mtd, pdata->probes,
|
||||
&info->partitions, 0);
|
||||
info->free_partitions = 1;
|
||||
if (err > 0)
|
||||
err = mtd_device_register(info->mtd,
|
||||
info->partitions, err);
|
||||
}
|
||||
}
|
||||
/* use the static mapping */
|
||||
else
|
||||
err = mtd_device_register(info->mtd, pdata->partitions,
|
||||
pdata->nr_partitions);
|
||||
err = mtd_device_parse_register(info->mtd, pdata->probes, 0,
|
||||
pdata->partitions, pdata->nr_partitions);
|
||||
if (!err)
|
||||
dev_info(&pdev->dev, "registered mtd device\n");
|
||||
|
||||
|
@@ -41,8 +41,6 @@ static void pxa2xx_map_inval_cache(struct map_info *map, unsigned long from,
|
||||
}
|
||||
|
||||
struct pxa2xx_flash_info {
|
||||
struct mtd_partition *parts;
|
||||
int nr_parts;
|
||||
struct mtd_info *mtd;
|
||||
struct map_info map;
|
||||
};
|
||||
@@ -55,9 +53,7 @@ static int __devinit pxa2xx_flash_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct flash_platform_data *flash = pdev->dev.platform_data;
|
||||
struct pxa2xx_flash_info *info;
|
||||
struct mtd_partition *parts;
|
||||
struct resource *res;
|
||||
int ret = 0;
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
if (!res)
|
||||
@@ -71,8 +67,6 @@ static int __devinit pxa2xx_flash_probe(struct platform_device *pdev)
|
||||
info->map.bankwidth = flash->width;
|
||||
info->map.phys = res->start;
|
||||
info->map.size = resource_size(res);
|
||||
info->parts = flash->parts;
|
||||
info->nr_parts = flash->nr_parts;
|
||||
|
||||
info->map.virt = ioremap(info->map.phys, info->map.size);
|
||||
if (!info->map.virt) {
|
||||
@@ -104,18 +98,7 @@ static int __devinit pxa2xx_flash_probe(struct platform_device *pdev)
|
||||
}
|
||||
info->mtd->owner = THIS_MODULE;
|
||||
|
||||
ret = parse_mtd_partitions(info->mtd, probes, &parts, 0);
|
||||
|
||||
if (ret > 0) {
|
||||
info->nr_parts = ret;
|
||||
info->parts = parts;
|
||||
}
|
||||
|
||||
if (!info->nr_parts)
|
||||
printk("Registering %s as whole device\n",
|
||||
info->map.name);
|
||||
|
||||
mtd_device_register(info->mtd, info->parts, info->nr_parts);
|
||||
mtd_device_parse_register(info->mtd, probes, 0, NULL, 0);
|
||||
|
||||
platform_set_drvdata(pdev, info);
|
||||
return 0;
|
||||
@@ -133,7 +116,6 @@ static int __devexit pxa2xx_flash_remove(struct platform_device *dev)
|
||||
iounmap(info->map.virt);
|
||||
if (info->map.cached)
|
||||
iounmap(info->map.cached);
|
||||
kfree(info->parts);
|
||||
kfree(info);
|
||||
return 0;
|
||||
}
|
||||
|
@@ -25,8 +25,6 @@
|
||||
struct rbtx4939_flash_info {
|
||||
struct mtd_info *mtd;
|
||||
struct map_info map;
|
||||
int nr_parts;
|
||||
struct mtd_partition *parts;
|
||||
};
|
||||
|
||||
static int rbtx4939_flash_remove(struct platform_device *dev)
|
||||
@@ -41,8 +39,6 @@ static int rbtx4939_flash_remove(struct platform_device *dev)
|
||||
if (info->mtd) {
|
||||
struct rbtx4939_flash_data *pdata = dev->dev.platform_data;
|
||||
|
||||
if (info->nr_parts)
|
||||
kfree(info->parts);
|
||||
mtd_device_unregister(info->mtd);
|
||||
map_destroy(info->mtd);
|
||||
}
|
||||
@@ -50,7 +46,6 @@ static int rbtx4939_flash_remove(struct platform_device *dev)
|
||||
}
|
||||
|
||||
static const char *rom_probe_types[] = { "cfi_probe", "jedec_probe", NULL };
|
||||
static const char *part_probe_types[] = { "cmdlinepart", NULL };
|
||||
|
||||
static int rbtx4939_flash_probe(struct platform_device *dev)
|
||||
{
|
||||
@@ -107,22 +102,11 @@ static int rbtx4939_flash_probe(struct platform_device *dev)
|
||||
info->mtd->owner = THIS_MODULE;
|
||||
if (err)
|
||||
goto err_out;
|
||||
err = mtd_device_parse_register(info->mtd, NULL, 0,
|
||||
pdata->parts, pdata->nr_parts);
|
||||
|
||||
err = parse_mtd_partitions(info->mtd, part_probe_types,
|
||||
&info->parts, 0);
|
||||
if (err > 0) {
|
||||
mtd_device_register(info->mtd, info->parts, err);
|
||||
info->nr_parts = err;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (pdata->nr_parts) {
|
||||
pr_notice("Using rbtx4939 partition information\n");
|
||||
mtd_device_register(info->mtd, pdata->parts, pdata->nr_parts);
|
||||
return 0;
|
||||
}
|
||||
|
||||
mtd_device_register(info->mtd, NULL, 0);
|
||||
if (err)
|
||||
goto err_out;
|
||||
return 0;
|
||||
|
||||
err_out:
|
||||
|
@@ -131,10 +131,8 @@ struct sa_subdev_info {
|
||||
};
|
||||
|
||||
struct sa_info {
|
||||
struct mtd_partition *parts;
|
||||
struct mtd_info *mtd;
|
||||
int num_subdev;
|
||||
unsigned int nr_parts;
|
||||
struct sa_subdev_info subdev[0];
|
||||
};
|
||||
|
||||
@@ -231,8 +229,6 @@ static void sa1100_destroy(struct sa_info *info, struct flash_platform_data *pla
|
||||
mtd_concat_destroy(info->mtd);
|
||||
}
|
||||
|
||||
kfree(info->parts);
|
||||
|
||||
for (i = info->num_subdev - 1; i >= 0; i--)
|
||||
sa1100_destroy_subdev(&info->subdev[i]);
|
||||
kfree(info);
|
||||
@@ -341,10 +337,8 @@ static const char *part_probes[] = { "cmdlinepart", "RedBoot", NULL };
|
||||
static int __devinit sa1100_mtd_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct flash_platform_data *plat = pdev->dev.platform_data;
|
||||
struct mtd_partition *parts;
|
||||
const char *part_type = NULL;
|
||||
struct sa_info *info;
|
||||
int err, nr_parts = 0;
|
||||
int err;
|
||||
|
||||
if (!plat)
|
||||
return -ENODEV;
|
||||
@@ -358,26 +352,8 @@ static int __devinit sa1100_mtd_probe(struct platform_device *pdev)
|
||||
/*
|
||||
* Partition selection stuff.
|
||||
*/
|
||||
nr_parts = parse_mtd_partitions(info->mtd, part_probes, &parts, 0);
|
||||
if (nr_parts > 0) {
|
||||
info->parts = parts;
|
||||
part_type = "dynamic";
|
||||
} else {
|
||||
parts = plat->parts;
|
||||
nr_parts = plat->nr_parts;
|
||||
part_type = "static";
|
||||
}
|
||||
|
||||
if (nr_parts == 0)
|
||||
printk(KERN_NOTICE "SA1100 flash: no partition info "
|
||||
"available, registering whole flash\n");
|
||||
else
|
||||
printk(KERN_NOTICE "SA1100 flash: using %s partition "
|
||||
"definition\n", part_type);
|
||||
|
||||
mtd_device_register(info->mtd, parts, nr_parts);
|
||||
|
||||
info->nr_parts = nr_parts;
|
||||
mtd_device_parse_register(info->mtd, part_probes, 0,
|
||||
plat->parts, plat->nr_parts);
|
||||
|
||||
platform_set_drvdata(pdev, info);
|
||||
err = 0;
|
||||
|
@@ -19,8 +19,6 @@
|
||||
static struct mtd_info *flash_mtd;
|
||||
static struct mtd_info *eprom_mtd;
|
||||
|
||||
static struct mtd_partition *parsed_parts;
|
||||
|
||||
struct map_info soleng_eprom_map = {
|
||||
.name = "Solution Engine EPROM",
|
||||
.size = 0x400000,
|
||||
@@ -51,12 +49,14 @@ static struct mtd_partition superh_se_partitions[] = {
|
||||
.size = MTDPART_SIZ_FULL,
|
||||
}
|
||||
};
|
||||
#define NUM_PARTITIONS ARRAY_SIZE(superh_se_partitions)
|
||||
#else
|
||||
#define superh_se_partitions NULL
|
||||
#define NUM_PARTITIONS 0
|
||||
#endif /* CONFIG_MTD_SUPERH_RESERVE */
|
||||
|
||||
static int __init init_soleng_maps(void)
|
||||
{
|
||||
int nr_parts = 0;
|
||||
|
||||
/* First probe at offset 0 */
|
||||
soleng_flash_map.phys = 0;
|
||||
soleng_flash_map.virt = (void __iomem *)P2SEGADDR(0);
|
||||
@@ -92,21 +92,8 @@ static int __init init_soleng_maps(void)
|
||||
mtd_device_register(eprom_mtd, NULL, 0);
|
||||
}
|
||||
|
||||
nr_parts = parse_mtd_partitions(flash_mtd, probes, &parsed_parts, 0);
|
||||
|
||||
#ifdef CONFIG_MTD_SUPERH_RESERVE
|
||||
if (nr_parts <= 0) {
|
||||
printk(KERN_NOTICE "Using configured partition at 0x%08x.\n",
|
||||
CONFIG_MTD_SUPERH_RESERVE);
|
||||
parsed_parts = superh_se_partitions;
|
||||
nr_parts = sizeof(superh_se_partitions)/sizeof(*parsed_parts);
|
||||
}
|
||||
#endif /* CONFIG_MTD_SUPERH_RESERVE */
|
||||
|
||||
if (nr_parts > 0)
|
||||
mtd_device_register(flash_mtd, parsed_parts, nr_parts);
|
||||
else
|
||||
mtd_device_register(flash_mtd, NULL, 0);
|
||||
mtd_device_parse_register(flash_mtd, probes, 0,
|
||||
superh_se_partitions, NUM_PARTITIONS);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -118,10 +105,7 @@ static void __exit cleanup_soleng_maps(void)
|
||||
map_destroy(eprom_mtd);
|
||||
}
|
||||
|
||||
if (parsed_parts)
|
||||
mtd_device_unregister(flash_mtd);
|
||||
else
|
||||
mtd_device_unregister(flash_mtd);
|
||||
mtd_device_unregister(flash_mtd);
|
||||
map_destroy(flash_mtd);
|
||||
}
|
||||
|
||||
|
@@ -20,7 +20,6 @@
|
||||
#include <asm/immap_cpm2.h>
|
||||
|
||||
static struct mtd_info *sbcmtd[3];
|
||||
static struct mtd_partition *sbcmtd_parts[3];
|
||||
|
||||
struct map_info sbc82xx_flash_map[3] = {
|
||||
{.name = "Boot flash"},
|
||||
@@ -101,6 +100,7 @@ static int __init init_sbc82xx_flash(void)
|
||||
for (i=0; i<3; i++) {
|
||||
int8_t flashcs[3] = { 0, 6, 1 };
|
||||
int nr_parts;
|
||||
struct mtd_partition *defparts;
|
||||
|
||||
printk(KERN_NOTICE "PowerQUICC II %s (%ld MiB on CS%d",
|
||||
sbc82xx_flash_map[i].name,
|
||||
@@ -113,7 +113,8 @@ static int __init init_sbc82xx_flash(void)
|
||||
}
|
||||
printk(" at %08lx)\n", sbc82xx_flash_map[i].phys);
|
||||
|
||||
sbc82xx_flash_map[i].virt = ioremap(sbc82xx_flash_map[i].phys, sbc82xx_flash_map[i].size);
|
||||
sbc82xx_flash_map[i].virt = ioremap(sbc82xx_flash_map[i].phys,
|
||||
sbc82xx_flash_map[i].size);
|
||||
|
||||
if (!sbc82xx_flash_map[i].virt) {
|
||||
printk("Failed to ioremap\n");
|
||||
@@ -129,24 +130,20 @@ static int __init init_sbc82xx_flash(void)
|
||||
|
||||
sbcmtd[i]->owner = THIS_MODULE;
|
||||
|
||||
nr_parts = parse_mtd_partitions(sbcmtd[i], part_probes,
|
||||
&sbcmtd_parts[i], 0);
|
||||
if (nr_parts > 0) {
|
||||
mtd_device_register(sbcmtd[i], sbcmtd_parts[i],
|
||||
nr_parts);
|
||||
continue;
|
||||
}
|
||||
|
||||
/* No partitioning detected. Use default */
|
||||
if (i == 2) {
|
||||
mtd_device_register(sbcmtd[i], NULL, 0);
|
||||
defparts = NULL;
|
||||
nr_parts = 0;
|
||||
} else if (i == bigflash) {
|
||||
mtd_device_register(sbcmtd[i], bigflash_parts,
|
||||
ARRAY_SIZE(bigflash_parts));
|
||||
defparts = bigflash_parts;
|
||||
nr_parts = ARRAY_SIZE(bigflash_parts);
|
||||
} else {
|
||||
mtd_device_register(sbcmtd[i], smallflash_parts,
|
||||
ARRAY_SIZE(smallflash_parts));
|
||||
defparts = smallflash_parts;
|
||||
nr_parts = ARRAY_SIZE(smallflash_parts);
|
||||
}
|
||||
|
||||
mtd_device_parse_register(sbcmtd[i], part_probes, 0,
|
||||
defparts, nr_parts);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -159,12 +156,8 @@ static void __exit cleanup_sbc82xx_flash(void)
|
||||
if (!sbcmtd[i])
|
||||
continue;
|
||||
|
||||
if (i<2 || sbcmtd_parts[i])
|
||||
mtd_device_unregister(sbcmtd[i]);
|
||||
else
|
||||
mtd_device_unregister(sbcmtd[i]);
|
||||
mtd_device_unregister(sbcmtd[i]);
|
||||
|
||||
kfree(sbcmtd_parts[i]);
|
||||
map_destroy(sbcmtd[i]);
|
||||
|
||||
iounmap((void *)sbc82xx_flash_map[i].virt);
|
||||
|
Reference in New Issue
Block a user