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