diff options
| author | Dave Jones <davej@redhat.com> | 2006-12-12 18:13:32 -0500 |
|---|---|---|
| committer | Dave Jones <davej@redhat.com> | 2006-12-12 18:13:32 -0500 |
| commit | f0eef25339f92f7cd4aeea23d9ae97987a5a1e82 (patch) | |
| tree | 2472e94d39f43a9580a6d2d5d92de0b749023263 /drivers/i2c | |
| parent | 0cfea5dd98205f2fa318836da664a7d7df1afbc1 (diff) | |
| parent | e1036502e5263851259d147771226161e5ccc85a (diff) | |
Merge ../linus
Diffstat (limited to 'drivers/i2c')
69 files changed, 2600 insertions, 2029 deletions
diff --git a/drivers/i2c/Kconfig b/drivers/i2c/Kconfig index 24383afdda76..11935f66fcd8 100644 --- a/drivers/i2c/Kconfig +++ b/drivers/i2c/Kconfig | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | # | 1 | # |
| 2 | # Character device configuration | 2 | # I2C subsystem configuration |
| 3 | # | 3 | # |
| 4 | 4 | ||
| 5 | menu "I2C support" | 5 | menu "I2C support" |
diff --git a/drivers/i2c/algos/Kconfig b/drivers/i2c/algos/Kconfig index 30408015d231..af0203409dd1 100644 --- a/drivers/i2c/algos/Kconfig +++ b/drivers/i2c/algos/Kconfig | |||
| @@ -38,27 +38,10 @@ config I2C_ALGOPCA | |||
| 38 | This support is also available as a module. If so, the module | 38 | This support is also available as a module. If so, the module |
| 39 | will be called i2c-algo-pca. | 39 | will be called i2c-algo-pca. |
| 40 | 40 | ||
| 41 | config I2C_ALGOITE | ||
| 42 | tristate "ITE I2C Algorithm" | ||
| 43 | depends on MIPS_ITE8172 && I2C | ||
| 44 | help | ||
| 45 | This supports the use of the ITE8172 I2C interface found on some MIPS | ||
| 46 | systems. Say Y if you have one of these. You should also say Y for | ||
| 47 | the ITE I2C peripheral driver support below. | ||
| 48 | |||
| 49 | This support is also available as a module. If so, the module | ||
| 50 | will be called i2c-algo-ite. | ||
| 51 | |||
| 52 | config I2C_ALGO8XX | 41 | config I2C_ALGO8XX |
| 53 | tristate "MPC8xx CPM I2C interface" | 42 | tristate "MPC8xx CPM I2C interface" |
| 54 | depends on 8xx && I2C | 43 | depends on 8xx && I2C |
| 55 | 44 | ||
| 56 | config I2C_ALGO_SIBYTE | ||
| 57 | tristate "SiByte SMBus interface" | ||
| 58 | depends on SIBYTE_SB1xxx_SOC && I2C | ||
| 59 | help | ||
| 60 | Supports the SiByte SOC on-chip I2C interfaces (2 channels). | ||
| 61 | |||
| 62 | config I2C_ALGO_SGI | 45 | config I2C_ALGO_SGI |
| 63 | tristate "I2C SGI interfaces" | 46 | tristate "I2C SGI interfaces" |
| 64 | depends on I2C && (SGI_IP22 || SGI_IP32 || X86_VISWS) | 47 | depends on I2C && (SGI_IP22 || SGI_IP32 || X86_VISWS) |
diff --git a/drivers/i2c/algos/Makefile b/drivers/i2c/algos/Makefile index 867fe1f67401..cac1051bd4f1 100644 --- a/drivers/i2c/algos/Makefile +++ b/drivers/i2c/algos/Makefile | |||
| @@ -5,8 +5,6 @@ | |||
| 5 | obj-$(CONFIG_I2C_ALGOBIT) += i2c-algo-bit.o | 5 | obj-$(CONFIG_I2C_ALGOBIT) += i2c-algo-bit.o |
| 6 | obj-$(CONFIG_I2C_ALGOPCF) += i2c-algo-pcf.o | 6 | obj-$(CONFIG_I2C_ALGOPCF) += i2c-algo-pcf.o |
| 7 | obj-$(CONFIG_I2C_ALGOPCA) += i2c-algo-pca.o | 7 | obj-$(CONFIG_I2C_ALGOPCA) += i2c-algo-pca.o |
| 8 | obj-$(CONFIG_I2C_ALGOITE) += i2c-algo-ite.o | ||
| 9 | obj-$(CONFIG_I2C_ALGO_SIBYTE) += i2c-algo-sibyte.o | ||
| 10 | obj-$(CONFIG_I2C_ALGO_SGI) += i2c-algo-sgi.o | 8 | obj-$(CONFIG_I2C_ALGO_SGI) += i2c-algo-sgi.o |
| 11 | 9 | ||
| 12 | ifeq ($(CONFIG_I2C_DEBUG_ALGO),y) | 10 | ifeq ($(CONFIG_I2C_DEBUG_ALGO),y) |
diff --git a/drivers/i2c/algos/i2c-algo-bit.c b/drivers/i2c/algos/i2c-algo-bit.c index ab230c033f99..95aa5395a5be 100644 --- a/drivers/i2c/algos/i2c-algo-bit.c +++ b/drivers/i2c/algos/i2c-algo-bit.c | |||
| @@ -76,17 +76,15 @@ static inline void scllo(struct i2c_algo_bit_data *adap) | |||
| 76 | * Raise scl line, and do checking for delays. This is necessary for slower | 76 | * Raise scl line, and do checking for delays. This is necessary for slower |
| 77 | * devices. | 77 | * devices. |
| 78 | */ | 78 | */ |
| 79 | static inline int sclhi(struct i2c_algo_bit_data *adap) | 79 | static int sclhi(struct i2c_algo_bit_data *adap) |
| 80 | { | 80 | { |
| 81 | unsigned long start; | 81 | unsigned long start; |
| 82 | 82 | ||
| 83 | setscl(adap,1); | 83 | setscl(adap,1); |
| 84 | 84 | ||
| 85 | /* Not all adapters have scl sense line... */ | 85 | /* Not all adapters have scl sense line... */ |
| 86 | if (adap->getscl == NULL ) { | 86 | if (!adap->getscl) |
| 87 | udelay(adap->udelay); | 87 | goto done; |
| 88 | return 0; | ||
| 89 | } | ||
| 90 | 88 | ||
| 91 | start=jiffies; | 89 | start=jiffies; |
| 92 | while (! getscl(adap) ) { | 90 | while (! getscl(adap) ) { |
| @@ -101,6 +99,8 @@ static inline int sclhi(struct i2c_algo_bit_data *adap) | |||
| 101 | cond_resched(); | 99 | cond_resched(); |
| 102 | } | 100 | } |
| 103 | DEBSTAT(printk(KERN_DEBUG "needed %ld jiffies\n", jiffies-start)); | 101 | DEBSTAT(printk(KERN_DEBUG "needed %ld jiffies\n", jiffies-start)); |
| 102 | |||
| 103 | done: | ||
| 104 | udelay(adap->udelay); | 104 | udelay(adap->udelay); |
| 105 | return 0; | 105 | return 0; |
| 106 | } | 106 | } |
| @@ -121,7 +121,6 @@ static void i2c_repstart(struct i2c_algo_bit_data *adap) | |||
| 121 | DEBPROTO(printk(" Sr ")); | 121 | DEBPROTO(printk(" Sr ")); |
| 122 | setsda(adap,1); | 122 | setsda(adap,1); |
| 123 | sclhi(adap); | 123 | sclhi(adap); |
| 124 | udelay(adap->udelay); | ||
| 125 | 124 | ||
| 126 | sdalo(adap); | 125 | sdalo(adap); |
| 127 | scllo(adap); | 126 | scllo(adap); |
| @@ -306,7 +305,7 @@ bailout: | |||
| 306 | * 0 chip did not answer | 305 | * 0 chip did not answer |
| 307 | * -x transmission error | 306 | * -x transmission error |
| 308 | */ | 307 | */ |
| 309 | static inline int try_address(struct i2c_adapter *i2c_adap, | 308 | static int try_address(struct i2c_adapter *i2c_adap, |
| 310 | unsigned char addr, int retries) | 309 | unsigned char addr, int retries) |
| 311 | { | 310 | { |
| 312 | struct i2c_algo_bit_data *adap = i2c_adap->algo_data; | 311 | struct i2c_algo_bit_data *adap = i2c_adap->algo_data; |
| @@ -354,15 +353,11 @@ static int sendbytes(struct i2c_adapter *i2c_adap, struct i2c_msg *msg) | |||
| 354 | return (retval<0)? retval : -EFAULT; | 353 | return (retval<0)? retval : -EFAULT; |
| 355 | /* got a better one ?? */ | 354 | /* got a better one ?? */ |
| 356 | } | 355 | } |
| 357 | #if 0 | ||
| 358 | /* from asm/delay.h */ | ||
| 359 | __delay(adap->mdelay * (loops_per_sec / 1000) ); | ||
| 360 | #endif | ||
| 361 | } | 356 | } |
| 362 | return wrcount; | 357 | return wrcount; |
| 363 | } | 358 | } |
| 364 | 359 | ||
| 365 | static inline int readbytes(struct i2c_adapter *i2c_adap, struct i2c_msg *msg) | 360 | static int readbytes(struct i2c_adapter *i2c_adap, struct i2c_msg *msg) |
| 366 | { | 361 | { |
| 367 | int inval; | 362 | int inval; |
| 368 | int rdcount=0; /* counts bytes read */ | 363 | int rdcount=0; /* counts bytes read */ |
| @@ -412,7 +407,7 @@ static inline int readbytes(struct i2c_adapter *i2c_adap, struct i2c_msg *msg) | |||
| 412 | * -x an error occurred (like: -EREMOTEIO if the device did not answer, or | 407 | * -x an error occurred (like: -EREMOTEIO if the device did not answer, or |
| 413 | * -ETIMEDOUT, for example if the lines are stuck...) | 408 | * -ETIMEDOUT, for example if the lines are stuck...) |
| 414 | */ | 409 | */ |
| 415 | static inline int bit_doAddress(struct i2c_adapter *i2c_adap, struct i2c_msg *msg) | 410 | static int bit_doAddress(struct i2c_adapter *i2c_adap, struct i2c_msg *msg) |
| 416 | { | 411 | { |
| 417 | unsigned short flags = msg->flags; | 412 | unsigned short flags = msg->flags; |
| 418 | unsigned short nak_ok = msg->flags & I2C_M_IGNORE_NAK; | 413 | unsigned short nak_ok = msg->flags & I2C_M_IGNORE_NAK; |
| @@ -517,7 +512,7 @@ static u32 bit_func(struct i2c_adapter *adap) | |||
| 517 | 512 | ||
| 518 | /* -----exported algorithm data: ------------------------------------- */ | 513 | /* -----exported algorithm data: ------------------------------------- */ |
| 519 | 514 | ||
| 520 | static struct i2c_algorithm i2c_bit_algo = { | 515 | static const struct i2c_algorithm i2c_bit_algo = { |
| 521 | .master_xfer = bit_xfer, | 516 | .master_xfer = bit_xfer, |
| 522 | .functionality = bit_func, | 517 | .functionality = bit_func, |
| 523 | }; | 518 | }; |
| @@ -545,15 +540,7 @@ int i2c_bit_add_bus(struct i2c_adapter *adap) | |||
| 545 | 540 | ||
| 546 | return i2c_add_adapter(adap); | 541 | return i2c_add_adapter(adap); |
| 547 | } | 542 | } |
| 548 | |||
| 549 | |||
| 550 | int i2c_bit_del_bus(struct i2c_adapter *adap) | ||
| 551 | { | ||
| 552 | return i2c_del_adapter(adap); | ||
| 553 | } | ||
| 554 | |||
| 555 | EXPORT_SYMBOL(i2c_bit_add_bus); | 543 | EXPORT_SYMBOL(i2c_bit_add_bus); |
| 556 | EXPORT_SYMBOL(i2c_bit_del_bus); | ||
| 557 | 544 | ||
| 558 | MODULE_AUTHOR("Simon G. Vogl <simon@tk.uni-linz.ac.at>"); | 545 | MODULE_AUTHOR("Simon G. Vogl <simon@tk.uni-linz.ac.at>"); |
| 559 | MODULE_DESCRIPTION("I2C-Bus bit-banging algorithm"); | 546 | MODULE_DESCRIPTION("I2C-Bus bit-banging algorithm"); |
diff --git a/drivers/i2c/algos/i2c-algo-ite.c b/drivers/i2c/algos/i2c-algo-ite.c deleted file mode 100644 index 70d8eefb5efc..000000000000 --- a/drivers/i2c/algos/i2c-algo-ite.c +++ /dev/null | |||
| @@ -1,806 +0,0 @@ | |||
| 1 | /* | ||
| 2 | ------------------------------------------------------------------------- | ||
| 3 | i2c-algo-ite.c i2c driver algorithms for ITE adapters | ||
| 4 | |||
| 5 | Hai-Pao Fan, MontaVista Software, Inc. | ||
| 6 | hpfan@mvista.com or source@mvista.com | ||
| 7 | |||
| 8 | Copyright 2000 MontaVista Software Inc. | ||
| 9 | |||
| 10 | --------------------------------------------------------------------------- | ||
| 11 | This file was highly leveraged from i2c-algo-pcf.c, which was created | ||
| 12 | by Simon G. Vogl and Hans Berglund: | ||
| 13 | |||
| 14 | |||
| 15 | Copyright (C) 1995-1997 Simon G. Vogl | ||
| 16 | 1998-2000 Hans Berglund | ||
| 17 | |||
| 18 | This program is free software; you can redistribute it and/or modify | ||
| 19 | it under the terms of the GNU General Public License as published by | ||
| 20 | the Free Software Foundation; either version 2 of the License, or | ||
| 21 | (at your option) any later version. | ||
| 22 | |||
| 23 | This program is distributed in the hope that it will be useful, | ||
| 24 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 25 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 26 | GNU General Public License for more details. | ||
| 27 | |||
| 28 | You should have received a copy of the GNU General Public License | ||
| 29 | along with this program; if not, write to the Free Software | ||
| 30 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ | ||
| 31 | /* ------------------------------------------------------------------------- */ | ||
| 32 | |||
| 33 | /* With some changes from Kyösti Mälkki <kmalkki@cc.hut.fi> and | ||
| 34 | Frodo Looijaard <frodol@dds.nl> ,and also from Martin Bailey | ||
| 35 | <mbailey@littlefeet-inc.com> */ | ||
| 36 | |||
| 37 | #include <linux/kernel.h> | ||
| 38 | #include <linux/module.h> | ||
| 39 | #include <linux/delay.h> | ||
| 40 | #include <linux/slab.h> | ||
| 41 | #include <linux/init.h> | ||
| 42 | #include <asm/uaccess.h> | ||
| 43 | #include <linux/ioport.h> | ||
| 44 | #include <linux/errno.h> | ||
| 45 | #include <linux/sched.h> | ||
| 46 | |||
| 47 | #include <linux/i2c.h> | ||
| 48 | #include <linux/i2c-algo-ite.h> | ||
| 49 | #include "i2c-algo-ite.h" | ||
| 50 | |||
| 51 | #define PM_DSR IT8172_PCI_IO_BASE + IT_PM_DSR | ||
| 52 | #define PM_IBSR IT8172_PCI_IO_BASE + IT_PM_DSR + 0x04 | ||
| 53 | #define GPIO_CCR IT8172_PCI_IO_BASE + IT_GPCCR | ||
| 54 | |||
| 55 | #define DEB2(x) if (i2c_debug>=2) x | ||
| 56 | #define DEB3(x) if (i2c_debug>=3) x /* print several statistical values*/ | ||
| 57 | #define DEF_TIMEOUT 16 | ||
| 58 | |||
| 59 | |||
| 60 | /* module parameters: | ||
| 61 | */ | ||
| 62 | static int i2c_debug; | ||
| 63 | static int iic_test; /* see if the line-setting functions work */ | ||
| 64 | |||
| 65 | /* --- setting states on the bus with the right timing: --------------- */ | ||
| 66 | |||
| 67 | #define get_clock(adap) adap->getclock(adap->data) | ||
| 68 | #define iic_outw(adap, reg, val) adap->setiic(adap->data, reg, val) | ||
| 69 | #define iic_inw(adap, reg) adap->getiic(adap->data, reg) | ||
| 70 | |||
| 71 | |||
| 72 | /* --- other auxiliary functions -------------------------------------- */ | ||
| 73 | |||
| 74 | static void iic_start(struct i2c_algo_iic_data *adap) | ||
| 75 | { | ||
| 76 | iic_outw(adap,ITE_I2CHCR,ITE_CMD); | ||
| 77 | } | ||
| 78 | |||
| 79 | static void iic_stop(struct i2c_algo_iic_data *adap) | ||
| 80 | { | ||
| 81 | iic_outw(adap,ITE_I2CHCR,0); | ||
| 82 | iic_outw(adap,ITE_I2CHSR,ITE_I2CHSR_TDI); | ||
| 83 | } | ||
| 84 | |||
| 85 | static void iic_reset(struct i2c_algo_iic_data *adap) | ||
| 86 | { | ||
| 87 | iic_outw(adap, PM_IBSR, iic_inw(adap, PM_IBSR) | 0x80); | ||
| 88 | } | ||
| 89 | |||
| 90 | |||
| 91 | static int wait_for_bb(struct i2c_algo_iic_data *adap) | ||
| 92 | { | ||
| 93 | int timeout = DEF_TIMEOUT; | ||
| 94 | short status; | ||
| 95 | |||
| 96 | status = iic_inw(adap, ITE_I2CHSR); | ||
| 97 | #ifndef STUB_I2C | ||
| 98 | while (timeout-- && (status & ITE_I2CHSR_HB)) { | ||
| 99 | udelay(1000); /* How much is this? */ | ||
| 100 | status = iic_inw(adap, ITE_I2CHSR); | ||
| 101 | } | ||
| 102 | #endif | ||
| 103 | if (timeout<=0) { | ||
| 104 | printk(KERN_ERR "Timeout, host is busy\n"); | ||
| 105 | iic_reset(adap); | ||
| 106 | } | ||
| 107 | return(timeout<=0); | ||
| 108 | } | ||
| 109 | |||
| 110 | /* After we issue a transaction on the IIC bus, this function | ||
| 111 | * is called. It puts this process to sleep until we get an interrupt from | ||
| 112 | * from the controller telling us that the transaction we requested in complete. | ||
| 113 | */ | ||
| 114 | static int wait_for_pin(struct i2c_algo_iic_data *adap, short *status) { | ||
| 115 | |||
| 116 | int timeout = DEF_TIMEOUT; | ||
| 117 | |||
| 118 | timeout = wait_for_bb(adap); | ||
| 119 | if (timeout) { | ||
| 120 | DEB2(printk("Timeout waiting for host not busy\n");) | ||
| 121 | return -EIO; | ||
| 122 | } | ||
| 123 | timeout = DEF_TIMEOUT; | ||
| 124 | |||
| 125 | *status = iic_inw(adap, ITE_I2CHSR); | ||
| 126 | #ifndef STUB_I2C | ||
| 127 | while (timeout-- && !(*status & ITE_I2CHSR_TDI)) { | ||
| 128 | adap->waitforpin(); | ||
| 129 | *status = iic_inw(adap, ITE_I2CHSR); | ||
| 130 | } | ||
| 131 | #endif | ||
| 132 | if (timeout <= 0) | ||
| 133 | return(-1); | ||
| 134 | else | ||
| 135 | return(0); | ||
| 136 | } | ||
| 137 | |||
| 138 | static int wait_for_fe(struct i2c_algo_iic_data *adap, short *status) | ||
| 139 | { | ||
| 140 | int timeout = DEF_TIMEOUT; | ||
| 141 | |||
| 142 | *status = iic_inw(adap, ITE_I2CFSR); | ||
| 143 | #ifndef STUB_I2C | ||
| 144 | while (timeout-- && (*status & ITE_I2CFSR_FE)) { | ||
| 145 | udelay(1000); | ||
| 146 | iic_inw(adap, ITE_I2CFSR); | ||
| 147 | } | ||
| 148 | #endif | ||
| 149 | if (timeout <= 0) | ||
| 150 | return(-1); | ||
| 151 | else | ||
| 152 | return(0); | ||
| 153 | } | ||
| 154 | |||
| 155 | static int iic_init (struct i2c_algo_iic_data *adap) | ||
| 156 | { | ||
| 157 | short i; | ||
| 158 | |||
| 159 | /* Clear bit 7 to set I2C to normal operation mode */ | ||
| 160 | i=iic_inw(adap, PM_DSR)& 0xff7f; | ||
| 161 | iic_outw(adap, PM_DSR, i); | ||
| 162 | |||
| 163 | /* set IT_GPCCR port C bit 2&3 as function 2 */ | ||
| 164 | i = iic_inw(adap, GPIO_CCR) & 0xfc0f; | ||
| 165 | iic_outw(adap,GPIO_CCR,i); | ||
| 166 | |||
| 167 | /* Clear slave address/sub-address */ | ||
| 168 | iic_outw(adap,ITE_I2CSAR, 0); | ||
| 169 | iic_outw(adap,ITE_I2CSSAR, 0); | ||
| 170 | |||
| 171 | /* Set clock counter register */ | ||
| 172 | iic_outw(adap,ITE_I2CCKCNT, get_clock(adap)); | ||
| 173 | |||
| 174 | /* Set START/reSTART/STOP time registers */ | ||
| 175 | iic_outw(adap,ITE_I2CSHDR, 0x0a); | ||
| 176 | iic_outw(adap,ITE_I2CRSUR, 0x0a); | ||
| 177 | iic_outw(adap,ITE_I2CPSUR, 0x0a); | ||
| 178 | |||
| 179 | /* Enable interrupts on completing the current transaction */ | ||
| 180 | iic_outw(adap,ITE_I2CHCR, ITE_I2CHCR_IE | ITE_I2CHCR_HCE); | ||
| 181 | |||
| 182 | /* Clear transfer count */ | ||
| 183 | iic_outw(adap,ITE_I2CFBCR, 0x0); | ||
| 184 | |||
| 185 | DEB2(printk("iic_init: Initialized IIC on ITE 0x%x\n", | ||
| 186 | iic_inw(adap, ITE_I2CHSR))); | ||
| 187 | return 0; | ||
| 188 | } | ||
| 189 | |||
| 190 | |||
| 191 | /* | ||
| 192 | * Sanity check for the adapter hardware - check the reaction of | ||
| 193 | * the bus lines only if it seems to be idle. | ||
| 194 | */ | ||
| 195 | static int test_bus(struct i2c_algo_iic_data *adap, char *name) { | ||
| 196 | #if 0 | ||
| 197 | int scl,sda; | ||
| 198 | sda=getsda(adap); | ||
| 199 | if (adap->getscl==NULL) { | ||
| 200 | printk("test_bus: Warning: Adapter can't read from clock line - skipping test.\n"); | ||
| 201 | return 0; | ||
| 202 | } | ||
| 203 | scl=getscl(adap); | ||
| 204 | printk("test_bus: Adapter: %s scl: %d sda: %d -- testing...\n", | ||
| 205 | name,getscl(adap),getsda(adap)); | ||
| 206 | if (!scl || !sda ) { | ||
| 207 | printk("test_bus: %s seems to be busy.\n",adap->name); | ||
| 208 | goto bailout; | ||
| 209 | } | ||
| 210 | sdalo(adap); | ||
| 211 | printk("test_bus:1 scl: %d sda: %d\n", getscl(adap), | ||
| 212 | getsda(adap)); | ||
| 213 | if ( 0 != getsda(adap) ) { | ||
| 214 | printk("test_bus: %s SDA stuck high!\n",name); | ||
| 215 | sdahi(adap); | ||
| 216 | goto bailout; | ||
| 217 | } | ||
| 218 | if ( 0 == getscl(adap) ) { | ||
| 219 | printk("test_bus: %s SCL unexpected low while pulling SDA low!\n", | ||
| 220 | name); | ||
| 221 | goto bailout; | ||
| 222 | } | ||
| 223 | sdahi(adap); | ||
| 224 | printk("test_bus:2 scl: %d sda: %d\n", getscl(adap), | ||
| 225 | getsda(adap)); | ||
| 226 | if ( 0 == getsda(adap) ) { | ||
| 227 | printk("test_bus: %s SDA stuck low!\n",name); | ||
| 228 | sdahi(adap); | ||
| 229 | goto bailout; | ||
| 230 | } | ||
| 231 | if ( 0 == getscl(adap) ) { | ||
| 232 | printk("test_bus: %s SCL unexpected low while SDA high!\n", | ||
| 233 | adap->name); | ||
| 234 | goto bailout; | ||
| 235 | } | ||
| 236 | scllo(adap); | ||
| 237 | printk("test_bus:3 scl: %d sda: %d\n", getscl(adap), | ||
| 238 | getsda(adap)); | ||
| 239 | if ( 0 != getscl(adap) ) { | ||
| 240 | |||
| 241 | sclhi(adap); | ||
| 242 | goto bailout; | ||
| 243 | } | ||
| 244 | if ( 0 == getsda(adap) ) { | ||
| 245 | printk("test_bus: %s SDA unexpected low while pulling SCL low!\n", | ||
| 246 | name); | ||
| 247 | goto bailout; | ||
| 248 | } | ||
| 249 | sclhi(adap); | ||
| 250 | printk("test_bus:4 scl: %d sda: %d\n", getscl(adap), | ||
| 251 | getsda(adap)); | ||
| 252 | if ( 0 == getscl(adap) ) { | ||
| 253 | printk("test_bus: %s SCL stuck low!\n",name); | ||
| 254 | sclhi(adap); | ||
| 255 | goto bailout; | ||
| 256 | } | ||
| 257 | if ( 0 == getsda(adap) ) { | ||
| 258 | printk("test_bus: %s SDA unexpected low while SCL high!\n", | ||
| 259 | name); | ||
| 260 | goto bailout; | ||
| 261 | } | ||
| 262 | printk("test_bus: %s passed test.\n",name); | ||
| 263 | return 0; | ||
| 264 | bailout: | ||
| 265 | sdahi(adap); | ||
| 266 | sclhi(adap); | ||
| 267 | return -ENODEV; | ||
| 268 | #endif | ||
| 269 | return (0); | ||
| 270 | } | ||
| 271 | |||
| 272 | /* ----- Utility functions | ||
| 273 | */ | ||
| 274 | |||
| 275 | |||
| 276 | /* Verify the device we want to talk to on the IIC bus really exists. */ | ||
| 277 | static inline int try_address(struct i2c_algo_iic_data *adap, | ||
| 278 | unsigned int addr, int retries) | ||
| 279 | { | ||
| 280 | int i, ret = -1; | ||
| 281 | short status; | ||
| 282 | |||
| 283 | for (i=0;i<retries;i++) { | ||
| 284 | iic_outw(adap, ITE_I2CSAR, addr); | ||
| 285 | iic_start(adap); | ||
| 286 | if (wait_for_pin(adap, &status) == 0) { | ||
| 287 | if ((status & ITE_I2CHSR_DNE) == 0) { | ||
| 288 | iic_stop(adap); | ||
| 289 | iic_outw(adap, ITE_I2CFCR, ITE_I2CFCR_FLUSH); | ||
| 290 | ret=1; | ||
| 291 | break; /* success! */ | ||
| 292 | } | ||
| 293 | } | ||
| 294 | iic_stop(adap); | ||
| 295 | udelay(adap->udelay); | ||
| 296 | } | ||
| 297 | DEB2(if (i) printk("try_address: needed %d retries for 0x%x\n",i, | ||
| 298 | addr)); | ||
| 299 | return ret; | ||
| 300 | } | ||
| 301 | |||
| 302 | |||
| 303 | static int iic_sendbytes(struct i2c_adapter *i2c_adap,const char *buf, | ||
| 304 | int count) | ||
| 305 | { | ||
| 306 | struct i2c_algo_iic_data *adap = i2c_adap->algo_data; | ||
| 307 | int wrcount=0, timeout; | ||
| 308 | short status; | ||
| 309 | int loops, remainder, i, j; | ||
| 310 | union { | ||
| 311 | char byte[2]; | ||
| 312 | unsigned short word; | ||
| 313 | } tmp; | ||
| 314 | |||
| 315 | iic_outw(adap, ITE_I2CSSAR, (unsigned short)buf[wrcount++]); | ||
| 316 | count--; | ||
| 317 | if (count == 0) | ||
| 318 | return -EIO; | ||
| 319 | |||
| 320 | loops = count / 32; /* 32-byte FIFO */ | ||
| 321 | remainder = count % 32; | ||
| 322 | |||
| 323 | if(loops) { | ||
| 324 | for(i=0; i<loops; i++) { | ||
| 325 | |||
| 326 | iic_outw(adap, ITE_I2CFBCR, 32); | ||
| 327 | for(j=0; j<32/2; j++) { | ||
| 328 | tmp.byte[1] = buf[wrcount++]; | ||
| 329 | tmp.byte[0] = buf[wrcount++]; | ||
| 330 | iic_outw(adap, ITE_I2CFDR, tmp.word); | ||
| 331 | } | ||
| 332 | |||
| 333 | /* status FIFO overrun */ | ||
| 334 | iic_inw(adap, ITE_I2CFSR); | ||
| 335 | iic_inw(adap, ITE_I2CFBCR); | ||
| 336 | |||
| 337 | iic_outw(adap, ITE_I2CHCR, ITE_WRITE); /* Issue WRITE command */ | ||
| 338 | |||
| 339 | /* Wait for transmission to complete */ | ||
| 340 | timeout = wait_for_pin(adap, &status); | ||
| 341 | if(timeout) { | ||
| 342 | iic_stop(adap); | ||
| 343 | printk("iic_sendbytes: %s write timeout.\n", i2c_adap->name); | ||
| 344 | return -EREMOTEIO; /* got a better one ?? */ | ||
| 345 | } | ||
| 346 | if (status & ITE_I2CHSR_DB) { | ||
| 347 | iic_stop(adap); | ||
| 348 | printk("iic_sendbytes: %s write error - no ack.\n", i2c_adap->name); | ||
| 349 | return -EREMOTEIO; /* got a better one ?? */ | ||
| 350 | } | ||
| 351 | } | ||
| 352 | } | ||
| 353 | if(remainder) { | ||
| 354 | iic_outw(adap, ITE_I2CFBCR, remainder); | ||
| 355 | for(i=0; i<remainder/2; i++) { | ||
| 356 | tmp.byte[1] = buf[wrcount++]; | ||
| 357 | tmp.byte[0] = buf[wrcount++]; | ||
| 358 | iic_outw(adap, ITE_I2CFDR, tmp.word); | ||
| 359 | } | ||
| 360 | |||
| 361 | /* status FIFO overrun */ | ||
| 362 | iic_inw(adap, ITE_I2CFSR); | ||
| 363 | iic_inw(adap, ITE_I2CFBCR); | ||
| 364 | |||
| 365 | iic_outw(adap, ITE_I2CHCR, ITE_WRITE); /* Issue WRITE command */ | ||
| 366 | |||
| 367 | timeout = wait_for_pin(adap, &status); | ||
| 368 | if(timeout) { | ||
| 369 | iic_stop(adap); | ||
| 370 | printk("iic_sendbytes: %s write timeout.\n", i2c_adap->name); | ||
| 371 | return -EREMOTEIO; /* got a better one ?? */ | ||
| 372 | } | ||
| 373 | #ifndef STUB_I2C | ||
| 374 | if (status & ITE_I2CHSR_DB) { | ||
| 375 | iic_stop(adap); | ||
| 376 | printk("iic_sendbytes: %s write error - no ack.\n", i2c_adap->name); | ||
| 377 | return -EREMOTEIO; /* got a better one ?? */ | ||
| 378 | } | ||
| 379 | #endif | ||
| 380 | } | ||
| 381 | iic_stop(adap); | ||
| 382 | return wrcount; | ||
| 383 | } | ||
| 384 | |||
| 385 | |||
| 386 | static int iic_readbytes(struct i2c_adapter *i2c_adap, char *buf, int count, | ||
| 387 | int sread) | ||
| 388 | { | ||
| 389 | int rdcount=0, i, timeout; | ||
| 390 | short status; | ||
| 391 | struct i2c_algo_iic_data *adap = i2c_adap->algo_data; | ||
| 392 | int loops, remainder, j; | ||
| 393 | union { | ||
| 394 | char byte[2]; | ||
| 395 | unsigned short word; | ||
| 396 | } tmp; | ||
| 397 | |||
| 398 | loops = count / 32; /* 32-byte FIFO */ | ||
| 399 | remainder = count % 32; | ||
| 400 | |||
| 401 | if(loops) { | ||
| 402 | for(i=0; i<loops; i++) { | ||
| 403 | iic_outw(adap, ITE_I2CFBCR, 32); | ||
| 404 | if (sread) | ||
| 405 | iic_outw(adap, ITE_I2CHCR, ITE_SREAD); | ||
| 406 | else | ||
| 407 | iic_outw(adap, ITE_I2CHCR, ITE_READ); /* Issue READ command */ | ||
| 408 | |||
| 409 | timeout = wait_for_pin(adap, &status); | ||
| 410 | if(timeout) { | ||
| 411 | iic_stop(adap); | ||
| 412 | printk("iic_readbytes: %s read timeout.\n", i2c_adap->name); | ||
| 413 | return (-1); | ||
| 414 | } | ||
| 415 | #ifndef STUB_I2C | ||
| 416 | if (status & ITE_I2CHSR_DB) { | ||
| 417 | iic_stop(adap); | ||
| 418 | printk("iic_readbytes: %s read error - no ack.\n", i2c_adap->name); | ||
| 419 | return (-1); | ||
| 420 | } | ||
| 421 | #endif | ||
| 422 | |||
| 423 | timeout = wait_for_fe(adap, &status); | ||
| 424 | if(timeout) { | ||
| 425 | iic_stop(adap); | ||
| 426 | printk("iic_readbytes: %s FIFO is empty\n", i2c_adap->name); | ||
| 427 | return (-1); | ||
| 428 | } | ||
| 429 | |||
| 430 | for(j=0; j<32/2; j++) { | ||
| 431 | tmp.word = iic_inw(adap, ITE_I2CFDR); | ||
| 432 | buf[rdcount++] = tmp.byte[1]; | ||
| 433 | buf[rdcount++] = tmp.byte[0]; | ||
| 434 | } | ||
| 435 | |||
| 436 | /* status FIFO underrun */ | ||
| 437 | iic_inw(adap, ITE_I2CFSR); | ||
| 438 | |||
| 439 | } | ||
| 440 | } | ||
| 441 | |||
| 442 | |||
| 443 | if(remainder) { | ||
| 444 | remainder=(remainder+1)/2 * 2; | ||
| 445 | iic_outw(adap, ITE_I2CFBCR, remainder); | ||
| 446 | if (sread) | ||
| 447 | iic_outw(adap, ITE_I2CHCR, ITE_SREAD); | ||
| 448 | else | ||
| 449 | iic_outw(adap, ITE_I2CHCR, ITE_READ); /* Issue READ command */ | ||
| 450 | |||
| 451 | timeout = wait_for_pin(adap, &status); | ||
| 452 | if(timeout) { | ||
| 453 | iic_stop(adap); | ||
| 454 | printk("iic_readbytes: %s read timeout.\n", i2c_adap->name); | ||
| 455 | return (-1); | ||
| 456 | } | ||
| 457 | #ifndef STUB_I2C | ||
| 458 | if (status & ITE_I2CHSR_DB) { | ||
| 459 | iic_stop(adap); | ||
| 460 | printk("iic_readbytes: %s read error - no ack.\n", i2c_adap->name); | ||
| 461 | return (-1); | ||
| 462 | } | ||
| 463 | #endif | ||
| 464 | timeout = wait_for_fe(adap, &status); | ||
| 465 | if(timeout) { | ||
| 466 | iic_stop(adap); | ||
| 467 | printk("iic_readbytes: %s FIFO is empty\n", i2c_adap->name); | ||
| 468 | return (-1); | ||
| 469 | } | ||
| 470 | |||
| 471 | for(i=0; i<(remainder+1)/2; i++) { | ||
| 472 | tmp.word = iic_inw(adap, ITE_I2CFDR); | ||
| 473 | buf[rdcount++] = tmp.byte[1]; | ||
| 474 | buf[rdcount++] = tmp.byte[0]; | ||
| 475 | } | ||
| 476 | |||
| 477 | /* status FIFO underrun */ | ||
| 478 | iic_inw(adap, ITE_I2CFSR); | ||
| 479 | |||
| 480 | } | ||
| 481 | |||
| 482 | iic_stop(adap); | ||
| 483 | return rdcount; | ||
| 484 | } | ||
| 485 | |||
| 486 | |||
| 487 | /* This function implements combined transactions. Combined | ||
| 488 | * transactions consist of combinations of reading and writing blocks of data. | ||
| 489 | * Each transfer (i.e. a read or a write) is separated by a repeated start | ||
| 490 | * condition. | ||
| 491 | */ | ||
| 492 | #if 0 | ||
| 493 | static int iic_combined_transaction(struct i2c_adapter *i2c_adap, struct i2c_msg *msgs, int num) | ||
| 494 | { | ||
| 495 | int i; | ||
| 496 | struct i2c_msg *pmsg; | ||
| 497 | int ret; | ||
| 498 | |||
| 499 | DEB2(printk("Beginning combined transaction\n")); | ||
| 500 | |||
| 501 | for(i=0; i<(num-1); i++) { | ||
| 502 | pmsg = &msgs[i]; | ||
| 503 | if(pmsg->flags & I2C_M_RD) { | ||
| 504 | DEB2(printk(" This one is a read\n")); | ||
| 505 | ret = iic_readbytes(i2c_adap, pmsg->buf, pmsg->len, IIC_COMBINED_XFER); | ||
| 506 | } | ||
| 507 | else if(!(pmsg->flags & I2C_M_RD)) { | ||
| 508 | DEB2(printk("This one is a write\n")); | ||
| 509 | ret = iic_sendbytes(i2c_adap, pmsg->buf, pmsg->len, IIC_COMBINED_XFER); | ||
| 510 | } | ||
| 511 | } | ||
| 512 | /* Last read or write segment needs to be terminated with a stop */ | ||
| 513 | pmsg = &msgs[i]; | ||
| 514 | |||
| 515 | if(pmsg->flags & I2C_M_RD) { | ||
| 516 | DEB2(printk("Doing the last read\n")); | ||
| 517 | ret = iic_readbytes(i2c_adap, pmsg->buf, pmsg->len, IIC_SINGLE_XFER); | ||
| 518 | } | ||
| 519 | else if(!(pmsg->flags & I2C_M_RD)) { | ||
| 520 | DEB2(printk("Doing the last write\n")); | ||
| 521 | ret = iic_sendbytes(i2c_adap, pmsg->buf, pmsg->len, IIC_SINGLE_XFER); | ||
| 522 | } | ||
| 523 | |||
| 524 | return ret; | ||
| 525 | } | ||
| 526 | #endif | ||
| 527 | |||
| 528 | |||
| 529 | /* Whenever we initiate a transaction, the first byte clocked | ||
| 530 | * onto the bus after the start condition is the address (7 bit) of the | ||
| 531 | * device we want to talk to. This function manipulates the address specified | ||
| 532 | * so that it makes sense to the hardware when written to the IIC peripheral. | ||
| 533 | * | ||
| 534 | * Note: 10 bit addresses are not supported in this driver, although they are | ||
| 535 | * supported by the hardware. This functionality needs to be implemented. | ||
| 536 | */ | ||
| 537 | static inline int iic_doAddress(struct i2c_algo_iic_data *adap, | ||
| 538 | struct i2c_msg *msg, int retries) | ||
| 539 | { | ||
| 540 | unsigned short flags = msg->flags; | ||
| 541 | unsigned int addr; | ||
| 542 | int ret; | ||
| 543 | |||
| 544 | /* Ten bit addresses not supported right now */ | ||
| 545 | if ( (flags & I2C_M_TEN) ) { | ||
| 546 | #if 0 | ||
| 547 | addr = 0xf0 | (( msg->addr >> 7) & 0x03); | ||
| 548 | DEB2(printk("addr0: %d\n",addr)); | ||
| 549 | ret = try_address(adap, addr, retries); | ||
| 550 | if (ret!=1) { | ||
| 551 | printk("iic_doAddress: died at extended address code.\n"); | ||
| 552 | return -EREMOTEIO; | ||
| 553 | } | ||
| 554 | iic_outw(adap,msg->addr & 0x7f); | ||
| 555 | if (ret != 1) { | ||
| 556 | printk("iic_doAddress: died at 2nd address code.\n"); | ||
| 557 | return -EREMOTEIO; | ||
| 558 | } | ||
| 559 | if ( flags & I2C_M_RD ) { | ||
| 560 | i2c_repstart(adap); | ||
| 561 | addr |= 0x01; | ||
| 562 | ret = try_address(adap, addr, retries); | ||
| 563 | if (ret!=1) { | ||
| 564 | printk("iic_doAddress: died at extended address code.\n"); | ||
| 565 | return -EREMOTEIO; | ||
| 566 | } | ||
| 567 | } | ||
| 568 | #endif | ||
| 569 | } else { | ||
| 570 | |||
| 571 | addr = ( msg->addr << 1 ); | ||
| 572 | |||
| 573 | #if 0 | ||
| 574 | if (flags & I2C_M_RD ) | ||
| 575 | addr |= 1; | ||
| 576 | if (flags & I2C_M_REV_DIR_ADDR ) | ||
| 577 | addr ^= 1; | ||
| 578 | #endif | ||
| 579 | |||
| 580 | if (iic_inw(adap, ITE_I2CSAR) != addr) { | ||
| 581 | iic_outw(adap, ITE_I2CSAR, addr); | ||
| 582 | ret = try_address(adap, addr, retries); | ||
| 583 | if (ret!=1) { | ||
| 584 | printk("iic_doAddress: died at address code.\n"); | ||
| 585 | return -EREMOTEIO; | ||
| 586 | } | ||
| 587 | } | ||
| 588 | |||
| 589 | } | ||
| 590 | |||
| 591 | return 0; | ||
| 592 | } | ||
| 593 | |||
| 594 | |||
| 595 | /* Description: Prepares the controller for a transaction (clearing status | ||
| 596 | * registers, data buffers, etc), and then calls either iic_readbytes or | ||
| 597 | * iic_sendbytes to do the actual transaction. | ||
| 598 | * | ||
| 599 | * still to be done: Before we issue a transaction, we should | ||
| 600 | * verify that the bus is not busy or in some unknown state. | ||
| 601 | */ | ||
| 602 | static int iic_xfer(struct i2c_adapter *i2c_adap, | ||
| 603 | struct i2c_msg *msgs, | ||
| 604 | int num) | ||
| 605 | { | ||
| 606 | struct i2c_algo_iic_data *adap = i2c_adap->algo_data; | ||
| 607 | struct i2c_msg *pmsg; | ||
| 608 | int i = 0; | ||
| 609 | int ret, timeout; | ||
| 610 | |||
| 611 | pmsg = &msgs[i]; | ||
| 612 | |||
| 613 | if(!pmsg->len) { | ||
| 614 | DEB2(printk("iic_xfer: read/write length is 0\n");) | ||
| 615 | return -EIO; | ||
| 616 | } | ||
| 617 | if(!(pmsg->flags & I2C_M_RD) && (!(pmsg->len)%2) ) { | ||
| 618 | DEB2(printk("iic_xfer: write buffer length is not odd\n");) | ||
| 619 | return -EIO; | ||
| 620 | } | ||
| 621 | |||
| 622 | /* Wait for any pending transfers to complete */ | ||
| 623 | timeout = wait_for_bb(adap); | ||
| 624 | if (timeout) { | ||
| 625 | DEB2(printk("iic_xfer: Timeout waiting for host not busy\n");) | ||
| 626 | return -EIO; | ||
| 627 | } | ||
| 628 | |||
| 629 | /* Flush FIFO */ | ||
| 630 | iic_outw(adap, ITE_I2CFCR, ITE_I2CFCR_FLUSH); | ||
| 631 | |||
| 632 | /* Load address */ | ||
| 633 | ret = iic_doAddress(adap, pmsg, i2c_adap->retries); | ||
| 634 | if (ret) | ||
| 635 | return -EIO; | ||
| 636 | |||
| 637 | #if 0 | ||
| 638 | /* Combined transaction (read and write) */ | ||
| 639 | if(num > 1) { | ||
| 640 | DEB2(printk("iic_xfer: Call combined transaction\n")); | ||
| 641 | ret = iic_combined_transaction(i2c_adap, msgs, num); | ||
| 642 | } | ||
| 643 | #endif | ||
| 644 | |||
| 645 | DEB3(printk("iic_xfer: Msg %d, addr=0x%x, flags=0x%x, len=%d\n", | ||
| 646 | i, msgs[i].addr, msgs[i].flags, msgs[i].len);) | ||
| 647 | |||
| 648 | if(pmsg->flags & I2C_M_RD) /* Read */ | ||
| 649 | ret = iic_readbytes(i2c_adap, pmsg->buf, pmsg->len, 0); | ||
| 650 | else { /* Write */ | ||
| 651 | udelay(1000); | ||
| 652 | ret = iic_sendbytes(i2c_adap, pmsg->buf, pmsg->len); | ||
| 653 | } | ||
| 654 | |||
| 655 | if (ret != pmsg->len) | ||
| 656 | DEB3(printk("iic_xfer: error or fail on read/write %d bytes.\n",ret)); | ||
| 657 | else | ||
| 658 | DEB3(printk("iic_xfer: read/write %d bytes.\n",ret)); | ||
| 659 | |||
| 660 | return ret; | ||
| 661 | } | ||
| 662 | |||
| 663 | |||
| 664 | /* Implements device specific ioctls. Higher level ioctls can | ||
| 665 | * be found in i2c-core.c and are typical of any i2c controller (specifying | ||
| 666 | * slave address, timeouts, etc). These ioctls take advantage of any hardware | ||
| 667 | * features built into the controller for which this algorithm-adapter set | ||
| 668 | * was written. These ioctls allow you to take control of the data and clock | ||
| 669 | * lines and set the either high or low, | ||
| 670 | * similar to a GPIO pin. | ||
| 671 | */ | ||
| 672 | static int algo_control(struct i2c_adapter *adapter, | ||
| 673 | unsigned int cmd, unsigned long arg) | ||
| 674 | { | ||
| 675 | |||
| 676 | struct i2c_algo_iic_data *adap = adapter->algo_data; | ||
| 677 | struct i2c_iic_msg s_msg; | ||
| 678 | char *buf; | ||
| 679 | int ret; | ||
| 680 | |||
| 681 | if (cmd == I2C_SREAD) { | ||
| 682 | if(copy_from_user(&s_msg, (struct i2c_iic_msg *)arg, | ||
| 683 | sizeof(struct i2c_iic_msg))) | ||
| 684 | return -EFAULT; | ||
| 685 | buf = kmalloc(s_msg.len, GFP_KERNEL); | ||
| 686 | if (buf== NULL) | ||
| 687 | return -ENOMEM; | ||
| 688 | |||
| 689 | /* Flush FIFO */ | ||
| 690 | iic_outw(adap, ITE_I2CFCR, ITE_I2CFCR_FLUSH); | ||
| 691 | |||
| 692 | /* Load address */ | ||
| 693 | iic_outw(adap, ITE_I2CSAR,s_msg.addr<<1); | ||
| 694 | iic_outw(adap, ITE_I2CSSAR,s_msg.waddr & 0xff); | ||
| 695 | |||
| 696 | ret = iic_readbytes(adapter, buf, s_msg.len, 1); | ||
| 697 | if (ret>=0) { | ||
| 698 | if(copy_to_user( s_msg.buf, buf, s_msg.len) ) | ||
| 699 | ret = -EFAULT; | ||
| 700 | } | ||
| 701 | kfree(buf); | ||
| 702 | } | ||
| 703 | return 0; | ||
| 704 | } | ||
| 705 | |||
| 706 | |||
| 707 | static u32 iic_func(struct i2c_adapter *adap) | ||
| 708 | { | ||
| 709 | return I2C_FUNC_SMBUS_EMUL | I2C_FUNC_10BIT_ADDR | | ||
| 710 | I2C_FUNC_PROTOCOL_MANGLING; | ||
| 711 | } | ||
| 712 | |||
| 713 | /* -----exported algorithm data: ------------------------------------- */ | ||
| 714 | |||
| 715 | static struct i2c_algorithm iic_algo = { | ||
| 716 | .master_xfer = iic_xfer, | ||
| 717 | .algo_control = algo_control, /* ioctl */ | ||
| 718 | .functionality = iic_func, | ||
| 719 | }; | ||
| 720 | |||
| 721 | |||
| 722 | /* | ||
| 723 | * registering functions to load algorithms at runtime | ||
| 724 | */ | ||
| 725 | int i2c_iic_add_bus(struct i2c_adapter *adap) | ||
| 726 | { | ||
| 727 | struct i2c_algo_iic_data *iic_adap = adap->algo_data; | ||
| 728 | |||
| 729 | if (iic_test) { | ||
| 730 | int ret = test_bus(iic_adap, adap->name); | ||
| 731 | if (ret<0) | ||
| 732 | return -ENODEV; | ||
| 733 | } | ||
| 734 | |||
| 735 | DEB2(printk("i2c-algo-ite: hw routines for %s registered.\n", | ||
| 736 | adap->name)); | ||
| 737 | |||
| 738 | /* register new adapter to i2c module... */ | ||
| 739 | adap->algo = &iic_algo; | ||
| 740 | |||
| 741 | adap->timeout = 100; /* default values, should */ | ||
| 742 | adap->retries = 3; /* be replaced by defines */ | ||
| 743 | adap->flags = 0; | ||
| 744 | |||
| 745 | iic_init(iic_adap); | ||
| 746 | return i2c_add_adapter(adap); | ||
| 747 | } | ||
| 748 | |||
| 749 | |||
| 750 | int i2c_iic_del_bus(struct i2c_adapter *adap) | ||
| 751 | { | ||
| 752 | int res; | ||
| 753 | if ((res = i2c_del_adapter(adap)) < 0) | ||
| 754 | return res; | ||
| 755 | DEB2(printk("i2c-algo-ite: adapter unregistered: %s\n",adap->name)); | ||
| 756 | |||
| 757 | return 0; | ||
| 758 | } | ||
| 759 | |||
| 760 | |||
| 761 | int __init i2c_algo_iic_init (void) | ||
| 762 | { | ||
| 763 | printk(KERN_INFO "ITE iic (i2c) algorithm module\n"); | ||
| 764 | return 0; | ||
| 765 | } | ||
| 766 | |||
| 767 | |||
| 768 | void i2c_algo_iic_exit(void) | ||
| 769 | { | ||
| 770 | return; | ||
| 771 | } | ||
| 772 | |||
| 773 | |||
| 774 | EXPORT_SYMBOL(i2c_iic_add_bus); | ||
| 775 | EXPORT_SYMBOL(i2c_iic_del_bus); | ||
| 776 | |||
| 777 | /* The MODULE_* macros resolve to nothing if MODULES is not defined | ||
| 778 | * when this file is compiled. | ||
| 779 | */ | ||
| 780 | MODULE_AUTHOR("MontaVista Software <www.mvista.com>"); | ||
| 781 | MODULE_DESCRIPTION("ITE iic algorithm"); | ||
| 782 | MODULE_LICENSE("GPL"); | ||
| 783 | |||
| 784 | module_param(iic_test, bool, 0); | ||
| 785 | module_param(i2c_debug, int, S_IRUGO | S_IWUSR); | ||
| 786 | |||
| 787 | MODULE_PARM_DESC(iic_test, "Test if the I2C bus is available"); | ||
| 788 | MODULE_PARM_DESC(i2c_debug, | ||
| 789 | "debug level - 0 off; 1 normal; 2,3 more verbose; 9 iic-protocol"); | ||
| 790 | |||
| 791 | |||
| 792 | /* This function resolves to init_module (the function invoked when a module | ||
| 793 | * is loaded via insmod) when this file is compiled with MODULES defined. | ||
| 794 | * Otherwise (i.e. if you want this driver statically linked to the kernel), | ||
| 795 | * a pointer to this function is stored in a table and called | ||
| 796 | * during the initialization of the kernel (in do_basic_setup in /init/main.c) | ||
| 797 | * | ||
| 798 | * All this functionality is complements of the macros defined in linux/init.h | ||
| 799 | */ | ||
| 800 | module_init(i2c_algo_iic_init); | ||
| 801 | |||
| 802 | |||
| 803 | /* If MODULES is defined when this file is compiled, then this function will | ||
| 804 | * resolved to cleanup_module. | ||
| 805 | */ | ||
| 806 | module_exit(i2c_algo_iic_exit); | ||
diff --git a/drivers/i2c/algos/i2c-algo-ite.h b/drivers/i2c/algos/i2c-algo-ite.h deleted file mode 100644 index a8ca3c9b546a..000000000000 --- a/drivers/i2c/algos/i2c-algo-ite.h +++ /dev/null | |||
| @@ -1,117 +0,0 @@ | |||
| 1 | /* | ||
| 2 | -------------------------------------------------------------------- | ||
| 3 | i2c-ite.h: Global defines for the I2C controller on board the | ||
| 4 | ITE MIPS processor. | ||
| 5 | -------------------------------------------------------------------- | ||
| 6 | Hai-Pao Fan, MontaVista Software, Inc. | ||
| 7 | hpfan@mvista.com or source@mvista.com | ||
| 8 | |||
| 9 | Copyright 2001 MontaVista Software Inc. | ||
| 10 | |||
| 11 | * This program is free software; you can redistribute it and/or modify it | ||
| 12 | * under the terms of the GNU General Public License as published by the | ||
| 13 | * Free Software Foundation; either version 2 of the License, or (at your | ||
| 14 | * option) any later version. | ||
| 15 | * | ||
| 16 | * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED | ||
| 17 | * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | ||
| 18 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN | ||
| 19 | * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
| 20 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||
| 21 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | ||
| 22 | * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | ||
| 23 | * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
| 24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | ||
| 25 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
| 26 | * | ||
| 27 | * You should have received a copy of the GNU General Public License along | ||
| 28 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
| 29 | * 675 Mass Ave, Cambridge, MA 02139, USA. | ||
| 30 | |||
| 31 | */ | ||
| 32 | |||
| 33 | #ifndef I2C_ITE_H | ||
| 34 | #define I2C_ITE_H 1 | ||
| 35 | |||
| 36 | #include <asm/it8172/it8172.h> | ||
| 37 | |||
| 38 | /* I2C Registers */ | ||
| 39 | #define ITE_I2CHCR IT8172_PCI_IO_BASE + IT_I2C_BASE + 0x30 | ||
| 40 | #define ITE_I2CHSR IT8172_PCI_IO_BASE + IT_I2C_BASE + 0x34 | ||
| 41 | #define ITE_I2CSAR IT8172_PCI_IO_BASE + IT_I2C_BASE + 0x38 | ||
| 42 | #define ITE_I2CSSAR IT8172_PCI_IO_BASE + IT_I2C_BASE + 0x3c | ||
| 43 | #define ITE_I2CCKCNT IT8172_PCI_IO_BASE + IT_I2C_BASE + 0x48 | ||
| 44 | #define ITE_I2CSHDR IT8172_PCI_IO_BASE + IT_I2C_BASE + 0x4c | ||
| 45 | #define ITE_I2CRSUR IT8172_PCI_IO_BASE + IT_I2C_BASE + 0x50 | ||
| 46 | #define ITE_I2CPSUR IT8172_PCI_IO_BASE + IT_I2C_BASE + 0x54 | ||
| 47 | |||
| 48 | #define ITE_I2CFDR IT8172_PCI_IO_BASE + IT_I2C_BASE + 0x70 | ||
| 49 | #define ITE_I2CFBCR IT8172_PCI_IO_BASE + IT_I2C_BASE + 0x74 | ||
| 50 | #define ITE_I2CFCR IT8172_PCI_IO_BASE + IT_I2C_BASE + 0x78 | ||
| 51 | #define ITE_I2CFSR IT8172_PCI_IO_BASE + IT_I2C_BASE + 0x7c | ||
| 52 | |||
| 53 | |||
| 54 | /* Host Control Register ITE_I2CHCR */ | ||
| 55 | #define ITE_I2CHCR_HCE 0x01 /* Enable I2C Host Controller */ | ||
| 56 | #define ITE_I2CHCR_IE 0x02 /* Enable the interrupt after completing | ||
| 57 | the current transaction */ | ||
| 58 | #define ITE_I2CHCR_CP_W 0x00 /* bit2-4 000 - Write */ | ||
| 59 | #define ITE_I2CHCR_CP_R 0x08 /* 010 - Current address read */ | ||
| 60 | #define ITE_I2CHCR_CP_S 0x10 /* 100 - Sequential read */ | ||
| 61 | #define ITE_I2CHCR_ST 0x20 /* Initiates the I2C host controller to execute | ||
| 62 | the command and send the data programmed in | ||
| 63 | all required registers to I2C bus */ | ||
| 64 | #define ITE_CMD ITE_I2CHCR_HCE | ITE_I2CHCR_IE | ITE_I2CHCR_ST | ||
| 65 | #define ITE_WRITE ITE_CMD | ITE_I2CHCR_CP_W | ||
| 66 | #define ITE_READ ITE_CMD | ITE_I2CHCR_CP_R | ||
| 67 | #define ITE_SREAD ITE_CMD | ITE_I2CHCR_CP_S | ||
| 68 | |||
| 69 | /* Host Status Register ITE_I2CHSR */ | ||
| 70 | #define ITE_I2CHSR_DB 0x01 /* Device is busy, receives NACK response except | ||
| 71 | in the first and last bytes */ | ||
| 72 | #define ITE_I2CHSR_DNE 0x02 /* Target address on I2C bus does not exist */ | ||
| 73 | #define ITE_I2CHSR_TDI 0x04 /* R/W Transaction on I2C bus was completed */ | ||
| 74 | #define ITE_I2CHSR_HB 0x08 /* Host controller is processing transactions */ | ||
| 75 | #define ITE_I2CHSR_FER 0x10 /* Error occurs in the FIFO */ | ||
| 76 | |||
| 77 | /* Slave Address Register ITE_I2CSAR */ | ||
| 78 | #define ITE_I2CSAR_SA_MASK 0xfe /* Target I2C device address */ | ||
| 79 | #define ITE_I2CSAR_ASO 0x0100 /* Output 1/0 to I2CAS port when the | ||
| 80 | next slave address is addressed */ | ||
| 81 | |||
| 82 | /* Slave Sub-address Register ITE_I2CSSAR */ | ||
| 83 | #define ITE_I2CSSAR_SUBA_MASK 0xff /* Target I2C device sub-address */ | ||
| 84 | |||
| 85 | /* Clock Counter Register ITE_I2CCKCNT */ | ||
| 86 | #define ITE_I2CCKCNT_STOP 0x00 /* stop I2C clock */ | ||
| 87 | #define ITE_I2CCKCNT_HPCC_MASK 0x7f /* SCL high period counter */ | ||
| 88 | #define ITE_I2CCKCNT_LPCC_MASK 0x7f00 /* SCL low period counter */ | ||
| 89 | |||
| 90 | /* START Hold Time Register ITE_I2CSHDR */ | ||
| 91 | /* value is counted based on 16 MHz internal clock */ | ||
| 92 | #define ITE_I2CSHDR_FM 0x0a /* START condition at fast mode */ | ||
| 93 | #define ITE_I2CSHDR_SM 0x47 /* START contition at standard mode */ | ||
| 94 | |||
| 95 | /* (Repeated) START Setup Time Register ITE_I2CRSUR */ | ||
| 96 | /* value is counted based on 16 MHz internal clock */ | ||
| 97 | #define ITE_I2CRSUR_FM 0x0a /* repeated START condition at fast mode */ | ||
| 98 | #define ITE_I2CRSUR_SM 0x50 /* repeated START condition at standard mode */ | ||
| 99 | |||
| 100 | /* STOP setup Time Register ITE_I2CPSUR */ | ||
| 101 | |||
| 102 | /* FIFO Data Register ITE_I2CFDR */ | ||
| 103 | #define ITE_I2CFDR_MASK 0xff | ||
| 104 | |||
| 105 | /* FIFO Byte Count Register ITE_I2CFBCR */ | ||
| 106 | #define ITE_I2CFBCR_MASK 0x3f | ||
| 107 | |||
| 108 | /* FIFO Control Register ITE_I2CFCR */ | ||
| 109 | #define ITE_I2CFCR_FLUSH 0x01 /* Flush FIFO and reset the FIFO point | ||
| 110 | and I2CFSR */ | ||
| 111 | /* FIFO Status Register ITE_I2CFSR */ | ||
| 112 | #define ITE_I2CFSR_FO 0x01 /* FIFO is overrun when write */ | ||
| 113 | #define ITE_I2CFSR_FU 0x02 /* FIFO is underrun when read */ | ||
| 114 | #define ITE_I2CFSR_FF 0x04 /* FIFO is full when write */ | ||
| 115 | #define ITE_I2CFSR_FE 0x08 /* FIFO is empty when read */ | ||
| 116 | |||
| 117 | #endif /* I2C_ITE_H */ | ||
diff --git a/drivers/i2c/algos/i2c-algo-pca.c b/drivers/i2c/algos/i2c-algo-pca.c index b88a6fcf7bd0..36fdf971f080 100644 --- a/drivers/i2c/algos/i2c-algo-pca.c +++ b/drivers/i2c/algos/i2c-algo-pca.c | |||
| @@ -355,7 +355,7 @@ static int pca_init(struct i2c_algo_pca_data *adap) | |||
| 355 | return 0; | 355 | return 0; |
| 356 | } | 356 | } |
| 357 | 357 | ||
| 358 | static struct i2c_algorithm pca_algo = { | 358 | static const struct i2c_algorithm pca_algo = { |
| 359 | .master_xfer = pca_xfer, | 359 | .master_xfer = pca_xfer, |
| 360 | .functionality = pca_func, | 360 | .functionality = pca_func, |
| 361 | }; | 361 | }; |
| @@ -381,14 +381,7 @@ int i2c_pca_add_bus(struct i2c_adapter *adap) | |||
| 381 | 381 | ||
| 382 | return rval; | 382 | return rval; |
| 383 | } | 383 | } |
| 384 | |||
| 385 | int i2c_pca_del_bus(struct i2c_adapter *adap) | ||
| 386 | { | ||
| 387 | return i2c_del_adapter(adap); | ||
| 388 | } | ||
| 389 | |||
| 390 | EXPORT_SYMBOL(i2c_pca_add_bus); | 384 | EXPORT_SYMBOL(i2c_pca_add_bus); |
| 391 | EXPORT_SYMBOL(i2c_pca_del_bus); | ||
| 392 | 385 | ||
| 393 | MODULE_AUTHOR("Ian Campbell <icampbell@arcom.com>"); | 386 | MODULE_AUTHOR("Ian Campbell <icampbell@arcom.com>"); |
| 394 | MODULE_DESCRIPTION("I2C-Bus PCA9564 algorithm"); | 387 | MODULE_DESCRIPTION("I2C-Bus PCA9564 algorithm"); |
diff --git a/drivers/i2c/algos/i2c-algo-pcf.c b/drivers/i2c/algos/i2c-algo-pcf.c index 5b24930adb5a..ecb2c2d7d540 100644 --- a/drivers/i2c/algos/i2c-algo-pcf.c +++ b/drivers/i2c/algos/i2c-algo-pcf.c | |||
| @@ -458,7 +458,7 @@ static u32 pcf_func(struct i2c_adapter *adap) | |||
| 458 | 458 | ||
| 459 | /* -----exported algorithm data: ------------------------------------- */ | 459 | /* -----exported algorithm data: ------------------------------------- */ |
| 460 | 460 | ||
| 461 | static struct i2c_algorithm pcf_algo = { | 461 | static const struct i2c_algorithm pcf_algo = { |
| 462 | .master_xfer = pcf_xfer, | 462 | .master_xfer = pcf_xfer, |
| 463 | .functionality = pcf_func, | 463 | .functionality = pcf_func, |
| 464 | }; | 464 | }; |
| @@ -486,15 +486,7 @@ int i2c_pcf_add_bus(struct i2c_adapter *adap) | |||
| 486 | 486 | ||
| 487 | return rval; | 487 | return rval; |
| 488 | } | 488 | } |
| 489 | |||
| 490 | |||
| 491 | int i2c_pcf_del_bus(struct i2c_adapter *adap) | ||
| 492 | { | ||
| 493 | return i2c_del_adapter(adap); | ||
| 494 | } | ||
| 495 | |||
| 496 | EXPORT_SYMBOL(i2c_pcf_add_bus); | 489 | EXPORT_SYMBOL(i2c_pcf_add_bus); |
| 497 | EXPORT_SYMBOL(i2c_pcf_del_bus); | ||
| 498 | 490 | ||
| 499 | MODULE_AUTHOR("Hans Berglund <hb@spacetec.no>"); | 491 | MODULE_AUTHOR("Hans Berglund <hb@spacetec.no>"); |
| 500 | MODULE_DESCRIPTION("I2C-Bus PCF8584 algorithm"); | 492 | MODULE_DESCRIPTION("I2C-Bus PCF8584 algorithm"); |
diff --git a/drivers/i2c/algos/i2c-algo-sgi.c b/drivers/i2c/algos/i2c-algo-sgi.c index 932c4fa86c73..ac2d5053078a 100644 --- a/drivers/i2c/algos/i2c-algo-sgi.c +++ b/drivers/i2c/algos/i2c-algo-sgi.c | |||
| @@ -157,7 +157,7 @@ static u32 sgi_func(struct i2c_adapter *adap) | |||
| 157 | return I2C_FUNC_SMBUS_EMUL; | 157 | return I2C_FUNC_SMBUS_EMUL; |
| 158 | } | 158 | } |
| 159 | 159 | ||
| 160 | static struct i2c_algorithm sgi_algo = { | 160 | static const struct i2c_algorithm sgi_algo = { |
| 161 | .master_xfer = sgi_xfer, | 161 | .master_xfer = sgi_xfer, |
| 162 | .functionality = sgi_func, | 162 | .functionality = sgi_func, |
| 163 | }; | 163 | }; |
| @@ -171,15 +171,7 @@ int i2c_sgi_add_bus(struct i2c_adapter *adap) | |||
| 171 | 171 | ||
| 172 | return i2c_add_adapter(adap); | 172 | return i2c_add_adapter(adap); |
| 173 | } | 173 | } |
| 174 | |||
| 175 | |||
| 176 | int i2c_sgi_del_bus(struct i2c_adapter *adap) | ||
| 177 | { | ||
| 178 | return i2c_del_adapter(adap); | ||
| 179 | } | ||
| 180 | |||
| 181 | EXPORT_SYMBOL(i2c_sgi_add_bus); | 174 | EXPORT_SYMBOL(i2c_sgi_add_bus); |
| 182 | EXPORT_SYMBOL(i2c_sgi_del_bus); | ||
| 183 | 175 | ||
| 184 | MODULE_AUTHOR("Ladislav Michl <ladis@linux-mips.org>"); | 176 | MODULE_AUTHOR("Ladislav Michl <ladis@linux-mips.org>"); |
| 185 | MODULE_DESCRIPTION("I2C-Bus SGI algorithm"); | 177 | MODULE_DESCRIPTION("I2C-Bus SGI algorithm"); |
diff --git a/drivers/i2c/algos/i2c-algo-sibyte.c b/drivers/i2c/algos/i2c-algo-sibyte.c deleted file mode 100644 index 32d41c6fac0f..000000000000 --- a/drivers/i2c/algos/i2c-algo-sibyte.c +++ /dev/null | |||
| @@ -1,215 +0,0 @@ | |||
| 1 | /* ------------------------------------------------------------------------- */ | ||
| 2 | /* i2c-algo-sibyte.c i2c driver algorithms for bit-shift adapters */ | ||
| 3 | /* ------------------------------------------------------------------------- */ | ||
| 4 | /* Copyright (C) 2001,2002,2003 Broadcom Corporation | ||
| 5 | Copyright (C) 1995-2000 Simon G. Vogl | ||
| 6 | |||
| 7 | This program is free software; you can redistribute it and/or modify | ||
| 8 | it under the terms of the GNU General Public License as published by | ||
| 9 | the Free Software Foundation; either version 2 of the License, or | ||
| 10 | (at your option) any later version. | ||
| 11 | |||
| 12 | This program is distributed in the hope that it will be useful, | ||
| 13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 15 | GNU General Public License for more details. | ||
| 16 | |||
| 17 | You should have received a copy of the GNU General Public License | ||
| 18 | along with this program; if not, write to the Free Software | ||
| 19 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ | ||
| 20 | /* ------------------------------------------------------------------------- */ | ||
| 21 | |||
| 22 | /* With some changes from Kyösti Mälkki <kmalkki@cc.hut.fi> and even | ||
| 23 | Frodo Looijaard <frodol@dds.nl>. */ | ||
| 24 | |||
| 25 | /* Ported for SiByte SOCs by Broadcom Corporation. */ | ||
| 26 | |||
| 27 | #include <linux/kernel.h> | ||
| 28 | #include <linux/module.h> | ||
| 29 | #include <linux/init.h> | ||
| 30 | |||
| 31 | #include <asm/io.h> | ||
| 32 | #include <asm/sibyte/sb1250_regs.h> | ||
| 33 | #include <asm/sibyte/sb1250_smbus.h> | ||
| 34 | |||
| 35 | #include <linux/i2c.h> | ||
| 36 | #include <linux/i2c-algo-sibyte.h> | ||
| 37 | |||
| 38 | /* ----- global defines ----------------------------------------------- */ | ||
| 39 | #define SMB_CSR(a,r) ((long)(a->reg_base + r)) | ||
| 40 | |||
| 41 | /* ----- global variables --------------------------------------------- */ | ||
| 42 | |||
| 43 | /* module parameters: | ||
| 44 | */ | ||
| 45 | static int bit_scan; /* have a look at what's hanging 'round */ | ||
| 46 | |||
| 47 | |||
| 48 | static int smbus_xfer(struct i2c_adapter *i2c_adap, u16 addr, | ||
| 49 | unsigned short flags, char read_write, | ||
| 50 | u8 command, int size, union i2c_smbus_data * data) | ||
| 51 | { | ||
| 52 | struct i2c_algo_sibyte_data *adap = i2c_adap->algo_data; | ||
| 53 | int data_bytes = 0; | ||
| 54 | int error; | ||
| 55 | |||
| 56 | while (csr_in32(SMB_CSR(adap, R_SMB_STATUS)) & M_SMB_BUSY) | ||
| 57 | ; | ||
| 58 | |||
| 59 | switch (size) { | ||
| 60 | case I2C_SMBUS_QUICK: | ||
| 61 | csr_out32((V_SMB_ADDR(addr) | (read_write == I2C_SMBUS_READ ? M_SMB_QDATA : 0) | | ||
| 62 | V_SMB_TT_QUICKCMD), SMB_CSR(adap, R_SMB_START)); | ||
| 63 | break; | ||
| 64 | case I2C_SMBUS_BYTE: | ||
| 65 | if (read_write == I2C_SMBUS_READ) { | ||
| 66 | csr_out32((V_SMB_ADDR(addr) | V_SMB_TT_RD1BYTE), | ||
| 67 | SMB_CSR(adap, R_SMB_START)); | ||
| 68 | data_bytes = 1; | ||
| 69 | } else { | ||
| 70 | csr_out32(V_SMB_CMD(command), SMB_CSR(adap, R_SMB_CMD)); | ||
| 71 | csr_out32((V_SMB_ADDR(addr) | V_SMB_TT_WR1BYTE), | ||
| 72 | SMB_CSR(adap, R_SMB_START)); | ||
| 73 | } | ||
| 74 | break; | ||
| 75 | case I2C_SMBUS_BYTE_DATA: | ||
| 76 | csr_out32(V_SMB_CMD(command), SMB_CSR(adap, R_SMB_CMD)); | ||
| 77 | if (read_write == I2C_SMBUS_READ) { | ||
| 78 | csr_out32((V_SMB_ADDR(addr) | V_SMB_TT_CMD_RD1BYTE), | ||
| 79 | SMB_CSR(adap, R_SMB_START)); | ||
| 80 | data_bytes = 1; | ||
| 81 | } else { | ||
| 82 | csr_out32(V_SMB_LB(data->byte), SMB_CSR(adap, R_SMB_DATA)); | ||
| 83 | csr_out32((V_SMB_ADDR(addr) | V_SMB_TT_WR2BYTE), | ||
| 84 | SMB_CSR(adap, R_SMB_START)); | ||
| 85 | } | ||
| 86 | break; | ||
| 87 | case I2C_SMBUS_WORD_DATA: | ||
| 88 | csr_out32(V_SMB_CMD(command), SMB_CSR(adap, R_SMB_CMD)); | ||
| 89 | if (read_write == I2C_SMBUS_READ) { | ||
| 90 | csr_out32((V_SMB_ADDR(addr) | V_SMB_TT_CMD_RD2BYTE), | ||
| 91 | SMB_CSR(adap, R_SMB_START)); | ||
| 92 | data_bytes = 2; | ||
| 93 | } else { | ||
| 94 | csr_out32(V_SMB_LB(data->word & 0xff), SMB_CSR(adap, R_SMB_DATA)); | ||
| 95 | csr_out32(V_SMB_MB(data->word >> 8), SMB_CSR(adap, R_SMB_DATA)); | ||
| 96 | csr_out32((V_SMB_ADDR(addr) | V_SMB_TT_WR2BYTE), | ||
| 97 | SMB_CSR(adap, R_SMB_START)); | ||
| 98 | } | ||
| 99 | break; | ||
| 100 | default: | ||
| 101 | return -1; /* XXXKW better error code? */ | ||
| 102 | } | ||
| 103 | |||
| 104 | while (csr_in32(SMB_CSR(adap, R_SMB_STATUS)) & M_SMB_BUSY) | ||
| 105 | ; | ||
| 106 | |||
| 107 | error = csr_in32(SMB_CSR(adap, R_SMB_STATUS)); | ||
| 108 | if (error & M_SMB_ERROR) { | ||
| 109 | /* Clear error bit by writing a 1 */ | ||
| 110 | csr_out32(M_SMB_ERROR, SMB_CSR(adap, R_SMB_STATUS)); | ||
| 111 | return -1; /* XXXKW better error code? */ | ||
| 112 | } | ||
| 113 | |||
| 114 | if (data_bytes == 1) | ||
| 115 | data->byte = csr_in32(SMB_CSR(adap, R_SMB_DATA)) & 0xff; | ||
| 116 | if (data_bytes == 2) | ||
| 117 | data->word = csr_in32(SMB_CSR(adap, R_SMB_DATA)) & 0xffff; | ||
| 118 | |||
| 119 | return 0; | ||
| 120 | } | ||
| 121 | |||
| 122 | static int algo_control(struct i2c_adapter *adapter, | ||
| 123 | unsigned int cmd, unsigned long arg) | ||
| 124 | { | ||
| 125 | return 0; | ||
| 126 | } | ||
| 127 | |||
| 128 | static u32 bit_func(struct i2c_adapter *adap) | ||
| 129 | { | ||
| 130 | return (I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE | | ||
| 131 | I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA); | ||
| 132 | } | ||
| 133 | |||
| 134 | |||
| 135 | /* -----exported algorithm data: ------------------------------------- */ | ||
| 136 | |||
| 137 | static struct i2c_algorithm i2c_sibyte_algo = { | ||
| 138 | .smbus_xfer = smbus_xfer, | ||
| 139 | .algo_control = algo_control, /* ioctl */ | ||
| 140 | .functionality = bit_func, | ||
| 141 | }; | ||
| 142 | |||
| 143 | /* | ||
| 144 | * registering functions to load algorithms at runtime | ||
| 145 | */ | ||
| 146 | int i2c_sibyte_add_bus(struct i2c_adapter *i2c_adap, int speed) | ||
| 147 | { | ||
| 148 | int i; | ||
| 149 | struct i2c_algo_sibyte_data *adap = i2c_adap->algo_data; | ||
| 150 | |||
| 151 | /* register new adapter to i2c module... */ | ||
| 152 | i2c_adap->algo = &i2c_sibyte_algo; | ||
| 153 | |||
| 154 | /* Set the frequency to 100 kHz */ | ||
| 155 | csr_out32(speed, SMB_CSR(adap,R_SMB_FREQ)); | ||
| 156 | csr_out32(0, SMB_CSR(adap,R_SMB_CONTROL)); | ||
| 157 | |||
| 158 | /* scan bus */ | ||
| 159 | if (bit_scan) { | ||
| 160 | union i2c_smbus_data data; | ||
| 161 | int rc; | ||
| 162 | printk(KERN_INFO " i2c-algo-sibyte.o: scanning bus %s.\n", | ||
| 163 | i2c_adap->name); | ||
| 164 | for (i = 0x00; i < 0x7f; i++) { | ||
| 165 | /* XXXKW is this a realistic probe? */ | ||
| 166 | rc = smbus_xfer(i2c_adap, i, 0, I2C_SMBUS_READ, 0, | ||
| 167 | I2C_SMBUS_BYTE_DATA, &data); | ||
| 168 | if (!rc) { | ||
| 169 | printk("(%02x)",i); | ||
| 170 | } else | ||
| 171 | printk("."); | ||
| 172 | } | ||
| 173 | printk("\n"); | ||
| 174 | } | ||
| 175 | |||
| 176 | return i2c_add_adapter(i2c_adap); | ||
| 177 | } | ||
| 178 | |||
| 179 | |||
| 180 | int i2c_sibyte_del_bus(struct i2c_adapter *adap) | ||
| 181 | { | ||
| 182 | int res; | ||
| 183 | |||
| 184 | if ((res = i2c_del_adapter(adap)) < 0) | ||
| 185 | return res; | ||
| 186 | |||
| 187 | return 0; | ||
| 188 | } | ||
| 189 | |||
| 190 | int __init i2c_algo_sibyte_init (void) | ||
| 191 | { | ||
| 192 | printk("i2c-algo-sibyte.o: i2c SiByte algorithm module\n"); | ||
| 193 | return 0; | ||
| 194 | } | ||
| 195 | |||
| 196 | |||
| 197 | EXPORT_SYMBOL(i2c_sibyte_add_bus); | ||
| 198 | EXPORT_SYMBOL(i2c_sibyte_del_bus); | ||
| 199 | |||
| 200 | #ifdef MODULE | ||
| 201 | MODULE_AUTHOR("Kip Walker, Broadcom Corp."); | ||
| 202 | MODULE_DESCRIPTION("SiByte I2C-Bus algorithm"); | ||
| 203 | module_param(bit_scan, int, 0); | ||
| 204 | MODULE_PARM_DESC(bit_scan, "Scan for active chips on the bus"); | ||
| 205 | MODULE_LICENSE("GPL"); | ||
| 206 | |||
| 207 | int init_module(void) | ||
| 208 | { | ||
| 209 | return i2c_algo_sibyte_init(); | ||
| 210 | } | ||
| 211 | |||
| 212 | void cleanup_module(void) | ||
| 213 | { | ||
| 214 | } | ||
| 215 | #endif | ||
diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig index 884320e70403..e1989f3a2684 100644 --- a/drivers/i2c/busses/Kconfig +++ b/drivers/i2c/busses/Kconfig | |||
| @@ -74,12 +74,19 @@ config I2C_AMD8111 | |||
| 74 | This driver can also be built as a module. If so, the module | 74 | This driver can also be built as a module. If so, the module |
| 75 | will be called i2c-amd8111. | 75 | will be called i2c-amd8111. |
| 76 | 76 | ||
| 77 | config I2C_AT91 | ||
| 78 | tristate "Atmel AT91 I2C Two-Wire interface (TWI)" | ||
| 79 | depends on I2C && ARCH_AT91 && EXPERIMENTAL | ||
| 80 | help | ||
| 81 | This supports the use of the I2C interface on Atmel AT91 | ||
| 82 | processors. | ||
| 83 | |||
| 77 | config I2C_AU1550 | 84 | config I2C_AU1550 |
| 78 | tristate "Au1550 SMBus interface" | 85 | tristate "Au1550/Au1200 SMBus interface" |
| 79 | depends on I2C && SOC_AU1550 | 86 | depends on I2C && (SOC_AU1550 || SOC_AU1200) |
| 80 | help | 87 | help |
| 81 | If you say yes to this option, support will be included for the | 88 | If you say yes to this option, support will be included for the |
| 82 | Au1550 SMBus interface. | 89 | Au1550 and Au1200 SMBus interface. |
| 83 | 90 | ||
| 84 | This driver can also be built as a module. If so, the module | 91 | This driver can also be built as a module. If so, the module |
| 85 | will be called i2c-au1550. | 92 | will be called i2c-au1550. |
| @@ -125,6 +132,7 @@ config I2C_I801 | |||
| 125 | ICH7 | 132 | ICH7 |
| 126 | ESB2 | 133 | ESB2 |
| 127 | ICH8 | 134 | ICH8 |
| 135 | ICH9 | ||
| 128 | 136 | ||
| 129 | This driver can also be built as a module. If so, the module | 137 | This driver can also be built as a module. If so, the module |
| 130 | will be called i2c-i801. | 138 | will be called i2c-i801. |
| @@ -195,11 +203,11 @@ config I2C_IBM_IIC | |||
| 195 | will be called i2c-ibm_iic. | 203 | will be called i2c-ibm_iic. |
| 196 | 204 | ||
| 197 | config I2C_IOP3XX | 205 | config I2C_IOP3XX |
| 198 | tristate "Intel IOP3xx and IXP4xx on-chip I2C interface" | 206 | tristate "Intel IOPx3xx and IXP4xx on-chip I2C interface" |
| 199 | depends on (ARCH_IOP3XX || ARCH_IXP4XX) && I2C | 207 | depends on (ARCH_IOP32X || ARCH_IOP33X || ARCH_IXP4XX || ARCH_IOP13XX) && I2C |
| 200 | help | 208 | help |
| 201 | Say Y here if you want to use the IIC bus controller on | 209 | Say Y here if you want to use the IIC bus controller on |
| 202 | the Intel IOP3xx I/O Processors or IXP4xx Network Processors. | 210 | the Intel IOPx3xx I/O Processors or IXP4xx Network Processors. |
| 203 | 211 | ||
| 204 | This driver can also be built as a module. If so, the module | 212 | This driver can also be built as a module. If so, the module |
| 205 | will be called i2c-iop3xx. | 213 | will be called i2c-iop3xx. |
| @@ -208,18 +216,6 @@ config I2C_ISA | |||
| 208 | tristate | 216 | tristate |
| 209 | depends on I2C | 217 | depends on I2C |
| 210 | 218 | ||
| 211 | config I2C_ITE | ||
| 212 | tristate "ITE I2C Adapter" | ||
| 213 | depends on I2C && MIPS_ITE8172 | ||
| 214 | select I2C_ALGOITE | ||
| 215 | help | ||
| 216 | This supports the ITE8172 I2C peripheral found on some MIPS | ||
| 217 | systems. Say Y if you have one of these. You should also say Y for | ||
| 218 | the ITE I2C driver algorithm support above. | ||
| 219 | |||
| 220 | This support is also available as a module. If so, the module | ||
| 221 | will be called i2c-ite. | ||
| 222 | |||
| 223 | config I2C_IXP4XX | 219 | config I2C_IXP4XX |
| 224 | tristate "IXP4xx GPIO-Based I2C Interface" | 220 | tristate "IXP4xx GPIO-Based I2C Interface" |
| 225 | depends on I2C && ARCH_IXP4XX | 221 | depends on I2C && ARCH_IXP4XX |
| @@ -287,6 +283,16 @@ config I2C_OCORES | |||
| 287 | This driver can also be built as a module. If so, the module | 283 | This driver can also be built as a module. If so, the module |
| 288 | will be called i2c-ocores. | 284 | will be called i2c-ocores. |
| 289 | 285 | ||
| 286 | config I2C_OMAP | ||
| 287 | tristate "OMAP I2C adapter" | ||
| 288 | depends on I2C && ARCH_OMAP | ||
| 289 | default y if MACH_OMAP_H3 || MACH_OMAP_OSK | ||
| 290 | help | ||
| 291 | If you say yes to this option, support will be included for the | ||
| 292 | I2C interface on the Texas Instruments OMAP1/2 family of processors. | ||
| 293 | Like OMAP1510/1610/1710/5912 and OMAP242x. | ||
| 294 | For details see http://www.ti.com/omap. | ||
| 295 | |||
| 290 | config I2C_PARPORT | 296 | config I2C_PARPORT |
| 291 | tristate "Parallel port adapter" | 297 | tristate "Parallel port adapter" |
| 292 | depends on I2C && PARPORT | 298 | depends on I2C && PARPORT |
| @@ -323,10 +329,10 @@ config I2C_PARPORT_LIGHT | |||
| 323 | 329 | ||
| 324 | This driver is a light version of i2c-parport. It doesn't depend | 330 | This driver is a light version of i2c-parport. It doesn't depend |
| 325 | on the parport driver, and uses direct I/O access instead. This | 331 | on the parport driver, and uses direct I/O access instead. This |
| 326 | might be prefered on embedded systems where wasting memory for | 332 | might be preferred on embedded systems where wasting memory for |
| 327 | the clean but heavy parport handling is not an option. The | 333 | the clean but heavy parport handling is not an option. The |
| 328 | drawback is a reduced portability and the impossibility to | 334 | drawback is a reduced portability and the impossibility to |
| 329 | dasiy-chain other parallel port devices. | 335 | daisy-chain other parallel port devices. |
| 330 | 336 | ||
| 331 | Don't say Y here if you said Y or M to i2c-parport. Saying M to | 337 | Don't say Y here if you said Y or M to i2c-parport. Saying M to |
| 332 | both is possible but both modules should not be loaded at the same | 338 | both is possible but both modules should not be loaded at the same |
| @@ -470,6 +476,17 @@ config I2C_STUB | |||
| 470 | 476 | ||
| 471 | If you don't know what to do here, definitely say N. | 477 | If you don't know what to do here, definitely say N. |
| 472 | 478 | ||
| 479 | config I2C_VERSATILE | ||
| 480 | tristate "ARM Versatile/Realview I2C bus support" | ||
| 481 | depends on I2C && (ARCH_VERSATILE || ARCH_REALVIEW) | ||
| 482 | select I2C_ALGOBIT | ||
| 483 | help | ||
| 484 | Say yes if you want to support the I2C serial bus on ARMs Versatile | ||
| 485 | range of platforms. | ||
| 486 | |||
| 487 | This driver can also be built as a module. If so, the module | ||
| 488 | will be called i2c-versatile. | ||
| 489 | |||
| 473 | config I2C_VIA | 490 | config I2C_VIA |
| 474 | tristate "VIA 82C586B" | 491 | tristate "VIA 82C586B" |
| 475 | depends on I2C && PCI && EXPERIMENTAL | 492 | depends on I2C && PCI && EXPERIMENTAL |
| @@ -482,19 +499,19 @@ config I2C_VIA | |||
| 482 | will be called i2c-via. | 499 | will be called i2c-via. |
| 483 | 500 | ||
| 484 | config I2C_VIAPRO | 501 | config I2C_VIAPRO |
| 485 | tristate "VIA 82C596/82C686/823x" | 502 | tristate "VIA 82C596/82C686/82xx" |
| 486 | depends on I2C && PCI | 503 | depends on I2C && PCI |
| 487 | help | 504 | help |
| 488 | If you say yes to this option, support will be included for the VIA | 505 | If you say yes to this option, support will be included for the VIA |
| 489 | 82C596/82C686/823x I2C interfaces. Specifically, the following | 506 | 82C596/82C686/82xx I2C interfaces. Specifically, the following |
| 490 | chipsets are supported: | 507 | chipsets are supported: |
| 491 | 82C596A/B | 508 | VT82C596A/B |
| 492 | 82C686A/B | 509 | VT82C686A/B |
| 493 | 8231 | 510 | VT8231 |
| 494 | 8233 | 511 | VT8233/A |
| 495 | 8233A | 512 | VT8235 |
| 496 | 8235 | 513 | VT8237R/A |
| 497 | 8237 | 514 | VT8251 |
| 498 | 515 | ||
| 499 | This driver can also be built as a module. If so, the module | 516 | This driver can also be built as a module. If so, the module |
| 500 | will be called i2c-viapro. | 517 | will be called i2c-viapro. |
| @@ -537,4 +554,23 @@ config I2C_MV64XXX | |||
| 537 | This driver can also be built as a module. If so, the module | 554 | This driver can also be built as a module. If so, the module |
| 538 | will be called i2c-mv64xxx. | 555 | will be called i2c-mv64xxx. |
| 539 | 556 | ||
| 557 | config I2C_PNX | ||
| 558 | tristate "I2C bus support for Philips PNX targets" | ||
| 559 | depends on ARCH_PNX4008 && I2C | ||
| 560 | help | ||
| 561 | This driver supports the Philips IP3204 I2C IP block master and/or | ||
| 562 | slave controller | ||
| 563 | |||
| 564 | This driver can also be built as a module. If so, the module | ||
| 565 | will be called i2c-pnx. | ||
| 566 | |||
| 567 | config I2C_PNX_EARLY | ||
| 568 | bool "Early initialization for I2C on PNXxxxx" | ||
| 569 | depends on I2C_PNX=y | ||
| 570 | help | ||
| 571 | Under certain circumstances one may need to make sure I2C on PNXxxxx | ||
| 572 | is initialized earlier than some other driver that depends on it | ||
| 573 | (for instance, that might be USB in case of PNX4008). With this | ||
| 574 | option turned on you can guarantee that. | ||
| 575 | |||
| 540 | endmenu | 576 | endmenu |
diff --git a/drivers/i2c/busses/Makefile b/drivers/i2c/busses/Makefile index ac56df53155b..37196c1d0794 100644 --- a/drivers/i2c/busses/Makefile +++ b/drivers/i2c/busses/Makefile | |||
| @@ -8,6 +8,7 @@ obj-$(CONFIG_I2C_ALI15X3) += i2c-ali15x3.o | |||
| 8 | obj-$(CONFIG_I2C_AMD756) += i2c-amd756.o | 8 | obj-$(CONFIG_I2C_AMD756) += i2c-amd756.o |
| 9 | obj-$(CONFIG_I2C_AMD756_S4882) += i2c-amd756-s4882.o | 9 | obj-$(CONFIG_I2C_AMD756_S4882) += i2c-amd756-s4882.o |
| 10 | obj-$(CONFIG_I2C_AMD8111) += i2c-amd8111.o | 10 | obj-$(CONFIG_I2C_AMD8111) += i2c-amd8111.o |
| 11 | obj-$(CONFIG_I2C_AT91) += i2c-at91.o | ||
| 11 | obj-$(CONFIG_I2C_AU1550) += i2c-au1550.o | 12 | obj-$(CONFIG_I2C_AU1550) += i2c-au1550.o |
| 12 | obj-$(CONFIG_I2C_ELEKTOR) += i2c-elektor.o | 13 | obj-$(CONFIG_I2C_ELEKTOR) += i2c-elektor.o |
| 13 | obj-$(CONFIG_I2C_HYDRA) += i2c-hydra.o | 14 | obj-$(CONFIG_I2C_HYDRA) += i2c-hydra.o |
| @@ -16,7 +17,6 @@ obj-$(CONFIG_I2C_I810) += i2c-i810.o | |||
| 16 | obj-$(CONFIG_I2C_IBM_IIC) += i2c-ibm_iic.o | 17 | obj-$(CONFIG_I2C_IBM_IIC) += i2c-ibm_iic.o |
| 17 | obj-$(CONFIG_I2C_IOP3XX) += i2c-iop3xx.o | 18 | obj-$(CONFIG_I2C_IOP3XX) += i2c-iop3xx.o |
| 18 | obj-$(CONFIG_I2C_ISA) += i2c-isa.o | 19 | obj-$(CONFIG_I2C_ISA) += i2c-isa.o |
| 19 | obj-$(CONFIG_I2C_ITE) += i2c-ite.o | ||
| 20 | obj-$(CONFIG_I2C_IXP2000) += i2c-ixp2000.o | 20 | obj-$(CONFIG_I2C_IXP2000) += i2c-ixp2000.o |
| 21 | obj-$(CONFIG_I2C_IXP4XX) += i2c-ixp4xx.o | 21 | obj-$(CONFIG_I2C_IXP4XX) += i2c-ixp4xx.o |
| 22 | obj-$(CONFIG_I2C_POWERMAC) += i2c-powermac.o | 22 | obj-$(CONFIG_I2C_POWERMAC) += i2c-powermac.o |
| @@ -24,10 +24,12 @@ obj-$(CONFIG_I2C_MPC) += i2c-mpc.o | |||
| 24 | obj-$(CONFIG_I2C_MV64XXX) += i2c-mv64xxx.o | 24 | obj-$(CONFIG_I2C_MV64XXX) += i2c-mv64xxx.o |
| 25 | obj-$(CONFIG_I2C_NFORCE2) += i2c-nforce2.o | 25 | obj-$(CONFIG_I2C_NFORCE2) += i2c-nforce2.o |
| 26 | obj-$(CONFIG_I2C_OCORES) += i2c-ocores.o | 26 | obj-$(CONFIG_I2C_OCORES) += i2c-ocores.o |
| 27 | obj-$(CONFIG_I2C_OMAP) += i2c-omap.o | ||
| 27 | obj-$(CONFIG_I2C_PARPORT) += i2c-parport.o | 28 | obj-$(CONFIG_I2C_PARPORT) += i2c-parport.o |
| 28 | obj-$(CONFIG_I2C_PARPORT_LIGHT) += i2c-parport-light.o | 29 | obj-$(CONFIG_I2C_PARPORT_LIGHT) += i2c-parport-light.o |
| 29 | obj-$(CONFIG_I2C_PCA_ISA) += i2c-pca-isa.o | 30 | obj-$(CONFIG_I2C_PCA_ISA) += i2c-pca-isa.o |
| 30 | obj-$(CONFIG_I2C_PIIX4) += i2c-piix4.o | 31 | obj-$(CONFIG_I2C_PIIX4) += i2c-piix4.o |
| 32 | obj-$(CONFIG_I2C_PNX) += i2c-pnx.o | ||
| 31 | obj-$(CONFIG_I2C_PROSAVAGE) += i2c-prosavage.o | 33 | obj-$(CONFIG_I2C_PROSAVAGE) += i2c-prosavage.o |
| 32 | obj-$(CONFIG_I2C_PXA) += i2c-pxa.o | 34 | obj-$(CONFIG_I2C_PXA) += i2c-pxa.o |
| 33 | obj-$(CONFIG_I2C_RPXLITE) += i2c-rpx.o | 35 | obj-$(CONFIG_I2C_RPXLITE) += i2c-rpx.o |
| @@ -38,6 +40,7 @@ obj-$(CONFIG_I2C_SIS5595) += i2c-sis5595.o | |||
| 38 | obj-$(CONFIG_I2C_SIS630) += i2c-sis630.o | 40 | obj-$(CONFIG_I2C_SIS630) += i2c-sis630.o |
| 39 | obj-$(CONFIG_I2C_SIS96X) += i2c-sis96x.o | 41 | obj-$(CONFIG_I2C_SIS96X) += i2c-sis96x.o |
| 40 | obj-$(CONFIG_I2C_STUB) += i2c-stub.o | 42 | obj-$(CONFIG_I2C_STUB) += i2c-stub.o |
| 43 | obj-$(CONFIG_I2C_VERSATILE) += i2c-versatile.o | ||
| 41 | obj-$(CONFIG_I2C_VIA) += i2c-via.o | 44 | obj-$(CONFIG_I2C_VIA) += i2c-via.o |
| 42 | obj-$(CONFIG_I2C_VIAPRO) += i2c-viapro.o | 45 | obj-$(CONFIG_I2C_VIAPRO) += i2c-viapro.o |
| 43 | obj-$(CONFIG_I2C_VOODOO3) += i2c-voodoo3.o | 46 | obj-$(CONFIG_I2C_VOODOO3) += i2c-voodoo3.o |
diff --git a/drivers/i2c/busses/i2c-ali1535.c b/drivers/i2c/busses/i2c-ali1535.c index d3ef46aeeb3c..e75d339a3481 100644 --- a/drivers/i2c/busses/i2c-ali1535.c +++ b/drivers/i2c/busses/i2c-ali1535.c | |||
| @@ -468,7 +468,7 @@ static u32 ali1535_func(struct i2c_adapter *adapter) | |||
| 468 | I2C_FUNC_SMBUS_BLOCK_DATA; | 468 | I2C_FUNC_SMBUS_BLOCK_DATA; |
| 469 | } | 469 | } |
| 470 | 470 | ||
| 471 | static struct i2c_algorithm smbus_algorithm = { | 471 | static const struct i2c_algorithm smbus_algorithm = { |
| 472 | .smbus_xfer = ali1535_access, | 472 | .smbus_xfer = ali1535_access, |
| 473 | .functionality = ali1535_func, | 473 | .functionality = ali1535_func, |
| 474 | }; | 474 | }; |
diff --git a/drivers/i2c/busses/i2c-ali1563.c b/drivers/i2c/busses/i2c-ali1563.c index e6f63208fc4a..33fbb47100a3 100644 --- a/drivers/i2c/busses/i2c-ali1563.c +++ b/drivers/i2c/busses/i2c-ali1563.c | |||
| @@ -367,7 +367,7 @@ static void ali1563_shutdown(struct pci_dev *dev) | |||
| 367 | release_region(ali1563_smba,ALI1563_SMB_IOSIZE); | 367 | release_region(ali1563_smba,ALI1563_SMB_IOSIZE); |
| 368 | } | 368 | } |
| 369 | 369 | ||
| 370 | static struct i2c_algorithm ali1563_algorithm = { | 370 | static const struct i2c_algorithm ali1563_algorithm = { |
| 371 | .smbus_xfer = ali1563_access, | 371 | .smbus_xfer = ali1563_access, |
| 372 | .functionality = ali1563_func, | 372 | .functionality = ali1563_func, |
| 373 | }; | 373 | }; |
diff --git a/drivers/i2c/busses/i2c-ali15x3.c b/drivers/i2c/busses/i2c-ali15x3.c index 7a5c0941dbc1..3f11b6e1a341 100644 --- a/drivers/i2c/busses/i2c-ali15x3.c +++ b/drivers/i2c/busses/i2c-ali15x3.c | |||
| @@ -463,7 +463,7 @@ static u32 ali15x3_func(struct i2c_adapter *adapter) | |||
| 463 | I2C_FUNC_SMBUS_BLOCK_DATA; | 463 | I2C_FUNC_SMBUS_BLOCK_DATA; |
| 464 | } | 464 | } |
| 465 | 465 | ||
| 466 | static struct i2c_algorithm smbus_algorithm = { | 466 | static const struct i2c_algorithm smbus_algorithm = { |
| 467 | .smbus_xfer = ali15x3_access, | 467 | .smbus_xfer = ali15x3_access, |
| 468 | .functionality = ali15x3_func, | 468 | .functionality = ali15x3_func, |
| 469 | }; | 469 | }; |
diff --git a/drivers/i2c/busses/i2c-amd756.c b/drivers/i2c/busses/i2c-amd756.c index 1750dedaf4b5..2d21afdc5b1c 100644 --- a/drivers/i2c/busses/i2c-amd756.c +++ b/drivers/i2c/busses/i2c-amd756.c | |||
| @@ -294,7 +294,7 @@ static u32 amd756_func(struct i2c_adapter *adapter) | |||
| 294 | I2C_FUNC_SMBUS_BLOCK_DATA | I2C_FUNC_SMBUS_PROC_CALL; | 294 | I2C_FUNC_SMBUS_BLOCK_DATA | I2C_FUNC_SMBUS_PROC_CALL; |
| 295 | } | 295 | } |
| 296 | 296 | ||
| 297 | static struct i2c_algorithm smbus_algorithm = { | 297 | static const struct i2c_algorithm smbus_algorithm = { |
| 298 | .smbus_xfer = amd756_access, | 298 | .smbus_xfer = amd756_access, |
| 299 | .functionality = amd756_func, | 299 | .functionality = amd756_func, |
| 300 | }; | 300 | }; |
diff --git a/drivers/i2c/busses/i2c-amd8111.c b/drivers/i2c/busses/i2c-amd8111.c index e5ef560e686a..0fbc7186c91a 100644 --- a/drivers/i2c/busses/i2c-amd8111.c +++ b/drivers/i2c/busses/i2c-amd8111.c | |||
| @@ -316,7 +316,7 @@ static u32 amd8111_func(struct i2c_adapter *adapter) | |||
| 316 | I2C_FUNC_SMBUS_I2C_BLOCK | I2C_FUNC_SMBUS_HWPEC_CALC; | 316 | I2C_FUNC_SMBUS_I2C_BLOCK | I2C_FUNC_SMBUS_HWPEC_CALC; |
| 317 | } | 317 | } |
| 318 | 318 | ||
| 319 | static struct i2c_algorithm smbus_algorithm = { | 319 | static const struct i2c_algorithm smbus_algorithm = { |
| 320 | .smbus_xfer = amd8111_access, | 320 | .smbus_xfer = amd8111_access, |
| 321 | .functionality = amd8111_func, | 321 | .functionality = amd8111_func, |
| 322 | }; | 322 | }; |
diff --git a/drivers/i2c/busses/i2c-at91.c b/drivers/i2c/busses/i2c-at91.c new file mode 100644 index 000000000000..67f91bdda089 --- /dev/null +++ b/drivers/i2c/busses/i2c-at91.c | |||
| @@ -0,0 +1,325 @@ | |||
| 1 | /* | ||
| 2 | i2c Support for Atmel's AT91 Two-Wire Interface (TWI) | ||
| 3 | |||
| 4 | Copyright (C) 2004 Rick Bronson | ||
| 5 | Converted to 2.6 by Andrew Victor <andrew@sanpeople.com> | ||
| 6 | |||
| 7 | Borrowed heavily from original work by: | ||
| 8 | Copyright (C) 2000 Philip Edelbrock <phil@stimpy.netroedge.com> | ||
| 9 | |||
| 10 | This program is free software; you can redistribute it and/or modify | ||
| 11 | it under the terms of the GNU General Public License as published by | ||
| 12 | the Free Software Foundation; either version 2 of the License, or | ||
| 13 | (at your option) any later version. | ||
| 14 | */ | ||
| 15 | |||
| 16 | #include <linux/module.h> | ||
| 17 | #include <linux/version.h> | ||
| 18 | #include <linux/kernel.h> | ||
| 19 | #include <linux/slab.h> | ||
| 20 | #include <linux/pci.h> | ||
| 21 | #include <linux/types.h> | ||
| 22 | #include <linux/delay.h> | ||
| 23 | #include <linux/i2c.h> | ||
| 24 | #include <linux/init.h> | ||
| 25 | #include <linux/clk.h> | ||
| 26 | #include <linux/platform_device.h> | ||
| 27 | |||
| 28 | #include <asm/io.h> | ||
| 29 | |||
| 30 | #include <asm/arch/at91_twi.h> | ||
| 31 | #include <asm/arch/board.h> | ||
| 32 | #include <asm/arch/cpu.h> | ||
| 33 | |||
| 34 | #define TWI_CLOCK 100000 /* Hz. max 400 Kbits/sec */ | ||
| 35 | |||
| 36 | |||
| 37 | static struct clk *twi_clk; | ||
| 38 | static void __iomem *twi_base; | ||
| 39 | |||
| 40 | #define at91_twi_read(reg) __raw_readl(twi_base + (reg)) | ||
| 41 | #define at91_twi_write(reg, val) __raw_writel((val), twi_base + (reg)) | ||
| 42 | |||
| 43 | |||
| 44 | /* | ||
| 45 | * Initialize the TWI hardware registers. | ||
| 46 | */ | ||
| 47 | static void __devinit at91_twi_hwinit(void) | ||
| 48 | { | ||
| 49 | unsigned long cdiv, ckdiv; | ||
| 50 | |||
| 51 | at91_twi_write(AT91_TWI_IDR, 0xffffffff); /* Disable all interrupts */ | ||
| 52 | at91_twi_write(AT91_TWI_CR, AT91_TWI_SWRST); /* Reset peripheral */ | ||
| 53 | at91_twi_write(AT91_TWI_CR, AT91_TWI_MSEN); /* Set Master mode */ | ||
| 54 | |||
| 55 | /* Calcuate clock dividers */ | ||
| 56 | cdiv = (clk_get_rate(twi_clk) / (2 * TWI_CLOCK)) - 3; | ||
| 57 | cdiv = cdiv + 1; /* round up */ | ||
| 58 | ckdiv = 0; | ||
| 59 | while (cdiv > 255) { | ||
| 60 | ckdiv++; | ||
| 61 | cdiv = cdiv >> 1; | ||
| 62 | } | ||
| 63 | |||
| 64 | if (cpu_is_at91rm9200()) { /* AT91RM9200 Errata #22 */ | ||
| 65 | if (ckdiv > 5) { | ||
| 66 | printk(KERN_ERR "AT91 I2C: Invalid TWI_CLOCK value!\n"); | ||
| 67 | ckdiv = 5; | ||
| 68 | } | ||
| 69 | } | ||
| 70 | |||
| 71 | at91_twi_write(AT91_TWI_CWGR, (ckdiv << 16) | (cdiv << 8) | cdiv); | ||
| 72 | } | ||
| 73 | |||
| 74 | /* | ||
| 75 | * Poll the i2c status register until the specified bit is set. | ||
| 76 | * Returns 0 if timed out (100 msec). | ||
| 77 | */ | ||
| 78 | static short at91_poll_status(unsigned long bit) | ||
| 79 | { | ||
| 80 | int loop_cntr = 10000; | ||
| 81 | |||
| 82 | do { | ||
| 83 | udelay(10); | ||
| 84 | } while (!(at91_twi_read(AT91_TWI_SR) & bit) && (--loop_cntr > 0)); | ||
| 85 | |||
| 86 | return (loop_cntr > 0); | ||
| 87 | } | ||
| 88 | |||
| 89 | static int xfer_read(struct i2c_adapter *adap, unsigned char *buf, int length) | ||
| 90 | { | ||
| 91 | /* Send Start */ | ||
| 92 | at91_twi_write(AT91_TWI_CR, AT91_TWI_START); | ||
| 93 | |||
| 94 | /* Read data */ | ||
| 95 | while (length--) { | ||
| 96 | if (!length) /* need to send Stop before reading last byte */ | ||
| 97 | at91_twi_write(AT91_TWI_CR, AT91_TWI_STOP); | ||
| 98 | if (!at91_poll_status(AT91_TWI_RXRDY)) { | ||
| 99 | dev_dbg(&adap->dev, "RXRDY timeout\n"); | ||
| 100 | return -ETIMEDOUT; | ||
| 101 | } | ||
| 102 | *buf++ = (at91_twi_read(AT91_TWI_RHR) & 0xff); | ||
| 103 | } | ||
| 104 | |||
| 105 | return 0; | ||
| 106 | } | ||
| 107 | |||
| 108 | static int xfer_write(struct i2c_adapter *adap, unsigned char *buf, int length) | ||
| 109 | { | ||
| 110 | /* Load first byte into transmitter */ | ||
| 111 | at91_twi_write(AT91_TWI_THR, *buf++); | ||
| 112 | |||
| 113 | /* Send Start */ | ||
| 114 | at91_twi_write(AT91_TWI_CR, AT91_TWI_START); | ||
| 115 | |||
| 116 | do { | ||
| 117 | if (!at91_poll_status(AT91_TWI_TXRDY)) { | ||
| 118 | dev_dbg(&adap->dev, "TXRDY timeout\n"); | ||
| 119 | return -ETIMEDOUT; | ||
| 120 | } | ||
| 121 | |||
| 122 | length--; /* byte was transmitted */ | ||
| 123 | |||
| 124 | if (length > 0) /* more data to send? */ | ||
| 125 | at91_twi_write(AT91_TWI_THR, *buf++); | ||
| 126 | } while (length); | ||
| 127 | |||
| 128 | /* Send Stop */ | ||
| 129 | at91_twi_write(AT91_TWI_CR, AT91_TWI_STOP); | ||
| 130 | |||
| 131 | return 0; | ||
| 132 | } | ||
| 133 | |||
| 134 | /* | ||
| 135 | * Generic i2c master transfer entrypoint. | ||
| 136 | * | ||
| 137 | * Note: We do not use Atmel's feature of storing the "internal device address". | ||
| 138 | * Instead the "internal device address" has to be written using a seperate | ||
| 139 | * i2c message. | ||
| 140 | * http://lists.arm.linux.org.uk/pipermail/linux-arm-kernel/2004-September/024411.html | ||
| 141 | */ | ||
| 142 | static int at91_xfer(struct i2c_adapter *adap, struct i2c_msg *pmsg, int num) | ||
| 143 | { | ||
| 144 | int i, ret; | ||
| 145 | |||
| 146 | dev_dbg(&adap->dev, "at91_xfer: processing %d messages:\n", num); | ||
| 147 | |||
| 148 | for (i = 0; i < num; i++) { | ||
| 149 | dev_dbg(&adap->dev, " #%d: %sing %d byte%s %s 0x%02x\n", i, | ||
| 150 | pmsg->flags & I2C_M_RD ? "read" : "writ", | ||
| 151 | pmsg->len, pmsg->len > 1 ? "s" : "", | ||
| 152 | pmsg->flags & I2C_M_RD ? "from" : "to", pmsg->addr); | ||
| 153 | |||
| 154 | at91_twi_write(AT91_TWI_MMR, (pmsg->addr << 16) | ||
| 155 | | ((pmsg->flags & I2C_M_RD) ? AT91_TWI_MREAD : 0)); | ||
| 156 | |||
| 157 | if (pmsg->len && pmsg->buf) { /* sanity check */ | ||
| 158 | if (pmsg->flags & I2C_M_RD) | ||
| 159 | ret = xfer_read(adap, pmsg->buf, pmsg->len); | ||
| 160 | else | ||
| 161 | ret = xfer_write(adap, pmsg->buf, pmsg->len); | ||
| 162 | |||
| 163 | if (ret) | ||
| 164 | return ret; | ||
| 165 | |||
| 166 | /* Wait until transfer is finished */ | ||
| 167 | if (!at91_poll_status(AT91_TWI_TXCOMP)) { | ||
| 168 | dev_dbg(&adap->dev, "TXCOMP timeout\n"); | ||
| 169 | return -ETIMEDOUT; | ||
| 170 | } | ||
| 171 | } | ||
| 172 | dev_dbg(&adap->dev, "transfer complete\n"); | ||
| 173 | pmsg++; /* next message */ | ||
| 174 | } | ||
| 175 | return i; | ||
| 176 | } | ||
| 177 | |||
| 178 | /* | ||
| 179 | * Return list of supported functionality. | ||
| 180 | */ | ||
| 181 | static u32 at91_func(struct i2c_adapter *adapter) | ||
| 182 | { | ||
| 183 | return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL; | ||
| 184 | } | ||
| 185 | |||
| 186 | static struct i2c_algorithm at91_algorithm = { | ||
| 187 | .master_xfer = at91_xfer, | ||
| 188 | .functionality = at91_func, | ||
| 189 | }; | ||
| 190 | |||
| 191 | /* | ||
| 192 | * Main initialization routine. | ||
| 193 | */ | ||
| 194 | static int __devinit at91_i2c_probe(struct platform_device *pdev) | ||
| 195 | { | ||
| 196 | struct i2c_adapter *adapter; | ||
| 197 | struct resource *res; | ||
| 198 | int rc; | ||
| 199 | |||
| 200 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
| 201 | if (!res) | ||
| 202 | return -ENXIO; | ||
| 203 | |||
| 204 | if (!request_mem_region(res->start, res->end - res->start + 1, "at91_i2c")) | ||
| 205 | return -EBUSY; | ||
| 206 | |||
| 207 | twi_base = ioremap(res->start, res->end - res->start + 1); | ||
| 208 | if (!twi_base) { | ||
| 209 | rc = -ENOMEM; | ||
| 210 | goto fail0; | ||
| 211 | } | ||
| 212 | |||
| 213 | twi_clk = clk_get(NULL, "twi_clk"); | ||
| 214 | if (IS_ERR(twi_clk)) { | ||
| 215 | dev_err(&pdev->dev, "no clock defined\n"); | ||
| 216 | rc = -ENODEV; | ||
| 217 | goto fail1; | ||
| 218 | } | ||
| 219 | |||
| 220 | adapter = kzalloc(sizeof(struct i2c_adapter), GFP_KERNEL); | ||
| 221 | if (adapter == NULL) { | ||
| 222 | dev_err(&pdev->dev, "can't allocate inteface!\n"); | ||
| 223 | rc = -ENOMEM; | ||
| 224 | goto fail2; | ||
| 225 | } | ||
| 226 | sprintf(adapter->name, "AT91"); | ||
| 227 | adapter->algo = &at91_algorithm; | ||
| 228 | adapter->class = I2C_CLASS_HWMON; | ||
| 229 | adapter->dev.parent = &pdev->dev; | ||
| 230 | |||
| 231 | platform_set_drvdata(pdev, adapter); | ||
| 232 | |||
| 233 | clk_enable(twi_clk); /* enable peripheral clock */ | ||
| 234 | at91_twi_hwinit(); /* initialize TWI controller */ | ||
| 235 | |||
| 236 | rc = i2c_add_adapter(adapter); | ||
| 237 | if (rc) { | ||
| 238 | dev_err(&pdev->dev, "Adapter %s registration failed\n", | ||
| 239 | adapter->name); | ||
| 240 | goto fail3; | ||
| 241 | } | ||
| 242 | |||
| 243 | dev_info(&pdev->dev, "AT91 i2c bus driver.\n"); | ||
| 244 | return 0; | ||
| 245 | |||
| 246 | fail3: | ||
| 247 | platform_set_drvdata(pdev, NULL); | ||
| 248 | kfree(adapter); | ||
| 249 | clk_disable(twi_clk); | ||
| 250 | fail2: | ||
| 251 | clk_put(twi_clk); | ||
| 252 | fail1: | ||
| 253 | iounmap(twi_base); | ||
| 254 | fail0: | ||
| 255 | release_mem_region(res->start, res->end - res->start + 1); | ||
| 256 | |||
| 257 | return rc; | ||
| 258 | } | ||
| 259 | |||
| 260 | static int __devexit at91_i2c_remove(struct platform_device *pdev) | ||
| 261 | { | ||
| 262 | struct i2c_adapter *adapter = platform_get_drvdata(pdev); | ||
| 263 | struct resource *res; | ||
| 264 | int rc; | ||
| 265 | |||
| 266 | rc = i2c_del_adapter(adapter); | ||
| 267 | platform_set_drvdata(pdev, NULL); | ||
| 268 | |||
| 269 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
| 270 | iounmap(twi_base); | ||
| 271 | release_mem_region(res->start, res->end - res->start + 1); | ||
| 272 | |||
| 273 | clk_disable(twi_clk); /* disable peripheral clock */ | ||
| 274 | clk_put(twi_clk); | ||
| 275 | |||
| 276 | return rc; | ||
| 277 | } | ||
| 278 | |||
| 279 | #ifdef CONFIG_PM | ||
| 280 | |||
| 281 | /* NOTE: could save a few mA by keeping clock off outside of at91_xfer... */ | ||
| 282 | |||
| 283 | static int at91_i2c_suspend(struct platform_device *pdev, pm_message_t mesg) | ||
| 284 | { | ||
| 285 | clk_disable(twi_clk); | ||
| 286 | return 0; | ||
| 287 | } | ||
| 288 | |||
| 289 | static int at91_i2c_resume(struct platform_device *pdev) | ||
| 290 | { | ||
| 291 | return clk_enable(twi_clk); | ||
| 292 | } | ||
| 293 | |||
| 294 | #else | ||
| 295 | #define at91_i2c_suspend NULL | ||
| 296 | #define at91_i2c_resume NULL | ||
| 297 | #endif | ||
| 298 | |||
| 299 | static struct platform_driver at91_i2c_driver = { | ||
| 300 | .probe = at91_i2c_probe, | ||
| 301 | .remove = __devexit_p(at91_i2c_remove), | ||
| 302 | .suspend = at91_i2c_suspend, | ||
| 303 | .resume = at91_i2c_resume, | ||
| 304 | .driver = { | ||
| 305 | .name = "at91_i2c", | ||
| 306 | .owner = THIS_MODULE, | ||
| 307 | }, | ||
| 308 | }; | ||
| 309 | |||
| 310 | static int __init at91_i2c_init(void) | ||
| 311 | { | ||
| 312 | return platform_driver_register(&at91_i2c_driver); | ||
| 313 | } | ||
| 314 | |||
| 315 | static void __exit at91_i2c_exit(void) | ||
| 316 | { | ||
| 317 | platform_driver_unregister(&at91_i2c_driver); | ||
| 318 | } | ||
| 319 | |||
| 320 | module_init(at91_i2c_init); | ||
| 321 | module_exit(at91_i2c_exit); | ||
| 322 | |||
| 323 | MODULE_AUTHOR("Rick Bronson"); | ||
| 324 | MODULE_DESCRIPTION("I2C (TWI) driver for Atmel AT91"); | ||
| 325 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/i2c/busses/i2c-au1550.c b/drivers/i2c/busses/i2c-au1550.c index d06edce03bf4..d7e7c359fc36 100644 --- a/drivers/i2c/busses/i2c-au1550.c +++ b/drivers/i2c/busses/i2c-au1550.c | |||
| @@ -34,8 +34,7 @@ | |||
| 34 | #include <linux/errno.h> | 34 | #include <linux/errno.h> |
| 35 | #include <linux/i2c.h> | 35 | #include <linux/i2c.h> |
| 36 | 36 | ||
| 37 | #include <asm/mach-au1x00/au1000.h> | 37 | #include <asm/mach-au1x00/au1xxx.h> |
| 38 | #include <asm/mach-pb1x00/pb1550.h> | ||
| 39 | #include <asm/mach-au1x00/au1xxx_psc.h> | 38 | #include <asm/mach-au1x00/au1xxx_psc.h> |
| 40 | 39 | ||
| 41 | #include "i2c-au1550.h" | 40 | #include "i2c-au1550.h" |
| @@ -118,13 +117,19 @@ do_address(struct i2c_au1550_data *adap, unsigned int addr, int rd) | |||
| 118 | 117 | ||
| 119 | /* Reset the FIFOs, clear events. | 118 | /* Reset the FIFOs, clear events. |
| 120 | */ | 119 | */ |
| 121 | sp->psc_smbpcr = PSC_SMBPCR_DC; | 120 | stat = sp->psc_smbstat; |
| 122 | sp->psc_smbevnt = PSC_SMBEVNT_ALLCLR; | 121 | sp->psc_smbevnt = PSC_SMBEVNT_ALLCLR; |
| 123 | au_sync(); | 122 | au_sync(); |
| 124 | do { | 123 | |
| 125 | stat = sp->psc_smbpcr; | 124 | if (!(stat & PSC_SMBSTAT_TE) || !(stat & PSC_SMBSTAT_RE)) { |
| 125 | sp->psc_smbpcr = PSC_SMBPCR_DC; | ||
| 126 | au_sync(); | 126 | au_sync(); |
| 127 | } while ((stat & PSC_SMBPCR_DC) != 0); | 127 | do { |
| 128 | stat = sp->psc_smbpcr; | ||
| 129 | au_sync(); | ||
| 130 | } while ((stat & PSC_SMBPCR_DC) != 0); | ||
| 131 | udelay(50); | ||
| 132 | } | ||
| 128 | 133 | ||
| 129 | /* Write out the i2c chip address and specify operation | 134 | /* Write out the i2c chip address and specify operation |
| 130 | */ | 135 | */ |
| @@ -279,10 +284,10 @@ au1550_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg *msgs, int num) | |||
| 279 | static u32 | 284 | static u32 |
| 280 | au1550_func(struct i2c_adapter *adap) | 285 | au1550_func(struct i2c_adapter *adap) |
| 281 | { | 286 | { |
| 282 | return I2C_FUNC_I2C; | 287 | return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL; |
| 283 | } | 288 | } |
| 284 | 289 | ||
| 285 | static struct i2c_algorithm au1550_algo = { | 290 | static const struct i2c_algorithm au1550_algo = { |
| 286 | .master_xfer = au1550_xfer, | 291 | .master_xfer = au1550_xfer, |
| 287 | .functionality = au1550_func, | 292 | .functionality = au1550_func, |
| 288 | }; | 293 | }; |
diff --git a/drivers/i2c/busses/i2c-elektor.c b/drivers/i2c/busses/i2c-elektor.c index 59f8308c2356..834967464814 100644 --- a/drivers/i2c/busses/i2c-elektor.c +++ b/drivers/i2c/busses/i2c-elektor.c | |||
| @@ -131,7 +131,7 @@ static void pcf_isa_waitforpin(void) { | |||
| 131 | } | 131 | } |
| 132 | 132 | ||
| 133 | 133 | ||
| 134 | static irqreturn_t pcf_isa_handler(int this_irq, void *dev_id, struct pt_regs *regs) { | 134 | static irqreturn_t pcf_isa_handler(int this_irq, void *dev_id) { |
| 135 | spin_lock(&lock); | 135 | spin_lock(&lock); |
| 136 | pcf_pending = 1; | 136 | pcf_pending = 1; |
| 137 | spin_unlock(&lock); | 137 | spin_unlock(&lock); |
| @@ -196,7 +196,6 @@ static struct i2c_algo_pcf_data pcf_isa_data = { | |||
| 196 | .getclock = pcf_isa_getclock, | 196 | .getclock = pcf_isa_getclock, |
| 197 | .waitforpin = pcf_isa_waitforpin, | 197 | .waitforpin = pcf_isa_waitforpin, |
| 198 | .udelay = 10, | 198 | .udelay = 10, |
| 199 | .mdelay = 10, | ||
| 200 | .timeout = 100, | 199 | .timeout = 100, |
| 201 | }; | 200 | }; |
| 202 | 201 | ||
| @@ -294,7 +293,7 @@ static int __init i2c_pcfisa_init(void) | |||
| 294 | 293 | ||
| 295 | static void i2c_pcfisa_exit(void) | 294 | static void i2c_pcfisa_exit(void) |
| 296 | { | 295 | { |
| 297 | i2c_pcf_del_bus(&pcf_isa_ops); | 296 | i2c_del_adapter(&pcf_isa_ops); |
| 298 | 297 | ||
| 299 | if (irq > 0) { | 298 | if (irq > 0) { |
| 300 | disable_irq(irq); | 299 | disable_irq(irq); |
diff --git a/drivers/i2c/busses/i2c-hydra.c b/drivers/i2c/busses/i2c-hydra.c index e0cb3b0f92fa..9832f773651d 100644 --- a/drivers/i2c/busses/i2c-hydra.c +++ b/drivers/i2c/busses/i2c-hydra.c | |||
| @@ -99,7 +99,6 @@ static struct i2c_algo_bit_data hydra_bit_data = { | |||
| 99 | .getsda = hydra_bit_getsda, | 99 | .getsda = hydra_bit_getsda, |
| 100 | .getscl = hydra_bit_getscl, | 100 | .getscl = hydra_bit_getscl, |
| 101 | .udelay = 5, | 101 | .udelay = 5, |
| 102 | .mdelay = 5, | ||
| 103 | .timeout = HZ | 102 | .timeout = HZ |
| 104 | }; | 103 | }; |
| 105 | 104 | ||
| @@ -147,7 +146,7 @@ static int __devinit hydra_probe(struct pci_dev *dev, | |||
| 147 | static void __devexit hydra_remove(struct pci_dev *dev) | 146 | static void __devexit hydra_remove(struct pci_dev *dev) |
| 148 | { | 147 | { |
| 149 | pdregw(hydra_bit_data.data, 0); /* clear SCLK_OE and SDAT_OE */ | 148 | pdregw(hydra_bit_data.data, 0); /* clear SCLK_OE and SDAT_OE */ |
| 150 | i2c_bit_del_bus(&hydra_adap); | 149 | i2c_del_adapter(&hydra_adap); |
| 151 | iounmap(hydra_bit_data.data); | 150 | iounmap(hydra_bit_data.data); |
| 152 | release_mem_region(pci_resource_start(dev, 0)+ | 151 | release_mem_region(pci_resource_start(dev, 0)+ |
| 153 | offsetof(struct Hydra, CachePD), 4); | 152 | offsetof(struct Hydra, CachePD), 4); |
diff --git a/drivers/i2c/busses/i2c-i801.c b/drivers/i2c/busses/i2c-i801.c index 7be1d0a3e8f8..ae625b854470 100644 --- a/drivers/i2c/busses/i2c-i801.c +++ b/drivers/i2c/busses/i2c-i801.c | |||
| @@ -33,6 +33,7 @@ | |||
| 33 | ICH7 27DA | 33 | ICH7 27DA |
| 34 | ESB2 269B | 34 | ESB2 269B |
| 35 | ICH8 283E | 35 | ICH8 283E |
| 36 | ICH9 2930 | ||
| 36 | This driver supports several versions of Intel's I/O Controller Hubs (ICH). | 37 | This driver supports several versions of Intel's I/O Controller Hubs (ICH). |
| 37 | For SMBus support, they are similar to the PIIX4 and are part | 38 | For SMBus support, they are similar to the PIIX4 and are part |
| 38 | of Intel's '810' and other chipsets. | 39 | of Intel's '810' and other chipsets. |
| @@ -434,7 +435,7 @@ static u32 i801_func(struct i2c_adapter *adapter) | |||
| 434 | | (isich4 ? I2C_FUNC_SMBUS_HWPEC_CALC : 0); | 435 | | (isich4 ? I2C_FUNC_SMBUS_HWPEC_CALC : 0); |
| 435 | } | 436 | } |
| 436 | 437 | ||
| 437 | static struct i2c_algorithm smbus_algorithm = { | 438 | static const struct i2c_algorithm smbus_algorithm = { |
| 438 | .smbus_xfer = i801_access, | 439 | .smbus_xfer = i801_access, |
| 439 | .functionality = i801_func, | 440 | .functionality = i801_func, |
| 440 | }; | 441 | }; |
| @@ -457,6 +458,7 @@ static struct pci_device_id i801_ids[] = { | |||
| 457 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH7_17) }, | 458 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH7_17) }, |
| 458 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ESB2_17) }, | 459 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ESB2_17) }, |
| 459 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH8_5) }, | 460 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH8_5) }, |
| 461 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH9_6) }, | ||
| 460 | { 0, } | 462 | { 0, } |
| 461 | }; | 463 | }; |
| 462 | 464 | ||
| @@ -468,12 +470,20 @@ static int __devinit i801_probe(struct pci_dev *dev, const struct pci_device_id | |||
| 468 | int err; | 470 | int err; |
| 469 | 471 | ||
| 470 | I801_dev = dev; | 472 | I801_dev = dev; |
| 471 | if ((dev->device == PCI_DEVICE_ID_INTEL_82801DB_3) || | 473 | switch (dev->device) { |
| 472 | (dev->device == PCI_DEVICE_ID_INTEL_82801EB_3) || | 474 | case PCI_DEVICE_ID_INTEL_82801DB_3: |
| 473 | (dev->device == PCI_DEVICE_ID_INTEL_ESB_4)) | 475 | case PCI_DEVICE_ID_INTEL_82801EB_3: |
| 476 | case PCI_DEVICE_ID_INTEL_ESB_4: | ||
| 477 | case PCI_DEVICE_ID_INTEL_ICH6_16: | ||
| 478 | case PCI_DEVICE_ID_INTEL_ICH7_17: | ||
| 479 | case PCI_DEVICE_ID_INTEL_ESB2_17: | ||
| 480 | case PCI_DEVICE_ID_INTEL_ICH8_5: | ||
| 481 | case PCI_DEVICE_ID_INTEL_ICH9_6: | ||
| 474 | isich4 = 1; | 482 | isich4 = 1; |
| 475 | else | 483 | break; |
| 484 | default: | ||
| 476 | isich4 = 0; | 485 | isich4 = 0; |
| 486 | } | ||
| 477 | 487 | ||
| 478 | err = pci_enable_device(dev); | 488 | err = pci_enable_device(dev); |
| 479 | if (err) { | 489 | if (err) { |
diff --git a/drivers/i2c/busses/i2c-i810.c b/drivers/i2c/busses/i2c-i810.c index 748be30f2bae..10c98bc88aa6 100644 --- a/drivers/i2c/busses/i2c-i810.c +++ b/drivers/i2c/busses/i2c-i810.c | |||
| @@ -166,7 +166,6 @@ static struct i2c_algo_bit_data i810_i2c_bit_data = { | |||
| 166 | .getsda = bit_i810i2c_getsda, | 166 | .getsda = bit_i810i2c_getsda, |
| 167 | .getscl = bit_i810i2c_getscl, | 167 | .getscl = bit_i810i2c_getscl, |
| 168 | .udelay = CYCLE_DELAY, | 168 | .udelay = CYCLE_DELAY, |
| 169 | .mdelay = CYCLE_DELAY, | ||
| 170 | .timeout = TIMEOUT, | 169 | .timeout = TIMEOUT, |
| 171 | }; | 170 | }; |
| 172 | 171 | ||
| @@ -182,7 +181,6 @@ static struct i2c_algo_bit_data i810_ddc_bit_data = { | |||
| 182 | .getsda = bit_i810ddc_getsda, | 181 | .getsda = bit_i810ddc_getsda, |
| 183 | .getscl = bit_i810ddc_getscl, | 182 | .getscl = bit_i810ddc_getscl, |
| 184 | .udelay = CYCLE_DELAY, | 183 | .udelay = CYCLE_DELAY, |
| 185 | .mdelay = CYCLE_DELAY, | ||
| 186 | .timeout = TIMEOUT, | 184 | .timeout = TIMEOUT, |
| 187 | }; | 185 | }; |
| 188 | 186 | ||
| @@ -221,14 +219,14 @@ static int __devinit i810_probe(struct pci_dev *dev, const struct pci_device_id | |||
| 221 | return retval; | 219 | return retval; |
| 222 | retval = i2c_bit_add_bus(&i810_ddc_adapter); | 220 | retval = i2c_bit_add_bus(&i810_ddc_adapter); |
| 223 | if (retval) | 221 | if (retval) |
| 224 | i2c_bit_del_bus(&i810_i2c_adapter); | 222 | i2c_del_adapter(&i810_i2c_adapter); |
| 225 | return retval; | 223 | return retval; |
| 226 | } | 224 | } |
| 227 | 225 | ||
| 228 | static void __devexit i810_remove(struct pci_dev *dev) | 226 | static void __devexit i810_remove(struct pci_dev *dev) |
| 229 | { | 227 | { |
| 230 | i2c_bit_del_bus(&i810_ddc_adapter); | 228 | i2c_del_adapter(&i810_ddc_adapter); |
| 231 | i2c_bit_del_bus(&i810_i2c_adapter); | 229 | i2c_del_adapter(&i810_i2c_adapter); |
| 232 | iounmap(ioaddr); | 230 | iounmap(ioaddr); |
| 233 | } | 231 | } |
| 234 | 232 | ||
diff --git a/drivers/i2c/busses/i2c-ibm_iic.c b/drivers/i2c/busses/i2c-ibm_iic.c index 0599bbd65d93..1898e9987021 100644 --- a/drivers/i2c/busses/i2c-ibm_iic.c +++ b/drivers/i2c/busses/i2c-ibm_iic.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * drivers/i2c/i2c-ibm_iic.c | 2 | * drivers/i2c/busses/i2c-ibm_iic.c |
| 3 | * | 3 | * |
| 4 | * Support for the IIC peripheral on IBM PPC 4xx | 4 | * Support for the IIC peripheral on IBM PPC 4xx |
| 5 | * | 5 | * |
| @@ -320,7 +320,7 @@ err: | |||
| 320 | /* | 320 | /* |
| 321 | * IIC interrupt handler | 321 | * IIC interrupt handler |
| 322 | */ | 322 | */ |
| 323 | static irqreturn_t iic_handler(int irq, void *dev_id, struct pt_regs *regs) | 323 | static irqreturn_t iic_handler(int irq, void *dev_id) |
| 324 | { | 324 | { |
| 325 | struct ibm_iic_private* dev = (struct ibm_iic_private*)dev_id; | 325 | struct ibm_iic_private* dev = (struct ibm_iic_private*)dev_id; |
| 326 | volatile struct iic_regs __iomem *iic = dev->vaddr; | 326 | volatile struct iic_regs __iomem *iic = dev->vaddr; |
| @@ -625,7 +625,7 @@ static u32 iic_func(struct i2c_adapter *adap) | |||
| 625 | return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL | I2C_FUNC_10BIT_ADDR; | 625 | return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL | I2C_FUNC_10BIT_ADDR; |
| 626 | } | 626 | } |
| 627 | 627 | ||
| 628 | static struct i2c_algorithm iic_algo = { | 628 | static const struct i2c_algorithm iic_algo = { |
| 629 | .master_xfer = iic_xfer, | 629 | .master_xfer = iic_xfer, |
| 630 | .functionality = iic_func | 630 | .functionality = iic_func |
| 631 | }; | 631 | }; |
| @@ -680,6 +680,12 @@ static int __devinit iic_probe(struct ocp_device *ocp){ | |||
| 680 | dev->idx = ocp->def->index; | 680 | dev->idx = ocp->def->index; |
| 681 | ocp_set_drvdata(ocp, dev); | 681 | ocp_set_drvdata(ocp, dev); |
| 682 | 682 | ||
| 683 | if (!request_mem_region(ocp->def->paddr, sizeof(struct iic_regs), | ||
| 684 | "ibm_iic")) { | ||
| 685 | ret = -EBUSY; | ||
| 686 | goto fail1; | ||
| 687 | } | ||
| 688 | |||
| 683 | if (!(dev->vaddr = ioremap(ocp->def->paddr, sizeof(struct iic_regs)))){ | 689 | if (!(dev->vaddr = ioremap(ocp->def->paddr, sizeof(struct iic_regs)))){ |
| 684 | printk(KERN_CRIT "ibm-iic%d: failed to ioremap device registers\n", | 690 | printk(KERN_CRIT "ibm-iic%d: failed to ioremap device registers\n", |
| 685 | dev->idx); | 691 | dev->idx); |
| @@ -750,6 +756,8 @@ fail: | |||
| 750 | 756 | ||
| 751 | iounmap(dev->vaddr); | 757 | iounmap(dev->vaddr); |
| 752 | fail2: | 758 | fail2: |
| 759 | release_mem_region(ocp->def->paddr, sizeof(struct iic_regs)); | ||
| 760 | fail1: | ||
| 753 | ocp_set_drvdata(ocp, NULL); | 761 | ocp_set_drvdata(ocp, NULL); |
| 754 | kfree(dev); | 762 | kfree(dev); |
| 755 | return ret; | 763 | return ret; |
| @@ -777,6 +785,7 @@ static void __devexit iic_remove(struct ocp_device *ocp) | |||
| 777 | free_irq(dev->irq, dev); | 785 | free_irq(dev->irq, dev); |
| 778 | } | 786 | } |
| 779 | iounmap(dev->vaddr); | 787 | iounmap(dev->vaddr); |
| 788 | release_mem_region(ocp->def->paddr, sizeof(struct iic_regs)); | ||
| 780 | kfree(dev); | 789 | kfree(dev); |
| 781 | } | 790 | } |
| 782 | } | 791 | } |
diff --git a/drivers/i2c/busses/i2c-ibm_iic.h b/drivers/i2c/busses/i2c-ibm_iic.h index 2b3219d00e92..59d7b437f7ff 100644 --- a/drivers/i2c/busses/i2c-ibm_iic.h +++ b/drivers/i2c/busses/i2c-ibm_iic.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * drivers/i2c/i2c-ibm_iic.h | 2 | * drivers/i2c/busses/i2c-ibm_iic.h |
| 3 | * | 3 | * |
| 4 | * Support for the IIC peripheral on IBM PPC 4xx | 4 | * Support for the IIC peripheral on IBM PPC 4xx |
| 5 | * | 5 | * |
diff --git a/drivers/i2c/busses/i2c-iop3xx.c b/drivers/i2c/busses/i2c-iop3xx.c index 48c56939c861..d108ab4974cc 100644 --- a/drivers/i2c/busses/i2c-iop3xx.c +++ b/drivers/i2c/busses/i2c-iop3xx.c | |||
| @@ -82,14 +82,16 @@ iop3xx_i2c_enable(struct i2c_algo_iop3xx_data *iop3xx_adap) | |||
| 82 | 82 | ||
| 83 | /* | 83 | /* |
| 84 | * Every time unit enable is asserted, GPOD needs to be cleared | 84 | * Every time unit enable is asserted, GPOD needs to be cleared |
| 85 | * on IOP321 to avoid data corruption on the bus. | 85 | * on IOP3XX to avoid data corruption on the bus. |
| 86 | */ | 86 | */ |
| 87 | #ifdef CONFIG_ARCH_IOP321 | 87 | #ifdef CONFIG_PLAT_IOP |
| 88 | #define IOP321_GPOD_I2C0 0x00c0 /* clear these bits to enable ch0 */ | 88 | if (iop3xx_adap->id == 0) { |
| 89 | #define IOP321_GPOD_I2C1 0x0030 /* clear these bits to enable ch1 */ | 89 | gpio_line_set(IOP3XX_GPIO_LINE(7), GPIO_LOW); |
| 90 | 90 | gpio_line_set(IOP3XX_GPIO_LINE(6), GPIO_LOW); | |
| 91 | *IOP321_GPOD &= (iop3xx_adap->id == 0) ? ~IOP321_GPOD_I2C0 : | 91 | } else { |
| 92 | ~IOP321_GPOD_I2C1; | 92 | gpio_line_set(IOP3XX_GPIO_LINE(5), GPIO_LOW); |
| 93 | gpio_line_set(IOP3XX_GPIO_LINE(4), GPIO_LOW); | ||
| 94 | } | ||
| 93 | #endif | 95 | #endif |
| 94 | /* NB SR bits not same position as CR IE bits :-( */ | 96 | /* NB SR bits not same position as CR IE bits :-( */ |
| 95 | iop3xx_adap->SR_enabled = | 97 | iop3xx_adap->SR_enabled = |
| @@ -118,7 +120,7 @@ iop3xx_i2c_transaction_cleanup(struct i2c_algo_iop3xx_data *iop3xx_adap) | |||
| 118 | * Then it passes the SR flags of interest to BH via adap data | 120 | * Then it passes the SR flags of interest to BH via adap data |
| 119 | */ | 121 | */ |
| 120 | static irqreturn_t | 122 | static irqreturn_t |
| 121 | iop3xx_i2c_irq_handler(int this_irq, void *dev_id, struct pt_regs *regs) | 123 | iop3xx_i2c_irq_handler(int this_irq, void *dev_id) |
| 122 | { | 124 | { |
| 123 | struct i2c_algo_iop3xx_data *iop3xx_adap = dev_id; | 125 | struct i2c_algo_iop3xx_data *iop3xx_adap = dev_id; |
| 124 | u32 sr = __raw_readl(iop3xx_adap->ioaddr + SR_OFFSET); | 126 | u32 sr = __raw_readl(iop3xx_adap->ioaddr + SR_OFFSET); |
| @@ -401,7 +403,7 @@ iop3xx_i2c_func(struct i2c_adapter *adap) | |||
| 401 | return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL; | 403 | return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL; |
| 402 | } | 404 | } |
| 403 | 405 | ||
| 404 | static struct i2c_algorithm iop3xx_i2c_algo = { | 406 | static const struct i2c_algorithm iop3xx_i2c_algo = { |
| 405 | .master_xfer = iop3xx_i2c_master_xfer, | 407 | .master_xfer = iop3xx_i2c_master_xfer, |
| 406 | .algo_control = iop3xx_i2c_algo_control, | 408 | .algo_control = iop3xx_i2c_algo_control, |
| 407 | .functionality = iop3xx_i2c_func, | 409 | .functionality = iop3xx_i2c_func, |
diff --git a/drivers/i2c/busses/i2c-isa.c b/drivers/i2c/busses/i2c-isa.c index c3e1d3e888d7..8ed59a2dff53 100644 --- a/drivers/i2c/busses/i2c-isa.c +++ b/drivers/i2c/busses/i2c-isa.c | |||
| @@ -43,7 +43,7 @@ | |||
| 43 | static u32 isa_func(struct i2c_adapter *adapter); | 43 | static u32 isa_func(struct i2c_adapter *adapter); |
| 44 | 44 | ||
| 45 | /* This is the actual algorithm we define */ | 45 | /* This is the actual algorithm we define */ |
| 46 | static struct i2c_algorithm isa_algorithm = { | 46 | static const struct i2c_algorithm isa_algorithm = { |
| 47 | .functionality = isa_func, | 47 | .functionality = isa_func, |
| 48 | }; | 48 | }; |
| 49 | 49 | ||
| @@ -89,9 +89,14 @@ int i2c_isa_add_driver(struct i2c_driver *driver) | |||
| 89 | dev_dbg(&isa_adapter.dev, "Driver %s registered\n", driver->driver.name); | 89 | dev_dbg(&isa_adapter.dev, "Driver %s registered\n", driver->driver.name); |
| 90 | 90 | ||
| 91 | /* Now look for clients */ | 91 | /* Now look for clients */ |
| 92 | driver->attach_adapter(&isa_adapter); | 92 | res = driver->attach_adapter(&isa_adapter); |
| 93 | 93 | if (res) { | |
| 94 | return 0; | 94 | dev_dbg(&isa_adapter.dev, |
| 95 | "Driver %s failed to attach adapter, unregistering\n", | ||
| 96 | driver->driver.name); | ||
| 97 | driver_unregister(&driver->driver); | ||
| 98 | } | ||
| 99 | return res; | ||
| 95 | } | 100 | } |
| 96 | 101 | ||
| 97 | int i2c_isa_del_driver(struct i2c_driver *driver) | 102 | int i2c_isa_del_driver(struct i2c_driver *driver) |
| @@ -125,6 +130,8 @@ int i2c_isa_del_driver(struct i2c_driver *driver) | |||
| 125 | 130 | ||
| 126 | static int __init i2c_isa_init(void) | 131 | static int __init i2c_isa_init(void) |
| 127 | { | 132 | { |
| 133 | int err; | ||
| 134 | |||
| 128 | mutex_init(&isa_adapter.clist_lock); | 135 | mutex_init(&isa_adapter.clist_lock); |
| 129 | INIT_LIST_HEAD(&isa_adapter.clients); | 136 | INIT_LIST_HEAD(&isa_adapter.clients); |
| 130 | 137 | ||
| @@ -133,8 +140,16 @@ static int __init i2c_isa_init(void) | |||
| 133 | sprintf(isa_adapter.dev.bus_id, "i2c-%d", isa_adapter.nr); | 140 | sprintf(isa_adapter.dev.bus_id, "i2c-%d", isa_adapter.nr); |
| 134 | isa_adapter.dev.driver = &i2c_adapter_driver; | 141 | isa_adapter.dev.driver = &i2c_adapter_driver; |
| 135 | isa_adapter.dev.release = &i2c_adapter_dev_release; | 142 | isa_adapter.dev.release = &i2c_adapter_dev_release; |
| 136 | device_register(&isa_adapter.dev); | 143 | err = device_register(&isa_adapter.dev); |
| 137 | device_create_file(&isa_adapter.dev, &dev_attr_name); | 144 | if (err) { |
| 145 | printk(KERN_ERR "i2c-isa: Failed to register device\n"); | ||
| 146 | goto exit; | ||
| 147 | } | ||
| 148 | err = device_create_file(&isa_adapter.dev, &dev_attr_name); | ||
| 149 | if (err) { | ||
| 150 | printk(KERN_ERR "i2c-isa: Failed to create name file\n"); | ||
| 151 | goto exit_unregister; | ||
| 152 | } | ||
| 138 | 153 | ||
| 139 | /* Add this adapter to the i2c_adapter class */ | 154 | /* Add this adapter to the i2c_adapter class */ |
| 140 | memset(&isa_adapter.class_dev, 0x00, sizeof(struct class_device)); | 155 | memset(&isa_adapter.class_dev, 0x00, sizeof(struct class_device)); |
| @@ -142,11 +157,24 @@ static int __init i2c_isa_init(void) | |||
| 142 | isa_adapter.class_dev.class = &i2c_adapter_class; | 157 | isa_adapter.class_dev.class = &i2c_adapter_class; |
| 143 | strlcpy(isa_adapter.class_dev.class_id, isa_adapter.dev.bus_id, | 158 | strlcpy(isa_adapter.class_dev.class_id, isa_adapter.dev.bus_id, |
| 144 | BUS_ID_SIZE); | 159 | BUS_ID_SIZE); |
| 145 | class_device_register(&isa_adapter.class_dev); | 160 | err = class_device_register(&isa_adapter.class_dev); |
| 161 | if (err) { | ||
| 162 | printk(KERN_ERR "i2c-isa: Failed to register class device\n"); | ||
| 163 | goto exit_remove_name; | ||
| 164 | } | ||
| 146 | 165 | ||
| 147 | dev_dbg(&isa_adapter.dev, "%s registered\n", isa_adapter.name); | 166 | dev_dbg(&isa_adapter.dev, "%s registered\n", isa_adapter.name); |
| 148 | 167 | ||
| 149 | return 0; | 168 | return 0; |
| 169 | |||
| 170 | exit_remove_name: | ||
| 171 | device_remove_file(&isa_adapter.dev, &dev_attr_name); | ||
| 172 | exit_unregister: | ||
| 173 | init_completion(&isa_adapter.dev_released); /* Needed? */ | ||
| 174 | device_unregister(&isa_adapter.dev); | ||
| 175 | wait_for_completion(&isa_adapter.dev_released); | ||
| 176 | exit: | ||
| 177 | return err; | ||
| 150 | } | 178 | } |
| 151 | 179 | ||
| 152 | static void __exit i2c_isa_exit(void) | 180 | static void __exit i2c_isa_exit(void) |
diff --git a/drivers/i2c/busses/i2c-ite.c b/drivers/i2c/busses/i2c-ite.c deleted file mode 100644 index d82e6dae8407..000000000000 --- a/drivers/i2c/busses/i2c-ite.c +++ /dev/null | |||
| @@ -1,279 +0,0 @@ | |||
| 1 | /* | ||
| 2 | ------------------------------------------------------------------------- | ||
| 3 | i2c-adap-ite.c i2c-hw access for the IIC peripheral on the ITE MIPS system | ||
| 4 | ------------------------------------------------------------------------- | ||
| 5 | Hai-Pao Fan, MontaVista Software, Inc. | ||
| 6 | hpfan@mvista.com or source@mvista.com | ||
| 7 | |||
| 8 | Copyright 2001 MontaVista Software Inc. | ||
| 9 | |||
| 10 | ---------------------------------------------------------------------------- | ||
| 11 | This file was highly leveraged from i2c-elektor.c, which was created | ||
| 12 | by Simon G. Vogl and Hans Berglund: | ||
| 13 | |||
| 14 | |||
| 15 | Copyright (C) 1995-97 Simon G. Vogl | ||
| 16 | 1998-99 Hans Berglund | ||
| 17 | |||
| 18 | This program is free software; you can redistribute it and/or modify | ||
| 19 | it under the terms of the GNU General Public License as published by | ||
| 20 | the Free Software Foundation; either version 2 of the License, or | ||
| 21 | (at your option) any later version. | ||
| 22 | |||
| 23 | This program is distributed in the hope that it will be useful, | ||
| 24 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 25 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 26 | GNU General Public License for more details. | ||
| 27 | |||
| 28 | You should have received a copy of the GNU General Public License | ||
| 29 | along with this program; if not, write to the Free Software | ||
| 30 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ | ||
| 31 | /* ------------------------------------------------------------------------- */ | ||
| 32 | |||
| 33 | /* With some changes from Kyösti Mälkki <kmalkki@cc.hut.fi> and even | ||
| 34 | Frodo Looijaard <frodol@dds.nl> */ | ||
| 35 | |||
| 36 | #include <linux/kernel.h> | ||
| 37 | #include <linux/ioport.h> | ||
| 38 | #include <linux/module.h> | ||
| 39 | #include <linux/delay.h> | ||
| 40 | #include <linux/slab.h> | ||
| 41 | #include <linux/init.h> | ||
| 42 | #include <linux/wait.h> | ||
| 43 | #include <asm/irq.h> | ||
| 44 | #include <asm/io.h> | ||
| 45 | |||
| 46 | #include <linux/i2c.h> | ||
| 47 | #include <linux/i2c-algo-ite.h> | ||
| 48 | #include <linux/i2c-adap-ite.h> | ||
| 49 | #include "../i2c-ite.h" | ||
| 50 | |||
| 51 | #define DEFAULT_BASE 0x14014030 | ||
| 52 | #define ITE_IIC_IO_SIZE 0x40 | ||
| 53 | #define DEFAULT_IRQ 0 | ||
| 54 | #define DEFAULT_CLOCK 0x1b0e /* default 16MHz/(27+14) = 400KHz */ | ||
| 55 | #define DEFAULT_OWN 0x55 | ||
| 56 | |||
| 57 | static int base; | ||
| 58 | static int irq; | ||
| 59 | static int clock; | ||
| 60 | static int own; | ||
| 61 | |||
| 62 | static struct iic_ite gpi; | ||
| 63 | static wait_queue_head_t iic_wait; | ||
| 64 | static int iic_pending; | ||
| 65 | static spinlock_t lock; | ||
| 66 | |||
| 67 | /* ----- local functions ---------------------------------------------- */ | ||
| 68 | |||
| 69 | static void iic_ite_setiic(void *data, int ctl, short val) | ||
| 70 | { | ||
| 71 | unsigned long j = jiffies + 10; | ||
| 72 | |||
| 73 | pr_debug(" Write 0x%02x to 0x%x\n",(unsigned short)val, ctl&0xff); | ||
| 74 | #ifdef DEBUG | ||
| 75 | while (time_before(jiffies, j)) | ||
| 76 | schedule(); | ||
| 77 | #endif | ||
| 78 | outw(val,ctl); | ||
| 79 | } | ||
| 80 | |||
| 81 | static short iic_ite_getiic(void *data, int ctl) | ||
| 82 | { | ||
| 83 | short val; | ||
| 84 | |||
| 85 | val = inw(ctl); | ||
| 86 | pr_debug("Read 0x%02x from 0x%x\n",(unsigned short)val, ctl&0xff); | ||
| 87 | return (val); | ||
| 88 | } | ||
| 89 | |||
| 90 | /* Return our slave address. This is the address | ||
| 91 | * put on the I2C bus when another master on the bus wants to address us | ||
| 92 | * as a slave | ||
| 93 | */ | ||
| 94 | static int iic_ite_getown(void *data) | ||
| 95 | { | ||
| 96 | return (gpi.iic_own); | ||
| 97 | } | ||
| 98 | |||
| 99 | |||
| 100 | static int iic_ite_getclock(void *data) | ||
| 101 | { | ||
| 102 | return (gpi.iic_clock); | ||
| 103 | } | ||
| 104 | |||
| 105 | |||
| 106 | /* Put this process to sleep. We will wake up when the | ||
| 107 | * IIC controller interrupts. | ||
| 108 | */ | ||
| 109 | static void iic_ite_waitforpin(void) { | ||
| 110 | DEFINE_WAIT(wait); | ||
| 111 | int timeout = 2; | ||
| 112 | long flags; | ||
| 113 | |||
| 114 | /* If interrupts are enabled (which they are), then put the process to | ||
| 115 | * sleep. This process will be awakened by two events -- either the | ||
| 116 | * the IIC peripheral interrupts or the timeout expires. | ||
| 117 | * If interrupts are not enabled then delay for a reasonable amount | ||
| 118 | * of time and return. | ||
| 119 | */ | ||
| 120 | if (gpi.iic_irq > 0) { | ||
| 121 | spin_lock_irqsave(&lock, flags); | ||
| 122 | if (iic_pending == 0) { | ||
| 123 | spin_unlock_irqrestore(&lock, flags); | ||
| 124 | prepare_to_wait(&iic_wait, &wait, TASK_INTERRUPTIBLE); | ||
| 125 | if (schedule_timeout(timeout*HZ)) { | ||
| 126 | spin_lock_irqsave(&lock, flags); | ||
| 127 | if (iic_pending == 1) { | ||
| 128 | iic_pending = 0; | ||
| 129 | } | ||
| 130 | spin_unlock_irqrestore(&lock, flags); | ||
| 131 | } | ||
| 132 | finish_wait(&iic_wait, &wait); | ||
| 133 | } else { | ||
| 134 | iic_pending = 0; | ||
| 135 | spin_unlock_irqrestore(&lock, flags); | ||
| 136 | } | ||
| 137 | } else { | ||
| 138 | udelay(100); | ||
| 139 | } | ||
| 140 | } | ||
| 141 | |||
| 142 | |||
| 143 | static irqreturn_t iic_ite_handler(int this_irq, void *dev_id, | ||
| 144 | struct pt_regs *regs) | ||
| 145 | { | ||
| 146 | spin_lock(&lock); | ||
| 147 | iic_pending = 1; | ||
| 148 | spin_unlock(&lock); | ||
| 149 | |||
| 150 | wake_up_interruptible(&iic_wait); | ||
| 151 | |||
| 152 | return IRQ_HANDLED; | ||
| 153 | } | ||
| 154 | |||
| 155 | |||
| 156 | /* Lock the region of memory where I/O registers exist. Request our | ||
| 157 | * interrupt line and register its associated handler. | ||
| 158 | */ | ||
| 159 | static int iic_hw_resrc_init(void) | ||
| 160 | { | ||
| 161 | if (!request_region(gpi.iic_base, ITE_IIC_IO_SIZE, "i2c")) | ||
| 162 | return -ENODEV; | ||
| 163 | |||
| 164 | if (gpi.iic_irq <= 0) | ||
| 165 | return 0; | ||
| 166 | |||
| 167 | if (request_irq(gpi.iic_irq, iic_ite_handler, 0, "ITE IIC", 0) < 0) | ||
| 168 | gpi.iic_irq = 0; | ||
| 169 | else | ||
| 170 | enable_irq(gpi.iic_irq); | ||
| 171 | |||
| 172 | return 0; | ||
| 173 | } | ||
| 174 | |||
| 175 | |||
| 176 | static void iic_ite_release(void) | ||
| 177 | { | ||
| 178 | if (gpi.iic_irq > 0) { | ||
| 179 | disable_irq(gpi.iic_irq); | ||
| 180 | free_irq(gpi.iic_irq, 0); | ||
| 181 | } | ||
| 182 | release_region(gpi.iic_base , 2); | ||
| 183 | } | ||
| 184 | |||
| 185 | /* ------------------------------------------------------------------------ | ||
| 186 | * Encapsulate the above functions in the correct operations structure. | ||
| 187 | * This is only done when more than one hardware adapter is supported. | ||
| 188 | */ | ||
| 189 | static struct i2c_algo_iic_data iic_ite_data = { | ||
| 190 | NULL, | ||
| 191 | iic_ite_setiic, | ||
| 192 | iic_ite_getiic, | ||
| 193 | iic_ite_getown, | ||
| 194 | iic_ite_getclock, | ||
| 195 | iic_ite_waitforpin, | ||
| 196 | 80, 80, 100, /* waits, timeout */ | ||
| 197 | }; | ||
| 198 | |||
| 199 | static struct i2c_adapter iic_ite_ops = { | ||
| 200 | .owner = THIS_MODULE, | ||
| 201 | .id = I2C_HW_I_IIC, | ||
| 202 | .algo_data = &iic_ite_data, | ||
| 203 | .name = "ITE IIC adapter", | ||
| 204 | }; | ||
| 205 | |||
| 206 | /* Called when the module is loaded. This function starts the | ||
| 207 | * cascade of calls up through the hierarchy of i2c modules (i.e. up to the | ||
| 208 | * algorithm layer and into to the core layer) | ||
| 209 | */ | ||
| 210 | static int __init iic_ite_init(void) | ||
| 211 | { | ||
| 212 | |||
| 213 | struct iic_ite *piic = &gpi; | ||
| 214 | |||
| 215 | printk(KERN_INFO "Initialize ITE IIC adapter module\n"); | ||
| 216 | if (base == 0) | ||
| 217 | piic->iic_base = DEFAULT_BASE; | ||
| 218 | else | ||
| 219 | piic->iic_base = base; | ||
| 220 | |||
| 221 | if (irq == 0) | ||
| 222 | piic->iic_irq = DEFAULT_IRQ; | ||
| 223 | else | ||
| 224 | piic->iic_irq = irq; | ||
| 225 | |||
| 226 | if (clock == 0) | ||
| 227 | piic->iic_clock = DEFAULT_CLOCK; | ||
| 228 | else | ||
| 229 | piic->iic_clock = clock; | ||
| 230 | |||
| 231 | if (own == 0) | ||
| 232 | piic->iic_own = DEFAULT_OWN; | ||
| 233 | else | ||
| 234 | piic->iic_own = own; | ||
| 235 | |||
| 236 | iic_ite_data.data = (void *)piic; | ||
| 237 | init_waitqueue_head(&iic_wait); | ||
| 238 | spin_lock_init(&lock); | ||
| 239 | if (iic_hw_resrc_init() == 0) { | ||
| 240 | if (i2c_iic_add_bus(&iic_ite_ops) < 0) | ||
| 241 | return -ENODEV; | ||
| 242 | } else { | ||
| 243 | return -ENODEV; | ||
| 244 | } | ||
| 245 | printk(KERN_INFO " found device at %#x irq %d.\n", | ||
| 246 | piic->iic_base, piic->iic_irq); | ||
| 247 | return 0; | ||
| 248 | } | ||
| 249 | |||
| 250 | |||
| 251 | static void iic_ite_exit(void) | ||
| 252 | { | ||
| 253 | i2c_iic_del_bus(&iic_ite_ops); | ||
| 254 | iic_ite_release(); | ||
| 255 | } | ||
| 256 | |||
| 257 | /* If modules is NOT defined when this file is compiled, then the MODULE_* | ||
| 258 | * macros will resolve to nothing | ||
| 259 | */ | ||
| 260 | MODULE_AUTHOR("MontaVista Software <www.mvista.com>"); | ||
| 261 | MODULE_DESCRIPTION("I2C-Bus adapter routines for ITE IIC bus adapter"); | ||
| 262 | MODULE_LICENSE("GPL"); | ||
| 263 | |||
| 264 | module_param(base, int, 0); | ||
| 265 | module_param(irq, int, 0); | ||
| 266 | module_param(clock, int, 0); | ||
| 267 | module_param(own, int, 0); | ||
| 268 | |||
| 269 | |||
| 270 | /* Called when module is loaded or when kernel is initialized. | ||
| 271 | * If MODULES is defined when this file is compiled, then this function will | ||
| 272 | * resolve to init_module (the function called when insmod is invoked for a | ||
| 273 | * module). Otherwise, this function is called early in the boot, when the | ||
| 274 | * kernel is intialized. Check out /include/init.h to see how this works. | ||
| 275 | */ | ||
| 276 | module_init(iic_ite_init); | ||
| 277 | |||
| 278 | /* Resolves to module_cleanup when MODULES is defined. */ | ||
| 279 | module_exit(iic_ite_exit); | ||
diff --git a/drivers/i2c/busses/i2c-ixp2000.c b/drivers/i2c/busses/i2c-ixp2000.c index cd6f45d186ab..efa3ecc5522a 100644 --- a/drivers/i2c/busses/i2c-ixp2000.c +++ b/drivers/i2c/busses/i2c-ixp2000.c | |||
| @@ -90,7 +90,7 @@ static int ixp2000_i2c_remove(struct platform_device *plat_dev) | |||
| 90 | 90 | ||
| 91 | platform_set_drvdata(plat_dev, NULL); | 91 | platform_set_drvdata(plat_dev, NULL); |
| 92 | 92 | ||
| 93 | i2c_bit_del_bus(&drv_data->adapter); | 93 | i2c_del_adapter(&drv_data->adapter); |
| 94 | 94 | ||
| 95 | kfree(drv_data); | 95 | kfree(drv_data); |
| 96 | 96 | ||
| @@ -114,7 +114,6 @@ static int ixp2000_i2c_probe(struct platform_device *plat_dev) | |||
| 114 | drv_data->algo_data.getsda = ixp2000_bit_getsda; | 114 | drv_data->algo_data.getsda = ixp2000_bit_getsda; |
| 115 | drv_data->algo_data.getscl = ixp2000_bit_getscl; | 115 | drv_data->algo_data.getscl = ixp2000_bit_getscl; |
| 116 | drv_data->algo_data.udelay = 6; | 116 | drv_data->algo_data.udelay = 6; |
| 117 | drv_data->algo_data.mdelay = 6; | ||
| 118 | drv_data->algo_data.timeout = 100; | 117 | drv_data->algo_data.timeout = 100; |
| 119 | 118 | ||
| 120 | drv_data->adapter.id = I2C_HW_B_IXP2000, | 119 | drv_data->adapter.id = I2C_HW_B_IXP2000, |
diff --git a/drivers/i2c/busses/i2c-ixp4xx.c b/drivers/i2c/busses/i2c-ixp4xx.c index 2ed07112d683..08e89b83984a 100644 --- a/drivers/i2c/busses/i2c-ixp4xx.c +++ b/drivers/i2c/busses/i2c-ixp4xx.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * drivers/i2c/i2c-adap-ixp4xx.c | 2 | * drivers/i2c/busses/i2c-ixp4xx.c |
| 3 | * | 3 | * |
| 4 | * Intel's IXP4xx XScale NPU chipsets (IXP420, 421, 422, 425) do not have | 4 | * Intel's IXP4xx XScale NPU chipsets (IXP420, 421, 422, 425) do not have |
| 5 | * an on board I2C controller but provide 16 GPIO pins that are often | 5 | * an on board I2C controller but provide 16 GPIO pins that are often |
| @@ -91,7 +91,7 @@ static int ixp4xx_i2c_remove(struct platform_device *plat_dev) | |||
| 91 | 91 | ||
| 92 | platform_set_drvdata(plat_dev, NULL); | 92 | platform_set_drvdata(plat_dev, NULL); |
| 93 | 93 | ||
| 94 | i2c_bit_del_bus(&drv_data->adapter); | 94 | i2c_del_adapter(&drv_data->adapter); |
| 95 | 95 | ||
| 96 | kfree(drv_data); | 96 | kfree(drv_data); |
| 97 | 97 | ||
| @@ -122,7 +122,6 @@ static int ixp4xx_i2c_probe(struct platform_device *plat_dev) | |||
| 122 | drv_data->algo_data.getsda = ixp4xx_bit_getsda; | 122 | drv_data->algo_data.getsda = ixp4xx_bit_getsda; |
| 123 | drv_data->algo_data.getscl = ixp4xx_bit_getscl; | 123 | drv_data->algo_data.getscl = ixp4xx_bit_getscl; |
| 124 | drv_data->algo_data.udelay = 10; | 124 | drv_data->algo_data.udelay = 10; |
| 125 | drv_data->algo_data.mdelay = 10; | ||
| 126 | drv_data->algo_data.timeout = 100; | 125 | drv_data->algo_data.timeout = 100; |
| 127 | 126 | ||
| 128 | drv_data->adapter.id = I2C_HW_B_IXP4XX; | 127 | drv_data->adapter.id = I2C_HW_B_IXP4XX; |
| @@ -138,7 +137,8 @@ static int ixp4xx_i2c_probe(struct platform_device *plat_dev) | |||
| 138 | gpio_line_set(gpio->scl_pin, 0); | 137 | gpio_line_set(gpio->scl_pin, 0); |
| 139 | gpio_line_set(gpio->sda_pin, 0); | 138 | gpio_line_set(gpio->sda_pin, 0); |
| 140 | 139 | ||
| 141 | if ((err = i2c_bit_add_bus(&drv_data->adapter) != 0)) { | 140 | err = i2c_bit_add_bus(&drv_data->adapter); |
| 141 | if (err) { | ||
| 142 | printk(KERN_ERR "ERROR: Could not install %s\n", plat_dev->dev.bus_id); | 142 | printk(KERN_ERR "ERROR: Could not install %s\n", plat_dev->dev.bus_id); |
| 143 | 143 | ||
| 144 | kfree(drv_data); | 144 | kfree(drv_data); |
diff --git a/drivers/i2c/busses/i2c-mpc.c b/drivers/i2c/busses/i2c-mpc.c index 377ab40944b8..ee65aa1be13a 100644 --- a/drivers/i2c/busses/i2c-mpc.c +++ b/drivers/i2c/busses/i2c-mpc.c | |||
| @@ -63,7 +63,7 @@ static __inline__ void writeccr(struct mpc_i2c *i2c, u32 x) | |||
| 63 | writeb(x, i2c->base + MPC_I2C_CR); | 63 | writeb(x, i2c->base + MPC_I2C_CR); |
| 64 | } | 64 | } |
| 65 | 65 | ||
| 66 | static irqreturn_t mpc_i2c_isr(int irq, void *dev_id, struct pt_regs *regs) | 66 | static irqreturn_t mpc_i2c_isr(int irq, void *dev_id) |
| 67 | { | 67 | { |
| 68 | struct mpc_i2c *i2c = dev_id; | 68 | struct mpc_i2c *i2c = dev_id; |
| 69 | if (readb(i2c->base + MPC_I2C_SR) & CSR_MIF) { | 69 | if (readb(i2c->base + MPC_I2C_SR) & CSR_MIF) { |
| @@ -272,7 +272,7 @@ static u32 mpc_functionality(struct i2c_adapter *adap) | |||
| 272 | return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL; | 272 | return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL; |
| 273 | } | 273 | } |
| 274 | 274 | ||
| 275 | static struct i2c_algorithm mpc_algo = { | 275 | static const struct i2c_algorithm mpc_algo = { |
| 276 | .master_xfer = mpc_xfer, | 276 | .master_xfer = mpc_xfer, |
| 277 | .functionality = mpc_functionality, | 277 | .functionality = mpc_functionality, |
| 278 | }; | 278 | }; |
diff --git a/drivers/i2c/busses/i2c-mv64xxx.c b/drivers/i2c/busses/i2c-mv64xxx.c index ac5cde1bbd2b..bbc8e3a7ff55 100644 --- a/drivers/i2c/busses/i2c-mv64xxx.c +++ b/drivers/i2c/busses/i2c-mv64xxx.c | |||
| @@ -278,7 +278,7 @@ mv64xxx_i2c_do_action(struct mv64xxx_i2c_data *drv_data) | |||
| 278 | } | 278 | } |
| 279 | 279 | ||
| 280 | static int | 280 | static int |
| 281 | mv64xxx_i2c_intr(int irq, void *dev_id, struct pt_regs *regs) | 281 | mv64xxx_i2c_intr(int irq, void *dev_id) |
| 282 | { | 282 | { |
| 283 | struct mv64xxx_i2c_data *drv_data = dev_id; | 283 | struct mv64xxx_i2c_data *drv_data = dev_id; |
| 284 | unsigned long flags; | 284 | unsigned long flags; |
| @@ -431,7 +431,7 @@ mv64xxx_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num) | |||
| 431 | return num; | 431 | return num; |
| 432 | } | 432 | } |
| 433 | 433 | ||
| 434 | static struct i2c_algorithm mv64xxx_i2c_algo = { | 434 | static const struct i2c_algorithm mv64xxx_i2c_algo = { |
| 435 | .master_xfer = mv64xxx_i2c_xfer, | 435 | .master_xfer = mv64xxx_i2c_xfer, |
| 436 | .functionality = mv64xxx_i2c_functionality, | 436 | .functionality = mv64xxx_i2c_functionality, |
| 437 | }; | 437 | }; |
diff --git a/drivers/i2c/busses/i2c-nforce2.c b/drivers/i2c/busses/i2c-nforce2.c index 604b49e22df1..ad37c10e7fec 100644 --- a/drivers/i2c/busses/i2c-nforce2.c +++ b/drivers/i2c/busses/i2c-nforce2.c | |||
| @@ -35,7 +35,7 @@ | |||
| 35 | nForce4 MCP55 0368 | 35 | nForce4 MCP55 0368 |
| 36 | 36 | ||
| 37 | This driver supports the 2 SMBuses that are included in the MCP of the | 37 | This driver supports the 2 SMBuses that are included in the MCP of the |
| 38 | nForce2/3/4 chipsets. | 38 | nForce2/3/4/5xx chipsets. |
| 39 | */ | 39 | */ |
| 40 | 40 | ||
| 41 | /* Note: we assume there can only be one nForce2, with two SMBus interfaces */ | 41 | /* Note: we assume there can only be one nForce2, with two SMBus interfaces */ |
| @@ -52,8 +52,8 @@ | |||
| 52 | #include <asm/io.h> | 52 | #include <asm/io.h> |
| 53 | 53 | ||
| 54 | MODULE_LICENSE("GPL"); | 54 | MODULE_LICENSE("GPL"); |
| 55 | MODULE_AUTHOR ("Hans-Frieder Vogt <hfvogt@arcor.de>"); | 55 | MODULE_AUTHOR ("Hans-Frieder Vogt <hfvogt@gmx.net>"); |
| 56 | MODULE_DESCRIPTION("nForce2 SMBus driver"); | 56 | MODULE_DESCRIPTION("nForce2/3/4/5xx SMBus driver"); |
| 57 | 57 | ||
| 58 | 58 | ||
| 59 | struct nforce2_smbus { | 59 | struct nforce2_smbus { |
| @@ -80,9 +80,6 @@ struct nforce2_smbus { | |||
| 80 | #define NVIDIA_SMB_ADDR (smbus->base + 0x02) /* address */ | 80 | #define NVIDIA_SMB_ADDR (smbus->base + 0x02) /* address */ |
| 81 | #define NVIDIA_SMB_CMD (smbus->base + 0x03) /* command */ | 81 | #define NVIDIA_SMB_CMD (smbus->base + 0x03) /* command */ |
| 82 | #define NVIDIA_SMB_DATA (smbus->base + 0x04) /* 32 data registers */ | 82 | #define NVIDIA_SMB_DATA (smbus->base + 0x04) /* 32 data registers */ |
| 83 | #define NVIDIA_SMB_BCNT (smbus->base + 0x24) /* number of data bytes */ | ||
| 84 | #define NVIDIA_SMB_ALRM_A (smbus->base + 0x25) /* alarm address */ | ||
| 85 | #define NVIDIA_SMB_ALRM_D (smbus->base + 0x26) /* 2 bytes alarm data */ | ||
| 86 | 83 | ||
| 87 | #define NVIDIA_SMB_STS_DONE 0x80 | 84 | #define NVIDIA_SMB_STS_DONE 0x80 |
| 88 | #define NVIDIA_SMB_STS_ALRM 0x40 | 85 | #define NVIDIA_SMB_STS_ALRM 0x40 |
| @@ -95,40 +92,17 @@ struct nforce2_smbus { | |||
| 95 | #define NVIDIA_SMB_PRTCL_BYTE 0x04 | 92 | #define NVIDIA_SMB_PRTCL_BYTE 0x04 |
| 96 | #define NVIDIA_SMB_PRTCL_BYTE_DATA 0x06 | 93 | #define NVIDIA_SMB_PRTCL_BYTE_DATA 0x06 |
| 97 | #define NVIDIA_SMB_PRTCL_WORD_DATA 0x08 | 94 | #define NVIDIA_SMB_PRTCL_WORD_DATA 0x08 |
| 98 | #define NVIDIA_SMB_PRTCL_BLOCK_DATA 0x0a | ||
| 99 | #define NVIDIA_SMB_PRTCL_PROC_CALL 0x0c | ||
| 100 | #define NVIDIA_SMB_PRTCL_BLOCK_PROC_CALL 0x0d | ||
| 101 | #define NVIDIA_SMB_PRTCL_I2C_BLOCK_DATA 0x4a | ||
| 102 | #define NVIDIA_SMB_PRTCL_PEC 0x80 | 95 | #define NVIDIA_SMB_PRTCL_PEC 0x80 |
| 103 | 96 | ||
| 104 | static struct pci_driver nforce2_driver; | 97 | static struct pci_driver nforce2_driver; |
| 105 | 98 | ||
| 106 | static s32 nforce2_access(struct i2c_adapter *adap, u16 addr, | 99 | /* Return -1 on error */ |
| 107 | unsigned short flags, char read_write, | ||
| 108 | u8 command, int size, union i2c_smbus_data *data); | ||
| 109 | static u32 nforce2_func(struct i2c_adapter *adapter); | ||
| 110 | |||
| 111 | |||
| 112 | static struct i2c_algorithm smbus_algorithm = { | ||
| 113 | .smbus_xfer = nforce2_access, | ||
| 114 | .functionality = nforce2_func, | ||
| 115 | }; | ||
| 116 | |||
| 117 | static struct i2c_adapter nforce2_adapter = { | ||
| 118 | .owner = THIS_MODULE, | ||
| 119 | .class = I2C_CLASS_HWMON, | ||
| 120 | .algo = &smbus_algorithm, | ||
| 121 | }; | ||
| 122 | |||
| 123 | /* Return -1 on error. See smbus.h for more information */ | ||
| 124 | static s32 nforce2_access(struct i2c_adapter * adap, u16 addr, | 100 | static s32 nforce2_access(struct i2c_adapter * adap, u16 addr, |
| 125 | unsigned short flags, char read_write, | 101 | unsigned short flags, char read_write, |
| 126 | u8 command, int size, union i2c_smbus_data * data) | 102 | u8 command, int size, union i2c_smbus_data * data) |
| 127 | { | 103 | { |
| 128 | struct nforce2_smbus *smbus = adap->algo_data; | 104 | struct nforce2_smbus *smbus = adap->algo_data; |
| 129 | unsigned char protocol, pec, temp; | 105 | unsigned char protocol, pec, temp; |
| 130 | unsigned char len = 0; /* to keep the compiler quiet */ | ||
| 131 | int i; | ||
| 132 | 106 | ||
| 133 | protocol = (read_write == I2C_SMBUS_READ) ? NVIDIA_SMB_PRTCL_READ : | 107 | protocol = (read_write == I2C_SMBUS_READ) ? NVIDIA_SMB_PRTCL_READ : |
| 134 | NVIDIA_SMB_PRTCL_WRITE; | 108 | NVIDIA_SMB_PRTCL_WRITE; |
| @@ -163,35 +137,6 @@ static s32 nforce2_access(struct i2c_adapter * adap, u16 addr, | |||
| 163 | protocol |= NVIDIA_SMB_PRTCL_WORD_DATA | pec; | 137 | protocol |= NVIDIA_SMB_PRTCL_WORD_DATA | pec; |
| 164 | break; | 138 | break; |
| 165 | 139 | ||
| 166 | case I2C_SMBUS_BLOCK_DATA: | ||
| 167 | outb_p(command, NVIDIA_SMB_CMD); | ||
| 168 | if (read_write == I2C_SMBUS_WRITE) { | ||
| 169 | len = min_t(u8, data->block[0], 32); | ||
| 170 | outb_p(len, NVIDIA_SMB_BCNT); | ||
| 171 | for (i = 0; i < len; i++) | ||
| 172 | outb_p(data->block[i + 1], NVIDIA_SMB_DATA+i); | ||
| 173 | } | ||
| 174 | protocol |= NVIDIA_SMB_PRTCL_BLOCK_DATA | pec; | ||
| 175 | break; | ||
| 176 | |||
| 177 | case I2C_SMBUS_I2C_BLOCK_DATA: | ||
| 178 | len = min_t(u8, data->block[0], 32); | ||
| 179 | outb_p(command, NVIDIA_SMB_CMD); | ||
| 180 | outb_p(len, NVIDIA_SMB_BCNT); | ||
| 181 | if (read_write == I2C_SMBUS_WRITE) | ||
| 182 | for (i = 0; i < len; i++) | ||
| 183 | outb_p(data->block[i + 1], NVIDIA_SMB_DATA+i); | ||
| 184 | protocol |= NVIDIA_SMB_PRTCL_I2C_BLOCK_DATA; | ||
| 185 | break; | ||
| 186 | |||
| 187 | case I2C_SMBUS_PROC_CALL: | ||
| 188 | dev_err(&adap->dev, "I2C_SMBUS_PROC_CALL not supported!\n"); | ||
| 189 | return -1; | ||
| 190 | |||
| 191 | case I2C_SMBUS_BLOCK_PROC_CALL: | ||
| 192 | dev_err(&adap->dev, "I2C_SMBUS_BLOCK_PROC_CALL not supported!\n"); | ||
| 193 | return -1; | ||
| 194 | |||
| 195 | default: | 140 | default: |
| 196 | dev_err(&adap->dev, "Unsupported transaction %d\n", size); | 141 | dev_err(&adap->dev, "Unsupported transaction %d\n", size); |
| 197 | return -1; | 142 | return -1; |
| @@ -227,19 +172,8 @@ static s32 nforce2_access(struct i2c_adapter * adap, u16 addr, | |||
| 227 | break; | 172 | break; |
| 228 | 173 | ||
| 229 | case I2C_SMBUS_WORD_DATA: | 174 | case I2C_SMBUS_WORD_DATA: |
| 230 | /* case I2C_SMBUS_PROC_CALL: not supported */ | ||
| 231 | data->word = inb_p(NVIDIA_SMB_DATA) | (inb_p(NVIDIA_SMB_DATA+1) << 8); | 175 | data->word = inb_p(NVIDIA_SMB_DATA) | (inb_p(NVIDIA_SMB_DATA+1) << 8); |
| 232 | break; | 176 | break; |
| 233 | |||
| 234 | case I2C_SMBUS_BLOCK_DATA: | ||
| 235 | /* case I2C_SMBUS_BLOCK_PROC_CALL: not supported */ | ||
| 236 | len = inb_p(NVIDIA_SMB_BCNT); | ||
| 237 | len = min_t(u8, len, 32); | ||
| 238 | case I2C_SMBUS_I2C_BLOCK_DATA: | ||
| 239 | for (i = 0; i < len; i++) | ||
| 240 | data->block[i+1] = inb_p(NVIDIA_SMB_DATA + i); | ||
| 241 | data->block[0] = len; | ||
| 242 | break; | ||
| 243 | } | 177 | } |
| 244 | 178 | ||
| 245 | return 0; | 179 | return 0; |
| @@ -250,10 +184,14 @@ static u32 nforce2_func(struct i2c_adapter *adapter) | |||
| 250 | { | 184 | { |
| 251 | /* other functionality might be possible, but is not tested */ | 185 | /* other functionality might be possible, but is not tested */ |
| 252 | return I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE | | 186 | return I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE | |
| 253 | I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA /* | | 187 | I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA; |
| 254 | I2C_FUNC_SMBUS_BLOCK_DATA */; | ||
| 255 | } | 188 | } |
| 256 | 189 | ||
| 190 | static struct i2c_algorithm smbus_algorithm = { | ||
| 191 | .smbus_xfer = nforce2_access, | ||
| 192 | .functionality = nforce2_func, | ||
| 193 | }; | ||
| 194 | |||
| 257 | 195 | ||
| 258 | static struct pci_device_id nforce2_ids[] = { | 196 | static struct pci_device_id nforce2_ids[] = { |
| 259 | { PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE2_SMBUS) }, | 197 | { PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE2_SMBUS) }, |
| @@ -267,7 +205,6 @@ static struct pci_device_id nforce2_ids[] = { | |||
| 267 | { 0 } | 205 | { 0 } |
| 268 | }; | 206 | }; |
| 269 | 207 | ||
| 270 | |||
| 271 | MODULE_DEVICE_TABLE (pci, nforce2_ids); | 208 | MODULE_DEVICE_TABLE (pci, nforce2_ids); |
| 272 | 209 | ||
| 273 | 210 | ||
| @@ -291,7 +228,7 @@ static int __devinit nforce2_probe_smb (struct pci_dev *dev, int bar, | |||
| 291 | } | 228 | } |
| 292 | 229 | ||
| 293 | smbus->base = iobase & PCI_BASE_ADDRESS_IO_MASK; | 230 | smbus->base = iobase & PCI_BASE_ADDRESS_IO_MASK; |
| 294 | smbus->size = 8; | 231 | smbus->size = 64; |
| 295 | } | 232 | } |
| 296 | smbus->dev = dev; | 233 | smbus->dev = dev; |
| 297 | 234 | ||
| @@ -300,7 +237,9 @@ static int __devinit nforce2_probe_smb (struct pci_dev *dev, int bar, | |||
| 300 | smbus->base, smbus->base+smbus->size-1, name); | 237 | smbus->base, smbus->base+smbus->size-1, name); |
| 301 | return -1; | 238 | return -1; |
| 302 | } | 239 | } |
| 303 | smbus->adapter = nforce2_adapter; | 240 | smbus->adapter.owner = THIS_MODULE; |
| 241 | smbus->adapter.class = I2C_CLASS_HWMON; | ||
| 242 | smbus->adapter.algo = &smbus_algorithm; | ||
| 304 | smbus->adapter.algo_data = smbus; | 243 | smbus->adapter.algo_data = smbus; |
| 305 | smbus->adapter.dev.parent = &dev->dev; | 244 | smbus->adapter.dev.parent = &dev->dev; |
| 306 | snprintf(smbus->adapter.name, I2C_NAME_SIZE, | 245 | snprintf(smbus->adapter.name, I2C_NAME_SIZE, |
diff --git a/drivers/i2c/busses/i2c-ocores.c b/drivers/i2c/busses/i2c-ocores.c index 592824087c49..f28a76d1c0af 100644 --- a/drivers/i2c/busses/i2c-ocores.c +++ b/drivers/i2c/busses/i2c-ocores.c | |||
| @@ -9,7 +9,6 @@ | |||
| 9 | * kind, whether express or implied. | 9 | * kind, whether express or implied. |
| 10 | */ | 10 | */ |
| 11 | 11 | ||
| 12 | #include <linux/config.h> | ||
| 13 | #include <linux/kernel.h> | 12 | #include <linux/kernel.h> |
| 14 | #include <linux/module.h> | 13 | #include <linux/module.h> |
| 15 | #include <linux/sched.h> | 14 | #include <linux/sched.h> |
| @@ -144,7 +143,7 @@ static void ocores_process(struct ocores_i2c *i2c) | |||
| 144 | } | 143 | } |
| 145 | } | 144 | } |
| 146 | 145 | ||
| 147 | static irqreturn_t ocores_isr(int irq, void *dev_id, struct pt_regs *regs) | 146 | static irqreturn_t ocores_isr(int irq, void *dev_id) |
| 148 | { | 147 | { |
| 149 | struct ocores_i2c *i2c = dev_id; | 148 | struct ocores_i2c *i2c = dev_id; |
| 150 | 149 | ||
| @@ -199,7 +198,7 @@ static u32 ocores_func(struct i2c_adapter *adap) | |||
| 199 | return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL; | 198 | return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL; |
| 200 | } | 199 | } |
| 201 | 200 | ||
| 202 | static struct i2c_algorithm ocores_algorithm = { | 201 | static const struct i2c_algorithm ocores_algorithm = { |
| 203 | .master_xfer = ocores_xfer, | 202 | .master_xfer = ocores_xfer, |
| 204 | .functionality = ocores_func, | 203 | .functionality = ocores_func, |
| 205 | }; | 204 | }; |
diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c new file mode 100644 index 000000000000..bcd8367cede1 --- /dev/null +++ b/drivers/i2c/busses/i2c-omap.c | |||
| @@ -0,0 +1,676 @@ | |||
| 1 | /* | ||
| 2 | * TI OMAP I2C master mode driver | ||
| 3 | * | ||
| 4 | * Copyright (C) 2003 MontaVista Software, Inc. | ||
| 5 | * Copyright (C) 2004 Texas Instruments. | ||
| 6 | * | ||
| 7 | * Updated to work with multiple I2C interfaces on 24xx by | ||
| 8 | * Tony Lindgren <tony@atomide.com> and Imre Deak <imre.deak@nokia.com> | ||
| 9 | * Copyright (C) 2005 Nokia Corporation | ||
| 10 | * | ||
| 11 | * Cleaned up by Juha Yrjölä <juha.yrjola@nokia.com> | ||
| 12 | * | ||
| 13 | * This program is free software; you can redistribute it and/or modify | ||
| 14 | * it under the terms of the GNU General Public License as published by | ||
| 15 | * the Free Software Foundation; either version 2 of the License, or | ||
| 16 | * (at your option) any later version. | ||
| 17 | * | ||
| 18 | * This program is distributed in the hope that it will be useful, | ||
| 19 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 20 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 21 | * GNU General Public License for more details. | ||
| 22 | * | ||
| 23 | * You should have received a copy of the GNU General Public License | ||
| 24 | * along with this program; if not, write to the Free Software | ||
| 25 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
| 26 | */ | ||
| 27 | |||
| 28 | #include <linux/module.h> | ||
| 29 | #include <linux/delay.h> | ||
| 30 | #include <linux/i2c.h> | ||
| 31 | #include <linux/err.h> | ||
| 32 | #include <linux/interrupt.h> | ||
| 33 | #include <linux/completion.h> | ||
| 34 | #include <linux/platform_device.h> | ||
| 35 | #include <linux/clk.h> | ||
| 36 | |||
| 37 | #include <asm/io.h> | ||
| 38 | |||
| 39 | /* timeout waiting for the controller to respond */ | ||
| 40 | #define OMAP_I2C_TIMEOUT (msecs_to_jiffies(1000)) | ||
| 41 | |||
| 42 | #define OMAP_I2C_REV_REG 0x00 | ||
| 43 | #define OMAP_I2C_IE_REG 0x04 | ||
| 44 | #define OMAP_I2C_STAT_REG 0x08 | ||
| 45 | #define OMAP_I2C_IV_REG 0x0c | ||
| 46 | #define OMAP_I2C_SYSS_REG 0x10 | ||
| 47 | #define OMAP_I2C_BUF_REG 0x14 | ||
| 48 | #define OMAP_I2C_CNT_REG 0x18 | ||
| 49 | #define OMAP_I2C_DATA_REG 0x1c | ||
| 50 | #define OMAP_I2C_SYSC_REG 0x20 | ||
| 51 | #define OMAP_I2C_CON_REG 0x24 | ||
| 52 | #define OMAP_I2C_OA_REG 0x28 | ||
| 53 | #define OMAP_I2C_SA_REG 0x2c | ||
| 54 | #define OMAP_I2C_PSC_REG 0x30 | ||
| 55 | #define OMAP_I2C_SCLL_REG 0x34 | ||
| 56 | #define OMAP_I2C_SCLH_REG 0x38 | ||
| 57 | #define OMAP_I2C_SYSTEST_REG 0x3c | ||
| 58 | |||
| 59 | /* I2C Interrupt Enable Register (OMAP_I2C_IE): */ | ||
| 60 | #define OMAP_I2C_IE_XRDY (1 << 4) /* TX data ready int enable */ | ||
| 61 | #define OMAP_I2C_IE_RRDY (1 << 3) /* RX data ready int enable */ | ||
| 62 | #define OMAP_I2C_IE_ARDY (1 << 2) /* Access ready int enable */ | ||
| 63 | #define OMAP_I2C_IE_NACK (1 << 1) /* No ack interrupt enable */ | ||
| 64 | #define OMAP_I2C_IE_AL (1 << 0) /* Arbitration lost int ena */ | ||
| 65 | |||
| 66 | /* I2C Status Register (OMAP_I2C_STAT): */ | ||
| 67 | #define OMAP_I2C_STAT_SBD (1 << 15) /* Single byte data */ | ||
| 68 | #define OMAP_I2C_STAT_BB (1 << 12) /* Bus busy */ | ||
| 69 | #define OMAP_I2C_STAT_ROVR (1 << 11) /* Receive overrun */ | ||
| 70 | #define OMAP_I2C_STAT_XUDF (1 << 10) /* Transmit underflow */ | ||
| 71 | #define OMAP_I2C_STAT_AAS (1 << 9) /* Address as slave */ | ||
| 72 | #define OMAP_I2C_STAT_AD0 (1 << 8) /* Address zero */ | ||
| 73 | #define OMAP_I2C_STAT_XRDY (1 << 4) /* Transmit data ready */ | ||
| 74 | #define OMAP_I2C_STAT_RRDY (1 << 3) /* Receive data ready */ | ||
| 75 | #define OMAP_I2C_STAT_ARDY (1 << 2) /* Register access ready */ | ||
| 76 | #define OMAP_I2C_STAT_NACK (1 << 1) /* No ack interrupt enable */ | ||
| 77 | #define OMAP_I2C_STAT_AL (1 << 0) /* Arbitration lost int ena */ | ||
| 78 | |||
| 79 | /* I2C Buffer Configuration Register (OMAP_I2C_BUF): */ | ||
| 80 | #define OMAP_I2C_BUF_RDMA_EN (1 << 15) /* RX DMA channel enable */ | ||
| 81 | #define OMAP_I2C_BUF_XDMA_EN (1 << 7) /* TX DMA channel enable */ | ||
| 82 | |||
| 83 | /* I2C Configuration Register (OMAP_I2C_CON): */ | ||
| 84 | #define OMAP_I2C_CON_EN (1 << 15) /* I2C module enable */ | ||
| 85 | #define OMAP_I2C_CON_BE (1 << 14) /* Big endian mode */ | ||
| 86 | #define OMAP_I2C_CON_STB (1 << 11) /* Start byte mode (master) */ | ||
| 87 | #define OMAP_I2C_CON_MST (1 << 10) /* Master/slave mode */ | ||
| 88 | #define OMAP_I2C_CON_TRX (1 << 9) /* TX/RX mode (master only) */ | ||
| 89 | #define OMAP_I2C_CON_XA (1 << 8) /* Expand address */ | ||
| 90 | #define OMAP_I2C_CON_RM (1 << 2) /* Repeat mode (master only) */ | ||
| 91 | #define OMAP_I2C_CON_STP (1 << 1) /* Stop cond (master only) */ | ||
| 92 | #define OMAP_I2C_CON_STT (1 << 0) /* Start condition (master) */ | ||
| 93 | |||
| 94 | /* I2C System Test Register (OMAP_I2C_SYSTEST): */ | ||
| 95 | #ifdef DEBUG | ||
| 96 | #define OMAP_I2C_SYSTEST_ST_EN (1 << 15) /* System test enable */ | ||
| 97 | #define OMAP_I2C_SYSTEST_FREE (1 << 14) /* Free running mode */ | ||
| 98 | #define OMAP_I2C_SYSTEST_TMODE_MASK (3 << 12) /* Test mode select */ | ||
| 99 | #define OMAP_I2C_SYSTEST_TMODE_SHIFT (12) /* Test mode select */ | ||
| 100 | #define OMAP_I2C_SYSTEST_SCL_I (1 << 3) /* SCL line sense in */ | ||
| 101 | #define OMAP_I2C_SYSTEST_SCL_O (1 << 2) /* SCL line drive out */ | ||
| 102 | #define OMAP_I2C_SYSTEST_SDA_I (1 << 1) /* SDA line sense in */ | ||
| 103 | #define OMAP_I2C_SYSTEST_SDA_O (1 << 0) /* SDA line drive out */ | ||
| 104 | #endif | ||
| 105 | |||
| 106 | /* I2C System Status register (OMAP_I2C_SYSS): */ | ||
| 107 | #define OMAP_I2C_SYSS_RDONE (1 << 0) /* Reset Done */ | ||
| 108 | |||
| 109 | /* I2C System Configuration Register (OMAP_I2C_SYSC): */ | ||
| 110 | #define OMAP_I2C_SYSC_SRST (1 << 1) /* Soft Reset */ | ||
| 111 | |||
| 112 | /* REVISIT: Use platform_data instead of module parameters */ | ||
| 113 | /* Fast Mode = 400 kHz, Standard = 100 kHz */ | ||
| 114 | static int clock = 100; /* Default: 100 kHz */ | ||
| 115 | module_param(clock, int, 0); | ||
| 116 | MODULE_PARM_DESC(clock, "Set I2C clock in kHz: 400=fast mode (default == 100)"); | ||
| 117 | |||
| 118 | struct omap_i2c_dev { | ||
| 119 | struct device *dev; | ||
| 120 | void __iomem *base; /* virtual */ | ||
| 121 | int irq; | ||
| 122 | struct clk *iclk; /* Interface clock */ | ||
| 123 | struct clk *fclk; /* Functional clock */ | ||
| 124 | struct completion cmd_complete; | ||
| 125 | struct resource *ioarea; | ||
| 126 | u16 cmd_err; | ||
| 127 | u8 *buf; | ||
| 128 | size_t buf_len; | ||
| 129 | struct i2c_adapter adapter; | ||
| 130 | unsigned rev1:1; | ||
| 131 | }; | ||
| 132 | |||
| 133 | static inline void omap_i2c_write_reg(struct omap_i2c_dev *i2c_dev, | ||
| 134 | int reg, u16 val) | ||
| 135 | { | ||
| 136 | __raw_writew(val, i2c_dev->base + reg); | ||
| 137 | } | ||
| 138 | |||
| 139 | static inline u16 omap_i2c_read_reg(struct omap_i2c_dev *i2c_dev, int reg) | ||
| 140 | { | ||
| 141 | return __raw_readw(i2c_dev->base + reg); | ||
| 142 | } | ||
| 143 | |||
| 144 | static int omap_i2c_get_clocks(struct omap_i2c_dev *dev) | ||
| 145 | { | ||
| 146 | if (cpu_is_omap16xx() || cpu_is_omap24xx()) { | ||
| 147 | dev->iclk = clk_get(dev->dev, "i2c_ick"); | ||
| 148 | if (IS_ERR(dev->iclk)) { | ||
| 149 | dev->iclk = NULL; | ||
| 150 | return -ENODEV; | ||
| 151 | } | ||
| 152 | } | ||
| 153 | |||
| 154 | dev->fclk = clk_get(dev->dev, "i2c_fck"); | ||
| 155 | if (IS_ERR(dev->fclk)) { | ||
| 156 | if (dev->iclk != NULL) { | ||
| 157 | clk_put(dev->iclk); | ||
| 158 | dev->iclk = NULL; | ||
| 159 | } | ||
| 160 | dev->fclk = NULL; | ||
| 161 | return -ENODEV; | ||
| 162 | } | ||
| 163 | |||
| 164 | return 0; | ||
| 165 | } | ||
| 166 | |||
| 167 | static void omap_i2c_put_clocks(struct omap_i2c_dev *dev) | ||
| 168 | { | ||
| 169 | clk_put(dev->fclk); | ||
| 170 | dev->fclk = NULL; | ||
| 171 | if (dev->iclk != NULL) { | ||
| 172 | clk_put(dev->iclk); | ||
| 173 | dev->iclk = NULL; | ||
| 174 | } | ||
| 175 | } | ||
| 176 | |||
| 177 | static void omap_i2c_enable_clocks(struct omap_i2c_dev *dev) | ||
| 178 | { | ||
| 179 | if (dev->iclk != NULL) | ||
| 180 | clk_enable(dev->iclk); | ||
| 181 | clk_enable(dev->fclk); | ||
| 182 | } | ||
| 183 | |||
| 184 | static void omap_i2c_disable_clocks(struct omap_i2c_dev *dev) | ||
| 185 | { | ||
| 186 | if (dev->iclk != NULL) | ||
| 187 | clk_disable(dev->iclk); | ||
| 188 | clk_disable(dev->fclk); | ||
| 189 | } | ||
| 190 | |||
| 191 | static int omap_i2c_init(struct omap_i2c_dev *dev) | ||
| 192 | { | ||
| 193 | u16 psc = 0; | ||
| 194 | unsigned long fclk_rate = 12000000; | ||
| 195 | unsigned long timeout; | ||
| 196 | |||
| 197 | if (!dev->rev1) { | ||
| 198 | omap_i2c_write_reg(dev, OMAP_I2C_SYSC_REG, OMAP_I2C_SYSC_SRST); | ||
| 199 | /* For some reason we need to set the EN bit before the | ||
| 200 | * reset done bit gets set. */ | ||
| 201 | timeout = jiffies + OMAP_I2C_TIMEOUT; | ||
| 202 | omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, OMAP_I2C_CON_EN); | ||
| 203 | while (!(omap_i2c_read_reg(dev, OMAP_I2C_SYSS_REG) & | ||
| 204 | OMAP_I2C_SYSS_RDONE)) { | ||
| 205 | if (time_after(jiffies, timeout)) { | ||
| 206 | dev_warn(dev->dev, "timeout waiting" | ||
| 207 | "for controller reset\n"); | ||
| 208 | return -ETIMEDOUT; | ||
| 209 | } | ||
| 210 | msleep(1); | ||
| 211 | } | ||
| 212 | } | ||
| 213 | omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, 0); | ||
| 214 | |||
| 215 | if (cpu_class_is_omap1()) { | ||
| 216 | struct clk *armxor_ck; | ||
| 217 | |||
| 218 | armxor_ck = clk_get(NULL, "armxor_ck"); | ||
| 219 | if (IS_ERR(armxor_ck)) | ||
| 220 | dev_warn(dev->dev, "Could not get armxor_ck\n"); | ||
| 221 | else { | ||
| 222 | fclk_rate = clk_get_rate(armxor_ck); | ||
| 223 | clk_put(armxor_ck); | ||
| 224 | } | ||
| 225 | /* TRM for 5912 says the I2C clock must be prescaled to be | ||
| 226 | * between 7 - 12 MHz. The XOR input clock is typically | ||
| 227 | * 12, 13 or 19.2 MHz. So we should have code that produces: | ||
| 228 | * | ||
| 229 | * XOR MHz Divider Prescaler | ||
| 230 | * 12 1 0 | ||
| 231 | * 13 2 1 | ||
| 232 | * 19.2 2 1 | ||
| 233 | */ | ||
| 234 | if (fclk_rate > 12000000) | ||
| 235 | psc = fclk_rate / 12000000; | ||
| 236 | } | ||
| 237 | |||
| 238 | /* Setup clock prescaler to obtain approx 12MHz I2C module clock: */ | ||
| 239 | omap_i2c_write_reg(dev, OMAP_I2C_PSC_REG, psc); | ||
| 240 | |||
| 241 | /* Program desired operating rate */ | ||
| 242 | fclk_rate /= (psc + 1) * 1000; | ||
| 243 | if (psc > 2) | ||
| 244 | psc = 2; | ||
| 245 | |||
| 246 | omap_i2c_write_reg(dev, OMAP_I2C_SCLL_REG, | ||
| 247 | fclk_rate / (clock * 2) - 7 + psc); | ||
| 248 | omap_i2c_write_reg(dev, OMAP_I2C_SCLH_REG, | ||
| 249 | fclk_rate / (clock * 2) - 7 + psc); | ||
| 250 | |||
| 251 | /* Take the I2C module out of reset: */ | ||
| 252 | omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, OMAP_I2C_CON_EN); | ||
| 253 | |||
| 254 | /* Enable interrupts */ | ||
| 255 | omap_i2c_write_reg(dev, OMAP_I2C_IE_REG, | ||
| 256 | (OMAP_I2C_IE_XRDY | OMAP_I2C_IE_RRDY | | ||
| 257 | OMAP_I2C_IE_ARDY | OMAP_I2C_IE_NACK | | ||
| 258 | OMAP_I2C_IE_AL)); | ||
| 259 | return 0; | ||
| 260 | } | ||
| 261 | |||
| 262 | /* | ||
| 263 | * Waiting on Bus Busy | ||
| 264 | */ | ||
| 265 | static int omap_i2c_wait_for_bb(struct omap_i2c_dev *dev) | ||
| 266 | { | ||
| 267 | unsigned long timeout; | ||
| 268 | |||
| 269 | timeout = jiffies + OMAP_I2C_TIMEOUT; | ||
| 270 | while (omap_i2c_read_reg(dev, OMAP_I2C_STAT_REG) & OMAP_I2C_STAT_BB) { | ||
| 271 | if (time_after(jiffies, timeout)) { | ||
| 272 | dev_warn(dev->dev, "timeout waiting for bus ready\n"); | ||
| 273 | return -ETIMEDOUT; | ||
| 274 | } | ||
| 275 | msleep(1); | ||
| 276 | } | ||
| 277 | |||
| 278 | return 0; | ||
| 279 | } | ||
| 280 | |||
| 281 | /* | ||
| 282 | * Low level master read/write transaction. | ||
| 283 | */ | ||
| 284 | static int omap_i2c_xfer_msg(struct i2c_adapter *adap, | ||
| 285 | struct i2c_msg *msg, int stop) | ||
| 286 | { | ||
| 287 | struct omap_i2c_dev *dev = i2c_get_adapdata(adap); | ||
| 288 | int r; | ||
| 289 | u16 w; | ||
| 290 | |||
| 291 | dev_dbg(dev->dev, "addr: 0x%04x, len: %d, flags: 0x%x, stop: %d\n", | ||
| 292 | msg->addr, msg->len, msg->flags, stop); | ||
| 293 | |||
| 294 | if (msg->len == 0) | ||
| 295 | return -EINVAL; | ||
| 296 | |||
| 297 | omap_i2c_write_reg(dev, OMAP_I2C_SA_REG, msg->addr); | ||
| 298 | |||
| 299 | /* REVISIT: Could the STB bit of I2C_CON be used with probing? */ | ||
| 300 | dev->buf = msg->buf; | ||
| 301 | dev->buf_len = msg->len; | ||
| 302 | |||
| 303 | omap_i2c_write_reg(dev, OMAP_I2C_CNT_REG, dev->buf_len); | ||
| 304 | |||
| 305 | init_completion(&dev->cmd_complete); | ||
| 306 | dev->cmd_err = 0; | ||
| 307 | |||
| 308 | w = OMAP_I2C_CON_EN | OMAP_I2C_CON_MST | OMAP_I2C_CON_STT; | ||
| 309 | if (msg->flags & I2C_M_TEN) | ||
| 310 | w |= OMAP_I2C_CON_XA; | ||
| 311 | if (!(msg->flags & I2C_M_RD)) | ||
| 312 | w |= OMAP_I2C_CON_TRX; | ||
| 313 | if (stop) | ||
| 314 | w |= OMAP_I2C_CON_STP; | ||
| 315 | omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, w); | ||
| 316 | |||
| 317 | r = wait_for_completion_interruptible_timeout(&dev->cmd_complete, | ||
| 318 | OMAP_I2C_TIMEOUT); | ||
| 319 | dev->buf_len = 0; | ||
| 320 | if (r < 0) | ||
| 321 | return r; | ||
| 322 | if (r == 0) { | ||
| 323 | dev_err(dev->dev, "controller timed out\n"); | ||
| 324 | omap_i2c_init(dev); | ||
| 325 | return -ETIMEDOUT; | ||
| 326 | } | ||
| 327 | |||
| 328 | if (likely(!dev->cmd_err)) | ||
| 329 | return 0; | ||
| 330 | |||
| 331 | /* We have an error */ | ||
| 332 | if (dev->cmd_err & (OMAP_I2C_STAT_AL | OMAP_I2C_STAT_ROVR | | ||
| 333 | OMAP_I2C_STAT_XUDF)) { | ||
| 334 | omap_i2c_init(dev); | ||
| 335 | return -EIO; | ||
| 336 | } | ||
| 337 | |||
| 338 | if (dev->cmd_err & OMAP_I2C_STAT_NACK) { | ||
| 339 | if (msg->flags & I2C_M_IGNORE_NAK) | ||
| 340 | return 0; | ||
| 341 | if (stop) { | ||
| 342 | w = omap_i2c_read_reg(dev, OMAP_I2C_CON_REG); | ||
| 343 | w |= OMAP_I2C_CON_STP; | ||
| 344 | omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, w); | ||
| 345 | } | ||
| 346 | return -EREMOTEIO; | ||
| 347 | } | ||
| 348 | return -EIO; | ||
| 349 | } | ||
| 350 | |||
| 351 | |||
| 352 | /* | ||
| 353 | * Prepare controller for a transaction and call omap_i2c_xfer_msg | ||
| 354 | * to do the work during IRQ processing. | ||
| 355 | */ | ||
| 356 | static int | ||
| 357 | omap_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num) | ||
| 358 | { | ||
| 359 | struct omap_i2c_dev *dev = i2c_get_adapdata(adap); | ||
| 360 | int i; | ||
| 361 | int r; | ||
| 362 | |||
| 363 | omap_i2c_enable_clocks(dev); | ||
| 364 | |||
| 365 | /* REVISIT: initialize and use adap->retries. This is an optional | ||
| 366 | * feature */ | ||
| 367 | if ((r = omap_i2c_wait_for_bb(dev)) < 0) | ||
| 368 | goto out; | ||
| 369 | |||
| 370 | for (i = 0; i < num; i++) { | ||
| 371 | r = omap_i2c_xfer_msg(adap, &msgs[i], (i == (num - 1))); | ||
| 372 | if (r != 0) | ||
| 373 | break; | ||
| 374 | } | ||
| 375 | |||
| 376 | if (r == 0) | ||
| 377 | r = num; | ||
| 378 | out: | ||
| 379 | omap_i2c_disable_clocks(dev); | ||
| 380 | return r; | ||
| 381 | } | ||
| 382 | |||
| 383 | static u32 | ||
| 384 | omap_i2c_func(struct i2c_adapter *adap) | ||
| 385 | { | ||
| 386 | return I2C_FUNC_I2C | (I2C_FUNC_SMBUS_EMUL & ~I2C_FUNC_SMBUS_QUICK); | ||
| 387 | } | ||
| 388 | |||
| 389 | static inline void | ||
| 390 | omap_i2c_complete_cmd(struct omap_i2c_dev *dev, u16 err) | ||
| 391 | { | ||
| 392 | dev->cmd_err |= err; | ||
| 393 | complete(&dev->cmd_complete); | ||
| 394 | } | ||
| 395 | |||
| 396 | static inline void | ||
| 397 | omap_i2c_ack_stat(struct omap_i2c_dev *dev, u16 stat) | ||
| 398 | { | ||
| 399 | omap_i2c_write_reg(dev, OMAP_I2C_STAT_REG, stat); | ||
| 400 | } | ||
| 401 | |||
| 402 | static irqreturn_t | ||
| 403 | omap_i2c_rev1_isr(int this_irq, void *dev_id) | ||
| 404 | { | ||
| 405 | struct omap_i2c_dev *dev = dev_id; | ||
| 406 | u16 iv, w; | ||
| 407 | |||
| 408 | iv = omap_i2c_read_reg(dev, OMAP_I2C_IV_REG); | ||
| 409 | switch (iv) { | ||
| 410 | case 0x00: /* None */ | ||
| 411 | break; | ||
| 412 | case 0x01: /* Arbitration lost */ | ||
| 413 | dev_err(dev->dev, "Arbitration lost\n"); | ||
| 414 | omap_i2c_complete_cmd(dev, OMAP_I2C_STAT_AL); | ||
| 415 | break; | ||
| 416 | case 0x02: /* No acknowledgement */ | ||
| 417 | omap_i2c_complete_cmd(dev, OMAP_I2C_STAT_NACK); | ||
| 418 | omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, OMAP_I2C_CON_STP); | ||
| 419 | break; | ||
| 420 | case 0x03: /* Register access ready */ | ||
| 421 | omap_i2c_complete_cmd(dev, 0); | ||
| 422 | break; | ||
| 423 | case 0x04: /* Receive data ready */ | ||
| 424 | if (dev->buf_len) { | ||
| 425 | w = omap_i2c_read_reg(dev, OMAP_I2C_DATA_REG); | ||
| 426 | *dev->buf++ = w; | ||
| 427 | dev->buf_len--; | ||
| 428 | if (dev->buf_len) { | ||
| 429 | *dev->buf++ = w >> 8; | ||
| 430 | dev->buf_len--; | ||
| 431 | } | ||
| 432 | } else | ||
| 433 | dev_err(dev->dev, "RRDY IRQ while no data requested\n"); | ||
| 434 | break; | ||
| 435 | case 0x05: /* Transmit data ready */ | ||
| 436 | if (dev->buf_len) { | ||
| 437 | w = *dev->buf++; | ||
| 438 | dev->buf_len--; | ||
| 439 | if (dev->buf_len) { | ||
| 440 | w |= *dev->buf++ << 8; | ||
| 441 | dev->buf_len--; | ||
| 442 | } | ||
| 443 | omap_i2c_write_reg(dev, OMAP_I2C_DATA_REG, w); | ||
| 444 | } else | ||
| 445 | dev_err(dev->dev, "XRDY IRQ while no data to send\n"); | ||
| 446 | break; | ||
| 447 | default: | ||
| 448 | return IRQ_NONE; | ||
| 449 | } | ||
| 450 | |||
| 451 | return IRQ_HANDLED; | ||
| 452 | } | ||
| 453 | |||
| 454 | static irqreturn_t | ||
| 455 | omap_i2c_isr(int this_irq, void *dev_id) | ||
| 456 | { | ||
| 457 | struct omap_i2c_dev *dev = dev_id; | ||
| 458 | u16 bits; | ||
| 459 | u16 stat, w; | ||
| 460 | int count = 0; | ||
| 461 | |||
| 462 | bits = omap_i2c_read_reg(dev, OMAP_I2C_IE_REG); | ||
| 463 | while ((stat = (omap_i2c_read_reg(dev, OMAP_I2C_STAT_REG))) & bits) { | ||
| 464 | dev_dbg(dev->dev, "IRQ (ISR = 0x%04x)\n", stat); | ||
| 465 | if (count++ == 100) { | ||
| 466 | dev_warn(dev->dev, "Too much work in one IRQ\n"); | ||
| 467 | break; | ||
| 468 | } | ||
| 469 | |||
| 470 | omap_i2c_write_reg(dev, OMAP_I2C_STAT_REG, stat); | ||
| 471 | |||
| 472 | if (stat & OMAP_I2C_STAT_ARDY) { | ||
| 473 | omap_i2c_complete_cmd(dev, 0); | ||
| 474 | continue; | ||
| 475 | } | ||
| 476 | if (stat & OMAP_I2C_STAT_RRDY) { | ||
| 477 | w = omap_i2c_read_reg(dev, OMAP_I2C_DATA_REG); | ||
| 478 | if (dev->buf_len) { | ||
| 479 | *dev->buf++ = w; | ||
| 480 | dev->buf_len--; | ||
| 481 | if (dev->buf_len) { | ||
| 482 | *dev->buf++ = w >> 8; | ||
| 483 | dev->buf_len--; | ||
| 484 | } | ||
| 485 | } else | ||
| 486 | dev_err(dev->dev, "RRDY IRQ while no data" | ||
| 487 | "requested\n"); | ||
| 488 | omap_i2c_ack_stat(dev, OMAP_I2C_STAT_RRDY); | ||
| 489 | continue; | ||
| 490 | } | ||
| 491 | if (stat & OMAP_I2C_STAT_XRDY) { | ||
| 492 | w = 0; | ||
| 493 | if (dev->buf_len) { | ||
| 494 | w = *dev->buf++; | ||
| 495 | dev->buf_len--; | ||
| 496 | if (dev->buf_len) { | ||
| 497 | w |= *dev->buf++ << 8; | ||
| 498 | dev->buf_len--; | ||
| 499 | } | ||
| 500 | } else | ||
| 501 | dev_err(dev->dev, "XRDY IRQ while no" | ||
| 502 | "data to send\n"); | ||
| 503 | omap_i2c_write_reg(dev, OMAP_I2C_DATA_REG, w); | ||
| 504 | omap_i2c_ack_stat(dev, OMAP_I2C_STAT_XRDY); | ||
| 505 | continue; | ||
| 506 | } | ||
| 507 | if (stat & OMAP_I2C_STAT_ROVR) { | ||
| 508 | dev_err(dev->dev, "Receive overrun\n"); | ||
| 509 | dev->cmd_err |= OMAP_I2C_STAT_ROVR; | ||
| 510 | } | ||
| 511 | if (stat & OMAP_I2C_STAT_XUDF) { | ||
| 512 | dev_err(dev->dev, "Transmit overflow\n"); | ||
| 513 | dev->cmd_err |= OMAP_I2C_STAT_XUDF; | ||
| 514 | } | ||
| 515 | if (stat & OMAP_I2C_STAT_NACK) { | ||
| 516 | omap_i2c_complete_cmd(dev, OMAP_I2C_STAT_NACK); | ||
| 517 | omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, | ||
| 518 | OMAP_I2C_CON_STP); | ||
| 519 | } | ||
| 520 | if (stat & OMAP_I2C_STAT_AL) { | ||
| 521 | dev_err(dev->dev, "Arbitration lost\n"); | ||
| 522 | omap_i2c_complete_cmd(dev, OMAP_I2C_STAT_AL); | ||
| 523 | } | ||
| 524 | } | ||
| 525 | |||
| 526 | return count ? IRQ_HANDLED : IRQ_NONE; | ||
| 527 | } | ||
| 528 | |||
| 529 | static const struct i2c_algorithm omap_i2c_algo = { | ||
| 530 | .master_xfer = omap_i2c_xfer, | ||
| 531 | .functionality = omap_i2c_func, | ||
| 532 | }; | ||
| 533 | |||
| 534 | static int | ||
| 535 | omap_i2c_probe(struct platform_device *pdev) | ||
| 536 | { | ||
| 537 | struct omap_i2c_dev *dev; | ||
| 538 | struct i2c_adapter *adap; | ||
| 539 | struct resource *mem, *irq, *ioarea; | ||
| 540 | int r; | ||
| 541 | |||
| 542 | /* NOTE: driver uses the static register mapping */ | ||
| 543 | mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
| 544 | if (!mem) { | ||
| 545 | dev_err(&pdev->dev, "no mem resource?\n"); | ||
| 546 | return -ENODEV; | ||
| 547 | } | ||
| 548 | irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0); | ||
| 549 | if (!irq) { | ||
| 550 | dev_err(&pdev->dev, "no irq resource?\n"); | ||
| 551 | return -ENODEV; | ||
| 552 | } | ||
| 553 | |||
| 554 | ioarea = request_mem_region(mem->start, (mem->end - mem->start) + 1, | ||
| 555 | pdev->name); | ||
| 556 | if (!ioarea) { | ||
| 557 | dev_err(&pdev->dev, "I2C region already claimed\n"); | ||
| 558 | return -EBUSY; | ||
| 559 | } | ||
| 560 | |||
| 561 | if (clock > 200) | ||
| 562 | clock = 400; /* Fast mode */ | ||
| 563 | else | ||
| 564 | clock = 100; /* Standard mode */ | ||
| 565 | |||
| 566 | dev = kzalloc(sizeof(struct omap_i2c_dev), GFP_KERNEL); | ||
| 567 | if (!dev) { | ||
| 568 | r = -ENOMEM; | ||
| 569 | goto err_release_region; | ||
| 570 | } | ||
| 571 | |||
| 572 | dev->dev = &pdev->dev; | ||
| 573 | dev->irq = irq->start; | ||
| 574 | dev->base = (void __iomem *) IO_ADDRESS(mem->start); | ||
| 575 | platform_set_drvdata(pdev, dev); | ||
| 576 | |||
| 577 | if ((r = omap_i2c_get_clocks(dev)) != 0) | ||
| 578 | goto err_free_mem; | ||
| 579 | |||
| 580 | omap_i2c_enable_clocks(dev); | ||
| 581 | |||
| 582 | if (cpu_is_omap15xx()) | ||
| 583 | dev->rev1 = omap_i2c_read_reg(dev, OMAP_I2C_REV_REG) < 0x20; | ||
| 584 | |||
| 585 | /* reset ASAP, clearing any IRQs */ | ||
| 586 | omap_i2c_init(dev); | ||
| 587 | |||
| 588 | r = request_irq(dev->irq, dev->rev1 ? omap_i2c_rev1_isr : omap_i2c_isr, | ||
| 589 | 0, pdev->name, dev); | ||
| 590 | |||
| 591 | if (r) { | ||
| 592 | dev_err(dev->dev, "failure requesting irq %i\n", dev->irq); | ||
| 593 | goto err_unuse_clocks; | ||
| 594 | } | ||
| 595 | r = omap_i2c_read_reg(dev, OMAP_I2C_REV_REG) & 0xff; | ||
| 596 | dev_info(dev->dev, "bus %d rev%d.%d at %d kHz\n", | ||
| 597 | pdev->id, r >> 4, r & 0xf, clock); | ||
| 598 | |||
| 599 | adap = &dev->adapter; | ||
| 600 | i2c_set_adapdata(adap, dev); | ||
| 601 | adap->owner = THIS_MODULE; | ||
| 602 | adap->class = I2C_CLASS_HWMON; | ||
| 603 | strncpy(adap->name, "OMAP I2C adapter", sizeof(adap->name)); | ||
| 604 | adap->algo = &omap_i2c_algo; | ||
| 605 | adap->dev.parent = &pdev->dev; | ||
| 606 | |||
| 607 | /* i2c device drivers may be active on return from add_adapter() */ | ||
| 608 | r = i2c_add_adapter(adap); | ||
| 609 | if (r) { | ||
| 610 | dev_err(dev->dev, "failure adding adapter\n"); | ||
| 611 | goto err_free_irq; | ||
| 612 | } | ||
| 613 | |||
| 614 | omap_i2c_disable_clocks(dev); | ||
| 615 | |||
| 616 | return 0; | ||
| 617 | |||
| 618 | err_free_irq: | ||
| 619 | free_irq(dev->irq, dev); | ||
| 620 | err_unuse_clocks: | ||
| 621 | omap_i2c_disable_clocks(dev); | ||
| 622 | omap_i2c_put_clocks(dev); | ||
| 623 | err_free_mem: | ||
| 624 | platform_set_drvdata(pdev, NULL); | ||
| 625 | kfree(dev); | ||
| 626 | err_release_region: | ||
| 627 | omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, 0); | ||
| 628 | release_mem_region(mem->start, (mem->end - mem->start) + 1); | ||
| 629 | |||
| 630 | return r; | ||
| 631 | } | ||
| 632 | |||
| 633 | static int | ||
| 634 | omap_i2c_remove(struct platform_device *pdev) | ||
| 635 | { | ||
| 636 | struct omap_i2c_dev *dev = platform_get_drvdata(pdev); | ||
| 637 | struct resource *mem; | ||
| 638 | |||
| 639 | platform_set_drvdata(pdev, NULL); | ||
| 640 | |||
| 641 | free_irq(dev->irq, dev); | ||
| 642 | i2c_del_adapter(&dev->adapter); | ||
| 643 | omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, 0); | ||
| 644 | omap_i2c_put_clocks(dev); | ||
| 645 | kfree(dev); | ||
| 646 | mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
| 647 | release_mem_region(mem->start, (mem->end - mem->start) + 1); | ||
| 648 | return 0; | ||
| 649 | } | ||
| 650 | |||
| 651 | static struct platform_driver omap_i2c_driver = { | ||
| 652 | .probe = omap_i2c_probe, | ||
| 653 | .remove = omap_i2c_remove, | ||
| 654 | .driver = { | ||
| 655 | .name = "i2c_omap", | ||
| 656 | .owner = THIS_MODULE, | ||
| 657 | }, | ||
| 658 | }; | ||
| 659 | |||
| 660 | /* I2C may be needed to bring up other drivers */ | ||
| 661 | static int __init | ||
| 662 | omap_i2c_init_driver(void) | ||
| 663 | { | ||
| 664 | return platform_driver_register(&omap_i2c_driver); | ||
| 665 | } | ||
| 666 | subsys_initcall(omap_i2c_init_driver); | ||
| 667 | |||
| 668 | static void __exit omap_i2c_exit_driver(void) | ||
| 669 | { | ||
| 670 | platform_driver_unregister(&omap_i2c_driver); | ||
| 671 | } | ||
| 672 | module_exit(omap_i2c_exit_driver); | ||
| 673 | |||
| 674 | MODULE_AUTHOR("MontaVista Software, Inc. (and others)"); | ||
| 675 | MODULE_DESCRIPTION("TI OMAP I2C bus adapter"); | ||
| 676 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/i2c/busses/i2c-parport-light.c b/drivers/i2c/busses/i2c-parport-light.c index e09ebbb2f9f0..4bc42810b9aa 100644 --- a/drivers/i2c/busses/i2c-parport-light.c +++ b/drivers/i2c/busses/i2c-parport-light.c | |||
| @@ -103,7 +103,6 @@ static struct i2c_algo_bit_data parport_algo_data = { | |||
| 103 | .getsda = parport_getsda, | 103 | .getsda = parport_getsda, |
| 104 | .getscl = parport_getscl, | 104 | .getscl = parport_getscl, |
| 105 | .udelay = 50, | 105 | .udelay = 50, |
| 106 | .mdelay = 50, | ||
| 107 | .timeout = HZ, | 106 | .timeout = HZ, |
| 108 | }; | 107 | }; |
| 109 | 108 | ||
| @@ -164,7 +163,7 @@ static void __exit i2c_parport_exit(void) | |||
| 164 | if (adapter_parm[type].init.val) | 163 | if (adapter_parm[type].init.val) |
| 165 | line_set(0, &adapter_parm[type].init); | 164 | line_set(0, &adapter_parm[type].init); |
| 166 | 165 | ||
| 167 | i2c_bit_del_bus(&parport_adapter); | 166 | i2c_del_adapter(&parport_adapter); |
| 168 | release_region(base, 3); | 167 | release_region(base, 3); |
| 169 | } | 168 | } |
| 170 | 169 | ||
diff --git a/drivers/i2c/busses/i2c-parport.c b/drivers/i2c/busses/i2c-parport.c index 934bd55bae15..66696a40c7b5 100644 --- a/drivers/i2c/busses/i2c-parport.c +++ b/drivers/i2c/busses/i2c-parport.c | |||
| @@ -138,7 +138,6 @@ static struct i2c_algo_bit_data parport_algo_data = { | |||
| 138 | .getsda = parport_getsda, | 138 | .getsda = parport_getsda, |
| 139 | .getscl = parport_getscl, | 139 | .getscl = parport_getscl, |
| 140 | .udelay = 60, | 140 | .udelay = 60, |
| 141 | .mdelay = 60, | ||
| 142 | .timeout = HZ, | 141 | .timeout = HZ, |
| 143 | }; | 142 | }; |
| 144 | 143 | ||
| @@ -219,7 +218,7 @@ static void i2c_parport_detach (struct parport *port) | |||
| 219 | if (adapter_parm[type].init.val) | 218 | if (adapter_parm[type].init.val) |
| 220 | line_set(port, 0, &adapter_parm[type].init); | 219 | line_set(port, 0, &adapter_parm[type].init); |
| 221 | 220 | ||
| 222 | i2c_bit_del_bus(&adapter->adapter); | 221 | i2c_del_adapter(&adapter->adapter); |
| 223 | parport_unregister_device(adapter->pdev); | 222 | parport_unregister_device(adapter->pdev); |
| 224 | if (prev) | 223 | if (prev) |
| 225 | prev->next = adapter->next; | 224 | prev->next = adapter->next; |
diff --git a/drivers/i2c/busses/i2c-pca-isa.c b/drivers/i2c/busses/i2c-pca-isa.c index d9b4ddbad7e0..cc6536a19eca 100644 --- a/drivers/i2c/busses/i2c-pca-isa.c +++ b/drivers/i2c/busses/i2c-pca-isa.c | |||
| @@ -99,7 +99,7 @@ static int pca_isa_waitforinterrupt(struct i2c_algo_pca_data *adap) | |||
| 99 | return ret; | 99 | return ret; |
| 100 | } | 100 | } |
| 101 | 101 | ||
| 102 | static irqreturn_t pca_handler(int this_irq, void *dev_id, struct pt_regs *regs) { | 102 | static irqreturn_t pca_handler(int this_irq, void *dev_id) { |
| 103 | wake_up_interruptible(&pca_wait); | 103 | wake_up_interruptible(&pca_wait); |
| 104 | return IRQ_HANDLED; | 104 | return IRQ_HANDLED; |
| 105 | } | 105 | } |
| @@ -156,7 +156,7 @@ static int __init pca_isa_init(void) | |||
| 156 | 156 | ||
| 157 | static void pca_isa_exit(void) | 157 | static void pca_isa_exit(void) |
| 158 | { | 158 | { |
| 159 | i2c_pca_del_bus(&pca_isa_ops); | 159 | i2c_del_adapter(&pca_isa_ops); |
| 160 | 160 | ||
| 161 | if (irq > 0) { | 161 | if (irq > 0) { |
| 162 | disable_irq(irq); | 162 | disable_irq(irq); |
diff --git a/drivers/i2c/busses/i2c-piix4.c b/drivers/i2c/busses/i2c-piix4.c index 8f2f65b793b9..30c7a1b38cbd 100644 --- a/drivers/i2c/busses/i2c-piix4.c +++ b/drivers/i2c/busses/i2c-piix4.c | |||
| @@ -376,7 +376,7 @@ static u32 piix4_func(struct i2c_adapter *adapter) | |||
| 376 | I2C_FUNC_SMBUS_BLOCK_DATA; | 376 | I2C_FUNC_SMBUS_BLOCK_DATA; |
| 377 | } | 377 | } |
| 378 | 378 | ||
| 379 | static struct i2c_algorithm smbus_algorithm = { | 379 | static const struct i2c_algorithm smbus_algorithm = { |
| 380 | .smbus_xfer = piix4_access, | 380 | .smbus_xfer = piix4_access, |
| 381 | .functionality = piix4_func, | 381 | .functionality = piix4_func, |
| 382 | }; | 382 | }; |
diff --git a/drivers/i2c/busses/i2c-pnx.c b/drivers/i2c/busses/i2c-pnx.c new file mode 100644 index 000000000000..de0bca77e926 --- /dev/null +++ b/drivers/i2c/busses/i2c-pnx.c | |||
| @@ -0,0 +1,708 @@ | |||
| 1 | /* | ||
| 2 | * Provides I2C support for Philips PNX010x/PNX4008 boards. | ||
| 3 | * | ||
| 4 | * Authors: Dennis Kovalev <dkovalev@ru.mvista.com> | ||
| 5 | * Vitaly Wool <vwool@ru.mvista.com> | ||
| 6 | * | ||
| 7 | * 2004-2006 (c) MontaVista Software, Inc. This file is licensed under | ||
| 8 | * the terms of the GNU General Public License version 2. This program | ||
| 9 | * is licensed "as is" without any warranty of any kind, whether express | ||
| 10 | * or implied. | ||
| 11 | */ | ||
| 12 | |||
| 13 | #include <linux/module.h> | ||
| 14 | #include <linux/interrupt.h> | ||
| 15 | #include <linux/ioport.h> | ||
| 16 | #include <linux/delay.h> | ||
| 17 | #include <linux/i2c.h> | ||
| 18 | #include <linux/timer.h> | ||
| 19 | #include <linux/completion.h> | ||
| 20 | #include <linux/platform_device.h> | ||
| 21 | #include <linux/i2c-pnx.h> | ||
| 22 | #include <asm/hardware.h> | ||
| 23 | #include <asm/irq.h> | ||
| 24 | #include <asm/uaccess.h> | ||
| 25 | |||
| 26 | #define I2C_PNX_TIMEOUT 10 /* msec */ | ||
| 27 | #define I2C_PNX_SPEED_KHZ 100 | ||
| 28 | #define I2C_PNX_REGION_SIZE 0x100 | ||
| 29 | #define PNX_DEFAULT_FREQ 13 /* MHz */ | ||
| 30 | |||
| 31 | static inline int wait_timeout(long timeout, struct i2c_pnx_algo_data *data) | ||
| 32 | { | ||
| 33 | while (timeout > 0 && | ||
| 34 | (ioread32(I2C_REG_STS(data)) & mstatus_active)) { | ||
| 35 | mdelay(1); | ||
| 36 | timeout--; | ||
| 37 | } | ||
| 38 | return (timeout <= 0); | ||
| 39 | } | ||
| 40 | |||
| 41 | static inline int wait_reset(long timeout, struct i2c_pnx_algo_data *data) | ||
| 42 | { | ||
| 43 | while (timeout > 0 && | ||
| 44 | (ioread32(I2C_REG_CTL(data)) & mcntrl_reset)) { | ||
| 45 | mdelay(1); | ||
| 46 | timeout--; | ||
| 47 | } | ||
| 48 | return (timeout <= 0); | ||
| 49 | } | ||
| 50 | |||
| 51 | static inline void i2c_pnx_arm_timer(struct i2c_adapter *adap) | ||
| 52 | { | ||
| 53 | struct i2c_pnx_algo_data *data = adap->algo_data; | ||
| 54 | struct timer_list *timer = &data->mif.timer; | ||
| 55 | int expires = I2C_PNX_TIMEOUT / (1000 / HZ); | ||
| 56 | |||
| 57 | del_timer_sync(timer); | ||
| 58 | |||
| 59 | dev_dbg(&adap->dev, "Timer armed at %lu plus %u jiffies.\n", | ||
| 60 | jiffies, expires); | ||
| 61 | |||
| 62 | timer->expires = jiffies + expires; | ||
| 63 | timer->data = (unsigned long)adap; | ||
| 64 | |||
| 65 | add_timer(timer); | ||
| 66 | } | ||
| 67 | |||
| 68 | /** | ||
| 69 | * i2c_pnx_start - start a device | ||
| 70 | * @slave_addr: slave address | ||
| 71 | * @adap: pointer to adapter structure | ||
| 72 | * | ||
| 73 | * Generate a START signal in the desired mode. | ||
| 74 | */ | ||
| 75 | static int i2c_pnx_start(unsigned char slave_addr, struct i2c_adapter *adap) | ||
| 76 | { | ||
| 77 | struct i2c_pnx_algo_data *alg_data = adap->algo_data; | ||
| 78 | |||
| 79 | dev_dbg(&adap->dev, "%s(): addr 0x%x mode %d\n", __FUNCTION__, | ||
| 80 | slave_addr, alg_data->mif.mode); | ||
| 81 | |||
| 82 | /* Check for 7 bit slave addresses only */ | ||
| 83 | if (slave_addr & ~0x7f) { | ||
| 84 | dev_err(&adap->dev, "%s: Invalid slave address %x. " | ||
| 85 | "Only 7-bit addresses are supported\n", | ||
| 86 | adap->name, slave_addr); | ||
| 87 | return -EINVAL; | ||
| 88 | } | ||
| 89 | |||
| 90 | /* First, make sure bus is idle */ | ||
| 91 | if (wait_timeout(I2C_PNX_TIMEOUT, alg_data)) { | ||
| 92 | /* Somebody else is monopolizing the bus */ | ||
| 93 | dev_err(&adap->dev, "%s: Bus busy. Slave addr = %02x, " | ||
| 94 | "cntrl = %x, stat = %x\n", | ||
| 95 | adap->name, slave_addr, | ||
| 96 | ioread32(I2C_REG_CTL(alg_data)), | ||
| 97 | ioread32(I2C_REG_STS(alg_data))); | ||
| 98 | return -EBUSY; | ||
| 99 | } else if (ioread32(I2C_REG_STS(alg_data)) & mstatus_afi) { | ||
| 100 | /* Sorry, we lost the bus */ | ||
| 101 | dev_err(&adap->dev, "%s: Arbitration failure. " | ||
| 102 | "Slave addr = %02x\n", adap->name, slave_addr); | ||
| 103 | return -EIO; | ||
| 104 | } | ||
| 105 | |||
| 106 | /* | ||
| 107 | * OK, I2C is enabled and we have the bus. | ||
| 108 | * Clear the current TDI and AFI status flags. | ||
| 109 | */ | ||
| 110 | iowrite32(ioread32(I2C_REG_STS(alg_data)) | mstatus_tdi | mstatus_afi, | ||
| 111 | I2C_REG_STS(alg_data)); | ||
| 112 | |||
| 113 | dev_dbg(&adap->dev, "%s(): sending %#x\n", __FUNCTION__, | ||
| 114 | (slave_addr << 1) | start_bit | alg_data->mif.mode); | ||
| 115 | |||
| 116 | /* Write the slave address, START bit and R/W bit */ | ||
| 117 | iowrite32((slave_addr << 1) | start_bit | alg_data->mif.mode, | ||
| 118 | I2C_REG_TX(alg_data)); | ||
| 119 | |||
| 120 | dev_dbg(&adap->dev, "%s(): exit\n", __FUNCTION__); | ||
| 121 | |||
| 122 | return 0; | ||
| 123 | } | ||
| 124 | |||
| 125 | /** | ||
| 126 | * i2c_pnx_stop - stop a device | ||
| 127 | * @adap: pointer to I2C adapter structure | ||
| 128 | * | ||
| 129 | * Generate a STOP signal to terminate the master transaction. | ||
| 130 | */ | ||
| 131 | static void i2c_pnx_stop(struct i2c_adapter *adap) | ||
| 132 | { | ||
| 133 | struct i2c_pnx_algo_data *alg_data = adap->algo_data; | ||
| 134 | /* Only 1 msec max timeout due to interrupt context */ | ||
| 135 | long timeout = 1000; | ||
| 136 | |||
| 137 | dev_dbg(&adap->dev, "%s(): entering: stat = %04x.\n", | ||
| 138 | __FUNCTION__, ioread32(I2C_REG_STS(alg_data))); | ||
| 139 | |||
| 140 | /* Write a STOP bit to TX FIFO */ | ||
| 141 | iowrite32(0xff | stop_bit, I2C_REG_TX(alg_data)); | ||
| 142 | |||
| 143 | /* Wait until the STOP is seen. */ | ||
| 144 | while (timeout > 0 && | ||
| 145 | (ioread32(I2C_REG_STS(alg_data)) & mstatus_active)) { | ||
| 146 | /* may be called from interrupt context */ | ||
| 147 | udelay(1); | ||
| 148 | timeout--; | ||
| 149 | } | ||
| 150 | |||
| 151 | dev_dbg(&adap->dev, "%s(): exiting: stat = %04x.\n", | ||
| 152 | __FUNCTION__, ioread32(I2C_REG_STS(alg_data))); | ||
| 153 | } | ||
| 154 | |||
| 155 | /** | ||
| 156 | * i2c_pnx_master_xmit - transmit data to slave | ||
| 157 | * @adap: pointer to I2C adapter structure | ||
| 158 | * | ||
| 159 | * Sends one byte of data to the slave | ||
| 160 | */ | ||
| 161 | static int i2c_pnx_master_xmit(struct i2c_adapter *adap) | ||
| 162 | { | ||
| 163 | struct i2c_pnx_algo_data *alg_data = adap->algo_data; | ||
| 164 | u32 val; | ||
| 165 | |||
| 166 | dev_dbg(&adap->dev, "%s(): entering: stat = %04x.\n", | ||
| 167 | __FUNCTION__, ioread32(I2C_REG_STS(alg_data))); | ||
| 168 | |||
| 169 | if (alg_data->mif.len > 0) { | ||
| 170 | /* We still have something to talk about... */ | ||
| 171 | val = *alg_data->mif.buf++; | ||
| 172 | |||
| 173 | if (alg_data->mif.len == 1) { | ||
| 174 | val |= stop_bit; | ||
| 175 | if (!alg_data->last) | ||
| 176 | val |= start_bit; | ||
| 177 | } | ||
| 178 | |||
| 179 | alg_data->mif.len--; | ||
| 180 | iowrite32(val, I2C_REG_TX(alg_data)); | ||
| 181 | |||
| 182 | dev_dbg(&adap->dev, "%s(): xmit %#x [%d]\n", __FUNCTION__, | ||
| 183 | val, alg_data->mif.len + 1); | ||
| 184 | |||
| 185 | if (alg_data->mif.len == 0) { | ||
| 186 | if (alg_data->last) { | ||
| 187 | /* Wait until the STOP is seen. */ | ||
| 188 | if (wait_timeout(I2C_PNX_TIMEOUT, alg_data)) | ||
| 189 | dev_err(&adap->dev, "The bus is still " | ||
| 190 | "active after timeout\n"); | ||
| 191 | } | ||
| 192 | /* Disable master interrupts */ | ||
| 193 | iowrite32(ioread32(I2C_REG_CTL(alg_data)) & | ||
| 194 | ~(mcntrl_afie | mcntrl_naie | mcntrl_drmie), | ||
| 195 | I2C_REG_CTL(alg_data)); | ||
| 196 | |||
| 197 | del_timer_sync(&alg_data->mif.timer); | ||
| 198 | |||
| 199 | dev_dbg(&adap->dev, "%s(): Waking up xfer routine.\n", | ||
| 200 | __FUNCTION__); | ||
| 201 | |||
| 202 | complete(&alg_data->mif.complete); | ||
| 203 | } | ||
| 204 | } else if (alg_data->mif.len == 0) { | ||
| 205 | /* zero-sized transfer */ | ||
| 206 | i2c_pnx_stop(adap); | ||
| 207 | |||
| 208 | /* Disable master interrupts. */ | ||
| 209 | iowrite32(ioread32(I2C_REG_CTL(alg_data)) & | ||
| 210 | ~(mcntrl_afie | mcntrl_naie | mcntrl_drmie), | ||
| 211 | I2C_REG_CTL(alg_data)); | ||
| 212 | |||
| 213 | /* Stop timer. */ | ||
| 214 | del_timer_sync(&alg_data->mif.timer); | ||
| 215 | dev_dbg(&adap->dev, "%s(): Waking up xfer routine after " | ||
| 216 | "zero-xfer.\n", __FUNCTION__); | ||
| 217 | |||
| 218 | complete(&alg_data->mif.complete); | ||
| 219 | } | ||
| 220 | |||
| 221 | dev_dbg(&adap->dev, "%s(): exiting: stat = %04x.\n", | ||
| 222 | __FUNCTION__, ioread32(I2C_REG_STS(alg_data))); | ||
| 223 | |||
| 224 | return 0; | ||
| 225 | } | ||
| 226 | |||
| 227 | /** | ||
| 228 | * i2c_pnx_master_rcv - receive data from slave | ||
| 229 | * @adap: pointer to I2C adapter structure | ||
| 230 | * | ||
| 231 | * Reads one byte data from the slave | ||
| 232 | */ | ||
| 233 | static int i2c_pnx_master_rcv(struct i2c_adapter *adap) | ||
| 234 | { | ||
| 235 | struct i2c_pnx_algo_data *alg_data = adap->algo_data; | ||
| 236 | unsigned int val = 0; | ||
| 237 | u32 ctl = 0; | ||
| 238 | |||
| 239 | dev_dbg(&adap->dev, "%s(): entering: stat = %04x.\n", | ||
| 240 | __FUNCTION__, ioread32(I2C_REG_STS(alg_data))); | ||
| 241 | |||
| 242 | /* Check, whether there is already data, | ||
| 243 | * or we didn't 'ask' for it yet. | ||
| 244 | */ | ||
| 245 | if (ioread32(I2C_REG_STS(alg_data)) & mstatus_rfe) { | ||
| 246 | dev_dbg(&adap->dev, "%s(): Write dummy data to fill " | ||
| 247 | "Rx-fifo...\n", __FUNCTION__); | ||
| 248 | |||
| 249 | if (alg_data->mif.len == 1) { | ||
| 250 | /* Last byte, do not acknowledge next rcv. */ | ||
| 251 | val |= stop_bit; | ||
| 252 | if (!alg_data->last) | ||
| 253 | val |= start_bit; | ||
| 254 | |||
| 255 | /* | ||
| 256 | * Enable interrupt RFDAIE (data in Rx fifo), | ||
| 257 | * and disable DRMIE (need data for Tx) | ||
| 258 | */ | ||
| 259 | ctl = ioread32(I2C_REG_CTL(alg_data)); | ||
| 260 | ctl |= mcntrl_rffie | mcntrl_daie; | ||
| 261 | ctl &= ~mcntrl_drmie; | ||
| 262 | iowrite32(ctl, I2C_REG_CTL(alg_data)); | ||
| 263 | } | ||
| 264 | |||
| 265 | /* | ||
| 266 | * Now we'll 'ask' for data: | ||
| 267 | * For each byte we want to receive, we must | ||
| 268 | * write a (dummy) byte to the Tx-FIFO. | ||
| 269 | */ | ||
| 270 | iowrite32(val, I2C_REG_TX(alg_data)); | ||
| 271 | |||
| 272 | return 0; | ||
| 273 | } | ||
| 274 | |||
| 275 | /* Handle data. */ | ||
| 276 | if (alg_data->mif.len > 0) { | ||
| 277 | val = ioread32(I2C_REG_RX(alg_data)); | ||
| 278 | *alg_data->mif.buf++ = (u8) (val & 0xff); | ||
| 279 | dev_dbg(&adap->dev, "%s(): rcv 0x%x [%d]\n", __FUNCTION__, val, | ||
| 280 | alg_data->mif.len); | ||
| 281 | |||
| 282 | alg_data->mif.len--; | ||
| 283 | if (alg_data->mif.len == 0) { | ||
| 284 | if (alg_data->last) | ||
| 285 | /* Wait until the STOP is seen. */ | ||
| 286 | if (wait_timeout(I2C_PNX_TIMEOUT, alg_data)) | ||
| 287 | dev_err(&adap->dev, "The bus is still " | ||
| 288 | "active after timeout\n"); | ||
| 289 | |||
| 290 | /* Disable master interrupts */ | ||
| 291 | ctl = ioread32(I2C_REG_CTL(alg_data)); | ||
| 292 | ctl &= ~(mcntrl_afie | mcntrl_naie | mcntrl_rffie | | ||
| 293 | mcntrl_drmie | mcntrl_daie); | ||
| 294 | iowrite32(ctl, I2C_REG_CTL(alg_data)); | ||
| 295 | |||
| 296 | /* Kill timer. */ | ||
| 297 | del_timer_sync(&alg_data->mif.timer); | ||
| 298 | complete(&alg_data->mif.complete); | ||
| 299 | } | ||
| 300 | } | ||
| 301 | |||
| 302 | dev_dbg(&adap->dev, "%s(): exiting: stat = %04x.\n", | ||
| 303 | __FUNCTION__, ioread32(I2C_REG_STS(alg_data))); | ||
| 304 | |||
| 305 | return 0; | ||
| 306 | } | ||
| 307 | |||
| 308 | static irqreturn_t | ||
| 309 | i2c_pnx_interrupt(int irq, void *dev_id, struct pt_regs *regs) | ||
| 310 | { | ||
| 311 | u32 stat, ctl; | ||
| 312 | struct i2c_adapter *adap = dev_id; | ||
| 313 | struct i2c_pnx_algo_data *alg_data = adap->algo_data; | ||
| 314 | |||
| 315 | dev_dbg(&adap->dev, "%s(): mstat = %x mctrl = %x, mode = %d\n", | ||
| 316 | __FUNCTION__, | ||
| 317 | ioread32(I2C_REG_STS(alg_data)), | ||
| 318 | ioread32(I2C_REG_CTL(alg_data)), | ||
| 319 | alg_data->mif.mode); | ||
| 320 | stat = ioread32(I2C_REG_STS(alg_data)); | ||
| 321 | |||
| 322 | /* let's see what kind of event this is */ | ||
| 323 | if (stat & mstatus_afi) { | ||
| 324 | /* We lost arbitration in the midst of a transfer */ | ||
| 325 | alg_data->mif.ret = -EIO; | ||
| 326 | |||
| 327 | /* Disable master interrupts. */ | ||
| 328 | ctl = ioread32(I2C_REG_CTL(alg_data)); | ||
| 329 | ctl &= ~(mcntrl_afie | mcntrl_naie | mcntrl_rffie | | ||
| 330 | mcntrl_drmie); | ||
| 331 | iowrite32(ctl, I2C_REG_CTL(alg_data)); | ||
| 332 | |||
| 333 | /* Stop timer, to prevent timeout. */ | ||
| 334 | del_timer_sync(&alg_data->mif.timer); | ||
| 335 | complete(&alg_data->mif.complete); | ||
| 336 | } else if (stat & mstatus_nai) { | ||
| 337 | /* Slave did not acknowledge, generate a STOP */ | ||
| 338 | dev_dbg(&adap->dev, "%s(): " | ||
| 339 | "Slave did not acknowledge, generating a STOP.\n", | ||
| 340 | __FUNCTION__); | ||
| 341 | i2c_pnx_stop(adap); | ||
| 342 | |||
| 343 | /* Disable master interrupts. */ | ||
| 344 | ctl = ioread32(I2C_REG_CTL(alg_data)); | ||
| 345 | ctl &= ~(mcntrl_afie | mcntrl_naie | mcntrl_rffie | | ||
| 346 | mcntrl_drmie); | ||
| 347 | iowrite32(ctl, I2C_REG_CTL(alg_data)); | ||
| 348 | |||
| 349 | /* Our return value. */ | ||
| 350 | alg_data->mif.ret = -EIO; | ||
| 351 | |||
| 352 | /* Stop timer, to prevent timeout. */ | ||
| 353 | del_timer_sync(&alg_data->mif.timer); | ||
| 354 | complete(&alg_data->mif.complete); | ||
| 355 | } else { | ||
| 356 | /* | ||
| 357 | * Two options: | ||
| 358 | * - Master Tx needs data. | ||
| 359 | * - There is data in the Rx-fifo | ||
| 360 | * The latter is only the case if we have requested for data, | ||
| 361 | * via a dummy write. (See 'i2c_pnx_master_rcv'.) | ||
| 362 | * We therefore check, as a sanity check, whether that interrupt | ||
| 363 | * has been enabled. | ||
| 364 | */ | ||
| 365 | if ((stat & mstatus_drmi) || !(stat & mstatus_rfe)) { | ||
| 366 | if (alg_data->mif.mode == I2C_SMBUS_WRITE) { | ||
| 367 | i2c_pnx_master_xmit(adap); | ||
| 368 | } else if (alg_data->mif.mode == I2C_SMBUS_READ) { | ||
| 369 | i2c_pnx_master_rcv(adap); | ||
| 370 | } | ||
| 371 | } | ||
| 372 | } | ||
| 373 | |||
| 374 | /* Clear TDI and AFI bits */ | ||
| 375 | stat = ioread32(I2C_REG_STS(alg_data)); | ||
| 376 | iowrite32(stat | mstatus_tdi | mstatus_afi, I2C_REG_STS(alg_data)); | ||
| 377 | |||
| 378 | dev_dbg(&adap->dev, "%s(): exiting, stat = %x ctrl = %x.\n", | ||
| 379 | __FUNCTION__, ioread32(I2C_REG_STS(alg_data)), | ||
| 380 | ioread32(I2C_REG_CTL(alg_data))); | ||
| 381 | |||
| 382 | return IRQ_HANDLED; | ||
| 383 | } | ||
| 384 | |||
| 385 | static void i2c_pnx_timeout(unsigned long data) | ||
| 386 | { | ||
| 387 | struct i2c_adapter *adap = (struct i2c_adapter *)data; | ||
| 388 | struct i2c_pnx_algo_data *alg_data = adap->algo_data; | ||
| 389 | u32 ctl; | ||
| 390 | |||
| 391 | dev_err(&adap->dev, "Master timed out. stat = %04x, cntrl = %04x. " | ||
| 392 | "Resetting master...\n", | ||
| 393 | ioread32(I2C_REG_STS(alg_data)), | ||
| 394 | ioread32(I2C_REG_CTL(alg_data))); | ||
| 395 | |||
| 396 | /* Reset master and disable interrupts */ | ||
| 397 | ctl = ioread32(I2C_REG_CTL(alg_data)); | ||
| 398 | ctl &= ~(mcntrl_afie | mcntrl_naie | mcntrl_rffie | mcntrl_drmie); | ||
| 399 | iowrite32(ctl, I2C_REG_CTL(alg_data)); | ||
| 400 | |||
| 401 | ctl |= mcntrl_reset; | ||
| 402 | iowrite32(ctl, I2C_REG_CTL(alg_data)); | ||
| 403 | wait_reset(I2C_PNX_TIMEOUT, alg_data); | ||
| 404 | alg_data->mif.ret = -EIO; | ||
| 405 | complete(&alg_data->mif.complete); | ||
| 406 | } | ||
| 407 | |||
| 408 | static inline void bus_reset_if_active(struct i2c_adapter *adap) | ||
| 409 | { | ||
| 410 | struct i2c_pnx_algo_data *alg_data = adap->algo_data; | ||
| 411 | u32 stat; | ||
| 412 | |||
| 413 | if ((stat = ioread32(I2C_REG_STS(alg_data))) & mstatus_active) { | ||
| 414 | dev_err(&adap->dev, | ||
| 415 | "%s: Bus is still active after xfer. Reset it...\n", | ||
| 416 | adap->name); | ||
| 417 | iowrite32(ioread32(I2C_REG_CTL(alg_data)) | mcntrl_reset, | ||
| 418 | I2C_REG_CTL(alg_data)); | ||
| 419 | wait_reset(I2C_PNX_TIMEOUT, alg_data); | ||
| 420 | } else if (!(stat & mstatus_rfe) || !(stat & mstatus_tfe)) { | ||
| 421 | /* If there is data in the fifo's after transfer, | ||
| 422 | * flush fifo's by reset. | ||
| 423 | */ | ||
| 424 | iowrite32(ioread32(I2C_REG_CTL(alg_data)) | mcntrl_reset, | ||
| 425 | I2C_REG_CTL(alg_data)); | ||
| 426 | wait_reset(I2C_PNX_TIMEOUT, alg_data); | ||
| 427 | } else if (stat & mstatus_nai) { | ||
| 428 | iowrite32(ioread32(I2C_REG_CTL(alg_data)) | mcntrl_reset, | ||
| 429 | I2C_REG_CTL(alg_data)); | ||
| 430 | wait_reset(I2C_PNX_TIMEOUT, alg_data); | ||
| 431 | } | ||
| 432 | } | ||
| 433 | |||
| 434 | /** | ||
| 435 | * i2c_pnx_xfer - generic transfer entry point | ||
| 436 | * @adap: pointer to I2C adapter structure | ||
| 437 | * @msgs: array of messages | ||
| 438 | * @num: number of messages | ||
| 439 | * | ||
| 440 | * Initiates the transfer | ||
| 441 | */ | ||
| 442 | static int | ||
| 443 | i2c_pnx_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num) | ||
| 444 | { | ||
| 445 | struct i2c_msg *pmsg; | ||
| 446 | int rc = 0, completed = 0, i; | ||
| 447 | struct i2c_pnx_algo_data *alg_data = adap->algo_data; | ||
| 448 | u32 stat = ioread32(I2C_REG_STS(alg_data)); | ||
| 449 | |||
| 450 | dev_dbg(&adap->dev, "%s(): entering: %d messages, stat = %04x.\n", | ||
| 451 | __FUNCTION__, num, ioread32(I2C_REG_STS(alg_data))); | ||
| 452 | |||
| 453 | bus_reset_if_active(adap); | ||
| 454 | |||
| 455 | /* Process transactions in a loop. */ | ||
| 456 | for (i = 0; rc >= 0 && i < num; i++) { | ||
| 457 | u8 addr; | ||
| 458 | |||
| 459 | pmsg = &msgs[i]; | ||
| 460 | addr = pmsg->addr; | ||
| 461 | |||
| 462 | if (pmsg->flags & I2C_M_TEN) { | ||
| 463 | dev_err(&adap->dev, | ||
| 464 | "%s: 10 bits addr not supported!\n", | ||
| 465 | adap->name); | ||
| 466 | rc = -EINVAL; | ||
| 467 | break; | ||
| 468 | } | ||
| 469 | |||
| 470 | alg_data->mif.buf = pmsg->buf; | ||
| 471 | alg_data->mif.len = pmsg->len; | ||
| 472 | alg_data->mif.mode = (pmsg->flags & I2C_M_RD) ? | ||
| 473 | I2C_SMBUS_READ : I2C_SMBUS_WRITE; | ||
| 474 | alg_data->mif.ret = 0; | ||
| 475 | alg_data->last = (i == num - 1); | ||
| 476 | |||
| 477 | dev_dbg(&adap->dev, "%s(): mode %d, %d bytes\n", __FUNCTION__, | ||
| 478 | alg_data->mif.mode, | ||
| 479 | alg_data->mif.len); | ||
| 480 | |||
| 481 | i2c_pnx_arm_timer(adap); | ||
| 482 | |||
| 483 | /* initialize the completion var */ | ||
| 484 | init_completion(&alg_data->mif.complete); | ||
| 485 | |||
| 486 | /* Enable master interrupt */ | ||
| 487 | iowrite32(ioread32(I2C_REG_CTL(alg_data)) | mcntrl_afie | | ||
| 488 | mcntrl_naie | mcntrl_drmie, | ||
| 489 | I2C_REG_CTL(alg_data)); | ||
| 490 | |||
| 491 | /* Put start-code and slave-address on the bus. */ | ||
| 492 | rc = i2c_pnx_start(addr, adap); | ||
| 493 | if (rc < 0) | ||
| 494 | break; | ||
| 495 | |||
| 496 | /* Wait for completion */ | ||
| 497 | wait_for_completion(&alg_data->mif.complete); | ||
| 498 | |||
| 499 | if (!(rc = alg_data->mif.ret)) | ||
| 500 | completed++; | ||
| 501 | dev_dbg(&adap->dev, "%s(): Complete, return code = %d.\n", | ||
| 502 | __FUNCTION__, rc); | ||
| 503 | |||
| 504 | /* Clear TDI and AFI bits in case they are set. */ | ||
| 505 | if ((stat = ioread32(I2C_REG_STS(alg_data))) & mstatus_tdi) { | ||
| 506 | dev_dbg(&adap->dev, | ||
| 507 | "%s: TDI still set... clearing now.\n", | ||
| 508 | adap->name); | ||
| 509 | iowrite32(stat, I2C_REG_STS(alg_data)); | ||
| 510 | } | ||
| 511 | if ((stat = ioread32(I2C_REG_STS(alg_data))) & mstatus_afi) { | ||
| 512 | dev_dbg(&adap->dev, | ||
| 513 | "%s: AFI still set... clearing now.\n", | ||
| 514 | adap->name); | ||
| 515 | iowrite32(stat, I2C_REG_STS(alg_data)); | ||
| 516 | } | ||
| 517 | } | ||
| 518 | |||
| 519 | bus_reset_if_active(adap); | ||
| 520 | |||
| 521 | /* Cleanup to be sure... */ | ||
| 522 | alg_data->mif.buf = NULL; | ||
| 523 | alg_data->mif.len = 0; | ||
| 524 | |||
| 525 | dev_dbg(&adap->dev, "%s(): exiting, stat = %x\n", | ||
| 526 | __FUNCTION__, ioread32(I2C_REG_STS(alg_data))); | ||
| 527 | |||
| 528 | if (completed != num) | ||
| 529 | return ((rc < 0) ? rc : -EREMOTEIO); | ||
| 530 | |||
| 531 | return num; | ||
| 532 | } | ||
| 533 | |||
| 534 | static u32 i2c_pnx_func(struct i2c_adapter *adapter) | ||
| 535 | { | ||
| 536 | return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL; | ||
| 537 | } | ||
| 538 | |||
| 539 | static struct i2c_algorithm pnx_algorithm = { | ||
| 540 | .master_xfer = i2c_pnx_xfer, | ||
| 541 | .functionality = i2c_pnx_func, | ||
| 542 | }; | ||
| 543 | |||
| 544 | static int i2c_pnx_controller_suspend(struct platform_device *pdev, | ||
| 545 | pm_message_t state) | ||
| 546 | { | ||
| 547 | struct i2c_pnx_data *i2c_pnx = platform_get_drvdata(pdev); | ||
| 548 | return i2c_pnx->suspend(pdev, state); | ||
| 549 | } | ||
| 550 | |||
| 551 | static int i2c_pnx_controller_resume(struct platform_device *pdev) | ||
| 552 | { | ||
| 553 | struct i2c_pnx_data *i2c_pnx = platform_get_drvdata(pdev); | ||
| 554 | return i2c_pnx->resume(pdev); | ||
| 555 | } | ||
| 556 | |||
| 557 | static int __devinit i2c_pnx_probe(struct platform_device *pdev) | ||
| 558 | { | ||
| 559 | unsigned long tmp; | ||
| 560 | int ret = 0; | ||
| 561 | struct i2c_pnx_algo_data *alg_data; | ||
| 562 | int freq_mhz; | ||
| 563 | struct i2c_pnx_data *i2c_pnx = pdev->dev.platform_data; | ||
| 564 | |||
| 565 | if (!i2c_pnx || !i2c_pnx->adapter) { | ||
| 566 | dev_err(&pdev->dev, "%s: no platform data supplied\n", | ||
| 567 | __FUNCTION__); | ||
| 568 | ret = -EINVAL; | ||
| 569 | goto out; | ||
| 570 | } | ||
| 571 | |||
| 572 | platform_set_drvdata(pdev, i2c_pnx); | ||
| 573 | |||
| 574 | if (i2c_pnx->calculate_input_freq) | ||
| 575 | freq_mhz = i2c_pnx->calculate_input_freq(pdev); | ||
| 576 | else { | ||
| 577 | freq_mhz = PNX_DEFAULT_FREQ; | ||
| 578 | dev_info(&pdev->dev, "Setting bus frequency to default value: " | ||
| 579 | "%d MHz", freq_mhz); | ||
| 580 | } | ||
| 581 | |||
| 582 | i2c_pnx->adapter->algo = &pnx_algorithm; | ||
| 583 | |||
| 584 | alg_data = i2c_pnx->adapter->algo_data; | ||
| 585 | init_timer(&alg_data->mif.timer); | ||
| 586 | alg_data->mif.timer.function = i2c_pnx_timeout; | ||
| 587 | alg_data->mif.timer.data = (unsigned long)i2c_pnx->adapter; | ||
| 588 | |||
| 589 | /* Register I/O resource */ | ||
| 590 | if (!request_region(alg_data->base, I2C_PNX_REGION_SIZE, pdev->name)) { | ||
| 591 | dev_err(&pdev->dev, | ||
| 592 | "I/O region 0x%08x for I2C already in use.\n", | ||
| 593 | alg_data->base); | ||
| 594 | ret = -ENODEV; | ||
| 595 | goto out_drvdata; | ||
| 596 | } | ||
| 597 | |||
| 598 | if (!(alg_data->ioaddr = | ||
| 599 | (u32)ioremap(alg_data->base, I2C_PNX_REGION_SIZE))) { | ||
| 600 | dev_err(&pdev->dev, "Couldn't ioremap I2C I/O region\n"); | ||
| 601 | ret = -ENOMEM; | ||
| 602 | goto out_release; | ||
| 603 | } | ||
| 604 | |||
| 605 | i2c_pnx->set_clock_run(pdev); | ||
| 606 | |||
| 607 | /* | ||
| 608 | * Clock Divisor High This value is the number of system clocks | ||
| 609 | * the serial clock (SCL) will be high. | ||
| 610 | * For example, if the system clock period is 50 ns and the maximum | ||
| 611 | * desired serial period is 10000 ns (100 kHz), then CLKHI would be | ||
| 612 | * set to 0.5*(f_sys/f_i2c)-2=0.5*(20e6/100e3)-2=98. The actual value | ||
| 613 | * programmed into CLKHI will vary from this slightly due to | ||
| 614 | * variations in the output pad's rise and fall times as well as | ||
| 615 | * the deglitching filter length. | ||
| 616 | */ | ||
| 617 | |||
| 618 | tmp = ((freq_mhz * 1000) / I2C_PNX_SPEED_KHZ) / 2 - 2; | ||
| 619 | iowrite32(tmp, I2C_REG_CKH(alg_data)); | ||
| 620 | iowrite32(tmp, I2C_REG_CKL(alg_data)); | ||
| 621 | |||
| 622 | iowrite32(mcntrl_reset, I2C_REG_CTL(alg_data)); | ||
| 623 | if (wait_reset(I2C_PNX_TIMEOUT, alg_data)) { | ||
| 624 | ret = -ENODEV; | ||
| 625 | goto out_unmap; | ||
| 626 | } | ||
| 627 | init_completion(&alg_data->mif.complete); | ||
| 628 | |||
| 629 | ret = request_irq(alg_data->irq, i2c_pnx_interrupt, | ||
| 630 | 0, pdev->name, i2c_pnx->adapter); | ||
| 631 | if (ret) | ||
| 632 | goto out_clock; | ||
| 633 | |||
| 634 | /* Register this adapter with the I2C subsystem */ | ||
| 635 | i2c_pnx->adapter->dev.parent = &pdev->dev; | ||
| 636 | ret = i2c_add_adapter(i2c_pnx->adapter); | ||
| 637 | if (ret < 0) { | ||
| 638 | dev_err(&pdev->dev, "I2C: Failed to add bus\n"); | ||
| 639 | goto out_irq; | ||
| 640 | } | ||
| 641 | |||
| 642 | dev_dbg(&pdev->dev, "%s: Master at %#8x, irq %d.\n", | ||
| 643 | i2c_pnx->adapter->name, alg_data->base, alg_data->irq); | ||
| 644 | |||
| 645 | return 0; | ||
| 646 | |||
| 647 | out_irq: | ||
| 648 | free_irq(alg_data->irq, alg_data); | ||
| 649 | out_clock: | ||
| 650 | i2c_pnx->set_clock_stop(pdev); | ||
| 651 | out_unmap: | ||
| 652 | iounmap((void *)alg_data->ioaddr); | ||
| 653 | out_release: | ||
| 654 | release_region(alg_data->base, I2C_PNX_REGION_SIZE); | ||
| 655 | out_drvdata: | ||
| 656 | platform_set_drvdata(pdev, NULL); | ||
| 657 | out: | ||
| 658 | return ret; | ||
| 659 | } | ||
| 660 | |||
| 661 | static int __devexit i2c_pnx_remove(struct platform_device *pdev) | ||
| 662 | { | ||
| 663 | struct i2c_pnx_data *i2c_pnx = platform_get_drvdata(pdev); | ||
| 664 | struct i2c_adapter *adap = i2c_pnx->adapter; | ||
| 665 | struct i2c_pnx_algo_data *alg_data = adap->algo_data; | ||
| 666 | |||
| 667 | free_irq(alg_data->irq, alg_data); | ||
| 668 | i2c_del_adapter(adap); | ||
| 669 | i2c_pnx->set_clock_stop(pdev); | ||
| 670 | iounmap((void *)alg_data->ioaddr); | ||
| 671 | release_region(alg_data->base, I2C_PNX_REGION_SIZE); | ||
| 672 | platform_set_drvdata(pdev, NULL); | ||
| 673 | |||
| 674 | return 0; | ||
| 675 | } | ||
| 676 | |||
| 677 | static struct platform_driver i2c_pnx_driver = { | ||
| 678 | .driver = { | ||
| 679 | .name = "pnx-i2c", | ||
| 680 | .owner = THIS_MODULE, | ||
| 681 | }, | ||
| 682 | .probe = i2c_pnx_probe, | ||
| 683 | .remove = __devexit_p(i2c_pnx_remove), | ||
| 684 | .suspend = i2c_pnx_controller_suspend, | ||
| 685 | .resume = i2c_pnx_controller_resume, | ||
| 686 | }; | ||
| 687 | |||
| 688 | static int __init i2c_adap_pnx_init(void) | ||
| 689 | { | ||
| 690 | return platform_driver_register(&i2c_pnx_driver); | ||
| 691 | } | ||
| 692 | |||
| 693 | static void __exit i2c_adap_pnx_exit(void) | ||
| 694 | { | ||
| 695 | platform_driver_unregister(&i2c_pnx_driver); | ||
| 696 | } | ||
| 697 | |||
| 698 | MODULE_AUTHOR("Vitaly Wool, Dennis Kovalev <source@mvista.com>"); | ||
| 699 | MODULE_DESCRIPTION("I2C driver for Philips IP3204-based I2C busses"); | ||
| 700 | MODULE_LICENSE("GPL"); | ||
| 701 | |||
| 702 | #ifdef CONFIG_I2C_PNX_EARLY | ||
| 703 | /* We need to make sure I2C is initialized before USB */ | ||
| 704 | subsys_initcall(i2c_adap_pnx_init); | ||
| 705 | #else | ||
| 706 | mudule_init(i2c_adap_pnx_init); | ||
| 707 | #endif | ||
| 708 | module_exit(i2c_adap_pnx_exit); | ||
diff --git a/drivers/i2c/busses/i2c-powermac.c b/drivers/i2c/busses/i2c-powermac.c index d658d9107955..648d55533d87 100644 --- a/drivers/i2c/busses/i2c-powermac.c +++ b/drivers/i2c/busses/i2c-powermac.c | |||
| @@ -175,16 +175,16 @@ static u32 i2c_powermac_func(struct i2c_adapter * adapter) | |||
| 175 | } | 175 | } |
| 176 | 176 | ||
| 177 | /* For now, we only handle smbus */ | 177 | /* For now, we only handle smbus */ |
| 178 | static struct i2c_algorithm i2c_powermac_algorithm = { | 178 | static const struct i2c_algorithm i2c_powermac_algorithm = { |
| 179 | .smbus_xfer = i2c_powermac_smbus_xfer, | 179 | .smbus_xfer = i2c_powermac_smbus_xfer, |
| 180 | .master_xfer = i2c_powermac_master_xfer, | 180 | .master_xfer = i2c_powermac_master_xfer, |
| 181 | .functionality = i2c_powermac_func, | 181 | .functionality = i2c_powermac_func, |
| 182 | }; | 182 | }; |
| 183 | 183 | ||
| 184 | 184 | ||
| 185 | static int i2c_powermac_remove(struct device *dev) | 185 | static int i2c_powermac_remove(struct platform_device *dev) |
| 186 | { | 186 | { |
| 187 | struct i2c_adapter *adapter = dev_get_drvdata(dev); | 187 | struct i2c_adapter *adapter = platform_get_drvdata(dev); |
| 188 | struct pmac_i2c_bus *bus = i2c_get_adapdata(adapter); | 188 | struct pmac_i2c_bus *bus = i2c_get_adapdata(adapter); |
| 189 | int rc; | 189 | int rc; |
| 190 | 190 | ||
| @@ -195,16 +195,16 @@ static int i2c_powermac_remove(struct device *dev) | |||
| 195 | if (rc) | 195 | if (rc) |
| 196 | printk("i2c-powermac.c: Failed to remove bus %s !\n", | 196 | printk("i2c-powermac.c: Failed to remove bus %s !\n", |
| 197 | adapter->name); | 197 | adapter->name); |
| 198 | dev_set_drvdata(dev, NULL); | 198 | platform_set_drvdata(dev, NULL); |
| 199 | kfree(adapter); | 199 | kfree(adapter); |
| 200 | 200 | ||
| 201 | return 0; | 201 | return 0; |
| 202 | } | 202 | } |
| 203 | 203 | ||
| 204 | 204 | ||
| 205 | static int i2c_powermac_probe(struct device *dev) | 205 | static int __devexit i2c_powermac_probe(struct platform_device *dev) |
| 206 | { | 206 | { |
| 207 | struct pmac_i2c_bus *bus = dev->platform_data; | 207 | struct pmac_i2c_bus *bus = dev->dev.platform_data; |
| 208 | struct device_node *parent = NULL; | 208 | struct device_node *parent = NULL; |
| 209 | struct i2c_adapter *adapter; | 209 | struct i2c_adapter *adapter; |
| 210 | char name[32]; | 210 | char name[32]; |
| @@ -246,11 +246,11 @@ static int i2c_powermac_probe(struct device *dev) | |||
| 246 | printk(KERN_ERR "i2c-powermac: can't allocate inteface !\n"); | 246 | printk(KERN_ERR "i2c-powermac: can't allocate inteface !\n"); |
| 247 | return -ENOMEM; | 247 | return -ENOMEM; |
| 248 | } | 248 | } |
| 249 | dev_set_drvdata(dev, adapter); | 249 | platform_set_drvdata(dev, adapter); |
| 250 | strcpy(adapter->name, name); | 250 | strcpy(adapter->name, name); |
| 251 | adapter->algo = &i2c_powermac_algorithm; | 251 | adapter->algo = &i2c_powermac_algorithm; |
| 252 | i2c_set_adapdata(adapter, bus); | 252 | i2c_set_adapdata(adapter, bus); |
| 253 | adapter->dev.parent = dev; | 253 | adapter->dev.parent = &dev->dev; |
| 254 | pmac_i2c_attach_adapter(bus, adapter); | 254 | pmac_i2c_attach_adapter(bus, adapter); |
| 255 | rc = i2c_add_adapter(adapter); | 255 | rc = i2c_add_adapter(adapter); |
| 256 | if (rc) { | 256 | if (rc) { |
| @@ -265,23 +265,25 @@ static int i2c_powermac_probe(struct device *dev) | |||
| 265 | } | 265 | } |
| 266 | 266 | ||
| 267 | 267 | ||
| 268 | static struct device_driver i2c_powermac_driver = { | 268 | static struct platform_driver i2c_powermac_driver = { |
| 269 | .name = "i2c-powermac", | ||
| 270 | .bus = &platform_bus_type, | ||
| 271 | .probe = i2c_powermac_probe, | 269 | .probe = i2c_powermac_probe, |
| 272 | .remove = i2c_powermac_remove, | 270 | .remove = __devexit_p(i2c_powermac_remove), |
| 271 | .driver = { | ||
| 272 | .name = "i2c-powermac", | ||
| 273 | .bus = &platform_bus_type, | ||
| 274 | }, | ||
| 273 | }; | 275 | }; |
| 274 | 276 | ||
| 275 | static int __init i2c_powermac_init(void) | 277 | static int __init i2c_powermac_init(void) |
| 276 | { | 278 | { |
| 277 | driver_register(&i2c_powermac_driver); | 279 | platform_driver_register(&i2c_powermac_driver); |
| 278 | return 0; | 280 | return 0; |
| 279 | } | 281 | } |
| 280 | 282 | ||
| 281 | 283 | ||
| 282 | static void __exit i2c_powermac_cleanup(void) | 284 | static void __exit i2c_powermac_cleanup(void) |
| 283 | { | 285 | { |
| 284 | driver_unregister(&i2c_powermac_driver); | 286 | platform_driver_unregister(&i2c_powermac_driver); |
| 285 | } | 287 | } |
| 286 | 288 | ||
| 287 | module_init(i2c_powermac_init); | 289 | module_init(i2c_powermac_init); |
diff --git a/drivers/i2c/busses/i2c-prosavage.c b/drivers/i2c/busses/i2c-prosavage.c index 9479525892e3..07c1f1e27df1 100644 --- a/drivers/i2c/busses/i2c-prosavage.c +++ b/drivers/i2c/busses/i2c-prosavage.c | |||
| @@ -180,7 +180,6 @@ static int i2c_register_bus(struct pci_dev *dev, struct s_i2c_bus *p, void __iom | |||
| 180 | p->algo.getsda = bit_s3via_getsda; | 180 | p->algo.getsda = bit_s3via_getsda; |
| 181 | p->algo.getscl = bit_s3via_getscl; | 181 | p->algo.getscl = bit_s3via_getscl; |
| 182 | p->algo.udelay = CYCLE_DELAY; | 182 | p->algo.udelay = CYCLE_DELAY; |
| 183 | p->algo.mdelay = CYCLE_DELAY; | ||
| 184 | p->algo.timeout = TIMEOUT; | 183 | p->algo.timeout = TIMEOUT; |
| 185 | p->algo.data = p; | 184 | p->algo.data = p; |
| 186 | p->mmvga = mmvga; | 185 | p->mmvga = mmvga; |
| @@ -213,7 +212,7 @@ static void prosavage_remove(struct pci_dev *dev) | |||
| 213 | if (chip->i2c_bus[i].adap_ok == 0) | 212 | if (chip->i2c_bus[i].adap_ok == 0) |
| 214 | continue; | 213 | continue; |
| 215 | 214 | ||
| 216 | ret = i2c_bit_del_bus(&chip->i2c_bus[i].adap); | 215 | ret = i2c_del_adapter(&chip->i2c_bus[i].adap); |
| 217 | if (ret) { | 216 | if (ret) { |
| 218 | dev_err(&dev->dev, "%s not removed\n", | 217 | dev_err(&dev->dev, "%s not removed\n", |
| 219 | chip->i2c_bus[i].adap.name); | 218 | chip->i2c_bus[i].adap.name); |
diff --git a/drivers/i2c/busses/i2c-pxa.c b/drivers/i2c/busses/i2c-pxa.c index ee114b48face..c3b1567c852a 100644 --- a/drivers/i2c/busses/i2c-pxa.c +++ b/drivers/i2c/busses/i2c-pxa.c | |||
| @@ -272,7 +272,8 @@ static int i2c_pxa_wait_slave(struct pxa_i2c *i2c) | |||
| 272 | dev_dbg(&i2c->adap.dev, "%s: %ld: ISR=%08x, ICR=%08x, IBMR=%02x\n", | 272 | dev_dbg(&i2c->adap.dev, "%s: %ld: ISR=%08x, ICR=%08x, IBMR=%02x\n", |
| 273 | __func__, (long)jiffies, ISR, ICR, IBMR); | 273 | __func__, (long)jiffies, ISR, ICR, IBMR); |
| 274 | 274 | ||
| 275 | if ((ISR & (ISR_UB|ISR_IBB|ISR_SAD)) == ISR_SAD || | 275 | if ((ISR & (ISR_UB|ISR_IBB)) == 0 || |
| 276 | (ISR & ISR_SAD) != 0 || | ||
| 276 | (ICR & ICR_SCLE) == 0) { | 277 | (ICR & ICR_SCLE) == 0) { |
| 277 | if (i2c_debug > 1) | 278 | if (i2c_debug > 1) |
| 278 | dev_dbg(&i2c->adap.dev, "%s: done\n", __func__); | 279 | dev_dbg(&i2c->adap.dev, "%s: done\n", __func__); |
| @@ -357,133 +358,6 @@ static void i2c_pxa_reset(struct pxa_i2c *i2c) | |||
| 357 | 358 | ||
| 358 | #ifdef CONFIG_I2C_PXA_SLAVE | 359 | #ifdef CONFIG_I2C_PXA_SLAVE |
| 359 | /* | 360 | /* |
| 360 | * I2C EEPROM emulation. | ||
| 361 | */ | ||
| 362 | static struct i2c_eeprom_emu eeprom = { | ||
| 363 | .size = I2C_EEPROM_EMU_SIZE, | ||
| 364 | .watch = LIST_HEAD_INIT(eeprom.watch), | ||
| 365 | }; | ||
| 366 | |||
| 367 | struct i2c_eeprom_emu *i2c_pxa_get_eeprom(void) | ||
| 368 | { | ||
| 369 | return &eeprom; | ||
| 370 | } | ||
| 371 | |||
| 372 | int i2c_eeprom_emu_addwatcher(struct i2c_eeprom_emu *emu, void *data, | ||
| 373 | unsigned int addr, unsigned int size, | ||
| 374 | struct i2c_eeprom_emu_watcher *watcher) | ||
| 375 | { | ||
| 376 | struct i2c_eeprom_emu_watch *watch; | ||
| 377 | unsigned long flags; | ||
| 378 | |||
| 379 | if (addr + size > emu->size) | ||
| 380 | return -EINVAL; | ||
| 381 | |||
| 382 | watch = kmalloc(sizeof(struct i2c_eeprom_emu_watch), GFP_KERNEL); | ||
| 383 | if (watch) { | ||
| 384 | watch->start = addr; | ||
| 385 | watch->end = addr + size - 1; | ||
| 386 | watch->ops = watcher; | ||
| 387 | watch->data = data; | ||
| 388 | |||
| 389 | local_irq_save(flags); | ||
| 390 | list_add(&watch->node, &emu->watch); | ||
| 391 | local_irq_restore(flags); | ||
| 392 | } | ||
| 393 | |||
| 394 | return watch ? 0 : -ENOMEM; | ||
| 395 | } | ||
| 396 | |||
| 397 | void i2c_eeprom_emu_delwatcher(struct i2c_eeprom_emu *emu, void *data, | ||
| 398 | struct i2c_eeprom_emu_watcher *watcher) | ||
| 399 | { | ||
| 400 | struct i2c_eeprom_emu_watch *watch, *n; | ||
| 401 | unsigned long flags; | ||
| 402 | |||
| 403 | list_for_each_entry_safe(watch, n, &emu->watch, node) { | ||
| 404 | if (watch->ops == watcher && watch->data == data) { | ||
| 405 | local_irq_save(flags); | ||
| 406 | list_del(&watch->node); | ||
| 407 | local_irq_restore(flags); | ||
| 408 | kfree(watch); | ||
| 409 | } | ||
| 410 | } | ||
| 411 | } | ||
| 412 | |||
| 413 | static void i2c_eeprom_emu_event(void *ptr, i2c_slave_event_t event) | ||
| 414 | { | ||
| 415 | struct i2c_eeprom_emu *emu = ptr; | ||
| 416 | |||
| 417 | eedbg(3, "i2c_eeprom_emu_event: %d\n", event); | ||
| 418 | |||
| 419 | switch (event) { | ||
| 420 | case I2C_SLAVE_EVENT_START_WRITE: | ||
| 421 | emu->seen_start = 1; | ||
| 422 | eedbg(2, "i2c_eeprom: write initiated\n"); | ||
| 423 | break; | ||
| 424 | |||
| 425 | case I2C_SLAVE_EVENT_START_READ: | ||
| 426 | emu->seen_start = 0; | ||
| 427 | eedbg(2, "i2c_eeprom: read initiated\n"); | ||
| 428 | break; | ||
| 429 | |||
| 430 | case I2C_SLAVE_EVENT_STOP: | ||
| 431 | emu->seen_start = 0; | ||
| 432 | eedbg(2, "i2c_eeprom: received stop\n"); | ||
| 433 | break; | ||
| 434 | |||
| 435 | default: | ||
| 436 | eedbg(0, "i2c_eeprom: unhandled event\n"); | ||
| 437 | break; | ||
| 438 | } | ||
| 439 | } | ||
| 440 | |||
| 441 | static int i2c_eeprom_emu_read(void *ptr) | ||
| 442 | { | ||
| 443 | struct i2c_eeprom_emu *emu = ptr; | ||
| 444 | int ret; | ||
| 445 | |||
| 446 | ret = emu->bytes[emu->ptr]; | ||
| 447 | emu->ptr = (emu->ptr + 1) % emu->size; | ||
| 448 | |||
| 449 | return ret; | ||
| 450 | } | ||
| 451 | |||
| 452 | static void i2c_eeprom_emu_write(void *ptr, unsigned int val) | ||
| 453 | { | ||
| 454 | struct i2c_eeprom_emu *emu = ptr; | ||
| 455 | struct i2c_eeprom_emu_watch *watch; | ||
| 456 | |||
| 457 | if (emu->seen_start != 0) { | ||
| 458 | eedbg(2, "i2c_eeprom_emu_write: setting ptr %02x\n", val); | ||
| 459 | emu->ptr = val; | ||
| 460 | emu->seen_start = 0; | ||
| 461 | return; | ||
| 462 | } | ||
| 463 | |||
| 464 | emu->bytes[emu->ptr] = val; | ||
| 465 | |||
| 466 | eedbg(1, "i2c_eeprom_emu_write: ptr=0x%02x, val=0x%02x\n", | ||
| 467 | emu->ptr, val); | ||
| 468 | |||
| 469 | list_for_each_entry(watch, &emu->watch, node) { | ||
| 470 | if (!watch->ops || !watch->ops->write) | ||
| 471 | continue; | ||
| 472 | if (watch->start <= emu->ptr && watch->end >= emu->ptr) | ||
| 473 | watch->ops->write(watch->data, emu->ptr, val); | ||
| 474 | } | ||
| 475 | |||
| 476 | emu->ptr = (emu->ptr + 1) % emu->size; | ||
| 477 | } | ||
| 478 | |||
| 479 | struct i2c_slave_client eeprom_client = { | ||
| 480 | .data = &eeprom, | ||
| 481 | .event = i2c_eeprom_emu_event, | ||
| 482 | .read = i2c_eeprom_emu_read, | ||
| 483 | .write = i2c_eeprom_emu_write | ||
| 484 | }; | ||
| 485 | |||
| 486 | /* | ||
| 487 | * PXA I2C Slave mode | 361 | * PXA I2C Slave mode |
| 488 | */ | 362 | */ |
| 489 | 363 | ||
| @@ -492,7 +366,10 @@ static void i2c_pxa_slave_txempty(struct pxa_i2c *i2c, u32 isr) | |||
| 492 | if (isr & ISR_BED) { | 366 | if (isr & ISR_BED) { |
| 493 | /* what should we do here? */ | 367 | /* what should we do here? */ |
| 494 | } else { | 368 | } else { |
| 495 | int ret = i2c->slave->read(i2c->slave->data); | 369 | int ret = 0; |
| 370 | |||
| 371 | if (i2c->slave != NULL) | ||
| 372 | ret = i2c->slave->read(i2c->slave->data); | ||
| 496 | 373 | ||
| 497 | IDBR = ret; | 374 | IDBR = ret; |
| 498 | ICR |= ICR_TB; /* allow next byte */ | 375 | ICR |= ICR_TB; /* allow next byte */ |
| @@ -850,7 +727,7 @@ static void i2c_pxa_irq_rxfull(struct pxa_i2c *i2c, u32 isr) | |||
| 850 | ICR = icr; | 727 | ICR = icr; |
| 851 | } | 728 | } |
| 852 | 729 | ||
| 853 | static irqreturn_t i2c_pxa_handler(int this_irq, void *dev_id, struct pt_regs *regs) | 730 | static irqreturn_t i2c_pxa_handler(int this_irq, void *dev_id) |
| 854 | { | 731 | { |
| 855 | struct pxa_i2c *i2c = dev_id; | 732 | struct pxa_i2c *i2c = dev_id; |
| 856 | u32 isr = ISR; | 733 | u32 isr = ISR; |
| @@ -926,7 +803,7 @@ static u32 i2c_pxa_functionality(struct i2c_adapter *adap) | |||
| 926 | return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL; | 803 | return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL; |
| 927 | } | 804 | } |
| 928 | 805 | ||
| 929 | static struct i2c_algorithm i2c_pxa_algorithm = { | 806 | static const struct i2c_algorithm i2c_pxa_algorithm = { |
| 930 | .master_xfer = i2c_pxa_xfer, | 807 | .master_xfer = i2c_pxa_xfer, |
| 931 | .functionality = i2c_pxa_functionality, | 808 | .functionality = i2c_pxa_functionality, |
| 932 | }; | 809 | }; |
| @@ -959,11 +836,9 @@ static int i2c_pxa_probe(struct platform_device *dev) | |||
| 959 | i2c->slave_addr = I2C_PXA_SLAVE_ADDR; | 836 | i2c->slave_addr = I2C_PXA_SLAVE_ADDR; |
| 960 | 837 | ||
| 961 | #ifdef CONFIG_I2C_PXA_SLAVE | 838 | #ifdef CONFIG_I2C_PXA_SLAVE |
| 962 | i2c->slave = &eeprom_client; | ||
| 963 | if (plat) { | 839 | if (plat) { |
| 964 | i2c->slave_addr = plat->slave_addr; | 840 | i2c->slave_addr = plat->slave_addr; |
| 965 | if (plat->slave) | 841 | i2c->slave = plat->slave; |
| 966 | i2c->slave = plat->slave; | ||
| 967 | } | 842 | } |
| 968 | #endif | 843 | #endif |
| 969 | 844 | ||
diff --git a/drivers/i2c/busses/i2c-rpx.c b/drivers/i2c/busses/i2c-rpx.c index 0ebec3c1a54e..8764df06f51d 100644 --- a/drivers/i2c/busses/i2c-rpx.c +++ b/drivers/i2c/busses/i2c-rpx.c | |||
| @@ -55,10 +55,10 @@ rpx_iic_init(struct i2c_algo_8xx_data *data) | |||
| 55 | data->i2c = (i2c8xx_t *)&(((immap_t *)IMAP_ADDR)->im_i2c); | 55 | data->i2c = (i2c8xx_t *)&(((immap_t *)IMAP_ADDR)->im_i2c); |
| 56 | } | 56 | } |
| 57 | 57 | ||
| 58 | static int rpx_install_isr(int irq, void (*func)(void *, void *), void *data) | 58 | static int rpx_install_isr(int irq, void (*func)(void *), void *data) |
| 59 | { | 59 | { |
| 60 | /* install interrupt handler */ | 60 | /* install interrupt handler */ |
| 61 | cpm_install_handler(irq, (void (*)(void *, struct pt_regs *)) func, data); | 61 | cpm_install_handler(irq, func, data); |
| 62 | 62 | ||
| 63 | return 0; | 63 | return 0; |
| 64 | } | 64 | } |
diff --git a/drivers/i2c/busses/i2c-s3c2410.c b/drivers/i2c/busses/i2c-s3c2410.c index 5d2950e91fc5..4ca6de209b8b 100644 --- a/drivers/i2c/busses/i2c-s3c2410.c +++ b/drivers/i2c/busses/i2c-s3c2410.c | |||
| @@ -423,8 +423,7 @@ static int i2s_s3c_irq_nextbyte(struct s3c24xx_i2c *i2c, unsigned long iicstat) | |||
| 423 | * top level IRQ servicing routine | 423 | * top level IRQ servicing routine |
| 424 | */ | 424 | */ |
| 425 | 425 | ||
| 426 | static irqreturn_t s3c24xx_i2c_irq(int irqno, void *dev_id, | 426 | static irqreturn_t s3c24xx_i2c_irq(int irqno, void *dev_id) |
| 427 | struct pt_regs *regs) | ||
| 428 | { | 427 | { |
| 429 | struct s3c24xx_i2c *i2c = dev_id; | 428 | struct s3c24xx_i2c *i2c = dev_id; |
| 430 | unsigned long status; | 429 | unsigned long status; |
| @@ -566,7 +565,7 @@ static u32 s3c24xx_i2c_func(struct i2c_adapter *adap) | |||
| 566 | 565 | ||
| 567 | /* i2c bus registration info */ | 566 | /* i2c bus registration info */ |
| 568 | 567 | ||
| 569 | static struct i2c_algorithm s3c24xx_i2c_algorithm = { | 568 | static const struct i2c_algorithm s3c24xx_i2c_algorithm = { |
| 570 | .master_xfer = s3c24xx_i2c_xfer, | 569 | .master_xfer = s3c24xx_i2c_xfer, |
| 571 | .functionality = s3c24xx_i2c_func, | 570 | .functionality = s3c24xx_i2c_func, |
| 572 | }; | 571 | }; |
diff --git a/drivers/i2c/busses/i2c-savage4.c b/drivers/i2c/busses/i2c-savage4.c index 0c8518298e4d..844b4ff90893 100644 --- a/drivers/i2c/busses/i2c-savage4.c +++ b/drivers/i2c/busses/i2c-savage4.c | |||
| @@ -140,7 +140,6 @@ static struct i2c_algo_bit_data sav_i2c_bit_data = { | |||
| 140 | .getsda = bit_savi2c_getsda, | 140 | .getsda = bit_savi2c_getsda, |
| 141 | .getscl = bit_savi2c_getscl, | 141 | .getscl = bit_savi2c_getscl, |
| 142 | .udelay = CYCLE_DELAY, | 142 | .udelay = CYCLE_DELAY, |
| 143 | .mdelay = CYCLE_DELAY, | ||
| 144 | .timeout = TIMEOUT | 143 | .timeout = TIMEOUT |
| 145 | }; | 144 | }; |
| 146 | 145 | ||
| @@ -174,7 +173,7 @@ static int __devinit savage4_probe(struct pci_dev *dev, const struct pci_device_ | |||
| 174 | 173 | ||
| 175 | static void __devexit savage4_remove(struct pci_dev *dev) | 174 | static void __devexit savage4_remove(struct pci_dev *dev) |
| 176 | { | 175 | { |
| 177 | i2c_bit_del_bus(&savage4_i2c_adapter); | 176 | i2c_del_adapter(&savage4_i2c_adapter); |
| 178 | iounmap(ioaddr); | 177 | iounmap(ioaddr); |
| 179 | } | 178 | } |
| 180 | 179 | ||
diff --git a/drivers/i2c/busses/i2c-sibyte.c b/drivers/i2c/busses/i2c-sibyte.c index fa503ed9f86d..0ca599d3b402 100644 --- a/drivers/i2c/busses/i2c-sibyte.c +++ b/drivers/i2c/busses/i2c-sibyte.c | |||
| @@ -1,6 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Copyright (C) 2004 Steven J. Hill | 2 | * Copyright (C) 2004 Steven J. Hill |
| 3 | * Copyright (C) 2001,2002,2003 Broadcom Corporation | 3 | * Copyright (C) 2001,2002,2003 Broadcom Corporation |
| 4 | * Copyright (C) 1995-2000 Simon G. Vogl | ||
| 4 | * | 5 | * |
| 5 | * This program is free software; you can redistribute it and/or | 6 | * This program is free software; you can redistribute it and/or |
| 6 | * modify it under the terms of the GNU General Public License | 7 | * modify it under the terms of the GNU General Public License |
| @@ -17,11 +18,162 @@ | |||
| 17 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | 18 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
| 18 | */ | 19 | */ |
| 19 | 20 | ||
| 21 | #include <linux/kernel.h> | ||
| 20 | #include <linux/module.h> | 22 | #include <linux/module.h> |
| 21 | #include <linux/i2c-algo-sibyte.h> | 23 | #include <linux/init.h> |
| 24 | #include <linux/i2c.h> | ||
| 25 | #include <asm/io.h> | ||
| 22 | #include <asm/sibyte/sb1250_regs.h> | 26 | #include <asm/sibyte/sb1250_regs.h> |
| 23 | #include <asm/sibyte/sb1250_smbus.h> | 27 | #include <asm/sibyte/sb1250_smbus.h> |
| 24 | 28 | ||
| 29 | |||
| 30 | struct i2c_algo_sibyte_data { | ||
| 31 | void *data; /* private data */ | ||
| 32 | int bus; /* which bus */ | ||
| 33 | void *reg_base; /* CSR base */ | ||
| 34 | }; | ||
| 35 | |||
| 36 | /* ----- global defines ----------------------------------------------- */ | ||
| 37 | #define SMB_CSR(a,r) ((long)(a->reg_base + r)) | ||
| 38 | |||
| 39 | /* ----- global variables --------------------------------------------- */ | ||
| 40 | |||
| 41 | /* module parameters: | ||
| 42 | */ | ||
| 43 | static int bit_scan; /* have a look at what's hanging 'round */ | ||
| 44 | module_param(bit_scan, int, 0); | ||
| 45 | MODULE_PARM_DESC(bit_scan, "Scan for active chips on the bus"); | ||
| 46 | |||
| 47 | |||
| 48 | static int smbus_xfer(struct i2c_adapter *i2c_adap, u16 addr, | ||
| 49 | unsigned short flags, char read_write, | ||
| 50 | u8 command, int size, union i2c_smbus_data * data) | ||
| 51 | { | ||
| 52 | struct i2c_algo_sibyte_data *adap = i2c_adap->algo_data; | ||
| 53 | int data_bytes = 0; | ||
| 54 | int error; | ||
| 55 | |||
| 56 | while (csr_in32(SMB_CSR(adap, R_SMB_STATUS)) & M_SMB_BUSY) | ||
| 57 | ; | ||
| 58 | |||
| 59 | switch (size) { | ||
| 60 | case I2C_SMBUS_QUICK: | ||
| 61 | csr_out32((V_SMB_ADDR(addr) | | ||
| 62 | (read_write == I2C_SMBUS_READ ? M_SMB_QDATA : 0) | | ||
| 63 | V_SMB_TT_QUICKCMD), SMB_CSR(adap, R_SMB_START)); | ||
| 64 | break; | ||
| 65 | case I2C_SMBUS_BYTE: | ||
| 66 | if (read_write == I2C_SMBUS_READ) { | ||
| 67 | csr_out32((V_SMB_ADDR(addr) | V_SMB_TT_RD1BYTE), | ||
| 68 | SMB_CSR(adap, R_SMB_START)); | ||
| 69 | data_bytes = 1; | ||
| 70 | } else { | ||
| 71 | csr_out32(V_SMB_CMD(command), SMB_CSR(adap, R_SMB_CMD)); | ||
| 72 | csr_out32((V_SMB_ADDR(addr) | V_SMB_TT_WR1BYTE), | ||
| 73 | SMB_CSR(adap, R_SMB_START)); | ||
| 74 | } | ||
| 75 | break; | ||
| 76 | case I2C_SMBUS_BYTE_DATA: | ||
| 77 | csr_out32(V_SMB_CMD(command), SMB_CSR(adap, R_SMB_CMD)); | ||
| 78 | if (read_write == I2C_SMBUS_READ) { | ||
| 79 | csr_out32((V_SMB_ADDR(addr) | V_SMB_TT_CMD_RD1BYTE), | ||
| 80 | SMB_CSR(adap, R_SMB_START)); | ||
| 81 | data_bytes = 1; | ||
| 82 | } else { | ||
| 83 | csr_out32(V_SMB_LB(data->byte), | ||
| 84 | SMB_CSR(adap, R_SMB_DATA)); | ||
| 85 | csr_out32((V_SMB_ADDR(addr) | V_SMB_TT_WR2BYTE), | ||
| 86 | SMB_CSR(adap, R_SMB_START)); | ||
| 87 | } | ||
| 88 | break; | ||
| 89 | case I2C_SMBUS_WORD_DATA: | ||
| 90 | csr_out32(V_SMB_CMD(command), SMB_CSR(adap, R_SMB_CMD)); | ||
| 91 | if (read_write == I2C_SMBUS_READ) { | ||
| 92 | csr_out32((V_SMB_ADDR(addr) | V_SMB_TT_CMD_RD2BYTE), | ||
| 93 | SMB_CSR(adap, R_SMB_START)); | ||
| 94 | data_bytes = 2; | ||
| 95 | } else { | ||
| 96 | csr_out32(V_SMB_LB(data->word & 0xff), | ||
| 97 | SMB_CSR(adap, R_SMB_DATA)); | ||
| 98 | csr_out32(V_SMB_MB(data->word >> 8), | ||
| 99 | SMB_CSR(adap, R_SMB_DATA)); | ||
| 100 | csr_out32((V_SMB_ADDR(addr) | V_SMB_TT_WR2BYTE), | ||
| 101 | SMB_CSR(adap, R_SMB_START)); | ||
| 102 | } | ||
| 103 | break; | ||
| 104 | default: | ||
| 105 | return -1; /* XXXKW better error code? */ | ||
| 106 | } | ||
| 107 | |||
| 108 | while (csr_in32(SMB_CSR(adap, R_SMB_STATUS)) & M_SMB_BUSY) | ||
| 109 | ; | ||
| 110 | |||
| 111 | error = csr_in32(SMB_CSR(adap, R_SMB_STATUS)); | ||
| 112 | if (error & M_SMB_ERROR) { | ||
| 113 | /* Clear error bit by writing a 1 */ | ||
| 114 | csr_out32(M_SMB_ERROR, SMB_CSR(adap, R_SMB_STATUS)); | ||
| 115 | return -1; /* XXXKW better error code? */ | ||
| 116 | } | ||
| 117 | |||
| 118 | if (data_bytes == 1) | ||
| 119 | data->byte = csr_in32(SMB_CSR(adap, R_SMB_DATA)) & 0xff; | ||
| 120 | if (data_bytes == 2) | ||
| 121 | data->word = csr_in32(SMB_CSR(adap, R_SMB_DATA)) & 0xffff; | ||
| 122 | |||
| 123 | return 0; | ||
| 124 | } | ||
| 125 | |||
| 126 | static u32 bit_func(struct i2c_adapter *adap) | ||
| 127 | { | ||
| 128 | return (I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE | | ||
| 129 | I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA); | ||
| 130 | } | ||
| 131 | |||
| 132 | |||
| 133 | /* -----exported algorithm data: ------------------------------------- */ | ||
| 134 | |||
| 135 | static const struct i2c_algorithm i2c_sibyte_algo = { | ||
| 136 | .smbus_xfer = smbus_xfer, | ||
| 137 | .functionality = bit_func, | ||
| 138 | }; | ||
| 139 | |||
| 140 | /* | ||
| 141 | * registering functions to load algorithms at runtime | ||
| 142 | */ | ||
| 143 | int i2c_sibyte_add_bus(struct i2c_adapter *i2c_adap, int speed) | ||
| 144 | { | ||
| 145 | int i; | ||
| 146 | struct i2c_algo_sibyte_data *adap = i2c_adap->algo_data; | ||
| 147 | |||
| 148 | /* register new adapter to i2c module... */ | ||
| 149 | i2c_adap->algo = &i2c_sibyte_algo; | ||
| 150 | |||
| 151 | /* Set the frequency to 100 kHz */ | ||
| 152 | csr_out32(speed, SMB_CSR(adap,R_SMB_FREQ)); | ||
| 153 | csr_out32(0, SMB_CSR(adap,R_SMB_CONTROL)); | ||
| 154 | |||
| 155 | /* scan bus */ | ||
| 156 | if (bit_scan) { | ||
| 157 | union i2c_smbus_data data; | ||
| 158 | int rc; | ||
| 159 | printk(KERN_INFO " i2c-algo-sibyte.o: scanning bus %s.\n", | ||
| 160 | i2c_adap->name); | ||
| 161 | for (i = 0x00; i < 0x7f; i++) { | ||
| 162 | /* XXXKW is this a realistic probe? */ | ||
| 163 | rc = smbus_xfer(i2c_adap, i, 0, I2C_SMBUS_READ, 0, | ||
| 164 | I2C_SMBUS_BYTE_DATA, &data); | ||
| 165 | if (!rc) { | ||
| 166 | printk("(%02x)",i); | ||
| 167 | } else | ||
| 168 | printk("."); | ||
| 169 | } | ||
| 170 | printk("\n"); | ||
| 171 | } | ||
| 172 | |||
| 173 | return i2c_add_adapter(i2c_adap); | ||
| 174 | } | ||
| 175 | |||
| 176 | |||
| 25 | static struct i2c_algo_sibyte_data sibyte_board_data[2] = { | 177 | static struct i2c_algo_sibyte_data sibyte_board_data[2] = { |
| 26 | { NULL, 0, (void *) (CKSEG1+A_SMB_BASE(0)) }, | 178 | { NULL, 0, (void *) (CKSEG1+A_SMB_BASE(0)) }, |
| 27 | { NULL, 1, (void *) (CKSEG1+A_SMB_BASE(1)) } | 179 | { NULL, 1, (void *) (CKSEG1+A_SMB_BASE(1)) } |
| @@ -58,13 +210,13 @@ static int __init i2c_sibyte_init(void) | |||
| 58 | 210 | ||
| 59 | static void __exit i2c_sibyte_exit(void) | 211 | static void __exit i2c_sibyte_exit(void) |
| 60 | { | 212 | { |
| 61 | i2c_sibyte_del_bus(&sibyte_board_adapter[0]); | 213 | i2c_del_adapter(&sibyte_board_adapter[0]); |
| 62 | i2c_sibyte_del_bus(&sibyte_board_adapter[1]); | 214 | i2c_del_adapter(&sibyte_board_adapter[1]); |
| 63 | } | 215 | } |
| 64 | 216 | ||
| 65 | module_init(i2c_sibyte_init); | 217 | module_init(i2c_sibyte_init); |
| 66 | module_exit(i2c_sibyte_exit); | 218 | module_exit(i2c_sibyte_exit); |
| 67 | 219 | ||
| 68 | MODULE_AUTHOR("Kip Walker <kwalker@broadcom.com>, Steven J. Hill <sjhill@realitydiluted.com>"); | 220 | MODULE_AUTHOR("Kip Walker (Broadcom Corp.), Steven J. Hill <sjhill@realitydiluted.com>"); |
| 69 | MODULE_DESCRIPTION("SMBus adapter routines for SiByte boards"); | 221 | MODULE_DESCRIPTION("SMBus adapter routines for SiByte boards"); |
| 70 | MODULE_LICENSE("GPL"); | 222 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/i2c/busses/i2c-sis5595.c b/drivers/i2c/busses/i2c-sis5595.c index b57ab74d23ec..38bbfd840b6b 100644 --- a/drivers/i2c/busses/i2c-sis5595.c +++ b/drivers/i2c/busses/i2c-sis5595.c | |||
| @@ -358,7 +358,7 @@ static u32 sis5595_func(struct i2c_adapter *adapter) | |||
| 358 | I2C_FUNC_SMBUS_PROC_CALL; | 358 | I2C_FUNC_SMBUS_PROC_CALL; |
| 359 | } | 359 | } |
| 360 | 360 | ||
| 361 | static struct i2c_algorithm smbus_algorithm = { | 361 | static const struct i2c_algorithm smbus_algorithm = { |
| 362 | .smbus_xfer = sis5595_access, | 362 | .smbus_xfer = sis5595_access, |
| 363 | .functionality = sis5595_func, | 363 | .functionality = sis5595_func, |
| 364 | }; | 364 | }; |
diff --git a/drivers/i2c/busses/i2c-sis630.c b/drivers/i2c/busses/i2c-sis630.c index acb75e282414..dec0bafb52ab 100644 --- a/drivers/i2c/busses/i2c-sis630.c +++ b/drivers/i2c/busses/i2c-sis630.c | |||
| @@ -450,7 +450,7 @@ exit: | |||
| 450 | } | 450 | } |
| 451 | 451 | ||
| 452 | 452 | ||
| 453 | static struct i2c_algorithm smbus_algorithm = { | 453 | static const struct i2c_algorithm smbus_algorithm = { |
| 454 | .smbus_xfer = sis630_access, | 454 | .smbus_xfer = sis630_access, |
| 455 | .functionality = sis630_func, | 455 | .functionality = sis630_func, |
| 456 | }; | 456 | }; |
diff --git a/drivers/i2c/busses/i2c-sis96x.c b/drivers/i2c/busses/i2c-sis96x.c index 1a73c0532fc7..7fd07fbac336 100644 --- a/drivers/i2c/busses/i2c-sis96x.c +++ b/drivers/i2c/busses/i2c-sis96x.c | |||
| @@ -242,7 +242,7 @@ static u32 sis96x_func(struct i2c_adapter *adapter) | |||
| 242 | I2C_FUNC_SMBUS_PROC_CALL; | 242 | I2C_FUNC_SMBUS_PROC_CALL; |
| 243 | } | 243 | } |
| 244 | 244 | ||
| 245 | static struct i2c_algorithm smbus_algorithm = { | 245 | static const struct i2c_algorithm smbus_algorithm = { |
| 246 | .smbus_xfer = sis96x_access, | 246 | .smbus_xfer = sis96x_access, |
| 247 | .functionality = sis96x_func, | 247 | .functionality = sis96x_func, |
| 248 | }; | 248 | }; |
diff --git a/drivers/i2c/busses/i2c-stub.c b/drivers/i2c/busses/i2c-stub.c index 73f481e93a36..a54adc50d162 100644 --- a/drivers/i2c/busses/i2c-stub.c +++ b/drivers/i2c/busses/i2c-stub.c | |||
| @@ -27,6 +27,10 @@ | |||
| 27 | #include <linux/errno.h> | 27 | #include <linux/errno.h> |
| 28 | #include <linux/i2c.h> | 28 | #include <linux/i2c.h> |
| 29 | 29 | ||
| 30 | static unsigned short chip_addr; | ||
| 31 | module_param(chip_addr, ushort, S_IRUGO); | ||
| 32 | MODULE_PARM_DESC(chip_addr, "Chip address (between 0x03 and 0x77)\n"); | ||
| 33 | |||
| 30 | static u8 stub_pointer; | 34 | static u8 stub_pointer; |
| 31 | static u8 stub_bytes[256]; | 35 | static u8 stub_bytes[256]; |
| 32 | static u16 stub_words[256]; | 36 | static u16 stub_words[256]; |
| @@ -37,6 +41,9 @@ static s32 stub_xfer(struct i2c_adapter * adap, u16 addr, unsigned short flags, | |||
| 37 | { | 41 | { |
| 38 | s32 ret; | 42 | s32 ret; |
| 39 | 43 | ||
| 44 | if (addr != chip_addr) | ||
| 45 | return -ENODEV; | ||
| 46 | |||
| 40 | switch (size) { | 47 | switch (size) { |
| 41 | 48 | ||
| 42 | case I2C_SMBUS_QUICK: | 49 | case I2C_SMBUS_QUICK: |
| @@ -108,7 +115,7 @@ static u32 stub_func(struct i2c_adapter *adapter) | |||
| 108 | I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA; | 115 | I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA; |
| 109 | } | 116 | } |
| 110 | 117 | ||
| 111 | static struct i2c_algorithm smbus_algorithm = { | 118 | static const struct i2c_algorithm smbus_algorithm = { |
| 112 | .functionality = stub_func, | 119 | .functionality = stub_func, |
| 113 | .smbus_xfer = stub_xfer, | 120 | .smbus_xfer = stub_xfer, |
| 114 | }; | 121 | }; |
| @@ -122,7 +129,17 @@ static struct i2c_adapter stub_adapter = { | |||
| 122 | 129 | ||
| 123 | static int __init i2c_stub_init(void) | 130 | static int __init i2c_stub_init(void) |
| 124 | { | 131 | { |
| 125 | printk(KERN_INFO "i2c-stub loaded\n"); | 132 | if (!chip_addr) { |
| 133 | printk(KERN_ERR "i2c-stub: Please specify a chip address\n"); | ||
| 134 | return -ENODEV; | ||
| 135 | } | ||
| 136 | if (chip_addr < 0x03 || chip_addr > 0x77) { | ||
| 137 | printk(KERN_ERR "i2c-stub: Invalid chip address 0x%02x\n", | ||
| 138 | chip_addr); | ||
| 139 | return -EINVAL; | ||
| 140 | } | ||
| 141 | |||
| 142 | printk(KERN_INFO "i2c-stub: Virtual chip at 0x%02x\n", chip_addr); | ||
| 126 | return i2c_add_adapter(&stub_adapter); | 143 | return i2c_add_adapter(&stub_adapter); |
| 127 | } | 144 | } |
| 128 | 145 | ||
diff --git a/drivers/i2c/busses/i2c-versatile.c b/drivers/i2c/busses/i2c-versatile.c new file mode 100644 index 000000000000..081d9578ce10 --- /dev/null +++ b/drivers/i2c/busses/i2c-versatile.c | |||
| @@ -0,0 +1,153 @@ | |||
| 1 | /* | ||
| 2 | * i2c-versatile.c | ||
| 3 | * | ||
| 4 | * Copyright (C) 2006 ARM Ltd. | ||
| 5 | * written by Russell King, Deep Blue Solutions Ltd. | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License version 2 as | ||
| 9 | * published by the Free Software Foundation. | ||
| 10 | */ | ||
| 11 | #include <linux/kernel.h> | ||
| 12 | #include <linux/module.h> | ||
| 13 | #include <linux/i2c.h> | ||
| 14 | #include <linux/i2c-algo-bit.h> | ||
| 15 | #include <linux/init.h> | ||
| 16 | #include <linux/platform_device.h> | ||
| 17 | |||
| 18 | #include <asm/io.h> | ||
| 19 | |||
| 20 | #define I2C_CONTROL 0x00 | ||
| 21 | #define I2C_CONTROLS 0x00 | ||
| 22 | #define I2C_CONTROLC 0x04 | ||
| 23 | #define SCL (1 << 0) | ||
| 24 | #define SDA (1 << 1) | ||
| 25 | |||
| 26 | struct i2c_versatile { | ||
| 27 | struct i2c_adapter adap; | ||
| 28 | struct i2c_algo_bit_data algo; | ||
| 29 | void __iomem *base; | ||
| 30 | }; | ||
| 31 | |||
| 32 | static void i2c_versatile_setsda(void *data, int state) | ||
| 33 | { | ||
| 34 | struct i2c_versatile *i2c = data; | ||
| 35 | |||
| 36 | writel(SDA, i2c->base + (state ? I2C_CONTROLS : I2C_CONTROLC)); | ||
| 37 | } | ||
| 38 | |||
| 39 | static void i2c_versatile_setscl(void *data, int state) | ||
| 40 | { | ||
| 41 | struct i2c_versatile *i2c = data; | ||
| 42 | |||
| 43 | writel(SCL, i2c->base + (state ? I2C_CONTROLS : I2C_CONTROLC)); | ||
| 44 | } | ||
| 45 | |||
| 46 | static int i2c_versatile_getsda(void *data) | ||
| 47 | { | ||
| 48 | struct i2c_versatile *i2c = data; | ||
| 49 | return !!(readl(i2c->base + I2C_CONTROL) & SDA); | ||
| 50 | } | ||
| 51 | |||
| 52 | static int i2c_versatile_getscl(void *data) | ||
| 53 | { | ||
| 54 | struct i2c_versatile *i2c = data; | ||
| 55 | return !!(readl(i2c->base + I2C_CONTROL) & SCL); | ||
| 56 | } | ||
| 57 | |||
| 58 | static struct i2c_algo_bit_data i2c_versatile_algo = { | ||
| 59 | .setsda = i2c_versatile_setsda, | ||
| 60 | .setscl = i2c_versatile_setscl, | ||
| 61 | .getsda = i2c_versatile_getsda, | ||
| 62 | .getscl = i2c_versatile_getscl, | ||
| 63 | .udelay = 30, | ||
| 64 | .timeout = HZ, | ||
| 65 | }; | ||
| 66 | |||
| 67 | static int i2c_versatile_probe(struct platform_device *dev) | ||
| 68 | { | ||
| 69 | struct i2c_versatile *i2c; | ||
| 70 | struct resource *r; | ||
| 71 | int ret; | ||
| 72 | |||
| 73 | r = platform_get_resource(dev, IORESOURCE_MEM, 0); | ||
| 74 | if (!r) { | ||
| 75 | ret = -EINVAL; | ||
| 76 | goto err_out; | ||
| 77 | } | ||
| 78 | |||
| 79 | if (!request_mem_region(r->start, r->end - r->start + 1, "versatile-i2c")) { | ||
| 80 | ret = -EBUSY; | ||
| 81 | goto err_out; | ||
| 82 | } | ||
| 83 | |||
| 84 | i2c = kzalloc(sizeof(struct i2c_versatile), GFP_KERNEL); | ||
| 85 | if (!i2c) { | ||
| 86 | ret = -ENOMEM; | ||
| 87 | goto err_release; | ||
| 88 | } | ||
| 89 | |||
| 90 | i2c->base = ioremap(r->start, r->end - r->start + 1); | ||
| 91 | if (!i2c->base) { | ||
| 92 | ret = -ENOMEM; | ||
| 93 | goto err_free; | ||
| 94 | } | ||
| 95 | |||
| 96 | writel(SCL | SDA, i2c->base + I2C_CONTROLS); | ||
| 97 | |||
| 98 | i2c->adap.owner = THIS_MODULE; | ||
| 99 | strlcpy(i2c->adap.name, "Versatile I2C adapter", sizeof(i2c->adap.name)); | ||
| 100 | i2c->adap.algo_data = &i2c->algo; | ||
| 101 | i2c->adap.dev.parent = &dev->dev; | ||
| 102 | i2c->algo = i2c_versatile_algo; | ||
| 103 | i2c->algo.data = i2c; | ||
| 104 | |||
| 105 | ret = i2c_bit_add_bus(&i2c->adap); | ||
| 106 | if (ret >= 0) { | ||
| 107 | platform_set_drvdata(dev, i2c); | ||
| 108 | return 0; | ||
| 109 | } | ||
| 110 | |||
| 111 | iounmap(i2c->base); | ||
| 112 | err_free: | ||
| 113 | kfree(i2c); | ||
| 114 | err_release: | ||
| 115 | release_mem_region(r->start, r->end - r->start + 1); | ||
| 116 | err_out: | ||
| 117 | return ret; | ||
| 118 | } | ||
| 119 | |||
| 120 | static int i2c_versatile_remove(struct platform_device *dev) | ||
| 121 | { | ||
| 122 | struct i2c_versatile *i2c = platform_get_drvdata(dev); | ||
| 123 | |||
| 124 | platform_set_drvdata(dev, NULL); | ||
| 125 | |||
| 126 | i2c_del_adapter(&i2c->adap); | ||
| 127 | return 0; | ||
| 128 | } | ||
| 129 | |||
| 130 | static struct platform_driver i2c_versatile_driver = { | ||
| 131 | .probe = i2c_versatile_probe, | ||
| 132 | .remove = i2c_versatile_remove, | ||
| 133 | .driver = { | ||
| 134 | .name = "versatile-i2c", | ||
| 135 | .owner = THIS_MODULE, | ||
| 136 | }, | ||
| 137 | }; | ||
| 138 | |||
| 139 | static int __init i2c_versatile_init(void) | ||
| 140 | { | ||
| 141 | return platform_driver_register(&i2c_versatile_driver); | ||
| 142 | } | ||
| 143 | |||
| 144 | static void __exit i2c_versatile_exit(void) | ||
| 145 | { | ||
| 146 | platform_driver_unregister(&i2c_versatile_driver); | ||
| 147 | } | ||
| 148 | |||
| 149 | module_init(i2c_versatile_init); | ||
| 150 | module_exit(i2c_versatile_exit); | ||
| 151 | |||
| 152 | MODULE_DESCRIPTION("ARM Versatile I2C bus driver"); | ||
| 153 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/i2c/busses/i2c-via.c b/drivers/i2c/busses/i2c-via.c index 484bbacfce6b..15d7e00e47e6 100644 --- a/drivers/i2c/busses/i2c-via.c +++ b/drivers/i2c/busses/i2c-via.c | |||
| @@ -81,7 +81,6 @@ static struct i2c_algo_bit_data bit_data = { | |||
| 81 | .getsda = bit_via_getsda, | 81 | .getsda = bit_via_getsda, |
| 82 | .getscl = bit_via_getscl, | 82 | .getscl = bit_via_getscl, |
| 83 | .udelay = 5, | 83 | .udelay = 5, |
| 84 | .mdelay = 5, | ||
| 85 | .timeout = HZ | 84 | .timeout = HZ |
| 86 | }; | 85 | }; |
| 87 | 86 | ||
| @@ -152,7 +151,7 @@ static int __devinit vt586b_probe(struct pci_dev *dev, const struct pci_device_i | |||
| 152 | 151 | ||
| 153 | static void __devexit vt586b_remove(struct pci_dev *dev) | 152 | static void __devexit vt586b_remove(struct pci_dev *dev) |
| 154 | { | 153 | { |
| 155 | i2c_bit_del_bus(&vt586b_adapter); | 154 | i2c_del_adapter(&vt586b_adapter); |
| 156 | release_region(I2C_DIR, IOSPACE); | 155 | release_region(I2C_DIR, IOSPACE); |
| 157 | pm_io_base = 0; | 156 | pm_io_base = 0; |
| 158 | } | 157 | } |
diff --git a/drivers/i2c/busses/i2c-viapro.c b/drivers/i2c/busses/i2c-viapro.c index 47e52bf2c5ec..efc6bbf0cc0a 100644 --- a/drivers/i2c/busses/i2c-viapro.c +++ b/drivers/i2c/busses/i2c-viapro.c | |||
| @@ -34,6 +34,8 @@ | |||
| 34 | VT8233A 0x3147 yes? | 34 | VT8233A 0x3147 yes? |
| 35 | VT8235 0x3177 yes | 35 | VT8235 0x3177 yes |
| 36 | VT8237R 0x3227 yes | 36 | VT8237R 0x3227 yes |
| 37 | VT8237A 0x3337 yes | ||
| 38 | VT8251 0x3287 yes | ||
| 37 | 39 | ||
| 38 | Note: we assume there can only be one device, with one SMBus interface. | 40 | Note: we assume there can only be one device, with one SMBus interface. |
| 39 | */ | 41 | */ |
| @@ -297,7 +299,7 @@ static u32 vt596_func(struct i2c_adapter *adapter) | |||
| 297 | return func; | 299 | return func; |
| 298 | } | 300 | } |
| 299 | 301 | ||
| 300 | static struct i2c_algorithm smbus_algorithm = { | 302 | static const struct i2c_algorithm smbus_algorithm = { |
| 301 | .smbus_xfer = vt596_access, | 303 | .smbus_xfer = vt596_access, |
| 302 | .functionality = vt596_func, | 304 | .functionality = vt596_func, |
| 303 | }; | 305 | }; |
| @@ -381,7 +383,9 @@ found: | |||
| 381 | dev_dbg(&pdev->dev, "VT596_smba = 0x%X\n", vt596_smba); | 383 | dev_dbg(&pdev->dev, "VT596_smba = 0x%X\n", vt596_smba); |
| 382 | 384 | ||
| 383 | switch (pdev->device) { | 385 | switch (pdev->device) { |
| 386 | case PCI_DEVICE_ID_VIA_8251: | ||
| 384 | case PCI_DEVICE_ID_VIA_8237: | 387 | case PCI_DEVICE_ID_VIA_8237: |
| 388 | case PCI_DEVICE_ID_VIA_8237A: | ||
| 385 | case PCI_DEVICE_ID_VIA_8235: | 389 | case PCI_DEVICE_ID_VIA_8235: |
| 386 | case PCI_DEVICE_ID_VIA_8233A: | 390 | case PCI_DEVICE_ID_VIA_8233A: |
| 387 | case PCI_DEVICE_ID_VIA_8233_0: | 391 | case PCI_DEVICE_ID_VIA_8233_0: |
| @@ -432,8 +436,12 @@ static struct pci_device_id vt596_ids[] = { | |||
| 432 | .driver_data = SMBBA3 }, | 436 | .driver_data = SMBBA3 }, |
| 433 | { PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8237), | 437 | { PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8237), |
| 434 | .driver_data = SMBBA3 }, | 438 | .driver_data = SMBBA3 }, |
| 439 | { PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8237A), | ||
| 440 | .driver_data = SMBBA3 }, | ||
| 435 | { PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8231_4), | 441 | { PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8231_4), |
| 436 | .driver_data = SMBBA1 }, | 442 | .driver_data = SMBBA1 }, |
| 443 | { PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8251), | ||
| 444 | .driver_data = SMBBA3 }, | ||
| 437 | { 0, } | 445 | { 0, } |
| 438 | }; | 446 | }; |
| 439 | 447 | ||
diff --git a/drivers/i2c/busses/i2c-voodoo3.c b/drivers/i2c/busses/i2c-voodoo3.c index b675773b0cc1..b0377b81744b 100644 --- a/drivers/i2c/busses/i2c-voodoo3.c +++ b/drivers/i2c/busses/i2c-voodoo3.c | |||
| @@ -160,7 +160,6 @@ static struct i2c_algo_bit_data voo_i2c_bit_data = { | |||
| 160 | .getsda = bit_vooi2c_getsda, | 160 | .getsda = bit_vooi2c_getsda, |
| 161 | .getscl = bit_vooi2c_getscl, | 161 | .getscl = bit_vooi2c_getscl, |
| 162 | .udelay = CYCLE_DELAY, | 162 | .udelay = CYCLE_DELAY, |
| 163 | .mdelay = CYCLE_DELAY, | ||
| 164 | .timeout = TIMEOUT | 163 | .timeout = TIMEOUT |
| 165 | }; | 164 | }; |
| 166 | 165 | ||
| @@ -177,7 +176,6 @@ static struct i2c_algo_bit_data voo_ddc_bit_data = { | |||
| 177 | .getsda = bit_vooddc_getsda, | 176 | .getsda = bit_vooddc_getsda, |
| 178 | .getscl = bit_vooddc_getscl, | 177 | .getscl = bit_vooddc_getscl, |
| 179 | .udelay = CYCLE_DELAY, | 178 | .udelay = CYCLE_DELAY, |
| 180 | .mdelay = CYCLE_DELAY, | ||
| 181 | .timeout = TIMEOUT | 179 | .timeout = TIMEOUT |
| 182 | }; | 180 | }; |
| 183 | 181 | ||
| @@ -213,14 +211,14 @@ static int __devinit voodoo3_probe(struct pci_dev *dev, const struct pci_device_ | |||
| 213 | return retval; | 211 | return retval; |
| 214 | retval = i2c_bit_add_bus(&voodoo3_ddc_adapter); | 212 | retval = i2c_bit_add_bus(&voodoo3_ddc_adapter); |
| 215 | if (retval) | 213 | if (retval) |
| 216 | i2c_bit_del_bus(&voodoo3_i2c_adapter); | 214 | i2c_del_adapter(&voodoo3_i2c_adapter); |
| 217 | return retval; | 215 | return retval; |
| 218 | } | 216 | } |
| 219 | 217 | ||
| 220 | static void __devexit voodoo3_remove(struct pci_dev *dev) | 218 | static void __devexit voodoo3_remove(struct pci_dev *dev) |
| 221 | { | 219 | { |
| 222 | i2c_bit_del_bus(&voodoo3_i2c_adapter); | 220 | i2c_del_adapter(&voodoo3_i2c_adapter); |
| 223 | i2c_bit_del_bus(&voodoo3_ddc_adapter); | 221 | i2c_del_adapter(&voodoo3_ddc_adapter); |
| 224 | iounmap(ioaddr); | 222 | iounmap(ioaddr); |
| 225 | } | 223 | } |
| 226 | 224 | ||
diff --git a/drivers/i2c/busses/scx200_acb.c b/drivers/i2c/busses/scx200_acb.c index eae9e81be375..714bae780953 100644 --- a/drivers/i2c/busses/scx200_acb.c +++ b/drivers/i2c/busses/scx200_acb.c | |||
| @@ -383,7 +383,7 @@ static u32 scx200_acb_func(struct i2c_adapter *adapter) | |||
| 383 | } | 383 | } |
| 384 | 384 | ||
| 385 | /* For now, we only handle combined mode (smbus) */ | 385 | /* For now, we only handle combined mode (smbus) */ |
| 386 | static struct i2c_algorithm scx200_acb_algorithm = { | 386 | static const struct i2c_algorithm scx200_acb_algorithm = { |
| 387 | .smbus_xfer = scx200_acb_smbus_xfer, | 387 | .smbus_xfer = scx200_acb_smbus_xfer, |
| 388 | .functionality = scx200_acb_func, | 388 | .functionality = scx200_acb_func, |
| 389 | }; | 389 | }; |
| @@ -494,11 +494,12 @@ static __init int scx200_create_pci(const char *text, struct pci_dev *pdev, | |||
| 494 | iface->pdev = pdev; | 494 | iface->pdev = pdev; |
| 495 | iface->bar = bar; | 495 | iface->bar = bar; |
| 496 | 496 | ||
| 497 | pci_enable_device_bars(iface->pdev, 1 << iface->bar); | 497 | rc = pci_enable_device_bars(iface->pdev, 1 << iface->bar); |
| 498 | if (rc) | ||
| 499 | goto errout_free; | ||
| 498 | 500 | ||
| 499 | rc = pci_request_region(iface->pdev, iface->bar, iface->adapter.name); | 501 | rc = pci_request_region(iface->pdev, iface->bar, iface->adapter.name); |
| 500 | 502 | if (rc) { | |
| 501 | if (rc != 0) { | ||
| 502 | printk(KERN_ERR NAME ": can't allocate PCI BAR %d\n", | 503 | printk(KERN_ERR NAME ": can't allocate PCI BAR %d\n", |
| 503 | iface->bar); | 504 | iface->bar); |
| 504 | goto errout_free; | 505 | goto errout_free; |
diff --git a/drivers/i2c/busses/scx200_i2c.c b/drivers/i2c/busses/scx200_i2c.c index cb3ef5ac99fd..6cd96e43aa72 100644 --- a/drivers/i2c/busses/scx200_i2c.c +++ b/drivers/i2c/busses/scx200_i2c.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* linux/drivers/i2c/scx200_i2c.c | 1 | /* linux/drivers/i2c/busses/scx200_i2c.c |
| 2 | 2 | ||
| 3 | Copyright (c) 2001,2002 Christer Weinigel <wingel@nano-system.com> | 3 | Copyright (c) 2001,2002 Christer Weinigel <wingel@nano-system.com> |
| 4 | 4 | ||
| @@ -71,12 +71,12 @@ static int scx200_i2c_getsda(void *data) | |||
| 71 | */ | 71 | */ |
| 72 | 72 | ||
| 73 | static struct i2c_algo_bit_data scx200_i2c_data = { | 73 | static struct i2c_algo_bit_data scx200_i2c_data = { |
| 74 | NULL, | 74 | .setsda = scx200_i2c_setsda, |
| 75 | scx200_i2c_setsda, | 75 | .setscl = scx200_i2c_setscl, |
| 76 | scx200_i2c_setscl, | 76 | .getsda = scx200_i2c_getsda, |
| 77 | scx200_i2c_getsda, | 77 | .getscl = scx200_i2c_getscl, |
| 78 | scx200_i2c_getscl, | 78 | .udelay = 10, |
| 79 | 10, 10, 100, /* waits, timeout */ | 79 | .timeout = 100, |
| 80 | }; | 80 | }; |
| 81 | 81 | ||
| 82 | static struct i2c_adapter scx200_i2c_ops = { | 82 | static struct i2c_adapter scx200_i2c_ops = { |
| @@ -116,7 +116,7 @@ static int scx200_i2c_init(void) | |||
| 116 | 116 | ||
| 117 | static void scx200_i2c_cleanup(void) | 117 | static void scx200_i2c_cleanup(void) |
| 118 | { | 118 | { |
| 119 | i2c_bit_del_bus(&scx200_i2c_ops); | 119 | i2c_del_adapter(&scx200_i2c_ops); |
| 120 | } | 120 | } |
| 121 | 121 | ||
| 122 | module_init(scx200_i2c_init); | 122 | module_init(scx200_i2c_init); |
diff --git a/drivers/i2c/chips/ds1337.c b/drivers/i2c/chips/ds1337.c index 93d483b8b770..ec17d6b684a2 100644 --- a/drivers/i2c/chips/ds1337.c +++ b/drivers/i2c/chips/ds1337.c | |||
| @@ -347,13 +347,19 @@ static void ds1337_init_client(struct i2c_client *client) | |||
| 347 | 347 | ||
| 348 | if ((status & 0x80) || (control & 0x80)) { | 348 | if ((status & 0x80) || (control & 0x80)) { |
| 349 | /* RTC not running */ | 349 | /* RTC not running */ |
| 350 | u8 buf[16]; | 350 | u8 buf[1+16]; /* First byte is interpreted as address */ |
| 351 | struct i2c_msg msg[1]; | 351 | struct i2c_msg msg[1]; |
| 352 | 352 | ||
| 353 | dev_dbg(&client->dev, "%s: RTC not running!\n", __FUNCTION__); | 353 | dev_dbg(&client->dev, "%s: RTC not running!\n", __FUNCTION__); |
| 354 | 354 | ||
| 355 | /* Initialize all, including STATUS and CONTROL to zero */ | 355 | /* Initialize all, including STATUS and CONTROL to zero */ |
| 356 | memset(buf, 0, sizeof(buf)); | 356 | memset(buf, 0, sizeof(buf)); |
| 357 | |||
| 358 | /* Write valid values in the date/time registers */ | ||
| 359 | buf[1+DS1337_REG_DAY] = 1; | ||
| 360 | buf[1+DS1337_REG_DATE] = 1; | ||
| 361 | buf[1+DS1337_REG_MONTH] = 1; | ||
| 362 | |||
| 357 | msg[0].addr = client->addr; | 363 | msg[0].addr = client->addr; |
| 358 | msg[0].flags = 0; | 364 | msg[0].flags = 0; |
| 359 | msg[0].len = sizeof(buf); | 365 | msg[0].len = sizeof(buf); |
diff --git a/drivers/i2c/chips/ds1374.c b/drivers/i2c/chips/ds1374.c index 4630f1969a09..15edf40828b4 100644 --- a/drivers/i2c/chips/ds1374.c +++ b/drivers/i2c/chips/ds1374.c | |||
| @@ -140,12 +140,14 @@ ulong ds1374_get_rtc_time(void) | |||
| 140 | return t1; | 140 | return t1; |
| 141 | } | 141 | } |
| 142 | 142 | ||
| 143 | static void ds1374_set_work(void *arg) | 143 | static ulong new_time; |
| 144 | |||
| 145 | static void ds1374_set_work(struct work_struct *work) | ||
| 144 | { | 146 | { |
| 145 | ulong t1, t2; | 147 | ulong t1, t2; |
| 146 | int limit = 10; /* arbitrary retry limit */ | 148 | int limit = 10; /* arbitrary retry limit */ |
| 147 | 149 | ||
| 148 | t1 = *(ulong *) arg; | 150 | t1 = new_time; |
| 149 | 151 | ||
| 150 | mutex_lock(&ds1374_mutex); | 152 | mutex_lock(&ds1374_mutex); |
| 151 | 153 | ||
| @@ -167,11 +169,9 @@ static void ds1374_set_work(void *arg) | |||
| 167 | "can't confirm time set from rtc chip\n"); | 169 | "can't confirm time set from rtc chip\n"); |
| 168 | } | 170 | } |
| 169 | 171 | ||
| 170 | static ulong new_time; | ||
| 171 | |||
| 172 | static struct workqueue_struct *ds1374_workqueue; | 172 | static struct workqueue_struct *ds1374_workqueue; |
| 173 | 173 | ||
| 174 | static DECLARE_WORK(ds1374_work, ds1374_set_work, &new_time); | 174 | static DECLARE_WORK(ds1374_work, ds1374_set_work); |
| 175 | 175 | ||
| 176 | int ds1374_set_rtc_time(ulong nowtime) | 176 | int ds1374_set_rtc_time(ulong nowtime) |
| 177 | { | 177 | { |
| @@ -180,7 +180,7 @@ int ds1374_set_rtc_time(ulong nowtime) | |||
| 180 | if (in_interrupt()) | 180 | if (in_interrupt()) |
| 181 | queue_work(ds1374_workqueue, &ds1374_work); | 181 | queue_work(ds1374_workqueue, &ds1374_work); |
| 182 | else | 182 | else |
| 183 | ds1374_set_work(&new_time); | 183 | ds1374_set_work(NULL); |
| 184 | 184 | ||
| 185 | return 0; | 185 | return 0; |
| 186 | } | 186 | } |
diff --git a/drivers/i2c/chips/eeprom.c b/drivers/i2c/chips/eeprom.c index 13c108269a6d..cec3a0c3894d 100644 --- a/drivers/i2c/chips/eeprom.c +++ b/drivers/i2c/chips/eeprom.c | |||
| @@ -209,10 +209,14 @@ static int eeprom_detect(struct i2c_adapter *adapter, int address, int kind) | |||
| 209 | } | 209 | } |
| 210 | 210 | ||
| 211 | /* create the sysfs eeprom file */ | 211 | /* create the sysfs eeprom file */ |
| 212 | sysfs_create_bin_file(&new_client->dev.kobj, &eeprom_attr); | 212 | err = sysfs_create_bin_file(&new_client->dev.kobj, &eeprom_attr); |
| 213 | if (err) | ||
| 214 | goto exit_detach; | ||
| 213 | 215 | ||
| 214 | return 0; | 216 | return 0; |
| 215 | 217 | ||
| 218 | exit_detach: | ||
| 219 | i2c_detach_client(new_client); | ||
| 216 | exit_kfree: | 220 | exit_kfree: |
| 217 | kfree(data); | 221 | kfree(data); |
| 218 | exit: | 222 | exit: |
| @@ -223,6 +227,8 @@ static int eeprom_detach_client(struct i2c_client *client) | |||
| 223 | { | 227 | { |
| 224 | int err; | 228 | int err; |
| 225 | 229 | ||
| 230 | sysfs_remove_bin_file(&client->dev.kobj, &eeprom_attr); | ||
| 231 | |||
| 226 | err = i2c_detach_client(client); | 232 | err = i2c_detach_client(client); |
| 227 | if (err) | 233 | if (err) |
| 228 | return err; | 234 | return err; |
diff --git a/drivers/i2c/chips/isp1301_omap.c b/drivers/i2c/chips/isp1301_omap.c index f92505b94c61..ccdf3e90862b 100644 --- a/drivers/i2c/chips/isp1301_omap.c +++ b/drivers/i2c/chips/isp1301_omap.c | |||
| @@ -30,7 +30,7 @@ | |||
| 30 | #include <linux/usb_ch9.h> | 30 | #include <linux/usb_ch9.h> |
| 31 | #include <linux/usb_gadget.h> | 31 | #include <linux/usb_gadget.h> |
| 32 | #include <linux/usb.h> | 32 | #include <linux/usb.h> |
| 33 | #include <linux/usb_otg.h> | 33 | #include <linux/usb/otg.h> |
| 34 | #include <linux/i2c.h> | 34 | #include <linux/i2c.h> |
| 35 | #include <linux/workqueue.h> | 35 | #include <linux/workqueue.h> |
| 36 | 36 | ||
| @@ -669,7 +669,7 @@ pulldown: | |||
| 669 | dump_regs(isp, "otg->isp1301"); | 669 | dump_regs(isp, "otg->isp1301"); |
| 670 | } | 670 | } |
| 671 | 671 | ||
| 672 | static irqreturn_t omap_otg_irq(int irq, void *_isp, struct pt_regs *regs) | 672 | static irqreturn_t omap_otg_irq(int irq, void *_isp) |
| 673 | { | 673 | { |
| 674 | u16 otg_irq = OTG_IRQ_SRC_REG; | 674 | u16 otg_irq = OTG_IRQ_SRC_REG; |
| 675 | u32 otg_ctrl; | 675 | u32 otg_ctrl; |
| @@ -1181,7 +1181,7 @@ isp1301_work(void *data) | |||
| 1181 | isp->working = 0; | 1181 | isp->working = 0; |
| 1182 | } | 1182 | } |
| 1183 | 1183 | ||
| 1184 | static irqreturn_t isp1301_irq(int irq, void *isp, struct pt_regs *regs) | 1184 | static irqreturn_t isp1301_irq(int irq, void *isp) |
| 1185 | { | 1185 | { |
| 1186 | isp1301_defer_work(isp, WORK_UPDATE_OTG); | 1186 | isp1301_defer_work(isp, WORK_UPDATE_OTG); |
| 1187 | return IRQ_HANDLED; | 1187 | return IRQ_HANDLED; |
diff --git a/drivers/i2c/chips/m41t00.c b/drivers/i2c/chips/m41t00.c index 2dd0a34d9472..420377c86422 100644 --- a/drivers/i2c/chips/m41t00.c +++ b/drivers/i2c/chips/m41t00.c | |||
| @@ -215,8 +215,15 @@ m41t00_set(void *arg) | |||
| 215 | } | 215 | } |
| 216 | 216 | ||
| 217 | static ulong new_time; | 217 | static ulong new_time; |
| 218 | /* well, isn't this API just _lovely_? */ | ||
| 219 | static void | ||
| 220 | m41t00_barf(struct work_struct *unusable) | ||
| 221 | { | ||
| 222 | m41t00_set(&new_time); | ||
| 223 | } | ||
| 224 | |||
| 218 | static struct workqueue_struct *m41t00_wq; | 225 | static struct workqueue_struct *m41t00_wq; |
| 219 | static DECLARE_WORK(m41t00_work, m41t00_set, &new_time); | 226 | static DECLARE_WORK(m41t00_work, m41t00_barf); |
| 220 | 227 | ||
| 221 | int | 228 | int |
| 222 | m41t00_set_rtc_time(ulong nowtime) | 229 | m41t00_set_rtc_time(ulong nowtime) |
diff --git a/drivers/i2c/chips/max6875.c b/drivers/i2c/chips/max6875.c index 88d2ddee4490..76645c142977 100644 --- a/drivers/i2c/chips/max6875.c +++ b/drivers/i2c/chips/max6875.c | |||
| @@ -199,8 +199,7 @@ static int max6875_detect(struct i2c_adapter *adapter, int address, int kind) | |||
| 199 | mutex_init(&data->update_lock); | 199 | mutex_init(&data->update_lock); |
| 200 | 200 | ||
| 201 | /* Init fake client data */ | 201 | /* Init fake client data */ |
| 202 | /* set the client data to the i2c_client so that it will get freed */ | 202 | i2c_set_clientdata(fake_client, NULL); |
| 203 | i2c_set_clientdata(fake_client, fake_client); | ||
| 204 | fake_client->addr = address | 1; | 203 | fake_client->addr = address | 1; |
| 205 | fake_client->adapter = adapter; | 204 | fake_client->adapter = adapter; |
| 206 | fake_client->driver = &max6875_driver; | 205 | fake_client->driver = &max6875_driver; |
| @@ -214,13 +213,17 @@ static int max6875_detect(struct i2c_adapter *adapter, int address, int kind) | |||
| 214 | goto exit_kfree2; | 213 | goto exit_kfree2; |
| 215 | 214 | ||
| 216 | if ((err = i2c_attach_client(fake_client)) != 0) | 215 | if ((err = i2c_attach_client(fake_client)) != 0) |
| 217 | goto exit_detach; | 216 | goto exit_detach1; |
| 218 | 217 | ||
| 219 | sysfs_create_bin_file(&real_client->dev.kobj, &user_eeprom_attr); | 218 | err = sysfs_create_bin_file(&real_client->dev.kobj, &user_eeprom_attr); |
| 219 | if (err) | ||
| 220 | goto exit_detach2; | ||
| 220 | 221 | ||
| 221 | return 0; | 222 | return 0; |
| 222 | 223 | ||
| 223 | exit_detach: | 224 | exit_detach2: |
| 225 | i2c_detach_client(fake_client); | ||
| 226 | exit_detach1: | ||
| 224 | i2c_detach_client(real_client); | 227 | i2c_detach_client(real_client); |
| 225 | exit_kfree2: | 228 | exit_kfree2: |
| 226 | kfree(fake_client); | 229 | kfree(fake_client); |
| @@ -229,14 +232,24 @@ exit_kfree1: | |||
| 229 | return err; | 232 | return err; |
| 230 | } | 233 | } |
| 231 | 234 | ||
| 235 | /* Will be called for both the real client and the fake client */ | ||
| 232 | static int max6875_detach_client(struct i2c_client *client) | 236 | static int max6875_detach_client(struct i2c_client *client) |
| 233 | { | 237 | { |
| 234 | int err; | 238 | int err; |
| 239 | struct max6875_data *data = i2c_get_clientdata(client); | ||
| 240 | |||
| 241 | /* data is NULL for the fake client */ | ||
| 242 | if (data) | ||
| 243 | sysfs_remove_bin_file(&client->dev.kobj, &user_eeprom_attr); | ||
| 235 | 244 | ||
| 236 | err = i2c_detach_client(client); | 245 | err = i2c_detach_client(client); |
| 237 | if (err) | 246 | if (err) |
| 238 | return err; | 247 | return err; |
| 239 | kfree(i2c_get_clientdata(client)); | 248 | |
| 249 | if (data) /* real client */ | ||
| 250 | kfree(data); | ||
| 251 | else /* fake client */ | ||
| 252 | kfree(client); | ||
| 240 | return 0; | 253 | return 0; |
| 241 | } | 254 | } |
| 242 | 255 | ||
diff --git a/drivers/i2c/chips/pca9539.c b/drivers/i2c/chips/pca9539.c index cb22280cdd27..f43c4e79b55e 100644 --- a/drivers/i2c/chips/pca9539.c +++ b/drivers/i2c/chips/pca9539.c | |||
| @@ -148,11 +148,16 @@ static int pca9539_detect(struct i2c_adapter *adapter, int address, int kind) | |||
| 148 | if ((err = i2c_attach_client(new_client))) | 148 | if ((err = i2c_attach_client(new_client))) |
| 149 | goto exit_kfree; | 149 | goto exit_kfree; |
| 150 | 150 | ||
| 151 | /* Register sysfs hooks (don't care about failure) */ | 151 | /* Register sysfs hooks */ |
| 152 | sysfs_create_group(&new_client->dev.kobj, &pca9539_defattr_group); | 152 | err = sysfs_create_group(&new_client->dev.kobj, |
| 153 | &pca9539_defattr_group); | ||
| 154 | if (err) | ||
| 155 | goto exit_detach; | ||
| 153 | 156 | ||
| 154 | return 0; | 157 | return 0; |
| 155 | 158 | ||
| 159 | exit_detach: | ||
| 160 | i2c_detach_client(new_client); | ||
| 156 | exit_kfree: | 161 | exit_kfree: |
| 157 | kfree(data); | 162 | kfree(data); |
| 158 | exit: | 163 | exit: |
| @@ -163,6 +168,8 @@ static int pca9539_detach_client(struct i2c_client *client) | |||
| 163 | { | 168 | { |
| 164 | int err; | 169 | int err; |
| 165 | 170 | ||
| 171 | sysfs_remove_group(&client->dev.kobj, &pca9539_defattr_group); | ||
| 172 | |||
| 166 | if ((err = i2c_detach_client(client))) | 173 | if ((err = i2c_detach_client(client))) |
| 167 | return err; | 174 | return err; |
| 168 | 175 | ||
diff --git a/drivers/i2c/chips/pcf8574.c b/drivers/i2c/chips/pcf8574.c index c3e6449c4481..32b25427eaba 100644 --- a/drivers/i2c/chips/pcf8574.c +++ b/drivers/i2c/chips/pcf8574.c | |||
| @@ -105,6 +105,16 @@ static ssize_t set_write(struct device *dev, struct device_attribute *attr, cons | |||
| 105 | 105 | ||
| 106 | static DEVICE_ATTR(write, S_IWUSR | S_IRUGO, show_write, set_write); | 106 | static DEVICE_ATTR(write, S_IWUSR | S_IRUGO, show_write, set_write); |
| 107 | 107 | ||
| 108 | static struct attribute *pcf8574_attributes[] = { | ||
| 109 | &dev_attr_read.attr, | ||
| 110 | &dev_attr_write.attr, | ||
| 111 | NULL | ||
| 112 | }; | ||
| 113 | |||
| 114 | static const struct attribute_group pcf8574_attr_group = { | ||
| 115 | .attrs = pcf8574_attributes, | ||
| 116 | }; | ||
| 117 | |||
| 108 | /* | 118 | /* |
| 109 | * Real code | 119 | * Real code |
| 110 | */ | 120 | */ |
| @@ -166,13 +176,13 @@ static int pcf8574_detect(struct i2c_adapter *adapter, int address, int kind) | |||
| 166 | pcf8574_init_client(new_client); | 176 | pcf8574_init_client(new_client); |
| 167 | 177 | ||
| 168 | /* Register sysfs hooks */ | 178 | /* Register sysfs hooks */ |
| 169 | device_create_file(&new_client->dev, &dev_attr_read); | 179 | err = sysfs_create_group(&new_client->dev.kobj, &pcf8574_attr_group); |
| 170 | device_create_file(&new_client->dev, &dev_attr_write); | 180 | if (err) |
| 181 | goto exit_detach; | ||
| 171 | return 0; | 182 | return 0; |
| 172 | 183 | ||
| 173 | /* OK, this is not exactly good programming practice, usually. But it is | 184 | exit_detach: |
| 174 | very code-efficient in this case. */ | 185 | i2c_detach_client(new_client); |
| 175 | |||
| 176 | exit_free: | 186 | exit_free: |
| 177 | kfree(data); | 187 | kfree(data); |
| 178 | exit: | 188 | exit: |
| @@ -183,6 +193,8 @@ static int pcf8574_detach_client(struct i2c_client *client) | |||
| 183 | { | 193 | { |
| 184 | int err; | 194 | int err; |
| 185 | 195 | ||
| 196 | sysfs_remove_group(&client->dev.kobj, &pcf8574_attr_group); | ||
| 197 | |||
| 186 | if ((err = i2c_detach_client(client))) | 198 | if ((err = i2c_detach_client(client))) |
| 187 | return err; | 199 | return err; |
| 188 | 200 | ||
diff --git a/drivers/i2c/chips/pcf8591.c b/drivers/i2c/chips/pcf8591.c index 925a6b371fd2..4dc36376eb32 100644 --- a/drivers/i2c/chips/pcf8591.c +++ b/drivers/i2c/chips/pcf8591.c | |||
| @@ -158,6 +158,28 @@ static ssize_t set_out0_enable(struct device *dev, struct device_attribute *attr | |||
| 158 | static DEVICE_ATTR(out0_enable, S_IWUSR | S_IRUGO, | 158 | static DEVICE_ATTR(out0_enable, S_IWUSR | S_IRUGO, |
| 159 | show_out0_enable, set_out0_enable); | 159 | show_out0_enable, set_out0_enable); |
| 160 | 160 | ||
| 161 | static struct attribute *pcf8591_attributes[] = { | ||
| 162 | &dev_attr_out0_enable.attr, | ||
| 163 | &dev_attr_out0_output.attr, | ||
| 164 | &dev_attr_in0_input.attr, | ||
| 165 | &dev_attr_in1_input.attr, | ||
| 166 | NULL | ||
| 167 | }; | ||
| 168 | |||
| 169 | static const struct attribute_group pcf8591_attr_group = { | ||
| 170 | .attrs = pcf8591_attributes, | ||
| 171 | }; | ||
| 172 | |||
| 173 | static struct attribute *pcf8591_attributes_opt[] = { | ||
| 174 | &dev_attr_in2_input.attr, | ||
| 175 | &dev_attr_in3_input.attr, | ||
| 176 | NULL | ||
| 177 | }; | ||
| 178 | |||
| 179 | static const struct attribute_group pcf8591_attr_group_opt = { | ||
| 180 | .attrs = pcf8591_attributes_opt, | ||
| 181 | }; | ||
| 182 | |||
| 161 | /* | 183 | /* |
| 162 | * Real code | 184 | * Real code |
| 163 | */ | 185 | */ |
| @@ -211,24 +233,31 @@ static int pcf8591_detect(struct i2c_adapter *adapter, int address, int kind) | |||
| 211 | pcf8591_init_client(new_client); | 233 | pcf8591_init_client(new_client); |
| 212 | 234 | ||
| 213 | /* Register sysfs hooks */ | 235 | /* Register sysfs hooks */ |
| 214 | device_create_file(&new_client->dev, &dev_attr_out0_enable); | 236 | err = sysfs_create_group(&new_client->dev.kobj, &pcf8591_attr_group); |
| 215 | device_create_file(&new_client->dev, &dev_attr_out0_output); | 237 | if (err) |
| 216 | device_create_file(&new_client->dev, &dev_attr_in0_input); | 238 | goto exit_detach; |
| 217 | device_create_file(&new_client->dev, &dev_attr_in1_input); | ||
| 218 | 239 | ||
| 219 | /* Register input2 if not in "two differential inputs" mode */ | 240 | /* Register input2 if not in "two differential inputs" mode */ |
| 220 | if (input_mode != 3 ) | 241 | if (input_mode != 3) { |
| 221 | device_create_file(&new_client->dev, &dev_attr_in2_input); | 242 | if ((err = device_create_file(&new_client->dev, |
| 222 | 243 | &dev_attr_in2_input))) | |
| 244 | goto exit_sysfs_remove; | ||
| 245 | } | ||
| 246 | |||
| 223 | /* Register input3 only in "four single ended inputs" mode */ | 247 | /* Register input3 only in "four single ended inputs" mode */ |
| 224 | if (input_mode == 0) | 248 | if (input_mode == 0) { |
| 225 | device_create_file(&new_client->dev, &dev_attr_in3_input); | 249 | if ((err = device_create_file(&new_client->dev, |
| 226 | 250 | &dev_attr_in3_input))) | |
| 251 | goto exit_sysfs_remove; | ||
| 252 | } | ||
| 253 | |||
| 227 | return 0; | 254 | return 0; |
| 228 | |||
| 229 | /* OK, this is not exactly good programming practice, usually. But it is | ||
| 230 | very code-efficient in this case. */ | ||
| 231 | 255 | ||
| 256 | exit_sysfs_remove: | ||
| 257 | sysfs_remove_group(&new_client->dev.kobj, &pcf8591_attr_group_opt); | ||
| 258 | sysfs_remove_group(&new_client->dev.kobj, &pcf8591_attr_group); | ||
| 259 | exit_detach: | ||
| 260 | i2c_detach_client(new_client); | ||
| 232 | exit_kfree: | 261 | exit_kfree: |
| 233 | kfree(data); | 262 | kfree(data); |
| 234 | exit: | 263 | exit: |
| @@ -239,6 +268,9 @@ static int pcf8591_detach_client(struct i2c_client *client) | |||
| 239 | { | 268 | { |
| 240 | int err; | 269 | int err; |
| 241 | 270 | ||
| 271 | sysfs_remove_group(&client->dev.kobj, &pcf8591_attr_group_opt); | ||
| 272 | sysfs_remove_group(&client->dev.kobj, &pcf8591_attr_group); | ||
| 273 | |||
| 242 | if ((err = i2c_detach_client(client))) | 274 | if ((err = i2c_detach_client(client))) |
| 243 | return err; | 275 | return err; |
| 244 | 276 | ||
diff --git a/drivers/i2c/chips/tps65010.c b/drivers/i2c/chips/tps65010.c index 0be6fd6a267d..60bef94cd25f 100644 --- a/drivers/i2c/chips/tps65010.c +++ b/drivers/i2c/chips/tps65010.c | |||
| @@ -305,7 +305,7 @@ static int dbg_show(struct seq_file *s, void *_) | |||
| 305 | 305 | ||
| 306 | static int dbg_tps_open(struct inode *inode, struct file *file) | 306 | static int dbg_tps_open(struct inode *inode, struct file *file) |
| 307 | { | 307 | { |
| 308 | return single_open(file, dbg_show, inode->u.generic_ip); | 308 | return single_open(file, dbg_show, inode->i_private); |
| 309 | } | 309 | } |
| 310 | 310 | ||
| 311 | static struct file_operations debug_fops = { | 311 | static struct file_operations debug_fops = { |
| @@ -446,7 +446,7 @@ static void tps65010_work(void *_tps) | |||
| 446 | mutex_unlock(&tps->lock); | 446 | mutex_unlock(&tps->lock); |
| 447 | } | 447 | } |
| 448 | 448 | ||
| 449 | static irqreturn_t tps65010_irq(int irq, void *_tps, struct pt_regs *regs) | 449 | static irqreturn_t tps65010_irq(int irq, void *_tps) |
| 450 | { | 450 | { |
| 451 | struct tps65010 *tps = _tps; | 451 | struct tps65010 *tps = _tps; |
| 452 | 452 | ||
diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c index 9cb277d6aa48..3e31f1d265c9 100644 --- a/drivers/i2c/i2c-core.c +++ b/drivers/i2c/i2c-core.c | |||
| @@ -127,20 +127,17 @@ static ssize_t show_client_name(struct device *dev, struct device_attribute *att | |||
| 127 | return sprintf(buf, "%s\n", client->name); | 127 | return sprintf(buf, "%s\n", client->name); |
| 128 | } | 128 | } |
| 129 | 129 | ||
| 130 | /* | 130 | /* |
| 131 | * We can't use the DEVICE_ATTR() macro here as we want the same filename for a | 131 | * We can't use the DEVICE_ATTR() macro here, as we used the same name for |
| 132 | * different type of a device. So beware if the DEVICE_ATTR() macro ever | 132 | * an i2c adapter attribute (above). |
| 133 | * changes, this definition will also have to change. | ||
| 134 | */ | 133 | */ |
| 135 | static struct device_attribute dev_attr_client_name = { | 134 | static struct device_attribute dev_attr_client_name = |
| 136 | .attr = {.name = "name", .mode = S_IRUGO, .owner = THIS_MODULE }, | 135 | __ATTR(name, S_IRUGO, &show_client_name, NULL); |
| 137 | .show = &show_client_name, | ||
| 138 | }; | ||
| 139 | 136 | ||
| 140 | 137 | ||
| 141 | /* --------------------------------------------------- | 138 | /* --------------------------------------------------- |
| 142 | * registering functions | 139 | * registering functions |
| 143 | * --------------------------------------------------- | 140 | * --------------------------------------------------- |
| 144 | */ | 141 | */ |
| 145 | 142 | ||
| 146 | /* ----- | 143 | /* ----- |
| @@ -183,15 +180,21 @@ int i2c_add_adapter(struct i2c_adapter *adap) | |||
| 183 | sprintf(adap->dev.bus_id, "i2c-%d", adap->nr); | 180 | sprintf(adap->dev.bus_id, "i2c-%d", adap->nr); |
| 184 | adap->dev.driver = &i2c_adapter_driver; | 181 | adap->dev.driver = &i2c_adapter_driver; |
| 185 | adap->dev.release = &i2c_adapter_dev_release; | 182 | adap->dev.release = &i2c_adapter_dev_release; |
| 186 | device_register(&adap->dev); | 183 | res = device_register(&adap->dev); |
| 187 | device_create_file(&adap->dev, &dev_attr_name); | 184 | if (res) |
| 185 | goto out_list; | ||
| 186 | res = device_create_file(&adap->dev, &dev_attr_name); | ||
| 187 | if (res) | ||
| 188 | goto out_unregister; | ||
| 188 | 189 | ||
| 189 | /* Add this adapter to the i2c_adapter class */ | 190 | /* Add this adapter to the i2c_adapter class */ |
| 190 | memset(&adap->class_dev, 0x00, sizeof(struct class_device)); | 191 | memset(&adap->class_dev, 0x00, sizeof(struct class_device)); |
| 191 | adap->class_dev.dev = &adap->dev; | 192 | adap->class_dev.dev = &adap->dev; |
| 192 | adap->class_dev.class = &i2c_adapter_class; | 193 | adap->class_dev.class = &i2c_adapter_class; |
| 193 | strlcpy(adap->class_dev.class_id, adap->dev.bus_id, BUS_ID_SIZE); | 194 | strlcpy(adap->class_dev.class_id, adap->dev.bus_id, BUS_ID_SIZE); |
| 194 | class_device_register(&adap->class_dev); | 195 | res = class_device_register(&adap->class_dev); |
| 196 | if (res) | ||
| 197 | goto out_remove_name; | ||
| 195 | 198 | ||
| 196 | dev_dbg(&adap->dev, "adapter [%s] registered\n", adap->name); | 199 | dev_dbg(&adap->dev, "adapter [%s] registered\n", adap->name); |
| 197 | 200 | ||
| @@ -206,6 +209,17 @@ int i2c_add_adapter(struct i2c_adapter *adap) | |||
| 206 | out_unlock: | 209 | out_unlock: |
| 207 | mutex_unlock(&core_lists); | 210 | mutex_unlock(&core_lists); |
| 208 | return res; | 211 | return res; |
| 212 | |||
| 213 | out_remove_name: | ||
| 214 | device_remove_file(&adap->dev, &dev_attr_name); | ||
| 215 | out_unregister: | ||
| 216 | init_completion(&adap->dev_released); /* Needed? */ | ||
| 217 | device_unregister(&adap->dev); | ||
| 218 | wait_for_completion(&adap->dev_released); | ||
| 219 | out_list: | ||
| 220 | list_del(&adap->list); | ||
| 221 | idr_remove(&i2c_adapter_idr, adap->nr); | ||
| 222 | goto out_unlock; | ||
| 209 | } | 223 | } |
| 210 | 224 | ||
| 211 | 225 | ||
| @@ -297,7 +311,7 @@ int i2c_register_driver(struct module *owner, struct i2c_driver *driver) | |||
| 297 | res = driver_register(&driver->driver); | 311 | res = driver_register(&driver->driver); |
| 298 | if (res) | 312 | if (res) |
| 299 | return res; | 313 | return res; |
| 300 | 314 | ||
| 301 | mutex_lock(&core_lists); | 315 | mutex_lock(&core_lists); |
| 302 | 316 | ||
| 303 | list_add_tail(&driver->list,&drivers); | 317 | list_add_tail(&driver->list,&drivers); |
| @@ -321,13 +335,13 @@ int i2c_del_driver(struct i2c_driver *driver) | |||
| 321 | struct list_head *item1, *item2, *_n; | 335 | struct list_head *item1, *item2, *_n; |
| 322 | struct i2c_client *client; | 336 | struct i2c_client *client; |
| 323 | struct i2c_adapter *adap; | 337 | struct i2c_adapter *adap; |
| 324 | 338 | ||
| 325 | int res = 0; | 339 | int res = 0; |
| 326 | 340 | ||
| 327 | mutex_lock(&core_lists); | 341 | mutex_lock(&core_lists); |
| 328 | 342 | ||
| 329 | /* Have a look at each adapter, if clients of this driver are still | 343 | /* Have a look at each adapter, if clients of this driver are still |
| 330 | * attached. If so, detach them to be able to kill the driver | 344 | * attached. If so, detach them to be able to kill the driver |
| 331 | * afterwards. | 345 | * afterwards. |
| 332 | */ | 346 | */ |
| 333 | list_for_each(item1,&adapters) { | 347 | list_for_each(item1,&adapters) { |
| @@ -394,22 +408,14 @@ int i2c_check_addr(struct i2c_adapter *adapter, int addr) | |||
| 394 | int i2c_attach_client(struct i2c_client *client) | 408 | int i2c_attach_client(struct i2c_client *client) |
| 395 | { | 409 | { |
| 396 | struct i2c_adapter *adapter = client->adapter; | 410 | struct i2c_adapter *adapter = client->adapter; |
| 411 | int res = 0; | ||
| 397 | 412 | ||
| 398 | mutex_lock(&adapter->clist_lock); | 413 | mutex_lock(&adapter->clist_lock); |
| 399 | if (__i2c_check_addr(client->adapter, client->addr)) { | 414 | if (__i2c_check_addr(client->adapter, client->addr)) { |
| 400 | mutex_unlock(&adapter->clist_lock); | 415 | res = -EBUSY; |
| 401 | return -EBUSY; | 416 | goto out_unlock; |
| 402 | } | 417 | } |
| 403 | list_add_tail(&client->list,&adapter->clients); | 418 | list_add_tail(&client->list,&adapter->clients); |
| 404 | mutex_unlock(&adapter->clist_lock); | ||
| 405 | |||
| 406 | if (adapter->client_register) { | ||
| 407 | if (adapter->client_register(client)) { | ||
| 408 | dev_dbg(&adapter->dev, "client_register " | ||
| 409 | "failed for client [%s] at 0x%02x\n", | ||
| 410 | client->name, client->addr); | ||
| 411 | } | ||
| 412 | } | ||
| 413 | 419 | ||
| 414 | client->usage_count = 0; | 420 | client->usage_count = 0; |
| 415 | 421 | ||
| @@ -417,15 +423,40 @@ int i2c_attach_client(struct i2c_client *client) | |||
| 417 | client->dev.driver = &client->driver->driver; | 423 | client->dev.driver = &client->driver->driver; |
| 418 | client->dev.bus = &i2c_bus_type; | 424 | client->dev.bus = &i2c_bus_type; |
| 419 | client->dev.release = &i2c_client_release; | 425 | client->dev.release = &i2c_client_release; |
| 420 | 426 | ||
| 421 | snprintf(&client->dev.bus_id[0], sizeof(client->dev.bus_id), | 427 | snprintf(&client->dev.bus_id[0], sizeof(client->dev.bus_id), |
| 422 | "%d-%04x", i2c_adapter_id(adapter), client->addr); | 428 | "%d-%04x", i2c_adapter_id(adapter), client->addr); |
| 423 | dev_dbg(&adapter->dev, "client [%s] registered with bus id %s\n", | 429 | dev_dbg(&adapter->dev, "client [%s] registered with bus id %s\n", |
| 424 | client->name, client->dev.bus_id); | 430 | client->name, client->dev.bus_id); |
| 425 | device_register(&client->dev); | 431 | res = device_register(&client->dev); |
| 426 | device_create_file(&client->dev, &dev_attr_client_name); | 432 | if (res) |
| 427 | 433 | goto out_list; | |
| 434 | res = device_create_file(&client->dev, &dev_attr_client_name); | ||
| 435 | if (res) | ||
| 436 | goto out_unregister; | ||
| 437 | mutex_unlock(&adapter->clist_lock); | ||
| 438 | |||
| 439 | if (adapter->client_register) { | ||
| 440 | if (adapter->client_register(client)) { | ||
| 441 | dev_dbg(&adapter->dev, "client_register " | ||
| 442 | "failed for client [%s] at 0x%02x\n", | ||
| 443 | client->name, client->addr); | ||
| 444 | } | ||
| 445 | } | ||
| 446 | |||
| 428 | return 0; | 447 | return 0; |
| 448 | |||
| 449 | out_unregister: | ||
| 450 | init_completion(&client->released); /* Needed? */ | ||
| 451 | device_unregister(&client->dev); | ||
| 452 | wait_for_completion(&client->released); | ||
| 453 | out_list: | ||
| 454 | list_del(&client->list); | ||
| 455 | dev_err(&adapter->dev, "Failed to attach i2c client %s at 0x%02x " | ||
| 456 | "(%d)\n", client->name, client->addr, res); | ||
| 457 | out_unlock: | ||
| 458 | mutex_unlock(&adapter->clist_lock); | ||
| 459 | return res; | ||
| 429 | } | 460 | } |
| 430 | 461 | ||
| 431 | 462 | ||
| @@ -433,7 +464,7 @@ int i2c_detach_client(struct i2c_client *client) | |||
| 433 | { | 464 | { |
| 434 | struct i2c_adapter *adapter = client->adapter; | 465 | struct i2c_adapter *adapter = client->adapter; |
| 435 | int res = 0; | 466 | int res = 0; |
| 436 | 467 | ||
| 437 | if (client->usage_count > 0) { | 468 | if (client->usage_count > 0) { |
| 438 | dev_warn(&client->dev, "Client [%s] still busy, " | 469 | dev_warn(&client->dev, "Client [%s] still busy, " |
| 439 | "can't detach\n", client->name); | 470 | "can't detach\n", client->name); |
| @@ -501,10 +532,10 @@ int i2c_release_client(struct i2c_client *client) | |||
| 501 | __FUNCTION__); | 532 | __FUNCTION__); |
| 502 | return -EPERM; | 533 | return -EPERM; |
| 503 | } | 534 | } |
| 504 | 535 | ||
| 505 | client->usage_count--; | 536 | client->usage_count--; |
| 506 | i2c_dec_use_client(client); | 537 | i2c_dec_use_client(client); |
| 507 | 538 | ||
| 508 | return 0; | 539 | return 0; |
| 509 | } | 540 | } |
| 510 | 541 | ||
| @@ -569,7 +600,7 @@ int i2c_transfer(struct i2c_adapter * adap, struct i2c_msg *msgs, int num) | |||
| 569 | } | 600 | } |
| 570 | #endif | 601 | #endif |
| 571 | 602 | ||
| 572 | mutex_lock(&adap->bus_lock); | 603 | mutex_lock_nested(&adap->bus_lock, adap->level); |
| 573 | ret = adap->algo->master_xfer(adap,msgs,num); | 604 | ret = adap->algo->master_xfer(adap,msgs,num); |
| 574 | mutex_unlock(&adap->bus_lock); | 605 | mutex_unlock(&adap->bus_lock); |
| 575 | 606 | ||
| @@ -590,7 +621,7 @@ int i2c_master_send(struct i2c_client *client,const char *buf ,int count) | |||
| 590 | msg.flags = client->flags & I2C_M_TEN; | 621 | msg.flags = client->flags & I2C_M_TEN; |
| 591 | msg.len = count; | 622 | msg.len = count; |
| 592 | msg.buf = (char *)buf; | 623 | msg.buf = (char *)buf; |
| 593 | 624 | ||
| 594 | ret = i2c_transfer(adap, &msg, 1); | 625 | ret = i2c_transfer(adap, &msg, 1); |
| 595 | 626 | ||
| 596 | /* If everything went ok (i.e. 1 msg transmitted), return #bytes | 627 | /* If everything went ok (i.e. 1 msg transmitted), return #bytes |
| @@ -674,11 +705,16 @@ static int i2c_probe_address(struct i2c_adapter *adapter, int addr, int kind, | |||
| 674 | 705 | ||
| 675 | /* Finally call the custom detection function */ | 706 | /* Finally call the custom detection function */ |
| 676 | err = found_proc(adapter, addr, kind); | 707 | err = found_proc(adapter, addr, kind); |
| 677 | |||
| 678 | /* -ENODEV can be returned if there is a chip at the given address | 708 | /* -ENODEV can be returned if there is a chip at the given address |
| 679 | but it isn't supported by this chip driver. We catch it here as | 709 | but it isn't supported by this chip driver. We catch it here as |
| 680 | this isn't an error. */ | 710 | this isn't an error. */ |
| 681 | return (err == -ENODEV) ? 0 : err; | 711 | if (err == -ENODEV) |
| 712 | err = 0; | ||
| 713 | |||
| 714 | if (err) | ||
| 715 | dev_warn(&adapter->dev, "Client creation failed at 0x%x (%d)\n", | ||
| 716 | addr, err); | ||
| 717 | return err; | ||
| 682 | } | 718 | } |
| 683 | 719 | ||
| 684 | int i2c_probe(struct i2c_adapter *adapter, | 720 | int i2c_probe(struct i2c_adapter *adapter, |
| @@ -718,7 +754,7 @@ int i2c_probe(struct i2c_adapter *adapter, | |||
| 718 | if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_QUICK)) { | 754 | if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_QUICK)) { |
| 719 | if (address_data->probe[0] == I2C_CLIENT_END | 755 | if (address_data->probe[0] == I2C_CLIENT_END |
| 720 | && address_data->normal_i2c[0] == I2C_CLIENT_END) | 756 | && address_data->normal_i2c[0] == I2C_CLIENT_END) |
| 721 | return 0; | 757 | return 0; |
| 722 | 758 | ||
| 723 | dev_warn(&adapter->dev, "SMBus Quick command not supported, " | 759 | dev_warn(&adapter->dev, "SMBus Quick command not supported, " |
| 724 | "can't probe for chips\n"); | 760 | "can't probe for chips\n"); |
| @@ -778,7 +814,7 @@ int i2c_probe(struct i2c_adapter *adapter, | |||
| 778 | struct i2c_adapter* i2c_get_adapter(int id) | 814 | struct i2c_adapter* i2c_get_adapter(int id) |
| 779 | { | 815 | { |
| 780 | struct i2c_adapter *adapter; | 816 | struct i2c_adapter *adapter; |
| 781 | 817 | ||
| 782 | mutex_lock(&core_lists); | 818 | mutex_lock(&core_lists); |
| 783 | adapter = (struct i2c_adapter *)idr_find(&i2c_adapter_idr, id); | 819 | adapter = (struct i2c_adapter *)idr_find(&i2c_adapter_idr, id); |
| 784 | if (adapter && !try_module_get(adapter->owner)) | 820 | if (adapter && !try_module_get(adapter->owner)) |
| @@ -795,14 +831,14 @@ void i2c_put_adapter(struct i2c_adapter *adap) | |||
| 795 | 831 | ||
| 796 | /* The SMBus parts */ | 832 | /* The SMBus parts */ |
| 797 | 833 | ||
| 798 | #define POLY (0x1070U << 3) | 834 | #define POLY (0x1070U << 3) |
| 799 | static u8 | 835 | static u8 |
| 800 | crc8(u16 data) | 836 | crc8(u16 data) |
| 801 | { | 837 | { |
| 802 | int i; | 838 | int i; |
| 803 | 839 | ||
| 804 | for(i = 0; i < 8; i++) { | 840 | for(i = 0; i < 8; i++) { |
| 805 | if (data & 0x8000) | 841 | if (data & 0x8000) |
| 806 | data = data ^ POLY; | 842 | data = data ^ POLY; |
| 807 | data = data << 1; | 843 | data = data << 1; |
| 808 | } | 844 | } |
| @@ -852,13 +888,13 @@ static int i2c_smbus_check_pec(u8 cpec, struct i2c_msg *msg) | |||
| 852 | rpec, cpec); | 888 | rpec, cpec); |
| 853 | return -1; | 889 | return -1; |
| 854 | } | 890 | } |
| 855 | return 0; | 891 | return 0; |
| 856 | } | 892 | } |
| 857 | 893 | ||
| 858 | s32 i2c_smbus_write_quick(struct i2c_client *client, u8 value) | 894 | s32 i2c_smbus_write_quick(struct i2c_client *client, u8 value) |
| 859 | { | 895 | { |
| 860 | return i2c_smbus_xfer(client->adapter,client->addr,client->flags, | 896 | return i2c_smbus_xfer(client->adapter,client->addr,client->flags, |
| 861 | value,0,I2C_SMBUS_QUICK,NULL); | 897 | value,0,I2C_SMBUS_QUICK,NULL); |
| 862 | } | 898 | } |
| 863 | 899 | ||
| 864 | s32 i2c_smbus_read_byte(struct i2c_client *client) | 900 | s32 i2c_smbus_read_byte(struct i2c_client *client) |
| @@ -868,7 +904,7 @@ s32 i2c_smbus_read_byte(struct i2c_client *client) | |||
| 868 | I2C_SMBUS_READ,0,I2C_SMBUS_BYTE, &data)) | 904 | I2C_SMBUS_READ,0,I2C_SMBUS_BYTE, &data)) |
| 869 | return -1; | 905 | return -1; |
| 870 | else | 906 | else |
| 871 | return 0x0FF & data.byte; | 907 | return data.byte; |
| 872 | } | 908 | } |
| 873 | 909 | ||
| 874 | s32 i2c_smbus_write_byte(struct i2c_client *client, u8 value) | 910 | s32 i2c_smbus_write_byte(struct i2c_client *client, u8 value) |
| @@ -884,7 +920,7 @@ s32 i2c_smbus_read_byte_data(struct i2c_client *client, u8 command) | |||
| 884 | I2C_SMBUS_READ,command, I2C_SMBUS_BYTE_DATA,&data)) | 920 | I2C_SMBUS_READ,command, I2C_SMBUS_BYTE_DATA,&data)) |
| 885 | return -1; | 921 | return -1; |
| 886 | else | 922 | else |
| 887 | return 0x0FF & data.byte; | 923 | return data.byte; |
| 888 | } | 924 | } |
| 889 | 925 | ||
| 890 | s32 i2c_smbus_write_byte_data(struct i2c_client *client, u8 command, u8 value) | 926 | s32 i2c_smbus_write_byte_data(struct i2c_client *client, u8 command, u8 value) |
| @@ -903,7 +939,7 @@ s32 i2c_smbus_read_word_data(struct i2c_client *client, u8 command) | |||
| 903 | I2C_SMBUS_READ,command, I2C_SMBUS_WORD_DATA, &data)) | 939 | I2C_SMBUS_READ,command, I2C_SMBUS_WORD_DATA, &data)) |
| 904 | return -1; | 940 | return -1; |
| 905 | else | 941 | else |
| 906 | return 0x0FFFF & data.word; | 942 | return data.word; |
| 907 | } | 943 | } |
| 908 | 944 | ||
| 909 | s32 i2c_smbus_write_word_data(struct i2c_client *client, u8 command, u16 value) | 945 | s32 i2c_smbus_write_word_data(struct i2c_client *client, u8 command, u16 value) |
| @@ -957,11 +993,11 @@ s32 i2c_smbus_write_i2c_block_data(struct i2c_client *client, u8 command, | |||
| 957 | I2C_SMBUS_I2C_BLOCK_DATA, &data); | 993 | I2C_SMBUS_I2C_BLOCK_DATA, &data); |
| 958 | } | 994 | } |
| 959 | 995 | ||
| 960 | /* Simulate a SMBus command using the i2c protocol | 996 | /* Simulate a SMBus command using the i2c protocol |
| 961 | No checking of parameters is done! */ | 997 | No checking of parameters is done! */ |
| 962 | static s32 i2c_smbus_xfer_emulated(struct i2c_adapter * adapter, u16 addr, | 998 | static s32 i2c_smbus_xfer_emulated(struct i2c_adapter * adapter, u16 addr, |
| 963 | unsigned short flags, | 999 | unsigned short flags, |
| 964 | char read_write, u8 command, int size, | 1000 | char read_write, u8 command, int size, |
| 965 | union i2c_smbus_data * data) | 1001 | union i2c_smbus_data * data) |
| 966 | { | 1002 | { |
| 967 | /* So we need to generate a series of msgs. In the case of writing, we | 1003 | /* So we need to generate a series of msgs. In the case of writing, we |
| @@ -971,7 +1007,7 @@ static s32 i2c_smbus_xfer_emulated(struct i2c_adapter * adapter, u16 addr, | |||
| 971 | unsigned char msgbuf0[I2C_SMBUS_BLOCK_MAX+3]; | 1007 | unsigned char msgbuf0[I2C_SMBUS_BLOCK_MAX+3]; |
| 972 | unsigned char msgbuf1[I2C_SMBUS_BLOCK_MAX+2]; | 1008 | unsigned char msgbuf1[I2C_SMBUS_BLOCK_MAX+2]; |
| 973 | int num = read_write == I2C_SMBUS_READ?2:1; | 1009 | int num = read_write == I2C_SMBUS_READ?2:1; |
| 974 | struct i2c_msg msg[2] = { { addr, flags, 1, msgbuf0 }, | 1010 | struct i2c_msg msg[2] = { { addr, flags, 1, msgbuf0 }, |
| 975 | { addr, flags | I2C_M_RD, 0, msgbuf1 } | 1011 | { addr, flags | I2C_M_RD, 0, msgbuf1 } |
| 976 | }; | 1012 | }; |
| 977 | int i; | 1013 | int i; |
| @@ -1006,7 +1042,7 @@ static s32 i2c_smbus_xfer_emulated(struct i2c_adapter * adapter, u16 addr, | |||
| 1006 | else { | 1042 | else { |
| 1007 | msg[0].len=3; | 1043 | msg[0].len=3; |
| 1008 | msgbuf0[1] = data->word & 0xff; | 1044 | msgbuf0[1] = data->word & 0xff; |
| 1009 | msgbuf0[2] = (data->word >> 8) & 0xff; | 1045 | msgbuf0[2] = data->word >> 8; |
| 1010 | } | 1046 | } |
| 1011 | break; | 1047 | break; |
| 1012 | case I2C_SMBUS_PROC_CALL: | 1048 | case I2C_SMBUS_PROC_CALL: |
| @@ -1015,7 +1051,7 @@ static s32 i2c_smbus_xfer_emulated(struct i2c_adapter * adapter, u16 addr, | |||
| 1015 | msg[0].len = 3; | 1051 | msg[0].len = 3; |
| 1016 | msg[1].len = 2; | 1052 | msg[1].len = 2; |
| 1017 | msgbuf0[1] = data->word & 0xff; | 1053 | msgbuf0[1] = data->word & 0xff; |
| 1018 | msgbuf0[2] = (data->word >> 8) & 0xff; | 1054 | msgbuf0[2] = data->word >> 8; |
| 1019 | break; | 1055 | break; |
| 1020 | case I2C_SMBUS_BLOCK_DATA: | 1056 | case I2C_SMBUS_BLOCK_DATA: |
| 1021 | if (read_write == I2C_SMBUS_READ) { | 1057 | if (read_write == I2C_SMBUS_READ) { |
| @@ -1064,14 +1100,14 @@ static s32 i2c_smbus_xfer_emulated(struct i2c_adapter * adapter, u16 addr, | |||
| 1064 | if (i) { | 1100 | if (i) { |
| 1065 | /* Compute PEC if first message is a write */ | 1101 | /* Compute PEC if first message is a write */ |
| 1066 | if (!(msg[0].flags & I2C_M_RD)) { | 1102 | if (!(msg[0].flags & I2C_M_RD)) { |
| 1067 | if (num == 1) /* Write only */ | 1103 | if (num == 1) /* Write only */ |
| 1068 | i2c_smbus_add_pec(&msg[0]); | 1104 | i2c_smbus_add_pec(&msg[0]); |
| 1069 | else /* Write followed by read */ | 1105 | else /* Write followed by read */ |
| 1070 | partial_pec = i2c_smbus_msg_pec(0, &msg[0]); | 1106 | partial_pec = i2c_smbus_msg_pec(0, &msg[0]); |
| 1071 | } | 1107 | } |
| 1072 | /* Ask for PEC if last message is a read */ | 1108 | /* Ask for PEC if last message is a read */ |
| 1073 | if (msg[num-1].flags & I2C_M_RD) | 1109 | if (msg[num-1].flags & I2C_M_RD) |
| 1074 | msg[num-1].len++; | 1110 | msg[num-1].len++; |
| 1075 | } | 1111 | } |
| 1076 | 1112 | ||
| 1077 | if (i2c_transfer(adapter, msg, num) < 0) | 1113 | if (i2c_transfer(adapter, msg, num) < 0) |
| @@ -1091,7 +1127,7 @@ static s32 i2c_smbus_xfer_emulated(struct i2c_adapter * adapter, u16 addr, | |||
| 1091 | case I2C_SMBUS_BYTE_DATA: | 1127 | case I2C_SMBUS_BYTE_DATA: |
| 1092 | data->byte = msgbuf1[0]; | 1128 | data->byte = msgbuf1[0]; |
| 1093 | break; | 1129 | break; |
| 1094 | case I2C_SMBUS_WORD_DATA: | 1130 | case I2C_SMBUS_WORD_DATA: |
| 1095 | case I2C_SMBUS_PROC_CALL: | 1131 | case I2C_SMBUS_PROC_CALL: |
| 1096 | data->word = msgbuf1[0] | (msgbuf1[1] << 8); | 1132 | data->word = msgbuf1[0] | (msgbuf1[1] << 8); |
| 1097 | break; | 1133 | break; |
| @@ -1107,7 +1143,7 @@ static s32 i2c_smbus_xfer_emulated(struct i2c_adapter * adapter, u16 addr, | |||
| 1107 | 1143 | ||
| 1108 | 1144 | ||
| 1109 | s32 i2c_smbus_xfer(struct i2c_adapter * adapter, u16 addr, unsigned short flags, | 1145 | s32 i2c_smbus_xfer(struct i2c_adapter * adapter, u16 addr, unsigned short flags, |
| 1110 | char read_write, u8 command, int size, | 1146 | char read_write, u8 command, int size, |
| 1111 | union i2c_smbus_data * data) | 1147 | union i2c_smbus_data * data) |
| 1112 | { | 1148 | { |
| 1113 | s32 res; | 1149 | s32 res; |
diff --git a/drivers/i2c/i2c-dev.c b/drivers/i2c/i2c-dev.c index 58ccddd5c237..ac5bd2a7ca99 100644 --- a/drivers/i2c/i2c-dev.c +++ b/drivers/i2c/i2c-dev.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | i2c-dev.c - i2c-bus driver, char device interface | 2 | i2c-dev.c - i2c-bus driver, char device interface |
| 3 | 3 | ||
| 4 | Copyright (C) 1995-97 Simon G. Vogl | 4 | Copyright (C) 1995-97 Simon G. Vogl |
| 5 | Copyright (C) 1998-99 Frodo Looijaard <frodol@dds.nl> | 5 | Copyright (C) 1998-99 Frodo Looijaard <frodol@dds.nl> |
| @@ -32,43 +32,35 @@ | |||
| 32 | #include <linux/slab.h> | 32 | #include <linux/slab.h> |
| 33 | #include <linux/smp_lock.h> | 33 | #include <linux/smp_lock.h> |
| 34 | #include <linux/init.h> | 34 | #include <linux/init.h> |
| 35 | #include <linux/list.h> | ||
| 35 | #include <linux/i2c.h> | 36 | #include <linux/i2c.h> |
| 36 | #include <linux/i2c-dev.h> | 37 | #include <linux/i2c-dev.h> |
| 37 | #include <linux/platform_device.h> | ||
| 38 | #include <asm/uaccess.h> | 38 | #include <asm/uaccess.h> |
| 39 | 39 | ||
| 40 | static struct i2c_client i2cdev_client_template; | 40 | static struct i2c_driver i2cdev_driver; |
| 41 | 41 | ||
| 42 | struct i2c_dev { | 42 | struct i2c_dev { |
| 43 | int minor; | 43 | struct list_head list; |
| 44 | struct i2c_adapter *adap; | 44 | struct i2c_adapter *adap; |
| 45 | struct class_device *class_dev; | 45 | struct device *dev; |
| 46 | }; | 46 | }; |
| 47 | #define to_i2c_dev(d) container_of(d, struct i2c_dev, class_dev) | ||
| 48 | 47 | ||
| 49 | #define I2C_MINORS 256 | 48 | #define I2C_MINORS 256 |
| 50 | static struct i2c_dev *i2c_dev_array[I2C_MINORS]; | 49 | static LIST_HEAD(i2c_dev_list); |
| 51 | static DEFINE_SPINLOCK(i2c_dev_array_lock); | 50 | static DEFINE_SPINLOCK(i2c_dev_list_lock); |
| 52 | 51 | ||
| 53 | static struct i2c_dev *i2c_dev_get_by_minor(unsigned index) | 52 | static struct i2c_dev *i2c_dev_get_by_minor(unsigned index) |
| 54 | { | 53 | { |
| 55 | struct i2c_dev *i2c_dev; | 54 | struct i2c_dev *i2c_dev; |
| 56 | 55 | ||
| 57 | spin_lock(&i2c_dev_array_lock); | 56 | spin_lock(&i2c_dev_list_lock); |
| 58 | i2c_dev = i2c_dev_array[index]; | 57 | list_for_each_entry(i2c_dev, &i2c_dev_list, list) { |
| 59 | spin_unlock(&i2c_dev_array_lock); | 58 | if (i2c_dev->adap->nr == index) |
| 60 | return i2c_dev; | 59 | goto found; |
| 61 | } | 60 | } |
| 62 | 61 | i2c_dev = NULL; | |
| 63 | static struct i2c_dev *i2c_dev_get_by_adapter(struct i2c_adapter *adap) | 62 | found: |
| 64 | { | 63 | spin_unlock(&i2c_dev_list_lock); |
| 65 | struct i2c_dev *i2c_dev = NULL; | ||
| 66 | |||
| 67 | spin_lock(&i2c_dev_array_lock); | ||
| 68 | if ((i2c_dev_array[adap->nr]) && | ||
| 69 | (i2c_dev_array[adap->nr]->adap == adap)) | ||
| 70 | i2c_dev = i2c_dev_array[adap->nr]; | ||
| 71 | spin_unlock(&i2c_dev_array_lock); | ||
| 72 | return i2c_dev; | 64 | return i2c_dev; |
| 73 | } | 65 | } |
| 74 | 66 | ||
| @@ -76,41 +68,41 @@ static struct i2c_dev *get_free_i2c_dev(struct i2c_adapter *adap) | |||
| 76 | { | 68 | { |
| 77 | struct i2c_dev *i2c_dev; | 69 | struct i2c_dev *i2c_dev; |
| 78 | 70 | ||
| 71 | if (adap->nr >= I2C_MINORS) { | ||
| 72 | printk(KERN_ERR "i2c-dev: Out of device minors (%d)\n", | ||
| 73 | adap->nr); | ||
| 74 | return ERR_PTR(-ENODEV); | ||
| 75 | } | ||
| 76 | |||
| 79 | i2c_dev = kzalloc(sizeof(*i2c_dev), GFP_KERNEL); | 77 | i2c_dev = kzalloc(sizeof(*i2c_dev), GFP_KERNEL); |
| 80 | if (!i2c_dev) | 78 | if (!i2c_dev) |
| 81 | return ERR_PTR(-ENOMEM); | 79 | return ERR_PTR(-ENOMEM); |
| 80 | i2c_dev->adap = adap; | ||
| 82 | 81 | ||
| 83 | spin_lock(&i2c_dev_array_lock); | 82 | spin_lock(&i2c_dev_list_lock); |
| 84 | if (i2c_dev_array[adap->nr]) { | 83 | list_add_tail(&i2c_dev->list, &i2c_dev_list); |
| 85 | spin_unlock(&i2c_dev_array_lock); | 84 | spin_unlock(&i2c_dev_list_lock); |
| 86 | dev_err(&adap->dev, "i2c-dev already has a device assigned to this adapter\n"); | ||
| 87 | goto error; | ||
| 88 | } | ||
| 89 | i2c_dev->minor = adap->nr; | ||
| 90 | i2c_dev_array[adap->nr] = i2c_dev; | ||
| 91 | spin_unlock(&i2c_dev_array_lock); | ||
| 92 | return i2c_dev; | 85 | return i2c_dev; |
| 93 | error: | ||
| 94 | kfree(i2c_dev); | ||
| 95 | return ERR_PTR(-ENODEV); | ||
| 96 | } | 86 | } |
| 97 | 87 | ||
| 98 | static void return_i2c_dev(struct i2c_dev *i2c_dev) | 88 | static void return_i2c_dev(struct i2c_dev *i2c_dev) |
| 99 | { | 89 | { |
| 100 | spin_lock(&i2c_dev_array_lock); | 90 | spin_lock(&i2c_dev_list_lock); |
| 101 | i2c_dev_array[i2c_dev->minor] = NULL; | 91 | list_del(&i2c_dev->list); |
| 102 | spin_unlock(&i2c_dev_array_lock); | 92 | spin_unlock(&i2c_dev_list_lock); |
| 93 | kfree(i2c_dev); | ||
| 103 | } | 94 | } |
| 104 | 95 | ||
| 105 | static ssize_t show_adapter_name(struct class_device *class_dev, char *buf) | 96 | static ssize_t show_adapter_name(struct device *dev, |
| 97 | struct device_attribute *attr, char *buf) | ||
| 106 | { | 98 | { |
| 107 | struct i2c_dev *i2c_dev = i2c_dev_get_by_minor(MINOR(class_dev->devt)); | 99 | struct i2c_dev *i2c_dev = i2c_dev_get_by_minor(MINOR(dev->devt)); |
| 108 | 100 | ||
| 109 | if (!i2c_dev) | 101 | if (!i2c_dev) |
| 110 | return -ENODEV; | 102 | return -ENODEV; |
| 111 | return sprintf(buf, "%s\n", i2c_dev->adap->name); | 103 | return sprintf(buf, "%s\n", i2c_dev->adap->name); |
| 112 | } | 104 | } |
| 113 | static CLASS_DEVICE_ATTR(name, S_IRUGO, show_adapter_name, NULL); | 105 | static DEVICE_ATTR(name, S_IRUGO, show_adapter_name, NULL); |
| 114 | 106 | ||
| 115 | static ssize_t i2cdev_read (struct file *file, char __user *buf, size_t count, | 107 | static ssize_t i2cdev_read (struct file *file, char __user *buf, size_t count, |
| 116 | loff_t *offset) | 108 | loff_t *offset) |
| @@ -128,7 +120,7 @@ static ssize_t i2cdev_read (struct file *file, char __user *buf, size_t count, | |||
| 128 | return -ENOMEM; | 120 | return -ENOMEM; |
| 129 | 121 | ||
| 130 | pr_debug("i2c-dev: i2c-%d reading %zd bytes.\n", | 122 | pr_debug("i2c-dev: i2c-%d reading %zd bytes.\n", |
| 131 | iminor(file->f_dentry->d_inode), count); | 123 | iminor(file->f_path.dentry->d_inode), count); |
| 132 | 124 | ||
| 133 | ret = i2c_master_recv(client,tmp,count); | 125 | ret = i2c_master_recv(client,tmp,count); |
| 134 | if (ret >= 0) | 126 | if (ret >= 0) |
| @@ -156,7 +148,7 @@ static ssize_t i2cdev_write (struct file *file, const char __user *buf, size_t c | |||
| 156 | } | 148 | } |
| 157 | 149 | ||
| 158 | pr_debug("i2c-dev: i2c-%d writing %zd bytes.\n", | 150 | pr_debug("i2c-dev: i2c-%d writing %zd bytes.\n", |
| 159 | iminor(file->f_dentry->d_inode), count); | 151 | iminor(file->f_path.dentry->d_inode), count); |
| 160 | 152 | ||
| 161 | ret = i2c_master_send(client,tmp,count); | 153 | ret = i2c_master_send(client,tmp,count); |
| 162 | kfree(tmp); | 154 | kfree(tmp); |
| @@ -181,7 +173,7 @@ static int i2cdev_ioctl(struct inode *inode, struct file *file, | |||
| 181 | switch ( cmd ) { | 173 | switch ( cmd ) { |
| 182 | case I2C_SLAVE: | 174 | case I2C_SLAVE: |
| 183 | case I2C_SLAVE_FORCE: | 175 | case I2C_SLAVE_FORCE: |
| 184 | if ((arg > 0x3ff) || | 176 | if ((arg > 0x3ff) || |
| 185 | (((client->flags & I2C_M_TEN) == 0) && arg > 0x7f)) | 177 | (((client->flags & I2C_M_TEN) == 0) && arg > 0x7f)) |
| 186 | return -EINVAL; | 178 | return -EINVAL; |
| 187 | if ((cmd == I2C_SLAVE) && i2c_check_addr(client->adapter,arg)) | 179 | if ((cmd == I2C_SLAVE) && i2c_check_addr(client->adapter,arg)) |
| @@ -202,12 +194,11 @@ static int i2cdev_ioctl(struct inode *inode, struct file *file, | |||
| 202 | return 0; | 194 | return 0; |
| 203 | case I2C_FUNCS: | 195 | case I2C_FUNCS: |
| 204 | funcs = i2c_get_functionality(client->adapter); | 196 | funcs = i2c_get_functionality(client->adapter); |
| 205 | return (copy_to_user((unsigned long __user *)arg, &funcs, | 197 | return put_user(funcs, (unsigned long __user *)arg); |
| 206 | sizeof(unsigned long)))?-EFAULT:0; | ||
| 207 | 198 | ||
| 208 | case I2C_RDWR: | 199 | case I2C_RDWR: |
| 209 | if (copy_from_user(&rdwr_arg, | 200 | if (copy_from_user(&rdwr_arg, |
| 210 | (struct i2c_rdwr_ioctl_data __user *)arg, | 201 | (struct i2c_rdwr_ioctl_data __user *)arg, |
| 211 | sizeof(rdwr_arg))) | 202 | sizeof(rdwr_arg))) |
| 212 | return -EFAULT; | 203 | return -EFAULT; |
| 213 | 204 | ||
| @@ -215,9 +206,9 @@ static int i2cdev_ioctl(struct inode *inode, struct file *file, | |||
| 215 | * be sent at once */ | 206 | * be sent at once */ |
| 216 | if (rdwr_arg.nmsgs > I2C_RDRW_IOCTL_MAX_MSGS) | 207 | if (rdwr_arg.nmsgs > I2C_RDRW_IOCTL_MAX_MSGS) |
| 217 | return -EINVAL; | 208 | return -EINVAL; |
| 218 | 209 | ||
| 219 | rdwr_pa = (struct i2c_msg *) | 210 | rdwr_pa = (struct i2c_msg *) |
| 220 | kmalloc(rdwr_arg.nmsgs * sizeof(struct i2c_msg), | 211 | kmalloc(rdwr_arg.nmsgs * sizeof(struct i2c_msg), |
| 221 | GFP_KERNEL); | 212 | GFP_KERNEL); |
| 222 | 213 | ||
| 223 | if (rdwr_pa == NULL) return -ENOMEM; | 214 | if (rdwr_pa == NULL) return -ENOMEM; |
| @@ -287,9 +278,9 @@ static int i2cdev_ioctl(struct inode *inode, struct file *file, | |||
| 287 | (struct i2c_smbus_ioctl_data __user *) arg, | 278 | (struct i2c_smbus_ioctl_data __user *) arg, |
| 288 | sizeof(struct i2c_smbus_ioctl_data))) | 279 | sizeof(struct i2c_smbus_ioctl_data))) |
| 289 | return -EFAULT; | 280 | return -EFAULT; |
| 290 | if ((data_arg.size != I2C_SMBUS_BYTE) && | 281 | if ((data_arg.size != I2C_SMBUS_BYTE) && |
| 291 | (data_arg.size != I2C_SMBUS_QUICK) && | 282 | (data_arg.size != I2C_SMBUS_QUICK) && |
| 292 | (data_arg.size != I2C_SMBUS_BYTE_DATA) && | 283 | (data_arg.size != I2C_SMBUS_BYTE_DATA) && |
| 293 | (data_arg.size != I2C_SMBUS_WORD_DATA) && | 284 | (data_arg.size != I2C_SMBUS_WORD_DATA) && |
| 294 | (data_arg.size != I2C_SMBUS_PROC_CALL) && | 285 | (data_arg.size != I2C_SMBUS_PROC_CALL) && |
| 295 | (data_arg.size != I2C_SMBUS_BLOCK_DATA) && | 286 | (data_arg.size != I2C_SMBUS_BLOCK_DATA) && |
| @@ -300,11 +291,11 @@ static int i2cdev_ioctl(struct inode *inode, struct file *file, | |||
| 300 | data_arg.size); | 291 | data_arg.size); |
| 301 | return -EINVAL; | 292 | return -EINVAL; |
| 302 | } | 293 | } |
| 303 | /* Note that I2C_SMBUS_READ and I2C_SMBUS_WRITE are 0 and 1, | 294 | /* Note that I2C_SMBUS_READ and I2C_SMBUS_WRITE are 0 and 1, |
| 304 | so the check is valid if size==I2C_SMBUS_QUICK too. */ | 295 | so the check is valid if size==I2C_SMBUS_QUICK too. */ |
| 305 | if ((data_arg.read_write != I2C_SMBUS_READ) && | 296 | if ((data_arg.read_write != I2C_SMBUS_READ) && |
| 306 | (data_arg.read_write != I2C_SMBUS_WRITE)) { | 297 | (data_arg.read_write != I2C_SMBUS_WRITE)) { |
| 307 | dev_dbg(&client->adapter->dev, | 298 | dev_dbg(&client->adapter->dev, |
| 308 | "read_write out of range (%x) in ioctl I2C_SMBUS.\n", | 299 | "read_write out of range (%x) in ioctl I2C_SMBUS.\n", |
| 309 | data_arg.read_write); | 300 | data_arg.read_write); |
| 310 | return -EINVAL; | 301 | return -EINVAL; |
| @@ -313,7 +304,7 @@ static int i2cdev_ioctl(struct inode *inode, struct file *file, | |||
| 313 | /* Note that command values are always valid! */ | 304 | /* Note that command values are always valid! */ |
| 314 | 305 | ||
| 315 | if ((data_arg.size == I2C_SMBUS_QUICK) || | 306 | if ((data_arg.size == I2C_SMBUS_QUICK) || |
| 316 | ((data_arg.size == I2C_SMBUS_BYTE) && | 307 | ((data_arg.size == I2C_SMBUS_BYTE) && |
| 317 | (data_arg.read_write == I2C_SMBUS_WRITE))) | 308 | (data_arg.read_write == I2C_SMBUS_WRITE))) |
| 318 | /* These are special: we do not use data */ | 309 | /* These are special: we do not use data */ |
| 319 | return i2c_smbus_xfer(client->adapter, client->addr, | 310 | return i2c_smbus_xfer(client->adapter, client->addr, |
| @@ -331,14 +322,14 @@ static int i2cdev_ioctl(struct inode *inode, struct file *file, | |||
| 331 | if ((data_arg.size == I2C_SMBUS_BYTE_DATA) || | 322 | if ((data_arg.size == I2C_SMBUS_BYTE_DATA) || |
| 332 | (data_arg.size == I2C_SMBUS_BYTE)) | 323 | (data_arg.size == I2C_SMBUS_BYTE)) |
| 333 | datasize = sizeof(data_arg.data->byte); | 324 | datasize = sizeof(data_arg.data->byte); |
| 334 | else if ((data_arg.size == I2C_SMBUS_WORD_DATA) || | 325 | else if ((data_arg.size == I2C_SMBUS_WORD_DATA) || |
| 335 | (data_arg.size == I2C_SMBUS_PROC_CALL)) | 326 | (data_arg.size == I2C_SMBUS_PROC_CALL)) |
| 336 | datasize = sizeof(data_arg.data->word); | 327 | datasize = sizeof(data_arg.data->word); |
| 337 | else /* size == smbus block, i2c block, or block proc. call */ | 328 | else /* size == smbus block, i2c block, or block proc. call */ |
| 338 | datasize = sizeof(data_arg.data->block); | 329 | datasize = sizeof(data_arg.data->block); |
| 339 | 330 | ||
| 340 | if ((data_arg.size == I2C_SMBUS_PROC_CALL) || | 331 | if ((data_arg.size == I2C_SMBUS_PROC_CALL) || |
| 341 | (data_arg.size == I2C_SMBUS_BLOCK_PROC_CALL) || | 332 | (data_arg.size == I2C_SMBUS_BLOCK_PROC_CALL) || |
| 342 | (data_arg.read_write == I2C_SMBUS_WRITE)) { | 333 | (data_arg.read_write == I2C_SMBUS_WRITE)) { |
| 343 | if (copy_from_user(&temp, data_arg.data, datasize)) | 334 | if (copy_from_user(&temp, data_arg.data, datasize)) |
| 344 | return -EFAULT; | 335 | return -EFAULT; |
| @@ -346,8 +337,8 @@ static int i2cdev_ioctl(struct inode *inode, struct file *file, | |||
| 346 | res = i2c_smbus_xfer(client->adapter,client->addr,client->flags, | 337 | res = i2c_smbus_xfer(client->adapter,client->addr,client->flags, |
| 347 | data_arg.read_write, | 338 | data_arg.read_write, |
| 348 | data_arg.command,data_arg.size,&temp); | 339 | data_arg.command,data_arg.size,&temp); |
| 349 | if (! res && ((data_arg.size == I2C_SMBUS_PROC_CALL) || | 340 | if (! res && ((data_arg.size == I2C_SMBUS_PROC_CALL) || |
| 350 | (data_arg.size == I2C_SMBUS_BLOCK_PROC_CALL) || | 341 | (data_arg.size == I2C_SMBUS_BLOCK_PROC_CALL) || |
| 351 | (data_arg.read_write == I2C_SMBUS_READ))) { | 342 | (data_arg.read_write == I2C_SMBUS_READ))) { |
| 352 | if (copy_to_user(data_arg.data, &temp, datasize)) | 343 | if (copy_to_user(data_arg.data, &temp, datasize)) |
| 353 | return -EFAULT; | 344 | return -EFAULT; |
| @@ -375,12 +366,13 @@ static int i2cdev_open(struct inode *inode, struct file *file) | |||
| 375 | if (!adap) | 366 | if (!adap) |
| 376 | return -ENODEV; | 367 | return -ENODEV; |
| 377 | 368 | ||
| 378 | client = kmalloc(sizeof(*client), GFP_KERNEL); | 369 | client = kzalloc(sizeof(*client), GFP_KERNEL); |
| 379 | if (!client) { | 370 | if (!client) { |
| 380 | i2c_put_adapter(adap); | 371 | i2c_put_adapter(adap); |
| 381 | return -ENOMEM; | 372 | return -ENOMEM; |
| 382 | } | 373 | } |
| 383 | memcpy(client, &i2cdev_client_template, sizeof(*client)); | 374 | snprintf(client->name, I2C_NAME_SIZE, "i2c-dev %d", adap->nr); |
| 375 | client->driver = &i2cdev_driver; | ||
| 384 | 376 | ||
| 385 | /* registered with adapter, passed as client to user */ | 377 | /* registered with adapter, passed as client to user */ |
| 386 | client->adapter = adap; | 378 | client->adapter = adap; |
| @@ -415,42 +407,45 @@ static struct class *i2c_dev_class; | |||
| 415 | static int i2cdev_attach_adapter(struct i2c_adapter *adap) | 407 | static int i2cdev_attach_adapter(struct i2c_adapter *adap) |
| 416 | { | 408 | { |
| 417 | struct i2c_dev *i2c_dev; | 409 | struct i2c_dev *i2c_dev; |
| 418 | struct device *dev; | 410 | int res; |
| 419 | 411 | ||
| 420 | i2c_dev = get_free_i2c_dev(adap); | 412 | i2c_dev = get_free_i2c_dev(adap); |
| 421 | if (IS_ERR(i2c_dev)) | 413 | if (IS_ERR(i2c_dev)) |
| 422 | return PTR_ERR(i2c_dev); | 414 | return PTR_ERR(i2c_dev); |
| 423 | 415 | ||
| 424 | pr_debug("i2c-dev: adapter [%s] registered as minor %d\n", | ||
| 425 | adap->name, i2c_dev->minor); | ||
| 426 | |||
| 427 | /* register this i2c device with the driver core */ | 416 | /* register this i2c device with the driver core */ |
| 428 | i2c_dev->adap = adap; | 417 | i2c_dev->dev = device_create(i2c_dev_class, &adap->dev, |
| 429 | dev = &adap->dev; | 418 | MKDEV(I2C_MAJOR, adap->nr), |
| 430 | i2c_dev->class_dev = class_device_create(i2c_dev_class, NULL, | 419 | "i2c-%d", adap->nr); |
| 431 | MKDEV(I2C_MAJOR, i2c_dev->minor), | 420 | if (IS_ERR(i2c_dev->dev)) { |
| 432 | dev, "i2c-%d", i2c_dev->minor); | 421 | res = PTR_ERR(i2c_dev->dev); |
| 433 | if (!i2c_dev->class_dev) | ||
| 434 | goto error; | 422 | goto error; |
| 435 | class_device_create_file(i2c_dev->class_dev, &class_device_attr_name); | 423 | } |
| 424 | res = device_create_file(i2c_dev->dev, &dev_attr_name); | ||
| 425 | if (res) | ||
| 426 | goto error_destroy; | ||
| 427 | |||
| 428 | pr_debug("i2c-dev: adapter [%s] registered as minor %d\n", | ||
| 429 | adap->name, adap->nr); | ||
| 436 | return 0; | 430 | return 0; |
| 431 | error_destroy: | ||
| 432 | device_destroy(i2c_dev_class, MKDEV(I2C_MAJOR, adap->nr)); | ||
| 437 | error: | 433 | error: |
| 438 | return_i2c_dev(i2c_dev); | 434 | return_i2c_dev(i2c_dev); |
| 439 | kfree(i2c_dev); | 435 | return res; |
| 440 | return -ENODEV; | ||
| 441 | } | 436 | } |
| 442 | 437 | ||
| 443 | static int i2cdev_detach_adapter(struct i2c_adapter *adap) | 438 | static int i2cdev_detach_adapter(struct i2c_adapter *adap) |
| 444 | { | 439 | { |
| 445 | struct i2c_dev *i2c_dev; | 440 | struct i2c_dev *i2c_dev; |
| 446 | 441 | ||
| 447 | i2c_dev = i2c_dev_get_by_adapter(adap); | 442 | i2c_dev = i2c_dev_get_by_minor(adap->nr); |
| 448 | if (!i2c_dev) | 443 | if (!i2c_dev) /* attach_adapter must have failed */ |
| 449 | return -ENODEV; | 444 | return 0; |
| 450 | 445 | ||
| 446 | device_remove_file(i2c_dev->dev, &dev_attr_name); | ||
| 451 | return_i2c_dev(i2c_dev); | 447 | return_i2c_dev(i2c_dev); |
| 452 | class_device_destroy(i2c_dev_class, MKDEV(I2C_MAJOR, i2c_dev->minor)); | 448 | device_destroy(i2c_dev_class, MKDEV(I2C_MAJOR, adap->nr)); |
| 453 | kfree(i2c_dev); | ||
| 454 | 449 | ||
| 455 | pr_debug("i2c-dev: adapter [%s] unregistered\n", adap->name); | 450 | pr_debug("i2c-dev: adapter [%s] unregistered\n", adap->name); |
| 456 | return 0; | 451 | return 0; |
| @@ -471,12 +466,6 @@ static struct i2c_driver i2cdev_driver = { | |||
| 471 | .detach_client = i2cdev_detach_client, | 466 | .detach_client = i2cdev_detach_client, |
| 472 | }; | 467 | }; |
| 473 | 468 | ||
| 474 | static struct i2c_client i2cdev_client_template = { | ||
| 475 | .name = "I2C /dev entry", | ||
| 476 | .addr = -1, | ||
| 477 | .driver = &i2cdev_driver, | ||
| 478 | }; | ||
| 479 | |||
| 480 | static int __init i2c_dev_init(void) | 469 | static int __init i2c_dev_init(void) |
| 481 | { | 470 | { |
| 482 | int res; | 471 | int res; |
