diff --git a/drivers/usb/typec/mmi_tcpc/rt_pd_manager.c b/drivers/usb/typec/mmi_tcpc/rt_pd_manager.c index 92ee9198a32e..9234d687f93b 100644 --- a/drivers/usb/typec/mmi_tcpc/rt_pd_manager.c +++ b/drivers/usb/typec/mmi_tcpc/rt_pd_manager.c @@ -23,6 +23,7 @@ #include #include #include "inc/tcpci_typec.h" +#include #define RT_PD_MANAGER_VERSION "0.0.8_G" @@ -74,11 +75,12 @@ static const unsigned int rpm_extcon_cable[] = { enum iio_psy_property { POWER_SUPPLY_IIO_USB_REAL_TYPE = 0, POWER_SUPPLY_IIO_OTG_ENABLE, + POWER_SUPPLY_IIO_TYPEC_MODE, POWER_SUPPLY_IIO_PROP_MAX, }; static const char * const iio_channel_map[] = { - "usb_real_type", "otg_enable", + "usb_real_type", "otg_enable", "typec_mode", }; static int mmi_get_psy_iio_property(struct rt_pd_manager_data *rpmd, @@ -350,6 +352,9 @@ static int pd_tcp_notifier_call(struct notifier_block *nb, cancel_delayed_work_sync(&rpmd->usb_dwork); rpmd->usb_dr = DR_IDLE; schedule_delayed_work(&rpmd->usb_dwork, 0); + val.intval = MMI_POWER_SUPPLY_TYPEC_NONE; + mmi_set_psy_iio_property(rpmd, + POWER_SUPPLY_IIO_TYPEC_MODE, &val); } else if (old_state == TYPEC_UNATTACHED && (new_state == TYPEC_ATTACHED_SRC || new_state == TYPEC_ATTACHED_DEBUG)) { @@ -385,14 +390,23 @@ static int pd_tcp_notifier_call(struct notifier_block *nb, cancel_delayed_work_sync(&rpmd->usb_dwork); rpmd->usb_dr = DR_IDLE; schedule_delayed_work(&rpmd->usb_dwork, 0); + val.intval = MMI_POWER_SUPPLY_TYPEC_NONE; + mmi_set_psy_iio_property(rpmd, + POWER_SUPPLY_IIO_TYPEC_MODE, &val); } else if (old_state == TYPEC_UNATTACHED && new_state == TYPEC_ATTACHED_AUDIO) { dev_info(rpmd->dev, "%s Audio plug in\n", __func__); /* enable AudioAccessory connection */ + val.intval = MMI_POWER_SUPPLY_TYPEC_SINK_AUDIO_ADAPTER; + mmi_set_psy_iio_property(rpmd, + POWER_SUPPLY_IIO_TYPEC_MODE, &val); } else if (old_state == TYPEC_ATTACHED_AUDIO && new_state == TYPEC_UNATTACHED) { dev_info(rpmd->dev, "%s Audio plug out\n", __func__); /* disable AudioAccessory connection */ + val.intval = MMI_POWER_SUPPLY_TYPEC_NONE; + mmi_set_psy_iio_property(rpmd, + POWER_SUPPLY_IIO_TYPEC_MODE, &val); } if (new_state == TYPEC_UNATTACHED) { @@ -451,13 +465,22 @@ static int pd_tcp_notifier_call(struct notifier_block *nb, switch (noti->typec_state.rp_level) { /* SNK_RP_3P0 */ case TYPEC_CC_VOLT_SNK_3_0: + val.intval = MMI_POWER_SUPPLY_TYPEC_SOURCE_HIGH; + mmi_set_psy_iio_property(rpmd, + POWER_SUPPLY_IIO_TYPEC_MODE, &val); break; /* SNK_RP_1P5 */ case TYPEC_CC_VOLT_SNK_1_5: + val.intval = MMI_POWER_SUPPLY_TYPEC_SOURCE_MEDIUM; + mmi_set_psy_iio_property(rpmd, + POWER_SUPPLY_IIO_TYPEC_MODE, &val); break; /* SNK_RP_STD */ case TYPEC_CC_VOLT_SNK_DFT: default: + val.intval = MMI_POWER_SUPPLY_TYPEC_SOURCE_DEFAULT; + mmi_set_psy_iio_property(rpmd, + POWER_SUPPLY_IIO_TYPEC_MODE, &val); break; } } else if (new_state == TYPEC_ATTACHED_CUSTOM_SRC || @@ -465,13 +488,22 @@ static int pd_tcp_notifier_call(struct notifier_block *nb, switch (noti->typec_state.rp_level) { /* DAM_3000 */ case TYPEC_CC_VOLT_SNK_3_0: + val.intval = MMI_POWER_SUPPLY_TYPEC_SOURCE_HIGH; + mmi_set_psy_iio_property(rpmd, + POWER_SUPPLY_IIO_TYPEC_MODE, &val); break; /* DAM_1500 */ case TYPEC_CC_VOLT_SNK_1_5: + val.intval = MMI_POWER_SUPPLY_TYPEC_SOURCE_MEDIUM; + mmi_set_psy_iio_property(rpmd, + POWER_SUPPLY_IIO_TYPEC_MODE, &val); break; /* DAM_500 */ case TYPEC_CC_VOLT_SNK_DFT: default: + val.intval = MMI_POWER_SUPPLY_TYPEC_SOURCE_DEFAULT; + mmi_set_psy_iio_property(rpmd, + POWER_SUPPLY_IIO_TYPEC_MODE, &val); break; } } else if (new_state == TYPEC_ATTACHED_NORP_SRC) { diff --git a/include/linux/usb/mmi_discrete_typec.h b/include/linux/usb/mmi_discrete_typec.h new file mode 100644 index 000000000000..f7122720f761 --- /dev/null +++ b/include/linux/usb/mmi_discrete_typec.h @@ -0,0 +1,34 @@ +/* Copyright (c) 2020, 2021 The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#ifndef MMI_DISCRETE_TYPE_C_H +#define MMI_DISCRETE_TYPE_C_H + +/* Indicates USB Type-C CC connection status */ +enum power_supply_typec_mode { + MMI_POWER_SUPPLY_TYPEC_NONE, + + /* Acting as source */ + MMI_POWER_SUPPLY_TYPEC_SINK, /* Rd only */ + MMI_POWER_SUPPLY_TYPEC_SINK_POWERED_CABLE, /* Rd/Ra */ + MMI_POWER_SUPPLY_TYPEC_SINK_DEBUG_ACCESSORY,/* Rd/Rd */ + MMI_POWER_SUPPLY_TYPEC_SINK_AUDIO_ADAPTER, /* Ra/Ra */ + MMI_POWER_SUPPLY_TYPEC_POWERED_CABLE_ONLY, /* Ra only */ + + /* Acting as sink */ + MMI_POWER_SUPPLY_TYPEC_SOURCE_DEFAULT, /* Rp default */ + MMI_POWER_SUPPLY_TYPEC_SOURCE_MEDIUM, /* Rp 1.5A */ + MMI_POWER_SUPPLY_TYPEC_SOURCE_HIGH, /* Rp 3A */ + MMI_POWER_SUPPLY_TYPEC_NON_COMPLIANT, +}; + +#endif