0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025 #include <linux/gcd.h>
0026
0027 #include <drm/drm_crtc.h>
0028 #include "dce6_afmt.h"
0029 #include "evergreen_hdmi.h"
0030 #include "radeon.h"
0031 #include "atom.h"
0032 #include "r600.h"
0033 #include "radeon_audio.h"
0034
0035 void dce6_audio_enable(struct radeon_device *rdev, struct r600_audio_pin *pin,
0036 u8 enable_mask);
0037 struct r600_audio_pin* r600_audio_get_pin(struct radeon_device *rdev);
0038 struct r600_audio_pin* dce6_audio_get_pin(struct radeon_device *rdev);
0039 static void radeon_audio_hdmi_mode_set(struct drm_encoder *encoder,
0040 struct drm_display_mode *mode);
0041 static void radeon_audio_dp_mode_set(struct drm_encoder *encoder,
0042 struct drm_display_mode *mode);
0043
0044 static const u32 pin_offsets[7] =
0045 {
0046 (0x5e00 - 0x5e00),
0047 (0x5e18 - 0x5e00),
0048 (0x5e30 - 0x5e00),
0049 (0x5e48 - 0x5e00),
0050 (0x5e60 - 0x5e00),
0051 (0x5e78 - 0x5e00),
0052 (0x5e90 - 0x5e00),
0053 };
0054
0055 static u32 radeon_audio_rreg(struct radeon_device *rdev, u32 offset, u32 reg)
0056 {
0057 return RREG32(reg);
0058 }
0059
0060 static void radeon_audio_wreg(struct radeon_device *rdev, u32 offset,
0061 u32 reg, u32 v)
0062 {
0063 WREG32(reg, v);
0064 }
0065
0066 static struct radeon_audio_basic_funcs r600_funcs = {
0067 .endpoint_rreg = radeon_audio_rreg,
0068 .endpoint_wreg = radeon_audio_wreg,
0069 .enable = r600_audio_enable,
0070 };
0071
0072 static struct radeon_audio_basic_funcs dce32_funcs = {
0073 .endpoint_rreg = radeon_audio_rreg,
0074 .endpoint_wreg = radeon_audio_wreg,
0075 .enable = r600_audio_enable,
0076 };
0077
0078 static struct radeon_audio_basic_funcs dce4_funcs = {
0079 .endpoint_rreg = radeon_audio_rreg,
0080 .endpoint_wreg = radeon_audio_wreg,
0081 .enable = dce4_audio_enable,
0082 };
0083
0084 static struct radeon_audio_basic_funcs dce6_funcs = {
0085 .endpoint_rreg = dce6_endpoint_rreg,
0086 .endpoint_wreg = dce6_endpoint_wreg,
0087 .enable = dce6_audio_enable,
0088 };
0089
0090 static struct radeon_audio_funcs r600_hdmi_funcs = {
0091 .get_pin = r600_audio_get_pin,
0092 .set_dto = r600_hdmi_audio_set_dto,
0093 .update_acr = r600_hdmi_update_acr,
0094 .set_vbi_packet = r600_set_vbi_packet,
0095 .set_avi_packet = r600_set_avi_packet,
0096 .set_audio_packet = r600_set_audio_packet,
0097 .set_mute = r600_set_mute,
0098 .mode_set = radeon_audio_hdmi_mode_set,
0099 .dpms = r600_hdmi_enable,
0100 };
0101
0102 static struct radeon_audio_funcs dce32_hdmi_funcs = {
0103 .get_pin = r600_audio_get_pin,
0104 .write_sad_regs = dce3_2_afmt_write_sad_regs,
0105 .write_speaker_allocation = dce3_2_afmt_hdmi_write_speaker_allocation,
0106 .set_dto = dce3_2_audio_set_dto,
0107 .update_acr = dce3_2_hdmi_update_acr,
0108 .set_vbi_packet = r600_set_vbi_packet,
0109 .set_avi_packet = r600_set_avi_packet,
0110 .set_audio_packet = dce3_2_set_audio_packet,
0111 .set_mute = dce3_2_set_mute,
0112 .mode_set = radeon_audio_hdmi_mode_set,
0113 .dpms = r600_hdmi_enable,
0114 };
0115
0116 static struct radeon_audio_funcs dce32_dp_funcs = {
0117 .get_pin = r600_audio_get_pin,
0118 .write_sad_regs = dce3_2_afmt_write_sad_regs,
0119 .write_speaker_allocation = dce3_2_afmt_dp_write_speaker_allocation,
0120 .set_dto = dce3_2_audio_set_dto,
0121 .set_avi_packet = r600_set_avi_packet,
0122 .set_audio_packet = dce3_2_set_audio_packet,
0123 };
0124
0125 static struct radeon_audio_funcs dce4_hdmi_funcs = {
0126 .get_pin = r600_audio_get_pin,
0127 .write_sad_regs = evergreen_hdmi_write_sad_regs,
0128 .write_speaker_allocation = dce4_afmt_hdmi_write_speaker_allocation,
0129 .write_latency_fields = dce4_afmt_write_latency_fields,
0130 .set_dto = dce4_hdmi_audio_set_dto,
0131 .update_acr = evergreen_hdmi_update_acr,
0132 .set_vbi_packet = dce4_set_vbi_packet,
0133 .set_color_depth = dce4_hdmi_set_color_depth,
0134 .set_avi_packet = evergreen_set_avi_packet,
0135 .set_audio_packet = dce4_set_audio_packet,
0136 .set_mute = dce4_set_mute,
0137 .mode_set = radeon_audio_hdmi_mode_set,
0138 .dpms = evergreen_hdmi_enable,
0139 };
0140
0141 static struct radeon_audio_funcs dce4_dp_funcs = {
0142 .get_pin = r600_audio_get_pin,
0143 .write_sad_regs = evergreen_hdmi_write_sad_regs,
0144 .write_speaker_allocation = dce4_afmt_dp_write_speaker_allocation,
0145 .write_latency_fields = dce4_afmt_write_latency_fields,
0146 .set_dto = dce4_dp_audio_set_dto,
0147 .set_avi_packet = evergreen_set_avi_packet,
0148 .set_audio_packet = dce4_set_audio_packet,
0149 .mode_set = radeon_audio_dp_mode_set,
0150 .dpms = evergreen_dp_enable,
0151 };
0152
0153 static struct radeon_audio_funcs dce6_hdmi_funcs = {
0154 .select_pin = dce6_afmt_select_pin,
0155 .get_pin = dce6_audio_get_pin,
0156 .write_sad_regs = dce6_afmt_write_sad_regs,
0157 .write_speaker_allocation = dce6_afmt_hdmi_write_speaker_allocation,
0158 .write_latency_fields = dce6_afmt_write_latency_fields,
0159 .set_dto = dce6_hdmi_audio_set_dto,
0160 .update_acr = evergreen_hdmi_update_acr,
0161 .set_vbi_packet = dce4_set_vbi_packet,
0162 .set_color_depth = dce4_hdmi_set_color_depth,
0163 .set_avi_packet = evergreen_set_avi_packet,
0164 .set_audio_packet = dce4_set_audio_packet,
0165 .set_mute = dce4_set_mute,
0166 .mode_set = radeon_audio_hdmi_mode_set,
0167 .dpms = evergreen_hdmi_enable,
0168 };
0169
0170 static struct radeon_audio_funcs dce6_dp_funcs = {
0171 .select_pin = dce6_afmt_select_pin,
0172 .get_pin = dce6_audio_get_pin,
0173 .write_sad_regs = dce6_afmt_write_sad_regs,
0174 .write_speaker_allocation = dce6_afmt_dp_write_speaker_allocation,
0175 .write_latency_fields = dce6_afmt_write_latency_fields,
0176 .set_dto = dce6_dp_audio_set_dto,
0177 .set_avi_packet = evergreen_set_avi_packet,
0178 .set_audio_packet = dce4_set_audio_packet,
0179 .mode_set = radeon_audio_dp_mode_set,
0180 .dpms = evergreen_dp_enable,
0181 };
0182
0183 static void radeon_audio_enable(struct radeon_device *rdev,
0184 struct r600_audio_pin *pin, u8 enable_mask)
0185 {
0186 struct drm_encoder *encoder;
0187 struct radeon_encoder *radeon_encoder;
0188 struct radeon_encoder_atom_dig *dig;
0189 int pin_count = 0;
0190
0191 if (!pin)
0192 return;
0193
0194 if (rdev->mode_info.mode_config_initialized) {
0195 list_for_each_entry(encoder, &rdev->ddev->mode_config.encoder_list, head) {
0196 if (radeon_encoder_is_digital(encoder)) {
0197 radeon_encoder = to_radeon_encoder(encoder);
0198 dig = radeon_encoder->enc_priv;
0199 if (dig->pin == pin)
0200 pin_count++;
0201 }
0202 }
0203
0204 if ((pin_count > 1) && (enable_mask == 0))
0205 return;
0206 }
0207
0208 if (rdev->audio.funcs->enable)
0209 rdev->audio.funcs->enable(rdev, pin, enable_mask);
0210 }
0211
0212 static void radeon_audio_interface_init(struct radeon_device *rdev)
0213 {
0214 if (ASIC_IS_DCE6(rdev)) {
0215 rdev->audio.funcs = &dce6_funcs;
0216 rdev->audio.hdmi_funcs = &dce6_hdmi_funcs;
0217 rdev->audio.dp_funcs = &dce6_dp_funcs;
0218 } else if (ASIC_IS_DCE4(rdev)) {
0219 rdev->audio.funcs = &dce4_funcs;
0220 rdev->audio.hdmi_funcs = &dce4_hdmi_funcs;
0221 rdev->audio.dp_funcs = &dce4_dp_funcs;
0222 } else if (ASIC_IS_DCE32(rdev)) {
0223 rdev->audio.funcs = &dce32_funcs;
0224 rdev->audio.hdmi_funcs = &dce32_hdmi_funcs;
0225 rdev->audio.dp_funcs = &dce32_dp_funcs;
0226 } else {
0227 rdev->audio.funcs = &r600_funcs;
0228 rdev->audio.hdmi_funcs = &r600_hdmi_funcs;
0229 rdev->audio.dp_funcs = NULL;
0230 }
0231 }
0232
0233 static int radeon_audio_chipset_supported(struct radeon_device *rdev)
0234 {
0235 return ASIC_IS_DCE2(rdev) && !ASIC_IS_NODCE(rdev);
0236 }
0237
0238 int radeon_audio_init(struct radeon_device *rdev)
0239 {
0240 int i;
0241
0242 if (!radeon_audio || !radeon_audio_chipset_supported(rdev))
0243 return 0;
0244
0245 rdev->audio.enabled = true;
0246
0247 if (ASIC_IS_DCE83(rdev))
0248 rdev->audio.num_pins = 3;
0249 else if (ASIC_IS_DCE81(rdev))
0250 rdev->audio.num_pins = 7;
0251 else if (ASIC_IS_DCE8(rdev))
0252 rdev->audio.num_pins = 7;
0253 else if (ASIC_IS_DCE64(rdev))
0254 rdev->audio.num_pins = 2;
0255 else if (ASIC_IS_DCE61(rdev))
0256 rdev->audio.num_pins = 6;
0257 else if (ASIC_IS_DCE6(rdev))
0258 rdev->audio.num_pins = 6;
0259 else
0260 rdev->audio.num_pins = 1;
0261
0262 for (i = 0; i < rdev->audio.num_pins; i++) {
0263 rdev->audio.pin[i].channels = -1;
0264 rdev->audio.pin[i].rate = -1;
0265 rdev->audio.pin[i].bits_per_sample = -1;
0266 rdev->audio.pin[i].status_bits = 0;
0267 rdev->audio.pin[i].category_code = 0;
0268 rdev->audio.pin[i].connected = false;
0269 rdev->audio.pin[i].offset = pin_offsets[i];
0270 rdev->audio.pin[i].id = i;
0271 }
0272
0273 radeon_audio_interface_init(rdev);
0274
0275
0276 for (i = 0; i < rdev->audio.num_pins; i++)
0277 radeon_audio_enable(rdev, &rdev->audio.pin[i], 0);
0278
0279 return 0;
0280 }
0281
0282 u32 radeon_audio_endpoint_rreg(struct radeon_device *rdev, u32 offset, u32 reg)
0283 {
0284 if (rdev->audio.funcs->endpoint_rreg)
0285 return rdev->audio.funcs->endpoint_rreg(rdev, offset, reg);
0286
0287 return 0;
0288 }
0289
0290 void radeon_audio_endpoint_wreg(struct radeon_device *rdev, u32 offset,
0291 u32 reg, u32 v)
0292 {
0293 if (rdev->audio.funcs->endpoint_wreg)
0294 rdev->audio.funcs->endpoint_wreg(rdev, offset, reg, v);
0295 }
0296
0297 static void radeon_audio_write_sad_regs(struct drm_encoder *encoder)
0298 {
0299 struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
0300 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
0301 struct cea_sad *sads;
0302 int sad_count;
0303
0304 if (!connector)
0305 return;
0306
0307 sad_count = drm_edid_to_sad(radeon_connector_edid(connector), &sads);
0308 if (sad_count < 0)
0309 DRM_ERROR("Couldn't read SADs: %d\n", sad_count);
0310 if (sad_count <= 0)
0311 return;
0312 BUG_ON(!sads);
0313
0314 if (radeon_encoder->audio && radeon_encoder->audio->write_sad_regs)
0315 radeon_encoder->audio->write_sad_regs(encoder, sads, sad_count);
0316
0317 kfree(sads);
0318 }
0319
0320 static void radeon_audio_write_speaker_allocation(struct drm_encoder *encoder)
0321 {
0322 struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
0323 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
0324 u8 *sadb = NULL;
0325 int sad_count;
0326
0327 if (!connector)
0328 return;
0329
0330 sad_count = drm_edid_to_speaker_allocation(radeon_connector_edid(connector),
0331 &sadb);
0332 if (sad_count < 0) {
0333 DRM_DEBUG("Couldn't read Speaker Allocation Data Block: %d\n",
0334 sad_count);
0335 sad_count = 0;
0336 }
0337
0338 if (radeon_encoder->audio && radeon_encoder->audio->write_speaker_allocation)
0339 radeon_encoder->audio->write_speaker_allocation(encoder, sadb, sad_count);
0340
0341 kfree(sadb);
0342 }
0343
0344 static void radeon_audio_write_latency_fields(struct drm_encoder *encoder,
0345 struct drm_display_mode *mode)
0346 {
0347 struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
0348 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
0349
0350 if (!connector)
0351 return;
0352
0353 if (radeon_encoder->audio && radeon_encoder->audio->write_latency_fields)
0354 radeon_encoder->audio->write_latency_fields(encoder, connector, mode);
0355 }
0356
0357 struct r600_audio_pin* radeon_audio_get_pin(struct drm_encoder *encoder)
0358 {
0359 struct radeon_device *rdev = encoder->dev->dev_private;
0360 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
0361
0362 if (radeon_encoder->audio && radeon_encoder->audio->get_pin)
0363 return radeon_encoder->audio->get_pin(rdev);
0364
0365 return NULL;
0366 }
0367
0368 static void radeon_audio_select_pin(struct drm_encoder *encoder)
0369 {
0370 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
0371
0372 if (radeon_encoder->audio && radeon_encoder->audio->select_pin)
0373 radeon_encoder->audio->select_pin(encoder);
0374 }
0375
0376 void radeon_audio_detect(struct drm_connector *connector,
0377 struct drm_encoder *encoder,
0378 enum drm_connector_status status)
0379 {
0380 struct drm_device *dev = connector->dev;
0381 struct radeon_device *rdev = dev->dev_private;
0382 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
0383 struct radeon_encoder_atom_dig *dig;
0384
0385 if (!radeon_audio_chipset_supported(rdev))
0386 return;
0387
0388 if (!radeon_encoder_is_digital(encoder))
0389 return;
0390
0391 dig = radeon_encoder->enc_priv;
0392
0393 if (status == connector_status_connected) {
0394 if (connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort) {
0395 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
0396
0397 if (radeon_dp_getsinktype(radeon_connector) ==
0398 CONNECTOR_OBJECT_ID_DISPLAYPORT)
0399 radeon_encoder->audio = rdev->audio.dp_funcs;
0400 else
0401 radeon_encoder->audio = rdev->audio.hdmi_funcs;
0402 } else {
0403 radeon_encoder->audio = rdev->audio.hdmi_funcs;
0404 }
0405
0406 if (drm_detect_monitor_audio(radeon_connector_edid(connector))) {
0407 if (!dig->pin)
0408 dig->pin = radeon_audio_get_pin(encoder);
0409 radeon_audio_enable(rdev, dig->pin, 0xf);
0410 } else {
0411 radeon_audio_enable(rdev, dig->pin, 0);
0412 dig->pin = NULL;
0413 }
0414 } else {
0415 radeon_audio_enable(rdev, dig->pin, 0);
0416 dig->pin = NULL;
0417 }
0418 }
0419
0420 void radeon_audio_fini(struct radeon_device *rdev)
0421 {
0422 int i;
0423
0424 if (!rdev->audio.enabled)
0425 return;
0426
0427 for (i = 0; i < rdev->audio.num_pins; i++)
0428 radeon_audio_enable(rdev, &rdev->audio.pin[i], 0);
0429
0430 rdev->audio.enabled = false;
0431 }
0432
0433 static void radeon_audio_set_dto(struct drm_encoder *encoder, unsigned int clock)
0434 {
0435 struct radeon_device *rdev = encoder->dev->dev_private;
0436 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
0437 struct radeon_crtc *crtc = to_radeon_crtc(encoder->crtc);
0438
0439 if (radeon_encoder->audio && radeon_encoder->audio->set_dto)
0440 radeon_encoder->audio->set_dto(rdev, crtc, clock);
0441 }
0442
0443 static int radeon_audio_set_avi_packet(struct drm_encoder *encoder,
0444 struct drm_display_mode *mode)
0445 {
0446 struct radeon_device *rdev = encoder->dev->dev_private;
0447 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
0448 struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
0449 struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
0450 u8 buffer[HDMI_INFOFRAME_HEADER_SIZE + HDMI_AVI_INFOFRAME_SIZE];
0451 struct hdmi_avi_infoframe frame;
0452 int err;
0453
0454 if (!connector)
0455 return -EINVAL;
0456
0457 err = drm_hdmi_avi_infoframe_from_display_mode(&frame, connector, mode);
0458 if (err < 0) {
0459 DRM_ERROR("failed to setup AVI infoframe: %d\n", err);
0460 return err;
0461 }
0462
0463 if (radeon_encoder->output_csc != RADEON_OUTPUT_CSC_BYPASS) {
0464 drm_hdmi_avi_infoframe_quant_range(&frame, connector, mode,
0465 radeon_encoder->output_csc == RADEON_OUTPUT_CSC_TVRGB ?
0466 HDMI_QUANTIZATION_RANGE_LIMITED :
0467 HDMI_QUANTIZATION_RANGE_FULL);
0468 }
0469
0470 err = hdmi_avi_infoframe_pack(&frame, buffer, sizeof(buffer));
0471 if (err < 0) {
0472 DRM_ERROR("failed to pack AVI infoframe: %d\n", err);
0473 return err;
0474 }
0475
0476 if (dig && dig->afmt && radeon_encoder->audio &&
0477 radeon_encoder->audio->set_avi_packet)
0478 radeon_encoder->audio->set_avi_packet(rdev, dig->afmt->offset,
0479 buffer, sizeof(buffer));
0480
0481 return 0;
0482 }
0483
0484
0485
0486
0487 static void radeon_audio_calc_cts(unsigned int clock, int *CTS, int *N, int freq)
0488 {
0489 int n, cts;
0490 unsigned long div, mul;
0491
0492
0493 n = 128 * freq;
0494 cts = clock * 1000;
0495
0496
0497 div = gcd(n, cts);
0498
0499 n /= div;
0500 cts /= div;
0501
0502
0503
0504
0505
0506 mul = ((128*freq/1000) + (n-1))/n;
0507
0508 n *= mul;
0509 cts *= mul;
0510
0511
0512 if (n < (128*freq/1500))
0513 pr_warn("Calculated ACR N value is too small. You may experience audio problems.\n");
0514 if (n > (128*freq/300))
0515 pr_warn("Calculated ACR N value is too large. You may experience audio problems.\n");
0516
0517 *N = n;
0518 *CTS = cts;
0519
0520 DRM_DEBUG("Calculated ACR timing N=%d CTS=%d for frequency %d\n",
0521 *N, *CTS, freq);
0522 }
0523
0524 static const struct radeon_hdmi_acr* radeon_audio_acr(unsigned int clock)
0525 {
0526 static struct radeon_hdmi_acr res;
0527 u8 i;
0528
0529 static const struct radeon_hdmi_acr hdmi_predefined_acr[] = {
0530
0531
0532 { 25175, 4096, 25175, 28224, 125875, 6144, 25175 },
0533 { 25200, 4096, 25200, 6272, 28000, 6144, 25200 },
0534 { 27000, 4096, 27000, 6272, 30000, 6144, 27000 },
0535 { 27027, 4096, 27027, 6272, 30030, 6144, 27027 },
0536 { 54000, 4096, 54000, 6272, 60000, 6144, 54000 },
0537 { 54054, 4096, 54054, 6272, 60060, 6144, 54054 },
0538 { 74176, 4096, 74176, 5733, 75335, 6144, 74176 },
0539 { 74250, 4096, 74250, 6272, 82500, 6144, 74250 },
0540 { 148352, 4096, 148352, 5733, 150670, 6144, 148352 },
0541 { 148500, 4096, 148500, 6272, 165000, 6144, 148500 },
0542 };
0543
0544
0545 for (i = 0; i < ARRAY_SIZE(hdmi_predefined_acr); i++)
0546 if (hdmi_predefined_acr[i].clock == clock)
0547 return &hdmi_predefined_acr[i];
0548
0549
0550 radeon_audio_calc_cts(clock, &res.cts_32khz, &res.n_32khz, 32000);
0551 radeon_audio_calc_cts(clock, &res.cts_44_1khz, &res.n_44_1khz, 44100);
0552 radeon_audio_calc_cts(clock, &res.cts_48khz, &res.n_48khz, 48000);
0553
0554 return &res;
0555 }
0556
0557
0558
0559
0560 static void radeon_audio_update_acr(struct drm_encoder *encoder, unsigned int clock)
0561 {
0562 const struct radeon_hdmi_acr *acr = radeon_audio_acr(clock);
0563 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
0564 struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
0565
0566 if (!dig || !dig->afmt)
0567 return;
0568
0569 if (radeon_encoder->audio && radeon_encoder->audio->update_acr)
0570 radeon_encoder->audio->update_acr(encoder, dig->afmt->offset, acr);
0571 }
0572
0573 static void radeon_audio_set_vbi_packet(struct drm_encoder *encoder)
0574 {
0575 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
0576 struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
0577
0578 if (!dig || !dig->afmt)
0579 return;
0580
0581 if (radeon_encoder->audio && radeon_encoder->audio->set_vbi_packet)
0582 radeon_encoder->audio->set_vbi_packet(encoder, dig->afmt->offset);
0583 }
0584
0585 static void radeon_hdmi_set_color_depth(struct drm_encoder *encoder)
0586 {
0587 int bpc = 8;
0588 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
0589 struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
0590
0591 if (!dig || !dig->afmt)
0592 return;
0593
0594 if (encoder->crtc) {
0595 struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc);
0596 bpc = radeon_crtc->bpc;
0597 }
0598
0599 if (radeon_encoder->audio && radeon_encoder->audio->set_color_depth)
0600 radeon_encoder->audio->set_color_depth(encoder, dig->afmt->offset, bpc);
0601 }
0602
0603 static void radeon_audio_set_audio_packet(struct drm_encoder *encoder)
0604 {
0605 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
0606 struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
0607
0608 if (!dig || !dig->afmt)
0609 return;
0610
0611 if (radeon_encoder->audio && radeon_encoder->audio->set_audio_packet)
0612 radeon_encoder->audio->set_audio_packet(encoder, dig->afmt->offset);
0613 }
0614
0615 static void radeon_audio_set_mute(struct drm_encoder *encoder, bool mute)
0616 {
0617 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
0618 struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
0619
0620 if (!dig || !dig->afmt)
0621 return;
0622
0623 if (radeon_encoder->audio && radeon_encoder->audio->set_mute)
0624 radeon_encoder->audio->set_mute(encoder, dig->afmt->offset, mute);
0625 }
0626
0627
0628
0629
0630 static void radeon_audio_hdmi_mode_set(struct drm_encoder *encoder,
0631 struct drm_display_mode *mode)
0632 {
0633 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
0634 struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
0635 struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
0636
0637 if (!dig || !dig->afmt)
0638 return;
0639
0640 if (!connector)
0641 return;
0642
0643 if (drm_detect_monitor_audio(radeon_connector_edid(connector))) {
0644 radeon_audio_set_mute(encoder, true);
0645
0646 radeon_audio_write_speaker_allocation(encoder);
0647 radeon_audio_write_sad_regs(encoder);
0648 radeon_audio_write_latency_fields(encoder, mode);
0649 radeon_audio_set_dto(encoder, mode->clock);
0650 radeon_audio_set_vbi_packet(encoder);
0651 radeon_hdmi_set_color_depth(encoder);
0652 radeon_audio_update_acr(encoder, mode->clock);
0653 radeon_audio_set_audio_packet(encoder);
0654 radeon_audio_select_pin(encoder);
0655
0656 if (radeon_audio_set_avi_packet(encoder, mode) < 0)
0657 return;
0658
0659 radeon_audio_set_mute(encoder, false);
0660 } else {
0661 radeon_hdmi_set_color_depth(encoder);
0662
0663 if (radeon_audio_set_avi_packet(encoder, mode) < 0)
0664 return;
0665 }
0666 }
0667
0668 static void radeon_audio_dp_mode_set(struct drm_encoder *encoder,
0669 struct drm_display_mode *mode)
0670 {
0671 struct drm_device *dev = encoder->dev;
0672 struct radeon_device *rdev = dev->dev_private;
0673 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
0674 struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
0675 struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
0676
0677 if (!dig || !dig->afmt)
0678 return;
0679
0680 if (!connector)
0681 return;
0682
0683 if (drm_detect_monitor_audio(radeon_connector_edid(connector))) {
0684 radeon_audio_write_speaker_allocation(encoder);
0685 radeon_audio_write_sad_regs(encoder);
0686 radeon_audio_write_latency_fields(encoder, mode);
0687 radeon_audio_set_dto(encoder, rdev->clock.vco_freq * 10);
0688 radeon_audio_set_audio_packet(encoder);
0689 radeon_audio_select_pin(encoder);
0690
0691 if (radeon_audio_set_avi_packet(encoder, mode) < 0)
0692 return;
0693 }
0694 }
0695
0696 void radeon_audio_mode_set(struct drm_encoder *encoder,
0697 struct drm_display_mode *mode)
0698 {
0699 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
0700
0701 if (radeon_encoder->audio && radeon_encoder->audio->mode_set)
0702 radeon_encoder->audio->mode_set(encoder, mode);
0703 }
0704
0705 void radeon_audio_dpms(struct drm_encoder *encoder, int mode)
0706 {
0707 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
0708
0709 if (radeon_encoder->audio && radeon_encoder->audio->dpms)
0710 radeon_encoder->audio->dpms(encoder, mode == DRM_MODE_DPMS_ON);
0711 }
0712
0713 unsigned int radeon_audio_decode_dfs_div(unsigned int div)
0714 {
0715 if (div >= 8 && div < 64)
0716 return (div - 8) * 25 + 200;
0717 else if (div >= 64 && div < 96)
0718 return (div - 64) * 50 + 1600;
0719 else if (div >= 96 && div < 128)
0720 return (div - 96) * 100 + 3200;
0721 else
0722 return 0;
0723 }