Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'i2c/for-current' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux

Pull i2c fixes from Wolfram Sang:
"Here are some driver bugfixes from I2C.

Unusual this time are the two reverts. One because I accidently picked
a patch from the list which I should have pulled from my co-maintainer
instead ("missing of_node_put"). And one which I wrongly assumed to be
an easy fix but it turned out already that it needs more iterations
("copy device properties")"

* 'i2c/for-current' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux:
Revert "i2c: copy device properties when using i2c_register_board_info()"
Revert "i2c: add missing of_node_put in i2c_mux_del_adapters"
i2c: exynos5: Avoid transaction timeouts due TRANSFER_DONE_AUTO not set
i2c: designware: add reset interface
i2c: meson: fix wrong variable usage in meson_i2c_put_data
i2c: copy device properties when using i2c_register_board_info()
i2c: m65xx: drop superfluous quirk structure
i2c: brcmstb: Fix START and STOP conditions
i2c: add missing of_node_put in i2c_mux_del_adapters
i2c: riic: fix restart condition
i2c: add missing of_node_put in i2c_mux_del_adapters

+56 -22
+21 -6
drivers/i2c/busses/i2c-brcmstb.c
··· 465 465 u8 *tmp_buf; 466 466 int len = 0; 467 467 int xfersz = brcmstb_i2c_get_xfersz(dev); 468 + u32 cond, cond_per_msg; 468 469 469 470 if (dev->is_suspended) 470 471 return -EBUSY; ··· 482 481 pmsg->buf ? pmsg->buf[0] : '0', pmsg->len); 483 482 484 483 if (i < (num - 1) && (msgs[i + 1].flags & I2C_M_NOSTART)) 485 - brcmstb_set_i2c_start_stop(dev, ~(COND_START_STOP)); 484 + cond = ~COND_START_STOP; 486 485 else 487 - brcmstb_set_i2c_start_stop(dev, 488 - COND_RESTART | COND_NOSTOP); 486 + cond = COND_RESTART | COND_NOSTOP; 487 + 488 + brcmstb_set_i2c_start_stop(dev, cond); 489 489 490 490 /* Send slave address */ 491 491 if (!(pmsg->flags & I2C_M_NOSTART)) { ··· 499 497 } 500 498 } 501 499 500 + cond_per_msg = cond; 501 + 502 502 /* Perform data transfer */ 503 503 while (len) { 504 504 bytes_to_xfer = min(len, xfersz); 505 505 506 - if (len <= xfersz && i == (num - 1)) 507 - brcmstb_set_i2c_start_stop(dev, 508 - ~(COND_START_STOP)); 506 + if (len <= xfersz) { 507 + if (i == (num - 1)) 508 + cond_per_msg = cond_per_msg & 509 + ~(COND_RESTART | COND_NOSTOP); 510 + else 511 + cond_per_msg = cond; 512 + } else { 513 + cond_per_msg = (cond_per_msg & ~COND_RESTART) | 514 + COND_NOSTOP; 515 + } 516 + 517 + brcmstb_set_i2c_start_stop(dev, cond_per_msg); 509 518 510 519 rc = brcmstb_i2c_xfer_bsc_data(dev, tmp_buf, 511 520 bytes_to_xfer, pmsg); ··· 525 512 526 513 len -= bytes_to_xfer; 527 514 tmp_buf += bytes_to_xfer; 515 + 516 + cond_per_msg = COND_NOSTART | COND_NOSTOP; 528 517 } 529 518 } 530 519
+1
drivers/i2c/busses/i2c-designware-core.h
··· 88 88 void __iomem *base; 89 89 struct completion cmd_complete; 90 90 struct clk *clk; 91 + struct reset_control *rst; 91 92 u32 (*get_clk_rate_khz) (struct dw_i2c_dev *dev); 92 93 struct dw_pci_controller *controller; 93 94 int cmd_err;
+24 -4
drivers/i2c/busses/i2c-designware-platdrv.c
··· 38 38 #include <linux/pm_runtime.h> 39 39 #include <linux/property.h> 40 40 #include <linux/io.h> 41 + #include <linux/reset.h> 41 42 #include <linux/slab.h> 42 43 #include <linux/acpi.h> 43 44 #include <linux/platform_data/i2c-designware.h> ··· 200 199 dev->irq = irq; 201 200 platform_set_drvdata(pdev, dev); 202 201 202 + dev->rst = devm_reset_control_get_optional_exclusive(&pdev->dev, NULL); 203 + if (IS_ERR(dev->rst)) { 204 + if (PTR_ERR(dev->rst) == -EPROBE_DEFER) 205 + return -EPROBE_DEFER; 206 + } else { 207 + reset_control_deassert(dev->rst); 208 + } 209 + 203 210 if (pdata) { 204 211 dev->clk_freq = pdata->i2c_scl_freq; 205 212 } else { ··· 244 235 && dev->clk_freq != 1000000 && dev->clk_freq != 3400000) { 245 236 dev_err(&pdev->dev, 246 237 "Only 100kHz, 400kHz, 1MHz and 3.4MHz supported"); 247 - return -EINVAL; 238 + r = -EINVAL; 239 + goto exit_reset; 248 240 } 249 241 250 242 r = i2c_dw_eval_lock_support(dev); 251 243 if (r) 252 - return r; 244 + goto exit_reset; 253 245 254 246 dev->functionality = I2C_FUNC_10BIT_ADDR | DW_IC_DEFAULT_FUNCTIONALITY; 255 247 ··· 296 286 } 297 287 298 288 r = i2c_dw_probe(dev); 299 - if (r && !dev->pm_runtime_disabled) 300 - pm_runtime_disable(&pdev->dev); 289 + if (r) 290 + goto exit_probe; 301 291 292 + return r; 293 + 294 + exit_probe: 295 + if (!dev->pm_runtime_disabled) 296 + pm_runtime_disable(&pdev->dev); 297 + exit_reset: 298 + if (!IS_ERR_OR_NULL(dev->rst)) 299 + reset_control_assert(dev->rst); 302 300 return r; 303 301 } 304 302 ··· 324 306 pm_runtime_put_sync(&pdev->dev); 325 307 if (!dev->pm_runtime_disabled) 326 308 pm_runtime_disable(&pdev->dev); 309 + if (!IS_ERR_OR_NULL(dev->rst)) 310 + reset_control_assert(dev->rst); 327 311 328 312 return 0; 329 313 }
+2 -1
drivers/i2c/busses/i2c-exynos5.c
··· 457 457 458 458 int_status = readl(i2c->regs + HSI2C_INT_STATUS); 459 459 writel(int_status, i2c->regs + HSI2C_INT_STATUS); 460 - trans_status = readl(i2c->regs + HSI2C_TRANS_STATUS); 461 460 462 461 /* handle interrupt related to the transfer status */ 463 462 if (i2c->variant->hw == HSI2C_EXYNOS7) { ··· 481 482 goto stop; 482 483 } 483 484 485 + trans_status = readl(i2c->regs + HSI2C_TRANS_STATUS); 484 486 if ((trans_status & HSI2C_MASTER_ST_MASK) == HSI2C_MASTER_ST_LOSE) { 485 487 i2c->state = -EAGAIN; 486 488 goto stop; 487 489 } 488 490 } else if (int_status & HSI2C_INT_I2C) { 491 + trans_status = readl(i2c->regs + HSI2C_TRANS_STATUS); 489 492 if (trans_status & HSI2C_NO_DEV_ACK) { 490 493 dev_dbg(i2c->dev, "No ACK from device\n"); 491 494 i2c->state = -ENXIO;
+1 -1
drivers/i2c/busses/i2c-meson.c
··· 175 175 wdata1 |= *buf++ << ((i - 4) * 8); 176 176 177 177 writel(wdata0, i2c->regs + REG_TOK_WDATA0); 178 - writel(wdata0, i2c->regs + REG_TOK_WDATA1); 178 + writel(wdata1, i2c->regs + REG_TOK_WDATA1); 179 179 180 180 dev_dbg(i2c->dev, "%s: data %08x %08x len %d\n", __func__, 181 181 wdata0, wdata1, len);
-9
drivers/i2c/busses/i2c-mt65xx.c
··· 172 172 .max_comb_2nd_msg_len = 31, 173 173 }; 174 174 175 - static const struct i2c_adapter_quirks mt8173_i2c_quirks = { 176 - .max_num_msgs = 65535, 177 - .max_write_len = 65535, 178 - .max_read_len = 65535, 179 - .max_comb_1st_msg_len = 65535, 180 - .max_comb_2nd_msg_len = 65535, 181 - }; 182 - 183 175 static const struct mtk_i2c_compatible mt6577_compat = { 184 176 .quirks = &mt6577_i2c_quirks, 185 177 .pmic_i2c = 0, ··· 191 199 }; 192 200 193 201 static const struct mtk_i2c_compatible mt8173_compat = { 194 - .quirks = &mt8173_i2c_quirks, 195 202 .pmic_i2c = 0, 196 203 .dcm = 1, 197 204 .auto_restart = 1,
+5 -1
drivers/i2c/busses/i2c-riic.c
··· 218 218 } 219 219 220 220 if (riic->is_last || riic->err) { 221 - riic_clear_set_bit(riic, 0, ICIER_SPIE, RIIC_ICIER); 221 + riic_clear_set_bit(riic, ICIER_TEIE, ICIER_SPIE, RIIC_ICIER); 222 222 writeb(ICCR2_SP, riic->base + RIIC_ICCR2); 223 + } else { 224 + /* Transfer is complete, but do not send STOP */ 225 + riic_clear_set_bit(riic, ICIER_TEIE, 0, RIIC_ICIER); 226 + complete(&riic->msg_done); 223 227 } 224 228 225 229 return IRQ_HANDLED;
+2
drivers/i2c/i2c-mux.c
··· 429 429 while (muxc->num_adapters) { 430 430 struct i2c_adapter *adap = muxc->adapter[--muxc->num_adapters]; 431 431 struct i2c_mux_priv *priv = adap->algo_data; 432 + struct device_node *np = adap->dev.of_node; 432 433 433 434 muxc->adapter[muxc->num_adapters] = NULL; 434 435 ··· 439 438 440 439 sysfs_remove_link(&priv->adap.dev.kobj, "mux_device"); 441 440 i2c_del_adapter(adap); 441 + of_node_put(np); 442 442 kfree(priv); 443 443 } 444 444 }