mirror of
https://github.com/rd-stuffs/msm-4.14.git
synced 2025-02-20 11:45:48 +08:00
Merge android-4.14.123 (acd501f) into msm-4.14
* refs/heads/tmp-acd501f: Revert "arm64/iommu: handle non-remapped addresses in ->mmap and ->get_sgtable" Linux 4.14.123 NFS: Fix a double unlock from nfs_match,get_client vfio-ccw: Prevent quiesce function going into an infinite loop drm: Wake up next in drm_read() chain if we are forced to putback the event drm/drv: Hold ref on parent device during drm_device lifetime ASoC: davinci-mcasp: Fix clang warning without CONFIG_PM spi: Fix zero length xfer bug spi: rspi: Fix sequencer reset during initialization spi : spi-topcliff-pch: Fix to handle empty DMA buffers scsi: lpfc: Fix SLI3 commands being issued on SLI4 devices media: saa7146: avoid high stack usage with clang scsi: lpfc: Fix fc4type information for FDMI scsi: lpfc: Fix FDMI manufacturer attribute value media: vimc: zero the media_device on probe media: go7007: avoid clang frame overflow warning with KASAN media: vimc: stream: fix thread state before sleep media: m88ds3103: serialize reset messages in m88ds3103_set_frontend thunderbolt: Fix to check for kmemdup failure hwrng: omap - Set default quality dmaengine: tegra210-adma: use devm_clk_*() helpers batman-adv: allow updating DAT entry timeouts on incoming ARP Replies scsi: qla4xxx: avoid freeing unallocated dma memory usb: core: Add PM runtime calls to usb_hcd_platform_shutdown rcuperf: Fix cleanup path for invalid perf_type strings rcutorture: Fix cleanup path for invalid torture_type strings x86/mce: Fix machine_check_poll() tests for error types tty: ipwireless: fix missing checks for ioremap virtio_console: initialize vtermno value for ports scsi: qedf: Add missing return in qedf_post_io_req() in the fcport offload check media: wl128x: prevent two potential buffer overflows media: video-mux: fix null pointer dereferences kobject: Don't trigger kobject_uevent(KOBJ_REMOVE) twice. spi: tegra114: reset controller on probe HID: logitech-hidpp: change low battery level threshold from 31 to 30 percent cxgb3/l2t: Fix undefined behaviour ASoC: fsl_utils: fix a leaked reference by adding missing of_node_put ASoC: eukrea-tlv320: fix a leaked reference by adding missing of_node_put HID: core: move Usage Page concatenation to Main item RDMA/hns: Fix bad endianess of port_pd variable chardev: add additional check for minor range overlap x86/ia32: Fix ia32_restore_sigcontext() AC leak x86/uaccess, signal: Fix AC=1 bloat x86/uaccess, ftrace: Fix ftrace_likely_update() vs. SMAP arm64: cpu_ops: fix a leaked reference by adding missing of_node_put scsi: ufs: Avoid configuring regulator with undefined voltage range scsi: ufs: Fix regulator load and icc-level configuration rtlwifi: fix potential NULL pointer dereference rtc: xgene: fix possible race condition brcmfmac: fix Oops when bringing up interface during USB disconnect brcmfmac: fix race during disconnect when USB completion is in progress brcmfmac: fix WARNING during USB disconnect in case of unempty psq brcmfmac: convert dev_init_lock mutex to completion b43: shut up clang -Wuninitialized variable warning brcmfmac: fix missing checks for kmemdup mwifiex: Fix mem leak in mwifiex_tm_cmd rtlwifi: fix a potential NULL pointer dereference iio: common: ssp_sensors: Initialize calculated_time in ssp_common_process_data iio: hmc5843: fix potential NULL pointer dereferences iio: ad_sigma_delta: Properly handle SPI bus locking vs CS assertion x86/build: Keep local relocations with ld.lld block: sed-opal: fix IOC_OPAL_ENABLE_DISABLE_MBR cpufreq: kirkwood: fix possible object reference leak cpufreq: pmac32: fix possible object reference leak cpufreq/pasemi: fix possible object reference leak cpufreq: ppc_cbe: fix possible object reference leak s390: cio: fix cio_irb declaration x86/microcode: Fix the ancient deprecated microcode loading method s390: zcrypt: initialize variables before_use clk: rockchip: Make rkpwm a critical clock on rk3288 extcon: arizona: Disable mic detect if running when driver is removed clk: rockchip: Fix video codec clocks on rk3288 PM / core: Propagate dev->power.wakeup_path when no callbacks drm/amdgpu: fix old fence check in amdgpu_fence_emit mmc: sdhci-of-esdhc: add erratum eSDHC-A001 and A-008358 support mmc: sdhci-of-esdhc: add erratum A-009204 support mmc: sdhci-of-esdhc: add erratum eSDHC5 support mmc_spi: add a status check for spi_sync_locked mmc: core: make pwrseq_emmc (partially) support sleepy GPIO controllers scsi: libsas: Do discovery on empty PHY to update PHY info hwmon: (f71805f) Use request_muxed_region for Super-IO accesses hwmon: (pc87427) Use request_muxed_region for Super-IO accesses hwmon: (smsc47b397) Use request_muxed_region for Super-IO accesses hwmon: (smsc47m1) Use request_muxed_region for Super-IO accesses hwmon: (vt1211) Use request_muxed_region for Super-IO accesses RDMA/cxgb4: Fix null pointer dereference on alloc_skb failure arm64: vdso: Fix clock_getres() for CLOCK_REALTIME i40e: don't allow changes to HW VLAN stripping on active port VLANs i40e: Able to add up to 16 MAC filters on an untrusted VF phy: sun4i-usb: Make sure to disable PHY0 passby for peripheral mode x86/irq/64: Limit IST stack overflow check to #DB stack USB: core: Don't unbind interfaces following device reset failure drm/msm: a5xx: fix possible object reference leak sched/core: Handle overflow in cpu_shares_write_u64 sched/rt: Check integer overflow at usec to nsec conversion sched/core: Check quota and period overflow at usec to nsec conversion cgroup: protect cgroup->nr_(dying_)descendants by css_set_lock random: add a spinlock_t to struct batched_entropy powerpc/64: Fix booting large kernels with STRICT_KERNEL_RWX powerpc/numa: improve control of topology updates media: pvrusb2: Prevent a buffer overflow media: au0828: Fix NULL pointer dereference in au0828_analog_stream_enable() media: stm32-dcmi: fix crash when subdev do not expose any formats audit: fix a memory leak bug media: ov2659: make S_FMT succeed even if requested format doesn't match media: au0828: stop video streaming only when last user stops media: ov6650: Move v4l2_clk_get() to ov6650_video_probe() helper media: coda: clear error return value before picture run dmaengine: at_xdmac: remove BUG_ON macro in tasklet clk: rockchip: undo several noc and special clocks as critical on rk3288 pinctrl: samsung: fix leaked of_node references pinctrl: pistachio: fix leaked of_node references HID: logitech-hidpp: use RAP instead of FAP to get the protocol version mm/uaccess: Use 'unsigned long' to placate UBSAN warnings on older GCC versions x86/mm: Remove in_nmi() warning from 64-bit implementation of vmalloc_fault() smpboot: Place the __percpu annotation correctly x86/build: Move _etext to actual end of .text vfio-ccw: Release any channel program when releasing/removing vfio-ccw mdev vfio-ccw: Do not call flush_workqueue while holding the spinlock bcache: avoid clang -Wunintialized warning bcache: add failure check to run_cache_set() for journal replay bcache: fix failure in journal relplay bcache: return error immediately in bch_journal_replay() crypto: sun4i-ss - Fix invalid calculation of hash end net: cw1200: fix a NULL pointer dereference mwifiex: prevent an array overflow ASoC: fsl_sai: Update is_slave_mode with correct value libbpf: fix samples/bpf build failure due to undefined UINT32_MAX mac80211/cfg80211: update bss channel on channel switch dmaengine: pl330: _stop: clear interrupt status w1: fix the resume command API scsi: qedi: Abort ep termination if offload not scheduled rtc: 88pm860x: prevent use-after-free on device remove iwlwifi: pcie: don't crash on invalid RX interrupt btrfs: Don't panic when we can't find a root key btrfs: fix panic during relocation after ENOSPC before writeback happens Btrfs: fix data bytes_may_use underflow with fallocate due to failed quota reserve scsi: qla2xxx: Avoid that lockdep complains about unsafe locking in tcm_qla2xxx_close_session() scsi: qla2xxx: Fix abort handling in tcm_qla2xxx_write_pending() scsi: qla2xxx: Fix a qla24xx_enable_msix() error path sched/cpufreq: Fix kobject memleak arm64: Fix compiler warning from pte_unmap() with -Wunused-but-set-variable ARM: vdso: Remove dependency with the arch_timer driver internals ACPI / property: fix handling of data_nodes in acpi_get_next_subnode() brcm80211: potential NULL dereference in brcmf_cfg80211_vndr_cmds_dcmd_handler() spi: pxa2xx: fix SCR (divisor) calculation ASoC: imx: fix fiq dependencies powerpc/boot: Fix missing check of lseek() return value powerpc/perf: Return accordingly on invalid chip-id in ASoC: hdmi-codec: unlock the device on startup errors pinctrl: zte: fix leaked of_node references net: ena: gcc 8: fix compilation warning dmaengine: tegra210-dma: free dma controller in remove() tools/bpf: fix perf build error with uClibc (seen on ARC) mmc: core: Verify SD bus width gfs2: Fix occasional glock use-after-free IB/hfi1: Fix WQ_MEM_RECLAIM warning NFS: make nfs_match_client killable cxgb4: Fix error path in cxgb4_init_module gfs2: Fix lru_count going negative Revert "btrfs: Honour FITRIM range constraints during free space trim" net: erspan: fix use-after-free at76c50x-usb: Don't register led_trigger if usb_register_driver failed batman-adv: mcast: fix multicast tt/tvlv worker locking bpf: devmap: fix use-after-free Read in __dev_map_entry_free ssb: Fix possible NULL pointer dereference in ssb_host_pcmcia_exit media: vivid: use vfree() instead of kfree() for dev->bitmap_cap media: serial_ir: Fix use-after-free in serial_ir_init_module media: cpia2: Fix use-after-free in cpia2_exit fbdev: fix WARNING in __alloc_pages_nodemask bug btrfs: honor path->skip_locking in backref code brcmfmac: add subtype check for event handling in data path brcmfmac: assure SSID length from firmware is limited hugetlb: use same fault hash key for shared and private mappings fbdev: fix divide error in fb_var_to_videomode btrfs: sysfs: don't leak memory when failing add fsid btrfs: sysfs: Fix error path kobject memory leak Btrfs: fix race between ranged fsync and writeback of adjacent ranges Btrfs: avoid fallback to transaction commit during fsync of files with holes Btrfs: do not abort transaction at btrfs_update_root() after failure to COW path gfs2: Fix sign extension bug in gfs2_update_stats arm64/iommu: handle non-remapped addresses in ->mmap and ->get_sgtable libnvdimm/namespace: Fix label tracking error libnvdimm/pmem: Bypass CONFIG_HARDENED_USERCOPY overhead kvm: svm/avic: fix off-by-one in checking host APIC ID mmc: sdhci-iproc: Set NO_HISPD bit to fix HS50 data hold time problem mmc: sdhci-iproc: cygnus: Set NO_HISPD bit to fix HS50 data hold time problem crypto: vmx - CTR: always increment IV as quadword Revert "scsi: sd: Keep disk read-only when re-reading partition" sbitmap: fix improper use of smp_mb__before_atomic() bio: fix improper use of smp_mb__before_atomic() KVM: x86: fix return value for reserved EFER f2fs: Fix use of number of devices ext4: do not delete unlinked inode from orphan list on failed truncate x86: Hide the int3_emulate_call/jmp functions from UML x86: Hide the int3_emulate_call/jmp functions from UML Linux 4.14.122 fbdev: sm712fb: fix memory frequency by avoiding a switch/case fallthrough btrfs: Honour FITRIM range constraints during free space trim bpf, lru: avoid messing with eviction heuristics upon syscall lookup bpf: add map_lookup_elem_sys_only for lookups from syscall side driver core: Postpone DMA tear-down until after devres release for probe failure md/raid: raid5 preserve the writeback action after the parity check Revert "Don't jump to compute_result state from check_result state" perf bench numa: Add define for RUSAGE_THREAD if not present ufs: fix braino in ufs_get_inode_gid() for solaris UFS flavour x86/mm/mem_encrypt: Disable all instrumentation for early SME setup sched/cpufreq: Fix kobject memleak iwlwifi: mvm: check for length correctness in iwl_mvm_create_skb() power: supply: sysfs: prevent endless uevent loop with CONFIG_POWER_SUPPLY_DEBUG KVM: arm/arm64: Ensure vcpu target is unset on reset failure mac80211: Fix kernel panic due to use of txq after free apparmorfs: fix use-after-free on symlink traversal securityfs: fix use-after-free on symlink traversal power: supply: cpcap-battery: Fix division by zero xfrm4: Fix uninitialized memory read in _decode_session4 esp4: add length check for UDP encapsulation vti4: ipip tunnel deregistration fixes. xfrm6_tunnel: Fix potential panic when unloading xfrm6_tunnel module xfrm: policy: Fix out-of-bound array accesses in __xfrm_policy_unlink dm delay: fix a crash when invalid device is specified dm zoned: Fix zone report handling dm cache metadata: Fix loading discard bitset PCI: Work around Pericom PCIe-to-PCI bridge Retrain Link erratum PCI: Factor out pcie_retrain_link() function PCI: Mark Atheros AR9462 to avoid bus reset PCI: Mark AMD Stoney Radeon R7 GPU ATS as broken fbdev: sm712fb: fix crashes and garbled display during DPMS modesetting fbdev: sm712fb: use 1024x768 by default on non-MIPS, fix garbled display fbdev: sm712fb: fix support for 1024x768-16 mode fbdev: sm712fb: fix crashes during framebuffer writes by correctly mapping VRAM fbdev: sm712fb: fix boot screen glitch when sm712fb replaces VGA fbdev: sm712fb: fix white screen of death on reboot, don't set CR3B-CR3F fbdev: sm712fb: fix VRAM detection, don't set SR70/71/74/75 fbdev: sm712fb: fix brightness control on reboot, don't set SR30 objtool: Allow AR to be overridden with HOSTAR perf intel-pt: Fix sample timestamp wrt non-taken branches perf intel-pt: Fix improved sample timestamp perf intel-pt: Fix instructions sampling rate memory: tegra: Fix integer overflow on tick value calculation tracing: Fix partial reading of trace event's id file ftrace/x86_64: Emulate call function while updating in breakpoint handler x86_64: Allow breakpoints to emulate call instructions x86_64: Add gap to int3 to allow for call emulation ceph: flush dirty inodes before proceeding with remount iommu/tegra-smmu: Fix invalid ASID bits on Tegra30/114 fuse: honor RLIMIT_FSIZE in fuse_file_fallocate fuse: fix writepages on 32bit clk: rockchip: fix wrong clock definitions for rk3328 clk: tegra: Fix PLLM programming on Tegra124+ when PMC overrides divider clk: hi3660: Mark clk_gate_ufs_subsys as critical PNFS fallback to MDS if no deviceid found NFS4: Fix v4.0 client state corruption when mount Revert "cifs: fix memory leak in SMB2_read" media: ov6650: Fix sensor possibly not detected on probe cifs: fix strcat buffer overflow and reduce raciness in smb21_set_oplock_level() of: fix clang -Wunsequenced for be32_to_cpu() p54: drop device reference count if fails to enable device intel_th: msu: Fix single mode with IOMMU md: add mddev->pers to avoid potential NULL pointer dereference stm class: Fix channel free in stm output free path parisc: Rename LEVEL to PA_ASM_LEVEL to avoid name clash with DRBD code parisc: Use PA_ASM_LEVEL in boot code parisc: Skip registering LED when running in QEMU parisc: Export running_on_qemu symbol for modules net: Always descend into dsa/ vsock/virtio: Initialize core virtio vsock before registering the driver tipc: fix modprobe tipc failed after switch order of device registration vsock/virtio: free packets during the socket release tipc: switch order of device registration to fix a crash ppp: deflate: Fix possible crash in deflate_init net: usb: qmi_wwan: add Telit 0x1260 and 0x1261 compositions net: test nouarg before dereferencing zerocopy pointers net/mlx4_core: Change the error print to info print net: avoid weird emergency message f2fs: link f2fs quota ops for sysfile Enable CONFIG_ION_SYSTEM_HEAP BACKPORT: gcov: clang support UPSTREAM: gcov: docs: add a note on GCC vs Clang differences UPSTREAM: gcov: clang: move common GCC code into gcc_base.c UPSTREAM: module: add stubs for within_module functions UPSTREAM: gcov: remove CONFIG_GCOV_FORMAT_AUTODETECT BACKPORT: kbuild: gcov: enable -fno-tree-loop-im if supported fs: sdcardfs: Add missing option to show_options Conflicts: Makefile arch/arm64/include/asm/pgtable.h drivers/scsi/ufs/ufshcd.c Change-Id: I0c79879b0989383949ff5a292a9923b668e4514f Signed-off-by: Blagovest Kolenichev <bkolenichev@codeaurora.org>
This commit is contained in:
commit
7e722ce705
@ -34,10 +34,6 @@ Configure the kernel with::
|
||||
CONFIG_DEBUG_FS=y
|
||||
CONFIG_GCOV_KERNEL=y
|
||||
|
||||
select the gcc's gcov format, default is autodetect based on gcc version::
|
||||
|
||||
CONFIG_GCOV_FORMAT_AUTODETECT=y
|
||||
|
||||
and to get coverage data for the entire kernel::
|
||||
|
||||
CONFIG_GCOV_PROFILE_ALL=y
|
||||
@ -169,6 +165,20 @@ b) gcov is run on the BUILD machine
|
||||
[user@build] gcov -o /tmp/coverage/tmp/out/init main.c
|
||||
|
||||
|
||||
Note on compilers
|
||||
-----------------
|
||||
|
||||
GCC and LLVM gcov tools are not necessarily compatible. Use gcov_ to work with
|
||||
GCC-generated .gcno and .gcda files, and use llvm-cov_ for Clang.
|
||||
|
||||
.. _gcov: http://gcc.gnu.org/onlinedocs/gcc/Gcov.html
|
||||
.. _llvm-cov: https://llvm.org/docs/CommandGuide/llvm-cov.html
|
||||
|
||||
Build differences between GCC and Clang gcov are handled by Kconfig. It
|
||||
automatically selects the appropriate gcov format depending on the detected
|
||||
toolchain.
|
||||
|
||||
|
||||
Troubleshooting
|
||||
---------------
|
||||
|
||||
|
2
Makefile
2
Makefile
@ -1,7 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 4
|
||||
PATCHLEVEL = 14
|
||||
SUBLEVEL = 121
|
||||
SUBLEVEL = 123
|
||||
EXTRAVERSION =
|
||||
NAME = Petit Gorille
|
||||
|
||||
|
@ -68,6 +68,8 @@
|
||||
#define BPIALL __ACCESS_CP15(c7, 0, c5, 6)
|
||||
#define ICIALLU __ACCESS_CP15(c7, 0, c5, 0)
|
||||
|
||||
#define CNTVCT __ACCESS_CP15_64(1, c14)
|
||||
|
||||
extern unsigned long cr_alignment; /* defined in entry-armv.S */
|
||||
|
||||
static inline unsigned long get_cr(void)
|
||||
|
@ -18,9 +18,9 @@
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/hrtimer.h>
|
||||
#include <linux/time.h>
|
||||
#include <asm/arch_timer.h>
|
||||
#include <asm/barrier.h>
|
||||
#include <asm/bug.h>
|
||||
#include <asm/cp15.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/unistd.h>
|
||||
#include <asm/vdso_datapage.h>
|
||||
@ -123,7 +123,8 @@ static notrace u64 get_ns(struct vdso_data *vdata)
|
||||
u64 cycle_now;
|
||||
u64 nsec;
|
||||
|
||||
cycle_now = arch_counter_get_cntvct();
|
||||
isb();
|
||||
cycle_now = read_sysreg(CNTVCT);
|
||||
|
||||
cycle_delta = (cycle_now - vdata->cs_cycle_last) & vdata->cs_mask;
|
||||
|
||||
|
@ -396,6 +396,7 @@ CONFIG_STAGING=y
|
||||
CONFIG_ASHMEM=y
|
||||
CONFIG_ANDROID_VSOC=y
|
||||
CONFIG_ION=y
|
||||
CONFIG_ION_SYSTEM_HEAP=y
|
||||
CONFIG_COMMON_CLK_SCPI=y
|
||||
# CONFIG_COMMON_CLK_XGENE is not set
|
||||
CONFIG_MAILBOX=y
|
||||
|
@ -455,6 +455,8 @@ static inline unsigned long pmd_page_vaddr(pmd_t pmd)
|
||||
return (unsigned long) __va(pmd_page_paddr(pmd));
|
||||
}
|
||||
|
||||
static inline void pte_unmap(pte_t *pte) { }
|
||||
|
||||
/* Find an entry in the third-level page table. */
|
||||
#define pte_index(addr) (((addr) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1))
|
||||
|
||||
@ -463,7 +465,6 @@ static inline unsigned long pmd_page_vaddr(pmd_t pmd)
|
||||
|
||||
#define pte_offset_map(dir,addr) pte_offset_kernel((dir), (addr))
|
||||
#define pte_offset_map_nested(dir,addr) pte_offset_kernel((dir), (addr))
|
||||
#define pte_unmap(pte) do { } while (0)
|
||||
#define pte_unmap_nested(pte) do { } while (0)
|
||||
|
||||
#define pte_set_fixmap(addr) ((pte_t *)set_fixmap_offset(FIX_PTE, addr))
|
||||
|
@ -38,6 +38,7 @@ struct vdso_data {
|
||||
__u32 tz_minuteswest; /* Whacky timezone stuff */
|
||||
__u32 tz_dsttime;
|
||||
__u32 use_syscall;
|
||||
__u32 hrtimer_res;
|
||||
};
|
||||
|
||||
#endif /* !__ASSEMBLY__ */
|
||||
|
@ -95,7 +95,7 @@ int main(void)
|
||||
DEFINE(CLOCK_REALTIME, CLOCK_REALTIME);
|
||||
DEFINE(CLOCK_MONOTONIC, CLOCK_MONOTONIC);
|
||||
DEFINE(CLOCK_MONOTONIC_RAW, CLOCK_MONOTONIC_RAW);
|
||||
DEFINE(CLOCK_REALTIME_RES, MONOTONIC_RES_NSEC);
|
||||
DEFINE(CLOCK_REALTIME_RES, offsetof(struct vdso_data, hrtimer_res));
|
||||
DEFINE(CLOCK_REALTIME_COARSE, CLOCK_REALTIME_COARSE);
|
||||
DEFINE(CLOCK_MONOTONIC_COARSE,CLOCK_MONOTONIC_COARSE);
|
||||
DEFINE(CLOCK_COARSE_RES, LOW_RES_NSEC);
|
||||
|
@ -85,6 +85,7 @@ static const char *__init cpu_read_enable_method(int cpu)
|
||||
pr_err("%pOF: missing enable-method property\n",
|
||||
dn);
|
||||
}
|
||||
of_node_put(dn);
|
||||
} else {
|
||||
enable_method = acpi_get_enable_method(cpu);
|
||||
if (!enable_method) {
|
||||
|
@ -232,6 +232,9 @@ void update_vsyscall(struct timekeeper *tk)
|
||||
vdso_data->wtm_clock_sec = tk->wall_to_monotonic.tv_sec;
|
||||
vdso_data->wtm_clock_nsec = tk->wall_to_monotonic.tv_nsec;
|
||||
|
||||
/* Read without the seqlock held by clock_getres() */
|
||||
WRITE_ONCE(vdso_data->hrtimer_res, hrtimer_resolution);
|
||||
|
||||
if (!use_syscall) {
|
||||
/* tkr_mono.cycle_last == tkr_raw.cycle_last */
|
||||
vdso_data->cs_cycle_last = tk->tkr_mono.cycle_last;
|
||||
|
@ -301,13 +301,14 @@ ENTRY(__kernel_clock_getres)
|
||||
ccmp w0, #CLOCK_MONOTONIC_RAW, #0x4, ne
|
||||
b.ne 1f
|
||||
|
||||
ldr x2, 5f
|
||||
adr vdso_data, _vdso_data
|
||||
ldr w2, [vdso_data, #CLOCK_REALTIME_RES]
|
||||
b 2f
|
||||
1:
|
||||
cmp w0, #CLOCK_REALTIME_COARSE
|
||||
ccmp w0, #CLOCK_MONOTONIC_COARSE, #0x4, ne
|
||||
b.ne 4f
|
||||
ldr x2, 6f
|
||||
ldr x2, 5f
|
||||
2:
|
||||
cbz x1, 3f
|
||||
stp xzr, x2, [x1]
|
||||
@ -321,8 +322,6 @@ ENTRY(__kernel_clock_getres)
|
||||
svc #0
|
||||
ret
|
||||
5:
|
||||
.quad CLOCK_REALTIME_RES
|
||||
6:
|
||||
.quad CLOCK_COARSE_RES
|
||||
.cfi_endproc
|
||||
ENDPROC(__kernel_clock_getres)
|
||||
|
@ -22,7 +22,7 @@
|
||||
__HEAD
|
||||
|
||||
ENTRY(startup)
|
||||
.level LEVEL
|
||||
.level PA_ASM_LEVEL
|
||||
|
||||
#define PSW_W_SM 0x200
|
||||
#define PSW_W_BIT 36
|
||||
@ -63,7 +63,7 @@ $bss_loop:
|
||||
load32 BOOTADDR(decompress_kernel),%r3
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
.level LEVEL
|
||||
.level PA_ASM_LEVEL
|
||||
ssm PSW_W_SM, %r0 /* set W-bit */
|
||||
depdi 0, 31, 32, %r3
|
||||
#endif
|
||||
@ -72,7 +72,7 @@ $bss_loop:
|
||||
|
||||
startup_continue:
|
||||
#ifdef CONFIG_64BIT
|
||||
.level LEVEL
|
||||
.level PA_ASM_LEVEL
|
||||
rsm PSW_W_SM, %r0 /* clear W-bit */
|
||||
#endif
|
||||
|
||||
|
@ -59,14 +59,14 @@
|
||||
#define LDCW ldcw,co
|
||||
#define BL b,l
|
||||
# ifdef CONFIG_64BIT
|
||||
# define LEVEL 2.0w
|
||||
# define PA_ASM_LEVEL 2.0w
|
||||
# else
|
||||
# define LEVEL 2.0
|
||||
# define PA_ASM_LEVEL 2.0
|
||||
# endif
|
||||
#else
|
||||
#define LDCW ldcw
|
||||
#define BL bl
|
||||
#define LEVEL 1.1
|
||||
#define PA_ASM_LEVEL 1.1
|
||||
#endif
|
||||
|
||||
#ifdef __ASSEMBLY__
|
||||
|
@ -22,7 +22,7 @@
|
||||
#include <linux/linkage.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
.level LEVEL
|
||||
.level PA_ASM_LEVEL
|
||||
|
||||
__INITDATA
|
||||
ENTRY(boot_args)
|
||||
@ -254,7 +254,7 @@ stext_pdc_ret:
|
||||
ldo R%PA(fault_vector_11)(%r10),%r10
|
||||
|
||||
$is_pa20:
|
||||
.level LEVEL /* restore 1.1 || 2.0w */
|
||||
.level PA_ASM_LEVEL /* restore 1.1 || 2.0w */
|
||||
#endif /*!CONFIG_64BIT*/
|
||||
load32 PA(fault_vector_20),%r10
|
||||
|
||||
|
@ -192,6 +192,7 @@ int dump_task_fpu (struct task_struct *tsk, elf_fpregset_t *r)
|
||||
*/
|
||||
|
||||
int running_on_qemu __read_mostly;
|
||||
EXPORT_SYMBOL(running_on_qemu);
|
||||
|
||||
void __cpuidle arch_cpu_idle_dead(void)
|
||||
{
|
||||
|
@ -48,7 +48,7 @@ registers).
|
||||
*/
|
||||
#define KILL_INSN break 0,0
|
||||
|
||||
.level LEVEL
|
||||
.level PA_ASM_LEVEL
|
||||
|
||||
.text
|
||||
|
||||
|
@ -223,7 +223,11 @@ main(int ac, char **av)
|
||||
PUT_16(E_PHNUM, np + 2);
|
||||
|
||||
/* write back */
|
||||
lseek(fd, (long) 0, SEEK_SET);
|
||||
i = lseek(fd, (long) 0, SEEK_SET);
|
||||
if (i < 0) {
|
||||
perror("lseek");
|
||||
exit(1);
|
||||
}
|
||||
i = write(fd, buf, n);
|
||||
if (i < 0) {
|
||||
perror("write");
|
||||
|
@ -961,7 +961,9 @@ start_here_multiplatform:
|
||||
|
||||
/* Restore parameters passed from prom_init/kexec */
|
||||
mr r3,r31
|
||||
bl early_setup /* also sets r13 and SPRG_PACA */
|
||||
LOAD_REG_ADDR(r12, DOTSYM(early_setup))
|
||||
mtctr r12
|
||||
bctrl /* also sets r13 and SPRG_PACA */
|
||||
|
||||
LOAD_REG_ADDR(r3, start_here_common)
|
||||
ld r4,PACAKMSR(r13)
|
||||
|
@ -1561,6 +1561,9 @@ int start_topology_update(void)
|
||||
{
|
||||
int rc = 0;
|
||||
|
||||
if (!topology_updates_enabled)
|
||||
return 0;
|
||||
|
||||
if (firmware_has_feature(FW_FEATURE_PRRN)) {
|
||||
if (!prrn_enabled) {
|
||||
prrn_enabled = 1;
|
||||
@ -1590,6 +1593,9 @@ int stop_topology_update(void)
|
||||
{
|
||||
int rc = 0;
|
||||
|
||||
if (!topology_updates_enabled)
|
||||
return 0;
|
||||
|
||||
if (prrn_enabled) {
|
||||
prrn_enabled = 0;
|
||||
#ifdef CONFIG_SMP
|
||||
@ -1635,11 +1641,13 @@ static ssize_t topology_write(struct file *file, const char __user *buf,
|
||||
|
||||
kbuf[read_len] = '\0';
|
||||
|
||||
if (!strncmp(kbuf, "on", 2))
|
||||
if (!strncmp(kbuf, "on", 2)) {
|
||||
topology_updates_enabled = true;
|
||||
start_topology_update();
|
||||
else if (!strncmp(kbuf, "off", 3))
|
||||
} else if (!strncmp(kbuf, "off", 3)) {
|
||||
stop_topology_update();
|
||||
else
|
||||
topology_updates_enabled = false;
|
||||
} else
|
||||
return -EINVAL;
|
||||
|
||||
return count;
|
||||
@ -1654,8 +1662,6 @@ static const struct file_operations topology_ops = {
|
||||
|
||||
static int topology_update_init(void)
|
||||
{
|
||||
/* Do not poll for changes if disabled at boot */
|
||||
if (topology_updates_enabled)
|
||||
start_topology_update();
|
||||
|
||||
if (!proc_create("powerpc/topology_updates", 0644, NULL, &topology_ops))
|
||||
|
@ -481,6 +481,11 @@ static int nest_imc_event_init(struct perf_event *event)
|
||||
* Get the base memory addresss for this cpu.
|
||||
*/
|
||||
chip_id = cpu_to_chip_id(event->cpu);
|
||||
|
||||
/* Return, if chip_id is not valid */
|
||||
if (chip_id < 0)
|
||||
return -ENODEV;
|
||||
|
||||
pcni = pmu->mem_info;
|
||||
do {
|
||||
if (pcni->id == chip_id) {
|
||||
|
@ -48,7 +48,7 @@ export REALMODE_CFLAGS
|
||||
export BITS
|
||||
|
||||
ifdef CONFIG_X86_NEED_RELOCS
|
||||
LDFLAGS_vmlinux := --emit-relocs
|
||||
LDFLAGS_vmlinux := --emit-relocs --discard-none
|
||||
endif
|
||||
|
||||
#
|
||||
|
@ -416,6 +416,7 @@ CONFIG_STAGING=y
|
||||
CONFIG_ASHMEM=y
|
||||
CONFIG_ANDROID_VSOC=y
|
||||
CONFIG_ION=y
|
||||
CONFIG_ION_SYSTEM_HEAP=y
|
||||
# CONFIG_X86_PLATFORM_DEVICES is not set
|
||||
# CONFIG_IOMMU_SUPPORT is not set
|
||||
CONFIG_ANDROID=y
|
||||
|
@ -853,7 +853,7 @@ ENTRY(switch_to_thread_stack)
|
||||
ret
|
||||
END(switch_to_thread_stack)
|
||||
|
||||
.macro idtentry sym do_sym has_error_code:req paranoid=0 shift_ist=-1
|
||||
.macro idtentry sym do_sym has_error_code:req paranoid=0 shift_ist=-1 create_gap=0
|
||||
ENTRY(\sym)
|
||||
UNWIND_HINT_IRET_REGS offset=\has_error_code*8
|
||||
|
||||
@ -873,6 +873,20 @@ ENTRY(\sym)
|
||||
jnz .Lfrom_usermode_switch_stack_\@
|
||||
.endif
|
||||
|
||||
.if \create_gap == 1
|
||||
/*
|
||||
* If coming from kernel space, create a 6-word gap to allow the
|
||||
* int3 handler to emulate a call instruction.
|
||||
*/
|
||||
testb $3, CS-ORIG_RAX(%rsp)
|
||||
jnz .Lfrom_usermode_no_gap_\@
|
||||
.rept 6
|
||||
pushq 5*8(%rsp)
|
||||
.endr
|
||||
UNWIND_HINT_IRET_REGS offset=8
|
||||
.Lfrom_usermode_no_gap_\@:
|
||||
.endif
|
||||
|
||||
.if \paranoid
|
||||
call paranoid_entry
|
||||
.else
|
||||
@ -1093,7 +1107,7 @@ apicinterrupt3 HYPERVISOR_CALLBACK_VECTOR \
|
||||
#endif /* CONFIG_HYPERV */
|
||||
|
||||
idtentry debug do_debug has_error_code=0 paranoid=1 shift_ist=DEBUG_STACK
|
||||
idtentry int3 do_int3 has_error_code=0
|
||||
idtentry int3 do_int3 has_error_code=0 create_gap=1
|
||||
idtentry stack_segment do_stack_segment has_error_code=1
|
||||
|
||||
#ifdef CONFIG_XEN
|
||||
|
@ -62,9 +62,8 @@
|
||||
} while (0)
|
||||
|
||||
#define RELOAD_SEG(seg) { \
|
||||
unsigned int pre = GET_SEG(seg); \
|
||||
unsigned int pre = (seg) | 3; \
|
||||
unsigned int cur = get_user_seg(seg); \
|
||||
pre |= 3; \
|
||||
if (pre != cur) \
|
||||
set_user_seg(seg, pre); \
|
||||
}
|
||||
@ -73,6 +72,7 @@ static int ia32_restore_sigcontext(struct pt_regs *regs,
|
||||
struct sigcontext_32 __user *sc)
|
||||
{
|
||||
unsigned int tmpflags, err = 0;
|
||||
u16 gs, fs, es, ds;
|
||||
void __user *buf;
|
||||
u32 tmp;
|
||||
|
||||
@ -80,16 +80,10 @@ static int ia32_restore_sigcontext(struct pt_regs *regs,
|
||||
current->restart_block.fn = do_no_restart_syscall;
|
||||
|
||||
get_user_try {
|
||||
/*
|
||||
* Reload fs and gs if they have changed in the signal
|
||||
* handler. This does not handle long fs/gs base changes in
|
||||
* the handler, but does not clobber them at least in the
|
||||
* normal case.
|
||||
*/
|
||||
RELOAD_SEG(gs);
|
||||
RELOAD_SEG(fs);
|
||||
RELOAD_SEG(ds);
|
||||
RELOAD_SEG(es);
|
||||
gs = GET_SEG(gs);
|
||||
fs = GET_SEG(fs);
|
||||
ds = GET_SEG(ds);
|
||||
es = GET_SEG(es);
|
||||
|
||||
COPY(di); COPY(si); COPY(bp); COPY(sp); COPY(bx);
|
||||
COPY(dx); COPY(cx); COPY(ip); COPY(ax);
|
||||
@ -107,6 +101,17 @@ static int ia32_restore_sigcontext(struct pt_regs *regs,
|
||||
buf = compat_ptr(tmp);
|
||||
} get_user_catch(err);
|
||||
|
||||
/*
|
||||
* Reload fs and gs if they have changed in the signal
|
||||
* handler. This does not handle long fs/gs base changes in
|
||||
* the handler, but does not clobber them at least in the
|
||||
* normal case.
|
||||
*/
|
||||
RELOAD_SEG(gs);
|
||||
RELOAD_SEG(fs);
|
||||
RELOAD_SEG(ds);
|
||||
RELOAD_SEG(es);
|
||||
|
||||
err |= fpu__restore_sig(buf, 1);
|
||||
|
||||
force_iret();
|
||||
|
@ -38,4 +38,34 @@ extern void *text_poke(void *addr, const void *opcode, size_t len);
|
||||
extern int poke_int3_handler(struct pt_regs *regs);
|
||||
extern void *text_poke_bp(void *addr, const void *opcode, size_t len, void *handler);
|
||||
|
||||
#ifndef CONFIG_UML_X86
|
||||
static inline void int3_emulate_jmp(struct pt_regs *regs, unsigned long ip)
|
||||
{
|
||||
regs->ip = ip;
|
||||
}
|
||||
|
||||
#define INT3_INSN_SIZE 1
|
||||
#define CALL_INSN_SIZE 5
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
static inline void int3_emulate_push(struct pt_regs *regs, unsigned long val)
|
||||
{
|
||||
/*
|
||||
* The int3 handler in entry_64.S adds a gap between the
|
||||
* stack where the break point happened, and the saving of
|
||||
* pt_regs. We can extend the original stack because of
|
||||
* this gap. See the idtentry macro's create_gap option.
|
||||
*/
|
||||
regs->sp -= sizeof(unsigned long);
|
||||
*(unsigned long *)regs->sp = val;
|
||||
}
|
||||
|
||||
static inline void int3_emulate_call(struct pt_regs *regs, unsigned long func)
|
||||
{
|
||||
int3_emulate_push(regs, regs->ip - INT3_INSN_SIZE + CALL_INSN_SIZE);
|
||||
int3_emulate_jmp(regs, func);
|
||||
}
|
||||
#endif /* CONFIG_X86_64 */
|
||||
#endif /* !CONFIG_UML_X86 */
|
||||
|
||||
#endif /* _ASM_X86_TEXT_PATCHING_H */
|
||||
|
@ -701,19 +701,49 @@ bool machine_check_poll(enum mcp_flags flags, mce_banks_t *b)
|
||||
|
||||
barrier();
|
||||
m.status = mce_rdmsrl(msr_ops.status(i));
|
||||
|
||||
/* If this entry is not valid, ignore it */
|
||||
if (!(m.status & MCI_STATUS_VAL))
|
||||
continue;
|
||||
|
||||
/*
|
||||
* Uncorrected or signalled events are handled by the exception
|
||||
* handler when it is enabled, so don't process those here.
|
||||
*
|
||||
* TBD do the same check for MCI_STATUS_EN here?
|
||||
* If we are logging everything (at CPU online) or this
|
||||
* is a corrected error, then we must log it.
|
||||
*/
|
||||
if ((flags & MCP_UC) || !(m.status & MCI_STATUS_UC))
|
||||
goto log_it;
|
||||
|
||||
/*
|
||||
* Newer Intel systems that support software error
|
||||
* recovery need to make additional checks. Other
|
||||
* CPUs should skip over uncorrected errors, but log
|
||||
* everything else.
|
||||
*/
|
||||
if (!mca_cfg.ser) {
|
||||
if (m.status & MCI_STATUS_UC)
|
||||
continue;
|
||||
goto log_it;
|
||||
}
|
||||
|
||||
/* Log "not enabled" (speculative) errors */
|
||||
if (!(m.status & MCI_STATUS_EN))
|
||||
goto log_it;
|
||||
|
||||
/*
|
||||
* Log UCNA (SDM: 15.6.3 "UCR Error Classification")
|
||||
* UC == 1 && PCC == 0 && S == 0
|
||||
*/
|
||||
if (!(m.status & MCI_STATUS_PCC) && !(m.status & MCI_STATUS_S))
|
||||
goto log_it;
|
||||
|
||||
/*
|
||||
* Skip anything else. Presumption is that our read of this
|
||||
* bank is racing with a machine check. Leave the log alone
|
||||
* for do_machine_check() to deal with it.
|
||||
*/
|
||||
if (!(flags & MCP_UC) &&
|
||||
(m.status & (mca_cfg.ser ? MCI_STATUS_S : MCI_STATUS_UC)))
|
||||
continue;
|
||||
|
||||
log_it:
|
||||
error_seen = true;
|
||||
|
||||
mce_read_aux(&m, i);
|
||||
|
@ -418,9 +418,10 @@ static int do_microcode_update(const void __user *buf, size_t size)
|
||||
if (ustate == UCODE_ERROR) {
|
||||
error = -1;
|
||||
break;
|
||||
} else if (ustate == UCODE_OK)
|
||||
} else if (ustate == UCODE_NEW) {
|
||||
apply_microcode_on_target(cpu);
|
||||
}
|
||||
}
|
||||
|
||||
return error;
|
||||
}
|
||||
|
@ -30,6 +30,7 @@
|
||||
#include <asm/sections.h>
|
||||
#include <asm/ftrace.h>
|
||||
#include <asm/nops.h>
|
||||
#include <asm/text-patching.h>
|
||||
|
||||
#ifdef CONFIG_DYNAMIC_FTRACE
|
||||
|
||||
@ -229,6 +230,7 @@ int ftrace_modify_call(struct dyn_ftrace *rec, unsigned long old_addr,
|
||||
}
|
||||
|
||||
static unsigned long ftrace_update_func;
|
||||
static unsigned long ftrace_update_func_call;
|
||||
|
||||
static int update_ftrace_func(unsigned long ip, void *new)
|
||||
{
|
||||
@ -257,6 +259,8 @@ int ftrace_update_ftrace_func(ftrace_func_t func)
|
||||
unsigned char *new;
|
||||
int ret;
|
||||
|
||||
ftrace_update_func_call = (unsigned long)func;
|
||||
|
||||
new = ftrace_call_replace(ip, (unsigned long)func);
|
||||
ret = update_ftrace_func(ip, new);
|
||||
|
||||
@ -292,13 +296,28 @@ int ftrace_int3_handler(struct pt_regs *regs)
|
||||
if (WARN_ON_ONCE(!regs))
|
||||
return 0;
|
||||
|
||||
ip = regs->ip - 1;
|
||||
if (!ftrace_location(ip) && !is_ftrace_caller(ip))
|
||||
return 0;
|
||||
|
||||
regs->ip += MCOUNT_INSN_SIZE - 1;
|
||||
ip = regs->ip - INT3_INSN_SIZE;
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
if (ftrace_location(ip)) {
|
||||
int3_emulate_call(regs, (unsigned long)ftrace_regs_caller);
|
||||
return 1;
|
||||
} else if (is_ftrace_caller(ip)) {
|
||||
if (!ftrace_update_func_call) {
|
||||
int3_emulate_jmp(regs, ip + CALL_INSN_SIZE);
|
||||
return 1;
|
||||
}
|
||||
int3_emulate_call(regs, ftrace_update_func_call);
|
||||
return 1;
|
||||
}
|
||||
#else
|
||||
if (ftrace_location(ip) || is_ftrace_caller(ip)) {
|
||||
int3_emulate_jmp(regs, ip + CALL_INSN_SIZE);
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ftrace_write(unsigned long ip, const char *val, int size)
|
||||
@ -869,6 +888,8 @@ void arch_ftrace_update_trampoline(struct ftrace_ops *ops)
|
||||
|
||||
func = ftrace_ops_get_func(ops);
|
||||
|
||||
ftrace_update_func_call = (unsigned long)func;
|
||||
|
||||
/* Do a safe modify in case the trampoline is executing */
|
||||
new = ftrace_call_replace(ip, (unsigned long)func);
|
||||
ret = update_ftrace_func(ip, new);
|
||||
@ -965,6 +986,7 @@ static int ftrace_mod_jmp(unsigned long ip, void *func)
|
||||
{
|
||||
unsigned char *new;
|
||||
|
||||
ftrace_update_func_call = 0UL;
|
||||
new = ftrace_jmp_replace(ip, (unsigned long)func);
|
||||
|
||||
return update_ftrace_func(ip, new);
|
||||
|
@ -26,9 +26,18 @@ int sysctl_panic_on_stackoverflow;
|
||||
/*
|
||||
* Probabilistic stack overflow check:
|
||||
*
|
||||
* Only check the stack in process context, because everything else
|
||||
* runs on the big interrupt stacks. Checking reliably is too expensive,
|
||||
* so we just check from interrupts.
|
||||
* Regular device interrupts can enter on the following stacks:
|
||||
*
|
||||
* - User stack
|
||||
*
|
||||
* - Kernel task stack
|
||||
*
|
||||
* - Interrupt stack if a device driver reenables interrupts
|
||||
* which should only happen in really old drivers.
|
||||
*
|
||||
* - Debug IST stack
|
||||
*
|
||||
* All other contexts are invalid.
|
||||
*/
|
||||
static inline void stack_overflow_check(struct pt_regs *regs)
|
||||
{
|
||||
@ -53,8 +62,8 @@ static inline void stack_overflow_check(struct pt_regs *regs)
|
||||
return;
|
||||
|
||||
oist = this_cpu_ptr(&orig_ist);
|
||||
estack_top = (u64)oist->ist[0] - EXCEPTION_STKSZ + STACK_TOP_MARGIN;
|
||||
estack_bottom = (u64)oist->ist[N_EXCEPTION_STACKS - 1];
|
||||
estack_bottom = (u64)oist->ist[DEBUG_STACK];
|
||||
estack_top = estack_bottom - DEBUG_STKSZ + STACK_TOP_MARGIN;
|
||||
if (regs->sp >= estack_top && regs->sp <= estack_bottom)
|
||||
return;
|
||||
|
||||
|
@ -131,16 +131,6 @@ static int restore_sigcontext(struct pt_regs *regs,
|
||||
COPY_SEG_CPL3(cs);
|
||||
COPY_SEG_CPL3(ss);
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
/*
|
||||
* Fix up SS if needed for the benefit of old DOSEMU and
|
||||
* CRIU.
|
||||
*/
|
||||
if (unlikely(!(uc_flags & UC_STRICT_RESTORE_SS) &&
|
||||
user_64bit_mode(regs)))
|
||||
force_valid_ss(regs);
|
||||
#endif
|
||||
|
||||
get_user_ex(tmpflags, &sc->flags);
|
||||
regs->flags = (regs->flags & ~FIX_EFLAGS) | (tmpflags & FIX_EFLAGS);
|
||||
regs->orig_ax = -1; /* disable syscall checks */
|
||||
@ -149,6 +139,15 @@ static int restore_sigcontext(struct pt_regs *regs,
|
||||
buf = (void __user *)buf_val;
|
||||
} get_user_catch(err);
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
/*
|
||||
* Fix up SS if needed for the benefit of old DOSEMU and
|
||||
* CRIU.
|
||||
*/
|
||||
if (unlikely(!(uc_flags & UC_STRICT_RESTORE_SS) && user_64bit_mode(regs)))
|
||||
force_valid_ss(regs);
|
||||
#endif
|
||||
|
||||
err |= fpu__restore_sig(buf, IS_ENABLED(CONFIG_X86_32));
|
||||
|
||||
force_iret();
|
||||
@ -460,6 +459,7 @@ static int __setup_rt_frame(int sig, struct ksignal *ksig,
|
||||
{
|
||||
struct rt_sigframe __user *frame;
|
||||
void __user *fp = NULL;
|
||||
unsigned long uc_flags;
|
||||
int err = 0;
|
||||
|
||||
frame = get_sigframe(&ksig->ka, regs, sizeof(struct rt_sigframe), &fp);
|
||||
@ -472,9 +472,11 @@ static int __setup_rt_frame(int sig, struct ksignal *ksig,
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
uc_flags = frame_uc_flags(regs);
|
||||
|
||||
put_user_try {
|
||||
/* Create the ucontext. */
|
||||
put_user_ex(frame_uc_flags(regs), &frame->uc.uc_flags);
|
||||
put_user_ex(uc_flags, &frame->uc.uc_flags);
|
||||
put_user_ex(0, &frame->uc.uc_link);
|
||||
save_altstack_ex(&frame->uc.uc_stack, regs->sp);
|
||||
|
||||
@ -540,6 +542,7 @@ static int x32_setup_rt_frame(struct ksignal *ksig,
|
||||
{
|
||||
#ifdef CONFIG_X86_X32_ABI
|
||||
struct rt_sigframe_x32 __user *frame;
|
||||
unsigned long uc_flags;
|
||||
void __user *restorer;
|
||||
int err = 0;
|
||||
void __user *fpstate = NULL;
|
||||
@ -554,9 +557,11 @@ static int x32_setup_rt_frame(struct ksignal *ksig,
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
uc_flags = frame_uc_flags(regs);
|
||||
|
||||
put_user_try {
|
||||
/* Create the ucontext. */
|
||||
put_user_ex(frame_uc_flags(regs), &frame->uc.uc_flags);
|
||||
put_user_ex(uc_flags, &frame->uc.uc_flags);
|
||||
put_user_ex(0, &frame->uc.uc_link);
|
||||
compat_save_altstack_ex(&frame->uc.uc_stack, regs->sp);
|
||||
put_user_ex(0, &frame->uc.uc__pad0);
|
||||
|
@ -131,10 +131,10 @@ SECTIONS
|
||||
*(.text.__x86.indirect_thunk)
|
||||
__indirect_thunk_end = .;
|
||||
#endif
|
||||
} :text = 0x9090
|
||||
|
||||
/* End of text section */
|
||||
_etext = .;
|
||||
} :text = 0x9090
|
||||
|
||||
NOTES :text :note
|
||||
|
||||
|
@ -1567,7 +1567,11 @@ static void avic_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
|
||||
if (!kvm_vcpu_apicv_active(vcpu))
|
||||
return;
|
||||
|
||||
if (WARN_ON(h_physical_id >= AVIC_MAX_PHYSICAL_ID_COUNT))
|
||||
/*
|
||||
* Since the host physical APIC id is 8 bits,
|
||||
* we can support host APIC ID upto 255.
|
||||
*/
|
||||
if (WARN_ON(h_physical_id > AVIC_PHYSICAL_ID_ENTRY_HOST_PHYSICAL_ID_MASK))
|
||||
return;
|
||||
|
||||
entry = READ_ONCE(*(svm->avic_physical_id_cache));
|
||||
|
@ -1133,7 +1133,7 @@ static int set_efer(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
|
||||
u64 efer = msr_info->data;
|
||||
|
||||
if (efer & efer_reserved_bits)
|
||||
return false;
|
||||
return 1;
|
||||
|
||||
if (!msr_info->host_initiated) {
|
||||
if (!__kvm_valid_efer(vcpu, efer))
|
||||
|
@ -6,6 +6,18 @@
|
||||
# Produces uninteresting flaky coverage.
|
||||
KCOV_INSTRUMENT_delay.o := n
|
||||
|
||||
# Early boot use of cmdline; don't instrument it
|
||||
ifdef CONFIG_AMD_MEM_ENCRYPT
|
||||
KCOV_INSTRUMENT_cmdline.o := n
|
||||
KASAN_SANITIZE_cmdline.o := n
|
||||
|
||||
ifdef CONFIG_FUNCTION_TRACER
|
||||
CFLAGS_REMOVE_cmdline.o = -pg
|
||||
endif
|
||||
|
||||
CFLAGS_cmdline.o := $(call cc-option, -fno-stack-protector)
|
||||
endif
|
||||
|
||||
inat_tables_script = $(srctree)/arch/x86/tools/gen-insn-attr-x86.awk
|
||||
inat_tables_maps = $(srctree)/arch/x86/lib/x86-opcode-map.txt
|
||||
quiet_cmd_inat_tables = GEN $@
|
||||
|
@ -426,8 +426,6 @@ static noinline int vmalloc_fault(unsigned long address)
|
||||
if (!(address >= VMALLOC_START && address < VMALLOC_END))
|
||||
return -1;
|
||||
|
||||
WARN_ON_ONCE(in_nmi());
|
||||
|
||||
/*
|
||||
* Copy kernel mappings over when needed. This can also
|
||||
* happen within a race in page table update. In the later
|
||||
|
@ -2078,13 +2078,16 @@ static int opal_erase_locking_range(struct opal_dev *dev,
|
||||
static int opal_enable_disable_shadow_mbr(struct opal_dev *dev,
|
||||
struct opal_mbr_data *opal_mbr)
|
||||
{
|
||||
u8 enable_disable = opal_mbr->enable_disable == OPAL_MBR_ENABLE ?
|
||||
OPAL_TRUE : OPAL_FALSE;
|
||||
|
||||
const struct opal_step mbr_steps[] = {
|
||||
{ opal_discovery0, },
|
||||
{ start_admin1LSP_opal_session, &opal_mbr->key },
|
||||
{ set_mbr_done, &opal_mbr->enable_disable },
|
||||
{ set_mbr_done, &enable_disable },
|
||||
{ end_opal_session, },
|
||||
{ start_admin1LSP_opal_session, &opal_mbr->key },
|
||||
{ set_mbr_enable_disable, &opal_mbr->enable_disable },
|
||||
{ set_mbr_enable_disable, &enable_disable },
|
||||
{ end_opal_session, },
|
||||
{ NULL, }
|
||||
};
|
||||
@ -2204,7 +2207,7 @@ static int __opal_lock_unlock(struct opal_dev *dev,
|
||||
|
||||
static int __opal_set_mbr_done(struct opal_dev *dev, struct opal_key *key)
|
||||
{
|
||||
u8 mbr_done_tf = 1;
|
||||
u8 mbr_done_tf = OPAL_TRUE;
|
||||
const struct opal_step mbrdone_step [] = {
|
||||
{ opal_discovery0, },
|
||||
{ start_admin1LSP_opal_session, key },
|
||||
|
@ -943,6 +943,14 @@ struct fwnode_handle *acpi_get_next_subnode(const struct fwnode_handle *fwnode,
|
||||
const struct acpi_data_node *data = to_acpi_data_node(fwnode);
|
||||
struct acpi_data_node *dn;
|
||||
|
||||
/*
|
||||
* We can have a combination of device and data nodes, e.g. with
|
||||
* hierarchical _DSD properties. Make sure the adev pointer is
|
||||
* restored before going through data nodes, otherwise we will
|
||||
* be looking for data_nodes below the last device found instead
|
||||
* of the common fwnode shared by device_nodes and data_nodes.
|
||||
*/
|
||||
adev = to_acpi_device_node(fwnode);
|
||||
if (adev)
|
||||
head = &adev->data.subnodes;
|
||||
else if (data)
|
||||
|
@ -408,7 +408,7 @@ re_probe:
|
||||
|
||||
ret = dma_configure(dev);
|
||||
if (ret)
|
||||
goto dma_failed;
|
||||
goto probe_failed;
|
||||
|
||||
if (driver_sysfs_add(dev)) {
|
||||
printk(KERN_ERR "%s: driver_sysfs_add(%s) failed\n",
|
||||
@ -463,14 +463,13 @@ re_probe:
|
||||
goto done;
|
||||
|
||||
probe_failed:
|
||||
dma_deconfigure(dev);
|
||||
dma_failed:
|
||||
if (dev->bus)
|
||||
blocking_notifier_call_chain(&dev->bus->p->bus_notifier,
|
||||
BUS_NOTIFY_DRIVER_NOT_BOUND, dev);
|
||||
pinctrl_bind_failed:
|
||||
device_links_no_driver(dev);
|
||||
devres_release_all(dev);
|
||||
dma_deconfigure(dev);
|
||||
driver_sysfs_remove(dev);
|
||||
dev->driver = NULL;
|
||||
dev_set_drvdata(dev, NULL);
|
||||
|
@ -1490,6 +1490,10 @@ static int __device_suspend(struct device *dev, pm_message_t state, bool async)
|
||||
if (dev->power.syscore)
|
||||
goto Complete;
|
||||
|
||||
/* Avoid direct_complete to let wakeup_path propagate. */
|
||||
if (device_may_wakeup(dev) || dev->power.wakeup_path)
|
||||
dev->power.direct_complete = false;
|
||||
|
||||
if (dev->power.direct_complete) {
|
||||
if (pm_runtime_status_suspended(dev)) {
|
||||
pm_runtime_disable(dev);
|
||||
|
@ -442,6 +442,7 @@ static int omap_rng_probe(struct platform_device *pdev)
|
||||
priv->rng.read = omap_rng_do_read;
|
||||
priv->rng.init = omap_rng_init;
|
||||
priv->rng.cleanup = omap_rng_cleanup;
|
||||
priv->rng.quality = 900;
|
||||
|
||||
priv->rng.priv = (unsigned long)priv;
|
||||
platform_set_drvdata(pdev, priv);
|
||||
|
@ -2187,8 +2187,8 @@ struct batched_entropy {
|
||||
u32 entropy_u32[CHACHA_BLOCK_SIZE / sizeof(u32)];
|
||||
};
|
||||
unsigned int position;
|
||||
spinlock_t batch_lock;
|
||||
};
|
||||
static rwlock_t batched_entropy_reset_lock = __RW_LOCK_UNLOCKED(batched_entropy_reset_lock);
|
||||
|
||||
/*
|
||||
* Get a random word for internal kernel use only. The quality of the random
|
||||
@ -2198,12 +2198,14 @@ static rwlock_t batched_entropy_reset_lock = __RW_LOCK_UNLOCKED(batched_entropy_
|
||||
* wait_for_random_bytes() should be called and return 0 at least once
|
||||
* at any point prior.
|
||||
*/
|
||||
static DEFINE_PER_CPU(struct batched_entropy, batched_entropy_u64);
|
||||
static DEFINE_PER_CPU(struct batched_entropy, batched_entropy_u64) = {
|
||||
.batch_lock = __SPIN_LOCK_UNLOCKED(batched_entropy_u64.lock),
|
||||
};
|
||||
|
||||
u64 get_random_u64(void)
|
||||
{
|
||||
u64 ret;
|
||||
bool use_lock;
|
||||
unsigned long flags = 0;
|
||||
unsigned long flags;
|
||||
struct batched_entropy *batch;
|
||||
static void *previous;
|
||||
|
||||
@ -2218,28 +2220,25 @@ u64 get_random_u64(void)
|
||||
|
||||
warn_unseeded_randomness(&previous);
|
||||
|
||||
use_lock = READ_ONCE(crng_init) < 2;
|
||||
batch = &get_cpu_var(batched_entropy_u64);
|
||||
if (use_lock)
|
||||
read_lock_irqsave(&batched_entropy_reset_lock, flags);
|
||||
batch = raw_cpu_ptr(&batched_entropy_u64);
|
||||
spin_lock_irqsave(&batch->batch_lock, flags);
|
||||
if (batch->position % ARRAY_SIZE(batch->entropy_u64) == 0) {
|
||||
extract_crng((u8 *)batch->entropy_u64);
|
||||
batch->position = 0;
|
||||
}
|
||||
ret = batch->entropy_u64[batch->position++];
|
||||
if (use_lock)
|
||||
read_unlock_irqrestore(&batched_entropy_reset_lock, flags);
|
||||
put_cpu_var(batched_entropy_u64);
|
||||
spin_unlock_irqrestore(&batch->batch_lock, flags);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(get_random_u64);
|
||||
|
||||
static DEFINE_PER_CPU(struct batched_entropy, batched_entropy_u32);
|
||||
static DEFINE_PER_CPU(struct batched_entropy, batched_entropy_u32) = {
|
||||
.batch_lock = __SPIN_LOCK_UNLOCKED(batched_entropy_u32.lock),
|
||||
};
|
||||
u32 get_random_u32(void)
|
||||
{
|
||||
u32 ret;
|
||||
bool use_lock;
|
||||
unsigned long flags = 0;
|
||||
unsigned long flags;
|
||||
struct batched_entropy *batch;
|
||||
static void *previous;
|
||||
|
||||
@ -2248,18 +2247,14 @@ u32 get_random_u32(void)
|
||||
|
||||
warn_unseeded_randomness(&previous);
|
||||
|
||||
use_lock = READ_ONCE(crng_init) < 2;
|
||||
batch = &get_cpu_var(batched_entropy_u32);
|
||||
if (use_lock)
|
||||
read_lock_irqsave(&batched_entropy_reset_lock, flags);
|
||||
batch = raw_cpu_ptr(&batched_entropy_u32);
|
||||
spin_lock_irqsave(&batch->batch_lock, flags);
|
||||
if (batch->position % ARRAY_SIZE(batch->entropy_u32) == 0) {
|
||||
extract_crng((u8 *)batch->entropy_u32);
|
||||
batch->position = 0;
|
||||
}
|
||||
ret = batch->entropy_u32[batch->position++];
|
||||
if (use_lock)
|
||||
read_unlock_irqrestore(&batched_entropy_reset_lock, flags);
|
||||
put_cpu_var(batched_entropy_u32);
|
||||
spin_unlock_irqrestore(&batch->batch_lock, flags);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(get_random_u32);
|
||||
@ -2273,12 +2268,19 @@ static void invalidate_batched_entropy(void)
|
||||
int cpu;
|
||||
unsigned long flags;
|
||||
|
||||
write_lock_irqsave(&batched_entropy_reset_lock, flags);
|
||||
for_each_possible_cpu (cpu) {
|
||||
per_cpu_ptr(&batched_entropy_u32, cpu)->position = 0;
|
||||
per_cpu_ptr(&batched_entropy_u64, cpu)->position = 0;
|
||||
struct batched_entropy *batched_entropy;
|
||||
|
||||
batched_entropy = per_cpu_ptr(&batched_entropy_u32, cpu);
|
||||
spin_lock_irqsave(&batched_entropy->batch_lock, flags);
|
||||
batched_entropy->position = 0;
|
||||
spin_unlock(&batched_entropy->batch_lock);
|
||||
|
||||
batched_entropy = per_cpu_ptr(&batched_entropy_u64, cpu);
|
||||
spin_lock(&batched_entropy->batch_lock);
|
||||
batched_entropy->position = 0;
|
||||
spin_unlock_irqrestore(&batched_entropy->batch_lock, flags);
|
||||
}
|
||||
write_unlock_irqrestore(&batched_entropy_reset_lock, flags);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -75,7 +75,7 @@ struct ports_driver_data {
|
||||
/* All the console devices handled by this driver */
|
||||
struct list_head consoles;
|
||||
};
|
||||
static struct ports_driver_data pdrvdata;
|
||||
static struct ports_driver_data pdrvdata = { .next_vtermno = 1};
|
||||
|
||||
static DEFINE_SPINLOCK(pdrvdata_lock);
|
||||
static DECLARE_COMPLETION(early_console_added);
|
||||
@ -1422,6 +1422,7 @@ static int add_port(struct ports_device *portdev, u32 id)
|
||||
port->async_queue = NULL;
|
||||
|
||||
port->cons.ws.ws_row = port->cons.ws.ws_col = 0;
|
||||
port->cons.vtermno = 0;
|
||||
|
||||
port->host_connected = port->guest_connected = false;
|
||||
port->stats = (struct port_stats) { 0 };
|
||||
|
@ -163,8 +163,12 @@ static const struct hisi_gate_clock hi3660_crgctrl_gate_sep_clks[] = {
|
||||
"clk_isp_snclk_mux", CLK_SET_RATE_PARENT, 0x50, 17, 0, },
|
||||
{ HI3660_CLK_GATE_ISP_SNCLK2, "clk_gate_isp_snclk2",
|
||||
"clk_isp_snclk_mux", CLK_SET_RATE_PARENT, 0x50, 18, 0, },
|
||||
/*
|
||||
* clk_gate_ufs_subsys is a system bus clock, mark it as critical
|
||||
* clock and keep it on for system suspend and resume.
|
||||
*/
|
||||
{ HI3660_CLK_GATE_UFS_SUBSYS, "clk_gate_ufs_subsys", "clk_div_sysbus",
|
||||
CLK_SET_RATE_PARENT, 0x50, 21, 0, },
|
||||
CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0x50, 21, 0, },
|
||||
{ HI3660_PCLK_GATE_DSI0, "pclk_gate_dsi0", "clk_div_cfgbus",
|
||||
CLK_SET_RATE_PARENT, 0x50, 28, 0, },
|
||||
{ HI3660_PCLK_GATE_DSI1, "pclk_gate_dsi1", "clk_div_cfgbus",
|
||||
|
@ -198,7 +198,7 @@ PNAME(mux_hsadcout_p) = { "hsadc_src", "ext_hsadc" };
|
||||
PNAME(mux_edp_24m_p) = { "ext_edp_24m", "xin24m" };
|
||||
PNAME(mux_tspout_p) = { "cpll", "gpll", "npll", "xin27m" };
|
||||
|
||||
PNAME(mux_aclk_vcodec_pre_p) = { "aclk_vepu", "aclk_vdpu" };
|
||||
PNAME(mux_aclk_vcodec_pre_p) = { "aclk_vdpu", "aclk_vepu" };
|
||||
PNAME(mux_usbphy480m_p) = { "sclk_otgphy1_480m", "sclk_otgphy2_480m",
|
||||
"sclk_otgphy0_480m" };
|
||||
PNAME(mux_hsicphy480m_p) = { "cpll", "gpll", "usbphy480m_src" };
|
||||
@ -292,13 +292,13 @@ static struct rockchip_clk_branch rk3288_clk_branches[] __initdata = {
|
||||
COMPOSITE_NOMUX(0, "aclk_core_mp", "armclk", CLK_IGNORE_UNUSED,
|
||||
RK3288_CLKSEL_CON(0), 4, 4, DFLAGS | CLK_DIVIDER_READ_ONLY,
|
||||
RK3288_CLKGATE_CON(12), 6, GFLAGS),
|
||||
COMPOSITE_NOMUX(0, "atclk", "armclk", CLK_IGNORE_UNUSED,
|
||||
COMPOSITE_NOMUX(0, "atclk", "armclk", 0,
|
||||
RK3288_CLKSEL_CON(37), 4, 5, DFLAGS | CLK_DIVIDER_READ_ONLY,
|
||||
RK3288_CLKGATE_CON(12), 7, GFLAGS),
|
||||
COMPOSITE_NOMUX(0, "pclk_dbg_pre", "armclk", CLK_IGNORE_UNUSED,
|
||||
RK3288_CLKSEL_CON(37), 9, 5, DFLAGS | CLK_DIVIDER_READ_ONLY,
|
||||
RK3288_CLKGATE_CON(12), 8, GFLAGS),
|
||||
GATE(0, "pclk_dbg", "pclk_dbg_pre", CLK_IGNORE_UNUSED,
|
||||
GATE(0, "pclk_dbg", "pclk_dbg_pre", 0,
|
||||
RK3288_CLKGATE_CON(12), 9, GFLAGS),
|
||||
GATE(0, "cs_dbg", "pclk_dbg_pre", CLK_IGNORE_UNUSED,
|
||||
RK3288_CLKGATE_CON(12), 10, GFLAGS),
|
||||
@ -399,7 +399,7 @@ static struct rockchip_clk_branch rk3288_clk_branches[] __initdata = {
|
||||
COMPOSITE(0, "aclk_vdpu", mux_pll_src_cpll_gpll_usb480m_p, 0,
|
||||
RK3288_CLKSEL_CON(32), 14, 2, MFLAGS, 8, 5, DFLAGS,
|
||||
RK3288_CLKGATE_CON(3), 11, GFLAGS),
|
||||
MUXGRF(0, "aclk_vcodec_pre", mux_aclk_vcodec_pre_p, 0,
|
||||
MUXGRF(0, "aclk_vcodec_pre", mux_aclk_vcodec_pre_p, CLK_SET_RATE_PARENT,
|
||||
RK3288_GRF_SOC_CON(0), 7, 1, MFLAGS),
|
||||
GATE(ACLK_VCODEC, "aclk_vcodec", "aclk_vcodec_pre", 0,
|
||||
RK3288_CLKGATE_CON(9), 0, GFLAGS),
|
||||
@ -626,7 +626,7 @@ static struct rockchip_clk_branch rk3288_clk_branches[] __initdata = {
|
||||
INVERTER(SCLK_HSADC, "sclk_hsadc", "sclk_hsadc_out",
|
||||
RK3288_CLKSEL_CON(22), 7, IFLAGS),
|
||||
|
||||
GATE(0, "jtag", "ext_jtag", CLK_IGNORE_UNUSED,
|
||||
GATE(0, "jtag", "ext_jtag", 0,
|
||||
RK3288_CLKGATE_CON(4), 14, GFLAGS),
|
||||
|
||||
COMPOSITE_NODIV(SCLK_USBPHY480M_SRC, "usbphy480m_src", mux_usbphy480m_p, 0,
|
||||
@ -635,7 +635,7 @@ static struct rockchip_clk_branch rk3288_clk_branches[] __initdata = {
|
||||
COMPOSITE_NODIV(SCLK_HSICPHY480M, "sclk_hsicphy480m", mux_hsicphy480m_p, 0,
|
||||
RK3288_CLKSEL_CON(29), 0, 2, MFLAGS,
|
||||
RK3288_CLKGATE_CON(3), 6, GFLAGS),
|
||||
GATE(0, "hsicphy12m_xin12m", "xin12m", CLK_IGNORE_UNUSED,
|
||||
GATE(0, "hsicphy12m_xin12m", "xin12m", 0,
|
||||
RK3288_CLKGATE_CON(13), 9, GFLAGS),
|
||||
DIV(0, "hsicphy12m_usbphy", "sclk_hsicphy480m", 0,
|
||||
RK3288_CLKSEL_CON(11), 8, 6, DFLAGS),
|
||||
@ -676,7 +676,7 @@ static struct rockchip_clk_branch rk3288_clk_branches[] __initdata = {
|
||||
GATE(PCLK_TZPC, "pclk_tzpc", "pclk_cpu", 0, RK3288_CLKGATE_CON(11), 3, GFLAGS),
|
||||
GATE(PCLK_UART2, "pclk_uart2", "pclk_cpu", 0, RK3288_CLKGATE_CON(11), 9, GFLAGS),
|
||||
GATE(PCLK_EFUSE256, "pclk_efuse_256", "pclk_cpu", 0, RK3288_CLKGATE_CON(11), 10, GFLAGS),
|
||||
GATE(PCLK_RKPWM, "pclk_rkpwm", "pclk_cpu", CLK_IGNORE_UNUSED, RK3288_CLKGATE_CON(11), 11, GFLAGS),
|
||||
GATE(PCLK_RKPWM, "pclk_rkpwm", "pclk_cpu", 0, RK3288_CLKGATE_CON(11), 11, GFLAGS),
|
||||
|
||||
/* ddrctrl [DDR Controller PHY clock] gates */
|
||||
GATE(0, "nclk_ddrupctl0", "ddrphy", CLK_IGNORE_UNUSED, RK3288_CLKGATE_CON(11), 4, GFLAGS),
|
||||
@ -816,12 +816,9 @@ static const char *const rk3288_critical_clocks[] __initconst = {
|
||||
"pclk_alive_niu",
|
||||
"pclk_pd_pmu",
|
||||
"pclk_pmu_niu",
|
||||
"pclk_core_niu",
|
||||
"pclk_ddrupctl0",
|
||||
"pclk_publ0",
|
||||
"pclk_ddrupctl1",
|
||||
"pclk_publ1",
|
||||
"pmu_hclk_otg0",
|
||||
/* pwm-regulators on some boards, so handoff-critical later */
|
||||
"pclk_rkpwm",
|
||||
};
|
||||
|
||||
static void __iomem *rk3288_cru_base;
|
||||
|
@ -458,7 +458,7 @@ static struct rockchip_clk_branch rk3328_clk_branches[] __initdata = {
|
||||
RK3328_CLKSEL_CON(35), 15, 1, MFLAGS, 8, 7, DFLAGS,
|
||||
RK3328_CLKGATE_CON(2), 12, GFLAGS),
|
||||
COMPOSITE(SCLK_CRYPTO, "clk_crypto", mux_2plls_p, 0,
|
||||
RK3328_CLKSEL_CON(20), 7, 1, MFLAGS, 0, 7, DFLAGS,
|
||||
RK3328_CLKSEL_CON(20), 7, 1, MFLAGS, 0, 5, DFLAGS,
|
||||
RK3328_CLKGATE_CON(2), 4, GFLAGS),
|
||||
COMPOSITE_NOMUX(SCLK_TSADC, "clk_tsadc", "clk_24m", 0,
|
||||
RK3328_CLKSEL_CON(22), 0, 10, DFLAGS,
|
||||
@ -550,15 +550,15 @@ static struct rockchip_clk_branch rk3328_clk_branches[] __initdata = {
|
||||
GATE(0, "hclk_rkvenc_niu", "hclk_rkvenc", CLK_IGNORE_UNUSED,
|
||||
RK3328_CLKGATE_CON(25), 1, GFLAGS),
|
||||
GATE(ACLK_H265, "aclk_h265", "aclk_rkvenc", 0,
|
||||
RK3328_CLKGATE_CON(25), 0, GFLAGS),
|
||||
RK3328_CLKGATE_CON(25), 2, GFLAGS),
|
||||
GATE(PCLK_H265, "pclk_h265", "hclk_rkvenc", 0,
|
||||
RK3328_CLKGATE_CON(25), 1, GFLAGS),
|
||||
RK3328_CLKGATE_CON(25), 3, GFLAGS),
|
||||
GATE(ACLK_H264, "aclk_h264", "aclk_rkvenc", 0,
|
||||
RK3328_CLKGATE_CON(25), 0, GFLAGS),
|
||||
RK3328_CLKGATE_CON(25), 4, GFLAGS),
|
||||
GATE(HCLK_H264, "hclk_h264", "hclk_rkvenc", 0,
|
||||
RK3328_CLKGATE_CON(25), 1, GFLAGS),
|
||||
RK3328_CLKGATE_CON(25), 5, GFLAGS),
|
||||
GATE(ACLK_AXISRAM, "aclk_axisram", "aclk_rkvenc", CLK_IGNORE_UNUSED,
|
||||
RK3328_CLKGATE_CON(25), 0, GFLAGS),
|
||||
RK3328_CLKGATE_CON(25), 6, GFLAGS),
|
||||
|
||||
COMPOSITE(SCLK_VENC_CORE, "sclk_venc_core", mux_4plls_p, 0,
|
||||
RK3328_CLKSEL_CON(51), 14, 2, MFLAGS, 8, 5, DFLAGS,
|
||||
@ -663,7 +663,7 @@ static struct rockchip_clk_branch rk3328_clk_branches[] __initdata = {
|
||||
|
||||
/* PD_GMAC */
|
||||
COMPOSITE(ACLK_GMAC, "aclk_gmac", mux_2plls_hdmiphy_p, 0,
|
||||
RK3328_CLKSEL_CON(35), 6, 2, MFLAGS, 0, 5, DFLAGS,
|
||||
RK3328_CLKSEL_CON(25), 6, 2, MFLAGS, 0, 5, DFLAGS,
|
||||
RK3328_CLKGATE_CON(3), 2, GFLAGS),
|
||||
COMPOSITE_NOMUX(PCLK_GMAC, "pclk_gmac", "aclk_gmac", 0,
|
||||
RK3328_CLKSEL_CON(25), 8, 3, DFLAGS,
|
||||
@ -733,7 +733,7 @@ static struct rockchip_clk_branch rk3328_clk_branches[] __initdata = {
|
||||
|
||||
/* PD_PERI */
|
||||
GATE(0, "aclk_peri_noc", "aclk_peri", CLK_IGNORE_UNUSED, RK3328_CLKGATE_CON(19), 11, GFLAGS),
|
||||
GATE(ACLK_USB3OTG, "aclk_usb3otg", "aclk_peri", 0, RK3328_CLKGATE_CON(19), 4, GFLAGS),
|
||||
GATE(ACLK_USB3OTG, "aclk_usb3otg", "aclk_peri", 0, RK3328_CLKGATE_CON(19), 14, GFLAGS),
|
||||
|
||||
GATE(HCLK_SDMMC, "hclk_sdmmc", "hclk_peri", 0, RK3328_CLKGATE_CON(19), 0, GFLAGS),
|
||||
GATE(HCLK_SDIO, "hclk_sdio", "hclk_peri", 0, RK3328_CLKGATE_CON(19), 1, GFLAGS),
|
||||
@ -894,7 +894,7 @@ static void __init rk3328_clk_init(struct device_node *np)
|
||||
&rk3328_cpuclk_data, rk3328_cpuclk_rates,
|
||||
ARRAY_SIZE(rk3328_cpuclk_rates));
|
||||
|
||||
rockchip_register_softrst(np, 11, reg_base + RK3328_SOFTRST_CON(0),
|
||||
rockchip_register_softrst(np, 12, reg_base + RK3328_SOFTRST_CON(0),
|
||||
ROCKCHIP_SOFTRST_HIWORD_MASK);
|
||||
|
||||
rockchip_register_restart_notifier(ctx, RK3328_GLB_SRST_FST, NULL);
|
||||
|
@ -662,8 +662,8 @@ static void _update_pll_mnp(struct tegra_clk_pll *pll,
|
||||
pll_override_writel(val, params->pmc_divp_reg, pll);
|
||||
|
||||
val = pll_override_readl(params->pmc_divnm_reg, pll);
|
||||
val &= ~(divm_mask(pll) << div_nmp->override_divm_shift) |
|
||||
~(divn_mask(pll) << div_nmp->override_divn_shift);
|
||||
val &= ~((divm_mask(pll) << div_nmp->override_divm_shift) |
|
||||
(divn_mask(pll) << div_nmp->override_divn_shift));
|
||||
val |= (cfg->m << div_nmp->override_divm_shift) |
|
||||
(cfg->n << div_nmp->override_divn_shift);
|
||||
pll_override_writel(val, params->pmc_divnm_reg, pll);
|
||||
|
@ -1139,6 +1139,7 @@ static struct cpufreq_policy *cpufreq_policy_alloc(unsigned int cpu)
|
||||
cpufreq_global_kobject, "policy%u", cpu);
|
||||
if (ret) {
|
||||
pr_err("%s: failed to init policy->kobj: %d\n", __func__, ret);
|
||||
kobject_put(&policy->kobj);
|
||||
goto err_free_real_cpus;
|
||||
}
|
||||
|
||||
|
@ -459,6 +459,8 @@ int cpufreq_dbs_governor_init(struct cpufreq_policy *policy)
|
||||
/* Failure, so roll back. */
|
||||
pr_err("initialization failed (dbs_data kobject init error %d)\n", ret);
|
||||
|
||||
kobject_put(&dbs_data->attr_set.kobj);
|
||||
|
||||
policy->governor_data = NULL;
|
||||
|
||||
if (!have_governor_per_policy())
|
||||
|
@ -124,13 +124,14 @@ static int kirkwood_cpufreq_probe(struct platform_device *pdev)
|
||||
priv.cpu_clk = of_clk_get_by_name(np, "cpu_clk");
|
||||
if (IS_ERR(priv.cpu_clk)) {
|
||||
dev_err(priv.dev, "Unable to get cpuclk\n");
|
||||
return PTR_ERR(priv.cpu_clk);
|
||||
err = PTR_ERR(priv.cpu_clk);
|
||||
goto out_node;
|
||||
}
|
||||
|
||||
err = clk_prepare_enable(priv.cpu_clk);
|
||||
if (err) {
|
||||
dev_err(priv.dev, "Unable to prepare cpuclk\n");
|
||||
return err;
|
||||
goto out_node;
|
||||
}
|
||||
|
||||
kirkwood_freq_table[0].frequency = clk_get_rate(priv.cpu_clk) / 1000;
|
||||
@ -161,20 +162,22 @@ static int kirkwood_cpufreq_probe(struct platform_device *pdev)
|
||||
goto out_ddr;
|
||||
}
|
||||
|
||||
of_node_put(np);
|
||||
np = NULL;
|
||||
|
||||
err = cpufreq_register_driver(&kirkwood_cpufreq_driver);
|
||||
if (!err)
|
||||
if (err) {
|
||||
dev_err(priv.dev, "Failed to register cpufreq driver\n");
|
||||
goto out_powersave;
|
||||
}
|
||||
|
||||
of_node_put(np);
|
||||
return 0;
|
||||
|
||||
dev_err(priv.dev, "Failed to register cpufreq driver\n");
|
||||
|
||||
out_powersave:
|
||||
clk_disable_unprepare(priv.powersave_clk);
|
||||
out_ddr:
|
||||
clk_disable_unprepare(priv.ddr_clk);
|
||||
out_cpu:
|
||||
clk_disable_unprepare(priv.cpu_clk);
|
||||
out_node:
|
||||
of_node_put(np);
|
||||
|
||||
return err;
|
||||
|
@ -146,6 +146,7 @@ static int pas_cpufreq_cpu_init(struct cpufreq_policy *policy)
|
||||
|
||||
cpu = of_get_cpu_node(policy->cpu, NULL);
|
||||
|
||||
of_node_put(cpu);
|
||||
if (!cpu)
|
||||
goto out;
|
||||
|
||||
|
@ -552,6 +552,7 @@ static int pmac_cpufreq_init_7447A(struct device_node *cpunode)
|
||||
volt_gpio_np = of_find_node_by_name(NULL, "cpu-vcore-select");
|
||||
if (volt_gpio_np)
|
||||
voltage_gpio = read_gpio(volt_gpio_np);
|
||||
of_node_put(volt_gpio_np);
|
||||
if (!voltage_gpio){
|
||||
pr_err("missing cpu-vcore-select gpio\n");
|
||||
return 1;
|
||||
@ -588,6 +589,7 @@ static int pmac_cpufreq_init_750FX(struct device_node *cpunode)
|
||||
if (volt_gpio_np)
|
||||
voltage_gpio = read_gpio(volt_gpio_np);
|
||||
|
||||
of_node_put(volt_gpio_np);
|
||||
pvr = mfspr(SPRN_PVR);
|
||||
has_cpu_l2lve = !((pvr & 0xf00) == 0x100);
|
||||
|
||||
|
@ -86,6 +86,7 @@ static int cbe_cpufreq_cpu_init(struct cpufreq_policy *policy)
|
||||
if (!cbe_get_cpu_pmd_regs(policy->cpu) ||
|
||||
!cbe_get_cpu_mic_tm_regs(policy->cpu)) {
|
||||
pr_info("invalid CBE regs pointers for cpufreq\n");
|
||||
of_node_put(cpu);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
@ -240,6 +240,9 @@ static int sun4i_hash(struct ahash_request *areq)
|
||||
}
|
||||
} else {
|
||||
/* Since we have the flag final, we can go up to modulo 4 */
|
||||
if (areq->nbytes < 4)
|
||||
end = 0;
|
||||
else
|
||||
end = ((areq->nbytes + op->len) / 4) * 4 - op->len;
|
||||
}
|
||||
|
||||
|
@ -1318,7 +1318,7 @@ Loop_ctr32_enc:
|
||||
addi $idx,$idx,16
|
||||
bdnz Loop_ctr32_enc
|
||||
|
||||
vadduwm $ivec,$ivec,$one
|
||||
vadduqm $ivec,$ivec,$one
|
||||
vmr $dat,$inptail
|
||||
lvx $inptail,0,$inp
|
||||
addi $inp,$inp,16
|
||||
|
@ -1606,7 +1606,11 @@ static void at_xdmac_tasklet(unsigned long data)
|
||||
struct at_xdmac_desc,
|
||||
xfer_node);
|
||||
dev_vdbg(chan2dev(&atchan->chan), "%s: desc 0x%p\n", __func__, desc);
|
||||
BUG_ON(!desc->active_xfer);
|
||||
if (!desc->active_xfer) {
|
||||
dev_err(chan2dev(&atchan->chan), "Xfer not active: exiting");
|
||||
spin_unlock_bh(&atchan->lock);
|
||||
return;
|
||||
}
|
||||
|
||||
txd = &desc->tx_dma_desc;
|
||||
|
||||
|
@ -960,6 +960,7 @@ static void _stop(struct pl330_thread *thrd)
|
||||
{
|
||||
void __iomem *regs = thrd->dmac->base;
|
||||
u8 insn[6] = {0, 0, 0, 0, 0, 0};
|
||||
u32 inten = readl(regs + INTEN);
|
||||
|
||||
if (_state(thrd) == PL330_STATE_FAULT_COMPLETING)
|
||||
UNTIL(thrd, PL330_STATE_FAULTING | PL330_STATE_KILLING);
|
||||
@ -972,10 +973,13 @@ static void _stop(struct pl330_thread *thrd)
|
||||
|
||||
_emit_KILL(0, insn);
|
||||
|
||||
/* Stop generating interrupts for SEV */
|
||||
writel(readl(regs + INTEN) & ~(1 << thrd->ev), regs + INTEN);
|
||||
|
||||
_execute_DBGINSN(thrd, insn, is_manager(thrd));
|
||||
|
||||
/* clear the event */
|
||||
if (inten & (1 << thrd->ev))
|
||||
writel(1 << thrd->ev, regs + INTCLR);
|
||||
/* Stop generating interrupts for SEV */
|
||||
writel(inten & ~(1 << thrd->ev), regs + INTEN);
|
||||
}
|
||||
|
||||
/* Start doing req 'idx' of thread 'thrd' */
|
||||
|
@ -22,7 +22,6 @@
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of_dma.h>
|
||||
#include <linux/of_irq.h>
|
||||
#include <linux/pm_clock.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
@ -141,6 +140,7 @@ struct tegra_adma {
|
||||
struct dma_device dma_dev;
|
||||
struct device *dev;
|
||||
void __iomem *base_addr;
|
||||
struct clk *ahub_clk;
|
||||
unsigned int nr_channels;
|
||||
unsigned long rx_requests_reserved;
|
||||
unsigned long tx_requests_reserved;
|
||||
@ -637,8 +637,9 @@ static int tegra_adma_runtime_suspend(struct device *dev)
|
||||
struct tegra_adma *tdma = dev_get_drvdata(dev);
|
||||
|
||||
tdma->global_cmd = tdma_read(tdma, ADMA_GLOBAL_CMD);
|
||||
clk_disable_unprepare(tdma->ahub_clk);
|
||||
|
||||
return pm_clk_suspend(dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int tegra_adma_runtime_resume(struct device *dev)
|
||||
@ -646,10 +647,11 @@ static int tegra_adma_runtime_resume(struct device *dev)
|
||||
struct tegra_adma *tdma = dev_get_drvdata(dev);
|
||||
int ret;
|
||||
|
||||
ret = pm_clk_resume(dev);
|
||||
if (ret)
|
||||
ret = clk_prepare_enable(tdma->ahub_clk);
|
||||
if (ret) {
|
||||
dev_err(dev, "ahub clk_enable failed: %d\n", ret);
|
||||
return ret;
|
||||
|
||||
}
|
||||
tdma_write(tdma, ADMA_GLOBAL_CMD, tdma->global_cmd);
|
||||
|
||||
return 0;
|
||||
@ -692,13 +694,11 @@ static int tegra_adma_probe(struct platform_device *pdev)
|
||||
if (IS_ERR(tdma->base_addr))
|
||||
return PTR_ERR(tdma->base_addr);
|
||||
|
||||
ret = pm_clk_create(&pdev->dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = of_pm_clk_add_clk(&pdev->dev, "d_audio");
|
||||
if (ret)
|
||||
goto clk_destroy;
|
||||
tdma->ahub_clk = devm_clk_get(&pdev->dev, "d_audio");
|
||||
if (IS_ERR(tdma->ahub_clk)) {
|
||||
dev_err(&pdev->dev, "Error: Missing ahub controller clock\n");
|
||||
return PTR_ERR(tdma->ahub_clk);
|
||||
}
|
||||
|
||||
pm_runtime_enable(&pdev->dev);
|
||||
|
||||
@ -775,8 +775,6 @@ rpm_put:
|
||||
pm_runtime_put_sync(&pdev->dev);
|
||||
rpm_disable:
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
clk_destroy:
|
||||
pm_clk_destroy(&pdev->dev);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -786,6 +784,7 @@ static int tegra_adma_remove(struct platform_device *pdev)
|
||||
struct tegra_adma *tdma = platform_get_drvdata(pdev);
|
||||
int i;
|
||||
|
||||
of_dma_controller_free(pdev->dev.of_node);
|
||||
dma_async_device_unregister(&tdma->dma_dev);
|
||||
|
||||
for (i = 0; i < tdma->nr_channels; ++i)
|
||||
@ -793,7 +792,6 @@ static int tegra_adma_remove(struct platform_device *pdev)
|
||||
|
||||
pm_runtime_put_sync(&pdev->dev);
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
pm_clk_destroy(&pdev->dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1726,6 +1726,16 @@ static int arizona_extcon_remove(struct platform_device *pdev)
|
||||
struct arizona_extcon_info *info = platform_get_drvdata(pdev);
|
||||
struct arizona *arizona = info->arizona;
|
||||
int jack_irq_rise, jack_irq_fall;
|
||||
bool change;
|
||||
|
||||
regmap_update_bits_check(arizona->regmap, ARIZONA_MIC_DETECT_1,
|
||||
ARIZONA_MICD_ENA, 0,
|
||||
&change);
|
||||
|
||||
if (change) {
|
||||
regulator_disable(info->micvdd);
|
||||
pm_runtime_put(info->dev);
|
||||
}
|
||||
|
||||
gpiod_put(info->micd_pol_gpio);
|
||||
|
||||
|
@ -135,8 +135,9 @@ int amdgpu_fence_emit(struct amdgpu_ring *ring, struct dma_fence **f)
|
||||
{
|
||||
struct amdgpu_device *adev = ring->adev;
|
||||
struct amdgpu_fence *fence;
|
||||
struct dma_fence *old, **ptr;
|
||||
struct dma_fence __rcu **ptr;
|
||||
uint32_t seq;
|
||||
int r;
|
||||
|
||||
fence = kmem_cache_alloc(amdgpu_fence_slab, GFP_KERNEL);
|
||||
if (fence == NULL)
|
||||
@ -152,15 +153,24 @@ int amdgpu_fence_emit(struct amdgpu_ring *ring, struct dma_fence **f)
|
||||
seq, AMDGPU_FENCE_FLAG_INT);
|
||||
|
||||
ptr = &ring->fence_drv.fences[seq & ring->fence_drv.num_fences_mask];
|
||||
if (unlikely(rcu_dereference_protected(*ptr, 1))) {
|
||||
struct dma_fence *old;
|
||||
|
||||
rcu_read_lock();
|
||||
old = dma_fence_get_rcu_safe(ptr);
|
||||
rcu_read_unlock();
|
||||
|
||||
if (old) {
|
||||
r = dma_fence_wait(old, false);
|
||||
dma_fence_put(old);
|
||||
if (r)
|
||||
return r;
|
||||
}
|
||||
}
|
||||
|
||||
/* This function can't be called concurrently anyway, otherwise
|
||||
* emitting the fence would mess up the hardware ring buffer.
|
||||
*/
|
||||
old = rcu_dereference_protected(*ptr, 1);
|
||||
if (old && !dma_fence_is_signaled(old)) {
|
||||
DRM_INFO("rcu slot is busy\n");
|
||||
dma_fence_wait(old, false);
|
||||
}
|
||||
|
||||
rcu_assign_pointer(*ptr, dma_fence_get(&fence->base));
|
||||
|
||||
*f = &fence->base;
|
||||
|
@ -506,7 +506,7 @@ int drm_dev_init(struct drm_device *dev,
|
||||
}
|
||||
|
||||
kref_init(&dev->ref);
|
||||
dev->dev = parent;
|
||||
dev->dev = get_device(parent);
|
||||
dev->driver = driver;
|
||||
|
||||
INIT_LIST_HEAD(&dev->filelist);
|
||||
@ -573,6 +573,7 @@ err_minors:
|
||||
drm_minor_free(dev, DRM_MINOR_CONTROL);
|
||||
drm_fs_inode_free(dev->anon_inode);
|
||||
err_free:
|
||||
put_device(dev->dev);
|
||||
mutex_destroy(&dev->master_mutex);
|
||||
mutex_destroy(&dev->ctxlist_mutex);
|
||||
mutex_destroy(&dev->filelist_mutex);
|
||||
@ -608,6 +609,8 @@ void drm_dev_fini(struct drm_device *dev)
|
||||
drm_minor_free(dev, DRM_MINOR_RENDER);
|
||||
drm_minor_free(dev, DRM_MINOR_CONTROL);
|
||||
|
||||
put_device(dev->dev);
|
||||
|
||||
mutex_destroy(&dev->master_mutex);
|
||||
mutex_destroy(&dev->ctxlist_mutex);
|
||||
mutex_destroy(&dev->filelist_mutex);
|
||||
|
@ -532,6 +532,7 @@ put_back_event:
|
||||
file_priv->event_space -= length;
|
||||
list_add(&e->link, &file_priv->event_list);
|
||||
spin_unlock_irq(&dev->event_lock);
|
||||
wake_up_interruptible(&file_priv->event_wait);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -29,7 +29,7 @@ static void a5xx_dump(struct msm_gpu *gpu);
|
||||
static int zap_shader_load_mdt(struct device *dev, const char *fwname)
|
||||
{
|
||||
const struct firmware *fw;
|
||||
struct device_node *np;
|
||||
struct device_node *np, *mem_np;
|
||||
struct resource r;
|
||||
phys_addr_t mem_phys;
|
||||
ssize_t mem_size;
|
||||
@ -43,11 +43,13 @@ static int zap_shader_load_mdt(struct device *dev, const char *fwname)
|
||||
if (!np)
|
||||
return -ENODEV;
|
||||
|
||||
np = of_parse_phandle(np, "memory-region", 0);
|
||||
if (!np)
|
||||
mem_np = of_parse_phandle(np, "memory-region", 0);
|
||||
of_node_put(np);
|
||||
if (!mem_np)
|
||||
return -EINVAL;
|
||||
|
||||
ret = of_address_to_resource(np, 0, &r);
|
||||
ret = of_address_to_resource(mem_np, 0, &r);
|
||||
of_node_put(mem_np);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
@ -199,13 +199,14 @@ static unsigned hid_lookup_collection(struct hid_parser *parser, unsigned type)
|
||||
* Add a usage to the temporary parser table.
|
||||
*/
|
||||
|
||||
static int hid_add_usage(struct hid_parser *parser, unsigned usage)
|
||||
static int hid_add_usage(struct hid_parser *parser, unsigned usage, u8 size)
|
||||
{
|
||||
if (parser->local.usage_index >= HID_MAX_USAGES) {
|
||||
hid_err(parser->device, "usage index exceeded\n");
|
||||
return -1;
|
||||
}
|
||||
parser->local.usage[parser->local.usage_index] = usage;
|
||||
parser->local.usage_size[parser->local.usage_index] = size;
|
||||
parser->local.collection_index[parser->local.usage_index] =
|
||||
parser->collection_stack_ptr ?
|
||||
parser->collection_stack[parser->collection_stack_ptr - 1] : 0;
|
||||
@ -462,10 +463,7 @@ static int hid_parser_local(struct hid_parser *parser, struct hid_item *item)
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (item->size <= 2)
|
||||
data = (parser->global.usage_page << 16) + data;
|
||||
|
||||
return hid_add_usage(parser, data);
|
||||
return hid_add_usage(parser, data, item->size);
|
||||
|
||||
case HID_LOCAL_ITEM_TAG_USAGE_MINIMUM:
|
||||
|
||||
@ -474,9 +472,6 @@ static int hid_parser_local(struct hid_parser *parser, struct hid_item *item)
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (item->size <= 2)
|
||||
data = (parser->global.usage_page << 16) + data;
|
||||
|
||||
parser->local.usage_minimum = data;
|
||||
return 0;
|
||||
|
||||
@ -487,9 +482,6 @@ static int hid_parser_local(struct hid_parser *parser, struct hid_item *item)
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (item->size <= 2)
|
||||
data = (parser->global.usage_page << 16) + data;
|
||||
|
||||
count = data - parser->local.usage_minimum;
|
||||
if (count + parser->local.usage_index >= HID_MAX_USAGES) {
|
||||
/*
|
||||
@ -509,7 +501,7 @@ static int hid_parser_local(struct hid_parser *parser, struct hid_item *item)
|
||||
}
|
||||
|
||||
for (n = parser->local.usage_minimum; n <= data; n++)
|
||||
if (hid_add_usage(parser, n)) {
|
||||
if (hid_add_usage(parser, n, item->size)) {
|
||||
dbg_hid("hid_add_usage failed\n");
|
||||
return -1;
|
||||
}
|
||||
@ -523,6 +515,22 @@ static int hid_parser_local(struct hid_parser *parser, struct hid_item *item)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Concatenate Usage Pages into Usages where relevant:
|
||||
* As per specification, 6.2.2.8: "When the parser encounters a main item it
|
||||
* concatenates the last declared Usage Page with a Usage to form a complete
|
||||
* usage value."
|
||||
*/
|
||||
|
||||
static void hid_concatenate_usage_page(struct hid_parser *parser)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < parser->local.usage_index; i++)
|
||||
if (parser->local.usage_size[i] <= 2)
|
||||
parser->local.usage[i] += parser->global.usage_page << 16;
|
||||
}
|
||||
|
||||
/*
|
||||
* Process a main item.
|
||||
*/
|
||||
@ -532,6 +540,8 @@ static int hid_parser_main(struct hid_parser *parser, struct hid_item *item)
|
||||
__u32 data;
|
||||
int ret;
|
||||
|
||||
hid_concatenate_usage_page(parser);
|
||||
|
||||
data = item_udata(item);
|
||||
|
||||
switch (item->tag) {
|
||||
@ -741,6 +751,8 @@ static int hid_scan_main(struct hid_parser *parser, struct hid_item *item)
|
||||
__u32 data;
|
||||
int i;
|
||||
|
||||
hid_concatenate_usage_page(parser);
|
||||
|
||||
data = item_udata(item);
|
||||
|
||||
switch (item->tag) {
|
||||
|
@ -725,13 +725,16 @@ static int hidpp_root_get_feature(struct hidpp_device *hidpp, u16 feature,
|
||||
|
||||
static int hidpp_root_get_protocol_version(struct hidpp_device *hidpp)
|
||||
{
|
||||
const u8 ping_byte = 0x5a;
|
||||
u8 ping_data[3] = { 0, 0, ping_byte };
|
||||
struct hidpp_report response;
|
||||
int ret;
|
||||
|
||||
ret = hidpp_send_fap_command_sync(hidpp,
|
||||
ret = hidpp_send_rap_command_sync(hidpp,
|
||||
REPORT_ID_HIDPP_SHORT,
|
||||
HIDPP_PAGE_ROOT_IDX,
|
||||
CMD_ROOT_GET_PROTOCOL_VERSION,
|
||||
NULL, 0, &response);
|
||||
ping_data, sizeof(ping_data), &response);
|
||||
|
||||
if (ret == HIDPP_ERROR_INVALID_SUBID) {
|
||||
hidpp->protocol_major = 1;
|
||||
@ -751,8 +754,14 @@ static int hidpp_root_get_protocol_version(struct hidpp_device *hidpp)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
hidpp->protocol_major = response.fap.params[0];
|
||||
hidpp->protocol_minor = response.fap.params[1];
|
||||
if (response.rap.params[2] != ping_byte) {
|
||||
hid_err(hidpp->hid_dev, "%s: ping mismatch 0x%02x != 0x%02x\n",
|
||||
__func__, response.rap.params[2], ping_byte);
|
||||
return -EPROTO;
|
||||
}
|
||||
|
||||
hidpp->protocol_major = response.rap.params[0];
|
||||
hidpp->protocol_minor = response.rap.params[1];
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -901,7 +910,11 @@ static int hidpp_map_battery_level(int capacity)
|
||||
{
|
||||
if (capacity < 11)
|
||||
return POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL;
|
||||
else if (capacity < 31)
|
||||
/*
|
||||
* The spec says this should be < 31 but some devices report 30
|
||||
* with brand new batteries and Windows reports 30 as "Good".
|
||||
*/
|
||||
else if (capacity < 30)
|
||||
return POWER_SUPPLY_CAPACITY_LEVEL_LOW;
|
||||
else if (capacity < 81)
|
||||
return POWER_SUPPLY_CAPACITY_LEVEL_NORMAL;
|
||||
|
@ -96,17 +96,23 @@ superio_select(int base, int ld)
|
||||
outb(ld, base + 1);
|
||||
}
|
||||
|
||||
static inline void
|
||||
static inline int
|
||||
superio_enter(int base)
|
||||
{
|
||||
if (!request_muxed_region(base, 2, DRVNAME))
|
||||
return -EBUSY;
|
||||
|
||||
outb(0x87, base);
|
||||
outb(0x87, base);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void
|
||||
superio_exit(int base)
|
||||
{
|
||||
outb(0xaa, base);
|
||||
release_region(base, 2);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1561,7 +1567,7 @@ exit:
|
||||
static int __init f71805f_find(int sioaddr, unsigned short *address,
|
||||
struct f71805f_sio_data *sio_data)
|
||||
{
|
||||
int err = -ENODEV;
|
||||
int err;
|
||||
u16 devid;
|
||||
|
||||
static const char * const names[] = {
|
||||
@ -1569,8 +1575,11 @@ static int __init f71805f_find(int sioaddr, unsigned short *address,
|
||||
"F71872F/FG or F71806F/FG",
|
||||
};
|
||||
|
||||
superio_enter(sioaddr);
|
||||
err = superio_enter(sioaddr);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = -ENODEV;
|
||||
devid = superio_inw(sioaddr, SIO_REG_MANID);
|
||||
if (devid != SIO_FINTEK_ID)
|
||||
goto exit;
|
||||
|
@ -106,6 +106,13 @@ static const char *logdev_str[2] = { DRVNAME " FMC", DRVNAME " HMC" };
|
||||
#define LD_IN 1
|
||||
#define LD_TEMP 1
|
||||
|
||||
static inline int superio_enter(int sioaddr)
|
||||
{
|
||||
if (!request_muxed_region(sioaddr, 2, DRVNAME))
|
||||
return -EBUSY;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void superio_outb(int sioaddr, int reg, int val)
|
||||
{
|
||||
outb(reg, sioaddr);
|
||||
@ -122,6 +129,7 @@ static inline void superio_exit(int sioaddr)
|
||||
{
|
||||
outb(0x02, sioaddr);
|
||||
outb(0x02, sioaddr + 1);
|
||||
release_region(sioaddr, 2);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1220,7 +1228,11 @@ static int __init pc87427_find(int sioaddr, struct pc87427_sio_data *sio_data)
|
||||
{
|
||||
u16 val;
|
||||
u8 cfg, cfg_b;
|
||||
int i, err = 0;
|
||||
int i, err;
|
||||
|
||||
err = superio_enter(sioaddr);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
/* Identify device */
|
||||
val = force_id ? force_id : superio_inb(sioaddr, SIOREG_DEVID);
|
||||
|
@ -72,14 +72,19 @@ static inline void superio_select(int ld)
|
||||
superio_outb(0x07, ld);
|
||||
}
|
||||
|
||||
static inline void superio_enter(void)
|
||||
static inline int superio_enter(void)
|
||||
{
|
||||
if (!request_muxed_region(REG, 2, DRVNAME))
|
||||
return -EBUSY;
|
||||
|
||||
outb(0x55, REG);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void superio_exit(void)
|
||||
{
|
||||
outb(0xAA, REG);
|
||||
release_region(REG, 2);
|
||||
}
|
||||
|
||||
#define SUPERIO_REG_DEVID 0x20
|
||||
@ -300,8 +305,12 @@ static int __init smsc47b397_find(void)
|
||||
u8 id, rev;
|
||||
char *name;
|
||||
unsigned short addr;
|
||||
int err;
|
||||
|
||||
err = superio_enter();
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
superio_enter();
|
||||
id = force_id ? force_id : superio_inb(SUPERIO_REG_DEVID);
|
||||
|
||||
switch (id) {
|
||||
|
@ -73,16 +73,21 @@ superio_inb(int reg)
|
||||
/* logical device for fans is 0x0A */
|
||||
#define superio_select() superio_outb(0x07, 0x0A)
|
||||
|
||||
static inline void
|
||||
static inline int
|
||||
superio_enter(void)
|
||||
{
|
||||
if (!request_muxed_region(REG, 2, DRVNAME))
|
||||
return -EBUSY;
|
||||
|
||||
outb(0x55, REG);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void
|
||||
superio_exit(void)
|
||||
{
|
||||
outb(0xAA, REG);
|
||||
release_region(REG, 2);
|
||||
}
|
||||
|
||||
#define SUPERIO_REG_ACT 0x30
|
||||
@ -531,8 +536,12 @@ static int __init smsc47m1_find(struct smsc47m1_sio_data *sio_data)
|
||||
{
|
||||
u8 val;
|
||||
unsigned short addr;
|
||||
int err;
|
||||
|
||||
err = superio_enter();
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
superio_enter();
|
||||
val = force_id ? force_id : superio_inb(SUPERIO_REG_DEVID);
|
||||
|
||||
/*
|
||||
@ -608,13 +617,14 @@ static int __init smsc47m1_find(struct smsc47m1_sio_data *sio_data)
|
||||
static void smsc47m1_restore(const struct smsc47m1_sio_data *sio_data)
|
||||
{
|
||||
if ((sio_data->activate & 0x01) == 0) {
|
||||
superio_enter();
|
||||
if (!superio_enter()) {
|
||||
superio_select();
|
||||
|
||||
pr_info("Disabling device\n");
|
||||
superio_outb(SUPERIO_REG_ACT, sio_data->activate);
|
||||
|
||||
superio_exit();
|
||||
} else {
|
||||
pr_warn("Failed to disable device\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -226,15 +226,21 @@ static inline void superio_select(int sio_cip, int ldn)
|
||||
outb(ldn, sio_cip + 1);
|
||||
}
|
||||
|
||||
static inline void superio_enter(int sio_cip)
|
||||
static inline int superio_enter(int sio_cip)
|
||||
{
|
||||
if (!request_muxed_region(sio_cip, 2, DRVNAME))
|
||||
return -EBUSY;
|
||||
|
||||
outb(0x87, sio_cip);
|
||||
outb(0x87, sio_cip);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void superio_exit(int sio_cip)
|
||||
{
|
||||
outb(0xaa, sio_cip);
|
||||
release_region(sio_cip, 2);
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------
|
||||
@ -1282,11 +1288,14 @@ EXIT:
|
||||
|
||||
static int __init vt1211_find(int sio_cip, unsigned short *address)
|
||||
{
|
||||
int err = -ENODEV;
|
||||
int err;
|
||||
int devid;
|
||||
|
||||
superio_enter(sio_cip);
|
||||
err = superio_enter(sio_cip);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = -ENODEV;
|
||||
devid = force_id ? force_id : superio_inb(sio_cip, SIO_VT1211_DEVID);
|
||||
if (devid != SIO_VT1211_ID)
|
||||
goto EXIT;
|
||||
|
@ -92,6 +92,7 @@ struct msc_iter {
|
||||
* @reg_base: register window base address
|
||||
* @thdev: intel_th_device pointer
|
||||
* @win_list: list of windows in multiblock mode
|
||||
* @single_sgt: single mode buffer
|
||||
* @nr_pages: total number of pages allocated for this buffer
|
||||
* @single_sz: amount of data in single mode
|
||||
* @single_wrap: single mode wrap occurred
|
||||
@ -112,6 +113,7 @@ struct msc {
|
||||
struct intel_th_device *thdev;
|
||||
|
||||
struct list_head win_list;
|
||||
struct sg_table single_sgt;
|
||||
unsigned long nr_pages;
|
||||
unsigned long single_sz;
|
||||
unsigned int single_wrap : 1;
|
||||
@ -625,22 +627,45 @@ static void intel_th_msc_deactivate(struct intel_th_device *thdev)
|
||||
*/
|
||||
static int msc_buffer_contig_alloc(struct msc *msc, unsigned long size)
|
||||
{
|
||||
unsigned long nr_pages = size >> PAGE_SHIFT;
|
||||
unsigned int order = get_order(size);
|
||||
struct page *page;
|
||||
int ret;
|
||||
|
||||
if (!size)
|
||||
return 0;
|
||||
|
||||
ret = sg_alloc_table(&msc->single_sgt, 1, GFP_KERNEL);
|
||||
if (ret)
|
||||
goto err_out;
|
||||
|
||||
ret = -ENOMEM;
|
||||
page = alloc_pages(GFP_KERNEL | __GFP_ZERO, order);
|
||||
if (!page)
|
||||
return -ENOMEM;
|
||||
goto err_free_sgt;
|
||||
|
||||
split_page(page, order);
|
||||
msc->nr_pages = size >> PAGE_SHIFT;
|
||||
sg_set_buf(msc->single_sgt.sgl, page_address(page), size);
|
||||
|
||||
ret = dma_map_sg(msc_dev(msc)->parent->parent, msc->single_sgt.sgl, 1,
|
||||
DMA_FROM_DEVICE);
|
||||
if (ret < 0)
|
||||
goto err_free_pages;
|
||||
|
||||
msc->nr_pages = nr_pages;
|
||||
msc->base = page_address(page);
|
||||
msc->base_addr = page_to_phys(page);
|
||||
msc->base_addr = sg_dma_address(msc->single_sgt.sgl);
|
||||
|
||||
return 0;
|
||||
|
||||
err_free_pages:
|
||||
__free_pages(page, order);
|
||||
|
||||
err_free_sgt:
|
||||
sg_free_table(&msc->single_sgt);
|
||||
|
||||
err_out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -651,6 +676,10 @@ static void msc_buffer_contig_free(struct msc *msc)
|
||||
{
|
||||
unsigned long off;
|
||||
|
||||
dma_unmap_sg(msc_dev(msc)->parent->parent, msc->single_sgt.sgl,
|
||||
1, DMA_FROM_DEVICE);
|
||||
sg_free_table(&msc->single_sgt);
|
||||
|
||||
for (off = 0; off < msc->nr_pages << PAGE_SHIFT; off += PAGE_SIZE) {
|
||||
struct page *page = virt_to_page(msc->base + off);
|
||||
|
||||
|
@ -62,7 +62,7 @@ int ad_sd_write_reg(struct ad_sigma_delta *sigma_delta, unsigned int reg,
|
||||
struct spi_transfer t = {
|
||||
.tx_buf = data,
|
||||
.len = size + 1,
|
||||
.cs_change = sigma_delta->bus_locked,
|
||||
.cs_change = sigma_delta->keep_cs_asserted,
|
||||
};
|
||||
struct spi_message m;
|
||||
int ret;
|
||||
@ -217,6 +217,7 @@ static int ad_sd_calibrate(struct ad_sigma_delta *sigma_delta,
|
||||
|
||||
spi_bus_lock(sigma_delta->spi->master);
|
||||
sigma_delta->bus_locked = true;
|
||||
sigma_delta->keep_cs_asserted = true;
|
||||
reinit_completion(&sigma_delta->completion);
|
||||
|
||||
ret = ad_sigma_delta_set_mode(sigma_delta, mode);
|
||||
@ -234,9 +235,10 @@ static int ad_sd_calibrate(struct ad_sigma_delta *sigma_delta,
|
||||
ret = 0;
|
||||
}
|
||||
out:
|
||||
sigma_delta->keep_cs_asserted = false;
|
||||
ad_sigma_delta_set_mode(sigma_delta, AD_SD_MODE_IDLE);
|
||||
sigma_delta->bus_locked = false;
|
||||
spi_bus_unlock(sigma_delta->spi->master);
|
||||
ad_sigma_delta_set_mode(sigma_delta, AD_SD_MODE_IDLE);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -288,6 +290,7 @@ int ad_sigma_delta_single_conversion(struct iio_dev *indio_dev,
|
||||
|
||||
spi_bus_lock(sigma_delta->spi->master);
|
||||
sigma_delta->bus_locked = true;
|
||||
sigma_delta->keep_cs_asserted = true;
|
||||
reinit_completion(&sigma_delta->completion);
|
||||
|
||||
ad_sigma_delta_set_mode(sigma_delta, AD_SD_MODE_SINGLE);
|
||||
@ -297,9 +300,6 @@ int ad_sigma_delta_single_conversion(struct iio_dev *indio_dev,
|
||||
ret = wait_for_completion_interruptible_timeout(
|
||||
&sigma_delta->completion, HZ);
|
||||
|
||||
sigma_delta->bus_locked = false;
|
||||
spi_bus_unlock(sigma_delta->spi->master);
|
||||
|
||||
if (ret == 0)
|
||||
ret = -EIO;
|
||||
if (ret < 0)
|
||||
@ -315,7 +315,10 @@ out:
|
||||
sigma_delta->irq_dis = true;
|
||||
}
|
||||
|
||||
sigma_delta->keep_cs_asserted = false;
|
||||
ad_sigma_delta_set_mode(sigma_delta, AD_SD_MODE_IDLE);
|
||||
sigma_delta->bus_locked = false;
|
||||
spi_bus_unlock(sigma_delta->spi->master);
|
||||
mutex_unlock(&indio_dev->mlock);
|
||||
|
||||
if (ret)
|
||||
@ -352,6 +355,8 @@ static int ad_sd_buffer_postenable(struct iio_dev *indio_dev)
|
||||
|
||||
spi_bus_lock(sigma_delta->spi->master);
|
||||
sigma_delta->bus_locked = true;
|
||||
sigma_delta->keep_cs_asserted = true;
|
||||
|
||||
ret = ad_sigma_delta_set_mode(sigma_delta, AD_SD_MODE_CONTINUOUS);
|
||||
if (ret)
|
||||
goto err_unlock;
|
||||
@ -380,6 +385,7 @@ static int ad_sd_buffer_postdisable(struct iio_dev *indio_dev)
|
||||
sigma_delta->irq_dis = true;
|
||||
}
|
||||
|
||||
sigma_delta->keep_cs_asserted = false;
|
||||
ad_sigma_delta_set_mode(sigma_delta, AD_SD_MODE_IDLE);
|
||||
|
||||
sigma_delta->bus_locked = false;
|
||||
|
@ -81,7 +81,7 @@ int ssp_common_process_data(struct iio_dev *indio_dev, void *buf,
|
||||
unsigned int len, int64_t timestamp)
|
||||
{
|
||||
__le32 time;
|
||||
int64_t calculated_time;
|
||||
int64_t calculated_time = 0;
|
||||
struct ssp_sensor_data *spd = iio_priv(indio_dev);
|
||||
|
||||
if (indio_dev->scan_bytes == 0)
|
||||
|
@ -58,8 +58,13 @@ static const struct regmap_config hmc5843_i2c_regmap_config = {
|
||||
static int hmc5843_i2c_probe(struct i2c_client *cli,
|
||||
const struct i2c_device_id *id)
|
||||
{
|
||||
struct regmap *regmap = devm_regmap_init_i2c(cli,
|
||||
&hmc5843_i2c_regmap_config);
|
||||
if (IS_ERR(regmap))
|
||||
return PTR_ERR(regmap);
|
||||
|
||||
return hmc5843_common_probe(&cli->dev,
|
||||
devm_regmap_init_i2c(cli, &hmc5843_i2c_regmap_config),
|
||||
regmap,
|
||||
id->driver_data, id->name);
|
||||
}
|
||||
|
||||
|
@ -58,6 +58,7 @@ static const struct regmap_config hmc5843_spi_regmap_config = {
|
||||
static int hmc5843_spi_probe(struct spi_device *spi)
|
||||
{
|
||||
int ret;
|
||||
struct regmap *regmap;
|
||||
const struct spi_device_id *id = spi_get_device_id(spi);
|
||||
|
||||
spi->mode = SPI_MODE_3;
|
||||
@ -67,8 +68,12 @@ static int hmc5843_spi_probe(struct spi_device *spi)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
regmap = devm_regmap_init_spi(spi, &hmc5843_spi_regmap_config);
|
||||
if (IS_ERR(regmap))
|
||||
return PTR_ERR(regmap);
|
||||
|
||||
return hmc5843_common_probe(&spi->dev,
|
||||
devm_regmap_init_spi(spi, &hmc5843_spi_regmap_config),
|
||||
regmap,
|
||||
id->driver_data, id->name);
|
||||
}
|
||||
|
||||
|
@ -456,6 +456,8 @@ static struct sk_buff *get_skb(struct sk_buff *skb, int len, gfp_t gfp)
|
||||
skb_reset_transport_header(skb);
|
||||
} else {
|
||||
skb = alloc_skb(len, gfp);
|
||||
if (!skb)
|
||||
return NULL;
|
||||
}
|
||||
t4_set_arp_err_handler(skb, NULL, NULL);
|
||||
return skb;
|
||||
|
@ -769,7 +769,8 @@ static int create_workqueues(struct hfi1_devdata *dd)
|
||||
ppd->hfi1_wq =
|
||||
alloc_workqueue(
|
||||
"hfi%d_%d",
|
||||
WQ_SYSFS | WQ_HIGHPRI | WQ_CPU_INTENSIVE,
|
||||
WQ_SYSFS | WQ_HIGHPRI | WQ_CPU_INTENSIVE |
|
||||
WQ_MEM_RECLAIM,
|
||||
HFI1_MAX_ACTIVE_WORKQUEUE_ENTRIES,
|
||||
dd->unit, pidx);
|
||||
if (!ppd->hfi1_wq)
|
||||
|
@ -91,7 +91,7 @@ struct ib_ah *hns_roce_create_ah(struct ib_pd *ibpd,
|
||||
HNS_ROCE_VLAN_SL_BIT_MASK) <<
|
||||
HNS_ROCE_VLAN_SL_SHIFT;
|
||||
|
||||
ah->av.port_pd = cpu_to_be32(to_hr_pd(ibpd)->pdn |
|
||||
ah->av.port_pd = cpu_to_le32(to_hr_pd(ibpd)->pdn |
|
||||
(rdma_ah_get_port_num(ah_attr) <<
|
||||
HNS_ROCE_PORT_NUM_SHIFT));
|
||||
ah->av.gid_index = grh->sgid_index;
|
||||
|
@ -94,7 +94,6 @@ static inline u32 smmu_readl(struct tegra_smmu *smmu, unsigned long offset)
|
||||
#define SMMU_TLB_FLUSH_VA_MATCH_ALL (0 << 0)
|
||||
#define SMMU_TLB_FLUSH_VA_MATCH_SECTION (2 << 0)
|
||||
#define SMMU_TLB_FLUSH_VA_MATCH_GROUP (3 << 0)
|
||||
#define SMMU_TLB_FLUSH_ASID(x) (((x) & 0x7f) << 24)
|
||||
#define SMMU_TLB_FLUSH_VA_SECTION(addr) ((((addr) & 0xffc00000) >> 12) | \
|
||||
SMMU_TLB_FLUSH_VA_MATCH_SECTION)
|
||||
#define SMMU_TLB_FLUSH_VA_GROUP(addr) ((((addr) & 0xffffc000) >> 12) | \
|
||||
@ -197,8 +196,12 @@ static inline void smmu_flush_tlb_asid(struct tegra_smmu *smmu,
|
||||
{
|
||||
u32 value;
|
||||
|
||||
value = SMMU_TLB_FLUSH_ASID_MATCH | SMMU_TLB_FLUSH_ASID(asid) |
|
||||
SMMU_TLB_FLUSH_VA_MATCH_ALL;
|
||||
if (smmu->soc->num_asids == 4)
|
||||
value = (asid & 0x3) << 29;
|
||||
else
|
||||
value = (asid & 0x7f) << 24;
|
||||
|
||||
value |= SMMU_TLB_FLUSH_ASID_MATCH | SMMU_TLB_FLUSH_VA_MATCH_ALL;
|
||||
smmu_writel(smmu, value, SMMU_TLB_FLUSH);
|
||||
}
|
||||
|
||||
@ -208,8 +211,12 @@ static inline void smmu_flush_tlb_section(struct tegra_smmu *smmu,
|
||||
{
|
||||
u32 value;
|
||||
|
||||
value = SMMU_TLB_FLUSH_ASID_MATCH | SMMU_TLB_FLUSH_ASID(asid) |
|
||||
SMMU_TLB_FLUSH_VA_SECTION(iova);
|
||||
if (smmu->soc->num_asids == 4)
|
||||
value = (asid & 0x3) << 29;
|
||||
else
|
||||
value = (asid & 0x7f) << 24;
|
||||
|
||||
value |= SMMU_TLB_FLUSH_ASID_MATCH | SMMU_TLB_FLUSH_VA_SECTION(iova);
|
||||
smmu_writel(smmu, value, SMMU_TLB_FLUSH);
|
||||
}
|
||||
|
||||
@ -219,8 +226,12 @@ static inline void smmu_flush_tlb_group(struct tegra_smmu *smmu,
|
||||
{
|
||||
u32 value;
|
||||
|
||||
value = SMMU_TLB_FLUSH_ASID_MATCH | SMMU_TLB_FLUSH_ASID(asid) |
|
||||
SMMU_TLB_FLUSH_VA_GROUP(iova);
|
||||
if (smmu->soc->num_asids == 4)
|
||||
value = (asid & 0x3) << 29;
|
||||
else
|
||||
value = (asid & 0x7f) << 24;
|
||||
|
||||
value |= SMMU_TLB_FLUSH_ASID_MATCH | SMMU_TLB_FLUSH_VA_GROUP(iova);
|
||||
smmu_writel(smmu, value, SMMU_TLB_FLUSH);
|
||||
}
|
||||
|
||||
|
@ -325,10 +325,11 @@ static int bch_allocator_thread(void *arg)
|
||||
* possibly issue discards to them, then we add the bucket to
|
||||
* the free list:
|
||||
*/
|
||||
while (!fifo_empty(&ca->free_inc)) {
|
||||
while (1) {
|
||||
long bucket;
|
||||
|
||||
fifo_pop(&ca->free_inc, bucket);
|
||||
if (!fifo_pop(&ca->free_inc, bucket))
|
||||
break;
|
||||
|
||||
if (ca->discard) {
|
||||
mutex_unlock(&ca->set->bucket_lock);
|
||||
|
@ -310,6 +310,18 @@ void bch_journal_mark(struct cache_set *c, struct list_head *list)
|
||||
}
|
||||
}
|
||||
|
||||
bool is_discard_enabled(struct cache_set *s)
|
||||
{
|
||||
struct cache *ca;
|
||||
unsigned int i;
|
||||
|
||||
for_each_cache(ca, s, i)
|
||||
if (ca->discard)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
int bch_journal_replay(struct cache_set *s, struct list_head *list)
|
||||
{
|
||||
int ret = 0, keys = 0, entries = 0;
|
||||
@ -323,9 +335,17 @@ int bch_journal_replay(struct cache_set *s, struct list_head *list)
|
||||
list_for_each_entry(i, list, list) {
|
||||
BUG_ON(i->pin && atomic_read(i->pin) != 1);
|
||||
|
||||
cache_set_err_on(n != i->j.seq, s,
|
||||
"bcache: journal entries %llu-%llu missing! (replaying %llu-%llu)",
|
||||
if (n != i->j.seq) {
|
||||
if (n == start && is_discard_enabled(s))
|
||||
pr_info("bcache: journal entries %llu-%llu may be discarded! (replaying %llu-%llu)",
|
||||
n, i->j.seq - 1, start, end);
|
||||
else {
|
||||
pr_err("bcache: journal entries %llu-%llu missing! (replaying %llu-%llu)",
|
||||
n, i->j.seq - 1, start, end);
|
||||
ret = -EIO;
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
|
||||
for (k = i->j.start;
|
||||
k < bset_bkey_last(&i->j);
|
||||
|
@ -1560,7 +1560,7 @@ err:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void run_cache_set(struct cache_set *c)
|
||||
static int run_cache_set(struct cache_set *c)
|
||||
{
|
||||
const char *err = "cannot allocate memory";
|
||||
struct cached_dev *dc, *t;
|
||||
@ -1652,7 +1652,9 @@ static void run_cache_set(struct cache_set *c)
|
||||
if (j->version < BCACHE_JSET_VERSION_UUID)
|
||||
__uuid_write(c);
|
||||
|
||||
bch_journal_replay(c, &journal);
|
||||
err = "bcache: replay journal failed";
|
||||
if (bch_journal_replay(c, &journal))
|
||||
goto err;
|
||||
} else {
|
||||
pr_notice("invalidating existing data");
|
||||
|
||||
@ -1720,11 +1722,13 @@ static void run_cache_set(struct cache_set *c)
|
||||
flash_devs_run(c);
|
||||
|
||||
set_bit(CACHE_SET_RUNNING, &c->flags);
|
||||
return;
|
||||
return 0;
|
||||
err:
|
||||
closure_sync(&cl);
|
||||
/* XXX: test this, it's broken */
|
||||
bch_cache_set_error(c, "%s", err);
|
||||
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
static bool can_attach_cache(struct cache *ca, struct cache_set *c)
|
||||
@ -1788,8 +1792,11 @@ found:
|
||||
ca->set->cache[ca->sb.nr_this_dev] = ca;
|
||||
c->cache_by_alloc[c->caches_loaded++] = ca;
|
||||
|
||||
if (c->caches_loaded == c->sb.nr_in_set)
|
||||
run_cache_set(c);
|
||||
if (c->caches_loaded == c->sb.nr_in_set) {
|
||||
err = "failed to run cache set";
|
||||
if (run_cache_set(c) < 0)
|
||||
goto err;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
err:
|
||||
|
@ -1166,11 +1166,18 @@ static int __load_discards(struct dm_cache_metadata *cmd,
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
for (b = 0; b < from_dblock(cmd->discard_nr_blocks); b++) {
|
||||
for (b = 0; ; b++) {
|
||||
r = fn(context, cmd->discard_block_size, to_dblock(b),
|
||||
dm_bitset_cursor_get_value(&c));
|
||||
if (r)
|
||||
break;
|
||||
|
||||
if (b >= (from_dblock(cmd->discard_nr_blocks) - 1))
|
||||
break;
|
||||
|
||||
r = dm_bitset_cursor_next(&c);
|
||||
if (r)
|
||||
break;
|
||||
}
|
||||
|
||||
dm_bitset_cursor_end(&c);
|
||||
|
@ -222,6 +222,7 @@ static void delay_dtr(struct dm_target *ti)
|
||||
{
|
||||
struct delay_c *dc = ti->private;
|
||||
|
||||
if (dc->kdelayd_wq)
|
||||
destroy_workqueue(dc->kdelayd_wq);
|
||||
|
||||
dm_put_device(ti, dc->dev_read);
|
||||
|
@ -1169,6 +1169,9 @@ static int dmz_init_zones(struct dmz_metadata *zmd)
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!nr_blkz)
|
||||
break;
|
||||
|
||||
/* Process report */
|
||||
for (i = 0; i < nr_blkz; i++) {
|
||||
ret = dmz_init_zone(zmd, zone, &blkz[i]);
|
||||
@ -1204,6 +1207,8 @@ static int dmz_update_zone(struct dmz_metadata *zmd, struct dm_zone *zone)
|
||||
/* Get zone information from disk */
|
||||
ret = blkdev_report_zones(zmd->dev->bdev, dmz_start_sect(zmd, zone),
|
||||
&blkz, &nr_blkz, GFP_NOIO);
|
||||
if (!nr_blkz)
|
||||
ret = -EIO;
|
||||
if (ret) {
|
||||
dmz_dev_err(zmd->dev, "Get zone %u report failed",
|
||||
dmz_id(zmd, zone));
|
||||
|
@ -2845,7 +2845,9 @@ state_store(struct md_rdev *rdev, const char *buf, size_t len)
|
||||
err = 0;
|
||||
}
|
||||
} else if (cmd_match(buf, "re-add")) {
|
||||
if (test_bit(Faulty, &rdev->flags) && (rdev->raid_disk == -1) &&
|
||||
if (!rdev->mddev->pers)
|
||||
err = -EINVAL;
|
||||
else if (test_bit(Faulty, &rdev->flags) && (rdev->raid_disk == -1) &&
|
||||
rdev->saved_raid_disk >= 0) {
|
||||
/* clear_bit is performed _after_ all the devices
|
||||
* have their local Faulty bit cleared. If any writes
|
||||
|
@ -4182,7 +4182,7 @@ static void handle_parity_checks6(struct r5conf *conf, struct stripe_head *sh,
|
||||
/* now write out any block on a failed drive,
|
||||
* or P or Q if they were recomputed
|
||||
*/
|
||||
BUG_ON(s->uptodate < disks - 1); /* We don't need Q to recover */
|
||||
dev = NULL;
|
||||
if (s->failed == 2) {
|
||||
dev = &sh->dev[s->failed_num[1]];
|
||||
s->locked++;
|
||||
@ -4207,6 +4207,14 @@ static void handle_parity_checks6(struct r5conf *conf, struct stripe_head *sh,
|
||||
set_bit(R5_LOCKED, &dev->flags);
|
||||
set_bit(R5_Wantwrite, &dev->flags);
|
||||
}
|
||||
if (WARN_ONCE(dev && !test_bit(R5_UPTODATE, &dev->flags),
|
||||
"%s: disk%td not up to date\n",
|
||||
mdname(conf->mddev),
|
||||
dev - (struct r5dev *) &sh->dev)) {
|
||||
clear_bit(R5_LOCKED, &dev->flags);
|
||||
clear_bit(R5_Wantwrite, &dev->flags);
|
||||
s->locked--;
|
||||
}
|
||||
clear_bit(STRIPE_DEGRADED, &sh->state);
|
||||
|
||||
set_bit(STRIPE_INSYNC, &sh->state);
|
||||
@ -4218,15 +4226,26 @@ static void handle_parity_checks6(struct r5conf *conf, struct stripe_head *sh,
|
||||
case check_state_check_result:
|
||||
sh->check_state = check_state_idle;
|
||||
|
||||
if (s->failed > 1)
|
||||
break;
|
||||
/* handle a successful check operation, if parity is correct
|
||||
* we are done. Otherwise update the mismatch count and repair
|
||||
* parity if !MD_RECOVERY_CHECK
|
||||
*/
|
||||
if (sh->ops.zero_sum_result == 0) {
|
||||
/* Any parity checked was correct */
|
||||
/* both parities are correct */
|
||||
if (!s->failed)
|
||||
set_bit(STRIPE_INSYNC, &sh->state);
|
||||
else {
|
||||
/* in contrast to the raid5 case we can validate
|
||||
* parity, but still have a failure to write
|
||||
* back
|
||||
*/
|
||||
sh->check_state = check_state_compute_result;
|
||||
/* Returning at this point means that we may go
|
||||
* off and bring p and/or q uptodate again so
|
||||
* we make sure to check zero_sum_result again
|
||||
* to verify if p or q need writeback
|
||||
*/
|
||||
}
|
||||
} else {
|
||||
atomic64_add(STRIPE_SECTORS, &conf->mddev->resync_mismatches);
|
||||
if (test_bit(MD_RECOVERY_CHECK, &conf->mddev->recovery)) {
|
||||
|
@ -309,6 +309,9 @@ static int m88ds3103_set_frontend(struct dvb_frontend *fe)
|
||||
u16 u16tmp;
|
||||
u32 tuner_frequency_khz, target_mclk;
|
||||
s32 s32tmp;
|
||||
static const struct reg_sequence reset_buf[] = {
|
||||
{0x07, 0x80}, {0x07, 0x00}
|
||||
};
|
||||
|
||||
dev_dbg(&client->dev,
|
||||
"delivery_system=%d modulation=%d frequency=%u symbol_rate=%d inversion=%d pilot=%d rolloff=%d\n",
|
||||
@ -321,11 +324,7 @@ static int m88ds3103_set_frontend(struct dvb_frontend *fe)
|
||||
}
|
||||
|
||||
/* reset */
|
||||
ret = regmap_write(dev->regmap, 0x07, 0x80);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
ret = regmap_write(dev->regmap, 0x07, 0x00);
|
||||
ret = regmap_multi_reg_write(dev->regmap, reset_buf, 2);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
|
@ -1117,8 +1117,10 @@ static int ov2659_set_fmt(struct v4l2_subdev *sd,
|
||||
if (ov2659_formats[index].code == mf->code)
|
||||
break;
|
||||
|
||||
if (index < 0)
|
||||
return -EINVAL;
|
||||
if (index < 0) {
|
||||
index = 0;
|
||||
mf->code = ov2659_formats[index].code;
|
||||
}
|
||||
|
||||
mf->colorspace = V4L2_COLORSPACE_SRGB;
|
||||
mf->field = V4L2_FIELD_NONE;
|
||||
|
@ -822,9 +822,18 @@ static int ov6650_video_probe(struct i2c_client *client)
|
||||
u8 pidh, pidl, midh, midl;
|
||||
int ret;
|
||||
|
||||
priv->clk = v4l2_clk_get(&client->dev, NULL);
|
||||
if (IS_ERR(priv->clk)) {
|
||||
ret = PTR_ERR(priv->clk);
|
||||
dev_err(&client->dev, "v4l2_clk request err: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = ov6650_s_power(&priv->subdev, 1);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto eclkput;
|
||||
|
||||
msleep(20);
|
||||
|
||||
/*
|
||||
* check and show product ID and manufacturer ID
|
||||
@ -859,6 +868,11 @@ static int ov6650_video_probe(struct i2c_client *client)
|
||||
|
||||
done:
|
||||
ov6650_s_power(&priv->subdev, 0);
|
||||
if (!ret)
|
||||
return 0;
|
||||
eclkput:
|
||||
v4l2_clk_put(priv->clk);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -1004,18 +1018,9 @@ static int ov6650_probe(struct i2c_client *client,
|
||||
priv->code = MEDIA_BUS_FMT_YUYV8_2X8;
|
||||
priv->colorspace = V4L2_COLORSPACE_JPEG;
|
||||
|
||||
priv->clk = v4l2_clk_get(&client->dev, NULL);
|
||||
if (IS_ERR(priv->clk)) {
|
||||
ret = PTR_ERR(priv->clk);
|
||||
goto eclkget;
|
||||
}
|
||||
|
||||
ret = ov6650_video_probe(client);
|
||||
if (ret) {
|
||||
v4l2_clk_put(priv->clk);
|
||||
eclkget:
|
||||
if (ret)
|
||||
v4l2_ctrl_handler_free(&priv->hdl);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -270,9 +270,8 @@ static int hexium_attach(struct saa7146_dev *dev, struct saa7146_pci_extension_d
|
||||
/* enable i2c-port pins */
|
||||
saa7146_write(dev, MC1, (MASK_08 | MASK_24 | MASK_10 | MASK_26));
|
||||
|
||||
hexium->i2c_adapter = (struct i2c_adapter) {
|
||||
.name = "hexium gemini",
|
||||
};
|
||||
strscpy(hexium->i2c_adapter.name, "hexium gemini",
|
||||
sizeof(hexium->i2c_adapter.name));
|
||||
saa7146_i2c_adapter_prepare(dev, &hexium->i2c_adapter, SAA7146_I2C_BUS_BIT_RATE_480);
|
||||
if (i2c_add_adapter(&hexium->i2c_adapter) < 0) {
|
||||
DEB_S("cannot register i2c-device. skipping.\n");
|
||||
|
@ -232,9 +232,8 @@ static int hexium_probe(struct saa7146_dev *dev)
|
||||
saa7146_write(dev, DD1_STREAM_B, 0x00000000);
|
||||
saa7146_write(dev, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26));
|
||||
|
||||
hexium->i2c_adapter = (struct i2c_adapter) {
|
||||
.name = "hexium orion",
|
||||
};
|
||||
strscpy(hexium->i2c_adapter.name, "hexium orion",
|
||||
sizeof(hexium->i2c_adapter.name));
|
||||
saa7146_i2c_adapter_prepare(dev, &hexium->i2c_adapter, SAA7146_I2C_BUS_BIT_RATE_480);
|
||||
if (i2c_add_adapter(&hexium->i2c_adapter) < 0) {
|
||||
DEB_S("cannot register i2c-device. skipping.\n");
|
||||
|
@ -1948,6 +1948,9 @@ static int coda_prepare_decode(struct coda_ctx *ctx)
|
||||
/* Clear decode success flag */
|
||||
coda_write(dev, 0, CODA_RET_DEC_PIC_SUCCESS);
|
||||
|
||||
/* Clear error return value */
|
||||
coda_write(dev, 0, CODA_RET_DEC_PIC_ERR_MB);
|
||||
|
||||
trace_coda_dec_pic_run(ctx, meta);
|
||||
|
||||
coda_command_async(ctx, CODA_COMMAND_PIC_RUN);
|
||||
|
@ -775,6 +775,9 @@ static int dcmi_try_fmt(struct stm32_dcmi *dcmi, struct v4l2_format *f,
|
||||
|
||||
sd_fmt = find_format_by_fourcc(dcmi, pix->pixelformat);
|
||||
if (!sd_fmt) {
|
||||
if (!dcmi->num_of_sd_formats)
|
||||
return -ENODATA;
|
||||
|
||||
sd_fmt = dcmi->sd_formats[dcmi->num_of_sd_formats - 1];
|
||||
pix->pixelformat = sd_fmt->fourcc;
|
||||
}
|
||||
@ -946,6 +949,9 @@ static int dcmi_set_sensor_format(struct stm32_dcmi *dcmi,
|
||||
|
||||
sd_fmt = find_format_by_fourcc(dcmi, pix->pixelformat);
|
||||
if (!sd_fmt) {
|
||||
if (!dcmi->num_of_sd_formats)
|
||||
return -ENODATA;
|
||||
|
||||
sd_fmt = dcmi->sd_formats[dcmi->num_of_sd_formats - 1];
|
||||
pix->pixelformat = sd_fmt->fourcc;
|
||||
}
|
||||
|
@ -242,9 +242,14 @@ static int video_mux_probe(struct platform_device *pdev)
|
||||
vmux->active = -1;
|
||||
vmux->pads = devm_kcalloc(dev, num_pads, sizeof(*vmux->pads),
|
||||
GFP_KERNEL);
|
||||
if (!vmux->pads)
|
||||
return -ENOMEM;
|
||||
|
||||
vmux->format_mbus = devm_kcalloc(dev, num_pads,
|
||||
sizeof(*vmux->format_mbus),
|
||||
GFP_KERNEL);
|
||||
if (!vmux->format_mbus)
|
||||
return -ENOMEM;
|
||||
|
||||
for (i = 0; i < num_pads - 1; i++)
|
||||
vmux->pads[i].flags = MEDIA_PAD_FL_SINK;
|
||||
|
@ -302,6 +302,8 @@ static int vimc_probe(struct platform_device *pdev)
|
||||
|
||||
dev_dbg(&pdev->dev, "probe");
|
||||
|
||||
memset(&vimc->mdev, 0, sizeof(vimc->mdev));
|
||||
|
||||
/* Create platform_device for each entity in the topology*/
|
||||
vimc->subdevs = devm_kcalloc(&vimc->pdev.dev, vimc->pipe_cfg->num_ents,
|
||||
sizeof(*vimc->subdevs), GFP_KERNEL);
|
||||
|
@ -120,7 +120,6 @@ static int vimc_streamer_thread(void *data)
|
||||
int i;
|
||||
|
||||
set_freezable();
|
||||
set_current_state(TASK_UNINTERRUPTIBLE);
|
||||
|
||||
for (;;) {
|
||||
try_to_freeze();
|
||||
@ -137,6 +136,7 @@ static int vimc_streamer_thread(void *data)
|
||||
break;
|
||||
}
|
||||
//wait for 60hz
|
||||
set_current_state(TASK_UNINTERRUPTIBLE);
|
||||
schedule_timeout(HZ / 60);
|
||||
}
|
||||
|
||||
|
@ -1007,7 +1007,7 @@ int vivid_vid_cap_s_selection(struct file *file, void *fh, struct v4l2_selection
|
||||
v4l2_rect_map_inside(&s->r, &dev->fmt_cap_rect);
|
||||
if (dev->bitmap_cap && (compose->width != s->r.width ||
|
||||
compose->height != s->r.height)) {
|
||||
kfree(dev->bitmap_cap);
|
||||
vfree(dev->bitmap_cap);
|
||||
dev->bitmap_cap = NULL;
|
||||
}
|
||||
*compose = s->r;
|
||||
|
@ -489,7 +489,8 @@ int fmc_send_cmd(struct fmdev *fmdev, u8 fm_op, u16 type, void *payload,
|
||||
return -EIO;
|
||||
}
|
||||
/* Send response data to caller */
|
||||
if (response != NULL && response_len != NULL && evt_hdr->dlen) {
|
||||
if (response != NULL && response_len != NULL && evt_hdr->dlen &&
|
||||
evt_hdr->dlen <= payload_len) {
|
||||
/* Skip header info and copy only response data */
|
||||
skb_pull(skb, sizeof(struct fm_event_msg_hdr));
|
||||
memcpy(response, skb->data, evt_hdr->dlen);
|
||||
@ -583,6 +584,8 @@ static void fm_irq_handle_flag_getcmd_resp(struct fmdev *fmdev)
|
||||
return;
|
||||
|
||||
fm_evt_hdr = (void *)skb->data;
|
||||
if (fm_evt_hdr->dlen > sizeof(fmdev->irq_info.flag))
|
||||
return;
|
||||
|
||||
/* Skip header info and copy only response data */
|
||||
skb_pull(skb, sizeof(struct fm_event_msg_hdr));
|
||||
@ -1308,7 +1311,7 @@ static int load_default_rx_configuration(struct fmdev *fmdev)
|
||||
static int fm_power_up(struct fmdev *fmdev, u8 mode)
|
||||
{
|
||||
u16 payload;
|
||||
__be16 asic_id, asic_ver;
|
||||
__be16 asic_id = 0, asic_ver = 0;
|
||||
int resp_len, ret;
|
||||
u8 fw_name[50];
|
||||
|
||||
|
@ -774,8 +774,6 @@ static void serial_ir_exit(void)
|
||||
|
||||
static int __init serial_ir_init_module(void)
|
||||
{
|
||||
int result;
|
||||
|
||||
switch (type) {
|
||||
case IR_HOMEBREW:
|
||||
case IR_IRDEO:
|
||||
@ -803,12 +801,7 @@ static int __init serial_ir_init_module(void)
|
||||
if (sense != -1)
|
||||
sense = !!sense;
|
||||
|
||||
result = serial_ir_init();
|
||||
if (!result)
|
||||
return 0;
|
||||
|
||||
serial_ir_exit();
|
||||
return result;
|
||||
return serial_ir_init();
|
||||
}
|
||||
|
||||
static void __exit serial_ir_exit_module(void)
|
||||
|
@ -758,6 +758,9 @@ static int au0828_analog_stream_enable(struct au0828_dev *d)
|
||||
|
||||
dprintk(1, "au0828_analog_stream_enable called\n");
|
||||
|
||||
if (test_bit(DEV_DISCONNECTED, &d->dev_state))
|
||||
return -ENODEV;
|
||||
|
||||
iface = usb_ifnum_to_if(d->usbdev, 0);
|
||||
if (iface && iface->cur_altsetting->desc.bAlternateSetting != 5) {
|
||||
dprintk(1, "Changing intf#0 to alt 5\n");
|
||||
@ -839,9 +842,9 @@ int au0828_start_analog_streaming(struct vb2_queue *vq, unsigned int count)
|
||||
return rc;
|
||||
}
|
||||
|
||||
v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_stream, 1);
|
||||
|
||||
if (vq->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
|
||||
v4l2_device_call_all(&dev->v4l2_dev, 0, video,
|
||||
s_stream, 1);
|
||||
dev->vid_timeout_running = 1;
|
||||
mod_timer(&dev->vid_timeout, jiffies + (HZ / 10));
|
||||
} else if (vq->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
|
||||
@ -861,10 +864,11 @@ static void au0828_stop_streaming(struct vb2_queue *vq)
|
||||
|
||||
dprintk(1, "au0828_stop_streaming called %d\n", dev->streaming_users);
|
||||
|
||||
if (dev->streaming_users-- == 1)
|
||||
if (dev->streaming_users-- == 1) {
|
||||
au0828_uninit_isoc(dev);
|
||||
|
||||
v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_stream, 0);
|
||||
}
|
||||
|
||||
dev->vid_timeout_running = 0;
|
||||
del_timer_sync(&dev->vid_timeout);
|
||||
|
||||
@ -893,8 +897,10 @@ void au0828_stop_vbi_streaming(struct vb2_queue *vq)
|
||||
dprintk(1, "au0828_stop_vbi_streaming called %d\n",
|
||||
dev->streaming_users);
|
||||
|
||||
if (dev->streaming_users-- == 1)
|
||||
if (dev->streaming_users-- == 1) {
|
||||
au0828_uninit_isoc(dev);
|
||||
v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_stream, 0);
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&dev->slock, flags);
|
||||
if (dev->isoc_ctl.vbi_buf != NULL) {
|
||||
|
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