Message ID | 1346052285-4344-5-git-send-email-b29396@freescale.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Mon, Aug 27, 2012 at 03:24:42PM +0800, Dong Aisheng wrote: > From: Dong Aisheng <dong.aisheng@linaro.org> > > Using syscon to access anatop register. > > Acked-by: Mark Brown <broonie@opensource.wolfsonmicro.com> > Signed-off-by: Dong Aisheng <dong.aisheng@linaro.org> > --- > ChangeLog v1-v2: > * update to use generic regmap api > --- > arch/arm/boot/dts/imx6q.dtsi | 6 ++++++ > drivers/regulator/Kconfig | 2 +- > drivers/regulator/anatop-regulator.c | 25 +++++++++++++++---------- > 3 files changed, 22 insertions(+), 11 deletions(-) > > diff --git a/arch/arm/boot/dts/imx6q.dtsi b/arch/arm/boot/dts/imx6q.dtsi > index db3fa15..da2bb71 100644 > --- a/arch/arm/boot/dts/imx6q.dtsi > +++ b/arch/arm/boot/dts/imx6q.dtsi > @@ -395,6 +395,7 @@ > anatop-min-bit-val = <4>; > anatop-min-voltage = <800000>; > anatop-max-voltage = <1375000>; > + fsl,anatop = <&anatop>; > }; > > regulator-3p0@120 { > @@ -409,6 +410,7 @@ > anatop-min-bit-val = <0>; > anatop-min-voltage = <2625000>; > anatop-max-voltage = <3400000>; > + fsl,anatop = <&anatop>; > }; > > regulator-2p5@130 { > @@ -423,6 +425,7 @@ > anatop-min-bit-val = <0>; > anatop-min-voltage = <2000000>; > anatop-max-voltage = <2750000>; > + fsl,anatop = <&anatop>; > }; > > regulator-vddcore@140 { > @@ -437,6 +440,7 @@ > anatop-min-bit-val = <1>; > anatop-min-voltage = <725000>; > anatop-max-voltage = <1450000>; > + fsl,anatop = <&anatop>; > }; > > regulator-vddpu@140 { > @@ -451,6 +455,7 @@ > anatop-min-bit-val = <1>; > anatop-min-voltage = <725000>; > anatop-max-voltage = <1450000>; > + fsl,anatop = <&anatop>; > }; > > regulator-vddsoc@140 { > @@ -465,6 +470,7 @@ > anatop-min-bit-val = <1>; > anatop-min-voltage = <725000>; > anatop-max-voltage = <1450000>; > + fsl,anatop = <&anatop>; > }; > }; > > diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig > index 4e932cc..2ae1d97 100644 > --- a/drivers/regulator/Kconfig > +++ b/drivers/regulator/Kconfig > @@ -112,7 +112,7 @@ config REGULATOR_DA9052 > > config REGULATOR_ANATOP > tristate "Freescale i.MX on-chip ANATOP LDO regulators" > - depends on MFD_ANATOP > + depends on MFD_SYSCON > help > Say y here to support Freescale i.MX on-chip ANATOP LDOs > regulators. It is recommended that this option be > diff --git a/drivers/regulator/anatop-regulator.c b/drivers/regulator/anatop-regulator.c > index ce0fe72..71586a7 100644 > --- a/drivers/regulator/anatop-regulator.c > +++ b/drivers/regulator/anatop-regulator.c > @@ -21,19 +21,20 @@ > #include <linux/slab.h> > #include <linux/device.h> > #include <linux/module.h> > +#include <linux/mfd/syscon.h> > #include <linux/err.h> > #include <linux/io.h> > #include <linux/platform_device.h> > #include <linux/of.h> > #include <linux/of_address.h> > -#include <linux/mfd/anatop.h> > +#include <linux/regmap.h> > #include <linux/regulator/driver.h> > #include <linux/regulator/of_regulator.h> > > struct anatop_regulator { > const char *name; > u32 control_reg; > - struct anatop *mfd; > + struct regmap *anatop; > int vol_bit_shift; > int vol_bit_width; > int min_bit_val; > @@ -43,7 +44,7 @@ struct anatop_regulator { > struct regulator_init_data *initdata; > }; > > -static int anatop_set_voltage_sel(struct regulator_dev *reg, unsigned selector) > +static int anatop_regmap_set_voltage_sel(struct regulator_dev *reg, unsigned selector) > { > struct anatop_regulator *anatop_reg = rdev_get_drvdata(reg); > u32 val, mask; > @@ -56,12 +57,13 @@ static int anatop_set_voltage_sel(struct regulator_dev *reg, unsigned selector) > 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); > + regmap_update_bits(anatop_reg->anatop, anatop_reg->control_reg, > + mask, val); > > return 0; > } > > -static int anatop_get_voltage_sel(struct regulator_dev *reg) > +static int anatop_regmap_get_voltage_sel(struct regulator_dev *reg) > { > struct anatop_regulator *anatop_reg = rdev_get_drvdata(reg); > u32 val, mask; > @@ -69,7 +71,7 @@ static int anatop_get_voltage_sel(struct regulator_dev *reg) > if (!anatop_reg->control_reg) > return -ENOTSUPP; > > - val = anatop_read_reg(anatop_reg->mfd, anatop_reg->control_reg); > + regmap_read(anatop_reg->anatop, anatop_reg->control_reg, &val); > mask = ((1 << anatop_reg->vol_bit_width) - 1) << > anatop_reg->vol_bit_shift; > val = (val & mask) >> anatop_reg->vol_bit_shift; > @@ -78,8 +80,8 @@ static int anatop_get_voltage_sel(struct regulator_dev *reg) > } > > static struct regulator_ops anatop_rops = { > - .set_voltage_sel = anatop_set_voltage_sel, > - .get_voltage_sel = anatop_get_voltage_sel, > + .set_voltage_sel = anatop_regmap_set_voltage_sel, > + .get_voltage_sel = anatop_regmap_get_voltage_sel, > .list_voltage = regulator_list_voltage_linear, > .map_voltage = regulator_map_voltage_linear, > }; > @@ -92,7 +94,6 @@ static int __devinit anatop_regulator_probe(struct platform_device *pdev) > struct regulator_dev *rdev; > struct anatop_regulator *sreg; > struct regulator_init_data *initdata; > - struct anatop *anatopmfd = dev_get_drvdata(pdev->dev.parent); > struct regulator_config config = { }; > int ret = 0; > > @@ -109,7 +110,11 @@ static int __devinit anatop_regulator_probe(struct platform_device *pdev) > rdesc->ops = &anatop_rops; > rdesc->type = REGULATOR_VOLTAGE; > rdesc->owner = THIS_MODULE; > - sreg->mfd = anatopmfd; > + > + sreg->anatop = syscon_regmap_lookup_by_phandle(np, "fsl,anatop"); > + if (IS_ERR(sreg->anatop)) > + return PTR_ERR(sreg->anatop); > + All the anatop regulators are child nodes of anatop. It looks a little odd to use phandle there. of_get_parent should just works. > ret = of_property_read_u32(np, "anatop-reg-offset", > &sreg->control_reg); > if (ret) { > -- > 1.7.0.4 > >
On Tue, Aug 28, 2012 at 06:15:35AM +0800, Shawn Guo wrote: .... > > + sreg->anatop = syscon_regmap_lookup_by_phandle(np, "fsl,anatop"); > > + if (IS_ERR(sreg->anatop)) > > + return PTR_ERR(sreg->anatop); > > + > > All the anatop regulators are child nodes of anatop. It looks a little > odd to use phandle there. of_get_parent should just works. > Yes, this is a special case. It's also ok for me to use of_get_parent if you want. Will update it. Regards Dong Aisheng
diff --git a/arch/arm/boot/dts/imx6q.dtsi b/arch/arm/boot/dts/imx6q.dtsi index db3fa15..da2bb71 100644 --- a/arch/arm/boot/dts/imx6q.dtsi +++ b/arch/arm/boot/dts/imx6q.dtsi @@ -395,6 +395,7 @@ anatop-min-bit-val = <4>; anatop-min-voltage = <800000>; anatop-max-voltage = <1375000>; + fsl,anatop = <&anatop>; }; regulator-3p0@120 { @@ -409,6 +410,7 @@ anatop-min-bit-val = <0>; anatop-min-voltage = <2625000>; anatop-max-voltage = <3400000>; + fsl,anatop = <&anatop>; }; regulator-2p5@130 { @@ -423,6 +425,7 @@ anatop-min-bit-val = <0>; anatop-min-voltage = <2000000>; anatop-max-voltage = <2750000>; + fsl,anatop = <&anatop>; }; regulator-vddcore@140 { @@ -437,6 +440,7 @@ anatop-min-bit-val = <1>; anatop-min-voltage = <725000>; anatop-max-voltage = <1450000>; + fsl,anatop = <&anatop>; }; regulator-vddpu@140 { @@ -451,6 +455,7 @@ anatop-min-bit-val = <1>; anatop-min-voltage = <725000>; anatop-max-voltage = <1450000>; + fsl,anatop = <&anatop>; }; regulator-vddsoc@140 { @@ -465,6 +470,7 @@ anatop-min-bit-val = <1>; anatop-min-voltage = <725000>; anatop-max-voltage = <1450000>; + fsl,anatop = <&anatop>; }; }; diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig index 4e932cc..2ae1d97 100644 --- a/drivers/regulator/Kconfig +++ b/drivers/regulator/Kconfig @@ -112,7 +112,7 @@ config REGULATOR_DA9052 config REGULATOR_ANATOP tristate "Freescale i.MX on-chip ANATOP LDO regulators" - depends on MFD_ANATOP + depends on MFD_SYSCON help Say y here to support Freescale i.MX on-chip ANATOP LDOs regulators. It is recommended that this option be diff --git a/drivers/regulator/anatop-regulator.c b/drivers/regulator/anatop-regulator.c index ce0fe72..71586a7 100644 --- a/drivers/regulator/anatop-regulator.c +++ b/drivers/regulator/anatop-regulator.c @@ -21,19 +21,20 @@ #include <linux/slab.h> #include <linux/device.h> #include <linux/module.h> +#include <linux/mfd/syscon.h> #include <linux/err.h> #include <linux/io.h> #include <linux/platform_device.h> #include <linux/of.h> #include <linux/of_address.h> -#include <linux/mfd/anatop.h> +#include <linux/regmap.h> #include <linux/regulator/driver.h> #include <linux/regulator/of_regulator.h> struct anatop_regulator { const char *name; u32 control_reg; - struct anatop *mfd; + struct regmap *anatop; int vol_bit_shift; int vol_bit_width; int min_bit_val; @@ -43,7 +44,7 @@ struct anatop_regulator { struct regulator_init_data *initdata; }; -static int anatop_set_voltage_sel(struct regulator_dev *reg, unsigned selector) +static int anatop_regmap_set_voltage_sel(struct regulator_dev *reg, unsigned selector) { struct anatop_regulator *anatop_reg = rdev_get_drvdata(reg); u32 val, mask; @@ -56,12 +57,13 @@ static int anatop_set_voltage_sel(struct regulator_dev *reg, unsigned selector) 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); + regmap_update_bits(anatop_reg->anatop, anatop_reg->control_reg, + mask, val); return 0; } -static int anatop_get_voltage_sel(struct regulator_dev *reg) +static int anatop_regmap_get_voltage_sel(struct regulator_dev *reg) { struct anatop_regulator *anatop_reg = rdev_get_drvdata(reg); u32 val, mask; @@ -69,7 +71,7 @@ static int anatop_get_voltage_sel(struct regulator_dev *reg) if (!anatop_reg->control_reg) return -ENOTSUPP; - val = anatop_read_reg(anatop_reg->mfd, anatop_reg->control_reg); + regmap_read(anatop_reg->anatop, anatop_reg->control_reg, &val); mask = ((1 << anatop_reg->vol_bit_width) - 1) << anatop_reg->vol_bit_shift; val = (val & mask) >> anatop_reg->vol_bit_shift; @@ -78,8 +80,8 @@ static int anatop_get_voltage_sel(struct regulator_dev *reg) } static struct regulator_ops anatop_rops = { - .set_voltage_sel = anatop_set_voltage_sel, - .get_voltage_sel = anatop_get_voltage_sel, + .set_voltage_sel = anatop_regmap_set_voltage_sel, + .get_voltage_sel = anatop_regmap_get_voltage_sel, .list_voltage = regulator_list_voltage_linear, .map_voltage = regulator_map_voltage_linear, }; @@ -92,7 +94,6 @@ static int __devinit anatop_regulator_probe(struct platform_device *pdev) struct regulator_dev *rdev; struct anatop_regulator *sreg; struct regulator_init_data *initdata; - struct anatop *anatopmfd = dev_get_drvdata(pdev->dev.parent); struct regulator_config config = { }; int ret = 0; @@ -109,7 +110,11 @@ static int __devinit anatop_regulator_probe(struct platform_device *pdev) rdesc->ops = &anatop_rops; rdesc->type = REGULATOR_VOLTAGE; rdesc->owner = THIS_MODULE; - sreg->mfd = anatopmfd; + + sreg->anatop = syscon_regmap_lookup_by_phandle(np, "fsl,anatop"); + if (IS_ERR(sreg->anatop)) + return PTR_ERR(sreg->anatop); + ret = of_property_read_u32(np, "anatop-reg-offset", &sreg->control_reg); if (ret) {