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
nexedi
linux
Commits
357c59a9
Commit
357c59a9
authored
Nov 10, 2017
by
Mark Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'asoc/topic/rockchip' into asoc-next
parents
f904f846
8eae6c25
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
133 additions
and
26 deletions
+133
-26
sound/soc/rockchip/rk3399_gru_sound.c
sound/soc/rockchip/rk3399_gru_sound.c
+133
-26
No files found.
sound/soc/rockchip/rk3399_gru_sound.c
View file @
357c59a9
...
...
@@ -23,6 +23,7 @@
#include <linux/of_gpio.h>
#include <linux/delay.h>
#include <linux/spi/spi.h>
#include <linux/i2c.h>
#include <linux/input.h>
#include <sound/core.h>
#include <sound/jack.h>
...
...
@@ -47,18 +48,7 @@ static const struct snd_soc_dapm_widget rockchip_dapm_widgets[] = {
SND_SOC_DAPM_SPK
(
"Speakers"
,
NULL
),
SND_SOC_DAPM_MIC
(
"Headset Mic"
,
NULL
),
SND_SOC_DAPM_MIC
(
"Int Mic"
,
NULL
),
};
static
const
struct
snd_soc_dapm_route
rockchip_dapm_routes
[]
=
{
/* Input Lines */
{
"MIC"
,
NULL
,
"Headset Mic"
},
{
"DMIC1L"
,
NULL
,
"Int Mic"
},
{
"DMIC1R"
,
NULL
,
"Int Mic"
},
/* Output Lines */
{
"Headphones"
,
NULL
,
"HPL"
},
{
"Headphones"
,
NULL
,
"HPR"
},
{
"Speakers"
,
NULL
,
"Speaker"
},
SND_SOC_DAPM_LINE
(
"HDMI"
,
NULL
),
};
static
const
struct
snd_kcontrol_new
rockchip_controls
[]
=
{
...
...
@@ -66,6 +56,7 @@ static const struct snd_kcontrol_new rockchip_controls[] = {
SOC_DAPM_PIN_SWITCH
(
"Speakers"
),
SOC_DAPM_PIN_SWITCH
(
"Headset Mic"
),
SOC_DAPM_PIN_SWITCH
(
"Int Mic"
),
SOC_DAPM_PIN_SWITCH
(
"HDMI"
),
};
static
int
rockchip_sound_max98357a_hw_params
(
struct
snd_pcm_substream
*
substream
,
...
...
@@ -314,8 +305,6 @@ static struct snd_soc_card rockchip_sound_card = {
.
owner
=
THIS_MODULE
,
.
dapm_widgets
=
rockchip_dapm_widgets
,
.
num_dapm_widgets
=
ARRAY_SIZE
(
rockchip_dapm_widgets
),
.
dapm_routes
=
rockchip_dapm_routes
,
.
num_dapm_routes
=
ARRAY_SIZE
(
rockchip_dapm_routes
),
.
controls
=
rockchip_controls
,
.
num_controls
=
ARRAY_SIZE
(
rockchip_controls
),
};
...
...
@@ -329,15 +318,6 @@ enum {
DAILINK_RT5514_DSP
,
};
static
const
char
*
const
dailink_compat
[]
=
{
[
DAILINK_CDNDP
]
=
"rockchip,rk3399-cdn-dp"
,
[
DAILINK_DA7219
]
=
"dlg,da7219"
,
[
DAILINK_DMIC
]
=
"dmic-codec"
,
[
DAILINK_MAX98357A
]
=
"maxim,max98357a"
,
[
DAILINK_RT5514
]
=
"realtek,rt5514-i2c"
,
[
DAILINK_RT5514_DSP
]
=
"realtek,rt5514-spi"
,
};
static
const
struct
snd_soc_dai_link
rockchip_dais
[]
=
{
[
DAILINK_CDNDP
]
=
{
.
name
=
"DP"
,
...
...
@@ -391,13 +371,117 @@ static const struct snd_soc_dai_link rockchip_dais[] = {
},
};
static
const
struct
snd_soc_dapm_route
rockchip_sound_cdndp_routes
[]
=
{
/* Output */
{
"HDMI"
,
NULL
,
"TX"
},
};
static
const
struct
snd_soc_dapm_route
rockchip_sound_da7219_routes
[]
=
{
/* Output */
{
"Headphones"
,
NULL
,
"HPL"
},
{
"Headphones"
,
NULL
,
"HPR"
},
/* Input */
{
"MIC"
,
NULL
,
"Headset Mic"
},
};
static
const
struct
snd_soc_dapm_route
rockchip_sound_dmic_routes
[]
=
{
/* Input */
{
"DMic"
,
NULL
,
"Int Mic"
},
};
static
const
struct
snd_soc_dapm_route
rockchip_sound_max98357a_routes
[]
=
{
/* Output */
{
"Speakers"
,
NULL
,
"Speaker"
},
};
static
const
struct
snd_soc_dapm_route
rockchip_sound_rt5514_routes
[]
=
{
/* Input */
{
"DMIC1L"
,
NULL
,
"Int Mic"
},
{
"DMIC1R"
,
NULL
,
"Int Mic"
},
};
struct
rockchip_sound_route
{
const
struct
snd_soc_dapm_route
*
routes
;
int
num_routes
;
};
static
const
struct
rockchip_sound_route
rockchip_routes
[]
=
{
[
DAILINK_CDNDP
]
=
{
.
routes
=
rockchip_sound_cdndp_routes
,
.
num_routes
=
ARRAY_SIZE
(
rockchip_sound_cdndp_routes
),
},
[
DAILINK_DA7219
]
=
{
.
routes
=
rockchip_sound_da7219_routes
,
.
num_routes
=
ARRAY_SIZE
(
rockchip_sound_da7219_routes
),
},
[
DAILINK_DMIC
]
=
{
.
routes
=
rockchip_sound_dmic_routes
,
.
num_routes
=
ARRAY_SIZE
(
rockchip_sound_dmic_routes
),
},
[
DAILINK_MAX98357A
]
=
{
.
routes
=
rockchip_sound_max98357a_routes
,
.
num_routes
=
ARRAY_SIZE
(
rockchip_sound_max98357a_routes
),
},
[
DAILINK_RT5514
]
=
{
.
routes
=
rockchip_sound_rt5514_routes
,
.
num_routes
=
ARRAY_SIZE
(
rockchip_sound_rt5514_routes
),
},
[
DAILINK_RT5514_DSP
]
=
{},
};
struct
dailink_match_data
{
const
char
*
compatible
;
struct
bus_type
*
bus_type
;
};
static
const
struct
dailink_match_data
dailink_match
[]
=
{
[
DAILINK_CDNDP
]
=
{
.
compatible
=
"rockchip,rk3399-cdn-dp"
,
},
[
DAILINK_DA7219
]
=
{
.
compatible
=
"dlg,da7219"
,
},
[
DAILINK_DMIC
]
=
{
.
compatible
=
"dmic-codec"
,
},
[
DAILINK_MAX98357A
]
=
{
.
compatible
=
"maxim,max98357a"
,
},
[
DAILINK_RT5514
]
=
{
.
compatible
=
"realtek,rt5514"
,
.
bus_type
=
&
i2c_bus_type
,
},
[
DAILINK_RT5514_DSP
]
=
{
.
compatible
=
"realtek,rt5514"
,
.
bus_type
=
&
spi_bus_type
,
},
};
static
int
of_dev_node_match
(
struct
device
*
dev
,
void
*
data
)
{
return
dev
->
of_node
==
data
;
}
static
int
rockchip_sound_codec_node_match
(
struct
device_node
*
np_codec
)
{
struct
device
*
dev
;
int
i
;
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
dailink_compat
);
i
++
)
{
if
(
of_device_is_compatible
(
np_codec
,
dailink_compat
[
i
]))
return
i
;
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
dailink_match
);
i
++
)
{
if
(
!
of_device_is_compatible
(
np_codec
,
dailink_match
[
i
].
compatible
))
continue
;
if
(
dailink_match
[
i
].
bus_type
)
{
dev
=
bus_find_device
(
dailink_match
[
i
].
bus_type
,
NULL
,
np_codec
,
of_dev_node_match
);
if
(
!
dev
)
continue
;
put_device
(
dev
);
}
return
i
;
}
return
-
1
;
}
...
...
@@ -408,16 +492,28 @@ static int rockchip_sound_of_parse_dais(struct device *dev,
struct
device_node
*
np_cpu
,
*
np_cpu0
,
*
np_cpu1
;
struct
device_node
*
np_codec
;
struct
snd_soc_dai_link
*
dai
;
struct
snd_soc_dapm_route
*
routes
;
int
i
,
index
;
int
num_routes
;
card
->
dai_link
=
devm_kzalloc
(
dev
,
sizeof
(
rockchip_dais
),
GFP_KERNEL
);
if
(
!
card
->
dai_link
)
return
-
ENOMEM
;
num_routes
=
0
;
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
rockchip_routes
);
i
++
)
num_routes
+=
rockchip_routes
[
i
].
num_routes
;
routes
=
devm_kzalloc
(
dev
,
num_routes
*
sizeof
(
*
routes
),
GFP_KERNEL
);
if
(
!
routes
)
return
-
ENOMEM
;
card
->
dapm_routes
=
routes
;
np_cpu0
=
of_parse_phandle
(
dev
->
of_node
,
"rockchip,cpu"
,
0
);
np_cpu1
=
of_parse_phandle
(
dev
->
of_node
,
"rockchip,cpu"
,
1
);
card
->
num_dapm_routes
=
0
;
card
->
num_links
=
0
;
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
rockchip_dais
);
i
++
)
{
np_codec
=
of_parse_phandle
(
dev
->
of_node
,
...
...
@@ -445,6 +541,17 @@ static int rockchip_sound_of_parse_dais(struct device *dev,
dai
->
codec_of_node
=
np_codec
;
dai
->
platform_of_node
=
np_cpu
;
dai
->
cpu_of_node
=
np_cpu
;
if
(
card
->
num_dapm_routes
+
rockchip_routes
[
index
].
num_routes
>
num_routes
)
{
dev_err
(
dev
,
"Too many routes
\n
"
);
return
-
EINVAL
;
}
memcpy
(
routes
+
card
->
num_dapm_routes
,
rockchip_routes
[
index
].
routes
,
rockchip_routes
[
index
].
num_routes
*
sizeof
(
*
routes
));
card
->
num_dapm_routes
+=
rockchip_routes
[
index
].
num_routes
;
}
return
0
;
...
...
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