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

Commit eaca491f authored by Janusz Krzysztofik's avatar Janusz Krzysztofik Committed by David Woodhouse
Browse files

mtd: nand: ams-delta: drop omap_read/write, use ioremap



There is a common requirement for not using OMAP specific omap_readw() /
omap_writew() function calls in drivers/, but replace them with
readw() / writew() on ioremap()ped addresses passed from arch/ instead.

The patch implements this idea for the Amstrad Delta NAND driver. To be
able to use the modified driver, the board file is updated with the
platform device I/O resource declaration, which is passed from there.

Created and tested against linux-2.6.37-rc5, on top of recent patch
'MTD: NAND: ams-delta: convert to platform driver'.

Signed-off-by: default avatarJanusz Krzysztofik <jkrzyszt@tis.icnet.pl>
Acked-by: default avatarTony Lindgren <tony@atomide.com>
Signed-off-by: default avatarArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
Signed-off-by: default avatarDavid Woodhouse <David.Woodhouse@intel.com>
parent dcf12463
Loading
Loading
Loading
Loading
+12 −1
Original line number Original line Diff line number Diff line
@@ -181,9 +181,20 @@ static struct omap_board_config_kernel ams_delta_config[] = {
	{ OMAP_TAG_LCD,		&ams_delta_lcd_config },
	{ OMAP_TAG_LCD,		&ams_delta_lcd_config },
};
};


static struct resource ams_delta_nand_resources[] = {
	[0] = {
		.start	= OMAP1_MPUIO_BASE,
		.end	= OMAP1_MPUIO_BASE +
				OMAP_MPUIO_IO_CNTL + sizeof(u32) - 1,
		.flags	= IORESOURCE_MEM,
	},
};

static struct platform_device ams_delta_nand_device = {
static struct platform_device ams_delta_nand_device = {
	.name	= "ams-delta-nand",
	.name	= "ams-delta-nand",
	.id	= -1
	.id	= -1,
	.num_resources	= ARRAY_SIZE(ams_delta_nand_resources),
	.resource	= ams_delta_nand_resources,
};
};


static struct resource ams_delta_kp_resources[] = {
static struct resource ams_delta_kp_resources[] = {
+43 −6
Original line number Original line Diff line number Diff line
@@ -5,6 +5,7 @@
 *
 *
 *  Derived from drivers/mtd/toto.c
 *  Derived from drivers/mtd/toto.c
 *  Converted to platform driver by Janusz Krzysztofik <jkrzyszt@tis.icnet.pl>
 *  Converted to platform driver by Janusz Krzysztofik <jkrzyszt@tis.icnet.pl>
 *  Partially stolen from drivers/mtd/nand/plat_nand.c
 *
 *
 * This program is free software; you can redistribute it and/or modify
 * 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
 * it under the terms of the GNU General Public License version 2 as
@@ -63,9 +64,10 @@ static struct mtd_partition partition_info[] = {
static void ams_delta_write_byte(struct mtd_info *mtd, u_char byte)
static void ams_delta_write_byte(struct mtd_info *mtd, u_char byte)
{
{
	struct nand_chip *this = mtd->priv;
	struct nand_chip *this = mtd->priv;
	void __iomem *io_base = this->priv;


	omap_writew(0, (OMAP1_MPUIO_BASE + OMAP_MPUIO_IO_CNTL));
	writew(0, io_base + OMAP_MPUIO_IO_CNTL);
	omap_writew(byte, this->IO_ADDR_W);
	writew(byte, this->IO_ADDR_W);
	ams_delta_latch2_write(AMS_DELTA_LATCH2_NAND_NWE, 0);
	ams_delta_latch2_write(AMS_DELTA_LATCH2_NAND_NWE, 0);
	ndelay(40);
	ndelay(40);
	ams_delta_latch2_write(AMS_DELTA_LATCH2_NAND_NWE,
	ams_delta_latch2_write(AMS_DELTA_LATCH2_NAND_NWE,
@@ -76,11 +78,12 @@ static u_char ams_delta_read_byte(struct mtd_info *mtd)
{
{
	u_char res;
	u_char res;
	struct nand_chip *this = mtd->priv;
	struct nand_chip *this = mtd->priv;
	void __iomem *io_base = this->priv;


	ams_delta_latch2_write(AMS_DELTA_LATCH2_NAND_NRE, 0);
	ams_delta_latch2_write(AMS_DELTA_LATCH2_NAND_NRE, 0);
	ndelay(40);
	ndelay(40);
	omap_writew(~0, (OMAP1_MPUIO_BASE + OMAP_MPUIO_IO_CNTL));
	writew(~0, io_base + OMAP_MPUIO_IO_CNTL);
	res = omap_readw(this->IO_ADDR_R);
	res = readw(this->IO_ADDR_R);
	ams_delta_latch2_write(AMS_DELTA_LATCH2_NAND_NRE,
	ams_delta_latch2_write(AMS_DELTA_LATCH2_NAND_NRE,
			       AMS_DELTA_LATCH2_NAND_NRE);
			       AMS_DELTA_LATCH2_NAND_NRE);


@@ -155,8 +158,13 @@ static int ams_delta_nand_ready(struct mtd_info *mtd)
static int __devinit ams_delta_init(struct platform_device *pdev)
static int __devinit ams_delta_init(struct platform_device *pdev)
{
{
	struct nand_chip *this;
	struct nand_chip *this;
	struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	void __iomem *io_base;
	int err = 0;
	int err = 0;


	if (!res)
		return -ENXIO;

	/* Allocate memory for MTD device structure and private data */
	/* Allocate memory for MTD device structure and private data */
	ams_delta_mtd = kmalloc(sizeof(struct mtd_info) +
	ams_delta_mtd = kmalloc(sizeof(struct mtd_info) +
				sizeof(struct nand_chip), GFP_KERNEL);
				sizeof(struct nand_chip), GFP_KERNEL);
@@ -178,9 +186,25 @@ static int __devinit ams_delta_init(struct platform_device *pdev)
	/* Link the private data with the MTD structure */
	/* Link the private data with the MTD structure */
	ams_delta_mtd->priv = this;
	ams_delta_mtd->priv = this;


	if (!request_mem_region(res->start, resource_size(res),
			dev_name(&pdev->dev))) {
		dev_err(&pdev->dev, "request_mem_region failed\n");
		err = -EBUSY;
		goto out_free;
	}

	io_base = ioremap(res->start, resource_size(res));
	if (io_base == NULL) {
		dev_err(&pdev->dev, "ioremap failed\n");
		err = -EIO;
		goto out_release_io;
	}

	this->priv = io_base;

	/* Set address of NAND IO lines */
	/* Set address of NAND IO lines */
	this->IO_ADDR_R = (OMAP1_MPUIO_BASE + OMAP_MPUIO_INPUT_LATCH);
	this->IO_ADDR_R = io_base + OMAP_MPUIO_INPUT_LATCH;
	this->IO_ADDR_W = (OMAP1_MPUIO_BASE + OMAP_MPUIO_OUTPUT);
	this->IO_ADDR_W = io_base + OMAP_MPUIO_OUTPUT;
	this->read_byte = ams_delta_read_byte;
	this->read_byte = ams_delta_read_byte;
	this->write_buf = ams_delta_write_buf;
	this->write_buf = ams_delta_write_buf;
	this->read_buf = ams_delta_read_buf;
	this->read_buf = ams_delta_read_buf;
@@ -196,6 +220,8 @@ static int __devinit ams_delta_init(struct platform_device *pdev)
	this->chip_delay = 30;
	this->chip_delay = 30;
	this->ecc.mode = NAND_ECC_SOFT;
	this->ecc.mode = NAND_ECC_SOFT;


	platform_set_drvdata(pdev, io_base);

	/* Set chip enabled, but  */
	/* Set chip enabled, but  */
	ams_delta_latch2_write(NAND_MASK, AMS_DELTA_LATCH2_NAND_NRE |
	ams_delta_latch2_write(NAND_MASK, AMS_DELTA_LATCH2_NAND_NRE |
					  AMS_DELTA_LATCH2_NAND_NWE |
					  AMS_DELTA_LATCH2_NAND_NWE |
@@ -215,6 +241,11 @@ static int __devinit ams_delta_init(struct platform_device *pdev)
	goto out;
	goto out;


 out_mtd:
 out_mtd:
	platform_set_drvdata(pdev, NULL);
	iounmap(io_base);
out_release_io:
	release_mem_region(res->start, resource_size(res));
out_free:
	kfree(ams_delta_mtd);
	kfree(ams_delta_mtd);
 out:
 out:
	return err;
	return err;
@@ -225,9 +256,15 @@ static int __devinit ams_delta_init(struct platform_device *pdev)
 */
 */
static int __devexit ams_delta_cleanup(struct platform_device *pdev)
static int __devexit ams_delta_cleanup(struct platform_device *pdev)
{
{
	void __iomem *io_base = platform_get_drvdata(pdev);
	struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);

	/* Release resources, unregister device */
	/* Release resources, unregister device */
	nand_release(ams_delta_mtd);
	nand_release(ams_delta_mtd);


	iounmap(io_base);
	release_mem_region(res->start, resource_size(res));

	/* Free the MTD device structure */
	/* Free the MTD device structure */
	kfree(ams_delta_mtd);
	kfree(ams_delta_mtd);