10000 iio: logic: M2K LA add delay taps control · analogdevicesinc/linux@a1641c6 · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

Commit a1641c6

Browse files
btogoreancommodo
authored andcommitted
iio: logic: M2K LA add delay taps control
The number of delay taps in the LA data path can be controlled manually or automatically according to the axi_adc_decimate's rate. This commit adds support for such control in driver. Signed-off-by: Bogdan Togorean <bogdan.togorean@analog.com>
1 parent 2296460 commit a1641c6

File tree

1 file changed

+133
-0
lines changed

1 file changed

+133
-0
lines changed

drivers/iio/logic/m2k-logic-analyzer.c

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
#define M2K_LA_REG_TRIGGERED 0x48
3131
#define M2K_LA_REG_STREAMING 0x4c
3232
#define M2K_LA_REG_INSTRUMENT_TRIGGER 0x54
33+
#define M2K_LA_REG_DATA_DELAY_CONFIG 0x58
3334

3435
#define M2K_LA_TRIGGER_EDGE_ANY 0
3536
#define M2K_LA_TRIGGER_EDGE_RISING 1
@@ -44,6 +45,10 @@
4445
#define M2K_LA_TRIGGER_SOURCE_MASK GENMASK(19, 16)
4546
#define M2K_LA_TRIGGER_EXT_SOURCE_MASK GENMASK(17, 16)
4647

48+
#define M2K_LA_IN_DATA_DELAY_MASK GENMASK(5, 0)
49+
#define M2K_LA_IN_DATA_AUTO_DELAY_MASK BIT(8)
50+
#define M2K_LA_IN_DATA_DELAY_MUX_MASK BIT(9)
51+
4752
struct m2k_la {
4853
void __iomem *regs;
4954

@@ -391,6 +396,120 @@ static ssize_t m2k_la_get_triggered(struct iio_dev *indio_dev,
391396
return scnprintf(buf, PAGE_SIZE, "%d\n", val);
392397
}
393398

399+
static int m2k_la_set_data_delay_auto(struct iio_dev *indio_dev,
400+
const struct iio_chan_spec *chan, unsigned int val)
401+
{
402+
struct m2k_la *m2k_la = iio_device_get_drvdata(indio_dev);
403+
404+
mutex_lock(&m2k_la->lock);
405+
406+
m2k_la_update(m2k_la, M2K_LA_REG_DATA_DELAY_CONFIG,
407+
FIELD_PREP(M2K_LA_IN_DATA_AUTO_DELAY_MASK, val),
408+
M2K_LA_IN_DATA_AUTO_DELAY_MASK);
409+
410+
mutex_unlock(&m2k_la->lock);
411+
412+
return 0;
413+
}
414+
415+
static int m2k_la_get_data_delay_auto(struct iio_dev *indio_dev,
416+
const struct iio_chan_spec *chan)
417+
{
418+
struct m2k_la *m2k_la = iio_device_get_drvdata(indio_dev);
419+
unsigned int val;
420+
421+
val = m2k_la_read(m2k_la, M2K_LA_REG_DATA_DELAY_CONFIG);
422+
val = FIELD_GET(M2K_LA_IN_DATA_AUTO_DELAY_MASK, val);
423+
424+
return val;
425+
}
426+
427+
static const char * const m2k_la_data_delay_auto_items[] = {
428+
"auto",
429+
"manual"
430+
};
431+
432+
static const struct iio_enum m2k_la_data_delay_auto_enum = {
433+
.items = m2k_la_data_delay_auto_items,
434+
.num_items = ARRAY_SIZE(m2k_la_data_delay_auto_items),
435+
.set = m2k_la_set_data_delay_auto,
436+
.get = m2k_la_get_data_delay_auto,
437+
};
438+
439+
static int m2k_la_set_rate_mux(struct iio_dev *indio_dev,
440+
const struct iio_chan_spec *chan, unsigned int val)
441+
{
442+
struct m2k_la *m2k_la = iio_device_get_drvdata(indio_dev);
443+
444+
mutex_lock(&m2k_la->lock);
445+
446+
m2k_la_update(m2k_la, M2K_LA_REG_DATA_DELAY_CONFIG,
447+
FIELD_PREP(M2K_LA_IN_DATA_DELAY_MUX_MASK, val),
448+
M2K_LA_IN_DATA_DELAY_MUX_MASK);
449+
450+
mutex_unlock(&m2k_la->lock);
451+
452+
return 0;
453+
}
454+
455+
static int m2k_la_get_rate_mux(struct iio_dev *indio_dev,
456+
const struct iio_chan_spec *chan)
457+
{
458+
struct m2k_la *m2k_la = iio_device_get_drvdata(indio_dev);
459+
unsigned int val;
460+
461+
val = m2k_la_read(m2k_la, M2K_LA_REG_DATA_DELAY_CONFIG);
462+
val = FIELD_GET(M2K_LA_IN_DATA_DELAY_MUX_MASK, val);
463+
464+
return val;
465+
}
466+
467+
static const char * const m2k_la_rate_mux_items[] = {
468+
"logic_analyzer",
469+
"oscilloscope"
470+
};
471+
472+
static const struct iio_enum m2k_la_rate_mux_enum = {
473+
.items = m2k_la_rate_mux_items,
474+
.num_items = ARRAY_SIZE(m2k_la_rate_mux_items),
475+
.set = m2k_la_set_rate_mux,
476+
.get = m2k_la_get_rate_mux,
477+
};
478+
479+
static ssize_t m2k_la_set_in_data_delay(struct iio_dev *indio_dev,
480+
uintptr_t priv, const struct iio_chan_spec *chan, const char *buf,
481+
size_t len)
482+
{
483+
struct m2k_la *m2k_la = iio_device_get_drvdata(indio_dev);
484+
unsigned int val;
485+
int ret;
486+
487+
ret = kstrtouint(buf, 10, &val);
488+
if (ret < 0)
489+
return ret;
490+
491+
mutex_lock(&m2k_la->lock);
492+
493+
m2k_la_update(m2k_la, M2K_LA_REG_DATA_DELAY_CONFIG, val,
494+
M2K_LA_IN_DATA_DELAY_MASK);
495+
496+
mutex_unlock(&m2k_la->lock);
497+
498+
return len;
499+
}
500+
501+
static ssize_t m2k_la_get_in_data_delay(struct iio_dev *indio_dev,
502+
uintptr_t priv, const struct iio_chan_spec *chan, char *buf)
503+
{
504+
struct m2k_la *m2k_la = iio_device_get_drvdata(indio_dev);
505+
unsigned int val;
506+
507+
val = m2k_la_read(m2k_la, M2K_LA_REG_DATA_DELAY_CONFIG);
508+
val = FIELD_GET(M2K_LA_IN_DATA_DELAY_MASK, val);
509+
510+
return scnprintf(buf, PAGE_SIZE, "%u\n", val);
511+
}
512+
394513
static ssize_t m2k_la_get_streaming(struct iio_dev *indio_dev,
395514
uintptr_t priv, const struct iio_chan_spec *chan, char *buf)
396515
{
@@ -430,6 +549,14 @@ static const struct iio_chan_spec_ext_info m2k_la_rx_ext_info[] = {
430549
&m2k_la_trigger_mux_out_enum),
431550
IIO_ENUM_AVAILABLE("trigger_mux_out",
432551
&m2k_la_trigger_mux_out_enum),
552+
IIO_ENUM("data_delay_auto", IIO_SHARED_BY_ALL,
553+
&m2k_la_data_delay_auto_enum),
554+
IIO_ENUM_AVAILABLE_SHARED("data_delay_auto", IIO_SHARED_BY_ALL,
555+
&m2k_la_data_delay_auto_enum),
556+
IIO_ENUM("rate_mux", IIO_SHARED_BY_ALL,
557+
&m2k_la_rate_mux_enum),
558+
IIO_ENUM_AVAILABLE_SHARED("rate_mux", IIO_SHARED_BY_ALL,
559+
&m2k_la_rate_mux_enum),
433560
{
434561
.name = "trigger_delay",
435562
.shared = IIO_SHARED_BY_TYPE,
@@ -442,6 +569,12 @@ static const struct iio_chan_spec_ext_info m2k_la_rx_ext_info[] = {
442569
.read = m2k_la_get_triggered,
443570
.write = m2k_la_set_triggered,
444571
},
572+
{
573+
.name = "data_in_delay",
574+
.shared = IIO_SHARED_BY_ALL,
575+
.read = m2k_la_get_in_data_delay,
576+
.write = m2k_la_set_in_data_delay,
577+
},
445578
{
446579
.name = "streaming",
447580
.shared = IIO_SHARED_BY_ALL,

0 commit comments

Comments
 (0)
0