1616#include <linux/usb/typec_altmode.h>
1717#include <linux/usb/typec_dp.h>
1818#include <linux/usb/typec_mux.h>
19+ #include <linux/usb/typec_retimer.h>
1920
2021#include <linux/soc/qcom/pmic_glink.h>
2122
@@ -69,6 +70,8 @@ struct pmic_glink_altmode_port {
6970 struct typec_switch * typec_switch ;
7071 struct typec_mux * typec_mux ;
7172 struct typec_mux_state state ;
73+ struct typec_retimer * typec_retimer ;
74+ struct typec_retimer_state retimer_state ;
7275 struct typec_altmode dp_alt ;
7376
7477 struct work_struct work ;
@@ -158,6 +161,14 @@ static void pmic_glink_altmode_enable_dp(struct pmic_glink_altmode *altmode,
158161 ret = typec_mux_set (port -> typec_mux , & port -> state );
159162 if (ret )
160163 dev_err (altmode -> dev , "failed to switch mux to DP\n" );
164+
165+ port -> retimer_state .alt = & port -> dp_alt ;
166+ port -> retimer_state .data = & dp_data ;
167+ port -> retimer_state .mode = TYPEC_MODAL_STATE (mode );
168+
169+ ret = typec_retimer_set (port -> typec_retimer , & port -> retimer_state );
170+ if (ret )
171+ dev_err (altmode -> dev , "failed to setup retimer to DP\n" );
161172}
162173
163174static void pmic_glink_altmode_enable_usb (struct pmic_glink_altmode * altmode ,
@@ -172,6 +183,14 @@ static void pmic_glink_altmode_enable_usb(struct pmic_glink_altmode *altmode,
172183 ret = typec_mux_set (port -> typec_mux , & port -> state );
173184 if (ret )
174185 dev_err (altmode -> dev , "failed to switch mux to USB\n" );
186+
187+ port -> retimer_state .alt = NULL ;
188+ port -> retimer_state .data = NULL ;
189+ port -> retimer_state .mode = TYPEC_STATE_USB ;
190+
191+ ret = typec_retimer_set (port -> typec_retimer , & port -> retimer_state );
192+ if (ret )
193+ dev_err (altmode -> dev , "failed to setup retimer to USB\n" );
175194}
176195
177196static void pmic_glink_altmode_safe (struct pmic_glink_altmode * altmode ,
@@ -186,6 +205,14 @@ static void pmic_glink_altmode_safe(struct pmic_glink_altmode *altmode,
186205 ret = typec_mux_set (port -> typec_mux , & port -> state );
187206 if (ret )
188207 dev_err (altmode -> dev , "failed to switch mux to safe mode\n" );
208+
209+ port -> retimer_state .alt = NULL ;
210+ port -> retimer_state .data = NULL ;
211+ port -> retimer_state .mode = TYPEC_STATE_SAFE ;
212+
213+ ret = typec_retimer_set (port -> typec_retimer , & port -> retimer_state );
214+ if (ret )
215+ dev_err (altmode -> dev , "failed to setup retimer to USB\n" );
189216}
190217
191218static void pmic_glink_altmode_worker (struct work_struct * work )
@@ -348,6 +375,11 @@ static const struct drm_bridge_funcs pmic_glink_altmode_bridge_funcs = {
348375 .attach = pmic_glink_altmode_attach ,
349376};
350377
378+ static void pmic_glink_altmode_put_retimer (void * data )
379+ {
380+ typec_retimer_put (data );
381+ }
382+
351383static void pmic_glink_altmode_put_mux (void * data )
352384{
353385 typec_mux_put (data );
@@ -454,6 +486,17 @@ static int pmic_glink_altmode_probe(struct auxiliary_device *adev,
454486 if (ret )
455487 return ret ;
456488
489+ alt_port -> typec_retimer = fwnode_typec_retimer_get (fwnode );
490+ if (IS_ERR (alt_port -> typec_retimer ))
491+ return dev_err_probe (dev , PTR_ERR (alt_port -> typec_retimer ),
492+ "failed to acquire retimer-switch for port: %d\n" ,
493+ port );
494+
495+ ret = devm_add_action_or_reset (dev , pmic_glink_altmode_put_retimer ,
496+ alt_port -> typec_retimer );
497+ if (ret )
498+ return ret ;
499+
457500 alt_port -> typec_switch = fwnode_typec_switch_get (fwnode );
458501 if (IS_ERR (alt_port -> typec_switch ))
459502 return dev_err_probe (dev , PTR_ERR (alt_port -> typec_switch ),
0 commit comments