Linux IIO development
 help / color / mirror / Atom feed
* [PATCH 1/3] IIO: DAC: AD5446: Add missing ID table entries
@ 2011-03-10 11:52 michael.hennerich
  2011-03-10 11:52 ` [PATCH 2/3] IIO: DAC: AD5446: Add power down support michael.hennerich
                   ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: michael.hennerich @ 2011-03-10 11:52 UTC (permalink / raw)
  To: jic23; +Cc: linux-iio, drivers, device-drivers-devel, Michael Hennerich

From: Michael Hennerich <michael.hennerich@analog.com>


Signed-off-by: Michael Hennerich <michael.hennerich@analog.com>
---
 drivers/staging/iio/dac/ad5446.c |    4 +++-
 1 files changed, 3 insertions(+), 1 deletions(-)

diff --git a/drivers/staging/iio/dac/ad5446.c b/drivers/staging/iio/dac/ad5446.c
index dcec297..4f1d881 100644
--- a/drivers/staging/iio/dac/ad5446.c
+++ b/drivers/staging/iio/dac/ad5446.c
@@ -295,8 +295,10 @@ static int ad5446_remove(struct spi_device *spi)
 static const struct spi_device_id ad5446_id[] = {
 	{"ad5444", ID_AD5444},
 	{"ad5446", ID_AD5446},
-	{"ad5542a", ID_AD5542A},
 	{"ad5512a", ID_AD5512A},
+	{"ad5542a", ID_AD5542A},
+	{"ad5543", ID_AD5543},
+	{"ad5553", ID_AD5553},
 	{"ad5620-2500", ID_AD5620_2500}, /* AD5620/40/60: */
 	{"ad5620-1250", ID_AD5620_1250}, /* part numbers may look differently */
 	{"ad5640-2500", ID_AD5640_2500},
-- 
1.6.0.2

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 2/3] IIO: DAC: AD5446: Add power down support
  2011-03-10 11:52 [PATCH 1/3] IIO: DAC: AD5446: Add missing ID table entries michael.hennerich
@ 2011-03-10 11:52 ` michael.hennerich
  2011-03-10 12:10   ` Jonathan Cameron
  2011-03-10 11:52 ` [PATCH 3/3] IIO: DAC: AD5446: Add support for AD5601/AD5611/AD5621 michael.hennerich
  2011-03-10 12:08 ` [PATCH 1/3] IIO: DAC: AD5446: Add missing ID table entries Jonathan Cameron
  2 siblings, 1 reply; 7+ messages in thread
From: michael.hennerich @ 2011-03-10 11:52 UTC (permalink / raw)
  To: jic23; +Cc: linux-iio, drivers, device-drivers-devel, Michael Hennerich

From: Michael Hennerich <michael.hennerich@analog.com>


Signed-off-by: Michael Hennerich <michael.hennerich@analog.com>
---
 drivers/staging/iio/dac/ad5446.c |  153 ++++++++++++++++++++++++++++++++++----
 drivers/staging/iio/dac/ad5446.h |   19 ++++-
 2 files changed, 153 insertions(+), 19 deletions(-)

diff --git a/drivers/staging/iio/dac/ad5446.c b/drivers/staging/iio/dac/ad5446.c
index 4f1d881..861a7ea 100644
--- a/drivers/staging/iio/dac/ad5446.c
+++ b/drivers/staging/iio/dac/ad5446.c
@@ -48,6 +48,20 @@ static void ad5660_store_sample(struct ad5446_state *st, unsigned val)
 	st->data.d24[2] = val & 0xFF;
 }
 
+static void ad5620_store_pwr_down(struct ad5446_state *st, unsigned mode)
+{
+	st->data.d16 = cpu_to_be16(mode << 14);
+}
+
+static void ad5660_store_pwr_down(struct ad5446_state *st, unsigned mode)
+{
+	unsigned val = mode << 16;
+
+	st->data.d24[0] = (val >> 16) & 0xFF;
+	st->data.d24[1] = (val >> 8) & 0xFF;
+	st->data.d24[2] = val & 0xFF;
+}
+
 static ssize_t ad5446_write(struct device *dev,
 		struct device_attribute *attr,
 		const char *buf,
@@ -68,6 +82,7 @@ static ssize_t ad5446_write(struct device *dev,
 	}
 
 	mutex_lock(&dev_info->mlock);
+	st->cached_val = val;
 	st->chip_info->store_sample(st, val);
 	ret = spi_sync(st->spi, &st->msg);
 	mutex_unlock(&dev_info->mlock);
@@ -102,15 +117,119 @@ static ssize_t ad5446_show_name(struct device *dev,
 }
 static IIO_DEVICE_ATTR(name, S_IRUGO, ad5446_show_name, NULL, 0);
 
+static ssize_t ad5446_write_powerdown_mode(struct device *dev,
+				       struct device_attribute *attr,
+				       const char *buf, size_t len)
+{
+	struct iio_dev *dev_info = dev_get_drvdata(dev);
+	struct ad5446_state *st = dev_info->dev_data;
+
+	if (sysfs_streq(buf, "1kohm_to_gnd"))
+		st->pwr_down_mode = MODE_PWRDWN_1k;
+	else if (sysfs_streq(buf, "100kohm_to_gnd"))
+		st->pwr_down_mode = MODE_PWRDWN_100k;
+	else if (sysfs_streq(buf, "three_state"))
+		st->pwr_down_mode = MODE_PWRDWN_TRISTATE;
+	else
+		return -EINVAL;
+
+	return len;
+}
+
+static ssize_t ad5446_read_powerdown_mode(struct device *dev,
+				      struct device_attribute *attr, char *buf)
+{
+	struct iio_dev *dev_info = dev_get_drvdata(dev);
+	struct ad5446_state *st = dev_info->dev_data;
+
+	char mode[][15] = {"", "1kohm_to_gnd", "100kohm_to_gnd", "three_state"};
+
+	return sprintf(buf, "%s\n", mode[st->pwr_down_mode]);
+}
+
+static ssize_t ad5446_read_dac_powerdown(struct device *dev,
+					   struct device_attribute *attr,
+					   char *buf)
+{
+	struct iio_dev *dev_info = dev_get_drvdata(dev);
+	struct ad5446_state *st = dev_info->dev_data;
+
+	return sprintf(buf, "%d\n", st->pwr_down);
+}
+
+static ssize_t ad5446_write_dac_powerdown(struct device *dev,
+					    struct device_attribute *attr,
+					    const char *buf, size_t len)
+{
+	struct iio_dev *dev_info = dev_get_drvdata(dev);
+	struct ad5446_state *st = dev_info->dev_data;
+	unsigned long readin;
+	int ret;
+
+	ret = strict_strtol(buf, 10, &readin);
+	if (ret)
+		return ret;
+
+	if (readin > 1)
+		ret = -EINVAL;
+
+	mutex_lock(&dev_info->mlock);
+	st->pwr_down = readin;
+
+	if (st->pwr_down)
+		st->chip_info->store_pwr_down(st, st->pwr_down_mode);
+	else
+		st->chip_info->store_sample(st, st->cached_val);
+
+	ret = spi_sync(st->spi, &st->msg);
+	mutex_unlock(&dev_info->mlock);
+
+	return ret ? ret : len;
+}
+
+static IIO_DEVICE_ATTR(out_powerdown_mode, S_IRUGO | S_IWUSR,
+			ad5446_read_powerdown_mode,
+			ad5446_write_powerdown_mode, 0);
+
+static IIO_CONST_ATTR(out_powerdown_mode_available,
+			"1kohm_to_gnd 100kohm_to_gnd three_state");
+
+static IIO_DEVICE_ATTR(out0_powerdown, S_IRUGO | S_IWUSR,
+			ad5446_read_dac_powerdown,
+			ad5446_write_dac_powerdown, 0);
+
 static struct attribute *ad5446_attributes[] = {
 	&iio_dev_attr_out0_raw.dev_attr.attr,
 	&iio_dev_attr_out_scale.dev_attr.attr,
+	&iio_dev_attr_out0_powerdown.dev_attr.attr,
+	&iio_dev_attr_out_powerdown_mode.dev_attr.attr,
+	&iio_const_attr_out_powerdown_mode_available.dev_attr.attr,
 	&iio_dev_attr_name.dev_attr.attr,
 	NULL,
 };
 
+static mode_t ad5446_attr_is_visible(struct kobject *kobj,
+				     struct attribute *attr, int n)
+{
+	struct device *dev = container_of(kobj, struct device, kobj);
+	struct iio_dev *dev_info = dev_get_drvdata(dev);
+	struct ad5446_state *st = iio_dev_get_devdata(dev_info);
+
+	mode_t mode = attr->mode;
+
+	if (!st->chip_info->store_pwr_down &&
+		(attr == &iio_dev_attr_out0_powerdown.dev_attr.attr ||
+		attr == &iio_dev_attr_out_powerdown_mode.dev_attr.attr ||
+		attr ==
+		&iio_const_attr_out_powerdown_mode_available.dev_attr.attr))
+		mode = 0;
+
+	return mode;
+}
+
 static const struct attribute_group ad5446_attribute_group = {
 	.attrs = ad5446_attributes,
+	.is_visible = ad5446_attr_is_visible,
 };
 
 static const struct ad5446_chip_info ad5446_chip_info_tbl[] = {
@@ -156,6 +275,7 @@ static const struct ad5446_chip_info ad5446_chip_info_tbl[] = {
 		.left_shift = 2,
 		.int_vref_mv = 2500,
 		.store_sample = ad5620_store_sample,
+		.store_pwr_down = ad5620_store_pwr_down,
 	},
 	[ID_AD5620_1250] = {
 		.bits = 12,
@@ -163,6 +283,7 @@ static const struct ad5446_chip_info ad5446_chip_info_tbl[] = {
 		.left_shift = 2,
 		.int_vref_mv = 1250,
 		.store_sample = ad5620_store_sample,
+		.store_pwr_down = ad5620_store_pwr_down,
 	},
 	[ID_AD5640_2500] = {
 		.bits = 14,
@@ -170,6 +291,7 @@ static const struct ad5446_chip_info ad5446_chip_info_tbl[] = {
 		.left_shift = 0,
 		.int_vref_mv = 2500,
 		.store_sample = ad5620_store_sample,
+		.store_pwr_down = ad5620_store_pwr_down,
 	},
 	[ID_AD5640_1250] = {
 		.bits = 14,
@@ -177,6 +299,7 @@ static const struct ad5446_chip_info ad5446_chip_info_tbl[] = {
 		.left_shift = 0,
 		.int_vref_mv = 1250,
 		.store_sample = ad5620_store_sample,
+		.store_pwr_down = ad5620_store_pwr_down,
 	},
 	[ID_AD5660_2500] = {
 		.bits = 16,
@@ -184,6 +307,7 @@ static const struct ad5446_chip_info ad5446_chip_info_tbl[] = {
 		.left_shift = 0,
 		.int_vref_mv = 2500,
 		.store_sample = ad5660_store_sample,
+		.store_pwr_down = ad5660_store_pwr_down,
 	},
 	[ID_AD5660_1250] = {
 		.bits = 16,
@@ -191,6 +315,7 @@ static const struct ad5446_chip_info ad5446_chip_info_tbl[] = {
 		.left_shift = 0,
 		.int_vref_mv = 1250,
 		.store_sample = ad5660_store_sample,
+		.store_pwr_down = ad5660_store_pwr_down,
 	},
 };
 
@@ -243,20 +368,20 @@ static int __devinit ad5446_probe(struct spi_device *spi)
 	spi_message_add_tail(&st->xfer, &st->msg);
 
 	switch (spi_get_device_id(spi)->driver_data) {
-		case ID_AD5620_2500:
-		case ID_AD5620_1250:
-		case ID_AD5640_2500:
-		case ID_AD5640_1250:
-		case ID_AD5660_2500:
-		case ID_AD5660_1250:
-			st->vref_mv = st->chip_info->int_vref_mv;
-			break;
-		default:
-			if (voltage_uv)
-				st->vref_mv = voltage_uv / 1000;
-			else
-				dev_warn(&spi->dev,
-					 "reference voltage unspecified\n");
+	case ID_AD5620_2500:
+	case ID_AD5620_1250:
+	case ID_AD5640_2500:
+	case ID_AD5640_1250:
+	case ID_AD5660_2500:
+	case ID_AD5660_1250:
+		st->vref_mv = st->chip_info->int_vref_mv;
+		break;
+	default:
+		if (voltage_uv)
+			st->vref_mv = voltage_uv / 1000;
+		else
+			dev_warn(&spi->dev,
+				 "reference voltage unspecified\n");
 	}
 
 	ret = iio_device_register(st->indio_dev);
diff --git a/drivers/staging/iio/dac/ad5446.h b/drivers/staging/iio/dac/ad5446.h
index 0cb9c14..e9397a6 100644
--- a/drivers/staging/iio/dac/ad5446.h
+++ b/drivers/staging/iio/dac/ad5446.h
@@ -27,6 +27,10 @@
 
 #define RES_MASK(bits)	((1 << (bits)) - 1)
 
+#define MODE_PWRDWN_1k		0x1
+#define MODE_PWRDWN_100k	0x2
+#define MODE_PWRDWN_TRISTATE	0x3
+
 /**
  * struct ad5446_state - driver instance specific data
  * @indio_dev:		the industrial I/O device
@@ -47,6 +51,9 @@ struct ad5446_state {
 	struct regulator		*reg;
 	struct work_struct		poll_work;
 	unsigned short			vref_mv;
+	unsigned			cached_val;
+	unsigned			pwr_down_mode;
+	unsigned			pwr_down;
 	struct spi_transfer		xfer;
 	struct spi_message		msg;
 	union {
@@ -62,14 +69,16 @@ struct ad5446_state {
  * @left_shift:		number of bits the datum must be shifted
  * @int_vref_mv:	AD5620/40/60: the internal reference voltage
  * @store_sample:	chip specific helper function to store the datum
+ * @store_sample:	chip specific helper function to store the powerpown cmd
  */
 
 struct ad5446_chip_info {
-	u8				bits;
-	u8				storagebits;
-	u8				left_shift;
-	u16				int_vref_mv;
-	void (*store_sample)		(struct ad5446_state *st, unsigned val);
+	u8			bits;
+	u8			storagebits;
+	u8			left_shift;
+	u16			int_vref_mv;
+	void (*store_sample)	(struct ad5446_state *st, unsigned val);
+	void (*store_pwr_down)	(struct ad5446_state *st, unsigned mode);
 };
 
 /**
-- 
1.6.0.2

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 3/3] IIO: DAC: AD5446: Add support for AD5601/AD5611/AD5621
  2011-03-10 11:52 [PATCH 1/3] IIO: DAC: AD5446: Add missing ID table entries michael.hennerich
  2011-03-10 11:52 ` [PATCH 2/3] IIO: DAC: AD5446: Add power down support michael.hennerich
@ 2011-03-10 11:52 ` michael.hennerich
  2011-03-10 12:14   ` Jonathan Cameron
  2011-03-10 12:08 ` [PATCH 1/3] IIO: DAC: AD5446: Add missing ID table entries Jonathan Cameron
  2 siblings, 1 reply; 7+ messages in thread
From: michael.hennerich @ 2011-03-10 11:52 UTC (permalink / raw)
  To: jic23; +Cc: linux-iio, drivers, device-drivers-devel, Michael Hennerich

From: Michael Hennerich <michael.hennerich@analog.com>

This patch adds support for the AD5601/AD5611/AD5621 single channel,
8-/10-/12-bit, buffered voltage output DACs.

Signed-off-by: Michael Hennerich <michael.hennerich@analog.com>
---
 drivers/staging/iio/dac/Kconfig  |    3 ++-
 drivers/staging/iio/dac/ad5446.c |   24 ++++++++++++++++++++++++
 drivers/staging/iio/dac/ad5446.h |    3 +++
 3 files changed, 29 insertions(+), 1 deletions(-)

diff --git a/drivers/staging/iio/dac/Kconfig b/drivers/staging/iio/dac/Kconfig
index 3c72871..9539545 100644
--- a/drivers/staging/iio/dac/Kconfig
+++ b/drivers/staging/iio/dac/Kconfig
@@ -15,7 +15,8 @@ config AD5446
 	depends on SPI
 	help
 	  Say yes here to build support for Analog Devices AD5444, AD5446,
-	  AD5512A, AD5542A, AD5543, AD5553, AD5620, AD5640, AD5660 DACs.
+	  AD5512A, AD5542A, AD5543, AD5553, AD5601, AD5611, AD5621, AD5620,
+	  AD5640, AD5660 DACs.
 
 	  To compile this driver as a module, choose M here: the
 	  module will be called ad5446.
diff --git a/drivers/staging/iio/dac/ad5446.c b/drivers/staging/iio/dac/ad5446.c
index 861a7ea..8623a72 100644
--- a/drivers/staging/iio/dac/ad5446.c
+++ b/drivers/staging/iio/dac/ad5446.c
@@ -269,6 +269,27 @@ static const struct ad5446_chip_info ad5446_chip_info_tbl[] = {
 		.left_shift = 0,
 		.store_sample = ad5542_store_sample,
 	},
+	[ID_AD5601] = {
+		.bits = 8,
+		.storagebits = 16,
+		.left_shift = 6,
+		.store_sample = ad5542_store_sample,
+		.store_pwr_down = ad5620_store_pwr_down,
+	},
+	[ID_AD5611] = {
+		.bits = 10,
+		.storagebits = 16,
+		.left_shift = 4,
+		.store_sample = ad5542_store_sample,
+		.store_pwr_down = ad5620_store_pwr_down,
+	},
+	[ID_AD5621] = {
+		.bits = 12,
+		.storagebits = 16,
+		.left_shift = 2,
+		.store_sample = ad5542_store_sample,
+		.store_pwr_down = ad5620_store_pwr_down,
+	},
 	[ID_AD5620_2500] = {
 		.bits = 12,
 		.storagebits = 16,
@@ -424,6 +445,9 @@ static const struct spi_device_id ad5446_id[] = {
 	{"ad5542a", ID_AD5542A},
 	{"ad5543", ID_AD5543},
 	{"ad5553", ID_AD5553},
+	{"ad5601", ID_AD5601},
+	{"ad5611", ID_AD5611},
+	{"ad5621", ID_AD5621},
 	{"ad5620-2500", ID_AD5620_2500}, /* AD5620/40/60: */
 	{"ad5620-1250", ID_AD5620_1250}, /* part numbers may look differently */
 	{"ad5640-2500", ID_AD5640_2500},
diff --git a/drivers/staging/iio/dac/ad5446.h b/drivers/staging/iio/dac/ad5446.h
index e9397a6..7ac63ab 100644
--- a/drivers/staging/iio/dac/ad5446.h
+++ b/drivers/staging/iio/dac/ad5446.h
@@ -96,6 +96,9 @@ enum ad5446_supported_device_ids {
 	ID_AD5543,
 	ID_AD5512A,
 	ID_AD5553,
+	ID_AD5601,
+	ID_AD5611,
+	ID_AD5621,
 	ID_AD5620_2500,
 	ID_AD5620_1250,
 	ID_AD5640_2500,
-- 
1.6.0.2

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH 1/3] IIO: DAC: AD5446: Add missing ID table entries
  2011-03-10 11:52 [PATCH 1/3] IIO: DAC: AD5446: Add missing ID table entries michael.hennerich
  2011-03-10 11:52 ` [PATCH 2/3] IIO: DAC: AD5446: Add power down support michael.hennerich
  2011-03-10 11:52 ` [PATCH 3/3] IIO: DAC: AD5446: Add support for AD5601/AD5611/AD5621 michael.hennerich
@ 2011-03-10 12:08 ` Jonathan Cameron
  2 siblings, 0 replies; 7+ messages in thread
From: Jonathan Cameron @ 2011-03-10 12:08 UTC (permalink / raw)
  To: michael.hennerich; +Cc: linux-iio, drivers, device-drivers-devel

On 03/10/11 11:52, michael.hennerich@analog.com wrote:
> From: Michael Hennerich <michael.hennerich@analog.com>
> 
> 
> Signed-off-by: Michael Hennerich <michael.hennerich@analog.com>
Acked-by: Jonathan Cameron <jic23@cam.ac.uk>
> ---
>  drivers/staging/iio/dac/ad5446.c |    4 +++-
>  1 files changed, 3 insertions(+), 1 deletions(-)
> 
> diff --git a/drivers/staging/iio/dac/ad5446.c b/drivers/staging/iio/dac/ad5446.c
> index dcec297..4f1d881 100644
> --- a/drivers/staging/iio/dac/ad5446.c
> +++ b/drivers/staging/iio/dac/ad5446.c
> @@ -295,8 +295,10 @@ static int ad5446_remove(struct spi_device *spi)
>  static const struct spi_device_id ad5446_id[] = {
>  	{"ad5444", ID_AD5444},
>  	{"ad5446", ID_AD5446},
> -	{"ad5542a", ID_AD5542A},
>  	{"ad5512a", ID_AD5512A},
> +	{"ad5542a", ID_AD5542A},
> +	{"ad5543", ID_AD5543},
> +	{"ad5553", ID_AD5553},
>  	{"ad5620-2500", ID_AD5620_2500}, /* AD5620/40/60: */
>  	{"ad5620-1250", ID_AD5620_1250}, /* part numbers may look differently */
>  	{"ad5640-2500", ID_AD5640_2500},


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 2/3] IIO: DAC: AD5446: Add power down support
  2011-03-10 11:52 ` [PATCH 2/3] IIO: DAC: AD5446: Add power down support michael.hennerich
@ 2011-03-10 12:10   ` Jonathan Cameron
  0 siblings, 0 replies; 7+ messages in thread
From: Jonathan Cameron @ 2011-03-10 12:10 UTC (permalink / raw)
  To: michael.hennerich; +Cc: linux-iio, drivers, device-drivers-devel

On 03/10/11 11:52, michael.hennerich@analog.com wrote:
> From: Michael Hennerich <michael.hennerich@analog.com>
> 
> 
> Signed-off-by: Michael Hennerich <michael.hennerich@analog.com>
Acked-by: Jonathan Cameron <jic23@cam.ac.uk>
> ---
>  drivers/staging/iio/dac/ad5446.c |  153 ++++++++++++++++++++++++++++++++++----
>  drivers/staging/iio/dac/ad5446.h |   19 ++++-
>  2 files changed, 153 insertions(+), 19 deletions(-)
> 
> diff --git a/drivers/staging/iio/dac/ad5446.c b/drivers/staging/iio/dac/ad5446.c
> index 4f1d881..861a7ea 100644
> --- a/drivers/staging/iio/dac/ad5446.c
> +++ b/drivers/staging/iio/dac/ad5446.c
> @@ -48,6 +48,20 @@ static void ad5660_store_sample(struct ad5446_state *st, unsigned val)
>  	st->data.d24[2] = val & 0xFF;
>  }
>  
> +static void ad5620_store_pwr_down(struct ad5446_state *st, unsigned mode)
> +{
> +	st->data.d16 = cpu_to_be16(mode << 14);
> +}
> +
> +static void ad5660_store_pwr_down(struct ad5446_state *st, unsigned mode)
> +{
> +	unsigned val = mode << 16;
> +
> +	st->data.d24[0] = (val >> 16) & 0xFF;
> +	st->data.d24[1] = (val >> 8) & 0xFF;
> +	st->data.d24[2] = val & 0xFF;
> +}
> +
>  static ssize_t ad5446_write(struct device *dev,
>  		struct device_attribute *attr,
>  		const char *buf,
> @@ -68,6 +82,7 @@ static ssize_t ad5446_write(struct device *dev,
>  	}
>  
>  	mutex_lock(&dev_info->mlock);
> +	st->cached_val = val;
>  	st->chip_info->store_sample(st, val);
>  	ret = spi_sync(st->spi, &st->msg);
>  	mutex_unlock(&dev_info->mlock);
> @@ -102,15 +117,119 @@ static ssize_t ad5446_show_name(struct device *dev,
>  }
>  static IIO_DEVICE_ATTR(name, S_IRUGO, ad5446_show_name, NULL, 0);
>  
> +static ssize_t ad5446_write_powerdown_mode(struct device *dev,
> +				       struct device_attribute *attr,
> +				       const char *buf, size_t len)
> +{
> +	struct iio_dev *dev_info = dev_get_drvdata(dev);
> +	struct ad5446_state *st = dev_info->dev_data;
> +
> +	if (sysfs_streq(buf, "1kohm_to_gnd"))
> +		st->pwr_down_mode = MODE_PWRDWN_1k;
> +	else if (sysfs_streq(buf, "100kohm_to_gnd"))
> +		st->pwr_down_mode = MODE_PWRDWN_100k;
> +	else if (sysfs_streq(buf, "three_state"))
> +		st->pwr_down_mode = MODE_PWRDWN_TRISTATE;
> +	else
> +		return -EINVAL;
> +
> +	return len;
> +}
> +
> +static ssize_t ad5446_read_powerdown_mode(struct device *dev,
> +				      struct device_attribute *attr, char *buf)
> +{
> +	struct iio_dev *dev_info = dev_get_drvdata(dev);
> +	struct ad5446_state *st = dev_info->dev_data;
> +
> +	char mode[][15] = {"", "1kohm_to_gnd", "100kohm_to_gnd", "three_state"};
> +
> +	return sprintf(buf, "%s\n", mode[st->pwr_down_mode]);
> +}
> +
> +static ssize_t ad5446_read_dac_powerdown(struct device *dev,
> +					   struct device_attribute *attr,
> +					   char *buf)
> +{
> +	struct iio_dev *dev_info = dev_get_drvdata(dev);
> +	struct ad5446_state *st = dev_info->dev_data;
> +
> +	return sprintf(buf, "%d\n", st->pwr_down);
> +}
> +
> +static ssize_t ad5446_write_dac_powerdown(struct device *dev,
> +					    struct device_attribute *attr,
> +					    const char *buf, size_t len)
> +{
> +	struct iio_dev *dev_info = dev_get_drvdata(dev);
> +	struct ad5446_state *st = dev_info->dev_data;
> +	unsigned long readin;
> +	int ret;
> +
> +	ret = strict_strtol(buf, 10, &readin);
> +	if (ret)
> +		return ret;
> +
> +	if (readin > 1)
> +		ret = -EINVAL;
> +
> +	mutex_lock(&dev_info->mlock);
> +	st->pwr_down = readin;
> +
> +	if (st->pwr_down)
> +		st->chip_info->store_pwr_down(st, st->pwr_down_mode);
> +	else
> +		st->chip_info->store_sample(st, st->cached_val);
> +
> +	ret = spi_sync(st->spi, &st->msg);
> +	mutex_unlock(&dev_info->mlock);
> +
> +	return ret ? ret : len;
> +}
> +
> +static IIO_DEVICE_ATTR(out_powerdown_mode, S_IRUGO | S_IWUSR,
> +			ad5446_read_powerdown_mode,
> +			ad5446_write_powerdown_mode, 0);
> +
> +static IIO_CONST_ATTR(out_powerdown_mode_available,
> +			"1kohm_to_gnd 100kohm_to_gnd three_state");
> +
> +static IIO_DEVICE_ATTR(out0_powerdown, S_IRUGO | S_IWUSR,
> +			ad5446_read_dac_powerdown,
> +			ad5446_write_dac_powerdown, 0);
> +
>  static struct attribute *ad5446_attributes[] = {
>  	&iio_dev_attr_out0_raw.dev_attr.attr,
>  	&iio_dev_attr_out_scale.dev_attr.attr,
> +	&iio_dev_attr_out0_powerdown.dev_attr.attr,
> +	&iio_dev_attr_out_powerdown_mode.dev_attr.attr,
> +	&iio_const_attr_out_powerdown_mode_available.dev_attr.attr,
>  	&iio_dev_attr_name.dev_attr.attr,
>  	NULL,
>  };
>  
> +static mode_t ad5446_attr_is_visible(struct kobject *kobj,
> +				     struct attribute *attr, int n)
> +{
> +	struct device *dev = container_of(kobj, struct device, kobj);
> +	struct iio_dev *dev_info = dev_get_drvdata(dev);
> +	struct ad5446_state *st = iio_dev_get_devdata(dev_info);
> +
> +	mode_t mode = attr->mode;
> +
> +	if (!st->chip_info->store_pwr_down &&
> +		(attr == &iio_dev_attr_out0_powerdown.dev_attr.attr ||
> +		attr == &iio_dev_attr_out_powerdown_mode.dev_attr.attr ||
> +		attr ==
> +		&iio_const_attr_out_powerdown_mode_available.dev_attr.attr))
> +		mode = 0;
> +
> +	return mode;
> +}
> +
>  static const struct attribute_group ad5446_attribute_group = {
>  	.attrs = ad5446_attributes,
> +	.is_visible = ad5446_attr_is_visible,
>  };
>  
>  static const struct ad5446_chip_info ad5446_chip_info_tbl[] = {
> @@ -156,6 +275,7 @@ static const struct ad5446_chip_info ad5446_chip_info_tbl[] = {
>  		.left_shift = 2,
>  		.int_vref_mv = 2500,
>  		.store_sample = ad5620_store_sample,
> +		.store_pwr_down = ad5620_store_pwr_down,
>  	},
>  	[ID_AD5620_1250] = {
>  		.bits = 12,
> @@ -163,6 +283,7 @@ static const struct ad5446_chip_info ad5446_chip_info_tbl[] = {
>  		.left_shift = 2,
>  		.int_vref_mv = 1250,
>  		.store_sample = ad5620_store_sample,
> +		.store_pwr_down = ad5620_store_pwr_down,
>  	},
>  	[ID_AD5640_2500] = {
>  		.bits = 14,
> @@ -170,6 +291,7 @@ static const struct ad5446_chip_info ad5446_chip_info_tbl[] = {
>  		.left_shift = 0,
>  		.int_vref_mv = 2500,
>  		.store_sample = ad5620_store_sample,
> +		.store_pwr_down = ad5620_store_pwr_down,
>  	},
>  	[ID_AD5640_1250] = {
>  		.bits = 14,
> @@ -177,6 +299,7 @@ static const struct ad5446_chip_info ad5446_chip_info_tbl[] = {
>  		.left_shift = 0,
>  		.int_vref_mv = 1250,
>  		.store_sample = ad5620_store_sample,
> +		.store_pwr_down = ad5620_store_pwr_down,
>  	},
>  	[ID_AD5660_2500] = {
>  		.bits = 16,
> @@ -184,6 +307,7 @@ static const struct ad5446_chip_info ad5446_chip_info_tbl[] = {
>  		.left_shift = 0,
>  		.int_vref_mv = 2500,
>  		.store_sample = ad5660_store_sample,
> +		.store_pwr_down = ad5660_store_pwr_down,
>  	},
>  	[ID_AD5660_1250] = {
>  		.bits = 16,
> @@ -191,6 +315,7 @@ static const struct ad5446_chip_info ad5446_chip_info_tbl[] = {
>  		.left_shift = 0,
>  		.int_vref_mv = 1250,
>  		.store_sample = ad5660_store_sample,
> +		.store_pwr_down = ad5660_store_pwr_down,
>  	},
>  };
>  
> @@ -243,20 +368,20 @@ static int __devinit ad5446_probe(struct spi_device *spi)
>  	spi_message_add_tail(&st->xfer, &st->msg);
>  
>  	switch (spi_get_device_id(spi)->driver_data) {
> -		case ID_AD5620_2500:
> -		case ID_AD5620_1250:
> -		case ID_AD5640_2500:
> -		case ID_AD5640_1250:
> -		case ID_AD5660_2500:
> -		case ID_AD5660_1250:
> -			st->vref_mv = st->chip_info->int_vref_mv;
> -			break;
> -		default:
> -			if (voltage_uv)
> -				st->vref_mv = voltage_uv / 1000;
> -			else
> -				dev_warn(&spi->dev,
> -					 "reference voltage unspecified\n");
> +	case ID_AD5620_2500:
> +	case ID_AD5620_1250:
> +	case ID_AD5640_2500:
> +	case ID_AD5640_1250:
> +	case ID_AD5660_2500:
> +	case ID_AD5660_1250:
> +		st->vref_mv = st->chip_info->int_vref_mv;
> +		break;
> +	default:
> +		if (voltage_uv)
> +			st->vref_mv = voltage_uv / 1000;
> +		else
> +			dev_warn(&spi->dev,
> +				 "reference voltage unspecified\n");
>  	}
>  
>  	ret = iio_device_register(st->indio_dev);
> diff --git a/drivers/staging/iio/dac/ad5446.h b/drivers/staging/iio/dac/ad5446.h
> index 0cb9c14..e9397a6 100644
> --- a/drivers/staging/iio/dac/ad5446.h
> +++ b/drivers/staging/iio/dac/ad5446.h
> @@ -27,6 +27,10 @@
>  
>  #define RES_MASK(bits)	((1 << (bits)) - 1)
>  
> +#define MODE_PWRDWN_1k		0x1
> +#define MODE_PWRDWN_100k	0x2
> +#define MODE_PWRDWN_TRISTATE	0x3
> +
>  /**
>   * struct ad5446_state - driver instance specific data
>   * @indio_dev:		the industrial I/O device
> @@ -47,6 +51,9 @@ struct ad5446_state {
>  	struct regulator		*reg;
>  	struct work_struct		poll_work;
>  	unsigned short			vref_mv;
> +	unsigned			cached_val;
> +	unsigned			pwr_down_mode;
> +	unsigned			pwr_down;
>  	struct spi_transfer		xfer;
>  	struct spi_message		msg;
>  	union {
> @@ -62,14 +69,16 @@ struct ad5446_state {
>   * @left_shift:		number of bits the datum must be shifted
>   * @int_vref_mv:	AD5620/40/60: the internal reference voltage
>   * @store_sample:	chip specific helper function to store the datum
> + * @store_sample:	chip specific helper function to store the powerpown cmd
>   */
>  
>  struct ad5446_chip_info {
> -	u8				bits;
> -	u8				storagebits;
> -	u8				left_shift;
> -	u16				int_vref_mv;
> -	void (*store_sample)		(struct ad5446_state *st, unsigned val);
> +	u8			bits;
> +	u8			storagebits;
> +	u8			left_shift;
> +	u16			int_vref_mv;
> +	void (*store_sample)	(struct ad5446_state *st, unsigned val);
> +	void (*store_pwr_down)	(struct ad5446_state *st, unsigned mode);
>  };
>  
>  /**


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 3/3] IIO: DAC: AD5446: Add support for AD5601/AD5611/AD5621
  2011-03-10 11:52 ` [PATCH 3/3] IIO: DAC: AD5446: Add support for AD5601/AD5611/AD5621 michael.hennerich
@ 2011-03-10 12:14   ` Jonathan Cameron
  0 siblings, 0 replies; 7+ messages in thread
From: Jonathan Cameron @ 2011-03-10 12:14 UTC (permalink / raw)
  To: michael.hennerich; +Cc: linux-iio, drivers, device-drivers-devel

On 03/10/11 11:52, michael.hennerich@analog.com wrote:
> From: Michael Hennerich <michael.hennerich@analog.com>
> 
> This patch adds support for the AD5601/AD5611/AD5621 single channel,
> 8-/10-/12-bit, buffered voltage output DACs.
> 
Queries on ordering of part numbers in line.  Nitpick though so up to
you whether you want to have them sorted by number or grouped in some
other way.
> Signed-off-by: Michael Hennerich <michael.hennerich@analog.com>
Acked-by: Jonathan Cameron <jic23@cam.ac.uk>
> ---
>  drivers/staging/iio/dac/Kconfig  |    3 ++-
>  drivers/staging/iio/dac/ad5446.c |   24 ++++++++++++++++++++++++
>  drivers/staging/iio/dac/ad5446.h |    3 +++
>  3 files changed, 29 insertions(+), 1 deletions(-)
> 
> diff --git a/drivers/staging/iio/dac/Kconfig b/drivers/staging/iio/dac/Kconfig
> index 3c72871..9539545 100644
> --- a/drivers/staging/iio/dac/Kconfig
> +++ b/drivers/staging/iio/dac/Kconfig
> @@ -15,7 +15,8 @@ config AD5446
>  	depends on SPI
>  	help
>  	  Say yes here to build support for Analog Devices AD5444, AD5446,
> -	  AD5512A, AD5542A, AD5543, AD5553, AD5620, AD5640, AD5660 DACs.
> +	  AD5512A, AD5542A, AD5543, AD5553, AD5601, AD5611, AD5621, AD5620,
Slightly odd ordering at end of line above...  If the intent is numerical order
then you'll want to fix that.

> +	  AD5640, AD5660 DACs.
>  
>  	  To compile this driver as a module, choose M here: the
>  	  module will be called ad5446.
> diff --git a/drivers/staging/iio/dac/ad5446.c b/drivers/staging/iio/dac/ad5446.c
> index 861a7ea..8623a72 100644
> --- a/drivers/staging/iio/dac/ad5446.c
> +++ b/drivers/staging/iio/dac/ad5446.c
> @@ -269,6 +269,27 @@ static const struct ad5446_chip_info ad5446_chip_info_tbl[] = {
>  		.left_shift = 0,
>  		.store_sample = ad5542_store_sample,
>  	},
> +	[ID_AD5601] = {
> +		.bits = 8,
> +		.storagebits = 16,
> +		.left_shift = 6,
> +		.store_sample = ad5542_store_sample,
> +		.store_pwr_down = ad5620_store_pwr_down,
> +	},
> +	[ID_AD5611] = {
> +		.bits = 10,
> +		.storagebits = 16,
> +		.left_shift = 4,
> +		.store_sample = ad5542_store_sample,
> +		.store_pwr_down = ad5620_store_pwr_down,
> +	},
Again, is the intent numerical order here?
> +	[ID_AD5621] = {
> +		.bits = 12,
> +		.storagebits = 16,
> +		.left_shift = 2,
> +		.store_sample = ad5542_store_sample,
> +		.store_pwr_down = ad5620_store_pwr_down,
> +	},
>  	[ID_AD5620_2500] = {
>  		.bits = 12,
>  		.storagebits = 16,
> @@ -424,6 +445,9 @@ static const struct spi_device_id ad5446_id[] = {
>  	{"ad5542a", ID_AD5542A},
>  	{"ad5543", ID_AD5543},
>  	{"ad5553", ID_AD5553},
> +	{"ad5601", ID_AD5601},
> +	{"ad5611", ID_AD5611},
> +	{"ad5621", ID_AD5621},
and here?
>  	{"ad5620-2500", ID_AD5620_2500}, /* AD5620/40/60: */
>  	{"ad5620-1250", ID_AD5620_1250}, /* part numbers may look differently */
>  	{"ad5640-2500", ID_AD5640_2500},
> diff --git a/drivers/staging/iio/dac/ad5446.h b/drivers/staging/iio/dac/ad5446.h
> index e9397a6..7ac63ab 100644
> --- a/drivers/staging/iio/dac/ad5446.h
> +++ b/drivers/staging/iio/dac/ad5446.h
> @@ -96,6 +96,9 @@ enum ad5446_supported_device_ids {
>  	ID_AD5543,
>  	ID_AD5512A,
>  	ID_AD5553,
> +	ID_AD5601,
> +	ID_AD5611,
> +	ID_AD5621,
>  	ID_AD5620_2500,
>  	ID_AD5620_1250,
>  	ID_AD5640_2500,


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH 1/3] IIO: DAC: AD5446: Add missing ID table entries
@ 2011-03-10 12:26 michael.hennerich
  0 siblings, 0 replies; 7+ messages in thread
From: michael.hennerich @ 2011-03-10 12:26 UTC (permalink / raw)
  To: greg; +Cc: linux-iio, drivers, jic23, device-drivers-devel,
	Michael Hennerich

From: Michael Hennerich <michael.hennerich@analog.com>


Signed-off-by: Michael Hennerich <michael.hennerich@analog.com>
Acked-by: Jonathan Cameron <jic23@cam.ac.uk>
---
 drivers/staging/iio/dac/ad5446.c |    4 +++-
 1 files changed, 3 insertions(+), 1 deletions(-)

diff --git a/drivers/staging/iio/dac/ad5446.c b/drivers/staging/iio/dac/ad5446.c
index dcec297..4f1d881 100644
--- a/drivers/staging/iio/dac/ad5446.c
+++ b/drivers/staging/iio/dac/ad5446.c
@@ -295,8 +295,10 @@ static int ad5446_remove(struct spi_device *spi)
 static const struct spi_device_id ad5446_id[] = {
 	{"ad5444", ID_AD5444},
 	{"ad5446", ID_AD5446},
-	{"ad5542a", ID_AD5542A},
 	{"ad5512a", ID_AD5512A},
+	{"ad5542a", ID_AD5542A},
+	{"ad5543", ID_AD5543},
+	{"ad5553", ID_AD5553},
 	{"ad5620-2500", ID_AD5620_2500}, /* AD5620/40/60: */
 	{"ad5620-1250", ID_AD5620_1250}, /* part numbers may look differently */
 	{"ad5640-2500", ID_AD5640_2500},
--
1.6.0.2

^ permalink raw reply related	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2011-03-10 12:26 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-03-10 11:52 [PATCH 1/3] IIO: DAC: AD5446: Add missing ID table entries michael.hennerich
2011-03-10 11:52 ` [PATCH 2/3] IIO: DAC: AD5446: Add power down support michael.hennerich
2011-03-10 12:10   ` Jonathan Cameron
2011-03-10 11:52 ` [PATCH 3/3] IIO: DAC: AD5446: Add support for AD5601/AD5611/AD5621 michael.hennerich
2011-03-10 12:14   ` Jonathan Cameron
2011-03-10 12:08 ` [PATCH 1/3] IIO: DAC: AD5446: Add missing ID table entries Jonathan Cameron
  -- strict thread matches above, loose matches on Subject: below --
2011-03-10 12:26 michael.hennerich

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox