hisi_hikey_usb
if (!hisi_hikey_usb || !hisi_hikey_usb->dev_role_sw)
mutex_lock(&hisi_hikey_usb->lock);
switch (hisi_hikey_usb->role) {
usb_typec_power_ctrl(hisi_hikey_usb, TYPEC_VBUS_POWER_OFF);
usb_switch_ctrl(hisi_hikey_usb, USB_SWITCH_TO_HUB);
hub_power_ctrl(hisi_hikey_usb, HUB_VBUS_POWER_ON);
hub_power_ctrl(hisi_hikey_usb, HUB_VBUS_POWER_OFF);
usb_switch_ctrl(hisi_hikey_usb, USB_SWITCH_TO_TYPEC);
usb_typec_power_ctrl(hisi_hikey_usb, TYPEC_VBUS_POWER_ON);
hub_power_ctrl(hisi_hikey_usb, HUB_VBUS_POWER_OFF);
usb_typec_power_ctrl(hisi_hikey_usb, TYPEC_VBUS_POWER_OFF);
usb_switch_ctrl(hisi_hikey_usb, USB_SWITCH_TO_TYPEC);
sw = hisi_hikey_usb->dev_role_sw;
role = hisi_hikey_usb->role;
mutex_unlock(&hisi_hikey_usb->lock);
struct hisi_hikey_usb *hisi_hikey_usb = usb_role_switch_get_drvdata(sw);
if (!hisi_hikey_usb || !hisi_hikey_usb->dev_role_sw)
mutex_lock(&hisi_hikey_usb->lock);
hisi_hikey_usb->role = role;
mutex_unlock(&hisi_hikey_usb->lock);
schedule_work(&hisi_hikey_usb->work);
struct hisi_hikey_usb *hisi_hikey_usb)
hisi_hikey_usb->otg_switch = devm_gpiod_get(dev, "otg-switch",
if (IS_ERR(hisi_hikey_usb->otg_switch)) {
PTR_ERR(hisi_hikey_usb->otg_switch));
return PTR_ERR(hisi_hikey_usb->otg_switch);
hisi_hikey_usb->typec_vbus = devm_gpiod_get(dev, "typec-vbus",
if (IS_ERR(hisi_hikey_usb->typec_vbus)) {
PTR_ERR(hisi_hikey_usb->typec_vbus));
return PTR_ERR(hisi_hikey_usb->typec_vbus);
hisi_hikey_usb->reset = devm_gpiod_get_optional(dev,
if (IS_ERR(hisi_hikey_usb->reset)) {
PTR_ERR(hisi_hikey_usb->reset));
return PTR_ERR(hisi_hikey_usb->reset);
hisi_hikey_usb->dev_role_sw = usb_role_switch_get(dev);
if (!hisi_hikey_usb->dev_role_sw)
if (IS_ERR(hisi_hikey_usb->dev_role_sw)) {
PTR_ERR(hisi_hikey_usb->dev_role_sw));
return PTR_ERR(hisi_hikey_usb->dev_role_sw);
INIT_WORK(&hisi_hikey_usb->work, relay_set_role_switch);
hub_role_switch.driver_data = hisi_hikey_usb;
hisi_hikey_usb->hub_role_sw = usb_role_switch_register(dev,
if (IS_ERR(hisi_hikey_usb->hub_role_sw)) {
PTR_ERR(hisi_hikey_usb->hub_role_sw));
usb_role_switch_put(hisi_hikey_usb->dev_role_sw);
return PTR_ERR(hisi_hikey_usb->hub_role_sw);
struct hisi_hikey_usb *hisi_hikey_usb;
hisi_hikey_usb = devm_kzalloc(dev, sizeof(*hisi_hikey_usb), GFP_KERNEL);
if (!hisi_hikey_usb)
hisi_hikey_usb->dev = &pdev->dev;
mutex_init(&hisi_hikey_usb->lock);
hisi_hikey_usb->regulator = devm_regulator_get(dev, "hub-vdd");
if (IS_ERR(hisi_hikey_usb->regulator)) {
if (PTR_ERR(hisi_hikey_usb->regulator) == -EPROBE_DEFER) {
return PTR_ERR(hisi_hikey_usb->regulator);
PTR_ERR(hisi_hikey_usb->regulator));
return PTR_ERR(hisi_hikey_usb->regulator);
ret = hisi_hikey_usb_of_role_switch(pdev, hisi_hikey_usb);
platform_set_drvdata(pdev, hisi_hikey_usb);
struct hisi_hikey_usb *hisi_hikey_usb = platform_get_drvdata(pdev);
if (hisi_hikey_usb->hub_role_sw) {
usb_role_switch_unregister(hisi_hikey_usb->hub_role_sw);
if (hisi_hikey_usb->dev_role_sw)
usb_role_switch_put(hisi_hikey_usb->dev_role_sw);
hub_power_ctrl(hisi_hikey_usb, HUB_VBUS_POWER_OFF);
static void hub_power_ctrl(struct hisi_hikey_usb *hisi_hikey_usb, int value)
if (!hisi_hikey_usb->regulator)
status = regulator_is_enabled(hisi_hikey_usb->regulator);
ret = regulator_enable(hisi_hikey_usb->regulator);
ret = regulator_disable(hisi_hikey_usb->regulator);
dev_err(hisi_hikey_usb->dev,
static void usb_switch_ctrl(struct hisi_hikey_usb *hisi_hikey_usb,
if (!hisi_hikey_usb->otg_switch)
gpiod_set_value_cansleep(hisi_hikey_usb->otg_switch, switch_to);
static void usb_typec_power_ctrl(struct hisi_hikey_usb *hisi_hikey_usb,
if (!hisi_hikey_usb->typec_vbus)
gpiod_set_value_cansleep(hisi_hikey_usb->typec_vbus, value);
struct hisi_hikey_usb *hisi_hikey_usb = container_of(work,
struct hisi_hikey_usb,