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

Reply via email to