diff --git a/drivers/usb/misc/ssusb-redriver-nb7vpq904m.c b/drivers/usb/misc/ssusb-redriver-nb7vpq904m.c index c7c2cb661365..3849f2dab9ee 100644 --- a/drivers/usb/misc/ssusb-redriver-nb7vpq904m.c +++ b/drivers/usb/misc/ssusb-redriver-nb7vpq904m.c @@ -421,6 +421,29 @@ static int ssusb_redriver_read_orientation(struct ssusb_redriver *redriver) return 0; } +int redriver_orientation_get(struct device_node *node) +{ + struct ssusb_redriver *redriver; + struct i2c_client *client; + + if (!node) + return -ENODEV; + + client = of_find_i2c_device_by_node(node); + if (!client) + return -ENODEV; + + redriver = i2c_get_clientdata(client); + if (!redriver) + return -EINVAL; + + if (!gpio_is_valid(redriver->orientation_gpio)) + return -EINVAL; + + return gpio_get_value(redriver->orientation_gpio); +} +EXPORT_SYMBOL(redriver_orientation_get); + static int ssusb_redriver_ucsi_notifier(struct notifier_block *nb, unsigned long action, void *data) { diff --git a/include/linux/usb/redriver.h b/include/linux/usb/redriver.h index 2ad09e9a4d57..0ad48a87a725 100644 --- a/include/linux/usb/redriver.h +++ b/include/linux/usb/redriver.h @@ -12,6 +12,7 @@ int redriver_release_usb_lanes(struct device_node *node); int redriver_gadget_pullup(struct device_node *node, int is_on); int redriver_notify_connect(struct device_node *node); int redriver_notify_disconnect(struct device_node *node); +int redriver_orientation_get(struct device_node *node); #else @@ -35,6 +36,11 @@ static inline int redriver_notify_disconnect(struct device_node *node) return 0; } +static inline int redriver_orientation_get(struct device_node *node) +{ + return -ENODEV; +} + #endif #endif /*__LINUX_USB_REDRIVER_H */