Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

hwmon: (f75375s) Add new style bindings

Following the example of David Brownell's work on lm75:

- Create a second driver struct, using new-style driver binding methods.

- Rename the old driver struct as f75375_legacy_driver.

- Make the legacy bind/unbind logic delegate all its work.

Signed-off-by: Riku Voipio <riku.voipio@movial.fi>
Signed-off-by: Mark M. Hoffman <mhoffman@lightlink.com>

authored by

Riku Voipio and committed by
Mark M. Hoffman
620c142d 4bfe6604

+83 -26
+83 -26
drivers/hwmon/f75375s.c
··· 86 86 87 87 struct f75375_data { 88 88 unsigned short addr; 89 - struct i2c_client client; 89 + struct i2c_client *client; 90 90 struct device *hwmon_dev; 91 91 92 92 const char *name; ··· 116 116 static int f75375_attach_adapter(struct i2c_adapter *adapter); 117 117 static int f75375_detect(struct i2c_adapter *adapter, int address, int kind); 118 118 static int f75375_detach_client(struct i2c_client *client); 119 + static int f75375_probe(struct i2c_client *client); 120 + static int f75375_remove(struct i2c_client *client); 121 + 122 + static struct i2c_driver f75375_legacy_driver = { 123 + .driver = { 124 + .name = "f75375_legacy", 125 + }, 126 + .attach_adapter = f75375_attach_adapter, 127 + .detach_client = f75375_detach_client, 128 + }; 119 129 120 130 static struct i2c_driver f75375_driver = { 121 131 .driver = { 122 132 .name = "f75375", 123 133 }, 124 - .attach_adapter = f75375_attach_adapter, 125 - .detach_client = f75375_detach_client, 134 + .probe = f75375_probe, 135 + .remove = f75375_remove, 126 136 }; 127 137 128 138 static inline int f75375_read8(struct i2c_client *client, u8 reg) ··· 590 580 591 581 static int f75375_detach_client(struct i2c_client *client) 592 582 { 593 - struct f75375_data *data = i2c_get_clientdata(client); 594 583 int err; 595 584 596 - hwmon_device_unregister(data->hwmon_dev); 597 - sysfs_remove_group(&client->dev.kobj, &f75375_group); 598 - 585 + f75375_remove(client); 599 586 err = i2c_detach_client(client); 600 587 if (err) { 601 588 dev_err(&client->dev, ··· 600 593 "client not detached.\n"); 601 594 return err; 602 595 } 596 + kfree(client); 597 + return 0; 598 + } 599 + 600 + static int f75375_probe(struct i2c_client *client) 601 + { 602 + struct f75375_data *data = i2c_get_clientdata(client); 603 + int err; 604 + 605 + if (!i2c_check_functionality(client->adapter, 606 + I2C_FUNC_SMBUS_BYTE_DATA)) 607 + return -EIO; 608 + if (!(data = kzalloc(sizeof(struct f75375_data), GFP_KERNEL))) 609 + return -ENOMEM; 610 + 611 + i2c_set_clientdata(client, data); 612 + data->client = client; 613 + mutex_init(&data->update_lock); 614 + 615 + if (strcmp(client->name, "f75375") == 0) 616 + data->kind = f75375; 617 + else if (strcmp(client->name, "f75373") == 0) 618 + data->kind = f75373; 619 + else { 620 + dev_err(&client->dev, "Unsupported device: %s\n", client->name); 621 + return -ENODEV; 622 + } 623 + 624 + if ((err = sysfs_create_group(&client->dev.kobj, &f75375_group))) 625 + goto exit_free; 626 + 627 + data->hwmon_dev = hwmon_device_register(&client->dev); 628 + if (IS_ERR(data->hwmon_dev)) { 629 + err = PTR_ERR(data->hwmon_dev); 630 + goto exit_remove; 631 + } 632 + 633 + return 0; 634 + 635 + exit_remove: 636 + sysfs_remove_group(&client->dev.kobj, &f75375_group); 637 + exit_free: 603 638 kfree(data); 639 + i2c_set_clientdata(client, NULL); 640 + return err; 641 + } 642 + 643 + static int f75375_remove(struct i2c_client *client) 644 + { 645 + struct f75375_data *data = i2c_get_clientdata(client); 646 + hwmon_device_unregister(data->hwmon_dev); 647 + sysfs_remove_group(&client->dev.kobj, &f75375_group); 648 + kfree(data); 649 + i2c_set_clientdata(client, NULL); 604 650 return 0; 605 651 } 606 652 ··· 668 608 static int f75375_detect(struct i2c_adapter *adapter, int address, int kind) 669 609 { 670 610 struct i2c_client *client; 671 - struct f75375_data *data; 672 611 u8 version = 0; 673 612 int err = 0; 674 613 const char *name = ""; 675 614 676 - if (!(data = kzalloc(sizeof(struct f75375_data), GFP_KERNEL))) { 615 + if (!(client = kzalloc(sizeof(*client), GFP_KERNEL))) { 677 616 err = -ENOMEM; 678 617 goto exit; 679 618 } 680 - client = &data->client; 681 - i2c_set_clientdata(client, data); 682 619 client->addr = address; 683 620 client->adapter = adapter; 684 - client->driver = &f75375_driver; 621 + client->driver = &f75375_legacy_driver; 685 622 686 623 if (kind < 0) { 687 624 u16 vendid = f75375_read16(client, F75375_REG_VENDOR); ··· 701 644 } else if (kind == f75373) { 702 645 name = "f75373"; 703 646 } 704 - 705 647 dev_info(&adapter->dev, "found %s version: %02X\n", name, version); 706 648 strlcpy(client->name, name, I2C_NAME_SIZE); 707 - data->kind = kind; 708 - mutex_init(&data->update_lock); 649 + 709 650 if ((err = i2c_attach_client(client))) 710 651 goto exit_free; 711 652 712 - if ((err = sysfs_create_group(&client->dev.kobj, &f75375_group))) 653 + if ((err = f75375_probe(client)) < 0) 713 654 goto exit_detach; 714 - 715 - data->hwmon_dev = hwmon_device_register(&client->dev); 716 - if (IS_ERR(data->hwmon_dev)) { 717 - err = PTR_ERR(data->hwmon_dev); 718 - goto exit_remove; 719 - } 720 655 721 656 return 0; 722 657 723 - exit_remove: 724 - sysfs_remove_group(&client->dev.kobj, &f75375_group); 725 658 exit_detach: 726 659 i2c_detach_client(client); 727 660 exit_free: 728 - kfree(data); 661 + kfree(client); 729 662 exit: 730 663 return err; 731 664 } 732 665 733 666 static int __init sensors_f75375_init(void) 734 667 { 735 - return i2c_add_driver(&f75375_driver); 668 + int status; 669 + status = i2c_add_driver(&f75375_driver); 670 + if (status) 671 + return status; 672 + 673 + status = i2c_add_driver(&f75375_legacy_driver); 674 + if (status) 675 + i2c_del_driver(&f75375_driver); 676 + 677 + return status; 736 678 } 737 679 738 680 static void __exit sensors_f75375_exit(void) 739 681 { 682 + i2c_del_driver(&f75375_legacy_driver); 740 683 i2c_del_driver(&f75375_driver); 741 684 } 742 685