diff options
| author | Linus Walleij <linus.walleij@stericsson.com> | 2010-08-20 04:27:12 -0400 |
|---|---|---|
| committer | Samuel Ortiz <sameo@linux.intel.com> | 2010-10-28 18:28:42 -0400 |
| commit | 8c96aefbe79becf940d27cd8ad2c5aba48322162 (patch) | |
| tree | dc073c93d95ebecfd44e2c404ba137170aeca631 | |
| parent | 2524468ee586e7ba25bd5a0551acf1fea7e9a0b3 (diff) | |
mfd: Switch AB3100 to use MFD cells
This switches the AB3100 core driver to using MFD cells for
subdevices instead of spawning common platform devices.
Signed-off-by: Linus Walleij <linus.walleij@stericsson.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
| -rw-r--r-- | drivers/mfd/Kconfig | 1 | ||||
| -rw-r--r-- | drivers/mfd/ab3100-core.c | 129 |
2 files changed, 69 insertions, 61 deletions
diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig index db51ea1c6082..b3aedaaa7092 100644 --- a/drivers/mfd/Kconfig +++ b/drivers/mfd/Kconfig | |||
| @@ -444,6 +444,7 @@ config ABX500_CORE | |||
| 444 | config AB3100_CORE | 444 | config AB3100_CORE |
| 445 | bool "ST-Ericsson AB3100 Mixed Signal Circuit core functions" | 445 | bool "ST-Ericsson AB3100 Mixed Signal Circuit core functions" |
| 446 | depends on I2C=y && ABX500_CORE | 446 | depends on I2C=y && ABX500_CORE |
| 447 | select MFD_CORE | ||
| 447 | default y if ARCH_U300 | 448 | default y if ARCH_U300 |
| 448 | help | 449 | help |
| 449 | Select this to enable the AB3100 Mixed Signal IC core | 450 | Select this to enable the AB3100 Mixed Signal IC core |
diff --git a/drivers/mfd/ab3100-core.c b/drivers/mfd/ab3100-core.c index 6733d56cbb52..4193af5f2743 100644 --- a/drivers/mfd/ab3100-core.c +++ b/drivers/mfd/ab3100-core.c | |||
| @@ -19,6 +19,7 @@ | |||
| 19 | #include <linux/debugfs.h> | 19 | #include <linux/debugfs.h> |
| 20 | #include <linux/seq_file.h> | 20 | #include <linux/seq_file.h> |
| 21 | #include <linux/uaccess.h> | 21 | #include <linux/uaccess.h> |
| 22 | #include <linux/mfd/core.h> | ||
| 22 | #include <linux/mfd/abx500.h> | 23 | #include <linux/mfd/abx500.h> |
| 23 | 24 | ||
| 24 | /* These are the only registers inside AB3100 used in this main file */ | 25 | /* These are the only registers inside AB3100 used in this main file */ |
| @@ -146,7 +147,7 @@ static int ab3100_set_test_register_interruptible(struct ab3100 *ab3100, | |||
| 146 | } | 147 | } |
| 147 | 148 | ||
| 148 | static int ab3100_get_register_interruptible(struct ab3100 *ab3100, | 149 | static int ab3100_get_register_interruptible(struct ab3100 *ab3100, |
| 149 | u8 reg, u8 *regval) | 150 | u8 reg, u8 *regval) |
| 150 | { | 151 | { |
| 151 | int err; | 152 | int err; |
| 152 | 153 | ||
| @@ -202,7 +203,7 @@ static int ab3100_get_register_interruptible(struct ab3100 *ab3100, | |||
| 202 | } | 203 | } |
| 203 | 204 | ||
| 204 | static int get_register_interruptible(struct device *dev, u8 bank, u8 reg, | 205 | static int get_register_interruptible(struct device *dev, u8 bank, u8 reg, |
| 205 | u8 *value) | 206 | u8 *value) |
| 206 | { | 207 | { |
| 207 | struct ab3100 *ab3100 = dev_get_drvdata(dev->parent); | 208 | struct ab3100 *ab3100 = dev_get_drvdata(dev->parent); |
| 208 | 209 | ||
| @@ -743,52 +744,64 @@ static int __devinit ab3100_setup(struct ab3100 *ab3100) | |||
| 743 | return err; | 744 | return err; |
| 744 | } | 745 | } |
| 745 | 746 | ||
| 746 | /* | 747 | /* The subdevices of the AB3100 */ |
| 747 | * Here we define all the platform devices that appear | 748 | static struct mfd_cell ab3100_devs[] = { |
| 748 | * as children of the AB3100. These are regular platform | 749 | { |
| 749 | * devices with the IORESOURCE_IO .start and .end set | 750 | .name = "ab3100-dac", |
| 750 | * to correspond to the internal AB3100 register range | 751 | .id = -1, |
| 751 | * mapping to the corresponding subdevice. | 752 | }, |
| 752 | */ | 753 | { |
| 753 | 754 | .name = "ab3100-leds", | |
| 754 | #define AB3100_DEVICE(devname, devid) \ | 755 | .id = -1, |
| 755 | static struct platform_device ab3100_##devname##_device = { \ | 756 | }, |
| 756 | .name = devid, \ | 757 | { |
| 757 | .id = -1, \ | 758 | .name = "ab3100-power", |
| 758 | } | 759 | .id = -1, |
| 759 | 760 | }, | |
| 760 | /* This lists all the subdevices */ | 761 | { |
| 761 | AB3100_DEVICE(dac, "ab3100-dac"); | 762 | .name = "ab3100-regulators", |
| 762 | AB3100_DEVICE(leds, "ab3100-leds"); | 763 | .id = -1, |
| 763 | AB3100_DEVICE(power, "ab3100-power"); | 764 | }, |
| 764 | AB3100_DEVICE(regulators, "ab3100-regulators"); | 765 | { |
| 765 | AB3100_DEVICE(sim, "ab3100-sim"); | 766 | .name = "ab3100-sim", |
| 766 | AB3100_DEVICE(uart, "ab3100-uart"); | 767 | .id = -1, |
| 767 | AB3100_DEVICE(rtc, "ab3100-rtc"); | 768 | }, |
| 768 | AB3100_DEVICE(charger, "ab3100-charger"); | 769 | { |
| 769 | AB3100_DEVICE(boost, "ab3100-boost"); | 770 | .name = "ab3100-uart", |
| 770 | AB3100_DEVICE(adc, "ab3100-adc"); | 771 | .id = -1, |
| 771 | AB3100_DEVICE(fuelgauge, "ab3100-fuelgauge"); | 772 | }, |
| 772 | AB3100_DEVICE(vibrator, "ab3100-vibrator"); | 773 | { |
| 773 | AB3100_DEVICE(otp, "ab3100-otp"); | 774 | .name = "ab3100-rtc", |
| 774 | AB3100_DEVICE(codec, "ab3100-codec"); | 775 | .id = -1, |
| 775 | 776 | }, | |
| 776 | static struct platform_device * | 777 | { |
| 777 | ab3100_platform_devs[] = { | 778 | .name = "ab3100-charger", |
| 778 | &ab3100_dac_device, | 779 | .id = -1, |
| 779 | &ab3100_leds_device, | 780 | }, |
| 780 | &ab3100_power_device, | 781 | { |
| 781 | &ab3100_regulators_device, | 782 | .name = "ab3100-boost", |
| 782 | &ab3100_sim_device, | 783 | .id = -1, |
| 783 | &ab3100_uart_device, | 784 | }, |
| 784 | &ab3100_rtc_device, | 785 | { |
| 785 | &ab3100_charger_device, | 786 | .name = "ab3100-adc", |
| 786 | &ab3100_boost_device, | 787 | .id = -1, |
| 787 | &ab3100_adc_device, | 788 | }, |
| 788 | &ab3100_fuelgauge_device, | 789 | { |
| 789 | &ab3100_vibrator_device, | 790 | .name = "ab3100-fuelgauge", |
| 790 | &ab3100_otp_device, | 791 | .id = -1, |
| 791 | &ab3100_codec_device, | 792 | }, |
| 793 | { | ||
| 794 | .name = "ab3100-vibrator", | ||
| 795 | .id = -1, | ||
| 796 | }, | ||
| 797 | { | ||
| 798 | .name = "ab3100-otp", | ||
| 799 | .id = -1, | ||
| 800 | }, | ||
| 801 | { | ||
| 802 | .name = "ab3100-codec", | ||
| 803 | .id = -1, | ||
| 804 | }, | ||
| 792 | }; | 805 | }; |
| 793 | 806 | ||
| 794 | struct ab_family_id { | 807 | struct ab_family_id { |
| @@ -935,18 +948,14 @@ static int __devinit ab3100_probe(struct i2c_client *client, | |||
| 935 | if (err) | 948 | if (err) |
| 936 | goto exit_no_ops; | 949 | goto exit_no_ops; |
| 937 | 950 | ||
| 938 | /* Set parent and a pointer back to the container in device data */ | 951 | /* Set up and register the platform devices. */ |
| 939 | for (i = 0; i < ARRAY_SIZE(ab3100_platform_devs); i++) { | 952 | for (i = 0; i < ARRAY_SIZE(ab3100_devs); i++) { |
| 940 | ab3100_platform_devs[i]->dev.parent = | 953 | ab3100_devs[i].platform_data = ab3100_plf_data; |
| 941 | &client->dev; | 954 | ab3100_devs[i].data_size = sizeof(struct ab3100_platform_data); |
| 942 | ab3100_platform_devs[i]->dev.platform_data = | ||
| 943 | ab3100_plf_data; | ||
| 944 | platform_set_drvdata(ab3100_platform_devs[i], ab3100); | ||
| 945 | } | 955 | } |
| 946 | 956 | ||
| 947 | /* Register the platform devices */ | 957 | err = mfd_add_devices(&client->dev, 0, ab3100_devs, |
| 948 | platform_add_devices(ab3100_platform_devs, | 958 | ARRAY_SIZE(ab3100_devs), NULL, 0); |
| 949 | ARRAY_SIZE(ab3100_platform_devs)); | ||
| 950 | 959 | ||
| 951 | ab3100_setup_debugfs(ab3100); | 960 | ab3100_setup_debugfs(ab3100); |
| 952 | 961 | ||
| @@ -965,11 +974,9 @@ static int __devinit ab3100_probe(struct i2c_client *client, | |||
| 965 | static int __devexit ab3100_remove(struct i2c_client *client) | 974 | static int __devexit ab3100_remove(struct i2c_client *client) |
| 966 | { | 975 | { |
| 967 | struct ab3100 *ab3100 = i2c_get_clientdata(client); | 976 | struct ab3100 *ab3100 = i2c_get_clientdata(client); |
| 968 | int i; | ||
| 969 | 977 | ||
| 970 | /* Unregister subdevices */ | 978 | /* Unregister subdevices */ |
| 971 | for (i = 0; i < ARRAY_SIZE(ab3100_platform_devs); i++) | 979 | mfd_remove_devices(&client->dev); |
| 972 | platform_device_unregister(ab3100_platform_devs[i]); | ||
| 973 | 980 | ||
| 974 | ab3100_remove_debugfs(); | 981 | ab3100_remove_debugfs(); |
| 975 | i2c_unregister_device(ab3100->testreg_client); | 982 | i2c_unregister_device(ab3100->testreg_client); |
