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; }
int wcd9xxx_disconnect_port(struct wcd9xxx *wcd9xxx, unsigned int *ch_num, unsigned int ch_cnt, unsigned int rx_tx) { u32 sph[SLIM_MAX_TX_PORTS] = {0}; int i = 0 , idx = 0; int ret = 0; struct wcd9xxx_slim_sch_rx *rx = sh_ch.rx; struct wcd9xxx_slim_sch_tx *tx = sh_ch.tx; pr_debug("%s: ch_cnt[%d], rx_tx flag = %d\n", __func__, ch_cnt, rx_tx); for (i = 0; i < ch_cnt; i++) { /* rx_tx will be 1 for rx, 0 for tx */ if (rx_tx) { idx = (ch_num[i] - BASE_CH_NUM - SB_PGD_OFFSET_OF_RX_SLAVE_DEV_PORTS - 1); if (idx < 0) { pr_err("%s: Invalid index found for RX = %d\n", __func__, idx); ret = -EINVAL; goto err; } sph[i] = rx[idx].sph; } else { idx = (ch_num[i] - BASE_CH_NUM); if (idx < 0) { pr_err("%s:Invalid index found for TX = %d\n", __func__, idx); ret = -EINVAL; goto err; } sph[i] = tx[idx].sph; } } /* slim_disconnect_port */ ret = slim_disconnect_ports(wcd9xxx->slim, sph, ch_cnt); if (ret < 0) { pr_err("%s: slim_disconnect_ports failed ret[%d]\n", __func__, ret); } err: return ret; }
int wcd9xxx_close_slim_sch_rx(struct wcd9xxx *wcd9xxx, unsigned int *ch_num, unsigned int ch_cnt) { u16 grph = 0; u32 sph[SLIM_MAX_RX_PORTS] = {0}; int i = 0 , idx = 0; int ret = 0; struct wcd9xxx_slim_sch_rx *rx = sh_ch.rx; pr_debug("%s: ch_cnt[%d]\n", __func__, ch_cnt); for (i = 0; i < ch_cnt; i++) { idx = (ch_num[i] - BASE_CH_NUM - sh_ch.rx_port_start_offset); if (idx < 0) { pr_err("%s: Error:-Invalid index found = %d\n", __func__, idx); ret = -EINVAL; goto err; } sph[i] = rx[idx].sph; grph = rx[idx].grph; pr_debug("%s: ch_num[%d] %d, idx %d, sph[%d] %x, grph %x\n", __func__, i, ch_num[i], idx, i, sph[i], grph); } /* slim_control_ch (REMOVE) */ ret = slim_control_ch(wcd9xxx->slim, grph, SLIM_CH_REMOVE, true); if (ret < 0) { pr_err("%s: slim_control_ch failed ret[%d]\n", __func__, ret); goto err; } /* slim_disconnect_port */ ret = slim_disconnect_ports(wcd9xxx->slim, sph, ch_cnt); if (ret < 0) { pr_err("%s: slim_disconnect_ports failed ret[%d]\n", __func__, ret); } for (i = 0; i < ch_cnt; i++) { idx = (ch_num[i] - BASE_CH_NUM - sh_ch.rx_port_start_offset); rx[idx].grph = 0; } err: return ret; }
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; }