int sprdchg_read_temp_adc(void) { #define SAMPLE_NUM 15 int cnt = pbat_data->temp_adc_sample_cnt; if (cnt > SAMPLE_NUM) { cnt = SAMPLE_NUM; } else if (cnt < 1) { cnt = 1; } if (pbat_data->temp_support) { int ret, i, j, temp; int adc_val[cnt]; struct adc_sample_data data = { .channel_id = pbat_data->temp_adc_ch, .channel_type = 0, /*sw */ .hw_channel_delay = 0, /*reserved */ .scale = pbat_data->temp_adc_scale, /*small scale */ .pbuf = &adc_val[0], .sample_num = cnt, .sample_bits = 1, .sample_speed = 0, /*quick mode */ .signal_mode = 0, /*resistance path */ }; ret = sci_adc_get_values(&data); WARN_ON(0 != ret); for (j = 1; j <= cnt - 1; j++) { for (i = 0; i < cnt - j; i++) { if (adc_val[i] > adc_val[i + 1]) { temp = adc_val[i]; adc_val[i] = adc_val[i + 1]; adc_val[i + 1] = temp; } } } printk("sprdchg: channel:%d,sprdchg_read_temp_adc:%d\n", data.channel_id, adc_val[cnt / 2]); return adc_val[cnt / 2]; } else { return 3000;
/* * sci_adc_get_value_by_isen - read adc value by current sense * @channel: adc software channel id; * @scale: adc sample scale, 0:little scale, 1:big scale; * @current: adc current isense(uA), 1.25uA/step, max 40uA; * * returns: adc value */ int sci_adc_get_value_by_isen(unsigned int channel, int scale, int isen) { #define ADC_MESURE_NUMBER 15 struct adc_sample_data adc; int results[ADC_MESURE_NUMBER + 1] = {0}; int ret = 0, i = 0; /* Fixme: only external adc channel used */ BUG_ON(channel > 3); WARN_ON(isen > 40); adc.channel_id = channel; adc.channel_type = 0; adc.hw_channel_delay = 0; adc.pbuf = &results[0]; adc.sample_bits = 1; adc.sample_num = ADC_MESURE_NUMBER; adc.sample_speed = 0; adc.scale = scale; adc.signal_mode = 0; sci_adc_set_current(1, isen); if(0 == sci_adc_get_values(&adc)) { ret = __average(&results[ADC_MESURE_NUMBER/5], (ADC_MESURE_NUMBER - ADC_MESURE_NUMBER * 2 /5)); } sci_adc_set_current(0, 0); for(i = 0; i < ARRAY_SIZE(results); i++) { printk("%d\t", results[i]); } printk("\n%s() adc[%d] value: %d\n", __func__, channel, ret); return ret; }