Lines Matching refs:ext
108 static int cht_wc_extcon_get_id(struct cht_wc_extcon_data *ext, int pwrsrc_sts) in cht_wc_extcon_get_id() argument
126 static int cht_wc_extcon_get_charger(struct cht_wc_extcon_data *ext, in cht_wc_extcon_get_charger() argument
135 ret = regmap_read(ext->regmap, CHT_WC_USBSRC, &usbsrc); in cht_wc_extcon_get_charger()
137 dev_err(ext->dev, "Error reading usbsrc: %d\n", ret); in cht_wc_extcon_get_charger()
154 dev_warn(ext->dev, "Could not detect charger type\n"); in cht_wc_extcon_get_charger()
156 dev_warn(ext->dev, "Timeout detecting charger type\n"); in cht_wc_extcon_get_charger()
163 dev_warn(ext->dev, in cht_wc_extcon_get_charger()
182 static void cht_wc_extcon_set_phymux(struct cht_wc_extcon_data *ext, u8 state) in cht_wc_extcon_set_phymux() argument
186 ret = regmap_write(ext->regmap, CHT_WC_PHYCTRL, state); in cht_wc_extcon_set_phymux()
188 dev_err(ext->dev, "Error writing phyctrl: %d\n", ret); in cht_wc_extcon_set_phymux()
191 static void cht_wc_extcon_set_5v_boost(struct cht_wc_extcon_data *ext, in cht_wc_extcon_set_5v_boost() argument
204 ret = regmap_write(ext->regmap, CHT_WC_VBUS_GPIO_CTLO, val); in cht_wc_extcon_set_5v_boost()
206 dev_err(ext->dev, "Error writing Vbus GPIO CTLO: %d\n", ret); in cht_wc_extcon_set_5v_boost()
209 static void cht_wc_extcon_set_otgmode(struct cht_wc_extcon_data *ext, in cht_wc_extcon_set_otgmode() argument
215 ret = regmap_update_bits(ext->regmap, CHT_WC_CHGRCTRL1, in cht_wc_extcon_set_otgmode()
218 dev_err(ext->dev, "Error updating CHGRCTRL1 reg: %d\n", ret); in cht_wc_extcon_set_otgmode()
221 static void cht_wc_extcon_enable_charging(struct cht_wc_extcon_data *ext, in cht_wc_extcon_enable_charging() argument
227 ret = regmap_update_bits(ext->regmap, CHT_WC_CHGDISCTRL, in cht_wc_extcon_enable_charging()
230 dev_err(ext->dev, "Error updating CHGDISCTRL reg: %d\n", ret); in cht_wc_extcon_enable_charging()
234 static void cht_wc_extcon_set_state(struct cht_wc_extcon_data *ext, in cht_wc_extcon_set_state() argument
237 extcon_set_state_sync(ext->edev, cable, state); in cht_wc_extcon_set_state()
239 extcon_set_state_sync(ext->edev, EXTCON_USB, state); in cht_wc_extcon_set_state()
242 static void cht_wc_extcon_pwrsrc_event(struct cht_wc_extcon_data *ext) in cht_wc_extcon_pwrsrc_event() argument
247 bool ignore_get_charger_errors = ext->usb_host; in cht_wc_extcon_pwrsrc_event()
249 ret = regmap_read(ext->regmap, CHT_WC_PWRSRC_STS, &pwrsrc_sts); in cht_wc_extcon_pwrsrc_event()
251 dev_err(ext->dev, "Error reading pwrsrc status: %d\n", ret); in cht_wc_extcon_pwrsrc_event()
255 id = cht_wc_extcon_get_id(ext, pwrsrc_sts); in cht_wc_extcon_pwrsrc_event()
257 cht_wc_extcon_enable_charging(ext, false); in cht_wc_extcon_pwrsrc_event()
258 cht_wc_extcon_set_otgmode(ext, true); in cht_wc_extcon_pwrsrc_event()
264 cht_wc_extcon_set_otgmode(ext, false); in cht_wc_extcon_pwrsrc_event()
265 cht_wc_extcon_enable_charging(ext, true); in cht_wc_extcon_pwrsrc_event()
270 cht_wc_extcon_set_phymux(ext, MUX_SEL_PMIC); in cht_wc_extcon_pwrsrc_event()
274 ret = cht_wc_extcon_get_charger(ext, ignore_get_charger_errors); in cht_wc_extcon_pwrsrc_event()
280 cht_wc_extcon_set_phymux(ext, MUX_SEL_SOC); in cht_wc_extcon_pwrsrc_event()
283 if (cable != ext->previous_cable) { in cht_wc_extcon_pwrsrc_event()
284 cht_wc_extcon_set_state(ext, cable, true); in cht_wc_extcon_pwrsrc_event()
285 cht_wc_extcon_set_state(ext, ext->previous_cable, false); in cht_wc_extcon_pwrsrc_event()
286 ext->previous_cable = cable; in cht_wc_extcon_pwrsrc_event()
289 ext->usb_host = ((id == INTEL_USB_ID_GND) || (id == INTEL_USB_RID_A)); in cht_wc_extcon_pwrsrc_event()
290 extcon_set_state_sync(ext->edev, EXTCON_USB_HOST, ext->usb_host); in cht_wc_extcon_pwrsrc_event()
295 struct cht_wc_extcon_data *ext = data; in cht_wc_extcon_isr() local
298 ret = regmap_read(ext->regmap, CHT_WC_PWRSRC_IRQ, &irqs); in cht_wc_extcon_isr()
300 dev_err(ext->dev, "Error reading irqs: %d\n", ret); in cht_wc_extcon_isr()
304 cht_wc_extcon_pwrsrc_event(ext); in cht_wc_extcon_isr()
306 ret = regmap_write(ext->regmap, CHT_WC_PWRSRC_IRQ, irqs); in cht_wc_extcon_isr()
308 dev_err(ext->dev, "Error writing irqs: %d\n", ret); in cht_wc_extcon_isr()
315 static int cht_wc_extcon_sw_control(struct cht_wc_extcon_data *ext, bool enable) in cht_wc_extcon_sw_control() argument
320 ret = regmap_update_bits(ext->regmap, CHT_WC_CHGDISCTRL, in cht_wc_extcon_sw_control()
323 dev_err(ext->dev, in cht_wc_extcon_sw_control()
329 ret = regmap_update_bits(ext->regmap, CHT_WC_CHGRCTRL0, mask, val); in cht_wc_extcon_sw_control()
331 dev_err(ext->dev, "Error setting sw control: %d\n", ret); in cht_wc_extcon_sw_control()
339 struct cht_wc_extcon_data *ext; in cht_wc_extcon_probe() local
347 ext = devm_kzalloc(&pdev->dev, sizeof(*ext), GFP_KERNEL); in cht_wc_extcon_probe()
348 if (!ext) in cht_wc_extcon_probe()
351 ext->dev = &pdev->dev; in cht_wc_extcon_probe()
352 ext->regmap = pmic->regmap; in cht_wc_extcon_probe()
353 ext->previous_cable = EXTCON_NONE; in cht_wc_extcon_probe()
356 ext->edev = devm_extcon_dev_allocate(ext->dev, cht_wc_extcon_cables); in cht_wc_extcon_probe()
357 if (IS_ERR(ext->edev)) in cht_wc_extcon_probe()
358 return PTR_ERR(ext->edev); in cht_wc_extcon_probe()
373 cht_wc_extcon_set_5v_boost(ext, false); in cht_wc_extcon_probe()
376 ret = cht_wc_extcon_sw_control(ext, true); in cht_wc_extcon_probe()
381 cht_wc_extcon_enable_charging(ext, false); in cht_wc_extcon_probe()
384 ret = devm_extcon_dev_register(ext->dev, ext->edev); in cht_wc_extcon_probe()
386 dev_err(ext->dev, "Error registering extcon device: %d\n", ret); in cht_wc_extcon_probe()
391 cht_wc_extcon_set_phymux(ext, MUX_SEL_PMIC); in cht_wc_extcon_probe()
394 cht_wc_extcon_pwrsrc_event(ext); in cht_wc_extcon_probe()
396 ret = devm_request_threaded_irq(ext->dev, irq, NULL, cht_wc_extcon_isr, in cht_wc_extcon_probe()
397 IRQF_ONESHOT, pdev->name, ext); in cht_wc_extcon_probe()
399 dev_err(ext->dev, "Error requesting interrupt: %d\n", ret); in cht_wc_extcon_probe()
404 ret = regmap_write(ext->regmap, CHT_WC_PWRSRC_IRQ_MASK, mask); in cht_wc_extcon_probe()
406 dev_err(ext->dev, "Error writing irq-mask: %d\n", ret); in cht_wc_extcon_probe()
410 platform_set_drvdata(pdev, ext); in cht_wc_extcon_probe()
415 cht_wc_extcon_sw_control(ext, false); in cht_wc_extcon_probe()
421 struct cht_wc_extcon_data *ext = platform_get_drvdata(pdev); in cht_wc_extcon_remove() local
423 cht_wc_extcon_sw_control(ext, false); in cht_wc_extcon_remove()