static void yas_acc_work_func(struct work_struct *work) { struct yas_acc_private_data *data = container_of((struct delayed_work *)work, struct yas_acc_private_data, work); struct yas_acc_data accel, last; unsigned long delay = delay_to_jiffies(yas_acc_get_delay(data->driver)); static int cnt = 0; accel.xyz.v[0] = accel.xyz.v[1] = accel.xyz.v[2] = 0; yas_acc_measure(data->driver, &accel); mutex_lock(&data->data_mutex); last = data->last; mutex_unlock(&data->data_mutex); input_report_abs(data->input, ABS_X, accel.xyz.v[0]); input_report_abs(data->input, ABS_Y, accel.xyz.v[1]); input_report_abs(data->input, ABS_Z, accel.xyz.v[2]); if (last.xyz.v[0] == accel.xyz.v[0] && last.xyz.v[1] == accel.xyz.v[1] && last.xyz.v[2] == accel.xyz.v[2]) { input_report_abs(data->input, ABS_RUDDER, cnt++); } input_sync(data->input); mutex_lock(&data->data_mutex); data->last = accel; mutex_unlock(&data->data_mutex); schedule_delayed_work(&data->work, delay); }
static int yas_acc_resume(struct i2c_client *client) { struct yas_acc_private_data *data = i2c_get_clientdata(client); struct yas_acc_driver *driver = data->driver; int delay; mutex_lock(&data->data_mutex); #ifdef WILLOW_SENSOR_REGULATOR_CONTROL regulator_enable(data->regulator); #endif if (data->suspend == 1) { if (data->suspend_enable) { delay = yas_acc_get_delay(driver); schedule_delayed_work(&data->work, delay_to_jiffies(delay) + 1); yas_acc_set_enable(driver, 1); } } data->suspend = 0; mutex_unlock(&data->data_mutex); return 0; }
static int yas_acc_resume(struct i2c_client *client) { struct yas_acc_private_data *data = i2c_get_clientdata(client); struct yas_acc_driver *driver = data->driver; int delay; dbg_func_in(); #ifdef POWER_ON_OFF geomagnetic_set_power(1); #endif #ifndef PANTECH_AVOID_DEADLOCK mutex_lock(&data->data_mutex); #endif dbg("%s : data->suspend = %d / data->suspend_enable = %d / delay = %d\n", __func__, data->suspend, yas_acc_get_enable(driver), yas_acc_get_delay(driver)); if (data->suspend == 1) { if (data->suspend_enable) { delay = yas_acc_get_delay(driver); #ifndef PANTECH_AVOID_DEADLOCK schedule_delayed_work(&data->work, delay_to_jiffies(delay) + 1); #endif yas_acc_set_enable(driver, 1); } } data->suspend = 0; #ifndef PANTECH_AVOID_DEADLOCK mutex_unlock(&data->data_mutex); #endif dbg_func_out(); return 0; }
static ssize_t yas_acc_delay_show(struct device *dev, struct device_attribute *attr, char *buf) { struct input_dev *input = to_input_dev(dev); struct yas_acc_private_data *data = input_get_drvdata(input); return sprintf(buf, "%d\n", yas_acc_get_delay(data->driver)); }
static void yas_acc_work_func(struct work_struct *work) { struct yas_acc_private_data *data = container_of((struct delayed_work *)work, struct yas_acc_private_data, work); struct yas_acc_data accel, last; unsigned long delay = delay_to_jiffies(yas_acc_get_delay(data->driver)); static int cnt = 0; // dbg_func_in(); accel.xyz.v[0] = accel.xyz.v[1] = accel.xyz.v[2] = 0; yas_acc_measure(data->driver, &accel); #ifdef PANTECH_AVOID_DEADLOCK last = data->last; #else mutex_lock(&data->data_mutex); last = data->last; mutex_unlock(&data->data_mutex); #endif input_report_abs(data->input, ABS_X, accel.xyz.v[0]); input_report_abs(data->input, ABS_Y, accel.xyz.v[1]); input_report_abs(data->input, ABS_Z, accel.xyz.v[2]); if (last.xyz.v[0] == accel.xyz.v[0] && last.xyz.v[1] == accel.xyz.v[1] && last.xyz.v[2] == accel.xyz.v[2]) { input_report_abs(data->input, ABS_RUDDER, cnt++); } input_sync(data->input); #ifdef PANTECH_AVOID_DEADLOCK data->last = accel; #else mutex_lock(&data->data_mutex); data->last = accel; mutex_unlock(&data->data_mutex); #endif schedule_delayed_work(&data->work, delay); // dbg("%s : schedule_delayed_work(%d)\n", __func__ ,(int)delay); // dbg_func_out(); }
static int yas_acc_resume(struct i2c_client *client) { struct yas_acc_private_data *data = i2c_get_clientdata(client); struct yas_acc_driver *driver = data->driver; int delay; mutex_lock(&data->data_mutex); if (data->suspend == 1) { if (data->suspend_enable) { delay = yas_acc_get_delay(driver); schedule_delayed_work(&data->work, delay_to_jiffies(delay) + 1); yas_acc_set_enable(driver, 1); } } data->suspend = 0; mutex_unlock(&data->data_mutex); return 0; }
static void yas_acc_work_func(struct work_struct *work) { struct yas_acc_private_data *data = container_of((struct delayed_work *)work, struct yas_acc_private_data, work); struct yas_acc_data accel; unsigned long delay = delay_to_jiffies(yas_acc_get_delay(data->driver)); printk("[diony] yas_acc_work_func.\n"); accel.xyz.v[0] = accel.xyz.v[1] = accel.xyz.v[2] = 0; yas_acc_measure(data->driver, &accel); input_report_abs(data->input, ABS_X, accel.xyz.v[0]); input_report_abs(data->input, ABS_Y, accel.xyz.v[1]); input_report_abs(data->input, ABS_Z, accel.xyz.v[2]); input_sync(data->input); mutex_lock(&data->data_mutex); data->last = accel; mutex_unlock(&data->data_mutex); // schedule_delayed_work(&data->work, delay); }
void yas_acc_late_resume(struct early_suspend *h) { struct yas_acc_private_data *data = container_of(h, struct yas_acc_private_data, early_suspend); struct yas_acc_driver *driver = data->driver; int delay; #ifdef WILLOW_SENSOR_REGULATOR_CONTROL regulator_enable(data->regulator); #endif mutex_lock(&data->data_mutex); if (data->suspend == 1) { if (data->suspend_enable) { delay = yas_acc_get_delay(driver); schedule_delayed_work(&data->work, delay_to_jiffies(delay) + 1); yas_acc_set_enable(driver,1); } } data->suspend = 0; mutex_unlock(&data->data_mutex); }
static int yas_acc_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { int err= 0 ; struct yas_acc_private_data* data = gyas_acc; unsigned long delay_ns; unsigned char data_cal[3]; struct yas_acc_data accel; struct yas_acc accel_data; switch(cmd) { case YAS_IOCTL_SET_DELAY: // printk("[diony] YAS_IOCTL_SET_DELAY.\n"); if (copy_from_user(&delay_ns, (void __user *)arg, sizeof(delay_ns))) return -EFAULT; err = yas_acc_set_delay(data->driver, (int)delay_ns); break; case YAS_IOCTL_GET_DELAY: // printk("[diony] YAS_IOCTL_GET_DELAY.\n"); delay_ns = (unsigned long)yas_acc_get_delay(data->driver); if (put_user(&delay_ns, (s64 __user *) arg)) return -EFAULT; break; case YAS_IOCTL_READ_ACCEL_XYZ: mutex_lock(&data->data_mutex); yas_acc_measure(data->driver, &accel); accel_data.x = accel.raw.v[0]; accel_data.y = accel.raw.v[1]; accel_data.z = accel.raw.v[2]; mutex_unlock(&data->data_mutex); if (copy_to_user((void __user*)arg, &accel_data, sizeof(accel_data))) return -EFAULT; break; case YAS_IOCTL_CALIBRATION: data_cal[0] = data_cal[1] = 0; data_cal[2] = 1; mutex_lock(&data->data_mutex); yas_acc_measure(data->driver, &accel); printk("BMA222_CALIBRATION data(%10d %10d %10d) raw(%5d %5d %5d)\n", accel.xyz.v[0], accel.xyz.v[1], accel.xyz.v[2], accel.raw.v[0], accel.raw.v[1], accel.raw.v[2]); err = yas_acc_fast_calibration(data->driver, data_cal); // calibration start yas_acc_measure(data->driver, &accel); printk("BMA222_CALIBRATION data(%10d %10d %10d) raw(%5d %5d %5d)\n", accel.xyz.v[0], accel.xyz.v[1], accel.xyz.v[2], accel.raw.v[0], accel.raw.v[1], accel.raw.v[2]); accel_data.x = accel.raw.v[0]; accel_data.y = accel.raw.v[1]; accel_data.z = accel.raw.v[2]; mutex_unlock(&data->data_mutex); if (copy_to_user((void __user*)arg, &accel_data, sizeof(accel_data))) return -EFAULT; break; default : printk("[YAS] IOCTL Error !. %d \n", cmd); err = -EINVAL; break; } return err; }