On Sat, Dec 15, 2012 at 08:02:39PM +0100, Guennadi Liakhovetski wrote:
> Hi Simon
> 
> Thanks for your comments. I'll reply to other your reviews later, I think, 
> let me just briefly clarify this one.
> 
> On Sat, 15 Dec 2012, Simon Horman wrote:
> 
> > On Fri, Dec 14, 2012 at 05:45:30PM +0100, Guennadi Liakhovetski wrote:
> > > This patch adds dynamic switching to booting either with or without DT.
> > > So far only a part of the board initialisation can be done via DT. 
> > > Devices,
> > > that still need platform data are kept that way. Devices, that can be
> > > initialised from DT will not be supplied from the platform data, if a DT
> > > image is detected.
> > 
> > Hi Guennadi,
> > 
> > I'm not sure that I'm entirely comfortable with the implications
> > for users here.
> > 
> > In the beginning there was no DT for Mackerel, all boots were non-DT,
> > and in general the board and its devices have been well supported.
> > 
> > At the present time Mackerel only boots using DT, though almost all
> > the initialisation is done in C. Thus currently a DT boot fairly full
> > support for the board and its devices.
> > 
> > If I understand things correctly, with this change, a DT boot becomes a
> > limited boot that basically only supports devices that can be initialised
> > using DT. And users are expected to go back to a non-DT boot if they want
> > fuller support.  This seems undesirable.
> 
> No, it's in a way the contrary. As you correctly point out after a recent 
> change mackerel _must_ only be booted with DT, and, I think, this way an 
> undesirable change. After this series of patches both becomes possible: 
> booting with and without DT. And in both cases all devices are supported. 
> If booting without DT, all devices are supported in the "legacy" way from 
> the board file. If booting with DT _some_ devices, for which sufficient DT 
> support already exist are initialised from the .dts file, others are still 
> initialised from the .c. This way all devices are still supported. Note, 
> however, that some devices don't have a complete DT support yet, e.g., you 
> cannot specify card-detect GPIOs in .dts because of the lacking pincontrol 
> / GPIO DT support. As soon as that is added, .dts will have to be 
> extended respectively. Similarly, as more devices get DT support they can 
> be added to the .dts and excluded from the DT boot by putting them under 
> 
> +     if (!of_have_populated_dt()) {
> 
> clauses. If we ever come to a point, that no-DT booting will not have to 
> be supported any more, these clauses and respective devices can be easily 
> removed from board-mackerel.c. (Continued below)

Thanks, sorry for misunderstanding things. In that case I think I am
comfortable with the direction of these changes.

> > The approach that I took with the kzm9g was to provide an alternate dts and
> > board file, and compatibility string. Clearly that is not an entirely
> > elegant solution. But it does avoid the problem that I describe above.
> > 
> > > 
> > > Signed-off-by: Guennadi Liakhovetski <g.liakhovet...@gmx.de>
> > > ---
> > >  arch/arm/mach-shmobile/board-mackerel.c |   84 
> > > ++++++++++++++++++++++++-------
> > >  1 files changed, 66 insertions(+), 18 deletions(-)
> > > 
> > > diff --git a/arch/arm/mach-shmobile/board-mackerel.c 
> > > b/arch/arm/mach-shmobile/board-mackerel.c
> > > index 39b8f2e..a6358c9 100644
> > > --- a/arch/arm/mach-shmobile/board-mackerel.c
> > > +++ b/arch/arm/mach-shmobile/board-mackerel.c
> > > @@ -1326,7 +1326,6 @@ static struct platform_device mackerel_camera = {
> > >  
> > >  static struct platform_device *mackerel_devices[] __initdata = {
> > >   &nor_flash_device,
> > > - &smc911x_device,
> > >   &lcdc_device,
> > >   &usbhs0_device,
> > >   &usbhs1_device,
> > > @@ -1335,17 +1334,21 @@ static struct platform_device *mackerel_devices[] 
> > > __initdata = {
> > >   &fsi_ak4643_device,
> > >   &fsi_hdmi_device,
> > >   &nand_flash_device,
> > > + &ceu_device,
> > > + &mackerel_camera,
> > > + &hdmi_device,
> > > + &hdmi_lcdc_device,
> > > + &meram_device,
> > > +};
> > > +
> > > +static struct platform_device *mackerel_devices_dt[] __initdata = {
> > > + &smc911x_device,
> > >   &sdhi0_device,
> > >  #if !defined(CONFIG_MMC_SH_MMCIF) && !defined(CONFIG_MMC_SH_MMCIF_MODULE)
> > >   &sdhi1_device,
> > >  #endif
> > >   &sdhi2_device,
> > >   &sh_mmcif_device,
> > > - &ceu_device,
> > > - &mackerel_camera,
> > > - &hdmi_device,
> > > - &hdmi_lcdc_device,
> > > - &meram_device,
> > >  };
> > >  
> > >  /* Keypad Initialization */
> > > @@ -1404,6 +1407,24 @@ static struct i2c_board_info i2c1_devices[] = {
> > >   },
> > >  };
> > >  
> > > +static int mackerel_i2c_bus_notify(struct notifier_block *nb,
> > > +                            unsigned long action, void *data)
> > > +{
> > > + struct device *dev = data;
> > > +
> > > + if (action != BUS_NOTIFY_ADD_DEVICE ||
> > > +     strcmp(dev_name(dev->parent), "fff20000.i2c"))
> > > +         return NOTIFY_DONE;
> > > +
> > > + i2c_new_device(to_i2c_adapter(dev), &i2c0_devices[1]);
> > > +
> > > + return NOTIFY_OK;
> > > +}
> > > +
> > > +static struct notifier_block mackerel_i2c_notifier = {
> > > + .notifier_call = mackerel_i2c_bus_notify,
> > > +};
> > > +
> > >  #define GPIO_PORT9CR     IOMEM(0xE6051009)
> > >  #define GPIO_PORT10CR    IOMEM(0xE605100A)
> > >  #define GPIO_PORT167CR   IOMEM(0xE60520A7)
> > > @@ -1420,22 +1441,26 @@ static void __init mackerel_init(void)
> > 
> > I wonder if it would be cleaner to achieve this by providing
> > mackerel_init_dt().
> 
> I thought about this, but initialisation is interleaved and in some cases 
> order is important, so, you would need something like "early_dt()," 
> "mid_early_common()," "late_dt()" etc., which doesn't seem an improvement 
> to me:-)

Understood. I guess it is case by case, and in this case the approach
you have taken does seem to make sense. Magnus, do you have any
thoughts on this?

> > >           { "A3SP", &usbhs0_device, },
> > >           { "A3SP", &usbhs1_device, },
> > >           { "A3SP", &nand_flash_device, },
> > > +         { "A4R", &ceu_device, },
> > > + };
> > > + struct pm_domain_device domain_devices_dt[] = {
> > >           { "A3SP", &sh_mmcif_device, },
> > >           { "A3SP", &sdhi0_device, },
> > >  #if !defined(CONFIG_MMC_SH_MMCIF) && !defined(CONFIG_MMC_SH_MMCIF_MODULE)
> > >           { "A3SP", &sdhi1_device, },
> > >  #endif
> > >           { "A3SP", &sdhi2_device, },
> > > -         { "A4R", &ceu_device, },
> > >   };
> > >   u32 srcr4;
> > >   struct clk *clk;
> > >  
> > > - regulator_register_always_on(0, "fixed-1.8V", fixed1v8_power_consumers,
> > > -                              ARRAY_SIZE(fixed1v8_power_consumers), 
> > > 1800000);
> > > - regulator_register_always_on(1, "fixed-3.3V", fixed3v3_power_consumers,
> > > -                              ARRAY_SIZE(fixed3v3_power_consumers), 
> > > 3300000);
> > > - regulator_register_fixed(2, dummy_supplies, ARRAY_SIZE(dummy_supplies));
> > > + if (!of_have_populated_dt()) {
> > > +         regulator_register_always_on(0, "fixed-1.8V", 
> > > fixed1v8_power_consumers,
> > > +                                      
> > > ARRAY_SIZE(fixed1v8_power_consumers), 1800000);
> > > +         regulator_register_always_on(1, "fixed-3.3V", 
> > > fixed3v3_power_consumers,
> > > +                                      
> > > ARRAY_SIZE(fixed3v3_power_consumers), 3300000);
> > > +         regulator_register_fixed(2, dummy_supplies, 
> > > ARRAY_SIZE(dummy_supplies));
> > > + }
> > >  
> > >   /* External clock source */
> > >   clk_set_rate(&sh7372_dv_clki_clk, 27000000);
> > > @@ -1633,22 +1658,35 @@ static void __init mackerel_init(void)
> > >   udelay(50);
> > >   __raw_writel(srcr4 & ~(1 << 13), SRCR4);
> > >  
> > > - i2c_register_board_info(0, i2c0_devices,
> > > -                         ARRAY_SIZE(i2c0_devices));
> > > - i2c_register_board_info(1, i2c1_devices,
> > > -                         ARRAY_SIZE(i2c1_devices));
> > > + if (!of_have_populated_dt()) {
> > > +         i2c_register_board_info(0, i2c0_devices,
> > > +                                 ARRAY_SIZE(i2c0_devices));
> > > +         i2c_register_board_info(1, i2c1_devices,
> > > +                                 ARRAY_SIZE(i2c1_devices));
> > > + } else {
> > > +         bus_register_notifier(&i2c_bus_type,
> > > +                               &mackerel_i2c_notifier);
> > > + }
> > >  
> > >   sh7372_add_standard_devices();
> > >  
> > >   platform_add_devices(mackerel_devices, ARRAY_SIZE(mackerel_devices));
> > > + if (!of_have_populated_dt())
> > > +         platform_add_devices(mackerel_devices_dt,
> > > +                              ARRAY_SIZE(mackerel_devices_dt));
> > >  
> > >   rmobile_add_devices_to_domains(domain_devices,
> > >                                  ARRAY_SIZE(domain_devices));
> > > + if (!of_have_populated_dt())
> > > +         rmobile_add_devices_to_domains(domain_devices_dt,
> > > +                                        ARRAY_SIZE(domain_devices_dt));
> > >  
> > >   hdmi_init_pm_clock();
> > >   sh7372_pm_init();
> > >   pm_clk_add(&fsi_device.dev, "spu2");
> > >   pm_clk_add(&hdmi_lcdc_device.dev, "hdmi");
> > > +
> > > + of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
> > >  }
> > >  
> > >  static const char *mackerel_boards_compat_dt[] __initdata = {
> > > @@ -1659,10 +1697,20 @@ static const char *mackerel_boards_compat_dt[] 
> > > __initdata = {
> > >  DT_MACHINE_START(MACKEREL_DT, "mackerel")
> > >   .map_io         = sh7372_map_io,
> > >   .init_early     = sh7372_add_early_devices,
> > > - .init_irq       = sh7372_init_irq,
> > > + .init_irq       = sh7372_init_irq_of,
> > > + .handle_irq     = shmobile_handle_irq_intc,
> > > + .init_machine   = mackerel_init,
> > > + .init_late      = sh7372_pm_init_late,
> > > + .timer          = &shmobile_timer,
> > > + .dt_compat      = mackerel_boards_compat_dt,
> > > +MACHINE_END
> > > +
> > > +MACHINE_START(MACKEREL, "mackerel")
> > > + .map_io         = sh7372_map_io,
> > > + .init_early     = sh7372_add_early_devices,
> > > + .init_irq       = sh7372_init_irq_of,
> > 
> > Could sh7372_init_irq be used here ?
> 
> Yes, it could. I'll reply to your other review separately, briefly, by 
> using the conditional, that I proposed in my patch 3/7 we could make the 
> non-dt version static and let everyone just use sh7372_init_irq_of. But 
> this is just an idea, we can keep sh7372_init_irq() too if this is 
> prefered.

That is my preference at this point.

> Thanks
> Guennadi
> 
> > >   .handle_irq     = shmobile_handle_irq_intc,
> > >   .init_machine   = mackerel_init,
> > >   .init_late      = sh7372_pm_init_late,
> > >   .timer          = &shmobile_timer,
> > > - .dt_compat  = mackerel_boards_compat_dt,
> > >  MACHINE_END
> > > -- 
> > > 1.7.2.5
> 
> ---
> Guennadi Liakhovetski, Ph.D.
> Freelance Open-Source Software Developer
> http://www.open-technology.de/
> 
_______________________________________________
devicetree-discuss mailing list
devicetree-discuss@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/devicetree-discuss

Reply via email to