gpu: ipu-v3: Add functions to set CSI/IC source muxes
authorSteve Longerbeam <slongerbeam@gmail.com>
Thu, 26 Jun 2014 01:05:30 +0000 (18:05 -0700)
committerPhilipp Zabel <p.zabel@pengutronix.de>
Mon, 18 Aug 2014 12:17:47 +0000 (14:17 +0200)
Adds two new functions, ipu_set_csi_src_mux() and ipu_set_ic_src_mux(),
that select the inputs to the CSI and IC respectively. Both muxes are
programmed in the IPU_CONF register.

Signed-off-by: Steve Longerbeam <steve_longerbeam@mentor.com>
Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
drivers/gpu/ipu-v3/ipu-common.c
include/video/imx-ipu-v3.h

index 5978e7aab8ed16a4a8c7b1762765599b234bf4ab..cae543115856ede808176e92534ead539ffa2315 100644 (file)
@@ -382,6 +382,57 @@ static int ipu_memory_reset(struct ipu_soc *ipu)
        return 0;
 }
 
+/*
+ * Set the source mux for the given CSI. Selects either parallel or
+ * MIPI CSI2 sources.
+ */
+void ipu_set_csi_src_mux(struct ipu_soc *ipu, int csi_id, bool mipi_csi2)
+{
+       unsigned long flags;
+       u32 val, mask;
+
+       mask = (csi_id == 1) ? IPU_CONF_CSI1_DATA_SOURCE :
+               IPU_CONF_CSI0_DATA_SOURCE;
+
+       spin_lock_irqsave(&ipu->lock, flags);
+
+       val = ipu_cm_read(ipu, IPU_CONF);
+       if (mipi_csi2)
+               val |= mask;
+       else
+               val &= ~mask;
+       ipu_cm_write(ipu, val, IPU_CONF);
+
+       spin_unlock_irqrestore(&ipu->lock, flags);
+}
+EXPORT_SYMBOL_GPL(ipu_set_csi_src_mux);
+
+/*
+ * Set the source mux for the IC. Selects either CSI[01] or the VDI.
+ */
+void ipu_set_ic_src_mux(struct ipu_soc *ipu, int csi_id, bool vdi)
+{
+       unsigned long flags;
+       u32 val;
+
+       spin_lock_irqsave(&ipu->lock, flags);
+
+       val = ipu_cm_read(ipu, IPU_CONF);
+       if (vdi) {
+               val |= IPU_CONF_IC_INPUT;
+       } else {
+               val &= ~IPU_CONF_IC_INPUT;
+               if (csi_id == 1)
+                       val |= IPU_CONF_CSI_SEL;
+               else
+                       val &= ~IPU_CONF_CSI_SEL;
+       }
+       ipu_cm_write(ipu, val, IPU_CONF);
+
+       spin_unlock_irqrestore(&ipu->lock, flags);
+}
+EXPORT_SYMBOL_GPL(ipu_set_ic_src_mux);
+
 struct ipu_devtype {
        const char *name;
        unsigned long cm_ofs;
index ef64b66b18dfbaf86809e3ec2eaad6d4f1683c70..f80fe13b0d4dfd4081fd72845f9f7b31abf6bb6b 100644 (file)
@@ -92,6 +92,12 @@ int ipu_idmac_channel_irq(struct ipu_soc *ipu, struct ipuv3_channel *channel,
 #define IPU_IRQ_VSYNC_PRE_0            (448 + 14)
 #define IPU_IRQ_VSYNC_PRE_1            (448 + 15)
 
+/*
+ * IPU Common functions
+ */
+void ipu_set_csi_src_mux(struct ipu_soc *ipu, int csi_id, bool mipi_csi2);
+void ipu_set_ic_src_mux(struct ipu_soc *ipu, int csi_id, bool vdi);
+
 /*
  * IPU Image DMA Controller (idmac) functions
  */