1111#include <linux/module.h>
1212#include <linux/platform_data/emc2305.h>
1313#include <linux/thermal.h>
14+ #include <linux/pwm.h>
15+ #include <linux/of_device.h>
16+ #include <linux/util_macros.h>
1417
1518#define EMC2305_REG_DRIVE_FAIL_STATUS 0x27
1619#define EMC2305_REG_VENDOR 0xfe
2326#define EMC2305_TACH_REGS_UNUSE_BITS 3
2427#define EMC2305_TACH_CNT_MULTIPLIER 0x02
2528#define EMC2305_TACH_RANGE_MIN 480
29+ #define EMC2305_DEFAULT_OUTPUT 0x0
30+ #define EMC2305_DEFAULT_POLARITY 0x0
2631
2732#define EMC2305_PWM_DUTY2STATE (duty , max_state , pwm_max ) \
2833 DIV_ROUND_CLOSEST((duty) * (max_state), (pwm_max))
3944#define EMC2305_REG_FAN_MIN_DRIVE (n ) (0x38 + 0x10 * (n))
4045#define EMC2305_REG_FAN_TACH (n ) (0x3e + 0x10 * (n))
4146
47+ /* Supported base PWM frequencies */
48+ static const unsigned int base_freq_table [] = { 2441 , 4882 , 19530 , 26000 };
49+
4250enum emc230x_product_id {
4351 EMC2305 = 0x34 ,
4452 EMC2303 = 0x35 ,
@@ -287,7 +295,7 @@ static int emc2305_set_pwm(struct device *dev, long val, int channel)
287295 return 0 ;
288296}
289297
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 )
291299{
292300 struct emc2305_data * data = dev_get_drvdata (dev );
293301 long pwm ;
@@ -297,7 +305,7 @@ static int emc2305_set_single_tz(struct device *dev, int idx)
297305 pwm = data -> pwm_min [cdev_idx ];
298306
299307 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 ,
301309 emc2305_fan_name [idx ], data ,
302310 & emc2305_cooling_ops );
303311
@@ -332,10 +340,10 @@ static int emc2305_set_tz(struct device *dev)
332340 int i , ret ;
333341
334342 if (!data -> pwm_separate )
335- return emc2305_set_single_tz (dev , 0 );
343+ return emc2305_set_single_tz (dev , dev -> of_node , 0 );
336344
337345 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 );
339347 if (ret )
340348 return ret ;
341349 }
@@ -517,15 +525,85 @@ static int emc2305_identify(struct device *dev)
517525 return 0 ;
518526}
519527
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+
520596static int emc2305_probe (struct i2c_client * client )
521597{
522598 struct i2c_adapter * adapter = client -> adapter ;
523599 struct device * dev = & client -> dev ;
600+ struct device_node * child ;
524601 struct emc2305_data * data ;
525602 struct emc2305_platform_data * pdata ;
526603 int vendor ;
527604 int ret ;
528605 int i ;
606+ int pwm_childs ;
529607
530608 if (!i2c_check_functionality (adapter , I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA ))
531609 return - ENODEV ;
@@ -545,22 +623,40 @@ static int emc2305_probe(struct i2c_client *client)
545623 if (ret )
546624 return ret ;
547625
626+ pwm_childs = emc2305_probe_childs_from_dt (dev );
627+
548628 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+ }
564660 } else {
565661 data -> max_state = EMC2305_FAN_MAX_STATE ;
566662 data -> pwm_separate = false;
@@ -574,9 +670,20 @@ static int emc2305_probe(struct i2c_client *client)
574670 return PTR_ERR (data -> hwmon_dev );
575671
576672 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+ }
580687 }
581688
582689 for (i = 0 ; i < data -> pwm_num ; i ++ ) {
0 commit comments