aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hwmon
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/hwmon')
-rw-r--r--drivers/hwmon/dme1737.c121
1 files changed, 73 insertions, 48 deletions
diff --git a/drivers/hwmon/dme1737.c b/drivers/hwmon/dme1737.c
index ec683eabd7ac..d9c592713919 100644
--- a/drivers/hwmon/dme1737.c
+++ b/drivers/hwmon/dme1737.c
@@ -1590,7 +1590,7 @@ static DEVICE_ATTR(name, S_IRUGO, show_name, NULL); /* for ISA devices */
1590 * created unconditionally. The attributes that need modification of their 1590 * created unconditionally. The attributes that need modification of their
1591 * permissions are created read-only and write permissions are added or removed 1591 * permissions are created read-only and write permissions are added or removed
1592 * on the fly when required */ 1592 * on the fly when required */
1593static struct attribute *dme1737_attr[] ={ 1593static struct attribute *dme1737_attr[] = {
1594 /* Voltages */ 1594 /* Voltages */
1595 &sensor_dev_attr_in0_input.dev_attr.attr, 1595 &sensor_dev_attr_in0_input.dev_attr.attr,
1596 &sensor_dev_attr_in0_min.dev_attr.attr, 1596 &sensor_dev_attr_in0_min.dev_attr.attr,
@@ -1695,7 +1695,7 @@ static const struct attribute_group dme1737_zone3_group = {
1695}; 1695};
1696 1696
1697 1697
1698/* The following struct holds temp zone hysteresis related attributes, which 1698/* The following struct holds temp zone hysteresis related attributes, which
1699 * are not available in all chips. The following chips support them: 1699 * are not available in all chips. The following chips support them:
1700 * DME1737, SCH311x */ 1700 * DME1737, SCH311x */
1701static struct attribute *dme1737_zone_hyst_attr[] = { 1701static struct attribute *dme1737_zone_hyst_attr[] = {
@@ -2031,36 +2031,44 @@ static int dme1737_create_files(struct device *dev)
2031 int err, ix; 2031 int err, ix;
2032 2032
2033 /* Create a name attribute for ISA devices */ 2033 /* Create a name attribute for ISA devices */
2034 if (!data->client && 2034 if (!data->client) {
2035 (err = sysfs_create_file(&dev->kobj, &dev_attr_name.attr))) { 2035 err = sysfs_create_file(&dev->kobj, &dev_attr_name.attr);
2036 goto exit; 2036 if (err) {
2037 goto exit;
2038 }
2037 } 2039 }
2038 2040
2039 /* Create standard sysfs attributes */ 2041 /* Create standard sysfs attributes */
2040 if ((err = sysfs_create_group(&dev->kobj, &dme1737_group))) { 2042 err = sysfs_create_group(&dev->kobj, &dme1737_group);
2043 if (err) {
2041 goto exit_remove; 2044 goto exit_remove;
2042 } 2045 }
2043 2046
2044 /* Create chip-dependent sysfs attributes */ 2047 /* Create chip-dependent sysfs attributes */
2045 if ((data->has_features & HAS_TEMP_OFFSET) && 2048 if (data->has_features & HAS_TEMP_OFFSET) {
2046 (err = sysfs_create_group(&dev->kobj, 2049 err = sysfs_create_group(&dev->kobj,
2047 &dme1737_temp_offset_group))) { 2050 &dme1737_temp_offset_group);
2048 goto exit_remove; 2051 if (err) {
2052 goto exit_remove;
2053 }
2049 } 2054 }
2050 if ((data->has_features & HAS_VID) && 2055 if (data->has_features & HAS_VID) {
2051 (err = sysfs_create_group(&dev->kobj, 2056 err = sysfs_create_group(&dev->kobj, &dme1737_vid_group);
2052 &dme1737_vid_group))) { 2057 if (err) {
2053 goto exit_remove; 2058 goto exit_remove;
2059 }
2054 } 2060 }
2055 if ((data->has_features & HAS_ZONE3) && 2061 if (data->has_features & HAS_ZONE3) {
2056 (err = sysfs_create_group(&dev->kobj, 2062 err = sysfs_create_group(&dev->kobj, &dme1737_zone3_group);
2057 &dme1737_zone3_group))) { 2063 if (err) {
2058 goto exit_remove; 2064 goto exit_remove;
2065 }
2059 } 2066 }
2060 if ((data->has_features & HAS_ZONE_HYST) && 2067 if (data->has_features & HAS_ZONE_HYST) {
2061 (err = sysfs_create_group(&dev->kobj, 2068 err = sysfs_create_group(&dev->kobj, &dme1737_zone_hyst_group);
2062 &dme1737_zone_hyst_group))) { 2069 if (err) {
2063 goto exit_remove; 2070 goto exit_remove;
2071 }
2064 } 2072 }
2065 if (data->has_features & HAS_IN7) { 2073 if (data->has_features & HAS_IN7) {
2066 err = sysfs_create_group(&dev->kobj, &dme1737_in7_group); 2074 err = sysfs_create_group(&dev->kobj, &dme1737_in7_group);
@@ -2072,8 +2080,9 @@ static int dme1737_create_files(struct device *dev)
2072 /* Create fan sysfs attributes */ 2080 /* Create fan sysfs attributes */
2073 for (ix = 0; ix < ARRAY_SIZE(dme1737_fan_group); ix++) { 2081 for (ix = 0; ix < ARRAY_SIZE(dme1737_fan_group); ix++) {
2074 if (data->has_features & HAS_FAN(ix)) { 2082 if (data->has_features & HAS_FAN(ix)) {
2075 if ((err = sysfs_create_group(&dev->kobj, 2083 err = sysfs_create_group(&dev->kobj,
2076 &dme1737_fan_group[ix]))) { 2084 &dme1737_fan_group[ix]);
2085 if (err) {
2077 goto exit_remove; 2086 goto exit_remove;
2078 } 2087 }
2079 } 2088 }
@@ -2082,14 +2091,17 @@ static int dme1737_create_files(struct device *dev)
2082 /* Create PWM sysfs attributes */ 2091 /* Create PWM sysfs attributes */
2083 for (ix = 0; ix < ARRAY_SIZE(dme1737_pwm_group); ix++) { 2092 for (ix = 0; ix < ARRAY_SIZE(dme1737_pwm_group); ix++) {
2084 if (data->has_features & HAS_PWM(ix)) { 2093 if (data->has_features & HAS_PWM(ix)) {
2085 if ((err = sysfs_create_group(&dev->kobj, 2094 err = sysfs_create_group(&dev->kobj,
2086 &dme1737_pwm_group[ix]))) { 2095 &dme1737_pwm_group[ix]);
2096 if (err) {
2087 goto exit_remove; 2097 goto exit_remove;
2088 } 2098 }
2089 if ((data->has_features & HAS_PWM_MIN) && ix < 3 && 2099 if ((data->has_features & HAS_PWM_MIN) && (ix < 3)) {
2090 (err = sysfs_create_file(&dev->kobj, 2100 err = sysfs_create_file(&dev->kobj,
2091 dme1737_auto_pwm_min_attr[ix]))) { 2101 dme1737_auto_pwm_min_attr[ix]);
2092 goto exit_remove; 2102 if (err) {
2103 goto exit_remove;
2104 }
2093 } 2105 }
2094 } 2106 }
2095 } 2107 }
@@ -2319,8 +2331,9 @@ static int dme1737_i2c_get_features(int sio_cip, struct dme1737_data *data)
2319 dme1737_sio_outb(sio_cip, 0x07, 0x0a); 2331 dme1737_sio_outb(sio_cip, 0x07, 0x0a);
2320 2332
2321 /* Get the base address of the runtime registers */ 2333 /* Get the base address of the runtime registers */
2322 if (!(addr = (dme1737_sio_inb(sio_cip, 0x60) << 8) | 2334 addr = (dme1737_sio_inb(sio_cip, 0x60) << 8) |
2323 dme1737_sio_inb(sio_cip, 0x61))) { 2335 dme1737_sio_inb(sio_cip, 0x61);
2336 if (!addr) {
2324 err = -ENODEV; 2337 err = -ENODEV;
2325 goto exit; 2338 goto exit;
2326 } 2339 }
@@ -2401,13 +2414,15 @@ static int dme1737_i2c_probe(struct i2c_client *client,
2401 mutex_init(&data->update_lock); 2414 mutex_init(&data->update_lock);
2402 2415
2403 /* Initialize the DME1737 chip */ 2416 /* Initialize the DME1737 chip */
2404 if ((err = dme1737_init_device(dev))) { 2417 err = dme1737_init_device(dev);
2418 if (err) {
2405 dev_err(dev, "Failed to initialize device.\n"); 2419 dev_err(dev, "Failed to initialize device.\n");
2406 goto exit_kfree; 2420 goto exit_kfree;
2407 } 2421 }
2408 2422
2409 /* Create sysfs files */ 2423 /* Create sysfs files */
2410 if ((err = dme1737_create_files(dev))) { 2424 err = dme1737_create_files(dev);
2425 if (err) {
2411 dev_err(dev, "Failed to create sysfs files.\n"); 2426 dev_err(dev, "Failed to create sysfs files.\n");
2412 goto exit_kfree; 2427 goto exit_kfree;
2413 } 2428 }
@@ -2484,8 +2499,9 @@ static int __init dme1737_isa_detect(int sio_cip, unsigned short *addr)
2484 dme1737_sio_outb(sio_cip, 0x07, 0x0a); 2499 dme1737_sio_outb(sio_cip, 0x07, 0x0a);
2485 2500
2486 /* Get the base address of the runtime registers */ 2501 /* Get the base address of the runtime registers */
2487 if (!(base_addr = (dme1737_sio_inb(sio_cip, 0x60) << 8) | 2502 base_addr = (dme1737_sio_inb(sio_cip, 0x60) << 8) |
2488 dme1737_sio_inb(sio_cip, 0x61))) { 2503 dme1737_sio_inb(sio_cip, 0x61);
2504 if (!base_addr) {
2489 pr_err("Base address not set\n"); 2505 pr_err("Base address not set\n");
2490 err = -ENODEV; 2506 err = -ENODEV;
2491 goto exit; 2507 goto exit;
@@ -2514,18 +2530,21 @@ static int __init dme1737_isa_device_add(unsigned short addr)
2514 if (err) 2530 if (err)
2515 goto exit; 2531 goto exit;
2516 2532
2517 if (!(pdev = platform_device_alloc("dme1737", addr))) { 2533 pdev = platform_device_alloc("dme1737", addr);
2534 if (!pdev) {
2518 pr_err("Failed to allocate device\n"); 2535 pr_err("Failed to allocate device\n");
2519 err = -ENOMEM; 2536 err = -ENOMEM;
2520 goto exit; 2537 goto exit;
2521 } 2538 }
2522 2539
2523 if ((err = platform_device_add_resources(pdev, &res, 1))) { 2540 err = platform_device_add_resources(pdev, &res, 1);
2541 if (err) {
2524 pr_err("Failed to add device resource (err = %d)\n", err); 2542 pr_err("Failed to add device resource (err = %d)\n", err);
2525 goto exit_device_put; 2543 goto exit_device_put;
2526 } 2544 }
2527 2545
2528 if ((err = platform_device_add(pdev))) { 2546 err = platform_device_add(pdev);
2547 if (err) {
2529 pr_err("Failed to add device (err = %d)\n", err); 2548 pr_err("Failed to add device (err = %d)\n", err);
2530 goto exit_device_put; 2549 goto exit_device_put;
2531 } 2550 }
@@ -2552,11 +2571,12 @@ static int __devinit dme1737_isa_probe(struct platform_device *pdev)
2552 dev_err(dev, "Failed to request region 0x%04x-0x%04x.\n", 2571 dev_err(dev, "Failed to request region 0x%04x-0x%04x.\n",
2553 (unsigned short)res->start, 2572 (unsigned short)res->start,
2554 (unsigned short)res->start + DME1737_EXTENT - 1); 2573 (unsigned short)res->start + DME1737_EXTENT - 1);
2555 err = -EBUSY; 2574 err = -EBUSY;
2556 goto exit; 2575 goto exit;
2557 } 2576 }
2558 2577
2559 if (!(data = kzalloc(sizeof(struct dme1737_data), GFP_KERNEL))) { 2578 data = kzalloc(sizeof(struct dme1737_data), GFP_KERNEL);
2579 if (!data) {
2560 err = -ENOMEM; 2580 err = -ENOMEM;
2561 goto exit_release_region; 2581 goto exit_release_region;
2562 } 2582 }
@@ -2603,13 +2623,15 @@ static int __devinit dme1737_isa_probe(struct platform_device *pdev)
2603 data->type == sch5127 ? "SCH5127" : "SCH311x", data->addr); 2623 data->type == sch5127 ? "SCH5127" : "SCH311x", data->addr);
2604 2624
2605 /* Initialize the chip */ 2625 /* Initialize the chip */
2606 if ((err = dme1737_init_device(dev))) { 2626 err = dme1737_init_device(dev);
2627 if (err) {
2607 dev_err(dev, "Failed to initialize device.\n"); 2628 dev_err(dev, "Failed to initialize device.\n");
2608 goto exit_kfree; 2629 goto exit_kfree;
2609 } 2630 }
2610 2631
2611 /* Create sysfs files */ 2632 /* Create sysfs files */
2612 if ((err = dme1737_create_files(dev))) { 2633 err = dme1737_create_files(dev);
2634 if (err) {
2613 dev_err(dev, "Failed to create sysfs files.\n"); 2635 dev_err(dev, "Failed to create sysfs files.\n");
2614 goto exit_kfree; 2636 goto exit_kfree;
2615 } 2637 }
@@ -2666,7 +2688,8 @@ static int __init dme1737_init(void)
2666 int err; 2688 int err;
2667 unsigned short addr; 2689 unsigned short addr;
2668 2690
2669 if ((err = i2c_add_driver(&dme1737_i2c_driver))) { 2691 err = i2c_add_driver(&dme1737_i2c_driver);
2692 if (err) {
2670 goto exit; 2693 goto exit;
2671 } 2694 }
2672 2695
@@ -2679,12 +2702,14 @@ static int __init dme1737_init(void)
2679 return 0; 2702 return 0;
2680 } 2703 }
2681 2704
2682 if ((err = platform_driver_register(&dme1737_isa_driver))) { 2705 err = platform_driver_register(&dme1737_isa_driver);
2706 if (err) {
2683 goto exit_del_i2c_driver; 2707 goto exit_del_i2c_driver;
2684 } 2708 }
2685 2709
2686 /* Sets global pdev as a side effect */ 2710 /* Sets global pdev as a side effect */
2687 if ((err = dme1737_isa_device_add(addr))) { 2711 err = dme1737_isa_device_add(addr);
2712 if (err) {
2688 goto exit_del_isa_driver; 2713 goto exit_del_isa_driver;
2689 } 2714 }
2690 2715