lineage-pem.c (f0967eea80ec2a19a4fe1ad27e3ff1b22c79a3c7) lineage-pem.c (07404aab52f5106ec436692474cf8f40978f5dac)
1/*
2 * Driver for Lineage Compact Power Line series of power entry modules.
3 *
4 * Copyright (C) 2010, 2011 Ericsson AB.
5 *
6 * Documentation:
7 * http://www.lineagepower.com/oem/pdf/CPLI2C.pdf
8 *

--- 434 unchanged lines hidden (view full) ---

443 struct i2c_adapter *adapter = client->adapter;
444 struct pem_data *data;
445 int ret;
446
447 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BLOCK_DATA
448 | I2C_FUNC_SMBUS_WRITE_BYTE))
449 return -ENODEV;
450
1/*
2 * Driver for Lineage Compact Power Line series of power entry modules.
3 *
4 * Copyright (C) 2010, 2011 Ericsson AB.
5 *
6 * Documentation:
7 * http://www.lineagepower.com/oem/pdf/CPLI2C.pdf
8 *

--- 434 unchanged lines hidden (view full) ---

443 struct i2c_adapter *adapter = client->adapter;
444 struct pem_data *data;
445 int ret;
446
447 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BLOCK_DATA
448 | I2C_FUNC_SMBUS_WRITE_BYTE))
449 return -ENODEV;
450
451 data = kzalloc(sizeof(*data), GFP_KERNEL);
451 data = devm_kzalloc(&client->dev, sizeof(*data), GFP_KERNEL);
452 if (!data)
453 return -ENOMEM;
454
455 i2c_set_clientdata(client, data);
456 mutex_init(&data->update_lock);
457
458 /*
459 * We use the next two commands to determine if the device is really
460 * there.
461 */
462 ret = pem_read_block(client, PEM_READ_FIRMWARE_REV,
463 data->firmware_rev, sizeof(data->firmware_rev));
464 if (ret < 0)
452 if (!data)
453 return -ENOMEM;
454
455 i2c_set_clientdata(client, data);
456 mutex_init(&data->update_lock);
457
458 /*
459 * We use the next two commands to determine if the device is really
460 * there.
461 */
462 ret = pem_read_block(client, PEM_READ_FIRMWARE_REV,
463 data->firmware_rev, sizeof(data->firmware_rev));
464 if (ret < 0)
465 goto out_kfree;
465 return ret;
466
467 ret = i2c_smbus_write_byte(client, PEM_CLEAR_INFO_FLAGS);
468 if (ret < 0)
466
467 ret = i2c_smbus_write_byte(client, PEM_CLEAR_INFO_FLAGS);
468 if (ret < 0)
469 goto out_kfree;
469 return ret;
470
471 dev_info(&client->dev, "Firmware revision %d.%d.%d\n",
472 data->firmware_rev[0], data->firmware_rev[1],
473 data->firmware_rev[2]);
474
475 /* Register sysfs hooks */
476 ret = sysfs_create_group(&client->dev.kobj, &pem_group);
477 if (ret)
470
471 dev_info(&client->dev, "Firmware revision %d.%d.%d\n",
472 data->firmware_rev[0], data->firmware_rev[1],
473 data->firmware_rev[2]);
474
475 /* Register sysfs hooks */
476 ret = sysfs_create_group(&client->dev.kobj, &pem_group);
477 if (ret)
478 goto out_kfree;
478 return ret;
479
480 /*
481 * Check if input readings are supported.
482 * This is the case if we can read input data,
483 * and if the returned data is not all zeros.
484 * Note that input alarms are always supported.
485 */
486 ret = pem_read_block(client, PEM_READ_INPUT_STRING,

--- 42 unchanged lines hidden (view full) ---

529 }
530
531 return 0;
532
533out_remove_groups:
534 sysfs_remove_group(&client->dev.kobj, &pem_input_group);
535 sysfs_remove_group(&client->dev.kobj, &pem_fan_group);
536 sysfs_remove_group(&client->dev.kobj, &pem_group);
479
480 /*
481 * Check if input readings are supported.
482 * This is the case if we can read input data,
483 * and if the returned data is not all zeros.
484 * Note that input alarms are always supported.
485 */
486 ret = pem_read_block(client, PEM_READ_INPUT_STRING,

--- 42 unchanged lines hidden (view full) ---

529 }
530
531 return 0;
532
533out_remove_groups:
534 sysfs_remove_group(&client->dev.kobj, &pem_input_group);
535 sysfs_remove_group(&client->dev.kobj, &pem_fan_group);
536 sysfs_remove_group(&client->dev.kobj, &pem_group);
537out_kfree:
538 kfree(data);
539 return ret;
540}
541
542static int pem_remove(struct i2c_client *client)
543{
544 struct pem_data *data = i2c_get_clientdata(client);
545
546 hwmon_device_unregister(data->hwmon_dev);
547
548 sysfs_remove_group(&client->dev.kobj, &pem_input_group);
549 sysfs_remove_group(&client->dev.kobj, &pem_fan_group);
550 sysfs_remove_group(&client->dev.kobj, &pem_group);
551
537 return ret;
538}
539
540static int pem_remove(struct i2c_client *client)
541{
542 struct pem_data *data = i2c_get_clientdata(client);
543
544 hwmon_device_unregister(data->hwmon_dev);
545
546 sysfs_remove_group(&client->dev.kobj, &pem_input_group);
547 sysfs_remove_group(&client->dev.kobj, &pem_fan_group);
548 sysfs_remove_group(&client->dev.kobj, &pem_group);
549
552 kfree(data);
553 return 0;
554}
555
556static const struct i2c_device_id pem_id[] = {
557 {"lineage_pem", 0},
558 {}
559};
560MODULE_DEVICE_TABLE(i2c, pem_id);

--- 15 unchanged lines hidden ---
550 return 0;
551}
552
553static const struct i2c_device_id pem_id[] = {
554 {"lineage_pem", 0},
555 {}
556};
557MODULE_DEVICE_TABLE(i2c, pem_id);

--- 15 unchanged lines hidden ---