From: Jonathan Cameron <jic23@kernel.org> To: linux-iio@vger.kernel.org Cc: Lars-Peter Clausen <lars@metafoo.de>, Michael Hennerich <Michael.Hennerich@analog.com>, song.bao.hua@hisilicon.com, robh+dt@kernel.org, Jonathan Cameron <Jonathan.Cameron@huawei.com> Subject: [PATCH 06/24] staging:iio:cdc:ad7150: Handle variation in chan_spec across device and irq present or not Date: Sun, 7 Feb 2021 15:46:05 +0000 [thread overview] Message-ID: <20210207154623.433442-7-jic23@kernel.org> (raw) In-Reply-To: <20210207154623.433442-1-jic23@kernel.org> From: Jonathan Cameron <Jonathan.Cameron@huawei.com> The driver supports devices with different numbers of channels and also can function without provision of an IRQ (with reduced features), so this patch handles this cleanly by having multiple chan_spec arrays and iio_info structures to pick between depending on what we have. Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> --- drivers/staging/iio/cdc/ad7150.c | 71 ++++++++++++++++++++++++++++---- 1 file changed, 63 insertions(+), 8 deletions(-) diff --git a/drivers/staging/iio/cdc/ad7150.c b/drivers/staging/iio/cdc/ad7150.c index 7ad9105e6b46..539beed1a511 100644 --- a/drivers/staging/iio/cdc/ad7150.c +++ b/drivers/staging/iio/cdc/ad7150.c @@ -51,6 +51,12 @@ #define AD7150_CH_TIMEOUT_RECEDING GENMASK(3, 0) #define AD7150_CH_TIMEOUT_APPROACHING GENMASK(7, 4) + +enum { + AD7150, + AD7151, +}; + /** * struct ad7150_chip_info - instance specific chip data * @client: i2c client for this device @@ -447,9 +453,30 @@ static const struct iio_event_spec ad7150_events[] = { .num_event_specs = ARRAY_SIZE(ad7150_events), \ } +#define AD7150_CAPACITANCE_CHAN_NO_IRQ(_chan) { \ + .type = IIO_CAPACITANCE, \ + .indexed = 1, \ + .channel = _chan, \ + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ + BIT(IIO_CHAN_INFO_AVERAGE_RAW), \ + } + static const struct iio_chan_spec ad7150_channels[] = { AD7150_CAPACITANCE_CHAN(0), - AD7150_CAPACITANCE_CHAN(1) + AD7150_CAPACITANCE_CHAN(1), +}; + +static const struct iio_chan_spec ad7150_channels_no_irq[] = { + AD7150_CAPACITANCE_CHAN_NO_IRQ(0), + AD7150_CAPACITANCE_CHAN_NO_IRQ(1), +}; + +static const struct iio_chan_spec ad7151_channels[] = { + AD7150_CAPACITANCE_CHAN(0), +}; + +static const struct iio_chan_spec ad7151_channels_no_irq[] = { + AD7150_CAPACITANCE_CHAN_NO_IRQ(0), }; static irqreturn_t ad7150_event_handler(int irq, void *private) @@ -532,6 +559,10 @@ static const struct iio_info ad7150_info = { .write_event_value = &ad7150_write_event_value, }; +static const struct iio_info ad7150_info_no_irq = { + .read_raw = &ad7150_read_raw, +}; + static int ad7150_probe(struct i2c_client *client, const struct i2c_device_id *id) { @@ -550,14 +581,24 @@ static int ad7150_probe(struct i2c_client *client, chip->client = client; indio_dev->name = id->name; - indio_dev->channels = ad7150_channels; - indio_dev->num_channels = ARRAY_SIZE(ad7150_channels); - - indio_dev->info = &ad7150_info; indio_dev->modes = INDIO_DIRECT_MODE; if (client->irq) { + indio_dev->info = &ad7150_info; + switch (id->driver_data) { + case AD7150: + indio_dev->channels = ad7150_channels; + indio_dev->num_channels = ARRAY_SIZE(ad7150_channels); + break; + case AD7151: + indio_dev->channels = ad7151_channels; + indio_dev->num_channels = ARRAY_SIZE(ad7151_channels); + break; + default: + return -EINVAL; + } + ret = devm_request_threaded_irq(&client->dev, client->irq, NULL, &ad7150_event_handler, @@ -568,6 +609,20 @@ static int ad7150_probe(struct i2c_client *client, indio_dev); if (ret) return ret; + } else { + indio_dev->info = &ad7150_info_no_irq; + switch (id->driver_data) { + case AD7150: + indio_dev->channels = ad7150_channels_no_irq; + indio_dev->num_channels = ARRAY_SIZE(ad7150_channels_no_irq); + break; + case AD7151: + indio_dev->channels = ad7151_channels_no_irq; + indio_dev->num_channels = ARRAY_SIZE(ad7151_channels_no_irq); + break; + default: + return -EINVAL; + } } ret = devm_iio_device_register(indio_dev->dev.parent, indio_dev); @@ -581,9 +636,9 @@ static int ad7150_probe(struct i2c_client *client, } static const struct i2c_device_id ad7150_id[] = { - { "ad7150", 0 }, - { "ad7151", 0 }, - { "ad7156", 0 }, + { "ad7150", AD7150 }, + { "ad7151", AD7151 }, + { "ad7156", AD7150 }, {} }; -- 2.30.0
next prev parent reply other threads:[~2021-02-07 15:50 UTC|newest] Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-02-07 15:45 [PATCH 00/24] staging:iio:cdc:ad7150: cleanup / fixup / graduate Jonathan Cameron 2021-02-07 15:46 ` [PATCH 01/24] staging:iio:cdc:ad7150: use swapped reads for i2c rather than open coding Jonathan Cameron 2021-02-07 15:46 ` [PATCH 02/24] staging:iio:cdc:ad7150: Remove magnitude adaptive events Jonathan Cameron 2021-02-07 15:46 ` [PATCH 03/24] staging:iio:cdc:ad7150: Refactor event parameter update Jonathan Cameron 2021-02-07 15:46 ` [PATCH 04/24] staging:iio:cdc:ad7150: Timeout register covers both directions so both need updating Jonathan Cameron 2021-02-07 15:46 ` [PATCH 05/24] staging:iio:cdc:ad7150: Drop platform data support Jonathan Cameron 2021-02-08 8:01 ` Song Bao Hua (Barry Song) 2021-02-08 11:12 ` Jonathan Cameron 2021-02-07 15:46 ` Jonathan Cameron [this message] 2021-02-07 15:46 ` [PATCH 07/24] staging:iio:cdc:ad7150: Simplify event handling by only using rising direction Jonathan Cameron 2021-02-07 15:46 ` [PATCH 08/24] staging:iio:cdc:ad7150: Drop noisy print in probe Jonathan Cameron 2021-02-08 8:02 ` Song Bao Hua (Barry Song) 2021-02-07 15:46 ` [PATCH 09/24] staging:iio:cdc:ad7150: Add sampling_frequency support Jonathan Cameron 2021-02-07 15:46 ` [PATCH 10/24] iio:event: Add timeout event info type Jonathan Cameron 2021-02-07 15:46 ` [PATCH 11/24] staging:iio:cdc:ad7150: Change timeout units to seconds and use core support Jonathan Cameron 2021-02-07 15:46 ` [PATCH 12/24] staging:iio:cdc:ad7150: Rework interrupt handling Jonathan Cameron 2021-02-07 15:46 ` [PATCH 13/24] staging:iio:cdc:ad7150: More consistent register and field naming Jonathan Cameron 2021-03-14 17:43 ` Jonathan Cameron 2021-03-16 10:16 ` Alexandru Ardelean 2021-02-07 15:46 ` [PATCH 14/24] staging:iio:cdc:ad7150: Reorganize headers Jonathan Cameron 2021-02-08 7:54 ` Song Bao Hua (Barry Song) 2021-02-07 15:46 ` [PATCH 15/24] staging:iio:cdc:ad7150: Tidy up local variable positioning Jonathan Cameron 2021-02-08 7:54 ` Song Bao Hua (Barry Song) 2021-03-14 17:46 ` Jonathan Cameron 2021-02-07 15:46 ` [PATCH 16/24] staging:iio:cdc:ad7150: Drop unnecessary block comments Jonathan Cameron 2021-02-08 7:52 ` Song Bao Hua (Barry Song) 2021-02-07 15:46 ` [PATCH 17/24] staging:iio:cdc:ad7150: Shift the _raw readings by 4 bits Jonathan Cameron 2021-02-07 15:46 ` [PATCH 18/24] staging:iio:cdc:ad7150: Add scale and offset to info_mask_shared_by_type Jonathan Cameron 2021-02-07 15:46 ` [PATCH 19/24] staging:iio:cdc:ad7150: Really basic regulator support Jonathan Cameron 2021-02-07 15:46 ` [PATCH 20/24] staging:iio:cdc:ad7150: Add of_match_table Jonathan Cameron 2021-02-08 7:11 ` Alexandru Ardelean 2021-02-11 15:51 ` Jonathan Cameron 2021-02-08 7:50 ` Song Bao Hua (Barry Song) 2021-02-08 8:01 ` Alexandru Ardelean 2021-02-07 15:46 ` [PATCH 21/24] dt-bindings:iio:cdc:adi,ad7150 binding doc Jonathan Cameron 2021-02-07 16:00 ` Lars-Peter Clausen 2021-02-07 16:18 ` Jonathan Cameron 2021-02-08 8:12 ` Song Bao Hua (Barry Song) 2021-02-08 11:20 ` Jonathan Cameron 2021-02-21 15:59 ` Jonathan Cameron 2021-02-07 15:46 ` [PATCH 22/24] iio:Documentation:ABI Add missing elements as used by the adi,ad7150 Jonathan Cameron 2021-02-07 15:46 ` [PATCH 23/24] staging:iio:cdc:ad7150: Add copyright notice given substantial changes Jonathan Cameron 2021-02-07 15:46 ` [PATCH 24/24] iio:cdc:ad7150: Move driver out of staging Jonathan Cameron 2021-02-07 16:21 ` Jonathan Cameron 2021-02-07 16:12 ` [PATCH 00/24] staging:iio:cdc:ad7150: cleanup / fixup / graduate Jonathan Cameron 2021-02-08 7:20 ` Alexandru Ardelean
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=20210207154623.433442-7-jic23@kernel.org \ --to=jic23@kernel.org \ --cc=Jonathan.Cameron@huawei.com \ --cc=Michael.Hennerich@analog.com \ --cc=lars@metafoo.de \ --cc=linux-iio@vger.kernel.org \ --cc=robh+dt@kernel.org \ --cc=song.bao.hua@hisilicon.com \ --subject='Re: [PATCH 06/24] staging:iio:cdc:ad7150: Handle variation in chan_spec across device and irq present or not' \ /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
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.