[PATCH 3/6] drm/radeon: add audio support for DCE6/8 GPUs (v12)

2013-08-15 Thread Alex Deucher
Similar to DCE4/5, but supports multiple audio pins
which can be assigned per afmt block.

v2: rework the driver to handle more than one audio
pin.
v3: try different dto reg
v4: properly program dto
v5 (ck): change dto programming order
v6: program speaker allocation block
v7: rebase
v8: rebase on Rafa?'s changes
v9: integrated Rafa?'s comments, update to latest
drm_edid_to_speaker_allocation API
v10: add missing line break in error message
v11: add back audio enabled messages
v12: fix copy paste typo in r600_audio_enable

Signed-off-by: Alex Deucher 
Signed-off-by: Christian K?nig 
Acked-by: Rafa? Mi?ecki 
---
 drivers/gpu/drm/radeon/Makefile|   2 +-
 drivers/gpu/drm/radeon/atombios_encoders.c |  11 +-
 drivers/gpu/drm/radeon/cik.c   |   5 +
 drivers/gpu/drm/radeon/dce6_afmt.c | 251 +
 drivers/gpu/drm/radeon/evergreen_hdmi.c|  54 +--
 drivers/gpu/drm/radeon/ni.c|  17 +-
 drivers/gpu/drm/radeon/r600_audio.c|  60 ---
 drivers/gpu/drm/radeon/r600_hdmi.c |   7 +-
 drivers/gpu/drm/radeon/radeon.h|  18 ++-
 drivers/gpu/drm/radeon/radeon_asic.c   |   8 +
 drivers/gpu/drm/radeon/radeon_asic.h   |   4 +-
 drivers/gpu/drm/radeon/radeon_display.c|  13 +-
 drivers/gpu/drm/radeon/radeon_mode.h   |   3 +-
 drivers/gpu/drm/radeon/si.c|   5 +
 drivers/gpu/drm/radeon/sid.h   |  59 +++
 15 files changed, 455 insertions(+), 62 deletions(-)
 create mode 100644 drivers/gpu/drm/radeon/dce6_afmt.c

diff --git a/drivers/gpu/drm/radeon/Makefile b/drivers/gpu/drm/radeon/Makefile
index da2a8e9..306364a 100644
--- a/drivers/gpu/drm/radeon/Makefile
+++ b/drivers/gpu/drm/radeon/Makefile
@@ -80,7 +80,7 @@ radeon-y += radeon_device.o radeon_asic.o radeon_kms.o \
r600_dpm.o rs780_dpm.o rv6xx_dpm.o rv770_dpm.o rv730_dpm.o rv740_dpm.o \
rv770_smc.o cypress_dpm.o btc_dpm.o sumo_dpm.o sumo_smc.o trinity_dpm.o 
\
trinity_smc.o ni_dpm.o si_smc.o si_dpm.o kv_smc.o kv_dpm.o ci_smc.o \
-   ci_dpm.o
+   ci_dpm.o dce6_afmt.o

 # add async DMA block
 radeon-y += \
diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c 
b/drivers/gpu/drm/radeon/atombios_encoders.c
index 092275d..dfac796 100644
--- a/drivers/gpu/drm/radeon/atombios_encoders.c
+++ b/drivers/gpu/drm/radeon/atombios_encoders.c
@@ -682,8 +682,6 @@ atombios_digital_setup(struct drm_encoder *encoder, int 
action)
 int
 atombios_get_encoder_mode(struct drm_encoder *encoder)
 {
-   struct drm_device *dev = encoder->dev;
-   struct radeon_device *rdev = dev->dev_private;
struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
struct drm_connector *connector;
struct radeon_connector *radeon_connector;
@@ -710,8 +708,7 @@ atombios_get_encoder_mode(struct drm_encoder *encoder)
case DRM_MODE_CONNECTOR_DVII:
case DRM_MODE_CONNECTOR_HDMIB: /* HDMI-B is basically DL-DVI; analog 
works fine */
if (drm_detect_hdmi_monitor(radeon_connector->edid) &&
-   radeon_audio &&
-   !ASIC_IS_DCE6(rdev)) /* remove once we support DCE6 */
+   radeon_audio)
return ATOM_ENCODER_MODE_HDMI;
else if (radeon_connector->use_digital)
return ATOM_ENCODER_MODE_DVI;
@@ -722,8 +719,7 @@ atombios_get_encoder_mode(struct drm_encoder *encoder)
case DRM_MODE_CONNECTOR_HDMIA:
default:
if (drm_detect_hdmi_monitor(radeon_connector->edid) &&
-   radeon_audio &&
-   !ASIC_IS_DCE6(rdev)) /* remove once we support DCE6 */
+   radeon_audio)
return ATOM_ENCODER_MODE_HDMI;
else
return ATOM_ENCODER_MODE_DVI;
@@ -737,8 +733,7 @@ atombios_get_encoder_mode(struct drm_encoder *encoder)
(dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP))
return ATOM_ENCODER_MODE_DP;
else if (drm_detect_hdmi_monitor(radeon_connector->edid) &&
-radeon_audio &&
-!ASIC_IS_DCE6(rdev)) /* remove once we support DCE6 */
+radeon_audio)
return ATOM_ENCODER_MODE_HDMI;
else
return ATOM_ENCODER_MODE_DVI;
diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c
index 183c164..53d60b4 100644
--- a/drivers/gpu/drm/radeon/cik.c
+++ b/drivers/gpu/drm/radeon/cik.c
@@ -7117,6 +7117,10 @@ static int cik_startup(struct radeon_device *rdev)
return r;
}

+   r = dce6_audio_init(rdev);
+   if (r)
+   return r;
+
return 0;
 }

@@ -7162,6 +7166,7 @@ int cik_resume(struct radeon_device *rdev)
  */
 int cik_suspend(struct radeon_device *rdev)
 {
+   dce6_audio_fini(rdev);
radeon_vm_manager_f

[PATCH 3/6] drm/radeon: add audio support for DCE6/8 GPUs (v12)

2013-08-15 Thread Alex Deucher
Similar to DCE4/5, but supports multiple audio pins
which can be assigned per afmt block.

v2: rework the driver to handle more than one audio
pin.
v3: try different dto reg
v4: properly program dto
v5 (ck): change dto programming order
v6: program speaker allocation block
v7: rebase
v8: rebase on Rafał's changes
v9: integrated Rafał's comments, update to latest
drm_edid_to_speaker_allocation API
v10: add missing line break in error message
v11: add back audio enabled messages
v12: fix copy paste typo in r600_audio_enable

Signed-off-by: Alex Deucher 
Signed-off-by: Christian König 
Acked-by: Rafał Miłecki 
---
 drivers/gpu/drm/radeon/Makefile|   2 +-
 drivers/gpu/drm/radeon/atombios_encoders.c |  11 +-
 drivers/gpu/drm/radeon/cik.c   |   5 +
 drivers/gpu/drm/radeon/dce6_afmt.c | 251 +
 drivers/gpu/drm/radeon/evergreen_hdmi.c|  54 +--
 drivers/gpu/drm/radeon/ni.c|  17 +-
 drivers/gpu/drm/radeon/r600_audio.c|  60 ---
 drivers/gpu/drm/radeon/r600_hdmi.c |   7 +-
 drivers/gpu/drm/radeon/radeon.h|  18 ++-
 drivers/gpu/drm/radeon/radeon_asic.c   |   8 +
 drivers/gpu/drm/radeon/radeon_asic.h   |   4 +-
 drivers/gpu/drm/radeon/radeon_display.c|  13 +-
 drivers/gpu/drm/radeon/radeon_mode.h   |   3 +-
 drivers/gpu/drm/radeon/si.c|   5 +
 drivers/gpu/drm/radeon/sid.h   |  59 +++
 15 files changed, 455 insertions(+), 62 deletions(-)
 create mode 100644 drivers/gpu/drm/radeon/dce6_afmt.c

diff --git a/drivers/gpu/drm/radeon/Makefile b/drivers/gpu/drm/radeon/Makefile
index da2a8e9..306364a 100644
--- a/drivers/gpu/drm/radeon/Makefile
+++ b/drivers/gpu/drm/radeon/Makefile
@@ -80,7 +80,7 @@ radeon-y += radeon_device.o radeon_asic.o radeon_kms.o \
r600_dpm.o rs780_dpm.o rv6xx_dpm.o rv770_dpm.o rv730_dpm.o rv740_dpm.o \
rv770_smc.o cypress_dpm.o btc_dpm.o sumo_dpm.o sumo_smc.o trinity_dpm.o 
\
trinity_smc.o ni_dpm.o si_smc.o si_dpm.o kv_smc.o kv_dpm.o ci_smc.o \
-   ci_dpm.o
+   ci_dpm.o dce6_afmt.o
 
 # add async DMA block
 radeon-y += \
diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c 
b/drivers/gpu/drm/radeon/atombios_encoders.c
index 092275d..dfac796 100644
--- a/drivers/gpu/drm/radeon/atombios_encoders.c
+++ b/drivers/gpu/drm/radeon/atombios_encoders.c
@@ -682,8 +682,6 @@ atombios_digital_setup(struct drm_encoder *encoder, int 
action)
 int
 atombios_get_encoder_mode(struct drm_encoder *encoder)
 {
-   struct drm_device *dev = encoder->dev;
-   struct radeon_device *rdev = dev->dev_private;
struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
struct drm_connector *connector;
struct radeon_connector *radeon_connector;
@@ -710,8 +708,7 @@ atombios_get_encoder_mode(struct drm_encoder *encoder)
case DRM_MODE_CONNECTOR_DVII:
case DRM_MODE_CONNECTOR_HDMIB: /* HDMI-B is basically DL-DVI; analog 
works fine */
if (drm_detect_hdmi_monitor(radeon_connector->edid) &&
-   radeon_audio &&
-   !ASIC_IS_DCE6(rdev)) /* remove once we support DCE6 */
+   radeon_audio)
return ATOM_ENCODER_MODE_HDMI;
else if (radeon_connector->use_digital)
return ATOM_ENCODER_MODE_DVI;
@@ -722,8 +719,7 @@ atombios_get_encoder_mode(struct drm_encoder *encoder)
case DRM_MODE_CONNECTOR_HDMIA:
default:
if (drm_detect_hdmi_monitor(radeon_connector->edid) &&
-   radeon_audio &&
-   !ASIC_IS_DCE6(rdev)) /* remove once we support DCE6 */
+   radeon_audio)
return ATOM_ENCODER_MODE_HDMI;
else
return ATOM_ENCODER_MODE_DVI;
@@ -737,8 +733,7 @@ atombios_get_encoder_mode(struct drm_encoder *encoder)
(dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP))
return ATOM_ENCODER_MODE_DP;
else if (drm_detect_hdmi_monitor(radeon_connector->edid) &&
-radeon_audio &&
-!ASIC_IS_DCE6(rdev)) /* remove once we support DCE6 */
+radeon_audio)
return ATOM_ENCODER_MODE_HDMI;
else
return ATOM_ENCODER_MODE_DVI;
diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c
index 183c164..53d60b4 100644
--- a/drivers/gpu/drm/radeon/cik.c
+++ b/drivers/gpu/drm/radeon/cik.c
@@ -7117,6 +7117,10 @@ static int cik_startup(struct radeon_device *rdev)
return r;
}
 
+   r = dce6_audio_init(rdev);
+   if (r)
+   return r;
+
return 0;
 }
 
@@ -7162,6 +7166,7 @@ int cik_resume(struct radeon_device *rdev)
  */
 int cik_suspend(struct radeon_device *rdev)
 {
+   dce6_audio_fini(rdev);
radeon_vm_manage