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:
@ -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
|
||||
|
@ -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)
|
||||
{ }
|
||||
|
||||
|
Reference in New Issue
Block a user