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); }