Avoid mode and use directions logic instead, introducing modem support
[yamaha-mc1n2-audio.git] / yamaha-mc1n2-audio.c
index f0761e5..c3a80ca 100644 (file)
@@ -169,7 +169,7 @@ int yamaha_mc1n2_audio_init(struct yamaha_mc1n2_audio_pdata *pdata)
 
 struct yamaha_mc1n2_audio_params_route *
        yamaha_mc1n2_audio_params_route_find(struct yamaha_mc1n2_audio_pdata *pdata,
-       audio_devices_t device, audio_mode_t mode)
+       audio_devices_t device, enum yamaha_mc1n2_audio_direction direction)
 {
        struct yamaha_mc1n2_audio_params_route *params = NULL;
        int params_count = 0;
@@ -184,7 +184,7 @@ struct yamaha_mc1n2_audio_params_route *
                return NULL;
 
        for(i=0 ; i < params_count ; i++) {
-               if(params[i].device == device && params[i].mode == mode)
+               if(params[i].device == device && params[i].direction == direction)
                        return &params[i];
        }
 
@@ -334,6 +334,8 @@ int yamaha_mc1n2_audio_route_start(struct yamaha_mc1n2_audio_pdata *pdata)
 
        int rc;
 
+       LOGD("%s()", __func__);
+
        if(pdata == NULL || pdata->ops == NULL)
                return -1;
 
@@ -349,7 +351,7 @@ int yamaha_mc1n2_audio_route_start(struct yamaha_mc1n2_audio_pdata *pdata)
 output_merge:
        if(pdata->output_state) {
                params_route = yamaha_mc1n2_audio_params_route_find(pdata,
-                       pdata->output_device, pdata->mode);
+                       pdata->output_device, YAMAHA_MC1N2_AUDIO_DIRECTION_OUTPUT);
                if(params_route == NULL)
                        goto input_merge;
 
@@ -361,7 +363,19 @@ output_merge:
 input_merge:
        if(pdata->input_state) {
                params_route = yamaha_mc1n2_audio_params_route_find(pdata,
-                       pdata->input_device, pdata->mode);
+                       pdata->input_device, YAMAHA_MC1N2_AUDIO_DIRECTION_INPUT);
+               if(params_route == NULL)
+                       goto modem_merge;
+
+               memcpy(&params_dst, params_route, sizeof(params_dst));
+               yamaha_mc1n2_audio_params_route_merge(&params_src, &params_dst);
+               memcpy(&params_src, &params_dst, sizeof(params_src));
+       }
+
+modem_merge:
+       if(pdata->modem_state) {
+               params_route = yamaha_mc1n2_audio_params_route_find(pdata,
+                       pdata->output_device, YAMAHA_MC1N2_AUDIO_DIRECTION_MODEM);
                if(params_route == NULL)
                        goto route_start;
 
@@ -401,6 +415,8 @@ int yamaha_mc1n2_audio_output_start(struct yamaha_mc1n2_audio_pdata *pdata)
 {
        int rc;
 
+       LOGD("%s()", __func__);
+
        if(pdata == NULL || pdata->ops == NULL)
                return -1;
 
@@ -425,6 +441,8 @@ int yamaha_mc1n2_audio_output_stop(struct yamaha_mc1n2_audio_pdata *pdata)
 {
        int rc;
 
+       LOGD("%s()", __func__);
+
        if(pdata == NULL || pdata->ops == NULL)
                return -1;
 
@@ -449,6 +467,8 @@ int yamaha_mc1n2_audio_input_start(struct yamaha_mc1n2_audio_pdata *pdata)
 {
        int rc;
 
+       LOGD("%s()", __func__);
+
        if(pdata == NULL || pdata->ops == NULL)
                return -1;
 
@@ -473,6 +493,8 @@ int yamaha_mc1n2_audio_input_stop(struct yamaha_mc1n2_audio_pdata *pdata)
 {
        int rc;
 
+       LOGD("%s()", __func__);
+
        if(pdata == NULL || pdata->ops == NULL)
                return -1;
 
@@ -493,15 +515,69 @@ int yamaha_mc1n2_audio_input_stop(struct yamaha_mc1n2_audio_pdata *pdata)
        return 0;
 }
 
+int yamaha_mc1n2_audio_modem_start(struct yamaha_mc1n2_audio_pdata *pdata)
+{
+       int rc;
+
+       LOGD("%s()", __func__);
+
+       if(pdata == NULL || pdata->ops == NULL)
+               return -1;
+
+       pdata->modem_state = 1;
+
+       rc = yamaha_mc1n2_audio_route_start(pdata);
+       if(rc < 0) {
+               LOGE("Route start failed, aborting!");
+               return -1;
+       }
+
+       rc = yamaha_mc1n2_audio_ioctl_notify(pdata, MCDRV_NOTIFY_CALL_START);
+       if(rc < 0) {
+               LOGE("NOTIFY_CALL_START IOCTL failed, aborting!");
+               return -1;
+       }
+
+       return 0;
+}
+
+int yamaha_mc1n2_audio_modem_stop(struct yamaha_mc1n2_audio_pdata *pdata)
+{
+       int rc;
+
+       LOGD("%s()", __func__);
+
+       if(pdata == NULL || pdata->ops == NULL)
+               return -1;
+
+       pdata->modem_state = 0;
+
+       rc = yamaha_mc1n2_audio_route_start(pdata);
+       if(rc < 0) {
+               LOGE("Route start failed, aborting!");
+               return -1;
+       }
+
+       rc = yamaha_mc1n2_audio_ioctl_notify(pdata, MCDRV_NOTIFY_CALL_STOP);
+       if(rc < 0) {
+               LOGE("NOTIFY_CALL_START IOCTL failed, aborting!");
+               return -1;
+       }
+
+       return 0;
+}
+
 /*
  * Values configuration
  */
 
 int yamaha_mc1n2_audio_set_route(struct yamaha_mc1n2_audio_pdata *pdata,
-       audio_devices_t device, audio_mode_t mode)
+       audio_devices_t device)
 {
        int changed = 0;
 
+       LOGD("%s(%x)", __func__, device);
+
        if(pdata == NULL)
                return -1;
 
@@ -513,12 +589,7 @@ int yamaha_mc1n2_audio_set_route(struct yamaha_mc1n2_audio_pdata *pdata,
                changed = 1;
        }
 
-       if(pdata->mode != mode) {
-               pdata->mode = mode;
-               changed = 1;
-       }
-
-       if(changed && (pdata->output_state || pdata->input_state))
+       if(changed && (pdata->output_state || pdata->input_state || pdata->modem_state))
                return yamaha_mc1n2_audio_route_start(pdata);
 
        return 0;
@@ -566,6 +637,8 @@ int yamaha_mc1n2_audio_start(struct yamaha_mc1n2_audio_pdata **pdata_p,
        struct yamaha_mc1n2_audio_pdata *pdata = NULL;
        int rc;
 
+       LOGD("%s(%s)", __func__, device_name);
+
        if(pdata_p == NULL || device_name == NULL)
                return -1;
 
@@ -585,5 +658,7 @@ int yamaha_mc1n2_audio_stop(struct yamaha_mc1n2_audio_pdata *pdata)
        if(pdata == NULL)
                return -1;
 
+       LOGD("%s()", __func__);
+
        return 0;
 }