aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/w1/masters/ds2490.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/w1/masters/ds2490.c')
-rw-r--r--drivers/w1/masters/ds2490.c76
1 files changed, 38 insertions, 38 deletions
diff --git a/drivers/w1/masters/ds2490.c b/drivers/w1/masters/ds2490.c
index c8365fb20b4f..6b188e8008e4 100644
--- a/drivers/w1/masters/ds2490.c
+++ b/drivers/w1/masters/ds2490.c
@@ -98,11 +98,6 @@
98#define BRANCH_MAIN 0xCC 98#define BRANCH_MAIN 0xCC
99#define BRANCH_AUX 0x33 99#define BRANCH_AUX 0x33
100 100
101/*
102 * Duration of the strong pull-up pulse in milliseconds.
103 */
104#define PULLUP_PULSE_DURATION 750
105
106/* Status flags */ 101/* Status flags */
107#define ST_SPUA 0x01 /* Strong Pull-up is active */ 102#define ST_SPUA 0x01 /* Strong Pull-up is active */
108#define ST_PRGA 0x02 /* 12V programming pulse is being generated */ 103#define ST_PRGA 0x02 /* 12V programming pulse is being generated */
@@ -131,6 +126,11 @@ struct ds_device
131 126
132 int ep[NUM_EP]; 127 int ep[NUM_EP];
133 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; 134 struct w1_bus_master master;
135}; 135};
136 136
@@ -192,7 +192,7 @@ static int ds_send_control_cmd(struct ds_device *dev, u16 value, u16 index)
192 192
193 return err; 193 return err;
194} 194}
195#if 0 195
196static int ds_send_control_mode(struct ds_device *dev, u16 value, u16 index) 196static int ds_send_control_mode(struct ds_device *dev, u16 value, u16 index)
197{ 197{
198 int err; 198 int err;
@@ -207,7 +207,7 @@ static int ds_send_control_mode(struct ds_device *dev, u16 value, u16 index)
207 207
208 return err; 208 return err;
209} 209}
210#endif 210
211static int ds_send_control(struct ds_device *dev, u16 value, u16 index) 211static int ds_send_control(struct ds_device *dev, u16 value, u16 index)
212{ 212{
213 int err; 213 int err;
@@ -294,14 +294,6 @@ static int ds_recv_status(struct ds_device *dev, struct ds_status *st)
294 if (count < 0) 294 if (count < 0)
295 return err; 295 return err;
296 } 296 }
297#if 0
298 if (st->status & ST_IDLE) {
299 printk(KERN_INFO "Resetting pulse after ST_IDLE.\n");
300 err = ds_start_pulse(dev, PULLUP_PULSE_DURATION);
301 if (err)
302 return err;
303 }
304#endif
305 297
306 return err; 298 return err;
307} 299}
@@ -472,32 +464,26 @@ static int ds_set_speed(struct ds_device *dev, int speed)
472} 464}
473#endif /* 0 */ 465#endif /* 0 */
474 466
475static int ds_start_pulse(struct ds_device *dev, int delay) 467static int ds_set_pullup(struct ds_device *dev, int delay)
476{ 468{
477 int err; 469 int err;
478 u8 del = 1 + (u8)(delay >> 4); 470 u8 del = 1 + (u8)(delay >> 4);
479 struct ds_status st;
480
481#if 0
482 err = ds_stop_pulse(dev, 10);
483 if (err)
484 return err;
485
486 err = ds_send_control_mode(dev, MOD_PULSE_EN, PULSE_SPUE);
487 if (err)
488 return err;
489#endif
490 err = ds_send_control(dev, COMM_SET_DURATION | COMM_IM, del);
491 if (err)
492 return err;
493 471
494 err = ds_send_control(dev, COMM_PULSE | COMM_IM | COMM_F, 0); 472 dev->spu_sleep = 0;
473 err = ds_send_control_mode(dev, MOD_PULSE_EN, delay ? PULSE_SPUE : 0);
495 if (err) 474 if (err)
496 return err; 475 return err;
497 476
498 mdelay(delay); 477 if (delay) {
478 err = ds_send_control(dev, COMM_SET_DURATION | COMM_IM, del);
479 if (err)
480 return err;
499 481
500 ds_wait_status(dev, &st); 482 /* Just storing delay would not get the trunication and
483 * roundup.
484 */
485 dev->spu_sleep = del<<4;
486 }
501 487
502 return err; 488 return err;
503} 489}
@@ -558,6 +544,9 @@ static int ds_write_byte(struct ds_device *dev, u8 byte)
558 if (err) 544 if (err)
559 return err; 545 return err;
560 546
547 if (dev->spu_sleep)
548 msleep(dev->spu_sleep);
549
561 err = ds_wait_status(dev, &st); 550 err = ds_wait_status(dev, &st);
562 if (err) 551 if (err)
563 return err; 552 return err;
@@ -566,8 +555,6 @@ static int ds_write_byte(struct ds_device *dev, u8 byte)
566 if (err < 0) 555 if (err < 0)
567 return err; 556 return err;
568 557
569 ds_start_pulse(dev, PULLUP_PULSE_DURATION);
570
571 return !(byte == rbyte); 558 return !(byte == rbyte);
572} 559}
573 560
@@ -603,7 +590,7 @@ static int ds_read_block(struct ds_device *dev, u8 *buf, int len)
603 if (err < 0) 590 if (err < 0)
604 return err; 591 return err;
605 592
606 err = ds_send_control(dev, COMM_BLOCK_IO | COMM_IM | COMM_SPU, len); 593 err = ds_send_control(dev, COMM_BLOCK_IO | COMM_IM, len);
607 if (err) 594 if (err)
608 return err; 595 return err;
609 596
@@ -630,14 +617,15 @@ static int ds_write_block(struct ds_device *dev, u8 *buf, int len)
630 if (err) 617 if (err)
631 return err; 618 return err;
632 619
620 if (dev->spu_sleep)
621 msleep(dev->spu_sleep);
622
633 ds_wait_status(dev, &st); 623 ds_wait_status(dev, &st);
634 624
635 err = ds_recv_data(dev, buf, len); 625 err = ds_recv_data(dev, buf, len);
636 if (err < 0) 626 if (err < 0)
637 return err; 627 return err;
638 628
639 ds_start_pulse(dev, PULLUP_PULSE_DURATION);
640
641 return !(err == len); 629 return !(err == len);
642} 630}
643 631
@@ -803,6 +791,16 @@ static u8 ds9490r_reset(void *data)
803 return 0; 791 return 0;
804} 792}
805 793
794static u8 ds9490r_set_pullup(void *data, int delay)
795{
796 struct ds_device *dev = data;
797
798 if (ds_set_pullup(dev, delay))
799 return 1;
800
801 return 0;
802}
803
806static int ds_w1_init(struct ds_device *dev) 804static int ds_w1_init(struct ds_device *dev)
807{ 805{
808 memset(&dev->master, 0, sizeof(struct w1_bus_master)); 806 memset(&dev->master, 0, sizeof(struct w1_bus_master));
@@ -816,6 +814,7 @@ static int ds_w1_init(struct ds_device *dev)
816 dev->master.read_block = &ds9490r_read_block; 814 dev->master.read_block = &ds9490r_read_block;
817 dev->master.write_block = &ds9490r_write_block; 815 dev->master.write_block = &ds9490r_write_block;
818 dev->master.reset_bus = &ds9490r_reset; 816 dev->master.reset_bus = &ds9490r_reset;
817 dev->master.set_pullup = &ds9490r_set_pullup;
819 818
820 return w1_add_master_device(&dev->master); 819 return w1_add_master_device(&dev->master);
821} 820}
@@ -839,6 +838,7 @@ static int ds_probe(struct usb_interface *intf,
839 printk(KERN_INFO "Failed to allocate new DS9490R structure.\n"); 838 printk(KERN_INFO "Failed to allocate new DS9490R structure.\n");
840 return -ENOMEM; 839 return -ENOMEM;
841 } 840 }
841 dev->spu_sleep = 0;
842 dev->udev = usb_get_dev(udev); 842 dev->udev = usb_get_dev(udev);
843 if (!dev->udev) { 843 if (!dev->udev) {
844 err = -ENOMEM; 844 err = -ENOMEM;