mirror of
https://github.com/torvalds/linux.git
synced 2026-06-07 22:14:04 +02:00
This is the 4.19.134 stable release
-----BEGIN PGP SIGNATURE-----
iQIzBAABCAAdFiEEZH8oZUiU471FcZm+ONu9yGCSaT4FAl8X634ACgkQONu9yGCS
aT5sNBAA0JUGRrRlbQMgMtjR7ua+OLi3e07A0QNzD9xHqCc6NEXPuk4yYF8Pcs3g
1ARyEDXybdfUFciChoH0zfBxEbXuB/8+3M3ikE6XV3V/aySzHpfXU/zrepq4kB4G
JOqtAxHaLF1tHzsdSZiT3Qj8k8QCcyN9kB08g67JKAe7vd03SKg7CAbBb0JLEUGF
6s7AxohupSJLBWaaQsgYiYMzkH8WceyGMGYydNUNtHLTbHPaj1f5KaRBuHA0Ls57
35ba0suCL3pTbOZ+dF7CqO3mfQgLAY3/vE0jZpoNn3s7BMgOwr3d3cEUhRxI9GPl
fO4Ua7Q9NZ67blLwD/fhcua8CeQUXSxqH5YcgDNqQHnZLx7CJW6kEKbFMlqWNaxf
yhJbmgZJl+BqTkrIaAbz5FCXO6zAnRehh9L54SzZEdBpp5Y5Ep5nuSkwyZra1KWd
b0YK5Yy7dzkZLgPsUc4JrC0o1859IrbvC84fPOk4nuovtCfugnSoIXYjmGQHPFH1
Y5qt/DazsVdzpZIrg2Nvr/LrKh0BOPBjj3SYiCPfZkQDWkKF6ABWSggBxFEqn690
dbJL2A0j+mvuYxUJnkNt0NR3qzXZewHJSqFpCPkN2/TbMNmr9FvKeox9HUIo4qq4
7fqMPs4JNGZHPU7CqxIPJ3s9fjluhkkUtOXZmpzCV/58xI5ZzN0=
=3LQn
-----END PGP SIGNATURE-----
Merge 4.19.134 into android-4.19-stable
Changes in 4.19.134
perf: Make perf able to build with latest libbfd
net: rmnet: fix lower interface leak
genetlink: remove genl_bind
ipv4: fill fl4_icmp_{type,code} in ping_v4_sendmsg
l2tp: remove skb_dst_set() from l2tp_xmit_skb()
llc: make sure applications use ARPHRD_ETHER
net: Added pointer check for dst->ops->neigh_lookup in dst_neigh_lookup_skb
net_sched: fix a memory leak in atm_tc_init()
net: usb: qmi_wwan: add support for Quectel EG95 LTE modem
tcp: fix SO_RCVLOWAT possible hangs under high mem pressure
tcp: make sure listeners don't initialize congestion-control state
tcp: md5: add missing memory barriers in tcp_md5_do_add()/tcp_md5_hash_key()
tcp: md5: do not send silly options in SYNCOOKIES
tcp: md5: refine tcp_md5_do_add()/tcp_md5_hash_key() barriers
tcp: md5: allow changing MD5 keys in all socket states
cgroup: fix cgroup_sk_alloc() for sk_clone_lock()
cgroup: Fix sock_cgroup_data on big-endian.
sched: consistently handle layer3 header accesses in the presence of VLANs
vlan: consolidate VLAN parsing code and limit max parsing depth
drm/msm: fix potential memleak in error branch
drm/exynos: fix ref count leak in mic_pre_enable
m68k: nommu: register start of the memory with memblock
m68k: mm: fix node memblock init
arm64/alternatives: use subsections for replacement sequences
tpm_tis: extra chip->ops check on error path in tpm_tis_core_init
gfs2: read-only mounts should grab the sd_freeze_gl glock
i2c: eg20t: Load module automatically if ID matches
arm64/alternatives: don't patch up internal branches
iio:magnetometer:ak8974: Fix alignment and data leak issues
iio:humidity:hdc100x Fix alignment and data leak issues
iio: magnetometer: ak8974: Fix runtime PM imbalance on error
iio: mma8452: Add missed iio_device_unregister() call in mma8452_probe()
iio: pressure: zpa2326: handle pm_runtime_get_sync failure
iio:humidity:hts221 Fix alignment and data leak issues
iio:pressure:ms5611 Fix buffer element alignment
iio:health:afe4403 Fix timestamp alignment and prevent data leak.
spi: fix initial SPI_SR value in spi-fsl-dspi
spi: spi-fsl-dspi: Fix lockup if device is shutdown during SPI transfer
net: dsa: bcm_sf2: Fix node reference count
of: of_mdio: Correct loop scanning logic
Revert "usb/ohci-platform: Fix a warning when hibernating"
Revert "usb/xhci-plat: Set PM runtime as active on resume"
Revert "usb/ehci-platform: Set PM runtime as active on resume"
net: sfp: add support for module quirks
net: sfp: add some quirks for GPON modules
HID: quirks: Remove ITE 8595 entry from hid_have_special_driver
ARM: at91: pm: add quirk for sam9x60's ulp1
scsi: sr: remove references to BLK_DEV_SR_VENDOR, leave it enabled
ALSA: usb-audio: Create a registration quirk for Kingston HyperX Amp (0951:16d8)
doc: dt: bindings: usb: dwc3: Update entries for disabling SS instances in park mode
mmc: sdhci: do not enable card detect interrupt for gpio cd type
ALSA: usb-audio: Rewrite registration quirk handling
ACPI: video: Use native backlight on Acer Aspire 5783z
ALSA: usb-audio: Add registration quirk for Kingston HyperX Cloud Alpha S
Input: mms114 - add extra compatible for mms345l
ACPI: video: Use native backlight on Acer TravelMate 5735Z
ALSA: usb-audio: Add registration quirk for Kingston HyperX Cloud Flight S
iio:health:afe4404 Fix timestamp alignment and prevent data leak.
phy: sun4i-usb: fix dereference of pointer phy0 before it is null checked
arm64: dts: meson: add missing gxl rng clock
spi: spi-sun6i: sun6i_spi_transfer_one(): fix setting of clock rate
usb: gadget: udc: atmel: fix uninitialized read in debug printk
staging: comedi: verify array index is correct before using it
Revert "thermal: mediatek: fix register index error"
ARM: dts: socfpga: Align L2 cache-controller nodename with dtschema
regmap: debugfs: Don't sleep while atomic for fast_io regmaps
copy_xstate_to_kernel: Fix typo which caused GDB regression
apparmor: ensure that dfa state tables have entries
perf stat: Zero all the 'ena' and 'run' array slot stats for interval mode
soc: qcom: rpmh: Update dirty flag only when data changes
soc: qcom: rpmh: Invalidate SLEEP and WAKE TCSes before flushing new data
soc: qcom: rpmh-rsc: Clear active mode configuration for wake TCS
soc: qcom: rpmh-rsc: Allow using free WAKE TCS for active request
mtd: rawnand: marvell: Use nand_cleanup() when the device is not yet registered
mtd: rawnand: marvell: Fix probe error path
mtd: rawnand: timings: Fix default tR_max and tCCS_min timings
mtd: rawnand: brcmnand: fix CS0 layout
mtd: rawnand: oxnas: Keep track of registered devices
mtd: rawnand: oxnas: Unregister all devices on error
mtd: rawnand: oxnas: Release all devices in the _remove() path
slimbus: core: Fix mismatch in of_node_get/put
HID: magicmouse: do not set up autorepeat
HID: quirks: Always poll Obins Anne Pro 2 keyboard
HID: quirks: Ignore Simply Automated UPB PIM
ALSA: line6: Perform sanity check for each URB creation
ALSA: line6: Sync the pending work cancel at disconnection
ALSA: usb-audio: Fix race against the error recovery URB submission
ALSA: hda/realtek - change to suitable link model for ASUS platform
ALSA: hda/realtek - Enable Speaker for ASUS UX533 and UX534
USB: c67x00: fix use after free in c67x00_giveback_urb
usb: dwc2: Fix shutdown callback in platform
usb: chipidea: core: add wakeup support for extcon
usb: gadget: function: fix missing spinlock in f_uac1_legacy
USB: serial: iuu_phoenix: fix memory corruption
USB: serial: cypress_m8: enable Simply Automated UPB PIM
USB: serial: ch341: add new Product ID for CH340
USB: serial: option: add GosunCn GM500 series
USB: serial: option: add Quectel EG95 LTE modem
virt: vbox: Fix VBGL_IOCTL_VMMDEV_REQUEST_BIG and _LOG req numbers to match upstream
virt: vbox: Fix guest capabilities mask check
virtio: virtio_console: add missing MODULE_DEVICE_TABLE() for rproc serial
serial: mxs-auart: add missed iounmap() in probe failure and remove
ovl: inode reference leak in ovl_is_inuse true case.
ovl: relax WARN_ON() when decoding lower directory file handle
ovl: fix unneeded call to ovl_change_flags()
fuse: Fix parameter for FS_IOC_{GET,SET}FLAGS
Revert "zram: convert remaining CLASS_ATTR() to CLASS_ATTR_RO()"
mei: bus: don't clean driver pointer
Input: i8042 - add Lenovo XiaoXin Air 12 to i8042 nomux list
uio_pdrv_genirq: fix use without device tree and no interrupt
timer: Prevent base->clk from moving backward
timer: Fix wheel index calculation on last level
MIPS: Fix build for LTS kernel caused by backporting lpj adjustment
riscv: use 16KB kernel stack on 64-bit
hwmon: (emc2103) fix unable to change fan pwm1_enable attribute
powerpc/book3s64/pkeys: Fix pkey_access_permitted() for execute disable pkey
intel_th: pci: Add Jasper Lake CPU support
intel_th: pci: Add Tiger Lake PCH-H support
intel_th: pci: Add Emmitsburg PCH support
intel_th: Fix a NULL dereference when hub driver is not loaded
dmaengine: fsl-edma: Fix NULL pointer exception in fsl_edma_tx_handler
misc: atmel-ssc: lock with mutex instead of spinlock
thermal/drivers/cpufreq_cooling: Fix wrong frequency converted from power
arm64: ptrace: Override SPSR.SS when single-stepping is enabled
arm64: ptrace: Consistently use pseudo-singlestep exceptions
arm64: compat: Ensure upper 32 bits of x0 are zero on syscall return
sched: Fix unreliable rseq cpu_id for new tasks
sched/fair: handle case of task_h_load() returning 0
genirq/affinity: Handle affinity setting on inactive interrupts correctly
printk: queue wake_up_klogd irq_work only if per-CPU areas are ready
libceph: don't omit recovery_deletes in target_copy()
rxrpc: Fix trace string
spi: sprd: switch the sequence of setting WDG_LOAD_LOW and _HIGH
Linux 4.19.134
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Change-Id: Ieeb9e03f4a2d51aeebe3a3eadd9c1b93a26088a0
This commit is contained in:
commit
b41585fc93
|
|
@ -68,6 +68,8 @@ Optional properties:
|
|||
from P0 to P1/P2/P3 without delay.
|
||||
- snps,dis-tx-ipgap-linecheck-quirk: when set, disable u2mac linestate check
|
||||
during HS transmit.
|
||||
- snps,parkmode-disable-ss-quirk: when set, all SuperSpeed bus instances in
|
||||
park mode are disabled.
|
||||
- snps,dis_metastability_quirk: when set, disable metastability workaround.
|
||||
CAUTION: use only if you are absolutely sure of it.
|
||||
- snps,is-utmi-l1-suspend: true when DWC3 asserts output signal
|
||||
|
|
|
|||
2
Makefile
2
Makefile
|
|
@ -1,7 +1,7 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 4
|
||||
PATCHLEVEL = 19
|
||||
SUBLEVEL = 133
|
||||
SUBLEVEL = 134
|
||||
EXTRAVERSION =
|
||||
NAME = "People's Front"
|
||||
|
||||
|
|
|
|||
|
|
@ -36,7 +36,6 @@ CONFIG_BLK_DEV_CY82C693=y
|
|||
CONFIG_SCSI=y
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_BLK_DEV_SR=y
|
||||
CONFIG_BLK_DEV_SR_VENDOR=y
|
||||
CONFIG_SCSI_AIC7XXX=m
|
||||
CONFIG_AIC7XXX_CMDS_PER_DEVICE=253
|
||||
# CONFIG_AIC7XXX_DEBUG_ENABLE is not set
|
||||
|
|
|
|||
|
|
@ -710,7 +710,7 @@ ocram-ecc@ffd08144 {
|
|||
};
|
||||
};
|
||||
|
||||
L2: l2-cache@fffef000 {
|
||||
L2: cache-controller@fffef000 {
|
||||
compatible = "arm,pl310-cache";
|
||||
reg = <0xfffef000 0x1000>;
|
||||
interrupts = <0 38 0x04>;
|
||||
|
|
|
|||
|
|
@ -618,7 +618,7 @@ sdr: sdr@ffcfb100 {
|
|||
reg = <0xffcfb100 0x80>;
|
||||
};
|
||||
|
||||
L2: l2-cache@fffff000 {
|
||||
L2: cache-controller@fffff000 {
|
||||
compatible = "arm,pl310-cache";
|
||||
reg = <0xfffff000 0x1000>;
|
||||
interrupts = <0 18 IRQ_TYPE_LEVEL_HIGH>;
|
||||
|
|
|
|||
|
|
@ -32,7 +32,6 @@ CONFIG_BLK_DEV_RAM=y
|
|||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_CHR_DEV_ST=m
|
||||
CONFIG_BLK_DEV_SR=y
|
||||
CONFIG_BLK_DEV_SR_VENDOR=y
|
||||
CONFIG_CHR_DEV_SG=y
|
||||
CONFIG_SCSI_CONSTANTS=y
|
||||
CONFIG_SCSI_LOGGING=y
|
||||
|
|
|
|||
|
|
@ -206,7 +206,6 @@ CONFIG_EEPROM_AT24=y
|
|||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_CHR_DEV_ST=m
|
||||
CONFIG_BLK_DEV_SR=y
|
||||
CONFIG_BLK_DEV_SR_VENDOR=y
|
||||
CONFIG_CHR_DEV_SG=y
|
||||
CONFIG_CHR_DEV_SCH=m
|
||||
CONFIG_SCSI_CONSTANTS=y
|
||||
|
|
|
|||
|
|
@ -220,6 +220,10 @@ ENDPROC(at91_backup_mode)
|
|||
orr tmp1, tmp1, #AT91_PMC_KEY
|
||||
str tmp1, [pmc, #AT91_CKGR_MOR]
|
||||
|
||||
/* Quirk for SAM9X60's PMC */
|
||||
nop
|
||||
nop
|
||||
|
||||
wait_mckrdy
|
||||
|
||||
/* Enable the crystal oscillator */
|
||||
|
|
|
|||
|
|
@ -266,6 +266,11 @@ clkc: clock-controller {
|
|||
};
|
||||
};
|
||||
|
||||
&hwrng {
|
||||
clocks = <&clkc CLKID_RNG0>;
|
||||
clock-names = "core";
|
||||
};
|
||||
|
||||
&i2c_A {
|
||||
clocks = <&clkc CLKID_I2C>;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -73,11 +73,11 @@ static inline void apply_alternatives_module(void *start, size_t length) { }
|
|||
".pushsection .altinstructions,\"a\"\n" \
|
||||
ALTINSTR_ENTRY(feature) \
|
||||
".popsection\n" \
|
||||
".pushsection .altinstr_replacement, \"a\"\n" \
|
||||
".subsection 1\n" \
|
||||
"663:\n\t" \
|
||||
newinstr "\n" \
|
||||
"664:\n\t" \
|
||||
".popsection\n\t" \
|
||||
".previous\n\t" \
|
||||
".org . - (664b-663b) + (662b-661b)\n\t" \
|
||||
".org . - (662b-661b) + (664b-663b)\n" \
|
||||
".endif\n"
|
||||
|
|
@ -117,9 +117,9 @@ static inline void apply_alternatives_module(void *start, size_t length) { }
|
|||
662: .pushsection .altinstructions, "a"
|
||||
altinstruction_entry 661b, 663f, \cap, 662b-661b, 664f-663f
|
||||
.popsection
|
||||
.pushsection .altinstr_replacement, "ax"
|
||||
.subsection 1
|
||||
663: \insn2
|
||||
664: .popsection
|
||||
664: .previous
|
||||
.org . - (664b-663b) + (662b-661b)
|
||||
.org . - (662b-661b) + (664b-663b)
|
||||
.endif
|
||||
|
|
@ -160,7 +160,7 @@ static inline void apply_alternatives_module(void *start, size_t length) { }
|
|||
.pushsection .altinstructions, "a"
|
||||
altinstruction_entry 663f, 661f, \cap, 664f-663f, 662f-661f
|
||||
.popsection
|
||||
.pushsection .altinstr_replacement, "ax"
|
||||
.subsection 1
|
||||
.align 2 /* So GAS knows label 661 is suitably aligned */
|
||||
661:
|
||||
.endm
|
||||
|
|
@ -179,9 +179,9 @@ static inline void apply_alternatives_module(void *start, size_t length) { }
|
|||
.macro alternative_else
|
||||
662:
|
||||
.if .Lasm_alt_mode==0
|
||||
.pushsection .altinstr_replacement, "ax"
|
||||
.subsection 1
|
||||
.else
|
||||
.popsection
|
||||
.previous
|
||||
.endif
|
||||
663:
|
||||
.endm
|
||||
|
|
@ -192,7 +192,7 @@ static inline void apply_alternatives_module(void *start, size_t length) { }
|
|||
.macro alternative_endif
|
||||
664:
|
||||
.if .Lasm_alt_mode==0
|
||||
.popsection
|
||||
.previous
|
||||
.endif
|
||||
.org . - (664b-663b) + (662b-661b)
|
||||
.org . - (662b-661b) + (664b-663b)
|
||||
|
|
|
|||
|
|
@ -119,6 +119,8 @@ void disable_debug_monitors(enum dbg_active_el el);
|
|||
|
||||
void user_rewind_single_step(struct task_struct *task);
|
||||
void user_fastforward_single_step(struct task_struct *task);
|
||||
void user_regs_reset_single_step(struct user_pt_regs *regs,
|
||||
struct task_struct *task);
|
||||
|
||||
void kernel_enable_single_step(struct pt_regs *regs);
|
||||
void kernel_disable_single_step(void);
|
||||
|
|
|
|||
|
|
@ -45,6 +45,10 @@ static inline long syscall_get_error(struct task_struct *task,
|
|||
struct pt_regs *regs)
|
||||
{
|
||||
unsigned long error = regs->regs[0];
|
||||
|
||||
if (is_compat_thread(task_thread_info(task)))
|
||||
error = sign_extend64(error, 31);
|
||||
|
||||
return IS_ERR_VALUE(error) ? error : 0;
|
||||
}
|
||||
|
||||
|
|
@ -58,7 +62,13 @@ static inline void syscall_set_return_value(struct task_struct *task,
|
|||
struct pt_regs *regs,
|
||||
int error, long val)
|
||||
{
|
||||
regs->regs[0] = (long) error ? error : val;
|
||||
if (error)
|
||||
val = error;
|
||||
|
||||
if (is_compat_thread(task_thread_info(task)))
|
||||
val = lower_32_bits(val);
|
||||
|
||||
regs->regs[0] = val;
|
||||
}
|
||||
|
||||
#define SYSCALL_MAX_ARGS 6
|
||||
|
|
|
|||
|
|
@ -105,6 +105,7 @@ void arch_release_task_struct(struct task_struct *tsk);
|
|||
#define _TIF_SECCOMP (1 << TIF_SECCOMP)
|
||||
#define _TIF_UPROBE (1 << TIF_UPROBE)
|
||||
#define _TIF_FSCHECK (1 << TIF_FSCHECK)
|
||||
#define _TIF_SINGLESTEP (1 << TIF_SINGLESTEP)
|
||||
#define _TIF_32BIT (1 << TIF_32BIT)
|
||||
#define _TIF_SVE (1 << TIF_SVE)
|
||||
|
||||
|
|
|
|||
|
|
@ -44,20 +44,8 @@ struct alt_region {
|
|||
*/
|
||||
static bool branch_insn_requires_update(struct alt_instr *alt, unsigned long pc)
|
||||
{
|
||||
unsigned long replptr;
|
||||
|
||||
if (kernel_text_address(pc))
|
||||
return true;
|
||||
|
||||
replptr = (unsigned long)ALT_REPL_PTR(alt);
|
||||
if (pc >= replptr && pc <= (replptr + alt->alt_len))
|
||||
return false;
|
||||
|
||||
/*
|
||||
* Branching into *another* alternate sequence is doomed, and
|
||||
* we're not even trying to fix it up.
|
||||
*/
|
||||
BUG();
|
||||
unsigned long replptr = (unsigned long)ALT_REPL_PTR(alt);
|
||||
return !(pc >= replptr && pc <= (replptr + alt->alt_len));
|
||||
}
|
||||
|
||||
#define align_down(x, a) ((unsigned long)(x) & ~(((unsigned long)(a)) - 1))
|
||||
|
|
|
|||
|
|
@ -152,17 +152,20 @@ postcore_initcall(debug_monitors_init);
|
|||
/*
|
||||
* Single step API and exception handling.
|
||||
*/
|
||||
static void set_regs_spsr_ss(struct pt_regs *regs)
|
||||
static void set_user_regs_spsr_ss(struct user_pt_regs *regs)
|
||||
{
|
||||
regs->pstate |= DBG_SPSR_SS;
|
||||
}
|
||||
NOKPROBE_SYMBOL(set_regs_spsr_ss);
|
||||
NOKPROBE_SYMBOL(set_user_regs_spsr_ss);
|
||||
|
||||
static void clear_regs_spsr_ss(struct pt_regs *regs)
|
||||
static void clear_user_regs_spsr_ss(struct user_pt_regs *regs)
|
||||
{
|
||||
regs->pstate &= ~DBG_SPSR_SS;
|
||||
}
|
||||
NOKPROBE_SYMBOL(clear_regs_spsr_ss);
|
||||
NOKPROBE_SYMBOL(clear_user_regs_spsr_ss);
|
||||
|
||||
#define set_regs_spsr_ss(r) set_user_regs_spsr_ss(&(r)->user_regs)
|
||||
#define clear_regs_spsr_ss(r) clear_user_regs_spsr_ss(&(r)->user_regs)
|
||||
|
||||
/* EL1 Single Step Handler hooks */
|
||||
static LIST_HEAD(step_hook);
|
||||
|
|
@ -400,6 +403,15 @@ void user_fastforward_single_step(struct task_struct *task)
|
|||
clear_regs_spsr_ss(task_pt_regs(task));
|
||||
}
|
||||
|
||||
void user_regs_reset_single_step(struct user_pt_regs *regs,
|
||||
struct task_struct *task)
|
||||
{
|
||||
if (test_tsk_thread_flag(task, TIF_SINGLESTEP))
|
||||
set_user_regs_spsr_ss(regs);
|
||||
else
|
||||
clear_user_regs_spsr_ss(regs);
|
||||
}
|
||||
|
||||
/* Kernel API */
|
||||
void kernel_enable_single_step(struct pt_regs *regs)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1647,12 +1647,23 @@ static void tracehook_report_syscall(struct pt_regs *regs,
|
|||
saved_reg = regs->regs[regno];
|
||||
regs->regs[regno] = dir;
|
||||
|
||||
if (dir == PTRACE_SYSCALL_EXIT)
|
||||
if (dir == PTRACE_SYSCALL_ENTER) {
|
||||
if (tracehook_report_syscall_entry(regs))
|
||||
forget_syscall(regs);
|
||||
regs->regs[regno] = saved_reg;
|
||||
} else if (!test_thread_flag(TIF_SINGLESTEP)) {
|
||||
tracehook_report_syscall_exit(regs, 0);
|
||||
else if (tracehook_report_syscall_entry(regs))
|
||||
forget_syscall(regs);
|
||||
regs->regs[regno] = saved_reg;
|
||||
} else {
|
||||
regs->regs[regno] = saved_reg;
|
||||
|
||||
regs->regs[regno] = saved_reg;
|
||||
/*
|
||||
* Signal a pseudo-step exception since we are stepping but
|
||||
* tracer modifications to the registers may have rewound the
|
||||
* state machine.
|
||||
*/
|
||||
tracehook_report_syscall_exit(regs, 1);
|
||||
}
|
||||
}
|
||||
|
||||
int syscall_trace_enter(struct pt_regs *regs)
|
||||
|
|
@ -1675,12 +1686,14 @@ int syscall_trace_enter(struct pt_regs *regs)
|
|||
|
||||
void syscall_trace_exit(struct pt_regs *regs)
|
||||
{
|
||||
unsigned long flags = READ_ONCE(current_thread_info()->flags);
|
||||
|
||||
audit_syscall_exit(regs);
|
||||
|
||||
if (test_thread_flag(TIF_SYSCALL_TRACEPOINT))
|
||||
if (flags & _TIF_SYSCALL_TRACEPOINT)
|
||||
trace_sys_exit(regs, regs_return_value(regs));
|
||||
|
||||
if (test_thread_flag(TIF_SYSCALL_TRACE))
|
||||
if (flags & (_TIF_SYSCALL_TRACE | _TIF_SINGLESTEP))
|
||||
tracehook_report_syscall(regs, PTRACE_SYSCALL_EXIT);
|
||||
|
||||
rseq_syscall(regs);
|
||||
|
|
@ -1758,8 +1771,8 @@ static int valid_native_regs(struct user_pt_regs *regs)
|
|||
*/
|
||||
int valid_user_regs(struct user_pt_regs *regs, struct task_struct *task)
|
||||
{
|
||||
if (!test_tsk_thread_flag(task, TIF_SINGLESTEP))
|
||||
regs->pstate &= ~DBG_SPSR_SS;
|
||||
/* https://lore.kernel.org/lkml/20191118131525.GA4180@willie-the-truck */
|
||||
user_regs_reset_single_step(regs, task);
|
||||
|
||||
if (is_compat_thread(task_thread_info(task)))
|
||||
return valid_compat_regs(regs);
|
||||
|
|
|
|||
|
|
@ -798,7 +798,6 @@ static void setup_restart_syscall(struct pt_regs *regs)
|
|||
*/
|
||||
static void handle_signal(struct ksignal *ksig, struct pt_regs *regs)
|
||||
{
|
||||
struct task_struct *tsk = current;
|
||||
sigset_t *oldset = sigmask_to_save();
|
||||
int usig = ksig->sig;
|
||||
int ret;
|
||||
|
|
@ -822,14 +821,8 @@ static void handle_signal(struct ksignal *ksig, struct pt_regs *regs)
|
|||
*/
|
||||
ret |= !valid_user_regs(®s->user_regs, current);
|
||||
|
||||
/*
|
||||
* Fast forward the stepping logic so we step into the signal
|
||||
* handler.
|
||||
*/
|
||||
if (!ret)
|
||||
user_fastforward_single_step(tsk);
|
||||
|
||||
signal_setup_done(ret, ksig, 0);
|
||||
/* Step into the signal handler if we are stepping */
|
||||
signal_setup_done(ret, ksig, test_thread_flag(TIF_SINGLESTEP));
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -50,6 +50,9 @@ static void invoke_syscall(struct pt_regs *regs, unsigned int scno,
|
|||
ret = do_ni_syscall(regs, scno);
|
||||
}
|
||||
|
||||
if (is_compat_task())
|
||||
ret = lower_32_bits(ret);
|
||||
|
||||
regs->regs[0] = ret;
|
||||
}
|
||||
|
||||
|
|
@ -121,7 +124,7 @@ static void el0_svc_common(struct pt_regs *regs, int scno, int sc_nr,
|
|||
if (!has_syscall_work(flags) && !IS_ENABLED(CONFIG_DEBUG_RSEQ)) {
|
||||
local_daif_mask();
|
||||
flags = current_thread_info()->flags;
|
||||
if (!has_syscall_work(flags)) {
|
||||
if (!has_syscall_work(flags) && !(flags & _TIF_SINGLESTEP)) {
|
||||
/*
|
||||
* We're off to userspace, where interrupts are
|
||||
* always enabled after we restore the flags from
|
||||
|
|
|
|||
|
|
@ -154,9 +154,6 @@ SECTIONS
|
|||
*(.altinstructions)
|
||||
__alt_instructions_end = .;
|
||||
}
|
||||
.altinstr_replacement : {
|
||||
*(.altinstr_replacement)
|
||||
}
|
||||
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
__inittext_end = .;
|
||||
|
|
|
|||
|
|
@ -36,7 +36,6 @@ CONFIG_BLK_DEV_SD=y
|
|||
CONFIG_CHR_DEV_ST=y
|
||||
CONFIG_CHR_DEV_OSST=y
|
||||
CONFIG_BLK_DEV_SR=y
|
||||
CONFIG_BLK_DEV_SR_VENDOR=y
|
||||
CONFIG_CHR_DEV_SG=y
|
||||
CONFIG_SCSI_CONSTANTS=y
|
||||
CONFIG_SCSI_LOGGING=y
|
||||
|
|
|
|||
|
|
@ -341,7 +341,6 @@ CONFIG_BLK_DEV_SD=y
|
|||
CONFIG_CHR_DEV_ST=m
|
||||
CONFIG_CHR_DEV_OSST=m
|
||||
CONFIG_BLK_DEV_SR=y
|
||||
CONFIG_BLK_DEV_SR_VENDOR=y
|
||||
CONFIG_CHR_DEV_SG=m
|
||||
CONFIG_SCSI_CONSTANTS=y
|
||||
CONFIG_SCSI_SAS_ATTRS=m
|
||||
|
|
|
|||
|
|
@ -328,7 +328,6 @@ CONFIG_BLK_DEV_SD=y
|
|||
CONFIG_CHR_DEV_ST=m
|
||||
CONFIG_CHR_DEV_OSST=m
|
||||
CONFIG_BLK_DEV_SR=y
|
||||
CONFIG_BLK_DEV_SR_VENDOR=y
|
||||
CONFIG_CHR_DEV_SG=m
|
||||
CONFIG_SCSI_CONSTANTS=y
|
||||
CONFIG_SCSI_SAS_ATTRS=m
|
||||
|
|
|
|||
|
|
@ -336,7 +336,6 @@ CONFIG_BLK_DEV_SD=y
|
|||
CONFIG_CHR_DEV_ST=m
|
||||
CONFIG_CHR_DEV_OSST=m
|
||||
CONFIG_BLK_DEV_SR=y
|
||||
CONFIG_BLK_DEV_SR_VENDOR=y
|
||||
CONFIG_CHR_DEV_SG=m
|
||||
CONFIG_SCSI_CONSTANTS=y
|
||||
CONFIG_SCSI_SAS_ATTRS=m
|
||||
|
|
|
|||
|
|
@ -326,7 +326,6 @@ CONFIG_BLK_DEV_SD=y
|
|||
CONFIG_CHR_DEV_ST=m
|
||||
CONFIG_CHR_DEV_OSST=m
|
||||
CONFIG_BLK_DEV_SR=y
|
||||
CONFIG_BLK_DEV_SR_VENDOR=y
|
||||
CONFIG_CHR_DEV_SG=m
|
||||
CONFIG_SCSI_CONSTANTS=y
|
||||
CONFIG_SCSI_SAS_ATTRS=m
|
||||
|
|
|
|||
|
|
@ -328,7 +328,6 @@ CONFIG_BLK_DEV_SD=y
|
|||
CONFIG_CHR_DEV_ST=m
|
||||
CONFIG_CHR_DEV_OSST=m
|
||||
CONFIG_BLK_DEV_SR=y
|
||||
CONFIG_BLK_DEV_SR_VENDOR=y
|
||||
CONFIG_CHR_DEV_SG=m
|
||||
CONFIG_SCSI_CONSTANTS=y
|
||||
CONFIG_SCSI_SAS_ATTRS=m
|
||||
|
|
|
|||
|
|
@ -335,7 +335,6 @@ CONFIG_BLK_DEV_SD=y
|
|||
CONFIG_CHR_DEV_ST=m
|
||||
CONFIG_CHR_DEV_OSST=m
|
||||
CONFIG_BLK_DEV_SR=y
|
||||
CONFIG_BLK_DEV_SR_VENDOR=y
|
||||
CONFIG_CHR_DEV_SG=m
|
||||
CONFIG_SCSI_CONSTANTS=y
|
||||
CONFIG_SCSI_SAS_ATTRS=m
|
||||
|
|
|
|||
|
|
@ -358,7 +358,6 @@ CONFIG_BLK_DEV_SD=y
|
|||
CONFIG_CHR_DEV_ST=m
|
||||
CONFIG_CHR_DEV_OSST=m
|
||||
CONFIG_BLK_DEV_SR=y
|
||||
CONFIG_BLK_DEV_SR_VENDOR=y
|
||||
CONFIG_CHR_DEV_SG=m
|
||||
CONFIG_SCSI_CONSTANTS=y
|
||||
CONFIG_SCSI_SAS_ATTRS=m
|
||||
|
|
|
|||
|
|
@ -325,7 +325,6 @@ CONFIG_BLK_DEV_SD=y
|
|||
CONFIG_CHR_DEV_ST=m
|
||||
CONFIG_CHR_DEV_OSST=m
|
||||
CONFIG_BLK_DEV_SR=y
|
||||
CONFIG_BLK_DEV_SR_VENDOR=y
|
||||
CONFIG_CHR_DEV_SG=m
|
||||
CONFIG_SCSI_CONSTANTS=y
|
||||
CONFIG_SCSI_SAS_ATTRS=m
|
||||
|
|
|
|||
|
|
@ -326,7 +326,6 @@ CONFIG_BLK_DEV_SD=y
|
|||
CONFIG_CHR_DEV_ST=m
|
||||
CONFIG_CHR_DEV_OSST=m
|
||||
CONFIG_BLK_DEV_SR=y
|
||||
CONFIG_BLK_DEV_SR_VENDOR=y
|
||||
CONFIG_CHR_DEV_SG=m
|
||||
CONFIG_SCSI_CONSTANTS=y
|
||||
CONFIG_SCSI_SAS_ATTRS=m
|
||||
|
|
|
|||
|
|
@ -333,7 +333,6 @@ CONFIG_BLK_DEV_SD=y
|
|||
CONFIG_CHR_DEV_ST=m
|
||||
CONFIG_CHR_DEV_OSST=m
|
||||
CONFIG_BLK_DEV_SR=y
|
||||
CONFIG_BLK_DEV_SR_VENDOR=y
|
||||
CONFIG_CHR_DEV_SG=m
|
||||
CONFIG_SCSI_CONSTANTS=y
|
||||
CONFIG_SCSI_SAS_ATTRS=m
|
||||
|
|
|
|||
|
|
@ -323,7 +323,6 @@ CONFIG_BLK_DEV_SD=y
|
|||
CONFIG_CHR_DEV_ST=m
|
||||
CONFIG_CHR_DEV_OSST=m
|
||||
CONFIG_BLK_DEV_SR=y
|
||||
CONFIG_BLK_DEV_SR_VENDOR=y
|
||||
CONFIG_CHR_DEV_SG=m
|
||||
CONFIG_SCSI_CONSTANTS=y
|
||||
CONFIG_SCSI_SAS_ATTRS=m
|
||||
|
|
|
|||
|
|
@ -323,7 +323,6 @@ CONFIG_BLK_DEV_SD=y
|
|||
CONFIG_CHR_DEV_ST=m
|
||||
CONFIG_CHR_DEV_OSST=m
|
||||
CONFIG_BLK_DEV_SR=y
|
||||
CONFIG_BLK_DEV_SR_VENDOR=y
|
||||
CONFIG_CHR_DEV_SG=m
|
||||
CONFIG_SCSI_CONSTANTS=y
|
||||
CONFIG_SCSI_SAS_ATTRS=m
|
||||
|
|
|
|||
|
|
@ -140,7 +140,8 @@ void __init setup_arch(char **cmdline_p)
|
|||
pr_debug("MEMORY -> ROMFS=0x%p-0x%06lx MEM=0x%06lx-0x%06lx\n ",
|
||||
__bss_stop, memory_start, memory_start, memory_end);
|
||||
|
||||
memblock_add(memory_start, memory_end - memory_start);
|
||||
memblock_add(_rambase, memory_end - _rambase);
|
||||
memblock_reserve(_rambase, memory_start - _rambase);
|
||||
|
||||
/* Keep a copy of command line */
|
||||
*cmdline_p = &command_line[0];
|
||||
|
|
|
|||
|
|
@ -160,7 +160,7 @@ void __init cf_bootmem_alloc(void)
|
|||
m68k_memory[0].addr = _rambase;
|
||||
m68k_memory[0].size = _ramend - _rambase;
|
||||
|
||||
memblock_add(m68k_memory[0].addr, m68k_memory[0].size);
|
||||
memblock_add_node(m68k_memory[0].addr, m68k_memory[0].size, 0);
|
||||
|
||||
/* compute total pages in system */
|
||||
num_pages = PFN_DOWN(_ramend - _rambase);
|
||||
|
|
|
|||
|
|
@ -123,7 +123,6 @@ CONFIG_BLK_DEV_TC86C001=m
|
|||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_CHR_DEV_ST=y
|
||||
CONFIG_BLK_DEV_SR=y
|
||||
CONFIG_BLK_DEV_SR_VENDOR=y
|
||||
CONFIG_CHR_DEV_SG=m
|
||||
CONFIG_CHR_DEV_SCH=m
|
||||
CONFIG_ATA=y
|
||||
|
|
|
|||
|
|
@ -111,7 +111,6 @@ CONFIG_CDROM_PKTCDVD=m
|
|||
CONFIG_ATA_OVER_ETH=m
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_BLK_DEV_SR=y
|
||||
CONFIG_BLK_DEV_SR_VENDOR=y
|
||||
CONFIG_CHR_DEV_SG=y
|
||||
CONFIG_SCSI_CONSTANTS=y
|
||||
# CONFIG_SCSI_LOWLEVEL is not set
|
||||
|
|
|
|||
|
|
@ -107,7 +107,6 @@ CONFIG_SCSI=y
|
|||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_CHR_DEV_ST=y
|
||||
CONFIG_BLK_DEV_SR=m
|
||||
CONFIG_BLK_DEV_SR_VENDOR=y
|
||||
CONFIG_CHR_DEV_SG=m
|
||||
CONFIG_CHR_DEV_SCH=m
|
||||
CONFIG_SCSI_CONSTANTS=y
|
||||
|
|
|
|||
|
|
@ -54,7 +54,6 @@ CONFIG_RAID_ATTRS=y
|
|||
CONFIG_SCSI=y
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_BLK_DEV_SR=y
|
||||
CONFIG_BLK_DEV_SR_VENDOR=y
|
||||
CONFIG_CHR_DEV_SG=m
|
||||
CONFIG_SCSI_MULTI_LUN=y
|
||||
CONFIG_SCSI_CONSTANTS=y
|
||||
|
|
|
|||
|
|
@ -206,7 +206,6 @@ CONFIG_SCSI=y
|
|||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_CHR_DEV_ST=m
|
||||
CONFIG_BLK_DEV_SR=m
|
||||
CONFIG_BLK_DEV_SR_VENDOR=y
|
||||
CONFIG_SCSI_CONSTANTS=y
|
||||
CONFIG_SCSI_SCAN_ASYNC=y
|
||||
CONFIG_SCSI_FC_ATTRS=y
|
||||
|
|
|
|||
|
|
@ -245,7 +245,6 @@ CONFIG_BLK_DEV_SD=y
|
|||
CONFIG_CHR_DEV_ST=m
|
||||
CONFIG_CHR_DEV_OSST=m
|
||||
CONFIG_BLK_DEV_SR=y
|
||||
CONFIG_BLK_DEV_SR_VENDOR=y
|
||||
CONFIG_CHR_DEV_SG=m
|
||||
CONFIG_SCSI_CONSTANTS=y
|
||||
CONFIG_SCSI_LOGGING=y
|
||||
|
|
|
|||
|
|
@ -252,7 +252,6 @@ CONFIG_BLK_DEV_SD=y
|
|||
CONFIG_CHR_DEV_ST=m
|
||||
CONFIG_CHR_DEV_OSST=m
|
||||
CONFIG_BLK_DEV_SR=y
|
||||
CONFIG_BLK_DEV_SR_VENDOR=y
|
||||
CONFIG_CHR_DEV_SG=m
|
||||
CONFIG_SCSI_MULTI_LUN=y
|
||||
CONFIG_SCSI_CONSTANTS=y
|
||||
|
|
|
|||
|
|
@ -254,7 +254,6 @@ CONFIG_BLK_DEV_SD=y
|
|||
CONFIG_CHR_DEV_ST=m
|
||||
CONFIG_CHR_DEV_OSST=m
|
||||
CONFIG_BLK_DEV_SR=y
|
||||
CONFIG_BLK_DEV_SR_VENDOR=y
|
||||
CONFIG_CHR_DEV_SG=m
|
||||
CONFIG_SCSI_MULTI_LUN=y
|
||||
CONFIG_SCSI_CONSTANTS=y
|
||||
|
|
|
|||
|
|
@ -250,7 +250,6 @@ CONFIG_BLK_DEV_SD=y
|
|||
CONFIG_CHR_DEV_ST=m
|
||||
CONFIG_CHR_DEV_OSST=m
|
||||
CONFIG_BLK_DEV_SR=y
|
||||
CONFIG_BLK_DEV_SR_VENDOR=y
|
||||
CONFIG_CHR_DEV_SG=m
|
||||
CONFIG_SCSI_CONSTANTS=y
|
||||
CONFIG_SCSI_LOGGING=y
|
||||
|
|
|
|||
|
|
@ -218,7 +218,6 @@ CONFIG_SCSI=y
|
|||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_CHR_DEV_ST=m
|
||||
CONFIG_BLK_DEV_SR=m
|
||||
CONFIG_BLK_DEV_SR_VENDOR=y
|
||||
CONFIG_SCSI_CONSTANTS=y
|
||||
CONFIG_SCSI_SCAN_ASYNC=y
|
||||
CONFIG_SCSI_FC_ATTRS=y
|
||||
|
|
|
|||
|
|
@ -40,10 +40,8 @@ static unsigned long glb_lpj_ref_freq;
|
|||
static int cpufreq_callback(struct notifier_block *nb,
|
||||
unsigned long val, void *data)
|
||||
{
|
||||
struct cpufreq_freqs *freq = data;
|
||||
struct cpumask *cpus = freq->policy->cpus;
|
||||
unsigned long lpj;
|
||||
int cpu;
|
||||
struct cpufreq_freqs *freq = data;
|
||||
|
||||
/*
|
||||
* Skip lpj numbers adjustment if the CPU-freq transition is safe for
|
||||
|
|
@ -64,6 +62,7 @@ static int cpufreq_callback(struct notifier_block *nb,
|
|||
}
|
||||
}
|
||||
|
||||
cpu = freq->cpu;
|
||||
/*
|
||||
* Adjust global lpj variable and per-CPU udelay_val number in
|
||||
* accordance with the new CPU frequency.
|
||||
|
|
@ -74,12 +73,8 @@ static int cpufreq_callback(struct notifier_block *nb,
|
|||
glb_lpj_ref_freq,
|
||||
freq->new);
|
||||
|
||||
for_each_cpu(cpu, cpus) {
|
||||
lpj = cpufreq_scale(per_cpu(pcp_lpj_ref, cpu),
|
||||
per_cpu(pcp_lpj_ref_freq, cpu),
|
||||
freq->new);
|
||||
cpu_data[cpu].udelay_val = (unsigned int)lpj;
|
||||
}
|
||||
cpu_data[cpu].udelay_val = cpufreq_scale(per_cpu(pcp_lpj_ref, cpu),
|
||||
per_cpu(pcp_lpj_ref_freq, cpu), freq->new);
|
||||
}
|
||||
|
||||
return NOTIFY_OK;
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@ CONFIG_AQUANTIA_PHY=y
|
|||
CONFIG_AT803X_PHY=y
|
||||
CONFIG_ATA=y
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_BLK_DEV_SR_VENDOR=y
|
||||
CONFIG_BLK_DEV_SR=y
|
||||
CONFIG_BROADCOM_PHY=y
|
||||
CONFIG_C293_PCIE=y
|
||||
|
|
|
|||
|
|
@ -48,7 +48,6 @@ CONFIG_BLK_DEV_RAM=y
|
|||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_CHR_DEV_ST=y
|
||||
CONFIG_BLK_DEV_SR=y
|
||||
CONFIG_BLK_DEV_SR_VENDOR=y
|
||||
CONFIG_CHR_DEV_SG=y
|
||||
CONFIG_SCSI_CONSTANTS=y
|
||||
CONFIG_SCSI_SYM53C8XX_2=y
|
||||
|
|
|
|||
|
|
@ -46,7 +46,6 @@ CONFIG_BLK_DEV_RAM=y
|
|||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_CHR_DEV_ST=y
|
||||
CONFIG_BLK_DEV_SR=y
|
||||
CONFIG_BLK_DEV_SR_VENDOR=y
|
||||
CONFIG_CHR_DEV_SG=y
|
||||
CONFIG_SCSI_CONSTANTS=y
|
||||
CONFIG_SCSI_SYM53C8XX_2=y
|
||||
|
|
|
|||
|
|
@ -63,7 +63,6 @@ CONFIG_CDROM_PKTCDVD=m
|
|||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_CHR_DEV_ST=y
|
||||
CONFIG_BLK_DEV_SR=y
|
||||
CONFIG_BLK_DEV_SR_VENDOR=y
|
||||
CONFIG_CHR_DEV_SG=y
|
||||
CONFIG_SCSI_CONSTANTS=y
|
||||
CONFIG_SCSI_SPI_ATTRS=y
|
||||
|
|
|
|||
|
|
@ -42,7 +42,6 @@ CONFIG_BLK_DEV_RAM_SIZE=8192
|
|||
# CONFIG_SCSI_PROC_FS is not set
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_BLK_DEV_SR=y
|
||||
CONFIG_BLK_DEV_SR_VENDOR=y
|
||||
CONFIG_CHR_DEV_SG=y
|
||||
CONFIG_SCSI_IPR=y
|
||||
CONFIG_ATA=y
|
||||
|
|
|
|||
|
|
@ -61,7 +61,6 @@ CONFIG_BLK_DEV_SD=y
|
|||
CONFIG_CHR_DEV_ST=y
|
||||
CONFIG_CHR_DEV_OSST=y
|
||||
CONFIG_BLK_DEV_SR=y
|
||||
CONFIG_BLK_DEV_SR_VENDOR=y
|
||||
CONFIG_CHR_DEV_SG=y
|
||||
CONFIG_CHR_DEV_SCH=y
|
||||
CONFIG_SCSI_CONSTANTS=y
|
||||
|
|
|
|||
|
|
@ -121,7 +121,6 @@ CONFIG_BLK_DEV_RAM=y
|
|||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_CHR_DEV_ST=y
|
||||
CONFIG_BLK_DEV_SR=y
|
||||
CONFIG_BLK_DEV_SR_VENDOR=y
|
||||
CONFIG_CHR_DEV_SG=y
|
||||
CONFIG_SCSI_CONSTANTS=y
|
||||
CONFIG_SCSI_FC_ATTRS=y
|
||||
|
|
|
|||
|
|
@ -109,7 +109,6 @@ CONFIG_BLK_DEV_NVME=y
|
|||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_CHR_DEV_ST=m
|
||||
CONFIG_BLK_DEV_SR=m
|
||||
CONFIG_BLK_DEV_SR_VENDOR=y
|
||||
CONFIG_CHR_DEV_SG=m
|
||||
CONFIG_SCSI_CONSTANTS=y
|
||||
CONFIG_SCSI_SCAN_ASYNC=y
|
||||
|
|
|
|||
|
|
@ -93,7 +93,6 @@ CONFIG_VIRTIO_BLK=m
|
|||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_CHR_DEV_ST=m
|
||||
CONFIG_BLK_DEV_SR=y
|
||||
CONFIG_BLK_DEV_SR_VENDOR=y
|
||||
CONFIG_CHR_DEV_SG=y
|
||||
CONFIG_SCSI_CONSTANTS=y
|
||||
CONFIG_SCSI_FC_ATTRS=y
|
||||
|
|
|
|||
|
|
@ -61,7 +61,6 @@ CONFIG_BLK_DEV_RAM_SIZE=65536
|
|||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_CHR_DEV_ST=y
|
||||
CONFIG_BLK_DEV_SR=y
|
||||
CONFIG_BLK_DEV_SR_VENDOR=y
|
||||
CONFIG_CHR_DEV_SG=y
|
||||
CONFIG_SCSI_CONSTANTS=y
|
||||
CONFIG_SCSI_FC_ATTRS=y
|
||||
|
|
|
|||
|
|
@ -374,7 +374,6 @@ CONFIG_BLK_DEV_SD=y
|
|||
CONFIG_CHR_DEV_ST=m
|
||||
CONFIG_CHR_DEV_OSST=m
|
||||
CONFIG_BLK_DEV_SR=m
|
||||
CONFIG_BLK_DEV_SR_VENDOR=y
|
||||
CONFIG_CHR_DEV_SG=y
|
||||
CONFIG_CHR_DEV_SCH=m
|
||||
CONFIG_SCSI_ENCLOSURE=m
|
||||
|
|
|
|||
|
|
@ -97,7 +97,6 @@ CONFIG_VIRTIO_BLK=m
|
|||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_CHR_DEV_ST=m
|
||||
CONFIG_BLK_DEV_SR=y
|
||||
CONFIG_BLK_DEV_SR_VENDOR=y
|
||||
CONFIG_CHR_DEV_SG=y
|
||||
CONFIG_SCSI_CONSTANTS=y
|
||||
CONFIG_SCSI_FC_ATTRS=y
|
||||
|
|
|
|||
|
|
@ -77,7 +77,6 @@ CONFIG_EEPROM_AT24=y
|
|||
# CONFIG_CXL is not set
|
||||
CONFIG_BLK_DEV_SD=m
|
||||
CONFIG_BLK_DEV_SR=m
|
||||
CONFIG_BLK_DEV_SR_VENDOR=y
|
||||
CONFIG_CHR_DEV_SG=m
|
||||
CONFIG_SCSI_CONSTANTS=y
|
||||
CONFIG_SCSI_SCAN_ASYNC=y
|
||||
|
|
|
|||
|
|
@ -365,12 +365,14 @@ static bool pkey_access_permitted(int pkey, bool write, bool execute)
|
|||
return true;
|
||||
|
||||
pkey_shift = pkeyshift(pkey);
|
||||
if (execute && !(read_iamr() & (IAMR_EX_BIT << pkey_shift)))
|
||||
return true;
|
||||
if (execute)
|
||||
return !(read_iamr() & (IAMR_EX_BIT << pkey_shift));
|
||||
|
||||
amr = read_amr(); /* Delay reading amr until absolutely needed */
|
||||
return ((!write && !(amr & (AMR_RD_BIT << pkey_shift))) ||
|
||||
(write && !(amr & (AMR_WR_BIT << pkey_shift))));
|
||||
amr = read_amr();
|
||||
if (write)
|
||||
return !(amr & (AMR_WR_BIT << pkey_shift));
|
||||
|
||||
return !(amr & (AMR_RD_BIT << pkey_shift));
|
||||
}
|
||||
|
||||
bool arch_pte_access_permitted(u64 pte, bool write, bool execute)
|
||||
|
|
|
|||
|
|
@ -20,7 +20,11 @@
|
|||
#include <linux/const.h>
|
||||
|
||||
/* thread information allocation */
|
||||
#ifdef CONFIG_64BIT
|
||||
#define THREAD_SIZE_ORDER (2)
|
||||
#else
|
||||
#define THREAD_SIZE_ORDER (1)
|
||||
#endif
|
||||
#define THREAD_SIZE (PAGE_SIZE << THREAD_SIZE_ORDER)
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
|
|
|||
|
|
@ -47,7 +47,6 @@ CONFIG_BLK_DEV_IDETAPE=m
|
|||
CONFIG_SCSI=m
|
||||
CONFIG_BLK_DEV_SD=m
|
||||
CONFIG_BLK_DEV_SR=m
|
||||
CONFIG_BLK_DEV_SR_VENDOR=y
|
||||
CONFIG_CHR_DEV_SG=m
|
||||
CONFIG_NETDEVICES=y
|
||||
CONFIG_NET_ETHERNET=y
|
||||
|
|
|
|||
|
|
@ -74,7 +74,6 @@ CONFIG_RAID_ATTRS=m
|
|||
CONFIG_SCSI=y
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_BLK_DEV_SR=m
|
||||
CONFIG_BLK_DEV_SR_VENDOR=y
|
||||
CONFIG_CHR_DEV_SG=m
|
||||
CONFIG_SCSI_MULTI_LUN=y
|
||||
CONFIG_SCSI_CONSTANTS=y
|
||||
|
|
|
|||
|
|
@ -149,7 +149,6 @@ CONFIG_CONNECTOR=y
|
|||
CONFIG_BLK_DEV_LOOP=y
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_BLK_DEV_SR=y
|
||||
CONFIG_BLK_DEV_SR_VENDOR=y
|
||||
CONFIG_CHR_DEV_SG=y
|
||||
CONFIG_SCSI_CONSTANTS=y
|
||||
CONFIG_SCSI_SPI_ATTRS=y
|
||||
|
|
|
|||
|
|
@ -148,7 +148,6 @@ CONFIG_CONNECTOR=y
|
|||
CONFIG_BLK_DEV_LOOP=y
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_BLK_DEV_SR=y
|
||||
CONFIG_BLK_DEV_SR_VENDOR=y
|
||||
CONFIG_CHR_DEV_SG=y
|
||||
CONFIG_SCSI_CONSTANTS=y
|
||||
CONFIG_SCSI_SPI_ATTRS=y
|
||||
|
|
|
|||
|
|
@ -448,12 +448,10 @@ static int x86_vector_activate(struct irq_domain *dom, struct irq_data *irqd,
|
|||
trace_vector_activate(irqd->irq, apicd->is_managed,
|
||||
apicd->can_reserve, reserve);
|
||||
|
||||
/* Nothing to do for fixed assigned vectors */
|
||||
if (!apicd->can_reserve && !apicd->is_managed)
|
||||
return 0;
|
||||
|
||||
raw_spin_lock_irqsave(&vector_lock, flags);
|
||||
if (reserve || irqd_is_managed_and_shutdown(irqd))
|
||||
if (!apicd->can_reserve && !apicd->is_managed)
|
||||
assign_irq_vector_any_locked(irqd);
|
||||
else if (reserve || irqd_is_managed_and_shutdown(irqd))
|
||||
vector_assign_managed_shutdown(irqd);
|
||||
else if (apicd->is_managed)
|
||||
ret = activate_managed(irqd);
|
||||
|
|
@ -771,20 +769,10 @@ void lapic_offline(void)
|
|||
static int apic_set_affinity(struct irq_data *irqd,
|
||||
const struct cpumask *dest, bool force)
|
||||
{
|
||||
struct apic_chip_data *apicd = apic_chip_data(irqd);
|
||||
int err;
|
||||
|
||||
/*
|
||||
* Core code can call here for inactive interrupts. For inactive
|
||||
* interrupts which use managed or reservation mode there is no
|
||||
* point in going through the vector assignment right now as the
|
||||
* activation will assign a vector which fits the destination
|
||||
* cpumask. Let the core code store the destination mask and be
|
||||
* done with it.
|
||||
*/
|
||||
if (!irqd_is_activated(irqd) &&
|
||||
(apicd->is_managed || apicd->can_reserve))
|
||||
return IRQ_SET_MASK_OK;
|
||||
if (WARN_ON_ONCE(!irqd_is_activated(irqd)))
|
||||
return -EIO;
|
||||
|
||||
raw_spin_lock(&vector_lock);
|
||||
cpumask_and(vector_searchmask, dest, cpu_online_mask);
|
||||
|
|
|
|||
|
|
@ -1029,7 +1029,7 @@ int copy_xstate_to_kernel(void *kbuf, struct xregs_state *xsave, unsigned int of
|
|||
copy_part(offsetof(struct fxregs_state, st_space), 128,
|
||||
&xsave->i387.st_space, &kbuf, &offset_start, &count);
|
||||
if (header.xfeatures & XFEATURE_MASK_SSE)
|
||||
copy_part(xstate_offsets[XFEATURE_MASK_SSE], 256,
|
||||
copy_part(xstate_offsets[XFEATURE_SSE], 256,
|
||||
&xsave->i387.xmm_space, &kbuf, &offset_start, &count);
|
||||
/*
|
||||
* Fill xsave->i387.sw_reserved value for ptrace frame:
|
||||
|
|
|
|||
|
|
@ -328,6 +328,25 @@ static const struct dmi_system_id video_detect_dmi_table[] = {
|
|||
DMI_MATCH(DMI_PRODUCT_NAME, "Precision 7510"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = video_detect_force_native,
|
||||
.ident = "Acer Aspire 5738z",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5738"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "JV50"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* https://bugzilla.kernel.org/show_bug.cgi?id=207835 */
|
||||
.callback = video_detect_force_native,
|
||||
.ident = "Acer TravelMate 5735Z",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 5735Z"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "BA51_MV"),
|
||||
},
|
||||
},
|
||||
|
||||
/*
|
||||
* Desktops which falsely report a backlight and which our heuristics
|
||||
|
|
|
|||
|
|
@ -453,29 +453,31 @@ static ssize_t regmap_cache_only_write_file(struct file *file,
|
|||
{
|
||||
struct regmap *map = container_of(file->private_data,
|
||||
struct regmap, cache_only);
|
||||
ssize_t result;
|
||||
bool was_enabled, require_sync = false;
|
||||
bool new_val, require_sync = false;
|
||||
int err;
|
||||
|
||||
err = kstrtobool_from_user(user_buf, count, &new_val);
|
||||
/* Ignore malforned data like debugfs_write_file_bool() */
|
||||
if (err)
|
||||
return count;
|
||||
|
||||
err = debugfs_file_get(file->f_path.dentry);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
map->lock(map->lock_arg);
|
||||
|
||||
was_enabled = map->cache_only;
|
||||
|
||||
result = debugfs_write_file_bool(file, user_buf, count, ppos);
|
||||
if (result < 0) {
|
||||
map->unlock(map->lock_arg);
|
||||
return result;
|
||||
}
|
||||
|
||||
if (map->cache_only && !was_enabled) {
|
||||
if (new_val && !map->cache_only) {
|
||||
dev_warn(map->dev, "debugfs cache_only=Y forced\n");
|
||||
add_taint(TAINT_USER, LOCKDEP_STILL_OK);
|
||||
} else if (!map->cache_only && was_enabled) {
|
||||
} else if (!new_val && map->cache_only) {
|
||||
dev_warn(map->dev, "debugfs cache_only=N forced: syncing cache\n");
|
||||
require_sync = true;
|
||||
}
|
||||
map->cache_only = new_val;
|
||||
|
||||
map->unlock(map->lock_arg);
|
||||
debugfs_file_put(file->f_path.dentry);
|
||||
|
||||
if (require_sync) {
|
||||
err = regcache_sync(map);
|
||||
|
|
@ -483,7 +485,7 @@ static ssize_t regmap_cache_only_write_file(struct file *file,
|
|||
dev_err(map->dev, "Failed to sync cache %d\n", err);
|
||||
}
|
||||
|
||||
return result;
|
||||
return count;
|
||||
}
|
||||
|
||||
static const struct file_operations regmap_cache_only_fops = {
|
||||
|
|
@ -498,28 +500,32 @@ static ssize_t regmap_cache_bypass_write_file(struct file *file,
|
|||
{
|
||||
struct regmap *map = container_of(file->private_data,
|
||||
struct regmap, cache_bypass);
|
||||
ssize_t result;
|
||||
bool was_enabled;
|
||||
bool new_val;
|
||||
int err;
|
||||
|
||||
err = kstrtobool_from_user(user_buf, count, &new_val);
|
||||
/* Ignore malforned data like debugfs_write_file_bool() */
|
||||
if (err)
|
||||
return count;
|
||||
|
||||
err = debugfs_file_get(file->f_path.dentry);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
map->lock(map->lock_arg);
|
||||
|
||||
was_enabled = map->cache_bypass;
|
||||
|
||||
result = debugfs_write_file_bool(file, user_buf, count, ppos);
|
||||
if (result < 0)
|
||||
goto out;
|
||||
|
||||
if (map->cache_bypass && !was_enabled) {
|
||||
if (new_val && !map->cache_bypass) {
|
||||
dev_warn(map->dev, "debugfs cache_bypass=Y forced\n");
|
||||
add_taint(TAINT_USER, LOCKDEP_STILL_OK);
|
||||
} else if (!map->cache_bypass && was_enabled) {
|
||||
} else if (!new_val && map->cache_bypass) {
|
||||
dev_warn(map->dev, "debugfs cache_bypass=N forced\n");
|
||||
}
|
||||
map->cache_bypass = new_val;
|
||||
|
||||
out:
|
||||
map->unlock(map->lock_arg);
|
||||
debugfs_file_put(file->f_path.dentry);
|
||||
|
||||
return result;
|
||||
return count;
|
||||
}
|
||||
|
||||
static const struct file_operations regmap_cache_bypass_fops = {
|
||||
|
|
|
|||
|
|
@ -2044,7 +2044,8 @@ static ssize_t hot_add_show(struct class *class,
|
|||
return ret;
|
||||
return scnprintf(buf, PAGE_SIZE, "%d\n", ret);
|
||||
}
|
||||
static CLASS_ATTR_RO(hot_add);
|
||||
static struct class_attribute class_attr_hot_add =
|
||||
__ATTR(hot_add, 0400, hot_add_show, NULL);
|
||||
|
||||
static ssize_t hot_remove_store(struct class *class,
|
||||
struct class_attribute *attr,
|
||||
|
|
|
|||
|
|
@ -1007,7 +1007,7 @@ int tpm_tis_core_init(struct device *dev, struct tpm_tis_data *priv, int irq,
|
|||
|
||||
return 0;
|
||||
out_err:
|
||||
if ((chip->ops != NULL) && (chip->ops->clk_enable != NULL))
|
||||
if (chip->ops->clk_enable != NULL)
|
||||
chip->ops->clk_enable(chip, false);
|
||||
|
||||
tpm_tis_remove(chip);
|
||||
|
|
|
|||
|
|
@ -2142,6 +2142,7 @@ static struct virtio_device_id id_table[] = {
|
|||
{ VIRTIO_ID_CONSOLE, VIRTIO_DEV_ANY_ID },
|
||||
{ 0 },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(virtio, id_table);
|
||||
|
||||
static unsigned int features[] = {
|
||||
VIRTIO_CONSOLE_F_SIZE,
|
||||
|
|
@ -2154,6 +2155,7 @@ static struct virtio_device_id rproc_serial_id_table[] = {
|
|||
#endif
|
||||
{ 0 },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(virtio, rproc_serial_id_table);
|
||||
|
||||
static unsigned int rproc_serial_features[] = {
|
||||
};
|
||||
|
|
@ -2306,6 +2308,5 @@ static void __exit fini(void)
|
|||
module_init(init);
|
||||
module_exit(fini);
|
||||
|
||||
MODULE_DEVICE_TABLE(virtio, id_table);
|
||||
MODULE_DESCRIPTION("Virtio console driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
|
|
|||
|
|
@ -682,6 +682,13 @@ static irqreturn_t fsl_edma_tx_handler(int irq, void *dev_id)
|
|||
fsl_chan = &fsl_edma->chans[ch];
|
||||
|
||||
spin_lock(&fsl_chan->vchan.lock);
|
||||
|
||||
if (!fsl_chan->edesc) {
|
||||
/* terminate_all called before */
|
||||
spin_unlock(&fsl_chan->vchan.lock);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!fsl_chan->edesc->iscyclic) {
|
||||
list_del(&fsl_chan->edesc->vdesc.node);
|
||||
vchan_cookie_complete(&fsl_chan->edesc->vdesc);
|
||||
|
|
|
|||
|
|
@ -267,8 +267,10 @@ static void mic_pre_enable(struct drm_bridge *bridge)
|
|||
goto unlock;
|
||||
|
||||
ret = pm_runtime_get_sync(mic->dev);
|
||||
if (ret < 0)
|
||||
if (ret < 0) {
|
||||
pm_runtime_put_noidle(mic->dev);
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
mic_set_path(mic, 1);
|
||||
|
||||
|
|
|
|||
|
|
@ -78,8 +78,10 @@ int msm_submitqueue_create(struct drm_device *drm, struct msm_file_private *ctx,
|
|||
queue->flags = flags;
|
||||
|
||||
if (priv->gpu) {
|
||||
if (prio >= priv->gpu->nr_rings)
|
||||
if (prio >= priv->gpu->nr_rings) {
|
||||
kfree(queue);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
queue->prio = prio;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -609,6 +609,7 @@
|
|||
#define USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A081 0xa081
|
||||
#define USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A0C2 0xa0c2
|
||||
#define USB_DEVICE_ID_HOLTEK_ALT_KEYBOARD_A096 0xa096
|
||||
#define USB_DEVICE_ID_HOLTEK_ALT_KEYBOARD_A293 0xa293
|
||||
|
||||
#define USB_VENDOR_ID_IMATION 0x0718
|
||||
#define USB_DEVICE_ID_DISC_STAKKA 0xd000
|
||||
|
|
@ -975,6 +976,8 @@
|
|||
#define USB_DEVICE_ID_ROCCAT_RYOS_MK_PRO 0x3232
|
||||
#define USB_DEVICE_ID_ROCCAT_SAVU 0x2d5a
|
||||
|
||||
#define USB_VENDOR_ID_SAI 0x17dd
|
||||
|
||||
#define USB_VENDOR_ID_SAITEK 0x06a3
|
||||
#define USB_DEVICE_ID_SAITEK_RUMBLEPAD 0xff17
|
||||
#define USB_DEVICE_ID_SAITEK_PS1000 0x0621
|
||||
|
|
|
|||
|
|
@ -452,6 +452,12 @@ static int magicmouse_setup_input(struct input_dev *input, struct hid_device *hd
|
|||
__set_bit(MSC_RAW, input->mscbit);
|
||||
}
|
||||
|
||||
/*
|
||||
* hid-input may mark device as using autorepeat, but neither
|
||||
* the trackpad, nor the mouse actually want it.
|
||||
*/
|
||||
__clear_bit(EV_REP, input->evbit);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -90,6 +90,7 @@ static const struct hid_device_id hid_quirks[] = {
|
|||
{ HID_USB_DEVICE(USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_FIGHTING), HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_FLYING), HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT, USB_DEVICE_ID_HOLTEK_ALT_KEYBOARD_A096), HID_QUIRK_NO_INIT_REPORTS },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT, USB_DEVICE_ID_HOLTEK_ALT_KEYBOARD_A293), HID_QUIRK_ALWAYS_POLL },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_HP, USB_PRODUCT_ID_HP_LOGITECH_OEM_USB_OPTICAL_MOUSE_0A4A), HID_QUIRK_ALWAYS_POLL },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_HP, USB_PRODUCT_ID_HP_LOGITECH_OEM_USB_OPTICAL_MOUSE_0B4A), HID_QUIRK_ALWAYS_POLL },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_HP, USB_PRODUCT_ID_HP_PIXART_OEM_USB_OPTICAL_MOUSE), HID_QUIRK_ALWAYS_POLL },
|
||||
|
|
@ -400,9 +401,6 @@ static const struct hid_device_id hid_have_special_driver[] = {
|
|||
{ HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT, USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A081) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT, USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A0C2) },
|
||||
#endif
|
||||
#if IS_ENABLED(CONFIG_HID_ITE)
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ITE, USB_DEVICE_ID_ITE8595) },
|
||||
#endif
|
||||
#if IS_ENABLED(CONFIG_HID_ICADE)
|
||||
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_ION, USB_DEVICE_ID_ICADE) },
|
||||
#endif
|
||||
|
|
@ -878,6 +876,7 @@ static const struct hid_device_id hid_ignore_list[] = {
|
|||
{ HID_USB_DEVICE(USB_VENDOR_ID_PETZL, USB_DEVICE_ID_PETZL_HEADLAMP) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_PHILIPS, USB_DEVICE_ID_PHILIPS_IEEE802154_DONGLE) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_POWERCOM, USB_DEVICE_ID_POWERCOM_UPS) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_SAI, USB_DEVICE_ID_CYPRESS_HIDCOM) },
|
||||
#if IS_ENABLED(CONFIG_MOUSE_SYNAPTICS_USB)
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_TP) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_INT_TP) },
|
||||
|
|
|
|||
|
|
@ -454,7 +454,7 @@ static ssize_t pwm1_enable_store(struct device *dev,
|
|||
}
|
||||
|
||||
result = read_u8_from_i2c(client, REG_FAN_CONF1, &conf_reg);
|
||||
if (result) {
|
||||
if (result < 0) {
|
||||
count = result;
|
||||
goto err;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -944,15 +944,30 @@ int intel_th_set_output(struct intel_th_device *thdev,
|
|||
{
|
||||
struct intel_th_device *hub = to_intel_th_hub(thdev);
|
||||
struct intel_th_driver *hubdrv = to_intel_th_driver(hub->dev.driver);
|
||||
int ret;
|
||||
|
||||
/* In host mode, this is up to the external debugger, do nothing. */
|
||||
if (hub->host_mode)
|
||||
return 0;
|
||||
|
||||
if (!hubdrv->set_output)
|
||||
return -ENOTSUPP;
|
||||
/*
|
||||
* hub is instantiated together with the source device that
|
||||
* calls here, so guaranteed to be present.
|
||||
*/
|
||||
hubdrv = to_intel_th_driver(hub->dev.driver);
|
||||
if (!hubdrv || !try_module_get(hubdrv->driver.owner))
|
||||
return -EINVAL;
|
||||
|
||||
return hubdrv->set_output(hub, master);
|
||||
if (!hubdrv->set_output) {
|
||||
ret = -ENOTSUPP;
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = hubdrv->set_output(hub, master);
|
||||
|
||||
out:
|
||||
module_put(hubdrv->driver.owner);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(intel_th_set_output);
|
||||
|
||||
|
|
|
|||
|
|
@ -205,11 +205,21 @@ static const struct pci_device_id intel_th_pci_id_table[] = {
|
|||
PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xa0a6),
|
||||
.driver_data = (kernel_ulong_t)&intel_th_2x,
|
||||
},
|
||||
{
|
||||
/* Tiger Lake PCH-H */
|
||||
PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x43a6),
|
||||
.driver_data = (kernel_ulong_t)&intel_th_2x,
|
||||
},
|
||||
{
|
||||
/* Jasper Lake PCH */
|
||||
PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x4da6),
|
||||
.driver_data = (kernel_ulong_t)&intel_th_2x,
|
||||
},
|
||||
{
|
||||
/* Jasper Lake CPU */
|
||||
PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x4e29),
|
||||
.driver_data = (kernel_ulong_t)&intel_th_2x,
|
||||
},
|
||||
{
|
||||
/* Elkhart Lake CPU */
|
||||
PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x4529),
|
||||
|
|
@ -220,6 +230,11 @@ static const struct pci_device_id intel_th_pci_id_table[] = {
|
|||
PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x4b26),
|
||||
.driver_data = (kernel_ulong_t)&intel_th_2x,
|
||||
},
|
||||
{
|
||||
/* Emmitsburg PCH */
|
||||
PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x1bcc),
|
||||
.driver_data = (kernel_ulong_t)&intel_th_2x,
|
||||
},
|
||||
{ 0 },
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -157,9 +157,7 @@ static int sth_stm_link(struct stm_data *stm_data, unsigned int master,
|
|||
{
|
||||
struct sth_device *sth = container_of(stm_data, struct sth_device, stm);
|
||||
|
||||
intel_th_set_output(to_intel_th_device(sth->dev), master);
|
||||
|
||||
return 0;
|
||||
return intel_th_set_output(to_intel_th_device(sth->dev), master);
|
||||
}
|
||||
|
||||
static int intel_th_sw_init(struct sth_device *sth)
|
||||
|
|
|
|||
|
|
@ -188,6 +188,7 @@ static const struct pci_device_id pch_pcidev_id[] = {
|
|||
{ PCI_VDEVICE(ROHM, PCI_DEVICE_ID_ML7831_I2C), 1, },
|
||||
{0,}
|
||||
};
|
||||
MODULE_DEVICE_TABLE(pci, pch_pcidev_id);
|
||||
|
||||
static irqreturn_t pch_i2c_handler(int irq, void *pData);
|
||||
|
||||
|
|
|
|||
|
|
@ -1651,10 +1651,13 @@ static int mma8452_probe(struct i2c_client *client,
|
|||
|
||||
ret = mma8452_set_freefall_mode(data, false);
|
||||
if (ret < 0)
|
||||
goto buffer_cleanup;
|
||||
goto unregister_device;
|
||||
|
||||
return 0;
|
||||
|
||||
unregister_device:
|
||||
iio_device_unregister(indio_dev);
|
||||
|
||||
buffer_cleanup:
|
||||
iio_triggered_buffer_cleanup(indio_dev);
|
||||
|
||||
|
|
|
|||
|
|
@ -71,6 +71,7 @@ static const struct reg_field afe4403_reg_fields[] = {
|
|||
* @regulator: Pointer to the regulator for the IC
|
||||
* @trig: IIO trigger for this device
|
||||
* @irq: ADC_RDY line interrupt number
|
||||
* @buffer: Used to construct data layout to push into IIO buffer.
|
||||
*/
|
||||
struct afe4403_data {
|
||||
struct device *dev;
|
||||
|
|
@ -80,6 +81,8 @@ struct afe4403_data {
|
|||
struct regulator *regulator;
|
||||
struct iio_trigger *trig;
|
||||
int irq;
|
||||
/* Ensure suitable alignment for timestamp */
|
||||
s32 buffer[8] __aligned(8);
|
||||
};
|
||||
|
||||
enum afe4403_chan_id {
|
||||
|
|
@ -317,7 +320,6 @@ static irqreturn_t afe4403_trigger_handler(int irq, void *private)
|
|||
struct iio_dev *indio_dev = pf->indio_dev;
|
||||
struct afe4403_data *afe = iio_priv(indio_dev);
|
||||
int ret, bit, i = 0;
|
||||
s32 buffer[8];
|
||||
u8 tx[4] = {AFE440X_CONTROL0, 0x0, 0x0, AFE440X_CONTROL0_READ};
|
||||
u8 rx[3];
|
||||
|
||||
|
|
@ -334,9 +336,9 @@ static irqreturn_t afe4403_trigger_handler(int irq, void *private)
|
|||
if (ret)
|
||||
goto err;
|
||||
|
||||
buffer[i++] = (rx[0] << 16) |
|
||||
(rx[1] << 8) |
|
||||
(rx[2]);
|
||||
afe->buffer[i++] = (rx[0] << 16) |
|
||||
(rx[1] << 8) |
|
||||
(rx[2]);
|
||||
}
|
||||
|
||||
/* Disable reading from the device */
|
||||
|
|
@ -345,7 +347,8 @@ static irqreturn_t afe4403_trigger_handler(int irq, void *private)
|
|||
if (ret)
|
||||
goto err;
|
||||
|
||||
iio_push_to_buffers_with_timestamp(indio_dev, buffer, pf->timestamp);
|
||||
iio_push_to_buffers_with_timestamp(indio_dev, afe->buffer,
|
||||
pf->timestamp);
|
||||
err:
|
||||
iio_trigger_notify_done(indio_dev->trig);
|
||||
|
||||
|
|
|
|||
|
|
@ -91,6 +91,7 @@ static const struct reg_field afe4404_reg_fields[] = {
|
|||
* @regulator: Pointer to the regulator for the IC
|
||||
* @trig: IIO trigger for this device
|
||||
* @irq: ADC_RDY line interrupt number
|
||||
* @buffer: Used to construct a scan to push to the iio buffer.
|
||||
*/
|
||||
struct afe4404_data {
|
||||
struct device *dev;
|
||||
|
|
@ -99,6 +100,7 @@ struct afe4404_data {
|
|||
struct regulator *regulator;
|
||||
struct iio_trigger *trig;
|
||||
int irq;
|
||||
s32 buffer[10] __aligned(8);
|
||||
};
|
||||
|
||||
enum afe4404_chan_id {
|
||||
|
|
@ -336,17 +338,17 @@ static irqreturn_t afe4404_trigger_handler(int irq, void *private)
|
|||
struct iio_dev *indio_dev = pf->indio_dev;
|
||||
struct afe4404_data *afe = iio_priv(indio_dev);
|
||||
int ret, bit, i = 0;
|
||||
s32 buffer[10];
|
||||
|
||||
for_each_set_bit(bit, indio_dev->active_scan_mask,
|
||||
indio_dev->masklength) {
|
||||
ret = regmap_read(afe->regmap, afe4404_channel_values[bit],
|
||||
&buffer[i++]);
|
||||
&afe->buffer[i++]);
|
||||
if (ret)
|
||||
goto err;
|
||||
}
|
||||
|
||||
iio_push_to_buffers_with_timestamp(indio_dev, buffer, pf->timestamp);
|
||||
iio_push_to_buffers_with_timestamp(indio_dev, afe->buffer,
|
||||
pf->timestamp);
|
||||
err:
|
||||
iio_trigger_notify_done(indio_dev->trig);
|
||||
|
||||
|
|
|
|||
|
|
@ -38,6 +38,11 @@ struct hdc100x_data {
|
|||
|
||||
/* integration time of the sensor */
|
||||
int adc_int_us[2];
|
||||
/* Ensure natural alignment of timestamp */
|
||||
struct {
|
||||
__be16 channels[2];
|
||||
s64 ts __aligned(8);
|
||||
} scan;
|
||||
};
|
||||
|
||||
/* integration time in us */
|
||||
|
|
@ -319,7 +324,6 @@ static irqreturn_t hdc100x_trigger_handler(int irq, void *p)
|
|||
struct i2c_client *client = data->client;
|
||||
int delay = data->adc_int_us[0] + data->adc_int_us[1];
|
||||
int ret;
|
||||
s16 buf[8]; /* 2x s16 + padding + 8 byte timestamp */
|
||||
|
||||
/* dual read starts at temp register */
|
||||
mutex_lock(&data->lock);
|
||||
|
|
@ -330,13 +334,13 @@ static irqreturn_t hdc100x_trigger_handler(int irq, void *p)
|
|||
}
|
||||
usleep_range(delay, delay + 1000);
|
||||
|
||||
ret = i2c_master_recv(client, (u8 *)buf, 4);
|
||||
ret = i2c_master_recv(client, (u8 *)data->scan.channels, 4);
|
||||
if (ret < 0) {
|
||||
dev_err(&client->dev, "cannot read sensor data\n");
|
||||
goto err;
|
||||
}
|
||||
|
||||
iio_push_to_buffers_with_timestamp(indio_dev, buf,
|
||||
iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
|
||||
iio_get_time_ns(indio_dev));
|
||||
err:
|
||||
mutex_unlock(&data->lock);
|
||||
|
|
|
|||
|
|
@ -15,8 +15,6 @@
|
|||
|
||||
#include <linux/iio/iio.h>
|
||||
|
||||
#define HTS221_DATA_SIZE 2
|
||||
|
||||
enum hts221_sensor_type {
|
||||
HTS221_SENSOR_H,
|
||||
HTS221_SENSOR_T,
|
||||
|
|
@ -40,6 +38,11 @@ struct hts221_hw {
|
|||
|
||||
bool enabled;
|
||||
u8 odr;
|
||||
/* Ensure natural alignment of timestamp */
|
||||
struct {
|
||||
__le16 channels[2];
|
||||
s64 ts __aligned(8);
|
||||
} scan;
|
||||
};
|
||||
|
||||
extern const struct dev_pm_ops hts221_pm_ops;
|
||||
|
|
|
|||
|
|
@ -163,7 +163,6 @@ static const struct iio_buffer_setup_ops hts221_buffer_ops = {
|
|||
|
||||
static irqreturn_t hts221_buffer_handler_thread(int irq, void *p)
|
||||
{
|
||||
u8 buffer[ALIGN(2 * HTS221_DATA_SIZE, sizeof(s64)) + sizeof(s64)];
|
||||
struct iio_poll_func *pf = p;
|
||||
struct iio_dev *iio_dev = pf->indio_dev;
|
||||
struct hts221_hw *hw = iio_priv(iio_dev);
|
||||
|
|
@ -173,18 +172,20 @@ static irqreturn_t hts221_buffer_handler_thread(int irq, void *p)
|
|||
/* humidity data */
|
||||
ch = &iio_dev->channels[HTS221_SENSOR_H];
|
||||
err = regmap_bulk_read(hw->regmap, ch->address,
|
||||
buffer, HTS221_DATA_SIZE);
|
||||
&hw->scan.channels[0],
|
||||
sizeof(hw->scan.channels[0]));
|
||||
if (err < 0)
|
||||
goto out;
|
||||
|
||||
/* temperature data */
|
||||
ch = &iio_dev->channels[HTS221_SENSOR_T];
|
||||
err = regmap_bulk_read(hw->regmap, ch->address,
|
||||
buffer + HTS221_DATA_SIZE, HTS221_DATA_SIZE);
|
||||
&hw->scan.channels[1],
|
||||
sizeof(hw->scan.channels[1]));
|
||||
if (err < 0)
|
||||
goto out;
|
||||
|
||||
iio_push_to_buffers_with_timestamp(iio_dev, buffer,
|
||||
iio_push_to_buffers_with_timestamp(iio_dev, &hw->scan,
|
||||
iio_get_time_ns(iio_dev));
|
||||
|
||||
out:
|
||||
|
|
|
|||
|
|
@ -184,6 +184,11 @@ struct ak8974 {
|
|||
bool drdy_irq;
|
||||
struct completion drdy_complete;
|
||||
bool drdy_active_low;
|
||||
/* Ensure timestamp is naturally aligned */
|
||||
struct {
|
||||
__le16 channels[3];
|
||||
s64 ts __aligned(8);
|
||||
} scan;
|
||||
};
|
||||
|
||||
static const char ak8974_reg_avdd[] = "avdd";
|
||||
|
|
@ -580,7 +585,6 @@ static void ak8974_fill_buffer(struct iio_dev *indio_dev)
|
|||
{
|
||||
struct ak8974 *ak8974 = iio_priv(indio_dev);
|
||||
int ret;
|
||||
__le16 hw_values[8]; /* Three axes + 64bit padding */
|
||||
|
||||
pm_runtime_get_sync(&ak8974->i2c->dev);
|
||||
mutex_lock(&ak8974->lock);
|
||||
|
|
@ -590,13 +594,13 @@ static void ak8974_fill_buffer(struct iio_dev *indio_dev)
|
|||
dev_err(&ak8974->i2c->dev, "error triggering measure\n");
|
||||
goto out_unlock;
|
||||
}
|
||||
ret = ak8974_getresult(ak8974, hw_values);
|
||||
ret = ak8974_getresult(ak8974, ak8974->scan.channels);
|
||||
if (ret) {
|
||||
dev_err(&ak8974->i2c->dev, "error getting measures\n");
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
iio_push_to_buffers_with_timestamp(indio_dev, hw_values,
|
||||
iio_push_to_buffers_with_timestamp(indio_dev, &ak8974->scan,
|
||||
iio_get_time_ns(indio_dev));
|
||||
|
||||
out_unlock:
|
||||
|
|
@ -764,19 +768,21 @@ static int ak8974_probe(struct i2c_client *i2c,
|
|||
ak8974->map = devm_regmap_init_i2c(i2c, &ak8974_regmap_config);
|
||||
if (IS_ERR(ak8974->map)) {
|
||||
dev_err(&i2c->dev, "failed to allocate register map\n");
|
||||
pm_runtime_put_noidle(&i2c->dev);
|
||||
pm_runtime_disable(&i2c->dev);
|
||||
return PTR_ERR(ak8974->map);
|
||||
}
|
||||
|
||||
ret = ak8974_set_power(ak8974, AK8974_PWR_ON);
|
||||
if (ret) {
|
||||
dev_err(&i2c->dev, "could not power on\n");
|
||||
goto power_off;
|
||||
goto disable_pm;
|
||||
}
|
||||
|
||||
ret = ak8974_detect(ak8974);
|
||||
if (ret) {
|
||||
dev_err(&i2c->dev, "neither AK8974 nor AMI30x found\n");
|
||||
goto power_off;
|
||||
goto disable_pm;
|
||||
}
|
||||
|
||||
ret = ak8974_selftest(ak8974);
|
||||
|
|
@ -786,14 +792,9 @@ static int ak8974_probe(struct i2c_client *i2c,
|
|||
ret = ak8974_reset(ak8974);
|
||||
if (ret) {
|
||||
dev_err(&i2c->dev, "AK8974 reset failed\n");
|
||||
goto power_off;
|
||||
goto disable_pm;
|
||||
}
|
||||
|
||||
pm_runtime_set_autosuspend_delay(&i2c->dev,
|
||||
AK8974_AUTOSUSPEND_DELAY);
|
||||
pm_runtime_use_autosuspend(&i2c->dev);
|
||||
pm_runtime_put(&i2c->dev);
|
||||
|
||||
indio_dev->dev.parent = &i2c->dev;
|
||||
indio_dev->channels = ak8974_channels;
|
||||
indio_dev->num_channels = ARRAY_SIZE(ak8974_channels);
|
||||
|
|
@ -846,6 +847,11 @@ static int ak8974_probe(struct i2c_client *i2c,
|
|||
goto cleanup_buffer;
|
||||
}
|
||||
|
||||
pm_runtime_set_autosuspend_delay(&i2c->dev,
|
||||
AK8974_AUTOSUSPEND_DELAY);
|
||||
pm_runtime_use_autosuspend(&i2c->dev);
|
||||
pm_runtime_put(&i2c->dev);
|
||||
|
||||
return 0;
|
||||
|
||||
cleanup_buffer:
|
||||
|
|
@ -854,7 +860,6 @@ static int ak8974_probe(struct i2c_client *i2c,
|
|||
pm_runtime_put_noidle(&i2c->dev);
|
||||
pm_runtime_disable(&i2c->dev);
|
||||
ak8974_set_power(ak8974, AK8974_PWR_OFF);
|
||||
power_off:
|
||||
regulator_bulk_disable(ARRAY_SIZE(ak8974->regs), ak8974->regs);
|
||||
|
||||
return ret;
|
||||
|
|
|
|||
|
|
@ -215,16 +215,21 @@ static irqreturn_t ms5611_trigger_handler(int irq, void *p)
|
|||
struct iio_poll_func *pf = p;
|
||||
struct iio_dev *indio_dev = pf->indio_dev;
|
||||
struct ms5611_state *st = iio_priv(indio_dev);
|
||||
s32 buf[4]; /* s32 (pressure) + s32 (temp) + 2 * s32 (timestamp) */
|
||||
/* Ensure buffer elements are naturally aligned */
|
||||
struct {
|
||||
s32 channels[2];
|
||||
s64 ts __aligned(8);
|
||||
} scan;
|
||||
int ret;
|
||||
|
||||
mutex_lock(&st->lock);
|
||||
ret = ms5611_read_temp_and_pressure(indio_dev, &buf[1], &buf[0]);
|
||||
ret = ms5611_read_temp_and_pressure(indio_dev, &scan.channels[1],
|
||||
&scan.channels[0]);
|
||||
mutex_unlock(&st->lock);
|
||||
if (ret < 0)
|
||||
goto err;
|
||||
|
||||
iio_push_to_buffers_with_timestamp(indio_dev, buf,
|
||||
iio_push_to_buffers_with_timestamp(indio_dev, &scan,
|
||||
iio_get_time_ns(indio_dev));
|
||||
|
||||
err:
|
||||
|
|
|
|||
|
|
@ -672,8 +672,10 @@ static int zpa2326_resume(const struct iio_dev *indio_dev)
|
|||
int err;
|
||||
|
||||
err = pm_runtime_get_sync(indio_dev->dev.parent);
|
||||
if (err < 0)
|
||||
if (err < 0) {
|
||||
pm_runtime_put(indio_dev->dev.parent);
|
||||
return err;
|
||||
}
|
||||
|
||||
if (err > 0) {
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -429,6 +429,13 @@ static const struct dmi_system_id __initconst i8042_dmi_nomux_table[] = {
|
|||
DMI_MATCH(DMI_PRODUCT_NAME, "076804U"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* Lenovo XiaoXin Air 12 */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "80UN"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
|
||||
|
|
|
|||
|
|
@ -54,6 +54,7 @@
|
|||
enum mms_type {
|
||||
TYPE_MMS114 = 114,
|
||||
TYPE_MMS152 = 152,
|
||||
TYPE_MMS345L = 345,
|
||||
};
|
||||
|
||||
struct mms114_data {
|
||||
|
|
@ -250,6 +251,15 @@ static int mms114_get_version(struct mms114_data *data)
|
|||
int error;
|
||||
|
||||
switch (data->type) {
|
||||
case TYPE_MMS345L:
|
||||
error = __mms114_read_reg(data, MMS152_FW_REV, 3, buf);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
dev_info(dev, "TSP FW Rev: bootloader 0x%x / core 0x%x / config 0x%x\n",
|
||||
buf[0], buf[1], buf[2]);
|
||||
break;
|
||||
|
||||
case TYPE_MMS152:
|
||||
error = __mms114_read_reg(data, MMS152_FW_REV, 3, buf);
|
||||
if (error)
|
||||
|
|
@ -287,8 +297,8 @@ static int mms114_setup_regs(struct mms114_data *data)
|
|||
if (error < 0)
|
||||
return error;
|
||||
|
||||
/* MMS152 has no configuration or power on registers */
|
||||
if (data->type == TYPE_MMS152)
|
||||
/* Only MMS114 has configuration and power on registers */
|
||||
if (data->type != TYPE_MMS114)
|
||||
return 0;
|
||||
|
||||
error = mms114_set_active(data, true);
|
||||
|
|
@ -598,6 +608,9 @@ static const struct of_device_id mms114_dt_match[] = {
|
|||
}, {
|
||||
.compatible = "melfas,mms152",
|
||||
.data = (void *)TYPE_MMS152,
|
||||
}, {
|
||||
.compatible = "melfas,mms345l",
|
||||
.data = (void *)TYPE_MMS345L,
|
||||
},
|
||||
{ }
|
||||
};
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@
|
|||
#include <linux/clk.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/atmel-ssc.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/module.h>
|
||||
|
|
@ -23,7 +23,7 @@
|
|||
#include "../../sound/soc/atmel/atmel_ssc_dai.h"
|
||||
|
||||
/* Serialize access to ssc_list and user count */
|
||||
static DEFINE_SPINLOCK(user_lock);
|
||||
static DEFINE_MUTEX(user_lock);
|
||||
static LIST_HEAD(ssc_list);
|
||||
|
||||
struct ssc_device *ssc_request(unsigned int ssc_num)
|
||||
|
|
@ -31,7 +31,7 @@ struct ssc_device *ssc_request(unsigned int ssc_num)
|
|||
int ssc_valid = 0;
|
||||
struct ssc_device *ssc;
|
||||
|
||||
spin_lock(&user_lock);
|
||||
mutex_lock(&user_lock);
|
||||
list_for_each_entry(ssc, &ssc_list, list) {
|
||||
if (ssc->pdev->dev.of_node) {
|
||||
if (of_alias_get_id(ssc->pdev->dev.of_node, "ssc")
|
||||
|
|
@ -47,18 +47,18 @@ struct ssc_device *ssc_request(unsigned int ssc_num)
|
|||
}
|
||||
|
||||
if (!ssc_valid) {
|
||||
spin_unlock(&user_lock);
|
||||
mutex_unlock(&user_lock);
|
||||
pr_err("ssc: ssc%d platform device is missing\n", ssc_num);
|
||||
return ERR_PTR(-ENODEV);
|
||||
}
|
||||
|
||||
if (ssc->user) {
|
||||
spin_unlock(&user_lock);
|
||||
mutex_unlock(&user_lock);
|
||||
dev_dbg(&ssc->pdev->dev, "module busy\n");
|
||||
return ERR_PTR(-EBUSY);
|
||||
}
|
||||
ssc->user++;
|
||||
spin_unlock(&user_lock);
|
||||
mutex_unlock(&user_lock);
|
||||
|
||||
clk_prepare(ssc->clk);
|
||||
|
||||
|
|
@ -70,14 +70,14 @@ void ssc_free(struct ssc_device *ssc)
|
|||
{
|
||||
bool disable_clk = true;
|
||||
|
||||
spin_lock(&user_lock);
|
||||
mutex_lock(&user_lock);
|
||||
if (ssc->user)
|
||||
ssc->user--;
|
||||
else {
|
||||
disable_clk = false;
|
||||
dev_dbg(&ssc->pdev->dev, "device already free\n");
|
||||
}
|
||||
spin_unlock(&user_lock);
|
||||
mutex_unlock(&user_lock);
|
||||
|
||||
if (disable_clk)
|
||||
clk_unprepare(ssc->clk);
|
||||
|
|
@ -240,9 +240,9 @@ static int ssc_probe(struct platform_device *pdev)
|
|||
return -ENXIO;
|
||||
}
|
||||
|
||||
spin_lock(&user_lock);
|
||||
mutex_lock(&user_lock);
|
||||
list_add_tail(&ssc->list, &ssc_list);
|
||||
spin_unlock(&user_lock);
|
||||
mutex_unlock(&user_lock);
|
||||
|
||||
platform_set_drvdata(pdev, ssc);
|
||||
|
||||
|
|
@ -261,9 +261,9 @@ static int ssc_remove(struct platform_device *pdev)
|
|||
|
||||
ssc_sound_dai_remove(ssc);
|
||||
|
||||
spin_lock(&user_lock);
|
||||
mutex_lock(&user_lock);
|
||||
list_del(&ssc->list);
|
||||
spin_unlock(&user_lock);
|
||||
mutex_unlock(&user_lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -755,9 +755,8 @@ static int mei_cl_device_remove(struct device *dev)
|
|||
|
||||
mei_cl_bus_module_put(cldev);
|
||||
module_put(THIS_MODULE);
|
||||
dev->driver = NULL;
|
||||
return ret;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static ssize_t name_show(struct device *dev, struct device_attribute *a,
|
||||
|
|
|
|||
|
|
@ -133,7 +133,7 @@ static void sdhci_set_card_detection(struct sdhci_host *host, bool enable)
|
|||
u32 present;
|
||||
|
||||
if ((host->quirks & SDHCI_QUIRK_BROKEN_CARD_DETECTION) ||
|
||||
!mmc_card_is_removable(host->mmc))
|
||||
!mmc_card_is_removable(host->mmc) || mmc_can_gpio_cd(host->mmc))
|
||||
return;
|
||||
|
||||
if (enable) {
|
||||
|
|
|
|||
|
|
@ -491,8 +491,9 @@ static int brcmnand_revision_init(struct brcmnand_controller *ctrl)
|
|||
} else {
|
||||
ctrl->cs_offsets = brcmnand_cs_offsets;
|
||||
|
||||
/* v5.0 and earlier has a different CS0 offset layout */
|
||||
if (ctrl->nand_version <= 0x0500)
|
||||
/* v3.3-5.0 have a different CS0 offset layout */
|
||||
if (ctrl->nand_version >= 0x0303 &&
|
||||
ctrl->nand_version <= 0x0500)
|
||||
ctrl->cs0_offsets = brcmnand_cs_offsets_cs0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2564,7 +2564,7 @@ static int marvell_nand_chip_init(struct device *dev, struct marvell_nfc *nfc,
|
|||
ret = mtd_device_register(mtd, NULL, 0);
|
||||
if (ret) {
|
||||
dev_err(dev, "failed to register mtd device: %d\n", ret);
|
||||
nand_release(chip);
|
||||
nand_cleanup(chip);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -2573,6 +2573,16 @@ static int marvell_nand_chip_init(struct device *dev, struct marvell_nfc *nfc,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void marvell_nand_chips_cleanup(struct marvell_nfc *nfc)
|
||||
{
|
||||
struct marvell_nand_chip *entry, *temp;
|
||||
|
||||
list_for_each_entry_safe(entry, temp, &nfc->chips, node) {
|
||||
nand_release(&entry->chip);
|
||||
list_del(&entry->node);
|
||||
}
|
||||
}
|
||||
|
||||
static int marvell_nand_chips_init(struct device *dev, struct marvell_nfc *nfc)
|
||||
{
|
||||
struct device_node *np = dev->of_node;
|
||||
|
|
@ -2607,21 +2617,16 @@ static int marvell_nand_chips_init(struct device *dev, struct marvell_nfc *nfc)
|
|||
ret = marvell_nand_chip_init(dev, nfc, nand_np);
|
||||
if (ret) {
|
||||
of_node_put(nand_np);
|
||||
return ret;
|
||||
goto cleanup_chips;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void marvell_nand_chips_cleanup(struct marvell_nfc *nfc)
|
||||
{
|
||||
struct marvell_nand_chip *entry, *temp;
|
||||
cleanup_chips:
|
||||
marvell_nand_chips_cleanup(nfc);
|
||||
|
||||
list_for_each_entry_safe(entry, temp, &nfc->chips, node) {
|
||||
nand_release(&entry->chip);
|
||||
list_del(&entry->node);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int marvell_nfc_init_dma(struct marvell_nfc *nfc)
|
||||
|
|
|
|||
|
|
@ -331,10 +331,9 @@ int onfi_fill_data_interface(struct nand_chip *chip,
|
|||
/* microseconds -> picoseconds */
|
||||
timings->tPROG_max = 1000000ULL * ONFI_DYN_TIMING_MAX;
|
||||
timings->tBERS_max = 1000000ULL * ONFI_DYN_TIMING_MAX;
|
||||
timings->tR_max = 1000000ULL * 200000000ULL;
|
||||
|
||||
/* nanoseconds -> picoseconds */
|
||||
timings->tCCS_min = 1000UL * 500000;
|
||||
timings->tR_max = 200000000;
|
||||
timings->tCCS_min = 500000;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -36,6 +36,7 @@ struct oxnas_nand_ctrl {
|
|||
void __iomem *io_base;
|
||||
struct clk *clk;
|
||||
struct nand_chip *chips[OXNAS_NAND_MAX_CHIPS];
|
||||
unsigned int nchips;
|
||||
};
|
||||
|
||||
static uint8_t oxnas_nand_read_byte(struct mtd_info *mtd)
|
||||
|
|
@ -86,9 +87,9 @@ static int oxnas_nand_probe(struct platform_device *pdev)
|
|||
struct nand_chip *chip;
|
||||
struct mtd_info *mtd;
|
||||
struct resource *res;
|
||||
int nchips = 0;
|
||||
int count = 0;
|
||||
int err = 0;
|
||||
int i;
|
||||
|
||||
/* Allocate memory for the device structure (and zero it) */
|
||||
oxnas = devm_kzalloc(&pdev->dev, sizeof(*oxnas),
|
||||
|
|
@ -150,12 +151,12 @@ static int oxnas_nand_probe(struct platform_device *pdev)
|
|||
if (err)
|
||||
goto err_cleanup_nand;
|
||||
|
||||
oxnas->chips[nchips] = chip;
|
||||
++nchips;
|
||||
oxnas->chips[oxnas->nchips] = chip;
|
||||
++oxnas->nchips;
|
||||
}
|
||||
|
||||
/* Exit if no chips found */
|
||||
if (!nchips) {
|
||||
if (!oxnas->nchips) {
|
||||
err = -ENODEV;
|
||||
goto err_clk_unprepare;
|
||||
}
|
||||
|
|
@ -168,6 +169,13 @@ static int oxnas_nand_probe(struct platform_device *pdev)
|
|||
nand_cleanup(chip);
|
||||
err_release_child:
|
||||
of_node_put(nand_np);
|
||||
|
||||
for (i = 0; i < oxnas->nchips; i++) {
|
||||
chip = oxnas->chips[i];
|
||||
WARN_ON(mtd_device_unregister(nand_to_mtd(chip)));
|
||||
nand_cleanup(chip);
|
||||
}
|
||||
|
||||
err_clk_unprepare:
|
||||
clk_disable_unprepare(oxnas->clk);
|
||||
return err;
|
||||
|
|
@ -176,9 +184,13 @@ static int oxnas_nand_probe(struct platform_device *pdev)
|
|||
static int oxnas_nand_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct oxnas_nand_ctrl *oxnas = platform_get_drvdata(pdev);
|
||||
struct nand_chip *chip;
|
||||
int i;
|
||||
|
||||
if (oxnas->chips[0])
|
||||
nand_release(oxnas->chips[0]);
|
||||
for (i = 0; i < oxnas->nchips; i++) {
|
||||
chip = oxnas->chips[i];
|
||||
nand_release(chip);
|
||||
}
|
||||
|
||||
clk_disable_unprepare(oxnas->clk);
|
||||
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user