Skip to content

Commit 1d71814

Browse files
spectrum70nunojsa
authored andcommitted
iio: dac: ad3552r-hs: add support for internal ramp
The ad3552r can be feeded from the HDL controller by an internally generated 16bit ramp, useful for debug pourposes. Add debugfs a file to enable or disable it. Signed-off-by: Angelo Dureghello <adureghello@baylibre.com> Link: https://patch.msgid.link/20250409-wip-bl-ad3552r-fixes-v5-5-fb429c3a6515@baylibre.com Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
1 parent b982267 commit 1d71814

File tree

1 file changed

+156
-6
lines changed

1 file changed

+156
-6
lines changed

drivers/iio/dac/ad3552r-hs.c

Lines changed: 156 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
*/
88

99
#include <linux/bitfield.h>
10+
#include <linux/debugfs.h>
1011
#include <linux/delay.h>
1112
#include <linux/gpio/consumer.h>
1213
#include <linux/iio/backend.h>
@@ -54,6 +55,18 @@ struct ad3552r_hs_state {
5455
struct ad3552r_hs_platform_data *data;
5556
/* INTERFACE_CONFIG_D register cache, in DDR we cannot read values. */
5657
u32 config_d;
58+
/* Protects backend I/O operations from concurrent accesses. */
59+
struct mutex lock;
60+
};
61+
62+
enum ad3552r_sources {
63+
AD3552R_SRC_NORMAL,
64+
AD3552R_SRC_RAMP_16BIT,
65+
};
66+
67+
static const char * const dbgfs_attr_source[] = {
68+
[AD3552R_SRC_NORMAL] = "normal",
69+
[AD3552R_SRC_RAMP_16BIT] = "ramp-16bit",
5770
};
5871

5972
static int ad3552r_hs_reg_read(struct ad3552r_hs_state *st, u32 reg, u32 *val,
@@ -65,6 +78,20 @@ static int ad3552r_hs_reg_read(struct ad3552r_hs_state *st, u32 reg, u32 *val,
6578
return st->data->bus_reg_read(st->back, reg, val, xfer_size);
6679
}
6780

81+
static int ad3552r_hs_set_data_source(struct ad3552r_hs_state *st,
82+
enum iio_backend_data_source type)
83+
{
84+
int i, ret;
85+
86+
for (i = 0; i < st->model_data->num_hw_channels; ++i) {
87+
ret = iio_backend_data_source_set(st->back, i, type);
88+
if (ret)
89+
return ret;
90+
}
91+
92+
return 0;
93+
}
94+
6895
static int ad3552r_hs_update_reg_bits(struct ad3552r_hs_state *st, u32 reg,
6996
u32 mask, u32 val, size_t xfer_size)
7097
{
@@ -480,6 +507,103 @@ static int ad3552r_hs_reg_access(struct iio_dev *indio_dev, unsigned int reg,
480507
return st->data->bus_reg_write(st->back, reg, writeval, 1);
481508
}
482509

510+
static ssize_t ad3552r_hs_show_data_source(struct file *f, char __user *userbuf,
511+
size_t count, loff_t *ppos)
512+
{
513+
struct ad3552r_hs_state *st = file_inode(f)->i_private;
514+
enum iio_backend_data_source type;
515+
int idx, ret;
516+
517+
guard(mutex)(&st->lock);
518+
519+
ret = iio_backend_data_source_get(st->back, 0, &type);
520+
if (ret)
521+
return ret;
522+
523+
switch (type) {
524+
case IIO_BACKEND_INTERNAL_RAMP_16BIT:
525+
idx = AD3552R_SRC_RAMP_16BIT;
526+
break;
527+
case IIO_BACKEND_EXTERNAL:
528+
idx = AD3552R_SRC_NORMAL;
529+
break;
530+
default:
531+
return -EINVAL;
532+
}
533+
534+
return simple_read_from_buffer(userbuf, count, ppos,
535+
dbgfs_attr_source[idx],
536+
strlen(dbgfs_attr_source[idx]));
537+
}
538+
539+
static ssize_t ad3552r_hs_write_data_source(struct file *f,
540+
const char __user *userbuf,
541+
size_t count, loff_t *ppos)
542+
{
543+
struct ad3552r_hs_state *st = file_inode(f)->i_private;
544+
char buf[64];
545+
int ret, source;
546+
547+
guard(mutex)(&st->lock);
548+
549+
ret = simple_write_to_buffer(buf, sizeof(buf) - 1, ppos, userbuf,
550+
count);
551+
if (ret < 0)
552+
return ret;
553+
554+
buf[count] = '\0';
555+
556+
ret = match_string(dbgfs_attr_source, ARRAY_SIZE(dbgfs_attr_source),
557+
buf);
558+
if (ret < 0)
559+
return ret;
560+
561+
switch (ret) {
562+
case AD3552R_SRC_RAMP_16BIT:
563+
source = IIO_BACKEND_INTERNAL_RAMP_16BIT;
564+
break;
565+
case AD3552R_SRC_NORMAL:
566+
source = IIO_BACKEND_EXTERNAL;
567+
break;
568+
default:
569+
return -EINVAL;
570+
}
571+
572+
ret = ad3552r_hs_set_data_source(st, source);
573+
if (ret)
574+
return ret;
575+
576+
return count;
577+
}
578+
579+
static ssize_t ad3552r_hs_show_data_source_avail(struct file *f,
580+
char __user *userbuf,
581+
size_t count, loff_t *ppos)
582+
{
583+
ssize_t len = 0;
584+
char buf[128];
585+
int i;
586+
587+
for (i = 0; i < ARRAY_SIZE(dbgfs_attr_source); i++) {
588+
len += scnprintf(buf + len, PAGE_SIZE - len, "%s ",
589+
dbgfs_attr_source[i]);
590+
}
591+
buf[len - 1] = '\n';
592+
593+
return simple_read_from_buffer(userbuf, count, ppos, buf, len);
594+
}
595+
596+
static const struct file_operations ad3552r_hs_data_source_fops = {
597+
.owner = THIS_MODULE,
598+
.write = ad3552r_hs_write_data_source,
599+
.read = ad3552r_hs_show_data_source,
600+
};
601+
602+
static const struct file_operations ad3552r_hs_data_source_avail_fops = {
603+
.owner = THIS_MODULE,
604+
.read = ad3552r_hs_show_data_source_avail,
605+
};
606+
483607
static int ad3552r_hs_setup(struct ad3552r_hs_state *st)
484608
{
485609
u16 id;
@@ -547,11 +671,7 @@ static int ad3552r_hs_setup(struct ad3552r_hs_state *st)
547671
if (ret)
548672
return ret;
549673

550-
ret = iio_backend_data_source_set(st->back, 0, IIO_BACKEND_EXTERNAL);
551-
if (ret)
552-
return ret;
553-
554-
ret = iio_backend_data_source_set(st->back, 1, IIO_BACKEND_EXTERNAL);
674+
ret = ad3552r_hs_set_data_source(st, IIO_BACKEND_EXTERNAL);
555675
if (ret)
556676
return ret;
557677

@@ -658,6 +778,26 @@ static const struct iio_info ad3552r_hs_info = {
658778
.debugfs_reg_access = &ad3552r_hs_reg_access,
659779
};
660780

781+
static void ad3552r_hs_debugfs_init(struct iio_dev *indio_dev)
782+
{
783+
struct ad3552r_hs_state *st = iio_priv(indio_dev);
784+
struct dentry *d = iio_get_debugfs_dentry(indio_dev);
785+
786+
if (!IS_ENABLED(CONFIG_DEBUG_FS))
787+
return;
788+
789+
d = iio_get_debugfs_dentry(indio_dev);
790+
if (!d) {
791+
dev_warn(st->dev, "can't set debugfs in driver dir\n");
792+
return;
793+
}
794+
795+
debugfs_create_file("data_source", 0600, d, st,
796+
&ad3552r_hs_data_source_fops);
797+
debugfs_create_file("data_source_available", 0600, d, st,
798+
&ad3552r_hs_data_source_avail_fops);
799+
}
800+
661801
static int ad3552r_hs_probe(struct platform_device *pdev)
662802
{
663803
struct ad3552r_hs_state *st;
@@ -702,7 +842,17 @@ static int ad3552r_hs_probe(struct platform_device *pdev)
702842
if (ret)
703843
return ret;
704844

705-
return devm_iio_device_register(&pdev->dev, indio_dev);
845+
ret = devm_iio_device_register(&pdev->dev, indio_dev);
846+
if (ret)
847+
return ret;
848+
849+
ret = devm_mutex_init(&pdev->dev, &st->lock);
850+
if (ret)
851+
return ret;
852+
853+
ad3552r_hs_debugfs_init(indio_dev);
854+
855+
return ret;
706856
}
707857

708858
static const struct of_device_id ad3552r_hs_of_id[] = {

0 commit comments

Comments
 (0)