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

Merge tag '20201013212531.428538-1-dianders@chromium.org' of https://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux into i2c/for-5.11

v5.10-rc1 + 20201013212531.428538-1-dianders@chromium.org

+43 -18
+2 -4
drivers/i2c/busses/i2c-qcom-geni.c
··· 366 366 geni_se_select_mode(se, GENI_SE_FIFO); 367 367 368 368 writel_relaxed(len, se->base + SE_I2C_RX_TRANS_LEN); 369 + geni_se_setup_m_cmd(se, I2C_READ, m_param); 369 370 370 371 if (dma_buf && geni_se_rx_dma_prep(se, dma_buf, len, &rx_dma)) { 371 372 geni_se_select_mode(se, GENI_SE_FIFO); 372 373 i2c_put_dma_safe_msg_buf(dma_buf, msg, false); 373 374 dma_buf = NULL; 374 375 } 375 - 376 - geni_se_setup_m_cmd(se, I2C_READ, m_param); 377 376 378 377 time_left = wait_for_completion_timeout(&gi2c->done, XFER_TIMEOUT); 379 378 if (!time_left) ··· 407 408 geni_se_select_mode(se, GENI_SE_FIFO); 408 409 409 410 writel_relaxed(len, se->base + SE_I2C_TX_TRANS_LEN); 411 + geni_se_setup_m_cmd(se, I2C_WRITE, m_param); 410 412 411 413 if (dma_buf && geni_se_tx_dma_prep(se, dma_buf, len, &tx_dma)) { 412 414 geni_se_select_mode(se, GENI_SE_FIFO); 413 415 i2c_put_dma_safe_msg_buf(dma_buf, msg, false); 414 416 dma_buf = NULL; 415 417 } 416 - 417 - geni_se_setup_m_cmd(se, I2C_WRITE, m_param); 418 418 419 419 if (!dma_buf) /* Get FIFO IRQ */ 420 420 writel_relaxed(1, se->base + SE_GENI_TX_WATERMARK_REG);
+41 -14
drivers/soc/qcom/qcom-geni-se.c
··· 266 266 static void geni_se_select_fifo_mode(struct geni_se *se) 267 267 { 268 268 u32 proto = geni_se_read_proto(se); 269 - u32 val; 269 + u32 val, val_old; 270 270 271 271 geni_se_irq_clear(se); 272 272 273 - val = readl_relaxed(se->base + SE_GENI_M_IRQ_EN); 273 + /* 274 + * The RX path for the UART is asynchronous and so needs more 275 + * complex logic for enabling / disabling its interrupts. 276 + * 277 + * Specific notes: 278 + * - The done and TX-related interrupts are managed manually. 279 + * - We don't RX from the main sequencer (we use the secondary) so 280 + * we don't need the RX-related interrupts enabled in the main 281 + * sequencer for UART. 282 + */ 274 283 if (proto != GENI_SE_UART) { 284 + val_old = val = readl_relaxed(se->base + SE_GENI_M_IRQ_EN); 275 285 val |= M_CMD_DONE_EN | M_TX_FIFO_WATERMARK_EN; 276 286 val |= M_RX_FIFO_WATERMARK_EN | M_RX_FIFO_LAST_EN; 277 - } 278 - writel_relaxed(val, se->base + SE_GENI_M_IRQ_EN); 287 + if (val != val_old) 288 + writel_relaxed(val, se->base + SE_GENI_M_IRQ_EN); 279 289 280 - val = readl_relaxed(se->base + SE_GENI_S_IRQ_EN); 281 - if (proto != GENI_SE_UART) 290 + val_old = val = readl_relaxed(se->base + SE_GENI_S_IRQ_EN); 282 291 val |= S_CMD_DONE_EN; 283 - writel_relaxed(val, se->base + SE_GENI_S_IRQ_EN); 292 + if (val != val_old) 293 + writel_relaxed(val, se->base + SE_GENI_S_IRQ_EN); 294 + } 284 295 285 - val = readl_relaxed(se->base + SE_GENI_DMA_MODE_EN); 296 + val_old = val = readl_relaxed(se->base + SE_GENI_DMA_MODE_EN); 286 297 val &= ~GENI_DMA_MODE_EN; 287 - writel_relaxed(val, se->base + SE_GENI_DMA_MODE_EN); 298 + if (val != val_old) 299 + writel_relaxed(val, se->base + SE_GENI_DMA_MODE_EN); 288 300 } 289 301 290 302 static void geni_se_select_dma_mode(struct geni_se *se) 291 303 { 292 - u32 val; 304 + u32 proto = geni_se_read_proto(se); 305 + u32 val, val_old; 293 306 294 307 geni_se_irq_clear(se); 295 308 296 - val = readl_relaxed(se->base + SE_GENI_DMA_MODE_EN); 309 + if (proto != GENI_SE_UART) { 310 + val_old = val = readl_relaxed(se->base + SE_GENI_M_IRQ_EN); 311 + val &= ~(M_CMD_DONE_EN | M_TX_FIFO_WATERMARK_EN); 312 + val &= ~(M_RX_FIFO_WATERMARK_EN | M_RX_FIFO_LAST_EN); 313 + if (val != val_old) 314 + writel_relaxed(val, se->base + SE_GENI_M_IRQ_EN); 315 + 316 + val_old = val = readl_relaxed(se->base + SE_GENI_S_IRQ_EN); 317 + val &= ~S_CMD_DONE_EN; 318 + if (val != val_old) 319 + writel_relaxed(val, se->base + SE_GENI_S_IRQ_EN); 320 + } 321 + 322 + val_old = val = readl_relaxed(se->base + SE_GENI_DMA_MODE_EN); 297 323 val |= GENI_DMA_MODE_EN; 298 - writel_relaxed(val, se->base + SE_GENI_DMA_MODE_EN); 324 + if (val != val_old) 325 + writel_relaxed(val, se->base + SE_GENI_DMA_MODE_EN); 299 326 } 300 327 301 328 /** ··· 678 651 writel_relaxed(lower_32_bits(*iova), se->base + SE_DMA_TX_PTR_L); 679 652 writel_relaxed(upper_32_bits(*iova), se->base + SE_DMA_TX_PTR_H); 680 653 writel_relaxed(GENI_SE_DMA_EOT_BUF, se->base + SE_DMA_TX_ATTR); 681 - writel_relaxed(len, se->base + SE_DMA_TX_LEN); 654 + writel(len, se->base + SE_DMA_TX_LEN); 682 655 return 0; 683 656 } 684 657 EXPORT_SYMBOL(geni_se_tx_dma_prep); ··· 715 688 writel_relaxed(upper_32_bits(*iova), se->base + SE_DMA_RX_PTR_H); 716 689 /* RX does not have EOT buffer type bit. So just reset RX_ATTR */ 717 690 writel_relaxed(0, se->base + SE_DMA_RX_ATTR); 718 - writel_relaxed(len, se->base + SE_DMA_RX_LEN); 691 + writel(len, se->base + SE_DMA_RX_LEN); 719 692 return 0; 720 693 } 721 694 EXPORT_SYMBOL(geni_se_rx_dma_prep);