[PATCH v3 2/2] mtd: fsl-quadspi: Fix module unbound

Brian Norris computersforpeace at gmail.com
Fri Jan 9 12:17:43 PST 2015


OK, I still don't think you've got things right here.

Are you testing this with a two-flash system? What sort of tests?

On Wed, Jan 07, 2015 at 08:32:07AM -0200, Fabio Estevam wrote:
...
> diff --git a/drivers/mtd/spi-nor/fsl-quadspi.c b/drivers/mtd/spi-nor/fsl-quadspi.c
> index 20cffd2..ddb955a 100644
> --- a/drivers/mtd/spi-nor/fsl-quadspi.c
> +++ b/drivers/mtd/spi-nor/fsl-quadspi.c
> @@ -661,7 +661,7 @@ MODULE_DEVICE_TABLE(of, fsl_qspi_dt_ids);
>  
>  static void fsl_qspi_set_base_addr(struct fsl_qspi *q, struct spi_nor *nor)
>  {
> -	q->chip_base_addr = q->nor_size * (nor - q->nor);
> +	q->chip_base_addr = q->nor_size * q->nor_num;

This function is called from the 'prepare' function, so it may be called
for *different* NOR devices, and it's called for each flash transaction,
not just at boot time. Now, you're making the base address into a fixed
constant for all NOR flashes attached to this controller. That's wrong.

So you need an index associated with each NOR, not just the "total
number of NOR flash" (i.e., q->nor_size). That's currently satisfied by
the pointer subtraction on the ->nor[] array.

>  }
>  
>  static int fsl_qspi_read_reg(struct spi_nor *nor, u8 opcode, u8 *buf, int len)
...

Brian



More information about the linux-mtd mailing list