root/drivers/usb/phy/phy.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. __usb_find_phy
  2. __of_usb_find_phy
  3. usb_phy_set_default_current
  4. usb_phy_notify_charger_work
  5. __usb_phy_get_charger_type
  6. usb_phy_get_charger_type
  7. usb_phy_set_charger_current
  8. usb_phy_get_charger_current
  9. usb_phy_set_charger_state
  10. devm_usb_phy_release
  11. devm_usb_phy_release2
  12. devm_usb_phy_match
  13. usb_charger_init
  14. usb_add_extcon
  15. devm_usb_get_phy
  16. usb_get_phy
  17. devm_usb_get_phy_by_node
  18. devm_usb_get_phy_by_phandle
  19. devm_usb_put_phy
  20. usb_put_phy
  21. usb_add_phy
  22. usb_add_phy_dev
  23. usb_remove_phy
  24. usb_phy_set_event

   1 // SPDX-License-Identifier: GPL-2.0+
   2 /*
   3  * phy.c -- USB phy handling
   4  *
   5  * Copyright (C) 2004-2013 Texas Instruments
   6  */
   7 #include <linux/kernel.h>
   8 #include <linux/export.h>
   9 #include <linux/err.h>
  10 #include <linux/device.h>
  11 #include <linux/module.h>
  12 #include <linux/slab.h>
  13 #include <linux/of.h>
  14 
  15 #include <linux/usb/phy.h>
  16 
  17 /* Default current range by charger type. */
  18 #define DEFAULT_SDP_CUR_MIN     2
  19 #define DEFAULT_SDP_CUR_MAX     500
  20 #define DEFAULT_SDP_CUR_MIN_SS  150
  21 #define DEFAULT_SDP_CUR_MAX_SS  900
  22 #define DEFAULT_DCP_CUR_MIN     500
  23 #define DEFAULT_DCP_CUR_MAX     5000
  24 #define DEFAULT_CDP_CUR_MIN     1500
  25 #define DEFAULT_CDP_CUR_MAX     5000
  26 #define DEFAULT_ACA_CUR_MIN     1500
  27 #define DEFAULT_ACA_CUR_MAX     5000
  28 
  29 static LIST_HEAD(phy_list);
  30 static DEFINE_SPINLOCK(phy_lock);
  31 
  32 struct phy_devm {
  33         struct usb_phy *phy;
  34         struct notifier_block *nb;
  35 };
  36 
  37 static struct usb_phy *__usb_find_phy(struct list_head *list,
  38         enum usb_phy_type type)
  39 {
  40         struct usb_phy  *phy = NULL;
  41 
  42         list_for_each_entry(phy, list, head) {
  43                 if (phy->type != type)
  44                         continue;
  45 
  46                 return phy;
  47         }
  48 
  49         return ERR_PTR(-ENODEV);
  50 }
  51 
  52 static struct usb_phy *__of_usb_find_phy(struct device_node *node)
  53 {
  54         struct usb_phy  *phy;
  55 
  56         if (!of_device_is_available(node))
  57                 return ERR_PTR(-ENODEV);
  58 
  59         list_for_each_entry(phy, &phy_list, head) {
  60                 if (node != phy->dev->of_node)
  61                         continue;
  62 
  63                 return phy;
  64         }
  65 
  66         return ERR_PTR(-EPROBE_DEFER);
  67 }
  68 
  69 static void usb_phy_set_default_current(struct usb_phy *usb_phy)
  70 {
  71         usb_phy->chg_cur.sdp_min = DEFAULT_SDP_CUR_MIN;
  72         usb_phy->chg_cur.sdp_max = DEFAULT_SDP_CUR_MAX;
  73         usb_phy->chg_cur.dcp_min = DEFAULT_DCP_CUR_MIN;
  74         usb_phy->chg_cur.dcp_max = DEFAULT_DCP_CUR_MAX;
  75         usb_phy->chg_cur.cdp_min = DEFAULT_CDP_CUR_MIN;
  76         usb_phy->chg_cur.cdp_max = DEFAULT_CDP_CUR_MAX;
  77         usb_phy->chg_cur.aca_min = DEFAULT_ACA_CUR_MIN;
  78         usb_phy->chg_cur.aca_max = DEFAULT_ACA_CUR_MAX;
  79 }
  80 
  81 /**
  82  * usb_phy_notify_charger_work - notify the USB charger state
  83  * @work - the charger work to notify the USB charger state
  84  *
  85  * This work can be issued when USB charger state has been changed or
  86  * USB charger current has been changed, then we can notify the current
  87  * what can be drawn to power user and the charger state to userspace.
  88  *
  89  * If we get the charger type from extcon subsystem, we can notify the
  90  * charger state to power user automatically by usb_phy_get_charger_type()
  91  * issuing from extcon subsystem.
  92  *
  93  * If we get the charger type from ->charger_detect() instead of extcon
  94  * subsystem, the usb phy driver should issue usb_phy_set_charger_state()
  95  * to set charger state when the charger state has been changed.
  96  */
  97 static void usb_phy_notify_charger_work(struct work_struct *work)
  98 {
  99         struct usb_phy *usb_phy = container_of(work, struct usb_phy, chg_work);
 100         char uchger_state[50] = { 0 };
 101         char *envp[] = { uchger_state, NULL };
 102         unsigned int min, max;
 103 
 104         switch (usb_phy->chg_state) {
 105         case USB_CHARGER_PRESENT:
 106                 usb_phy_get_charger_current(usb_phy, &min, &max);
 107 
 108                 atomic_notifier_call_chain(&usb_phy->notifier, max, usb_phy);
 109                 snprintf(uchger_state, ARRAY_SIZE(uchger_state),
 110                          "USB_CHARGER_STATE=%s", "USB_CHARGER_PRESENT");
 111                 break;
 112         case USB_CHARGER_ABSENT:
 113                 usb_phy_set_default_current(usb_phy);
 114 
 115                 atomic_notifier_call_chain(&usb_phy->notifier, 0, usb_phy);
 116                 snprintf(uchger_state, ARRAY_SIZE(uchger_state),
 117                          "USB_CHARGER_STATE=%s", "USB_CHARGER_ABSENT");
 118                 break;
 119         default:
 120                 dev_warn(usb_phy->dev, "Unknown USB charger state: %d\n",
 121                          usb_phy->chg_state);
 122                 return;
 123         }
 124 
 125         kobject_uevent_env(&usb_phy->dev->kobj, KOBJ_CHANGE, envp);
 126 }
 127 
 128 static void __usb_phy_get_charger_type(struct usb_phy *usb_phy)
 129 {
 130         if (extcon_get_state(usb_phy->edev, EXTCON_CHG_USB_SDP) > 0) {
 131                 usb_phy->chg_type = SDP_TYPE;
 132                 usb_phy->chg_state = USB_CHARGER_PRESENT;
 133         } else if (extcon_get_state(usb_phy->edev, EXTCON_CHG_USB_CDP) > 0) {
 134                 usb_phy->chg_type = CDP_TYPE;
 135                 usb_phy->chg_state = USB_CHARGER_PRESENT;
 136         } else if (extcon_get_state(usb_phy->edev, EXTCON_CHG_USB_DCP) > 0) {
 137                 usb_phy->chg_type = DCP_TYPE;
 138                 usb_phy->chg_state = USB_CHARGER_PRESENT;
 139         } else if (extcon_get_state(usb_phy->edev, EXTCON_CHG_USB_ACA) > 0) {
 140                 usb_phy->chg_type = ACA_TYPE;
 141                 usb_phy->chg_state = USB_CHARGER_PRESENT;
 142         } else {
 143                 usb_phy->chg_type = UNKNOWN_TYPE;
 144                 usb_phy->chg_state = USB_CHARGER_ABSENT;
 145         }
 146 
 147         schedule_work(&usb_phy->chg_work);
 148 }
 149 
 150 /**
 151  * usb_phy_get_charger_type - get charger type from extcon subsystem
 152  * @nb -the notifier block to determine charger type
 153  * @state - the cable state
 154  * @data - private data
 155  *
 156  * Determin the charger type from extcon subsystem which also means the
 157  * charger state has been chaned, then we should notify this event.
 158  */
 159 static int usb_phy_get_charger_type(struct notifier_block *nb,
 160                                     unsigned long state, void *data)
 161 {
 162         struct usb_phy *usb_phy = container_of(nb, struct usb_phy, type_nb);
 163 
 164         __usb_phy_get_charger_type(usb_phy);
 165         return NOTIFY_OK;
 166 }
 167 
 168 /**
 169  * usb_phy_set_charger_current - set the USB charger current
 170  * @usb_phy - the USB phy to be used
 171  * @mA - the current need to be set
 172  *
 173  * Usually we only change the charger default current when USB finished the
 174  * enumeration as one SDP charger. As one SDP charger, usb_phy_set_power()
 175  * will issue this function to change charger current when after setting USB
 176  * configuration, or suspend/resume USB. For other type charger, we should
 177  * use the default charger current and we do not suggest to issue this function
 178  * to change the charger current.
 179  *
 180  * When USB charger current has been changed, we need to notify the power users.
 181  */
 182 void usb_phy_set_charger_current(struct usb_phy *usb_phy, unsigned int mA)
 183 {
 184         switch (usb_phy->chg_type) {
 185         case SDP_TYPE:
 186                 if (usb_phy->chg_cur.sdp_max == mA)
 187                         return;
 188 
 189                 usb_phy->chg_cur.sdp_max = (mA > DEFAULT_SDP_CUR_MAX_SS) ?
 190                         DEFAULT_SDP_CUR_MAX_SS : mA;
 191                 break;
 192         case DCP_TYPE:
 193                 if (usb_phy->chg_cur.dcp_max == mA)
 194                         return;
 195 
 196                 usb_phy->chg_cur.dcp_max = (mA > DEFAULT_DCP_CUR_MAX) ?
 197                         DEFAULT_DCP_CUR_MAX : mA;
 198                 break;
 199         case CDP_TYPE:
 200                 if (usb_phy->chg_cur.cdp_max == mA)
 201                         return;
 202 
 203                 usb_phy->chg_cur.cdp_max = (mA > DEFAULT_CDP_CUR_MAX) ?
 204                         DEFAULT_CDP_CUR_MAX : mA;
 205                 break;
 206         case ACA_TYPE:
 207                 if (usb_phy->chg_cur.aca_max == mA)
 208                         return;
 209 
 210                 usb_phy->chg_cur.aca_max = (mA > DEFAULT_ACA_CUR_MAX) ?
 211                         DEFAULT_ACA_CUR_MAX : mA;
 212                 break;
 213         default:
 214                 return;
 215         }
 216 
 217         schedule_work(&usb_phy->chg_work);
 218 }
 219 EXPORT_SYMBOL_GPL(usb_phy_set_charger_current);
 220 
 221 /**
 222  * usb_phy_get_charger_current - get the USB charger current
 223  * @usb_phy - the USB phy to be used
 224  * @min - the minimum current
 225  * @max - the maximum current
 226  *
 227  * Usually we will notify the maximum current to power user, but for some
 228  * special case, power user also need the minimum current value. Then the
 229  * power user can issue this function to get the suitable current.
 230  */
 231 void usb_phy_get_charger_current(struct usb_phy *usb_phy,
 232                                  unsigned int *min, unsigned int *max)
 233 {
 234         switch (usb_phy->chg_type) {
 235         case SDP_TYPE:
 236                 *min = usb_phy->chg_cur.sdp_min;
 237                 *max = usb_phy->chg_cur.sdp_max;
 238                 break;
 239         case DCP_TYPE:
 240                 *min = usb_phy->chg_cur.dcp_min;
 241                 *max = usb_phy->chg_cur.dcp_max;
 242                 break;
 243         case CDP_TYPE:
 244                 *min = usb_phy->chg_cur.cdp_min;
 245                 *max = usb_phy->chg_cur.cdp_max;
 246                 break;
 247         case ACA_TYPE:
 248                 *min = usb_phy->chg_cur.aca_min;
 249                 *max = usb_phy->chg_cur.aca_max;
 250                 break;
 251         default:
 252                 *min = 0;
 253                 *max = 0;
 254                 break;
 255         }
 256 }
 257 EXPORT_SYMBOL_GPL(usb_phy_get_charger_current);
 258 
 259 /**
 260  * usb_phy_set_charger_state - set the USB charger state
 261  * @usb_phy - the USB phy to be used
 262  * @state - the new state need to be set for charger
 263  *
 264  * The usb phy driver can issue this function when the usb phy driver
 265  * detected the charger state has been changed, in this case the charger
 266  * type should be get from ->charger_detect().
 267  */
 268 void usb_phy_set_charger_state(struct usb_phy *usb_phy,
 269                                enum usb_charger_state state)
 270 {
 271         if (usb_phy->chg_state == state || !usb_phy->charger_detect)
 272                 return;
 273 
 274         usb_phy->chg_state = state;
 275         if (usb_phy->chg_state == USB_CHARGER_PRESENT)
 276                 usb_phy->chg_type = usb_phy->charger_detect(usb_phy);
 277         else
 278                 usb_phy->chg_type = UNKNOWN_TYPE;
 279 
 280         schedule_work(&usb_phy->chg_work);
 281 }
 282 EXPORT_SYMBOL_GPL(usb_phy_set_charger_state);
 283 
 284 static void devm_usb_phy_release(struct device *dev, void *res)
 285 {
 286         struct usb_phy *phy = *(struct usb_phy **)res;
 287 
 288         usb_put_phy(phy);
 289 }
 290 
 291 static void devm_usb_phy_release2(struct device *dev, void *_res)
 292 {
 293         struct phy_devm *res = _res;
 294 
 295         if (res->nb)
 296                 usb_unregister_notifier(res->phy, res->nb);
 297         usb_put_phy(res->phy);
 298 }
 299 
 300 static int devm_usb_phy_match(struct device *dev, void *res, void *match_data)
 301 {
 302         struct usb_phy **phy = res;
 303 
 304         return *phy == match_data;
 305 }
 306 
 307 static void usb_charger_init(struct usb_phy *usb_phy)
 308 {
 309         usb_phy->chg_type = UNKNOWN_TYPE;
 310         usb_phy->chg_state = USB_CHARGER_DEFAULT;
 311         usb_phy_set_default_current(usb_phy);
 312         INIT_WORK(&usb_phy->chg_work, usb_phy_notify_charger_work);
 313 }
 314 
 315 static int usb_add_extcon(struct usb_phy *x)
 316 {
 317         int ret;
 318 
 319         if (of_property_read_bool(x->dev->of_node, "extcon")) {
 320                 x->edev = extcon_get_edev_by_phandle(x->dev, 0);
 321                 if (IS_ERR(x->edev))
 322                         return PTR_ERR(x->edev);
 323 
 324                 x->id_edev = extcon_get_edev_by_phandle(x->dev, 1);
 325                 if (IS_ERR(x->id_edev)) {
 326                         x->id_edev = NULL;
 327                         dev_info(x->dev, "No separate ID extcon device\n");
 328                 }
 329 
 330                 if (x->vbus_nb.notifier_call) {
 331                         ret = devm_extcon_register_notifier(x->dev, x->edev,
 332                                                             EXTCON_USB,
 333                                                             &x->vbus_nb);
 334                         if (ret < 0) {
 335                                 dev_err(x->dev,
 336                                         "register VBUS notifier failed\n");
 337                                 return ret;
 338                         }
 339                 } else {
 340                         x->type_nb.notifier_call = usb_phy_get_charger_type;
 341 
 342                         ret = devm_extcon_register_notifier(x->dev, x->edev,
 343                                                             EXTCON_CHG_USB_SDP,
 344                                                             &x->type_nb);
 345                         if (ret) {
 346                                 dev_err(x->dev,
 347                                         "register extcon USB SDP failed.\n");
 348                                 return ret;
 349                         }
 350 
 351                         ret = devm_extcon_register_notifier(x->dev, x->edev,
 352                                                             EXTCON_CHG_USB_CDP,
 353                                                             &x->type_nb);
 354                         if (ret) {
 355                                 dev_err(x->dev,
 356                                         "register extcon USB CDP failed.\n");
 357                                 return ret;
 358                         }
 359 
 360                         ret = devm_extcon_register_notifier(x->dev, x->edev,
 361                                                             EXTCON_CHG_USB_DCP,
 362                                                             &x->type_nb);
 363                         if (ret) {
 364                                 dev_err(x->dev,
 365                                         "register extcon USB DCP failed.\n");
 366                                 return ret;
 367                         }
 368 
 369                         ret = devm_extcon_register_notifier(x->dev, x->edev,
 370                                                             EXTCON_CHG_USB_ACA,
 371                                                             &x->type_nb);
 372                         if (ret) {
 373                                 dev_err(x->dev,
 374                                         "register extcon USB ACA failed.\n");
 375                                 return ret;
 376                         }
 377                 }
 378 
 379                 if (x->id_nb.notifier_call) {
 380                         struct extcon_dev *id_ext;
 381 
 382                         if (x->id_edev)
 383                                 id_ext = x->id_edev;
 384                         else
 385                                 id_ext = x->edev;
 386 
 387                         ret = devm_extcon_register_notifier(x->dev, id_ext,
 388                                                             EXTCON_USB_HOST,
 389                                                             &x->id_nb);
 390                         if (ret < 0) {
 391                                 dev_err(x->dev,
 392                                         "register ID notifier failed\n");
 393                                 return ret;
 394                         }
 395                 }
 396         }
 397 
 398         if (x->type_nb.notifier_call)
 399                 __usb_phy_get_charger_type(x);
 400 
 401         return 0;
 402 }
 403 
 404 /**
 405  * devm_usb_get_phy - find the USB PHY
 406  * @dev - device that requests this phy
 407  * @type - the type of the phy the controller requires
 408  *
 409  * Gets the phy using usb_get_phy(), and associates a device with it using
 410  * devres. On driver detach, release function is invoked on the devres data,
 411  * then, devres data is freed.
 412  *
 413  * For use by USB host and peripheral drivers.
 414  */
 415 struct usb_phy *devm_usb_get_phy(struct device *dev, enum usb_phy_type type)
 416 {
 417         struct usb_phy **ptr, *phy;
 418 
 419         ptr = devres_alloc(devm_usb_phy_release, sizeof(*ptr), GFP_KERNEL);
 420         if (!ptr)
 421                 return ERR_PTR(-ENOMEM);
 422 
 423         phy = usb_get_phy(type);
 424         if (!IS_ERR(phy)) {
 425                 *ptr = phy;
 426                 devres_add(dev, ptr);
 427         } else
 428                 devres_free(ptr);
 429 
 430         return phy;
 431 }
 432 EXPORT_SYMBOL_GPL(devm_usb_get_phy);
 433 
 434 /**
 435  * usb_get_phy - find the USB PHY
 436  * @type - the type of the phy the controller requires
 437  *
 438  * Returns the phy driver, after getting a refcount to it; or
 439  * -ENODEV if there is no such phy.  The caller is responsible for
 440  * calling usb_put_phy() to release that count.
 441  *
 442  * For use by USB host and peripheral drivers.
 443  */
 444 struct usb_phy *usb_get_phy(enum usb_phy_type type)
 445 {
 446         struct usb_phy  *phy = NULL;
 447         unsigned long   flags;
 448 
 449         spin_lock_irqsave(&phy_lock, flags);
 450 
 451         phy = __usb_find_phy(&phy_list, type);
 452         if (IS_ERR(phy) || !try_module_get(phy->dev->driver->owner)) {
 453                 pr_debug("PHY: unable to find transceiver of type %s\n",
 454                         usb_phy_type_string(type));
 455                 if (!IS_ERR(phy))
 456                         phy = ERR_PTR(-ENODEV);
 457 
 458                 goto err0;
 459         }
 460 
 461         get_device(phy->dev);
 462 
 463 err0:
 464         spin_unlock_irqrestore(&phy_lock, flags);
 465 
 466         return phy;
 467 }
 468 EXPORT_SYMBOL_GPL(usb_get_phy);
 469 
 470 /**
 471  * devm_usb_get_phy_by_node - find the USB PHY by device_node
 472  * @dev - device that requests this phy
 473  * @node - the device_node for the phy device.
 474  * @nb - a notifier_block to register with the phy.
 475  *
 476  * Returns the phy driver associated with the given device_node,
 477  * after getting a refcount to it, -ENODEV if there is no such phy or
 478  * -EPROBE_DEFER if the device is not yet loaded. While at that, it
 479  * also associates the device with
 480  * the phy using devres. On driver detach, release function is invoked
 481  * on the devres data, then, devres data is freed.
 482  *
 483  * For use by peripheral drivers for devices related to a phy,
 484  * such as a charger.
 485  */
 486 struct  usb_phy *devm_usb_get_phy_by_node(struct device *dev,
 487                                           struct device_node *node,
 488                                           struct notifier_block *nb)
 489 {
 490         struct usb_phy  *phy = ERR_PTR(-ENOMEM);
 491         struct phy_devm *ptr;
 492         unsigned long   flags;
 493 
 494         ptr = devres_alloc(devm_usb_phy_release2, sizeof(*ptr), GFP_KERNEL);
 495         if (!ptr) {
 496                 dev_dbg(dev, "failed to allocate memory for devres\n");
 497                 goto err0;
 498         }
 499 
 500         spin_lock_irqsave(&phy_lock, flags);
 501 
 502         phy = __of_usb_find_phy(node);
 503         if (IS_ERR(phy)) {
 504                 devres_free(ptr);
 505                 goto err1;
 506         }
 507 
 508         if (!try_module_get(phy->dev->driver->owner)) {
 509                 phy = ERR_PTR(-ENODEV);
 510                 devres_free(ptr);
 511                 goto err1;
 512         }
 513         if (nb)
 514                 usb_register_notifier(phy, nb);
 515         ptr->phy = phy;
 516         ptr->nb = nb;
 517         devres_add(dev, ptr);
 518 
 519         get_device(phy->dev);
 520 
 521 err1:
 522         spin_unlock_irqrestore(&phy_lock, flags);
 523 
 524 err0:
 525 
 526         return phy;
 527 }
 528 EXPORT_SYMBOL_GPL(devm_usb_get_phy_by_node);
 529 
 530 /**
 531  * devm_usb_get_phy_by_phandle - find the USB PHY by phandle
 532  * @dev - device that requests this phy
 533  * @phandle - name of the property holding the phy phandle value
 534  * @index - the index of the phy
 535  *
 536  * Returns the phy driver associated with the given phandle value,
 537  * after getting a refcount to it, -ENODEV if there is no such phy or
 538  * -EPROBE_DEFER if there is a phandle to the phy, but the device is
 539  * not yet loaded. While at that, it also associates the device with
 540  * the phy using devres. On driver detach, release function is invoked
 541  * on the devres data, then, devres data is freed.
 542  *
 543  * For use by USB host and peripheral drivers.
 544  */
 545 struct usb_phy *devm_usb_get_phy_by_phandle(struct device *dev,
 546         const char *phandle, u8 index)
 547 {
 548         struct device_node *node;
 549         struct usb_phy  *phy;
 550 
 551         if (!dev->of_node) {
 552                 dev_dbg(dev, "device does not have a device node entry\n");
 553                 return ERR_PTR(-EINVAL);
 554         }
 555 
 556         node = of_parse_phandle(dev->of_node, phandle, index);
 557         if (!node) {
 558                 dev_dbg(dev, "failed to get %s phandle in %pOF node\n", phandle,
 559                         dev->of_node);
 560                 return ERR_PTR(-ENODEV);
 561         }
 562         phy = devm_usb_get_phy_by_node(dev, node, NULL);
 563         of_node_put(node);
 564         return phy;
 565 }
 566 EXPORT_SYMBOL_GPL(devm_usb_get_phy_by_phandle);
 567 
 568 /**
 569  * devm_usb_put_phy - release the USB PHY
 570  * @dev - device that wants to release this phy
 571  * @phy - the phy returned by devm_usb_get_phy()
 572  *
 573  * destroys the devres associated with this phy and invokes usb_put_phy
 574  * to release the phy.
 575  *
 576  * For use by USB host and peripheral drivers.
 577  */
 578 void devm_usb_put_phy(struct device *dev, struct usb_phy *phy)
 579 {
 580         int r;
 581 
 582         r = devres_destroy(dev, devm_usb_phy_release, devm_usb_phy_match, phy);
 583         dev_WARN_ONCE(dev, r, "couldn't find PHY resource\n");
 584 }
 585 EXPORT_SYMBOL_GPL(devm_usb_put_phy);
 586 
 587 /**
 588  * usb_put_phy - release the USB PHY
 589  * @x: the phy returned by usb_get_phy()
 590  *
 591  * Releases a refcount the caller received from usb_get_phy().
 592  *
 593  * For use by USB host and peripheral drivers.
 594  */
 595 void usb_put_phy(struct usb_phy *x)
 596 {
 597         if (x) {
 598                 struct module *owner = x->dev->driver->owner;
 599 
 600                 put_device(x->dev);
 601                 module_put(owner);
 602         }
 603 }
 604 EXPORT_SYMBOL_GPL(usb_put_phy);
 605 
 606 /**
 607  * usb_add_phy - declare the USB PHY
 608  * @x: the USB phy to be used; or NULL
 609  * @type - the type of this PHY
 610  *
 611  * This call is exclusively for use by phy drivers, which
 612  * coordinate the activities of drivers for host and peripheral
 613  * controllers, and in some cases for VBUS current regulation.
 614  */
 615 int usb_add_phy(struct usb_phy *x, enum usb_phy_type type)
 616 {
 617         int             ret = 0;
 618         unsigned long   flags;
 619         struct usb_phy  *phy;
 620 
 621         if (x->type != USB_PHY_TYPE_UNDEFINED) {
 622                 dev_err(x->dev, "not accepting initialized PHY %s\n", x->label);
 623                 return -EINVAL;
 624         }
 625 
 626         usb_charger_init(x);
 627         ret = usb_add_extcon(x);
 628         if (ret)
 629                 return ret;
 630 
 631         ATOMIC_INIT_NOTIFIER_HEAD(&x->notifier);
 632 
 633         spin_lock_irqsave(&phy_lock, flags);
 634 
 635         list_for_each_entry(phy, &phy_list, head) {
 636                 if (phy->type == type) {
 637                         ret = -EBUSY;
 638                         dev_err(x->dev, "transceiver type %s already exists\n",
 639                                                 usb_phy_type_string(type));
 640                         goto out;
 641                 }
 642         }
 643 
 644         x->type = type;
 645         list_add_tail(&x->head, &phy_list);
 646 
 647 out:
 648         spin_unlock_irqrestore(&phy_lock, flags);
 649         return ret;
 650 }
 651 EXPORT_SYMBOL_GPL(usb_add_phy);
 652 
 653 /**
 654  * usb_add_phy_dev - declare the USB PHY
 655  * @x: the USB phy to be used; or NULL
 656  *
 657  * This call is exclusively for use by phy drivers, which
 658  * coordinate the activities of drivers for host and peripheral
 659  * controllers, and in some cases for VBUS current regulation.
 660  */
 661 int usb_add_phy_dev(struct usb_phy *x)
 662 {
 663         unsigned long flags;
 664         int ret;
 665 
 666         if (!x->dev) {
 667                 dev_err(x->dev, "no device provided for PHY\n");
 668                 return -EINVAL;
 669         }
 670 
 671         usb_charger_init(x);
 672         ret = usb_add_extcon(x);
 673         if (ret)
 674                 return ret;
 675 
 676         ATOMIC_INIT_NOTIFIER_HEAD(&x->notifier);
 677 
 678         spin_lock_irqsave(&phy_lock, flags);
 679         list_add_tail(&x->head, &phy_list);
 680         spin_unlock_irqrestore(&phy_lock, flags);
 681 
 682         return 0;
 683 }
 684 EXPORT_SYMBOL_GPL(usb_add_phy_dev);
 685 
 686 /**
 687  * usb_remove_phy - remove the OTG PHY
 688  * @x: the USB OTG PHY to be removed;
 689  *
 690  * This reverts the effects of usb_add_phy
 691  */
 692 void usb_remove_phy(struct usb_phy *x)
 693 {
 694         unsigned long   flags;
 695 
 696         spin_lock_irqsave(&phy_lock, flags);
 697         if (x)
 698                 list_del(&x->head);
 699         spin_unlock_irqrestore(&phy_lock, flags);
 700 }
 701 EXPORT_SYMBOL_GPL(usb_remove_phy);
 702 
 703 /**
 704  * usb_phy_set_event - set event to phy event
 705  * @x: the phy returned by usb_get_phy();
 706  *
 707  * This sets event to phy event
 708  */
 709 void usb_phy_set_event(struct usb_phy *x, unsigned long event)
 710 {
 711         x->last_event = event;
 712 }
 713 EXPORT_SYMBOL_GPL(usb_phy_set_event);

/* [<][>][^][v][top][bottom][index][help] */