|
@@ -34,13 +34,13 @@
|
|
|
static void pcm_period_tasklet(unsigned long data);
|
|
|
|
|
|
/**
|
|
|
- * amdtp_out_stream_init - initialize an AMDTP output stream structure
|
|
|
- * @s: the AMDTP output stream to initialize
|
|
|
+ * amdtp_stream_init - initialize an AMDTP stream structure
|
|
|
+ * @s: the AMDTP stream to initialize
|
|
|
* @unit: the target of the stream
|
|
|
* @flags: the packet transmission method to use
|
|
|
*/
|
|
|
-int amdtp_out_stream_init(struct amdtp_out_stream *s, struct fw_unit *unit,
|
|
|
- enum cip_out_flags flags)
|
|
|
+int amdtp_stream_init(struct amdtp_stream *s, struct fw_unit *unit,
|
|
|
+ enum cip_flags flags)
|
|
|
{
|
|
|
s->unit = fw_unit_get(unit);
|
|
|
s->flags = flags;
|
|
@@ -51,19 +51,19 @@ int amdtp_out_stream_init(struct amdtp_out_stream *s, struct fw_unit *unit,
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
-EXPORT_SYMBOL(amdtp_out_stream_init);
|
|
|
+EXPORT_SYMBOL(amdtp_stream_init);
|
|
|
|
|
|
/**
|
|
|
- * amdtp_out_stream_destroy - free stream resources
|
|
|
- * @s: the AMDTP output stream to destroy
|
|
|
+ * amdtp_stream_destroy - free stream resources
|
|
|
+ * @s: the AMDTP stream to destroy
|
|
|
*/
|
|
|
-void amdtp_out_stream_destroy(struct amdtp_out_stream *s)
|
|
|
+void amdtp_stream_destroy(struct amdtp_stream *s)
|
|
|
{
|
|
|
- WARN_ON(amdtp_out_stream_running(s));
|
|
|
+ WARN_ON(amdtp_stream_running(s));
|
|
|
mutex_destroy(&s->mutex);
|
|
|
fw_unit_put(s->unit);
|
|
|
}
|
|
|
-EXPORT_SYMBOL(amdtp_out_stream_destroy);
|
|
|
+EXPORT_SYMBOL(amdtp_stream_destroy);
|
|
|
|
|
|
const unsigned int amdtp_syt_intervals[CIP_SFC_COUNT] = {
|
|
|
[CIP_SFC_32000] = 8,
|
|
@@ -77,8 +77,8 @@ const unsigned int amdtp_syt_intervals[CIP_SFC_COUNT] = {
|
|
|
EXPORT_SYMBOL(amdtp_syt_intervals);
|
|
|
|
|
|
/**
|
|
|
- * amdtp_out_stream_set_parameters - set stream parameters
|
|
|
- * @s: the AMDTP output stream to configure
|
|
|
+ * amdtp_stream_set_parameters - set stream parameters
|
|
|
+ * @s: the AMDTP stream to configure
|
|
|
* @rate: the sample rate
|
|
|
* @pcm_channels: the number of PCM samples in each data block, to be encoded
|
|
|
* as AM824 multi-bit linear audio
|
|
@@ -87,10 +87,10 @@ EXPORT_SYMBOL(amdtp_syt_intervals);
|
|
|
* The parameters must be set before the stream is started, and must not be
|
|
|
* changed while the stream is running.
|
|
|
*/
|
|
|
-void amdtp_out_stream_set_parameters(struct amdtp_out_stream *s,
|
|
|
- unsigned int rate,
|
|
|
- unsigned int pcm_channels,
|
|
|
- unsigned int midi_ports)
|
|
|
+void amdtp_stream_set_parameters(struct amdtp_stream *s,
|
|
|
+ unsigned int rate,
|
|
|
+ unsigned int pcm_channels,
|
|
|
+ unsigned int midi_ports)
|
|
|
{
|
|
|
static const unsigned int rates[] = {
|
|
|
[CIP_SFC_32000] = 32000,
|
|
@@ -103,7 +103,7 @@ void amdtp_out_stream_set_parameters(struct amdtp_out_stream *s,
|
|
|
};
|
|
|
unsigned int sfc;
|
|
|
|
|
|
- if (WARN_ON(amdtp_out_stream_running(s)))
|
|
|
+ if (WARN_ON(amdtp_stream_running(s)))
|
|
|
return;
|
|
|
|
|
|
for (sfc = 0; sfc < CIP_SFC_COUNT; ++sfc)
|
|
@@ -132,47 +132,47 @@ sfc_found:
|
|
|
/* additional buffering needed to adjust for no-data packets */
|
|
|
s->transfer_delay += TICKS_PER_SECOND * s->syt_interval / rate;
|
|
|
}
|
|
|
-EXPORT_SYMBOL(amdtp_out_stream_set_parameters);
|
|
|
+EXPORT_SYMBOL(amdtp_stream_set_parameters);
|
|
|
|
|
|
/**
|
|
|
- * amdtp_out_stream_get_max_payload - get the stream's packet size
|
|
|
- * @s: the AMDTP output stream
|
|
|
+ * amdtp_stream_get_max_payload - get the stream's packet size
|
|
|
+ * @s: the AMDTP stream
|
|
|
*
|
|
|
* This function must not be called before the stream has been configured
|
|
|
- * with amdtp_out_stream_set_parameters().
|
|
|
+ * with amdtp_stream_set_parameters().
|
|
|
*/
|
|
|
-unsigned int amdtp_out_stream_get_max_payload(struct amdtp_out_stream *s)
|
|
|
+unsigned int amdtp_stream_get_max_payload(struct amdtp_stream *s)
|
|
|
{
|
|
|
return 8 + s->syt_interval * s->data_block_quadlets * 4;
|
|
|
}
|
|
|
-EXPORT_SYMBOL(amdtp_out_stream_get_max_payload);
|
|
|
+EXPORT_SYMBOL(amdtp_stream_get_max_payload);
|
|
|
|
|
|
-static void amdtp_write_s16(struct amdtp_out_stream *s,
|
|
|
+static void amdtp_write_s16(struct amdtp_stream *s,
|
|
|
struct snd_pcm_substream *pcm,
|
|
|
__be32 *buffer, unsigned int frames);
|
|
|
-static void amdtp_write_s32(struct amdtp_out_stream *s,
|
|
|
+static void amdtp_write_s32(struct amdtp_stream *s,
|
|
|
struct snd_pcm_substream *pcm,
|
|
|
__be32 *buffer, unsigned int frames);
|
|
|
-static void amdtp_write_s16_dualwire(struct amdtp_out_stream *s,
|
|
|
+static void amdtp_write_s16_dualwire(struct amdtp_stream *s,
|
|
|
struct snd_pcm_substream *pcm,
|
|
|
__be32 *buffer, unsigned int frames);
|
|
|
-static void amdtp_write_s32_dualwire(struct amdtp_out_stream *s,
|
|
|
+static void amdtp_write_s32_dualwire(struct amdtp_stream *s,
|
|
|
struct snd_pcm_substream *pcm,
|
|
|
__be32 *buffer, unsigned int frames);
|
|
|
|
|
|
/**
|
|
|
- * amdtp_out_stream_set_pcm_format - set the PCM format
|
|
|
- * @s: the AMDTP output stream to configure
|
|
|
+ * amdtp_stream_set_pcm_format - set the PCM format
|
|
|
+ * @s: the AMDTP stream to configure
|
|
|
* @format: the format of the ALSA PCM device
|
|
|
*
|
|
|
* The sample format must be set after the other paramters (rate/PCM channels/
|
|
|
* MIDI) and before the stream is started, and must not be changed while the
|
|
|
* stream is running.
|
|
|
*/
|
|
|
-void amdtp_out_stream_set_pcm_format(struct amdtp_out_stream *s,
|
|
|
- snd_pcm_format_t format)
|
|
|
+void amdtp_stream_set_pcm_format(struct amdtp_stream *s,
|
|
|
+ snd_pcm_format_t format)
|
|
|
{
|
|
|
- if (WARN_ON(amdtp_out_stream_running(s)))
|
|
|
+ if (WARN_ON(amdtp_stream_running(s)))
|
|
|
return;
|
|
|
|
|
|
switch (format) {
|
|
@@ -193,24 +193,24 @@ void amdtp_out_stream_set_pcm_format(struct amdtp_out_stream *s,
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
-EXPORT_SYMBOL(amdtp_out_stream_set_pcm_format);
|
|
|
+EXPORT_SYMBOL(amdtp_stream_set_pcm_format);
|
|
|
|
|
|
/**
|
|
|
- * amdtp_out_stream_pcm_prepare - prepare PCM device for running
|
|
|
- * @s: the AMDTP output stream
|
|
|
+ * amdtp_stream_pcm_prepare - prepare PCM device for running
|
|
|
+ * @s: the AMDTP stream
|
|
|
*
|
|
|
* This function should be called from the PCM device's .prepare callback.
|
|
|
*/
|
|
|
-void amdtp_out_stream_pcm_prepare(struct amdtp_out_stream *s)
|
|
|
+void amdtp_stream_pcm_prepare(struct amdtp_stream *s)
|
|
|
{
|
|
|
tasklet_kill(&s->period_tasklet);
|
|
|
s->pcm_buffer_pointer = 0;
|
|
|
s->pcm_period_pointer = 0;
|
|
|
s->pointer_flush = true;
|
|
|
}
|
|
|
-EXPORT_SYMBOL(amdtp_out_stream_pcm_prepare);
|
|
|
+EXPORT_SYMBOL(amdtp_stream_pcm_prepare);
|
|
|
|
|
|
-static unsigned int calculate_data_blocks(struct amdtp_out_stream *s)
|
|
|
+static unsigned int calculate_data_blocks(struct amdtp_stream *s)
|
|
|
{
|
|
|
unsigned int phase, data_blocks;
|
|
|
|
|
@@ -243,7 +243,7 @@ static unsigned int calculate_data_blocks(struct amdtp_out_stream *s)
|
|
|
return data_blocks;
|
|
|
}
|
|
|
|
|
|
-static unsigned int calculate_syt(struct amdtp_out_stream *s,
|
|
|
+static unsigned int calculate_syt(struct amdtp_stream *s,
|
|
|
unsigned int cycle)
|
|
|
{
|
|
|
unsigned int syt_offset, phase, index, syt;
|
|
@@ -286,7 +286,7 @@ static unsigned int calculate_syt(struct amdtp_out_stream *s,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static void amdtp_write_s32(struct amdtp_out_stream *s,
|
|
|
+static void amdtp_write_s32(struct amdtp_stream *s,
|
|
|
struct snd_pcm_substream *pcm,
|
|
|
__be32 *buffer, unsigned int frames)
|
|
|
{
|
|
@@ -312,7 +312,7 @@ static void amdtp_write_s32(struct amdtp_out_stream *s,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static void amdtp_write_s16(struct amdtp_out_stream *s,
|
|
|
+static void amdtp_write_s16(struct amdtp_stream *s,
|
|
|
struct snd_pcm_substream *pcm,
|
|
|
__be32 *buffer, unsigned int frames)
|
|
|
{
|
|
@@ -338,7 +338,7 @@ static void amdtp_write_s16(struct amdtp_out_stream *s,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static void amdtp_write_s32_dualwire(struct amdtp_out_stream *s,
|
|
|
+static void amdtp_write_s32_dualwire(struct amdtp_stream *s,
|
|
|
struct snd_pcm_substream *pcm,
|
|
|
__be32 *buffer, unsigned int frames)
|
|
|
{
|
|
@@ -369,7 +369,7 @@ static void amdtp_write_s32_dualwire(struct amdtp_out_stream *s,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static void amdtp_write_s16_dualwire(struct amdtp_out_stream *s,
|
|
|
+static void amdtp_write_s16_dualwire(struct amdtp_stream *s,
|
|
|
struct snd_pcm_substream *pcm,
|
|
|
__be32 *buffer, unsigned int frames)
|
|
|
{
|
|
@@ -400,7 +400,7 @@ static void amdtp_write_s16_dualwire(struct amdtp_out_stream *s,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static void amdtp_fill_pcm_silence(struct amdtp_out_stream *s,
|
|
|
+static void amdtp_fill_pcm_silence(struct amdtp_stream *s,
|
|
|
__be32 *buffer, unsigned int frames)
|
|
|
{
|
|
|
unsigned int i, c;
|
|
@@ -412,7 +412,7 @@ static void amdtp_fill_pcm_silence(struct amdtp_out_stream *s,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static void amdtp_fill_midi(struct amdtp_out_stream *s,
|
|
|
+static void amdtp_fill_midi(struct amdtp_stream *s,
|
|
|
__be32 *buffer, unsigned int frames)
|
|
|
{
|
|
|
unsigned int i;
|
|
@@ -422,7 +422,7 @@ static void amdtp_fill_midi(struct amdtp_out_stream *s,
|
|
|
cpu_to_be32(0x80000000);
|
|
|
}
|
|
|
|
|
|
-static void queue_out_packet(struct amdtp_out_stream *s, unsigned int cycle)
|
|
|
+static void queue_out_packet(struct amdtp_stream *s, unsigned int cycle)
|
|
|
{
|
|
|
__be32 *buffer;
|
|
|
unsigned int index, data_blocks, syt, ptr;
|
|
@@ -473,7 +473,7 @@ static void queue_out_packet(struct amdtp_out_stream *s, unsigned int cycle)
|
|
|
if (err < 0) {
|
|
|
dev_err(&s->unit->device, "queueing error: %d\n", err);
|
|
|
s->packet_index = -1;
|
|
|
- amdtp_out_stream_pcm_abort(s);
|
|
|
+ amdtp_stream_pcm_abort(s);
|
|
|
return;
|
|
|
}
|
|
|
|
|
@@ -501,7 +501,7 @@ static void queue_out_packet(struct amdtp_out_stream *s, unsigned int cycle)
|
|
|
|
|
|
static void pcm_period_tasklet(unsigned long data)
|
|
|
{
|
|
|
- struct amdtp_out_stream *s = (void *)data;
|
|
|
+ struct amdtp_stream *s = (void *)data;
|
|
|
struct snd_pcm_substream *pcm = ACCESS_ONCE(s->pcm);
|
|
|
|
|
|
if (pcm)
|
|
@@ -509,9 +509,9 @@ static void pcm_period_tasklet(unsigned long data)
|
|
|
}
|
|
|
|
|
|
static void out_packet_callback(struct fw_iso_context *context, u32 cycle,
|
|
|
- size_t header_length, void *header, void *data)
|
|
|
+ size_t header_length, void *header, void *private_data)
|
|
|
{
|
|
|
- struct amdtp_out_stream *s = data;
|
|
|
+ struct amdtp_stream *s = private_data;
|
|
|
unsigned int i, packets = header_length / 4;
|
|
|
|
|
|
/*
|
|
@@ -526,7 +526,7 @@ static void out_packet_callback(struct fw_iso_context *context, u32 cycle,
|
|
|
fw_iso_context_queue_flush(s->context);
|
|
|
}
|
|
|
|
|
|
-static int queue_initial_skip_packets(struct amdtp_out_stream *s)
|
|
|
+static int queue_initial_skip_packets(struct amdtp_stream *s)
|
|
|
{
|
|
|
struct fw_iso_packet skip_packet = {
|
|
|
.skip = 1,
|
|
@@ -548,16 +548,16 @@ static int queue_initial_skip_packets(struct amdtp_out_stream *s)
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * amdtp_out_stream_start - start sending packets
|
|
|
- * @s: the AMDTP output stream to start
|
|
|
+ * amdtp_stream_start - start transferring packets
|
|
|
+ * @s: the AMDTP stream to start
|
|
|
* @channel: the isochronous channel on the bus
|
|
|
* @speed: firewire speed code
|
|
|
*
|
|
|
* The stream cannot be started until it has been configured with
|
|
|
- * amdtp_out_stream_set_parameters() and amdtp_out_stream_set_pcm_format(),
|
|
|
- * and it must be started before any PCM or MIDI device can be started.
|
|
|
+ * amdtp_stream_set_parameters() and it must be started before any PCM or MIDI
|
|
|
+ * device can be started.
|
|
|
*/
|
|
|
-int amdtp_out_stream_start(struct amdtp_out_stream *s, int channel, int speed)
|
|
|
+int amdtp_stream_start(struct amdtp_stream *s, int channel, int speed)
|
|
|
{
|
|
|
static const struct {
|
|
|
unsigned int data_block;
|
|
@@ -575,7 +575,7 @@ int amdtp_out_stream_start(struct amdtp_out_stream *s, int channel, int speed)
|
|
|
|
|
|
mutex_lock(&s->mutex);
|
|
|
|
|
|
- if (WARN_ON(amdtp_out_stream_running(s) ||
|
|
|
+ if (WARN_ON(amdtp_stream_running(s) ||
|
|
|
(!s->pcm_channels && !s->midi_ports))) {
|
|
|
err = -EBADFD;
|
|
|
goto err_unlock;
|
|
@@ -586,7 +586,7 @@ int amdtp_out_stream_start(struct amdtp_out_stream *s, int channel, int speed)
|
|
|
s->last_syt_offset = TICKS_PER_CYCLE;
|
|
|
|
|
|
err = iso_packets_buffer_init(&s->buffer, s->unit, QUEUE_LENGTH,
|
|
|
- amdtp_out_stream_get_max_payload(s),
|
|
|
+ amdtp_stream_get_max_payload(s),
|
|
|
DMA_TO_DEVICE);
|
|
|
if (err < 0)
|
|
|
goto err_unlock;
|
|
@@ -599,11 +599,11 @@ int amdtp_out_stream_start(struct amdtp_out_stream *s, int channel, int speed)
|
|
|
err = PTR_ERR(s->context);
|
|
|
if (err == -EBUSY)
|
|
|
dev_err(&s->unit->device,
|
|
|
- "no free output stream on this controller\n");
|
|
|
+ "no free stream on this controller\n");
|
|
|
goto err_buffer;
|
|
|
}
|
|
|
|
|
|
- amdtp_out_stream_update(s);
|
|
|
+ amdtp_stream_update(s);
|
|
|
|
|
|
s->packet_index = 0;
|
|
|
s->data_block_counter = 0;
|
|
@@ -629,15 +629,15 @@ err_unlock:
|
|
|
|
|
|
return err;
|
|
|
}
|
|
|
-EXPORT_SYMBOL(amdtp_out_stream_start);
|
|
|
+EXPORT_SYMBOL(amdtp_stream_start);
|
|
|
|
|
|
/**
|
|
|
- * amdtp_out_stream_pcm_pointer - get the PCM buffer position
|
|
|
- * @s: the AMDTP output stream that transports the PCM data
|
|
|
+ * amdtp_stream_pcm_pointer - get the PCM buffer position
|
|
|
+ * @s: the AMDTP stream that transports the PCM data
|
|
|
*
|
|
|
* Returns the current buffer position, in frames.
|
|
|
*/
|
|
|
-unsigned long amdtp_out_stream_pcm_pointer(struct amdtp_out_stream *s)
|
|
|
+unsigned long amdtp_stream_pcm_pointer(struct amdtp_stream *s)
|
|
|
{
|
|
|
/* this optimization is allowed to be racy */
|
|
|
if (s->pointer_flush)
|
|
@@ -647,31 +647,31 @@ unsigned long amdtp_out_stream_pcm_pointer(struct amdtp_out_stream *s)
|
|
|
|
|
|
return ACCESS_ONCE(s->pcm_buffer_pointer);
|
|
|
}
|
|
|
-EXPORT_SYMBOL(amdtp_out_stream_pcm_pointer);
|
|
|
+EXPORT_SYMBOL(amdtp_stream_pcm_pointer);
|
|
|
|
|
|
/**
|
|
|
- * amdtp_out_stream_update - update the stream after a bus reset
|
|
|
- * @s: the AMDTP output stream
|
|
|
+ * amdtp_stream_update - update the stream after a bus reset
|
|
|
+ * @s: the AMDTP stream
|
|
|
*/
|
|
|
-void amdtp_out_stream_update(struct amdtp_out_stream *s)
|
|
|
+void amdtp_stream_update(struct amdtp_stream *s)
|
|
|
{
|
|
|
ACCESS_ONCE(s->source_node_id_field) =
|
|
|
(fw_parent_device(s->unit)->card->node_id & 0x3f) << 24;
|
|
|
}
|
|
|
-EXPORT_SYMBOL(amdtp_out_stream_update);
|
|
|
+EXPORT_SYMBOL(amdtp_stream_update);
|
|
|
|
|
|
/**
|
|
|
- * amdtp_out_stream_stop - stop sending packets
|
|
|
- * @s: the AMDTP output stream to stop
|
|
|
+ * amdtp_stream_stop - stop sending packets
|
|
|
+ * @s: the AMDTP stream to stop
|
|
|
*
|
|
|
* All PCM and MIDI devices of the stream must be stopped before the stream
|
|
|
* itself can be stopped.
|
|
|
*/
|
|
|
-void amdtp_out_stream_stop(struct amdtp_out_stream *s)
|
|
|
+void amdtp_stream_stop(struct amdtp_stream *s)
|
|
|
{
|
|
|
mutex_lock(&s->mutex);
|
|
|
|
|
|
- if (!amdtp_out_stream_running(s)) {
|
|
|
+ if (!amdtp_stream_running(s)) {
|
|
|
mutex_unlock(&s->mutex);
|
|
|
return;
|
|
|
}
|
|
@@ -684,16 +684,16 @@ void amdtp_out_stream_stop(struct amdtp_out_stream *s)
|
|
|
|
|
|
mutex_unlock(&s->mutex);
|
|
|
}
|
|
|
-EXPORT_SYMBOL(amdtp_out_stream_stop);
|
|
|
+EXPORT_SYMBOL(amdtp_stream_stop);
|
|
|
|
|
|
/**
|
|
|
- * amdtp_out_stream_pcm_abort - abort the running PCM device
|
|
|
+ * amdtp_stream_pcm_abort - abort the running PCM device
|
|
|
* @s: the AMDTP stream about to be stopped
|
|
|
*
|
|
|
* If the isochronous stream needs to be stopped asynchronously, call this
|
|
|
* function first to stop the PCM device.
|
|
|
*/
|
|
|
-void amdtp_out_stream_pcm_abort(struct amdtp_out_stream *s)
|
|
|
+void amdtp_stream_pcm_abort(struct amdtp_stream *s)
|
|
|
{
|
|
|
struct snd_pcm_substream *pcm;
|
|
|
|
|
@@ -705,4 +705,4 @@ void amdtp_out_stream_pcm_abort(struct amdtp_out_stream *s)
|
|
|
snd_pcm_stream_unlock_irq(pcm);
|
|
|
}
|
|
|
}
|
|
|
-EXPORT_SYMBOL(amdtp_out_stream_pcm_abort);
|
|
|
+EXPORT_SYMBOL(amdtp_stream_pcm_abort);
|