All of lore.kernel.org
 help / color / mirror / Atom feed
From: Nishanth Menon <nm@ti.com>
To: "Dasgupta, Romit" <romit@ti.com>
Cc: "khilman@deeprootsystems.com" <khilman@deeprootsystems.com>,
	"linux-omap@vger.kernel.org" <linux-omap@vger.kernel.org>
Subject: Re: [PM-WIP-OPP][PATCH] OPP: Introduces enum for addressing different OPP types
Date: Tue, 12 Jan 2010 11:19:01 -0600	[thread overview]
Message-ID: <4B4CAF05.2060001@ti.com> (raw)
In-Reply-To: <1263299979.1536.7.camel@boson>

Dasgupta, Romit had written, on 01/12/2010 06:39 AM, the following:
 > Introduces enum for identifying OPP types. This helps in querying the OPP
 > layer by passing the type of OPP (enum types) and gets away from 
maintaining
 > the pointer to the OPP data list outside the OPP layer.

Style comment: an additional EOL here will be nice between commit 
message and signed-off-by.

General comment: might be good to state the enum types you are 
introducing for
OMAP3 in the commit message

 > Signed-off-by: Romit Dasgupta <romit@ti.com>
 > ---
 >
link to previous discussions here might help reviewers esp to give 
context for the design choice.

 >  arch/arm/mach-omap2/pm34xx.c          |   15 +--
 >  arch/arm/mach-omap2/resource34xx.c    |   84 +++++++++------------
 >  arch/arm/mach-omap2/smartreflex.c     |   33 ++------
 >  arch/arm/plat-omap/common.c           |    6 -
 >  arch/arm/plat-omap/cpu-omap.c         |   12 +--
 >  arch/arm/plat-omap/include/plat/opp.h |   60 +++++++--------
 >  arch/arm/plat-omap/omap-pm-noop.c     |    4 -
 >  arch/arm/plat-omap/omap-pm-srf.c      |    4 -
 >  arch/arm/plat-omap/opp.c              |   96 +++++++++++++++---------
 >  9 files changed, 148 insertions(+), 166 deletions(-)
 >
 >
 > diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c
 > index 5c751c1..8c73e0e 100644
 > --- a/arch/arm/mach-omap2/pm34xx.c
 > +++ b/arch/arm/mach-omap2/pm34xx.c
 > @@ -1347,7 +1347,7 @@ static void __init configure_vc(void)
 >
 >  void __init omap3_pm_init_opp_table(void)
 >  {
 > -       int i;
 > +       int i, ret, entries;
 >         struct omap_opp_def **omap3_opp_def_list;
 >         struct omap_opp_def *omap34xx_opp_def_list[] = {
 >                 omap34xx_mpu_rate_table,
 > @@ -1359,18 +1359,15 @@ void __init omap3_pm_init_opp_table(void)
 >                 omap36xx_l3_rate_table,
 >                 omap36xx_dsp_rate_table
 >         };
 > -       struct omap_opp **omap3_rate_tables[] = {
 > -               &mpu_opps,
 > -               &l3_opps,
 > -               &dsp_opps
 > -       };
 >
 >         omap3_opp_def_list = cpu_is_omap3630() ? omap36xx_opp_def_list :
 >                                 omap34xx_opp_def_list;
 > -       for (i = 0; i < ARRAY_SIZE(omap3_rate_tables); i++) {
 > -               *omap3_rate_tables[i] = 
opp_init_list(omap3_opp_def_list[i]);
 > +       entries = cpu_is_omap3630() ? ARRAY_SIZE(omap34xx_opp_def_list) :
 > +                       ARRAY_SIZE(omap36xx_opp_def_list);
 > +       for (i = 1; i <= entries; i++) {
 > +               ret = opp_init_list(i, omap3_opp_def_list[i - 1]);
a) if you remove OPP_NONE, i-1 is not needed (same everywhere in the patch)
b) if we modify the ENUMS or the sequence of definitions in opp_t the 
logic here
becomes fault. it might be good to retain an equivalent of 
omap3_rate_table with
enum equivalents and register by indexing off that.

 >                 /* We dont want half configured system at the moment */
 > -               BUG_ON(IS_ERR(omap3_rate_tables[i]));
 > +               BUG_ON(ret);
 >         }
 >  }
 >
 > diff --git a/arch/arm/mach-omap2/resource34xx.c 
b/arch/arm/mach-omap2/resource34xx.c
 > index 157b38e..38c44ee 100644
 > --- a/arch/arm/mach-omap2/resource34xx.c
 > +++ b/arch/arm/mach-omap2/resource34xx.c
 > @@ -161,7 +161,7 @@ static DEFINE_MUTEX(dvfs_mutex);
 >  /**
 >   * opp_to_freq - convert OPPID to frequency (DEPRECATED)
 >   * @freq: return frequency back to caller
 > - * @opps: opp list
 > + * @opp_t: OPP type where we need to look.
 >   * @opp_id: OPP ID we are searching for
 >   *
 >   * return 0 and freq is populated if we find the opp_id, else,
 > @@ -169,14 +169,14 @@ static DEFINE_MUTEX(dvfs_mutex);
 >   *
 >   * NOTE: this function is a standin for the timebeing as opp_id is 
deprecated
 >   */
 > -static int __deprecated opp_to_freq(unsigned long *freq,
 > -               const struct omap_opp *opps, u8 opp_id)
 > +static int __deprecated opp_to_freq(unsigned long *freq, enum opp_t 
opp_t,
Enum type and variable have the same name :( mebbe a rename of variable 
is appropriate
 > +                                u8 opp_id)
 >  {
 >         struct omap_opp *opp;
 >
 > -       BUG_ON(!freq || !opps);
 > +       BUG_ON(!freq || opp_t == OPP_NONE || opp_t > OPP_TYPES);
why OPP_NONE?
 >
 > -       opp = opp_find_by_opp_id(opps, opp_id);
 > +       opp = opp_find_by_opp_id(opp_t, opp_id);
 >         if (!opp)
 >                 return -EINVAL;
 >
 > @@ -188,20 +188,20 @@ static int __deprecated opp_to_freq(unsigned 
long *freq,
 >  /**
 >   * freq_to_opp - convert a frequency back to OPP ID (DEPRECATED)
 >   * @opp_id: opp ID returned back to caller
 > - * @opps: opp list
 > + * @opp_t: OPP type where we need to look.
 >   * @freq: frequency we are searching for
 >   *
 >   * return 0 and opp_id is populated if we find the freq, else, we 
return error
 >   *
 >   * NOTE: this function is a standin for the timebeing as opp_id is 
deprecated
 >   */
 > -static int __deprecated freq_to_opp(u8 *opp_id, struct omap_opp *opps,
 > +static int __deprecated freq_to_opp(u8 *opp_id, enum opp_t opp_t,
Re: enum type and variable have the same name :( mebbe a rename of 
variable is appropriate
 >                 unsigned long freq)
 >  {
 >         struct omap_opp *opp;
 >
 > -       BUG_ON(!opp_id || !opps);
 > -       opp = opp_find_freq_ceil(opps, &freq);
 > +       BUG_ON(opp_t == OPP_NONE || opp_t > OPP_TYPES);
 > +       opp = opp_find_freq_ceil(opp_t, &freq);
 >         if (IS_ERR(opp))
 >                 return -EINVAL;
 >         *opp_id = opp_get_opp_id(opp);
 > @@ -218,9 +218,6 @@ void init_opp(struct shared_resource *resp)
 >         u8 opp_id;
 >         resp->no_of_users = 0;
 >
 > -       if (!mpu_opps || !dsp_opps || !l3_opps)
 > -               return;
 > -
the original intent of this check is lost here - if the initializations 
did not take place, we will not proceed.
an equivalent check might be good to maintain at this point.

 >         /* Initialize the current level of the OPP resource
 >         * to the  opp set by u-boot.
 >         */
 > @@ -228,14 +225,14 @@ void init_opp(struct shared_resource *resp)
 >                 vdd1_resp = resp;
 >                 dpll1_clk = clk_get(NULL, "dpll1_ck");
 >                 dpll2_clk = clk_get(NULL, "dpll2_ck");
 > -               ret = freq_to_opp(&opp_id, mpu_opps, dpll1_clk->rate);
 > +               ret = freq_to_opp(&opp_id, OPP_MPU, dpll1_clk->rate);
 >                 BUG_ON(ret); /* TBD Cleanup handling */
 >                 curr_vdd1_opp = opp_id;
 >         } else if (strcmp(resp->name, "vdd2_opp") == 0) {
 >                 vdd2_resp = resp;
 >                 dpll3_clk = clk_get(NULL, "dpll3_m2_ck");
 >                 l3_clk = clk_get(NULL, "l3_ick");
 > -               ret = freq_to_opp(&opp_id, l3_opps, l3_clk->rate);
 > +               ret = freq_to_opp(&opp_id, OPP_L3, l3_clk->rate);
 >                 BUG_ON(ret); /* TBD Cleanup handling */
 >                 curr_vdd2_opp = opp_id;
 >         }
 > @@ -288,13 +285,13 @@ static int program_opp_freq(int res, int 
target_level, int current_level)
 >
 >         /* Check if I can actually switch or not */
 >         if (res == VDD1_OPP) {
 > -               ret = opp_to_freq(&mpu_freq, mpu_opps, target_level);
 > -               ret |= opp_to_freq(&dsp_freq, dsp_opps, target_level);
 > +               ret = opp_to_freq(&mpu_freq, OPP_MPU, target_level);
 > +               ret |= opp_to_freq(&dsp_freq, OPP_DSP, target_level);
 >  #ifndef CONFIG_CPU_FREQ
 > -               ret |= opp_to_freq(&mpu_cur_freq, mpu_opps, 
current_level);
 > +               ret |= opp_to_freq(&mpu_cur_freq, OPP_MPU, 
current_level);
 >  #endif
 >         } else {
 > -               ret = opp_to_freq(&l3_freq, l3_opps, target_level);
 > +               ret = opp_to_freq(&l3_freq, OPP_L3, target_level);
 >         }
 >         /* we would have caught all bad levels earlier.. */
 >         if (unlikely(ret))
 > @@ -329,7 +326,7 @@ static int program_opp_freq(int res, int 
target_level, int current_level)
 >         return target_level;
 >  }
 >
 > -static int program_opp(int res, struct omap_opp *opp, int target_level,
 > +static int program_opp(int res, enum opp_t opp_t, int target_level,

Re: enum type and variable have the same name :( mebbe a rename of 
variable is appropriate

 >                 int current_level)
 >  {
 >         int i, ret = 0, raise;
 > @@ -342,7 +339,7 @@ static int program_opp(int res, struct omap_opp 
*opp, int target_level,
 >  #endif
 >
 >         /* See if have a freq associated, if not, invalid opp */
 > -       ret = opp_to_freq(&freq, opp, target_level);
 > +       ret = opp_to_freq(&freq, opp_t, target_level);
 >         if (unlikely(ret))
 >                 return ret;
 >
 > @@ -365,13 +362,13 @@ static int program_opp(int res, struct omap_opp 
*opp, int target_level,
 >                          * transitioning from good to good OPP
 >                          * none of the following should fail..
 >                          */
 > -                       oppx = opp_find_freq_exact(opp, freq, true);
 > +                       oppx = opp_find_freq_exact(opp_t, freq, true);
 >                         BUG_ON(IS_ERR(oppx));
 >                         uvdc = opp_get_voltage(oppx);
 >                         vt = omap_twl_uv_to_vsel(uvdc);
 >
 > -                       BUG_ON(opp_to_freq(&freq, opp, current_level));
 > -                       oppx = opp_find_freq_exact(opp, freq, true);
 > +                       BUG_ON(opp_to_freq(&freq, opp_t, current_level));
 > +                       oppx = opp_find_freq_exact(opp_t, freq, true);
 >                         BUG_ON(IS_ERR(oppx));
 >                         uvdc = opp_get_voltage(oppx);
 >                         vc = omap_twl_uv_to_vsel(uvdc);
 > @@ -404,15 +401,12 @@ int resource_set_opp_level(int res, u32 
target_level, int flags)
 >         if (resp->curr_level == target_level)
 >                 return 0;
 >
 > -       if (!mpu_opps || !dsp_opps || !l3_opps)
 > -               return 0;
 > -
 >         /* Check if I can actually switch or not */
 >         if (res == VDD1_OPP) {
 > -               ret = opp_to_freq(&mpu_freq, mpu_opps, target_level);
 > -               ret |= opp_to_freq(&mpu_old_freq, mpu_opps, 
resp->curr_level);
 > +               ret = opp_to_freq(&mpu_freq, OPP_MPU, target_level);
 > +               ret |= opp_to_freq(&mpu_old_freq, OPP_MPU, 
resp->curr_level);
 >         } else {
 > -               ret = opp_to_freq(&l3_freq, l3_opps, target_level);
 > +               ret = opp_to_freq(&l3_freq, OPP_L3, target_level);
 >         }
 >         if (ret)
 >                 return ret;
 > @@ -431,7 +425,7 @@ int resource_set_opp_level(int res, u32 
target_level, int flags)
 >                 /* Send pre notification to CPUFreq */
 >                 cpufreq_notify_transition(&freqs_notify, 
CPUFREQ_PRECHANGE);
 >  #endif
 > -               resp->curr_level = program_opp(res, mpu_opps, 
target_level,
 > +               resp->curr_level = program_opp(res, OPP_MPU, 
target_level,
 >                         resp->curr_level);
 >  #ifdef CONFIG_CPU_FREQ
 >                 /* Send a post notification to CPUFreq */
 > @@ -442,7 +436,7 @@ int resource_set_opp_level(int res, u32 
target_level, int flags)
 >                         mutex_unlock(&dvfs_mutex);
 >                         return 0;
 >                 }
 > -               resp->curr_level = program_opp(res, l3_opps, 
target_level,
 > +               resp->curr_level = program_opp(res, OPP_L3, target_level,
 >                         resp->curr_level);
 >         }
 >         mutex_unlock(&dvfs_mutex);
 > @@ -474,17 +468,17 @@ int set_opp(struct shared_resource *resp, u32 
target_level)
 >                 req_l3_freq = (target_level * 1000)/4;
 >
 >                 /* Do I have a best match? */
 > -               oppx = opp_find_freq_ceil(l3_opps, &req_l3_freq);
 > +               oppx = opp_find_freq_ceil(OPP_L3, &req_l3_freq);
 >                 if (IS_ERR(oppx)) {
 >                         /* Give me the best we got */
 >                         req_l3_freq = ULONG_MAX;
 > -                       oppx = opp_find_freq_floor(l3_opps, 
&req_l3_freq);
 > +                       oppx = opp_find_freq_floor(OPP_L3, &req_l3_freq);
 >                 }
 >
 >                 /* uh uh.. no OPPs?? */
 >                 BUG_ON(IS_ERR(oppx));
 >
 > -               ret = freq_to_opp((u8 *)&target_level, l3_opps, 
req_l3_freq);
 > +               ret = freq_to_opp((u8 *)&target_level, OPP_L3, 
req_l3_freq);
 >                 /* we dont expect this to fail */
 >                 BUG_ON(ret);
 >
 > @@ -503,9 +497,9 @@ int validate_opp(struct shared_resource *resp, 
u32 target_level)
 >  {
 >         unsigned long x;
 >         if (strcmp(resp->name, "mpu_freq") == 0)
 > -               return opp_to_freq(&x, mpu_opps, target_level);
 > +               return opp_to_freq(&x, OPP_MPU, target_level);
 >         else if (strcmp(resp->name, "dsp_freq") == 0)
 > -               return opp_to_freq(&x, dsp_opps, target_level);
 > +               return opp_to_freq(&x, OPP_DSP, target_level);
 >         return 0;
 >  }
 >
 > @@ -519,19 +513,16 @@ void init_freq(struct shared_resource *resp)
 >         unsigned long freq;
 >         resp->no_of_users = 0;
 >
 > -       if (!mpu_opps || !dsp_opps)
 > -               return;
 > -
again the initial intent is lost -> to handle cases where the 
initialization was not being done.
See commit: 0fea42354997641652623a7b046c14d580fca80c
OMAP3 SRF: Fix crash on non-3430SDP platforms with DVFS/CPUFreq

     The SRF/DVFS + CPUFreq patches had issues booting on
     non-3430SDP platforms as reported by Kevin Hilman.
     This patch puts non-NULL checks in place for mpu_opps/dsp_opps
     /l3_opps before accessing them and fixes the issue.

     Signed-off-by: Rajendra Nayak <rnayak@ti.com>

 >         linked_res_name = (char *)resp->resource_data;
 >         /* Initialize the current level of the Freq resource
 >         * to the frequency set by u-boot.
 >         */
 >         if (strcmp(resp->name, "mpu_freq") == 0)
 >                 /* MPU freq in Mhz */
 > -               ret = opp_to_freq(&freq, mpu_opps, curr_vdd1_opp);
 > +               ret = opp_to_freq(&freq, OPP_MPU, curr_vdd1_opp);
 >         else if (strcmp(resp->name, "dsp_freq") == 0)
 >                 /* DSP freq in Mhz */
 > -               ret = opp_to_freq(&freq, dsp_opps, curr_vdd1_opp);
 > +               ret = opp_to_freq(&freq, OPP_DSP, curr_vdd1_opp);
 >         BUG_ON(ret);
 >
 >         resp->curr_level = freq;
 > @@ -543,16 +534,13 @@ int set_freq(struct shared_resource *resp, u32 
target_level)
 >         u8 vdd1_opp;
 >         int ret = -EINVAL;
 >
 > -       if (!mpu_opps || !dsp_opps)
 > -               return 0;
 > -
 >         if (strcmp(resp->name, "mpu_freq") == 0) {
 > -               ret = freq_to_opp(&vdd1_opp, mpu_opps, target_level);
 > +               ret = freq_to_opp(&vdd1_opp, OPP_MPU, target_level);
 >                 if (!ret)
 >                         ret = resource_request("vdd1_opp", 
&dummy_mpu_dev,
 >                                         vdd1_opp);
 >         } else if (strcmp(resp->name, "dsp_freq") == 0) {
 > -               ret = freq_to_opp(&vdd1_opp, dsp_opps, target_level);
 > +               ret = freq_to_opp(&vdd1_opp, OPP_DSP, target_level);
 >                 if (!ret)
 >                         ret = resource_request("vdd1_opp", 
&dummy_dsp_dev,
 >                                         vdd1_opp);
 > @@ -566,8 +554,8 @@ int validate_freq(struct shared_resource *resp, 
u32 target_level)
 >  {
 >         u8 x;
 >         if (strcmp(resp->name, "mpu_freq") == 0)
 > -               return freq_to_opp(&x, mpu_opps, target_level);
 > +               return freq_to_opp(&x, OPP_MPU, target_level);
 >         else if (strcmp(resp->name, "dsp_freq") == 0)
 > -               return freq_to_opp(&x, dsp_opps, target_level);
 > +               return freq_to_opp(&x, OPP_DSP, target_level);
 >         return 0;
 >  }
 > diff --git a/arch/arm/mach-omap2/smartreflex.c 
b/arch/arm/mach-omap2/smartreflex.c
 > index 3c37837..1c5ec37 100644
 > --- a/arch/arm/mach-omap2/smartreflex.c
 > +++ b/arch/arm/mach-omap2/smartreflex.c
 > @@ -152,12 +152,11 @@ static u8 get_vdd1_opp(void)
 >         struct omap_opp *opp;
 >         unsigned long freq;
 >
 > -       if (sr1.vdd_opp_clk == NULL || IS_ERR(sr1.vdd_opp_clk) ||
 > -                                                       mpu_opps == NULL)
 > +       if (sr1.vdd_opp_clk == NULL || IS_ERR(sr1.vdd_opp_clk))
 >                 return 0;
 >
 >         freq = sr1.vdd_opp_clk->rate;
 > -       opp = opp_find_freq_ceil(mpu_opps, &freq);
 > +       opp = opp_find_freq_ceil(OPP_MPU, &freq);
 >         if (IS_ERR(opp))
 >                 return 0;
 >         /*
 > @@ -176,12 +175,11 @@ static u8 get_vdd2_opp(void)
 >         struct omap_opp *opp;
 >         unsigned long freq;
 >
 > -       if (sr2.vdd_opp_clk == NULL || IS_ERR(sr2.vdd_opp_clk) ||
 > -                                                       l3_opps == NULL)
 > +       if (sr2.vdd_opp_clk == NULL || IS_ERR(sr2.vdd_opp_clk))
 >                 return 0;
 >
 >         freq = sr2.vdd_opp_clk->rate;
 > -       opp = opp_find_freq_ceil(l3_opps, &freq);
 > +       opp = opp_find_freq_ceil(OPP_L3, &freq);
 >         if (IS_ERR(opp))
 >                 return 0;
 >
 > @@ -310,7 +308,7 @@ static void sr_configure_vp(int srid)
 >                 if (!target_opp_no)
 >                         target_opp_no = VDD1_OPP3;
 >
 > -               opp = opp_find_by_opp_id(mpu_opps, target_opp_no);
 > +               opp = opp_find_by_opp_id(OPP_MPU, target_opp_no);
 >                 BUG_ON(!opp); /* XXX ugh */
 >
 >                 uvdc = opp_get_voltage(opp);
 > @@ -359,7 +357,7 @@ static void sr_configure_vp(int srid)
 >                 if (!target_opp_no)
 >                         target_opp_no = VDD2_OPP3;
 >
 > -               opp = opp_find_by_opp_id(l3_opps, target_opp_no);
 > +               opp = opp_find_by_opp_id(OPP_L3, target_opp_no);
 >                 BUG_ON(!opp); /* XXX ugh */
 >
 >                 uvdc = opp_get_voltage(opp);
 > @@ -472,7 +470,7 @@ static int sr_reset_voltage(int srid)
 >                         return 1;
 >                 }
 >
 > -               opp = opp_find_by_opp_id(mpu_opps, target_opp_no);
 > +               opp = opp_find_by_opp_id(OPP_MPU, target_opp_no);
 >                 if (!opp)
 >                         return 1;
 >
 > @@ -490,7 +488,7 @@ static int sr_reset_voltage(int srid)
 >                         return 1;
 >                 }
 >
 > -               opp = opp_find_by_opp_id(l3_opps, target_opp_no);
 > +               opp = opp_find_by_opp_id(OPP_L3, target_opp_no);
 >                 if (!opp)
 >                         return 1;
 >
 > @@ -546,11 +544,6 @@ static int sr_enable(struct omap_sr *sr, u32 
target_opp_no)
 >         int uvdc;
 >         char vsel;
 >
 > -       if (!(mpu_opps && l3_opps)) {
 > -               pr_notice("VSEL values not found\n");
 > -               return false;
 > -       }
 > -
 >         sr->req_opp_no = target_opp_no;
 >
 >         if (sr->srid == SR1) {
 > @@ -575,7 +568,7 @@ static int sr_enable(struct omap_sr *sr, u32 
target_opp_no)
 >                         break;
 >                 }
 >
 > -               opp = opp_find_by_opp_id(mpu_opps, target_opp_no);
 > +               opp = opp_find_by_opp_id(OPP_MPU, target_opp_no);
 >                 if (!opp)
 >                         return false;
 >         } else {
 > @@ -594,7 +587,7 @@ static int sr_enable(struct omap_sr *sr, u32 
target_opp_no)
 >                         break;
 >                 }
 >
 > -               opp = opp_find_by_opp_id(l3_opps, target_opp_no);
 > +               opp = opp_find_by_opp_id(OPP_L3, target_opp_no);
 >                 if (!opp)
 >                         return false;
 >         }
 > @@ -1010,12 +1003,6 @@ static int __init omap3_sr_init(void)
 >         int ret = 0;
 >         u8 RdReg;
 >
 > -       /* Exit if OPP tables are not defined */
 > -        if (!(mpu_opps && l3_opps)) {
 > -                pr_err("SR: OPP rate tables not defined for 
platform, not enabling SmartReflex\n");
 > -               return -ENODEV;
 > -        }
 > -
re: the same intent of handling un-initialized tables, but we loose it 
at this point..

 >         /* Enable SR on T2 */
 >         ret = twl_i2c_read_u8(TWL4030_MODULE_PM_RECEIVER, &RdReg,
 >                               R_DCDC_GLOBAL_CFG);
 > diff --git a/arch/arm/plat-omap/common.c b/arch/arm/plat-omap/common.c
 > index 6bd62ea..dddc027 100644
 > --- a/arch/arm/plat-omap/common.c
 > +++ b/arch/arm/plat-omap/common.c
 > @@ -52,12 +52,6 @@ int omap_board_config_size;
 >  /* used by omap-smp.c and board-4430sdp.c */
 >  void __iomem *gic_cpu_base_addr;
 >
 > -#ifdef CONFIG_OMAP_PM_NONE
 > -struct omap_opp *mpu_opps;
 > -struct omap_opp *dsp_opps;
 > -struct omap_opp *l3_opps;
 > -#endif
 > -
 >  static const void *get_config(u16 tag, size_t len, int skip, size_t 
*len_out)
 >  {
 >         struct omap_board_config_kernel *kinfo = NULL;
 > diff --git a/arch/arm/plat-omap/cpu-omap.c 
b/arch/arm/plat-omap/cpu-omap.c
 > index 109203e..a69b557 100644
 > --- a/arch/arm/plat-omap/cpu-omap.c
 > +++ b/arch/arm/plat-omap/cpu-omap.c
 > @@ -87,6 +87,9 @@ static int omap_target(struct cpufreq_policy *policy,
 >  #ifdef CONFIG_ARCH_OMAP1
 >         struct cpufreq_freqs freqs;
 >  #endif
 > +#if defined(CONFIG_ARCH_OMAP3) && !defined(CONFIG_OMAP_PM_NONE)
 > +       unsigned long freq = target_freq * 1000;
 > +#endif
 >         int ret = 0;
 >
 >         /* Ensure desired rate is within allowed range.  Some govenors
 > @@ -111,11 +114,8 @@ static int omap_target(struct cpufreq_policy 
*policy,
 >         ret = clk_set_rate(mpu_clk, freqs.new * 1000);
 >         cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
 >  #elif defined(CONFIG_ARCH_OMAP3) && !defined(CONFIG_OMAP_PM_NONE)
 > -       if (mpu_opps) {
 > -               unsigned long freq = target_freq * 1000;
 > -               if (!IS_ERR(opp_find_freq_ceil(mpu_opps, &freq)))
 > -                       omap_pm_cpu_set_freq(freq);
 > -       }
 > +       if (opp_find_freq_ceil(OPP_MPU, &freq))
 > +               omap_pm_cpu_set_freq(freq);
 >  #endif
 >         return ret;
 >  }
 > @@ -136,7 +136,7 @@ static int __init omap_cpu_init(struct 
cpufreq_policy *policy)
 >         if (!cpu_is_omap34xx())
 >                 clk_init_cpufreq_table(&freq_table);
 >         else
 > -               opp_init_cpufreq_table(mpu_opps, &freq_table);
 > +               opp_init_cpufreq_table(OPP_MPU, &freq_table);
 >
 >         if (freq_table) {
 >                 result = cpufreq_frequency_table_cpuinfo(policy, 
freq_table);
 > diff --git a/arch/arm/plat-omap/include/plat/opp.h 
b/arch/arm/plat-omap/include/plat/opp.h
 > index 9f91ad3..c4d5bf9 100644
 > --- a/arch/arm/plat-omap/include/plat/opp.h
 > +++ b/arch/arm/plat-omap/include/plat/opp.h
 > @@ -13,9 +13,18 @@
 >  #ifndef __ASM_ARM_OMAP_OPP_H
 >  #define __ASM_ARM_OMAP_OPP_H
 >
 > -extern struct omap_opp *mpu_opps;
 > -extern struct omap_opp *dsp_opps;
 > -extern struct omap_opp *l3_opps;
 > +#ifdef CONFIG_ARCH_OMAP3
 > +#define OPP_TYPES 3
 > +#else
 > +#error "You need to put the number of OPP types for OMAP chip type."
 > +#endif

not a strong requirement, but does it make sense to have these to be 
part of silicon specific #includes? once OPPs are active for OMAP1,2 
(similar to what Paul has posted), this list will be a lot of #ifdeffery.


 > +
 > +enum opp_t {
_t is confusing(vs typedefs) for many folks maybe we could have a rename 
of this to say opp_type?

 > +       OPP_NONE,
why is OPP_NONE required?

 > +       OPP_MPU,
 > +       OPP_L3,
 > +       OPP_DSP
you can have OPP_NUM_TYPES here and save on a #define. but u'd have to 
move the enum under #ifdef for OMAP3 which seems more appropriate.

in theory, in future for other silicons, as enums get added, 
OPP_NUM_TYPES will auto increment preventing buggy 
modification/forgetting to update the #define.

 > +};
 >
 >  struct omap_opp;
 >
 > @@ -40,16 +49,16 @@ unsigned long opp_get_freq(const struct omap_opp 
*opp);
 >  /**
 >   * opp_get_opp_count() - Get number of opps enabled in the opp list
 >   * @num:       returns the number of opps
 > - * @oppl:      opp list
 > + * @opp_t:     OPP type we want to count
 >   *
 >   * This functions returns the number of opps if there are any OPPs 
enabled,
 >   * else returns corresponding error value.
 >   */
 > -int opp_get_opp_count(struct omap_opp *oppl);
 > +int opp_get_opp_count(enum opp_t opp_t);
Re: enum type and variable have the same name :( mebbe a rename of 
variable is appropriate
 >
 >  /**
 >   * opp_find_freq_exact() - search for an exact frequency
 > - * @oppl:      OPP list
 > + * @opp_t:     OPP type we want to search in.
 >   * @freq:      frequency to search for
 >   * @enabled:   enabled/disabled OPP to search for
 >   *
 > @@ -61,14 +70,14 @@ int opp_get_opp_count(struct omap_opp *oppl);
 >   * for exact matching frequency and is enabled. if true, the match 
is for exact
 >   * frequency which is disabled.
 >   */
 > -struct omap_opp *opp_find_freq_exact(struct omap_opp *oppl,
 > +struct omap_opp *opp_find_freq_exact(enum opp_t opp_t,
Re: enum type and variable have the same name :( mebbe a rename of 
variable is appropriate
 >                                      unsigned long freq, bool enabled);
 >
 >  /* XXX This documentation needs fixing */
 >
 >  /**
 >   * opp_find_freq_floor() - Search for an rounded freq
 > - * @oppl:      Starting list
 > + * @opp_t:     OPP type we want to search in
 >   * @freq:      Start frequency
 >   *
 >   * Search for the lower *enabled* OPP from a starting freq
 > @@ -97,14 +106,13 @@ struct omap_opp *opp_find_freq_exact(struct 
omap_opp *oppl,
 >   * NOTE: if we set freq as ULONG_MAX and search low, we get the
 >   * highest enabled frequency
 >   */
 > -struct omap_opp *opp_find_freq_floor(struct omap_opp *oppl,
 > -                                    unsigned long *freq);
 > +struct omap_opp *opp_find_freq_floor(enum opp_t opp_t, unsigned long 
*freq);
Re: enum type and variable have the same name :( mebbe a rename of 
variable is appropriate
 >
 >  /* XXX This documentation needs fixing */
 >
 >  /**
 >   * opp_find_freq_ceil() - Search for an rounded freq
 > - * @oppl:      Starting list
 > + * @opp_t:     OPP type where we want to search in
 >   * @freq:      Start frequency
 >   *
 >   * Search for the higher *enabled* OPP from a starting freq
 > @@ -130,7 +138,7 @@ struct omap_opp *opp_find_freq_floor(struct 
omap_opp *oppl,
 >   *             freq++; * for next higher match *
 >   *     }
 >   */
 > -struct omap_opp *opp_find_freq_ceil(struct omap_opp *oppl, unsigned 
long *freq);
 > +struct omap_opp *opp_find_freq_ceil(enum opp_t opp_t, unsigned long 
*freq);
Re: enum type and variable have the same name :( mebbe a rename of 
variable is appropriate
 >
 >
 >  /**
 > @@ -170,35 +178,27 @@ struct omap_opp_def {
 >
 >  /**
 >   * opp_init_list() - Initialize an opp list from the opp definitions
 > + * @opp_t:     OPP type to initialize this list for.
 >   * @opp_defs:  Initial opp definitions to create the list.
 >   *
 > - * This function creates a list of opp definitions and returns a handle.
 > + * This function creates a list of opp definitions and returns status.
 >   * This list can be used to further validation/search/modifications. New
 >   * opp entries can be added to this list by using opp_add().
 >   *
 > - * In the case of error, ERR_PTR is returned to the caller and should be
 > - * appropriately handled with IS_ERR.
 > + * In the case of error, suitable error code is returned.
 >   */
 > -struct omap_opp __init *opp_init_list(const struct omap_opp_def 
*opp_defs);
 > +int  __init opp_init_list(enum opp_t opp_t,
Re: enum type and variable have the same name :( mebbe a rename of 
variable is appropriate
 > +                        const struct omap_opp_def *opp_defs);
 >
 >  /**
 >   * opp_add()  - Add an OPP table from a table definitions
 > - * @oppl:      List to add the OPP to
 > + * @opp_t:     OPP type under which we want to add our new OPP.
 >   * @opp_def:   omap_opp_def to describe the OPP which we want to add 
to list.
 >   *
 > - * This function adds an opp definition to the opp list and returns
 > - * a handle representing the new OPP list. This handle is then used 
for further
 > - * validation, search, modification operations on the OPP list.
 > - *
 > - * This function returns the pointer to the allocated list through 
oppl if
 > - * success, else corresponding ERR_PTR value. Caller should NOT free 
the oppl.
 > - * opps_defs can be freed after use.
 > + * This function adds an opp definition to the opp list and returns 
status.
 >   *
 > - * NOTE: caller should assume that on success, oppl is probably 
populated with
 > - * a new handle and the new handle should be used for further 
referencing
 >   */
 > -struct omap_opp *opp_add(struct omap_opp *oppl,
 > -                        const struct omap_opp_def *opp_def);
 > +int opp_add(enum opp_t opp_t, const struct omap_opp_def *opp_def);
 >
 >  /**
 >   * opp_enable() - Enable a specific OPP
 > @@ -224,11 +224,11 @@ int opp_enable(struct omap_opp *opp);
 >   */
 >  int opp_disable(struct omap_opp *opp);
 >
 > -struct omap_opp * __deprecated opp_find_by_opp_id(struct omap_opp *opps,
 > +struct omap_opp * __deprecated opp_find_by_opp_id(enum opp_t opp_t,
Re: enum type and variable have the same name :( mebbe a rename of 
variable is appropriate
 >                                                   u8 opp_id);
 >  u8 __deprecated opp_get_opp_id(struct omap_opp *opp);
 >
 > -void opp_init_cpufreq_table(struct omap_opp *opps,
 > +void opp_init_cpufreq_table(enum opp_t opp_t,
Re: enum type and variable have the same name :( mebbe a rename of 
variable is appropriate
 >                             struct cpufreq_frequency_table **table);
 >
 >
 > diff --git a/arch/arm/plat-omap/omap-pm-noop.c 
b/arch/arm/plat-omap/omap-pm-noop.c
 > index aeb372e..713a59f 100644
 > --- a/arch/arm/plat-omap/omap-pm-noop.c
 > +++ b/arch/arm/plat-omap/omap-pm-noop.c
 > @@ -26,10 +26,6 @@
 >
 >  #include <plat/powerdomain.h>
 >
 > -struct omap_opp *dsp_opps;
 > -struct omap_opp *mpu_opps;
 > -struct omap_opp *l3_opps;
 > -
 >  /*
 >   * Device-driver-originated constraints (via board-*.c files)
 >   */
 > diff --git a/arch/arm/plat-omap/omap-pm-srf.c 
b/arch/arm/plat-omap/omap-pm-srf.c
 > index f7bf353..9b4cf7f 100644
 > --- a/arch/arm/plat-omap/omap-pm-srf.c
 > +++ b/arch/arm/plat-omap/omap-pm-srf.c
 > @@ -25,10 +25,6 @@
 >  #include <plat/resource.h>
 >  #include <plat/omap_device.h>
 >
 > -struct omap_opp *dsp_opps;
 > -struct omap_opp *mpu_opps;
 > -struct omap_opp *l3_opps;
 > -
 >  #define LAT_RES_POSTAMBLE "_latency"
 >  #define MAX_LATENCY_RES_NAME 30
 >
 > diff --git a/arch/arm/plat-omap/opp.c b/arch/arm/plat-omap/opp.c
 > index 4fe1933..aa21fc5 100644
 > --- a/arch/arm/plat-omap/opp.c
 > +++ b/arch/arm/plat-omap/opp.c
 > @@ -38,6 +38,8 @@ struct omap_opp {
 >         u8 opp_id;
 >  };
 >
 > +
 > +static struct omap_opp *_opp_list[OPP_TYPES];

probably should be a dynamic array, instead of depending on predefined - 
init_list to increase the pointer array as needed
and number of registered list should ideally be stored as a local static 
variable? that way, we could do away with OPP_TYPES altogether.


 >  /*
 >   * DEPRECATED: Meant to detect end of opp array
 >   * This is meant to help co-exist with current SRF etc
 > @@ -65,18 +67,20 @@ unsigned long opp_get_freq(const struct omap_opp 
*opp)
 >
 >  /**
 >   * opp_find_by_opp_id - look up OPP by OPP ID (deprecated)
 > - * @opps: pointer to an array of struct omap_opp
 > + * @opp_t: OPP type where we want the look up to happen.
 >   *
 >   * Returns the struct omap_opp pointer corresponding to the given OPP
 >   * ID @opp_id, or returns NULL on error.
 >   */
 > -struct omap_opp * __deprecated opp_find_by_opp_id(struct omap_opp *opps,
 > +struct omap_opp * __deprecated opp_find_by_opp_id(enum opp_t opp_t,
 >                                                   u8 opp_id)
 >  {
 > +       struct omap_opp *opps;
 >         int i = 0;
 >
 > -       if (!opps || !opp_id)
 > +       if (opp_t == OPP_NONE || opp_t > OPP_TYPES || !opp_id)
 >                 return NULL;
 > +       opps = _opp_list[opp_t - 1];
 >
 >         while (!OPP_TERM(&opps[i])) {
 >                 if (opps[i].enabled && (opps[i].opp_id == opp_id))
 > @@ -93,14 +97,17 @@ u8 __deprecated opp_get_opp_id(struct omap_opp *opp)
 >         return opp->opp_id;
 >  }
 >
 > -int opp_get_opp_count(struct omap_opp *oppl)
 > +int opp_get_opp_count(enum opp_t opp_t)
 >  {
 >         u8 n = 0;
 > +       struct omap_opp *oppl;
 >
 > -       if (unlikely(!oppl || IS_ERR(oppl))) {
 > +       if (unlikely((opp_t == OPP_NONE) || opp_t > OPP_TYPES)) {
 >                 pr_err("%s: Invalid parameters being passed\n", 
__func__);
 >                 return -EINVAL;
 >         }
 > +
 > +       oppl = _opp_list[opp_t - 1];
re: by removing OPP_NONE, we can save on the -1. this true throughout 
the patch.


 >         while (!OPP_TERM(oppl)) {
 >                 if (oppl->enabled)
 >                         n++;
 > @@ -109,14 +116,18 @@ int opp_get_opp_count(struct omap_opp *oppl)
 >         return n;
 >  }
 >
 > -struct omap_opp *opp_find_freq_exact(struct omap_opp *oppl,
 > +struct omap_opp *opp_find_freq_exact(enum opp_t opp_t,
 >                                      unsigned long freq, bool enabled)
 >  {
 > -       if (unlikely(!oppl || IS_ERR(oppl))) {
 > +       struct omap_opp *oppl;
 > +
 > +       if (unlikely(opp_t == OPP_NONE || opp_t > OPP_TYPES)) {
 >                 pr_err("%s: Invalid parameters being passed\n", 
__func__);
 >                 return ERR_PTR(-EINVAL);
 >         }
 >
 > +       oppl = _opp_list[opp_t - 1];
 > +
 >         while (!OPP_TERM(oppl)) {
 >                 if ((oppl->rate == freq) && (oppl->enabled == enabled))
 >                         break;
 > @@ -126,13 +137,18 @@ struct omap_opp *opp_find_freq_exact(struct 
omap_opp *oppl,
 >         return OPP_TERM(oppl) ? ERR_PTR(-ENOENT) : oppl;
 >  }
 >
 > -struct omap_opp *opp_find_freq_ceil(struct omap_opp *oppl, unsigned 
long *freq)
 > +struct omap_opp *opp_find_freq_ceil(enum opp_t opp_t, unsigned long 
*freq)
 >  {
 > -       if (unlikely(!oppl || IS_ERR(oppl) || !freq || IS_ERR(freq))) {
 > +       struct omap_opp *oppl;
 > +
 > +       if (unlikely(opp_t == OPP_NONE || opp_t > OPP_TYPES || !freq ||
 > +                IS_ERR(freq))) {
 >                 pr_err("%s: Invalid parameters being passed\n", 
__func__);
 >                 return ERR_PTR(-EINVAL);
 >         }
 >
 > +       oppl = _opp_list[opp_t - 1];
 > +
 >         while (!OPP_TERM(oppl)) {
 >                 if (oppl->enabled && oppl->rate >= *freq)
 >                         break;
 > @@ -148,14 +164,16 @@ struct omap_opp *opp_find_freq_ceil(struct 
omap_opp *oppl, unsigned long *freq)
 >         return oppl;
 >  }
 >
 > -struct omap_opp *opp_find_freq_floor(struct omap_opp *oppl, unsigned 
long *freq)
 > +struct omap_opp *opp_find_freq_floor(enum opp_t opp_t, unsigned long 
*freq)
 >  {
 > -       struct omap_opp *prev_opp = oppl;
 > +       struct omap_opp *prev_opp, *oppl;
 >
 > -       if (unlikely(!oppl || IS_ERR(oppl) || !freq || IS_ERR(freq))) {
 > +       if (unlikely(opp_t == OPP_NONE || opp_t > OPP_TYPES || !freq ||
 > +                IS_ERR(freq))) {
 >                 pr_err("%s: Invalid parameters being passed\n", 
__func__);
 >                 return ERR_PTR(-EINVAL);
 >         }
 > +       oppl = prev_opp = _opp_list[opp_t - 1];
 >
 >         while (!OPP_TERM(oppl)) {
 >                 if (oppl->enabled) {
 > @@ -185,19 +203,19 @@ static void omap_opp_populate(struct omap_opp *opp,
 >         opp->u_volt = opp_def->u_volt;
 >  }
 >
 > -struct omap_opp *opp_add(struct omap_opp *oppl,
 > -                        const struct omap_opp_def *opp_def)
 > +int opp_add(enum opp_t opp_t, const struct omap_opp_def *opp_def)
 >  {
 > -       struct omap_opp *opp, *oppt, *oppr;
 > +       struct omap_opp *opp, *oppt, *oppr, *oppl;
 >         u8 n, i, ins;
 >
 > -       if (unlikely(!oppl || IS_ERR(oppl) || !opp_def || 
IS_ERR(opp_def))) {
 > +       if (unlikely(opp_t == OPP_NONE || opp_t > OPP_TYPES || 
!opp_def ||
 > +                        IS_ERR(opp_def))) {
 >                 pr_err("%s: Invalid params being passed\n", __func__);
 > -               return ERR_PTR(-EINVAL);
 > +               return -EINVAL;
 >         }
 >
 >         n = 0;
 > -       opp = oppl;
 > +       oppl = opp = _opp_list[opp_t - 1];
 >         while (!OPP_TERM(opp)) {
 >                 n++;
 >                 opp++;
 > @@ -210,11 +228,11 @@ struct omap_opp *opp_add(struct omap_opp *oppl,
 >         oppr = kzalloc(sizeof(struct omap_opp) * (n + 2), GFP_KERNEL);
 >         if (!oppr) {
 >                 pr_err("%s: No memory for new opp array\n", __func__);
 > -               return ERR_PTR(-ENOMEM);
 > +               return -ENOMEM;
 >         }
 >
 >         /* Simple insertion sort */
 > -       opp = oppl;
 > +       opp = _opp_list[opp_t - 1];
 >         oppt = oppr;
 >         ins = 0;
 >         i = 1;
 > @@ -238,23 +256,27 @@ struct omap_opp *opp_add(struct omap_opp *oppl,
 >                 oppt++;
 >         }
 >
 > +       _opp_list[opp_t - 1] = oppr;
 > +
 >         /* Terminator implicitly added by kzalloc() */
 >
 >         /* Free the old list */
 >         kfree(oppl);
 >
 > -       return oppr;
 > +       return 0;
 >  }
 >
 > -struct omap_opp __init *opp_init_list(const struct omap_opp_def 
*opp_defs)
 > +int __init opp_init_list(enum opp_t opp_t,
 > +                                const struct omap_opp_def *opp_defs)
 >  {
 >         struct omap_opp_def *t = (struct omap_opp_def *)opp_defs;
 > -       struct omap_opp *opp, *oppl;
 > +       struct omap_opp *oppl;
 >         u8 n = 0, i = 1;
 >
 > -       if (unlikely(!opp_defs || IS_ERR(opp_defs))) {
 > +       if (unlikely(opp_t == OPP_NONE || opp_t > OPP_TYPES || 
!opp_defs ||
 > +                        IS_ERR(opp_defs))) {
 >                 pr_err("%s: Invalid params being passed\n", __func__);
 > -               return ERR_PTR(-EINVAL);
 > +               return -EINVAL;
 >         }
 >         /* Grab a count */
 >         while (t->enabled || t->freq || t->u_volt) {
 > @@ -269,22 +291,23 @@ struct omap_opp __init *opp_init_list(const 
struct omap_opp_def *opp_defs)
 >         oppl = kzalloc(sizeof(struct omap_opp) * (n + 1), GFP_KERNEL);
 >         if (!oppl) {
 >                 pr_err("%s: No memory for opp array\n", __func__);
 > -               return ERR_PTR(-ENOMEM);
 > +               return -ENOMEM;
 >         }
 >
 > -       opp = oppl;
 > +
 > +       _opp_list[opp_t - 1] = oppl;
 >         while (n) {
 > -               omap_opp_populate(opp, opp_defs);
 > -               opp->opp_id = i;
 > +               omap_opp_populate(oppl, opp_defs);
 > +               oppl->opp_id = i;
 >                 n--;
 > -               opp++;
 > +               oppl++;
 >                 opp_defs++;
 >                 i++;
 >         }
 >
 >         /* Terminator implicitly added by kzalloc() */
 >
 > -       return oppl;
 > +       return 0;
 >  }
 >
 >  int opp_enable(struct omap_opp *opp)
 > @@ -308,20 +331,21 @@ int opp_disable(struct omap_opp *opp)
 >  }
 >
 >  /* XXX document */
 > -void opp_init_cpufreq_table(struct omap_opp *opps,
 > +void opp_init_cpufreq_table(enum opp_t opp_t,
 >                             struct cpufreq_frequency_table **table)
 >  {
 >         int i = 0, j;
 >         int opp_num;
 >         struct cpufreq_frequency_table *freq_table;
 > +       struct omap_opp *opp;
 >
 > -       if (!opps) {
 > +       if (opp_t == OPP_NONE || opp_t > OPP_TYPES) {
 >                 pr_warning("%s: failed to initialize frequency"
 >                                 "table\n", __func__);
 >                 return;
 >         }
 >
 > -       opp_num = opp_get_opp_count(opps);
 > +       opp_num = opp_get_opp_count(opp_t);
 >         if (opp_num < 0) {
 >                 pr_err("%s: no opp table?\n", __func__);
 >                 return;
 > @@ -335,14 +359,14 @@ void opp_init_cpufreq_table(struct omap_opp *opps,
 >                 return;
 >         }
 >
 > +       opp = _opp_list[opp_t - 1];
 >         for (j = opp_num; j >= 0; j--) {
 > -               struct omap_opp *opp = &opps[j];
 > -
 >                 if (opp->enabled) {
 >                         freq_table[i].index = i;
 >                         freq_table[i].frequency = opp->rate / 1000;
 >                         i++;
 >                 }
 > +               opp++;
 >         }
 >
 >         freq_table[i].index = i;
 >
 >


-- 
Regards,
Nishanth Menon

  reply	other threads:[~2010-01-12 17:19 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-01-12 12:39 [PM-WIP-OPP][PATCH] OPP: Introduces enum for addressing different OPP types Romit Dasgupta
2010-01-12 17:19 ` Nishanth Menon [this message]
2010-01-12 17:19 ` Kevin Hilman
2010-01-12 17:36   ` Cousson, Benoit
2010-01-12 19:26     ` Kevin Hilman
2010-01-13 10:31   ` Romit Dasgupta
2010-01-12 17:57 ` Menon, Nishanth
2010-01-13 10:41   ` Romit Dasgupta
2010-01-13 12:54     ` Nishanth Menon
2010-01-13 13:22       ` Romit Dasgupta
2010-01-15 10:35         ` Nishanth Menon
2010-01-15 10:42           ` Romit Dasgupta
2010-01-15 10:56             ` Nishanth Menon
2010-01-13 14:43     ` Kevin Hilman

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4B4CAF05.2060001@ti.com \
    --to=nm@ti.com \
    --cc=khilman@deeprootsystems.com \
    --cc=linux-omap@vger.kernel.org \
    --cc=romit@ti.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.