static int mapphone_panel_enable_hdtv(struct omap_dss_device *dssdev)
{
	int rc = 0;

	PANELDBG("mapphone_panel_enable_hdtv\n");

	if (!mapphone_hdmi_dac_reg) {
		if (mapphone_hdmi_dac_reg_name[0] == 0) {
			PANELERR("No HDMI regulator defined\n");
			rc = -1;
			goto exit;
		}
		mapphone_hdmi_dac_reg = regulator_get(NULL,
					mapphone_hdmi_dac_reg_name);
		if (IS_ERR(mapphone_hdmi_dac_reg)) {
			PANELERR("Failed HDMI regulator_get\n");
			rc = -1;
			goto exit;
		}
	}

	rc = regulator_enable(mapphone_hdmi_dac_reg);
	if (rc != 0) {
		PANELERR("Failed HDMI regulator_enable (%d)\n", rc);
	} else {
		PANELDBG("Enabled HDMI DAC regulator\n");
		/* Settling time */
		msleep(2);
	}

exit:
	return rc;
}
static int mapphone_dt_get_hdtv_info(void)
{
	struct device_node *panel_node;
	const void *panel_prop;
	struct omap_ovl2mgr_mapping *read_ovl2mgr_mapping = NULL;
	int len = 0, i = 0;

	PANELDBG("dt_get_hdtv_info()\n");

	/* return err if fail to open DT */
	panel_node = of_find_node_by_path(DT_PATH_DISPLAY2);
	if (panel_node == NULL)
		return -ENODEV;

	panel_prop = of_get_property(panel_node, "max_width", NULL);
	if (panel_prop != NULL)
		mapphone_hdtv_device.panel.timings.x_res = *(u32 *)panel_prop;

	panel_prop = of_get_property(panel_node, "max_height", NULL);
	if (panel_prop != NULL)
		mapphone_hdtv_device.panel.timings.y_res = *(u32 *)panel_prop;

	if (mapphone_hdtv_device.panel.timings.x_res > 2048)
		mapphone_hdtv_device.panel.timings.x_res = 1920;

	if (mapphone_hdtv_device.panel.timings.y_res > 2048)
		mapphone_hdtv_device.panel.timings.x_res = 1080;

	PANELDBG("Getting the xres = %u yres = %u\n",
		mapphone_hdtv_device.panel.timings.x_res,
		mapphone_hdtv_device.panel.timings.y_res);

	panel_prop = of_get_property(panel_node, "gpio_pwr_en", NULL);
	if (panel_prop != NULL) {
		hpd_en_config.gpio = *(u32 *)panel_prop;
		platform_add_devices(hdmi_regulator_devices,
		    ARRAY_SIZE(hdmi_regulator_devices));

	} else {
		PANELDBG("Getting the property gpio_pwr_en failed");
	}

	panel_prop = of_get_property(panel_node, "dac_reg_name", NULL);
	if (panel_prop != NULL) {
		strncpy(mapphone_hdmi_dac_reg_name,
				(char *)panel_prop,
				(HDMI_DAC_REGULATOR_NAME_SIZE));
		mapphone_hdmi_dac_reg_name \
			[HDMI_DAC_REGULATOR_NAME_SIZE] = '\0';
	}

	of_node_put(panel_node);
	return 0;
}
static int mapphone_panel_regulator_enable(void)
{
	int i;
	struct mapphone_dsi_panel_pwr_supply *supply;
	struct mapphone_dsi_panel_data *panel_data =
		(struct mapphone_dsi_panel_data *)mapphone_lcd_device.data;

	if (!panel_data->num_pwr_supply)
		PANELWARN("No display regulator is requested\n");

	if (first_boot) {
		for (i = 0; i < panel_data->num_pwr_supply; i++) {
			supply = &(panel_data->disp_vol_supply[i]);

			if (supply->name[0] == '\0') {
				PANELDBG("Display power supply[%d] = none\n",
					i);
				supply->reg_handle = NULL;
				continue;
			}

			PANELDBG("Display power supply[%d] = %s\n",
				i, supply->name);

			supply->reg_handle = regulator_get(NULL, supply->name);
			if (IS_ERR(supply->reg_handle)) {
				PANELERR("fail to get reg for displ.\n");
				return PTR_ERR(supply->reg_handle);
			}
		}
	}

	for (i = 0; i < panel_data->num_pwr_supply; i++) {
		supply = &(panel_data->disp_vol_supply[i]);
		if (supply->reg_handle) {
			PANELDBG("Display power supply[%d], regulator on\n", i);
			regulator_enable(supply->reg_handle);
		}

		if (supply->en_gpio != 0) {
			PANELDBG("Display power supply[%d], gpio %d set"
				"to %d \n", i, supply->en_gpio,
				supply->en_gpio_value);
			gpio_set_value(supply->en_gpio, supply->en_gpio_value);
		}
	}

	msleep(10);

	return 0;
}
static int __init mapphone_dt_panel_init(void)
{
	int ret = 0;

	PANELDBG("dt_panel_init\n");

	if (mapphone_panel_device_read_dt == false) {
		if (mapphone_dt_get_feature_info() != 0) {
			printk(KERN_ERR "failed to parse feature info\n");
			ret = -ENODEV;
		} else if (mapphone_dt_get_dsi_panel_info() != 0) {
			printk(KERN_ERR "failed to parse DSI panel info\n");
			ret = -ENODEV;
		} else if ((mapphone_lcd_device.phy.dsi.xfer_mode ==
						OMAP_DSI_XFER_VIDEO_MODE) &&
				(mapphone_dt_get_dsi_vm_info() != 0)) {
			printk(KERN_ERR "failed to parse DSI VM info\n");
			ret = -ENODEV;
		} else if (mapphone_dt_get_panel_info() != 0) {
			printk(KERN_ERR "failed to parse panel info\n");
			ret = -ENODEV;
		} else if (mapphone_feature_hdmi &&
				mapphone_dt_get_hdtv_info() != 0) {
			printk(KERN_ERR "failed to parse hdtv info\n");
			ret = -ENODEV;
		} else {
			mapphone_panel_device_read_dt = true;
		}
	}
	return ret;
}
static void mapphone_panel_disable_hpd_hdtv(struct omap_dss_device *dssdev)
{
	PANELDBG("mapphone_panel_disable_hpd_hdtv\n");

	mapphone_hdmi_platform_hpd_en = 0;
	mapphone_panel_hdmi_5v_disable();
}
static void mapphone_panel_disable_hdtv(struct omap_dss_device *dssdev)
{
	PANELDBG("mapphone_panel_disable_hdtv\n");

	if (mapphone_hdmi_dac_reg)
		regulator_disable(mapphone_hdmi_dac_reg);
}
static int mapphone_dt_get_panel_feature(void)
{
	struct device_node *panel_node;
	const void *panel_prop;
	struct mapphone_dsi_panel_data *panel_data =
		(struct mapphone_dsi_panel_data *)mapphone_lcd_device.data;
	int r = 0;

	PANELDBG("mapphone_dt_get_panel_feature()\n");

	/* return err if fail to open DT */
	panel_node = of_find_node_by_path(DT_PATH_DISPLAY1);
	if (panel_node == NULL) {
		r = -ENODEV;
		goto err;
	}

	/* Retrieve which features are supported */
	panel_prop = of_get_property(panel_node,
				"ftr_support_som", NULL);
	if (panel_prop != NULL)
		panel_data->ftr_support.som = *(bool *)panel_prop;

end:
	of_node_put(panel_node);
err:
	return r;

}
static int mapphone_dt_get_lvds_panel_info(void)
{
	struct device_node *panel_node;
	const void *panel_prop;

	struct mapphone_dsi_panel_data *panel_data =
		(struct mapphone_dsi_panel_data *)mapphone_lcd_device.data;

	PANELDBG("mapphone_dt_get_lvds_panel_info\n");

	/* return err if fail to open DT */
	panel_node = of_find_node_by_path(DT_PATH_DISPLAY1);
	if (panel_node == NULL)
		return -ENODEV;

	panel_prop =
		of_get_property(panel_node, "lvds_panel_timing_hbpr", NULL);
	if (panel_prop != NULL)
		panel_data->lvds_panel_timing.hbpr = *(u16 *)panel_prop;

	panel_prop =
		of_get_property(panel_node, "lvds_panel_timing_hpw", NULL);
	if (panel_prop != NULL)
		panel_data->lvds_panel_timing.hpw = *(u16 *)panel_prop;

	panel_prop =
		of_get_property(panel_node, "lvds_panel_timing_hfpr", NULL);
	if (panel_prop != NULL)
		panel_data->lvds_panel_timing.hfpr = *(u16 *)panel_prop;

	panel_prop =
		of_get_property(panel_node, "lvds_panel_timing_vbpr", NULL);
	if (panel_prop != NULL)
		panel_data->lvds_panel_timing.vbpr = *(u16 *)panel_prop;

	panel_prop =
		of_get_property(panel_node, "lvds_panel_timing_vspr", NULL);
	if (panel_prop != NULL)
		panel_data->lvds_panel_timing.vspr = *(u16 *)panel_prop;

	panel_prop =
		of_get_property(panel_node, "lvds_panel_timing_vfpr", NULL);
	if (panel_prop != NULL)
		panel_data->lvds_panel_timing.vfpr = *(u16 *)panel_prop;

	of_node_put(panel_node);

	PANELDBG("DT: lvds_panel_timing: hbpr=%d hpw=%d \
		hfpr=%d vbpr=%d vspr=%d vfpr=%d\n",
		panel_data->lvds_panel_timing.hbpr,
		panel_data->lvds_panel_timing.hpw,
		panel_data->lvds_panel_timing.hfpr,
		panel_data->lvds_panel_timing.vbpr,
		panel_data->lvds_panel_timing.vspr,
		panel_data->lvds_panel_timing.vfpr);

	return 0;
}
static void mapphone_panel_disable_hpd_hdtv(struct omap_dss_device *dssdev)
{
	PANELDBG("mapphone_panel_disable_hpd_hdtv\n");

	mapphone_hdmi_platform_hpd_en = 0;

	if (mapphone_hdmi_5v_enable)
		gpio_set_value(mapphone_hdmi_5v_enable, 0);
}
static int  mapphone_panel_enable_hpd_hdtv(struct omap_dss_device *dssdev)
{
	int rc = 0;

	PANELDBG("mapphone_panel_enable_hpd_hdtv\n");

	mapphone_hdmi_platform_hpd_en = 1;

	if (mapphone_hdmi_5v_enable && !mapphone_hdmi_5v_force_off)
		gpio_set_value(mapphone_hdmi_5v_enable, 1);

	return rc;
}
static int  mapphone_panel_enable_hpd_hdtv(struct omap_dss_device *dssdev)
{
	int rc = 0;

	PANELDBG("mapphone_panel_enable_hpd_hdtv\n");

	/* Only enable if not currently enabled */
	if (mapphone_hdmi_platform_hpd_en == 0) {
		mapphone_hdmi_platform_hpd_en = 1;
		rc = mapphone_panel_hdmi_5v_enable();
	}

	return rc;
}
static int mapphone_dt_get_dsi_vm_info(void)
{
	struct device_node *panel_node;
	const void *panel_prop;

	PANELDBG("dt_get_dsi_vm_info()\n");

	/* return err if fail to open DT */
	panel_node = of_find_node_by_path(DT_PATH_DISPLAY1);
	if (panel_node == NULL)
		return -ENODEV;

	panel_prop = of_get_property(panel_node, "dsi_timing_hsa", NULL);
	if (panel_prop != NULL)
		mapphone_lcd_device.phy.dsi.vm_timing.hsa = *(u16 *)panel_prop;

	panel_prop = of_get_property(panel_node, "dsi_timing_hfp", NULL);
	if (panel_prop != NULL)
		mapphone_lcd_device.phy.dsi.vm_timing.hfp = *(u16 *)panel_prop;

	panel_prop = of_get_property(panel_node, "dsi_timing_hbp", NULL);
	if (panel_prop != NULL)
		mapphone_lcd_device.phy.dsi.vm_timing.hbp = *(u16 *)panel_prop;

	panel_prop = of_get_property(panel_node, "dsi_timing_vsa", NULL);
	if (panel_prop != NULL)
		mapphone_lcd_device.phy.dsi.vm_timing.vsa = *(u16 *)panel_prop;

	panel_prop = of_get_property(panel_node, "dsi_timing_vfp", NULL);
	if (panel_prop != NULL)
		mapphone_lcd_device.phy.dsi.vm_timing.vfp = *(u16 *)panel_prop;

	panel_prop = of_get_property(panel_node, "dsi_timing_vbp", NULL);
	if (panel_prop != NULL)
		mapphone_lcd_device.phy.dsi.vm_timing.vbp = *(u16 *)panel_prop;

	of_node_put(panel_node);

	PANELDBG("DT: phy.dsi.vm_timing: hsa=%d hfp=%d \
		hbp=%d vsa=%d vfp=%d vbp=%d\n",
		mapphone_lcd_device.phy.dsi.vm_timing.hsa,
		mapphone_lcd_device.phy.dsi.vm_timing.hfp,
		mapphone_lcd_device.phy.dsi.vm_timing.hbp,
		mapphone_lcd_device.phy.dsi.vm_timing.vsa,
		mapphone_lcd_device.phy.dsi.vm_timing.vfp,
		mapphone_lcd_device.phy.dsi.vm_timing.vbp);

	return 0;
}
static int mapphone_panel_hdmi_5v_disable(void)
{
	int rc = 0;

	if (mapphone_hdmi_5v_enable) {
		rc = regulator_disable(mapphone_hdmi_5v_reg);
		if (rc != 0) {
			PANELERR("Failed HDMI_5V regulator_disable (%d)\n", rc);
		} else {
			PANELDBG("Disabled  HDMI_5V regulator\n");
			mapphone_hdmi_5v_enable = 0;
		}
	}
	return rc;
}
static void mapphone_panel_regulator_disable(void)
{
	int i;
	struct mapphone_dsi_panel_pwr_supply *supply;
	struct mapphone_dsi_panel_data *panel_data =
		(struct mapphone_dsi_panel_data *)mapphone_lcd_device.data;

	for (i = 0; i < panel_data->num_pwr_supply; i++) {
		supply = &(panel_data->disp_vol_supply[i]);
		if (supply->en_gpio != 0) {
			PANELDBG("Display power supply[%d], "
				"gpio %d set to %d\n",
				i, supply->en_gpio, !supply->en_gpio_value);
			gpio_set_value(supply->en_gpio,
				!supply->en_gpio_value);
		}

		if (supply->reg_handle) {
			PANELDBG("Display power supply[%d], "
				"regulator off\n", i);
			regulator_disable(supply->reg_handle);
		}
	}
}
static int mapphone_dt_get_feature_info(void)
{
	struct device_node *panel_node;
	const void *panel_prop;

	PANELDBG("dt_get_feature_info()\n");

	/* return err if fail to open DT */
	panel_node = of_find_node_by_path(DT_HIGH_LEVEL_FEATURE);
	if (panel_node == NULL)
		return -ENODEV;

	panel_prop = of_get_property(panel_node, "feature_hdmi", NULL);
	if (panel_prop != NULL)
		mapphone_feature_hdmi = *(u8 *)panel_prop;

	return 0;
}
static int __init mapphone_dt_panel_init(void)
{
	int ret = 0;

	PANELDBG("dt_panel_init\n");

	if (mapphone_panel_device_read_dt == false) {
		if (mapphone_dt_get_feature_info() != 0) {
			PANELERR("failed to parse feature info\n");
			ret = -ENODEV;
		} else if (mapphone_dt_get_dsi_panel_info() != 0) {
			PANELERR("failed to parse DSI panel info\n");
			ret = -ENODEV;
		} else if ((mapphone_lcd_device.phy.dsi.type ==
						OMAP_DSS_DSI_TYPE_VIDEO_MODE) &&
				(mapphone_dt_get_dsi_vm_info() != 0)) {
			PANELERR("failed to parse DSI VM info\n");
			ret = -ENODEV;
		} else if ((mapphone_lcd_device.phy.dsi.type ==
						OMAP_DSS_DSI_TYPE_VIDEO_MODE) &&
				(mapphone_lcd_device.panel.panel_id ==
					MOT_DISP_LVDS_MIPI_VM_1007_1280_800) &&
				(mapphone_dt_get_lvds_panel_info() != 0)) {
			PANELERR("failed to parse DSI lvds panel info\n");
			ret = -ENODEV;
		} else if (mapphone_dt_get_panel_info() != 0) {
			PANELERR("failed to parse panel info\n");
			ret = -ENODEV;
		} else if (mapphone_dt_get_panel_feature() != 0) {
			PANELERR("failed to parse panel feature info\n");
			ret = -ENODEV;
		} else if (mapphone_feature_hdmi &&
				mapphone_dt_get_hdtv_info() != 0) {
			PANELERR("failed to parse hdtv info\n");
			ret = -ENODEV;
		} else {
			mapphone_panel_device_read_dt = true;
		}
	}

	panel_print_dt();
	return ret;
}
static int mapphone_panel_regulator_enable(void)
{
	if (!display_regulator) {
		PANELDBG("Display power supply = %s\n",
				 mapphone_displ_pwr_sup);
		display_regulator = regulator_get(NULL, mapphone_displ_pwr_sup);
		if (IS_ERR(display_regulator)) {
			printk(KERN_ERR "fail to get regulator for displ.\n");
			return PTR_ERR(display_regulator);
		}
	}

	regulator_enable(display_regulator);
	if (mapphone_displ_pwr_sup_en != 0) {
		gpio_set_value(mapphone_displ_pwr_sup_en, 1);
		msleep(10);
	}

	return 0;
}
static int  mapphone_panel_hdmi_5v_enable(void)
{
	int rc = -1;

	if (!mapphone_hdmi_5v_enable && !mapphone_hdmi_5v_force_off) {
		if (!mapphone_hdmi_5v_reg) {
			mapphone_hdmi_5v_reg =
				regulator_get(NULL, "hdmi_5V_en");
			if (!mapphone_hdmi_5v_reg) {
				regulator_put(mapphone_hdmi_5v_reg);
				return rc;
			}
		}
		rc = regulator_enable(mapphone_hdmi_5v_reg);
		if (rc != 0) {
			PANELERR("Failed HDMI_5V regulator_enable (%d)\n", rc);
		} else {
			PANELDBG("Enabled HDMI_5V regulator\n");
			mapphone_hdmi_5v_enable = 1;
		}
	}

	return rc;
}
static int mapphone_dt_get_hdtv_info(void)
{
	struct device_node *panel_node;
	const void *panel_prop;
	struct omap_ovl2mgr_mapping *read_ovl2mgr_mapping = NULL;
	int len = 0, i = 0;

	PANELDBG("dt_get_hdtv_info()\n");

	/* return err if fail to open DT */
	panel_node = of_find_node_by_path(DT_PATH_DISPLAY2);
	if (panel_node == NULL)
		return -ENODEV;

	panel_prop = of_get_property(panel_node, "max_width", NULL);
	if (panel_prop != NULL)
		mapphone_hdtv_device.panel.timings.x_res = *(u32 *)panel_prop;

	panel_prop = of_get_property(panel_node, "max_height", NULL);
	if (panel_prop != NULL)
		mapphone_hdtv_device.panel.timings.y_res = *(u32 *)panel_prop;

	if (mapphone_hdtv_device.panel.timings.x_res > 2048)
		mapphone_hdtv_device.panel.timings.x_res = 1920;

	if (mapphone_hdtv_device.panel.timings.y_res > 2048)
		mapphone_hdtv_device.panel.timings.x_res = 1080;

	/* Get the mapping data for the overlay to map to its manager*/
	panel_prop = of_get_property(panel_node, "overlay_mgr_mapping", &len);
	mapphone_dss_data.ovl2mgr_mapping_cnt = 0;

	if (len)
		mapphone_dss_data.ovl2mgr_mapping_cnt = len /
			sizeof(struct omap_ovl2mgr_mapping);

	if (panel_prop != NULL) {
		read_ovl2mgr_mapping =
			(struct omap_ovl2mgr_mapping *)panel_prop;

		for (i = 0; i < mapphone_dss_data.ovl2mgr_mapping_cnt; i++) {
			mapphone_dss_data.ovl2mgr_mapping[i].overlay_idx =
				read_ovl2mgr_mapping[i].overlay_idx;
			mapphone_dss_data.ovl2mgr_mapping[i].overlay_mgr =
				read_ovl2mgr_mapping[i].overlay_mgr;
			PANELDBG("Mapping data for overlay %u"
					" is to manager %u\n",
			mapphone_dss_data.ovl2mgr_mapping[i].overlay_idx,
			mapphone_dss_data.ovl2mgr_mapping[i].overlay_mgr);
		}
	} else {
		PANELDBG("Panel property is 0 for ovl to mgr mapping\n");
	}

	PANELDBG("Getting the xres = %u yres = %u\n",
		mapphone_hdtv_device.panel.timings.x_res,
		mapphone_hdtv_device.panel.timings.y_res);

	panel_prop = of_get_property(panel_node, "gpio_pwr_en", NULL);
	if (panel_prop != NULL)
		mapphone_hdmi_5v_enable = *(u32 *)panel_prop;

	panel_prop = of_get_property(panel_node, "dac_reg_name", NULL);
	if (panel_prop != NULL) {
		strncpy(mapphone_hdmi_dac_reg_name,
				(char *)panel_prop,
				(HDMI_DAC_REGULATOR_NAME_SIZE));
		mapphone_hdmi_dac_reg_name \
			[HDMI_DAC_REGULATOR_NAME_SIZE] = '\0';
	}

	of_node_put(panel_node);
	return 0;
}
static int mapphone_dt_get_panel_info(void)
{
	struct device_node *panel_node;
	const void *panel_prop;
	int panel_pixel_fmt;
	int pixel_size = 24;
	struct mapphone_dsi_panel_data *panel_data =
		(struct mapphone_dsi_panel_data *)mapphone_lcd_device.data;

	PANELDBG("mapphone_dt_get_panel_info\n");

	panel_node = of_find_node_by_path(DT_PATH_DISPLAY1);
	if (panel_node != NULL) {
		/* Retrieve the panel DSI timing */
		panel_prop = of_get_property(panel_node, "width", NULL);
		if (panel_prop != NULL)
			mapphone_panel_timings.x_res = *(u16 *)panel_prop;

		panel_prop = of_get_property(panel_node, "height", NULL);
		if (panel_prop != NULL)
			mapphone_panel_timings.y_res = *(u16 *)panel_prop;

		panel_prop = of_get_property(panel_node,
						"dispc_timing_hfp", NULL);
		if (panel_prop != NULL)
			mapphone_panel_timings.hfp = *(u16 *)panel_prop;

		panel_prop = of_get_property(panel_node,
						"dispc_timing_hsw", NULL);
		if (panel_prop != NULL)
			mapphone_panel_timings.hsw = *(u16 *)panel_prop;

		panel_prop = of_get_property(panel_node,
						"dispc_timing_hbp", NULL);
		if (panel_prop != NULL)
			mapphone_panel_timings.hbp = *(u16 *)panel_prop;

		panel_prop = of_get_property(panel_node,
						"dispc_timing_vfp", NULL);
		if (panel_prop != NULL)
			mapphone_panel_timings.vfp = *(u16 *)panel_prop;

		panel_prop = of_get_property(panel_node,
						"dispc_timing_vsw", NULL);
		if (panel_prop != NULL)
			mapphone_panel_timings.vsw = *(u16 *)panel_prop;

		panel_prop = of_get_property(panel_node,
						"dispc_timing_vbp", NULL);
		if (panel_prop != NULL)
			mapphone_panel_timings.vbp = *(u16 *)panel_prop;

		panel_prop = of_get_property(panel_node,
						"phy_width_mm", NULL);
		if (panel_prop != NULL)
			mapphone_panel_timings.w = *(u16 *)panel_prop;

		panel_prop = of_get_property(panel_node,
						"phy_height_mm", NULL);
		if (panel_prop != NULL)
			mapphone_panel_timings.h = *(u16 *)panel_prop;

		panel_prop = of_get_property(panel_node,
						"te_support", NULL);
		if (panel_prop != NULL)
			panel_data->te_support = *(u32 *)panel_prop;

		panel_prop = of_get_property(panel_node,
						"te_scan_line", NULL);
		if (panel_prop != NULL)
			panel_data->te_scan_line =  *(u32 *)panel_prop;

		panel_prop = of_get_property(panel_node, "te_type", NULL);
		if (panel_prop != NULL)
			panel_data->te_type = *(enum omap_dsi_te_type *)
				panel_prop;

		panel_prop = of_get_property(panel_node, "pixel_fmt", NULL);
		if (panel_prop != NULL) {
			panel_pixel_fmt = *(u32 *)panel_prop;
			if (panel_pixel_fmt == OMAP_DSS_DISP_PXL_FMT_RGB888)
				pixel_size = 24;
			else if (panel_pixel_fmt ==
					OMAP_DSS_DISP_PXL_FMT_RGB565)
				pixel_size = 16;
			else {
				printk(KERN_ERR " Invalid panel_pxl_fmt=%d",
							panel_pixel_fmt);
				return -ENODEV;
			}
		}

		of_node_put(panel_node);

		mapphone_lcd_device.ctrl.pixel_size  =  pixel_size;
		mapphone_lcd_device.panel.timings  =  mapphone_panel_timings;

	}

	return panel_node ? 0 : -ENODEV;

}
static int mapphone_dt_get_dsi_panel_info(void)
{
	struct device_node *panel_node;
	const void *panel_prop;
	int disp_intf;
	int len = 0;

	PANELDBG("dt_get_dsi_panel_info()\n");

	/* return err if fail to open DT */
	panel_node = of_find_node_by_path(DT_PATH_DISPLAY1);
	if (panel_node == NULL)
		return -ENODEV;

	/* Retrieve the panel information */
	panel_prop = of_get_property(panel_node, "dsi_clk_lane", NULL);
	if (panel_prop != NULL)
		mapphone_lcd_device.phy.dsi.clk_lane = *(u8 *)panel_prop;

	panel_prop = of_get_property(panel_node, "dsi_clk_pol", NULL);
	if (panel_prop != NULL)
		mapphone_lcd_device.phy.dsi.clk_pol = *(u8 *)panel_prop;

	panel_prop = of_get_property(panel_node, "dsi_data1_lane", NULL);
	if (panel_prop != NULL)
		mapphone_lcd_device.phy.dsi.data1_lane = *(u8 *)panel_prop;

	panel_prop = of_get_property(panel_node, "dsi_data1_pol", NULL);
	if (panel_prop != NULL)
		mapphone_lcd_device.phy.dsi.data1_pol = *(u8 *)panel_prop;

	panel_prop = of_get_property(panel_node, "dsi_data2_lane", NULL);
	if (panel_prop != NULL)
		mapphone_lcd_device.phy.dsi.data2_lane = *(u8 *)panel_prop;

	panel_prop = of_get_property(panel_node, "dsi_data2_pol", NULL);
	if (panel_prop != NULL)
		mapphone_lcd_device.phy.dsi.data2_pol = *(u8 *)panel_prop;

	panel_prop = of_get_property(panel_node, "gpio_reset", NULL);
	if (panel_prop != NULL)
		mapphone_panel_data.reset_gpio = *(u32 *)panel_prop;

	panel_prop = of_get_property(panel_node, "displ_pwr_sup", &len);
	if ((panel_prop != NULL) && len) {
		strncpy(mapphone_displ_pwr_sup, (char *)panel_prop,
			sizeof(mapphone_displ_pwr_sup) - 1);
		mapphone_displ_pwr_sup[sizeof(mapphone_displ_pwr_sup) - 1]
			= '\0';
	}

	panel_prop = of_get_property(panel_node, "displ_pwr_sup_en", NULL);
	if (panel_prop != NULL)
		mapphone_displ_pwr_sup_en = *(u32 *)panel_prop;

	panel_prop = of_get_property(panel_node, "type", NULL);
	if (panel_prop != NULL)
		mapphone_lcd_device.panel.panel_id = *(u32 *)panel_prop;

	panel_prop = of_get_property(panel_node, "regn", NULL);
	if (panel_prop != NULL)
		mapphone_lcd_device.phy.dsi.div.regn = *(u16 *)panel_prop;

	panel_prop = of_get_property(panel_node, "regm", NULL);
	if (panel_prop != NULL)
		mapphone_lcd_device.phy.dsi.div.regm = *(u16 *)panel_prop;

	panel_prop = of_get_property(panel_node, "regm3", NULL);
	if (panel_prop != NULL)
		mapphone_lcd_device.phy.dsi.div.regm_dispc = *(u16 *)panel_prop;

	panel_prop = of_get_property(panel_node, "regm4", NULL);
	if (panel_prop != NULL)
		mapphone_lcd_device.phy.dsi.div.regm_dsi = *(u16 *)panel_prop;

	panel_prop = of_get_property(panel_node, "lp_clk_div", NULL);
	if (panel_prop != NULL)
		mapphone_lcd_device.phy.dsi.div.lp_clk_div = *(u16 *)panel_prop;

	panel_prop = of_get_property(panel_node, "lck_div", NULL);
	if (panel_prop != NULL)
		mapphone_lcd_device.phy.dsi.div.lck_div = *(u16 *)panel_prop;

	panel_prop = of_get_property(panel_node, "pck_div", NULL);
	if (panel_prop != NULL)
		mapphone_lcd_device.phy.dsi.div.pck_div = *(u16 *)panel_prop;

	panel_prop = of_get_property(panel_node, "disp_intf", NULL);
	if (panel_prop != NULL) {
		disp_intf = *(u8 *)panel_prop;

		if ((disp_intf == OMAP_DSS_DISP_INTF_MIPI_VP_CM) ||
			(disp_intf == OMAP_DSS_DISP_INTF_MIPI_L4_CM))
			mapphone_lcd_device.phy.dsi.xfer_mode =
				OMAP_DSI_XFER_CMD_MODE;
		else if ((disp_intf == OMAP_DSS_DISP_INTF_MIPI_VP_VM) ||
			(disp_intf == OMAP_DSS_DISP_INTF_MIPI_L4_VM))
			mapphone_lcd_device.phy.dsi.xfer_mode =
				OMAP_DSI_XFER_VIDEO_MODE;
		else {
			printk(KERN_ERR "Invalid disp_intf in dt = %d\n",
				disp_intf);
			return -ENODEV;
		}
	}

	of_node_put(panel_node);

	return 0;
}
static int mapphone_dt_get_dsi_panel_info(void)
{
	struct device_node *panel_node;
	const void *panel_prop;
	int disp_intf, r = 0;

	PANELDBG("dt_get_dsi_panel_info()\n");

	/* return err if fail to open DT */
	panel_node = of_find_node_by_path(DT_PATH_DISPLAY1);
	if (panel_node == NULL) {
		r = -ENODEV;
		goto err;
	}

	/* Retrieve the panel information */
	panel_prop = of_get_property(panel_node, "dsi_clk_lane", NULL);
	if (panel_prop != NULL)
		mapphone_lcd_device.phy.dsi.clk_lane = *(u8 *)panel_prop;

	panel_prop = of_get_property(panel_node, "dsi_clk_pol", NULL);
	if (panel_prop != NULL)
		mapphone_lcd_device.phy.dsi.clk_pol = *(u8 *)panel_prop;

	panel_prop = of_get_property(panel_node, "dsi_data1_lane", NULL);
	if (panel_prop != NULL)
		mapphone_lcd_device.phy.dsi.data1_lane = *(u8 *)panel_prop;

	panel_prop = of_get_property(panel_node, "dsi_data1_pol", NULL);
	if (panel_prop != NULL)
		mapphone_lcd_device.phy.dsi.data1_pol = *(u8 *)panel_prop;

	panel_prop = of_get_property(panel_node, "dsi_data2_lane", NULL);
	if (panel_prop != NULL)
		mapphone_lcd_device.phy.dsi.data2_lane = *(u8 *)panel_prop;

	panel_prop = of_get_property(panel_node, "dsi_data2_pol", NULL);
	if (panel_prop != NULL)
		mapphone_lcd_device.phy.dsi.data2_pol = *(u8 *)panel_prop;

	panel_prop = of_get_property(panel_node, "dsi_data3_lane", NULL);
	if (panel_prop != NULL)
		mapphone_lcd_device.phy.dsi.data3_lane = *(u8 *)panel_prop;

	panel_prop = of_get_property(panel_node, "dsi_data3_pol", NULL);
	if (panel_prop != NULL)
		mapphone_lcd_device.phy.dsi.data3_pol = *(u8 *)panel_prop;

	panel_prop = of_get_property(panel_node, "dsi_data4_lane", NULL);
	if (panel_prop != NULL)
		mapphone_lcd_device.phy.dsi.data4_lane = *(u8 *)panel_prop;

	panel_prop = of_get_property(panel_node, "dsi_data4_pol", NULL);
	if (panel_prop != NULL)
		mapphone_lcd_device.phy.dsi.data4_pol = *(u8 *)panel_prop;

	panel_prop = of_get_property(panel_node, "gpio_reset", NULL);
	if (panel_prop != NULL)
		mapphone_panel_data.reset_gpio = *(u32 *)panel_prop;

	panel_prop = of_get_property(panel_node, "rst_delay_after_pwr", NULL);
	if (panel_prop != NULL)
		mapphone_panel_data.rst_delay_after_pwr = *(u32 *)panel_prop;

	panel_prop = of_get_property(panel_node, "rst_delay_after_high", NULL);
	if (panel_prop != NULL)
		mapphone_panel_data.rst_delay_after_high = *(u32 *)panel_prop;

	r = mapphone_dt_get_panel_power_supply(panel_node);
	if (r)
		goto end;

	panel_prop = of_get_property(panel_node, "disp_cabc_en", NULL);
	if (panel_prop != NULL)
		mapphone_displ_lvds_cabc_en = *(u32 *)panel_prop;

	panel_prop = of_get_property(panel_node, "color_en", NULL);
	if (panel_prop != NULL)
		mapphone_displ_color_en = *(u32 *)panel_prop;

	panel_prop = of_get_property(panel_node, "lcd_bl_pwm", NULL);
	if (panel_prop != NULL)
		mapphone_displ_lcd_bl_pwm = *(u32 *)panel_prop;

	panel_prop = of_get_property(panel_node, "lvds_wp_g", NULL);
	if (panel_prop != NULL)
		mapphone_displ_lvds_wp_g = *(u32 *)panel_prop;

	panel_prop = of_get_property(panel_node, "lvds_wp_e", NULL);
	if (panel_prop != NULL)
		mapphone_displ_lvds_wp_e = *(u32 *)panel_prop;

	panel_prop = of_get_property(panel_node, "type", NULL);
	if (panel_prop != NULL)
		mapphone_lcd_device.panel.panel_id = *(u32 *)panel_prop;

	panel_prop = of_get_property(panel_node, "regn", NULL);
	if (panel_prop != NULL)
		mapphone_lcd_device.clocks.dsi.regn = *(u16 *)panel_prop;

	panel_prop = of_get_property(panel_node, "regm", NULL);
	if (panel_prop != NULL)
		mapphone_lcd_device.clocks.dsi.regm = *(u16 *)panel_prop;

	panel_prop = of_get_property(panel_node, "regm3", NULL);
	if (panel_prop != NULL)
		mapphone_lcd_device.clocks.dsi.regm_dispc = *(u16 *)panel_prop;

	panel_prop = of_get_property(panel_node, "regm4", NULL);
	if (panel_prop != NULL)
		mapphone_lcd_device.clocks.dsi.regm_dsi = *(u16 *)panel_prop;

	panel_prop = of_get_property(panel_node, "lp_clk_div", NULL);
	if (panel_prop != NULL)
		mapphone_lcd_device.clocks.dsi.lp_clk_div = *(u16 *)panel_prop;

	panel_prop = of_get_property(panel_node, "lck_div", NULL);
	if (panel_prop != NULL)
		mapphone_lcd_device.clocks.dispc.channel.lck_div =
			 *(u16 *)panel_prop;

	panel_prop = of_get_property(panel_node, "pck_div", NULL);
	if (panel_prop != NULL)
		mapphone_lcd_device.clocks.dispc.channel.pck_div =
			 *(u16 *)panel_prop;

	panel_prop = of_get_property(panel_node, "d2l_use_ulps", NULL);
	if (panel_prop != NULL)
		mapphone_lcd_device.phy.dsi.d2l_use_ulps = *(u16 *)panel_prop;

	panel_prop = of_get_property(panel_node, "disp_intf", NULL);
	if (panel_prop != NULL) {
		disp_intf = *(u8 *)panel_prop;

		if ((disp_intf == OMAP_DSS_DISP_INTF_MIPI_VP_CM) ||
			(disp_intf == OMAP_DSS_DISP_INTF_MIPI_L4_CM))
			mapphone_lcd_device.phy.dsi.type =
				OMAP_DSS_DSI_TYPE_CMD_MODE;
		else if ((disp_intf == OMAP_DSS_DISP_INTF_MIPI_VP_VM) ||
			(disp_intf == OMAP_DSS_DISP_INTF_MIPI_L4_VM) ||
			(disp_intf == OMAP_DSS_DISP_INTF_MIPI_LVDS_VP_VM)) {
			mapphone_lcd_device.phy.dsi.type =
				OMAP_DSS_DSI_TYPE_VIDEO_MODE;
#ifdef CONFIG_FB_OMAP_BOOTLOADER_INIT
			mapphone_lcd_device.skip_vm_init = true;
#else
			mapphone_lcd_device.skip_vm_init = false;
#endif
		} else {
			PANELERR("Invalid disp_intf in dt = %d\n", disp_intf);
			r = -ENODEV;
		}
	}

end:
	of_node_put(panel_node);
err:
	return r;
}