diff options
author | Haojian Zhuang <haojian.zhuang@marvell.com> | 2011-03-07 10:43:10 -0500 |
---|---|---|
committer | Samuel Ortiz <sameo@linux.intel.com> | 2011-03-23 05:42:06 -0400 |
commit | 3154c344696e58b7e15317cd624816dbe3832ad1 (patch) | |
tree | 7b908eacd6a6d423105faa980a31af9be3692dbe /drivers/mfd/88pm860x-core.c | |
parent | adb70483f4d560323db9aaca5f066fde4d96f339 (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.c | 109 |
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 | ||
29 | static 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 | |||
29 | static struct mfd_cell bk_devs[] __initdata = { | 38 | static 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 | ||
35 | static struct pm860x_backlight_pdata bk_pdata[ARRAY_SIZE(bk_devs)]; | 44 | static struct mfd_cell led_devs[] __initdata = { |
36 | 45 | {"88pm860x-led", 0,}, | |
37 | char 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 | }; | ||
45 | EXPORT_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 | |||
55 | static 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) \ | 53 | static struct pm860x_backlight_pdata bk_pdata[ARRAY_SIZE(bk_devs)]; |
65 | { \ | 54 | static 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 | |||
72 | static 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 | ||
81 | static struct resource touch_resources[] = { | 56 | static 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 | ||
614 | static void __devinit device_8606_init(struct pm860x_chip *chip, | 589 | static 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; | ||
631 | out_dev: | ||
632 | device_irq_exit(chip); | ||
633 | } | 624 | } |
634 | 625 | ||
635 | static void __devinit device_8607_init(struct pm860x_chip *chip, | 626 | static 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); |