diff options
author | Haojian Zhuang <haojian.zhuang@marvell.com> | 2011-03-07 10:43:09 -0500 |
---|---|---|
committer | Samuel Ortiz <sameo@linux.intel.com> | 2011-03-23 05:42:05 -0400 |
commit | adb70483f4d560323db9aaca5f066fde4d96f339 (patch) | |
tree | b429a9a294fde03d21df32c1a4cb243174997df6 /drivers/mfd | |
parent | d7e8c01a97429101cb0ca2c09380e683c3814af8 (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')
-rw-r--r-- | drivers/mfd/88pm860x-core.c | 96 |
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 | ||
23 | char pm860x_backlight_name[][MFD_NAME_SIZE] = { | 23 | static 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 | }; |
28 | EXPORT_SYMBOL(pm860x_backlight_name); | 28 | |
29 | static struct mfd_cell bk_devs[] __initdata = { | ||
30 | {"88pm860x-backlight", 0,}, | ||
31 | {"88pm860x-backlight", 1,}, | ||
32 | {"88pm860x-backlight", 2,}, | ||
33 | }; | ||
34 | |||
35 | static struct pm860x_backlight_pdata bk_pdata[ARRAY_SIZE(bk_devs)]; | ||
29 | 36 | ||
30 | char pm860x_led_name[][MFD_NAME_SIZE] = { | 37 | char 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 | }; |
38 | EXPORT_SYMBOL(pm860x_led_name); | 45 | EXPORT_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 | |||
48 | static 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 | |||
62 | static 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 | ||
577 | static 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 | |||
598 | static void __devinit device_8606_init(struct pm860x_chip *chip, | 614 | static 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; |
626 | out_dev: | 631 | out_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: |