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*/