1/*
2 * phy-core.c  --  Generic Phy framework.
3 *
4 * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com
5 *
6 * Author: Kishon Vijay Abraham I <kishon@ti.com>
7 *
8 * This program is free software; you can redistribute  it and/or modify it
9 * under  the terms of  the GNU General  Public License as published by the
10 * Free Software Foundation;  either version 2 of the  License, or (at your
11 * option) any later version.
12 */
13
14#include <linux/kernel.h>
15#include <linux/export.h>
16#include <linux/module.h>
17#include <linux/err.h>
18#include <linux/device.h>
19#include <linux/slab.h>
20#include <linux/of.h>
21#include <linux/phy/phy.h>
22#include <linux/idr.h>
23#include <linux/pm_runtime.h>
24#include <linux/regulator/consumer.h>
25
26static struct class *phy_class;
27static DEFINE_MUTEX(phy_provider_mutex);
28static LIST_HEAD(phy_provider_list);
29static LIST_HEAD(phys);
30static DEFINE_IDA(phy_ida);
31
32static void devm_phy_release(struct device *dev, void *res)
33{
34	struct phy *phy = *(struct phy **)res;
35
36	phy_put(phy);
37}
38
39static void devm_phy_provider_release(struct device *dev, void *res)
40{
41	struct phy_provider *phy_provider = *(struct phy_provider **)res;
42
43	of_phy_provider_unregister(phy_provider);
44}
45
46static void devm_phy_consume(struct device *dev, void *res)
47{
48	struct phy *phy = *(struct phy **)res;
49
50	phy_destroy(phy);
51}
52
53static int devm_phy_match(struct device *dev, void *res, void *match_data)
54{
55	struct phy **phy = res;
56
57	return *phy == match_data;
58}
59
60/**
61 * phy_create_lookup() - allocate and register PHY/device association
62 * @phy: the phy of the association
63 * @con_id: connection ID string on device
64 * @dev_id: the device of the association
65 *
66 * Creates and registers phy_lookup entry.
67 */
68int phy_create_lookup(struct phy *phy, const char *con_id, const char *dev_id)
69{
70	struct phy_lookup *pl;
71
72	if (!phy || !dev_id || !con_id)
73		return -EINVAL;
74
75	pl = kzalloc(sizeof(*pl), GFP_KERNEL);
76	if (!pl)
77		return -ENOMEM;
78
79	pl->dev_id = dev_id;
80	pl->con_id = con_id;
81	pl->phy = phy;
82
83	mutex_lock(&phy_provider_mutex);
84	list_add_tail(&pl->node, &phys);
85	mutex_unlock(&phy_provider_mutex);
86
87	return 0;
88}
89EXPORT_SYMBOL_GPL(phy_create_lookup);
90
91/**
92 * phy_remove_lookup() - find and remove PHY/device association
93 * @phy: the phy of the association
94 * @con_id: connection ID string on device
95 * @dev_id: the device of the association
96 *
97 * Finds and unregisters phy_lookup entry that was created with
98 * phy_create_lookup().
99 */
100void phy_remove_lookup(struct phy *phy, const char *con_id, const char *dev_id)
101{
102	struct phy_lookup *pl;
103
104	if (!phy || !dev_id || !con_id)
105		return;
106
107	mutex_lock(&phy_provider_mutex);
108	list_for_each_entry(pl, &phys, node)
109		if (pl->phy == phy && !strcmp(pl->dev_id, dev_id) &&
110		    !strcmp(pl->con_id, con_id)) {
111			list_del(&pl->node);
112			kfree(pl);
113			break;
114		}
115	mutex_unlock(&phy_provider_mutex);
116}
117EXPORT_SYMBOL_GPL(phy_remove_lookup);
118
119static struct phy *phy_find(struct device *dev, const char *con_id)
120{
121	const char *dev_id = dev_name(dev);
122	struct phy_lookup *p, *pl = NULL;
123
124	mutex_lock(&phy_provider_mutex);
125	list_for_each_entry(p, &phys, node)
126		if (!strcmp(p->dev_id, dev_id) && !strcmp(p->con_id, con_id)) {
127			pl = p;
128			break;
129		}
130	mutex_unlock(&phy_provider_mutex);
131
132	return pl ? pl->phy : ERR_PTR(-ENODEV);
133}
134
135static struct phy_provider *of_phy_provider_lookup(struct device_node *node)
136{
137	struct phy_provider *phy_provider;
138	struct device_node *child;
139
140	list_for_each_entry(phy_provider, &phy_provider_list, list) {
141		if (phy_provider->dev->of_node == node)
142			return phy_provider;
143
144		for_each_child_of_node(phy_provider->dev->of_node, child)
145			if (child == node)
146				return phy_provider;
147	}
148
149	return ERR_PTR(-EPROBE_DEFER);
150}
151
152int phy_pm_runtime_get(struct phy *phy)
153{
154	int ret;
155
156	if (!pm_runtime_enabled(&phy->dev))
157		return -ENOTSUPP;
158
159	ret = pm_runtime_get(&phy->dev);
160	if (ret < 0 && ret != -EINPROGRESS)
161		pm_runtime_put_noidle(&phy->dev);
162
163	return ret;
164}
165EXPORT_SYMBOL_GPL(phy_pm_runtime_get);
166
167int phy_pm_runtime_get_sync(struct phy *phy)
168{
169	int ret;
170
171	if (!pm_runtime_enabled(&phy->dev))
172		return -ENOTSUPP;
173
174	ret = pm_runtime_get_sync(&phy->dev);
175	if (ret < 0)
176		pm_runtime_put_sync(&phy->dev);
177
178	return ret;
179}
180EXPORT_SYMBOL_GPL(phy_pm_runtime_get_sync);
181
182int phy_pm_runtime_put(struct phy *phy)
183{
184	if (!pm_runtime_enabled(&phy->dev))
185		return -ENOTSUPP;
186
187	return pm_runtime_put(&phy->dev);
188}
189EXPORT_SYMBOL_GPL(phy_pm_runtime_put);
190
191int phy_pm_runtime_put_sync(struct phy *phy)
192{
193	if (!pm_runtime_enabled(&phy->dev))
194		return -ENOTSUPP;
195
196	return pm_runtime_put_sync(&phy->dev);
197}
198EXPORT_SYMBOL_GPL(phy_pm_runtime_put_sync);
199
200void phy_pm_runtime_allow(struct phy *phy)
201{
202	if (!pm_runtime_enabled(&phy->dev))
203		return;
204
205	pm_runtime_allow(&phy->dev);
206}
207EXPORT_SYMBOL_GPL(phy_pm_runtime_allow);
208
209void phy_pm_runtime_forbid(struct phy *phy)
210{
211	if (!pm_runtime_enabled(&phy->dev))
212		return;
213
214	pm_runtime_forbid(&phy->dev);
215}
216EXPORT_SYMBOL_GPL(phy_pm_runtime_forbid);
217
218int phy_init(struct phy *phy)
219{
220	int ret;
221
222	if (!phy)
223		return 0;
224
225	ret = phy_pm_runtime_get_sync(phy);
226	if (ret < 0 && ret != -ENOTSUPP)
227		return ret;
228	ret = 0; /* Override possible ret == -ENOTSUPP */
229
230	mutex_lock(&phy->mutex);
231	if (phy->init_count == 0 && phy->ops->init) {
232		ret = phy->ops->init(phy);
233		if (ret < 0) {
234			dev_err(&phy->dev, "phy init failed --> %d\n", ret);
235			goto out;
236		}
237	}
238	++phy->init_count;
239
240out:
241	mutex_unlock(&phy->mutex);
242	phy_pm_runtime_put(phy);
243	return ret;
244}
245EXPORT_SYMBOL_GPL(phy_init);
246
247int phy_exit(struct phy *phy)
248{
249	int ret;
250
251	if (!phy)
252		return 0;
253
254	ret = phy_pm_runtime_get_sync(phy);
255	if (ret < 0 && ret != -ENOTSUPP)
256		return ret;
257	ret = 0; /* Override possible ret == -ENOTSUPP */
258
259	mutex_lock(&phy->mutex);
260	if (phy->init_count == 1 && phy->ops->exit) {
261		ret = phy->ops->exit(phy);
262		if (ret < 0) {
263			dev_err(&phy->dev, "phy exit failed --> %d\n", ret);
264			goto out;
265		}
266	}
267	--phy->init_count;
268
269out:
270	mutex_unlock(&phy->mutex);
271	phy_pm_runtime_put(phy);
272	return ret;
273}
274EXPORT_SYMBOL_GPL(phy_exit);
275
276int phy_power_on(struct phy *phy)
277{
278	int ret = 0;
279
280	if (!phy)
281		goto out;
282
283	if (phy->pwr) {
284		ret = regulator_enable(phy->pwr);
285		if (ret)
286			goto out;
287	}
288
289	ret = phy_pm_runtime_get_sync(phy);
290	if (ret < 0 && ret != -ENOTSUPP)
291		goto err_pm_sync;
292
293	ret = 0; /* Override possible ret == -ENOTSUPP */
294
295	mutex_lock(&phy->mutex);
296	if (phy->power_count == 0 && phy->ops->power_on) {
297		ret = phy->ops->power_on(phy);
298		if (ret < 0) {
299			dev_err(&phy->dev, "phy poweron failed --> %d\n", ret);
300			goto err_pwr_on;
301		}
302	}
303	++phy->power_count;
304	mutex_unlock(&phy->mutex);
305	return 0;
306
307err_pwr_on:
308	mutex_unlock(&phy->mutex);
309	phy_pm_runtime_put_sync(phy);
310err_pm_sync:
311	if (phy->pwr)
312		regulator_disable(phy->pwr);
313out:
314	return ret;
315}
316EXPORT_SYMBOL_GPL(phy_power_on);
317
318int phy_power_off(struct phy *phy)
319{
320	int ret;
321
322	if (!phy)
323		return 0;
324
325	mutex_lock(&phy->mutex);
326	if (phy->power_count == 1 && phy->ops->power_off) {
327		ret =  phy->ops->power_off(phy);
328		if (ret < 0) {
329			dev_err(&phy->dev, "phy poweroff failed --> %d\n", ret);
330			mutex_unlock(&phy->mutex);
331			return ret;
332		}
333	}
334	--phy->power_count;
335	mutex_unlock(&phy->mutex);
336	phy_pm_runtime_put(phy);
337
338	if (phy->pwr)
339		regulator_disable(phy->pwr);
340
341	return 0;
342}
343EXPORT_SYMBOL_GPL(phy_power_off);
344
345/**
346 * _of_phy_get() - lookup and obtain a reference to a phy by phandle
347 * @np: device_node for which to get the phy
348 * @index: the index of the phy
349 *
350 * Returns the phy associated with the given phandle value,
351 * after getting a refcount to it or -ENODEV if there is no such phy or
352 * -EPROBE_DEFER if there is a phandle to the phy, but the device is
353 * not yet loaded. This function uses of_xlate call back function provided
354 * while registering the phy_provider to find the phy instance.
355 */
356static struct phy *_of_phy_get(struct device_node *np, int index)
357{
358	int ret;
359	struct phy_provider *phy_provider;
360	struct phy *phy = NULL;
361	struct of_phandle_args args;
362
363	ret = of_parse_phandle_with_args(np, "phys", "#phy-cells",
364		index, &args);
365	if (ret)
366		return ERR_PTR(-ENODEV);
367
368	mutex_lock(&phy_provider_mutex);
369	phy_provider = of_phy_provider_lookup(args.np);
370	if (IS_ERR(phy_provider) || !try_module_get(phy_provider->owner)) {
371		phy = ERR_PTR(-EPROBE_DEFER);
372		goto err0;
373	}
374
375	phy = phy_provider->of_xlate(phy_provider->dev, &args);
376	module_put(phy_provider->owner);
377
378err0:
379	mutex_unlock(&phy_provider_mutex);
380	of_node_put(args.np);
381
382	return phy;
383}
384
385/**
386 * of_phy_get() - lookup and obtain a reference to a phy using a device_node.
387 * @np: device_node for which to get the phy
388 * @con_id: name of the phy from device's point of view
389 *
390 * Returns the phy driver, after getting a refcount to it; or
391 * -ENODEV if there is no such phy. The caller is responsible for
392 * calling phy_put() to release that count.
393 */
394struct phy *of_phy_get(struct device_node *np, const char *con_id)
395{
396	struct phy *phy = NULL;
397	int index = 0;
398
399	if (con_id)
400		index = of_property_match_string(np, "phy-names", con_id);
401
402	phy = _of_phy_get(np, index);
403	if (IS_ERR(phy))
404		return phy;
405
406	if (!try_module_get(phy->ops->owner))
407		return ERR_PTR(-EPROBE_DEFER);
408
409	get_device(&phy->dev);
410
411	return phy;
412}
413EXPORT_SYMBOL_GPL(of_phy_get);
414
415/**
416 * phy_put() - release the PHY
417 * @phy: the phy returned by phy_get()
418 *
419 * Releases a refcount the caller received from phy_get().
420 */
421void phy_put(struct phy *phy)
422{
423	if (!phy || IS_ERR(phy))
424		return;
425
426	module_put(phy->ops->owner);
427	put_device(&phy->dev);
428}
429EXPORT_SYMBOL_GPL(phy_put);
430
431/**
432 * devm_phy_put() - release the PHY
433 * @dev: device that wants to release this phy
434 * @phy: the phy returned by devm_phy_get()
435 *
436 * destroys the devres associated with this phy and invokes phy_put
437 * to release the phy.
438 */
439void devm_phy_put(struct device *dev, struct phy *phy)
440{
441	int r;
442
443	if (!phy)
444		return;
445
446	r = devres_destroy(dev, devm_phy_release, devm_phy_match, phy);
447	dev_WARN_ONCE(dev, r, "couldn't find PHY resource\n");
448}
449EXPORT_SYMBOL_GPL(devm_phy_put);
450
451/**
452 * of_phy_simple_xlate() - returns the phy instance from phy provider
453 * @dev: the PHY provider device
454 * @args: of_phandle_args (not used here)
455 *
456 * Intended to be used by phy provider for the common case where #phy-cells is
457 * 0. For other cases where #phy-cells is greater than '0', the phy provider
458 * should provide a custom of_xlate function that reads the *args* and returns
459 * the appropriate phy.
460 */
461struct phy *of_phy_simple_xlate(struct device *dev, struct of_phandle_args
462	*args)
463{
464	struct phy *phy;
465	struct class_dev_iter iter;
466
467	class_dev_iter_init(&iter, phy_class, NULL, NULL);
468	while ((dev = class_dev_iter_next(&iter))) {
469		phy = to_phy(dev);
470		if (args->np != phy->dev.of_node)
471			continue;
472
473		class_dev_iter_exit(&iter);
474		return phy;
475	}
476
477	class_dev_iter_exit(&iter);
478	return ERR_PTR(-ENODEV);
479}
480EXPORT_SYMBOL_GPL(of_phy_simple_xlate);
481
482/**
483 * phy_get() - lookup and obtain a reference to a phy.
484 * @dev: device that requests this phy
485 * @string: the phy name as given in the dt data or the name of the controller
486 * port for non-dt case
487 *
488 * Returns the phy driver, after getting a refcount to it; or
489 * -ENODEV if there is no such phy.  The caller is responsible for
490 * calling phy_put() to release that count.
491 */
492struct phy *phy_get(struct device *dev, const char *string)
493{
494	int index = 0;
495	struct phy *phy;
496
497	if (string == NULL) {
498		dev_WARN(dev, "missing string\n");
499		return ERR_PTR(-EINVAL);
500	}
501
502	if (dev->of_node) {
503		index = of_property_match_string(dev->of_node, "phy-names",
504			string);
505		phy = _of_phy_get(dev->of_node, index);
506	} else {
507		phy = phy_find(dev, string);
508	}
509	if (IS_ERR(phy))
510		return phy;
511
512	if (!try_module_get(phy->ops->owner))
513		return ERR_PTR(-EPROBE_DEFER);
514
515	get_device(&phy->dev);
516
517	return phy;
518}
519EXPORT_SYMBOL_GPL(phy_get);
520
521/**
522 * phy_optional_get() - lookup and obtain a reference to an optional phy.
523 * @dev: device that requests this phy
524 * @string: the phy name as given in the dt data or the name of the controller
525 * port for non-dt case
526 *
527 * Returns the phy driver, after getting a refcount to it; or
528 * NULL if there is no such phy.  The caller is responsible for
529 * calling phy_put() to release that count.
530 */
531struct phy *phy_optional_get(struct device *dev, const char *string)
532{
533	struct phy *phy = phy_get(dev, string);
534
535	if (IS_ERR(phy) && (PTR_ERR(phy) == -ENODEV))
536		phy = NULL;
537
538	return phy;
539}
540EXPORT_SYMBOL_GPL(phy_optional_get);
541
542/**
543 * devm_phy_get() - lookup and obtain a reference to a phy.
544 * @dev: device that requests this phy
545 * @string: the phy name as given in the dt data or phy device name
546 * for non-dt case
547 *
548 * Gets the phy using phy_get(), and associates a device with it using
549 * devres. On driver detach, release function is invoked on the devres data,
550 * then, devres data is freed.
551 */
552struct phy *devm_phy_get(struct device *dev, const char *string)
553{
554	struct phy **ptr, *phy;
555
556	ptr = devres_alloc(devm_phy_release, sizeof(*ptr), GFP_KERNEL);
557	if (!ptr)
558		return ERR_PTR(-ENOMEM);
559
560	phy = phy_get(dev, string);
561	if (!IS_ERR(phy)) {
562		*ptr = phy;
563		devres_add(dev, ptr);
564	} else {
565		devres_free(ptr);
566	}
567
568	return phy;
569}
570EXPORT_SYMBOL_GPL(devm_phy_get);
571
572/**
573 * devm_phy_optional_get() - lookup and obtain a reference to an optional phy.
574 * @dev: device that requests this phy
575 * @string: the phy name as given in the dt data or phy device name
576 * for non-dt case
577 *
578 * Gets the phy using phy_get(), and associates a device with it using
579 * devres. On driver detach, release function is invoked on the devres
580 * data, then, devres data is freed. This differs to devm_phy_get() in
581 * that if the phy does not exist, it is not considered an error and
582 * -ENODEV will not be returned. Instead the NULL phy is returned,
583 * which can be passed to all other phy consumer calls.
584 */
585struct phy *devm_phy_optional_get(struct device *dev, const char *string)
586{
587	struct phy *phy = devm_phy_get(dev, string);
588
589	if (IS_ERR(phy) && (PTR_ERR(phy) == -ENODEV))
590		phy = NULL;
591
592	return phy;
593}
594EXPORT_SYMBOL_GPL(devm_phy_optional_get);
595
596/**
597 * devm_of_phy_get() - lookup and obtain a reference to a phy.
598 * @dev: device that requests this phy
599 * @np: node containing the phy
600 * @con_id: name of the phy from device's point of view
601 *
602 * Gets the phy using of_phy_get(), and associates a device with it using
603 * devres. On driver detach, release function is invoked on the devres data,
604 * then, devres data is freed.
605 */
606struct phy *devm_of_phy_get(struct device *dev, struct device_node *np,
607			    const char *con_id)
608{
609	struct phy **ptr, *phy;
610
611	ptr = devres_alloc(devm_phy_release, sizeof(*ptr), GFP_KERNEL);
612	if (!ptr)
613		return ERR_PTR(-ENOMEM);
614
615	phy = of_phy_get(np, con_id);
616	if (!IS_ERR(phy)) {
617		*ptr = phy;
618		devres_add(dev, ptr);
619	} else {
620		devres_free(ptr);
621	}
622
623	return phy;
624}
625EXPORT_SYMBOL_GPL(devm_of_phy_get);
626
627/**
628 * phy_create() - create a new phy
629 * @dev: device that is creating the new phy
630 * @node: device node of the phy
631 * @ops: function pointers for performing phy operations
632 *
633 * Called to create a phy using phy framework.
634 */
635struct phy *phy_create(struct device *dev, struct device_node *node,
636		       const struct phy_ops *ops)
637{
638	int ret;
639	int id;
640	struct phy *phy;
641
642	if (WARN_ON(!dev))
643		return ERR_PTR(-EINVAL);
644
645	phy = kzalloc(sizeof(*phy), GFP_KERNEL);
646	if (!phy)
647		return ERR_PTR(-ENOMEM);
648
649	id = ida_simple_get(&phy_ida, 0, 0, GFP_KERNEL);
650	if (id < 0) {
651		dev_err(dev, "unable to get id\n");
652		ret = id;
653		goto free_phy;
654	}
655
656	/* phy-supply */
657	phy->pwr = regulator_get_optional(dev, "phy");
658	if (IS_ERR(phy->pwr)) {
659		if (PTR_ERR(phy->pwr) == -EPROBE_DEFER) {
660			ret = -EPROBE_DEFER;
661			goto free_ida;
662		}
663		phy->pwr = NULL;
664	}
665
666	device_initialize(&phy->dev);
667	mutex_init(&phy->mutex);
668
669	phy->dev.class = phy_class;
670	phy->dev.parent = dev;
671	phy->dev.of_node = node ?: dev->of_node;
672	phy->id = id;
673	phy->ops = ops;
674
675	ret = dev_set_name(&phy->dev, "phy-%s.%d", dev_name(dev), id);
676	if (ret)
677		goto put_dev;
678
679	ret = device_add(&phy->dev);
680	if (ret)
681		goto put_dev;
682
683	if (pm_runtime_enabled(dev)) {
684		pm_runtime_enable(&phy->dev);
685		pm_runtime_no_callbacks(&phy->dev);
686	}
687
688	return phy;
689
690put_dev:
691	put_device(&phy->dev);  /* calls phy_release() which frees resources */
692	return ERR_PTR(ret);
693
694free_ida:
695	ida_simple_remove(&phy_ida, phy->id);
696
697free_phy:
698	kfree(phy);
699	return ERR_PTR(ret);
700}
701EXPORT_SYMBOL_GPL(phy_create);
702
703/**
704 * devm_phy_create() - create a new phy
705 * @dev: device that is creating the new phy
706 * @node: device node of the phy
707 * @ops: function pointers for performing phy operations
708 *
709 * Creates a new PHY device adding it to the PHY class.
710 * While at that, it also associates the device with the phy using devres.
711 * On driver detach, release function is invoked on the devres data,
712 * then, devres data is freed.
713 */
714struct phy *devm_phy_create(struct device *dev, struct device_node *node,
715			    const struct phy_ops *ops)
716{
717	struct phy **ptr, *phy;
718
719	ptr = devres_alloc(devm_phy_consume, sizeof(*ptr), GFP_KERNEL);
720	if (!ptr)
721		return ERR_PTR(-ENOMEM);
722
723	phy = phy_create(dev, node, ops);
724	if (!IS_ERR(phy)) {
725		*ptr = phy;
726		devres_add(dev, ptr);
727	} else {
728		devres_free(ptr);
729	}
730
731	return phy;
732}
733EXPORT_SYMBOL_GPL(devm_phy_create);
734
735/**
736 * phy_destroy() - destroy the phy
737 * @phy: the phy to be destroyed
738 *
739 * Called to destroy the phy.
740 */
741void phy_destroy(struct phy *phy)
742{
743	pm_runtime_disable(&phy->dev);
744	device_unregister(&phy->dev);
745}
746EXPORT_SYMBOL_GPL(phy_destroy);
747
748/**
749 * devm_phy_destroy() - destroy the PHY
750 * @dev: device that wants to release this phy
751 * @phy: the phy returned by devm_phy_get()
752 *
753 * destroys the devres associated with this phy and invokes phy_destroy
754 * to destroy the phy.
755 */
756void devm_phy_destroy(struct device *dev, struct phy *phy)
757{
758	int r;
759
760	r = devres_destroy(dev, devm_phy_consume, devm_phy_match, phy);
761	dev_WARN_ONCE(dev, r, "couldn't find PHY resource\n");
762}
763EXPORT_SYMBOL_GPL(devm_phy_destroy);
764
765/**
766 * __of_phy_provider_register() - create/register phy provider with the framework
767 * @dev: struct device of the phy provider
768 * @owner: the module owner containing of_xlate
769 * @of_xlate: function pointer to obtain phy instance from phy provider
770 *
771 * Creates struct phy_provider from dev and of_xlate function pointer.
772 * This is used in the case of dt boot for finding the phy instance from
773 * phy provider.
774 */
775struct phy_provider *__of_phy_provider_register(struct device *dev,
776	struct module *owner, struct phy * (*of_xlate)(struct device *dev,
777	struct of_phandle_args *args))
778{
779	struct phy_provider *phy_provider;
780
781	phy_provider = kzalloc(sizeof(*phy_provider), GFP_KERNEL);
782	if (!phy_provider)
783		return ERR_PTR(-ENOMEM);
784
785	phy_provider->dev = dev;
786	phy_provider->owner = owner;
787	phy_provider->of_xlate = of_xlate;
788
789	mutex_lock(&phy_provider_mutex);
790	list_add_tail(&phy_provider->list, &phy_provider_list);
791	mutex_unlock(&phy_provider_mutex);
792
793	return phy_provider;
794}
795EXPORT_SYMBOL_GPL(__of_phy_provider_register);
796
797/**
798 * __devm_of_phy_provider_register() - create/register phy provider with the
799 * framework
800 * @dev: struct device of the phy provider
801 * @owner: the module owner containing of_xlate
802 * @of_xlate: function pointer to obtain phy instance from phy provider
803 *
804 * Creates struct phy_provider from dev and of_xlate function pointer.
805 * This is used in the case of dt boot for finding the phy instance from
806 * phy provider. While at that, it also associates the device with the
807 * phy provider using devres. On driver detach, release function is invoked
808 * on the devres data, then, devres data is freed.
809 */
810struct phy_provider *__devm_of_phy_provider_register(struct device *dev,
811	struct module *owner, struct phy * (*of_xlate)(struct device *dev,
812	struct of_phandle_args *args))
813{
814	struct phy_provider **ptr, *phy_provider;
815
816	ptr = devres_alloc(devm_phy_provider_release, sizeof(*ptr), GFP_KERNEL);
817	if (!ptr)
818		return ERR_PTR(-ENOMEM);
819
820	phy_provider = __of_phy_provider_register(dev, owner, of_xlate);
821	if (!IS_ERR(phy_provider)) {
822		*ptr = phy_provider;
823		devres_add(dev, ptr);
824	} else {
825		devres_free(ptr);
826	}
827
828	return phy_provider;
829}
830EXPORT_SYMBOL_GPL(__devm_of_phy_provider_register);
831
832/**
833 * of_phy_provider_unregister() - unregister phy provider from the framework
834 * @phy_provider: phy provider returned by of_phy_provider_register()
835 *
836 * Removes the phy_provider created using of_phy_provider_register().
837 */
838void of_phy_provider_unregister(struct phy_provider *phy_provider)
839{
840	if (IS_ERR(phy_provider))
841		return;
842
843	mutex_lock(&phy_provider_mutex);
844	list_del(&phy_provider->list);
845	kfree(phy_provider);
846	mutex_unlock(&phy_provider_mutex);
847}
848EXPORT_SYMBOL_GPL(of_phy_provider_unregister);
849
850/**
851 * devm_of_phy_provider_unregister() - remove phy provider from the framework
852 * @dev: struct device of the phy provider
853 *
854 * destroys the devres associated with this phy provider and invokes
855 * of_phy_provider_unregister to unregister the phy provider.
856 */
857void devm_of_phy_provider_unregister(struct device *dev,
858	struct phy_provider *phy_provider) {
859	int r;
860
861	r = devres_destroy(dev, devm_phy_provider_release, devm_phy_match,
862		phy_provider);
863	dev_WARN_ONCE(dev, r, "couldn't find PHY provider device resource\n");
864}
865EXPORT_SYMBOL_GPL(devm_of_phy_provider_unregister);
866
867/**
868 * phy_release() - release the phy
869 * @dev: the dev member within phy
870 *
871 * When the last reference to the device is removed, it is called
872 * from the embedded kobject as release method.
873 */
874static void phy_release(struct device *dev)
875{
876	struct phy *phy;
877
878	phy = to_phy(dev);
879	dev_vdbg(dev, "releasing '%s'\n", dev_name(dev));
880	regulator_put(phy->pwr);
881	ida_simple_remove(&phy_ida, phy->id);
882	kfree(phy);
883}
884
885static int __init phy_core_init(void)
886{
887	phy_class = class_create(THIS_MODULE, "phy");
888	if (IS_ERR(phy_class)) {
889		pr_err("failed to create phy class --> %ld\n",
890			PTR_ERR(phy_class));
891		return PTR_ERR(phy_class);
892	}
893
894	phy_class->dev_release = phy_release;
895
896	return 0;
897}
898module_init(phy_core_init);
899
900static void __exit phy_core_exit(void)
901{
902	class_destroy(phy_class);
903}
904module_exit(phy_core_exit);
905
906MODULE_DESCRIPTION("Generic PHY Framework");
907MODULE_AUTHOR("Kishon Vijay Abraham I <kishon@ti.com>");
908MODULE_LICENSE("GPL v2");
909