[PATCH 5/5] drm/radeon: set speaker allocation for DCE4/5

2013-08-15 Thread Rafał Miłecki
2013/8/15 Rafa? Mi?ecki :
> 2013/8/15 Alex Deucher :
>> +static void dce4_afmt_write_speaker_allocation(struct drm_encoder *encoder)
>> +{
>> +   struct radeon_device *rdev = encoder->dev->dev_private;
>> +   struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
>> +   struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
>> +   struct drm_connector *connector;
>> +   struct radeon_connector *radeon_connector = NULL;
>> +   u32 offset, tmp;
>> +   u8 *sadb;
>> +   int sad_count;
>> +
>> +   if (!dig->afmt->pin)
>> +   return;
>> +
>> +   offset = dig->afmt->pin->offset;
>
> You don't want that (offset) :)

After that trivial fix
Acked-by: Rafa? Mi?ecki 

-- 
Rafa?


[PATCH 5/5] drm/radeon: set speaker allocation for DCE4/5

2013-08-15 Thread Rafał Miłecki
2013/8/15 Alex Deucher :
> +static void dce4_afmt_write_speaker_allocation(struct drm_encoder *encoder)
> +{
> +   struct radeon_device *rdev = encoder->dev->dev_private;
> +   struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
> +   struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
> +   struct drm_connector *connector;
> +   struct radeon_connector *radeon_connector = NULL;
> +   u32 offset, tmp;
> +   u8 *sadb;
> +   int sad_count;
> +
> +   if (!dig->afmt->pin)
> +   return;
> +
> +   offset = dig->afmt->pin->offset;

You don't want that (offset) :)


[PATCH 5/5] drm/radeon: set speaker allocation for DCE4/5

2013-08-15 Thread Alex Deucher
This updates the audio driver to the speaker allocation
block from the EDID.  A similar change was just implemented
for DCE6/8.

Signed-off-by: Alex Deucher 
---
 drivers/gpu/drm/radeon/evergreen_hdmi.c | 48 -
 drivers/gpu/drm/radeon/evergreend.h |  7 +
 2 files changed, 54 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/radeon/evergreen_hdmi.c 
b/drivers/gpu/drm/radeon/evergreen_hdmi.c
index 2cb0f90..efb67ed 100644
--- a/drivers/gpu/drm/radeon/evergreen_hdmi.c
+++ b/drivers/gpu/drm/radeon/evergreen_hdmi.c
@@ -58,6 +58,52 @@ static void evergreen_hdmi_update_ACR(struct drm_encoder 
*encoder, uint32_t cloc
WREG32(HDMI_ACR_48_1 + offset, acr.n_48khz);
 }

+static void dce4_afmt_write_speaker_allocation(struct drm_encoder *encoder)
+{
+   struct radeon_device *rdev = encoder->dev->dev_private;
+   struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
+   struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
+   struct drm_connector *connector;
+   struct radeon_connector *radeon_connector = NULL;
+   u32 offset, tmp;
+   u8 *sadb;
+   int sad_count;
+
+   if (!dig->afmt->pin)
+   return;
+
+   offset = dig->afmt->pin->offset;
+
+   list_for_each_entry(connector, 
>dev->mode_config.connector_list, head) {
+   if (connector->encoder == encoder)
+   radeon_connector = to_radeon_connector(connector);
+   }
+
+   if (!radeon_connector) {
+   DRM_ERROR("Couldn't find encoder's connector\n");
+   return;
+   }
+
+   sad_count = drm_edid_to_speaker_allocation(radeon_connector->edid, 
);
+   if (sad_count < 0) {
+   DRM_ERROR("Couldn't read Speaker Allocation Data Block: %d\n", 
sad_count);
+   return;
+   }
+
+   /* program the speaker allocation */
+   tmp = RREG32(AZ_F0_CODEC_PIN0_CONTROL_CHANNEL_SPEAKER);
+   tmp &= ~(DP_CONNECTION | SPEAKER_ALLOCATION_MASK);
+   /* set HDMI mode */
+   tmp |= HDMI_CONNECTION;
+   if (sad_count)
+   tmp |= SPEAKER_ALLOCATION(sadb[0]);
+   else
+   tmp |= SPEAKER_ALLOCATION(5); /* stereo */
+   WREG32(AZ_F0_CODEC_PIN0_CONTROL_CHANNEL_SPEAKER, tmp);
+
+   kfree(sadb);
+}
+
 static void evergreen_hdmi_write_sad_regs(struct drm_encoder *encoder)
 {
struct radeon_device *rdev = encoder->dev->dev_private;
@@ -271,7 +317,7 @@ void evergreen_hdmi_setmode(struct drm_encoder *encoder, 
struct drm_display_mode
if (ASIC_IS_DCE6(rdev)) {
dce6_afmt_write_speaker_allocation(encoder);
} else {
-   /* fglrx sets 0x0001005f | (x & 0x00fc) in 0x5f78 here */
+   dce4_afmt_write_speaker_allocation(encoder);
}

WREG32(AFMT_AUDIO_PACKET_CONTROL2 + offset,
diff --git a/drivers/gpu/drm/radeon/evergreend.h 
b/drivers/gpu/drm/radeon/evergreend.h
index 0d582ac..430997a 100644
--- a/drivers/gpu/drm/radeon/evergreend.h
+++ b/drivers/gpu/drm/radeon/evergreend.h
@@ -714,6 +714,13 @@
 #define AFMT_GENERIC0_7  0x7138

 /* DCE4/5 ELD audio interface */
+#define AZ_F0_CODEC_PIN0_CONTROL_CHANNEL_SPEAKER  0x5f78
+#defineSPEAKER_ALLOCATION(x)   (((x) & 0x7f) 
<< 0)
+#defineSPEAKER_ALLOCATION_MASK (0x7f << 0)
+#defineSPEAKER_ALLOCATION_SHIFT0
+#defineHDMI_CONNECTION (1 << 16)
+#defineDP_CONNECTION   (1 << 17)
+
 #define AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR00x5f84 /* LPCM */
 #define AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR10x5f88 /* AC3 */
 #define AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR20x5f8c /* MPEG1 */
-- 
1.8.3.1



[PATCH 5/5] drm/radeon: set speaker allocation for DCE4/5

2013-08-15 Thread Alex Deucher
This updates the audio driver to the speaker allocation
block from the EDID.  A similar change was just implemented
for DCE6/8.

Signed-off-by: Alex Deucher alexander.deuc...@amd.com
---
 drivers/gpu/drm/radeon/evergreen_hdmi.c | 48 -
 drivers/gpu/drm/radeon/evergreend.h |  7 +
 2 files changed, 54 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/radeon/evergreen_hdmi.c 
b/drivers/gpu/drm/radeon/evergreen_hdmi.c
index 2cb0f90..efb67ed 100644
--- a/drivers/gpu/drm/radeon/evergreen_hdmi.c
+++ b/drivers/gpu/drm/radeon/evergreen_hdmi.c
@@ -58,6 +58,52 @@ static void evergreen_hdmi_update_ACR(struct drm_encoder 
*encoder, uint32_t cloc
WREG32(HDMI_ACR_48_1 + offset, acr.n_48khz);
 }
 
+static void dce4_afmt_write_speaker_allocation(struct drm_encoder *encoder)
+{
+   struct radeon_device *rdev = encoder-dev-dev_private;
+   struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
+   struct radeon_encoder_atom_dig *dig = radeon_encoder-enc_priv;
+   struct drm_connector *connector;
+   struct radeon_connector *radeon_connector = NULL;
+   u32 offset, tmp;
+   u8 *sadb;
+   int sad_count;
+
+   if (!dig-afmt-pin)
+   return;
+
+   offset = dig-afmt-pin-offset;
+
+   list_for_each_entry(connector, 
encoder-dev-mode_config.connector_list, head) {
+   if (connector-encoder == encoder)
+   radeon_connector = to_radeon_connector(connector);
+   }
+
+   if (!radeon_connector) {
+   DRM_ERROR(Couldn't find encoder's connector\n);
+   return;
+   }
+
+   sad_count = drm_edid_to_speaker_allocation(radeon_connector-edid, 
sadb);
+   if (sad_count  0) {
+   DRM_ERROR(Couldn't read Speaker Allocation Data Block: %d\n, 
sad_count);
+   return;
+   }
+
+   /* program the speaker allocation */
+   tmp = RREG32(AZ_F0_CODEC_PIN0_CONTROL_CHANNEL_SPEAKER);
+   tmp = ~(DP_CONNECTION | SPEAKER_ALLOCATION_MASK);
+   /* set HDMI mode */
+   tmp |= HDMI_CONNECTION;
+   if (sad_count)
+   tmp |= SPEAKER_ALLOCATION(sadb[0]);
+   else
+   tmp |= SPEAKER_ALLOCATION(5); /* stereo */
+   WREG32(AZ_F0_CODEC_PIN0_CONTROL_CHANNEL_SPEAKER, tmp);
+
+   kfree(sadb);
+}
+
 static void evergreen_hdmi_write_sad_regs(struct drm_encoder *encoder)
 {
struct radeon_device *rdev = encoder-dev-dev_private;
@@ -271,7 +317,7 @@ void evergreen_hdmi_setmode(struct drm_encoder *encoder, 
struct drm_display_mode
if (ASIC_IS_DCE6(rdev)) {
dce6_afmt_write_speaker_allocation(encoder);
} else {
-   /* fglrx sets 0x0001005f | (x  0x00fc) in 0x5f78 here */
+   dce4_afmt_write_speaker_allocation(encoder);
}
 
WREG32(AFMT_AUDIO_PACKET_CONTROL2 + offset,
diff --git a/drivers/gpu/drm/radeon/evergreend.h 
b/drivers/gpu/drm/radeon/evergreend.h
index 0d582ac..430997a 100644
--- a/drivers/gpu/drm/radeon/evergreend.h
+++ b/drivers/gpu/drm/radeon/evergreend.h
@@ -714,6 +714,13 @@
 #define AFMT_GENERIC0_7  0x7138
 
 /* DCE4/5 ELD audio interface */
+#define AZ_F0_CODEC_PIN0_CONTROL_CHANNEL_SPEAKER  0x5f78
+#defineSPEAKER_ALLOCATION(x)   (((x)  0x7f) 
 0)
+#defineSPEAKER_ALLOCATION_MASK (0x7f  0)
+#defineSPEAKER_ALLOCATION_SHIFT0
+#defineHDMI_CONNECTION (1  16)
+#defineDP_CONNECTION   (1  17)
+
 #define AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR00x5f84 /* LPCM */
 #define AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR10x5f88 /* AC3 */
 #define AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR20x5f8c /* MPEG1 */
-- 
1.8.3.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH 5/5] drm/radeon: set speaker allocation for DCE4/5

2013-08-15 Thread Rafał Miłecki
2013/8/15 Alex Deucher alexdeuc...@gmail.com:
 +static void dce4_afmt_write_speaker_allocation(struct drm_encoder *encoder)
 +{
 +   struct radeon_device *rdev = encoder-dev-dev_private;
 +   struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
 +   struct radeon_encoder_atom_dig *dig = radeon_encoder-enc_priv;
 +   struct drm_connector *connector;
 +   struct radeon_connector *radeon_connector = NULL;
 +   u32 offset, tmp;
 +   u8 *sadb;
 +   int sad_count;
 +
 +   if (!dig-afmt-pin)
 +   return;
 +
 +   offset = dig-afmt-pin-offset;

You don't want that (offset) :)
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH 5/5] drm/radeon: set speaker allocation for DCE4/5

2013-08-15 Thread Rafał Miłecki
2013/8/15 Rafał Miłecki zaj...@gmail.com:
 2013/8/15 Alex Deucher alexdeuc...@gmail.com:
 +static void dce4_afmt_write_speaker_allocation(struct drm_encoder *encoder)
 +{
 +   struct radeon_device *rdev = encoder-dev-dev_private;
 +   struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
 +   struct radeon_encoder_atom_dig *dig = radeon_encoder-enc_priv;
 +   struct drm_connector *connector;
 +   struct radeon_connector *radeon_connector = NULL;
 +   u32 offset, tmp;
 +   u8 *sadb;
 +   int sad_count;
 +
 +   if (!dig-afmt-pin)
 +   return;
 +
 +   offset = dig-afmt-pin-offset;

 You don't want that (offset) :)

After that trivial fix
Acked-by: Rafał Miłecki zaj...@gmail.com

-- 
Rafał
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel