aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorRichard Zhao <richard.zhao@linaro.org>2012-05-12 21:18:02 -0400
committerSamuel Ortiz <sameo@linux.intel.com>2012-05-20 11:27:07 -0400
commitb09530ef844f0bf29ed3677080c02b179be84818 (patch)
treeed2d3e791823a3e394f0718815895aee37114bfe /drivers
parent08b4c118af35d4d67eca2052aaa8d4a5f7d0aecb (diff)
mfd: Make anatop register accessor more flexible and rename meaningfully
- rename to anatop_read_reg and anatop_write_reg - anatop_read_reg directly return reg value - anatop_write_reg write reg with mask Signed-off-by: Richard Zhao <richard.zhao@freescale.com> Reviewed-by: Ying-Chun Liu (PaulLiu) <paul.liu@linaro.org> Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/mfd/anatop-mfd.c35
-rw-r--r--drivers/regulator/anatop-regulator.c18
2 files changed, 19 insertions, 34 deletions
diff --git a/drivers/mfd/anatop-mfd.c b/drivers/mfd/anatop-mfd.c
index 2af42480635e..6da06341f6c9 100644
--- a/drivers/mfd/anatop-mfd.c
+++ b/drivers/mfd/anatop-mfd.c
@@ -41,39 +41,26 @@
41#include <linux/of_address.h> 41#include <linux/of_address.h>
42#include <linux/mfd/anatop.h> 42#include <linux/mfd/anatop.h>
43 43
44u32 anatop_get_bits(struct anatop *adata, u32 addr, int bit_shift, 44u32 anatop_read_reg(struct anatop *adata, u32 addr)
45 int bit_width)
46{ 45{
47 u32 val, mask; 46 return readl(adata->ioreg + addr);
48
49 if (bit_width == 32)
50 mask = ~0;
51 else
52 mask = (1 << bit_width) - 1;
53
54 val = readl(adata->ioreg + addr);
55 val = (val >> bit_shift) & mask;
56
57 return val;
58} 47}
59EXPORT_SYMBOL_GPL(anatop_get_bits); 48EXPORT_SYMBOL_GPL(anatop_read_reg);
60 49
61void anatop_set_bits(struct anatop *adata, u32 addr, int bit_shift, 50void anatop_write_reg(struct anatop *adata, u32 addr, u32 data, u32 mask)
62 int bit_width, u32 data)
63{ 51{
64 u32 val, mask; 52 u32 val;
65 53
66 if (bit_width == 32) 54 data &= mask;
67 mask = ~0;
68 else
69 mask = (1 << bit_width) - 1;
70 55
71 spin_lock(&adata->reglock); 56 spin_lock(&adata->reglock);
72 val = readl(adata->ioreg + addr) & ~(mask << bit_shift); 57 val = readl(adata->ioreg + addr);
73 writel((data << bit_shift) | val, adata->ioreg + addr); 58 val &= ~mask;
59 val |= data;
60 writel(val, adata->ioreg + addr);
74 spin_unlock(&adata->reglock); 61 spin_unlock(&adata->reglock);
75} 62}
76EXPORT_SYMBOL_GPL(anatop_set_bits); 63EXPORT_SYMBOL_GPL(anatop_write_reg);
77 64
78static const struct of_device_id of_anatop_match[] = { 65static const struct of_device_id of_anatop_match[] = {
79 { .compatible = "fsl,imx6q-anatop", }, 66 { .compatible = "fsl,imx6q-anatop", },
diff --git a/drivers/regulator/anatop-regulator.c b/drivers/regulator/anatop-regulator.c
index 81fd606e47bc..0a3408570d0a 100644
--- a/drivers/regulator/anatop-regulator.c
+++ b/drivers/regulator/anatop-regulator.c
@@ -47,7 +47,7 @@ static int anatop_set_voltage(struct regulator_dev *reg, int min_uV,
47 int max_uV, unsigned *selector) 47 int max_uV, unsigned *selector)
48{ 48{
49 struct anatop_regulator *anatop_reg = rdev_get_drvdata(reg); 49 struct anatop_regulator *anatop_reg = rdev_get_drvdata(reg);
50 u32 val, sel; 50 u32 val, sel, mask;
51 int uv; 51 int uv;
52 52
53 uv = min_uV; 53 uv = min_uV;
@@ -71,11 +71,10 @@ static int anatop_set_voltage(struct regulator_dev *reg, int min_uV,
71 val = anatop_reg->min_bit_val + sel; 71 val = anatop_reg->min_bit_val + sel;
72 *selector = sel; 72 *selector = sel;
73 dev_dbg(&reg->dev, "%s: calculated val %d\n", __func__, val); 73 dev_dbg(&reg->dev, "%s: calculated val %d\n", __func__, val);
74 anatop_set_bits(anatop_reg->mfd, 74 mask = ((1 << anatop_reg->vol_bit_width) - 1) <<
75 anatop_reg->control_reg, 75 anatop_reg->vol_bit_shift;
76 anatop_reg->vol_bit_shift, 76 val <<= anatop_reg->vol_bit_shift;
77 anatop_reg->vol_bit_width, 77 anatop_write_reg(anatop_reg->mfd, anatop_reg->control_reg, val, mask);
78 val);
79 78
80 return 0; 79 return 0;
81} 80}
@@ -88,10 +87,9 @@ static int anatop_get_voltage_sel(struct regulator_dev *reg)
88 if (!anatop_reg->control_reg) 87 if (!anatop_reg->control_reg)
89 return -ENOTSUPP; 88 return -ENOTSUPP;
90 89
91 val = anatop_get_bits(anatop_reg->mfd, 90 val = anatop_read_reg(anatop_reg->mfd, anatop_reg->control_reg);
92 anatop_reg->control_reg, 91 val = (val & ((1 << anatop_reg->vol_bit_width) - 1)) >>
93 anatop_reg->vol_bit_shift, 92 anatop_reg->vol_bit_shift;
94 anatop_reg->vol_bit_width);
95 93
96 return val - anatop_reg->min_bit_val; 94 return val - anatop_reg->min_bit_val;
97} 95}