static int proximity_adc_read(struct px3215_data *data)
{
	int sum[OFFSET_ARRAY_LENGTH];
	int i = OFFSET_ARRAY_LENGTH-1;
	int avg;
	int min;
	int max;
	int total;

	do {
		msleep(50);
		sum[i] = px3215_get_px_value(data->client);
		if (i == 0) {
			min = sum[i];
			max = sum[i];
		} else {
			if (sum[i] < min)
				min = sum[i];
			else if (sum[i] > max)
				max = sum[i];
		}
		total += sum[i];
	} while (i--);

	total -= (min + max);
	avg = (total / (OFFSET_ARRAY_LENGTH - 2));
	pr_info("%s: offset = %d\n", __func__, avg);

	return avg;
}
static void prox_work_func_avg(struct work_struct *work)
{
	struct px3215_data *data = container_of(work, struct px3215_data,
		work_prox_avg);

	u16 proximity_value = 0;
	int min = 0, max = 0, avg = 0;
	int i = 0;

	for (i = 0; i < PROX_AVG_COUNT; i++) {
		proximity_value = px3215_get_px_value(data->client);
		if (proximity_value > PROX_MIN) {
			if (proximity_value > PROX_MAX)
				proximity_value = PROX_MAX;
			avg += proximity_value;
			if (!i)
				min = proximity_value;
			if (proximity_value < min)
				min = proximity_value;
			if (proximity_value > max)
				max = proximity_value;
		} else {
			proximity_value = PROX_MIN;
		}
		msleep(40);
	}
	avg /= i;
	data->avg[0] = min;
	data->avg[1] = avg;
	data->avg[2] = max;
}
/* Px data */
static ssize_t px3215_show_pxvalue(struct device *dev,
				 struct device_attribute *attr, char *buf)
{
	struct input_dev *input = to_input_dev(dev);
	struct px3215_data *data = input_get_drvdata(input);

	/* No Px data if power down */
	if (px3215_get_mode(data->client) == 0x00)
		return -EBUSY;

	return sprintf(buf, "%d\n", px3215_get_px_value(data->client));
}
/* Px data */
static ssize_t px3215_show_adc(struct device *dev,
				 struct device_attribute *attr, char *buf)
{
	struct input_dev *input = to_input_dev(dev);
	struct px3215_data *data = input_get_drvdata(input);
	static int count;		/*count for proximity average */
	int adc = 0;
	/* No Px data if power down */
	if (px3215_get_mode(data->client) == 0x00)
		return -EBUSY;
	adc = px3215_get_px_value(data->client);
	data->average[count] = adc;
	if (count == PROX_READ_NUM)
			count = 0;
	return sprintf(buf, "%d\n", adc);
}
static void px3215_work_func(struct work_struct *work)
{
	struct px3215_data *data =
			container_of(work, struct px3215_data, work_ptime);

	u16 value = 0;
	int min = 0, max = 0, avg = 0;
	int i = 0;


	for (i = 0; i < PROX_READ_NUM; i++) {
		value = px3215_get_px_value(data->client);

		if (value > PX_PROX_MIN) {
			if (value > PX_PROX_MAX)
				value = PX_PROX_MAX;
			avg += value;
			if (!i)
				min = value;
			else if (value < min)
				min = value;
			if (value > max)
				max = value;
		} else {
			value = PX_PROX_MIN;
			break;
		}
		msleep(40);
	}

	if (i != 0)
		avg /= i;
	data->avg[0] = min;
	data->avg[1] = avg;
	data->avg[2] = max;
	
}