|
@@ -28,9 +28,45 @@
|
|
|
#define AFE_PARAM_ID_HDMI_CONFIG 0x00010210
|
|
|
#define AFE_MODULE_AUDIO_DEV_INTERFACE 0x0001020C
|
|
|
|
|
|
+#define AFE_PARAM_ID_CDC_SLIMBUS_SLAVE_CFG 0x00010235
|
|
|
+
|
|
|
+#define AFE_PARAM_ID_SLIMBUS_CONFIG 0x00010212
|
|
|
+
|
|
|
/* Port IDs */
|
|
|
#define AFE_API_VERSION_HDMI_CONFIG 0x1
|
|
|
#define AFE_PORT_ID_MULTICHAN_HDMI_RX 0x100E
|
|
|
+
|
|
|
+#define AFE_API_VERSION_SLIMBUS_CONFIG 0x1
|
|
|
+
|
|
|
+/* SLIMbus Rx port on channel 0. */
|
|
|
+#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_0_RX 0x4000
|
|
|
+/* SLIMbus Tx port on channel 0. */
|
|
|
+#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_0_TX 0x4001
|
|
|
+/* SLIMbus Rx port on channel 1. */
|
|
|
+#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_1_RX 0x4002
|
|
|
+/* SLIMbus Tx port on channel 1. */
|
|
|
+#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_1_TX 0x4003
|
|
|
+/* SLIMbus Rx port on channel 2. */
|
|
|
+#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_2_RX 0x4004
|
|
|
+/* SLIMbus Tx port on channel 2. */
|
|
|
+#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_2_TX 0x4005
|
|
|
+/* SLIMbus Rx port on channel 3. */
|
|
|
+#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_3_RX 0x4006
|
|
|
+/* SLIMbus Tx port on channel 3. */
|
|
|
+#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_3_TX 0x4007
|
|
|
+/* SLIMbus Rx port on channel 4. */
|
|
|
+#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_4_RX 0x4008
|
|
|
+/* SLIMbus Tx port on channel 4. */
|
|
|
+#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_4_TX 0x4009
|
|
|
+/* SLIMbus Rx port on channel 5. */
|
|
|
+#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_5_RX 0x400a
|
|
|
+/* SLIMbus Tx port on channel 5. */
|
|
|
+#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_5_TX 0x400b
|
|
|
+/* SLIMbus Rx port on channel 6. */
|
|
|
+#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_6_RX 0x400c
|
|
|
+/* SLIMbus Tx port on channel 6. */
|
|
|
+#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_6_TX 0x400d
|
|
|
+
|
|
|
#define TIMEOUT_MS 1000
|
|
|
#define AFE_CMD_RESP_AVAIL 0
|
|
|
#define AFE_CMD_RESP_NONE 1
|
|
@@ -80,8 +116,53 @@ struct afe_param_id_hdmi_multi_chan_audio_cfg {
|
|
|
u16 reserved;
|
|
|
} __packed;
|
|
|
|
|
|
+struct afe_param_id_slimbus_cfg {
|
|
|
+ u32 sb_cfg_minor_version;
|
|
|
+/* Minor version used for tracking the version of the SLIMBUS
|
|
|
+ * configuration interface.
|
|
|
+ * Supported values: #AFE_API_VERSION_SLIMBUS_CONFIG
|
|
|
+ */
|
|
|
+
|
|
|
+ u16 slimbus_dev_id;
|
|
|
+/* SLIMbus hardware device ID, which is required to handle
|
|
|
+ * multiple SLIMbus hardware blocks.
|
|
|
+ * Supported values: - #AFE_SLIMBUS_DEVICE_1 - #AFE_SLIMBUS_DEVICE_2
|
|
|
+ */
|
|
|
+ u16 bit_width;
|
|
|
+/* Bit width of the sample.
|
|
|
+ * Supported values: 16, 24
|
|
|
+ */
|
|
|
+ u16 data_format;
|
|
|
+/* Data format supported by the SLIMbus hardware. The default is
|
|
|
+ * 0 (#AFE_SB_DATA_FORMAT_NOT_INDICATED), which indicates the
|
|
|
+ * hardware does not perform any format conversions before the data
|
|
|
+ * transfer.
|
|
|
+ */
|
|
|
+ u16 num_channels;
|
|
|
+/* Number of channels.
|
|
|
+ * Supported values: 1 to #AFE_PORT_MAX_AUDIO_CHAN_CNT
|
|
|
+ */
|
|
|
+ u8 shared_ch_mapping[AFE_PORT_MAX_AUDIO_CHAN_CNT];
|
|
|
+/* Mapping of shared channel IDs (128 to 255) to which the
|
|
|
+ * master port is to be connected.
|
|
|
+ * Shared_channel_mapping[i] represents the shared channel assigned
|
|
|
+ * for audio channel i in multichannel audio data.
|
|
|
+ */
|
|
|
+ u32 sample_rate;
|
|
|
+/* Sampling rate of the port.
|
|
|
+ * Supported values:
|
|
|
+ * - #AFE_PORT_SAMPLE_RATE_8K
|
|
|
+ * - #AFE_PORT_SAMPLE_RATE_16K
|
|
|
+ * - #AFE_PORT_SAMPLE_RATE_48K
|
|
|
+ * - #AFE_PORT_SAMPLE_RATE_96K
|
|
|
+ * - #AFE_PORT_SAMPLE_RATE_192K
|
|
|
+ */
|
|
|
+} __packed;
|
|
|
+
|
|
|
+
|
|
|
union afe_port_config {
|
|
|
struct afe_param_id_hdmi_multi_chan_audio_cfg hdmi_multi_ch;
|
|
|
+ struct afe_param_id_slimbus_cfg slim_cfg;
|
|
|
} __packed;
|
|
|
|
|
|
struct q6afe_port {
|
|
@@ -111,6 +192,20 @@ struct afe_port_map {
|
|
|
|
|
|
static struct afe_port_map port_maps[AFE_PORT_MAX] = {
|
|
|
[HDMI_RX] = { AFE_PORT_ID_MULTICHAN_HDMI_RX, HDMI_RX, 1, 1},
|
|
|
+ [SLIMBUS_0_RX] = { AFE_PORT_ID_SLIMBUS_MULTI_CHAN_0_RX,
|
|
|
+ SLIMBUS_0_RX, 1, 1},
|
|
|
+ [SLIMBUS_1_RX] = { AFE_PORT_ID_SLIMBUS_MULTI_CHAN_1_RX,
|
|
|
+ SLIMBUS_1_RX, 1, 1},
|
|
|
+ [SLIMBUS_2_RX] = { AFE_PORT_ID_SLIMBUS_MULTI_CHAN_2_RX,
|
|
|
+ SLIMBUS_2_RX, 1, 1},
|
|
|
+ [SLIMBUS_3_RX] = { AFE_PORT_ID_SLIMBUS_MULTI_CHAN_3_RX,
|
|
|
+ SLIMBUS_3_RX, 1, 1},
|
|
|
+ [SLIMBUS_4_RX] = { AFE_PORT_ID_SLIMBUS_MULTI_CHAN_4_RX,
|
|
|
+ SLIMBUS_4_RX, 1, 1},
|
|
|
+ [SLIMBUS_5_RX] = { AFE_PORT_ID_SLIMBUS_MULTI_CHAN_5_RX,
|
|
|
+ SLIMBUS_5_RX, 1, 1},
|
|
|
+ [SLIMBUS_6_RX] = { AFE_PORT_ID_SLIMBUS_MULTI_CHAN_6_RX,
|
|
|
+ SLIMBUS_6_RX, 1, 1},
|
|
|
};
|
|
|
|
|
|
static void q6afe_port_free(struct kref *ref)
|
|
@@ -340,6 +435,31 @@ int q6afe_port_stop(struct q6afe_port *port)
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(q6afe_port_stop);
|
|
|
|
|
|
+/**
|
|
|
+ * q6afe_slim_port_prepare() - Prepare slim afe port.
|
|
|
+ *
|
|
|
+ * @port: Instance of afe port
|
|
|
+ * @cfg: SLIM configuration for the afe port
|
|
|
+ *
|
|
|
+ */
|
|
|
+void q6afe_slim_port_prepare(struct q6afe_port *port,
|
|
|
+ struct q6afe_slim_cfg *cfg)
|
|
|
+{
|
|
|
+ union afe_port_config *pcfg = &port->port_cfg;
|
|
|
+
|
|
|
+ pcfg->slim_cfg.sb_cfg_minor_version = AFE_API_VERSION_SLIMBUS_CONFIG;
|
|
|
+ pcfg->slim_cfg.sample_rate = cfg->sample_rate;
|
|
|
+ pcfg->slim_cfg.bit_width = cfg->bit_width;
|
|
|
+ pcfg->slim_cfg.num_channels = cfg->num_channels;
|
|
|
+ pcfg->slim_cfg.data_format = cfg->data_format;
|
|
|
+ pcfg->slim_cfg.shared_ch_mapping[0] = cfg->ch_mapping[0];
|
|
|
+ pcfg->slim_cfg.shared_ch_mapping[1] = cfg->ch_mapping[1];
|
|
|
+ pcfg->slim_cfg.shared_ch_mapping[2] = cfg->ch_mapping[2];
|
|
|
+ pcfg->slim_cfg.shared_ch_mapping[3] = cfg->ch_mapping[3];
|
|
|
+
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(q6afe_slim_port_prepare);
|
|
|
+
|
|
|
/**
|
|
|
* q6afe_hdmi_port_prepare() - Prepare hdmi afe port.
|
|
|
*
|
|
@@ -451,6 +571,15 @@ struct q6afe_port *q6afe_port_get_from_id(struct device *dev, int id)
|
|
|
case AFE_PORT_ID_MULTICHAN_HDMI_RX:
|
|
|
cfg_type = AFE_PARAM_ID_HDMI_CONFIG;
|
|
|
break;
|
|
|
+ case AFE_PORT_ID_SLIMBUS_MULTI_CHAN_0_RX:
|
|
|
+ case AFE_PORT_ID_SLIMBUS_MULTI_CHAN_1_RX:
|
|
|
+ case AFE_PORT_ID_SLIMBUS_MULTI_CHAN_2_RX:
|
|
|
+ case AFE_PORT_ID_SLIMBUS_MULTI_CHAN_3_RX:
|
|
|
+ case AFE_PORT_ID_SLIMBUS_MULTI_CHAN_4_RX:
|
|
|
+ case AFE_PORT_ID_SLIMBUS_MULTI_CHAN_5_RX:
|
|
|
+ case AFE_PORT_ID_SLIMBUS_MULTI_CHAN_6_RX:
|
|
|
+ cfg_type = AFE_PARAM_ID_SLIMBUS_CONFIG;
|
|
|
+ break;
|
|
|
default:
|
|
|
dev_err(dev, "Invalid port id 0x%x\n", port_id);
|
|
|
return ERR_PTR(-EINVAL);
|