Lines Matching +full:usb +full:- +full:role +full:- +full:switch

1 // SPDX-License-Identifier: GPL-2.0
3 * Support for usb functionality of Hikey series boards
6 * Copyright (C) 2017-2018 Hilisicon Electronics Co., Ltd.
22 #include <linux/usb/role.h>
45 enum usb_role role; member
57 if (hisi_hikey_usb->hub_vbus) in hub_power_ctrl()
58 gpiod_set_value_cansleep(hisi_hikey_usb->hub_vbus, value); in hub_power_ctrl()
60 if (!hisi_hikey_usb->regulator) in hub_power_ctrl()
63 status = regulator_is_enabled(hisi_hikey_usb->regulator); in hub_power_ctrl()
68 ret = regulator_enable(hisi_hikey_usb->regulator); in hub_power_ctrl()
70 ret = regulator_disable(hisi_hikey_usb->regulator); in hub_power_ctrl()
73 dev_err(hisi_hikey_usb->dev, in hub_power_ctrl()
74 "Can't switch regulator state to %s\n", in hub_power_ctrl()
81 if (!hisi_hikey_usb->otg_switch) in usb_switch_ctrl()
84 gpiod_set_value_cansleep(hisi_hikey_usb->otg_switch, switch_to); in usb_switch_ctrl()
90 if (!hisi_hikey_usb->typec_vbus) in usb_typec_power_ctrl()
93 gpiod_set_value_cansleep(hisi_hikey_usb->typec_vbus, value); in usb_typec_power_ctrl()
102 enum usb_role role; in relay_set_role_switch() local
104 if (!hisi_hikey_usb || !hisi_hikey_usb->dev_role_sw) in relay_set_role_switch()
107 mutex_lock(&hisi_hikey_usb->lock); in relay_set_role_switch()
108 switch (hisi_hikey_usb->role) { in relay_set_role_switch()
127 sw = hisi_hikey_usb->dev_role_sw; in relay_set_role_switch()
128 role = hisi_hikey_usb->role; in relay_set_role_switch()
129 mutex_unlock(&hisi_hikey_usb->lock); in relay_set_role_switch()
131 usb_role_switch_set_role(sw, role); in relay_set_role_switch()
134 static int hub_usb_role_switch_set(struct usb_role_switch *sw, enum usb_role role) in hub_usb_role_switch_set() argument
138 if (!hisi_hikey_usb || !hisi_hikey_usb->dev_role_sw) in hub_usb_role_switch_set()
139 return -EINVAL; in hub_usb_role_switch_set()
141 mutex_lock(&hisi_hikey_usb->lock); in hub_usb_role_switch_set()
142 hisi_hikey_usb->role = role; in hub_usb_role_switch_set()
143 mutex_unlock(&hisi_hikey_usb->lock); in hub_usb_role_switch_set()
145 schedule_work(&hisi_hikey_usb->work); in hub_usb_role_switch_set()
155 regulator = devm_regulator_get(&pdev->dev, "hub-vdd"); in hisi_hikey_usb_parse_kirin970()
157 if (PTR_ERR(regulator) == -EPROBE_DEFER) { in hisi_hikey_usb_parse_kirin970()
158 dev_info(&pdev->dev, in hisi_hikey_usb_parse_kirin970()
159 "waiting for hub-vdd-supply to be probed\n"); in hisi_hikey_usb_parse_kirin970()
162 dev_err(&pdev->dev, in hisi_hikey_usb_parse_kirin970()
163 "get hub-vdd-supply failed with error %ld\n", in hisi_hikey_usb_parse_kirin970()
167 hisi_hikey_usb->regulator = regulator; in hisi_hikey_usb_parse_kirin970()
169 hisi_hikey_usb->reset = devm_gpiod_get(&pdev->dev, "hub_reset_en_gpio", in hisi_hikey_usb_parse_kirin970()
171 if (IS_ERR(hisi_hikey_usb->reset)) in hisi_hikey_usb_parse_kirin970()
172 return PTR_ERR(hisi_hikey_usb->reset); in hisi_hikey_usb_parse_kirin970()
179 struct device *dev = &pdev->dev; in hisi_hikey_usb_probe()
186 return -ENOMEM; in hisi_hikey_usb_probe()
188 hisi_hikey_usb->dev = &pdev->dev; in hisi_hikey_usb_probe()
190 hisi_hikey_usb->otg_switch = devm_gpiod_get(dev, "otg-switch", in hisi_hikey_usb_probe()
192 if (IS_ERR(hisi_hikey_usb->otg_switch)) in hisi_hikey_usb_probe()
193 return PTR_ERR(hisi_hikey_usb->otg_switch); in hisi_hikey_usb_probe()
195 hisi_hikey_usb->typec_vbus = devm_gpiod_get(dev, "typec-vbus", in hisi_hikey_usb_probe()
197 if (IS_ERR(hisi_hikey_usb->typec_vbus)) in hisi_hikey_usb_probe()
198 return PTR_ERR(hisi_hikey_usb->typec_vbus); in hisi_hikey_usb_probe()
200 /* Parse Kirin 970-specific OF data */ in hisi_hikey_usb_probe()
201 if (of_device_is_compatible(pdev->dev.of_node, in hisi_hikey_usb_probe()
207 /* hub-vdd33-en is optional */ in hisi_hikey_usb_probe()
208 hisi_hikey_usb->hub_vbus = devm_gpiod_get_optional(dev, "hub-vdd33-en", in hisi_hikey_usb_probe()
210 if (IS_ERR(hisi_hikey_usb->hub_vbus)) in hisi_hikey_usb_probe()
211 return PTR_ERR(hisi_hikey_usb->hub_vbus); in hisi_hikey_usb_probe()
214 hisi_hikey_usb->dev_role_sw = usb_role_switch_get(dev); in hisi_hikey_usb_probe()
215 if (!hisi_hikey_usb->dev_role_sw) in hisi_hikey_usb_probe()
216 return -EPROBE_DEFER; in hisi_hikey_usb_probe()
217 if (IS_ERR(hisi_hikey_usb->dev_role_sw)) in hisi_hikey_usb_probe()
218 return PTR_ERR(hisi_hikey_usb->dev_role_sw); in hisi_hikey_usb_probe()
220 INIT_WORK(&hisi_hikey_usb->work, relay_set_role_switch); in hisi_hikey_usb_probe()
221 mutex_init(&hisi_hikey_usb->lock); in hisi_hikey_usb_probe()
227 hisi_hikey_usb->hub_role_sw = usb_role_switch_register(dev, in hisi_hikey_usb_probe()
230 if (IS_ERR(hisi_hikey_usb->hub_role_sw)) { in hisi_hikey_usb_probe()
231 usb_role_switch_put(hisi_hikey_usb->dev_role_sw); in hisi_hikey_usb_probe()
232 return PTR_ERR(hisi_hikey_usb->hub_role_sw); in hisi_hikey_usb_probe()
244 if (hisi_hikey_usb->hub_role_sw) in hisi_hikey_usb_remove()
245 usb_role_switch_unregister(hisi_hikey_usb->hub_role_sw); in hisi_hikey_usb_remove()
247 if (hisi_hikey_usb->dev_role_sw) in hisi_hikey_usb_remove()
248 usb_role_switch_put(hisi_hikey_usb->dev_role_sw); in hisi_hikey_usb_remove()
272 MODULE_DESCRIPTION("Driver Support for USB functionality of Hikey");