Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3be88125 authored by Roger Quadros's avatar Roger Quadros Committed by Kishon Vijay Abraham I
Browse files

phy: core: Support regulator supply for PHY power



Some PHYs can be powered by an external power regulator.
e.g. USB_HS PHY on DRA7 SoC. Make the PHY core support a
power regulator.

Signed-off-by: default avatarRoger Quadros <rogerq@ti.com>
Signed-off-by: default avatarKishon Vijay Abraham I <kishon@ti.com>
parent 016e0d3c
Loading
Loading
Loading
Loading
+26 −0
Original line number Original line Diff line number Diff line
@@ -21,6 +21,7 @@
#include <linux/phy/phy.h>
#include <linux/phy/phy.h>
#include <linux/idr.h>
#include <linux/idr.h>
#include <linux/pm_runtime.h>
#include <linux/pm_runtime.h>
#include <linux/regulator/consumer.h>


static struct class *phy_class;
static struct class *phy_class;
static DEFINE_MUTEX(phy_provider_mutex);
static DEFINE_MUTEX(phy_provider_mutex);
@@ -226,6 +227,12 @@ int phy_power_on(struct phy *phy)
	if (!phy)
	if (!phy)
		return 0;
		return 0;


	if (phy->pwr) {
		ret = regulator_enable(phy->pwr);
		if (ret)
			return ret;
	}

	ret = phy_pm_runtime_get_sync(phy);
	ret = phy_pm_runtime_get_sync(phy);
	if (ret < 0 && ret != -ENOTSUPP)
	if (ret < 0 && ret != -ENOTSUPP)
		return ret;
		return ret;
@@ -247,6 +254,8 @@ int phy_power_on(struct phy *phy)
out:
out:
	mutex_unlock(&phy->mutex);
	mutex_unlock(&phy->mutex);
	phy_pm_runtime_put_sync(phy);
	phy_pm_runtime_put_sync(phy);
	if (phy->pwr)
		regulator_disable(phy->pwr);


	return ret;
	return ret;
}
}
@@ -272,6 +281,9 @@ int phy_power_off(struct phy *phy)
	mutex_unlock(&phy->mutex);
	mutex_unlock(&phy->mutex);
	phy_pm_runtime_put(phy);
	phy_pm_runtime_put(phy);


	if (phy->pwr)
		regulator_disable(phy->pwr);

	return 0;
	return 0;
}
}
EXPORT_SYMBOL_GPL(phy_power_off);
EXPORT_SYMBOL_GPL(phy_power_off);
@@ -588,6 +600,16 @@ struct phy *phy_create(struct device *dev, const struct phy_ops *ops,
		goto free_phy;
		goto free_phy;
	}
	}


	/* phy-supply */
	phy->pwr = regulator_get_optional(dev, "phy");
	if (IS_ERR(phy->pwr)) {
		if (PTR_ERR(phy->pwr) == -EPROBE_DEFER) {
			ret = -EPROBE_DEFER;
			goto free_ida;
		}
		phy->pwr = NULL;
	}

	device_initialize(&phy->dev);
	device_initialize(&phy->dev);
	mutex_init(&phy->mutex);
	mutex_init(&phy->mutex);


@@ -617,6 +639,9 @@ struct phy *phy_create(struct device *dev, const struct phy_ops *ops,
	put_device(&phy->dev);  /* calls phy_release() which frees resources */
	put_device(&phy->dev);  /* calls phy_release() which frees resources */
	return ERR_PTR(ret);
	return ERR_PTR(ret);


free_ida:
	ida_simple_remove(&phy_ida, phy->id);

free_phy:
free_phy:
	kfree(phy);
	kfree(phy);
	return ERR_PTR(ret);
	return ERR_PTR(ret);
@@ -800,6 +825,7 @@ static void phy_release(struct device *dev)


	phy = to_phy(dev);
	phy = to_phy(dev);
	dev_vdbg(dev, "releasing '%s'\n", dev_name(dev));
	dev_vdbg(dev, "releasing '%s'\n", dev_name(dev));
	regulator_put(phy->pwr);
	ida_simple_remove(&phy_ida, phy->id);
	ida_simple_remove(&phy_ida, phy->id);
	kfree(phy);
	kfree(phy);
}
}
+2 −0
Original line number Original line Diff line number Diff line
@@ -18,6 +18,7 @@
#include <linux/of.h>
#include <linux/of.h>
#include <linux/device.h>
#include <linux/device.h>
#include <linux/pm_runtime.h>
#include <linux/pm_runtime.h>
#include <linux/regulator/consumer.h>


struct phy;
struct phy;


@@ -65,6 +66,7 @@ struct phy {
	int			init_count;
	int			init_count;
	int			power_count;
	int			power_count;
	struct phy_attrs	attrs;
	struct phy_attrs	attrs;
	struct regulator	*pwr;
};
};


/**
/**