W1: ds2490.c simplify and fix ds_touch_bit
[safe/jmp/linux-2.6] / drivers / w1 / masters / ds2490.c
1 /*
2  *      dscore.c
3  *
4  * Copyright (c) 2004 Evgeniy Polyakov <johnpol@2ka.mipt.ru>
5  *
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20  */
21
22 #include <linux/module.h>
23 #include <linux/kernel.h>
24 #include <linux/mod_devicetable.h>
25 #include <linux/usb.h>
26
27 #include "../w1_int.h"
28 #include "../w1.h"
29
30 /* COMMAND TYPE CODES */
31 #define CONTROL_CMD                     0x00
32 #define COMM_CMD                        0x01
33 #define MODE_CMD                        0x02
34
35 /* CONTROL COMMAND CODES */
36 #define CTL_RESET_DEVICE                0x0000
37 #define CTL_START_EXE                   0x0001
38 #define CTL_RESUME_EXE                  0x0002
39 #define CTL_HALT_EXE_IDLE               0x0003
40 #define CTL_HALT_EXE_DONE               0x0004
41 #define CTL_FLUSH_COMM_CMDS             0x0007
42 #define CTL_FLUSH_RCV_BUFFER            0x0008
43 #define CTL_FLUSH_XMT_BUFFER            0x0009
44 #define CTL_GET_COMM_CMDS               0x000A
45
46 /* MODE COMMAND CODES */
47 #define MOD_PULSE_EN                    0x0000
48 #define MOD_SPEED_CHANGE_EN             0x0001
49 #define MOD_1WIRE_SPEED                 0x0002
50 #define MOD_STRONG_PU_DURATION          0x0003
51 #define MOD_PULLDOWN_SLEWRATE           0x0004
52 #define MOD_PROG_PULSE_DURATION         0x0005
53 #define MOD_WRITE1_LOWTIME              0x0006
54 #define MOD_DSOW0_TREC                  0x0007
55
56 /* COMMUNICATION COMMAND CODES */
57 #define COMM_ERROR_ESCAPE               0x0601
58 #define COMM_SET_DURATION               0x0012
59 #define COMM_BIT_IO                     0x0020
60 #define COMM_PULSE                      0x0030
61 #define COMM_1_WIRE_RESET               0x0042
62 #define COMM_BYTE_IO                    0x0052
63 #define COMM_MATCH_ACCESS               0x0064
64 #define COMM_BLOCK_IO                   0x0074
65 #define COMM_READ_STRAIGHT              0x0080
66 #define COMM_DO_RELEASE                 0x6092
67 #define COMM_SET_PATH                   0x00A2
68 #define COMM_WRITE_SRAM_PAGE            0x00B2
69 #define COMM_WRITE_EPROM                0x00C4
70 #define COMM_READ_CRC_PROT_PAGE         0x00D4
71 #define COMM_READ_REDIRECT_PAGE_CRC     0x21E4
72 #define COMM_SEARCH_ACCESS              0x00F4
73
74 /* Communication command bits */
75 #define COMM_TYPE                       0x0008
76 #define COMM_SE                         0x0008
77 #define COMM_D                          0x0008
78 #define COMM_Z                          0x0008
79 #define COMM_CH                         0x0008
80 #define COMM_SM                         0x0008
81 #define COMM_R                          0x0008
82 #define COMM_IM                         0x0001
83
84 #define COMM_PS                         0x4000
85 #define COMM_PST                        0x4000
86 #define COMM_CIB                        0x4000
87 #define COMM_RTS                        0x4000
88 #define COMM_DT                         0x2000
89 #define COMM_SPU                        0x1000
90 #define COMM_F                          0x0800
91 #define COMM_NTP                        0x0400
92 #define COMM_ICP                        0x0200
93 #define COMM_RST                        0x0100
94
95 #define PULSE_PROG                      0x01
96 #define PULSE_SPUE                      0x02
97
98 #define BRANCH_MAIN                     0xCC
99 #define BRANCH_AUX                      0x33
100
101 /* Status flags */
102 #define ST_SPUA                         0x01  /* Strong Pull-up is active */
103 #define ST_PRGA                         0x02  /* 12V programming pulse is being generated */
104 #define ST_12VP                         0x04  /* external 12V programming voltage is present */
105 #define ST_PMOD                         0x08  /* DS2490 powered from USB and external sources */
106 #define ST_HALT                         0x10  /* DS2490 is currently halted */
107 #define ST_IDLE                         0x20  /* DS2490 is currently idle */
108 #define ST_EPOF                         0x80
109
110 #define SPEED_NORMAL                    0x00
111 #define SPEED_FLEXIBLE                  0x01
112 #define SPEED_OVERDRIVE                 0x02
113
114 #define NUM_EP                          4
115 #define EP_CONTROL                      0
116 #define EP_STATUS                       1
117 #define EP_DATA_OUT                     2
118 #define EP_DATA_IN                      3
119
120 struct ds_device
121 {
122         struct list_head        ds_entry;
123
124         struct usb_device       *udev;
125         struct usb_interface    *intf;
126
127         int                     ep[NUM_EP];
128
129         /* Strong PullUp
130          * 0: pullup not active, else duration in milliseconds
131          */
132         int                     spu_sleep;
133
134         struct w1_bus_master    master;
135 };
136
137 struct ds_status
138 {
139         u8                      enable;
140         u8                      speed;
141         u8                      pullup_dur;
142         u8                      ppuls_dur;
143         u8                      pulldown_slew;
144         u8                      write1_time;
145         u8                      write0_time;
146         u8                      reserved0;
147         u8                      status;
148         u8                      command0;
149         u8                      command1;
150         u8                      command_buffer_status;
151         u8                      data_out_buffer_status;
152         u8                      data_in_buffer_status;
153         u8                      reserved1;
154         u8                      reserved2;
155
156 };
157
158 static struct usb_device_id ds_id_table [] = {
159         { USB_DEVICE(0x04fa, 0x2490) },
160         { },
161 };
162 MODULE_DEVICE_TABLE(usb, ds_id_table);
163
164 static int ds_probe(struct usb_interface *, const struct usb_device_id *);
165 static void ds_disconnect(struct usb_interface *);
166
167 static inline void ds_dump_status(unsigned char *, unsigned char *, int);
168 static int ds_send_control(struct ds_device *, u16, u16);
169 static int ds_send_control_cmd(struct ds_device *, u16, u16);
170
171 static LIST_HEAD(ds_devices);
172 static DEFINE_MUTEX(ds_mutex);
173
174 static struct usb_driver ds_driver = {
175         .name =         "DS9490R",
176         .probe =        ds_probe,
177         .disconnect =   ds_disconnect,
178         .id_table =     ds_id_table,
179 };
180
181 static int ds_send_control_cmd(struct ds_device *dev, u16 value, u16 index)
182 {
183         int err;
184
185         err = usb_control_msg(dev->udev, usb_sndctrlpipe(dev->udev, dev->ep[EP_CONTROL]),
186                         CONTROL_CMD, 0x40, value, index, NULL, 0, 1000);
187         if (err < 0) {
188                 printk(KERN_ERR "Failed to send command control message %x.%x: err=%d.\n",
189                                 value, index, err);
190                 return err;
191         }
192
193         return err;
194 }
195
196 static int ds_send_control_mode(struct ds_device *dev, u16 value, u16 index)
197 {
198         int err;
199
200         err = usb_control_msg(dev->udev, usb_sndctrlpipe(dev->udev, dev->ep[EP_CONTROL]),
201                         MODE_CMD, 0x40, value, index, NULL, 0, 1000);
202         if (err < 0) {
203                 printk(KERN_ERR "Failed to send mode control message %x.%x: err=%d.\n",
204                                 value, index, err);
205                 return err;
206         }
207
208         return err;
209 }
210
211 static int ds_send_control(struct ds_device *dev, u16 value, u16 index)
212 {
213         int err;
214
215         err = usb_control_msg(dev->udev, usb_sndctrlpipe(dev->udev, dev->ep[EP_CONTROL]),
216                         COMM_CMD, 0x40, value, index, NULL, 0, 1000);
217         if (err < 0) {
218                 printk(KERN_ERR "Failed to send control message %x.%x: err=%d.\n",
219                                 value, index, err);
220                 return err;
221         }
222
223         return err;
224 }
225
226 static inline void ds_dump_status(unsigned char *buf, unsigned char *str, int off)
227 {
228         printk("%45s: %8x\n", str, buf[off]);
229 }
230
231 static int ds_recv_status_nodump(struct ds_device *dev, struct ds_status *st,
232                                  unsigned char *buf, int size)
233 {
234         int count, err;
235
236         memset(st, 0, sizeof(*st));
237
238         count = 0;
239         err = usb_bulk_msg(dev->udev, usb_rcvbulkpipe(dev->udev, dev->ep[EP_STATUS]), buf, size, &count, 100);
240         if (err < 0) {
241                 printk(KERN_ERR "Failed to read 1-wire data from 0x%x: err=%d.\n", dev->ep[EP_STATUS], err);
242                 return err;
243         }
244
245         if (count >= sizeof(*st))
246                 memcpy(st, buf, sizeof(*st));
247
248         return count;
249 }
250
251 static int ds_recv_status(struct ds_device *dev, struct ds_status *st)
252 {
253         unsigned char buf[64];
254         int count, err = 0, i;
255
256         memcpy(st, buf, sizeof(*st));
257
258         count = ds_recv_status_nodump(dev, st, buf, sizeof(buf));
259         if (count < 0)
260                 return err;
261
262         printk("0x%x: count=%d, status: ", dev->ep[EP_STATUS], count);
263         for (i=0; i<count; ++i)
264                 printk("%02x ", buf[i]);
265         printk("\n");
266
267         if (count >= 16) {
268                 ds_dump_status(buf, "enable flag", 0);
269                 ds_dump_status(buf, "1-wire speed", 1);
270                 ds_dump_status(buf, "strong pullup duration", 2);
271                 ds_dump_status(buf, "programming pulse duration", 3);
272                 ds_dump_status(buf, "pulldown slew rate control", 4);
273                 ds_dump_status(buf, "write-1 low time", 5);
274                 ds_dump_status(buf, "data sample offset/write-0 recovery time", 6);
275                 ds_dump_status(buf, "reserved (test register)", 7);
276                 ds_dump_status(buf, "device status flags", 8);
277                 ds_dump_status(buf, "communication command byte 1", 9);
278                 ds_dump_status(buf, "communication command byte 2", 10);
279                 ds_dump_status(buf, "communication command buffer status", 11);
280                 ds_dump_status(buf, "1-wire data output buffer status", 12);
281                 ds_dump_status(buf, "1-wire data input buffer status", 13);
282                 ds_dump_status(buf, "reserved", 14);
283                 ds_dump_status(buf, "reserved", 15);
284         }
285
286         memcpy(st, buf, sizeof(*st));
287
288         if (st->status & ST_EPOF) {
289                 printk(KERN_INFO "Resetting device after ST_EPOF.\n");
290                 err = ds_send_control_cmd(dev, CTL_RESET_DEVICE, 0);
291                 if (err)
292                         return err;
293                 count = ds_recv_status_nodump(dev, st, buf, sizeof(buf));
294                 if (count < 0)
295                         return err;
296         }
297
298         return err;
299 }
300
301 static int ds_recv_data(struct ds_device *dev, unsigned char *buf, int size)
302 {
303         int count, err;
304         struct ds_status st;
305
306         count = 0;
307         err = usb_bulk_msg(dev->udev, usb_rcvbulkpipe(dev->udev, dev->ep[EP_DATA_IN]),
308                                 buf, size, &count, 1000);
309         if (err < 0) {
310                 printk(KERN_INFO "Clearing ep0x%x.\n", dev->ep[EP_DATA_IN]);
311                 usb_clear_halt(dev->udev, usb_rcvbulkpipe(dev->udev, dev->ep[EP_DATA_IN]));
312                 ds_recv_status(dev, &st);
313                 return err;
314         }
315
316 #if 0
317         {
318                 int i;
319
320                 printk("%s: count=%d: ", __func__, count);
321                 for (i=0; i<count; ++i)
322                         printk("%02x ", buf[i]);
323                 printk("\n");
324         }
325 #endif
326         return count;
327 }
328
329 static int ds_send_data(struct ds_device *dev, unsigned char *buf, int len)
330 {
331         int count, err;
332
333         count = 0;
334         err = usb_bulk_msg(dev->udev, usb_sndbulkpipe(dev->udev, dev->ep[EP_DATA_OUT]), buf, len, &count, 1000);
335         if (err < 0) {
336                 printk(KERN_ERR "Failed to write 1-wire data to ep0x%x: "
337                         "err=%d.\n", dev->ep[EP_DATA_OUT], err);
338                 return err;
339         }
340
341         return err;
342 }
343
344 #if 0
345
346 int ds_stop_pulse(struct ds_device *dev, int limit)
347 {
348         struct ds_status st;
349         int count = 0, err = 0;
350         u8 buf[0x20];
351
352         do {
353                 err = ds_send_control(dev, CTL_HALT_EXE_IDLE, 0);
354                 if (err)
355                         break;
356                 err = ds_send_control(dev, CTL_RESUME_EXE, 0);
357                 if (err)
358                         break;
359                 err = ds_recv_status_nodump(dev, &st, buf, sizeof(buf));
360                 if (err)
361                         break;
362
363                 if ((st.status & ST_SPUA) == 0) {
364                         err = ds_send_control_mode(dev, MOD_PULSE_EN, 0);
365                         if (err)
366                                 break;
367                 }
368         } while(++count < limit);
369
370         return err;
371 }
372
373 int ds_detect(struct ds_device *dev, struct ds_status *st)
374 {
375         int err;
376
377         err = ds_send_control_cmd(dev, CTL_RESET_DEVICE, 0);
378         if (err)
379                 return err;
380
381         err = ds_send_control(dev, COMM_SET_DURATION | COMM_IM, 0);
382         if (err)
383                 return err;
384
385         err = ds_send_control(dev, COMM_SET_DURATION | COMM_IM | COMM_TYPE, 0x40);
386         if (err)
387                 return err;
388
389         err = ds_send_control_mode(dev, MOD_PULSE_EN, PULSE_PROG);
390         if (err)
391                 return err;
392
393         err = ds_recv_status(dev, st);
394
395         return err;
396 }
397
398 #endif  /*  0  */
399
400 static int ds_wait_status(struct ds_device *dev, struct ds_status *st)
401 {
402         u8 buf[0x20];
403         int err, count = 0;
404
405         do {
406                 err = ds_recv_status_nodump(dev, st, buf, sizeof(buf));
407 #if 0
408                 if (err >= 0) {
409                         int i;
410                         printk("0x%x: count=%d, status: ", dev->ep[EP_STATUS], err);
411                         for (i=0; i<err; ++i)
412                                 printk("%02x ", buf[i]);
413                         printk("\n");
414                 }
415 #endif
416         } while(!(buf[0x08] & 0x20) && !(err < 0) && ++count < 100);
417
418
419         if (((err > 16) && (buf[0x10] & 0x01)) || count >= 100 || err < 0) {
420                 ds_recv_status(dev, st);
421                 return -1;
422         } else
423                 return 0;
424 }
425
426 static int ds_reset(struct ds_device *dev, struct ds_status *st)
427 {
428         int err;
429
430         //err = ds_send_control(dev, COMM_1_WIRE_RESET | COMM_F | COMM_IM | COMM_SE, SPEED_FLEXIBLE);
431         err = ds_send_control(dev, 0x43, SPEED_NORMAL);
432         if (err)
433                 return err;
434
435         ds_wait_status(dev, st);
436 #if 0
437         if (st->command_buffer_status) {
438                 printk(KERN_INFO "Short circuit.\n");
439                 return -EIO;
440         }
441 #endif
442
443         return 0;
444 }
445
446 #if 0
447 static int ds_set_speed(struct ds_device *dev, int speed)
448 {
449         int err;
450
451         if (speed != SPEED_NORMAL && speed != SPEED_FLEXIBLE && speed != SPEED_OVERDRIVE)
452                 return -EINVAL;
453
454         if (speed != SPEED_OVERDRIVE)
455                 speed = SPEED_FLEXIBLE;
456
457         speed &= 0xff;
458
459         err = ds_send_control_mode(dev, MOD_1WIRE_SPEED, speed);
460         if (err)
461                 return err;
462
463         return err;
464 }
465 #endif  /*  0  */
466
467 static int ds_set_pullup(struct ds_device *dev, int delay)
468 {
469         int err;
470         u8 del = 1 + (u8)(delay >> 4);
471
472         dev->spu_sleep = 0;
473         err = ds_send_control_mode(dev, MOD_PULSE_EN, delay ? PULSE_SPUE : 0);
474         if (err)
475                 return err;
476
477         if (delay) {
478                 err = ds_send_control(dev, COMM_SET_DURATION | COMM_IM, del);
479                 if (err)
480                         return err;
481
482                 /* Just storing delay would not get the trunication and
483                  * roundup.
484                  */
485                 dev->spu_sleep = del<<4;
486         }
487
488         return err;
489 }
490
491 static int ds_touch_bit(struct ds_device *dev, u8 bit, u8 *tbit)
492 {
493         int err;
494         struct ds_status st;
495
496         err = ds_send_control(dev, COMM_BIT_IO | COMM_IM | (bit ? COMM_D : 0),
497                 0);
498         if (err)
499                 return err;
500
501         ds_wait_status(dev, &st);
502
503         err = ds_recv_data(dev, tbit, sizeof(*tbit));
504         if (err < 0)
505                 return err;
506
507         return 0;
508 }
509
510 #if 0
511 static int ds_write_bit(struct ds_device *dev, u8 bit)
512 {
513         int err;
514         struct ds_status st;
515
516         /* Set COMM_ICP to write without a readback.  Note, this will
517          * produce one time slot, a down followed by an up with COMM_D
518          * only determing the timing.
519          */
520         err = ds_send_control(dev, COMM_BIT_IO | COMM_IM | COMM_ICP |
521                 (bit ? COMM_D : 0), 0);
522         if (err)
523                 return err;
524
525         ds_wait_status(dev, &st);
526
527         return 0;
528 }
529 #endif
530
531 static int ds_write_byte(struct ds_device *dev, u8 byte)
532 {
533         int err;
534         struct ds_status st;
535         u8 rbyte;
536
537         err = ds_send_control(dev, COMM_BYTE_IO | COMM_IM | COMM_SPU, byte);
538         if (err)
539                 return err;
540
541         if (dev->spu_sleep)
542                 msleep(dev->spu_sleep);
543
544         err = ds_wait_status(dev, &st);
545         if (err)
546                 return err;
547
548         err = ds_recv_data(dev, &rbyte, sizeof(rbyte));
549         if (err < 0)
550                 return err;
551
552         return !(byte == rbyte);
553 }
554
555 static int ds_read_byte(struct ds_device *dev, u8 *byte)
556 {
557         int err;
558         struct ds_status st;
559
560         err = ds_send_control(dev, COMM_BYTE_IO | COMM_IM , 0xff);
561         if (err)
562                 return err;
563
564         ds_wait_status(dev, &st);
565
566         err = ds_recv_data(dev, byte, sizeof(*byte));
567         if (err < 0)
568                 return err;
569
570         return 0;
571 }
572
573 static int ds_read_block(struct ds_device *dev, u8 *buf, int len)
574 {
575         struct ds_status st;
576         int err;
577
578         if (len > 64*1024)
579                 return -E2BIG;
580
581         memset(buf, 0xFF, len);
582
583         err = ds_send_data(dev, buf, len);
584         if (err < 0)
585                 return err;
586
587         err = ds_send_control(dev, COMM_BLOCK_IO | COMM_IM, len);
588         if (err)
589                 return err;
590
591         ds_wait_status(dev, &st);
592
593         memset(buf, 0x00, len);
594         err = ds_recv_data(dev, buf, len);
595
596         return err;
597 }
598
599 static int ds_write_block(struct ds_device *dev, u8 *buf, int len)
600 {
601         int err;
602         struct ds_status st;
603
604         err = ds_send_data(dev, buf, len);
605         if (err < 0)
606                 return err;
607
608         ds_wait_status(dev, &st);
609
610         err = ds_send_control(dev, COMM_BLOCK_IO | COMM_IM | COMM_SPU, len);
611         if (err)
612                 return err;
613
614         if (dev->spu_sleep)
615                 msleep(dev->spu_sleep);
616
617         ds_wait_status(dev, &st);
618
619         err = ds_recv_data(dev, buf, len);
620         if (err < 0)
621                 return err;
622
623         return !(err == len);
624 }
625
626 #if 0
627
628 static int ds_search(struct ds_device *dev, u64 init, u64 *buf, u8 id_number, int conditional_search)
629 {
630         int err;
631         u16 value, index;
632         struct ds_status st;
633
634         memset(buf, 0, sizeof(buf));
635
636         err = ds_send_data(ds_dev, (unsigned char *)&init, 8);
637         if (err)
638                 return err;
639
640         ds_wait_status(ds_dev, &st);
641
642         value = COMM_SEARCH_ACCESS | COMM_IM | COMM_SM | COMM_F | COMM_RTS;
643         index = (conditional_search ? 0xEC : 0xF0) | (id_number << 8);
644         err = ds_send_control(ds_dev, value, index);
645         if (err)
646                 return err;
647
648         ds_wait_status(ds_dev, &st);
649
650         err = ds_recv_data(ds_dev, (unsigned char *)buf, 8*id_number);
651         if (err < 0)
652                 return err;
653
654         return err/8;
655 }
656
657 static int ds_match_access(struct ds_device *dev, u64 init)
658 {
659         int err;
660         struct ds_status st;
661
662         err = ds_send_data(dev, (unsigned char *)&init, sizeof(init));
663         if (err)
664                 return err;
665
666         ds_wait_status(dev, &st);
667
668         err = ds_send_control(dev, COMM_MATCH_ACCESS | COMM_IM | COMM_RST, 0x0055);
669         if (err)
670                 return err;
671
672         ds_wait_status(dev, &st);
673
674         return 0;
675 }
676
677 static int ds_set_path(struct ds_device *dev, u64 init)
678 {
679         int err;
680         struct ds_status st;
681         u8 buf[9];
682
683         memcpy(buf, &init, 8);
684         buf[8] = BRANCH_MAIN;
685
686         err = ds_send_data(dev, buf, sizeof(buf));
687         if (err)
688                 return err;
689
690         ds_wait_status(dev, &st);
691
692         err = ds_send_control(dev, COMM_SET_PATH | COMM_IM | COMM_RST, 0);
693         if (err)
694                 return err;
695
696         ds_wait_status(dev, &st);
697
698         return 0;
699 }
700
701 #endif  /*  0  */
702
703 static u8 ds9490r_touch_bit(void *data, u8 bit)
704 {
705         u8 ret;
706         struct ds_device *dev = data;
707
708         if (ds_touch_bit(dev, bit, &ret))
709                 return 0;
710
711         return ret;
712 }
713
714 #if 0
715 static void ds9490r_write_bit(void *data, u8 bit)
716 {
717         struct ds_device *dev = data;
718
719         ds_write_bit(dev, bit);
720 }
721
722 static u8 ds9490r_read_bit(void *data)
723 {
724         struct ds_device *dev = data;
725         int err;
726         u8 bit = 0;
727
728         err = ds_touch_bit(dev, 1, &bit);
729         if (err)
730                 return 0;
731
732         return bit & 1;
733 }
734 #endif
735
736 static void ds9490r_write_byte(void *data, u8 byte)
737 {
738         struct ds_device *dev = data;
739
740         ds_write_byte(dev, byte);
741 }
742
743 static u8 ds9490r_read_byte(void *data)
744 {
745         struct ds_device *dev = data;
746         int err;
747         u8 byte = 0;
748
749         err = ds_read_byte(dev, &byte);
750         if (err)
751                 return 0;
752
753         return byte;
754 }
755
756 static void ds9490r_write_block(void *data, const u8 *buf, int len)
757 {
758         struct ds_device *dev = data;
759
760         ds_write_block(dev, (u8 *)buf, len);
761 }
762
763 static u8 ds9490r_read_block(void *data, u8 *buf, int len)
764 {
765         struct ds_device *dev = data;
766         int err;
767
768         err = ds_read_block(dev, buf, len);
769         if (err < 0)
770                 return 0;
771
772         return len;
773 }
774
775 static u8 ds9490r_reset(void *data)
776 {
777         struct ds_device *dev = data;
778         struct ds_status st;
779         int err;
780
781         memset(&st, 0, sizeof(st));
782
783         err = ds_reset(dev, &st);
784         if (err)
785                 return 1;
786
787         return 0;
788 }
789
790 static u8 ds9490r_set_pullup(void *data, int delay)
791 {
792         struct ds_device *dev = data;
793
794         if (ds_set_pullup(dev, delay))
795                 return 1;
796
797         return 0;
798 }
799
800 static int ds_w1_init(struct ds_device *dev)
801 {
802         memset(&dev->master, 0, sizeof(struct w1_bus_master));
803
804         dev->master.data        = dev;
805         dev->master.touch_bit   = &ds9490r_touch_bit;
806         /* read_bit and write_bit in w1_bus_master are expected to set and
807          * sample the line level.  For write_bit that means it is expected to
808          * set it to that value and leave it there.  ds2490 only supports an
809          * individual time slot at the lowest level.  The requirement from
810          * pulling the bus state down to reading the state is 15us, something
811          * that isn't realistic on the USB bus anyway.
812         dev->master.read_bit    = &ds9490r_read_bit;
813         dev->master.write_bit   = &ds9490r_write_bit;
814         */
815         dev->master.read_byte   = &ds9490r_read_byte;
816         dev->master.write_byte  = &ds9490r_write_byte;
817         dev->master.read_block  = &ds9490r_read_block;
818         dev->master.write_block = &ds9490r_write_block;
819         dev->master.reset_bus   = &ds9490r_reset;
820         dev->master.set_pullup  = &ds9490r_set_pullup;
821
822         return w1_add_master_device(&dev->master);
823 }
824
825 static void ds_w1_fini(struct ds_device *dev)
826 {
827         w1_remove_master_device(&dev->master);
828 }
829
830 static int ds_probe(struct usb_interface *intf,
831                     const struct usb_device_id *udev_id)
832 {
833         struct usb_device *udev = interface_to_usbdev(intf);
834         struct usb_endpoint_descriptor *endpoint;
835         struct usb_host_interface *iface_desc;
836         struct ds_device *dev;
837         int i, err;
838
839         dev = kmalloc(sizeof(struct ds_device), GFP_KERNEL);
840         if (!dev) {
841                 printk(KERN_INFO "Failed to allocate new DS9490R structure.\n");
842                 return -ENOMEM;
843         }
844         dev->spu_sleep = 0;
845         dev->udev = usb_get_dev(udev);
846         if (!dev->udev) {
847                 err = -ENOMEM;
848                 goto err_out_free;
849         }
850         memset(dev->ep, 0, sizeof(dev->ep));
851
852         usb_set_intfdata(intf, dev);
853
854         err = usb_set_interface(dev->udev, intf->altsetting[0].desc.bInterfaceNumber, 3);
855         if (err) {
856                 printk(KERN_ERR "Failed to set alternative setting 3 for %d interface: err=%d.\n",
857                                 intf->altsetting[0].desc.bInterfaceNumber, err);
858                 goto err_out_clear;
859         }
860
861         err = usb_reset_configuration(dev->udev);
862         if (err) {
863                 printk(KERN_ERR "Failed to reset configuration: err=%d.\n", err);
864                 goto err_out_clear;
865         }
866
867         iface_desc = &intf->altsetting[0];
868         if (iface_desc->desc.bNumEndpoints != NUM_EP-1) {
869                 printk(KERN_INFO "Num endpoints=%d. It is not DS9490R.\n", iface_desc->desc.bNumEndpoints);
870                 err = -EINVAL;
871                 goto err_out_clear;
872         }
873
874         /*
875          * This loop doesn'd show control 0 endpoint,
876          * so we will fill only 1-3 endpoints entry.
877          */
878         for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
879                 endpoint = &iface_desc->endpoint[i].desc;
880
881                 dev->ep[i+1] = endpoint->bEndpointAddress;
882 #if 0
883                 printk("%d: addr=%x, size=%d, dir=%s, type=%x\n",
884                         i, endpoint->bEndpointAddress, le16_to_cpu(endpoint->wMaxPacketSize),
885                         (endpoint->bEndpointAddress & USB_DIR_IN)?"IN":"OUT",
886                         endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK);
887 #endif
888         }
889
890         err = ds_w1_init(dev);
891         if (err)
892                 goto err_out_clear;
893
894         mutex_lock(&ds_mutex);
895         list_add_tail(&dev->ds_entry, &ds_devices);
896         mutex_unlock(&ds_mutex);
897
898         return 0;
899
900 err_out_clear:
901         usb_set_intfdata(intf, NULL);
902         usb_put_dev(dev->udev);
903 err_out_free:
904         kfree(dev);
905         return err;
906 }
907
908 static void ds_disconnect(struct usb_interface *intf)
909 {
910         struct ds_device *dev;
911
912         dev = usb_get_intfdata(intf);
913         if (!dev)
914                 return;
915
916         mutex_lock(&ds_mutex);
917         list_del(&dev->ds_entry);
918         mutex_unlock(&ds_mutex);
919
920         ds_w1_fini(dev);
921
922         usb_set_intfdata(intf, NULL);
923
924         usb_put_dev(dev->udev);
925         kfree(dev);
926 }
927
928 static int ds_init(void)
929 {
930         int err;
931
932         err = usb_register(&ds_driver);
933         if (err) {
934                 printk(KERN_INFO "Failed to register DS9490R USB device: err=%d.\n", err);
935                 return err;
936         }
937
938         return 0;
939 }
940
941 static void ds_fini(void)
942 {
943         usb_deregister(&ds_driver);
944 }
945
946 module_init(ds_init);
947 module_exit(ds_fini);
948
949 MODULE_LICENSE("GPL");
950 MODULE_AUTHOR("Evgeniy Polyakov <johnpol@2ka.mipt.ru>");
951 MODULE_DESCRIPTION("DS2490 USB <-> W1 bus master driver (DS9490*)");