Hi, On Fri, Feb 18, 2011 at 11:20 AM, Mike Turquette <mturquette@xxxxxx> wrote: > Introduce voltage transition notification handlers for Adaptive Body-Bias > LDOs. ÂThere is an ABB LDO for VDD_MPU on OMAP3630 and an ABB_LDO on VDD_MPU > and VDD_IVA on OMAP4430. > > All of these LDOs are handled similary. ÂInitial configuration is to enable > the possibility of going into Forward Body-Bias (which boosts voltage at > high OPPs). ÂThis feature was designed for weak silicon, and eFuse values > exist to control whether or not this feature should be turned on. ÂHowever > recommendations from hardware folks always say to leave it on regardless of > eFuse values, so we don't bother checking them. ÂFor all other OPPs the LDO > is in bypass and will follow the voltage of it's corresponding VDD_xxx. > Reverse Body-Bias exists but we never use this in practice (for saving power > on strongly characterised silicon). > > Upon a DVFS transition the notifiers handle the sequencing of voltage > scaling and ABB LDO transitions. ÂWhen moving to a higher OPP that needs > FBB, raise voltage first and then enable FBB. ÂWhen moving down to an OPP > that bypasses ABB, first bypass the LDO then lower voltage. > > Signed-off-by: Mike Turquette <mturquette@xxxxxx> > --- > Âarch/arm/mach-omap2/voltage.c       | Â379 ++++++++++++++++++++++++++++- > Âarch/arm/plat-omap/include/plat/voltage.h |  Â6 +- > Â2 files changed, 370 insertions(+), 15 deletions(-) > > diff --git a/arch/arm/mach-omap2/voltage.c b/arch/arm/mach-omap2/voltage.c > index 6ede092..644a45f 100644 > --- a/arch/arm/mach-omap2/voltage.c > +++ b/arch/arm/mach-omap2/voltage.c > @@ -43,6 +43,16 @@ > Â#define FAST_OPP        0x1 > Â#define NOMINAL_OPP      Â0x0 > > +/* prototypes used by ABB function pointers */ > +static int omap_abb_notify_voltage(struct notifier_block *nb, > +        unsigned long val, void *data); > + > +static int omap3_abb_configure(struct omap_abb_info *abb); > +static int omap3_abb_set_opp(struct omap_abb_info *abb, int opp_type); > + > +static int omap4_abb_configure(struct omap_abb_info *abb); > +static int omap4_abb_set_opp(struct omap_abb_info *abb, int opp_type); > + > Âstatic struct omap_vdd_info *vdd_info; > Â/* > Â* Number of scalable voltage domains. > @@ -70,9 +80,11 @@ static struct omap_vdd_info omap3_vdd_info[] = { >                    Â= OMAP3_PRM_IRQSTATUS_MPU_OFFSET, >            Â.done_st_shift Â= OMAP3630_ABB_LDO_TRANXDONE_ST_SHIFT, >            Â.done_st_mask  = OMAP3630_ABB_LDO_TRANXDONE_ST_MASK, > -            .configure   Â= NULL, > -            .nb_handler   = NULL, > -            .set_opp    Â= NULL, > +            .nb   = { > +                .notifier_call = omap_abb_notify_voltage, > +            }, > +            .configure   Â= omap3_abb_configure, > +            .set_opp    Â= omap3_abb_set_opp, >        Â}, >    Â}, >    Â{ > @@ -113,9 +125,11 @@ static struct omap_vdd_info omap4_vdd_info[] = { >                    Â= OMAP4_PRM_IRQSTATUS_MPU_2_OFFSET, >            Â.done_st_shift Â= OMAP4430_ABB_MPU_DONE_ST_SHIFT, >            Â.done_st_mask  = OMAP4430_ABB_MPU_DONE_ST_MASK, > -            .configure   Â= NULL, > -            .nb_handler   = NULL, > -            .set_opp    Â= NULL, > +            .nb       = { > +                .notifier_call = omap_abb_notify_voltage, > +            }, > +            .configure   Â= omap4_abb_configure, > +            .set_opp    Â= omap4_abb_set_opp, >        Â}, >    Â}, >    Â{ > @@ -137,9 +151,11 @@ static struct omap_vdd_info omap4_vdd_info[] = { >                    Â= OMAP4_PRM_IRQSTATUS_MPU_OFFSET, >            Â.done_st_shift Â= OMAP4430_ABB_IVA_DONE_ST_SHIFT, >            Â.done_st_mask  = OMAP4430_ABB_IVA_DONE_ST_MASK, > -            .configure   Â= NULL, > -            .nb_handler   = NULL, > -            .set_opp    Â= NULL, > +            .nb       = { > +                .notifier_call = omap_abb_notify_voltage, > +            }, > +            .configure   Â= omap4_abb_configure, > +            .set_opp    Â= omap4_abb_set_opp, >        Â}, >    Â}, >    Â{ > @@ -194,7 +210,7 @@ static struct omap_volt_data omap36xx_vddmpu_volt_data[] = { >            ÂNOMINAL_OPP), >    ÂVOLT_DATA_DEFINE(OMAP3630_VDD_MPU_OPP100_UV, >            ÂOMAP3630_CONTROL_FUSE_OPP100_VDD1, 0xf9, 0x16, > -            NOMINAL_OPP), > +            FAST_OPP), >    ÂVOLT_DATA_DEFINE(OMAP3630_VDD_MPU_OPP120_UV, >            ÂOMAP3630_CONTROL_FUSE_OPP120_VDD1, 0xfa, 0x23, >            ÂNOMINAL_OPP), > @@ -493,6 +509,74 @@ static void __init vdd_debugfs_init(struct omap_vdd_info *vdd) >                Â&nom_volt_debug_fops); > Â} > > +/* voltage transition notification handlers */ > + > +/** > + * omap_abb_notify_voltage - voltage change notifier handler for ABB > + * @nb     : notifier block > + * @val        Â: VOLTSCALE_PRECHANGE or VOLTSCALE_POSTCHANGE > + * @data    : struct omap_volt_change_info for a given voltage domain > + * > + * Sets ABB LDO to either bypass or Forward Body-Bias whenever a voltage > + * change notification is generated. ÂVoltages marked as FAST will result in > + * FBB operation of ABB LDO and voltages marked as NOMINAL will bypass the > + * LDO. ÂDoes not handle Reverse Body-Bias since there is not benefit for it > + * on any existing silicon. ÂReturns 0 upon success, negative error code > + * otherwise. > + */ > +static int omap_abb_notify_voltage(struct notifier_block *nb, > +        unsigned long val, void *data) > +{ > +    struct omap_volt_change_info *v_info; > +    struct omap_vdd_info *vdd; > +    struct omap_volt_data *curr_volt_data, *target_volt_data; > +    int ret = 0; No need to initialize 'ret' here. Or, as we can see below, you might not need 'ret' at all. > + > +    if (!nb || IS_ERR(nb) || !data || IS_ERR(data)) { > +        pr_warning("%s: invalid data specified\n", __func__); > +        ret = -EINVAL; > +        goto out; Why set 'ret' and jump to 'out' just to return 'ret'? You can already return -EINVAL now. > +    } > + > +    v_info = (struct omap_volt_change_info *)data; > +    vdd = v_info->vdd; > + > +    /* get the voltdata structures for the current & target voltage */ > +    target_volt_data = omap_voltage_get_voltdata(&vdd->voltdm, > +            v_info->target_volt); > +    curr_volt_data = omap_voltage_get_voltdata(&vdd->voltdm, > +            v_info->curr_volt); > + > +    /* nothing to do here */ > +    if (target_volt_data->abb_opp == curr_volt_data->abb_opp) > +        goto out; No need to jump to 'out' just to return 0. Why not return 0 now? > + > +    /* > +    Â* When the VDD drops from a voltage requiring the ABB LDO to be in > +    Â* FBB mode to a voltage requiring bypass mode, we must bypass the LDO > +    Â* before the voltage transition. > +    Â*/ > +    if (val == VOLTSCALE_PRECHANGE && > +            target_volt_data->abb_opp == NOMINAL_OPP) { > +        ret = vdd->abb.set_opp(&vdd->abb, NOMINAL_OPP); return vdd->abb.set_opp(&vdd->abb, NOMINAL_OPP); > + > +    /* > +    Â* When moving from a voltage requiring the ABB LDO to be bypassed to > +    Â* a voltage requiring FBB mode, we must change the LDO operation > +    Â* after the voltage transition. > +    Â*/ > +    } else if (val == VOLTSCALE_POSTCHANGE && > +            target_volt_data->abb_opp == FAST_OPP) { > +        ret = vdd->abb.set_opp(&vdd->abb, FAST_OPP); return vdd->abb.set_opp(&vdd->abb, FAST_OPP); > + > +    /* invalid combination, bail out */ > +    } else > +        ret = -EINVAL; return -EINVAL; > + > +out: > +    return ret; You can get rid of this last part. > +} > + > Â/* Voltage scale and accessory APIs */ > Âstatic int _pre_volt_scale(struct omap_vdd_info *vdd, >        Âunsigned long target_volt, u8 *target_vsel, u8 *current_vsel) > @@ -717,6 +801,142 @@ static int vp_forceupdate_scale_voltage(struct omap_vdd_info *vdd, >    Âreturn 0; > Â} > > +/** > + * omap3_abb_set_opp - program ABB LDO upon a voltage transition > + * > + * @abb        Â: ABB instance being programmed > + * @opp_type  : flag for NOMINAL or FAST OPP > + */ > +static int omap3_abb_set_opp(struct omap_abb_info *abb, int opp_type) > +{ > +    int ret = 0; You don't need 'ret'. > +    int timeout; > + > +    /* program for NOMINAL OPP or FAST OPP */ > +    omap2_prm_rmw_mod_reg_bits(OMAP3630_OPP_SEL_MASK, > +            (opp_type << OMAP3630_OPP_SEL_SHIFT), > +            OMAP3430_GR_MOD, abb->setup_offs); > + > +    /* clear ABB ldo interrupt status */ > +    omap2_prm_clear_mod_reg_bits(abb->done_st_mask, OCP_MOD, > +            abb->irqstatus_mpu_offs); > + > +    /* enable ABB LDO OPP change */ > +    omap2_prm_set_mod_reg_bits(OMAP3630_OPP_CHANGE_MASK, OMAP3430_GR_MOD, > +            abb->setup_offs); > + > +    timeout = 0; > + > +    /* wait until OPP change completes */ > +    while ((timeout < ABB_TRANXDONE_TIMEOUT) && > +            (!(omap2_prm_read_mod_reg(OCP_MOD, > +                         abb->irqstatus_mpu_offs) & > +             Âabb->done_st_mask))) { > +        udelay(1); > +        timeout++; > +    } > + > +    if (timeout == ABB_TRANXDONE_TIMEOUT) > +        pr_warning("%s: TRANXDONE timed out waiting for OPP change\n", > +                __func__); > + > +    timeout = 0; > + > +    /* Clear all pending TRANXDONE interrupts/status */ > +    while (timeout < ABB_TRANXDONE_TIMEOUT) { > +        omap2_prm_write_mod_reg((1 << abb->done_st_shift), OCP_MOD, > +                abb->irqstatus_mpu_offs); > + > +        if (!(omap2_prm_read_mod_reg(OCP_MOD, abb->irqstatus_mpu_offs) > +                    & abb->done_st_mask)) > +            break; > + > +        udelay(1); > +        timeout++; > +    } > + > +    if (timeout == ABB_TRANXDONE_TIMEOUT) { > +        pr_warning("%s: TRANXDONE timed out trying to clear status\n", > +                __func__); > +        ret = -EBUSY; return -EBUSY here. > +    } > + > +    return ret; And return 0 here. > +} > + > +/** > + * omap4_abb_set_opp - program ABB LDO upon a voltage transition > + * > + * @abb        Â: ABB instance being programmed > + * @opp_type  : flag for NOMINAL or FAST OPP > + */ > +static int omap4_abb_set_opp(struct omap_abb_info *abb, int opp_type) > +{ > +    int ret = 0; Again you don't need 'ret'. > +    int timeout; > + > +    /* program for NOMINAL OPP or FAST OPP */ > +    omap4_prminst_rmw_inst_reg_bits(OMAP4430_OPP_SEL_MASK, > +            (opp_type << OMAP4430_OPP_SEL_SHIFT), > +            OMAP4430_PRM_PARTITION, OMAP4430_PRM_DEVICE_INST, > +            abb->ctrl_offs); > + > +    /* clear ABB ldo interrupt status */ > +    omap4_prminst_rmw_inst_reg_bits(abb->done_st_mask, > +            (0x0 << abb->done_st_shift), OMAP4430_PRM_PARTITION, > +            OMAP4430_PRM_DEVICE_INST, abb->ctrl_offs); > + > +    /* enable ABB LDO OPP change */ > +    omap4_prminst_rmw_inst_reg_bits(OMAP4430_OPP_CHANGE_MASK, > +            (0x1 << OMAP4430_OPP_CHANGE_SHIFT), > +            OMAP4430_PRM_PARTITION, OMAP4430_PRM_DEVICE_INST, > +            abb->ctrl_offs); > + > +    timeout = 0; > + > +    /* wait until OPP change completes */ > +    while ((timeout < ABB_TRANXDONE_TIMEOUT) && > +            (!(omap4_prminst_read_inst_reg(OMAP4430_PRM_PARTITION, > +                           ÂOMAP4430_PRM_DEVICE_INST, > +                           Âabb->irqstatus_mpu_offs) > +             Â& abb->done_st_mask))) { > +        udelay(1); > +        timeout++; > +    } > + > +    if (timeout == ABB_TRANXDONE_TIMEOUT) > +        pr_warning("%s: TRANXDONE timed out waiting for OPP change\n", > +                __func__); > + > +    timeout = 0; > + > +    /* Clear all pending TRANXDONE interrupts/status */ > +    while (timeout < ABB_TRANXDONE_TIMEOUT) { > +        omap4_prminst_write_inst_reg((1 << abb->done_st_shift), > +                OMAP4430_PRM_PARTITION, > +                OMAP4430_PRM_DEVICE_INST, > +                abb->irqstatus_mpu_offs); > + > +        if (!(omap4_prminst_read_inst_reg(OMAP4430_PRM_PARTITION, > +                        OMAP4430_PRM_DEVICE_INST, > +                        abb->irqstatus_mpu_offs) > +                    & abb->done_st_mask)) { > +            break; > + > +            udelay(1); > +            timeout++; > +        } > +    } > + > +    if (timeout == ABB_TRANXDONE_TIMEOUT) { > +        pr_warning("%s: TRANXDONE timed out trying to clear status\n", > +                __func__); > +        ret = -EBUSY; return -EBUSY. > +    } > + > +    return ret; return 0 > +} > + > Â/* OMAP3 specific voltage init functions */ > > Â/* > @@ -789,6 +1009,64 @@ static void __init omap3_vc_init(struct omap_vdd_info *vdd) >    Âis_initialized = true; > Â} > > +/** > + * omap3_abb_configure - per-VDD configuration of ABB > + * > + * @abb        Â: abb instance being initialized > + */ > +static int omap3_abb_configure(struct omap_abb_info *abb) > +{ > +    int ret = 0; Once more you don't need 'ret'. > +    u32 sr2_wt_cnt_val; > +    struct clk *sys_ck; > +    struct omap_vdd_info *vdd; > + > +    if (!abb || IS_ERR(abb)) { > +            pr_warning("%s: invalid abb\n", __func__); > +            ret = -EINVAL; > +            goto out; Why set 'ret', jump to 'out' just to return 'ret'? Return -EINVAL now. > +    } > + > +    sys_ck = clk_get(NULL, "sys_ck"); > +    if (IS_ERR(sys_ck)) { > +        pr_warning("%s: unable to fetch SYS_CK\n", __func__); > +        ret = -ENODEV; return -ENODEV > +        goto out; > +    } > + > +    vdd = container_of(abb, struct omap_vdd_info, abb); > + > +    /* LDO settling time */ > +    sr2_wt_cnt_val = clk_get_rate(sys_ck); > +    sr2_wt_cnt_val = sr2_wt_cnt_val / 1000000 / 16; > + > +    omap2_prm_rmw_mod_reg_bits(OMAP3630_SR2_WTCNT_VALUE_MASK, > +            (sr2_wt_cnt_val << OMAP3630_SR2_WTCNT_VALUE_SHIFT), > +            OMAP3430_GR_MOD, abb->setup_offs); > + > +    /* allow FBB operation */ > +    omap2_prm_set_mod_reg_bits(OMAP3630_ACTIVE_FBB_SEL_MASK, > +            OMAP3430_GR_MOD, abb->setup_offs); > + > +    /* do not allow ACTIVE RBB operation */ > +    omap2_prm_set_mod_reg_bits(OMAP3630_ACTIVE_RBB_SEL_MASK, > +            OMAP3430_GR_MOD, abb->setup_offs); > + > +    /* do not allow SLEEP RBB operation */ > +    omap2_prm_set_mod_reg_bits(OMAP3630_SLEEP_RBB_SEL_MASK, > +            OMAP3430_GR_MOD, abb->setup_offs); > + > +    /* enable ABB LDO */ > +    omap2_prm_set_mod_reg_bits(OMAP3630_SR2EN_MASK, > +            OMAP3430_GR_MOD, abb->ctrl_offs); > + > +    /* register the notifier handler */ > +    omap_voltage_register_notifier(vdd, &abb->nb); > + > +out: > +    return ret; return 0 > +} > + > Â/* Sets up all the VDD related info for OMAP3 */ > Âstatic int __init omap3_vdd_data_configure(struct omap_vdd_info *vdd) > Â{ > @@ -824,6 +1102,9 @@ static int __init omap3_vdd_data_configure(struct omap_vdd_info *vdd) >        Âvdd->vc_reg.smps_volra_mask = OMAP3430_VOLRA0_MASK; >        Âvdd->vc_reg.voltsetup_shift = OMAP3430_SETUP_TIME1_SHIFT; >        Âvdd->vc_reg.voltsetup_mask = OMAP3430_SETUP_TIME1_MASK; > + > +        /* configure ABB */ > +        vdd->abb.configure(&vdd->abb); >    Â} else if (!strcmp(vdd->voltdm.name, "core")) { >        Âif (cpu_is_omap3630()) >            Âvdd->volt_data = omap36xx_vddcore_volt_data; > @@ -975,6 +1256,73 @@ static void __init omap4_vc_init(struct omap_vdd_info *vdd) >    Âis_initialized = true; > Â} > > +/** > + * omap4_abb_configure - per-VDD configuration of ABB > + * > + * @abb        Â: abb instance being initialized > + */ > +static int omap4_abb_configure(struct omap_abb_info *abb) > +{ > +    int ret = 0; Get rid of 'ret'. > +    u32 sr2_wt_cnt_val; > +    struct clk *sys_ck; > +    struct omap_vdd_info *vdd; > + > +    if (!abb || IS_ERR(abb)) { > +            pr_warning("%s: invalid abb\n", __func__); > +            ret = -EINVAL; return -EINVAL > +            goto out; > +    } > + > +    sys_ck = clk_get(NULL, "sys_clkin_ck"); > +    if (IS_ERR(sys_ck)) { > +        pr_warning("%s: unable to fetch SYS_CK", __func__); > +        ret = -ENODEV; return -ENODEV > +        goto out; > +    } > + > +    vdd = container_of(abb, struct omap_vdd_info, abb); > + > +    /* LDO settling time */ > +    sr2_wt_cnt_val = clk_get_rate(sys_ck); > +    sr2_wt_cnt_val = sr2_wt_cnt_val / 1000000 / 16; > + > +    omap4_prminst_rmw_inst_reg_bits(OMAP4430_SR2_WTCNT_VALUE_MASK, > +            (sr2_wt_cnt_val << OMAP4430_SR2_WTCNT_VALUE_SHIFT), > +            OMAP4430_PRM_PARTITION, OMAP4430_PRM_DEVICE_INST, > +            abb->setup_offs); > + > +    /* allow FBB operation */ > +    omap4_prminst_rmw_inst_reg_bits(OMAP4430_ACTIVE_FBB_SEL_MASK, > +            (1 << OMAP4430_ACTIVE_FBB_SEL_SHIFT), > +            OMAP4430_PRM_PARTITION, OMAP4430_PRM_DEVICE_INST, > +            abb->setup_offs); > + > +    /* do not allow ACTIVE RBB operation */ > +    omap4_prminst_rmw_inst_reg_bits(OMAP4430_ACTIVE_RBB_SEL_MASK, > +            (0 << OMAP4430_ACTIVE_RBB_SEL_SHIFT), > +            OMAP4430_PRM_PARTITION, OMAP4430_PRM_DEVICE_INST, > +            abb->setup_offs); > + > +    /* do not allow SLEEP RBB operation */ > +    omap4_prminst_rmw_inst_reg_bits(OMAP4430_SLEEP_RBB_SEL_MASK, > +            (0 << OMAP4430_SLEEP_RBB_SEL_SHIFT), > +            OMAP4430_PRM_PARTITION, OMAP4430_PRM_DEVICE_INST, > +            abb->setup_offs); > + > +    /* enable ABB LDO */ > +    omap4_prminst_rmw_inst_reg_bits(OMAP4430_SR2EN_MASK, > +            (1 << OMAP4430_SR2EN_SHIFT), > +            OMAP4430_PRM_PARTITION, OMAP4430_PRM_DEVICE_INST, > +            abb->setup_offs); > + > +    /* register the notifier handler */ > +    omap_voltage_register_notifier(vdd, &abb->nb); > + > +out: > +    return ret; return 0. Regards, David Cohen > +} > + > Â/* Sets up all the VDD related info for OMAP4 */ > Âstatic int __init omap4_vdd_data_configure(struct omap_vdd_info *vdd) > Â{ > @@ -983,8 +1331,8 @@ static int __init omap4_vdd_data_configure(struct omap_vdd_info *vdd) > >    Âif (!vdd->pmic_info) { >        Âpr_err("%s: PMIC info requried to configure vdd_%s not" > -            "populated.Hence cannot initialize vdd_%s\n", > -            __func__, vdd->voltdm.name, vdd->voltdm.name); > +                "populated.Hence cannot initialize vdd_%s\n", > +                __func__, vdd->voltdm.name, vdd->voltdm.name); >        Âreturn -EINVAL; >    Â} > > @@ -1005,6 +1353,9 @@ static int __init omap4_vdd_data_configure(struct omap_vdd_info *vdd) >        Âvdd->vc_reg.voltsetup_reg = >                ÂOMAP4_PRM_VOLTSETUP_MPU_RET_SLEEP_OFFSET; >        Âvdd->prm_irqst_reg = OMAP4_PRM_IRQSTATUS_MPU_2_OFFSET; > + > +        /* configure ABB */ > +        vdd->abb.configure(&vdd->abb); >    Â} else if (!strcmp(vdd->voltdm.name, "core")) { >        Âvdd->volt_data = omap44xx_vdd_core_volt_data; >        Âvdd->vp_reg.tranxdone_status = > @@ -1032,6 +1383,9 @@ static int __init omap4_vdd_data_configure(struct omap_vdd_info *vdd) >        Âvdd->vc_reg.voltsetup_reg = >                ÂOMAP4_PRM_VOLTSETUP_IVA_RET_SLEEP_OFFSET; >        Âvdd->prm_irqst_reg = OMAP4_PRM_IRQSTATUS_MPU_OFFSET; > + > +        /* configure ABB */ > +        vdd->abb.configure(&vdd->abb); >    Â} else { >        Âpr_warning("%s: vdd_%s does not exisit in OMAP4\n", >            Â__func__, vdd->voltdm.name); > @@ -1299,6 +1653,7 @@ int omap_voltage_scale_vdd(struct voltagedomain *voltdm, > >    Â/* load notifier chain data */ >    Âv_info.target_volt = target_volt; > +    v_info.curr_volt = vdd->curr_volt; >    Âv_info.vdd = vdd; > >    Âsrcu_notifier_call_chain(&vdd->volt_change_notify_chain, > diff --git a/arch/arm/plat-omap/include/plat/voltage.h b/arch/arm/plat-omap/include/plat/voltage.h > index af790bf..07997f7 100644 > --- a/arch/arm/plat-omap/include/plat/voltage.h > +++ b/arch/arm/plat-omap/include/plat/voltage.h > @@ -235,8 +235,8 @@ struct omap_vdd_dep_info { > Â* @irqstatus_mpu_offs : PRM_IRQSTATUS_MPU* register offset > Â* @done_st_shift   Â: ABB_vdd_DONE_ST shift > Â* @done_st_mask    : ABB_vdd_DONE_ST bit mask > + * @nb         : voltage transition notifier block > Â* @configure     Â: boot-time configuration > - * @nb_handler     : voltage transition notification handler > Â* @set_opp      Â: transition function called from nb_handler > Â*/ > Âstruct omap_abb_info { > @@ -245,9 +245,8 @@ struct omap_abb_info { >    Âu8 irqstatus_mpu_offs; >    Âu8 done_st_shift; >    Âu32 done_st_mask; > +    struct notifier_block nb; >    Âint (*configure) (struct omap_abb_info *abb); > -    int (*nb_handler) (struct notifier_block *nb, unsigned long val, > -            void *data); >    Âint (*set_opp) (struct omap_abb_info *abb, int opp_type); > Â}; > > @@ -302,6 +301,7 @@ struct omap_vdd_info { > Â*/ > Âstruct omap_volt_change_info { >    Âunsigned long target_volt; > +    unsigned long curr_volt; >    Âstruct omap_vdd_info *vdd; > Â}; > > -- > 1.7.1 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-omap" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at Âhttp://vger.kernel.org/majordomo-info.html > ÿô.nÇ·®+%˱é¥wÿº{.nÇ·¥{±þ§ø¡Ü}©²ÆzÚj:+v¨þø®w¥þàÞ¨è&¢)ß«a¶Úÿûz¹ÞúÝjÿwèf