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