Avoid opening and closing hw_node everytime on ioctl
[yamaha-mc1n2-audio.git] / yamaha-mc1n2-audio.c
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;
 }