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