mirror of
https://github.com/rd-stuffs/msm-4.14.git
synced 2025-02-20 11:45:48 +08:00
Merge "Merge android-4.14-q.147 (5c8d069) into msm-4.14"
This commit is contained in:
commit
c4315910ba
6
Makefile
6
Makefile
@ -1,7 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 4
|
||||
PATCHLEVEL = 14
|
||||
SUBLEVEL = 146
|
||||
SUBLEVEL = 147
|
||||
EXTRAVERSION =
|
||||
NAME = Petit Gorille
|
||||
|
||||
@ -1040,9 +1040,11 @@ mod_sign_cmd = true
|
||||
endif
|
||||
export mod_sign_cmd
|
||||
|
||||
HOST_LIBELF_LIBS = $(shell pkg-config libelf --libs 2>/dev/null || echo -lelf)
|
||||
|
||||
ifdef CONFIG_STACK_VALIDATION
|
||||
has_libelf := $(call try-run,\
|
||||
echo "int main() {}" | $(HOSTCC) -xc -o /dev/null -lelf -,1,0)
|
||||
echo "int main() {}" | $(HOSTCC) -xc -o /dev/null $(HOST_LIBELF_LIBS) -,1,0)
|
||||
ifeq ($(has_libelf),1)
|
||||
objtool_target := tools/objtool FORCE
|
||||
else
|
||||
|
@ -426,6 +426,7 @@
|
||||
regulator-name = "vdd_ldo10";
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
regulator-always-on;
|
||||
regulator-state-mem {
|
||||
regulator-off-in-suspend;
|
||||
};
|
||||
|
@ -426,6 +426,7 @@
|
||||
regulator-name = "vdd_ldo10";
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
regulator-always-on;
|
||||
regulator-state-mem {
|
||||
regulator-off-in-suspend;
|
||||
};
|
||||
|
@ -43,7 +43,7 @@
|
||||
<&clks IMX7D_ENET1_TIME_ROOT_CLK>;
|
||||
assigned-clock-parents = <&clks IMX7D_PLL_ENET_MAIN_100M_CLK>;
|
||||
assigned-clock-rates = <0>, <100000000>;
|
||||
phy-mode = "rgmii";
|
||||
phy-mode = "rgmii-id";
|
||||
phy-handle = <ðphy0>;
|
||||
fsl,magic-packet;
|
||||
status = "okay";
|
||||
@ -69,7 +69,7 @@
|
||||
<&clks IMX7D_ENET2_TIME_ROOT_CLK>;
|
||||
assigned-clock-parents = <&clks IMX7D_PLL_ENET_MAIN_100M_CLK>;
|
||||
assigned-clock-rates = <0>, <100000000>;
|
||||
phy-mode = "rgmii";
|
||||
phy-mode = "rgmii-id";
|
||||
phy-handle = <ðphy1>;
|
||||
fsl,magic-packet;
|
||||
status = "okay";
|
||||
|
@ -65,7 +65,7 @@ int zynq_cpun_start(u32 address, int cpu)
|
||||
* 0x4: Jump by mov instruction
|
||||
* 0x8: Jumping address
|
||||
*/
|
||||
memcpy((__force void *)zero, &zynq_secondary_trampoline,
|
||||
memcpy_toio(zero, &zynq_secondary_trampoline,
|
||||
trampoline_size);
|
||||
writel(address, zero + trampoline_size);
|
||||
|
||||
|
@ -67,6 +67,7 @@ void samsung_wdt_reset(void)
|
||||
#ifdef CONFIG_OF
|
||||
static const struct of_device_id s3c2410_wdt_match[] = {
|
||||
{ .compatible = "samsung,s3c2410-wdt" },
|
||||
{ .compatible = "samsung,s3c6410-wdt" },
|
||||
{},
|
||||
};
|
||||
|
||||
|
@ -685,6 +685,7 @@
|
||||
<&cru SCLK_SDMMC_DRV>, <&cru SCLK_SDMMC_SAMPLE>;
|
||||
clock-names = "biu", "ciu", "ciu-drive", "ciu-sample";
|
||||
fifo-depth = <0x100>;
|
||||
max-frequency = <150000000>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
@ -696,6 +697,7 @@
|
||||
<&cru SCLK_SDIO_DRV>, <&cru SCLK_SDIO_SAMPLE>;
|
||||
clock-names = "biu", "ciu", "ciu-drive", "ciu-sample";
|
||||
fifo-depth = <0x100>;
|
||||
max-frequency = <150000000>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
@ -707,6 +709,7 @@
|
||||
<&cru SCLK_EMMC_DRV>, <&cru SCLK_EMMC_SAMPLE>;
|
||||
clock-names = "biu", "ciu", "ciu-drive", "ciu-sample";
|
||||
fifo-depth = <0x100>;
|
||||
max-frequency = <150000000>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
@ -847,6 +847,11 @@ static bool unmap_kernel_at_el0(const struct arm64_cpu_capabilities *entry,
|
||||
switch (read_cpuid_id() & MIDR_CPU_MODEL_MASK) {
|
||||
case MIDR_CAVIUM_THUNDERX2:
|
||||
case MIDR_BRCM_VULCAN:
|
||||
case MIDR_CORTEX_A53:
|
||||
case MIDR_CORTEX_A55:
|
||||
case MIDR_CORTEX_A57:
|
||||
case MIDR_CORTEX_A72:
|
||||
case MIDR_CORTEX_A73:
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -326,6 +326,15 @@ skip_pgd:
|
||||
msr sctlr_el1, x18
|
||||
isb
|
||||
|
||||
/*
|
||||
* Invalidate the local I-cache so that any instructions fetched
|
||||
* speculatively from the PoC are discarded, since they may have
|
||||
* been dynamically patched at the PoU.
|
||||
*/
|
||||
ic iallu
|
||||
dsb nsh
|
||||
isb
|
||||
|
||||
/* Set the flag to zero to indicate that we're all done */
|
||||
str wzr, [flag_ptr]
|
||||
ret
|
||||
|
@ -913,8 +913,12 @@ module_finalize (const Elf_Ehdr *hdr, const Elf_Shdr *sechdrs, struct module *mo
|
||||
void
|
||||
module_arch_cleanup (struct module *mod)
|
||||
{
|
||||
if (mod->arch.init_unw_table)
|
||||
if (mod->arch.init_unw_table) {
|
||||
unw_remove_unwind_table(mod->arch.init_unw_table);
|
||||
if (mod->arch.core_unw_table)
|
||||
mod->arch.init_unw_table = NULL;
|
||||
}
|
||||
if (mod->arch.core_unw_table) {
|
||||
unw_remove_unwind_table(mod->arch.core_unw_table);
|
||||
mod->arch.core_unw_table = NULL;
|
||||
}
|
||||
}
|
||||
|
@ -266,7 +266,7 @@ int64_t opal_xive_get_vp_info(uint64_t vp,
|
||||
int64_t opal_xive_set_vp_info(uint64_t vp,
|
||||
uint64_t flags,
|
||||
uint64_t report_cl_pair);
|
||||
int64_t opal_xive_allocate_irq(uint32_t chip_id);
|
||||
int64_t opal_xive_allocate_irq_raw(uint32_t chip_id);
|
||||
int64_t opal_xive_free_irq(uint32_t girq);
|
||||
int64_t opal_xive_sync(uint32_t type, uint32_t id);
|
||||
int64_t opal_xive_dump(uint32_t type, uint32_t id);
|
||||
|
@ -301,7 +301,7 @@ OPAL_CALL(opal_xive_set_queue_info, OPAL_XIVE_SET_QUEUE_INFO);
|
||||
OPAL_CALL(opal_xive_donate_page, OPAL_XIVE_DONATE_PAGE);
|
||||
OPAL_CALL(opal_xive_alloc_vp_block, OPAL_XIVE_ALLOCATE_VP_BLOCK);
|
||||
OPAL_CALL(opal_xive_free_vp_block, OPAL_XIVE_FREE_VP_BLOCK);
|
||||
OPAL_CALL(opal_xive_allocate_irq, OPAL_XIVE_ALLOCATE_IRQ);
|
||||
OPAL_CALL(opal_xive_allocate_irq_raw, OPAL_XIVE_ALLOCATE_IRQ);
|
||||
OPAL_CALL(opal_xive_free_irq, OPAL_XIVE_FREE_IRQ);
|
||||
OPAL_CALL(opal_xive_get_vp_info, OPAL_XIVE_GET_VP_INFO);
|
||||
OPAL_CALL(opal_xive_set_vp_info, OPAL_XIVE_SET_VP_INFO);
|
||||
|
@ -234,6 +234,17 @@ static bool xive_native_match(struct device_node *node)
|
||||
return of_device_is_compatible(node, "ibm,opal-xive-vc");
|
||||
}
|
||||
|
||||
static s64 opal_xive_allocate_irq(u32 chip_id)
|
||||
{
|
||||
s64 irq = opal_xive_allocate_irq_raw(chip_id);
|
||||
|
||||
/*
|
||||
* Old versions of skiboot can incorrectly return 0xffffffff to
|
||||
* indicate no space, fix it up here.
|
||||
*/
|
||||
return irq == 0xffffffff ? OPAL_RESOURCE : irq;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
static int xive_native_get_ipi(unsigned int cpu, struct xive_cpu *xc)
|
||||
{
|
||||
|
@ -572,6 +572,9 @@ static int xts_aes_encrypt(struct blkcipher_desc *desc,
|
||||
struct s390_xts_ctx *xts_ctx = crypto_blkcipher_ctx(desc->tfm);
|
||||
struct blkcipher_walk walk;
|
||||
|
||||
if (!nbytes)
|
||||
return -EINVAL;
|
||||
|
||||
if (unlikely(!xts_ctx->fc))
|
||||
return xts_fallback_encrypt(desc, dst, src, nbytes);
|
||||
|
||||
@ -586,6 +589,9 @@ static int xts_aes_decrypt(struct blkcipher_desc *desc,
|
||||
struct s390_xts_ctx *xts_ctx = crypto_blkcipher_ctx(desc->tfm);
|
||||
struct blkcipher_walk walk;
|
||||
|
||||
if (!nbytes)
|
||||
return -EINVAL;
|
||||
|
||||
if (unlikely(!xts_ctx->fc))
|
||||
return xts_fallback_decrypt(desc, dst, src, nbytes);
|
||||
|
||||
|
@ -252,7 +252,7 @@ ifdef CONFIG_RETPOLINE
|
||||
# retpoline builds, however, gcc does not for x86. This has
|
||||
# only been fixed starting from gcc stable version 8.4.0 and
|
||||
# onwards, but not for older ones. See gcc bug #86952.
|
||||
ifndef CONFIG_CC_IS_CLANG
|
||||
ifneq ($(cc-name), clang)
|
||||
KBUILD_CFLAGS += $(call cc-option,-fno-jump-tables)
|
||||
endif
|
||||
endif
|
||||
|
@ -1384,6 +1384,14 @@ void setup_local_APIC(void)
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* If this comes from kexec/kcrash the APIC might be enabled in
|
||||
* SPIV. Soft disable it before doing further initialization.
|
||||
*/
|
||||
value = apic_read(APIC_SPIV);
|
||||
value &= ~APIC_SPIV_APIC_ENABLED;
|
||||
apic_write(APIC_SPIV, value);
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
/* Pound the ESR really hard over the head with a big hammer - mbligh */
|
||||
if (lapic_is_integrated() && apic->disable_esr) {
|
||||
|
@ -181,6 +181,12 @@ asmlinkage __visible void smp_reboot_interrupt(void)
|
||||
irq_exit();
|
||||
}
|
||||
|
||||
static int register_stop_handler(void)
|
||||
{
|
||||
return register_nmi_handler(NMI_LOCAL, smp_stop_nmi_callback,
|
||||
NMI_FLAG_FIRST, "smp_stop");
|
||||
}
|
||||
|
||||
static void native_stop_other_cpus(int wait)
|
||||
{
|
||||
unsigned long flags;
|
||||
@ -214,39 +220,41 @@ static void native_stop_other_cpus(int wait)
|
||||
apic->send_IPI_allbutself(REBOOT_VECTOR);
|
||||
|
||||
/*
|
||||
* Don't wait longer than a second if the caller
|
||||
* didn't ask us to wait.
|
||||
* Don't wait longer than a second for IPI completion. The
|
||||
* wait request is not checked here because that would
|
||||
* prevent an NMI shutdown attempt in case that not all
|
||||
* CPUs reach shutdown state.
|
||||
*/
|
||||
timeout = USEC_PER_SEC;
|
||||
while (num_online_cpus() > 1 && (wait || timeout--))
|
||||
while (num_online_cpus() > 1 && timeout--)
|
||||
udelay(1);
|
||||
}
|
||||
|
||||
|
||||
/* if the REBOOT_VECTOR didn't work, try with the NMI */
|
||||
if ((num_online_cpus() > 1) && (!smp_no_nmi_ipi)) {
|
||||
if (register_nmi_handler(NMI_LOCAL, smp_stop_nmi_callback,
|
||||
NMI_FLAG_FIRST, "smp_stop"))
|
||||
/* Note: we ignore failures here */
|
||||
/* Hope the REBOOT_IRQ is good enough */
|
||||
goto finish;
|
||||
|
||||
/* sync above data before sending IRQ */
|
||||
wmb();
|
||||
|
||||
pr_emerg("Shutting down cpus with NMI\n");
|
||||
|
||||
apic->send_IPI_allbutself(NMI_VECTOR);
|
||||
|
||||
if (num_online_cpus() > 1) {
|
||||
/*
|
||||
* Don't wait longer than a 10 ms if the caller
|
||||
* didn't ask us to wait.
|
||||
* If NMI IPI is enabled, try to register the stop handler
|
||||
* and send the IPI. In any case try to wait for the other
|
||||
* CPUs to stop.
|
||||
*/
|
||||
if (!smp_no_nmi_ipi && !register_stop_handler()) {
|
||||
/* Sync above data before sending IRQ */
|
||||
wmb();
|
||||
|
||||
pr_emerg("Shutting down cpus with NMI\n");
|
||||
|
||||
apic->send_IPI_allbutself(NMI_VECTOR);
|
||||
}
|
||||
/*
|
||||
* Don't wait longer than 10 ms if the caller didn't
|
||||
* reqeust it. If wait is true, the machine hangs here if
|
||||
* one or more CPUs do not reach shutdown state.
|
||||
*/
|
||||
timeout = USEC_PER_MSEC * 10;
|
||||
while (num_online_cpus() > 1 && (wait || timeout--))
|
||||
udelay(1);
|
||||
}
|
||||
|
||||
finish:
|
||||
local_irq_save(flags);
|
||||
disable_local_APIC();
|
||||
mcheck_cpu_clear(this_cpu_ptr(&cpu_info));
|
||||
|
@ -5298,6 +5298,8 @@ done_prefixes:
|
||||
ctxt->memopp->addr.mem.ea + ctxt->_eip);
|
||||
|
||||
done:
|
||||
if (rc == X86EMUL_PROPAGATE_FAULT)
|
||||
ctxt->have_exception = true;
|
||||
return (rc != X86EMUL_CONTINUE) ? EMULATION_FAILED : EMULATION_OK;
|
||||
}
|
||||
|
||||
|
@ -563,8 +563,14 @@ static int kvm_read_nested_guest_page(struct kvm_vcpu *vcpu, gfn_t gfn,
|
||||
data, offset, len, access);
|
||||
}
|
||||
|
||||
static inline u64 pdptr_rsvd_bits(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
return rsvd_bits(cpuid_maxphyaddr(vcpu), 63) | rsvd_bits(5, 8) |
|
||||
rsvd_bits(1, 2);
|
||||
}
|
||||
|
||||
/*
|
||||
* Load the pae pdptrs. Return true is they are all valid.
|
||||
* Load the pae pdptrs. Return 1 if they are all valid, 0 otherwise.
|
||||
*/
|
||||
int load_pdptrs(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu, unsigned long cr3)
|
||||
{
|
||||
@ -583,8 +589,7 @@ int load_pdptrs(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu, unsigned long cr3)
|
||||
}
|
||||
for (i = 0; i < ARRAY_SIZE(pdpte); ++i) {
|
||||
if ((pdpte[i] & PT_PRESENT_MASK) &&
|
||||
(pdpte[i] &
|
||||
vcpu->arch.mmu.guest_rsvd_check.rsvd_bits_mask[0][2])) {
|
||||
(pdpte[i] & pdptr_rsvd_bits(vcpu))) {
|
||||
ret = 0;
|
||||
goto out;
|
||||
}
|
||||
@ -5892,8 +5897,16 @@ int x86_emulate_instruction(struct kvm_vcpu *vcpu,
|
||||
if (reexecute_instruction(vcpu, cr2, write_fault_to_spt,
|
||||
emulation_type))
|
||||
return EMULATE_DONE;
|
||||
if (ctxt->have_exception && inject_emulated_exception(vcpu))
|
||||
if (ctxt->have_exception) {
|
||||
/*
|
||||
* #UD should result in just EMULATION_FAILED, and trap-like
|
||||
* exception should not be encountered during decode.
|
||||
*/
|
||||
WARN_ON_ONCE(ctxt->exception.vector == UD_VECTOR ||
|
||||
exception_type(ctxt->exception.vector) == EXCPT_TRAP);
|
||||
inject_emulated_exception(vcpu);
|
||||
return EMULATE_DONE;
|
||||
}
|
||||
if (emulation_type & EMULTYPE_SKIP)
|
||||
return EMULATE_FAIL;
|
||||
return handle_emulation_failure(vcpu);
|
||||
|
@ -2294,8 +2294,6 @@ void blk_mq_release(struct request_queue *q)
|
||||
struct blk_mq_hw_ctx *hctx;
|
||||
unsigned int i;
|
||||
|
||||
cancel_delayed_work_sync(&q->requeue_work);
|
||||
|
||||
/* hctx kobj stays in hctx */
|
||||
queue_for_each_hw_ctx(q, hctx, i) {
|
||||
if (!hctx)
|
||||
|
@ -811,6 +811,9 @@ static void __blk_release_queue(struct work_struct *work)
|
||||
|
||||
blk_free_queue_stats(q->stats);
|
||||
|
||||
if (q->mq_ops)
|
||||
cancel_delayed_work_sync(&q->requeue_work);
|
||||
|
||||
blk_exit_rl(q, &q->root_rl);
|
||||
|
||||
if (q->queue_tags)
|
||||
|
@ -281,9 +281,13 @@ static int acpi_processor_get_info(struct acpi_device *device)
|
||||
}
|
||||
|
||||
if (acpi_duplicate_processor_id(pr->acpi_id)) {
|
||||
dev_err(&device->dev,
|
||||
"Failed to get unique processor _UID (0x%x)\n",
|
||||
pr->acpi_id);
|
||||
if (pr->acpi_id == 0xff)
|
||||
dev_info_once(&device->dev,
|
||||
"Entry not well-defined, consider updating BIOS\n");
|
||||
else
|
||||
dev_err(&device->dev,
|
||||
"Failed to get unique processor _UID (0x%x)\n",
|
||||
pr->acpi_id);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
|
@ -73,6 +73,12 @@ module_param(report_key_events, int, 0644);
|
||||
MODULE_PARM_DESC(report_key_events,
|
||||
"0: none, 1: output changes, 2: brightness changes, 3: all");
|
||||
|
||||
static int hw_changes_brightness = -1;
|
||||
module_param(hw_changes_brightness, int, 0644);
|
||||
MODULE_PARM_DESC(hw_changes_brightness,
|
||||
"Set this to 1 on buggy hw which changes the brightness itself when "
|
||||
"a hotkey is pressed: -1: auto, 0: normal 1: hw-changes-brightness");
|
||||
|
||||
/*
|
||||
* Whether the struct acpi_video_device_attrib::device_id_scheme bit should be
|
||||
* assumed even if not actually set.
|
||||
@ -418,6 +424,14 @@ static int video_set_report_key_events(const struct dmi_system_id *id)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int video_hw_changes_brightness(
|
||||
const struct dmi_system_id *d)
|
||||
{
|
||||
if (hw_changes_brightness == -1)
|
||||
hw_changes_brightness = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct dmi_system_id video_dmi_table[] = {
|
||||
/*
|
||||
* Broken _BQC workaround http://bugzilla.kernel.org/show_bug.cgi?id=13121
|
||||
@ -542,6 +556,21 @@ static const struct dmi_system_id video_dmi_table[] = {
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "Vostro V131"),
|
||||
},
|
||||
},
|
||||
/*
|
||||
* Some machines change the brightness themselves when a brightness
|
||||
* hotkey gets pressed, despite us telling them not to. In this case
|
||||
* acpi_video_device_notify() should only call backlight_force_update(
|
||||
* BACKLIGHT_UPDATE_HOTKEY) and not do anything else.
|
||||
*/
|
||||
{
|
||||
/* https://bugzilla.kernel.org/show_bug.cgi?id=204077 */
|
||||
.callback = video_hw_changes_brightness,
|
||||
.ident = "Packard Bell EasyNote MZ35",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Packard Bell"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "EasyNote MZ35"),
|
||||
},
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
@ -1624,6 +1653,14 @@ static void acpi_video_device_notify(acpi_handle handle, u32 event, void *data)
|
||||
bus = video_device->video;
|
||||
input = bus->input;
|
||||
|
||||
if (hw_changes_brightness > 0) {
|
||||
if (video_device->backlight)
|
||||
backlight_force_update(video_device->backlight,
|
||||
BACKLIGHT_UPDATE_HOTKEY);
|
||||
acpi_notifier_call_chain(device, event, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
switch (event) {
|
||||
case ACPI_VIDEO_NOTIFY_CYCLE_BRIGHTNESS: /* Cycle brightness */
|
||||
brightness_switch_event(video_device, event);
|
||||
|
@ -365,8 +365,10 @@ static int acpi_get_psd(struct cpc_desc *cpc_ptr, acpi_handle handle)
|
||||
union acpi_object *psd = NULL;
|
||||
struct acpi_psd_package *pdomain;
|
||||
|
||||
status = acpi_evaluate_object_typed(handle, "_PSD", NULL, &buffer,
|
||||
ACPI_TYPE_PACKAGE);
|
||||
status = acpi_evaluate_object_typed(handle, "_PSD", NULL,
|
||||
&buffer, ACPI_TYPE_PACKAGE);
|
||||
if (status == AE_NOT_FOUND) /* _PSD is optional */
|
||||
return 0;
|
||||
if (ACPI_FAILURE(status))
|
||||
return -ENODEV;
|
||||
|
||||
|
@ -48,8 +48,10 @@ static ssize_t cm_write(struct file *file, const char __user * user_buf,
|
||||
if ((*ppos > max_size) ||
|
||||
(*ppos + count > max_size) ||
|
||||
(*ppos + count < count) ||
|
||||
(count > uncopied_bytes))
|
||||
(count > uncopied_bytes)) {
|
||||
kfree(buf);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (copy_from_user(buf + (*ppos), user_buf, count)) {
|
||||
kfree(buf);
|
||||
@ -69,6 +71,7 @@ static ssize_t cm_write(struct file *file, const char __user * user_buf,
|
||||
add_taint(TAINT_OVERRIDDEN_ACPI_TABLE, LOCKDEP_NOW_UNRELIABLE);
|
||||
}
|
||||
|
||||
kfree(buf);
|
||||
return count;
|
||||
}
|
||||
|
||||
|
@ -462,8 +462,10 @@ int acpi_pci_irq_enable(struct pci_dev *dev)
|
||||
* No IRQ known to the ACPI subsystem - maybe the BIOS /
|
||||
* driver reported one, then use it. Exit in any case.
|
||||
*/
|
||||
if (!acpi_pci_irq_valid(dev, pin))
|
||||
if (!acpi_pci_irq_valid(dev, pin)) {
|
||||
kfree(entry);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (acpi_isa_register_gsi(dev))
|
||||
dev_warn(&dev->dev, "PCI INT %c: no GSI\n",
|
||||
|
@ -155,6 +155,7 @@ out2:
|
||||
out1:
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(soc_device_register);
|
||||
|
||||
/* Ensure soc_dev->attr is freed prior to calling soc_device_unregister. */
|
||||
void soc_device_unregister(struct soc_device *soc_dev)
|
||||
@ -164,6 +165,7 @@ void soc_device_unregister(struct soc_device *soc_dev)
|
||||
device_unregister(&soc_dev->dev);
|
||||
early_soc_dev_attr = NULL;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(soc_device_unregister);
|
||||
|
||||
static int __init soc_bus_register(void)
|
||||
{
|
||||
|
@ -340,8 +340,10 @@ static enum blk_eh_timer_return nbd_xmit_timeout(struct request *req,
|
||||
}
|
||||
config = nbd->config;
|
||||
|
||||
if (!mutex_trylock(&cmd->lock))
|
||||
if (!mutex_trylock(&cmd->lock)) {
|
||||
nbd_config_put(nbd);
|
||||
return BLK_EH_RESET_TIMER;
|
||||
}
|
||||
|
||||
if (config->num_connections > 1) {
|
||||
dev_err_ratelimited(nbd_to_dev(nbd),
|
||||
|
@ -388,6 +388,9 @@ static const struct usb_device_id blacklist_table[] = {
|
||||
/* Additional Realtek 8822BE Bluetooth devices */
|
||||
{ USB_DEVICE(0x0b05, 0x185c), .driver_info = BTUSB_REALTEK },
|
||||
|
||||
/* Additional Realtek 8822CE Bluetooth devices */
|
||||
{ USB_DEVICE(0x04ca, 0x4005), .driver_info = BTUSB_REALTEK },
|
||||
|
||||
/* Silicon Wave based devices */
|
||||
{ USB_DEVICE(0x0c10, 0x0000), .driver_info = BTUSB_SWAVE },
|
||||
|
||||
|
@ -67,7 +67,7 @@ static void add_early_randomness(struct hwrng *rng)
|
||||
size_t size = min_t(size_t, 16, rng_buffer_size());
|
||||
|
||||
mutex_lock(&reading_mutex);
|
||||
bytes_read = rng_get_data(rng, rng_buffer, size, 1);
|
||||
bytes_read = rng_get_data(rng, rng_buffer, size, 0);
|
||||
mutex_unlock(&reading_mutex);
|
||||
if (bytes_read > 0)
|
||||
add_device_randomness(rng_buffer, bytes_read);
|
||||
|
@ -97,6 +97,13 @@ void __weak unxlate_dev_mem_ptr(phys_addr_t phys, void *addr)
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline bool should_stop_iteration(void)
|
||||
{
|
||||
if (need_resched())
|
||||
cond_resched();
|
||||
return fatal_signal_pending(current);
|
||||
}
|
||||
|
||||
/*
|
||||
* This funcion reads the *physical* memory. The f_pos points directly to the
|
||||
* memory location.
|
||||
@ -175,6 +182,8 @@ static ssize_t read_mem(struct file *file, char __user *buf,
|
||||
p += sz;
|
||||
count -= sz;
|
||||
read += sz;
|
||||
if (should_stop_iteration())
|
||||
break;
|
||||
}
|
||||
kfree(bounce);
|
||||
|
||||
@ -251,6 +260,8 @@ static ssize_t write_mem(struct file *file, const char __user *buf,
|
||||
p += sz;
|
||||
count -= sz;
|
||||
written += sz;
|
||||
if (should_stop_iteration())
|
||||
break;
|
||||
}
|
||||
|
||||
*ppos += written;
|
||||
@ -464,6 +475,10 @@ static ssize_t read_kmem(struct file *file, char __user *buf,
|
||||
read += sz;
|
||||
low_count -= sz;
|
||||
count -= sz;
|
||||
if (should_stop_iteration()) {
|
||||
count = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -488,6 +503,8 @@ static ssize_t read_kmem(struct file *file, char __user *buf,
|
||||
buf += sz;
|
||||
read += sz;
|
||||
p += sz;
|
||||
if (should_stop_iteration())
|
||||
break;
|
||||
}
|
||||
free_page((unsigned long)kbuf);
|
||||
}
|
||||
@ -540,6 +557,8 @@ static ssize_t do_write_kmem(unsigned long p, const char __user *buf,
|
||||
p += sz;
|
||||
count -= sz;
|
||||
written += sz;
|
||||
if (should_stop_iteration())
|
||||
break;
|
||||
}
|
||||
|
||||
*ppos += written;
|
||||
@ -591,6 +610,8 @@ static ssize_t write_kmem(struct file *file, const char __user *buf,
|
||||
buf += sz;
|
||||
virtr += sz;
|
||||
p += sz;
|
||||
if (should_stop_iteration())
|
||||
break;
|
||||
}
|
||||
free_page((unsigned long)kbuf);
|
||||
}
|
||||
|
@ -3043,6 +3043,7 @@ static int talitos_remove(struct platform_device *ofdev)
|
||||
break;
|
||||
case CRYPTO_ALG_TYPE_AEAD:
|
||||
crypto_unregister_aead(&t_alg->algt.alg.aead);
|
||||
break;
|
||||
case CRYPTO_ALG_TYPE_AHASH:
|
||||
crypto_unregister_ahash(&t_alg->algt.alg.hash);
|
||||
break;
|
||||
|
@ -194,11 +194,10 @@ static void exynos_bus_exit(struct device *dev)
|
||||
if (ret < 0)
|
||||
dev_warn(dev, "failed to disable the devfreq-event devices\n");
|
||||
|
||||
if (bus->regulator)
|
||||
regulator_disable(bus->regulator);
|
||||
|
||||
dev_pm_opp_of_remove_table(dev);
|
||||
clk_disable_unprepare(bus->clk);
|
||||
if (bus->regulator)
|
||||
regulator_disable(bus->regulator);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -386,6 +385,7 @@ static int exynos_bus_probe(struct platform_device *pdev)
|
||||
struct exynos_bus *bus;
|
||||
int ret, max_state;
|
||||
unsigned long min_freq, max_freq;
|
||||
bool passive = false;
|
||||
|
||||
if (!np) {
|
||||
dev_err(dev, "failed to find devicetree node\n");
|
||||
@ -399,27 +399,27 @@ static int exynos_bus_probe(struct platform_device *pdev)
|
||||
bus->dev = &pdev->dev;
|
||||
platform_set_drvdata(pdev, bus);
|
||||
|
||||
/* Parse the device-tree to get the resource information */
|
||||
ret = exynos_bus_parse_of(np, bus);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
profile = devm_kzalloc(dev, sizeof(*profile), GFP_KERNEL);
|
||||
if (!profile) {
|
||||
ret = -ENOMEM;
|
||||
goto err;
|
||||
}
|
||||
if (!profile)
|
||||
return -ENOMEM;
|
||||
|
||||
node = of_parse_phandle(dev->of_node, "devfreq", 0);
|
||||
if (node) {
|
||||
of_node_put(node);
|
||||
goto passive;
|
||||
passive = true;
|
||||
} else {
|
||||
ret = exynos_bus_parent_parse_of(np, bus);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Parse the device-tree to get the resource information */
|
||||
ret = exynos_bus_parse_of(np, bus);
|
||||
if (ret < 0)
|
||||
goto err;
|
||||
goto err_reg;
|
||||
|
||||
if (passive)
|
||||
goto passive;
|
||||
|
||||
/* Initialize the struct profile and governor data for parent device */
|
||||
profile->polling_ms = 50;
|
||||
@ -509,6 +509,9 @@ out:
|
||||
err:
|
||||
dev_pm_opp_of_remove_table(dev);
|
||||
clk_disable_unprepare(bus->clk);
|
||||
err_reg:
|
||||
if (!passive)
|
||||
regulator_disable(bus->regulator);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -152,7 +152,6 @@ static int devfreq_passive_notifier_call(struct notifier_block *nb,
|
||||
static int devfreq_passive_event_handler(struct devfreq *devfreq,
|
||||
unsigned int event, void *data)
|
||||
{
|
||||
struct device *dev = devfreq->dev.parent;
|
||||
struct devfreq_passive_data *p_data
|
||||
= (struct devfreq_passive_data *)devfreq->data;
|
||||
struct devfreq *parent = (struct devfreq *)p_data->parent;
|
||||
@ -168,12 +167,12 @@ static int devfreq_passive_event_handler(struct devfreq *devfreq,
|
||||
p_data->this = devfreq;
|
||||
|
||||
nb->notifier_call = devfreq_passive_notifier_call;
|
||||
ret = devm_devfreq_register_notifier(dev, parent, nb,
|
||||
ret = devfreq_register_notifier(parent, nb,
|
||||
DEVFREQ_TRANSITION_NOTIFIER);
|
||||
break;
|
||||
case DEVFREQ_GOV_STOP:
|
||||
devm_devfreq_unregister_notifier(dev, parent, nb,
|
||||
DEVFREQ_TRANSITION_NOTIFIER);
|
||||
WARN_ON(devfreq_unregister_notifier(parent, nb,
|
||||
DEVFREQ_TRANSITION_NOTIFIER));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
@ -891,8 +891,10 @@ static int bcm2835_dma_probe(struct platform_device *pdev)
|
||||
pdev->dev.dma_mask = &pdev->dev.coherent_dma_mask;
|
||||
|
||||
rc = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
|
||||
if (rc)
|
||||
if (rc) {
|
||||
dev_err(&pdev->dev, "Unable to set DMA mask\n");
|
||||
return rc;
|
||||
}
|
||||
|
||||
od = devm_kzalloc(&pdev->dev, sizeof(*od), GFP_KERNEL);
|
||||
if (!od)
|
||||
|
@ -2268,9 +2268,6 @@ static int edma_probe(struct platform_device *pdev)
|
||||
|
||||
ecc->default_queue = info->default_queue;
|
||||
|
||||
for (i = 0; i < ecc->num_slots; i++)
|
||||
edma_write_slot(ecc, i, &dummy_paramset);
|
||||
|
||||
if (info->rsv) {
|
||||
/* Set the reserved slots in inuse list */
|
||||
rsv_slots = info->rsv->rsv_slots;
|
||||
@ -2283,6 +2280,12 @@ static int edma_probe(struct platform_device *pdev)
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < ecc->num_slots; i++) {
|
||||
/* Reset only unused - not reserved - paRAM slots */
|
||||
if (!test_bit(i, ecc->slot_inuse))
|
||||
edma_write_slot(ecc, i, &dummy_paramset);
|
||||
}
|
||||
|
||||
/* Clear the xbar mapped channels in unused list */
|
||||
xbar_chans = info->xbar_chans;
|
||||
if (xbar_chans) {
|
||||
|
@ -125,9 +125,9 @@ static void __iop_adma_slot_cleanup(struct iop_adma_chan *iop_chan)
|
||||
list_for_each_entry_safe(iter, _iter, &iop_chan->chain,
|
||||
chain_node) {
|
||||
pr_debug("\tcookie: %d slot: %d busy: %d "
|
||||
"this_desc: %#x next_desc: %#x ack: %d\n",
|
||||
"this_desc: %#x next_desc: %#llx ack: %d\n",
|
||||
iter->async_tx.cookie, iter->idx, busy,
|
||||
iter->async_tx.phys, iop_desc_get_next_desc(iter),
|
||||
iter->async_tx.phys, (u64)iop_desc_get_next_desc(iter),
|
||||
async_tx_test_ack(&iter->async_tx));
|
||||
prefetch(_iter);
|
||||
prefetch(&_iter->async_tx);
|
||||
@ -315,9 +315,9 @@ retry:
|
||||
int i;
|
||||
dev_dbg(iop_chan->device->common.dev,
|
||||
"allocated slot: %d "
|
||||
"(desc %p phys: %#x) slots_per_op %d\n",
|
||||
"(desc %p phys: %#llx) slots_per_op %d\n",
|
||||
iter->idx, iter->hw_desc,
|
||||
iter->async_tx.phys, slots_per_op);
|
||||
(u64)iter->async_tx.phys, slots_per_op);
|
||||
|
||||
/* pre-ack all but the last descriptor */
|
||||
if (num_slots != slots_per_op)
|
||||
@ -525,7 +525,7 @@ iop_adma_prep_dma_memcpy(struct dma_chan *chan, dma_addr_t dma_dest,
|
||||
return NULL;
|
||||
BUG_ON(len > IOP_ADMA_MAX_BYTE_COUNT);
|
||||
|
||||
dev_dbg(iop_chan->device->common.dev, "%s len: %u\n",
|
||||
dev_dbg(iop_chan->device->common.dev, "%s len: %zu\n",
|
||||
__func__, len);
|
||||
|
||||
spin_lock_bh(&iop_chan->lock);
|
||||
@ -558,7 +558,7 @@ iop_adma_prep_dma_xor(struct dma_chan *chan, dma_addr_t dma_dest,
|
||||
BUG_ON(len > IOP_ADMA_XOR_MAX_BYTE_COUNT);
|
||||
|
||||
dev_dbg(iop_chan->device->common.dev,
|
||||
"%s src_cnt: %d len: %u flags: %lx\n",
|
||||
"%s src_cnt: %d len: %zu flags: %lx\n",
|
||||
__func__, src_cnt, len, flags);
|
||||
|
||||
spin_lock_bh(&iop_chan->lock);
|
||||
@ -591,7 +591,7 @@ iop_adma_prep_dma_xor_val(struct dma_chan *chan, dma_addr_t *dma_src,
|
||||
if (unlikely(!len))
|
||||
return NULL;
|
||||
|
||||
dev_dbg(iop_chan->device->common.dev, "%s src_cnt: %d len: %u\n",
|
||||
dev_dbg(iop_chan->device->common.dev, "%s src_cnt: %d len: %zu\n",
|
||||
__func__, src_cnt, len);
|
||||
|
||||
spin_lock_bh(&iop_chan->lock);
|
||||
@ -629,7 +629,7 @@ iop_adma_prep_dma_pq(struct dma_chan *chan, dma_addr_t *dst, dma_addr_t *src,
|
||||
BUG_ON(len > IOP_ADMA_XOR_MAX_BYTE_COUNT);
|
||||
|
||||
dev_dbg(iop_chan->device->common.dev,
|
||||
"%s src_cnt: %d len: %u flags: %lx\n",
|
||||
"%s src_cnt: %d len: %zu flags: %lx\n",
|
||||
__func__, src_cnt, len, flags);
|
||||
|
||||
if (dmaf_p_disabled_continue(flags))
|
||||
@ -692,7 +692,7 @@ iop_adma_prep_dma_pq_val(struct dma_chan *chan, dma_addr_t *pq, dma_addr_t *src,
|
||||
return NULL;
|
||||
BUG_ON(len > IOP_ADMA_XOR_MAX_BYTE_COUNT);
|
||||
|
||||
dev_dbg(iop_chan->device->common.dev, "%s src_cnt: %d len: %u\n",
|
||||
dev_dbg(iop_chan->device->common.dev, "%s src_cnt: %d len: %zu\n",
|
||||
__func__, src_cnt, len);
|
||||
|
||||
spin_lock_bh(&iop_chan->lock);
|
||||
|
@ -1646,6 +1646,7 @@ static void altr_edac_a10_irq_handler(struct irq_desc *desc)
|
||||
struct altr_arria10_edac *edac = irq_desc_get_handler_data(desc);
|
||||
struct irq_chip *chip = irq_desc_get_chip(desc);
|
||||
int irq = irq_desc_get_irq(desc);
|
||||
unsigned long bits;
|
||||
|
||||
dberr = (irq == edac->db_irq) ? 1 : 0;
|
||||
sm_offset = dberr ? A10_SYSMGR_ECC_INTSTAT_DERR_OFST :
|
||||
@ -1655,7 +1656,8 @@ static void altr_edac_a10_irq_handler(struct irq_desc *desc)
|
||||
|
||||
regmap_read(edac->ecc_mgr_map, sm_offset, &irq_status);
|
||||
|
||||
for_each_set_bit(bit, (unsigned long *)&irq_status, 32) {
|
||||
bits = irq_status;
|
||||
for_each_set_bit(bit, &bits, 32) {
|
||||
irq = irq_linear_revmap(edac->domain, dberr * 32 + bit);
|
||||
if (irq)
|
||||
generic_handle_irq(irq);
|
||||
|
@ -2501,13 +2501,6 @@ static void decode_umc_error(int node_id, struct mce *m)
|
||||
goto log_error;
|
||||
}
|
||||
|
||||
if (umc_normaddr_to_sysaddr(m->addr, pvt->mc_node_id, err.channel, &sys_addr)) {
|
||||
err.err_code = ERR_NORM_ADDR;
|
||||
goto log_error;
|
||||
}
|
||||
|
||||
error_address_to_page_and_offset(sys_addr, &err);
|
||||
|
||||
if (!(m->status & MCI_STATUS_SYNDV)) {
|
||||
err.err_code = ERR_SYND;
|
||||
goto log_error;
|
||||
@ -2524,6 +2517,13 @@ static void decode_umc_error(int node_id, struct mce *m)
|
||||
|
||||
err.csrow = m->synd & 0x7;
|
||||
|
||||
if (umc_normaddr_to_sysaddr(m->addr, pvt->mc_node_id, err.channel, &sys_addr)) {
|
||||
err.err_code = ERR_NORM_ADDR;
|
||||
goto log_error;
|
||||
}
|
||||
|
||||
error_address_to_page_and_offset(sys_addr, &err);
|
||||
|
||||
log_error:
|
||||
__log_ecc_error(mci, &err, ecc_type);
|
||||
}
|
||||
@ -3101,12 +3101,15 @@ static bool ecc_enabled(struct pci_dev *F3, u16 nid)
|
||||
static inline void
|
||||
f17h_determine_edac_ctl_cap(struct mem_ctl_info *mci, struct amd64_pvt *pvt)
|
||||
{
|
||||
u8 i, ecc_en = 1, cpk_en = 1;
|
||||
u8 i, ecc_en = 1, cpk_en = 1, dev_x4 = 1, dev_x16 = 1;
|
||||
|
||||
for (i = 0; i < NUM_UMCS; i++) {
|
||||
if (pvt->umc[i].sdp_ctrl & UMC_SDP_INIT) {
|
||||
ecc_en &= !!(pvt->umc[i].umc_cap_hi & UMC_ECC_ENABLED);
|
||||
cpk_en &= !!(pvt->umc[i].umc_cap_hi & UMC_ECC_CHIPKILL_CAP);
|
||||
|
||||
dev_x4 &= !!(pvt->umc[i].dimm_cfg & BIT(6));
|
||||
dev_x16 &= !!(pvt->umc[i].dimm_cfg & BIT(7));
|
||||
}
|
||||
}
|
||||
|
||||
@ -3114,8 +3117,15 @@ f17h_determine_edac_ctl_cap(struct mem_ctl_info *mci, struct amd64_pvt *pvt)
|
||||
if (ecc_en) {
|
||||
mci->edac_ctl_cap |= EDAC_FLAG_SECDED;
|
||||
|
||||
if (cpk_en)
|
||||
if (!cpk_en)
|
||||
return;
|
||||
|
||||
if (dev_x4)
|
||||
mci->edac_ctl_cap |= EDAC_FLAG_S4ECD4ED;
|
||||
else if (dev_x16)
|
||||
mci->edac_ctl_cap |= EDAC_FLAG_S16ECD16ED;
|
||||
else
|
||||
mci->edac_ctl_cap |= EDAC_FLAG_S8ECD8ED;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1240,9 +1240,13 @@ void edac_mc_handle_error(const enum hw_event_mc_err_type type,
|
||||
if (p > e->location)
|
||||
*(p - 1) = '\0';
|
||||
|
||||
/* Report the error via the trace interface */
|
||||
grain_bits = fls_long(e->grain) + 1;
|
||||
/* Sanity-check driver-supplied grain value. */
|
||||
if (WARN_ON_ONCE(!e->grain))
|
||||
e->grain = 1;
|
||||
|
||||
grain_bits = fls_long(e->grain - 1);
|
||||
|
||||
/* Report the error via the trace interface */
|
||||
if (IS_ENABLED(CONFIG_RAS))
|
||||
trace_mc_event(type, e->msg, e->label, e->error_count,
|
||||
mci->mc_idx, e->top_layer, e->mid_layer,
|
||||
|
@ -266,11 +266,14 @@ static u64 get_sideband_reg_base_addr(void)
|
||||
}
|
||||
}
|
||||
|
||||
#define DNV_MCHBAR_SIZE 0x8000
|
||||
#define DNV_SB_PORT_SIZE 0x10000
|
||||
static int dnv_rd_reg(int port, int off, int op, void *data, size_t sz, char *name)
|
||||
{
|
||||
struct pci_dev *pdev;
|
||||
char *base;
|
||||
u64 addr;
|
||||
unsigned long size;
|
||||
|
||||
if (op == 4) {
|
||||
pdev = pci_get_device(PCI_VENDOR_ID_INTEL, 0x1980, NULL);
|
||||
@ -285,15 +288,17 @@ static int dnv_rd_reg(int port, int off, int op, void *data, size_t sz, char *na
|
||||
addr = get_mem_ctrl_hub_base_addr();
|
||||
if (!addr)
|
||||
return -ENODEV;
|
||||
size = DNV_MCHBAR_SIZE;
|
||||
} else {
|
||||
/* MMIO via sideband register base address */
|
||||
addr = get_sideband_reg_base_addr();
|
||||
if (!addr)
|
||||
return -ENODEV;
|
||||
addr += (port << 16);
|
||||
size = DNV_SB_PORT_SIZE;
|
||||
}
|
||||
|
||||
base = ioremap((resource_size_t)addr, 0x10000);
|
||||
base = ioremap((resource_size_t)addr, size);
|
||||
if (!base)
|
||||
return -ENODEV;
|
||||
|
||||
|
@ -507,6 +507,21 @@ static void cper_print_pcie(const char *pfx, const struct cper_sec_pcie *pcie,
|
||||
printk(
|
||||
"%s""bridge: secondary_status: 0x%04x, control: 0x%04x\n",
|
||||
pfx, pcie->bridge.secondary_status, pcie->bridge.control);
|
||||
|
||||
/* Fatal errors call __ghes_panic() before AER handler prints this */
|
||||
if ((pcie->validation_bits & CPER_PCIE_VALID_AER_INFO) &&
|
||||
(gdata->error_severity & CPER_SEV_FATAL)) {
|
||||
struct aer_capability_regs *aer;
|
||||
|
||||
aer = (struct aer_capability_regs *)pcie->aer_info;
|
||||
printk("%saer_uncor_status: 0x%08x, aer_uncor_mask: 0x%08x\n",
|
||||
pfx, aer->uncor_status, aer->uncor_mask);
|
||||
printk("%saer_uncor_severity: 0x%08x\n",
|
||||
pfx, aer->uncor_severity);
|
||||
printk("%sTLP Header: %08x %08x %08x %08x\n", pfx,
|
||||
aer->header_log.dw0, aer->header_log.dw1,
|
||||
aer->header_log.dw2, aer->header_log.dw3);
|
||||
}
|
||||
}
|
||||
|
||||
static void cper_print_tstamp(const char *pfx,
|
||||
|
@ -3972,6 +3972,11 @@ static int smu7_program_display_gap(struct pp_hwmgr *hwmgr)
|
||||
|
||||
data->frame_time_x2 = frame_time_in_us * 2 / 100;
|
||||
|
||||
if (data->frame_time_x2 < 280) {
|
||||
pr_debug("%s: enforce minimal VBITimeout: %d -> 280\n", __func__, data->frame_time_x2);
|
||||
data->frame_time_x2 = 280;
|
||||
}
|
||||
|
||||
display_gap2 = pre_vbi_time_in_us * (ref_clock / 100);
|
||||
|
||||
cgs_write_ind_register(hwmgr->device, CGS_IND_REG__SMC, ixCG_DISPLAY_GAP_CNTL2, display_gap2);
|
||||
|
@ -593,6 +593,9 @@ static void output_poll_execute(struct work_struct *work)
|
||||
enum drm_connector_status old_status;
|
||||
bool repoll = false, changed;
|
||||
|
||||
if (!dev->mode_config.poll_enabled)
|
||||
return;
|
||||
|
||||
/* Pick up any changes detected by the probe functions. */
|
||||
changed = dev->mode_config.delayed_event;
|
||||
dev->mode_config.delayed_event = false;
|
||||
@ -747,7 +750,11 @@ EXPORT_SYMBOL(drm_kms_helper_poll_init);
|
||||
*/
|
||||
void drm_kms_helper_poll_fini(struct drm_device *dev)
|
||||
{
|
||||
drm_kms_helper_poll_disable(dev);
|
||||
if (!dev->mode_config.poll_enabled)
|
||||
return;
|
||||
|
||||
dev->mode_config.poll_enabled = false;
|
||||
cancel_delayed_work_sync(&dev->mode_config.output_poll_work);
|
||||
}
|
||||
EXPORT_SYMBOL(drm_kms_helper_poll_fini);
|
||||
|
||||
|
@ -761,7 +761,7 @@ static int lg_probe(struct hid_device *hdev, const struct hid_device_id *id)
|
||||
|
||||
if (!buf) {
|
||||
ret = -ENOMEM;
|
||||
goto err_free;
|
||||
goto err_stop;
|
||||
}
|
||||
|
||||
ret = hid_hw_raw_request(hdev, buf[0], buf, sizeof(cbuf),
|
||||
@ -793,9 +793,12 @@ static int lg_probe(struct hid_device *hdev, const struct hid_device_id *id)
|
||||
ret = lg4ff_init(hdev);
|
||||
|
||||
if (ret)
|
||||
goto err_free;
|
||||
goto err_stop;
|
||||
|
||||
return 0;
|
||||
|
||||
err_stop:
|
||||
hid_hw_stop(hdev);
|
||||
err_free:
|
||||
kfree(drv_data);
|
||||
return ret;
|
||||
@ -806,8 +809,7 @@ static void lg_remove(struct hid_device *hdev)
|
||||
struct lg_drv_data *drv_data = hid_get_drvdata(hdev);
|
||||
if (drv_data->quirks & LG_FF4)
|
||||
lg4ff_deinit(hdev);
|
||||
else
|
||||
hid_hw_stop(hdev);
|
||||
hid_hw_stop(hdev);
|
||||
kfree(drv_data);
|
||||
}
|
||||
|
||||
|
@ -1485,7 +1485,6 @@ int lg4ff_deinit(struct hid_device *hid)
|
||||
}
|
||||
}
|
||||
#endif
|
||||
hid_hw_stop(hid);
|
||||
drv_data->device_props = NULL;
|
||||
|
||||
kfree(entry);
|
||||
|
@ -556,10 +556,14 @@ static void pcmidi_setup_extra_keys(
|
||||
|
||||
static int pcmidi_set_operational(struct pcmidi_snd *pm)
|
||||
{
|
||||
int rc;
|
||||
|
||||
if (pm->ifnum != 1)
|
||||
return 0; /* only set up ONCE for interace 1 */
|
||||
|
||||
pcmidi_get_output_report(pm);
|
||||
rc = pcmidi_get_output_report(pm);
|
||||
if (rc < 0)
|
||||
return rc;
|
||||
pcmidi_submit_output_report(pm, 0xc1);
|
||||
return 0;
|
||||
}
|
||||
@ -688,7 +692,11 @@ static int pcmidi_snd_initialise(struct pcmidi_snd *pm)
|
||||
spin_lock_init(&pm->rawmidi_in_lock);
|
||||
|
||||
init_sustain_timers(pm);
|
||||
pcmidi_set_operational(pm);
|
||||
err = pcmidi_set_operational(pm);
|
||||
if (err < 0) {
|
||||
pk_error("failed to find output report\n");
|
||||
goto fail_register;
|
||||
}
|
||||
|
||||
/* register it */
|
||||
err = snd_card_register(card);
|
||||
|
@ -2710,7 +2710,6 @@ err_stop:
|
||||
kfree(sc->output_report_dmabuf);
|
||||
sony_remove_dev_list(sc);
|
||||
sony_release_device_id(sc);
|
||||
hid_hw_stop(hdev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -2772,6 +2771,7 @@ static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id)
|
||||
*/
|
||||
if (!(hdev->claimed & HID_CLAIMED_INPUT)) {
|
||||
hid_err(hdev, "failed to claim input\n");
|
||||
hid_hw_stop(hdev);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
|
@ -378,7 +378,7 @@ static long hidraw_ioctl(struct file *file, unsigned int cmd,
|
||||
|
||||
mutex_lock(&minors_lock);
|
||||
dev = hidraw_table[minor];
|
||||
if (!dev) {
|
||||
if (!dev || !dev->exist) {
|
||||
ret = -ENODEV;
|
||||
goto out;
|
||||
}
|
||||
|
@ -693,8 +693,8 @@ static int setup_attrs(struct acpi_power_meter_resource *resource)
|
||||
|
||||
if (resource->caps.flags & POWER_METER_CAN_CAP) {
|
||||
if (!can_cap_in_hardware()) {
|
||||
dev_err(&resource->acpi_dev->dev,
|
||||
"Ignoring unsafe software power cap!\n");
|
||||
dev_warn(&resource->acpi_dev->dev,
|
||||
"Ignoring unsafe software power cap!\n");
|
||||
goto skip_unsafe_cap;
|
||||
}
|
||||
|
||||
|
@ -212,6 +212,7 @@ static irqreturn_t riic_tend_isr(int irq, void *data)
|
||||
if (readb(riic->base + RIIC_ICSR2) & ICSR2_NACKF) {
|
||||
/* We got a NACKIE */
|
||||
readb(riic->base + RIIC_ICDRR); /* dummy read */
|
||||
riic_clear_set_bit(riic, ICSR2_NACKF, 0, RIIC_ICSR2);
|
||||
riic->err = -ENXIO;
|
||||
} else if (riic->bytes_left) {
|
||||
return IRQ_NONE;
|
||||
|
@ -112,12 +112,12 @@ static void ib_cq_poll_work(struct work_struct *work)
|
||||
IB_POLL_BATCH);
|
||||
if (completed >= IB_POLL_BUDGET_WORKQUEUE ||
|
||||
ib_req_notify_cq(cq, IB_POLL_FLAGS) > 0)
|
||||
queue_work(ib_comp_wq, &cq->work);
|
||||
queue_work(cq->comp_wq, &cq->work);
|
||||
}
|
||||
|
||||
static void ib_cq_completion_workqueue(struct ib_cq *cq, void *private)
|
||||
{
|
||||
queue_work(ib_comp_wq, &cq->work);
|
||||
queue_work(cq->comp_wq, &cq->work);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -169,9 +169,12 @@ struct ib_cq *ib_alloc_cq(struct ib_device *dev, void *private,
|
||||
ib_req_notify_cq(cq, IB_CQ_NEXT_COMP);
|
||||
break;
|
||||
case IB_POLL_WORKQUEUE:
|
||||
case IB_POLL_UNBOUND_WORKQUEUE:
|
||||
cq->comp_handler = ib_cq_completion_workqueue;
|
||||
INIT_WORK(&cq->work, ib_cq_poll_work);
|
||||
ib_req_notify_cq(cq, IB_CQ_NEXT_COMP);
|
||||
cq->comp_wq = (cq->poll_ctx == IB_POLL_WORKQUEUE) ?
|
||||
ib_comp_wq : ib_comp_unbound_wq;
|
||||
break;
|
||||
default:
|
||||
ret = -EINVAL;
|
||||
@ -206,6 +209,7 @@ void ib_free_cq(struct ib_cq *cq)
|
||||
irq_poll_disable(&cq->iop);
|
||||
break;
|
||||
case IB_POLL_WORKQUEUE:
|
||||
case IB_POLL_UNBOUND_WORKQUEUE:
|
||||
cancel_work_sync(&cq->work);
|
||||
break;
|
||||
default:
|
||||
|
@ -61,6 +61,7 @@ struct ib_client_data {
|
||||
};
|
||||
|
||||
struct workqueue_struct *ib_comp_wq;
|
||||
struct workqueue_struct *ib_comp_unbound_wq;
|
||||
struct workqueue_struct *ib_wq;
|
||||
EXPORT_SYMBOL_GPL(ib_wq);
|
||||
|
||||
@ -1202,10 +1203,19 @@ static int __init ib_core_init(void)
|
||||
goto err;
|
||||
}
|
||||
|
||||
ib_comp_unbound_wq =
|
||||
alloc_workqueue("ib-comp-unb-wq",
|
||||
WQ_UNBOUND | WQ_HIGHPRI | WQ_MEM_RECLAIM |
|
||||
WQ_SYSFS, WQ_UNBOUND_MAX_ACTIVE);
|
||||
if (!ib_comp_unbound_wq) {
|
||||
ret = -ENOMEM;
|
||||
goto err_comp;
|
||||
}
|
||||
|
||||
ret = class_register(&ib_class);
|
||||
if (ret) {
|
||||
pr_warn("Couldn't create InfiniBand device class\n");
|
||||
goto err_comp;
|
||||
goto err_comp_unbound;
|
||||
}
|
||||
|
||||
ret = rdma_nl_init();
|
||||
@ -1254,6 +1264,8 @@ err_ibnl:
|
||||
rdma_nl_exit();
|
||||
err_sysfs:
|
||||
class_unregister(&ib_class);
|
||||
err_comp_unbound:
|
||||
destroy_workqueue(ib_comp_unbound_wq);
|
||||
err_comp:
|
||||
destroy_workqueue(ib_comp_wq);
|
||||
err:
|
||||
@ -1272,6 +1284,7 @@ static void __exit ib_core_cleanup(void)
|
||||
addr_cleanup();
|
||||
rdma_nl_exit();
|
||||
class_unregister(&ib_class);
|
||||
destroy_workqueue(ib_comp_unbound_wq);
|
||||
destroy_workqueue(ib_comp_wq);
|
||||
/* Make sure that any pending umem accounting work is done. */
|
||||
destroy_workqueue(ib_wq);
|
||||
|
@ -3178,7 +3178,7 @@ static int ib_mad_port_open(struct ib_device *device,
|
||||
}
|
||||
|
||||
port_priv->cq = ib_alloc_cq(port_priv->device, port_priv, cq_size, 0,
|
||||
IB_POLL_WORKQUEUE);
|
||||
IB_POLL_UNBOUND_WORKQUEUE);
|
||||
if (IS_ERR(port_priv->cq)) {
|
||||
dev_err(&device->dev, "Couldn't create ib_mad CQ\n");
|
||||
ret = PTR_ERR(port_priv->cq);
|
||||
|
@ -2311,7 +2311,7 @@ struct opa_port_status_req {
|
||||
__be32 vl_select_mask;
|
||||
};
|
||||
|
||||
#define VL_MASK_ALL 0x000080ff
|
||||
#define VL_MASK_ALL 0x00000000000080ffUL
|
||||
|
||||
struct opa_port_status_rsp {
|
||||
__u8 port_num;
|
||||
@ -2610,15 +2610,14 @@ static int pma_get_opa_classportinfo(struct opa_pma_mad *pmp,
|
||||
}
|
||||
|
||||
static void a0_portstatus(struct hfi1_pportdata *ppd,
|
||||
struct opa_port_status_rsp *rsp, u32 vl_select_mask)
|
||||
struct opa_port_status_rsp *rsp)
|
||||
{
|
||||
if (!is_bx(ppd->dd)) {
|
||||
unsigned long vl;
|
||||
u64 sum_vl_xmit_wait = 0;
|
||||
u32 vl_all_mask = VL_MASK_ALL;
|
||||
unsigned long vl_all_mask = VL_MASK_ALL;
|
||||
|
||||
for_each_set_bit(vl, (unsigned long *)&(vl_all_mask),
|
||||
8 * sizeof(vl_all_mask)) {
|
||||
for_each_set_bit(vl, &vl_all_mask, BITS_PER_LONG) {
|
||||
u64 tmp = sum_vl_xmit_wait +
|
||||
read_port_cntr(ppd, C_TX_WAIT_VL,
|
||||
idx_from_vl(vl));
|
||||
@ -2642,12 +2641,12 @@ static int pma_get_opa_portstatus(struct opa_pma_mad *pmp,
|
||||
(struct opa_port_status_req *)pmp->data;
|
||||
struct hfi1_devdata *dd = dd_from_ibdev(ibdev);
|
||||
struct opa_port_status_rsp *rsp;
|
||||
u32 vl_select_mask = be32_to_cpu(req->vl_select_mask);
|
||||
unsigned long vl_select_mask = be32_to_cpu(req->vl_select_mask);
|
||||
unsigned long vl;
|
||||
size_t response_data_size;
|
||||
u32 nports = be32_to_cpu(pmp->mad_hdr.attr_mod) >> 24;
|
||||
u8 port_num = req->port_num;
|
||||
u8 num_vls = hweight32(vl_select_mask);
|
||||
u8 num_vls = hweight64(vl_select_mask);
|
||||
struct _vls_pctrs *vlinfo;
|
||||
struct hfi1_ibport *ibp = to_iport(ibdev, port);
|
||||
struct hfi1_pportdata *ppd = ppd_from_ibp(ibp);
|
||||
@ -2681,7 +2680,7 @@ static int pma_get_opa_portstatus(struct opa_pma_mad *pmp,
|
||||
|
||||
hfi1_read_link_quality(dd, &rsp->link_quality_indicator);
|
||||
|
||||
rsp->vl_select_mask = cpu_to_be32(vl_select_mask);
|
||||
rsp->vl_select_mask = cpu_to_be32((u32)vl_select_mask);
|
||||
rsp->port_xmit_data = cpu_to_be64(read_dev_cntr(dd, C_DC_XMIT_FLITS,
|
||||
CNTR_INVALID_VL));
|
||||
rsp->port_rcv_data = cpu_to_be64(read_dev_cntr(dd, C_DC_RCV_FLITS,
|
||||
@ -2744,8 +2743,7 @@ static int pma_get_opa_portstatus(struct opa_pma_mad *pmp,
|
||||
* So in the for_each_set_bit() loop below, we don't need
|
||||
* any additional checks for vl.
|
||||
*/
|
||||
for_each_set_bit(vl, (unsigned long *)&(vl_select_mask),
|
||||
8 * sizeof(vl_select_mask)) {
|
||||
for_each_set_bit(vl, &vl_select_mask, BITS_PER_LONG) {
|
||||
memset(vlinfo, 0, sizeof(*vlinfo));
|
||||
|
||||
tmp = read_dev_cntr(dd, C_DC_RX_FLIT_VL, idx_from_vl(vl));
|
||||
@ -2782,7 +2780,7 @@ static int pma_get_opa_portstatus(struct opa_pma_mad *pmp,
|
||||
vfi++;
|
||||
}
|
||||
|
||||
a0_portstatus(ppd, rsp, vl_select_mask);
|
||||
a0_portstatus(ppd, rsp);
|
||||
|
||||
if (resp_len)
|
||||
*resp_len += response_data_size;
|
||||
@ -2829,16 +2827,14 @@ static u64 get_error_counter_summary(struct ib_device *ibdev, u8 port,
|
||||
return error_counter_summary;
|
||||
}
|
||||
|
||||
static void a0_datacounters(struct hfi1_pportdata *ppd, struct _port_dctrs *rsp,
|
||||
u32 vl_select_mask)
|
||||
static void a0_datacounters(struct hfi1_pportdata *ppd, struct _port_dctrs *rsp)
|
||||
{
|
||||
if (!is_bx(ppd->dd)) {
|
||||
unsigned long vl;
|
||||
u64 sum_vl_xmit_wait = 0;
|
||||
u32 vl_all_mask = VL_MASK_ALL;
|
||||
unsigned long vl_all_mask = VL_MASK_ALL;
|
||||
|
||||
for_each_set_bit(vl, (unsigned long *)&(vl_all_mask),
|
||||
8 * sizeof(vl_all_mask)) {
|
||||
for_each_set_bit(vl, &vl_all_mask, BITS_PER_LONG) {
|
||||
u64 tmp = sum_vl_xmit_wait +
|
||||
read_port_cntr(ppd, C_TX_WAIT_VL,
|
||||
idx_from_vl(vl));
|
||||
@ -2894,7 +2890,7 @@ static int pma_get_opa_datacounters(struct opa_pma_mad *pmp,
|
||||
u64 port_mask;
|
||||
u8 port_num;
|
||||
unsigned long vl;
|
||||
u32 vl_select_mask;
|
||||
unsigned long vl_select_mask;
|
||||
int vfi;
|
||||
|
||||
num_ports = be32_to_cpu(pmp->mad_hdr.attr_mod) >> 24;
|
||||
@ -2963,8 +2959,7 @@ static int pma_get_opa_datacounters(struct opa_pma_mad *pmp,
|
||||
* So in the for_each_set_bit() loop below, we don't need
|
||||
* any additional checks for vl.
|
||||
*/
|
||||
for_each_set_bit(vl, (unsigned long *)&(vl_select_mask),
|
||||
8 * sizeof(req->vl_select_mask)) {
|
||||
for_each_set_bit(vl, &vl_select_mask, BITS_PER_LONG) {
|
||||
memset(vlinfo, 0, sizeof(*vlinfo));
|
||||
|
||||
rsp->vls[vfi].port_vl_xmit_data =
|
||||
@ -3007,7 +3002,7 @@ static int pma_get_opa_datacounters(struct opa_pma_mad *pmp,
|
||||
vfi++;
|
||||
}
|
||||
|
||||
a0_datacounters(ppd, rsp, vl_select_mask);
|
||||
a0_datacounters(ppd, rsp);
|
||||
|
||||
if (resp_len)
|
||||
*resp_len += response_data_size;
|
||||
@ -3102,7 +3097,7 @@ static int pma_get_opa_porterrors(struct opa_pma_mad *pmp,
|
||||
struct _vls_ectrs *vlinfo;
|
||||
unsigned long vl;
|
||||
u64 port_mask, tmp;
|
||||
u32 vl_select_mask;
|
||||
unsigned long vl_select_mask;
|
||||
int vfi;
|
||||
|
||||
req = (struct opa_port_error_counters64_msg *)pmp->data;
|
||||
@ -3161,8 +3156,7 @@ static int pma_get_opa_porterrors(struct opa_pma_mad *pmp,
|
||||
vlinfo = &rsp->vls[0];
|
||||
vfi = 0;
|
||||
vl_select_mask = be32_to_cpu(req->vl_select_mask);
|
||||
for_each_set_bit(vl, (unsigned long *)&(vl_select_mask),
|
||||
8 * sizeof(req->vl_select_mask)) {
|
||||
for_each_set_bit(vl, &vl_select_mask, BITS_PER_LONG) {
|
||||
memset(vlinfo, 0, sizeof(*vlinfo));
|
||||
rsp->vls[vfi].port_vl_xmit_discards =
|
||||
cpu_to_be64(read_port_cntr(ppd, C_SW_XMIT_DSCD_VL,
|
||||
@ -3372,7 +3366,7 @@ static int pma_set_opa_portstatus(struct opa_pma_mad *pmp,
|
||||
u32 nports = be32_to_cpu(pmp->mad_hdr.attr_mod) >> 24;
|
||||
u64 portn = be64_to_cpu(req->port_select_mask[3]);
|
||||
u32 counter_select = be32_to_cpu(req->counter_select_mask);
|
||||
u32 vl_select_mask = VL_MASK_ALL; /* clear all per-vl cnts */
|
||||
unsigned long vl_select_mask = VL_MASK_ALL; /* clear all per-vl cnts */
|
||||
unsigned long vl;
|
||||
|
||||
if ((nports != 1) || (portn != 1 << port)) {
|
||||
@ -3464,8 +3458,7 @@ static int pma_set_opa_portstatus(struct opa_pma_mad *pmp,
|
||||
if (counter_select & CS_UNCORRECTABLE_ERRORS)
|
||||
write_dev_cntr(dd, C_DC_UNC_ERR, CNTR_INVALID_VL, 0);
|
||||
|
||||
for_each_set_bit(vl, (unsigned long *)&(vl_select_mask),
|
||||
8 * sizeof(vl_select_mask)) {
|
||||
for_each_set_bit(vl, &vl_select_mask, BITS_PER_LONG) {
|
||||
if (counter_select & CS_PORT_XMIT_DATA)
|
||||
write_port_cntr(ppd, C_TX_FLIT_VL, idx_from_vl(vl), 0);
|
||||
|
||||
|
@ -2568,7 +2568,9 @@ static int map_sg(struct device *dev, struct scatterlist *sglist,
|
||||
|
||||
bus_addr = address + s->dma_address + (j << PAGE_SHIFT);
|
||||
phys_addr = (sg_phys(s) & PAGE_MASK) + (j << PAGE_SHIFT);
|
||||
ret = iommu_map_page(domain, bus_addr, phys_addr, PAGE_SIZE, prot, GFP_ATOMIC);
|
||||
ret = iommu_map_page(domain, bus_addr, phys_addr,
|
||||
PAGE_SIZE, prot,
|
||||
GFP_ATOMIC | __GFP_NOWARN);
|
||||
if (ret)
|
||||
goto out_unmap;
|
||||
|
||||
|
@ -625,7 +625,9 @@ void queue_iova(struct iova_domain *iovad,
|
||||
|
||||
spin_unlock_irqrestore(&fq->lock, flags);
|
||||
|
||||
if (atomic_cmpxchg(&iovad->fq_timer_on, 0, 1) == 0)
|
||||
/* Avoid false sharing as much as possible. */
|
||||
if (!atomic_read(&iovad->fq_timer_on) &&
|
||||
!atomic_cmpxchg(&iovad->fq_timer_on, 0, 1))
|
||||
mod_timer(&iovad->fq_timer,
|
||||
jiffies + msecs_to_jiffies(IOVA_FQ_TIMEOUT));
|
||||
|
||||
|
@ -2269,14 +2269,13 @@ static void its_irq_domain_free(struct irq_domain *domain, unsigned int virq,
|
||||
struct its_node *its = its_dev->its;
|
||||
int i;
|
||||
|
||||
bitmap_release_region(its_dev->event_map.lpi_map,
|
||||
its_get_event_id(irq_domain_get_irq_data(domain, virq)),
|
||||
get_count_order(nr_irqs));
|
||||
|
||||
for (i = 0; i < nr_irqs; i++) {
|
||||
struct irq_data *data = irq_domain_get_irq_data(domain,
|
||||
virq + i);
|
||||
u32 event = its_get_event_id(data);
|
||||
|
||||
/* Mark interrupt index as unused */
|
||||
clear_bit(event, its_dev->event_map.lpi_map);
|
||||
|
||||
/* Nuke the entry in the domain */
|
||||
irq_domain_reset_irq_data(data);
|
||||
}
|
||||
|
@ -766,6 +766,8 @@ base_sock_create(struct net *net, struct socket *sock, int protocol, int kern)
|
||||
|
||||
if (sock->type != SOCK_RAW)
|
||||
return -ESOCKTNOSUPPORT;
|
||||
if (!capable(CAP_NET_RAW))
|
||||
return -EPERM;
|
||||
|
||||
sk = sk_alloc(net, PF_ISDN, GFP_KERNEL, &mISDN_proto, kern);
|
||||
if (!sk)
|
||||
|
@ -263,7 +263,11 @@ static void lp5562_firmware_loaded(struct lp55xx_chip *chip)
|
||||
{
|
||||
const struct firmware *fw = chip->fw;
|
||||
|
||||
if (fw->size > LP5562_PROGRAM_LENGTH) {
|
||||
/*
|
||||
* the firmware is encoded in ascii hex character, with 2 chars
|
||||
* per byte
|
||||
*/
|
||||
if (fw->size > (LP5562_PROGRAM_LENGTH * 2)) {
|
||||
dev_err(&chip->cl->dev, "firmware data size overflow: %zu\n",
|
||||
fw->size);
|
||||
return;
|
||||
|
@ -133,8 +133,6 @@ static int dmz_submit_bio(struct dmz_target *dmz, struct dm_zone *zone,
|
||||
|
||||
atomic_inc(&bioctx->ref);
|
||||
generic_make_request(clone);
|
||||
if (clone->bi_status == BLK_STS_IOERR)
|
||||
return -EIO;
|
||||
|
||||
if (bio_op(bio) == REQ_OP_WRITE && dmz_is_seq(zone))
|
||||
zone->wp_block += nr_blocks;
|
||||
|
@ -1763,8 +1763,15 @@ static int super_1_validate(struct mddev *mddev, struct md_rdev *rdev)
|
||||
if (!(le32_to_cpu(sb->feature_map) &
|
||||
MD_FEATURE_RECOVERY_BITMAP))
|
||||
rdev->saved_raid_disk = -1;
|
||||
} else
|
||||
set_bit(In_sync, &rdev->flags);
|
||||
} else {
|
||||
/*
|
||||
* If the array is FROZEN, then the device can't
|
||||
* be in_sync with rest of array.
|
||||
*/
|
||||
if (!test_bit(MD_RECOVERY_FROZEN,
|
||||
&mddev->recovery))
|
||||
set_bit(In_sync, &rdev->flags);
|
||||
}
|
||||
rdev->raid_disk = role;
|
||||
break;
|
||||
}
|
||||
@ -4101,7 +4108,7 @@ array_state_show(struct mddev *mddev, char *page)
|
||||
{
|
||||
enum array_state st = inactive;
|
||||
|
||||
if (mddev->pers)
|
||||
if (mddev->pers && !test_bit(MD_NOT_READY, &mddev->flags))
|
||||
switch(mddev->ro) {
|
||||
case 1:
|
||||
st = readonly;
|
||||
@ -5662,9 +5669,6 @@ int md_run(struct mddev *mddev)
|
||||
md_update_sb(mddev, 0);
|
||||
|
||||
md_new_event(mddev);
|
||||
sysfs_notify_dirent_safe(mddev->sysfs_state);
|
||||
sysfs_notify_dirent_safe(mddev->sysfs_action);
|
||||
sysfs_notify(&mddev->kobj, NULL, "degraded");
|
||||
return 0;
|
||||
|
||||
abort:
|
||||
@ -5685,6 +5689,7 @@ static int do_md_run(struct mddev *mddev)
|
||||
{
|
||||
int err;
|
||||
|
||||
set_bit(MD_NOT_READY, &mddev->flags);
|
||||
err = md_run(mddev);
|
||||
if (err)
|
||||
goto out;
|
||||
@ -5702,9 +5707,14 @@ static int do_md_run(struct mddev *mddev)
|
||||
|
||||
set_capacity(mddev->gendisk, mddev->array_sectors);
|
||||
revalidate_disk(mddev->gendisk);
|
||||
clear_bit(MD_NOT_READY, &mddev->flags);
|
||||
mddev->changed = 1;
|
||||
kobject_uevent(&disk_to_dev(mddev->gendisk)->kobj, KOBJ_CHANGE);
|
||||
sysfs_notify_dirent_safe(mddev->sysfs_state);
|
||||
sysfs_notify_dirent_safe(mddev->sysfs_action);
|
||||
sysfs_notify(&mddev->kobj, NULL, "degraded");
|
||||
out:
|
||||
clear_bit(MD_NOT_READY, &mddev->flags);
|
||||
return err;
|
||||
}
|
||||
|
||||
@ -8755,6 +8765,7 @@ void md_check_recovery(struct mddev *mddev)
|
||||
|
||||
if (mddev_trylock(mddev)) {
|
||||
int spares = 0;
|
||||
bool try_set_sync = mddev->safemode != 0;
|
||||
|
||||
if (!mddev->external && mddev->safemode == 1)
|
||||
mddev->safemode = 0;
|
||||
@ -8800,7 +8811,7 @@ void md_check_recovery(struct mddev *mddev)
|
||||
}
|
||||
}
|
||||
|
||||
if (!mddev->external && !mddev->in_sync) {
|
||||
if (try_set_sync && !mddev->external && !mddev->in_sync) {
|
||||
spin_lock(&mddev->lock);
|
||||
set_in_sync(mddev);
|
||||
spin_unlock(&mddev->lock);
|
||||
@ -8906,7 +8917,8 @@ void md_reap_sync_thread(struct mddev *mddev)
|
||||
/* resync has finished, collect result */
|
||||
md_unregister_thread(&mddev->sync_thread);
|
||||
if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery) &&
|
||||
!test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) {
|
||||
!test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery) &&
|
||||
mddev->degraded != mddev->raid_disks) {
|
||||
/* success...*/
|
||||
/* activate any spares */
|
||||
if (mddev->pers->spare_active(mddev)) {
|
||||
|
@ -243,6 +243,9 @@ enum mddev_flags {
|
||||
MD_UPDATING_SB, /* md_check_recovery is updating the metadata
|
||||
* without explicitly holding reconfig_mutex.
|
||||
*/
|
||||
MD_NOT_READY, /* do_md_run() is active, so 'array_state'
|
||||
* must not report that array is ready yet
|
||||
*/
|
||||
};
|
||||
|
||||
enum mddev_sb_flags {
|
||||
|
@ -26,6 +26,9 @@
|
||||
#include "raid0.h"
|
||||
#include "raid5.h"
|
||||
|
||||
static int default_layout = 0;
|
||||
module_param(default_layout, int, 0644);
|
||||
|
||||
#define UNSUPPORTED_MDDEV_FLAGS \
|
||||
((1L << MD_HAS_JOURNAL) | \
|
||||
(1L << MD_JOURNAL_CLEAN) | \
|
||||
@ -146,6 +149,19 @@ static int create_strip_zones(struct mddev *mddev, struct r0conf **private_conf)
|
||||
}
|
||||
pr_debug("md/raid0:%s: FINAL %d zones\n",
|
||||
mdname(mddev), conf->nr_strip_zones);
|
||||
|
||||
if (conf->nr_strip_zones == 1) {
|
||||
conf->layout = RAID0_ORIG_LAYOUT;
|
||||
} else if (default_layout == RAID0_ORIG_LAYOUT ||
|
||||
default_layout == RAID0_ALT_MULTIZONE_LAYOUT) {
|
||||
conf->layout = default_layout;
|
||||
} else {
|
||||
pr_err("md/raid0:%s: cannot assemble multi-zone RAID0 with default_layout setting\n",
|
||||
mdname(mddev));
|
||||
pr_err("md/raid0: please set raid.default_layout to 1 or 2\n");
|
||||
err = -ENOTSUPP;
|
||||
goto abort;
|
||||
}
|
||||
/*
|
||||
* now since we have the hard sector sizes, we can make sure
|
||||
* chunk size is a multiple of that sector size
|
||||
@ -552,10 +568,12 @@ static void raid0_handle_discard(struct mddev *mddev, struct bio *bio)
|
||||
|
||||
static bool raid0_make_request(struct mddev *mddev, struct bio *bio)
|
||||
{
|
||||
struct r0conf *conf = mddev->private;
|
||||
struct strip_zone *zone;
|
||||
struct md_rdev *tmp_dev;
|
||||
sector_t bio_sector;
|
||||
sector_t sector;
|
||||
sector_t orig_sector;
|
||||
unsigned chunk_sects;
|
||||
unsigned sectors;
|
||||
|
||||
@ -588,8 +606,21 @@ static bool raid0_make_request(struct mddev *mddev, struct bio *bio)
|
||||
bio = split;
|
||||
}
|
||||
|
||||
orig_sector = sector;
|
||||
zone = find_zone(mddev->private, §or);
|
||||
tmp_dev = map_sector(mddev, zone, sector, §or);
|
||||
switch (conf->layout) {
|
||||
case RAID0_ORIG_LAYOUT:
|
||||
tmp_dev = map_sector(mddev, zone, orig_sector, §or);
|
||||
break;
|
||||
case RAID0_ALT_MULTIZONE_LAYOUT:
|
||||
tmp_dev = map_sector(mddev, zone, sector, §or);
|
||||
break;
|
||||
default:
|
||||
WARN("md/raid0:%s: Invalid layout\n", mdname(mddev));
|
||||
bio_io_error(bio);
|
||||
return true;
|
||||
}
|
||||
|
||||
bio_set_dev(bio, tmp_dev->bdev);
|
||||
bio->bi_iter.bi_sector = sector + zone->dev_start +
|
||||
tmp_dev->data_offset;
|
||||
|
@ -8,11 +8,25 @@ struct strip_zone {
|
||||
int nb_dev; /* # of devices attached to the zone */
|
||||
};
|
||||
|
||||
/* Linux 3.14 (20d0189b101) made an unintended change to
|
||||
* the RAID0 layout for multi-zone arrays (where devices aren't all
|
||||
* the same size.
|
||||
* RAID0_ORIG_LAYOUT restores the original layout
|
||||
* RAID0_ALT_MULTIZONE_LAYOUT uses the altered layout
|
||||
* The layouts are identical when there is only one zone (all
|
||||
* devices the same size).
|
||||
*/
|
||||
|
||||
enum r0layout {
|
||||
RAID0_ORIG_LAYOUT = 1,
|
||||
RAID0_ALT_MULTIZONE_LAYOUT = 2,
|
||||
};
|
||||
struct r0conf {
|
||||
struct strip_zone *strip_zone;
|
||||
struct md_rdev **devlist; /* lists of rdevs, pointed to
|
||||
* by strip_zone->dev */
|
||||
int nr_strip_zones;
|
||||
enum r0layout layout;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -435,19 +435,21 @@ static void raid1_end_write_request(struct bio *bio)
|
||||
/* We never try FailFast to WriteMostly devices */
|
||||
!test_bit(WriteMostly, &rdev->flags)) {
|
||||
md_error(r1_bio->mddev, rdev);
|
||||
if (!test_bit(Faulty, &rdev->flags))
|
||||
/* This is the only remaining device,
|
||||
* We need to retry the write without
|
||||
* FailFast
|
||||
*/
|
||||
set_bit(R1BIO_WriteError, &r1_bio->state);
|
||||
else {
|
||||
/* Finished with this branch */
|
||||
r1_bio->bios[mirror] = NULL;
|
||||
to_put = bio;
|
||||
}
|
||||
} else
|
||||
}
|
||||
|
||||
/*
|
||||
* When the device is faulty, it is not necessary to
|
||||
* handle write error.
|
||||
* For failfast, this is the only remaining device,
|
||||
* We need to retry the write without FailFast.
|
||||
*/
|
||||
if (!test_bit(Faulty, &rdev->flags))
|
||||
set_bit(R1BIO_WriteError, &r1_bio->state);
|
||||
else {
|
||||
/* Finished with this branch */
|
||||
r1_bio->bios[mirror] = NULL;
|
||||
to_put = bio;
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
* Set R1BIO_Uptodate in our master bio, so that we
|
||||
@ -3097,6 +3099,13 @@ static int raid1_run(struct mddev *mddev)
|
||||
!test_bit(In_sync, &conf->mirrors[i].rdev->flags) ||
|
||||
test_bit(Faulty, &conf->mirrors[i].rdev->flags))
|
||||
mddev->degraded++;
|
||||
/*
|
||||
* RAID1 needs at least one disk in active
|
||||
*/
|
||||
if (conf->raid_disks - mddev->degraded < 1) {
|
||||
ret = -EINVAL;
|
||||
goto abort;
|
||||
}
|
||||
|
||||
if (conf->raid_disks - mddev->degraded == 1)
|
||||
mddev->recovery_cp = MaxSector;
|
||||
@ -3130,8 +3139,12 @@ static int raid1_run(struct mddev *mddev)
|
||||
ret = md_integrity_register(mddev);
|
||||
if (ret) {
|
||||
md_unregister_thread(&mddev->thread);
|
||||
raid1_free(mddev, conf);
|
||||
goto abort;
|
||||
}
|
||||
return 0;
|
||||
|
||||
abort:
|
||||
raid1_free(mddev, conf);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -2538,7 +2538,8 @@ static void raid5_end_read_request(struct bio * bi)
|
||||
int set_bad = 0;
|
||||
|
||||
clear_bit(R5_UPTODATE, &sh->dev[i].flags);
|
||||
atomic_inc(&rdev->read_errors);
|
||||
if (!(bi->bi_status == BLK_STS_PROTECTION))
|
||||
atomic_inc(&rdev->read_errors);
|
||||
if (test_bit(R5_ReadRepl, &sh->dev[i].flags))
|
||||
pr_warn_ratelimited(
|
||||
"md/raid:%s: read error on replacement device (sector %llu on %s).\n",
|
||||
@ -2570,7 +2571,9 @@ static void raid5_end_read_request(struct bio * bi)
|
||||
&& !test_bit(R5_ReadNoMerge, &sh->dev[i].flags))
|
||||
retry = 1;
|
||||
if (retry)
|
||||
if (test_bit(R5_ReadNoMerge, &sh->dev[i].flags)) {
|
||||
if (sh->qd_idx >= 0 && sh->pd_idx == i)
|
||||
set_bit(R5_ReadError, &sh->dev[i].flags);
|
||||
else if (test_bit(R5_ReadNoMerge, &sh->dev[i].flags)) {
|
||||
set_bit(R5_ReadError, &sh->dev[i].flags);
|
||||
clear_bit(R5_ReadNoMerge, &sh->dev[i].flags);
|
||||
} else
|
||||
@ -5718,7 +5721,8 @@ static bool raid5_make_request(struct mddev *mddev, struct bio * bi)
|
||||
do_flush = false;
|
||||
}
|
||||
|
||||
set_bit(STRIPE_HANDLE, &sh->state);
|
||||
if (!sh->batch_head)
|
||||
set_bit(STRIPE_HANDLE, &sh->state);
|
||||
clear_bit(STRIPE_DELAYED, &sh->state);
|
||||
if ((!sh->batch_head || sh == sh->batch_head) &&
|
||||
(bi->bi_opf & REQ_SYNC) &&
|
||||
|
@ -130,6 +130,8 @@ void cec_notifier_unregister(struct cec_notifier *n)
|
||||
{
|
||||
mutex_lock(&n->lock);
|
||||
n->callback = NULL;
|
||||
n->cec_adap->notifier = NULL;
|
||||
n->cec_adap = NULL;
|
||||
mutex_unlock(&n->lock);
|
||||
cec_notifier_put(n);
|
||||
}
|
||||
|
@ -316,8 +316,10 @@ static int dvb_create_media_entity(struct dvb_device *dvbdev,
|
||||
if (npads) {
|
||||
dvbdev->pads = kcalloc(npads, sizeof(*dvbdev->pads),
|
||||
GFP_KERNEL);
|
||||
if (!dvbdev->pads)
|
||||
if (!dvbdev->pads) {
|
||||
kfree(dvbdev->entity);
|
||||
return -ENOMEM;
|
||||
}
|
||||
}
|
||||
|
||||
switch (type) {
|
||||
|
@ -2261,9 +2261,14 @@ static int ov5640_probe(struct i2c_client *client,
|
||||
/* request optional power down pin */
|
||||
sensor->pwdn_gpio = devm_gpiod_get_optional(dev, "powerdown",
|
||||
GPIOD_OUT_HIGH);
|
||||
if (IS_ERR(sensor->pwdn_gpio))
|
||||
return PTR_ERR(sensor->pwdn_gpio);
|
||||
|
||||
/* request optional reset pin */
|
||||
sensor->reset_gpio = devm_gpiod_get_optional(dev, "reset",
|
||||
GPIOD_OUT_HIGH);
|
||||
if (IS_ERR(sensor->reset_gpio))
|
||||
return PTR_ERR(sensor->reset_gpio);
|
||||
|
||||
v4l2_i2c_subdev_init(&sensor->sd, client, &ov5640_subdev_ops);
|
||||
|
||||
|
@ -53,6 +53,8 @@
|
||||
#define OV5645_CHIP_ID_HIGH_BYTE 0x56
|
||||
#define OV5645_CHIP_ID_LOW 0x300b
|
||||
#define OV5645_CHIP_ID_LOW_BYTE 0x45
|
||||
#define OV5645_IO_MIPI_CTRL00 0x300e
|
||||
#define OV5645_PAD_OUTPUT00 0x3019
|
||||
#define OV5645_AWB_MANUAL_CONTROL 0x3406
|
||||
#define OV5645_AWB_MANUAL_ENABLE BIT(0)
|
||||
#define OV5645_AEC_PK_MANUAL 0x3503
|
||||
@ -63,6 +65,7 @@
|
||||
#define OV5645_ISP_VFLIP BIT(2)
|
||||
#define OV5645_TIMING_TC_REG21 0x3821
|
||||
#define OV5645_SENSOR_MIRROR BIT(1)
|
||||
#define OV5645_MIPI_CTRL00 0x4800
|
||||
#define OV5645_PRE_ISP_TEST_SETTING_1 0x503d
|
||||
#define OV5645_TEST_PATTERN_MASK 0x3
|
||||
#define OV5645_SET_TEST_PATTERN(x) ((x) & OV5645_TEST_PATTERN_MASK)
|
||||
@ -129,7 +132,6 @@ static const struct reg_value ov5645_global_init_setting[] = {
|
||||
{ 0x3503, 0x07 },
|
||||
{ 0x3002, 0x1c },
|
||||
{ 0x3006, 0xc3 },
|
||||
{ 0x300e, 0x45 },
|
||||
{ 0x3017, 0x00 },
|
||||
{ 0x3018, 0x00 },
|
||||
{ 0x302e, 0x0b },
|
||||
@ -358,7 +360,10 @@ static const struct reg_value ov5645_global_init_setting[] = {
|
||||
{ 0x3a1f, 0x14 },
|
||||
{ 0x0601, 0x02 },
|
||||
{ 0x3008, 0x42 },
|
||||
{ 0x3008, 0x02 }
|
||||
{ 0x3008, 0x02 },
|
||||
{ OV5645_IO_MIPI_CTRL00, 0x40 },
|
||||
{ OV5645_MIPI_CTRL00, 0x24 },
|
||||
{ OV5645_PAD_OUTPUT00, 0x70 }
|
||||
};
|
||||
|
||||
static const struct reg_value ov5645_setting_sxga[] = {
|
||||
@ -743,13 +748,9 @@ static int ov5645_s_power(struct v4l2_subdev *sd, int on)
|
||||
goto exit;
|
||||
}
|
||||
|
||||
ret = ov5645_write_reg(ov5645, OV5645_SYSTEM_CTRL0,
|
||||
OV5645_SYSTEM_CTRL0_STOP);
|
||||
if (ret < 0) {
|
||||
ov5645_set_power_off(ov5645);
|
||||
goto exit;
|
||||
}
|
||||
usleep_range(500, 1000);
|
||||
} else {
|
||||
ov5645_write_reg(ov5645, OV5645_IO_MIPI_CTRL00, 0x58);
|
||||
ov5645_set_power_off(ov5645);
|
||||
}
|
||||
}
|
||||
@ -1069,11 +1070,20 @@ static int ov5645_s_stream(struct v4l2_subdev *subdev, int enable)
|
||||
dev_err(ov5645->dev, "could not sync v4l2 controls\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = ov5645_write_reg(ov5645, OV5645_IO_MIPI_CTRL00, 0x45);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = ov5645_write_reg(ov5645, OV5645_SYSTEM_CTRL0,
|
||||
OV5645_SYSTEM_CTRL0_START);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
} else {
|
||||
ret = ov5645_write_reg(ov5645, OV5645_IO_MIPI_CTRL00, 0x40);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = ov5645_write_reg(ov5645, OV5645_SYSTEM_CTRL0,
|
||||
OV5645_SYSTEM_CTRL0_STOP);
|
||||
if (ret < 0)
|
||||
|
@ -710,6 +710,11 @@ static int ov965x_set_gain(struct ov965x *ov965x, int auto_gain)
|
||||
for (m = 6; m >= 0; m--)
|
||||
if (gain >= (1 << m) * 16)
|
||||
break;
|
||||
|
||||
/* Sanity check: don't adjust the gain with a negative value */
|
||||
if (m < 0)
|
||||
return -EINVAL;
|
||||
|
||||
rgain = (gain - ((1 << m) * 16)) / (1 << m);
|
||||
rgain |= (((1 << m) - 1) << 4);
|
||||
|
||||
|
@ -827,7 +827,7 @@ static int tvp5150_s_ctrl(struct v4l2_ctrl *ctrl)
|
||||
return 0;
|
||||
case V4L2_CID_HUE:
|
||||
tvp5150_write(sd, TVP5150_HUE_CTL, ctrl->val);
|
||||
break;
|
||||
return 0;
|
||||
case V4L2_CID_TEST_PATTERN:
|
||||
decoder->enable = ctrl->val ? false : true;
|
||||
tvp5150_selmux(sd);
|
||||
|
@ -351,7 +351,11 @@ static struct i2c_client saa7134_client_template = {
|
||||
|
||||
/* ----------------------------------------------------------- */
|
||||
|
||||
/* On Medion 7134 reading EEPROM needs DVB-T demod i2c gate open */
|
||||
/*
|
||||
* On Medion 7134 reading the SAA7134 chip config EEPROM needs DVB-T
|
||||
* demod i2c gate closed due to an address clash between this EEPROM
|
||||
* and the demod one.
|
||||
*/
|
||||
static void saa7134_i2c_eeprom_md7134_gate(struct saa7134_dev *dev)
|
||||
{
|
||||
u8 subaddr = 0x7, dmdregval;
|
||||
@ -368,14 +372,14 @@ static void saa7134_i2c_eeprom_md7134_gate(struct saa7134_dev *dev)
|
||||
|
||||
ret = i2c_transfer(&dev->i2c_adap, i2cgatemsg_r, 2);
|
||||
if ((ret == 2) && (dmdregval & 0x2)) {
|
||||
pr_debug("%s: DVB-T demod i2c gate was left closed\n",
|
||||
pr_debug("%s: DVB-T demod i2c gate was left open\n",
|
||||
dev->name);
|
||||
|
||||
data[0] = subaddr;
|
||||
data[1] = (dmdregval & ~0x2);
|
||||
if (i2c_transfer(&dev->i2c_adap, i2cgatemsg_w, 1) != 1)
|
||||
pr_err("%s: EEPROM i2c gate open failure\n",
|
||||
dev->name);
|
||||
pr_err("%s: EEPROM i2c gate close failure\n",
|
||||
dev->name);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -304,6 +304,9 @@ static int hexium_attach(struct saa7146_dev *dev, struct saa7146_pci_extension_d
|
||||
ret = saa7146_register_device(&hexium->video_dev, dev, "hexium gemini", VFL_TYPE_GRABBER);
|
||||
if (ret < 0) {
|
||||
pr_err("cannot register capture v4l2 device. skipping.\n");
|
||||
saa7146_vv_release(dev);
|
||||
i2c_del_adapter(&hexium->i2c_adapter);
|
||||
kfree(hexium);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -819,6 +819,7 @@ static int fimc_is_probe(struct platform_device *pdev)
|
||||
return -ENODEV;
|
||||
|
||||
is->pmu_regs = of_iomap(node, 0);
|
||||
of_node_put(node);
|
||||
if (!is->pmu_regs)
|
||||
return -ENOMEM;
|
||||
|
||||
|
@ -496,6 +496,7 @@ static int fimc_md_register_sensor_entities(struct fimc_md *fmd)
|
||||
continue;
|
||||
|
||||
ret = fimc_md_parse_port_node(fmd, port, index);
|
||||
of_node_put(port);
|
||||
if (ret < 0) {
|
||||
of_node_put(node);
|
||||
goto rpm_put;
|
||||
@ -529,6 +530,7 @@ static int __of_get_csis_id(struct device_node *np)
|
||||
if (!np)
|
||||
return -EINVAL;
|
||||
of_property_read_u32(np, "reg", ®);
|
||||
of_node_put(np);
|
||||
return reg - FIMC_INPUT_MIPI_CSI2_0;
|
||||
}
|
||||
|
||||
|
@ -118,7 +118,9 @@ static int mtk_mdp_probe(struct platform_device *pdev)
|
||||
mutex_init(&mdp->vpulock);
|
||||
|
||||
/* Old dts had the components as child nodes */
|
||||
if (of_get_next_child(dev->of_node, NULL)) {
|
||||
node = of_get_next_child(dev->of_node, NULL);
|
||||
if (node) {
|
||||
of_node_put(node);
|
||||
parent = dev->of_node;
|
||||
dev_warn(dev, "device tree is out of date\n");
|
||||
} else {
|
||||
|
@ -727,6 +727,10 @@ static int isp_pipeline_enable(struct isp_pipeline *pipe,
|
||||
s_stream, mode);
|
||||
pipe->do_propagation = true;
|
||||
}
|
||||
|
||||
/* Stop at the first external sub-device. */
|
||||
if (subdev->dev != isp->dev)
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -841,6 +845,10 @@ static int isp_pipeline_disable(struct isp_pipeline *pipe)
|
||||
&subdev->entity);
|
||||
failure = -ETIMEDOUT;
|
||||
}
|
||||
|
||||
/* Stop at the first external sub-device. */
|
||||
if (subdev->dev != isp->dev)
|
||||
break;
|
||||
}
|
||||
|
||||
return failure;
|
||||
|
@ -2605,6 +2605,7 @@ int omap3isp_ccdc_register_entities(struct isp_ccdc_device *ccdc,
|
||||
int ret;
|
||||
|
||||
/* Register the subdev and video node. */
|
||||
ccdc->subdev.dev = vdev->mdev->dev;
|
||||
ret = v4l2_device_register_subdev(vdev, &ccdc->subdev);
|
||||
if (ret < 0)
|
||||
goto error;
|
||||
|
@ -1034,6 +1034,7 @@ int omap3isp_ccp2_register_entities(struct isp_ccp2_device *ccp2,
|
||||
int ret;
|
||||
|
||||
/* Register the subdev and video nodes. */
|
||||
ccp2->subdev.dev = vdev->mdev->dev;
|
||||
ret = v4l2_device_register_subdev(vdev, &ccp2->subdev);
|
||||
if (ret < 0)
|
||||
goto error;
|
||||
|
@ -1201,6 +1201,7 @@ int omap3isp_csi2_register_entities(struct isp_csi2_device *csi2,
|
||||
int ret;
|
||||
|
||||
/* Register the subdev and video nodes. */
|
||||
csi2->subdev.dev = vdev->mdev->dev;
|
||||
ret = v4l2_device_register_subdev(vdev, &csi2->subdev);
|
||||
if (ret < 0)
|
||||
goto error;
|
||||
|
@ -2228,6 +2228,7 @@ int omap3isp_preview_register_entities(struct isp_prev_device *prev,
|
||||
int ret;
|
||||
|
||||
/* Register the subdev and video nodes. */
|
||||
prev->subdev.dev = vdev->mdev->dev;
|
||||
ret = v4l2_device_register_subdev(vdev, &prev->subdev);
|
||||
if (ret < 0)
|
||||
goto error;
|
||||
|
@ -1684,6 +1684,7 @@ int omap3isp_resizer_register_entities(struct isp_res_device *res,
|
||||
int ret;
|
||||
|
||||
/* Register the subdev and video nodes. */
|
||||
res->subdev.dev = vdev->mdev->dev;
|
||||
ret = v4l2_device_register_subdev(vdev, &res->subdev);
|
||||
if (ret < 0)
|
||||
goto error;
|
||||
|
@ -1018,6 +1018,8 @@ void omap3isp_stat_unregister_entities(struct ispstat *stat)
|
||||
int omap3isp_stat_register_entities(struct ispstat *stat,
|
||||
struct v4l2_device *vdev)
|
||||
{
|
||||
stat->subdev.dev = vdev->mdev->dev;
|
||||
|
||||
return v4l2_device_register_subdev(vdev, &stat->subdev);
|
||||
}
|
||||
|
||||
|
@ -2310,7 +2310,7 @@ static int fdp1_probe(struct platform_device *pdev)
|
||||
fdp1->fcp = rcar_fcp_get(fcp_node);
|
||||
of_node_put(fcp_node);
|
||||
if (IS_ERR(fdp1->fcp)) {
|
||||
dev_err(&pdev->dev, "FCP not found (%ld)\n",
|
||||
dev_dbg(&pdev->dev, "FCP not found (%ld)\n",
|
||||
PTR_ERR(fdp1->fcp));
|
||||
return PTR_ERR(fdp1->fcp);
|
||||
}
|
||||
|
@ -737,7 +737,7 @@ static int si470x_usb_driver_probe(struct usb_interface *intf,
|
||||
/* start radio */
|
||||
retval = si470x_start_usb(radio);
|
||||
if (retval < 0)
|
||||
goto err_all;
|
||||
goto err_buf;
|
||||
|
||||
/* set initial frequency */
|
||||
si470x_set_freq(radio, 87.5 * FREQ_MUL); /* available in all regions */
|
||||
@ -752,6 +752,8 @@ static int si470x_usb_driver_probe(struct usb_interface *intf,
|
||||
|
||||
return 0;
|
||||
err_all:
|
||||
usb_kill_urb(radio->int_in_urb);
|
||||
err_buf:
|
||||
kfree(radio->buffer);
|
||||
err_ctrl:
|
||||
v4l2_ctrl_handler_free(&radio->hdl);
|
||||
@ -825,6 +827,7 @@ static void si470x_usb_driver_disconnect(struct usb_interface *intf)
|
||||
mutex_lock(&radio->lock);
|
||||
v4l2_device_disconnect(&radio->v4l2_dev);
|
||||
video_unregister_device(&radio->videodev);
|
||||
usb_kill_urb(radio->int_in_urb);
|
||||
usb_set_intfdata(intf, NULL);
|
||||
mutex_unlock(&radio->lock);
|
||||
v4l2_device_put(&radio->v4l2_dev);
|
||||
|
@ -427,6 +427,10 @@ static int iguanair_probe(struct usb_interface *intf,
|
||||
int ret, pipein, pipeout;
|
||||
struct usb_host_interface *idesc;
|
||||
|
||||
idesc = intf->altsetting;
|
||||
if (idesc->desc.bNumEndpoints < 2)
|
||||
return -ENODEV;
|
||||
|
||||
ir = kzalloc(sizeof(*ir), GFP_KERNEL);
|
||||
rc = rc_allocate_device(RC_DRIVER_IR_RAW);
|
||||
if (!ir || !rc) {
|
||||
@ -441,18 +445,13 @@ static int iguanair_probe(struct usb_interface *intf,
|
||||
ir->urb_in = usb_alloc_urb(0, GFP_KERNEL);
|
||||
ir->urb_out = usb_alloc_urb(0, GFP_KERNEL);
|
||||
|
||||
if (!ir->buf_in || !ir->packet || !ir->urb_in || !ir->urb_out) {
|
||||
if (!ir->buf_in || !ir->packet || !ir->urb_in || !ir->urb_out ||
|
||||
!usb_endpoint_is_int_in(&idesc->endpoint[0].desc) ||
|
||||
!usb_endpoint_is_int_out(&idesc->endpoint[1].desc)) {
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
|
||||
idesc = intf->altsetting;
|
||||
|
||||
if (idesc->desc.bNumEndpoints < 2) {
|
||||
ret = -ENODEV;
|
||||
goto out;
|
||||
}
|
||||
|
||||
ir->rc = rc;
|
||||
ir->dev = &intf->dev;
|
||||
ir->udev = udev;
|
||||
|
@ -1963,12 +1963,17 @@ static void imon_get_ffdc_type(struct imon_context *ictx)
|
||||
break;
|
||||
/* iMON VFD, MCE IR */
|
||||
case 0x46:
|
||||
case 0x7e:
|
||||
case 0x9e:
|
||||
dev_info(ictx->dev, "0xffdc iMON VFD, MCE IR");
|
||||
detected_display_type = IMON_DISPLAY_TYPE_VFD;
|
||||
allowed_protos = RC_PROTO_BIT_RC6_MCE;
|
||||
break;
|
||||
/* iMON VFD, iMON or MCE IR */
|
||||
case 0x7e:
|
||||
dev_info(ictx->dev, "0xffdc iMON VFD, iMON or MCE IR");
|
||||
detected_display_type = IMON_DISPLAY_TYPE_VFD;
|
||||
allowed_protos |= RC_PROTO_BIT_RC6_MCE;
|
||||
break;
|
||||
/* iMON LCD, MCE IR */
|
||||
case 0x9f:
|
||||
dev_info(ictx->dev, "0xffdc iMON LCD, MCE IR");
|
||||
|
@ -44,6 +44,11 @@
|
||||
/* Fields containing pulse width data */
|
||||
#define MTK_WIDTH_MASK (GENMASK(7, 0))
|
||||
|
||||
/* IR threshold */
|
||||
#define MTK_IRTHD 0x14
|
||||
#define MTK_DG_CNT_MASK (GENMASK(12, 8))
|
||||
#define MTK_DG_CNT(x) ((x) << 8)
|
||||
|
||||
/* Bit to enable interrupt */
|
||||
#define MTK_IRINT_EN BIT(0)
|
||||
|
||||
@ -411,6 +416,9 @@ static int mtk_ir_probe(struct platform_device *pdev)
|
||||
mtk_w32_mask(ir, val, ir->data->fields[MTK_HW_PERIOD].mask,
|
||||
ir->data->fields[MTK_HW_PERIOD].reg);
|
||||
|
||||
/* Set de-glitch counter */
|
||||
mtk_w32_mask(ir, MTK_DG_CNT(1), MTK_DG_CNT_MASK, MTK_IRTHD);
|
||||
|
||||
/* Enable IR and PWM */
|
||||
val = mtk_r32(ir, MTK_CONFIG_HIGH_REG);
|
||||
val |= MTK_OK_COUNT(ir->data->ok_count) | MTK_PWM_EN | MTK_IR_EN;
|
||||
|
@ -684,6 +684,10 @@ static int submit_urbs(struct camera_data *cam)
|
||||
if (!urb) {
|
||||
for (j = 0; j < i; j++)
|
||||
usb_free_urb(cam->sbuf[j].urb);
|
||||
for (j = 0; j < NUM_SBUF; j++) {
|
||||
kfree(cam->sbuf[j].data);
|
||||
cam->sbuf[j].data = NULL;
|
||||
}
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
|
@ -2438,9 +2438,13 @@ static int dib9090_tuner_attach(struct dvb_usb_adapter *adap)
|
||||
8, 0x0486,
|
||||
};
|
||||
|
||||
if (!IS_ENABLED(CONFIG_DVB_DIB9000))
|
||||
return -ENODEV;
|
||||
if (dvb_attach(dib0090_fw_register, adap->fe_adap[0].fe, i2c, &dib9090_dib0090_config) == NULL)
|
||||
return -ENODEV;
|
||||
i2c = dib9000_get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_GPIO_1_2, 0);
|
||||
if (!i2c)
|
||||
return -ENODEV;
|
||||
if (dib01x0_pmu_update(i2c, data_dib190, 10) != 0)
|
||||
return -ENODEV;
|
||||
dib0700_set_i2c_speed(adap->dev, 1500);
|
||||
@ -2516,10 +2520,14 @@ static int nim9090md_tuner_attach(struct dvb_usb_adapter *adap)
|
||||
0, 0x00ef,
|
||||
8, 0x0406,
|
||||
};
|
||||
if (!IS_ENABLED(CONFIG_DVB_DIB9000))
|
||||
return -ENODEV;
|
||||
i2c = dib9000_get_tuner_interface(adap->fe_adap[0].fe);
|
||||
if (dvb_attach(dib0090_fw_register, adap->fe_adap[0].fe, i2c, &nim9090md_dib0090_config[0]) == NULL)
|
||||
return -ENODEV;
|
||||
i2c = dib9000_get_i2c_master(adap->fe_adap[0].fe, DIBX000_I2C_INTERFACE_GPIO_1_2, 0);
|
||||
if (!i2c)
|
||||
return -ENODEV;
|
||||
if (dib01x0_pmu_update(i2c, data_dib190, 10) < 0)
|
||||
return -ENODEV;
|
||||
|
||||
|
@ -123,6 +123,11 @@ static void reg_r(struct gspca_dev *gspca_dev, u16 value, u16 index)
|
||||
if (ret < 0) {
|
||||
pr_err("reg_r err %d\n", ret);
|
||||
gspca_dev->usb_err = ret;
|
||||
/*
|
||||
* Make sure the buffer is zeroed to avoid uninitialized
|
||||
* values.
|
||||
*/
|
||||
memset(gspca_dev->usb_buf, 0, 2);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1580,6 +1580,11 @@ static void reg_r(struct gspca_dev *gspca_dev,
|
||||
if (ret < 0) {
|
||||
pr_err("reg_r err %d\n", ret);
|
||||
gspca_dev->usb_err = ret;
|
||||
/*
|
||||
* Make sure the buffer is zeroed to avoid uninitialized
|
||||
* values.
|
||||
*/
|
||||
memset(gspca_dev->usb_buf, 0, USB_BUF_SZ);
|
||||
return;
|
||||
}
|
||||
if (len == 1)
|
||||
|
@ -2083,6 +2083,11 @@ static int reg_r(struct sd *sd, u16 index)
|
||||
} else {
|
||||
PERR("reg_r %02x failed %d\n", index, ret);
|
||||
sd->gspca_dev.usb_err = ret;
|
||||
/*
|
||||
* Make sure the result is zeroed to avoid uninitialized
|
||||
* values.
|
||||
*/
|
||||
gspca_dev->usb_buf[0] = 0;
|
||||
}
|
||||
|
||||
return ret;
|
||||
@ -2111,6 +2116,11 @@ static int reg_r8(struct sd *sd,
|
||||
} else {
|
||||
PERR("reg_r8 %02x failed %d\n", index, ret);
|
||||
sd->gspca_dev.usb_err = ret;
|
||||
/*
|
||||
* Make sure the buffer is zeroed to avoid uninitialized
|
||||
* values.
|
||||
*/
|
||||
memset(gspca_dev->usb_buf, 0, 8);
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
@ -641,6 +641,11 @@ static u8 ov534_reg_read(struct gspca_dev *gspca_dev, u16 reg)
|
||||
if (ret < 0) {
|
||||
pr_err("read failed %d\n", ret);
|
||||
gspca_dev->usb_err = ret;
|
||||
/*
|
||||
* Make sure the result is zeroed to avoid uninitialized
|
||||
* values.
|
||||
*/
|
||||
gspca_dev->usb_buf[0] = 0;
|
||||
}
|
||||
return gspca_dev->usb_buf[0];
|
||||
}
|
||||
|
@ -1153,6 +1153,7 @@ static u8 reg_r(struct gspca_dev *gspca_dev, u16 reg)
|
||||
if (ret < 0) {
|
||||
pr_err("reg_r err %d\n", ret);
|
||||
gspca_dev->usb_err = ret;
|
||||
return 0;
|
||||
}
|
||||
return gspca_dev->usb_buf[0];
|
||||
}
|
||||
|
@ -111,6 +111,11 @@ static void se401_read_req(struct gspca_dev *gspca_dev, u16 req, int silent)
|
||||
pr_err("read req failed req %#04x error %d\n",
|
||||
req, err);
|
||||
gspca_dev->usb_err = err;
|
||||
/*
|
||||
* Make sure the buffer is zeroed to avoid uninitialized
|
||||
* values.
|
||||
*/
|
||||
memset(gspca_dev->usb_buf, 0, READ_REQ_SIZE);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -132,6 +132,13 @@ static const struct dmi_system_id flip_dmi_table[] = {
|
||||
DMI_MATCH(DMI_PRODUCT_VERSION, "0341")
|
||||
}
|
||||
},
|
||||
{
|
||||
.ident = "MSI MS-1039",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "MICRO-STAR INT'L CO.,LTD."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "MS-1039"),
|
||||
}
|
||||
},
|
||||
{
|
||||
.ident = "MSI MS-1632",
|
||||
.matches = {
|
||||
@ -918,6 +925,11 @@ static void reg_r(struct gspca_dev *gspca_dev, u16 reg, u16 length)
|
||||
if (unlikely(result < 0 || result != length)) {
|
||||
pr_err("Read register %02x failed %d\n", reg, result);
|
||||
gspca_dev->usb_err = result;
|
||||
/*
|
||||
* Make sure the buffer is zeroed to avoid uninitialized
|
||||
* values.
|
||||
*/
|
||||
memset(gspca_dev->usb_buf, 0, USB_BUF_SZ);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -462,6 +462,11 @@ static void reg_r(struct gspca_dev *gspca_dev,
|
||||
dev_err(gspca_dev->v4l2_dev.dev,
|
||||
"Error reading register %02x: %d\n", value, res);
|
||||
gspca_dev->usb_err = res;
|
||||
/*
|
||||
* Make sure the result is zeroed to avoid uninitialized
|
||||
* values.
|
||||
*/
|
||||
gspca_dev->usb_buf[0] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user