On Wed, Feb 29, 2012 at 02:40:10PM +0000, Arnd Bergmann wrote: > On Sunday 12 February 2012, Jamie Lentin wrote: > > This patch adds support for the D-Link DNS-320 & DNS-325 NAS. Kirkwood-based > > successors to the DNS-323. > > > > Signed-off-by: Jamie Lentin <[email protected]> > > --- > > My previous patch supported just the DNS-325, the DNS-320 is a very similar > > device and so I've combined the support for both devices into one board > > support > > file. The main difference with the DNS-320 is that the temperature sensor > > is accessed via ttyS1 instead of I2C (I have a userland script to do this). > > > > I appreciate board support files like this are old hat and should be using > > device tree instead. If I should be focusing on that instead of getting this > > merged, some pointers would be very useful. > > Hi Jamie, > > I just saw this patch going through the mailing list and noticed that you > had sent it out another time before without getting any reply. > > I'm sorry that you did not get any feedback on this. Jason Cooper had a > similar patch and he ended up a bit more fortunate than you, since he > got support for the kirkwood based "dreamplug" into the arm-soc tree > and is working on converting that to device tree now. > > I would suggest that you two team up and put DNS-32x support into the new > common board-dt.c file as well.
Jamie, Take a look at the dreamplug initial support patch series, latest here [1]. Make a kirkwood-dns-320.dts and a kirkwood-dns-325.dts file mimicing kirkwood-dreamplug.dts. All you should need to start out is the compatible property and memory. [1] http://www.spinics.net/lists/arm-kernel/msg161696.html > Some more comments: > > > diff --git a/arch/arm/mach-kirkwood/dnskw-setup.c > > b/arch/arm/mach-kirkwood/dnskw-setup.c > > new file mode 100644 > > index 0000000..25ea0fa > > --- /dev/null > > +++ b/arch/arm/mach-kirkwood/dnskw-setup.c > > @@ -0,0 +1,431 @@ > > +/* > > + * arch/arm/mach-kirkwood/dnskw-setup.c > > All future boards should ideally go through a single board file, and the plan > is to work on minimizing the non-generic contents of that over time. > Right now, it only contains support for the dreamplug, but there is no > reason why this one couldn't get merged into it as well. > > > +static struct mtd_partition dnskw_nand_parts[] = { > > + { > > + .name = "u-boot", > > + .offset = 0, > > + .size = SZ_1M, > > + .mask_flags = MTD_WRITEABLE > > + }, { > > + .name = "uImage", > > + .offset = MTDPART_OFS_NXTBLK, > > + .size = 5 * SZ_1M > > + }, { > > + .name = "ramdisk", > > + .offset = MTDPART_OFS_NXTBLK, > > + .size = 5 * SZ_1M > > + }, { > > + .name = "image", > > + .offset = MTDPART_OFS_NXTBLK, > > + .size = 102 * SZ_1M > > + }, { > > + .name = "mini firmware", > > + .offset = MTDPART_OFS_NXTBLK, > > + .size = 10 * SZ_1M > > + }, { > > + .name = "config", > > + .offset = MTDPART_OFS_NXTBLK, > > + .size = 5 * SZ_1M > > + }, > > +}; > > Jason already has a patch for NAND partitions through the SPI attachment, > I would suggest that you do the same for the nand controller, the patch > should be fairly similar. > > > +static struct mv643xx_eth_platform_data dnskw_ge00_data = { > > + .phy_addr = MV643XX_ETH_PHY_ADDR(8), > > +}; > > + > > +static struct mv_sata_platform_data dnskw_sata_data = { > > + .n_ports = 2, > > +}; > > + > > +/***************************************************************************** > > + * I2C-based devices > > + * > > + * i2c addr | chip | description > > + * 0x48 | GMT G751-2f | LM75-compatible temp. sensor (DNS-325 only) > > + * 0x0c | ? | (DNS-325 only) > > + * 0x64 | ? | > > + > > ****************************************************************************/ > > + > > +#ifdef CONFIG_MACH_DNS325 > > +static struct i2c_board_info dns325_i2c_board_info[] __initdata = { > > + { > > + I2C_BOARD_INFO("lm75", 0x48), > > + }, > > +}; > > +#endif > > These three things will require simple device tree bindings, but I think you > can leave them present in the first version and then submit follow-on patches > for them, moving all the data into the device tree. > > > +/***************************************************************************** > > + * MPP / GPIO setup > > + > > ****************************************************************************/ > > + > > +static unsigned int dnskw_mpp_config[] __initdata = { > > + MPP13_UART1_TXD, /* Custom ... */ > > + MPP14_UART1_RXD, /* ... Controller (DNS-320 only) */ > > + MPP20_SATA1_ACTn, /* LED: White Right HDD */ > > + MPP21_SATA0_ACTn, /* LED: White Left HDD */ > > + MPP24_GPIO, > > + MPP25_GPIO, > > + MPP26_GPIO, /* LED: Power */ > > + MPP27_GPIO, /* LED: Red Right HDD */ > > + MPP28_GPIO, /* LED: Red Left HDD */ > > + MPP29_GPIO, /* LED: Red USB (DNS-325 only) */ > > + MPP30_GPIO, > > + MPP31_GPIO, > > + MPP32_GPIO, > > + MPP33_GPO, > > + MPP34_GPIO, /* Button: Front power */ > > + MPP35_GPIO, /* LED: Red USB (DNS-320 only) */ > > + MPP36_GPIO, /* Power: MV88F6281_DEV_ID Board */ > > + MPP37_GPIO, /* Power: Boot when power applied */ > > + MPP38_GPIO, > > + MPP39_GPIO, /* Power: SATA0 */ > > + MPP40_GPIO, /* Power: SATA1 */ > > + MPP41_GPIO, > > + MPP42_GPIO, > > + MPP43_GPIO, /* LED: White USB */ > > + MPP44_GPIO, /* Fan: Tachometer Pin */ > > + MPP45_GPIO, /* Fan: high speed */ > > + MPP46_GPIO, /* Fan: low speed */ > > + MPP47_GPIO, /* Button: Back unmount */ > > + MPP48_GPIO, /* Button: Back reset */ > > + MPP49_GPIO, /* Pin of unused U5 (DNS-320 only) */ > > + 0 > > +}; > > mpp config is a bit tricky, this will likely stay like this for the > next time. > > > +/***************************************************************************** > > + * Power controls > > + > > ****************************************************************************/ > > + > > +static void dnskw_power_off(void) > > +{ > > + gpio_set_value(DNSKW_GPIO_POWER, 1); > > +} > > ... <snip -- lots of gpio stuff> > > The entire gpio setup is rather complex, and I don't know how much of it > can be handled with the existing gpio device tree bindings. I hope someone > else can comment here. > > > +/***************************************************************************** > > + * Main init > > + > > ****************************************************************************/ > > + > > +static void __init dnskw_init(void) > > +{ > > + u32 dev, rev; > > + > > + /* > > + * Basic setup. Needs to be called early. > > + */ > > + kirkwood_init(); > > + kirkwood_mpp_conf(dnskw_mpp_config); > > There is now a kirkwood_dt_init function that calls the board specific > functions based on an of_machine_is_compatible() check. Best add anything > from this function in there that cannot be handled using device tree > probing yet. > > > + kirkwood_uart0_init(); > > + kirkwood_uart1_init(); > > These can be done from the device tree already. > > > + kirkwood_nand_init(ARRAY_AND_SIZE(dnskw_nand_parts), 25); > > This is the one I mentioned above that I think you should try to convert. > > > + kirkwood_ehci_init(); > > + kirkwood_i2c_init(); > > + kirkwood_ge00_init(&dnskw_ge00_data); > > + kirkwood_sata_init(&dnskw_sata_data); > > These should be handled next, but not necessarily before this board > supports makes it into the upstream kernel. Adding the bindings for > these should be fairly straightforward, and it will get easier > if kirkwood is first converted to use the generic clock framework. I've got a handle on these after I do xor and crypto. If you get to it before I do, hit sata and ge00/01. I'll start with ehci and i2c. > > +#ifdef CONFIG_MACH_DNS320 > > + if (machine_is_dns320()) > > + platform_device_register(&dns320_led_device); > > +#endif > > +#ifdef CONFIG_MACH_DNS325 > > + if (machine_is_dns325()) { > > + platform_device_register(&dns325_led_device); > > + > > + i2c_register_board_info(0, dns325_i2c_board_info, > > + ARRAY_SIZE(dns325_i2c_board_info)); > > + } > > +#endif > > + > > + /* > > + * Turn on power to harddrives, then enable SATA. > > + * NB: Bootloader should have turned sata0 on already, kernel needs > > + * to turn on sata1. The idea is to stagger spin-up of HDDs. > > + */ > > + dnskw_gpio_register(DNSKW_GPIO_POWER_SATA0, "dnskw:power:sata0", 1); > > + dnskw_gpio_register(DNSKW_GPIO_POWER_SATA1, "dnskw:power:sata1", 1); > > + > > + platform_device_register(&dnskw_button_device); > > + platform_device_register(&dnskw_fan_device); > > It should be possible to handle all this by putting the right devices > into the device tree, but I don't know how to do that. > > > + /* Register power off routine */ > > + kirkwood_pcie_id(&dev, &rev); > > + if (dev == MV88F6281_DEV_ID) { > > + pr_info("PCI-E Device ID: MV88F6281, configuring power-off"); > > + if (gpio_request(DNSKW_GPIO_POWER, "dnskw:power:off") == 0 && > > + gpio_direction_output(DNSKW_GPIO_POWER, 0) == 0) > > + pm_power_off = dnskw_power_off; > > + else > > + pr_err("dnskw: failed to configure power-off GPIO\n"); > > + } else { > > + /* > > + * Dlink code also defines 0x6192, and sets LOW_BASE + > > + * 0x01000000 high. Either cargo-culted code or another model. > > + */ > > + pr_err("Unknown PCI-E Device ID %x, no power-off", dev); > > + } > > + > > + /* Set state of power_recover pin */ > > + if (gpio_request(DNSKW_GPIO_POWER_RECOVER, "dnskw:power:recover") == 0 > > + && gpio_direction_output(DNSKW_GPIO_POWER_RECOVER, 0) == 0) { > > + pr_info("dnskw: Setting power-recover %s\n", > > + power_recover_value ? "on" : "off"); > > + gpio_set_value(DNSKW_GPIO_POWER_RECOVER, power_recover_value); > > + } else > > + pr_err("dnskw: Failed to register power-recover GPIO\n"); > > +} > > This might have to stay board specific. > > > +#ifdef CONFIG_MACH_DNS320 > > +MACHINE_START(DNS320, "D-Link DNS-320") > > + /* Maintainer: Jamie Lentin <[email protected]> */ > > + .atag_offset = 0x100, > > + .init_machine = dnskw_init, > > + .map_io = kirkwood_map_io, > > + .init_early = kirkwood_init_early, > > + .init_irq = kirkwood_init_irq, > > + .timer = &kirkwood_timer, > > + .restart = kirkwood_restart, > > +MACHINE_END > > +#endif > > + > > +#ifdef CONFIG_MACH_DNS325 > > +MACHINE_START(DNS325, "D-Link DNS-325") > > + /* Maintainer: Jamie Lentin <[email protected]> */ > > + .atag_offset = 0x100, > > + .init_machine = dnskw_init, > > + .map_io = kirkwood_map_io, > > + .init_early = kirkwood_init_early, > > + .init_irq = kirkwood_init_irq, > > + .timer = &kirkwood_timer, > > + .restart = kirkwood_restart, > > +MACHINE_END > > +#endif > > Just use DT_MACHINE_START here and remove the machine ID and atag_offset. See > the board-dt.c file. See the link [1], above. thx, Jason. _______________________________________________ devicetree-discuss mailing list [email protected] https://lists.ozlabs.org/listinfo/devicetree-discuss
