|
@@ -25,17 +25,6 @@
|
|
|
|
|
|
#include <drm/drm_crtc.h> /* This is only to get MAX_ELD_BYTES */
|
|
|
|
|
|
-struct hdmi_device {
|
|
|
- struct device *dev;
|
|
|
- struct list_head list;
|
|
|
- int cnt;
|
|
|
-};
|
|
|
-#define pos_to_hdmi_device(pos) container_of((pos), struct hdmi_device, list)
|
|
|
-LIST_HEAD(hdmi_device_list);
|
|
|
-static DEFINE_MUTEX(hdmi_mutex);
|
|
|
-
|
|
|
-#define DAI_NAME_SIZE 16
|
|
|
-
|
|
|
#define HDMI_CODEC_CHMAP_IDX_UNKNOWN -1
|
|
|
|
|
|
struct hdmi_codec_channel_map_table {
|
|
@@ -702,6 +691,7 @@ static int hdmi_codec_pcm_new(struct snd_soc_pcm_runtime *rtd,
|
|
|
}
|
|
|
|
|
|
static struct snd_soc_dai_driver hdmi_i2s_dai = {
|
|
|
+ .name = "i2s-hifi",
|
|
|
.id = DAI_ID_I2S,
|
|
|
.playback = {
|
|
|
.stream_name = "Playback",
|
|
@@ -716,6 +706,7 @@ static struct snd_soc_dai_driver hdmi_i2s_dai = {
|
|
|
};
|
|
|
|
|
|
static const struct snd_soc_dai_driver hdmi_spdif_dai = {
|
|
|
+ .name = "spdif-hifi",
|
|
|
.id = DAI_ID_SPDIF,
|
|
|
.playback = {
|
|
|
.stream_name = "Playback",
|
|
@@ -728,32 +719,6 @@ static const struct snd_soc_dai_driver hdmi_spdif_dai = {
|
|
|
.pcm_new = hdmi_codec_pcm_new,
|
|
|
};
|
|
|
|
|
|
-static char hdmi_dai_name[][DAI_NAME_SIZE] = {
|
|
|
- "hdmi-hifi.0",
|
|
|
- "hdmi-hifi.1",
|
|
|
- "hdmi-hifi.2",
|
|
|
- "hdmi-hifi.3",
|
|
|
-};
|
|
|
-
|
|
|
-static int hdmi_of_xlate_dai_name(struct snd_soc_component *component,
|
|
|
- struct of_phandle_args *args,
|
|
|
- const char **dai_name)
|
|
|
-{
|
|
|
- int id;
|
|
|
-
|
|
|
- if (args->args_count)
|
|
|
- id = args->args[0];
|
|
|
- else
|
|
|
- id = 0;
|
|
|
-
|
|
|
- if (id < ARRAY_SIZE(hdmi_dai_name)) {
|
|
|
- *dai_name = hdmi_dai_name[id];
|
|
|
- return 0;
|
|
|
- }
|
|
|
-
|
|
|
- return -EAGAIN;
|
|
|
-}
|
|
|
-
|
|
|
static struct snd_soc_codec_driver hdmi_codec = {
|
|
|
.component_driver = {
|
|
|
.controls = hdmi_controls,
|
|
@@ -762,7 +727,6 @@ static struct snd_soc_codec_driver hdmi_codec = {
|
|
|
.num_dapm_widgets = ARRAY_SIZE(hdmi_widgets),
|
|
|
.dapm_routes = hdmi_routes,
|
|
|
.num_dapm_routes = ARRAY_SIZE(hdmi_routes),
|
|
|
- .of_xlate_dai_name = hdmi_of_xlate_dai_name,
|
|
|
},
|
|
|
};
|
|
|
|
|
@@ -771,8 +735,6 @@ static int hdmi_codec_probe(struct platform_device *pdev)
|
|
|
struct hdmi_codec_pdata *hcd = pdev->dev.platform_data;
|
|
|
struct device *dev = &pdev->dev;
|
|
|
struct hdmi_codec_priv *hcp;
|
|
|
- struct hdmi_device *hd;
|
|
|
- struct list_head *pos;
|
|
|
int dai_count, i = 0;
|
|
|
int ret;
|
|
|
|
|
@@ -794,35 +756,6 @@ static int hdmi_codec_probe(struct platform_device *pdev)
|
|
|
if (!hcp)
|
|
|
return -ENOMEM;
|
|
|
|
|
|
- hd = NULL;
|
|
|
- mutex_lock(&hdmi_mutex);
|
|
|
- list_for_each(pos, &hdmi_device_list) {
|
|
|
- struct hdmi_device *tmp = pos_to_hdmi_device(pos);
|
|
|
-
|
|
|
- if (tmp->dev == dev->parent) {
|
|
|
- hd = tmp;
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if (!hd) {
|
|
|
- hd = devm_kzalloc(dev, sizeof(*hd), GFP_KERNEL);
|
|
|
- if (!hd) {
|
|
|
- mutex_unlock(&hdmi_mutex);
|
|
|
- return -ENOMEM;
|
|
|
- }
|
|
|
-
|
|
|
- hd->dev = dev->parent;
|
|
|
-
|
|
|
- list_add_tail(&hd->list, &hdmi_device_list);
|
|
|
- }
|
|
|
- mutex_unlock(&hdmi_mutex);
|
|
|
-
|
|
|
- if (hd->cnt >= ARRAY_SIZE(hdmi_dai_name)) {
|
|
|
- dev_err(dev, "too many hdmi codec are detected\n");
|
|
|
- return -EINVAL;
|
|
|
- }
|
|
|
-
|
|
|
hcp->hcd = *hcd;
|
|
|
mutex_init(&hcp->current_stream_lock);
|
|
|
|
|
@@ -835,14 +768,11 @@ static int hdmi_codec_probe(struct platform_device *pdev)
|
|
|
hcp->daidrv[i] = hdmi_i2s_dai;
|
|
|
hcp->daidrv[i].playback.channels_max =
|
|
|
hcd->max_i2s_channels;
|
|
|
- hcp->daidrv[i].name = hdmi_dai_name[hd->cnt++];
|
|
|
i++;
|
|
|
}
|
|
|
|
|
|
- if (hcd->spdif) {
|
|
|
+ if (hcd->spdif)
|
|
|
hcp->daidrv[i] = hdmi_spdif_dai;
|
|
|
- hcp->daidrv[i].name = hdmi_dai_name[hd->cnt++];
|
|
|
- }
|
|
|
|
|
|
ret = snd_soc_register_codec(dev, &hdmi_codec, hcp->daidrv,
|
|
|
dai_count);
|
|
@@ -859,20 +789,8 @@ static int hdmi_codec_probe(struct platform_device *pdev)
|
|
|
static int hdmi_codec_remove(struct platform_device *pdev)
|
|
|
{
|
|
|
struct device *dev = &pdev->dev;
|
|
|
- struct list_head *pos;
|
|
|
struct hdmi_codec_priv *hcp;
|
|
|
|
|
|
- mutex_lock(&hdmi_mutex);
|
|
|
- list_for_each(pos, &hdmi_device_list) {
|
|
|
- struct hdmi_device *tmp = pos_to_hdmi_device(pos);
|
|
|
-
|
|
|
- if (tmp->dev == dev->parent) {
|
|
|
- list_del(pos);
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- mutex_unlock(&hdmi_mutex);
|
|
|
-
|
|
|
hcp = dev_get_drvdata(dev);
|
|
|
kfree(hcp->chmap_info);
|
|
|
snd_soc_unregister_codec(dev);
|