Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
c012cdc8
Commit
c012cdc8
authored
Aug 12, 2011
by
Takashi Iwai
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'fix/asoc' into for-linus
parents
15439bde
f6b864a9
Changes
18
Hide whitespace changes
Inline
Side-by-side
Showing
18 changed files
with
526 additions
and
19 deletions
+526
-19
MAINTAINERS
MAINTAINERS
+1
-1
include/sound/tlv320aic3x.h
include/sound/tlv320aic3x.h
+1
-1
sound/soc/codecs/wm8750.c
sound/soc/codecs/wm8750.c
+8
-0
sound/soc/codecs/wm8903.c
sound/soc/codecs/wm8903.c
+5
-0
sound/soc/codecs/wm8994.c
sound/soc/codecs/wm8994.c
+1
-0
sound/soc/omap/n810.c
sound/soc/omap/n810.c
+2
-2
sound/soc/omap/omap-mcbsp.c
sound/soc/omap/omap-mcbsp.c
+2
-2
sound/soc/omap/omap-mcbsp.h
sound/soc/omap/omap-mcbsp.h
+1
-1
sound/soc/omap/omap-pcm.c
sound/soc/omap/omap-pcm.c
+2
-2
sound/soc/omap/omap-pcm.h
sound/soc/omap/omap-pcm.h
+1
-1
sound/soc/omap/rx51.c
sound/soc/omap/rx51.c
+1
-1
sound/soc/samsung/Makefile
sound/soc/samsung/Makefile
+2
-0
sound/soc/samsung/idma.c
sound/soc/samsung/idma.c
+453
-0
sound/soc/samsung/idma.h
sound/soc/samsung/idma.h
+26
-0
sound/soc/samsung/jive_wm8750.c
sound/soc/samsung/jive_wm8750.c
+1
-1
sound/soc/samsung/speyside_wm8962.c
sound/soc/samsung/speyside_wm8962.c
+1
-1
sound/soc/tegra/tegra_pcm.c
sound/soc/tegra/tegra_pcm.c
+7
-2
sound/soc/tegra/tegra_wm8903.c
sound/soc/tegra/tegra_wm8903.c
+11
-4
No files found.
MAINTAINERS
View file @
c012cdc8
...
@@ -4604,7 +4604,7 @@ F: arch/arm/mach-omap2/clockdomain2xxx_3xxx.c
...
@@ -4604,7 +4604,7 @@ F: arch/arm/mach-omap2/clockdomain2xxx_3xxx.c
F: arch/arm/mach-omap2/clockdomain44xx.c
F: arch/arm/mach-omap2/clockdomain44xx.c
OMAP AUDIO SUPPORT
OMAP AUDIO SUPPORT
M: Jarkko Nikula <j
hnikula@gmail
.com>
M: Jarkko Nikula <j
arkko.nikula@bitmer
.com>
L: alsa-devel@alsa-project.org (subscribers-only)
L: alsa-devel@alsa-project.org (subscribers-only)
L: linux-omap@vger.kernel.org
L: linux-omap@vger.kernel.org
S: Maintained
S: Maintained
...
...
include/sound/tlv320aic3x.h
View file @
c012cdc8
/*
/*
* Platform data for Texas Instruments TLV320AIC3x codec
* Platform data for Texas Instruments TLV320AIC3x codec
*
*
* Author: Jarkko Nikula <j
hnikula@gmail
.com>
* Author: Jarkko Nikula <j
arkko.nikula@bitmer
.com>
*
*
* This program is free software; you can redistribute it and/or modify
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* it under the terms of the GNU General Public License version 2 as
...
...
sound/soc/codecs/wm8750.c
View file @
c012cdc8
...
@@ -778,11 +778,19 @@ static int __devexit wm8750_spi_remove(struct spi_device *spi)
...
@@ -778,11 +778,19 @@ static int __devexit wm8750_spi_remove(struct spi_device *spi)
return
0
;
return
0
;
}
}
static
const
struct
spi_device_id
wm8750_spi_ids
[]
=
{
{
"wm8750"
,
0
},
{
"wm8987"
,
0
},
{
},
};
MODULE_DEVICE_TABLE
(
spi
,
wm8750_spi_ids
);
static
struct
spi_driver
wm8750_spi_driver
=
{
static
struct
spi_driver
wm8750_spi_driver
=
{
.
driver
=
{
.
driver
=
{
.
name
=
"wm8750-codec"
,
.
name
=
"wm8750-codec"
,
.
owner
=
THIS_MODULE
,
.
owner
=
THIS_MODULE
,
},
},
.
id_table
=
wm8750_spi_ids
,
.
probe
=
wm8750_spi_probe
,
.
probe
=
wm8750_spi_probe
,
.
remove
=
__devexit_p
(
wm8750_spi_remove
),
.
remove
=
__devexit_p
(
wm8750_spi_remove
),
};
};
...
...
sound/soc/codecs/wm8903.c
View file @
c012cdc8
...
@@ -2046,8 +2046,13 @@ static int wm8903_probe(struct snd_soc_codec *codec)
...
@@ -2046,8 +2046,13 @@ static int wm8903_probe(struct snd_soc_codec *codec)
/* power down chip */
/* power down chip */
static
int
wm8903_remove
(
struct
snd_soc_codec
*
codec
)
static
int
wm8903_remove
(
struct
snd_soc_codec
*
codec
)
{
{
struct
wm8903_priv
*
wm8903
=
snd_soc_codec_get_drvdata
(
codec
);
wm8903_free_gpio
(
codec
);
wm8903_free_gpio
(
codec
);
wm8903_set_bias_level
(
codec
,
SND_SOC_BIAS_OFF
);
wm8903_set_bias_level
(
codec
,
SND_SOC_BIAS_OFF
);
if
(
wm8903
->
irq
)
free_irq
(
wm8903
->
irq
,
codec
);
return
0
;
return
0
;
}
}
...
...
sound/soc/codecs/wm8994.c
View file @
c012cdc8
...
@@ -2981,6 +2981,7 @@ static int wm8994_codec_probe(struct snd_soc_codec *codec)
...
@@ -2981,6 +2981,7 @@ static int wm8994_codec_probe(struct snd_soc_codec *codec)
wm8994
->
hubs
.
dcs_readback_mode
=
1
;
wm8994
->
hubs
.
dcs_readback_mode
=
1
;
break
;
break
;
}
}
break
;
case
WM8958
:
case
WM8958
:
wm8994
->
hubs
.
dcs_readback_mode
=
1
;
wm8994
->
hubs
.
dcs_readback_mode
=
1
;
...
...
sound/soc/omap/n810.c
View file @
c012cdc8
...
@@ -3,7 +3,7 @@
...
@@ -3,7 +3,7 @@
*
*
* Copyright (C) 2008 Nokia Corporation
* Copyright (C) 2008 Nokia Corporation
*
*
* Contact: Jarkko Nikula <j
hnikula@gmail
.com>
* Contact: Jarkko Nikula <j
arkko.nikula@bitmer
.com>
*
*
* This program is free software; you can redistribute it and/or
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* modify it under the terms of the GNU General Public License
...
@@ -402,6 +402,6 @@ static void __exit n810_soc_exit(void)
...
@@ -402,6 +402,6 @@ static void __exit n810_soc_exit(void)
module_init
(
n810_soc_init
);
module_init
(
n810_soc_init
);
module_exit
(
n810_soc_exit
);
module_exit
(
n810_soc_exit
);
MODULE_AUTHOR
(
"Jarkko Nikula <j
hnikula@gmail
.com>"
);
MODULE_AUTHOR
(
"Jarkko Nikula <j
arkko.nikula@bitmer
.com>"
);
MODULE_DESCRIPTION
(
"ALSA SoC Nokia N810"
);
MODULE_DESCRIPTION
(
"ALSA SoC Nokia N810"
);
MODULE_LICENSE
(
"GPL"
);
MODULE_LICENSE
(
"GPL"
);
sound/soc/omap/omap-mcbsp.c
View file @
c012cdc8
...
@@ -3,7 +3,7 @@
...
@@ -3,7 +3,7 @@
*
*
* Copyright (C) 2008 Nokia Corporation
* Copyright (C) 2008 Nokia Corporation
*
*
* Contact: Jarkko Nikula <j
hnikula@gmail
.com>
* Contact: Jarkko Nikula <j
arkko.nikula@bitmer
.com>
* Peter Ujfalusi <peter.ujfalusi@ti.com>
* Peter Ujfalusi <peter.ujfalusi@ti.com>
*
*
* This program is free software; you can redistribute it and/or
* This program is free software; you can redistribute it and/or
...
@@ -780,6 +780,6 @@ static void __exit snd_omap_mcbsp_exit(void)
...
@@ -780,6 +780,6 @@ static void __exit snd_omap_mcbsp_exit(void)
}
}
module_exit
(
snd_omap_mcbsp_exit
);
module_exit
(
snd_omap_mcbsp_exit
);
MODULE_AUTHOR
(
"Jarkko Nikula <j
hnikula@gmail
.com>"
);
MODULE_AUTHOR
(
"Jarkko Nikula <j
arkko.nikula@bitmer
.com>"
);
MODULE_DESCRIPTION
(
"OMAP I2S SoC Interface"
);
MODULE_DESCRIPTION
(
"OMAP I2S SoC Interface"
);
MODULE_LICENSE
(
"GPL"
);
MODULE_LICENSE
(
"GPL"
);
sound/soc/omap/omap-mcbsp.h
View file @
c012cdc8
...
@@ -3,7 +3,7 @@
...
@@ -3,7 +3,7 @@
*
*
* Copyright (C) 2008 Nokia Corporation
* Copyright (C) 2008 Nokia Corporation
*
*
* Contact: Jarkko Nikula <j
hnikula@gmail
.com>
* Contact: Jarkko Nikula <j
arkko.nikula@bitmer
.com>
* Peter Ujfalusi <peter.ujfalusi@ti.com>
* Peter Ujfalusi <peter.ujfalusi@ti.com>
*
*
* This program is free software; you can redistribute it and/or
* This program is free software; you can redistribute it and/or
...
...
sound/soc/omap/omap-pcm.c
View file @
c012cdc8
...
@@ -3,7 +3,7 @@
...
@@ -3,7 +3,7 @@
*
*
* Copyright (C) 2008 Nokia Corporation
* Copyright (C) 2008 Nokia Corporation
*
*
* Contact: Jarkko Nikula <j
hnikula@gmail
.com>
* Contact: Jarkko Nikula <j
arkko.nikula@bitmer
.com>
* Peter Ujfalusi <peter.ujfalusi@ti.com>
* Peter Ujfalusi <peter.ujfalusi@ti.com>
*
*
* This program is free software; you can redistribute it and/or
* This program is free software; you can redistribute it and/or
...
@@ -436,6 +436,6 @@ static void __exit snd_omap_pcm_exit(void)
...
@@ -436,6 +436,6 @@ static void __exit snd_omap_pcm_exit(void)
}
}
module_exit
(
snd_omap_pcm_exit
);
module_exit
(
snd_omap_pcm_exit
);
MODULE_AUTHOR
(
"Jarkko Nikula <j
hnikula@gmail
.com>"
);
MODULE_AUTHOR
(
"Jarkko Nikula <j
arkko.nikula@bitmer
.com>"
);
MODULE_DESCRIPTION
(
"OMAP PCM DMA module"
);
MODULE_DESCRIPTION
(
"OMAP PCM DMA module"
);
MODULE_LICENSE
(
"GPL"
);
MODULE_LICENSE
(
"GPL"
);
sound/soc/omap/omap-pcm.h
View file @
c012cdc8
...
@@ -3,7 +3,7 @@
...
@@ -3,7 +3,7 @@
*
*
* Copyright (C) 2008 Nokia Corporation
* Copyright (C) 2008 Nokia Corporation
*
*
* Contact: Jarkko Nikula <j
hnikula@gmail
.com>
* Contact: Jarkko Nikula <j
arkko.nikula@bitmer
.com>
* Peter Ujfalusi <peter.ujfalusi@ti.com>
* Peter Ujfalusi <peter.ujfalusi@ti.com>
*
*
* This program is free software; you can redistribute it and/or
* This program is free software; you can redistribute it and/or
...
...
sound/soc/omap/rx51.c
View file @
c012cdc8
...
@@ -5,7 +5,7 @@
...
@@ -5,7 +5,7 @@
*
*
* Contact: Peter Ujfalusi <peter.ujfalusi@ti.com>
* Contact: Peter Ujfalusi <peter.ujfalusi@ti.com>
* Eduardo Valentin <eduardo.valentin@nokia.com>
* Eduardo Valentin <eduardo.valentin@nokia.com>
* Jarkko Nikula <j
hnikula@gmail
.com>
* Jarkko Nikula <j
arkko.nikula@bitmer
.com>
*
*
* This program is free software; you can redistribute it and/or
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* modify it under the terms of the GNU General Public License
...
...
sound/soc/samsung/Makefile
View file @
c012cdc8
# S3c24XX Platform Support
# S3c24XX Platform Support
snd-soc-s3c24xx-objs
:=
dma.o
snd-soc-s3c24xx-objs
:=
dma.o
snd-soc-idma-objs
:=
idma.o
snd-soc-s3c24xx-i2s-objs
:=
s3c24xx-i2s.o
snd-soc-s3c24xx-i2s-objs
:=
s3c24xx-i2s.o
snd-soc-s3c2412-i2s-objs
:=
s3c2412-i2s.o
snd-soc-s3c2412-i2s-objs
:=
s3c2412-i2s.o
snd-soc-ac97-objs
:=
ac97.o
snd-soc-ac97-objs
:=
ac97.o
...
@@ -16,6 +17,7 @@ obj-$(CONFIG_SND_S3C_I2SV2_SOC) += snd-soc-s3c-i2s-v2.o
...
@@ -16,6 +17,7 @@ obj-$(CONFIG_SND_S3C_I2SV2_SOC) += snd-soc-s3c-i2s-v2.o
obj-$(CONFIG_SND_SAMSUNG_SPDIF)
+=
snd-soc-samsung-spdif.o
obj-$(CONFIG_SND_SAMSUNG_SPDIF)
+=
snd-soc-samsung-spdif.o
obj-$(CONFIG_SND_SAMSUNG_PCM)
+=
snd-soc-pcm.o
obj-$(CONFIG_SND_SAMSUNG_PCM)
+=
snd-soc-pcm.o
obj-$(CONFIG_SND_SAMSUNG_I2S)
+=
snd-soc-i2s.o
obj-$(CONFIG_SND_SAMSUNG_I2S)
+=
snd-soc-i2s.o
obj-$(CONFIG_SND_SAMSUNG_I2S)
+=
snd-soc-idma.o
# S3C24XX Machine Support
# S3C24XX Machine Support
snd-soc-jive-wm8750-objs
:=
jive_wm8750.o
snd-soc-jive-wm8750-objs
:=
jive_wm8750.o
...
...
sound/soc/samsung/idma.c
0 → 100644
View file @
c012cdc8
/*
* sound/soc/samsung/idma.c
*
* Copyright (c) 2011 Samsung Electronics Co., Ltd.
* http://www.samsung.com
*
* I2S0's Internal DMA driver
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*/
#include <linux/interrupt.h>
#include <linux/platform_device.h>
#include <linux/dma-mapping.h>
#include <linux/slab.h>
#include <sound/pcm.h>
#include <sound/pcm_params.h>
#include <sound/soc.h>
#include "i2s.h"
#include "idma.h"
#include "dma.h"
#include "i2s-regs.h"
#define ST_RUNNING (1<<0)
#define ST_OPENED (1<<1)
static
const
struct
snd_pcm_hardware
idma_hardware
=
{
.
info
=
SNDRV_PCM_INFO_INTERLEAVED
|
SNDRV_PCM_INFO_BLOCK_TRANSFER
|
SNDRV_PCM_INFO_MMAP
|
SNDRV_PCM_INFO_MMAP_VALID
|
SNDRV_PCM_INFO_PAUSE
|
SNDRV_PCM_INFO_RESUME
,
.
formats
=
SNDRV_PCM_FMTBIT_S16_LE
|
SNDRV_PCM_FMTBIT_U16_LE
|
SNDRV_PCM_FMTBIT_S24_LE
|
SNDRV_PCM_FMTBIT_U24_LE
|
SNDRV_PCM_FMTBIT_U8
|
SNDRV_PCM_FMTBIT_S8
,
.
channels_min
=
2
,
.
channels_max
=
2
,
.
buffer_bytes_max
=
MAX_IDMA_BUFFER
,
.
period_bytes_min
=
128
,
.
period_bytes_max
=
MAX_IDMA_PERIOD
,
.
periods_min
=
1
,
.
periods_max
=
2
,
};
struct
idma_ctrl
{
spinlock_t
lock
;
int
state
;
dma_addr_t
start
;
dma_addr_t
pos
;
dma_addr_t
end
;
dma_addr_t
period
;
dma_addr_t
periodsz
;
void
*
token
;
void
(
*
cb
)(
void
*
dt
,
int
bytes_xfer
);
};
static
struct
idma_info
{
spinlock_t
lock
;
void
__iomem
*
regs
;
dma_addr_t
lp_tx_addr
;
}
idma
;
static
void
idma_getpos
(
dma_addr_t
*
src
)
{
*
src
=
idma
.
lp_tx_addr
+
(
readl
(
idma
.
regs
+
I2STRNCNT
)
&
0xffffff
)
*
4
;
}
static
int
idma_enqueue
(
struct
snd_pcm_substream
*
substream
)
{
struct
snd_pcm_runtime
*
runtime
=
substream
->
runtime
;
struct
idma_ctrl
*
prtd
=
substream
->
runtime
->
private_data
;
u32
val
;
spin_lock
(
&
prtd
->
lock
);
prtd
->
token
=
(
void
*
)
substream
;
spin_unlock
(
&
prtd
->
lock
);
/* Internal DMA Level0 Interrupt Address */
val
=
idma
.
lp_tx_addr
+
prtd
->
periodsz
;
writel
(
val
,
idma
.
regs
+
I2SLVL0ADDR
);
/* Start address0 of I2S internal DMA operation. */
val
=
idma
.
lp_tx_addr
;
writel
(
val
,
idma
.
regs
+
I2SSTR0
);
/*
* Transfer block size for I2S internal DMA.
* Should decide transfer size before start dma operation
*/
val
=
readl
(
idma
.
regs
+
I2SSIZE
);
val
&=
~
(
I2SSIZE_TRNMSK
<<
I2SSIZE_SHIFT
);
val
|=
(((
runtime
->
dma_bytes
>>
2
)
&
I2SSIZE_TRNMSK
)
<<
I2SSIZE_SHIFT
);
writel
(
val
,
idma
.
regs
+
I2SSIZE
);
val
=
readl
(
idma
.
regs
+
I2SAHB
);
val
|=
AHB_INTENLVL0
;
writel
(
val
,
idma
.
regs
+
I2SAHB
);
return
0
;
}
static
void
idma_setcallbk
(
struct
snd_pcm_substream
*
substream
,
void
(
*
cb
)(
void
*
,
int
))
{
struct
idma_ctrl
*
prtd
=
substream
->
runtime
->
private_data
;
spin_lock
(
&
prtd
->
lock
);
prtd
->
cb
=
cb
;
spin_unlock
(
&
prtd
->
lock
);
}
static
void
idma_control
(
int
op
)
{
u32
val
=
readl
(
idma
.
regs
+
I2SAHB
);
spin_lock
(
&
idma
.
lock
);
switch
(
op
)
{
case
LPAM_DMA_START
:
val
|=
(
AHB_INTENLVL0
|
AHB_DMAEN
);
break
;
case
LPAM_DMA_STOP
:
val
&=
~
(
AHB_INTENLVL0
|
AHB_DMAEN
);
break
;
default:
spin_unlock
(
&
idma
.
lock
);
return
;
}
writel
(
val
,
idma
.
regs
+
I2SAHB
);
spin_unlock
(
&
idma
.
lock
);
}
static
void
idma_done
(
void
*
id
,
int
bytes_xfer
)
{
struct
snd_pcm_substream
*
substream
=
id
;
struct
idma_ctrl
*
prtd
=
substream
->
runtime
->
private_data
;
if
(
prtd
&&
(
prtd
->
state
&
ST_RUNNING
))
snd_pcm_period_elapsed
(
substream
);
}
static
int
idma_hw_params
(
struct
snd_pcm_substream
*
substream
,
struct
snd_pcm_hw_params
*
params
)
{
struct
snd_pcm_runtime
*
runtime
=
substream
->
runtime
;
struct
idma_ctrl
*
prtd
=
substream
->
runtime
->
private_data
;
u32
mod
=
readl
(
idma
.
regs
+
I2SMOD
);
u32
ahb
=
readl
(
idma
.
regs
+
I2SAHB
);
ahb
|=
(
AHB_DMARLD
|
AHB_INTMASK
);
mod
|=
MOD_TXS_IDMA
;
writel
(
ahb
,
idma
.
regs
+
I2SAHB
);
writel
(
mod
,
idma
.
regs
+
I2SMOD
);
snd_pcm_set_runtime_buffer
(
substream
,
&
substream
->
dma_buffer
);
runtime
->
dma_bytes
=
params_buffer_bytes
(
params
);
prtd
->
start
=
prtd
->
pos
=
runtime
->
dma_addr
;
prtd
->
period
=
params_periods
(
params
);
prtd
->
periodsz
=
params_period_bytes
(
params
);
prtd
->
end
=
runtime
->
dma_addr
+
runtime
->
dma_bytes
;
idma_setcallbk
(
substream
,
idma_done
);
return
0
;
}
static
int
idma_hw_free
(
struct
snd_pcm_substream
*
substream
)
{
snd_pcm_set_runtime_buffer
(
substream
,
NULL
);
return
0
;
}
static
int
idma_prepare
(
struct
snd_pcm_substream
*
substream
)
{
struct
idma_ctrl
*
prtd
=
substream
->
runtime
->
private_data
;
prtd
->
pos
=
prtd
->
start
;
/* flush the DMA channel */
idma_control
(
LPAM_DMA_STOP
);
idma_enqueue
(
substream
);
return
0
;
}
static
int
idma_trigger
(
struct
snd_pcm_substream
*
substream
,
int
cmd
)
{
struct
idma_ctrl
*
prtd
=
substream
->
runtime
->
private_data
;
int
ret
=
0
;
spin_lock
(
&
prtd
->
lock
);
switch
(
cmd
)
{
case
SNDRV_PCM_TRIGGER_RESUME
:
case
SNDRV_PCM_TRIGGER_START
:
case
SNDRV_PCM_TRIGGER_PAUSE_RELEASE
:
prtd
->
state
|=
ST_RUNNING
;
idma_control
(
LPAM_DMA_START
);
break
;
case
SNDRV_PCM_TRIGGER_SUSPEND
:
case
SNDRV_PCM_TRIGGER_STOP
:
case
SNDRV_PCM_TRIGGER_PAUSE_PUSH
:
prtd
->
state
&=
~
ST_RUNNING
;
idma_control
(
LPAM_DMA_STOP
);
break
;
default:
ret
=
-
EINVAL
;
break
;
}
spin_unlock
(
&
prtd
->
lock
);
return
ret
;
}
static
snd_pcm_uframes_t
idma_pointer
(
struct
snd_pcm_substream
*
substream
)
{
struct
snd_pcm_runtime
*
runtime
=
substream
->
runtime
;
struct
idma_ctrl
*
prtd
=
runtime
->
private_data
;
dma_addr_t
src
;
unsigned
long
res
;
spin_lock
(
&
prtd
->
lock
);
idma_getpos
(
&
src
);
res
=
src
-
prtd
->
start
;
spin_unlock
(
&
prtd
->
lock
);
return
bytes_to_frames
(
substream
->
runtime
,
res
);
}
static
int
idma_mmap
(
struct
snd_pcm_substream
*
substream
,
struct
vm_area_struct
*
vma
)
{
struct
snd_pcm_runtime
*
runtime
=
substream
->
runtime
;
unsigned
long
size
,
offset
;
int
ret
;
/* From snd_pcm_lib_mmap_iomem */
vma
->
vm_page_prot
=
pgprot_noncached
(
vma
->
vm_page_prot
);
vma
->
vm_flags
|=
VM_IO
;
size
=
vma
->
vm_end
-
vma
->
vm_start
;
offset
=
vma
->
vm_pgoff
<<
PAGE_SHIFT
;
ret
=
io_remap_pfn_range
(
vma
,
vma
->
vm_start
,
(
runtime
->
dma_addr
+
offset
)
>>
PAGE_SHIFT
,
size
,
vma
->
vm_page_prot
);
return
ret
;
}
static
irqreturn_t
iis_irq
(
int
irqno
,
void
*
dev_id
)
{
struct
idma_ctrl
*
prtd
=
(
struct
idma_ctrl
*
)
dev_id
;
u32
iiscon
,
iisahb
,
val
,
addr
;
iisahb
=
readl
(
idma
.
regs
+
I2SAHB
);
iiscon
=
readl
(
idma
.
regs
+
I2SCON
);
val
=
(
iisahb
&
AHB_LVL0INT
)
?
AHB_CLRLVL0INT
:
0
;
if
(
val
)
{
iisahb
|=
val
;
writel
(
iisahb
,
idma
.
regs
+
I2SAHB
);
addr
=
readl
(
idma
.
regs
+
I2SLVL0ADDR
)
-
idma
.
lp_tx_addr
;
addr
+=
prtd
->
periodsz
;
addr
%=
(
prtd
->
end
-
prtd
->
start
);
addr
+=
idma
.
lp_tx_addr
;
writel
(
addr
,
idma
.
regs
+
I2SLVL0ADDR
);
if
(
prtd
->
cb
)
prtd
->
cb
(
prtd
->
token
,
prtd
->
period
);
}
return
IRQ_HANDLED
;
}
static
int
idma_open
(
struct
snd_pcm_substream
*
substream
)
{
struct
snd_pcm_runtime
*
runtime
=
substream
->
runtime
;
struct
idma_ctrl
*
prtd
;
int
ret
;
snd_soc_set_runtime_hwparams
(
substream
,
&
idma_hardware
);
prtd
=
kzalloc
(
sizeof
(
struct
idma_ctrl
),
GFP_KERNEL
);
if
(
prtd
==
NULL
)
return
-
ENOMEM
;
ret
=
request_irq
(
IRQ_I2S0
,
iis_irq
,
0
,
"i2s"
,
prtd
);
if
(
ret
<
0
)
{
pr_err
(
"fail to claim i2s irq , ret = %d
\n
"
,
ret
);
kfree
(
prtd
);
return
ret
;
}
spin_lock_init
(
&
prtd
->
lock
);
runtime
->
private_data
=
prtd
;
return
0
;
}
static
int
idma_close
(
struct
snd_pcm_substream
*
substream
)
{
struct
snd_pcm_runtime
*
runtime
=
substream
->
runtime
;
struct
idma_ctrl
*
prtd
=
runtime
->
private_data
;
free_irq
(
IRQ_I2S0
,
prtd
);
if
(
!
prtd
)
pr_err
(
"idma_close called with prtd == NULL
\n
"
);
kfree
(
prtd
);
return
0
;
}
static
struct
snd_pcm_ops
idma_ops
=
{
.
open
=
idma_open
,
.
close
=
idma_close
,
.
ioctl
=
snd_pcm_lib_ioctl
,
.
trigger
=
idma_trigger
,
.
pointer
=
idma_pointer
,
.
mmap
=
idma_mmap
,
.
hw_params
=
idma_hw_params
,
.
hw_free
=
idma_hw_free
,
.
prepare
=
idma_prepare
,
};
static
void
idma_free
(
struct
snd_pcm
*
pcm
)
{
struct
snd_pcm_substream
*
substream
;
struct
snd_dma_buffer
*
buf
;
substream
=
pcm
->
streams
[
SNDRV_PCM_STREAM_PLAYBACK
].
substream
;
if
(
!
substream
)
return
;
buf
=
&
substream
->
dma_buffer
;
if
(
!
buf
->
area
)
return
;
iounmap
(
buf
->
area
);
buf
->
area
=
NULL
;
buf
->
addr
=
0
;
}
static
int
preallocate_idma_buffer
(
struct
snd_pcm
*
pcm
,
int
stream
)
{
struct
snd_pcm_substream
*
substream
=
pcm
->
streams
[
stream
].
substream
;
struct
snd_dma_buffer
*
buf
=
&
substream
->
dma_buffer
;
buf
->
dev
.
dev
=
pcm
->
card
->
dev
;
buf
->
private_data
=
NULL
;
/* Assign PCM buffer pointers */
buf
->
dev
.
type
=
SNDRV_DMA_TYPE_CONTINUOUS
;
buf
->
addr
=
idma
.
lp_tx_addr
;
buf
->
bytes
=
idma_hardware
.
buffer_bytes_max
;
buf
->
area
=
(
unsigned
char
*
)
ioremap
(
buf
->
addr
,
buf
->
bytes
);
return
0
;
}
static
u64
idma_mask
=
DMA_BIT_MASK
(
32
);
static
int
idma_new
(
struct
snd_soc_pcm_runtime
*
rtd
)
{
struct
snd_card
*
card
=
rtd
->
card
->
snd_card
;
struct
snd_soc_dai
*
dai
=
rtd
->
cpu_dai
;
struct
snd_pcm
*
pcm
=
rtd
->
pcm
;
int
ret
=
0
;
if
(
!
card
->
dev
->
dma_mask
)
card
->
dev
->
dma_mask
=
&
idma_mask
;
if
(
!
card
->
dev
->
coherent_dma_mask
)
card
->
dev
->
coherent_dma_mask
=
DMA_BIT_MASK
(
32
);
if
(
dai
->
driver
->
playback
.
channels_min
)
ret
=
preallocate_idma_buffer
(
pcm
,
SNDRV_PCM_STREAM_PLAYBACK
);
return
ret
;
}
void
idma_reg_addr_init
(
void
*
regs
,
dma_addr_t
addr
)
{
spin_lock_init
(
&
idma
.
lock
);
idma
.
regs
=
regs
;
idma
.
lp_tx_addr
=
addr
;
}
struct
snd_soc_platform_driver
asoc_idma_platform
=
{
.
ops
=
&
idma_ops
,
.
pcm_new
=
idma_new
,
.
pcm_free
=
idma_free
,
};
static
int
__devinit
asoc_idma_platform_probe
(
struct
platform_device
*
pdev
)
{
return
snd_soc_register_platform
(
&
pdev
->
dev
,
&
asoc_idma_platform
);
}
static
int
__devexit
asoc_idma_platform_remove
(
struct
platform_device
*
pdev
)
{
snd_soc_unregister_platform
(
&
pdev
->
dev
);
return
0
;
}
static
struct
platform_driver
asoc_idma_driver
=
{
.
driver
=
{
.
name
=
"samsung-idma"
,
.
owner
=
THIS_MODULE
,
},
.
probe
=
asoc_idma_platform_probe
,
.
remove
=
__devexit_p
(
asoc_idma_platform_remove
),
};
static
int
__init
asoc_idma_init
(
void
)
{
return
platform_driver_register
(
&
asoc_idma_driver
);
}
module_init
(
asoc_idma_init
);
static
void
__exit
asoc_idma_exit
(
void
)
{
platform_driver_unregister
(
&
asoc_idma_driver
);
}
module_exit
(
asoc_idma_exit
);
MODULE_AUTHOR
(
"Jaswinder Singh, <jassisinghbrar@gmail.com>"
);
MODULE_DESCRIPTION
(
"Samsung ASoC IDMA Driver"
);
MODULE_LICENSE
(
"GPL"
);
sound/soc/samsung/idma.h
0 → 100644
View file @
c012cdc8
/*
* sound/soc/samsung/idma.h
*
* Copyright (c) 2011 Samsung Electronics Co., Ltd
* http://www.samsung.com
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
*/
#ifndef __SND_SOC_SAMSUNG_IDMA_H_
#define __SND_SOC_SAMSUNG_IDMA_H_
extern
void
idma_reg_addr_init
(
void
*
regs
,
dma_addr_t
addr
);
/* dma_state */
#define LPAM_DMA_STOP 0
#define LPAM_DMA_START 1
#define MAX_IDMA_PERIOD (128 * 1024)
#define MAX_IDMA_BUFFER (160 * 1024)
#endif
/* __SND_SOC_SAMSUNG_IDMA_H_ */
sound/soc/samsung/jive_wm8750.c
View file @
c012cdc8
...
@@ -131,7 +131,7 @@ static struct snd_soc_dai_link jive_dai = {
...
@@ -131,7 +131,7 @@ static struct snd_soc_dai_link jive_dai = {
.
cpu_dai_name
=
"s3c2412-i2s"
,
.
cpu_dai_name
=
"s3c2412-i2s"
,
.
codec_dai_name
=
"wm8750-hifi"
,
.
codec_dai_name
=
"wm8750-hifi"
,
.
platform_name
=
"samsung-audio"
,
.
platform_name
=
"samsung-audio"
,
.
codec_name
=
"wm8750-codec.0-0
x
1a"
,
.
codec_name
=
"wm8750-codec.0-0
0
1a"
,
.
init
=
jive_wm8750_init
,
.
init
=
jive_wm8750_init
,
.
ops
=
&
jive_ops
,
.
ops
=
&
jive_ops
,
};
};
...
...
sound/soc/samsung/speyside_wm8962.c
View file @
c012cdc8
...
@@ -37,7 +37,7 @@ static int speyside_wm8962_set_bias_level(struct snd_soc_card *card,
...
@@ -37,7 +37,7 @@ static int speyside_wm8962_set_bias_level(struct snd_soc_card *card,
44100
*
256
,
44100
*
256
,
SND_SOC_CLOCK_IN
);
SND_SOC_CLOCK_IN
);
if
(
ret
<
0
)
{
if
(
ret
<
0
)
{
pr_err
(
"Failed to set SYSCLK: %d
\n
"
);
pr_err
(
"Failed to set SYSCLK: %d
\n
"
,
ret
);
return
ret
;
return
ret
;
}
}
}
}
...
...
sound/soc/tegra/tegra_pcm.c
View file @
c012cdc8
...
@@ -309,9 +309,14 @@ static int tegra_pcm_preallocate_dma_buffer(struct snd_pcm *pcm, int stream)
...
@@ -309,9 +309,14 @@ static int tegra_pcm_preallocate_dma_buffer(struct snd_pcm *pcm, int stream)
static
void
tegra_pcm_deallocate_dma_buffer
(
struct
snd_pcm
*
pcm
,
int
stream
)
static
void
tegra_pcm_deallocate_dma_buffer
(
struct
snd_pcm
*
pcm
,
int
stream
)
{
{
struct
snd_pcm_substream
*
substream
=
pcm
->
streams
[
stream
].
substream
;
struct
snd_pcm_substream
*
substream
;
struct
snd_dma_buffer
*
buf
=
&
substream
->
dma_buffer
;
struct
snd_dma_buffer
*
buf
;
substream
=
pcm
->
streams
[
stream
].
substream
;
if
(
!
substream
)
return
;
buf
=
&
substream
->
dma_buffer
;
if
(
!
buf
->
area
)
if
(
!
buf
->
area
)
return
;
return
;
...
...
sound/soc/tegra/tegra_wm8903.c
View file @
c012cdc8
...
@@ -56,6 +56,7 @@
...
@@ -56,6 +56,7 @@
#define GPIO_HP_MUTE BIT(1)
#define GPIO_HP_MUTE BIT(1)
#define GPIO_INT_MIC_EN BIT(2)
#define GPIO_INT_MIC_EN BIT(2)
#define GPIO_EXT_MIC_EN BIT(3)
#define GPIO_EXT_MIC_EN BIT(3)
#define GPIO_HP_DET BIT(4)
struct
tegra_wm8903
{
struct
tegra_wm8903
{
struct
tegra_asoc_utils_data
util_data
;
struct
tegra_asoc_utils_data
util_data
;
...
@@ -304,6 +305,7 @@ static int tegra_wm8903_init(struct snd_soc_pcm_runtime *rtd)
...
@@ -304,6 +305,7 @@ static int tegra_wm8903_init(struct snd_soc_pcm_runtime *rtd)
snd_soc_jack_add_gpios
(
&
tegra_wm8903_hp_jack
,
snd_soc_jack_add_gpios
(
&
tegra_wm8903_hp_jack
,
1
,
1
,
&
tegra_wm8903_hp_jack_gpio
);
&
tegra_wm8903_hp_jack_gpio
);
machine
->
gpio_requested
|=
GPIO_HP_DET
;
}
}
snd_soc_jack_new
(
codec
,
"Mic Jack"
,
SND_JACK_MICROPHONE
,
snd_soc_jack_new
(
codec
,
"Mic Jack"
,
SND_JACK_MICROPHONE
,
...
@@ -429,10 +431,10 @@ static int __devexit tegra_wm8903_driver_remove(struct platform_device *pdev)
...
@@ -429,10 +431,10 @@ static int __devexit tegra_wm8903_driver_remove(struct platform_device *pdev)
struct
tegra_wm8903
*
machine
=
snd_soc_card_get_drvdata
(
card
);
struct
tegra_wm8903
*
machine
=
snd_soc_card_get_drvdata
(
card
);
struct
tegra_wm8903_platform_data
*
pdata
=
machine
->
pdata
;
struct
tegra_wm8903_platform_data
*
pdata
=
machine
->
pdata
;
snd_soc_unregister_card
(
card
);
if
(
machine
->
gpio_requested
&
GPIO_HP_DET
)
snd_soc_jack_free_gpios
(
&
tegra_wm8903_hp_jack
,
tegra_asoc_utils_fini
(
&
machine
->
util_data
);
1
,
&
tegra_wm8903_hp_jack_gpio
);
if
(
machine
->
gpio_requested
&
GPIO_EXT_MIC_EN
)
if
(
machine
->
gpio_requested
&
GPIO_EXT_MIC_EN
)
gpio_free
(
pdata
->
gpio_ext_mic_en
);
gpio_free
(
pdata
->
gpio_ext_mic_en
);
if
(
machine
->
gpio_requested
&
GPIO_INT_MIC_EN
)
if
(
machine
->
gpio_requested
&
GPIO_INT_MIC_EN
)
...
@@ -441,6 +443,11 @@ static int __devexit tegra_wm8903_driver_remove(struct platform_device *pdev)
...
@@ -441,6 +443,11 @@ static int __devexit tegra_wm8903_driver_remove(struct platform_device *pdev)
gpio_free
(
pdata
->
gpio_hp_mute
);
gpio_free
(
pdata
->
gpio_hp_mute
);
if
(
machine
->
gpio_requested
&
GPIO_SPKR_EN
)
if
(
machine
->
gpio_requested
&
GPIO_SPKR_EN
)
gpio_free
(
pdata
->
gpio_spkr_en
);
gpio_free
(
pdata
->
gpio_spkr_en
);
machine
->
gpio_requested
=
0
;
snd_soc_unregister_card
(
card
);
tegra_asoc_utils_fini
(
&
machine
->
util_data
);
kfree
(
machine
);
kfree
(
machine
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment