[U-Boot] [PATCH v2 2/3] pmic:pfuze implement regulator mode set

Peng Fan B51431 at freescale.com
Fri Jan 16 02:59:40 CET 2015


Hi, Przemyslaw

On 1/15/2015 10:58 PM, Przemyslaw Marczak wrote:
> Hello Peng,
>
> On 01/15/2015 11:18 AM, Peng Fan wrote:
>> This patch is to implement pfuze_mode_init and pfuze_regulator_mode_set
>> function, and add prototype in header file.
>>
>> pfuze_mode_init is to set switching mode for all buck regulators to
>> improve system efficiency.
>> pfuze_regulator_mode_set is to set the regulator's mode according input
>> parameter.
>>
>> Mode:
>> OFF: The regulator is switched off and the output voltage is discharged.
>> PFM: In this mode, the regulator is always in PFM mode, which
>>       is useful at light loads for optimized efficiency.
>> PWM: In this mode, the regulator is always in PWM mode operation
>>       regardless of load conditions.
>> APS: In this mode, the regulator moves automatically between
>>       pulse skipping mode and PWM mode depending on load conditions.
>>
>> Signed-off-by: Peng Fan <Peng.Fan at freescale.com>
>> ---
>>
>> Changes v2:
>>   implement one function mode for one regulator.
>>
>>   board/freescale/common/pfuze.c | 43 
>> ++++++++++++++++++++++++++++++++++++++++++
>>   board/freescale/common/pfuze.h |  2 ++
>>   2 files changed, 45 insertions(+)
>>
>> diff --git a/board/freescale/common/pfuze.c 
>> b/board/freescale/common/pfuze.c
>> index 2cd1794..f2fffc1 100644
>> --- a/board/freescale/common/pfuze.c
>> +++ b/board/freescale/common/pfuze.c
>> @@ -8,6 +8,49 @@
>>   #include <power/pmic.h>
>>   #include <power/pfuze100_pmic.h>
>>
>> +/* Set one switch regulator's mode */
>
> This is not exactly what I mean.
> Actually by doing this, we have pmic_reg_write() function with just 
> the other name.
>
>> +int pfuze_regulator_mode_set(struct pmic *p, u32 regulator, u32 mode)
>> +{
>> +    return pmic_reg_write(p, regulator, mode);
>> +}
>
> The 'u32 regulator' suggests to pass the regulator number rather than 
> defined mode register address - little unclear.
>
> And the "pfuze.." function name is general and should be implemented 
> by pfuze driver, which could be 'temporary' implemented in:
>
> drivers/power/pmic/pmic_pfuze100.c
>
> And this driver should take care of the PFUZE id and write the given 
> mode to proper pmic register address.
>
> I mean 'temporary' because, soon we will move to the next pmic 
> framework, finally I hope to send it at the end of the next week.
>
>> +
>> +/* Set all switch regulators' working mode */
>
> So I think, that the below function without the loop could be 
> implemented in the pfuze driver file.
>
>> +int pfuze_mode_init(struct pmic *p, u32 mode)
>
> Starting with some like this:
>
> int pfuze_sw_regulator_mode_set(struct pmic *p, u32 ??switch_num??, 
> u32 mode)
>
>> +{
>> +    unsigned char offset, i, switch_num;
>> +    u32 id, ret;
>> +
>> +    pmic_reg_read(p, PFUZE100_DEVICEID, &id);
>> +    id = id & 0xf;
>> +
>> +    if (id == 0) {
>> +        switch_num = 6;
>> +        offset = PFUZE100_SW1CMODE;
>> +    } else if (id == 1) {
>> +        switch_num = 4;
>> +        offset = PFUZE100_SW2MODE;
>> +    } else {
>> +        printf("Not supported, id=%d\n", id);
>> +        return -1;
>> +    }
>> +
> Ending with something like this:
> ret = pmic_reg_write(p, offset + switch_num * 7, mode);
> if (ret ...
> ...
> }
>
> And this code below can stay in the 'common.c' code, with small changes:
> ret = pfuze_sw_regulator_mode_set(p, 1, mode);
>> +    ret = pfuze_regulator_mode_set(p, PFUZE100_SW1ABMODE, mode);
>> +    if (ret < 0) {
>> +        printf("Set SW1AB mode error!\n");
>> +        return ret;
>> +    }
>> +
>> +    for (i = 0; i < switch_num - 1; i++) {
>
> ret = pfuze_sw_regulator_mode_set(p, i, mode);
>
>> +        ret = pfuze_regulator_mode_set(p, offset + i * 7, mode);
>> +        if (ret < 0) {
>> +            printf("Set switch%x mode error!\n", offset + i * 7);
>> +            return ret;
>> +        }
>> +    }
>> +
>> +    return ret;
>> +}
>> +
>>   struct pmic *pfuze_common_init(unsigned char i2cbus)
>>   {
>>       struct pmic *p;
>> diff --git a/board/freescale/common/pfuze.h 
>> b/board/freescale/common/pfuze.h
>> index 7a4126c..7c316c6 100644
>> --- a/board/freescale/common/pfuze.h
>> +++ b/board/freescale/common/pfuze.h
>> @@ -8,5 +8,7 @@
>>   #define __PFUZE_BOARD_HELPER__
>>
>>   struct pmic *pfuze_common_init(unsigned char i2cbus);
>> +int pfuze_mode_init(struct pmic *p, u32 mode);
>
>> +int pfuze_regulator_mode_set(struct pmic *p, u32 regulator, u32 mode);
>
> And this:
>
> int pfuze_sw_regulator_mode_set(...);
>
> should go here:
> include/power/pfuze100_pmic.h
>
>>
>>   #endif
>>
>
> I suggested the 'sw' in the function name for the switching regulator 
> type, so then we can pass just switching regulator number as an 
> argument: e.g. 1,2,3...
>
> And maybe in the future you will need ldo or some else regulator type,
> so adding 'pfuze_ldo_regulator_mode_set' function, will keep the code 
> consistence.
>
> I would like to keep the driver specific code in driver file and 
> common code in the common file.
Thanks for your review.
Get it.  I think this first version is fine for me now, this new feature 
can be done in future patch.
>
> I think it is reasonable. If you now prefer to keep the first version 
> of this patch set, then you have still my ACK for it:).
>
> Best regards,
Regards,
Peng.


More information about the U-Boot mailing list