You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge tag 'for-linus-20130509' of git://git.infradead.org/linux-mtd
Pull MTD update from David Woodhouse:
- Lots of cleanups from Artem, including deletion of some obsolete
drivers
- Support partitions larger than 4GiB in device tree
- Support for new SPI chips
* tag 'for-linus-20130509' of git://git.infradead.org/linux-mtd: (83 commits)
mtd: omap2: Use module_platform_driver()
mtd: bf5xx_nand: Use module_platform_driver()
mtd: denali_dt: Remove redundant use of of_match_ptr
mtd: denali_dt: Change return value to fix smatch warning
mtd: denali_dt: Use module_platform_driver()
mtd: denali_dt: Fix incorrect error check
mtd: nand: subpage write support for hardware based ECC schemes
mtd: omap2: use msecs_to_jiffies()
mtd: nand_ids: use size macros
mtd: nand_ids: improve LEGACY_ID_NAND macro a bit
mtd: add 4 Toshiba nand chips for the full-id case
mtd: add the support to parse out the full-id nand type
mtd: add new fields to nand_flash_dev{}
mtd: sh_flctl: Use of_match_ptr() macro
mtd: gpio: Use of_match_ptr() macro
mtd: gpio: Use devm_kzalloc()
mtd: davinci_nand: Use of_match_ptr()
mtd: dataflash: Use of_match_ptr() macro
mtd: remove h720x flash support
mtd: onenand: remove OneNAND simulator
...
This commit is contained in:
@@ -14,8 +14,7 @@ Description:
|
||||
The /sys/class/mtd/mtd{0,1,2,3,...} directories correspond
|
||||
to each /dev/mtdX character device. These may represent
|
||||
physical/simulated flash devices, partitions on a flash
|
||||
device, or concatenated flash devices. They exist regardless
|
||||
of whether CONFIG_MTD_CHAR is actually enabled.
|
||||
device, or concatenated flash devices.
|
||||
|
||||
What: /sys/class/mtd/mtdXro/
|
||||
Date: April 2009
|
||||
@@ -23,8 +22,7 @@ KernelVersion: 2.6.29
|
||||
Contact: linux-mtd@lists.infradead.org
|
||||
Description:
|
||||
These directories provide the corresponding read-only device
|
||||
nodes for /sys/class/mtd/mtdX/ . They are only created
|
||||
(for the benefit of udev) if CONFIG_MTD_CHAR is enabled.
|
||||
nodes for /sys/class/mtd/mtdX/ .
|
||||
|
||||
What: /sys/class/mtd/mtdX/dev
|
||||
Date: April 2009
|
||||
|
||||
@@ -5,8 +5,12 @@ on platforms which have strong conventions about which portions of a flash are
|
||||
used for what purposes, but which don't use an on-flash partition table such
|
||||
as RedBoot.
|
||||
|
||||
#address-cells & #size-cells must both be present in the mtd device and be
|
||||
equal to 1.
|
||||
#address-cells & #size-cells must both be present in the mtd device. There are
|
||||
two valid values for both:
|
||||
<1>: for partitions that require a single 32-bit cell to represent their
|
||||
size/address (aka the value is below 4 GiB)
|
||||
<2>: for partitions that require two 32-bit cells to represent their
|
||||
size/address (aka the value is 4 GiB or greater).
|
||||
|
||||
Required properties:
|
||||
- reg : The partition's offset and size within the mtd bank.
|
||||
@@ -36,3 +40,31 @@ flash@0 {
|
||||
reg = <0x0100000 0x200000>;
|
||||
};
|
||||
};
|
||||
|
||||
flash@1 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <2>;
|
||||
|
||||
/* a 4 GiB partition */
|
||||
partition@0 {
|
||||
label = "filesystem";
|
||||
reg = <0x00000000 0x1 0x00000000>;
|
||||
};
|
||||
};
|
||||
|
||||
flash@2 {
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
|
||||
/* an 8 GiB partition */
|
||||
partition@0 {
|
||||
label = "filesystem #1";
|
||||
reg = <0x0 0x00000000 0x2 0x00000000>;
|
||||
};
|
||||
|
||||
/* a 4 GiB partition */
|
||||
partition@200000000 {
|
||||
label = "filesystem #2";
|
||||
reg = <0x2 0x00000000 0x1 0x00000000>;
|
||||
};
|
||||
};
|
||||
|
||||
@@ -162,7 +162,6 @@ config MACH_XCEP
|
||||
select MTD
|
||||
select MTD_CFI
|
||||
select MTD_CFI_INTELEXT
|
||||
select MTD_CHAR
|
||||
select MTD_PHYSMAP
|
||||
select PXA25x
|
||||
select SMC91X
|
||||
|
||||
@@ -264,7 +264,6 @@ config ETRAX_AXISFLASHMAP
|
||||
select MTD_CFI
|
||||
select MTD_CFI_AMDSTD
|
||||
select MTD_JEDECPROBE if ETRAX_ARCH_V32
|
||||
select MTD_CHAR
|
||||
select MTD_BLOCK
|
||||
select MTD_COMPLEX_MAPPINGS
|
||||
help
|
||||
|
||||
@@ -404,7 +404,6 @@ config ETRAX_AXISFLASHMAP
|
||||
select MTD_CFI
|
||||
select MTD_CFI_AMDSTD
|
||||
select MTD_JEDECPROBE
|
||||
select MTD_CHAR
|
||||
select MTD_BLOCK
|
||||
select MTD_COMPLEX_MAPPINGS
|
||||
help
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
#include <linux/serial_reg.h>
|
||||
#include <linux/time.h>
|
||||
|
||||
static const char *part_probes[] = { "bcm47xxpart", NULL };
|
||||
static const char * const part_probes[] = { "bcm47xxpart", NULL };
|
||||
|
||||
static struct physmap_flash_data bcma_pflash_data = {
|
||||
.part_probe_types = part_probes,
|
||||
|
||||
@@ -157,19 +157,6 @@ config MTD_BCM47XX_PARTS
|
||||
|
||||
comment "User Modules And Translation Layers"
|
||||
|
||||
config MTD_CHAR
|
||||
tristate "Direct char device access to MTD devices"
|
||||
help
|
||||
This provides a character device for each MTD device present in
|
||||
the system, allowing the user to read and write directly to the
|
||||
memory chips, and also use ioctl() to obtain information about
|
||||
the device, or to erase parts of it.
|
||||
|
||||
config HAVE_MTD_OTP
|
||||
bool
|
||||
help
|
||||
Enable access to OTP regions using MTD_CHAR.
|
||||
|
||||
config MTD_BLKDEVS
|
||||
tristate "Common interface to block layer for MTD 'translation layers'"
|
||||
depends on BLOCK
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
# Core functionality.
|
||||
obj-$(CONFIG_MTD) += mtd.o
|
||||
mtd-y := mtdcore.o mtdsuper.o mtdconcat.o mtdpart.o
|
||||
mtd-y := mtdcore.o mtdsuper.o mtdconcat.o mtdpart.o mtdchar.o
|
||||
|
||||
obj-$(CONFIG_MTD_OF_PARTS) += ofpart.o
|
||||
obj-$(CONFIG_MTD_REDBOOT_PARTS) += redboot.o
|
||||
@@ -15,7 +15,6 @@ obj-$(CONFIG_MTD_BCM63XX_PARTS) += bcm63xxpart.o
|
||||
obj-$(CONFIG_MTD_BCM47XX_PARTS) += bcm47xxpart.o
|
||||
|
||||
# 'Users' - code which presents functionality to userspace.
|
||||
obj-$(CONFIG_MTD_CHAR) += mtdchar.o
|
||||
obj-$(CONFIG_MTD_BLKDEVS) += mtd_blkdevs.o
|
||||
obj-$(CONFIG_MTD_BLOCK) += mtdblock.o
|
||||
obj-$(CONFIG_MTD_BLOCK_RO) += mtdblock_ro.o
|
||||
|
||||
@@ -146,7 +146,6 @@ config MTD_CFI_I8
|
||||
config MTD_OTP
|
||||
bool "Protection Registers aka one-time programmable (OTP) bits"
|
||||
depends on MTD_CFI_ADV_OPTIONS
|
||||
select HAVE_MTD_OTP
|
||||
default n
|
||||
help
|
||||
This enables support for reading, writing and locking so called
|
||||
|
||||
@@ -71,7 +71,6 @@ config MTD_DATAFLASH_WRITE_VERIFY
|
||||
config MTD_DATAFLASH_OTP
|
||||
bool "DataFlash OTP support (Security Register)"
|
||||
depends on MTD_DATAFLASH
|
||||
select HAVE_MTD_OTP
|
||||
help
|
||||
Newer DataFlash chips (revisions C and D) support 128 bytes of
|
||||
one-time-programmable (OTP) data. The first half may be written
|
||||
@@ -205,69 +204,6 @@ config MTD_BLOCK2MTD
|
||||
|
||||
comment "Disk-On-Chip Device Drivers"
|
||||
|
||||
config MTD_DOC2000
|
||||
tristate "M-Systems Disk-On-Chip 2000 and Millennium (DEPRECATED)"
|
||||
depends on MTD_NAND
|
||||
select MTD_DOCPROBE
|
||||
select MTD_NAND_IDS
|
||||
---help---
|
||||
This provides an MTD device driver for the M-Systems DiskOnChip
|
||||
2000 and Millennium devices. Originally designed for the DiskOnChip
|
||||
2000, it also now includes support for the DiskOnChip Millennium.
|
||||
If you have problems with this driver and the DiskOnChip Millennium,
|
||||
you may wish to try the alternative Millennium driver below. To use
|
||||
the alternative driver, you will need to undefine DOC_SINGLE_DRIVER
|
||||
in the <file:drivers/mtd/devices/docprobe.c> source code.
|
||||
|
||||
If you use this device, you probably also want to enable the NFTL
|
||||
'NAND Flash Translation Layer' option below, which is used to
|
||||
emulate a block device by using a kind of file system on the flash
|
||||
chips.
|
||||
|
||||
NOTE: This driver is deprecated and will probably be removed soon.
|
||||
Please try the new DiskOnChip driver under "NAND Flash Device
|
||||
Drivers".
|
||||
|
||||
config MTD_DOC2001
|
||||
tristate "M-Systems Disk-On-Chip Millennium-only alternative driver (DEPRECATED)"
|
||||
depends on MTD_NAND
|
||||
select MTD_DOCPROBE
|
||||
select MTD_NAND_IDS
|
||||
---help---
|
||||
This provides an alternative MTD device driver for the M-Systems
|
||||
DiskOnChip Millennium devices. Use this if you have problems with
|
||||
the combined DiskOnChip 2000 and Millennium driver above. To get
|
||||
the DiskOnChip probe code to load and use this driver instead of
|
||||
the other one, you will need to undefine DOC_SINGLE_DRIVER near
|
||||
the beginning of <file:drivers/mtd/devices/docprobe.c>.
|
||||
|
||||
If you use this device, you probably also want to enable the NFTL
|
||||
'NAND Flash Translation Layer' option below, which is used to
|
||||
emulate a block device by using a kind of file system on the flash
|
||||
chips.
|
||||
|
||||
NOTE: This driver is deprecated and will probably be removed soon.
|
||||
Please try the new DiskOnChip driver under "NAND Flash Device
|
||||
Drivers".
|
||||
|
||||
config MTD_DOC2001PLUS
|
||||
tristate "M-Systems Disk-On-Chip Millennium Plus"
|
||||
depends on MTD_NAND
|
||||
select MTD_DOCPROBE
|
||||
select MTD_NAND_IDS
|
||||
---help---
|
||||
This provides an MTD device driver for the M-Systems DiskOnChip
|
||||
Millennium Plus devices.
|
||||
|
||||
If you use this device, you probably also want to enable the INFTL
|
||||
'Inverse NAND Flash Translation Layer' option below, which is used
|
||||
to emulate a block device by using a kind of file system on the
|
||||
flash chips.
|
||||
|
||||
NOTE: This driver will soon be replaced by the new DiskOnChip driver
|
||||
under "NAND Flash Device Drivers" (currently that driver does not
|
||||
support all Millennium Plus devices).
|
||||
|
||||
config MTD_DOCG3
|
||||
tristate "M-Systems Disk-On-Chip G3"
|
||||
select BCH
|
||||
|
||||
@@ -2,12 +2,7 @@
|
||||
# linux/drivers/mtd/devices/Makefile
|
||||
#
|
||||
|
||||
obj-$(CONFIG_MTD_DOC2000) += doc2000.o
|
||||
obj-$(CONFIG_MTD_DOC2001) += doc2001.o
|
||||
obj-$(CONFIG_MTD_DOC2001PLUS) += doc2001plus.o
|
||||
obj-$(CONFIG_MTD_DOCG3) += docg3.o
|
||||
obj-$(CONFIG_MTD_DOCPROBE) += docprobe.o
|
||||
obj-$(CONFIG_MTD_DOCECC) += docecc.o
|
||||
obj-$(CONFIG_MTD_SLRAM) += slram.o
|
||||
obj-$(CONFIG_MTD_PHRAM) += phram.o
|
||||
obj-$(CONFIG_MTD_PMC551) += pmc551.o
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_DESCRIPTION("Serial flash driver for BCMA bus");
|
||||
|
||||
static const char *probes[] = { "bcm47xxpart", NULL };
|
||||
static const char * const probes[] = { "bcm47xxpart", NULL };
|
||||
|
||||
static int bcm47xxsflash_read(struct mtd_info *mtd, loff_t from, size_t len,
|
||||
size_t *retlen, u_char *buf)
|
||||
@@ -61,6 +61,17 @@ static int bcm47xxsflash_bcma_probe(struct platform_device *pdev)
|
||||
}
|
||||
sflash->priv = b47s;
|
||||
|
||||
b47s->bcma_cc = container_of(sflash, struct bcma_drv_cc, sflash);
|
||||
|
||||
switch (b47s->bcma_cc->capabilities & BCMA_CC_CAP_FLASHT) {
|
||||
case BCMA_CC_FLASHT_STSER:
|
||||
b47s->type = BCM47XXSFLASH_TYPE_ST;
|
||||
break;
|
||||
case BCMA_CC_FLASHT_ATSER:
|
||||
b47s->type = BCM47XXSFLASH_TYPE_ATMEL;
|
||||
break;
|
||||
}
|
||||
|
||||
b47s->window = sflash->window;
|
||||
b47s->blocksize = sflash->blocksize;
|
||||
b47s->numblocks = sflash->numblocks;
|
||||
|
||||
@@ -3,7 +3,66 @@
|
||||
|
||||
#include <linux/mtd/mtd.h>
|
||||
|
||||
/* Used for ST flashes only. */
|
||||
#define OPCODE_ST_WREN 0x0006 /* Write Enable */
|
||||
#define OPCODE_ST_WRDIS 0x0004 /* Write Disable */
|
||||
#define OPCODE_ST_RDSR 0x0105 /* Read Status Register */
|
||||
#define OPCODE_ST_WRSR 0x0101 /* Write Status Register */
|
||||
#define OPCODE_ST_READ 0x0303 /* Read Data Bytes */
|
||||
#define OPCODE_ST_PP 0x0302 /* Page Program */
|
||||
#define OPCODE_ST_SE 0x02d8 /* Sector Erase */
|
||||
#define OPCODE_ST_BE 0x00c7 /* Bulk Erase */
|
||||
#define OPCODE_ST_DP 0x00b9 /* Deep Power-down */
|
||||
#define OPCODE_ST_RES 0x03ab /* Read Electronic Signature */
|
||||
#define OPCODE_ST_CSA 0x1000 /* Keep chip select asserted */
|
||||
#define OPCODE_ST_SSE 0x0220 /* Sub-sector Erase */
|
||||
|
||||
/* Used for Atmel flashes only. */
|
||||
#define OPCODE_AT_READ 0x07e8
|
||||
#define OPCODE_AT_PAGE_READ 0x07d2
|
||||
#define OPCODE_AT_STATUS 0x01d7
|
||||
#define OPCODE_AT_BUF1_WRITE 0x0384
|
||||
#define OPCODE_AT_BUF2_WRITE 0x0387
|
||||
#define OPCODE_AT_BUF1_ERASE_PROGRAM 0x0283
|
||||
#define OPCODE_AT_BUF2_ERASE_PROGRAM 0x0286
|
||||
#define OPCODE_AT_BUF1_PROGRAM 0x0288
|
||||
#define OPCODE_AT_BUF2_PROGRAM 0x0289
|
||||
#define OPCODE_AT_PAGE_ERASE 0x0281
|
||||
#define OPCODE_AT_BLOCK_ERASE 0x0250
|
||||
#define OPCODE_AT_BUF1_WRITE_ERASE_PROGRAM 0x0382
|
||||
#define OPCODE_AT_BUF2_WRITE_ERASE_PROGRAM 0x0385
|
||||
#define OPCODE_AT_BUF1_LOAD 0x0253
|
||||
#define OPCODE_AT_BUF2_LOAD 0x0255
|
||||
#define OPCODE_AT_BUF1_COMPARE 0x0260
|
||||
#define OPCODE_AT_BUF2_COMPARE 0x0261
|
||||
#define OPCODE_AT_BUF1_REPROGRAM 0x0258
|
||||
#define OPCODE_AT_BUF2_REPROGRAM 0x0259
|
||||
|
||||
/* Status register bits for ST flashes */
|
||||
#define SR_ST_WIP 0x01 /* Write In Progress */
|
||||
#define SR_ST_WEL 0x02 /* Write Enable Latch */
|
||||
#define SR_ST_BP_MASK 0x1c /* Block Protect */
|
||||
#define SR_ST_BP_SHIFT 2
|
||||
#define SR_ST_SRWD 0x80 /* Status Register Write Disable */
|
||||
|
||||
/* Status register bits for Atmel flashes */
|
||||
#define SR_AT_READY 0x80
|
||||
#define SR_AT_MISMATCH 0x40
|
||||
#define SR_AT_ID_MASK 0x38
|
||||
#define SR_AT_ID_SHIFT 3
|
||||
|
||||
struct bcma_drv_cc;
|
||||
|
||||
enum bcm47xxsflash_type {
|
||||
BCM47XXSFLASH_TYPE_ATMEL,
|
||||
BCM47XXSFLASH_TYPE_ST,
|
||||
};
|
||||
|
||||
struct bcm47xxsflash {
|
||||
struct bcma_drv_cc *bcma_cc;
|
||||
|
||||
enum bcm47xxsflash_type type;
|
||||
|
||||
u32 window;
|
||||
u32 blocksize;
|
||||
u16 numblocks;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -123,7 +123,7 @@ static inline void doc_flash_address(struct docg3 *docg3, u8 addr)
|
||||
doc_writeb(docg3, addr, DOC_FLASHADDRESS);
|
||||
}
|
||||
|
||||
static char const *part_probes[] = { "cmdlinepart", "saftlpart", NULL };
|
||||
static char const * const part_probes[] = { "cmdlinepart", "saftlpart", NULL };
|
||||
|
||||
static int doc_register_readb(struct docg3 *docg3, int reg)
|
||||
{
|
||||
@@ -2144,18 +2144,7 @@ static struct platform_driver g3_driver = {
|
||||
.remove = __exit_p(docg3_release),
|
||||
};
|
||||
|
||||
static int __init docg3_init(void)
|
||||
{
|
||||
return platform_driver_probe(&g3_driver, docg3_probe);
|
||||
}
|
||||
module_init(docg3_init);
|
||||
|
||||
|
||||
static void __exit docg3_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&g3_driver);
|
||||
}
|
||||
module_exit(docg3_exit);
|
||||
module_platform_driver_probe(g3_driver, docg3_probe);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Robert Jarzmik <robert.jarzmik@free.fr>");
|
||||
|
||||
@@ -1,325 +0,0 @@
|
||||
|
||||
/* Linux driver for Disk-On-Chip devices */
|
||||
/* Probe routines common to all DoC devices */
|
||||
/* (C) 1999 Machine Vision Holdings, Inc. */
|
||||
/* (C) 1999-2003 David Woodhouse <dwmw2@infradead.org> */
|
||||
|
||||
|
||||
/* DOC_PASSIVE_PROBE:
|
||||
In order to ensure that the BIOS checksum is correct at boot time, and
|
||||
hence that the onboard BIOS extension gets executed, the DiskOnChip
|
||||
goes into reset mode when it is read sequentially: all registers
|
||||
return 0xff until the chip is woken up again by writing to the
|
||||
DOCControl register.
|
||||
|
||||
Unfortunately, this means that the probe for the DiskOnChip is unsafe,
|
||||
because one of the first things it does is write to where it thinks
|
||||
the DOCControl register should be - which may well be shared memory
|
||||
for another device. I've had machines which lock up when this is
|
||||
attempted. Hence the possibility to do a passive probe, which will fail
|
||||
to detect a chip in reset mode, but is at least guaranteed not to lock
|
||||
the machine.
|
||||
|
||||
If you have this problem, uncomment the following line:
|
||||
#define DOC_PASSIVE_PROBE
|
||||
*/
|
||||
|
||||
|
||||
/* DOC_SINGLE_DRIVER:
|
||||
Millennium driver has been merged into DOC2000 driver.
|
||||
|
||||
The old Millennium-only driver has been retained just in case there
|
||||
are problems with the new code. If the combined driver doesn't work
|
||||
for you, you can try the old one by undefining DOC_SINGLE_DRIVER
|
||||
below and also enabling it in your configuration. If this fixes the
|
||||
problems, please send a report to the MTD mailing list at
|
||||
<linux-mtd@lists.infradead.org>.
|
||||
*/
|
||||
#define DOC_SINGLE_DRIVER
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <asm/errno.h>
|
||||
#include <asm/io.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/nand.h>
|
||||
#include <linux/mtd/doc2000.h>
|
||||
|
||||
|
||||
static unsigned long doc_config_location = CONFIG_MTD_DOCPROBE_ADDRESS;
|
||||
module_param(doc_config_location, ulong, 0);
|
||||
MODULE_PARM_DESC(doc_config_location, "Physical memory address at which to probe for DiskOnChip");
|
||||
|
||||
static unsigned long __initdata doc_locations[] = {
|
||||
#if defined (__alpha__) || defined(__i386__) || defined(__x86_64__)
|
||||
#ifdef CONFIG_MTD_DOCPROBE_HIGH
|
||||
0xfffc8000, 0xfffca000, 0xfffcc000, 0xfffce000,
|
||||
0xfffd0000, 0xfffd2000, 0xfffd4000, 0xfffd6000,
|
||||
0xfffd8000, 0xfffda000, 0xfffdc000, 0xfffde000,
|
||||
0xfffe0000, 0xfffe2000, 0xfffe4000, 0xfffe6000,
|
||||
0xfffe8000, 0xfffea000, 0xfffec000, 0xfffee000,
|
||||
#else /* CONFIG_MTD_DOCPROBE_HIGH */
|
||||
0xc8000, 0xca000, 0xcc000, 0xce000,
|
||||
0xd0000, 0xd2000, 0xd4000, 0xd6000,
|
||||
0xd8000, 0xda000, 0xdc000, 0xde000,
|
||||
0xe0000, 0xe2000, 0xe4000, 0xe6000,
|
||||
0xe8000, 0xea000, 0xec000, 0xee000,
|
||||
#endif /* CONFIG_MTD_DOCPROBE_HIGH */
|
||||
#endif
|
||||
0xffffffff };
|
||||
|
||||
/* doccheck: Probe a given memory window to see if there's a DiskOnChip present */
|
||||
|
||||
static inline int __init doccheck(void __iomem *potential, unsigned long physadr)
|
||||
{
|
||||
void __iomem *window=potential;
|
||||
unsigned char tmp, tmpb, tmpc, ChipID;
|
||||
#ifndef DOC_PASSIVE_PROBE
|
||||
unsigned char tmp2;
|
||||
#endif
|
||||
|
||||
/* Routine copied from the Linux DOC driver */
|
||||
|
||||
#ifdef CONFIG_MTD_DOCPROBE_55AA
|
||||
/* Check for 0x55 0xAA signature at beginning of window,
|
||||
this is no longer true once we remove the IPL (for Millennium */
|
||||
if (ReadDOC(window, Sig1) != 0x55 || ReadDOC(window, Sig2) != 0xaa)
|
||||
return 0;
|
||||
#endif /* CONFIG_MTD_DOCPROBE_55AA */
|
||||
|
||||
#ifndef DOC_PASSIVE_PROBE
|
||||
/* It's not possible to cleanly detect the DiskOnChip - the
|
||||
* bootup procedure will put the device into reset mode, and
|
||||
* it's not possible to talk to it without actually writing
|
||||
* to the DOCControl register. So we store the current contents
|
||||
* of the DOCControl register's location, in case we later decide
|
||||
* that it's not a DiskOnChip, and want to put it back how we
|
||||
* found it.
|
||||
*/
|
||||
tmp2 = ReadDOC(window, DOCControl);
|
||||
|
||||
/* Reset the DiskOnChip ASIC */
|
||||
WriteDOC(DOC_MODE_CLR_ERR | DOC_MODE_MDWREN | DOC_MODE_RESET,
|
||||
window, DOCControl);
|
||||
WriteDOC(DOC_MODE_CLR_ERR | DOC_MODE_MDWREN | DOC_MODE_RESET,
|
||||
window, DOCControl);
|
||||
|
||||
/* Enable the DiskOnChip ASIC */
|
||||
WriteDOC(DOC_MODE_CLR_ERR | DOC_MODE_MDWREN | DOC_MODE_NORMAL,
|
||||
window, DOCControl);
|
||||
WriteDOC(DOC_MODE_CLR_ERR | DOC_MODE_MDWREN | DOC_MODE_NORMAL,
|
||||
window, DOCControl);
|
||||
#endif /* !DOC_PASSIVE_PROBE */
|
||||
|
||||
/* We need to read the ChipID register four times. For some
|
||||
newer DiskOnChip 2000 units, the first three reads will
|
||||
return the DiskOnChip Millennium ident. Don't ask. */
|
||||
ChipID = ReadDOC(window, ChipID);
|
||||
|
||||
switch (ChipID) {
|
||||
case DOC_ChipID_Doc2k:
|
||||
/* Check the TOGGLE bit in the ECC register */
|
||||
tmp = ReadDOC(window, 2k_ECCStatus) & DOC_TOGGLE_BIT;
|
||||
tmpb = ReadDOC(window, 2k_ECCStatus) & DOC_TOGGLE_BIT;
|
||||
tmpc = ReadDOC(window, 2k_ECCStatus) & DOC_TOGGLE_BIT;
|
||||
if (tmp != tmpb && tmp == tmpc)
|
||||
return ChipID;
|
||||
break;
|
||||
|
||||
case DOC_ChipID_DocMil:
|
||||
/* Check for the new 2000 with Millennium ASIC */
|
||||
ReadDOC(window, ChipID);
|
||||
ReadDOC(window, ChipID);
|
||||
if (ReadDOC(window, ChipID) != DOC_ChipID_DocMil)
|
||||
ChipID = DOC_ChipID_Doc2kTSOP;
|
||||
|
||||
/* Check the TOGGLE bit in the ECC register */
|
||||
tmp = ReadDOC(window, ECCConf) & DOC_TOGGLE_BIT;
|
||||
tmpb = ReadDOC(window, ECCConf) & DOC_TOGGLE_BIT;
|
||||
tmpc = ReadDOC(window, ECCConf) & DOC_TOGGLE_BIT;
|
||||
if (tmp != tmpb && tmp == tmpc)
|
||||
return ChipID;
|
||||
break;
|
||||
|
||||
case DOC_ChipID_DocMilPlus16:
|
||||
case DOC_ChipID_DocMilPlus32:
|
||||
case 0:
|
||||
/* Possible Millennium+, need to do more checks */
|
||||
#ifndef DOC_PASSIVE_PROBE
|
||||
/* Possibly release from power down mode */
|
||||
for (tmp = 0; (tmp < 4); tmp++)
|
||||
ReadDOC(window, Mplus_Power);
|
||||
|
||||
/* Reset the DiskOnChip ASIC */
|
||||
tmp = DOC_MODE_RESET | DOC_MODE_MDWREN | DOC_MODE_RST_LAT |
|
||||
DOC_MODE_BDECT;
|
||||
WriteDOC(tmp, window, Mplus_DOCControl);
|
||||
WriteDOC(~tmp, window, Mplus_CtrlConfirm);
|
||||
|
||||
mdelay(1);
|
||||
/* Enable the DiskOnChip ASIC */
|
||||
tmp = DOC_MODE_NORMAL | DOC_MODE_MDWREN | DOC_MODE_RST_LAT |
|
||||
DOC_MODE_BDECT;
|
||||
WriteDOC(tmp, window, Mplus_DOCControl);
|
||||
WriteDOC(~tmp, window, Mplus_CtrlConfirm);
|
||||
mdelay(1);
|
||||
#endif /* !DOC_PASSIVE_PROBE */
|
||||
|
||||
ChipID = ReadDOC(window, ChipID);
|
||||
|
||||
switch (ChipID) {
|
||||
case DOC_ChipID_DocMilPlus16:
|
||||
case DOC_ChipID_DocMilPlus32:
|
||||
/* Check the TOGGLE bit in the toggle register */
|
||||
tmp = ReadDOC(window, Mplus_Toggle) & DOC_TOGGLE_BIT;
|
||||
tmpb = ReadDOC(window, Mplus_Toggle) & DOC_TOGGLE_BIT;
|
||||
tmpc = ReadDOC(window, Mplus_Toggle) & DOC_TOGGLE_BIT;
|
||||
if (tmp != tmpb && tmp == tmpc)
|
||||
return ChipID;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
/* FALL TRHU */
|
||||
|
||||
default:
|
||||
|
||||
#ifdef CONFIG_MTD_DOCPROBE_55AA
|
||||
printk(KERN_DEBUG "Possible DiskOnChip with unknown ChipID %2.2X found at 0x%lx\n",
|
||||
ChipID, physadr);
|
||||
#endif
|
||||
#ifndef DOC_PASSIVE_PROBE
|
||||
/* Put back the contents of the DOCControl register, in case it's not
|
||||
* actually a DiskOnChip.
|
||||
*/
|
||||
WriteDOC(tmp2, window, DOCControl);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
printk(KERN_WARNING "DiskOnChip failed TOGGLE test, dropping.\n");
|
||||
|
||||
#ifndef DOC_PASSIVE_PROBE
|
||||
/* Put back the contents of the DOCControl register: it's not a DiskOnChip */
|
||||
WriteDOC(tmp2, window, DOCControl);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int docfound;
|
||||
|
||||
extern void DoC2k_init(struct mtd_info *);
|
||||
extern void DoCMil_init(struct mtd_info *);
|
||||
extern void DoCMilPlus_init(struct mtd_info *);
|
||||
|
||||
static void __init DoC_Probe(unsigned long physadr)
|
||||
{
|
||||
void __iomem *docptr;
|
||||
struct DiskOnChip *this;
|
||||
struct mtd_info *mtd;
|
||||
int ChipID;
|
||||
char namebuf[15];
|
||||
char *name = namebuf;
|
||||
void (*initroutine)(struct mtd_info *) = NULL;
|
||||
|
||||
docptr = ioremap(physadr, DOC_IOREMAP_LEN);
|
||||
|
||||
if (!docptr)
|
||||
return;
|
||||
|
||||
if ((ChipID = doccheck(docptr, physadr))) {
|
||||
if (ChipID == DOC_ChipID_Doc2kTSOP) {
|
||||
/* Remove this at your own peril. The hardware driver works but nothing prevents you from erasing bad blocks */
|
||||
printk(KERN_NOTICE "Refusing to drive DiskOnChip 2000 TSOP until Bad Block Table is correctly supported by INFTL\n");
|
||||
iounmap(docptr);
|
||||
return;
|
||||
}
|
||||
docfound = 1;
|
||||
mtd = kzalloc(sizeof(struct DiskOnChip) + sizeof(struct mtd_info), GFP_KERNEL);
|
||||
if (!mtd) {
|
||||
printk(KERN_WARNING "Cannot allocate memory for data structures. Dropping.\n");
|
||||
iounmap(docptr);
|
||||
return;
|
||||
}
|
||||
|
||||
this = (struct DiskOnChip *)(&mtd[1]);
|
||||
mtd->priv = this;
|
||||
this->virtadr = docptr;
|
||||
this->physadr = physadr;
|
||||
this->ChipID = ChipID;
|
||||
sprintf(namebuf, "with ChipID %2.2X", ChipID);
|
||||
|
||||
switch(ChipID) {
|
||||
case DOC_ChipID_Doc2kTSOP:
|
||||
name="2000 TSOP";
|
||||
initroutine = symbol_request(DoC2k_init);
|
||||
break;
|
||||
|
||||
case DOC_ChipID_Doc2k:
|
||||
name="2000";
|
||||
initroutine = symbol_request(DoC2k_init);
|
||||
break;
|
||||
|
||||
case DOC_ChipID_DocMil:
|
||||
name="Millennium";
|
||||
#ifdef DOC_SINGLE_DRIVER
|
||||
initroutine = symbol_request(DoC2k_init);
|
||||
#else
|
||||
initroutine = symbol_request(DoCMil_init);
|
||||
#endif /* DOC_SINGLE_DRIVER */
|
||||
break;
|
||||
|
||||
case DOC_ChipID_DocMilPlus16:
|
||||
case DOC_ChipID_DocMilPlus32:
|
||||
name="MillenniumPlus";
|
||||
initroutine = symbol_request(DoCMilPlus_init);
|
||||
break;
|
||||
}
|
||||
|
||||
if (initroutine) {
|
||||
(*initroutine)(mtd);
|
||||
symbol_put_addr(initroutine);
|
||||
return;
|
||||
}
|
||||
printk(KERN_NOTICE "Cannot find driver for DiskOnChip %s at 0x%lX\n", name, physadr);
|
||||
kfree(mtd);
|
||||
}
|
||||
iounmap(docptr);
|
||||
}
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
*
|
||||
* Module stuff
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
static int __init init_doc(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (doc_config_location) {
|
||||
printk(KERN_INFO "Using configured DiskOnChip probe address 0x%lx\n", doc_config_location);
|
||||
DoC_Probe(doc_config_location);
|
||||
} else {
|
||||
for (i=0; (doc_locations[i] != 0xffffffff); i++) {
|
||||
DoC_Probe(doc_locations[i]);
|
||||
}
|
||||
}
|
||||
/* No banner message any more. Print a message if no DiskOnChip
|
||||
found, so the user knows we at least tried. */
|
||||
if (!docfound)
|
||||
printk(KERN_INFO "No recognised DiskOnChip devices found\n");
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
module_init(init_doc);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("David Woodhouse <dwmw2@infradead.org>");
|
||||
MODULE_DESCRIPTION("Probe code for DiskOnChip 2000 and Millennium devices");
|
||||
|
||||
@@ -81,14 +81,21 @@ static u32 elm_read_reg(struct elm_info *info, int offset)
|
||||
* @dev: ELM device
|
||||
* @bch_type: Type of BCH ecc
|
||||
*/
|
||||
void elm_config(struct device *dev, enum bch_ecc bch_type)
|
||||
int elm_config(struct device *dev, enum bch_ecc bch_type)
|
||||
{
|
||||
u32 reg_val;
|
||||
struct elm_info *info = dev_get_drvdata(dev);
|
||||
|
||||
if (!info) {
|
||||
dev_err(dev, "Unable to configure elm - device not probed?\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
reg_val = (bch_type & ECC_BCH_LEVEL_MASK) | (ELM_ECC_SIZE << 16);
|
||||
elm_write_reg(info, ELM_LOCATION_CONFIG, reg_val);
|
||||
info->bch_type = bch_type;
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(elm_config);
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user