Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1ab9dd09 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
* git://git.infradead.org/mtd-2.6:
  [MTD] Whitespace cleanup in SSFDC driver.
  [MTD] SSFDC translation layer minor cleanup
  [MTD] Fix dependencies with CONFIG_MTD=m
parents f7425b16 08d3ad6a
Loading
Loading
Loading
Loading
+2 −2
Original line number Original line Diff line number Diff line
@@ -101,7 +101,7 @@ config MTD_REDBOOT_PARTS_READONLY


config MTD_CMDLINE_PARTS
config MTD_CMDLINE_PARTS
	bool "Command line partition table parsing"
	bool "Command line partition table parsing"
	depends on MTD_PARTITIONS = "y"
	depends on MTD_PARTITIONS = "y" && MTD = "y"
	---help---
	---help---
	  Allow generic configuration of the MTD partition tables via the kernel
	  Allow generic configuration of the MTD partition tables via the kernel
	  command line. Multiple flash resources are supported for hardware where
	  command line. Multiple flash resources are supported for hardware where
@@ -264,7 +264,7 @@ config RFD_FTL
		http://www.gensw.com/pages/prod/bios/rfd.htm
		http://www.gensw.com/pages/prod/bios/rfd.htm


config SSFDC
config SSFDC
	bool "NAND SSFDC (SmartMedia) read only translation layer"
	tristate "NAND SSFDC (SmartMedia) read only translation layer"
	depends on MTD
	depends on MTD
	default n
	default n
	help
	help
+32 −26
Original line number Original line Diff line number Diff line
@@ -10,7 +10,6 @@
 * published by the Free Software Foundation.
 * published by the Free Software Foundation.
 */
 */


#include <linux/config.h>
#include <linux/kernel.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/init.h>
@@ -29,7 +28,7 @@ struct ssfdcr_record {
	int cis_block;			/* block n. containing CIS/IDI */
	int cis_block;			/* block n. containing CIS/IDI */
	int erase_size;			/* phys_block_size */
	int erase_size;			/* phys_block_size */
	unsigned short *logic_block_map; /* all zones (max 8192 phys blocks on
	unsigned short *logic_block_map; /* all zones (max 8192 phys blocks on
					    the 128MB) */
					    the 128MiB) */
	int map_len;			/* n. phys_blocks on the card */
	int map_len;			/* n. phys_blocks on the card */
};
};


@@ -43,11 +42,11 @@ struct ssfdcr_record {
#define MAX_LOGIC_BLK_PER_ZONE	1000
#define MAX_LOGIC_BLK_PER_ZONE	1000
#define MAX_PHYS_BLK_PER_ZONE	1024
#define MAX_PHYS_BLK_PER_ZONE	1024


#define KB(x)	( (x) * 1024L )
#define KiB(x)	( (x) * 1024L )
#define MB(x)	( KB(x) * 1024L )
#define MiB(x)	( KiB(x) * 1024L )


/** CHS Table
/** CHS Table
		1MB	2MB	4MB	8MB	16MB	32MB	64MB	128MB
		1MiB	2MiB	4MiB	8MiB	16MiB	32MiB	64MiB	128MiB
NCylinder	125	125	250	250	500	500	500	500
NCylinder	125	125	250	250	500	500	500	500
NHead		4	4	4	4	4	8	8	16
NHead		4	4	4	4	4	8	8	16
NSector		4	8	8	16	16	16	32	32
NSector		4	8	8	16	16	16	32	32
@@ -64,14 +63,14 @@ typedef struct {


/* Must be ordered by size */
/* Must be ordered by size */
static const chs_entry_t chs_table[] = {
static const chs_entry_t chs_table[] = {
	{ MB(  1), 125,  4,  4 },
	{ MiB(  1), 125,  4,  4 },
	{ MB(  2), 125,  4,  8 },
	{ MiB(  2), 125,  4,  8 },
	{ MB(  4), 250,  4,  8 },
	{ MiB(  4), 250,  4,  8 },
	{ MB(  8), 250,  4, 16 },
	{ MiB(  8), 250,  4, 16 },
	{ MB( 16), 500,  4, 16 },
	{ MiB( 16), 500,  4, 16 },
	{ MB( 32), 500,  8, 16 },
	{ MiB( 32), 500,  8, 16 },
	{ MB( 64), 500,  8, 32 },
	{ MiB( 64), 500,  8, 32 },
	{ MB(128), 500, 16, 32 },
	{ MiB(128), 500, 16, 32 },
	{ 0 },
	{ 0 },
};
};


@@ -109,14 +108,19 @@ static int get_valid_cis_sector(struct mtd_info *mtd)
	int ret, k, cis_sector;
	int ret, k, cis_sector;
	size_t retlen;
	size_t retlen;
	loff_t offset;
	loff_t offset;
	uint8_t sect_buf[SECTOR_SIZE];
	uint8_t *sect_buf;

	cis_sector = -1;

	sect_buf = kmalloc(SECTOR_SIZE, GFP_KERNEL);
	if (!sect_buf)
		goto out;


	/*
	/*
	 * Look for CIS/IDI sector on the first GOOD block (give up after 4 bad
	 * Look for CIS/IDI sector on the first GOOD block (give up after 4 bad
	 * blocks). If the first good block doesn't contain CIS number the flash
	 * blocks). If the first good block doesn't contain CIS number the flash
	 * is not SSFDC formatted
	 * is not SSFDC formatted
	 */
	 */
	cis_sector = -1;
	for (k = 0, offset = 0; k < 4; k++, offset += mtd->erasesize) {
	for (k = 0, offset = 0; k < 4; k++, offset += mtd->erasesize) {
		if (!mtd->block_isbad(mtd, offset)) {
		if (!mtd->block_isbad(mtd, offset)) {
			ret = mtd->read(mtd, offset, SECTOR_SIZE, &retlen,
			ret = mtd->read(mtd, offset, SECTOR_SIZE, &retlen,
@@ -140,6 +144,8 @@ static int get_valid_cis_sector(struct mtd_info *mtd)
		}
		}
	}
	}


	kfree(sect_buf);
 out:
	return cis_sector;
	return cis_sector;
}
}


@@ -245,8 +251,8 @@ static int build_logical_block_map(struct ssfdcr_record *ssfdc)
	struct mtd_info *mtd = ssfdc->mbd.mtd;
	struct mtd_info *mtd = ssfdc->mbd.mtd;


	DEBUG(MTD_DEBUG_LEVEL1, "SSFDC_RO: build_block_map() nblks=%d (%luK)\n",
	DEBUG(MTD_DEBUG_LEVEL1, "SSFDC_RO: build_block_map() nblks=%d (%luK)\n",
		ssfdc->map_len, (unsigned long)ssfdc->map_len *
	      ssfdc->map_len,
		ssfdc->erase_size / 1024 );
	      (unsigned long)ssfdc->map_len * ssfdc->erase_size / 1024);


	/* Scan every physical block, skip CIS block */
	/* Scan every physical block, skip CIS block */
	for (phys_block = ssfdc->cis_block + 1; phys_block < ssfdc->map_len;
	for (phys_block = ssfdc->cis_block + 1; phys_block < ssfdc->map_len;