diff options
Diffstat (limited to 'drivers/i2c/i2c-core.c')
-rw-r--r-- | drivers/i2c/i2c-core.c | 102 |
1 files changed, 21 insertions, 81 deletions
diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c index a22e53badacb..51ce268998cd 100644 --- a/drivers/i2c/i2c-core.c +++ b/drivers/i2c/i2c-core.c | |||
@@ -21,7 +21,6 @@ | |||
21 | All SMBus-related things are written by Frodo Looijaard <frodol@dds.nl> | 21 | All SMBus-related things are written by Frodo Looijaard <frodol@dds.nl> |
22 | SMBus 2.0 support by Mark Studebaker <mdsxyz123@yahoo.com> */ | 22 | SMBus 2.0 support by Mark Studebaker <mdsxyz123@yahoo.com> */ |
23 | 23 | ||
24 | #include <linux/config.h> | ||
25 | #include <linux/module.h> | 24 | #include <linux/module.h> |
26 | #include <linux/kernel.h> | 25 | #include <linux/kernel.h> |
27 | #include <linux/errno.h> | 26 | #include <linux/errno.h> |
@@ -239,7 +238,7 @@ int i2c_del_adapter(struct i2c_adapter *adap) | |||
239 | } | 238 | } |
240 | 239 | ||
241 | /* detach any active clients. This must be done first, because | 240 | /* detach any active clients. This must be done first, because |
242 | * it can fail; in which case we give upp. */ | 241 | * it can fail; in which case we give up. */ |
243 | list_for_each_safe(item, _n, &adap->clients) { | 242 | list_for_each_safe(item, _n, &adap->clients) { |
244 | client = list_entry(item, struct i2c_client, list); | 243 | client = list_entry(item, struct i2c_client, list); |
245 | 244 | ||
@@ -612,27 +611,16 @@ int i2c_master_send(struct i2c_client *client,const char *buf ,int count) | |||
612 | struct i2c_adapter *adap=client->adapter; | 611 | struct i2c_adapter *adap=client->adapter; |
613 | struct i2c_msg msg; | 612 | struct i2c_msg msg; |
614 | 613 | ||
615 | if (client->adapter->algo->master_xfer) { | 614 | msg.addr = client->addr; |
616 | msg.addr = client->addr; | 615 | msg.flags = client->flags & I2C_M_TEN; |
617 | msg.flags = client->flags & I2C_M_TEN; | 616 | msg.len = count; |
618 | msg.len = count; | 617 | msg.buf = (char *)buf; |
619 | msg.buf = (char *)buf; | ||
620 | 618 | ||
621 | dev_dbg(&client->adapter->dev, "master_send: writing %d bytes.\n", | 619 | ret = i2c_transfer(adap, &msg, 1); |
622 | count); | ||
623 | |||
624 | down(&adap->bus_lock); | ||
625 | ret = adap->algo->master_xfer(adap,&msg,1); | ||
626 | up(&adap->bus_lock); | ||
627 | 620 | ||
628 | /* if everything went ok (i.e. 1 msg transmitted), return #bytes | 621 | /* If everything went ok (i.e. 1 msg transmitted), return #bytes |
629 | * transmitted, else error code. | 622 | transmitted, else error code. */ |
630 | */ | 623 | return (ret == 1) ? count : ret; |
631 | return (ret == 1 )? count : ret; | ||
632 | } else { | ||
633 | dev_err(&client->adapter->dev, "I2C level transfers not supported\n"); | ||
634 | return -ENOSYS; | ||
635 | } | ||
636 | } | 624 | } |
637 | 625 | ||
638 | int i2c_master_recv(struct i2c_client *client, char *buf ,int count) | 626 | int i2c_master_recv(struct i2c_client *client, char *buf ,int count) |
@@ -640,31 +628,18 @@ int i2c_master_recv(struct i2c_client *client, char *buf ,int count) | |||
640 | struct i2c_adapter *adap=client->adapter; | 628 | struct i2c_adapter *adap=client->adapter; |
641 | struct i2c_msg msg; | 629 | struct i2c_msg msg; |
642 | int ret; | 630 | int ret; |
643 | if (client->adapter->algo->master_xfer) { | 631 | |
644 | msg.addr = client->addr; | 632 | msg.addr = client->addr; |
645 | msg.flags = client->flags & I2C_M_TEN; | 633 | msg.flags = client->flags & I2C_M_TEN; |
646 | msg.flags |= I2C_M_RD; | 634 | msg.flags |= I2C_M_RD; |
647 | msg.len = count; | 635 | msg.len = count; |
648 | msg.buf = buf; | 636 | msg.buf = buf; |
649 | 637 | ||
650 | dev_dbg(&client->adapter->dev, "master_recv: reading %d bytes.\n", | 638 | ret = i2c_transfer(adap, &msg, 1); |
651 | count); | 639 | |
652 | 640 | /* If everything went ok (i.e. 1 msg transmitted), return #bytes | |
653 | down(&adap->bus_lock); | 641 | transmitted, else error code. */ |
654 | ret = adap->algo->master_xfer(adap,&msg,1); | 642 | return (ret == 1) ? count : ret; |
655 | up(&adap->bus_lock); | ||
656 | |||
657 | dev_dbg(&client->adapter->dev, "master_recv: return:%d (count:%d, addr:0x%02x)\n", | ||
658 | ret, count, client->addr); | ||
659 | |||
660 | /* if everything went ok (i.e. 1 msg transmitted), return #bytes | ||
661 | * transmitted, else error code. | ||
662 | */ | ||
663 | return (ret == 1 )? count : ret; | ||
664 | } else { | ||
665 | dev_err(&client->adapter->dev, "I2C level transfers not supported\n"); | ||
666 | return -ENOSYS; | ||
667 | } | ||
668 | } | 643 | } |
669 | 644 | ||
670 | 645 | ||
@@ -742,18 +717,6 @@ int i2c_probe(struct i2c_adapter *adapter, | |||
742 | found = 1; | 717 | found = 1; |
743 | } | 718 | } |
744 | } | 719 | } |
745 | for (i = 0; | ||
746 | !found && (address_data->ignore_range[i] != I2C_CLIENT_END); | ||
747 | i += 3) { | ||
748 | if (((adap_id == address_data->ignore_range[i]) || | ||
749 | ((address_data->ignore_range[i]==ANY_I2C_BUS))) && | ||
750 | (addr >= address_data->ignore_range[i+1]) && | ||
751 | (addr <= address_data->ignore_range[i+2])) { | ||
752 | dev_dbg(&adapter->dev, "found ignore_range parameter for adapter %d, " | ||
753 | "addr %04x\n", adap_id,addr); | ||
754 | found = 1; | ||
755 | } | ||
756 | } | ||
757 | if (found) | 720 | if (found) |
758 | continue; | 721 | continue; |
759 | 722 | ||
@@ -770,17 +733,6 @@ int i2c_probe(struct i2c_adapter *adapter, | |||
770 | } | 733 | } |
771 | 734 | ||
772 | for (i = 0; | 735 | for (i = 0; |
773 | !found && (address_data->normal_i2c_range[i] != I2C_CLIENT_END); | ||
774 | i += 2) { | ||
775 | if ((addr >= address_data->normal_i2c_range[i]) && | ||
776 | (addr <= address_data->normal_i2c_range[i+1])) { | ||
777 | found = 1; | ||
778 | dev_dbg(&adapter->dev, "found normal i2c_range entry for adapter %d, " | ||
779 | "addr %04x\n", adap_id,addr); | ||
780 | } | ||
781 | } | ||
782 | |||
783 | for (i = 0; | ||
784 | !found && (address_data->probe[i] != I2C_CLIENT_END); | 736 | !found && (address_data->probe[i] != I2C_CLIENT_END); |
785 | i += 2) { | 737 | i += 2) { |
786 | if (((adap_id == address_data->probe[i]) || | 738 | if (((adap_id == address_data->probe[i]) || |
@@ -791,18 +743,6 @@ int i2c_probe(struct i2c_adapter *adapter, | |||
791 | "addr %04x\n", adap_id,addr); | 743 | "addr %04x\n", adap_id,addr); |
792 | } | 744 | } |
793 | } | 745 | } |
794 | for (i = 0; | ||
795 | !found && (address_data->probe_range[i] != I2C_CLIENT_END); | ||
796 | i += 3) { | ||
797 | if (((adap_id == address_data->probe_range[i]) || | ||
798 | (address_data->probe_range[i] == ANY_I2C_BUS)) && | ||
799 | (addr >= address_data->probe_range[i+1]) && | ||
800 | (addr <= address_data->probe_range[i+2])) { | ||
801 | found = 1; | ||
802 | dev_dbg(&adapter->dev, "found probe_range parameter for adapter %d, " | ||
803 | "addr %04x\n", adap_id,addr); | ||
804 | } | ||
805 | } | ||
806 | if (!found) | 746 | if (!found) |
807 | continue; | 747 | continue; |
808 | 748 | ||