From: Lars-Peter Clausen <lars@metafoo.de>
To: "driver linux-mtd"@lists.infradead.org
Cc: linux-mips@linux-mips.org, linux-kernel@vger.kernel.org,
David Woodhouse <dwmw2@infradead.org>,
Ralf Baechle <ralf@linux-mips.org>
Subject: Re: [PATCH v2 17/26] MTD: Nand: Add JZ4740 NAND
Date: Mon, 05 Jul 2010 00:35:01 +0200 [thread overview]
Message-ID: <4C310C95.1090902@metafoo.de> (raw)
In-Reply-To: <1276924111-11158-18-git-send-email-lars@metafoo.de>
Hi
Any comments?
Thanks
- Lars
Lars-Peter Clausen wrote:
> This patch adds support for the NAND controller on JZ4740 SoCs.
>
> Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
> Cc: David Woodhouse <dwmw2@infradead.org>
> Cc: linux-mtd@lists.infradead.org
>
> ---
> Changes since v1
> - JZ4740: Remove debug macro
> - Fix platform driver remove callback
> - Add custom nand read/write callback since we need to support more then 64 ecc
> bytes
> ---
> drivers/mtd/nand/Kconfig | 6 +
> drivers/mtd/nand/Makefile | 1 +
> drivers/mtd/nand/jz4740_nand.c | 474 +++++++++++++++++++++++++++++++++++++++
> include/linux/mtd/jz4740_nand.h | 34 +++
> 4 files changed, 515 insertions(+), 0 deletions(-)
> create mode 100644 drivers/mtd/nand/jz4740_nand.c
> create mode 100644 include/linux/mtd/jz4740_nand.h
>
> diff --git a/drivers/mtd/nand/Kconfig b/drivers/mtd/nand/Kconfig
> index ffc3720..362d177 100644
> --- a/drivers/mtd/nand/Kconfig
> +++ b/drivers/mtd/nand/Kconfig
> @@ -526,4 +526,10 @@ config MTD_NAND_NUC900
> This enables the driver for the NAND Flash on evaluation board based
> on w90p910 / NUC9xx.
>
> +config MTD_NAND_JZ4740
> + tristate "Support for JZ4740 SoC NAND controller"
> + depends on MACH_JZ4740
> + help
> + Enables support for NAND Flash on JZ4740 SoC based boards.
> +
> endif # MTD_NAND
> diff --git a/drivers/mtd/nand/Makefile b/drivers/mtd/nand/Makefile
> index e8ab884..ac83dcd 100644
> --- a/drivers/mtd/nand/Makefile
> +++ b/drivers/mtd/nand/Makefile
> @@ -46,5 +46,6 @@ obj-$(CONFIG_MTD_NAND_NOMADIK) += nomadik_nand.o
> obj-$(CONFIG_MTD_NAND_BCM_UMI) += bcm_umi_nand.o nand_bcm_umi.o
> obj-$(CONFIG_MTD_NAND_MPC5121_NFC) += mpc5121_nfc.o
> obj-$(CONFIG_MTD_NAND_RICOH) += r852.o
> +obj-$(CONFIG_MTD_NAND_JZ4740) += jz4740_nand.o
>
> nand-objs := nand_base.o nand_bbt.o
> diff --git a/drivers/mtd/nand/jz4740_nand.c b/drivers/mtd/nand/jz4740_nand.c
> new file mode 100644
> index 0000000..8c55f8a
> --- /dev/null
> +++ b/drivers/mtd/nand/jz4740_nand.c
> @@ -0,0 +1,474 @@
> +/*
> + * Copyright (C) 2009-2010, Lars-Peter Clausen <lars@metafoo.de>
> + * JZ4740 SoC NAND controller driver
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU General Public License as published by the
> + * Free Software Foundation; either version 2 of the License, or (at your
> + * option) any later version.
> + *
> + * You should have received a copy of the GNU General Public License along
> + * with this program; if not, write to the Free Software Foundation, Inc.,
> + * 675 Mass Ave, Cambridge, MA 02139, USA.
> + *
> + */
> +
> +#include <linux/ioport.h>
> +#include <linux/kernel.h>
> +#include <linux/module.h>
> +#include <linux/platform_device.h>
> +#include <linux/slab.h>
> +
> +#include <linux/mtd/mtd.h>
> +#include <linux/mtd/nand.h>
> +#include <linux/mtd/partitions.h>
> +
> +#include <linux/mtd/jz4740_nand.h>
> +#include <linux/gpio.h>
> +
> +#define JZ_REG_NAND_CTRL 0x50
> +#define JZ_REG_NAND_ECC_CTRL 0x100
> +#define JZ_REG_NAND_DATA 0x104
> +#define JZ_REG_NAND_PAR0 0x108
> +#define JZ_REG_NAND_PAR1 0x10C
> +#define JZ_REG_NAND_PAR2 0x110
> +#define JZ_REG_NAND_IRQ_STAT 0x114
> +#define JZ_REG_NAND_IRQ_CTRL 0x118
> +#define JZ_REG_NAND_ERR(x) (0x11C + (x << 2))
> +
> +#define JZ_NAND_ECC_CTRL_PAR_READY BIT(4)
> +#define JZ_NAND_ECC_CTRL_ENCODING BIT(3)
> +#define JZ_NAND_ECC_CTRL_RS BIT(2)
> +#define JZ_NAND_ECC_CTRL_RESET BIT(1)
> +#define JZ_NAND_ECC_CTRL_ENABLE BIT(0)
> +
> +#define JZ_NAND_STATUS_ERR_COUNT (BIT(31) | BIT(30) | BIT(29))
> +#define JZ_NAND_STATUS_PAD_FINISH BIT(4)
> +#define JZ_NAND_STATUS_DEC_FINISH BIT(3)
> +#define JZ_NAND_STATUS_ENC_FINISH BIT(2)
> +#define JZ_NAND_STATUS_UNCOR_ERROR BIT(1)
> +#define JZ_NAND_STATUS_ERROR BIT(0)
> +
> +#define JZ_NAND_CTRL_ENABLE_CHIP(x) BIT(x << 1)
> +#define JZ_NAND_CTRL_ASSERT_CHIP(x) BIT((x << 1) + 1)
> +
> +#define JZ_NAND_DATA_ADDR ((void __iomem *)0xB8000000)
> +#define JZ_NAND_CMD_ADDR (JZ_NAND_DATA_ADDR + 0x8000)
> +#define JZ_NAND_ADDR_ADDR (JZ_NAND_DATA_ADDR + 0x10000)
> +
> +struct jz_nand {
> + struct mtd_info mtd;
> + struct nand_chip chip;
> + void __iomem *base;
> + struct resource *mem;
> +
> + struct jz_nand_platform_data *pdata;
> + bool is_reading;
> +};
> +
> +static inline struct jz_nand *mtd_to_jz_nand(struct mtd_info *mtd)
> +{
> + return container_of(mtd, struct jz_nand, mtd);
> +}
> +
> +static void jz_nand_cmd_ctrl(struct mtd_info *mtd, int dat, unsigned int ctrl)
> +{
> + struct jz_nand *nand = mtd_to_jz_nand(mtd);
> + struct nand_chip *chip = mtd->priv;
> + uint32_t reg;
> +
> + if (ctrl & NAND_CTRL_CHANGE) {
> + BUG_ON((ctrl & NAND_ALE) && (ctrl & NAND_CLE));
> + if (ctrl & NAND_ALE)
> + chip->IO_ADDR_W = JZ_NAND_ADDR_ADDR;
> + else if (ctrl & NAND_CLE)
> + chip->IO_ADDR_W = JZ_NAND_CMD_ADDR;
> + else
> + chip->IO_ADDR_W = JZ_NAND_DATA_ADDR;
> +
> + reg = readl(nand->base + JZ_REG_NAND_CTRL);
> + if (ctrl & NAND_NCE)
> + reg |= JZ_NAND_CTRL_ASSERT_CHIP(0);
> + else
> + reg &= ~JZ_NAND_CTRL_ASSERT_CHIP(0);
> + writel(reg, nand->base + JZ_REG_NAND_CTRL);
> + }
> + if (dat != NAND_CMD_NONE)
> + writeb(dat, chip->IO_ADDR_W);
> +}
> +
> +static int jz_nand_dev_ready(struct mtd_info *mtd)
> +{
> + struct jz_nand *nand = mtd_to_jz_nand(mtd);
> + return gpio_get_value_cansleep(nand->pdata->busy_gpio);
> +}
> +
> +static void jz_nand_hwctl(struct mtd_info *mtd, int mode)
> +{
> + struct jz_nand *nand = mtd_to_jz_nand(mtd);
> + uint32_t reg;
> +
> + writel(0, nand->base + JZ_REG_NAND_IRQ_STAT);
> + reg = readl(nand->base + JZ_REG_NAND_ECC_CTRL);
> +
> + reg |= JZ_NAND_ECC_CTRL_RESET;
> + reg |= JZ_NAND_ECC_CTRL_ENABLE;
> + reg |= JZ_NAND_ECC_CTRL_RS;
> +
> + switch (mode) {
> + case NAND_ECC_READ:
> + reg &= ~JZ_NAND_ECC_CTRL_ENCODING;
> + nand->is_reading = true;
> + break;
> + case NAND_ECC_WRITE:
> + reg |= JZ_NAND_ECC_CTRL_ENCODING;
> + nand->is_reading = false;
> + break;
> + default:
> + break;
> + }
> +
> + writel(reg, nand->base + JZ_REG_NAND_ECC_CTRL);
> +}
> +
> +static int jz_nand_calculate_ecc_rs(struct mtd_info *mtd, const uint8_t *dat,
> + uint8_t *ecc_code)
> +{
> + struct jz_nand *nand = mtd_to_jz_nand(mtd);
> + uint32_t reg, status;
> + int i;
> + static uint8_t empty_block_ecc[] = {0xcd, 0x9d, 0x90, 0x58, 0xf4,
> + 0x8b, 0xff, 0xb7, 0x6f};
> +
> + if (nand->is_reading)
> + return 0;
> +
> + do {
> + status = readl(nand->base + JZ_REG_NAND_IRQ_STAT);
> + } while (!(status & JZ_NAND_STATUS_ENC_FINISH));
> +
> + reg = readl(nand->base + JZ_REG_NAND_ECC_CTRL);
> + reg &= ~JZ_NAND_ECC_CTRL_ENABLE;
> + writel(reg, nand->base + JZ_REG_NAND_ECC_CTRL);
> +
> + for (i = 0; i < 9; ++i)
> + ecc_code[i] = readb(nand->base + JZ_REG_NAND_PAR0 + i);
> +
> + /* If the written data is completly 0xff, we also want to write 0xff as
> + * ecc, otherwise we will get in trouble when doing subpage writes. */
> + if (memcmp(ecc_code, empty_block_ecc, 9) == 0)
> + memset(ecc_code, 0xff, 9);
> +
> + return 0;
> +}
> +
> +static void correct_data(uint8_t *dat, int index, int mask)
> +{
> + int offset = index & 0x7;
> + uint16_t data;
> +
> + index += (index >> 3);
> +
> + data = dat[index];
> + data |= dat[index+1] << 8;
> +
> + mask ^= (data >> offset) & 0x1ff;
> + data &= ~(0x1ff << offset);
> + data |= (mask << offset);
> +
> + dat[index] = data & 0xff;
> + dat[index+1] = (data >> 8) & 0xff;
> +}
> +
> +static int jz_nand_correct_ecc_rs(struct mtd_info *mtd, uint8_t *dat,
> + uint8_t *read_ecc, uint8_t *calc_ecc)
> +{
> + struct jz_nand *nand = mtd_to_jz_nand(mtd);
> + int i, error_count, index;
> + uint32_t reg, status, error;
> + uint32_t t;
> +
> + t = read_ecc[0];
> +
> + if (t == 0xff) {
> + for (i = 1; i < 9; ++i)
> + t &= read_ecc[i];
> +
> + t &= dat[0];
> + t &= dat[nand->chip.ecc.size / 2];
> + t &= dat[nand->chip.ecc.size - 1];
> +
> + if (t == 0xff) {
> + for (i = 1; i < nand->chip.ecc.size - 1; ++i)
> + t &= dat[i];
> + if (t == 0xff)
> + return 0;
> + }
> + }
> +
> + for (i = 0; i < 9; ++i)
> + writeb(read_ecc[i], nand->base + JZ_REG_NAND_PAR0 + i);
> +
> + reg = readl(nand->base + JZ_REG_NAND_ECC_CTRL);
> + reg |= JZ_NAND_ECC_CTRL_PAR_READY;
> + writel(reg, nand->base + JZ_REG_NAND_ECC_CTRL);
> +
> + do {
> + status = readl(nand->base + JZ_REG_NAND_IRQ_STAT);
> + } while (!(status & JZ_NAND_STATUS_DEC_FINISH));
> +
> + reg = readl(nand->base + JZ_REG_NAND_ECC_CTRL);
> + reg &= ~JZ_NAND_ECC_CTRL_ENABLE;
> + writel(reg, nand->base + JZ_REG_NAND_ECC_CTRL);
> +
> + if (status & JZ_NAND_STATUS_ERROR) {
> + if (status & JZ_NAND_STATUS_UNCOR_ERROR)
> + return -1;
> +
> + error_count = (status & JZ_NAND_STATUS_ERR_COUNT) >> 29;
> +
> + for (i = 0; i < error_count; ++i) {
> + error = readl(nand->base + JZ_REG_NAND_ERR(i));
> + index = ((error >> 16) & 0x1ff) - 1;
> + if (index >= 0 && index < 512)
> + correct_data(dat, index, error & 0x1ff);
> + }
> +
> + return error_count;
> + }
> +
> + return 0;
> +}
> +
> +
> +/* Copy paste of nand_read_page_hwecc_oob_first except for different eccpos
> + * handling. The ecc area is for 4k chips 72 bytes long and thus does not fit
> + * into the eccpos array. */
> +static int jz_nand_read_page_hwecc_oob_first(struct mtd_info *mtd,
> + struct nand_chip *chip, uint8_t *buf, int page)
> +{
> + int i, eccsize = chip->ecc.size;
> + int eccbytes = chip->ecc.bytes;
> + int eccsteps = chip->ecc.steps;
> + uint8_t *p = buf;
> + unsigned int ecc_offset = chip->page_shift;
> +
> + /* Read the OOB area first */
> + chip->cmdfunc(mtd, NAND_CMD_READOOB, 0, page);
> + chip->read_buf(mtd, chip->oob_poi, mtd->oobsize);
> + chip->cmdfunc(mtd, NAND_CMD_READ0, 0, page);
> +
> + for (i = ecc_offset; eccsteps; eccsteps--, i += eccbytes, p += eccsize) {
> + int stat;
> +
> + chip->ecc.hwctl(mtd, NAND_ECC_READ);
> + chip->read_buf(mtd, p, eccsize);
> +
> + stat = chip->ecc.correct(mtd, p, &chip->oob_poi[i], NULL);
> + if (stat < 0)
> + mtd->ecc_stats.failed++;
> + else
> + mtd->ecc_stats.corrected += stat;
> + }
> + return 0;
> +}
> +
> +/* Copy-and-paste of nand_write_page_hwecc with different eccpos handling. */
> +static void jz_nand_write_page_hwecc(struct mtd_info *mtd,
> + struct nand_chip *chip, const uint8_t *buf)
> +{
> + int i, eccsize = chip->ecc.size;
> + int eccbytes = chip->ecc.bytes;
> + int eccsteps = chip->ecc.steps;
> + const uint8_t *p = buf;
> + unsigned int ecc_offset = chip->page_shift;
> +
> + for (i = ecc_offset; eccsteps; eccsteps--, i += eccbytes, p += eccsize) {
> + chip->ecc.hwctl(mtd, NAND_ECC_WRITE);
> + chip->write_buf(mtd, p, eccsize);
> + chip->ecc.calculate(mtd, p, &chip->oob_poi[i]);
> + }
> +
> + chip->write_buf(mtd, chip->oob_poi, mtd->oobsize);
> +}
> +
> +#ifdef CONFIG_MTD_CMDLINE_PARTS
> +static const char *part_probes[] = {"cmdline", NULL};
> +#endif
> +
> +static int __devinit jz_nand_probe(struct platform_device *pdev)
> +{
> + int ret;
> + struct jz_nand *nand;
> + struct nand_chip *chip;
> + struct mtd_info *mtd;
> + struct jz_nand_platform_data *pdata = pdev->dev.platform_data;
> +#ifdef CONFIG_MTD_PARTITIONS
> + struct mtd_partition *partition_info;
> + int num_partitions = 0;
> +#endif
> +
> + nand = kzalloc(sizeof(*nand), GFP_KERNEL);
> + if (!nand) {
> + dev_err(&pdev->dev, "Failed to allocate device structure.\n");
> + return -ENOMEM;
> + }
> +
> + nand->mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> + if (!nand->mem) {
> + dev_err(&pdev->dev, "Failed to get platform mmio memory\n");
> + ret = -ENOENT;
> + goto err_free;
> + }
> +
> + nand->mem = request_mem_region(nand->mem->start,
> + resource_size(nand->mem), pdev->name);
> + if (!nand->mem) {
> + dev_err(&pdev->dev, "Failed to request mmio memory region\n");
> + ret = -EBUSY;
> + goto err_free;
> + }
> +
> + nand->base = ioremap(nand->mem->start, resource_size(nand->mem));
> + if (!nand->base) {
> + dev_err(&pdev->dev, "Failed to ioremap mmio memory region\n");
> + ret = -EBUSY;
> + goto err_release_mem;
> + }
> +
> + if (pdata && gpio_is_valid(pdata->busy_gpio)) {
> + ret = gpio_request(pdata->busy_gpio, "NAND busy pin");
> + if (ret) {
> + dev_err(&pdev->dev,
> + "Failed to request busy gpio %d: %d\n",
> + pdata->busy_gpio, ret);
> + goto err_iounmap;
> + }
> + }
> +
> + mtd = &nand->mtd;
> + chip = &nand->chip;
> + mtd->priv = chip;
> + mtd->owner = THIS_MODULE;
> + mtd->name = "jz4740-nand";
> +
> + chip->ecc.hwctl = jz_nand_hwctl;
> + chip->ecc.calculate = jz_nand_calculate_ecc_rs;
> + chip->ecc.correct = jz_nand_correct_ecc_rs;
> + chip->ecc.mode = NAND_ECC_HW_OOB_FIRST;
> + chip->ecc.size = 512;
> + chip->ecc.bytes = 9;
> +
> + chip->ecc.read_page = jz_nand_read_page_hwecc_oob_first;
> + chip->ecc.write_page = jz_nand_write_page_hwecc;
> +
> + if (pdata)
> + chip->ecc.layout = pdata->ecc_layout;
> +
> + chip->chip_delay = 50;
> + chip->cmd_ctrl = jz_nand_cmd_ctrl;
> +
> + if (pdata && gpio_is_valid(pdata->busy_gpio))
> + chip->dev_ready = jz_nand_dev_ready;
> +
> + chip->IO_ADDR_R = JZ_NAND_DATA_ADDR;
> + chip->IO_ADDR_W = JZ_NAND_DATA_ADDR;
> +
> + nand->pdata = pdata;
> + platform_set_drvdata(pdev, nand);
> +
> + ret = nand_scan_ident(mtd, 1, NULL);
> + if (ret) {
> + dev_err(&pdev->dev, "Failed to scan nand\n");
> + goto err_gpio_free;
> + }
> +
> + if (pdata && pdata->ident_callback) {
> + pdata->ident_callback(pdev, chip, &pdata->partitions,
> + &pdata->num_partitions);
> + }
> +
> + ret = nand_scan_tail(mtd);
> + if (ret) {
> + dev_err(&pdev->dev, "Failed to scan nand\n");
> + goto err_gpio_free;
> + }
> +
> +#ifdef CONFIG_MTD_PARTITIONS
> +#ifdef CONFIG_MTD_CMDLINE_PARTS
> + num_partitions = parse_mtd_partitions(mtd, part_probes,
> + &partition_info, 0);
> +#endif
> + if (num_partitions <= 0 && pdata) {
> + num_partitions = pdata->num_partitions;
> + partition_info = pdata->partitions;
> + }
> +
> + if (num_partitions > 0)
> + ret = add_mtd_partitions(mtd, partition_info, num_partitions);
> + else
> +#endif
> + ret = add_mtd_device(mtd);
> +
> + if (ret) {
> + dev_err(&pdev->dev, "Failed to add mtd device\n");
> + goto err_nand_release;
> + }
> +
> + dev_info(&pdev->dev, "Successfully registered JZ4740 NAND driver\n");
> +
> + return 0;
> +err_nand_release:
> + nand_release(&nand->mtd);
> +err_gpio_free:
> + platform_set_drvdata(pdev, NULL);
> + gpio_free(pdata->busy_gpio);
> +err_iounmap:
> + iounmap(nand->base);
> +err_release_mem:
> + release_mem_region(nand->mem->start, resource_size(nand->mem));
> +err_free:
> + kfree(nand);
> + return ret;
> +}
> +
> +static int __devexit jz_nand_remove(struct platform_device *pdev)
> +{
> + struct jz_nand *nand = platform_get_drvdata(pdev);
> +
> + nand_release(&nand->mtd);
> +
> + iounmap(nand->base);
> + release_mem_region(nand->mem->start, resource_size(nand->mem));
> +
> + platform_set_drvdata(pdev, NULL);
> + kfree(nand);
> +
> + return 0;
> +}
> +
> +struct platform_driver jz_nand_driver = {
> + .probe = jz_nand_probe,
> + .remove = __devexit_p(jz_nand_remove),
> + .driver = {
> + .name = "jz4740-nand",
> + .owner = THIS_MODULE,
> + },
> +};
> +
> +static int __init jz_nand_init(void)
> +{
> + return platform_driver_register(&jz_nand_driver);
> +}
> +module_init(jz_nand_init);
> +
> +static void __exit jz_nand_exit(void)
> +{
> + platform_driver_unregister(&jz_nand_driver);
> +}
> +module_exit(jz_nand_exit);
> +
> +MODULE_LICENSE("GPL");
> +MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>");
> +MODULE_DESCRIPTION("NAND controller driver for JZ4740 SoC");
> +MODULE_ALIAS("platform:jz4740-nand");
> diff --git a/include/linux/mtd/jz4740_nand.h b/include/linux/mtd/jz4740_nand.h
> new file mode 100644
> index 0000000..379f9b6
> --- /dev/null
> +++ b/include/linux/mtd/jz4740_nand.h
> @@ -0,0 +1,34 @@
> +/*
> + * Copyright (C) 2009-2010, Lars-Peter Clausen <lars@metafoo.de>
> + * JZ4740 SoC NAND controller driver
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU General Public License as published by the
> + * Free Software Foundation; either version 2 of the License, or (at your
> + * option) any later version.
> + *
> + * You should have received a copy of the GNU General Public License along
> + * with this program; if not, write to the Free Software Foundation, Inc.,
> + * 675 Mass Ave, Cambridge, MA 02139, USA.
> + *
> + */
> +
> +#ifndef __JZ_NAND_H__
> +#define __JZ_NAND_H__
> +
> +#include <linux/mtd/nand.h>
> +#include <linux/mtd/partitions.h>
> +
> +struct jz_nand_platform_data {
> + int num_partitions;
> + struct mtd_partition *partitions;
> +
> + struct nand_ecclayout *ecc_layout;
> +
> + unsigned int busy_gpio;
> +
> + void (*ident_callback)(struct platform_device *, struct nand_chip *,
> + struct mtd_partition **, int *num_partitions);
> +};
> +
> +#endif
next prev parent reply other threads:[~2010-07-04 22:35 UTC|newest]
Thread overview: 163+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-06-19 5:08 [PATCH v2 00/26] Add support for the Ingenic JZ4740 System-on-a-Chip Lars-Peter Clausen
2010-06-19 5:08 ` [lm-sensors] [PATCH v2 00/26] Add support for the Ingenic JZ4740 Lars-Peter Clausen
2010-06-19 5:08 ` [PATCH v2 00/26] Add support for the Ingenic JZ4740 System-on-a-Chip Lars-Peter Clausen
2010-06-19 5:08 ` Lars-Peter Clausen
2010-06-19 5:08 ` [PATCH v2 01/26] MIPS: Add base support for " Lars-Peter Clausen
2010-06-19 5:08 ` [PATCH v2 02/26] MIPS: jz4740: Add IRQ handler code Lars-Peter Clausen
2010-07-17 12:08 ` [PATCH v3] " Lars-Peter Clausen
2010-06-19 5:08 ` [PATCH v2 03/26] MIPS: JZ4740: Add clock API support Lars-Peter Clausen
2010-06-28 1:24 ` [PATCH v3 " Lars-Peter Clausen
2010-07-17 12:10 ` [PATCH v4] " Lars-Peter Clausen
2010-06-19 5:08 ` [PATCH v2 04/26] MIPS: JZ4740: Add timer support Lars-Peter Clausen
2010-06-19 5:08 ` [PATCH v2 05/26] MIPS: JZ4740: Add clocksource/clockevent support Lars-Peter Clausen
2010-06-19 5:08 ` [PATCH v2 06/26] MIPS: JZ4740: Add power-management and system reset support Lars-Peter Clausen
2010-06-19 5:08 ` [PATCH v2 07/26] MIPS: JZ4740: Add setup code Lars-Peter Clausen
2010-06-19 5:08 ` [PATCH v2 08/26] MIPS: JZ4740: Add gpio support Lars-Peter Clausen
2010-07-17 12:11 ` [PATCH v3] " Lars-Peter Clausen
2010-06-19 5:08 ` [PATCH v2 09/26] MIPS: JZ4740: Add DMA support Lars-Peter Clausen
2010-06-19 5:08 ` [PATCH v2 10/26] MIPS: JZ4740: Add PWM support Lars-Peter Clausen
2010-06-28 1:23 ` [PATCH v3 " Lars-Peter Clausen
2010-07-17 12:12 ` [PATCH v4] " Lars-Peter Clausen
2010-06-19 5:08 ` [PATCH v2 11/26] MIPS: JZ4740: Add serial support Lars-Peter Clausen
2010-06-19 5:08 ` [PATCH v2 12/26] MIPS: JZ4740: Add prom support Lars-Peter Clausen
2010-06-19 5:08 ` [PATCH v2 13/26] MIPS: JZ4740: Add platform devices Lars-Peter Clausen
2010-07-17 12:13 ` [PATCH v3] " Lars-Peter Clausen
2010-06-19 5:08 ` [PATCH v2 14/26] MIPS: JZ4740: Add Kbuild files Lars-Peter Clausen
2010-06-19 5:08 ` [PATCH v2 15/26] RTC: Add JZ4740 RTC driver Lars-Peter Clausen
2010-06-19 10:43 ` Marek Vasut
2010-06-19 13:05 ` Lars-Peter Clausen
2010-06-19 13:37 ` Wan ZongShun
2010-06-19 13:53 ` Lars-Peter Clausen
2010-06-19 14:36 ` Wan ZongShun
2010-06-19 14:04 ` Marek Vasut
2010-06-19 17:42 ` Lars-Peter Clausen
2010-06-19 17:53 ` Geert Uytterhoeven
2010-06-19 19:29 ` [PATCH v3] " Lars-Peter Clausen
2010-06-20 1:13 ` [rtc-linux] " Wan ZongShun
2010-06-20 1:23 ` Lars-Peter Clausen
2010-06-20 1:30 ` Wan ZongShun
2010-06-22 5:53 ` Alessandro Zummo
2010-06-19 5:08 ` [PATCH v2 16/26] fbdev: Add JZ4740 framebuffer driver Lars-Peter Clausen
2010-06-19 5:08 ` Lars-Peter Clausen
2010-07-04 22:27 ` Lars-Peter Clausen
2010-07-04 22:27 ` Lars-Peter Clausen
2010-07-07 23:41 ` Andrew Morton
2010-07-07 23:41 ` Andrew Morton
2010-07-08 13:28 ` Lars-Peter Clausen
2010-07-08 13:28 ` Lars-Peter Clausen
2010-07-08 16:46 ` Andrew Morton
2010-07-08 16:46 ` Andrew Morton
2010-07-09 1:26 ` Jaya Kumar
2010-07-09 1:26 ` Jaya Kumar
2010-07-09 15:31 ` Lars-Peter Clausen
2010-07-09 15:31 ` Lars-Peter Clausen
2010-07-17 12:14 ` [PATCH v3] " Lars-Peter Clausen
2010-07-17 12:14 ` Lars-Peter Clausen
2010-06-19 5:08 ` [PATCH v2 17/26] MTD: Nand: Add JZ4740 NAND driver Lars-Peter Clausen
2010-06-19 5:08 ` Lars-Peter Clausen
2010-07-04 22:35 ` Lars-Peter Clausen [this message]
2010-07-08 6:06 ` Artem Bityutskiy
2010-07-08 6:06 ` Artem Bityutskiy
2010-07-08 13:20 ` Lars-Peter Clausen
2010-07-08 13:20 ` Lars-Peter Clausen
2010-07-08 13:19 ` Artem Bityutskiy
2010-07-08 13:19 ` Artem Bityutskiy
2010-07-08 14:02 ` Lars-Peter Clausen
2010-07-08 14:02 ` Lars-Peter Clausen
2010-07-08 14:14 ` Artem Bityutskiy
2010-07-08 14:14 ` Artem Bityutskiy
2010-07-17 12:15 ` [PATCH v3] " Lars-Peter Clausen
2010-07-17 12:15 ` Lars-Peter Clausen
2010-07-18 16:54 ` Artem Bityutskiy
2010-07-18 16:54 ` Artem Bityutskiy
2010-07-18 17:02 ` Lars-Peter Clausen
2010-07-18 17:02 ` Lars-Peter Clausen
2010-06-19 5:08 ` [PATCH v2 18/26] MMC: Add JZ4740 mmc driver Lars-Peter Clausen
2010-06-19 14:46 ` Matt Fleming
2010-06-19 14:46 ` Matt Fleming
2010-06-19 14:46 ` Matt Fleming
2010-06-19 15:29 ` Lars-Peter Clausen
2010-06-28 1:20 ` [PATCH v3] " Lars-Peter Clausen
2010-06-29 20:17 ` Matt Fleming
2010-06-29 20:17 ` Matt Fleming
2010-06-29 20:17 ` Matt Fleming
2010-07-01 15:47 ` Lars-Peter Clausen
2010-06-30 20:55 ` Andrew Morton
2010-07-01 15:45 ` Lars-Peter Clausen
2010-07-12 21:33 ` [PATCH v4] " Lars-Peter Clausen
2010-07-12 21:41 ` Randy Dunlap
2010-07-12 22:07 ` Lars-Peter Clausen
2010-07-12 22:20 ` [PATCH v5] " Lars-Peter Clausen
2010-07-12 22:45 ` Joe Perches
2010-07-12 23:45 ` Lars-Peter Clausen
2010-07-15 21:06 ` [PATCH v6] " Lars-Peter Clausen
2010-07-15 21:16 ` Andrew Morton
2010-07-15 21:37 ` Lars-Peter Clausen
2010-06-19 5:08 ` [PATCH v2 19/26] USB: Add JZ4740 ohci support Lars-Peter Clausen
2010-06-19 17:17 ` Greg KH
2010-06-19 5:08 ` [PATCH v2 20/26] alsa: ASoC: Add JZ4740 codec driver Lars-Peter Clausen
2010-06-19 5:08 ` Lars-Peter Clausen
2010-06-19 14:49 ` [PATCH v3] " Lars-Peter Clausen
2010-06-19 14:49 ` Lars-Peter Clausen
2010-06-20 13:11 ` Mark Brown
2010-06-20 13:11 ` Mark Brown
2010-06-21 22:46 ` [PATCH v4] " Lars-Peter Clausen
2010-06-21 22:46 ` Lars-Peter Clausen
2010-06-22 10:12 ` Liam Girdwood
2010-06-22 10:12 ` Liam Girdwood
2010-06-22 23:12 ` Mark Brown
2010-06-22 23:12 ` Mark Brown
2010-06-19 5:08 ` [PATCH v2 21/26] alsa: ASoC: Add JZ4740 ASoC support Lars-Peter Clausen
2010-06-19 5:08 ` Lars-Peter Clausen
2010-06-19 14:50 ` [PATCH v3] " Lars-Peter Clausen
2010-06-19 14:50 ` Lars-Peter Clausen
2010-06-19 5:08 ` [PATCH v2 22/26] MFD: Add JZ4740 ADC driver Lars-Peter Clausen
2010-07-04 22:47 ` Lars-Peter Clausen
2010-07-05 14:53 ` Samuel Ortiz
2010-07-05 15:43 ` Lars-Peter Clausen
2010-07-05 15:53 ` Samuel Ortiz
2010-07-12 1:48 ` [PATCH v3] " Lars-Peter Clausen
2010-07-14 9:19 ` Samuel Ortiz
2010-06-19 5:08 ` [PATCH v2 23/26] hwmon: " Lars-Peter Clausen
2010-06-19 5:08 ` [lm-sensors] " Lars-Peter Clausen
2010-06-19 8:36 ` Jean Delvare
2010-06-19 8:36 ` Jean Delvare
2010-06-19 8:36 ` Jean Delvare
2010-06-19 12:58 ` Lars-Peter Clausen
2010-06-19 12:58 ` Lars-Peter Clausen
2010-06-19 14:47 ` [PATCH v3] " Lars-Peter Clausen
2010-06-19 14:47 ` [lm-sensors] " Lars-Peter Clausen
2010-06-19 16:24 ` Jean Delvare
2010-06-19 16:24 ` Jean Delvare
2010-06-19 17:59 ` Lars-Peter Clausen
2010-06-19 17:59 ` Lars-Peter Clausen
2010-06-19 19:32 ` [PATCH v4] " Lars-Peter Clausen
2010-06-19 19:32 ` [lm-sensors] " Lars-Peter Clausen
2010-06-20 6:32 ` Jean Delvare
2010-06-20 6:32 ` Jean Delvare
2010-06-20 6:32 ` Jean Delvare
2010-06-19 5:08 ` [PATCH v2 24/26] power: Add JZ4740 battery driver Lars-Peter Clausen
2010-06-27 1:58 ` Lars-Peter Clausen
2010-06-28 11:43 ` Anton Vorontsov
2010-06-19 5:08 ` [PATCH v2 25/26] MIPS: JZ4740: Add qi_lb60 board support Lars-Peter Clausen
2010-07-17 12:16 ` [PATCH v3] " Lars-Peter Clausen
2010-06-19 5:08 ` [PATCH v2 26/26] alsa: ASoC: JZ4740: Add qi_lb60 board driver Lars-Peter Clausen
2010-06-19 5:08 ` Lars-Peter Clausen
2010-06-19 14:52 ` [PATCH v3] " Lars-Peter Clausen
2010-06-19 14:52 ` Lars-Peter Clausen
2010-06-20 9:26 ` [PATCH v2 00/26] Add support for the Ingenic JZ4740 System-on-a-Chip Thomas Bogendoerfer
2010-06-20 9:26 ` [lm-sensors] [PATCH v2 00/26] Add support for the Ingenic Thomas Bogendoerfer
2010-06-20 9:26 ` [PATCH v2 00/26] Add support for the Ingenic JZ4740 System-on-a-Chip Thomas Bogendoerfer
2010-06-20 9:26 ` Thomas Bogendoerfer
2010-06-20 9:26 ` [PATCH v2 00/26] Add support for the Ingenic JZ4740 Thomas Bogendoerfer
2010-06-20 14:31 ` [PATCH v2 00/26] Add support for the Ingenic JZ4740 System-on-a-Chip Lars-Peter Clausen
2010-06-20 14:31 ` Lars-Peter Clausen
2010-06-20 16:34 ` Thomas Bogendoerfer
2010-06-20 16:49 ` Lars-Peter Clausen
2010-06-20 17:01 ` Thomas Bogendoerfer
2010-06-20 17:57 ` Florian Fainelli
2010-06-20 18:30 ` Lars-Peter Clausen
2010-06-21 2:56 ` Xiangfu Liu
2010-06-21 2:56 ` [lm-sensors] [PATCH v2 00/26] Add support for the Ingenic Xiangfu Liu
2010-06-21 2:56 ` [PATCH v2 00/26] Add support for the Ingenic JZ4740 System-on-a-Chip Xiangfu Liu
2010-06-21 2:56 ` Xiangfu Liu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4C310C95.1090902@metafoo.de \
--to=lars@metafoo.de \
--cc="driver linux-mtd"@lists.infradead.org \
--cc=dwmw2@infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mips@linux-mips.org \
--cc=ralf@linux-mips.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.