aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-pxa
diff options
context:
space:
mode:
authorMarek Vasut <marek.vasut@gmail.com>2010-07-27 17:11:03 -0400
committerEric Miao <eric.y.miao@gmail.com>2010-08-05 02:32:46 -0400
commit02a453e4a5a7ca8c8801140f412d327686112e4e (patch)
tree94c4644a6021fce19a2511eac5768c71a06c84fe /arch/arm/mach-pxa
parenta9c0629cdefd9c26746ece510fcc88357869685e (diff)
[ARM] pxa/balloon3: PCF857x GPIO expander and LEDs
Add supported for PCF8574A GPIO expander and LEDs attached to it. Signed-off-by: Marek Vasut <marek.vasut@gmail.com>
Diffstat (limited to 'arch/arm/mach-pxa')
-rw-r--r--arch/arm/mach-pxa/balloon3.c84
-rw-r--r--arch/arm/mach-pxa/include/mach/balloon3.h11
2 files changed, 92 insertions, 3 deletions
diff --git a/arch/arm/mach-pxa/balloon3.c b/arch/arm/mach-pxa/balloon3.c
index 91ad56d6e929..6f594bd410dd 100644
--- a/arch/arm/mach-pxa/balloon3.c
+++ b/arch/arm/mach-pxa/balloon3.c
@@ -26,6 +26,7 @@
26#include <linux/mtd/mtd.h> 26#include <linux/mtd/mtd.h>
27#include <linux/mtd/partitions.h> 27#include <linux/mtd/partitions.h>
28#include <linux/types.h> 28#include <linux/types.h>
29#include <linux/i2c/pcf857x.h>
29 30
30#include <asm/setup.h> 31#include <asm/setup.h>
31#include <asm/mach-types.h> 32#include <asm/mach-types.h>
@@ -375,15 +376,65 @@ static struct gpio_led_platform_data balloon3_gpio_led_info = {
375 376
376static struct platform_device balloon3_leds = { 377static struct platform_device balloon3_leds = {
377 .name = "leds-gpio", 378 .name = "leds-gpio",
378 .id = -1, 379 .id = 0,
379 .dev = { 380 .dev = {
380 .platform_data = &balloon3_gpio_led_info, 381 .platform_data = &balloon3_gpio_led_info,
381 } 382 }
382}; 383};
383 384
385struct gpio_led balloon3_pcf_gpio_leds[] = {
386 {
387 .name = "balloon3:green:led0",
388 .gpio = BALLOON3_PCF_GPIO_LED0,
389 .active_low = 1,
390 }, {
391 .name = "balloon3:green:led1",
392 .gpio = BALLOON3_PCF_GPIO_LED1,
393 .active_low = 1,
394 }, {
395 .name = "balloon3:orange:led2",
396 .gpio = BALLOON3_PCF_GPIO_LED2,
397 .active_low = 1,
398 }, {
399 .name = "balloon3:orange:led3",
400 .gpio = BALLOON3_PCF_GPIO_LED3,
401 .active_low = 1,
402 }, {
403 .name = "balloon3:orange:led4",
404 .gpio = BALLOON3_PCF_GPIO_LED4,
405 .active_low = 1,
406 }, {
407 .name = "balloon3:orange:led5",
408 .gpio = BALLOON3_PCF_GPIO_LED5,
409 .active_low = 1,
410 }, {
411 .name = "balloon3:red:led6",
412 .gpio = BALLOON3_PCF_GPIO_LED6,
413 .active_low = 1,
414 }, {
415 .name = "balloon3:red:led7",
416 .gpio = BALLOON3_PCF_GPIO_LED7,
417 .active_low = 1,
418 },
419};
420
421static struct gpio_led_platform_data balloon3_pcf_gpio_led_info = {
422 .leds = balloon3_pcf_gpio_leds,
423 .num_leds = ARRAY_SIZE(balloon3_pcf_gpio_leds),
424};
425
426static struct platform_device balloon3_pcf_leds = {
427 .name = "leds-gpio",
428 .id = 1,
429 .dev = {
430 .platform_data = &balloon3_pcf_gpio_led_info,
431 }
432};
433
384static void __init balloon3_leds_init(void) 434static void __init balloon3_leds_init(void)
385{ 435{
386 platform_device_register(&balloon3_leds); 436 platform_device_register(&balloon3_leds);
437 platform_device_register(&balloon3_pcf_leds);
387} 438}
388#else 439#else
389static inline void balloon3_leds_init(void) {} 440static inline void balloon3_leds_init(void) {}
@@ -451,6 +502,34 @@ static void __init balloon3_init_irq(void)
451} 502}
452 503
453/****************************************************************************** 504/******************************************************************************
505 * GPIO expander
506 ******************************************************************************/
507#if defined(CONFIG_GPIO_PCF857X) || defined(CONFIG_GPIO_PCF857X_MODULE)
508static struct pcf857x_platform_data balloon3_pcf857x_pdata = {
509 .gpio_base = BALLOON3_PCF_GPIO_BASE,
510 .n_latch = 0,
511 .setup = NULL,
512 .teardown = NULL,
513 .context = NULL,
514};
515
516static struct i2c_board_info __initdata balloon3_i2c_devs[] = {
517 {
518 I2C_BOARD_INFO("pcf8574a", 0x38),
519 .platform_data = &balloon3_pcf857x_pdata,
520 },
521};
522
523static void __init balloon3_i2c_init(void)
524{
525 pxa_set_i2c_info(NULL);
526 i2c_register_board_info(0, ARRAY_AND_SIZE(balloon3_i2c_devs));
527}
528#else
529static inline void balloon3_i2c_init(void) {}
530#endif
531
532/******************************************************************************
454 * Machine init 533 * Machine init
455 ******************************************************************************/ 534 ******************************************************************************/
456static void __init balloon3_init(void) 535static void __init balloon3_init(void)
@@ -463,8 +542,7 @@ static void __init balloon3_init(void)
463 pxa_set_btuart_info(NULL); 542 pxa_set_btuart_info(NULL);
464 pxa_set_stuart_info(NULL); 543 pxa_set_stuart_info(NULL);
465 544
466 pxa_set_i2c_info(NULL); 545 balloon3_i2c_init();
467
468 balloon3_irda_init(); 546 balloon3_irda_init();
469 balloon3_lcd_init(); 547 balloon3_lcd_init();
470 balloon3_leds_init(); 548 balloon3_leds_init();
diff --git a/arch/arm/mach-pxa/include/mach/balloon3.h b/arch/arm/mach-pxa/include/mach/balloon3.h
index d5dcf750c1ef..238f887ebaea 100644
--- a/arch/arm/mach-pxa/include/mach/balloon3.h
+++ b/arch/arm/mach-pxa/include/mach/balloon3.h
@@ -69,6 +69,17 @@ enum balloon3_features {
69 69
70#define BALLOON3_GPIO_S0_CD (105) 70#define BALLOON3_GPIO_S0_CD (105)
71 71
72/* PCF8574A Leds */
73#define BALLOON3_PCF_GPIO_BASE 160
74#define BALLOON3_PCF_GPIO_LED0 (BALLOON3_PCF_GPIO_BASE + 0)
75#define BALLOON3_PCF_GPIO_LED1 (BALLOON3_PCF_GPIO_BASE + 1)
76#define BALLOON3_PCF_GPIO_LED2 (BALLOON3_PCF_GPIO_BASE + 2)
77#define BALLOON3_PCF_GPIO_LED3 (BALLOON3_PCF_GPIO_BASE + 3)
78#define BALLOON3_PCF_GPIO_LED4 (BALLOON3_PCF_GPIO_BASE + 4)
79#define BALLOON3_PCF_GPIO_LED5 (BALLOON3_PCF_GPIO_BASE + 5)
80#define BALLOON3_PCF_GPIO_LED6 (BALLOON3_PCF_GPIO_BASE + 6)
81#define BALLOON3_PCF_GPIO_LED7 (BALLOON3_PCF_GPIO_BASE + 7)
82
72/* FPGA Interrupt Mask/Acknowledge Register */ 83/* FPGA Interrupt Mask/Acknowledge Register */
73#define BALLOON3_INT_S0_IRQ (1 << 0) /* PCMCIA 0 IRQ */ 84#define BALLOON3_INT_S0_IRQ (1 << 0) /* PCMCIA 0 IRQ */
74#define BALLOON3_INT_S0_STSCHG (1 << 1) /* PCMCIA 0 status changed */ 85#define BALLOON3_INT_S0_STSCHG (1 << 1) /* PCMCIA 0 status changed */