From cb81c5fca54f4ec53e8a2b24060fb1623b0ca1fb Mon Sep 17 00:00:00 2001 From: Linyu Yuan Date: Fri, 24 Apr 2020 18:41:41 +0800 Subject: [PATCH] ucsi: ucsi_glink: notify partner information On QRD redriver will use this information to configuration. Change-Id: Icf077136fbc4473e58e45ce55ca542f99233d506 Signed-off-by: Linyu Yuan [collinsd@codeaurora.org: switched to fallthrough statement] Signed-off-by: David Collins --- drivers/usb/typec/ucsi/ucsi_glink.c | 19 ++++++++++++++++++- include/linux/usb/ucsi_glink.h | 2 ++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/drivers/usb/typec/ucsi/ucsi_glink.c b/drivers/usb/typec/ucsi/ucsi_glink.c index d5340da33205..d9dd0a4ead44 100644 --- a/drivers/usb/typec/ucsi/ucsi_glink.c +++ b/drivers/usb/typec/ucsi/ucsi_glink.c @@ -363,7 +363,7 @@ static void ucsi_qti_notify_work(struct work_struct *work) static void ucsi_qti_notify(struct ucsi_dev *udev, unsigned int offset, struct ucsi_connector_status *status) { - u8 conn_partner_type; + u8 conn_partner_type, conn_partner_flag; bool cmd_requested; mutex_lock(&udev->notify_lock); @@ -372,6 +372,10 @@ static void ucsi_qti_notify(struct ucsi_dev *udev, unsigned int offset, if (cmd_requested && offset == UCSI_MESSAGE_IN) { cancel_work_sync(&udev->notify_work); + + udev->constat_info.partner_usb = false; + udev->constat_info.partner_alternate_mode = false; + conn_partner_type = UCSI_CONSTAT_PARTNER_TYPE(status->flags); switch (conn_partner_type) { @@ -381,11 +385,24 @@ static void ucsi_qti_notify(struct ucsi_dev *udev, unsigned int offset, case UCSI_CONSTAT_PARTNER_TYPE_DEBUG: udev->constat_info.acc = TYPEC_ACCESSORY_DEBUG; break; + case UCSI_CONSTAT_PARTNER_TYPE_UFP: + case UCSI_CONSTAT_PARTNER_TYPE_CABLE: + case UCSI_CONSTAT_PARTNER_TYPE_CABLE_AND_UFP: + case UCSI_CONSTAT_PARTNER_TYPE_DFP: + udev->constat_info.partner_usb = true; + fallthrough; default: udev->constat_info.acc = TYPEC_ACCESSORY_NONE; break; } + conn_partner_flag = UCSI_CONSTAT_PARTNER_FLAGS(status->flags); + if (conn_partner_flag & UCSI_CONSTAT_PARTNER_FLAG_USB) + udev->constat_info.partner_usb = true; + + if (conn_partner_flag & UCSI_CONSTAT_PARTNER_FLAG_ALT_MODE) + udev->constat_info.partner_alternate_mode = true; + schedule_work(&udev->notify_work); } } diff --git a/include/linux/usb/ucsi_glink.h b/include/linux/usb/ucsi_glink.h index 67d2c8afd6c2..891ba957bb7b 100644 --- a/include/linux/usb/ucsi_glink.h +++ b/include/linux/usb/ucsi_glink.h @@ -11,6 +11,8 @@ struct ucsi_glink_constat_info { enum typec_accessory acc; + bool partner_usb; + bool partner_alternate_mode; }; struct notifier_block;