static int proc_battery_show(struct seq_file *m, void *v) { unsigned short mV; int raw; int i, mx; struct _batt_cap *tbl = &(batt_cap [0]); if (pmic_get_voltage(GEN_PURPOSE_AD5, &mV, &raw, 1) == 0) { seq_printf (m, "%dmV (%d) ", mV, raw); } else { seq_printf (m, "---mV (---) "); } mx = sizeof(batt_cap) / sizeof(struct _batt_cap); for ( i = 0 ; i < mx ; i++ , tbl++ ) { seq_printf (m, " %d:%d", tbl->raw, tbl->cap); } seq_printf (m, " caution(%d:%d - %d)", batt_cap[BATT_CAP_CAUTION_LEVEL].raw, batt_cap[BATT_CAP_CAUTION_LEVEL].cap, batt_sample.mode_caution); #ifdef USE_BATTERY_LOW_INTERRUPT if (pmic_get_voltage (GEN_PURPOSE_AD2, &mV, &raw, 0) == 0) { seq_printf (m, " bpsns:%dmV(%d)", mV, raw); } else { seq_printf (m, " bpsns:---mV(---)"); } #endif /* USE_BATTERY_LOW_INTERRUPT */ #ifdef USE_BATTERY_LOW_POLLING seq_printf (m, " shutdown(%d:%d) poll:%dsec", batt_cap[BATT_CAP_SHUTDOWN_LEVEL].raw, batt_cap[BATT_CAP_SHUTDOWN_LEVEL].cap, batt_poll_interval); #endif /* USE_BATTERY_LOW_POLLING */ seq_printf (m, "\n"); return 0; }
/* * pmic_get_dcinput_voltage (unsigned short *voltage) * rc 0(DCinput OK) / 1(DCinput Low) / -1(error) */ int pmic_get_dcinput_voltage (unsigned short *voltage) { unsigned short vv; int rc = pmic_get_voltage (GEN_PURPOSE_AD7, &vv, 0, 0); if (voltage != 0) { *voltage = vv; } /* * judge DCinput good/low */ if (rc == 0) { if (DCIN_GOOD_VOLT <= vv) { rc = 0; // Good } else { rc = 1; // Low } } return rc; }
static int proc_show(struct seq_file *s, void *p) { int i = 0; COMMON_VALUE_SET *cur_voltage_list = NULL; unsigned int vol_table_size = 0; COMMON_RES* cur_channel_res = NULL; #if 0 /*PMIC IRQ info*/ for (i =PMIC_REG_IRQ1;i<PMIC_IRQ_REG_BUTT;i++) { seq_printf(s, "IRQ STATUS:%d; %0x\n",i,pmuirq_desc.irq_stat_reg_buf[i]); } #endif seq_printf(s, "STATUS 0:OFF 1:ON\n"); /*pmic register power channel info*/ for(i = BUCK_ID_BEGIN ;i<PMU_CHANNEL_ID_BUTT;i++) { if(0 == pmic_power_status(i)) { seq_printf(s, "Channel ID:%d STATUS OFF VOL %d\n",i, pmic_get_voltage(i)); } else if(1 == pmic_power_status(i)) { seq_printf(s, "Channel ID:%d STATUS ON VOL %d\n",i, pmic_get_voltage(i)); } udelay(1); } /*channel voltage list show*/ for(i = BUCK_ID_BEGIN ;i<LVS_ID_BEGIN;i++) { int j = 0; /*get device res*/ cur_channel_res = pmic_get_channel_res_by_id(i); if (NULL == cur_channel_res) { continue; } else if(PMU_CHANNEL_ID_BUTT == (int)cur_channel_res) { continue; } cur_voltage_list = &(cur_channel_res->value_set); vol_table_size = cur_voltage_list->value_range_num; if(0 == vol_table_size) { continue; } seq_printf(s, "Channel ID:%d VOL_LIST:\n",i); for(j= 0;j<vol_table_size;j++) { seq_printf(s, "%d ",cur_voltage_list->value_range[j]); } seq_printf(s, "\n "); } return 0; }
/* * mc13892_battery_sample (void) * battery volatge sample for average * return N - sample count * return -1 - error */ struct _batt_sample { int mode_caution; /* mode mormal(0)/caution(1) */ int interval; /* sample interval */ int raw; /* sample raw A/D */ int volt; /* sample volt */ int prev_use; /* previous sample use count */ int error; /* sample error */ int update; /* sample update */ }; static struct _batt_sample batt_sample; static int batt_sample_initialized; static int batt_sample_rate = 60; /* sample rate (sec) */ static int mc13892_battery_sample (int online, int wait, int force) { int i, raw, rc; int rdata [5], rcnt, rmin, rmax, rttl, fmin, fmax; /* * check sample interval * mormal - 60sec, caution - 5sec */ rc = 0; if (batt_sample_initialized != 0) { if (batt_sample.mode_caution == 0) { batt_sample.interval++; if ((force == 0) && (batt_sample.interval < (batt_sample_rate / 5))) { /* * not sample timing */ return rc; } batt_sample.interval = 0; } } /* * BATT voltage * lowest (1) (2) (3) highest * * +- average -+ * (* ignore) */ rmin = 0x7fffffff; rmax = 0; rcnt = 0; for ( i = 0 ; i < 5 ; i++ ) { if (pmic_get_voltage (GEN_PURPOSE_AD5, 0, &raw, 1) == 0) { rdata [rcnt++] = raw; if (raw < rmin) { rmin = raw; } else if (rmax < raw) { rmax = raw; } } else { batt_sample.error++; } if (wait != 0) { mdelay ( 10 ); /* 10ms measure interval */ } } rttl = 0; fmin = 0; fmax = 0; for ( i = 0 ; i < rcnt ; i++ ) { if ((fmin == 0) && (rmin == rdata [i])) { fmin++; /* lowest value ignore */ } else if ((fmax == 0) && (rmax == rdata [i])) { fmax++; /* highest value ignore */ } else { rttl += rdata [i]; } } if (0 < (rcnt - fmin - fmax)) { raw = rttl / (rcnt - fmin - fmax); batt_sample.update++; rc = rcnt; } else { raw = batt_sample.raw; batt_sample.prev_use++; rc = -1; } /* * check BATT use(AC adapter disconnect) * voltage of BATT use is decrease only. */ if ((online == 0) && (batt_sample_initialized != 0) && (batt_sample.raw < raw)) { raw = batt_sample.raw; /* prev sample use */ } /* * check normal/caution band */ if (raw <= batt_cap [BATT_CAP_CAUTION_LEVEL].raw) { batt_sample.mode_caution = 1; } else { batt_sample.mode_caution = 0; } batt_sample.raw = raw; /* * Convert voltage */ batt_sample.volt = BATT_RAW_TO_VOLT(raw); batt_sample_initialized = 1; return rc; }