Hi, On Tue, Jan 14, 2025 at 01:51:26AM +0800, Pengyu Luo wrote: > The Huawei Matebook E Go tablet implements the UCSI interface in the > onboard EC. Add the glue driver to interface with the platform's UCSI > implementation. > > Signed-off-by: Pengyu Luo <mitltlatltl@xxxxxxxxx> > --- > drivers/usb/typec/ucsi/Kconfig | 11 + > drivers/usb/typec/ucsi/Makefile | 1 + > drivers/usb/typec/ucsi/ucsi_huawei_gaokun.c | 526 ++++++++++++++++++++ > 3 files changed, 538 insertions(+) > create mode 100644 drivers/usb/typec/ucsi/ucsi_huawei_gaokun.c > > diff --git a/drivers/usb/typec/ucsi/Kconfig b/drivers/usb/typec/ucsi/Kconfig > index 75559601f..e94956d27 100644 > --- a/drivers/usb/typec/ucsi/Kconfig > +++ b/drivers/usb/typec/ucsi/Kconfig > @@ -91,4 +91,15 @@ config UCSI_LENOVO_YOGA_C630 > To compile the driver as a module, choose M here: the module will be > called ucsi_yoga_c630. > > +config UCSI_HUAWEI_GAOKUN > + tristate "UCSI Interface Driver for Huawei Matebook E Go" > + depends on EC_HUAWEI_GAOKUN > + select DRM_AUX_HPD_BRIDGE > + help > + This driver enables UCSI support on the Huawei Matebook E Go tablet, > + which is a sc8280xp-based 2-in-1 tablet. > + > + To compile the driver as a module, choose M here: the module will be > + called ucsi_huawei_gaokun. > + > endif > diff --git a/drivers/usb/typec/ucsi/Makefile b/drivers/usb/typec/ucsi/Makefile > index be98a8791..dbc571763 100644 > --- a/drivers/usb/typec/ucsi/Makefile > +++ b/drivers/usb/typec/ucsi/Makefile > @@ -23,3 +23,4 @@ obj-$(CONFIG_UCSI_STM32G0) += ucsi_stm32g0.o > obj-$(CONFIG_UCSI_PMIC_GLINK) += ucsi_glink.o > obj-$(CONFIG_CROS_EC_UCSI) += cros_ec_ucsi.o > obj-$(CONFIG_UCSI_LENOVO_YOGA_C630) += ucsi_yoga_c630.o > +obj-$(CONFIG_UCSI_HUAWEI_GAOKUN) += ucsi_huawei_gaokun.o > diff --git a/drivers/usb/typec/ucsi/ucsi_huawei_gaokun.c b/drivers/usb/typec/ucsi/ucsi_huawei_gaokun.c > new file mode 100644 > index 000000000..da1993805 > --- /dev/null > +++ b/drivers/usb/typec/ucsi/ucsi_huawei_gaokun.c > @@ -0,0 +1,527 @@ > +// SPDX-License-Identifier: GPL-2.0-only > +/* > + * ucsi-huawei-gaokun - A UCSI driver for HUAWEI Matebook E Go > + * > + * reference: drivers/usb/typec/ucsi/ucsi_yoga_c630.c > + * drivers/usb/typec/ucsi/ucsi_glink.c > + * drivers/soc/qcom/pmic_glink_altmode.c > + * > + * Copyright (C) 2024 Pengyu Luo <mitltlatltl@xxxxxxxxx> > + */ > + > +#include <drm/bridge/aux-bridge.h> > +#include <linux/auxiliary_bus.h> > +#include <linux/bitops.h> > +#include <linux/completion.h> > +#include <linux/container_of.h> > +#include <linux/module.h> > +#include <linux/notifier.h> > +#include <linux/of.h> > +#include <linux/platform_data/huawei-gaokun-ec.h> > +#include <linux/string.h> > +#include <linux/usb/pd_vdo.h> > +#include <linux/usb/typec_altmode.h> > +#include <linux/usb/typec_dp.h> > +#include <linux/workqueue_types.h> > + > +#include "ucsi.h" > + > +#define EC_EVENT_UCSI 0x21 > +#define EC_EVENT_USB 0x22 > + > +#define GAOKUN_CCX_MASK GENMASK(1, 0) > +#define GAOKUN_MUX_MASK GENMASK(3, 2) > + > +#define GAOKUN_DPAM_MASK GENMASK(3, 0) > +#define GAOKUN_HPD_STATE_MASK BIT(4) > +#define GAOKUN_HPD_IRQ_MASK BIT(5) > + > +#define GET_IDX(updt) (ffs(updt) - 1) > + > +#define CCX_TO_ORI(ccx) (++ccx % 3) /* convert ccx to enum typec_orientation */ > + > +/* Configuration Channel Extension */ > +enum gaokun_ucsi_ccx { > + USBC_CCX_NORMAL, > + USBC_CCX_REVERSE, > + USBC_CCX_NONE, > +}; > + > +enum gaokun_ucsi_mux { > + USBC_MUX_NONE, > + USBC_MUX_USB_2L, > + USBC_MUX_DP_4L, > + USBC_MUX_USB_DP, > +}; Missing newline. > +/* based on pmic_glink_altmode_pin_assignment */ > +enum gaokun_ucsi_dpam_pan { /* DP Alt Mode Pin Assignments */ > + USBC_DPAM_PAN_NONE, > + USBC_DPAM_PAN_A, /* Not supported after USB Type-C Standard v1.0b */ > + USBC_DPAM_PAN_B, /* Not supported after USB Type-C Standard v1.0b */ > + USBC_DPAM_PAN_C, /* USBC_DPAM_PAN_C_REVERSE - 6 */ > + USBC_DPAM_PAN_D, > + USBC_DPAM_PAN_E, > + USBC_DPAM_PAN_F, /* Not supported after USB Type-C Standard v1.0b */ > + USBC_DPAM_PAN_A_REVERSE,/* Not supported after USB Type-C Standard v1.0b */ > + USBC_DPAM_PAN_B_REVERSE,/* Not supported after USB Type-C Standard v1.0b */ > + USBC_DPAM_PAN_C_REVERSE, > + USBC_DPAM_PAN_D_REVERSE, > + USBC_DPAM_PAN_E_REVERSE, > + USBC_DPAM_PAN_F_REVERSE,/* Not supported after USB Type-C Standard v1.0b */ > +}; > + > +struct gaokun_ucsi_reg { > + u8 num_ports; > + u8 port_updt; > + u8 port_data[4]; > + u8 checksum; > + u8 reserved; > +} __packed; > + > +struct gaokun_ucsi_port { > + struct completion usb_ack; > + spinlock_t lock; Locks need to be commented. Did you run checkpatch.pl on this? > + struct gaokun_ucsi *ucsi; > + struct auxiliary_device *bridge; > + > + int idx; > + enum gaokun_ucsi_ccx ccx; > + enum gaokun_ucsi_mux mux; > + u8 mode; > + u16 svid; > + u8 hpd_state; > + u8 hpd_irq; > +}; > + > +struct gaokun_ucsi { > + struct gaokun_ec *ec; > + struct ucsi *ucsi; > + struct gaokun_ucsi_port *ports; > + struct device *dev; > + struct delayed_work work; > + struct notifier_block nb; > + u16 version; > + u8 num_ports; > +}; thanks, -- heikki