Lines Matching full:altmode
68 struct pmic_glink_altmode *altmode; member
108 static int pmic_glink_altmode_request(struct pmic_glink_altmode *altmode, u32 cmd, u32 arg) in pmic_glink_altmode_request() argument
118 guard(mutex)(&altmode->lock); in pmic_glink_altmode_request()
120 req.hdr.owner = cpu_to_le32(altmode->owner_id); in pmic_glink_altmode_request()
126 ret = pmic_glink_send(altmode->client, &req, sizeof(req)); in pmic_glink_altmode_request()
128 dev_err(altmode->dev, "failed to send altmode request: %#x (%d)\n", cmd, ret); in pmic_glink_altmode_request()
132 left = wait_for_completion_timeout(&altmode->pan_ack, 5 * HZ); in pmic_glink_altmode_request()
134 dev_err(altmode->dev, "timeout waiting for altmode request ack for: %#x\n", cmd); in pmic_glink_altmode_request()
141 static void pmic_glink_altmode_enable_dp(struct pmic_glink_altmode *altmode, in pmic_glink_altmode_enable_dp() argument
162 dev_err(altmode->dev, "failed to switch mux to DP: %d\n", ret); in pmic_glink_altmode_enable_dp()
170 dev_err(altmode->dev, "failed to setup retimer to DP: %d\n", ret); in pmic_glink_altmode_enable_dp()
173 static void pmic_glink_altmode_enable_usb(struct pmic_glink_altmode *altmode, in pmic_glink_altmode_enable_usb() argument
184 dev_err(altmode->dev, "failed to switch mux to USB: %d\n", ret); in pmic_glink_altmode_enable_usb()
192 dev_err(altmode->dev, "failed to setup retimer to USB: %d\n", ret); in pmic_glink_altmode_enable_usb()
195 static void pmic_glink_altmode_safe(struct pmic_glink_altmode *altmode, in pmic_glink_altmode_safe() argument
206 dev_err(altmode->dev, "failed to switch mux to safe mode: %d\n", ret); in pmic_glink_altmode_safe()
214 dev_err(altmode->dev, "failed to setup retimer to USB: %d\n", ret); in pmic_glink_altmode_safe()
220 struct pmic_glink_altmode *altmode = alt_port->altmode; in pmic_glink_altmode_worker() local
225 pmic_glink_altmode_safe(altmode, alt_port); in pmic_glink_altmode_worker()
227 pmic_glink_altmode_enable_dp(altmode, alt_port, alt_port->mode, in pmic_glink_altmode_worker()
230 pmic_glink_altmode_enable_usb(altmode, alt_port); in pmic_glink_altmode_worker()
237 pmic_glink_altmode_request(altmode, ALTMODE_PAN_ACK, alt_port->index); in pmic_glink_altmode_worker()
257 static void pmic_glink_altmode_sc8180xp_notify(struct pmic_glink_altmode *altmode, in pmic_glink_altmode_sc8180xp_notify() argument
272 dev_warn(altmode->dev, "invalid length of USBC_NOTIFY indication: %zd\n", len); in pmic_glink_altmode_sc8180xp_notify()
287 if (port >= ARRAY_SIZE(altmode->ports) || !altmode->ports[port].altmode) { in pmic_glink_altmode_sc8180xp_notify()
288 dev_dbg(altmode->dev, "notification on undefined port %d\n", port); in pmic_glink_altmode_sc8180xp_notify()
292 alt_port = &altmode->ports[port]; in pmic_glink_altmode_sc8180xp_notify()
305 static void pmic_glink_altmode_sc8280xp_notify(struct pmic_glink_altmode *altmode, in pmic_glink_altmode_sc8280xp_notify() argument
317 dev_warn(altmode->dev, "invalid length USBC_NOTIFY_IND: %zd\n", in pmic_glink_altmode_sc8280xp_notify()
330 if (port >= ARRAY_SIZE(altmode->ports) || !altmode->ports[port].altmode) { in pmic_glink_altmode_sc8280xp_notify()
331 dev_dbg(altmode->dev, "notification on undefined port %d\n", port); in pmic_glink_altmode_sc8280xp_notify()
335 alt_port = &altmode->ports[port]; in pmic_glink_altmode_sc8280xp_notify()
346 struct pmic_glink_altmode *altmode = priv; in pmic_glink_altmode_callback() local
356 complete(&altmode->pan_ack); in pmic_glink_altmode_callback()
359 pmic_glink_altmode_sc8280xp_notify(altmode, svid, data, len); in pmic_glink_altmode_callback()
362 pmic_glink_altmode_sc8180xp_notify(altmode, data, len); in pmic_glink_altmode_callback()
384 struct pmic_glink_altmode *altmode = work_to_altmode(work); in pmic_glink_altmode_enable_worker() local
387 ret = pmic_glink_altmode_request(altmode, ALTMODE_PAN_EN, 0); in pmic_glink_altmode_enable_worker()
389 dev_err(altmode->dev, "failed to request altmode notifications: %d\n", ret); in pmic_glink_altmode_enable_worker()
394 struct pmic_glink_altmode *altmode = priv; in pmic_glink_altmode_pdr_notify() local
397 schedule_work(&altmode->enable_work); in pmic_glink_altmode_pdr_notify()
409 struct pmic_glink_altmode *altmode; in pmic_glink_altmode_probe() local
416 altmode = devm_kzalloc(dev, sizeof(*altmode), GFP_KERNEL); in pmic_glink_altmode_probe()
417 if (!altmode) in pmic_glink_altmode_probe()
420 altmode->dev = dev; in pmic_glink_altmode_probe()
424 altmode->owner_id = (unsigned long)match->data; in pmic_glink_altmode_probe()
426 altmode->owner_id = PMIC_GLINK_OWNER_USBC_PAN; in pmic_glink_altmode_probe()
428 INIT_WORK(&altmode->enable_work, pmic_glink_altmode_enable_worker); in pmic_glink_altmode_probe()
429 init_completion(&altmode->pan_ack); in pmic_glink_altmode_probe()
430 mutex_init(&altmode->lock); in pmic_glink_altmode_probe()
440 if (port >= ARRAY_SIZE(altmode->ports)) { in pmic_glink_altmode_probe()
445 if (altmode->ports[port].altmode) { in pmic_glink_altmode_probe()
451 alt_port = &altmode->ports[port]; in pmic_glink_altmode_probe()
452 alt_port->altmode = altmode; in pmic_glink_altmode_probe()
512 for (port = 0; port < ARRAY_SIZE(altmode->ports); port++) { in pmic_glink_altmode_probe()
513 alt_port = &altmode->ports[port]; in pmic_glink_altmode_probe()
522 altmode->client = devm_pmic_glink_client_alloc(dev, in pmic_glink_altmode_probe()
523 altmode->owner_id, in pmic_glink_altmode_probe()
526 altmode); in pmic_glink_altmode_probe()
527 if (IS_ERR(altmode->client)) in pmic_glink_altmode_probe()
528 return PTR_ERR(altmode->client); in pmic_glink_altmode_probe()
530 pmic_glink_client_register(altmode->client); in pmic_glink_altmode_probe()
536 { .name = "pmic_glink.altmode", },
549 MODULE_DESCRIPTION("Qualcomm PMIC GLINK Altmode driver");