/* * Timeout value can be changed from sysfs entry * created by timed_output_dev. * echo 100 > /sys/class/timed_output/vibrator/enable */ static void vibrator_enable(struct timed_output_dev *dev, int value) { timeout = value; if (value) { vibrator_start(); msleep(value); vibrator_stop(); } else { vibrator_stop(); } }
static void vib_work_feedback_func(struct work_struct *work) { struct vibrator *vib = container_of(work, struct vibrator, work_feedback); D(" %s +++\n", __func__); vibrator_stop(vib); D(" %s ---\n", __func__); }
/* * Timeout value can be changed from sysfs entry * created by timed_output_dev. * echo 100 > /sys/class/timed_output/vibrator/enable */ static void vibrator_enable(struct timed_output_dev *dev, int value) { hrtimer_cancel(&data->timer); if (value > 0) { vibrator_start(); hrtimer_start(&data->timer, ktime_set(value / 1000, (value % 1000) * 1000000), HRTIMER_MODE_REL); } else vibrator_stop(); return; }
static int vibrator_suspend(struct platform_device *pdev, pm_message_t state) { struct vibrator *vib = platform_get_drvdata(pdev); D("vibrator_suspend +++\n"); vibrator_stop(vib); hrtimer_cancel(&vib->vib_timer); hrtimer_cancel(&vib->vib_timer_stop); hrtimer_cancel(&vib->vib_timer_feedback); cancel_work_sync(&vib->work); cancel_work_sync(&vib->work_feedback); if(vib->pdata->pwm_gpio >= 0) { gpio_direction_output(vib->pdata->pwm_gpio, 0); tegra_gpio_enable(vib->pdata->pwm_gpio); } D("vibrator_suspend ---\n"); return 0; }
static void vib_work_func(struct work_struct *work) { struct vibrator *vib = container_of(work, struct vibrator, work); int real_time = 0; D(" %s +++\n", __func__); real_time= gettimeMs()- enable_time; if( (delay_value-real_time) >= 3){ hrtimer_start(&vib->vib_timer_feedback, ktime_set((delay_value-real_time-1) / 1000, ((delay_value-real_time-1) % 1000) * 1000000), HRTIMER_MODE_REL); D("vibator work short , real_time = %d ,add timer =%d\n",real_time,delay_value-real_time); } else { vibrator_stop(vib); D("vibator work normal =%llu\n",gettimeMs()- enable_time ); } D(" %s ---\n", __func__); }
/* * Timeout value can be changed from sysfs entry * created by timed_output_dev. * echo 100 > /sys/class/timed_output/vibrator/enable */ static void vibrator_enable(struct timed_output_dev *dev, int value) { struct vibrator *vib = container_of(dev, struct vibrator, timed_dev); D(" %s +++\n", __func__); if (value < 0) return; if (value) { delay_value = value ; D("vibration enable and duration time %d ms:%s(parent:%s): tgid=%d\n", value,current->comm, current->parent->comm, current->tgid); disable_time = gettimeMs() + value + 4; D("vibrator hrtimer1 start\n"); hrtimer_start(&vib->vib_timer, ktime_set(value / 1000, (value % 1000) * 1000000), HRTIMER_MODE_REL); vibrator_start(vib); } else { D("vibration disable.\n"); vibrator_stop(vib); } D(" %s ---\n", __func__); }
static void vibrator_work_func(unsigned long data) { vibrator_stop(); }