Exemple #1
0
struct msm_panel_info *mipi_dsi_detect_panel(
	struct msm_fb_data_type *mfd)
{
	int i;
	int ret;
	struct mipi_dsi_data *dsi_data;

	dsi_data = platform_get_drvdata(mfd->panel_pdev);

	mipi_dsi_op_mode_config(DSI_CMD_MODE);
	if (dsi_data->default_panels[0] != NULL) {
		for (i = 0; dsi_data->default_panels[i]; i++) {
			ret = panel_id_reg_check(mfd, &dsi_data->tx_buf,
						 &dsi_data->rx_buf,
						 dsi_data->default_panels[i]);
			if (!ret)
				break;
		}

		if (dsi_data->default_panels[i]) {
			dsi_data->panel = dsi_data->default_panels[i];
			dev_info(&mfd->panel_pdev->dev,
				"found panel vendor: %s\n",
				dsi_data->panel->name);
		} else {
			dev_warn(&mfd->panel_pdev->dev,
				"cannot detect panel vendor!\n");
			return NULL;
		}
	}

	for (i = 0; dsi_data->panels[i]; i++) {
		ret = panel_id_reg_check(mfd, &dsi_data->tx_buf,
					 &dsi_data->rx_buf,
					 dsi_data->panels[i]);
		if (!ret)
			break;
	}

	if (dsi_data->panels[i]) {
		dsi_data->panel = dsi_data->panels[i];
		dev_info(&mfd->panel_pdev->dev, "found panel: %s\n",
			 dsi_data->panel->name);
	} else {
		dev_warn(&mfd->panel_pdev->dev, "cannot detect panel!\n");
		return NULL;
	}

	dsi_data->panel_data.panel_info =
		*dsi_data->panel->pctrl->get_panel_info();
	dsi_data->panel_data.panel_info.width =
		dsi_data->panel->width;
	dsi_data->panel_data.panel_info.height =
		dsi_data->panel->height;
	dsi_data->panel_data.panel_info.mipi.dsi_pclk_rate =
		mfd->panel_info.mipi.dsi_pclk_rate;
	mipi_dsi_op_mode_config
		(dsi_data->panel_data.panel_info.mipi.mode);

	return &dsi_data->panel_data.panel_info;
}
struct msm_panel_info *mipi_dsi_detect_panel(
	struct msm_fb_data_type *mfd)
{
	int i;
	int ret;
	struct mipi_dsi_data *dsi_data;
	struct device *dev = &mfd->panel_pdev->dev;

	dsi_data = platform_get_drvdata(mfd->panel_pdev);

	mipi_dsi_op_mode_config(DSI_CMD_MODE);
	if (dsi_data->default_panels[0] != NULL) {
		for (i = 0; dsi_data->default_panels[i]; i++) {
			ret = panel_id_reg_check(mfd, &dsi_data->tx_buf,
						 &dsi_data->rx_buf,
						 dsi_data->default_panels[i]);
			if (!ret)
				break;
		}

		if (dsi_data->default_panels[i]) {
			dsi_data->panel = dsi_data->default_panels[i];
			dev_info(dev, "found panel vendor: %s\n",
							dsi_data->panel->name);
#ifdef CONFIG_FB_MSM_RECOVER_PANEL
		} else {
			/* The recovery can only be done if we have one default
			panel defined, which means i will be 1 here */
			if (i == 1) {
				dev_warn(dev, "Unable to detect panel vendor, "
							"try to recover.\n");
				dsi_data->panel_nvm_ok = false;
				dsi_data->panel = dsi_data->default_panels[0];
				dev_info(dev, "Assume panel vendor: %s\n",
							dsi_data->panel->name);
#endif
			} else {
				dev_warn(dev, "cannot detect panel vendor!\n");
				return NULL;
			}
		}
#ifdef CONFIG_FB_MSM_RECOVER_PANEL
	}
	if (dsi_data->panel_nvm_ok) {
#endif
		for (i = 0; dsi_data->panels[i]; i++) {
			ret = panel_id_reg_check(mfd, &dsi_data->tx_buf,
					 &dsi_data->rx_buf,
					 dsi_data->panels[i]);
			if (!ret)
				break;
		}
#ifdef CONFIG_FB_MSM_RECOVER_PANEL
	} else {
		for (i = 0; dsi_data->panels[i]; i++) {
			if (dsi_data->panels[i]->use_if_nv_fail) {
				dev_info(dev, "Assume panel name: %s\n",
						dsi_data->panels[i]->name);
				break;
			}
		}
	}
#endif

	if (dsi_data->panels[i]) {
		dsi_data->panel = dsi_data->panels[i];
		dev_info(dev, "found panel: %s\n", dsi_data->panel->name);
	} else {
		dev_warn(dev, "cannot detect panel!\n");
		return NULL;
	}

#ifdef CONFIG_FB_MSM_RECOVER_PANEL
	/* Verify NVM even if we have managed to detect panel */
	if (dsi_data->panel_nvm_ok && dsi_data->panel->pnvrw_ctl &&
			dsi_data->backup_nvm_to_ram && dsi_data->is_nvm_ok) {
		dsi_data->backup_nvm_to_ram(mfd);
		if (dsi_data->is_nvm_ok(mfd))
			dsi_data->panel_nvm_backup_ok = true;
		else
			dsi_data->panel_nvm_ok = false;
	}
#endif

	dsi_data->panel_data.panel_info =
		*dsi_data->panel->pctrl->get_panel_info();
	dsi_data->panel_data.panel_info.width =
		dsi_data->panel->width;
	dsi_data->panel_data.panel_info.height =
		dsi_data->panel->height;
	dsi_data->panel_data.panel_info.mipi.dsi_pclk_rate =
		mfd->panel_info.mipi.dsi_pclk_rate;
	mipi_dsi_op_mode_config
		(dsi_data->panel_data.panel_info.mipi.mode);

	return &dsi_data->panel_data.panel_info;
}