예제 #1
0
static void report_abs(struct gs_mma8452_data *mma)
{
    short xyz[3];
    //if(mma->mma_status.active == MMA_STANDBY)
    if(atomic_read(&mma->chip_enabled) == 0)
    {
        goto out;
    }
    /*do{
        result = i2c_smbus_read_byte_data(mma->client,
                         MMA8452_STATUS);
        retry --;
        msleep(1);
    } while (!(result & MMA8452_STATUS_ZYXDR)&& retry > 0);
        if(retry == 0)
        goto out;*/

    if (mma8452_read_data(mma,xyz) != 0)
        goto out;
    mma8452_adjust_position(mma,xyz);
      
    accl8452_data[0] = xyz[0];
    accl8452_data[1] = xyz[1];
    accl8452_data[2] = xyz[2];
    input_report_abs(mma->input_dev, ABS_X,  xyz[0]);
    input_report_abs(mma->input_dev, ABS_Y,  xyz[1]);
    input_report_abs(mma->input_dev, ABS_Z,  xyz[2]);
   
    input_sync(mma->input_dev);
    
out:
    return;
}
static void report_abs(void)
{
	short x, y, z;
	int result;
	int retry = 3;

	mutex_lock(&mma8452_lock);
	if(mma_status.active & (MMA_STANDBY|MMA_SUSPEND))
		goto out;
	/* wait for the data ready */
	do {
		result = i2c_smbus_read_byte_data(mma8452_i2c_client,
					     MMA8452_STATUS);
		retry --;
		msleep(1);
	} while (!(result & MMA8452_STATUS_ZYXDR)&& retry > 0);
    	if(retry == 0)
		goto out;
	if (mma8452_read_data(&x, &y, &z) != 0)
		goto out;
    mma8452_adjust_position(&x, &y, &z);
	input_report_abs(mma8452_idev->input, ABS_X, x);
	input_report_abs(mma8452_idev->input, ABS_Y, y);
	input_report_abs(mma8452_idev->input, ABS_Z, z);
	input_sync(mma8452_idev->input);
out:
	mutex_unlock(&mma8452_lock);
}