summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h3
-rw-r--r--drivers/gpu/drm/i915/intel_audio.c94
-rw-r--r--include/drm/i915_component.h6
-rw-r--r--include/sound/hda_i915.h11
-rw-r--r--sound/hda/hdac_i915.c18
-rw-r--r--sound/pci/hda/patch_hdmi.c7
-rw-r--r--sound/soc/codecs/hdac_hdmi.c2
7 files changed, 94 insertions, 47 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 98f52dab27d4..e76dc41f683c 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -2080,7 +2080,8 @@ struct drm_i915_private {
2080 /* perform PHY state sanity checks? */ 2080 /* perform PHY state sanity checks? */
2081 bool chv_phy_assert[2]; 2081 bool chv_phy_assert[2];
2082 2082
2083 struct intel_encoder *dig_port_map[I915_MAX_PORTS]; 2083 /* Used to save the pipe-to-encoder mapping for audio */
2084 struct intel_encoder *av_enc_map[I915_MAX_PIPES];
2084 2085
2085 /* 2086 /*
2086 * NOTE: This is the dri1/ums dungeon, don't add stuff here. Your patch 2087 * NOTE: This is the dri1/ums dungeon, don't add stuff here. Your patch
diff --git a/drivers/gpu/drm/i915/intel_audio.c b/drivers/gpu/drm/i915/intel_audio.c
index fb22a2bc85e6..1f168e27af10 100644
--- a/drivers/gpu/drm/i915/intel_audio.c
+++ b/drivers/gpu/drm/i915/intel_audio.c
@@ -491,6 +491,7 @@ void intel_audio_codec_enable(struct intel_encoder *intel_encoder)
491 struct drm_i915_private *dev_priv = to_i915(encoder->dev); 491 struct drm_i915_private *dev_priv = to_i915(encoder->dev);
492 struct i915_audio_component *acomp = dev_priv->audio_component; 492 struct i915_audio_component *acomp = dev_priv->audio_component;
493 enum port port = intel_encoder->port; 493 enum port port = intel_encoder->port;
494 enum pipe pipe = crtc->pipe;
494 495
495 connector = drm_select_eld(encoder); 496 connector = drm_select_eld(encoder);
496 if (!connector) 497 if (!connector)
@@ -515,12 +516,18 @@ void intel_audio_codec_enable(struct intel_encoder *intel_encoder)
515 516
516 mutex_lock(&dev_priv->av_mutex); 517 mutex_lock(&dev_priv->av_mutex);
517 intel_encoder->audio_connector = connector; 518 intel_encoder->audio_connector = connector;
519
518 /* referred in audio callbacks */ 520 /* referred in audio callbacks */
519 dev_priv->dig_port_map[port] = intel_encoder; 521 dev_priv->av_enc_map[pipe] = intel_encoder;
520 mutex_unlock(&dev_priv->av_mutex); 522 mutex_unlock(&dev_priv->av_mutex);
521 523
524 /* audio drivers expect pipe = -1 to indicate Non-MST cases */
525 if (intel_encoder->type != INTEL_OUTPUT_DP_MST)
526 pipe = -1;
527
522 if (acomp && acomp->audio_ops && acomp->audio_ops->pin_eld_notify) 528 if (acomp && acomp->audio_ops && acomp->audio_ops->pin_eld_notify)
523 acomp->audio_ops->pin_eld_notify(acomp->audio_ops->audio_ptr, (int) port); 529 acomp->audio_ops->pin_eld_notify(acomp->audio_ops->audio_ptr,
530 (int) port, (int) pipe);
524} 531}
525 532
526/** 533/**
@@ -536,17 +543,24 @@ void intel_audio_codec_disable(struct intel_encoder *intel_encoder)
536 struct drm_i915_private *dev_priv = to_i915(encoder->dev); 543 struct drm_i915_private *dev_priv = to_i915(encoder->dev);
537 struct i915_audio_component *acomp = dev_priv->audio_component; 544 struct i915_audio_component *acomp = dev_priv->audio_component;
538 enum port port = intel_encoder->port; 545 enum port port = intel_encoder->port;
546 struct intel_crtc *crtc = to_intel_crtc(encoder->crtc);
547 enum pipe pipe = crtc->pipe;
539 548
540 if (dev_priv->display.audio_codec_disable) 549 if (dev_priv->display.audio_codec_disable)
541 dev_priv->display.audio_codec_disable(intel_encoder); 550 dev_priv->display.audio_codec_disable(intel_encoder);
542 551
543 mutex_lock(&dev_priv->av_mutex); 552 mutex_lock(&dev_priv->av_mutex);
544 intel_encoder->audio_connector = NULL; 553 intel_encoder->audio_connector = NULL;
545 dev_priv->dig_port_map[port] = NULL; 554 dev_priv->av_enc_map[pipe] = NULL;
546 mutex_unlock(&dev_priv->av_mutex); 555 mutex_unlock(&dev_priv->av_mutex);
547 556
557 /* audio drivers expect pipe = -1 to indicate Non-MST cases */
558 if (intel_encoder->type != INTEL_OUTPUT_DP_MST)
559 pipe = -1;
560
548 if (acomp && acomp->audio_ops && acomp->audio_ops->pin_eld_notify) 561 if (acomp && acomp->audio_ops && acomp->audio_ops->pin_eld_notify)
549 acomp->audio_ops->pin_eld_notify(acomp->audio_ops->audio_ptr, (int) port); 562 acomp->audio_ops->pin_eld_notify(acomp->audio_ops->audio_ptr,
563 (int) port, (int) pipe);
550} 564}
551 565
552/** 566/**
@@ -621,15 +635,40 @@ static int i915_audio_component_get_cdclk_freq(struct device *kdev)
621 return dev_priv->cdclk_freq; 635 return dev_priv->cdclk_freq;
622} 636}
623 637
624static int i915_audio_component_sync_audio_rate(struct device *kdev, 638static struct intel_encoder *get_saved_enc(struct drm_i915_private *dev_priv,
625 int port, int rate) 639 int port, int pipe)
640{
641
642 if (WARN_ON(pipe >= I915_MAX_PIPES))
643 return NULL;
644
645 /* MST */
646 if (pipe >= 0)
647 return dev_priv->av_enc_map[pipe];
648
649 /* Non-MST */
650 for_each_pipe(dev_priv, pipe) {
651 struct intel_encoder *encoder;
652
653 encoder = dev_priv->av_enc_map[pipe];
654 if (encoder == NULL)
655 continue;
656
657 if (port == encoder->port)
658 return encoder;
659 }
660
661 return NULL;
662}
663
664static int i915_audio_component_sync_audio_rate(struct device *kdev, int port,
665 int pipe, int rate)
626{ 666{
627 struct drm_i915_private *dev_priv = kdev_to_i915(kdev); 667 struct drm_i915_private *dev_priv = kdev_to_i915(kdev);
628 struct intel_encoder *intel_encoder; 668 struct intel_encoder *intel_encoder;
629 struct intel_crtc *crtc; 669 struct intel_crtc *crtc;
630 struct drm_display_mode *mode; 670 struct drm_display_mode *mode;
631 struct i915_audio_component *acomp = dev_priv->audio_component; 671 struct i915_audio_component *acomp = dev_priv->audio_component;
632 enum pipe pipe = INVALID_PIPE;
633 u32 tmp; 672 u32 tmp;
634 int n; 673 int n;
635 int err = 0; 674 int err = 0;
@@ -643,25 +682,20 @@ static int i915_audio_component_sync_audio_rate(struct device *kdev,
643 682
644 i915_audio_component_get_power(kdev); 683 i915_audio_component_get_power(kdev);
645 mutex_lock(&dev_priv->av_mutex); 684 mutex_lock(&dev_priv->av_mutex);
685
646 /* 1. get the pipe */ 686 /* 1. get the pipe */
647 intel_encoder = dev_priv->dig_port_map[port]; 687 intel_encoder = get_saved_enc(dev_priv, port, pipe);
648 /* intel_encoder might be NULL for DP MST */
649 if (!intel_encoder || !intel_encoder->base.crtc || 688 if (!intel_encoder || !intel_encoder->base.crtc ||
650 intel_encoder->type != INTEL_OUTPUT_HDMI) { 689 intel_encoder->type != INTEL_OUTPUT_HDMI) {
651 DRM_DEBUG_KMS("no valid port %c\n", port_name(port)); 690 DRM_DEBUG_KMS("Not valid for port %c\n", port_name(port));
652 err = -ENODEV; 691 err = -ENODEV;
653 goto unlock; 692 goto unlock;
654 } 693 }
694
695 /* pipe passed from the audio driver will be -1 for Non-MST case */
655 crtc = to_intel_crtc(intel_encoder->base.crtc); 696 crtc = to_intel_crtc(intel_encoder->base.crtc);
656 pipe = crtc->pipe; 697 pipe = crtc->pipe;
657 if (pipe == INVALID_PIPE) {
658 DRM_DEBUG_KMS("no pipe for the port %c\n", port_name(port));
659 err = -ENODEV;
660 goto unlock;
661 }
662 698
663 DRM_DEBUG_KMS("pipe %c connects port %c\n",
664 pipe_name(pipe), port_name(port));
665 mode = &crtc->config->base.adjusted_mode; 699 mode = &crtc->config->base.adjusted_mode;
666 700
667 /* port must be valid now, otherwise the pipe will be invalid */ 701 /* port must be valid now, otherwise the pipe will be invalid */
@@ -697,7 +731,7 @@ static int i915_audio_component_sync_audio_rate(struct device *kdev,
697} 731}
698 732
699static int i915_audio_component_get_eld(struct device *kdev, int port, 733static int i915_audio_component_get_eld(struct device *kdev, int port,
700 bool *enabled, 734 int pipe, bool *enabled,
701 unsigned char *buf, int max_bytes) 735 unsigned char *buf, int max_bytes)
702{ 736{
703 struct drm_i915_private *dev_priv = kdev_to_i915(kdev); 737 struct drm_i915_private *dev_priv = kdev_to_i915(kdev);
@@ -706,16 +740,20 @@ static int i915_audio_component_get_eld(struct device *kdev, int port,
706 int ret = -EINVAL; 740 int ret = -EINVAL;
707 741
708 mutex_lock(&dev_priv->av_mutex); 742 mutex_lock(&dev_priv->av_mutex);
709 intel_encoder = dev_priv->dig_port_map[port]; 743
710 /* intel_encoder might be NULL for DP MST */ 744 intel_encoder = get_saved_enc(dev_priv, port, pipe);
711 if (intel_encoder) { 745 if (!intel_encoder) {
712 ret = 0; 746 DRM_DEBUG_KMS("Not valid for port %c\n", port_name(port));
713 *enabled = intel_encoder->audio_connector != NULL; 747 mutex_unlock(&dev_priv->av_mutex);
714 if (*enabled) { 748 return ret;
715 eld = intel_encoder->audio_connector->eld; 749 }
716 ret = drm_eld_size(eld); 750
717 memcpy(buf, eld, min(max_bytes, ret)); 751 ret = 0;
718 } 752 *enabled = intel_encoder->audio_connector != NULL;
753 if (*enabled) {
754 eld = intel_encoder->audio_connector->eld;
755 ret = drm_eld_size(eld);
756 memcpy(buf, eld, min(max_bytes, ret));
719 } 757 }
720 758
721 mutex_unlock(&dev_priv->av_mutex); 759 mutex_unlock(&dev_priv->av_mutex);
diff --git a/include/drm/i915_component.h b/include/drm/i915_component.h
index b46fa0ef3005..545c6e0fea7d 100644
--- a/include/drm/i915_component.h
+++ b/include/drm/i915_component.h
@@ -64,7 +64,7 @@ struct i915_audio_component_ops {
64 * Called from audio driver. After audio driver sets the 64 * Called from audio driver. After audio driver sets the
65 * sample rate, it will call this function to set n/cts 65 * sample rate, it will call this function to set n/cts
66 */ 66 */
67 int (*sync_audio_rate)(struct device *, int port, int rate); 67 int (*sync_audio_rate)(struct device *, int port, int pipe, int rate);
68 /** 68 /**
69 * @get_eld: fill the audio state and ELD bytes for the given port 69 * @get_eld: fill the audio state and ELD bytes for the given port
70 * 70 *
@@ -77,7 +77,7 @@ struct i915_audio_component_ops {
77 * Note that the returned size may be over @max_bytes. Then it 77 * Note that the returned size may be over @max_bytes. Then it
78 * implies that only a part of ELD has been copied to the buffer. 78 * implies that only a part of ELD has been copied to the buffer.
79 */ 79 */
80 int (*get_eld)(struct device *, int port, bool *enabled, 80 int (*get_eld)(struct device *, int port, int pipe, bool *enabled,
81 unsigned char *buf, int max_bytes); 81 unsigned char *buf, int max_bytes);
82}; 82};
83 83
@@ -97,7 +97,7 @@ struct i915_audio_component_audio_ops {
97 * status accordingly (even when the HDA controller is in power save 97 * status accordingly (even when the HDA controller is in power save
98 * mode). 98 * mode).
99 */ 99 */
100 void (*pin_eld_notify)(void *audio_ptr, int port); 100 void (*pin_eld_notify)(void *audio_ptr, int port, int pipe);
101}; 101};
102 102
103/** 103/**
diff --git a/include/sound/hda_i915.h b/include/sound/hda_i915.h
index 796cabf6be5e..5ab972e116ec 100644
--- a/include/sound/hda_i915.h
+++ b/include/sound/hda_i915.h
@@ -10,8 +10,9 @@
10int snd_hdac_set_codec_wakeup(struct hdac_bus *bus, bool enable); 10int snd_hdac_set_codec_wakeup(struct hdac_bus *bus, bool enable);
11int snd_hdac_display_power(struct hdac_bus *bus, bool enable); 11int snd_hdac_display_power(struct hdac_bus *bus, bool enable);
12void snd_hdac_i915_set_bclk(struct hdac_bus *bus); 12void snd_hdac_i915_set_bclk(struct hdac_bus *bus);
13int snd_hdac_sync_audio_rate(struct hdac_device *codec, hda_nid_t nid, int rate); 13int snd_hdac_sync_audio_rate(struct hdac_device *codec, hda_nid_t nid,
14int snd_hdac_acomp_get_eld(struct hdac_device *codec, hda_nid_t nid, 14 int dev_id, int rate);
15int snd_hdac_acomp_get_eld(struct hdac_device *codec, hda_nid_t nid, int dev_id,
15 bool *audio_enabled, char *buffer, int max_bytes); 16 bool *audio_enabled, char *buffer, int max_bytes);
16int snd_hdac_i915_init(struct hdac_bus *bus); 17int snd_hdac_i915_init(struct hdac_bus *bus);
17int snd_hdac_i915_exit(struct hdac_bus *bus); 18int snd_hdac_i915_exit(struct hdac_bus *bus);
@@ -29,13 +30,13 @@ static inline void snd_hdac_i915_set_bclk(struct hdac_bus *bus)
29{ 30{
30} 31}
31static inline int snd_hdac_sync_audio_rate(struct hdac_device *codec, 32static inline int snd_hdac_sync_audio_rate(struct hdac_device *codec,
32 hda_nid_t nid, int rate) 33 hda_nid_t nid, int dev_id, int rate)
33{ 34{
34 return 0; 35 return 0;
35} 36}
36static inline int snd_hdac_acomp_get_eld(struct hdac_device *codec, hda_nid_t nid, 37static inline int snd_hdac_acomp_get_eld(struct hdac_device *codec, hda_nid_t nid,
37 bool *audio_enabled, char *buffer, 38 int dev_id, bool *audio_enabled,
38 int max_bytes) 39 char *buffer, int max_bytes)
39{ 40{
40 return -ENODEV; 41 return -ENODEV;
41} 42}
diff --git a/sound/hda/hdac_i915.c b/sound/hda/hdac_i915.c
index c9af022676c2..0659bf389489 100644
--- a/sound/hda/hdac_i915.c
+++ b/sound/hda/hdac_i915.c
@@ -193,6 +193,7 @@ static int pin2port(struct hdac_device *codec, hda_nid_t pin_nid)
193 * snd_hdac_sync_audio_rate - Set N/CTS based on the sample rate 193 * snd_hdac_sync_audio_rate - Set N/CTS based on the sample rate
194 * @codec: HDA codec 194 * @codec: HDA codec
195 * @nid: the pin widget NID 195 * @nid: the pin widget NID
196 * @dev_id: device identifier
196 * @rate: the sample rate to set 197 * @rate: the sample rate to set
197 * 198 *
198 * This function is supposed to be used only by a HD-audio controller 199 * This function is supposed to be used only by a HD-audio controller
@@ -201,18 +202,20 @@ static int pin2port(struct hdac_device *codec, hda_nid_t pin_nid)
201 * This function sets N/CTS value based on the given sample rate. 202 * This function sets N/CTS value based on the given sample rate.
202 * Returns zero for success, or a negative error code. 203 * Returns zero for success, or a negative error code.
203 */ 204 */
204int snd_hdac_sync_audio_rate(struct hdac_device *codec, hda_nid_t nid, int rate) 205int snd_hdac_sync_audio_rate(struct hdac_device *codec, hda_nid_t nid,
206 int dev_id, int rate)
205{ 207{
206 struct hdac_bus *bus = codec->bus; 208 struct hdac_bus *bus = codec->bus;
207 struct i915_audio_component *acomp = bus->audio_component; 209 struct i915_audio_component *acomp = bus->audio_component;
208 int port; 210 int port, pipe;
209 211
210 if (!acomp || !acomp->ops || !acomp->ops->sync_audio_rate) 212 if (!acomp || !acomp->ops || !acomp->ops->sync_audio_rate)
211 return -ENODEV; 213 return -ENODEV;
212 port = pin2port(codec, nid); 214 port = pin2port(codec, nid);
213 if (port < 0) 215 if (port < 0)
214 return -EINVAL; 216 return -EINVAL;
215 return acomp->ops->sync_audio_rate(acomp->dev, port, rate); 217 pipe = dev_id;
218 return acomp->ops->sync_audio_rate(acomp->dev, port, pipe, rate);
216} 219}
217EXPORT_SYMBOL_GPL(snd_hdac_sync_audio_rate); 220EXPORT_SYMBOL_GPL(snd_hdac_sync_audio_rate);
218 221
@@ -220,6 +223,7 @@ EXPORT_SYMBOL_GPL(snd_hdac_sync_audio_rate);
220 * snd_hdac_acomp_get_eld - Get the audio state and ELD via component 223 * snd_hdac_acomp_get_eld - Get the audio state and ELD via component
221 * @codec: HDA codec 224 * @codec: HDA codec
222 * @nid: the pin widget NID 225 * @nid: the pin widget NID
226 * @dev_id: device identifier
223 * @audio_enabled: the pointer to store the current audio state 227 * @audio_enabled: the pointer to store the current audio state
224 * @buffer: the buffer pointer to store ELD bytes 228 * @buffer: the buffer pointer to store ELD bytes
225 * @max_bytes: the max bytes to be stored on @buffer 229 * @max_bytes: the max bytes to be stored on @buffer
@@ -236,12 +240,12 @@ EXPORT_SYMBOL_GPL(snd_hdac_sync_audio_rate);
236 * thus it may be over @max_bytes. If it's over @max_bytes, it implies 240 * thus it may be over @max_bytes. If it's over @max_bytes, it implies
237 * that only a part of ELD bytes have been fetched. 241 * that only a part of ELD bytes have been fetched.
238 */ 242 */
239int snd_hdac_acomp_get_eld(struct hdac_device *codec, hda_nid_t nid, 243int snd_hdac_acomp_get_eld(struct hdac_device *codec, hda_nid_t nid, int dev_id,
240 bool *audio_enabled, char *buffer, int max_bytes) 244 bool *audio_enabled, char *buffer, int max_bytes)
241{ 245{
242 struct hdac_bus *bus = codec->bus; 246 struct hdac_bus *bus = codec->bus;
243 struct i915_audio_component *acomp = bus->audio_component; 247 struct i915_audio_component *acomp = bus->audio_component;
244 int port; 248 int port, pipe;
245 249
246 if (!acomp || !acomp->ops || !acomp->ops->get_eld) 250 if (!acomp || !acomp->ops || !acomp->ops->get_eld)
247 return -ENODEV; 251 return -ENODEV;
@@ -249,7 +253,9 @@ int snd_hdac_acomp_get_eld(struct hdac_device *codec, hda_nid_t nid,
249 port = pin2port(codec, nid); 253 port = pin2port(codec, nid);
250 if (port < 0) 254 if (port < 0)
251 return -EINVAL; 255 return -EINVAL;
252 return acomp->ops->get_eld(acomp->dev, port, audio_enabled, 256
257 pipe = dev_id;
258 return acomp->ops->get_eld(acomp->dev, port, pipe, audio_enabled,
253 buffer, max_bytes); 259 buffer, max_bytes);
254} 260}
255EXPORT_SYMBOL_GPL(snd_hdac_acomp_get_eld); 261EXPORT_SYMBOL_GPL(snd_hdac_acomp_get_eld);
diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c
index 56e5204ac9c1..cf9bc042fe96 100644
--- a/sound/pci/hda/patch_hdmi.c
+++ b/sound/pci/hda/patch_hdmi.c
@@ -1485,7 +1485,7 @@ static void sync_eld_via_acomp(struct hda_codec *codec,
1485 1485
1486 mutex_lock(&per_pin->lock); 1486 mutex_lock(&per_pin->lock);
1487 eld->monitor_present = false; 1487 eld->monitor_present = false;
1488 size = snd_hdac_acomp_get_eld(&codec->core, per_pin->pin_nid, 1488 size = snd_hdac_acomp_get_eld(&codec->core, per_pin->pin_nid, -1,
1489 &eld->monitor_present, eld->eld_buffer, 1489 &eld->monitor_present, eld->eld_buffer,
1490 ELD_MAX_SIZE); 1490 ELD_MAX_SIZE);
1491 if (size > 0) { 1491 if (size > 0) {
@@ -1744,7 +1744,8 @@ static int generic_hdmi_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
1744 /* Call sync_audio_rate to set the N/CTS/M manually if necessary */ 1744 /* Call sync_audio_rate to set the N/CTS/M manually if necessary */
1745 /* Todo: add DP1.2 MST audio support later */ 1745 /* Todo: add DP1.2 MST audio support later */
1746 if (codec_has_acomp(codec)) 1746 if (codec_has_acomp(codec))
1747 snd_hdac_sync_audio_rate(&codec->core, pin_nid, runtime->rate); 1747 snd_hdac_sync_audio_rate(&codec->core, pin_nid, -1,
1748 runtime->rate);
1748 1749
1749 non_pcm = check_non_pcm_per_cvt(codec, cvt_nid); 1750 non_pcm = check_non_pcm_per_cvt(codec, cvt_nid);
1750 mutex_lock(&per_pin->lock); 1751 mutex_lock(&per_pin->lock);
@@ -2290,7 +2291,7 @@ static void haswell_set_power_state(struct hda_codec *codec, hda_nid_t fg,
2290 snd_hda_codec_set_power_to_all(codec, fg, power_state); 2291 snd_hda_codec_set_power_to_all(codec, fg, power_state);
2291} 2292}
2292 2293
2293static void intel_pin_eld_notify(void *audio_ptr, int port) 2294static void intel_pin_eld_notify(void *audio_ptr, int port, int pipe)
2294{ 2295{
2295 struct hda_codec *codec = audio_ptr; 2296 struct hda_codec *codec = audio_ptr;
2296 int pin_nid; 2297 int pin_nid;
diff --git a/sound/soc/codecs/hdac_hdmi.c b/sound/soc/codecs/hdac_hdmi.c
index 4e181b270d95..dc0129b75a4b 100644
--- a/sound/soc/codecs/hdac_hdmi.c
+++ b/sound/soc/codecs/hdac_hdmi.c
@@ -1368,7 +1368,7 @@ static int hdac_hdmi_parse_and_map_nid(struct hdac_ext_device *edev,
1368 return hdac_hdmi_init_dai_map(edev); 1368 return hdac_hdmi_init_dai_map(edev);
1369} 1369}
1370 1370
1371static void hdac_hdmi_eld_notify_cb(void *aptr, int port) 1371static void hdac_hdmi_eld_notify_cb(void *aptr, int port, int pipe)
1372{ 1372{
1373 struct hdac_ext_device *edev = aptr; 1373 struct hdac_ext_device *edev = aptr;
1374 struct hdac_hdmi_priv *hdmi = edev->private_data; 1374 struct hdac_hdmi_priv *hdmi = edev->private_data;