forked from Qortal/Brooklyn
If Mike was on fire and i had water, i'd drink the water.
This commit is contained in:
parent
108444ef65
commit
67381595a0
@ -1035,13 +1035,8 @@ void acpi_turn_off_unused_power_resources(void)
|
|||||||
list_for_each_entry_reverse(resource, &acpi_power_resource_list, list_node) {
|
list_for_each_entry_reverse(resource, &acpi_power_resource_list, list_node) {
|
||||||
mutex_lock(&resource->resource_lock);
|
mutex_lock(&resource->resource_lock);
|
||||||
|
|
||||||
/*
|
|
||||||
* Turn off power resources in an unknown state too, because the
|
|
||||||
* platform firmware on some system expects the OS to turn off
|
|
||||||
* power resources without any users unconditionally.
|
|
||||||
*/
|
|
||||||
if (!resource->ref_count &&
|
if (!resource->ref_count &&
|
||||||
resource->state != ACPI_POWER_RESOURCE_STATE_OFF) {
|
resource->state == ACPI_POWER_RESOURCE_STATE_ON) {
|
||||||
acpi_handle_debug(resource->device.handle, "Turning OFF\n");
|
acpi_handle_debug(resource->device.handle, "Turning OFF\n");
|
||||||
__acpi_power_off(resource);
|
__acpi_power_off(resource);
|
||||||
}
|
}
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include <linux/earlycpio.h>
|
#include <linux/earlycpio.h>
|
||||||
#include <linux/initrd.h>
|
#include <linux/initrd.h>
|
||||||
#include <linux/security.h>
|
#include <linux/security.h>
|
||||||
|
#include <linux/kmemleak.h>
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
|
|
||||||
#ifdef CONFIG_ACPI_CUSTOM_DSDT
|
#ifdef CONFIG_ACPI_CUSTOM_DSDT
|
||||||
@ -601,6 +602,8 @@ void __init acpi_table_upgrade(void)
|
|||||||
*/
|
*/
|
||||||
arch_reserve_mem_area(acpi_tables_addr, all_tables_size);
|
arch_reserve_mem_area(acpi_tables_addr, all_tables_size);
|
||||||
|
|
||||||
|
kmemleak_ignore_phys(acpi_tables_addr);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* early_ioremap only can remap 256k one time. If we map all
|
* early_ioremap only can remap 256k one time. If we map all
|
||||||
* tables one time, we will hit the limit. Need to map chunks
|
* tables one time, we will hit the limit. Need to map chunks
|
||||||
|
@ -938,8 +938,7 @@ static int bcm2835_clock_is_on(struct clk_hw *hw)
|
|||||||
|
|
||||||
static u32 bcm2835_clock_choose_div(struct clk_hw *hw,
|
static u32 bcm2835_clock_choose_div(struct clk_hw *hw,
|
||||||
unsigned long rate,
|
unsigned long rate,
|
||||||
unsigned long parent_rate,
|
unsigned long parent_rate)
|
||||||
bool round_up)
|
|
||||||
{
|
{
|
||||||
struct bcm2835_clock *clock = bcm2835_clock_from_hw(hw);
|
struct bcm2835_clock *clock = bcm2835_clock_from_hw(hw);
|
||||||
const struct bcm2835_clock_data *data = clock->data;
|
const struct bcm2835_clock_data *data = clock->data;
|
||||||
@ -951,10 +950,6 @@ static u32 bcm2835_clock_choose_div(struct clk_hw *hw,
|
|||||||
|
|
||||||
rem = do_div(temp, rate);
|
rem = do_div(temp, rate);
|
||||||
div = temp;
|
div = temp;
|
||||||
|
|
||||||
/* Round up and mask off the unused bits */
|
|
||||||
if (round_up && ((div & unused_frac_mask) != 0 || rem != 0))
|
|
||||||
div += unused_frac_mask + 1;
|
|
||||||
div &= ~unused_frac_mask;
|
div &= ~unused_frac_mask;
|
||||||
|
|
||||||
/* different clamping limits apply for a mash clock */
|
/* different clamping limits apply for a mash clock */
|
||||||
@ -1111,7 +1106,7 @@ static int bcm2835_clock_set_rate_and_parent(struct clk_hw *hw,
|
|||||||
struct bcm2835_clock *clock = bcm2835_clock_from_hw(hw);
|
struct bcm2835_clock *clock = bcm2835_clock_from_hw(hw);
|
||||||
struct bcm2835_cprman *cprman = clock->cprman;
|
struct bcm2835_cprman *cprman = clock->cprman;
|
||||||
const struct bcm2835_clock_data *data = clock->data;
|
const struct bcm2835_clock_data *data = clock->data;
|
||||||
u32 div = bcm2835_clock_choose_div(hw, rate, parent_rate, false);
|
u32 div = bcm2835_clock_choose_div(hw, rate, parent_rate);
|
||||||
u32 ctl;
|
u32 ctl;
|
||||||
|
|
||||||
spin_lock(&cprman->regs_lock);
|
spin_lock(&cprman->regs_lock);
|
||||||
@ -1177,7 +1172,7 @@ static unsigned long bcm2835_clock_choose_div_and_prate(struct clk_hw *hw,
|
|||||||
|
|
||||||
if (!(BIT(parent_idx) & data->set_rate_parent)) {
|
if (!(BIT(parent_idx) & data->set_rate_parent)) {
|
||||||
*prate = clk_hw_get_rate(parent);
|
*prate = clk_hw_get_rate(parent);
|
||||||
*div = bcm2835_clock_choose_div(hw, rate, *prate, true);
|
*div = bcm2835_clock_choose_div(hw, rate, *prate);
|
||||||
|
|
||||||
*avgrate = bcm2835_clock_rate_from_divisor(clock, *prate, *div);
|
*avgrate = bcm2835_clock_rate_from_divisor(clock, *prate, *div);
|
||||||
|
|
||||||
@ -1263,7 +1258,7 @@ static int bcm2835_clock_determine_rate(struct clk_hw *hw,
|
|||||||
rate = bcm2835_clock_choose_div_and_prate(hw, i, req->rate,
|
rate = bcm2835_clock_choose_div_and_prate(hw, i, req->rate,
|
||||||
&div, &prate,
|
&div, &prate,
|
||||||
&avgrate);
|
&avgrate);
|
||||||
if (rate > best_rate && rate <= req->rate) {
|
if (abs(req->rate - rate) < abs(req->rate - best_rate)) {
|
||||||
best_parent = parent;
|
best_parent = parent;
|
||||||
best_prate = prate;
|
best_prate = prate;
|
||||||
best_rate = rate;
|
best_rate = rate;
|
||||||
|
@ -256,6 +256,11 @@ mlxbf2_gpio_probe(struct platform_device *pdev)
|
|||||||
NULL,
|
NULL,
|
||||||
0);
|
0);
|
||||||
|
|
||||||
|
if (ret) {
|
||||||
|
dev_err(dev, "bgpio_init failed\n");
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
gc->direction_input = mlxbf2_gpio_direction_input;
|
gc->direction_input = mlxbf2_gpio_direction_input;
|
||||||
gc->direction_output = mlxbf2_gpio_direction_output;
|
gc->direction_output = mlxbf2_gpio_direction_output;
|
||||||
gc->ngpio = npins;
|
gc->ngpio = npins;
|
||||||
|
@ -224,7 +224,7 @@ static int iproc_gpio_probe(struct platform_device *pdev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
chip->gc.label = dev_name(dev);
|
chip->gc.label = dev_name(dev);
|
||||||
if (of_property_read_u32(dn, "ngpios", &num_gpios))
|
if (!of_property_read_u32(dn, "ngpios", &num_gpios))
|
||||||
chip->gc.ngpio = num_gpios;
|
chip->gc.ngpio = num_gpios;
|
||||||
|
|
||||||
irq = platform_get_irq(pdev, 0);
|
irq = platform_get_irq(pdev, 0);
|
||||||
|
@ -1994,14 +1994,14 @@ setup_hw(struct hfc_pci *hc)
|
|||||||
pci_set_master(hc->pdev);
|
pci_set_master(hc->pdev);
|
||||||
if (!hc->irq) {
|
if (!hc->irq) {
|
||||||
printk(KERN_WARNING "HFC-PCI: No IRQ for PCI card found\n");
|
printk(KERN_WARNING "HFC-PCI: No IRQ for PCI card found\n");
|
||||||
return 1;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
hc->hw.pci_io =
|
hc->hw.pci_io =
|
||||||
(char __iomem *)(unsigned long)hc->pdev->resource[1].start;
|
(char __iomem *)(unsigned long)hc->pdev->resource[1].start;
|
||||||
|
|
||||||
if (!hc->hw.pci_io) {
|
if (!hc->hw.pci_io) {
|
||||||
printk(KERN_WARNING "HFC-PCI: No IO-Mem for PCI card found\n");
|
printk(KERN_WARNING "HFC-PCI: No IO-Mem for PCI card found\n");
|
||||||
return 1;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
/* Allocate memory for FIFOS */
|
/* Allocate memory for FIFOS */
|
||||||
/* the memory needs to be on a 32k boundary within the first 4G */
|
/* the memory needs to be on a 32k boundary within the first 4G */
|
||||||
@ -2012,7 +2012,7 @@ setup_hw(struct hfc_pci *hc)
|
|||||||
if (!buffer) {
|
if (!buffer) {
|
||||||
printk(KERN_WARNING
|
printk(KERN_WARNING
|
||||||
"HFC-PCI: Error allocating memory for FIFO!\n");
|
"HFC-PCI: Error allocating memory for FIFO!\n");
|
||||||
return 1;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
hc->hw.fifos = buffer;
|
hc->hw.fifos = buffer;
|
||||||
pci_write_config_dword(hc->pdev, 0x80, hc->hw.dmahandle);
|
pci_write_config_dword(hc->pdev, 0x80, hc->hw.dmahandle);
|
||||||
@ -2022,7 +2022,7 @@ setup_hw(struct hfc_pci *hc)
|
|||||||
"HFC-PCI: Error in ioremap for PCI!\n");
|
"HFC-PCI: Error in ioremap for PCI!\n");
|
||||||
dma_free_coherent(&hc->pdev->dev, 0x8000, hc->hw.fifos,
|
dma_free_coherent(&hc->pdev->dev, 0x8000, hc->hw.fifos,
|
||||||
hc->hw.dmahandle);
|
hc->hw.dmahandle);
|
||||||
return 1;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
printk(KERN_INFO
|
printk(KERN_INFO
|
||||||
|
@ -1006,11 +1006,11 @@ static u64 port100_get_command_type_mask(struct port100 *dev)
|
|||||||
|
|
||||||
skb = port100_alloc_skb(dev, 0);
|
skb = port100_alloc_skb(dev, 0);
|
||||||
if (!skb)
|
if (!skb)
|
||||||
return -ENOMEM;
|
return 0;
|
||||||
|
|
||||||
resp = port100_send_cmd_sync(dev, PORT100_CMD_GET_COMMAND_TYPE, skb);
|
resp = port100_send_cmd_sync(dev, PORT100_CMD_GET_COMMAND_TYPE, skb);
|
||||||
if (IS_ERR(resp))
|
if (IS_ERR(resp))
|
||||||
return PTR_ERR(resp);
|
return 0;
|
||||||
|
|
||||||
if (resp->len < 8)
|
if (resp->len < 8)
|
||||||
mask = 0;
|
mask = 0;
|
||||||
|
@ -1226,11 +1226,9 @@ static int st95hf_remove(struct spi_device *nfc_spi_dev)
|
|||||||
&reset_cmd,
|
&reset_cmd,
|
||||||
ST95HF_RESET_CMD_LEN,
|
ST95HF_RESET_CMD_LEN,
|
||||||
ASYNC);
|
ASYNC);
|
||||||
if (result) {
|
if (result)
|
||||||
dev_err(&spictx->spidev->dev,
|
dev_err(&spictx->spidev->dev,
|
||||||
"ST95HF reset failed in remove() err = %d\n", result);
|
"ST95HF reset failed in remove() err = %d\n", result);
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* wait for 3 ms to complete the controller reset process */
|
/* wait for 3 ms to complete the controller reset process */
|
||||||
usleep_range(3000, 4000);
|
usleep_range(3000, 4000);
|
||||||
@ -1239,7 +1237,7 @@ static int st95hf_remove(struct spi_device *nfc_spi_dev)
|
|||||||
if (stcontext->st95hf_supply)
|
if (stcontext->st95hf_supply)
|
||||||
regulator_disable(stcontext->st95hf_supply);
|
regulator_disable(stcontext->st95hf_supply);
|
||||||
|
|
||||||
return result;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Register as SPI protocol driver */
|
/* Register as SPI protocol driver */
|
||||||
|
@ -80,6 +80,7 @@ struct vduse_dev {
|
|||||||
struct vdpa_callback config_cb;
|
struct vdpa_callback config_cb;
|
||||||
struct work_struct inject;
|
struct work_struct inject;
|
||||||
spinlock_t irq_lock;
|
spinlock_t irq_lock;
|
||||||
|
struct rw_semaphore rwsem;
|
||||||
int minor;
|
int minor;
|
||||||
bool broken;
|
bool broken;
|
||||||
bool connected;
|
bool connected;
|
||||||
@ -410,6 +411,8 @@ static void vduse_dev_reset(struct vduse_dev *dev)
|
|||||||
if (domain->bounce_map)
|
if (domain->bounce_map)
|
||||||
vduse_domain_reset_bounce_map(domain);
|
vduse_domain_reset_bounce_map(domain);
|
||||||
|
|
||||||
|
down_write(&dev->rwsem);
|
||||||
|
|
||||||
dev->status = 0;
|
dev->status = 0;
|
||||||
dev->driver_features = 0;
|
dev->driver_features = 0;
|
||||||
dev->generation++;
|
dev->generation++;
|
||||||
@ -443,6 +446,8 @@ static void vduse_dev_reset(struct vduse_dev *dev)
|
|||||||
flush_work(&vq->inject);
|
flush_work(&vq->inject);
|
||||||
flush_work(&vq->kick);
|
flush_work(&vq->kick);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
up_write(&dev->rwsem);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int vduse_vdpa_set_vq_address(struct vdpa_device *vdpa, u16 idx,
|
static int vduse_vdpa_set_vq_address(struct vdpa_device *vdpa, u16 idx,
|
||||||
@ -885,6 +890,23 @@ static void vduse_vq_irq_inject(struct work_struct *work)
|
|||||||
spin_unlock_irq(&vq->irq_lock);
|
spin_unlock_irq(&vq->irq_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int vduse_dev_queue_irq_work(struct vduse_dev *dev,
|
||||||
|
struct work_struct *irq_work)
|
||||||
|
{
|
||||||
|
int ret = -EINVAL;
|
||||||
|
|
||||||
|
down_read(&dev->rwsem);
|
||||||
|
if (!(dev->status & VIRTIO_CONFIG_S_DRIVER_OK))
|
||||||
|
goto unlock;
|
||||||
|
|
||||||
|
ret = 0;
|
||||||
|
queue_work(vduse_irq_wq, irq_work);
|
||||||
|
unlock:
|
||||||
|
up_read(&dev->rwsem);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static long vduse_dev_ioctl(struct file *file, unsigned int cmd,
|
static long vduse_dev_ioctl(struct file *file, unsigned int cmd,
|
||||||
unsigned long arg)
|
unsigned long arg)
|
||||||
{
|
{
|
||||||
@ -966,8 +988,7 @@ static long vduse_dev_ioctl(struct file *file, unsigned int cmd,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case VDUSE_DEV_INJECT_CONFIG_IRQ:
|
case VDUSE_DEV_INJECT_CONFIG_IRQ:
|
||||||
ret = 0;
|
ret = vduse_dev_queue_irq_work(dev, &dev->inject);
|
||||||
queue_work(vduse_irq_wq, &dev->inject);
|
|
||||||
break;
|
break;
|
||||||
case VDUSE_VQ_SETUP: {
|
case VDUSE_VQ_SETUP: {
|
||||||
struct vduse_vq_config config;
|
struct vduse_vq_config config;
|
||||||
@ -1053,9 +1074,8 @@ static long vduse_dev_ioctl(struct file *file, unsigned int cmd,
|
|||||||
if (index >= dev->vq_num)
|
if (index >= dev->vq_num)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
ret = 0;
|
|
||||||
index = array_index_nospec(index, dev->vq_num);
|
index = array_index_nospec(index, dev->vq_num);
|
||||||
queue_work(vduse_irq_wq, &dev->vqs[index].inject);
|
ret = vduse_dev_queue_irq_work(dev, &dev->vqs[index].inject);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
@ -1136,6 +1156,7 @@ static struct vduse_dev *vduse_dev_create(void)
|
|||||||
INIT_LIST_HEAD(&dev->send_list);
|
INIT_LIST_HEAD(&dev->send_list);
|
||||||
INIT_LIST_HEAD(&dev->recv_list);
|
INIT_LIST_HEAD(&dev->recv_list);
|
||||||
spin_lock_init(&dev->irq_lock);
|
spin_lock_init(&dev->irq_lock);
|
||||||
|
init_rwsem(&dev->rwsem);
|
||||||
|
|
||||||
INIT_WORK(&dev->inject, vduse_dev_irq_inject);
|
INIT_WORK(&dev->inject, vduse_dev_irq_inject);
|
||||||
init_waitqueue_head(&dev->waitq);
|
init_waitqueue_head(&dev->waitq);
|
||||||
|
Loading…
Reference in New Issue
Block a user