aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mm-base-modem.c34
-rw-r--r--src/mm-base-modem.h2
-rw-r--r--src/mm-port-probe.c14
-rw-r--r--src/mm-port.h3
4 files changed, 52 insertions, 1 deletions
diff --git a/src/mm-base-modem.c b/src/mm-base-modem.c
index 3b9dc7db..2b96f1a6 100644
--- a/src/mm-base-modem.c
+++ b/src/mm-base-modem.c
@@ -95,6 +95,9 @@ struct _MMBaseModemPrivate {
MMPortSerialAt *gps_control;
MMPortSerialGps *gps;
+ /* Some audio-capable devices will have a port for audio specifically */
+ MMPortSerial *audio;
+
/* Support for parallel enable/disable operations */
GList *enable_tasks;
GList *disable_tasks;
@@ -232,6 +235,9 @@ mm_base_modem_grab_port (MMBaseModem *self,
} else if (ptype == MM_PORT_TYPE_GPS) {
/* Raw GPS port */
port = MM_PORT (mm_port_serial_gps_new (name));
+ } else if (ptype == MM_PORT_TYPE_AUDIO) {
+ /* Generic audio port */
+ port = MM_PORT (mm_port_serial_new (name, ptype));
} else {
g_set_error (error,
MM_CORE_ERROR,
@@ -646,6 +652,22 @@ mm_base_modem_peek_port_gps (MMBaseModem *self)
return self->priv->gps;
}
+MMPortSerial *
+mm_base_modem_get_port_audio (MMBaseModem *self)
+{
+ g_return_val_if_fail (MM_IS_BASE_MODEM (self), NULL);
+
+ return (self->priv->audio ? g_object_ref (self->priv->audio) : NULL);
+}
+
+MMPortSerial *
+mm_base_modem_peek_port_audio (MMBaseModem *self)
+{
+ g_return_val_if_fail (MM_IS_BASE_MODEM (self), NULL);
+
+ return self->priv->audio;
+}
+
#if defined WITH_QMI
MMPortQmi *
@@ -929,6 +951,9 @@ mm_base_modem_get_port_infos (MMBaseModem *self,
case MM_PORT_TYPE_GPS:
port_infos[i].type = MM_MODEM_PORT_TYPE_GPS;
break;
+ case MM_PORT_TYPE_AUDIO:
+ port_infos[i].type = MM_MODEM_PORT_TYPE_AUDIO;
+ break;
case MM_PORT_TYPE_QMI:
port_infos[i].type = MM_MODEM_PORT_TYPE_QMI;
break;
@@ -1039,6 +1064,7 @@ mm_base_modem_organize_ports (MMBaseModem *self,
MMPortSerialQcdm *qcdm = NULL;
MMPortSerialAt *gps_control = NULL;
MMPortSerialGps *gps = NULL;
+ MMPortSerial *audio = NULL;
MMPort *data_primary = NULL;
GList *data = NULL;
#if defined WITH_QMI
@@ -1129,6 +1155,12 @@ mm_base_modem_organize_ports (MMBaseModem *self,
gps = MM_PORT_SERIAL_GPS (candidate);
break;
+ case MM_PORT_TYPE_AUDIO:
+ g_assert (MM_IS_PORT_SERIAL (candidate));
+ if (!audio)
+ audio = MM_PORT_SERIAL (candidate);
+ break;
+
#if defined WITH_QMI
case MM_PORT_TYPE_QMI:
if (!qmi_primary)
@@ -1246,6 +1278,7 @@ mm_base_modem_organize_ports (MMBaseModem *self,
log_port (self, MM_PORT (qcdm), "qcdm");
log_port (self, MM_PORT (gps_control), "gps (control)");
log_port (self, MM_PORT (gps), "gps (nmea)");
+ log_port (self, MM_PORT (audio), "audio");
#if defined WITH_QMI
log_port (self, MM_PORT (qmi_primary), "qmi (primary)");
for (l = qmi; l; l = g_list_next (l))
@@ -1576,6 +1609,7 @@ dispose (GObject *object)
g_clear_object (&self->priv->qcdm);
g_clear_object (&self->priv->gps_control);
g_clear_object (&self->priv->gps);
+ g_clear_object (&self->priv->audio);
#if defined WITH_QMI
/* We need to close the QMI port cleanly when disposing the modem object,
* otherwise the allocated CIDs will be kept allocated, and if we end up
diff --git a/src/mm-base-modem.h b/src/mm-base-modem.h
index db3d54d3..45a9ecc7 100644
--- a/src/mm-base-modem.h
+++ b/src/mm-base-modem.h
@@ -121,6 +121,7 @@ MMPortSerialAt *mm_base_modem_peek_port_secondary (MMBaseModem *self);
MMPortSerialQcdm *mm_base_modem_peek_port_qcdm (MMBaseModem *self);
MMPortSerialAt *mm_base_modem_peek_port_gps_control (MMBaseModem *self);
MMPortSerialGps *mm_base_modem_peek_port_gps (MMBaseModem *self);
+MMPortSerial *mm_base_modem_peek_port_audio (MMBaseModem *self);
#if defined WITH_QMI
MMPortQmi *mm_base_modem_peek_port_qmi (MMBaseModem *self);
MMPortQmi *mm_base_modem_peek_port_qmi_for_data (MMBaseModem *self, MMPort *data, GError **error);
@@ -138,6 +139,7 @@ MMPortSerialAt *mm_base_modem_get_port_secondary (MMBaseModem *self);
MMPortSerialQcdm *mm_base_modem_get_port_qcdm (MMBaseModem *self);
MMPortSerialAt *mm_base_modem_get_port_gps_control (MMBaseModem *self);
MMPortSerialGps *mm_base_modem_get_port_gps (MMBaseModem *self);
+MMPortSerial *mm_base_modem_get_port_audio (MMBaseModem *self);
#if defined WITH_QMI
MMPortQmi *mm_base_modem_get_port_qmi (MMBaseModem *self);
MMPortQmi *mm_base_modem_get_port_qmi_for_data (MMBaseModem *self, MMPort *data, GError **error);
diff --git a/src/mm-port-probe.c b/src/mm-port-probe.c
index c02f0b23..c0b5b455 100644
--- a/src/mm-port-probe.c
+++ b/src/mm-port-probe.c
@@ -93,6 +93,7 @@ struct _MMPortProbePrivate {
/* From udev tags */
gboolean is_ignored;
gboolean is_gps;
+ gboolean is_audio;
gboolean maybe_at_primary;
gboolean maybe_at_secondary;
gboolean maybe_at_ppp;
@@ -1477,6 +1478,15 @@ mm_port_probe_run (MMPortProbe *self,
mm_port_probe_set_result_qcdm (self, FALSE);
}
+ /* If this is a port flagged as an audio port, don't do any AT or QCDM probing */
+ if (self->priv->is_audio) {
+ mm_dbg ("(%s/%s) audio port detected",
+ mm_kernel_device_get_subsystem (self->priv->port),
+ mm_kernel_device_get_name (self->priv->port));
+ mm_port_probe_set_result_at (self, FALSE);
+ mm_port_probe_set_result_qcdm (self, FALSE);
+ }
+
/* If this is a port flagged as being an AT port, don't do any QCDM probing */
if (self->priv->maybe_at_primary || self->priv->maybe_at_secondary || self->priv->maybe_at_ppp) {
mm_dbg ("(%s/%s) no QCDM probing in possible AT port",
@@ -1711,6 +1721,9 @@ mm_port_probe_get_port_type (MMPortProbe *self)
if (self->priv->is_gps)
return MM_PORT_TYPE_GPS;
+ if (self->priv->is_audio)
+ return MM_PORT_TYPE_AUDIO;
+
return MM_PORT_TYPE_UNKNOWN;
}
@@ -1900,6 +1913,7 @@ set_property (GObject *object,
self->priv->port = g_value_dup_object (value);
self->priv->is_ignored = mm_kernel_device_get_property_as_boolean (self->priv->port, ID_MM_PORT_IGNORE);
self->priv->is_gps = mm_kernel_device_get_property_as_boolean (self->priv->port, ID_MM_PORT_TYPE_GPS);
+ self->priv->is_audio = mm_kernel_device_get_property_as_boolean (self->priv->port, ID_MM_PORT_TYPE_AUDIO);
self->priv->maybe_at_primary = mm_kernel_device_get_property_as_boolean (self->priv->port, ID_MM_PORT_TYPE_AT_PRIMARY);
self->priv->maybe_at_secondary = mm_kernel_device_get_property_as_boolean (self->priv->port, ID_MM_PORT_TYPE_AT_SECONDARY);
self->priv->maybe_at_ppp = mm_kernel_device_get_property_as_boolean (self->priv->port, ID_MM_PORT_TYPE_AT_PPP);
diff --git a/src/mm-port.h b/src/mm-port.h
index 80463294..33b07d97 100644
--- a/src/mm-port.h
+++ b/src/mm-port.h
@@ -41,7 +41,8 @@ typedef enum { /*< underscore_name=mm_port_type >*/
MM_PORT_TYPE_GPS,
MM_PORT_TYPE_QMI,
MM_PORT_TYPE_MBIM,
- MM_PORT_TYPE_LAST = MM_PORT_TYPE_MBIM /*< skip >*/
+ MM_PORT_TYPE_AUDIO,
+ MM_PORT_TYPE_LAST = MM_PORT_TYPE_AUDIO /*< skip >*/
} MMPortType;
#define MM_TYPE_PORT (mm_port_get_type ())