Re: [PATCH] iio: add driver for Microchip MCP414X/416X/424X/426X

From: Slawomir Stepien
Date: Wed Mar 16 2016 - 12:25:13 EST


On Mar 16, 2016 13:30, Peter Meerwald-Stadler wrote:
> On Wed, 16 Mar 2016, Slawomir Stepien wrote:
>
> > The following functionalities are supported:
> > - write, read from volatile and non volatile memory
> > - increase and decrease commands
> > - read from status register
> > - write and read to tcon register
> >
> > Datasheet: http://ww1.microchip.com/downloads/en/DeviceDoc/22059b.pdf

Thank you for all your comments.

> the driver naming is a mess: the subject says MCP414X, the file name is
> mcp41xx, the DT compatible string says mcp4113x -- this does not match

OK. I will change that to mcp414x in version 2.

> plenty of the private API, some of which seems to be debug only?
> what is really needed to interact with a poti?

I wanted to export both the non volatile and volatile memory addresses for wiper
position access. That is bare minimum for the poti to operate.

But I also wanted to export additional features of this chip. That is way there
is increase and decrease API, and STATUS and TCON register access.

The memory_map API is a way to access all the not used by chip memory addresses.
This API I think could be deleted. But I still think that some people might find
it useful.

> comments below
>
> > +File: /sys/bus/iio/devices/../out_resistanceN_raw
>
> this is already described in sysfs-bus-iio

Should I leave it and add reference to sysfs-bus-iio or delete it completely?

> > +struct mcp41xx_cfg {
> > + unsigned long int devid;
>
> devid is not set/used

That's true. Will fix it in v2.

> > +static int mcp41xx_exec(struct mcp41xx_data *data,
> > + u8 addr, u8 cmd,
> > + int *trans, size_t n)
>
> should trans really be int, not u8?

There is a need for 9 bit value write/read. I used int just for my convenience.
However there is one piece of code missing now I see. I should check the value
of tans[0] to see if it's > 256 or lower then 0. Will add it in v2.

Using u8 will force additional bit operations. I could try using u16 to still
have the option of parsing user input as 9 bit value (eg. 256 position).

> > +{
> > + int err;
> > + struct spi_device *spi = data->spi;
> > +
> > + /* Two bytes are needed for the response */
> > + if (n != 2)
> > + return -EINVAL;
>
> why pass n if it is always 2?

Will fix in v2.

> > + err = devm_iio_device_register(&spi->dev, indio_dev);
> > + if (err) {
> > + dev_info(&spi->dev, "Unable to register %s", indio_dev->name);
>
> \n missing
>
> > + return err;
> > + }
> > +
> > + dev_info(&spi->dev, "Registered %s", indio_dev->name);
>
> \n
>
> > +
> > + return 0;
> > +}
> > +
> > +static int mcp41xx_remove(struct spi_device *spi)
> > +{
> > + struct iio_dev *indio_dev = spi_get_drvdata(spi);
> > + struct mcp41xx_data *data = iio_priv(indio_dev);
> > +
> > + mutex_destroy(&data->lock);
> > + devm_iio_device_unregister(&spi->dev, indio_dev);
> > + kfree(mcp41xx_attributes);
> > +
> > + dev_info(&spi->dev, "Unregistered %s", indio_dev->name);

Also \n is missing here. Will fix in v2.

--
Slawomir Stepien