Lines Matching refs:hdspm
956 struct hdspm *hdspm; member
982 struct hdspm { struct
1090 struct hdspm *hdspm); argument
1092 struct hdspm *hdspm);
1094 static inline void snd_hdspm_initialize_midi_flush(struct hdspm *hdspm);
1095 static inline int hdspm_get_pll_freq(struct hdspm *hdspm);
1096 static int hdspm_update_simple_mixer_controls(struct hdspm *hdspm);
1097 static int hdspm_autosync_ref(struct hdspm *hdspm);
1098 static int hdspm_set_toggle_setting(struct hdspm *hdspm, u32 regmask, int out);
1099 static int snd_hdspm_set_defaults(struct hdspm *hdspm);
1100 static int hdspm_system_clock_mode(struct hdspm *hdspm);
1101 static void hdspm_set_channel_dma_addr(struct hdspm *hdspm,
1105 static int hdspm_aes_sync_check(struct hdspm *hdspm, int idx);
1106 static int hdspm_wc_sync_check(struct hdspm *hdspm);
1107 static int hdspm_tco_sync_check(struct hdspm *hdspm);
1108 static int hdspm_sync_in_sync_check(struct hdspm *hdspm);
1110 static int hdspm_get_aes_sample_rate(struct hdspm *hdspm, int index);
1111 static int hdspm_get_tco_sample_rate(struct hdspm *hdspm);
1112 static int hdspm_get_wc_sample_rate(struct hdspm *hdspm);
1126 static bool hdspm_is_raydat_or_aio(struct hdspm *hdspm) in hdspm_is_raydat_or_aio() argument
1128 return ((AIO == hdspm->io_type) || (RayDAT == hdspm->io_type)); in hdspm_is_raydat_or_aio()
1135 static inline void hdspm_write(struct hdspm * hdspm, unsigned int reg, in hdspm_write() argument
1138 writel(val, hdspm->iobase + reg); in hdspm_write()
1141 static inline unsigned int hdspm_read(struct hdspm * hdspm, unsigned int reg) in hdspm_read() argument
1143 return readl(hdspm->iobase + reg); in hdspm_read()
1150 static inline int hdspm_read_in_gain(struct hdspm * hdspm, unsigned int chan, in hdspm_read_in_gain() argument
1156 return hdspm->mixer->ch[chan].in[in]; in hdspm_read_in_gain()
1159 static inline int hdspm_read_pb_gain(struct hdspm * hdspm, unsigned int chan, in hdspm_read_pb_gain() argument
1164 return hdspm->mixer->ch[chan].pb[pb]; in hdspm_read_pb_gain()
1167 static int hdspm_write_in_gain(struct hdspm *hdspm, unsigned int chan, in hdspm_write_in_gain() argument
1173 hdspm_write(hdspm, in hdspm_write_in_gain()
1176 (hdspm->mixer->ch[chan].in[in] = data & 0xFFFF)); in hdspm_write_in_gain()
1180 static int hdspm_write_pb_gain(struct hdspm *hdspm, unsigned int chan, in hdspm_write_pb_gain() argument
1186 hdspm_write(hdspm, in hdspm_write_pb_gain()
1189 (hdspm->mixer->ch[chan].pb[pb] = data & 0xFFFF)); in hdspm_write_pb_gain()
1195 static inline void snd_hdspm_enable_in(struct hdspm * hdspm, int i, int v) in snd_hdspm_enable_in() argument
1197 hdspm_write(hdspm, HDSPM_inputEnableBase + (4 * i), v); in snd_hdspm_enable_in()
1200 static inline void snd_hdspm_enable_out(struct hdspm * hdspm, int i, int v) in snd_hdspm_enable_out() argument
1202 hdspm_write(hdspm, HDSPM_outputEnableBase + (4 * i), v); in snd_hdspm_enable_out()
1206 static int snd_hdspm_use_is_exclusive(struct hdspm *hdspm) in snd_hdspm_use_is_exclusive() argument
1211 spin_lock_irqsave(&hdspm->lock, flags); in snd_hdspm_use_is_exclusive()
1212 if ((hdspm->playback_pid != hdspm->capture_pid) && in snd_hdspm_use_is_exclusive()
1213 (hdspm->playback_pid >= 0) && (hdspm->capture_pid >= 0)) { in snd_hdspm_use_is_exclusive()
1216 spin_unlock_irqrestore(&hdspm->lock, flags); in snd_hdspm_use_is_exclusive()
1239 static int hdspm_rate_multiplier(struct hdspm *hdspm, int rate) in hdspm_rate_multiplier() argument
1242 if (hdspm->control_register & HDSPM_QuadSpeed) in hdspm_rate_multiplier()
1244 else if (hdspm->control_register & in hdspm_rate_multiplier()
1252 static int hdspm_external_sample_rate(struct hdspm *hdspm) in hdspm_external_sample_rate() argument
1257 switch (hdspm->io_type) { in hdspm_external_sample_rate()
1259 status2 = hdspm_read(hdspm, HDSPM_statusRegister2); in hdspm_external_sample_rate()
1260 status = hdspm_read(hdspm, HDSPM_statusRegister); in hdspm_external_sample_rate()
1262 syncref = hdspm_autosync_ref(hdspm); in hdspm_external_sample_rate()
1266 if (hdspm_wc_sync_check(hdspm)) in hdspm_external_sample_rate()
1267 return HDSPM_bit2freq(hdspm_get_wc_sample_rate(hdspm)); in hdspm_external_sample_rate()
1279 if (hdspm_aes_sync_check(hdspm, syncref - HDSPM_AES32_AUTOSYNC_FROM_AES1)) in hdspm_external_sample_rate()
1280 return HDSPM_bit2freq(hdspm_get_aes_sample_rate(hdspm, in hdspm_external_sample_rate()
1287 if (hdspm_tco_sync_check(hdspm)) in hdspm_external_sample_rate()
1288 return HDSPM_bit2freq(hdspm_get_tco_sample_rate(hdspm)); in hdspm_external_sample_rate()
1296 status = hdspm_read(hdspm, HDSPM_statusRegister); in hdspm_external_sample_rate()
1330 status2 = hdspm_read(hdspm, HDSPM_statusRegister2); in hdspm_external_sample_rate()
1331 status = hdspm_read(hdspm, HDSPM_statusRegister); in hdspm_external_sample_rate()
1380 return hdspm_rate_multiplier(hdspm, rate); in hdspm_external_sample_rate()
1426 syncref = hdspm_autosync_ref(hdspm); in hdspm_external_sample_rate()
1430 hdspm_tco_sync_check(hdspm)); in hdspm_external_sample_rate()
1434 hdspm_sync_in_sync_check(hdspm)); in hdspm_external_sample_rate()
1439 hdspm_get_pll_freq(hdspm)); in hdspm_external_sample_rate()
1443 rate = hdspm_rate_multiplier(hdspm, rate); in hdspm_external_sample_rate()
1452 static int hdspm_get_latency(struct hdspm *hdspm) in hdspm_get_latency() argument
1456 n = hdspm_decode_latency(hdspm->control_register); in hdspm_get_latency()
1465 if ((7 == n) && (RayDAT == hdspm->io_type || AIO == hdspm->io_type)) in hdspm_get_latency()
1472 static inline void hdspm_compute_period_size(struct hdspm *hdspm) in hdspm_compute_period_size() argument
1474 hdspm->period_bytes = 4 * hdspm_get_latency(hdspm); in hdspm_compute_period_size()
1478 static snd_pcm_uframes_t hdspm_hw_pointer(struct hdspm *hdspm) in hdspm_hw_pointer() argument
1482 position = hdspm_read(hdspm, HDSPM_statusRegister); in hdspm_hw_pointer()
1484 switch (hdspm->io_type) { in hdspm_hw_pointer()
1492 (hdspm->period_bytes / 4) : 0; in hdspm_hw_pointer()
1499 static inline void hdspm_start_audio(struct hdspm * s) in hdspm_start_audio()
1505 static inline void hdspm_stop_audio(struct hdspm * s) in hdspm_stop_audio()
1512 static void hdspm_silence_playback(struct hdspm *hdspm) in hdspm_silence_playback() argument
1515 int n = hdspm->period_bytes; in hdspm_silence_playback()
1516 void *buf = hdspm->playback_buffer; in hdspm_silence_playback()
1527 static int hdspm_set_interrupt_interval(struct hdspm *s, unsigned int frames) in hdspm_set_interrupt_interval()
1566 static u64 hdspm_calc_dds_value(struct hdspm *hdspm, u64 period) in hdspm_calc_dds_value() argument
1573 switch (hdspm->io_type) { in hdspm_calc_dds_value()
1594 static void hdspm_set_dds_value(struct hdspm *hdspm, int rate) in hdspm_set_dds_value() argument
1606 switch (hdspm->io_type) { in hdspm_set_dds_value()
1626 hdspm_write(hdspm, HDSPM_freqReg, (u32)n); in hdspm_set_dds_value()
1630 static int hdspm_set_rate(struct hdspm * hdspm, int rate, int called_internally) in hdspm_set_rate() argument
1641 if (!(hdspm->control_register & HDSPM_ClockModeMaster)) { in hdspm_set_rate()
1650 dev_warn(hdspm->card->dev, in hdspm_set_rate()
1657 hdspm_external_sample_rate(hdspm); in hdspm_set_rate()
1659 if (hdspm_autosync_ref(hdspm) == in hdspm_set_rate()
1662 dev_warn(hdspm->card->dev, in hdspm_set_rate()
1668 dev_warn(hdspm->card->dev, in hdspm_set_rate()
1675 current_rate = hdspm->system_sample_rate; in hdspm_set_rate()
1734 && (hdspm->capture_pid >= 0 || hdspm->playback_pid >= 0)) { in hdspm_set_rate()
1735 dev_err(hdspm->card->dev, in hdspm_set_rate()
1739 hdspm->capture_pid, hdspm->playback_pid); in hdspm_set_rate()
1743 hdspm->control_register &= ~HDSPM_FrequencyMask; in hdspm_set_rate()
1744 hdspm->control_register |= rate_bits; in hdspm_set_rate()
1745 hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register); in hdspm_set_rate()
1749 hdspm_set_dds_value(hdspm, rate); in hdspm_set_rate()
1751 if (AES32 == hdspm->io_type && rate != current_rate) in hdspm_set_rate()
1752 hdspm_write(hdspm, HDSPM_eeprom_wr, 0); in hdspm_set_rate()
1754 hdspm->system_sample_rate = rate; in hdspm_set_rate()
1757 hdspm->channel_map_in = hdspm->channel_map_in_ss; in hdspm_set_rate()
1758 hdspm->channel_map_out = hdspm->channel_map_out_ss; in hdspm_set_rate()
1759 hdspm->max_channels_in = hdspm->ss_in_channels; in hdspm_set_rate()
1760 hdspm->max_channels_out = hdspm->ss_out_channels; in hdspm_set_rate()
1761 hdspm->port_names_in = hdspm->port_names_in_ss; in hdspm_set_rate()
1762 hdspm->port_names_out = hdspm->port_names_out_ss; in hdspm_set_rate()
1764 hdspm->channel_map_in = hdspm->channel_map_in_ds; in hdspm_set_rate()
1765 hdspm->channel_map_out = hdspm->channel_map_out_ds; in hdspm_set_rate()
1766 hdspm->max_channels_in = hdspm->ds_in_channels; in hdspm_set_rate()
1767 hdspm->max_channels_out = hdspm->ds_out_channels; in hdspm_set_rate()
1768 hdspm->port_names_in = hdspm->port_names_in_ds; in hdspm_set_rate()
1769 hdspm->port_names_out = hdspm->port_names_out_ds; in hdspm_set_rate()
1771 hdspm->channel_map_in = hdspm->channel_map_in_qs; in hdspm_set_rate()
1772 hdspm->channel_map_out = hdspm->channel_map_out_qs; in hdspm_set_rate()
1773 hdspm->max_channels_in = hdspm->qs_in_channels; in hdspm_set_rate()
1774 hdspm->max_channels_out = hdspm->qs_out_channels; in hdspm_set_rate()
1775 hdspm->port_names_in = hdspm->port_names_in_qs; in hdspm_set_rate()
1776 hdspm->port_names_out = hdspm->port_names_out_qs; in hdspm_set_rate()
1786 static void all_in_all_mixer(struct hdspm * hdspm, int sgain) in all_in_all_mixer() argument
1800 hdspm_write_in_gain(hdspm, i, j, gain); in all_in_all_mixer()
1801 hdspm_write_pb_gain(hdspm, i, j, gain); in all_in_all_mixer()
1809 static inline unsigned char snd_hdspm_midi_read_byte (struct hdspm *hdspm, in snd_hdspm_midi_read_byte() argument
1813 return hdspm_read(hdspm, hdspm->midi[id].dataIn); in snd_hdspm_midi_read_byte()
1816 static inline void snd_hdspm_midi_write_byte (struct hdspm *hdspm, int id, in snd_hdspm_midi_write_byte() argument
1820 return hdspm_write(hdspm, hdspm->midi[id].dataOut, val); in snd_hdspm_midi_write_byte()
1823 static inline int snd_hdspm_midi_input_available (struct hdspm *hdspm, int id) in snd_hdspm_midi_input_available() argument
1825 return hdspm_read(hdspm, hdspm->midi[id].statusIn) & 0xFF; in snd_hdspm_midi_input_available()
1828 static inline int snd_hdspm_midi_output_possible (struct hdspm *hdspm, int id) in snd_hdspm_midi_output_possible() argument
1832 fifo_bytes_used = hdspm_read(hdspm, hdspm->midi[id].statusOut) & 0xFF; in snd_hdspm_midi_output_possible()
1840 static void snd_hdspm_flush_midi_input(struct hdspm *hdspm, int id) in snd_hdspm_flush_midi_input() argument
1842 while (snd_hdspm_midi_input_available (hdspm, id)) in snd_hdspm_flush_midi_input()
1843 snd_hdspm_midi_read_byte (hdspm, id); in snd_hdspm_flush_midi_input()
1859 n_pending = snd_hdspm_midi_output_possible (hmidi->hdspm, in snd_hdspm_midi_output_write()
1869 snd_hdspm_midi_write_byte (hmidi->hdspm, in snd_hdspm_midi_output_write()
1889 n_pending = snd_hdspm_midi_input_available (hmidi->hdspm, hmidi->id); in snd_hdspm_midi_input_read()
1895 buf[i] = snd_hdspm_midi_read_byte (hmidi->hdspm, in snd_hdspm_midi_input_read()
1903 snd_hdspm_midi_read_byte (hmidi->hdspm, in snd_hdspm_midi_input_read()
1910 spin_lock_irqsave(&hmidi->hdspm->lock, flags); in snd_hdspm_midi_input_read()
1911 hmidi->hdspm->control_register |= hmidi->ie; in snd_hdspm_midi_input_read()
1912 hdspm_write(hmidi->hdspm, HDSPM_controlRegister, in snd_hdspm_midi_input_read()
1913 hmidi->hdspm->control_register); in snd_hdspm_midi_input_read()
1914 spin_unlock_irqrestore(&hmidi->hdspm->lock, flags); in snd_hdspm_midi_input_read()
1922 struct hdspm *hdspm; in snd_hdspm_midi_input_trigger() local
1927 hdspm = hmidi->hdspm; in snd_hdspm_midi_input_trigger()
1929 spin_lock_irqsave (&hdspm->lock, flags); in snd_hdspm_midi_input_trigger()
1931 if (!(hdspm->control_register & hmidi->ie)) { in snd_hdspm_midi_input_trigger()
1932 snd_hdspm_flush_midi_input (hdspm, hmidi->id); in snd_hdspm_midi_input_trigger()
1933 hdspm->control_register |= hmidi->ie; in snd_hdspm_midi_input_trigger()
1936 hdspm->control_register &= ~hmidi->ie; in snd_hdspm_midi_input_trigger()
1939 hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register); in snd_hdspm_midi_input_trigger()
1940 spin_unlock_irqrestore (&hdspm->lock, flags); in snd_hdspm_midi_input_trigger()
1993 snd_hdspm_flush_midi_input (hmidi->hdspm, hmidi->id); in snd_hdspm_midi_input_open()
2055 struct hdspm *hdspm, int id) in snd_hdspm_create_midi() argument
2060 hdspm->midi[id].id = id; in snd_hdspm_create_midi()
2061 hdspm->midi[id].hdspm = hdspm; in snd_hdspm_create_midi()
2062 spin_lock_init (&hdspm->midi[id].lock); in snd_hdspm_create_midi()
2065 if (MADIface == hdspm->io_type) { in snd_hdspm_create_midi()
2067 hdspm->midi[0].dataIn = HDSPM_midiDataIn2; in snd_hdspm_create_midi()
2068 hdspm->midi[0].statusIn = HDSPM_midiStatusIn2; in snd_hdspm_create_midi()
2069 hdspm->midi[0].dataOut = HDSPM_midiDataOut2; in snd_hdspm_create_midi()
2070 hdspm->midi[0].statusOut = HDSPM_midiStatusOut2; in snd_hdspm_create_midi()
2071 hdspm->midi[0].ie = HDSPM_Midi2InterruptEnable; in snd_hdspm_create_midi()
2072 hdspm->midi[0].irq = HDSPM_midi2IRQPending; in snd_hdspm_create_midi()
2074 hdspm->midi[0].dataIn = HDSPM_midiDataIn0; in snd_hdspm_create_midi()
2075 hdspm->midi[0].statusIn = HDSPM_midiStatusIn0; in snd_hdspm_create_midi()
2076 hdspm->midi[0].dataOut = HDSPM_midiDataOut0; in snd_hdspm_create_midi()
2077 hdspm->midi[0].statusOut = HDSPM_midiStatusOut0; in snd_hdspm_create_midi()
2078 hdspm->midi[0].ie = HDSPM_Midi0InterruptEnable; in snd_hdspm_create_midi()
2079 hdspm->midi[0].irq = HDSPM_midi0IRQPending; in snd_hdspm_create_midi()
2082 hdspm->midi[1].dataIn = HDSPM_midiDataIn1; in snd_hdspm_create_midi()
2083 hdspm->midi[1].statusIn = HDSPM_midiStatusIn1; in snd_hdspm_create_midi()
2084 hdspm->midi[1].dataOut = HDSPM_midiDataOut1; in snd_hdspm_create_midi()
2085 hdspm->midi[1].statusOut = HDSPM_midiStatusOut1; in snd_hdspm_create_midi()
2086 hdspm->midi[1].ie = HDSPM_Midi1InterruptEnable; in snd_hdspm_create_midi()
2087 hdspm->midi[1].irq = HDSPM_midi1IRQPending; in snd_hdspm_create_midi()
2088 } else if ((2 == id) && (MADI == hdspm->io_type)) { in snd_hdspm_create_midi()
2090 hdspm->midi[2].dataIn = HDSPM_midiDataIn2; in snd_hdspm_create_midi()
2091 hdspm->midi[2].statusIn = HDSPM_midiStatusIn2; in snd_hdspm_create_midi()
2092 hdspm->midi[2].dataOut = HDSPM_midiDataOut2; in snd_hdspm_create_midi()
2093 hdspm->midi[2].statusOut = HDSPM_midiStatusOut2; in snd_hdspm_create_midi()
2094 hdspm->midi[2].ie = HDSPM_Midi2InterruptEnable; in snd_hdspm_create_midi()
2095 hdspm->midi[2].irq = HDSPM_midi2IRQPending; in snd_hdspm_create_midi()
2098 hdspm->midi[2].dataIn = HDSPM_midiDataIn2; in snd_hdspm_create_midi()
2099 hdspm->midi[2].statusIn = HDSPM_midiStatusIn2; in snd_hdspm_create_midi()
2100 hdspm->midi[2].dataOut = -1; in snd_hdspm_create_midi()
2101 hdspm->midi[2].statusOut = -1; in snd_hdspm_create_midi()
2102 hdspm->midi[2].ie = HDSPM_Midi2InterruptEnable; in snd_hdspm_create_midi()
2103 hdspm->midi[2].irq = HDSPM_midi2IRQPendingAES; in snd_hdspm_create_midi()
2106 hdspm->midi[3].dataIn = HDSPM_midiDataIn3; in snd_hdspm_create_midi()
2107 hdspm->midi[3].statusIn = HDSPM_midiStatusIn3; in snd_hdspm_create_midi()
2108 hdspm->midi[3].dataOut = -1; in snd_hdspm_create_midi()
2109 hdspm->midi[3].statusOut = -1; in snd_hdspm_create_midi()
2110 hdspm->midi[3].ie = HDSPM_Midi3InterruptEnable; in snd_hdspm_create_midi()
2111 hdspm->midi[3].irq = HDSPM_midi3IRQPending; in snd_hdspm_create_midi()
2114 if ((id < 2) || ((2 == id) && ((MADI == hdspm->io_type) || in snd_hdspm_create_midi()
2115 (MADIface == hdspm->io_type)))) { in snd_hdspm_create_midi()
2116 if ((id == 0) && (MADIface == hdspm->io_type)) { in snd_hdspm_create_midi()
2119 } else if ((id == 2) && (MADI == hdspm->io_type)) { in snd_hdspm_create_midi()
2127 &hdspm->midi[id].rmidi); in snd_hdspm_create_midi()
2131 snprintf(hdspm->midi[id].rmidi->name, in snd_hdspm_create_midi()
2132 sizeof(hdspm->midi[id].rmidi->name), in snd_hdspm_create_midi()
2134 hdspm->midi[id].rmidi->private_data = &hdspm->midi[id]; in snd_hdspm_create_midi()
2136 snd_rawmidi_set_ops(hdspm->midi[id].rmidi, in snd_hdspm_create_midi()
2139 snd_rawmidi_set_ops(hdspm->midi[id].rmidi, in snd_hdspm_create_midi()
2143 hdspm->midi[id].rmidi->info_flags |= in snd_hdspm_create_midi()
2152 &hdspm->midi[id].rmidi); in snd_hdspm_create_midi()
2156 snprintf(hdspm->midi[id].rmidi->name, in snd_hdspm_create_midi()
2157 sizeof(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 = container_of(work, struct hdspm, midi_work); in hdspm_midi_work() local
2177 while (i < hdspm->midiPorts) { in hdspm_midi_work()
2178 if (hdspm->midi[i].pending) in hdspm_midi_work()
2179 snd_hdspm_midi_input_read(&hdspm->midi[i]); in hdspm_midi_work()
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 switch (hdspm->io_type) { in snd_hdspm_proc_init()
5302 snd_card_ro_proc_new(hdspm->card, "hdspm", hdspm, read); in snd_hdspm_proc_init()
5303 snd_card_ro_proc_new(hdspm->card, "ports.in", hdspm, in snd_hdspm_proc_init()
5305 snd_card_ro_proc_new(hdspm->card, "ports.out", hdspm, in snd_hdspm_proc_init()
5310 snd_card_ro_proc_new(hdspm->card, "debug", hdspm, in snd_hdspm_proc_init()
5319 static int snd_hdspm_set_defaults(struct hdspm * hdspm) in snd_hdspm_set_defaults() argument
5327 hdspm->settings_register = 0; in snd_hdspm_set_defaults()
5329 switch (hdspm->io_type) { in snd_hdspm_set_defaults()
5332 hdspm->control_register = in snd_hdspm_set_defaults()
5338 hdspm->settings_register = 0x1 + 0x1000; in snd_hdspm_set_defaults()
5341 hdspm->control_register = in snd_hdspm_set_defaults()
5346 hdspm->control_register = in snd_hdspm_set_defaults()
5355 hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register); in snd_hdspm_set_defaults()
5357 if (AES32 == hdspm->io_type) { in snd_hdspm_set_defaults()
5360 hdspm->control2_register = HDSPM_BIGENDIAN_MODE; in snd_hdspm_set_defaults()
5362 hdspm->control2_register = 0; in snd_hdspm_set_defaults()
5365 hdspm_write(hdspm, HDSPM_control2Reg, hdspm->control2_register); in snd_hdspm_set_defaults()
5367 hdspm_compute_period_size(hdspm); in snd_hdspm_set_defaults()
5371 all_in_all_mixer(hdspm, 0 * UNITY_GAIN); in snd_hdspm_set_defaults()
5373 if (hdspm_is_raydat_or_aio(hdspm)) in snd_hdspm_set_defaults()
5374 hdspm_write(hdspm, HDSPM_WR_SETTINGS, hdspm->settings_register); in snd_hdspm_set_defaults()
5377 hdspm_set_rate(hdspm, 48000, 1); in snd_hdspm_set_defaults()
5389 struct hdspm *hdspm = (struct hdspm *) dev_id; in snd_hdspm_interrupt() local
5394 status = hdspm_read(hdspm, HDSPM_statusRegister); in snd_hdspm_interrupt()
5420 hdspm_write(hdspm, HDSPM_interruptConfirmation, 0); in snd_hdspm_interrupt()
5421 hdspm->irq_count++; in snd_hdspm_interrupt()
5425 if (hdspm->capture_substream) in snd_hdspm_interrupt()
5426 snd_pcm_period_elapsed(hdspm->capture_substream); in snd_hdspm_interrupt()
5428 if (hdspm->playback_substream) in snd_hdspm_interrupt()
5429 snd_pcm_period_elapsed(hdspm->playback_substream); in snd_hdspm_interrupt()
5434 while (i < hdspm->midiPorts) { in snd_hdspm_interrupt()
5435 if ((hdspm_read(hdspm, in snd_hdspm_interrupt()
5436 hdspm->midi[i].statusIn) & 0xff) && in snd_hdspm_interrupt()
5437 (status & hdspm->midi[i].irq)) { in snd_hdspm_interrupt()
5441 hdspm->control_register &= ~hdspm->midi[i].ie; in snd_hdspm_interrupt()
5442 hdspm_write(hdspm, HDSPM_controlRegister, in snd_hdspm_interrupt()
5443 hdspm->control_register); in snd_hdspm_interrupt()
5444 hdspm->midi[i].pending = 1; in snd_hdspm_interrupt()
5452 queue_work(system_highpri_wq, &hdspm->midi_work); in snd_hdspm_interrupt()
5466 struct hdspm *hdspm = snd_pcm_substream_chip(substream); in snd_hdspm_hw_pointer() local
5467 return hdspm_hw_pointer(hdspm); in snd_hdspm_hw_pointer()
5474 struct hdspm *hdspm = snd_pcm_substream_chip(substream); in snd_hdspm_reset() local
5478 other = hdspm->capture_substream; in snd_hdspm_reset()
5480 other = hdspm->playback_substream; in snd_hdspm_reset()
5482 if (hdspm->running) in snd_hdspm_reset()
5483 runtime->status->hw_ptr = hdspm_hw_pointer(hdspm); in snd_hdspm_reset()
5503 struct hdspm *hdspm = snd_pcm_substream_chip(substream); in snd_hdspm_hw_params() local
5509 spin_lock_irq(&hdspm->lock); in snd_hdspm_hw_params()
5512 this_pid = hdspm->playback_pid; in snd_hdspm_hw_params()
5513 other_pid = hdspm->capture_pid; in snd_hdspm_hw_params()
5515 this_pid = hdspm->capture_pid; in snd_hdspm_hw_params()
5516 other_pid = hdspm->playback_pid; in snd_hdspm_hw_params()
5526 if (params_rate(params) != hdspm->system_sample_rate) { in snd_hdspm_hw_params()
5527 spin_unlock_irq(&hdspm->lock); in snd_hdspm_hw_params()
5533 if (params_period_size(params) != hdspm->period_bytes / 4) { in snd_hdspm_hw_params()
5534 spin_unlock_irq(&hdspm->lock); in snd_hdspm_hw_params()
5542 spin_unlock_irq(&hdspm->lock); in snd_hdspm_hw_params()
5546 spin_lock_irq(&hdspm->lock); in snd_hdspm_hw_params()
5547 err = hdspm_set_rate(hdspm, params_rate(params), 0); in snd_hdspm_hw_params()
5549 dev_info(hdspm->card->dev, "err on hdspm_set_rate: %d\n", err); in snd_hdspm_hw_params()
5550 spin_unlock_irq(&hdspm->lock); in snd_hdspm_hw_params()
5555 spin_unlock_irq(&hdspm->lock); in snd_hdspm_hw_params()
5557 err = hdspm_set_interrupt_interval(hdspm, in snd_hdspm_hw_params()
5560 dev_info(hdspm->card->dev, in snd_hdspm_hw_params()
5577 dev_info(hdspm->card->dev, in snd_hdspm_hw_params()
5585 int c = hdspm->channel_map_out[i]; in snd_hdspm_hw_params()
5589 hdspm_set_channel_dma_addr(hdspm, substream, in snd_hdspm_hw_params()
5592 snd_hdspm_enable_out(hdspm, c, 1); in snd_hdspm_hw_params()
5595 hdspm->playback_buffer = in snd_hdspm_hw_params()
5597 dev_dbg(hdspm->card->dev, in snd_hdspm_hw_params()
5599 hdspm->playback_buffer); in snd_hdspm_hw_params()
5602 int c = hdspm->channel_map_in[i]; in snd_hdspm_hw_params()
5606 hdspm_set_channel_dma_addr(hdspm, substream, in snd_hdspm_hw_params()
5609 snd_hdspm_enable_in(hdspm, c, 1); in snd_hdspm_hw_params()
5612 hdspm->capture_buffer = in snd_hdspm_hw_params()
5614 dev_dbg(hdspm->card->dev, in snd_hdspm_hw_params()
5616 hdspm->capture_buffer); in snd_hdspm_hw_params()
5641 if (hdspm->io_type == AES32) { in snd_hdspm_hw_params()
5648 if (!(hdspm->control_register & HDSPe_FLOAT_FORMAT)) in snd_hdspm_hw_params()
5649 dev_info(hdspm->card->dev, in snd_hdspm_hw_params()
5652 hdspm->control_register |= HDSPe_FLOAT_FORMAT; in snd_hdspm_hw_params()
5654 if (hdspm->control_register & HDSPe_FLOAT_FORMAT) in snd_hdspm_hw_params()
5655 dev_info(hdspm->card->dev, in snd_hdspm_hw_params()
5658 hdspm->control_register &= ~HDSPe_FLOAT_FORMAT; in snd_hdspm_hw_params()
5660 hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register); in snd_hdspm_hw_params()
5668 struct hdspm *hdspm = snd_pcm_substream_chip(substream); in snd_hdspm_hw_free() local
5674 snd_hdspm_enable_out(hdspm, i, 0); in snd_hdspm_hw_free()
5676 hdspm->playback_buffer = NULL; 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()
5693 struct hdspm *hdspm = snd_pcm_substream_chip(substream); in snd_hdspm_channel_info() local
5697 if (snd_BUG_ON(channel >= hdspm->max_channels_out)) { in snd_hdspm_channel_info()
5698 dev_info(hdspm->card->dev, in snd_hdspm_channel_info()
5704 channel = array_index_nospec(channel, hdspm->max_channels_out); in snd_hdspm_channel_info()
5705 if (hdspm->channel_map_out[channel] < 0) { in snd_hdspm_channel_info()
5706 dev_info(hdspm->card->dev, in snd_hdspm_channel_info()
5712 info->offset = hdspm->channel_map_out[channel] * in snd_hdspm_channel_info()
5715 if (snd_BUG_ON(channel >= hdspm->max_channels_in)) { in snd_hdspm_channel_info()
5716 dev_info(hdspm->card->dev, in snd_hdspm_channel_info()
5722 channel = array_index_nospec(channel, hdspm->max_channels_in); in snd_hdspm_channel_info()
5723 if (hdspm->channel_map_in[channel] < 0) { in snd_hdspm_channel_info()
5724 dev_info(hdspm->card->dev, in snd_hdspm_channel_info()
5730 info->offset = hdspm->channel_map_in[channel] * in snd_hdspm_channel_info()
5761 struct hdspm *hdspm = snd_pcm_substream_chip(substream); in snd_hdspm_trigger() local
5765 spin_lock(&hdspm->lock); in snd_hdspm_trigger()
5766 running = hdspm->running; in snd_hdspm_trigger()
5776 spin_unlock(&hdspm->lock); in snd_hdspm_trigger()
5780 other = hdspm->capture_substream; in snd_hdspm_trigger()
5782 other = hdspm->playback_substream; in snd_hdspm_trigger()
5800 hdspm_silence_playback(hdspm); in snd_hdspm_trigger()
5804 hdspm_silence_playback(hdspm); in snd_hdspm_trigger()
5808 hdspm_silence_playback(hdspm); in snd_hdspm_trigger()
5812 if (!hdspm->running && running) in snd_hdspm_trigger()
5813 hdspm_start_audio(hdspm); in snd_hdspm_trigger()
5814 else if (hdspm->running && !running) in snd_hdspm_trigger()
5815 hdspm_stop_audio(hdspm); in snd_hdspm_trigger()
5816 hdspm->running = running; in snd_hdspm_trigger()
5817 spin_unlock(&hdspm->lock); in snd_hdspm_trigger()
5880 struct hdspm *hdspm = rule->private; in snd_hdspm_hw_rule_in_channels_rate() local
5888 .min = hdspm->qs_in_channels, in snd_hdspm_hw_rule_in_channels_rate()
5889 .max = hdspm->qs_in_channels, in snd_hdspm_hw_rule_in_channels_rate()
5895 .min = hdspm->ds_in_channels, in snd_hdspm_hw_rule_in_channels_rate()
5896 .max = hdspm->ds_in_channels, in snd_hdspm_hw_rule_in_channels_rate()
5902 .min = hdspm->ss_in_channels, in snd_hdspm_hw_rule_in_channels_rate()
5903 .max = hdspm->ss_in_channels, in snd_hdspm_hw_rule_in_channels_rate()
5915 struct hdspm *hdspm = rule->private; in snd_hdspm_hw_rule_out_channels_rate() local
5923 .min = hdspm->qs_out_channels, in snd_hdspm_hw_rule_out_channels_rate()
5924 .max = hdspm->qs_out_channels, in snd_hdspm_hw_rule_out_channels_rate()
5930 .min = hdspm->ds_out_channels, in snd_hdspm_hw_rule_out_channels_rate()
5931 .max = hdspm->ds_out_channels, in snd_hdspm_hw_rule_out_channels_rate()
5937 .min = hdspm->ss_out_channels, in snd_hdspm_hw_rule_out_channels_rate()
5938 .max = hdspm->ss_out_channels, in snd_hdspm_hw_rule_out_channels_rate()
5950 struct hdspm *hdspm = rule->private; in snd_hdspm_hw_rule_rate_in_channels() local
5956 if (c->min >= hdspm->ss_in_channels) { in snd_hdspm_hw_rule_rate_in_channels()
5963 } else if (c->max <= hdspm->qs_in_channels) { in snd_hdspm_hw_rule_rate_in_channels()
5970 } else if (c->max <= hdspm->ds_in_channels) { in snd_hdspm_hw_rule_rate_in_channels()
5984 struct hdspm *hdspm = rule->private; in snd_hdspm_hw_rule_rate_out_channels() local
5990 if (c->min >= hdspm->ss_out_channels) { in snd_hdspm_hw_rule_rate_out_channels()
5997 } else if (c->max <= hdspm->qs_out_channels) { in snd_hdspm_hw_rule_rate_out_channels()
6004 } else if (c->max <= hdspm->ds_out_channels) { in snd_hdspm_hw_rule_rate_out_channels()
6020 struct hdspm *hdspm = rule->private; in snd_hdspm_hw_rule_in_channels() local
6024 list[0] = hdspm->qs_in_channels; in snd_hdspm_hw_rule_in_channels()
6025 list[1] = hdspm->ds_in_channels; in snd_hdspm_hw_rule_in_channels()
6026 list[2] = hdspm->ss_in_channels; in snd_hdspm_hw_rule_in_channels()
6034 struct hdspm *hdspm = rule->private; in snd_hdspm_hw_rule_out_channels() local
6038 list[0] = hdspm->qs_out_channels; in snd_hdspm_hw_rule_out_channels()
6039 list[1] = hdspm->ds_out_channels; in snd_hdspm_hw_rule_out_channels()
6040 list[2] = hdspm->ss_out_channels; in snd_hdspm_hw_rule_out_channels()
6058 struct hdspm *hdspm = snd_pcm_substream_chip(substream); in snd_hdspm_open() local
6062 spin_lock_irq(&hdspm->lock); in snd_hdspm_open()
6068 if (!hdspm->capture_substream) in snd_hdspm_open()
6069 hdspm_stop_audio(hdspm); in snd_hdspm_open()
6071 hdspm->playback_pid = current->pid; in snd_hdspm_open()
6072 hdspm->playback_substream = substream; in snd_hdspm_open()
6074 if (!hdspm->playback_substream) in snd_hdspm_open()
6075 hdspm_stop_audio(hdspm); in snd_hdspm_open()
6077 hdspm->capture_pid = current->pid; in snd_hdspm_open()
6078 hdspm->capture_substream = substream; in snd_hdspm_open()
6081 spin_unlock_irq(&hdspm->lock); in snd_hdspm_open()
6086 switch (hdspm->io_type) { in snd_hdspm_open()
6107 if (AES32 == hdspm->io_type) { in snd_hdspm_open()
6115 snd_hdspm_hw_rule_rate_in_channels), hdspm, in snd_hdspm_open()
6121 snd_hdspm_hw_rule_in_channels), hdspm, in snd_hdspm_open()
6126 snd_hdspm_hw_rule_in_channels_rate), hdspm, in snd_hdspm_open()
6134 struct hdspm *hdspm = snd_pcm_substream_chip(substream); in snd_hdspm_release() local
6137 spin_lock_irq(&hdspm->lock); in snd_hdspm_release()
6140 hdspm->playback_pid = -1; in snd_hdspm_release()
6141 hdspm->playback_substream = NULL; in snd_hdspm_release()
6143 hdspm->capture_pid = -1; in snd_hdspm_release()
6144 hdspm->capture_substream = NULL; in snd_hdspm_release()
6147 spin_unlock_irq(&hdspm->lock); in snd_hdspm_release()
6168 struct hdspm *hdspm = hw->private_data; in snd_hdspm_hwdep_ioctl() local
6182 levels = &hdspm->peak_rms; in snd_hdspm_hwdep_ioctl()
6185 readl(hdspm->iobase + in snd_hdspm_hwdep_ioctl()
6188 readl(hdspm->iobase + in snd_hdspm_hwdep_ioctl()
6191 readl(hdspm->iobase + in snd_hdspm_hwdep_ioctl()
6195 ((uint64_t) readl(hdspm->iobase + in snd_hdspm_hwdep_ioctl()
6197 (uint64_t) readl(hdspm->iobase + in snd_hdspm_hwdep_ioctl()
6200 ((uint64_t)readl(hdspm->iobase + in snd_hdspm_hwdep_ioctl()
6202 (uint64_t)readl(hdspm->iobase + in snd_hdspm_hwdep_ioctl()
6205 ((uint64_t)readl(hdspm->iobase + in snd_hdspm_hwdep_ioctl()
6207 (uint64_t)readl(hdspm->iobase + in snd_hdspm_hwdep_ioctl()
6211 if (hdspm->system_sample_rate > 96000) { in snd_hdspm_hwdep_ioctl()
6213 } else if (hdspm->system_sample_rate > 48000) { in snd_hdspm_hwdep_ioctl()
6218 levels->status2 = hdspm_read(hdspm, HDSPM_statusRegister2); in snd_hdspm_hwdep_ioctl()
6230 ltc.ltc = hdspm_read(hdspm, HDSPM_RD_TCO); in snd_hdspm_hwdep_ioctl()
6231 i = hdspm_read(hdspm, HDSPM_RD_TCO + 4); in snd_hdspm_hwdep_ioctl()
6277 spin_lock_irq(&hdspm->lock); in snd_hdspm_hwdep_ioctl()
6278 info.pref_sync_ref = hdspm_pref_sync_ref(hdspm); in snd_hdspm_hwdep_ioctl()
6279 info.wordclock_sync_check = hdspm_wc_sync_check(hdspm); in snd_hdspm_hwdep_ioctl()
6281 info.system_sample_rate = hdspm->system_sample_rate; in snd_hdspm_hwdep_ioctl()
6283 hdspm_external_sample_rate(hdspm); in snd_hdspm_hwdep_ioctl()
6284 info.system_clock_mode = hdspm_system_clock_mode(hdspm); in snd_hdspm_hwdep_ioctl()
6285 info.clock_source = hdspm_clock_source(hdspm); in snd_hdspm_hwdep_ioctl()
6286 info.autosync_ref = hdspm_autosync_ref(hdspm); in snd_hdspm_hwdep_ioctl()
6287 info.line_out = hdspm_toggle_setting(hdspm, HDSPM_LineOut); in snd_hdspm_hwdep_ioctl()
6289 spin_unlock_irq(&hdspm->lock); in snd_hdspm_hwdep_ioctl()
6297 status.card_type = hdspm->io_type; in snd_hdspm_hwdep_ioctl()
6299 status.autosync_source = hdspm_autosync_ref(hdspm); in snd_hdspm_hwdep_ioctl()
6302 status.master_period = hdspm_read(hdspm, HDSPM_RD_PLL_FREQ); in snd_hdspm_hwdep_ioctl()
6304 switch (hdspm->io_type) { in snd_hdspm_hwdep_ioctl()
6308 hdspm_wc_sync_check(hdspm); in snd_hdspm_hwdep_ioctl()
6310 hdspm_madi_sync_check(hdspm); in snd_hdspm_hwdep_ioctl()
6312 hdspm_tco_sync_check(hdspm); in snd_hdspm_hwdep_ioctl()
6314 hdspm_sync_in_sync_check(hdspm); in snd_hdspm_hwdep_ioctl()
6317 hdspm_read(hdspm, HDSPM_statusRegister); in snd_hdspm_hwdep_ioctl()
6338 hdspm_version.card_type = hdspm->io_type; in snd_hdspm_hwdep_ioctl()
6339 strlcpy(hdspm_version.cardname, hdspm->card_name, in snd_hdspm_hwdep_ioctl()
6341 hdspm_version.serial = hdspm->serial; in snd_hdspm_hwdep_ioctl()
6342 hdspm_version.firmware_rev = hdspm->firmware_rev; in snd_hdspm_hwdep_ioctl()
6344 if (hdspm->tco) in snd_hdspm_hwdep_ioctl()
6355 if (copy_to_user((void __user *)mixer.mixer, hdspm->mixer, in snd_hdspm_hwdep_ioctl()
6378 struct hdspm *hdspm) in snd_hdspm_create_hwdep() argument
6387 hdspm->hwdep = hw; in snd_hdspm_create_hwdep()
6388 hw->private_data = hdspm; in snd_hdspm_create_hwdep()
6403 static int snd_hdspm_preallocate_memory(struct hdspm *hdspm) in snd_hdspm_preallocate_memory() argument
6408 pcm = hdspm->pcm; in snd_hdspm_preallocate_memory()
6413 &hdspm->pci->dev, in snd_hdspm_preallocate_memory()
6415 dev_dbg(hdspm->card->dev, " Preallocated %zd Bytes\n", wanted); in snd_hdspm_preallocate_memory()
6421 static void hdspm_set_channel_dma_addr(struct hdspm *hdspm, in hdspm_set_channel_dma_addr() argument
6428 hdspm_write(hdspm, reg + 4 * i, in hdspm_set_channel_dma_addr()
6435 struct hdspm *hdspm) in snd_hdspm_create_pcm() argument
6440 err = snd_pcm_new(card, hdspm->card_name, 0, 1, 1, &pcm); in snd_hdspm_create_pcm()
6444 hdspm->pcm = pcm; in snd_hdspm_create_pcm()
6445 pcm->private_data = hdspm; in snd_hdspm_create_pcm()
6446 strcpy(pcm->name, hdspm->card_name); in snd_hdspm_create_pcm()
6455 err = snd_hdspm_preallocate_memory(hdspm); in snd_hdspm_create_pcm()
6462 static inline void snd_hdspm_initialize_midi_flush(struct hdspm * hdspm) in snd_hdspm_initialize_midi_flush() argument
6466 for (i = 0; i < hdspm->midiPorts; i++) in snd_hdspm_initialize_midi_flush()
6467 snd_hdspm_flush_midi_input(hdspm, i); in snd_hdspm_initialize_midi_flush()
6471 struct hdspm *hdspm) in snd_hdspm_create_alsa_devices() argument
6476 err = snd_hdspm_create_pcm(card, hdspm); in snd_hdspm_create_alsa_devices()
6481 while (i < hdspm->midiPorts) { in snd_hdspm_create_alsa_devices()
6482 err = snd_hdspm_create_midi(card, hdspm, i); in snd_hdspm_create_alsa_devices()
6489 err = snd_hdspm_create_controls(card, hdspm); in snd_hdspm_create_alsa_devices()
6493 err = snd_hdspm_create_hwdep(card, hdspm); in snd_hdspm_create_alsa_devices()
6498 snd_hdspm_proc_init(hdspm); in snd_hdspm_create_alsa_devices()
6500 hdspm->system_sample_rate = -1; in snd_hdspm_create_alsa_devices()
6501 hdspm->last_external_sample_rate = -1; in snd_hdspm_create_alsa_devices()
6502 hdspm->last_internal_sample_rate = -1; in snd_hdspm_create_alsa_devices()
6503 hdspm->playback_pid = -1; in snd_hdspm_create_alsa_devices()
6504 hdspm->capture_pid = -1; in snd_hdspm_create_alsa_devices()
6505 hdspm->capture_substream = NULL; in snd_hdspm_create_alsa_devices()
6506 hdspm->playback_substream = NULL; in snd_hdspm_create_alsa_devices()
6509 err = snd_hdspm_set_defaults(hdspm); in snd_hdspm_create_alsa_devices()
6514 hdspm_update_simple_mixer_controls(hdspm); in snd_hdspm_create_alsa_devices()
6530 struct hdspm *hdspm) in snd_hdspm_create() argument
6533 struct pci_dev *pci = hdspm->pci; in snd_hdspm_create()
6537 hdspm->irq = -1; in snd_hdspm_create()
6538 hdspm->card = card; in snd_hdspm_create()
6540 spin_lock_init(&hdspm->lock); in snd_hdspm_create()
6541 INIT_WORK(&hdspm->midi_work, hdspm_midi_work); in snd_hdspm_create()
6543 pci_read_config_word(hdspm->pci, in snd_hdspm_create()
6544 PCI_CLASS_REVISION, &hdspm->firmware_rev); in snd_hdspm_create()
6549 switch (hdspm->firmware_rev) { in snd_hdspm_create()
6551 hdspm->io_type = RayDAT; in snd_hdspm_create()
6552 hdspm->card_name = "RME RayDAT"; in snd_hdspm_create()
6553 hdspm->midiPorts = 2; in snd_hdspm_create()
6556 hdspm->io_type = AIO; in snd_hdspm_create()
6557 hdspm->card_name = "RME AIO"; in snd_hdspm_create()
6558 hdspm->midiPorts = 1; in snd_hdspm_create()
6561 hdspm->io_type = MADIface; in snd_hdspm_create()
6562 hdspm->card_name = "RME MADIface"; in snd_hdspm_create()
6563 hdspm->midiPorts = 1; in snd_hdspm_create()
6566 if ((hdspm->firmware_rev == 0xf0) || in snd_hdspm_create()
6567 ((hdspm->firmware_rev >= 0xe6) && in snd_hdspm_create()
6568 (hdspm->firmware_rev <= 0xea))) { in snd_hdspm_create()
6569 hdspm->io_type = AES32; in snd_hdspm_create()
6570 hdspm->card_name = "RME AES32"; in snd_hdspm_create()
6571 hdspm->midiPorts = 2; in snd_hdspm_create()
6572 } else if ((hdspm->firmware_rev == 0xd2) || in snd_hdspm_create()
6573 ((hdspm->firmware_rev >= 0xc8) && in snd_hdspm_create()
6574 (hdspm->firmware_rev <= 0xcf))) { in snd_hdspm_create()
6575 hdspm->io_type = MADI; in snd_hdspm_create()
6576 hdspm->card_name = "RME MADI"; in snd_hdspm_create()
6577 hdspm->midiPorts = 3; in snd_hdspm_create()
6581 hdspm->firmware_rev); in snd_hdspm_create()
6590 pci_set_master(hdspm->pci); in snd_hdspm_create()
6596 hdspm->port = pci_resource_start(pci, 0); in snd_hdspm_create()
6600 hdspm->port, hdspm->port + io_extent - 1); in snd_hdspm_create()
6602 hdspm->iobase = ioremap(hdspm->port, io_extent); in snd_hdspm_create()
6603 if (!hdspm->iobase) { in snd_hdspm_create()
6605 hdspm->port, hdspm->port + io_extent - 1); in snd_hdspm_create()
6609 (unsigned long)hdspm->iobase, hdspm->port, in snd_hdspm_create()
6610 hdspm->port + io_extent - 1); in snd_hdspm_create()
6613 IRQF_SHARED, KBUILD_MODNAME, hdspm)) { in snd_hdspm_create()
6620 hdspm->irq = pci->irq; in snd_hdspm_create()
6621 card->sync_irq = hdspm->irq; in snd_hdspm_create()
6624 sizeof(*hdspm->mixer)); in snd_hdspm_create()
6625 hdspm->mixer = kzalloc(sizeof(*hdspm->mixer), GFP_KERNEL); in snd_hdspm_create()
6626 if (!hdspm->mixer) in snd_hdspm_create()
6629 hdspm->port_names_in = NULL; in snd_hdspm_create()
6630 hdspm->port_names_out = NULL; in snd_hdspm_create()
6632 switch (hdspm->io_type) { in snd_hdspm_create()
6634 hdspm->ss_in_channels = hdspm->ss_out_channels = AES32_CHANNELS; in snd_hdspm_create()
6635 hdspm->ds_in_channels = hdspm->ds_out_channels = AES32_CHANNELS; in snd_hdspm_create()
6636 hdspm->qs_in_channels = hdspm->qs_out_channels = AES32_CHANNELS; in snd_hdspm_create()
6638 hdspm->channel_map_in_ss = hdspm->channel_map_out_ss = in snd_hdspm_create()
6640 hdspm->channel_map_in_ds = hdspm->channel_map_out_ds = in snd_hdspm_create()
6642 hdspm->channel_map_in_qs = hdspm->channel_map_out_qs = in snd_hdspm_create()
6644 hdspm->port_names_in_ss = hdspm->port_names_out_ss = in snd_hdspm_create()
6646 hdspm->port_names_in_ds = hdspm->port_names_out_ds = in snd_hdspm_create()
6648 hdspm->port_names_in_qs = hdspm->port_names_out_qs = in snd_hdspm_create()
6651 hdspm->max_channels_out = hdspm->max_channels_in = in snd_hdspm_create()
6653 hdspm->port_names_in = hdspm->port_names_out = in snd_hdspm_create()
6655 hdspm->channel_map_in = hdspm->channel_map_out = in snd_hdspm_create()
6662 hdspm->ss_in_channels = hdspm->ss_out_channels = in snd_hdspm_create()
6664 hdspm->ds_in_channels = hdspm->ds_out_channels = in snd_hdspm_create()
6666 hdspm->qs_in_channels = hdspm->qs_out_channels = in snd_hdspm_create()
6669 hdspm->channel_map_in_ss = hdspm->channel_map_out_ss = in snd_hdspm_create()
6671 hdspm->channel_map_in_ds = hdspm->channel_map_out_ds = in snd_hdspm_create()
6673 hdspm->channel_map_in_qs = hdspm->channel_map_out_qs = in snd_hdspm_create()
6676 hdspm->port_names_in_ss = hdspm->port_names_out_ss = in snd_hdspm_create()
6678 hdspm->port_names_in_ds = hdspm->port_names_out_ds = in snd_hdspm_create()
6680 hdspm->port_names_in_qs = hdspm->port_names_out_qs = in snd_hdspm_create()
6685 hdspm->ss_in_channels = AIO_IN_SS_CHANNELS; in snd_hdspm_create()
6686 hdspm->ds_in_channels = AIO_IN_DS_CHANNELS; in snd_hdspm_create()
6687 hdspm->qs_in_channels = AIO_IN_QS_CHANNELS; in snd_hdspm_create()
6688 hdspm->ss_out_channels = AIO_OUT_SS_CHANNELS; in snd_hdspm_create()
6689 hdspm->ds_out_channels = AIO_OUT_DS_CHANNELS; in snd_hdspm_create()
6690 hdspm->qs_out_channels = AIO_OUT_QS_CHANNELS; in snd_hdspm_create()
6692 if (0 == (hdspm_read(hdspm, HDSPM_statusRegister2) & HDSPM_s2_AEBI_D)) { in snd_hdspm_create()
6694 hdspm->ss_in_channels += 4; in snd_hdspm_create()
6695 hdspm->ds_in_channels += 4; in snd_hdspm_create()
6696 hdspm->qs_in_channels += 4; in snd_hdspm_create()
6699 if (0 == (hdspm_read(hdspm, HDSPM_statusRegister2) & HDSPM_s2_AEBO_D)) { in snd_hdspm_create()
6701 hdspm->ss_out_channels += 4; in snd_hdspm_create()
6702 hdspm->ds_out_channels += 4; in snd_hdspm_create()
6703 hdspm->qs_out_channels += 4; in snd_hdspm_create()
6706 hdspm->channel_map_out_ss = channel_map_aio_out_ss; in snd_hdspm_create()
6707 hdspm->channel_map_out_ds = channel_map_aio_out_ds; in snd_hdspm_create()
6708 hdspm->channel_map_out_qs = channel_map_aio_out_qs; in snd_hdspm_create()
6710 hdspm->channel_map_in_ss = channel_map_aio_in_ss; in snd_hdspm_create()
6711 hdspm->channel_map_in_ds = channel_map_aio_in_ds; in snd_hdspm_create()
6712 hdspm->channel_map_in_qs = channel_map_aio_in_qs; in snd_hdspm_create()
6714 hdspm->port_names_in_ss = texts_ports_aio_in_ss; in snd_hdspm_create()
6715 hdspm->port_names_out_ss = texts_ports_aio_out_ss; in snd_hdspm_create()
6716 hdspm->port_names_in_ds = texts_ports_aio_in_ds; in snd_hdspm_create()
6717 hdspm->port_names_out_ds = texts_ports_aio_out_ds; in snd_hdspm_create()
6718 hdspm->port_names_in_qs = texts_ports_aio_in_qs; in snd_hdspm_create()
6719 hdspm->port_names_out_qs = texts_ports_aio_out_qs; in snd_hdspm_create()
6724 hdspm->ss_in_channels = hdspm->ss_out_channels = in snd_hdspm_create()
6726 hdspm->ds_in_channels = hdspm->ds_out_channels = in snd_hdspm_create()
6728 hdspm->qs_in_channels = hdspm->qs_out_channels = in snd_hdspm_create()
6731 hdspm->max_channels_in = RAYDAT_SS_CHANNELS; in snd_hdspm_create()
6732 hdspm->max_channels_out = RAYDAT_SS_CHANNELS; in snd_hdspm_create()
6734 hdspm->channel_map_in_ss = hdspm->channel_map_out_ss = in snd_hdspm_create()
6736 hdspm->channel_map_in_ds = hdspm->channel_map_out_ds = in snd_hdspm_create()
6738 hdspm->channel_map_in_qs = hdspm->channel_map_out_qs = in snd_hdspm_create()
6740 hdspm->channel_map_in = hdspm->channel_map_out = in snd_hdspm_create()
6743 hdspm->port_names_in_ss = hdspm->port_names_out_ss = in snd_hdspm_create()
6745 hdspm->port_names_in_ds = hdspm->port_names_out_ds = in snd_hdspm_create()
6747 hdspm->port_names_in_qs = hdspm->port_names_out_qs = in snd_hdspm_create()
6756 switch (hdspm->io_type) { in snd_hdspm_create()
6759 if (hdspm_read(hdspm, HDSPM_statusRegister2) & in snd_hdspm_create()
6761 hdspm->midiPorts++; in snd_hdspm_create()
6762 hdspm->tco = kzalloc(sizeof(*hdspm->tco), GFP_KERNEL); in snd_hdspm_create()
6763 if (hdspm->tco) in snd_hdspm_create()
6764 hdspm_tco_write(hdspm); in snd_hdspm_create()
6768 hdspm->tco = NULL; in snd_hdspm_create()
6774 if (hdspm_read(hdspm, HDSPM_statusRegister) & HDSPM_tco_detect) { in snd_hdspm_create()
6775 hdspm->midiPorts++; in snd_hdspm_create()
6776 hdspm->tco = kzalloc(sizeof(*hdspm->tco), GFP_KERNEL); in snd_hdspm_create()
6777 if (hdspm->tco) in snd_hdspm_create()
6778 hdspm_tco_write(hdspm); in snd_hdspm_create()
6782 hdspm->tco = NULL; in snd_hdspm_create()
6787 hdspm->tco = NULL; in snd_hdspm_create()
6791 switch (hdspm->io_type) { in snd_hdspm_create()
6793 if (hdspm->tco) { in snd_hdspm_create()
6794 hdspm->texts_autosync = texts_autosync_aes_tco; in snd_hdspm_create()
6795 hdspm->texts_autosync_items = in snd_hdspm_create()
6798 hdspm->texts_autosync = texts_autosync_aes; in snd_hdspm_create()
6799 hdspm->texts_autosync_items = in snd_hdspm_create()
6805 if (hdspm->tco) { in snd_hdspm_create()
6806 hdspm->texts_autosync = texts_autosync_madi_tco; in snd_hdspm_create()
6807 hdspm->texts_autosync_items = 4; in snd_hdspm_create()
6809 hdspm->texts_autosync = texts_autosync_madi; in snd_hdspm_create()
6810 hdspm->texts_autosync_items = 3; in snd_hdspm_create()
6819 if (hdspm->tco) { in snd_hdspm_create()
6820 hdspm->texts_autosync = texts_autosync_raydat_tco; in snd_hdspm_create()
6821 hdspm->texts_autosync_items = 9; in snd_hdspm_create()
6823 hdspm->texts_autosync = texts_autosync_raydat; in snd_hdspm_create()
6824 hdspm->texts_autosync_items = 8; in snd_hdspm_create()
6829 if (hdspm->tco) { in snd_hdspm_create()
6830 hdspm->texts_autosync = texts_autosync_aio_tco; in snd_hdspm_create()
6831 hdspm->texts_autosync_items = 6; in snd_hdspm_create()
6833 hdspm->texts_autosync = texts_autosync_aio; in snd_hdspm_create()
6834 hdspm->texts_autosync_items = 5; in snd_hdspm_create()
6840 if (hdspm->io_type != MADIface) { in snd_hdspm_create()
6841 hdspm->serial = (hdspm_read(hdspm, in snd_hdspm_create()
6852 if (!id[hdspm->dev] && hdspm->serial != 0xFFFFFF) { in snd_hdspm_create()
6854 "HDSPMx%06x", hdspm->serial); in snd_hdspm_create()
6860 err = snd_hdspm_create_alsa_devices(card, hdspm); in snd_hdspm_create()
6864 snd_hdspm_initialize_midi_flush(hdspm); in snd_hdspm_create()
6870 static int snd_hdspm_free(struct hdspm * hdspm) in snd_hdspm_free() argument
6873 if (hdspm->port) { in snd_hdspm_free()
6874 cancel_work_sync(&hdspm->midi_work); in snd_hdspm_free()
6877 hdspm->control_register &= in snd_hdspm_free()
6881 hdspm_write(hdspm, HDSPM_controlRegister, in snd_hdspm_free()
6882 hdspm->control_register); in snd_hdspm_free()
6885 if (hdspm->irq >= 0) in snd_hdspm_free()
6886 free_irq(hdspm->irq, (void *) hdspm); in snd_hdspm_free()
6888 kfree(hdspm->mixer); in snd_hdspm_free()
6889 iounmap(hdspm->iobase); in snd_hdspm_free()
6891 if (hdspm->port) in snd_hdspm_free()
6892 pci_release_regions(hdspm->pci); in snd_hdspm_free()
6894 pci_disable_device(hdspm->pci); in snd_hdspm_free()
6901 struct hdspm *hdspm = card->private_data; in snd_hdspm_card_free() local
6903 if (hdspm) in snd_hdspm_card_free()
6904 snd_hdspm_free(hdspm); in snd_hdspm_card_free()
6912 struct hdspm *hdspm; in snd_hdspm_probe() local
6924 THIS_MODULE, sizeof(*hdspm), &card); in snd_hdspm_probe()
6928 hdspm = card->private_data; in snd_hdspm_probe()
6930 hdspm->dev = dev; in snd_hdspm_probe()
6931 hdspm->pci = pci; in snd_hdspm_probe()
6933 err = snd_hdspm_create(card, hdspm); in snd_hdspm_probe()
6937 if (hdspm->io_type != MADIface) { in snd_hdspm_probe()
6939 hdspm->card_name, hdspm->serial); in snd_hdspm_probe()
6942 hdspm->card_name, hdspm->serial, in snd_hdspm_probe()
6943 hdspm->port, hdspm->irq); in snd_hdspm_probe()
6946 hdspm->card_name); in snd_hdspm_probe()
6949 hdspm->card_name, hdspm->port, hdspm->irq); in snd_hdspm_probe()