39
39
#include <linux/hwmon.h>
40
40
#include <linux/hwmon-sysfs.h>
41
41
#include <linux/err.h>
42
+ #include <linux/of_device.h>
42
43
43
44
/*
44
45
* Insmod parameters
48
49
static int fan_voltage ;
49
50
/* prescaler: Possible values are 1, 2, 4, 8, 16 or 0 for don't change */
50
51
static int prescaler ;
51
- /* clock: The clock frequency of the chip the driver should assume */
52
+ /* clock: The clock frequency of the chip (max6651 can be clocked externally) */
52
53
static int clock = 254000 ;
53
54
54
55
module_param (fan_voltage , int , S_IRUGO );
@@ -133,6 +134,19 @@ static const u8 tach_reg[] = {
133
134
MAX6650_REG_TACH3 ,
134
135
};
135
136
137
+ static const struct of_device_id max6650_dt_match [] = {
138
+ {
139
+ .compatible = "maxim,max6650" ,
140
+ .data = (void * )1
141
+ },
142
+ {
143
+ .compatible = "maxim,max6651" ,
144
+ .data = (void * )4
145
+ },
146
+ { },
147
+ };
148
+ MODULE_DEVICE_TABLE (of , max6650_dt_match );
149
+
136
150
static struct max6650_data * max6650_update_device (struct device * dev )
137
151
{
138
152
struct max6650_data * data = dev_get_drvdata (dev );
@@ -566,6 +580,17 @@ static int max6650_init_client(struct max6650_data *data,
566
580
struct device * dev = & client -> dev ;
567
581
int config ;
568
582
int err = - EIO ;
583
+ u32 voltage ;
584
+ u32 prescale ;
585
+
586
+ if (of_property_read_u32 (dev -> of_node , "maxim,fan-microvolt" ,
587
+ & voltage ))
588
+ voltage = fan_voltage ;
589
+ else
590
+ voltage /= 1000000 ; /* Microvolts to volts */
591
+ if (of_property_read_u32 (dev -> of_node , "maxim,fan-prescale" ,
592
+ & prescale ))
593
+ prescale = prescaler ;
569
594
570
595
config = i2c_smbus_read_byte_data (client , MAX6650_REG_CONFIG );
571
596
@@ -574,7 +599,7 @@ static int max6650_init_client(struct max6650_data *data,
574
599
return err ;
575
600
}
576
601
577
- switch (fan_voltage ) {
602
+ switch (voltage ) {
578
603
case 0 :
579
604
break ;
580
605
case 5 :
@@ -584,14 +609,10 @@ static int max6650_init_client(struct max6650_data *data,
584
609
config |= MAX6650_CFG_V12 ;
585
610
break ;
586
611
default :
587
- dev_err (dev , "illegal value for fan_voltage (%d)\n" ,
588
- fan_voltage );
612
+ dev_err (dev , "illegal value for fan_voltage (%d)\n" , voltage );
589
613
}
590
614
591
- dev_info (dev , "Fan voltage is set to %dV.\n" ,
592
- (config & MAX6650_CFG_V12 ) ? 12 : 5 );
593
-
594
- switch (prescaler ) {
615
+ switch (prescale ) {
595
616
case 0 :
596
617
break ;
597
618
case 1 :
@@ -614,10 +635,11 @@ static int max6650_init_client(struct max6650_data *data,
614
635
| MAX6650_CFG_PRESCALER_16 ;
615
636
break ;
616
637
default :
617
- dev_err (dev , "illegal value for prescaler (%d)\n" , prescaler );
638
+ dev_err (dev , "illegal value for prescaler (%d)\n" , prescale );
618
639
}
619
640
620
- dev_info (dev , "Prescaler is set to %d.\n" ,
641
+ dev_info (dev , "Fan voltage: %dV, prescaler: %d.\n" ,
642
+ (config & MAX6650_CFG_V12 ) ? 12 : 5 ,
621
643
1 << (config & MAX6650_CFG_PRESCALER_MASK ));
622
644
623
645
/*
@@ -651,6 +673,8 @@ static int max6650_probe(struct i2c_client *client,
651
673
const struct i2c_device_id * id )
652
674
{
653
675
struct device * dev = & client -> dev ;
676
+ const struct of_device_id * of_id =
677
+ of_match_device (of_match_ptr (max6650_dt_match ), dev );
654
678
struct max6650_data * data ;
655
679
struct device * hwmon_dev ;
656
680
int err ;
@@ -661,7 +685,7 @@ static int max6650_probe(struct i2c_client *client,
661
685
662
686
data -> client = client ;
663
687
mutex_init (& data -> update_lock );
664
- data -> nr_fans = id -> driver_data ;
688
+ data -> nr_fans = of_id ? ( int )( uintptr_t ) of_id -> data : id -> driver_data ;
665
689
666
690
/*
667
691
* Initialize the max6650 chip
@@ -691,6 +715,7 @@ MODULE_DEVICE_TABLE(i2c, max6650_id);
691
715
static struct i2c_driver max6650_driver = {
692
716
.driver = {
693
717
.name = "max6650" ,
718
+ .of_match_table = of_match_ptr (max6650_dt_match ),
694
719
},
695
720
.probe = max6650_probe ,
696
721
.id_table = max6650_id ,
0 commit comments