firewire: move fw_device reference counting from drivers to core
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>
This commit is contained in:
@@ -641,6 +641,7 @@ static void fw_unit_release(struct device *dev)
|
||||
{
|
||||
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_device *device)
|
||||
if (device_register(&unit->device) < 0)
|
||||
goto skip_unit;
|
||||
|
||||
fw_device_get(device);
|
||||
continue;
|
||||
|
||||
skip_unit:
|
||||
|
@@ -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_rwsem;
|
||||
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);
|
||||
|
Reference in New Issue
Block a user