static int gl520_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct gl520_data *data; int err; data = kzalloc(sizeof(struct gl520_data), GFP_KERNEL); if (!data) { err = -ENOMEM; goto exit; } i2c_set_clientdata(client, data); mutex_init(&data->update_lock); /* */ gl520_init_client(client); /* */ err = sysfs_create_group(&client->dev.kobj, &gl520_group); if (err) goto exit_free; if (data->two_temps) err = sysfs_create_group(&client->dev.kobj, &gl520_group_temp2); else err = sysfs_create_group(&client->dev.kobj, &gl520_group_in4); if (err) goto exit_remove_files; data->hwmon_dev = hwmon_device_register(&client->dev); if (IS_ERR(data->hwmon_dev)) { err = PTR_ERR(data->hwmon_dev); goto exit_remove_files; } return 0; exit_remove_files: sysfs_remove_group(&client->dev.kobj, &gl520_group); sysfs_remove_group(&client->dev.kobj, &gl520_group_in4); sysfs_remove_group(&client->dev.kobj, &gl520_group_temp2); exit_free: kfree(data); exit: return err; }
static int gl520_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct gl520_data *data; int err; data = devm_kzalloc(&client->dev, sizeof(struct gl520_data), GFP_KERNEL); if (!data) return -ENOMEM; i2c_set_clientdata(client, data); mutex_init(&data->update_lock); /* Initialize the GL520SM chip */ gl520_init_client(client); /* Register sysfs hooks */ err = sysfs_create_group(&client->dev.kobj, &gl520_group); if (err) return err; if (data->two_temps) err = sysfs_create_group(&client->dev.kobj, &gl520_group_temp2); else err = sysfs_create_group(&client->dev.kobj, &gl520_group_in4); if (err) goto exit_remove_files; data->hwmon_dev = hwmon_device_register(&client->dev); if (IS_ERR(data->hwmon_dev)) { err = PTR_ERR(data->hwmon_dev); goto exit_remove_files; } return 0; exit_remove_files: sysfs_remove_group(&client->dev.kobj, &gl520_group); sysfs_remove_group(&client->dev.kobj, &gl520_group_in4); sysfs_remove_group(&client->dev.kobj, &gl520_group_temp2); return err; }
static int gl520_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct gl520_data *data; int err; data = kzalloc(sizeof(struct gl520_data), GFP_KERNEL); if (!data) { err = -ENOMEM; goto exit; } i2c_set_clientdata(client, data); mutex_init(&data->update_lock); /* Initialize the GL520SM chip */ gl520_init_client(client); /* Register sysfs hooks */ if ((err = sysfs_create_group(&client->dev.kobj, &gl520_group))) goto exit_free; if (data->two_temps) { if ((err = device_create_file(&client->dev, &sensor_dev_attr_temp2_input.dev_attr)) || (err = device_create_file(&client->dev, &sensor_dev_attr_temp2_max.dev_attr)) || (err = device_create_file(&client->dev, &sensor_dev_attr_temp2_max_hyst.dev_attr)) || (err = device_create_file(&client->dev, &sensor_dev_attr_temp2_alarm.dev_attr)) || (err = device_create_file(&client->dev, &sensor_dev_attr_temp2_beep.dev_attr))) goto exit_remove_files; } else { if ((err = device_create_file(&client->dev, &sensor_dev_attr_in4_input.dev_attr)) || (err = device_create_file(&client->dev, &sensor_dev_attr_in4_min.dev_attr)) || (err = device_create_file(&client->dev, &sensor_dev_attr_in4_max.dev_attr)) || (err = device_create_file(&client->dev, &sensor_dev_attr_in4_alarm.dev_attr)) || (err = device_create_file(&client->dev, &sensor_dev_attr_in4_beep.dev_attr))) goto exit_remove_files; } data->hwmon_dev = hwmon_device_register(&client->dev); if (IS_ERR(data->hwmon_dev)) { err = PTR_ERR(data->hwmon_dev); goto exit_remove_files; } return 0; exit_remove_files: sysfs_remove_group(&client->dev.kobj, &gl520_group); sysfs_remove_group(&client->dev.kobj, &gl520_group_opt); exit_free: kfree(data); exit: return err; }
static int gl520_detect(struct i2c_adapter *adapter, int address, unsigned short flags, int kind) { int i; struct i2c_client *new_client; struct gl520_data *data; int err = 0; const char *type_name = ""; char client_name[32]; /* Make sure we aren't probing the ISA bus!! This is just a safety check at this moment; i2c_detect really won't call us. */ #ifdef DEBUG if (i2c_is_isa_adapter(adapter)) { printk ("gl520sm.o: gl520_detect called for an ISA bus adapter?!?\n"); return 0; } #endif if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA)) goto ERROR0; /* OK. For now, we presume we have a valid client. We now create the client structure, even though we cannot fill it completely yet. But it allows us to access gl520_{read,write}_value. */ if (!(new_client = kmalloc(sizeof(struct i2c_client) + sizeof(struct gl520_data), GFP_KERNEL))) { err = -ENOMEM; goto ERROR0; } data = (struct gl520_data *) (new_client + 1); new_client->addr = address; new_client->data = data; new_client->adapter = adapter; new_client->driver = &gl520_driver; new_client->flags = 0; /* Determine the chip type. */ if (gl520_read_value(new_client, GL520_REG_CHIP_ID) != 0x20) { printk ("gl520sm.o: Ignoring 'force' parameter for unknown chip at " "adapter %d, address 0x%02x\n", i2c_adapter_id(adapter), address); goto ERROR1; } else { kind = gl520sm; } i = gl520_read_value(new_client, GL520_REG_REVISION); if (kind == gl520sm) { type_name = "gl520sm"; sprintf(client_name, "GL520SM Revision %02x chip", i); } else { #ifdef DEBUG printk("gl520sm.o: Internal error: unknown kind (%d)?!?", kind); #endif goto ERROR1; } /* Fill in the remaining client fields and put it into the global list */ strcpy(new_client->name, client_name); data->type = kind; new_client->id = gl520_id++; data->valid = 0; init_MUTEX(&data->update_lock); /* Tell the I2C layer a new client has arrived */ if ((err = i2c_attach_client(new_client))) goto ERROR3; /* Register a new directory entry with module sensors */ if ((i = i2c_register_entry(new_client, type_name, gl520_dir_table_template, THIS_MODULE)) < 0) { err = i; goto ERROR4; } data->sysctl_id = i; /* Initialize the GL520SM chip */ data->two_temps = 1; data->alarm_mask = 0xff; gl520_init_client(new_client); return 0; /* OK, this is not exactly good programming practice, usually. But it is very code-efficient in this case. */ ERROR4: i2c_detach_client(new_client); ERROR3: ERROR1: kfree(new_client); ERROR0: return err; }