mirror of
https://github.com/rd-stuffs/msm-4.14.git
synced 2025-02-20 11:45:48 +08:00
Merge android-4.14.29 (45c8dbe) into msm-4.14
* refs/heads/tmp-45c8dbe Linux 4.14.29 usb: dwc3: Fix GDBGFIFOSPACE_TYPE values USB: gadget: udc: Add missing platform_device_put() on error in bdc_pci_probe() scsi: qla2xxx: Fix crashes in qla2x00_probe_one on probe failure scsi: qla2xxx: Fix logo flag for qlt_free_session_done() scsi: qla2xxx: Fix NULL pointer access for fcport structure scsi: qla2xxx: Fix smatch warning in qla25xx_delete_{rsp|req}_que btrfs: Fix memory barriers usage with device stats counters btrfs: remove spurious WARN_ON(ref->count < 0) in find_parent_nodes btrfs: Fix use-after-free when cleaning up fs_devs with a single stale device btrfs: alloc_chunk: fix DUP stripe size handling btrfs: add missing initialization in btrfs_check_shared btrfs: Fix NULL pointer exception in find_bio_stripe irqchip/gic-v3-its: Ensure nr_ites >= nr_lpis RDMAVT: Fix synchronization around percpu_ref fs/aio: Use RCU accessors for kioctx_table->table[] fs/aio: Add explicit RCU grace period when freeing kioctx lock_parent() needs to recheck if dentry got __dentry_kill'ed under it KVM: arm/arm64: vgic: Don't populate multiple LRs with the same vintid kvm: arm/arm64: vgic-v3: Tighten synchronization for guests using v2 on v3 KVM: arm/arm64: Reduce verbosity of KVM init log fs: Teach path_connected to handle nfs filesystems with multiple roots. drm/amdgpu/dce: Don't turn off DP sink when disconnected drm/radeon: fix prime teardown order drm/amdgpu: fix prime teardown order drm/nouveau/bl: Fix oops on driver unbind ALSA: seq: Clear client entry before deleting else at closing ALSA: seq: Fix possible UAF in snd_seq_check_queue() ALSA: hda - Revert power_save option default value ALSA: pcm: Fix UAF in snd_pcm_oss_get_formats() parisc: Handle case where flush_cache_range is called with no context x86/mm: Fix vmalloc_fault to use pXd_large KVM: x86: Fix device passthrough when SME is active x86/speculation: Remove Skylake C2 from Speculation Control microcode blacklist x86/speculation, objtool: Annotate indirect calls/jumps for objtool on 32-bit kernels x86/vm86/32: Fix POPF emulation selftests/x86/entry_from_vm86: Add test cases for POPF selftests/x86: Add tests for the STR and SLDT instructions selftests/x86: Add tests for User-Mode Instruction Prevention selftests/x86/entry_from_vm86: Exit with 1 if we fail x86/cpufeatures: Add Intel PCONFIG cpufeature x86/cpufeatures: Add Intel Total Memory Encryption cpufeature ANDROID: arm-smccc: fix clang build staging: android: ashmem: Fix possible deadlock in ashmem_ioctl Linux 4.14.28 drm/i915/glk: Disable Guc and HuC on GLK dmaengine: qcom_hidma: check pending interrupts IB/mlx5: revisit -Wmaybe-uninitialized warning ima: relax requiring a file signature for new files with zero length locking/locktorture: Fix num reader/writer corner cases rcutorture/configinit: Fix build directory error message ipvlan: add L2 check for packets arriving via virtual devices Fix misannotated out-of-line _copy_to_user() mmc: mmc_test: Ensure command queue is disabled for testing ASoC: nuc900: Fix a loop timeout test crypto: caam/qi - use correct print specifier for size_t mac80211: remove BUG() when interface type is invalid mac80211_hwsim: enforce PS_MANUAL_POLL to be set after PS_ENABLED agp/intel: Flush all chipset writes after updating the GGTT arm64: dts: renesas: salvator-common: Add EthernetAVB PHY reset powerpc/64: Don't trace irqs-off at interrupt return to soft-disabled context powerpc/modules: Don't try to restore r2 after a sibling call drm/amdkfd: Fix memory leaks in kfd topology veth: set peer GSO values net: sched: drop qdisc_reset from dev_graft_qdisc virtio_net: Disable interrupts if napi_complete_done rescheduled napi media: davinci: vpif_capture: add NULL check on devm_kzalloc return value media: cpia2: Fix a couple off by one bugs dm raid: fix raid set size revalidation media: vsp1: Prevent suspending and resuming DRM pipelines scsi: dh: add new rdac devices scsi: devinfo: apply to HP XP the same flags as Hitachi VSP scsi: core: scsi_get_device_flags_keyed(): Always return device flags bnxt_en: Don't print "Link speed -1 no longer supported" messages. spi: sun6i: disable/unprepare clocks on remove tools/usbip: fixes build with musl libc toolchain ath10k: fix invalid STS_CAP_OFFSET_MASK mwifiex: cfg80211: do not change virtual interface during scan processing clk: qcom: msm8916: fix mnd_width for codec_digcodec drm/amdgpu:fix virtual dce bug iwlwifi: mvm: avoid dumping assert log when device is stopped perf annotate: Fix objdump comment parsing for Intel mov dissassembly perf annotate: Fix unnecessary memory allocation for s390x pinctrl: sh-pfc: r8a7795-es1: Fix MOD_SEL1 bit[25:24] to 0x3 when using STP_ISEN_1_D pinctrl: sh-pfc: r8a7791: Add can_clk function drm/sun4i: Fix format mask in DE2 driver pwm: stmpe: Fix wrong register offset for hwpwm=2 case scsi: ses: don't ask for diagnostic pages repeatedly during probe drm/amdgpu:fix random missing of FLR NOTIFY cpufreq: Fix governor module removal race ath10k: update tdls teardown state to target iio: health: max30102: Add power enable parameter to get_temp function iio: adc: ina2xx: Shift bus voltage register to mask flag bits drm/etnaviv: make THERMAL selectable power: supply: ab8500_charger: Bail out in case of error in 'ab8500_charger_init_hw_registers()' power: supply: ab8500_charger: Fix an error handling path leds: pm8058: Silence pointer to integer size warning xfrm: Fix xfrm_replay_overflow_offload_esn userns: Don't fail follow_automount based on s_user_ns mtd: nand: ifc: update bufnum mask for ver >= 2.0.0 ARM: dts: omap3-n900: Fix the audio CODEC's reset pin ARM: dts: am335x-pepper: Fix the audio CODEC's reset pin net: thunderx: Set max queue count taking XDP_TX into account mtd: nand: fix interpretation of NAND_CMD_NONE in nand_command[_lp]() net: xfrm: allow clearing socket xfrm policies. rtc: brcmstb-waketimer: fix error handling in brcmstb_waketmr_probe() net: ieee802154: adf7242: Fix bug if defined DEBUG test_firmware: fix setting old custom fw path back on exit crypto: cavium - fix memory leak on info crypto: ecc - Fix NULL pointer deref. on no default_rng sched: Stop resched_cpu() from sending IPIs to offline CPUs sched: Stop switched_to_rt() from sending IPIs to offline CPUs USB: ledtrig-usbport: fix of-node leak typec: tcpm: fusb302: Resolve out of order messaging events staging: rtl8822be: fix missing null check on dev_alloc_skb return drm/amdgpu: fix get_max_engine_clock_in_mhz ARM: dts: exynos: Correct Trats2 panel reset line clk: meson: gxbb: fix wrong clock for SARADC/SANA ARM: dts: koelsch: Move cec_clock to root node iwlwifi: mvm: rs: don't override the rate history in the search cycle HID: elo: clear BTN_LEFT mapping HID: multitouch: Only look at non touch fields in first packet of a frame video/hdmi: Allow "empty" HDMI infoframes dma-buf/fence: Fix lock inversion within dma-fence-array drm/edid: set ELD connector type in drm_edid_to_eld() Revert "btrfs: use proper endianness accessors for super_copy" dm mpath: fix passing integrity data earlycon: add reg-offset to physical address before mapping serial: core: mark port as initialized in autoconfig serial: 8250_pci: Add Brainboxes UC-260 4 port serial device usb: dwc3: Fix lock-up on ID change during system suspend/resume usb: gadget: f_fs: Fix use-after-free in ffs_fs_kill_sb() usb: usbmon: Read text within supplied buffer size usb: quirks: add control message delay for 1b1c:1b20 usbip: vudc: fix null pointer dereference on udc->lock USB: storage: Add JMicron bridge 152d:2567 to unusual_devs.h staging: android: ashmem: Fix lockdep issue during llseek staging: comedi: fix comedi_nsamples_left. uas: fix comparison for error code tty/serial: atmel: add new version check for usart serial: sh-sci: prevent lockup on full TTY buffers xhci: fix endpoint context tracer output xhci: Fix front USB ports on ASUS PRIME B350M-A usb: host: xhci-rcar: add support for r8a77965 ASoC: rt5651: Fix regcache sync errors on resume ASoC: wm_adsp: For TLV controls only register TLV get/set ASoC: sgtl5000: Fix suspend/resume ASoC: sun4i-i2s: Fix RX slot number of SUN8I x86: Treat R_X86_64_PLT32 as R_X86_64_PC32 net: phy: Restore phy_resume() locking assumption net: phy: fix resume handling ANDROID: sdcardfs: fix lock issue on 32 bit/SMP architectures Change-Id: Ida88909c333e059adf42a8794c3b92b1d15252f7 Signed-off-by: Blagovest Kolenichev <bkolenichev@codeaurora.org> Signed-off-by: Isaac J. Manjarres <isaacm@codeaurora.org>
This commit is contained in:
commit
24b2e60f51
@ -12,6 +12,7 @@ Required properties:
|
||||
- "renesas,xhci-r8a7793" for r8a7793 SoC
|
||||
- "renesas,xhci-r8a7795" for r8a7795 SoC
|
||||
- "renesas,xhci-r8a7796" for r8a7796 SoC
|
||||
- "renesas,xhci-r8a77965" for r8a77965 SoC
|
||||
- "renesas,rcar-gen2-xhci" for a generic R-Car Gen2 compatible device
|
||||
- "renesas,rcar-gen3-xhci" for a generic R-Car Gen3 compatible device
|
||||
- "xhci-platform" (deprecated)
|
||||
|
2
Makefile
2
Makefile
@ -1,7 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 4
|
||||
PATCHLEVEL = 14
|
||||
SUBLEVEL = 27
|
||||
SUBLEVEL = 29
|
||||
EXTRAVERSION =
|
||||
NAME = Petit Gorille
|
||||
|
||||
|
@ -139,7 +139,7 @@
|
||||
&audio_codec {
|
||||
status = "okay";
|
||||
|
||||
gpio-reset = <&gpio1 16 GPIO_ACTIVE_LOW>;
|
||||
reset-gpios = <&gpio1 16 GPIO_ACTIVE_LOW>;
|
||||
AVDD-supply = <&ldo3_reg>;
|
||||
IOVDD-supply = <&ldo3_reg>;
|
||||
DRVDD-supply = <&ldo3_reg>;
|
||||
|
@ -395,7 +395,7 @@
|
||||
reg = <0>;
|
||||
vdd3-supply = <&lcd_vdd3_reg>;
|
||||
vci-supply = <&ldo25_reg>;
|
||||
reset-gpios = <&gpy4 5 GPIO_ACTIVE_HIGH>;
|
||||
reset-gpios = <&gpf2 1 GPIO_ACTIVE_HIGH>;
|
||||
power-on-delay= <50>;
|
||||
reset-delay = <100>;
|
||||
init-delay = <100>;
|
||||
|
@ -558,7 +558,7 @@
|
||||
tlv320aic3x: tlv320aic3x@18 {
|
||||
compatible = "ti,tlv320aic3x";
|
||||
reg = <0x18>;
|
||||
gpio-reset = <&gpio2 28 GPIO_ACTIVE_HIGH>; /* 60 */
|
||||
reset-gpios = <&gpio2 28 GPIO_ACTIVE_LOW>; /* 60 */
|
||||
ai3x-gpio-func = <
|
||||
0 /* AIC3X_GPIO1_FUNC_DISABLED */
|
||||
5 /* AIC3X_GPIO2_FUNC_DIGITAL_MIC_INPUT */
|
||||
@ -575,7 +575,7 @@
|
||||
tlv320aic3x_aux: tlv320aic3x@19 {
|
||||
compatible = "ti,tlv320aic3x";
|
||||
reg = <0x19>;
|
||||
gpio-reset = <&gpio2 28 GPIO_ACTIVE_HIGH>; /* 60 */
|
||||
reset-gpios = <&gpio2 28 GPIO_ACTIVE_LOW>; /* 60 */
|
||||
|
||||
AVDD-supply = <&vmmc2>;
|
||||
DRVDD-supply = <&vmmc2>;
|
||||
|
@ -278,6 +278,12 @@
|
||||
};
|
||||
};
|
||||
|
||||
cec_clock: cec-clock {
|
||||
compatible = "fixed-clock";
|
||||
#clock-cells = <0>;
|
||||
clock-frequency = <12000000>;
|
||||
};
|
||||
|
||||
hdmi-out {
|
||||
compatible = "hdmi-connector";
|
||||
type = "a";
|
||||
@ -642,12 +648,6 @@
|
||||
};
|
||||
};
|
||||
|
||||
cec_clock: cec-clock {
|
||||
compatible = "fixed-clock";
|
||||
#clock-cells = <0>;
|
||||
clock-frequency = <12000000>;
|
||||
};
|
||||
|
||||
hdmi@39 {
|
||||
compatible = "adi,adv7511w";
|
||||
reg = <0x39>;
|
||||
|
@ -264,6 +264,7 @@
|
||||
reg = <0>;
|
||||
interrupt-parent = <&gpio2>;
|
||||
interrupts = <11 IRQ_TYPE_LEVEL_LOW>;
|
||||
reset-gpios = <&gpio2 10 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -543,7 +543,8 @@ void flush_cache_mm(struct mm_struct *mm)
|
||||
rp3440, etc. So, avoid it if the mm isn't too big. */
|
||||
if ((!IS_ENABLED(CONFIG_SMP) || !arch_irqs_disabled()) &&
|
||||
mm_total_size(mm) >= parisc_cache_flush_threshold) {
|
||||
flush_tlb_all();
|
||||
if (mm->context)
|
||||
flush_tlb_all();
|
||||
flush_cache_all();
|
||||
return;
|
||||
}
|
||||
@ -571,6 +572,8 @@ void flush_cache_mm(struct mm_struct *mm)
|
||||
pfn = pte_pfn(*ptep);
|
||||
if (!pfn_valid(pfn))
|
||||
continue;
|
||||
if (unlikely(mm->context))
|
||||
flush_tlb_page(vma, addr);
|
||||
__flush_cache_page(vma, addr, PFN_PHYS(pfn));
|
||||
}
|
||||
}
|
||||
@ -579,26 +582,46 @@ void flush_cache_mm(struct mm_struct *mm)
|
||||
void flush_cache_range(struct vm_area_struct *vma,
|
||||
unsigned long start, unsigned long end)
|
||||
{
|
||||
pgd_t *pgd;
|
||||
unsigned long addr;
|
||||
|
||||
if ((!IS_ENABLED(CONFIG_SMP) || !arch_irqs_disabled()) &&
|
||||
end - start >= parisc_cache_flush_threshold) {
|
||||
flush_tlb_range(vma, start, end);
|
||||
if (vma->vm_mm->context)
|
||||
flush_tlb_range(vma, start, end);
|
||||
flush_cache_all();
|
||||
return;
|
||||
}
|
||||
|
||||
flush_user_dcache_range_asm(start, end);
|
||||
if (vma->vm_flags & VM_EXEC)
|
||||
flush_user_icache_range_asm(start, end);
|
||||
flush_tlb_range(vma, start, end);
|
||||
if (vma->vm_mm->context == mfsp(3)) {
|
||||
flush_user_dcache_range_asm(start, end);
|
||||
if (vma->vm_flags & VM_EXEC)
|
||||
flush_user_icache_range_asm(start, end);
|
||||
flush_tlb_range(vma, start, end);
|
||||
return;
|
||||
}
|
||||
|
||||
pgd = vma->vm_mm->pgd;
|
||||
for (addr = vma->vm_start; addr < vma->vm_end; addr += PAGE_SIZE) {
|
||||
unsigned long pfn;
|
||||
pte_t *ptep = get_ptep(pgd, addr);
|
||||
if (!ptep)
|
||||
continue;
|
||||
pfn = pte_pfn(*ptep);
|
||||
if (pfn_valid(pfn)) {
|
||||
if (unlikely(vma->vm_mm->context))
|
||||
flush_tlb_page(vma, addr);
|
||||
__flush_cache_page(vma, addr, PFN_PHYS(pfn));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
flush_cache_page(struct vm_area_struct *vma, unsigned long vmaddr, unsigned long pfn)
|
||||
{
|
||||
BUG_ON(!vma->vm_mm->context);
|
||||
|
||||
if (pfn_valid(pfn)) {
|
||||
flush_tlb_page(vma, vmaddr);
|
||||
if (likely(vma->vm_mm->context))
|
||||
flush_tlb_page(vma, vmaddr);
|
||||
__flush_cache_page(vma, vmaddr, PFN_PHYS(pfn));
|
||||
}
|
||||
}
|
||||
|
@ -33,6 +33,7 @@ int patch_branch(unsigned int *addr, unsigned long target, int flags);
|
||||
int patch_instruction(unsigned int *addr, unsigned int instr);
|
||||
|
||||
int instr_is_relative_branch(unsigned int instr);
|
||||
int instr_is_relative_link_branch(unsigned int instr);
|
||||
int instr_is_branch_to_addr(const unsigned int *instr, unsigned long addr);
|
||||
unsigned long branch_target(const unsigned int *instr);
|
||||
unsigned int translate_branch(const unsigned int *dest,
|
||||
|
@ -939,9 +939,13 @@ END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
|
||||
beq 1f
|
||||
rlwinm r7,r7,0,~PACA_IRQ_HARD_DIS
|
||||
stb r7,PACAIRQHAPPENED(r13)
|
||||
1: li r0,0
|
||||
stb r0,PACASOFTIRQEN(r13);
|
||||
TRACE_DISABLE_INTS
|
||||
1:
|
||||
#if defined(CONFIG_TRACE_IRQFLAGS) && defined(CONFIG_BUG)
|
||||
/* The interrupt should not have soft enabled. */
|
||||
lbz r7,PACASOFTIRQEN(r13)
|
||||
1: tdnei r7,0
|
||||
EMIT_BUG_ENTRY 1b,__FILE__,__LINE__,BUGFLAG_WARNING
|
||||
#endif
|
||||
b .Ldo_restore
|
||||
|
||||
/*
|
||||
|
@ -486,7 +486,17 @@ static bool is_early_mcount_callsite(u32 *instruction)
|
||||
restore r2. */
|
||||
static int restore_r2(u32 *instruction, struct module *me)
|
||||
{
|
||||
if (is_early_mcount_callsite(instruction - 1))
|
||||
u32 *prev_insn = instruction - 1;
|
||||
|
||||
if (is_early_mcount_callsite(prev_insn))
|
||||
return 1;
|
||||
|
||||
/*
|
||||
* Make sure the branch isn't a sibling call. Sibling calls aren't
|
||||
* "link" branches and they don't return, so they don't need the r2
|
||||
* restore afterwards.
|
||||
*/
|
||||
if (!instr_is_relative_link_branch(*prev_insn))
|
||||
return 1;
|
||||
|
||||
if (*instruction != PPC_INST_NOP) {
|
||||
|
@ -302,6 +302,11 @@ int instr_is_relative_branch(unsigned int instr)
|
||||
return instr_is_branch_iform(instr) || instr_is_branch_bform(instr);
|
||||
}
|
||||
|
||||
int instr_is_relative_link_branch(unsigned int instr)
|
||||
{
|
||||
return instr_is_relative_branch(instr) && (instr & BRANCH_SET_LINK);
|
||||
}
|
||||
|
||||
static unsigned long branch_iform_target(const unsigned int *instr)
|
||||
{
|
||||
signed long imm;
|
||||
|
@ -314,6 +314,7 @@
|
||||
#define X86_FEATURE_VPCLMULQDQ (16*32+10) /* Carry-Less Multiplication Double Quadword */
|
||||
#define X86_FEATURE_AVX512_VNNI (16*32+11) /* Vector Neural Network Instructions */
|
||||
#define X86_FEATURE_AVX512_BITALG (16*32+12) /* Support for VPOPCNT[B,W] and VPSHUF-BITQMB instructions */
|
||||
#define X86_FEATURE_TME (16*32+13) /* Intel Total Memory Encryption */
|
||||
#define X86_FEATURE_AVX512_VPOPCNTDQ (16*32+14) /* POPCNT for vectors of DW/QW */
|
||||
#define X86_FEATURE_LA57 (16*32+16) /* 5-level page tables */
|
||||
#define X86_FEATURE_RDPID (16*32+22) /* RDPID instruction */
|
||||
@ -326,6 +327,7 @@
|
||||
/* Intel-defined CPU features, CPUID level 0x00000007:0 (EDX), word 18 */
|
||||
#define X86_FEATURE_AVX512_4VNNIW (18*32+ 2) /* AVX-512 Neural Network Instructions */
|
||||
#define X86_FEATURE_AVX512_4FMAPS (18*32+ 3) /* AVX-512 Multiply Accumulation Single precision */
|
||||
#define X86_FEATURE_PCONFIG (18*32+18) /* Intel PCONFIG */
|
||||
#define X86_FEATURE_SPEC_CTRL (18*32+26) /* "" Speculation Control (IBRS + IBPB) */
|
||||
#define X86_FEATURE_INTEL_STIBP (18*32+27) /* "" Single Thread Indirect Branch Predictors */
|
||||
#define X86_FEATURE_ARCH_CAPABILITIES (18*32+29) /* IA32_ARCH_CAPABILITIES MSR (Intel) */
|
||||
|
@ -183,7 +183,10 @@
|
||||
* otherwise we'll run out of registers. We don't care about CET
|
||||
* here, anyway.
|
||||
*/
|
||||
# define CALL_NOSPEC ALTERNATIVE("call *%[thunk_target]\n", \
|
||||
# define CALL_NOSPEC \
|
||||
ALTERNATIVE( \
|
||||
ANNOTATE_RETPOLINE_SAFE \
|
||||
"call *%[thunk_target]\n", \
|
||||
" jmp 904f;\n" \
|
||||
" .align 16\n" \
|
||||
"901: call 903f;\n" \
|
||||
|
@ -105,7 +105,7 @@ static void probe_xeon_phi_r3mwait(struct cpuinfo_x86 *c)
|
||||
/*
|
||||
* Early microcode releases for the Spectre v2 mitigation were broken.
|
||||
* Information taken from;
|
||||
* - https://newsroom.intel.com/wp-content/uploads/sites/11/2018/01/microcode-update-guidance.pdf
|
||||
* - https://newsroom.intel.com/wp-content/uploads/sites/11/2018/03/microcode-update-guidance.pdf
|
||||
* - https://kb.vmware.com/s/article/52345
|
||||
* - Microcode revisions observed in the wild
|
||||
* - Release note from 20180108 microcode release
|
||||
@ -123,7 +123,6 @@ static const struct sku_microcode spectre_bad_microcodes[] = {
|
||||
{ INTEL_FAM6_KABYLAKE_MOBILE, 0x09, 0x80 },
|
||||
{ INTEL_FAM6_SKYLAKE_X, 0x03, 0x0100013e },
|
||||
{ INTEL_FAM6_SKYLAKE_X, 0x04, 0x0200003c },
|
||||
{ INTEL_FAM6_SKYLAKE_DESKTOP, 0x03, 0xc2 },
|
||||
{ INTEL_FAM6_BROADWELL_CORE, 0x04, 0x28 },
|
||||
{ INTEL_FAM6_BROADWELL_GT3E, 0x01, 0x1b },
|
||||
{ INTEL_FAM6_BROADWELL_XEON_D, 0x02, 0x14 },
|
||||
|
@ -542,6 +542,7 @@ int arch_kexec_apply_relocations_add(const Elf64_Ehdr *ehdr,
|
||||
goto overflow;
|
||||
break;
|
||||
case R_X86_64_PC32:
|
||||
case R_X86_64_PLT32:
|
||||
value -= (u64)address;
|
||||
*(u32 *)location = value;
|
||||
break;
|
||||
|
@ -191,6 +191,7 @@ int apply_relocate_add(Elf64_Shdr *sechdrs,
|
||||
goto overflow;
|
||||
break;
|
||||
case R_X86_64_PC32:
|
||||
case R_X86_64_PLT32:
|
||||
if (*(u32 *)loc != 0)
|
||||
goto invalid_relocation;
|
||||
val -= (u64)loc;
|
||||
|
@ -727,7 +727,8 @@ void handle_vm86_fault(struct kernel_vm86_regs *regs, long error_code)
|
||||
return;
|
||||
|
||||
check_vip:
|
||||
if (VEFLAGS & X86_EFLAGS_VIP) {
|
||||
if ((VEFLAGS & (X86_EFLAGS_VIP | X86_EFLAGS_VIF)) ==
|
||||
(X86_EFLAGS_VIP | X86_EFLAGS_VIF)) {
|
||||
save_v86_state(regs, VM86_STI);
|
||||
return;
|
||||
}
|
||||
|
@ -2758,8 +2758,10 @@ static int set_spte(struct kvm_vcpu *vcpu, u64 *sptep,
|
||||
else
|
||||
pte_access &= ~ACC_WRITE_MASK;
|
||||
|
||||
if (!kvm_is_mmio_pfn(pfn))
|
||||
spte |= shadow_me_mask;
|
||||
|
||||
spte |= (u64)pfn << PAGE_SHIFT;
|
||||
spte |= shadow_me_mask;
|
||||
|
||||
if (pte_access & ACC_WRITE_MASK) {
|
||||
|
||||
|
@ -330,7 +330,7 @@ static noinline int vmalloc_fault(unsigned long address)
|
||||
if (!pmd_k)
|
||||
return -1;
|
||||
|
||||
if (pmd_huge(*pmd_k))
|
||||
if (pmd_large(*pmd_k))
|
||||
return 0;
|
||||
|
||||
pte_k = pte_offset_kernel(pmd_k, address);
|
||||
@ -479,7 +479,7 @@ static noinline int vmalloc_fault(unsigned long address)
|
||||
if (pud_none(*pud) || pud_pfn(*pud) != pud_pfn(*pud_ref))
|
||||
BUG();
|
||||
|
||||
if (pud_huge(*pud))
|
||||
if (pud_large(*pud))
|
||||
return 0;
|
||||
|
||||
pmd = pmd_offset(pud, address);
|
||||
@ -490,7 +490,7 @@ static noinline int vmalloc_fault(unsigned long address)
|
||||
if (pmd_none(*pmd) || pmd_pfn(*pmd) != pmd_pfn(*pmd_ref))
|
||||
BUG();
|
||||
|
||||
if (pmd_huge(*pmd))
|
||||
if (pmd_large(*pmd))
|
||||
return 0;
|
||||
|
||||
pte_ref = pte_offset_kernel(pmd_ref, address);
|
||||
|
@ -770,9 +770,12 @@ static int do_reloc64(struct section *sec, Elf_Rel *rel, ElfW(Sym) *sym,
|
||||
break;
|
||||
|
||||
case R_X86_64_PC32:
|
||||
case R_X86_64_PLT32:
|
||||
/*
|
||||
* PC relative relocations don't need to be adjusted unless
|
||||
* referencing a percpu symbol.
|
||||
*
|
||||
* NB: R_X86_64_PLT32 can be treated as R_X86_64_PC32.
|
||||
*/
|
||||
if (is_percpu_sym(sym, symname))
|
||||
add_reloc(&relocs32neg, offset);
|
||||
|
@ -964,7 +964,7 @@ int ecc_gen_privkey(unsigned int curve_id, unsigned int ndigits, u64 *privkey)
|
||||
* DRBG with a security strength of 256.
|
||||
*/
|
||||
if (crypto_get_default_rng())
|
||||
err = -EFAULT;
|
||||
return -EFAULT;
|
||||
|
||||
err = crypto_rng_get_bytes(crypto_default_rng, (u8 *)priv, nbytes);
|
||||
crypto_put_default_rng();
|
||||
|
@ -249,6 +249,7 @@ config DMA_SHARED_BUFFER
|
||||
bool
|
||||
default n
|
||||
select ANON_INODES
|
||||
select IRQ_WORK
|
||||
help
|
||||
This option enables the framework for buffer-sharing between
|
||||
multiple drivers. A buffer is associated with a file using driver
|
||||
|
@ -872,6 +872,8 @@ void intel_gtt_insert_sg_entries(struct sg_table *st,
|
||||
}
|
||||
}
|
||||
wmb();
|
||||
if (intel_private.driver->chipset_flush)
|
||||
intel_private.driver->chipset_flush();
|
||||
}
|
||||
EXPORT_SYMBOL(intel_gtt_insert_sg_entries);
|
||||
|
||||
|
@ -1139,7 +1139,7 @@ static MESON_GATE(gxbb_pl301, HHI_GCLK_MPEG0, 6);
|
||||
static MESON_GATE(gxbb_periphs, HHI_GCLK_MPEG0, 7);
|
||||
static MESON_GATE(gxbb_spicc, HHI_GCLK_MPEG0, 8);
|
||||
static MESON_GATE(gxbb_i2c, HHI_GCLK_MPEG0, 9);
|
||||
static MESON_GATE(gxbb_sar_adc, HHI_GCLK_MPEG0, 10);
|
||||
static MESON_GATE(gxbb_sana, HHI_GCLK_MPEG0, 10);
|
||||
static MESON_GATE(gxbb_smart_card, HHI_GCLK_MPEG0, 11);
|
||||
static MESON_GATE(gxbb_rng0, HHI_GCLK_MPEG0, 12);
|
||||
static MESON_GATE(gxbb_uart0, HHI_GCLK_MPEG0, 13);
|
||||
@ -1190,7 +1190,7 @@ static MESON_GATE(gxbb_usb0_ddr_bridge, HHI_GCLK_MPEG2, 9);
|
||||
static MESON_GATE(gxbb_mmc_pclk, HHI_GCLK_MPEG2, 11);
|
||||
static MESON_GATE(gxbb_dvin, HHI_GCLK_MPEG2, 12);
|
||||
static MESON_GATE(gxbb_uart2, HHI_GCLK_MPEG2, 15);
|
||||
static MESON_GATE(gxbb_sana, HHI_GCLK_MPEG2, 22);
|
||||
static MESON_GATE(gxbb_sar_adc, HHI_GCLK_MPEG2, 22);
|
||||
static MESON_GATE(gxbb_vpu_intr, HHI_GCLK_MPEG2, 25);
|
||||
static MESON_GATE(gxbb_sec_ahb_ahb3_bridge, HHI_GCLK_MPEG2, 26);
|
||||
static MESON_GATE(gxbb_clk81_a53, HHI_GCLK_MPEG2, 29);
|
||||
|
@ -1438,6 +1438,7 @@ static const struct freq_tbl ftbl_codec_clk[] = {
|
||||
|
||||
static struct clk_rcg2 codec_digcodec_clk_src = {
|
||||
.cmd_rcgr = 0x1c09c,
|
||||
.mnd_width = 8,
|
||||
.hid_width = 5,
|
||||
.parent_map = gcc_xo_gpll1_emclk_sleep_map,
|
||||
.freq_tbl = ftbl_codec_clk,
|
||||
|
@ -633,6 +633,8 @@ static int cpufreq_parse_governor(char *str_governor, unsigned int *policy,
|
||||
*governor = t;
|
||||
err = 0;
|
||||
}
|
||||
if (t && !try_module_get(t->owner))
|
||||
t = NULL;
|
||||
|
||||
mutex_unlock(&cpufreq_governor_mutex);
|
||||
}
|
||||
@ -764,6 +766,10 @@ static ssize_t store_scaling_governor(struct cpufreq_policy *policy,
|
||||
return -EINVAL;
|
||||
|
||||
ret = cpufreq_set_policy(policy, &new_policy);
|
||||
|
||||
if (new_policy.governor)
|
||||
module_put(new_policy.governor->owner);
|
||||
|
||||
return ret ? ret : count;
|
||||
}
|
||||
|
||||
|
@ -668,7 +668,7 @@ static struct aead_edesc *aead_edesc_alloc(struct aead_request *req,
|
||||
qm_sg_ents = 1 + !!ivsize + mapped_src_nents +
|
||||
(mapped_dst_nents > 1 ? mapped_dst_nents : 0);
|
||||
if (unlikely(qm_sg_ents > CAAM_QI_MAX_AEAD_SG)) {
|
||||
dev_err(qidev, "Insufficient S/G entries: %d > %lu\n",
|
||||
dev_err(qidev, "Insufficient S/G entries: %d > %zu\n",
|
||||
qm_sg_ents, CAAM_QI_MAX_AEAD_SG);
|
||||
caam_unmap(qidev, req->src, req->dst, src_nents, dst_nents,
|
||||
iv_dma, ivsize, op_type, 0, 0);
|
||||
@ -905,7 +905,7 @@ static struct ablkcipher_edesc *ablkcipher_edesc_alloc(struct ablkcipher_request
|
||||
|
||||
qm_sg_ents += mapped_dst_nents > 1 ? mapped_dst_nents : 0;
|
||||
if (unlikely(qm_sg_ents > CAAM_QI_MAX_ABLKCIPHER_SG)) {
|
||||
dev_err(qidev, "Insufficient S/G entries: %d > %lu\n",
|
||||
dev_err(qidev, "Insufficient S/G entries: %d > %zu\n",
|
||||
qm_sg_ents, CAAM_QI_MAX_ABLKCIPHER_SG);
|
||||
caam_unmap(qidev, req->src, req->dst, src_nents, dst_nents,
|
||||
iv_dma, ivsize, op_type, 0, 0);
|
||||
@ -1058,7 +1058,7 @@ static struct ablkcipher_edesc *ablkcipher_giv_edesc_alloc(
|
||||
}
|
||||
|
||||
if (unlikely(qm_sg_ents > CAAM_QI_MAX_ABLKCIPHER_SG)) {
|
||||
dev_err(qidev, "Insufficient S/G entries: %d > %lu\n",
|
||||
dev_err(qidev, "Insufficient S/G entries: %d > %zu\n",
|
||||
qm_sg_ents, CAAM_QI_MAX_ABLKCIPHER_SG);
|
||||
caam_unmap(qidev, req->src, req->dst, src_nents, dst_nents,
|
||||
iv_dma, ivsize, GIVENCRYPT, 0, 0);
|
||||
|
@ -459,7 +459,8 @@ int process_request(struct cpt_vf *cptvf, struct cpt_request_info *req)
|
||||
info->completion_addr = kzalloc(sizeof(union cpt_res_s), GFP_KERNEL);
|
||||
if (unlikely(!info->completion_addr)) {
|
||||
dev_err(&pdev->dev, "Unable to allocate memory for completion_addr\n");
|
||||
return -ENOMEM;
|
||||
ret = -ENOMEM;
|
||||
goto request_cleanup;
|
||||
}
|
||||
|
||||
result = (union cpt_res_s *)info->completion_addr;
|
||||
|
@ -31,6 +31,14 @@ static const char *dma_fence_array_get_timeline_name(struct dma_fence *fence)
|
||||
return "unbound";
|
||||
}
|
||||
|
||||
static void irq_dma_fence_array_work(struct irq_work *wrk)
|
||||
{
|
||||
struct dma_fence_array *array = container_of(wrk, typeof(*array), work);
|
||||
|
||||
dma_fence_signal(&array->base);
|
||||
dma_fence_put(&array->base);
|
||||
}
|
||||
|
||||
static void dma_fence_array_cb_func(struct dma_fence *f,
|
||||
struct dma_fence_cb *cb)
|
||||
{
|
||||
@ -39,8 +47,9 @@ static void dma_fence_array_cb_func(struct dma_fence *f,
|
||||
struct dma_fence_array *array = array_cb->array;
|
||||
|
||||
if (atomic_dec_and_test(&array->num_pending))
|
||||
dma_fence_signal(&array->base);
|
||||
dma_fence_put(&array->base);
|
||||
irq_work_queue(&array->work);
|
||||
else
|
||||
dma_fence_put(&array->base);
|
||||
}
|
||||
|
||||
static bool dma_fence_array_enable_signaling(struct dma_fence *fence)
|
||||
@ -136,6 +145,7 @@ struct dma_fence_array *dma_fence_array_create(int num_fences,
|
||||
spin_lock_init(&array->lock);
|
||||
dma_fence_init(&array->base, &dma_fence_array_ops, &array->lock,
|
||||
context, seqno);
|
||||
init_irq_work(&array->work, irq_dma_fence_array_work);
|
||||
|
||||
array->num_fences = num_fences;
|
||||
atomic_set(&array->num_pending, signal_on_any ? 1 : num_fences);
|
||||
|
@ -393,6 +393,8 @@ static int hidma_ll_reset(struct hidma_lldev *lldev)
|
||||
*/
|
||||
static void hidma_ll_int_handler_internal(struct hidma_lldev *lldev, int cause)
|
||||
{
|
||||
unsigned long irqflags;
|
||||
|
||||
if (cause & HIDMA_ERR_INT_MASK) {
|
||||
dev_err(lldev->dev, "error 0x%x, disabling...\n",
|
||||
cause);
|
||||
@ -410,6 +412,10 @@ static void hidma_ll_int_handler_internal(struct hidma_lldev *lldev, int cause)
|
||||
return;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&lldev->lock, irqflags);
|
||||
writel_relaxed(cause, lldev->evca + HIDMA_EVCA_IRQ_CLR_REG);
|
||||
spin_unlock_irqrestore(&lldev->lock, irqflags);
|
||||
|
||||
/*
|
||||
* Fine tuned for this HW...
|
||||
*
|
||||
@ -421,9 +427,6 @@ static void hidma_ll_int_handler_internal(struct hidma_lldev *lldev, int cause)
|
||||
* Try to consume as many EVREs as possible.
|
||||
*/
|
||||
hidma_handle_tre_completion(lldev);
|
||||
|
||||
/* We consumed TREs or there are pending TREs or EVREs. */
|
||||
writel_relaxed(cause, lldev->evca + HIDMA_EVCA_IRQ_CLR_REG);
|
||||
}
|
||||
|
||||
irqreturn_t hidma_ll_inthandler(int chirq, void *arg)
|
||||
|
@ -265,6 +265,9 @@ uint32_t get_max_engine_clock_in_mhz(struct kgd_dev *kgd)
|
||||
{
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)kgd;
|
||||
|
||||
/* The sclk is in quantas of 10kHz */
|
||||
return adev->pm.dpm.dyn_state.max_clock_voltage_on_ac.sclk / 100;
|
||||
/* the sclk is in quantas of 10kHz */
|
||||
if (amdgpu_sriov_vf(adev))
|
||||
return adev->clock.default_sclk / 100;
|
||||
|
||||
return amdgpu_dpm_get_sclk(adev, false) / 100;
|
||||
}
|
||||
|
@ -69,25 +69,18 @@ void amdgpu_connector_hotplug(struct drm_connector *connector)
|
||||
/* don't do anything if sink is not display port, i.e.,
|
||||
* passive dp->(dvi|hdmi) adaptor
|
||||
*/
|
||||
if (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) {
|
||||
int saved_dpms = connector->dpms;
|
||||
/* Only turn off the display if it's physically disconnected */
|
||||
if (!amdgpu_display_hpd_sense(adev, amdgpu_connector->hpd.hpd)) {
|
||||
drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF);
|
||||
} else if (amdgpu_atombios_dp_needs_link_train(amdgpu_connector)) {
|
||||
/* Don't try to start link training before we
|
||||
* have the dpcd */
|
||||
if (amdgpu_atombios_dp_get_dpcd(amdgpu_connector))
|
||||
return;
|
||||
if (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT &&
|
||||
amdgpu_display_hpd_sense(adev, amdgpu_connector->hpd.hpd) &&
|
||||
amdgpu_atombios_dp_needs_link_train(amdgpu_connector)) {
|
||||
/* Don't start link training before we have the DPCD */
|
||||
if (amdgpu_atombios_dp_get_dpcd(amdgpu_connector))
|
||||
return;
|
||||
|
||||
/* set it to OFF so that drm_helper_connector_dpms()
|
||||
* won't return immediately since the current state
|
||||
* is ON at this point.
|
||||
*/
|
||||
connector->dpms = DRM_MODE_DPMS_OFF;
|
||||
drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON);
|
||||
}
|
||||
connector->dpms = saved_dpms;
|
||||
/* Turn the connector off and back on immediately, which
|
||||
* will trigger link training
|
||||
*/
|
||||
drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF);
|
||||
drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -36,8 +36,6 @@ void amdgpu_gem_object_free(struct drm_gem_object *gobj)
|
||||
struct amdgpu_bo *robj = gem_to_amdgpu_bo(gobj);
|
||||
|
||||
if (robj) {
|
||||
if (robj->gem_base.import_attach)
|
||||
drm_prime_gem_destroy(&robj->gem_base, robj->tbo.sg);
|
||||
amdgpu_mn_unregister(robj);
|
||||
amdgpu_bo_unref(&robj);
|
||||
}
|
||||
|
@ -46,6 +46,8 @@ static void amdgpu_ttm_bo_destroy(struct ttm_buffer_object *tbo)
|
||||
|
||||
amdgpu_bo_kunmap(bo);
|
||||
|
||||
if (bo->gem_base.import_attach)
|
||||
drm_prime_gem_destroy(&bo->gem_base, bo->tbo.sg);
|
||||
drm_gem_object_release(&bo->gem_base);
|
||||
amdgpu_bo_unref(&bo->parent);
|
||||
if (!list_empty(&bo->shadow_list)) {
|
||||
|
@ -437,6 +437,8 @@ static int dce_virtual_sw_fini(void *handle)
|
||||
drm_kms_helper_poll_fini(adev->ddev);
|
||||
|
||||
drm_mode_config_cleanup(adev->ddev);
|
||||
/* clear crtcs pointer to avoid dce irq finish routine access freed data */
|
||||
memset(adev->mode_info.crtcs, 0, sizeof(adev->mode_info.crtcs[0]) * AMDGPU_MAX_CRTCS);
|
||||
adev->mode_info.mode_config_initialized = false;
|
||||
return 0;
|
||||
}
|
||||
@ -723,7 +725,7 @@ static void dce_virtual_set_crtc_vblank_interrupt_state(struct amdgpu_device *ad
|
||||
int crtc,
|
||||
enum amdgpu_interrupt_state state)
|
||||
{
|
||||
if (crtc >= adev->mode_info.num_crtc) {
|
||||
if (crtc >= adev->mode_info.num_crtc || !adev->mode_info.crtcs[crtc]) {
|
||||
DRM_DEBUG("invalid crtc %d\n", crtc);
|
||||
return;
|
||||
}
|
||||
|
@ -276,9 +276,17 @@ static int xgpu_ai_mailbox_rcv_irq(struct amdgpu_device *adev,
|
||||
/* see what event we get */
|
||||
r = xgpu_ai_mailbox_rcv_msg(adev, IDH_FLR_NOTIFICATION);
|
||||
|
||||
/* only handle FLR_NOTIFY now */
|
||||
if (!r)
|
||||
schedule_work(&adev->virt.flr_work);
|
||||
/* sometimes the interrupt is delayed to inject to VM, so under such case
|
||||
* the IDH_FLR_NOTIFICATION is overwritten by VF FLR from GIM side, thus
|
||||
* above recieve message could be failed, we should schedule the flr_work
|
||||
* anyway
|
||||
*/
|
||||
if (r) {
|
||||
DRM_ERROR("FLR_NOTIFICATION is missed\n");
|
||||
xgpu_ai_mailbox_send_ack(adev);
|
||||
}
|
||||
|
||||
schedule_work(&adev->virt.flr_work);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -501,11 +501,17 @@ static ssize_t sysprops_show(struct kobject *kobj, struct attribute *attr,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void kfd_topology_kobj_release(struct kobject *kobj)
|
||||
{
|
||||
kfree(kobj);
|
||||
}
|
||||
|
||||
static const struct sysfs_ops sysprops_ops = {
|
||||
.show = sysprops_show,
|
||||
};
|
||||
|
||||
static struct kobj_type sysprops_type = {
|
||||
.release = kfd_topology_kobj_release,
|
||||
.sysfs_ops = &sysprops_ops,
|
||||
};
|
||||
|
||||
@ -541,6 +547,7 @@ static const struct sysfs_ops iolink_ops = {
|
||||
};
|
||||
|
||||
static struct kobj_type iolink_type = {
|
||||
.release = kfd_topology_kobj_release,
|
||||
.sysfs_ops = &iolink_ops,
|
||||
};
|
||||
|
||||
@ -568,6 +575,7 @@ static const struct sysfs_ops mem_ops = {
|
||||
};
|
||||
|
||||
static struct kobj_type mem_type = {
|
||||
.release = kfd_topology_kobj_release,
|
||||
.sysfs_ops = &mem_ops,
|
||||
};
|
||||
|
||||
@ -607,6 +615,7 @@ static const struct sysfs_ops cache_ops = {
|
||||
};
|
||||
|
||||
static struct kobj_type cache_type = {
|
||||
.release = kfd_topology_kobj_release,
|
||||
.sysfs_ops = &cache_ops,
|
||||
};
|
||||
|
||||
@ -729,6 +738,7 @@ static const struct sysfs_ops node_ops = {
|
||||
};
|
||||
|
||||
static struct kobj_type node_type = {
|
||||
.release = kfd_topology_kobj_release,
|
||||
.sysfs_ops = &node_ops,
|
||||
};
|
||||
|
||||
|
@ -3899,8 +3899,7 @@ EXPORT_SYMBOL(drm_edid_get_monitor_name);
|
||||
* @edid: EDID to parse
|
||||
*
|
||||
* Fill the ELD (EDID-Like Data) buffer for passing to the audio driver. The
|
||||
* Conn_Type, HDCP and Port_ID ELD fields are left for the graphics driver to
|
||||
* fill in.
|
||||
* HDCP and Port_ID ELD fields are left for the graphics driver to fill in.
|
||||
*/
|
||||
void drm_edid_to_eld(struct drm_connector *connector, struct edid *edid)
|
||||
{
|
||||
@ -3981,6 +3980,12 @@ void drm_edid_to_eld(struct drm_connector *connector, struct edid *edid)
|
||||
}
|
||||
eld[5] |= total_sad_count << 4;
|
||||
|
||||
if (connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort ||
|
||||
connector->connector_type == DRM_MODE_CONNECTOR_eDP)
|
||||
eld[DRM_ELD_SAD_COUNT_CONN_TYPE] |= DRM_ELD_CONN_TYPE_DP;
|
||||
else
|
||||
eld[DRM_ELD_SAD_COUNT_CONN_TYPE] |= DRM_ELD_CONN_TYPE_HDMI;
|
||||
|
||||
eld[DRM_ELD_BASELINE_ELD_LEN] =
|
||||
DIV_ROUND_UP(drm_eld_calc_baseline_block_size(eld), 4);
|
||||
|
||||
|
@ -6,6 +6,7 @@ config DRM_ETNAVIV
|
||||
depends on MMU
|
||||
select SHMEM
|
||||
select SYNC_FILE
|
||||
select THERMAL if DRM_ETNAVIV_THERMAL
|
||||
select TMPFS
|
||||
select IOMMU_API
|
||||
select IOMMU_SUPPORT
|
||||
@ -15,6 +16,14 @@ config DRM_ETNAVIV
|
||||
help
|
||||
DRM driver for Vivante GPUs.
|
||||
|
||||
config DRM_ETNAVIV_THERMAL
|
||||
bool "enable ETNAVIV thermal throttling"
|
||||
depends on DRM_ETNAVIV
|
||||
default y
|
||||
help
|
||||
Compile in support for thermal throttling.
|
||||
Say Y unless you want to risk burning your SoC.
|
||||
|
||||
config DRM_ETNAVIV_REGISTER_LOGGING
|
||||
bool "enable ETNAVIV register logging"
|
||||
depends on DRM_ETNAVIV
|
||||
|
@ -1622,7 +1622,7 @@ static int etnaviv_gpu_bind(struct device *dev, struct device *master,
|
||||
struct etnaviv_gpu *gpu = dev_get_drvdata(dev);
|
||||
int ret;
|
||||
|
||||
if (IS_ENABLED(CONFIG_THERMAL)) {
|
||||
if (IS_ENABLED(CONFIG_DRM_ETNAVIV_THERMAL)) {
|
||||
gpu->cooling = thermal_of_cooling_device_register(dev->of_node,
|
||||
(char *)dev_name(dev), gpu, &cooling_ops);
|
||||
if (IS_ERR(gpu->cooling))
|
||||
@ -1635,7 +1635,8 @@ static int etnaviv_gpu_bind(struct device *dev, struct device *master,
|
||||
ret = etnaviv_gpu_clk_enable(gpu);
|
||||
#endif
|
||||
if (ret < 0) {
|
||||
thermal_cooling_device_unregister(gpu->cooling);
|
||||
if (IS_ENABLED(CONFIG_DRM_ETNAVIV_THERMAL))
|
||||
thermal_cooling_device_unregister(gpu->cooling);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -1692,7 +1693,8 @@ static void etnaviv_gpu_unbind(struct device *dev, struct device *master,
|
||||
|
||||
gpu->drm = NULL;
|
||||
|
||||
thermal_cooling_device_unregister(gpu->cooling);
|
||||
if (IS_ENABLED(CONFIG_DRM_ETNAVIV_THERMAL))
|
||||
thermal_cooling_device_unregister(gpu->cooling);
|
||||
gpu->cooling = NULL;
|
||||
}
|
||||
|
||||
|
@ -61,9 +61,6 @@
|
||||
#define KBL_FW_MAJOR 9
|
||||
#define KBL_FW_MINOR 14
|
||||
|
||||
#define GLK_FW_MAJOR 10
|
||||
#define GLK_FW_MINOR 56
|
||||
|
||||
#define GUC_FW_PATH(platform, major, minor) \
|
||||
"i915/" __stringify(platform) "_guc_ver" __stringify(major) "_" __stringify(minor) ".bin"
|
||||
|
||||
@ -76,8 +73,6 @@ MODULE_FIRMWARE(I915_BXT_GUC_UCODE);
|
||||
#define I915_KBL_GUC_UCODE GUC_FW_PATH(kbl, KBL_FW_MAJOR, KBL_FW_MINOR)
|
||||
MODULE_FIRMWARE(I915_KBL_GUC_UCODE);
|
||||
|
||||
#define I915_GLK_GUC_UCODE GUC_FW_PATH(glk, GLK_FW_MAJOR, GLK_FW_MINOR)
|
||||
|
||||
|
||||
static u32 get_gttype(struct drm_i915_private *dev_priv)
|
||||
{
|
||||
@ -406,10 +401,6 @@ int intel_guc_select_fw(struct intel_guc *guc)
|
||||
guc->fw.path = I915_KBL_GUC_UCODE;
|
||||
guc->fw.major_ver_wanted = KBL_FW_MAJOR;
|
||||
guc->fw.minor_ver_wanted = KBL_FW_MINOR;
|
||||
} else if (IS_GEMINILAKE(dev_priv)) {
|
||||
guc->fw.path = I915_GLK_GUC_UCODE;
|
||||
guc->fw.major_ver_wanted = GLK_FW_MAJOR;
|
||||
guc->fw.minor_ver_wanted = GLK_FW_MINOR;
|
||||
} else {
|
||||
DRM_ERROR("No GuC firmware known for platform with GuC!\n");
|
||||
return -ENOENT;
|
||||
|
@ -52,10 +52,6 @@
|
||||
#define KBL_HUC_FW_MINOR 00
|
||||
#define KBL_BLD_NUM 1810
|
||||
|
||||
#define GLK_HUC_FW_MAJOR 02
|
||||
#define GLK_HUC_FW_MINOR 00
|
||||
#define GLK_BLD_NUM 1748
|
||||
|
||||
#define HUC_FW_PATH(platform, major, minor, bld_num) \
|
||||
"i915/" __stringify(platform) "_huc_ver" __stringify(major) "_" \
|
||||
__stringify(minor) "_" __stringify(bld_num) ".bin"
|
||||
@ -72,9 +68,6 @@ MODULE_FIRMWARE(I915_BXT_HUC_UCODE);
|
||||
KBL_HUC_FW_MINOR, KBL_BLD_NUM)
|
||||
MODULE_FIRMWARE(I915_KBL_HUC_UCODE);
|
||||
|
||||
#define I915_GLK_HUC_UCODE HUC_FW_PATH(glk, GLK_HUC_FW_MAJOR, \
|
||||
GLK_HUC_FW_MINOR, GLK_BLD_NUM)
|
||||
|
||||
/**
|
||||
* huc_ucode_xfer() - DMA's the firmware
|
||||
* @dev_priv: the drm_i915_private device
|
||||
@ -171,10 +164,6 @@ void intel_huc_select_fw(struct intel_huc *huc)
|
||||
huc->fw.path = I915_KBL_HUC_UCODE;
|
||||
huc->fw.major_ver_wanted = KBL_HUC_FW_MAJOR;
|
||||
huc->fw.minor_ver_wanted = KBL_HUC_FW_MINOR;
|
||||
} else if (IS_GEMINILAKE(dev_priv)) {
|
||||
huc->fw.path = I915_GLK_HUC_UCODE;
|
||||
huc->fw.major_ver_wanted = GLK_HUC_FW_MAJOR;
|
||||
huc->fw.minor_ver_wanted = GLK_HUC_FW_MINOR;
|
||||
} else {
|
||||
DRM_ERROR("No HuC firmware known for platform with HuC!\n");
|
||||
return;
|
||||
|
@ -268,13 +268,13 @@ nouveau_backlight_init(struct drm_device *dev)
|
||||
struct nvif_device *device = &drm->client.device;
|
||||
struct drm_connector *connector;
|
||||
|
||||
INIT_LIST_HEAD(&drm->bl_connectors);
|
||||
|
||||
if (apple_gmux_present()) {
|
||||
NV_INFO(drm, "Apple GMUX detected: not registering Nouveau backlight interface\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
INIT_LIST_HEAD(&drm->bl_connectors);
|
||||
|
||||
list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
|
||||
if (connector->connector_type != DRM_MODE_CONNECTOR_LVDS &&
|
||||
connector->connector_type != DRM_MODE_CONNECTOR_eDP)
|
||||
|
@ -34,8 +34,6 @@ void radeon_gem_object_free(struct drm_gem_object *gobj)
|
||||
struct radeon_bo *robj = gem_to_radeon_bo(gobj);
|
||||
|
||||
if (robj) {
|
||||
if (robj->gem_base.import_attach)
|
||||
drm_prime_gem_destroy(&robj->gem_base, robj->tbo.sg);
|
||||
radeon_mn_unregister(robj);
|
||||
radeon_bo_unref(&robj);
|
||||
}
|
||||
|
@ -82,6 +82,8 @@ static void radeon_ttm_bo_destroy(struct ttm_buffer_object *tbo)
|
||||
mutex_unlock(&bo->rdev->gem.mutex);
|
||||
radeon_bo_clear_surface_reg(bo);
|
||||
WARN_ON_ONCE(!list_empty(&bo->va));
|
||||
if (bo->gem_base.import_attach)
|
||||
drm_prime_gem_destroy(&bo->gem_base, bo->tbo.sg);
|
||||
drm_gem_object_release(&bo->gem_base);
|
||||
kfree(bo);
|
||||
}
|
||||
|
@ -80,7 +80,7 @@
|
||||
|
||||
#define SUN8I_MIXER_CHAN_UI_LAYER_ATTR_EN BIT(0)
|
||||
#define SUN8I_MIXER_CHAN_UI_LAYER_ATTR_ALPHA_MODE_MASK GENMASK(2, 1)
|
||||
#define SUN8I_MIXER_CHAN_UI_LAYER_ATTR_FBFMT_MASK GENMASK(11, 8)
|
||||
#define SUN8I_MIXER_CHAN_UI_LAYER_ATTR_FBFMT_MASK GENMASK(12, 8)
|
||||
#define SUN8I_MIXER_CHAN_UI_LAYER_ATTR_ALPHA_MASK GENMASK(31, 24)
|
||||
#define SUN8I_MIXER_CHAN_UI_LAYER_ATTR_ALPHA_MODE_DEF (1 << 1)
|
||||
#define SUN8I_MIXER_CHAN_UI_LAYER_ATTR_FBFMT_ARGB8888 (0 << 8)
|
||||
|
@ -42,6 +42,12 @@ static int elo_input_configured(struct hid_device *hdev,
|
||||
{
|
||||
struct input_dev *input = hidinput->input;
|
||||
|
||||
/*
|
||||
* ELO devices have one Button usage in GenDesk field, which makes
|
||||
* hid-input map it to BTN_LEFT; that confuses userspace, which then
|
||||
* considers the device to be a mouse/touchpad instead of touchscreen.
|
||||
*/
|
||||
clear_bit(BTN_LEFT, input->keybit);
|
||||
set_bit(BTN_TOUCH, input->keybit);
|
||||
set_bit(ABS_PRESSURE, input->absbit);
|
||||
input_set_abs_params(input, ABS_PRESSURE, 0, 256, 0, 0);
|
||||
|
@ -738,9 +738,11 @@ static int mt_touch_event(struct hid_device *hid, struct hid_field *field,
|
||||
}
|
||||
|
||||
static void mt_process_mt_event(struct hid_device *hid, struct hid_field *field,
|
||||
struct hid_usage *usage, __s32 value)
|
||||
struct hid_usage *usage, __s32 value,
|
||||
bool first_packet)
|
||||
{
|
||||
struct mt_device *td = hid_get_drvdata(hid);
|
||||
__s32 cls = td->mtclass.name;
|
||||
__s32 quirks = td->mtclass.quirks;
|
||||
struct input_dev *input = field->hidinput->input;
|
||||
|
||||
@ -794,6 +796,15 @@ static void mt_process_mt_event(struct hid_device *hid, struct hid_field *field,
|
||||
break;
|
||||
|
||||
default:
|
||||
/*
|
||||
* For Win8 PTP touchpads we should only look at
|
||||
* non finger/touch events in the first_packet of
|
||||
* a (possible) multi-packet frame.
|
||||
*/
|
||||
if ((cls == MT_CLS_WIN_8 || cls == MT_CLS_WIN_8_DUAL) &&
|
||||
!first_packet)
|
||||
return;
|
||||
|
||||
if (usage->type)
|
||||
input_event(input, usage->type, usage->code,
|
||||
value);
|
||||
@ -813,6 +824,7 @@ static void mt_touch_report(struct hid_device *hid, struct hid_report *report)
|
||||
{
|
||||
struct mt_device *td = hid_get_drvdata(hid);
|
||||
struct hid_field *field;
|
||||
bool first_packet;
|
||||
unsigned count;
|
||||
int r, n;
|
||||
|
||||
@ -831,6 +843,7 @@ static void mt_touch_report(struct hid_device *hid, struct hid_report *report)
|
||||
td->num_expected = value;
|
||||
}
|
||||
|
||||
first_packet = td->num_received == 0;
|
||||
for (r = 0; r < report->maxfield; r++) {
|
||||
field = report->field[r];
|
||||
count = field->report_count;
|
||||
@ -840,7 +853,7 @@ static void mt_touch_report(struct hid_device *hid, struct hid_report *report)
|
||||
|
||||
for (n = 0; n < count; n++)
|
||||
mt_process_mt_event(hid, field, &field->usage[n],
|
||||
field->value[n]);
|
||||
field->value[n], first_packet);
|
||||
}
|
||||
|
||||
if (td->num_received >= td->num_expected)
|
||||
|
@ -44,7 +44,6 @@
|
||||
|
||||
#define INA226_MASK_ENABLE 0x06
|
||||
#define INA226_CVRF BIT(3)
|
||||
#define INA219_CNVR BIT(1)
|
||||
|
||||
#define INA2XX_MAX_REGISTERS 8
|
||||
|
||||
@ -79,6 +78,11 @@
|
||||
#define INA226_ITS_MASK GENMASK(5, 3)
|
||||
#define INA226_SHIFT_ITS(val) ((val) << 3)
|
||||
|
||||
/* INA219 Bus voltage register, low bits are flags */
|
||||
#define INA219_OVF BIT(0)
|
||||
#define INA219_CNVR BIT(1)
|
||||
#define INA219_BUS_VOLTAGE_SHIFT 3
|
||||
|
||||
/* Cosmetic macro giving the sampling period for a full P=UxI cycle */
|
||||
#define SAMPLING_PERIOD(c) ((c->int_time_vbus + c->int_time_vshunt) \
|
||||
* c->avg)
|
||||
@ -112,7 +116,7 @@ struct ina2xx_config {
|
||||
u16 config_default;
|
||||
int calibration_factor;
|
||||
int shunt_div;
|
||||
int bus_voltage_shift;
|
||||
int bus_voltage_shift; /* position of lsb */
|
||||
int bus_voltage_lsb; /* uV */
|
||||
int power_lsb; /* uW */
|
||||
enum ina2xx_ids chip_id;
|
||||
@ -135,7 +139,7 @@ static const struct ina2xx_config ina2xx_config[] = {
|
||||
.config_default = INA219_CONFIG_DEFAULT,
|
||||
.calibration_factor = 40960000,
|
||||
.shunt_div = 100,
|
||||
.bus_voltage_shift = 3,
|
||||
.bus_voltage_shift = INA219_BUS_VOLTAGE_SHIFT,
|
||||
.bus_voltage_lsb = 4000,
|
||||
.power_lsb = 20000,
|
||||
.chip_id = ina219,
|
||||
@ -170,6 +174,9 @@ static int ina2xx_read_raw(struct iio_dev *indio_dev,
|
||||
else
|
||||
*val = regval;
|
||||
|
||||
if (chan->address == INA2XX_BUS_VOLTAGE)
|
||||
*val >>= chip->config->bus_voltage_shift;
|
||||
|
||||
return IIO_VAL_INT;
|
||||
|
||||
case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
|
||||
@ -203,9 +210,9 @@ static int ina2xx_read_raw(struct iio_dev *indio_dev,
|
||||
return IIO_VAL_FRACTIONAL;
|
||||
|
||||
case INA2XX_BUS_VOLTAGE:
|
||||
/* processed (mV) = raw*lsb (uV) / (1000 << shift) */
|
||||
/* processed (mV) = raw * lsb (uV) / 1000 */
|
||||
*val = chip->config->bus_voltage_lsb;
|
||||
*val2 = 1000 << chip->config->bus_voltage_shift;
|
||||
*val2 = 1000;
|
||||
return IIO_VAL_FRACTIONAL;
|
||||
|
||||
case INA2XX_POWER:
|
||||
@ -532,7 +539,7 @@ static ssize_t ina2xx_shunt_resistor_store(struct device *dev,
|
||||
* Sampling Freq is a consequence of the integration times of
|
||||
* the Voltage channels.
|
||||
*/
|
||||
#define INA219_CHAN_VOLTAGE(_index, _address) { \
|
||||
#define INA219_CHAN_VOLTAGE(_index, _address, _shift) { \
|
||||
.type = IIO_VOLTAGE, \
|
||||
.address = (_address), \
|
||||
.indexed = 1, \
|
||||
@ -544,7 +551,8 @@ static ssize_t ina2xx_shunt_resistor_store(struct device *dev,
|
||||
.scan_index = (_index), \
|
||||
.scan_type = { \
|
||||
.sign = 'u', \
|
||||
.realbits = 16, \
|
||||
.shift = _shift, \
|
||||
.realbits = 16 - _shift, \
|
||||
.storagebits = 16, \
|
||||
.endianness = IIO_LE, \
|
||||
} \
|
||||
@ -579,8 +587,8 @@ static const struct iio_chan_spec ina226_channels[] = {
|
||||
};
|
||||
|
||||
static const struct iio_chan_spec ina219_channels[] = {
|
||||
INA219_CHAN_VOLTAGE(0, INA2XX_SHUNT_VOLTAGE),
|
||||
INA219_CHAN_VOLTAGE(1, INA2XX_BUS_VOLTAGE),
|
||||
INA219_CHAN_VOLTAGE(0, INA2XX_SHUNT_VOLTAGE, 0),
|
||||
INA219_CHAN_VOLTAGE(1, INA2XX_BUS_VOLTAGE, INA219_BUS_VOLTAGE_SHIFT),
|
||||
INA219_CHAN(IIO_POWER, 2, INA2XX_POWER),
|
||||
INA219_CHAN(IIO_CURRENT, 3, INA2XX_CURRENT),
|
||||
IIO_CHAN_SOFT_TIMESTAMP(4),
|
||||
|
@ -329,20 +329,31 @@ static int max30102_read_temp(struct max30102_data *data, int *val)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int max30102_get_temp(struct max30102_data *data, int *val)
|
||||
static int max30102_get_temp(struct max30102_data *data, int *val, bool en)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (en) {
|
||||
ret = max30102_set_powermode(data, true);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* start acquisition */
|
||||
ret = regmap_update_bits(data->regmap, MAX30102_REG_TEMP_CONFIG,
|
||||
MAX30102_REG_TEMP_CONFIG_TEMP_EN,
|
||||
MAX30102_REG_TEMP_CONFIG_TEMP_EN);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto out;
|
||||
|
||||
msleep(35);
|
||||
ret = max30102_read_temp(data, val);
|
||||
|
||||
return max30102_read_temp(data, val);
|
||||
out:
|
||||
if (en)
|
||||
max30102_set_powermode(data, false);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int max30102_read_raw(struct iio_dev *indio_dev,
|
||||
@ -355,20 +366,19 @@ static int max30102_read_raw(struct iio_dev *indio_dev,
|
||||
switch (mask) {
|
||||
case IIO_CHAN_INFO_RAW:
|
||||
/*
|
||||
* Temperature reading can only be acquired while engine
|
||||
* is running
|
||||
* Temperature reading can only be acquired when not in
|
||||
* shutdown; leave shutdown briefly when buffer not running
|
||||
*/
|
||||
mutex_lock(&indio_dev->mlock);
|
||||
|
||||
if (!iio_buffer_enabled(indio_dev))
|
||||
ret = -EBUSY;
|
||||
else {
|
||||
ret = max30102_get_temp(data, val);
|
||||
if (!ret)
|
||||
ret = IIO_VAL_INT;
|
||||
}
|
||||
|
||||
ret = max30102_get_temp(data, val, true);
|
||||
else
|
||||
ret = max30102_get_temp(data, val, false);
|
||||
mutex_unlock(&indio_dev->mlock);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = IIO_VAL_INT;
|
||||
break;
|
||||
case IIO_CHAN_INFO_SCALE:
|
||||
*val = 1000; /* 62.5 */
|
||||
|
@ -1206,6 +1206,9 @@ struct ib_mr *mlx5_ib_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
|
||||
int err;
|
||||
bool use_umr = true;
|
||||
|
||||
if (!IS_ENABLED(CONFIG_INFINIBAND_USER_MEM))
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
mlx5_ib_dbg(dev, "start 0x%llx, virt_addr 0x%llx, length 0x%llx, access_flags 0x%x\n",
|
||||
start, virt_addr, length, access_flags);
|
||||
|
||||
|
@ -489,11 +489,13 @@ static int rvt_check_refs(struct rvt_mregion *mr, const char *t)
|
||||
unsigned long timeout;
|
||||
struct rvt_dev_info *rdi = ib_to_rvt(mr->pd->device);
|
||||
|
||||
if (percpu_ref_is_zero(&mr->refcount))
|
||||
return 0;
|
||||
/* avoid dma mr */
|
||||
if (mr->lkey)
|
||||
if (mr->lkey) {
|
||||
/* avoid dma mr */
|
||||
rvt_dereg_clean_qps(mr);
|
||||
/* @mr was indexed on rcu protected @lkey_table */
|
||||
synchronize_rcu();
|
||||
}
|
||||
|
||||
timeout = wait_for_completion_timeout(&mr->comp, 5 * HZ);
|
||||
if (!timeout) {
|
||||
rvt_pr_err(rdi,
|
||||
|
@ -1310,7 +1310,7 @@ static struct irq_chip its_irq_chip = {
|
||||
* This gives us (((1UL << id_bits) - 8192) >> 5) possible allocations.
|
||||
*/
|
||||
#define IRQS_PER_CHUNK_SHIFT 5
|
||||
#define IRQS_PER_CHUNK (1 << IRQS_PER_CHUNK_SHIFT)
|
||||
#define IRQS_PER_CHUNK (1UL << IRQS_PER_CHUNK_SHIFT)
|
||||
#define ITS_MAX_LPI_NRBITS 16 /* 64K LPIs */
|
||||
|
||||
static unsigned long *lpi_bitmap;
|
||||
@ -2026,11 +2026,10 @@ static struct its_device *its_create_device(struct its_node *its, u32 dev_id,
|
||||
|
||||
dev = kzalloc(sizeof(*dev), GFP_KERNEL);
|
||||
/*
|
||||
* At least one bit of EventID is being used, hence a minimum
|
||||
* of two entries. No, the architecture doesn't let you
|
||||
* express an ITT with a single entry.
|
||||
* We allocate at least one chunk worth of LPIs bet device,
|
||||
* and thus that many ITEs. The device may require less though.
|
||||
*/
|
||||
nr_ites = max(2UL, roundup_pow_of_two(nvecs));
|
||||
nr_ites = max(IRQS_PER_CHUNK, roundup_pow_of_two(nvecs));
|
||||
sz = nr_ites * its->ite_size;
|
||||
sz = max(sz, ITS_ITT_ALIGN) + ITS_ITT_ALIGN - 1;
|
||||
itt = kzalloc(sz, GFP_KERNEL);
|
||||
|
@ -106,7 +106,7 @@ static int pm8058_led_probe(struct platform_device *pdev)
|
||||
if (!led)
|
||||
return -ENOMEM;
|
||||
|
||||
led->ledtype = (u32)of_device_get_match_data(&pdev->dev);
|
||||
led->ledtype = (u32)(unsigned long)of_device_get_match_data(&pdev->dev);
|
||||
|
||||
map = dev_get_regmap(pdev->dev.parent, NULL);
|
||||
if (!map) {
|
||||
|
@ -1941,8 +1941,9 @@ static int multipath_busy(struct dm_target *ti)
|
||||
*---------------------------------------------------------------*/
|
||||
static struct target_type multipath_target = {
|
||||
.name = "multipath",
|
||||
.version = {1, 12, 0},
|
||||
.features = DM_TARGET_SINGLETON | DM_TARGET_IMMUTABLE,
|
||||
.version = {1, 13, 0},
|
||||
.features = DM_TARGET_SINGLETON | DM_TARGET_IMMUTABLE |
|
||||
DM_TARGET_PASSES_INTEGRITY,
|
||||
.module = THIS_MODULE,
|
||||
.ctr = multipath_ctr,
|
||||
.dtr = multipath_dtr,
|
||||
|
@ -675,15 +675,11 @@ static struct raid_type *get_raid_type_by_ll(const int level, const int layout)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Conditionally change bdev capacity of @rs
|
||||
* in case of a disk add/remove reshape
|
||||
*/
|
||||
static void rs_set_capacity(struct raid_set *rs)
|
||||
/* Adjust rdev sectors */
|
||||
static void rs_set_rdev_sectors(struct raid_set *rs)
|
||||
{
|
||||
struct mddev *mddev = &rs->md;
|
||||
struct md_rdev *rdev;
|
||||
struct gendisk *gendisk = dm_disk(dm_table_get_md(rs->ti->table));
|
||||
|
||||
/*
|
||||
* raid10 sets rdev->sector to the device size, which
|
||||
@ -692,8 +688,16 @@ static void rs_set_capacity(struct raid_set *rs)
|
||||
rdev_for_each(rdev, mddev)
|
||||
if (!test_bit(Journal, &rdev->flags))
|
||||
rdev->sectors = mddev->dev_sectors;
|
||||
}
|
||||
|
||||
set_capacity(gendisk, mddev->array_sectors);
|
||||
/*
|
||||
* Change bdev capacity of @rs in case of a disk add/remove reshape
|
||||
*/
|
||||
static void rs_set_capacity(struct raid_set *rs)
|
||||
{
|
||||
struct gendisk *gendisk = dm_disk(dm_table_get_md(rs->ti->table));
|
||||
|
||||
set_capacity(gendisk, rs->md.array_sectors);
|
||||
revalidate_disk(gendisk);
|
||||
}
|
||||
|
||||
@ -1674,8 +1678,11 @@ static void do_table_event(struct work_struct *ws)
|
||||
struct raid_set *rs = container_of(ws, struct raid_set, md.event_work);
|
||||
|
||||
smp_rmb(); /* Make sure we access most actual mddev properties */
|
||||
if (!rs_is_reshaping(rs))
|
||||
if (!rs_is_reshaping(rs)) {
|
||||
if (rs_is_raid10(rs))
|
||||
rs_set_rdev_sectors(rs);
|
||||
rs_set_capacity(rs);
|
||||
}
|
||||
dm_table_event(rs->ti->table);
|
||||
}
|
||||
|
||||
@ -3845,11 +3852,10 @@ static int raid_preresume(struct dm_target *ti)
|
||||
mddev->resync_min = mddev->recovery_cp;
|
||||
}
|
||||
|
||||
rs_set_capacity(rs);
|
||||
|
||||
/* Check for any reshape request unless new raid set */
|
||||
if (test_and_clear_bit(RT_FLAG_RESHAPE_RS, &rs->runtime_flags)) {
|
||||
/* Initiate a reshape. */
|
||||
rs_set_rdev_sectors(rs);
|
||||
mddev_lock_nointr(mddev);
|
||||
r = rs_start_reshape(rs);
|
||||
mddev_unlock(mddev);
|
||||
@ -3878,6 +3884,10 @@ static void raid_resume(struct dm_target *ti)
|
||||
mddev->ro = 0;
|
||||
mddev->in_sync = 0;
|
||||
|
||||
/* Only reduce raid set size before running a disk removing reshape. */
|
||||
if (mddev->delta_disks < 0)
|
||||
rs_set_capacity(rs);
|
||||
|
||||
/*
|
||||
* Keep the RAID set frozen if reshape/rebuild flags are set.
|
||||
* The RAID set is unfrozen once the next table load/resume,
|
||||
|
@ -1545,6 +1545,8 @@ vpif_capture_get_pdata(struct platform_device *pdev)
|
||||
sizeof(*chan->inputs) *
|
||||
VPIF_CAPTURE_NUM_CHANNELS,
|
||||
GFP_KERNEL);
|
||||
if (!chan->inputs)
|
||||
return NULL;
|
||||
|
||||
chan->input_count++;
|
||||
chan->inputs[i].input.type = V4L2_INPUT_TYPE_CAMERA;
|
||||
|
@ -571,7 +571,13 @@ static int __maybe_unused vsp1_pm_suspend(struct device *dev)
|
||||
{
|
||||
struct vsp1_device *vsp1 = dev_get_drvdata(dev);
|
||||
|
||||
vsp1_pipelines_suspend(vsp1);
|
||||
/*
|
||||
* When used as part of a display pipeline, the VSP is stopped and
|
||||
* restarted explicitly by the DU.
|
||||
*/
|
||||
if (!vsp1->drm)
|
||||
vsp1_pipelines_suspend(vsp1);
|
||||
|
||||
pm_runtime_force_suspend(vsp1->dev);
|
||||
|
||||
return 0;
|
||||
@ -582,7 +588,13 @@ static int __maybe_unused vsp1_pm_resume(struct device *dev)
|
||||
struct vsp1_device *vsp1 = dev_get_drvdata(dev);
|
||||
|
||||
pm_runtime_force_resume(vsp1->dev);
|
||||
vsp1_pipelines_resume(vsp1);
|
||||
|
||||
/*
|
||||
* When used as part of a display pipeline, the VSP is stopped and
|
||||
* restarted explicitly by the DU.
|
||||
*/
|
||||
if (!vsp1->drm)
|
||||
vsp1_pipelines_resume(vsp1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -808,7 +808,7 @@ static int cpia2_querybuf(struct file *file, void *fh, struct v4l2_buffer *buf)
|
||||
struct camera_data *cam = video_drvdata(file);
|
||||
|
||||
if(buf->type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
|
||||
buf->index > cam->num_frames)
|
||||
buf->index >= cam->num_frames)
|
||||
return -EINVAL;
|
||||
|
||||
buf->m.offset = cam->buffers[buf->index].data - cam->frame_buffer;
|
||||
@ -859,7 +859,7 @@ static int cpia2_qbuf(struct file *file, void *fh, struct v4l2_buffer *buf)
|
||||
|
||||
if(buf->type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
|
||||
buf->memory != V4L2_MEMORY_MMAP ||
|
||||
buf->index > cam->num_frames)
|
||||
buf->index >= cam->num_frames)
|
||||
return -EINVAL;
|
||||
|
||||
DBG("QBUF #%d\n", buf->index);
|
||||
|
@ -2328,10 +2328,17 @@ static int mmc_test_reset(struct mmc_test_card *test)
|
||||
int err;
|
||||
|
||||
err = mmc_hw_reset(host);
|
||||
if (!err)
|
||||
if (!err) {
|
||||
/*
|
||||
* Reset will re-enable the card's command queue, but tests
|
||||
* expect it to be disabled.
|
||||
*/
|
||||
if (card->ext_csd.cmdq_en)
|
||||
mmc_cmdq_disable(card);
|
||||
return RESULT_OK;
|
||||
else if (err == -EOPNOTSUPP)
|
||||
} else if (err == -EOPNOTSUPP) {
|
||||
return RESULT_UNSUP_HOST;
|
||||
}
|
||||
|
||||
return RESULT_FAIL;
|
||||
}
|
||||
|
@ -916,6 +916,13 @@ static int fsl_ifc_chip_init(struct fsl_ifc_mtd *priv)
|
||||
if (ctrl->version >= FSL_IFC_VERSION_1_1_0)
|
||||
fsl_ifc_sram_init(priv);
|
||||
|
||||
/*
|
||||
* As IFC version 2.0.0 has 16KB of internal SRAM as compared to older
|
||||
* versions which had 8KB. Hence bufnum mask needs to be updated.
|
||||
*/
|
||||
if (ctrl->version >= FSL_IFC_VERSION_2_0_0)
|
||||
priv->bufnum_mask = (priv->bufnum_mask * 2) + 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -710,7 +710,8 @@ static void nand_command(struct mtd_info *mtd, unsigned int command,
|
||||
chip->cmd_ctrl(mtd, readcmd, ctrl);
|
||||
ctrl &= ~NAND_CTRL_CHANGE;
|
||||
}
|
||||
chip->cmd_ctrl(mtd, command, ctrl);
|
||||
if (command != NAND_CMD_NONE)
|
||||
chip->cmd_ctrl(mtd, command, ctrl);
|
||||
|
||||
/* Address cycle, when necessary */
|
||||
ctrl = NAND_CTRL_ALE | NAND_CTRL_CHANGE;
|
||||
@ -739,6 +740,7 @@ static void nand_command(struct mtd_info *mtd, unsigned int command,
|
||||
*/
|
||||
switch (command) {
|
||||
|
||||
case NAND_CMD_NONE:
|
||||
case NAND_CMD_PAGEPROG:
|
||||
case NAND_CMD_ERASE1:
|
||||
case NAND_CMD_ERASE2:
|
||||
@ -832,7 +834,9 @@ static void nand_command_lp(struct mtd_info *mtd, unsigned int command,
|
||||
}
|
||||
|
||||
/* Command latch cycle */
|
||||
chip->cmd_ctrl(mtd, command, NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE);
|
||||
if (command != NAND_CMD_NONE)
|
||||
chip->cmd_ctrl(mtd, command,
|
||||
NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE);
|
||||
|
||||
if (column != -1 || page_addr != -1) {
|
||||
int ctrl = NAND_CTRL_CHANGE | NAND_NCE | NAND_ALE;
|
||||
@ -868,6 +872,7 @@ static void nand_command_lp(struct mtd_info *mtd, unsigned int command,
|
||||
*/
|
||||
switch (command) {
|
||||
|
||||
case NAND_CMD_NONE:
|
||||
case NAND_CMD_CACHEDPROG:
|
||||
case NAND_CMD_PAGEPROG:
|
||||
case NAND_CMD_ERASE1:
|
||||
|
@ -1698,12 +1698,16 @@ static int bnxt_async_event_process(struct bnxt *bp,
|
||||
|
||||
if (BNXT_VF(bp))
|
||||
goto async_event_process_exit;
|
||||
if (data1 & 0x20000) {
|
||||
|
||||
/* print unsupported speed warning in forced speed mode only */
|
||||
if (!(link_info->autoneg & BNXT_AUTONEG_SPEED) &&
|
||||
(data1 & 0x20000)) {
|
||||
u16 fw_speed = link_info->force_link_speed;
|
||||
u32 speed = bnxt_fw_to_ethtool_speed(fw_speed);
|
||||
|
||||
netdev_warn(bp->dev, "Link speed %d no longer supported\n",
|
||||
speed);
|
||||
if (speed != SPEED_UNKNOWN)
|
||||
netdev_warn(bp->dev, "Link speed %d no longer supported\n",
|
||||
speed);
|
||||
}
|
||||
set_bit(BNXT_LINK_SPEED_CHNG_SP_EVENT, &bp->sp_event);
|
||||
/* fall thru */
|
||||
|
@ -1832,6 +1832,11 @@ static int nicvf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
nic->pdev = pdev;
|
||||
nic->pnicvf = nic;
|
||||
nic->max_queues = qcount;
|
||||
/* If no of CPUs are too low, there won't be any queues left
|
||||
* for XDP_TX, hence double it.
|
||||
*/
|
||||
if (!nic->t88)
|
||||
nic->max_queues *= 2;
|
||||
|
||||
/* MAP VF's configuration registers */
|
||||
nic->reg_base = pcim_iomap(pdev, PCI_CFG_REG_BAR_NUM, 0);
|
||||
|
@ -888,7 +888,7 @@ static const struct ieee802154_ops adf7242_ops = {
|
||||
.set_cca_ed_level = adf7242_set_cca_ed_level,
|
||||
};
|
||||
|
||||
static void adf7242_debug(u8 irq1)
|
||||
static void adf7242_debug(struct adf7242_local *lp, u8 irq1)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
u8 stat;
|
||||
@ -932,7 +932,7 @@ static irqreturn_t adf7242_isr(int irq, void *data)
|
||||
dev_err(&lp->spi->dev, "%s :ERROR IRQ1 = 0x%X\n",
|
||||
__func__, irq1);
|
||||
|
||||
adf7242_debug(irq1);
|
||||
adf7242_debug(lp, irq1);
|
||||
|
||||
xmit = test_bit(FLAG_XMIT, &lp->flags);
|
||||
|
||||
|
@ -304,6 +304,10 @@ static int ipvlan_rcv_frame(struct ipvl_addr *addr, struct sk_buff **pskb,
|
||||
if (dev_forward_skb(ipvlan->dev, skb) == NET_RX_SUCCESS)
|
||||
success = true;
|
||||
} else {
|
||||
if (!ether_addr_equal_64bits(eth_hdr(skb)->h_dest,
|
||||
ipvlan->phy_dev->dev_addr))
|
||||
skb->pkt_type = PACKET_OTHERHOST;
|
||||
|
||||
ret = RX_HANDLER_ANOTHER;
|
||||
success = true;
|
||||
}
|
||||
|
@ -239,14 +239,10 @@ static int at803x_resume(struct phy_device *phydev)
|
||||
{
|
||||
int value;
|
||||
|
||||
mutex_lock(&phydev->lock);
|
||||
|
||||
value = phy_read(phydev, MII_BMCR);
|
||||
value &= ~(BMCR_PDOWN | BMCR_ISOLATE);
|
||||
phy_write(phydev, MII_BMCR, value);
|
||||
|
||||
mutex_unlock(&phydev->lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -828,7 +828,6 @@ EXPORT_SYMBOL(phy_stop);
|
||||
*/
|
||||
void phy_start(struct phy_device *phydev)
|
||||
{
|
||||
bool do_resume = false;
|
||||
int err = 0;
|
||||
|
||||
mutex_lock(&phydev->lock);
|
||||
@ -841,6 +840,9 @@ void phy_start(struct phy_device *phydev)
|
||||
phydev->state = PHY_UP;
|
||||
break;
|
||||
case PHY_HALTED:
|
||||
/* if phy was suspended, bring the physical link up again */
|
||||
__phy_resume(phydev);
|
||||
|
||||
/* make sure interrupts are re-enabled for the PHY */
|
||||
if (phy_interrupt_is_valid(phydev)) {
|
||||
err = phy_enable_interrupts(phydev);
|
||||
@ -849,17 +851,12 @@ void phy_start(struct phy_device *phydev)
|
||||
}
|
||||
|
||||
phydev->state = PHY_RESUMING;
|
||||
do_resume = true;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
mutex_unlock(&phydev->lock);
|
||||
|
||||
/* if phy was suspended, bring the physical link up again */
|
||||
if (do_resume)
|
||||
phy_resume(phydev);
|
||||
|
||||
phy_trigger_machine(phydev, true);
|
||||
}
|
||||
EXPORT_SYMBOL(phy_start);
|
||||
|
@ -1152,11 +1152,13 @@ int phy_suspend(struct phy_device *phydev)
|
||||
}
|
||||
EXPORT_SYMBOL(phy_suspend);
|
||||
|
||||
int phy_resume(struct phy_device *phydev)
|
||||
int __phy_resume(struct phy_device *phydev)
|
||||
{
|
||||
struct phy_driver *phydrv = to_phy_driver(phydev->mdio.dev.driver);
|
||||
int ret = 0;
|
||||
|
||||
WARN_ON(!mutex_is_locked(&phydev->lock));
|
||||
|
||||
if (phydev->drv && phydrv->resume)
|
||||
ret = phydrv->resume(phydev);
|
||||
|
||||
@ -1167,6 +1169,18 @@ int phy_resume(struct phy_device *phydev)
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(__phy_resume);
|
||||
|
||||
int phy_resume(struct phy_device *phydev)
|
||||
{
|
||||
int ret;
|
||||
|
||||
mutex_lock(&phydev->lock);
|
||||
ret = __phy_resume(phydev);
|
||||
mutex_unlock(&phydev->lock);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(phy_resume);
|
||||
|
||||
int phy_loopback(struct phy_device *phydev, bool enable)
|
||||
@ -1639,13 +1653,9 @@ int genphy_resume(struct phy_device *phydev)
|
||||
{
|
||||
int value;
|
||||
|
||||
mutex_lock(&phydev->lock);
|
||||
|
||||
value = phy_read(phydev, MII_BMCR);
|
||||
phy_write(phydev, MII_BMCR, value & ~BMCR_PDOWN);
|
||||
|
||||
mutex_unlock(&phydev->lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(genphy_resume);
|
||||
|
@ -410,6 +410,9 @@ static int veth_newlink(struct net *src_net, struct net_device *dev,
|
||||
if (ifmp && (dev->ifindex != 0))
|
||||
peer->ifindex = ifmp->ifi_index;
|
||||
|
||||
peer->gso_max_size = dev->gso_max_size;
|
||||
peer->gso_max_segs = dev->gso_max_segs;
|
||||
|
||||
err = register_netdevice(peer);
|
||||
put_net(net);
|
||||
net = NULL;
|
||||
|
@ -260,9 +260,12 @@ static void virtqueue_napi_complete(struct napi_struct *napi,
|
||||
int opaque;
|
||||
|
||||
opaque = virtqueue_enable_cb_prepare(vq);
|
||||
if (napi_complete_done(napi, processed) &&
|
||||
unlikely(virtqueue_poll(vq, opaque)))
|
||||
virtqueue_napi_schedule(napi, vq);
|
||||
if (napi_complete_done(napi, processed)) {
|
||||
if (unlikely(virtqueue_poll(vq, opaque)))
|
||||
virtqueue_napi_schedule(napi, vq);
|
||||
} else {
|
||||
virtqueue_disable_cb(vq);
|
||||
}
|
||||
}
|
||||
|
||||
static void skb_xmit_done(struct virtqueue *vq)
|
||||
|
@ -6183,6 +6183,16 @@ static int ath10k_sta_state(struct ieee80211_hw *hw,
|
||||
"mac vdev %d peer delete %pM sta %pK (sta gone)\n",
|
||||
arvif->vdev_id, sta->addr, sta);
|
||||
|
||||
if (sta->tdls) {
|
||||
ret = ath10k_mac_tdls_peer_update(ar, arvif->vdev_id,
|
||||
sta,
|
||||
WMI_TDLS_PEER_STATE_TEARDOWN);
|
||||
if (ret)
|
||||
ath10k_warn(ar, "failed to update tdls peer state for %pM state %d: %i\n",
|
||||
sta->addr,
|
||||
WMI_TDLS_PEER_STATE_TEARDOWN, ret);
|
||||
}
|
||||
|
||||
ret = ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
|
||||
if (ret)
|
||||
ath10k_warn(ar, "failed to delete peer %pM for vdev %d: %i\n",
|
||||
|
@ -5235,7 +5235,8 @@ enum wmi_10_4_vdev_param {
|
||||
#define WMI_VDEV_PARAM_TXBF_MU_TX_BFER BIT(3)
|
||||
|
||||
#define WMI_TXBF_STS_CAP_OFFSET_LSB 4
|
||||
#define WMI_TXBF_STS_CAP_OFFSET_MASK 0xf0
|
||||
#define WMI_TXBF_STS_CAP_OFFSET_MASK 0x70
|
||||
#define WMI_TXBF_CONF_IMPLICIT_BF BIT(7)
|
||||
#define WMI_BF_SOUND_DIM_OFFSET_LSB 8
|
||||
#define WMI_BF_SOUND_DIM_OFFSET_MASK 0xf00
|
||||
|
||||
|
@ -1881,12 +1881,10 @@ static int rs_switch_to_column(struct iwl_mvm *mvm,
|
||||
struct rs_rate *rate = &search_tbl->rate;
|
||||
const struct rs_tx_column *column = &rs_tx_columns[col_id];
|
||||
const struct rs_tx_column *curr_column = &rs_tx_columns[tbl->column];
|
||||
u32 sz = (sizeof(struct iwl_scale_tbl_info) -
|
||||
(sizeof(struct iwl_rate_scale_data) * IWL_RATE_COUNT));
|
||||
unsigned long rate_mask = 0;
|
||||
u32 rate_idx = 0;
|
||||
|
||||
memcpy(search_tbl, tbl, sz);
|
||||
memcpy(search_tbl, tbl, offsetof(struct iwl_scale_tbl_info, win));
|
||||
|
||||
rate->sgi = column->sgi;
|
||||
rate->ant = column->ant;
|
||||
|
@ -603,6 +603,12 @@ static void iwl_mvm_dump_lmac_error_log(struct iwl_mvm *mvm, u32 base)
|
||||
|
||||
void iwl_mvm_dump_nic_error_log(struct iwl_mvm *mvm)
|
||||
{
|
||||
if (!test_bit(STATUS_DEVICE_ENABLED, &mvm->trans->status)) {
|
||||
IWL_ERR(mvm,
|
||||
"DEVICE_ENABLED bit is not set. Aborting dump.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
iwl_mvm_dump_lmac_error_log(mvm, mvm->error_event_table[0]);
|
||||
|
||||
if (mvm->error_event_table[1])
|
||||
|
@ -727,16 +727,21 @@ static int hwsim_fops_ps_write(void *dat, u64 val)
|
||||
val != PS_MANUAL_POLL)
|
||||
return -EINVAL;
|
||||
|
||||
if (val == PS_MANUAL_POLL) {
|
||||
if (data->ps != PS_ENABLED)
|
||||
return -EINVAL;
|
||||
local_bh_disable();
|
||||
ieee80211_iterate_active_interfaces_atomic(
|
||||
data->hw, IEEE80211_IFACE_ITER_NORMAL,
|
||||
hwsim_send_ps_poll, data);
|
||||
local_bh_enable();
|
||||
return 0;
|
||||
}
|
||||
old_ps = data->ps;
|
||||
data->ps = val;
|
||||
|
||||
local_bh_disable();
|
||||
if (val == PS_MANUAL_POLL) {
|
||||
ieee80211_iterate_active_interfaces_atomic(
|
||||
data->hw, IEEE80211_IFACE_ITER_NORMAL,
|
||||
hwsim_send_ps_poll, data);
|
||||
data->ps_poll_pending = true;
|
||||
} else if (old_ps == PS_DISABLED && val != PS_DISABLED) {
|
||||
if (old_ps == PS_DISABLED && val != PS_DISABLED) {
|
||||
ieee80211_iterate_active_interfaces_atomic(
|
||||
data->hw, IEEE80211_IFACE_ITER_NORMAL,
|
||||
hwsim_send_nullfunc_ps, data);
|
||||
|
@ -1116,6 +1116,12 @@ mwifiex_cfg80211_change_virtual_intf(struct wiphy *wiphy,
|
||||
struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
|
||||
enum nl80211_iftype curr_iftype = dev->ieee80211_ptr->iftype;
|
||||
|
||||
if (priv->scan_request) {
|
||||
mwifiex_dbg(priv->adapter, ERROR,
|
||||
"change virtual interface: scan in process\n");
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
switch (curr_iftype) {
|
||||
case NL80211_IFTYPE_ADHOC:
|
||||
switch (type) {
|
||||
|
@ -4826,6 +4826,10 @@ static const char * const can0_groups[] = {
|
||||
"can0_data_d",
|
||||
"can0_data_e",
|
||||
"can0_data_f",
|
||||
/*
|
||||
* Retained for backwards compatibility, use can_clk_groups in new
|
||||
* designs.
|
||||
*/
|
||||
"can_clk",
|
||||
"can_clk_b",
|
||||
"can_clk_c",
|
||||
@ -4837,6 +4841,21 @@ static const char * const can1_groups[] = {
|
||||
"can1_data_b",
|
||||
"can1_data_c",
|
||||
"can1_data_d",
|
||||
/*
|
||||
* Retained for backwards compatibility, use can_clk_groups in new
|
||||
* designs.
|
||||
*/
|
||||
"can_clk",
|
||||
"can_clk_b",
|
||||
"can_clk_c",
|
||||
"can_clk_d",
|
||||
};
|
||||
|
||||
/*
|
||||
* can_clk_groups allows for independent configuration, use can_clk function
|
||||
* in new designs.
|
||||
*/
|
||||
static const char * const can_clk_groups[] = {
|
||||
"can_clk",
|
||||
"can_clk_b",
|
||||
"can_clk_c",
|
||||
@ -5308,7 +5327,7 @@ static const char * const vin2_groups[] = {
|
||||
};
|
||||
|
||||
static const struct {
|
||||
struct sh_pfc_function common[56];
|
||||
struct sh_pfc_function common[57];
|
||||
struct sh_pfc_function r8a779x[2];
|
||||
} pinmux_functions = {
|
||||
.common = {
|
||||
@ -5316,6 +5335,7 @@ static const struct {
|
||||
SH_PFC_FUNCTION(avb),
|
||||
SH_PFC_FUNCTION(can0),
|
||||
SH_PFC_FUNCTION(can1),
|
||||
SH_PFC_FUNCTION(can_clk),
|
||||
SH_PFC_FUNCTION(du),
|
||||
SH_PFC_FUNCTION(du0),
|
||||
SH_PFC_FUNCTION(du1),
|
||||
|
@ -1397,7 +1397,7 @@ static const u16 pinmux_data[] = {
|
||||
PINMUX_IPSR_MSEL(IP16_27_24, AUDIO_CLKOUT_B, SEL_ADG_1),
|
||||
PINMUX_IPSR_MSEL(IP16_27_24, SSI_SCK2_B, SEL_SSI_1),
|
||||
PINMUX_IPSR_MSEL(IP16_27_24, TS_SDEN1_D, SEL_TSIF1_3),
|
||||
PINMUX_IPSR_MSEL(IP16_27_24, STP_ISEN_1_D, SEL_SSP1_1_2),
|
||||
PINMUX_IPSR_MSEL(IP16_27_24, STP_ISEN_1_D, SEL_SSP1_1_3),
|
||||
PINMUX_IPSR_MSEL(IP16_27_24, STP_OPWM_0_E, SEL_SSP1_0_4),
|
||||
PINMUX_IPSR_MSEL(IP16_27_24, RIF3_D0_B, SEL_DRIF3_1),
|
||||
PINMUX_IPSR_MSEL(IP16_27_24, TCLK2_B, SEL_TIMER_TMU_1),
|
||||
|
@ -3218,11 +3218,13 @@ static int ab8500_charger_init_hw_registers(struct ab8500_charger *di)
|
||||
}
|
||||
|
||||
/* Enable backup battery charging */
|
||||
abx500_mask_and_set_register_interruptible(di->dev,
|
||||
ret = abx500_mask_and_set_register_interruptible(di->dev,
|
||||
AB8500_RTC, AB8500_RTC_CTRL_REG,
|
||||
RTC_BUP_CH_ENA, RTC_BUP_CH_ENA);
|
||||
if (ret < 0)
|
||||
if (ret < 0) {
|
||||
dev_err(di->dev, "%s mask and set failed\n", __func__);
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (is_ab8540(di->parent)) {
|
||||
ret = abx500_mask_and_set_register_interruptible(di->dev,
|
||||
|
@ -145,7 +145,7 @@ static int stmpe_24xx_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,
|
||||
break;
|
||||
|
||||
case 2:
|
||||
offset = STMPE24XX_PWMIC1;
|
||||
offset = STMPE24XX_PWMIC2;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -253,7 +253,7 @@ static int brcmstb_waketmr_probe(struct platform_device *pdev)
|
||||
ret = devm_request_irq(dev, timer->irq, brcmstb_waketmr_irq, 0,
|
||||
"brcmstb-waketimer", timer);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto err_clk;
|
||||
|
||||
timer->reboot_notifier.notifier_call = brcmstb_waketmr_reboot;
|
||||
register_reboot_notifier(&timer->reboot_notifier);
|
||||
@ -262,12 +262,21 @@ static int brcmstb_waketmr_probe(struct platform_device *pdev)
|
||||
&brcmstb_waketmr_ops, THIS_MODULE);
|
||||
if (IS_ERR(timer->rtc)) {
|
||||
dev_err(dev, "unable to register device\n");
|
||||
unregister_reboot_notifier(&timer->reboot_notifier);
|
||||
return PTR_ERR(timer->rtc);
|
||||
ret = PTR_ERR(timer->rtc);
|
||||
goto err_notifier;
|
||||
}
|
||||
|
||||
dev_info(dev, "registered, with irq %d\n", timer->irq);
|
||||
|
||||
return 0;
|
||||
|
||||
err_notifier:
|
||||
unregister_reboot_notifier(&timer->reboot_notifier);
|
||||
|
||||
err_clk:
|
||||
if (timer->clk)
|
||||
clk_disable_unprepare(timer->clk);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -102,11 +102,16 @@ qla2x00_async_iocb_timeout(void *data)
|
||||
struct srb_iocb *lio = &sp->u.iocb_cmd;
|
||||
struct event_arg ea;
|
||||
|
||||
ql_dbg(ql_dbg_disc, fcport->vha, 0x2071,
|
||||
"Async-%s timeout - hdl=%x portid=%06x %8phC.\n",
|
||||
sp->name, sp->handle, fcport->d_id.b24, fcport->port_name);
|
||||
if (fcport) {
|
||||
ql_dbg(ql_dbg_disc, fcport->vha, 0x2071,
|
||||
"Async-%s timeout - hdl=%x portid=%06x %8phC.\n",
|
||||
sp->name, sp->handle, fcport->d_id.b24, fcport->port_name);
|
||||
|
||||
fcport->flags &= ~FCF_ASYNC_SENT;
|
||||
fcport->flags &= ~FCF_ASYNC_SENT;
|
||||
} else {
|
||||
pr_info("Async-%s timeout - hdl=%x.\n",
|
||||
sp->name, sp->handle);
|
||||
}
|
||||
|
||||
switch (sp->type) {
|
||||
case SRB_LOGIN_CMD:
|
||||
|
@ -582,8 +582,9 @@ qla25xx_delete_req_que(struct scsi_qla_host *vha, struct req_que *req)
|
||||
ret = qla25xx_init_req_que(vha, req);
|
||||
if (ret != QLA_SUCCESS)
|
||||
return QLA_FUNCTION_FAILED;
|
||||
|
||||
qla25xx_free_req_que(vha, req);
|
||||
}
|
||||
qla25xx_free_req_que(vha, req);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -598,8 +599,9 @@ qla25xx_delete_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp)
|
||||
ret = qla25xx_init_rsp_que(vha, rsp);
|
||||
if (ret != QLA_SUCCESS)
|
||||
return QLA_FUNCTION_FAILED;
|
||||
|
||||
qla25xx_free_rsp_que(vha, rsp);
|
||||
}
|
||||
qla25xx_free_rsp_que(vha, rsp);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -442,7 +442,7 @@ static int qla2x00_alloc_queues(struct qla_hw_data *ha, struct req_que *req,
|
||||
ha->req_q_map[0] = req;
|
||||
set_bit(0, ha->rsp_qid_map);
|
||||
set_bit(0, ha->req_qid_map);
|
||||
return 1;
|
||||
return 0;
|
||||
|
||||
fail_qpair_map:
|
||||
kfree(ha->base_qpair);
|
||||
@ -459,6 +459,9 @@ fail_req_map:
|
||||
|
||||
static void qla2x00_free_req_que(struct qla_hw_data *ha, struct req_que *req)
|
||||
{
|
||||
if (!ha->req_q_map)
|
||||
return;
|
||||
|
||||
if (IS_QLAFX00(ha)) {
|
||||
if (req && req->ring_fx00)
|
||||
dma_free_coherent(&ha->pdev->dev,
|
||||
@ -469,14 +472,17 @@ static void qla2x00_free_req_que(struct qla_hw_data *ha, struct req_que *req)
|
||||
(req->length + 1) * sizeof(request_t),
|
||||
req->ring, req->dma);
|
||||
|
||||
if (req)
|
||||
if (req) {
|
||||
kfree(req->outstanding_cmds);
|
||||
|
||||
kfree(req);
|
||||
kfree(req);
|
||||
}
|
||||
}
|
||||
|
||||
static void qla2x00_free_rsp_que(struct qla_hw_data *ha, struct rsp_que *rsp)
|
||||
{
|
||||
if (!ha->rsp_q_map)
|
||||
return;
|
||||
|
||||
if (IS_QLAFX00(ha)) {
|
||||
if (rsp && rsp->ring)
|
||||
dma_free_coherent(&ha->pdev->dev,
|
||||
@ -487,7 +493,8 @@ static void qla2x00_free_rsp_que(struct qla_hw_data *ha, struct rsp_que *rsp)
|
||||
(rsp->length + 1) * sizeof(response_t),
|
||||
rsp->ring, rsp->dma);
|
||||
}
|
||||
kfree(rsp);
|
||||
if (rsp)
|
||||
kfree(rsp);
|
||||
}
|
||||
|
||||
static void qla2x00_free_queues(struct qla_hw_data *ha)
|
||||
@ -1710,6 +1717,8 @@ qla2x00_abort_all_cmds(scsi_qla_host_t *vha, int res)
|
||||
struct qla_tgt_cmd *cmd;
|
||||
uint8_t trace = 0;
|
||||
|
||||
if (!ha->req_q_map)
|
||||
return;
|
||||
spin_lock_irqsave(&ha->hardware_lock, flags);
|
||||
for (que = 0; que < ha->max_req_queues; que++) {
|
||||
req = ha->req_q_map[que];
|
||||
@ -3063,14 +3072,14 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
/* Set up the irqs */
|
||||
ret = qla2x00_request_irqs(ha, rsp);
|
||||
if (ret)
|
||||
goto probe_hw_failed;
|
||||
goto probe_failed;
|
||||
|
||||
/* Alloc arrays of request and response ring ptrs */
|
||||
if (!qla2x00_alloc_queues(ha, req, rsp)) {
|
||||
if (qla2x00_alloc_queues(ha, req, rsp)) {
|
||||
ql_log(ql_log_fatal, base_vha, 0x003d,
|
||||
"Failed to allocate memory for queue pointers..."
|
||||
"aborting.\n");
|
||||
goto probe_init_failed;
|
||||
goto probe_failed;
|
||||
}
|
||||
|
||||
if (ha->mqenable && shost_use_blk_mq(host)) {
|
||||
@ -3347,15 +3356,6 @@ skip_dpc:
|
||||
|
||||
return 0;
|
||||
|
||||
probe_init_failed:
|
||||
qla2x00_free_req_que(ha, req);
|
||||
ha->req_q_map[0] = NULL;
|
||||
clear_bit(0, ha->req_qid_map);
|
||||
qla2x00_free_rsp_que(ha, rsp);
|
||||
ha->rsp_q_map[0] = NULL;
|
||||
clear_bit(0, ha->rsp_qid_map);
|
||||
ha->max_req_queues = ha->max_rsp_queues = 0;
|
||||
|
||||
probe_failed:
|
||||
if (base_vha->timer_active)
|
||||
qla2x00_stop_timer(base_vha);
|
||||
@ -4435,11 +4435,17 @@ qla2x00_mem_free(struct qla_hw_data *ha)
|
||||
if (ha->init_cb)
|
||||
dma_free_coherent(&ha->pdev->dev, ha->init_cb_size,
|
||||
ha->init_cb, ha->init_cb_dma);
|
||||
vfree(ha->optrom_buffer);
|
||||
kfree(ha->nvram);
|
||||
kfree(ha->npiv_info);
|
||||
kfree(ha->swl);
|
||||
kfree(ha->loop_id_map);
|
||||
|
||||
if (ha->optrom_buffer)
|
||||
vfree(ha->optrom_buffer);
|
||||
if (ha->nvram)
|
||||
kfree(ha->nvram);
|
||||
if (ha->npiv_info)
|
||||
kfree(ha->npiv_info);
|
||||
if (ha->swl)
|
||||
kfree(ha->swl);
|
||||
if (ha->loop_id_map)
|
||||
kfree(ha->loop_id_map);
|
||||
|
||||
ha->srb_mempool = NULL;
|
||||
ha->ctx_mempool = NULL;
|
||||
@ -4455,6 +4461,15 @@ qla2x00_mem_free(struct qla_hw_data *ha)
|
||||
ha->ex_init_cb_dma = 0;
|
||||
ha->async_pd = NULL;
|
||||
ha->async_pd_dma = 0;
|
||||
ha->loop_id_map = NULL;
|
||||
ha->npiv_info = NULL;
|
||||
ha->optrom_buffer = NULL;
|
||||
ha->swl = NULL;
|
||||
ha->nvram = NULL;
|
||||
ha->mctp_dump = NULL;
|
||||
ha->dcbx_tlv = NULL;
|
||||
ha->xgmac_data = NULL;
|
||||
ha->sfp_data = NULL;
|
||||
|
||||
ha->s_dma_pool = NULL;
|
||||
ha->dl_dma_pool = NULL;
|
||||
|
@ -971,6 +971,7 @@ static void qlt_free_session_done(struct work_struct *work)
|
||||
|
||||
logo.id = sess->d_id;
|
||||
logo.cmd_count = 0;
|
||||
sess->send_els_logo = 0;
|
||||
qlt_send_first_logo(vha, &logo);
|
||||
}
|
||||
|
||||
|
@ -181,7 +181,7 @@ static struct {
|
||||
{"HITACHI", "6586-", "*", BLIST_SPARSELUN | BLIST_LARGELUN},
|
||||
{"HITACHI", "6588-", "*", BLIST_SPARSELUN | BLIST_LARGELUN},
|
||||
{"HP", "A6189A", NULL, BLIST_SPARSELUN | BLIST_LARGELUN}, /* HP VA7400 */
|
||||
{"HP", "OPEN-", "*", BLIST_REPORTLUN2}, /* HP XP Arrays */
|
||||
{"HP", "OPEN-", "*", BLIST_REPORTLUN2 | BLIST_TRY_VPD_PAGES}, /* HP XP Arrays */
|
||||
{"HP", "NetRAID-4M", NULL, BLIST_FORCELUN},
|
||||
{"HP", "HSV100", NULL, BLIST_REPORTLUN2 | BLIST_NOSTARTONADD},
|
||||
{"HP", "C1557A", NULL, BLIST_FORCELUN},
|
||||
@ -595,17 +595,12 @@ int scsi_get_device_flags_keyed(struct scsi_device *sdev,
|
||||
int key)
|
||||
{
|
||||
struct scsi_dev_info_list *devinfo;
|
||||
int err;
|
||||
|
||||
devinfo = scsi_dev_info_list_find(vendor, model, key);
|
||||
if (!IS_ERR(devinfo))
|
||||
return devinfo->flags;
|
||||
|
||||
err = PTR_ERR(devinfo);
|
||||
if (err != -ENOENT)
|
||||
return err;
|
||||
|
||||
/* nothing found, return nothing */
|
||||
/* key or device not found: return nothing */
|
||||
if (key != SCSI_DEVINFO_GLOBAL)
|
||||
return 0;
|
||||
|
||||
|
@ -56,10 +56,13 @@ static const struct scsi_dh_blist scsi_dh_blist[] = {
|
||||
{"IBM", "1815", "rdac", },
|
||||
{"IBM", "1818", "rdac", },
|
||||
{"IBM", "3526", "rdac", },
|
||||
{"IBM", "3542", "rdac", },
|
||||
{"IBM", "3552", "rdac", },
|
||||
{"SGI", "TP9", "rdac", },
|
||||
{"SGI", "IS", "rdac", },
|
||||
{"STK", "OPENstorage D280", "rdac", },
|
||||
{"STK", "OPENstorage", "rdac", },
|
||||
{"STK", "FLEXLINE 380", "rdac", },
|
||||
{"STK", "BladeCtlr", "rdac", },
|
||||
{"SUN", "CSM", "rdac", },
|
||||
{"SUN", "LCSM100", "rdac", },
|
||||
{"SUN", "STK6580_6780", "rdac", },
|
||||
|
@ -615,13 +615,16 @@ static void ses_enclosure_data_process(struct enclosure_device *edev,
|
||||
}
|
||||
|
||||
static void ses_match_to_enclosure(struct enclosure_device *edev,
|
||||
struct scsi_device *sdev)
|
||||
struct scsi_device *sdev,
|
||||
int refresh)
|
||||
{
|
||||
struct scsi_device *edev_sdev = to_scsi_device(edev->edev.parent);
|
||||
struct efd efd = {
|
||||
.addr = 0,
|
||||
};
|
||||
|
||||
ses_enclosure_data_process(edev, to_scsi_device(edev->edev.parent), 0);
|
||||
if (refresh)
|
||||
ses_enclosure_data_process(edev, edev_sdev, 0);
|
||||
|
||||
if (scsi_is_sas_rphy(sdev->sdev_target->dev.parent))
|
||||
efd.addr = sas_get_address(sdev);
|
||||
@ -652,7 +655,7 @@ static int ses_intf_add(struct device *cdev,
|
||||
struct enclosure_device *prev = NULL;
|
||||
|
||||
while ((edev = enclosure_find(&sdev->host->shost_gendev, prev)) != NULL) {
|
||||
ses_match_to_enclosure(edev, sdev);
|
||||
ses_match_to_enclosure(edev, sdev, 1);
|
||||
prev = edev;
|
||||
}
|
||||
return -ENODEV;
|
||||
@ -768,7 +771,7 @@ page2_not_supported:
|
||||
shost_for_each_device(tmp_sdev, sdev->host) {
|
||||
if (tmp_sdev->lun != 0 || scsi_device_enclosure(tmp_sdev))
|
||||
continue;
|
||||
ses_match_to_enclosure(edev, tmp_sdev);
|
||||
ses_match_to_enclosure(edev, tmp_sdev, 0);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -541,7 +541,7 @@ err_free_master:
|
||||
|
||||
static int sun6i_spi_remove(struct platform_device *pdev)
|
||||
{
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
pm_runtime_force_suspend(&pdev->dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -334,24 +334,23 @@ static loff_t ashmem_llseek(struct file *file, loff_t offset, int origin)
|
||||
mutex_lock(&ashmem_mutex);
|
||||
|
||||
if (asma->size == 0) {
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
mutex_unlock(&ashmem_mutex);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!asma->file) {
|
||||
ret = -EBADF;
|
||||
goto out;
|
||||
mutex_unlock(&ashmem_mutex);
|
||||
return -EBADF;
|
||||
}
|
||||
|
||||
mutex_unlock(&ashmem_mutex);
|
||||
|
||||
ret = vfs_llseek(asma->file, offset, origin);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
return ret;
|
||||
|
||||
/** Copy f_pos from backing file, since f_ops->llseek() sets it */
|
||||
file->f_pos = asma->file->f_pos;
|
||||
|
||||
out:
|
||||
mutex_unlock(&ashmem_mutex);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -702,16 +701,14 @@ static int ashmem_pin_unpin(struct ashmem_area *asma, unsigned long cmd,
|
||||
size_t pgstart, pgend;
|
||||
int ret = -EINVAL;
|
||||
|
||||
if (unlikely(copy_from_user(&pin, p, sizeof(pin))))
|
||||
return -EFAULT;
|
||||
|
||||
mutex_lock(&ashmem_mutex);
|
||||
|
||||
if (unlikely(!asma->file))
|
||||
goto out_unlock;
|
||||
|
||||
if (unlikely(copy_from_user(&pin, p, sizeof(pin)))) {
|
||||
ret = -EFAULT;
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
/* per custom, you can pass zero for len to mean "everything onward" */
|
||||
if (!pin.len)
|
||||
pin.len = PAGE_ALIGN(asma->size) - pin.offset;
|
||||
|
@ -484,8 +484,7 @@ unsigned int comedi_nsamples_left(struct comedi_subdevice *s,
|
||||
struct comedi_cmd *cmd = &async->cmd;
|
||||
|
||||
if (cmd->stop_src == TRIG_COUNT) {
|
||||
unsigned int nscans = nsamples / cmd->scan_end_arg;
|
||||
unsigned int scans_left = __comedi_nscans_left(s, nscans);
|
||||
unsigned int scans_left = __comedi_nscans_left(s, cmd->stop_arg);
|
||||
unsigned int scan_pos =
|
||||
comedi_bytes_to_samples(s, async->scan_progress);
|
||||
unsigned long long samples_left = 0;
|
||||
|
@ -464,6 +464,8 @@ bool rtl8822b_halmac_cb_write_data_rsvd_page(struct rtl_priv *rtlpriv, u8 *buf,
|
||||
int count;
|
||||
|
||||
skb = dev_alloc_skb(size);
|
||||
if (!skb)
|
||||
return false;
|
||||
memcpy((u8 *)skb_put(skb, size), buf, size);
|
||||
|
||||
if (!_rtl8822be_send_bcn_or_cmd_packet(rtlpriv->hw, skb, BEACON_QUEUE))
|
||||
|
@ -1552,6 +1552,21 @@ static int fusb302_pd_read_message(struct fusb302_chip *chip,
|
||||
fusb302_log(chip, "PD message header: %x", msg->header);
|
||||
fusb302_log(chip, "PD message len: %d", len);
|
||||
|
||||
/*
|
||||
* Check if we've read off a GoodCRC message. If so then indicate to
|
||||
* TCPM that the previous transmission has completed. Otherwise we pass
|
||||
* the received message over to TCPM for processing.
|
||||
*
|
||||
* We make this check here instead of basing the reporting decision on
|
||||
* the IRQ event type, as it's possible for the chip to report the
|
||||
* TX_SUCCESS and GCRCSENT events out of order on occasion, so we need
|
||||
* to check the message type to ensure correct reporting to TCPM.
|
||||
*/
|
||||
if ((!len) && (pd_header_type_le(msg->header) == PD_CTRL_GOOD_CRC))
|
||||
tcpm_pd_transmit_complete(chip->tcpm_port, TCPC_TX_SUCCESS);
|
||||
else
|
||||
tcpm_pd_receive(chip->tcpm_port, msg);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -1659,13 +1674,12 @@ static irqreturn_t fusb302_irq_intn(int irq, void *dev_id)
|
||||
|
||||
if (interrupta & FUSB_REG_INTERRUPTA_TX_SUCCESS) {
|
||||
fusb302_log(chip, "IRQ: PD tx success");
|
||||
/* read out the received good CRC */
|
||||
ret = fusb302_pd_read_message(chip, &pd_msg);
|
||||
if (ret < 0) {
|
||||
fusb302_log(chip, "cannot read in GCRC, ret=%d", ret);
|
||||
fusb302_log(chip,
|
||||
"cannot read in PD message, ret=%d", ret);
|
||||
goto done;
|
||||
}
|
||||
tcpm_pd_transmit_complete(chip->tcpm_port, TCPC_TX_SUCCESS);
|
||||
}
|
||||
|
||||
if (interrupta & FUSB_REG_INTERRUPTA_HARDRESET) {
|
||||
@ -1686,7 +1700,6 @@ static irqreturn_t fusb302_irq_intn(int irq, void *dev_id)
|
||||
"cannot read in PD message, ret=%d", ret);
|
||||
goto done;
|
||||
}
|
||||
tcpm_pd_receive(chip->tcpm_port, &pd_msg);
|
||||
}
|
||||
done:
|
||||
mutex_unlock(&chip->lock);
|
||||
|
@ -4700,6 +4700,17 @@ static const struct pci_device_id serial_pci_tbl[] = {
|
||||
{ PCI_VENDOR_ID_INTASHIELD, PCI_DEVICE_ID_INTASHIELD_IS400,
|
||||
PCI_ANY_ID, PCI_ANY_ID, 0, 0, /* 135a.0dc0 */
|
||||
pbn_b2_4_115200 },
|
||||
/*
|
||||
* BrainBoxes UC-260
|
||||
*/
|
||||
{ PCI_VENDOR_ID_INTASHIELD, 0x0D21,
|
||||
PCI_ANY_ID, PCI_ANY_ID,
|
||||
PCI_CLASS_COMMUNICATION_MULTISERIAL << 8, 0xffff00,
|
||||
pbn_b2_4_115200 },
|
||||
{ PCI_VENDOR_ID_INTASHIELD, 0x0E34,
|
||||
PCI_ANY_ID, PCI_ANY_ID,
|
||||
PCI_CLASS_COMMUNICATION_MULTISERIAL << 8, 0xffff00,
|
||||
pbn_b2_4_115200 },
|
||||
/*
|
||||
* Perle PCI-RAS cards
|
||||
*/
|
||||
|
@ -1763,6 +1763,7 @@ static void atmel_get_ip_name(struct uart_port *port)
|
||||
switch (version) {
|
||||
case 0x302:
|
||||
case 0x10213:
|
||||
case 0x10302:
|
||||
dev_dbg(port->dev, "This version is usart\n");
|
||||
atmel_port->has_frac_baudrate = true;
|
||||
atmel_port->has_hw_timer = true;
|
||||
|
@ -253,11 +253,12 @@ int __init of_setup_earlycon(const struct earlycon_id *match,
|
||||
}
|
||||
port->mapbase = addr;
|
||||
port->uartclk = BASE_BAUD * 16;
|
||||
port->membase = earlycon_map(port->mapbase, SZ_4K);
|
||||
|
||||
val = of_get_flat_dt_prop(node, "reg-offset", NULL);
|
||||
if (val)
|
||||
port->mapbase += be32_to_cpu(*val);
|
||||
port->membase = earlycon_map(port->mapbase, SZ_4K);
|
||||
|
||||
val = of_get_flat_dt_prop(node, "reg-shift", NULL);
|
||||
if (val)
|
||||
port->regshift = be32_to_cpu(*val);
|
||||
|
@ -1160,6 +1160,8 @@ static int uart_do_autoconfig(struct tty_struct *tty,struct uart_state *state)
|
||||
uport->ops->config_port(uport, flags);
|
||||
|
||||
ret = uart_startup(tty, state, 1);
|
||||
if (ret == 0)
|
||||
tty_port_set_initialized(port, true);
|
||||
if (ret > 0)
|
||||
ret = 0;
|
||||
}
|
||||
|
@ -886,6 +886,8 @@ static void sci_receive_chars(struct uart_port *port)
|
||||
/* Tell the rest of the system the news. New characters! */
|
||||
tty_flip_buffer_push(tport);
|
||||
} else {
|
||||
/* TTY buffers full; read from RX reg to prevent lockup */
|
||||
serial_port_in(port, SCxRDR);
|
||||
serial_port_in(port, SCxSR); /* dummy read */
|
||||
sci_clear_SCxSR(port, SCxSR_RDxF_CLEAR(port));
|
||||
}
|
||||
|
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