diff options
author | Stefan Richter <stefanr@s5r6.in-berlin.de> | 2009-06-06 12:37:25 -0400 |
---|---|---|
committer | Stefan Richter <stefanr@s5r6.in-berlin.de> | 2009-06-06 15:45:50 -0400 |
commit | 099d54143e49d49c33cd25779ca725191df59b73 (patch) | |
tree | 8237acfc84aa5057ce8c98b1301b6d54cf056ba0 | |
parent | e034d242593f12533c11742ce38c245a33e57dc7 (diff) |
firewire: core: prepare for non-core children of card devices
The IP-over-1394 driver will add child devices beneath card devices
which are not of type fw_device. Hence firewire-core's callbacks in
device_for_each_child() and device_find_child() need to check for the
device type now.
Initial version written by Jay Fenlason.
Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
-rw-r--r-- | drivers/firewire/core-card.c | 8 | ||||
-rw-r--r-- | drivers/firewire/core-device.c | 24 | ||||
-rw-r--r-- | drivers/firewire/core.h | 2 |
3 files changed, 22 insertions, 12 deletions
diff --git a/drivers/firewire/core-card.c b/drivers/firewire/core-card.c index ba6cd70b8518..4c1be64fdddd 100644 --- a/drivers/firewire/core-card.c +++ b/drivers/firewire/core-card.c | |||
@@ -190,12 +190,6 @@ void fw_core_remove_descriptor(struct fw_descriptor *desc) | |||
190 | mutex_unlock(&card_mutex); | 190 | mutex_unlock(&card_mutex); |
191 | } | 191 | } |
192 | 192 | ||
193 | static int set_broadcast_channel(struct device *dev, void *data) | ||
194 | { | ||
195 | fw_device_set_broadcast_channel(fw_device(dev), (long)data); | ||
196 | return 0; | ||
197 | } | ||
198 | |||
199 | static void allocate_broadcast_channel(struct fw_card *card, int generation) | 193 | static void allocate_broadcast_channel(struct fw_card *card, int generation) |
200 | { | 194 | { |
201 | int channel, bandwidth = 0; | 195 | int channel, bandwidth = 0; |
@@ -205,7 +199,7 @@ static void allocate_broadcast_channel(struct fw_card *card, int generation) | |||
205 | if (channel == 31) { | 199 | if (channel == 31) { |
206 | card->broadcast_channel_allocated = true; | 200 | card->broadcast_channel_allocated = true; |
207 | device_for_each_child(card->device, (void *)(long)generation, | 201 | device_for_each_child(card->device, (void *)(long)generation, |
208 | set_broadcast_channel); | 202 | fw_device_set_broadcast_channel); |
209 | } | 203 | } |
210 | } | 204 | } |
211 | 205 | ||
diff --git a/drivers/firewire/core-device.c b/drivers/firewire/core-device.c index 3f4e646367b7..d6e54a5173fc 100644 --- a/drivers/firewire/core-device.c +++ b/drivers/firewire/core-device.c | |||
@@ -59,7 +59,7 @@ int fw_csr_iterator_next(struct fw_csr_iterator *ci, int *key, int *value) | |||
59 | } | 59 | } |
60 | EXPORT_SYMBOL(fw_csr_iterator_next); | 60 | EXPORT_SYMBOL(fw_csr_iterator_next); |
61 | 61 | ||
62 | static int is_fw_unit(struct device *dev); | 62 | static bool is_fw_unit(struct device *dev); |
63 | 63 | ||
64 | static int match_unit_directory(u32 *directory, u32 match_flags, | 64 | static int match_unit_directory(u32 *directory, u32 match_flags, |
65 | const struct ieee1394_device_id *id) | 65 | const struct ieee1394_device_id *id) |
@@ -599,7 +599,7 @@ static struct device_type fw_unit_type = { | |||
599 | .release = fw_unit_release, | 599 | .release = fw_unit_release, |
600 | }; | 600 | }; |
601 | 601 | ||
602 | static int is_fw_unit(struct device *dev) | 602 | static bool is_fw_unit(struct device *dev) |
603 | { | 603 | { |
604 | return dev->type == &fw_unit_type; | 604 | return dev->type == &fw_unit_type; |
605 | } | 605 | } |
@@ -749,6 +749,11 @@ static struct device_type fw_device_type = { | |||
749 | .release = fw_device_release, | 749 | .release = fw_device_release, |
750 | }; | 750 | }; |
751 | 751 | ||
752 | static bool is_fw_device(struct device *dev) | ||
753 | { | ||
754 | return dev->type == &fw_device_type; | ||
755 | } | ||
756 | |||
752 | static int update_unit(struct device *dev, void *data) | 757 | static int update_unit(struct device *dev, void *data) |
753 | { | 758 | { |
754 | struct fw_unit *unit = fw_unit(dev); | 759 | struct fw_unit *unit = fw_unit(dev); |
@@ -785,6 +790,9 @@ static int lookup_existing_device(struct device *dev, void *data) | |||
785 | struct fw_card *card = new->card; | 790 | struct fw_card *card = new->card; |
786 | int match = 0; | 791 | int match = 0; |
787 | 792 | ||
793 | if (!is_fw_device(dev)) | ||
794 | return 0; | ||
795 | |||
788 | down_read(&fw_device_rwsem); /* serialize config_rom access */ | 796 | down_read(&fw_device_rwsem); /* serialize config_rom access */ |
789 | spin_lock_irq(&card->lock); /* serialize node access */ | 797 | spin_lock_irq(&card->lock); /* serialize node access */ |
790 | 798 | ||
@@ -824,7 +832,7 @@ static int lookup_existing_device(struct device *dev, void *data) | |||
824 | 832 | ||
825 | enum { BC_UNKNOWN = 0, BC_UNIMPLEMENTED, BC_IMPLEMENTED, }; | 833 | enum { BC_UNKNOWN = 0, BC_UNIMPLEMENTED, BC_IMPLEMENTED, }; |
826 | 834 | ||
827 | void fw_device_set_broadcast_channel(struct fw_device *device, int generation) | 835 | static void set_broadcast_channel(struct fw_device *device, int generation) |
828 | { | 836 | { |
829 | struct fw_card *card = device->card; | 837 | struct fw_card *card = device->card; |
830 | __be32 data; | 838 | __be32 data; |
@@ -860,6 +868,14 @@ void fw_device_set_broadcast_channel(struct fw_device *device, int generation) | |||
860 | } | 868 | } |
861 | } | 869 | } |
862 | 870 | ||
871 | int fw_device_set_broadcast_channel(struct device *dev, void *gen) | ||
872 | { | ||
873 | if (is_fw_device(dev)) | ||
874 | set_broadcast_channel(fw_device(dev), (long)gen); | ||
875 | |||
876 | return 0; | ||
877 | } | ||
878 | |||
863 | static void fw_device_init(struct work_struct *work) | 879 | static void fw_device_init(struct work_struct *work) |
864 | { | 880 | { |
865 | struct fw_device *device = | 881 | struct fw_device *device = |
@@ -958,7 +974,7 @@ static void fw_device_init(struct work_struct *work) | |||
958 | 1 << device->max_speed); | 974 | 1 << device->max_speed); |
959 | device->config_rom_retries = 0; | 975 | device->config_rom_retries = 0; |
960 | 976 | ||
961 | fw_device_set_broadcast_channel(device, device->generation); | 977 | set_broadcast_channel(device, device->generation); |
962 | } | 978 | } |
963 | 979 | ||
964 | /* | 980 | /* |
diff --git a/drivers/firewire/core.h b/drivers/firewire/core.h index 273f0ab82928..0a25a7b38a80 100644 --- a/drivers/firewire/core.h +++ b/drivers/firewire/core.h | |||
@@ -124,7 +124,7 @@ extern struct idr fw_device_idr; | |||
124 | extern int fw_cdev_major; | 124 | extern int fw_cdev_major; |
125 | 125 | ||
126 | struct fw_device *fw_device_get_by_devt(dev_t devt); | 126 | struct fw_device *fw_device_get_by_devt(dev_t devt); |
127 | void fw_device_set_broadcast_channel(struct fw_device *device, int generation); | 127 | int fw_device_set_broadcast_channel(struct device *dev, void *gen); |
128 | void fw_node_event(struct fw_card *card, struct fw_node *node, int event); | 128 | void fw_node_event(struct fw_card *card, struct fw_node *node, int event); |
129 | 129 | ||
130 | 130 | ||