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
5bcaca4b
Commit
5bcaca4b
authored
Oct 06, 2014
by
Mark Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'asoc/topic/component' into asoc-next
parents
832a9414
b2d9de54
Changes
18
Hide whitespace changes
Inline
Side-by-side
Showing
18 changed files
with
760 additions
and
519 deletions
+760
-519
include/sound/soc-dapm.h
include/sound/soc-dapm.h
+0
-1
include/sound/soc.h
include/sound/soc.h
+59
-35
sound/soc/codecs/wm8350.c
sound/soc/codecs/wm8350.c
+1
-1
sound/soc/codecs/wm8753.c
sound/soc/codecs/wm8753.c
+1
-1
sound/soc/codecs/wm8971.c
sound/soc/codecs/wm8971.c
+1
-1
sound/soc/intel/Makefile
sound/soc/intel/Makefile
+2
-1
sound/soc/intel/sst-atom-controls.c
sound/soc/intel/sst-atom-controls.c
+39
-0
sound/soc/intel/sst-atom-controls.h
sound/soc/intel/sst-atom-controls.h
+284
-2
sound/soc/intel/sst-haswell-pcm.c
sound/soc/intel/sst-haswell-pcm.c
+28
-28
sound/soc/intel/sst-mfld-platform-compress.c
sound/soc/intel/sst-mfld-platform-compress.c
+29
-9
sound/soc/intel/sst-mfld-platform-pcm.c
sound/soc/intel/sst-mfld-platform-pcm.c
+18
-16
sound/soc/intel/sst-mfld-platform.h
sound/soc/intel/sst-mfld-platform.h
+29
-28
sound/soc/omap/rx51.c
sound/soc/omap/rx51.c
+1
-1
sound/soc/samsung/speyside.c
sound/soc/samsung/speyside.c
+4
-2
sound/soc/soc-core.c
sound/soc/soc-core.c
+259
-363
sound/soc/soc-dapm.c
sound/soc/soc-dapm.c
+2
-1
sound/soc/soc-generic-dmaengine-pcm.c
sound/soc/soc-generic-dmaengine-pcm.c
+3
-1
sound/soc/soc-io.c
sound/soc/soc-io.c
+0
-28
No files found.
include/sound/soc-dapm.h
View file @
5bcaca4b
...
...
@@ -593,7 +593,6 @@ struct snd_soc_dapm_context {
struct
device
*
dev
;
/* from parent - for debug */
struct
snd_soc_component
*
component
;
/* parent component */
struct
snd_soc_codec
*
codec
;
/* parent codec */
struct
snd_soc_card
*
card
;
/* parent card */
/* used during DAPM updates */
...
...
include/sound/soc.h
View file @
5bcaca4b
...
...
@@ -690,6 +690,17 @@ struct snd_soc_compr_ops {
struct
snd_soc_component_driver
{
const
char
*
name
;
/* Default control and setup, added after probe() is run */
const
struct
snd_kcontrol_new
*
controls
;
unsigned
int
num_controls
;
const
struct
snd_soc_dapm_widget
*
dapm_widgets
;
unsigned
int
num_dapm_widgets
;
const
struct
snd_soc_dapm_route
*
dapm_routes
;
unsigned
int
num_dapm_routes
;
int
(
*
probe
)(
struct
snd_soc_component
*
);
void
(
*
remove
)(
struct
snd_soc_component
*
);
/* DT */
int
(
*
of_xlate_dai_name
)(
struct
snd_soc_component
*
component
,
struct
of_phandle_args
*
args
,
...
...
@@ -697,6 +708,10 @@ struct snd_soc_component_driver {
void
(
*
seq_notifier
)(
struct
snd_soc_component
*
,
enum
snd_soc_dapm_type
,
int
subseq
);
int
(
*
stream_event
)(
struct
snd_soc_component
*
,
int
event
);
/* probe ordering - for components with runtime dependencies */
int
probe_order
;
int
remove_order
;
};
struct
snd_soc_component
{
...
...
@@ -710,6 +725,7 @@ struct snd_soc_component {
unsigned
int
ignore_pmdown_time
:
1
;
/* pmdown_time is ignored at stop */
unsigned
int
registered_as_component
:
1
;
unsigned
int
probed
:
1
;
struct
list_head
list
;
...
...
@@ -728,9 +744,35 @@ struct snd_soc_component {
struct
mutex
io_mutex
;
#ifdef CONFIG_DEBUG_FS
struct
dentry
*
debugfs_root
;
#endif
/*
* DO NOT use any of the fields below in drivers, they are temporary and
* are going to be removed again soon. If you use them in driver code the
* driver will be marked as BROKEN when these fields are removed.
*/
/* Don't use these, use snd_soc_component_get_dapm() */
struct
snd_soc_dapm_context
dapm
;
struct
snd_soc_dapm_context
*
dapm_ptr
;
const
struct
snd_kcontrol_new
*
controls
;
unsigned
int
num_controls
;
const
struct
snd_soc_dapm_widget
*
dapm_widgets
;
unsigned
int
num_dapm_widgets
;
const
struct
snd_soc_dapm_route
*
dapm_routes
;
unsigned
int
num_dapm_routes
;
struct
snd_soc_codec
*
codec
;
int
(
*
probe
)(
struct
snd_soc_component
*
);
void
(
*
remove
)(
struct
snd_soc_component
*
);
#ifdef CONFIG_DEBUG_FS
void
(
*
init_debugfs
)(
struct
snd_soc_component
*
component
);
const
char
*
debugfs_prefix
;
#endif
};
/* SoC Audio Codec device */
...
...
@@ -746,11 +788,9 @@ struct snd_soc_codec {
struct
snd_ac97
*
ac97
;
/* for ad-hoc ac97 devices */
unsigned
int
cache_bypass
:
1
;
/* Suppress access to the cache */
unsigned
int
suspended
:
1
;
/* Codec is in suspend PM state */
unsigned
int
probed
:
1
;
/* Codec has been probed */
unsigned
int
ac97_registered
:
1
;
/* Codec has been AC97 registered */
unsigned
int
ac97_created
:
1
;
/* Codec has been created by SoC */
unsigned
int
cache_init
:
1
;
/* codec cache has been initialized */
u32
cache_only
;
/* Suppress writes to hardware */
u32
cache_sync
;
/* Cache needs to be synced to hardware */
/* codec IO */
...
...
@@ -766,7 +806,6 @@ struct snd_soc_codec {
struct
snd_soc_dapm_context
dapm
;
#ifdef CONFIG_DEBUG_FS
struct
dentry
*
debugfs_codec_root
;
struct
dentry
*
debugfs_reg
;
#endif
};
...
...
@@ -813,10 +852,6 @@ struct snd_soc_codec_driver {
enum
snd_soc_dapm_type
,
int
);
bool
ignore_pmdown_time
;
/* Doesn't benefit from pmdown delay */
/* probe ordering - for components with runtime dependencies */
int
probe_order
;
int
remove_order
;
};
/* SoC platform interface */
...
...
@@ -832,14 +867,6 @@ struct snd_soc_platform_driver {
int
(
*
pcm_new
)(
struct
snd_soc_pcm_runtime
*
);
void
(
*
pcm_free
)(
struct
snd_pcm
*
);
/* Default control and setup, added after probe() is run */
const
struct
snd_kcontrol_new
*
controls
;
int
num_controls
;
const
struct
snd_soc_dapm_widget
*
dapm_widgets
;
int
num_dapm_widgets
;
const
struct
snd_soc_dapm_route
*
dapm_routes
;
int
num_dapm_routes
;
/*
* For platform caused delay reporting.
* Optional.
...
...
@@ -853,13 +880,6 @@ struct snd_soc_platform_driver {
/* platform stream compress ops */
const
struct
snd_compr_ops
*
compr_ops
;
/* probe ordering - for components with runtime dependencies */
int
probe_order
;
int
remove_order
;
/* platform IO - used for platform DAPM */
unsigned
int
(
*
read
)(
struct
snd_soc_platform
*
,
unsigned
int
);
int
(
*
write
)(
struct
snd_soc_platform
*
,
unsigned
int
,
unsigned
int
);
int
(
*
bespoke_trigger
)(
struct
snd_pcm_substream
*
,
int
);
};
...
...
@@ -874,15 +894,10 @@ struct snd_soc_platform {
const
struct
snd_soc_platform_driver
*
driver
;
unsigned
int
suspended
:
1
;
/* platform is suspended */
unsigned
int
probed
:
1
;
struct
list_head
list
;
struct
snd_soc_component
component
;
#ifdef CONFIG_DEBUG_FS
struct
dentry
*
debugfs_platform_root
;
#endif
};
struct
snd_soc_dai_link
{
...
...
@@ -994,7 +1009,7 @@ struct snd_soc_aux_dev {
const
struct
device_node
*
codec_of_node
;
/* codec/machine specific init - e.g. add machine controls */
int
(
*
init
)(
struct
snd_soc_
dapm_context
*
dapm
);
int
(
*
init
)(
struct
snd_soc_
component
*
component
);
};
/* SoC card */
...
...
@@ -1112,6 +1127,7 @@ struct snd_soc_pcm_runtime {
struct
snd_soc_platform
*
platform
;
struct
snd_soc_dai
*
codec_dai
;
struct
snd_soc_dai
*
cpu_dai
;
struct
snd_soc_component
*
component
;
/* Only valid for AUX dev rtds */
struct
snd_soc_dai
**
codec_dais
;
unsigned
int
num_codecs
;
...
...
@@ -1260,9 +1276,6 @@ void snd_soc_component_async_complete(struct snd_soc_component *component);
int
snd_soc_component_test_bits
(
struct
snd_soc_component
*
component
,
unsigned
int
reg
,
unsigned
int
mask
,
unsigned
int
value
);
int
snd_soc_component_init_io
(
struct
snd_soc_component
*
component
,
struct
regmap
*
regmap
);
/* device driver data */
static
inline
void
snd_soc_card_set_drvdata
(
struct
snd_soc_card
*
card
,
...
...
@@ -1276,26 +1289,37 @@ static inline void *snd_soc_card_get_drvdata(struct snd_soc_card *card)
return
card
->
drvdata
;
}
static
inline
void
snd_soc_component_set_drvdata
(
struct
snd_soc_component
*
c
,
void
*
data
)
{
dev_set_drvdata
(
c
->
dev
,
data
);
}
static
inline
void
*
snd_soc_component_get_drvdata
(
struct
snd_soc_component
*
c
)
{
return
dev_get_drvdata
(
c
->
dev
);
}
static
inline
void
snd_soc_codec_set_drvdata
(
struct
snd_soc_codec
*
codec
,
void
*
data
)
{
dev_set_drvdata
(
codec
->
dev
,
data
);
snd_soc_component_set_drvdata
(
&
codec
->
component
,
data
);
}
static
inline
void
*
snd_soc_codec_get_drvdata
(
struct
snd_soc_codec
*
codec
)
{
return
dev_get_drvdata
(
codec
->
dev
);
return
snd_soc_component_get_drvdata
(
&
codec
->
component
);
}
static
inline
void
snd_soc_platform_set_drvdata
(
struct
snd_soc_platform
*
platform
,
void
*
data
)
{
dev_set_drvdata
(
platform
->
dev
,
data
);
snd_soc_component_set_drvdata
(
&
platform
->
component
,
data
);
}
static
inline
void
*
snd_soc_platform_get_drvdata
(
struct
snd_soc_platform
*
platform
)
{
return
dev_get_drvdata
(
platform
->
dev
);
return
snd_soc_component_get_drvdata
(
&
platform
->
component
);
}
static
inline
void
snd_soc_pcm_set_drvdata
(
struct
snd_soc_pcm_runtime
*
rtd
,
...
...
sound/soc/codecs/wm8350.c
View file @
5bcaca4b
...
...
@@ -212,7 +212,7 @@ static void wm8350_pga_work(struct work_struct *work)
{
struct
snd_soc_dapm_context
*
dapm
=
container_of
(
work
,
struct
snd_soc_dapm_context
,
delayed_work
.
work
);
struct
snd_soc_codec
*
codec
=
dapm
->
codec
;
struct
snd_soc_codec
*
codec
=
snd_soc_dapm_to_codec
(
dapm
)
;
struct
wm8350_data
*
wm8350_data
=
snd_soc_codec_get_drvdata
(
codec
);
struct
wm8350_output
*
out1
=
&
wm8350_data
->
out1
,
*
out2
=
&
wm8350_data
->
out2
;
...
...
sound/soc/codecs/wm8753.c
View file @
5bcaca4b
...
...
@@ -1433,7 +1433,7 @@ static void wm8753_work(struct work_struct *work)
struct
snd_soc_dapm_context
*
dapm
=
container_of
(
work
,
struct
snd_soc_dapm_context
,
delayed_work
.
work
);
struct
snd_soc_codec
*
codec
=
dapm
->
codec
;
struct
snd_soc_codec
*
codec
=
snd_soc_dapm_to_codec
(
dapm
)
;
wm8753_set_bias_level
(
codec
,
dapm
->
bias_level
);
}
...
...
sound/soc/codecs/wm8971.c
View file @
5bcaca4b
...
...
@@ -615,7 +615,7 @@ static void wm8971_work(struct work_struct *work)
struct
snd_soc_dapm_context
*
dapm
=
container_of
(
work
,
struct
snd_soc_dapm_context
,
delayed_work
.
work
);
struct
snd_soc_codec
*
codec
=
dapm
->
codec
;
struct
snd_soc_codec
*
codec
=
snd_soc_dapm_to_codec
(
dapm
)
;
wm8971_set_bias_level
(
codec
,
codec
->
dapm
.
bias_level
);
}
...
...
sound/soc/intel/Makefile
View file @
5bcaca4b
...
...
@@ -2,7 +2,8 @@
snd-soc-sst-dsp-objs
:=
sst-dsp.o sst-firmware.o
snd-soc-sst-acpi-objs
:=
sst-acpi.o
snd-soc-sst-mfld-platform-objs
:=
sst-mfld-platform-pcm.o sst-mfld-platform-compress.o
snd-soc-sst-mfld-platform-objs
:=
sst-mfld-platform-pcm.o
\
sst-mfld-platform-compress.o sst-atom-controls.o
snd-soc-mfld-machine-objs
:=
mfld_machine.o
obj-$(CONFIG_SND_SST_MFLD_PLATFORM)
+=
snd-soc-sst-mfld-platform.o
...
...
sound/soc/intel/sst-atom-controls.c
0 → 100644
View file @
5bcaca4b
/*
* sst-atom-controls.c - Intel MID Platform driver DPCM ALSA controls for Mrfld
*
* Copyright (C) 2013-14 Intel Corp
* Author: Omair Mohammed Abdullah <omair.m.abdullah@intel.com>
* Vinod Koul <vinod.koul@intel.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; version 2 of the License.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#include <linux/slab.h>
#include <sound/soc.h>
#include <sound/tlv.h>
#include "sst-mfld-platform.h"
#include "sst-atom-controls.h"
int
sst_dsp_init_v2_dpcm
(
struct
snd_soc_platform
*
platform
)
{
int
ret
=
0
;
struct
sst_data
*
drv
=
snd_soc_platform_get_drvdata
(
platform
);
drv
->
byte_stream
=
devm_kzalloc
(
platform
->
dev
,
SST_MAX_BIN_BYTES
,
GFP_KERNEL
);
if
(
!
drv
->
byte_stream
)
return
-
ENOMEM
;
return
ret
;
}
sound/soc/intel/sst-atom-controls.h
View file @
5bcaca4b
/*
* sst-atom-controls.h - Intel MID Platform driver header file
*
* Copyright (C) 2013-14 Intel Corp
* Author: Ramesh Babu <ramesh.babu.koul@intel.com>
* Omair M Abdullah <omair.m.abdullah@intel.com>
...
...
@@ -18,13 +20,293 @@
*
*/
#ifndef __SST_
CONTROLS_V2
_H__
#define __SST_
CONTROLS_V2
_H__
#ifndef __SST_
ATOM_CONTROLS
_H__
#define __SST_
ATOM_CONTROLS
_H__
enum
{
MERR_DPCM_AUDIO
=
0
,
MERR_DPCM_COMPR
,
};
/* define a bit for each mixer input */
#define SST_MIX_IP(x) (x)
#define SST_IP_CODEC0 SST_MIX_IP(2)
#define SST_IP_CODEC1 SST_MIX_IP(3)
#define SST_IP_LOOP0 SST_MIX_IP(4)
#define SST_IP_LOOP1 SST_MIX_IP(5)
#define SST_IP_LOOP2 SST_MIX_IP(6)
#define SST_IP_PROBE SST_MIX_IP(7)
#define SST_IP_VOIP SST_MIX_IP(12)
#define SST_IP_PCM0 SST_MIX_IP(13)
#define SST_IP_PCM1 SST_MIX_IP(14)
#define SST_IP_MEDIA0 SST_MIX_IP(17)
#define SST_IP_MEDIA1 SST_MIX_IP(18)
#define SST_IP_MEDIA2 SST_MIX_IP(19)
#define SST_IP_MEDIA3 SST_MIX_IP(20)
#define SST_IP_LAST SST_IP_MEDIA3
#define SST_SWM_INPUT_COUNT (SST_IP_LAST + 1)
#define SST_CMD_SWM_MAX_INPUTS 6
#define SST_PATH_ID_SHIFT 8
#define SST_DEFAULT_LOCATION_ID 0xFFFF
#define SST_DEFAULT_CELL_NBR 0xFF
#define SST_DEFAULT_MODULE_ID 0xFFFF
/*
* Audio DSP Path Ids. Specified by the audio DSP FW
*/
enum
sst_path_index
{
SST_PATH_INDEX_CODEC_OUT0
=
(
0x02
<<
SST_PATH_ID_SHIFT
),
SST_PATH_INDEX_CODEC_OUT1
=
(
0x03
<<
SST_PATH_ID_SHIFT
),
SST_PATH_INDEX_SPROT_LOOP_OUT
=
(
0x04
<<
SST_PATH_ID_SHIFT
),
SST_PATH_INDEX_MEDIA_LOOP1_OUT
=
(
0x05
<<
SST_PATH_ID_SHIFT
),
SST_PATH_INDEX_MEDIA_LOOP2_OUT
=
(
0x06
<<
SST_PATH_ID_SHIFT
),
SST_PATH_INDEX_VOIP_OUT
=
(
0x0C
<<
SST_PATH_ID_SHIFT
),
SST_PATH_INDEX_PCM0_OUT
=
(
0x0D
<<
SST_PATH_ID_SHIFT
),
SST_PATH_INDEX_PCM1_OUT
=
(
0x0E
<<
SST_PATH_ID_SHIFT
),
SST_PATH_INDEX_PCM2_OUT
=
(
0x0F
<<
SST_PATH_ID_SHIFT
),
SST_PATH_INDEX_MEDIA0_OUT
=
(
0x12
<<
SST_PATH_ID_SHIFT
),
SST_PATH_INDEX_MEDIA1_OUT
=
(
0x13
<<
SST_PATH_ID_SHIFT
),
/* Start of input paths */
SST_PATH_INDEX_CODEC_IN0
=
(
0x82
<<
SST_PATH_ID_SHIFT
),
SST_PATH_INDEX_CODEC_IN1
=
(
0x83
<<
SST_PATH_ID_SHIFT
),
SST_PATH_INDEX_SPROT_LOOP_IN
=
(
0x84
<<
SST_PATH_ID_SHIFT
),
SST_PATH_INDEX_MEDIA_LOOP1_IN
=
(
0x85
<<
SST_PATH_ID_SHIFT
),
SST_PATH_INDEX_MEDIA_LOOP2_IN
=
(
0x86
<<
SST_PATH_ID_SHIFT
),
SST_PATH_INDEX_VOIP_IN
=
(
0x8C
<<
SST_PATH_ID_SHIFT
),
SST_PATH_INDEX_PCM0_IN
=
(
0x8D
<<
SST_PATH_ID_SHIFT
),
SST_PATH_INDEX_PCM1_IN
=
(
0x8E
<<
SST_PATH_ID_SHIFT
),
SST_PATH_INDEX_MEDIA0_IN
=
(
0x8F
<<
SST_PATH_ID_SHIFT
),
SST_PATH_INDEX_MEDIA1_IN
=
(
0x90
<<
SST_PATH_ID_SHIFT
),
SST_PATH_INDEX_MEDIA2_IN
=
(
0x91
<<
SST_PATH_ID_SHIFT
),
SST_PATH_INDEX_MEDIA3_IN
=
(
0x9C
<<
SST_PATH_ID_SHIFT
),
SST_PATH_INDEX_RESERVED
=
(
0xFF
<<
SST_PATH_ID_SHIFT
),
};
/*
* path IDs
*/
enum
sst_swm_inputs
{
SST_SWM_IN_CODEC0
=
(
SST_PATH_INDEX_CODEC_IN0
|
SST_DEFAULT_CELL_NBR
),
SST_SWM_IN_CODEC1
=
(
SST_PATH_INDEX_CODEC_IN1
|
SST_DEFAULT_CELL_NBR
),
SST_SWM_IN_SPROT_LOOP
=
(
SST_PATH_INDEX_SPROT_LOOP_IN
|
SST_DEFAULT_CELL_NBR
),
SST_SWM_IN_MEDIA_LOOP1
=
(
SST_PATH_INDEX_MEDIA_LOOP1_IN
|
SST_DEFAULT_CELL_NBR
),
SST_SWM_IN_MEDIA_LOOP2
=
(
SST_PATH_INDEX_MEDIA_LOOP2_IN
|
SST_DEFAULT_CELL_NBR
),
SST_SWM_IN_VOIP
=
(
SST_PATH_INDEX_VOIP_IN
|
SST_DEFAULT_CELL_NBR
),
SST_SWM_IN_PCM0
=
(
SST_PATH_INDEX_PCM0_IN
|
SST_DEFAULT_CELL_NBR
),
SST_SWM_IN_PCM1
=
(
SST_PATH_INDEX_PCM1_IN
|
SST_DEFAULT_CELL_NBR
),
SST_SWM_IN_MEDIA0
=
(
SST_PATH_INDEX_MEDIA0_IN
|
SST_DEFAULT_CELL_NBR
),
/* Part of Media Mixer */
SST_SWM_IN_MEDIA1
=
(
SST_PATH_INDEX_MEDIA1_IN
|
SST_DEFAULT_CELL_NBR
),
/* Part of Media Mixer */
SST_SWM_IN_MEDIA2
=
(
SST_PATH_INDEX_MEDIA2_IN
|
SST_DEFAULT_CELL_NBR
),
/* Part of Media Mixer */
SST_SWM_IN_MEDIA3
=
(
SST_PATH_INDEX_MEDIA3_IN
|
SST_DEFAULT_CELL_NBR
),
/* Part of Media Mixer */
SST_SWM_IN_END
=
(
SST_PATH_INDEX_RESERVED
|
SST_DEFAULT_CELL_NBR
)
};
/*
* path IDs
*/
enum
sst_swm_outputs
{
SST_SWM_OUT_CODEC0
=
(
SST_PATH_INDEX_CODEC_OUT0
|
SST_DEFAULT_CELL_NBR
),
SST_SWM_OUT_CODEC1
=
(
SST_PATH_INDEX_CODEC_OUT1
|
SST_DEFAULT_CELL_NBR
),
SST_SWM_OUT_SPROT_LOOP
=
(
SST_PATH_INDEX_SPROT_LOOP_OUT
|
SST_DEFAULT_CELL_NBR
),
SST_SWM_OUT_MEDIA_LOOP1
=
(
SST_PATH_INDEX_MEDIA_LOOP1_OUT
|
SST_DEFAULT_CELL_NBR
),
SST_SWM_OUT_MEDIA_LOOP2
=
(
SST_PATH_INDEX_MEDIA_LOOP2_OUT
|
SST_DEFAULT_CELL_NBR
),
SST_SWM_OUT_VOIP
=
(
SST_PATH_INDEX_VOIP_OUT
|
SST_DEFAULT_CELL_NBR
),
SST_SWM_OUT_PCM0
=
(
SST_PATH_INDEX_PCM0_OUT
|
SST_DEFAULT_CELL_NBR
),
SST_SWM_OUT_PCM1
=
(
SST_PATH_INDEX_PCM1_OUT
|
SST_DEFAULT_CELL_NBR
),
SST_SWM_OUT_PCM2
=
(
SST_PATH_INDEX_PCM2_OUT
|
SST_DEFAULT_CELL_NBR
),
SST_SWM_OUT_MEDIA0
=
(
SST_PATH_INDEX_MEDIA0_OUT
|
SST_DEFAULT_CELL_NBR
),
/* Part of Media Mixer */
SST_SWM_OUT_MEDIA1
=
(
SST_PATH_INDEX_MEDIA1_OUT
|
SST_DEFAULT_CELL_NBR
),
/* Part of Media Mixer */
SST_SWM_OUT_END
=
(
SST_PATH_INDEX_RESERVED
|
SST_DEFAULT_CELL_NBR
),
};
enum
sst_ipc_msg
{
SST_IPC_IA_CMD
=
1
,
SST_IPC_IA_SET_PARAMS
,
SST_IPC_IA_GET_PARAMS
,
};
enum
sst_cmd_type
{
SST_CMD_BYTES_SET
=
1
,
SST_CMD_BYTES_GET
=
2
,
};
enum
sst_task
{
SST_TASK_SBA
=
1
,
SST_TASK_MMX
,
};
enum
sst_type
{
SST_TYPE_CMD
=
1
,
SST_TYPE_PARAMS
,
};
enum
sst_flag
{
SST_FLAG_BLOCKED
=
1
,
SST_FLAG_NONBLOCK
,
};
/*
* Enumeration for indexing the gain cells in VB_SET_GAIN DSP command
*/
enum
sst_gain_index
{
/* GAIN IDs for SB task start here */
SST_GAIN_INDEX_CODEC_OUT0
,
SST_GAIN_INDEX_CODEC_OUT1
,
SST_GAIN_INDEX_CODEC_IN0
,
SST_GAIN_INDEX_CODEC_IN1
,
SST_GAIN_INDEX_SPROT_LOOP_OUT
,
SST_GAIN_INDEX_MEDIA_LOOP1_OUT
,
SST_GAIN_INDEX_MEDIA_LOOP2_OUT
,
SST_GAIN_INDEX_PCM0_IN_LEFT
,
SST_GAIN_INDEX_PCM0_IN_RIGHT
,
SST_GAIN_INDEX_PCM1_OUT_LEFT
,
SST_GAIN_INDEX_PCM1_OUT_RIGHT
,
SST_GAIN_INDEX_PCM1_IN_LEFT
,
SST_GAIN_INDEX_PCM1_IN_RIGHT
,
SST_GAIN_INDEX_PCM2_OUT_LEFT
,
SST_GAIN_INDEX_PCM2_OUT_RIGHT
,
SST_GAIN_INDEX_VOIP_OUT
,
SST_GAIN_INDEX_VOIP_IN
,
/* Gain IDs for MMX task start here */
SST_GAIN_INDEX_MEDIA0_IN_LEFT
,
SST_GAIN_INDEX_MEDIA0_IN_RIGHT
,
SST_GAIN_INDEX_MEDIA1_IN_LEFT
,
SST_GAIN_INDEX_MEDIA1_IN_RIGHT
,
SST_GAIN_INDEX_MEDIA2_IN_LEFT
,
SST_GAIN_INDEX_MEDIA2_IN_RIGHT
,
SST_GAIN_INDEX_GAIN_END
};
/*
* Audio DSP module IDs specified by FW spec
* TODO: Update with all modules
*/
enum
sst_module_id
{
SST_MODULE_ID_PCM
=
0x0001
,
SST_MODULE_ID_MP3
=
0x0002
,
SST_MODULE_ID_MP24
=
0x0003
,
SST_MODULE_ID_AAC
=
0x0004
,
SST_MODULE_ID_AACP
=
0x0005
,
SST_MODULE_ID_EAACP
=
0x0006
,
SST_MODULE_ID_WMA9
=
0x0007
,
SST_MODULE_ID_WMA10
=
0x0008
,
SST_MODULE_ID_WMA10P
=
0x0009
,
SST_MODULE_ID_RA
=
0x000A
,
SST_MODULE_ID_DDAC3
=
0x000B
,
SST_MODULE_ID_TRUE_HD
=
0x000C
,
SST_MODULE_ID_HD_PLUS
=
0x000D
,
SST_MODULE_ID_SRC
=
0x0064
,
SST_MODULE_ID_DOWNMIX
=
0x0066
,
SST_MODULE_ID_GAIN_CELL
=
0x0067
,
SST_MODULE_ID_SPROT
=
0x006D
,
SST_MODULE_ID_BASS_BOOST
=
0x006E
,
SST_MODULE_ID_STEREO_WDNG
=
0x006F
,
SST_MODULE_ID_AV_REMOVAL
=
0x0070
,
SST_MODULE_ID_MIC_EQ
=
0x0071
,
SST_MODULE_ID_SPL
=
0x0072
,
SST_MODULE_ID_ALGO_VTSV
=
0x0073
,
SST_MODULE_ID_NR
=
0x0076
,
SST_MODULE_ID_BWX
=
0x0077
,
SST_MODULE_ID_DRP
=
0x0078
,
SST_MODULE_ID_MDRP
=
0x0079
,
SST_MODULE_ID_ANA
=
0x007A
,
SST_MODULE_ID_AEC
=
0x007B
,
SST_MODULE_ID_NR_SNS
=
0x007C
,
SST_MODULE_ID_SER
=
0x007D
,
SST_MODULE_ID_AGC
=
0x007E
,
SST_MODULE_ID_CNI
=
0x007F
,
SST_MODULE_ID_CONTEXT_ALGO_AWARE
=
0x0080
,
SST_MODULE_ID_FIR_24
=
0x0081
,
SST_MODULE_ID_IIR_24
=
0x0082
,
SST_MODULE_ID_ASRC
=
0x0083
,
SST_MODULE_ID_TONE_GEN
=
0x0084
,
SST_MODULE_ID_BMF
=
0x0086
,
SST_MODULE_ID_EDL
=
0x0087
,
SST_MODULE_ID_GLC
=
0x0088
,
SST_MODULE_ID_FIR_16
=
0x0089
,
SST_MODULE_ID_IIR_16
=
0x008A
,
SST_MODULE_ID_DNR
=
0x008B
,
SST_MODULE_ID_VIRTUALIZER
=
0x008C
,
SST_MODULE_ID_VISUALIZATION
=
0x008D
,
SST_MODULE_ID_LOUDNESS_OPTIMIZER
=
0x008E
,
SST_MODULE_ID_REVERBERATION
=
0x008F
,
SST_MODULE_ID_CNI_TX
=
0x0090
,
SST_MODULE_ID_REF_LINE
=
0x0091
,
SST_MODULE_ID_VOLUME
=
0x0092
,
SST_MODULE_ID_FILT_DCR
=
0x0094
,
SST_MODULE_ID_SLV
=
0x009A
,
SST_MODULE_ID_NLF
=
0x009B
,
SST_MODULE_ID_TNR
=
0x009C
,
SST_MODULE_ID_WNR
=
0x009D
,
SST_MODULE_ID_LOG
=
0xFF00
,
SST_MODULE_ID_TASK
=
0xFFFF
,
};
enum
sst_cmd
{
SBA_IDLE
=
14
,
SBA_VB_SET_SPEECH_PATH
=
26
,
MMX_SET_GAIN
=
33
,
SBA_VB_SET_GAIN
=
33
,
FBA_VB_RX_CNI
=
35
,
MMX_SET_GAIN_TIMECONST
=
36
,
SBA_VB_SET_TIMECONST
=
36
,
SBA_VB_START
=
85
,
SBA_SET_SWM
=
114
,
SBA_SET_MDRP
=
116
,
SBA_HW_SET_SSP
=
117
,
SBA_SET_MEDIA_LOOP_MAP
=
118
,
SBA_SET_MEDIA_PATH
=
119
,
MMX_SET_MEDIA_PATH
=
119
,
SBA_VB_LPRO
=
126
,
SBA_VB_SET_FIR
=
128
,
SBA_VB_SET_IIR
=
129
,
SBA_SET_SSP_SLOT_MAP
=
130
,
};
enum
sst_dsp_switch
{
SST_SWITCH_OFF
=
0
,
SST_SWITCH_ON
=
3
,
};
enum
sst_path_switch
{
SST_PATH_OFF
=
0
,
SST_PATH_ON
=
1
,
};
enum
sst_swm_state
{
SST_SWM_OFF
=
0
,
SST_SWM_ON
=
3
,
};
#endif
sound/soc/intel/sst-haswell-pcm.c
View file @
5bcaca4b
...
...
@@ -138,11 +138,10 @@ static inline unsigned int hsw_ipc_to_mixer(u32 value)
static
int
hsw_stream_volume_put
(
struct
snd_kcontrol
*
kcontrol
,
struct
snd_ctl_elem_value
*
ucontrol
)
{
struct
snd_soc_platform
*
platform
=
snd_soc_kcontrol_platform
(
kcontrol
);
struct
snd_soc_component
*
cmpnt
=
snd_soc_kcontrol_component
(
kcontrol
);
struct
hsw_priv_data
*
pdata
=
snd_soc_component_get_drvdata
(
cmpnt
);
struct
soc_mixer_control
*
mc
=
(
struct
soc_mixer_control
*
)
kcontrol
->
private_value
;
struct
hsw_priv_data
*
pdata
=
snd_soc_platform_get_drvdata
(
platform
);
struct
hsw_pcm_data
*
pcm_data
=
&
pdata
->
pcm
[
mc
->
reg
];
struct
sst_hsw
*
hsw
=
pdata
->
hsw
;
u32
volume
;
...
...
@@ -176,11 +175,10 @@ static int hsw_stream_volume_put(struct snd_kcontrol *kcontrol,
static
int
hsw_stream_volume_get
(
struct
snd_kcontrol
*
kcontrol
,
struct
snd_ctl_elem_value
*
ucontrol
)
{
struct
snd_soc_platform
*
platform
=
snd_soc_kcontrol_platform
(
kcontrol
);
struct
snd_soc_component
*
cmpnt
=
snd_soc_kcontrol_component
(
kcontrol
);
struct
hsw_priv_data
*
pdata
=
snd_soc_component_get_drvdata
(
cmpnt
);
struct
soc_mixer_control
*
mc
=
(
struct
soc_mixer_control
*
)
kcontrol
->
private_value
;
struct
hsw_priv_data
*
pdata
=
snd_soc_platform_get_drvdata
(
platform
);
struct
hsw_pcm_data
*
pcm_data
=
&
pdata
->
pcm
[
mc
->
reg
];
struct
sst_hsw
*
hsw
=
pdata
->
hsw
;
u32
volume
;
...
...
@@ -208,8 +206,8 @@ static int hsw_stream_volume_get(struct snd_kcontrol *kcontrol,
static
int
hsw_volume_put
(
struct
snd_kcontrol
*
kcontrol
,
struct
snd_ctl_elem_value
*
ucontrol
)
{
struct
snd_soc_
platform
*
platform
=
snd_soc_kcontrol_platform
(
kcontrol
);
struct
hsw_priv_data
*
pdata
=
snd_soc_
platform_get_drvdata
(
platform
);
struct
snd_soc_
component
*
cmpnt
=
snd_soc_kcontrol_component
(
kcontrol
);
struct
hsw_priv_data
*
pdata
=
snd_soc_
component_get_drvdata
(
cmpnt
);
struct
sst_hsw
*
hsw
=
pdata
->
hsw
;
u32
volume
;
...
...
@@ -233,8 +231,8 @@ static int hsw_volume_put(struct snd_kcontrol *kcontrol,
static
int
hsw_volume_get
(
struct
snd_kcontrol
*
kcontrol
,
struct
snd_ctl_elem_value
*
ucontrol
)
{
struct
snd_soc_
platform
*
platform
=
snd_soc_kcontrol_platform
(
kcontrol
);
struct
hsw_priv_data
*
pdata
=
snd_soc_
platform_get_drvdata
(
platform
);
struct
snd_soc_
component
*
cmpnt
=
snd_soc_kcontrol_component
(
kcontrol
);
struct
hsw_priv_data
*
pdata
=
snd_soc_
component_get_drvdata
(
cmpnt
);
struct
sst_hsw
*
hsw
=
pdata
->
hsw
;
unsigned
int
volume
=
0
;
...
...
@@ -778,20 +776,11 @@ static const struct snd_soc_dapm_route graph[] = {
static
int
hsw_pcm_probe
(
struct
snd_soc_platform
*
platform
)
{
struct
hsw_priv_data
*
priv_data
=
snd_soc_platform_get_drvdata
(
platform
);
struct
sst_pdata
*
pdata
=
dev_get_platdata
(
platform
->
dev
);
struct
hsw_priv_data
*
priv_data
;
struct
device
*
dma_dev
;
struct
device
*
dma_dev
=
pdata
->
dma_dev
;
int
i
,
ret
=
0
;
if
(
!
pdata
)
return
-
ENODEV
;
dma_dev
=
pdata
->
dma_dev
;
priv_data
=
devm_kzalloc
(
platform
->
dev
,
sizeof
(
*
priv_data
),
GFP_KERNEL
);
priv_data
->
hsw
=
pdata
->
dsp
;
snd_soc_platform_set_drvdata
(
platform
,
priv_data
);
/* allocate DSP buffer page tables */
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
hsw_dais
);
i
++
)
{
...
...
@@ -848,27 +837,38 @@ static struct snd_soc_platform_driver hsw_soc_platform = {
.
ops
=
&
hsw_pcm_ops
,
.
pcm_new
=
hsw_pcm_new
,
.
pcm_free
=
hsw_pcm_free
,
.
controls
=
hsw_volume_controls
,
.
num_controls
=
ARRAY_SIZE
(
hsw_volume_controls
),
.
dapm_widgets
=
widgets
,
.
num_dapm_widgets
=
ARRAY_SIZE
(
widgets
),
.
dapm_routes
=
graph
,
.
num_dapm_routes
=
ARRAY_SIZE
(
graph
),
};
static
const
struct
snd_soc_component_driver
hsw_dai_component
=
{
.
name
=
"haswell-dai"
,
.
name
=
"haswell-dai"
,
.
controls
=
hsw_volume_controls
,
.
num_controls
=
ARRAY_SIZE
(
hsw_volume_controls
),
.
dapm_widgets
=
widgets
,
.
num_dapm_widgets
=
ARRAY_SIZE
(
widgets
),
.
dapm_routes
=
graph
,
.
num_dapm_routes
=
ARRAY_SIZE
(
graph
),
};
static
int
hsw_pcm_dev_probe
(
struct
platform_device
*
pdev
)
{
struct
sst_pdata
*
sst_pdata
=
dev_get_platdata
(
&
pdev
->
dev
);
struct
hsw_priv_data
*
priv_data
;
int
ret
;
if
(
!
sst_pdata
)
return
-
EINVAL
;
priv_data
=
devm_kzalloc
(
&
pdev
->
dev
,
sizeof
(
*
priv_data
),
GFP_KERNEL
);
if
(
!
priv_data
)
return
-
ENOMEM
;
ret
=
sst_hsw_dsp_init
(
&
pdev
->
dev
,
sst_pdata
);
if
(
ret
<
0
)
return
-
ENODEV
;
priv_data
->
hsw
=
sst_pdata
->
dsp
;
platform_set_drvdata
(
pdev
,
priv_data
);
ret
=
snd_soc_register_platform
(
&
pdev
->
dev
,
&
hsw_soc_platform
);
if
(
ret
<
0
)
goto
err_plat
;
...
...
sound/soc/intel/sst-mfld-platform-compress.c
View file @
5bcaca4b
...
...
@@ -86,7 +86,7 @@ static int sst_platform_compr_free(struct snd_compr_stream *cstream)
/*need to check*/
str_id
=
stream
->
id
;
if
(
str_id
)
ret_val
=
stream
->
compr_ops
->
close
(
str_id
);
ret_val
=
stream
->
compr_ops
->
close
(
s
st
->
dev
,
s
tr_id
);
module_put
(
sst
->
dev
->
driver
->
owner
);
kfree
(
stream
);
pr_debug
(
"%s: %d
\n
"
,
__func__
,
ret_val
);
...
...
@@ -158,7 +158,7 @@ static int sst_platform_compr_set_params(struct snd_compr_stream *cstream,
cb
.
drain_cb_param
=
cstream
;
cb
.
drain_notify
=
sst_drain_notify
;
retval
=
stream
->
compr_ops
->
open
(
&
str_params
,
&
cb
);
retval
=
stream
->
compr_ops
->
open
(
sst
->
dev
,
&
str_params
,
&
cb
);
if
(
retval
<
0
)
{
pr_err
(
"stream allocation failed %d
\n
"
,
retval
);
return
retval
;
...
...
@@ -170,10 +170,30 @@ static int sst_platform_compr_set_params(struct snd_compr_stream *cstream,
static
int
sst_platform_compr_trigger
(
struct
snd_compr_stream
*
cstream
,
int
cmd
)
{
struct
sst_runtime_stream
*
stream
=
cstream
->
runtime
->
private_data
;
return
stream
->
compr_ops
->
control
(
cmd
,
stream
->
id
);
struct
sst_runtime_stream
*
stream
=
cstream
->
runtime
->
private_data
;
switch
(
cmd
)
{
case
SNDRV_PCM_TRIGGER_START
:
if
(
stream
->
compr_ops
->
stream_start
)
return
stream
->
compr_ops
->
stream_start
(
sst
->
dev
,
stream
->
id
);
case
SNDRV_PCM_TRIGGER_STOP
:
if
(
stream
->
compr_ops
->
stream_drop
)
return
stream
->
compr_ops
->
stream_drop
(
sst
->
dev
,
stream
->
id
);
case
SND_COMPR_TRIGGER_DRAIN
:
if
(
stream
->
compr_ops
->
stream_drain
)
return
stream
->
compr_ops
->
stream_drain
(
sst
->
dev
,
stream
->
id
);
case
SND_COMPR_TRIGGER_PARTIAL_DRAIN
:
if
(
stream
->
compr_ops
->
stream_partial_drain
)
return
stream
->
compr_ops
->
stream_partial_drain
(
sst
->
dev
,
stream
->
id
);
case
SNDRV_PCM_TRIGGER_PAUSE_PUSH
:
if
(
stream
->
compr_ops
->
stream_pause
)
return
stream
->
compr_ops
->
stream_pause
(
sst
->
dev
,
stream
->
id
);
case
SNDRV_PCM_TRIGGER_PAUSE_RELEASE
:
if
(
stream
->
compr_ops
->
stream_pause_release
)
return
stream
->
compr_ops
->
stream_pause_release
(
sst
->
dev
,
stream
->
id
);
default:
return
-
EINVAL
;
}
}
static
int
sst_platform_compr_pointer
(
struct
snd_compr_stream
*
cstream
,
...
...
@@ -182,7 +202,7 @@ static int sst_platform_compr_pointer(struct snd_compr_stream *cstream,
struct
sst_runtime_stream
*
stream
;
stream
=
cstream
->
runtime
->
private_data
;
stream
->
compr_ops
->
tstamp
(
stream
->
id
,
tstamp
);
stream
->
compr_ops
->
tstamp
(
s
st
->
dev
,
s
tream
->
id
,
tstamp
);
tstamp
->
byte_offset
=
tstamp
->
copied_total
%
(
u32
)
cstream
->
runtime
->
buffer_size
;
pr_debug
(
"calc bytes offset/copied bytes as %d
\n
"
,
tstamp
->
byte_offset
);
...
...
@@ -195,7 +215,7 @@ static int sst_platform_compr_ack(struct snd_compr_stream *cstream,
struct
sst_runtime_stream
*
stream
;
stream
=
cstream
->
runtime
->
private_data
;
stream
->
compr_ops
->
ack
(
stream
->
id
,
(
unsigned
long
)
bytes
);
stream
->
compr_ops
->
ack
(
s
st
->
dev
,
s
tream
->
id
,
(
unsigned
long
)
bytes
);
stream
->
bytes_written
+=
bytes
;
return
0
;
...
...
@@ -225,7 +245,7 @@ static int sst_platform_compr_set_metadata(struct snd_compr_stream *cstream,
struct
sst_runtime_stream
*
stream
=
cstream
->
runtime
->
private_data
;
return
stream
->
compr_ops
->
set_metadata
(
stream
->
id
,
metadata
);
return
stream
->
compr_ops
->
set_metadata
(
s
st
->
dev
,
s
tream
->
id
,
metadata
);
}
struct
snd_compr_ops
sst_platform_compr_ops
=
{
...
...
sound/soc/intel/sst-mfld-platform-pcm.c
View file @
5bcaca4b
...
...
@@ -277,7 +277,7 @@ static int sst_platform_alloc_stream(struct snd_pcm_substream *substream,
stream
->
stream_info
.
str_id
=
str_params
.
stream_id
;
ret_val
=
stream
->
ops
->
open
(
&
str_params
);
ret_val
=
stream
->
ops
->
open
(
sst
->
dev
,
&
str_params
);
if
(
ret_val
<=
0
)
return
ret_val
;
...
...
@@ -314,14 +314,12 @@ static int sst_platform_init_stream(struct snd_pcm_substream *substream)
stream
->
stream_info
.
arg
=
substream
;
stream
->
stream_info
.
buffer_ptr
=
0
;
stream
->
stream_info
.
sfreq
=
substream
->
runtime
->
rate
;
ret_val
=
stream
->
ops
->
device_control
(
SST_SND_STREAM_INIT
,
&
stream
->
stream_info
);
ret_val
=
stream
->
ops
->
stream_init
(
sst
->
dev
,
&
stream
->
stream_info
);
if
(
ret_val
)
pr_err
(
"control_set ret error %d
\n
"
,
ret_val
);
return
ret_val
;
}
/* end -- helper functions */
static
int
sst_media_open
(
struct
snd_pcm_substream
*
substream
,
struct
snd_soc_dai
*
dai
)
...
...
@@ -373,7 +371,7 @@ static void sst_media_close(struct snd_pcm_substream *substream,
stream
=
substream
->
runtime
->
private_data
;
str_id
=
stream
->
stream_info
.
str_id
;
if
(
str_id
)
ret_val
=
stream
->
ops
->
close
(
str_id
);
ret_val
=
stream
->
ops
->
close
(
s
st
->
dev
,
s
tr_id
);
module_put
(
sst
->
dev
->
driver
->
owner
);
kfree
(
stream
);
}
...
...
@@ -403,8 +401,7 @@ static int sst_media_prepare(struct snd_pcm_substream *substream,
stream
=
substream
->
runtime
->
private_data
;
str_id
=
stream
->
stream_info
.
str_id
;
if
(
stream
->
stream_info
.
str_id
)
{
ret_val
=
stream
->
ops
->
device_control
(
SST_SND_DROP
,
&
str_id
);
ret_val
=
stream
->
ops
->
stream_drop
(
sst
->
dev
,
str_id
);
return
ret_val
;
}
...
...
@@ -461,7 +458,7 @@ static int sst_platform_pcm_trigger(struct snd_pcm_substream *substream,
{
int
ret_val
=
0
,
str_id
;
struct
sst_runtime_stream
*
stream
;
int
st
r_cmd
,
st
atus
;
int
status
;
pr_debug
(
"sst_platform_pcm_trigger called
\n
"
);
stream
=
substream
->
runtime
->
private_data
;
...
...
@@ -469,29 +466,29 @@ static int sst_platform_pcm_trigger(struct snd_pcm_substream *substream,
switch
(
cmd
)
{
case
SNDRV_PCM_TRIGGER_START
:
pr_debug
(
"sst: Trigger Start
\n
"
);
str_cmd
=
SST_SND_START
;
status
=
SST_PLATFORM_RUNNING
;
stream
->
stream_info
.
arg
=
substream
;
ret_val
=
stream
->
ops
->
stream_start
(
sst
->
dev
,
str_id
);
break
;
case
SNDRV_PCM_TRIGGER_STOP
:
pr_debug
(
"sst: in stop
\n
"
);
str_cmd
=
SST_SND_DROP
;
status
=
SST_PLATFORM_DROPPED
;
ret_val
=
stream
->
ops
->
stream_drop
(
sst
->
dev
,
str_id
);
break
;
case
SNDRV_PCM_TRIGGER_PAUSE_PUSH
:
pr_debug
(
"sst: in pause
\n
"
);
str_cmd
=
SST_SND_PAUSE
;
status
=
SST_PLATFORM_PAUSED
;
ret_val
=
stream
->
ops
->
stream_pause
(
sst
->
dev
,
str_id
);
break
;
case
SNDRV_PCM_TRIGGER_PAUSE_RELEASE
:
pr_debug
(
"sst: in pause release
\n
"
);
str_cmd
=
SST_SND_RESUME
;
status
=
SST_PLATFORM_RUNNING
;
ret_val
=
stream
->
ops
->
stream_pause_release
(
sst
->
dev
,
str_id
);
break
;
default:
return
-
EINVAL
;
}
ret_val
=
stream
->
ops
->
device_control
(
str_cmd
,
&
str_id
);
if
(
!
ret_val
)
sst_set_stream_status
(
stream
,
status
);
...
...
@@ -511,8 +508,7 @@ static snd_pcm_uframes_t sst_platform_pcm_pointer
if
(
status
==
SST_PLATFORM_INIT
)
return
0
;
str_info
=
&
stream
->
stream_info
;
ret_val
=
stream
->
ops
->
device_control
(
SST_SND_BUFFER_POINTER
,
str_info
);
ret_val
=
stream
->
ops
->
stream_read_tstamp
(
sst
->
dev
,
str_info
);
if
(
ret_val
)
{
pr_err
(
"sst: error code = %d
\n
"
,
ret_val
);
return
ret_val
;
...
...
@@ -554,7 +550,13 @@ static int sst_pcm_new(struct snd_soc_pcm_runtime *rtd)
return
retval
;
}
static
struct
snd_soc_platform_driver
sst_soc_platform_drv
=
{
static
int
sst_soc_probe
(
struct
snd_soc_platform
*
platform
)
{
return
sst_dsp_init_v2_dpcm
(
platform
);
}
static
struct
snd_soc_platform_driver
sst_soc_platform_drv
=
{
.
probe
=
sst_soc_probe
,
.
ops
=
&
sst_platform_ops
,
.
compr_ops
=
&
sst_platform_compr_ops
,
.
pcm_new
=
sst_pcm_new
,
...
...
sound/soc/intel/sst-mfld-platform.h
View file @
5bcaca4b
...
...
@@ -54,20 +54,6 @@ enum sst_drv_status {
SST_PLATFORM_DROPPED
,
};
enum
sst_controls
{
SST_SND_ALLOC
=
0x00
,
SST_SND_PAUSE
=
0x01
,
SST_SND_RESUME
=
0x02
,
SST_SND_DROP
=
0x03
,
SST_SND_FREE
=
0x04
,
SST_SND_BUFFER_POINTER
=
0x05
,
SST_SND_STREAM_INIT
=
0x06
,
SST_SND_START
=
0x07
,
SST_SET_BYTE_STREAM
=
0x100A
,
SST_GET_BYTE_STREAM
=
0x100B
,
SST_MAX_CONTROLS
=
SST_GET_BYTE_STREAM
,
};
enum
sst_stream_ops
{
STREAM_OPS_PLAYBACK
=
0
,
STREAM_OPS_CAPTURE
,
...
...
@@ -113,24 +99,36 @@ struct sst_compress_cb {
struct
compress_sst_ops
{
const
char
*
name
;
int
(
*
open
)
(
struct
snd_sst_params
*
str_params
,
struct
sst_compress_cb
*
cb
);
int
(
*
control
)
(
unsigned
int
cmd
,
unsigned
int
str_id
);
int
(
*
tstamp
)
(
unsigned
int
str_id
,
struct
snd_compr_tstamp
*
tstamp
);
int
(
*
ack
)
(
unsigned
int
str_id
,
unsigned
long
bytes
);
int
(
*
close
)
(
unsigned
int
str_id
);
int
(
*
get_caps
)
(
struct
snd_compr_caps
*
caps
);
int
(
*
get_codec_caps
)
(
struct
snd_compr_codec_caps
*
codec
);
int
(
*
set_metadata
)
(
unsigned
int
str_id
,
int
(
*
open
)(
struct
device
*
dev
,
struct
snd_sst_params
*
str_params
,
struct
sst_compress_cb
*
cb
);
int
(
*
stream_start
)(
struct
device
*
dev
,
unsigned
int
str_id
);
int
(
*
stream_drop
)(
struct
device
*
dev
,
unsigned
int
str_id
);
int
(
*
stream_drain
)(
struct
device
*
dev
,
unsigned
int
str_id
);
int
(
*
stream_partial_drain
)(
struct
device
*
dev
,
unsigned
int
str_id
);
int
(
*
stream_pause
)(
struct
device
*
dev
,
unsigned
int
str_id
);
int
(
*
stream_pause_release
)(
struct
device
*
dev
,
unsigned
int
str_id
);
int
(
*
tstamp
)(
struct
device
*
dev
,
unsigned
int
str_id
,
struct
snd_compr_tstamp
*
tstamp
);
int
(
*
ack
)(
struct
device
*
dev
,
unsigned
int
str_id
,
unsigned
long
bytes
);
int
(
*
close
)(
struct
device
*
dev
,
unsigned
int
str_id
);
int
(
*
get_caps
)(
struct
snd_compr_caps
*
caps
);
int
(
*
get_codec_caps
)(
struct
snd_compr_codec_caps
*
codec
);
int
(
*
set_metadata
)(
struct
device
*
dev
,
unsigned
int
str_id
,
struct
snd_compr_metadata
*
mdata
);
};
struct
sst_ops
{
int
(
*
open
)
(
struct
snd_sst_params
*
str_param
);
int
(
*
device_control
)
(
int
cmd
,
void
*
arg
);
int
(
*
set_generic_params
)(
enum
sst_controls
cmd
,
void
*
arg
);
int
(
*
close
)
(
unsigned
int
str_id
);
int
(
*
open
)
(
struct
device
*
dev
,
struct
snd_sst_params
*
str_param
);
int
(
*
stream_init
)
(
struct
device
*
dev
,
struct
pcm_stream_info
*
str_info
);
int
(
*
stream_start
)
(
struct
device
*
dev
,
int
str_id
);
int
(
*
stream_drop
)
(
struct
device
*
dev
,
int
str_id
);
int
(
*
stream_pause
)
(
struct
device
*
dev
,
int
str_id
);
int
(
*
stream_pause_release
)
(
struct
device
*
dev
,
int
str_id
);
int
(
*
stream_read_tstamp
)
(
struct
device
*
dev
,
struct
pcm_stream_info
*
str_info
);
int
(
*
send_byte_stream
)(
struct
device
*
dev
,
struct
snd_sst_bytes_v2
*
bytes
);
int
(
*
close
)
(
struct
device
*
dev
,
unsigned
int
str_id
);
};
struct
sst_runtime_stream
{
...
...
@@ -152,6 +150,8 @@ struct sst_device {
};
struct
sst_data
;
int
sst_dsp_init_v2_dpcm
(
struct
snd_soc_platform
*
platform
);
void
sst_set_stream_status
(
struct
sst_runtime_stream
*
stream
,
int
state
);
int
sst_fill_stream_params
(
void
*
substream
,
const
struct
sst_data
*
ctx
,
struct
snd_sst_params
*
str_params
,
bool
is_compress
);
...
...
@@ -166,6 +166,7 @@ struct sst_algo_int_control_v2 {
struct
sst_data
{
struct
platform_device
*
pdev
;
struct
sst_platform_data
*
pdata
;
char
*
byte_stream
;
struct
mutex
lock
;
};
int
sst_register_dsp
(
struct
sst_device
*
sst
);
...
...
sound/soc/omap/rx51.c
View file @
5bcaca4b
...
...
@@ -168,7 +168,7 @@ static int rx51_spk_event(struct snd_soc_dapm_widget *w,
static
int
rx51_hp_event
(
struct
snd_soc_dapm_widget
*
w
,
struct
snd_kcontrol
*
k
,
int
event
)
{
struct
snd_soc_codec
*
codec
=
w
->
dapm
->
codec
;
struct
snd_soc_codec
*
codec
=
snd_soc_dapm_to_codec
(
w
->
dapm
)
;
if
(
SND_SOC_DAPM_EVENT_ON
(
event
))
tpa6130a2_stereo_enable
(
codec
,
1
);
...
...
sound/soc/samsung/speyside.c
View file @
5bcaca4b
...
...
@@ -228,10 +228,12 @@ static struct snd_soc_dai_link speyside_dai[] = {
},
};
static
int
speyside_wm9081_init
(
struct
snd_soc_
dapm_context
*
dapm
)
static
int
speyside_wm9081_init
(
struct
snd_soc_
component
*
component
)
{
struct
snd_soc_codec
*
codec
=
snd_soc_component_to_codec
(
component
);
/* At any time the WM9081 is active it will have this clock */
return
snd_soc_codec_set_sysclk
(
dapm
->
codec
,
WM9081_SYSCLK_MCLK
,
0
,
return
snd_soc_codec_set_sysclk
(
codec
,
WM9081_SYSCLK_MCLK
,
0
,
MCLK_AUDIO_RATE
,
0
);
}
...
...
sound/soc/soc-core.c
View file @
5bcaca4b
...
...
@@ -270,79 +270,54 @@ static const struct file_operations codec_reg_fops = {
.
llseek
=
default_llseek
,
};
static
struct
dentry
*
soc_debugfs_create_dir
(
struct
dentry
*
parent
,
const
char
*
fmt
,
...)
static
void
soc_init_component_debugfs
(
struct
snd_soc_component
*
component
)
{
struct
dentry
*
de
;
va_list
ap
;
char
*
s
;
if
(
component
->
debugfs_prefix
)
{
char
*
name
;
va_start
(
ap
,
fmt
);
s
=
kvasprintf
(
GFP_KERNEL
,
fmt
,
ap
);
va_end
(
ap
);
name
=
kasprintf
(
GFP_KERNEL
,
"%s:%s"
,
component
->
debugfs_prefix
,
component
->
name
);
if
(
name
)
{
component
->
debugfs_root
=
debugfs_create_dir
(
name
,
component
->
card
->
debugfs_card_root
);
kfree
(
name
);
}
}
else
{
component
->
debugfs_root
=
debugfs_create_dir
(
component
->
name
,
component
->
card
->
debugfs_card_root
);
}
if
(
!
s
)
return
NULL
;
if
(
!
component
->
debugfs_root
)
{
dev_warn
(
component
->
dev
,
"ASoC: Failed to create component debugfs directory
\n
"
);
return
;
}
de
=
debugfs_create_dir
(
s
,
parent
);
kfree
(
s
);
snd_soc_dapm_debugfs_init
(
snd_soc_component_get_dapm
(
component
),
component
->
debugfs_root
);
return
de
;
if
(
component
->
init_debugfs
)
component
->
init_debugfs
(
component
);
}
static
void
soc_
init_codec_debugfs
(
struct
snd_soc_codec
*
codec
)
static
void
soc_
cleanup_component_debugfs
(
struct
snd_soc_component
*
component
)
{
struct
dentry
*
debugfs_card_root
=
codec
->
component
.
card
->
debugfs_card_root
;
debugfs_remove_recursive
(
component
->
debugfs_root
);
}
codec
->
debugfs_codec_root
=
soc_debugfs_create_dir
(
debugfs_card_root
,
"codec:%s"
,
codec
->
component
.
name
);
if
(
!
codec
->
debugfs_codec_root
)
{
dev_warn
(
codec
->
dev
,
"ASoC: Failed to create codec debugfs directory
\n
"
);
return
;
}
static
void
soc_init_codec_debugfs
(
struct
snd_soc_component
*
component
)
{
struct
snd_soc_codec
*
codec
=
snd_soc_component_to_codec
(
component
);
debugfs_create_bool
(
"cache_sync"
,
0444
,
codec
->
debugfs_codec
_root
,
debugfs_create_bool
(
"cache_sync"
,
0444
,
codec
->
component
.
debugfs
_root
,
&
codec
->
cache_sync
);
debugfs_create_bool
(
"cache_only"
,
0444
,
codec
->
debugfs_codec_root
,
&
codec
->
cache_only
);
codec
->
debugfs_reg
=
debugfs_create_file
(
"codec_reg"
,
0644
,
codec
->
debugfs_codec
_root
,
codec
->
component
.
debugfs
_root
,
codec
,
&
codec_reg_fops
);
if
(
!
codec
->
debugfs_reg
)
dev_warn
(
codec
->
dev
,
"ASoC: Failed to create codec register debugfs file
\n
"
);
snd_soc_dapm_debugfs_init
(
&
codec
->
dapm
,
codec
->
debugfs_codec_root
);
}
static
void
soc_cleanup_codec_debugfs
(
struct
snd_soc_codec
*
codec
)
{
debugfs_remove_recursive
(
codec
->
debugfs_codec_root
);
}
static
void
soc_init_platform_debugfs
(
struct
snd_soc_platform
*
platform
)
{
struct
dentry
*
debugfs_card_root
=
platform
->
component
.
card
->
debugfs_card_root
;
platform
->
debugfs_platform_root
=
soc_debugfs_create_dir
(
debugfs_card_root
,
"platform:%s"
,
platform
->
component
.
name
);
if
(
!
platform
->
debugfs_platform_root
)
{
dev_warn
(
platform
->
dev
,
"ASoC: Failed to create platform debugfs directory
\n
"
);
return
;
}
snd_soc_dapm_debugfs_init
(
&
platform
->
component
.
dapm
,
platform
->
debugfs_platform_root
);
}
static
void
soc_cleanup_platform_debugfs
(
struct
snd_soc_platform
*
platform
)
{
debugfs_remove_recursive
(
platform
->
debugfs_platform_root
);
}
static
ssize_t
codec_list_read_file
(
struct
file
*
file
,
char
__user
*
user_buf
,
...
...
@@ -474,19 +449,15 @@ static void soc_cleanup_card_debugfs(struct snd_soc_card *card)
#else
static
inline
void
soc_init_codec_debugfs
(
struct
snd_soc_codec
*
codec
)
{
}
static
inline
void
soc_cleanup_codec_debugfs
(
struct
snd_soc_codec
*
codec
)
{
}
#define soc_init_codec_debugfs NULL
static
inline
void
soc_init_platform_debugfs
(
struct
snd_soc_platform
*
platform
)
static
inline
void
soc_init_component_debugfs
(
struct
snd_soc_component
*
component
)
{
}
static
inline
void
soc_cleanup_platform_debugfs
(
struct
snd_soc_platform
*
platform
)
static
inline
void
soc_cleanup_component_debugfs
(
struct
snd_soc_component
*
component
)
{
}
...
...
@@ -579,10 +550,8 @@ int snd_soc_suspend(struct device *dev)
struct
snd_soc_codec
*
codec
;
int
i
,
j
;
/* If the initialization of this soc device failed, there is no codec
* associated with it. Just bail out in this case.
*/
if
(
list_empty
(
&
card
->
codec_dev_list
))
/* If the card is not initialized yet there is nothing to do */
if
(
!
card
->
instantiated
)
return
0
;
/* Due to the resume being scheduled into a workqueue we could
...
...
@@ -835,10 +804,8 @@ int snd_soc_resume(struct device *dev)
struct
snd_soc_card
*
card
=
dev_get_drvdata
(
dev
);
int
i
,
ac97_control
=
0
;
/* If the initialization of this soc device failed, there is no codec
* associated with it. Just bail out in this case.
*/
if
(
list_empty
(
&
card
->
codec_dev_list
))
/* If the card is not initialized yet there is nothing to do */
if
(
!
card
->
instantiated
)
return
0
;
/* activate pins from sleep state */
...
...
@@ -887,35 +854,40 @@ EXPORT_SYMBOL_GPL(snd_soc_resume);
static
const
struct
snd_soc_dai_ops
null_dai_ops
=
{
};
static
struct
snd_soc_codec
*
soc_find_codec
(
const
struct
device_node
*
codec_of_node
,
const
char
*
codec_name
)
static
struct
snd_soc_component
*
soc_find_component
(
const
struct
device_node
*
of_node
,
const
char
*
name
)
{
struct
snd_soc_co
dec
*
codec
;
struct
snd_soc_co
mponent
*
component
;
list_for_each_entry
(
codec
,
&
codec_list
,
list
)
{
if
(
codec_of_node
)
{
if
(
codec
->
dev
->
of_node
!=
codec_of_node
)
continue
;
}
else
{
if
(
strcmp
(
codec
->
component
.
name
,
codec_name
))
continue
;
list_for_each_entry
(
component
,
&
component_list
,
list
)
{
if
(
of_node
)
{
if
(
component
->
dev
->
of_node
==
of_node
)
return
component
;
}
else
if
(
strcmp
(
component
->
name
,
name
)
==
0
)
{
return
component
;
}
return
codec
;
}
return
NULL
;
}
static
struct
snd_soc_dai
*
s
oc_find_codec_dai
(
struct
snd_soc_codec
*
codec
,
const
char
*
codec_dai_name
)
static
struct
snd_soc_dai
*
s
nd_soc_find_dai
(
const
struct
snd_soc_dai_link_component
*
dlc
)
{
struct
snd_soc_dai
*
codec_dai
;
struct
snd_soc_component
*
component
;
struct
snd_soc_dai
*
dai
;
list_for_each_entry
(
codec_dai
,
&
codec
->
component
.
dai_list
,
list
)
{
if
(
!
strcmp
(
codec_dai
->
name
,
codec_dai_name
))
{
return
codec_dai
;
/* Find CPU DAI from registered DAIs*/
list_for_each_entry
(
component
,
&
component_list
,
list
)
{
if
(
dlc
->
of_node
&&
component
->
dev
->
of_node
!=
dlc
->
of_node
)
continue
;
if
(
dlc
->
name
&&
strcmp
(
dev_name
(
component
->
dev
),
dlc
->
name
))
continue
;
list_for_each_entry
(
dai
,
&
component
->
dai_list
,
list
)
{
if
(
dlc
->
dai_name
&&
strcmp
(
dai
->
name
,
dlc
->
dai_name
))
continue
;
return
dai
;
}
}
...
...
@@ -926,33 +898,19 @@ static int soc_bind_dai_link(struct snd_soc_card *card, int num)
{
struct
snd_soc_dai_link
*
dai_link
=
&
card
->
dai_link
[
num
];
struct
snd_soc_pcm_runtime
*
rtd
=
&
card
->
rtd
[
num
];
struct
snd_soc_component
*
component
;
struct
snd_soc_dai_link_component
*
codecs
=
dai_link
->
codecs
;
struct
snd_soc_dai_link_component
cpu_dai_component
;
struct
snd_soc_dai
**
codec_dais
=
rtd
->
codec_dais
;
struct
snd_soc_platform
*
platform
;
struct
snd_soc_dai
*
cpu_dai
;
const
char
*
platform_name
;
int
i
;
dev_dbg
(
card
->
dev
,
"ASoC: binding %s at idx %d
\n
"
,
dai_link
->
name
,
num
);
/* Find CPU DAI from registered DAIs*/
list_for_each_entry
(
component
,
&
component_list
,
list
)
{
if
(
dai_link
->
cpu_of_node
&&
component
->
dev
->
of_node
!=
dai_link
->
cpu_of_node
)
continue
;
if
(
dai_link
->
cpu_name
&&
strcmp
(
dev_name
(
component
->
dev
),
dai_link
->
cpu_name
))
continue
;
list_for_each_entry
(
cpu_dai
,
&
component
->
dai_list
,
list
)
{
if
(
dai_link
->
cpu_dai_name
&&
strcmp
(
cpu_dai
->
name
,
dai_link
->
cpu_dai_name
))
continue
;
rtd
->
cpu_dai
=
cpu_dai
;
}
}
cpu_dai_component
.
name
=
dai_link
->
cpu_name
;
cpu_dai_component
.
of_node
=
dai_link
->
cpu_of_node
;
cpu_dai_component
.
dai_name
=
dai_link
->
cpu_dai_name
;
rtd
->
cpu_dai
=
snd_soc_find_dai
(
&
cpu_dai_component
);
if
(
!
rtd
->
cpu_dai
)
{
dev_err
(
card
->
dev
,
"ASoC: CPU DAI %s not registered
\n
"
,
dai_link
->
cpu_dai_name
);
...
...
@@ -963,15 +921,7 @@ static int soc_bind_dai_link(struct snd_soc_card *card, int num)
/* Find CODEC from registered CODECs */
for
(
i
=
0
;
i
<
rtd
->
num_codecs
;
i
++
)
{
struct
snd_soc_codec
*
codec
;
codec
=
soc_find_codec
(
codecs
[
i
].
of_node
,
codecs
[
i
].
name
);
if
(
!
codec
)
{
dev_err
(
card
->
dev
,
"ASoC: CODEC %s not registered
\n
"
,
codecs
[
i
].
name
);
return
-
EPROBE_DEFER
;
}
codec_dais
[
i
]
=
soc_find_codec_dai
(
codec
,
codecs
[
i
].
dai_name
);
codec_dais
[
i
]
=
snd_soc_find_dai
(
&
codecs
[
i
]);
if
(
!
codec_dais
[
i
])
{
dev_err
(
card
->
dev
,
"ASoC: CODEC DAI %s not registered
\n
"
,
codecs
[
i
].
dai_name
);
...
...
@@ -1012,68 +962,46 @@ static int soc_bind_dai_link(struct snd_soc_card *card, int num)
return
0
;
}
static
int
soc_remove_platform
(
struct
snd_soc_platform
*
platform
)
static
void
soc_remove_component
(
struct
snd_soc_component
*
component
)
{
int
ret
;
if
(
platform
->
driver
->
remove
)
{
ret
=
platform
->
driver
->
remove
(
platform
);
if
(
ret
<
0
)
dev_err
(
platform
->
dev
,
"ASoC: failed to remove %d
\n
"
,
ret
);
}
/* Make sure all DAPM widgets are freed */
snd_soc_dapm_free
(
&
platform
->
component
.
dapm
);
soc_cleanup_platform_debugfs
(
platform
);
platform
->
probed
=
0
;
module_put
(
platform
->
dev
->
driver
->
owner
);
return
0
;
}
if
(
!
component
->
probed
)
return
;
static
void
soc_remove_codec
(
struct
snd_soc_codec
*
codec
)
{
int
err
;
/* This is a HACK and will be removed soon */
if
(
component
->
codec
)
list_del
(
&
component
->
codec
->
card_list
)
;
if
(
codec
->
driver
->
remove
)
{
err
=
codec
->
driver
->
remove
(
codec
);
if
(
err
<
0
)
dev_err
(
codec
->
dev
,
"ASoC: failed to remove %d
\n
"
,
err
);
}
if
(
component
->
remove
)
component
->
remove
(
component
);
/* Make sure all DAPM widgets are freed */
snd_soc_dapm_free
(
&
codec
->
dapm
);
snd_soc_dapm_free
(
snd_soc_component_get_dapm
(
component
));
soc_cleanup_codec_debugfs
(
codec
);
codec
->
probed
=
0
;
list_del
(
&
codec
->
card_list
);
module_put
(
codec
->
dev
->
driver
->
owner
);
soc_cleanup_component_debugfs
(
component
);
component
->
probed
=
0
;
module_put
(
component
->
dev
->
driver
->
owner
);
}
static
void
soc_remove_
codec_dai
(
struct
snd_soc_dai
*
codec_
dai
,
int
order
)
static
void
soc_remove_
dai
(
struct
snd_soc_dai
*
dai
,
int
order
)
{
int
err
;
if
(
codec_dai
&&
codec_
dai
->
probed
&&
codec_
dai
->
driver
->
remove_order
==
order
)
{
if
(
codec_
dai
->
driver
->
remove
)
{
err
=
codec_dai
->
driver
->
remove
(
codec_
dai
);
if
(
dai
&&
dai
->
probed
&&
dai
->
driver
->
remove_order
==
order
)
{
if
(
dai
->
driver
->
remove
)
{
err
=
dai
->
driver
->
remove
(
dai
);
if
(
err
<
0
)
dev_err
(
codec_
dai
->
dev
,
dev_err
(
dai
->
dev
,
"ASoC: failed to remove %s: %d
\n
"
,
codec_
dai
->
name
,
err
);
dai
->
name
,
err
);
}
codec_
dai
->
probed
=
0
;
dai
->
probed
=
0
;
}
}
static
void
soc_remove_link_dais
(
struct
snd_soc_card
*
card
,
int
num
,
int
order
)
{
struct
snd_soc_pcm_runtime
*
rtd
=
&
card
->
rtd
[
num
];
struct
snd_soc_dai
*
cpu_dai
=
rtd
->
cpu_dai
;
int
i
,
err
;
int
i
;
/* unregister the rtd device */
if
(
rtd
->
dev_registered
)
{
...
...
@@ -1085,22 +1013,9 @@ static void soc_remove_link_dais(struct snd_soc_card *card, int num, int order)
/* remove the CODEC DAI */
for
(
i
=
0
;
i
<
rtd
->
num_codecs
;
i
++
)
soc_remove_
codec_
dai
(
rtd
->
codec_dais
[
i
],
order
);
soc_remove_dai
(
rtd
->
codec_dais
[
i
],
order
);
/* remove the cpu_dai */
if
(
cpu_dai
&&
cpu_dai
->
probed
&&
cpu_dai
->
driver
->
remove_order
==
order
)
{
if
(
cpu_dai
->
driver
->
remove
)
{
err
=
cpu_dai
->
driver
->
remove
(
cpu_dai
);
if
(
err
<
0
)
dev_err
(
cpu_dai
->
dev
,
"ASoC: failed to remove %s: %d
\n
"
,
cpu_dai
->
name
,
err
);
}
cpu_dai
->
probed
=
0
;
if
(
!
cpu_dai
->
codec
)
module_put
(
cpu_dai
->
dev
->
driver
->
owner
);
}
soc_remove_dai
(
rtd
->
cpu_dai
,
order
);
}
static
void
soc_remove_link_components
(
struct
snd_soc_card
*
card
,
int
num
,
...
...
@@ -1109,29 +1024,24 @@ static void soc_remove_link_components(struct snd_soc_card *card, int num,
struct
snd_soc_pcm_runtime
*
rtd
=
&
card
->
rtd
[
num
];
struct
snd_soc_dai
*
cpu_dai
=
rtd
->
cpu_dai
;
struct
snd_soc_platform
*
platform
=
rtd
->
platform
;
struct
snd_soc_co
dec
*
codec
;
struct
snd_soc_co
mponent
*
component
;
int
i
;
/* remove the platform */
if
(
platform
&&
platform
->
probed
&&
platform
->
driver
->
remove_order
==
order
)
{
soc_remove_platform
(
platform
);
}
if
(
platform
&&
platform
->
component
.
driver
->
remove_order
==
order
)
soc_remove_component
(
&
platform
->
component
);
/* remove the CODEC-side CODEC */
for
(
i
=
0
;
i
<
rtd
->
num_codecs
;
i
++
)
{
codec
=
rtd
->
codec_dais
[
i
]
->
codec
;
if
(
codec
&&
codec
->
probed
&&
codec
->
driver
->
remove_order
==
order
)
soc_remove_codec
(
codec
);
component
=
rtd
->
codec_dais
[
i
]
->
component
;
if
(
component
->
driver
->
remove_order
==
order
)
soc_remove_component
(
component
);
}
/* remove any CPU-side CODEC */
if
(
cpu_dai
)
{
codec
=
cpu_dai
->
codec
;
if
(
codec
&&
codec
->
probed
&&
codec
->
driver
->
remove_order
==
order
)
soc_remove_codec
(
codec
);
if
(
cpu_dai
->
component
->
driver
->
remove_order
==
order
)
soc_remove_component
(
cpu_dai
->
component
);
}
}
...
...
@@ -1173,137 +1083,78 @@ static void soc_set_name_prefix(struct snd_soc_card *card,
}
}
static
int
soc_probe_co
dec
(
struct
snd_soc_card
*
card
,
struct
snd_soc_codec
*
codec
)
static
int
soc_probe_co
mponent
(
struct
snd_soc_card
*
card
,
struct
snd_soc_component
*
component
)
{
int
ret
=
0
;
const
struct
snd_soc_codec_driver
*
driver
=
codec
->
driver
;
struct
snd_soc_dapm_context
*
dapm
=
snd_soc_component_get_dapm
(
component
);
struct
snd_soc_dai
*
dai
;
int
ret
;
if
(
component
->
probed
)
return
0
;
co
dec
->
component
.
card
=
card
;
codec
->
dapm
.
card
=
card
;
soc_set_name_prefix
(
card
,
&
codec
->
component
);
co
mponent
->
card
=
card
;
dapm
->
card
=
card
;
soc_set_name_prefix
(
card
,
component
);
if
(
!
try_module_get
(
co
dec
->
dev
->
driver
->
owner
))
if
(
!
try_module_get
(
co
mponent
->
dev
->
driver
->
owner
))
return
-
ENODEV
;
soc_init_co
dec_debugfs
(
codec
);
soc_init_co
mponent_debugfs
(
component
);
if
(
driver
->
dapm_widgets
)
{
ret
=
snd_soc_dapm_new_controls
(
&
codec
->
dapm
,
driver
->
dapm_widgets
,
driver
->
num_dapm_widgets
);
if
(
component
->
dapm_widgets
)
{
ret
=
snd_soc_dapm_new_controls
(
dapm
,
component
->
dapm_widgets
,
component
->
num_dapm_widgets
);
if
(
ret
!=
0
)
{
dev_err
(
co
dec
->
dev
,
dev_err
(
co
mponent
->
dev
,
"Failed to create new controls %d
\n
"
,
ret
);
goto
err_probe
;
}
}
/* Create DAPM widgets for each DAI stream */
list_for_each_entry
(
dai
,
&
codec
->
component
.
dai_list
,
list
)
{
ret
=
snd_soc_dapm_new_dai_widgets
(
&
codec
->
dapm
,
dai
);
list_for_each_entry
(
dai
,
&
component
->
dai_list
,
list
)
{
ret
=
snd_soc_dapm_new_dai_widgets
(
dapm
,
dai
);
if
(
ret
!=
0
)
{
dev_err
(
co
dec
->
dev
,
dev_err
(
co
mponent
->
dev
,
"Failed to create DAI widgets %d
\n
"
,
ret
);
goto
err_probe
;
}
}
codec
->
dapm
.
idle_bias_off
=
driver
->
idle_bias_off
;
if
(
driver
->
probe
)
{
ret
=
driver
->
probe
(
codec
);
if
(
component
->
probe
)
{
ret
=
component
->
probe
(
component
);
if
(
ret
<
0
)
{
dev_err
(
co
dec
->
dev
,
"ASoC: failed to probe
CODEC
%d
\n
"
,
ret
);
dev_err
(
co
mponent
->
dev
,
"ASoC: failed to probe
component
%d
\n
"
,
ret
);
goto
err_probe
;
}
WARN
(
codec
->
dapm
.
idle_bias_off
&&
codec
->
dapm
.
bias_level
!=
SND_SOC_BIAS_OFF
,
"codec %s can not start from non-off bias with idle_bias_off==1
\n
"
,
codec
->
component
.
name
);
}
if
(
driver
->
controls
)
snd_soc_add_codec_controls
(
codec
,
driver
->
controls
,
driver
->
num_controls
);
if
(
driver
->
dapm_routes
)
snd_soc_dapm_add_routes
(
&
codec
->
dapm
,
driver
->
dapm_routes
,
driver
->
num_dapm_routes
);
/* mark codec as probed and add to card codec list */
codec
->
probed
=
1
;
list_add
(
&
codec
->
card_list
,
&
card
->
codec_dev_list
);
list_add
(
&
codec
->
dapm
.
list
,
&
card
->
dapm_list
);
return
0
;
err_probe:
soc_cleanup_codec_debugfs
(
codec
);
module_put
(
codec
->
dev
->
driver
->
owner
);
return
ret
;
}
static
int
soc_probe_platform
(
struct
snd_soc_card
*
card
,
struct
snd_soc_platform
*
platform
)
{
int
ret
=
0
;
const
struct
snd_soc_platform_driver
*
driver
=
platform
->
driver
;
struct
snd_soc_component
*
component
;
struct
snd_soc_dai
*
dai
;
platform
->
component
.
card
=
card
;
platform
->
component
.
dapm
.
card
=
card
;
if
(
!
try_module_get
(
platform
->
dev
->
driver
->
owner
))
return
-
ENODEV
;
soc_init_platform_debugfs
(
platform
);
if
(
driver
->
dapm_widgets
)
snd_soc_dapm_new_controls
(
&
platform
->
component
.
dapm
,
driver
->
dapm_widgets
,
driver
->
num_dapm_widgets
);
/* Create DAPM widgets for each DAI stream */
list_for_each_entry
(
component
,
&
component_list
,
list
)
{
if
(
component
->
dev
!=
platform
->
dev
)
continue
;
list_for_each_entry
(
dai
,
&
component
->
dai_list
,
list
)
snd_soc_dapm_new_dai_widgets
(
&
platform
->
component
.
dapm
,
dai
);
WARN
(
dapm
->
idle_bias_off
&&
dapm
->
bias_level
!=
SND_SOC_BIAS_OFF
,
"codec %s can not start from non-off bias with idle_bias_off==1
\n
"
,
component
->
name
);
}
platform
->
component
.
dapm
.
idle_bias_off
=
1
;
if
(
component
->
controls
)
snd_soc_add_component_controls
(
component
,
component
->
controls
,
component
->
num_controls
);
if
(
component
->
dapm_routes
)
snd_soc_dapm_add_routes
(
dapm
,
component
->
dapm_routes
,
component
->
num_dapm_routes
);
if
(
driver
->
probe
)
{
ret
=
driver
->
probe
(
platform
);
if
(
ret
<
0
)
{
dev_err
(
platform
->
dev
,
"ASoC: failed to probe platform %d
\n
"
,
ret
);
goto
err_probe
;
}
}
if
(
driver
->
controls
)
snd_soc_add_platform_controls
(
platform
,
driver
->
controls
,
driver
->
num_controls
);
if
(
driver
->
dapm_routes
)
snd_soc_dapm_add_routes
(
&
platform
->
component
.
dapm
,
driver
->
dapm_routes
,
driver
->
num_dapm_routes
);
component
->
probed
=
1
;
list_add
(
&
dapm
->
list
,
&
card
->
dapm_list
);
/*
mark platform as probed and add to card platform list
*/
platform
->
probed
=
1
;
list_add
(
&
platform
->
component
.
dapm
.
list
,
&
card
->
dapm
_list
);
/*
This is a HACK and will be removed soon
*/
if
(
component
->
codec
)
list_add
(
&
component
->
codec
->
card_list
,
&
card
->
codec_dev
_list
);
return
0
;
err_probe:
soc_cleanup_
platform_debugfs
(
platform
);
module_put
(
platform
->
dev
->
driver
->
owner
);
soc_cleanup_
component_debugfs
(
component
);
module_put
(
component
->
dev
->
driver
->
owner
);
return
ret
;
}
...
...
@@ -1342,17 +1193,21 @@ static int soc_post_component_init(struct snd_soc_pcm_runtime *rtd,
}
rtd
->
dev_registered
=
1
;
/* add DAPM sysfs entries for this codec */
ret
=
snd_soc_dapm_sys_add
(
rtd
->
dev
);
if
(
ret
<
0
)
dev_err
(
rtd
->
dev
,
"ASoC: failed to add codec dapm sysfs entries: %d
\n
"
,
ret
);
if
(
rtd
->
codec
)
{
/* add DAPM sysfs entries for this codec */
ret
=
snd_soc_dapm_sys_add
(
rtd
->
dev
);
if
(
ret
<
0
)
dev_err
(
rtd
->
dev
,
"ASoC: failed to add codec dapm sysfs entries: %d
\n
"
,
ret
);
/* add codec sysfs entries */
ret
=
device_create_file
(
rtd
->
dev
,
&
dev_attr_codec_reg
);
if
(
ret
<
0
)
dev_err
(
rtd
->
dev
,
"ASoC: failed to add codec sysfs files: %d
\n
"
,
ret
);
/* add codec sysfs entries */
ret
=
device_create_file
(
rtd
->
dev
,
&
dev_attr_codec_reg
);
if
(
ret
<
0
)
dev_err
(
rtd
->
dev
,
"ASoC: failed to add codec sysfs files: %d
\n
"
,
ret
);
}
return
0
;
}
...
...
@@ -1361,33 +1216,31 @@ static int soc_probe_link_components(struct snd_soc_card *card, int num,
int
order
)
{
struct
snd_soc_pcm_runtime
*
rtd
=
&
card
->
rtd
[
num
];
struct
snd_soc_dai
*
cpu_dai
=
rtd
->
cpu_dai
;
struct
snd_soc_platform
*
platform
=
rtd
->
platform
;
struct
snd_soc_component
*
component
;
int
i
,
ret
;
/* probe the CPU-side component, if it is a CODEC */
if
(
cpu_dai
->
codec
&&
!
cpu_dai
->
codec
->
probed
&&
cpu_dai
->
codec
->
driver
->
probe_order
==
order
)
{
ret
=
soc_probe_codec
(
card
,
cpu_dai
->
codec
);
component
=
rtd
->
cpu_dai
->
component
;
if
(
component
->
driver
->
probe_order
==
order
)
{
ret
=
soc_probe_component
(
card
,
component
);
if
(
ret
<
0
)
return
ret
;
}
/* probe the CODEC-side components */
for
(
i
=
0
;
i
<
rtd
->
num_codecs
;
i
++
)
{
if
(
!
rtd
->
codec_dais
[
i
]
->
codec
->
probed
&&
rtd
->
codec_dais
[
i
]
->
codec
->
driver
->
probe_order
==
order
)
{
ret
=
soc_probe_co
dec
(
card
,
rtd
->
codec_dais
[
i
]
->
codec
);
component
=
rtd
->
codec_dais
[
i
]
->
component
;
if
(
component
->
driver
->
probe_order
==
order
)
{
ret
=
soc_probe_co
mponent
(
card
,
component
);
if
(
ret
<
0
)
return
ret
;
}
}
/* probe the platform */
if
(
!
platform
->
probed
&&
platform
->
driver
->
probe_order
==
order
)
{
ret
=
soc_probe_platform
(
card
,
platform
);
if
(
platform
->
component
.
driver
->
probe_order
==
order
)
{
ret
=
soc_probe_component
(
card
,
&
platform
->
component
);
if
(
ret
<
0
)
return
ret
;
}
...
...
@@ -1482,18 +1335,12 @@ static int soc_probe_link_dais(struct snd_soc_card *card, int num, int order)
/* probe the cpu_dai */
if
(
!
cpu_dai
->
probed
&&
cpu_dai
->
driver
->
probe_order
==
order
)
{
if
(
!
cpu_dai
->
codec
)
{
if
(
!
try_module_get
(
cpu_dai
->
dev
->
driver
->
owner
))
return
-
ENODEV
;
}
if
(
cpu_dai
->
driver
->
probe
)
{
ret
=
cpu_dai
->
driver
->
probe
(
cpu_dai
);
if
(
ret
<
0
)
{
dev_err
(
cpu_dai
->
dev
,
"ASoC: failed to probe CPU DAI %s: %d
\n
"
,
cpu_dai
->
name
,
ret
);
module_put
(
cpu_dai
->
dev
->
driver
->
owner
);
return
ret
;
}
}
...
...
@@ -1654,17 +1501,24 @@ static int soc_bind_aux_dev(struct snd_soc_card *card, int num)
{
struct
snd_soc_pcm_runtime
*
rtd
=
&
card
->
rtd_aux
[
num
];
struct
snd_soc_aux_dev
*
aux_dev
=
&
card
->
aux_dev
[
num
];
const
char
*
codec
name
=
aux_dev
->
codec_name
;
const
char
*
name
=
aux_dev
->
codec_name
;
rtd
->
co
dec
=
soc_find_codec
(
aux_dev
->
codec_of_node
,
codec
name
);
if
(
!
rtd
->
co
dec
)
{
rtd
->
co
mponent
=
soc_find_component
(
aux_dev
->
codec_of_node
,
name
);
if
(
!
rtd
->
co
mponent
)
{
if
(
aux_dev
->
codec_of_node
)
codec
name
=
of_node_full_name
(
aux_dev
->
codec_of_node
);
name
=
of_node_full_name
(
aux_dev
->
codec_of_node
);
dev_err
(
card
->
dev
,
"ASoC: %s not registered
\n
"
,
codec
name
);
dev_err
(
card
->
dev
,
"ASoC: %s not registered
\n
"
,
name
);
return
-
EPROBE_DEFER
;
}
/*
* Some places still reference rtd->codec, so we have to keep that
* initialized if the component is a CODEC. Once all those references
* have been removed, this code can be removed as well.
*/
rtd
->
codec
=
rtd
->
component
->
codec
;
return
0
;
}
...
...
@@ -1674,18 +1528,13 @@ static int soc_probe_aux_dev(struct snd_soc_card *card, int num)
struct
snd_soc_aux_dev
*
aux_dev
=
&
card
->
aux_dev
[
num
];
int
ret
;
if
(
rtd
->
codec
->
probed
)
{
dev_err
(
rtd
->
codec
->
dev
,
"ASoC: codec already probed
\n
"
);
return
-
EBUSY
;
}
ret
=
soc_probe_codec
(
card
,
rtd
->
codec
);
ret
=
soc_probe_component
(
card
,
rtd
->
component
);
if
(
ret
<
0
)
return
ret
;
/* do machine specific initialization */
if
(
aux_dev
->
init
)
{
ret
=
aux_dev
->
init
(
&
rtd
->
codec
->
dapm
);
ret
=
aux_dev
->
init
(
rtd
->
component
);
if
(
ret
<
0
)
{
dev_err
(
card
->
dev
,
"ASoC: failed to init %s: %d
\n
"
,
aux_dev
->
name
,
ret
);
...
...
@@ -1699,7 +1548,7 @@ static int soc_probe_aux_dev(struct snd_soc_card *card, int num)
static
void
soc_remove_aux_dev
(
struct
snd_soc_card
*
card
,
int
num
)
{
struct
snd_soc_pcm_runtime
*
rtd
=
&
card
->
rtd_aux
[
num
];
struct
snd_soc_co
dec
*
codec
=
rtd
->
codec
;
struct
snd_soc_co
mponent
*
component
=
rtd
->
component
;
/* unregister the rtd device */
if
(
rtd
->
dev_registered
)
{
...
...
@@ -1708,8 +1557,8 @@ static void soc_remove_aux_dev(struct snd_soc_card *card, int num)
rtd
->
dev_registered
=
0
;
}
if
(
co
dec
&&
codec
->
probed
)
soc_remove_co
dec
(
codec
);
if
(
co
mponent
&&
component
->
probed
)
soc_remove_co
mponent
(
component
);
}
static
int
snd_soc_init_codec_cache
(
struct
snd_soc_codec
*
codec
)
...
...
@@ -4116,6 +3965,8 @@ static int snd_soc_component_initialize(struct snd_soc_component *component,
component
->
dev
=
dev
;
component
->
driver
=
driver
;
component
->
probe
=
component
->
driver
->
probe
;
component
->
remove
=
component
->
driver
->
remove
;
if
(
!
component
->
dapm_ptr
)
component
->
dapm_ptr
=
&
component
->
dapm
;
...
...
@@ -4124,19 +3975,42 @@ static int snd_soc_component_initialize(struct snd_soc_component *component,
dapm
->
dev
=
dev
;
dapm
->
component
=
component
;
dapm
->
bias_level
=
SND_SOC_BIAS_OFF
;
dapm
->
idle_bias_off
=
true
;
if
(
driver
->
seq_notifier
)
dapm
->
seq_notifier
=
snd_soc_component_seq_notifier
;
if
(
driver
->
stream_event
)
dapm
->
stream_event
=
snd_soc_component_stream_event
;
component
->
controls
=
driver
->
controls
;
component
->
num_controls
=
driver
->
num_controls
;
component
->
dapm_widgets
=
driver
->
dapm_widgets
;
component
->
num_dapm_widgets
=
driver
->
num_dapm_widgets
;
component
->
dapm_routes
=
driver
->
dapm_routes
;
component
->
num_dapm_routes
=
driver
->
num_dapm_routes
;
INIT_LIST_HEAD
(
&
component
->
dai_list
);
mutex_init
(
&
component
->
io_mutex
);
return
0
;
}
static
void
snd_soc_component_init_regmap
(
struct
snd_soc_component
*
component
)
{
if
(
!
component
->
regmap
)
component
->
regmap
=
dev_get_regmap
(
component
->
dev
,
NULL
);
if
(
component
->
regmap
)
{
int
val_bytes
=
regmap_get_val_bytes
(
component
->
regmap
);
/* Errors are legitimate for non-integer byte multiples */
if
(
val_bytes
>
0
)
component
->
val_bytes
=
val_bytes
;
}
}
static
void
snd_soc_component_add_unlocked
(
struct
snd_soc_component
*
component
)
{
if
(
!
component
->
write
&&
!
component
->
read
)
snd_soc_component_init_regmap
(
component
);
list_add
(
&
component
->
list
,
&
component_list
);
}
...
...
@@ -4225,22 +4099,18 @@ void snd_soc_unregister_component(struct device *dev)
}
EXPORT_SYMBOL_GPL
(
snd_soc_unregister_component
);
static
int
snd_soc_platform_drv_write
(
struct
snd_soc_component
*
component
,
unsigned
int
reg
,
unsigned
int
val
)
static
int
snd_soc_platform_drv_probe
(
struct
snd_soc_component
*
component
)
{
struct
snd_soc_platform
*
platform
=
snd_soc_component_to_platform
(
component
);
return
platform
->
driver
->
write
(
platform
,
reg
,
val
);
return
platform
->
driver
->
probe
(
platform
);
}
static
int
snd_soc_platform_drv_read
(
struct
snd_soc_component
*
component
,
unsigned
int
reg
,
unsigned
int
*
val
)
static
void
snd_soc_platform_drv_remove
(
struct
snd_soc_component
*
component
)
{
struct
snd_soc_platform
*
platform
=
snd_soc_component_to_platform
(
component
);
*
val
=
platform
->
driver
->
read
(
platform
,
reg
);
return
0
;
platform
->
driver
->
remove
(
platform
);
}
/**
...
...
@@ -4261,10 +4131,15 @@ int snd_soc_add_platform(struct device *dev, struct snd_soc_platform *platform,
platform
->
dev
=
dev
;
platform
->
driver
=
platform_drv
;
if
(
platform_drv
->
write
)
platform
->
component
.
write
=
snd_soc_platform_drv_write
;
if
(
platform_drv
->
read
)
platform
->
component
.
read
=
snd_soc_platform_drv_read
;
if
(
platform_drv
->
probe
)
platform
->
component
.
probe
=
snd_soc_platform_drv_probe
;
if
(
platform_drv
->
remove
)
platform
->
component
.
remove
=
snd_soc_platform_drv_remove
;
#ifdef CONFIG_DEBUG_FS
platform
->
component
.
debugfs_prefix
=
"platform"
;
#endif
mutex_lock
(
&
client_mutex
);
snd_soc_component_add_unlocked
(
&
platform
->
component
);
...
...
@@ -4386,6 +4261,20 @@ static void fixup_codec_formats(struct snd_soc_pcm_stream *stream)
stream
->
formats
|=
codec_format_map
[
i
];
}
static
int
snd_soc_codec_drv_probe
(
struct
snd_soc_component
*
component
)
{
struct
snd_soc_codec
*
codec
=
snd_soc_component_to_codec
(
component
);
return
codec
->
driver
->
probe
(
codec
);
}
static
void
snd_soc_codec_drv_remove
(
struct
snd_soc_component
*
component
)
{
struct
snd_soc_codec
*
codec
=
snd_soc_component_to_codec
(
component
);
codec
->
driver
->
remove
(
codec
);
}
static
int
snd_soc_codec_drv_write
(
struct
snd_soc_component
*
component
,
unsigned
int
reg
,
unsigned
int
val
)
{
...
...
@@ -4424,7 +4313,6 @@ int snd_soc_register_codec(struct device *dev,
{
struct
snd_soc_codec
*
codec
;
struct
snd_soc_dai
*
dai
;
struct
regmap
*
regmap
;
int
ret
,
i
;
dev_dbg
(
dev
,
"codec register %s
\n
"
,
dev_name
(
dev
));
...
...
@@ -4434,18 +4322,36 @@ int snd_soc_register_codec(struct device *dev,
return
-
ENOMEM
;
codec
->
component
.
dapm_ptr
=
&
codec
->
dapm
;
codec
->
component
.
codec
=
codec
;
ret
=
snd_soc_component_initialize
(
&
codec
->
component
,
&
codec_drv
->
component_driver
,
dev
);
if
(
ret
)
goto
err_free
;
if
(
codec_drv
->
controls
)
{
codec
->
component
.
controls
=
codec_drv
->
controls
;
codec
->
component
.
num_controls
=
codec_drv
->
num_controls
;
}
if
(
codec_drv
->
dapm_widgets
)
{
codec
->
component
.
dapm_widgets
=
codec_drv
->
dapm_widgets
;
codec
->
component
.
num_dapm_widgets
=
codec_drv
->
num_dapm_widgets
;
}
if
(
codec_drv
->
dapm_routes
)
{
codec
->
component
.
dapm_routes
=
codec_drv
->
dapm_routes
;
codec
->
component
.
num_dapm_routes
=
codec_drv
->
num_dapm_routes
;
}
if
(
codec_drv
->
probe
)
codec
->
component
.
probe
=
snd_soc_codec_drv_probe
;
if
(
codec_drv
->
remove
)
codec
->
component
.
remove
=
snd_soc_codec_drv_remove
;
if
(
codec_drv
->
write
)
codec
->
component
.
write
=
snd_soc_codec_drv_write
;
if
(
codec_drv
->
read
)
codec
->
component
.
read
=
snd_soc_codec_drv_read
;
codec
->
component
.
ignore_pmdown_time
=
codec_drv
->
ignore_pmdown_time
;
codec
->
dapm
.
codec
=
codec
;
codec
->
dapm
.
idle_bias_off
=
codec_drv
->
idle_bias_off
;
if
(
codec_drv
->
seq_notifier
)
codec
->
dapm
.
seq_notifier
=
codec_drv
->
seq_notifier
;
if
(
codec_drv
->
set_bias_level
)
...
...
@@ -4455,23 +4361,13 @@ int snd_soc_register_codec(struct device *dev,
codec
->
component
.
val_bytes
=
codec_drv
->
reg_word_size
;
mutex_init
(
&
codec
->
mutex
);
if
(
!
codec
->
component
.
write
)
{
if
(
codec_drv
->
get_regmap
)
regmap
=
codec_drv
->
get_regmap
(
dev
);
else
regmap
=
dev_get_regmap
(
dev
,
NULL
);
if
(
regmap
)
{
ret
=
snd_soc_component_init_io
(
&
codec
->
component
,
regmap
);
if
(
ret
)
{
dev_err
(
codec
->
dev
,
"Failed to set cache I/O:%d
\n
"
,
ret
);
goto
err_cleanup
;
}
}
}
#ifdef CONFIG_DEBUG_FS
codec
->
component
.
init_debugfs
=
soc_init_codec_debugfs
;
codec
->
component
.
debugfs_prefix
=
"codec"
;
#endif
if
(
codec_drv
->
get_regmap
)
codec
->
component
.
regmap
=
codec_drv
->
get_regmap
(
dev
);
for
(
i
=
0
;
i
<
num_dai
;
i
++
)
{
fixup_codec_formats
(
&
dai_drv
[
i
].
playback
);
...
...
sound/soc/soc-dapm.c
View file @
5bcaca4b
...
...
@@ -3109,7 +3109,8 @@ snd_soc_dapm_new_control(struct snd_soc_dapm_context *dapm,
}
w
->
dapm
=
dapm
;
w
->
codec
=
dapm
->
codec
;
if
(
dapm
->
component
)
w
->
codec
=
dapm
->
component
->
codec
;
INIT_LIST_HEAD
(
&
w
->
sources
);
INIT_LIST_HEAD
(
&
w
->
sinks
);
INIT_LIST_HEAD
(
&
w
->
list
);
...
...
sound/soc/soc-generic-dmaengine-pcm.c
View file @
5bcaca4b
...
...
@@ -336,10 +336,12 @@ static const struct snd_pcm_ops dmaengine_pcm_ops = {
};
static
const
struct
snd_soc_platform_driver
dmaengine_pcm_platform
=
{
.
component_driver
=
{
.
probe_order
=
SND_SOC_COMP_ORDER_LATE
,
},
.
ops
=
&
dmaengine_pcm_ops
,
.
pcm_new
=
dmaengine_pcm_new
,
.
pcm_free
=
dmaengine_pcm_free
,
.
probe_order
=
SND_SOC_COMP_ORDER_LATE
,
};
static
const
char
*
const
dmaengine_pcm_dma_channel_names
[]
=
{
...
...
sound/soc/soc-io.c
View file @
5bcaca4b
...
...
@@ -271,31 +271,3 @@ int snd_soc_platform_write(struct snd_soc_platform *platform,
return
snd_soc_component_write
(
&
platform
->
component
,
reg
,
val
);
}
EXPORT_SYMBOL_GPL
(
snd_soc_platform_write
);
/**
* snd_soc_component_init_io() - Initialize regmap IO
*
* @component: component to initialize
* @regmap: regmap instance to use for IO operations
*
* Return: 0 on success, a negative error code otherwise
*/
int
snd_soc_component_init_io
(
struct
snd_soc_component
*
component
,
struct
regmap
*
regmap
)
{
int
ret
;
if
(
!
regmap
)
return
-
EINVAL
;
ret
=
regmap_get_val_bytes
(
regmap
);
/* Errors are legitimate for non-integer byte
* multiples */
if
(
ret
>
0
)
component
->
val_bytes
=
ret
;
component
->
regmap
=
regmap
;
return
0
;
}
EXPORT_SYMBOL_GPL
(
snd_soc_component_init_io
);
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