Loading drivers/hwmon/pc87427.c +45 −27 Original line number Diff line number Diff line Loading @@ -46,9 +46,11 @@ static struct platform_device *pdev; #define DRVNAME "pc87427" /* The lock mutex protects both the I/O accesses (needed because the device is using banked registers) and the register cache (needed to keep the data in the registers and the cache in sync at any time). */ /* * The lock mutex protects both the I/O accesses (needed because the * device is using banked registers) and the register cache (needed to keep * the data in the registers and the cache in sync at any time). */ struct pc87427_data { struct device *hwmon_dev; struct mutex lock; Loading Loading @@ -173,10 +175,12 @@ static inline void pc87427_write8_bank(struct pc87427_data *data, u8 ldi, #define FAN_STATUS_LOSPD (1 << 1) #define FAN_STATUS_MONEN (1 << 0) /* Dedicated function to read all registers related to a given fan input. This saves us quite a few locks and bank selections. Must be called with data->lock held. nr is from 0 to 7 */ /* * Dedicated function to read all registers related to a given fan input. * This saves us quite a few locks and bank selections. * Must be called with data->lock held. * nr is from 0 to 7 */ static void pc87427_readall_fan(struct pc87427_data *data, u8 nr) { int iobase = data->address[LD_FAN]; Loading @@ -189,8 +193,10 @@ static void pc87427_readall_fan(struct pc87427_data *data, u8 nr) outb(data->fan_status[nr], iobase + PC87427_REG_FAN_STATUS); } /* The 2 LSB of fan speed registers are used for something different. The actual 2 LSB of the measurements are not available. */ /* * The 2 LSB of fan speed registers are used for something different. * The actual 2 LSB of the measurements are not available. */ static inline unsigned long fan_from_reg(u16 reg) { reg &= 0xfffc; Loading Loading @@ -224,10 +230,12 @@ static inline u16 fan_to_reg(unsigned long val) #define PWM_MODE_OFF (2 << 4) #define PWM_MODE_ON (7 << 4) /* Dedicated function to read all registers related to a given PWM output. This saves us quite a few locks and bank selections. Must be called with data->lock held. nr is from 0 to 3 */ /* * Dedicated function to read all registers related to a given PWM output. * This saves us quite a few locks and bank selections. * Must be called with data->lock held. * nr is from 0 to 3 */ static void pc87427_readall_pwm(struct pc87427_data *data, u8 nr) { int iobase = data->address[LD_FAN]; Loading Loading @@ -286,10 +294,12 @@ static inline u8 pwm_enable_to_reg(unsigned long val, u8 pwmval) #define TEMP_TYPE_REMOTE_DIODE (2 << 5) #define TEMP_TYPE_LOCAL_DIODE (3 << 5) /* Dedicated function to read all registers related to a given temperature input. This saves us quite a few locks and bank selections. Must be called with data->lock held. nr is from 0 to 5 */ /* * Dedicated function to read all registers related to a given temperature * input. This saves us quite a few locks and bank selections. * Must be called with data->lock held. * nr is from 0 to 5 */ static void pc87427_readall_temp(struct pc87427_data *data, u8 nr) { int iobase = data->address[LD_TEMP]; Loading Loading @@ -318,8 +328,10 @@ static inline unsigned int temp_type_from_reg(u8 reg) } } /* We assume 8-bit thermal sensors; 9-bit thermal sensors are possible too, but I have no idea how to figure out when they are used. */ /* * We assume 8-bit thermal sensors; 9-bit thermal sensors are possible * too, but I have no idea how to figure out when they are used. */ static inline long temp_from_reg(s16 reg) { return reg * 1000 / 256; Loading Loading @@ -423,9 +435,11 @@ static ssize_t set_fan_min(struct device *dev, struct device_attribute mutex_lock(&data->lock); outb(BANK_FM(nr), iobase + PC87427_REG_BANK); /* The low speed limit registers are read-only while monitoring is enabled, so we have to disable monitoring, then change the limit, and finally enable monitoring again. */ /* * The low speed limit registers are read-only while monitoring * is enabled, so we have to disable monitoring, then change the * limit, and finally enable monitoring again. */ outb(0, iobase + PC87427_REG_FAN_STATUS); data->fan_min[nr] = fan_to_reg(val); outw(data->fan_min[nr], iobase + PC87427_REG_FAN_MIN); Loading Loading @@ -542,8 +556,10 @@ static const struct attribute_group pc87427_group_fan[8] = { { .attrs = pc87427_attributes_fan[7] }, }; /* Must be called with data->lock held and pc87427_readall_pwm() freshly called */ /* * Must be called with data->lock held and pc87427_readall_pwm() freshly * called */ static void update_pwm_enable(struct pc87427_data *data, int nr, u8 mode) { int iobase = data->address[LD_FAN]; Loading Loading @@ -1023,9 +1039,11 @@ static void __devinit pc87427_init_device(struct device *dev) if (reg & PWM_ENABLE_CTLEN) data->pwm_enabled |= (1 << i); /* We don't expose an interface to reconfigure the automatic fan control mode, so only allow to return to this mode if it was originally set. */ /* * We don't expose an interface to reconfigure the automatic * fan control mode, so only allow to return to this mode if * it was originally set. */ if ((reg & PWM_ENABLE_MODE_MASK) == PWM_MODE_AUTO) { dev_dbg(dev, "PWM%d is in automatic control mode\n", i + 1); Loading Loading
drivers/hwmon/pc87427.c +45 −27 Original line number Diff line number Diff line Loading @@ -46,9 +46,11 @@ static struct platform_device *pdev; #define DRVNAME "pc87427" /* The lock mutex protects both the I/O accesses (needed because the device is using banked registers) and the register cache (needed to keep the data in the registers and the cache in sync at any time). */ /* * The lock mutex protects both the I/O accesses (needed because the * device is using banked registers) and the register cache (needed to keep * the data in the registers and the cache in sync at any time). */ struct pc87427_data { struct device *hwmon_dev; struct mutex lock; Loading Loading @@ -173,10 +175,12 @@ static inline void pc87427_write8_bank(struct pc87427_data *data, u8 ldi, #define FAN_STATUS_LOSPD (1 << 1) #define FAN_STATUS_MONEN (1 << 0) /* Dedicated function to read all registers related to a given fan input. This saves us quite a few locks and bank selections. Must be called with data->lock held. nr is from 0 to 7 */ /* * Dedicated function to read all registers related to a given fan input. * This saves us quite a few locks and bank selections. * Must be called with data->lock held. * nr is from 0 to 7 */ static void pc87427_readall_fan(struct pc87427_data *data, u8 nr) { int iobase = data->address[LD_FAN]; Loading @@ -189,8 +193,10 @@ static void pc87427_readall_fan(struct pc87427_data *data, u8 nr) outb(data->fan_status[nr], iobase + PC87427_REG_FAN_STATUS); } /* The 2 LSB of fan speed registers are used for something different. The actual 2 LSB of the measurements are not available. */ /* * The 2 LSB of fan speed registers are used for something different. * The actual 2 LSB of the measurements are not available. */ static inline unsigned long fan_from_reg(u16 reg) { reg &= 0xfffc; Loading Loading @@ -224,10 +230,12 @@ static inline u16 fan_to_reg(unsigned long val) #define PWM_MODE_OFF (2 << 4) #define PWM_MODE_ON (7 << 4) /* Dedicated function to read all registers related to a given PWM output. This saves us quite a few locks and bank selections. Must be called with data->lock held. nr is from 0 to 3 */ /* * Dedicated function to read all registers related to a given PWM output. * This saves us quite a few locks and bank selections. * Must be called with data->lock held. * nr is from 0 to 3 */ static void pc87427_readall_pwm(struct pc87427_data *data, u8 nr) { int iobase = data->address[LD_FAN]; Loading Loading @@ -286,10 +294,12 @@ static inline u8 pwm_enable_to_reg(unsigned long val, u8 pwmval) #define TEMP_TYPE_REMOTE_DIODE (2 << 5) #define TEMP_TYPE_LOCAL_DIODE (3 << 5) /* Dedicated function to read all registers related to a given temperature input. This saves us quite a few locks and bank selections. Must be called with data->lock held. nr is from 0 to 5 */ /* * Dedicated function to read all registers related to a given temperature * input. This saves us quite a few locks and bank selections. * Must be called with data->lock held. * nr is from 0 to 5 */ static void pc87427_readall_temp(struct pc87427_data *data, u8 nr) { int iobase = data->address[LD_TEMP]; Loading Loading @@ -318,8 +328,10 @@ static inline unsigned int temp_type_from_reg(u8 reg) } } /* We assume 8-bit thermal sensors; 9-bit thermal sensors are possible too, but I have no idea how to figure out when they are used. */ /* * We assume 8-bit thermal sensors; 9-bit thermal sensors are possible * too, but I have no idea how to figure out when they are used. */ static inline long temp_from_reg(s16 reg) { return reg * 1000 / 256; Loading Loading @@ -423,9 +435,11 @@ static ssize_t set_fan_min(struct device *dev, struct device_attribute mutex_lock(&data->lock); outb(BANK_FM(nr), iobase + PC87427_REG_BANK); /* The low speed limit registers are read-only while monitoring is enabled, so we have to disable monitoring, then change the limit, and finally enable monitoring again. */ /* * The low speed limit registers are read-only while monitoring * is enabled, so we have to disable monitoring, then change the * limit, and finally enable monitoring again. */ outb(0, iobase + PC87427_REG_FAN_STATUS); data->fan_min[nr] = fan_to_reg(val); outw(data->fan_min[nr], iobase + PC87427_REG_FAN_MIN); Loading Loading @@ -542,8 +556,10 @@ static const struct attribute_group pc87427_group_fan[8] = { { .attrs = pc87427_attributes_fan[7] }, }; /* Must be called with data->lock held and pc87427_readall_pwm() freshly called */ /* * Must be called with data->lock held and pc87427_readall_pwm() freshly * called */ static void update_pwm_enable(struct pc87427_data *data, int nr, u8 mode) { int iobase = data->address[LD_FAN]; Loading Loading @@ -1023,9 +1039,11 @@ static void __devinit pc87427_init_device(struct device *dev) if (reg & PWM_ENABLE_CTLEN) data->pwm_enabled |= (1 << i); /* We don't expose an interface to reconfigure the automatic fan control mode, so only allow to return to this mode if it was originally set. */ /* * We don't expose an interface to reconfigure the automatic * fan control mode, so only allow to return to this mode if * it was originally set. */ if ((reg & PWM_ENABLE_MODE_MASK) == PWM_MODE_AUTO) { dev_dbg(dev, "PWM%d is in automatic control mode\n", i + 1); Loading