int tegra30_ahub_rx_fifo_is_empty(int i2s_id) { int val, mask; val = tegra30_apbif_read(TEGRA30_AHUB_I2S_LIVE_STATUS); mask = (TEGRA30_AHUB_I2S_LIVE_STATUS_I2S0_RX_FIFO_EMPTY << (i2s_id*2)); val &= mask; return val; }
int tegra30_ahub_tx_fifo_is_enabled(int i2s_id) { int val, mask; val = tegra30_apbif_read(TEGRA30_AHUB_I2S_LIVE_STATUS); mask = (TEGRA30_AHUB_I2S_LIVE_STATUS_I2S0_TX_FIFO_ENABLED << (i2s_id*2)); val &= mask; return val; }
int tegra30_ahub_dam_tx_is_empty(int dam_id) { int val, mask; val = tegra30_apbif_read((TEGRA30_AHUB_DAM_LIVE_STATUS) + (dam_id * TEGRA30_AHUB_DAM_LIVE_STATUS_STRIDE)); mask = TEGRA30_AHUB_DAM_LIVE_STATUS_TXFIFO_EMPTY; val &= mask; return val; }
int tegra30_ahub_dam_tx_is_enabled(int dam_id) { int val, mask; val = tegra30_apbif_read((TEGRA30_AHUB_DAM_LIVE_STATUS) + (dam_id * TEGRA30_AHUB_DAM_LIVE_STATUS_STRIDE)); mask = TEGRA30_AHUB_DAM_LIVE_STATUS_TX_ENABLED; val &= mask; return val; }
int tegra30_ahub_allocate_rx_fifo(enum tegra30_ahub_rxcif *rxcif, char *dmachan, int dmachan_len, dma_addr_t *fiforeg) { int channel; u32 reg, val; struct tegra30_ahub_cif_conf cif_conf; channel = find_first_zero_bit(ahub->rx_usage, TEGRA30_AHUB_CHANNEL_CTRL_COUNT); if (channel >= TEGRA30_AHUB_CHANNEL_CTRL_COUNT) return -EBUSY; __set_bit(channel, ahub->rx_usage); *rxcif = TEGRA30_AHUB_RXCIF_APBIF_RX0 + channel; snprintf(dmachan, dmachan_len, "rx%d", channel); *fiforeg = ahub->apbif_addr + TEGRA30_AHUB_CHANNEL_RXFIFO + (channel * TEGRA30_AHUB_CHANNEL_RXFIFO_STRIDE); pm_runtime_get_sync(ahub->dev); reg = TEGRA30_AHUB_CHANNEL_CTRL + (channel * TEGRA30_AHUB_CHANNEL_CTRL_STRIDE); val = tegra30_apbif_read(reg); val &= ~(TEGRA30_AHUB_CHANNEL_CTRL_RX_THRESHOLD_MASK | TEGRA30_AHUB_CHANNEL_CTRL_RX_PACK_MASK); val |= (7 << TEGRA30_AHUB_CHANNEL_CTRL_RX_THRESHOLD_SHIFT) | TEGRA30_AHUB_CHANNEL_CTRL_RX_PACK_EN | TEGRA30_AHUB_CHANNEL_CTRL_RX_PACK_16; tegra30_apbif_write(reg, val); cif_conf.threshold = 0; cif_conf.audio_channels = 2; cif_conf.client_channels = 2; cif_conf.audio_bits = TEGRA30_AUDIOCIF_BITS_16; cif_conf.client_bits = TEGRA30_AUDIOCIF_BITS_16; cif_conf.expand = 0; cif_conf.stereo_conv = 0; cif_conf.replicate = 0; cif_conf.direction = TEGRA30_AUDIOCIF_DIRECTION_RX; cif_conf.truncate = 0; cif_conf.mono_conv = 0; reg = TEGRA30_AHUB_CIF_RX_CTRL + (channel * TEGRA30_AHUB_CIF_RX_CTRL_STRIDE); ahub->soc_data->set_audio_cif(ahub->regmap_apbif, reg, &cif_conf); pm_runtime_put(ahub->dev); return 0; }
int tegra30_ahub_disable_tx_fifo(enum tegra30_ahub_txcif txcif) { int channel = txcif - TEGRA30_AHUB_TXCIF_APBIF_TX0; int reg, val; reg = TEGRA30_AHUB_CHANNEL_CTRL + (channel * TEGRA30_AHUB_CHANNEL_CTRL_STRIDE); val = tegra30_apbif_read(reg); val &= ~TEGRA30_AHUB_CHANNEL_CTRL_TX_EN; tegra30_apbif_write(reg, val); return 0; }
int tegra30_ahub_enable_rx_fifo(enum tegra30_ahub_rxcif rxcif) { int channel = rxcif - TEGRA30_AHUB_RXCIF_APBIF_RX0; int reg, val; reg = TEGRA30_AHUB_CHANNEL_CTRL + (channel * TEGRA30_AHUB_CHANNEL_CTRL_STRIDE); val = tegra30_apbif_read(reg); val |= TEGRA30_AHUB_CHANNEL_CTRL_RX_EN; tegra30_apbif_write(reg, val); return 0; }
int tegra30_ahub_enable_tx_fifo(enum tegra30_ahub_txcif txcif) { int channel = txcif - TEGRA30_AHUB_TXCIF_APBIF_TX0; int reg, val; pm_runtime_get_sync(ahub->dev); reg = TEGRA30_AHUB_CHANNEL_CTRL + (channel * TEGRA30_AHUB_CHANNEL_CTRL_STRIDE); val = tegra30_apbif_read(reg); val |= TEGRA30_AHUB_CHANNEL_CTRL_TX_EN; tegra30_apbif_write(reg, val); pm_runtime_put(ahub->dev); return 0; }
int tegra30_ahub_disable_rx_fifo(enum tegra30_ahub_rxcif rxcif) { int channel = rxcif - TEGRA30_AHUB_RXCIF_APBIF_RX0; int reg, val; pm_runtime_get_sync(ahub->dev); reg = TEGRA30_AHUB_CHANNEL_CTRL + (channel * TEGRA30_AHUB_CHANNEL_CTRL_STRIDE); val = tegra30_apbif_read(reg); val &= ~TEGRA30_AHUB_CHANNEL_CTRL_RX_EN; tegra30_apbif_write(reg, val); pm_runtime_put(ahub->dev); return 0; }
int tegra30_ahub_set_rx_cif_bits(enum tegra30_ahub_rxcif rxcif, unsigned int audio_bits, unsigned int client_bits) { int channel = rxcif - TEGRA30_AHUB_RXCIF_APBIF_RX0; unsigned int reg, val; reg = TEGRA30_AHUB_CIF_RX_CTRL + (channel * TEGRA30_AHUB_CIF_RX_CTRL_STRIDE); val = tegra30_apbif_read(reg); val &= ~(TEGRA30_AUDIOCIF_CTRL_AUDIO_BITS_MASK | TEGRA30_AUDIOCIF_CTRL_CLIENT_BITS_MASK); val |= ((audio_bits) << TEGRA30_AUDIOCIF_CTRL_AUDIO_BITS_SHIFT) | ((client_bits) << TEGRA30_AUDIOCIF_CTRL_CLIENT_BITS_SHIFT); tegra30_apbif_write(reg, val); return 0; }
int tegra30_ahub_set_rx_cif_stereo_conv(enum tegra30_ahub_rxcif rxcif) { int channel = rxcif - TEGRA30_AHUB_RXCIF_APBIF_RX0; unsigned int reg, val; tegra30_ahub_enable_clocks(); reg = TEGRA30_AHUB_CIF_RX_CTRL + (channel * TEGRA30_AHUB_CIF_RX_CTRL_STRIDE); val = tegra30_apbif_read(reg); val &= ~TEGRA30_AUDIOCIF_CTRL_STEREO_CONV_MASK; val |= TEGRA30_AUDIOCIF_CTRL_STEREO_CONV_AVG; tegra30_apbif_write(reg, val); tegra30_ahub_disable_clocks(); return 0; }
int tegra30_ahub_set_tx_cif_channels(enum tegra30_ahub_txcif txcif, unsigned int audio_ch, unsigned int client_ch) { int channel = txcif - TEGRA30_AHUB_TXCIF_APBIF_TX0; unsigned int reg, val; reg = TEGRA30_AHUB_CIF_TX_CTRL + (channel * TEGRA30_AHUB_CIF_TX_CTRL_STRIDE); val = tegra30_apbif_read(reg); val &= ~(TEGRA30_AUDIOCIF_CTRL_AUDIO_CHANNELS_MASK | TEGRA30_AUDIOCIF_CTRL_CLIENT_CHANNELS_MASK); val |= ((audio_ch - 1) << TEGRA30_AUDIOCIF_CTRL_AUDIO_CHANNELS_SHIFT) | ((client_ch - 1) << TEGRA30_AUDIOCIF_CTRL_CLIENT_CHANNELS_SHIFT); tegra30_apbif_write(reg, val); return 0; }
int tegra30_ahub_allocate_tx_fifo(enum tegra30_ahub_txcif *txcif, unsigned long *fiforeg, unsigned long *reqsel) { int channel; u32 reg, val; channel = find_first_zero_bit(ahub->tx_usage, TEGRA30_AHUB_CHANNEL_CTRL_COUNT); if (channel >= TEGRA30_AHUB_CHANNEL_CTRL_COUNT) return -EBUSY; __set_bit(channel, ahub->tx_usage); *txcif = TEGRA30_AHUB_TXCIF_APBIF_TX0 + channel; *fiforeg = ahub->apbif_addr + TEGRA30_AHUB_CHANNEL_TXFIFO + (channel * TEGRA30_AHUB_CHANNEL_TXFIFO_STRIDE); *reqsel = ahub->dma_sel + channel; tegra30_ahub_soft_reset_tx_channel(channel); reg = TEGRA30_AHUB_CHANNEL_CTRL + (channel * TEGRA30_AHUB_CHANNEL_CTRL_STRIDE); val = tegra30_apbif_read(reg); val &= ~(TEGRA30_AHUB_CHANNEL_CTRL_TX_THRESHOLD_MASK | TEGRA30_AHUB_CHANNEL_CTRL_TX_PACK_MASK); val |= (7 << TEGRA30_AHUB_CHANNEL_CTRL_TX_THRESHOLD_SHIFT) | TEGRA30_AHUB_CHANNEL_CTRL_TX_PACK_EN | TEGRA30_AHUB_CHANNEL_CTRL_TX_PACK_16; tegra30_apbif_write(reg, val); reg = TEGRA30_AHUB_CIF_TX_CTRL + (channel * TEGRA30_AHUB_CIF_TX_CTRL_STRIDE); val = (0 << TEGRA30_AUDIOCIF_CTRL_FIFO_THRESHOLD_SHIFT) | (1 << TEGRA30_AUDIOCIF_CTRL_AUDIO_CHANNELS_SHIFT) | (1 << TEGRA30_AUDIOCIF_CTRL_CLIENT_CHANNELS_SHIFT) | TEGRA30_AUDIOCIF_CTRL_AUDIO_BITS_16 | TEGRA30_AUDIOCIF_CTRL_CLIENT_BITS_16 | TEGRA30_AUDIOCIF_CTRL_DIRECTION_TX; tegra30_apbif_write(reg, val); return 0; }
int tegra30_ahub_set_tx_fifo_pack_mode(enum tegra30_ahub_txcif txcif, unsigned int pack_mode) { int channel = txcif - TEGRA30_AHUB_TXCIF_APBIF_TX0; int reg, val; reg = TEGRA30_AHUB_CHANNEL_CTRL + (channel * TEGRA30_AHUB_CHANNEL_CTRL_STRIDE); val = tegra30_apbif_read(reg); val &= ~TEGRA30_AHUB_CHANNEL_CTRL_TX_PACK_MASK; val &= ~TEGRA30_AHUB_CHANNEL_CTRL_TX_PACK_EN; if ((pack_mode == TEGRA30_AHUB_CHANNEL_CTRL_TX_PACK_16) || (pack_mode == TEGRA30_AHUB_CHANNEL_CTRL_TX_PACK_8_4)) val |= (TEGRA30_AHUB_CHANNEL_CTRL_TX_PACK_EN | pack_mode); tegra30_apbif_write(reg, val); return 0; }