Commit 4285027c authored by Rafael J. Wysocki's avatar Rafael J. Wysocki

Merge tag 'devfreq-next-for-5.10' of...

Merge tag 'devfreq-next-for-5.10' of git://git.kernel.org/pub/scm/linux/kernel/git/chanwoo/linux into pm-devfreq

Pull devfreq updates for 5.10 from Chanwoo Choi:

"1. Update devfreq core
  -  Until now, devfreq and devfreq-event framework defined the fixed
     'devfreq' and 'devfreq-event' property to get the devfreq/devfreq-event
     phandle. But, these property names are not expressing the h/w. So,
     deprecate the fixed property names 'devfreq' and 'devfreq-event'. But,
     in order to keep the backward compatibility of devicetree, don't
     change the property name on devfreq device drivers and devicetree.

 2. Update devfreq driver
  - Replace reset_control_(assert|dessert) fucntions with reset_control_reset()
    for reseting the h/w during probe on tegra30-devfreq.c."

* tag 'devfreq-next-for-5.10' of git://git.kernel.org/pub/scm/linux/kernel/git/chanwoo/linux:
  PM / devfreq: tegra30: Improve initial hardware resetting
  PM / devfreq: event: Change prototype of devfreq_event_get_edev_by_phandle function
  PM / devfreq: Change prototype of devfreq_get_devfreq_by_phandle function
  PM / devfreq: Add devfreq_get_devfreq_by_node function
parents a1b8638b d353d120
...@@ -213,20 +213,21 @@ EXPORT_SYMBOL_GPL(devfreq_event_reset_event); ...@@ -213,20 +213,21 @@ EXPORT_SYMBOL_GPL(devfreq_event_reset_event);
* devfreq_event_get_edev_by_phandle() - Get the devfreq-event dev from * devfreq_event_get_edev_by_phandle() - Get the devfreq-event dev from
* devicetree. * devicetree.
* @dev : the pointer to the given device * @dev : the pointer to the given device
* @phandle_name: name of property holding a phandle value
* @index : the index into list of devfreq-event device * @index : the index into list of devfreq-event device
* *
* Note that this function return the pointer of devfreq-event device. * Note that this function return the pointer of devfreq-event device.
*/ */
struct devfreq_event_dev *devfreq_event_get_edev_by_phandle(struct device *dev, struct devfreq_event_dev *devfreq_event_get_edev_by_phandle(struct device *dev,
int index) const char *phandle_name, int index)
{ {
struct device_node *node; struct device_node *node;
struct devfreq_event_dev *edev; struct devfreq_event_dev *edev;
if (!dev->of_node) if (!dev->of_node || !phandle_name)
return ERR_PTR(-EINVAL); return ERR_PTR(-EINVAL);
node = of_parse_phandle(dev->of_node, "devfreq-events", index); node = of_parse_phandle(dev->of_node, phandle_name, index);
if (!node) if (!node)
return ERR_PTR(-ENODEV); return ERR_PTR(-ENODEV);
...@@ -258,19 +259,20 @@ EXPORT_SYMBOL_GPL(devfreq_event_get_edev_by_phandle); ...@@ -258,19 +259,20 @@ EXPORT_SYMBOL_GPL(devfreq_event_get_edev_by_phandle);
/** /**
* devfreq_event_get_edev_count() - Get the count of devfreq-event dev * devfreq_event_get_edev_count() - Get the count of devfreq-event dev
* @dev : the pointer to the given device * @dev : the pointer to the given device
* @phandle_name: name of property holding a phandle value
* *
* Note that this function return the count of devfreq-event devices. * Note that this function return the count of devfreq-event devices.
*/ */
int devfreq_event_get_edev_count(struct device *dev) int devfreq_event_get_edev_count(struct device *dev, const char *phandle_name)
{ {
int count; int count;
if (!dev->of_node) { if (!dev->of_node || !phandle_name) {
dev_err(dev, "device does not have a device node entry\n"); dev_err(dev, "device does not have a device node entry\n");
return -EINVAL; return -EINVAL;
} }
count = of_property_count_elems_of_size(dev->of_node, "devfreq-events", count = of_property_count_elems_of_size(dev->of_node, phandle_name,
sizeof(u32)); sizeof(u32));
if (count < 0) { if (count < 0) {
dev_err(dev, dev_err(dev,
......
...@@ -983,48 +983,75 @@ struct devfreq *devm_devfreq_add_device(struct device *dev, ...@@ -983,48 +983,75 @@ struct devfreq *devm_devfreq_add_device(struct device *dev,
EXPORT_SYMBOL(devm_devfreq_add_device); EXPORT_SYMBOL(devm_devfreq_add_device);
#ifdef CONFIG_OF #ifdef CONFIG_OF
/*
* devfreq_get_devfreq_by_node - Get the devfreq device from devicetree
* @node - pointer to device_node
*
* return the instance of devfreq device
*/
struct devfreq *devfreq_get_devfreq_by_node(struct device_node *node)
{
struct devfreq *devfreq;
if (!node)
return ERR_PTR(-EINVAL);
mutex_lock(&devfreq_list_lock);
list_for_each_entry(devfreq, &devfreq_list, node) {
if (devfreq->dev.parent
&& devfreq->dev.parent->of_node == node) {
mutex_unlock(&devfreq_list_lock);
return devfreq;
}
}
mutex_unlock(&devfreq_list_lock);
return ERR_PTR(-ENODEV);
}
/* /*
* devfreq_get_devfreq_by_phandle - Get the devfreq device from devicetree * devfreq_get_devfreq_by_phandle - Get the devfreq device from devicetree
* @dev - instance to the given device * @dev - instance to the given device
* @phandle_name - name of property holding a phandle value
* @index - index into list of devfreq * @index - index into list of devfreq
* *
* return the instance of devfreq device * return the instance of devfreq device
*/ */
struct devfreq *devfreq_get_devfreq_by_phandle(struct device *dev, int index) struct devfreq *devfreq_get_devfreq_by_phandle(struct device *dev,
const char *phandle_name, int index)
{ {
struct device_node *node; struct device_node *node;
struct devfreq *devfreq; struct devfreq *devfreq;
if (!dev) if (!dev || !phandle_name)
return ERR_PTR(-EINVAL); return ERR_PTR(-EINVAL);
if (!dev->of_node) if (!dev->of_node)
return ERR_PTR(-EINVAL); return ERR_PTR(-EINVAL);
node = of_parse_phandle(dev->of_node, "devfreq", index); node = of_parse_phandle(dev->of_node, phandle_name, index);
if (!node) if (!node)
return ERR_PTR(-ENODEV); return ERR_PTR(-ENODEV);
mutex_lock(&devfreq_list_lock); devfreq = devfreq_get_devfreq_by_node(node);
list_for_each_entry(devfreq, &devfreq_list, node) {
if (devfreq->dev.parent
&& devfreq->dev.parent->of_node == node) {
mutex_unlock(&devfreq_list_lock);
of_node_put(node);
return devfreq;
}
}
mutex_unlock(&devfreq_list_lock);
of_node_put(node); of_node_put(node);
return ERR_PTR(-EPROBE_DEFER); return devfreq;
} }
#else #else
struct devfreq *devfreq_get_devfreq_by_phandle(struct device *dev, int index) struct devfreq *devfreq_get_devfreq_by_node(struct device_node *node)
{
return ERR_PTR(-ENODEV);
}
struct devfreq *devfreq_get_devfreq_by_phandle(struct device *dev,
const char *phandle_name, int index)
{ {
return ERR_PTR(-ENODEV); return ERR_PTR(-ENODEV);
} }
#endif /* CONFIG_OF */ #endif /* CONFIG_OF */
EXPORT_SYMBOL_GPL(devfreq_get_devfreq_by_node);
EXPORT_SYMBOL_GPL(devfreq_get_devfreq_by_phandle); EXPORT_SYMBOL_GPL(devfreq_get_devfreq_by_phandle);
/** /**
......
...@@ -193,7 +193,7 @@ static int exynos_bus_parent_parse_of(struct device_node *np, ...@@ -193,7 +193,7 @@ static int exynos_bus_parent_parse_of(struct device_node *np,
* Get the devfreq-event devices to get the current utilization of * Get the devfreq-event devices to get the current utilization of
* buses. This raw data will be used in devfreq ondemand governor. * buses. This raw data will be used in devfreq ondemand governor.
*/ */
count = devfreq_event_get_edev_count(dev); count = devfreq_event_get_edev_count(dev, "devfreq-events");
if (count < 0) { if (count < 0) {
dev_err(dev, "failed to get the count of devfreq-event dev\n"); dev_err(dev, "failed to get the count of devfreq-event dev\n");
ret = count; ret = count;
...@@ -209,7 +209,8 @@ static int exynos_bus_parent_parse_of(struct device_node *np, ...@@ -209,7 +209,8 @@ static int exynos_bus_parent_parse_of(struct device_node *np,
} }
for (i = 0; i < count; i++) { for (i = 0; i < count; i++) {
bus->edev[i] = devfreq_event_get_edev_by_phandle(dev, i); bus->edev[i] = devfreq_event_get_edev_by_phandle(dev,
"devfreq-events", i);
if (IS_ERR(bus->edev[i])) { if (IS_ERR(bus->edev[i])) {
ret = -EPROBE_DEFER; ret = -EPROBE_DEFER;
goto err_regulator; goto err_regulator;
...@@ -360,7 +361,7 @@ static int exynos_bus_profile_init_passive(struct exynos_bus *bus, ...@@ -360,7 +361,7 @@ static int exynos_bus_profile_init_passive(struct exynos_bus *bus,
profile->exit = exynos_bus_passive_exit; profile->exit = exynos_bus_passive_exit;
/* Get the instance of parent devfreq device */ /* Get the instance of parent devfreq device */
parent_devfreq = devfreq_get_devfreq_by_phandle(dev, 0); parent_devfreq = devfreq_get_devfreq_by_phandle(dev, "devfreq", 0);
if (IS_ERR(parent_devfreq)) if (IS_ERR(parent_devfreq))
return -EPROBE_DEFER; return -EPROBE_DEFER;
......
...@@ -341,7 +341,7 @@ static int rk3399_dmcfreq_probe(struct platform_device *pdev) ...@@ -341,7 +341,7 @@ static int rk3399_dmcfreq_probe(struct platform_device *pdev)
return PTR_ERR(data->dmc_clk); return PTR_ERR(data->dmc_clk);
} }
data->edev = devfreq_event_get_edev_by_phandle(dev, 0); data->edev = devfreq_event_get_edev_by_phandle(dev, "devfreq-events", 0);
if (IS_ERR(data->edev)) if (IS_ERR(data->edev))
return -EPROBE_DEFER; return -EPROBE_DEFER;
......
...@@ -822,8 +822,6 @@ static int tegra_devfreq_probe(struct platform_device *pdev) ...@@ -822,8 +822,6 @@ static int tegra_devfreq_probe(struct platform_device *pdev)
return err; return err;
} }
reset_control_assert(tegra->reset);
err = clk_prepare_enable(tegra->clock); err = clk_prepare_enable(tegra->clock);
if (err) { if (err) {
dev_err(&pdev->dev, dev_err(&pdev->dev,
...@@ -831,7 +829,11 @@ static int tegra_devfreq_probe(struct platform_device *pdev) ...@@ -831,7 +829,11 @@ static int tegra_devfreq_probe(struct platform_device *pdev)
return err; return err;
} }
reset_control_deassert(tegra->reset); err = reset_control_reset(tegra->reset);
if (err) {
dev_err(&pdev->dev, "Failed to reset hardware: %d\n", err);
goto disable_clk;
}
rate = clk_round_rate(tegra->emc_clock, ULONG_MAX); rate = clk_round_rate(tegra->emc_clock, ULONG_MAX);
if (rate < 0) { if (rate < 0) {
......
...@@ -1293,7 +1293,8 @@ static int exynos5_performance_counters_init(struct exynos5_dmc *dmc) ...@@ -1293,7 +1293,8 @@ static int exynos5_performance_counters_init(struct exynos5_dmc *dmc)
int counters_size; int counters_size;
int ret, i; int ret, i;
dmc->num_counters = devfreq_event_get_edev_count(dmc->dev); dmc->num_counters = devfreq_event_get_edev_count(dmc->dev,
"devfreq-events");
if (dmc->num_counters < 0) { if (dmc->num_counters < 0) {
dev_err(dmc->dev, "could not get devfreq-event counters\n"); dev_err(dmc->dev, "could not get devfreq-event counters\n");
return dmc->num_counters; return dmc->num_counters;
...@@ -1306,7 +1307,8 @@ static int exynos5_performance_counters_init(struct exynos5_dmc *dmc) ...@@ -1306,7 +1307,8 @@ static int exynos5_performance_counters_init(struct exynos5_dmc *dmc)
for (i = 0; i < dmc->num_counters; i++) { for (i = 0; i < dmc->num_counters; i++) {
dmc->counter[i] = dmc->counter[i] =
devfreq_event_get_edev_by_phandle(dmc->dev, i); devfreq_event_get_edev_by_phandle(dmc->dev,
"devfreq-events", i);
if (IS_ERR_OR_NULL(dmc->counter[i])) if (IS_ERR_OR_NULL(dmc->counter[i]))
return -EPROBE_DEFER; return -EPROBE_DEFER;
} }
......
...@@ -106,8 +106,11 @@ extern int devfreq_event_get_event(struct devfreq_event_dev *edev, ...@@ -106,8 +106,11 @@ extern int devfreq_event_get_event(struct devfreq_event_dev *edev,
struct devfreq_event_data *edata); struct devfreq_event_data *edata);
extern int devfreq_event_reset_event(struct devfreq_event_dev *edev); extern int devfreq_event_reset_event(struct devfreq_event_dev *edev);
extern struct devfreq_event_dev *devfreq_event_get_edev_by_phandle( extern struct devfreq_event_dev *devfreq_event_get_edev_by_phandle(
struct device *dev, int index); struct device *dev,
extern int devfreq_event_get_edev_count(struct device *dev); const char *phandle_name,
int index);
extern int devfreq_event_get_edev_count(struct device *dev,
const char *phandle_name);
extern struct devfreq_event_dev *devfreq_event_add_edev(struct device *dev, extern struct devfreq_event_dev *devfreq_event_add_edev(struct device *dev,
struct devfreq_event_desc *desc); struct devfreq_event_desc *desc);
extern int devfreq_event_remove_edev(struct devfreq_event_dev *edev); extern int devfreq_event_remove_edev(struct devfreq_event_dev *edev);
...@@ -152,12 +155,15 @@ static inline int devfreq_event_reset_event(struct devfreq_event_dev *edev) ...@@ -152,12 +155,15 @@ static inline int devfreq_event_reset_event(struct devfreq_event_dev *edev)
} }
static inline struct devfreq_event_dev *devfreq_event_get_edev_by_phandle( static inline struct devfreq_event_dev *devfreq_event_get_edev_by_phandle(
struct device *dev, int index) struct device *dev,
const char *phandle_name,
int index)
{ {
return ERR_PTR(-EINVAL); return ERR_PTR(-EINVAL);
} }
static inline int devfreq_event_get_edev_count(struct device *dev) static inline int devfreq_event_get_edev_count(struct device *dev,
const char *phandle_name)
{ {
return -EINVAL; return -EINVAL;
} }
......
...@@ -261,7 +261,9 @@ void devm_devfreq_unregister_notifier(struct device *dev, ...@@ -261,7 +261,9 @@ void devm_devfreq_unregister_notifier(struct device *dev,
struct devfreq *devfreq, struct devfreq *devfreq,
struct notifier_block *nb, struct notifier_block *nb,
unsigned int list); unsigned int list);
struct devfreq *devfreq_get_devfreq_by_phandle(struct device *dev, int index); struct devfreq *devfreq_get_devfreq_by_node(struct device_node *node);
struct devfreq *devfreq_get_devfreq_by_phandle(struct device *dev,
const char *phandle_name, int index);
#if IS_ENABLED(CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND) #if IS_ENABLED(CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND)
/** /**
...@@ -414,8 +416,13 @@ static inline void devm_devfreq_unregister_notifier(struct device *dev, ...@@ -414,8 +416,13 @@ static inline void devm_devfreq_unregister_notifier(struct device *dev,
{ {
} }
static inline struct devfreq *devfreq_get_devfreq_by_node(struct device_node *node)
{
return ERR_PTR(-ENODEV);
}
static inline struct devfreq *devfreq_get_devfreq_by_phandle(struct device *dev, static inline struct devfreq *devfreq_get_devfreq_by_phandle(struct device *dev,
int index) const char *phandle_name, int index)
{ {
return ERR_PTR(-ENODEV); return ERR_PTR(-ENODEV);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment