typeC: add iio interface for typeC mode

typec mode
add typeC mode iio interface to charge module

Change-Id: I73ed231e93588606c9dd34755759ae6e31e5af57
Signed-off-by: chailu1 <chailu1@lenovo.com>
Reviewed-on: https://gerrit.mot.com/2107389
SME-Granted: SME Approvals Granted
SLTApproved: Slta Waiver
Tested-by: Jira Key
Reviewed-by: Haijian Ma <mahj8@motorola.com>
Reviewed-by: Huosheng Liao <liaohs@motorola.com>
Submit-Approved: Jira Key
This commit is contained in:
chailu1 2021-11-04 14:56:17 +08:00 • committed by Lu Chai
commit 0222c9e9e7
2 changed files with 67 additions and 1 deletions

View file

@ -23,6 +23,7 @@
#include <linux/version.h>
#include <linux/iio/consumer.h>
#include "inc/tcpci_typec.h"
#include <linux/usb/mmi_discrete_typec.h>
#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) {

View file

@ -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