*
*/
-#include <linux/kernel.h>
#include <linux/slab.h>
-#include <linux/limits.h>
#include "maru_virtio_sensor.h"
struct maru_accel_data {
struct input_dev *input_data;
struct delayed_work work;
- struct mutex data_mutex;
struct virtio_sensor* vs;
LOG(1, "maru_accel_input_work_func starts");
- memset(sensor_data, 0, __MAX_BUF_SENSOR);
+ enable = atomic_read(&data->enable);
poll_time = atomic_read(&data->poll_delay);
- mutex_lock(&data->data_mutex);
- enable = atomic_read(&data->enable);
- mutex_unlock(&data->data_mutex);
+ memset(sensor_data, 0, __MAX_BUF_SENSOR);
if (enable) {
- mutex_lock(&data->data_mutex);
+ mutex_lock(&data->vs->vqlock);
ret = get_sensor_data(sensor_type_accel, sensor_data);
- mutex_unlock(&data->data_mutex);
+ mutex_unlock(&data->vs->vqlock);
if (!ret) {
sscanf(sensor_data, "%d,%d,%d", &accel_x, &accel_y, &accel_z);
LOG(1, "accel_set act %d, %d, %d", accel_x, accel_y, accel_z);
}
}
- mutex_lock(&data->data_mutex);
enable = atomic_read(&data->enable);
- mutex_unlock(&data->data_mutex);
LOG(1, "enable: %d, poll_time: %d", enable, poll_time);
if (enable) {
static ssize_t maru_enable_show(struct device *dev, struct device_attribute *attr, char *buf)
{
- return get_data_for_show(sensor_type_accel_enable, buf);
+ char sensor_data[__MAX_BUF_SENSOR];
+ int ret;
+ struct input_dev *input_data = to_input_dev(dev);
+ struct maru_accel_data *data = input_get_drvdata(input_data);
+
+ memset(sensor_data, 0, __MAX_BUF_SENSOR);
+ mutex_lock(&data->vs->vqlock);
+ ret = get_sensor_data(sensor_type_accel_enable, sensor_data);
+ mutex_unlock(&data->vs->vqlock);
+ if (ret)
+ return sprintf(buf, "%d", -1);
+
+ return sprintf(buf, "%s", sensor_data);
}
static ssize_t maru_enable_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
if (value != 0 && value != 1)
return count;
+ mutex_lock(&data->vs->vqlock);
set_sensor_data(sensor_type_accel_enable, buf);
+ mutex_unlock(&data->vs->vqlock);
if (value) {
if (atomic_read(&data->enable) != 1) {
static ssize_t maru_poll_delay_show(struct device *dev, struct device_attribute *attr, char *buf)
{
- return get_data_for_show(sensor_type_accel_delay, buf);
+ char sensor_data[__MAX_BUF_SENSOR];
+ int ret;
+ struct input_dev *input_data = to_input_dev(dev);
+ struct maru_accel_data *data = input_get_drvdata(input_data);
+
+ memset(sensor_data, 0, __MAX_BUF_SENSOR);
+ mutex_lock(&data->vs->vqlock);
+ ret = get_sensor_data(sensor_type_accel_delay, sensor_data);
+ mutex_unlock(&data->vs->vqlock);
+ if (ret)
+ return sprintf(buf, "%d", -1);
+
+ return sprintf(buf, "%s", sensor_data);
}
static ssize_t maru_poll_delay_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
struct maru_accel_data *data = input_get_drvdata(input_data);
int value = simple_strtoul(buf, NULL, 10);
+ if (value < __MIN_DELAY_SENSOR)
+ return count;
+
+ mutex_lock(&data->vs->vqlock);
set_sensor_data(sensor_type_accel_delay, buf);
+ mutex_unlock(&data->vs->vqlock);
atomic_set(&data->poll_delay, value);
return strnlen(buf, __MAX_BUF_SENSOR);
static ssize_t xyz_show(struct device *dev, struct device_attribute *attr, char *buf)
{
- return get_data_for_show(sensor_type_accel, buf);
+ char sensor_data[__MAX_BUF_SENSOR];
+ int ret;
+ struct input_dev *input_data = to_input_dev(dev);
+ struct maru_accel_data *data = input_get_drvdata(input_data);
+
+ memset(sensor_data, 0, __MAX_BUF_SENSOR);
+ mutex_lock(&data->vs->vqlock);
+ ret = get_sensor_data(sensor_type_accel, sensor_data);
+ mutex_unlock(&data->vs->vqlock);
+ if (ret)
+ return sprintf(buf, "%d", -1);
+
+ return sprintf(buf, "%s", sensor_data);
}
static ssize_t xyz_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
{
+ struct input_dev *input_data = to_input_dev(dev);
+ struct maru_accel_data *data = input_get_drvdata(input_data);
+ mutex_lock(&data->vs->vqlock);
set_sensor_data(sensor_type_accel, buf);
+ mutex_unlock(&data->vs->vqlock);
return strnlen(buf, __MAX_BUF_SENSOR);
}
memset(sensor_data, 0, sizeof(sensor_data));
sensor_data[0] = '0';
+ mutex_lock(&data->vs->vqlock);
set_sensor_data(sensor_type_accel_enable, sensor_data);
+ mutex_unlock(&data->vs->vqlock);
atomic_set(&data->enable, 0);
return ret;
vs->accel_handle = data;
data->vs = vs;
- mutex_init(&data->data_mutex);
-
INIT_DELAYED_WORK(&data->work, maru_accel_input_work_func);
// create name & vendor
struct maru_geo_data {
struct input_dev *input_data;
struct delayed_work work;
- struct mutex data_mutex;
struct virtio_sensor* vs;
LOG(1, "maru_geo_input_work_func starts");
- memset(sensor_data, 0, __MAX_BUF_SENSOR);
+ enable = atomic_read(&data->enable);
poll_time = atomic_read(&data->poll_delay);
- mutex_lock(&data->data_mutex);
- enable = atomic_read(&data->enable);
- mutex_unlock(&data->data_mutex);
+ memset(sensor_data, 0, __MAX_BUF_SENSOR);
if (enable) {
- mutex_lock(&data->data_mutex);
+ mutex_lock(&data->vs->vqlock);
ret = get_sensor_data(sensor_type_mag, sensor_data);
- mutex_unlock(&data->data_mutex);
+ mutex_unlock(&data->vs->vqlock);
if (!ret) {
sscanf(sensor_data, "%d %d %d", &geo_x, &geo_y, &geo_z);
LOG(1, "geo_set act %d, %d, %d", geo_x, geo_y, geo_z);
}
}
- mutex_lock(&data->data_mutex);
enable = atomic_read(&data->enable);
- mutex_unlock(&data->data_mutex);
LOG(1, "enable: %d, poll_time: %d", enable, poll_time);
if (enable) {
static ssize_t maru_enable_show(struct device *dev, struct device_attribute *attr, char *buf)
{
- return get_data_for_show(sensor_type_geo_enable, buf);
+ char sensor_data[__MAX_BUF_SENSOR];
+ int ret;
+ struct input_dev *input_data = to_input_dev(dev);
+ struct maru_geo_data *data = input_get_drvdata(input_data);
+
+ memset(sensor_data, 0, __MAX_BUF_SENSOR);
+ mutex_lock(&data->vs->vqlock);
+ ret = get_sensor_data(sensor_type_geo_enable, sensor_data);
+ mutex_unlock(&data->vs->vqlock);
+ if (ret)
+ return sprintf(buf, "%d", -1);
+
+ return sprintf(buf, "%s", sensor_data);
}
static ssize_t maru_enable_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
if (value != 0 && value != 1)
return count;
+ mutex_lock(&data->vs->vqlock);
set_sensor_data(sensor_type_geo_enable, buf);
+ mutex_unlock(&data->vs->vqlock);
if (value) {
if (atomic_read(&data->enable) != 1) {
atomic_set(&data->enable, 1);
schedule_delayed_work(&data->work, 0);
-
}
} else {
if (atomic_read(&data->enable) != 0) {
static ssize_t maru_poll_delay_show(struct device *dev, struct device_attribute *attr, char *buf)
{
- return get_data_for_show(sensor_type_geo_delay, buf);
+ char sensor_data[__MAX_BUF_SENSOR];
+ int ret;
+ struct input_dev *input_data = to_input_dev(dev);
+ struct maru_geo_data *data = input_get_drvdata(input_data);
+
+ memset(sensor_data, 0, __MAX_BUF_SENSOR);
+ mutex_lock(&data->vs->vqlock);
+ ret = get_sensor_data(sensor_type_geo_delay, sensor_data);
+ mutex_unlock(&data->vs->vqlock);
+ if (ret)
+ return sprintf(buf, "%d", -1);
+
+ return sprintf(buf, "%s", sensor_data);
}
static ssize_t maru_poll_delay_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
struct maru_geo_data *data = input_get_drvdata(input_data);
int value = simple_strtoul(buf, NULL, 10);
+ if (value < __MIN_DELAY_SENSOR)
+ return count;
+
+ mutex_lock(&data->vs->vqlock);
set_sensor_data(sensor_type_geo_delay, buf);
+ mutex_unlock(&data->vs->vqlock);
atomic_set(&data->poll_delay, value);
return strnlen(buf, __MAX_BUF_SENSOR);
static ssize_t raw_show(struct device *dev, struct device_attribute *attr, char *buf)
{
- return get_data_for_show(sensor_type_tilt, buf);
+ char sensor_data[__MAX_BUF_SENSOR];
+ int ret;
+ struct input_dev *input_data = to_input_dev(dev);
+ struct maru_geo_data *data = input_get_drvdata(input_data);
+
+ memset(sensor_data, 0, __MAX_BUF_SENSOR);
+ mutex_lock(&data->vs->vqlock);
+ ret = get_sensor_data(sensor_type_tilt, sensor_data);
+ mutex_unlock(&data->vs->vqlock);
+ if (ret)
+ return sprintf(buf, "%d", -1);
+
+ return sprintf(buf, "%s", sensor_data);
}
static ssize_t raw_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
{
+ struct input_dev *input_data = to_input_dev(dev);
+ struct maru_geo_data *data = input_get_drvdata(input_data);
+ mutex_lock(&data->vs->vqlock);
set_sensor_data(sensor_type_tilt, buf);
+ mutex_unlock(&data->vs->vqlock);
return strnlen(buf, __MAX_BUF_SENSOR);
}
static ssize_t tesla_show(struct device *dev, struct device_attribute *attr, char *buf)
{
- return get_data_for_show(sensor_type_mag, buf);
+ char sensor_data[__MAX_BUF_SENSOR];
+ int ret;
+ struct input_dev *input_data = to_input_dev(dev);
+ struct maru_geo_data *data = input_get_drvdata(input_data);
+
+ memset(sensor_data, 0, __MAX_BUF_SENSOR);
+ mutex_lock(&data->vs->vqlock);
+ ret = get_sensor_data(sensor_type_mag, sensor_data);
+ mutex_unlock(&data->vs->vqlock);
+ if (ret)
+ return sprintf(buf, "%d", -1);
+
+ return sprintf(buf, "%s", sensor_data);
}
static ssize_t tesla_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
{
+ struct input_dev *input_data = to_input_dev(dev);
+ struct maru_geo_data *data = input_get_drvdata(input_data);
+ mutex_lock(&data->vs->vqlock);
set_sensor_data(sensor_type_mag, buf);
+ mutex_unlock(&data->vs->vqlock);
return strnlen(buf, __MAX_BUF_SENSOR);
}
memset(sensor_data, 0, __MAX_BUF_SENSOR);
+ mutex_lock(&data->vs->vqlock);
ret = get_sensor_data(sensor_type_geo_delay, sensor_data);
+ mutex_unlock(&data->vs->vqlock);
if (ret) {
ERR("failed to get initial delay time");
return ret;
memset(sensor_data, 0, sizeof(sensor_data));
sensor_data[0] = '0';
+ mutex_lock(&data->vs->vqlock);
set_sensor_data(sensor_type_geo_enable, sensor_data);
+ mutex_unlock(&data->vs->vqlock);
atomic_set(&data->enable, 0);
return ret;
vs->geo_handle = data;
data->vs = vs;
- mutex_init(&data->data_mutex);
-
INIT_DELAYED_WORK(&data->work, maru_geo_input_work_func);
// create name & vendor
struct maru_gyro_data {
struct input_dev *input_data;
struct delayed_work work;
- struct mutex data_mutex;
struct virtio_sensor* vs;
LOG(1, "maru_gyro_input_work_func starts");
- memset(sensor_data, 0, __MAX_BUF_SENSOR);
+ enable = atomic_read(&data->enable);
poll_time = atomic_read(&data->poll_delay);
- mutex_lock(&data->data_mutex);
- enable = atomic_read(&data->enable);
- mutex_unlock(&data->data_mutex);
+ memset(sensor_data, 0, __MAX_BUF_SENSOR);
if (enable) {
- mutex_lock(&data->data_mutex);
+ mutex_lock(&data->vs->vqlock);
ret = get_sensor_data(sensor_type_gyro, sensor_data);
- mutex_unlock(&data->data_mutex);
+ mutex_unlock(&data->vs->vqlock);
if (!ret) {
sscanf(sensor_data, "%d,%d,%d", &gyro_x, &gyro_y, &gyro_z);
LOG(1, "gyro_set act %d, %d, %d", gyro_x, gyro_y, gyro_z);
}
}
- mutex_lock(&data->data_mutex);
enable = atomic_read(&data->enable);
- mutex_unlock(&data->data_mutex);
LOG(1, "enable: %d, poll_time: %d", enable, poll_time);
if (enable) {
}
LOG(1, "maru_gyro_input_work_func ends");
-
}
static ssize_t maru_name_show(struct device *dev, struct device_attribute *attr, char *buf)
static ssize_t maru_enable_show(struct device *dev, struct device_attribute *attr, char *buf)
{
- return get_data_for_show(sensor_type_gyro_enable, buf);
+ char sensor_data[__MAX_BUF_SENSOR];
+ int ret;
+ struct input_dev *input_data = to_input_dev(dev);
+ struct maru_gyro_data *data = input_get_drvdata(input_data);
+
+ memset(sensor_data, 0, __MAX_BUF_SENSOR);
+ mutex_lock(&data->vs->vqlock);
+ ret = get_sensor_data(sensor_type_gyro_enable, sensor_data);
+ mutex_unlock(&data->vs->vqlock);
+ if (ret)
+ return sprintf(buf, "%d", -1);
+
+ return sprintf(buf, "%s", sensor_data);
}
static ssize_t maru_enable_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
if (value != 0 && value != 1)
return count;
+ mutex_lock(&data->vs->vqlock);
set_sensor_data(sensor_type_gyro_enable, buf);
+ mutex_unlock(&data->vs->vqlock);
if (value) {
if (atomic_read(&data->enable) != 1) {
static ssize_t maru_poll_delay_show(struct device *dev, struct device_attribute *attr, char *buf)
{
- return get_data_for_show(sensor_type_gyro_delay, buf);
+ char sensor_data[__MAX_BUF_SENSOR];
+ int ret;
+ struct input_dev *input_data = to_input_dev(dev);
+ struct maru_gyro_data *data = input_get_drvdata(input_data);
+
+ memset(sensor_data, 0, __MAX_BUF_SENSOR);
+ mutex_lock(&data->vs->vqlock);
+ ret = get_sensor_data(sensor_type_gyro_delay, sensor_data);
+ mutex_unlock(&data->vs->vqlock);
+ if (ret)
+ return sprintf(buf, "%d", -1);
+
+ return sprintf(buf, "%s", sensor_data);
}
static ssize_t maru_poll_delay_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
struct maru_gyro_data *data = input_get_drvdata(input_data);
int value = simple_strtoul(buf, NULL, 10);
+ if (value < __MIN_DELAY_SENSOR)
+ return count;
+
+ mutex_lock(&data->vs->vqlock);
set_sensor_data(sensor_type_gyro_delay, buf);
+ mutex_unlock(&data->vs->vqlock);
atomic_set(&data->poll_delay, value);
return strnlen(buf, __MAX_BUF_SENSOR);
static ssize_t gyro_x_raw_show(struct device *dev, struct device_attribute *attr, char *buf)
{
- return get_data_for_show(sensor_type_gyro_x, buf);
+ char sensor_data[__MAX_BUF_SENSOR];
+ int ret;
+ struct input_dev *input_data = to_input_dev(dev);
+ struct maru_gyro_data *data = input_get_drvdata(input_data);
+
+ memset(sensor_data, 0, __MAX_BUF_SENSOR);
+ mutex_lock(&data->vs->vqlock);
+ ret = get_sensor_data(sensor_type_gyro_x, sensor_data);
+ mutex_unlock(&data->vs->vqlock);
+ if (ret)
+ return sprintf(buf, "%d", -1);
+
+ return sprintf(buf, "%s", sensor_data);
}
static ssize_t gyro_x_raw_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
{
+ struct input_dev *input_data = to_input_dev(dev);
+ struct maru_gyro_data *data = input_get_drvdata(input_data);
+ mutex_lock(&data->vs->vqlock);
set_sensor_data(sensor_type_gyro_x, buf);
+ mutex_unlock(&data->vs->vqlock);
return strnlen(buf, __MAX_BUF_SENSOR);
}
static ssize_t gyro_y_raw_show(struct device *dev, struct device_attribute *attr, char *buf)
{
- return get_data_for_show(sensor_type_gyro_y, buf);
+ char sensor_data[__MAX_BUF_SENSOR];
+ int ret;
+ struct input_dev *input_data = to_input_dev(dev);
+ struct maru_gyro_data *data = input_get_drvdata(input_data);
+
+ memset(sensor_data, 0, __MAX_BUF_SENSOR);
+ mutex_lock(&data->vs->vqlock);
+ ret = get_sensor_data(sensor_type_gyro_y, sensor_data);
+ mutex_unlock(&data->vs->vqlock);
+ if (ret)
+ return sprintf(buf, "%d", -1);
+
+ return sprintf(buf, "%s", sensor_data);
}
static ssize_t gyro_y_raw_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
{
+ struct input_dev *input_data = to_input_dev(dev);
+ struct maru_gyro_data *data = input_get_drvdata(input_data);
+ mutex_lock(&data->vs->vqlock);
set_sensor_data(sensor_type_gyro_y, buf);
+ mutex_unlock(&data->vs->vqlock);
return strnlen(buf, __MAX_BUF_SENSOR);
}
static ssize_t gyro_z_raw_show(struct device *dev, struct device_attribute *attr, char *buf)
{
- return get_data_for_show(sensor_type_gyro_z, buf);
+ char sensor_data[__MAX_BUF_SENSOR];
+ int ret;
+ struct input_dev *input_data = to_input_dev(dev);
+ struct maru_gyro_data *data = input_get_drvdata(input_data);
+
+ memset(sensor_data, 0, __MAX_BUF_SENSOR);
+ mutex_lock(&data->vs->vqlock);
+ ret = get_sensor_data(sensor_type_gyro_z, sensor_data);
+ mutex_unlock(&data->vs->vqlock);
+ if (ret)
+ return sprintf(buf, "%d", -1);
+
+ return sprintf(buf, "%s", sensor_data);
}
static ssize_t gyro_z_raw_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
{
+ struct input_dev *input_data = to_input_dev(dev);
+ struct maru_gyro_data *data = input_get_drvdata(input_data);
+ mutex_lock(&data->vs->vqlock);
set_sensor_data(sensor_type_gyro_z, buf);
+ mutex_unlock(&data->vs->vqlock);
return strnlen(buf, __MAX_BUF_SENSOR);
}
memset(sensor_data, 0, sizeof(sensor_data));
+ mutex_lock(&data->vs->vqlock);
ret = get_sensor_data(sensor_type_gyro_delay, sensor_data);
+ mutex_unlock(&data->vs->vqlock);
if (ret) {
ERR("failed to get initial delay time");
return ret;
memset(sensor_data, 0, sizeof(sensor_data));
sensor_data[0] = '0';
+ mutex_lock(&data->vs->vqlock);
set_sensor_data(sensor_type_gyro_enable, sensor_data);
+ mutex_unlock(&data->vs->vqlock);
atomic_set(&data->enable, 0);
return ret;
vs->gyro_handle = data;
data->vs = vs;
- mutex_init(&data->data_mutex);
-
INIT_DELAYED_WORK(&data->work, maru_gyro_input_work_func);
// create name & vendor
struct maru_hrm_data {
struct input_dev *input_data;
struct delayed_work work;
- struct mutex data_mutex;
struct virtio_sensor* vs;
memset(sensor_data, 0, __MAX_BUF_SENSOR);
poll_time = atomic_read(&data->poll_delay);
- mutex_lock(&data->data_mutex);
enable = atomic_read(&data->enable);
- mutex_unlock(&data->data_mutex);
if (enable) {
- mutex_lock(&data->data_mutex);
+ mutex_lock(&data->vs->vqlock);
ret = get_sensor_data(sensor_type_hrm, sensor_data);
- mutex_unlock(&data->data_mutex);
+ mutex_unlock(&data->vs->vqlock);
if (!ret) {
sscanf(sensor_data, "%d, %d", &hrm, &rri);
LOG(1, "hrm_set %d %d", hrm, rri);
}
}
- mutex_lock(&data->data_mutex);
enable = atomic_read(&data->enable);
- mutex_unlock(&data->data_mutex);
LOG(1, "enable: %d, poll_time: %d", enable, poll_time);
if (enable) {
static ssize_t maru_enable_show(struct device *dev, struct device_attribute *attr, char *buf)
{
- return get_data_for_show(sensor_type_hrm_enable, buf);
+ char sensor_data[__MAX_BUF_SENSOR];
+ int ret;
+ struct input_dev *input_data = to_input_dev(dev);
+ struct maru_hrm_data *data = input_get_drvdata(input_data);
+
+ memset(sensor_data, 0, __MAX_BUF_SENSOR);
+ mutex_lock(&data->vs->vqlock);
+ ret = get_sensor_data(sensor_type_hrm_enable, sensor_data);
+ mutex_unlock(&data->vs->vqlock);
+ if (ret)
+ return sprintf(buf, "%d", -1);
+
+ return sprintf(buf, "%s", sensor_data);
}
static ssize_t maru_enable_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
if (value != 0 && value != 1)
return count;
+ mutex_lock(&data->vs->vqlock);
set_sensor_data(sensor_type_hrm_enable, buf);
+ mutex_unlock(&data->vs->vqlock);
if (value) {
if (atomic_read(&data->enable) != 1) {
static ssize_t maru_poll_delay_show(struct device *dev, struct device_attribute *attr, char *buf)
{
- return get_data_for_show(sensor_type_hrm_delay, buf);
+ char sensor_data[__MAX_BUF_SENSOR];
+ int ret;
+ struct input_dev *input_data = to_input_dev(dev);
+ struct maru_hrm_data *data = input_get_drvdata(input_data);
+
+ memset(sensor_data, 0, __MAX_BUF_SENSOR);
+ mutex_lock(&data->vs->vqlock);
+ ret = get_sensor_data(sensor_type_hrm_delay, sensor_data);
+ mutex_unlock(&data->vs->vqlock);
+ if (ret)
+ return sprintf(buf, "%d", -1);
+
+ return sprintf(buf, "%s", sensor_data);
}
static ssize_t maru_poll_delay_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
struct maru_hrm_data *data = input_get_drvdata(input_data);
int value = simple_strtoul(buf, NULL, 10);
+ if (value < __MIN_DELAY_SENSOR)
+ return count;
+
+ mutex_lock(&data->vs->vqlock);
set_sensor_data(sensor_type_hrm_delay, buf);
+ mutex_unlock(&data->vs->vqlock);
atomic_set(&data->poll_delay, value);
return strnlen(buf, __MAX_BUF_SENSOR);
memset(sensor_data, 0, __MAX_BUF_SENSOR);
+ mutex_lock(&data->vs->vqlock);
ret = get_sensor_data(sensor_type_hrm_delay, sensor_data);
+ mutex_unlock(&data->vs->vqlock);
if (ret) {
ERR("failed to get initial delay time");
return ret;
delay = sensor_atoi(sensor_data);
+ mutex_lock(&data->vs->vqlock);
ret = get_sensor_data(sensor_type_hrm_enable, sensor_data);
+ mutex_unlock(&data->vs->vqlock);
if (ret) {
ERR("failed to get initial enable");
return ret;
vs->hrm_handle = data;
data->vs = vs;
- mutex_init(&data->data_mutex);
-
INIT_DELAYED_WORK(&data->work, maru_hrm_input_work_func);
// create name & vendor
struct maru_light_data {
struct input_dev *input_data;
struct delayed_work work;
- struct mutex data_mutex;
struct virtio_sensor* vs;
memset(sensor_data, 0, __MAX_BUF_SENSOR);
poll_time = atomic_read(&data->poll_delay);
- mutex_lock(&data->data_mutex);
enable = atomic_read(&data->enable);
- mutex_unlock(&data->data_mutex);
if (enable) {
- mutex_lock(&data->data_mutex);
+ mutex_lock(&data->vs->vqlock);
ret = get_sensor_data(sensor_type_light, sensor_data);
- mutex_unlock(&data->data_mutex);
+ mutex_unlock(&data->vs->vqlock);
if (!ret) {
sscanf(sensor_data, "%d", &light);
LOG(1, "light_set %d", light);
}
}
- mutex_lock(&data->data_mutex);
enable = atomic_read(&data->enable);
- mutex_unlock(&data->data_mutex);
LOG(1, "enable: %d, poll_time: %d", enable, poll_time);
if (enable) {
static ssize_t maru_enable_show(struct device *dev, struct device_attribute *attr, char *buf)
{
- return get_data_for_show(sensor_type_light_enable, buf);
+ char sensor_data[__MAX_BUF_SENSOR];
+ int ret;
+ struct input_dev *input_data = to_input_dev(dev);
+ struct maru_light_data *data = input_get_drvdata(input_data);
+
+ memset(sensor_data, 0, __MAX_BUF_SENSOR);
+ mutex_lock(&data->vs->vqlock);
+ ret = get_sensor_data(sensor_type_light_enable, sensor_data);
+ mutex_unlock(&data->vs->vqlock);
+ if (ret)
+ return sprintf(buf, "%d", -1);
+
+ return sprintf(buf, "%s", sensor_data);
}
static ssize_t maru_enable_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
if (value != 0 && value != 1)
return count;
+ mutex_lock(&data->vs->vqlock);
set_sensor_data(sensor_type_light_enable, buf);
+ mutex_unlock(&data->vs->vqlock);
if (value) {
if (atomic_read(&data->enable) != 1) {
static ssize_t maru_poll_delay_show(struct device *dev, struct device_attribute *attr, char *buf)
{
- return get_data_for_show(sensor_type_light_delay, buf);
+ char sensor_data[__MAX_BUF_SENSOR];
+ int ret;
+ struct input_dev *input_data = to_input_dev(dev);
+ struct maru_light_data *data = input_get_drvdata(input_data);
+
+ memset(sensor_data, 0, __MAX_BUF_SENSOR);
+ mutex_lock(&data->vs->vqlock);
+ ret = get_sensor_data(sensor_type_light_delay, sensor_data);
+ mutex_unlock(&data->vs->vqlock);
+ if (ret)
+ return sprintf(buf, "%d", -1);
+
+ return sprintf(buf, "%s", sensor_data);
}
static ssize_t maru_poll_delay_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
struct maru_light_data *data = input_get_drvdata(input_data);
int value = simple_strtoul(buf, NULL, 10);
+ if (value < __MIN_DELAY_SENSOR)
+ return count;
+
+ mutex_lock(&data->vs->vqlock);
set_sensor_data(sensor_type_light_delay, buf);
+ mutex_unlock(&data->vs->vqlock);
atomic_set(&data->poll_delay, value);
return strnlen(buf, __MAX_BUF_SENSOR);
static ssize_t adc_show(struct device *dev, struct device_attribute *attr, char *buf)
{
- return get_data_for_show(sensor_type_light_adc, buf);
+ char sensor_data[__MAX_BUF_SENSOR];
+ int ret;
+ struct input_dev *input_data = to_input_dev(dev);
+ struct maru_light_data *data = input_get_drvdata(input_data);
+
+ memset(sensor_data, 0, __MAX_BUF_SENSOR);
+ mutex_lock(&data->vs->vqlock);
+ ret = get_sensor_data(sensor_type_light_adc, sensor_data);
+ mutex_unlock(&data->vs->vqlock);
+ if (ret)
+ return sprintf(buf, "%d", -1);
+
+ return sprintf(buf, "%s", sensor_data);
}
static ssize_t adc_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
{
+ struct input_dev *input_data = to_input_dev(dev);
+ struct maru_light_data *data = input_get_drvdata(input_data);
+ mutex_lock(&data->vs->vqlock);
set_sensor_data(sensor_type_light_adc, buf);
+ mutex_unlock(&data->vs->vqlock);
return strnlen(buf, __MAX_BUF_SENSOR);
}
static ssize_t level_show(struct device *dev, struct device_attribute *attr, char *buf)
{
- return get_data_for_show(sensor_type_light_level, buf);
+ char sensor_data[__MAX_BUF_SENSOR];
+ int ret;
+ struct input_dev *input_data = to_input_dev(dev);
+ struct maru_light_data *data = input_get_drvdata(input_data);
+
+ memset(sensor_data, 0, __MAX_BUF_SENSOR);
+ mutex_lock(&data->vs->vqlock);
+ ret = get_sensor_data(sensor_type_light_level, sensor_data);
+ mutex_unlock(&data->vs->vqlock);
+ if (ret)
+ return sprintf(buf, "%d", -1);
+
+ return sprintf(buf, "%s", sensor_data);
}
static ssize_t level_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
{
+ struct input_dev *input_data = to_input_dev(dev);
+ struct maru_light_data *data = input_get_drvdata(input_data);
+ mutex_lock(&data->vs->vqlock);
set_sensor_data(sensor_type_light_level, buf);
+ mutex_unlock(&data->vs->vqlock);
return strnlen(buf, __MAX_BUF_SENSOR);
}
memset(sensor_data, 0, __MAX_BUF_SENSOR);
+ mutex_lock(&data->vs->vqlock);
ret = get_sensor_data(sensor_type_light_delay, sensor_data);
+ mutex_unlock(&data->vs->vqlock);
if (ret) {
ERR("failed to get initial delay time");
return ret;
delay = sensor_atoi(sensor_data);
+ mutex_lock(&data->vs->vqlock);
ret = get_sensor_data(sensor_type_light_enable, sensor_data);
+ mutex_unlock(&data->vs->vqlock);
if (ret) {
ERR("failed to get initial enable");
return ret;
vs->light_handle = data;
data->vs = vs;
- mutex_init(&data->data_mutex);
-
INIT_DELAYED_WORK(&data->work, maru_light_input_work_func);
// create name & vendor
struct maru_pressure_data {
struct input_dev *input_data;
struct delayed_work work;
- struct mutex data_mutex;
struct virtio_sensor* vs;
memset(sensor_data, 0, sizeof(sensor_data));
poll_time = atomic_read(&data->poll_delay);
- mutex_lock(&data->data_mutex);
enable = atomic_read(&data->enable);
- mutex_unlock(&data->data_mutex);
if (enable) {
- mutex_lock(&data->data_mutex);
+ mutex_lock(&data->vs->vqlock);
ret = get_sensor_data(sensor_type_pressure, sensor_data);
- mutex_unlock(&data->data_mutex);
+ mutex_unlock(&data->vs->vqlock);
if (!ret) {
sscanf(sensor_data, "%d, %d", &pressure, &temperature);
LOG(1, "pressure_set %d, %d", pressure, temperature);
}
}
- mutex_lock(&data->data_mutex);
enable = atomic_read(&data->enable);
- mutex_unlock(&data->data_mutex);
LOG(1, "enable: %d, poll_time: %d", enable, poll_time);
if (enable) {
static ssize_t maru_enable_show(struct device *dev, struct device_attribute *attr, char *buf)
{
- return get_data_for_show(sensor_type_pressure_enable, buf);
+ char sensor_data[__MAX_BUF_SENSOR];
+ int ret;
+ struct input_dev *input_data = to_input_dev(dev);
+ struct maru_pressure_data *data = input_get_drvdata(input_data);
+
+ memset(sensor_data, 0, __MAX_BUF_SENSOR);
+ mutex_lock(&data->vs->vqlock);
+ ret = get_sensor_data(sensor_type_pressure_enable, sensor_data);
+ mutex_unlock(&data->vs->vqlock);
+ if (ret)
+ return sprintf(buf, "%d", -1);
+
+ return sprintf(buf, "%s", sensor_data);
}
static ssize_t maru_enable_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
if (value != 0 && value != 1)
return count;
+ mutex_lock(&data->vs->vqlock);
set_sensor_data(sensor_type_pressure_enable, buf);
+ mutex_unlock(&data->vs->vqlock);
if (value) {
if (atomic_read(&data->enable) != 1) {
static ssize_t maru_poll_delay_show(struct device *dev, struct device_attribute *attr, char *buf)
{
- return get_data_for_show(sensor_type_pressure_delay, buf);
+ char sensor_data[__MAX_BUF_SENSOR];
+ int ret;
+ struct input_dev *input_data = to_input_dev(dev);
+ struct maru_pressure_data *data = input_get_drvdata(input_data);
+
+ memset(sensor_data, 0, __MAX_BUF_SENSOR);
+ mutex_lock(&data->vs->vqlock);
+ ret = get_sensor_data(sensor_type_pressure_delay, sensor_data);
+ mutex_unlock(&data->vs->vqlock);
+ if (ret)
+ return sprintf(buf, "%d", -1);
+
+ return sprintf(buf, "%s", sensor_data);
}
static ssize_t maru_poll_delay_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
struct maru_pressure_data *data = input_get_drvdata(input_data);
int value = simple_strtoul(buf, NULL, 10);
+ if (value < __MIN_DELAY_SENSOR)
+ return count;
+
+ mutex_lock(&data->vs->vqlock);
set_sensor_data(sensor_type_pressure_delay, buf);
+ mutex_unlock(&data->vs->vqlock);
atomic_set(&data->poll_delay, value);
return strnlen(buf, __MAX_BUF_SENSOR);
memset(sensor_data, 0, sizeof(sensor_data));
+ mutex_lock(&data->vs->vqlock);
ret = get_sensor_data(sensor_type_pressure_delay, sensor_data);
+ mutex_unlock(&data->vs->vqlock);
if (ret) {
ERR("failed to get initial delay time");
return ret;
delay = sensor_atoi(sensor_data);
+ mutex_lock(&data->vs->vqlock);
ret = get_sensor_data(sensor_type_pressure_enable, sensor_data);
+ mutex_unlock(&data->vs->vqlock);
if (ret) {
ERR("failed to get initial enable");
return ret;
vs->pressure_handle = data;
data->vs = vs;
- mutex_init(&data->data_mutex);
-
INIT_DELAYED_WORK(&data->work, maru_pressure_input_work_func);
// create name & vendor
struct maru_proxi_data {
struct input_dev *input_data;
struct delayed_work work;
- struct mutex data_mutex;
struct virtio_sensor* vs;
memset(sensor_data, 0, __MAX_BUF_SENSOR);
poll_time = atomic_read(&data->poll_delay);
- mutex_lock(&data->data_mutex);
enable = atomic_read(&data->enable);
- mutex_unlock(&data->data_mutex);
if (enable) {
- mutex_lock(&data->data_mutex);
+ mutex_lock(&data->vs->vqlock);
ret = get_sensor_data(sensor_type_proxi, sensor_data);
- mutex_unlock(&data->data_mutex);
+ mutex_unlock(&data->vs->vqlock);
if (!ret) {
sscanf(sensor_data, "%d", &proxi);
if (!proxi)
}
}
- mutex_lock(&data->data_mutex);
enable = atomic_read(&data->enable);
- mutex_unlock(&data->data_mutex);
LOG(1, "enable: %d, poll_time: %d", enable, poll_time);
if (enable) {
static ssize_t maru_enable_show(struct device *dev, struct device_attribute *attr, char *buf)
{
- return get_data_for_show(sensor_type_proxi_enable, buf);
+ char sensor_data[__MAX_BUF_SENSOR];
+ int ret;
+ struct input_dev *input_data = to_input_dev(dev);
+ struct maru_proxi_data *data = input_get_drvdata(input_data);
+
+ memset(sensor_data, 0, __MAX_BUF_SENSOR);
+ mutex_lock(&data->vs->vqlock);
+ ret = get_sensor_data(sensor_type_proxi_enable, sensor_data);
+ mutex_unlock(&data->vs->vqlock);
+ if (ret)
+ return sprintf(buf, "%d", -1);
+
+ return sprintf(buf, "%s", sensor_data);
}
static ssize_t maru_enable_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
if (value != 0 && value != 1)
return count;
+ mutex_lock(&data->vs->vqlock);
set_sensor_data(sensor_type_proxi_enable, buf);
+ mutex_unlock(&data->vs->vqlock);
if (value) {
if (atomic_read(&data->enable) != 1) {
static ssize_t maru_poll_delay_show(struct device *dev, struct device_attribute *attr, char *buf)
{
- return get_data_for_show(sensor_type_proxi_delay, buf);
+ char sensor_data[__MAX_BUF_SENSOR];
+ int ret;
+ struct input_dev *input_data = to_input_dev(dev);
+ struct maru_proxi_data *data = input_get_drvdata(input_data);
+
+ memset(sensor_data, 0, __MAX_BUF_SENSOR);
+ mutex_lock(&data->vs->vqlock);
+ ret = get_sensor_data(sensor_type_proxi_delay, sensor_data);
+ mutex_unlock(&data->vs->vqlock);
+ if (ret)
+ return sprintf(buf, "%d", -1);
+
+ return sprintf(buf, "%s", sensor_data);
}
static ssize_t maru_poll_delay_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
struct maru_proxi_data *data = input_get_drvdata(input_data);
int value = simple_strtoul(buf, NULL, 10);
+ if (value < __MIN_DELAY_SENSOR)
+ return count;
+
+ mutex_lock(&data->vs->vqlock);
set_sensor_data(sensor_type_proxi_delay, buf);
+ mutex_unlock(&data->vs->vqlock);
atomic_set(&data->poll_delay, value);
return strnlen(buf, __MAX_BUF_SENSOR);
static ssize_t enable_show(struct device *dev, struct device_attribute *attr, char *buf)
{
- return get_data_for_show(sensor_type_proxi_enable, buf);
+ char sensor_data[__MAX_BUF_SENSOR];
+ int ret;
+ struct input_dev *input_data = to_input_dev(dev);
+ struct maru_proxi_data *data = input_get_drvdata(input_data);
+
+ memset(sensor_data, 0, __MAX_BUF_SENSOR);
+ mutex_lock(&data->vs->vqlock);
+ ret = get_sensor_data(sensor_type_proxi_enable, sensor_data);
+ mutex_unlock(&data->vs->vqlock);
+ if (ret)
+ return sprintf(buf, "%d", -1);
+
+ return sprintf(buf, "%s", sensor_data);
}
static ssize_t enable_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
{
+ struct input_dev *input_data = to_input_dev(dev);
+ struct maru_proxi_data *data = input_get_drvdata(input_data);
+ mutex_lock(&data->vs->vqlock);
set_sensor_data(sensor_type_proxi_enable, buf);
+ mutex_unlock(&data->vs->vqlock);
return strnlen(buf, __MAX_BUF_SENSOR);
}
static ssize_t vo_show(struct device *dev, struct device_attribute *attr, char *buf)
{
- return get_data_for_show(sensor_type_proxi, buf);
+ char sensor_data[__MAX_BUF_SENSOR];
+ int ret;
+ struct input_dev *input_data = to_input_dev(dev);
+ struct maru_proxi_data *data = input_get_drvdata(input_data);
+
+ memset(sensor_data, 0, __MAX_BUF_SENSOR);
+ mutex_lock(&data->vs->vqlock);
+ ret = get_sensor_data(sensor_type_proxi, sensor_data);
+ mutex_unlock(&data->vs->vqlock);
+ if (ret)
+ return sprintf(buf, "%d", -1);
+
+ return sprintf(buf, "%s", sensor_data);
}
static ssize_t vo_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
{
+ struct input_dev *input_data = to_input_dev(dev);
+ struct maru_proxi_data *data = input_get_drvdata(input_data);
+ mutex_lock(&data->vs->vqlock);
set_sensor_data(sensor_type_proxi, buf);
+ mutex_unlock(&data->vs->vqlock);
return strnlen(buf, __MAX_BUF_SENSOR);
}
memset(sensor_data, 0, __MAX_BUF_SENSOR);
+ mutex_lock(&data->vs->vqlock);
ret = get_sensor_data(sensor_type_proxi_delay, sensor_data);
+ mutex_unlock(&data->vs->vqlock);
if (ret) {
ERR("failed to get initial delay time");
return ret;
delay = sensor_atoi(sensor_data);
+ mutex_lock(&data->vs->vqlock);
ret = get_sensor_data(sensor_type_proxi_enable, sensor_data);
+ mutex_unlock(&data->vs->vqlock);
if (ret) {
ERR("failed to get initial enable");
return ret;
vs->proxi_handle = data;
data->vs = vs;
- mutex_init(&data->data_mutex);
-
INIT_DELAYED_WORK(&data->work, maru_proxi_input_work_func);
// create name & vendor
struct maru_rotation_vector_data {
struct input_dev *input_data;
struct delayed_work work;
- struct mutex data_mutex;
struct virtio_sensor* vs;
memset(sensor_data, 0, __MAX_BUF_SENSOR);
poll_time = atomic_read(&data->poll_delay);
- mutex_lock(&data->data_mutex);
enable = atomic_read(&data->enable);
- mutex_unlock(&data->data_mutex);
if (enable) {
- mutex_lock(&data->data_mutex);
+ mutex_lock(&data->vs->vqlock);
ret = get_sensor_data(sensor_type_rotation_vector, sensor_data);
- mutex_unlock(&data->data_mutex);
+ mutex_unlock(&data->vs->vqlock);
if (!ret) {
sscanf(sensor_data, "%d,%d,%d,%d,%d", &quad_a, &quad_b, &quad_c, &quad_d, &accuracy);
LOG(1, "rotation_vector_set %d,%d,%d,%d,%d", quad_a, quad_b, quad_c, quad_d, accuracy);
}
}
- mutex_lock(&data->data_mutex);
enable = atomic_read(&data->enable);
- mutex_unlock(&data->data_mutex);
LOG(1, "enable: %d, poll_time: %d", enable, poll_time);
if (enable) {
static ssize_t maru_enable_show(struct device *dev, struct device_attribute *attr, char *buf)
{
- return get_data_for_show(sensor_type_rotation_vector_enable, buf);
+ char sensor_data[__MAX_BUF_SENSOR];
+ int ret;
+ struct input_dev *input_data = to_input_dev(dev);
+ struct maru_rotation_vector_data *data = input_get_drvdata(input_data);
+
+ memset(sensor_data, 0, __MAX_BUF_SENSOR);
+ mutex_lock(&data->vs->vqlock);
+ ret = get_sensor_data(sensor_type_rotation_vector_enable, sensor_data);
+ mutex_unlock(&data->vs->vqlock);
+ if (ret)
+ return sprintf(buf, "%d", -1);
+
+ return sprintf(buf, "%s", sensor_data);
}
static ssize_t maru_enable_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
if (value != 0 && value != 1)
return count;
+ mutex_lock(&data->vs->vqlock);
set_sensor_data(sensor_type_rotation_vector_enable, buf);
+ mutex_unlock(&data->vs->vqlock);
if (value) {
if (atomic_read(&data->enable) != 1) {
static ssize_t maru_poll_delay_show(struct device *dev, struct device_attribute *attr, char *buf)
{
- return get_data_for_show(sensor_type_rotation_vector_delay, buf);
+ char sensor_data[__MAX_BUF_SENSOR];
+ int ret;
+ struct input_dev *input_data = to_input_dev(dev);
+ struct maru_rotation_vector_data *data = input_get_drvdata(input_data);
+
+ memset(sensor_data, 0, __MAX_BUF_SENSOR);
+ mutex_lock(&data->vs->vqlock);
+ ret = get_sensor_data(sensor_type_rotation_vector_delay, sensor_data);
+ mutex_unlock(&data->vs->vqlock);
+ if (ret)
+ return sprintf(buf, "%d", -1);
+
+ return sprintf(buf, "%s", sensor_data);
}
static ssize_t maru_poll_delay_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
struct maru_rotation_vector_data *data = input_get_drvdata(input_data);
int value = simple_strtoul(buf, NULL, 10);
+ if (value < __MIN_DELAY_SENSOR)
+ return count;
+
+ mutex_lock(&data->vs->vqlock);
set_sensor_data(sensor_type_rotation_vector_delay, buf);
+ mutex_unlock(&data->vs->vqlock);
atomic_set(&data->poll_delay, value);
return strnlen(buf, __MAX_BUF_SENSOR);
memset(sensor_data, 0, __MAX_BUF_SENSOR);
+ mutex_lock(&data->vs->vqlock);
ret = get_sensor_data(sensor_type_rotation_vector_delay, sensor_data);
+ mutex_unlock(&data->vs->vqlock);
if (ret) {
ERR("failed to get initial delay time");
return ret;
memset(sensor_data, 0, sizeof(sensor_data));
sensor_data[0] = '0';
+ mutex_lock(&data->vs->vqlock);
set_sensor_data(sensor_type_rotation_vector_enable, sensor_data);
+ mutex_unlock(&data->vs->vqlock);
atomic_set(&data->enable, 0);
return ret;
vs->rotation_vector_handle = data;
data->vs = vs;
- mutex_init(&data->data_mutex);
-
INIT_DELAYED_WORK(&data->work, maru_rotation_vector_input_work_func);
// create name & vendor
struct maru_uv_data {
struct input_dev *input_data;
struct delayed_work work;
- struct mutex data_mutex;
struct virtio_sensor* vs;
memset(sensor_data, 0, __MAX_BUF_SENSOR);
poll_time = atomic_read(&data->poll_delay);
- mutex_lock(&data->data_mutex);
enable = atomic_read(&data->enable);
- mutex_unlock(&data->data_mutex);
if (enable) {
- mutex_lock(&data->data_mutex);
+ mutex_lock(&data->vs->vqlock);
ret = get_sensor_data(sensor_type_uv, sensor_data);
- mutex_unlock(&data->data_mutex);
+ mutex_unlock(&data->vs->vqlock);
if (!ret) {
sscanf(sensor_data, "%d", &uv);
LOG(1, "uv_set %d", uv);
}
}
- mutex_lock(&data->data_mutex);
enable = atomic_read(&data->enable);
- mutex_unlock(&data->data_mutex);
LOG(1, "enable: %d, poll_time: %d", enable, poll_time);
if (enable) {
static ssize_t maru_enable_show(struct device *dev, struct device_attribute *attr, char *buf)
{
- return get_data_for_show(sensor_type_uv_enable, buf);
+ char sensor_data[__MAX_BUF_SENSOR];
+ int ret;
+ struct input_dev *input_data = to_input_dev(dev);
+ struct maru_uv_data *data = input_get_drvdata(input_data);
+
+ memset(sensor_data, 0, __MAX_BUF_SENSOR);
+ mutex_lock(&data->vs->vqlock);
+ ret = get_sensor_data(sensor_type_uv_enable, sensor_data);
+ mutex_unlock(&data->vs->vqlock);
+ if (ret)
+ return sprintf(buf, "%d", -1);
+
+ return sprintf(buf, "%s", sensor_data);
}
static ssize_t maru_enable_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
if (value != 0 && value != 1)
return count;
+ mutex_lock(&data->vs->vqlock);
set_sensor_data(sensor_type_uv_enable, buf);
+ mutex_unlock(&data->vs->vqlock);
if (value) {
if (atomic_read(&data->enable) != 1) {
static ssize_t maru_poll_delay_show(struct device *dev, struct device_attribute *attr, char *buf)
{
- return get_data_for_show(sensor_type_uv_delay, buf);
+ char sensor_data[__MAX_BUF_SENSOR];
+ int ret;
+ struct input_dev *input_data = to_input_dev(dev);
+ struct maru_uv_data *data = input_get_drvdata(input_data);
+
+ memset(sensor_data, 0, __MAX_BUF_SENSOR);
+ mutex_lock(&data->vs->vqlock);
+ ret = get_sensor_data(sensor_type_uv_delay, sensor_data);
+ mutex_unlock(&data->vs->vqlock);
+ if (ret)
+ return sprintf(buf, "%d", -1);
+
+ return sprintf(buf, "%s", sensor_data);
}
static ssize_t maru_poll_delay_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
struct maru_uv_data *data = input_get_drvdata(input_data);
int value = simple_strtoul(buf, NULL, 10);
+ if (value < __MIN_DELAY_SENSOR)
+ return count;
+
+ mutex_lock(&data->vs->vqlock);
set_sensor_data(sensor_type_uv_delay, buf);
+ mutex_unlock(&data->vs->vqlock);
atomic_set(&data->poll_delay, value);
return strnlen(buf, __MAX_BUF_SENSOR);
memset(sensor_data, 0, __MAX_BUF_SENSOR);
+ mutex_lock(&data->vs->vqlock);
ret = get_sensor_data(sensor_type_uv_delay, sensor_data);
+ mutex_unlock(&data->vs->vqlock);
if (ret) {
ERR("failed to get initial delay time");
return ret;
delay = sensor_atoi(sensor_data);
+ mutex_lock(&data->vs->vqlock);
ret = get_sensor_data(sensor_type_uv_enable, sensor_data);
+ mutex_unlock(&data->vs->vqlock);
if (ret) {
ERR("failed to get initial enable");
return ret;
vs->uv_handle = data;
data->vs = vs;
- mutex_init(&data->data_mutex);
-
INIT_DELAYED_WORK(&data->work, maru_uv_input_work_func);
// create name & vendor
return;
}
- LOG(1, "msg buf: %s, req: %d, type: %d", msg->buf, msg->req, msg->type);
-
mutex_lock(&vs->lock);
+ LOG(1, "msg buf: %s, req: %d, type: %d, vs->flags: %d", msg->buf, msg->req, msg->type, vs->flags);
+
memset(sensor_data, 0, __MAX_BUF_SENSOR);
strcpy(sensor_data, msg->buf);
vs->flags = 1;
vs->msginfo.req = request_set;
vs->msginfo.type = type;
strcpy(vs->msginfo.buf, buf);
- mutex_unlock(&vs->lock);
LOG(1, "set_sensor_data type: %d, req: %d, buf: %s",
vs->msginfo.type, vs->msginfo.req, vs->msginfo.buf);
- err = virtqueue_add_outbuf(vs->vq, vs->sg_vq, 1, &vs->msginfo, GFP_ATOMIC);
+ mutex_unlock(&vs->lock);
+
+ err = virtqueue_add_outbuf(vs->vq, vs->sg_vq, 1, &vs->msginfo, GFP_NOWAIT);//GFP_ATOMIC);
if (err < 0) {
ERR("failed to add buffer to virtqueue (err = %d)", err);
return;
vs->msginfo.req = request_get;
vs->msginfo.type = type;
- mutex_unlock(&vs->lock);
- LOG(1, "get_sensor_data type: %d, req: %d",
+ LOG(1, "get_sensor_data start type: %d, req: %d",
vs->msginfo.type, vs->msginfo.req);
sgs[0] = &vs->sg_vq[0];
sgs[1] = &vs->sg_vq[1];
- err = virtqueue_add_sgs(vs->vq, sgs, 1, 1, &vs->msginfo, GFP_ATOMIC);
+ mutex_unlock(&vs->lock);
+
+ err = virtqueue_add_sgs(vs->vq, sgs, 1, 1, &vs->msginfo, GFP_NOWAIT);//GFP_ATOMIC);
if (err < 0) {
ERR("failed to add buffer to virtqueue (err = %d)", err);
return err;
memcpy(data, sensor_data, strlen(sensor_data));
mutex_unlock(&vs->lock);
+ LOG(1, "get_sensor_data end type: %d, data: %p", type, data);
return 0;
}
-int get_data_for_show(int type, char* buf)
-{
- char sensor_data[__MAX_BUF_SENSOR];
- int ret;
-
- memset(sensor_data, 0, __MAX_BUF_SENSOR);
- ret = get_sensor_data(type, sensor_data);
- if (ret)
- return sprintf(buf, "%d", -1);
-
- return sprintf(buf, "%s", sensor_data);
-}
-
static void device_init(struct virtio_sensor *vs)
{
int ret = 0;
}
mutex_init(&vs->lock);
+ mutex_init(&vs->vqlock);
memset(sensor_data, 0, __MAX_BUF_SENSOR);
+ mutex_lock(&vs->vqlock);
ret = get_sensor_data(sensor_type_list, sensor_data);
+ mutex_unlock(&vs->vqlock);
if (ret) {
ERR("sensor capability data is null.");
cleanup(dev);
#include <linux/kernel.h>
#include <linux/virtio.h>
#include <linux/input.h>
+#include <linux/limits.h>
#define SUPPORT_LEGACY_SENSOR 1
};
#define __MAX_BUF_SIZE 1024
-#define __MAX_BUF_SENSOR 128
+#define __MAX_BUF_SENSOR 32
+
+#define __MIN_DELAY_SENSOR 1000000
+#define __MAX_DELAY_SENSOR INT_MAX
struct msg_info {
char buf[__MAX_BUF_SIZE];
int flags;
struct mutex lock;
+ struct mutex vqlock;
struct class* sensor_class;
int sensor_atoi(const char *value);
-int get_data_for_show(int type, char* buf);
int register_sensor_device(struct device *dev, struct virtio_sensor *vs,
struct device_attribute *attributes[], const char* name);