Lines Matching refs:hdspm
966 struct hdspm *hdspm; member
992 struct hdspm { struct
1096 struct hdspm *hdspm); argument
1098 struct hdspm *hdspm);
1100 static inline void snd_hdspm_initialize_midi_flush(struct hdspm *hdspm);
1101 static inline int hdspm_get_pll_freq(struct hdspm *hdspm);
1102 static int hdspm_update_simple_mixer_controls(struct hdspm *hdspm);
1103 static int hdspm_autosync_ref(struct hdspm *hdspm);
1104 static int hdspm_set_toggle_setting(struct hdspm *hdspm, u32 regmask, int out);
1105 static int snd_hdspm_set_defaults(struct hdspm *hdspm);
1106 static int hdspm_system_clock_mode(struct hdspm *hdspm);
1107 static void hdspm_set_sgbuf(struct hdspm *hdspm,
1111 static int hdspm_aes_sync_check(struct hdspm *hdspm, int idx);
1112 static int hdspm_wc_sync_check(struct hdspm *hdspm);
1113 static int hdspm_tco_sync_check(struct hdspm *hdspm);
1114 static int hdspm_sync_in_sync_check(struct hdspm *hdspm);
1116 static int hdspm_get_aes_sample_rate(struct hdspm *hdspm, int index);
1117 static int hdspm_get_tco_sample_rate(struct hdspm *hdspm);
1118 static int hdspm_get_wc_sample_rate(struct hdspm *hdspm);
1132 static bool hdspm_is_raydat_or_aio(struct hdspm *hdspm) in hdspm_is_raydat_or_aio() argument
1134 return ((AIO == hdspm->io_type) || (RayDAT == hdspm->io_type)); in hdspm_is_raydat_or_aio()
1141 static inline void hdspm_write(struct hdspm * hdspm, unsigned int reg, in hdspm_write() argument
1144 writel(val, hdspm->iobase + reg); in hdspm_write()
1147 static inline unsigned int hdspm_read(struct hdspm * hdspm, unsigned int reg) in hdspm_read() argument
1149 return readl(hdspm->iobase + reg); in hdspm_read()
1156 static inline int hdspm_read_in_gain(struct hdspm * hdspm, unsigned int chan, in hdspm_read_in_gain() argument
1162 return hdspm->mixer->ch[chan].in[in]; in hdspm_read_in_gain()
1165 static inline int hdspm_read_pb_gain(struct hdspm * hdspm, unsigned int chan, in hdspm_read_pb_gain() argument
1170 return hdspm->mixer->ch[chan].pb[pb]; in hdspm_read_pb_gain()
1173 static int hdspm_write_in_gain(struct hdspm *hdspm, unsigned int chan, in hdspm_write_in_gain() argument
1179 hdspm_write(hdspm, in hdspm_write_in_gain()
1182 (hdspm->mixer->ch[chan].in[in] = data & 0xFFFF)); in hdspm_write_in_gain()
1186 static int hdspm_write_pb_gain(struct hdspm *hdspm, unsigned int chan, in hdspm_write_pb_gain() argument
1192 hdspm_write(hdspm, in hdspm_write_pb_gain()
1195 (hdspm->mixer->ch[chan].pb[pb] = data & 0xFFFF)); in hdspm_write_pb_gain()
1201 static inline void snd_hdspm_enable_in(struct hdspm * hdspm, int i, int v) in snd_hdspm_enable_in() argument
1203 hdspm_write(hdspm, HDSPM_inputEnableBase + (4 * i), v); in snd_hdspm_enable_in()
1206 static inline void snd_hdspm_enable_out(struct hdspm * hdspm, int i, int v) in snd_hdspm_enable_out() argument
1208 hdspm_write(hdspm, HDSPM_outputEnableBase + (4 * i), v); in snd_hdspm_enable_out()
1212 static int snd_hdspm_use_is_exclusive(struct hdspm *hdspm) in snd_hdspm_use_is_exclusive() argument
1217 spin_lock_irqsave(&hdspm->lock, flags); in snd_hdspm_use_is_exclusive()
1218 if ((hdspm->playback_pid != hdspm->capture_pid) && in snd_hdspm_use_is_exclusive()
1219 (hdspm->playback_pid >= 0) && (hdspm->capture_pid >= 0)) { in snd_hdspm_use_is_exclusive()
1222 spin_unlock_irqrestore(&hdspm->lock, flags); in snd_hdspm_use_is_exclusive()
1245 static int hdspm_rate_multiplier(struct hdspm *hdspm, int rate) in hdspm_rate_multiplier() argument
1248 if (hdspm->control_register & HDSPM_QuadSpeed) in hdspm_rate_multiplier()
1250 else if (hdspm->control_register & in hdspm_rate_multiplier()
1258 static int hdspm_external_sample_rate(struct hdspm *hdspm) in hdspm_external_sample_rate() argument
1263 switch (hdspm->io_type) { in hdspm_external_sample_rate()
1265 status2 = hdspm_read(hdspm, HDSPM_statusRegister2); in hdspm_external_sample_rate()
1266 status = hdspm_read(hdspm, HDSPM_statusRegister); in hdspm_external_sample_rate()
1268 syncref = hdspm_autosync_ref(hdspm); in hdspm_external_sample_rate()
1272 if (hdspm_wc_sync_check(hdspm)) in hdspm_external_sample_rate()
1273 return HDSPM_bit2freq(hdspm_get_wc_sample_rate(hdspm)); in hdspm_external_sample_rate()
1285 if (hdspm_aes_sync_check(hdspm, syncref - HDSPM_AES32_AUTOSYNC_FROM_AES1)) in hdspm_external_sample_rate()
1286 return HDSPM_bit2freq(hdspm_get_aes_sample_rate(hdspm, in hdspm_external_sample_rate()
1293 if (hdspm_tco_sync_check(hdspm)) in hdspm_external_sample_rate()
1294 return HDSPM_bit2freq(hdspm_get_tco_sample_rate(hdspm)); in hdspm_external_sample_rate()
1302 status = hdspm_read(hdspm, HDSPM_statusRegister); in hdspm_external_sample_rate()
1336 status2 = hdspm_read(hdspm, HDSPM_statusRegister2); in hdspm_external_sample_rate()
1337 status = hdspm_read(hdspm, HDSPM_statusRegister); in hdspm_external_sample_rate()
1386 return hdspm_rate_multiplier(hdspm, rate); in hdspm_external_sample_rate()
1432 syncref = hdspm_autosync_ref(hdspm); in hdspm_external_sample_rate()
1436 hdspm_tco_sync_check(hdspm)); in hdspm_external_sample_rate()
1440 hdspm_sync_in_sync_check(hdspm)); in hdspm_external_sample_rate()
1445 hdspm_get_pll_freq(hdspm)); in hdspm_external_sample_rate()
1449 rate = hdspm_rate_multiplier(hdspm, rate); in hdspm_external_sample_rate()
1458 static int hdspm_get_latency(struct hdspm *hdspm) in hdspm_get_latency() argument
1462 n = hdspm_decode_latency(hdspm->control_register); in hdspm_get_latency()
1471 if ((7 == n) && (RayDAT == hdspm->io_type || AIO == hdspm->io_type)) in hdspm_get_latency()
1478 static inline void hdspm_compute_period_size(struct hdspm *hdspm) in hdspm_compute_period_size() argument
1480 hdspm->period_bytes = 4 * hdspm_get_latency(hdspm); in hdspm_compute_period_size()
1484 static snd_pcm_uframes_t hdspm_hw_pointer(struct hdspm *hdspm) in hdspm_hw_pointer() argument
1488 position = hdspm_read(hdspm, HDSPM_statusRegister); in hdspm_hw_pointer()
1490 switch (hdspm->io_type) { in hdspm_hw_pointer()
1498 (hdspm->period_bytes / 4) : 0; in hdspm_hw_pointer()
1505 static inline void hdspm_start_audio(struct hdspm * s) in hdspm_start_audio()
1511 static inline void hdspm_stop_audio(struct hdspm * s) in hdspm_stop_audio()
1518 static void hdspm_silence_playback(struct hdspm *hdspm) in hdspm_silence_playback() argument
1521 int n = hdspm->period_bytes; in hdspm_silence_playback()
1522 void *buf = hdspm->playback_buffer; in hdspm_silence_playback()
1533 static int hdspm_set_interrupt_interval(struct hdspm *s, unsigned int frames) in hdspm_set_interrupt_interval()
1572 static u64 hdspm_calc_dds_value(struct hdspm *hdspm, u64 period) in hdspm_calc_dds_value() argument
1579 switch (hdspm->io_type) { in hdspm_calc_dds_value()
1600 static void hdspm_set_dds_value(struct hdspm *hdspm, int rate) in hdspm_set_dds_value() argument
1612 switch (hdspm->io_type) { in hdspm_set_dds_value()
1632 hdspm_write(hdspm, HDSPM_freqReg, (u32)n); in hdspm_set_dds_value()
1636 static int hdspm_set_rate(struct hdspm * hdspm, int rate, int called_internally) in hdspm_set_rate() argument
1647 if (!(hdspm->control_register & HDSPM_ClockModeMaster)) { in hdspm_set_rate()
1656 dev_warn(hdspm->card->dev, in hdspm_set_rate()
1663 hdspm_external_sample_rate(hdspm); in hdspm_set_rate()
1665 if (hdspm_autosync_ref(hdspm) == in hdspm_set_rate()
1668 dev_warn(hdspm->card->dev, in hdspm_set_rate()
1674 dev_warn(hdspm->card->dev, in hdspm_set_rate()
1681 current_rate = hdspm->system_sample_rate; in hdspm_set_rate()
1740 && (hdspm->capture_pid >= 0 || hdspm->playback_pid >= 0)) { in hdspm_set_rate()
1741 dev_err(hdspm->card->dev, in hdspm_set_rate()
1745 hdspm->capture_pid, hdspm->playback_pid); in hdspm_set_rate()
1749 hdspm->control_register &= ~HDSPM_FrequencyMask; in hdspm_set_rate()
1750 hdspm->control_register |= rate_bits; in hdspm_set_rate()
1751 hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register); in hdspm_set_rate()
1755 hdspm_set_dds_value(hdspm, rate); in hdspm_set_rate()
1757 if (AES32 == hdspm->io_type && rate != current_rate) in hdspm_set_rate()
1758 hdspm_write(hdspm, HDSPM_eeprom_wr, 0); in hdspm_set_rate()
1760 hdspm->system_sample_rate = rate; in hdspm_set_rate()
1763 hdspm->channel_map_in = hdspm->channel_map_in_ss; in hdspm_set_rate()
1764 hdspm->channel_map_out = hdspm->channel_map_out_ss; in hdspm_set_rate()
1765 hdspm->max_channels_in = hdspm->ss_in_channels; in hdspm_set_rate()
1766 hdspm->max_channels_out = hdspm->ss_out_channels; in hdspm_set_rate()
1767 hdspm->port_names_in = hdspm->port_names_in_ss; in hdspm_set_rate()
1768 hdspm->port_names_out = hdspm->port_names_out_ss; in hdspm_set_rate()
1770 hdspm->channel_map_in = hdspm->channel_map_in_ds; in hdspm_set_rate()
1771 hdspm->channel_map_out = hdspm->channel_map_out_ds; in hdspm_set_rate()
1772 hdspm->max_channels_in = hdspm->ds_in_channels; in hdspm_set_rate()
1773 hdspm->max_channels_out = hdspm->ds_out_channels; in hdspm_set_rate()
1774 hdspm->port_names_in = hdspm->port_names_in_ds; in hdspm_set_rate()
1775 hdspm->port_names_out = hdspm->port_names_out_ds; in hdspm_set_rate()
1777 hdspm->channel_map_in = hdspm->channel_map_in_qs; in hdspm_set_rate()
1778 hdspm->channel_map_out = hdspm->channel_map_out_qs; in hdspm_set_rate()
1779 hdspm->max_channels_in = hdspm->qs_in_channels; in hdspm_set_rate()
1780 hdspm->max_channels_out = hdspm->qs_out_channels; in hdspm_set_rate()
1781 hdspm->port_names_in = hdspm->port_names_in_qs; in hdspm_set_rate()
1782 hdspm->port_names_out = hdspm->port_names_out_qs; in hdspm_set_rate()
1792 static void all_in_all_mixer(struct hdspm * hdspm, int sgain) in all_in_all_mixer() argument
1806 hdspm_write_in_gain(hdspm, i, j, gain); in all_in_all_mixer()
1807 hdspm_write_pb_gain(hdspm, i, j, gain); in all_in_all_mixer()
1815 static inline unsigned char snd_hdspm_midi_read_byte (struct hdspm *hdspm, in snd_hdspm_midi_read_byte() argument
1819 return hdspm_read(hdspm, hdspm->midi[id].dataIn); in snd_hdspm_midi_read_byte()
1822 static inline void snd_hdspm_midi_write_byte (struct hdspm *hdspm, int id, in snd_hdspm_midi_write_byte() argument
1826 return hdspm_write(hdspm, hdspm->midi[id].dataOut, val); in snd_hdspm_midi_write_byte()
1829 static inline int snd_hdspm_midi_input_available (struct hdspm *hdspm, int id) in snd_hdspm_midi_input_available() argument
1831 return hdspm_read(hdspm, hdspm->midi[id].statusIn) & 0xFF; in snd_hdspm_midi_input_available()
1834 static inline int snd_hdspm_midi_output_possible (struct hdspm *hdspm, int id) in snd_hdspm_midi_output_possible() argument
1838 fifo_bytes_used = hdspm_read(hdspm, hdspm->midi[id].statusOut) & 0xFF; in snd_hdspm_midi_output_possible()
1846 static void snd_hdspm_flush_midi_input(struct hdspm *hdspm, int id) in snd_hdspm_flush_midi_input() argument
1848 while (snd_hdspm_midi_input_available (hdspm, id)) in snd_hdspm_flush_midi_input()
1849 snd_hdspm_midi_read_byte (hdspm, id); in snd_hdspm_flush_midi_input()
1865 n_pending = snd_hdspm_midi_output_possible (hmidi->hdspm, in snd_hdspm_midi_output_write()
1875 snd_hdspm_midi_write_byte (hmidi->hdspm, in snd_hdspm_midi_output_write()
1895 n_pending = snd_hdspm_midi_input_available (hmidi->hdspm, hmidi->id); in snd_hdspm_midi_input_read()
1901 buf[i] = snd_hdspm_midi_read_byte (hmidi->hdspm, in snd_hdspm_midi_input_read()
1909 snd_hdspm_midi_read_byte (hmidi->hdspm, in snd_hdspm_midi_input_read()
1916 spin_lock_irqsave(&hmidi->hdspm->lock, flags); in snd_hdspm_midi_input_read()
1917 hmidi->hdspm->control_register |= hmidi->ie; in snd_hdspm_midi_input_read()
1918 hdspm_write(hmidi->hdspm, HDSPM_controlRegister, in snd_hdspm_midi_input_read()
1919 hmidi->hdspm->control_register); in snd_hdspm_midi_input_read()
1920 spin_unlock_irqrestore(&hmidi->hdspm->lock, flags); in snd_hdspm_midi_input_read()
1928 struct hdspm *hdspm; in snd_hdspm_midi_input_trigger() local
1933 hdspm = hmidi->hdspm; in snd_hdspm_midi_input_trigger()
1935 spin_lock_irqsave (&hdspm->lock, flags); in snd_hdspm_midi_input_trigger()
1937 if (!(hdspm->control_register & hmidi->ie)) { in snd_hdspm_midi_input_trigger()
1938 snd_hdspm_flush_midi_input (hdspm, hmidi->id); in snd_hdspm_midi_input_trigger()
1939 hdspm->control_register |= hmidi->ie; in snd_hdspm_midi_input_trigger()
1942 hdspm->control_register &= ~hmidi->ie; in snd_hdspm_midi_input_trigger()
1945 hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register); in snd_hdspm_midi_input_trigger()
1946 spin_unlock_irqrestore (&hdspm->lock, flags); in snd_hdspm_midi_input_trigger()
1999 snd_hdspm_flush_midi_input (hmidi->hdspm, hmidi->id); in snd_hdspm_midi_input_open()
2061 struct hdspm *hdspm, int id) in snd_hdspm_create_midi() argument
2066 hdspm->midi[id].id = id; in snd_hdspm_create_midi()
2067 hdspm->midi[id].hdspm = hdspm; in snd_hdspm_create_midi()
2068 spin_lock_init (&hdspm->midi[id].lock); in snd_hdspm_create_midi()
2071 if (MADIface == hdspm->io_type) { in snd_hdspm_create_midi()
2073 hdspm->midi[0].dataIn = HDSPM_midiDataIn2; in snd_hdspm_create_midi()
2074 hdspm->midi[0].statusIn = HDSPM_midiStatusIn2; in snd_hdspm_create_midi()
2075 hdspm->midi[0].dataOut = HDSPM_midiDataOut2; in snd_hdspm_create_midi()
2076 hdspm->midi[0].statusOut = HDSPM_midiStatusOut2; in snd_hdspm_create_midi()
2077 hdspm->midi[0].ie = HDSPM_Midi2InterruptEnable; in snd_hdspm_create_midi()
2078 hdspm->midi[0].irq = HDSPM_midi2IRQPending; in snd_hdspm_create_midi()
2080 hdspm->midi[0].dataIn = HDSPM_midiDataIn0; in snd_hdspm_create_midi()
2081 hdspm->midi[0].statusIn = HDSPM_midiStatusIn0; in snd_hdspm_create_midi()
2082 hdspm->midi[0].dataOut = HDSPM_midiDataOut0; in snd_hdspm_create_midi()
2083 hdspm->midi[0].statusOut = HDSPM_midiStatusOut0; in snd_hdspm_create_midi()
2084 hdspm->midi[0].ie = HDSPM_Midi0InterruptEnable; in snd_hdspm_create_midi()
2085 hdspm->midi[0].irq = HDSPM_midi0IRQPending; in snd_hdspm_create_midi()
2088 hdspm->midi[1].dataIn = HDSPM_midiDataIn1; in snd_hdspm_create_midi()
2089 hdspm->midi[1].statusIn = HDSPM_midiStatusIn1; in snd_hdspm_create_midi()
2090 hdspm->midi[1].dataOut = HDSPM_midiDataOut1; in snd_hdspm_create_midi()
2091 hdspm->midi[1].statusOut = HDSPM_midiStatusOut1; in snd_hdspm_create_midi()
2092 hdspm->midi[1].ie = HDSPM_Midi1InterruptEnable; in snd_hdspm_create_midi()
2093 hdspm->midi[1].irq = HDSPM_midi1IRQPending; in snd_hdspm_create_midi()
2094 } else if ((2 == id) && (MADI == hdspm->io_type)) { in snd_hdspm_create_midi()
2096 hdspm->midi[2].dataIn = HDSPM_midiDataIn2; in snd_hdspm_create_midi()
2097 hdspm->midi[2].statusIn = HDSPM_midiStatusIn2; in snd_hdspm_create_midi()
2098 hdspm->midi[2].dataOut = HDSPM_midiDataOut2; in snd_hdspm_create_midi()
2099 hdspm->midi[2].statusOut = HDSPM_midiStatusOut2; in snd_hdspm_create_midi()
2100 hdspm->midi[2].ie = HDSPM_Midi2InterruptEnable; in snd_hdspm_create_midi()
2101 hdspm->midi[2].irq = HDSPM_midi2IRQPending; in snd_hdspm_create_midi()
2104 hdspm->midi[2].dataIn = HDSPM_midiDataIn2; in snd_hdspm_create_midi()
2105 hdspm->midi[2].statusIn = HDSPM_midiStatusIn2; in snd_hdspm_create_midi()
2106 hdspm->midi[2].dataOut = -1; in snd_hdspm_create_midi()
2107 hdspm->midi[2].statusOut = -1; in snd_hdspm_create_midi()
2108 hdspm->midi[2].ie = HDSPM_Midi2InterruptEnable; in snd_hdspm_create_midi()
2109 hdspm->midi[2].irq = HDSPM_midi2IRQPendingAES; in snd_hdspm_create_midi()
2112 hdspm->midi[3].dataIn = HDSPM_midiDataIn3; in snd_hdspm_create_midi()
2113 hdspm->midi[3].statusIn = HDSPM_midiStatusIn3; in snd_hdspm_create_midi()
2114 hdspm->midi[3].dataOut = -1; in snd_hdspm_create_midi()
2115 hdspm->midi[3].statusOut = -1; in snd_hdspm_create_midi()
2116 hdspm->midi[3].ie = HDSPM_Midi3InterruptEnable; in snd_hdspm_create_midi()
2117 hdspm->midi[3].irq = HDSPM_midi3IRQPending; in snd_hdspm_create_midi()
2120 if ((id < 2) || ((2 == id) && ((MADI == hdspm->io_type) || in snd_hdspm_create_midi()
2121 (MADIface == hdspm->io_type)))) { in snd_hdspm_create_midi()
2122 if ((id == 0) && (MADIface == hdspm->io_type)) { in snd_hdspm_create_midi()
2124 } else if ((id == 2) && (MADI == hdspm->io_type)) { in snd_hdspm_create_midi()
2130 &hdspm->midi[id].rmidi); in snd_hdspm_create_midi()
2134 sprintf(hdspm->midi[id].rmidi->name, "%s MIDI %d", in snd_hdspm_create_midi()
2136 hdspm->midi[id].rmidi->private_data = &hdspm->midi[id]; in snd_hdspm_create_midi()
2138 snd_rawmidi_set_ops(hdspm->midi[id].rmidi, in snd_hdspm_create_midi()
2141 snd_rawmidi_set_ops(hdspm->midi[id].rmidi, in snd_hdspm_create_midi()
2145 hdspm->midi[id].rmidi->info_flags |= in snd_hdspm_create_midi()
2153 &hdspm->midi[id].rmidi); in snd_hdspm_create_midi()
2157 sprintf(hdspm->midi[id].rmidi->name, in snd_hdspm_create_midi()
2159 hdspm->midi[id].rmidi->private_data = &hdspm->midi[id]; in snd_hdspm_create_midi()
2161 snd_rawmidi_set_ops(hdspm->midi[id].rmidi, in snd_hdspm_create_midi()
2165 hdspm->midi[id].rmidi->info_flags |= SNDRV_RAWMIDI_INFO_INPUT; in snd_hdspm_create_midi()
2174 struct hdspm *hdspm = (struct hdspm *)arg; in hdspm_midi_tasklet() local
2177 while (i < hdspm->midiPorts) { in hdspm_midi_tasklet()
2178 if (hdspm->midi[i].pending) in hdspm_midi_tasklet()
2179 snd_hdspm_midi_input_read(&hdspm->midi[i]); in hdspm_midi_tasklet()
2193 static inline int hdspm_get_pll_freq(struct hdspm *hdspm) in hdspm_get_pll_freq() argument
2197 period = hdspm_read(hdspm, HDSPM_RD_PLL_FREQ); in hdspm_get_pll_freq()
2198 rate = hdspm_calc_dds_value(hdspm, period); in hdspm_get_pll_freq()
2207 static int hdspm_get_system_sample_rate(struct hdspm *hdspm) in hdspm_get_system_sample_rate() argument
2211 rate = hdspm_get_pll_freq(hdspm); in hdspm_get_system_sample_rate()
2215 if (0 == hdspm_system_clock_mode(hdspm)) { in hdspm_get_system_sample_rate()
2217 rate = hdspm->system_sample_rate; in hdspm_get_system_sample_rate()
2220 rate = hdspm_external_sample_rate(hdspm); in hdspm_get_system_sample_rate()
2222 rate = hdspm->system_sample_rate; in hdspm_get_system_sample_rate()
2257 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol); in snd_hdspm_get_system_sample_rate() local
2259 ucontrol->value.integer.value[0] = hdspm_get_system_sample_rate(hdspm); in snd_hdspm_get_system_sample_rate()
2267 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol); in snd_hdspm_put_system_sample_rate() local
2272 hdspm_set_dds_value(hdspm, ucontrol->value.integer.value[0]); in snd_hdspm_put_system_sample_rate()
2280 static int hdspm_get_wc_sample_rate(struct hdspm *hdspm) in hdspm_get_wc_sample_rate() argument
2284 switch (hdspm->io_type) { in hdspm_get_wc_sample_rate()
2287 status = hdspm_read(hdspm, HDSPM_RD_STATUS_1); in hdspm_get_wc_sample_rate()
2291 status = hdspm_read(hdspm, HDSPM_statusRegister); in hdspm_get_wc_sample_rate()
2305 static int hdspm_get_tco_sample_rate(struct hdspm *hdspm) in hdspm_get_tco_sample_rate() argument
2309 if (hdspm->tco) { in hdspm_get_tco_sample_rate()
2310 switch (hdspm->io_type) { in hdspm_get_tco_sample_rate()
2313 status = hdspm_read(hdspm, HDSPM_RD_STATUS_1); in hdspm_get_tco_sample_rate()
2317 status = hdspm_read(hdspm, HDSPM_statusRegister); in hdspm_get_tco_sample_rate()
2331 static int hdspm_get_sync_in_sample_rate(struct hdspm *hdspm) in hdspm_get_sync_in_sample_rate() argument
2335 if (hdspm->tco) { in hdspm_get_sync_in_sample_rate()
2336 switch (hdspm->io_type) { in hdspm_get_sync_in_sample_rate()
2339 status = hdspm_read(hdspm, HDSPM_RD_STATUS_2); in hdspm_get_sync_in_sample_rate()
2353 static int hdspm_get_aes_sample_rate(struct hdspm *hdspm, int index) in hdspm_get_aes_sample_rate() argument
2357 switch (hdspm->io_type) { in hdspm_get_aes_sample_rate()
2359 timecode = hdspm_read(hdspm, HDSPM_timecodeRegister); in hdspm_get_aes_sample_rate()
2372 static int hdspm_get_s1_sample_rate(struct hdspm *hdspm, unsigned int idx) in hdspm_get_s1_sample_rate() argument
2374 int status = hdspm_read(hdspm, HDSPM_RD_STATUS_2); in hdspm_get_s1_sample_rate()
2386 static int hdspm_external_rate_to_enum(struct hdspm *hdspm) in hdspm_external_rate_to_enum() argument
2388 int rate = hdspm_external_sample_rate(hdspm); in hdspm_external_rate_to_enum()
2421 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol); in snd_hdspm_get_autosync_sample_rate() local
2423 switch (hdspm->io_type) { in snd_hdspm_get_autosync_sample_rate()
2428 hdspm_get_wc_sample_rate(hdspm); in snd_hdspm_get_autosync_sample_rate()
2432 hdspm_get_tco_sample_rate(hdspm); in snd_hdspm_get_autosync_sample_rate()
2436 hdspm_get_sync_in_sample_rate(hdspm); in snd_hdspm_get_autosync_sample_rate()
2440 hdspm_get_s1_sample_rate(hdspm, in snd_hdspm_get_autosync_sample_rate()
2449 hdspm_get_wc_sample_rate(hdspm); in snd_hdspm_get_autosync_sample_rate()
2453 hdspm_get_tco_sample_rate(hdspm); in snd_hdspm_get_autosync_sample_rate()
2457 hdspm_get_sync_in_sample_rate(hdspm); in snd_hdspm_get_autosync_sample_rate()
2461 hdspm_get_s1_sample_rate(hdspm, in snd_hdspm_get_autosync_sample_rate()
2471 hdspm_get_wc_sample_rate(hdspm); in snd_hdspm_get_autosync_sample_rate()
2475 hdspm_get_tco_sample_rate(hdspm); in snd_hdspm_get_autosync_sample_rate()
2479 hdspm_get_sync_in_sample_rate(hdspm); in snd_hdspm_get_autosync_sample_rate()
2483 hdspm_external_rate_to_enum(hdspm); in snd_hdspm_get_autosync_sample_rate()
2487 hdspm_get_aes_sample_rate(hdspm, in snd_hdspm_get_autosync_sample_rate()
2497 hdspm_external_rate_to_enum(hdspm); in snd_hdspm_get_autosync_sample_rate()
2523 static int hdspm_system_clock_mode(struct hdspm *hdspm) in hdspm_system_clock_mode() argument
2525 switch (hdspm->io_type) { in hdspm_system_clock_mode()
2528 if (hdspm->settings_register & HDSPM_c0Master) in hdspm_system_clock_mode()
2533 if (hdspm->control_register & HDSPM_ClockModeMaster) in hdspm_system_clock_mode()
2545 static void hdspm_set_system_clock_mode(struct hdspm *hdspm, int mode) in hdspm_set_system_clock_mode() argument
2547 hdspm_set_toggle_setting(hdspm, in hdspm_set_system_clock_mode()
2548 (hdspm_is_raydat_or_aio(hdspm)) ? in hdspm_set_system_clock_mode()
2565 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol); in snd_hdspm_get_system_clock_mode() local
2567 ucontrol->value.enumerated.item[0] = hdspm_system_clock_mode(hdspm); in snd_hdspm_get_system_clock_mode()
2574 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol); in snd_hdspm_put_system_clock_mode() local
2577 if (!snd_hdspm_use_is_exclusive(hdspm)) in snd_hdspm_put_system_clock_mode()
2586 hdspm_set_system_clock_mode(hdspm, val); in snd_hdspm_put_system_clock_mode()
2602 static int hdspm_clock_source(struct hdspm * hdspm) in hdspm_clock_source() argument
2604 switch (hdspm->system_sample_rate) { in hdspm_clock_source()
2619 static int hdspm_set_clock_source(struct hdspm * hdspm, int mode) in hdspm_set_clock_source() argument
2644 hdspm_set_rate(hdspm, rate, 1); in hdspm_set_clock_source()
2657 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol); in snd_hdspm_get_clock_source() local
2659 ucontrol->value.enumerated.item[0] = hdspm_clock_source(hdspm); in snd_hdspm_get_clock_source()
2666 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol); in snd_hdspm_put_clock_source() local
2670 if (!snd_hdspm_use_is_exclusive(hdspm)) in snd_hdspm_put_clock_source()
2677 spin_lock_irq(&hdspm->lock); in snd_hdspm_put_clock_source()
2678 if (val != hdspm_clock_source(hdspm)) in snd_hdspm_put_clock_source()
2679 change = (hdspm_set_clock_source(hdspm, val) == 0) ? 1 : 0; in snd_hdspm_put_clock_source()
2682 spin_unlock_irq(&hdspm->lock); in snd_hdspm_put_clock_source()
2704 static int hdspm_pref_sync_ref(struct hdspm * hdspm) in hdspm_pref_sync_ref() argument
2706 switch (hdspm->io_type) { in hdspm_pref_sync_ref()
2708 switch (hdspm->control_register & HDSPM_SyncRefMask) { in hdspm_pref_sync_ref()
2725 if (hdspm->tco) { in hdspm_pref_sync_ref()
2726 switch (hdspm->control_register & HDSPM_SyncRefMask) { in hdspm_pref_sync_ref()
2734 switch (hdspm->control_register & HDSPM_SyncRefMask) { in hdspm_pref_sync_ref()
2744 if (hdspm->tco) { in hdspm_pref_sync_ref()
2745 switch ((hdspm->settings_register & in hdspm_pref_sync_ref()
2758 switch ((hdspm->settings_register & in hdspm_pref_sync_ref()
2774 if (hdspm->tco) { in hdspm_pref_sync_ref()
2775 switch ((hdspm->settings_register & in hdspm_pref_sync_ref()
2785 switch ((hdspm->settings_register & in hdspm_pref_sync_ref()
2807 static int hdspm_set_pref_sync_ref(struct hdspm * hdspm, int pref) in hdspm_set_pref_sync_ref() argument
2811 switch (hdspm->io_type) { in hdspm_set_pref_sync_ref()
2813 hdspm->control_register &= ~HDSPM_SyncRefMask; in hdspm_set_pref_sync_ref()
2818 hdspm->control_register |= HDSPM_SyncRef0; in hdspm_set_pref_sync_ref()
2821 hdspm->control_register |= HDSPM_SyncRef1; in hdspm_set_pref_sync_ref()
2824 hdspm->control_register |= in hdspm_set_pref_sync_ref()
2828 hdspm->control_register |= HDSPM_SyncRef2; in hdspm_set_pref_sync_ref()
2831 hdspm->control_register |= in hdspm_set_pref_sync_ref()
2835 hdspm->control_register |= in hdspm_set_pref_sync_ref()
2839 hdspm->control_register |= in hdspm_set_pref_sync_ref()
2843 hdspm->control_register |= HDSPM_SyncRef3; in hdspm_set_pref_sync_ref()
2846 hdspm->control_register |= in hdspm_set_pref_sync_ref()
2857 hdspm->control_register &= ~HDSPM_SyncRefMask; in hdspm_set_pref_sync_ref()
2858 if (hdspm->tco) { in hdspm_set_pref_sync_ref()
2863 hdspm->control_register |= HDSPM_SyncRef0; in hdspm_set_pref_sync_ref()
2866 hdspm->control_register |= HDSPM_SyncRef1; in hdspm_set_pref_sync_ref()
2869 hdspm->control_register |= in hdspm_set_pref_sync_ref()
2880 hdspm->control_register |= HDSPM_SyncRef0; in hdspm_set_pref_sync_ref()
2883 hdspm->control_register |= in hdspm_set_pref_sync_ref()
2894 if (hdspm->tco) { in hdspm_set_pref_sync_ref()
2923 if (hdspm->tco) { in hdspm_set_pref_sync_ref()
2946 switch (hdspm->io_type) { in hdspm_set_pref_sync_ref()
2949 hdspm->settings_register &= ~HDSPM_c0_SyncRefMask; in hdspm_set_pref_sync_ref()
2950 hdspm->settings_register |= HDSPM_c0_SyncRef0 * p; in hdspm_set_pref_sync_ref()
2951 hdspm_write(hdspm, HDSPM_WR_SETTINGS, hdspm->settings_register); in hdspm_set_pref_sync_ref()
2957 hdspm_write(hdspm, HDSPM_controlRegister, in hdspm_set_pref_sync_ref()
2958 hdspm->control_register); in hdspm_set_pref_sync_ref()
2968 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol); in snd_hdspm_info_pref_sync_ref() local
2970 snd_ctl_enum_info(uinfo, 1, hdspm->texts_autosync_items, hdspm->texts_autosync); in snd_hdspm_info_pref_sync_ref()
2978 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol); in snd_hdspm_get_pref_sync_ref() local
2979 int psf = hdspm_pref_sync_ref(hdspm); in snd_hdspm_get_pref_sync_ref()
2992 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol); in snd_hdspm_put_pref_sync_ref() local
2995 if (!snd_hdspm_use_is_exclusive(hdspm)) in snd_hdspm_put_pref_sync_ref()
3002 else if (val >= hdspm->texts_autosync_items) in snd_hdspm_put_pref_sync_ref()
3003 val = hdspm->texts_autosync_items-1; in snd_hdspm_put_pref_sync_ref()
3005 spin_lock_irq(&hdspm->lock); in snd_hdspm_put_pref_sync_ref()
3006 if (val != hdspm_pref_sync_ref(hdspm)) in snd_hdspm_put_pref_sync_ref()
3007 change = (0 == hdspm_set_pref_sync_ref(hdspm, val)) ? 1 : 0; in snd_hdspm_put_pref_sync_ref()
3009 spin_unlock_irq(&hdspm->lock); in snd_hdspm_put_pref_sync_ref()
3023 static int hdspm_autosync_ref(struct hdspm *hdspm) in hdspm_autosync_ref() argument
3026 if (AES32 == hdspm->io_type) { in hdspm_autosync_ref()
3028 unsigned int status = hdspm_read(hdspm, HDSPM_statusRegister); in hdspm_autosync_ref()
3036 } else if (MADI == hdspm->io_type) { in hdspm_autosync_ref()
3038 unsigned int status2 = hdspm_read(hdspm, HDSPM_statusRegister2); in hdspm_autosync_ref()
3062 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol); in snd_hdspm_info_autosync_ref() local
3064 if (AES32 == hdspm->io_type) { in snd_hdspm_info_autosync_ref()
3069 } else if (MADI == hdspm->io_type) { in snd_hdspm_info_autosync_ref()
3081 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol); in snd_hdspm_get_autosync_ref() local
3083 ucontrol->value.enumerated.item[0] = hdspm_autosync_ref(hdspm); in snd_hdspm_get_autosync_ref()
3112 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol); in snd_hdspm_get_tco_video_input_format() local
3113 status = hdspm_read(hdspm, HDSPM_RD_TCO + 4); in snd_hdspm_get_tco_video_input_format()
3153 static int hdspm_tco_ltc_frames(struct hdspm *hdspm) in hdspm_tco_ltc_frames() argument
3158 status = hdspm_read(hdspm, HDSPM_RD_TCO + 4); in hdspm_tco_ltc_frames()
3187 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol); in snd_hdspm_get_tco_ltc_frames() local
3189 ucontrol->value.enumerated.item[0] = hdspm_tco_ltc_frames(hdspm); in snd_hdspm_get_tco_ltc_frames()
3202 static int hdspm_toggle_setting(struct hdspm *hdspm, u32 regmask) in hdspm_toggle_setting() argument
3206 if (hdspm_is_raydat_or_aio(hdspm)) in hdspm_toggle_setting()
3207 reg = hdspm->settings_register; in hdspm_toggle_setting()
3209 reg = hdspm->control_register; in hdspm_toggle_setting()
3214 static int hdspm_set_toggle_setting(struct hdspm *hdspm, u32 regmask, int out) in hdspm_set_toggle_setting() argument
3219 if (hdspm_is_raydat_or_aio(hdspm)) { in hdspm_set_toggle_setting()
3220 reg = &(hdspm->settings_register); in hdspm_set_toggle_setting()
3223 reg = &(hdspm->control_register); in hdspm_set_toggle_setting()
3232 hdspm_write(hdspm, target_reg, *reg); in hdspm_set_toggle_setting()
3242 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol); in snd_hdspm_get_toggle_setting() local
3245 spin_lock_irq(&hdspm->lock); in snd_hdspm_get_toggle_setting()
3246 ucontrol->value.integer.value[0] = hdspm_toggle_setting(hdspm, regmask); in snd_hdspm_get_toggle_setting()
3247 spin_unlock_irq(&hdspm->lock); in snd_hdspm_get_toggle_setting()
3254 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol); in snd_hdspm_put_toggle_setting() local
3259 if (!snd_hdspm_use_is_exclusive(hdspm)) in snd_hdspm_put_toggle_setting()
3262 spin_lock_irq(&hdspm->lock); in snd_hdspm_put_toggle_setting()
3263 change = (int) val != hdspm_toggle_setting(hdspm, regmask); in snd_hdspm_put_toggle_setting()
3264 hdspm_set_toggle_setting(hdspm, regmask, val); in snd_hdspm_put_toggle_setting()
3265 spin_unlock_irq(&hdspm->lock); in snd_hdspm_put_toggle_setting()
3278 static int hdspm_input_select(struct hdspm * hdspm) in hdspm_input_select() argument
3280 return (hdspm->control_register & HDSPM_InputSelect0) ? 1 : 0; in hdspm_input_select()
3283 static int hdspm_set_input_select(struct hdspm * hdspm, int out) in hdspm_set_input_select() argument
3286 hdspm->control_register |= HDSPM_InputSelect0; in hdspm_set_input_select()
3288 hdspm->control_register &= ~HDSPM_InputSelect0; in hdspm_set_input_select()
3289 hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register); in hdspm_set_input_select()
3305 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol); in snd_hdspm_get_input_select() local
3307 spin_lock_irq(&hdspm->lock); in snd_hdspm_get_input_select()
3308 ucontrol->value.enumerated.item[0] = hdspm_input_select(hdspm); in snd_hdspm_get_input_select()
3309 spin_unlock_irq(&hdspm->lock); in snd_hdspm_get_input_select()
3316 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol); in snd_hdspm_put_input_select() local
3320 if (!snd_hdspm_use_is_exclusive(hdspm)) in snd_hdspm_put_input_select()
3323 spin_lock_irq(&hdspm->lock); in snd_hdspm_put_input_select()
3324 change = (int) val != hdspm_input_select(hdspm); in snd_hdspm_put_input_select()
3325 hdspm_set_input_select(hdspm, val); in snd_hdspm_put_input_select()
3326 spin_unlock_irq(&hdspm->lock); in snd_hdspm_put_input_select()
3340 static int hdspm_ds_wire(struct hdspm * hdspm) in hdspm_ds_wire() argument
3342 return (hdspm->control_register & HDSPM_DS_DoubleWire) ? 1 : 0; in hdspm_ds_wire()
3345 static int hdspm_set_ds_wire(struct hdspm * hdspm, int ds) in hdspm_set_ds_wire() argument
3348 hdspm->control_register |= HDSPM_DS_DoubleWire; in hdspm_set_ds_wire()
3350 hdspm->control_register &= ~HDSPM_DS_DoubleWire; in hdspm_set_ds_wire()
3351 hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register); in hdspm_set_ds_wire()
3367 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol); in snd_hdspm_get_ds_wire() local
3369 spin_lock_irq(&hdspm->lock); in snd_hdspm_get_ds_wire()
3370 ucontrol->value.enumerated.item[0] = hdspm_ds_wire(hdspm); in snd_hdspm_get_ds_wire()
3371 spin_unlock_irq(&hdspm->lock); in snd_hdspm_get_ds_wire()
3378 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol); in snd_hdspm_put_ds_wire() local
3382 if (!snd_hdspm_use_is_exclusive(hdspm)) in snd_hdspm_put_ds_wire()
3385 spin_lock_irq(&hdspm->lock); in snd_hdspm_put_ds_wire()
3386 change = (int) val != hdspm_ds_wire(hdspm); in snd_hdspm_put_ds_wire()
3387 hdspm_set_ds_wire(hdspm, val); in snd_hdspm_put_ds_wire()
3388 spin_unlock_irq(&hdspm->lock); in snd_hdspm_put_ds_wire()
3402 static int hdspm_qs_wire(struct hdspm * hdspm) in hdspm_qs_wire() argument
3404 if (hdspm->control_register & HDSPM_QS_DoubleWire) in hdspm_qs_wire()
3406 if (hdspm->control_register & HDSPM_QS_QuadWire) in hdspm_qs_wire()
3411 static int hdspm_set_qs_wire(struct hdspm * hdspm, int mode) in hdspm_set_qs_wire() argument
3413 hdspm->control_register &= ~(HDSPM_QS_DoubleWire | HDSPM_QS_QuadWire); in hdspm_set_qs_wire()
3418 hdspm->control_register |= HDSPM_QS_DoubleWire; in hdspm_set_qs_wire()
3421 hdspm->control_register |= HDSPM_QS_QuadWire; in hdspm_set_qs_wire()
3424 hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register); in hdspm_set_qs_wire()
3440 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol); in snd_hdspm_get_qs_wire() local
3442 spin_lock_irq(&hdspm->lock); in snd_hdspm_get_qs_wire()
3443 ucontrol->value.enumerated.item[0] = hdspm_qs_wire(hdspm); in snd_hdspm_get_qs_wire()
3444 spin_unlock_irq(&hdspm->lock); in snd_hdspm_get_qs_wire()
3451 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol); in snd_hdspm_put_qs_wire() local
3455 if (!snd_hdspm_use_is_exclusive(hdspm)) in snd_hdspm_put_qs_wire()
3462 spin_lock_irq(&hdspm->lock); in snd_hdspm_put_qs_wire()
3463 change = val != hdspm_qs_wire(hdspm); in snd_hdspm_put_qs_wire()
3464 hdspm_set_qs_wire(hdspm, val); in snd_hdspm_put_qs_wire()
3465 spin_unlock_irq(&hdspm->lock); in snd_hdspm_put_qs_wire()
3478 static int hdspm_tristate(struct hdspm *hdspm, u32 regmask) in hdspm_tristate() argument
3480 u32 reg = hdspm->settings_register & (regmask * 3); in hdspm_tristate()
3484 static int hdspm_set_tristate(struct hdspm *hdspm, int mode, u32 regmask) in hdspm_set_tristate() argument
3486 hdspm->settings_register &= ~(regmask * 3); in hdspm_set_tristate()
3487 hdspm->settings_register |= (regmask * mode); in hdspm_set_tristate()
3488 hdspm_write(hdspm, HDSPM_WR_SETTINGS, hdspm->settings_register); in hdspm_set_tristate()
3515 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol); in snd_hdspm_get_tristate() local
3518 spin_lock_irq(&hdspm->lock); in snd_hdspm_get_tristate()
3519 ucontrol->value.enumerated.item[0] = hdspm_tristate(hdspm, regmask); in snd_hdspm_get_tristate()
3520 spin_unlock_irq(&hdspm->lock); in snd_hdspm_get_tristate()
3527 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol); in snd_hdspm_put_tristate() local
3532 if (!snd_hdspm_use_is_exclusive(hdspm)) in snd_hdspm_put_tristate()
3540 spin_lock_irq(&hdspm->lock); in snd_hdspm_put_tristate()
3541 change = val != hdspm_tristate(hdspm, regmask); in snd_hdspm_put_tristate()
3542 hdspm_set_tristate(hdspm, val, regmask); in snd_hdspm_put_tristate()
3543 spin_unlock_irq(&hdspm->lock); in snd_hdspm_put_tristate()
3556 static int hdspm_madi_speedmode(struct hdspm *hdspm) in hdspm_madi_speedmode() argument
3558 if (hdspm->control_register & HDSPM_QuadSpeed) in hdspm_madi_speedmode()
3560 if (hdspm->control_register & HDSPM_DoubleSpeed) in hdspm_madi_speedmode()
3565 static int hdspm_set_madi_speedmode(struct hdspm *hdspm, int mode) in hdspm_set_madi_speedmode() argument
3567 hdspm->control_register &= ~(HDSPM_DoubleSpeed | HDSPM_QuadSpeed); in hdspm_set_madi_speedmode()
3572 hdspm->control_register |= HDSPM_DoubleSpeed; in hdspm_set_madi_speedmode()
3575 hdspm->control_register |= HDSPM_QuadSpeed; in hdspm_set_madi_speedmode()
3578 hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register); in hdspm_set_madi_speedmode()
3594 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol); in snd_hdspm_get_madi_speedmode() local
3596 spin_lock_irq(&hdspm->lock); in snd_hdspm_get_madi_speedmode()
3597 ucontrol->value.enumerated.item[0] = hdspm_madi_speedmode(hdspm); in snd_hdspm_get_madi_speedmode()
3598 spin_unlock_irq(&hdspm->lock); in snd_hdspm_get_madi_speedmode()
3605 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol); in snd_hdspm_put_madi_speedmode() local
3609 if (!snd_hdspm_use_is_exclusive(hdspm)) in snd_hdspm_put_madi_speedmode()
3616 spin_lock_irq(&hdspm->lock); in snd_hdspm_put_madi_speedmode()
3617 change = val != hdspm_madi_speedmode(hdspm); in snd_hdspm_put_madi_speedmode()
3618 hdspm_set_madi_speedmode(hdspm, val); in snd_hdspm_put_madi_speedmode()
3619 spin_unlock_irq(&hdspm->lock); in snd_hdspm_put_madi_speedmode()
3649 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol); in snd_hdspm_get_mixer() local
3665 spin_lock_irq(&hdspm->lock); in snd_hdspm_get_mixer()
3668 hdspm_read_pb_gain(hdspm, destination, in snd_hdspm_get_mixer()
3672 hdspm_read_in_gain(hdspm, destination, source); in snd_hdspm_get_mixer()
3674 spin_unlock_irq(&hdspm->lock); in snd_hdspm_get_mixer()
3682 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol); in snd_hdspm_put_mixer() local
3688 if (!snd_hdspm_use_is_exclusive(hdspm)) in snd_hdspm_put_mixer()
3701 spin_lock_irq(&hdspm->lock); in snd_hdspm_put_mixer()
3704 change = gain != hdspm_read_pb_gain(hdspm, destination, in snd_hdspm_put_mixer()
3708 change = gain != hdspm_read_in_gain(hdspm, destination, in snd_hdspm_put_mixer()
3713 hdspm_write_pb_gain(hdspm, destination, in snd_hdspm_put_mixer()
3717 hdspm_write_in_gain(hdspm, destination, source, in snd_hdspm_put_mixer()
3720 spin_unlock_irq(&hdspm->lock); in snd_hdspm_put_mixer()
3753 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol); in snd_hdspm_get_playback_mixer() local
3761 spin_lock_irq(&hdspm->lock); in snd_hdspm_get_playback_mixer()
3763 (hdspm_read_pb_gain(hdspm, channel, channel)*64)/UNITY_GAIN; in snd_hdspm_get_playback_mixer()
3764 spin_unlock_irq(&hdspm->lock); in snd_hdspm_get_playback_mixer()
3772 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol); in snd_hdspm_put_playback_mixer() local
3777 if (!snd_hdspm_use_is_exclusive(hdspm)) in snd_hdspm_put_playback_mixer()
3787 spin_lock_irq(&hdspm->lock); in snd_hdspm_put_playback_mixer()
3789 gain != hdspm_read_pb_gain(hdspm, channel, in snd_hdspm_put_playback_mixer()
3792 hdspm_write_pb_gain(hdspm, channel, channel, in snd_hdspm_put_playback_mixer()
3794 spin_unlock_irq(&hdspm->lock); in snd_hdspm_put_playback_mixer()
3834 static int hdspm_wc_sync_check(struct hdspm *hdspm) in hdspm_wc_sync_check() argument
3838 switch (hdspm->io_type) { in hdspm_wc_sync_check()
3840 status = hdspm_read(hdspm, HDSPM_statusRegister); in hdspm_wc_sync_check()
3851 status2 = hdspm_read(hdspm, HDSPM_statusRegister2); in hdspm_wc_sync_check()
3863 status = hdspm_read(hdspm, HDSPM_statusRegister); in hdspm_wc_sync_check()
3882 static int hdspm_madi_sync_check(struct hdspm *hdspm) in hdspm_madi_sync_check() argument
3884 int status = hdspm_read(hdspm, HDSPM_statusRegister); in hdspm_madi_sync_check()
3895 static int hdspm_s1_sync_check(struct hdspm *hdspm, int idx) in hdspm_s1_sync_check() argument
3899 status = hdspm_read(hdspm, HDSPM_RD_STATUS_1); in hdspm_s1_sync_check()
3912 static int hdspm_sync_in_sync_check(struct hdspm *hdspm) in hdspm_sync_in_sync_check() argument
3916 switch (hdspm->io_type) { in hdspm_sync_in_sync_check()
3919 status = hdspm_read(hdspm, HDSPM_RD_STATUS_3); in hdspm_sync_in_sync_check()
3925 status = hdspm_read(hdspm, HDSPM_statusRegister); in hdspm_sync_in_sync_check()
3931 status = hdspm_read(hdspm, HDSPM_statusRegister2); in hdspm_sync_in_sync_check()
3948 static int hdspm_aes_sync_check(struct hdspm *hdspm, int idx) in hdspm_aes_sync_check() argument
3951 status2 = hdspm_read(hdspm, HDSPM_statusRegister2); in hdspm_aes_sync_check()
3963 static int hdspm_tco_input_check(struct hdspm *hdspm, u32 mask) in hdspm_tco_input_check() argument
3966 status = hdspm_read(hdspm, HDSPM_RD_TCO + 4); in hdspm_tco_input_check()
3972 static int hdspm_tco_sync_check(struct hdspm *hdspm) in hdspm_tco_sync_check() argument
3976 if (hdspm->tco) { in hdspm_tco_sync_check()
3977 switch (hdspm->io_type) { in hdspm_tco_sync_check()
3979 status = hdspm_read(hdspm, HDSPM_statusRegister); in hdspm_tco_sync_check()
3988 status = hdspm_read(hdspm, HDSPM_statusRegister); in hdspm_tco_sync_check()
3998 status = hdspm_read(hdspm, HDSPM_RD_STATUS_1); in hdspm_tco_sync_check()
4018 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol); in snd_hdspm_get_sync_check() local
4021 switch (hdspm->io_type) { in snd_hdspm_get_sync_check()
4025 val = hdspm_wc_sync_check(hdspm); break; in snd_hdspm_get_sync_check()
4027 val = hdspm_tco_sync_check(hdspm); break; in snd_hdspm_get_sync_check()
4029 val = hdspm_sync_in_sync_check(hdspm); break; in snd_hdspm_get_sync_check()
4031 val = hdspm_s1_sync_check(hdspm, in snd_hdspm_get_sync_check()
4039 val = hdspm_wc_sync_check(hdspm); break; in snd_hdspm_get_sync_check()
4041 val = hdspm_tco_sync_check(hdspm); break; in snd_hdspm_get_sync_check()
4043 val = hdspm_sync_in_sync_check(hdspm); break; in snd_hdspm_get_sync_check()
4045 val = hdspm_s1_sync_check(hdspm, in snd_hdspm_get_sync_check()
4053 val = hdspm_wc_sync_check(hdspm); break; in snd_hdspm_get_sync_check()
4055 val = hdspm_madi_sync_check(hdspm); break; in snd_hdspm_get_sync_check()
4057 val = hdspm_tco_sync_check(hdspm); break; in snd_hdspm_get_sync_check()
4059 val = hdspm_sync_in_sync_check(hdspm); break; in snd_hdspm_get_sync_check()
4064 val = hdspm_madi_sync_check(hdspm); /* MADI */ in snd_hdspm_get_sync_check()
4070 val = hdspm_wc_sync_check(hdspm); break; in snd_hdspm_get_sync_check()
4072 val = hdspm_tco_sync_check(hdspm); break; in snd_hdspm_get_sync_check()
4074 val = hdspm_sync_in_sync_check(hdspm); break; in snd_hdspm_get_sync_check()
4076 val = hdspm_aes_sync_check(hdspm, in snd_hdspm_get_sync_check()
4083 if (hdspm->tco) { in snd_hdspm_get_sync_check()
4087 val = hdspm_tco_input_check(hdspm, HDSPM_TCO1_TCO_lock); in snd_hdspm_get_sync_check()
4091 val = hdspm_tco_input_check(hdspm, in snd_hdspm_get_sync_check()
4111 static void hdspm_tco_write(struct hdspm *hdspm) in hdspm_tco_write() argument
4115 switch (hdspm->tco->input) { in hdspm_tco_write()
4126 switch (hdspm->tco->framerate) { in hdspm_tco_write()
4150 switch (hdspm->tco->wordclock) { in hdspm_tco_write()
4161 switch (hdspm->tco->samplerate) { in hdspm_tco_write()
4172 switch (hdspm->tco->pull) { in hdspm_tco_write()
4189 if (1 == hdspm->tco->term) { in hdspm_tco_write()
4193 hdspm_write(hdspm, HDSPM_WR_TCO, tc[0]); in hdspm_tco_write()
4194 hdspm_write(hdspm, HDSPM_WR_TCO+4, tc[1]); in hdspm_tco_write()
4195 hdspm_write(hdspm, HDSPM_WR_TCO+8, tc[2]); in hdspm_tco_write()
4196 hdspm_write(hdspm, HDSPM_WR_TCO+12, tc[3]); in hdspm_tco_write()
4223 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol); in snd_hdspm_get_tco_sample_rate() local
4225 ucontrol->value.enumerated.item[0] = hdspm->tco->samplerate; in snd_hdspm_get_tco_sample_rate()
4233 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol); in snd_hdspm_put_tco_sample_rate() local
4235 if (hdspm->tco->samplerate != ucontrol->value.enumerated.item[0]) { in snd_hdspm_put_tco_sample_rate()
4236 hdspm->tco->samplerate = ucontrol->value.enumerated.item[0]; in snd_hdspm_put_tco_sample_rate()
4238 hdspm_tco_write(hdspm); in snd_hdspm_put_tco_sample_rate()
4270 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol); in snd_hdspm_get_tco_pull() local
4272 ucontrol->value.enumerated.item[0] = hdspm->tco->pull; in snd_hdspm_get_tco_pull()
4280 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol); in snd_hdspm_put_tco_pull() local
4282 if (hdspm->tco->pull != ucontrol->value.enumerated.item[0]) { in snd_hdspm_put_tco_pull()
4283 hdspm->tco->pull = ucontrol->value.enumerated.item[0]; in snd_hdspm_put_tco_pull()
4285 hdspm_tco_write(hdspm); in snd_hdspm_put_tco_pull()
4315 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol); in snd_hdspm_get_tco_wck_conversion() local
4317 ucontrol->value.enumerated.item[0] = hdspm->tco->wordclock; in snd_hdspm_get_tco_wck_conversion()
4325 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol); in snd_hdspm_put_tco_wck_conversion() local
4327 if (hdspm->tco->wordclock != ucontrol->value.enumerated.item[0]) { in snd_hdspm_put_tco_wck_conversion()
4328 hdspm->tco->wordclock = ucontrol->value.enumerated.item[0]; in snd_hdspm_put_tco_wck_conversion()
4330 hdspm_tco_write(hdspm); in snd_hdspm_put_tco_wck_conversion()
4362 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol); in snd_hdspm_get_tco_frame_rate() local
4364 ucontrol->value.enumerated.item[0] = hdspm->tco->framerate; in snd_hdspm_get_tco_frame_rate()
4372 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol); in snd_hdspm_put_tco_frame_rate() local
4374 if (hdspm->tco->framerate != ucontrol->value.enumerated.item[0]) { in snd_hdspm_put_tco_frame_rate()
4375 hdspm->tco->framerate = ucontrol->value.enumerated.item[0]; in snd_hdspm_put_tco_frame_rate()
4377 hdspm_tco_write(hdspm); in snd_hdspm_put_tco_frame_rate()
4408 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol); in snd_hdspm_get_tco_sync_source() local
4410 ucontrol->value.enumerated.item[0] = hdspm->tco->input; in snd_hdspm_get_tco_sync_source()
4418 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol); in snd_hdspm_put_tco_sync_source() local
4420 if (hdspm->tco->input != ucontrol->value.enumerated.item[0]) { in snd_hdspm_put_tco_sync_source()
4421 hdspm->tco->input = ucontrol->value.enumerated.item[0]; in snd_hdspm_put_tco_sync_source()
4423 hdspm_tco_write(hdspm); in snd_hdspm_put_tco_sync_source()
4458 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol); in snd_hdspm_get_tco_word_term() local
4460 ucontrol->value.integer.value[0] = hdspm->tco->term; in snd_hdspm_get_tco_word_term()
4469 struct hdspm *hdspm = snd_kcontrol_chip(kcontrol); in snd_hdspm_put_tco_word_term() local
4471 if (hdspm->tco->term != ucontrol->value.integer.value[0]) { in snd_hdspm_put_tco_word_term()
4472 hdspm->tco->term = ucontrol->value.integer.value[0]; in snd_hdspm_put_tco_word_term()
4474 hdspm_tco_write(hdspm); in snd_hdspm_put_tco_word_term()
4648 static int hdspm_update_simple_mixer_controls(struct hdspm * hdspm) in hdspm_update_simple_mixer_controls() argument
4652 for (i = hdspm->ds_out_channels; i < hdspm->ss_out_channels; ++i) { in hdspm_update_simple_mixer_controls()
4653 if (hdspm->system_sample_rate > 48000) { in hdspm_update_simple_mixer_controls()
4654 hdspm->playback_mixer_ctls[i]->vd[0].access = in hdspm_update_simple_mixer_controls()
4659 hdspm->playback_mixer_ctls[i]->vd[0].access = in hdspm_update_simple_mixer_controls()
4663 snd_ctl_notify(hdspm->card, SNDRV_CTL_EVENT_MASK_VALUE | in hdspm_update_simple_mixer_controls()
4665 &hdspm->playback_mixer_ctls[i]->id); in hdspm_update_simple_mixer_controls()
4673 struct hdspm *hdspm) in snd_hdspm_create_controls() argument
4680 switch (hdspm->io_type) { in snd_hdspm_create_controls()
4706 snd_ctl_new1(&list[idx], hdspm)); in snd_hdspm_create_controls()
4715 if (hdspm->system_sample_rate >= 128000) { in snd_hdspm_create_controls()
4716 limit = hdspm->qs_out_channels; in snd_hdspm_create_controls()
4717 } else if (hdspm->system_sample_rate >= 64000) { in snd_hdspm_create_controls()
4718 limit = hdspm->ds_out_channels; in snd_hdspm_create_controls()
4720 limit = hdspm->ss_out_channels; in snd_hdspm_create_controls()
4724 kctl = snd_ctl_new1(&snd_hdspm_playback_mixer, hdspm); in snd_hdspm_create_controls()
4728 hdspm->playback_mixer_ctls[idx] = kctl; in snd_hdspm_create_controls()
4732 if (hdspm->tco) { in snd_hdspm_create_controls()
4738 snd_ctl_new1(&list[idx], hdspm)); in snd_hdspm_create_controls()
4755 struct hdspm *hdspm = entry->private_data; in snd_hdspm_proc_read_tco() local
4764 status = hdspm_read(hdspm, HDSPM_statusRegister); in snd_hdspm_proc_read_tco()
4765 control = hdspm->control_register; in snd_hdspm_proc_read_tco()
4770 a = hdspm_read(hdspm, HDSPM_RD_TCO+4); in snd_hdspm_proc_read_tco()
4809 switch (hdspm->io_type) { in snd_hdspm_proc_read_tco()
4822 period = hdspm_read(hdspm, HDSPM_RD_PLL_FREQ); in snd_hdspm_proc_read_tco()
4838 ltc = hdspm_read(hdspm, HDSPM_RD_TCO); in snd_hdspm_proc_read_tco()
4867 struct hdspm *hdspm = entry->private_data; in snd_hdspm_proc_read_madi() local
4875 status = hdspm_read(hdspm, HDSPM_statusRegister); in snd_hdspm_proc_read_madi()
4876 status2 = hdspm_read(hdspm, HDSPM_statusRegister2); in snd_hdspm_proc_read_madi()
4879 hdspm->card_name, hdspm->card->number + 1, in snd_hdspm_proc_read_madi()
4880 hdspm->firmware_rev, in snd_hdspm_proc_read_madi()
4886 (hdspm_read(hdspm, HDSPM_midiStatusIn1)>>8) & 0xFFFFFF, in snd_hdspm_proc_read_madi()
4887 hdspm->serial); in snd_hdspm_proc_read_madi()
4890 hdspm->irq, hdspm->port, (unsigned long)hdspm->iobase); in snd_hdspm_proc_read_madi()
4899 hdspm->irq_count); in snd_hdspm_proc_read_madi()
4906 (2 * (int)hdspm->period_bytes), in snd_hdspm_proc_read_madi()
4908 (2 * (int)hdspm->period_bytes), in snd_hdspm_proc_read_madi()
4909 (long) hdspm_hw_pointer(hdspm) * 4); in snd_hdspm_proc_read_madi()
4913 hdspm_read(hdspm, HDSPM_midiStatusOut0) & 0xFF, in snd_hdspm_proc_read_madi()
4914 hdspm_read(hdspm, HDSPM_midiStatusOut1) & 0xFF, in snd_hdspm_proc_read_madi()
4915 hdspm_read(hdspm, HDSPM_midiStatusIn0) & 0xFF, in snd_hdspm_proc_read_madi()
4916 hdspm_read(hdspm, HDSPM_midiStatusIn1) & 0xFF); in snd_hdspm_proc_read_madi()
4919 hdspm_read(hdspm, HDSPM_midiStatusIn2) & 0xFF, in snd_hdspm_proc_read_madi()
4920 hdspm_read(hdspm, HDSPM_midiStatusOut2) & 0xFF); in snd_hdspm_proc_read_madi()
4924 hdspm->control_register, hdspm->control2_register, in snd_hdspm_proc_read_madi()
4930 x = hdspm_get_latency(hdspm); in snd_hdspm_proc_read_madi()
4934 x, (unsigned long) hdspm->period_bytes); in snd_hdspm_proc_read_madi()
4937 (hdspm->control_register & HDSPM_LineOut) ? "on " : "off"); in snd_hdspm_proc_read_madi()
4942 (hdspm->control_register & HDSPM_clr_tms) ? "on" : "off", in snd_hdspm_proc_read_madi()
4943 (hdspm->control_register & HDSPM_TX_64ch) ? "64" : "56", in snd_hdspm_proc_read_madi()
4944 (hdspm->control_register & HDSPM_AutoInp) ? "on" : "off"); in snd_hdspm_proc_read_madi()
4947 if (!(hdspm->control_register & HDSPM_ClockModeMaster)) in snd_hdspm_proc_read_madi()
4953 switch (hdspm_pref_sync_ref(hdspm)) { in snd_hdspm_proc_read_madi()
4974 hdspm->system_sample_rate); in snd_hdspm_proc_read_madi()
4988 switch (hdspm_autosync_ref(hdspm)) { in snd_hdspm_proc_read_madi()
5010 autosync_ref, hdspm_external_sample_rate(hdspm), in snd_hdspm_proc_read_madi()
5029 struct hdspm *hdspm = entry->private_data; in snd_hdspm_proc_read_aes32() local
5038 status = hdspm_read(hdspm, HDSPM_statusRegister); in snd_hdspm_proc_read_aes32()
5039 status2 = hdspm_read(hdspm, HDSPM_statusRegister2); in snd_hdspm_proc_read_aes32()
5040 timecode = hdspm_read(hdspm, HDSPM_timecodeRegister); in snd_hdspm_proc_read_aes32()
5043 hdspm->card_name, hdspm->card->number + 1, in snd_hdspm_proc_read_aes32()
5044 hdspm->firmware_rev); in snd_hdspm_proc_read_aes32()
5047 hdspm->irq, hdspm->port, (unsigned long)hdspm->iobase); in snd_hdspm_proc_read_aes32()
5056 hdspm->irq_count); in snd_hdspm_proc_read_aes32()
5063 (2 * (int)hdspm->period_bytes), in snd_hdspm_proc_read_aes32()
5065 (2 * (int)hdspm->period_bytes), in snd_hdspm_proc_read_aes32()
5066 (long) hdspm_hw_pointer(hdspm) * 4); in snd_hdspm_proc_read_aes32()
5070 hdspm_read(hdspm, HDSPM_midiStatusOut0) & 0xFF, in snd_hdspm_proc_read_aes32()
5071 hdspm_read(hdspm, HDSPM_midiStatusOut1) & 0xFF, in snd_hdspm_proc_read_aes32()
5072 hdspm_read(hdspm, HDSPM_midiStatusIn0) & 0xFF, in snd_hdspm_proc_read_aes32()
5073 hdspm_read(hdspm, HDSPM_midiStatusIn1) & 0xFF); in snd_hdspm_proc_read_aes32()
5076 hdspm_read(hdspm, HDSPM_midiStatusIn2) & 0xFF, in snd_hdspm_proc_read_aes32()
5077 hdspm_read(hdspm, HDSPM_midiStatusOut2) & 0xFF); in snd_hdspm_proc_read_aes32()
5081 hdspm->control_register, hdspm->control2_register, in snd_hdspm_proc_read_aes32()
5086 x = hdspm_get_latency(hdspm); in snd_hdspm_proc_read_aes32()
5090 x, (unsigned long) hdspm->period_bytes); in snd_hdspm_proc_read_aes32()
5093 (hdspm-> in snd_hdspm_proc_read_aes32()
5098 (hdspm-> in snd_hdspm_proc_read_aes32()
5100 (hdspm-> in snd_hdspm_proc_read_aes32()
5102 (hdspm-> in snd_hdspm_proc_read_aes32()
5106 pref_syncref = hdspm_pref_sync_ref(hdspm); in snd_hdspm_proc_read_aes32()
5114 hdspm->system_sample_rate); in snd_hdspm_proc_read_aes32()
5117 hdspm->control_register & HDSPM_DS_DoubleWire? in snd_hdspm_proc_read_aes32()
5120 hdspm->control_register & HDSPM_QS_DoubleWire? in snd_hdspm_proc_read_aes32()
5122 hdspm->control_register & HDSPM_QS_QuadWire? in snd_hdspm_proc_read_aes32()
5142 switch (hdspm_autosync_ref(hdspm)) { in snd_hdspm_proc_read_aes32()
5182 struct hdspm *hdspm = entry->private_data; in snd_hdspm_proc_read_raydat() local
5186 status1 = hdspm_read(hdspm, HDSPM_RD_STATUS_1); /* s1 */ in snd_hdspm_proc_read_raydat()
5187 status2 = hdspm_read(hdspm, HDSPM_RD_STATUS_2); /* freq */ in snd_hdspm_proc_read_raydat()
5188 status3 = hdspm_read(hdspm, HDSPM_RD_STATUS_3); /* s2 */ in snd_hdspm_proc_read_raydat()
5198 (hdspm_system_clock_mode(hdspm) == 0) ? "master" : "slave"); in snd_hdspm_proc_read_raydat()
5200 hdspm_get_system_sample_rate(hdspm)); in snd_hdspm_proc_read_raydat()
5240 struct hdspm *hdspm = entry->private_data; in snd_hdspm_proc_read_debug() local
5247 snd_iprintf(buffer, "%08X ", hdspm_read(hdspm, i + j)); in snd_hdspm_proc_read_debug()
5257 struct hdspm *hdspm = entry->private_data; in snd_hdspm_proc_ports_in() local
5262 for (i = 0; i < hdspm->max_channels_in; i++) { in snd_hdspm_proc_ports_in()
5263 snd_iprintf(buffer, "%d=%s\n", i+1, hdspm->port_names_in[i]); in snd_hdspm_proc_ports_in()
5270 struct hdspm *hdspm = entry->private_data; in snd_hdspm_proc_ports_out() local
5275 for (i = 0; i < hdspm->max_channels_out; i++) { in snd_hdspm_proc_ports_out()
5276 snd_iprintf(buffer, "%d=%s\n", i+1, hdspm->port_names_out[i]); in snd_hdspm_proc_ports_out()
5281 static void snd_hdspm_proc_init(struct hdspm *hdspm) in snd_hdspm_proc_init() argument
5285 if (!snd_card_proc_new(hdspm->card, "hdspm", &entry)) { in snd_hdspm_proc_init()
5286 switch (hdspm->io_type) { in snd_hdspm_proc_init()
5288 snd_info_set_text_ops(entry, hdspm, in snd_hdspm_proc_init()
5292 snd_info_set_text_ops(entry, hdspm, in snd_hdspm_proc_init()
5300 snd_info_set_text_ops(entry, hdspm, in snd_hdspm_proc_init()
5308 if (!snd_card_proc_new(hdspm->card, "ports.in", &entry)) { in snd_hdspm_proc_init()
5309 snd_info_set_text_ops(entry, hdspm, snd_hdspm_proc_ports_in); in snd_hdspm_proc_init()
5312 if (!snd_card_proc_new(hdspm->card, "ports.out", &entry)) { in snd_hdspm_proc_init()
5313 snd_info_set_text_ops(entry, hdspm, snd_hdspm_proc_ports_out); in snd_hdspm_proc_init()
5318 if (!snd_card_proc_new(hdspm->card, "debug", &entry)) in snd_hdspm_proc_init()
5319 snd_info_set_text_ops(entry, hdspm, in snd_hdspm_proc_init()
5328 static int snd_hdspm_set_defaults(struct hdspm * hdspm) in snd_hdspm_set_defaults() argument
5336 hdspm->settings_register = 0; in snd_hdspm_set_defaults()
5338 switch (hdspm->io_type) { in snd_hdspm_set_defaults()
5341 hdspm->control_register = in snd_hdspm_set_defaults()
5347 hdspm->settings_register = 0x1 + 0x1000; in snd_hdspm_set_defaults()
5350 hdspm->control_register = in snd_hdspm_set_defaults()
5355 hdspm->control_register = in snd_hdspm_set_defaults()
5364 hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register); in snd_hdspm_set_defaults()
5366 if (AES32 == hdspm->io_type) { in snd_hdspm_set_defaults()
5369 hdspm->control2_register = HDSPM_BIGENDIAN_MODE; in snd_hdspm_set_defaults()
5371 hdspm->control2_register = 0; in snd_hdspm_set_defaults()
5374 hdspm_write(hdspm, HDSPM_control2Reg, hdspm->control2_register); in snd_hdspm_set_defaults()
5376 hdspm_compute_period_size(hdspm); in snd_hdspm_set_defaults()
5380 all_in_all_mixer(hdspm, 0 * UNITY_GAIN); in snd_hdspm_set_defaults()
5382 if (hdspm_is_raydat_or_aio(hdspm)) in snd_hdspm_set_defaults()
5383 hdspm_write(hdspm, HDSPM_WR_SETTINGS, hdspm->settings_register); in snd_hdspm_set_defaults()
5386 hdspm_set_rate(hdspm, 48000, 1); in snd_hdspm_set_defaults()
5398 struct hdspm *hdspm = (struct hdspm *) dev_id; in snd_hdspm_interrupt() local
5403 status = hdspm_read(hdspm, HDSPM_statusRegister); in snd_hdspm_interrupt()
5429 hdspm_write(hdspm, HDSPM_interruptConfirmation, 0); in snd_hdspm_interrupt()
5430 hdspm->irq_count++; in snd_hdspm_interrupt()
5434 if (hdspm->capture_substream) in snd_hdspm_interrupt()
5435 snd_pcm_period_elapsed(hdspm->capture_substream); in snd_hdspm_interrupt()
5437 if (hdspm->playback_substream) in snd_hdspm_interrupt()
5438 snd_pcm_period_elapsed(hdspm->playback_substream); in snd_hdspm_interrupt()
5443 while (i < hdspm->midiPorts) { in snd_hdspm_interrupt()
5444 if ((hdspm_read(hdspm, in snd_hdspm_interrupt()
5445 hdspm->midi[i].statusIn) & 0xff) && in snd_hdspm_interrupt()
5446 (status & hdspm->midi[i].irq)) { in snd_hdspm_interrupt()
5450 hdspm->control_register &= ~hdspm->midi[i].ie; in snd_hdspm_interrupt()
5451 hdspm_write(hdspm, HDSPM_controlRegister, in snd_hdspm_interrupt()
5452 hdspm->control_register); in snd_hdspm_interrupt()
5453 hdspm->midi[i].pending = 1; in snd_hdspm_interrupt()
5461 tasklet_hi_schedule(&hdspm->midi_tasklet); in snd_hdspm_interrupt()
5475 struct hdspm *hdspm = snd_pcm_substream_chip(substream); in snd_hdspm_hw_pointer() local
5476 return hdspm_hw_pointer(hdspm); in snd_hdspm_hw_pointer()
5483 struct hdspm *hdspm = snd_pcm_substream_chip(substream); in snd_hdspm_reset() local
5487 other = hdspm->capture_substream; in snd_hdspm_reset()
5489 other = hdspm->playback_substream; in snd_hdspm_reset()
5491 if (hdspm->running) in snd_hdspm_reset()
5492 runtime->status->hw_ptr = hdspm_hw_pointer(hdspm); in snd_hdspm_reset()
5512 struct hdspm *hdspm = snd_pcm_substream_chip(substream); in snd_hdspm_hw_params() local
5518 spin_lock_irq(&hdspm->lock); in snd_hdspm_hw_params()
5521 this_pid = hdspm->playback_pid; in snd_hdspm_hw_params()
5522 other_pid = hdspm->capture_pid; in snd_hdspm_hw_params()
5524 this_pid = hdspm->capture_pid; in snd_hdspm_hw_params()
5525 other_pid = hdspm->playback_pid; in snd_hdspm_hw_params()
5535 if (params_rate(params) != hdspm->system_sample_rate) { in snd_hdspm_hw_params()
5536 spin_unlock_irq(&hdspm->lock); in snd_hdspm_hw_params()
5542 if (params_period_size(params) != hdspm->period_bytes / 4) { in snd_hdspm_hw_params()
5543 spin_unlock_irq(&hdspm->lock); in snd_hdspm_hw_params()
5551 spin_unlock_irq(&hdspm->lock); in snd_hdspm_hw_params()
5555 spin_lock_irq(&hdspm->lock); in snd_hdspm_hw_params()
5556 err = hdspm_set_rate(hdspm, params_rate(params), 0); in snd_hdspm_hw_params()
5558 dev_info(hdspm->card->dev, "err on hdspm_set_rate: %d\n", err); in snd_hdspm_hw_params()
5559 spin_unlock_irq(&hdspm->lock); in snd_hdspm_hw_params()
5564 spin_unlock_irq(&hdspm->lock); in snd_hdspm_hw_params()
5566 err = hdspm_set_interrupt_interval(hdspm, in snd_hdspm_hw_params()
5569 dev_info(hdspm->card->dev, in snd_hdspm_hw_params()
5586 dev_info(hdspm->card->dev, in snd_hdspm_hw_params()
5593 hdspm_set_sgbuf(hdspm, substream, HDSPM_pageAddressBufferOut, in snd_hdspm_hw_params()
5597 snd_hdspm_enable_out(hdspm, i, 1); in snd_hdspm_hw_params()
5599 hdspm->playback_buffer = in snd_hdspm_hw_params()
5601 dev_dbg(hdspm->card->dev, in snd_hdspm_hw_params()
5603 hdspm->playback_buffer); in snd_hdspm_hw_params()
5605 hdspm_set_sgbuf(hdspm, substream, HDSPM_pageAddressBufferIn, in snd_hdspm_hw_params()
5609 snd_hdspm_enable_in(hdspm, i, 1); in snd_hdspm_hw_params()
5611 hdspm->capture_buffer = in snd_hdspm_hw_params()
5613 dev_dbg(hdspm->card->dev, in snd_hdspm_hw_params()
5615 hdspm->capture_buffer); in snd_hdspm_hw_params()
5640 if (hdspm->io_type == AES32) { in snd_hdspm_hw_params()
5647 if (!(hdspm->control_register & HDSPe_FLOAT_FORMAT)) in snd_hdspm_hw_params()
5648 dev_info(hdspm->card->dev, in snd_hdspm_hw_params()
5651 hdspm->control_register |= HDSPe_FLOAT_FORMAT; in snd_hdspm_hw_params()
5653 if (hdspm->control_register & HDSPe_FLOAT_FORMAT) in snd_hdspm_hw_params()
5654 dev_info(hdspm->card->dev, in snd_hdspm_hw_params()
5657 hdspm->control_register &= ~HDSPe_FLOAT_FORMAT; in snd_hdspm_hw_params()
5659 hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register); in snd_hdspm_hw_params()
5667 struct hdspm *hdspm = snd_pcm_substream_chip(substream); in snd_hdspm_hw_free() local
5673 for (i = 0; i < hdspm->max_channels_out; ++i) in snd_hdspm_hw_free()
5674 snd_hdspm_enable_out(hdspm, i, 0); in snd_hdspm_hw_free()
5676 hdspm->playback_buffer = NULL; in snd_hdspm_hw_free()
5678 for (i = 0; i < hdspm->max_channels_in; ++i) in snd_hdspm_hw_free()
5679 snd_hdspm_enable_in(hdspm, i, 0); in snd_hdspm_hw_free()
5681 hdspm->capture_buffer = NULL; in snd_hdspm_hw_free()
5694 struct hdspm *hdspm = snd_pcm_substream_chip(substream); in snd_hdspm_channel_info() local
5697 if (snd_BUG_ON(info->channel >= hdspm->max_channels_out)) { in snd_hdspm_channel_info()
5698 dev_info(hdspm->card->dev, in snd_hdspm_channel_info()
5704 if (hdspm->channel_map_out[info->channel] < 0) { in snd_hdspm_channel_info()
5705 dev_info(hdspm->card->dev, in snd_hdspm_channel_info()
5711 info->offset = hdspm->channel_map_out[info->channel] * in snd_hdspm_channel_info()
5714 if (snd_BUG_ON(info->channel >= hdspm->max_channels_in)) { in snd_hdspm_channel_info()
5715 dev_info(hdspm->card->dev, in snd_hdspm_channel_info()
5721 if (hdspm->channel_map_in[info->channel] < 0) { in snd_hdspm_channel_info()
5722 dev_info(hdspm->card->dev, in snd_hdspm_channel_info()
5728 info->offset = hdspm->channel_map_in[info->channel] * in snd_hdspm_channel_info()
5759 struct hdspm *hdspm = snd_pcm_substream_chip(substream); in snd_hdspm_trigger() local
5763 spin_lock(&hdspm->lock); in snd_hdspm_trigger()
5764 running = hdspm->running; in snd_hdspm_trigger()
5774 spin_unlock(&hdspm->lock); in snd_hdspm_trigger()
5778 other = hdspm->capture_substream; in snd_hdspm_trigger()
5780 other = hdspm->playback_substream; in snd_hdspm_trigger()
5798 hdspm_silence_playback(hdspm); in snd_hdspm_trigger()
5802 hdspm_silence_playback(hdspm); in snd_hdspm_trigger()
5806 hdspm_silence_playback(hdspm); in snd_hdspm_trigger()
5810 if (!hdspm->running && running) in snd_hdspm_trigger()
5811 hdspm_start_audio(hdspm); in snd_hdspm_trigger()
5812 else if (hdspm->running && !running) in snd_hdspm_trigger()
5813 hdspm_stop_audio(hdspm); in snd_hdspm_trigger()
5814 hdspm->running = running; in snd_hdspm_trigger()
5815 spin_unlock(&hdspm->lock); in snd_hdspm_trigger()
5878 struct hdspm *hdspm = rule->private; in snd_hdspm_hw_rule_in_channels_rate() local
5886 .min = hdspm->qs_in_channels, in snd_hdspm_hw_rule_in_channels_rate()
5887 .max = hdspm->qs_in_channels, in snd_hdspm_hw_rule_in_channels_rate()
5893 .min = hdspm->ds_in_channels, in snd_hdspm_hw_rule_in_channels_rate()
5894 .max = hdspm->ds_in_channels, in snd_hdspm_hw_rule_in_channels_rate()
5900 .min = hdspm->ss_in_channels, in snd_hdspm_hw_rule_in_channels_rate()
5901 .max = hdspm->ss_in_channels, in snd_hdspm_hw_rule_in_channels_rate()
5913 struct hdspm *hdspm = rule->private; in snd_hdspm_hw_rule_out_channels_rate() local
5921 .min = hdspm->qs_out_channels, in snd_hdspm_hw_rule_out_channels_rate()
5922 .max = hdspm->qs_out_channels, in snd_hdspm_hw_rule_out_channels_rate()
5928 .min = hdspm->ds_out_channels, in snd_hdspm_hw_rule_out_channels_rate()
5929 .max = hdspm->ds_out_channels, in snd_hdspm_hw_rule_out_channels_rate()
5935 .min = hdspm->ss_out_channels, in snd_hdspm_hw_rule_out_channels_rate()
5936 .max = hdspm->ss_out_channels, in snd_hdspm_hw_rule_out_channels_rate()
5948 struct hdspm *hdspm = rule->private; in snd_hdspm_hw_rule_rate_in_channels() local
5954 if (c->min >= hdspm->ss_in_channels) { in snd_hdspm_hw_rule_rate_in_channels()
5961 } else if (c->max <= hdspm->qs_in_channels) { in snd_hdspm_hw_rule_rate_in_channels()
5968 } else if (c->max <= hdspm->ds_in_channels) { in snd_hdspm_hw_rule_rate_in_channels()
5982 struct hdspm *hdspm = rule->private; in snd_hdspm_hw_rule_rate_out_channels() local
5988 if (c->min >= hdspm->ss_out_channels) { in snd_hdspm_hw_rule_rate_out_channels()
5995 } else if (c->max <= hdspm->qs_out_channels) { in snd_hdspm_hw_rule_rate_out_channels()
6002 } else if (c->max <= hdspm->ds_out_channels) { in snd_hdspm_hw_rule_rate_out_channels()
6018 struct hdspm *hdspm = rule->private; in snd_hdspm_hw_rule_in_channels() local
6022 list[0] = hdspm->qs_in_channels; in snd_hdspm_hw_rule_in_channels()
6023 list[1] = hdspm->ds_in_channels; in snd_hdspm_hw_rule_in_channels()
6024 list[2] = hdspm->ss_in_channels; in snd_hdspm_hw_rule_in_channels()
6032 struct hdspm *hdspm = rule->private; in snd_hdspm_hw_rule_out_channels() local
6036 list[0] = hdspm->qs_out_channels; in snd_hdspm_hw_rule_out_channels()
6037 list[1] = hdspm->ds_out_channels; in snd_hdspm_hw_rule_out_channels()
6038 list[2] = hdspm->ss_out_channels; in snd_hdspm_hw_rule_out_channels()
6056 struct hdspm *hdspm = snd_pcm_substream_chip(substream); in snd_hdspm_open() local
6060 spin_lock_irq(&hdspm->lock); in snd_hdspm_open()
6066 if (hdspm->capture_substream == NULL) in snd_hdspm_open()
6067 hdspm_stop_audio(hdspm); in snd_hdspm_open()
6069 hdspm->playback_pid = current->pid; in snd_hdspm_open()
6070 hdspm->playback_substream = substream; in snd_hdspm_open()
6072 if (hdspm->playback_substream == NULL) in snd_hdspm_open()
6073 hdspm_stop_audio(hdspm); in snd_hdspm_open()
6075 hdspm->capture_pid = current->pid; in snd_hdspm_open()
6076 hdspm->capture_substream = substream; in snd_hdspm_open()
6079 spin_unlock_irq(&hdspm->lock); in snd_hdspm_open()
6084 switch (hdspm->io_type) { in snd_hdspm_open()
6105 if (AES32 == hdspm->io_type) { in snd_hdspm_open()
6113 snd_hdspm_hw_rule_rate_in_channels), hdspm, in snd_hdspm_open()
6119 snd_hdspm_hw_rule_in_channels), hdspm, in snd_hdspm_open()
6124 snd_hdspm_hw_rule_in_channels_rate), hdspm, in snd_hdspm_open()
6132 struct hdspm *hdspm = snd_pcm_substream_chip(substream); in snd_hdspm_release() local
6135 spin_lock_irq(&hdspm->lock); in snd_hdspm_release()
6138 hdspm->playback_pid = -1; in snd_hdspm_release()
6139 hdspm->playback_substream = NULL; in snd_hdspm_release()
6141 hdspm->capture_pid = -1; in snd_hdspm_release()
6142 hdspm->capture_substream = NULL; in snd_hdspm_release()
6145 spin_unlock_irq(&hdspm->lock); in snd_hdspm_release()
6166 struct hdspm *hdspm = hw->private_data; in snd_hdspm_hwdep_ioctl() local
6180 levels = &hdspm->peak_rms; in snd_hdspm_hwdep_ioctl()
6183 readl(hdspm->iobase + in snd_hdspm_hwdep_ioctl()
6186 readl(hdspm->iobase + in snd_hdspm_hwdep_ioctl()
6189 readl(hdspm->iobase + in snd_hdspm_hwdep_ioctl()
6193 ((uint64_t) readl(hdspm->iobase + in snd_hdspm_hwdep_ioctl()
6195 (uint64_t) readl(hdspm->iobase + in snd_hdspm_hwdep_ioctl()
6198 ((uint64_t)readl(hdspm->iobase + in snd_hdspm_hwdep_ioctl()
6200 (uint64_t)readl(hdspm->iobase + in snd_hdspm_hwdep_ioctl()
6203 ((uint64_t)readl(hdspm->iobase + in snd_hdspm_hwdep_ioctl()
6205 (uint64_t)readl(hdspm->iobase + in snd_hdspm_hwdep_ioctl()
6209 if (hdspm->system_sample_rate > 96000) { in snd_hdspm_hwdep_ioctl()
6211 } else if (hdspm->system_sample_rate > 48000) { in snd_hdspm_hwdep_ioctl()
6216 levels->status2 = hdspm_read(hdspm, HDSPM_statusRegister2); in snd_hdspm_hwdep_ioctl()
6228 ltc.ltc = hdspm_read(hdspm, HDSPM_RD_TCO); in snd_hdspm_hwdep_ioctl()
6229 i = hdspm_read(hdspm, HDSPM_RD_TCO + 4); in snd_hdspm_hwdep_ioctl()
6275 spin_lock_irq(&hdspm->lock); in snd_hdspm_hwdep_ioctl()
6276 info.pref_sync_ref = hdspm_pref_sync_ref(hdspm); in snd_hdspm_hwdep_ioctl()
6277 info.wordclock_sync_check = hdspm_wc_sync_check(hdspm); in snd_hdspm_hwdep_ioctl()
6279 info.system_sample_rate = hdspm->system_sample_rate; in snd_hdspm_hwdep_ioctl()
6281 hdspm_external_sample_rate(hdspm); in snd_hdspm_hwdep_ioctl()
6282 info.system_clock_mode = hdspm_system_clock_mode(hdspm); in snd_hdspm_hwdep_ioctl()
6283 info.clock_source = hdspm_clock_source(hdspm); in snd_hdspm_hwdep_ioctl()
6284 info.autosync_ref = hdspm_autosync_ref(hdspm); in snd_hdspm_hwdep_ioctl()
6285 info.line_out = hdspm_toggle_setting(hdspm, HDSPM_LineOut); in snd_hdspm_hwdep_ioctl()
6287 spin_unlock_irq(&hdspm->lock); in snd_hdspm_hwdep_ioctl()
6295 status.card_type = hdspm->io_type; in snd_hdspm_hwdep_ioctl()
6297 status.autosync_source = hdspm_autosync_ref(hdspm); in snd_hdspm_hwdep_ioctl()
6300 status.master_period = hdspm_read(hdspm, HDSPM_RD_PLL_FREQ); in snd_hdspm_hwdep_ioctl()
6302 switch (hdspm->io_type) { in snd_hdspm_hwdep_ioctl()
6306 hdspm_wc_sync_check(hdspm); in snd_hdspm_hwdep_ioctl()
6308 hdspm_madi_sync_check(hdspm); in snd_hdspm_hwdep_ioctl()
6310 hdspm_tco_sync_check(hdspm); in snd_hdspm_hwdep_ioctl()
6312 hdspm_sync_in_sync_check(hdspm); in snd_hdspm_hwdep_ioctl()
6315 hdspm_read(hdspm, HDSPM_statusRegister); in snd_hdspm_hwdep_ioctl()
6336 hdspm_version.card_type = hdspm->io_type; in snd_hdspm_hwdep_ioctl()
6337 strlcpy(hdspm_version.cardname, hdspm->card_name, in snd_hdspm_hwdep_ioctl()
6339 hdspm_version.serial = hdspm->serial; in snd_hdspm_hwdep_ioctl()
6340 hdspm_version.firmware_rev = hdspm->firmware_rev; in snd_hdspm_hwdep_ioctl()
6342 if (hdspm->tco) in snd_hdspm_hwdep_ioctl()
6353 if (copy_to_user((void __user *)mixer.mixer, hdspm->mixer, in snd_hdspm_hwdep_ioctl()
6377 struct hdspm *hdspm) in snd_hdspm_create_hwdep() argument
6386 hdspm->hwdep = hw; in snd_hdspm_create_hwdep()
6387 hw->private_data = hdspm; in snd_hdspm_create_hwdep()
6402 static int snd_hdspm_preallocate_memory(struct hdspm *hdspm) in snd_hdspm_preallocate_memory() argument
6408 pcm = hdspm->pcm; in snd_hdspm_preallocate_memory()
6415 snd_dma_pci_data(hdspm->pci), in snd_hdspm_preallocate_memory()
6419 dev_dbg(hdspm->card->dev, in snd_hdspm_preallocate_memory()
6424 dev_dbg(hdspm->card->dev, in snd_hdspm_preallocate_memory()
6431 static void hdspm_set_sgbuf(struct hdspm *hdspm, in hdspm_set_sgbuf() argument
6439 hdspm_write(hdspm, reg + 4 * i, in hdspm_set_sgbuf()
6446 struct hdspm *hdspm) in snd_hdspm_create_pcm() argument
6451 err = snd_pcm_new(card, hdspm->card_name, 0, 1, 1, &pcm); in snd_hdspm_create_pcm()
6455 hdspm->pcm = pcm; in snd_hdspm_create_pcm()
6456 pcm->private_data = hdspm; in snd_hdspm_create_pcm()
6457 strcpy(pcm->name, hdspm->card_name); in snd_hdspm_create_pcm()
6466 err = snd_hdspm_preallocate_memory(hdspm); in snd_hdspm_create_pcm()
6473 static inline void snd_hdspm_initialize_midi_flush(struct hdspm * hdspm) in snd_hdspm_initialize_midi_flush() argument
6477 for (i = 0; i < hdspm->midiPorts; i++) in snd_hdspm_initialize_midi_flush()
6478 snd_hdspm_flush_midi_input(hdspm, i); in snd_hdspm_initialize_midi_flush()
6482 struct hdspm *hdspm) in snd_hdspm_create_alsa_devices() argument
6487 err = snd_hdspm_create_pcm(card, hdspm); in snd_hdspm_create_alsa_devices()
6492 while (i < hdspm->midiPorts) { in snd_hdspm_create_alsa_devices()
6493 err = snd_hdspm_create_midi(card, hdspm, i); in snd_hdspm_create_alsa_devices()
6500 err = snd_hdspm_create_controls(card, hdspm); in snd_hdspm_create_alsa_devices()
6504 err = snd_hdspm_create_hwdep(card, hdspm); in snd_hdspm_create_alsa_devices()
6509 snd_hdspm_proc_init(hdspm); in snd_hdspm_create_alsa_devices()
6511 hdspm->system_sample_rate = -1; in snd_hdspm_create_alsa_devices()
6512 hdspm->last_external_sample_rate = -1; in snd_hdspm_create_alsa_devices()
6513 hdspm->last_internal_sample_rate = -1; in snd_hdspm_create_alsa_devices()
6514 hdspm->playback_pid = -1; in snd_hdspm_create_alsa_devices()
6515 hdspm->capture_pid = -1; in snd_hdspm_create_alsa_devices()
6516 hdspm->capture_substream = NULL; in snd_hdspm_create_alsa_devices()
6517 hdspm->playback_substream = NULL; in snd_hdspm_create_alsa_devices()
6520 err = snd_hdspm_set_defaults(hdspm); in snd_hdspm_create_alsa_devices()
6525 hdspm_update_simple_mixer_controls(hdspm); in snd_hdspm_create_alsa_devices()
6541 struct hdspm *hdspm) in snd_hdspm_create() argument
6544 struct pci_dev *pci = hdspm->pci; in snd_hdspm_create()
6548 hdspm->irq = -1; in snd_hdspm_create()
6549 hdspm->card = card; in snd_hdspm_create()
6551 spin_lock_init(&hdspm->lock); in snd_hdspm_create()
6553 pci_read_config_word(hdspm->pci, in snd_hdspm_create()
6554 PCI_CLASS_REVISION, &hdspm->firmware_rev); in snd_hdspm_create()
6559 switch (hdspm->firmware_rev) { in snd_hdspm_create()
6561 hdspm->io_type = RayDAT; in snd_hdspm_create()
6562 hdspm->card_name = "RME RayDAT"; in snd_hdspm_create()
6563 hdspm->midiPorts = 2; in snd_hdspm_create()
6566 hdspm->io_type = AIO; in snd_hdspm_create()
6567 hdspm->card_name = "RME AIO"; in snd_hdspm_create()
6568 hdspm->midiPorts = 1; in snd_hdspm_create()
6571 hdspm->io_type = MADIface; in snd_hdspm_create()
6572 hdspm->card_name = "RME MADIface"; in snd_hdspm_create()
6573 hdspm->midiPorts = 1; in snd_hdspm_create()
6576 if ((hdspm->firmware_rev == 0xf0) || in snd_hdspm_create()
6577 ((hdspm->firmware_rev >= 0xe6) && in snd_hdspm_create()
6578 (hdspm->firmware_rev <= 0xea))) { in snd_hdspm_create()
6579 hdspm->io_type = AES32; in snd_hdspm_create()
6580 hdspm->card_name = "RME AES32"; in snd_hdspm_create()
6581 hdspm->midiPorts = 2; in snd_hdspm_create()
6582 } else if ((hdspm->firmware_rev == 0xd2) || in snd_hdspm_create()
6583 ((hdspm->firmware_rev >= 0xc8) && in snd_hdspm_create()
6584 (hdspm->firmware_rev <= 0xcf))) { in snd_hdspm_create()
6585 hdspm->io_type = MADI; in snd_hdspm_create()
6586 hdspm->card_name = "RME MADI"; in snd_hdspm_create()
6587 hdspm->midiPorts = 3; in snd_hdspm_create()
6591 hdspm->firmware_rev); in snd_hdspm_create()
6600 pci_set_master(hdspm->pci); in snd_hdspm_create()
6606 hdspm->port = pci_resource_start(pci, 0); in snd_hdspm_create()
6610 hdspm->port, hdspm->port + io_extent - 1); in snd_hdspm_create()
6612 hdspm->iobase = ioremap_nocache(hdspm->port, io_extent); in snd_hdspm_create()
6613 if (!hdspm->iobase) { in snd_hdspm_create()
6615 hdspm->port, hdspm->port + io_extent - 1); in snd_hdspm_create()
6619 (unsigned long)hdspm->iobase, hdspm->port, in snd_hdspm_create()
6620 hdspm->port + io_extent - 1); in snd_hdspm_create()
6623 IRQF_SHARED, KBUILD_MODNAME, hdspm)) { in snd_hdspm_create()
6630 hdspm->irq = pci->irq; in snd_hdspm_create()
6634 hdspm->mixer = kzalloc(sizeof(struct hdspm_mixer), GFP_KERNEL); in snd_hdspm_create()
6635 if (!hdspm->mixer) { in snd_hdspm_create()
6642 hdspm->port_names_in = NULL; in snd_hdspm_create()
6643 hdspm->port_names_out = NULL; in snd_hdspm_create()
6645 switch (hdspm->io_type) { in snd_hdspm_create()
6647 hdspm->ss_in_channels = hdspm->ss_out_channels = AES32_CHANNELS; in snd_hdspm_create()
6648 hdspm->ds_in_channels = hdspm->ds_out_channels = AES32_CHANNELS; in snd_hdspm_create()
6649 hdspm->qs_in_channels = hdspm->qs_out_channels = AES32_CHANNELS; in snd_hdspm_create()
6651 hdspm->channel_map_in_ss = hdspm->channel_map_out_ss = in snd_hdspm_create()
6653 hdspm->channel_map_in_ds = hdspm->channel_map_out_ds = in snd_hdspm_create()
6655 hdspm->channel_map_in_qs = hdspm->channel_map_out_qs = in snd_hdspm_create()
6657 hdspm->port_names_in_ss = hdspm->port_names_out_ss = in snd_hdspm_create()
6659 hdspm->port_names_in_ds = hdspm->port_names_out_ds = in snd_hdspm_create()
6661 hdspm->port_names_in_qs = hdspm->port_names_out_qs = in snd_hdspm_create()
6664 hdspm->max_channels_out = hdspm->max_channels_in = in snd_hdspm_create()
6666 hdspm->port_names_in = hdspm->port_names_out = in snd_hdspm_create()
6668 hdspm->channel_map_in = hdspm->channel_map_out = in snd_hdspm_create()
6675 hdspm->ss_in_channels = hdspm->ss_out_channels = in snd_hdspm_create()
6677 hdspm->ds_in_channels = hdspm->ds_out_channels = in snd_hdspm_create()
6679 hdspm->qs_in_channels = hdspm->qs_out_channels = in snd_hdspm_create()
6682 hdspm->channel_map_in_ss = hdspm->channel_map_out_ss = in snd_hdspm_create()
6684 hdspm->channel_map_in_ds = hdspm->channel_map_out_ds = in snd_hdspm_create()
6686 hdspm->channel_map_in_qs = hdspm->channel_map_out_qs = in snd_hdspm_create()
6689 hdspm->port_names_in_ss = hdspm->port_names_out_ss = in snd_hdspm_create()
6691 hdspm->port_names_in_ds = hdspm->port_names_out_ds = in snd_hdspm_create()
6693 hdspm->port_names_in_qs = hdspm->port_names_out_qs = in snd_hdspm_create()
6698 hdspm->ss_in_channels = AIO_IN_SS_CHANNELS; in snd_hdspm_create()
6699 hdspm->ds_in_channels = AIO_IN_DS_CHANNELS; in snd_hdspm_create()
6700 hdspm->qs_in_channels = AIO_IN_QS_CHANNELS; in snd_hdspm_create()
6701 hdspm->ss_out_channels = AIO_OUT_SS_CHANNELS; in snd_hdspm_create()
6702 hdspm->ds_out_channels = AIO_OUT_DS_CHANNELS; in snd_hdspm_create()
6703 hdspm->qs_out_channels = AIO_OUT_QS_CHANNELS; in snd_hdspm_create()
6705 if (0 == (hdspm_read(hdspm, HDSPM_statusRegister2) & HDSPM_s2_AEBI_D)) { in snd_hdspm_create()
6707 hdspm->ss_in_channels += 4; in snd_hdspm_create()
6708 hdspm->ds_in_channels += 4; in snd_hdspm_create()
6709 hdspm->qs_in_channels += 4; in snd_hdspm_create()
6712 if (0 == (hdspm_read(hdspm, HDSPM_statusRegister2) & HDSPM_s2_AEBO_D)) { in snd_hdspm_create()
6714 hdspm->ss_out_channels += 4; in snd_hdspm_create()
6715 hdspm->ds_out_channels += 4; in snd_hdspm_create()
6716 hdspm->qs_out_channels += 4; in snd_hdspm_create()
6719 hdspm->channel_map_out_ss = channel_map_aio_out_ss; in snd_hdspm_create()
6720 hdspm->channel_map_out_ds = channel_map_aio_out_ds; in snd_hdspm_create()
6721 hdspm->channel_map_out_qs = channel_map_aio_out_qs; in snd_hdspm_create()
6723 hdspm->channel_map_in_ss = channel_map_aio_in_ss; in snd_hdspm_create()
6724 hdspm->channel_map_in_ds = channel_map_aio_in_ds; in snd_hdspm_create()
6725 hdspm->channel_map_in_qs = channel_map_aio_in_qs; in snd_hdspm_create()
6727 hdspm->port_names_in_ss = texts_ports_aio_in_ss; in snd_hdspm_create()
6728 hdspm->port_names_out_ss = texts_ports_aio_out_ss; in snd_hdspm_create()
6729 hdspm->port_names_in_ds = texts_ports_aio_in_ds; in snd_hdspm_create()
6730 hdspm->port_names_out_ds = texts_ports_aio_out_ds; in snd_hdspm_create()
6731 hdspm->port_names_in_qs = texts_ports_aio_in_qs; in snd_hdspm_create()
6732 hdspm->port_names_out_qs = texts_ports_aio_out_qs; in snd_hdspm_create()
6737 hdspm->ss_in_channels = hdspm->ss_out_channels = in snd_hdspm_create()
6739 hdspm->ds_in_channels = hdspm->ds_out_channels = in snd_hdspm_create()
6741 hdspm->qs_in_channels = hdspm->qs_out_channels = in snd_hdspm_create()
6744 hdspm->max_channels_in = RAYDAT_SS_CHANNELS; in snd_hdspm_create()
6745 hdspm->max_channels_out = RAYDAT_SS_CHANNELS; in snd_hdspm_create()
6747 hdspm->channel_map_in_ss = hdspm->channel_map_out_ss = in snd_hdspm_create()
6749 hdspm->channel_map_in_ds = hdspm->channel_map_out_ds = in snd_hdspm_create()
6751 hdspm->channel_map_in_qs = hdspm->channel_map_out_qs = in snd_hdspm_create()
6753 hdspm->channel_map_in = hdspm->channel_map_out = in snd_hdspm_create()
6756 hdspm->port_names_in_ss = hdspm->port_names_out_ss = in snd_hdspm_create()
6758 hdspm->port_names_in_ds = hdspm->port_names_out_ds = in snd_hdspm_create()
6760 hdspm->port_names_in_qs = hdspm->port_names_out_qs = in snd_hdspm_create()
6769 switch (hdspm->io_type) { in snd_hdspm_create()
6772 if (hdspm_read(hdspm, HDSPM_statusRegister2) & in snd_hdspm_create()
6774 hdspm->midiPorts++; in snd_hdspm_create()
6775 hdspm->tco = kzalloc(sizeof(struct hdspm_tco), in snd_hdspm_create()
6777 if (NULL != hdspm->tco) { in snd_hdspm_create()
6778 hdspm_tco_write(hdspm); in snd_hdspm_create()
6782 hdspm->tco = NULL; in snd_hdspm_create()
6788 if (hdspm_read(hdspm, HDSPM_statusRegister) & HDSPM_tco_detect) { in snd_hdspm_create()
6789 hdspm->midiPorts++; in snd_hdspm_create()
6790 hdspm->tco = kzalloc(sizeof(struct hdspm_tco), in snd_hdspm_create()
6792 if (NULL != hdspm->tco) { in snd_hdspm_create()
6793 hdspm_tco_write(hdspm); in snd_hdspm_create()
6797 hdspm->tco = NULL; in snd_hdspm_create()
6802 hdspm->tco = NULL; in snd_hdspm_create()
6806 switch (hdspm->io_type) { in snd_hdspm_create()
6808 if (hdspm->tco) { in snd_hdspm_create()
6809 hdspm->texts_autosync = texts_autosync_aes_tco; in snd_hdspm_create()
6810 hdspm->texts_autosync_items = in snd_hdspm_create()
6813 hdspm->texts_autosync = texts_autosync_aes; in snd_hdspm_create()
6814 hdspm->texts_autosync_items = in snd_hdspm_create()
6820 if (hdspm->tco) { in snd_hdspm_create()
6821 hdspm->texts_autosync = texts_autosync_madi_tco; in snd_hdspm_create()
6822 hdspm->texts_autosync_items = 4; in snd_hdspm_create()
6824 hdspm->texts_autosync = texts_autosync_madi; in snd_hdspm_create()
6825 hdspm->texts_autosync_items = 3; in snd_hdspm_create()
6834 if (hdspm->tco) { in snd_hdspm_create()
6835 hdspm->texts_autosync = texts_autosync_raydat_tco; in snd_hdspm_create()
6836 hdspm->texts_autosync_items = 9; in snd_hdspm_create()
6838 hdspm->texts_autosync = texts_autosync_raydat; in snd_hdspm_create()
6839 hdspm->texts_autosync_items = 8; in snd_hdspm_create()
6844 if (hdspm->tco) { in snd_hdspm_create()
6845 hdspm->texts_autosync = texts_autosync_aio_tco; in snd_hdspm_create()
6846 hdspm->texts_autosync_items = 6; in snd_hdspm_create()
6848 hdspm->texts_autosync = texts_autosync_aio; in snd_hdspm_create()
6849 hdspm->texts_autosync_items = 5; in snd_hdspm_create()
6855 tasklet_init(&hdspm->midi_tasklet, in snd_hdspm_create()
6856 hdspm_midi_tasklet, (unsigned long) hdspm); in snd_hdspm_create()
6859 if (hdspm->io_type != MADIface) { in snd_hdspm_create()
6860 hdspm->serial = (hdspm_read(hdspm, in snd_hdspm_create()
6871 if (NULL == id[hdspm->dev] && hdspm->serial != 0xFFFFFF) { in snd_hdspm_create()
6872 sprintf(card->id, "HDSPMx%06x", hdspm->serial); in snd_hdspm_create()
6878 err = snd_hdspm_create_alsa_devices(card, hdspm); in snd_hdspm_create()
6882 snd_hdspm_initialize_midi_flush(hdspm); in snd_hdspm_create()
6888 static int snd_hdspm_free(struct hdspm * hdspm) in snd_hdspm_free() argument
6891 if (hdspm->port) { in snd_hdspm_free()
6894 hdspm->control_register &= in snd_hdspm_free()
6898 hdspm_write(hdspm, HDSPM_controlRegister, in snd_hdspm_free()
6899 hdspm->control_register); in snd_hdspm_free()
6902 if (hdspm->irq >= 0) in snd_hdspm_free()
6903 free_irq(hdspm->irq, (void *) hdspm); in snd_hdspm_free()
6905 kfree(hdspm->mixer); in snd_hdspm_free()
6906 iounmap(hdspm->iobase); in snd_hdspm_free()
6908 if (hdspm->port) in snd_hdspm_free()
6909 pci_release_regions(hdspm->pci); in snd_hdspm_free()
6911 pci_disable_device(hdspm->pci); in snd_hdspm_free()
6918 struct hdspm *hdspm = card->private_data; in snd_hdspm_card_free() local
6920 if (hdspm) in snd_hdspm_card_free()
6921 snd_hdspm_free(hdspm); in snd_hdspm_card_free()
6929 struct hdspm *hdspm; in snd_hdspm_probe() local
6941 THIS_MODULE, sizeof(struct hdspm), &card); in snd_hdspm_probe()
6945 hdspm = card->private_data; in snd_hdspm_probe()
6947 hdspm->dev = dev; in snd_hdspm_probe()
6948 hdspm->pci = pci; in snd_hdspm_probe()
6950 err = snd_hdspm_create(card, hdspm); in snd_hdspm_probe()
6956 if (hdspm->io_type != MADIface) { in snd_hdspm_probe()
6958 hdspm->card_name, in snd_hdspm_probe()
6959 hdspm->serial); in snd_hdspm_probe()
6961 hdspm->card_name, in snd_hdspm_probe()
6962 hdspm->serial, in snd_hdspm_probe()
6963 hdspm->port, hdspm->irq); in snd_hdspm_probe()
6965 sprintf(card->shortname, "%s", hdspm->card_name); in snd_hdspm_probe()
6967 hdspm->card_name, hdspm->port, hdspm->irq); in snd_hdspm_probe()