>>-----Original Message-----
>>From: Kevin Hilman [mailto:khil...@deeprootsystems.com]
>>Sent: Thursday, September 02, 2010 6:04 AM
>>To: Gopinath, Thara
>>Cc: linux-omap@vger.kernel.org; p...@pwsan.com; Sripathy, Vishwanath; Sawant, 
>>Anand; Cousson, Benoit
>>Subject: Re: [PATCH 04/13] OMAP: Introduce API to return a device list 
>>associated with a voltage
>>domain
>>
>>Thara Gopinath <th...@ti.com> writes:
>>
>>> This patch adds an API in the opp layer that
>>> can be used by the voltage layer to get a list of all the
>>> scalable devices belonging to a particular voltage domain.
>>> This API is to be typically called only once by the voltage
>>> layer per voltage domain instance and the device list should
>>> be stored. This approach makes it easy during dvfs to scale
>>> all the devices associated with a voltage domain and then
>>> scale the voltage domain.
>>>
>>> Signed-off-by: Thara Gopinath <th...@ti.com>
>>
>>I don't think the OPP layer is the right place for this after all.
>>
>>How about something like this in the voltage layer:
>>
>>  omap_voltage_add_device(struct voltagedomain *voltdm, struct device *dev)
>>
>>During omap_device_build(), if the hwmod has a voltage domain, it
>>calls this function to register it with the voltage layer.

This mandates voltage layer to be initialized before the first omap_device_build
has happened. I think that is going to be a very confusing sequencing. Also 
today
voltage layer init happens later in the system.

>>
>>This function then creates a list (internal to voltage layer) of all the
>>devices in a voltage domain rather than having to query the OPP layer
>>for it.
>>
>>Kevin
>>
>>> ---
>>>  arch/arm/plat-omap/include/plat/opp.h |    9 +++++++++
>>>  arch/arm/plat-omap/opp.c              |   28 ++++++++++++++++++++++++++++
>>>  2 files changed, 37 insertions(+), 0 deletions(-)
>>>
>>> diff --git a/arch/arm/plat-omap/include/plat/opp.h 
>>> b/arch/arm/plat-omap/include/plat/opp.h
>>> index 0e580ed..a4c1669 100644
>>> --- a/arch/arm/plat-omap/include/plat/opp.h
>>> +++ b/arch/arm/plat-omap/include/plat/opp.h
>>> @@ -18,6 +18,7 @@
>>>  #include <linux/cpufreq.h>
>>>
>>>  #include <plat/common.h>
>>> +#include <plat/voltage.h>
>>>
>>>  /**
>>>   * struct omap_opp_def - OMAP OPP Definition
>>> @@ -86,6 +87,9 @@ int opp_disable(struct omap_opp *opp);
>>>
>>>  void opp_init_cpufreq_table(struct device *dev,
>>>                         struct cpufreq_frequency_table **table);
>>> +
>>> +struct device **opp_init_voltage_params(struct voltagedomain *voltdm,
>>> +                                   int *dev_count);
>>>  #else
>>>  static inline unsigned long opp_get_voltage(const struct omap_opp *opp)
>>>  {
>>> @@ -149,5 +153,10 @@ void opp_init_cpufreq_table(struct omap_opp *opps,
>>>  {
>>>  }
>>>
>>> +static inline struct device **opp_init_voltage_params(
>>> +                   struct voltagedomain *voltdm, int *dev_count)
>>> +{
>>> +}
>>> +
>>>  #endif             /* CONFIG_PM */
>>>  #endif             /* __ASM_ARM_OMAP_OPP_H */
>>> diff --git a/arch/arm/plat-omap/opp.c b/arch/arm/plat-omap/opp.c
>>> index a3dea82..72dd62a 100644
>>> --- a/arch/arm/plat-omap/opp.c
>>> +++ b/arch/arm/plat-omap/opp.c
>>> @@ -502,3 +502,31 @@ void opp_init_cpufreq_table(struct device *dev,
>>>
>>>     *table = &freq_table[0];
>>>  }
>>> +
>>> +struct device **opp_init_voltage_params(struct voltagedomain *voltdm,
>>> +                                   int *dev_count)
>>> +{
>>> +   struct device_opp *dev_opp;
>>> +   struct device **dev_list;
>>> +   int count = 0, i = 0;
>>> +
>>> +   list_for_each_entry(dev_opp, &dev_opp_list, node) {
>>> +           if (!dev_opp->oh->vdd_name)
>>> +                   continue;
>>> +
>>> +           if (!strcmp(dev_opp->oh->vdd_name, voltdm->name)) {
>>> +                   dev_opp->oh->voltdm = voltdm;
>>> +                   count++;
>>> +           }
>>> +   }
>>> +
>>> +   dev_list = kzalloc(sizeof(struct device *) * count, GFP_KERNEL);
>>> +
>>> +   list_for_each_entry(dev_opp, &dev_opp_list, node) {
>>> +           if (dev_opp->oh->voltdm == voltdm)
>>> +                   dev_list[i++] = dev_opp->dev;
>>> +   }
>>> +
>>> +   *dev_count = count;
>>> +   return dev_list;
>>> +}
--
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