11
11
#include <linux/module.h>
12
12
#include <linux/platform_data/emc2305.h>
13
13
#include <linux/thermal.h>
14
+ #include <linux/pwm.h>
15
+ #include <linux/of_device.h>
16
+ #include <linux/util_macros.h>
14
17
15
18
#define EMC2305_REG_DRIVE_FAIL_STATUS 0x27
16
19
#define EMC2305_REG_VENDOR 0xfe
23
26
#define EMC2305_TACH_REGS_UNUSE_BITS 3
24
27
#define EMC2305_TACH_CNT_MULTIPLIER 0x02
25
28
#define EMC2305_TACH_RANGE_MIN 480
29
+ #define EMC2305_DEFAULT_OUTPUT 0x0
30
+ #define EMC2305_DEFAULT_POLARITY 0x0
26
31
27
32
#define EMC2305_PWM_DUTY2STATE (duty , max_state , pwm_max ) \
28
33
DIV_ROUND_CLOSEST((duty) * (max_state), (pwm_max))
39
44
#define EMC2305_REG_FAN_MIN_DRIVE (n ) (0x38 + 0x10 * (n))
40
45
#define EMC2305_REG_FAN_TACH (n ) (0x3e + 0x10 * (n))
41
46
47
+ /* Supported base PWM frequencies */
48
+ static const unsigned int base_freq_table [] = { 2441 , 4882 , 19530 , 26000 };
49
+
42
50
enum emc230x_product_id {
43
51
EMC2305 = 0x34 ,
44
52
EMC2303 = 0x35 ,
@@ -287,7 +295,7 @@ static int emc2305_set_pwm(struct device *dev, long val, int channel)
287
295
return 0 ;
288
296
}
289
297
290
- static int emc2305_set_single_tz (struct device * dev , int idx )
298
+ static int emc2305_set_single_tz (struct device * dev , struct device_node * fan_node , int idx )
291
299
{
292
300
struct emc2305_data * data = dev_get_drvdata (dev );
293
301
long pwm ;
@@ -297,7 +305,7 @@ static int emc2305_set_single_tz(struct device *dev, int idx)
297
305
pwm = data -> pwm_min [cdev_idx ];
298
306
299
307
data -> cdev_data [cdev_idx ].cdev =
300
- devm_thermal_of_cooling_device_register (dev , dev -> of_node ,
308
+ devm_thermal_of_cooling_device_register (dev , fan_node ,
301
309
emc2305_fan_name [idx ], data ,
302
310
& emc2305_cooling_ops );
303
311
@@ -332,10 +340,10 @@ static int emc2305_set_tz(struct device *dev)
332
340
int i , ret ;
333
341
334
342
if (!data -> pwm_separate )
335
- return emc2305_set_single_tz (dev , 0 );
343
+ return emc2305_set_single_tz (dev , dev -> of_node , 0 );
336
344
337
345
for (i = 0 ; i < data -> pwm_num ; i ++ ) {
338
- ret = emc2305_set_single_tz (dev , i + 1 );
346
+ ret = emc2305_set_single_tz (dev , dev -> of_node , i + 1 );
339
347
if (ret )
340
348
return ret ;
341
349
}
@@ -517,15 +525,85 @@ static int emc2305_identify(struct device *dev)
517
525
return 0 ;
518
526
}
519
527
528
+ static int emc2305_of_parse_pwm_child (struct device * dev ,
529
+ struct device_node * child ,
530
+ struct emc2305_data * data )
531
+ { u32 ch ;
532
+ int ret ;
533
+ struct of_phandle_args args ;
534
+
535
+ ret = of_property_read_u32 (child , "reg" , & ch );
536
+ if (ret ) {
537
+ dev_err (dev , "missing reg property of %pOFn\n" , child );
538
+ return ret ;
539
+ }
540
+
541
+ ret = of_parse_phandle_with_args (child , "pwms" , "#pwm-cells" , 0 , & args );
542
+
543
+ if (ret )
544
+ return ret ;
545
+
546
+ if (args .args_count > 0 ) {
547
+ data -> pwm_freq [ch ] = find_closest (args .args [0 ], base_freq_table ,
548
+ ARRAY_SIZE (base_freq_table ));
549
+ } else {
550
+ data -> pwm_freq [ch ] = base_freq_table [3 ];
551
+ }
552
+
553
+ if (args .args_count > 1 ) {
554
+ if (args .args [1 ] == PWM_POLARITY_NORMAL || args .args [1 ] == PWM_POLARITY_INVERSED )
555
+ data -> pwm_polarity_mask |= args .args [1 ] << ch ;
556
+ else
557
+ dev_err (dev , "Wrong PWM polarity config provided: %d\n" , args .args [0 ]);
558
+ } else {
559
+ data -> pwm_polarity_mask |= PWM_POLARITY_NORMAL << ch ;
560
+ }
561
+
562
+ if (args .args_count > 2 ) {
563
+ if (args .args [2 ] == EMC2305_PUSH_PULL || args .args [2 ] <= EMC2305_OPEN_DRAIN )
564
+ data -> pwm_output_mask |= args .args [2 ] << ch ;
565
+ else
566
+ dev_err (dev , "Wrong PWM output config provided: %d\n" , args .args [1 ]);
567
+ } else {
568
+ data -> pwm_output_mask |= EMC2305_OPEN_DRAIN << ch ;
569
+ }
570
+
571
+ return 0 ;
572
+ }
573
+
574
+ static int emc2305_probe_childs_from_dt (struct device * dev )
575
+ {
576
+ struct emc2305_data * data = dev_get_drvdata (dev );
577
+ struct device_node * child ;
578
+ int ret , count = 0 ;
579
+
580
+ data -> pwm_output_mask = 0x0 ;
581
+ data -> pwm_polarity_mask = 0x0 ;
582
+
583
+ for_each_child_of_node (dev -> of_node , child ) {
584
+ if (of_property_present (child , "reg" )) {
585
+ ret = emc2305_of_parse_pwm_child (dev , child , data );
586
+ if (ret ) {
587
+ of_node_put (child );
588
+ continue ;
589
+ }
590
+ count ++ ;
591
+ }
592
+ }
593
+ return count ;
594
+ }
595
+
520
596
static int emc2305_probe (struct i2c_client * client )
521
597
{
522
598
struct i2c_adapter * adapter = client -> adapter ;
523
599
struct device * dev = & client -> dev ;
600
+ struct device_node * child ;
524
601
struct emc2305_data * data ;
525
602
struct emc2305_platform_data * pdata ;
526
603
int vendor ;
527
604
int ret ;
528
605
int i ;
606
+ int pwm_childs ;
529
607
530
608
if (!i2c_check_functionality (adapter , I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA ))
531
609
return - ENODEV ;
@@ -545,22 +623,40 @@ static int emc2305_probe(struct i2c_client *client)
545
623
if (ret )
546
624
return ret ;
547
625
626
+ pwm_childs = emc2305_probe_childs_from_dt (dev );
627
+
548
628
pdata = dev_get_platdata (& client -> dev );
549
- if (pdata ) {
550
- if (!pdata -> max_state || pdata -> max_state > EMC2305_FAN_MAX_STATE )
551
- return - EINVAL ;
552
- data -> max_state = pdata -> max_state ;
553
- /*
554
- * Validate a number of active PWM channels. Note that
555
- * configured number can be less than the actual maximum
556
- * supported by the device.
557
- */
558
- if (!pdata -> pwm_num || pdata -> pwm_num > EMC2305_PWM_MAX )
559
- return - EINVAL ;
560
- data -> pwm_num = pdata -> pwm_num ;
561
- data -> pwm_separate = pdata -> pwm_separate ;
562
- for (i = 0 ; i < EMC2305_PWM_MAX ; i ++ )
563
- data -> pwm_min [i ] = pdata -> pwm_min [i ];
629
+
630
+ if (!pwm_childs ) {
631
+ if (pdata ) {
632
+ if (!pdata -> max_state || pdata -> max_state > EMC2305_FAN_MAX_STATE )
633
+ return - EINVAL ;
634
+ data -> max_state = pdata -> max_state ;
635
+ /*
636
+ * Validate a number of active PWM channels. Note that
637
+ * configured number can be less than the actual maximum
638
+ * supported by the device.
639
+ */
640
+ if (!pdata -> pwm_num || pdata -> pwm_num > EMC2305_PWM_MAX )
641
+ return - EINVAL ;
642
+ data -> pwm_num = pdata -> pwm_num ;
643
+ data -> pwm_output_mask = pdata -> pwm_output_mask ;
644
+ data -> pwm_polarity_mask = pdata -> pwm_polarity_mask ;
645
+ data -> pwm_separate = pdata -> pwm_separate ;
646
+ for (i = 0 ; i < EMC2305_PWM_MAX ; i ++ ) {
647
+ data -> pwm_min [i ] = pdata -> pwm_min [i ];
648
+ data -> pwm_freq [i ] = pdata -> pwm_freq [i ];
649
+ }
650
+ } else {
651
+ data -> max_state = EMC2305_FAN_MAX_STATE ;
652
+ data -> pwm_separate = false;
653
+ data -> pwm_output_mask = EMC2305_DEFAULT_OUTPUT ;
654
+ data -> pwm_polarity_mask = EMC2305_DEFAULT_POLARITY ;
655
+ for (i = 0 ; i < EMC2305_PWM_MAX ; i ++ ) {
656
+ data -> pwm_min [i ] = EMC2305_FAN_MIN ;
657
+ data -> pwm_freq [i ] = base_freq_table [3 ];
658
+ }
659
+ }
564
660
} else {
565
661
data -> max_state = EMC2305_FAN_MAX_STATE ;
566
662
data -> pwm_separate = false;
@@ -574,9 +670,20 @@ static int emc2305_probe(struct i2c_client *client)
574
670
return PTR_ERR (data -> hwmon_dev );
575
671
576
672
if (IS_REACHABLE (CONFIG_THERMAL )) {
577
- ret = emc2305_set_tz (dev );
578
- if (ret != 0 )
579
- return ret ;
673
+ /* Parse and check for the available PWM child nodes */
674
+ if (pwm_childs > 0 ) {
675
+ i = 0 ;
676
+ for_each_child_of_node (dev -> of_node , child ) {
677
+ ret = emc2305_set_single_tz (dev , child , i );
678
+ if (ret != 0 )
679
+ return ret ;
680
+ i ++ ;
681
+ }
682
+ } else {
683
+ ret = emc2305_set_tz (dev );
684
+ if (ret != 0 )
685
+ return ret ;
686
+ }
580
687
}
581
688
582
689
for (i = 0 ; i < data -> pwm_num ; i ++ ) {
0 commit comments