diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/mm-base-modem.c | 34 | ||||
-rw-r--r-- | src/mm-base-modem.h | 2 | ||||
-rw-r--r-- | src/mm-port-probe.c | 14 | ||||
-rw-r--r-- | src/mm-port.h | 3 |
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 ()) |