Merge branch 'i2c-fixes' of git://git.fluff.org/bjdooks/linux

* 'i2c-fixes' of git://git.fluff.org/bjdooks/linux:
i2c-mpc: Do not generate STOP after read.
i2c: imx: disable clock when it's possible to save power.
i2c: imx: only imx1 needs disable delay
i2c: imx: check busy bit when START/STOP

+59 -37
+57 -29
drivers/i2c/busses/i2c-imx.c
··· 120 120 wait_queue_head_t queue; 121 121 unsigned long i2csr; 122 122 unsigned int disable_delay; 123 + int stopped; 124 + unsigned int ifdr; /* IMX_I2C_IFDR */ 123 125 }; 124 126 125 127 /** Functions for IMX I2C adapter driver *************************************** 126 128 *******************************************************************************/ 127 129 128 - static int i2c_imx_bus_busy(struct imx_i2c_struct *i2c_imx) 130 + static int i2c_imx_bus_busy(struct imx_i2c_struct *i2c_imx, int for_busy) 129 131 { 130 132 unsigned long orig_jiffies = jiffies; 133 + unsigned int temp; 131 134 132 135 dev_dbg(&i2c_imx->adapter.dev, "<%s>\n", __func__); 133 136 134 - /* wait for bus not busy */ 135 - while (readb(i2c_imx->base + IMX_I2C_I2SR) & I2SR_IBB) { 137 + while (1) { 138 + temp = readb(i2c_imx->base + IMX_I2C_I2SR); 139 + if (for_busy && (temp & I2SR_IBB)) 140 + break; 141 + if (!for_busy && !(temp & I2SR_IBB)) 142 + break; 136 143 if (signal_pending(current)) { 137 144 dev_dbg(&i2c_imx->adapter.dev, 138 145 "<%s> I2C Interrupted\n", __func__); ··· 186 179 return 0; 187 180 } 188 181 189 - static void i2c_imx_start(struct imx_i2c_struct *i2c_imx) 182 + static int i2c_imx_start(struct imx_i2c_struct *i2c_imx) 190 183 { 191 184 unsigned int temp = 0; 185 + int result; 192 186 193 187 dev_dbg(&i2c_imx->adapter.dev, "<%s>\n", __func__); 194 188 189 + clk_enable(i2c_imx->clk); 190 + writeb(i2c_imx->ifdr, i2c_imx->base + IMX_I2C_IFDR); 195 191 /* Enable I2C controller */ 192 + writeb(0, i2c_imx->base + IMX_I2C_I2SR); 196 193 writeb(I2CR_IEN, i2c_imx->base + IMX_I2C_I2CR); 194 + 195 + /* Wait controller to be stable */ 196 + udelay(50); 197 + 197 198 /* Start I2C transaction */ 198 199 temp = readb(i2c_imx->base + IMX_I2C_I2CR); 199 200 temp |= I2CR_MSTA; 200 201 writeb(temp, i2c_imx->base + IMX_I2C_I2CR); 202 + result = i2c_imx_bus_busy(i2c_imx, 1); 203 + if (result) 204 + return result; 205 + i2c_imx->stopped = 0; 206 + 201 207 temp |= I2CR_IIEN | I2CR_MTX | I2CR_TXAK; 202 208 writeb(temp, i2c_imx->base + IMX_I2C_I2CR); 209 + return result; 203 210 } 204 211 205 212 static void i2c_imx_stop(struct imx_i2c_struct *i2c_imx) 206 213 { 207 214 unsigned int temp = 0; 208 215 209 - /* Stop I2C transaction */ 210 - dev_dbg(&i2c_imx->adapter.dev, "<%s>\n", __func__); 211 - temp = readb(i2c_imx->base + IMX_I2C_I2CR); 212 - temp &= ~I2CR_MSTA; 213 - writeb(temp, i2c_imx->base + IMX_I2C_I2CR); 214 - /* setup chip registers to defaults */ 215 - writeb(I2CR_IEN, i2c_imx->base + IMX_I2C_I2CR); 216 - writeb(0, i2c_imx->base + IMX_I2C_I2SR); 217 - /* 218 - * This delay caused by an i.MXL hardware bug. 219 - * If no (or too short) delay, no "STOP" bit will be generated. 220 - */ 221 - udelay(i2c_imx->disable_delay); 216 + if (!i2c_imx->stopped) { 217 + /* Stop I2C transaction */ 218 + dev_dbg(&i2c_imx->adapter.dev, "<%s>\n", __func__); 219 + temp = readb(i2c_imx->base + IMX_I2C_I2CR); 220 + temp &= ~(I2CR_MSTA | I2CR_MTX); 221 + writeb(temp, i2c_imx->base + IMX_I2C_I2CR); 222 + i2c_imx->stopped = 1; 223 + } 224 + if (cpu_is_mx1()) { 225 + /* 226 + * This delay caused by an i.MXL hardware bug. 227 + * If no (or too short) delay, no "STOP" bit will be generated. 228 + */ 229 + udelay(i2c_imx->disable_delay); 230 + } 231 + 232 + if (!i2c_imx->stopped) 233 + i2c_imx_bus_busy(i2c_imx, 0); 234 + 222 235 /* Disable I2C controller */ 223 236 writeb(0, i2c_imx->base + IMX_I2C_I2CR); 237 + clk_disable(i2c_imx->clk); 224 238 } 225 239 226 240 static void __init i2c_imx_set_clk(struct imx_i2c_struct *i2c_imx, ··· 261 233 else 262 234 for (i = 0; i2c_clk_div[i][0] < div; i++); 263 235 264 - /* Write divider value to register */ 265 - writeb(i2c_clk_div[i][1], i2c_imx->base + IMX_I2C_IFDR); 236 + /* Store divider value */ 237 + i2c_imx->ifdr = i2c_clk_div[i][1]; 266 238 267 239 /* 268 240 * There dummy delay is calculated. ··· 369 341 if (result) 370 342 return result; 371 343 if (i == (msgs->len - 1)) { 344 + /* It must generate STOP before read I2DR to prevent 345 + controller from generating another clock cycle */ 372 346 dev_dbg(&i2c_imx->adapter.dev, 373 347 "<%s> clear MSTA\n", __func__); 374 348 temp = readb(i2c_imx->base + IMX_I2C_I2CR); 375 - temp &= ~I2CR_MSTA; 349 + temp &= ~(I2CR_MSTA | I2CR_MTX); 376 350 writeb(temp, i2c_imx->base + IMX_I2C_I2CR); 351 + i2c_imx_bus_busy(i2c_imx, 0); 352 + i2c_imx->stopped = 1; 377 353 } else if (i == (msgs->len - 2)) { 378 354 dev_dbg(&i2c_imx->adapter.dev, 379 355 "<%s> set TXAK\n", __func__); ··· 402 370 403 371 dev_dbg(&i2c_imx->adapter.dev, "<%s>\n", __func__); 404 372 405 - /* Check if i2c bus is not busy */ 406 - result = i2c_imx_bus_busy(i2c_imx); 373 + /* Start I2C transfer */ 374 + result = i2c_imx_start(i2c_imx); 407 375 if (result) 408 376 goto fail0; 409 - 410 - /* Start I2C transfer */ 411 - i2c_imx_start(i2c_imx); 412 377 413 378 /* read/write data */ 414 379 for (i = 0; i < num; i++) { ··· 415 386 temp = readb(i2c_imx->base + IMX_I2C_I2CR); 416 387 temp |= I2CR_RSTA; 417 388 writeb(temp, i2c_imx->base + IMX_I2C_I2CR); 389 + result = i2c_imx_bus_busy(i2c_imx, 1); 390 + if (result) 391 + goto fail0; 418 392 } 419 393 dev_dbg(&i2c_imx->adapter.dev, 420 394 "<%s> transfer message: %d\n", __func__, i); ··· 532 500 dev_err(&pdev->dev, "can't get I2C clock\n"); 533 501 goto fail3; 534 502 } 535 - clk_enable(i2c_imx->clk); 536 503 537 504 /* Request IRQ */ 538 505 ret = request_irq(i2c_imx->irq, i2c_imx_isr, 0, pdev->name, i2c_imx); ··· 580 549 fail5: 581 550 free_irq(i2c_imx->irq, i2c_imx); 582 551 fail4: 583 - clk_disable(i2c_imx->clk); 584 552 clk_put(i2c_imx->clk); 585 553 fail3: 586 554 release_mem_region(i2c_imx->res->start, resource_size(res)); ··· 616 586 if (pdata && pdata->exit) 617 587 pdata->exit(&pdev->dev); 618 588 619 - /* Disable I2C clock */ 620 - clk_disable(i2c_imx->clk); 621 589 clk_put(i2c_imx->clk); 622 590 623 591 release_mem_region(i2c_imx->res->start, resource_size(i2c_imx->res));
+2 -8
drivers/i2c/busses/i2c-mpc.c
··· 365 365 unsigned timeout = i2c->adap.timeout; 366 366 u32 flags = restart ? CCR_RSTA : 0; 367 367 368 - /* Start with MEN */ 369 - if (!restart) 370 - writeccr(i2c, CCR_MEN); 371 368 /* Start as master */ 372 369 writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_MSTA | CCR_MTX | flags); 373 370 /* Write target byte */ ··· 393 396 int i, result; 394 397 u32 flags = restart ? CCR_RSTA : 0; 395 398 396 - /* Start with MEN */ 397 - if (!restart) 398 - writeccr(i2c, CCR_MEN); 399 399 /* Switch to read - restart */ 400 400 writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_MSTA | CCR_MTX | flags); 401 401 /* Write target address byte - this time with the read flag set */ ··· 419 425 /* Generate txack on next to last byte */ 420 426 if (i == length - 2) 421 427 writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_MSTA | CCR_TXAK); 422 - /* Generate stop on last byte */ 428 + /* Do not generate stop on last byte */ 423 429 if (i == length - 1) 424 - writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_TXAK); 430 + writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_MSTA | CCR_MTX); 425 431 data[i] = readb(i2c->base + MPC_I2C_DR); 426 432 } 427 433