7
7
*/
8
8
9
9
#include <linux/bitfield.h>
10
+ #include <linux/debugfs.h>
10
11
#include <linux/delay.h>
11
12
#include <linux/gpio/consumer.h>
12
13
#include <linux/iio/backend.h>
@@ -54,6 +55,18 @@ struct ad3552r_hs_state {
54
55
struct ad3552r_hs_platform_data * data ;
55
56
/* INTERFACE_CONFIG_D register cache, in DDR we cannot read values. */
56
57
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" ,
57
70
};
58
71
59
72
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,
65
78
return st -> data -> bus_reg_read (st -> back , reg , val , xfer_size );
66
79
}
67
80
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
+
68
95
static int ad3552r_hs_update_reg_bits (struct ad3552r_hs_state * st , u32 reg ,
69
96
u32 mask , u32 val , size_t xfer_size )
70
97
{
@@ -480,6 +507,103 @@ static int ad3552r_hs_reg_access(struct iio_dev *indio_dev, unsigned int reg,
480
507
return st -> data -> bus_reg_write (st -> back , reg , writeval , 1 );
481
508
}
482
509
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
+
483
607
static int ad3552r_hs_setup (struct ad3552r_hs_state * st )
484
608
{
485
609
u16 id ;
@@ -547,11 +671,7 @@ static int ad3552r_hs_setup(struct ad3552r_hs_state *st)
547
671
if (ret )
548
672
return ret ;
549
673
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 );
555
675
if (ret )
556
676
return ret ;
557
677
@@ -658,6 +778,26 @@ static const struct iio_info ad3552r_hs_info = {
658
778
.debugfs_reg_access = & ad3552r_hs_reg_access ,
659
779
};
660
780
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
+
661
801
static int ad3552r_hs_probe (struct platform_device * pdev )
662
802
{
663
803
struct ad3552r_hs_state * st ;
@@ -702,7 +842,17 @@ static int ad3552r_hs_probe(struct platform_device *pdev)
702
842
if (ret )
703
843
return ret ;
704
844
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 ;
706
856
}
707
857
708
858
static const struct of_device_id ad3552r_hs_of_id [] = {
0 commit comments