Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ed540a20 authored by Ajay Singh Parmar's avatar Ajay Singh Parmar
Browse files

drm/msm/dsi-staging: add support for secondary dsi display



Add secondary DSI panel nodes and provide corresponding power
and gpio configurations. Match secondary panel name with
command line panel name provided by boot-loader. Initialize
the secondary panel in the same way as primary panel.

CRs-Fixed: 2254681
Change-Id: I534f3b847250e080e68366765ab0e0dd177ac2ea
Signed-off-by: default avatarAjay Singh Parmar <aparmar@codeaurora.org>
parent 0bb81cfe
Loading
Loading
Loading
Loading
+13 −2
Original line number Diff line number Diff line
@@ -103,6 +103,13 @@
	};
};

&dsi_panel_pwr_supply_vdd_no_labibb {
	qcom,panel-supply-entry@1 {
		qcom,supply-min-voltage = <1800000>;
		qcom,supply-max-voltage = <1800000>;
	};
};

&dsi_sharp_4k_dsc_cmd {
	qcom,panel-supply-entries = <&dsi_panel_pwr_supply>;
	qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_wled";
@@ -218,24 +225,28 @@

&dsi_nt35695b_truly_fhd_cmd {
	qcom,panel-supply-entries = <&dsi_panel_pwr_supply>;
	qcom,panel-sec-supply-entries = <&dsi_panel_pwr_supply_vdd_no_labibb>;
	qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_wled";
	qcom,mdss-dsi-bl-min-level = <1>;
	qcom,mdss-dsi-bl-max-level = <4095>;
	qcom,mdss-dsi-mode-sel-gpio-state = "single_port";
	qcom,panel-mode-gpio = <&tlmm 7 0>;
	qcom,platform-te-gpio = <&tlmm 8 0>;
	qcom,platform-reset-gpio = <&tlmm 6 0>;
	qcom,panel-sec-mode-gpio = <&tlmm 77 0>;
	qcom,platform-sec-reset-gpio = <&tlmm 66 0>;
};

&dsi_nt35695b_truly_fhd_video {
	qcom,panel-supply-entries = <&dsi_panel_pwr_supply>;
	qcom,panel-sec-supply-entries = <&dsi_panel_pwr_supply_vdd_no_labibb>;
	qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_wled";
	qcom,mdss-dsi-bl-min-level = <1>;
	qcom,mdss-dsi-bl-max-level = <4095>;
	qcom,mdss-dsi-mode-sel-gpio-state = "single_port";
	qcom,panel-mode-gpio = <&tlmm 7 0>;
	qcom,platform-te-gpio = <&tlmm 8 0>;
	qcom,platform-reset-gpio = <&tlmm 6 0>;
	qcom,panel-sec-mode-gpio = <&tlmm 77 0>;
	qcom,platform-sec-reset-gpio = <&tlmm 66 0>;
};

&qupv3_se9_i2c {
+26 −3
Original line number Diff line number Diff line
@@ -357,6 +357,29 @@
		qcom,dsi-panel = <&dsi_dual_nt36850_truly_cmd>;
	};

	dsi_nt35695b_truly_fhd_cmd_sec_display: qcom,dsi-display@20 {
		label = "dsi_nt35695b_truly_fhd_cmd_display";
		qcom,display-type = "secondary";

		qcom,dsi-ctrl-num = <1>;
		qcom,dsi-phy-num = <1>;
		qcom,dsi-select-clocks = "src_byte_clk1", "src_pixel_clk1";

		qcom,dsi-panel = <&dsi_nt35695b_truly_fhd_cmd>;

	};

	dsi_nt35695b_truly_fhd_video_sec_display: qcom,dsi-display@21 {
		label = "dsi_nt35695b_truly_fhd_video_display";
		qcom,display-type = "secondary";

		qcom,dsi-ctrl-num = <1>;
		qcom,dsi-phy-num = <1>;
		qcom,dsi-select-clocks = "src_byte_clk1", "src_pixel_clk1";

		qcom,dsi-panel = <&dsi_nt35695b_truly_fhd_video>;
	};

	sde_dsi: qcom,dsi-display-primary {
		compatible = "qcom,dsi-display";
		label = "primary";
@@ -433,8 +456,8 @@
		vdd-supply = <&display_panel_avdd_eldo>;

		qcom,dsi-display-list =
			<&dsi_nt35695b_truly_fhd_cmd_display
			&dsi_nt35695b_truly_fhd_video_display>;
			<&dsi_nt35695b_truly_fhd_cmd_sec_display
			&dsi_nt35695b_truly_fhd_video_sec_display>;
	};

	sde_wb: qcom,wb-display@0 {
@@ -467,7 +490,7 @@
};

&mdss_mdp {
	connectors = <&sde_rscc &sde_wb &sde_dp &sde_dsi>;
	connectors = <&sde_rscc &sde_wb &sde_dp &sde_dsi &sde_dsi1>;
};

/* PHY TIMINGS REVISION T */
+11 −2
Original line number Diff line number Diff line
@@ -3413,7 +3413,7 @@ static int dsi_display_res_init(struct dsi_display *display)
	display->panel = dsi_panel_get(&display->pdev->dev,
				display->panel_of,
				display->parser_node,
				display->root,
				display->display_type,
				display->cmdline_topology);
	if (IS_ERR_OR_NULL(display->panel)) {
		rc = PTR_ERR(display->panel);
@@ -4703,7 +4703,16 @@ int dsi_display_dev_probe(struct platform_device *pdev)
				disp_node = np;
				break;
			}
		} else if (of_property_read_bool(np, disp_active)) {
			continue;
		} else if (index == DSI_SECONDARY) {
			/*
			 * secondary display is currently
			 * supported through boot params only
			 */
			break;
		}

		if (of_property_read_bool(np, disp_active)) {
			disp_node = np;

			if (IS_ENABLED(CONFIG_DSI_PARSER))
+20 −6
Original line number Diff line number Diff line
@@ -1825,10 +1825,15 @@ static int dsi_panel_parse_jitter_config(
static int dsi_panel_parse_power_cfg(struct dsi_panel *panel)
{
	int rc = 0;
	char *supply_name;

	if (!strcmp(panel->type, "primary"))
		supply_name = "qcom,panel-supply-entries";
	else
		supply_name = "qcom,panel-sec-supply-entries";

	rc = dsi_pwr_of_get_vreg_data(&panel->utils,
			&panel->power_info,
			"qcom,panel-supply-entries");
			&panel->power_info, supply_name);
	if (rc) {
		pr_err("[%s] failed to parse vregs\n", panel->name);
		goto error;
@@ -1843,9 +1848,18 @@ static int dsi_panel_parse_gpios(struct dsi_panel *panel)
	int rc = 0;
	const char *data;
	struct dsi_parser_utils *utils = &panel->utils;
	char *reset_gpio_name, *mode_set_gpio_name;

	if (!strcmp(panel->type, "primary")) {
		reset_gpio_name = "qcom,platform-reset-gpio";
		mode_set_gpio_name = "qcom,panel-mode-gpio";
	} else {
		reset_gpio_name = "qcom,platform-sec-reset-gpio";
		mode_set_gpio_name = "qcom,panel-sec-mode-gpio";
	}

	panel->reset_config.reset_gpio = utils->get_named_gpio(utils->data,
					      "qcom,platform-reset-gpio", 0);
					      reset_gpio_name, 0);
	if (!gpio_is_valid(panel->reset_config.reset_gpio) &&
		!panel->host_config.ext_bridge_mode) {
		pr_err("[%s] failed get reset gpio, rc=%d\n", panel->name, rc);
@@ -1869,7 +1883,7 @@ static int dsi_panel_parse_gpios(struct dsi_panel *panel)
	}

	panel->reset_config.lcd_mode_sel_gpio = utils->get_named_gpio(
		utils->data, "qcom,panel-mode-gpio", 0);
		utils->data, mode_set_gpio_name, 0);
	if (!gpio_is_valid(panel->reset_config.lcd_mode_sel_gpio))
		pr_debug("%s:%d mode gpio not specified\n", __func__, __LINE__);

@@ -2883,7 +2897,7 @@ static void dsi_panel_update_util(struct dsi_panel *panel,
struct dsi_panel *dsi_panel_get(struct device *parent,
				struct device_node *of_node,
				struct device_node *parser_node,
				struct dentry *root,
				const char *type,
				int topology_override)
{
	struct dsi_panel *panel;
@@ -2896,7 +2910,7 @@ struct dsi_panel *dsi_panel_get(struct device *parent,

	panel->panel_of_node = of_node;
	panel->parent = parent;
	panel->root = root;
	panel->type = type;

	dsi_panel_update_util(panel, parser_node);
	utils = &panel->utils;
+2 −2
Original line number Diff line number Diff line
@@ -145,6 +145,7 @@ struct drm_panel_esd_config {

struct dsi_panel {
	const char *name;
	const char *type;
	struct device_node *panel_of_node;
	struct mipi_dsi_device mipi_device;

@@ -152,7 +153,6 @@ struct dsi_panel {
	struct drm_panel drm_panel;
	struct mipi_dsi_host *host;
	struct device *parent;
	struct dentry *root;

	struct dsi_host_common_cfg host_config;
	struct dsi_video_engine_cfg video_config;
@@ -213,7 +213,7 @@ static inline void dsi_panel_release_panel_lock(struct dsi_panel *panel)
struct dsi_panel *dsi_panel_get(struct device *parent,
				struct device_node *of_node,
				struct device_node *parser_node,
				struct dentry *root,
				const char *type,
				int topology_override);

int dsi_panel_trigger_esd_attack(struct dsi_panel *panel);