All of lore.kernel.org
 help / color / mirror / Atom feed
From: David Fries <david@fries.net>
To: linux-kernel@vger.kernel.org
Cc: Evgeniy Polyakov <johnpol@2ka.mipt.ru>
Subject: [PATCH 24/35] W1: ds2490.c add support for strong pullup
Date: Fri, 28 Mar 2008 07:27:10 -0500	[thread overview]
Message-ID: <20080328122710.GY3613@spacedout.fries.net> (raw)
In-Reply-To: <200803272343.m2RNhDac017650@SpacedOut.fries.net>

[-- Attachment #1: Type: text/plain, Size: 6067 bytes --]

ds2490.c had ds_start_pulse, but I think I decided that the pulse
wasn't being enabled, as the strong pullup wasn't enabled.  If it was
working it was being called some time after every byte or block was
written.  It should have been enabled in the write command instead of
some time later to benefit any device needing it.

ds_start_pulse was also calling mdelay(750), which would effectively
lock up the computer for 3/4 of a second four times per temperature
conversion.  This was immediately noticable just typing at a virtual
terminal.

The new set_pullup will only enable the strong pullup when requested,
which is expected to be the only write operation that will benefit
from a strong pullup.  Now msleep will be used for delays, resulting
in the reads and writes taking minimal system overhead.

ds2490.c 1.3
Add set_pullup.

ds2490.c 1.4
Enable existing ds_send_control to send the control command enable
strong pullup.

ds2490.c 1.6
Remove strong pullup enable bit when reading a byte.

ds2490.c 1.7
Add spu_sleep to avoid pulling the device status for the duration of
the strong pullup.

ds2490.c 1.17
Remove PULLUP_PULSE_DURATION macro, it is the delay used for a
temperature conversion which shouldn't be in the master driver anyway.

Signed-off-by: David Fries <david@fries.net>
---
 drivers/w1/masters/ds2490.c |   76 +++++++++++++++++++++---------------------
 1 files changed, 38 insertions(+), 38 deletions(-)

diff --git a/drivers/w1/masters/ds2490.c b/drivers/w1/masters/ds2490.c
index 67a7f42..ac27f89 100644
--- a/drivers/w1/masters/ds2490.c
+++ b/drivers/w1/masters/ds2490.c
@@ -98,11 +98,6 @@
 #define BRANCH_MAIN			0xCC
 #define BRANCH_AUX			0x33
 
-/*
- * Duration of the strong pull-up pulse in milliseconds.
- */
-#define PULLUP_PULSE_DURATION		750
-
 /* Status flags */
 #define ST_SPUA				0x01  /* Strong Pull-up is active */
 #define ST_PRGA				0x02  /* 12V programming pulse is being generated */
@@ -131,6 +126,11 @@ struct ds_device
 
 	int			ep[NUM_EP];
 
+	/* Strong PullUp
+	 * 0: pullup not active, else duration in milliseconds
+	 */
+	int			spu_sleep;
+
 	struct w1_bus_master	master;
 };
 
@@ -192,7 +192,7 @@ static int ds_send_control_cmd(struct ds_device *dev, u16 value, u16 index)
 
 	return err;
 }
-#if 0
+
 static int ds_send_control_mode(struct ds_device *dev, u16 value, u16 index)
 {
 	int err;
@@ -207,7 +207,7 @@ static int ds_send_control_mode(struct ds_device *dev, u16 value, u16 index)
 
 	return err;
 }
-#endif
+
 static int ds_send_control(struct ds_device *dev, u16 value, u16 index)
 {
 	int err;
@@ -294,14 +294,6 @@ static int ds_recv_status(struct ds_device *dev, struct ds_status *st)
 		if (count < 0)
 			return err;
 	}
-#if 0
-	if (st->status & ST_IDLE) {
-		printk(KERN_INFO "Resetting pulse after ST_IDLE.\n");
-		err = ds_start_pulse(dev, PULLUP_PULSE_DURATION);
-		if (err)
-			return err;
-	}
-#endif
 
 	return err;
 }
@@ -472,32 +464,26 @@ static int ds_set_speed(struct ds_device *dev, int speed)
 }
 #endif  /*  0  */
 
-static int ds_start_pulse(struct ds_device *dev, int delay)
+static int ds_set_pullup(struct ds_device *dev, int delay)
 {
 	int err;
 	u8 del = 1 + (u8)(delay >> 4);
-	struct ds_status st;
-
-#if 0
-	err = ds_stop_pulse(dev, 10);
-	if (err)
-		return err;
-
-	err = ds_send_control_mode(dev, MOD_PULSE_EN, PULSE_SPUE);
-	if (err)
-		return err;
-#endif
-	err = ds_send_control(dev, COMM_SET_DURATION | COMM_IM, del);
-	if (err)
-		return err;
 
-	err = ds_send_control(dev, COMM_PULSE | COMM_IM | COMM_F, 0);
+	dev->spu_sleep = 0;
+	err = ds_send_control_mode(dev, MOD_PULSE_EN, delay?PULSE_SPUE:0);
 	if (err)
 		return err;
 
-	mdelay(delay);
+	if(delay) {
+		err = ds_send_control(dev, COMM_SET_DURATION | COMM_IM, del);
+		if (err)
+			return err;
 
-	ds_wait_status(dev, &st);
+		/* Just storing delay would not get the trunication and
+		 * roundup.
+		 */
+		dev->spu_sleep = del<<4;
+	}
 
 	return err;
 }
@@ -558,6 +544,9 @@ static int ds_write_byte(struct ds_device *dev, u8 byte)
 	if (err)
 		return err;
 
+	if(dev->spu_sleep)
+		msleep(dev->spu_sleep);
+
 	err = ds_wait_status(dev, &st);
 	if (err)
 		return err;
@@ -566,8 +555,6 @@ static int ds_write_byte(struct ds_device *dev, u8 byte)
 	if (err < 0)
 		return err;
 
-	ds_start_pulse(dev, PULLUP_PULSE_DURATION);
-
 	return !(byte == rbyte);
 }
 
@@ -603,7 +590,7 @@ static int ds_read_block(struct ds_device *dev, u8 *buf, int len)
 	if (err < 0)
 		return err;
 
-	err = ds_send_control(dev, COMM_BLOCK_IO | COMM_IM | COMM_SPU, len);
+	err = ds_send_control(dev, COMM_BLOCK_IO | COMM_IM, len);
 	if (err)
 		return err;
 
@@ -630,14 +617,15 @@ static int ds_write_block(struct ds_device *dev, u8 *buf, int len)
 	if (err)
 		return err;
 
+	if(dev->spu_sleep)
+		msleep(dev->spu_sleep);
+
 	ds_wait_status(dev, &st);
 
 	err = ds_recv_data(dev, buf, len);
 	if (err < 0)
 		return err;
 
-	ds_start_pulse(dev, PULLUP_PULSE_DURATION);
-
 	return !(err == len);
 }
 
@@ -803,6 +791,16 @@ static u8 ds9490r_reset(void *data)
 	return 0;
 }
 
+static u8 ds9490r_set_pullup(void *data, int delay)
+{
+	struct ds_device *dev = data;
+
+	if (ds_set_pullup(dev, delay))
+		return 1;
+
+	return 0;
+}
+
 static int ds_w1_init(struct ds_device *dev)
 {
 	memset(&dev->master, 0, sizeof(struct w1_bus_master));
@@ -816,6 +814,7 @@ static int ds_w1_init(struct ds_device *dev)
 	dev->master.read_block	= &ds9490r_read_block;
 	dev->master.write_block	= &ds9490r_write_block;
 	dev->master.reset_bus	= &ds9490r_reset;
+	dev->master.set_pullup	= &ds9490r_set_pullup;
 
 	return w1_add_master_device(&dev->master);
 }
@@ -839,6 +838,7 @@ static int ds_probe(struct usb_interface *intf,
 		printk(KERN_INFO "Failed to allocate new DS9490R structure.\n");
 		return -ENOMEM;
 	}
+	dev->spu_sleep=0;
 	dev->udev = usb_get_dev(udev);
 	if (!dev->udev) {
 		err = -ENOMEM;
-- 
1.4.4.4

[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]

  parent reply	other threads:[~2008-03-28 12:56 UTC|newest]

Thread overview: 48+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <200803272343.m2RNhDac017650@SpacedOut.fries.net>
2008-03-28 12:23 ` [PATCH 1/35] W1: fix deadlocks and remove w1_control_thread David Fries
2008-03-28 12:24 ` [PATCH 2/35] W1: abort search early on on exit David Fries
2008-03-28 12:24 ` [PATCH 3/35] W1: don't delay search start David Fries
2008-03-28 12:24 ` [PATCH 4/35] W1: w1_process, allow wakeup in sleep David Fries
2008-03-28 12:24 ` [PATCH 5/35] W1: w1_process, remove W1_MASTER_NEED_EXIT, it is redundant David Fries
2008-03-28 12:24 ` [PATCH 6/35] W1: w1_process, block when there's nothing to do David Fries
2008-03-30 11:28   ` Evgeniy Polyakov
2008-03-28 12:25 ` [PATCH 7/35] W1: feature, enable hardware strong pullup David Fries
2008-03-30 11:31   ` Evgeniy Polyakov
2008-03-28 12:25 ` [PATCH 8/35] W1: feature, w1_therm.c use " David Fries
2008-03-30 11:30   ` Evgeniy Polyakov
2008-03-28 12:25 ` [PATCH 9/35] W1: create documentation for the w1_therm slave device David Fries
2008-03-30 11:32   ` Evgeniy Polyakov
2008-03-28 12:25 ` [PATCH 10/35] W1: be able to manually add and remove slaves David Fries
2008-03-30 11:33   ` Evgeniy Polyakov
2008-03-28 12:25 ` [PATCH 11/35] W1: recode w1_slave_found logic David Fries
2008-03-28 12:25 ` [PATCH 12/35] W1: new module parameter search_count David Fries
2008-03-28 12:25 ` [PATCH 13/35] W1: Document add, remove, and search_count David Fries
2008-03-30 11:33   ` Evgeniy Polyakov
2008-03-28 12:25 ` [PATCH 14/35] W1: w1_slave_read_id multiple short read bug David Fries
2008-03-28 12:26 ` [PATCH 15/35] W1: w1_slave_read_id from bin_attribute to device_attribute David Fries
2008-03-28 12:26 ` [PATCH 16/35] W1: w1_therm fix user buffer overflow and cat David Fries
2008-03-30 11:34   ` Evgeniy Polyakov
2008-03-28 12:26 ` [PATCH 17/35] W1: w1_family, remove unused variable need_exit David Fries
2008-03-28 12:26 ` [PATCH 18/35] W1: w1_therm consistent mutex access code cleanup David Fries
2008-03-28 12:26 ` [PATCH 19/35] W1: w1_int.c use first available master number David Fries
2008-03-28 12:26 ` [PATCH 20/35] W1: w1.c s/printk/dev_dbg/ David Fries
2008-03-30 11:35   ` Evgeniy Polyakov
2008-03-28 12:26 ` [PATCH 21/35] W1: w1_io.c reset comments and msleep David Fries
2008-03-30 11:36   ` Evgeniy Polyakov
2008-03-28 12:27 ` [PATCH 22/35] W1: ds1wm.c msleep for reset David Fries
2008-03-30 11:38   ` Evgeniy Polyakov
2008-03-30 13:43     ` David Fries
2008-03-28 12:27 ` [PATCH 23/35] W1: ds2490.c correct print message David Fries
2008-03-28 12:27 ` David Fries [this message]
2008-03-28 12:27 ` [PATCH 25/35] W1: ds2490.c fix grouping error in ds_write_bit David Fries
2008-03-28 12:27 ` [PATCH 26/35] W1: ds2490.c ds_write_bit disable readback David Fries
2008-03-28 12:27 ` [PATCH 27/35] W1: ds2490.c disable bit read and write David Fries
2008-03-28 12:27 ` [PATCH 28/35] W1: ds2490.c simplify and fix ds_touch_bit David Fries
2008-03-28 12:27 ` [PATCH 29/35] W1: ds2490.c ds_dump_status rework David Fries
2008-03-28 12:27 ` [PATCH 30/35] W1: ds2490.c ds_reset remove ds_wait_status David Fries
2008-03-28 12:27 ` [PATCH 31/35] W1: ds2490.c reset ds2490 in init David Fries
2008-03-28 12:27 ` [PATCH 32/35] W1: ds2490.c magic number work David Fries
2008-03-28 12:27 ` [PATCH 33/35] W1: ds2490.c ds_write_block remove extra ds_wait_status David Fries
2008-03-28 12:27 ` [PATCH 34/35] W1: Documentation/w1/masters/ds2490 update David Fries
2008-03-30 11:43   ` Evgeniy Polyakov
2008-04-13 23:09     ` David Fries
2008-03-28 12:28 ` [PATCH 35/35] W1: ds2490.c optimize ds_set_pullup David Fries

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20080328122710.GY3613@spacedout.fries.net \
    --to=david@fries.net \
    --cc=johnpol@2ka.mipt.ru \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.