Merge 4.9.180 into android-4.9
Changes in 4.9.180 ext4: do not delete unlinked inode from orphan list on failed truncate KVM: x86: fix return value for reserved EFER bio: fix improper use of smp_mb__before_atomic() Revert "scsi: sd: Keep disk read-only when re-reading partition" crypto: vmx - CTR: always increment IV as quadword kvm: svm/avic: fix off-by-one in checking host APIC ID libnvdimm/namespace: Fix label tracking error arm64: Save and restore OSDLR_EL1 across suspend/resume gfs2: Fix sign extension bug in gfs2_update_stats Btrfs: do not abort transaction at btrfs_update_root() after failure to COW path Btrfs: fix race between ranged fsync and writeback of adjacent ranges btrfs: sysfs: don't leak memory when failing add fsid fbdev: fix divide error in fb_var_to_videomode hugetlb: use same fault hash key for shared and private mappings fbdev: fix WARNING in __alloc_pages_nodemask bug media: cpia2: Fix use-after-free in cpia2_exit media: vivid: use vfree() instead of kfree() for dev->bitmap_cap ssb: Fix possible NULL pointer dereference in ssb_host_pcmcia_exit at76c50x-usb: Don't register led_trigger if usb_register_driver failed perf tools: No need to include bitops.h in util.h tools include: Adopt linux/bits.h Revert "btrfs: Honour FITRIM range constraints during free space trim" gfs2: Fix lru_count going negative cxgb4: Fix error path in cxgb4_init_module mmc: core: Verify SD bus width dmaengine: tegra210-dma: free dma controller in remove() net: ena: gcc 8: fix compilation warning ASoC: hdmi-codec: unlock the device on startup errors powerpc/boot: Fix missing check of lseek() return value ASoC: imx: fix fiq dependencies spi: pxa2xx: fix SCR (divisor) calculation brcm80211: potential NULL dereference in brcmf_cfg80211_vndr_cmds_dcmd_handler() ARM: vdso: Remove dependency with the arch_timer driver internals arm64: Fix compiler warning from pte_unmap() with -Wunused-but-set-variable sched/cpufreq: Fix kobject memleak scsi: qla2xxx: Fix a qla24xx_enable_msix() error path iwlwifi: pcie: don't crash on invalid RX interrupt rtc: 88pm860x: prevent use-after-free on device remove w1: fix the resume command API dmaengine: pl330: _stop: clear interrupt status mac80211/cfg80211: update bss channel on channel switch ASoC: fsl_sai: Update is_slave_mode with correct value mwifiex: prevent an array overflow net: cw1200: fix a NULL pointer dereference crypto: sun4i-ss - Fix invalid calculation of hash end bcache: return error immediately in bch_journal_replay() bcache: fix failure in journal relplay bcache: add failure check to run_cache_set() for journal replay bcache: avoid clang -Wunintialized warning x86/build: Move _etext to actual end of .text smpboot: Place the __percpu annotation correctly x86/mm: Remove in_nmi() warning from 64-bit implementation of vmalloc_fault() mm/uaccess: Use 'unsigned long' to placate UBSAN warnings on older GCC versions HID: logitech-hidpp: use RAP instead of FAP to get the protocol version pinctrl: pistachio: fix leaked of_node references dmaengine: at_xdmac: remove BUG_ON macro in tasklet media: coda: clear error return value before picture run media: ov6650: Move v4l2_clk_get() to ov6650_video_probe() helper media: au0828: stop video streaming only when last user stops media: ov2659: make S_FMT succeed even if requested format doesn't match audit: fix a memory leak bug media: au0828: Fix NULL pointer dereference in au0828_analog_stream_enable() media: pvrusb2: Prevent a buffer overflow powerpc/numa: improve control of topology updates sched/core: Check quota and period overflow at usec to nsec conversion sched/core: Handle overflow in cpu_shares_write_u64 USB: core: Don't unbind interfaces following device reset failure x86/irq/64: Limit IST stack overflow check to #DB stack i40e: don't allow changes to HW VLAN stripping on active port VLANs arm64: vdso: Fix clock_getres() for CLOCK_REALTIME RDMA/cxgb4: Fix null pointer dereference on alloc_skb failure hwmon: (vt1211) Use request_muxed_region for Super-IO accesses hwmon: (smsc47m1) Use request_muxed_region for Super-IO accesses hwmon: (smsc47b397) Use request_muxed_region for Super-IO accesses hwmon: (pc87427) Use request_muxed_region for Super-IO accesses hwmon: (f71805f) Use request_muxed_region for Super-IO accesses scsi: libsas: Do discovery on empty PHY to update PHY info mmc: core: make pwrseq_emmc (partially) support sleepy GPIO controllers mmc_spi: add a status check for spi_sync_locked mmc: sdhci-of-esdhc: add erratum eSDHC5 support mmc: sdhci-of-esdhc: add erratum eSDHC-A001 and A-008358 support PM / core: Propagate dev->power.wakeup_path when no callbacks extcon: arizona: Disable mic detect if running when driver is removed s390: cio: fix cio_irb declaration cpufreq: ppc_cbe: fix possible object reference leak cpufreq/pasemi: fix possible object reference leak cpufreq: pmac32: fix possible object reference leak x86/build: Keep local relocations with ld.lld iio: ad_sigma_delta: Properly handle SPI bus locking vs CS assertion iio: hmc5843: fix potential NULL pointer dereferences iio: common: ssp_sensors: Initialize calculated_time in ssp_common_process_data rtlwifi: fix a potential NULL pointer dereference mwifiex: Fix mem leak in mwifiex_tm_cmd brcmfmac: fix missing checks for kmemdup b43: shut up clang -Wuninitialized variable warning brcmfmac: convert dev_init_lock mutex to completion brcmfmac: fix race during disconnect when USB completion is in progress brcmfmac: fix Oops when bringing up interface during USB disconnect scsi: ufs: Fix regulator load and icc-level configuration scsi: ufs: Avoid configuring regulator with undefined voltage range arm64: cpu_ops: fix a leaked reference by adding missing of_node_put x86/uaccess, signal: Fix AC=1 bloat x86/ia32: Fix ia32_restore_sigcontext() AC leak chardev: add additional check for minor range overlap HID: core: move Usage Page concatenation to Main item ASoC: eukrea-tlv320: fix a leaked reference by adding missing of_node_put ASoC: fsl_utils: fix a leaked reference by adding missing of_node_put cxgb3/l2t: Fix undefined behaviour spi: tegra114: reset controller on probe media: wl128x: prevent two potential buffer overflows virtio_console: initialize vtermno value for ports tty: ipwireless: fix missing checks for ioremap x86/mce: Fix machine_check_poll() tests for error types rcutorture: Fix cleanup path for invalid torture_type strings rcuperf: Fix cleanup path for invalid perf_type strings usb: core: Add PM runtime calls to usb_hcd_platform_shutdown scsi: qla4xxx: avoid freeing unallocated dma memory dmaengine: tegra210-adma: use devm_clk_*() helpers media: m88ds3103: serialize reset messages in m88ds3103_set_frontend media: go7007: avoid clang frame overflow warning with KASAN scsi: lpfc: Fix FDMI manufacturer attribute value media: saa7146: avoid high stack usage with clang scsi: lpfc: Fix SLI3 commands being issued on SLI4 devices spi : spi-topcliff-pch: Fix to handle empty DMA buffers spi: rspi: Fix sequencer reset during initialization spi: Fix zero length xfer bug ASoC: davinci-mcasp: Fix clang warning without CONFIG_PM drm: Wake up next in drm_read() chain if we are forced to putback the event Linux 4.9.180 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
2
Makefile
2
Makefile
@@ -1,6 +1,6 @@
|
||||
VERSION = 4
|
||||
PATCHLEVEL = 9
|
||||
SUBLEVEL = 179
|
||||
SUBLEVEL = 180
|
||||
EXTRAVERSION =
|
||||
NAME = Roaring Lionus
|
||||
|
||||
|
||||
@@ -67,6 +67,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;
|
||||
|
||||
|
||||
@@ -413,6 +413,8 @@ static inline phys_addr_t pmd_page_paddr(pmd_t pmd)
|
||||
return pmd_val(pmd) & PHYS_MASK & (s32)PAGE_MASK;
|
||||
}
|
||||
|
||||
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))
|
||||
|
||||
@@ -421,7 +423,6 @@ static inline phys_addr_t pmd_page_paddr(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__ */
|
||||
|
||||
@@ -94,7 +94,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("%s: missing enable-method property\n",
|
||||
dn->full_name);
|
||||
}
|
||||
of_node_put(dn);
|
||||
} else {
|
||||
enable_method = acpi_get_enable_method(cpu);
|
||||
if (!enable_method) {
|
||||
|
||||
@@ -217,6 +217,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)
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -1574,6 +1574,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;
|
||||
@@ -1603,6 +1606,9 @@ int stop_topology_update(void)
|
||||
{
|
||||
int rc = 0;
|
||||
|
||||
if (!topology_updates_enabled)
|
||||
return 0;
|
||||
|
||||
if (prrn_enabled) {
|
||||
prrn_enabled = 0;
|
||||
#ifdef CONFIG_SMP
|
||||
@@ -1648,11 +1654,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;
|
||||
@@ -1667,9 +1675,7 @@ 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();
|
||||
start_topology_update();
|
||||
|
||||
if (!proc_create("powerpc/topology_updates", 0644, NULL, &topology_ops))
|
||||
return -ENOMEM;
|
||||
|
||||
@@ -47,7 +47,7 @@ export REALMODE_CFLAGS
|
||||
export BITS
|
||||
|
||||
ifdef CONFIG_X86_NEED_RELOCS
|
||||
LDFLAGS_vmlinux := --emit-relocs
|
||||
LDFLAGS_vmlinux := --emit-relocs --discard-none
|
||||
endif
|
||||
|
||||
#
|
||||
|
||||
@@ -60,9 +60,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); \
|
||||
}
|
||||
@@ -71,6 +70,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;
|
||||
|
||||
@@ -78,16 +78,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);
|
||||
@@ -105,6 +99,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();
|
||||
|
||||
@@ -673,20 +673,50 @@ 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 & (mca_cfg.ser ? MCI_STATUS_S : MCI_STATUS_UC)))
|
||||
continue;
|
||||
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.
|
||||
*/
|
||||
continue;
|
||||
|
||||
log_it:
|
||||
error_seen = true;
|
||||
|
||||
mce_read_aux(&m, i);
|
||||
|
||||
@@ -25,9 +25,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)
|
||||
{
|
||||
@@ -52,8 +61,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;
|
||||
|
||||
|
||||
@@ -129,16 +129,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 */
|
||||
@@ -147,6 +137,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();
|
||||
@@ -458,6 +457,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);
|
||||
@@ -470,9 +470,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);
|
||||
|
||||
@@ -538,6 +540,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;
|
||||
@@ -552,9 +555,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);
|
||||
|
||||
@@ -111,11 +111,11 @@ SECTIONS
|
||||
*(.text.__x86.indirect_thunk)
|
||||
__indirect_thunk_end = .;
|
||||
#endif
|
||||
|
||||
/* End of text section */
|
||||
_etext = .;
|
||||
} :text = 0x9090
|
||||
|
||||
/* End of text section */
|
||||
_etext = .;
|
||||
|
||||
NOTES :text :note
|
||||
|
||||
EXCEPTION_TABLE(16) :text = 0x9090
|
||||
|
||||
@@ -1518,7 +1518,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));
|
||||
|
||||
@@ -1109,7 +1109,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))
|
||||
|
||||
@@ -430,8 +430,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
|
||||
|
||||
@@ -1388,6 +1388,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);
|
||||
|
||||
@@ -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);
|
||||
@@ -1425,6 +1425,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 };
|
||||
|
||||
@@ -1171,6 +1171,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;
|
||||
}
|
||||
|
||||
|
||||
@@ -449,6 +449,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())
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -551,6 +551,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;
|
||||
@@ -587,6 +588,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;
|
||||
}
|
||||
|
||||
|
||||
@@ -250,7 +250,10 @@ static int sun4i_hash(struct ahash_request *areq)
|
||||
}
|
||||
} else {
|
||||
/* Since we have the flag final, we can go up to modulo 4 */
|
||||
end = ((areq->nbytes + op->len) / 4) * 4 - op->len;
|
||||
if (areq->nbytes < 4)
|
||||
end = 0;
|
||||
else
|
||||
end = ((areq->nbytes + op->len) / 4) * 4 - op->len;
|
||||
}
|
||||
|
||||
/* TODO if SGlen % 4 and op->len == 0 then DMA */
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1608,7 +1608,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;
|
||||
|
||||
|
||||
@@ -1020,6 +1020,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);
|
||||
@@ -1032,10 +1033,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;
|
||||
}
|
||||
|
||||
@@ -1684,6 +1684,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);
|
||||
|
||||
|
||||
@@ -515,6 +515,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;
|
||||
}
|
||||
|
||||
|
||||
@@ -200,13 +200,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;
|
||||
@@ -463,10 +464,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:
|
||||
|
||||
@@ -475,9 +473,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;
|
||||
|
||||
@@ -488,9 +483,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) {
|
||||
/*
|
||||
@@ -510,7 +502,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;
|
||||
}
|
||||
@@ -524,6 +516,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.
|
||||
*/
|
||||
@@ -533,6 +541,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) {
|
||||
@@ -746,6 +756,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) {
|
||||
|
||||
@@ -449,13 +449,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;
|
||||
@@ -475,8 +478,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;
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
superio_select();
|
||||
|
||||
pr_info("Disabling device\n");
|
||||
superio_outb(SUPERIO_REG_ACT, sio_data->activate);
|
||||
|
||||
superio_exit();
|
||||
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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -80,7 +80,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);
|
||||
}
|
||||
|
||||
|
||||
@@ -455,6 +455,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;
|
||||
|
||||
@@ -322,10 +322,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);
|
||||
|
||||
@@ -309,6 +309,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;
|
||||
@@ -322,9 +334,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)",
|
||||
n, i->j.seq - 1, start, end);
|
||||
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);
|
||||
|
||||
@@ -1561,7 +1561,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;
|
||||
@@ -1653,7 +1653,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");
|
||||
|
||||
@@ -1721,11 +1723,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)
|
||||
@@ -1789,8 +1793,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:
|
||||
|
||||
@@ -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->code = ov2659_formats[index].code;
|
||||
|
||||
@@ -840,9 +840,16 @@ 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);
|
||||
|
||||
@@ -879,6 +886,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;
|
||||
}
|
||||
|
||||
@@ -1035,18 +1047,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");
|
||||
|
||||
@@ -1829,6 +1829,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);
|
||||
|
||||
@@ -984,7 +984,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;
|
||||
|
||||
@@ -494,7 +494,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);
|
||||
@@ -590,6 +591,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));
|
||||
@@ -1315,7 +1318,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];
|
||||
|
||||
|
||||
@@ -764,6 +764,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");
|
||||
@@ -852,9 +855,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) {
|
||||
@@ -874,10 +877,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);
|
||||
}
|
||||
|
||||
v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_stream, 0);
|
||||
dev->vid_timeout_running = 0;
|
||||
del_timer_sync(&dev->vid_timeout);
|
||||
|
||||
@@ -906,8 +910,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) {
|
||||
|
||||
@@ -1248,8 +1248,7 @@ static int __init cpia2_init(void)
|
||||
LOG("%s v%s\n",
|
||||
ABOUT, CPIA_VERSION);
|
||||
check_parameters();
|
||||
cpia2_usb_init();
|
||||
return 0;
|
||||
return cpia2_usb_init();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1499,8 +1499,8 @@ static int modet_to_package(struct go7007 *go, __le16 *code, int space)
|
||||
return cnt;
|
||||
}
|
||||
|
||||
static int do_special(struct go7007 *go, u16 type, __le16 *code, int space,
|
||||
int *framelen)
|
||||
static noinline_for_stack int do_special(struct go7007 *go, u16 type,
|
||||
__le16 *code, int space, int *framelen)
|
||||
{
|
||||
switch (type) {
|
||||
case SPECIAL_FRM_HEAD:
|
||||
|
||||
@@ -670,6 +670,8 @@ static int ctrl_get_input(struct pvr2_ctrl *cptr,int *vp)
|
||||
|
||||
static int ctrl_check_input(struct pvr2_ctrl *cptr,int v)
|
||||
{
|
||||
if (v < 0 || v > PVR2_CVAL_INPUT_MAX)
|
||||
return 0;
|
||||
return ((1 << v) & cptr->hdw->input_allowed_mask) != 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -54,6 +54,7 @@
|
||||
#define PVR2_CVAL_INPUT_COMPOSITE 2
|
||||
#define PVR2_CVAL_INPUT_SVIDEO 3
|
||||
#define PVR2_CVAL_INPUT_RADIO 4
|
||||
#define PVR2_CVAL_INPUT_MAX PVR2_CVAL_INPUT_RADIO
|
||||
|
||||
enum pvr2_config {
|
||||
pvr2_config_empty, /* No configuration */
|
||||
|
||||
@@ -30,19 +30,14 @@ struct mmc_pwrseq_emmc {
|
||||
|
||||
#define to_pwrseq_emmc(p) container_of(p, struct mmc_pwrseq_emmc, pwrseq)
|
||||
|
||||
static void __mmc_pwrseq_emmc_reset(struct mmc_pwrseq_emmc *pwrseq)
|
||||
{
|
||||
gpiod_set_value(pwrseq->reset_gpio, 1);
|
||||
udelay(1);
|
||||
gpiod_set_value(pwrseq->reset_gpio, 0);
|
||||
udelay(200);
|
||||
}
|
||||
|
||||
static void mmc_pwrseq_emmc_reset(struct mmc_host *host)
|
||||
{
|
||||
struct mmc_pwrseq_emmc *pwrseq = to_pwrseq_emmc(host->pwrseq);
|
||||
|
||||
__mmc_pwrseq_emmc_reset(pwrseq);
|
||||
gpiod_set_value_cansleep(pwrseq->reset_gpio, 1);
|
||||
udelay(1);
|
||||
gpiod_set_value_cansleep(pwrseq->reset_gpio, 0);
|
||||
udelay(200);
|
||||
}
|
||||
|
||||
static int mmc_pwrseq_emmc_reset_nb(struct notifier_block *this,
|
||||
@@ -50,8 +45,11 @@ static int mmc_pwrseq_emmc_reset_nb(struct notifier_block *this,
|
||||
{
|
||||
struct mmc_pwrseq_emmc *pwrseq = container_of(this,
|
||||
struct mmc_pwrseq_emmc, reset_nb);
|
||||
gpiod_set_value(pwrseq->reset_gpio, 1);
|
||||
udelay(1);
|
||||
gpiod_set_value(pwrseq->reset_gpio, 0);
|
||||
udelay(200);
|
||||
|
||||
__mmc_pwrseq_emmc_reset(pwrseq);
|
||||
return NOTIFY_DONE;
|
||||
}
|
||||
|
||||
@@ -72,14 +70,18 @@ static int mmc_pwrseq_emmc_probe(struct platform_device *pdev)
|
||||
if (IS_ERR(pwrseq->reset_gpio))
|
||||
return PTR_ERR(pwrseq->reset_gpio);
|
||||
|
||||
/*
|
||||
* register reset handler to ensure emmc reset also from
|
||||
* emergency_reboot(), priority 255 is the highest priority
|
||||
* so it will be executed before any system reboot handler.
|
||||
*/
|
||||
pwrseq->reset_nb.notifier_call = mmc_pwrseq_emmc_reset_nb;
|
||||
pwrseq->reset_nb.priority = 255;
|
||||
register_restart_handler(&pwrseq->reset_nb);
|
||||
if (!gpiod_cansleep(pwrseq->reset_gpio)) {
|
||||
/*
|
||||
* register reset handler to ensure emmc reset also from
|
||||
* emergency_reboot(), priority 255 is the highest priority
|
||||
* so it will be executed before any system reboot handler.
|
||||
*/
|
||||
pwrseq->reset_nb.notifier_call = mmc_pwrseq_emmc_reset_nb;
|
||||
pwrseq->reset_nb.priority = 255;
|
||||
register_restart_handler(&pwrseq->reset_nb);
|
||||
} else {
|
||||
dev_notice(dev, "EMMC reset pin tied to a sleepy GPIO driver; reset on emergency-reboot disabled\n");
|
||||
}
|
||||
|
||||
pwrseq->pwrseq.ops = &mmc_pwrseq_emmc_ops;
|
||||
pwrseq->pwrseq.dev = dev;
|
||||
|
||||
@@ -214,6 +214,14 @@ static int mmc_decode_scr(struct mmc_card *card)
|
||||
|
||||
if (scr->sda_spec3)
|
||||
scr->cmds = UNSTUFF_BITS(resp, 32, 2);
|
||||
|
||||
/* SD Spec says: any SD Card shall set at least bits 0 and 2 */
|
||||
if (!(scr->bus_widths & SD_SCR_BUS_WIDTH_1) ||
|
||||
!(scr->bus_widths & SD_SCR_BUS_WIDTH_4)) {
|
||||
pr_err("%s: invalid bus width\n", mmc_hostname(card->host));
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -819,6 +819,10 @@ mmc_spi_readblock(struct mmc_spi_host *host, struct spi_transfer *t,
|
||||
}
|
||||
|
||||
status = spi_sync_locked(spi, &host->m);
|
||||
if (status < 0) {
|
||||
dev_dbg(&spi->dev, "read error %d\n", status);
|
||||
return status;
|
||||
}
|
||||
|
||||
if (host->dma_dev) {
|
||||
dma_sync_single_for_cpu(host->dma_dev,
|
||||
|
||||
@@ -636,6 +636,11 @@ static int sdhci_esdhc_probe(struct platform_device *pdev)
|
||||
if (esdhc->vendor_ver > VENDOR_V_22)
|
||||
host->quirks &= ~SDHCI_QUIRK_NO_BUSY_IRQ;
|
||||
|
||||
if (of_find_compatible_node(NULL, NULL, "fsl,p2020-esdhc")) {
|
||||
host->quirks2 |= SDHCI_QUIRK_RESET_AFTER_REQUEST;
|
||||
host->quirks2 |= SDHCI_QUIRK_BROKEN_TIMEOUT_VAL;
|
||||
}
|
||||
|
||||
if (of_device_is_compatible(np, "fsl,p5040-esdhc") ||
|
||||
of_device_is_compatible(np, "fsl,p5020-esdhc") ||
|
||||
of_device_is_compatible(np, "fsl,p4080-esdhc") ||
|
||||
|
||||
@@ -2116,7 +2116,7 @@ static void ena_config_host_info(struct ena_com_dev *ena_dev)
|
||||
|
||||
host_info->os_type = ENA_ADMIN_OS_LINUX;
|
||||
host_info->kernel_ver = LINUX_VERSION_CODE;
|
||||
strncpy(host_info->kernel_ver_str, utsname()->version,
|
||||
strlcpy(host_info->kernel_ver_str, utsname()->version,
|
||||
sizeof(host_info->kernel_ver_str) - 1);
|
||||
host_info->os_dist = 0;
|
||||
strncpy(host_info->os_dist_str, utsname()->release,
|
||||
|
||||
@@ -75,8 +75,8 @@ struct l2t_data {
|
||||
struct l2t_entry *rover; /* starting point for next allocation */
|
||||
atomic_t nfree; /* number of free entries */
|
||||
rwlock_t lock;
|
||||
struct l2t_entry l2tab[0];
|
||||
struct rcu_head rcu_head; /* to handle rcu cleanup */
|
||||
struct l2t_entry l2tab[];
|
||||
};
|
||||
|
||||
typedef void (*arp_failure_handler_func)(struct t3cdev * dev,
|
||||
|
||||
@@ -5203,15 +5203,24 @@ static int __init cxgb4_init_module(void)
|
||||
|
||||
ret = pci_register_driver(&cxgb4_driver);
|
||||
if (ret < 0)
|
||||
debugfs_remove(cxgb4_debugfs_root);
|
||||
goto err_pci;
|
||||
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
if (!inet6addr_registered) {
|
||||
register_inet6addr_notifier(&cxgb4_inet6addr_notifier);
|
||||
inet6addr_registered = true;
|
||||
ret = register_inet6addr_notifier(&cxgb4_inet6addr_notifier);
|
||||
if (ret)
|
||||
pci_unregister_driver(&cxgb4_driver);
|
||||
else
|
||||
inet6addr_registered = true;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (ret == 0)
|
||||
return ret;
|
||||
|
||||
err_pci:
|
||||
debugfs_remove(cxgb4_debugfs_root);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -2285,6 +2285,10 @@ void i40e_vlan_stripping_enable(struct i40e_vsi *vsi)
|
||||
struct i40e_vsi_context ctxt;
|
||||
i40e_status ret;
|
||||
|
||||
/* Don't modify stripping options if a port VLAN is active */
|
||||
if (vsi->info.pvid)
|
||||
return;
|
||||
|
||||
if ((vsi->info.valid_sections &
|
||||
cpu_to_le16(I40E_AQ_VSI_PROP_VLAN_VALID)) &&
|
||||
((vsi->info.port_vlan_flags & I40E_AQ_VSI_PVLAN_MODE_MASK) == 0))
|
||||
@@ -2315,6 +2319,10 @@ void i40e_vlan_stripping_disable(struct i40e_vsi *vsi)
|
||||
struct i40e_vsi_context ctxt;
|
||||
i40e_status ret;
|
||||
|
||||
/* Don't modify stripping options if a port VLAN is active */
|
||||
if (vsi->info.pvid)
|
||||
return;
|
||||
|
||||
if ((vsi->info.valid_sections &
|
||||
cpu_to_le16(I40E_AQ_VSI_PROP_VLAN_VALID)) &&
|
||||
((vsi->info.port_vlan_flags & I40E_AQ_VSI_PVLAN_EMOD_MASK) ==
|
||||
|
||||
@@ -2583,8 +2583,8 @@ static int __init at76_mod_init(void)
|
||||
if (result < 0)
|
||||
printk(KERN_ERR DRIVER_NAME
|
||||
": usb_register failed (status %d)\n", result);
|
||||
|
||||
led_trigger_register_simple("at76_usb-tx", &ledtrig_tx);
|
||||
else
|
||||
led_trigger_register_simple("at76_usb-tx", &ledtrig_tx);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
@@ -1834,7 +1834,7 @@ static void lpphy_papd_cal(struct b43_wldev *dev, struct lpphy_tx_gains gains,
|
||||
static void lpphy_papd_cal_txpwr(struct b43_wldev *dev)
|
||||
{
|
||||
struct b43_phy_lp *lpphy = dev->phy.lp;
|
||||
struct lpphy_tx_gains gains, oldgains;
|
||||
struct lpphy_tx_gains oldgains;
|
||||
int old_txpctl, old_afe_ovr, old_rf, old_bbmult;
|
||||
|
||||
lpphy_read_tx_pctl_mode_from_hardware(dev);
|
||||
@@ -1848,9 +1848,9 @@ static void lpphy_papd_cal_txpwr(struct b43_wldev *dev)
|
||||
lpphy_set_tx_power_control(dev, B43_LPPHY_TXPCTL_OFF);
|
||||
|
||||
if (dev->dev->chip_id == 0x4325 && dev->dev->chip_rev == 0)
|
||||
lpphy_papd_cal(dev, gains, 0, 1, 30);
|
||||
lpphy_papd_cal(dev, oldgains, 0, 1, 30);
|
||||
else
|
||||
lpphy_papd_cal(dev, gains, 0, 1, 65);
|
||||
lpphy_papd_cal(dev, oldgains, 0, 1, 65);
|
||||
|
||||
if (old_afe_ovr)
|
||||
lpphy_set_tx_gains(dev, oldgains);
|
||||
|
||||
@@ -5374,6 +5374,8 @@ static s32 brcmf_get_assoc_ies(struct brcmf_cfg80211_info *cfg,
|
||||
conn_info->req_ie =
|
||||
kmemdup(cfg->extra_buf, conn_info->req_ie_len,
|
||||
GFP_KERNEL);
|
||||
if (!conn_info->req_ie)
|
||||
conn_info->req_ie_len = 0;
|
||||
} else {
|
||||
conn_info->req_ie_len = 0;
|
||||
conn_info->req_ie = NULL;
|
||||
@@ -5390,6 +5392,8 @@ static s32 brcmf_get_assoc_ies(struct brcmf_cfg80211_info *cfg,
|
||||
conn_info->resp_ie =
|
||||
kmemdup(cfg->extra_buf, conn_info->resp_ie_len,
|
||||
GFP_KERNEL);
|
||||
if (!conn_info->resp_ie)
|
||||
conn_info->resp_ie_len = 0;
|
||||
} else {
|
||||
conn_info->resp_ie_len = 0;
|
||||
conn_info->resp_ie = NULL;
|
||||
|
||||
@@ -685,17 +685,17 @@ static void brcmf_del_if(struct brcmf_pub *drvr, s32 bsscfgidx,
|
||||
bool rtnl_locked)
|
||||
{
|
||||
struct brcmf_if *ifp;
|
||||
int ifidx;
|
||||
|
||||
ifp = drvr->iflist[bsscfgidx];
|
||||
drvr->iflist[bsscfgidx] = NULL;
|
||||
if (!ifp) {
|
||||
brcmf_err("Null interface, bsscfgidx=%d\n", bsscfgidx);
|
||||
return;
|
||||
}
|
||||
brcmf_dbg(TRACE, "Enter, bsscfgidx=%d, ifidx=%d\n", bsscfgidx,
|
||||
ifp->ifidx);
|
||||
if (drvr->if2bss[ifp->ifidx] == bsscfgidx)
|
||||
drvr->if2bss[ifp->ifidx] = BRCMF_BSSIDX_INVALID;
|
||||
ifidx = ifp->ifidx;
|
||||
|
||||
if (ifp->ndev) {
|
||||
if (bsscfgidx == 0) {
|
||||
if (ifp->ndev->netdev_ops == &brcmf_netdev_ops_pri) {
|
||||
@@ -723,6 +723,10 @@ static void brcmf_del_if(struct brcmf_pub *drvr, s32 bsscfgidx,
|
||||
brcmf_p2p_ifp_removed(ifp, rtnl_locked);
|
||||
kfree(ifp);
|
||||
}
|
||||
|
||||
drvr->iflist[bsscfgidx] = NULL;
|
||||
if (drvr->if2bss[ifidx] == bsscfgidx)
|
||||
drvr->if2bss[ifidx] = BRCMF_BSSIDX_INVALID;
|
||||
}
|
||||
|
||||
void brcmf_remove_interface(struct brcmf_if *ifp, bool rtnl_locked)
|
||||
|
||||
@@ -157,7 +157,7 @@ struct brcmf_usbdev_info {
|
||||
|
||||
struct usb_device *usbdev;
|
||||
struct device *dev;
|
||||
struct mutex dev_init_lock;
|
||||
struct completion dev_init_done;
|
||||
|
||||
int ctl_in_pipe, ctl_out_pipe;
|
||||
struct urb *ctl_urb; /* URB for control endpoint */
|
||||
@@ -681,12 +681,18 @@ static int brcmf_usb_up(struct device *dev)
|
||||
|
||||
static void brcmf_cancel_all_urbs(struct brcmf_usbdev_info *devinfo)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (devinfo->ctl_urb)
|
||||
usb_kill_urb(devinfo->ctl_urb);
|
||||
if (devinfo->bulk_urb)
|
||||
usb_kill_urb(devinfo->bulk_urb);
|
||||
brcmf_usb_free_q(&devinfo->tx_postq, true);
|
||||
brcmf_usb_free_q(&devinfo->rx_postq, true);
|
||||
if (devinfo->tx_reqs)
|
||||
for (i = 0; i < devinfo->bus_pub.ntxq; i++)
|
||||
usb_kill_urb(devinfo->tx_reqs[i].urb);
|
||||
if (devinfo->rx_reqs)
|
||||
for (i = 0; i < devinfo->bus_pub.nrxq; i++)
|
||||
usb_kill_urb(devinfo->rx_reqs[i].urb);
|
||||
}
|
||||
|
||||
static void brcmf_usb_down(struct device *dev)
|
||||
@@ -1189,11 +1195,11 @@ static void brcmf_usb_probe_phase2(struct device *dev, int ret,
|
||||
if (ret)
|
||||
goto error;
|
||||
|
||||
mutex_unlock(&devinfo->dev_init_lock);
|
||||
complete(&devinfo->dev_init_done);
|
||||
return;
|
||||
error:
|
||||
brcmf_dbg(TRACE, "failed: dev=%s, err=%d\n", dev_name(dev), ret);
|
||||
mutex_unlock(&devinfo->dev_init_lock);
|
||||
complete(&devinfo->dev_init_done);
|
||||
device_release_driver(dev);
|
||||
}
|
||||
|
||||
@@ -1239,7 +1245,7 @@ static int brcmf_usb_probe_cb(struct brcmf_usbdev_info *devinfo)
|
||||
if (ret)
|
||||
goto fail;
|
||||
/* we are done */
|
||||
mutex_unlock(&devinfo->dev_init_lock);
|
||||
complete(&devinfo->dev_init_done);
|
||||
return 0;
|
||||
}
|
||||
bus->chip = bus_pub->devid;
|
||||
@@ -1300,11 +1306,10 @@ brcmf_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||
|
||||
devinfo->usbdev = usb;
|
||||
devinfo->dev = &usb->dev;
|
||||
/* Take an init lock, to protect for disconnect while still loading.
|
||||
/* Init completion, to protect for disconnect while still loading.
|
||||
* Necessary because of the asynchronous firmware load construction
|
||||
*/
|
||||
mutex_init(&devinfo->dev_init_lock);
|
||||
mutex_lock(&devinfo->dev_init_lock);
|
||||
init_completion(&devinfo->dev_init_done);
|
||||
|
||||
usb_set_intfdata(intf, devinfo);
|
||||
|
||||
@@ -1382,7 +1387,7 @@ brcmf_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
mutex_unlock(&devinfo->dev_init_lock);
|
||||
complete(&devinfo->dev_init_done);
|
||||
kfree(devinfo);
|
||||
usb_set_intfdata(intf, NULL);
|
||||
return ret;
|
||||
@@ -1397,7 +1402,7 @@ brcmf_usb_disconnect(struct usb_interface *intf)
|
||||
devinfo = (struct brcmf_usbdev_info *)usb_get_intfdata(intf);
|
||||
|
||||
if (devinfo) {
|
||||
mutex_lock(&devinfo->dev_init_lock);
|
||||
wait_for_completion(&devinfo->dev_init_done);
|
||||
/* Make sure that devinfo still exists. Firmware probe routines
|
||||
* may have released the device and cleared the intfdata.
|
||||
*/
|
||||
|
||||
@@ -35,9 +35,10 @@ static int brcmf_cfg80211_vndr_cmds_dcmd_handler(struct wiphy *wiphy,
|
||||
struct brcmf_if *ifp;
|
||||
const struct brcmf_vndr_dcmd_hdr *cmdhdr = data;
|
||||
struct sk_buff *reply;
|
||||
int ret, payload, ret_len;
|
||||
unsigned int payload, ret_len;
|
||||
void *dcmd_buf = NULL, *wr_pointer;
|
||||
u16 msglen, maxmsglen = PAGE_SIZE - 0x100;
|
||||
int ret;
|
||||
|
||||
if (len < sizeof(*cmdhdr)) {
|
||||
brcmf_err("vendor command too short: %d\n", len);
|
||||
@@ -65,7 +66,7 @@ static int brcmf_cfg80211_vndr_cmds_dcmd_handler(struct wiphy *wiphy,
|
||||
brcmf_err("oversize return buffer %d\n", ret_len);
|
||||
ret_len = BRCMF_DCMD_MAXLEN;
|
||||
}
|
||||
payload = max(ret_len, len) + 1;
|
||||
payload = max_t(unsigned int, ret_len, len) + 1;
|
||||
dcmd_buf = vzalloc(payload);
|
||||
if (NULL == dcmd_buf)
|
||||
return -ENOMEM;
|
||||
|
||||
@@ -1225,10 +1225,15 @@ static void iwl_pcie_rx_handle_rb(struct iwl_trans *trans,
|
||||
static void iwl_pcie_rx_handle(struct iwl_trans *trans, int queue)
|
||||
{
|
||||
struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
|
||||
struct iwl_rxq *rxq = &trans_pcie->rxq[queue];
|
||||
struct iwl_rxq *rxq;
|
||||
u32 r, i, count = 0;
|
||||
bool emergency = false;
|
||||
|
||||
if (WARN_ON_ONCE(!trans_pcie->rxq || !trans_pcie->rxq[queue].bd))
|
||||
return;
|
||||
|
||||
rxq = &trans_pcie->rxq[queue];
|
||||
|
||||
restart:
|
||||
spin_lock(&rxq->lock);
|
||||
/* uCode's read index (stored in shared DRAM) indicates the last Rx
|
||||
|
||||
@@ -4018,16 +4018,20 @@ static int mwifiex_tm_cmd(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
|
||||
if (mwifiex_send_cmd(priv, 0, 0, 0, hostcmd, true)) {
|
||||
dev_err(priv->adapter->dev, "Failed to process hostcmd\n");
|
||||
kfree(hostcmd);
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
/* process hostcmd response*/
|
||||
skb = cfg80211_testmode_alloc_reply_skb(wiphy, hostcmd->len);
|
||||
if (!skb)
|
||||
if (!skb) {
|
||||
kfree(hostcmd);
|
||||
return -ENOMEM;
|
||||
}
|
||||
err = nla_put(skb, MWIFIEX_TM_ATTR_DATA,
|
||||
hostcmd->len, hostcmd->cmd);
|
||||
if (err) {
|
||||
kfree(hostcmd);
|
||||
kfree_skb(skb);
|
||||
return -EMSGSIZE;
|
||||
}
|
||||
|
||||
@@ -533,5 +533,8 @@ u8 mwifiex_adjust_data_rate(struct mwifiex_private *priv,
|
||||
rate_index = (rx_rate > MWIFIEX_RATE_INDEX_OFDM0) ?
|
||||
rx_rate - 1 : rx_rate;
|
||||
|
||||
if (rate_index >= MWIFIEX_MAX_AC_RX_RATES)
|
||||
rate_index = MWIFIEX_MAX_AC_RX_RATES - 1;
|
||||
|
||||
return rate_index;
|
||||
}
|
||||
|
||||
@@ -466,6 +466,11 @@ static void _rtl_init_deferred_work(struct ieee80211_hw *hw)
|
||||
/* <2> work queue */
|
||||
rtlpriv->works.hw = hw;
|
||||
rtlpriv->works.rtl_wq = alloc_workqueue("%s", 0, 0, rtlpriv->cfg->name);
|
||||
if (unlikely(!rtlpriv->works.rtl_wq)) {
|
||||
pr_err("Failed to allocate work queue\n");
|
||||
return;
|
||||
}
|
||||
|
||||
INIT_DELAYED_WORK(&rtlpriv->works.watchdog_wq,
|
||||
(void *)rtl_watchdog_wq_callback);
|
||||
INIT_DELAYED_WORK(&rtlpriv->works.ips_nic_off_wq,
|
||||
|
||||
@@ -345,6 +345,11 @@ static struct ieee80211_hw *cw1200_init_common(const u8 *macaddr,
|
||||
mutex_init(&priv->wsm_cmd_mux);
|
||||
mutex_init(&priv->conf_mutex);
|
||||
priv->workqueue = create_singlethread_workqueue("cw1200_wq");
|
||||
if (!priv->workqueue) {
|
||||
ieee80211_free_hw(hw);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
sema_init(&priv->scan.lock, 1);
|
||||
INIT_WORK(&priv->scan.work, cw1200_scan_work);
|
||||
INIT_DELAYED_WORK(&priv->scan.probe_work, cw1200_probe_work);
|
||||
|
||||
@@ -490,15 +490,26 @@ static unsigned long nd_label_offset(struct nvdimm_drvdata *ndd,
|
||||
- (unsigned long) to_namespace_index(ndd, 0);
|
||||
}
|
||||
|
||||
static void reap_victim(struct nd_mapping *nd_mapping,
|
||||
struct nd_label_ent *victim)
|
||||
{
|
||||
struct nvdimm_drvdata *ndd = to_ndd(nd_mapping);
|
||||
u32 slot = to_slot(ndd, victim->label);
|
||||
|
||||
dev_dbg(ndd->dev, "free: %d\n", slot);
|
||||
nd_label_free_slot(ndd, slot);
|
||||
victim->label = NULL;
|
||||
}
|
||||
|
||||
static int __pmem_label_update(struct nd_region *nd_region,
|
||||
struct nd_mapping *nd_mapping, struct nd_namespace_pmem *nspm,
|
||||
int pos, unsigned long flags)
|
||||
{
|
||||
u64 cookie = nd_region_interleave_set_cookie(nd_region);
|
||||
struct nvdimm_drvdata *ndd = to_ndd(nd_mapping);
|
||||
struct nd_label_ent *label_ent, *victim = NULL;
|
||||
struct nd_namespace_label *nd_label;
|
||||
struct nd_namespace_index *nsindex;
|
||||
struct nd_label_ent *label_ent;
|
||||
struct nd_label_id label_id;
|
||||
struct resource *res;
|
||||
unsigned long *free;
|
||||
@@ -551,18 +562,10 @@ static int __pmem_label_update(struct nd_region *nd_region,
|
||||
list_for_each_entry(label_ent, &nd_mapping->labels, list) {
|
||||
if (!label_ent->label)
|
||||
continue;
|
||||
if (memcmp(nspm->uuid, label_ent->label->uuid,
|
||||
NSLABEL_UUID_LEN) != 0)
|
||||
continue;
|
||||
victim = label_ent;
|
||||
list_move_tail(&victim->list, &nd_mapping->labels);
|
||||
break;
|
||||
}
|
||||
if (victim) {
|
||||
dev_dbg(ndd->dev, "%s: free: %d\n", __func__, slot);
|
||||
slot = to_slot(ndd, victim->label);
|
||||
nd_label_free_slot(ndd, slot);
|
||||
victim->label = NULL;
|
||||
if (test_and_clear_bit(ND_LABEL_REAP, &label_ent->flags)
|
||||
|| memcmp(nspm->uuid, label_ent->label->uuid,
|
||||
NSLABEL_UUID_LEN) == 0)
|
||||
reap_victim(nd_mapping, label_ent);
|
||||
}
|
||||
|
||||
/* update index */
|
||||
|
||||
@@ -1210,12 +1210,27 @@ static int namespace_update_uuid(struct nd_region *nd_region,
|
||||
for (i = 0; i < nd_region->ndr_mappings; i++) {
|
||||
struct nd_mapping *nd_mapping = &nd_region->mapping[i];
|
||||
struct nvdimm_drvdata *ndd = to_ndd(nd_mapping);
|
||||
struct nd_label_ent *label_ent;
|
||||
struct resource *res;
|
||||
|
||||
for_each_dpa_resource(ndd, res)
|
||||
if (strcmp(res->name, old_label_id.id) == 0)
|
||||
sprintf((void *) res->name, "%s",
|
||||
new_label_id.id);
|
||||
|
||||
mutex_lock(&nd_mapping->lock);
|
||||
list_for_each_entry(label_ent, &nd_mapping->labels, list) {
|
||||
struct nd_namespace_label *nd_label = label_ent->label;
|
||||
struct nd_label_id label_id;
|
||||
|
||||
if (!nd_label)
|
||||
continue;
|
||||
nd_label_gen_id(&label_id, nd_label->uuid,
|
||||
__le32_to_cpu(nd_label->flags));
|
||||
if (strcmp(old_label_id.id, label_id.id) == 0)
|
||||
set_bit(ND_LABEL_REAP, &label_ent->flags);
|
||||
}
|
||||
mutex_unlock(&nd_mapping->lock);
|
||||
}
|
||||
kfree(*old_uuid);
|
||||
out:
|
||||
|
||||
@@ -113,8 +113,12 @@ struct nd_percpu_lane {
|
||||
spinlock_t lock;
|
||||
};
|
||||
|
||||
enum nd_label_flags {
|
||||
ND_LABEL_REAP,
|
||||
};
|
||||
struct nd_label_ent {
|
||||
struct list_head list;
|
||||
unsigned long flags;
|
||||
struct nd_namespace_label *label;
|
||||
};
|
||||
|
||||
|
||||
@@ -1368,6 +1368,7 @@ static int pistachio_gpio_register(struct pistachio_pinctrl *pctl)
|
||||
if (!of_find_property(child, "gpio-controller", NULL)) {
|
||||
dev_err(pctl->dev,
|
||||
"No gpio-controller property for bank %u\n", i);
|
||||
of_node_put(child);
|
||||
ret = -ENODEV;
|
||||
goto err;
|
||||
}
|
||||
@@ -1375,6 +1376,7 @@ static int pistachio_gpio_register(struct pistachio_pinctrl *pctl)
|
||||
irq = irq_of_parse_and_map(child, 0);
|
||||
if (irq < 0) {
|
||||
dev_err(pctl->dev, "No IRQ for bank %u: %d\n", i, irq);
|
||||
of_node_put(child);
|
||||
ret = irq;
|
||||
goto err;
|
||||
}
|
||||
|
||||
@@ -414,7 +414,7 @@ static int pm860x_rtc_remove(struct platform_device *pdev)
|
||||
struct pm860x_rtc_info *info = platform_get_drvdata(pdev);
|
||||
|
||||
#ifdef VRTC_CALIBRATION
|
||||
flush_scheduled_work();
|
||||
cancel_delayed_work_sync(&info->calib_work);
|
||||
/* disable measurement */
|
||||
pm860x_set_bits(info->i2c, PM8607_MEAS_EN2, MEAS2_VRTC, 0);
|
||||
#endif /* VRTC_CALIBRATION */
|
||||
|
||||
@@ -114,7 +114,7 @@ struct subchannel {
|
||||
struct schib_config config;
|
||||
} __attribute__ ((aligned(8)));
|
||||
|
||||
DECLARE_PER_CPU(struct irb, cio_irb);
|
||||
DECLARE_PER_CPU_ALIGNED(struct irb, cio_irb);
|
||||
|
||||
#define to_subchannel(n) container_of(n, struct subchannel, dev)
|
||||
|
||||
|
||||
@@ -2027,6 +2027,11 @@ static int sas_rediscover_dev(struct domain_device *dev, int phy_id, bool last)
|
||||
if ((SAS_ADDR(sas_addr) == 0) || (res == -ECOMM)) {
|
||||
phy->phy_state = PHY_EMPTY;
|
||||
sas_unregister_devs_sas_addr(dev, phy_id, last);
|
||||
/*
|
||||
* Even though the PHY is empty, for convenience we discover
|
||||
* the PHY to update the PHY info, like negotiated linkrate.
|
||||
*/
|
||||
sas_ex_phy_discover(dev, phy_id);
|
||||
return res;
|
||||
} else if (SAS_ADDR(sas_addr) == SAS_ADDR(phy->attached_sas_addr) &&
|
||||
dev_type_flutter(type, phy->attached_dev_type)) {
|
||||
|
||||
@@ -1561,6 +1561,9 @@ lpfc_fdmi_hba_attr_manufacturer(struct lpfc_vport *vport,
|
||||
ae = (struct lpfc_fdmi_attr_entry *)&ad->AttrValue;
|
||||
memset(ae, 0, 256);
|
||||
|
||||
/* This string MUST be consistent with other FC platforms
|
||||
* supported by Broadcom.
|
||||
*/
|
||||
strncpy(ae->un.AttrString,
|
||||
"Emulex Corporation",
|
||||
sizeof(ae->un.AttrString));
|
||||
|
||||
@@ -901,7 +901,11 @@ lpfc_linkdown(struct lpfc_hba *phba)
|
||||
lpfc_linkdown_port(vports[i]);
|
||||
}
|
||||
lpfc_destroy_vport_work_array(phba, vports);
|
||||
/* Clean up any firmware default rpi's */
|
||||
|
||||
/* Clean up any SLI3 firmware default rpi's */
|
||||
if (phba->sli_rev > LPFC_SLI_REV3)
|
||||
goto skip_unreg_did;
|
||||
|
||||
mb = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
|
||||
if (mb) {
|
||||
lpfc_unreg_did(phba, 0xffff, LPFC_UNREG_ALL_DFLT_RPIS, mb);
|
||||
@@ -913,6 +917,7 @@ lpfc_linkdown(struct lpfc_hba *phba)
|
||||
}
|
||||
}
|
||||
|
||||
skip_unreg_did:
|
||||
/* Setup myDID for link up if we are in pt2pt mode */
|
||||
if (phba->pport->fc_flag & FC_PT2PT) {
|
||||
phba->pport->fc_myDID = 0;
|
||||
@@ -4654,6 +4659,10 @@ lpfc_unreg_default_rpis(struct lpfc_vport *vport)
|
||||
LPFC_MBOXQ_t *mbox;
|
||||
int rc;
|
||||
|
||||
/* Unreg DID is an SLI3 operation. */
|
||||
if (phba->sli_rev > LPFC_SLI_REV3)
|
||||
return;
|
||||
|
||||
mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
|
||||
if (mbox) {
|
||||
lpfc_unreg_did(phba, vport->vpi, LPFC_UNREG_ALL_DFLT_RPIS,
|
||||
|
||||
@@ -3089,7 +3089,7 @@ qla24xx_enable_msix(struct qla_hw_data *ha, struct rsp_que *rsp)
|
||||
ql_log(ql_log_fatal, vha, 0x00c8,
|
||||
"Failed to allocate memory for ha->msix_entries.\n");
|
||||
ret = -ENOMEM;
|
||||
goto msix_out;
|
||||
goto free_irqs;
|
||||
}
|
||||
ha->flags.msix_enabled = 1;
|
||||
|
||||
@@ -3177,6 +3177,10 @@ msix_register_fail:
|
||||
msix_out:
|
||||
kfree(entries);
|
||||
return ret;
|
||||
|
||||
free_irqs:
|
||||
pci_free_irq_vectors(ha->pdev);
|
||||
goto msix_out;
|
||||
}
|
||||
|
||||
int
|
||||
|
||||
@@ -5939,7 +5939,7 @@ static int get_fw_boot_info(struct scsi_qla_host *ha, uint16_t ddb_index[])
|
||||
val = rd_nvram_byte(ha, sec_addr);
|
||||
if (val & BIT_7)
|
||||
ddb_index[1] = (val & 0x7f);
|
||||
|
||||
goto exit_boot_info;
|
||||
} else if (is_qla80XX(ha)) {
|
||||
buf = dma_alloc_coherent(&ha->pdev->dev, size,
|
||||
&buf_dma, GFP_KERNEL);
|
||||
|
||||
@@ -2403,7 +2403,6 @@ sd_read_write_protect_flag(struct scsi_disk *sdkp, unsigned char *buffer)
|
||||
int res;
|
||||
struct scsi_device *sdp = sdkp->device;
|
||||
struct scsi_mode_data data;
|
||||
int disk_ro = get_disk_ro(sdkp->disk);
|
||||
int old_wp = sdkp->write_prot;
|
||||
|
||||
set_disk_ro(sdkp->disk, 0);
|
||||
@@ -2444,7 +2443,7 @@ sd_read_write_protect_flag(struct scsi_disk *sdkp, unsigned char *buffer)
|
||||
"Test WP failed, assume Write Enabled\n");
|
||||
} else {
|
||||
sdkp->write_prot = ((data.device_specific & 0x80) != 0);
|
||||
set_disk_ro(sdkp->disk, sdkp->write_prot || disk_ro);
|
||||
set_disk_ro(sdkp->disk, sdkp->write_prot);
|
||||
if (sdkp->first_scan || old_wp != sdkp->write_prot) {
|
||||
sd_printk(KERN_NOTICE, sdkp, "Write Protect is %s\n",
|
||||
sdkp->write_prot ? "on" : "off");
|
||||
|
||||
@@ -4904,19 +4904,19 @@ static u32 ufshcd_find_max_sup_active_icc_level(struct ufs_hba *hba,
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (hba->vreg_info.vcc)
|
||||
if (hba->vreg_info.vcc && hba->vreg_info.vcc->max_uA)
|
||||
icc_level = ufshcd_get_max_icc_level(
|
||||
hba->vreg_info.vcc->max_uA,
|
||||
POWER_DESC_MAX_ACTV_ICC_LVLS - 1,
|
||||
&desc_buf[PWR_DESC_ACTIVE_LVLS_VCC_0]);
|
||||
|
||||
if (hba->vreg_info.vccq)
|
||||
if (hba->vreg_info.vccq && hba->vreg_info.vccq->max_uA)
|
||||
icc_level = ufshcd_get_max_icc_level(
|
||||
hba->vreg_info.vccq->max_uA,
|
||||
icc_level,
|
||||
&desc_buf[PWR_DESC_ACTIVE_LVLS_VCCQ_0]);
|
||||
|
||||
if (hba->vreg_info.vccq2)
|
||||
if (hba->vreg_info.vccq2 && hba->vreg_info.vccq2->max_uA)
|
||||
icc_level = ufshcd_get_max_icc_level(
|
||||
hba->vreg_info.vccq2->max_uA,
|
||||
icc_level,
|
||||
@@ -5478,6 +5478,15 @@ static int ufshcd_config_vreg_load(struct device *dev, struct ufs_vreg *vreg,
|
||||
if (!vreg)
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* "set_load" operation shall be required on those regulators
|
||||
* which specifically configured current limitation. Otherwise
|
||||
* zero max_uA may cause unexpected behavior when regulator is
|
||||
* enabled or set as high power mode.
|
||||
*/
|
||||
if (!vreg->max_uA)
|
||||
return 0;
|
||||
|
||||
ret = regulator_set_load(vreg->reg, ua);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "%s: %s set load (ua=%d) failed, err=%d\n",
|
||||
@@ -5524,12 +5533,15 @@ static int ufshcd_config_vreg(struct device *dev,
|
||||
name = vreg->name;
|
||||
|
||||
if (regulator_count_voltages(reg) > 0) {
|
||||
min_uV = on ? vreg->min_uV : 0;
|
||||
ret = regulator_set_voltage(reg, min_uV, vreg->max_uV);
|
||||
if (ret) {
|
||||
dev_err(dev, "%s: %s set voltage failed, err=%d\n",
|
||||
if (vreg->min_uV && vreg->max_uV) {
|
||||
min_uV = on ? vreg->min_uV : 0;
|
||||
ret = regulator_set_voltage(reg, min_uV, vreg->max_uV);
|
||||
if (ret) {
|
||||
dev_err(dev,
|
||||
"%s: %s set voltage failed, err=%d\n",
|
||||
__func__, name, ret);
|
||||
goto out;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
uA_load = on ? vreg->max_uA : 0;
|
||||
|
||||
@@ -921,10 +921,14 @@ static unsigned int ssp_get_clk_div(struct driver_data *drv_data, int rate)
|
||||
|
||||
rate = min_t(int, ssp_clk, rate);
|
||||
|
||||
/*
|
||||
* Calculate the divisor for the SCR (Serial Clock Rate), avoiding
|
||||
* that the SSP transmission rate can be greater than the device rate
|
||||
*/
|
||||
if (ssp->type == PXA25x_SSP || ssp->type == CE4100_SSP)
|
||||
return (ssp_clk / (2 * rate) - 1) & 0xff;
|
||||
return (DIV_ROUND_UP(ssp_clk, 2 * rate) - 1) & 0xff;
|
||||
else
|
||||
return (ssp_clk / rate - 1) & 0xfff;
|
||||
return (DIV_ROUND_UP(ssp_clk, rate) - 1) & 0xfff;
|
||||
}
|
||||
|
||||
static unsigned int pxa2xx_ssp_get_clk_div(struct driver_data *drv_data,
|
||||
|
||||
@@ -279,7 +279,8 @@ static int rspi_set_config_register(struct rspi_data *rspi, int access_size)
|
||||
/* Sets parity, interrupt mask */
|
||||
rspi_write8(rspi, 0x00, RSPI_SPCR2);
|
||||
|
||||
/* Sets SPCMD */
|
||||
/* Resets sequencer */
|
||||
rspi_write8(rspi, 0, RSPI_SPSCR);
|
||||
rspi->spcmd |= SPCMD_SPB_8_TO_16(access_size);
|
||||
rspi_write16(rspi, rspi->spcmd, RSPI_SPCMD0);
|
||||
|
||||
@@ -323,7 +324,8 @@ static int rspi_rz_set_config_register(struct rspi_data *rspi, int access_size)
|
||||
rspi_write8(rspi, 0x00, RSPI_SSLND);
|
||||
rspi_write8(rspi, 0x00, RSPI_SPND);
|
||||
|
||||
/* Sets SPCMD */
|
||||
/* Resets sequencer */
|
||||
rspi_write8(rspi, 0, RSPI_SPSCR);
|
||||
rspi->spcmd |= SPCMD_SPB_8_TO_16(access_size);
|
||||
rspi_write16(rspi, rspi->spcmd, RSPI_SPCMD0);
|
||||
|
||||
@@ -374,7 +376,8 @@ static int qspi_set_config_register(struct rspi_data *rspi, int access_size)
|
||||
/* Sets buffer to allow normal operation */
|
||||
rspi_write8(rspi, 0x00, QSPI_SPBFCR);
|
||||
|
||||
/* Sets SPCMD */
|
||||
/* Resets sequencer */
|
||||
rspi_write8(rspi, 0, RSPI_SPSCR);
|
||||
rspi_write16(rspi, rspi->spcmd, RSPI_SPCMD0);
|
||||
|
||||
/* Enables SPI function in master mode */
|
||||
|
||||
@@ -1067,27 +1067,19 @@ static int tegra_spi_probe(struct platform_device *pdev)
|
||||
|
||||
spi_irq = platform_get_irq(pdev, 0);
|
||||
tspi->irq = spi_irq;
|
||||
ret = request_threaded_irq(tspi->irq, tegra_spi_isr,
|
||||
tegra_spi_isr_thread, IRQF_ONESHOT,
|
||||
dev_name(&pdev->dev), tspi);
|
||||
if (ret < 0) {
|
||||
dev_err(&pdev->dev, "Failed to register ISR for IRQ %d\n",
|
||||
tspi->irq);
|
||||
goto exit_free_master;
|
||||
}
|
||||
|
||||
tspi->clk = devm_clk_get(&pdev->dev, "spi");
|
||||
if (IS_ERR(tspi->clk)) {
|
||||
dev_err(&pdev->dev, "can not get clock\n");
|
||||
ret = PTR_ERR(tspi->clk);
|
||||
goto exit_free_irq;
|
||||
goto exit_free_master;
|
||||
}
|
||||
|
||||
tspi->rst = devm_reset_control_get(&pdev->dev, "spi");
|
||||
if (IS_ERR(tspi->rst)) {
|
||||
dev_err(&pdev->dev, "can not get reset\n");
|
||||
ret = PTR_ERR(tspi->rst);
|
||||
goto exit_free_irq;
|
||||
goto exit_free_master;
|
||||
}
|
||||
|
||||
tspi->max_buf_size = SPI_FIFO_DEPTH << 2;
|
||||
@@ -1095,7 +1087,7 @@ static int tegra_spi_probe(struct platform_device *pdev)
|
||||
|
||||
ret = tegra_spi_init_dma_param(tspi, true);
|
||||
if (ret < 0)
|
||||
goto exit_free_irq;
|
||||
goto exit_free_master;
|
||||
ret = tegra_spi_init_dma_param(tspi, false);
|
||||
if (ret < 0)
|
||||
goto exit_rx_dma_free;
|
||||
@@ -1117,18 +1109,32 @@ static int tegra_spi_probe(struct platform_device *pdev)
|
||||
dev_err(&pdev->dev, "pm runtime get failed, e = %d\n", ret);
|
||||
goto exit_pm_disable;
|
||||
}
|
||||
|
||||
reset_control_assert(tspi->rst);
|
||||
udelay(2);
|
||||
reset_control_deassert(tspi->rst);
|
||||
tspi->def_command1_reg = SPI_M_S;
|
||||
tegra_spi_writel(tspi, tspi->def_command1_reg, SPI_COMMAND1);
|
||||
pm_runtime_put(&pdev->dev);
|
||||
ret = request_threaded_irq(tspi->irq, tegra_spi_isr,
|
||||
tegra_spi_isr_thread, IRQF_ONESHOT,
|
||||
dev_name(&pdev->dev), tspi);
|
||||
if (ret < 0) {
|
||||
dev_err(&pdev->dev, "Failed to register ISR for IRQ %d\n",
|
||||
tspi->irq);
|
||||
goto exit_pm_disable;
|
||||
}
|
||||
|
||||
master->dev.of_node = pdev->dev.of_node;
|
||||
ret = devm_spi_register_master(&pdev->dev, master);
|
||||
if (ret < 0) {
|
||||
dev_err(&pdev->dev, "can not register to master err %d\n", ret);
|
||||
goto exit_pm_disable;
|
||||
goto exit_free_irq;
|
||||
}
|
||||
return ret;
|
||||
|
||||
exit_free_irq:
|
||||
free_irq(spi_irq, tspi);
|
||||
exit_pm_disable:
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
if (!pm_runtime_status_suspended(&pdev->dev))
|
||||
@@ -1136,8 +1142,6 @@ exit_pm_disable:
|
||||
tegra_spi_deinit_dma_param(tspi, false);
|
||||
exit_rx_dma_free:
|
||||
tegra_spi_deinit_dma_param(tspi, true);
|
||||
exit_free_irq:
|
||||
free_irq(spi_irq, tspi);
|
||||
exit_free_master:
|
||||
spi_master_put(master);
|
||||
return ret;
|
||||
|
||||
@@ -1306,18 +1306,27 @@ static void pch_free_dma_buf(struct pch_spi_board_data *board_dat,
|
||||
return;
|
||||
}
|
||||
|
||||
static void pch_alloc_dma_buf(struct pch_spi_board_data *board_dat,
|
||||
static int pch_alloc_dma_buf(struct pch_spi_board_data *board_dat,
|
||||
struct pch_spi_data *data)
|
||||
{
|
||||
struct pch_spi_dma_ctrl *dma;
|
||||
int ret;
|
||||
|
||||
dma = &data->dma;
|
||||
ret = 0;
|
||||
/* Get Consistent memory for Tx DMA */
|
||||
dma->tx_buf_virt = dma_alloc_coherent(&board_dat->pdev->dev,
|
||||
PCH_BUF_SIZE, &dma->tx_buf_dma, GFP_KERNEL);
|
||||
if (!dma->tx_buf_virt)
|
||||
ret = -ENOMEM;
|
||||
|
||||
/* Get Consistent memory for Rx DMA */
|
||||
dma->rx_buf_virt = dma_alloc_coherent(&board_dat->pdev->dev,
|
||||
PCH_BUF_SIZE, &dma->rx_buf_dma, GFP_KERNEL);
|
||||
if (!dma->rx_buf_virt)
|
||||
ret = -ENOMEM;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int pch_spi_pd_probe(struct platform_device *plat_dev)
|
||||
@@ -1394,7 +1403,9 @@ static int pch_spi_pd_probe(struct platform_device *plat_dev)
|
||||
|
||||
if (use_dma) {
|
||||
dev_info(&plat_dev->dev, "Use DMA for data transfers\n");
|
||||
pch_alloc_dma_buf(board_dat, data);
|
||||
ret = pch_alloc_dma_buf(board_dat, data);
|
||||
if (ret)
|
||||
goto err_spi_register_master;
|
||||
}
|
||||
|
||||
ret = spi_register_master(master);
|
||||
|
||||
@@ -955,6 +955,8 @@ static int spi_map_msg(struct spi_master *master, struct spi_message *msg)
|
||||
if (max_tx || max_rx) {
|
||||
list_for_each_entry(xfer, &msg->transfers,
|
||||
transfer_list) {
|
||||
if (!xfer->len)
|
||||
continue;
|
||||
if (!xfer->tx_buf)
|
||||
xfer->tx_buf = master->dummy_tx;
|
||||
if (!xfer->rx_buf)
|
||||
|
||||
@@ -113,16 +113,21 @@ static struct pcmcia_driver ssb_host_pcmcia_driver = {
|
||||
.resume = ssb_host_pcmcia_resume,
|
||||
};
|
||||
|
||||
static int pcmcia_init_failed;
|
||||
|
||||
/*
|
||||
* These are not module init/exit functions!
|
||||
* The module_pcmcia_driver() helper cannot be used here.
|
||||
*/
|
||||
int ssb_host_pcmcia_init(void)
|
||||
{
|
||||
return pcmcia_register_driver(&ssb_host_pcmcia_driver);
|
||||
pcmcia_init_failed = pcmcia_register_driver(&ssb_host_pcmcia_driver);
|
||||
|
||||
return pcmcia_init_failed;
|
||||
}
|
||||
|
||||
void ssb_host_pcmcia_exit(void)
|
||||
{
|
||||
pcmcia_unregister_driver(&ssb_host_pcmcia_driver);
|
||||
if (!pcmcia_init_failed)
|
||||
pcmcia_unregister_driver(&ssb_host_pcmcia_driver);
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user