aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mfd/88pm860x-core.c
diff options
context:
space:
mode:
authorHaojian Zhuang <haojian.zhuang@marvell.com>2011-03-07 10:43:09 -0500
committerSamuel Ortiz <sameo@linux.intel.com>2011-03-23 05:42:05 -0400
commitadb70483f4d560323db9aaca5f066fde4d96f339 (patch)
treeb429a9a294fde03d21df32c1a4cb243174997df6 /drivers/mfd/88pm860x-core.c
parentd7e8c01a97429101cb0ca2c09380e683c3814af8 (diff)
mfd: Adopt mfd_data in 88pm860x backlight
Copy 88pm860x platform data into different mfd_data structure for backlight driver. So move the identification of device node from backlight 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.c96
1 files changed, 51 insertions, 45 deletions
diff --git a/drivers/mfd/88pm860x-core.c b/drivers/mfd/88pm860x-core.c
index 793300c554b4..a88967a466cb 100644
--- a/drivers/mfd/88pm860x-core.c
+++ b/drivers/mfd/88pm860x-core.c
@@ -20,12 +20,19 @@
20 20
21#define INT_STATUS_NUM 3 21#define INT_STATUS_NUM 3
22 22
23char pm860x_backlight_name[][MFD_NAME_SIZE] = { 23static struct resource bk_resources[] __initdata = {
24 "backlight-0", 24 {PM8606_BACKLIGHT1, PM8606_BACKLIGHT1, "backlight-0", IORESOURCE_IO,},
25 "backlight-1", 25 {PM8606_BACKLIGHT2, PM8606_BACKLIGHT2, "backlight-1", IORESOURCE_IO,},
26 "backlight-2", 26 {PM8606_BACKLIGHT3, PM8606_BACKLIGHT3, "backlight-2", IORESOURCE_IO,},
27}; 27};
28EXPORT_SYMBOL(pm860x_backlight_name); 28
29static struct mfd_cell bk_devs[] __initdata = {
30 {"88pm860x-backlight", 0,},
31 {"88pm860x-backlight", 1,},
32 {"88pm860x-backlight", 2,},
33};
34
35static struct pm860x_backlight_pdata bk_pdata[ARRAY_SIZE(bk_devs)];
29 36
30char pm860x_led_name[][MFD_NAME_SIZE] = { 37char pm860x_led_name[][MFD_NAME_SIZE] = {
31 "led0-red", 38 "led0-red",
@@ -37,34 +44,6 @@ char pm860x_led_name[][MFD_NAME_SIZE] = {
37}; 44};
38EXPORT_SYMBOL(pm860x_led_name); 45EXPORT_SYMBOL(pm860x_led_name);
39 46
40#define PM8606_BACKLIGHT_RESOURCE(_i, _x) \
41{ \
42 .name = pm860x_backlight_name[_i], \
43 .start = PM8606_##_x, \
44 .end = PM8606_##_x, \
45 .flags = IORESOURCE_IO, \
46}
47
48static struct resource backlight_resources[] = {
49 PM8606_BACKLIGHT_RESOURCE(PM8606_BACKLIGHT1, WLED1A),
50 PM8606_BACKLIGHT_RESOURCE(PM8606_BACKLIGHT2, WLED2A),
51 PM8606_BACKLIGHT_RESOURCE(PM8606_BACKLIGHT3, WLED3A),
52};
53
54#define PM8606_BACKLIGHT_DEVS(_i) \
55{ \
56 .name = "88pm860x-backlight", \
57 .num_resources = 1, \
58 .resources = &backlight_resources[_i], \
59 .id = _i, \
60}
61
62static struct mfd_cell backlight_devs[] = {
63 PM8606_BACKLIGHT_DEVS(PM8606_BACKLIGHT1),
64 PM8606_BACKLIGHT_DEVS(PM8606_BACKLIGHT2),
65 PM8606_BACKLIGHT_DEVS(PM8606_BACKLIGHT3),
66};
67
68#define PM8606_LED_RESOURCE(_i, _x) \ 47#define PM8606_LED_RESOURCE(_i, _x) \
69{ \ 48{ \
70 .name = pm860x_led_name[_i], \ 49 .name = pm860x_led_name[_i], \
@@ -595,23 +574,49 @@ static void device_irq_exit(struct pm860x_chip *chip)
595 free_irq(chip->core_irq, chip); 574 free_irq(chip->core_irq, chip);
596} 575}
597 576
577static void __devinit device_bk_init(struct pm860x_chip *chip,
578 struct i2c_client *i2c,
579 struct pm860x_platform_data *pdata)
580{
581 int ret;
582 int i, j, id;
583
584 if ((pdata == NULL) || (pdata->backlight == NULL))
585 return;
586
587 if (pdata->num_backlights > ARRAY_SIZE(bk_devs))
588 pdata->num_backlights = ARRAY_SIZE(bk_devs);
589
590 for (i = 0; i < pdata->num_backlights; i++) {
591 memcpy(&bk_pdata[i], &pdata->backlight[i],
592 sizeof(struct pm860x_backlight_pdata));
593 bk_devs[i].mfd_data = &bk_pdata[i];
594
595 for (j = 0; j < ARRAY_SIZE(bk_devs); j++) {
596 id = bk_resources[j].start;
597 if (bk_pdata[i].flags != id)
598 continue;
599
600 bk_devs[i].num_resources = 1;
601 bk_devs[i].resources = &bk_resources[j];
602 ret = mfd_add_devices(chip->dev, 0,
603 &bk_devs[i], 1,
604 &bk_resources[j], 0);
605 if (ret < 0) {
606 dev_err(chip->dev, "Failed to add "
607 "backlight subdev\n");
608 return;
609 }
610 }
611 }
612}
613
598static void __devinit device_8606_init(struct pm860x_chip *chip, 614static void __devinit device_8606_init(struct pm860x_chip *chip,
599 struct i2c_client *i2c, 615 struct i2c_client *i2c,
600 struct pm860x_platform_data *pdata) 616 struct pm860x_platform_data *pdata)
601{ 617{
602 int ret; 618 int ret;
603 619
604 if (pdata && pdata->backlight) {
605 ret = mfd_add_devices(chip->dev, 0, &backlight_devs[0],
606 ARRAY_SIZE(backlight_devs),
607 &backlight_resources[0], 0);
608 if (ret < 0) {
609 dev_err(chip->dev, "Failed to add backlight "
610 "subdev\n");
611 goto out_dev;
612 }
613 }
614
615 if (pdata && pdata->led) { 620 if (pdata && pdata->led) {
616 ret = mfd_add_devices(chip->dev, 0, &led_devs[0], 621 ret = mfd_add_devices(chip->dev, 0, &led_devs[0],
617 ARRAY_SIZE(led_devs), 622 ARRAY_SIZE(led_devs),
@@ -624,7 +629,6 @@ static void __devinit device_8606_init(struct pm860x_chip *chip,
624 } 629 }
625 return; 630 return;
626out_dev: 631out_dev:
627 mfd_remove_devices(chip->dev);
628 device_irq_exit(chip); 632 device_irq_exit(chip);
629} 633}
630 634
@@ -743,6 +747,7 @@ int __devinit pm860x_device_init(struct pm860x_chip *chip,
743 747
744 switch (chip->id) { 748 switch (chip->id) {
745 case CHIP_PM8606: 749 case CHIP_PM8606:
750 device_bk_init(chip, chip->client, pdata);
746 device_8606_init(chip, chip->client, pdata); 751 device_8606_init(chip, chip->client, pdata);
747 break; 752 break;
748 case CHIP_PM8607: 753 case CHIP_PM8607:
@@ -753,6 +758,7 @@ int __devinit pm860x_device_init(struct pm860x_chip *chip,
753 if (chip->companion) { 758 if (chip->companion) {
754 switch (chip->id) { 759 switch (chip->id) {
755 case CHIP_PM8607: 760 case CHIP_PM8607:
761 device_bk_init(chip, chip->companion, pdata);
756 device_8606_init(chip, chip->companion, pdata); 762 device_8606_init(chip, chip->companion, pdata);
757 break; 763 break;
758 case CHIP_PM8606: 764 case CHIP_PM8606: