Commit 2ef0b7cf authored by Takashi Sakamoto's avatar Takashi Sakamoto Committed by Takashi Iwai

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: default avatarTakashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent d670d445
...@@ -195,6 +195,19 @@ static void finish_session(struct snd_tscm *tscm) ...@@ -195,6 +195,19 @@ static void finish_session(struct snd_tscm *tscm)
TSCM_ADDR_BASE + TSCM_OFFSET_ISOC_RX_ON, TSCM_ADDR_BASE + TSCM_OFFSET_ISOC_RX_ON,
&reg, sizeof(reg), 0); &reg, 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,
&reg, sizeof(reg), 0);
reg = cpu_to_be32(0x00000000);
snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST,
TSCM_ADDR_BASE + TSCM_OFFSET_UNKNOWN,
&reg, 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,
&reg, sizeof(reg), 0);
} }
static int begin_session(struct snd_tscm *tscm) static int begin_session(struct snd_tscm *tscm)
...@@ -202,6 +215,30 @@ static int begin_session(struct snd_tscm *tscm) ...@@ -202,6 +215,30 @@ static int begin_session(struct snd_tscm *tscm)
__be32 reg; __be32 reg;
int err; 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,
&reg, 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,
&reg, 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,
&reg, sizeof(reg), 0);
if (err < 0)
return err;
reg = cpu_to_be32(0x00000001); reg = cpu_to_be32(0x00000001);
err = snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST, err = snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST,
TSCM_ADDR_BASE + TSCM_OFFSET_START_STREAMING, TSCM_ADDR_BASE + TSCM_OFFSET_START_STREAMING,
...@@ -216,7 +253,7 @@ static int begin_session(struct snd_tscm *tscm) ...@@ -216,7 +253,7 @@ static int begin_session(struct snd_tscm *tscm)
if (err < 0) if (err < 0)
return err; return err;
/* Set an option for unknown purpose. */ // Set an option for unknown purpose.
reg = cpu_to_be32(0x00002000); reg = cpu_to_be32(0x00002000);
err = snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST, err = snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST,
TSCM_ADDR_BASE + TSCM_OFFSET_SET_OPTION, TSCM_ADDR_BASE + TSCM_OFFSET_SET_OPTION,
...@@ -224,7 +261,7 @@ static int begin_session(struct snd_tscm *tscm) ...@@ -224,7 +261,7 @@ static int begin_session(struct snd_tscm *tscm)
if (err < 0) if (err < 0)
return err; return err;
/* Start multiplexing PCM samples on packets. */ // Start multiplexing PCM samples on packets.
reg = cpu_to_be32(0x00000001); reg = cpu_to_be32(0x00000001);
return snd_fw_transaction(tscm->unit, return snd_fw_transaction(tscm->unit,
TCODE_WRITE_QUADLET_REQUEST, TCODE_WRITE_QUADLET_REQUEST,
...@@ -234,30 +271,13 @@ static int begin_session(struct snd_tscm *tscm) ...@@ -234,30 +271,13 @@ static int begin_session(struct snd_tscm *tscm)
static void release_resources(struct snd_tscm *tscm) static void release_resources(struct snd_tscm *tscm)
{ {
__be32 reg; // Release isochronous resources.
/* Unregister channels. */
reg = cpu_to_be32(0x00000000);
snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST,
TSCM_ADDR_BASE + TSCM_OFFSET_ISOC_TX_CH,
&reg, sizeof(reg), 0);
reg = cpu_to_be32(0x00000000);
snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST,
TSCM_ADDR_BASE + TSCM_OFFSET_UNKNOWN,
&reg, 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,
&reg, sizeof(reg), 0);
/* Release isochronous resources. */
fw_iso_resources_free(&tscm->tx_resources); fw_iso_resources_free(&tscm->tx_resources);
fw_iso_resources_free(&tscm->rx_resources); fw_iso_resources_free(&tscm->rx_resources);
} }
static int keep_resources(struct snd_tscm *tscm, unsigned int rate) static int keep_resources(struct snd_tscm *tscm, unsigned int rate)
{ {
__be32 reg;
int err; int err;
/* Keep resources for in-stream. */ /* Keep resources for in-stream. */
...@@ -280,30 +300,6 @@ static int keep_resources(struct snd_tscm *tscm, unsigned int rate) ...@@ -280,30 +300,6 @@ static int keep_resources(struct snd_tscm *tscm, unsigned int rate)
if (err < 0) if (err < 0)
return err; 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,
&reg, 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,
&reg, 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,
&reg, sizeof(reg), 0);
if (err < 0)
goto error;
return 0; return 0;
error: error:
release_resources(tscm); release_resources(tscm);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment