Alsa-Devel Archive on lore.kernel.org
 help / color / Atom feed
From: Takashi Sakamoto <o-takashi@sakamocchi.jp>
To: clemens@ladisch.de, tiwai@suse.de, perex@perex.cz
Cc: alsa-devel@alsa-project.org, ffado-devel@lists.sf.net
Subject: [PATCH 14/39] firewire-lib: Add handling output connection by CMP
Date: Wed,  5 Mar 2014 19:48:02 +0900
Message-ID: <1394016507-15761-15-git-send-email-o-takashi@sakamocchi.jp> (raw)
In-Reply-To: <1394016507-15761-1-git-send-email-o-takashi@sakamocchi.jp>

This patch adds some macros, codes with condition of direction and new functions
to handle output connection. Once cmp_connection_init() is executed with its
direction, CMP input and output connection can be handled by the same way.
---
 sound/firewire/cmp.c | 102 ++++++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 93 insertions(+), 9 deletions(-)

diff --git a/sound/firewire/cmp.c b/sound/firewire/cmp.c
index c7f7a31..60d2e17 100644
--- a/sound/firewire/cmp.c
+++ b/sound/firewire/cmp.c
@@ -29,6 +29,14 @@
 #define PCR_CHANNEL_MASK	0x003f0000
 #define PCR_CHANNEL_SHIFT	16
 
+/* oPCR specific fields */
+#define OPCR_XSPEED_MASK	0x00C00000
+#define OPCR_XSPEED_SHIFT	22
+#define OPCR_SPEED_MASK		0x0000C000
+#define OPCR_SPEED_SHIFT	14
+#define OPCR_OVERHEAD_ID_MASK	0x00003C00
+#define OPCR_OVERHEAD_ID_SHIFT	10
+
 enum bus_reset_handling {
 	ABORT_ON_BUS_RESET,
 	SUCCEED_ON_BUS_RESET,
@@ -41,10 +49,30 @@ void cmp_error(struct cmp_connection *c, const char *fmt, ...)
 
 	va_start(va, fmt);
 	dev_err(&c->resources.unit->device, "%cPCR%u: %pV",
-		'i', c->pcr_index, &(struct va_format){ fmt, &va });
+		(c->direction == CMP_INPUT) ? 'i' : 'o',
+		c->pcr_index, &(struct va_format){ fmt, &va });
 	va_end(va);
 }
 
+static unsigned long long get_offset(struct cmp_connection *c, bool master)
+{
+	unsigned long long offset = CSR_REGISTER_BASE;
+
+	if (!master) {
+		if (c->direction == CMP_INPUT)
+			offset += CSR_IPCR(c->pcr_index);
+		else
+			offset += CSR_OPCR(c->pcr_index);
+	} else {
+		if (c->direction == CMP_INPUT)
+			offset += CSR_IMPR;
+		else
+			offset += CSR_OMPR;
+	}
+
+	return offset;
+}
+
 static int pcr_modify(struct cmp_connection *c,
 		      __be32 (*modify)(struct cmp_connection *c, __be32 old),
 		      int (*check)(struct cmp_connection *c, __be32 pcr),
@@ -60,8 +88,7 @@ static int pcr_modify(struct cmp_connection *c,
 
 		err = snd_fw_transaction(
 				c->resources.unit, TCODE_LOCK_COMPARE_SWAP,
-				CSR_REGISTER_BASE + CSR_IPCR(c->pcr_index),
-				buffer, 8,
+				get_offset(c, false), buffer, 8,
 				FW_FIXED_GENERATION | c->resources.generation);
 
 		if (err < 0) {
@@ -102,8 +129,7 @@ int cmp_connection_init(struct cmp_connection *c,
 	int err;
 
 	err = snd_fw_transaction(unit, TCODE_READ_QUADLET_REQUEST,
-				 CSR_REGISTER_BASE + CSR_IMPR,
-				 &mpr_be, 4, 0);
+				 get_offset(c, true), &mpr_be, 4, 0);
 	if (err < 0)
 		return err;
 	mpr = be32_to_cpu(mpr_be);
@@ -122,6 +148,7 @@ int cmp_connection_init(struct cmp_connection *c,
 	c->max_speed = (mpr & MPR_SPEED_MASK) >> MPR_SPEED_SHIFT;
 	if (c->max_speed == SCODE_BETA)
 		c->max_speed += (mpr & MPR_XSPEED_MASK) >> MPR_XSPEED_SHIFT;
+	c->direction = direction;
 
 	return 0;
 }
@@ -151,6 +178,53 @@ static __be32 ipcr_set_modify(struct cmp_connection *c, __be32 ipcr)
 	return ipcr;
 }
 
+static int get_overhead_id(struct cmp_connection *c)
+{
+	int id;
+
+	/*
+	 * apply "oPCR overhead ID encoding"
+	 * the encoding table can convert up to 512.
+	 * here the value over 512 is converted as the same way as 512.
+	 */
+	for (id = 1; id < 16; id++) {
+		if (c->resources.bandwidth_overhead < (id << 5))
+			break;
+	}
+	if (id == 16)
+		id = 0;
+
+	return id;
+}
+
+static __be32 opcr_set_modify(struct cmp_connection *c, __be32 opcr)
+{
+	unsigned int spd, xspd;
+
+	/* generate speed and extended speed field value */
+	if (c->speed > SCODE_400) {
+		spd  = SCODE_800;
+		xspd = c->speed - SCODE_800;
+	} else {
+		spd = c->speed;
+		xspd = 0;
+	}
+
+	opcr &= ~cpu_to_be32(PCR_BCAST_CONN |
+			     PCR_P2P_CONN_MASK |
+			     OPCR_XSPEED_MASK |
+			     PCR_CHANNEL_MASK |
+			     OPCR_SPEED_MASK |
+			     OPCR_OVERHEAD_ID_MASK);
+	opcr |= cpu_to_be32(1 << PCR_P2P_CONN_SHIFT);
+	opcr |= cpu_to_be32(xspd << OPCR_XSPEED_SHIFT);
+	opcr |= cpu_to_be32(c->resources.channel << PCR_CHANNEL_SHIFT);
+	opcr |= cpu_to_be32(spd << OPCR_SPEED_SHIFT);
+	opcr |= cpu_to_be32(get_overhead_id(c) << OPCR_OVERHEAD_ID_SHIFT);
+
+	return opcr;
+}
+
 static int pcr_set_check(struct cmp_connection *c, __be32 pcr)
 {
 	if (pcr & cpu_to_be32(PCR_BCAST_CONN |
@@ -196,8 +270,13 @@ retry_after_bus_reset:
 	if (err < 0)
 		goto err_mutex;
 
-	err = pcr_modify(c, ipcr_set_modify, pcr_set_check,
-			 ABORT_ON_BUS_RESET);
+	if (c->direction == CMP_OUTPUT)
+		err = pcr_modify(c, opcr_set_modify, pcr_set_check,
+				 ABORT_ON_BUS_RESET);
+	else
+		err = pcr_modify(c, ipcr_set_modify, pcr_set_check,
+				 ABORT_ON_BUS_RESET);
+
 	if (err == -EAGAIN) {
 		fw_iso_resources_free(&c->resources);
 		goto retry_after_bus_reset;
@@ -245,8 +324,13 @@ int cmp_connection_update(struct cmp_connection *c)
 	if (err < 0)
 		goto err_unconnect;
 
-	err = pcr_modify(c, ipcr_set_modify, pcr_set_check,
-			 SUCCEED_ON_BUS_RESET);
+	if (c->direction == CMP_OUTPUT)
+		err = pcr_modify(c, opcr_set_modify, pcr_set_check,
+				 SUCCEED_ON_BUS_RESET);
+	else
+		err = pcr_modify(c, ipcr_set_modify, pcr_set_check,
+				 SUCCEED_ON_BUS_RESET);
+
 	if (err < 0)
 		goto err_resources;
 
-- 
1.8.3.2

  parent reply index

Thread overview: 76+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <5316963F.1000206@sakamocchi.jp>
2014-03-05  6:14 ` [GIT PULL v2] Enhancement of support for Firewire devices Takashi Iwai
2014-03-05 11:00   ` Takashi Sakamoto
2014-03-05 11:09     ` Takashi Iwai
2014-03-05 11:23       ` Takashi Sakamoto
2014-03-05 10:47 ` [GIT PULL][PATCH 00/39 " Takashi Sakamoto
2014-03-05 10:47   ` [PATCH 01/39] firewire-lib: Rename functions, structure, member for AMDTP Takashi Sakamoto
2014-03-05 10:47   ` [PATCH 02/39] firewire-lib: Add macros instead of fixed value " Takashi Sakamoto
2014-03-05 10:47   ` [PATCH 03/39] firewire-lib: Add 'direction' member to 'amdtp_stream' structure Takashi Sakamoto
2014-03-05 10:47   ` [PATCH 04/39] firewire-lib: Split some codes into functions to reuse for both streams Takashi Sakamoto
2014-03-05 10:47   ` [PATCH 05/39] firewire-lib: Add support for AMDTP in-stream and PCM capture Takashi Sakamoto
2014-03-09 20:37     ` Clemens Ladisch
2014-03-10  3:55       ` Takashi Sakamoto
2014-03-12  2:00       ` Takashi Sakamoto
2014-03-14 13:50       ` Takashi Sakamoto
2014-03-05 10:47   ` [PATCH 06/39] firewire-lib: Add support for MIDI capture/playback Takashi Sakamoto
2014-03-09 20:48     ` Clemens Ladisch
2014-03-10  4:13       ` Takashi Sakamoto
2014-03-05 10:47   ` [PATCH 07/39] firewire-lib: Give syt value as parameter to handle_out_packet() Takashi Sakamoto
2014-03-05 10:47   ` [PATCH 08/39] firewire-lib: Add support for duplex streams synchronization in blocking mode Takashi Sakamoto
2014-03-09 20:55     ` Clemens Ladisch
2014-03-10 12:21       ` Takashi Sakamoto
2014-03-05 10:47   ` [PATCH 09/39] firewire-lib: Add sort function for transmitted packet Takashi Sakamoto
2014-03-09 21:07     ` Clemens Ladisch
2014-03-10 13:29       ` Takashi Sakamoto
2014-03-11  8:11         ` Clemens Ladisch
2014-03-12  1:23           ` Takashi Sakamoto
2014-03-12  7:21             ` Takashi Iwai
2014-03-05 10:47   ` [PATCH 10/39] firewire-lib: Add transfer delay to synchronized duplex streams Takashi Sakamoto
2014-03-09 21:13     ` Clemens Ladisch
2014-03-10 13:43       ` Takashi Sakamoto
2014-03-11  8:13         ` Clemens Ladisch
2014-03-05 10:47   ` [PATCH 11/39] firewire-lib: Add support for channel mapping Takashi Sakamoto
2014-03-09 21:20     ` Clemens Ladisch
2014-03-10 12:28       ` Takashi Sakamoto
2014-03-10 12:58         ` Takashi Sakamoto
2014-03-11  8:23         ` Clemens Ladisch
2014-03-11 16:03           ` Takashi Sakamoto
2014-03-05 10:48   ` [PATCH 12/39] firewire-lib: Rename macros, variables and functions for CMP Takashi Sakamoto
2014-03-05 10:48   ` [PATCH 13/39] firewire-lib: Add 'direction' member to 'cmp_connection' structure Takashi Sakamoto
2014-03-05 10:48   ` Takashi Sakamoto [this message]
2014-03-09 21:27     ` [PATCH 14/39] firewire-lib: Add handling output connection by CMP Clemens Ladisch
2014-03-10 12:30       ` Takashi Sakamoto
2014-03-05 10:48   ` [PATCH 15/39] firewire-lib: Add a new function to check others' connection Takashi Sakamoto
2014-03-05 10:48   ` [PATCH 16/39] firewire-lib: Add some AV/C general commands Takashi Sakamoto
2014-03-09 21:32     ` Clemens Ladisch
2014-03-10 12:46       ` Takashi Sakamoto
2014-03-14 14:10       ` Takashi Sakamoto
2014-03-14 22:18         ` Clemens Ladisch
2014-03-05 10:48   ` [PATCH 17/39] firewire-lib: Add quirks for Fireworks Takashi Sakamoto
2014-03-09 21:39     ` Clemens Ladisch
2014-03-10 12:40       ` Takashi Sakamoto
2014-03-05 10:48   ` [PATCH 18/39] firewire-lib: Add a fallback at RCODE_CANCELLED Takashi Sakamoto
2014-03-05 10:48   ` [PATCH 19/39] fireworks: Add skelton for Fireworks based devices Takashi Sakamoto
2014-03-05 10:48   ` [PATCH 20/39] fireworks: Add transaction and some commands Takashi Sakamoto
2014-03-05 10:48   ` [PATCH 21/39] fireworks: Add connection and stream management Takashi Sakamoto
2014-03-05 10:48   ` [PATCH 22/39] fireworks: Add proc interface for debugging purpose Takashi Sakamoto
2014-03-05 10:48   ` [PATCH 23/39] fireworks: Add MIDI interface Takashi Sakamoto
2014-03-05 10:48   ` [PATCH 24/39] fireworks: Add PCM interface Takashi Sakamoto
2014-03-05 10:48   ` [PATCH 25/39] fireworks: Add hwdep interface Takashi Sakamoto
2014-03-05 10:48   ` [PATCH 26/39] fireworks: Add command/response functionality into " Takashi Sakamoto
2014-03-05 10:48   ` [PATCH 27/39] bebob: Add skelton for BeBoB based devices Takashi Sakamoto
2014-03-05 10:48   ` [PATCH 28/39] bebob: Add commands and connections/streams management Takashi Sakamoto
2014-03-05 10:48   ` [PATCH 29/39] bebob: Add proc interface for debugging purpose Takashi Sakamoto
2014-03-05 10:48   ` [PATCH 30/39] bebob: Add MIDI interface Takashi Sakamoto
2014-03-05 10:48   ` [PATCH 31/39] bebob: Add PCM interface Takashi Sakamoto
2014-03-05 10:48   ` [PATCH 32/39] bebob: Add hwdep interface Takashi Sakamoto
2014-03-05 10:48   ` [PATCH 33/39] bebob: Prepare for device specific operations Takashi Sakamoto
2014-03-05 10:48   ` [PATCH 34/39] bebob: Add support for Terratec PHASE, EWS series and Aureon Takashi Sakamoto
2014-03-05 10:48   ` [PATCH 35/39] bebob: Add support for Yamaha GO series Takashi Sakamoto
2014-03-05 10:48   ` [PATCH 36/39] bebob: Add support for Focusrite Saffire/SaffirePro series Takashi Sakamoto
2014-03-05 10:48   ` [PATCH 37/39] bebob: Add support for M-Audio usual Firewire series Takashi Sakamoto
2014-03-05 10:48   ` [PATCH 38/39] bebob: Add support for M-Audio special " Takashi Sakamoto
2014-03-05 10:48   ` [PATCH 39/39] bebob: Send a cue to load firmware for M-Audio " Takashi Sakamoto
2014-03-07 11:44 ` [GIT PULL v2] Enhancement of support for Firewire devices Takashi Iwai
2014-03-07 14:46   ` Clemens Ladisch
2014-02-28  3:27 [GIT PULL][PATCH 00/39] " Takashi Sakamoto
2014-02-28  3:27 ` [PATCH 14/39] firewire-lib: Add handling output connection by CMP Takashi Sakamoto

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1394016507-15761-15-git-send-email-o-takashi@sakamocchi.jp \
    --to=o-takashi@sakamocchi.jp \
    --cc=alsa-devel@alsa-project.org \
    --cc=clemens@ladisch.de \
    --cc=ffado-devel@lists.sf.net \
    --cc=perex@perex.cz \
    --cc=tiwai@suse.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

Alsa-Devel Archive on lore.kernel.org

Archives are clonable:
	git clone --mirror https://lore.kernel.org/alsa-devel/0 alsa-devel/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 alsa-devel alsa-devel/ https://lore.kernel.org/alsa-devel \
		alsa-devel@alsa-project.org
	public-inbox-index alsa-devel

Example config snippet for mirrors

Newsgroup available over NNTP:
	nntp://nntp.lore.kernel.org/org.alsa-project.alsa-devel


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git