Lines Matching full:ext
105 static int cht_wc_extcon_get_id(struct cht_wc_extcon_data *ext, int pwrsrc_sts) in cht_wc_extcon_get_id() argument
119 static int cht_wc_extcon_get_charger(struct cht_wc_extcon_data *ext, in cht_wc_extcon_get_charger() argument
128 ret = regmap_read(ext->regmap, CHT_WC_USBSRC, &usbsrc); in cht_wc_extcon_get_charger()
130 dev_err(ext->dev, "Error reading usbsrc: %d\n", ret); in cht_wc_extcon_get_charger()
147 dev_warn(ext->dev, "Could not detect charger type\n"); in cht_wc_extcon_get_charger()
149 dev_warn(ext->dev, "Timeout detecting charger type\n"); in cht_wc_extcon_get_charger()
156 dev_warn(ext->dev, in cht_wc_extcon_get_charger()
175 static void cht_wc_extcon_set_phymux(struct cht_wc_extcon_data *ext, u8 state) in cht_wc_extcon_set_phymux() argument
179 ret = regmap_write(ext->regmap, CHT_WC_PHYCTRL, state); in cht_wc_extcon_set_phymux()
181 dev_err(ext->dev, "Error writing phyctrl: %d\n", ret); in cht_wc_extcon_set_phymux()
184 static void cht_wc_extcon_set_5v_boost(struct cht_wc_extcon_data *ext, in cht_wc_extcon_set_5v_boost() argument
197 ret = regmap_write(ext->regmap, CHT_WC_VBUS_GPIO_CTLO, val); in cht_wc_extcon_set_5v_boost()
199 dev_err(ext->dev, "Error writing Vbus GPIO CTLO: %d\n", ret); in cht_wc_extcon_set_5v_boost()
203 static void cht_wc_extcon_set_state(struct cht_wc_extcon_data *ext, in cht_wc_extcon_set_state() argument
206 extcon_set_state_sync(ext->edev, cable, state); in cht_wc_extcon_set_state()
208 extcon_set_state_sync(ext->edev, EXTCON_USB, state); in cht_wc_extcon_set_state()
211 static void cht_wc_extcon_pwrsrc_event(struct cht_wc_extcon_data *ext) in cht_wc_extcon_pwrsrc_event() argument
216 bool ignore_get_charger_errors = ext->usb_host; in cht_wc_extcon_pwrsrc_event()
218 ret = regmap_read(ext->regmap, CHT_WC_PWRSRC_STS, &pwrsrc_sts); in cht_wc_extcon_pwrsrc_event()
220 dev_err(ext->dev, "Error reading pwrsrc status: %d\n", ret); in cht_wc_extcon_pwrsrc_event()
224 id = cht_wc_extcon_get_id(ext, pwrsrc_sts); in cht_wc_extcon_pwrsrc_event()
233 cht_wc_extcon_set_phymux(ext, MUX_SEL_PMIC); in cht_wc_extcon_pwrsrc_event()
237 ret = cht_wc_extcon_get_charger(ext, ignore_get_charger_errors); in cht_wc_extcon_pwrsrc_event()
243 cht_wc_extcon_set_phymux(ext, MUX_SEL_SOC); in cht_wc_extcon_pwrsrc_event()
246 if (cable != ext->previous_cable) { in cht_wc_extcon_pwrsrc_event()
247 cht_wc_extcon_set_state(ext, cable, true); in cht_wc_extcon_pwrsrc_event()
248 cht_wc_extcon_set_state(ext, ext->previous_cable, false); in cht_wc_extcon_pwrsrc_event()
249 ext->previous_cable = cable; in cht_wc_extcon_pwrsrc_event()
252 ext->usb_host = ((id == USB_ID_GND) || (id == USB_RID_A)); in cht_wc_extcon_pwrsrc_event()
253 extcon_set_state_sync(ext->edev, EXTCON_USB_HOST, ext->usb_host); in cht_wc_extcon_pwrsrc_event()
258 struct cht_wc_extcon_data *ext = data; in cht_wc_extcon_isr() local
261 ret = regmap_read(ext->regmap, CHT_WC_PWRSRC_IRQ, &irqs); in cht_wc_extcon_isr()
263 dev_err(ext->dev, "Error reading irqs: %d\n", ret); in cht_wc_extcon_isr()
267 cht_wc_extcon_pwrsrc_event(ext); in cht_wc_extcon_isr()
269 ret = regmap_write(ext->regmap, CHT_WC_PWRSRC_IRQ, irqs); in cht_wc_extcon_isr()
271 dev_err(ext->dev, "Error writing irqs: %d\n", ret); in cht_wc_extcon_isr()
278 static int cht_wc_extcon_sw_control(struct cht_wc_extcon_data *ext, bool enable) in cht_wc_extcon_sw_control() argument
284 ret = regmap_update_bits(ext->regmap, CHT_WC_CHGRCTRL0, mask, val); in cht_wc_extcon_sw_control()
286 dev_err(ext->dev, "Error setting sw control: %d\n", ret); in cht_wc_extcon_sw_control()
294 struct cht_wc_extcon_data *ext; in cht_wc_extcon_probe() local
301 ext = devm_kzalloc(&pdev->dev, sizeof(*ext), GFP_KERNEL); in cht_wc_extcon_probe()
302 if (!ext) in cht_wc_extcon_probe()
305 ext->dev = &pdev->dev; in cht_wc_extcon_probe()
306 ext->regmap = pmic->regmap; in cht_wc_extcon_probe()
307 ext->previous_cable = EXTCON_NONE; in cht_wc_extcon_probe()
310 ext->edev = devm_extcon_dev_allocate(ext->dev, cht_wc_extcon_cables); in cht_wc_extcon_probe()
311 if (IS_ERR(ext->edev)) in cht_wc_extcon_probe()
312 return PTR_ERR(ext->edev); in cht_wc_extcon_probe()
327 cht_wc_extcon_set_5v_boost(ext, false); in cht_wc_extcon_probe()
330 ret = cht_wc_extcon_sw_control(ext, true); in cht_wc_extcon_probe()
335 ret = devm_extcon_dev_register(ext->dev, ext->edev); in cht_wc_extcon_probe()
337 dev_err(ext->dev, "Error registering extcon device: %d\n", ret); in cht_wc_extcon_probe()
342 cht_wc_extcon_set_phymux(ext, MUX_SEL_PMIC); in cht_wc_extcon_probe()
345 cht_wc_extcon_pwrsrc_event(ext); in cht_wc_extcon_probe()
347 ret = devm_request_threaded_irq(ext->dev, irq, NULL, cht_wc_extcon_isr, in cht_wc_extcon_probe()
348 IRQF_ONESHOT, pdev->name, ext); in cht_wc_extcon_probe()
350 dev_err(ext->dev, "Error requesting interrupt: %d\n", ret); in cht_wc_extcon_probe()
355 ret = regmap_write(ext->regmap, CHT_WC_PWRSRC_IRQ_MASK, in cht_wc_extcon_probe()
359 dev_err(ext->dev, "Error writing irq-mask: %d\n", ret); in cht_wc_extcon_probe()
363 platform_set_drvdata(pdev, ext); in cht_wc_extcon_probe()
368 cht_wc_extcon_sw_control(ext, false); in cht_wc_extcon_probe()
374 struct cht_wc_extcon_data *ext = platform_get_drvdata(pdev); in cht_wc_extcon_remove() local
376 cht_wc_extcon_sw_control(ext, false); in cht_wc_extcon_remove()