diff options
Diffstat (limited to 'drivers/i2c/i2c-core.c')
| -rw-r--r-- | drivers/i2c/i2c-core.c | 575 |
1 files changed, 448 insertions, 127 deletions
diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c index d0175f4f8fc6..0a79f7661017 100644 --- a/drivers/i2c/i2c-core.c +++ b/drivers/i2c/i2c-core.c | |||
| @@ -29,13 +29,11 @@ | |||
| 29 | #include <linux/i2c.h> | 29 | #include <linux/i2c.h> |
| 30 | #include <linux/init.h> | 30 | #include <linux/init.h> |
| 31 | #include <linux/idr.h> | 31 | #include <linux/idr.h> |
| 32 | #include <linux/seq_file.h> | ||
| 33 | #include <linux/platform_device.h> | 32 | #include <linux/platform_device.h> |
| 34 | #include <linux/mutex.h> | 33 | #include <linux/mutex.h> |
| 35 | #include <linux/completion.h> | 34 | #include <linux/completion.h> |
| 36 | #include <linux/hardirq.h> | 35 | #include <linux/hardirq.h> |
| 37 | #include <linux/irqflags.h> | 36 | #include <linux/irqflags.h> |
| 38 | #include <linux/semaphore.h> | ||
| 39 | #include <asm/uaccess.h> | 37 | #include <asm/uaccess.h> |
| 40 | 38 | ||
| 41 | #include "i2c-core.h" | 39 | #include "i2c-core.h" |
| @@ -44,7 +42,9 @@ | |||
| 44 | static DEFINE_MUTEX(core_lock); | 42 | static DEFINE_MUTEX(core_lock); |
| 45 | static DEFINE_IDR(i2c_adapter_idr); | 43 | static DEFINE_IDR(i2c_adapter_idr); |
| 46 | 44 | ||
| 47 | #define is_newstyle_driver(d) ((d)->probe || (d)->remove) | 45 | #define is_newstyle_driver(d) ((d)->probe || (d)->remove || (d)->detect) |
| 46 | |||
| 47 | static int i2c_detect(struct i2c_adapter *adapter, struct i2c_driver *driver); | ||
| 48 | 48 | ||
| 49 | /* ------------------------------------------------------------------------- */ | 49 | /* ------------------------------------------------------------------------- */ |
| 50 | 50 | ||
| @@ -103,19 +103,14 @@ static int i2c_device_probe(struct device *dev) | |||
| 103 | { | 103 | { |
| 104 | struct i2c_client *client = to_i2c_client(dev); | 104 | struct i2c_client *client = to_i2c_client(dev); |
| 105 | struct i2c_driver *driver = to_i2c_driver(dev->driver); | 105 | struct i2c_driver *driver = to_i2c_driver(dev->driver); |
| 106 | const struct i2c_device_id *id; | ||
| 107 | int status; | 106 | int status; |
| 108 | 107 | ||
| 109 | if (!driver->probe) | 108 | if (!driver->probe || !driver->id_table) |
| 110 | return -ENODEV; | 109 | return -ENODEV; |
| 111 | client->driver = driver; | 110 | client->driver = driver; |
| 112 | dev_dbg(dev, "probe\n"); | 111 | dev_dbg(dev, "probe\n"); |
| 113 | 112 | ||
| 114 | if (driver->id_table) | 113 | status = driver->probe(client, i2c_match_id(driver->id_table, client)); |
| 115 | id = i2c_match_id(driver->id_table, client); | ||
| 116 | else | ||
| 117 | id = NULL; | ||
| 118 | status = driver->probe(client, id); | ||
| 119 | if (status) | 114 | if (status) |
| 120 | client->driver = NULL; | 115 | client->driver = NULL; |
| 121 | return status; | 116 | return status; |
| @@ -208,7 +203,7 @@ static struct device_attribute i2c_dev_attrs[] = { | |||
| 208 | { }, | 203 | { }, |
| 209 | }; | 204 | }; |
| 210 | 205 | ||
| 211 | static struct bus_type i2c_bus_type = { | 206 | struct bus_type i2c_bus_type = { |
| 212 | .name = "i2c", | 207 | .name = "i2c", |
| 213 | .dev_attrs = i2c_dev_attrs, | 208 | .dev_attrs = i2c_dev_attrs, |
| 214 | .match = i2c_device_match, | 209 | .match = i2c_device_match, |
| @@ -219,6 +214,7 @@ static struct bus_type i2c_bus_type = { | |||
| 219 | .suspend = i2c_device_suspend, | 214 | .suspend = i2c_device_suspend, |
| 220 | .resume = i2c_device_resume, | 215 | .resume = i2c_device_resume, |
| 221 | }; | 216 | }; |
| 217 | EXPORT_SYMBOL_GPL(i2c_bus_type); | ||
| 222 | 218 | ||
| 223 | 219 | ||
| 224 | /** | 220 | /** |
| @@ -306,6 +302,14 @@ void i2c_unregister_device(struct i2c_client *client) | |||
| 306 | return; | 302 | return; |
| 307 | } | 303 | } |
| 308 | 304 | ||
| 305 | if (adapter->client_unregister) { | ||
| 306 | if (adapter->client_unregister(client)) { | ||
| 307 | dev_warn(&client->dev, | ||
| 308 | "client_unregister [%s] failed\n", | ||
| 309 | client->name); | ||
| 310 | } | ||
| 311 | } | ||
| 312 | |||
| 309 | mutex_lock(&adapter->clist_lock); | 313 | mutex_lock(&adapter->clist_lock); |
| 310 | list_del(&client->list); | 314 | list_del(&client->list); |
| 311 | mutex_unlock(&adapter->clist_lock); | 315 | mutex_unlock(&adapter->clist_lock); |
| @@ -416,6 +420,10 @@ static int i2c_do_add_adapter(struct device_driver *d, void *data) | |||
| 416 | struct i2c_driver *driver = to_i2c_driver(d); | 420 | struct i2c_driver *driver = to_i2c_driver(d); |
| 417 | struct i2c_adapter *adap = data; | 421 | struct i2c_adapter *adap = data; |
| 418 | 422 | ||
| 423 | /* Detect supported devices on that bus, and instantiate them */ | ||
| 424 | i2c_detect(adap, driver); | ||
| 425 | |||
| 426 | /* Let legacy drivers scan this bus for matching devices */ | ||
| 419 | if (driver->attach_adapter) { | 427 | if (driver->attach_adapter) { |
| 420 | /* We ignore the return code; if it fails, too bad */ | 428 | /* We ignore the return code; if it fails, too bad */ |
| 421 | driver->attach_adapter(adap); | 429 | driver->attach_adapter(adap); |
| @@ -455,7 +463,7 @@ static int i2c_register_adapter(struct i2c_adapter *adap) | |||
| 455 | if (adap->nr < __i2c_first_dynamic_bus_num) | 463 | if (adap->nr < __i2c_first_dynamic_bus_num) |
| 456 | i2c_scan_static_board_info(adap); | 464 | i2c_scan_static_board_info(adap); |
| 457 | 465 | ||
| 458 | /* let legacy drivers scan this bus for matching devices */ | 466 | /* Notify drivers */ |
| 459 | dummy = bus_for_each_drv(&i2c_bus_type, NULL, adap, | 467 | dummy = bus_for_each_drv(&i2c_bus_type, NULL, adap, |
| 460 | i2c_do_add_adapter); | 468 | i2c_do_add_adapter); |
| 461 | 469 | ||
| @@ -561,8 +569,19 @@ static int i2c_do_del_adapter(struct device_driver *d, void *data) | |||
| 561 | { | 569 | { |
| 562 | struct i2c_driver *driver = to_i2c_driver(d); | 570 | struct i2c_driver *driver = to_i2c_driver(d); |
| 563 | struct i2c_adapter *adapter = data; | 571 | struct i2c_adapter *adapter = data; |
| 572 | struct i2c_client *client, *_n; | ||
| 564 | int res; | 573 | int res; |
| 565 | 574 | ||
| 575 | /* Remove the devices we created ourselves */ | ||
| 576 | list_for_each_entry_safe(client, _n, &driver->clients, detected) { | ||
| 577 | if (client->adapter == adapter) { | ||
| 578 | dev_dbg(&adapter->dev, "Removing %s at 0x%x\n", | ||
| 579 | client->name, client->addr); | ||
| 580 | list_del(&client->detected); | ||
| 581 | i2c_unregister_device(client); | ||
| 582 | } | ||
| 583 | } | ||
| 584 | |||
| 566 | if (!driver->detach_adapter) | 585 | if (!driver->detach_adapter) |
| 567 | return 0; | 586 | return 0; |
| 568 | res = driver->detach_adapter(adapter); | 587 | res = driver->detach_adapter(adapter); |
| @@ -582,8 +601,7 @@ static int i2c_do_del_adapter(struct device_driver *d, void *data) | |||
| 582 | */ | 601 | */ |
| 583 | int i2c_del_adapter(struct i2c_adapter *adap) | 602 | int i2c_del_adapter(struct i2c_adapter *adap) |
| 584 | { | 603 | { |
| 585 | struct list_head *item, *_n; | 604 | struct i2c_client *client, *_n; |
| 586 | struct i2c_client *client; | ||
| 587 | int res = 0; | 605 | int res = 0; |
| 588 | 606 | ||
| 589 | mutex_lock(&core_lock); | 607 | mutex_lock(&core_lock); |
| @@ -604,10 +622,9 @@ int i2c_del_adapter(struct i2c_adapter *adap) | |||
| 604 | 622 | ||
| 605 | /* detach any active clients. This must be done first, because | 623 | /* detach any active clients. This must be done first, because |
| 606 | * it can fail; in which case we give up. */ | 624 | * it can fail; in which case we give up. */ |
| 607 | list_for_each_safe(item, _n, &adap->clients) { | 625 | list_for_each_entry_safe(client, _n, &adap->clients, list) { |
| 608 | struct i2c_driver *driver; | 626 | struct i2c_driver *driver; |
| 609 | 627 | ||
| 610 | client = list_entry(item, struct i2c_client, list); | ||
| 611 | driver = client->driver; | 628 | driver = client->driver; |
| 612 | 629 | ||
| 613 | /* new style, follow standard driver model */ | 630 | /* new style, follow standard driver model */ |
| @@ -646,6 +663,20 @@ EXPORT_SYMBOL(i2c_del_adapter); | |||
| 646 | 663 | ||
| 647 | /* ------------------------------------------------------------------------- */ | 664 | /* ------------------------------------------------------------------------- */ |
| 648 | 665 | ||
| 666 | static int __attach_adapter(struct device *dev, void *data) | ||
| 667 | { | ||
| 668 | struct i2c_adapter *adapter = to_i2c_adapter(dev); | ||
| 669 | struct i2c_driver *driver = data; | ||
| 670 | |||
| 671 | i2c_detect(adapter, driver); | ||
| 672 | |||
| 673 | /* Legacy drivers scan i2c busses directly */ | ||
| 674 | if (driver->attach_adapter) | ||
| 675 | driver->attach_adapter(adapter); | ||
| 676 | |||
| 677 | return 0; | ||
| 678 | } | ||
| 679 | |||
| 649 | /* | 680 | /* |
| 650 | * An i2c_driver is used with one or more i2c_client (device) nodes to access | 681 | * An i2c_driver is used with one or more i2c_client (device) nodes to access |
| 651 | * i2c slave chips, on a bus instance associated with some i2c_adapter. There | 682 | * i2c slave chips, on a bus instance associated with some i2c_adapter. There |
| @@ -685,72 +716,70 @@ int i2c_register_driver(struct module *owner, struct i2c_driver *driver) | |||
| 685 | 716 | ||
| 686 | pr_debug("i2c-core: driver [%s] registered\n", driver->driver.name); | 717 | pr_debug("i2c-core: driver [%s] registered\n", driver->driver.name); |
| 687 | 718 | ||
| 688 | /* legacy drivers scan i2c busses directly */ | 719 | INIT_LIST_HEAD(&driver->clients); |
| 689 | if (driver->attach_adapter) { | 720 | /* Walk the adapters that are already present */ |
| 690 | struct i2c_adapter *adapter; | 721 | class_for_each_device(&i2c_adapter_class, driver, __attach_adapter); |
| 691 | |||
| 692 | down(&i2c_adapter_class.sem); | ||
| 693 | list_for_each_entry(adapter, &i2c_adapter_class.devices, | ||
| 694 | dev.node) { | ||
| 695 | driver->attach_adapter(adapter); | ||
| 696 | } | ||
| 697 | up(&i2c_adapter_class.sem); | ||
| 698 | } | ||
| 699 | 722 | ||
| 700 | mutex_unlock(&core_lock); | 723 | mutex_unlock(&core_lock); |
| 701 | return 0; | 724 | return 0; |
| 702 | } | 725 | } |
| 703 | EXPORT_SYMBOL(i2c_register_driver); | 726 | EXPORT_SYMBOL(i2c_register_driver); |
| 704 | 727 | ||
| 705 | /** | 728 | static int __detach_adapter(struct device *dev, void *data) |
| 706 | * i2c_del_driver - unregister I2C driver | ||
| 707 | * @driver: the driver being unregistered | ||
| 708 | * Context: can sleep | ||
| 709 | */ | ||
| 710 | void i2c_del_driver(struct i2c_driver *driver) | ||
| 711 | { | 729 | { |
| 712 | struct list_head *item2, *_n; | 730 | struct i2c_adapter *adapter = to_i2c_adapter(dev); |
| 713 | struct i2c_client *client; | 731 | struct i2c_driver *driver = data; |
| 714 | struct i2c_adapter *adap; | 732 | struct i2c_client *client, *_n; |
| 715 | 733 | ||
| 716 | mutex_lock(&core_lock); | 734 | list_for_each_entry_safe(client, _n, &driver->clients, detected) { |
| 735 | dev_dbg(&adapter->dev, "Removing %s at 0x%x\n", | ||
| 736 | client->name, client->addr); | ||
| 737 | list_del(&client->detected); | ||
| 738 | i2c_unregister_device(client); | ||
| 739 | } | ||
| 717 | 740 | ||
| 718 | /* new-style driver? */ | ||
| 719 | if (is_newstyle_driver(driver)) | 741 | if (is_newstyle_driver(driver)) |
| 720 | goto unregister; | 742 | return 0; |
| 721 | 743 | ||
| 722 | /* Have a look at each adapter, if clients of this driver are still | 744 | /* Have a look at each adapter, if clients of this driver are still |
| 723 | * attached. If so, detach them to be able to kill the driver | 745 | * attached. If so, detach them to be able to kill the driver |
| 724 | * afterwards. | 746 | * afterwards. |
| 725 | */ | 747 | */ |
| 726 | down(&i2c_adapter_class.sem); | 748 | if (driver->detach_adapter) { |
| 727 | list_for_each_entry(adap, &i2c_adapter_class.devices, dev.node) { | 749 | if (driver->detach_adapter(adapter)) |
| 728 | if (driver->detach_adapter) { | 750 | dev_err(&adapter->dev, |
| 729 | if (driver->detach_adapter(adap)) { | 751 | "detach_adapter failed for driver [%s]\n", |
| 730 | dev_err(&adap->dev, "detach_adapter failed " | 752 | driver->driver.name); |
| 731 | "for driver [%s]\n", | 753 | } else { |
| 732 | driver->driver.name); | 754 | struct i2c_client *client, *_n; |
| 733 | } | 755 | |
| 734 | } else { | 756 | list_for_each_entry_safe(client, _n, &adapter->clients, list) { |
| 735 | list_for_each_safe(item2, _n, &adap->clients) { | 757 | if (client->driver != driver) |
| 736 | client = list_entry(item2, struct i2c_client, list); | 758 | continue; |
| 737 | if (client->driver != driver) | 759 | dev_dbg(&adapter->dev, |
| 738 | continue; | 760 | "detaching client [%s] at 0x%02x\n", |
| 739 | dev_dbg(&adap->dev, "detaching client [%s] " | 761 | client->name, client->addr); |
| 740 | "at 0x%02x\n", client->name, | 762 | if (driver->detach_client(client)) |
| 741 | client->addr); | 763 | dev_err(&adapter->dev, "detach_client " |
| 742 | if (driver->detach_client(client)) { | 764 | "failed for client [%s] at 0x%02x\n", |
| 743 | dev_err(&adap->dev, "detach_client " | 765 | client->name, client->addr); |
| 744 | "failed for client [%s] at " | ||
| 745 | "0x%02x\n", client->name, | ||
| 746 | client->addr); | ||
| 747 | } | ||
| 748 | } | ||
| 749 | } | 766 | } |
| 750 | } | 767 | } |
| 751 | up(&i2c_adapter_class.sem); | ||
| 752 | 768 | ||
| 753 | unregister: | 769 | return 0; |
| 770 | } | ||
| 771 | |||
| 772 | /** | ||
| 773 | * i2c_del_driver - unregister I2C driver | ||
| 774 | * @driver: the driver being unregistered | ||
| 775 | * Context: can sleep | ||
| 776 | */ | ||
| 777 | void i2c_del_driver(struct i2c_driver *driver) | ||
| 778 | { | ||
| 779 | mutex_lock(&core_lock); | ||
| 780 | |||
| 781 | class_for_each_device(&i2c_adapter_class, driver, __detach_adapter); | ||
| 782 | |||
| 754 | driver_unregister(&driver->driver); | 783 | driver_unregister(&driver->driver); |
| 755 | pr_debug("i2c-core: driver [%s] unregistered\n", driver->driver.name); | 784 | pr_debug("i2c-core: driver [%s] unregistered\n", driver->driver.name); |
| 756 | 785 | ||
| @@ -863,8 +892,9 @@ EXPORT_SYMBOL(i2c_detach_client); | |||
| 863 | */ | 892 | */ |
| 864 | struct i2c_client *i2c_use_client(struct i2c_client *client) | 893 | struct i2c_client *i2c_use_client(struct i2c_client *client) |
| 865 | { | 894 | { |
| 866 | get_device(&client->dev); | 895 | if (client && get_device(&client->dev)) |
| 867 | return client; | 896 | return client; |
| 897 | return NULL; | ||
| 868 | } | 898 | } |
| 869 | EXPORT_SYMBOL(i2c_use_client); | 899 | EXPORT_SYMBOL(i2c_use_client); |
| 870 | 900 | ||
| @@ -876,7 +906,8 @@ EXPORT_SYMBOL(i2c_use_client); | |||
| 876 | */ | 906 | */ |
| 877 | void i2c_release_client(struct i2c_client *client) | 907 | void i2c_release_client(struct i2c_client *client) |
| 878 | { | 908 | { |
| 879 | put_device(&client->dev); | 909 | if (client) |
| 910 | put_device(&client->dev); | ||
| 880 | } | 911 | } |
| 881 | EXPORT_SYMBOL(i2c_release_client); | 912 | EXPORT_SYMBOL(i2c_release_client); |
| 882 | 913 | ||
| @@ -942,10 +973,39 @@ module_exit(i2c_exit); | |||
| 942 | * ---------------------------------------------------- | 973 | * ---------------------------------------------------- |
| 943 | */ | 974 | */ |
| 944 | 975 | ||
| 976 | /** | ||
| 977 | * i2c_transfer - execute a single or combined I2C message | ||
| 978 | * @adap: Handle to I2C bus | ||
| 979 | * @msgs: One or more messages to execute before STOP is issued to | ||
| 980 | * terminate the operation; each message begins with a START. | ||
| 981 | * @num: Number of messages to be executed. | ||
| 982 | * | ||
| 983 | * Returns negative errno, else the number of messages executed. | ||
| 984 | * | ||
| 985 | * Note that there is no requirement that each message be sent to | ||
| 986 | * the same slave address, although that is the most common model. | ||
| 987 | */ | ||
| 945 | int i2c_transfer(struct i2c_adapter * adap, struct i2c_msg *msgs, int num) | 988 | int i2c_transfer(struct i2c_adapter * adap, struct i2c_msg *msgs, int num) |
| 946 | { | 989 | { |
| 947 | int ret; | 990 | int ret; |
| 948 | 991 | ||
| 992 | /* REVISIT the fault reporting model here is weak: | ||
| 993 | * | ||
| 994 | * - When we get an error after receiving N bytes from a slave, | ||
| 995 | * there is no way to report "N". | ||
| 996 | * | ||
| 997 | * - When we get a NAK after transmitting N bytes to a slave, | ||
| 998 | * there is no way to report "N" ... or to let the master | ||
| 999 | * continue executing the rest of this combined message, if | ||
| 1000 | * that's the appropriate response. | ||
| 1001 | * | ||
| 1002 | * - When for example "num" is two and we successfully complete | ||
| 1003 | * the first message but get an error part way through the | ||
| 1004 | * second, it's unclear whether that should be reported as | ||
| 1005 | * one (discarding status on the second message) or errno | ||
| 1006 | * (discarding status on the first one). | ||
| 1007 | */ | ||
| 1008 | |||
| 949 | if (adap->algo->master_xfer) { | 1009 | if (adap->algo->master_xfer) { |
| 950 | #ifdef DEBUG | 1010 | #ifdef DEBUG |
| 951 | for (ret = 0; ret < num; ret++) { | 1011 | for (ret = 0; ret < num; ret++) { |
| @@ -971,11 +1031,19 @@ int i2c_transfer(struct i2c_adapter * adap, struct i2c_msg *msgs, int num) | |||
| 971 | return ret; | 1031 | return ret; |
| 972 | } else { | 1032 | } else { |
| 973 | dev_dbg(&adap->dev, "I2C level transfers not supported\n"); | 1033 | dev_dbg(&adap->dev, "I2C level transfers not supported\n"); |
| 974 | return -ENOSYS; | 1034 | return -EOPNOTSUPP; |
| 975 | } | 1035 | } |
| 976 | } | 1036 | } |
| 977 | EXPORT_SYMBOL(i2c_transfer); | 1037 | EXPORT_SYMBOL(i2c_transfer); |
| 978 | 1038 | ||
| 1039 | /** | ||
| 1040 | * i2c_master_send - issue a single I2C message in master transmit mode | ||
| 1041 | * @client: Handle to slave device | ||
| 1042 | * @buf: Data that will be written to the slave | ||
| 1043 | * @count: How many bytes to write | ||
| 1044 | * | ||
| 1045 | * Returns negative errno, or else the number of bytes written. | ||
| 1046 | */ | ||
| 979 | int i2c_master_send(struct i2c_client *client,const char *buf ,int count) | 1047 | int i2c_master_send(struct i2c_client *client,const char *buf ,int count) |
| 980 | { | 1048 | { |
| 981 | int ret; | 1049 | int ret; |
| @@ -995,6 +1063,14 @@ int i2c_master_send(struct i2c_client *client,const char *buf ,int count) | |||
| 995 | } | 1063 | } |
| 996 | EXPORT_SYMBOL(i2c_master_send); | 1064 | EXPORT_SYMBOL(i2c_master_send); |
| 997 | 1065 | ||
| 1066 | /** | ||
| 1067 | * i2c_master_recv - issue a single I2C message in master receive mode | ||
| 1068 | * @client: Handle to slave device | ||
| 1069 | * @buf: Where to store data read from slave | ||
| 1070 | * @count: How many bytes to read | ||
| 1071 | * | ||
| 1072 | * Returns negative errno, or else the number of bytes read. | ||
| 1073 | */ | ||
| 998 | int i2c_master_recv(struct i2c_client *client, char *buf ,int count) | 1074 | int i2c_master_recv(struct i2c_client *client, char *buf ,int count) |
| 999 | { | 1075 | { |
| 1000 | struct i2c_adapter *adap=client->adapter; | 1076 | struct i2c_adapter *adap=client->adapter; |
| @@ -1103,7 +1179,7 @@ int i2c_probe(struct i2c_adapter *adapter, | |||
| 1103 | 1179 | ||
| 1104 | dev_warn(&adapter->dev, "SMBus Quick command not supported, " | 1180 | dev_warn(&adapter->dev, "SMBus Quick command not supported, " |
| 1105 | "can't probe for chips\n"); | 1181 | "can't probe for chips\n"); |
| 1106 | return -1; | 1182 | return -EOPNOTSUPP; |
| 1107 | } | 1183 | } |
| 1108 | 1184 | ||
| 1109 | /* Probe entries are done second, and are not affected by ignore | 1185 | /* Probe entries are done second, and are not affected by ignore |
| @@ -1157,6 +1233,179 @@ int i2c_probe(struct i2c_adapter *adapter, | |||
| 1157 | } | 1233 | } |
| 1158 | EXPORT_SYMBOL(i2c_probe); | 1234 | EXPORT_SYMBOL(i2c_probe); |
| 1159 | 1235 | ||
| 1236 | /* Separate detection function for new-style drivers */ | ||
| 1237 | static int i2c_detect_address(struct i2c_client *temp_client, int kind, | ||
| 1238 | struct i2c_driver *driver) | ||
| 1239 | { | ||
| 1240 | struct i2c_board_info info; | ||
| 1241 | struct i2c_adapter *adapter = temp_client->adapter; | ||
| 1242 | int addr = temp_client->addr; | ||
| 1243 | int err; | ||
| 1244 | |||
| 1245 | /* Make sure the address is valid */ | ||
| 1246 | if (addr < 0x03 || addr > 0x77) { | ||
| 1247 | dev_warn(&adapter->dev, "Invalid probe address 0x%02x\n", | ||
| 1248 | addr); | ||
| 1249 | return -EINVAL; | ||
| 1250 | } | ||
| 1251 | |||
| 1252 | /* Skip if already in use */ | ||
| 1253 | if (i2c_check_addr(adapter, addr)) | ||
| 1254 | return 0; | ||
| 1255 | |||
| 1256 | /* Make sure there is something at this address, unless forced */ | ||
| 1257 | if (kind < 0) { | ||
| 1258 | if (i2c_smbus_xfer(adapter, addr, 0, 0, 0, | ||
| 1259 | I2C_SMBUS_QUICK, NULL) < 0) | ||
| 1260 | return 0; | ||
| 1261 | |||
| 1262 | /* prevent 24RF08 corruption */ | ||
| 1263 | if ((addr & ~0x0f) == 0x50) | ||
| 1264 | i2c_smbus_xfer(adapter, addr, 0, 0, 0, | ||
| 1265 | I2C_SMBUS_QUICK, NULL); | ||
| 1266 | } | ||
| 1267 | |||
| 1268 | /* Finally call the custom detection function */ | ||
| 1269 | memset(&info, 0, sizeof(struct i2c_board_info)); | ||
| 1270 | info.addr = addr; | ||
| 1271 | err = driver->detect(temp_client, kind, &info); | ||
| 1272 | if (err) { | ||
| 1273 | /* -ENODEV is returned if the detection fails. We catch it | ||
| 1274 | here as this isn't an error. */ | ||
| 1275 | return err == -ENODEV ? 0 : err; | ||
| 1276 | } | ||
| 1277 | |||
| 1278 | /* Consistency check */ | ||
| 1279 | if (info.type[0] == '\0') { | ||
| 1280 | dev_err(&adapter->dev, "%s detection function provided " | ||
| 1281 | "no name for 0x%x\n", driver->driver.name, | ||
| 1282 | addr); | ||
| 1283 | } else { | ||
| 1284 | struct i2c_client *client; | ||
| 1285 | |||
| 1286 | /* Detection succeeded, instantiate the device */ | ||
| 1287 | dev_dbg(&adapter->dev, "Creating %s at 0x%02x\n", | ||
| 1288 | info.type, info.addr); | ||
| 1289 | client = i2c_new_device(adapter, &info); | ||
| 1290 | if (client) | ||
| 1291 | list_add_tail(&client->detected, &driver->clients); | ||
| 1292 | else | ||
| 1293 | dev_err(&adapter->dev, "Failed creating %s at 0x%02x\n", | ||
| 1294 | info.type, info.addr); | ||
| 1295 | } | ||
| 1296 | return 0; | ||
| 1297 | } | ||
| 1298 | |||
| 1299 | static int i2c_detect(struct i2c_adapter *adapter, struct i2c_driver *driver) | ||
| 1300 | { | ||
| 1301 | const struct i2c_client_address_data *address_data; | ||
| 1302 | struct i2c_client *temp_client; | ||
| 1303 | int i, err = 0; | ||
| 1304 | int adap_id = i2c_adapter_id(adapter); | ||
| 1305 | |||
| 1306 | address_data = driver->address_data; | ||
| 1307 | if (!driver->detect || !address_data) | ||
| 1308 | return 0; | ||
| 1309 | |||
| 1310 | /* Set up a temporary client to help detect callback */ | ||
| 1311 | temp_client = kzalloc(sizeof(struct i2c_client), GFP_KERNEL); | ||
| 1312 | if (!temp_client) | ||
| 1313 | return -ENOMEM; | ||
| 1314 | temp_client->adapter = adapter; | ||
| 1315 | |||
| 1316 | /* Force entries are done first, and are not affected by ignore | ||
| 1317 | entries */ | ||
| 1318 | if (address_data->forces) { | ||
| 1319 | const unsigned short * const *forces = address_data->forces; | ||
| 1320 | int kind; | ||
| 1321 | |||
| 1322 | for (kind = 0; forces[kind]; kind++) { | ||
| 1323 | for (i = 0; forces[kind][i] != I2C_CLIENT_END; | ||
| 1324 | i += 2) { | ||
| 1325 | if (forces[kind][i] == adap_id | ||
| 1326 | || forces[kind][i] == ANY_I2C_BUS) { | ||
| 1327 | dev_dbg(&adapter->dev, "found force " | ||
| 1328 | "parameter for adapter %d, " | ||
| 1329 | "addr 0x%02x, kind %d\n", | ||
| 1330 | adap_id, forces[kind][i + 1], | ||
| 1331 | kind); | ||
| 1332 | temp_client->addr = forces[kind][i + 1]; | ||
| 1333 | err = i2c_detect_address(temp_client, | ||
| 1334 | kind, driver); | ||
| 1335 | if (err) | ||
| 1336 | goto exit_free; | ||
| 1337 | } | ||
| 1338 | } | ||
| 1339 | } | ||
| 1340 | } | ||
| 1341 | |||
| 1342 | /* Stop here if we can't use SMBUS_QUICK */ | ||
| 1343 | if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_QUICK)) { | ||
| 1344 | if (address_data->probe[0] == I2C_CLIENT_END | ||
| 1345 | && address_data->normal_i2c[0] == I2C_CLIENT_END) | ||
| 1346 | goto exit_free; | ||
| 1347 | |||
| 1348 | dev_warn(&adapter->dev, "SMBus Quick command not supported, " | ||
| 1349 | "can't probe for chips\n"); | ||
| 1350 | err = -EOPNOTSUPP; | ||
| 1351 | goto exit_free; | ||
| 1352 | } | ||
| 1353 | |||
| 1354 | /* Stop here if the classes do not match */ | ||
| 1355 | if (!(adapter->class & driver->class)) | ||
| 1356 | goto exit_free; | ||
| 1357 | |||
| 1358 | /* Probe entries are done second, and are not affected by ignore | ||
| 1359 | entries either */ | ||
| 1360 | for (i = 0; address_data->probe[i] != I2C_CLIENT_END; i += 2) { | ||
| 1361 | if (address_data->probe[i] == adap_id | ||
| 1362 | || address_data->probe[i] == ANY_I2C_BUS) { | ||
| 1363 | dev_dbg(&adapter->dev, "found probe parameter for " | ||
| 1364 | "adapter %d, addr 0x%02x\n", adap_id, | ||
| 1365 | address_data->probe[i + 1]); | ||
| 1366 | temp_client->addr = address_data->probe[i + 1]; | ||
| 1367 | err = i2c_detect_address(temp_client, -1, driver); | ||
| 1368 | if (err) | ||
| 1369 | goto exit_free; | ||
| 1370 | } | ||
| 1371 | } | ||
| 1372 | |||
| 1373 | /* Normal entries are done last, unless shadowed by an ignore entry */ | ||
| 1374 | for (i = 0; address_data->normal_i2c[i] != I2C_CLIENT_END; i += 1) { | ||
| 1375 | int j, ignore; | ||
| 1376 | |||
| 1377 | ignore = 0; | ||
| 1378 | for (j = 0; address_data->ignore[j] != I2C_CLIENT_END; | ||
| 1379 | j += 2) { | ||
| 1380 | if ((address_data->ignore[j] == adap_id || | ||
| 1381 | address_data->ignore[j] == ANY_I2C_BUS) | ||
| 1382 | && address_data->ignore[j + 1] | ||
| 1383 | == address_data->normal_i2c[i]) { | ||
| 1384 | dev_dbg(&adapter->dev, "found ignore " | ||
| 1385 | "parameter for adapter %d, " | ||
| 1386 | "addr 0x%02x\n", adap_id, | ||
| 1387 | address_data->ignore[j + 1]); | ||
| 1388 | ignore = 1; | ||
| 1389 | break; | ||
| 1390 | } | ||
| 1391 | } | ||
| 1392 | if (ignore) | ||
| 1393 | continue; | ||
| 1394 | |||
| 1395 | dev_dbg(&adapter->dev, "found normal entry for adapter %d, " | ||
| 1396 | "addr 0x%02x\n", adap_id, | ||
| 1397 | address_data->normal_i2c[i]); | ||
| 1398 | temp_client->addr = address_data->normal_i2c[i]; | ||
| 1399 | err = i2c_detect_address(temp_client, -1, driver); | ||
| 1400 | if (err) | ||
| 1401 | goto exit_free; | ||
| 1402 | } | ||
| 1403 | |||
| 1404 | exit_free: | ||
| 1405 | kfree(temp_client); | ||
| 1406 | return err; | ||
| 1407 | } | ||
| 1408 | |||
| 1160 | struct i2c_client * | 1409 | struct i2c_client * |
| 1161 | i2c_new_probed_device(struct i2c_adapter *adap, | 1410 | i2c_new_probed_device(struct i2c_adapter *adap, |
| 1162 | struct i2c_board_info *info, | 1411 | struct i2c_board_info *info, |
| @@ -1295,29 +1544,38 @@ static int i2c_smbus_check_pec(u8 cpec, struct i2c_msg *msg) | |||
| 1295 | if (rpec != cpec) { | 1544 | if (rpec != cpec) { |
| 1296 | pr_debug("i2c-core: Bad PEC 0x%02x vs. 0x%02x\n", | 1545 | pr_debug("i2c-core: Bad PEC 0x%02x vs. 0x%02x\n", |
| 1297 | rpec, cpec); | 1546 | rpec, cpec); |
| 1298 | return -1; | 1547 | return -EBADMSG; |
| 1299 | } | 1548 | } |
| 1300 | return 0; | 1549 | return 0; |
| 1301 | } | 1550 | } |
| 1302 | 1551 | ||
| 1303 | s32 i2c_smbus_write_quick(struct i2c_client *client, u8 value) | 1552 | /** |
| 1304 | { | 1553 | * i2c_smbus_read_byte - SMBus "receive byte" protocol |
| 1305 | return i2c_smbus_xfer(client->adapter,client->addr,client->flags, | 1554 | * @client: Handle to slave device |
| 1306 | value,0,I2C_SMBUS_QUICK,NULL); | 1555 | * |
| 1307 | } | 1556 | * This executes the SMBus "receive byte" protocol, returning negative errno |
| 1308 | EXPORT_SYMBOL(i2c_smbus_write_quick); | 1557 | * else the byte received from the device. |
| 1309 | 1558 | */ | |
| 1310 | s32 i2c_smbus_read_byte(struct i2c_client *client) | 1559 | s32 i2c_smbus_read_byte(struct i2c_client *client) |
| 1311 | { | 1560 | { |
| 1312 | union i2c_smbus_data data; | 1561 | union i2c_smbus_data data; |
| 1313 | if (i2c_smbus_xfer(client->adapter,client->addr,client->flags, | 1562 | int status; |
| 1314 | I2C_SMBUS_READ,0,I2C_SMBUS_BYTE, &data)) | 1563 | |
| 1315 | return -1; | 1564 | status = i2c_smbus_xfer(client->adapter, client->addr, client->flags, |
| 1316 | else | 1565 | I2C_SMBUS_READ, 0, |
| 1317 | return data.byte; | 1566 | I2C_SMBUS_BYTE, &data); |
| 1567 | return (status < 0) ? status : data.byte; | ||
| 1318 | } | 1568 | } |
| 1319 | EXPORT_SYMBOL(i2c_smbus_read_byte); | 1569 | EXPORT_SYMBOL(i2c_smbus_read_byte); |
| 1320 | 1570 | ||
| 1571 | /** | ||
| 1572 | * i2c_smbus_write_byte - SMBus "send byte" protocol | ||
| 1573 | * @client: Handle to slave device | ||
| 1574 | * @value: Byte to be sent | ||
| 1575 | * | ||
| 1576 | * This executes the SMBus "send byte" protocol, returning negative errno | ||
| 1577 | * else zero on success. | ||
| 1578 | */ | ||
| 1321 | s32 i2c_smbus_write_byte(struct i2c_client *client, u8 value) | 1579 | s32 i2c_smbus_write_byte(struct i2c_client *client, u8 value) |
| 1322 | { | 1580 | { |
| 1323 | return i2c_smbus_xfer(client->adapter,client->addr,client->flags, | 1581 | return i2c_smbus_xfer(client->adapter,client->addr,client->flags, |
| @@ -1325,17 +1583,35 @@ s32 i2c_smbus_write_byte(struct i2c_client *client, u8 value) | |||
| 1325 | } | 1583 | } |
| 1326 | EXPORT_SYMBOL(i2c_smbus_write_byte); | 1584 | EXPORT_SYMBOL(i2c_smbus_write_byte); |
| 1327 | 1585 | ||
| 1586 | /** | ||
| 1587 | * i2c_smbus_read_byte_data - SMBus "read byte" protocol | ||
| 1588 | * @client: Handle to slave device | ||
| 1589 | * @command: Byte interpreted by slave | ||
| 1590 | * | ||
| 1591 | * This executes the SMBus "read byte" protocol, returning negative errno | ||
| 1592 | * else a data byte received from the device. | ||
| 1593 | */ | ||
| 1328 | s32 i2c_smbus_read_byte_data(struct i2c_client *client, u8 command) | 1594 | s32 i2c_smbus_read_byte_data(struct i2c_client *client, u8 command) |
| 1329 | { | 1595 | { |
| 1330 | union i2c_smbus_data data; | 1596 | union i2c_smbus_data data; |
| 1331 | if (i2c_smbus_xfer(client->adapter,client->addr,client->flags, | 1597 | int status; |
| 1332 | I2C_SMBUS_READ,command, I2C_SMBUS_BYTE_DATA,&data)) | 1598 | |
| 1333 | return -1; | 1599 | status = i2c_smbus_xfer(client->adapter, client->addr, client->flags, |
| 1334 | else | 1600 | I2C_SMBUS_READ, command, |
| 1335 | return data.byte; | 1601 | I2C_SMBUS_BYTE_DATA, &data); |
| 1602 | return (status < 0) ? status : data.byte; | ||
| 1336 | } | 1603 | } |
| 1337 | EXPORT_SYMBOL(i2c_smbus_read_byte_data); | 1604 | EXPORT_SYMBOL(i2c_smbus_read_byte_data); |
| 1338 | 1605 | ||
| 1606 | /** | ||
| 1607 | * i2c_smbus_write_byte_data - SMBus "write byte" protocol | ||
| 1608 | * @client: Handle to slave device | ||
| 1609 | * @command: Byte interpreted by slave | ||
| 1610 | * @value: Byte being written | ||
| 1611 | * | ||
| 1612 | * This executes the SMBus "write byte" protocol, returning negative errno | ||
| 1613 | * else zero on success. | ||
| 1614 | */ | ||
| 1339 | s32 i2c_smbus_write_byte_data(struct i2c_client *client, u8 command, u8 value) | 1615 | s32 i2c_smbus_write_byte_data(struct i2c_client *client, u8 command, u8 value) |
| 1340 | { | 1616 | { |
| 1341 | union i2c_smbus_data data; | 1617 | union i2c_smbus_data data; |
| @@ -1346,17 +1622,35 @@ s32 i2c_smbus_write_byte_data(struct i2c_client *client, u8 command, u8 value) | |||
| 1346 | } | 1622 | } |
| 1347 | EXPORT_SYMBOL(i2c_smbus_write_byte_data); | 1623 | EXPORT_SYMBOL(i2c_smbus_write_byte_data); |
| 1348 | 1624 | ||
| 1625 | /** | ||
| 1626 | * i2c_smbus_read_word_data - SMBus "read word" protocol | ||
| 1627 | * @client: Handle to slave device | ||
| 1628 | * @command: Byte interpreted by slave | ||
| 1629 | * | ||
| 1630 | * This executes the SMBus "read word" protocol, returning negative errno | ||
| 1631 | * else a 16-bit unsigned "word" received from the device. | ||
| 1632 | */ | ||
| 1349 | s32 i2c_smbus_read_word_data(struct i2c_client *client, u8 command) | 1633 | s32 i2c_smbus_read_word_data(struct i2c_client *client, u8 command) |
| 1350 | { | 1634 | { |
| 1351 | union i2c_smbus_data data; | 1635 | union i2c_smbus_data data; |
| 1352 | if (i2c_smbus_xfer(client->adapter,client->addr,client->flags, | 1636 | int status; |
| 1353 | I2C_SMBUS_READ,command, I2C_SMBUS_WORD_DATA, &data)) | 1637 | |
| 1354 | return -1; | 1638 | status = i2c_smbus_xfer(client->adapter, client->addr, client->flags, |
| 1355 | else | 1639 | I2C_SMBUS_READ, command, |
| 1356 | return data.word; | 1640 | I2C_SMBUS_WORD_DATA, &data); |
| 1641 | return (status < 0) ? status : data.word; | ||
| 1357 | } | 1642 | } |
| 1358 | EXPORT_SYMBOL(i2c_smbus_read_word_data); | 1643 | EXPORT_SYMBOL(i2c_smbus_read_word_data); |
| 1359 | 1644 | ||
| 1645 | /** | ||
| 1646 | * i2c_smbus_write_word_data - SMBus "write word" protocol | ||
| 1647 | * @client: Handle to slave device | ||
| 1648 | * @command: Byte interpreted by slave | ||
| 1649 | * @value: 16-bit "word" being written | ||
| 1650 | * | ||
| 1651 | * This executes the SMBus "write word" protocol, returning negative errno | ||
| 1652 | * else zero on success. | ||
| 1653 | */ | ||
| 1360 | s32 i2c_smbus_write_word_data(struct i2c_client *client, u8 command, u16 value) | 1654 | s32 i2c_smbus_write_word_data(struct i2c_client *client, u8 command, u16 value) |
| 1361 | { | 1655 | { |
| 1362 | union i2c_smbus_data data; | 1656 | union i2c_smbus_data data; |
| @@ -1368,15 +1662,14 @@ s32 i2c_smbus_write_word_data(struct i2c_client *client, u8 command, u16 value) | |||
| 1368 | EXPORT_SYMBOL(i2c_smbus_write_word_data); | 1662 | EXPORT_SYMBOL(i2c_smbus_write_word_data); |
| 1369 | 1663 | ||
| 1370 | /** | 1664 | /** |
| 1371 | * i2c_smbus_read_block_data - SMBus block read request | 1665 | * i2c_smbus_read_block_data - SMBus "block read" protocol |
| 1372 | * @client: Handle to slave device | 1666 | * @client: Handle to slave device |
| 1373 | * @command: Command byte issued to let the slave know what data should | 1667 | * @command: Byte interpreted by slave |
| 1374 | * be returned | ||
| 1375 | * @values: Byte array into which data will be read; big enough to hold | 1668 | * @values: Byte array into which data will be read; big enough to hold |
| 1376 | * the data returned by the slave. SMBus allows at most 32 bytes. | 1669 | * the data returned by the slave. SMBus allows at most 32 bytes. |
| 1377 | * | 1670 | * |
| 1378 | * Returns the number of bytes read in the slave's response, else a | 1671 | * This executes the SMBus "block read" protocol, returning negative errno |
| 1379 | * negative number to indicate some kind of error. | 1672 | * else the number of data bytes in the slave's response. |
| 1380 | * | 1673 | * |
| 1381 | * Note that using this function requires that the client's adapter support | 1674 | * Note that using this function requires that the client's adapter support |
| 1382 | * the I2C_FUNC_SMBUS_READ_BLOCK_DATA functionality. Not all adapter drivers | 1675 | * the I2C_FUNC_SMBUS_READ_BLOCK_DATA functionality. Not all adapter drivers |
| @@ -1387,17 +1680,29 @@ s32 i2c_smbus_read_block_data(struct i2c_client *client, u8 command, | |||
| 1387 | u8 *values) | 1680 | u8 *values) |
| 1388 | { | 1681 | { |
| 1389 | union i2c_smbus_data data; | 1682 | union i2c_smbus_data data; |
| 1683 | int status; | ||
| 1390 | 1684 | ||
| 1391 | if (i2c_smbus_xfer(client->adapter, client->addr, client->flags, | 1685 | status = i2c_smbus_xfer(client->adapter, client->addr, client->flags, |
| 1392 | I2C_SMBUS_READ, command, | 1686 | I2C_SMBUS_READ, command, |
| 1393 | I2C_SMBUS_BLOCK_DATA, &data)) | 1687 | I2C_SMBUS_BLOCK_DATA, &data); |
| 1394 | return -1; | 1688 | if (status) |
| 1689 | return status; | ||
| 1395 | 1690 | ||
| 1396 | memcpy(values, &data.block[1], data.block[0]); | 1691 | memcpy(values, &data.block[1], data.block[0]); |
| 1397 | return data.block[0]; | 1692 | return data.block[0]; |
| 1398 | } | 1693 | } |
| 1399 | EXPORT_SYMBOL(i2c_smbus_read_block_data); | 1694 | EXPORT_SYMBOL(i2c_smbus_read_block_data); |
| 1400 | 1695 | ||
| 1696 | /** | ||
| 1697 | * i2c_smbus_write_block_data - SMBus "block write" protocol | ||
| 1698 | * @client: Handle to slave device | ||
| 1699 | * @command: Byte interpreted by slave | ||
| 1700 | * @length: Size of data block; SMBus allows at most 32 bytes | ||
| 1701 | * @values: Byte array which will be written. | ||
| 1702 | * | ||
| 1703 | * This executes the SMBus "block write" protocol, returning negative errno | ||
| 1704 | * else zero on success. | ||
| 1705 | */ | ||
| 1401 | s32 i2c_smbus_write_block_data(struct i2c_client *client, u8 command, | 1706 | s32 i2c_smbus_write_block_data(struct i2c_client *client, u8 command, |
| 1402 | u8 length, const u8 *values) | 1707 | u8 length, const u8 *values) |
| 1403 | { | 1708 | { |
| @@ -1418,14 +1723,16 @@ s32 i2c_smbus_read_i2c_block_data(struct i2c_client *client, u8 command, | |||
| 1418 | u8 length, u8 *values) | 1723 | u8 length, u8 *values) |
| 1419 | { | 1724 | { |
| 1420 | union i2c_smbus_data data; | 1725 | union i2c_smbus_data data; |
| 1726 | int status; | ||
| 1421 | 1727 | ||
| 1422 | if (length > I2C_SMBUS_BLOCK_MAX) | 1728 | if (length > I2C_SMBUS_BLOCK_MAX) |
| 1423 | length = I2C_SMBUS_BLOCK_MAX; | 1729 | length = I2C_SMBUS_BLOCK_MAX; |
| 1424 | data.block[0] = length; | 1730 | data.block[0] = length; |
| 1425 | if (i2c_smbus_xfer(client->adapter,client->addr,client->flags, | 1731 | status = i2c_smbus_xfer(client->adapter, client->addr, client->flags, |
| 1426 | I2C_SMBUS_READ,command, | 1732 | I2C_SMBUS_READ, command, |
| 1427 | I2C_SMBUS_I2C_BLOCK_DATA,&data)) | 1733 | I2C_SMBUS_I2C_BLOCK_DATA, &data); |
| 1428 | return -1; | 1734 | if (status < 0) |
| 1735 | return status; | ||
| 1429 | 1736 | ||
| 1430 | memcpy(values, &data.block[1], data.block[0]); | 1737 | memcpy(values, &data.block[1], data.block[0]); |
| 1431 | return data.block[0]; | 1738 | return data.block[0]; |
| @@ -1466,6 +1773,7 @@ static s32 i2c_smbus_xfer_emulated(struct i2c_adapter * adapter, u16 addr, | |||
| 1466 | }; | 1773 | }; |
| 1467 | int i; | 1774 | int i; |
| 1468 | u8 partial_pec = 0; | 1775 | u8 partial_pec = 0; |
| 1776 | int status; | ||
| 1469 | 1777 | ||
| 1470 | msgbuf0[0] = command; | 1778 | msgbuf0[0] = command; |
| 1471 | switch(size) { | 1779 | switch(size) { |
| @@ -1515,10 +1823,10 @@ static s32 i2c_smbus_xfer_emulated(struct i2c_adapter * adapter, u16 addr, | |||
| 1515 | } else { | 1823 | } else { |
| 1516 | msg[0].len = data->block[0] + 2; | 1824 | msg[0].len = data->block[0] + 2; |
| 1517 | if (msg[0].len > I2C_SMBUS_BLOCK_MAX + 2) { | 1825 | if (msg[0].len > I2C_SMBUS_BLOCK_MAX + 2) { |
| 1518 | dev_err(&adapter->dev, "smbus_access called with " | 1826 | dev_err(&adapter->dev, |
| 1519 | "invalid block write size (%d)\n", | 1827 | "Invalid block write size %d\n", |
| 1520 | data->block[0]); | 1828 | data->block[0]); |
| 1521 | return -1; | 1829 | return -EINVAL; |
| 1522 | } | 1830 | } |
| 1523 | for (i = 1; i < msg[0].len; i++) | 1831 | for (i = 1; i < msg[0].len; i++) |
| 1524 | msgbuf0[i] = data->block[i-1]; | 1832 | msgbuf0[i] = data->block[i-1]; |
| @@ -1528,10 +1836,10 @@ static s32 i2c_smbus_xfer_emulated(struct i2c_adapter * adapter, u16 addr, | |||
| 1528 | num = 2; /* Another special case */ | 1836 | num = 2; /* Another special case */ |
| 1529 | read_write = I2C_SMBUS_READ; | 1837 | read_write = I2C_SMBUS_READ; |
| 1530 | if (data->block[0] > I2C_SMBUS_BLOCK_MAX) { | 1838 | if (data->block[0] > I2C_SMBUS_BLOCK_MAX) { |
| 1531 | dev_err(&adapter->dev, "%s called with invalid " | 1839 | dev_err(&adapter->dev, |
| 1532 | "block proc call size (%d)\n", __func__, | 1840 | "Invalid block write size %d\n", |
| 1533 | data->block[0]); | 1841 | data->block[0]); |
| 1534 | return -1; | 1842 | return -EINVAL; |
| 1535 | } | 1843 | } |
| 1536 | msg[0].len = data->block[0] + 2; | 1844 | msg[0].len = data->block[0] + 2; |
| 1537 | for (i = 1; i < msg[0].len; i++) | 1845 | for (i = 1; i < msg[0].len; i++) |
| @@ -1546,19 +1854,18 @@ static s32 i2c_smbus_xfer_emulated(struct i2c_adapter * adapter, u16 addr, | |||
| 1546 | } else { | 1854 | } else { |
| 1547 | msg[0].len = data->block[0] + 1; | 1855 | msg[0].len = data->block[0] + 1; |
| 1548 | if (msg[0].len > I2C_SMBUS_BLOCK_MAX + 1) { | 1856 | if (msg[0].len > I2C_SMBUS_BLOCK_MAX + 1) { |
| 1549 | dev_err(&adapter->dev, "i2c_smbus_xfer_emulated called with " | 1857 | dev_err(&adapter->dev, |
| 1550 | "invalid block write size (%d)\n", | 1858 | "Invalid block write size %d\n", |
| 1551 | data->block[0]); | 1859 | data->block[0]); |
| 1552 | return -1; | 1860 | return -EINVAL; |
| 1553 | } | 1861 | } |
| 1554 | for (i = 1; i <= data->block[0]; i++) | 1862 | for (i = 1; i <= data->block[0]; i++) |
| 1555 | msgbuf0[i] = data->block[i]; | 1863 | msgbuf0[i] = data->block[i]; |
| 1556 | } | 1864 | } |
| 1557 | break; | 1865 | break; |
| 1558 | default: | 1866 | default: |
| 1559 | dev_err(&adapter->dev, "smbus_access called with invalid size (%d)\n", | 1867 | dev_err(&adapter->dev, "Unsupported transaction %d\n", size); |
| 1560 | size); | 1868 | return -EOPNOTSUPP; |
| 1561 | return -1; | ||
| 1562 | } | 1869 | } |
| 1563 | 1870 | ||
| 1564 | i = ((flags & I2C_CLIENT_PEC) && size != I2C_SMBUS_QUICK | 1871 | i = ((flags & I2C_CLIENT_PEC) && size != I2C_SMBUS_QUICK |
| @@ -1576,13 +1883,15 @@ static s32 i2c_smbus_xfer_emulated(struct i2c_adapter * adapter, u16 addr, | |||
| 1576 | msg[num-1].len++; | 1883 | msg[num-1].len++; |
| 1577 | } | 1884 | } |
| 1578 | 1885 | ||
| 1579 | if (i2c_transfer(adapter, msg, num) < 0) | 1886 | status = i2c_transfer(adapter, msg, num); |
| 1580 | return -1; | 1887 | if (status < 0) |
| 1888 | return status; | ||
| 1581 | 1889 | ||
| 1582 | /* Check PEC if last message is a read */ | 1890 | /* Check PEC if last message is a read */ |
| 1583 | if (i && (msg[num-1].flags & I2C_M_RD)) { | 1891 | if (i && (msg[num-1].flags & I2C_M_RD)) { |
| 1584 | if (i2c_smbus_check_pec(partial_pec, &msg[num-1]) < 0) | 1892 | status = i2c_smbus_check_pec(partial_pec, &msg[num-1]); |
| 1585 | return -1; | 1893 | if (status < 0) |
| 1894 | return status; | ||
| 1586 | } | 1895 | } |
| 1587 | 1896 | ||
| 1588 | if (read_write == I2C_SMBUS_READ) | 1897 | if (read_write == I2C_SMBUS_READ) |
| @@ -1610,9 +1919,21 @@ static s32 i2c_smbus_xfer_emulated(struct i2c_adapter * adapter, u16 addr, | |||
| 1610 | return 0; | 1919 | return 0; |
| 1611 | } | 1920 | } |
| 1612 | 1921 | ||
| 1613 | 1922 | /** | |
| 1923 | * i2c_smbus_xfer - execute SMBus protocol operations | ||
| 1924 | * @adapter: Handle to I2C bus | ||
| 1925 | * @addr: Address of SMBus slave on that bus | ||
| 1926 | * @flags: I2C_CLIENT_* flags (usually zero or I2C_CLIENT_PEC) | ||
| 1927 | * @read_write: I2C_SMBUS_READ or I2C_SMBUS_WRITE | ||
| 1928 | * @command: Byte interpreted by slave, for protocols which use such bytes | ||
| 1929 | * @protocol: SMBus protocol operation to execute, such as I2C_SMBUS_PROC_CALL | ||
| 1930 | * @data: Data to be read or written | ||
| 1931 | * | ||
| 1932 | * This executes an SMBus protocol operation, and returns a negative | ||
| 1933 | * errno code else zero on success. | ||
| 1934 | */ | ||
| 1614 | s32 i2c_smbus_xfer(struct i2c_adapter * adapter, u16 addr, unsigned short flags, | 1935 | s32 i2c_smbus_xfer(struct i2c_adapter * adapter, u16 addr, unsigned short flags, |
| 1615 | char read_write, u8 command, int size, | 1936 | char read_write, u8 command, int protocol, |
| 1616 | union i2c_smbus_data * data) | 1937 | union i2c_smbus_data * data) |
| 1617 | { | 1938 | { |
| 1618 | s32 res; | 1939 | s32 res; |
| @@ -1622,11 +1943,11 @@ s32 i2c_smbus_xfer(struct i2c_adapter * adapter, u16 addr, unsigned short flags, | |||
| 1622 | if (adapter->algo->smbus_xfer) { | 1943 | if (adapter->algo->smbus_xfer) { |
| 1623 | mutex_lock(&adapter->bus_lock); | 1944 | mutex_lock(&adapter->bus_lock); |
| 1624 | res = adapter->algo->smbus_xfer(adapter,addr,flags,read_write, | 1945 | res = adapter->algo->smbus_xfer(adapter,addr,flags,read_write, |
| 1625 | command,size,data); | 1946 | command, protocol, data); |
| 1626 | mutex_unlock(&adapter->bus_lock); | 1947 | mutex_unlock(&adapter->bus_lock); |
| 1627 | } else | 1948 | } else |
| 1628 | res = i2c_smbus_xfer_emulated(adapter,addr,flags,read_write, | 1949 | res = i2c_smbus_xfer_emulated(adapter,addr,flags,read_write, |
| 1629 | command,size,data); | 1950 | command, protocol, data); |
| 1630 | 1951 | ||
| 1631 | return res; | 1952 | return res; |
| 1632 | } | 1953 | } |
