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:
Родитель
08b4c118af
Коммит
b09530ef84
|
@ -41,39 +41,26 @@
|
|||
#include <linux/of_address.h>
|
||||
#include <linux/mfd/anatop.h>
|
||||
|
||||
u32 anatop_get_bits(struct anatop *adata, u32 addr, int bit_shift,
|
||||
int bit_width)
|
||||
u32 anatop_read_reg(struct anatop *adata, u32 addr)
|
||||
{
|
||||
u32 val, mask;
|
||||
|
||||
if (bit_width == 32)
|
||||
mask = ~0;
|
||||
else
|
||||
mask = (1 << bit_width) - 1;
|
||||
|
||||
val = readl(adata->ioreg + addr);
|
||||
val = (val >> bit_shift) & mask;
|
||||
|
||||
return val;
|
||||
return readl(adata->ioreg + addr);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(anatop_get_bits);
|
||||
EXPORT_SYMBOL_GPL(anatop_read_reg);
|
||||
|
||||
void anatop_set_bits(struct anatop *adata, u32 addr, int bit_shift,
|
||||
int bit_width, u32 data)
|
||||
void anatop_write_reg(struct anatop *adata, u32 addr, u32 data, u32 mask)
|
||||
{
|
||||
u32 val, mask;
|
||||
u32 val;
|
||||
|
||||
if (bit_width == 32)
|
||||
mask = ~0;
|
||||
else
|
||||
mask = (1 << bit_width) - 1;
|
||||
data &= mask;
|
||||
|
||||
spin_lock(&adata->reglock);
|
||||
val = readl(adata->ioreg + addr) & ~(mask << bit_shift);
|
||||
writel((data << bit_shift) | val, adata->ioreg + addr);
|
||||
val = readl(adata->ioreg + addr);
|
||||
val &= ~mask;
|
||||
val |= data;
|
||||
writel(val, adata->ioreg + addr);
|
||||
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[] = {
|
||||
{ .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)
|
||||
{
|
||||
struct anatop_regulator *anatop_reg = rdev_get_drvdata(reg);
|
||||
u32 val, sel;
|
||||
u32 val, sel, mask;
|
||||
int 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;
|
||||
*selector = sel;
|
||||
dev_dbg(®->dev, "%s: calculated val %d\n", __func__, val);
|
||||
anatop_set_bits(anatop_reg->mfd,
|
||||
anatop_reg->control_reg,
|
||||
anatop_reg->vol_bit_shift,
|
||||
anatop_reg->vol_bit_width,
|
||||
val);
|
||||
mask = ((1 << anatop_reg->vol_bit_width) - 1) <<
|
||||
anatop_reg->vol_bit_shift;
|
||||
val <<= anatop_reg->vol_bit_shift;
|
||||
anatop_write_reg(anatop_reg->mfd, anatop_reg->control_reg, val, mask);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -88,10 +87,9 @@ static int anatop_get_voltage_sel(struct regulator_dev *reg)
|
|||
if (!anatop_reg->control_reg)
|
||||
return -ENOTSUPP;
|
||||
|
||||
val = anatop_get_bits(anatop_reg->mfd,
|
||||
anatop_reg->control_reg,
|
||||
anatop_reg->vol_bit_shift,
|
||||
anatop_reg->vol_bit_width);
|
||||
val = anatop_read_reg(anatop_reg->mfd, anatop_reg->control_reg);
|
||||
val = (val & ((1 << anatop_reg->vol_bit_width) - 1)) >>
|
||||
anatop_reg->vol_bit_shift;
|
||||
|
||||
return val - anatop_reg->min_bit_val;
|
||||
}
|
||||
|
|
|
@ -34,7 +34,7 @@ struct anatop {
|
|||
spinlock_t reglock;
|
||||
};
|
||||
|
||||
extern u32 anatop_get_bits(struct anatop *, u32, int, int);
|
||||
extern void anatop_set_bits(struct anatop *, u32, int, int, u32);
|
||||
extern u32 anatop_read_reg(struct anatop *, u32);
|
||||
extern void anatop_write_reg(struct anatop *, u32, u32, u32);
|
||||
|
||||
#endif /* __LINUX_MFD_ANATOP_H */
|
||||
|
|
Загрузка…
Ссылка в новой задаче