• Home
  • Raw
  • Download

Lines Matching +full:adc +full:- +full:dev

1 // SPDX-License-Identifier: GPL-2.0
3 * This file is the ADC part of the STM32 DFSDM driver
5 * Copyright (C) 2017, STMicroelectronics - All Rights Reserved
10 #include <linux/dma-mapping.h>
11 #include <linux/iio/adc/stm32-dfsdm-adc.h>
13 #include <linux/iio/hw-consumer.h>
22 #include "stm32-dfsdm.h"
48 int (*init)(struct device *dev, struct iio_dev *indio_dev);
58 /* ADC specific */
110 for (p = list; p && p->name; p++) in stm32_dfsdm_str2val()
111 if (!strcmp(p->name, str)) in stm32_dfsdm_str2val()
112 return p->val; in stm32_dfsdm_str2val()
114 return -EINVAL; in stm32_dfsdm_str2val()
124 unsigned int p = fl->ford; /* filter order (ford) */ in stm32_dfsdm_set_osrs()
136 if (fl->ford == DFSDM_FASTSINC_ORDER) { in stm32_dfsdm_set_osrs()
147 fl->res = 0; in stm32_dfsdm_set_osrs()
152 else if (fl->ford == DFSDM_FASTSINC_ORDER) in stm32_dfsdm_set_osrs()
155 d = fosr * (iosr - 1 + p) + p; in stm32_dfsdm_set_osrs()
170 for (i = p - 1; i > 0; i--) { in stm32_dfsdm_set_osrs()
181 delta = res - DFSDM_DATA_RES; in stm32_dfsdm_set_osrs()
183 if (res >= fl->res) { in stm32_dfsdm_set_osrs()
184 fl->res = res; in stm32_dfsdm_set_osrs()
185 fl->fosr = fosr; in stm32_dfsdm_set_osrs()
186 fl->iosr = iosr; in stm32_dfsdm_set_osrs()
187 fl->fast = fast; in stm32_dfsdm_set_osrs()
189 __func__, fl->fosr, fl->iosr); in stm32_dfsdm_set_osrs()
197 if (!fl->res) in stm32_dfsdm_set_osrs()
198 return -EINVAL; in stm32_dfsdm_set_osrs()
206 return regmap_update_bits(dfsdm->regmap, DFSDM_CHCFGR1(ch_id), in stm32_dfsdm_start_channel()
214 regmap_update_bits(dfsdm->regmap, DFSDM_CHCFGR1(ch_id), in stm32_dfsdm_stop_channel()
221 unsigned int id = ch->id; in stm32_dfsdm_chan_configure()
222 struct regmap *regmap = dfsdm->regmap; in stm32_dfsdm_chan_configure()
227 DFSDM_CHCFGR1_SITP(ch->type)); in stm32_dfsdm_chan_configure()
232 DFSDM_CHCFGR1_SPICKSEL(ch->src)); in stm32_dfsdm_chan_configure()
237 DFSDM_CHCFGR1_CHINSEL(ch->alt_si)); in stm32_dfsdm_chan_configure()
246 ret = regmap_update_bits(dfsdm->regmap, DFSDM_CR1(fl_id), in stm32_dfsdm_start_filter()
252 return regmap_update_bits(dfsdm->regmap, DFSDM_CR1(fl_id), in stm32_dfsdm_start_filter()
261 regmap_update_bits(dfsdm->regmap, DFSDM_CR1(fl_id), in stm32_dfsdm_stop_filter()
268 struct regmap *regmap = dfsdm->regmap; in stm32_dfsdm_filter_configure()
269 struct stm32_dfsdm_filter *fl = &dfsdm->fl_list[fl_id]; in stm32_dfsdm_filter_configure()
274 DFSDM_FCR_IOSR(fl->iosr - 1)); in stm32_dfsdm_filter_configure()
280 DFSDM_FCR_FOSR(fl->fosr - 1)); in stm32_dfsdm_filter_configure()
285 DFSDM_FCR_FORD(fl->ford)); in stm32_dfsdm_filter_configure()
297 DFSDM_CR1_RSYNC(fl->sync_mode)); in stm32_dfsdm_filter_configure()
306 int chan_idx = ch->scan_index; in stm32_dfsdm_channel_parse_of()
309 ret = of_property_read_u32_index(indio_dev->dev.of_node, in stm32_dfsdm_channel_parse_of()
310 "st,adc-channels", chan_idx, in stm32_dfsdm_channel_parse_of()
311 &ch->channel); in stm32_dfsdm_channel_parse_of()
313 dev_err(&indio_dev->dev, in stm32_dfsdm_channel_parse_of()
314 " Error parsing 'st,adc-channels' for idx %d\n", in stm32_dfsdm_channel_parse_of()
318 if (ch->channel >= dfsdm->num_chs) { in stm32_dfsdm_channel_parse_of()
319 dev_err(&indio_dev->dev, in stm32_dfsdm_channel_parse_of()
321 ch->channel, dfsdm->num_chs); in stm32_dfsdm_channel_parse_of()
322 return -EINVAL; in stm32_dfsdm_channel_parse_of()
325 ret = of_property_read_string_index(indio_dev->dev.of_node, in stm32_dfsdm_channel_parse_of()
326 "st,adc-channel-names", chan_idx, in stm32_dfsdm_channel_parse_of()
327 &ch->datasheet_name); in stm32_dfsdm_channel_parse_of()
329 dev_err(&indio_dev->dev, in stm32_dfsdm_channel_parse_of()
330 " Error parsing 'st,adc-channel-names' for idx %d\n", in stm32_dfsdm_channel_parse_of()
335 df_ch = &dfsdm->ch_list[ch->channel]; in stm32_dfsdm_channel_parse_of()
336 df_ch->id = ch->channel; in stm32_dfsdm_channel_parse_of()
338 ret = of_property_read_string_index(indio_dev->dev.of_node, in stm32_dfsdm_channel_parse_of()
339 "st,adc-channel-types", chan_idx, in stm32_dfsdm_channel_parse_of()
348 df_ch->type = val; in stm32_dfsdm_channel_parse_of()
350 ret = of_property_read_string_index(indio_dev->dev.of_node, in stm32_dfsdm_channel_parse_of()
351 "st,adc-channel-clk-src", chan_idx, in stm32_dfsdm_channel_parse_of()
360 df_ch->src = val; in stm32_dfsdm_channel_parse_of()
362 ret = of_property_read_u32_index(indio_dev->dev.of_node, in stm32_dfsdm_channel_parse_of()
363 "st,adc-alt-channel", chan_idx, in stm32_dfsdm_channel_parse_of()
364 &df_ch->alt_si); in stm32_dfsdm_channel_parse_of()
366 df_ch->alt_si = 0; in stm32_dfsdm_channel_parse_of()
376 struct stm32_dfsdm_adc *adc = iio_priv(indio_dev); in dfsdm_adc_audio_get_spiclk() local
378 return snprintf(buf, PAGE_SIZE, "%d\n", adc->spi_freq); in dfsdm_adc_audio_get_spiclk()
386 struct stm32_dfsdm_adc *adc = iio_priv(indio_dev); in dfsdm_adc_audio_set_spiclk() local
387 struct stm32_dfsdm_filter *fl = &adc->dfsdm->fl_list[adc->fl_id]; in dfsdm_adc_audio_set_spiclk()
388 struct stm32_dfsdm_channel *ch = &adc->dfsdm->ch_list[chan->channel]; in dfsdm_adc_audio_set_spiclk()
389 unsigned int sample_freq = adc->sample_freq; in dfsdm_adc_audio_set_spiclk()
393 dev_err(&indio_dev->dev, "enter %s\n", __func__); in dfsdm_adc_audio_set_spiclk()
395 if (ch->src != DFSDM_CHANNEL_SPI_CLOCK_EXTERNAL) in dfsdm_adc_audio_set_spiclk()
396 return -EPERM; in dfsdm_adc_audio_set_spiclk()
403 return -EINVAL; in dfsdm_adc_audio_set_spiclk()
407 dev_warn(&indio_dev->dev, in dfsdm_adc_audio_set_spiclk()
413 dev_err(&indio_dev->dev, in dfsdm_adc_audio_set_spiclk()
418 adc->spi_freq = spi_freq; in dfsdm_adc_audio_set_spiclk()
423 static int stm32_dfsdm_start_conv(struct stm32_dfsdm_adc *adc, in stm32_dfsdm_start_conv() argument
427 struct regmap *regmap = adc->dfsdm->regmap; in stm32_dfsdm_start_conv()
431 ret = stm32_dfsdm_start_channel(adc->dfsdm, chan->channel); in stm32_dfsdm_start_conv()
435 ret = stm32_dfsdm_filter_configure(adc->dfsdm, adc->fl_id, in stm32_dfsdm_start_conv()
436 chan->channel); in stm32_dfsdm_start_conv()
447 ret = regmap_update_bits(regmap, DFSDM_CR1(adc->fl_id), in stm32_dfsdm_start_conv()
453 ret = regmap_update_bits(regmap, DFSDM_CR1(adc->fl_id), in stm32_dfsdm_start_conv()
458 ret = stm32_dfsdm_start_filter(adc->dfsdm, adc->fl_id); in stm32_dfsdm_start_conv()
465 regmap_update_bits(regmap, DFSDM_CR1(adc->fl_id), in stm32_dfsdm_start_conv()
468 regmap_update_bits(regmap, DFSDM_CR1(adc->fl_id), in stm32_dfsdm_start_conv()
470 stm32_dfsdm_stop_channel(adc->dfsdm, chan->channel); in stm32_dfsdm_start_conv()
475 static void stm32_dfsdm_stop_conv(struct stm32_dfsdm_adc *adc, in stm32_dfsdm_stop_conv() argument
478 struct regmap *regmap = adc->dfsdm->regmap; in stm32_dfsdm_stop_conv()
480 stm32_dfsdm_stop_filter(adc->dfsdm, adc->fl_id); in stm32_dfsdm_stop_conv()
483 regmap_update_bits(regmap, DFSDM_CR1(adc->fl_id), in stm32_dfsdm_stop_conv()
486 regmap_update_bits(regmap, DFSDM_CR1(adc->fl_id), in stm32_dfsdm_stop_conv()
489 stm32_dfsdm_stop_channel(adc->dfsdm, chan->channel); in stm32_dfsdm_stop_conv()
495 struct stm32_dfsdm_adc *adc = iio_priv(indio_dev); in stm32_dfsdm_set_watermark() local
501 * - always one buffer (period) DMA is working on in stm32_dfsdm_set_watermark()
502 * - one buffer (period) driver pushed to ASoC side. in stm32_dfsdm_set_watermark()
505 adc->buf_sz = watermark * 2; in stm32_dfsdm_set_watermark()
510 static unsigned int stm32_dfsdm_adc_dma_residue(struct stm32_dfsdm_adc *adc) in stm32_dfsdm_adc_dma_residue() argument
515 status = dmaengine_tx_status(adc->dma_chan, in stm32_dfsdm_adc_dma_residue()
516 adc->dma_chan->cookie, in stm32_dfsdm_adc_dma_residue()
520 unsigned int i = adc->buf_sz - state.residue; in stm32_dfsdm_adc_dma_residue()
524 if (i >= adc->bufi) in stm32_dfsdm_adc_dma_residue()
525 size = i - adc->bufi; in stm32_dfsdm_adc_dma_residue()
527 size = adc->buf_sz + i - adc->bufi; in stm32_dfsdm_adc_dma_residue()
538 struct stm32_dfsdm_adc *adc = iio_priv(indio_dev); in stm32_dfsdm_audio_dma_buffer_done() local
539 int available = stm32_dfsdm_adc_dma_residue(adc); in stm32_dfsdm_audio_dma_buffer_done()
551 dev_dbg(&indio_dev->dev, "%s: pos = %d, available = %d\n", __func__, in stm32_dfsdm_audio_dma_buffer_done()
552 adc->bufi, available); in stm32_dfsdm_audio_dma_buffer_done()
553 old_pos = adc->bufi; in stm32_dfsdm_audio_dma_buffer_done()
555 while (available >= indio_dev->scan_bytes) { in stm32_dfsdm_audio_dma_buffer_done()
556 u32 *buffer = (u32 *)&adc->rx_buf[adc->bufi]; in stm32_dfsdm_audio_dma_buffer_done()
560 available -= indio_dev->scan_bytes; in stm32_dfsdm_audio_dma_buffer_done()
561 adc->bufi += indio_dev->scan_bytes; in stm32_dfsdm_audio_dma_buffer_done()
562 if (adc->bufi >= adc->buf_sz) { in stm32_dfsdm_audio_dma_buffer_done()
563 if (adc->cb) in stm32_dfsdm_audio_dma_buffer_done()
564 adc->cb(&adc->rx_buf[old_pos], in stm32_dfsdm_audio_dma_buffer_done()
565 adc->buf_sz - old_pos, adc->cb_priv); in stm32_dfsdm_audio_dma_buffer_done()
566 adc->bufi = 0; in stm32_dfsdm_audio_dma_buffer_done()
570 if (adc->cb) in stm32_dfsdm_audio_dma_buffer_done()
571 adc->cb(&adc->rx_buf[old_pos], adc->bufi - old_pos, in stm32_dfsdm_audio_dma_buffer_done()
572 adc->cb_priv); in stm32_dfsdm_audio_dma_buffer_done()
577 struct stm32_dfsdm_adc *adc = iio_priv(indio_dev); in stm32_dfsdm_adc_dma_start() local
582 if (!adc->dma_chan) in stm32_dfsdm_adc_dma_start()
583 return -EINVAL; in stm32_dfsdm_adc_dma_start()
585 dev_dbg(&indio_dev->dev, "%s size=%d watermark=%d\n", __func__, in stm32_dfsdm_adc_dma_start()
586 adc->buf_sz, adc->buf_sz / 2); in stm32_dfsdm_adc_dma_start()
589 desc = dmaengine_prep_dma_cyclic(adc->dma_chan, in stm32_dfsdm_adc_dma_start()
590 adc->dma_buf, in stm32_dfsdm_adc_dma_start()
591 adc->buf_sz, adc->buf_sz / 2, in stm32_dfsdm_adc_dma_start()
595 return -EBUSY; in stm32_dfsdm_adc_dma_start()
597 desc->callback = stm32_dfsdm_audio_dma_buffer_done; in stm32_dfsdm_adc_dma_start()
598 desc->callback_param = indio_dev; in stm32_dfsdm_adc_dma_start()
603 dmaengine_terminate_all(adc->dma_chan); in stm32_dfsdm_adc_dma_start()
608 dma_async_issue_pending(adc->dma_chan); in stm32_dfsdm_adc_dma_start()
615 struct stm32_dfsdm_adc *adc = iio_priv(indio_dev); in stm32_dfsdm_postenable() local
616 const struct iio_chan_spec *chan = &indio_dev->channels[0]; in stm32_dfsdm_postenable()
619 /* Reset adc buffer index */ in stm32_dfsdm_postenable()
620 adc->bufi = 0; in stm32_dfsdm_postenable()
622 ret = stm32_dfsdm_start_dfsdm(adc->dfsdm); in stm32_dfsdm_postenable()
626 ret = stm32_dfsdm_start_conv(adc, chan, true); in stm32_dfsdm_postenable()
628 dev_err(&indio_dev->dev, "Can't start conversion\n"); in stm32_dfsdm_postenable()
632 if (adc->dma_chan) { in stm32_dfsdm_postenable()
635 dev_err(&indio_dev->dev, "Can't start DMA\n"); in stm32_dfsdm_postenable()
643 stm32_dfsdm_stop_conv(adc, chan); in stm32_dfsdm_postenable()
645 stm32_dfsdm_stop_dfsdm(adc->dfsdm); in stm32_dfsdm_postenable()
652 struct stm32_dfsdm_adc *adc = iio_priv(indio_dev); in stm32_dfsdm_predisable() local
653 const struct iio_chan_spec *chan = &indio_dev->channels[0]; in stm32_dfsdm_predisable()
655 if (adc->dma_chan) in stm32_dfsdm_predisable()
656 dmaengine_terminate_all(adc->dma_chan); in stm32_dfsdm_predisable()
658 stm32_dfsdm_stop_conv(adc, chan); in stm32_dfsdm_predisable()
660 stm32_dfsdm_stop_dfsdm(adc->dfsdm); in stm32_dfsdm_predisable()
671 * stm32_dfsdm_get_buff_cb() - register a callback that will be called when
676 * - data: pointer to data buffer
677 * - size: size in byte of the data buffer
678 * - private: pointer to consumer private structure.
686 struct stm32_dfsdm_adc *adc; in stm32_dfsdm_get_buff_cb() local
689 return -EINVAL; in stm32_dfsdm_get_buff_cb()
690 adc = iio_priv(iio_dev); in stm32_dfsdm_get_buff_cb()
692 adc->cb = cb; in stm32_dfsdm_get_buff_cb()
693 adc->cb_priv = private; in stm32_dfsdm_get_buff_cb()
700 * stm32_dfsdm_release_buff_cb - unregister buffer callback
706 struct stm32_dfsdm_adc *adc; in stm32_dfsdm_release_buff_cb() local
709 return -EINVAL; in stm32_dfsdm_release_buff_cb()
710 adc = iio_priv(iio_dev); in stm32_dfsdm_release_buff_cb()
712 adc->cb = NULL; in stm32_dfsdm_release_buff_cb()
713 adc->cb_priv = NULL; in stm32_dfsdm_release_buff_cb()
722 struct stm32_dfsdm_adc *adc = iio_priv(indio_dev); in stm32_dfsdm_single_conv() local
726 reinit_completion(&adc->completion); in stm32_dfsdm_single_conv()
728 adc->buffer = res; in stm32_dfsdm_single_conv()
730 ret = stm32_dfsdm_start_dfsdm(adc->dfsdm); in stm32_dfsdm_single_conv()
734 ret = regmap_update_bits(adc->dfsdm->regmap, DFSDM_CR2(adc->fl_id), in stm32_dfsdm_single_conv()
739 ret = stm32_dfsdm_start_conv(adc, chan, false); in stm32_dfsdm_single_conv()
741 regmap_update_bits(adc->dfsdm->regmap, DFSDM_CR2(adc->fl_id), in stm32_dfsdm_single_conv()
746 timeout = wait_for_completion_interruptible_timeout(&adc->completion, in stm32_dfsdm_single_conv()
750 regmap_update_bits(adc->dfsdm->regmap, DFSDM_CR2(adc->fl_id), in stm32_dfsdm_single_conv()
754 ret = -ETIMEDOUT; in stm32_dfsdm_single_conv()
760 stm32_dfsdm_stop_conv(adc, chan); in stm32_dfsdm_single_conv()
763 stm32_dfsdm_stop_dfsdm(adc->dfsdm); in stm32_dfsdm_single_conv()
772 struct stm32_dfsdm_adc *adc = iio_priv(indio_dev); in stm32_dfsdm_write_raw() local
773 struct stm32_dfsdm_filter *fl = &adc->dfsdm->fl_list[adc->fl_id]; in stm32_dfsdm_write_raw()
774 struct stm32_dfsdm_channel *ch = &adc->dfsdm->ch_list[chan->channel]; in stm32_dfsdm_write_raw()
776 int ret = -EINVAL; in stm32_dfsdm_write_raw()
782 adc->oversamp = val; in stm32_dfsdm_write_raw()
788 return -EINVAL; in stm32_dfsdm_write_raw()
790 switch (ch->src) { in stm32_dfsdm_write_raw()
792 spi_freq = adc->dfsdm->spi_master_freq; in stm32_dfsdm_write_raw()
796 spi_freq = adc->dfsdm->spi_master_freq / 2; in stm32_dfsdm_write_raw()
799 spi_freq = adc->spi_freq; in stm32_dfsdm_write_raw()
803 dev_warn(&indio_dev->dev, in stm32_dfsdm_write_raw()
809 dev_err(&indio_dev->dev, in stm32_dfsdm_write_raw()
813 adc->sample_freq = val; in stm32_dfsdm_write_raw()
818 return -EINVAL; in stm32_dfsdm_write_raw()
825 struct stm32_dfsdm_adc *adc = iio_priv(indio_dev); in stm32_dfsdm_read_raw() local
830 ret = iio_hw_consumer_enable(adc->hwc); in stm32_dfsdm_read_raw()
832 dev_err(&indio_dev->dev, in stm32_dfsdm_read_raw()
834 __func__, chan->channel); in stm32_dfsdm_read_raw()
838 iio_hw_consumer_disable(adc->hwc); in stm32_dfsdm_read_raw()
840 dev_err(&indio_dev->dev, in stm32_dfsdm_read_raw()
842 __func__, chan->channel); in stm32_dfsdm_read_raw()
848 *val = adc->oversamp; in stm32_dfsdm_read_raw()
853 *val = adc->sample_freq; in stm32_dfsdm_read_raw()
858 return -EINVAL; in stm32_dfsdm_read_raw()
874 struct stm32_dfsdm_adc *adc = arg; in stm32_dfsdm_irq() local
875 struct iio_dev *indio_dev = iio_priv_to_dev(adc); in stm32_dfsdm_irq()
876 struct regmap *regmap = adc->dfsdm->regmap; in stm32_dfsdm_irq()
879 regmap_read(regmap, DFSDM_ISR(adc->fl_id), &status); in stm32_dfsdm_irq()
880 regmap_read(regmap, DFSDM_CR2(adc->fl_id), &int_en); in stm32_dfsdm_irq()
884 regmap_read(regmap, DFSDM_RDATAR(adc->fl_id), adc->buffer); in stm32_dfsdm_irq()
885 complete(&adc->completion); in stm32_dfsdm_irq()
890 dev_warn(&indio_dev->dev, "Overrun detected\n"); in stm32_dfsdm_irq()
891 regmap_update_bits(regmap, DFSDM_ICR(adc->fl_id), in stm32_dfsdm_irq()
916 struct stm32_dfsdm_adc *adc = iio_priv(indio_dev); in stm32_dfsdm_dma_release() local
918 if (adc->dma_chan) { in stm32_dfsdm_dma_release()
919 dma_free_coherent(adc->dma_chan->device->dev, in stm32_dfsdm_dma_release()
921 adc->rx_buf, adc->dma_buf); in stm32_dfsdm_dma_release()
922 dma_release_channel(adc->dma_chan); in stm32_dfsdm_dma_release()
926 static int stm32_dfsdm_dma_request(struct device *dev, in stm32_dfsdm_dma_request() argument
929 struct stm32_dfsdm_adc *adc = iio_priv(indio_dev); in stm32_dfsdm_dma_request() local
931 .src_addr = (dma_addr_t)adc->dfsdm->phys_base + in stm32_dfsdm_dma_request()
932 DFSDM_RDATAR(adc->fl_id), in stm32_dfsdm_dma_request()
937 adc->dma_chan = dma_request_chan(dev, "rx"); in stm32_dfsdm_dma_request()
938 if (IS_ERR(adc->dma_chan)) { in stm32_dfsdm_dma_request()
939 int ret = PTR_ERR(adc->dma_chan); in stm32_dfsdm_dma_request()
941 adc->dma_chan = NULL; in stm32_dfsdm_dma_request()
945 adc->rx_buf = dma_alloc_coherent(adc->dma_chan->device->dev, in stm32_dfsdm_dma_request()
947 &adc->dma_buf, GFP_KERNEL); in stm32_dfsdm_dma_request()
948 if (!adc->rx_buf) { in stm32_dfsdm_dma_request()
949 ret = -ENOMEM; in stm32_dfsdm_dma_request()
953 ret = dmaengine_slave_config(adc->dma_chan, &config); in stm32_dfsdm_dma_request()
960 dma_free_coherent(adc->dma_chan->device->dev, DFSDM_DMA_BUFFER_SIZE, in stm32_dfsdm_dma_request()
961 adc->rx_buf, adc->dma_buf); in stm32_dfsdm_dma_request()
963 dma_release_channel(adc->dma_chan); in stm32_dfsdm_dma_request()
971 struct stm32_dfsdm_adc *adc = iio_priv(indio_dev); in stm32_dfsdm_adc_chan_init_one() local
974 ret = stm32_dfsdm_channel_parse_of(adc->dfsdm, indio_dev, ch); in stm32_dfsdm_adc_chan_init_one()
978 ch->type = IIO_VOLTAGE; in stm32_dfsdm_adc_chan_init_one()
979 ch->indexed = 1; in stm32_dfsdm_adc_chan_init_one()
985 ch->info_mask_separate = BIT(IIO_CHAN_INFO_RAW); in stm32_dfsdm_adc_chan_init_one()
986 ch->info_mask_shared_by_all = BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO); in stm32_dfsdm_adc_chan_init_one()
988 if (adc->dev_data->type == DFSDM_AUDIO) { in stm32_dfsdm_adc_chan_init_one()
989 ch->ext_info = dfsdm_adc_audio_ext_info; in stm32_dfsdm_adc_chan_init_one()
991 ch->scan_type.shift = 8; in stm32_dfsdm_adc_chan_init_one()
993 ch->scan_type.sign = 's'; in stm32_dfsdm_adc_chan_init_one()
994 ch->scan_type.realbits = 24; in stm32_dfsdm_adc_chan_init_one()
995 ch->scan_type.storagebits = 32; in stm32_dfsdm_adc_chan_init_one()
997 return stm32_dfsdm_chan_configure(adc->dfsdm, in stm32_dfsdm_adc_chan_init_one()
998 &adc->dfsdm->ch_list[ch->channel]); in stm32_dfsdm_adc_chan_init_one()
1001 static int stm32_dfsdm_audio_init(struct device *dev, struct iio_dev *indio_dev) in stm32_dfsdm_audio_init() argument
1004 struct stm32_dfsdm_adc *adc = iio_priv(indio_dev); in stm32_dfsdm_audio_init() local
1008 indio_dev->modes |= INDIO_BUFFER_SOFTWARE; in stm32_dfsdm_audio_init()
1009 indio_dev->setup_ops = &stm32_dfsdm_buffer_setup_ops; in stm32_dfsdm_audio_init()
1011 ch = devm_kzalloc(&indio_dev->dev, sizeof(*ch), GFP_KERNEL); in stm32_dfsdm_audio_init()
1013 return -ENOMEM; in stm32_dfsdm_audio_init()
1015 ch->scan_index = 0; in stm32_dfsdm_audio_init()
1019 dev_err(&indio_dev->dev, "Channels init failed\n"); in stm32_dfsdm_audio_init()
1022 ch->info_mask_separate = BIT(IIO_CHAN_INFO_SAMP_FREQ); in stm32_dfsdm_audio_init()
1024 d_ch = &adc->dfsdm->ch_list[ch->channel]; in stm32_dfsdm_audio_init()
1025 if (d_ch->src != DFSDM_CHANNEL_SPI_CLOCK_EXTERNAL) in stm32_dfsdm_audio_init()
1026 adc->spi_freq = adc->dfsdm->spi_master_freq; in stm32_dfsdm_audio_init()
1028 indio_dev->num_channels = 1; in stm32_dfsdm_audio_init()
1029 indio_dev->channels = ch; in stm32_dfsdm_audio_init()
1031 return stm32_dfsdm_dma_request(dev, indio_dev); in stm32_dfsdm_audio_init()
1034 static int stm32_dfsdm_adc_init(struct device *dev, struct iio_dev *indio_dev) in stm32_dfsdm_adc_init() argument
1037 struct stm32_dfsdm_adc *adc = iio_priv(indio_dev); in stm32_dfsdm_adc_init() local
1041 adc->oversamp = DFSDM_DEFAULT_OVERSAMPLING; in stm32_dfsdm_adc_init()
1042 ret = stm32_dfsdm_set_osrs(&adc->dfsdm->fl_list[adc->fl_id], 0, in stm32_dfsdm_adc_init()
1043 adc->oversamp); in stm32_dfsdm_adc_init()
1047 num_ch = of_property_count_u32_elems(indio_dev->dev.of_node, in stm32_dfsdm_adc_init()
1048 "st,adc-channels"); in stm32_dfsdm_adc_init()
1049 if (num_ch < 0 || num_ch > adc->dfsdm->num_chs) { in stm32_dfsdm_adc_init()
1050 dev_err(&indio_dev->dev, "Bad st,adc-channels\n"); in stm32_dfsdm_adc_init()
1051 return num_ch < 0 ? num_ch : -EINVAL; in stm32_dfsdm_adc_init()
1055 adc->hwc = devm_iio_hw_consumer_alloc(&indio_dev->dev); in stm32_dfsdm_adc_init()
1056 if (IS_ERR(adc->hwc)) in stm32_dfsdm_adc_init()
1057 return -EPROBE_DEFER; in stm32_dfsdm_adc_init()
1059 ch = devm_kcalloc(&indio_dev->dev, num_ch, sizeof(*ch), in stm32_dfsdm_adc_init()
1062 return -ENOMEM; in stm32_dfsdm_adc_init()
1068 dev_err(&indio_dev->dev, "Channels init failed\n"); in stm32_dfsdm_adc_init()
1073 indio_dev->num_channels = num_ch; in stm32_dfsdm_adc_init()
1074 indio_dev->channels = ch; in stm32_dfsdm_adc_init()
1076 init_completion(&adc->completion); in stm32_dfsdm_adc_init()
1093 .compatible = "st,stm32-dfsdm-adc",
1097 .compatible = "st,stm32-dfsdm-dmic",
1105 struct device *dev = &pdev->dev; in stm32_dfsdm_adc_probe() local
1106 struct stm32_dfsdm_adc *adc; in stm32_dfsdm_adc_probe() local
1107 struct device_node *np = dev->of_node; in stm32_dfsdm_adc_probe()
1113 dev_data = of_device_get_match_data(dev); in stm32_dfsdm_adc_probe()
1114 iio = devm_iio_device_alloc(dev, sizeof(*adc)); in stm32_dfsdm_adc_probe()
1116 dev_err(dev, "%s: Failed to allocate IIO\n", __func__); in stm32_dfsdm_adc_probe()
1117 return -ENOMEM; in stm32_dfsdm_adc_probe()
1120 adc = iio_priv(iio); in stm32_dfsdm_adc_probe()
1121 adc->dfsdm = dev_get_drvdata(dev->parent); in stm32_dfsdm_adc_probe()
1123 iio->dev.parent = dev; in stm32_dfsdm_adc_probe()
1124 iio->dev.of_node = np; in stm32_dfsdm_adc_probe()
1125 iio->modes = INDIO_DIRECT_MODE | INDIO_BUFFER_SOFTWARE; in stm32_dfsdm_adc_probe()
1127 platform_set_drvdata(pdev, adc); in stm32_dfsdm_adc_probe()
1129 ret = of_property_read_u32(dev->of_node, "reg", &adc->fl_id); in stm32_dfsdm_adc_probe()
1130 if (ret != 0 || adc->fl_id >= adc->dfsdm->num_fls) { in stm32_dfsdm_adc_probe()
1131 dev_err(dev, "Missing or bad reg property\n"); in stm32_dfsdm_adc_probe()
1132 return -EINVAL; in stm32_dfsdm_adc_probe()
1135 name = devm_kzalloc(dev, sizeof("dfsdm-adc0"), GFP_KERNEL); in stm32_dfsdm_adc_probe()
1137 return -ENOMEM; in stm32_dfsdm_adc_probe()
1138 if (dev_data->type == DFSDM_AUDIO) { in stm32_dfsdm_adc_probe()
1139 iio->info = &stm32_dfsdm_info_audio; in stm32_dfsdm_adc_probe()
1140 snprintf(name, sizeof("dfsdm-pdm0"), "dfsdm-pdm%d", adc->fl_id); in stm32_dfsdm_adc_probe()
1142 iio->info = &stm32_dfsdm_info_adc; in stm32_dfsdm_adc_probe()
1143 snprintf(name, sizeof("dfsdm-adc0"), "dfsdm-adc%d", adc->fl_id); in stm32_dfsdm_adc_probe()
1145 iio->name = name; in stm32_dfsdm_adc_probe()
1153 if (irq != -EPROBE_DEFER) in stm32_dfsdm_adc_probe()
1154 dev_err(dev, "Failed to get IRQ: %d\n", irq); in stm32_dfsdm_adc_probe()
1158 ret = devm_request_irq(dev, irq, stm32_dfsdm_irq, in stm32_dfsdm_adc_probe()
1159 0, pdev->name, adc); in stm32_dfsdm_adc_probe()
1161 dev_err(dev, "Failed to request IRQ\n"); in stm32_dfsdm_adc_probe()
1165 ret = of_property_read_u32(dev->of_node, "st,filter-order", &val); in stm32_dfsdm_adc_probe()
1167 dev_err(dev, "Failed to set filter order\n"); in stm32_dfsdm_adc_probe()
1171 adc->dfsdm->fl_list[adc->fl_id].ford = val; in stm32_dfsdm_adc_probe()
1173 ret = of_property_read_u32(dev->of_node, "st,filter0-sync", &val); in stm32_dfsdm_adc_probe()
1175 adc->dfsdm->fl_list[adc->fl_id].sync_mode = val; in stm32_dfsdm_adc_probe()
1177 adc->dev_data = dev_data; in stm32_dfsdm_adc_probe()
1178 ret = dev_data->init(dev, iio); in stm32_dfsdm_adc_probe()
1186 if (dev_data->type == DFSDM_AUDIO) { in stm32_dfsdm_adc_probe()
1187 ret = of_platform_populate(np, NULL, NULL, dev); in stm32_dfsdm_adc_probe()
1189 dev_err(dev, "Failed to find an audio DAI\n"); in stm32_dfsdm_adc_probe()
1206 struct stm32_dfsdm_adc *adc = platform_get_drvdata(pdev); in stm32_dfsdm_adc_remove() local
1207 struct iio_dev *indio_dev = iio_priv_to_dev(adc); in stm32_dfsdm_adc_remove()
1209 if (adc->dev_data->type == DFSDM_AUDIO) in stm32_dfsdm_adc_remove()
1210 of_platform_depopulate(&pdev->dev); in stm32_dfsdm_adc_remove()
1219 .name = "stm32-dfsdm-adc",
1227 MODULE_DESCRIPTION("STM32 sigma delta ADC");