All of lore.kernel.org
 help / color / mirror / Atom feed
From: Marek Vasut <marex@denx.de>
To: Hector Palacios <hector.palacios@digi.com>
Cc: linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org,
	devicetree-discuss@lists.ozlabs.org,
	alexandre.belloni@free-electrons.com, jic23@kernel.org,
	lars@metafoo.de, fabio.estevam@freescale.com
Subject: Re: [PATCH v2 5/5] iio: mxs-lradc: add write_raw function to modify scale
Date: Fri, 19 Jul 2013 16:39:01 +0200	[thread overview]
Message-ID: <201307191639.01240.marex@denx.de> (raw)
In-Reply-To: <1374225208-28940-6-git-send-email-hector.palacios@digi.com>

Dear Hector Palacios,

> Added write_raw function to manipulate the optional divider_by_two
> through the scaling attribute out of the available scales.
> 
> Signed-off-by: Hector Palacios <hector.palacios@digi.com>
> ---
>  drivers/staging/iio/adc/mxs-lradc.c | 55
> ++++++++++++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1
> deletion(-)
> 
> diff --git a/drivers/staging/iio/adc/mxs-lradc.c
> b/drivers/staging/iio/adc/mxs-lradc.c index c929733..286cde2 100644
> --- a/drivers/staging/iio/adc/mxs-lradc.c
> +++ b/drivers/staging/iio/adc/mxs-lradc.c
> @@ -144,6 +144,7 @@ struct mxs_lradc {
> 
>  	uint32_t		vref_mv[LRADC_MAX_TOTAL_CHANS];
>  	unsigned int		scale_avail[LRADC_MAX_TOTAL_CHANS][2][2];
> +	unsigned int		is_divided[LRADC_MAX_TOTAL_CHANS];

Why not use bitfield ? ;-)

>  	/*
>  	 * Touchscreen LRADC channels receives a private slot in the CTRL4
> @@ -202,6 +203,7 @@ struct mxs_lradc {
>  #define	LRADC_CTRL1_LRADC_IRQ_OFFSET		0
> 
>  #define	LRADC_CTRL2				0x20
> +#define	LRADC_CTRL2_DIVIDE_BY_TWO_OFFSET	24
>  #define	LRADC_CTRL2_TEMPSENSE_PWD		(1 << 15)
> 
>  #define	LRADC_STATUS				0x40
> @@ -310,7 +312,8 @@ static int mxs_lradc_read_raw(struct iio_dev *iio_dev,
>  		break;
>  	case IIO_CHAN_INFO_SCALE:
>  		*val = lradc->vref_mv[chan->channel];
> -		*val2 = chan->scan_type.realbits;
> +		*val2 = chan->scan_type.realbits -
> +			lradc->is_divided[chan->channel];
>  		ret = IIO_VAL_FRACTIONAL_LOG2;
>  		break;
>  	default:
> @@ -323,6 +326,54 @@ static int mxs_lradc_read_raw(struct iio_dev *iio_dev,
>  	return ret;
>  }
> 
> +static int mxs_lradc_write_raw(struct iio_dev *iio_dev,
> +			       const struct iio_chan_spec *chan,
> +			       int val, int val2, long m)
> +{
> +	struct mxs_lradc *lradc = iio_priv(iio_dev);
> +	int ret;
> +
> +	ret = mutex_trylock(&lradc->lock);
> +	if (!ret)
> +		return -EBUSY;
> +
> +	switch (m) {
> +	case IIO_CHAN_INFO_SCALE:
> +		ret = -EINVAL;
> +		if (val == lradc->scale_avail[chan->channel][0][0] &&
> +		    val2 == lradc->scale_avail[chan->channel][0][1]) {
> +			/* [0] -> divider by two disabled */

This comment is confusing, you use [0] in different dimensions of the array. So 
is the stuff below.

Still, how does this even work, can you show me and example how to set the 
divider from userland ? Sorry, I'm a bit confused with this 3D-business here, 
even if the comment in previous patch made it a bit clearer. Actually you can 
use some #define to specify if you're accessing div/2 or div/1 portion of the 
array to make it more readable.

Like ... scale_avail[chan->channel][LRADC_DIV_BY_2][LRADC_DECIMAL_PART] ... 
would by nice.

> +			writel(1 << LRADC_CTRL2_DIVIDE_BY_TWO_OFFSET,
> +			       lradc->base + LRADC_CTRL2 + STMP_OFFSET_REG_CLR);
> +			lradc->is_divided[chan->channel] = 0;
> +			ret = 0;
> +		} else if (val == lradc->scale_avail[chan->channel][1][0] &&
> +			   val2 == lradc->scale_avail[chan->channel][1][1]) {
> +			/* [1] -> divider by two enabled */
> +			writel(1 << LRADC_CTRL2_DIVIDE_BY_TWO_OFFSET,
> +			       lradc->base + LRADC_CTRL2 + STMP_OFFSET_REG_SET);
> +			lradc->is_divided[chan->channel] = 1;
> +			ret = 0;
> +		}
> +
> +		break;
> +	default:
> +		ret = -EINVAL;
> +		break;
> +	}
> +
> +	mutex_unlock(&lradc->lock);
> +
> +	return ret;
> +}
> +
> +static int mxs_lradc_write_raw_get_fmt(struct iio_dev *iio_dev,
> +				       const struct iio_chan_spec *chan,
> +				       long m)
> +{
> +	return IIO_VAL_INT_PLUS_NANO;
> +}
> +
>  static ssize_t mxs_lradc_show_scale_available_ch(struct device *dev,
>  		struct device_attribute *attr,
>  		char *buf,
> @@ -400,6 +451,8 @@ static const struct attribute_group
> mxs_lradc_attribute_group = { static const struct iio_info
> mxs_lradc_iio_info = {
>  	.driver_module		= THIS_MODULE,
>  	.read_raw		= mxs_lradc_read_raw,
> +	.write_raw		= mxs_lradc_write_raw,
> +	.write_raw_get_fmt	= &mxs_lradc_write_raw_get_fmt,

Is this & needed here ?

>  	.attrs			= &mxs_lradc_attribute_group,
>  };

Best regards,
Marek Vasut

WARNING: multiple messages have this Message-ID (diff)
From: Marek Vasut <marex-ynQEQJNshbs@public.gmane.org>
To: Hector Palacios <hector.palacios-i7dp0qKlBMg@public.gmane.org>
Cc: fabio.estevam-KZfg59tc24xl57MIdRCFDg@public.gmane.org,
	lars-Qo5EllUWu/uELgA04lAiVw@public.gmane.org,
	linux-iio-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	alexandre.belloni-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org,
	jic23-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org
Subject: Re: [PATCH v2 5/5] iio: mxs-lradc: add write_raw function to modify scale
Date: Fri, 19 Jul 2013 16:39:01 +0200	[thread overview]
Message-ID: <201307191639.01240.marex@denx.de> (raw)
In-Reply-To: <1374225208-28940-6-git-send-email-hector.palacios-i7dp0qKlBMg@public.gmane.org>

Dear Hector Palacios,

> Added write_raw function to manipulate the optional divider_by_two
> through the scaling attribute out of the available scales.
> 
> Signed-off-by: Hector Palacios <hector.palacios-i7dp0qKlBMg@public.gmane.org>
> ---
>  drivers/staging/iio/adc/mxs-lradc.c | 55
> ++++++++++++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1
> deletion(-)
> 
> diff --git a/drivers/staging/iio/adc/mxs-lradc.c
> b/drivers/staging/iio/adc/mxs-lradc.c index c929733..286cde2 100644
> --- a/drivers/staging/iio/adc/mxs-lradc.c
> +++ b/drivers/staging/iio/adc/mxs-lradc.c
> @@ -144,6 +144,7 @@ struct mxs_lradc {
> 
>  	uint32_t		vref_mv[LRADC_MAX_TOTAL_CHANS];
>  	unsigned int		scale_avail[LRADC_MAX_TOTAL_CHANS][2][2];
> +	unsigned int		is_divided[LRADC_MAX_TOTAL_CHANS];

Why not use bitfield ? ;-)

>  	/*
>  	 * Touchscreen LRADC channels receives a private slot in the CTRL4
> @@ -202,6 +203,7 @@ struct mxs_lradc {
>  #define	LRADC_CTRL1_LRADC_IRQ_OFFSET		0
> 
>  #define	LRADC_CTRL2				0x20
> +#define	LRADC_CTRL2_DIVIDE_BY_TWO_OFFSET	24
>  #define	LRADC_CTRL2_TEMPSENSE_PWD		(1 << 15)
> 
>  #define	LRADC_STATUS				0x40
> @@ -310,7 +312,8 @@ static int mxs_lradc_read_raw(struct iio_dev *iio_dev,
>  		break;
>  	case IIO_CHAN_INFO_SCALE:
>  		*val = lradc->vref_mv[chan->channel];
> -		*val2 = chan->scan_type.realbits;
> +		*val2 = chan->scan_type.realbits -
> +			lradc->is_divided[chan->channel];
>  		ret = IIO_VAL_FRACTIONAL_LOG2;
>  		break;
>  	default:
> @@ -323,6 +326,54 @@ static int mxs_lradc_read_raw(struct iio_dev *iio_dev,
>  	return ret;
>  }
> 
> +static int mxs_lradc_write_raw(struct iio_dev *iio_dev,
> +			       const struct iio_chan_spec *chan,
> +			       int val, int val2, long m)
> +{
> +	struct mxs_lradc *lradc = iio_priv(iio_dev);
> +	int ret;
> +
> +	ret = mutex_trylock(&lradc->lock);
> +	if (!ret)
> +		return -EBUSY;
> +
> +	switch (m) {
> +	case IIO_CHAN_INFO_SCALE:
> +		ret = -EINVAL;
> +		if (val == lradc->scale_avail[chan->channel][0][0] &&
> +		    val2 == lradc->scale_avail[chan->channel][0][1]) {
> +			/* [0] -> divider by two disabled */

This comment is confusing, you use [0] in different dimensions of the array. So 
is the stuff below.

Still, how does this even work, can you show me and example how to set the 
divider from userland ? Sorry, I'm a bit confused with this 3D-business here, 
even if the comment in previous patch made it a bit clearer. Actually you can 
use some #define to specify if you're accessing div/2 or div/1 portion of the 
array to make it more readable.

Like ... scale_avail[chan->channel][LRADC_DIV_BY_2][LRADC_DECIMAL_PART] ... 
would by nice.

> +			writel(1 << LRADC_CTRL2_DIVIDE_BY_TWO_OFFSET,
> +			       lradc->base + LRADC_CTRL2 + STMP_OFFSET_REG_CLR);
> +			lradc->is_divided[chan->channel] = 0;
> +			ret = 0;
> +		} else if (val == lradc->scale_avail[chan->channel][1][0] &&
> +			   val2 == lradc->scale_avail[chan->channel][1][1]) {
> +			/* [1] -> divider by two enabled */
> +			writel(1 << LRADC_CTRL2_DIVIDE_BY_TWO_OFFSET,
> +			       lradc->base + LRADC_CTRL2 + STMP_OFFSET_REG_SET);
> +			lradc->is_divided[chan->channel] = 1;
> +			ret = 0;
> +		}
> +
> +		break;
> +	default:
> +		ret = -EINVAL;
> +		break;
> +	}
> +
> +	mutex_unlock(&lradc->lock);
> +
> +	return ret;
> +}
> +
> +static int mxs_lradc_write_raw_get_fmt(struct iio_dev *iio_dev,
> +				       const struct iio_chan_spec *chan,
> +				       long m)
> +{
> +	return IIO_VAL_INT_PLUS_NANO;
> +}
> +
>  static ssize_t mxs_lradc_show_scale_available_ch(struct device *dev,
>  		struct device_attribute *attr,
>  		char *buf,
> @@ -400,6 +451,8 @@ static const struct attribute_group
> mxs_lradc_attribute_group = { static const struct iio_info
> mxs_lradc_iio_info = {
>  	.driver_module		= THIS_MODULE,
>  	.read_raw		= mxs_lradc_read_raw,
> +	.write_raw		= mxs_lradc_write_raw,
> +	.write_raw_get_fmt	= &mxs_lradc_write_raw_get_fmt,

Is this & needed here ?

>  	.attrs			= &mxs_lradc_attribute_group,
>  };

Best regards,
Marek Vasut

  reply	other threads:[~2013-07-19 14:39 UTC|newest]

Thread overview: 56+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-07-19  9:13 [PATCH v2 0/5] iio: mxs-lradc: add support to optional divider_by_two Hector Palacios
2013-07-19  9:13 ` Hector Palacios
2013-07-19  9:13 ` [PATCH v2 1/5] iio: mxs-lradc: change the realbits to 12 Hector Palacios
2013-07-19  9:13   ` Hector Palacios
2013-07-19 13:56   ` Marek Vasut
2013-07-19 13:56     ` Marek Vasut
2013-07-19 17:09   ` Alexandre Belloni
2013-07-19 17:09     ` Alexandre Belloni
2013-07-19  9:13 ` [PATCH v2 2/5] ARM: dts: add reference voltage property for MXS LRADC Hector Palacios
2013-07-19  9:13   ` Hector Palacios
2013-07-19 13:58   ` Marek Vasut
2013-07-19 13:58     ` Marek Vasut
2013-07-19 17:10   ` Alexandre Belloni
2013-07-19 17:10     ` Alexandre Belloni
2013-07-19  9:13 ` [PATCH v2 3/5] iio: mxs-lradc: add scale attribute to channels Hector Palacios
2013-07-19  9:13   ` Hector Palacios
2013-07-19 14:30   ` Marek Vasut
2013-07-19 14:30     ` Marek Vasut
2013-07-19 15:44     ` Hector Palacios
2013-07-19 15:44       ` Hector Palacios
2013-07-19 16:14       ` Marek Vasut
2013-07-19 16:14         ` Marek Vasut
2013-07-22  7:22         ` Hector Palacios
2013-07-22  7:22           ` Hector Palacios
2013-07-22  7:42           ` Marek Vasut
2013-07-22  7:42             ` Marek Vasut
2013-07-22  7:46             ` Hector Palacios
2013-07-22  7:46               ` Hector Palacios
2013-07-22  7:58               ` Marek Vasut
2013-07-19 17:06   ` Alexandre Belloni
2013-07-19 17:06     ` Alexandre Belloni
2013-07-22  7:26     ` Hector Palacios
2013-07-22  7:26       ` Hector Palacios
2013-07-19  9:13 ` [PATCH v2 4/5] iio: mxs-lradc: add scale_available file " Hector Palacios
2013-07-19  9:13   ` Hector Palacios
2013-07-19 17:20   ` Alexandre Belloni
2013-07-19 17:20     ` Alexandre Belloni
2013-07-19  9:13 ` [PATCH v2 5/5] iio: mxs-lradc: add write_raw function to modify scale Hector Palacios
2013-07-19  9:13   ` Hector Palacios
2013-07-19 14:39   ` Marek Vasut [this message]
2013-07-19 14:39     ` Marek Vasut
2013-07-19 15:31     ` Hector Palacios
2013-07-19 15:31       ` Hector Palacios
2013-07-19 16:17       ` Marek Vasut
2013-07-19 16:17         ` Marek Vasut
2013-07-19 16:22         ` Hector Palacios
2013-07-19 20:23           ` Jonathan Cameron
2013-07-19 20:23             ` Jonathan Cameron
2013-07-20 19:00             ` Marek Vasut
2013-07-20 19:00               ` Marek Vasut
2013-07-19 20:32       ` Jonathan Cameron
2013-07-19 20:32         ` Jonathan Cameron
2013-07-22  8:01         ` Hector Palacios
2013-07-22  8:01           ` Hector Palacios
2013-07-19 17:21   ` Alexandre Belloni
2013-07-19 17:21     ` Alexandre Belloni

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=201307191639.01240.marex@denx.de \
    --to=marex@denx.de \
    --cc=alexandre.belloni@free-electrons.com \
    --cc=devicetree-discuss@lists.ozlabs.org \
    --cc=fabio.estevam@freescale.com \
    --cc=hector.palacios@digi.com \
    --cc=jic23@kernel.org \
    --cc=lars@metafoo.de \
    --cc=linux-iio@vger.kernel.org \
    --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.