Blame view

drivers/w1/w1.h 6.37 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
  /*
7785925dd   Evgeniy Polyakov   [PATCH] w1: clean...
2
   *	w1.h
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3
   *
a80187663   Evgeniy Polyakov   MAINTAINERS: Evge...
4
   * Copyright (c) 2004 Evgeniy Polyakov <zbr@ioremap.net>
7785925dd   Evgeniy Polyakov   [PATCH] w1: clean...
5
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
   *
   * 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 __W1_H
  #define __W1_H
  
  struct w1_reg_num
  {
  #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
41
42
43
  #elif defined(__BIG_ENDIAN_BITFIELD)
  	__u64	crc:8,
  		id:48,
  		family:8;
  #else
  #error "Please fix <asm/byteorder.h>"
  #endif
  };
  
  #ifdef __KERNEL__
  
  #include <linux/completion.h>
  #include <linux/device.h>
abd52a132   Evgeniy Polyakov   [PATCH] w1: Use m...
44
  #include <linux/mutex.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
45
46
47
48
  
  #include "w1_family.h"
  
  #define W1_MAXNAMELEN		32
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
49
50
  
  #define W1_SEARCH		0xF0
12003375a   Evgeniy Polyakov   [PATCH] w1: Users...
51
  #define W1_ALARM_SEARCH		0xEC
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
52
53
54
55
56
57
  #define W1_CONVERT_TEMP		0x44
  #define W1_SKIP_ROM		0xCC
  #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...
58
  #define W1_RESUME_CMD		0xA5
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
59

f522d2396   Evgeniy Polyakov   [PATCH] w1: Added...
60
  #define W1_SLAVE_ACTIVE		0
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
61
62
63
64
65
66
67
68
69
70
71
72
73
  
  struct w1_slave
  {
  	struct module		*owner;
  	unsigned char		name[W1_MAXNAMELEN];
  	struct list_head	w1_slave_entry;
  	struct w1_reg_num	reg_num;
  	atomic_t		refcnt;
  	u8			rom[9];
  	u32			flags;
  	int			ttl;
  
  	struct w1_master	*master;
7785925dd   Evgeniy Polyakov   [PATCH] w1: clean...
74
  	struct w1_family	*family;
a45f105ad   Evgeniy Polyakov   [PATCH] w1: added...
75
  	void			*family_data;
7785925dd   Evgeniy Polyakov   [PATCH] w1: clean...
76
  	struct device		dev;
3aca692d3   Evgeniy Polyakov   [PATCH] w1: Detou...
77
  	struct completion	released;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
78
  };
c30c9b151   David Fries   W1: fix deadlocks...
79
  typedef void (*w1_slave_found_callback)(struct w1_master *, u64);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
80

6b7298618   Evgeniy Polyakov   [PATCH] w1: Added...
81
82
83
84
85
86
87
88
  
  /**
   * 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.
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
89
90
  struct w1_bus_master
  {
6b7298618   Evgeniy Polyakov   [PATCH] w1: Added...
91
  	/** the first parameter in all the functions below */
ccd699400   Evgeniy Polyakov   [PATCH] W1: Chang...
92
  	void		*data;
6b7298618   Evgeniy Polyakov   [PATCH] w1: Added...
93
94
95
96
97
  
  	/**
  	 * Sample the line level
  	 * @return the level read (0 or 1)
  	 */
ccd699400   Evgeniy Polyakov   [PATCH] W1: Chang...
98
  	u8		(*read_bit)(void *);
6b7298618   Evgeniy Polyakov   [PATCH] w1: Added...
99
100
  
  	/** Sets the line level */
ccd699400   Evgeniy Polyakov   [PATCH] W1: Chang...
101
  	void		(*write_bit)(void *, u8);
6b7298618   Evgeniy Polyakov   [PATCH] w1: Added...
102
103
104
105
106
107
108
109
  
  	/**
  	 * touch_bit is 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)
  	 */
ccd699400   Evgeniy Polyakov   [PATCH] W1: Chang...
110
  	u8		(*touch_bit)(void *, u8);
6b7298618   Evgeniy Polyakov   [PATCH] w1: Added...
111
112
113
114
115
  
  	/**
  	 * Reads a bytes. Same as 8 touch_bit(1) calls.
  	 * @return the byte read
  	 */
ccd699400   Evgeniy Polyakov   [PATCH] W1: Chang...
116
  	u8		(*read_byte)(void *);
6b7298618   Evgeniy Polyakov   [PATCH] w1: Added...
117
118
119
120
  
  	/**
  	 * Writes a byte. Same as 8 touch_bit(x) calls.
  	 */
ccd699400   Evgeniy Polyakov   [PATCH] W1: Chang...
121
  	void		(*write_byte)(void *, u8);
6b7298618   Evgeniy Polyakov   [PATCH] w1: Added...
122
123
124
125
126
  
  	/**
  	 * Same as a series of read_byte() calls
  	 * @return the number of bytes read
  	 */
ccd699400   Evgeniy Polyakov   [PATCH] W1: Chang...
127
  	u8		(*read_block)(void *, u8 *, int);
6b7298618   Evgeniy Polyakov   [PATCH] w1: Added...
128
129
  
  	/** Same as a series of write_byte() calls */
ccd699400   Evgeniy Polyakov   [PATCH] W1: Chang...
130
  	void		(*write_block)(void *, const u8 *, int);
6b7298618   Evgeniy Polyakov   [PATCH] w1: Added...
131
132
133
134
135
  
  	/**
  	 * Combines two reads and a smart write for ROM searches
  	 * @return bit0=Id bit1=comp_id bit2=dir_taken
  	 */
ccd699400   Evgeniy Polyakov   [PATCH] W1: Chang...
136
  	u8		(*triplet)(void *, u8);
6b7298618   Evgeniy Polyakov   [PATCH] w1: Added...
137
138
139
140
141
  
  	/**
  	 * long write-0 with a read for the presence pulse detection
  	 * @return -1=Error, 0=Device present, 1=No device present
  	 */
ccd699400   Evgeniy Polyakov   [PATCH] W1: Chang...
142
  	u8		(*reset_bus)(void *);
6b7298618   Evgeniy Polyakov   [PATCH] w1: Added...
143

6a158c0de   David Fries   W1: feature, enab...
144
145
146
147
148
  	/**
  	 * Put out a strong pull-up pulse of the specified duration.
  	 * @return -1=Error, 0=completed
  	 */
  	u8		(*set_pullup)(void *, int);
c30c9b151   David Fries   W1: fix deadlocks...
149
150
151
152
153
  	/** Really nice hardware can handles the different types of ROM search
  	 *  w1_master* is passed to the slave found callback.
  	 */
  	void		(*search)(void *, struct w1_master *,
  		u8, w1_slave_found_callback);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
154
155
156
157
158
159
160
161
162
163
164
165
166
  };
  
  struct w1_master
  {
  	struct list_head	w1_master_entry;
  	struct module		*owner;
  	unsigned char		name[W1_MAXNAMELEN];
  	struct list_head	slist;
  	int			max_slave_count, slave_count;
  	unsigned long		attempts;
  	int			slave_ttl;
  	int			initialized;
  	u32			id;
2a9d0c178   Evgeniy Polyakov   [PATCH] w1: Adds ...
167
  	int			search_count;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
168
169
170
171
172
  
  	atomic_t		refcnt;
  
  	void			*priv;
  	int			priv_size;
6a158c0de   David Fries   W1: feature, enab...
173
174
175
176
  	/** 5V strong pullup enabled flag, 1 enabled, zero disabled. */
  	int			enable_pullup;
  	/** 5V strong pullup duration in milliseconds, zero disabled. */
  	int			pullup_duration;
674a396c6   Evgeniy Polyakov   [PATCH] w1: use k...
177
  	struct task_struct	*thread;
abd52a132   Evgeniy Polyakov   [PATCH] w1: Use m...
178
  	struct mutex		mutex;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
179
180
  
  	struct device_driver	*driver;
7785925dd   Evgeniy Polyakov   [PATCH] w1: clean...
181
  	struct device		dev;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
182
183
  
  	struct w1_bus_master	*bus_master;
12003375a   Evgeniy Polyakov   [PATCH] w1: Users...
184
  	u32			seq;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
185
186
187
  };
  
  int w1_create_master_attributes(struct w1_master *);
c30c9b151   David Fries   W1: fix deadlocks...
188
  void w1_destroy_master_attributes(struct w1_master *master);
12003375a   Evgeniy Polyakov   [PATCH] w1: Users...
189
190
191
  void w1_search(struct w1_master *dev, u8 search_type, w1_slave_found_callback cb);
  void w1_search_devices(struct w1_master *dev, u8 search_type, w1_slave_found_callback cb);
  struct w1_slave *w1_search_slave(struct w1_reg_num *id);
963bb1010   David Fries   w1: have netlink ...
192
193
194
  void w1_slave_found(struct w1_master *dev, u64 rn);
  void w1_search_process_cb(struct w1_master *dev, u8 search_type,
  	w1_slave_found_callback cb);
12003375a   Evgeniy Polyakov   [PATCH] w1: Users...
195
  struct w1_master *w1_search_master_id(u32 id);
c30c9b151   David Fries   W1: fix deadlocks...
196
197
198
199
200
201
202
  /* Disconnect and reconnect devices in the given family.  Used for finding
   * unclaimed devices after a family has been registered or releasing devices
   * after a family has been unregistered.  Set attach to 1 when a new family
   * has just been registered, to 0 when it has been unregistered.
   */
  void w1_reconnect_slaves(struct w1_family *f, int attach);
  void w1_slave_detach(struct w1_slave *sl);
12003375a   Evgeniy Polyakov   [PATCH] w1: Users...
203
204
  u8 w1_triplet(struct w1_master *dev, int bdir);
  void w1_write_8(struct w1_master *, u8);
34e453d45   Madhusudhan Chikkature   w1: export w1_rea...
205
  u8 w1_read_8(struct w1_master *);
12003375a   Evgeniy Polyakov   [PATCH] w1: Users...
206
207
208
  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...
209
  void w1_touch_block(struct w1_master *, u8 *, int);
12003375a   Evgeniy Polyakov   [PATCH] w1: Users...
210
211
  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...
212
  int w1_reset_resume_command(struct w1_master *);
6a158c0de   David Fries   W1: feature, enab...
213
  void w1_next_pullup(struct w1_master *, int);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
214

db2d0008d   Evgeniy Polyakov   [PATCH] w1: Added...
215
216
217
218
219
220
221
222
223
224
225
226
227
228
  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);
  }
2c5bfdac3   Evgeniy Polyakov   [PATCH] W1: cleanups
229
  extern struct device_driver w1_master_driver;
2c5bfdac3   Evgeniy Polyakov   [PATCH] W1: cleanups
230
231
232
233
234
235
236
  extern struct device w1_master_device;
  extern int w1_max_slave_count;
  extern int w1_max_slave_ttl;
  extern struct list_head w1_masters;
  extern struct mutex w1_mlock;
  
  extern int w1_process(void *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
237
238
239
  #endif /* __KERNEL__ */
  
  #endif /* __W1_H */