mutex_init(&data->update_lock);
platform_set_drvdata(pdev, data);
+ start_reg = f71882fg_read8(data, F71882FG_REG_START);
+ if (!(start_reg & 0x03)) {
+ dev_warn(&pdev->dev, "Hardware monitoring not activated\n");
+ err = -ENODEV;
+ goto exit_free;
+ }
+
+ /* If it is a 71862 and the fan / pwm part is enabled sanity check
+ the pwm settings */
+ if (data->type == f71862fg && (start_reg & 0x02)) {
+ u8 reg = f71882fg_read8(data, F71882FG_REG_PWM_ENABLE);
+ if ((reg & 0x15) != 0x15) {
+ dev_err(&pdev->dev,
+ "Invalid (reserved) pwm settings: 0x%02x\n",
+ (unsigned int)reg);
+ err = -ENODEV;
+ goto exit_free;
+ }
+ }
+
/* Register sysfs interface files */
err = device_create_file(&pdev->dev, &dev_attr_name);
if (err)
goto exit_unregister_sysfs;
- start_reg = f71882fg_read8(data, F71882FG_REG_START);
if (start_reg & 0x01) {
err = f71882fg_create_sysfs_files(pdev, f718x2fg_in_temp_attr,
ARRAY_SIZE(f718x2fg_in_temp_attr));
exit_unregister_sysfs:
f71882fg_remove(pdev); /* Will unregister the sysfs files for us */
-
+ return err; /* f71882fg_remove() also frees our data */
+exit_free:
+ kfree(data);
return err;
}
{
int err = -ENODEV;
u16 devid;
- u8 reg;
- struct f71882fg_data data;
superio_enter(sioaddr);
}
*address &= ~(REGION_LENGTH - 1); /* Ignore 3 LSB */
- data.addr = *address;
- reg = f71882fg_read8(&data, F71882FG_REG_START);
- if (!(reg & 0x03)) {
- printk(KERN_WARNING DRVNAME
- ": Hardware monitoring not activated\n");
- goto exit;
- }
-
- /* If it is a 71862 and the fan / pwm part is enabled sanity check
- the pwm settings */
- if (sio_data->type == f71862fg && (reg & 0x02)) {
- reg = f71882fg_read8(&data, F71882FG_REG_PWM_ENABLE);
- if ((reg & 0x15) != 0x15) {
- printk(KERN_ERR DRVNAME
- ": Invalid (reserved) pwm settings: 0x%02x\n",
- (unsigned int)reg);
- goto exit;
- }
- }
err = 0;
printk(KERN_INFO DRVNAME ": Found %s chip at %#x, revision %d\n",
f71882fg_names[sio_data->type], (unsigned int)*address,