* [PATCH 1/7] mtd: sh_flctl: Update FLCMNCR register bit field
@ 2012-02-08 12:16 Bastian Hecht
2012-02-08 12:16 ` [PATCH 2/7] mtd: sh_flctl: Reorder empty_fifo() calls Bastian Hecht
` (5 more replies)
0 siblings, 6 replies; 7+ messages in thread
From: Bastian Hecht @ 2012-02-08 12:16 UTC (permalink / raw)
To: linux-mtd, linux-sh; +Cc: Bastian Hecht, magnus.damm, laurent.pinchart
Updates the FLCMNCR bit field to match the newest hardware generation.
Some defines are added to select an appropriate clocking scheme.
Signed-off-by: Bastian Hecht <hechtb@gmail.com>
---
include/linux/mtd/sh_flctl.h | 24 ++++++++++++++++++++++++
1 files changed, 24 insertions(+), 0 deletions(-)
diff --git a/include/linux/mtd/sh_flctl.h b/include/linux/mtd/sh_flctl.h
index 9cf4c4c..ecbf3e6 100644
--- a/include/linux/mtd/sh_flctl.h
+++ b/include/linux/mtd/sh_flctl.h
@@ -67,6 +67,30 @@
#define CE0_ENABLE (0x1 << 3) /* Chip Enable 0 */
#define TYPESEL_SET (0x1 << 0)
+/*
+ * Clock settings using the PULSEx registers from FLCMNCR
+ *
+ * Some hardware uses registers called PULSEx instead of FCKSEL_E and QTSEL_E
+ * to control the clock divider used between the High-Speed Peripheral Clock
+ * and the FLCTL internal clock. If so, use CLK_8_BIT_xxx for connecting 8 bit
+ * and CLK_16_BIT_xxx for connecting 16 bit bus bandwith NAND chips. For the 16
+ * bit version the divider is seperate for the pulse width of high and low
+ * signals.
+ */
+#define PULSE3 (0x1 << 27)
+#define PULSE2 (0x1 << 17)
+#define PULSE1 (0x1 << 15)
+#define PULSE0 (0x1 << 9)
+#define CLK_8_BIT_0_5HP PULSE1
+#define CLK_8_BIT_1HP 0x0
+#define CLK_8_BIT_1_5HP (PULSE1 | PULSE2)
+#define CLK_8_BIT_2HP PULSE0
+#define CLK_8_BIT_3HP (PULSE0 | PULSE1 | PULSE2)
+#define CLK_8_BIT_4HP (PULSE0 | PULSE2)
+#define CLK_16_BIT_6HP_LOW_2HP_HIGH PULSE0
+#define CLK_16_BIT_9HP_LOW_3HP_HIGH (PULSE0 | PULSE1 | PULSE2)
+#define CLK_16_BIT_12HP_LOW_4HP_HIGH (PULSE0 | PULSE2)
+
/* FLCMDCR control bits */
#define ADRCNT2_E (0x1 << 31) /* 5byte address enable */
#define ADRMD_E (0x1 << 26) /* Sector address access */
--
1.7.5.4
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 2/7] mtd: sh_flctl: Reorder empty_fifo() calls
2012-02-08 12:16 [PATCH 1/7] mtd: sh_flctl: Update FLCMNCR register bit field Bastian Hecht
@ 2012-02-08 12:16 ` Bastian Hecht
2012-02-08 12:16 ` [PATCH 3/7] mtd: sh_flctl: Expand the READID command to 8 bytes Bastian Hecht
` (4 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Bastian Hecht @ 2012-02-08 12:16 UTC (permalink / raw)
To: linux-mtd, linux-sh; +Cc: Bastian Hecht, magnus.damm, laurent.pinchart
Reorders the calls to make it a bit shorter and match the calling
procedure displayed in the datasheet.
Signed-off-by: Bastian Hecht <hechtb@gmail.com>
---
drivers/mtd/nand/sh_flctl.c | 4 +---
1 files changed, 1 insertions(+), 3 deletions(-)
diff --git a/drivers/mtd/nand/sh_flctl.c b/drivers/mtd/nand/sh_flctl.c
index 93b1f74..8c97367 100644
--- a/drivers/mtd/nand/sh_flctl.c
+++ b/drivers/mtd/nand/sh_flctl.c
@@ -525,7 +525,6 @@ static void flctl_cmdfunc(struct mtd_info *mtd, unsigned int command,
execmd_read_page_sector(mtd, page_addr);
break;
}
- empty_fifo(flctl);
if (flctl->page_size)
set_cmd_regs(mtd, command, (NAND_CMD_READSTART << 8)
| command);
@@ -547,7 +546,6 @@ static void flctl_cmdfunc(struct mtd_info *mtd, unsigned int command,
break;
}
- empty_fifo(flctl);
if (flctl->page_size) {
set_cmd_regs(mtd, command, (NAND_CMD_READSTART << 8)
| NAND_CMD_READ0);
@@ -560,7 +558,6 @@ static void flctl_cmdfunc(struct mtd_info *mtd, unsigned int command,
goto read_normal_exit;
case NAND_CMD_READID:
- empty_fifo(flctl);
set_cmd_regs(mtd, command, command);
set_addr(mtd, 0, 0);
@@ -654,6 +651,7 @@ static void flctl_cmdfunc(struct mtd_info *mtd, unsigned int command,
read_normal_exit:
writel(flctl->read_bytes, FLDTCNTR(flctl)); /* set read size */
+ empty_fifo(flctl);
start_translation(flctl);
read_fiforeg(flctl, flctl->read_bytes, 0);
wait_completion(flctl);
--
1.7.5.4
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 3/7] mtd: sh_flctl: Expand the READID command to 8 bytes
2012-02-08 12:16 [PATCH 1/7] mtd: sh_flctl: Update FLCMNCR register bit field Bastian Hecht
2012-02-08 12:16 ` [PATCH 2/7] mtd: sh_flctl: Reorder empty_fifo() calls Bastian Hecht
@ 2012-02-08 12:16 ` Bastian Hecht
2012-02-08 12:16 ` [PATCH 4/7] mtd: sh_flctl: Implement NAND_CMD_RNDOUT command Bastian Hecht
` (3 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Bastian Hecht @ 2012-02-08 12:16 UTC (permalink / raw)
To: linux-mtd, linux-sh; +Cc: Bastian Hecht, magnus.damm, laurent.pinchart
The nand base code wants to read out 8 bytes in the READID command.
Reflect this in the driver code.
Signed-off-by: Bastian Hecht <hechtb@gmail.com>
---
drivers/mtd/nand/sh_flctl.c | 13 ++++++++++---
1 files changed, 10 insertions(+), 3 deletions(-)
diff --git a/drivers/mtd/nand/sh_flctl.c b/drivers/mtd/nand/sh_flctl.c
index 8c97367..407acb5 100644
--- a/drivers/mtd/nand/sh_flctl.c
+++ b/drivers/mtd/nand/sh_flctl.c
@@ -320,6 +320,7 @@ static void set_cmd_regs(struct mtd_info *mtd, uint32_t cmd, uint32_t flcmcdr_va
break;
case NAND_CMD_READID:
flcmncr_val &= ~SNAND_E;
+ flcmdcr_val |= CDSRC_E;
addr_len_bytes = ADRCNT_1;
break;
case NAND_CMD_STATUS:
@@ -559,12 +560,18 @@ static void flctl_cmdfunc(struct mtd_info *mtd, unsigned int command,
case NAND_CMD_READID:
set_cmd_regs(mtd, command, command);
- set_addr(mtd, 0, 0);
- flctl->read_bytes = 4;
+ /* READID is always performed using an 8-bit bus */
+ if (flctl->chip.options & NAND_BUSWIDTH_16)
+ column <<= 1;
+ set_addr(mtd, column, 0);
+
+ flctl->read_bytes = 8;
writel(flctl->read_bytes, FLDTCNTR(flctl)); /* set read size */
+ empty_fifo(flctl);
start_translation(flctl);
- read_datareg(flctl, 0); /* read and end */
+ read_fiforeg(flctl, flctl->read_bytes, 0);
+ wait_completion(flctl);
break;
case NAND_CMD_ERASE1:
--
1.7.5.4
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 4/7] mtd: sh_flctl: Implement NAND_CMD_RNDOUT command
2012-02-08 12:16 [PATCH 1/7] mtd: sh_flctl: Update FLCMNCR register bit field Bastian Hecht
2012-02-08 12:16 ` [PATCH 2/7] mtd: sh_flctl: Reorder empty_fifo() calls Bastian Hecht
2012-02-08 12:16 ` [PATCH 3/7] mtd: sh_flctl: Expand the READID command to 8 bytes Bastian Hecht
@ 2012-02-08 12:16 ` Bastian Hecht
2012-02-08 12:16 ` [PATCH 5/7] mtd: sh_flctl: Add FLHOLDCR register Bastian Hecht
` (2 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Bastian Hecht @ 2012-02-08 12:16 UTC (permalink / raw)
To: linux-mtd, linux-sh; +Cc: Bastian Hecht, magnus.damm, laurent.pinchart
Implements the command to seek and read in pages.
Signed-off-by: Bastian Hecht <hechtb@gmail.com>
---
drivers/mtd/nand/sh_flctl.c | 13 +++++++++++++
1 files changed, 13 insertions(+), 0 deletions(-)
diff --git a/drivers/mtd/nand/sh_flctl.c b/drivers/mtd/nand/sh_flctl.c
index 407acb5..5c3e71f 100644
--- a/drivers/mtd/nand/sh_flctl.c
+++ b/drivers/mtd/nand/sh_flctl.c
@@ -303,6 +303,7 @@ static void set_cmd_regs(struct mtd_info *mtd, uint32_t cmd, uint32_t flcmcdr_va
break;
case NAND_CMD_READ0:
case NAND_CMD_READOOB:
+ case NAND_CMD_RNDOUT:
addr_len_bytes = flctl->rw_ADRCNT;
flcmdcr_val |= CDSRC_E;
if (flctl->chip.options & NAND_BUSWIDTH_16)
@@ -558,6 +559,18 @@ static void flctl_cmdfunc(struct mtd_info *mtd, unsigned int command,
flctl->read_bytes = mtd->oobsize;
goto read_normal_exit;
+ case NAND_CMD_RNDOUT:
+ if (flctl->page_size)
+ set_cmd_regs(mtd, command, (NAND_CMD_RNDOUTSTART << 8)
+ | command);
+ else
+ set_cmd_regs(mtd, command, command);
+
+ set_addr(mtd, column, 0);
+
+ flctl->read_bytes = mtd->writesize + mtd->oobsize - column;
+ goto read_normal_exit;
+
case NAND_CMD_READID:
set_cmd_regs(mtd, command, command);
--
1.7.5.4
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 5/7] mtd: sh_flctl: Add FLHOLDCR register
2012-02-08 12:16 [PATCH 1/7] mtd: sh_flctl: Update FLCMNCR register bit field Bastian Hecht
` (2 preceding siblings ...)
2012-02-08 12:16 ` [PATCH 4/7] mtd: sh_flctl: Implement NAND_CMD_RNDOUT command Bastian Hecht
@ 2012-02-08 12:16 ` Bastian Hecht
2012-02-08 12:16 ` [PATCH 6/7] mtd: sh_flctl: Add power management support Bastian Hecht
2012-02-08 12:16 ` [PATCH 7/7] ARM: mach-shmobile: mackerel: Add the flash controller flctl Bastian Hecht
5 siblings, 0 replies; 7+ messages in thread
From: Bastian Hecht @ 2012-02-08 12:16 UTC (permalink / raw)
To: linux-mtd, linux-sh; +Cc: Bastian Hecht, magnus.damm, laurent.pinchart
Add a register used in new FLCTL hardware and a feature flag for it.
Signed-off-by: Bastian Hecht <hechtb@gmail.com>
---
drivers/mtd/nand/sh_flctl.c | 3 +++
include/linux/mtd/sh_flctl.h | 12 ++++++++++++
2 files changed, 15 insertions(+), 0 deletions(-)
diff --git a/drivers/mtd/nand/sh_flctl.c b/drivers/mtd/nand/sh_flctl.c
index 5c3e71f..70ca40d 100644
--- a/drivers/mtd/nand/sh_flctl.c
+++ b/drivers/mtd/nand/sh_flctl.c
@@ -751,6 +751,8 @@ static int flctl_verify_buf(struct mtd_info *mtd, const u_char *buf, int len)
static void flctl_register_init(struct sh_flctl *flctl, unsigned long val)
{
writel(val, FLCMNCR(flctl));
+ if (flctl->holden)
+ writel(HOLDEN, FLHOLDCR(flctl));
}
static int flctl_chip_init_tail(struct mtd_info *mtd)
@@ -852,6 +854,7 @@ static int __devinit flctl_probe(struct platform_device *pdev)
flctl_mtd->priv = nand;
flctl->pdev = pdev;
flctl->hwecc = pdata->has_hwecc;
+ flctl->holden = pdata->use_holden;
flctl_register_init(flctl, pdata->flcmncr_val);
diff --git a/include/linux/mtd/sh_flctl.h b/include/linux/mtd/sh_flctl.h
index ecbf3e6..fc77017 100644
--- a/include/linux/mtd/sh_flctl.h
+++ b/include/linux/mtd/sh_flctl.h
@@ -38,6 +38,7 @@
#define FLDTFIFO(f) (f->reg + 0x24)
#define FLECFIFO(f) (f->reg + 0x28)
#define FLTRCR(f) (f->reg + 0x2C)
+#define FLHOLDCR(f) (f->reg + 0x38)
#define FL4ECCRESULT0(f) (f->reg + 0x80)
#define FL4ECCRESULT1(f) (f->reg + 0x84)
#define FL4ECCRESULT2(f) (f->reg + 0x88)
@@ -109,6 +110,15 @@
#define TRSTRT (0x1 << 0) /* translation start */
#define TREND (0x1 << 1) /* translation end */
+/*
+ * FLHOLDCR control bits
+ *
+ * HOLDEN: Bus Occupancy Enable (inverted)
+ * Enable this bit when the external bus might be used in between transfers.
+ * If not set and the bus gets used by other modules, a deadlock occurs.
+ */
+#define HOLDEN (0x1 << 0)
+
/* FL4ECCCR control bits */
#define _4ECCFA (0x1 << 2) /* 4 symbols correct fault */
#define _4ECCEND (0x1 << 1) /* 4 symbols end */
@@ -137,6 +147,7 @@ struct sh_flctl {
unsigned page_size:1; /* NAND page size (0 = 512, 1 = 2048) */
unsigned hwecc:1; /* Hardware ECC (0 = disabled, 1 = enabled) */
+ unsigned holden:1; /* Hardware has FLHOLDCR and HOLDEN is set */
};
struct sh_flctl_platform_data {
@@ -145,6 +156,7 @@ struct sh_flctl_platform_data {
unsigned long flcmncr_val;
unsigned has_hwecc:1;
+ unsigned use_holden:1;
};
static inline struct sh_flctl *mtd_to_flctl(struct mtd_info *mtdinfo)
--
1.7.5.4
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 6/7] mtd: sh_flctl: Add power management support
2012-02-08 12:16 [PATCH 1/7] mtd: sh_flctl: Update FLCMNCR register bit field Bastian Hecht
` (3 preceding siblings ...)
2012-02-08 12:16 ` [PATCH 5/7] mtd: sh_flctl: Add FLHOLDCR register Bastian Hecht
@ 2012-02-08 12:16 ` Bastian Hecht
2012-02-08 12:16 ` [PATCH 7/7] ARM: mach-shmobile: mackerel: Add the flash controller flctl Bastian Hecht
5 siblings, 0 replies; 7+ messages in thread
From: Bastian Hecht @ 2012-02-08 12:16 UTC (permalink / raw)
To: linux-mtd, linux-sh; +Cc: Bastian Hecht, magnus.damm, laurent.pinchart
Add pm support for global suspend/resume as well as for
runtime-suspend/-resume. All transactions with the NAND chip require a
chip enable signal. So we wrap the runtime_get()/put()s around it.
Signed-off-by: Bastian Hecht <hechtb@gmail.com>
---
drivers/mtd/nand/sh_flctl.c | 46 +++++++++++++++++++++++++++++++++++++----
include/linux/mtd/sh_flctl.h | 2 +
2 files changed, 43 insertions(+), 5 deletions(-)
diff --git a/drivers/mtd/nand/sh_flctl.c b/drivers/mtd/nand/sh_flctl.c
index 70ca40d..a0231dd 100644
--- a/drivers/mtd/nand/sh_flctl.c
+++ b/drivers/mtd/nand/sh_flctl.c
@@ -26,6 +26,7 @@
#include <linux/delay.h>
#include <linux/io.h>
#include <linux/platform_device.h>
+#include <linux/pm_runtime.h>
#include <linux/slab.h>
#include <linux/mtd/mtd.h>
@@ -515,6 +516,8 @@ static void flctl_cmdfunc(struct mtd_info *mtd, unsigned int command,
struct sh_flctl *flctl = mtd_to_flctl(mtd);
uint32_t read_cmd = 0;
+ BUG_ON(!flctl->power);
+
flctl->read_bytes = 0;
if (command != NAND_CMD_PAGEPROG)
flctl->index = 0;
@@ -681,14 +684,26 @@ read_normal_exit:
static void flctl_select_chip(struct mtd_info *mtd, int chipnr)
{
struct sh_flctl *flctl = mtd_to_flctl(mtd);
- uint32_t flcmncr_val = readl(FLCMNCR(flctl));
+ uint32_t flcmncr_val;
switch (chipnr) {
case -1:
+ flcmncr_val = readl(FLCMNCR(flctl));
flcmncr_val &= ~CE0_ENABLE;
writel(flcmncr_val, FLCMNCR(flctl));
+
+ if (flctl->power) {
+ pm_runtime_put_sync(&flctl->pdev->dev);
+ flctl->power = 0;
+ }
break;
case 0:
+ if (!flctl->power) {
+ pm_runtime_get_sync(&flctl->pdev->dev);
+ flctl->power = 1;
+ udelay(1); /* registers read 0 without delay */
+ }
+ flcmncr_val = readl(FLCMNCR(flctl));
flcmncr_val |= CE0_ENABLE;
writel(flcmncr_val, FLCMNCR(flctl));
break;
@@ -815,6 +830,20 @@ static int flctl_chip_init_tail(struct mtd_info *mtd)
return 0;
}
+static int flctl_reinitialize(struct device *dev)
+{
+ struct sh_flctl *flctl = dev_get_drvdata(dev);
+ udelay(1);
+ flctl_register_init(flctl, flctl->flcmncr_val);
+
+ return 0;
+}
+
+static const struct dev_pm_ops flctl_dev_pm_ops = {
+ .resume = flctl_reinitialize,
+ .runtime_resume = flctl_reinitialize,
+};
+
static int __devinit flctl_probe(struct platform_device *pdev)
{
struct resource *res;
@@ -853,9 +882,13 @@ static int __devinit flctl_probe(struct platform_device *pdev)
nand = &flctl->chip;
flctl_mtd->priv = nand;
flctl->pdev = pdev;
+ flctl->flcmncr_val = pdata->flcmncr_val;
flctl->hwecc = pdata->has_hwecc;
flctl->holden = pdata->use_holden;
+ pm_runtime_enable(&pdev->dev);
+ pm_runtime_resume(&pdev->dev);
+
flctl_register_init(flctl, pdata->flcmncr_val);
nand->options = NAND_NO_AUTOINCR;
@@ -878,20 +911,21 @@ static int __devinit flctl_probe(struct platform_device *pdev)
ret = nand_scan_ident(flctl_mtd, 1, NULL);
if (ret)
- goto err;
+ goto chip_err;
ret = flctl_chip_init_tail(flctl_mtd);
if (ret)
- goto err;
+ goto chip_err;
ret = nand_scan_tail(flctl_mtd);
if (ret)
- goto err;
+ goto chip_err;
mtd_device_register(flctl_mtd, pdata->parts, pdata->nr_parts);
return 0;
-
+chip_err:
+ pm_runtime_disable(&pdev->dev);
err:
kfree(flctl);
return ret;
@@ -902,6 +936,7 @@ static int __devexit flctl_remove(struct platform_device *pdev)
struct sh_flctl *flctl = platform_get_drvdata(pdev);
nand_release(&flctl->mtd);
+ pm_runtime_disable(&pdev->dev);
kfree(flctl);
return 0;
@@ -912,6 +947,7 @@ static struct platform_driver flctl_driver = {
.driver = {
.name = "sh_flctl",
.owner = THIS_MODULE,
+ .pm = &flctl_dev_pm_ops,
},
};
diff --git a/include/linux/mtd/sh_flctl.h b/include/linux/mtd/sh_flctl.h
index fc77017..bdef1b9 100644
--- a/include/linux/mtd/sh_flctl.h
+++ b/include/linux/mtd/sh_flctl.h
@@ -145,9 +145,11 @@ struct sh_flctl {
int hwecc_cant_correct[4];
+ unsigned long flcmncr_val;
unsigned page_size:1; /* NAND page size (0 = 512, 1 = 2048) */
unsigned hwecc:1; /* Hardware ECC (0 = disabled, 1 = enabled) */
unsigned holden:1; /* Hardware has FLHOLDCR and HOLDEN is set */
+ unsigned power:1; /* RTPM flag */
};
struct sh_flctl_platform_data {
--
1.7.5.4
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 7/7] ARM: mach-shmobile: mackerel: Add the flash controller flctl
2012-02-08 12:16 [PATCH 1/7] mtd: sh_flctl: Update FLCMNCR register bit field Bastian Hecht
` (4 preceding siblings ...)
2012-02-08 12:16 ` [PATCH 6/7] mtd: sh_flctl: Add power management support Bastian Hecht
@ 2012-02-08 12:16 ` Bastian Hecht
5 siblings, 0 replies; 7+ messages in thread
From: Bastian Hecht @ 2012-02-08 12:16 UTC (permalink / raw)
To: linux-mtd, linux-sh; +Cc: Bastian Hecht, magnus.damm, laurent.pinchart
Add board and clock setup code for the SH Mobile flctl controller.
Signed-off-by: Bastian Hecht <hechtb@gmail.com>
---
arch/arm/mach-shmobile/board-mackerel.c | 71 +++++++++++++++++++++++++++++++
arch/arm/mach-shmobile/clock-sh7372.c | 4 +-
2 files changed, 74 insertions(+), 1 deletions(-)
diff --git a/arch/arm/mach-shmobile/board-mackerel.c b/arch/arm/mach-shmobile/board-mackerel.c
index 9c5e598..136b3cb 100644
--- a/arch/arm/mach-shmobile/board-mackerel.c
+++ b/arch/arm/mach-shmobile/board-mackerel.c
@@ -39,6 +39,7 @@
#include <linux/mtd/mtd.h>
#include <linux/mtd/partitions.h>
#include <linux/mtd/physmap.h>
+#include <linux/mtd/sh_flctl.h>
#include <linux/pm_clock.h>
#include <linux/smsc911x.h>
#include <linux/sh_intc.h>
@@ -994,6 +995,50 @@ static struct platform_device fsi_ak4643_device = {
.name = "sh_fsi2_a_ak4643",
};
+/* FLCTL */
+static struct mtd_partition nand_partition_info[] = {
+ {
+ .name = "system",
+ .offset = 0,
+ .size = 128 * 1024 * 1024,
+ },
+ {
+ .name = "userdata",
+ .offset = MTDPART_OFS_APPEND,
+ .size = 256 * 1024 * 1024,
+ },
+ {
+ .name = "cache",
+ .offset = MTDPART_OFS_APPEND,
+ .size = 128 * 1024 * 1024,
+ },
+};
+
+static struct resource nand_flash_resources[] = {
+ [0] = {
+ .start = 0xe6a30000,
+ .end = 0xe6a3009b,
+ .flags = IORESOURCE_MEM,
+ }
+};
+
+static struct sh_flctl_platform_data nand_flash_data = {
+ .parts = nand_partition_info,
+ .nr_parts = ARRAY_SIZE(nand_partition_info),
+ .flcmncr_val = CLK_16_BIT_12HP_LOW_4HP_HIGH | TYPESEL_SET
+ | SHBUSSEL | SEL_16BIT | SNAND_E,
+ .use_holden = 1,
+};
+
+static struct platform_device nand_flash_device = {
+ .name = "sh_flctl",
+ .resource = nand_flash_resources,
+ .num_resources = ARRAY_SIZE(nand_flash_resources),
+ .dev = {
+ .platform_data = &nand_flash_data,
+ },
+};
+
/*
* The card detect pin of the top SD/MMC slot (CN7) is active low and is
* connected to GPIO A22 of SH7372 (GPIO_PORT41).
@@ -1306,6 +1351,7 @@ static struct platform_device *mackerel_devices[] __initdata = {
&fsi_device,
&fsi_ak4643_device,
&fsi_hdmi_device,
+ &nand_flash_device,
&sdhi0_device,
#if !defined(CONFIG_MMC_SH_MMCIF) && !defined(CONFIG_MMC_SH_MMCIF_MODULE)
&sdhi1_device,
@@ -1558,6 +1604,30 @@ static void __init mackerel_init(void)
gpio_request(GPIO_FN_MMCCMD0, NULL);
gpio_request(GPIO_FN_MMCCLK0, NULL);
+ /* FLCTL */
+ gpio_request(GPIO_FN_D0_NAF0, NULL);
+ gpio_request(GPIO_FN_D1_NAF1, NULL);
+ gpio_request(GPIO_FN_D2_NAF2, NULL);
+ gpio_request(GPIO_FN_D3_NAF3, NULL);
+ gpio_request(GPIO_FN_D4_NAF4, NULL);
+ gpio_request(GPIO_FN_D5_NAF5, NULL);
+ gpio_request(GPIO_FN_D6_NAF6, NULL);
+ gpio_request(GPIO_FN_D7_NAF7, NULL);
+ gpio_request(GPIO_FN_D8_NAF8, NULL);
+ gpio_request(GPIO_FN_D9_NAF9, NULL);
+ gpio_request(GPIO_FN_D10_NAF10, NULL);
+ gpio_request(GPIO_FN_D11_NAF11, NULL);
+ gpio_request(GPIO_FN_D12_NAF12, NULL);
+ gpio_request(GPIO_FN_D13_NAF13, NULL);
+ gpio_request(GPIO_FN_D14_NAF14, NULL);
+ gpio_request(GPIO_FN_D15_NAF15, NULL);
+ gpio_request(GPIO_FN_FCE0, NULL);
+ gpio_request(GPIO_FN_WE0_FWE, NULL);
+ gpio_request(GPIO_FN_FRB, NULL);
+ gpio_request(GPIO_FN_A4_FOE, NULL);
+ gpio_request(GPIO_FN_A5_FCDE, NULL);
+ gpio_request(GPIO_FN_RD_FSC, NULL);
+
/* enable GPS module (GT-720F) */
gpio_request(GPIO_FN_SCIFA2_TXD1, NULL);
gpio_request(GPIO_FN_SCIFA2_RXD1, NULL);
@@ -1602,6 +1672,7 @@ static void __init mackerel_init(void)
sh7372_add_device_to_domain(&sh7372_a4mp, &fsi_device);
sh7372_add_device_to_domain(&sh7372_a3sp, &usbhs0_device);
sh7372_add_device_to_domain(&sh7372_a3sp, &usbhs1_device);
+ sh7372_add_device_to_domain(&sh7372_a3sp, &nand_flash_device);
sh7372_add_device_to_domain(&sh7372_a3sp, &sh_mmcif_device);
sh7372_add_device_to_domain(&sh7372_a3sp, &sdhi0_device);
#if !defined(CONFIG_MMC_SH_MMCIF) && !defined(CONFIG_MMC_SH_MMCIF_MODULE)
diff --git a/arch/arm/mach-shmobile/clock-sh7372.c b/arch/arm/mach-shmobile/clock-sh7372.c
index 995a9c3..99dd283 100644
--- a/arch/arm/mach-shmobile/clock-sh7372.c
+++ b/arch/arm/mach-shmobile/clock-sh7372.c
@@ -511,7 +511,7 @@ enum { MSTP001, MSTP000,
MSTP223,
MSTP218, MSTP217, MSTP216, MSTP214, MSTP208, MSTP207,
MSTP206, MSTP205, MSTP204, MSTP203, MSTP202, MSTP201, MSTP200,
- MSTP328, MSTP323, MSTP322, MSTP314, MSTP313, MSTP312,
+ MSTP328, MSTP323, MSTP322, MSTP315, MSTP314, MSTP313, MSTP312,
MSTP423, MSTP415, MSTP413, MSTP411, MSTP410, MSTP407, MSTP406,
MSTP405, MSTP404, MSTP403, MSTP400,
MSTP_NR };
@@ -553,6 +553,7 @@ static struct clk mstp_clks[MSTP_NR] = {
[MSTP328] = MSTP(&div6_clks[DIV6_SPU], SMSTPCR3, 28, 0), /* FSI2 */
[MSTP323] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR3, 23, 0), /* IIC1 */
[MSTP322] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR3, 22, 0), /* USB0 */
+ [MSTP315] = MSTP(&div4_clks[DIV4_HP], SMSTPCR3, 15, 0), /* FLCTL*/
[MSTP314] = MSTP(&div4_clks[DIV4_HP], SMSTPCR3, 14, 0), /* SDHI0 */
[MSTP313] = MSTP(&div4_clks[DIV4_HP], SMSTPCR3, 13, 0), /* SDHI1 */
[MSTP312] = MSTP(&div4_clks[DIV4_HP], SMSTPCR3, 12, 0), /* MMC */
@@ -653,6 +654,7 @@ static struct clk_lookup lookups[] = {
CLKDEV_DEV_ID("r8a66597_hcd.0", &mstp_clks[MSTP322]), /* USB0 */
CLKDEV_DEV_ID("r8a66597_udc.0", &mstp_clks[MSTP322]), /* USB0 */
CLKDEV_DEV_ID("renesas_usbhs.0", &mstp_clks[MSTP322]), /* USB0 */
+ CLKDEV_DEV_ID("sh_flctl.0", &mstp_clks[MSTP315]), /* FLCTL */
CLKDEV_DEV_ID("sh_mobile_sdhi.0", &mstp_clks[MSTP314]), /* SDHI0 */
CLKDEV_DEV_ID("sh_mobile_sdhi.1", &mstp_clks[MSTP313]), /* SDHI1 */
CLKDEV_DEV_ID("sh_mmcif.0", &mstp_clks[MSTP312]), /* MMC */
--
1.7.5.4
^ permalink raw reply related [flat|nested] 7+ messages in thread
end of thread, other threads:[~2012-02-08 12:16 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-02-08 12:16 [PATCH 1/7] mtd: sh_flctl: Update FLCMNCR register bit field Bastian Hecht
2012-02-08 12:16 ` [PATCH 2/7] mtd: sh_flctl: Reorder empty_fifo() calls Bastian Hecht
2012-02-08 12:16 ` [PATCH 3/7] mtd: sh_flctl: Expand the READID command to 8 bytes Bastian Hecht
2012-02-08 12:16 ` [PATCH 4/7] mtd: sh_flctl: Implement NAND_CMD_RNDOUT command Bastian Hecht
2012-02-08 12:16 ` [PATCH 5/7] mtd: sh_flctl: Add FLHOLDCR register Bastian Hecht
2012-02-08 12:16 ` [PATCH 6/7] mtd: sh_flctl: Add power management support Bastian Hecht
2012-02-08 12:16 ` [PATCH 7/7] ARM: mach-shmobile: mackerel: Add the flash controller flctl Bastian Hecht
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).