imx: ipu3: add hwtyp support
Signed-off-by: Jason Chen <jason.chen@linaro.org>
diff --git a/arch/arm/mach-imx/mach-imx6q.c b/arch/arm/mach-imx/mach-imx6q.c
index 377a5ba..0bb8cd2 100644
--- a/arch/arm/mach-imx/mach-imx6q.c
+++ b/arch/arm/mach-imx/mach-imx6q.c
@@ -119,8 +119,8 @@
};
static const struct of_dev_auxdata imx6q_auxdata_lookup[] __initconst = {
- OF_DEV_AUXDATA("fsl,ipuv3", MX6Q_IPU1_BASE_ADDR, "imx-ipuv3.0", &ipuv3_pdata),
- OF_DEV_AUXDATA("fsl,ipuv3", MX6Q_IPU2_BASE_ADDR, "imx-ipuv3.1", &ipuv3_pdata),
+ OF_DEV_AUXDATA("fsl,imx6q-ipu", MX6Q_IPU1_BASE_ADDR, "imx-ipuv3.0", &ipuv3_pdata),
+ OF_DEV_AUXDATA("fsl,imx6q-ipu", MX6Q_IPU2_BASE_ADDR, "imx-ipuv3.1", &ipuv3_pdata),
OF_DEV_AUXDATA("fsl,vpu", MX6Q_VPU_BASE_ADDR, "mxc_vpu.0", &vpu_pdata),
};
diff --git a/drivers/mxc/ipu3/ipu_common.c b/drivers/mxc/ipu3/ipu_common.c
index 24c0f8a..0a595d6 100644
--- a/drivers/mxc/ipu3/ipu_common.c
+++ b/drivers/mxc/ipu3/ipu_common.c
@@ -30,6 +30,7 @@
#include <linux/irq.h>
#include <linux/irqdesc.h>
#include <linux/clk.h>
+#include <linux/of_device.h>
#include <mach/clock.h>
#include <mach/hardware.h>
#include <mach/ipu-v3.h>
@@ -45,6 +46,29 @@
static int ipu_idx;
int g_ipu_hw_rev;
+enum mxc_ipu_hwtype {
+ IMX5_IPU,
+ IMX6_IPU,
+};
+
+static struct platform_device_id mxc_ipu_devtype[] = {
+ {
+ .name = "imx5-ipu",
+ .driver_data = IMX5_IPU,
+ }, {
+ .name = "imx6-ipu",
+ .driver_data = IMX6_IPU,
+ }, {
+ /* sentinel */
+ }
+};
+
+static const struct of_device_id mxc_ipu_dt_ids[] = {
+ { .compatible = "fsl,imx5-ipu", .data = &mxc_ipu_devtype[IMX5_IPU], },
+ { .compatible = "fsl,imx6q-ipu", .data = &mxc_ipu_devtype[IMX6_IPU], },
+ { /* sentinel */ }
+};
+
/* Static functions */
static irqreturn_t ipu_irq_handler(int irq, void *desc);
@@ -377,6 +401,8 @@
static int __devinit ipu_probe(struct platform_device *pdev)
{
struct imx_ipuv3_platform_data *plat_data = pdev->dev.platform_data;
+ const struct of_device_id *of_id =
+ of_match_device(mxc_ipu_dt_ids, &pdev->dev);
struct ipu_soc *ipu;
struct resource *res;
unsigned long ipu_base;
@@ -391,6 +417,10 @@
ipu = &ipu_array[pdev->id];
memset(ipu, 0, sizeof(struct ipu_soc));
+ if (of_id)
+ pdev->id_entry = of_id->data;
+ ipu->hwtype = pdev->id_entry->driver_data;
+
spin_lock_init(&ipu->spin_lock);
mutex_init(&ipu->mutex_lock);
atomic_set(&ipu->ipu_use_count, 0);
@@ -1253,7 +1283,7 @@
if (idma_is_set(ipu, IDMAC_CHA_PRI, dma_chan)) {
unsigned reg = IDMAC_CH_LOCK_EN_1;
uint32_t value = 0;
- if (cpu_is_mx53() || cpu_is_mx6q()) {
+ if (ipu->hwtype == IMX5_IPU || ipu->hwtype == IMX6_IPU) {
_ipu_ch_param_set_axi_id(ipu, dma_chan, 0);
switch (dma_chan) {
case 5:
@@ -1321,7 +1351,7 @@
} else
_ipu_ch_param_set_axi_id(ipu, dma_chan, 1);
} else {
- if (cpu_is_mx6q())
+ if (ipu->hwtype == IMX6_IPU)
_ipu_ch_param_set_axi_id(ipu, dma_chan, 1);
}
@@ -2940,11 +2970,6 @@
.resume_noirq = ipu_resume_noirq,
};
-static const struct of_device_id mxc_ipu_dt_ids[] = {
- { .compatible = "fsl,ipuv3", },
- { /* sentinel */ }
-};
-
/*!
* This structure contains pointers to the power management callback functions.
*/
diff --git a/drivers/mxc/ipu3/ipu_prv.h b/drivers/mxc/ipu3/ipu_prv.h
index 42060c9..7b245a5 100644
--- a/drivers/mxc/ipu3/ipu_prv.h
+++ b/drivers/mxc/ipu3/ipu_prv.h
@@ -51,6 +51,7 @@
};
struct ipu_soc {
+ u8 hwtype;
bool online;
/*clk*/