All of lore.kernel.org
 help / color / mirror / Atom feed
From: Stefan Richter <stefanr@s5r6.in-berlin.de>
To: linux1394-devel@lists.sourceforge.net
Cc: alsa-devel@alsa-project.org
Subject: [PATCH] firewire: move fw_device reference counting from drivers to core
Date: Sat, 27 Aug 2011 18:53:03 +0200	[thread overview]
Message-ID: <20110827185303.16263e89@stein> (raw)

fw_unit device drivers invariably need to talk to the fw_unit's parent
(an fw_device) and grandparent (an fw_card).  firewire-core already
maintains an fw_card reference for the entire lifetime of an fw_device.
Likewise, let firewire-core maintain an fw_device reference for the
entire lifetime of an fw_unit so that fw_unit drivers don't have to.

Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
---
Depends on patch "firewire: sbp2: remove obsolete reference counting",
http://marc.info/?l=linux1394-devel&m=131445207126341 .

Clemens needs to pick up the dice.c hunk when he merges or rebases.

 drivers/firewire/core-device.c |    2 ++
 drivers/firewire/core.h        |   13 +++++++++++++
 include/linux/firewire.h       |   12 ------------
 sound/firewire/dice.c          |    5 -----
 sound/firewire/isight.c        |    4 +---
 sound/firewire/speakers.c      |    4 ----
 6 files changed, 16 insertions(+), 24 deletions(-)

Index: b/drivers/firewire/core-device.c
===================================================================
--- a/drivers/firewire/core-device.c
+++ b/drivers/firewire/core-device.c
@@ -641,6 +641,7 @@ static void fw_unit_release(struct devic
 {
 	struct fw_unit *unit = fw_unit(dev);
 
+	fw_device_put(fw_parent_device(unit));
 	kfree(unit);
 }
 
@@ -692,6 +693,7 @@ static void create_units(struct fw_devic
 		if (device_register(&unit->device) < 0)
 			goto skip_unit;
 
+		fw_device_get(device);
 		continue;
 
 	skip_unit:
Index: b/drivers/firewire/core.h
===================================================================
--- a/drivers/firewire/core.h
+++ b/drivers/firewire/core.h
@@ -1,6 +1,7 @@
 #ifndef _FIREWIRE_CORE_H
 #define _FIREWIRE_CORE_H
 
+#include <linux/device.h>
 #include <linux/fs.h>
 #include <linux/list.h>
 #include <linux/idr.h>
@@ -141,6 +142,18 @@ extern struct rw_semaphore fw_device_rws
 extern struct idr fw_device_idr;
 extern int fw_cdev_major;
 
+static inline struct fw_device *fw_device_get(struct fw_device *device)
+{
+	get_device(&device->device);
+
+	return device;
+}
+
+static inline void fw_device_put(struct fw_device *device)
+{
+	put_device(&device->device);
+}
+
 struct fw_device *fw_device_get_by_devt(dev_t devt);
 int fw_device_set_broadcast_channel(struct device *dev, void *gen);
 void fw_node_event(struct fw_card *card, struct fw_node *node, int event);
Index: b/include/linux/firewire.h
===================================================================
--- a/include/linux/firewire.h
+++ b/include/linux/firewire.h
@@ -204,18 +204,6 @@ static inline int fw_device_is_shutdown(
 	return atomic_read(&device->state) == FW_DEVICE_SHUTDOWN;
 }
 
-static inline struct fw_device *fw_device_get(struct fw_device *device)
-{
-	get_device(&device->device);
-
-	return device;
-}
-
-static inline void fw_device_put(struct fw_device *device)
-{
-	put_device(&device->device);
-}
-
 int fw_device_enable_phys_dma(struct fw_device *device);
 
 /*
Index: b/sound/firewire/dice.c
===================================================================
--- a/sound/firewire/dice.c
+++ b/sound/firewire/dice.c
@@ -1033,12 +1033,10 @@ static int dice_create_hwdep(struct dice
 static void dice_card_free(struct snd_card *card)
 {
 	struct dice *dice = card->private_data;
-	struct fw_device *dev = fw_parent_device(dice->unit);
 
 	amdtp_out_stream_destroy(&dice->stream);
 	fw_core_remove_address_handler(&dice->notification_handler);
 	fw_unit_put(dice->unit);
-	fw_device_put(dev);
 	mutex_destroy(&dice->mutex);
 }
 
@@ -1106,7 +1104,6 @@ static void __devinit dice_card_strings(
 static int __devinit dice_probe(struct device *unit_dev)
 {
 	struct fw_unit *unit = fw_unit(unit_dev);
-	struct fw_device *fw_dev = fw_parent_device(unit);
 	struct snd_card *card;
 	struct dice *dice;
 	__be32 clock_sel;
@@ -1121,7 +1118,6 @@ static int __devinit dice_probe(struct d
 	dice->card = card;
 	spin_lock_init(&dice->lock);
 	mutex_init(&dice->mutex);
-	fw_device_get(fw_dev);
 	dice->unit = fw_unit_get(unit);
 	init_waitqueue_head(&dice->hwdep_wait);
 
@@ -1191,7 +1187,6 @@ err_notification_handler:
 	fw_core_remove_address_handler(&dice->notification_handler);
 err_unit:
 	fw_unit_put(dice->unit);
-	fw_device_put(fw_dev);
 	mutex_destroy(&dice->mutex);
 error:
 	snd_card_free(card);
Index: b/sound/firewire/isight.c
===================================================================
--- a/sound/firewire/isight.c
+++ b/sound/firewire/isight.c
@@ -612,7 +612,6 @@ static void isight_card_free(struct snd_
 
 	fw_iso_resources_destroy(&isight->resources);
 	fw_unit_put(isight->unit);
-	fw_device_put(isight->device);
 	mutex_destroy(&isight->mutex);
 }
 
@@ -645,7 +644,7 @@ static int isight_probe(struct device *u
 	isight->card = card;
 	mutex_init(&isight->mutex);
 	isight->unit = fw_unit_get(unit);
-	isight->device = fw_device_get(fw_dev);
+	isight->device = fw_dev;
 	isight->audio_base = get_unit_base(unit);
 	if (!isight->audio_base) {
 		dev_err(&unit->device, "audio unit base not found\n");
@@ -682,7 +681,6 @@ static int isight_probe(struct device *u
 
 err_unit:
 	fw_unit_put(isight->unit);
-	fw_device_put(isight->device);
 	mutex_destroy(&isight->mutex);
 error:
 	snd_card_free(card);
Index: b/sound/firewire/speakers.c
===================================================================
--- a/sound/firewire/speakers.c
+++ b/sound/firewire/speakers.c
@@ -656,12 +656,10 @@ static u32 fwspk_read_firmware_version(s
 static void fwspk_card_free(struct snd_card *card)
 {
 	struct fwspk *fwspk = card->private_data;
-	struct fw_device *dev = fw_parent_device(fwspk->unit);
 
 	amdtp_out_stream_destroy(&fwspk->stream);
 	cmp_connection_destroy(&fwspk->connection);
 	fw_unit_put(fwspk->unit);
-	fw_device_put(dev);
 	mutex_destroy(&fwspk->mutex);
 }
 
@@ -718,7 +716,6 @@ static int __devinit fwspk_probe(struct
 	fwspk = card->private_data;
 	fwspk->card = card;
 	mutex_init(&fwspk->mutex);
-	fw_device_get(fw_dev);
 	fwspk->unit = fw_unit_get(unit);
 	fwspk->device_info = fwspk_detect(fw_dev);
 	if (!fwspk->device_info) {
@@ -767,7 +764,6 @@ err_connection:
 	cmp_connection_destroy(&fwspk->connection);
 err_unit:
 	fw_unit_put(fwspk->unit);
-	fw_device_put(fw_dev);
 	mutex_destroy(&fwspk->mutex);
 error:
 	snd_card_free(card);


-- 
Stefan Richter
-=====-==-== =--- ==-==
http://arcgraph.de/sr/

------------------------------------------------------------------------------
EMC VNX: the world's simplest storage, starting under $10K
The only unified storage solution that offers unified management 
Up to 160% more powerful than alternatives and 25% more efficient. 
Guaranteed. http://p.sf.net/sfu/emc-vnx-dev2dev

                 reply	other threads:[~2011-08-27 16:53 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

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=20110827185303.16263e89@stein \
    --to=stefanr@s5r6.in-berlin.de \
    --cc=alsa-devel@alsa-project.org \
    --cc=linux1394-devel@lists.sourceforge.net \
    /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
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.