ALSA: firewire-tascam: code refactoring for registration of isochronous channels
This commit is a part of preparation to perform allocation/release of isochronous channels in pcm.hw_params/hw_free callbacks. The registration of isochronous channels is done just after allocation of isochronous resources. This commit separates the registration just before starting packet streaming. Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
d670d44582
commit
2ef0b7cf16
|
@ -195,6 +195,19 @@ static void finish_session(struct snd_tscm *tscm)
|
|||
TSCM_ADDR_BASE + TSCM_OFFSET_ISOC_RX_ON,
|
||||
®, sizeof(reg), 0);
|
||||
|
||||
// Unregister channels.
|
||||
reg = cpu_to_be32(0x00000000);
|
||||
snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST,
|
||||
TSCM_ADDR_BASE + TSCM_OFFSET_ISOC_TX_CH,
|
||||
®, sizeof(reg), 0);
|
||||
reg = cpu_to_be32(0x00000000);
|
||||
snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST,
|
||||
TSCM_ADDR_BASE + TSCM_OFFSET_UNKNOWN,
|
||||
®, sizeof(reg), 0);
|
||||
reg = cpu_to_be32(0x00000000);
|
||||
snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST,
|
||||
TSCM_ADDR_BASE + TSCM_OFFSET_ISOC_RX_CH,
|
||||
®, sizeof(reg), 0);
|
||||
}
|
||||
|
||||
static int begin_session(struct snd_tscm *tscm)
|
||||
|
@ -202,6 +215,30 @@ static int begin_session(struct snd_tscm *tscm)
|
|||
__be32 reg;
|
||||
int err;
|
||||
|
||||
// Register the isochronous channel for transmitting stream.
|
||||
reg = cpu_to_be32(tscm->tx_resources.channel);
|
||||
err = snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST,
|
||||
TSCM_ADDR_BASE + TSCM_OFFSET_ISOC_TX_CH,
|
||||
®, sizeof(reg), 0);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
// Unknown.
|
||||
reg = cpu_to_be32(0x00000002);
|
||||
err = snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST,
|
||||
TSCM_ADDR_BASE + TSCM_OFFSET_UNKNOWN,
|
||||
®, sizeof(reg), 0);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
// Register the isochronous channel for receiving stream.
|
||||
reg = cpu_to_be32(tscm->rx_resources.channel);
|
||||
err = snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST,
|
||||
TSCM_ADDR_BASE + TSCM_OFFSET_ISOC_RX_CH,
|
||||
®, sizeof(reg), 0);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
reg = cpu_to_be32(0x00000001);
|
||||
err = snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST,
|
||||
TSCM_ADDR_BASE + TSCM_OFFSET_START_STREAMING,
|
||||
|
@ -216,7 +253,7 @@ static int begin_session(struct snd_tscm *tscm)
|
|||
if (err < 0)
|
||||
return err;
|
||||
|
||||
/* Set an option for unknown purpose. */
|
||||
// Set an option for unknown purpose.
|
||||
reg = cpu_to_be32(0x00002000);
|
||||
err = snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST,
|
||||
TSCM_ADDR_BASE + TSCM_OFFSET_SET_OPTION,
|
||||
|
@ -224,7 +261,7 @@ static int begin_session(struct snd_tscm *tscm)
|
|||
if (err < 0)
|
||||
return err;
|
||||
|
||||
/* Start multiplexing PCM samples on packets. */
|
||||
// Start multiplexing PCM samples on packets.
|
||||
reg = cpu_to_be32(0x00000001);
|
||||
return snd_fw_transaction(tscm->unit,
|
||||
TCODE_WRITE_QUADLET_REQUEST,
|
||||
|
@ -234,30 +271,13 @@ static int begin_session(struct snd_tscm *tscm)
|
|||
|
||||
static void release_resources(struct snd_tscm *tscm)
|
||||
{
|
||||
__be32 reg;
|
||||
|
||||
/* Unregister channels. */
|
||||
reg = cpu_to_be32(0x00000000);
|
||||
snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST,
|
||||
TSCM_ADDR_BASE + TSCM_OFFSET_ISOC_TX_CH,
|
||||
®, sizeof(reg), 0);
|
||||
reg = cpu_to_be32(0x00000000);
|
||||
snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST,
|
||||
TSCM_ADDR_BASE + TSCM_OFFSET_UNKNOWN,
|
||||
®, sizeof(reg), 0);
|
||||
reg = cpu_to_be32(0x00000000);
|
||||
snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST,
|
||||
TSCM_ADDR_BASE + TSCM_OFFSET_ISOC_RX_CH,
|
||||
®, sizeof(reg), 0);
|
||||
|
||||
/* Release isochronous resources. */
|
||||
// Release isochronous resources.
|
||||
fw_iso_resources_free(&tscm->tx_resources);
|
||||
fw_iso_resources_free(&tscm->rx_resources);
|
||||
}
|
||||
|
||||
static int keep_resources(struct snd_tscm *tscm, unsigned int rate)
|
||||
{
|
||||
__be32 reg;
|
||||
int err;
|
||||
|
||||
/* Keep resources for in-stream. */
|
||||
|
@ -280,30 +300,6 @@ static int keep_resources(struct snd_tscm *tscm, unsigned int rate)
|
|||
if (err < 0)
|
||||
return err;
|
||||
|
||||
/* Register the isochronous channel for transmitting stream. */
|
||||
reg = cpu_to_be32(tscm->tx_resources.channel);
|
||||
err = snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST,
|
||||
TSCM_ADDR_BASE + TSCM_OFFSET_ISOC_TX_CH,
|
||||
®, sizeof(reg), 0);
|
||||
if (err < 0)
|
||||
goto error;
|
||||
|
||||
/* Unknown */
|
||||
reg = cpu_to_be32(0x00000002);
|
||||
err = snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST,
|
||||
TSCM_ADDR_BASE + TSCM_OFFSET_UNKNOWN,
|
||||
®, sizeof(reg), 0);
|
||||
if (err < 0)
|
||||
goto error;
|
||||
|
||||
/* Register the isochronous channel for receiving stream. */
|
||||
reg = cpu_to_be32(tscm->rx_resources.channel);
|
||||
err = snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST,
|
||||
TSCM_ADDR_BASE + TSCM_OFFSET_ISOC_RX_CH,
|
||||
®, sizeof(reg), 0);
|
||||
if (err < 0)
|
||||
goto error;
|
||||
|
||||
return 0;
|
||||
error:
|
||||
release_resources(tscm);
|
||||
|
|
Loading…
Reference in New Issue