Rev 3192 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3192 | Rev 3764 | ||
---|---|---|---|
Line 55... | Line 55... | ||
55 | /* |
55 | /* |
56 | * check if the chipset is supported |
56 | * check if the chipset is supported |
57 | */ |
57 | */ |
58 | static int r600_audio_chipset_supported(struct radeon_device *rdev) |
58 | static int r600_audio_chipset_supported(struct radeon_device *rdev) |
59 | { |
59 | { |
60 | return (rdev->family >= CHIP_R600 && !ASIC_IS_DCE6(rdev)) |
60 | return ASIC_IS_DCE2(rdev) && !ASIC_IS_DCE6(rdev); |
61 | || rdev->family == CHIP_RS600 |
- | |
62 | || rdev->family == CHIP_RS690 |
- | |
63 | || rdev->family == CHIP_RS740; |
- | |
64 | } |
61 | } |
Line 65... | Line 62... | ||
65 | 62 | ||
66 | struct r600_audio r600_audio_status(struct radeon_device *rdev) |
63 | struct r600_audio r600_audio_status(struct radeon_device *rdev) |
67 | { |
64 | { |
Line 182... | Line 179... | ||
182 | 179 | ||
183 | return 0; |
180 | return 0; |
Line 184... | Line 181... | ||
184 | } |
181 | } |
185 | - | ||
186 | /* |
- | |
187 | * atach the audio codec to the clock source of the encoder |
- | |
188 | */ |
- | |
189 | void r600_audio_set_clock(struct drm_encoder *encoder, int clock) |
- | |
190 | { |
- | |
191 | struct drm_device *dev = encoder->dev; |
- | |
192 | struct radeon_device *rdev = dev->dev_private; |
- | |
193 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
- | |
194 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; |
- | |
195 | struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc); |
- | |
196 | int base_rate = 48000; |
- | |
197 | - | ||
198 | switch (radeon_encoder->encoder_id) { |
- | |
199 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1: |
- | |
200 | case ENCODER_OBJECT_ID_INTERNAL_LVTM1: |
- | |
201 | WREG32_P(R600_AUDIO_TIMING, 0, ~0x301); |
- | |
202 | break; |
- | |
203 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY: |
- | |
204 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: |
- | |
205 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: |
- | |
206 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: |
- | |
207 | WREG32_P(R600_AUDIO_TIMING, 0x100, ~0x301); |
- | |
208 | break; |
- | |
209 | default: |
- | |
210 | dev_err(rdev->dev, "Unsupported encoder type 0x%02X\n", |
- | |
211 | radeon_encoder->encoder_id); |
- | |
212 | return; |
- | |
213 | } |
- | |
214 | - | ||
215 | if (ASIC_IS_DCE4(rdev)) { |
- | |
216 | /* TODO: other PLLs? */ |
- | |
217 | WREG32(EVERGREEN_AUDIO_PLL1_MUL, base_rate * 10); |
- | |
218 | WREG32(EVERGREEN_AUDIO_PLL1_DIV, clock * 10); |
- | |
219 | WREG32(EVERGREEN_AUDIO_PLL1_UNK, 0x00000071); |
- | |
220 | - | ||
221 | /* Select DTO source */ |
- | |
222 | WREG32(0x5ac, radeon_crtc->crtc_id); |
- | |
223 | } else { |
- | |
224 | switch (dig->dig_encoder) { |
- | |
225 | case 0: |
- | |
226 | WREG32(R600_AUDIO_PLL1_MUL, base_rate * 50); |
- | |
227 | WREG32(R600_AUDIO_PLL1_DIV, clock * 100); |
- | |
228 | WREG32(R600_AUDIO_CLK_SRCSEL, 0); |
- | |
229 | break; |
- | |
230 | - | ||
231 | case 1: |
- | |
232 | WREG32(R600_AUDIO_PLL2_MUL, base_rate * 50); |
- | |
233 | WREG32(R600_AUDIO_PLL2_DIV, clock * 100); |
- | |
234 | WREG32(R600_AUDIO_CLK_SRCSEL, 1); |
- | |
235 | break; |
- | |
236 | default: |
- | |
237 | dev_err(rdev->dev, |
- | |
238 | "Unsupported DIG on encoder 0x%02X\n", |
- | |
239 | radeon_encoder->encoder_id); |
- | |
240 | return; |
- | |
241 | } |
- | |
242 | } |
- | |
243 | } |
- | |
244 | 182 | ||
245 | /* |
183 | /* |
246 | * release the audio timer |
184 | * release the audio timer |
247 | * TODO: How to do this correctly on SMP systems? |
185 | * TODO: How to do this correctly on SMP systems? |
248 | */ |
186 | */ |