diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-10-04 23:01:30 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-10-04 23:01:30 -0400 |
commit | 578f1ef91aa92beb571bfb9af8f4d18f405f3b9e (patch) | |
tree | 8ff59e772d09180b7e7f952a8c90a1bcf25e1d19 /drivers/regulator/anatop-regulator.c | |
parent | ecefbd94b834fa32559d854646d777c56749ef1c (diff) | |
parent | 74d8378159de16a0a1d1975d4778120d263d6000 (diff) |
Merge tag 'mfd-3.7-1' of git://git.kernel.org/pub/scm/linux/kernel/git/sameo/mfd-2.6
Pull MFD changes from Samuel Ortiz:
"MFD bits for the 3.7 merge window.
As usual we have a few new drivers:
- TI LP8788
- TI OMAP USB TLL
- Maxim MAX8907
- SMSC ECE1099
- Dialog Semiconductor DA9055
- A simpler syscon driver that allow us to get rid of the anatop one.
Drivers are also gradually getting Device Tree and IRQ domain support.
The following drivers got DT support:
- palmas, 88pm860x, tc3589x and twl4030-audio
And those ones now use the IRQ domain APIs:
- 88pm860x, tc3589x, db8500_prcmu
Also some other interesting changes:
- Intel's ICH LPC now supports Lynx Point
- TI's twl4030-audio added a GPO child
- tps6527 enabled its backlight subdevice
- The twl6030 pwm driver moved to the new PWM subsystem
And finally a bunch of cleanup and casual fixes for mc13xxx, 88pm860x,
palmas, ab8500, wm8994, wm5110, max8907 and the tps65xxx family."
Fix up various annoying conflicts: the DT and IRQ domain support came in
twice and was already in 3.6. And then it was apparently rebased.
Guys, DON'T REBASE!
* tag 'mfd-3.7-1' of git://git.kernel.org/pub/scm/linux/kernel/git/sameo/mfd-2.6: (89 commits)
ARM: dts: Enable 88pm860x pmic
mfd: 88pm860x: Move gpadc init into touch
mfd: 88pm860x: Device tree support
mfd: 88pm860x: Use irqdomain
mfd: smsc: Add support for smsc gpio io/keypad driver
backlight: tps65217_bl: Add missing platform_set_drvdata in tps65217_bl_probe
mfd: DA9055 core driver
mfd: tps65910: Add alarm interrupt of TPS65910 RTC to mfd device list
mfd: wm5110: Add register patches for revision B
mfd: wm5110: Disable control interface error report for WM5110 rev B
mfd: max8907: Remove regulator-compatible from DT docs
backlight: Add TPS65217 WLED driver
mfd: Add backlight as subdevice to the tps65217
mfd: Provide the PRCMU with its own IRQ domain
mfd: Fix max8907 sparse warning
mfd: Add lp8788 mfd driver
mfd: dbx500: Provide a more accurate smp_twd clock
mfd: rc5t583: Fix warning messages
regulator: palmas: Add DT support
mfd: palmas: Change regulator defns to better suite DT
...
Diffstat (limited to 'drivers/regulator/anatop-regulator.c')
-rw-r--r-- | drivers/regulator/anatop-regulator.c | 31 |
1 files changed, 21 insertions, 10 deletions
diff --git a/drivers/regulator/anatop-regulator.c b/drivers/regulator/anatop-regulator.c index ce0fe72a428e..1af97686f444 100644 --- a/drivers/regulator/anatop-regulator.c +++ b/drivers/regulator/anatop-regulator.c | |||
@@ -21,19 +21,20 @@ | |||
21 | #include <linux/slab.h> | 21 | #include <linux/slab.h> |
22 | #include <linux/device.h> | 22 | #include <linux/device.h> |
23 | #include <linux/module.h> | 23 | #include <linux/module.h> |
24 | #include <linux/mfd/syscon.h> | ||
24 | #include <linux/err.h> | 25 | #include <linux/err.h> |
25 | #include <linux/io.h> | 26 | #include <linux/io.h> |
26 | #include <linux/platform_device.h> | 27 | #include <linux/platform_device.h> |
27 | #include <linux/of.h> | 28 | #include <linux/of.h> |
28 | #include <linux/of_address.h> | 29 | #include <linux/of_address.h> |
29 | #include <linux/mfd/anatop.h> | 30 | #include <linux/regmap.h> |
30 | #include <linux/regulator/driver.h> | 31 | #include <linux/regulator/driver.h> |
31 | #include <linux/regulator/of_regulator.h> | 32 | #include <linux/regulator/of_regulator.h> |
32 | 33 | ||
33 | struct anatop_regulator { | 34 | struct anatop_regulator { |
34 | const char *name; | 35 | const char *name; |
35 | u32 control_reg; | 36 | u32 control_reg; |
36 | struct anatop *mfd; | 37 | struct regmap *anatop; |
37 | int vol_bit_shift; | 38 | int vol_bit_shift; |
38 | int vol_bit_width; | 39 | int vol_bit_width; |
39 | int min_bit_val; | 40 | int min_bit_val; |
@@ -43,7 +44,8 @@ struct anatop_regulator { | |||
43 | struct regulator_init_data *initdata; | 44 | struct regulator_init_data *initdata; |
44 | }; | 45 | }; |
45 | 46 | ||
46 | static int anatop_set_voltage_sel(struct regulator_dev *reg, unsigned selector) | 47 | static int anatop_regmap_set_voltage_sel(struct regulator_dev *reg, |
48 | unsigned selector) | ||
47 | { | 49 | { |
48 | struct anatop_regulator *anatop_reg = rdev_get_drvdata(reg); | 50 | struct anatop_regulator *anatop_reg = rdev_get_drvdata(reg); |
49 | u32 val, mask; | 51 | u32 val, mask; |
@@ -56,12 +58,13 @@ static int anatop_set_voltage_sel(struct regulator_dev *reg, unsigned selector) | |||
56 | mask = ((1 << anatop_reg->vol_bit_width) - 1) << | 58 | mask = ((1 << anatop_reg->vol_bit_width) - 1) << |
57 | anatop_reg->vol_bit_shift; | 59 | anatop_reg->vol_bit_shift; |
58 | val <<= anatop_reg->vol_bit_shift; | 60 | val <<= anatop_reg->vol_bit_shift; |
59 | anatop_write_reg(anatop_reg->mfd, anatop_reg->control_reg, val, mask); | 61 | regmap_update_bits(anatop_reg->anatop, anatop_reg->control_reg, |
62 | mask, val); | ||
60 | 63 | ||
61 | return 0; | 64 | return 0; |
62 | } | 65 | } |
63 | 66 | ||
64 | static int anatop_get_voltage_sel(struct regulator_dev *reg) | 67 | static int anatop_regmap_get_voltage_sel(struct regulator_dev *reg) |
65 | { | 68 | { |
66 | struct anatop_regulator *anatop_reg = rdev_get_drvdata(reg); | 69 | struct anatop_regulator *anatop_reg = rdev_get_drvdata(reg); |
67 | u32 val, mask; | 70 | u32 val, mask; |
@@ -69,7 +72,7 @@ static int anatop_get_voltage_sel(struct regulator_dev *reg) | |||
69 | if (!anatop_reg->control_reg) | 72 | if (!anatop_reg->control_reg) |
70 | return -ENOTSUPP; | 73 | return -ENOTSUPP; |
71 | 74 | ||
72 | val = anatop_read_reg(anatop_reg->mfd, anatop_reg->control_reg); | 75 | regmap_read(anatop_reg->anatop, anatop_reg->control_reg, &val); |
73 | mask = ((1 << anatop_reg->vol_bit_width) - 1) << | 76 | mask = ((1 << anatop_reg->vol_bit_width) - 1) << |
74 | anatop_reg->vol_bit_shift; | 77 | anatop_reg->vol_bit_shift; |
75 | val = (val & mask) >> anatop_reg->vol_bit_shift; | 78 | val = (val & mask) >> anatop_reg->vol_bit_shift; |
@@ -78,8 +81,8 @@ static int anatop_get_voltage_sel(struct regulator_dev *reg) | |||
78 | } | 81 | } |
79 | 82 | ||
80 | static struct regulator_ops anatop_rops = { | 83 | static struct regulator_ops anatop_rops = { |
81 | .set_voltage_sel = anatop_set_voltage_sel, | 84 | .set_voltage_sel = anatop_regmap_set_voltage_sel, |
82 | .get_voltage_sel = anatop_get_voltage_sel, | 85 | .get_voltage_sel = anatop_regmap_get_voltage_sel, |
83 | .list_voltage = regulator_list_voltage_linear, | 86 | .list_voltage = regulator_list_voltage_linear, |
84 | .map_voltage = regulator_map_voltage_linear, | 87 | .map_voltage = regulator_map_voltage_linear, |
85 | }; | 88 | }; |
@@ -88,11 +91,11 @@ static int __devinit anatop_regulator_probe(struct platform_device *pdev) | |||
88 | { | 91 | { |
89 | struct device *dev = &pdev->dev; | 92 | struct device *dev = &pdev->dev; |
90 | struct device_node *np = dev->of_node; | 93 | struct device_node *np = dev->of_node; |
94 | struct device_node *anatop_np; | ||
91 | struct regulator_desc *rdesc; | 95 | struct regulator_desc *rdesc; |
92 | struct regulator_dev *rdev; | 96 | struct regulator_dev *rdev; |
93 | struct anatop_regulator *sreg; | 97 | struct anatop_regulator *sreg; |
94 | struct regulator_init_data *initdata; | 98 | struct regulator_init_data *initdata; |
95 | struct anatop *anatopmfd = dev_get_drvdata(pdev->dev.parent); | ||
96 | struct regulator_config config = { }; | 99 | struct regulator_config config = { }; |
97 | int ret = 0; | 100 | int ret = 0; |
98 | 101 | ||
@@ -109,7 +112,15 @@ static int __devinit anatop_regulator_probe(struct platform_device *pdev) | |||
109 | rdesc->ops = &anatop_rops; | 112 | rdesc->ops = &anatop_rops; |
110 | rdesc->type = REGULATOR_VOLTAGE; | 113 | rdesc->type = REGULATOR_VOLTAGE; |
111 | rdesc->owner = THIS_MODULE; | 114 | rdesc->owner = THIS_MODULE; |
112 | sreg->mfd = anatopmfd; | 115 | |
116 | anatop_np = of_get_parent(np); | ||
117 | if (!anatop_np) | ||
118 | return -ENODEV; | ||
119 | sreg->anatop = syscon_node_to_regmap(anatop_np); | ||
120 | of_node_put(anatop_np); | ||
121 | if (IS_ERR(sreg->anatop)) | ||
122 | return PTR_ERR(sreg->anatop); | ||
123 | |||
113 | ret = of_property_read_u32(np, "anatop-reg-offset", | 124 | ret = of_property_read_u32(np, "anatop-reg-offset", |
114 | &sreg->control_reg); | 125 | &sreg->control_reg); |
115 | if (ret) { | 126 | if (ret) { |