]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/gpu/drm/radeon/dce6_afmt.c
radeon/audio: consolidate write_sad_regs() functions
[karo-tx-linux.git] / drivers / gpu / drm / radeon / dce6_afmt.c
index f312edf4d50eaedeac6fca1af4de8a8457b10e17..f263eaa9d190d99333f5b0f344ffd68453a1d863 100644 (file)
 #include <linux/hdmi.h>
 #include <drm/drmP.h>
 #include "radeon.h"
+#include "radeon_audio.h"
 #include "sid.h"
 
-static u32 dce6_endpoint_rreg(struct radeon_device *rdev,
+u32 dce6_endpoint_rreg(struct radeon_device *rdev,
                              u32 block_offset, u32 reg)
 {
        unsigned long flags;
@@ -39,7 +40,7 @@ static u32 dce6_endpoint_rreg(struct radeon_device *rdev,
        return r;
 }
 
-static void dce6_endpoint_wreg(struct radeon_device *rdev,
+void dce6_endpoint_wreg(struct radeon_device *rdev,
                               u32 block_offset, u32 reg, u32 v)
 {
        unsigned long flags;
@@ -54,10 +55,6 @@ static void dce6_endpoint_wreg(struct radeon_device *rdev,
        spin_unlock_irqrestore(&rdev->end_idx_lock, flags);
 }
 
-#define RREG32_ENDPOINT(block, reg) dce6_endpoint_rreg(rdev, (block), (reg))
-#define WREG32_ENDPOINT(block, reg, v) dce6_endpoint_wreg(rdev, (block), (reg), (v))
-
-
 static void dce6_afmt_get_connected_pins(struct radeon_device *rdev)
 {
        int i;
@@ -195,17 +192,14 @@ void dce6_afmt_write_speaker_allocation(struct drm_encoder *encoder)
        kfree(sadb);
 }
 
-void dce6_afmt_write_sad_regs(struct drm_encoder *encoder)
+void dce6_afmt_write_sad_regs(struct drm_encoder *encoder,
+       struct cea_sad *sads, int sad_count)
 {
-       struct radeon_device *rdev = encoder->dev->dev_private;
+       u32 offset;
+       int i;
        struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
        struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
-       u32 offset;
-       struct drm_connector *connector;
-       struct radeon_connector *radeon_connector = NULL;
-       struct cea_sad *sads;
-       int i, sad_count;
-
+       struct radeon_device *rdev = encoder->dev->dev_private;
        static const u16 eld_reg_to_type[][2] = {
                { AZ_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR0, HDMI_AUDIO_CODING_TYPE_PCM },
                { AZ_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR1, HDMI_AUDIO_CODING_TYPE_AC3 },
@@ -226,25 +220,6 @@ void dce6_afmt_write_sad_regs(struct drm_encoder *encoder)
 
        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);
-                       break;
-               }
-       }
-
-       if (!radeon_connector) {
-               DRM_ERROR("Couldn't find encoder's connector\n");
-               return;
-       }
-
-       sad_count = drm_edid_to_sad(radeon_connector_edid(connector), &sads);
-       if (sad_count <= 0) {
-               DRM_ERROR("Couldn't read SADs: %d\n", sad_count);
-               return;
-       }
-       BUG_ON(!sads);
-
        for (i = 0; i < ARRAY_SIZE(eld_reg_to_type); i++) {
                u32 value = 0;
                u8 stereo_freqs = 0;
@@ -273,13 +248,6 @@ void dce6_afmt_write_sad_regs(struct drm_encoder *encoder)
 
                WREG32_ENDPOINT(offset, eld_reg_to_type[i][0], value);
        }
-
-       kfree(sads);
-}
-
-static int dce6_audio_chipset_supported(struct radeon_device *rdev)
-{
-       return !ASIC_IS_NODCE(rdev);
 }
 
 void dce6_audio_enable(struct radeon_device *rdev,
@@ -293,55 +261,6 @@ void dce6_audio_enable(struct radeon_device *rdev,
                        enable_mask ? AUDIO_ENABLED : 0);
 }
 
-static const u32 pin_offsets[7] =
-{
-       (0x5e00 - 0x5e00),
-       (0x5e18 - 0x5e00),
-       (0x5e30 - 0x5e00),
-       (0x5e48 - 0x5e00),
-       (0x5e60 - 0x5e00),
-       (0x5e78 - 0x5e00),
-       (0x5e90 - 0x5e00),
-};
-
-int dce6_audio_init(struct radeon_device *rdev)
-{
-       int i;
-
-       if (!radeon_audio || !dce6_audio_chipset_supported(rdev))
-               return 0;
-
-       rdev->audio.enabled = true;
-
-       if (ASIC_IS_DCE81(rdev)) /* KV: 4 streams, 7 endpoints */
-               rdev->audio.num_pins = 7;
-       else if (ASIC_IS_DCE83(rdev)) /* KB: 2 streams, 3 endpoints */
-               rdev->audio.num_pins = 3;
-       else if (ASIC_IS_DCE8(rdev)) /* BN/HW: 6 streams, 7 endpoints */
-               rdev->audio.num_pins = 7;
-       else if (ASIC_IS_DCE61(rdev)) /* TN: 4 streams, 6 endpoints */
-               rdev->audio.num_pins = 6;
-       else if (ASIC_IS_DCE64(rdev)) /* OL: 2 streams, 2 endpoints */
-               rdev->audio.num_pins = 2;
-       else /* SI: 6 streams, 6 endpoints */
-               rdev->audio.num_pins = 6;
-
-       for (i = 0; i < rdev->audio.num_pins; i++) {
-               rdev->audio.pin[i].channels = -1;
-               rdev->audio.pin[i].rate = -1;
-               rdev->audio.pin[i].bits_per_sample = -1;
-               rdev->audio.pin[i].status_bits = 0;
-               rdev->audio.pin[i].category_code = 0;
-               rdev->audio.pin[i].connected = false;
-               rdev->audio.pin[i].offset = pin_offsets[i];
-               rdev->audio.pin[i].id = i;
-               /* disable audio.  it will be set up later */
-               dce6_audio_enable(rdev, &rdev->audio.pin[i], false);
-       }
-
-       return 0;
-}
-
 void dce6_audio_fini(struct radeon_device *rdev)
 {
        int i;