Sensor & jack driver: selectively enabled sensors & jacks 82/18282/1
authorJinhyung Choi <jinhyung2.choi@samsung.com>
Thu, 20 Mar 2014 02:24:03 +0000 (11:24 +0900)
committerJinhyung Choi <jinhyung2.choi@samsung.com>
Thu, 20 Mar 2014 02:24:03 +0000 (11:24 +0900)
Change-Id: I0dd251732d550d5e4e6d72195f6bb906df846445
Signed-off-by: Jinhyung Choi <jinhyung2.choi@samsung.com>
drivers/maru/maru_jack.c
drivers/maru/maru_virtio_sensor.c
package/changelog
package/pkginfo.manifest

index 6ae299177ae141d44193a426ca36dcf8dad46d61..06697fb3fa202057f4e5eaec5d2c41326a30ecb3 100644 (file)
@@ -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;
 }
 
index db670082e1207d420bba72089f18e4dc2a9921f5..eb4b89e16d8e38d53c84a1e50bfd06ce1361c1a4 100644 (file)
@@ -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;
 }
 
index 26e230573162b1d9796daeae351148c7231bc6ca..63a6c2f66628cf51816e569851e43ac61c64231e 100644 (file)
@@ -1,3 +1,6 @@
+* 1.4.34
+- enabling selective sensors and jacks
+== Jinhyung Choi <jinhyung2.choi@samsung.com> 2014-03-20
 * 1.4.33
 - Implemented the HBM(High Brightness Mode) for the maru brightness.
 == Jinhyung Jo <jinhyung.jo@samsung.com> 2014-03-07
index b345dd418cb5b9901b40e4937b5d772d813ce147..5d9baba97af4097572bc9d314c1741516202decc 100644 (file)
@@ -1,4 +1,4 @@
-Version: 1.4.33
+Version: 1.4.34
 Maintainer: Yeong-Kyoon, Lee <yeongkyoon.lee@samsung.com>
 Source: emulator-kernel