Merge branch 'android-msm-pixel-4.9' into lineage-20
Change-Id: I3bb2b31495b5d29b02f749271606c86771eab5df
This commit is contained in:
2
Makefile
2
Makefile
@@ -1,6 +1,6 @@
|
||||
VERSION = 4
|
||||
PATCHLEVEL = 9
|
||||
SUBLEVEL = 336
|
||||
SUBLEVEL = 337
|
||||
EXTRAVERSION =
|
||||
NAME = Roaring Lionus
|
||||
|
||||
|
||||
@@ -468,8 +468,10 @@ entSys:
|
||||
#ifdef CONFIG_AUDITSYSCALL
|
||||
lda $6, _TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT
|
||||
and $3, $6, $3
|
||||
#endif
|
||||
bne $3, strace
|
||||
#else
|
||||
blbs $3, strace /* check for SYSCALL_TRACE in disguise */
|
||||
#endif
|
||||
beq $4, 1f
|
||||
ldq $27, 0($5)
|
||||
1: jsr $26, ($27), alpha_ni_syscall
|
||||
|
||||
@@ -108,7 +108,7 @@
|
||||
|
||||
pcie@2,0 {
|
||||
device_type = "pci";
|
||||
assigned-addresses = <0x82002800 0 0x80000 0 0x2000>;
|
||||
assigned-addresses = <0x82001000 0 0x80000 0 0x2000>;
|
||||
reg = <0x1000 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
|
||||
@@ -618,7 +618,7 @@
|
||||
|
||||
pcie@2,0 {
|
||||
device_type = "pci";
|
||||
assigned-addresses = <0x82000800 0 0x44000 0 0x2000>;
|
||||
assigned-addresses = <0x82001000 0 0x44000 0 0x2000>;
|
||||
reg = <0x1000 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
|
||||
@@ -115,7 +115,7 @@
|
||||
/* x1 port */
|
||||
pcie@2,0 {
|
||||
device_type = "pci";
|
||||
assigned-addresses = <0x82000800 0 0x40000 0 0x2000>;
|
||||
assigned-addresses = <0x82001000 0 0x40000 0 0x2000>;
|
||||
reg = <0x1000 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
@@ -133,7 +133,7 @@
|
||||
/* x1 port */
|
||||
pcie@3,0 {
|
||||
device_type = "pci";
|
||||
assigned-addresses = <0x82000800 0 0x44000 0 0x2000>;
|
||||
assigned-addresses = <0x82001800 0 0x44000 0 0x2000>;
|
||||
reg = <0x1800 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
|
||||
@@ -126,7 +126,7 @@
|
||||
/* x1 port */
|
||||
pcie@2,0 {
|
||||
device_type = "pci";
|
||||
assigned-addresses = <0x82000800 0 0x40000 0 0x2000>;
|
||||
assigned-addresses = <0x82001000 0 0x40000 0 0x2000>;
|
||||
reg = <0x1000 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
@@ -144,7 +144,7 @@
|
||||
/* x1 port */
|
||||
pcie@3,0 {
|
||||
device_type = "pci";
|
||||
assigned-addresses = <0x82000800 0 0x44000 0 0x2000>;
|
||||
assigned-addresses = <0x82001800 0 0x44000 0 0x2000>;
|
||||
reg = <0x1800 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
@@ -165,7 +165,7 @@
|
||||
*/
|
||||
pcie@4,0 {
|
||||
device_type = "pci";
|
||||
assigned-addresses = <0x82000800 0 0x48000 0 0x2000>;
|
||||
assigned-addresses = <0x82002000 0 0x48000 0 0x2000>;
|
||||
reg = <0x2000 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
|
||||
@@ -492,7 +492,7 @@
|
||||
/* x1 port */
|
||||
pcie@2,0 {
|
||||
device_type = "pci";
|
||||
assigned-addresses = <0x82000800 0 0x40000 0 0x2000>;
|
||||
assigned-addresses = <0x82001000 0 0x40000 0 0x2000>;
|
||||
reg = <0x1000 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
@@ -510,7 +510,7 @@
|
||||
/* x1 port */
|
||||
pcie@3,0 {
|
||||
device_type = "pci";
|
||||
assigned-addresses = <0x82000800 0 0x44000 0 0x2000>;
|
||||
assigned-addresses = <0x82001800 0 0x44000 0 0x2000>;
|
||||
reg = <0x1800 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
@@ -531,7 +531,7 @@
|
||||
*/
|
||||
pcie@4,0 {
|
||||
device_type = "pci";
|
||||
assigned-addresses = <0x82000800 0 0x48000 0 0x2000>;
|
||||
assigned-addresses = <0x82002000 0 0x48000 0 0x2000>;
|
||||
reg = <0x2000 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
|
||||
@@ -133,7 +133,7 @@
|
||||
|
||||
pcie@2,0 {
|
||||
device_type = "pci";
|
||||
assigned-addresses = <0x82000800 0 0x44000 0 0x2000>;
|
||||
assigned-addresses = <0x82001000 0 0x44000 0 0x2000>;
|
||||
reg = <0x1000 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
@@ -150,7 +150,7 @@
|
||||
|
||||
pcie@3,0 {
|
||||
device_type = "pci";
|
||||
assigned-addresses = <0x82000800 0 0x48000 0 0x2000>;
|
||||
assigned-addresses = <0x82001800 0 0x48000 0 0x2000>;
|
||||
reg = <0x1800 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
@@ -167,7 +167,7 @@
|
||||
|
||||
pcie@4,0 {
|
||||
device_type = "pci";
|
||||
assigned-addresses = <0x82000800 0 0x4c000 0 0x2000>;
|
||||
assigned-addresses = <0x82002000 0 0x4c000 0 0x2000>;
|
||||
reg = <0x2000 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
@@ -184,7 +184,7 @@
|
||||
|
||||
pcie@5,0 {
|
||||
device_type = "pci";
|
||||
assigned-addresses = <0x82000800 0 0x80000 0 0x2000>;
|
||||
assigned-addresses = <0x82002800 0 0x80000 0 0x2000>;
|
||||
reg = <0x2800 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
|
||||
@@ -148,7 +148,7 @@
|
||||
|
||||
pcie@2,0 {
|
||||
device_type = "pci";
|
||||
assigned-addresses = <0x82000800 0 0x44000 0 0x2000>;
|
||||
assigned-addresses = <0x82001000 0 0x44000 0 0x2000>;
|
||||
reg = <0x1000 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
@@ -165,7 +165,7 @@
|
||||
|
||||
pcie@3,0 {
|
||||
device_type = "pci";
|
||||
assigned-addresses = <0x82000800 0 0x48000 0 0x2000>;
|
||||
assigned-addresses = <0x82001800 0 0x48000 0 0x2000>;
|
||||
reg = <0x1800 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
@@ -182,7 +182,7 @@
|
||||
|
||||
pcie@4,0 {
|
||||
device_type = "pci";
|
||||
assigned-addresses = <0x82000800 0 0x4c000 0 0x2000>;
|
||||
assigned-addresses = <0x82002000 0 0x4c000 0 0x2000>;
|
||||
reg = <0x2000 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
@@ -199,7 +199,7 @@
|
||||
|
||||
pcie@5,0 {
|
||||
device_type = "pci";
|
||||
assigned-addresses = <0x82000800 0 0x80000 0 0x2000>;
|
||||
assigned-addresses = <0x82002800 0 0x80000 0 0x2000>;
|
||||
reg = <0x2800 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
@@ -216,7 +216,7 @@
|
||||
|
||||
pcie@6,0 {
|
||||
device_type = "pci";
|
||||
assigned-addresses = <0x82000800 0 0x84000 0 0x2000>;
|
||||
assigned-addresses = <0x82003000 0 0x84000 0 0x2000>;
|
||||
reg = <0x3000 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
@@ -233,7 +233,7 @@
|
||||
|
||||
pcie@7,0 {
|
||||
device_type = "pci";
|
||||
assigned-addresses = <0x82000800 0 0x88000 0 0x2000>;
|
||||
assigned-addresses = <0x82003800 0 0x88000 0 0x2000>;
|
||||
reg = <0x3800 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
@@ -250,7 +250,7 @@
|
||||
|
||||
pcie@8,0 {
|
||||
device_type = "pci";
|
||||
assigned-addresses = <0x82000800 0 0x8c000 0 0x2000>;
|
||||
assigned-addresses = <0x82004000 0 0x8c000 0 0x2000>;
|
||||
reg = <0x4000 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
@@ -267,7 +267,7 @@
|
||||
|
||||
pcie@9,0 {
|
||||
device_type = "pci";
|
||||
assigned-addresses = <0x82000800 0 0x42000 0 0x2000>;
|
||||
assigned-addresses = <0x82004800 0 0x42000 0 0x2000>;
|
||||
reg = <0x4800 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
|
||||
@@ -127,7 +127,7 @@
|
||||
pcie1: pcie-port@1 {
|
||||
device_type = "pci";
|
||||
status = "disabled";
|
||||
assigned-addresses = <0x82002800 0 0x80000 0 0x2000>;
|
||||
assigned-addresses = <0x82001000 0 0x80000 0 0x2000>;
|
||||
reg = <0x1000 0 0 0 0>;
|
||||
clocks = <&gate_clk 5>;
|
||||
marvell,pcie-port = <1>;
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
compatible = "arm,pl110", "arm,primecell";
|
||||
reg = <0xfc200000 0x1000>;
|
||||
interrupt-parent = <&vic1>;
|
||||
interrupts = <12>;
|
||||
interrupts = <13>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
||||
@@ -52,18 +52,21 @@
|
||||
static void __iomem *mmp_timer_base = TIMERS_VIRT_BASE;
|
||||
|
||||
/*
|
||||
* FIXME: the timer needs some delay to stablize the counter capture
|
||||
* Read the timer through the CVWR register. Delay is required after requesting
|
||||
* a read. The CR register cannot be directly read due to metastability issues
|
||||
* documented in the PXA168 software manual.
|
||||
*/
|
||||
static inline uint32_t timer_read(void)
|
||||
{
|
||||
int delay = 100;
|
||||
uint32_t val;
|
||||
int delay = 3;
|
||||
|
||||
__raw_writel(1, mmp_timer_base + TMR_CVWR(1));
|
||||
|
||||
while (delay--)
|
||||
cpu_relax();
|
||||
val = __raw_readl(mmp_timer_base + TMR_CVWR(1));
|
||||
|
||||
return __raw_readl(mmp_timer_base + TMR_CVWR(1));
|
||||
return val;
|
||||
}
|
||||
|
||||
static u64 notrace mmp_read_sched_clock(void)
|
||||
|
||||
@@ -10,3 +10,9 @@ nwfpe-y += fpa11.o fpa11_cpdo.o fpa11_cpdt.o \
|
||||
entry.o
|
||||
|
||||
nwfpe-$(CONFIG_FPE_NWFPE_XP) += extended_cpdo.o
|
||||
|
||||
# Try really hard to avoid generating calls to __aeabi_uldivmod() from
|
||||
# float64_rem() due to loop elision.
|
||||
ifdef CONFIG_CC_IS_CLANG
|
||||
CFLAGS_softfloat.o += -mllvm -replexitval=never
|
||||
endif
|
||||
|
||||
@@ -316,6 +316,8 @@ static struct clk clk_periph = {
|
||||
*/
|
||||
int clk_enable(struct clk *clk)
|
||||
{
|
||||
if (!clk)
|
||||
return 0;
|
||||
mutex_lock(&clocks_mutex);
|
||||
clk_enable_unlocked(clk);
|
||||
mutex_unlock(&clocks_mutex);
|
||||
|
||||
@@ -75,7 +75,6 @@ ATTRIBUTE_GROUPS(vpe);
|
||||
|
||||
static void vpe_device_release(struct device *cd)
|
||||
{
|
||||
kfree(cd);
|
||||
}
|
||||
|
||||
static struct class vpe_class = {
|
||||
@@ -157,6 +156,7 @@ out_dev:
|
||||
device_del(&vpe_device);
|
||||
|
||||
out_class:
|
||||
put_device(&vpe_device);
|
||||
class_unregister(&vpe_class);
|
||||
|
||||
out_chrdev:
|
||||
@@ -169,7 +169,7 @@ void __exit vpe_module_exit(void)
|
||||
{
|
||||
struct vpe *v, *n;
|
||||
|
||||
device_del(&vpe_device);
|
||||
device_unregister(&vpe_device);
|
||||
class_unregister(&vpe_class);
|
||||
unregister_chrdev(major, VPE_MODULE_NAME);
|
||||
|
||||
|
||||
@@ -313,7 +313,6 @@ ATTRIBUTE_GROUPS(vpe);
|
||||
|
||||
static void vpe_device_release(struct device *cd)
|
||||
{
|
||||
kfree(cd);
|
||||
}
|
||||
|
||||
static struct class vpe_class = {
|
||||
@@ -497,6 +496,7 @@ out_dev:
|
||||
device_del(&vpe_device);
|
||||
|
||||
out_class:
|
||||
put_device(&vpe_device);
|
||||
class_unregister(&vpe_class);
|
||||
|
||||
out_chrdev:
|
||||
@@ -509,7 +509,7 @@ void __exit vpe_module_exit(void)
|
||||
{
|
||||
struct vpe *v, *n;
|
||||
|
||||
device_del(&vpe_device);
|
||||
device_unregister(&vpe_device);
|
||||
class_unregister(&vpe_class);
|
||||
unregister_chrdev(major, VPE_MODULE_NAME);
|
||||
|
||||
|
||||
@@ -733,10 +733,15 @@ void rtas_os_term(char *str)
|
||||
|
||||
snprintf(rtas_os_term_buf, 2048, "OS panic: %s", str);
|
||||
|
||||
/*
|
||||
* Keep calling as long as RTAS returns a "try again" status,
|
||||
* but don't use rtas_busy_delay(), which potentially
|
||||
* schedules.
|
||||
*/
|
||||
do {
|
||||
status = rtas_call(rtas_token("ibm,os-term"), 1, 1, NULL,
|
||||
__pa(rtas_os_term_buf));
|
||||
} while (rtas_busy_delay(status));
|
||||
} while (rtas_busy_delay_time(status));
|
||||
|
||||
if (status != 0)
|
||||
printk(KERN_EMERG "ibm,os-term call failed %d\n", status);
|
||||
|
||||
@@ -67,6 +67,7 @@ perf_callchain_kernel(struct perf_callchain_entry_ctx *entry, struct pt_regs *re
|
||||
next_sp = fp[0];
|
||||
|
||||
if (next_sp == sp + STACK_INT_FRAME_SIZE &&
|
||||
validate_sp(sp, current, STACK_INT_FRAME_SIZE) &&
|
||||
fp[STACK_FRAME_MARKER] == STACK_FRAME_REGS_MARKER) {
|
||||
/*
|
||||
* This looks like an interrupt frame for an
|
||||
|
||||
@@ -78,6 +78,7 @@ REQUEST(__field(0, 8, partition_id)
|
||||
)
|
||||
#include I(REQUEST_END)
|
||||
|
||||
#ifdef ENABLE_EVENTS_COUNTERINFO_V6
|
||||
/*
|
||||
* Not available for counter_info_version >= 0x8, use
|
||||
* run_instruction_cycles_by_partition(0x100) instead.
|
||||
@@ -91,6 +92,7 @@ REQUEST(__field(0, 8, partition_id)
|
||||
__count(0x10, 8, cycles)
|
||||
)
|
||||
#include I(REQUEST_END)
|
||||
#endif
|
||||
|
||||
#define REQUEST_NAME system_performance_capabilities
|
||||
#define REQUEST_NUM 0x40
|
||||
@@ -102,6 +104,7 @@ REQUEST(__field(0, 1, perf_collect_privileged)
|
||||
)
|
||||
#include I(REQUEST_END)
|
||||
|
||||
#ifdef ENABLE_EVENTS_COUNTERINFO_V6
|
||||
#define REQUEST_NAME processor_bus_utilization_abc_links
|
||||
#define REQUEST_NUM 0x50
|
||||
#define REQUEST_IDX_KIND "hw_chip_id=?"
|
||||
@@ -193,6 +196,7 @@ REQUEST(__field(0, 4, phys_processor_idx)
|
||||
__count(0x28, 8, instructions_completed)
|
||||
)
|
||||
#include I(REQUEST_END)
|
||||
#endif
|
||||
|
||||
/* Processor_core_power_mode (0x95) skipped, no counters */
|
||||
/* Affinity_domain_information_by_virtual_processor (0xA0) skipped,
|
||||
|
||||
@@ -74,7 +74,7 @@ static struct attribute_group format_group = {
|
||||
|
||||
static struct attribute_group event_group = {
|
||||
.name = "events",
|
||||
.attrs = hv_gpci_event_attrs,
|
||||
/* .attrs is set in init */
|
||||
};
|
||||
|
||||
#define HV_CAPS_ATTR(_name, _format) \
|
||||
@@ -292,6 +292,7 @@ static int hv_gpci_init(void)
|
||||
int r;
|
||||
unsigned long hret;
|
||||
struct hv_perf_caps caps;
|
||||
struct hv_gpci_request_buffer *arg;
|
||||
|
||||
hv_gpci_assert_offsets_correct();
|
||||
|
||||
@@ -310,6 +311,36 @@ static int hv_gpci_init(void)
|
||||
/* sampling not supported */
|
||||
h_gpci_pmu.capabilities |= PERF_PMU_CAP_NO_INTERRUPT;
|
||||
|
||||
arg = (void *)get_cpu_var(hv_gpci_reqb);
|
||||
memset(arg, 0, HGPCI_REQ_BUFFER_SIZE);
|
||||
|
||||
/*
|
||||
* hcall H_GET_PERF_COUNTER_INFO populates the output
|
||||
* counter_info_version value based on the system hypervisor.
|
||||
* Pass the counter request 0x10 corresponds to request type
|
||||
* 'Dispatch_timebase_by_processor', to get the supported
|
||||
* counter_info_version.
|
||||
*/
|
||||
arg->params.counter_request = cpu_to_be32(0x10);
|
||||
|
||||
r = plpar_hcall_norets(H_GET_PERF_COUNTER_INFO,
|
||||
virt_to_phys(arg), HGPCI_REQ_BUFFER_SIZE);
|
||||
if (r) {
|
||||
pr_devel("hcall failed, can't get supported counter_info_version: 0x%x\n", r);
|
||||
arg->params.counter_info_version_out = 0x8;
|
||||
}
|
||||
|
||||
/*
|
||||
* Use counter_info_version_out value to assign
|
||||
* required hv-gpci event list.
|
||||
*/
|
||||
if (arg->params.counter_info_version_out >= 0x8)
|
||||
event_group.attrs = hv_gpci_event_attrs;
|
||||
else
|
||||
event_group.attrs = hv_gpci_event_attrs_v6;
|
||||
|
||||
put_cpu_var(hv_gpci_reqb);
|
||||
|
||||
r = perf_pmu_register(&h_gpci_pmu, h_gpci_pmu.name, -1);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
@@ -52,6 +52,7 @@ enum {
|
||||
#define REQUEST_FILE "../hv-gpci-requests.h"
|
||||
#define NAME_LOWER hv_gpci
|
||||
#define NAME_UPPER HV_GPCI
|
||||
#define ENABLE_EVENTS_COUNTERINFO_V6
|
||||
#include "req-gen/perf.h"
|
||||
#undef REQUEST_FILE
|
||||
#undef NAME_LOWER
|
||||
|
||||
@@ -137,6 +137,26 @@ PMU_EVENT_ATTR_STRING( \
|
||||
#define REQUEST_(r_name, r_value, r_idx_1, r_fields) \
|
||||
r_fields
|
||||
|
||||
/* Generate event list for platforms with counter_info_version 0x6 or below */
|
||||
static __maybe_unused struct attribute *hv_gpci_event_attrs_v6[] = {
|
||||
#include REQUEST_FILE
|
||||
NULL
|
||||
};
|
||||
|
||||
/*
|
||||
* Based on getPerfCountInfo v1.018 documentation, some of the hv-gpci
|
||||
* events were deprecated for platform firmware that supports
|
||||
* counter_info_version 0x8 or above.
|
||||
* Those deprecated events are still part of platform firmware that
|
||||
* support counter_info_version 0x6 and below. As per the getPerfCountInfo
|
||||
* v1.018 documentation there is no counter_info_version 0x7.
|
||||
* Undefining macro ENABLE_EVENTS_COUNTERINFO_V6, to disable the addition of
|
||||
* deprecated events in "hv_gpci_event_attrs" attribute group, for platforms
|
||||
* that supports counter_info_version 0x8 or above.
|
||||
*/
|
||||
#undef ENABLE_EVENTS_COUNTERINFO_V6
|
||||
|
||||
/* Generate event list for platforms with counter_info_version 0x8 or above*/
|
||||
static __maybe_unused struct attribute *hv_gpci_event_attrs[] = {
|
||||
#include REQUEST_FILE
|
||||
NULL
|
||||
|
||||
@@ -531,6 +531,7 @@ static int mpc52xx_lpbfifo_probe(struct platform_device *op)
|
||||
err_bcom_rx_irq:
|
||||
bcom_gen_bd_rx_release(lpbfifo.bcom_rx_task);
|
||||
err_bcom_rx:
|
||||
free_irq(lpbfifo.irq, &lpbfifo);
|
||||
err_irq:
|
||||
iounmap(lpbfifo.regs);
|
||||
lpbfifo.regs = NULL;
|
||||
|
||||
@@ -111,7 +111,7 @@ static int __init of_fsl_spi_probe(char *type, char *compatible, u32 sysclk,
|
||||
|
||||
goto next;
|
||||
unreg:
|
||||
platform_device_del(pdev);
|
||||
platform_device_put(pdev);
|
||||
err:
|
||||
pr_err("%s: registration failed\n", np->full_name);
|
||||
next:
|
||||
|
||||
@@ -718,8 +718,9 @@ static int branch_setup_xol_ops(struct arch_uprobe *auprobe, struct insn *insn)
|
||||
switch (opc1) {
|
||||
case 0xeb: /* jmp 8 */
|
||||
case 0xe9: /* jmp 32 */
|
||||
case 0x90: /* prefix* + nop; same as jmp with .offs = 0 */
|
||||
break;
|
||||
case 0x90: /* prefix* + nop; same as jmp with .offs = 0 */
|
||||
goto setup;
|
||||
|
||||
case 0xe8: /* call relative */
|
||||
branch_clear_offset(auprobe, insn);
|
||||
@@ -748,6 +749,7 @@ static int branch_setup_xol_ops(struct arch_uprobe *auprobe, struct insn *insn)
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
|
||||
setup:
|
||||
auprobe->branch.opc1 = opc1;
|
||||
auprobe->branch.ilen = insn->length;
|
||||
auprobe->branch.offs = insn->immediate.value;
|
||||
|
||||
@@ -80,6 +80,7 @@ void xen_init_lock_cpu(int cpu)
|
||||
cpu, per_cpu(lock_kicker_irq, cpu));
|
||||
|
||||
name = kasprintf(GFP_KERNEL, "spinlock%d", cpu);
|
||||
per_cpu(irq_name, cpu) = name;
|
||||
irq = bind_ipi_to_irqhandler(XEN_SPIN_UNLOCK_VECTOR,
|
||||
cpu,
|
||||
dummy_handler,
|
||||
@@ -90,7 +91,6 @@ void xen_init_lock_cpu(int cpu)
|
||||
if (irq >= 0) {
|
||||
disable_irq(irq); /* make sure it's never delivered */
|
||||
per_cpu(lock_kicker_irq, cpu) = irq;
|
||||
per_cpu(irq_name, cpu) = name;
|
||||
}
|
||||
|
||||
printk("cpu %d spinlock event irq %d\n", cpu, irq);
|
||||
@@ -103,6 +103,8 @@ void xen_uninit_lock_cpu(int cpu)
|
||||
if (!xen_pvspin)
|
||||
return;
|
||||
|
||||
kfree(per_cpu(irq_name, cpu));
|
||||
per_cpu(irq_name, cpu) = NULL;
|
||||
/*
|
||||
* When booting the kernel with 'mitigations=auto,nosmt', the secondary
|
||||
* CPUs are not activated, and lock_kicker_irq is not initialized.
|
||||
@@ -113,8 +115,6 @@ void xen_uninit_lock_cpu(int cpu)
|
||||
|
||||
unbind_from_irqhandler(irq, NULL);
|
||||
per_cpu(lock_kicker_irq, cpu) = -1;
|
||||
kfree(per_cpu(irq_name, cpu));
|
||||
per_cpu(irq_name, cpu) = NULL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -380,7 +380,7 @@ static int blk_mq_register_hctx(struct blk_mq_hw_ctx *hctx)
|
||||
{
|
||||
struct request_queue *q = hctx->queue;
|
||||
struct blk_mq_ctx *ctx;
|
||||
int i, ret;
|
||||
int i, j, ret;
|
||||
|
||||
if (!hctx->nr_ctx)
|
||||
return 0;
|
||||
@@ -392,9 +392,16 @@ static int blk_mq_register_hctx(struct blk_mq_hw_ctx *hctx)
|
||||
hctx_for_each_ctx(hctx, ctx, i) {
|
||||
ret = kobject_add(&ctx->kobj, &hctx->kobj, "cpu%u", ctx->cpu);
|
||||
if (ret)
|
||||
break;
|
||||
goto out;
|
||||
}
|
||||
|
||||
return 0;
|
||||
out:
|
||||
hctx_for_each_ctx(hctx, ctx, j) {
|
||||
if (j < i)
|
||||
kobject_del(&ctx->kobj);
|
||||
}
|
||||
kobject_del(&hctx->kobj);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -254,6 +254,7 @@ void delete_partition(struct gendisk *disk, int partno)
|
||||
{
|
||||
struct disk_part_tbl *ptbl = disk->part_tbl;
|
||||
struct hd_struct *part;
|
||||
struct block_device *bdev;
|
||||
|
||||
if (partno >= ptbl->len)
|
||||
return;
|
||||
@@ -267,6 +268,11 @@ void delete_partition(struct gendisk *disk, int partno)
|
||||
kobject_put(part->holder_dir);
|
||||
device_del(part_to_dev(part));
|
||||
|
||||
bdev = bdget(part_devt(part));
|
||||
if (bdev) {
|
||||
remove_inode_hash(bdev->bd_inode);
|
||||
bdput(bdev);
|
||||
}
|
||||
hd_struct_kill(part);
|
||||
}
|
||||
|
||||
|
||||
@@ -547,7 +547,7 @@ acpi_ds_call_control_method(struct acpi_thread_state *thread,
|
||||
info = ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_evaluate_info));
|
||||
if (!info) {
|
||||
status = AE_NO_MEMORY;
|
||||
goto cleanup;
|
||||
goto pop_walk_state;
|
||||
}
|
||||
|
||||
info->parameters = &this_walk_state->operands[0];
|
||||
@@ -559,7 +559,7 @@ acpi_ds_call_control_method(struct acpi_thread_state *thread,
|
||||
|
||||
ACPI_FREE(info);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto cleanup;
|
||||
goto pop_walk_state;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -591,6 +591,12 @@ acpi_ds_call_control_method(struct acpi_thread_state *thread,
|
||||
|
||||
return_ACPI_STATUS(status);
|
||||
|
||||
pop_walk_state:
|
||||
|
||||
/* On error, pop the walk state to be deleted from thread */
|
||||
|
||||
acpi_ds_pop_walk_state(thread);
|
||||
|
||||
cleanup:
|
||||
|
||||
/* On error, we must terminate the method properly */
|
||||
|
||||
@@ -950,13 +950,6 @@ acpi_ut_copy_ipackage_to_ipackage(union acpi_operand_object *source_obj,
|
||||
status = acpi_ut_walk_package_tree(source_obj, dest_obj,
|
||||
acpi_ut_copy_ielement_to_ielement,
|
||||
walk_state);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
|
||||
/* On failure, delete the destination package object */
|
||||
|
||||
acpi_ut_remove_reference(dest_obj);
|
||||
}
|
||||
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
|
||||
@@ -440,13 +440,13 @@ static inline void btusb_free_frags(struct btusb_data *data)
|
||||
|
||||
spin_lock_irqsave(&data->rxlock, flags);
|
||||
|
||||
kfree_skb(data->evt_skb);
|
||||
dev_kfree_skb_irq(data->evt_skb);
|
||||
data->evt_skb = NULL;
|
||||
|
||||
kfree_skb(data->acl_skb);
|
||||
dev_kfree_skb_irq(data->acl_skb);
|
||||
data->acl_skb = NULL;
|
||||
|
||||
kfree_skb(data->sco_skb);
|
||||
dev_kfree_skb_irq(data->sco_skb);
|
||||
data->sco_skb = NULL;
|
||||
|
||||
spin_unlock_irqrestore(&data->rxlock, flags);
|
||||
|
||||
@@ -392,7 +392,7 @@ static void bcsp_pkt_cull(struct bcsp_struct *bcsp)
|
||||
i++;
|
||||
|
||||
__skb_unlink(skb, &bcsp->unack);
|
||||
kfree_skb(skb);
|
||||
dev_kfree_skb_irq(skb);
|
||||
}
|
||||
|
||||
if (skb_queue_empty(&bcsp->unack))
|
||||
|
||||
@@ -266,7 +266,7 @@ static void h5_pkt_cull(struct h5 *h5)
|
||||
break;
|
||||
|
||||
__skb_unlink(skb, &h5->unack);
|
||||
kfree_skb(skb);
|
||||
dev_kfree_skb_irq(skb);
|
||||
}
|
||||
|
||||
if (skb_queue_empty(&h5->unack))
|
||||
|
||||
@@ -731,7 +731,7 @@ static int qca_enqueue(struct hci_uart *hu, struct sk_buff *skb)
|
||||
default:
|
||||
BT_ERR("Illegal tx state: %d (losing packet)",
|
||||
qca->tx_ibs_state);
|
||||
kfree_skb(skb);
|
||||
dev_kfree_skb_irq(skb);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -143,15 +143,19 @@ static int __init mod_init(void)
|
||||
found:
|
||||
err = pci_read_config_dword(pdev, 0x58, &pmbase);
|
||||
if (err)
|
||||
return err;
|
||||
goto put_dev;
|
||||
|
||||
pmbase &= 0x0000FF00;
|
||||
if (pmbase == 0)
|
||||
return -EIO;
|
||||
if (pmbase == 0) {
|
||||
err = -EIO;
|
||||
goto put_dev;
|
||||
}
|
||||
|
||||
priv = kzalloc(sizeof(*priv), GFP_KERNEL);
|
||||
if (!priv)
|
||||
return -ENOMEM;
|
||||
if (!priv) {
|
||||
err = -ENOMEM;
|
||||
goto put_dev;
|
||||
}
|
||||
|
||||
if (!request_region(pmbase + PMBASE_OFFSET, PMBASE_SIZE, DRV_NAME)) {
|
||||
dev_err(&pdev->dev, DRV_NAME " region 0x%x already in use!\n",
|
||||
@@ -185,6 +189,8 @@ err_iomap:
|
||||
release_region(pmbase + PMBASE_OFFSET, PMBASE_SIZE);
|
||||
out:
|
||||
kfree(priv);
|
||||
put_dev:
|
||||
pci_dev_put(pdev);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -200,6 +206,8 @@ static void __exit mod_exit(void)
|
||||
|
||||
release_region(priv->pmbase + PMBASE_OFFSET, PMBASE_SIZE);
|
||||
|
||||
pci_dev_put(priv->pcidev);
|
||||
|
||||
kfree(priv);
|
||||
}
|
||||
|
||||
|
||||
@@ -51,6 +51,10 @@ static const struct pci_device_id pci_tbl[] = {
|
||||
};
|
||||
MODULE_DEVICE_TABLE(pci, pci_tbl);
|
||||
|
||||
struct amd_geode_priv {
|
||||
struct pci_dev *pcidev;
|
||||
void __iomem *membase;
|
||||
};
|
||||
|
||||
static int geode_rng_data_read(struct hwrng *rng, u32 *data)
|
||||
{
|
||||
@@ -90,6 +94,7 @@ static int __init mod_init(void)
|
||||
const struct pci_device_id *ent;
|
||||
void __iomem *mem;
|
||||
unsigned long rng_base;
|
||||
struct amd_geode_priv *priv;
|
||||
|
||||
for_each_pci_dev(pdev) {
|
||||
ent = pci_match_id(pci_tbl, pdev);
|
||||
@@ -97,17 +102,26 @@ static int __init mod_init(void)
|
||||
goto found;
|
||||
}
|
||||
/* Device not found. */
|
||||
goto out;
|
||||
return err;
|
||||
|
||||
found:
|
||||
priv = kzalloc(sizeof(*priv), GFP_KERNEL);
|
||||
if (!priv) {
|
||||
err = -ENOMEM;
|
||||
goto put_dev;
|
||||
}
|
||||
|
||||
rng_base = pci_resource_start(pdev, 0);
|
||||
if (rng_base == 0)
|
||||
goto out;
|
||||
goto free_priv;
|
||||
err = -ENOMEM;
|
||||
mem = ioremap(rng_base, 0x58);
|
||||
if (!mem)
|
||||
goto out;
|
||||
geode_rng.priv = (unsigned long)mem;
|
||||
goto free_priv;
|
||||
|
||||
geode_rng.priv = (unsigned long)priv;
|
||||
priv->membase = mem;
|
||||
priv->pcidev = pdev;
|
||||
|
||||
pr_info("AMD Geode RNG detected\n");
|
||||
err = hwrng_register(&geode_rng);
|
||||
@@ -116,20 +130,26 @@ found:
|
||||
err);
|
||||
goto err_unmap;
|
||||
}
|
||||
out:
|
||||
return err;
|
||||
|
||||
err_unmap:
|
||||
iounmap(mem);
|
||||
goto out;
|
||||
free_priv:
|
||||
kfree(priv);
|
||||
put_dev:
|
||||
pci_dev_put(pdev);
|
||||
return err;
|
||||
}
|
||||
|
||||
static void __exit mod_exit(void)
|
||||
{
|
||||
void __iomem *mem = (void __iomem *)geode_rng.priv;
|
||||
struct amd_geode_priv *priv;
|
||||
|
||||
priv = (struct amd_geode_priv *)geode_rng.priv;
|
||||
hwrng_unregister(&geode_rng);
|
||||
iounmap(mem);
|
||||
iounmap(priv->membase);
|
||||
pci_dev_put(priv->pcidev);
|
||||
kfree(priv);
|
||||
}
|
||||
|
||||
module_init(mod_init);
|
||||
|
||||
@@ -2930,12 +2930,16 @@ static void deliver_smi_err_response(ipmi_smi_t intf,
|
||||
struct ipmi_smi_msg *msg,
|
||||
unsigned char err)
|
||||
{
|
||||
int rv;
|
||||
msg->rsp[0] = msg->data[0] | 4;
|
||||
msg->rsp[1] = msg->data[1];
|
||||
msg->rsp[2] = err;
|
||||
msg->rsp_size = 3;
|
||||
/* It's an error, so it will never requeue, no need to check return. */
|
||||
handle_one_recv_msg(intf, msg);
|
||||
|
||||
/* This will never requeue, but it may ask us to free the message. */
|
||||
rv = handle_one_recv_msg(intf, msg);
|
||||
if (rv == 0)
|
||||
ipmi_free_smi_msg(msg);
|
||||
}
|
||||
|
||||
static void cleanup_smi_msgs(ipmi_smi_t intf)
|
||||
|
||||
@@ -957,6 +957,7 @@ struct clk *rockchip_clk_register_pll(struct rockchip_clk_provider *ctx,
|
||||
return mux_clk;
|
||||
|
||||
err_pll:
|
||||
kfree(pll->rate_table);
|
||||
clk_unregister(mux_clk);
|
||||
mux_clk = pll_clk;
|
||||
err_mux:
|
||||
|
||||
@@ -948,9 +948,10 @@ static void __init st_of_quadfs_setup(struct device_node *np,
|
||||
|
||||
clk = st_clk_register_quadfs_pll(pll_name, clk_parent_name, data,
|
||||
reg, lock);
|
||||
if (IS_ERR(clk))
|
||||
if (IS_ERR(clk)) {
|
||||
kfree(lock);
|
||||
goto err_exit;
|
||||
else
|
||||
} else
|
||||
pr_debug("%s: parent %s rate %u\n",
|
||||
__clk_get_name(clk),
|
||||
__clk_get_name(clk_get_parent(clk)),
|
||||
|
||||
@@ -218,6 +218,6 @@ int dt_init_idle_driver(struct cpuidle_driver *drv,
|
||||
* also be 0 on platforms with missing DT idle states or legacy DT
|
||||
* configuration predating the DT idle states bindings.
|
||||
*/
|
||||
return i;
|
||||
return state_idx - start_idx;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(dt_init_idle_driver);
|
||||
|
||||
@@ -359,12 +359,16 @@ static int img_hash_dma_init(struct img_hash_dev *hdev)
|
||||
static void img_hash_dma_task(unsigned long d)
|
||||
{
|
||||
struct img_hash_dev *hdev = (struct img_hash_dev *)d;
|
||||
struct img_hash_request_ctx *ctx = ahash_request_ctx(hdev->req);
|
||||
struct img_hash_request_ctx *ctx;
|
||||
u8 *addr;
|
||||
size_t nbytes, bleft, wsend, len, tbc;
|
||||
struct scatterlist tsg;
|
||||
|
||||
if (!hdev->req || !ctx->sg)
|
||||
if (!hdev->req)
|
||||
return;
|
||||
|
||||
ctx = ahash_request_ctx(hdev->req);
|
||||
if (!ctx->sg)
|
||||
return;
|
||||
|
||||
addr = sg_virt(ctx->sg);
|
||||
|
||||
@@ -1271,6 +1271,7 @@ struct n2_hash_tmpl {
|
||||
const u32 *hash_init;
|
||||
u8 hw_op_hashsz;
|
||||
u8 digest_size;
|
||||
u8 statesize;
|
||||
u8 block_size;
|
||||
u8 auth_type;
|
||||
u8 hmac_type;
|
||||
@@ -1302,6 +1303,7 @@ static const struct n2_hash_tmpl hash_tmpls[] = {
|
||||
.hmac_type = AUTH_TYPE_HMAC_MD5,
|
||||
.hw_op_hashsz = MD5_DIGEST_SIZE,
|
||||
.digest_size = MD5_DIGEST_SIZE,
|
||||
.statesize = sizeof(struct md5_state),
|
||||
.block_size = MD5_HMAC_BLOCK_SIZE },
|
||||
{ .name = "sha1",
|
||||
.hash_zero = sha1_zero_message_hash,
|
||||
@@ -1310,6 +1312,7 @@ static const struct n2_hash_tmpl hash_tmpls[] = {
|
||||
.hmac_type = AUTH_TYPE_HMAC_SHA1,
|
||||
.hw_op_hashsz = SHA1_DIGEST_SIZE,
|
||||
.digest_size = SHA1_DIGEST_SIZE,
|
||||
.statesize = sizeof(struct sha1_state),
|
||||
.block_size = SHA1_BLOCK_SIZE },
|
||||
{ .name = "sha256",
|
||||
.hash_zero = sha256_zero_message_hash,
|
||||
@@ -1318,6 +1321,7 @@ static const struct n2_hash_tmpl hash_tmpls[] = {
|
||||
.hmac_type = AUTH_TYPE_HMAC_SHA256,
|
||||
.hw_op_hashsz = SHA256_DIGEST_SIZE,
|
||||
.digest_size = SHA256_DIGEST_SIZE,
|
||||
.statesize = sizeof(struct sha256_state),
|
||||
.block_size = SHA256_BLOCK_SIZE },
|
||||
{ .name = "sha224",
|
||||
.hash_zero = sha224_zero_message_hash,
|
||||
@@ -1326,6 +1330,7 @@ static const struct n2_hash_tmpl hash_tmpls[] = {
|
||||
.hmac_type = AUTH_TYPE_RESERVED,
|
||||
.hw_op_hashsz = SHA256_DIGEST_SIZE,
|
||||
.digest_size = SHA224_DIGEST_SIZE,
|
||||
.statesize = sizeof(struct sha256_state),
|
||||
.block_size = SHA224_BLOCK_SIZE },
|
||||
};
|
||||
#define NUM_HASH_TMPLS ARRAY_SIZE(hash_tmpls)
|
||||
@@ -1465,6 +1470,7 @@ static int __n2_register_one_ahash(const struct n2_hash_tmpl *tmpl)
|
||||
|
||||
halg = &ahash->halg;
|
||||
halg->digestsize = tmpl->digest_size;
|
||||
halg->statesize = tmpl->statesize;
|
||||
|
||||
base = &halg->base;
|
||||
snprintf(base->cra_name, CRYPTO_MAX_ALG_NAME, "%s", tmpl->name);
|
||||
|
||||
@@ -109,6 +109,12 @@ static char dio_no_name[] = { 0 };
|
||||
|
||||
#endif /* CONFIG_DIO_CONSTANTS */
|
||||
|
||||
static void dio_dev_release(struct device *dev)
|
||||
{
|
||||
struct dio_dev *ddev = container_of(dev, typeof(struct dio_dev), dev);
|
||||
kfree(ddev);
|
||||
}
|
||||
|
||||
int __init dio_find(int deviceid)
|
||||
{
|
||||
/* Called to find a DIO device before the full bus scan has run.
|
||||
@@ -234,6 +240,7 @@ static int __init dio_init(void)
|
||||
dev->bus = &dio_bus;
|
||||
dev->dev.parent = &dio_bus.dev;
|
||||
dev->dev.bus = &dio_bus_type;
|
||||
dev->dev.release = dio_dev_release;
|
||||
dev->scode = scode;
|
||||
dev->resource.start = pa;
|
||||
dev->resource.end = pa + DIO_SIZE(scode, va);
|
||||
@@ -261,6 +268,7 @@ static int __init dio_init(void)
|
||||
if (error) {
|
||||
pr_err("DIO: Error registering device %s\n",
|
||||
dev->name);
|
||||
put_device(&dev->dev);
|
||||
continue;
|
||||
}
|
||||
error = dio_create_sysfs_dev_files(dev);
|
||||
|
||||
@@ -253,6 +253,7 @@ static bool amdgpu_atrm_get_bios(struct amdgpu_device *adev)
|
||||
|
||||
if (!found)
|
||||
return false;
|
||||
pci_dev_put(pdev);
|
||||
|
||||
adev->bios = kmalloc(size, GFP_KERNEL);
|
||||
if (!adev->bios) {
|
||||
|
||||
@@ -363,6 +363,9 @@ void drm_connector_cleanup(struct drm_connector *connector)
|
||||
mutex_destroy(&connector->mutex);
|
||||
|
||||
memset(connector, 0, sizeof(*connector));
|
||||
|
||||
if (dev->registered)
|
||||
drm_sysfs_hotplug_event(dev);
|
||||
}
|
||||
EXPORT_SYMBOL(drm_connector_cleanup);
|
||||
|
||||
|
||||
@@ -90,8 +90,9 @@ static int fsl_dcu_drm_connector_get_modes(struct drm_connector *connector)
|
||||
return num_modes;
|
||||
}
|
||||
|
||||
static int fsl_dcu_drm_connector_mode_valid(struct drm_connector *connector,
|
||||
struct drm_display_mode *mode)
|
||||
static enum drm_mode_status
|
||||
fsl_dcu_drm_connector_mode_valid(struct drm_connector *connector,
|
||||
struct drm_display_mode *mode)
|
||||
{
|
||||
if (mode->hdisplay & 0xf)
|
||||
return MODE_ERROR;
|
||||
|
||||
@@ -215,6 +215,7 @@ static bool radeon_atrm_get_bios(struct radeon_device *rdev)
|
||||
|
||||
if (!found)
|
||||
return false;
|
||||
pci_dev_put(pdev);
|
||||
|
||||
rdev->bios = kmalloc(size, GFP_KERNEL);
|
||||
if (!rdev->bios) {
|
||||
|
||||
@@ -296,7 +296,7 @@ static void sti_dvo_set_mode(struct drm_bridge *bridge,
|
||||
|
||||
DRM_DEBUG_DRIVER("\n");
|
||||
|
||||
memcpy(&dvo->mode, mode, sizeof(struct drm_display_mode));
|
||||
drm_mode_copy(&dvo->mode, mode);
|
||||
|
||||
/* According to the path used (main or aux), the dvo clocks should
|
||||
* have a different parent clock. */
|
||||
@@ -354,8 +354,9 @@ static int sti_dvo_connector_get_modes(struct drm_connector *connector)
|
||||
|
||||
#define CLK_TOLERANCE_HZ 50
|
||||
|
||||
static int sti_dvo_connector_mode_valid(struct drm_connector *connector,
|
||||
struct drm_display_mode *mode)
|
||||
static enum drm_mode_status
|
||||
sti_dvo_connector_mode_valid(struct drm_connector *connector,
|
||||
struct drm_display_mode *mode)
|
||||
{
|
||||
int target = mode->clock * 1000;
|
||||
int target_min = target - CLK_TOLERANCE_HZ;
|
||||
|
||||
@@ -528,7 +528,7 @@ static void sti_hda_set_mode(struct drm_bridge *bridge,
|
||||
|
||||
DRM_DEBUG_DRIVER("\n");
|
||||
|
||||
memcpy(&hda->mode, mode, sizeof(struct drm_display_mode));
|
||||
drm_mode_copy(&hda->mode, mode);
|
||||
|
||||
if (!hda_get_mode_idx(hda->mode, &mode_idx)) {
|
||||
DRM_ERROR("Undefined mode\n");
|
||||
@@ -606,8 +606,9 @@ static int sti_hda_connector_get_modes(struct drm_connector *connector)
|
||||
|
||||
#define CLK_TOLERANCE_HZ 50
|
||||
|
||||
static int sti_hda_connector_mode_valid(struct drm_connector *connector,
|
||||
struct drm_display_mode *mode)
|
||||
static enum drm_mode_status
|
||||
sti_hda_connector_mode_valid(struct drm_connector *connector,
|
||||
struct drm_display_mode *mode)
|
||||
{
|
||||
int target = mode->clock * 1000;
|
||||
int target_min = target - CLK_TOLERANCE_HZ;
|
||||
|
||||
@@ -848,7 +848,7 @@ static void sti_hdmi_set_mode(struct drm_bridge *bridge,
|
||||
DRM_DEBUG_DRIVER("\n");
|
||||
|
||||
/* Copy the drm display mode in the connector local structure */
|
||||
memcpy(&hdmi->mode, mode, sizeof(struct drm_display_mode));
|
||||
drm_mode_copy(&hdmi->mode, mode);
|
||||
|
||||
/* Update clock framerate according to the selected mode */
|
||||
ret = clk_set_rate(hdmi->clk_pix, mode->clock * 1000);
|
||||
@@ -906,8 +906,9 @@ fail:
|
||||
|
||||
#define CLK_TOLERANCE_HZ 50
|
||||
|
||||
static int sti_hdmi_connector_mode_valid(struct drm_connector *connector,
|
||||
struct drm_display_mode *mode)
|
||||
static enum drm_mode_status
|
||||
sti_hdmi_connector_mode_valid(struct drm_connector *connector,
|
||||
struct drm_display_mode *mode)
|
||||
{
|
||||
int target = mode->clock * 1000;
|
||||
int target_min = target - CLK_TOLERANCE_HZ;
|
||||
|
||||
@@ -301,7 +301,8 @@ void vmw_kms_cursor_snoop(struct vmw_surface *srf,
|
||||
if (cmd->dma.guest.ptr.offset % PAGE_SIZE ||
|
||||
box->x != 0 || box->y != 0 || box->z != 0 ||
|
||||
box->srcx != 0 || box->srcy != 0 || box->srcz != 0 ||
|
||||
box->d != 1 || box_count != 1) {
|
||||
box->d != 1 || box_count != 1 ||
|
||||
box->w > 64 || box->h > 64) {
|
||||
/* TODO handle none page aligned offsets */
|
||||
/* TODO handle more dst & src != 0 */
|
||||
/* TODO handle more then one copy */
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 and
|
||||
@@ -395,6 +396,8 @@
|
||||
#define A6XX_RBBM_PERFCTR_RBBM_SEL_2 0x509
|
||||
#define A6XX_RBBM_PERFCTR_RBBM_SEL_3 0x50A
|
||||
#define A6XX_RBBM_PERFCTR_GPU_BUSY_MASKED 0x50B
|
||||
#define A6XX_RBBM_PERFCTR_SRAM_INIT_CMD 0x50e
|
||||
#define A6XX_RBBM_PERFCTR_SRAM_INIT_STATUS 0x50f
|
||||
|
||||
#define A6XX_RBBM_ISDB_CNT 0x533
|
||||
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
/* Copyright (c) 2002,2007-2018,2020, The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 and
|
||||
@@ -1407,6 +1408,8 @@ static int adreno_probe(struct platform_device *pdev)
|
||||
adreno_debugfs_init(adreno_dev);
|
||||
adreno_profile_init(adreno_dev);
|
||||
|
||||
adreno_dev->perfcounter = false;
|
||||
|
||||
adreno_sysfs_init(adreno_dev);
|
||||
|
||||
kgsl_pwrscale_init(&pdev->dev, CONFIG_QCOM_ADRENO_DEFAULT_GOVERNOR);
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
/* Copyright (c) 2008-2018,2020, The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 and
|
||||
@@ -34,6 +35,9 @@
|
||||
#define DEVICE_3D_NAME "kgsl-3d"
|
||||
#define DEVICE_3D0_NAME "kgsl-3d0"
|
||||
|
||||
/* Index to preemption scratch buffer to store KMD postamble */
|
||||
#define KMD_POSTAMBLE_IDX 100
|
||||
|
||||
/* ADRENO_DEVICE - Given a kgsl_device return the adreno device struct */
|
||||
#define ADRENO_DEVICE(device) \
|
||||
container_of(device, struct adreno_device, dev)
|
||||
@@ -251,6 +255,9 @@ struct adreno_gpudev;
|
||||
/* Time to allow preemption to complete (in ms) */
|
||||
#define ADRENO_PREEMPT_TIMEOUT 10000
|
||||
|
||||
#define PREEMPT_SCRATCH_ADDR(dev, id) \
|
||||
((dev)->preempt.scratch.gpuaddr + (id * sizeof(u64)))
|
||||
|
||||
#define ADRENO_INT_BIT(a, _bit) (((a)->gpucore->gpudev->int_bits) ? \
|
||||
(adreno_get_int(a, _bit) < 0 ? 0 : \
|
||||
BIT(adreno_get_int(a, _bit))) : 0)
|
||||
@@ -287,6 +294,7 @@ enum adreno_preempt_states {
|
||||
* skipsaverestore: To skip saverestore during L1 preemption (for 6XX)
|
||||
* usesgmem: enable GMEM save/restore across preemption (for 6XX)
|
||||
* count: Track the number of preemptions triggered
|
||||
* @postamble_len: Number of dwords in KMD postamble pm4 packet
|
||||
*/
|
||||
struct adreno_preemption {
|
||||
atomic_t state;
|
||||
@@ -298,6 +306,7 @@ struct adreno_preemption {
|
||||
bool skipsaverestore;
|
||||
bool usesgmem;
|
||||
unsigned int count;
|
||||
u32 postamble_len;
|
||||
};
|
||||
|
||||
|
||||
@@ -546,6 +555,11 @@ struct adreno_device {
|
||||
bool gpuhtw_llc_slice_enable;
|
||||
unsigned int zap_loaded;
|
||||
unsigned int soc_hw_rev;
|
||||
/*
|
||||
* @perfcounter: Flag to clear perfcounters across contexts and
|
||||
* controls perfcounter ioctl read
|
||||
*/
|
||||
bool perfcounter;
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
/* Copyright (c) 2017-2018,2020, The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 and
|
||||
@@ -539,13 +540,27 @@ unsigned int a6xx_preemption_pre_ibsubmit(
|
||||
if (context) {
|
||||
struct adreno_context *drawctxt = ADRENO_CONTEXT(context);
|
||||
struct adreno_ringbuffer *rb = drawctxt->rb;
|
||||
uint64_t dest = adreno_dev->preempt.scratch.gpuaddr +
|
||||
sizeof(u64) * rb->id;
|
||||
uint64_t dest = PREEMPT_SCRATCH_ADDR(adreno_dev, rb->id);
|
||||
|
||||
*cmds++ = cp_mem_packet(adreno_dev, CP_MEM_WRITE, 2, 2);
|
||||
cmds += cp_gpuaddr(adreno_dev, cmds, dest);
|
||||
*cmds++ = lower_32_bits(gpuaddr);
|
||||
*cmds++ = upper_32_bits(gpuaddr);
|
||||
|
||||
/*
|
||||
* Add a KMD post amble to clear the perf counters during
|
||||
* preemption
|
||||
*/
|
||||
if (!adreno_dev->perfcounter) {
|
||||
u64 kmd_postamble_addr =
|
||||
PREEMPT_SCRATCH_ADDR(adreno_dev, KMD_POSTAMBLE_IDX);
|
||||
|
||||
*cmds++ = cp_type7_packet(CP_SET_AMBLE, 3);
|
||||
*cmds++ = lower_32_bits(kmd_postamble_addr);
|
||||
*cmds++ = upper_32_bits(kmd_postamble_addr);
|
||||
*cmds++ = ((CP_KMD_AMBLE_TYPE << 20) | GENMASK(22, 20))
|
||||
| (adreno_dev->preempt.postamble_len | GENMASK(19, 0));
|
||||
}
|
||||
}
|
||||
|
||||
return (unsigned int) (cmds - cmds_orig);
|
||||
@@ -558,8 +573,7 @@ unsigned int a6xx_preemption_post_ibsubmit(struct adreno_device *adreno_dev,
|
||||
struct adreno_ringbuffer *rb = adreno_dev->cur_rb;
|
||||
|
||||
if (rb) {
|
||||
uint64_t dest = adreno_dev->preempt.scratch.gpuaddr +
|
||||
sizeof(u64) * rb->id;
|
||||
uint64_t dest = PREEMPT_SCRATCH_ADDR(adreno_dev, rb->id);
|
||||
|
||||
*cmds++ = cp_mem_packet(adreno_dev, CP_MEM_WRITE, 2, 2);
|
||||
cmds += cp_gpuaddr(adreno_dev, cmds, dest);
|
||||
@@ -764,6 +778,33 @@ int a6xx_preemption_init(struct adreno_device *adreno_dev)
|
||||
addr += A6XX_CP_CTXRECORD_PREEMPTION_COUNTER_SIZE;
|
||||
}
|
||||
|
||||
/*
|
||||
* First 8 dwords of the preemption scratch buffer is used to store the
|
||||
* address for CP to save/restore VPC data. Reserve 11 dwords in the
|
||||
* preemption scratch buffer from index KMD_POSTAMBLE_IDX for KMD
|
||||
* postamble pm4 packets
|
||||
*/
|
||||
if (!adreno_dev->perfcounter) {
|
||||
u32 *postamble = preempt->scratch.hostptr +
|
||||
(KMD_POSTAMBLE_IDX * sizeof(u64));
|
||||
u32 count = 0;
|
||||
|
||||
postamble[count++] = cp_type7_packet(CP_REG_RMW, 3);
|
||||
postamble[count++] = A6XX_RBBM_PERFCTR_SRAM_INIT_CMD;
|
||||
postamble[count++] = 0x0;
|
||||
postamble[count++] = 0x1;
|
||||
|
||||
postamble[count++] = cp_type7_packet(CP_WAIT_REG_MEM, 6);
|
||||
postamble[count++] = 0x3;
|
||||
postamble[count++] = A6XX_RBBM_PERFCTR_SRAM_INIT_STATUS;
|
||||
postamble[count++] = 0x0;
|
||||
postamble[count++] = 0x1;
|
||||
postamble[count++] = 0x1;
|
||||
postamble[count++] = 0x0;
|
||||
|
||||
preempt->postamble_len = count;
|
||||
}
|
||||
|
||||
ret = a6xx_preemption_iommu_init(adreno_dev);
|
||||
|
||||
err:
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
/* Copyright (c) 2013-2018, The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 and
|
||||
@@ -260,6 +261,14 @@ static long adreno_ioctl_perfcounter_read_compat(
|
||||
struct kgsl_perfcounter_read_compat *read32 = data;
|
||||
struct kgsl_perfcounter_read read;
|
||||
|
||||
/*
|
||||
* When performance counter zapping is enabled, the counters are cleared
|
||||
* across context switches. Reading the counters when they are zapped is
|
||||
* not permitted.
|
||||
*/
|
||||
if (!adreno_dev->perfcounter)
|
||||
return -EPERM;
|
||||
|
||||
read.reads = (struct kgsl_perfcounter_read_group __user *)
|
||||
(uintptr_t)read32->reads;
|
||||
read.count = read32->count;
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
/* Copyright (c) 2002,2007-2017,2020 The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 and
|
||||
@@ -81,6 +82,14 @@ static long adreno_ioctl_perfcounter_read(struct kgsl_device_private *dev_priv,
|
||||
struct adreno_device *adreno_dev = ADRENO_DEVICE(dev_priv->device);
|
||||
struct kgsl_perfcounter_read *read = data;
|
||||
|
||||
/*
|
||||
* When performance counter zapping is enabled, the counters are cleared
|
||||
* across context switches. Reading the counters when they are zapped is
|
||||
* not permitted.
|
||||
*/
|
||||
if (!adreno_dev->perfcounter)
|
||||
return -EPERM;
|
||||
|
||||
return (long) adreno_perfcounter_read_group(adreno_dev, read->reads,
|
||||
read->count);
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
/* Copyright (c) 2002,2007-2017, The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 and
|
||||
@@ -13,6 +14,7 @@
|
||||
#include "adreno.h"
|
||||
#include "kgsl_sharedmem.h"
|
||||
#include "a3xx_reg.h"
|
||||
#include "a6xx_reg.h"
|
||||
#include "adreno_pm4types.h"
|
||||
|
||||
#define A5XX_PFP_PER_PROCESS_UCODE_VER 0x5FF064
|
||||
@@ -586,6 +588,12 @@ static unsigned int _adreno_iommu_set_pt_v2_a6xx(struct kgsl_device *device,
|
||||
cmds += _adreno_iommu_add_idle_cmds(adreno_dev, cmds);
|
||||
cmds += cp_wait_for_me(adreno_dev, cmds);
|
||||
|
||||
/* Clear performance counters during contect switches */
|
||||
if (!adreno_dev->perfcounter) {
|
||||
*cmds++ = cp_type4_packet(A6XX_RBBM_PERFCTR_SRAM_INIT_CMD, 1);
|
||||
*cmds++ = 0x1;
|
||||
}
|
||||
|
||||
/* CP switches the pagetable and flushes the Caches */
|
||||
*cmds++ = cp_packet(adreno_dev, CP_SMMU_TABLE_UPDATE, 4);
|
||||
*cmds++ = lower_32_bits(ttbr0);
|
||||
@@ -605,6 +613,17 @@ static unsigned int _adreno_iommu_set_pt_v2_a6xx(struct kgsl_device *device,
|
||||
|
||||
cmds += _adreno_iommu_add_idle_cmds(adreno_dev, cmds);
|
||||
|
||||
/* Wait for performance counter clear to finish */
|
||||
if (!adreno_dev->perfcounter) {
|
||||
*cmds++ = cp_type7_packet(CP_WAIT_REG_MEM, 6);
|
||||
*cmds++ = 0x3;
|
||||
*cmds++ = A6XX_RBBM_PERFCTR_SRAM_INIT_STATUS;
|
||||
*cmds++ = 0x0;
|
||||
*cmds++ = 0x1;
|
||||
*cmds++ = 0x1;
|
||||
*cmds++ = 0x0;
|
||||
}
|
||||
|
||||
return cmds - cmds_orig;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
/* Copyright (c) 2002,2007-2017, The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 and
|
||||
@@ -143,7 +144,8 @@ void adreno_perfcounter_restore(struct adreno_device *adreno_dev)
|
||||
struct adreno_perfcount_group *group;
|
||||
unsigned int counter, groupid;
|
||||
|
||||
if (counters == NULL)
|
||||
/* Do not save/restore if not requested */
|
||||
if (counters == NULL || !adreno_dev->perfcounter)
|
||||
return;
|
||||
|
||||
for (groupid = 0; groupid < counters->group_count; groupid++) {
|
||||
@@ -177,7 +179,8 @@ inline void adreno_perfcounter_save(struct adreno_device *adreno_dev)
|
||||
unsigned int counter, groupid;
|
||||
int ret = 0;
|
||||
|
||||
if (counters == NULL)
|
||||
/* Do not save/restore if not requested */
|
||||
if (counters == NULL || !adreno_dev->perfcounter)
|
||||
return;
|
||||
|
||||
if (gpudev->oob_set)
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
/* Copyright (c) 2002,2007-2017,2020 The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 and
|
||||
@@ -55,6 +56,9 @@
|
||||
/* switches SMMU pagetable, used on a5xx only */
|
||||
#define CP_SMMU_TABLE_UPDATE 0x53
|
||||
|
||||
/* Designate command streams to be executed before/after state restore */
|
||||
#define CP_SET_AMBLE 0x55
|
||||
|
||||
/* Set internal CP registers, used to indicate context save data addresses */
|
||||
#define CP_SET_PSEUDO_REGISTER 0x56
|
||||
|
||||
@@ -162,6 +166,9 @@
|
||||
#define CP_LOADSTATE_STATETYPE_SHIFT 0x00000000
|
||||
#define CP_LOADSTATE_EXTSRCADDR_SHIFT 0x00000002
|
||||
|
||||
/* Used to define amble type in SET_AMBLE packet to execute during preemption */
|
||||
#define CP_KMD_AMBLE_TYPE 3
|
||||
|
||||
static inline uint pm4_calc_odd_parity_bit(uint val)
|
||||
{
|
||||
return (0x9669 >> (0xf & ((val) ^
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
/* Copyright (c) 2002,2007-2020, The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 and
|
||||
@@ -552,7 +553,7 @@ adreno_ringbuffer_addcmds(struct adreno_ringbuffer *rb,
|
||||
|
||||
if (gpudev->preemption_pre_ibsubmit &&
|
||||
adreno_is_preemption_enabled(adreno_dev))
|
||||
total_sizedwords += 27;
|
||||
total_sizedwords += 31;
|
||||
|
||||
if (gpudev->preemption_post_ibsubmit &&
|
||||
adreno_is_preemption_enabled(adreno_dev))
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
/* Copyright (c) 2014-2018, The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 and
|
||||
@@ -348,6 +349,31 @@ static unsigned int _preempt_count_show(struct adreno_device *adreno_dev)
|
||||
return preempt->count;
|
||||
}
|
||||
|
||||
static unsigned int _perfcounter_show(struct adreno_device *adreno_dev)
|
||||
{
|
||||
return adreno_dev->perfcounter;
|
||||
}
|
||||
|
||||
static int _perfcounter_store(struct adreno_device *adreno_dev,
|
||||
unsigned int val)
|
||||
{
|
||||
struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
|
||||
|
||||
if (adreno_dev->perfcounter == val)
|
||||
return 0;
|
||||
|
||||
mutex_lock(&device->mutex);
|
||||
|
||||
/* Power down the GPU before changing the state */
|
||||
kgsl_pwrctrl_change_state(device, KGSL_STATE_SUSPEND);
|
||||
adreno_dev->perfcounter = val;
|
||||
kgsl_pwrctrl_change_state(device, KGSL_STATE_SLUMBER);
|
||||
|
||||
mutex_unlock(&device->mutex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static ssize_t _sysfs_store_u32(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
@@ -451,6 +477,7 @@ static ADRENO_SYSFS_BOOL(preemption);
|
||||
static ADRENO_SYSFS_BOOL(hwcg);
|
||||
static ADRENO_SYSFS_BOOL(throttling);
|
||||
static ADRENO_SYSFS_BOOL(ifpc);
|
||||
static ADRENO_SYSFS_BOOL(perfcounter);
|
||||
|
||||
|
||||
|
||||
@@ -473,6 +500,7 @@ static const struct device_attribute *_attr_list[] = {
|
||||
&adreno_attr_skipsaverestore.attr,
|
||||
&adreno_attr_ifpc.attr,
|
||||
&adreno_attr_preempt_count.attr,
|
||||
&adreno_attr_perfcounter.attr,
|
||||
NULL,
|
||||
};
|
||||
|
||||
@@ -630,8 +658,11 @@ int adreno_sysfs_init(struct adreno_device *adreno_dev)
|
||||
ret = kgsl_create_device_sysfs_files(device->dev, _attr_list);
|
||||
|
||||
/* Add the PPD directory and files */
|
||||
if (ret == 0)
|
||||
if (ret == 0) {
|
||||
/* Notify userspace */
|
||||
kobject_uevent(&device->dev->kobj, KOBJ_ADD);
|
||||
ppd_sysfs_init(adreno_dev);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -820,7 +820,10 @@
|
||||
#define USB_DEVICE_ID_ORTEK_WKB2000 0x2000
|
||||
|
||||
#define USB_VENDOR_ID_PLANTRONICS 0x047f
|
||||
#define USB_DEVICE_ID_PLANTRONICS_BLACKWIRE_3210_SERIES 0xc055
|
||||
#define USB_DEVICE_ID_PLANTRONICS_BLACKWIRE_3220_SERIES 0xc056
|
||||
#define USB_DEVICE_ID_PLANTRONICS_BLACKWIRE_3215_SERIES 0xc057
|
||||
#define USB_DEVICE_ID_PLANTRONICS_BLACKWIRE_3225_SERIES 0xc058
|
||||
|
||||
#define USB_VENDOR_ID_PANASONIC 0x04da
|
||||
#define USB_DEVICE_ID_PANABOARD_UBT780 0x1044
|
||||
|
||||
@@ -201,9 +201,18 @@ err:
|
||||
}
|
||||
|
||||
static const struct hid_device_id plantronics_devices[] = {
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_PLANTRONICS,
|
||||
USB_DEVICE_ID_PLANTRONICS_BLACKWIRE_3210_SERIES),
|
||||
.driver_data = PLT_QUIRK_DOUBLE_VOLUME_KEYS },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_PLANTRONICS,
|
||||
USB_DEVICE_ID_PLANTRONICS_BLACKWIRE_3220_SERIES),
|
||||
.driver_data = PLT_QUIRK_DOUBLE_VOLUME_KEYS },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_PLANTRONICS,
|
||||
USB_DEVICE_ID_PLANTRONICS_BLACKWIRE_3215_SERIES),
|
||||
.driver_data = PLT_QUIRK_DOUBLE_VOLUME_KEYS },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_PLANTRONICS,
|
||||
USB_DEVICE_ID_PLANTRONICS_BLACKWIRE_3225_SERIES),
|
||||
.driver_data = PLT_QUIRK_DOUBLE_VOLUME_KEYS },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_PLANTRONICS, HID_ANY_ID) },
|
||||
{ }
|
||||
};
|
||||
|
||||
@@ -67,7 +67,7 @@ struct hid_sensor_sample {
|
||||
u32 raw_len;
|
||||
} __packed;
|
||||
|
||||
static struct attribute hid_custom_attrs[] = {
|
||||
static struct attribute hid_custom_attrs[HID_CUSTOM_TOTAL_ATTRS] = {
|
||||
{.name = "name", .mode = S_IRUGO},
|
||||
{.name = "units", .mode = S_IRUGO},
|
||||
{.name = "unit-expo", .mode = S_IRUGO},
|
||||
|
||||
@@ -69,6 +69,9 @@ static int wacom_raw_event(struct hid_device *hdev, struct hid_report *report,
|
||||
{
|
||||
struct wacom *wacom = hid_get_drvdata(hdev);
|
||||
|
||||
if (wacom->wacom_wac.features.type == BOOTLOADER)
|
||||
return 0;
|
||||
|
||||
if (size > WACOM_PKGLEN_MAX)
|
||||
return 1;
|
||||
|
||||
@@ -2409,6 +2412,11 @@ static int wacom_probe(struct hid_device *hdev,
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if (features->type == BOOTLOADER) {
|
||||
hid_warn(hdev, "Using device in hidraw-only mode");
|
||||
return hid_hw_start(hdev, HID_CONNECT_HIDRAW);
|
||||
}
|
||||
|
||||
error = wacom_parse_and_register(wacom, false);
|
||||
if (error)
|
||||
goto fail;
|
||||
|
||||
@@ -3550,6 +3550,9 @@ static const struct wacom_features wacom_features_0x343 =
|
||||
static const struct wacom_features wacom_features_HID_ANY_ID =
|
||||
{ "Wacom HID", .type = HID_GENERIC, .oVid = HID_ANY_ID, .oPid = HID_ANY_ID };
|
||||
|
||||
static const struct wacom_features wacom_features_0x94 =
|
||||
{ "Wacom Bootloader", .type = BOOTLOADER };
|
||||
|
||||
#define USB_DEVICE_WACOM(prod) \
|
||||
HID_DEVICE(BUS_USB, HID_GROUP_WACOM, USB_VENDOR_ID_WACOM, prod),\
|
||||
.driver_data = (kernel_ulong_t)&wacom_features_##prod
|
||||
@@ -3623,6 +3626,7 @@ const struct hid_device_id wacom_ids[] = {
|
||||
{ USB_DEVICE_WACOM(0x84) },
|
||||
{ USB_DEVICE_WACOM(0x90) },
|
||||
{ USB_DEVICE_WACOM(0x93) },
|
||||
{ USB_DEVICE_WACOM(0x94) },
|
||||
{ USB_DEVICE_WACOM(0x97) },
|
||||
{ USB_DEVICE_WACOM(0x9A) },
|
||||
{ USB_DEVICE_WACOM(0x9F) },
|
||||
|
||||
@@ -154,6 +154,7 @@ enum {
|
||||
MTTPC,
|
||||
MTTPC_B,
|
||||
HID_GENERIC,
|
||||
BOOTLOADER,
|
||||
MAX_TYPE
|
||||
};
|
||||
|
||||
|
||||
@@ -540,8 +540,10 @@ static int ssi_probe(struct platform_device *pd)
|
||||
platform_set_drvdata(pd, ssi);
|
||||
|
||||
err = ssi_add_controller(ssi, pd);
|
||||
if (err < 0)
|
||||
if (err < 0) {
|
||||
hsi_put_controller(ssi);
|
||||
goto out1;
|
||||
}
|
||||
|
||||
pm_runtime_enable(&pd->dev);
|
||||
|
||||
@@ -574,9 +576,9 @@ out3:
|
||||
device_for_each_child(&pd->dev, NULL, ssi_remove_ports);
|
||||
out2:
|
||||
ssi_remove_controller(ssi);
|
||||
pm_runtime_disable(&pd->dev);
|
||||
out1:
|
||||
platform_set_drvdata(pd, NULL);
|
||||
pm_runtime_disable(&pd->dev);
|
||||
|
||||
return err;
|
||||
}
|
||||
@@ -667,7 +669,13 @@ static int __init ssi_init(void) {
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return platform_driver_register(&ssi_port_pdriver);
|
||||
ret = platform_driver_register(&ssi_port_pdriver);
|
||||
if (ret) {
|
||||
platform_driver_unregister(&ssi_pdriver);
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
module_init(ssi_init);
|
||||
|
||||
|
||||
@@ -495,6 +495,9 @@ static int ismt_access(struct i2c_adapter *adap, u16 addr,
|
||||
if (read_write == I2C_SMBUS_WRITE) {
|
||||
/* Block Write */
|
||||
dev_dbg(dev, "I2C_SMBUS_BLOCK_DATA: WRITE\n");
|
||||
if (data->block[0] < 1 || data->block[0] > I2C_SMBUS_BLOCK_MAX)
|
||||
return -EINVAL;
|
||||
|
||||
dma_size = data->block[0] + 1;
|
||||
dma_direction = DMA_TO_DEVICE;
|
||||
desc->wr_len_cmd = dma_size;
|
||||
|
||||
@@ -101,7 +101,7 @@ static int ce4100_i2c_probe(struct pci_dev *dev,
|
||||
int i;
|
||||
struct ce4100_devices *sds;
|
||||
|
||||
ret = pci_enable_device_mem(dev);
|
||||
ret = pcim_enable_device(dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -110,10 +110,8 @@ static int ce4100_i2c_probe(struct pci_dev *dev,
|
||||
return -EINVAL;
|
||||
}
|
||||
sds = kzalloc(sizeof(*sds), GFP_KERNEL);
|
||||
if (!sds) {
|
||||
ret = -ENOMEM;
|
||||
goto err_mem;
|
||||
}
|
||||
if (!sds)
|
||||
return -ENOMEM;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(sds->pdev); i++) {
|
||||
sds->pdev[i] = add_i2c_device(dev, i);
|
||||
@@ -129,8 +127,6 @@ static int ce4100_i2c_probe(struct pci_dev *dev,
|
||||
|
||||
err_dev_add:
|
||||
kfree(sds);
|
||||
err_mem:
|
||||
pci_disable_device(dev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -282,10 +282,10 @@ int ad_sigma_delta_single_conversion(struct iio_dev *indio_dev,
|
||||
unsigned int sample, raw_sample;
|
||||
int ret = 0;
|
||||
|
||||
if (iio_buffer_enabled(indio_dev))
|
||||
return -EBUSY;
|
||||
ret = iio_device_claim_direct_mode(indio_dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
mutex_lock(&indio_dev->mlock);
|
||||
ad_sigma_delta_set_channel(sigma_delta, chan->address);
|
||||
|
||||
spi_bus_lock(sigma_delta->spi->master);
|
||||
@@ -319,7 +319,7 @@ out:
|
||||
ad_sigma_delta_set_mode(sigma_delta, AD_SD_MODE_IDLE);
|
||||
sigma_delta->bus_locked = false;
|
||||
spi_bus_unlock(sigma_delta->spi->master);
|
||||
mutex_unlock(&indio_dev->mlock);
|
||||
iio_device_release_direct_mode(indio_dev);
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -42,6 +42,11 @@ static const struct nla_policy ipoib_policy[IFLA_IPOIB_MAX + 1] = {
|
||||
[IFLA_IPOIB_UMCAST] = { .type = NLA_U16 },
|
||||
};
|
||||
|
||||
static unsigned int ipoib_get_max_num_queues(void)
|
||||
{
|
||||
return min_t(unsigned int, num_possible_cpus(), 128);
|
||||
}
|
||||
|
||||
static int ipoib_fill_info(struct sk_buff *skb, const struct net_device *dev)
|
||||
{
|
||||
struct ipoib_dev_priv *priv = netdev_priv(dev);
|
||||
@@ -167,6 +172,8 @@ static struct rtnl_link_ops ipoib_link_ops __read_mostly = {
|
||||
.dellink = ipoib_unregister_child_dev,
|
||||
.get_size = ipoib_get_size,
|
||||
.fill_info = ipoib_fill_info,
|
||||
.get_num_rx_queues = ipoib_get_max_num_queues,
|
||||
.get_num_tx_queues = ipoib_get_max_num_queues,
|
||||
};
|
||||
|
||||
int __init ipoib_netlink_init(void)
|
||||
|
||||
@@ -1088,14 +1088,12 @@ static int elants_i2c_power_on(struct elants_data *ts)
|
||||
if (IS_ERR_OR_NULL(ts->reset_gpio))
|
||||
return 0;
|
||||
|
||||
gpiod_set_value_cansleep(ts->reset_gpio, 1);
|
||||
|
||||
error = regulator_enable(ts->vcc33);
|
||||
if (error) {
|
||||
dev_err(&ts->client->dev,
|
||||
"failed to enable vcc33 regulator: %d\n",
|
||||
error);
|
||||
goto release_reset_gpio;
|
||||
return error;
|
||||
}
|
||||
|
||||
error = regulator_enable(ts->vccio);
|
||||
@@ -1104,7 +1102,7 @@ static int elants_i2c_power_on(struct elants_data *ts)
|
||||
"failed to enable vccio regulator: %d\n",
|
||||
error);
|
||||
regulator_disable(ts->vcc33);
|
||||
goto release_reset_gpio;
|
||||
return error;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1113,7 +1111,6 @@ static int elants_i2c_power_on(struct elants_data *ts)
|
||||
*/
|
||||
udelay(ELAN_POWERON_DELAY_USEC);
|
||||
|
||||
release_reset_gpio:
|
||||
gpiod_set_value_cansleep(ts->reset_gpio, 0);
|
||||
if (error)
|
||||
return error;
|
||||
@@ -1182,7 +1179,7 @@ static int elants_i2c_probe(struct i2c_client *client,
|
||||
return error;
|
||||
}
|
||||
|
||||
ts->reset_gpio = devm_gpiod_get(&client->dev, "reset", GPIOD_OUT_LOW);
|
||||
ts->reset_gpio = devm_gpiod_get(&client->dev, "reset", GPIOD_OUT_HIGH);
|
||||
if (IS_ERR(ts->reset_gpio)) {
|
||||
error = PTR_ERR(ts->reset_gpio);
|
||||
|
||||
|
||||
@@ -2684,6 +2684,13 @@ static int __init parse_ivrs_acpihid(char *str)
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Ignore leading zeroes after ':', so e.g., AMDI0095:00
|
||||
* will match AMDI0095:0 in the second strcmp in acpi_dev_hid_uid_match
|
||||
*/
|
||||
while (*uid == '0' && *(uid + 1))
|
||||
uid++;
|
||||
|
||||
i = early_acpihid_map_size++;
|
||||
memcpy(early_acpihid_map[i].hid, hid, strlen(hid));
|
||||
memcpy(early_acpihid_map[i].uid, uid, strlen(uid));
|
||||
|
||||
@@ -1131,7 +1131,7 @@ static int fsl_pamu_probe(struct platform_device *pdev)
|
||||
ret = create_csd(ppaact_phys, mem_size, csd_port_id);
|
||||
if (ret) {
|
||||
dev_err(dev, "could not create coherence subdomain\n");
|
||||
return ret;
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -112,7 +112,7 @@ static int gic_probe(struct platform_device *pdev)
|
||||
|
||||
pm_runtime_enable(dev);
|
||||
|
||||
ret = pm_runtime_get_sync(dev);
|
||||
ret = pm_runtime_resume_and_get(dev);
|
||||
if (ret < 0)
|
||||
goto rpm_disable;
|
||||
|
||||
|
||||
@@ -3234,6 +3234,7 @@ static int
|
||||
hfcm_l1callback(struct dchannel *dch, u_int cmd)
|
||||
{
|
||||
struct hfc_multi *hc = dch->hw;
|
||||
struct sk_buff_head free_queue;
|
||||
u_long flags;
|
||||
|
||||
switch (cmd) {
|
||||
@@ -3262,6 +3263,7 @@ hfcm_l1callback(struct dchannel *dch, u_int cmd)
|
||||
l1_event(dch->l1, HW_POWERUP_IND);
|
||||
break;
|
||||
case HW_DEACT_REQ:
|
||||
__skb_queue_head_init(&free_queue);
|
||||
/* start deactivation */
|
||||
spin_lock_irqsave(&hc->lock, flags);
|
||||
if (hc->ctype == HFC_TYPE_E1) {
|
||||
@@ -3281,20 +3283,21 @@ hfcm_l1callback(struct dchannel *dch, u_int cmd)
|
||||
plxsd_checksync(hc, 0);
|
||||
}
|
||||
}
|
||||
skb_queue_purge(&dch->squeue);
|
||||
skb_queue_splice_init(&dch->squeue, &free_queue);
|
||||
if (dch->tx_skb) {
|
||||
dev_kfree_skb(dch->tx_skb);
|
||||
__skb_queue_tail(&free_queue, dch->tx_skb);
|
||||
dch->tx_skb = NULL;
|
||||
}
|
||||
dch->tx_idx = 0;
|
||||
if (dch->rx_skb) {
|
||||
dev_kfree_skb(dch->rx_skb);
|
||||
__skb_queue_tail(&free_queue, dch->rx_skb);
|
||||
dch->rx_skb = NULL;
|
||||
}
|
||||
test_and_clear_bit(FLG_TX_BUSY, &dch->Flags);
|
||||
if (test_and_clear_bit(FLG_BUSY_TIMER, &dch->Flags))
|
||||
del_timer(&dch->timer);
|
||||
spin_unlock_irqrestore(&hc->lock, flags);
|
||||
__skb_queue_purge(&free_queue);
|
||||
break;
|
||||
case HW_POWERUP_REQ:
|
||||
spin_lock_irqsave(&hc->lock, flags);
|
||||
@@ -3401,6 +3404,9 @@ handle_dmsg(struct mISDNchannel *ch, struct sk_buff *skb)
|
||||
case PH_DEACTIVATE_REQ:
|
||||
test_and_clear_bit(FLG_L2_ACTIVATED, &dch->Flags);
|
||||
if (dch->dev.D.protocol != ISDN_P_TE_S0) {
|
||||
struct sk_buff_head free_queue;
|
||||
|
||||
__skb_queue_head_init(&free_queue);
|
||||
spin_lock_irqsave(&hc->lock, flags);
|
||||
if (debug & DEBUG_HFCMULTI_MSG)
|
||||
printk(KERN_DEBUG
|
||||
@@ -3422,14 +3428,14 @@ handle_dmsg(struct mISDNchannel *ch, struct sk_buff *skb)
|
||||
/* deactivate */
|
||||
dch->state = 1;
|
||||
}
|
||||
skb_queue_purge(&dch->squeue);
|
||||
skb_queue_splice_init(&dch->squeue, &free_queue);
|
||||
if (dch->tx_skb) {
|
||||
dev_kfree_skb(dch->tx_skb);
|
||||
__skb_queue_tail(&free_queue, dch->tx_skb);
|
||||
dch->tx_skb = NULL;
|
||||
}
|
||||
dch->tx_idx = 0;
|
||||
if (dch->rx_skb) {
|
||||
dev_kfree_skb(dch->rx_skb);
|
||||
__skb_queue_tail(&free_queue, dch->rx_skb);
|
||||
dch->rx_skb = NULL;
|
||||
}
|
||||
test_and_clear_bit(FLG_TX_BUSY, &dch->Flags);
|
||||
@@ -3441,6 +3447,7 @@ handle_dmsg(struct mISDNchannel *ch, struct sk_buff *skb)
|
||||
#endif
|
||||
ret = 0;
|
||||
spin_unlock_irqrestore(&hc->lock, flags);
|
||||
__skb_queue_purge(&free_queue);
|
||||
} else
|
||||
ret = l1_event(dch->l1, hh->prim);
|
||||
break;
|
||||
|
||||
@@ -1631,16 +1631,19 @@ hfcpci_l2l1D(struct mISDNchannel *ch, struct sk_buff *skb)
|
||||
test_and_clear_bit(FLG_L2_ACTIVATED, &dch->Flags);
|
||||
spin_lock_irqsave(&hc->lock, flags);
|
||||
if (hc->hw.protocol == ISDN_P_NT_S0) {
|
||||
struct sk_buff_head free_queue;
|
||||
|
||||
__skb_queue_head_init(&free_queue);
|
||||
/* prepare deactivation */
|
||||
Write_hfc(hc, HFCPCI_STATES, 0x40);
|
||||
skb_queue_purge(&dch->squeue);
|
||||
skb_queue_splice_init(&dch->squeue, &free_queue);
|
||||
if (dch->tx_skb) {
|
||||
dev_kfree_skb(dch->tx_skb);
|
||||
__skb_queue_tail(&free_queue, dch->tx_skb);
|
||||
dch->tx_skb = NULL;
|
||||
}
|
||||
dch->tx_idx = 0;
|
||||
if (dch->rx_skb) {
|
||||
dev_kfree_skb(dch->rx_skb);
|
||||
__skb_queue_tail(&free_queue, dch->rx_skb);
|
||||
dch->rx_skb = NULL;
|
||||
}
|
||||
test_and_clear_bit(FLG_TX_BUSY, &dch->Flags);
|
||||
@@ -1653,10 +1656,12 @@ hfcpci_l2l1D(struct mISDNchannel *ch, struct sk_buff *skb)
|
||||
hc->hw.mst_m &= ~HFCPCI_MASTER;
|
||||
Write_hfc(hc, HFCPCI_MST_MODE, hc->hw.mst_m);
|
||||
ret = 0;
|
||||
spin_unlock_irqrestore(&hc->lock, flags);
|
||||
__skb_queue_purge(&free_queue);
|
||||
} else {
|
||||
ret = l1_event(dch->l1, hh->prim);
|
||||
spin_unlock_irqrestore(&hc->lock, flags);
|
||||
}
|
||||
spin_unlock_irqrestore(&hc->lock, flags);
|
||||
break;
|
||||
}
|
||||
if (!ret)
|
||||
|
||||
@@ -337,20 +337,24 @@ hfcusb_l2l1D(struct mISDNchannel *ch, struct sk_buff *skb)
|
||||
test_and_clear_bit(FLG_L2_ACTIVATED, &dch->Flags);
|
||||
|
||||
if (hw->protocol == ISDN_P_NT_S0) {
|
||||
struct sk_buff_head free_queue;
|
||||
|
||||
__skb_queue_head_init(&free_queue);
|
||||
hfcsusb_ph_command(hw, HFC_L1_DEACTIVATE_NT);
|
||||
spin_lock_irqsave(&hw->lock, flags);
|
||||
skb_queue_purge(&dch->squeue);
|
||||
skb_queue_splice_init(&dch->squeue, &free_queue);
|
||||
if (dch->tx_skb) {
|
||||
dev_kfree_skb(dch->tx_skb);
|
||||
__skb_queue_tail(&free_queue, dch->tx_skb);
|
||||
dch->tx_skb = NULL;
|
||||
}
|
||||
dch->tx_idx = 0;
|
||||
if (dch->rx_skb) {
|
||||
dev_kfree_skb(dch->rx_skb);
|
||||
__skb_queue_tail(&free_queue, dch->rx_skb);
|
||||
dch->rx_skb = NULL;
|
||||
}
|
||||
test_and_clear_bit(FLG_TX_BUSY, &dch->Flags);
|
||||
spin_unlock_irqrestore(&hw->lock, flags);
|
||||
__skb_queue_purge(&free_queue);
|
||||
#ifdef FIXME
|
||||
if (test_and_clear_bit(FLG_L1_BUSY, &dch->Flags))
|
||||
dchannel_sched_event(&hc->dch, D_CLEARBUSY);
|
||||
@@ -1340,7 +1344,7 @@ tx_iso_complete(struct urb *urb)
|
||||
printk("\n");
|
||||
}
|
||||
|
||||
dev_kfree_skb(tx_skb);
|
||||
dev_consume_skb_irq(tx_skb);
|
||||
tx_skb = NULL;
|
||||
if (fifo->dch && get_next_dframe(fifo->dch))
|
||||
tx_skb = fifo->dch->tx_skb;
|
||||
|
||||
@@ -106,6 +106,10 @@ int macio_init(void)
|
||||
return -ENXIO;
|
||||
}
|
||||
adb = ioremap(r.start, sizeof(struct adb_regs));
|
||||
if (!adb) {
|
||||
of_node_put(adbs);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
out_8(&adb->ctrl.r, 0);
|
||||
out_8(&adb->intr.r, 0);
|
||||
|
||||
@@ -425,7 +425,7 @@ static struct macio_dev * macio_add_one_device(struct macio_chip *chip,
|
||||
if (of_device_register(&dev->ofdev) != 0) {
|
||||
printk(KERN_DEBUG"macio: device registration error for %s!\n",
|
||||
dev_name(&dev->ofdev.dev));
|
||||
kfree(dev);
|
||||
put_device(&dev->ofdev.dev);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
@@ -74,8 +74,10 @@ static int mcb_probe(struct device *dev)
|
||||
|
||||
get_device(dev);
|
||||
ret = mdrv->probe(mdev, found_id);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
module_put(carrier_mod);
|
||||
put_device(dev);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -107,7 +107,7 @@ static int chameleon_parse_gdd(struct mcb_bus *bus,
|
||||
return 0;
|
||||
|
||||
err:
|
||||
mcb_free_dev(mdev);
|
||||
put_device(&mdev->dev);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -522,11 +522,13 @@ static int __create_persistent_data_objects(struct dm_cache_metadata *cmd,
|
||||
return r;
|
||||
}
|
||||
|
||||
static void __destroy_persistent_data_objects(struct dm_cache_metadata *cmd)
|
||||
static void __destroy_persistent_data_objects(struct dm_cache_metadata *cmd,
|
||||
bool destroy_bm)
|
||||
{
|
||||
dm_sm_destroy(cmd->metadata_sm);
|
||||
dm_tm_destroy(cmd->tm);
|
||||
dm_block_manager_destroy(cmd->bm);
|
||||
if (destroy_bm)
|
||||
dm_block_manager_destroy(cmd->bm);
|
||||
}
|
||||
|
||||
typedef unsigned long (*flags_mutator)(unsigned long);
|
||||
@@ -780,7 +782,7 @@ static struct dm_cache_metadata *lookup_or_open(struct block_device *bdev,
|
||||
cmd2 = lookup(bdev);
|
||||
if (cmd2) {
|
||||
mutex_unlock(&table_lock);
|
||||
__destroy_persistent_data_objects(cmd);
|
||||
__destroy_persistent_data_objects(cmd, true);
|
||||
kfree(cmd);
|
||||
return cmd2;
|
||||
}
|
||||
@@ -827,7 +829,7 @@ void dm_cache_metadata_close(struct dm_cache_metadata *cmd)
|
||||
mutex_unlock(&table_lock);
|
||||
|
||||
if (!cmd->fail_io)
|
||||
__destroy_persistent_data_objects(cmd);
|
||||
__destroy_persistent_data_objects(cmd, true);
|
||||
kfree(cmd);
|
||||
}
|
||||
}
|
||||
@@ -1551,14 +1553,53 @@ int dm_cache_metadata_needs_check(struct dm_cache_metadata *cmd, bool *result)
|
||||
|
||||
int dm_cache_metadata_abort(struct dm_cache_metadata *cmd)
|
||||
{
|
||||
int r;
|
||||
int r = -EINVAL;
|
||||
struct dm_block_manager *old_bm = NULL, *new_bm = NULL;
|
||||
|
||||
/* fail_io is double-checked with cmd->root_lock held below */
|
||||
if (unlikely(cmd->fail_io))
|
||||
return r;
|
||||
|
||||
/*
|
||||
* Replacement block manager (new_bm) is created and old_bm destroyed outside of
|
||||
* cmd root_lock to avoid ABBA deadlock that would result (due to life-cycle of
|
||||
* shrinker associated with the block manager's bufio client vs cmd root_lock).
|
||||
* - must take shrinker_rwsem without holding cmd->root_lock
|
||||
*/
|
||||
new_bm = dm_block_manager_create(cmd->bdev, DM_CACHE_METADATA_BLOCK_SIZE << SECTOR_SHIFT,
|
||||
CACHE_METADATA_CACHE_SIZE,
|
||||
CACHE_MAX_CONCURRENT_LOCKS);
|
||||
|
||||
WRITE_LOCK(cmd);
|
||||
__destroy_persistent_data_objects(cmd);
|
||||
r = __create_persistent_data_objects(cmd, false);
|
||||
if (cmd->fail_io) {
|
||||
WRITE_UNLOCK(cmd);
|
||||
goto out;
|
||||
}
|
||||
|
||||
__destroy_persistent_data_objects(cmd, false);
|
||||
old_bm = cmd->bm;
|
||||
if (IS_ERR(new_bm)) {
|
||||
DMERR("could not create block manager during abort");
|
||||
cmd->bm = NULL;
|
||||
r = PTR_ERR(new_bm);
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
cmd->bm = new_bm;
|
||||
r = __open_or_format_metadata(cmd, false);
|
||||
if (r) {
|
||||
cmd->bm = NULL;
|
||||
goto out_unlock;
|
||||
}
|
||||
new_bm = NULL;
|
||||
out_unlock:
|
||||
if (r)
|
||||
cmd->fail_io = true;
|
||||
WRITE_UNLOCK(cmd);
|
||||
dm_block_manager_destroy(old_bm);
|
||||
out:
|
||||
if (new_bm && !IS_ERR(new_bm))
|
||||
dm_block_manager_destroy(new_bm);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
@@ -1030,16 +1030,16 @@ static void abort_transaction(struct cache *cache)
|
||||
if (get_cache_mode(cache) >= CM_READ_ONLY)
|
||||
return;
|
||||
|
||||
if (dm_cache_metadata_set_needs_check(cache->cmd)) {
|
||||
DMERR("%s: failed to set 'needs_check' flag in metadata", dev_name);
|
||||
set_cache_mode(cache, CM_FAIL);
|
||||
}
|
||||
|
||||
DMERR_LIMIT("%s: aborting current metadata transaction", dev_name);
|
||||
if (dm_cache_metadata_abort(cache->cmd)) {
|
||||
DMERR("%s: failed to abort metadata transaction", dev_name);
|
||||
set_cache_mode(cache, CM_FAIL);
|
||||
}
|
||||
|
||||
if (dm_cache_metadata_set_needs_check(cache->cmd)) {
|
||||
DMERR("%s: failed to set 'needs_check' flag in metadata", dev_name);
|
||||
set_cache_mode(cache, CM_FAIL);
|
||||
}
|
||||
}
|
||||
|
||||
static void metadata_operation_failed(struct cache *cache, const char *op, int r)
|
||||
@@ -2321,6 +2321,7 @@ static void destroy(struct cache *cache)
|
||||
if (cache->prison)
|
||||
dm_bio_prison_destroy(cache->prison);
|
||||
|
||||
cancel_delayed_work_sync(&cache->waker);
|
||||
if (cache->wq)
|
||||
destroy_workqueue(cache->wq);
|
||||
|
||||
|
||||
@@ -661,6 +661,15 @@ static int __open_metadata(struct dm_pool_metadata *pmd)
|
||||
goto bad_cleanup_data_sm;
|
||||
}
|
||||
|
||||
/*
|
||||
* For pool metadata opening process, root setting is redundant
|
||||
* because it will be set again in __begin_transaction(). But dm
|
||||
* pool aborting process really needs to get last transaction's
|
||||
* root to avoid accessing broken btree.
|
||||
*/
|
||||
pmd->root = le64_to_cpu(disk_super->data_mapping_root);
|
||||
pmd->details_root = le64_to_cpu(disk_super->device_details_root);
|
||||
|
||||
__setup_btree_details(pmd);
|
||||
dm_bm_unlock(sblock);
|
||||
|
||||
|
||||
@@ -2935,6 +2935,8 @@ static void __pool_destroy(struct pool *pool)
|
||||
dm_bio_prison_destroy(pool->prison);
|
||||
dm_kcopyd_client_destroy(pool->copier);
|
||||
|
||||
cancel_delayed_work_sync(&pool->waker);
|
||||
cancel_delayed_work_sync(&pool->no_space_timeout);
|
||||
if (pool->wq)
|
||||
destroy_workqueue(pool->wq);
|
||||
|
||||
|
||||
@@ -360,13 +360,14 @@ static void md_end_flush(struct bio *bio)
|
||||
struct md_rdev *rdev = bio->bi_private;
|
||||
struct mddev *mddev = rdev->mddev;
|
||||
|
||||
bio_put(bio);
|
||||
|
||||
rdev_dec_pending(rdev, mddev);
|
||||
|
||||
if (atomic_dec_and_test(&mddev->flush_pending)) {
|
||||
/* The pre-request flush has finished */
|
||||
queue_work(md_wq, &mddev->flush_work);
|
||||
}
|
||||
bio_put(bio);
|
||||
}
|
||||
|
||||
static void md_submit_flush_data(struct work_struct *ws);
|
||||
@@ -725,10 +726,12 @@ static void super_written(struct bio *bio)
|
||||
md_error(mddev, rdev);
|
||||
}
|
||||
|
||||
bio_put(bio);
|
||||
|
||||
rdev_dec_pending(rdev, mddev);
|
||||
|
||||
if (atomic_dec_and_test(&mddev->pending_writes))
|
||||
wake_up(&mddev->sb_wait);
|
||||
rdev_dec_pending(rdev, mddev);
|
||||
bio_put(bio);
|
||||
}
|
||||
|
||||
void md_super_write(struct mddev *mddev, struct md_rdev *rdev,
|
||||
|
||||
@@ -2964,6 +2964,7 @@ static int raid1_run(struct mddev *mddev)
|
||||
* RAID1 needs at least one disk in active
|
||||
*/
|
||||
if (conf->raid_disks - mddev->degraded < 1) {
|
||||
md_unregister_thread(&conf->thread);
|
||||
ret = -EINVAL;
|
||||
goto abort;
|
||||
}
|
||||
|
||||
@@ -317,6 +317,7 @@ static int dvb_create_media_entity(struct dvb_device *dvbdev,
|
||||
GFP_KERNEL);
|
||||
if (!dvbdev->pads) {
|
||||
kfree(dvbdev->entity);
|
||||
dvbdev->entity = NULL;
|
||||
return -ENOMEM;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -648,6 +648,7 @@ static int bcm3510_download_firmware(struct dvb_frontend* fe)
|
||||
deb_info("firmware chunk, addr: 0x%04x, len: 0x%04x, total length: 0x%04zx\n",addr,len,fw->size);
|
||||
if ((ret = bcm3510_write_ram(st,addr,&b[i+4],len)) < 0) {
|
||||
err("firmware download failed: %d\n",ret);
|
||||
release_firmware(fw);
|
||||
return ret;
|
||||
}
|
||||
i += 4 + len;
|
||||
|
||||
@@ -452,9 +452,8 @@ static int stv0288_set_frontend(struct dvb_frontend *fe)
|
||||
struct stv0288_state *state = fe->demodulator_priv;
|
||||
struct dtv_frontend_properties *c = &fe->dtv_property_cache;
|
||||
|
||||
char tm;
|
||||
unsigned char tda[3];
|
||||
u8 reg, time_out = 0;
|
||||
u8 tda[3], reg, time_out = 0;
|
||||
s8 tm;
|
||||
|
||||
dprintk("%s : FE_SET_FRONTEND\n", __func__);
|
||||
|
||||
|
||||
@@ -320,18 +320,18 @@ static int ad5820_probe(struct i2c_client *client,
|
||||
|
||||
ret = media_entity_pads_init(&coil->subdev.entity, 0, NULL);
|
||||
if (ret < 0)
|
||||
goto cleanup2;
|
||||
goto clean_mutex;
|
||||
|
||||
ret = v4l2_async_register_subdev(&coil->subdev);
|
||||
if (ret < 0)
|
||||
goto cleanup;
|
||||
goto clean_entity;
|
||||
|
||||
return ret;
|
||||
|
||||
cleanup2:
|
||||
mutex_destroy(&coil->power_lock);
|
||||
cleanup:
|
||||
clean_entity:
|
||||
media_entity_cleanup(&coil->subdev.entity);
|
||||
clean_mutex:
|
||||
mutex_destroy(&coil->power_lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -1250,7 +1250,7 @@ static int saa7164_initdev(struct pci_dev *pci_dev,
|
||||
|
||||
if (saa7164_dev_setup(dev) < 0) {
|
||||
err = -EINVAL;
|
||||
goto fail_free;
|
||||
goto fail_dev;
|
||||
}
|
||||
|
||||
/* print pci info */
|
||||
@@ -1422,6 +1422,8 @@ fail_fw:
|
||||
|
||||
fail_irq:
|
||||
saa7164_dev_unregister(dev);
|
||||
fail_dev:
|
||||
pci_disable_device(pci_dev);
|
||||
fail_free:
|
||||
v4l2_device_unregister(&dev->v4l2_dev);
|
||||
kfree(dev);
|
||||
|
||||
@@ -428,6 +428,7 @@ static int solo_sysfs_init(struct solo_dev *solo_dev)
|
||||
solo_dev->nr_chans);
|
||||
|
||||
if (device_register(dev)) {
|
||||
put_device(dev);
|
||||
dev->parent = NULL;
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
@@ -595,7 +595,7 @@ static void coda_setup_iram(struct coda_ctx *ctx)
|
||||
/* Only H.264BP and H.263P3 are considered */
|
||||
iram_info->buf_dbk_y_use = coda_iram_alloc(iram_info, w64);
|
||||
iram_info->buf_dbk_c_use = coda_iram_alloc(iram_info, w64);
|
||||
if (!iram_info->buf_dbk_c_use)
|
||||
if (!iram_info->buf_dbk_y_use || !iram_info->buf_dbk_c_use)
|
||||
goto out;
|
||||
iram_info->axi_sram_use |= dbk_bits;
|
||||
|
||||
@@ -619,7 +619,7 @@ static void coda_setup_iram(struct coda_ctx *ctx)
|
||||
|
||||
iram_info->buf_dbk_y_use = coda_iram_alloc(iram_info, w128);
|
||||
iram_info->buf_dbk_c_use = coda_iram_alloc(iram_info, w128);
|
||||
if (!iram_info->buf_dbk_c_use)
|
||||
if (!iram_info->buf_dbk_y_use || !iram_info->buf_dbk_c_use)
|
||||
goto out;
|
||||
iram_info->axi_sram_use |= dbk_bits;
|
||||
|
||||
@@ -821,10 +821,16 @@ static int coda_start_encoding(struct coda_ctx *ctx)
|
||||
}
|
||||
|
||||
if (dst_fourcc == V4L2_PIX_FMT_JPEG) {
|
||||
if (!ctx->params.jpeg_qmat_tab[0])
|
||||
if (!ctx->params.jpeg_qmat_tab[0]) {
|
||||
ctx->params.jpeg_qmat_tab[0] = kmalloc(64, GFP_KERNEL);
|
||||
if (!ctx->params.jpeg_qmat_tab[1])
|
||||
if (!ctx->params.jpeg_qmat_tab[0])
|
||||
return -ENOMEM;
|
||||
}
|
||||
if (!ctx->params.jpeg_qmat_tab[1]) {
|
||||
ctx->params.jpeg_qmat_tab[1] = kmalloc(64, GFP_KERNEL);
|
||||
if (!ctx->params.jpeg_qmat_tab[1])
|
||||
return -ENOMEM;
|
||||
}
|
||||
coda_set_jpeg_compression_quality(ctx, ctx->params.jpeg_quality);
|
||||
}
|
||||
|
||||
|
||||
@@ -1245,7 +1245,7 @@ int __init fimc_register_driver(void)
|
||||
return platform_driver_register(&fimc_driver);
|
||||
}
|
||||
|
||||
void __exit fimc_unregister_driver(void)
|
||||
void fimc_unregister_driver(void)
|
||||
{
|
||||
platform_driver_unregister(&fimc_driver);
|
||||
}
|
||||
|
||||
@@ -1559,7 +1559,11 @@ static int __init fimc_md_init(void)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return platform_driver_register(&fimc_md_driver);
|
||||
ret = platform_driver_register(&fimc_md_driver);
|
||||
if (ret)
|
||||
fimc_unregister_driver();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void __exit fimc_md_exit(void)
|
||||
|
||||
@@ -953,6 +953,7 @@ static int configure_channels(struct c8sectpfei *fei)
|
||||
if (ret) {
|
||||
dev_err(fei->dev,
|
||||
"configure_memdma_and_inputblock failed\n");
|
||||
of_node_put(child);
|
||||
goto err_unmap;
|
||||
}
|
||||
index++;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user