Stijn Devriendt <[email protected]> writes: > Hi Kevin, > > As indicated in the previous mails, this patch has not been verified. > I do not have a DM6467 board for personal use, so I cannot perform > this step myself. > In those mails I also requested for someone else to quick-test this patch. >
OK, I pushed this patch so it should now get some testing. I don't currently have access to my dm6467 due to travel, but can try it next week. Thanks, Kevin > > On Wed, Apr 15, 2009 at 9:53 PM, Kevin Hilman <[email protected]> > wrote: > > Stijn, > > This one applies, thanks! Also, it is customary to report in the > description how or if the patch was tested and on what hardware. > > I assume this was tested on DM6467 EVM and resulted in some pretty > blinking lights? > > Thanks, > > Kevin > > Stijn Devriendt <[email protected]> writes: > > > Signed-off-by: Stijn Devriendt <[email protected]> > > --- > > arch/arm/mach-davinci/board-dm646x-evm.c | 145 > ++++++++++++++++++++++++++++++ > > 1 files changed, 145 insertions(+), 0 deletions(-) > > > > diff --git a/arch/arm/mach-davinci/board-dm646x-evm.c b/arch/arm/ > mach-davinci/board-dm646x-evm.c > > index 6b1f323..d523ade 100644 > > --- a/arch/arm/mach-davinci/board-dm646x-evm.c > > +++ b/arch/arm/mach-davinci/board-dm646x-evm.c > > @@ -25,6 +25,8 @@ > > #include <linux/dma-mapping.h> > > #include <linux/serial.h> > > #include <linux/serial_8250.h> > > +#include <linux/leds.h> > > +#include <linux/gpio.h> > > > > #include <asm/setup.h> > > #include <linux/io.h> > > @@ -43,6 +45,7 @@ > > #include <linux/platform_device.h> > > #include <linux/i2c.h> > > #include <linux/i2c/at24.h> > > +#include <linux/i2c/pcf857x.h> > > #include <linux/etherdevice.h> > > #include <mach/emac.h> > > > > @@ -54,6 +57,144 @@ static struct davinci_board_config_kernel > davinci_evm_config[] __initdata = { > > { DAVINCI_TAG_UART, &davinci_evm_uart_config }, > > }; > > > > +/* LEDS */ > > + > > +static struct gpio_led evm_leds[] = { > > + { .name = "DS1", .active_low = 1, }, > > + { .name = "DS2", .active_low = 1, }, > > + { .name = "DS3", .active_low = 1, }, > > + { .name = "DS4", .active_low = 1, }, > > +}; > > + > > +static __initconst struct gpio_led_platform_data evm_led_data = { > > + .num_leds = ARRAY_SIZE(evm_leds), > > + .leds = evm_leds, > > +}; > > + > > +static struct platform_device *evm_led_dev; > > + > > +static int evm_led_setup(struct i2c_client *client, int gpio, > > + unsigned int ngpio, void *c) > > +{ > > + struct gpio_led *leds = evm_leds; > > + int status; > > + > > + while (ngpio--) { > > + leds->gpio = gpio++; > > + leds++; > > + }; > > + > > + evm_led_dev = platform_device_alloc("leds-gpio", 0); > > + platform_device_add_data(evm_led_dev, &evm_led_data, > > + sizeof(evm_led_data)); > > + > > + evm_led_dev->dev.parent = &client->dev; > > + status = platform_device_add(evm_led_dev); > > + if (status < 0) { > > + platform_device_put(evm_led_dev); > > + evm_led_dev = NULL; > > + } > > + return status; > > +} > > + > > +static int evm_led_teardown(struct i2c_client *client, int gpio, > > + unsigned ngpio, void *c) > > +{ > > + if (evm_led_dev) { > > + platform_device_unregister(evm_led_dev); > > + evm_led_dev = NULL; > > + } > > + return 0; > > +} > > + > > +static int evm_sw_gpio[4] = { -EINVAL, -EINVAL, -EINVAL, -EINVAL }; > > + > > +static int evm_sw_setup(struct i2c_client *client, int gpio, > > + unsigned ngpio, void *c) > > +{ > > + int status; > > + int i; > > + char label[10]; > > + > > + for (i = 0; i < 4; ++i) { > > + snprintf(label, 10, "user_sw%d", i); > > + status = gpio_request(gpio, label); > > + if (status) > > + goto out_free; > > + evm_sw_gpio[i] = gpio++; > > + > > + status = gpio_direction_input(evm_sw_gpio[i]); > > + if (status) { > > + gpio_free(evm_sw_gpio[i]); > > + evm_sw_gpio[i] = -EINVAL; > > + goto out_free; > > + } > > + > > + status = gpio_export(evm_sw_gpio[i], 0); > > + if (status) { > > + gpio_free(evm_sw_gpio[i]); > > + evm_sw_gpio[i] = -EINVAL; > > + goto out_free; > > + } > > + } > > + return status; > > +out_free: > > + for (i = 0; i < 4; ++i) { > > + if (evm_sw_gpio[i] != -EINVAL) { > > + gpio_free(evm_sw_gpio[i]); > > + evm_sw_gpio[i] = -EINVAL; > > + } > > + } > > + return status; > > +} > > + > > +static int evm_sw_teardown(struct i2c_client *client, int gpio, > > + unsigned ngpio, void *c) > > +{ > > + int i; > > + > > + for (i = 0; i < 4; ++i) { > > + if (evm_sw_gpio[i] != -EINVAL) { > > + gpio_unexport(evm_sw_gpio[i]); > > + gpio_free(evm_sw_gpio[i]); > > + evm_sw_gpio[i] = -EINVAL; > > + } > > + } > > + return 0; > > +} > > + > > +static int evm_pcf_setup(struct i2c_client *client, int gpio, > > + unsigned int ngpio, void *c) > > +{ > > + int status; > > + > > + if (ngpio < 8) > > + return -EINVAL; > > + > > + status = evm_sw_setup(client, gpio, 4, c); > > + if (status) > > + return status; > > + > > + return evm_led_setup(client, gpio+4, 4, c); > > +} > > + > > +static int evm_pcf_teardown(struct i2c_client *client, int gpio, > > + unsigned int ngpio, void *c) > > +{ > > + BUG_ON(ngpio < 8); > > + > > + evm_sw_teardown(client, gpio, 4, c); > > + evm_led_teardown(client, gpio+4, 4, c); > > + > > + return 0; > > +} > > + > > +static struct pcf857x_platform_data pcf_data = { > > + .gpio_base = DAVINCI_N_GPIO+1, > > + .setup = evm_pcf_setup, > > + .teardown = evm_pcf_teardown, > > +}; > > + > > /* Most of this EEPROM is unused, but U-Boot uses some data: > > * - 0x7f00, 6 bytes Ethernet Address > > * - ... newer boards may have more > > @@ -104,6 +245,10 @@ static struct i2c_board_info __initdata i2c_info[] > = > { > > I2C_BOARD_INFO("24c256", 0x50), > > .platform_data = &eeprom_info, > > }, > > + { > > + I2C_BOARD_INFO("pcf8574a", 0x38), > > + .platform_data = &pcf_data, > > + }, > > }; > > > > static struct davinci_i2c_platform_data i2c_pdata = { > > -- > > 1.5.6.4 _______________________________________________ Davinci-linux-open-source mailing list [email protected] http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source
