]> git.karo-electronics.de Git - karo-tx-linux.git/blob - drivers/w1/w1.h
Merge branch 'drm-fixes-4.12' of git://people.freedesktop.org/~agd5f/linux into drm...
[karo-tx-linux.git] / drivers / w1 / w1.h
1 /*
2  * Copyright (c) 2004 Evgeniy Polyakov <zbr@ioremap.net>
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  */
14
15 #ifndef __W1_H
16 #define __W1_H
17
18 /**
19  * struct w1_reg_num - broken out slave device id
20  *
21  * @family: identifies the type of device
22  * @id: along with family is the unique device id
23  * @crc: checksum of the other bytes
24  */
25 struct w1_reg_num
26 {
27 #if defined(__LITTLE_ENDIAN_BITFIELD)
28         __u64   family:8,
29                 id:48,
30                 crc:8;
31 #elif defined(__BIG_ENDIAN_BITFIELD)
32         __u64   crc:8,
33                 id:48,
34                 family:8;
35 #else
36 #error "Please fix <asm/byteorder.h>"
37 #endif
38 };
39
40 #ifdef __KERNEL__
41
42 #include <linux/completion.h>
43 #include <linux/device.h>
44 #include <linux/mutex.h>
45
46 #include "w1_family.h"
47
48 #define W1_MAXNAMELEN           32
49
50 #define W1_SEARCH               0xF0
51 #define W1_ALARM_SEARCH         0xEC
52 #define W1_CONVERT_TEMP         0x44
53 #define W1_SKIP_ROM             0xCC
54 #define W1_COPY_SCRATCHPAD      0x48
55 #define W1_WRITE_SCRATCHPAD     0x4E
56 #define W1_READ_SCRATCHPAD      0xBE
57 #define W1_READ_ROM             0x33
58 #define W1_READ_PSUPPLY         0xB4
59 #define W1_MATCH_ROM            0x55
60 #define W1_RESUME_CMD           0xA5
61
62 #define W1_SLAVE_ACTIVE         0
63 #define W1_SLAVE_DETACH         1
64
65 /**
66  * struct w1_slave - holds a single slave device on the bus
67  *
68  * @owner: Points to the one wire "wire" kernel module.
69  * @name: Device id is ascii.
70  * @w1_slave_entry: data for the linked list
71  * @reg_num: the slave id in binary
72  * @refcnt: reference count, delete when 0
73  * @flags: bit flags for W1_SLAVE_ACTIVE W1_SLAVE_DETACH
74  * @ttl: decrement per search this slave isn't found, deatch at 0
75  * @master: bus which this slave is on
76  * @family: module for device family type
77  * @family_data: pointer for use by the family module
78  * @dev: kernel device identifier
79  *
80  */
81 struct w1_slave
82 {
83         struct module           *owner;
84         unsigned char           name[W1_MAXNAMELEN];
85         struct list_head        w1_slave_entry;
86         struct w1_reg_num       reg_num;
87         atomic_t                refcnt;
88         int                     ttl;
89         unsigned long           flags;
90
91         struct w1_master        *master;
92         struct w1_family        *family;
93         void                    *family_data;
94         struct device           dev;
95 };
96
97 typedef void (*w1_slave_found_callback)(struct w1_master *, u64);
98
99
100 /**
101  * struct w1_bus_master - operations available on a bus master
102  *
103  * @data: the first parameter in all the functions below
104  *
105  * @read_bit: Sample the line level @return the level read (0 or 1)
106  *
107  * @write_bit: Sets the line level
108  *
109  * @touch_bit: the lowest-level function for devices that really support the
110  * 1-wire protocol.
111  * touch_bit(0) = write-0 cycle
112  * touch_bit(1) = write-1 / read cycle
113  * @return the bit read (0 or 1)
114  *
115  * @read_byte: Reads a bytes. Same as 8 touch_bit(1) calls.
116  * @return the byte read
117  *
118  * @write_byte: Writes a byte. Same as 8 touch_bit(x) calls.
119  *
120  * @read_block: Same as a series of read_byte() calls
121  * @return the number of bytes read
122  *
123  * @write_block: Same as a series of write_byte() calls
124  *
125  * @triplet: Combines two reads and a smart write for ROM searches
126  * @return bit0=Id bit1=comp_id bit2=dir_taken
127  *
128  * @reset_bus: long write-0 with a read for the presence pulse detection
129  * @return -1=Error, 0=Device present, 1=No device present
130  *
131  * @set_pullup: Put out a strong pull-up pulse of the specified duration.
132  * @return -1=Error, 0=completed
133  *
134  * @search: Really nice hardware can handles the different types of ROM search
135  * w1_master* is passed to the slave found callback.
136  * u8 is search_type, W1_SEARCH or W1_ALARM_SEARCH
137  *
138  * Note: read_bit and write_bit are very low level functions and should only
139  * be used with hardware that doesn't really support 1-wire operations,
140  * like a parallel/serial port.
141  * Either define read_bit and write_bit OR define, at minimum, touch_bit and
142  * reset_bus.
143  *
144  */
145 struct w1_bus_master
146 {
147         void            *data;
148
149         u8              (*read_bit)(void *);
150
151         void            (*write_bit)(void *, u8);
152
153         u8              (*touch_bit)(void *, u8);
154
155         u8              (*read_byte)(void *);
156
157         void            (*write_byte)(void *, u8);
158
159         u8              (*read_block)(void *, u8 *, int);
160
161         void            (*write_block)(void *, const u8 *, int);
162
163         u8              (*triplet)(void *, u8);
164
165         u8              (*reset_bus)(void *);
166
167         u8              (*set_pullup)(void *, int);
168
169         void            (*search)(void *, struct w1_master *,
170                 u8, w1_slave_found_callback);
171 };
172
173 /**
174  * enum w1_master_flags - bitfields used in w1_master.flags
175  * @W1_ABORT_SEARCH: abort searching early on shutdown
176  * @W1_WARN_MAX_COUNT: limit warning when the maximum count is reached
177  */
178 enum w1_master_flags {
179         W1_ABORT_SEARCH = 0,
180         W1_WARN_MAX_COUNT = 1,
181 };
182
183 /**
184  * struct w1_master - one per bus master
185  * @w1_master_entry:    master linked list
186  * @owner:              module owner
187  * @name:               dynamically allocate bus name
188  * @list_mutex:         protect slist and async_list
189  * @slist:              linked list of slaves
190  * @async_list:         linked list of netlink commands to execute
191  * @max_slave_count:    maximum number of slaves to search for at a time
192  * @slave_count:        current number of slaves known
193  * @attempts:           number of searches ran
194  * @slave_ttl:          number of searches before a slave is timed out
195  * @initialized:        prevent init/removal race conditions
196  * @id:                 w1 bus number
197  * @search_count:       number of automatic searches to run, -1 unlimited
198  * @search_id:          allows continuing a search
199  * @refcnt:             reference count
200  * @priv:               private data storage
201  * @enable_pullup:      allows a strong pullup
202  * @pullup_duration:    time for the next strong pullup
203  * @flags:              one of w1_master_flags
204  * @thread:             thread for bus search and netlink commands
205  * @mutex:              protect most of w1_master
206  * @bus_mutex:          pretect concurrent bus access
207  * @driver:             sysfs driver
208  * @dev:                sysfs device
209  * @bus_master:         io operations available
210  * @seq:                sequence number used for netlink broadcasts
211  */
212 struct w1_master
213 {
214         struct list_head        w1_master_entry;
215         struct module           *owner;
216         unsigned char           name[W1_MAXNAMELEN];
217         /* list_mutex protects just slist and async_list so slaves can be
218          * searched for and async commands added while the master has
219          * w1_master.mutex locked and is operating on the bus.
220          * lock order w1_mlock, w1_master.mutex, w1_master.list_mutex
221          */
222         struct mutex            list_mutex;
223         struct list_head        slist;
224         struct list_head        async_list;
225         int                     max_slave_count, slave_count;
226         unsigned long           attempts;
227         int                     slave_ttl;
228         int                     initialized;
229         u32                     id;
230         int                     search_count;
231         /* id to start searching on, to continue a search or 0 to restart */
232         u64                     search_id;
233
234         atomic_t                refcnt;
235
236         void                    *priv;
237
238         /** 5V strong pullup enabled flag, 1 enabled, zero disabled. */
239         int                     enable_pullup;
240         /** 5V strong pullup duration in milliseconds, zero disabled. */
241         int                     pullup_duration;
242
243         long                    flags;
244
245         struct task_struct      *thread;
246         struct mutex            mutex;
247         struct mutex            bus_mutex;
248
249         struct device_driver    *driver;
250         struct device           dev;
251
252         struct w1_bus_master    *bus_master;
253
254         u32                     seq;
255 };
256
257 /**
258  * struct w1_async_cmd - execute callback from the w1_process kthread
259  * @async_entry: link entry
260  * @cb: callback function, must list_del and destroy this list before
261  * returning
262  *
263  * When inserted into the w1_master async_list, w1_process will execute
264  * the callback.  Embed this into the structure with the command details.
265  */
266 struct w1_async_cmd {
267         struct list_head        async_entry;
268         void (*cb)(struct w1_master *dev, struct w1_async_cmd *async_cmd);
269 };
270
271 int w1_create_master_attributes(struct w1_master *);
272 void w1_destroy_master_attributes(struct w1_master *master);
273 void w1_search(struct w1_master *dev, u8 search_type, w1_slave_found_callback cb);
274 void w1_search_devices(struct w1_master *dev, u8 search_type, w1_slave_found_callback cb);
275 /* call w1_unref_slave to release the reference counts w1_search_slave added */
276 struct w1_slave *w1_search_slave(struct w1_reg_num *id);
277 /* decrements the reference on sl->master and sl, and cleans up if zero
278  * returns the reference count after it has been decremented */
279 int w1_unref_slave(struct w1_slave *sl);
280 void w1_slave_found(struct w1_master *dev, u64 rn);
281 void w1_search_process_cb(struct w1_master *dev, u8 search_type,
282         w1_slave_found_callback cb);
283 struct w1_slave *w1_slave_search_device(struct w1_master *dev,
284         struct w1_reg_num *rn);
285 struct w1_master *w1_search_master_id(u32 id);
286
287 /* Disconnect and reconnect devices in the given family.  Used for finding
288  * unclaimed devices after a family has been registered or releasing devices
289  * after a family has been unregistered.  Set attach to 1 when a new family
290  * has just been registered, to 0 when it has been unregistered.
291  */
292 void w1_reconnect_slaves(struct w1_family *f, int attach);
293 int w1_attach_slave_device(struct w1_master *dev, struct w1_reg_num *rn);
294 /* 0 success, otherwise EBUSY */
295 int w1_slave_detach(struct w1_slave *sl);
296
297 u8 w1_triplet(struct w1_master *dev, int bdir);
298 void w1_write_8(struct w1_master *, u8);
299 u8 w1_read_8(struct w1_master *);
300 int w1_reset_bus(struct w1_master *);
301 u8 w1_calc_crc8(u8 *, int);
302 void w1_write_block(struct w1_master *, const u8 *, int);
303 void w1_touch_block(struct w1_master *, u8 *, int);
304 u8 w1_read_block(struct w1_master *, u8 *, int);
305 int w1_reset_select_slave(struct w1_slave *sl);
306 int w1_reset_resume_command(struct w1_master *);
307 void w1_next_pullup(struct w1_master *, int);
308
309 static inline struct w1_slave* dev_to_w1_slave(struct device *dev)
310 {
311         return container_of(dev, struct w1_slave, dev);
312 }
313
314 static inline struct w1_slave* kobj_to_w1_slave(struct kobject *kobj)
315 {
316         return dev_to_w1_slave(container_of(kobj, struct device, kobj));
317 }
318
319 static inline struct w1_master* dev_to_w1_master(struct device *dev)
320 {
321         return container_of(dev, struct w1_master, dev);
322 }
323
324 extern struct device_driver w1_master_driver;
325 extern struct device w1_master_device;
326 extern int w1_max_slave_count;
327 extern int w1_max_slave_ttl;
328 extern struct list_head w1_masters;
329 extern struct mutex w1_mlock;
330
331 extern int w1_process_callbacks(struct w1_master *dev);
332 extern int w1_process(void *);
333
334 #endif /* __KERNEL__ */
335
336 #endif /* __W1_H */