From: Jinhyung Choi Date: Thu, 20 Mar 2014 02:24:03 +0000 (+0900) Subject: Sensor & jack driver: selectively enabled sensors & jacks X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f63a3c8752f96f7c36ff0cd4e77d03143b4f983f;p=sdk%2Femulator%2Femulator-kernel.git Sensor & jack driver: selectively enabled sensors & jacks Change-Id: I0dd251732d550d5e4e6d72195f6bb906df846445 Signed-off-by: Jinhyung Choi --- diff --git a/drivers/maru/maru_jack.c b/drivers/maru/maru_jack.c index 6ae299177ae1..06697fb3fa20 100644 --- a/drivers/maru/maru_jack.c +++ b/drivers/maru/maru_jack.c @@ -65,7 +65,8 @@ struct virtio_jack { }; enum jack_types { - jack_type_charger = 0, + jack_type_list = 0, + jack_type_charger, jack_type_earjack, jack_type_earkey, jack_type_hdmi, @@ -73,6 +74,14 @@ enum jack_types { jack_type_max }; +enum jack_capabilities { + jack_cap_charger = 0x01, + jack_cap_earjack = 0x02, + jack_cap_earkey = 0x04, + jack_cap_hdmi = 0x08, + jack_cap_usb = 0x10 +}; + enum request_cmd { request_get = 0, request_set, @@ -87,6 +96,7 @@ struct jack_data { struct virtio_jack *v_jack; static char jack_data [PAGE_SIZE]; +static int jack_capability = 0; static DECLARE_WAIT_QUEUE_HEAD(wq); @@ -104,6 +114,21 @@ static struct virtio_device_id id_table[] = { { VIRTIO_ID_JACK, #define DLOG(level, fmt, ...) #endif +static int jack_atoi(const char *name) +{ + int val = 0; + + for (;; name++) { + switch (*name) { + case '0' ... '9': + val = 10*val+(*name-'0'); + break; + default: + return val; + } + } +} + static void jack_vq_done(struct virtqueue *vq) { unsigned int len; struct msg_info* msg; @@ -285,34 +310,44 @@ static int maru_jack_sysfs_create_file(struct device *dev) DLOG(KERN_INFO, "sysfs_create_file\n"); - result = device_create_file(dev, &dev_attr_charger_online); - if (result){ - DLOG(KERN_ERR, "failed to create charger_online file\n"); - return result; + if (jack_capability & jack_cap_charger) { + result = device_create_file(dev, &dev_attr_charger_online); + if (result){ + DLOG(KERN_ERR, "failed to create charger_online file\n"); + return result; + } } - result = device_create_file(dev, &dev_attr_earjack_online); - if (result){ - DLOG(KERN_ERR, "failed to create earjack_online file\n"); - return result; + if (jack_capability & jack_cap_earjack) { + result = device_create_file(dev, &dev_attr_earjack_online); + if (result){ + DLOG(KERN_ERR, "failed to create earjack_online file\n"); + return result; + } } - result = device_create_file(dev, &dev_attr_earkey_online); - if (result){ - DLOG(KERN_ERR, "failed to create earkey_online file\n"); - return result; + if (jack_capability & jack_cap_earkey) { + result = device_create_file(dev, &dev_attr_earkey_online); + if (result){ + DLOG(KERN_ERR, "failed to create earkey_online file\n"); + return result; + } } - result = device_create_file(dev, &dev_attr_hdmi_online); - if (result){ - DLOG(KERN_ERR, "failed to create hdmi_online file\n"); - return result; + if (jack_capability & jack_cap_hdmi) { + result = device_create_file(dev, &dev_attr_hdmi_online); + if (result){ + DLOG(KERN_ERR, "failed to create hdmi_online file\n"); + return result; + } } - result = device_create_file(dev, &dev_attr_usb_online); - if (result){ - DLOG(KERN_ERR, "failed to create usb_online file\n"); - return result; + if (jack_capability & jack_cap_usb) { + result = device_create_file(dev, &dev_attr_usb_online); + if (result){ + DLOG(KERN_ERR, "failed to create usb_online file\n"); + return result; + } } return 0; @@ -370,14 +405,6 @@ static int jack_probe(struct virtio_device* dev){ dev_set_drvdata(&the_pdev.dev, (void*)data); - err = maru_jack_sysfs_create_file(&the_pdev.dev); - if (err) { - DLOG(KERN_ERR, "sysfs_create_file failure\n"); - kfree(data); - platform_device_unregister(&the_pdev); - return err; - } - v_jack->vq = virtio_find_single_vq(dev, jack_vq_done, "jack"); if (IS_ERR(v_jack->vq)) { DLOG(KERN_ERR, "virtio queue is not found.\n"); @@ -397,6 +424,18 @@ static int jack_probe(struct virtio_device* dev){ mutex_init(&v_jack->lock); + get_jack_data(jack_type_list); + jack_capability = jack_atoi(jack_data); + DLOG(KERN_INFO, "jack capability is %02x", jack_capability); + + err = maru_jack_sysfs_create_file(&the_pdev.dev); + if (err) { + DLOG(KERN_ERR, "sysfs_create_file failure\n"); + kfree(data); + platform_device_unregister(&the_pdev); + return err; + } + return 0; } diff --git a/drivers/maru/maru_virtio_sensor.c b/drivers/maru/maru_virtio_sensor.c index db670082e120..eb4b89e16d8e 100644 --- a/drivers/maru/maru_virtio_sensor.c +++ b/drivers/maru/maru_virtio_sensor.c @@ -59,7 +59,8 @@ #define DEVICE_COUNT 5 enum sensor_types { - sensor_type_accel = 0, + sensor_type_list = 0, + sensor_type_accel, sensor_type_geo, sensor_type_gyro, sensor_type_gyro_x, @@ -74,6 +75,22 @@ enum sensor_types { sensor_type_max }; +enum sensor_capabilities { + sensor_cap_accel = 0x01, + sensor_cap_geo = 0x02, + sensor_cap_gyro = 0x04, + sensor_cap_light = 0x08, + sensor_cap_proxi = 0x10 +}; + +enum sensor_attributes { + sensor_attr_accel = 0, + sensor_attr_geo, + sensor_attr_gyro, + sensor_attr_light, + sensor_attr_proxi +}; + enum request_cmd { request_get = 0, request_set, @@ -120,6 +137,7 @@ static DECLARE_WAIT_QUEUE_HEAD(wq); } static char sensor_data [PAGE_SIZE]; +static int sensor_capability = 0; static void sensor_vq_done(struct virtqueue *rvq) { unsigned int len; @@ -146,6 +164,21 @@ static void sensor_vq_done(struct virtqueue *rvq) { wake_up_interruptible(&wq); } +static int sensor_atoi(const char *name) +{ + int val = 0; + + for (;; name++) { + switch (*name) { + case '0' ... '9': + val = 10*val+(*name-'0'); + break; + default: + return val; + } + } +} + static void set_sensor_data(int type, const char* buf) { int err = 0; @@ -475,7 +508,17 @@ static int init_device(void) int ret = 0; for (i = 0; i < DEVICE_COUNT; i++) { - + if (i == sensor_attr_accel && !(sensor_capability & sensor_cap_accel)) { + continue; + } else if (i == sensor_attr_geo && !(sensor_capability & sensor_cap_geo)) { + continue; + } else if (i == sensor_attr_gyro && !(sensor_capability & sensor_cap_gyro)) { + continue; + } else if (i == sensor_attr_light && !(sensor_capability & sensor_cap_light)) { + continue; + } else if (i == sensor_attr_proxi && !(sensor_capability & sensor_cap_proxi)) { + continue; + } device_list[i] = device_create(sensor_class, NULL, (dev_t)NULL, NULL, device_name_list[i]); if (device_list[i] < 0) { LOG(KERN_ERR, "%dth sensor device creation is failed.", i); @@ -527,12 +570,6 @@ static int sensor_probe(struct virtio_device* dev) return -1; } - ret = init_device(); - if (ret) { - cleanup(dev); - return ret; - } - vs->vq = virtio_find_single_vq(dev, sensor_vq_done, "sensor"); if (IS_ERR(vs->vq)) { cleanup(dev); @@ -553,6 +590,17 @@ static int sensor_probe(struct virtio_device* dev) LOG(KERN_INFO, "Sensor probe completes"); + get_sensor_data(sensor_type_list); + sensor_capability = sensor_atoi(sensor_data); + LOG(KERN_INFO, "sensor capability is %02x", sensor_capability); + + ret = init_device(); + if (ret) { + LOG(KERN_ERR, "failed initialing devices"); + cleanup(dev); + return ret; + } + return err; } diff --git a/package/changelog b/package/changelog index 26e230573162..63a6c2f66628 100644 --- a/package/changelog +++ b/package/changelog @@ -1,3 +1,6 @@ +* 1.4.34 +- enabling selective sensors and jacks +== Jinhyung Choi 2014-03-20 * 1.4.33 - Implemented the HBM(High Brightness Mode) for the maru brightness. == Jinhyung Jo 2014-03-07 diff --git a/package/pkginfo.manifest b/package/pkginfo.manifest index b345dd418cb5..5d9baba97af4 100644 --- a/package/pkginfo.manifest +++ b/package/pkginfo.manifest @@ -1,4 +1,4 @@ -Version: 1.4.33 +Version: 1.4.34 Maintainer: Yeong-Kyoon, Lee Source: emulator-kernel