On 08/29/2012 10:11 PM, Marc Kleine-Budde wrote: [...] >>>>>> +struct usb_phy *devm_usb_get_phy_by_phandle(struct device *dev, >>>>>> + const char *phandle) >>>> >>>>> Since it's already a common function, we may give phandler property >>>>> a common name too. So we will not need phandle argument. >>>>> Please also don't forget to document the devm_xxx and dt binding. >>>> >>>> I don't think this is a good idea. If we hardcode the phandle name, we >>>> introduce a limit of one phy per usb device. The usb3 controllers >>>> alreadyt use two phys (one for usb2, the othere for usb3) for one >>>> controller. So I think we should not make the same mistake again. >> That only means current binding is not good enough. Rather not, means >> it should not be in common code. >> Maybe something like: >> usbport0-phys = <&phy0>; >> usbport1-phys = <&phy1 &phy2>; /* usb2 & usb3 */ > > Granted. Do we need strings that describe the phys, like in pinctrl or > is a index enough? What about this? > > struct usb_phy *devm_usb_get_phy_by_phandle(struct device *dev, > int index) >
Comments? The phandle_name string will be "usbphy".
>>>>>> +{
>>>>>> + struct usb_phy *phy = NULL, **ptr;
>>>>>> + unsigned long flags;
>>>>>> + struct device_node *node;
>>>>>> +
>>>>>> + 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, 0);
>>>>>> + if (!node) {
>>>>>> + dev_dbg(dev, "failed to get %s phandle in %s node\n",
>>>>>> phandle,
>>>>>> + dev->of_node->full_name);
>>>>>> + return ERR_PTR(-ENODEV);
>>>>>> + }
>>>>>> +
>>>>>> + ptr = devres_alloc(devm_usb_phy_release, sizeof(*ptr), GFP_KERNEL);
>>>>>> + if (!ptr) {
>>>>>> + dev_dbg(dev, "failed to allocate memory for devres\n");
>>>>>> + return ERR_PTR(-ENOMEM);
>>>>>> + }
>>>>>> +
>>>>>> + spin_lock_irqsave(&phy_lock, flags);
>>>>>> +
>>>>>> + phy = __of_usb_find_phy(&phy_list, node);
>>>>>> + if (IS_ERR(phy) || !try_module_get(phy->dev->driver->owner)) {
>>>>>> + phy = ERR_PTR(-EPROBE_DEFER);
>>>>>> + devres_free(ptr);
>>>>>> + goto err0;
>>>>>> + }
>>>>>> +
>>>>>> + *ptr = phy;
>>>>>> + devres_add(dev, ptr);
>>>>>> +
>>>>>> + get_device(phy->dev);
>>>>>> +
>>>>>> +err0:
>>>>>> + spin_unlock_irqrestore(&phy_lock, flags);
>>>>>> +
>>>>>> + return phy;
>>>>>> +}
>>>>>> +EXPORT_SYMBOL(devm_usb_get_phy_by_phandle);
>>>>>> +
>>>>>> +/**
>>>>>> * devm_usb_put_phy - release the USB PHY
>>>>>> * @dev - device that wants to release this phy
>>>>>> * @phy - the phy returned by devm_usb_get_phy()
>>>>>> @@ -158,32 +234,24 @@ EXPORT_SYMBOL(usb_put_phy);
>>>>>> */
>>>>>> int usb_add_phy(struct usb_phy *x, enum usb_phy_type type)
>>>>>> {
>>>>>> - int ret = 0;
>>>>>> unsigned long flags;
>>>>>> struct usb_phy *phy;
>>>>>>
>>>>>> - if (x && x->type != USB_PHY_TYPE_UNDEFINED) {
>>>>>> - dev_err(x->dev, "not accepting initialized PHY %s\n",
>>>>>> x->label);
>>>>>> - return -EINVAL;
>>>
>>> how about having
>>> if (x && !x->dev.of_node && x->type != USB_PHY_TYPE_UNDEFINED) {
>>> dev_err(x->dev, "not accepting initialized PHY %s\n", x->label);
>>> return -EINVAL;
>>> }
>>>
>>> By using this we'll return error if the phy device does not have an
>>> of_node. (So it can't get back the phy by phandle).
>> Maybe it worth to create a new set functions. When using DT, the way to
>> add and get phy is totally different.
>
> Getting already will be (get_by_phandle). Do we need a seperate List for
> DT and non DT phys? usb_add_of_phy()? usb_add_dt_phy()?
comments?
Marc
--
Pengutronix e.K. | Marc Kleine-Budde |
Industrial Linux Solutions | Phone: +49-231-2826-924 |
Vertretung West/Dortmund | Fax: +49-5121-206917-5555 |
Amtsgericht Hildesheim, HRA 2686 | http://www.pengutronix.de |
signature.asc
Description: OpenPGP digital signature
