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;
}
Пример #3
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;
}
Пример #4
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));
}
Пример #5
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, 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();
}
Пример #6
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;

    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;
}
Пример #7
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);
}
Пример #9
0
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;
}