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

Commit 371daecd authored by Ajay Singh Parmar's avatar Ajay Singh Parmar Committed by Gerrit - the friendly Code Review server
Browse files

msm: mdss: displayport: fix alt mode pin configurations



Correct the pin configuration selection logic during alt mode.
Also, fix the message to be sent to usb to avoid sink or dongle
reporting error or nack.

Change-Id: I6c6f9e0c9738af4766a7ff8acb3c932be55935de
Signed-off-by: default avatarAjay Singh Parmar <aparmar@codeaurora.org>
parent d82b3f35
Loading
Loading
Loading
Loading
+6 −7
Original line number Diff line number Diff line
@@ -1022,6 +1022,8 @@ static int dp_init_panel_info(struct mdss_dp_drv_pdata *dp_drv, u32 vic)
	pinfo->lcdc.hsync_skew = 0;
	pinfo->is_pluggable = true;

	dp_drv->bpp = pinfo->bpp;

	pr_debug("update res. vic= %d, pclk_rate = %llu\n",
				dp_drv->vic, pinfo->clk_rate);

@@ -1788,7 +1790,7 @@ static void mdss_dp_event_work(struct work_struct *work)
	struct mdss_dp_drv_pdata *dp = NULL;
	struct delayed_work *dw = to_delayed_work(work);
	unsigned long flag;
	u32 todo = 0, dp_config_pkt[2];
	u32 todo = 0, config;

	if (!dw) {
		pr_err("invalid work structure\n");
@@ -1840,11 +1842,9 @@ static void mdss_dp_event_work(struct work_struct *work)
			SVDM_CMD_TYPE_INITIATOR, 0x1, 0x0, 0x0);
		break;
	case EV_USBPD_DP_CONFIGURE:
		dp_config_pkt[0] = SVDM_HDR(USB_C_DP_SID, VDM_VERSION, 0x1,
			SVDM_CMD_TYPE_INITIATOR, DP_VDM_CONFIGURE);
		dp_config_pkt[1] = mdss_dp_usbpd_gen_config_pkt(dp);
		config = mdss_dp_usbpd_gen_config_pkt(dp);
		usbpd_send_svdm(dp->pd, USB_C_DP_SID, DP_VDM_CONFIGURE,
			SVDM_CMD_TYPE_INITIATOR, 0x1, dp_config_pkt, 0x2);
			SVDM_CMD_TYPE_INITIATOR, 0x1, &config, 0x1);
		break;
	default:
		pr_err("Unknown event:%d\n", todo);
@@ -2050,8 +2050,7 @@ static void usbpd_response_callback(struct usbpd_svid_handler *hdlr, u8 cmd,
		}
		break;
	case DP_VDM_CONFIGURE:
		if ((dp_drv->cable_connected == true)
				|| (cmd_type == SVDM_CMD_TYPE_RESP_ACK)) {
		if (cmd_type == SVDM_CMD_TYPE_RESP_ACK) {
			dp_drv->alt_mode.current_state = DP_CONFIGURE_DONE;
			pr_debug("config USBPD to DP done\n");
			mdss_dp_host_init(&dp_drv->panel_data);
+38 −1
Original line number Diff line number Diff line
@@ -32,6 +32,29 @@
#define AUDIO_FREQ_48		48000
#define DP_AUDIO_FREQ_COUNT	3

enum mdss_dp_pin_assignment {
	PIN_ASSIGNMENT_A,
	PIN_ASSIGNMENT_B,
	PIN_ASSIGNMENT_C,
	PIN_ASSIGNMENT_D,
	PIN_ASSIGNMENT_E,
	PIN_ASSIGNMENT_F,
	PIN_ASSIGNMENT_MAX,
};

static const char *mdss_dp_pin_name(u8 pin)
{
	switch (pin) {
	case PIN_ASSIGNMENT_A: return "PIN_ASSIGNMENT_A";
	case PIN_ASSIGNMENT_B: return "PIN_ASSIGNMENT_B";
	case PIN_ASSIGNMENT_C: return "PIN_ASSIGNMENT_C";
	case PIN_ASSIGNMENT_D: return "PIN_ASSIGNMENT_D";
	case PIN_ASSIGNMENT_E: return "PIN_ASSIGNMENT_E";
	case PIN_ASSIGNMENT_F: return "PIN_ASSIGNMENT_F";
	default: return "UNKNOWN";
	}
}

static const uint32_t naud_value[DP_AUDIO_FREQ_COUNT][DP_AUDIO_FREQ_COUNT] = {
	{ 10125, 16875, 33750 },
	{ 5625, 9375, 18750 },
@@ -477,9 +500,23 @@ void mdss_dp_usbpd_ext_dp_status(struct usbpd_dp_status *dp_status)

u32 mdss_dp_usbpd_gen_config_pkt(struct mdss_dp_drv_pdata *dp)
{
	u8 pin_cfg, pin;
	u32 config = 0;

	config |= (dp->alt_mode.dp_cap.dlink_pin_config << 8);
	pin_cfg = dp->alt_mode.dp_cap.dlink_pin_config;

	for (pin = PIN_ASSIGNMENT_A; pin < PIN_ASSIGNMENT_MAX; pin++) {
		if (pin_cfg & BIT(pin))
			break;
	}

	if (pin == PIN_ASSIGNMENT_MAX)
		pin = PIN_ASSIGNMENT_C;

	pr_debug("pin assignment: %s\n", mdss_dp_pin_name(pin));

	config |= BIT(pin) << 8;

	config |= (0x1 << 2); /* configure for DPv1.3 */
	config |= 0x2; /* Configuring for UFP_D */