[patch 1/1] kirkwood: Add iconnect support
Jason Cooper
jason at lakedaemon.net
Tue Apr 17 10:27:10 EDT 2012
On Tue, Apr 17, 2012 at 12:05:06AM +0200, Arnaud Patard wrote:
> Add support for Iomega Iconnect system.
>
> Signed-off-by: Arnaud Patard <arnaud.patard at rtp-net.org>
Thanks for the patch, comments below.
> Index: arm-soc/arch/arm/mach-kirkwood/Kconfig
> ===================================================================
> --- arm-soc.orig/arch/arm/mach-kirkwood/Kconfig 2012-04-16 08:50:58.321398110 +0200
> +++ arm-soc/arch/arm/mach-kirkwood/Kconfig 2012-04-16 14:07:10.440563405 +0200
> @@ -58,6 +58,12 @@ config MACH_DREAMPLUG_DT
> Say 'Y' here if you want your kernel to support the
> Marvell DreamPlug (Flattened Device Tree).
>
> +config MACH_ICONNECT_DT
> + bool "Iomega Iconnect (Flattened Device Tree)"
> + select ARCH_KIRKWOOD_DT
> + help
> + Say 'Y' here to enable Iomega Iconnect support.
> +
> config MACH_TS219
> bool "QNAP TS-110, TS-119, TS-119P+, TS-210, TS-219, TS-219P and TS-219P+ Turbo NAS"
> help
> Index: arm-soc/arch/arm/mach-kirkwood/Makefile
> ===================================================================
> --- arm-soc.orig/arch/arm/mach-kirkwood/Makefile 2012-04-16 08:50:58.349398109 +0200
> +++ arm-soc/arch/arm/mach-kirkwood/Makefile 2012-04-16 14:04:50.660569553 +0200
> @@ -22,3 +22,4 @@ obj-$(CONFIG_MACH_T5325) += t5325-setup
> obj-$(CONFIG_CPU_IDLE) += cpuidle.o
> obj-$(CONFIG_ARCH_KIRKWOOD_DT) += board-dt.o
> obj-$(CONFIG_MACH_DREAMPLUG_DT) += board-dreamplug.o
> +obj-$(CONFIG_MACH_ICONNECT_DT) += board-iconnect.o
> Index: arm-soc/arch/arm/mach-kirkwood/board-iconnect.c
> ===================================================================
> --- /dev/null 1970-01-01 00:00:00.000000000 +0000
> +++ arm-soc/arch/arm/mach-kirkwood/board-iconnect.c 2012-04-16 14:05:51.304566885 +0200
> @@ -0,0 +1,187 @@
> +/*
> + * arch/arm/mach-kirkwood/board-iconnect.c
> + *
> + * Iomega i-connect Board Setup
> + *
> + * This file is licensed under the terms of the GNU General Public
> + * License version 2. This program is licensed "as is" without any
> + * warranty of any kind, whether express or implied.
> + */
> +
> +#include <linux/kernel.h>
> +#include <linux/init.h>
> +#include <linux/platform_device.h>
> +#include <linux/of.h>
> +#include <linux/of_address.h>
> +#include <linux/of_fdt.h>
> +#include <linux/of_irq.h>
> +#include <linux/of_platform.h>
> +#include <linux/mtd/partitions.h>
> +#include <linux/mv643xx_eth.h>
> +#include <linux/gpio.h>
> +#include <linux/leds.h>
> +#include <linux/spi/flash.h>
> +#include <linux/spi/spi.h>
> +#include <linux/spi/orion_spi.h>
> +#include <linux/i2c.h>
> +#include <linux/input.h>
> +#include <linux/gpio_keys.h>
> +#include <asm/mach/arch.h>
> +#include <mach/kirkwood.h>
> +#include "common.h"
> +#include "mpp.h"
> +
> +static struct mv643xx_eth_platform_data iconnect_ge00_data = {
> + .phy_addr = MV643XX_ETH_PHY_ADDR(11),
> +};
> +
> +static struct gpio_led iconnect_led_pins[] = {
> + {
> + .name = "led_level",
This name sounds like a led attribute, not it's name. Is it correct?
> + .gpio = 41,
> + .default_trigger = "default-on",
> + }, {
> + .name = "power:blue",
> + .gpio = 42,
> + .default_trigger = "timer",
> + }, {
> + .name = "power:red",
> + .gpio = 43,
> + }, {
> + .name = "usb1",
> + .gpio = 44,
> + }, {
> + .name = "usb2",
> + .gpio = 45,
> + }, {
> + .name = "usb3",
> + .gpio = 46,
> + }, {
> + .name = "usb4",
> + .gpio = 47,
> + }, {
> + .name = "otb",
> + .gpio = 48,
> + },
> +};
Are usb[1-4] different hcis? are they all ehci? what color are they?
> +
> +#define ICONNECT_BLINK_HALF_PERIOD 100
> +
> +static int iconnect_blink_set(unsigned gpio, int state,
__init ?
> + unsigned long *delay_on, unsigned long *delay_off)
> +{
> + if (delay_on && delay_off && !*delay_on && !*delay_off)
> + *delay_on = *delay_off = ICONNECT_BLINK_HALF_PERIOD;
> +
> + switch (state) {
> + case GPIO_LED_NO_BLINK_LOW:
> + case GPIO_LED_NO_BLINK_HIGH:
> + orion_gpio_set_blink(gpio, 0);
> + gpio_set_value(gpio, state);
> + break;
> + case GPIO_LED_BLINK:
> + orion_gpio_set_blink(gpio, 1);
> + }
> +
> + return 0;
> +}
> +
> +static struct gpio_led_platform_data iconnect_led_data = {
> + .leds = iconnect_led_pins,
> + .num_leds = ARRAY_SIZE(iconnect_led_pins),
> + .gpio_blink_set = iconnect_blink_set,
> +};
> +
> +static struct platform_device iconnect_leds = {
> + .name = "leds-gpio",
> + .id = -1,
> + .dev = {
> + .platform_data = &iconnect_led_data,
> + }
> +};
> +
> +static unsigned int iconnect_mpp_config[] __initdata = {
> + MPP12_GPIO,
> + MPP35_GPIO,
> + MPP41_GPIO,
> + MPP42_GPIO,
> + MPP43_GPIO,
> + MPP44_GPIO,
> + MPP45_GPIO,
> + MPP46_GPIO,
> + MPP47_GPIO,
> + MPP48_GPIO,
> + 0
> +};
Some comments here would be helpful, 41-48 are gpio_led, what are 12 and
35?
> +
> +static struct i2c_board_info __initdata iconnect_board_info[] = {
> + {
> + I2C_BOARD_INFO("lm63", 0x4c),
> + },
> +};
> +
> +static struct mtd_partition iconnect_nand_parts[] = {
> + {
> + .name = "flash",
> + .offset = 0,
> + .size = MTDPART_SIZ_FULL,
> + },
> +};
I was going to suggest moving the partition definitions to here, but
once orion_nand is fdt aware, we'll specify the partitions in the dts
anyway.
Unless someone has an objection, I say we leave the hackish commandline
part table in the dtb and convert it in the dtb once orion_nand had
devicetree bindings.
> +
> +/* yikes... theses are the original input buttons */
> +/* but I'm not convinced by the sw event choices */
> +static struct gpio_keys_button iconnect_buttons[] = {
> + {
> + .type = EV_SW,
> + .code = SW_LID,
> + .gpio = 12,
> + .desc = "Reset Button",
> + .active_low = 1,
> + .debounce_interval = 100,
> + }, {
> + .type = EV_SW,
> + .code = SW_TABLET_MODE,
> + .gpio = 35,
> + .desc = "OTB Button",
> + .active_low = 1,
> + .debounce_interval = 100,
> + },
> +};
> +
> +static struct gpio_keys_platform_data iconnect_button_data = {
> + .buttons = iconnect_buttons,
> + .nbuttons = ARRAY_SIZE(iconnect_buttons),
> +};
> +
> +static struct platform_device iconnect_button_device = {
> + .name = "gpio-keys",
> + .id = -1,
> + .num_resources = 0,
> + .dev = {
> + .platform_data = &iconnect_button_data,
> + },
> +};
> +
> +void __init iconnect_init(void)
> +{
> + kirkwood_mpp_conf(iconnect_mpp_config);
> + kirkwood_nand_init(ARRAY_AND_SIZE(iconnect_nand_parts), 25);
> + kirkwood_i2c_init();
> + i2c_register_board_info(0, iconnect_board_info,
> + ARRAY_SIZE(iconnect_board_info));
> +
> + kirkwood_ehci_init();
> + kirkwood_ge00_init(&iconnect_ge00_data);
> +
> + platform_device_register(&iconnect_button_device);
> + platform_device_register(&iconnect_leds);
> +}
> +
> +static int __init iconnect_pci_init(void)
> +{
> + if (of_machine_is_compatible("iomega,iconnect"))
> + kirkwood_pcie_init(KW_PCIE0);
> + return 0;
> +}
> +subsys_initcall(iconnect_pci_init);
> +
> Index: arm-soc/arch/arm/boot/dts/kirkwood-iconnect.dts
> ===================================================================
> --- /dev/null 1970-01-01 00:00:00.000000000 +0000
> +++ arm-soc/arch/arm/boot/dts/kirkwood-iconnect.dts 2012-04-16 08:59:12.033376388 +0200
> @@ -0,0 +1,26 @@
> +/dts-v1/;
> +
> +/include/ "kirkwood.dtsi"
> +
> +/ {
> + model = "Iomega Iconnect";
> + compatible = "iomega,iconnect", "mrvl,kirkwood-88f6281", "mrvl,kirkwood";
This should be "iom,iconnect-MODELNUM", "iom,iconnect", "mrvl,...
And, correct elsewhere as needed.
> +
> + memory {
> + device_type = "memory";
> + reg = <0x00000000 0x10000000>;
> + };
> +
> + chosen {
> + bootargs = "console=ttyS0,115200n8 earlyprintk mtdparts=orion_nand:0xc0000 at 0x0(uboot),0x20000 at 0xa0000(env),0x300000 at 0x100000(zImage),0x300000 at 0x540000(initrd),0x1f400000 at 0x980000(boot)";
> + linux,initrd-start = <0x4500040>;
> + linux,initrd-end = <0x4800000>;
does this need to be specified? why doesn't the bootloader pass the
initrd properly?
thx,
Jason.
> + };
> +
> + ocp at f1000000 {
> + serial at 12000 {
> + clock-frequency = <200000000>;
> + status = "ok";
> + };
> + };
> +};
> Index: arm-soc/arch/arm/mach-kirkwood/Makefile.boot
> ===================================================================
> --- arm-soc.orig/arch/arm/mach-kirkwood/Makefile.boot 2012-04-16 08:50:58.329398110 +0200
> +++ arm-soc/arch/arm/mach-kirkwood/Makefile.boot 2012-04-16 08:51:03.873397866 +0200
> @@ -3,3 +3,5 @@ params_phys-y := 0x00000100
> initrd_phys-y := 0x00800000
>
> dtb-$(CONFIG_MACH_DREAMPLUG_DT) += kirkwood-dreamplug.dtb
> +dtb-$(CONFIG_MACH_ICONNECT_DT) += kirkwood-iconnect.dtb
> +
> Index: arm-soc/arch/arm/mach-kirkwood/board-dt.c
> ===================================================================
> --- arm-soc.orig/arch/arm/mach-kirkwood/board-dt.c 2012-04-16 08:50:58.337398109 +0200
> +++ arm-soc/arch/arm/mach-kirkwood/board-dt.c 2012-04-16 08:51:03.881397865 +0200
> @@ -55,11 +55,15 @@ static void __init kirkwood_dt_init(void
> if (of_machine_is_compatible("globalscale,dreamplug"))
> dreamplug_init();
>
> + if (of_machine_is_compatible("iomega,iconnect"))
> + iconnect_init();
> +
> of_platform_populate(NULL, kirkwood_dt_match_table, NULL, NULL);
> }
>
> static const char *kirkwood_dt_board_compat[] = {
> "globalscale,dreamplug",
> + "iomega,iconnect",
> NULL
> };
>
> Index: arm-soc/arch/arm/mach-kirkwood/common.h
> ===================================================================
> --- arm-soc.orig/arch/arm/mach-kirkwood/common.h 2012-04-16 08:50:58.309398111 +0200
> +++ arm-soc/arch/arm/mach-kirkwood/common.h 2012-04-16 08:51:03.905397864 +0200
> @@ -57,6 +57,12 @@ void dreamplug_init(void);
> #else
> static inline void dreamplug_init(void) {};
> #endif
> +#ifdef CONFIG_MACH_ICONNECT_DT
> +void iconnect_init(void);
> +#else
> +static inline void iconnect_init(void) {};
> +#endif
> +
>
> /* early init functions not converted to fdt yet */
> char *kirkwood_id(void);
>
>
>
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
More information about the linux-arm-kernel
mailing list