Message ID | 5466463.9HBcuLFGQf@wuerfel (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 14.11.2015 02:22, Arnd Bergmann wrote: > 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: Arnd Bergmann <arnd@arndb.de> The patch looks good. I have only two questions below. > > diff --git a/arch/arm/mach-s3c64xx/dev-audio.c b/arch/arm/mach-s3c64xx/dev-audio.c > index ff780a8d8366..9a42736ef4ac 100644 > --- a/arch/arm/mach-s3c64xx/dev-audio.c > +++ b/arch/arm/mach-s3c64xx/dev-audio.c > @@ -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); > > diff --git a/arch/arm/mach-s3c64xx/include/mach/dma.h b/arch/arm/mach-s3c64xx/include/mach/dma.h > index 096e14073bd9..7a277dc15274 100644 > --- a/arch/arm/mach-s3c64xx/include/mach/dma.h > +++ b/arch/arm/mach-s3c64xx/include/mach/dma.h > @@ -11,41 +11,39 @@ > #ifndef __ASM_ARCH_DMA_H > #define __ASM_ARCH_DMA_H __FILE__ > > -#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_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_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 "spi0_tx" > +#define DMACH_SPI0_RX "spi0_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_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_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 "spi1_tx" > +#define DMACH_SPI1_RX "spi1_rx" > +#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 > diff --git a/arch/arm/plat-samsung/devs.c b/arch/arm/plat-samsung/devs.c > index 771729b3f102..3ce234f4c872 100644 > --- a/arch/arm/plat-samsung/devs.c > +++ b/arch/arm/plat-samsung/devs.c > @@ -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 */ > @@ -1088,8 +1093,8 @@ struct platform_device s3c_device_wdt = { > #ifdef CONFIG_S3C64XX_DEV_SPI0 > static struct resource s3c64xx_spi0_resource[] = { > [0] = DEFINE_RES_MEM(S3C_PA_SPI0, SZ_256), > - [1] = DEFINE_RES_DMA(DMACH_SPI0_TX), > - [2] = DEFINE_RES_DMA(DMACH_SPI0_RX), > + [1] = DEFINE_RES_DMA((uintptr_t)DMACH_SPI0_TX), > + [2] = DEFINE_RES_DMA((uintptr_t)DMACH_SPI0_RX), > [3] = DEFINE_RES_IRQ(IRQ_SPI0), > }; > > @@ -1133,8 +1138,8 @@ void __init s3c64xx_spi0_set_platdata(int (*cfg_gpio)(void), int src_clk_nr, > #ifdef CONFIG_S3C64XX_DEV_SPI1 > static struct resource s3c64xx_spi1_resource[] = { > [0] = DEFINE_RES_MEM(S3C_PA_SPI1, SZ_256), > - [1] = DEFINE_RES_DMA(DMACH_SPI1_TX), > - [2] = DEFINE_RES_DMA(DMACH_SPI1_RX), > + [1] = DEFINE_RES_DMA((uintptr_t)DMACH_SPI1_TX), > + [2] = DEFINE_RES_DMA((uintptr_t)DMACH_SPI1_RX), > [3] = DEFINE_RES_IRQ(IRQ_SPI1), > }; > > @@ -1176,8 +1181,8 @@ void __init s3c64xx_spi1_set_platdata(int (*cfg_gpio)(void), int src_clk_nr, > #ifdef CONFIG_S3C64XX_DEV_SPI2 > static struct resource s3c64xx_spi2_resource[] = { > [0] = DEFINE_RES_MEM(S3C_PA_SPI2, SZ_256), > - [1] = DEFINE_RES_DMA(DMACH_SPI2_TX), > - [2] = DEFINE_RES_DMA(DMACH_SPI2_RX), > + [1] = DEFINE_RES_DMA((uintptr_t)DMACH_SPI2_TX), > + [2] = DEFINE_RES_DMA((uintptr_t)DMACH_SPI2_RX), > [3] = DEFINE_RES_IRQ(IRQ_SPI2), > }; > > diff --git a/include/linux/platform_data/asoc-s3c.h b/include/linux/platform_data/asoc-s3c.h > index 5e0bc779e6c5..33f88b4479e4 100644 > --- a/include/linux/platform_data/asoc-s3c.h > +++ b/include/linux/platform_data/asoc-s3c.h > @@ -39,6 +39,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; > diff --git a/sound/soc/samsung/ac97.c b/sound/soc/samsung/ac97.c > index e4145509d63c..9c5219392460 100644 > --- a/sound/soc/samsung/ac97.c > +++ b/sound/soc/samsung/ac97.c > @@ -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); > diff --git a/sound/soc/samsung/dma.h b/sound/soc/samsung/dma.h > index 0e85dcfec023..085ef30f5ca2 100644 > --- a/sound/soc/samsung/dma.h > +++ b/sound/soc/samsung/dma.h > @@ -15,7 +15,7 @@ > #include <sound/dmaengine_pcm.h> > > struct s3c_dma_params { > - int channel; /* Channel ID */ > + void *slave; /* Channel ID */ > dma_addr_t dma_addr; > int dma_size; /* Size of the DMA transfer */ > char *ch_name; > diff --git a/sound/soc/samsung/dmaengine.c b/sound/soc/samsung/dmaengine.c > index 506f5bf6d082..727008d57d14 100644 > --- a/sound/soc/samsung/dmaengine.c > +++ b/sound/soc/samsung/dmaengine.c > @@ -50,14 +50,14 @@ void samsung_asoc_init_dma_data(struct snd_soc_dai *dai, > > if (playback) { > playback_data = &playback->dma_data; > - playback_data->filter_data = (void *)playback->channel; > + playback_data->filter_data = playback->slave; > playback_data->chan_name = playback->ch_name; > playback_data->addr = playback->dma_addr; > playback_data->addr_width = playback->dma_size; > } > if (capture) { > capture_data = &capture->dma_data; > - capture_data->filter_data = (void *)capture->channel; > + capture_data->filter_data = capture->slave; > capture_data->chan_name = capture->ch_name; > capture_data->addr = capture->dma_addr; > capture_data->addr_width = capture->dma_size; > diff --git a/sound/soc/samsung/i2s.c b/sound/soc/samsung/i2s.c > index ea4ab374a223..0945b5de39e7 100644 > --- a/sound/soc/samsung/i2s.c > +++ b/sound/soc/samsung/i2s.c > @@ -1257,27 +1257,14 @@ static int samsung_i2s_probe(struct platform_device *pdev) > pri_dai->lock = &pri_dai->spinlock; > > if (!np) { > - res = platform_get_resource(pdev, IORESOURCE_DMA, 0); > - if (!res) { > - dev_err(&pdev->dev, > - "Unable to get I2S-TX dma resource\n"); > - return -ENXIO; > - } > - pri_dai->dma_playback.channel = res->start; > - > - res = platform_get_resource(pdev, IORESOURCE_DMA, 1); > - if (!res) { > - dev_err(&pdev->dev, > - "Unable to get I2S-RX dma resource\n"); > - return -ENXIO; > - } > - pri_dai->dma_capture.channel = res->start; > - > if (i2s_pdata == NULL) { > dev_err(&pdev->dev, "Can't work without s3c_audio_pdata\n"); > return -EINVAL; > } > > + pri_dai->dma_playback.slave = i2s_pdata->dma_playback; > + pri_dai->dma_capture.slave = i2s_pdata->dma_capture; > + > if (&i2s_pdata->type) > i2s_cfg = &i2s_pdata->type.i2s; > > @@ -1338,11 +1325,8 @@ static int samsung_i2s_probe(struct platform_device *pdev) > sec_dai->dma_playback.dma_addr = regs_base + I2STXDS; > sec_dai->dma_playback.ch_name = "tx-sec"; > > - if (!np) { > - res = platform_get_resource(pdev, IORESOURCE_DMA, 2); > - if (res) > - sec_dai->dma_playback.channel = res->start; > - } > + if (!np) > + sec_dai->dma_playback.slave = i2s_pdata->dma_play_sec; I cannot this resource in original patch nor setting the 'dma_play_sec' part. I guess this does not really matter as newer platforms were converted to DT so 'np' will be set, right? > > sec_dai->dma_playback.dma_size = 4; > sec_dai->addr = pri_dai->addr; > diff --git a/sound/soc/samsung/pcm.c b/sound/soc/samsung/pcm.c > index b320a9d3fbf8..b5ee054dddc9 100644 > --- a/sound/soc/samsung/pcm.c > +++ b/sound/soc/samsung/pcm.c > @@ -486,7 +486,7 @@ static const struct snd_soc_component_driver s3c_pcm_component = { > static int s3c_pcm_dev_probe(struct platform_device *pdev) > { > struct s3c_pcm_info *pcm; > - struct resource *mem_res, *dmatx_res, *dmarx_res; > + struct resource *mem_res; > struct s3c_audio_pdata *pcm_pdata; > int ret; > > @@ -499,18 +499,6 @@ static int s3c_pcm_dev_probe(struct platform_device *pdev) > pcm_pdata = pdev->dev.platform_data; > > /* 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 PCM-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 PCM-RX dma resource\n"); > - return -ENXIO; > - } > - > mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); > if (!mem_res) { > dev_err(&pdev->dev, "Unable to get register resource\n"); > @@ -568,8 +556,8 @@ static int s3c_pcm_dev_probe(struct platform_device *pdev) > s3c_pcm_stereo_out[pdev->id].dma_addr = mem_res->start > + S3C_PCM_TXFIFO; > > - s3c_pcm_stereo_in[pdev->id].channel = dmarx_res->start; > - s3c_pcm_stereo_out[pdev->id].channel = dmatx_res->start; > + s3c_pcm_stereo_in[pdev->id].slave = pcm_pdata->dma_capture; > + s3c_pcm_stereo_out[pdev->id].slave = pcm_pdata->dma_playback; > > pcm->dma_capture = &s3c_pcm_stereo_in[pdev->id]; > pcm->dma_playback = &s3c_pcm_stereo_out[pdev->id]; > diff --git a/sound/soc/samsung/s3c2412-i2s.c b/sound/soc/samsung/s3c2412-i2s.c > index 2b766d212ce0..77d27c85a32a 100644 > --- a/sound/soc/samsung/s3c2412-i2s.c > +++ b/sound/soc/samsung/s3c2412-i2s.c > @@ -34,13 +34,13 @@ > #include "s3c2412-i2s.h" > > static struct s3c_dma_params s3c2412_i2s_pcm_stereo_out = { > - .channel = DMACH_I2S_OUT, > + .slave = (void *)(uintptr_t)DMACH_I2S_OUT, > .ch_name = "tx", > .dma_size = 4, > }; > > static struct s3c_dma_params s3c2412_i2s_pcm_stereo_in = { > - .channel = DMACH_I2S_IN, > + .slave = (void *)(uintptr_t)DMACH_I2S_IN, > .ch_name = "rx", > .dma_size = 4, > }; > diff --git a/sound/soc/samsung/s3c24xx-i2s.c b/sound/soc/samsung/s3c24xx-i2s.c > index 5bf723689692..9da3a77ea2c7 100644 > --- a/sound/soc/samsung/s3c24xx-i2s.c > +++ b/sound/soc/samsung/s3c24xx-i2s.c > @@ -32,13 +32,13 @@ > #include "s3c24xx-i2s.h" > > static struct s3c_dma_params s3c24xx_i2s_pcm_stereo_out = { > - .channel = DMACH_I2S_OUT, > + .slave = (void *)(uintptr_t)DMACH_I2S_OUT, > .ch_name = "tx", > .dma_size = 2, > }; > > static struct s3c_dma_params s3c24xx_i2s_pcm_stereo_in = { > - .channel = DMACH_I2S_IN, > + .slave = (void *)(uintptr_t)DMACH_I2S_IN, > .ch_name = "rx", > .dma_size = 2, > }; > diff --git a/sound/soc/samsung/spdif.c b/sound/soc/samsung/spdif.c > index 36dbc0e96004..087d49d1787c 100644 > --- a/sound/soc/samsung/spdif.c > +++ b/sound/soc/samsung/spdif.c > @@ -359,7 +359,7 @@ static const struct snd_soc_component_driver samsung_spdif_component = { > static int spdif_probe(struct platform_device *pdev) > { > struct s3c_audio_pdata *spdif_pdata; > - struct resource *mem_res, *dma_res; > + struct resource *mem_res; > struct samsung_spdif_info *spdif; > int ret; > > @@ -367,12 +367,6 @@ static int spdif_probe(struct platform_device *pdev) > > dev_dbg(&pdev->dev, "Entered %s\n", __func__); > > - dma_res = platform_get_resource(pdev, IORESOURCE_DMA, 0); > - if (!dma_res) { > - dev_err(&pdev->dev, "Unable to get dma resource.\n"); > - return -ENXIO; > - } > - > mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); > if (!mem_res) { > dev_err(&pdev->dev, "Unable to get register resource.\n"); > @@ -432,7 +426,7 @@ static int spdif_probe(struct platform_device *pdev) > > spdif_stereo_out.dma_size = 2; > spdif_stereo_out.dma_addr = mem_res->start + DATA_OUTBUF; > - spdif_stereo_out.channel = dma_res->start; > + spdif_stereo_out.slave = spdif_pdata->dma_playback; > > spdif->dma_playback = &spdif_stereo_out; No one sets ioresources and pdata for spdif device. No in-kernel board files for it? Best regards, Krzysztof
On Tuesday 17 November 2015 10:16:36 Krzysztof Kozlowski wrote: > On 14.11.2015 02:22, Arnd Bergmann wrote: > > 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: Arnd Bergmann <arnd@arndb.de> > > The patch looks good. I have only two questions below. Thanks for taking a look! > > @@ -1338,11 +1325,8 @@ static int samsung_i2s_probe(struct platform_device *pdev) > > sec_dai->dma_playback.dma_addr = regs_base + I2STXDS; > > sec_dai->dma_playback.ch_name = "tx-sec"; > > > > - if (!np) { > > - res = platform_get_resource(pdev, IORESOURCE_DMA, 2); > > - if (res) > > - sec_dai->dma_playback.channel = res->start; > > - } > > + if (!np) > > + sec_dai->dma_playback.slave = i2s_pdata->dma_play_sec; > > I cannot this resource in original patch nor setting the 'dma_play_sec' > part. I guess this does not really matter as newer platforms were > converted to DT so 'np' will be set, right? Yes, that sounds correct. > > @@ -367,12 +367,6 @@ static int spdif_probe(struct platform_device *pdev) > > > > dev_dbg(&pdev->dev, "Entered %s\n", __func__); > > > > - dma_res = platform_get_resource(pdev, IORESOURCE_DMA, 0); > > - if (!dma_res) { > > - dev_err(&pdev->dev, "Unable to get dma resource.\n"); > > - return -ENXIO; > > - } > > - > > mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); > > if (!mem_res) { > > dev_err(&pdev->dev, "Unable to get register resource.\n"); > > @@ -432,7 +426,7 @@ static int spdif_probe(struct platform_device *pdev) > > > > spdif_stereo_out.dma_size = 2; > > spdif_stereo_out.dma_addr = mem_res->start + DATA_OUTBUF; > > - spdif_stereo_out.channel = dma_res->start; > > + spdif_stereo_out.slave = spdif_pdata->dma_playback; > > > > spdif->dma_playback = &spdif_stereo_out; > > No one sets ioresources and pdata for spdif device. No in-kernel board > files for it? Hmm, probably also a missing conversion to devicetree. The symbol used to be config SND_SOC_SAMSUNG_SMDK_SPDIF tristate "SoC S/PDIF Audio support for SMDK" - depends on SND_SOC_SAMSUNG && (MACH_SMDKC100 || MACH_SMDKC110 || MACH_SMDKV210 || MACH_SMDKV310 || MACH_SMDK4212) + depends on SND_SOC_SAMSUNG select SND_SAMSUNG_SPDIF We still support all four of the above boards, but they are all DT-only and neither spdif.c nor smdk-spdif.c ever gained DT support. Is there anything I should change in this patch for this? Arnd
On 17.11.2015 19:24, Arnd Bergmann wrote: > On Tuesday 17 November 2015 10:16:36 Krzysztof Kozlowski wrote: >> On 14.11.2015 02:22, Arnd Bergmann wrote: >>> 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: Arnd Bergmann <arnd@arndb.de> >> >> The patch looks good. I have only two questions below. > > Thanks for taking a look! > >>> @@ -1338,11 +1325,8 @@ static int samsung_i2s_probe(struct platform_device *pdev) >>> sec_dai->dma_playback.dma_addr = regs_base + I2STXDS; >>> sec_dai->dma_playback.ch_name = "tx-sec"; >>> >>> - if (!np) { >>> - res = platform_get_resource(pdev, IORESOURCE_DMA, 2); >>> - if (res) >>> - sec_dai->dma_playback.channel = res->start; >>> - } >>> + if (!np) >>> + sec_dai->dma_playback.slave = i2s_pdata->dma_play_sec; >> >> I cannot this resource in original patch nor setting the 'dma_play_sec' >> part. I guess this does not really matter as newer platforms were >> converted to DT so 'np' will be set, right? > > Yes, that sounds correct. > >>> @@ -367,12 +367,6 @@ static int spdif_probe(struct platform_device *pdev) >>> >>> dev_dbg(&pdev->dev, "Entered %s\n", __func__); >>> >>> - dma_res = platform_get_resource(pdev, IORESOURCE_DMA, 0); >>> - if (!dma_res) { >>> - dev_err(&pdev->dev, "Unable to get dma resource.\n"); >>> - return -ENXIO; >>> - } >>> - >>> mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); >>> if (!mem_res) { >>> dev_err(&pdev->dev, "Unable to get register resource.\n"); >>> @@ -432,7 +426,7 @@ static int spdif_probe(struct platform_device *pdev) >>> >>> spdif_stereo_out.dma_size = 2; >>> spdif_stereo_out.dma_addr = mem_res->start + DATA_OUTBUF; >>> - spdif_stereo_out.channel = dma_res->start; >>> + spdif_stereo_out.slave = spdif_pdata->dma_playback; >>> >>> spdif->dma_playback = &spdif_stereo_out; >> >> No one sets ioresources and pdata for spdif device. No in-kernel board >> files for it? > > Hmm, probably also a missing conversion to devicetree. The symbol used to be > > config SND_SOC_SAMSUNG_SMDK_SPDIF > tristate "SoC S/PDIF Audio support for SMDK" > - depends on SND_SOC_SAMSUNG && (MACH_SMDKC100 || MACH_SMDKC110 || MACH_SMDKV210 || MACH_SMDKV310 || MACH_SMDK4212) > + depends on SND_SOC_SAMSUNG > select SND_SAMSUNG_SPDIF > > We still support all four of the above boards, but they are all DT-only > and neither spdif.c nor smdk-spdif.c ever gained DT support. Is there > anything I should change in this patch for this? No, I think it is okay. I'll review the v2 you sent. Best regards, Krzysztof
diff --git a/arch/arm/mach-s3c64xx/dev-audio.c b/arch/arm/mach-s3c64xx/dev-audio.c index ff780a8d8366..9a42736ef4ac 100644 --- a/arch/arm/mach-s3c64xx/dev-audio.c +++ b/arch/arm/mach-s3c64xx/dev-audio.c @@ -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); diff --git a/arch/arm/mach-s3c64xx/include/mach/dma.h b/arch/arm/mach-s3c64xx/include/mach/dma.h index 096e14073bd9..7a277dc15274 100644 --- a/arch/arm/mach-s3c64xx/include/mach/dma.h +++ b/arch/arm/mach-s3c64xx/include/mach/dma.h @@ -11,41 +11,39 @@ #ifndef __ASM_ARCH_DMA_H #define __ASM_ARCH_DMA_H __FILE__ -#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_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_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 "spi0_tx" +#define DMACH_SPI0_RX "spi0_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_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_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 "spi1_tx" +#define DMACH_SPI1_RX "spi1_rx" +#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 diff --git a/arch/arm/plat-samsung/devs.c b/arch/arm/plat-samsung/devs.c index 771729b3f102..3ce234f4c872 100644 --- a/arch/arm/plat-samsung/devs.c +++ b/arch/arm/plat-samsung/devs.c @@ -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 */ @@ -1088,8 +1093,8 @@ struct platform_device s3c_device_wdt = { #ifdef CONFIG_S3C64XX_DEV_SPI0 static struct resource s3c64xx_spi0_resource[] = { [0] = DEFINE_RES_MEM(S3C_PA_SPI0, SZ_256), - [1] = DEFINE_RES_DMA(DMACH_SPI0_TX), - [2] = DEFINE_RES_DMA(DMACH_SPI0_RX), + [1] = DEFINE_RES_DMA((uintptr_t)DMACH_SPI0_TX), + [2] = DEFINE_RES_DMA((uintptr_t)DMACH_SPI0_RX), [3] = DEFINE_RES_IRQ(IRQ_SPI0), }; @@ -1133,8 +1138,8 @@ void __init s3c64xx_spi0_set_platdata(int (*cfg_gpio)(void), int src_clk_nr, #ifdef CONFIG_S3C64XX_DEV_SPI1 static struct resource s3c64xx_spi1_resource[] = { [0] = DEFINE_RES_MEM(S3C_PA_SPI1, SZ_256), - [1] = DEFINE_RES_DMA(DMACH_SPI1_TX), - [2] = DEFINE_RES_DMA(DMACH_SPI1_RX), + [1] = DEFINE_RES_DMA((uintptr_t)DMACH_SPI1_TX), + [2] = DEFINE_RES_DMA((uintptr_t)DMACH_SPI1_RX), [3] = DEFINE_RES_IRQ(IRQ_SPI1), }; @@ -1176,8 +1181,8 @@ void __init s3c64xx_spi1_set_platdata(int (*cfg_gpio)(void), int src_clk_nr, #ifdef CONFIG_S3C64XX_DEV_SPI2 static struct resource s3c64xx_spi2_resource[] = { [0] = DEFINE_RES_MEM(S3C_PA_SPI2, SZ_256), - [1] = DEFINE_RES_DMA(DMACH_SPI2_TX), - [2] = DEFINE_RES_DMA(DMACH_SPI2_RX), + [1] = DEFINE_RES_DMA((uintptr_t)DMACH_SPI2_TX), + [2] = DEFINE_RES_DMA((uintptr_t)DMACH_SPI2_RX), [3] = DEFINE_RES_IRQ(IRQ_SPI2), }; diff --git a/include/linux/platform_data/asoc-s3c.h b/include/linux/platform_data/asoc-s3c.h index 5e0bc779e6c5..33f88b4479e4 100644 --- a/include/linux/platform_data/asoc-s3c.h +++ b/include/linux/platform_data/asoc-s3c.h @@ -39,6 +39,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; diff --git a/sound/soc/samsung/ac97.c b/sound/soc/samsung/ac97.c index e4145509d63c..9c5219392460 100644 --- a/sound/soc/samsung/ac97.c +++ b/sound/soc/samsung/ac97.c @@ -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); diff --git a/sound/soc/samsung/dma.h b/sound/soc/samsung/dma.h index 0e85dcfec023..085ef30f5ca2 100644 --- a/sound/soc/samsung/dma.h +++ b/sound/soc/samsung/dma.h @@ -15,7 +15,7 @@ #include <sound/dmaengine_pcm.h> struct s3c_dma_params { - int channel; /* Channel ID */ + void *slave; /* Channel ID */ dma_addr_t dma_addr; int dma_size; /* Size of the DMA transfer */ char *ch_name; diff --git a/sound/soc/samsung/dmaengine.c b/sound/soc/samsung/dmaengine.c index 506f5bf6d082..727008d57d14 100644 --- a/sound/soc/samsung/dmaengine.c +++ b/sound/soc/samsung/dmaengine.c @@ -50,14 +50,14 @@ void samsung_asoc_init_dma_data(struct snd_soc_dai *dai, if (playback) { playback_data = &playback->dma_data; - playback_data->filter_data = (void *)playback->channel; + playback_data->filter_data = playback->slave; playback_data->chan_name = playback->ch_name; playback_data->addr = playback->dma_addr; playback_data->addr_width = playback->dma_size; } if (capture) { capture_data = &capture->dma_data; - capture_data->filter_data = (void *)capture->channel; + capture_data->filter_data = capture->slave; capture_data->chan_name = capture->ch_name; capture_data->addr = capture->dma_addr; capture_data->addr_width = capture->dma_size; diff --git a/sound/soc/samsung/i2s.c b/sound/soc/samsung/i2s.c index ea4ab374a223..0945b5de39e7 100644 --- a/sound/soc/samsung/i2s.c +++ b/sound/soc/samsung/i2s.c @@ -1257,27 +1257,14 @@ static int samsung_i2s_probe(struct platform_device *pdev) pri_dai->lock = &pri_dai->spinlock; if (!np) { - res = platform_get_resource(pdev, IORESOURCE_DMA, 0); - if (!res) { - dev_err(&pdev->dev, - "Unable to get I2S-TX dma resource\n"); - return -ENXIO; - } - pri_dai->dma_playback.channel = res->start; - - res = platform_get_resource(pdev, IORESOURCE_DMA, 1); - if (!res) { - dev_err(&pdev->dev, - "Unable to get I2S-RX dma resource\n"); - return -ENXIO; - } - pri_dai->dma_capture.channel = res->start; - if (i2s_pdata == NULL) { dev_err(&pdev->dev, "Can't work without s3c_audio_pdata\n"); return -EINVAL; } + pri_dai->dma_playback.slave = i2s_pdata->dma_playback; + pri_dai->dma_capture.slave = i2s_pdata->dma_capture; + if (&i2s_pdata->type) i2s_cfg = &i2s_pdata->type.i2s; @@ -1338,11 +1325,8 @@ static int samsung_i2s_probe(struct platform_device *pdev) sec_dai->dma_playback.dma_addr = regs_base + I2STXDS; sec_dai->dma_playback.ch_name = "tx-sec"; - if (!np) { - res = platform_get_resource(pdev, IORESOURCE_DMA, 2); - if (res) - sec_dai->dma_playback.channel = res->start; - } + if (!np) + sec_dai->dma_playback.slave = i2s_pdata->dma_play_sec; sec_dai->dma_playback.dma_size = 4; sec_dai->addr = pri_dai->addr; diff --git a/sound/soc/samsung/pcm.c b/sound/soc/samsung/pcm.c index b320a9d3fbf8..b5ee054dddc9 100644 --- a/sound/soc/samsung/pcm.c +++ b/sound/soc/samsung/pcm.c @@ -486,7 +486,7 @@ static const struct snd_soc_component_driver s3c_pcm_component = { static int s3c_pcm_dev_probe(struct platform_device *pdev) { struct s3c_pcm_info *pcm; - struct resource *mem_res, *dmatx_res, *dmarx_res; + struct resource *mem_res; struct s3c_audio_pdata *pcm_pdata; int ret; @@ -499,18 +499,6 @@ static int s3c_pcm_dev_probe(struct platform_device *pdev) pcm_pdata = pdev->dev.platform_data; /* 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 PCM-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 PCM-RX dma resource\n"); - return -ENXIO; - } - mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!mem_res) { dev_err(&pdev->dev, "Unable to get register resource\n"); @@ -568,8 +556,8 @@ static int s3c_pcm_dev_probe(struct platform_device *pdev) s3c_pcm_stereo_out[pdev->id].dma_addr = mem_res->start + S3C_PCM_TXFIFO; - s3c_pcm_stereo_in[pdev->id].channel = dmarx_res->start; - s3c_pcm_stereo_out[pdev->id].channel = dmatx_res->start; + s3c_pcm_stereo_in[pdev->id].slave = pcm_pdata->dma_capture; + s3c_pcm_stereo_out[pdev->id].slave = pcm_pdata->dma_playback; pcm->dma_capture = &s3c_pcm_stereo_in[pdev->id]; pcm->dma_playback = &s3c_pcm_stereo_out[pdev->id]; diff --git a/sound/soc/samsung/s3c2412-i2s.c b/sound/soc/samsung/s3c2412-i2s.c index 2b766d212ce0..77d27c85a32a 100644 --- a/sound/soc/samsung/s3c2412-i2s.c +++ b/sound/soc/samsung/s3c2412-i2s.c @@ -34,13 +34,13 @@ #include "s3c2412-i2s.h" static struct s3c_dma_params s3c2412_i2s_pcm_stereo_out = { - .channel = DMACH_I2S_OUT, + .slave = (void *)(uintptr_t)DMACH_I2S_OUT, .ch_name = "tx", .dma_size = 4, }; static struct s3c_dma_params s3c2412_i2s_pcm_stereo_in = { - .channel = DMACH_I2S_IN, + .slave = (void *)(uintptr_t)DMACH_I2S_IN, .ch_name = "rx", .dma_size = 4, }; diff --git a/sound/soc/samsung/s3c24xx-i2s.c b/sound/soc/samsung/s3c24xx-i2s.c index 5bf723689692..9da3a77ea2c7 100644 --- a/sound/soc/samsung/s3c24xx-i2s.c +++ b/sound/soc/samsung/s3c24xx-i2s.c @@ -32,13 +32,13 @@ #include "s3c24xx-i2s.h" static struct s3c_dma_params s3c24xx_i2s_pcm_stereo_out = { - .channel = DMACH_I2S_OUT, + .slave = (void *)(uintptr_t)DMACH_I2S_OUT, .ch_name = "tx", .dma_size = 2, }; static struct s3c_dma_params s3c24xx_i2s_pcm_stereo_in = { - .channel = DMACH_I2S_IN, + .slave = (void *)(uintptr_t)DMACH_I2S_IN, .ch_name = "rx", .dma_size = 2, }; diff --git a/sound/soc/samsung/spdif.c b/sound/soc/samsung/spdif.c index 36dbc0e96004..087d49d1787c 100644 --- a/sound/soc/samsung/spdif.c +++ b/sound/soc/samsung/spdif.c @@ -359,7 +359,7 @@ static const struct snd_soc_component_driver samsung_spdif_component = { static int spdif_probe(struct platform_device *pdev) { struct s3c_audio_pdata *spdif_pdata; - struct resource *mem_res, *dma_res; + struct resource *mem_res; struct samsung_spdif_info *spdif; int ret; @@ -367,12 +367,6 @@ static int spdif_probe(struct platform_device *pdev) dev_dbg(&pdev->dev, "Entered %s\n", __func__); - dma_res = platform_get_resource(pdev, IORESOURCE_DMA, 0); - if (!dma_res) { - dev_err(&pdev->dev, "Unable to get dma resource.\n"); - return -ENXIO; - } - mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!mem_res) { dev_err(&pdev->dev, "Unable to get register resource.\n"); @@ -432,7 +426,7 @@ static int spdif_probe(struct platform_device *pdev) spdif_stereo_out.dma_size = 2; spdif_stereo_out.dma_addr = mem_res->start + DATA_OUTBUF; - spdif_stereo_out.channel = dma_res->start; + spdif_stereo_out.slave = spdif_pdata->dma_playback; spdif->dma_playback = &spdif_stereo_out;
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: Arnd Bergmann <arnd@arndb.de>