Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[ALSA] cmipci: add 96 kHz support

Add support for 88.2 kHz and 96 kHz analog and digital playback on
CMI8768/CMI8770 chips.

Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
Signed-off-by: Jaroslav Kysela <perex@suse.cz>

authored by

Clemens Ladisch and committed by
Jaroslav Kysela
8992e18d f19a82a1

+35 -3
+35 -3
sound/pci/cmipci.c
··· 135 135 #define CM_ADCDACLEN_280 0x00003000 136 136 137 137 #define CM_CH1_SRATE_176K 0x00000800 138 + #define CM_CH1_SRATE_96K 0x00000800 /* model 055? */ 138 139 #define CM_CH1_SRATE_88K 0x00000400 139 140 #define CM_CH0_SRATE_176K 0x00000200 141 + #define CM_CH0_SRATE_96K 0x00000200 /* model 055? */ 140 142 #define CM_CH0_SRATE_88K 0x00000100 141 143 142 144 #define CM_SPDIF_INVERSE2 0x00000080 /* model 055? */ 145 + #define CM_DBLSPDS 0x00000040 143 146 144 147 #define CM_CH1FMT_MASK 0x0000000C 145 148 #define CM_CH1FMT_SHIFT 2 ··· 815 812 val &= ~CM_CH0FMT_MASK; 816 813 val |= rec->fmt << CM_CH0FMT_SHIFT; 817 814 } 815 + if (cm->chip_version == 68) { 816 + if (runtime->rate == 88200) 817 + val |= CM_CH0_SRATE_88K << (rec->ch * 2); 818 + else 819 + val &= ~(CM_CH0_SRATE_88K << (rec->ch * 2)); 820 + if (runtime->rate == 96000) 821 + val |= CM_CH0_SRATE_96K << (rec->ch * 2); 822 + else 823 + val &= ~(CM_CH0_SRATE_96K << (rec->ch * 2)); 824 + } 818 825 snd_cmipci_write(cm, CM_REG_CHFORMAT, val); 819 826 //snd_printd("cmipci: chformat = %08x\n", val); 820 827 ··· 1211 1198 snd_cmipci_set_bit(cm, CM_REG_FUNCTRL1, CM_PLAYBACK_SPDF); 1212 1199 setup_ac3(cm, subs, do_ac3, rate); 1213 1200 1214 - if (rate == 48000) 1201 + if (rate == 48000 || rate == 96000) 1215 1202 snd_cmipci_set_bit(cm, CM_REG_MISC_CTRL, CM_SPDIF48K | CM_SPDF_AC97); 1216 1203 else 1217 1204 snd_cmipci_clear_bit(cm, CM_REG_MISC_CTRL, CM_SPDIF48K | CM_SPDF_AC97); 1218 - 1205 + if (rate > 48000) 1206 + snd_cmipci_set_bit(cm, CM_REG_CHFORMAT, CM_DBLSPDS); 1207 + else 1208 + snd_cmipci_clear_bit(cm, CM_REG_CHFORMAT, CM_DBLSPDS); 1219 1209 } else { 1220 1210 /* they are controlled via "IEC958 Output Switch" */ 1221 1211 /* snd_cmipci_clear_bit(cm, CM_REG_LEGACY_CTRL, CM_ENSPDOUT); */ 1222 1212 /* snd_cmipci_clear_bit(cm, CM_REG_FUNCTRL1, CM_SPDO2DAC); */ 1213 + snd_cmipci_clear_bit(cm, CM_REG_CHFORMAT, CM_DBLSPDS); 1223 1214 snd_cmipci_clear_bit(cm, CM_REG_FUNCTRL1, CM_PLAYBACK_SPDF); 1224 1215 setup_ac3(cm, subs, 0, 0); 1225 1216 } ··· 1243 1226 int rate = substream->runtime->rate; 1244 1227 int err, do_spdif, do_ac3 = 0; 1245 1228 1246 - do_spdif = ((rate == 44100 || rate == 48000) && 1229 + do_spdif = (rate >= 44100 && 1247 1230 substream->runtime->format == SNDRV_PCM_FORMAT_S16_LE && 1248 1231 substream->runtime->channels == 2); 1249 1232 if (do_spdif && cm->can_ac3_hw) ··· 1531 1514 if ((err = open_device_check(cm, CM_OPEN_PLAYBACK, substream)) < 0) 1532 1515 return err; 1533 1516 runtime->hw = snd_cmipci_playback; 1517 + if (cm->chip_version == 68) { 1518 + runtime->hw.rates |= SNDRV_PCM_RATE_88200 | 1519 + SNDRV_PCM_RATE_96000; 1520 + runtime->hw.rate_max = 96000; 1521 + } 1534 1522 snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_BUFFER_SIZE, 0, 0x10000); 1535 1523 cm->dig_pcm_status = cm->dig_status; 1536 1524 return 0; ··· 1578 1556 else if (cm->max_channels == 8) 1579 1557 snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS, &hw_constraints_channels_8); 1580 1558 } 1559 + if (cm->chip_version == 68) { 1560 + runtime->hw.rates |= SNDRV_PCM_RATE_88200 | 1561 + SNDRV_PCM_RATE_96000; 1562 + runtime->hw.rate_max = 96000; 1563 + } 1581 1564 snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_BUFFER_SIZE, 0, 0x10000); 1582 1565 } 1583 1566 mutex_unlock(&cm->open_mutex); ··· 1601 1574 runtime->hw = snd_cmipci_playback_spdif; 1602 1575 if (cm->chip_version >= 37) 1603 1576 runtime->hw.formats |= SNDRV_PCM_FMTBIT_S32_LE; 1577 + if (cm->chip_version == 68) { 1578 + runtime->hw.rates |= SNDRV_PCM_RATE_88200 | 1579 + SNDRV_PCM_RATE_96000; 1580 + runtime->hw.rate_max = 96000; 1581 + } 1604 1582 } else { 1605 1583 runtime->hw = snd_cmipci_playback_iec958_subframe; 1606 1584 }