On Tue, Dec 09, 2008 at 05:29:49PM -0800, David Brownell wrote:
> On Tuesday 09 December 2008, Felipe Balbi wrote:
> > +struct davinci_nand_info {
> > +       /* device lock */
> > +       spinlock_t              lock;
> > +       struct nand_chip        chip;
> > +       struct mtd_info         mtd;
> >  
> > -/*
> > - * MTD structure for DaVinici board
> > - */
> > -static struct mtd_info *nand_davinci_mtd;
> > +       struct device           *dev;
> > +       struct clk              *clk;
> > +
> > +       void __iomem            *base;
> > +       void __iomem            *vaddr;
> > +};
> > +
> > +#define to_davinci_nand(m) container_of(m, struct davinci_nand_info, mtd)
> 
> Minor nit:  put "mtd" first and this becomes a NOP by the
> time code generation completes, so code is a bit smaller
> and register pressure is a bit less.

didn't quite get it. You mean:

#define to_davinci_nand(mtd) container_of(mtd, struct davinci_nand_info, mtd)

or something else ?!?

> Could you briefly explain why the spinlock is needed?
> Just for the HW ECC support, or is there more to it?
> 
> Most NAND drivers don't use them internally ... if
> this really needs a spinlock, say why.  I suspect
> that you don't need one either, or at least you don't
> need one everywhere it's now used.

Yeah, think it's not necessary. Will try it out without it and see how
it behaves.

> > @@ -287,7 +319,7 @@ static int nand_davinci_memory_bbt(struct mtd_info
> > *mtd, from += blocksize;
> >         }
> >  
> > -       printk(KERN_NOTICE "Bad block scan: %d out of %d blocks are bad.\n",
> > +       dev_dbg(info->dev, "Bad block scan: %d out of %d blocks are bad.\n",
> >                           mtd->ecc_stats.badblocks, numblocks>>1);  
> >         return 0;
> 
> I'd think that should be dev_notice().  And ... dev_*() changes do NOT
> relate to $SUBJECT.  Such messaging patches would better be split out
> from this patch... which is already kind of large.

Sure, will split a that out ;-)

> > @@ -408,10 +451,13 @@ static void nand_davinci_set_eccbytes(struct 
> > nand_chip *chip)
> > #endif 
> >  }
> >  
> > -static void __devinit nand_davinci_flash_init(void)
> > +static void __devinit nand_davinci_flash_init(struct davinci_nand_info 
> > *info) {
> > +       unsigned long flags;
> >         u32 regval, tmp;
> >  
> > +       spin_lock_irqsave(&info->lock, flags);
> > +
> >         /* Check for correct pin mux, reconfigure if necessary */
> >         tmp = davinci_readl(DAVINCI_SYSTEM_MODULE_BASE + PINMUX0);
> 
> Didn't you say you were wondering why this driver misbhaves on dm355?
> 
> That's part of the clue!  PINMUX0 on dm355 is for video stuff; I
> think it's PINMUX2 that's for AEMIF.  This driver is assuming that
> it's on a dm6446, I bet.  (Not that it should ever do pinmuxing
> directly, in any case...)
> 
> There's work afoot to generalize the pinmux stuff; not sure when
> it'll arrive with dm355 support.

Great catch :-)

I think muxing should be done by board support, not driver. Didn't
remove not to break what was already there. Hah, might be that running
this driver, breaks video then :-p

That's fun.

-- 
balbi

_______________________________________________
Davinci-linux-open-source mailing list
[email protected]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source

Reply via email to