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>
This commit is contained in:
parent
08b4c118af
commit
b09530ef84
@ -41,39 +41,26 @@
|
|||||||
#include <linux/of_address.h>
|
#include <linux/of_address.h>
|
||||||
#include <linux/mfd/anatop.h>
|
#include <linux/mfd/anatop.h>
|
||||||
|
|
||||||
u32 anatop_get_bits(struct anatop *adata, u32 addr, int bit_shift,
|
u32 anatop_read_reg(struct anatop *adata, u32 addr)
|
||||||
int bit_width)
|
|
||||||
{
|
{
|
||||||
u32 val, mask;
|
return readl(adata->ioreg + addr);
|
||||||
|
|
||||||
if (bit_width == 32)
|
|
||||||
mask = ~0;
|
|
||||||
else
|
|
||||||
mask = (1 << bit_width) - 1;
|
|
||||||
|
|
||||||
val = readl(adata->ioreg + addr);
|
|
||||||
val = (val >> bit_shift) & mask;
|
|
||||||
|
|
||||||
return val;
|
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(anatop_get_bits);
|
EXPORT_SYMBOL_GPL(anatop_read_reg);
|
||||||
|
|
||||||
void anatop_set_bits(struct anatop *adata, u32 addr, int bit_shift,
|
void anatop_write_reg(struct anatop *adata, u32 addr, u32 data, u32 mask)
|
||||||
int bit_width, u32 data)
|
|
||||||
{
|
{
|
||||||
u32 val, mask;
|
u32 val;
|
||||||
|
|
||||||
if (bit_width == 32)
|
data &= mask;
|
||||||
mask = ~0;
|
|
||||||
else
|
|
||||||
mask = (1 << bit_width) - 1;
|
|
||||||
|
|
||||||
spin_lock(&adata->reglock);
|
spin_lock(&adata->reglock);
|
||||||
val = readl(adata->ioreg + addr) & ~(mask << bit_shift);
|
val = readl(adata->ioreg + addr);
|
||||||
writel((data << bit_shift) | val, adata->ioreg + addr);
|
val &= ~mask;
|
||||||
|
val |= data;
|
||||||
|
writel(val, adata->ioreg + addr);
|
||||||
spin_unlock(&adata->reglock);
|
spin_unlock(&adata->reglock);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(anatop_set_bits);
|
EXPORT_SYMBOL_GPL(anatop_write_reg);
|
||||||
|
|
||||||
static const struct of_device_id of_anatop_match[] = {
|
static const struct of_device_id of_anatop_match[] = {
|
||||||
{ .compatible = "fsl,imx6q-anatop", },
|
{ .compatible = "fsl,imx6q-anatop", },
|
||||||
|
@ -47,7 +47,7 @@ static int anatop_set_voltage(struct regulator_dev *reg, int min_uV,
|
|||||||
int max_uV, unsigned *selector)
|
int max_uV, unsigned *selector)
|
||||||
{
|
{
|
||||||
struct anatop_regulator *anatop_reg = rdev_get_drvdata(reg);
|
struct anatop_regulator *anatop_reg = rdev_get_drvdata(reg);
|
||||||
u32 val, sel;
|
u32 val, sel, mask;
|
||||||
int uv;
|
int uv;
|
||||||
|
|
||||||
uv = min_uV;
|
uv = min_uV;
|
||||||
@ -71,11 +71,10 @@ static int anatop_set_voltage(struct regulator_dev *reg, int min_uV,
|
|||||||
val = anatop_reg->min_bit_val + sel;
|
val = anatop_reg->min_bit_val + sel;
|
||||||
*selector = sel;
|
*selector = sel;
|
||||||
dev_dbg(®->dev, "%s: calculated val %d\n", __func__, val);
|
dev_dbg(®->dev, "%s: calculated val %d\n", __func__, val);
|
||||||
anatop_set_bits(anatop_reg->mfd,
|
mask = ((1 << anatop_reg->vol_bit_width) - 1) <<
|
||||||
anatop_reg->control_reg,
|
anatop_reg->vol_bit_shift;
|
||||||
anatop_reg->vol_bit_shift,
|
val <<= anatop_reg->vol_bit_shift;
|
||||||
anatop_reg->vol_bit_width,
|
anatop_write_reg(anatop_reg->mfd, anatop_reg->control_reg, val, mask);
|
||||||
val);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -88,10 +87,9 @@ static int anatop_get_voltage_sel(struct regulator_dev *reg)
|
|||||||
if (!anatop_reg->control_reg)
|
if (!anatop_reg->control_reg)
|
||||||
return -ENOTSUPP;
|
return -ENOTSUPP;
|
||||||
|
|
||||||
val = anatop_get_bits(anatop_reg->mfd,
|
val = anatop_read_reg(anatop_reg->mfd, anatop_reg->control_reg);
|
||||||
anatop_reg->control_reg,
|
val = (val & ((1 << anatop_reg->vol_bit_width) - 1)) >>
|
||||||
anatop_reg->vol_bit_shift,
|
anatop_reg->vol_bit_shift;
|
||||||
anatop_reg->vol_bit_width);
|
|
||||||
|
|
||||||
return val - anatop_reg->min_bit_val;
|
return val - anatop_reg->min_bit_val;
|
||||||
}
|
}
|
||||||
|
@ -34,7 +34,7 @@ struct anatop {
|
|||||||
spinlock_t reglock;
|
spinlock_t reglock;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern u32 anatop_get_bits(struct anatop *, u32, int, int);
|
extern u32 anatop_read_reg(struct anatop *, u32);
|
||||||
extern void anatop_set_bits(struct anatop *, u32, int, int, u32);
|
extern void anatop_write_reg(struct anatop *, u32, u32, u32);
|
||||||
|
|
||||||
#endif /* __LINUX_MFD_ANATOP_H */
|
#endif /* __LINUX_MFD_ANATOP_H */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user