Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b8fb4907 authored by Peter Ujfalusi's avatar Peter Ujfalusi Committed by Liam Girdwood
Browse files

ASoC: omap-mcbsp: Simplify DMA configuration



Configure the DMA request line, port address, and stream name at
probe time instead of every time we start a stream.
These settings are static in the system.

Signed-off-by: default avatarPeter Ujfalusi <peter.ujfalusi@ti.com>
Tested-by: default avatarGrazvydas Ignotas <notasas@gmail.com>
Tested-by: default avatarJanusz Krzysztofik <jkrzyszt@tis.icnet.pl>
Acked-by: default avatarMark Brown <broonie@opensource.wolfsonmicro.com>
Acked-by: default avatarJarkko Nikula <jarkko.nikula@bitmer.com>
Signed-off-by: default avatarLiam Girdwood <lrg@ti.com>
parent 256d9c25
Loading
Loading
Loading
Loading
+10 −19
Original line number Original line Diff line number Diff line
@@ -175,22 +175,6 @@ void omap_mcbsp_config(struct omap_mcbsp *mcbsp,
	}
	}
}
}


/**
 * omap_mcbsp_dma_params - returns the dma channel number
 * @id - mcbsp id
 * @stream - indicates the direction of data flow (rx or tx)
 *
 * Returns the dma channel number for the rx channel or tx channel
 * based on the value of @stream for the requested mcbsp given by @id
 */
int omap_mcbsp_dma_ch_params(struct omap_mcbsp *mcbsp, unsigned int stream)
{
	if (stream)
		return mcbsp->dma_rx_sync;
	else
		return mcbsp->dma_tx_sync;
}

/**
/**
 * omap_mcbsp_dma_reg_params - returns the address of mcbsp data register
 * omap_mcbsp_dma_reg_params - returns the address of mcbsp data register
 * @id - mcbsp id
 * @id - mcbsp id
@@ -200,7 +184,8 @@ int omap_mcbsp_dma_ch_params(struct omap_mcbsp *mcbsp, unsigned int stream)
 * to be used by DMA for transferring/receiving data based on the value of
 * to be used by DMA for transferring/receiving data based on the value of
 * @stream for the requested mcbsp given by @id
 * @stream for the requested mcbsp given by @id
 */
 */
int omap_mcbsp_dma_reg_params(struct omap_mcbsp *mcbsp, unsigned int stream)
static int omap_mcbsp_dma_reg_params(struct omap_mcbsp *mcbsp,
				     unsigned int stream)
{
{
	int data_reg;
	int data_reg;


@@ -983,14 +968,20 @@ int __devinit omap_mcbsp_init(struct platform_device *pdev)
		dev_err(&pdev->dev, "invalid rx DMA channel\n");
		dev_err(&pdev->dev, "invalid rx DMA channel\n");
		return -ENODEV;
		return -ENODEV;
	}
	}
	mcbsp->dma_rx_sync = res->start;
	/* RX DMA request number, and port address configuration */
	mcbsp->dma_data[1].name = "Audio Capture";
	mcbsp->dma_data[1].dma_req = res->start;
	mcbsp->dma_data[1].port_addr = omap_mcbsp_dma_reg_params(mcbsp, 1);


	res = platform_get_resource_byname(pdev, IORESOURCE_DMA, "tx");
	res = platform_get_resource_byname(pdev, IORESOURCE_DMA, "tx");
	if (!res) {
	if (!res) {
		dev_err(&pdev->dev, "invalid tx DMA channel\n");
		dev_err(&pdev->dev, "invalid tx DMA channel\n");
		return -ENODEV;
		return -ENODEV;
	}
	}
	mcbsp->dma_tx_sync = res->start;
	/* TX DMA request number, and port address configuration */
	mcbsp->dma_data[0].name = "Audio Playback";
	mcbsp->dma_data[0].dma_req = res->start;
	mcbsp->dma_data[0].port_addr = omap_mcbsp_dma_reg_params(mcbsp, 0);


	mcbsp->fclk = clk_get(&pdev->dev, "fck");
	mcbsp->fclk = clk_get(&pdev->dev, "fck");
	if (IS_ERR(mcbsp->fclk)) {
	if (IS_ERR(mcbsp->fclk)) {
+0 −7
Original line number Original line Diff line number Diff line
@@ -288,10 +288,6 @@ struct omap_mcbsp {
	int rx_irq;
	int rx_irq;
	int tx_irq;
	int tx_irq;


	/* DMA stuff */
	u8 dma_rx_sync;
	u8 dma_tx_sync;

	/* Protect the field .free, while checking if the mcbsp is in use */
	/* Protect the field .free, while checking if the mcbsp is in use */
	struct omap_mcbsp_platform_data *pdata;
	struct omap_mcbsp_platform_data *pdata;
	struct omap_mcbsp_st_data *st_data;
	struct omap_mcbsp_st_data *st_data;
@@ -328,9 +324,6 @@ int omap2_mcbsp_set_clks_src(struct omap_mcbsp *mcbsp, u8 fck_src_id);
void omap2_mcbsp1_mux_clkr_src(struct omap_mcbsp *mcbsp, u8 mux);
void omap2_mcbsp1_mux_clkr_src(struct omap_mcbsp *mcbsp, u8 mux);
void omap2_mcbsp1_mux_fsr_src(struct omap_mcbsp *mcbsp, u8 mux);
void omap2_mcbsp1_mux_fsr_src(struct omap_mcbsp *mcbsp, u8 mux);


int omap_mcbsp_dma_ch_params(struct omap_mcbsp *mcbsp, unsigned int stream);
int omap_mcbsp_dma_reg_params(struct omap_mcbsp *mcbsp, unsigned int stream);

/* Sidetone specific API */
/* Sidetone specific API */
int omap_st_set_chgain(struct omap_mcbsp *mcbsp, int channel, s16 chgain);
int omap_st_set_chgain(struct omap_mcbsp *mcbsp, int channel, s16 chgain);
int omap_st_get_chgain(struct omap_mcbsp *mcbsp, int channel, s16 *chgain);
int omap_st_get_chgain(struct omap_mcbsp *mcbsp, int channel, s16 *chgain);
+0 −8
Original line number Original line Diff line number Diff line
@@ -225,17 +225,12 @@ static int omap_mcbsp_dai_hw_params(struct snd_pcm_substream *substream,
	struct omap_mcbsp *mcbsp = snd_soc_dai_get_drvdata(cpu_dai);
	struct omap_mcbsp *mcbsp = snd_soc_dai_get_drvdata(cpu_dai);
	struct omap_mcbsp_reg_cfg *regs = &mcbsp->cfg_regs;
	struct omap_mcbsp_reg_cfg *regs = &mcbsp->cfg_regs;
	struct omap_pcm_dma_data *dma_data;
	struct omap_pcm_dma_data *dma_data;
	int dma;
	int wlen, channels, wpf, sync_mode = OMAP_DMA_SYNC_ELEMENT;
	int wlen, channels, wpf, sync_mode = OMAP_DMA_SYNC_ELEMENT;
	int pkt_size = 0;
	int pkt_size = 0;
	unsigned long port;
	unsigned int format, div, framesize, master;
	unsigned int format, div, framesize, master;


	dma_data = &mcbsp->dma_data[substream->stream];
	dma_data = &mcbsp->dma_data[substream->stream];


	dma = omap_mcbsp_dma_ch_params(mcbsp, substream->stream);
	port = omap_mcbsp_dma_reg_params(mcbsp, substream->stream);

	switch (params_format(params)) {
	switch (params_format(params)) {
	case SNDRV_PCM_FORMAT_S16_LE:
	case SNDRV_PCM_FORMAT_S16_LE:
		dma_data->data_type = OMAP_DMA_DATA_TYPE_S16;
		dma_data->data_type = OMAP_DMA_DATA_TYPE_S16;
@@ -291,9 +286,6 @@ static int omap_mcbsp_dai_hw_params(struct snd_pcm_substream *substream,
		}
		}
	}
	}


	dma_data->name = substream->stream ? "Audio Capture" : "Audio Playback";
	dma_data->dma_req = dma;
	dma_data->port_addr = port;
	dma_data->sync_mode = sync_mode;
	dma_data->sync_mode = sync_mode;
	dma_data->packet_size = pkt_size;
	dma_data->packet_size = pkt_size;