All of lore.kernel.org
 help / color / mirror / Atom feed
From: Anatolij Gustschin <agust@denx.de>
To: Timur Tabi <timur.tabi@gmail.com>
Cc: linux-fbdev@vger.kernel.org, wd@denx.de, dzu@denx.de,
	John Rigby <jrigby@gmail.com>,
	devicetree-discuss@lists.ozlabs.org, linuxppc-dev@ozlabs.org,
	yorksun@freescale.com
Subject: Re: [PATCH 3/5] powerpc/mpc5121: shared DIU framebuffer support
Date: Fri, 30 Apr 2010 10:19:47 +0000	[thread overview]
Message-ID: <20100430121947.1d265ca6@wker> (raw)
In-Reply-To: <s2ted82fe3e1004291905mf562f0cbi24054bb973aa2dbb@mail.gmail.com>

On Thu, 29 Apr 2010 21:05:26 -0500
Timur Tabi <timur.tabi@gmail.com> wrote:

> On Thu, Apr 29, 2010 at 6:49 PM, Anatolij Gustschin <agust@denx.de> wrote:
> 
> 
> > +void __init mpc5121_ads_init_early(void)
> > +{
> > +       mpc512x_init_diu();
> > +}
> > +
> >  define_machine(mpc5121_ads) {
> >        .name                   = "MPC5121 ADS",
> >        .probe                  = mpc5121_ads_probe,
> >        .setup_arch             = mpc5121_ads_setup_arch,
> >        .init                   = mpc512x_init,
> > +       .init_early             = mpc5121_ads_init_early,
> 
> How about just doing this?
> 
> .init_early             = mpc512x_init_diu,

I thought it should be prepared for adding other code here.
mpc5121_ads_init_early() is generic and could contain other
things as well. I would vote for current version.

> > +void __init mpc512x_generic_init_early(void)
> > +{
> > +       mpc512x_init_diu();
> > +}
> > +
> > +void __init mpc512x_generic_setup_arch(void)
> > +{
> > +       mpc512x_setup_diu();
> > +}
> > +
> >  define_machine(mpc5121_generic) {
> >        .name                   = "MPC5121 generic",
> >        .probe                  = mpc5121_generic_probe,
> >        .init                   = mpc512x_init,
> > +       .init_early             = mpc512x_generic_init_early,
> > +       .setup_arch             = mpc512x_generic_setup_arch,
> 
> And a similar change here.

Same here.

...
> > diff --git a/arch/powerpc/platforms/512x/mpc512x_shared.c b/arch/powerpc/platforms/512x/mpc512x_shared.c
> > index b7f518a..8e297fa 100644
> > --- a/arch/powerpc/platforms/512x/mpc512x_shared.c
> > +++ b/arch/powerpc/platforms/512x/mpc512x_shared.c
> > @@ -16,7 +16,11 @@
> >  #include <linux/io.h>
> >  #include <linux/irq.h>
> >  #include <linux/of_platform.h>
> > +#include <linux/fsl-diu-fb.h>
> > +#include <linux/bootmem.h>
> > +#include <sysdev/fsl_soc.h>
> >
> > +#include <asm/cacheflush.h>
> >  #include <asm/machdep.h>
> >  #include <asm/ipic.h>
> >  #include <asm/prom.h>
> > @@ -53,6 +57,286 @@ void mpc512x_restart(char *cmd)
> >                ;
> >  }
> >
> > +struct fsl_diu_shared_fb {
> > +       char            gamma[0x300];   /* 32-bit aligned! */
> 
> char or u8?

Will use u8.

> > +       struct diu_ad   ad0;            /* 32-bit aligned! */
> > +       phys_addr_t     fb_phys;
> > +       size_t          fb_len;
> > +       bool            in_use;
> > +};
> 
> Where did "bool" come from?  Use "int" instead.

It is common practise to use "bool" type, grep in drivers dir.

> > +unsigned int mpc512x_get_pixel_format(unsigned int bits_per_pixel,
> > +                                     int monitor_port)
> > +{
> > +       unsigned int pix_fmt;
> > +
> > +       switch (bits_per_pixel) {
> > +       case 32:
> > +               pix_fmt = 0x88883316;
> > +               break;
> > +       case 24:
> > +               pix_fmt = 0x88082219;
> > +               break;
> > +       case 16:
> > +               pix_fmt = 0x65053118;
> > +               break;
> > +       default:
> > +               pix_fmt = 0x00000400;
> > +       }
> > +       return pix_fmt;
> > +}
> 
> This is simpler:
> 
>        switch (bits_per_pixel) {
>        case 32:
>                return 0x88883316;
>        case 24:
>                return 0x88082219;
>        case 16:
>                return = 0x65053118;
>       }
> 
>       return 0x00000400;
> }

Will simplify as suggested, thanks!

> > +       ccm = of_iomap(np, 0);
> > +       if (!ccm) {
> > +               pr_err("Can't map clock control module reg.\n");
> > +               of_node_put(np);
> > +               return;
> > +       }
> > +       of_node_put(np);
> 
> This is simpler:
> 
>        ccm = of_iomap(np, 0);
>        of_node_put(np);
>        if (!ccm) {
>                pr_err("Can't map clock control module reg.\n");
>                return;
>        }

OK, will fix, thanks.

> 
> > +       np = of_find_node_by_type(NULL, "cpu");
> > +       if (np) {
> > +               unsigned int size;
> > +               const unsigned int *prop > > +                       of_get_property(np, "bus-frequency", &size);
> 
> Since you don't use 'size', you can skip it:
> 
>               const unsigned int *prop >                       of_get_property(np, "bus-frequency", NULL);
> 
> > +       } else {
> > +               pr_err("Can't find \"cpu\" node.\n");
> 
> 'cpu' is simpler than \"cpu\"

Will simplify, too.

> > +       /* Calculate the pixel clock with the smallest error */
> > +       /* calculate the following in steps to avoid overflow */
> > +       pr_debug("DIU pixclock in ps - %d\n", pixclock);
> > +       temp = (1000000000 / pixclock) * 1000;
> 
> I'm pretty sure the compiler will optimize this to:
> 
>     temp = (1000000000000UL / pixclock);
> 
> so you may as well do it that way.

??
1000000000000 is _not_ UL, but UUL.

> 
> > +       pixclock = temp;
> > +       pr_debug("DIU pixclock freq - %u\n", pixclock);
> > +
> > +       temp = (temp * 5) / 100; /* pixclock * 0.05 */
> 
> The compiler will optimize this to:
> 
>     temp /= 20;

Can do it, too. Thanks.

> > +       pr_debug("deviation = %d\n", temp);
> > +       minpixclock = pixclock - temp;
> > +       maxpixclock = pixclock + temp;
> > +       pr_debug("DIU minpixclock - %lu\n", minpixclock);
> > +       pr_debug("DIU maxpixclock - %lu\n", maxpixclock);
> > +       pixval = speed_ccb/pixclock;
> > +       pr_debug("DIU pixval = %lu\n", pixval);
> > +
> > +       err = 100000000;
> 
> Why do you assign err to this arbitrary value?

Dunno. It is Freescale's code and I do not have time to check
and understand each bit of it and to explain it.

> > +       bestval = pixval;
> > +       pr_debug("DIU bestval = %lu\n", bestval);
> > +
> > +       bestfreq = 0;
> > +       for (i = -1; i <= 1; i++) {
> > +               temp = speed_ccb / (pixval+i);
> > +               pr_debug("DIU test pixval i=%d, pixval=%lu, temp freq. = %u\n",
> > +                       i, pixval, temp);
> > +               if ((temp < minpixclock) || (temp > maxpixclock))
> > +                       pr_debug("DIU exceeds monitor range (%lu to %lu)\n",
> > +                               minpixclock, maxpixclock);
> > +               else if (abs(temp - pixclock) < err) {
> > +                       pr_debug("Entered the else if block %d\n", i);
> > +                       err = abs(temp - pixclock);
> > +                       bestval = pixval + i;
> > +                       bestfreq = temp;
> > +               }
> > +       }
> > +
> > +       pr_debug("DIU chose = %lx\n", bestval);
> > +       pr_debug("DIU error = %ld\n NomPixClk ", err);
> > +       pr_debug("DIU: Best Freq = %lx\n", bestfreq);
> > +       /* Modify DIU_DIV in CCM SCFR1 */
> > +       temp = in_be32(ccm + CCM_SCFR1);
> 
> Don't use offsets like + CCM_SCFR1.  Create a structure and use that instead.

Done in next patch version.

> > +       pr_debug("DIU: Current value of SCFR1: 0x%08x\n", temp);
> > +       temp &= ~DIU_DIV_MASK;
> > +       temp |= (bestval & DIU_DIV_MASK);
> > +       out_be32(ccm + CCM_SCFR1, temp);
> > +       pr_debug("DIU: Modified value of SCFR1: 0x%08x\n", temp);
> > +       iounmap(ccm);
> > +}
> > +
> > +ssize_t mpc512x_show_monitor_port(int monitor_port, char *buf)
> > +{
> > +       return snprintf(buf, PAGE_SIZE, "0 - 5121 LCD\n");
> 
> There's no point in using snprintf since you're printing a string
> literal.  You can use sprintf.

Will do, thanks.

> > +}
> > +
> > +int mpc512x_set_sysfs_monitor_port(int val)
> > +{
> > +       return 0;
> > +}
> > +
> > +static struct fsl_diu_shared_fb __attribute__ ((__aligned__(8))) diu_shared_fb;
> > +
> > +#if defined(CONFIG_FB_FSL_DIU) || \
> > +    defined(CONFIG_FB_FSL_DIU_MODULE)
> > +static inline void mpc512x_free_bootmem(struct page *page)
> > +{
> > +       __ClearPageReserved(page);
> > +       BUG_ON(PageTail(page));
> > +       BUG_ON(atomic_read(&page->_count) > 1);
> > +       atomic_set(&page->_count, 1);
> > +       __free_page(page);
> > +       totalram_pages++;
> > +}
> > +
> > +void mpc512x_release_bootmem(void)
> > +{
> > +       unsigned long addr = diu_shared_fb.fb_phys & PAGE_MASK;
> > +       unsigned long size = diu_shared_fb.fb_len;
> > +       unsigned long start, end;
> > +
> > +       if (diu_shared_fb.in_use) {
> > +               start = PFN_UP(addr);
> > +               end = PFN_DOWN(addr + size);
> > +
> > +               for (; start < end; start++)
> > +                       mpc512x_free_bootmem(pfn_to_page(start));
> > +
> > +               diu_shared_fb.in_use = false;
> > +       }
> > +       diu_ops.release_bootmem = NULL;
> > +}
> > +#endif
> 
> Do you really need to use reserve_bootmem?  Have you tried kmalloc or
> alloc_pages_exact()?

Yes. No, it is too early to use them here.

> > +
> > +/*
> > + * Check if DIU was pre-initialized. If so, perform steps
> > + * needed to continue displaying through the whole boot process.
> > + * Move area descriptor and gamma table elsewhere, they are
> > + * destroyed by bootmem allocator otherwise. The frame buffer
> > + * address range will be reserved in setup_arch() after bootmem
> > + * allocator is up.
> > + */
> > +void __init mpc512x_init_diu(void)
> > +{
> > +       struct device_node *np;
> > +       void __iomem *diu_reg;
> > +       phys_addr_t desc;
> > +       void __iomem *vaddr;
> > +       unsigned long mode, pix_fmt, res, bpp;
> > +       unsigned long dst;
> > +
> > +       np = of_find_compatible_node(NULL, NULL, "fsl,mpc5121-diu");
> > +       if (!np) {
> > +               pr_err("No DIU node\n");
> > +               return;
> > +       }
> 
> Shouldn't you be probing as an OF driver instead of manually searching
> for the DIU node?

No, not here.

> > +
> > +       diu_reg = of_iomap(np, 0);
> > +       of_node_put(np);
> > +       if (!diu_reg) {
> > +               pr_err("Can't map DIU\n");
> > +               return;
> > +       }
> > +
> > +       mode = in_be32(diu_reg + 0x1c);
> > +       if (mode != 1) {
> 
> How can in_be32() return a -1?

It is a 1, not -1. I will use appropriate macro here and also
change to use a struct instead of adding offset to register base.

Thanks for your review and comments!
Anatolij

WARNING: multiple messages have this Message-ID (diff)
From: Anatolij Gustschin <agust@denx.de>
To: Timur Tabi <timur.tabi@gmail.com>
Cc: linux-fbdev@vger.kernel.org, wd@denx.de, dzu@denx.de,
	John Rigby <jrigby@gmail.com>,
	devicetree-discuss@lists.ozlabs.org, linuxppc-dev@ozlabs.org,
	yorksun@freescale.com
Subject: Re: [PATCH 3/5] powerpc/mpc5121: shared DIU framebuffer support
Date: Fri, 30 Apr 2010 12:19:47 +0200	[thread overview]
Message-ID: <20100430121947.1d265ca6@wker> (raw)
In-Reply-To: <s2ted82fe3e1004291905mf562f0cbi24054bb973aa2dbb@mail.gmail.com>

On Thu, 29 Apr 2010 21:05:26 -0500
Timur Tabi <timur.tabi@gmail.com> wrote:

> On Thu, Apr 29, 2010 at 6:49 PM, Anatolij Gustschin <agust@denx.de> wrote:
>=20
>=20
> > +void __init mpc5121_ads_init_early(void)
> > +{
> > + =C2=A0 =C2=A0 =C2=A0 mpc512x_init_diu();
> > +}
> > +
> > =C2=A0define_machine(mpc5121_ads) {
> > =C2=A0 =C2=A0 =C2=A0 =C2=A0.name =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =3D "MPC5121 ADS",
> > =C2=A0 =C2=A0 =C2=A0 =C2=A0.probe =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0=3D mpc5121_ads_probe,
> > =C2=A0 =C2=A0 =C2=A0 =C2=A0.setup_arch =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =3D mpc5121_ads_setup_arch,
> > =C2=A0 =C2=A0 =C2=A0 =C2=A0.init =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =3D mpc512x_init,
> > + =C2=A0 =C2=A0 =C2=A0 .init_early =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =3D mpc5121_ads_init_early,
>=20
> How about just doing this?
>=20
> .init_early             =3D mpc512x_init_diu,

I thought it should be prepared for adding other code here.
mpc5121_ads_init_early() is generic and could contain other
things as well. I would vote for current version.

> > +void __init mpc512x_generic_init_early(void)
> > +{
> > + =C2=A0 =C2=A0 =C2=A0 mpc512x_init_diu();
> > +}
> > +
> > +void __init mpc512x_generic_setup_arch(void)
> > +{
> > + =C2=A0 =C2=A0 =C2=A0 mpc512x_setup_diu();
> > +}
> > +
> > =C2=A0define_machine(mpc5121_generic) {
> > =C2=A0 =C2=A0 =C2=A0 =C2=A0.name =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =3D "MPC5121 generic",
> > =C2=A0 =C2=A0 =C2=A0 =C2=A0.probe =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0=3D mpc5121_generic_probe,
> > =C2=A0 =C2=A0 =C2=A0 =C2=A0.init =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =3D mpc512x_init,
> > + =C2=A0 =C2=A0 =C2=A0 .init_early =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =3D mpc512x_generic_init_early,
> > + =C2=A0 =C2=A0 =C2=A0 .setup_arch =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =3D mpc512x_generic_setup_arch,
>=20
> And a similar change here.

Same here.

...
> > diff --git a/arch/powerpc/platforms/512x/mpc512x_shared.c b/arch/powerp=
c/platforms/512x/mpc512x_shared.c
> > index b7f518a..8e297fa 100644
> > --- a/arch/powerpc/platforms/512x/mpc512x_shared.c
> > +++ b/arch/powerpc/platforms/512x/mpc512x_shared.c
> > @@ -16,7 +16,11 @@
> > =C2=A0#include <linux/io.h>
> > =C2=A0#include <linux/irq.h>
> > =C2=A0#include <linux/of_platform.h>
> > +#include <linux/fsl-diu-fb.h>
> > +#include <linux/bootmem.h>
> > +#include <sysdev/fsl_soc.h>
> >
> > +#include <asm/cacheflush.h>
> > =C2=A0#include <asm/machdep.h>
> > =C2=A0#include <asm/ipic.h>
> > =C2=A0#include <asm/prom.h>
> > @@ -53,6 +57,286 @@ void mpc512x_restart(char *cmd)
> > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0;
> > =C2=A0}
> >
> > +struct fsl_diu_shared_fb {
> > + =C2=A0 =C2=A0 =C2=A0 char =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0ga=
mma[0x300]; =C2=A0 /* 32-bit aligned! */
>=20
> char or u8?

Will use u8.

> > + =C2=A0 =C2=A0 =C2=A0 struct diu_ad =C2=A0 ad0; =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0/* 32-bit aligned! */
> > + =C2=A0 =C2=A0 =C2=A0 phys_addr_t =C2=A0 =C2=A0 fb_phys;
> > + =C2=A0 =C2=A0 =C2=A0 size_t =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0fb_len;
> > + =C2=A0 =C2=A0 =C2=A0 bool =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0in=
_use;
> > +};
>=20
> Where did "bool" come from?  Use "int" instead.

It is common practise to use "bool" type, grep in drivers dir.

> > +unsigned int mpc512x_get_pixel_format(unsigned int bits_per_pixel,
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 int monitor_port)
> > +{
> > + =C2=A0 =C2=A0 =C2=A0 unsigned int pix_fmt;
> > +
> > + =C2=A0 =C2=A0 =C2=A0 switch (bits_per_pixel) {
> > + =C2=A0 =C2=A0 =C2=A0 case 32:
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 pix_fmt =3D 0x888833=
16;
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 break;
> > + =C2=A0 =C2=A0 =C2=A0 case 24:
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 pix_fmt =3D 0x880822=
19;
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 break;
> > + =C2=A0 =C2=A0 =C2=A0 case 16:
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 pix_fmt =3D 0x650531=
18;
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 break;
> > + =C2=A0 =C2=A0 =C2=A0 default:
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 pix_fmt =3D 0x000004=
00;
> > + =C2=A0 =C2=A0 =C2=A0 }
> > + =C2=A0 =C2=A0 =C2=A0 return pix_fmt;
> > +}
>=20
> This is simpler:
>=20
>        switch (bits_per_pixel) {
>        case 32:
>                return 0x88883316;
>        case 24:
>                return 0x88082219;
>        case 16:
>                return =3D 0x65053118;
>       }
>=20
>       return 0x00000400;
> }

Will simplify as suggested, thanks!

> > + =C2=A0 =C2=A0 =C2=A0 ccm =3D of_iomap(np, 0);
> > + =C2=A0 =C2=A0 =C2=A0 if (!ccm) {
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 pr_err("Can't map cl=
ock control module reg.\n");
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 of_node_put(np);
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 return;
> > + =C2=A0 =C2=A0 =C2=A0 }
> > + =C2=A0 =C2=A0 =C2=A0 of_node_put(np);
>=20
> This is simpler:
>=20
>        ccm =3D of_iomap(np, 0);
>        of_node_put(np);
>        if (!ccm) {
>                pr_err("Can't map clock control module reg.\n");
>                return;
>        }

OK, will fix, thanks.

>=20
> > + =C2=A0 =C2=A0 =C2=A0 np =3D of_find_node_by_type(NULL, "cpu");
> > + =C2=A0 =C2=A0 =C2=A0 if (np) {
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 unsigned int size;
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 const unsigned int *=
prop =3D
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 of_get_property(np, "bus-frequency", &size);
>=20
> Since you don't use 'size', you can skip it:
>=20
>               const unsigned int *prop =3D
>                       of_get_property(np, "bus-frequency", NULL);
>=20
> > + =C2=A0 =C2=A0 =C2=A0 } else {
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 pr_err("Can't find \=
"cpu\" node.\n");
>=20
> 'cpu' is simpler than \"cpu\"

Will simplify, too.

> > + =C2=A0 =C2=A0 =C2=A0 /* Calculate the pixel clock with the smallest e=
rror */
> > + =C2=A0 =C2=A0 =C2=A0 /* calculate the following in steps to avoid ove=
rflow */
> > + =C2=A0 =C2=A0 =C2=A0 pr_debug("DIU pixclock in ps - %d\n", pixclock);
> > + =C2=A0 =C2=A0 =C2=A0 temp =3D (1000000000 / pixclock) * 1000;
>=20
> I'm pretty sure the compiler will optimize this to:
>=20
>     temp =3D (1000000000000UL / pixclock);
>=20
> so you may as well do it that way.

??
1000000000000 is _not_ UL, but UUL.

>=20
> > + =C2=A0 =C2=A0 =C2=A0 pixclock =3D temp;
> > + =C2=A0 =C2=A0 =C2=A0 pr_debug("DIU pixclock freq - %u\n", pixclock);
> > +
> > + =C2=A0 =C2=A0 =C2=A0 temp =3D (temp * 5) / 100; /* pixclock * 0.05 */
>=20
> The compiler will optimize this to:
>=20
>     temp /=3D 20;

Can do it, too. Thanks.

> > + =C2=A0 =C2=A0 =C2=A0 pr_debug("deviation =3D %d\n", temp);
> > + =C2=A0 =C2=A0 =C2=A0 minpixclock =3D pixclock - temp;
> > + =C2=A0 =C2=A0 =C2=A0 maxpixclock =3D pixclock + temp;
> > + =C2=A0 =C2=A0 =C2=A0 pr_debug("DIU minpixclock - %lu\n", minpixclock);
> > + =C2=A0 =C2=A0 =C2=A0 pr_debug("DIU maxpixclock - %lu\n", maxpixclock);
> > + =C2=A0 =C2=A0 =C2=A0 pixval =3D speed_ccb/pixclock;
> > + =C2=A0 =C2=A0 =C2=A0 pr_debug("DIU pixval =3D %lu\n", pixval);
> > +
> > + =C2=A0 =C2=A0 =C2=A0 err =3D 100000000;
>=20
> Why do you assign err to this arbitrary value?

Dunno. It is Freescale's code and I do not have time to check
and understand each bit of it and to explain it.

> > + =C2=A0 =C2=A0 =C2=A0 bestval =3D pixval;
> > + =C2=A0 =C2=A0 =C2=A0 pr_debug("DIU bestval =3D %lu\n", bestval);
> > +
> > + =C2=A0 =C2=A0 =C2=A0 bestfreq =3D 0;
> > + =C2=A0 =C2=A0 =C2=A0 for (i =3D -1; i <=3D 1; i++) {
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 temp =3D speed_ccb /=
 (pixval+i);
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 pr_debug("DIU test p=
ixval i=3D%d, pixval=3D%lu, temp freq. =3D %u\n",
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 i, pixval, temp);
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if ((temp < minpixcl=
ock) || (temp > maxpixclock))
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 pr_debug("DIU exceeds monitor range (%lu to %lu)\n",
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 minpixclock, maxpixclock);
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 else if (abs(temp - =
pixclock) < err) {
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 pr_debug("Entered the else if block %d\n", i);
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 err =3D abs(temp - pixclock);
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 bestval =3D pixval + i;
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 bestfreq =3D temp;
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }
> > + =C2=A0 =C2=A0 =C2=A0 }
> > +
> > + =C2=A0 =C2=A0 =C2=A0 pr_debug("DIU chose =3D %lx\n", bestval);
> > + =C2=A0 =C2=A0 =C2=A0 pr_debug("DIU error =3D %ld\n NomPixClk ", err);
> > + =C2=A0 =C2=A0 =C2=A0 pr_debug("DIU: Best Freq =3D %lx\n", bestfreq);
> > + =C2=A0 =C2=A0 =C2=A0 /* Modify DIU_DIV in CCM SCFR1 */
> > + =C2=A0 =C2=A0 =C2=A0 temp =3D in_be32(ccm + CCM_SCFR1);
>=20
> Don't use offsets like + CCM_SCFR1.  Create a structure and use that inst=
ead.

Done in next patch version.

> > + =C2=A0 =C2=A0 =C2=A0 pr_debug("DIU: Current value of SCFR1: 0x%08x\n"=
, temp);
> > + =C2=A0 =C2=A0 =C2=A0 temp &=3D ~DIU_DIV_MASK;
> > + =C2=A0 =C2=A0 =C2=A0 temp |=3D (bestval & DIU_DIV_MASK);
> > + =C2=A0 =C2=A0 =C2=A0 out_be32(ccm + CCM_SCFR1, temp);
> > + =C2=A0 =C2=A0 =C2=A0 pr_debug("DIU: Modified value of SCFR1: 0x%08x\n=
", temp);
> > + =C2=A0 =C2=A0 =C2=A0 iounmap(ccm);
> > +}
> > +
> > +ssize_t mpc512x_show_monitor_port(int monitor_port, char *buf)
> > +{
> > + =C2=A0 =C2=A0 =C2=A0 return snprintf(buf, PAGE_SIZE, "0 - 5121 LCD\n"=
);
>=20
> There's no point in using snprintf since you're printing a string
> literal.  You can use sprintf.

Will do, thanks.

> > +}
> > +
> > +int mpc512x_set_sysfs_monitor_port(int val)
> > +{
> > + =C2=A0 =C2=A0 =C2=A0 return 0;
> > +}
> > +
> > +static struct fsl_diu_shared_fb __attribute__ ((__aligned__(8))) diu_s=
hared_fb;
> > +
> > +#if defined(CONFIG_FB_FSL_DIU) || \
> > + =C2=A0 =C2=A0defined(CONFIG_FB_FSL_DIU_MODULE)
> > +static inline void mpc512x_free_bootmem(struct page *page)
> > +{
> > + =C2=A0 =C2=A0 =C2=A0 __ClearPageReserved(page);
> > + =C2=A0 =C2=A0 =C2=A0 BUG_ON(PageTail(page));
> > + =C2=A0 =C2=A0 =C2=A0 BUG_ON(atomic_read(&page->_count) > 1);
> > + =C2=A0 =C2=A0 =C2=A0 atomic_set(&page->_count, 1);
> > + =C2=A0 =C2=A0 =C2=A0 __free_page(page);
> > + =C2=A0 =C2=A0 =C2=A0 totalram_pages++;
> > +}
> > +
> > +void mpc512x_release_bootmem(void)
> > +{
> > + =C2=A0 =C2=A0 =C2=A0 unsigned long addr =3D diu_shared_fb.fb_phys & P=
AGE_MASK;
> > + =C2=A0 =C2=A0 =C2=A0 unsigned long size =3D diu_shared_fb.fb_len;
> > + =C2=A0 =C2=A0 =C2=A0 unsigned long start, end;
> > +
> > + =C2=A0 =C2=A0 =C2=A0 if (diu_shared_fb.in_use) {
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 start =3D PFN_UP(add=
r);
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 end =3D PFN_DOWN(add=
r + size);
> > +
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 for (; start < end; =
start++)
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 mpc512x_free_bootmem(pfn_to_page(start));
> > +
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 diu_shared_fb.in_use=
 =3D false;
> > + =C2=A0 =C2=A0 =C2=A0 }
> > + =C2=A0 =C2=A0 =C2=A0 diu_ops.release_bootmem =3D NULL;
> > +}
> > +#endif
>=20
> Do you really need to use reserve_bootmem?  Have you tried kmalloc or
> alloc_pages_exact()?

Yes. No, it is too early to use them here.

> > +
> > +/*
> > + * Check if DIU was pre-initialized. If so, perform steps
> > + * needed to continue displaying through the whole boot process.
> > + * Move area descriptor and gamma table elsewhere, they are
> > + * destroyed by bootmem allocator otherwise. The frame buffer
> > + * address range will be reserved in setup_arch() after bootmem
> > + * allocator is up.
> > + */
> > +void __init mpc512x_init_diu(void)
> > +{
> > + =C2=A0 =C2=A0 =C2=A0 struct device_node *np;
> > + =C2=A0 =C2=A0 =C2=A0 void __iomem *diu_reg;
> > + =C2=A0 =C2=A0 =C2=A0 phys_addr_t desc;
> > + =C2=A0 =C2=A0 =C2=A0 void __iomem *vaddr;
> > + =C2=A0 =C2=A0 =C2=A0 unsigned long mode, pix_fmt, res, bpp;
> > + =C2=A0 =C2=A0 =C2=A0 unsigned long dst;
> > +
> > + =C2=A0 =C2=A0 =C2=A0 np =3D of_find_compatible_node(NULL, NULL, "fsl,=
mpc5121-diu");
> > + =C2=A0 =C2=A0 =C2=A0 if (!np) {
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 pr_err("No DIU node\=
n");
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 return;
> > + =C2=A0 =C2=A0 =C2=A0 }
>=20
> Shouldn't you be probing as an OF driver instead of manually searching
> for the DIU node?

No, not here.

> > +
> > + =C2=A0 =C2=A0 =C2=A0 diu_reg =3D of_iomap(np, 0);
> > + =C2=A0 =C2=A0 =C2=A0 of_node_put(np);
> > + =C2=A0 =C2=A0 =C2=A0 if (!diu_reg) {
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 pr_err("Can't map DI=
U\n");
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 return;
> > + =C2=A0 =C2=A0 =C2=A0 }
> > +
> > + =C2=A0 =C2=A0 =C2=A0 mode =3D in_be32(diu_reg + 0x1c);
> > + =C2=A0 =C2=A0 =C2=A0 if (mode !=3D 1) {
>=20
> How can in_be32() return a -1?

It is a 1, not -1. I will use appropriate macro here and also
change to use a struct instead of adding offset to register base.

Thanks for your review and comments!
Anatolij

WARNING: multiple messages have this Message-ID (diff)
From: Anatolij Gustschin <agust@denx.de>
To: Timur Tabi <timur.tabi@gmail.com>
Cc: linux-fbdev@vger.kernel.org, wd@denx.de, dzu@denx.de,
	John Rigby <jrigby@gmail.com>,
	devicetree-discuss@lists.ozlabs.org, linuxppc-dev@ozlabs.org,
	yorksun@freescale.com
Subject: Re: [PATCH 3/5] powerpc/mpc5121: shared DIU framebuffer support
Date: Fri, 30 Apr 2010 12:19:47 +0200	[thread overview]
Message-ID: <20100430121947.1d265ca6@wker> (raw)
In-Reply-To: <s2ted82fe3e1004291905mf562f0cbi24054bb973aa2dbb@mail.gmail.com>

On Thu, 29 Apr 2010 21:05:26 -0500
Timur Tabi <timur.tabi@gmail.com> wrote:

> On Thu, Apr 29, 2010 at 6:49 PM, Anatolij Gustschin <agust@denx.de> wrote:
> 
> 
> > +void __init mpc5121_ads_init_early(void)
> > +{
> > +       mpc512x_init_diu();
> > +}
> > +
> >  define_machine(mpc5121_ads) {
> >        .name                   = "MPC5121 ADS",
> >        .probe                  = mpc5121_ads_probe,
> >        .setup_arch             = mpc5121_ads_setup_arch,
> >        .init                   = mpc512x_init,
> > +       .init_early             = mpc5121_ads_init_early,
> 
> How about just doing this?
> 
> .init_early             = mpc512x_init_diu,

I thought it should be prepared for adding other code here.
mpc5121_ads_init_early() is generic and could contain other
things as well. I would vote for current version.

> > +void __init mpc512x_generic_init_early(void)
> > +{
> > +       mpc512x_init_diu();
> > +}
> > +
> > +void __init mpc512x_generic_setup_arch(void)
> > +{
> > +       mpc512x_setup_diu();
> > +}
> > +
> >  define_machine(mpc5121_generic) {
> >        .name                   = "MPC5121 generic",
> >        .probe                  = mpc5121_generic_probe,
> >        .init                   = mpc512x_init,
> > +       .init_early             = mpc512x_generic_init_early,
> > +       .setup_arch             = mpc512x_generic_setup_arch,
> 
> And a similar change here.

Same here.

...
> > diff --git a/arch/powerpc/platforms/512x/mpc512x_shared.c b/arch/powerpc/platforms/512x/mpc512x_shared.c
> > index b7f518a..8e297fa 100644
> > --- a/arch/powerpc/platforms/512x/mpc512x_shared.c
> > +++ b/arch/powerpc/platforms/512x/mpc512x_shared.c
> > @@ -16,7 +16,11 @@
> >  #include <linux/io.h>
> >  #include <linux/irq.h>
> >  #include <linux/of_platform.h>
> > +#include <linux/fsl-diu-fb.h>
> > +#include <linux/bootmem.h>
> > +#include <sysdev/fsl_soc.h>
> >
> > +#include <asm/cacheflush.h>
> >  #include <asm/machdep.h>
> >  #include <asm/ipic.h>
> >  #include <asm/prom.h>
> > @@ -53,6 +57,286 @@ void mpc512x_restart(char *cmd)
> >                ;
> >  }
> >
> > +struct fsl_diu_shared_fb {
> > +       char            gamma[0x300];   /* 32-bit aligned! */
> 
> char or u8?

Will use u8.

> > +       struct diu_ad   ad0;            /* 32-bit aligned! */
> > +       phys_addr_t     fb_phys;
> > +       size_t          fb_len;
> > +       bool            in_use;
> > +};
> 
> Where did "bool" come from?  Use "int" instead.

It is common practise to use "bool" type, grep in drivers dir.

> > +unsigned int mpc512x_get_pixel_format(unsigned int bits_per_pixel,
> > +                                     int monitor_port)
> > +{
> > +       unsigned int pix_fmt;
> > +
> > +       switch (bits_per_pixel) {
> > +       case 32:
> > +               pix_fmt = 0x88883316;
> > +               break;
> > +       case 24:
> > +               pix_fmt = 0x88082219;
> > +               break;
> > +       case 16:
> > +               pix_fmt = 0x65053118;
> > +               break;
> > +       default:
> > +               pix_fmt = 0x00000400;
> > +       }
> > +       return pix_fmt;
> > +}
> 
> This is simpler:
> 
>        switch (bits_per_pixel) {
>        case 32:
>                return 0x88883316;
>        case 24:
>                return 0x88082219;
>        case 16:
>                return = 0x65053118;
>       }
> 
>       return 0x00000400;
> }

Will simplify as suggested, thanks!

> > +       ccm = of_iomap(np, 0);
> > +       if (!ccm) {
> > +               pr_err("Can't map clock control module reg.\n");
> > +               of_node_put(np);
> > +               return;
> > +       }
> > +       of_node_put(np);
> 
> This is simpler:
> 
>        ccm = of_iomap(np, 0);
>        of_node_put(np);
>        if (!ccm) {
>                pr_err("Can't map clock control module reg.\n");
>                return;
>        }

OK, will fix, thanks.

> 
> > +       np = of_find_node_by_type(NULL, "cpu");
> > +       if (np) {
> > +               unsigned int size;
> > +               const unsigned int *prop =
> > +                       of_get_property(np, "bus-frequency", &size);
> 
> Since you don't use 'size', you can skip it:
> 
>               const unsigned int *prop =
>                       of_get_property(np, "bus-frequency", NULL);
> 
> > +       } else {
> > +               pr_err("Can't find \"cpu\" node.\n");
> 
> 'cpu' is simpler than \"cpu\"

Will simplify, too.

> > +       /* Calculate the pixel clock with the smallest error */
> > +       /* calculate the following in steps to avoid overflow */
> > +       pr_debug("DIU pixclock in ps - %d\n", pixclock);
> > +       temp = (1000000000 / pixclock) * 1000;
> 
> I'm pretty sure the compiler will optimize this to:
> 
>     temp = (1000000000000UL / pixclock);
> 
> so you may as well do it that way.

??
1000000000000 is _not_ UL, but UUL.

> 
> > +       pixclock = temp;
> > +       pr_debug("DIU pixclock freq - %u\n", pixclock);
> > +
> > +       temp = (temp * 5) / 100; /* pixclock * 0.05 */
> 
> The compiler will optimize this to:
> 
>     temp /= 20;

Can do it, too. Thanks.

> > +       pr_debug("deviation = %d\n", temp);
> > +       minpixclock = pixclock - temp;
> > +       maxpixclock = pixclock + temp;
> > +       pr_debug("DIU minpixclock - %lu\n", minpixclock);
> > +       pr_debug("DIU maxpixclock - %lu\n", maxpixclock);
> > +       pixval = speed_ccb/pixclock;
> > +       pr_debug("DIU pixval = %lu\n", pixval);
> > +
> > +       err = 100000000;
> 
> Why do you assign err to this arbitrary value?

Dunno. It is Freescale's code and I do not have time to check
and understand each bit of it and to explain it.

> > +       bestval = pixval;
> > +       pr_debug("DIU bestval = %lu\n", bestval);
> > +
> > +       bestfreq = 0;
> > +       for (i = -1; i <= 1; i++) {
> > +               temp = speed_ccb / (pixval+i);
> > +               pr_debug("DIU test pixval i=%d, pixval=%lu, temp freq. = %u\n",
> > +                       i, pixval, temp);
> > +               if ((temp < minpixclock) || (temp > maxpixclock))
> > +                       pr_debug("DIU exceeds monitor range (%lu to %lu)\n",
> > +                               minpixclock, maxpixclock);
> > +               else if (abs(temp - pixclock) < err) {
> > +                       pr_debug("Entered the else if block %d\n", i);
> > +                       err = abs(temp - pixclock);
> > +                       bestval = pixval + i;
> > +                       bestfreq = temp;
> > +               }
> > +       }
> > +
> > +       pr_debug("DIU chose = %lx\n", bestval);
> > +       pr_debug("DIU error = %ld\n NomPixClk ", err);
> > +       pr_debug("DIU: Best Freq = %lx\n", bestfreq);
> > +       /* Modify DIU_DIV in CCM SCFR1 */
> > +       temp = in_be32(ccm + CCM_SCFR1);
> 
> Don't use offsets like + CCM_SCFR1.  Create a structure and use that instead.

Done in next patch version.

> > +       pr_debug("DIU: Current value of SCFR1: 0x%08x\n", temp);
> > +       temp &= ~DIU_DIV_MASK;
> > +       temp |= (bestval & DIU_DIV_MASK);
> > +       out_be32(ccm + CCM_SCFR1, temp);
> > +       pr_debug("DIU: Modified value of SCFR1: 0x%08x\n", temp);
> > +       iounmap(ccm);
> > +}
> > +
> > +ssize_t mpc512x_show_monitor_port(int monitor_port, char *buf)
> > +{
> > +       return snprintf(buf, PAGE_SIZE, "0 - 5121 LCD\n");
> 
> There's no point in using snprintf since you're printing a string
> literal.  You can use sprintf.

Will do, thanks.

> > +}
> > +
> > +int mpc512x_set_sysfs_monitor_port(int val)
> > +{
> > +       return 0;
> > +}
> > +
> > +static struct fsl_diu_shared_fb __attribute__ ((__aligned__(8))) diu_shared_fb;
> > +
> > +#if defined(CONFIG_FB_FSL_DIU) || \
> > +    defined(CONFIG_FB_FSL_DIU_MODULE)
> > +static inline void mpc512x_free_bootmem(struct page *page)
> > +{
> > +       __ClearPageReserved(page);
> > +       BUG_ON(PageTail(page));
> > +       BUG_ON(atomic_read(&page->_count) > 1);
> > +       atomic_set(&page->_count, 1);
> > +       __free_page(page);
> > +       totalram_pages++;
> > +}
> > +
> > +void mpc512x_release_bootmem(void)
> > +{
> > +       unsigned long addr = diu_shared_fb.fb_phys & PAGE_MASK;
> > +       unsigned long size = diu_shared_fb.fb_len;
> > +       unsigned long start, end;
> > +
> > +       if (diu_shared_fb.in_use) {
> > +               start = PFN_UP(addr);
> > +               end = PFN_DOWN(addr + size);
> > +
> > +               for (; start < end; start++)
> > +                       mpc512x_free_bootmem(pfn_to_page(start));
> > +
> > +               diu_shared_fb.in_use = false;
> > +       }
> > +       diu_ops.release_bootmem = NULL;
> > +}
> > +#endif
> 
> Do you really need to use reserve_bootmem?  Have you tried kmalloc or
> alloc_pages_exact()?

Yes. No, it is too early to use them here.

> > +
> > +/*
> > + * Check if DIU was pre-initialized. If so, perform steps
> > + * needed to continue displaying through the whole boot process.
> > + * Move area descriptor and gamma table elsewhere, they are
> > + * destroyed by bootmem allocator otherwise. The frame buffer
> > + * address range will be reserved in setup_arch() after bootmem
> > + * allocator is up.
> > + */
> > +void __init mpc512x_init_diu(void)
> > +{
> > +       struct device_node *np;
> > +       void __iomem *diu_reg;
> > +       phys_addr_t desc;
> > +       void __iomem *vaddr;
> > +       unsigned long mode, pix_fmt, res, bpp;
> > +       unsigned long dst;
> > +
> > +       np = of_find_compatible_node(NULL, NULL, "fsl,mpc5121-diu");
> > +       if (!np) {
> > +               pr_err("No DIU node\n");
> > +               return;
> > +       }
> 
> Shouldn't you be probing as an OF driver instead of manually searching
> for the DIU node?

No, not here.

> > +
> > +       diu_reg = of_iomap(np, 0);
> > +       of_node_put(np);
> > +       if (!diu_reg) {
> > +               pr_err("Can't map DIU\n");
> > +               return;
> > +       }
> > +
> > +       mode = in_be32(diu_reg + 0x1c);
> > +       if (mode != 1) {
> 
> How can in_be32() return a -1?

It is a 1, not -1. I will use appropriate macro here and also
change to use a struct instead of adding offset to register base.

Thanks for your review and comments!
Anatolij
_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

  reply	other threads:[~2010-04-30 10:19 UTC|newest]

Thread overview: 84+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-04-29 23:49 [PATCH 0/5] Rework MPC5121 DIU support (for 2.6.35) Anatolij Gustschin
2010-04-29 23:49 ` Anatolij Gustschin
2010-04-29 23:49 ` [PATCH 1/5] fsl-diu-fb: fix issue with re-enabling DIU area descriptor on MPC5121 Anatolij Gustschin
2010-04-29 23:49   ` Anatolij Gustschin
2010-04-29 23:49 ` [PATCH 3/5] powerpc/mpc5121: shared DIU framebuffer support Anatolij Gustschin
2010-04-29 23:49   ` Anatolij Gustschin
2010-04-30  2:05   ` Timur Tabi
2010-04-30  2:05     ` Timur Tabi
2010-04-30  2:05     ` Timur Tabi
2010-04-30 10:19     ` Anatolij Gustschin [this message]
2010-04-30 10:19       ` Anatolij Gustschin
2010-04-30 10:19       ` Anatolij Gustschin
2010-04-30 15:08       ` Timur Tabi
2010-04-30 15:08         ` Timur Tabi
2010-04-30 15:08         ` Timur Tabi
     [not found]         ` <x2ned82fe3e1004300808q757826cs864ac1c7c082f81-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2010-04-30 16:22           ` Scott Wood
2010-04-30 16:22             ` Scott Wood
2010-04-30 16:22             ` Scott Wood
     [not found]             ` <20100430162254.GA24285-1MYqz8GpK7RekFaExTCHk1jVikpgYyvb5NbjCUgZEJk@public.gmane.org>
2010-04-30 18:18               ` Timur Tabi
2010-04-30 18:18                 ` Timur Tabi
2010-04-30 18:18                 ` Timur Tabi
     [not found]                 ` <r2sed82fe3e1004301118xc52b46cfi879de534283fd51-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2010-04-30 20:40                   ` Scott Wood
2010-04-30 20:40                     ` Scott Wood
2010-04-30 20:40                     ` Scott Wood
     [not found]                     ` <4BDB402C.9080301-KZfg59tc24xl57MIdRCFDg@public.gmane.org>
2010-05-01 15:15                       ` Anatolij Gustschin
2010-05-01 15:15                         ` Anatolij Gustschin
2010-05-01 15:15                         ` Anatolij Gustschin
2010-04-30 17:00           ` Anatolij Gustschin
2010-04-30 17:00             ` Anatolij Gustschin
2010-04-30 17:00             ` Anatolij Gustschin
2010-04-30 18:29             ` Timur Tabi
2010-04-30 18:29               ` Timur Tabi
2010-04-30 10:40   ` [PATCH v2 " Anatolij Gustschin
2010-04-30 10:40     ` Anatolij Gustschin
2010-05-03 10:49     ` [PATCH v3 " Anatolij Gustschin
2010-05-03 10:49       ` Anatolij Gustschin
2010-04-29 23:49 ` [PATCH 4/5] powerpc: doc/dts-bindings: update doc of FSL DIU bindings Anatolij Gustschin
2010-04-29 23:49   ` Anatolij Gustschin
2010-04-29 23:49 ` [PATCH 5/5] fsl-diu-fb: Support setting display mode using EDID Anatolij Gustschin
2010-04-29 23:49   ` Anatolij Gustschin
2010-04-30  1:44   ` Timur Tabi
2010-04-30  1:44     ` Timur Tabi
2010-04-30  1:44     ` Timur Tabi
2010-04-30  7:43     ` Anatolij Gustschin
2010-04-30  7:43       ` Anatolij Gustschin
2010-04-30  7:43       ` Anatolij Gustschin
2010-04-30  8:09   ` [PATCH v2 " Anatolij Gustschin
2010-04-30  8:09     ` Anatolij Gustschin
2010-04-30  1:39 ` [PATCH 0/5] Rework MPC5121 DIU support (for 2.6.35) Timur Tabi
2010-04-30  1:39   ` Timur Tabi
2010-04-30  7:41   ` Anatolij Gustschin
2010-04-30  7:41     ` Anatolij Gustschin
     [not found]   ` <y2med82fe3e1004291839m92dea081o6a46dc307e07c4ad-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2010-06-01  9:38     ` Anatolij Gustschin
2010-06-01  9:38       ` Anatolij Gustschin
2010-06-01  9:38       ` Anatolij Gustschin
2010-06-04 15:46       ` Timur Tabi
2010-06-04 15:46         ` Timur Tabi
2010-06-04 15:46         ` Timur Tabi
     [not found]         ` <AANLkTims596hCnLgN5Po6nS1bRFxKywEDlBA4mlreciV-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2010-06-16  7:38           ` Anatolij Gustschin
2010-06-16  7:38             ` Anatolij Gustschin
2010-06-16  7:38             ` Anatolij Gustschin
2010-06-16 15:42             ` Timur Tabi
2010-06-16 15:42               ` Timur Tabi
2010-06-16 15:42               ` Timur Tabi
     [not found]               ` <4C18F0E4.90309-KZfg59tc24xl57MIdRCFDg@public.gmane.org>
2010-06-16 15:47                 ` Anatolij Gustschin
2010-06-16 15:47                   ` Anatolij Gustschin
2010-06-16 15:47                   ` Anatolij Gustschin
2010-06-16 16:26                   ` Timur Tabi
2010-06-16 16:26                     ` Timur Tabi
2010-06-16 17:34                     ` Wolfram Sang
2010-06-16 17:34                       ` Wolfram Sang
2010-06-16 17:34                       ` Wolfram Sang
     [not found]                     ` <4C18FB3F.4020705-KZfg59tc24xl57MIdRCFDg@public.gmane.org>
2010-06-16 20:00                       ` Anatolij Gustschin
2010-06-16 20:00                         ` Anatolij Gustschin
2010-06-16 20:00                         ` Anatolij Gustschin
     [not found] ` <1272584978-19063-1-git-send-email-agust-ynQEQJNshbs@public.gmane.org>
2010-04-29 23:49   ` [PATCH 2/5] fsl-diu-fb: move fsl-diu-fb.h to include/linux Anatolij Gustschin
2010-04-29 23:49     ` Anatolij Gustschin
2010-04-29 23:49     ` Anatolij Gustschin
2010-06-22 16:29   ` [PATCH 0/5] Rework MPC5121 DIU support (for 2.6.35) Timur Tabi
2010-06-22 16:29     ` Timur Tabi
2010-06-22 16:29     ` Timur Tabi
     [not found]     ` <AANLkTil0-hijJOvosWUEArVUOLDb_kLWIhfflj2C9pIK-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2010-06-22 22:03       ` Anatolij Gustschin
2010-06-22 22:03         ` Anatolij Gustschin
2010-06-22 22:03         ` Anatolij Gustschin

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=20100430121947.1d265ca6@wker \
    --to=agust@denx.de \
    --cc=devicetree-discuss@lists.ozlabs.org \
    --cc=dzu@denx.de \
    --cc=jrigby@gmail.com \
    --cc=linux-fbdev@vger.kernel.org \
    --cc=linuxppc-dev@ozlabs.org \
    --cc=timur.tabi@gmail.com \
    --cc=wd@denx.de \
    --cc=yorksun@freescale.com \
    /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.