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
|
// 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/device.h>
|
||||||
#include <linux/err.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);
|
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
|
* usb_add_repeater_dev - Add repeater device
|
||||||
* @r: repeater device available
|
* @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);
|
const char *phandle, u8 index);
|
||||||
struct usb_repeater *devm_usb_get_repeater_by_node(struct device *dev,
|
struct usb_repeater *devm_usb_get_repeater_by_node(struct device *dev,
|
||||||
struct device_node *node);
|
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);
|
void usb_put_repeater(struct usb_repeater *r);
|
||||||
int usb_add_repeater_dev(struct usb_repeater *r);
|
int usb_add_repeater_dev(struct usb_repeater *r);
|
||||||
void usb_remove_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)
|
struct device *dev, struct device_node *node)
|
||||||
{ return ERR_PTR(-ENXIO); }
|
{ 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)
|
static inline void usb_put_repeater(struct usb_repeater *r)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user