[PATCH] mfd: regulator: max8998: BUCK1/2 control augmented by GPIO pins

Lukasz Majewski l.majewski at samsung.com
Wed Sep 22 02:46:41 EDT 2010


On Tue, 21 Sep 2010 16:01:08 +0100
Mark Brown <broonie at opensource.wolfsonmicro.com> wrote:

> On Tue, Sep 21, 2010 at 04:18:15PM +0200, Lukasz Majewski wrote:
> > This patch facilitates the faster voltage change for BUCK1/2
> > regulators. It uses MAX8998 GPIO pins to control output voltage.
> > This feature is extremely useful for Dynamic Voltage Scalling (DVS)
> > implementation. This patch has been tested at Samsung GONI and
> > AQUILA targets. Corresponding platform code will be submitted in a
> > separate patch.
> 
> This would be easier to review if split out into a series - there's at
> least one change here which is basic code motion, splitting the LDO
> and DCDC handling into separate functions, and probably more.
> 
> > +	unsigned int		buck1_idx;
> > +	unsigned int		buck2_idx;
> 
> Comments explaining what this is for might help.
> 
> > +	previous_vol = max8998_get_voltage(rdev);
> > +
> > +	/* Check if voltage needs to be changed */
> > +	/* if previous_voltage equal new voltage, return */
> > +	if (previous_vol == max8998_list_voltage(rdev, i)) {
> > +		dev_dbg(max8998->dev, "No voltage change, old:%d,
> > new:%d\n",
> > +			previous_vol, max8998_list_voltage(rdev,
> > i));
> > +		return ret;
> > +	}
> > +	if (ldo == MAX8998_BUCK1) {
> 
> Some blank lines would help a lot with the legibility of the code, as
> would using something other than ldo as the variable identifying the
> DCDC.  Also, this series of if statements should be a switch
> statement.
> 
> > +		dvs_arm_no = ARRAY_SIZE(pdata->dvsarm);
> > +		dev_dbg(max8998->dev,
> > +			"BUCK1, i:%d, dvs1:%d, dvs2:%d, dvs3:%d,
> > dvs4:%d\n",
> > +			i, pdata->dvsarm[0], pdata->dvsarm[1],
> > +			pdata->dvsarm[2], pdata->dvsarm[3]);
> 
> All this code is assuming that BUCK1 is supplying the ARM core.  While
> this may be likely the code shouldn't be making that assumption.
> 
> > +	/* Wait until voltage is stabilized */
> > +	max8998_read_reg(i2c, MAX8998_REG_ONOFF4, &val);
> > +	/* lp3974 hasn't got ENRAMP bit - ramp is assumed as true
> > */
> > +	dev_dbg(max8998->dev, "name:%s\n", i2c->name);
> > +	if (max8998->iodev->type == TYPE_LP3974) {
> > +		difference = desc->min + desc->step*i -
> > previous_vol/1000; if (difference > 0)
> >  			udelay(difference / ((val & 0x0f) + 1));
> >  	}
> 
> This code shouldn't be here, you should be providing an enable_time()
> function.
> 
> > +	/* Check if platform data for max8998 has been declared */
> > +	if (pdata->dvsarm[0] != 0 && pdata->dvsarm[1] != 0 &&
> > +	    pdata->dvsarm[2] != 0 && pdata->dvsarm[3] != 0 &&
> > +	    pdata->dvsint[0] != 0 && pdata->dvsint[1] != 0) {
> 
> Why must GPIOs be specified for both regulators?  The user should be
> able to set only one up to use GPIOs.
> 
> > +			/* Set default values */
> > +			max8998->buck1_idx = 3;
> > +			max8998->buck2_idx = 1;
> 
> This looks awfully like it should come from platform data.
> 
> > +	if (pdata->set1 != 0 && pdata->set2 != 0 && pdata->set3 !=
> > 0) {
> 
> gpio_is_valid().
> 
> > +			gpio_request(pdata->set1, "PMIC SET1");
> > +			gpio_direction_output(pdata->set1,
> > +					      max8998->buck1_idx &
> > 0x1);
> 
> Use the name of the chip rather than PMIC, there may be more than one
> PMIC.
> 
> > +enum {
> > +	MAX8998_DVS_750mV,
> 
> I suspect the actual values for this enum are important, I'd expect to
> see them forced with an explicit = somewhere.  I'd also expect this to
> be hidden in the driver code and users just to specify voltages
> directly.  You already have the code to map voltages into these enums
> inside the driver so no need to expose it to users.
> 
> >  /**
> >   * max8998_regulator_data - regulator data
> >   * @id: regulator id
> > @@ -76,6 +111,13 @@ struct max8998_platform_data {
> >  	int				num_regulators;
> >  	int				irq_base;
> >  	int				ono;
> > +	u8              dvsarm[4];
> > +	u8		dvsint[2];
> > +	u8              dvsarm_init;
> > +	u8              dvsint_init;
> 
> As mentioned previously these should be named after the regulators,
> not after their uses on your boards.  You also need some documentation
> explaining what to do with these fields, they're not immediately
> obvious.  
> 
> For the voltage selection values I'm somewhat surprised to see them
> specified in the platform data - I would instead expect to see them
> figured out at runtime based on the voltages that are being set.
> 
> > +	int		set1;
> > +	int		set2;
> > +	int		set3;
> 
> These need documentation too.

Hello Mark,

Thank you for valuable comments.

If I can, I'd like to discuss one of them:

> For the voltage selection values I'm somewhat surprised to see them
> specified in the platform data - I would instead expect to see them
> figured out at runtime based on the voltages that are being set.

I'd like to ask you for clarification on this statement. Correct me if
I'm wrong, but I think that some default voltage values should be
declared in platform data (according to the chip manual) to facilitate
dynamic voltage scaling feature. I suspect that this information is
platform specific and should be adjusted for each chip separately.


-- 
Best regards,

Lukasz Majewski

Samsung Poland R&D Center
Platform Group



More information about the linux-arm-kernel mailing list