21
21
#include <linux/pm.h>
22
22
#include <linux/mfd/palmas.h>
23
23
#include <linux/completion.h>
24
+ #include <linux/of.h>
25
+ #include <linux/of_device.h>
24
26
#include <linux/iio/iio.h>
25
27
#include <linux/iio/machine.h>
26
28
#include <linux/iio/driver.h>
@@ -460,6 +462,34 @@ static const struct iio_chan_spec palmas_gpadc_iio_channel[] = {
460
462
PALMAS_ADC_CHAN_IIO (IN15 , IIO_VOLTAGE , IIO_CHAN_INFO_PROCESSED ),
461
463
};
462
464
465
+ static int palmas_gpadc_get_adc_dt_data (struct platform_device * pdev ,
466
+ struct palmas_gpadc_platform_data * * gpadc_pdata )
467
+ {
468
+ struct device_node * np = pdev -> dev .of_node ;
469
+ struct palmas_gpadc_platform_data * gp_data ;
470
+ int ret ;
471
+ u32 pval ;
472
+
473
+ gp_data = devm_kzalloc (& pdev -> dev , sizeof (* gp_data ), GFP_KERNEL );
474
+ if (!gp_data )
475
+ return - ENOMEM ;
476
+
477
+ ret = of_property_read_u32 (np , "ti,channel0-current-microamp" , & pval );
478
+ if (!ret )
479
+ gp_data -> ch0_current = pval ;
480
+
481
+ ret = of_property_read_u32 (np , "ti,channel3-current-microamp" , & pval );
482
+ if (!ret )
483
+ gp_data -> ch3_current = pval ;
484
+
485
+ gp_data -> extended_delay = of_property_read_bool (np ,
486
+ "ti,enable-extended-delay" );
487
+
488
+ * gpadc_pdata = gp_data ;
489
+
490
+ return 0 ;
491
+ }
492
+
463
493
static int palmas_gpadc_probe (struct platform_device * pdev )
464
494
{
465
495
struct palmas_gpadc * adc ;
@@ -469,12 +499,17 @@ static int palmas_gpadc_probe(struct platform_device *pdev)
469
499
int ret , i ;
470
500
471
501
pdata = dev_get_platdata (pdev -> dev .parent );
472
- if (!pdata || !pdata -> gpadc_pdata ) {
473
- dev_err (& pdev -> dev , "No platform data\n" );
474
- return - ENODEV ;
475
- }
476
502
477
- gpadc_pdata = pdata -> gpadc_pdata ;
503
+ if (pdata && pdata -> gpadc_pdata )
504
+ gpadc_pdata = pdata -> gpadc_pdata ;
505
+
506
+ if (!gpadc_pdata && pdev -> dev .of_node ) {
507
+ ret = palmas_gpadc_get_adc_dt_data (pdev , & gpadc_pdata );
508
+ if (ret < 0 )
509
+ return ret ;
510
+ }
511
+ if (!gpadc_pdata )
512
+ return - EINVAL ;
478
513
479
514
indio_dev = devm_iio_device_alloc (& pdev -> dev , sizeof (* adc ));
480
515
if (!indio_dev ) {
@@ -790,12 +825,19 @@ static const struct dev_pm_ops palmas_pm_ops = {
790
825
palmas_gpadc_resume )
791
826
};
792
827
828
+ static const struct of_device_id of_palmas_gpadc_match_tbl [] = {
829
+ { .compatible = "ti,palmas-gpadc" , },
830
+ { /* end */ }
831
+ };
832
+ MODULE_DEVICE_TABLE (of , of_palmas_gpadc_match_tbl );
833
+
793
834
static struct platform_driver palmas_gpadc_driver = {
794
835
.probe = palmas_gpadc_probe ,
795
836
.remove = palmas_gpadc_remove ,
796
837
.driver = {
797
838
.name = MOD_NAME ,
798
839
.pm = & palmas_pm_ops ,
840
+ .of_match_table = of_palmas_gpadc_match_tbl ,
799
841
},
800
842
};
801
843
0 commit comments