mirror of
https://github.com/Qortal/Brooklyn.git
synced 2025-01-30 14:52:17 +00:00
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) {
|
||||
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 &&
|
||||
resource->state != ACPI_POWER_RESOURCE_STATE_OFF) {
|
||||
resource->state == ACPI_POWER_RESOURCE_STATE_ON) {
|
||||
acpi_handle_debug(resource->device.handle, "Turning OFF\n");
|
||||
__acpi_power_off(resource);
|
||||
}
|
||||
|
@ -21,6 +21,7 @@
|
||||
#include <linux/earlycpio.h>
|
||||
#include <linux/initrd.h>
|
||||
#include <linux/security.h>
|
||||
#include <linux/kmemleak.h>
|
||||
#include "internal.h"
|
||||
|
||||
#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);
|
||||
|
||||
kmemleak_ignore_phys(acpi_tables_addr);
|
||||
|
||||
/*
|
||||
* early_ioremap only can remap 256k one time. If we map all
|
||||
* 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,
|
||||
unsigned long rate,
|
||||
unsigned long parent_rate,
|
||||
bool round_up)
|
||||
unsigned long parent_rate)
|
||||
{
|
||||
struct bcm2835_clock *clock = bcm2835_clock_from_hw(hw);
|
||||
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);
|
||||
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;
|
||||
|
||||
/* 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_cprman *cprman = clock->cprman;
|
||||
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;
|
||||
|
||||
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)) {
|
||||
*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);
|
||||
|
||||
@ -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,
|
||||
&div, &prate,
|
||||
&avgrate);
|
||||
if (rate > best_rate && rate <= req->rate) {
|
||||
if (abs(req->rate - rate) < abs(req->rate - best_rate)) {
|
||||
best_parent = parent;
|
||||
best_prate = prate;
|
||||
best_rate = rate;
|
||||
|
@ -256,6 +256,11 @@ mlxbf2_gpio_probe(struct platform_device *pdev)
|
||||
NULL,
|
||||
0);
|
||||
|
||||
if (ret) {
|
||||
dev_err(dev, "bgpio_init failed\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
gc->direction_input = mlxbf2_gpio_direction_input;
|
||||
gc->direction_output = mlxbf2_gpio_direction_output;
|
||||
gc->ngpio = npins;
|
||||
|
@ -224,7 +224,7 @@ static int iproc_gpio_probe(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
irq = platform_get_irq(pdev, 0);
|
||||
|
@ -1994,14 +1994,14 @@ setup_hw(struct hfc_pci *hc)
|
||||
pci_set_master(hc->pdev);
|
||||
if (!hc->irq) {
|
||||
printk(KERN_WARNING "HFC-PCI: No IRQ for PCI card found\n");
|
||||
return 1;
|
||||
return -EINVAL;
|
||||
}
|
||||
hc->hw.pci_io =
|
||||
(char __iomem *)(unsigned long)hc->pdev->resource[1].start;
|
||||
|
||||
if (!hc->hw.pci_io) {
|
||||
printk(KERN_WARNING "HFC-PCI: No IO-Mem for PCI card found\n");
|
||||
return 1;
|
||||
return -ENOMEM;
|
||||
}
|
||||
/* Allocate memory for FIFOS */
|
||||
/* 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) {
|
||||
printk(KERN_WARNING
|
||||
"HFC-PCI: Error allocating memory for FIFO!\n");
|
||||
return 1;
|
||||
return -ENOMEM;
|
||||
}
|
||||
hc->hw.fifos = buffer;
|
||||
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");
|
||||
dma_free_coherent(&hc->pdev->dev, 0x8000, hc->hw.fifos,
|
||||
hc->hw.dmahandle);
|
||||
return 1;
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
printk(KERN_INFO
|
||||
|
@ -1006,11 +1006,11 @@ static u64 port100_get_command_type_mask(struct port100 *dev)
|
||||
|
||||
skb = port100_alloc_skb(dev, 0);
|
||||
if (!skb)
|
||||
return -ENOMEM;
|
||||
return 0;
|
||||
|
||||
resp = port100_send_cmd_sync(dev, PORT100_CMD_GET_COMMAND_TYPE, skb);
|
||||
if (IS_ERR(resp))
|
||||
return PTR_ERR(resp);
|
||||
return 0;
|
||||
|
||||
if (resp->len < 8)
|
||||
mask = 0;
|
||||
|
@ -1226,11 +1226,9 @@ static int st95hf_remove(struct spi_device *nfc_spi_dev)
|
||||
&reset_cmd,
|
||||
ST95HF_RESET_CMD_LEN,
|
||||
ASYNC);
|
||||
if (result) {
|
||||
if (result)
|
||||
dev_err(&spictx->spidev->dev,
|
||||
"ST95HF reset failed in remove() err = %d\n", result);
|
||||
return result;
|
||||
}
|
||||
|
||||
/* wait for 3 ms to complete the controller reset process */
|
||||
usleep_range(3000, 4000);
|
||||
@ -1239,7 +1237,7 @@ static int st95hf_remove(struct spi_device *nfc_spi_dev)
|
||||
if (stcontext->st95hf_supply)
|
||||
regulator_disable(stcontext->st95hf_supply);
|
||||
|
||||
return result;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Register as SPI protocol driver */
|
||||
|
@ -80,6 +80,7 @@ struct vduse_dev {
|
||||
struct vdpa_callback config_cb;
|
||||
struct work_struct inject;
|
||||
spinlock_t irq_lock;
|
||||
struct rw_semaphore rwsem;
|
||||
int minor;
|
||||
bool broken;
|
||||
bool connected;
|
||||
@ -410,6 +411,8 @@ static void vduse_dev_reset(struct vduse_dev *dev)
|
||||
if (domain->bounce_map)
|
||||
vduse_domain_reset_bounce_map(domain);
|
||||
|
||||
down_write(&dev->rwsem);
|
||||
|
||||
dev->status = 0;
|
||||
dev->driver_features = 0;
|
||||
dev->generation++;
|
||||
@ -443,6 +446,8 @@ static void vduse_dev_reset(struct vduse_dev *dev)
|
||||
flush_work(&vq->inject);
|
||||
flush_work(&vq->kick);
|
||||
}
|
||||
|
||||
up_write(&dev->rwsem);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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,
|
||||
unsigned long arg)
|
||||
{
|
||||
@ -966,8 +988,7 @@ static long vduse_dev_ioctl(struct file *file, unsigned int cmd,
|
||||
break;
|
||||
}
|
||||
case VDUSE_DEV_INJECT_CONFIG_IRQ:
|
||||
ret = 0;
|
||||
queue_work(vduse_irq_wq, &dev->inject);
|
||||
ret = vduse_dev_queue_irq_work(dev, &dev->inject);
|
||||
break;
|
||||
case VDUSE_VQ_SETUP: {
|
||||
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)
|
||||
break;
|
||||
|
||||
ret = 0;
|
||||
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;
|
||||
}
|
||||
default:
|
||||
@ -1136,6 +1156,7 @@ static struct vduse_dev *vduse_dev_create(void)
|
||||
INIT_LIST_HEAD(&dev->send_list);
|
||||
INIT_LIST_HEAD(&dev->recv_list);
|
||||
spin_lock_init(&dev->irq_lock);
|
||||
init_rwsem(&dev->rwsem);
|
||||
|
||||
INIT_WORK(&dev->inject, vduse_dev_irq_inject);
|
||||
init_waitqueue_head(&dev->waitq);
|
||||
|
Loading…
Reference in New Issue
Block a user