|
@@ -143,50 +143,12 @@ struct lm78_data {
|
|
|
};
|
|
|
|
|
|
|
|
|
-static int lm78_i2c_detect(struct i2c_client *client,
|
|
|
- struct i2c_board_info *info);
|
|
|
-static int lm78_i2c_probe(struct i2c_client *client,
|
|
|
- const struct i2c_device_id *id);
|
|
|
-static int lm78_i2c_remove(struct i2c_client *client);
|
|
|
-
|
|
|
-static int __devinit lm78_isa_probe(struct platform_device *pdev);
|
|
|
-static int __devexit lm78_isa_remove(struct platform_device *pdev);
|
|
|
-
|
|
|
static int lm78_read_value(struct lm78_data *data, u8 reg);
|
|
|
static int lm78_write_value(struct lm78_data *data, u8 reg, u8 value);
|
|
|
static struct lm78_data *lm78_update_device(struct device *dev);
|
|
|
static void lm78_init_device(struct lm78_data *data);
|
|
|
|
|
|
|
|
|
-static const struct i2c_device_id lm78_i2c_id[] = {
|
|
|
- { "lm78", lm78 },
|
|
|
- { "lm79", lm79 },
|
|
|
- { }
|
|
|
-};
|
|
|
-MODULE_DEVICE_TABLE(i2c, lm78_i2c_id);
|
|
|
-
|
|
|
-static struct i2c_driver lm78_driver = {
|
|
|
- .class = I2C_CLASS_HWMON,
|
|
|
- .driver = {
|
|
|
- .name = "lm78",
|
|
|
- },
|
|
|
- .probe = lm78_i2c_probe,
|
|
|
- .remove = lm78_i2c_remove,
|
|
|
- .id_table = lm78_i2c_id,
|
|
|
- .detect = lm78_i2c_detect,
|
|
|
- .address_list = normal_i2c,
|
|
|
-};
|
|
|
-
|
|
|
-static struct platform_driver lm78_isa_driver = {
|
|
|
- .driver = {
|
|
|
- .owner = THIS_MODULE,
|
|
|
- .name = "lm78",
|
|
|
- },
|
|
|
- .probe = lm78_isa_probe,
|
|
|
- .remove = __devexit_p(lm78_isa_remove),
|
|
|
-};
|
|
|
-
|
|
|
-
|
|
|
/* 7 Voltages */
|
|
|
static ssize_t show_in(struct device *dev, struct device_attribute *da,
|
|
|
char *buf)
|
|
@@ -663,76 +625,24 @@ static int lm78_i2c_remove(struct i2c_client *client)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int __devinit lm78_isa_probe(struct platform_device *pdev)
|
|
|
-{
|
|
|
- int err;
|
|
|
- struct lm78_data *data;
|
|
|
- struct resource *res;
|
|
|
-
|
|
|
- /* Reserve the ISA region */
|
|
|
- res = platform_get_resource(pdev, IORESOURCE_IO, 0);
|
|
|
- if (!request_region(res->start + LM78_ADDR_REG_OFFSET, 2, "lm78")) {
|
|
|
- err = -EBUSY;
|
|
|
- goto exit;
|
|
|
- }
|
|
|
-
|
|
|
- if (!(data = kzalloc(sizeof(struct lm78_data), GFP_KERNEL))) {
|
|
|
- err = -ENOMEM;
|
|
|
- goto exit_release_region;
|
|
|
- }
|
|
|
- mutex_init(&data->lock);
|
|
|
- data->isa_addr = res->start;
|
|
|
- platform_set_drvdata(pdev, data);
|
|
|
-
|
|
|
- if (lm78_read_value(data, LM78_REG_CHIPID) & 0x80) {
|
|
|
- data->type = lm79;
|
|
|
- data->name = "lm79";
|
|
|
- } else {
|
|
|
- data->type = lm78;
|
|
|
- data->name = "lm78";
|
|
|
- }
|
|
|
-
|
|
|
- /* Initialize the LM78 chip */
|
|
|
- lm78_init_device(data);
|
|
|
-
|
|
|
- /* Register sysfs hooks */
|
|
|
- if ((err = sysfs_create_group(&pdev->dev.kobj, &lm78_group))
|
|
|
- || (err = device_create_file(&pdev->dev, &dev_attr_name)))
|
|
|
- goto exit_remove_files;
|
|
|
-
|
|
|
- data->hwmon_dev = hwmon_device_register(&pdev->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(&pdev->dev.kobj, &lm78_group);
|
|
|
- device_remove_file(&pdev->dev, &dev_attr_name);
|
|
|
- kfree(data);
|
|
|
- exit_release_region:
|
|
|
- release_region(res->start + LM78_ADDR_REG_OFFSET, 2);
|
|
|
- exit:
|
|
|
- return err;
|
|
|
-}
|
|
|
-
|
|
|
-static int __devexit lm78_isa_remove(struct platform_device *pdev)
|
|
|
-{
|
|
|
- struct lm78_data *data = platform_get_drvdata(pdev);
|
|
|
- struct resource *res;
|
|
|
-
|
|
|
- hwmon_device_unregister(data->hwmon_dev);
|
|
|
- sysfs_remove_group(&pdev->dev.kobj, &lm78_group);
|
|
|
- device_remove_file(&pdev->dev, &dev_attr_name);
|
|
|
- kfree(data);
|
|
|
-
|
|
|
- res = platform_get_resource(pdev, IORESOURCE_IO, 0);
|
|
|
- release_region(res->start + LM78_ADDR_REG_OFFSET, 2);
|
|
|
+static const struct i2c_device_id lm78_i2c_id[] = {
|
|
|
+ { "lm78", lm78 },
|
|
|
+ { "lm79", lm79 },
|
|
|
+ { }
|
|
|
+};
|
|
|
+MODULE_DEVICE_TABLE(i2c, lm78_i2c_id);
|
|
|
|
|
|
- return 0;
|
|
|
-}
|
|
|
+static struct i2c_driver lm78_driver = {
|
|
|
+ .class = I2C_CLASS_HWMON,
|
|
|
+ .driver = {
|
|
|
+ .name = "lm78",
|
|
|
+ },
|
|
|
+ .probe = lm78_i2c_probe,
|
|
|
+ .remove = lm78_i2c_remove,
|
|
|
+ .id_table = lm78_i2c_id,
|
|
|
+ .detect = lm78_i2c_detect,
|
|
|
+ .address_list = normal_i2c,
|
|
|
+};
|
|
|
|
|
|
/* The SMBus locks itself, but ISA access must be locked explicitly!
|
|
|
We don't want to lock the whole ISA bus, so we lock each client
|
|
@@ -849,6 +759,87 @@ static struct lm78_data *lm78_update_device(struct device *dev)
|
|
|
return data;
|
|
|
}
|
|
|
|
|
|
+static int __devinit lm78_isa_probe(struct platform_device *pdev)
|
|
|
+{
|
|
|
+ int err;
|
|
|
+ struct lm78_data *data;
|
|
|
+ struct resource *res;
|
|
|
+
|
|
|
+ /* Reserve the ISA region */
|
|
|
+ res = platform_get_resource(pdev, IORESOURCE_IO, 0);
|
|
|
+ if (!request_region(res->start + LM78_ADDR_REG_OFFSET, 2, "lm78")) {
|
|
|
+ err = -EBUSY;
|
|
|
+ goto exit;
|
|
|
+ }
|
|
|
+
|
|
|
+ data = kzalloc(sizeof(struct lm78_data), GFP_KERNEL);
|
|
|
+ if (!data) {
|
|
|
+ err = -ENOMEM;
|
|
|
+ goto exit_release_region;
|
|
|
+ }
|
|
|
+ mutex_init(&data->lock);
|
|
|
+ data->isa_addr = res->start;
|
|
|
+ platform_set_drvdata(pdev, data);
|
|
|
+
|
|
|
+ if (lm78_read_value(data, LM78_REG_CHIPID) & 0x80) {
|
|
|
+ data->type = lm79;
|
|
|
+ data->name = "lm79";
|
|
|
+ } else {
|
|
|
+ data->type = lm78;
|
|
|
+ data->name = "lm78";
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Initialize the LM78 chip */
|
|
|
+ lm78_init_device(data);
|
|
|
+
|
|
|
+ /* Register sysfs hooks */
|
|
|
+ if ((err = sysfs_create_group(&pdev->dev.kobj, &lm78_group))
|
|
|
+ || (err = device_create_file(&pdev->dev, &dev_attr_name)))
|
|
|
+ goto exit_remove_files;
|
|
|
+
|
|
|
+ data->hwmon_dev = hwmon_device_register(&pdev->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(&pdev->dev.kobj, &lm78_group);
|
|
|
+ device_remove_file(&pdev->dev, &dev_attr_name);
|
|
|
+ kfree(data);
|
|
|
+ exit_release_region:
|
|
|
+ release_region(res->start + LM78_ADDR_REG_OFFSET, 2);
|
|
|
+ exit:
|
|
|
+ return err;
|
|
|
+}
|
|
|
+
|
|
|
+static int __devexit lm78_isa_remove(struct platform_device *pdev)
|
|
|
+{
|
|
|
+ struct lm78_data *data = platform_get_drvdata(pdev);
|
|
|
+ struct resource *res;
|
|
|
+
|
|
|
+ hwmon_device_unregister(data->hwmon_dev);
|
|
|
+ sysfs_remove_group(&pdev->dev.kobj, &lm78_group);
|
|
|
+ device_remove_file(&pdev->dev, &dev_attr_name);
|
|
|
+ kfree(data);
|
|
|
+
|
|
|
+ res = platform_get_resource(pdev, IORESOURCE_IO, 0);
|
|
|
+ release_region(res->start + LM78_ADDR_REG_OFFSET, 2);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static struct platform_driver lm78_isa_driver = {
|
|
|
+ .driver = {
|
|
|
+ .owner = THIS_MODULE,
|
|
|
+ .name = "lm78",
|
|
|
+ },
|
|
|
+ .probe = lm78_isa_probe,
|
|
|
+ .remove = __devexit_p(lm78_isa_remove),
|
|
|
+};
|
|
|
+
|
|
|
/* return 1 if a supported chip is found, 0 otherwise */
|
|
|
static int __init lm78_isa_found(unsigned short address)
|
|
|
{
|