usb: repeater: Add non-devm variants for repeater get APIs

Some USB repeater clients may not require a devm resource vote when
referencing the USB repeater.  An example is when DWC3 MSM fetches for the
repeater version in order to determine if a PHY soft reset is required or
not.  Since DWC3 MSM only utilizes the repeater only for this check, it can
handle balancing the resource counters.

Change-Id: Ied42023a9b525a0a541a582363cd9c86c3c22754
Signed-off-by: Wesley Cheng <quic_wcheng@quicinc.com>
This commit is contained in:
Wesley Cheng
2023-06-26 16:48:23 -07:00
parent 58829ac03c
commit 29899addac
2 changed files with 49 additions and 1 deletions

View File

@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (c) 2021-2022, Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2021-2023, Qualcomm Innovation Center, Inc. All rights reserved.
*/
#include <linux/device.h>
#include <linux/err.h>
@ -103,6 +103,43 @@ struct usb_repeater *devm_usb_get_repeater_by_phandle(struct device *dev,
}
EXPORT_SYMBOL(devm_usb_get_repeater_by_phandle);
struct usb_repeater *usb_get_repeater_by_node(struct device_node *node)
{
struct usb_repeater *r = ERR_PTR(-ENODEV);
unsigned long flags;
spin_lock_irqsave(&repeater_lock, flags);
r = of_usb_find_repeater(node);
spin_unlock_irqrestore(&repeater_lock, flags);
return r;
}
EXPORT_SYMBOL(usb_get_repeater_by_node);
struct usb_repeater *usb_get_repeater_by_phandle(struct device *dev,
const char *phandle, u8 index)
{
struct device_node *node;
struct usb_repeater *r;
if (!dev->of_node) {
dev_dbg(dev, "device does not have a device node entry\n");
return ERR_PTR(-EINVAL);
}
node = of_parse_phandle(dev->of_node, phandle, index);
if (!node) {
dev_dbg(dev, "failed to get %s phandle in %pOF node\n", phandle,
dev->of_node);
return ERR_PTR(-ENODEV);
}
r = usb_get_repeater_by_node(node);
of_node_put(node);
return r;
}
EXPORT_SYMBOL(usb_get_repeater_by_phandle);
/**
* usb_add_repeater_dev - Add repeater device
* @r: repeater device available

View File

@ -28,6 +28,9 @@ struct usb_repeater *devm_usb_get_repeater_by_phandle(struct device *dev,
const char *phandle, u8 index);
struct usb_repeater *devm_usb_get_repeater_by_node(struct device *dev,
struct device_node *node);
struct usb_repeater *usb_get_repeater_by_phandle(struct device *dev,
const char *phandle, u8 index);
struct usb_repeater *usb_get_repeater_by_node(struct device_node *node);
void usb_put_repeater(struct usb_repeater *r);
int usb_add_repeater_dev(struct usb_repeater *r);
void usb_remove_repeater_dev(struct usb_repeater *r);
@ -40,6 +43,14 @@ static inline struct usb_repeater *devm_usb_get_repeater_by_node(
struct device *dev, struct device_node *node)
{ return ERR_PTR(-ENXIO); }
static inline struct usb_repeater *usb_get_repeater_by_phandle(
struct device *d, const char *phandle, u8 index)
{ return ERR_PTR(-ENXIO); }
static inline struct usb_repeater *usb_get_repeater_by_node(
struct device_node *node)
{ return ERR_PTR(-ENXIO); }
static inline void usb_put_repeater(struct usb_repeater *r)
{ }