Merge 5.4-rc5 into driver-core-next
We want the sysfs fix in here as well to build on top of. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
@@ -9,6 +9,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/cpufreq.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/fwnode.h>
|
||||
@@ -3346,6 +3347,8 @@ void device_shutdown(void)
|
||||
wait_for_device_probe();
|
||||
device_block_probing();
|
||||
|
||||
cpufreq_suspend();
|
||||
|
||||
spin_lock(&devices_kset->list_lock);
|
||||
/*
|
||||
* Walk the devices list backward, shutting down each in turn.
|
||||
|
@@ -540,6 +540,9 @@ static ssize_t soft_offline_page_store(struct device *dev,
|
||||
pfn >>= PAGE_SHIFT;
|
||||
if (!pfn_valid(pfn))
|
||||
return -ENXIO;
|
||||
/* Only online pages can be soft-offlined (esp., not ZONE_DEVICE). */
|
||||
if (!pfn_to_online_page(pfn))
|
||||
return -EIO;
|
||||
ret = soft_offline_page(pfn_to_page(pfn), 0);
|
||||
return ret == 0 ? count : ret;
|
||||
}
|
||||
|
@@ -236,12 +236,8 @@ struct resource *platform_get_resource_byname(struct platform_device *dev,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(platform_get_resource_byname);
|
||||
|
||||
/**
|
||||
* platform_get_irq_byname - get an IRQ for a device by name
|
||||
* @dev: platform device
|
||||
* @name: IRQ name
|
||||
*/
|
||||
int platform_get_irq_byname(struct platform_device *dev, const char *name)
|
||||
static int __platform_get_irq_byname(struct platform_device *dev,
|
||||
const char *name)
|
||||
{
|
||||
struct resource *r;
|
||||
|
||||
@@ -257,11 +253,47 @@ int platform_get_irq_byname(struct platform_device *dev, const char *name)
|
||||
if (r)
|
||||
return r->start;
|
||||
|
||||
dev_err(&dev->dev, "IRQ %s not found\n", name);
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
/**
|
||||
* platform_get_irq_byname - get an IRQ for a device by name
|
||||
* @dev: platform device
|
||||
* @name: IRQ name
|
||||
*
|
||||
* Get an IRQ like platform_get_irq(), but then by name rather then by index.
|
||||
*
|
||||
* Return: IRQ number on success, negative error number on failure.
|
||||
*/
|
||||
int platform_get_irq_byname(struct platform_device *dev, const char *name)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = __platform_get_irq_byname(dev, name);
|
||||
if (ret < 0 && ret != -EPROBE_DEFER)
|
||||
dev_err(&dev->dev, "IRQ %s not found\n", name);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(platform_get_irq_byname);
|
||||
|
||||
/**
|
||||
* platform_get_irq_byname_optional - get an optional IRQ for a device by name
|
||||
* @dev: platform device
|
||||
* @name: IRQ name
|
||||
*
|
||||
* Get an optional IRQ by name like platform_get_irq_byname(). Except that it
|
||||
* does not print an error message if an IRQ can not be obtained.
|
||||
*
|
||||
* Return: IRQ number on success, negative error number on failure.
|
||||
*/
|
||||
int platform_get_irq_byname_optional(struct platform_device *dev,
|
||||
const char *name)
|
||||
{
|
||||
return __platform_get_irq_byname(dev, name);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(platform_get_irq_byname_optional);
|
||||
|
||||
/**
|
||||
* platform_add_devices - add a numbers of platform devices
|
||||
* @devs: array of platform devices to add
|
||||
|
@@ -115,20 +115,10 @@ s32 dev_pm_qos_read_value(struct device *dev, enum dev_pm_qos_req_type type)
|
||||
|
||||
spin_lock_irqsave(&dev->power.lock, flags);
|
||||
|
||||
switch (type) {
|
||||
case DEV_PM_QOS_RESUME_LATENCY:
|
||||
if (type == DEV_PM_QOS_RESUME_LATENCY) {
|
||||
ret = IS_ERR_OR_NULL(qos) ? PM_QOS_RESUME_LATENCY_NO_CONSTRAINT
|
||||
: pm_qos_read_value(&qos->resume_latency);
|
||||
break;
|
||||
case DEV_PM_QOS_MIN_FREQUENCY:
|
||||
ret = IS_ERR_OR_NULL(qos) ? PM_QOS_MIN_FREQUENCY_DEFAULT_VALUE
|
||||
: pm_qos_read_value(&qos->min_frequency);
|
||||
break;
|
||||
case DEV_PM_QOS_MAX_FREQUENCY:
|
||||
ret = IS_ERR_OR_NULL(qos) ? PM_QOS_MAX_FREQUENCY_DEFAULT_VALUE
|
||||
: pm_qos_read_value(&qos->max_frequency);
|
||||
break;
|
||||
default:
|
||||
} else {
|
||||
WARN_ON(1);
|
||||
ret = 0;
|
||||
}
|
||||
@@ -169,14 +159,6 @@ static int apply_constraint(struct dev_pm_qos_request *req,
|
||||
req->dev->power.set_latency_tolerance(req->dev, value);
|
||||
}
|
||||
break;
|
||||
case DEV_PM_QOS_MIN_FREQUENCY:
|
||||
ret = pm_qos_update_target(&qos->min_frequency,
|
||||
&req->data.pnode, action, value);
|
||||
break;
|
||||
case DEV_PM_QOS_MAX_FREQUENCY:
|
||||
ret = pm_qos_update_target(&qos->max_frequency,
|
||||
&req->data.pnode, action, value);
|
||||
break;
|
||||
case DEV_PM_QOS_FLAGS:
|
||||
ret = pm_qos_update_flags(&qos->flags, &req->data.flr,
|
||||
action, value);
|
||||
@@ -227,24 +209,6 @@ static int dev_pm_qos_constraints_allocate(struct device *dev)
|
||||
c->no_constraint_value = PM_QOS_LATENCY_TOLERANCE_NO_CONSTRAINT;
|
||||
c->type = PM_QOS_MIN;
|
||||
|
||||
c = &qos->min_frequency;
|
||||
plist_head_init(&c->list);
|
||||
c->target_value = PM_QOS_MIN_FREQUENCY_DEFAULT_VALUE;
|
||||
c->default_value = PM_QOS_MIN_FREQUENCY_DEFAULT_VALUE;
|
||||
c->no_constraint_value = PM_QOS_MIN_FREQUENCY_DEFAULT_VALUE;
|
||||
c->type = PM_QOS_MAX;
|
||||
c->notifiers = ++n;
|
||||
BLOCKING_INIT_NOTIFIER_HEAD(n);
|
||||
|
||||
c = &qos->max_frequency;
|
||||
plist_head_init(&c->list);
|
||||
c->target_value = PM_QOS_MAX_FREQUENCY_DEFAULT_VALUE;
|
||||
c->default_value = PM_QOS_MAX_FREQUENCY_DEFAULT_VALUE;
|
||||
c->no_constraint_value = PM_QOS_MAX_FREQUENCY_DEFAULT_VALUE;
|
||||
c->type = PM_QOS_MIN;
|
||||
c->notifiers = ++n;
|
||||
BLOCKING_INIT_NOTIFIER_HEAD(n);
|
||||
|
||||
INIT_LIST_HEAD(&qos->flags.list);
|
||||
|
||||
spin_lock_irq(&dev->power.lock);
|
||||
@@ -305,18 +269,6 @@ void dev_pm_qos_constraints_destroy(struct device *dev)
|
||||
memset(req, 0, sizeof(*req));
|
||||
}
|
||||
|
||||
c = &qos->min_frequency;
|
||||
plist_for_each_entry_safe(req, tmp, &c->list, data.pnode) {
|
||||
apply_constraint(req, PM_QOS_REMOVE_REQ, PM_QOS_MIN_FREQUENCY_DEFAULT_VALUE);
|
||||
memset(req, 0, sizeof(*req));
|
||||
}
|
||||
|
||||
c = &qos->max_frequency;
|
||||
plist_for_each_entry_safe(req, tmp, &c->list, data.pnode) {
|
||||
apply_constraint(req, PM_QOS_REMOVE_REQ, PM_QOS_MAX_FREQUENCY_DEFAULT_VALUE);
|
||||
memset(req, 0, sizeof(*req));
|
||||
}
|
||||
|
||||
f = &qos->flags;
|
||||
list_for_each_entry_safe(req, tmp, &f->list, data.flr.node) {
|
||||
apply_constraint(req, PM_QOS_REMOVE_REQ, PM_QOS_DEFAULT_VALUE);
|
||||
@@ -428,8 +380,6 @@ static int __dev_pm_qos_update_request(struct dev_pm_qos_request *req,
|
||||
switch(req->type) {
|
||||
case DEV_PM_QOS_RESUME_LATENCY:
|
||||
case DEV_PM_QOS_LATENCY_TOLERANCE:
|
||||
case DEV_PM_QOS_MIN_FREQUENCY:
|
||||
case DEV_PM_QOS_MAX_FREQUENCY:
|
||||
curr_value = req->data.pnode.prio;
|
||||
break;
|
||||
case DEV_PM_QOS_FLAGS:
|
||||
@@ -557,14 +507,6 @@ int dev_pm_qos_add_notifier(struct device *dev, struct notifier_block *notifier,
|
||||
ret = blocking_notifier_chain_register(dev->power.qos->resume_latency.notifiers,
|
||||
notifier);
|
||||
break;
|
||||
case DEV_PM_QOS_MIN_FREQUENCY:
|
||||
ret = blocking_notifier_chain_register(dev->power.qos->min_frequency.notifiers,
|
||||
notifier);
|
||||
break;
|
||||
case DEV_PM_QOS_MAX_FREQUENCY:
|
||||
ret = blocking_notifier_chain_register(dev->power.qos->max_frequency.notifiers,
|
||||
notifier);
|
||||
break;
|
||||
default:
|
||||
WARN_ON(1);
|
||||
ret = -EINVAL;
|
||||
@@ -604,14 +546,6 @@ int dev_pm_qos_remove_notifier(struct device *dev,
|
||||
ret = blocking_notifier_chain_unregister(dev->power.qos->resume_latency.notifiers,
|
||||
notifier);
|
||||
break;
|
||||
case DEV_PM_QOS_MIN_FREQUENCY:
|
||||
ret = blocking_notifier_chain_unregister(dev->power.qos->min_frequency.notifiers,
|
||||
notifier);
|
||||
break;
|
||||
case DEV_PM_QOS_MAX_FREQUENCY:
|
||||
ret = blocking_notifier_chain_unregister(dev->power.qos->max_frequency.notifiers,
|
||||
notifier);
|
||||
break;
|
||||
default:
|
||||
WARN_ON(1);
|
||||
ret = -EINVAL;
|
||||
|
Reference in New Issue
Block a user