aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mfd/88pm860x-core.c
diff options
context:
space:
mode:
authorHaojian Zhuang <haojian.zhuang@marvell.com>2011-03-07 10:43:10 -0500
committerSamuel Ortiz <sameo@linux.intel.com>2011-03-23 05:42:06 -0400
commit3154c344696e58b7e15317cd624816dbe3832ad1 (patch)
tree7b908eacd6a6d423105faa980a31af9be3692dbe /drivers/mfd/88pm860x-core.c
parentadb70483f4d560323db9aaca5f066fde4d96f339 (diff)
mfd: Adopt mfd_data in 88pm860x led
Copy 88pm860x platform data into different mfd_data structure for led driver. So move the identification of device node from led driver to mfd driver. Signed-off-by: Haojian Zhuang <haojian.zhuang@marvell.com> Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
Diffstat (limited to 'drivers/mfd/88pm860x-core.c')
-rw-r--r--drivers/mfd/88pm860x-core.c109
1 files changed, 50 insertions, 59 deletions
diff --git a/drivers/mfd/88pm860x-core.c b/drivers/mfd/88pm860x-core.c
index a88967a466c..cec375c534b 100644
--- a/drivers/mfd/88pm860x-core.c
+++ b/drivers/mfd/88pm860x-core.c
@@ -26,57 +26,32 @@ static struct resource bk_resources[] __initdata = {
26 {PM8606_BACKLIGHT3, PM8606_BACKLIGHT3, "backlight-2", IORESOURCE_IO,}, 26 {PM8606_BACKLIGHT3, PM8606_BACKLIGHT3, "backlight-2", IORESOURCE_IO,},
27}; 27};
28 28
29static struct resource led_resources[] __initdata = {
30 {PM8606_LED1_RED, PM8606_LED1_RED, "led0-red", IORESOURCE_IO,},
31 {PM8606_LED1_GREEN, PM8606_LED1_GREEN, "led0-green", IORESOURCE_IO,},
32 {PM8606_LED1_BLUE, PM8606_LED1_BLUE, "led0-blue", IORESOURCE_IO,},
33 {PM8606_LED2_RED, PM8606_LED2_RED, "led1-red", IORESOURCE_IO,},
34 {PM8606_LED2_GREEN, PM8606_LED2_GREEN, "led1-green", IORESOURCE_IO,},
35 {PM8606_LED2_BLUE, PM8606_LED2_BLUE, "led1-blue", IORESOURCE_IO,},
36};
37
29static struct mfd_cell bk_devs[] __initdata = { 38static struct mfd_cell bk_devs[] __initdata = {
30 {"88pm860x-backlight", 0,}, 39 {"88pm860x-backlight", 0,},
31 {"88pm860x-backlight", 1,}, 40 {"88pm860x-backlight", 1,},
32 {"88pm860x-backlight", 2,}, 41 {"88pm860x-backlight", 2,},
33}; 42};
34 43
35static struct pm860x_backlight_pdata bk_pdata[ARRAY_SIZE(bk_devs)]; 44static struct mfd_cell led_devs[] __initdata = {
36 45 {"88pm860x-led", 0,},
37char pm860x_led_name[][MFD_NAME_SIZE] = { 46 {"88pm860x-led", 1,},
38 "led0-red", 47 {"88pm860x-led", 2,},
39 "led0-green", 48 {"88pm860x-led", 3,},
40 "led0-blue", 49 {"88pm860x-led", 4,},
41 "led1-red", 50 {"88pm860x-led", 5,},
42 "led1-green",
43 "led1-blue",
44};
45EXPORT_SYMBOL(pm860x_led_name);
46
47#define PM8606_LED_RESOURCE(_i, _x) \
48{ \
49 .name = pm860x_led_name[_i], \
50 .start = PM8606_##_x, \
51 .end = PM8606_##_x, \
52 .flags = IORESOURCE_IO, \
53}
54
55static struct resource led_resources[] = {
56 PM8606_LED_RESOURCE(PM8606_LED1_RED, RGB1B),
57 PM8606_LED_RESOURCE(PM8606_LED1_GREEN, RGB1C),
58 PM8606_LED_RESOURCE(PM8606_LED1_BLUE, RGB1D),
59 PM8606_LED_RESOURCE(PM8606_LED2_RED, RGB2B),
60 PM8606_LED_RESOURCE(PM8606_LED2_GREEN, RGB2C),
61 PM8606_LED_RESOURCE(PM8606_LED2_BLUE, RGB2D),
62}; 51};
63 52
64#define PM8606_LED_DEVS(_i) \ 53static struct pm860x_backlight_pdata bk_pdata[ARRAY_SIZE(bk_devs)];
65{ \ 54static struct pm860x_led_pdata led_pdata[ARRAY_SIZE(led_devs)];
66 .name = "88pm860x-led", \
67 .num_resources = 1, \
68 .resources = &led_resources[_i], \
69 .id = _i, \
70}
71
72static struct mfd_cell led_devs[] = {
73 PM8606_LED_DEVS(PM8606_LED1_RED),
74 PM8606_LED_DEVS(PM8606_LED1_GREEN),
75 PM8606_LED_DEVS(PM8606_LED1_BLUE),
76 PM8606_LED_DEVS(PM8606_LED2_RED),
77 PM8606_LED_DEVS(PM8606_LED2_GREEN),
78 PM8606_LED_DEVS(PM8606_LED2_BLUE),
79};
80 55
81static struct resource touch_resources[] = { 56static struct resource touch_resources[] = {
82 { 57 {
@@ -611,25 +586,41 @@ static void __devinit device_bk_init(struct pm860x_chip *chip,
611 } 586 }
612} 587}
613 588
614static void __devinit device_8606_init(struct pm860x_chip *chip, 589static void __devinit device_led_init(struct pm860x_chip *chip,
615 struct i2c_client *i2c, 590 struct i2c_client *i2c,
616 struct pm860x_platform_data *pdata) 591 struct pm860x_platform_data *pdata)
617{ 592{
618 int ret; 593 int ret;
594 int i, j, id;
619 595
620 if (pdata && pdata->led) { 596 if ((pdata == NULL) || (pdata->led == NULL))
621 ret = mfd_add_devices(chip->dev, 0, &led_devs[0], 597 return;
622 ARRAY_SIZE(led_devs), 598
623 &led_resources[0], 0); 599 if (pdata->num_leds > ARRAY_SIZE(led_devs))
624 if (ret < 0) { 600 pdata->num_leds = ARRAY_SIZE(led_devs);
625 dev_err(chip->dev, "Failed to add led " 601
626 "subdev\n"); 602 for (i = 0; i < pdata->num_leds; i++) {
627 goto out_dev; 603 memcpy(&led_pdata[i], &pdata->led[i],
604 sizeof(struct pm860x_led_pdata));
605 led_devs[i].mfd_data = &led_pdata[i];
606
607 for (j = 0; j < ARRAY_SIZE(led_devs); j++) {
608 id = led_resources[j].start;
609 if (led_pdata[i].flags != id)
610 continue;
611
612 led_devs[i].num_resources = 1;
613 led_devs[i].resources = &led_resources[j],
614 ret = mfd_add_devices(chip->dev, 0,
615 &led_devs[i], 1,
616 &led_resources[j], 0);
617 if (ret < 0) {
618 dev_err(chip->dev, "Failed to add "
619 "led subdev\n");
620 return;
621 }
628 } 622 }
629 } 623 }
630 return;
631out_dev:
632 device_irq_exit(chip);
633} 624}
634 625
635static void __devinit device_8607_init(struct pm860x_chip *chip, 626static void __devinit device_8607_init(struct pm860x_chip *chip,
@@ -748,7 +739,7 @@ int __devinit pm860x_device_init(struct pm860x_chip *chip,
748 switch (chip->id) { 739 switch (chip->id) {
749 case CHIP_PM8606: 740 case CHIP_PM8606:
750 device_bk_init(chip, chip->client, pdata); 741 device_bk_init(chip, chip->client, pdata);
751 device_8606_init(chip, chip->client, pdata); 742 device_led_init(chip, chip->client, pdata);
752 break; 743 break;
753 case CHIP_PM8607: 744 case CHIP_PM8607:
754 device_8607_init(chip, chip->client, pdata); 745 device_8607_init(chip, chip->client, pdata);
@@ -759,7 +750,7 @@ int __devinit pm860x_device_init(struct pm860x_chip *chip,
759 switch (chip->id) { 750 switch (chip->id) {
760 case CHIP_PM8607: 751 case CHIP_PM8607:
761 device_bk_init(chip, chip->companion, pdata); 752 device_bk_init(chip, chip->companion, pdata);
762 device_8606_init(chip, chip->companion, pdata); 753 device_led_init(chip, chip->companion, pdata);
763 break; 754 break;
764 case CHIP_PM8606: 755 case CHIP_PM8606:
765 device_8607_init(chip, chip->companion, pdata); 756 device_8607_init(chip, chip->companion, pdata);