xref: /OK3568_Linux_fs/kernel/drivers/w1/masters/ds2490.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-or-later
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  *	ds2490.c  USB to one wire bridge
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (c) 2004 Evgeniy Polyakov <zbr@ioremap.net>
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #include <linux/module.h>
9*4882a593Smuzhiyun #include <linux/kernel.h>
10*4882a593Smuzhiyun #include <linux/mod_devicetable.h>
11*4882a593Smuzhiyun #include <linux/usb.h>
12*4882a593Smuzhiyun #include <linux/slab.h>
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #include <linux/w1.h>
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun /* USB Standard */
17*4882a593Smuzhiyun /* USB Control request vendor type */
18*4882a593Smuzhiyun #define VENDOR				0x40
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun /* COMMAND TYPE CODES */
21*4882a593Smuzhiyun #define CONTROL_CMD			0x00
22*4882a593Smuzhiyun #define COMM_CMD			0x01
23*4882a593Smuzhiyun #define MODE_CMD			0x02
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun /* CONTROL COMMAND CODES */
26*4882a593Smuzhiyun #define CTL_RESET_DEVICE		0x0000
27*4882a593Smuzhiyun #define CTL_START_EXE			0x0001
28*4882a593Smuzhiyun #define CTL_RESUME_EXE			0x0002
29*4882a593Smuzhiyun #define CTL_HALT_EXE_IDLE		0x0003
30*4882a593Smuzhiyun #define CTL_HALT_EXE_DONE		0x0004
31*4882a593Smuzhiyun #define CTL_FLUSH_COMM_CMDS		0x0007
32*4882a593Smuzhiyun #define CTL_FLUSH_RCV_BUFFER		0x0008
33*4882a593Smuzhiyun #define CTL_FLUSH_XMT_BUFFER		0x0009
34*4882a593Smuzhiyun #define CTL_GET_COMM_CMDS		0x000A
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun /* MODE COMMAND CODES */
37*4882a593Smuzhiyun #define MOD_PULSE_EN			0x0000
38*4882a593Smuzhiyun #define MOD_SPEED_CHANGE_EN		0x0001
39*4882a593Smuzhiyun #define MOD_1WIRE_SPEED			0x0002
40*4882a593Smuzhiyun #define MOD_STRONG_PU_DURATION		0x0003
41*4882a593Smuzhiyun #define MOD_PULLDOWN_SLEWRATE		0x0004
42*4882a593Smuzhiyun #define MOD_PROG_PULSE_DURATION		0x0005
43*4882a593Smuzhiyun #define MOD_WRITE1_LOWTIME		0x0006
44*4882a593Smuzhiyun #define MOD_DSOW0_TREC			0x0007
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun /* COMMUNICATION COMMAND CODES */
47*4882a593Smuzhiyun #define COMM_ERROR_ESCAPE		0x0601
48*4882a593Smuzhiyun #define COMM_SET_DURATION		0x0012
49*4882a593Smuzhiyun #define COMM_BIT_IO			0x0020
50*4882a593Smuzhiyun #define COMM_PULSE			0x0030
51*4882a593Smuzhiyun #define COMM_1_WIRE_RESET		0x0042
52*4882a593Smuzhiyun #define COMM_BYTE_IO			0x0052
53*4882a593Smuzhiyun #define COMM_MATCH_ACCESS		0x0064
54*4882a593Smuzhiyun #define COMM_BLOCK_IO			0x0074
55*4882a593Smuzhiyun #define COMM_READ_STRAIGHT		0x0080
56*4882a593Smuzhiyun #define COMM_DO_RELEASE			0x6092
57*4882a593Smuzhiyun #define COMM_SET_PATH			0x00A2
58*4882a593Smuzhiyun #define COMM_WRITE_SRAM_PAGE		0x00B2
59*4882a593Smuzhiyun #define COMM_WRITE_EPROM		0x00C4
60*4882a593Smuzhiyun #define COMM_READ_CRC_PROT_PAGE		0x00D4
61*4882a593Smuzhiyun #define COMM_READ_REDIRECT_PAGE_CRC	0x21E4
62*4882a593Smuzhiyun #define COMM_SEARCH_ACCESS		0x00F4
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun /* Communication command bits */
65*4882a593Smuzhiyun #define COMM_TYPE			0x0008
66*4882a593Smuzhiyun #define COMM_SE				0x0008
67*4882a593Smuzhiyun #define COMM_D				0x0008
68*4882a593Smuzhiyun #define COMM_Z				0x0008
69*4882a593Smuzhiyun #define COMM_CH				0x0008
70*4882a593Smuzhiyun #define COMM_SM				0x0008
71*4882a593Smuzhiyun #define COMM_R				0x0008
72*4882a593Smuzhiyun #define COMM_IM				0x0001
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun #define COMM_PS				0x4000
75*4882a593Smuzhiyun #define COMM_PST			0x4000
76*4882a593Smuzhiyun #define COMM_CIB			0x4000
77*4882a593Smuzhiyun #define COMM_RTS			0x4000
78*4882a593Smuzhiyun #define COMM_DT				0x2000
79*4882a593Smuzhiyun #define COMM_SPU			0x1000
80*4882a593Smuzhiyun #define COMM_F				0x0800
81*4882a593Smuzhiyun #define COMM_NTF			0x0400
82*4882a593Smuzhiyun #define COMM_ICP			0x0200
83*4882a593Smuzhiyun #define COMM_RST			0x0100
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun #define PULSE_PROG			0x01
86*4882a593Smuzhiyun #define PULSE_SPUE			0x02
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun #define BRANCH_MAIN			0xCC
89*4882a593Smuzhiyun #define BRANCH_AUX			0x33
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun /* Status flags */
92*4882a593Smuzhiyun #define ST_SPUA				0x01  /* Strong Pull-up is active */
93*4882a593Smuzhiyun #define ST_PRGA				0x02  /* 12V programming pulse is being generated */
94*4882a593Smuzhiyun #define ST_12VP				0x04  /* external 12V programming voltage is present */
95*4882a593Smuzhiyun #define ST_PMOD				0x08  /* DS2490 powered from USB and external sources */
96*4882a593Smuzhiyun #define ST_HALT				0x10  /* DS2490 is currently halted */
97*4882a593Smuzhiyun #define ST_IDLE				0x20  /* DS2490 is currently idle */
98*4882a593Smuzhiyun #define ST_EPOF				0x80
99*4882a593Smuzhiyun /* Status transfer size, 16 bytes status, 16 byte result flags */
100*4882a593Smuzhiyun #define ST_SIZE				0x20
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun /* Result Register flags */
103*4882a593Smuzhiyun #define RR_DETECT			0xA5 /* New device detected */
104*4882a593Smuzhiyun #define RR_NRS				0x01 /* Reset no presence or ... */
105*4882a593Smuzhiyun #define RR_SH				0x02 /* short on reset or set path */
106*4882a593Smuzhiyun #define RR_APP				0x04 /* alarming presence on reset */
107*4882a593Smuzhiyun #define RR_VPP				0x08 /* 12V expected not seen */
108*4882a593Smuzhiyun #define RR_CMP				0x10 /* compare error */
109*4882a593Smuzhiyun #define RR_CRC				0x20 /* CRC error detected */
110*4882a593Smuzhiyun #define RR_RDP				0x40 /* redirected page */
111*4882a593Smuzhiyun #define RR_EOS				0x80 /* end of search error */
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun #define SPEED_NORMAL			0x00
114*4882a593Smuzhiyun #define SPEED_FLEXIBLE			0x01
115*4882a593Smuzhiyun #define SPEED_OVERDRIVE			0x02
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun #define NUM_EP				4
118*4882a593Smuzhiyun #define EP_CONTROL			0
119*4882a593Smuzhiyun #define EP_STATUS			1
120*4882a593Smuzhiyun #define EP_DATA_OUT			2
121*4882a593Smuzhiyun #define EP_DATA_IN			3
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun struct ds_device {
124*4882a593Smuzhiyun 	struct list_head	ds_entry;
125*4882a593Smuzhiyun 
126*4882a593Smuzhiyun 	struct usb_device	*udev;
127*4882a593Smuzhiyun 	struct usb_interface	*intf;
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun 	int			ep[NUM_EP];
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun 	/* Strong PullUp
132*4882a593Smuzhiyun 	 * 0: pullup not active, else duration in milliseconds
133*4882a593Smuzhiyun 	 */
134*4882a593Smuzhiyun 	int			spu_sleep;
135*4882a593Smuzhiyun 	/* spu_bit contains COMM_SPU or 0 depending on if the strong pullup
136*4882a593Smuzhiyun 	 * should be active or not for writes.
137*4882a593Smuzhiyun 	 */
138*4882a593Smuzhiyun 	u16			spu_bit;
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun 	u8			st_buf[ST_SIZE];
141*4882a593Smuzhiyun 	u8			byte_buf;
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun 	struct w1_bus_master	master;
144*4882a593Smuzhiyun };
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun struct ds_status {
147*4882a593Smuzhiyun 	u8			enable;
148*4882a593Smuzhiyun 	u8			speed;
149*4882a593Smuzhiyun 	u8			pullup_dur;
150*4882a593Smuzhiyun 	u8			ppuls_dur;
151*4882a593Smuzhiyun 	u8			pulldown_slew;
152*4882a593Smuzhiyun 	u8			write1_time;
153*4882a593Smuzhiyun 	u8			write0_time;
154*4882a593Smuzhiyun 	u8			reserved0;
155*4882a593Smuzhiyun 	u8			status;
156*4882a593Smuzhiyun 	u8			command0;
157*4882a593Smuzhiyun 	u8			command1;
158*4882a593Smuzhiyun 	u8			command_buffer_status;
159*4882a593Smuzhiyun 	u8			data_out_buffer_status;
160*4882a593Smuzhiyun 	u8			data_in_buffer_status;
161*4882a593Smuzhiyun 	u8			reserved1;
162*4882a593Smuzhiyun 	u8			reserved2;
163*4882a593Smuzhiyun };
164*4882a593Smuzhiyun 
165*4882a593Smuzhiyun static LIST_HEAD(ds_devices);
166*4882a593Smuzhiyun static DEFINE_MUTEX(ds_mutex);
167*4882a593Smuzhiyun 
ds_send_control_cmd(struct ds_device * dev,u16 value,u16 index)168*4882a593Smuzhiyun static int ds_send_control_cmd(struct ds_device *dev, u16 value, u16 index)
169*4882a593Smuzhiyun {
170*4882a593Smuzhiyun 	int err;
171*4882a593Smuzhiyun 
172*4882a593Smuzhiyun 	err = usb_control_msg(dev->udev, usb_sndctrlpipe(dev->udev, dev->ep[EP_CONTROL]),
173*4882a593Smuzhiyun 			CONTROL_CMD, VENDOR, value, index, NULL, 0, 1000);
174*4882a593Smuzhiyun 	if (err < 0) {
175*4882a593Smuzhiyun 		pr_err("Failed to send command control message %x.%x: err=%d.\n",
176*4882a593Smuzhiyun 				value, index, err);
177*4882a593Smuzhiyun 		return err;
178*4882a593Smuzhiyun 	}
179*4882a593Smuzhiyun 
180*4882a593Smuzhiyun 	return err;
181*4882a593Smuzhiyun }
182*4882a593Smuzhiyun 
ds_send_control_mode(struct ds_device * dev,u16 value,u16 index)183*4882a593Smuzhiyun static int ds_send_control_mode(struct ds_device *dev, u16 value, u16 index)
184*4882a593Smuzhiyun {
185*4882a593Smuzhiyun 	int err;
186*4882a593Smuzhiyun 
187*4882a593Smuzhiyun 	err = usb_control_msg(dev->udev, usb_sndctrlpipe(dev->udev, dev->ep[EP_CONTROL]),
188*4882a593Smuzhiyun 			MODE_CMD, VENDOR, value, index, NULL, 0, 1000);
189*4882a593Smuzhiyun 	if (err < 0) {
190*4882a593Smuzhiyun 		pr_err("Failed to send mode control message %x.%x: err=%d.\n",
191*4882a593Smuzhiyun 				value, index, err);
192*4882a593Smuzhiyun 		return err;
193*4882a593Smuzhiyun 	}
194*4882a593Smuzhiyun 
195*4882a593Smuzhiyun 	return err;
196*4882a593Smuzhiyun }
197*4882a593Smuzhiyun 
ds_send_control(struct ds_device * dev,u16 value,u16 index)198*4882a593Smuzhiyun static int ds_send_control(struct ds_device *dev, u16 value, u16 index)
199*4882a593Smuzhiyun {
200*4882a593Smuzhiyun 	int err;
201*4882a593Smuzhiyun 
202*4882a593Smuzhiyun 	err = usb_control_msg(dev->udev, usb_sndctrlpipe(dev->udev, dev->ep[EP_CONTROL]),
203*4882a593Smuzhiyun 			COMM_CMD, VENDOR, value, index, NULL, 0, 1000);
204*4882a593Smuzhiyun 	if (err < 0) {
205*4882a593Smuzhiyun 		pr_err("Failed to send control message %x.%x: err=%d.\n",
206*4882a593Smuzhiyun 				value, index, err);
207*4882a593Smuzhiyun 		return err;
208*4882a593Smuzhiyun 	}
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun 	return err;
211*4882a593Smuzhiyun }
212*4882a593Smuzhiyun 
ds_print_msg(unsigned char * buf,unsigned char * str,int off)213*4882a593Smuzhiyun static inline void ds_print_msg(unsigned char *buf, unsigned char *str, int off)
214*4882a593Smuzhiyun {
215*4882a593Smuzhiyun 	pr_info("%45s: %8x\n", str, buf[off]);
216*4882a593Smuzhiyun }
217*4882a593Smuzhiyun 
ds_dump_status(struct ds_device * dev,unsigned char * buf,int count)218*4882a593Smuzhiyun static void ds_dump_status(struct ds_device *dev, unsigned char *buf, int count)
219*4882a593Smuzhiyun {
220*4882a593Smuzhiyun 	int i;
221*4882a593Smuzhiyun 
222*4882a593Smuzhiyun 	pr_info("0x%x: count=%d, status: ", dev->ep[EP_STATUS], count);
223*4882a593Smuzhiyun 	for (i = 0; i < count; ++i)
224*4882a593Smuzhiyun 		pr_info("%02x ", buf[i]);
225*4882a593Smuzhiyun 	pr_info("\n");
226*4882a593Smuzhiyun 
227*4882a593Smuzhiyun 	if (count >= 16) {
228*4882a593Smuzhiyun 		ds_print_msg(buf, "enable flag", 0);
229*4882a593Smuzhiyun 		ds_print_msg(buf, "1-wire speed", 1);
230*4882a593Smuzhiyun 		ds_print_msg(buf, "strong pullup duration", 2);
231*4882a593Smuzhiyun 		ds_print_msg(buf, "programming pulse duration", 3);
232*4882a593Smuzhiyun 		ds_print_msg(buf, "pulldown slew rate control", 4);
233*4882a593Smuzhiyun 		ds_print_msg(buf, "write-1 low time", 5);
234*4882a593Smuzhiyun 		ds_print_msg(buf, "data sample offset/write-0 recovery time",
235*4882a593Smuzhiyun 			6);
236*4882a593Smuzhiyun 		ds_print_msg(buf, "reserved (test register)", 7);
237*4882a593Smuzhiyun 		ds_print_msg(buf, "device status flags", 8);
238*4882a593Smuzhiyun 		ds_print_msg(buf, "communication command byte 1", 9);
239*4882a593Smuzhiyun 		ds_print_msg(buf, "communication command byte 2", 10);
240*4882a593Smuzhiyun 		ds_print_msg(buf, "communication command buffer status", 11);
241*4882a593Smuzhiyun 		ds_print_msg(buf, "1-wire data output buffer status", 12);
242*4882a593Smuzhiyun 		ds_print_msg(buf, "1-wire data input buffer status", 13);
243*4882a593Smuzhiyun 		ds_print_msg(buf, "reserved", 14);
244*4882a593Smuzhiyun 		ds_print_msg(buf, "reserved", 15);
245*4882a593Smuzhiyun 	}
246*4882a593Smuzhiyun 	for (i = 16; i < count; ++i) {
247*4882a593Smuzhiyun 		if (buf[i] == RR_DETECT) {
248*4882a593Smuzhiyun 			ds_print_msg(buf, "new device detect", i);
249*4882a593Smuzhiyun 			continue;
250*4882a593Smuzhiyun 		}
251*4882a593Smuzhiyun 		ds_print_msg(buf, "Result Register Value: ", i);
252*4882a593Smuzhiyun 		if (buf[i] & RR_NRS)
253*4882a593Smuzhiyun 			pr_info("NRS: Reset no presence or ...\n");
254*4882a593Smuzhiyun 		if (buf[i] & RR_SH)
255*4882a593Smuzhiyun 			pr_info("SH: short on reset or set path\n");
256*4882a593Smuzhiyun 		if (buf[i] & RR_APP)
257*4882a593Smuzhiyun 			pr_info("APP: alarming presence on reset\n");
258*4882a593Smuzhiyun 		if (buf[i] & RR_VPP)
259*4882a593Smuzhiyun 			pr_info("VPP: 12V expected not seen\n");
260*4882a593Smuzhiyun 		if (buf[i] & RR_CMP)
261*4882a593Smuzhiyun 			pr_info("CMP: compare error\n");
262*4882a593Smuzhiyun 		if (buf[i] & RR_CRC)
263*4882a593Smuzhiyun 			pr_info("CRC: CRC error detected\n");
264*4882a593Smuzhiyun 		if (buf[i] & RR_RDP)
265*4882a593Smuzhiyun 			pr_info("RDP: redirected page\n");
266*4882a593Smuzhiyun 		if (buf[i] & RR_EOS)
267*4882a593Smuzhiyun 			pr_info("EOS: end of search error\n");
268*4882a593Smuzhiyun 	}
269*4882a593Smuzhiyun }
270*4882a593Smuzhiyun 
ds_recv_status(struct ds_device * dev,struct ds_status * st,bool dump)271*4882a593Smuzhiyun static int ds_recv_status(struct ds_device *dev, struct ds_status *st,
272*4882a593Smuzhiyun 			  bool dump)
273*4882a593Smuzhiyun {
274*4882a593Smuzhiyun 	int count, err;
275*4882a593Smuzhiyun 
276*4882a593Smuzhiyun 	if (st)
277*4882a593Smuzhiyun 		memset(st, 0, sizeof(*st));
278*4882a593Smuzhiyun 
279*4882a593Smuzhiyun 	count = 0;
280*4882a593Smuzhiyun 	err = usb_interrupt_msg(dev->udev,
281*4882a593Smuzhiyun 				usb_rcvintpipe(dev->udev,
282*4882a593Smuzhiyun 					       dev->ep[EP_STATUS]),
283*4882a593Smuzhiyun 				dev->st_buf, sizeof(dev->st_buf),
284*4882a593Smuzhiyun 				&count, 1000);
285*4882a593Smuzhiyun 	if (err < 0) {
286*4882a593Smuzhiyun 		pr_err("Failed to read 1-wire data from 0x%x: err=%d.\n",
287*4882a593Smuzhiyun 		       dev->ep[EP_STATUS], err);
288*4882a593Smuzhiyun 		return err;
289*4882a593Smuzhiyun 	}
290*4882a593Smuzhiyun 
291*4882a593Smuzhiyun 	if (dump)
292*4882a593Smuzhiyun 		ds_dump_status(dev, dev->st_buf, count);
293*4882a593Smuzhiyun 
294*4882a593Smuzhiyun 	if (st && count >= sizeof(*st))
295*4882a593Smuzhiyun 		memcpy(st, dev->st_buf, sizeof(*st));
296*4882a593Smuzhiyun 
297*4882a593Smuzhiyun 	return count;
298*4882a593Smuzhiyun }
299*4882a593Smuzhiyun 
ds_reset_device(struct ds_device * dev)300*4882a593Smuzhiyun static void ds_reset_device(struct ds_device *dev)
301*4882a593Smuzhiyun {
302*4882a593Smuzhiyun 	ds_send_control_cmd(dev, CTL_RESET_DEVICE, 0);
303*4882a593Smuzhiyun 	/* Always allow strong pullup which allow individual writes to use
304*4882a593Smuzhiyun 	 * the strong pullup.
305*4882a593Smuzhiyun 	 */
306*4882a593Smuzhiyun 	if (ds_send_control_mode(dev, MOD_PULSE_EN, PULSE_SPUE))
307*4882a593Smuzhiyun 		pr_err("ds_reset_device: Error allowing strong pullup\n");
308*4882a593Smuzhiyun 	/* Chip strong pullup time was cleared. */
309*4882a593Smuzhiyun 	if (dev->spu_sleep) {
310*4882a593Smuzhiyun 		/* lower 4 bits are 0, see ds_set_pullup */
311*4882a593Smuzhiyun 		u8 del = dev->spu_sleep>>4;
312*4882a593Smuzhiyun 		if (ds_send_control(dev, COMM_SET_DURATION | COMM_IM, del))
313*4882a593Smuzhiyun 			pr_err("ds_reset_device: Error setting duration\n");
314*4882a593Smuzhiyun 	}
315*4882a593Smuzhiyun }
316*4882a593Smuzhiyun 
ds_recv_data(struct ds_device * dev,unsigned char * buf,int size)317*4882a593Smuzhiyun static int ds_recv_data(struct ds_device *dev, unsigned char *buf, int size)
318*4882a593Smuzhiyun {
319*4882a593Smuzhiyun 	int count, err;
320*4882a593Smuzhiyun 
321*4882a593Smuzhiyun 	/* Careful on size.  If size is less than what is available in
322*4882a593Smuzhiyun 	 * the input buffer, the device fails the bulk transfer and
323*4882a593Smuzhiyun 	 * clears the input buffer.  It could read the maximum size of
324*4882a593Smuzhiyun 	 * the data buffer, but then do you return the first, last, or
325*4882a593Smuzhiyun 	 * some set of the middle size bytes?  As long as the rest of
326*4882a593Smuzhiyun 	 * the code is correct there will be size bytes waiting.  A
327*4882a593Smuzhiyun 	 * call to ds_wait_status will wait until the device is idle
328*4882a593Smuzhiyun 	 * and any data to be received would have been available.
329*4882a593Smuzhiyun 	 */
330*4882a593Smuzhiyun 	count = 0;
331*4882a593Smuzhiyun 	err = usb_bulk_msg(dev->udev, usb_rcvbulkpipe(dev->udev, dev->ep[EP_DATA_IN]),
332*4882a593Smuzhiyun 				buf, size, &count, 1000);
333*4882a593Smuzhiyun 	if (err < 0) {
334*4882a593Smuzhiyun 		pr_info("Clearing ep0x%x.\n", dev->ep[EP_DATA_IN]);
335*4882a593Smuzhiyun 		usb_clear_halt(dev->udev, usb_rcvbulkpipe(dev->udev, dev->ep[EP_DATA_IN]));
336*4882a593Smuzhiyun 		ds_recv_status(dev, NULL, true);
337*4882a593Smuzhiyun 		return err;
338*4882a593Smuzhiyun 	}
339*4882a593Smuzhiyun 
340*4882a593Smuzhiyun #if 0
341*4882a593Smuzhiyun 	{
342*4882a593Smuzhiyun 		int i;
343*4882a593Smuzhiyun 
344*4882a593Smuzhiyun 		printk("%s: count=%d: ", __func__, count);
345*4882a593Smuzhiyun 		for (i = 0; i < count; ++i)
346*4882a593Smuzhiyun 			printk("%02x ", buf[i]);
347*4882a593Smuzhiyun 		printk("\n");
348*4882a593Smuzhiyun 	}
349*4882a593Smuzhiyun #endif
350*4882a593Smuzhiyun 	return count;
351*4882a593Smuzhiyun }
352*4882a593Smuzhiyun 
ds_send_data(struct ds_device * dev,unsigned char * buf,int len)353*4882a593Smuzhiyun static int ds_send_data(struct ds_device *dev, unsigned char *buf, int len)
354*4882a593Smuzhiyun {
355*4882a593Smuzhiyun 	int count, err;
356*4882a593Smuzhiyun 
357*4882a593Smuzhiyun 	count = 0;
358*4882a593Smuzhiyun 	err = usb_bulk_msg(dev->udev, usb_sndbulkpipe(dev->udev, dev->ep[EP_DATA_OUT]), buf, len, &count, 1000);
359*4882a593Smuzhiyun 	if (err < 0) {
360*4882a593Smuzhiyun 		pr_err("Failed to write 1-wire data to ep0x%x: "
361*4882a593Smuzhiyun 			"err=%d.\n", dev->ep[EP_DATA_OUT], err);
362*4882a593Smuzhiyun 		return err;
363*4882a593Smuzhiyun 	}
364*4882a593Smuzhiyun 
365*4882a593Smuzhiyun 	return err;
366*4882a593Smuzhiyun }
367*4882a593Smuzhiyun 
368*4882a593Smuzhiyun #if 0
369*4882a593Smuzhiyun 
370*4882a593Smuzhiyun int ds_stop_pulse(struct ds_device *dev, int limit)
371*4882a593Smuzhiyun {
372*4882a593Smuzhiyun 	struct ds_status st;
373*4882a593Smuzhiyun 	int count = 0, err = 0;
374*4882a593Smuzhiyun 
375*4882a593Smuzhiyun 	do {
376*4882a593Smuzhiyun 		err = ds_send_control(dev, CTL_HALT_EXE_IDLE, 0);
377*4882a593Smuzhiyun 		if (err)
378*4882a593Smuzhiyun 			break;
379*4882a593Smuzhiyun 		err = ds_send_control(dev, CTL_RESUME_EXE, 0);
380*4882a593Smuzhiyun 		if (err)
381*4882a593Smuzhiyun 			break;
382*4882a593Smuzhiyun 		err = ds_recv_status(dev, &st, false);
383*4882a593Smuzhiyun 		if (err)
384*4882a593Smuzhiyun 			break;
385*4882a593Smuzhiyun 
386*4882a593Smuzhiyun 		if ((st.status & ST_SPUA) == 0) {
387*4882a593Smuzhiyun 			err = ds_send_control_mode(dev, MOD_PULSE_EN, 0);
388*4882a593Smuzhiyun 			if (err)
389*4882a593Smuzhiyun 				break;
390*4882a593Smuzhiyun 		}
391*4882a593Smuzhiyun 	} while (++count < limit);
392*4882a593Smuzhiyun 
393*4882a593Smuzhiyun 	return err;
394*4882a593Smuzhiyun }
395*4882a593Smuzhiyun 
396*4882a593Smuzhiyun int ds_detect(struct ds_device *dev, struct ds_status *st)
397*4882a593Smuzhiyun {
398*4882a593Smuzhiyun 	int err;
399*4882a593Smuzhiyun 
400*4882a593Smuzhiyun 	err = ds_send_control_cmd(dev, CTL_RESET_DEVICE, 0);
401*4882a593Smuzhiyun 	if (err)
402*4882a593Smuzhiyun 		return err;
403*4882a593Smuzhiyun 
404*4882a593Smuzhiyun 	err = ds_send_control(dev, COMM_SET_DURATION | COMM_IM, 0);
405*4882a593Smuzhiyun 	if (err)
406*4882a593Smuzhiyun 		return err;
407*4882a593Smuzhiyun 
408*4882a593Smuzhiyun 	err = ds_send_control(dev, COMM_SET_DURATION | COMM_IM | COMM_TYPE, 0x40);
409*4882a593Smuzhiyun 	if (err)
410*4882a593Smuzhiyun 		return err;
411*4882a593Smuzhiyun 
412*4882a593Smuzhiyun 	err = ds_send_control_mode(dev, MOD_PULSE_EN, PULSE_PROG);
413*4882a593Smuzhiyun 	if (err)
414*4882a593Smuzhiyun 		return err;
415*4882a593Smuzhiyun 
416*4882a593Smuzhiyun 	err = ds_dump_status(dev, st);
417*4882a593Smuzhiyun 
418*4882a593Smuzhiyun 	return err;
419*4882a593Smuzhiyun }
420*4882a593Smuzhiyun 
421*4882a593Smuzhiyun #endif  /*  0  */
422*4882a593Smuzhiyun 
ds_wait_status(struct ds_device * dev,struct ds_status * st)423*4882a593Smuzhiyun static int ds_wait_status(struct ds_device *dev, struct ds_status *st)
424*4882a593Smuzhiyun {
425*4882a593Smuzhiyun 	int err, count = 0;
426*4882a593Smuzhiyun 
427*4882a593Smuzhiyun 	do {
428*4882a593Smuzhiyun 		st->status = 0;
429*4882a593Smuzhiyun 		err = ds_recv_status(dev, st, false);
430*4882a593Smuzhiyun #if 0
431*4882a593Smuzhiyun 		if (err >= 0) {
432*4882a593Smuzhiyun 			int i;
433*4882a593Smuzhiyun 			printk("0x%x: count=%d, status: ", dev->ep[EP_STATUS], err);
434*4882a593Smuzhiyun 			for (i = 0; i < err; ++i)
435*4882a593Smuzhiyun 				printk("%02x ", dev->st_buf[i]);
436*4882a593Smuzhiyun 			printk("\n");
437*4882a593Smuzhiyun 		}
438*4882a593Smuzhiyun #endif
439*4882a593Smuzhiyun 	} while (!(st->status & ST_IDLE) && !(err < 0) && ++count < 100);
440*4882a593Smuzhiyun 
441*4882a593Smuzhiyun 	if (err >= 16 && st->status & ST_EPOF) {
442*4882a593Smuzhiyun 		pr_info("Resetting device after ST_EPOF.\n");
443*4882a593Smuzhiyun 		ds_reset_device(dev);
444*4882a593Smuzhiyun 		/* Always dump the device status. */
445*4882a593Smuzhiyun 		count = 101;
446*4882a593Smuzhiyun 	}
447*4882a593Smuzhiyun 
448*4882a593Smuzhiyun 	/* Dump the status for errors or if there is extended return data.
449*4882a593Smuzhiyun 	 * The extended status includes new device detection (maybe someone
450*4882a593Smuzhiyun 	 * can do something with it).
451*4882a593Smuzhiyun 	 */
452*4882a593Smuzhiyun 	if (err > 16 || count >= 100 || err < 0)
453*4882a593Smuzhiyun 		ds_dump_status(dev, dev->st_buf, err);
454*4882a593Smuzhiyun 
455*4882a593Smuzhiyun 	/* Extended data isn't an error.  Well, a short is, but the dump
456*4882a593Smuzhiyun 	 * would have already told the user that and we can't do anything
457*4882a593Smuzhiyun 	 * about it in software anyway.
458*4882a593Smuzhiyun 	 */
459*4882a593Smuzhiyun 	if (count >= 100 || err < 0)
460*4882a593Smuzhiyun 		return -1;
461*4882a593Smuzhiyun 	else
462*4882a593Smuzhiyun 		return 0;
463*4882a593Smuzhiyun }
464*4882a593Smuzhiyun 
ds_reset(struct ds_device * dev)465*4882a593Smuzhiyun static int ds_reset(struct ds_device *dev)
466*4882a593Smuzhiyun {
467*4882a593Smuzhiyun 	int err;
468*4882a593Smuzhiyun 
469*4882a593Smuzhiyun 	/* Other potentionally interesting flags for reset.
470*4882a593Smuzhiyun 	 *
471*4882a593Smuzhiyun 	 * COMM_NTF: Return result register feedback.  This could be used to
472*4882a593Smuzhiyun 	 * detect some conditions such as short, alarming presence, or
473*4882a593Smuzhiyun 	 * detect if a new device was detected.
474*4882a593Smuzhiyun 	 *
475*4882a593Smuzhiyun 	 * COMM_SE which allows SPEED_NORMAL, SPEED_FLEXIBLE, SPEED_OVERDRIVE:
476*4882a593Smuzhiyun 	 * Select the data transfer rate.
477*4882a593Smuzhiyun 	 */
478*4882a593Smuzhiyun 	err = ds_send_control(dev, COMM_1_WIRE_RESET | COMM_IM, SPEED_NORMAL);
479*4882a593Smuzhiyun 	if (err)
480*4882a593Smuzhiyun 		return err;
481*4882a593Smuzhiyun 
482*4882a593Smuzhiyun 	return 0;
483*4882a593Smuzhiyun }
484*4882a593Smuzhiyun 
485*4882a593Smuzhiyun #if 0
486*4882a593Smuzhiyun static int ds_set_speed(struct ds_device *dev, int speed)
487*4882a593Smuzhiyun {
488*4882a593Smuzhiyun 	int err;
489*4882a593Smuzhiyun 
490*4882a593Smuzhiyun 	if (speed != SPEED_NORMAL && speed != SPEED_FLEXIBLE && speed != SPEED_OVERDRIVE)
491*4882a593Smuzhiyun 		return -EINVAL;
492*4882a593Smuzhiyun 
493*4882a593Smuzhiyun 	if (speed != SPEED_OVERDRIVE)
494*4882a593Smuzhiyun 		speed = SPEED_FLEXIBLE;
495*4882a593Smuzhiyun 
496*4882a593Smuzhiyun 	speed &= 0xff;
497*4882a593Smuzhiyun 
498*4882a593Smuzhiyun 	err = ds_send_control_mode(dev, MOD_1WIRE_SPEED, speed);
499*4882a593Smuzhiyun 	if (err)
500*4882a593Smuzhiyun 		return err;
501*4882a593Smuzhiyun 
502*4882a593Smuzhiyun 	return err;
503*4882a593Smuzhiyun }
504*4882a593Smuzhiyun #endif  /*  0  */
505*4882a593Smuzhiyun 
ds_set_pullup(struct ds_device * dev,int delay)506*4882a593Smuzhiyun static int ds_set_pullup(struct ds_device *dev, int delay)
507*4882a593Smuzhiyun {
508*4882a593Smuzhiyun 	int err = 0;
509*4882a593Smuzhiyun 	u8 del = 1 + (u8)(delay >> 4);
510*4882a593Smuzhiyun 	/* Just storing delay would not get the trunication and roundup. */
511*4882a593Smuzhiyun 	int ms = del<<4;
512*4882a593Smuzhiyun 
513*4882a593Smuzhiyun 	/* Enable spu_bit if a delay is set. */
514*4882a593Smuzhiyun 	dev->spu_bit = delay ? COMM_SPU : 0;
515*4882a593Smuzhiyun 	/* If delay is zero, it has already been disabled, if the time is
516*4882a593Smuzhiyun 	 * the same as the hardware was last programmed to, there is also
517*4882a593Smuzhiyun 	 * nothing more to do.  Compare with the recalculated value ms
518*4882a593Smuzhiyun 	 * rather than del or delay which can have a different value.
519*4882a593Smuzhiyun 	 */
520*4882a593Smuzhiyun 	if (delay == 0 || ms == dev->spu_sleep)
521*4882a593Smuzhiyun 		return err;
522*4882a593Smuzhiyun 
523*4882a593Smuzhiyun 	err = ds_send_control(dev, COMM_SET_DURATION | COMM_IM, del);
524*4882a593Smuzhiyun 	if (err)
525*4882a593Smuzhiyun 		return err;
526*4882a593Smuzhiyun 
527*4882a593Smuzhiyun 	dev->spu_sleep = ms;
528*4882a593Smuzhiyun 
529*4882a593Smuzhiyun 	return err;
530*4882a593Smuzhiyun }
531*4882a593Smuzhiyun 
ds_touch_bit(struct ds_device * dev,u8 bit,u8 * tbit)532*4882a593Smuzhiyun static int ds_touch_bit(struct ds_device *dev, u8 bit, u8 *tbit)
533*4882a593Smuzhiyun {
534*4882a593Smuzhiyun 	int err;
535*4882a593Smuzhiyun 	struct ds_status st;
536*4882a593Smuzhiyun 
537*4882a593Smuzhiyun 	err = ds_send_control(dev, COMM_BIT_IO | COMM_IM | (bit ? COMM_D : 0),
538*4882a593Smuzhiyun 		0);
539*4882a593Smuzhiyun 	if (err)
540*4882a593Smuzhiyun 		return err;
541*4882a593Smuzhiyun 
542*4882a593Smuzhiyun 	ds_wait_status(dev, &st);
543*4882a593Smuzhiyun 
544*4882a593Smuzhiyun 	err = ds_recv_data(dev, tbit, sizeof(*tbit));
545*4882a593Smuzhiyun 	if (err < 0)
546*4882a593Smuzhiyun 		return err;
547*4882a593Smuzhiyun 
548*4882a593Smuzhiyun 	return 0;
549*4882a593Smuzhiyun }
550*4882a593Smuzhiyun 
551*4882a593Smuzhiyun #if 0
552*4882a593Smuzhiyun static int ds_write_bit(struct ds_device *dev, u8 bit)
553*4882a593Smuzhiyun {
554*4882a593Smuzhiyun 	int err;
555*4882a593Smuzhiyun 	struct ds_status st;
556*4882a593Smuzhiyun 
557*4882a593Smuzhiyun 	/* Set COMM_ICP to write without a readback.  Note, this will
558*4882a593Smuzhiyun 	 * produce one time slot, a down followed by an up with COMM_D
559*4882a593Smuzhiyun 	 * only determing the timing.
560*4882a593Smuzhiyun 	 */
561*4882a593Smuzhiyun 	err = ds_send_control(dev, COMM_BIT_IO | COMM_IM | COMM_ICP |
562*4882a593Smuzhiyun 		(bit ? COMM_D : 0), 0);
563*4882a593Smuzhiyun 	if (err)
564*4882a593Smuzhiyun 		return err;
565*4882a593Smuzhiyun 
566*4882a593Smuzhiyun 	ds_wait_status(dev, &st);
567*4882a593Smuzhiyun 
568*4882a593Smuzhiyun 	return 0;
569*4882a593Smuzhiyun }
570*4882a593Smuzhiyun #endif
571*4882a593Smuzhiyun 
ds_write_byte(struct ds_device * dev,u8 byte)572*4882a593Smuzhiyun static int ds_write_byte(struct ds_device *dev, u8 byte)
573*4882a593Smuzhiyun {
574*4882a593Smuzhiyun 	int err;
575*4882a593Smuzhiyun 	struct ds_status st;
576*4882a593Smuzhiyun 
577*4882a593Smuzhiyun 	err = ds_send_control(dev, COMM_BYTE_IO | COMM_IM | dev->spu_bit, byte);
578*4882a593Smuzhiyun 	if (err)
579*4882a593Smuzhiyun 		return err;
580*4882a593Smuzhiyun 
581*4882a593Smuzhiyun 	if (dev->spu_bit)
582*4882a593Smuzhiyun 		msleep(dev->spu_sleep);
583*4882a593Smuzhiyun 
584*4882a593Smuzhiyun 	err = ds_wait_status(dev, &st);
585*4882a593Smuzhiyun 	if (err)
586*4882a593Smuzhiyun 		return err;
587*4882a593Smuzhiyun 
588*4882a593Smuzhiyun 	err = ds_recv_data(dev, &dev->byte_buf, 1);
589*4882a593Smuzhiyun 	if (err < 0)
590*4882a593Smuzhiyun 		return err;
591*4882a593Smuzhiyun 
592*4882a593Smuzhiyun 	return !(byte == dev->byte_buf);
593*4882a593Smuzhiyun }
594*4882a593Smuzhiyun 
ds_read_byte(struct ds_device * dev,u8 * byte)595*4882a593Smuzhiyun static int ds_read_byte(struct ds_device *dev, u8 *byte)
596*4882a593Smuzhiyun {
597*4882a593Smuzhiyun 	int err;
598*4882a593Smuzhiyun 	struct ds_status st;
599*4882a593Smuzhiyun 
600*4882a593Smuzhiyun 	err = ds_send_control(dev, COMM_BYTE_IO | COMM_IM, 0xff);
601*4882a593Smuzhiyun 	if (err)
602*4882a593Smuzhiyun 		return err;
603*4882a593Smuzhiyun 
604*4882a593Smuzhiyun 	ds_wait_status(dev, &st);
605*4882a593Smuzhiyun 
606*4882a593Smuzhiyun 	err = ds_recv_data(dev, byte, sizeof(*byte));
607*4882a593Smuzhiyun 	if (err < 0)
608*4882a593Smuzhiyun 		return err;
609*4882a593Smuzhiyun 
610*4882a593Smuzhiyun 	return 0;
611*4882a593Smuzhiyun }
612*4882a593Smuzhiyun 
ds_read_block(struct ds_device * dev,u8 * buf,int len)613*4882a593Smuzhiyun static int ds_read_block(struct ds_device *dev, u8 *buf, int len)
614*4882a593Smuzhiyun {
615*4882a593Smuzhiyun 	struct ds_status st;
616*4882a593Smuzhiyun 	int err;
617*4882a593Smuzhiyun 
618*4882a593Smuzhiyun 	if (len > 64*1024)
619*4882a593Smuzhiyun 		return -E2BIG;
620*4882a593Smuzhiyun 
621*4882a593Smuzhiyun 	memset(buf, 0xFF, len);
622*4882a593Smuzhiyun 
623*4882a593Smuzhiyun 	err = ds_send_data(dev, buf, len);
624*4882a593Smuzhiyun 	if (err < 0)
625*4882a593Smuzhiyun 		return err;
626*4882a593Smuzhiyun 
627*4882a593Smuzhiyun 	err = ds_send_control(dev, COMM_BLOCK_IO | COMM_IM, len);
628*4882a593Smuzhiyun 	if (err)
629*4882a593Smuzhiyun 		return err;
630*4882a593Smuzhiyun 
631*4882a593Smuzhiyun 	ds_wait_status(dev, &st);
632*4882a593Smuzhiyun 
633*4882a593Smuzhiyun 	memset(buf, 0x00, len);
634*4882a593Smuzhiyun 	err = ds_recv_data(dev, buf, len);
635*4882a593Smuzhiyun 
636*4882a593Smuzhiyun 	return err;
637*4882a593Smuzhiyun }
638*4882a593Smuzhiyun 
ds_write_block(struct ds_device * dev,u8 * buf,int len)639*4882a593Smuzhiyun static int ds_write_block(struct ds_device *dev, u8 *buf, int len)
640*4882a593Smuzhiyun {
641*4882a593Smuzhiyun 	int err;
642*4882a593Smuzhiyun 	struct ds_status st;
643*4882a593Smuzhiyun 
644*4882a593Smuzhiyun 	err = ds_send_data(dev, buf, len);
645*4882a593Smuzhiyun 	if (err < 0)
646*4882a593Smuzhiyun 		return err;
647*4882a593Smuzhiyun 
648*4882a593Smuzhiyun 	err = ds_send_control(dev, COMM_BLOCK_IO | COMM_IM | dev->spu_bit, len);
649*4882a593Smuzhiyun 	if (err)
650*4882a593Smuzhiyun 		return err;
651*4882a593Smuzhiyun 
652*4882a593Smuzhiyun 	if (dev->spu_bit)
653*4882a593Smuzhiyun 		msleep(dev->spu_sleep);
654*4882a593Smuzhiyun 
655*4882a593Smuzhiyun 	ds_wait_status(dev, &st);
656*4882a593Smuzhiyun 
657*4882a593Smuzhiyun 	err = ds_recv_data(dev, buf, len);
658*4882a593Smuzhiyun 	if (err < 0)
659*4882a593Smuzhiyun 		return err;
660*4882a593Smuzhiyun 
661*4882a593Smuzhiyun 	return !(err == len);
662*4882a593Smuzhiyun }
663*4882a593Smuzhiyun 
ds9490r_search(void * data,struct w1_master * master,u8 search_type,w1_slave_found_callback callback)664*4882a593Smuzhiyun static void ds9490r_search(void *data, struct w1_master *master,
665*4882a593Smuzhiyun 	u8 search_type, w1_slave_found_callback callback)
666*4882a593Smuzhiyun {
667*4882a593Smuzhiyun 	/* When starting with an existing id, the first id returned will
668*4882a593Smuzhiyun 	 * be that device (if it is still on the bus most likely).
669*4882a593Smuzhiyun 	 *
670*4882a593Smuzhiyun 	 * If the number of devices found is less than or equal to the
671*4882a593Smuzhiyun 	 * search_limit, that number of IDs will be returned.  If there are
672*4882a593Smuzhiyun 	 * more, search_limit IDs will be returned followed by a non-zero
673*4882a593Smuzhiyun 	 * discrepency value.
674*4882a593Smuzhiyun 	 */
675*4882a593Smuzhiyun 	struct ds_device *dev = data;
676*4882a593Smuzhiyun 	int err;
677*4882a593Smuzhiyun 	u16 value, index;
678*4882a593Smuzhiyun 	struct ds_status st;
679*4882a593Smuzhiyun 	int search_limit;
680*4882a593Smuzhiyun 	int found = 0;
681*4882a593Smuzhiyun 	int i;
682*4882a593Smuzhiyun 
683*4882a593Smuzhiyun 	/* DS18b20 spec, 13.16 ms per device, 75 per second, sleep for
684*4882a593Smuzhiyun 	 * discovering 8 devices (1 bulk transfer and 1/2 FIFO size) at a time.
685*4882a593Smuzhiyun 	 */
686*4882a593Smuzhiyun 	const unsigned long jtime = msecs_to_jiffies(1000*8/75);
687*4882a593Smuzhiyun 	/* FIFO 128 bytes, bulk packet size 64, read a multiple of the
688*4882a593Smuzhiyun 	 * packet size.
689*4882a593Smuzhiyun 	 */
690*4882a593Smuzhiyun 	const size_t bufsize = 2 * 64;
691*4882a593Smuzhiyun 	u64 *buf;
692*4882a593Smuzhiyun 
693*4882a593Smuzhiyun 	buf = kmalloc(bufsize, GFP_KERNEL);
694*4882a593Smuzhiyun 	if (!buf)
695*4882a593Smuzhiyun 		return;
696*4882a593Smuzhiyun 
697*4882a593Smuzhiyun 	mutex_lock(&master->bus_mutex);
698*4882a593Smuzhiyun 
699*4882a593Smuzhiyun 	/* address to start searching at */
700*4882a593Smuzhiyun 	if (ds_send_data(dev, (u8 *)&master->search_id, 8) < 0)
701*4882a593Smuzhiyun 		goto search_out;
702*4882a593Smuzhiyun 	master->search_id = 0;
703*4882a593Smuzhiyun 
704*4882a593Smuzhiyun 	value = COMM_SEARCH_ACCESS | COMM_IM | COMM_RST | COMM_SM | COMM_F |
705*4882a593Smuzhiyun 		COMM_RTS;
706*4882a593Smuzhiyun 	search_limit = master->max_slave_count;
707*4882a593Smuzhiyun 	if (search_limit > 255)
708*4882a593Smuzhiyun 		search_limit = 0;
709*4882a593Smuzhiyun 	index = search_type | (search_limit << 8);
710*4882a593Smuzhiyun 	if (ds_send_control(dev, value, index) < 0)
711*4882a593Smuzhiyun 		goto search_out;
712*4882a593Smuzhiyun 
713*4882a593Smuzhiyun 	do {
714*4882a593Smuzhiyun 		schedule_timeout(jtime);
715*4882a593Smuzhiyun 
716*4882a593Smuzhiyun 		err = ds_recv_status(dev, &st, false);
717*4882a593Smuzhiyun 		if (err < 0 || err < sizeof(st))
718*4882a593Smuzhiyun 			break;
719*4882a593Smuzhiyun 
720*4882a593Smuzhiyun 		if (st.data_in_buffer_status) {
721*4882a593Smuzhiyun 			/* Bulk in can receive partial ids, but when it does
722*4882a593Smuzhiyun 			 * they fail crc and will be discarded anyway.
723*4882a593Smuzhiyun 			 * That has only been seen when status in buffer
724*4882a593Smuzhiyun 			 * is 0 and bulk is read anyway, so don't read
725*4882a593Smuzhiyun 			 * bulk without first checking if status says there
726*4882a593Smuzhiyun 			 * is data to read.
727*4882a593Smuzhiyun 			 */
728*4882a593Smuzhiyun 			err = ds_recv_data(dev, (u8 *)buf, bufsize);
729*4882a593Smuzhiyun 			if (err < 0)
730*4882a593Smuzhiyun 				break;
731*4882a593Smuzhiyun 			for (i = 0; i < err/8; ++i) {
732*4882a593Smuzhiyun 				++found;
733*4882a593Smuzhiyun 				if (found <= search_limit)
734*4882a593Smuzhiyun 					callback(master, buf[i]);
735*4882a593Smuzhiyun 				/* can't know if there will be a discrepancy
736*4882a593Smuzhiyun 				 * value after until the next id */
737*4882a593Smuzhiyun 				if (found == search_limit)
738*4882a593Smuzhiyun 					master->search_id = buf[i];
739*4882a593Smuzhiyun 			}
740*4882a593Smuzhiyun 		}
741*4882a593Smuzhiyun 
742*4882a593Smuzhiyun 		if (test_bit(W1_ABORT_SEARCH, &master->flags))
743*4882a593Smuzhiyun 			break;
744*4882a593Smuzhiyun 	} while (!(st.status & (ST_IDLE | ST_HALT)));
745*4882a593Smuzhiyun 
746*4882a593Smuzhiyun 	/* only continue the search if some weren't found */
747*4882a593Smuzhiyun 	if (found <= search_limit) {
748*4882a593Smuzhiyun 		master->search_id = 0;
749*4882a593Smuzhiyun 	} else if (!test_bit(W1_WARN_MAX_COUNT, &master->flags)) {
750*4882a593Smuzhiyun 		/* Only max_slave_count will be scanned in a search,
751*4882a593Smuzhiyun 		 * but it will start where it left off next search
752*4882a593Smuzhiyun 		 * until all ids are identified and then it will start
753*4882a593Smuzhiyun 		 * over.  A continued search will report the previous
754*4882a593Smuzhiyun 		 * last id as the first id (provided it is still on the
755*4882a593Smuzhiyun 		 * bus).
756*4882a593Smuzhiyun 		 */
757*4882a593Smuzhiyun 		dev_info(&dev->udev->dev, "%s: max_slave_count %d reached, "
758*4882a593Smuzhiyun 			"will continue next search.\n", __func__,
759*4882a593Smuzhiyun 			master->max_slave_count);
760*4882a593Smuzhiyun 		set_bit(W1_WARN_MAX_COUNT, &master->flags);
761*4882a593Smuzhiyun 	}
762*4882a593Smuzhiyun search_out:
763*4882a593Smuzhiyun 	mutex_unlock(&master->bus_mutex);
764*4882a593Smuzhiyun 	kfree(buf);
765*4882a593Smuzhiyun }
766*4882a593Smuzhiyun 
767*4882a593Smuzhiyun #if 0
768*4882a593Smuzhiyun /*
769*4882a593Smuzhiyun  * FIXME: if this disabled code is ever used in the future all ds_send_data()
770*4882a593Smuzhiyun  * calls must be changed to use a DMAable buffer.
771*4882a593Smuzhiyun  */
772*4882a593Smuzhiyun static int ds_match_access(struct ds_device *dev, u64 init)
773*4882a593Smuzhiyun {
774*4882a593Smuzhiyun 	int err;
775*4882a593Smuzhiyun 	struct ds_status st;
776*4882a593Smuzhiyun 
777*4882a593Smuzhiyun 	err = ds_send_data(dev, (unsigned char *)&init, sizeof(init));
778*4882a593Smuzhiyun 	if (err)
779*4882a593Smuzhiyun 		return err;
780*4882a593Smuzhiyun 
781*4882a593Smuzhiyun 	ds_wait_status(dev, &st);
782*4882a593Smuzhiyun 
783*4882a593Smuzhiyun 	err = ds_send_control(dev, COMM_MATCH_ACCESS | COMM_IM | COMM_RST, 0x0055);
784*4882a593Smuzhiyun 	if (err)
785*4882a593Smuzhiyun 		return err;
786*4882a593Smuzhiyun 
787*4882a593Smuzhiyun 	ds_wait_status(dev, &st);
788*4882a593Smuzhiyun 
789*4882a593Smuzhiyun 	return 0;
790*4882a593Smuzhiyun }
791*4882a593Smuzhiyun 
792*4882a593Smuzhiyun static int ds_set_path(struct ds_device *dev, u64 init)
793*4882a593Smuzhiyun {
794*4882a593Smuzhiyun 	int err;
795*4882a593Smuzhiyun 	struct ds_status st;
796*4882a593Smuzhiyun 	u8 buf[9];
797*4882a593Smuzhiyun 
798*4882a593Smuzhiyun 	memcpy(buf, &init, 8);
799*4882a593Smuzhiyun 	buf[8] = BRANCH_MAIN;
800*4882a593Smuzhiyun 
801*4882a593Smuzhiyun 	err = ds_send_data(dev, buf, sizeof(buf));
802*4882a593Smuzhiyun 	if (err)
803*4882a593Smuzhiyun 		return err;
804*4882a593Smuzhiyun 
805*4882a593Smuzhiyun 	ds_wait_status(dev, &st);
806*4882a593Smuzhiyun 
807*4882a593Smuzhiyun 	err = ds_send_control(dev, COMM_SET_PATH | COMM_IM | COMM_RST, 0);
808*4882a593Smuzhiyun 	if (err)
809*4882a593Smuzhiyun 		return err;
810*4882a593Smuzhiyun 
811*4882a593Smuzhiyun 	ds_wait_status(dev, &st);
812*4882a593Smuzhiyun 
813*4882a593Smuzhiyun 	return 0;
814*4882a593Smuzhiyun }
815*4882a593Smuzhiyun 
816*4882a593Smuzhiyun #endif  /*  0  */
817*4882a593Smuzhiyun 
ds9490r_touch_bit(void * data,u8 bit)818*4882a593Smuzhiyun static u8 ds9490r_touch_bit(void *data, u8 bit)
819*4882a593Smuzhiyun {
820*4882a593Smuzhiyun 	struct ds_device *dev = data;
821*4882a593Smuzhiyun 
822*4882a593Smuzhiyun 	if (ds_touch_bit(dev, bit, &dev->byte_buf))
823*4882a593Smuzhiyun 		return 0;
824*4882a593Smuzhiyun 
825*4882a593Smuzhiyun 	return dev->byte_buf;
826*4882a593Smuzhiyun }
827*4882a593Smuzhiyun 
828*4882a593Smuzhiyun #if 0
829*4882a593Smuzhiyun static void ds9490r_write_bit(void *data, u8 bit)
830*4882a593Smuzhiyun {
831*4882a593Smuzhiyun 	struct ds_device *dev = data;
832*4882a593Smuzhiyun 
833*4882a593Smuzhiyun 	ds_write_bit(dev, bit);
834*4882a593Smuzhiyun }
835*4882a593Smuzhiyun 
836*4882a593Smuzhiyun static u8 ds9490r_read_bit(void *data)
837*4882a593Smuzhiyun {
838*4882a593Smuzhiyun 	struct ds_device *dev = data;
839*4882a593Smuzhiyun 	int err;
840*4882a593Smuzhiyun 
841*4882a593Smuzhiyun 	err = ds_touch_bit(dev, 1, &dev->byte_buf);
842*4882a593Smuzhiyun 	if (err)
843*4882a593Smuzhiyun 		return 0;
844*4882a593Smuzhiyun 
845*4882a593Smuzhiyun 	return dev->byte_buf & 1;
846*4882a593Smuzhiyun }
847*4882a593Smuzhiyun #endif
848*4882a593Smuzhiyun 
ds9490r_write_byte(void * data,u8 byte)849*4882a593Smuzhiyun static void ds9490r_write_byte(void *data, u8 byte)
850*4882a593Smuzhiyun {
851*4882a593Smuzhiyun 	struct ds_device *dev = data;
852*4882a593Smuzhiyun 
853*4882a593Smuzhiyun 	ds_write_byte(dev, byte);
854*4882a593Smuzhiyun }
855*4882a593Smuzhiyun 
ds9490r_read_byte(void * data)856*4882a593Smuzhiyun static u8 ds9490r_read_byte(void *data)
857*4882a593Smuzhiyun {
858*4882a593Smuzhiyun 	struct ds_device *dev = data;
859*4882a593Smuzhiyun 	int err;
860*4882a593Smuzhiyun 
861*4882a593Smuzhiyun 	err = ds_read_byte(dev, &dev->byte_buf);
862*4882a593Smuzhiyun 	if (err)
863*4882a593Smuzhiyun 		return 0;
864*4882a593Smuzhiyun 
865*4882a593Smuzhiyun 	return dev->byte_buf;
866*4882a593Smuzhiyun }
867*4882a593Smuzhiyun 
ds9490r_write_block(void * data,const u8 * buf,int len)868*4882a593Smuzhiyun static void ds9490r_write_block(void *data, const u8 *buf, int len)
869*4882a593Smuzhiyun {
870*4882a593Smuzhiyun 	struct ds_device *dev = data;
871*4882a593Smuzhiyun 	u8 *tbuf;
872*4882a593Smuzhiyun 
873*4882a593Smuzhiyun 	if (len <= 0)
874*4882a593Smuzhiyun 		return;
875*4882a593Smuzhiyun 
876*4882a593Smuzhiyun 	tbuf = kmemdup(buf, len, GFP_KERNEL);
877*4882a593Smuzhiyun 	if (!tbuf)
878*4882a593Smuzhiyun 		return;
879*4882a593Smuzhiyun 
880*4882a593Smuzhiyun 	ds_write_block(dev, tbuf, len);
881*4882a593Smuzhiyun 
882*4882a593Smuzhiyun 	kfree(tbuf);
883*4882a593Smuzhiyun }
884*4882a593Smuzhiyun 
ds9490r_read_block(void * data,u8 * buf,int len)885*4882a593Smuzhiyun static u8 ds9490r_read_block(void *data, u8 *buf, int len)
886*4882a593Smuzhiyun {
887*4882a593Smuzhiyun 	struct ds_device *dev = data;
888*4882a593Smuzhiyun 	int err;
889*4882a593Smuzhiyun 	u8 *tbuf;
890*4882a593Smuzhiyun 
891*4882a593Smuzhiyun 	if (len <= 0)
892*4882a593Smuzhiyun 		return 0;
893*4882a593Smuzhiyun 
894*4882a593Smuzhiyun 	tbuf = kmalloc(len, GFP_KERNEL);
895*4882a593Smuzhiyun 	if (!tbuf)
896*4882a593Smuzhiyun 		return 0;
897*4882a593Smuzhiyun 
898*4882a593Smuzhiyun 	err = ds_read_block(dev, tbuf, len);
899*4882a593Smuzhiyun 	if (err >= 0)
900*4882a593Smuzhiyun 		memcpy(buf, tbuf, len);
901*4882a593Smuzhiyun 
902*4882a593Smuzhiyun 	kfree(tbuf);
903*4882a593Smuzhiyun 
904*4882a593Smuzhiyun 	return err >= 0 ? len : 0;
905*4882a593Smuzhiyun }
906*4882a593Smuzhiyun 
ds9490r_reset(void * data)907*4882a593Smuzhiyun static u8 ds9490r_reset(void *data)
908*4882a593Smuzhiyun {
909*4882a593Smuzhiyun 	struct ds_device *dev = data;
910*4882a593Smuzhiyun 	int err;
911*4882a593Smuzhiyun 
912*4882a593Smuzhiyun 	err = ds_reset(dev);
913*4882a593Smuzhiyun 	if (err)
914*4882a593Smuzhiyun 		return 1;
915*4882a593Smuzhiyun 
916*4882a593Smuzhiyun 	return 0;
917*4882a593Smuzhiyun }
918*4882a593Smuzhiyun 
ds9490r_set_pullup(void * data,int delay)919*4882a593Smuzhiyun static u8 ds9490r_set_pullup(void *data, int delay)
920*4882a593Smuzhiyun {
921*4882a593Smuzhiyun 	struct ds_device *dev = data;
922*4882a593Smuzhiyun 
923*4882a593Smuzhiyun 	if (ds_set_pullup(dev, delay))
924*4882a593Smuzhiyun 		return 1;
925*4882a593Smuzhiyun 
926*4882a593Smuzhiyun 	return 0;
927*4882a593Smuzhiyun }
928*4882a593Smuzhiyun 
ds_w1_init(struct ds_device * dev)929*4882a593Smuzhiyun static int ds_w1_init(struct ds_device *dev)
930*4882a593Smuzhiyun {
931*4882a593Smuzhiyun 	memset(&dev->master, 0, sizeof(struct w1_bus_master));
932*4882a593Smuzhiyun 
933*4882a593Smuzhiyun 	/* Reset the device as it can be in a bad state.
934*4882a593Smuzhiyun 	 * This is necessary because a block write will wait for data
935*4882a593Smuzhiyun 	 * to be placed in the output buffer and block any later
936*4882a593Smuzhiyun 	 * commands which will keep accumulating and the device will
937*4882a593Smuzhiyun 	 * not be idle.  Another case is removing the ds2490 module
938*4882a593Smuzhiyun 	 * while a bus search is in progress, somehow a few commands
939*4882a593Smuzhiyun 	 * get through, but the input transfers fail leaving data in
940*4882a593Smuzhiyun 	 * the input buffer.  This will cause the next read to fail
941*4882a593Smuzhiyun 	 * see the note in ds_recv_data.
942*4882a593Smuzhiyun 	 */
943*4882a593Smuzhiyun 	ds_reset_device(dev);
944*4882a593Smuzhiyun 
945*4882a593Smuzhiyun 	dev->master.data	= dev;
946*4882a593Smuzhiyun 	dev->master.touch_bit	= &ds9490r_touch_bit;
947*4882a593Smuzhiyun 	/* read_bit and write_bit in w1_bus_master are expected to set and
948*4882a593Smuzhiyun 	 * sample the line level.  For write_bit that means it is expected to
949*4882a593Smuzhiyun 	 * set it to that value and leave it there.  ds2490 only supports an
950*4882a593Smuzhiyun 	 * individual time slot at the lowest level.  The requirement from
951*4882a593Smuzhiyun 	 * pulling the bus state down to reading the state is 15us, something
952*4882a593Smuzhiyun 	 * that isn't realistic on the USB bus anyway.
953*4882a593Smuzhiyun 	dev->master.read_bit	= &ds9490r_read_bit;
954*4882a593Smuzhiyun 	dev->master.write_bit	= &ds9490r_write_bit;
955*4882a593Smuzhiyun 	*/
956*4882a593Smuzhiyun 	dev->master.read_byte	= &ds9490r_read_byte;
957*4882a593Smuzhiyun 	dev->master.write_byte	= &ds9490r_write_byte;
958*4882a593Smuzhiyun 	dev->master.read_block	= &ds9490r_read_block;
959*4882a593Smuzhiyun 	dev->master.write_block	= &ds9490r_write_block;
960*4882a593Smuzhiyun 	dev->master.reset_bus	= &ds9490r_reset;
961*4882a593Smuzhiyun 	dev->master.set_pullup	= &ds9490r_set_pullup;
962*4882a593Smuzhiyun 	dev->master.search	= &ds9490r_search;
963*4882a593Smuzhiyun 
964*4882a593Smuzhiyun 	return w1_add_master_device(&dev->master);
965*4882a593Smuzhiyun }
966*4882a593Smuzhiyun 
ds_w1_fini(struct ds_device * dev)967*4882a593Smuzhiyun static void ds_w1_fini(struct ds_device *dev)
968*4882a593Smuzhiyun {
969*4882a593Smuzhiyun 	w1_remove_master_device(&dev->master);
970*4882a593Smuzhiyun }
971*4882a593Smuzhiyun 
ds_probe(struct usb_interface * intf,const struct usb_device_id * udev_id)972*4882a593Smuzhiyun static int ds_probe(struct usb_interface *intf,
973*4882a593Smuzhiyun 		    const struct usb_device_id *udev_id)
974*4882a593Smuzhiyun {
975*4882a593Smuzhiyun 	struct usb_device *udev = interface_to_usbdev(intf);
976*4882a593Smuzhiyun 	struct usb_endpoint_descriptor *endpoint;
977*4882a593Smuzhiyun 	struct usb_host_interface *iface_desc;
978*4882a593Smuzhiyun 	struct ds_device *dev;
979*4882a593Smuzhiyun 	int i, err, alt;
980*4882a593Smuzhiyun 
981*4882a593Smuzhiyun 	dev = kzalloc(sizeof(struct ds_device), GFP_KERNEL);
982*4882a593Smuzhiyun 	if (!dev) {
983*4882a593Smuzhiyun 		pr_info("Failed to allocate new DS9490R structure.\n");
984*4882a593Smuzhiyun 		return -ENOMEM;
985*4882a593Smuzhiyun 	}
986*4882a593Smuzhiyun 	dev->udev = usb_get_dev(udev);
987*4882a593Smuzhiyun 	if (!dev->udev) {
988*4882a593Smuzhiyun 		err = -ENOMEM;
989*4882a593Smuzhiyun 		goto err_out_free;
990*4882a593Smuzhiyun 	}
991*4882a593Smuzhiyun 	memset(dev->ep, 0, sizeof(dev->ep));
992*4882a593Smuzhiyun 
993*4882a593Smuzhiyun 	usb_set_intfdata(intf, dev);
994*4882a593Smuzhiyun 
995*4882a593Smuzhiyun 	err = usb_reset_configuration(dev->udev);
996*4882a593Smuzhiyun 	if (err) {
997*4882a593Smuzhiyun 		dev_err(&dev->udev->dev,
998*4882a593Smuzhiyun 			"Failed to reset configuration: err=%d.\n", err);
999*4882a593Smuzhiyun 		goto err_out_clear;
1000*4882a593Smuzhiyun 	}
1001*4882a593Smuzhiyun 
1002*4882a593Smuzhiyun 	/* alternative 3, 1ms interrupt (greatly speeds search), 64 byte bulk */
1003*4882a593Smuzhiyun 	alt = 3;
1004*4882a593Smuzhiyun 	err = usb_set_interface(dev->udev,
1005*4882a593Smuzhiyun 		intf->cur_altsetting->desc.bInterfaceNumber, alt);
1006*4882a593Smuzhiyun 	if (err) {
1007*4882a593Smuzhiyun 		dev_err(&dev->udev->dev, "Failed to set alternative setting %d "
1008*4882a593Smuzhiyun 			"for %d interface: err=%d.\n", alt,
1009*4882a593Smuzhiyun 			intf->cur_altsetting->desc.bInterfaceNumber, err);
1010*4882a593Smuzhiyun 		goto err_out_clear;
1011*4882a593Smuzhiyun 	}
1012*4882a593Smuzhiyun 
1013*4882a593Smuzhiyun 	iface_desc = intf->cur_altsetting;
1014*4882a593Smuzhiyun 	if (iface_desc->desc.bNumEndpoints != NUM_EP-1) {
1015*4882a593Smuzhiyun 		pr_info("Num endpoints=%d. It is not DS9490R.\n",
1016*4882a593Smuzhiyun 			iface_desc->desc.bNumEndpoints);
1017*4882a593Smuzhiyun 		err = -EINVAL;
1018*4882a593Smuzhiyun 		goto err_out_clear;
1019*4882a593Smuzhiyun 	}
1020*4882a593Smuzhiyun 
1021*4882a593Smuzhiyun 	/*
1022*4882a593Smuzhiyun 	 * This loop doesn'd show control 0 endpoint,
1023*4882a593Smuzhiyun 	 * so we will fill only 1-3 endpoints entry.
1024*4882a593Smuzhiyun 	 */
1025*4882a593Smuzhiyun 	for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
1026*4882a593Smuzhiyun 		endpoint = &iface_desc->endpoint[i].desc;
1027*4882a593Smuzhiyun 
1028*4882a593Smuzhiyun 		dev->ep[i+1] = endpoint->bEndpointAddress;
1029*4882a593Smuzhiyun #if 0
1030*4882a593Smuzhiyun 		printk("%d: addr=%x, size=%d, dir=%s, type=%x\n",
1031*4882a593Smuzhiyun 			i, endpoint->bEndpointAddress, le16_to_cpu(endpoint->wMaxPacketSize),
1032*4882a593Smuzhiyun 			(endpoint->bEndpointAddress & USB_DIR_IN)?"IN":"OUT",
1033*4882a593Smuzhiyun 			endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK);
1034*4882a593Smuzhiyun #endif
1035*4882a593Smuzhiyun 	}
1036*4882a593Smuzhiyun 
1037*4882a593Smuzhiyun 	err = ds_w1_init(dev);
1038*4882a593Smuzhiyun 	if (err)
1039*4882a593Smuzhiyun 		goto err_out_clear;
1040*4882a593Smuzhiyun 
1041*4882a593Smuzhiyun 	mutex_lock(&ds_mutex);
1042*4882a593Smuzhiyun 	list_add_tail(&dev->ds_entry, &ds_devices);
1043*4882a593Smuzhiyun 	mutex_unlock(&ds_mutex);
1044*4882a593Smuzhiyun 
1045*4882a593Smuzhiyun 	return 0;
1046*4882a593Smuzhiyun 
1047*4882a593Smuzhiyun err_out_clear:
1048*4882a593Smuzhiyun 	usb_set_intfdata(intf, NULL);
1049*4882a593Smuzhiyun 	usb_put_dev(dev->udev);
1050*4882a593Smuzhiyun err_out_free:
1051*4882a593Smuzhiyun 	kfree(dev);
1052*4882a593Smuzhiyun 	return err;
1053*4882a593Smuzhiyun }
1054*4882a593Smuzhiyun 
ds_disconnect(struct usb_interface * intf)1055*4882a593Smuzhiyun static void ds_disconnect(struct usb_interface *intf)
1056*4882a593Smuzhiyun {
1057*4882a593Smuzhiyun 	struct ds_device *dev;
1058*4882a593Smuzhiyun 
1059*4882a593Smuzhiyun 	dev = usb_get_intfdata(intf);
1060*4882a593Smuzhiyun 	if (!dev)
1061*4882a593Smuzhiyun 		return;
1062*4882a593Smuzhiyun 
1063*4882a593Smuzhiyun 	mutex_lock(&ds_mutex);
1064*4882a593Smuzhiyun 	list_del(&dev->ds_entry);
1065*4882a593Smuzhiyun 	mutex_unlock(&ds_mutex);
1066*4882a593Smuzhiyun 
1067*4882a593Smuzhiyun 	ds_w1_fini(dev);
1068*4882a593Smuzhiyun 
1069*4882a593Smuzhiyun 	usb_set_intfdata(intf, NULL);
1070*4882a593Smuzhiyun 
1071*4882a593Smuzhiyun 	usb_put_dev(dev->udev);
1072*4882a593Smuzhiyun 	kfree(dev);
1073*4882a593Smuzhiyun }
1074*4882a593Smuzhiyun 
1075*4882a593Smuzhiyun static const struct usb_device_id ds_id_table[] = {
1076*4882a593Smuzhiyun 	{ USB_DEVICE(0x04fa, 0x2490) },
1077*4882a593Smuzhiyun 	{ },
1078*4882a593Smuzhiyun };
1079*4882a593Smuzhiyun MODULE_DEVICE_TABLE(usb, ds_id_table);
1080*4882a593Smuzhiyun 
1081*4882a593Smuzhiyun static struct usb_driver ds_driver = {
1082*4882a593Smuzhiyun 	.name =		"DS9490R",
1083*4882a593Smuzhiyun 	.probe =	ds_probe,
1084*4882a593Smuzhiyun 	.disconnect =	ds_disconnect,
1085*4882a593Smuzhiyun 	.id_table =	ds_id_table,
1086*4882a593Smuzhiyun };
1087*4882a593Smuzhiyun module_usb_driver(ds_driver);
1088*4882a593Smuzhiyun 
1089*4882a593Smuzhiyun MODULE_AUTHOR("Evgeniy Polyakov <zbr@ioremap.net>");
1090*4882a593Smuzhiyun MODULE_DESCRIPTION("DS2490 USB <-> W1 bus master driver (DS9490*)");
1091*4882a593Smuzhiyun MODULE_LICENSE("GPL");
1092