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