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

Commit 51f607c7 authored by Atsushi Nemoto's avatar Atsushi Nemoto Committed by Ralf Baechle
Browse files

MIPS: TXx9: Add mtd support



Add helper routines to register physmap-flash platform devices for NOR
flashes.

Signed-off-by: default avatarAtsushi Nemoto <anemo@mba.ocn.ne.jp>
Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
parent c7b95bcb
Loading
Loading
Loading
Loading
+41 −0
Original line number Original line Diff line number Diff line
@@ -22,6 +22,7 @@
#include <linux/gpio.h>
#include <linux/gpio.h>
#include <linux/platform_device.h>
#include <linux/platform_device.h>
#include <linux/serial_core.h>
#include <linux/serial_core.h>
#include <linux/mtd/physmap.h>
#include <asm/bootinfo.h>
#include <asm/bootinfo.h>
#include <asm/time.h>
#include <asm/time.h>
#include <asm/reboot.h>
#include <asm/reboot.h>
@@ -593,3 +594,43 @@ static unsigned long __swizzle_addr_none(unsigned long port)
unsigned long (*__swizzle_addr_b)(unsigned long port) = __swizzle_addr_none;
unsigned long (*__swizzle_addr_b)(unsigned long port) = __swizzle_addr_none;
EXPORT_SYMBOL(__swizzle_addr_b);
EXPORT_SYMBOL(__swizzle_addr_b);
#endif
#endif

void __init txx9_physmap_flash_init(int no, unsigned long addr,
				    unsigned long size,
				    const struct physmap_flash_data *pdata)
{
#if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
	struct resource res = {
		.start = addr,
		.end = addr + size - 1,
		.flags = IORESOURCE_MEM,
	};
	struct platform_device *pdev;
#ifdef CONFIG_MTD_PARTITIONS
	static struct mtd_partition parts[2];
	struct physmap_flash_data pdata_part;

	/* If this area contained boot area, make separate partition */
	if (pdata->nr_parts == 0 && !pdata->parts &&
	    addr < 0x1fc00000 && addr + size > 0x1fc00000 &&
	    !parts[0].name) {
		parts[0].name = "boot";
		parts[0].offset = 0x1fc00000 - addr;
		parts[0].size = addr + size - 0x1fc00000;
		parts[1].name = "user";
		parts[1].offset = 0;
		parts[1].size = 0x1fc00000 - addr;
		pdata_part = *pdata;
		pdata_part.nr_parts = ARRAY_SIZE(parts);
		pdata_part.parts = parts;
		pdata = &pdata_part;
	}
#endif
	pdev = platform_device_alloc("physmap-flash", no);
	if (!pdev ||
	    platform_device_add_resources(pdev, &res, 1) ||
	    platform_device_add_data(pdev, pdata, sizeof(*pdata)) ||
	    platform_device_add(pdev))
		platform_device_put(pdev);
#endif
}
+14 −0
Original line number Original line Diff line number Diff line
@@ -15,6 +15,7 @@
#include <linux/delay.h>
#include <linux/delay.h>
#include <linux/param.h>
#include <linux/param.h>
#include <linux/io.h>
#include <linux/io.h>
#include <linux/mtd/physmap.h>
#include <asm/mipsregs.h>
#include <asm/mipsregs.h>
#include <asm/txx9irq.h>
#include <asm/txx9irq.h>
#include <asm/txx9tmr.h>
#include <asm/txx9tmr.h>
@@ -121,3 +122,16 @@ void __init tx3927_sio_init(unsigned int sclk, unsigned int cts_mask)
			      TXX9_IRQ_BASE + TX3927_IR_SIO(i),
			      TXX9_IRQ_BASE + TX3927_IR_SIO(i),
			      i, sclk, (1 << i) & cts_mask);
			      i, sclk, (1 << i) & cts_mask);
}
}

void __init tx3927_mtd_init(int ch)
{
	struct physmap_flash_data pdata = {
		.width = TX3927_ROMC_WIDTH(ch) / 8,
	};
	unsigned long start = txx9_ce_res[ch].start;
	unsigned long size = txx9_ce_res[ch].end - start + 1;

	if (!(tx3927_romcptr->cr[ch] & 0x8))
		return;	/* disabled */
	txx9_physmap_flash_init(ch, start, size, &pdata);
}
+14 −0
Original line number Original line Diff line number Diff line
@@ -14,6 +14,7 @@
#include <linux/ioport.h>
#include <linux/ioport.h>
#include <linux/delay.h>
#include <linux/delay.h>
#include <linux/param.h>
#include <linux/param.h>
#include <linux/mtd/physmap.h>
#include <asm/txx9irq.h>
#include <asm/txx9irq.h>
#include <asm/txx9tmr.h>
#include <asm/txx9tmr.h>
#include <asm/txx9pio.h>
#include <asm/txx9pio.h>
@@ -187,3 +188,16 @@ void __init tx4927_sio_init(unsigned int sclk, unsigned int cts_mask)
			      TXX9_IRQ_BASE + TX4927_IR_SIO(i),
			      TXX9_IRQ_BASE + TX4927_IR_SIO(i),
			      i, sclk, (1 << i) & cts_mask);
			      i, sclk, (1 << i) & cts_mask);
}
}

void __init tx4927_mtd_init(int ch)
{
	struct physmap_flash_data pdata = {
		.width = TX4927_EBUSC_WIDTH(ch) / 8,
	};
	unsigned long start = txx9_ce_res[ch].start;
	unsigned long size = txx9_ce_res[ch].end - start + 1;

	if (!(TX4927_EBUSC_CR(ch) & 0x8))
		return;	/* disabled */
	txx9_physmap_flash_init(ch, start, size, &pdata);
}
+14 −0
Original line number Original line Diff line number Diff line
@@ -14,6 +14,7 @@
#include <linux/ioport.h>
#include <linux/ioport.h>
#include <linux/delay.h>
#include <linux/delay.h>
#include <linux/param.h>
#include <linux/param.h>
#include <linux/mtd/physmap.h>
#include <asm/txx9irq.h>
#include <asm/txx9irq.h>
#include <asm/txx9tmr.h>
#include <asm/txx9tmr.h>
#include <asm/txx9pio.h>
#include <asm/txx9pio.h>
@@ -269,3 +270,16 @@ void __init tx4938_ethaddr_init(unsigned char *addr0, unsigned char *addr1)
	if (addr1 && (pcfg & TX4938_PCFG_ETH1_SEL))
	if (addr1 && (pcfg & TX4938_PCFG_ETH1_SEL))
		txx9_ethaddr_init(TXX9_IRQ_BASE + TX4938_IR_ETH1, addr1);
		txx9_ethaddr_init(TXX9_IRQ_BASE + TX4938_IR_ETH1, addr1);
}
}

void __init tx4938_mtd_init(int ch)
{
	struct physmap_flash_data pdata = {
		.width = TX4938_EBUSC_WIDTH(ch) / 8,
	};
	unsigned long start = txx9_ce_res[ch].start;
	unsigned long size = txx9_ce_res[ch].end - start + 1;

	if (!(TX4938_EBUSC_CR(ch) & 0x8))
		return;	/* disabled */
	txx9_physmap_flash_init(ch, start, size, &pdata);
}
+9 −0
Original line number Original line Diff line number Diff line
@@ -190,11 +190,20 @@ static void __init jmr3927_rtc_init(void)
	platform_device_register_simple("rtc-ds1742", -1, &res, 1);
	platform_device_register_simple("rtc-ds1742", -1, &res, 1);
}
}


static void __init jmr3927_mtd_init(void)
{
	int i;

	for (i = 0; i < 2; i++)
		tx3927_mtd_init(i);
}

static void __init jmr3927_device_init(void)
static void __init jmr3927_device_init(void)
{
{
	__swizzle_addr_b = jmr3927_swizzle_addr_b;
	__swizzle_addr_b = jmr3927_swizzle_addr_b;
	jmr3927_rtc_init();
	jmr3927_rtc_init();
	tx3927_wdt_init();
	tx3927_wdt_init();
	jmr3927_mtd_init();
}
}


struct txx9_board_vec jmr3927_vec __initdata = {
struct txx9_board_vec jmr3927_vec __initdata = {
Loading