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