val = 0;
writel(val, csid->base + CSID_RDI_FRM_DROP_PERIOD(vc));
/* * DT_ID is a two bit bitfield that is concatenated with * the four least significant bits of the five bit VC * bitfield to generate an internal CID value. * * CSID_RDI_CFG0(vc) * DT_ID : 28:27 * VC : 26:22 * DT : 21:16 * * CID : VC 3:0 << 2 | DT_ID 1:0
*/
dt_id = vc & 0x03;
/* note: for non-RDI path, this should be format->decode_format */
val |= DECODE_FORMAT_PAYLOAD_ONLY << RDI_CFG0_DECODE_FORMAT;
val |= format->data_type << RDI_CFG0_DATA_TYPE;
val |= vc << RDI_CFG0_VIRTUAL_CHANNEL;
val |= dt_id << RDI_CFG0_DT_ID;
writel(val, csid->base + CSID_RDI_CFG0(vc));
val = RDI_CFG1_TIMESTAMP_STB_FRAME;
val |= RDI_CFG1_BYTE_CNTR_EN;
val |= RDI_CFG1_TIMESTAMP_EN;
val |= RDI_CFG1_DROP_H_EN;
val |= RDI_CFG1_DROP_V_EN;
val |= RDI_CFG1_CROP_H_EN;
val |= RDI_CFG1_CROP_V_EN;
val |= RDI_CFG1_PACKING_MIPI;
writel(val, csid->base + CSID_RDI_CFG1(vc));
val = 0;
writel(val, csid->base + CSID_RDI_IRQ_SUBSAMPLE_PERIOD(vc));
val = 1;
writel(val, csid->base + CSID_RDI_IRQ_SUBSAMPLE_PATTERN(vc));
val = 0;
writel(val, csid->base + CSID_RDI_CTRL(vc));
val = readl(csid->base + CSID_RDI_CFG0(vc)); if (enable)
val |= RDI_CFG0_ENABLE; else
val &= ~RDI_CFG0_ENABLE;
writel(val, csid->base + CSID_RDI_CFG0(vc));
}
staticvoid csid_configure_stream(struct csid_device *csid, u8 enable)
{ int i;
__csid_configure_top(csid);
/* Loop through all enabled VCs and configure stream for each */ for (i = 0; i < MSM_CSID_MAX_SRC_STREAMS; i++) { if (csid->phy.en_vc & BIT(i)) {
__csid_configure_rdi_stream(csid, enable, i);
__csid_configure_rx(csid, &csid->phy, i);
__csid_ctrl_rdi(csid, enable, i);
}
}
}
/* * csid_reset - Trigger reset on CSID module and wait to complete * @csid: CSID device * * Return 0 on success or a negative error code otherwise
*/ staticint csid_reset(struct csid_device *csid)
{ unsignedlong time;
u32 val; int i;
val = CSID_RESET_CMD_HW_RESET | CSID_RESET_CMD_SW_RESET;
writel(val, csid->base + CSID_RESET_CMD);
time = wait_for_completion_timeout(&csid->reset_complete,
msecs_to_jiffies(CSID_RESET_TIMEOUT_MS)); if (!time) {
dev_err(csid->camss->dev, "CSID reset timeout\n"); return -EIO;
}
for (i = 0; i < MSM_CSID_MAX_SRC_STREAMS; i++) { /* Enable RUP done for the client port */
writel(CSID_CSI2_RDIN_RUP_DONE, csid->base + CSID_CSI2_RDIN_IRQ_MASK(i));
}
/* Clear RDI status */
writel(~0u, csid->base + CSID_BUF_DONE_IRQ_CLEAR);
/* Enable BUF_DONE bit for all write-master client ports */
writel(~0u, csid->base + CSID_BUF_DONE_IRQ_MASK);
/* Unmask all TOP interrupts */
writel(~0u, csid->base + CSID_TOP_IRQ_MASK);
return 0;
}
staticvoid csid_rup_complete(struct csid_device *csid, int rdi)
{
csid_reg_update_clear(csid, rdi);
}
/* Latch and clear TOP status */
val_top = readl(csid->base + CSID_TOP_IRQ_STATUS);
writel(val_top, csid->base + CSID_TOP_IRQ_CLEAR);
/* Latch and clear CSID_CSI2 status */
val = readl(csid->base + CSID_CSI2_RX_IRQ_STATUS);
writel(val, csid->base + CSID_CSI2_RX_IRQ_CLEAR);
/* Latch and clear top level BUF_DONE status */
buf_done_val = readl(csid->base + CSID_BUF_DONE_IRQ_STATUS);
writel(buf_done_val, csid->base + CSID_BUF_DONE_IRQ_CLEAR);
/* Process state for each RDI channel */ for (i = 0; i < MSM_CSID_MAX_SRC_STREAMS; i++) {
val = readl(csid->base + CSID_CSI2_RDIN_IRQ_STATUS(i)); if (val)
writel(val, csid->base + CSID_CSI2_RDIN_IRQ_CLEAR(i));
if (val & CSID_CSI2_RDIN_RUP_DONE)
csid_rup_complete(csid, i);
if (buf_done_val & BIT(BUF_DONE_IRQ_STATUS_RDI_OFFSET + i))
camss_buf_done(csid->camss, csid->id, i);
}
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.1Bemerkung:
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.