Benoit,
thanks.. overall good discussion that is nice to take in.. more comments
follow:

Cousson, Benoit said the following on 10/26/2009 08:05 AM:
>> From: Nishanth Menon [mailto:menon.nisha...@gmail.com]
>>
>> Cousson, Benoit said the following on 10/25/2009 05:12 PM:
>>     
>>>> diff --git a/arch/arm/mach-omap2/smartreflex.c b/arch/arm/mach-
>>>>
>>>>         
>> [...]
>>     
>>>> +     },
>>>> +             /* *INDENT-ON* */
>>>> +};
>>>> +
>>>> +/* SR list for 3430 */
>>>> +static __initdata struct omap_sr_list omap34xx_srlist = {
>>>> +     .num_sr = 2,
>>>> +     .sr_list = {&omap34xx_sr1, &omap34xx_sr2}
>>>> +};
>>>> +
>>>> +/* The final SR list */
>>>> +static struct omap_sr_list *omap_srlist;
>>>>
>>>>         
>>> I have a couple a suggestions regarding the code partitioning:
>>>
>>> - SmartReflex is one IP with several instances; it means that only the
>>>       
>> base address will change between SR1 and SR2. There is no need to
>> duplicate the mask and shift defines per SR.
>>     
>> might have been easier with a standard OCP wrapper and standard
>> INT/INTSTATUS regs for SR instead of the current integration.... but
>> yeah, I had been thinking of that- if O4/beyond could have the same IP
>> wrapped in a different register mapping, i should handle it then, not
>> dream about it now.. I get your point here.. there are a few places we
>> can kick it out and some places your are stuck with them!
>>     
>
> SR is a regular IP, with a dedicated PD, dedicated fclk and bound to the L4...
> VP/VC is not, that why I was proposing to separated them.
>   
I am not denying it, but VP/VC functions are already separated out where
I could do it (note the seperation of function names), only they dont
have a new file perse.. but that is not needed at the moment.
>   
>>> Moreover, SR being an IP, I think we can encode the one IP / several
>>>       
>> instance in a platform_device / platform_driver code. It will allow the
>> support of several drivers for the same devices in order to implement for
>> example class3, class2 or class1 drivers. SR can even be represented by an
>> HWMOD.
>>     
>> what is your intention in misusing platform_device for a SOC specific
>> code? I think you have an idea here that I am completely missing. can
>> you care to elaborate?
>>     
>
> AFAIK, platform_device is there in order to deal with SoC devices???
> Considering that SR is an IP that can be in several SoC, it looks to me the 
> perfect candidate for platform_device/platform_driver.
> Am I missing something?
>   
Everything abstracted is a perfect candidate for device-driver model,
but that is beside the point. platform_device traditionally has been
platform aka board specific info, not SOC specific info..
>   
>>> - The smartreflex.c file contains 34xx specifics code; it should not be
>>>       
>> there, only SR specific code should be there.
>>     
>> read the TODO. which specific 3430 code does it have? other than using
>> macros which have 34xx prefix - that should be killed -yep.
>>     
>
> omap34xx_sr1, omap34xx_sr2, omap34xx_srlist... seem to be quite OMAP34xx 
> specifics...
>   
please read the code carefully next time, look at how it is copied based
on cpu_is_ api in in __init??
yes, there are specific paramaters to SOC, you cannot avoid that. but
you can make the handling independent of the SOC. that is what I have
done.. let me know if you have a better idea.. :D..

>   
>>> - If we want to go further, I think that the VP/VC code should not be in
>>>       
>> SR code either. It is located in the PRM, and can be used independently of
>> SR.
>>     
>>>   - In a SR class 2 mode, the smartreflex driver will not use the direct
>>>     connection to the VP.
>>>   - If we don't want SR we can still use the VP/VC for device voltage
>>>     control.
>>>
>>>       
>>       - How about adding - Smart reflex  should actually fit in a
>> voltage control infrastructure so that the system can manipulate and set
>> voltage with and without SR..
>>     
>
> Fully agree, that was one of the proposals I had in mind, but since it will 
> require some more works, it should be done in a second pass.
>
>   
>> that is what is really missing in our code base today -> SR and VP comes
>> plugged in close as buddies in all silicons, so if your recommendation
>> has an silicon example where OMAP SR talks not to VP, let me know and I
>> will second splitting the code :D. till then sorry.. you dont have a case.
>>     
>
> We had the case in several chips that unfortunately are not there anymore
> :-(
> The SR IP was done to handle several config, having SR tied to VP/VC is a 
> chip dependant implementation.
>   
lets bring in a proper voltage control infrastructure then worry about
SR class2/class3 implementation. class2 is inferior to class 3 and the
overhead of cpu intervention should be balanced with a proper latency
heuristics, the infrastructure is sadly missing at this point of time..

>   
>> now, it is a different case where you want to use SR as a pure
>> monitoring engine -> that is not an implementation that is exactly
>> better than class 3 operation.. why support it at all?
>>     
>
> It is not a matter or being better, it is just having HW vs. SW 
> implementation. The point is Class 3 is not usable with non SR compliant 
> power IC. In that case you should rely on a Class 2 implementation.
>   
yep, I am aware of it.. but see my previous comment -> just thinking
PMIC is not enough, there is a tradeoff involved for Class 2 operation -
for continuous monitoring - hwmod etc might be a better option in that
case.. but most of the folks do use PMICs and can benefit.. for proper
values, you need NVALUES - dont forget that NOT all ICs have them burnt
in.. and cant use SR anyways properly..

>   
>>>  [snip]
>>>
>>>
>>>       
>>>> +/****************** PMIC WEAK FUNCTIONS FOR TWL4030 derivatives
>>>> **********/
>>>> +
>>>> +/**
>>>> + * @brief pmic_srinit - Power management IC initialization
>>>> + * for smart reflex. The current code is written for TWL4030
>>>> + * derivatives, replace in board file if PMIC requires
>>>> + * a different sequence
>>>> + *
>>>> + * @return result of operation
>>>> + */
>>>> +int __weak __init omap_pmic_srinit(void)
>>>> +{
>>>> +     int ret = -ENODEV;
>>>> +#ifdef CONFIG_TWL4030_CORE
>>>> +     u8 reg;
>>>> +     /* Enable SR on T2 */
>>>> +     ret = twl4030_i2c_read_u8(TWL4030_MODULE_PM_RECEIVER, &reg,
>>>> +                               R_DCDC_GLOBAL_CFG);
>>>> +
>>>> +     reg |= DCDC_GLOBAL_CFG_ENABLE_SRFLX;
>>>> +     ret |= twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, reg,
>>>> +                                 R_DCDC_GLOBAL_CFG);
>>>> +#endif                               /* End of CONFIG_TWL4030_CORE */
>>>> +     return ret;
>>>> +}
>>>> +
>>>> +/**
>>>> + * @brief omap_pmic_voltage_ramp_delay - how much should this pmic
>>>>         
>> ramp
>>     
>>>> delay
>>>> + * Various PMICs have different ramp up and down delays. choose to
>>>> implement
>>>> + * in required pmic file to override this function.
>>>> + * On TWL4030 derivatives:
>>>> + *  T2 SMPS slew rate (min) 4mV/uS, step size 12.5mV,
>>>> + *  2us added as buffer.
>>>> + *
>>>> + * @param srid - which SR is this for?
>>>> + * @param target_vsel - targetted voltage selction
>>>> + * @param current_vsel - current voltage selection
>>>> + *
>>>> + * @return delay in uSeconds
>>>> + */
>>>> +u32 __weak omap_pmic_voltage_ramp_delay(u8 srid, u8 target_vsel,
>>>> +                                     u8 current_vsel)
>>>> +{
>>>> +     u32 t2_smps_steps = abs(target_vsel - current_vsel);
>>>> +     u32 t2_smps_delay = ((t2_smps_steps * 125) / 40) + 2;
>>>> +     return t2_smps_delay;
>>>> +}
>>>> +
>>>> +#ifdef CONFIG_OMAP_VC_BYPASS_UPDATE
>>>> +/**
>>>> + * @brief omap_pmic_voltage_cmds - hook for pmic command sequence
>>>> + * to be send out which are specific to pmic to set a specific voltage.
>>>> + * this should inturn call vc_send_command with the required sequence
>>>> + * The current implementation is for TWL4030 derivatives
>>>> + *
>>>> + * @param srid - which SR is this for?
>>>> + * @param target_vsel - what voltage is desired to be set?
>>>> + *
>>>> + * @return specific value to set.
>>>> + */
>>>> +int __weak omap_pmic_voltage_cmds(u8 srid, u8 target_vsel)
>>>> +{
>>>> +     u8 reg_addr = (srid == SR1) ? R_VDD1_SR_CONTROL :
>>>>         
>> R_VDD2_SR_CONTROL;
>>     
>>>> +     u16 timeout = COUNT_TIMEOUT_TWL4030_VCBYPASS;
>>>> +     return vc_send_command(R_SRI2C_SLAVE_ADDR, reg_addr, target_vsel,
>>>> +                            &timeout);
>>>> +}
>>>> +#endif                               /* ifdef
>>>>         
>> CONFIG_OMAP_VC_BYPASS_UPDATE */
>>     
>>>> +
>>>>
>>>>         
>>> The TWL4030 specific code should not be there even if this is the
>>>       
>> default PMIC, it should be in TWL4030 driver code.
>>     
>>> The usage of weak functions will prevent a multiple OMAP build with
>>>       
>> different PMIC to work.
>>     
>>> The mapping between omap and TWL4030 should be done in the board
>>>       
>> specific code.
>>     
>> hmm good point.. have a recommendation here?
>>     
>
> We can define a struct with these methods. The struct will be implemented 
> inside the PMIC code. The binding will be done in the board setup code. The 
> SR driver will use the struct pointer to dereference the methods.
>   
I like words, but prefer a patch instead ;).. This is not something I
want to do over my lunch hour ;).. maybe we should take it up as a
follow up patch?

Regards,
NM
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to