Avoid opening and closing hw_node everytime on ioctl master
authorPaul Kocialkowski <contact@paulk.fr>
Wed, 31 Oct 2012 12:12:43 +0000 (13:12 +0100)
committerPaul Kocialkowski <contact@paulk.fr>
Wed, 31 Oct 2012 12:12:43 +0000 (13:12 +0100)
Signed-off-by: Paul Kocialkowski <contact@paulk.fr>
device/galaxys2.c
include/yamaha-mc1n2-audio.h
yamaha-mc1n2-audio.c

index 8a26453..a55734a 100644 (file)
@@ -796,6 +796,7 @@ struct yamaha_mc1n2_audio_params_route galaxys2_params_routes[] = {
 
 struct yamaha_mc1n2_audio_device_ops galaxys2_ops = {
        .hw_node = "/dev/snd/hwC0D0",
+       .hw_fd = -1,
        .params = {
                .init = &galaxys2_params_init,
                .routes = &galaxys2_params_routes,
index aeb6752..d272548 100644 (file)
@@ -57,6 +57,7 @@ struct yamaha_mc1n2_audio_params {
 
 struct yamaha_mc1n2_audio_device_ops {
        char *hw_node;
+       int hw_fd;
        struct yamaha_mc1n2_audio_params params;
 };
 
index c3a80ca..58ba957 100644 (file)
@@ -50,29 +50,31 @@ int yamaha_mc1n2_audio_ioctl(struct yamaha_mc1n2_audio_pdata *pdata,
        int hw_fd = -1;
        int rc = -1;
 
-       if(pdata == NULL)
+       if(pdata == NULL || pdata->ops == NULL)
                return -1;
 
-       hw_node = yamaha_mc1n2_audio_get_hw_node(pdata);
+       hw_node = pdata->ops->hw_node;
        if(hw_node == NULL) {
                LOGE("%s: error, missing hw_node!", __func__);
                return -1;
        }
 
-       hw_fd = open(hw_node, O_RDWR);
-       if(hw_fd < 0) {
-               LOGE("%s: error, unable to open hw_node (fd is %d)!", __func__, hw_fd);
-               return -1;
+       if(pdata->ops->hw_fd <= 0) {
+               hw_fd = open(hw_node, O_RDWR);
+               if(hw_fd < 0) {
+                       LOGE("%s: error, unable to open hw_node (fd is %d)!", __func__, hw_fd);
+                       return -1;
+               }
+
+               pdata->ops->hw_fd = hw_fd;
        }
 
-       rc = ioctl(hw_fd, command, hw_ctrl);
+       rc = ioctl(pdata->ops->hw_fd, command, hw_ctrl);
        if(rc < 0) {
                LOGE("%s: error, ioctl on hw_node failed (rc is %d)!", __func__, rc);
                return -1;
        }
 
-       close(hw_fd);
-
        return rc;
 }
 
@@ -643,11 +645,13 @@ int yamaha_mc1n2_audio_start(struct yamaha_mc1n2_audio_pdata **pdata_p,
                return -1;
 
        pdata = yamaha_mc1n2_audio_platform_get(device_name);
-       if(pdata == NULL) {
+       if(pdata == NULL || pdata->ops == NULL) {
                LOGE("Unable to find requested platform: %s", device_name);
                return -1;
        }
 
+       pdata->ops->hw_fd = -1;
+
        *pdata_p = pdata;
 
        return 0;
@@ -655,10 +659,14 @@ int yamaha_mc1n2_audio_start(struct yamaha_mc1n2_audio_pdata **pdata_p,
 
 int yamaha_mc1n2_audio_stop(struct yamaha_mc1n2_audio_pdata *pdata)
 {
-       if(pdata == NULL)
+       LOGD("%s()", __func__);
+
+       if(pdata == NULL || pdata->ops == NULL)
                return -1;
 
-       LOGD("%s()", __func__);
+       if(pdata->ops->hw_fd >= 0) {
+               close(pdata->ops->hw_fd);
+       }
 
        return 0;
 }