All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mike Rapoport <mike@compulab.co.il>
To: eric.miao@marvell.com
Cc: linux-mtd@lists.infradead.org,
	linux-arm-kernel@lists.arm.linux.org.uk, ben-linux@fluff.org
Subject: Re: [PATCH] MTD: NAND: pxa3xx_nand: add ability to keep controller settings defined by OBM/bootloader
Date: Thu, 22 Jan 2009 09:06:45 +0200	[thread overview]
Message-ID: <49781B05.4050902@compulab.co.il> (raw)
In-Reply-To: <1232436828-15176-4-git-send-email-mike@compulab.co.il>

Eric,
Any comments?

Mike Rapoport wrote:
> Signed-off-by: Mike Rapoport <mike@compulab.co.il>
> ---
>  arch/arm/mach-pxa/include/mach/pxa3xx_nand.h |    3 +
>  drivers/mtd/nand/pxa3xx_nand.c               |  103 +++++++++++++++++++++++++-
>  2 files changed, 105 insertions(+), 1 deletions(-)
> 
> diff --git a/arch/arm/mach-pxa/include/mach/pxa3xx_nand.h b/arch/arm/mach-pxa/include/mach/pxa3xx_nand.h
> index eb35fca..3478eae 100644
> --- a/arch/arm/mach-pxa/include/mach/pxa3xx_nand.h
> +++ b/arch/arm/mach-pxa/include/mach/pxa3xx_nand.h
> @@ -49,6 +49,9 @@ struct pxa3xx_nand_platform_data {
>  	 */
>  	int	enable_arbiter;
>  
> +	/* allow platform code to keep OBM/bootloader defined NFC config */
> +	int	keep_config;
> +
>  	const struct mtd_partition		*parts;
>  	unsigned int				nr_parts;
>  
> diff --git a/drivers/mtd/nand/pxa3xx_nand.c b/drivers/mtd/nand/pxa3xx_nand.c
> index ead4a7a..2857a6a 100644
> --- a/drivers/mtd/nand/pxa3xx_nand.c
> +++ b/drivers/mtd/nand/pxa3xx_nand.c
> @@ -171,7 +171,13 @@ static int use_dma = 1;
>  module_param(use_dma, bool, 0444);
>  MODULE_PARM_DESC(use_dma, "enable DMA for data transfering to/from NAND HW");
>  
> -#ifdef CONFIG_MTD_NAND_PXA3xx_BUILTIN
> +/*
> + * Default NAND flash controller configuration setup by the
> + * bootloader. This configuration is used only when pdata->keep_config is set
> + */
> +static struct pxa3xx_nand_timing default_timing;
> +static struct pxa3xx_nand_flash default_flash;
> +
>  static struct pxa3xx_nand_cmdset smallpage_cmdset = {
>  	.read1		= 0x0000,
>  	.read2		= 0x0050,
> @@ -198,6 +204,7 @@ static struct pxa3xx_nand_cmdset largepage_cmdset = {
>  	.lock_status	= 0x007A,
>  };
>  
> +#ifdef CONFIG_MTD_NAND_PXA3xx_BUILTIN
>  static struct pxa3xx_nand_timing samsung512MbX16_timing = {
>  	.tCH	= 10,
>  	.tCS	= 0,
> @@ -297,9 +304,23 @@ static struct pxa3xx_nand_flash *builtin_flash_types[] = {
>  #define NDTR1_tWHR(c)	(min((c), 15) << 4)
>  #define NDTR1_tAR(c)	(min((c), 15) << 0)
>  
> +#define tCH_NDTR0(r)	(((r) >> 19) & 0x7)
> +#define tCS_NDTR0(r)	(((r) >> 16) & 0x7)
> +#define tWH_NDTR0(r)	(((r) >> 11) & 0x7)
> +#define tWP_NDTR0(r)	(((r) >> 8) & 0x7)
> +#define tRH_NDTR0(r)	(((r) >> 3) & 0x7)
> +#define tRP_NDTR0(r)	(((r) >> 0) & 0x7)
> +
> +#define tR_NDTR1(r)	(((r) >> 16) & 0xffff)
> +#define tWHR_NDTR1(r)	(((r) >> 4) & 0xf)
> +#define tAR_NDTR1(r)	(((r) >> 0) & 0xf)
> +
>  /* convert nano-seconds to nand flash controller clock cycles */
>  #define ns2cycle(ns, clk)	(int)(((ns) * (clk / 1000000) / 1000) - 1)
>  
> +/* convert nand flash controller clock cycles to nano-seconds */
> +#define cycle2ns(c, clk)	((((c) + 1) * 1000000 + clk / 500) / (clk / 1000))
> +
>  static void pxa3xx_nand_set_timing(struct pxa3xx_nand_info *info,
>  				   const struct pxa3xx_nand_timing *t)
>  {
> @@ -921,6 +942,82 @@ static int pxa3xx_nand_config_flash(struct pxa3xx_nand_info *info,
>  	return 0;
>  }
>  
> +static void pxa3xx_nand_detect_timing(struct pxa3xx_nand_info *info,
> +				      struct pxa3xx_nand_timing *t)
> +{
> +	unsigned long nand_clk = clk_get_rate(info->clk);
> +	uint32_t ndtr0 = nand_readl(info, NDTR0CS0);
> +	uint32_t ndtr1 = nand_readl(info, NDTR1CS0);
> +
> +	t->tCH = cycle2ns(tCH_NDTR0(ndtr0), nand_clk);
> +	t->tCS = cycle2ns(tCS_NDTR0(ndtr0), nand_clk);
> +	t->tWH = cycle2ns(tWH_NDTR0(ndtr0), nand_clk);
> +	t->tWP = cycle2ns(tWP_NDTR0(ndtr0), nand_clk);
> +	t->tRH = cycle2ns(tRH_NDTR0(ndtr0), nand_clk);
> +	t->tRP = cycle2ns(tRP_NDTR0(ndtr0), nand_clk);
> +
> +	t->tR = cycle2ns(tR_NDTR1(ndtr1), nand_clk);
> +	t->tWHR = cycle2ns(tWHR_NDTR1(ndtr1), nand_clk);
> +	t->tAR = cycle2ns(tAR_NDTR1(ndtr1), nand_clk);
> +}
> +
> +static int pxa3xx_nand_detect_config(struct pxa3xx_nand_info *info)
> +{
> +	uint32_t ndcr = nand_readl(info, NDCR);
> +	struct nand_flash_dev *type = NULL;
> +	uint32_t id = -1;
> +	int i;
> +
> +	default_flash.page_per_block = ndcr & NDCR_PG_PER_BLK ? 64 : 32;
> +	default_flash.page_size = ndcr & NDCR_PAGE_SZ ? 2048 : 512;
> +	default_flash.flash_width = ndcr & NDCR_DWIDTH_M ? 16 : 8;
> +	default_flash.dfc_width = ndcr & NDCR_DWIDTH_C ? 16 : 8;
> +
> +	if (default_flash.page_size == 2048)
> +		default_flash.cmdset = &largepage_cmdset;
> +	else
> +		default_flash.cmdset = &smallpage_cmdset;
> +
> +	/* set info fields needed to __readid */
> +	info->flash_info = &default_flash;
> +	info->read_id_bytes = (default_flash.page_size == 2048) ? 4 : 2;
> +	info->reg_ndcr = ndcr;
> +
> +	if (__readid(info, &id))
> +		return -ENODEV;
> +
> +	/* Lookup the flash id */
> +	id = (id >> 8) & 0xff;		/* device id is byte 2 */
> +	for (i = 0; nand_flash_ids[i].name != NULL; i++) {
> +		if (id == nand_flash_ids[i].id) {
> +			type =  &nand_flash_ids[i];
> +			break;
> +		}
> +	}
> +
> +	if (!type)
> +		return -ENODEV;
> +
> +	/* fill the missing flash information */
> +	i = __ffs(default_flash.page_per_block * default_flash.page_size);
> +	default_flash.num_blocks = type->chipsize << (20 - i);
> +
> +	info->oob_size = (default_flash.page_size == 2048) ? 64 : 16;
> +
> +	/* calculate addressing information */
> +	info->col_addr_cycles = (default_flash.page_size == 2048) ? 2 : 1;
> +
> +	if (default_flash.num_blocks * default_flash.page_per_block > 65536)
> +		info->row_addr_cycles = 3;
> +	else
> +		info->row_addr_cycles = 2;
> +
> +	pxa3xx_nand_detect_timing(info, &default_timing);
> +	default_flash.timing = &default_timing;
> +
> +	return 0;
> +}
> +
>  static int pxa3xx_nand_detect_flash(struct pxa3xx_nand_info *info,
>  				    const struct pxa3xx_nand_platform_data *pdata)
>  {
> @@ -928,6 +1025,10 @@ static int pxa3xx_nand_detect_flash(struct pxa3xx_nand_info *info,
>  	uint32_t id = -1;
>  	int i;
>  
> +	if (pdata->keep_config)
> +		if (pxa3xx_nand_detect_config(info) == 0)
> +			return 0;
> +
>  	for (i = 0; i<pdata->num_flash; ++i) {
>  		f = pdata->flash + i;
>  

-- 
Sincerely yours,
Mike.

  reply	other threads:[~2009-01-22  7:06 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-01-19 11:27 [PATCH] MTD: NAND: pxa3xx_nand: allow building as module Mike Rapoport
2009-01-19 11:40 ` Ben Dooks
2009-01-20  3:16   ` Eric Miao
2009-01-20  7:21     ` Mike Rapoport
2009-01-20  7:33     ` Mike Rapoport
2009-01-20  7:33       ` [PATCH] MTD: NAND: pxa3xx_nand: use resource_size instead of 'r->end - r->start + 1' Mike Rapoport
2009-01-20  7:33         ` [PATCH] MTD: NAND: pxa3xx_nand: allow building as module Mike Rapoport
2009-01-20  7:33           ` [PATCH] MTD: NAND: pxa3xx_nand: add ability to keep controller settings defined by OBM/bootloader Mike Rapoport
2009-01-22  7:06             ` Mike Rapoport [this message]
2009-01-22  8:03               ` Eric Miao
2009-01-20  9:01           ` [PATCH] MTD: NAND: pxa3xx_nand: allow building as module Eric Miao
2009-01-20  9:01         ` [PATCH] MTD: NAND: pxa3xx_nand: use resource_size instead of 'r->end - r->start + 1' Eric Miao
  -- strict thread matches above, loose matches on Subject: below --
2009-02-17 11:54 pxa3xx_nand improvements Mike Rapoport
2009-02-17 11:54 ` [PATCH] MTD: NAND: pxa3xx_nand: add ability to keep controller settings defined by OBM/bootloader Mike Rapoport

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=49781B05.4050902@compulab.co.il \
    --to=mike@compulab.co.il \
    --cc=ben-linux@fluff.org \
    --cc=eric.miao@marvell.com \
    --cc=linux-arm-kernel@lists.arm.linux.org.uk \
    --cc=linux-mtd@lists.infradead.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.