wusb3801
switch (wusb3801->port_type) {
if (wusb3801->cap.prefer_role == TYPEC_SOURCE)
struct wusb3801 *wusb3801 = typec_get_drvdata(port);
return regmap_update_bits(wusb3801->regmap, WUSB3801_REG_CTRL0,
struct wusb3801 *wusb3801 = typec_get_drvdata(port);
ret = regmap_update_bits(wusb3801->regmap, WUSB3801_REG_CTRL0,
wusb3801->port_type = type;
static int wusb3801_hw_init(struct wusb3801 *wusb3801)
return regmap_write(wusb3801->regmap, WUSB3801_REG_CTRL0,
wusb3801_map_try_role(wusb3801->cap.prefer_role) |
wusb3801_map_pwr_opmode(wusb3801->pwr_opmode) |
wusb3801_map_port_type(wusb3801->port_type));
static void wusb3801_hw_update(struct wusb3801 *wusb3801)
struct typec_port *port = wusb3801->port;
struct device *dev = wusb3801->dev;
ret = regmap_read(wusb3801->regmap, WUSB3801_REG_STAT, &status);
if (!wusb3801->vbus_on) {
ret = regulator_enable(wusb3801->vbus_supply);
wusb3801->vbus_on = true;
if (wusb3801->vbus_on) {
regulator_disable(wusb3801->vbus_supply);
wusb3801->vbus_on = false;
if (partner_type != wusb3801->partner_type) {
enum typec_role pwr_role = wusb3801_get_default_role(wusb3801);
if (wusb3801->partner) {
typec_unregister_partner(wusb3801->partner);
wusb3801->partner = NULL;
wusb3801->partner = typec_register_partner(port, &desc);
if (IS_ERR(wusb3801->partner))
PTR_ERR(wusb3801->partner));
typec_set_pwr_opmode(wusb3801->port,
: wusb3801->pwr_opmode);
typec_set_orientation(wusb3801->port,
wusb3801->partner_type = partner_type;
struct wusb3801 *wusb3801 = data;
regmap_read(wusb3801->regmap, WUSB3801_REG_INT, &dummy);
wusb3801_hw_update(wusb3801);
struct wusb3801 *wusb3801;
wusb3801 = devm_kzalloc(dev, sizeof(*wusb3801), GFP_KERNEL);
if (!wusb3801)
i2c_set_clientdata(client, wusb3801);
wusb3801->dev = dev;
wusb3801->regmap = devm_regmap_init_i2c(client, &config);
if (IS_ERR(wusb3801->regmap))
return PTR_ERR(wusb3801->regmap);
wusb3801->vbus_supply = devm_regulator_get(dev, "vbus");
if (IS_ERR(wusb3801->vbus_supply))
return PTR_ERR(wusb3801->vbus_supply);
ret = typec_get_fw_cap(&wusb3801->cap, connector);
wusb3801->port_type = wusb3801->cap.type;
wusb3801->pwr_opmode = ret;
ret = wusb3801_hw_init(wusb3801);
wusb3801->cap.revision = USB_TYPEC_REV_1_2;
wusb3801->cap.accessory[0] = TYPEC_ACCESSORY_AUDIO;
wusb3801->cap.accessory[1] = TYPEC_ACCESSORY_DEBUG;
wusb3801->cap.orientation_aware = true;
wusb3801->cap.driver_data = wusb3801;
wusb3801->cap.ops = &wusb3801_typec_ops;
wusb3801->port = typec_register_port(dev, &wusb3801->cap);
if (IS_ERR(wusb3801->port)) {
ret = PTR_ERR(wusb3801->port);
wusb3801_hw_update(wusb3801);
IRQF_ONESHOT, dev_name(dev), wusb3801);
typec_unregister_port(wusb3801->port);
struct wusb3801 *wusb3801 = i2c_get_clientdata(client);
free_irq(client->irq, wusb3801);
if (wusb3801->partner)
typec_unregister_partner(wusb3801->partner);
typec_unregister_port(wusb3801->port);
if (wusb3801->vbus_on)
regulator_disable(wusb3801->vbus_supply);
static enum typec_role wusb3801_get_default_role(struct wusb3801 *wusb3801)