linux-iio.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Lars-Peter Clausen <lars@metafoo.de>
To: Jean-Francois Dagenais <jeff.dagenais@gmail.com>
Cc: uclinux-dist-devel@blackfin.uclinux.org, linux-iio@vger.kernel.org
Subject: Re: [Device-drivers-devel] [PATCH] iio: dac - split ad5440 into common, i2c and spi modules
Date: Thu, 10 Nov 2011 19:29:52 +0100	[thread overview]
Message-ID: <4EBC1820.1060506@metafoo.de> (raw)
In-Reply-To: <0974CF3F-FFAB-4AEC-9051-F4C9D0437DAA@gmail.com>

On 11/10/2011 06:34 PM, Jean-Francois Dagenais wrote:
>=20
> On Nov 10, 2011, at 11:56, Lars-Peter Clausen wrote:
>=20
>> On 11/10/2011 05:07 PM, Jean-Fran=E7ois Dagenais wrote:
>>> v1: first proposal, works with i2c AD5622
>>>
>>
>> Hi,
>>
>> Thanks for your patch. I've recently send a patch which converts the=
 ad5446
>> to channel_spec, it would be good if you could rebase v2 of this pat=
ch ontop
>> of it. Unfortunately the patch isn't in GregKH tree yet, but you can=
 grab it
>> from the mailing list archives:
>> http://marc.info/?l=3Dlinux-iio&m=3D131914551420107&q=3Draw
> I am having trouble applying the patch, to you have a tree point (mai=
nline or elsewhere) I should apply the patch onto?
> Trying to be autonomous I have started digging my mailbox for "ad5446=
=2Ec" and found many patches affecting it recently. Starting from
> 3.1, should I do a patch-series with your patch ending the series may=
be?

Hm, looks like there are a few patches which were added in between 3.1 =
and my
patch. If you have a up-to-date linux git tree the following command sh=
ould
list you the missing commits: `git log v3.1..v3.2-rc1
drivers/staging/iio/dac/ad5446.c`

With those applied my patch applies fine ontop. But when sending patche=
s it is
always a good idea to base them on the subsystem maintainers developmen=
t tree.
=46or staging this is GregKH staging-next branch:
http://git.kernel.org/?p=3Dlinux/kernel/git/gregkh/staging.git;a=3Dshor=
tlog;h=3Drefs/heads/staging-next

>=20
>>
>> Some further comments inline.
>>
>>> The patch also contains some cleanup of defines that were not
>>> used.
>>
>> Cleanups should go in a separate patch. Makes it easier to review th=
em.
>>
>>> ---
>>> drivers/staging/iio/dac/Kconfig      |   27 +++-
>>> drivers/staging/iio/dac/Makefile     |    2 +
>>> drivers/staging/iio/dac/ad5446-i2c.c |  135 ++++++++++++++++++
>>> drivers/staging/iio/dac/ad5446-spi.c |  259 +++++++++++++++++++++++=
+++++++++++
>>> drivers/staging/iio/dac/ad5446.c     |  258 +++++++----------------=
-----------
>>> drivers/staging/iio/dac/ad5446.h     |   93 +++++-------
>>> 6 files changed, 510 insertions(+), 264 deletions(-)
>>> create mode 100644 drivers/staging/iio/dac/ad5446-i2c.c
>>> create mode 100644 drivers/staging/iio/dac/ad5446-spi.c
>>>
>>> diff --git a/drivers/staging/iio/dac/Kconfig b/drivers/staging/iio/=
dac/Kconfig
>>> index 7ddae35..bb960b5 100644
>>> --- a/drivers/staging/iio/dac/Kconfig
>>> +++ b/drivers/staging/iio/dac/Kconfig
>>> @@ -11,16 +11,37 @@ config AD5624R_SPI
>>> 	  AD5664R convertors (DAC). This driver uses the common SPI interf=
ace.
>>>
>>> config AD5446
>>> -	tristate "Analog Devices AD5444/6, AD5620/40/60 and AD5542A/12A D=
AC SPI driver"
>>> -	depends on SPI
>>> +	tristate "Analog Devices AD5444/6, AD5620/40/60/02/12/22 and AD55=
42A/12A DAC SPI/I2C driver"
>>> 	help
>>> 	  Say yes here to build support for Analog Devices AD5444, AD5446,
>>> 	  AD5512A, AD5542A, AD5543, AD5553, AD5601, AD5611, AD5620, AD5621=
,
>>> -	  AD5640, AD5660 DACs.
>>> +	  AD5640, AD5660, AD5601, AD5612, AD5622 DACs.
>>>
>>> 	  To compile this driver as a module, choose M here: the
>>> 	  module will be called ad5446.
>>>
>>> +config AD5446_SPI
>>> +	tristate "support SPI bus connection"
>>> +	depends on AD5446 && SPI
>>> +	default y
>>> +	help
>>> +	  Say Y here if you have AD5444/6, AD5620/40/60 and AD5542A/12A
>>> +	  DAC connected to a SPI bus.
>>> +
>>> +	  To compile this driver as a module, choose M here: the
>>> +	  module will be called ad5446-spi.
>>> +
>>> +config AD5446_I2C
>>> +	tristate "support I2C bus connection"
>>> +	depends on AD5446 && I2C
>>> +	default y
>>> +	help
>>> +	  Say Y here if you have AD5602/12/22 DAC connected to an I2C bus=
=2E
>>> +
>>> +	  To compile this driver as a module, choose M here: the
>>> +	  module will be called ad5446-i2c.
>>> +
>>> +
>>
>> I don't think we need to split this into two separate modules. Havin=
g one
>> handling both should be fine. The I2C and SPI specific sections shou=
ld be
>> rather small and can be put in a #ifdef CONFIG_... block.
> Yeah, it seemed cleaner, but a bit overkill. I was mimicking the ad71=
4x-i2c/spi strategy.
>>
>>> config AD5504
>>> 	tristate "Analog Devices AD5504/AD5501 DAC SPI driver"
>>> 	depends on SPI
>>> diff --git a/drivers/staging/iio/dac/Makefile b/drivers/staging/iio=
/dac/Makefile
>>> index 7f4f2ed..481a1e9 100644
>>> --- a/drivers/staging/iio/dac/Makefile
>>> +++ b/drivers/staging/iio/dac/Makefile
>>> @@ -5,6 +5,8 @@
>>> obj-$(CONFIG_AD5624R_SPI) +=3D ad5624r_spi.o
>>> obj-$(CONFIG_AD5504) +=3D ad5504.o
>>> obj-$(CONFIG_AD5446) +=3D ad5446.o
>>> +obj-$(CONFIG_AD5446_I2C) +=3D ad5446-i2c.o
>>> +obj-$(CONFIG_AD5446_SPI) +=3D ad5446-spi.o
>>> obj-$(CONFIG_AD5791) +=3D ad5791.o
>>> obj-$(CONFIG_AD5686) +=3D ad5686.o
>>> obj-$(CONFIG_MAX517) +=3D max517.o
>>> diff --git a/drivers/staging/iio/dac/ad5446-i2c.c b/drivers/staging=
/iio/dac/ad5446-i2c.c
>>> new file mode 100644
>>> index 0000000..cee606e
>>> --- /dev/null
>>> +++ b/drivers/staging/iio/dac/ad5446-i2c.c
>>> @@ -0,0 +1,135 @@
>>> +/*
>>> + * AD5446 DAC driver SPI specific
>>> + *
>>> + * Copyright 2010 Analog Devices Inc.
>>> + *
>>> + * Licensed under the GPL-2 or later.
>>> + */
>>> +
>>> +#include <linux/device.h>
>>> +#include <linux/i2c.h>
>>> +
>>> +#include "../iio.h"
>>> +
>>> +#include "ad5446.h"
>>> +
>>> +static int ad5446_i2c_sync_to_chip(struct ad5446_state *st)
>>> +{
>>> +	struct i2c_client *client =3D to_i2c_client(st->dev);
>>> +	int error =3D i2c_transfer(client->adapter, &st->proto.i2c.msg, 1=
);
>>> +	if (unlikely(error < 0)) {
>>> +		dev_err(st->dev, "I2C write error: %d\n", error);
>>> +		return error;
>>> +	}
>>
>> Just use i2c_master_send.
>>
>>> +
>>> +	return 0;
>>> +}
>>> +
>>
>> [...]
>>
>>> @@ -52,8 +37,19 @@ struct ad5446_state {
>>> 	unsigned			cached_val;
>>> 	unsigned			pwr_down_mode;
>>> 	unsigned			pwr_down;
>>> -	struct spi_transfer		xfer;
>>> -	struct spi_message		msg;
>>> +	union {
>>> +#ifdef __enabled_CONFIG_AD5446_SPI
>>
>> Uhm, I think the __enabled_ defines were not intended to be used dir=
ectly.
>> You should rather use the IS_ENABLED macro instead.
>>
>>> +		struct {
>>> +			struct spi_transfer		xfer;
>>> +			struct spi_message		msg;
>>> +		} spi;
>>> +#endif
>>> +#ifdef __enabled_CONFIG_AD5446_I2C
>>> +		struct {
>>> +			struct i2c_msg msg;
>>> +		} i2c;
>>> +#endif
>>> +	} proto;
>>> 	union {
>>> 		unsigned short		d16;
>>> 		unsigned char		d24[3];
>>> @@ -65,7 +61,7 @@ struct ad5446_state {
>>>  * @bits:		accuracy of the DAC in bits
>>>  * @storagebits:	number of bits written to the DAC
>>>  * @left_shift:		number of bits the datum must be shifted
>>> - * @int_vref_mv:	AD5620/40/60: the internal reference voltage
>>> + * @int_vref_mv:	AD5620/40/60: the internal reference voltage, 0 m=
eans vcc ref
>>>  * @store_sample:	chip specific helper function to store the datum
>>>  * @store_sample:	chip specific helper function to store the powerp=
own cmd
>>>  */
>>> @@ -77,33 +73,22 @@ struct ad5446_chip_info {
>>> 	u16			int_vref_mv;
>>> 	void (*store_sample)	(struct ad5446_state *st, unsigned val);
>>> 	void (*store_pwr_down)	(struct ad5446_state *st, unsigned mode);
>>> +	int  (*sync_to_chip) (struct ad5446_state *st);
>>
>> I would put the sync callback into the ad5446_state struct and initi=
alize it
>> in the I2C and SPI probe function. No need to store this information=
 on a
>> per chip basis. And maybe call it "write" or something instead.
>>
>> [...]
>>
>>> #endif /* IIO_DAC_AD5446_H_ */
>>
>=20
> As a general question, while digging, I found concerning mail about r=
andom kernel segfaults. I know staging gives out this big warning, but =
I thought I would be safe using a simple driver like the ad5446 for pro=
duction. Am I mistaken. I mean the chip is so dumb simple, I am now con=
sidering using i2cset from userspace instead since I will not really be=
 using the whole iio framework.
>

The IIO framework should be quite stable by now. So you shouldn't reall=
y get
any random segfaults by using it. To which mail are you referring to?

- Lars




      parent reply	other threads:[~2011-11-10 18:30 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <1320941253-17857-1-git-send-email-dagenaisj@sonatest.com>
2011-11-10 16:56 ` [Device-drivers-devel] [PATCH] iio: dac - split ad5440 into common, i2c and spi modules Lars-Peter Clausen
     [not found]   ` <0974CF3F-FFAB-4AEC-9051-F4C9D0437DAA@gmail.com>
2011-11-10 18:29     ` Lars-Peter Clausen [this message]

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=4EBC1820.1060506@metafoo.de \
    --to=lars@metafoo.de \
    --cc=jeff.dagenais@gmail.com \
    --cc=linux-iio@vger.kernel.org \
    --cc=uclinux-dist-devel@blackfin.uclinux.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).