Blame view

drivers/firewire/fw-device.h 4.72 KB
c781c06d1   Kristian Høgsberg   firewire: Clean u...
1
  /*
19a15b937   Kristian Høgsberg   firewire: Add dev...
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
   * Copyright (C) 2005-2006  Kristian Hoegsberg <krh@bitplanet.net>
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License as published by
   * the Free Software Foundation; either version 2 of the License, or
   * (at your option) any later version.
   *
   * This program is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License for more details.
   *
   * You should have received a copy of the GNU General Public License
   * along with this program; if not, write to the Free Software Foundation,
   * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
   */
  
  #ifndef __fw_device_h
  #define __fw_device_h
  
  #include <linux/fs.h>
  #include <linux/cdev.h>
c9755e14a   Stefan Richter   firewire: reread ...
24
  #include <linux/rwsem.h>
641f8791f   Stefan Richter   firewire: use ato...
25
  #include <asm/atomic.h>
19a15b937   Kristian Høgsberg   firewire: Add dev...
26
27
28
29
  
  enum fw_device_state {
  	FW_DEVICE_INITIALIZING,
  	FW_DEVICE_RUNNING,
5af4e5eab   Stefan Richter   firewire: comma a...
30
  	FW_DEVICE_SHUTDOWN,
19a15b937   Kristian Høgsberg   firewire: Add dev...
31
  };
6f2e53d51   Kristian Høgsberg   firewire: Use dev...
32
33
34
35
36
  struct fw_attribute_group {
  	struct attribute_group *groups[2];
  	struct attribute_group group;
  	struct attribute *attrs[11];
  };
b5d2a5e04   Stefan Richter   firewire: enforce...
37
38
39
40
41
42
43
44
45
46
47
  /*
   * Note, fw_device.generation always has to be read before fw_device.node_id.
   * Use SMP memory barriers to ensure this.  Otherwise requests will be sent
   * to an outdated node_id if the generation was updated in the meantime due
   * to a bus reset.
   *
   * Likewise, fw-core will take care to update .node_id before .generation so
   * that whenever fw_device.generation is current WRT the actual bus generation,
   * fw_device.node_id is guaranteed to be current too.
   *
   * The same applies to fw_device.card->node_id vs. fw_device.generation.
c9755e14a   Stefan Richter   firewire: reread ...
48
49
50
51
52
   *
   * fw_device.config_rom and fw_device.config_rom_length may be accessed during
   * the lifetime of any fw_unit belonging to the fw_device, before device_del()
   * was called on the last fw_unit.  Alternatively, they may be accessed while
   * holding fw_device_rwsem.
b5d2a5e04   Stefan Richter   firewire: enforce...
53
   */
19a15b937   Kristian Høgsberg   firewire: Add dev...
54
  struct fw_device {
641f8791f   Stefan Richter   firewire: use ato...
55
  	atomic_t state;
19a15b937   Kristian Høgsberg   firewire: Add dev...
56
57
58
  	struct fw_node *node;
  	int node_id;
  	int generation;
f13974900   Stefan Richter   firewire: support...
59
  	unsigned max_speed;
c9755e14a   Stefan Richter   firewire: reread ...
60
  	bool cmc;
19a15b937   Kristian Høgsberg   firewire: Add dev...
61
62
  	struct fw_card *card;
  	struct device device;
a3aca3dab   Kristian Høgsberg   firewire: Switch ...
63
  	struct list_head link;
97bd9efa5   Kristian Høgsberg   firewire: Add a b...
64
  	struct list_head client_list;
945ac2225   Stefan Richter   firewire: ROM cac...
65
  	u32 *config_rom;
19a15b937   Kristian Høgsberg   firewire: Add dev...
66
67
68
  	size_t config_rom_length;
  	int config_rom_retries;
  	struct delayed_work work;
6f2e53d51   Kristian Høgsberg   firewire: Use dev...
69
  	struct fw_attribute_group attribute_group;
19a15b937   Kristian Høgsberg   firewire: Add dev...
70
  };
1dc3bea78   Stefan Richter   firewire: refacto...
71
  static inline struct fw_device *fw_device(struct device *dev)
19a15b937   Kristian Høgsberg   firewire: Add dev...
72
  {
5e20c2821   Stefan Richter   firewire: whitesp...
73
  	return container_of(dev, struct fw_device, device);
19a15b937   Kristian Høgsberg   firewire: Add dev...
74
  }
1dc3bea78   Stefan Richter   firewire: refacto...
75
  static inline int fw_device_is_shutdown(struct fw_device *device)
2603bf219   Kristian Høgsberg   firewire: Use onl...
76
77
78
  {
  	return atomic_read(&device->state) == FW_DEVICE_SHUTDOWN;
  }
1dc3bea78   Stefan Richter   firewire: refacto...
79
  static inline struct fw_device *fw_device_get(struct fw_device *device)
855c603d6   Stefan Richter   firewire: fix cra...
80
81
82
83
84
  {
  	get_device(&device->device);
  
  	return device;
  }
1dc3bea78   Stefan Richter   firewire: refacto...
85
  static inline void fw_device_put(struct fw_device *device)
855c603d6   Stefan Richter   firewire: fix cra...
86
87
88
  {
  	put_device(&device->device);
  }
96b19062e   Stefan Richter   firewire: fix "ko...
89
  struct fw_device *fw_device_get_by_devt(dev_t devt);
19a15b937   Kristian Høgsberg   firewire: Add dev...
90
  int fw_device_enable_phys_dma(struct fw_device *device);
97bd9efa5   Kristian Høgsberg   firewire: Add a b...
91
  void fw_device_cdev_update(struct fw_device *device);
2603bf219   Kristian Høgsberg   firewire: Use onl...
92
  void fw_device_cdev_remove(struct fw_device *device);
97bd9efa5   Kristian Høgsberg   firewire: Add a b...
93

c9755e14a   Stefan Richter   firewire: reread ...
94
  extern struct rw_semaphore fw_device_rwsem;
a3aca3dab   Kristian Høgsberg   firewire: Switch ...
95
  extern int fw_cdev_major;
c9755e14a   Stefan Richter   firewire: reread ...
96
97
98
  /*
   * fw_unit.directory must not be accessed after device_del(&fw_unit.device).
   */
19a15b937   Kristian Høgsberg   firewire: Add dev...
99
100
101
  struct fw_unit {
  	struct device device;
  	u32 *directory;
6f2e53d51   Kristian Høgsberg   firewire: Use dev...
102
  	struct fw_attribute_group attribute_group;
19a15b937   Kristian Høgsberg   firewire: Add dev...
103
  };
1dc3bea78   Stefan Richter   firewire: refacto...
104
  static inline struct fw_unit *fw_unit(struct device *dev)
19a15b937   Kristian Høgsberg   firewire: Add dev...
105
  {
5e20c2821   Stefan Richter   firewire: whitesp...
106
  	return container_of(dev, struct fw_unit, device);
19a15b937   Kristian Høgsberg   firewire: Add dev...
107
  }
1dc3bea78   Stefan Richter   firewire: refacto...
108
109
110
111
112
113
114
115
116
117
118
  static inline struct fw_unit *fw_unit_get(struct fw_unit *unit)
  {
  	get_device(&unit->device);
  
  	return unit;
  }
  
  static inline void fw_unit_put(struct fw_unit *unit)
  {
  	put_device(&unit->device);
  }
19a15b937   Kristian Høgsberg   firewire: Add dev...
119
120
121
122
123
124
125
126
127
128
129
130
131
132
  #define CSR_OFFSET	0x40
  #define CSR_LEAF	0x80
  #define CSR_DIRECTORY	0xc0
  
  #define CSR_DESCRIPTOR		0x01
  #define CSR_VENDOR		0x03
  #define CSR_HARDWARE_VERSION	0x04
  #define CSR_NODE_CAPABILITIES	0x0c
  #define CSR_UNIT		0x11
  #define CSR_SPECIFIER_ID	0x12
  #define CSR_VERSION		0x13
  #define CSR_DEPENDENT_INFO	0x14
  #define CSR_MODEL		0x17
  #define CSR_INSTANCE		0x18
14e219864   Stefan Richter   firewire: fw-sbp2...
133
  #define CSR_DIRECTORY_ID	0x20
19a15b937   Kristian Høgsberg   firewire: Add dev...
134

19a15b937   Kristian Høgsberg   firewire: Add dev...
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
  struct fw_csr_iterator {
  	u32 *p;
  	u32 *end;
  };
  
  void fw_csr_iterator_init(struct fw_csr_iterator *ci, u32 *p);
  int fw_csr_iterator_next(struct fw_csr_iterator *ci,
  			 int *key, int *value);
  
  #define FW_MATCH_VENDOR		0x0001
  #define FW_MATCH_MODEL		0x0002
  #define FW_MATCH_SPECIFIER_ID	0x0004
  #define FW_MATCH_VERSION	0x0008
  
  struct fw_device_id {
  	u32 match_flags;
  	u32 vendor;
  	u32 model;
  	u32 specifier_id;
  	u32 version;
  	void *driver_data;
  };
  
  struct fw_driver {
  	struct device_driver driver;
  	/* Called when the parent device sits through a bus reset. */
  	void (*update) (struct fw_unit *unit);
21ebcd122   Stefan Richter   firewire: mark so...
162
  	const struct fw_device_id *id_table;
19a15b937   Kristian Høgsberg   firewire: Add dev...
163
164
165
166
167
  };
  
  static inline struct fw_driver *
  fw_driver(struct device_driver *drv)
  {
5e20c2821   Stefan Richter   firewire: whitesp...
168
  	return container_of(drv, struct fw_driver, driver);
19a15b937   Kristian Høgsberg   firewire: Add dev...
169
  }
21ebcd122   Stefan Richter   firewire: mark so...
170
  extern const struct file_operations fw_device_ops;
19a15b937   Kristian Høgsberg   firewire: Add dev...
171

687198bbd   Stefan Richter   firewire: consist...
172
  #endif /* __fw_device_h */