static u32 cal_opp5_nvalue(u32 prev_nvalue) { u32 senpgain, senngain; u32 rnsenp, rnsenn; u32 prev_senPgain, prev_senNgain; u32 prev_senPRN, prev_senNRN; u32 nAdj,sennval,senpval; prev_senPgain = (prev_nvalue & 0x00f00000) >> 0x14; prev_senNgain = (prev_nvalue & 0x000f0000) >> 0x10; prev_senPRN = (prev_nvalue & 0x0000ff00) >> 0x8; prev_senNRN = (prev_nvalue & 0x000000ff); senpval = ((1 << (prev_senPgain + 8))/prev_senPRN) + 235; sennval = ((1 << (prev_senNgain + 8))/prev_senNRN) + 385; /* Calculating the gain and reciprocal of the SenN and SenP values */ cal_reciprocal(senpval, &senpgain, &rnsenp); cal_reciprocal(sennval, &senngain, &rnsenn); return (senpgain << NVALUERECIPROCAL_SENPGAIN_SHIFT) | (senngain << NVALUERECIPROCAL_SENNGAIN_SHIFT) | (rnsenp << NVALUERECIPROCAL_RNSENP_SHIFT) | (rnsenn << NVALUERECIPROCAL_RNSENN_SHIFT); }
/* Read EFUSE values from control registers for OMAP3430 */ static void __init sr_set_nvalues(struct omap_volt_data *volt_data, struct omap_sr_data *sr_data) { struct omap_sr_nvalue_table *nvalue_table; int i, count = 0; while (volt_data[count].volt_nominal) count++; nvalue_table = kzalloc(sizeof(struct omap_sr_nvalue_table)*count, GFP_KERNEL); for (i = 0; i < count; i++) { u32 v; /* * In OMAP4 the efuse registers are 24 bit aligned. * A __raw_readl will fail for non-32 bit aligned address * and hence the 8-bit read and shift. */ if (cpu_is_omap44xx()) { u16 offset = volt_data[i].sr_efuse_offs; #ifdef CONFIG_OMAP_SMARTREFLEX_CUSTOM_SENSOR if (offset == 0) { u32 pgain = 0, pvalue = 0, ngain = 0, nvalue = 0; cal_reciprocal(volt_data[i].sr_nsensor, &ngain, &nvalue); cal_reciprocal(volt_data[i].sr_psensor, &pgain, &pvalue); v = (pgain << NVALUERECIPROCAL_SENPGAIN_SHIFT) | (ngain << NVALUERECIPROCAL_SENNGAIN_SHIFT) | (pvalue << NVALUERECIPROCAL_RNSENP_SHIFT) | (nvalue); } else { v = omap_ctrl_readb(offset) | omap_ctrl_readb(offset + 1) << 8 | omap_ctrl_readb(offset + 2) << 16; } #else v = omap_ctrl_readb(offset) | omap_ctrl_readb(offset + 1) << 8 | omap_ctrl_readb(offset + 2) << 16; #endif } else { v = omap_ctrl_readl(volt_data[i].sr_efuse_offs); } nvalue_table[i].efuse_offs = volt_data[i].sr_efuse_offs; nvalue_table[i].nvalue = v; } sr_data->nvalue_table = nvalue_table; sr_data->nvalue_count = count; }
static u32 cal_test_nvalue(u32 sennval, u32 senpval) { u32 senpgain, senngain; u32 rnsenp, rnsenn; /* Calculating the gain and reciprocal of the SenN and SenP values */ cal_reciprocal(senpval, &senpgain, &rnsenp); cal_reciprocal(sennval, &senngain, &rnsenn); return (senpgain << NVALUERECIPROCAL_SENPGAIN_SHIFT) | (senngain << NVALUERECIPROCAL_SENNGAIN_SHIFT) | (rnsenp << NVALUERECIPROCAL_RNSENP_SHIFT) | (rnsenn << NVALUERECIPROCAL_RNSENN_SHIFT); }
void sr_calculate_rg(u32 rfuse, u32 gain_fuse, u32 delta_nt, u32 *rnsen, u32 *sengain) { u32 nadj; nadj = ((1 << (gain_fuse + 8)) / rfuse) + delta_nt; cal_reciprocal(nadj, sengain, rnsen); }