static void es705_alloc_slim_tx_chan(struct slim_device *sbdev) { struct es705_priv *es705_priv = slim_get_devicedata(sbdev); struct es705_slim_ch *tx = es705_priv->slim_tx; int i; int port_id; for (i = 0; i < ES705_SLIM_TX_PORTS; i++) { port_id = i + 10; /* ES705_SLIM_RX_PORTS; */ tx[i].ch_num = es705_slim_tx_port_to_ch[i]; slim_get_slaveport(sbdev->laddr, port_id, &tx[i].sph, SLIM_SRC); slim_query_ch(sbdev, tx[i].ch_num, &tx[i].ch_h); } }
int escore_close_slim_tx(struct slim_device *sbdev, unsigned int *ch_num, unsigned int ch_cnt) { struct escore_priv *escore_priv = slim_get_devicedata(sbdev); struct escore_slim_ch *tx = escore_priv->slim_tx; u16 grph = 0; u32 *sph; int i; int idx; int rc; sph = kmalloc(sizeof(u32)*escore_priv->slim_tx_ports, GFP_KERNEL); if (!sph) return -ENOMEM; dev_dbg(&sbdev->dev, "%s(ch_cnt = %d)\n", __func__, ch_cnt); for (i = 0; i < ch_cnt; i++) { idx = escore_tx_ch_num_to_idx(escore_priv, ch_num[i]); sph[i] = tx[idx].sph; grph = tx[idx].grph; } rc = slim_control_ch(sbdev, grph, SLIM_CH_REMOVE, true); if (rc < 0) { dev_err(&sbdev->dev, "%s(): slim_control_ch() failed: %d\n", __func__, rc); goto slim_control_ch_error; } for (i = 0; i < ch_cnt; i++) { idx = escore_tx_ch_num_to_idx(escore_priv, ch_num[i]); tx[idx].grph = 0; } rc = slim_disconnect_ports(sbdev, sph, ch_cnt); if (rc < 0) { dev_err(&sbdev->dev, "%s(): slim_disconnect_ports() failed: %d\n", __func__, rc); } slim_control_ch_error: kfree(sph); return rc; }
static int es705_close_slim_tx(struct slim_device *sbdev, unsigned int *ch_num, unsigned int ch_cnt) { struct es705_priv *es705_priv = slim_get_devicedata(sbdev); struct es705_slim_ch *tx = es705_priv->slim_tx; u16 grph = 0; u32 sph[ES705_SLIM_TX_PORTS] = {0}; int i; int idx; int rc; dev_dbg(&sbdev->dev, "%s(): ch_cnt = %d\n", __func__, ch_cnt); for (i = 0; i < ch_cnt; i++) { dev_dbg(&sbdev->dev, "%s(): ch_num = %d\n", __func__, ch_num[i]); idx = es705_tx_ch_num_to_idx(ch_num[i]); sph[i] = tx[idx].sph; grph = tx[idx].grph; } rc = slim_control_ch(sbdev, grph, SLIM_CH_REMOVE, true); if (rc < 0) { dev_err(&sbdev->dev, "%s(): slim_connect_sink() failed: %d\n", __func__, rc); goto slim_control_ch_error; } for (i = 0; i < ch_cnt; i++) { dev_dbg(&sbdev->dev, "%s(): ch_num = %d\n", __func__, ch_num[i]); idx = es705_tx_ch_num_to_idx(ch_num[i]); tx[idx].grph = 0; } rc = slim_disconnect_ports(sbdev, sph, ch_cnt); if (rc < 0) { dev_err(&sbdev->dev, "%s(): slim_disconnect_ports() failed: %d\n", __func__, rc); } slim_control_ch_error: return rc; }
static int es705_slim_device_up(struct slim_device *sbdev) { struct es705_priv *priv; int rc; #ifdef CONFIG_SND_SOC_ES704_TEMP dev_selected = 1; #endif dev_info(&sbdev->dev, "%s(): name=%s\n", __func__, sbdev->name); dev_info(&sbdev->dev, "%s(): laddr=%d\n", __func__, sbdev->laddr); /* Start the firmware download in the workqueue context. */ priv = slim_get_devicedata(sbdev); if (strncmp(sbdev->name, CODEC_INTF_ID, strnlen(CODEC_INTF_ID, SLIMBUS_NAME_SIZE)) == 0) return 0; rc = fw_download(priv); BUG_ON(rc != 0); #if defined(SAMSUNG_ES705_FEATURE) if (priv->power_control) priv->power_control(ES705_SET_POWER_STATE_SLEEP, ES705_POWER_STATE); #endif return rc; }
static int es705_cfg_slim_tx(struct slim_device *sbdev, unsigned int *ch_num, unsigned int ch_cnt, unsigned int rate) { struct es705_priv *es705_priv = slim_get_devicedata(sbdev); struct es705_slim_ch *tx = es705_priv->slim_tx; u16 grph; u32 sph[ES705_SLIM_TX_PORTS] = {0}; u16 ch_h[ES705_SLIM_TX_PORTS] = {0}; struct slim_ch prop; int i; int idx; int rc; dev_dbg(&sbdev->dev, "%s(): ch_cnt = %d, rate = %d\n", __func__, ch_cnt, rate); for (i = 0; i < ch_cnt; i++) { dev_dbg(&sbdev->dev, "%s(): ch_num = %d\n", __func__, ch_num[i]); idx = es705_tx_ch_num_to_idx(ch_num[i]); ch_h[i] = tx[idx].ch_h; sph[i] = tx[idx].sph; } prop.prot = SLIM_AUTO_ISO; prop.baser = SLIM_RATE_4000HZ; prop.dataf = SLIM_CH_DATAF_NOT_DEFINED; prop.auxf = SLIM_CH_AUXF_NOT_APPLICABLE; prop.ratem = (rate/4000); prop.sampleszbits = 16; rc = slim_define_ch(sbdev, &prop, ch_h, ch_cnt, true, &grph); if (rc < 0) { dev_err(&sbdev->dev, "%s(): slim_define_ch() failed: %d\n", __func__, rc); goto slim_define_ch_error; } for (i = 0; i < ch_cnt; i++) { rc = slim_connect_src(sbdev, sph[i], ch_h[i]); if (rc < 0) { dev_err(&sbdev->dev, "%s(): slim_connect_src() failed: %d\n", __func__, rc); dev_err(&sbdev->dev, "%s(): ch_num[0] = %d\n", __func__, ch_num[0]); goto slim_connect_src_error; } } rc = slim_control_ch(sbdev, grph, SLIM_CH_ACTIVATE, true); if (rc < 0) { dev_err(&sbdev->dev, "%s(): slim_control_ch() failed: %d\n", __func__, rc); goto slim_control_ch_error; } for (i = 0; i < ch_cnt; i++) { dev_info(&sbdev->dev, "%s(): ch_num = %d\n", __func__, ch_num[i]); idx = es705_tx_ch_num_to_idx(ch_num[i]); tx[idx].grph = grph; } return rc; slim_control_ch_error: slim_connect_src_error: es705_close_slim_tx(sbdev, ch_num, ch_cnt); slim_define_ch_error: return rc; }
int escore_cfg_slim_tx(struct slim_device *sbdev, unsigned int *ch_num, unsigned int ch_cnt, unsigned int rate) { struct escore_priv *escore_priv = slim_get_devicedata(sbdev); struct escore_slim_ch *tx = escore_priv->slim_tx; u16 grph; u32 *sph; u16 *ch_h; struct slim_ch prop; int i; int idx; int rc; dev_dbg(&sbdev->dev, "%s(ch_cnt = %d, rate = %d)\n", __func__, ch_cnt, rate); sph = kmalloc(sizeof(u32)*escore_priv->slim_rx_ports, GFP_KERNEL); if (!sph) return -ENOMEM; ch_h = kmalloc(sizeof(u32)*escore_priv->slim_rx_ports, GFP_KERNEL); if (!ch_h) { kfree(sph); return -ENOMEM; } for (i = 0; i < ch_cnt; i++) { idx = escore_tx_ch_num_to_idx(escore_priv, ch_num[i]); ch_h[i] = tx[idx].ch_h; sph[i] = tx[idx].sph; } prop.prot = SLIM_AUTO_ISO; prop.baser = SLIM_RATE_4000HZ; prop.dataf = SLIM_CH_DATAF_NOT_DEFINED; prop.auxf = SLIM_CH_AUXF_NOT_APPLICABLE; prop.ratem = (rate/4000); prop.sampleszbits = 16; rc = slim_define_ch(sbdev, &prop, ch_h, ch_cnt, true, &grph); if (rc < 0) { dev_err(&sbdev->dev, "%s(): slim_define_ch() failed: %d\n", __func__, rc); goto slim_define_ch_error; } for (i = 0; i < ch_cnt; i++) { rc = slim_connect_src(sbdev, sph[i], ch_h[i]); if (rc < 0) { dev_err(&sbdev->dev, "%s(): slim_connect_src() failed: %d\n", __func__, rc); dev_err(&sbdev->dev, "%s(): ch_num[0] = %d\n", __func__, ch_num[0]); goto slim_connect_src_error; } } rc = slim_control_ch(sbdev, grph, SLIM_CH_ACTIVATE, true); if (rc < 0) { dev_err(&sbdev->dev, "%s(): slim_control_ch() failed: %d\n", __func__, rc); goto slim_control_ch_error; } for (i = 0; i < ch_cnt; i++) { idx = escore_tx_ch_num_to_idx(escore_priv, ch_num[i]); tx[idx].grph = grph; } kfree(sph); kfree(ch_h); return rc; slim_control_ch_error: slim_connect_src_error: escore_close_slim_tx(sbdev, ch_num, ch_cnt); slim_define_ch_error: kfree(sph); kfree(ch_h); return rc; }