Example #1
0
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;
}