Blame view

include/linux/w1.h 9.08 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
  /*
a80187663   Evgeniy Polyakov   MAINTAINERS: Evge...
2
   * Copyright (c) 2004 Evgeniy Polyakov <zbr@ioremap.net>
7785925dd   Evgeniy Polyakov   [PATCH] w1: clean...
3
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4
5
6
7
8
9
10
11
12
   * 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.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
13
   */
de0d6dbdb   Andrew F. Davis   w1: Add subsystem...
14
15
16
17
  #ifndef __LINUX_W1_H
  #define __LINUX_W1_H
  
  #include <linux/device.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
18

b3be177a1   David Fries   w1: format for Do...
19
20
21
22
23
24
25
  /**
   * struct w1_reg_num - broken out slave device id
   *
   * @family: identifies the type of device
   * @id: along with family is the unique device id
   * @crc: checksum of the other bytes
   */
de0d6dbdb   Andrew F. Davis   w1: Add subsystem...
26
  struct w1_reg_num {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
27
  #if defined(__LITTLE_ENDIAN_BITFIELD)
6b7298618   Evgeniy Polyakov   [PATCH] w1: Added...
28
29
30
  	__u64	family:8,
  		id:48,
  		crc:8;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
31
32
33
34
35
36
37
38
39
40
  #elif defined(__BIG_ENDIAN_BITFIELD)
  	__u64	crc:8,
  		id:48,
  		family:8;
  #else
  #error "Please fix <asm/byteorder.h>"
  #endif
  };
  
  #ifdef __KERNEL__
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
41
  #define W1_MAXNAMELEN		32
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
42
43
  
  #define W1_SEARCH		0xF0
12003375a   Evgeniy Polyakov   [PATCH] w1: Users...
44
  #define W1_ALARM_SEARCH		0xEC
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
45
46
  #define W1_CONVERT_TEMP		0x44
  #define W1_SKIP_ROM		0xCC
0a19f129d   Ben Sen   w1: add ability t...
47
48
  #define W1_COPY_SCRATCHPAD	0x48
  #define W1_WRITE_SCRATCHPAD	0x4E
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
49
50
51
52
  #define W1_READ_SCRATCHPAD	0xBE
  #define W1_READ_ROM		0x33
  #define W1_READ_PSUPPLY		0xB4
  #define W1_MATCH_ROM		0x55
67dfd54c2   Jean-François Dagenais   w1: add 1-wire (w...
53
  #define W1_RESUME_CMD		0xA5
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
54

b3be177a1   David Fries   w1: format for Do...
55
56
57
58
59
60
61
62
63
64
65
66
67
68
  /**
   * struct w1_slave - holds a single slave device on the bus
   *
   * @owner: Points to the one wire "wire" kernel module.
   * @name: Device id is ascii.
   * @w1_slave_entry: data for the linked list
   * @reg_num: the slave id in binary
   * @refcnt: reference count, delete when 0
   * @flags: bit flags for W1_SLAVE_ACTIVE W1_SLAVE_DETACH
   * @ttl: decrement per search this slave isn't found, deatch at 0
   * @master: bus which this slave is on
   * @family: module for device family type
   * @family_data: pointer for use by the family module
   * @dev: kernel device identifier
2eb795480   Jaghathiswari Rankappagounder Natarajan   drivers: w1: add ...
69
   * @hwmon: pointer to hwmon device
b3be177a1   David Fries   w1: format for Do...
70
71
   *
   */
de0d6dbdb   Andrew F. Davis   w1: Add subsystem...
72
  struct w1_slave {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
73
74
75
76
77
  	struct module		*owner;
  	unsigned char		name[W1_MAXNAMELEN];
  	struct list_head	w1_slave_entry;
  	struct w1_reg_num	reg_num;
  	atomic_t		refcnt;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
78
  	int			ttl;
bb6709379   Michal Nazarewicz   drivers: w1: make...
79
  	unsigned long		flags;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
80
81
  
  	struct w1_master	*master;
7785925dd   Evgeniy Polyakov   [PATCH] w1: clean...
82
  	struct w1_family	*family;
a45f105ad   Evgeniy Polyakov   [PATCH] w1: added...
83
  	void			*family_data;
7785925dd   Evgeniy Polyakov   [PATCH] w1: clean...
84
  	struct device		dev;
2eb795480   Jaghathiswari Rankappagounder Natarajan   drivers: w1: add ...
85
  	struct device		*hwmon;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
86
  };
c30c9b151   David Fries   W1: fix deadlocks...
87
  typedef void (*w1_slave_found_callback)(struct w1_master *, u64);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
88

6b7298618   Evgeniy Polyakov   [PATCH] w1: Added...
89
  /**
b3be177a1   David Fries   w1: format for Do...
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
   * struct w1_bus_master - operations available on a bus master
   *
   * @data: the first parameter in all the functions below
   *
   * @read_bit: Sample the line level @return the level read (0 or 1)
   *
   * @write_bit: Sets the line level
   *
   * @touch_bit: the lowest-level function for devices that really support the
   * 1-wire protocol.
   * touch_bit(0) = write-0 cycle
   * touch_bit(1) = write-1 / read cycle
   * @return the bit read (0 or 1)
   *
   * @read_byte: Reads a bytes. Same as 8 touch_bit(1) calls.
   * @return the byte read
   *
   * @write_byte: Writes a byte. Same as 8 touch_bit(x) calls.
   *
   * @read_block: Same as a series of read_byte() calls
   * @return the number of bytes read
   *
   * @write_block: Same as a series of write_byte() calls
   *
   * @triplet: Combines two reads and a smart write for ROM searches
   * @return bit0=Id bit1=comp_id bit2=dir_taken
   *
   * @reset_bus: long write-0 with a read for the presence pulse detection
   * @return -1=Error, 0=Device present, 1=No device present
   *
   * @set_pullup: Put out a strong pull-up pulse of the specified duration.
   * @return -1=Error, 0=completed
   *
   * @search: Really nice hardware can handles the different types of ROM search
   * w1_master* is passed to the slave found callback.
   * u8 is search_type, W1_SEARCH or W1_ALARM_SEARCH
   *
6b7298618   Evgeniy Polyakov   [PATCH] w1: Added...
127
128
129
130
131
   * Note: read_bit and write_bit are very low level functions and should only
   * be used with hardware that doesn't really support 1-wire operations,
   * like a parallel/serial port.
   * Either define read_bit and write_bit OR define, at minimum, touch_bit and
   * reset_bus.
b3be177a1   David Fries   w1: format for Do...
132
   *
6b7298618   Evgeniy Polyakov   [PATCH] w1: Added...
133
   */
de0d6dbdb   Andrew F. Davis   w1: Add subsystem...
134
  struct w1_bus_master {
ccd699400   Evgeniy Polyakov   [PATCH] W1: Chang...
135
  	void		*data;
6b7298618   Evgeniy Polyakov   [PATCH] w1: Added...
136

ccd699400   Evgeniy Polyakov   [PATCH] W1: Chang...
137
  	u8		(*read_bit)(void *);
6b7298618   Evgeniy Polyakov   [PATCH] w1: Added...
138

ccd699400   Evgeniy Polyakov   [PATCH] W1: Chang...
139
  	void		(*write_bit)(void *, u8);
6b7298618   Evgeniy Polyakov   [PATCH] w1: Added...
140

ccd699400   Evgeniy Polyakov   [PATCH] W1: Chang...
141
  	u8		(*touch_bit)(void *, u8);
6b7298618   Evgeniy Polyakov   [PATCH] w1: Added...
142

ccd699400   Evgeniy Polyakov   [PATCH] W1: Chang...
143
  	u8		(*read_byte)(void *);
6b7298618   Evgeniy Polyakov   [PATCH] w1: Added...
144

ccd699400   Evgeniy Polyakov   [PATCH] W1: Chang...
145
  	void		(*write_byte)(void *, u8);
6b7298618   Evgeniy Polyakov   [PATCH] w1: Added...
146

ccd699400   Evgeniy Polyakov   [PATCH] W1: Chang...
147
  	u8		(*read_block)(void *, u8 *, int);
6b7298618   Evgeniy Polyakov   [PATCH] w1: Added...
148

ccd699400   Evgeniy Polyakov   [PATCH] W1: Chang...
149
  	void		(*write_block)(void *, const u8 *, int);
6b7298618   Evgeniy Polyakov   [PATCH] w1: Added...
150

ccd699400   Evgeniy Polyakov   [PATCH] W1: Chang...
151
  	u8		(*triplet)(void *, u8);
6b7298618   Evgeniy Polyakov   [PATCH] w1: Added...
152

ccd699400   Evgeniy Polyakov   [PATCH] W1: Chang...
153
  	u8		(*reset_bus)(void *);
6b7298618   Evgeniy Polyakov   [PATCH] w1: Added...
154

6a158c0de   David Fries   W1: feature, enab...
155
  	u8		(*set_pullup)(void *, int);
c30c9b151   David Fries   W1: fix deadlocks...
156
157
  	void		(*search)(void *, struct w1_master *,
  		u8, w1_slave_found_callback);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
158
  };
421056987   David Fries   w1: fixup search ...
159
160
161
  /**
   * enum w1_master_flags - bitfields used in w1_master.flags
   * @W1_ABORT_SEARCH: abort searching early on shutdown
a16130569   David Fries   w1: increase w1_m...
162
   * @W1_WARN_MAX_COUNT: limit warning when the maximum count is reached
421056987   David Fries   w1: fixup search ...
163
164
165
   */
  enum w1_master_flags {
  	W1_ABORT_SEARCH = 0,
a16130569   David Fries   w1: increase w1_m...
166
  	W1_WARN_MAX_COUNT = 1,
421056987   David Fries   w1: fixup search ...
167
  };
b3be177a1   David Fries   w1: format for Do...
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
  /**
   * struct w1_master - one per bus master
   * @w1_master_entry:	master linked list
   * @owner:		module owner
   * @name:		dynamically allocate bus name
   * @list_mutex:		protect slist and async_list
   * @slist:		linked list of slaves
   * @async_list:		linked list of netlink commands to execute
   * @max_slave_count:	maximum number of slaves to search for at a time
   * @slave_count:	current number of slaves known
   * @attempts:		number of searches ran
   * @slave_ttl:		number of searches before a slave is timed out
   * @initialized:	prevent init/removal race conditions
   * @id:			w1 bus number
   * @search_count:	number of automatic searches to run, -1 unlimited
   * @search_id:		allows continuing a search
   * @refcnt:		reference count
   * @priv:		private data storage
b3be177a1   David Fries   w1: format for Do...
186
187
188
189
190
191
192
193
194
195
   * @enable_pullup:	allows a strong pullup
   * @pullup_duration:	time for the next strong pullup
   * @flags:		one of w1_master_flags
   * @thread:		thread for bus search and netlink commands
   * @mutex:		protect most of w1_master
   * @bus_mutex:		pretect concurrent bus access
   * @driver:		sysfs driver
   * @dev:		sysfs device
   * @bus_master:		io operations available
   * @seq:		sequence number used for netlink broadcasts
b3be177a1   David Fries   w1: format for Do...
196
   */
de0d6dbdb   Andrew F. Davis   w1: Add subsystem...
197
  struct w1_master {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
198
199
200
  	struct list_head	w1_master_entry;
  	struct module		*owner;
  	unsigned char		name[W1_MAXNAMELEN];
9fcbbac5d   David Fries   w1: process w1 ne...
201
202
203
  	/* list_mutex protects just slist and async_list so slaves can be
  	 * searched for and async commands added while the master has
  	 * w1_master.mutex locked and is operating on the bus.
b3be177a1   David Fries   w1: format for Do...
204
  	 * lock order w1_mlock, w1_master.mutex, w1_master.list_mutex
9fcbbac5d   David Fries   w1: process w1 ne...
205
206
  	 */
  	struct mutex		list_mutex;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
207
  	struct list_head	slist;
9fcbbac5d   David Fries   w1: process w1 ne...
208
  	struct list_head	async_list;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
209
210
211
212
213
  	int			max_slave_count, slave_count;
  	unsigned long		attempts;
  	int			slave_ttl;
  	int			initialized;
  	u32			id;
2a9d0c178   Evgeniy Polyakov   [PATCH] w1: Adds ...
214
  	int			search_count;
3c6955e5a   David Fries   w1: continue slav...
215
216
  	/* id to start searching on, to continue a search or 0 to restart */
  	u64			search_id;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
217
218
219
220
  
  	atomic_t		refcnt;
  
  	void			*priv;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
221

6a158c0de   David Fries   W1: feature, enab...
222
223
224
225
  	/** 5V strong pullup enabled flag, 1 enabled, zero disabled. */
  	int			enable_pullup;
  	/** 5V strong pullup duration in milliseconds, zero disabled. */
  	int			pullup_duration;
421056987   David Fries   w1: fixup search ...
226
  	long			flags;
674a396c6   Evgeniy Polyakov   [PATCH] w1: use k...
227
  	struct task_struct	*thread;
abd52a132   Evgeniy Polyakov   [PATCH] w1: Use m...
228
  	struct mutex		mutex;
b02f8bede   NeilBrown   W1: split master ...
229
  	struct mutex		bus_mutex;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
230
231
  
  	struct device_driver	*driver;
7785925dd   Evgeniy Polyakov   [PATCH] w1: clean...
232
  	struct device		dev;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
233
234
  
  	struct w1_bus_master	*bus_master;
12003375a   Evgeniy Polyakov   [PATCH] w1: Users...
235
  	u32			seq;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
236
  };
de0d6dbdb   Andrew F. Davis   w1: Add subsystem...
237
238
  int w1_add_master_device(struct w1_bus_master *master);
  void w1_remove_master_device(struct w1_bus_master *master);
9fcbbac5d   David Fries   w1: process w1 ne...
239
  /**
de0d6dbdb   Andrew F. Davis   w1: Add subsystem...
240
241
242
243
   * struct w1_family_ops - operations for a family type
   * @add_slave: add_slave
   * @remove_slave: remove_slave
   * @groups: sysfs group
2eb795480   Jaghathiswari Rankappagounder Natarajan   drivers: w1: add ...
244
   * @chip_info: pointer to struct hwmon_chip_info
9fcbbac5d   David Fries   w1: process w1 ne...
245
   */
de0d6dbdb   Andrew F. Davis   w1: Add subsystem...
246
247
248
249
  struct w1_family_ops {
  	int  (*add_slave)(struct w1_slave *sl);
  	void (*remove_slave)(struct w1_slave *sl);
  	const struct attribute_group **groups;
2eb795480   Jaghathiswari Rankappagounder Natarajan   drivers: w1: add ...
250
  	const struct hwmon_chip_info *chip_info;
9fcbbac5d   David Fries   w1: process w1 ne...
251
  };
de0d6dbdb   Andrew F. Davis   w1: Add subsystem...
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
  /**
   * struct w1_family - reference counted family structure.
   * @family_entry:	family linked list
   * @fid:		8 bit family identifier
   * @fops:		operations for this family
   * @refcnt:		reference counter
   */
  struct w1_family {
  	struct list_head	family_entry;
  	u8			fid;
  
  	struct w1_family_ops	*fops;
  
  	atomic_t		refcnt;
  };
  
  int w1_register_family(struct w1_family *family);
  void w1_unregister_family(struct w1_family *family);
  
  /**
   * module_w1_driver() - Helper macro for registering a 1-Wire families
   * @__w1_family: w1_family struct
   *
   * Helper macro for 1-Wire families which do not do anything special in module
   * init/exit. This eliminates a lot of boilerplate. Each module may only
   * use this macro once, and calling it replaces module_init() and module_exit()
c30c9b151   David Fries   W1: fix deadlocks...
278
   */
de0d6dbdb   Andrew F. Davis   w1: Add subsystem...
279
280
281
  #define module_w1_family(__w1_family) \
  	module_driver(__w1_family, w1_register_family, \
  			w1_unregister_family)
c30c9b151   David Fries   W1: fix deadlocks...
282

12003375a   Evgeniy Polyakov   [PATCH] w1: Users...
283
284
  u8 w1_triplet(struct w1_master *dev, int bdir);
  void w1_write_8(struct w1_master *, u8);
34e453d45   Madhusudhan Chikkature   w1: export w1_rea...
285
  u8 w1_read_8(struct w1_master *);
12003375a   Evgeniy Polyakov   [PATCH] w1: Users...
286
287
288
  int w1_reset_bus(struct w1_master *);
  u8 w1_calc_crc8(u8 *, int);
  void w1_write_block(struct w1_master *, const u8 *, int);
9be62e0b2   Evgeniy Polyakov   w1: add touch blo...
289
  void w1_touch_block(struct w1_master *, u8 *, int);
12003375a   Evgeniy Polyakov   [PATCH] w1: Users...
290
291
  u8 w1_read_block(struct w1_master *, u8 *, int);
  int w1_reset_select_slave(struct w1_slave *sl);
67dfd54c2   Jean-François Dagenais   w1: add 1-wire (w...
292
  int w1_reset_resume_command(struct w1_master *);
6a158c0de   David Fries   W1: feature, enab...
293
  void w1_next_pullup(struct w1_master *, int);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
294

db2d0008d   Evgeniy Polyakov   [PATCH] w1: Added...
295
296
297
298
299
300
301
302
303
304
305
306
307
308
  static inline struct w1_slave* dev_to_w1_slave(struct device *dev)
  {
  	return container_of(dev, struct w1_slave, dev);
  }
  
  static inline struct w1_slave* kobj_to_w1_slave(struct kobject *kobj)
  {
  	return dev_to_w1_slave(container_of(kobj, struct device, kobj));
  }
  
  static inline struct w1_master* dev_to_w1_master(struct device *dev)
  {
  	return container_of(dev, struct w1_master, dev);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
309
  #endif /* __KERNEL__ */
de0d6dbdb   Andrew F. Davis   w1: Add subsystem...
310
  #endif /* __LINUX_W1_H */