1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * Copyright (c) 2004 Evgeniy Polyakov <zbr@ioremap.net>
4*4882a593Smuzhiyun */
5*4882a593Smuzhiyun
6*4882a593Smuzhiyun #ifndef __LINUX_W1_H
7*4882a593Smuzhiyun #define __LINUX_W1_H
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun #include <linux/device.h>
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun /**
12*4882a593Smuzhiyun * struct w1_reg_num - broken out slave device id
13*4882a593Smuzhiyun *
14*4882a593Smuzhiyun * @family: identifies the type of device
15*4882a593Smuzhiyun * @id: along with family is the unique device id
16*4882a593Smuzhiyun * @crc: checksum of the other bytes
17*4882a593Smuzhiyun */
18*4882a593Smuzhiyun struct w1_reg_num {
19*4882a593Smuzhiyun #if defined(__LITTLE_ENDIAN_BITFIELD)
20*4882a593Smuzhiyun __u64 family:8,
21*4882a593Smuzhiyun id:48,
22*4882a593Smuzhiyun crc:8;
23*4882a593Smuzhiyun #elif defined(__BIG_ENDIAN_BITFIELD)
24*4882a593Smuzhiyun __u64 crc:8,
25*4882a593Smuzhiyun id:48,
26*4882a593Smuzhiyun family:8;
27*4882a593Smuzhiyun #else
28*4882a593Smuzhiyun #error "Please fix <asm/byteorder.h>"
29*4882a593Smuzhiyun #endif
30*4882a593Smuzhiyun };
31*4882a593Smuzhiyun
32*4882a593Smuzhiyun #ifdef __KERNEL__
33*4882a593Smuzhiyun
34*4882a593Smuzhiyun #define W1_MAXNAMELEN 32
35*4882a593Smuzhiyun
36*4882a593Smuzhiyun #define W1_SEARCH 0xF0
37*4882a593Smuzhiyun #define W1_ALARM_SEARCH 0xEC
38*4882a593Smuzhiyun #define W1_CONVERT_TEMP 0x44
39*4882a593Smuzhiyun #define W1_SKIP_ROM 0xCC
40*4882a593Smuzhiyun #define W1_COPY_SCRATCHPAD 0x48
41*4882a593Smuzhiyun #define W1_WRITE_SCRATCHPAD 0x4E
42*4882a593Smuzhiyun #define W1_READ_SCRATCHPAD 0xBE
43*4882a593Smuzhiyun #define W1_READ_ROM 0x33
44*4882a593Smuzhiyun #define W1_READ_PSUPPLY 0xB4
45*4882a593Smuzhiyun #define W1_MATCH_ROM 0x55
46*4882a593Smuzhiyun #define W1_RESUME_CMD 0xA5
47*4882a593Smuzhiyun
48*4882a593Smuzhiyun /**
49*4882a593Smuzhiyun * struct w1_slave - holds a single slave device on the bus
50*4882a593Smuzhiyun *
51*4882a593Smuzhiyun * @owner: Points to the one wire "wire" kernel module.
52*4882a593Smuzhiyun * @name: Device id is ascii.
53*4882a593Smuzhiyun * @w1_slave_entry: data for the linked list
54*4882a593Smuzhiyun * @reg_num: the slave id in binary
55*4882a593Smuzhiyun * @refcnt: reference count, delete when 0
56*4882a593Smuzhiyun * @flags: bit flags for W1_SLAVE_ACTIVE W1_SLAVE_DETACH
57*4882a593Smuzhiyun * @ttl: decrement per search this slave isn't found, deatch at 0
58*4882a593Smuzhiyun * @master: bus which this slave is on
59*4882a593Smuzhiyun * @family: module for device family type
60*4882a593Smuzhiyun * @family_data: pointer for use by the family module
61*4882a593Smuzhiyun * @dev: kernel device identifier
62*4882a593Smuzhiyun * @hwmon: pointer to hwmon device
63*4882a593Smuzhiyun *
64*4882a593Smuzhiyun */
65*4882a593Smuzhiyun struct w1_slave {
66*4882a593Smuzhiyun struct module *owner;
67*4882a593Smuzhiyun unsigned char name[W1_MAXNAMELEN];
68*4882a593Smuzhiyun struct list_head w1_slave_entry;
69*4882a593Smuzhiyun struct w1_reg_num reg_num;
70*4882a593Smuzhiyun atomic_t refcnt;
71*4882a593Smuzhiyun int ttl;
72*4882a593Smuzhiyun unsigned long flags;
73*4882a593Smuzhiyun
74*4882a593Smuzhiyun struct w1_master *master;
75*4882a593Smuzhiyun struct w1_family *family;
76*4882a593Smuzhiyun void *family_data;
77*4882a593Smuzhiyun struct device dev;
78*4882a593Smuzhiyun struct device *hwmon;
79*4882a593Smuzhiyun };
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun typedef void (*w1_slave_found_callback)(struct w1_master *, u64);
82*4882a593Smuzhiyun
83*4882a593Smuzhiyun /**
84*4882a593Smuzhiyun * struct w1_bus_master - operations available on a bus master
85*4882a593Smuzhiyun *
86*4882a593Smuzhiyun * @data: the first parameter in all the functions below
87*4882a593Smuzhiyun *
88*4882a593Smuzhiyun * @read_bit: Sample the line level @return the level read (0 or 1)
89*4882a593Smuzhiyun *
90*4882a593Smuzhiyun * @write_bit: Sets the line level
91*4882a593Smuzhiyun *
92*4882a593Smuzhiyun * @touch_bit: the lowest-level function for devices that really support the
93*4882a593Smuzhiyun * 1-wire protocol.
94*4882a593Smuzhiyun * touch_bit(0) = write-0 cycle
95*4882a593Smuzhiyun * touch_bit(1) = write-1 / read cycle
96*4882a593Smuzhiyun * @return the bit read (0 or 1)
97*4882a593Smuzhiyun *
98*4882a593Smuzhiyun * @read_byte: Reads a bytes. Same as 8 touch_bit(1) calls.
99*4882a593Smuzhiyun * @return the byte read
100*4882a593Smuzhiyun *
101*4882a593Smuzhiyun * @write_byte: Writes a byte. Same as 8 touch_bit(x) calls.
102*4882a593Smuzhiyun *
103*4882a593Smuzhiyun * @read_block: Same as a series of read_byte() calls
104*4882a593Smuzhiyun * @return the number of bytes read
105*4882a593Smuzhiyun *
106*4882a593Smuzhiyun * @write_block: Same as a series of write_byte() calls
107*4882a593Smuzhiyun *
108*4882a593Smuzhiyun * @triplet: Combines two reads and a smart write for ROM searches
109*4882a593Smuzhiyun * @return bit0=Id bit1=comp_id bit2=dir_taken
110*4882a593Smuzhiyun *
111*4882a593Smuzhiyun * @reset_bus: long write-0 with a read for the presence pulse detection
112*4882a593Smuzhiyun * @return -1=Error, 0=Device present, 1=No device present
113*4882a593Smuzhiyun *
114*4882a593Smuzhiyun * @set_pullup: Put out a strong pull-up pulse of the specified duration.
115*4882a593Smuzhiyun * @return -1=Error, 0=completed
116*4882a593Smuzhiyun *
117*4882a593Smuzhiyun * @search: Really nice hardware can handles the different types of ROM search
118*4882a593Smuzhiyun * w1_master* is passed to the slave found callback.
119*4882a593Smuzhiyun * u8 is search_type, W1_SEARCH or W1_ALARM_SEARCH
120*4882a593Smuzhiyun *
121*4882a593Smuzhiyun * @dev_id: Optional device id string, which w1 slaves could use for
122*4882a593Smuzhiyun * creating names, which then give a connection to the w1 master
123*4882a593Smuzhiyun *
124*4882a593Smuzhiyun * Note: read_bit and write_bit are very low level functions and should only
125*4882a593Smuzhiyun * be used with hardware that doesn't really support 1-wire operations,
126*4882a593Smuzhiyun * like a parallel/serial port.
127*4882a593Smuzhiyun * Either define read_bit and write_bit OR define, at minimum, touch_bit and
128*4882a593Smuzhiyun * reset_bus.
129*4882a593Smuzhiyun *
130*4882a593Smuzhiyun */
131*4882a593Smuzhiyun struct w1_bus_master {
132*4882a593Smuzhiyun void *data;
133*4882a593Smuzhiyun
134*4882a593Smuzhiyun u8 (*read_bit)(void *);
135*4882a593Smuzhiyun
136*4882a593Smuzhiyun void (*write_bit)(void *, u8);
137*4882a593Smuzhiyun
138*4882a593Smuzhiyun u8 (*touch_bit)(void *, u8);
139*4882a593Smuzhiyun
140*4882a593Smuzhiyun u8 (*read_byte)(void *);
141*4882a593Smuzhiyun
142*4882a593Smuzhiyun void (*write_byte)(void *, u8);
143*4882a593Smuzhiyun
144*4882a593Smuzhiyun u8 (*read_block)(void *, u8 *, int);
145*4882a593Smuzhiyun
146*4882a593Smuzhiyun void (*write_block)(void *, const u8 *, int);
147*4882a593Smuzhiyun
148*4882a593Smuzhiyun u8 (*triplet)(void *, u8);
149*4882a593Smuzhiyun
150*4882a593Smuzhiyun u8 (*reset_bus)(void *);
151*4882a593Smuzhiyun
152*4882a593Smuzhiyun u8 (*set_pullup)(void *, int);
153*4882a593Smuzhiyun
154*4882a593Smuzhiyun void (*search)(void *, struct w1_master *,
155*4882a593Smuzhiyun u8, w1_slave_found_callback);
156*4882a593Smuzhiyun
157*4882a593Smuzhiyun char *dev_id;
158*4882a593Smuzhiyun };
159*4882a593Smuzhiyun
160*4882a593Smuzhiyun /**
161*4882a593Smuzhiyun * enum w1_master_flags - bitfields used in w1_master.flags
162*4882a593Smuzhiyun * @W1_ABORT_SEARCH: abort searching early on shutdown
163*4882a593Smuzhiyun * @W1_WARN_MAX_COUNT: limit warning when the maximum count is reached
164*4882a593Smuzhiyun */
165*4882a593Smuzhiyun enum w1_master_flags {
166*4882a593Smuzhiyun W1_ABORT_SEARCH = 0,
167*4882a593Smuzhiyun W1_WARN_MAX_COUNT = 1,
168*4882a593Smuzhiyun };
169*4882a593Smuzhiyun
170*4882a593Smuzhiyun /**
171*4882a593Smuzhiyun * struct w1_master - one per bus master
172*4882a593Smuzhiyun * @w1_master_entry: master linked list
173*4882a593Smuzhiyun * @owner: module owner
174*4882a593Smuzhiyun * @name: dynamically allocate bus name
175*4882a593Smuzhiyun * @list_mutex: protect slist and async_list
176*4882a593Smuzhiyun * @slist: linked list of slaves
177*4882a593Smuzhiyun * @async_list: linked list of netlink commands to execute
178*4882a593Smuzhiyun * @max_slave_count: maximum number of slaves to search for at a time
179*4882a593Smuzhiyun * @slave_count: current number of slaves known
180*4882a593Smuzhiyun * @attempts: number of searches ran
181*4882a593Smuzhiyun * @slave_ttl: number of searches before a slave is timed out
182*4882a593Smuzhiyun * @initialized: prevent init/removal race conditions
183*4882a593Smuzhiyun * @id: w1 bus number
184*4882a593Smuzhiyun * @search_count: number of automatic searches to run, -1 unlimited
185*4882a593Smuzhiyun * @search_id: allows continuing a search
186*4882a593Smuzhiyun * @refcnt: reference count
187*4882a593Smuzhiyun * @priv: private data storage
188*4882a593Smuzhiyun * @enable_pullup: allows a strong pullup
189*4882a593Smuzhiyun * @pullup_duration: time for the next strong pullup
190*4882a593Smuzhiyun * @flags: one of w1_master_flags
191*4882a593Smuzhiyun * @thread: thread for bus search and netlink commands
192*4882a593Smuzhiyun * @mutex: protect most of w1_master
193*4882a593Smuzhiyun * @bus_mutex: pretect concurrent bus access
194*4882a593Smuzhiyun * @driver: sysfs driver
195*4882a593Smuzhiyun * @dev: sysfs device
196*4882a593Smuzhiyun * @bus_master: io operations available
197*4882a593Smuzhiyun * @seq: sequence number used for netlink broadcasts
198*4882a593Smuzhiyun */
199*4882a593Smuzhiyun struct w1_master {
200*4882a593Smuzhiyun struct list_head w1_master_entry;
201*4882a593Smuzhiyun struct module *owner;
202*4882a593Smuzhiyun unsigned char name[W1_MAXNAMELEN];
203*4882a593Smuzhiyun /* list_mutex protects just slist and async_list so slaves can be
204*4882a593Smuzhiyun * searched for and async commands added while the master has
205*4882a593Smuzhiyun * w1_master.mutex locked and is operating on the bus.
206*4882a593Smuzhiyun * lock order w1_mlock, w1_master.mutex, w1_master.list_mutex
207*4882a593Smuzhiyun */
208*4882a593Smuzhiyun struct mutex list_mutex;
209*4882a593Smuzhiyun struct list_head slist;
210*4882a593Smuzhiyun struct list_head async_list;
211*4882a593Smuzhiyun int max_slave_count, slave_count;
212*4882a593Smuzhiyun unsigned long attempts;
213*4882a593Smuzhiyun int slave_ttl;
214*4882a593Smuzhiyun int initialized;
215*4882a593Smuzhiyun u32 id;
216*4882a593Smuzhiyun int search_count;
217*4882a593Smuzhiyun /* id to start searching on, to continue a search or 0 to restart */
218*4882a593Smuzhiyun u64 search_id;
219*4882a593Smuzhiyun
220*4882a593Smuzhiyun atomic_t refcnt;
221*4882a593Smuzhiyun
222*4882a593Smuzhiyun void *priv;
223*4882a593Smuzhiyun
224*4882a593Smuzhiyun /** 5V strong pullup enabled flag, 1 enabled, zero disabled. */
225*4882a593Smuzhiyun int enable_pullup;
226*4882a593Smuzhiyun /** 5V strong pullup duration in milliseconds, zero disabled. */
227*4882a593Smuzhiyun int pullup_duration;
228*4882a593Smuzhiyun
229*4882a593Smuzhiyun long flags;
230*4882a593Smuzhiyun
231*4882a593Smuzhiyun struct task_struct *thread;
232*4882a593Smuzhiyun struct mutex mutex;
233*4882a593Smuzhiyun struct mutex bus_mutex;
234*4882a593Smuzhiyun
235*4882a593Smuzhiyun struct device_driver *driver;
236*4882a593Smuzhiyun struct device dev;
237*4882a593Smuzhiyun
238*4882a593Smuzhiyun struct w1_bus_master *bus_master;
239*4882a593Smuzhiyun
240*4882a593Smuzhiyun u32 seq;
241*4882a593Smuzhiyun };
242*4882a593Smuzhiyun
243*4882a593Smuzhiyun int w1_add_master_device(struct w1_bus_master *master);
244*4882a593Smuzhiyun void w1_remove_master_device(struct w1_bus_master *master);
245*4882a593Smuzhiyun
246*4882a593Smuzhiyun /**
247*4882a593Smuzhiyun * struct w1_family_ops - operations for a family type
248*4882a593Smuzhiyun * @add_slave: add_slave
249*4882a593Smuzhiyun * @remove_slave: remove_slave
250*4882a593Smuzhiyun * @groups: sysfs group
251*4882a593Smuzhiyun * @chip_info: pointer to struct hwmon_chip_info
252*4882a593Smuzhiyun */
253*4882a593Smuzhiyun struct w1_family_ops {
254*4882a593Smuzhiyun int (*add_slave)(struct w1_slave *sl);
255*4882a593Smuzhiyun void (*remove_slave)(struct w1_slave *sl);
256*4882a593Smuzhiyun const struct attribute_group **groups;
257*4882a593Smuzhiyun const struct hwmon_chip_info *chip_info;
258*4882a593Smuzhiyun };
259*4882a593Smuzhiyun
260*4882a593Smuzhiyun /**
261*4882a593Smuzhiyun * struct w1_family - reference counted family structure.
262*4882a593Smuzhiyun * @family_entry: family linked list
263*4882a593Smuzhiyun * @fid: 8 bit family identifier
264*4882a593Smuzhiyun * @fops: operations for this family
265*4882a593Smuzhiyun * @of_match_table: open firmware match table
266*4882a593Smuzhiyun * @refcnt: reference counter
267*4882a593Smuzhiyun */
268*4882a593Smuzhiyun struct w1_family {
269*4882a593Smuzhiyun struct list_head family_entry;
270*4882a593Smuzhiyun u8 fid;
271*4882a593Smuzhiyun
272*4882a593Smuzhiyun const struct w1_family_ops *fops;
273*4882a593Smuzhiyun
274*4882a593Smuzhiyun const struct of_device_id *of_match_table;
275*4882a593Smuzhiyun
276*4882a593Smuzhiyun atomic_t refcnt;
277*4882a593Smuzhiyun };
278*4882a593Smuzhiyun
279*4882a593Smuzhiyun int w1_register_family(struct w1_family *family);
280*4882a593Smuzhiyun void w1_unregister_family(struct w1_family *family);
281*4882a593Smuzhiyun
282*4882a593Smuzhiyun /**
283*4882a593Smuzhiyun * module_w1_driver() - Helper macro for registering a 1-Wire families
284*4882a593Smuzhiyun * @__w1_family: w1_family struct
285*4882a593Smuzhiyun *
286*4882a593Smuzhiyun * Helper macro for 1-Wire families which do not do anything special in module
287*4882a593Smuzhiyun * init/exit. This eliminates a lot of boilerplate. Each module may only
288*4882a593Smuzhiyun * use this macro once, and calling it replaces module_init() and module_exit()
289*4882a593Smuzhiyun */
290*4882a593Smuzhiyun #define module_w1_family(__w1_family) \
291*4882a593Smuzhiyun module_driver(__w1_family, w1_register_family, \
292*4882a593Smuzhiyun w1_unregister_family)
293*4882a593Smuzhiyun
294*4882a593Smuzhiyun u8 w1_triplet(struct w1_master *dev, int bdir);
295*4882a593Smuzhiyun u8 w1_touch_bit(struct w1_master *dev, int bit);
296*4882a593Smuzhiyun void w1_write_8(struct w1_master *, u8);
297*4882a593Smuzhiyun u8 w1_read_8(struct w1_master *);
298*4882a593Smuzhiyun int w1_reset_bus(struct w1_master *);
299*4882a593Smuzhiyun u8 w1_calc_crc8(u8 *, int);
300*4882a593Smuzhiyun void w1_write_block(struct w1_master *, const u8 *, int);
301*4882a593Smuzhiyun void w1_touch_block(struct w1_master *, u8 *, int);
302*4882a593Smuzhiyun u8 w1_read_block(struct w1_master *, u8 *, int);
303*4882a593Smuzhiyun int w1_reset_select_slave(struct w1_slave *sl);
304*4882a593Smuzhiyun int w1_reset_resume_command(struct w1_master *);
305*4882a593Smuzhiyun void w1_next_pullup(struct w1_master *, int);
306*4882a593Smuzhiyun
dev_to_w1_slave(struct device * dev)307*4882a593Smuzhiyun static inline struct w1_slave* dev_to_w1_slave(struct device *dev)
308*4882a593Smuzhiyun {
309*4882a593Smuzhiyun return container_of(dev, struct w1_slave, dev);
310*4882a593Smuzhiyun }
311*4882a593Smuzhiyun
kobj_to_w1_slave(struct kobject * kobj)312*4882a593Smuzhiyun static inline struct w1_slave* kobj_to_w1_slave(struct kobject *kobj)
313*4882a593Smuzhiyun {
314*4882a593Smuzhiyun return dev_to_w1_slave(container_of(kobj, struct device, kobj));
315*4882a593Smuzhiyun }
316*4882a593Smuzhiyun
dev_to_w1_master(struct device * dev)317*4882a593Smuzhiyun static inline struct w1_master* dev_to_w1_master(struct device *dev)
318*4882a593Smuzhiyun {
319*4882a593Smuzhiyun return container_of(dev, struct w1_master, dev);
320*4882a593Smuzhiyun }
321*4882a593Smuzhiyun
322*4882a593Smuzhiyun #endif /* __KERNEL__ */
323*4882a593Smuzhiyun
324*4882a593Smuzhiyun #endif /* __LINUX_W1_H */
325