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

Commit 00f9443a authored by Arnd Bergmann's avatar Arnd Bergmann Committed by Sasha Levin
Browse files

ASoC: samsung: pass DMA channels as pointers



[ Upstream commit b9a1a743818ea3265abf98f9431623afa8c50c86 ]

ARM64 allmodconfig produces a bunch of warnings when building the
samsung ASoC code:

sound/soc/samsung/dmaengine.c: In function 'samsung_asoc_init_dma_data':
sound/soc/samsung/dmaengine.c:53:32: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
   playback_data->filter_data = (void *)playback->channel;
sound/soc/samsung/dmaengine.c:60:31: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
   capture_data->filter_data = (void *)capture->channel;

We could easily shut up the warning by adding an intermediate cast,
but there is a bigger underlying problem: The use of IORESOURCE_DMA
to pass data from platform code to device drivers is dubious to start
with, as what we really want is a pointer that can be passed into
a filter function.

Note that on s3c64xx, the pl08x DMA data is already a pointer, but
gets cast to resource_size_t so we can pass it as a resource, and it
then gets converted back to a pointer. In contrast, the data we pass
for s3c24xx is an index into a device specific table, and we artificially
convert that into a pointer for the filter function.

Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
Reviewed-by: default avatarKrzysztof Kozlowski <k.kozlowski@samsung.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
Signed-off-by: default avatarSasha Levin <sasha.levin@oracle.com>
parent 68b8c387
Loading
Loading
Loading
Loading
+23 −18
Original line number Diff line number Diff line
@@ -54,12 +54,12 @@ static int s3c64xx_i2s_cfg_gpio(struct platform_device *pdev)

static struct resource s3c64xx_iis0_resource[] = {
	[0] = DEFINE_RES_MEM(S3C64XX_PA_IIS0, SZ_256),
	[1] = DEFINE_RES_DMA(DMACH_I2S0_OUT),
	[2] = DEFINE_RES_DMA(DMACH_I2S0_IN),
};

static struct s3c_audio_pdata i2sv3_pdata = {
static struct s3c_audio_pdata i2s0_pdata = {
	.cfg_gpio = s3c64xx_i2s_cfg_gpio,
	.dma_playback = DMACH_I2S0_OUT,
	.dma_capture = DMACH_I2S0_IN,
};

struct platform_device s3c64xx_device_iis0 = {
@@ -68,15 +68,19 @@ struct platform_device s3c64xx_device_iis0 = {
	.num_resources	  = ARRAY_SIZE(s3c64xx_iis0_resource),
	.resource	  = s3c64xx_iis0_resource,
	.dev = {
		.platform_data = &i2sv3_pdata,
		.platform_data = &i2s0_pdata,
	},
};
EXPORT_SYMBOL(s3c64xx_device_iis0);

static struct resource s3c64xx_iis1_resource[] = {
	[0] = DEFINE_RES_MEM(S3C64XX_PA_IIS1, SZ_256),
	[1] = DEFINE_RES_DMA(DMACH_I2S1_OUT),
	[2] = DEFINE_RES_DMA(DMACH_I2S1_IN),
};

static struct s3c_audio_pdata i2s1_pdata = {
	.cfg_gpio = s3c64xx_i2s_cfg_gpio,
	.dma_playback = DMACH_I2S1_OUT,
	.dma_capture = DMACH_I2S1_IN,
};

struct platform_device s3c64xx_device_iis1 = {
@@ -85,19 +89,19 @@ struct platform_device s3c64xx_device_iis1 = {
	.num_resources	  = ARRAY_SIZE(s3c64xx_iis1_resource),
	.resource	  = s3c64xx_iis1_resource,
	.dev = {
		.platform_data = &i2sv3_pdata,
		.platform_data = &i2s1_pdata,
	},
};
EXPORT_SYMBOL(s3c64xx_device_iis1);

static struct resource s3c64xx_iisv4_resource[] = {
	[0] = DEFINE_RES_MEM(S3C64XX_PA_IISV4, SZ_256),
	[1] = DEFINE_RES_DMA(DMACH_HSI_I2SV40_TX),
	[2] = DEFINE_RES_DMA(DMACH_HSI_I2SV40_RX),
};

static struct s3c_audio_pdata i2sv4_pdata = {
	.cfg_gpio = s3c64xx_i2s_cfg_gpio,
	.dma_playback = DMACH_HSI_I2SV40_TX,
	.dma_capture = DMACH_HSI_I2SV40_RX,
	.type = {
		.i2s = {
			.quirks = QUIRK_PRI_6CHAN,
@@ -142,12 +146,12 @@ static int s3c64xx_pcm_cfg_gpio(struct platform_device *pdev)

static struct resource s3c64xx_pcm0_resource[] = {
	[0] = DEFINE_RES_MEM(S3C64XX_PA_PCM0, SZ_256),
	[1] = DEFINE_RES_DMA(DMACH_PCM0_TX),
	[2] = DEFINE_RES_DMA(DMACH_PCM0_RX),
};

static struct s3c_audio_pdata s3c_pcm0_pdata = {
	.cfg_gpio = s3c64xx_pcm_cfg_gpio,
	.dma_capture = DMACH_PCM0_RX,
	.dma_playback = DMACH_PCM0_TX,
};

struct platform_device s3c64xx_device_pcm0 = {
@@ -163,12 +167,12 @@ EXPORT_SYMBOL(s3c64xx_device_pcm0);

static struct resource s3c64xx_pcm1_resource[] = {
	[0] = DEFINE_RES_MEM(S3C64XX_PA_PCM1, SZ_256),
	[1] = DEFINE_RES_DMA(DMACH_PCM1_TX),
	[2] = DEFINE_RES_DMA(DMACH_PCM1_RX),
};

static struct s3c_audio_pdata s3c_pcm1_pdata = {
	.cfg_gpio = s3c64xx_pcm_cfg_gpio,
	.dma_playback = DMACH_PCM1_TX,
	.dma_capture = DMACH_PCM1_RX,
};

struct platform_device s3c64xx_device_pcm1 = {
@@ -196,13 +200,14 @@ static int s3c64xx_ac97_cfg_gpe(struct platform_device *pdev)

static struct resource s3c64xx_ac97_resource[] = {
	[0] = DEFINE_RES_MEM(S3C64XX_PA_AC97, SZ_256),
	[1] = DEFINE_RES_DMA(DMACH_AC97_PCMOUT),
	[2] = DEFINE_RES_DMA(DMACH_AC97_PCMIN),
	[3] = DEFINE_RES_DMA(DMACH_AC97_MICIN),
	[4] = DEFINE_RES_IRQ(IRQ_AC97),
	[1] = DEFINE_RES_IRQ(IRQ_AC97),
};

static struct s3c_audio_pdata s3c_ac97_pdata;
static struct s3c_audio_pdata s3c_ac97_pdata = {
	.dma_playback = DMACH_AC97_PCMOUT,
	.dma_capture = DMACH_AC97_PCMIN,
	.dma_capture_mic = DMACH_AC97_MICIN,
};

static u64 s3c64xx_ac97_dmamask = DMA_BIT_MASK(32);

+26 −26
Original line number Diff line number Diff line
@@ -14,38 +14,38 @@
#define S3C64XX_DMA_CHAN(name)		((unsigned long)(name))

/* DMA0/SDMA0 */
#define DMACH_UART0		S3C64XX_DMA_CHAN("uart0_tx")
#define DMACH_UART0_SRC2	S3C64XX_DMA_CHAN("uart0_rx")
#define DMACH_UART1		S3C64XX_DMA_CHAN("uart1_tx")
#define DMACH_UART1_SRC2	S3C64XX_DMA_CHAN("uart1_rx")
#define DMACH_UART2		S3C64XX_DMA_CHAN("uart2_tx")
#define DMACH_UART2_SRC2	S3C64XX_DMA_CHAN("uart2_rx")
#define DMACH_UART3		S3C64XX_DMA_CHAN("uart3_tx")
#define DMACH_UART3_SRC2	S3C64XX_DMA_CHAN("uart3_rx")
#define DMACH_PCM0_TX		S3C64XX_DMA_CHAN("pcm0_tx")
#define DMACH_PCM0_RX		S3C64XX_DMA_CHAN("pcm0_rx")
#define DMACH_I2S0_OUT		S3C64XX_DMA_CHAN("i2s0_tx")
#define DMACH_I2S0_IN		S3C64XX_DMA_CHAN("i2s0_rx")
#define DMACH_UART0		"uart0_tx"
#define DMACH_UART0_SRC2	"uart0_rx"
#define DMACH_UART1		"uart1_tx"
#define DMACH_UART1_SRC2	"uart1_rx"
#define DMACH_UART2		"uart2_tx"
#define DMACH_UART2_SRC2	"uart2_rx"
#define DMACH_UART3		"uart3_tx"
#define DMACH_UART3_SRC2	"uart3_rx"
#define DMACH_PCM0_TX		"pcm0_tx"
#define DMACH_PCM0_RX		"pcm0_rx"
#define DMACH_I2S0_OUT		"i2s0_tx"
#define DMACH_I2S0_IN		"i2s0_rx"
#define DMACH_SPI0_TX		S3C64XX_DMA_CHAN("spi0_tx")
#define DMACH_SPI0_RX		S3C64XX_DMA_CHAN("spi0_rx")
#define DMACH_HSI_I2SV40_TX	S3C64XX_DMA_CHAN("i2s2_tx")
#define DMACH_HSI_I2SV40_RX	S3C64XX_DMA_CHAN("i2s2_rx")
#define DMACH_HSI_I2SV40_TX	"i2s2_tx"
#define DMACH_HSI_I2SV40_RX	"i2s2_rx"

/* DMA1/SDMA1 */
#define DMACH_PCM1_TX		S3C64XX_DMA_CHAN("pcm1_tx")
#define DMACH_PCM1_RX		S3C64XX_DMA_CHAN("pcm1_rx")
#define DMACH_I2S1_OUT		S3C64XX_DMA_CHAN("i2s1_tx")
#define DMACH_I2S1_IN		S3C64XX_DMA_CHAN("i2s1_rx")
#define DMACH_PCM1_TX		"pcm1_tx"
#define DMACH_PCM1_RX		"pcm1_rx"
#define DMACH_I2S1_OUT		"i2s1_tx"
#define DMACH_I2S1_IN		"i2s1_rx"
#define DMACH_SPI1_TX		S3C64XX_DMA_CHAN("spi1_tx")
#define DMACH_SPI1_RX		S3C64XX_DMA_CHAN("spi1_rx")
#define DMACH_AC97_PCMOUT	S3C64XX_DMA_CHAN("ac97_out")
#define DMACH_AC97_PCMIN	S3C64XX_DMA_CHAN("ac97_in")
#define DMACH_AC97_MICIN	S3C64XX_DMA_CHAN("ac97_mic")
#define DMACH_PWM		S3C64XX_DMA_CHAN("pwm")
#define DMACH_IRDA		S3C64XX_DMA_CHAN("irda")
#define DMACH_EXTERNAL		S3C64XX_DMA_CHAN("external")
#define DMACH_SECURITY_RX	S3C64XX_DMA_CHAN("sec_rx")
#define DMACH_SECURITY_TX	S3C64XX_DMA_CHAN("sec_tx")
#define DMACH_AC97_PCMOUT	"ac97_out"
#define DMACH_AC97_PCMIN	"ac97_in"
#define DMACH_AC97_MICIN	"ac97_mic"
#define DMACH_PWM		"pwm"
#define DMACH_IRDA		"irda"
#define DMACH_EXTERNAL		"external"
#define DMACH_SECURITY_RX	"sec_rx"
#define DMACH_SECURITY_TX	"sec_tx"

enum dma_ch {
	DMACH_MAX = 32
+8 −3
Original line number Diff line number Diff line
@@ -65,6 +65,7 @@
#include <linux/platform_data/usb-ohci-s3c2410.h>
#include <plat/usb-phy.h>
#include <plat/regs-spi.h>
#include <linux/platform_data/asoc-s3c.h>
#include <linux/platform_data/spi-s3c64xx.h>

static u64 samsung_device_dma_mask = DMA_BIT_MASK(32);
@@ -74,9 +75,12 @@ static u64 samsung_device_dma_mask = DMA_BIT_MASK(32);
static struct resource s3c_ac97_resource[] = {
	[0] = DEFINE_RES_MEM(S3C2440_PA_AC97, S3C2440_SZ_AC97),
	[1] = DEFINE_RES_IRQ(IRQ_S3C244X_AC97),
	[2] = DEFINE_RES_DMA_NAMED(DMACH_PCM_OUT, "PCM out"),
	[3] = DEFINE_RES_DMA_NAMED(DMACH_PCM_IN, "PCM in"),
	[4] = DEFINE_RES_DMA_NAMED(DMACH_MIC_IN, "Mic in"),
};

static struct s3c_audio_pdata s3c_ac97_pdata = {
	.dma_playback = (void *)DMACH_PCM_OUT,
	.dma_capture = (void *)DMACH_PCM_IN,
	.dma_capture_mic = (void *)DMACH_MIC_IN,
};

struct platform_device s3c_device_ac97 = {
@@ -87,6 +91,7 @@ struct platform_device s3c_device_ac97 = {
	.dev		= {
		.dma_mask		= &samsung_device_dma_mask,
		.coherent_dma_mask	= DMA_BIT_MASK(32),
		.platform_data		= &s3c_ac97_pdata,
	}
};
#endif /* CONFIG_CPU_S3C2440 */
+4 −0
Original line number Diff line number Diff line
@@ -38,6 +38,10 @@ struct samsung_i2s {
 */
struct s3c_audio_pdata {
	int (*cfg_gpio)(struct platform_device *);
	void *dma_playback;
	void *dma_capture;
	void *dma_play_sec;
	void *dma_capture_mic;
	union {
		struct samsung_i2s i2s;
	} type;
+4 −22
Original line number Diff line number Diff line
@@ -324,7 +324,7 @@ static const struct snd_soc_component_driver s3c_ac97_component = {

static int s3c_ac97_probe(struct platform_device *pdev)
{
	struct resource *mem_res, *dmatx_res, *dmarx_res, *dmamic_res, *irq_res;
	struct resource *mem_res, *irq_res;
	struct s3c_audio_pdata *ac97_pdata;
	int ret;

@@ -335,24 +335,6 @@ static int s3c_ac97_probe(struct platform_device *pdev)
	}

	/* Check for availability of necessary resource */
	dmatx_res = platform_get_resource(pdev, IORESOURCE_DMA, 0);
	if (!dmatx_res) {
		dev_err(&pdev->dev, "Unable to get AC97-TX dma resource\n");
		return -ENXIO;
	}

	dmarx_res = platform_get_resource(pdev, IORESOURCE_DMA, 1);
	if (!dmarx_res) {
		dev_err(&pdev->dev, "Unable to get AC97-RX dma resource\n");
		return -ENXIO;
	}

	dmamic_res = platform_get_resource(pdev, IORESOURCE_DMA, 2);
	if (!dmamic_res) {
		dev_err(&pdev->dev, "Unable to get AC97-MIC dma resource\n");
		return -ENXIO;
	}

	irq_res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
	if (!irq_res) {
		dev_err(&pdev->dev, "AC97 IRQ not provided!\n");
@@ -364,11 +346,11 @@ static int s3c_ac97_probe(struct platform_device *pdev)
	if (IS_ERR(s3c_ac97.regs))
		return PTR_ERR(s3c_ac97.regs);

	s3c_ac97_pcm_out.channel = dmatx_res->start;
	s3c_ac97_pcm_out.slave = ac97_pdata->dma_playback;
	s3c_ac97_pcm_out.dma_addr = mem_res->start + S3C_AC97_PCM_DATA;
	s3c_ac97_pcm_in.channel = dmarx_res->start;
	s3c_ac97_pcm_in.slave = ac97_pdata->dma_capture;
	s3c_ac97_pcm_in.dma_addr = mem_res->start + S3C_AC97_PCM_DATA;
	s3c_ac97_mic_in.channel = dmamic_res->start;
	s3c_ac97_mic_in.slave = ac97_pdata->dma_capture_mic;
	s3c_ac97_mic_in.dma_addr = mem_res->start + S3C_AC97_MIC_DATA;

	init_completion(&s3c_ac97.done);
Loading