Merge 4.19.130 into android-4.19-stable

Changes in 4.19.130
	power: supply: bq24257_charger: Replace depends on REGMAP_I2C with select
	clk: sunxi: Fix incorrect usage of round_down()
	ASoC: tegra: tegra_wm8903: Support nvidia, headset property
	i2c: piix4: Detect secondary SMBus controller on AMD AM4 chipsets
	iio: pressure: bmp280: Tolerate IRQ before registering
	remoteproc: Fix IDR initialisation in rproc_alloc()
	clk: qcom: msm8916: Fix the address location of pll->config_reg
	backlight: lp855x: Ensure regulators are disabled on probe failure
	ASoC: davinci-mcasp: Fix dma_chan refcnt leak when getting dma type
	ARM: integrator: Add some Kconfig selections
	scsi: qedi: Check for buffer overflow in qedi_set_path()
	ALSA: hda/realtek - Introduce polarity for micmute LED GPIO
	ALSA: isa/wavefront: prevent out of bounds write in ioctl
	PCI: Allow pci_resize_resource() for devices on root bus
	scsi: qla2xxx: Fix issue with adapter's stopping state
	iio: bmp280: fix compensation of humidity
	f2fs: report delalloc reserve as non-free in statfs for project quota
	i2c: pxa: clear all master action bits in i2c_pxa_stop_message()
	clk: samsung: Mark top ISP and CAM clocks on Exynos542x as critical
	usblp: poison URBs upon disconnect
	serial: 8250: Fix max baud limit in generic 8250 port
	dm mpath: switch paths in dm_blk_ioctl() code path
	PCI: aardvark: Don't blindly enable ASPM L0s and don't write to read-only register
	ps3disk: use the default segment boundary
	vfio/pci: fix memory leaks in alloc_perm_bits()
	RDMA/mlx5: Add init2init as a modify command
	m68k/PCI: Fix a memory leak in an error handling path
	gpio: dwapb: Call acpi_gpiochip_free_interrupts() on GPIO chip de-registration
	mfd: wm8994: Fix driver operation if loaded as modules
	scsi: lpfc: Fix lpfc_nodelist leak when processing unsolicited event
	clk: clk-flexgen: fix clock-critical handling
	powerpc/perf/hv-24x7: Fix inconsistent output values incase multiple hv-24x7 events run
	nfsd: Fix svc_xprt refcnt leak when setup callback client failed
	PCI: vmd: Filter resource type bits from shadow register
	powerpc/crashkernel: Take "mem=" option into account
	pwm: img: Call pm_runtime_put() in pm_runtime_get_sync() failed case
	yam: fix possible memory leak in yam_init_driver
	NTB: ntb_pingpong: Choose doorbells based on port number
	NTB: Fix the default port and peer numbers for legacy drivers
	mksysmap: Fix the mismatch of '.L' symbols in System.map
	apparmor: fix introspection of of task mode for unconfined tasks
	apparmor: check/put label on apparmor_sk_clone_security()
	ASoC: meson: add missing free_irq() in error path
	scsi: sr: Fix sr_probe() missing deallocate of device minor
	scsi: ibmvscsi: Don't send host info in adapter info MAD after LPM
	apparmor: fix nnp subset test for unconfined
	x86/purgatory: Disable various profiling and sanitizing options
	staging: greybus: fix a missing-check bug in gb_lights_light_config()
	arm64: dts: mt8173: fix unit name warnings
	scsi: qedi: Do not flush offload work if ARP not resolved
	ARM: dts: sun8i-h2-plus-bananapi-m2-zero: Fix led polarity
	gpio: dwapb: Append MODULE_ALIAS for platform driver
	scsi: qedf: Fix crash when MFW calls for protocol stats while function is still probing
	pinctrl: rza1: Fix wrong array assignment of rza1l_swio_entries
	firmware: qcom_scm: fix bogous abuse of dma-direct internals
	staging: gasket: Fix mapping refcnt leak when put attribute fails
	staging: gasket: Fix mapping refcnt leak when register/store fails
	ALSA: usb-audio: Improve frames size computation
	ALSA: usb-audio: Fix racy list management in output queue
	s390/qdio: put thinint indicator after early error
	tty: hvc: Fix data abort due to race in hvc_open
	slimbus: ngd: get drvdata from correct device
	thermal/drivers/ti-soc-thermal: Avoid dereferencing ERR_PTR
	usb: dwc3: gadget: Properly handle failed kick_transfer
	staging: sm750fb: add missing case while setting FB_VISUAL
	PCI: v3-semi: Fix a memory leak in v3_pci_probe() error handling paths
	i2c: pxa: fix i2c_pxa_scream_blue_murder() debug output
	serial: amba-pl011: Make sure we initialize the port.lock spinlock
	drivers: base: Fix NULL pointer exception in __platform_driver_probe() if a driver developer is foolish
	PCI: rcar: Fix incorrect programming of OB windows
	PCI/ASPM: Allow ASPM on links to PCIe-to-PCI/PCI-X Bridges
	scsi: qla2xxx: Fix warning after FC target reset
	power: supply: lp8788: Fix an error handling path in 'lp8788_charger_probe()'
	power: supply: smb347-charger: IRQSTAT_D is volatile
	scsi: mpt3sas: Fix double free warnings
	pinctrl: rockchip: fix memleak in rockchip_dt_node_to_map
	dlm: remove BUG() before panic()
	clk: ti: composite: fix memory leak
	PCI: Fix pci_register_host_bridge() device_register() error handling
	powerpc/64: Don't initialise init_task->thread.regs
	tty: n_gsm: Fix SOF skipping
	tty: n_gsm: Fix waking up upper tty layer when room available
	HID: Add quirks for Trust Panora Graphic Tablet
	ipmi: use vzalloc instead of kmalloc for user creation
	powerpc/pseries/ras: Fix FWNMI_VALID off by one
	powerpc/ps3: Fix kexec shutdown hang
	vfio-pci: Mask cap zero
	usb/ohci-platform: Fix a warning when hibernating
	drm/msm/mdp5: Fix mdp5_init error path for failed mdp5_kms allocation
	ASoC: Intel: bytcr_rt5640: Add quirk for Toshiba Encore WT8-A tablet
	USB: host: ehci-mxc: Add error handling in ehci_mxc_drv_probe()
	tty: n_gsm: Fix bogus i++ in gsm_data_kick
	fpga: dfl: afu: Corrected error handling levels
	clk: samsung: exynos5433: Add IGNORE_UNUSED flag to sclk_i2s1
	scsi: target: tcmu: Userspace must not complete queued commands
	arm64: tegra: Fix ethernet phy-mode for Jetson Xavier
	powerpc/64s/pgtable: fix an undefined behaviour
	dm zoned: return NULL if dmz_get_zone_for_reclaim() fails to find a zone
	PCI/PTM: Inherit Switch Downstream Port PTM settings from Upstream Port
	PCI: dwc: Fix inner MSI IRQ domain registration
	IB/cma: Fix ports memory leak in cma_configfs
	watchdog: da9062: No need to ping manually before setting timeout
	usb: dwc2: gadget: move gadget resume after the core is in L0 state
	USB: gadget: udc: s3c2410_udc: Remove pointless NULL check in s3c2410_udc_nuke
	usb: gadget: lpc32xx_udc: don't dereference ep pointer before null check
	usb: gadget: fix potential double-free in m66592_probe.
	usb: gadget: Fix issue with config_ep_by_speed function
	RDMA/iw_cxgb4: cleanup device debugfs entries on ULD remove
	x86/apic: Make TSC deadline timer detection message visible
	ASoC: fix incomplete error-handling in img_i2s_in_probe.
	scsi: target: tcmu: Fix a use after free in tcmu_check_expired_queue_cmd()
	clk: bcm2835: Fix return type of bcm2835_register_gate
	scsi: ufs-qcom: Fix scheduling while atomic issue
	KVM: PPC: Book3S HV: Ignore kmemleak false positives
	clk: sprd: return correct type of value for _sprd_pll_recalc_rate
	net: sunrpc: Fix off-by-one issues in 'rpc_ntop6'
	NFSv4.1 fix rpc_call_done assignment for BIND_CONN_TO_SESSION
	of: Fix a refcounting bug in __of_attach_node_sysfs()
	powerpc/4xx: Don't unmap NULL mbase
	extcon: adc-jack: Fix an error handling path in 'adc_jack_probe()'
	ASoC: fsl_asrc_dma: Fix dma_chan leak when config DMA channel failed
	vfio/mdev: Fix reference count leak in add_mdev_supported_type
	rxrpc: Adjust /proc/net/rxrpc/calls to display call->debug_id not user_ID
	openrisc: Fix issue with argument clobbering for clone/fork
	gfs2: Allow lock_nolock mount to specify jid=X
	scsi: iscsi: Fix reference count leak in iscsi_boot_create_kobj
	scsi: ufs: Don't update urgent bkops level when toggling auto bkops
	pinctrl: imxl: Fix an error handling path in 'imx1_pinctrl_core_probe()'
	pinctrl: freescale: imx: Fix an error handling path in 'imx_pinctrl_probe()'
	crypto: omap-sham - add proper load balancing support for multicore
	geneve: change from tx_error to tx_dropped on missing metadata
	lib/zlib: remove outdated and incorrect pre-increment optimization
	include/linux/bitops.h: avoid clang shift-count-overflow warnings
	elfnote: mark all .note sections SHF_ALLOC
	selftests/vm/pkeys: fix alloc_random_pkey() to make it really random
	blktrace: use errno instead of bi_status
	blktrace: fix endianness in get_pdu_int()
	blktrace: fix endianness for blk_log_remap()
	gfs2: fix use-after-free on transaction ail lists
	ntb_perf: pass correct struct device to dma_alloc_coherent
	ntb_tool: pass correct struct device to dma_alloc_coherent
	NTB: ntb_tool: reading the link file should not end in a NULL byte
	NTB: Revert the change to use the NTB device dev for DMA allocations
	NTB: perf: Don't require one more memory window than number of peers
	NTB: perf: Fix support for hardware that doesn't have port numbers
	NTB: perf: Fix race condition when run with ntb_test
	NTB: ntb_test: Fix bug when counting remote files
	drivers/perf: hisi: Fix wrong value for all counters enable
	selftests/net: in timestamping, strncpy needs to preserve null byte
	afs: Fix memory leak in afs_put_sysnames()
	ASoC: core: only convert non DPCM link to DPCM link
	ASoC: Intel: bytcr_rt5640: Add quirk for Toshiba Encore WT10-A tablet
	ASoC: rt5645: Add platform-data for Asus T101HA
	drm/sun4i: hdmi ddc clk: Fix size of m divider
	scsi: acornscsi: Fix an error handling path in acornscsi_probe()
	x86/idt: Keep spurious entries unset in system_vectors
	net/filter: Permit reading NET in load_bytes_relative when MAC not set
	xdp: Fix xsk_generic_xmit errno
	usb/xhci-plat: Set PM runtime as active on resume
	usb: host: ehci-platform: add a quirk to avoid stuck
	usb/ehci-platform: Set PM runtime as active on resume
	perf report: Fix NULL pointer dereference in hists__fprintf_nr_sample_events()
	ext4: stop overwrite the errcode in ext4_setup_super
	bcache: fix potential deadlock problem in btree_gc_coalesce
	afs: Fix non-setting of mtime when writing into mmap
	afs: afs_write_end() should change i_size under the right lock
	block: Fix use-after-free in blkdev_get()
	arm64: hw_breakpoint: Don't invoke overflow handler on uaccess watchpoints
	libata: Use per port sync for detach
	drm: encoder_slave: fix refcouting error for modules
	drm/dp_mst: Reformat drm_dp_check_act_status() a bit
	drm/qxl: Use correct notify port address when creating cursor ring
	drm/amdgpu: Replace invalid device ID with a valid device ID
	selinux: fix double free
	ext4: fix partial cluster initialization when splitting extent
	ext4: avoid race conditions when remounting with options that change dax
	drm/dp_mst: Increase ACT retry timeout to 3s
	x86/boot/compressed: Relax sed symbol type regex for LLVM ld.lld
	block: nr_sects_write(): Disable preemption on seqcount write
	mtd: rawnand: Pass a nand_chip object to nand_scan()
	mtd: rawnand: Pass a nand_chip object to nand_release()
	mtd: rawnand: diskonchip: Fix the probe error path
	mtd: rawnand: sharpsl: Fix the probe error path
	mtd: rawnand: xway: Fix the probe error path
	mtd: rawnand: orion: Fix the probe error path
	mtd: rawnand: oxnas: Add of_node_put()
	mtd: rawnand: oxnas: Fix the probe error path
	mtd: rawnand: socrates: Fix the probe error path
	mtd: rawnand: plat_nand: Fix the probe error path
	mtd: rawnand: mtk: Fix the probe error path
	mtd: rawnand: tmio: Fix the probe error path
	s390: fix syscall_get_error for compat processes
	drm/i915: Whitelist context-local timestamp in the gen9 cmdparser
	drm/i915/icl+: Fix hotplug interrupt disabling after storm detection
	crypto: algif_skcipher - Cap recv SG list at ctx->used
	crypto: algboss - don't wait during notifier callback
	kprobes: Fix to protect kick_kprobe_optimizer() by kprobe_mutex
	e1000e: Do not wake up the system via WOL if device wakeup is disabled
	net: octeon: mgmt: Repair filling of RX ring
	kretprobe: Prevent triggering kretprobe from within kprobe_flush_task
	sched/rt, net: Use CONFIG_PREEMPTION.patch
	net: core: device_rename: Use rwsem instead of a seqcount
	Revert "dpaa_eth: fix usage as DSA master, try 3"
	md: add feature flag MD_FEATURE_RAID0_LAYOUT
	kvm: x86: Move kvm_set_mmio_spte_mask() from x86.c to mmu.c
	kvm: x86: Fix reserved bits related calculation errors caused by MKTME
	KVM: x86/mmu: Set mmio_value to '0' if reserved #PF can't be generated
	Linux 4.19.130

Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Change-Id: I8fff23470852b747c3d75461b45f9d77460062d3
This commit is contained in:
Greg Kroah-Hartman
2020-06-27 09:50:13 +02:00
242 changed files with 1436 additions and 885 deletions

View File

@@ -246,7 +246,7 @@ necessary information about the device.
this->eccmode = NAND_ECC_SOFT; this->eccmode = NAND_ECC_SOFT;
/* Scan to find existence of the device */ /* Scan to find existence of the device */
if (nand_scan (board_mtd, 1)) { if (nand_scan (this, 1)) {
err = -ENXIO; err = -ENXIO;
goto out_ior; goto out_ior;
} }
@@ -277,7 +277,7 @@ unregisters the partitions in the MTD layer.
static void __exit board_cleanup (void) static void __exit board_cleanup (void)
{ {
/* Release resources, unregister device */ /* Release resources, unregister device */
nand_release (board_mtd); nand_release (mtd_to_nand(board_mtd));
/* unmap physical address */ /* unmap physical address */
iounmap(baseaddr); iounmap(baseaddr);

View File

@@ -1,7 +1,7 @@
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
VERSION = 4 VERSION = 4
PATCHLEVEL = 19 PATCHLEVEL = 19
SUBLEVEL = 129 SUBLEVEL = 130
EXTRAVERSION = EXTRAVERSION =
NAME = "People's Front" NAME = "People's Front"

View File

@@ -32,7 +32,7 @@
pwr_led { pwr_led {
label = "bananapi-m2-zero:red:pwr"; label = "bananapi-m2-zero:red:pwr";
gpios = <&r_pio 0 10 GPIO_ACTIVE_HIGH>; /* PL10 */ gpios = <&r_pio 0 10 GPIO_ACTIVE_LOW>; /* PL10 */
default-state = "on"; default-state = "on";
}; };
}; };

View File

@@ -3,6 +3,8 @@ menuconfig ARCH_INTEGRATOR
depends on ARCH_MULTI_V4T || ARCH_MULTI_V5 || ARCH_MULTI_V6 depends on ARCH_MULTI_V4T || ARCH_MULTI_V5 || ARCH_MULTI_V6
select ARM_AMBA select ARM_AMBA
select COMMON_CLK_VERSATILE select COMMON_CLK_VERSATILE
select CMA
select DMA_CMA
select HAVE_TCM select HAVE_TCM
select ICST select ICST
select MFD_SYSCON select MFD_SYSCON
@@ -34,14 +36,13 @@ config INTEGRATOR_IMPD1
select ARM_VIC select ARM_VIC
select GPIO_PL061 select GPIO_PL061
select GPIOLIB select GPIOLIB
select REGULATOR
select REGULATOR_FIXED_VOLTAGE
help help
The IM-PD1 is an add-on logic module for the Integrator which The IM-PD1 is an add-on logic module for the Integrator which
allows ARM(R) Ltd PrimeCells to be developed and evaluated. allows ARM(R) Ltd PrimeCells to be developed and evaluated.
The IM-PD1 can be found on the Integrator/PP2 platform. The IM-PD1 can be found on the Integrator/PP2 platform.
To compile this driver as a module, choose M here: the
module will be called impd1.
config INTEGRATOR_CM7TDMI config INTEGRATOR_CM7TDMI
bool "Integrator/CM7TDMI core module" bool "Integrator/CM7TDMI core module"
depends on ARCH_INTEGRATOR_AP depends on ARCH_INTEGRATOR_AP

View File

@@ -223,21 +223,21 @@
cpu_on = <0x84000003>; cpu_on = <0x84000003>;
}; };
clk26m: oscillator@0 { clk26m: oscillator0 {
compatible = "fixed-clock"; compatible = "fixed-clock";
#clock-cells = <0>; #clock-cells = <0>;
clock-frequency = <26000000>; clock-frequency = <26000000>;
clock-output-names = "clk26m"; clock-output-names = "clk26m";
}; };
clk32k: oscillator@1 { clk32k: oscillator1 {
compatible = "fixed-clock"; compatible = "fixed-clock";
#clock-cells = <0>; #clock-cells = <0>;
clock-frequency = <32000>; clock-frequency = <32000>;
clock-output-names = "clk32k"; clock-output-names = "clk32k";
}; };
cpum_ck: oscillator@2 { cpum_ck: oscillator2 {
compatible = "fixed-clock"; compatible = "fixed-clock";
#clock-cells = <0>; #clock-cells = <0>;
clock-frequency = <0>; clock-frequency = <0>;
@@ -253,19 +253,19 @@
sustainable-power = <1500>; /* milliwatts */ sustainable-power = <1500>; /* milliwatts */
trips { trips {
threshold: trip-point@0 { threshold: trip-point0 {
temperature = <68000>; temperature = <68000>;
hysteresis = <2000>; hysteresis = <2000>;
type = "passive"; type = "passive";
}; };
target: trip-point@1 { target: trip-point1 {
temperature = <85000>; temperature = <85000>;
hysteresis = <2000>; hysteresis = <2000>;
type = "passive"; type = "passive";
}; };
cpu_crit: cpu_crit@0 { cpu_crit: cpu_crit0 {
temperature = <115000>; temperature = <115000>;
hysteresis = <2000>; hysteresis = <2000>;
type = "critical"; type = "critical";
@@ -273,12 +273,12 @@
}; };
cooling-maps { cooling-maps {
map@0 { map0 {
trip = <&target>; trip = <&target>;
cooling-device = <&cpu0 0 0>; cooling-device = <&cpu0 0 0>;
contribution = <3072>; contribution = <3072>;
}; };
map@1 { map1 {
trip = <&target>; trip = <&target>;
cooling-device = <&cpu2 0 0>; cooling-device = <&cpu2 0 0>;
contribution = <1024>; contribution = <1024>;
@@ -291,7 +291,7 @@
#address-cells = <2>; #address-cells = <2>;
#size-cells = <2>; #size-cells = <2>;
ranges; ranges;
vpu_dma_reserved: vpu_dma_mem_region { vpu_dma_reserved: vpu_dma_mem_region@b7000000 {
compatible = "shared-dma-pool"; compatible = "shared-dma-pool";
reg = <0 0xb7000000 0 0x500000>; reg = <0 0xb7000000 0 0x500000>;
alignment = <0x1000>; alignment = <0x1000>;
@@ -343,7 +343,7 @@
reg = <0 0x10005000 0 0x1000>; reg = <0 0x10005000 0 0x1000>;
}; };
pio: pinctrl@10005000 { pio: pinctrl@1000b000 {
compatible = "mediatek,mt8173-pinctrl"; compatible = "mediatek,mt8173-pinctrl";
reg = <0 0x1000b000 0 0x1000>; reg = <0 0x1000b000 0 0x1000>;
mediatek,pctl-regmap = <&syscfg_pctl_a>; mediatek,pctl-regmap = <&syscfg_pctl_a>;
@@ -541,7 +541,7 @@
status = "disabled"; status = "disabled";
}; };
gic: interrupt-controller@10220000 { gic: interrupt-controller@10221000 {
compatible = "arm,gic-400"; compatible = "arm,gic-400";
#interrupt-cells = <3>; #interrupt-cells = <3>;
interrupt-parent = <&gic>; interrupt-parent = <&gic>;

View File

@@ -32,7 +32,7 @@
phy-reset-gpios = <&gpio TEGRA194_MAIN_GPIO(G, 5) GPIO_ACTIVE_LOW>; phy-reset-gpios = <&gpio TEGRA194_MAIN_GPIO(G, 5) GPIO_ACTIVE_LOW>;
phy-handle = <&phy>; phy-handle = <&phy>;
phy-mode = "rgmii"; phy-mode = "rgmii-id";
mdio { mdio {
#address-cells = <1>; #address-cells = <1>;

View File

@@ -737,6 +737,27 @@ static u64 get_distance_from_watchpoint(unsigned long addr, u64 val,
return 0; return 0;
} }
static int watchpoint_report(struct perf_event *wp, unsigned long addr,
struct pt_regs *regs)
{
int step = is_default_overflow_handler(wp);
struct arch_hw_breakpoint *info = counter_arch_bp(wp);
info->trigger = addr;
/*
* If we triggered a user watchpoint from a uaccess routine, then
* handle the stepping ourselves since userspace really can't help
* us with this.
*/
if (!user_mode(regs) && info->ctrl.privilege == AARCH64_BREAKPOINT_EL0)
step = 1;
else
perf_bp_event(wp, regs);
return step;
}
static int watchpoint_handler(unsigned long addr, unsigned int esr, static int watchpoint_handler(unsigned long addr, unsigned int esr,
struct pt_regs *regs) struct pt_regs *regs)
{ {
@@ -746,7 +767,6 @@ static int watchpoint_handler(unsigned long addr, unsigned int esr,
u64 val; u64 val;
struct perf_event *wp, **slots; struct perf_event *wp, **slots;
struct debug_info *debug_info; struct debug_info *debug_info;
struct arch_hw_breakpoint *info;
struct arch_hw_breakpoint_ctrl ctrl; struct arch_hw_breakpoint_ctrl ctrl;
slots = this_cpu_ptr(wp_on_reg); slots = this_cpu_ptr(wp_on_reg);
@@ -784,25 +804,13 @@ static int watchpoint_handler(unsigned long addr, unsigned int esr,
if (dist != 0) if (dist != 0)
continue; continue;
info = counter_arch_bp(wp); step = watchpoint_report(wp, addr, regs);
info->trigger = addr;
perf_bp_event(wp, regs);
/* Do we need to handle the stepping? */
if (is_default_overflow_handler(wp))
step = 1;
} }
if (min_dist > 0 && min_dist != -1) {
/* No exact match found. */
wp = slots[closest_match];
info = counter_arch_bp(wp);
info->trigger = addr;
perf_bp_event(wp, regs);
/* Do we need to handle the stepping? */ /* No exact match found? */
if (is_default_overflow_handler(wp)) if (min_dist > 0 && min_dist != -1)
step = 1; step = watchpoint_report(slots[closest_match], addr, regs);
}
rcu_read_unlock(); rcu_read_unlock();
if (!step) if (!step)

View File

@@ -216,8 +216,10 @@ static int __init mcf_pci_init(void)
/* Keep a virtual mapping to IO/config space active */ /* Keep a virtual mapping to IO/config space active */
iospace = (unsigned long) ioremap(PCI_IO_PA, PCI_IO_SIZE); iospace = (unsigned long) ioremap(PCI_IO_PA, PCI_IO_SIZE);
if (iospace == 0) if (iospace == 0) {
pci_free_host_bridge(bridge);
return -ENODEV; return -ENODEV;
}
pr_info("Coldfire: PCI IO/config window mapped to 0x%x\n", pr_info("Coldfire: PCI IO/config window mapped to 0x%x\n",
(u32) iospace); (u32) iospace);

View File

@@ -1170,13 +1170,13 @@ ENTRY(__sys_clone)
l.movhi r29,hi(sys_clone) l.movhi r29,hi(sys_clone)
l.ori r29,r29,lo(sys_clone) l.ori r29,r29,lo(sys_clone)
l.j _fork_save_extra_regs_and_call l.j _fork_save_extra_regs_and_call
l.addi r7,r1,0 l.nop
ENTRY(__sys_fork) ENTRY(__sys_fork)
l.movhi r29,hi(sys_fork) l.movhi r29,hi(sys_fork)
l.ori r29,r29,lo(sys_fork) l.ori r29,r29,lo(sys_fork)
l.j _fork_save_extra_regs_and_call l.j _fork_save_extra_regs_and_call
l.addi r3,r1,0 l.nop
ENTRY(sys_rt_sigreturn) ENTRY(sys_rt_sigreturn)
l.jal _sys_rt_sigreturn l.jal _sys_rt_sigreturn

View File

@@ -985,10 +985,25 @@ extern struct page *pgd_page(pgd_t pgd);
#define pud_page_vaddr(pud) __va(pud_val(pud) & ~PUD_MASKED_BITS) #define pud_page_vaddr(pud) __va(pud_val(pud) & ~PUD_MASKED_BITS)
#define pgd_page_vaddr(pgd) __va(pgd_val(pgd) & ~PGD_MASKED_BITS) #define pgd_page_vaddr(pgd) __va(pgd_val(pgd) & ~PGD_MASKED_BITS)
#define pgd_index(address) (((address) >> (PGDIR_SHIFT)) & (PTRS_PER_PGD - 1)) static inline unsigned long pgd_index(unsigned long address)
#define pud_index(address) (((address) >> (PUD_SHIFT)) & (PTRS_PER_PUD - 1)) {
#define pmd_index(address) (((address) >> (PMD_SHIFT)) & (PTRS_PER_PMD - 1)) return (address >> PGDIR_SHIFT) & (PTRS_PER_PGD - 1);
#define pte_index(address) (((address) >> (PAGE_SHIFT)) & (PTRS_PER_PTE - 1)) }
static inline unsigned long pud_index(unsigned long address)
{
return (address >> PUD_SHIFT) & (PTRS_PER_PUD - 1);
}
static inline unsigned long pmd_index(unsigned long address)
{
return (address >> PMD_SHIFT) & (PTRS_PER_PMD - 1);
}
static inline unsigned long pte_index(unsigned long address)
{
return (address >> PAGE_SHIFT) & (PTRS_PER_PTE - 1);
}
/* /*
* Find an entry in a page-table-directory. We combine the address region * Find an entry in a page-table-directory. We combine the address region

View File

@@ -386,7 +386,6 @@ struct thread_struct {
#else #else
#define INIT_THREAD { \ #define INIT_THREAD { \
.ksp = INIT_SP, \ .ksp = INIT_SP, \
.regs = (struct pt_regs *)INIT_SP - 1, /* XXX bogus, I think */ \
.addr_limit = KERNEL_DS, \ .addr_limit = KERNEL_DS, \
.fpexc_mode = 0, \ .fpexc_mode = 0, \
.ppr = INIT_PPR, \ .ppr = INIT_PPR, \

View File

@@ -950,15 +950,8 @@ start_here_multiplatform:
std r0,0(r4) std r0,0(r4)
#endif #endif
/* The following gets the stack set up with the regs */
/* pointing to the real addr of the kernel stack. This is */
/* all done to support the C function call below which sets */
/* up the htab. This is done because we have relocated the */
/* kernel but are still running in real mode. */
LOAD_REG_ADDR(r3,init_thread_union)
/* set up a stack pointer */ /* set up a stack pointer */
LOAD_REG_ADDR(r3,init_thread_union)
LOAD_REG_IMMEDIATE(r1,THREAD_SIZE) LOAD_REG_IMMEDIATE(r1,THREAD_SIZE)
add r1,r3,r1 add r1,r3,r1
li r0,0 li r0,0

View File

@@ -116,11 +116,12 @@ void machine_kexec(struct kimage *image)
void __init reserve_crashkernel(void) void __init reserve_crashkernel(void)
{ {
unsigned long long crash_size, crash_base; unsigned long long crash_size, crash_base, total_mem_sz;
int ret; int ret;
total_mem_sz = memory_limit ? memory_limit : memblock_phys_mem_size();
/* use common parsing */ /* use common parsing */
ret = parse_crashkernel(boot_command_line, memblock_phys_mem_size(), ret = parse_crashkernel(boot_command_line, total_mem_sz,
&crash_size, &crash_base); &crash_size, &crash_base);
if (ret == 0 && crash_size > 0) { if (ret == 0 && crash_size > 0) {
crashk_res.start = crash_base; crashk_res.start = crash_base;
@@ -179,6 +180,7 @@ void __init reserve_crashkernel(void)
/* Crash kernel trumps memory limit */ /* Crash kernel trumps memory limit */
if (memory_limit && memory_limit <= crashk_res.end) { if (memory_limit && memory_limit <= crashk_res.end) {
memory_limit = crashk_res.end + 1; memory_limit = crashk_res.end + 1;
total_mem_sz = memory_limit;
printk("Adjusted memory limit for crashkernel, now 0x%llx\n", printk("Adjusted memory limit for crashkernel, now 0x%llx\n",
memory_limit); memory_limit);
} }
@@ -187,7 +189,7 @@ void __init reserve_crashkernel(void)
"for crashkernel (System RAM: %ldMB)\n", "for crashkernel (System RAM: %ldMB)\n",
(unsigned long)(crash_size >> 20), (unsigned long)(crash_size >> 20),
(unsigned long)(crashk_res.start >> 20), (unsigned long)(crashk_res.start >> 20),
(unsigned long)(memblock_phys_mem_size() >> 20)); (unsigned long)(total_mem_sz >> 20));
if (!memblock_is_region_memory(crashk_res.start, crash_size) || if (!memblock_is_region_memory(crashk_res.start, crash_size) ||
memblock_reserve(crashk_res.start, crash_size)) { memblock_reserve(crashk_res.start, crash_size)) {

View File

@@ -171,7 +171,13 @@ static struct kmem_cache *kvm_pmd_cache;
static pte_t *kvmppc_pte_alloc(void) static pte_t *kvmppc_pte_alloc(void)
{ {
return kmem_cache_alloc(kvm_pte_cache, GFP_KERNEL); pte_t *pte;
pte = kmem_cache_alloc(kvm_pte_cache, GFP_KERNEL);
/* pmd_populate() will only reference _pa(pte). */
kmemleak_ignore(pte);
return pte;
} }
static void kvmppc_pte_free(pte_t *ptep) static void kvmppc_pte_free(pte_t *ptep)
@@ -187,7 +193,13 @@ static inline int pmd_is_leaf(pmd_t pmd)
static pmd_t *kvmppc_pmd_alloc(void) static pmd_t *kvmppc_pmd_alloc(void)
{ {
return kmem_cache_alloc(kvm_pmd_cache, GFP_KERNEL); pmd_t *pmd;
pmd = kmem_cache_alloc(kvm_pmd_cache, GFP_KERNEL);
/* pud_populate() will only reference _pa(pmd). */
kmemleak_ignore(pmd);
return pmd;
} }
static void kvmppc_pmd_free(pmd_t *pmdp) static void kvmppc_pmd_free(pmd_t *pmdp)

View File

@@ -1413,16 +1413,6 @@ static void h_24x7_event_read(struct perf_event *event)
h24x7hw = &get_cpu_var(hv_24x7_hw); h24x7hw = &get_cpu_var(hv_24x7_hw);
h24x7hw->events[i] = event; h24x7hw->events[i] = event;
put_cpu_var(h24x7hw); put_cpu_var(h24x7hw);
/*
* Clear the event count so we can compute the _change_
* in the 24x7 raw counter value at the end of the txn.
*
* Note that we could alternatively read the 24x7 value
* now and save its value in event->hw.prev_count. But
* that would require issuing a hcall, which would then
* defeat the purpose of using the txn interface.
*/
local64_set(&event->count, 0);
} }
put_cpu_var(hv_24x7_reqb); put_cpu_var(hv_24x7_reqb);

View File

@@ -1242,7 +1242,7 @@ static void __init ppc460sx_pciex_check_link(struct ppc4xx_pciex_port *port)
if (mbase == NULL) { if (mbase == NULL) {
printk(KERN_ERR "%pOF: Can't map internal config space !", printk(KERN_ERR "%pOF: Can't map internal config space !",
port->node); port->node);
goto done; return;
} }
while (attempt && (0 == (in_le32(mbase + PECFG_460SX_DLLSTA) while (attempt && (0 == (in_le32(mbase + PECFG_460SX_DLLSTA)
@@ -1252,9 +1252,7 @@ static void __init ppc460sx_pciex_check_link(struct ppc4xx_pciex_port *port)
} }
if (attempt) if (attempt)
port->link = 1; port->link = 1;
done:
iounmap(mbase); iounmap(mbase);
} }
static struct ppc4xx_pciex_hwops ppc460sx_pcie_hwops __initdata = { static struct ppc4xx_pciex_hwops ppc460sx_pcie_hwops __initdata = {

View File

@@ -212,13 +212,14 @@ void ps3_mm_vas_destroy(void)
{ {
int result; int result;
DBG("%s:%d: map.vas_id = %llu\n", __func__, __LINE__, map.vas_id);
if (map.vas_id) { if (map.vas_id) {
result = lv1_select_virtual_address_space(0); result = lv1_select_virtual_address_space(0);
BUG_ON(result); result += lv1_destruct_virtual_address_space(map.vas_id);
result = lv1_destruct_virtual_address_space(map.vas_id);
BUG_ON(result); if (result) {
lv1_panic(0);
}
map.vas_id = 0; map.vas_id = 0;
} }
} }
@@ -316,19 +317,20 @@ static void ps3_mm_region_destroy(struct mem_region *r)
int result; int result;
if (!r->destroy) { if (!r->destroy) {
pr_info("%s:%d: Not destroying high region: %llxh %llxh\n",
__func__, __LINE__, r->base, r->size);
return; return;
} }
DBG("%s:%d: r->base = %llxh\n", __func__, __LINE__, r->base);
if (r->base) { if (r->base) {
result = lv1_release_memory(r->base); result = lv1_release_memory(r->base);
BUG_ON(result);
if (result) {
lv1_panic(0);
}
r->size = r->base = r->offset = 0; r->size = r->base = r->offset = 0;
map.total = map.rm.size; map.total = map.rm.size;
} }
ps3_mm_set_repository_highmem(NULL); ps3_mm_set_repository_highmem(NULL);
} }

View File

@@ -328,10 +328,11 @@ static irqreturn_t ras_error_interrupt(int irq, void *dev_id)
/* /*
* Some versions of FWNMI place the buffer inside the 4kB page starting at * Some versions of FWNMI place the buffer inside the 4kB page starting at
* 0x7000. Other versions place it inside the rtas buffer. We check both. * 0x7000. Other versions place it inside the rtas buffer. We check both.
* Minimum size of the buffer is 16 bytes.
*/ */
#define VALID_FWNMI_BUFFER(A) \ #define VALID_FWNMI_BUFFER(A) \
((((A) >= 0x7000) && ((A) < 0x7ff0)) || \ ((((A) >= 0x7000) && ((A) <= 0x8000 - 16)) || \
(((A) >= rtas.base) && ((A) < (rtas.base + rtas.size - 16)))) (((A) >= rtas.base) && ((A) <= (rtas.base + rtas.size - 16))))
static inline struct rtas_error_log *fwnmi_get_errlog(void) static inline struct rtas_error_log *fwnmi_get_errlog(void)
{ {

View File

@@ -38,7 +38,17 @@ static inline void syscall_rollback(struct task_struct *task,
static inline long syscall_get_error(struct task_struct *task, static inline long syscall_get_error(struct task_struct *task,
struct pt_regs *regs) struct pt_regs *regs)
{ {
return IS_ERR_VALUE(regs->gprs[2]) ? regs->gprs[2] : 0; unsigned long error = regs->gprs[2];
#ifdef CONFIG_COMPAT
if (test_tsk_thread_flag(task, TIF_31BIT)) {
/*
* Sign-extend the value so (int)-EFOO becomes (long)-EFOO
* and will match correctly in comparisons.
*/
error = (long)(int)error;
}
#endif
return IS_ERR_VALUE(error) ? error : 0;
} }
static inline long syscall_get_return_value(struct task_struct *task, static inline long syscall_get_return_value(struct task_struct *task,

View File

@@ -87,7 +87,7 @@ $(obj)/vmlinux.bin: $(obj)/compressed/vmlinux FORCE
SETUP_OBJS = $(addprefix $(obj)/,$(setup-y)) SETUP_OBJS = $(addprefix $(obj)/,$(setup-y))
sed-zoffset := -e 's/^\([0-9a-fA-F]*\) [ABCDGRSTVW] \(startup_32\|startup_64\|efi32_stub_entry\|efi64_stub_entry\|efi_pe_entry\|input_data\|_end\|_ehead\|_text\|z_.*\)$$/\#define ZO_\2 0x\1/p' sed-zoffset := -e 's/^\([0-9a-fA-F]*\) [a-zA-Z] \(startup_32\|startup_64\|efi32_stub_entry\|efi64_stub_entry\|efi_pe_entry\|input_data\|_end\|_ehead\|_text\|z_.*\)$$/\#define ZO_\2 0x\1/p'
quiet_cmd_zoffset = ZOFFSET $@ quiet_cmd_zoffset = ZOFFSET $@
cmd_zoffset = $(NM) $< | sed -n $(sed-zoffset) > $@ cmd_zoffset = $(NM) $< | sed -n $(sed-zoffset) > $@

View File

@@ -2024,7 +2024,7 @@ void __init init_apic_mappings(void)
unsigned int new_apicid; unsigned int new_apicid;
if (apic_validate_deadline_timer()) if (apic_validate_deadline_timer())
pr_debug("TSC deadline timer available\n"); pr_info("TSC deadline timer available\n");
if (x2apic_mode) { if (x2apic_mode) {
boot_cpu_physical_apicid = read_apic_id(); boot_cpu_physical_apicid = read_apic_id();

View File

@@ -320,7 +320,11 @@ void __init idt_setup_apic_and_irq_gates(void)
#ifdef CONFIG_X86_LOCAL_APIC #ifdef CONFIG_X86_LOCAL_APIC
for_each_clear_bit_from(i, system_vectors, NR_VECTORS) { for_each_clear_bit_from(i, system_vectors, NR_VECTORS) {
set_bit(i, system_vectors); /*
* Don't set the non assigned system vectors in the
* system_vectors bitmap. Otherwise they show up in
* /proc/interrupts.
*/
entry = spurious_entries_start + 8 * (i - FIRST_SYSTEM_VECTOR); entry = spurious_entries_start + 8 * (i - FIRST_SYSTEM_VECTOR);
set_intr_gate(i, entry); set_intr_gate(i, entry);
} }

View File

@@ -765,16 +765,11 @@ asm(
NOKPROBE_SYMBOL(kretprobe_trampoline); NOKPROBE_SYMBOL(kretprobe_trampoline);
STACK_FRAME_NON_STANDARD(kretprobe_trampoline); STACK_FRAME_NON_STANDARD(kretprobe_trampoline);
static struct kprobe kretprobe_kprobe = {
.addr = (void *)kretprobe_trampoline,
};
/* /*
* Called from kretprobe_trampoline * Called from kretprobe_trampoline
*/ */
__visible __used void *trampoline_handler(struct pt_regs *regs) __visible __used void *trampoline_handler(struct pt_regs *regs)
{ {
struct kprobe_ctlblk *kcb;
struct kretprobe_instance *ri = NULL; struct kretprobe_instance *ri = NULL;
struct hlist_head *head, empty_rp; struct hlist_head *head, empty_rp;
struct hlist_node *tmp; struct hlist_node *tmp;
@@ -784,16 +779,12 @@ __visible __used void *trampoline_handler(struct pt_regs *regs)
void *frame_pointer; void *frame_pointer;
bool skipped = false; bool skipped = false;
preempt_disable();
/* /*
* Set a dummy kprobe for avoiding kretprobe recursion. * Set a dummy kprobe for avoiding kretprobe recursion.
* Since kretprobe never run in kprobe handler, kprobe must not * Since kretprobe never run in kprobe handler, kprobe must not
* be running at this point. * be running at this point.
*/ */
kcb = get_kprobe_ctlblk(); kprobe_busy_begin();
__this_cpu_write(current_kprobe, &kretprobe_kprobe);
kcb->kprobe_status = KPROBE_HIT_ACTIVE;
INIT_HLIST_HEAD(&empty_rp); INIT_HLIST_HEAD(&empty_rp);
kretprobe_hash_lock(current, &head, &flags); kretprobe_hash_lock(current, &head, &flags);
@@ -872,7 +863,7 @@ __visible __used void *trampoline_handler(struct pt_regs *regs)
__this_cpu_write(current_kprobe, &ri->rp->kp); __this_cpu_write(current_kprobe, &ri->rp->kp);
ri->ret_addr = correct_ret_addr; ri->ret_addr = correct_ret_addr;
ri->rp->handler(ri, regs); ri->rp->handler(ri, regs);
__this_cpu_write(current_kprobe, &kretprobe_kprobe); __this_cpu_write(current_kprobe, &kprobe_busy);
} }
recycle_rp_inst(ri, &empty_rp); recycle_rp_inst(ri, &empty_rp);
@@ -888,8 +879,7 @@ __visible __used void *trampoline_handler(struct pt_regs *regs)
kretprobe_hash_unlock(current, &flags); kretprobe_hash_unlock(current, &flags);
__this_cpu_write(current_kprobe, NULL); kprobe_busy_end();
preempt_enable();
hlist_for_each_entry_safe(ri, tmp, &empty_rp, hlist) { hlist_for_each_entry_safe(ri, tmp, &empty_rp, hlist) {
hlist_del(&ri->hlist); hlist_del(&ri->hlist);

View File

@@ -281,6 +281,11 @@ static const u64 shadow_nonpresent_or_rsvd_mask_len = 5;
*/ */
static u64 __read_mostly shadow_nonpresent_or_rsvd_lower_gfn_mask; static u64 __read_mostly shadow_nonpresent_or_rsvd_lower_gfn_mask;
/*
* The number of non-reserved physical address bits irrespective of features
* that repurpose legal bits, e.g. MKTME.
*/
static u8 __read_mostly shadow_phys_bits;
static void mmu_spte_set(u64 *sptep, u64 spte); static void mmu_spte_set(u64 *sptep, u64 spte);
static bool is_executable_pte(u64 spte); static bool is_executable_pte(u64 spte);
@@ -464,6 +469,21 @@ void kvm_mmu_set_mask_ptes(u64 user_mask, u64 accessed_mask,
} }
EXPORT_SYMBOL_GPL(kvm_mmu_set_mask_ptes); EXPORT_SYMBOL_GPL(kvm_mmu_set_mask_ptes);
static u8 kvm_get_shadow_phys_bits(void)
{
/*
* boot_cpu_data.x86_phys_bits is reduced when MKTME is detected
* in CPU detection code, but MKTME treats those reduced bits as
* 'keyID' thus they are not reserved bits. Therefore for MKTME
* we should still return physical address bits reported by CPUID.
*/
if (!boot_cpu_has(X86_FEATURE_TME) ||
WARN_ON_ONCE(boot_cpu_data.extended_cpuid_level < 0x80000008))
return boot_cpu_data.x86_phys_bits;
return cpuid_eax(0x80000008) & 0xff;
}
static void kvm_mmu_reset_all_pte_masks(void) static void kvm_mmu_reset_all_pte_masks(void)
{ {
u8 low_phys_bits; u8 low_phys_bits;
@@ -477,6 +497,8 @@ static void kvm_mmu_reset_all_pte_masks(void)
shadow_present_mask = 0; shadow_present_mask = 0;
shadow_acc_track_mask = 0; shadow_acc_track_mask = 0;
shadow_phys_bits = kvm_get_shadow_phys_bits();
/* /*
* If the CPU has 46 or less physical address bits, then set an * If the CPU has 46 or less physical address bits, then set an
* appropriate mask to guard against L1TF attacks. Otherwise, it is * appropriate mask to guard against L1TF attacks. Otherwise, it is
@@ -4544,7 +4566,7 @@ reset_shadow_zero_bits_mask(struct kvm_vcpu *vcpu, struct kvm_mmu *context)
*/ */
shadow_zero_check = &context->shadow_zero_check; shadow_zero_check = &context->shadow_zero_check;
__reset_rsvds_bits_mask(vcpu, shadow_zero_check, __reset_rsvds_bits_mask(vcpu, shadow_zero_check,
boot_cpu_data.x86_phys_bits, shadow_phys_bits,
context->shadow_root_level, uses_nx, context->shadow_root_level, uses_nx,
guest_cpuid_has(vcpu, X86_FEATURE_GBPAGES), guest_cpuid_has(vcpu, X86_FEATURE_GBPAGES),
is_pse(vcpu), true); is_pse(vcpu), true);
@@ -4581,13 +4603,13 @@ reset_tdp_shadow_zero_bits_mask(struct kvm_vcpu *vcpu,
if (boot_cpu_is_amd()) if (boot_cpu_is_amd())
__reset_rsvds_bits_mask(vcpu, shadow_zero_check, __reset_rsvds_bits_mask(vcpu, shadow_zero_check,
boot_cpu_data.x86_phys_bits, shadow_phys_bits,
context->shadow_root_level, false, context->shadow_root_level, false,
boot_cpu_has(X86_FEATURE_GBPAGES), boot_cpu_has(X86_FEATURE_GBPAGES),
true, true); true, true);
else else
__reset_rsvds_bits_mask_ept(shadow_zero_check, __reset_rsvds_bits_mask_ept(shadow_zero_check,
boot_cpu_data.x86_phys_bits, shadow_phys_bits,
false); false);
if (!shadow_me_mask) if (!shadow_me_mask)
@@ -4608,7 +4630,7 @@ reset_ept_shadow_zero_bits_mask(struct kvm_vcpu *vcpu,
struct kvm_mmu *context, bool execonly) struct kvm_mmu *context, bool execonly)
{ {
__reset_rsvds_bits_mask_ept(&context->shadow_zero_check, __reset_rsvds_bits_mask_ept(&context->shadow_zero_check,
boot_cpu_data.x86_phys_bits, execonly); shadow_phys_bits, execonly);
} }
#define BYTE_MASK(access) \ #define BYTE_MASK(access) \
@@ -6050,6 +6072,25 @@ static int set_nx_huge_pages(const char *val, const struct kernel_param *kp)
return 0; return 0;
} }
static void kvm_set_mmio_spte_mask(void)
{
u64 mask;
/*
* Set a reserved PA bit in MMIO SPTEs to generate page faults with
* PFEC.RSVD=1 on MMIO accesses. 64-bit PTEs (PAE, x86-64, and EPT
* paging) support a maximum of 52 bits of PA, i.e. if the CPU supports
* 52-bit physical addresses then there are no reserved PA bits in the
* PTEs and so the reserved PA approach must be disabled.
*/
if (shadow_phys_bits < 52)
mask = BIT_ULL(51) | PT_PRESENT_MASK;
else
mask = 0;
kvm_mmu_set_mmio_spte_mask(mask, mask);
}
int kvm_mmu_module_init(void) int kvm_mmu_module_init(void)
{ {
int ret = -ENOMEM; int ret = -ENOMEM;
@@ -6059,6 +6100,8 @@ int kvm_mmu_module_init(void)
kvm_mmu_reset_all_pte_masks(); kvm_mmu_reset_all_pte_masks();
kvm_set_mmio_spte_mask();
pte_list_desc_cache = kmem_cache_create("pte_list_desc", pte_list_desc_cache = kmem_cache_create("pte_list_desc",
sizeof(struct pte_list_desc), sizeof(struct pte_list_desc),
0, SLAB_ACCOUNT, NULL); 0, SLAB_ACCOUNT, NULL);

View File

@@ -6775,35 +6775,6 @@ static struct perf_guest_info_callbacks kvm_guest_cbs = {
.get_guest_ip = kvm_get_guest_ip, .get_guest_ip = kvm_get_guest_ip,
}; };
static void kvm_set_mmio_spte_mask(void)
{
u64 mask;
int maxphyaddr = boot_cpu_data.x86_phys_bits;
/*
* Set the reserved bits and the present bit of an paging-structure
* entry to generate page fault with PFER.RSV = 1.
*/
/*
* Mask the uppermost physical address bit, which would be reserved as
* long as the supported physical address width is less than 52.
*/
mask = 1ull << 51;
/* Set the present bit. */
mask |= 1ull;
/*
* If reserved bit is not supported, clear the present bit to disable
* mmio page fault.
*/
if (maxphyaddr == 52)
mask &= ~1ull;
kvm_mmu_set_mmio_spte_mask(mask, mask);
}
#ifdef CONFIG_X86_64 #ifdef CONFIG_X86_64
static void pvclock_gtod_update_fn(struct work_struct *work) static void pvclock_gtod_update_fn(struct work_struct *work)
{ {
@@ -6881,8 +6852,6 @@ int kvm_arch_init(void *opaque)
if (r) if (r)
goto out_free_percpu; goto out_free_percpu;
kvm_set_mmio_spte_mask();
kvm_x86_ops = ops; kvm_x86_ops = ops;
kvm_mmu_set_mask_ptes(PT_USER_MASK, PT_ACCESSED_MASK, kvm_mmu_set_mask_ptes(PT_USER_MASK, PT_ACCESSED_MASK,

View File

@@ -15,7 +15,10 @@ $(obj)/sha256.o: $(srctree)/lib/sha256.c FORCE
LDFLAGS_purgatory.ro := -e purgatory_start -r --no-undefined -nostdlib -z nodefaultlib LDFLAGS_purgatory.ro := -e purgatory_start -r --no-undefined -nostdlib -z nodefaultlib
targets += purgatory.ro targets += purgatory.ro
# Sanitizer, etc. runtimes are unavailable and cannot be linked here.
GCOV_PROFILE := n
KASAN_SANITIZE := n KASAN_SANITIZE := n
UBSAN_SANITIZE := n
KCOV_INSTRUMENT := n KCOV_INSTRUMENT := n
# These are adjustments to the compiler flags used for objects that # These are adjustments to the compiler flags used for objects that
@@ -23,7 +26,7 @@ KCOV_INSTRUMENT := n
PURGATORY_CFLAGS_REMOVE := -mcmodel=kernel PURGATORY_CFLAGS_REMOVE := -mcmodel=kernel
PURGATORY_CFLAGS := -mcmodel=large -ffreestanding -fno-zero-initialized-in-bss PURGATORY_CFLAGS := -mcmodel=large -ffreestanding -fno-zero-initialized-in-bss
PURGATORY_CFLAGS += $(DISABLE_STACKLEAK_PLUGIN) PURGATORY_CFLAGS += $(DISABLE_STACKLEAK_PLUGIN) -DDISABLE_BRANCH_PROFILING
# Default KBUILD_CFLAGS can have -pg option set when FTRACE is enabled. That # Default KBUILD_CFLAGS can have -pg option set when FTRACE is enabled. That
# in turn leaves some undefined symbols like __fentry__ in purgatory and not # in turn leaves some undefined symbols like __fentry__ in purgatory and not

View File

@@ -193,8 +193,6 @@ static int cryptomgr_schedule_probe(struct crypto_larval *larval)
if (IS_ERR(thread)) if (IS_ERR(thread))
goto err_put_larval; goto err_put_larval;
wait_for_completion_interruptible(&larval->completion);
return NOTIFY_STOP; return NOTIFY_STOP;
err_put_larval: err_put_larval:

View File

@@ -78,14 +78,10 @@ static int _skcipher_recvmsg(struct socket *sock, struct msghdr *msg,
return PTR_ERR(areq); return PTR_ERR(areq);
/* convert iovecs of output buffers into RX SGL */ /* convert iovecs of output buffers into RX SGL */
err = af_alg_get_rsgl(sk, msg, flags, areq, -1, &len); err = af_alg_get_rsgl(sk, msg, flags, areq, ctx->used, &len);
if (err) if (err)
goto free; goto free;
/* Process only as much RX buffers for which we have TX data */
if (len > ctx->used)
len = ctx->used;
/* /*
* If more buffers are to be expected to be processed, process only * If more buffers are to be expected to be processed, process only
* full block size buffers. * full block size buffers.

View File

@@ -57,7 +57,6 @@
#include <linux/workqueue.h> #include <linux/workqueue.h>
#include <linux/scatterlist.h> #include <linux/scatterlist.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/async.h>
#include <linux/log2.h> #include <linux/log2.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/glob.h> #include <linux/glob.h>
@@ -6610,7 +6609,7 @@ int ata_host_register(struct ata_host *host, struct scsi_host_template *sht)
/* perform each probe asynchronously */ /* perform each probe asynchronously */
for (i = 0; i < host->n_ports; i++) { for (i = 0; i < host->n_ports; i++) {
struct ata_port *ap = host->ports[i]; struct ata_port *ap = host->ports[i];
async_schedule(async_port_probe, ap); ap->cookie = async_schedule(async_port_probe, ap);
} }
return 0; return 0;
@@ -6750,11 +6749,11 @@ void ata_host_detach(struct ata_host *host)
{ {
int i; int i;
/* Ensure ata_port probe has completed */ for (i = 0; i < host->n_ports; i++) {
async_synchronize_full(); /* Ensure ata_port probe has completed */
async_synchronize_cookie(host->ports[i]->cookie + 1);
for (i = 0; i < host->n_ports; i++)
ata_port_detach(host->ports[i]); ata_port_detach(host->ports[i]);
}
/* the host is dead now, dissociate ACPI */ /* the host is dead now, dissociate ACPI */
ata_acpi_dissociate(host); ata_acpi_dissociate(host);

View File

@@ -700,6 +700,8 @@ int __init_or_module __platform_driver_probe(struct platform_driver *drv,
/* temporary section violation during probe() */ /* temporary section violation during probe() */
drv->probe = probe; drv->probe = probe;
retval = code = __platform_driver_register(drv, module); retval = code = __platform_driver_register(drv, module);
if (retval)
return retval;
/* /*
* Fixup that section violation, being paranoid about code scanning * Fixup that section violation, being paranoid about code scanning

View File

@@ -466,7 +466,6 @@ static int ps3disk_probe(struct ps3_system_bus_device *_dev)
queue->queuedata = dev; queue->queuedata = dev;
blk_queue_max_hw_sectors(queue, dev->bounce_size >> 9); blk_queue_max_hw_sectors(queue, dev->bounce_size >> 9);
blk_queue_segment_boundary(queue, -1UL);
blk_queue_dma_alignment(queue, dev->blk_size-1); blk_queue_dma_alignment(queue, dev->blk_size-1);
blk_queue_logical_block_size(queue, dev->blk_size); blk_queue_logical_block_size(queue, dev->blk_size);

View File

@@ -30,6 +30,7 @@
#include <linux/workqueue.h> #include <linux/workqueue.h>
#include <linux/uuid.h> #include <linux/uuid.h>
#include <linux/nospec.h> #include <linux/nospec.h>
#include <linux/vmalloc.h>
#define PFX "IPMI message handler: " #define PFX "IPMI message handler: "
@@ -1089,7 +1090,7 @@ static void free_user_work(struct work_struct *work)
remove_work); remove_work);
cleanup_srcu_struct(&user->release_barrier); cleanup_srcu_struct(&user->release_barrier);
kfree(user); vfree(user);
} }
int ipmi_create_user(unsigned int if_num, int ipmi_create_user(unsigned int if_num,
@@ -1121,7 +1122,7 @@ int ipmi_create_user(unsigned int if_num,
if (rv) if (rv)
return rv; return rv;
new_user = kmalloc(sizeof(*new_user), GFP_KERNEL); new_user = vzalloc(sizeof(*new_user));
if (!new_user) if (!new_user)
return -ENOMEM; return -ENOMEM;
@@ -1170,7 +1171,7 @@ int ipmi_create_user(unsigned int if_num,
out_kfree: out_kfree:
srcu_read_unlock(&ipmi_interfaces_srcu, index); srcu_read_unlock(&ipmi_interfaces_srcu, index);
kfree(new_user); vfree(new_user);
return rv; return rv;
} }
EXPORT_SYMBOL(ipmi_create_user); EXPORT_SYMBOL(ipmi_create_user);

View File

@@ -1447,13 +1447,13 @@ static struct clk_hw *bcm2835_register_clock(struct bcm2835_cprman *cprman,
return &clock->hw; return &clock->hw;
} }
static struct clk *bcm2835_register_gate(struct bcm2835_cprman *cprman, static struct clk_hw *bcm2835_register_gate(struct bcm2835_cprman *cprman,
const struct bcm2835_gate_data *data) const struct bcm2835_gate_data *data)
{ {
return clk_register_gate(cprman->dev, data->name, data->parent, return clk_hw_register_gate(cprman->dev, data->name, data->parent,
CLK_IGNORE_UNUSED | CLK_SET_RATE_GATE, CLK_IGNORE_UNUSED | CLK_SET_RATE_GATE,
cprman->regs + data->ctl_reg, cprman->regs + data->ctl_reg,
CM_GATE_BIT, 0, &cprman->regs_lock); CM_GATE_BIT, 0, &cprman->regs_lock);
} }
typedef struct clk_hw *(*bcm2835_clk_register)(struct bcm2835_cprman *cprman, typedef struct clk_hw *(*bcm2835_clk_register)(struct bcm2835_cprman *cprman,

View File

@@ -268,7 +268,7 @@ static struct clk_pll gpll0 = {
.l_reg = 0x21004, .l_reg = 0x21004,
.m_reg = 0x21008, .m_reg = 0x21008,
.n_reg = 0x2100c, .n_reg = 0x2100c,
.config_reg = 0x21014, .config_reg = 0x21010,
.mode_reg = 0x21000, .mode_reg = 0x21000,
.status_reg = 0x2101c, .status_reg = 0x2101c,
.status_bit = 17, .status_bit = 17,
@@ -295,7 +295,7 @@ static struct clk_pll gpll1 = {
.l_reg = 0x20004, .l_reg = 0x20004,
.m_reg = 0x20008, .m_reg = 0x20008,
.n_reg = 0x2000c, .n_reg = 0x2000c,
.config_reg = 0x20014, .config_reg = 0x20010,
.mode_reg = 0x20000, .mode_reg = 0x20000,
.status_reg = 0x2001c, .status_reg = 0x2001c,
.status_bit = 17, .status_bit = 17,
@@ -322,7 +322,7 @@ static struct clk_pll gpll2 = {
.l_reg = 0x4a004, .l_reg = 0x4a004,
.m_reg = 0x4a008, .m_reg = 0x4a008,
.n_reg = 0x4a00c, .n_reg = 0x4a00c,
.config_reg = 0x4a014, .config_reg = 0x4a010,
.mode_reg = 0x4a000, .mode_reg = 0x4a000,
.status_reg = 0x4a01c, .status_reg = 0x4a01c,
.status_bit = 17, .status_bit = 17,
@@ -349,7 +349,7 @@ static struct clk_pll bimc_pll = {
.l_reg = 0x23004, .l_reg = 0x23004,
.m_reg = 0x23008, .m_reg = 0x23008,
.n_reg = 0x2300c, .n_reg = 0x2300c,
.config_reg = 0x23014, .config_reg = 0x23010,
.mode_reg = 0x23000, .mode_reg = 0x23000,
.status_reg = 0x2301c, .status_reg = 0x2301c,
.status_bit = 17, .status_bit = 17,

View File

@@ -597,7 +597,7 @@ static const struct samsung_div_clock exynos5800_div_clks[] __initconst = {
static const struct samsung_gate_clock exynos5800_gate_clks[] __initconst = { static const struct samsung_gate_clock exynos5800_gate_clks[] __initconst = {
GATE(CLK_ACLK550_CAM, "aclk550_cam", "mout_user_aclk550_cam", GATE(CLK_ACLK550_CAM, "aclk550_cam", "mout_user_aclk550_cam",
GATE_BUS_TOP, 24, 0, 0), GATE_BUS_TOP, 24, CLK_IS_CRITICAL, 0),
GATE(CLK_ACLK432_SCALER, "aclk432_scaler", "mout_user_aclk432_scaler", GATE(CLK_ACLK432_SCALER, "aclk432_scaler", "mout_user_aclk432_scaler",
GATE_BUS_TOP, 27, CLK_IS_CRITICAL, 0), GATE_BUS_TOP, 27, CLK_IS_CRITICAL, 0),
GATE(CLK_MAU_EPLL, "mau_epll", "mout_user_mau_epll", GATE(CLK_MAU_EPLL, "mau_epll", "mout_user_mau_epll",
@@ -984,25 +984,25 @@ static const struct samsung_gate_clock exynos5x_gate_clks[] __initconst = {
GATE(0, "aclk300_jpeg", "mout_user_aclk300_jpeg", GATE(0, "aclk300_jpeg", "mout_user_aclk300_jpeg",
GATE_BUS_TOP, 4, CLK_IGNORE_UNUSED, 0), GATE_BUS_TOP, 4, CLK_IGNORE_UNUSED, 0),
GATE(0, "aclk333_432_isp0", "mout_user_aclk333_432_isp0", GATE(0, "aclk333_432_isp0", "mout_user_aclk333_432_isp0",
GATE_BUS_TOP, 5, 0, 0), GATE_BUS_TOP, 5, CLK_IS_CRITICAL, 0),
GATE(0, "aclk300_gscl", "mout_user_aclk300_gscl", GATE(0, "aclk300_gscl", "mout_user_aclk300_gscl",
GATE_BUS_TOP, 6, CLK_IS_CRITICAL, 0), GATE_BUS_TOP, 6, CLK_IS_CRITICAL, 0),
GATE(0, "aclk333_432_gscl", "mout_user_aclk333_432_gscl", GATE(0, "aclk333_432_gscl", "mout_user_aclk333_432_gscl",
GATE_BUS_TOP, 7, CLK_IGNORE_UNUSED, 0), GATE_BUS_TOP, 7, CLK_IGNORE_UNUSED, 0),
GATE(0, "aclk333_432_isp", "mout_user_aclk333_432_isp", GATE(0, "aclk333_432_isp", "mout_user_aclk333_432_isp",
GATE_BUS_TOP, 8, 0, 0), GATE_BUS_TOP, 8, CLK_IS_CRITICAL, 0),
GATE(CLK_PCLK66_GPIO, "pclk66_gpio", "mout_user_pclk66_gpio", GATE(CLK_PCLK66_GPIO, "pclk66_gpio", "mout_user_pclk66_gpio",
GATE_BUS_TOP, 9, CLK_IGNORE_UNUSED, 0), GATE_BUS_TOP, 9, CLK_IGNORE_UNUSED, 0),
GATE(0, "aclk66_psgen", "mout_user_aclk66_psgen", GATE(0, "aclk66_psgen", "mout_user_aclk66_psgen",
GATE_BUS_TOP, 10, CLK_IGNORE_UNUSED, 0), GATE_BUS_TOP, 10, CLK_IGNORE_UNUSED, 0),
GATE(0, "aclk266_isp", "mout_user_aclk266_isp", GATE(0, "aclk266_isp", "mout_user_aclk266_isp",
GATE_BUS_TOP, 13, 0, 0), GATE_BUS_TOP, 13, CLK_IS_CRITICAL, 0),
GATE(0, "aclk166", "mout_user_aclk166", GATE(0, "aclk166", "mout_user_aclk166",
GATE_BUS_TOP, 14, CLK_IGNORE_UNUSED, 0), GATE_BUS_TOP, 14, CLK_IGNORE_UNUSED, 0),
GATE(CLK_ACLK333, "aclk333", "mout_user_aclk333", GATE(CLK_ACLK333, "aclk333", "mout_user_aclk333",
GATE_BUS_TOP, 15, CLK_IS_CRITICAL, 0), GATE_BUS_TOP, 15, CLK_IS_CRITICAL, 0),
GATE(0, "aclk400_isp", "mout_user_aclk400_isp", GATE(0, "aclk400_isp", "mout_user_aclk400_isp",
GATE_BUS_TOP, 16, 0, 0), GATE_BUS_TOP, 16, CLK_IS_CRITICAL, 0),
GATE(0, "aclk400_mscl", "mout_user_aclk400_mscl", GATE(0, "aclk400_mscl", "mout_user_aclk400_mscl",
GATE_BUS_TOP, 17, CLK_IS_CRITICAL, 0), GATE_BUS_TOP, 17, CLK_IS_CRITICAL, 0),
GATE(0, "aclk200_disp1", "mout_user_aclk200_disp1", GATE(0, "aclk200_disp1", "mout_user_aclk200_disp1",
@@ -1208,8 +1208,10 @@ static const struct samsung_gate_clock exynos5x_gate_clks[] __initconst = {
GATE_IP_GSCL1, 3, 0, 0), GATE_IP_GSCL1, 3, 0, 0),
GATE(CLK_SMMU_FIMCL1, "smmu_fimcl1", "dout_gscl_blk_333", GATE(CLK_SMMU_FIMCL1, "smmu_fimcl1", "dout_gscl_blk_333",
GATE_IP_GSCL1, 4, 0, 0), GATE_IP_GSCL1, 4, 0, 0),
GATE(CLK_GSCL_WA, "gscl_wa", "sclk_gscl_wa", GATE_IP_GSCL1, 12, 0, 0), GATE(CLK_GSCL_WA, "gscl_wa", "sclk_gscl_wa", GATE_IP_GSCL1, 12,
GATE(CLK_GSCL_WB, "gscl_wb", "sclk_gscl_wb", GATE_IP_GSCL1, 13, 0, 0), CLK_IS_CRITICAL, 0),
GATE(CLK_GSCL_WB, "gscl_wb", "sclk_gscl_wb", GATE_IP_GSCL1, 13,
CLK_IS_CRITICAL, 0),
GATE(CLK_SMMU_FIMCL3, "smmu_fimcl3,", "dout_gscl_blk_333", GATE(CLK_SMMU_FIMCL3, "smmu_fimcl3,", "dout_gscl_blk_333",
GATE_IP_GSCL1, 16, 0, 0), GATE_IP_GSCL1, 16, 0, 0),
GATE(CLK_FIMC_LITE3, "fimc_lite3", "aclk333_432_gscl", GATE(CLK_FIMC_LITE3, "fimc_lite3", "aclk333_432_gscl",

View File

@@ -1680,7 +1680,8 @@ static const struct samsung_gate_clock peric_gate_clks[] __initconst = {
GATE(CLK_SCLK_PCM1, "sclk_pcm1", "sclk_pcm1_peric", GATE(CLK_SCLK_PCM1, "sclk_pcm1", "sclk_pcm1_peric",
ENABLE_SCLK_PERIC, 7, CLK_SET_RATE_PARENT, 0), ENABLE_SCLK_PERIC, 7, CLK_SET_RATE_PARENT, 0),
GATE(CLK_SCLK_I2S1, "sclk_i2s1", "sclk_i2s1_peric", GATE(CLK_SCLK_I2S1, "sclk_i2s1", "sclk_i2s1_peric",
ENABLE_SCLK_PERIC, 6, CLK_SET_RATE_PARENT, 0), ENABLE_SCLK_PERIC, 6,
CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 0),
GATE(CLK_SCLK_SPI2, "sclk_spi2", "sclk_spi2_peric", ENABLE_SCLK_PERIC, GATE(CLK_SCLK_SPI2, "sclk_spi2", "sclk_spi2_peric", ENABLE_SCLK_PERIC,
5, CLK_SET_RATE_PARENT, 0), 5, CLK_SET_RATE_PARENT, 0),
GATE(CLK_SCLK_SPI1, "sclk_spi1", "sclk_spi1_peric", ENABLE_SCLK_PERIC, GATE(CLK_SCLK_SPI1, "sclk_spi1", "sclk_spi1_peric", ENABLE_SCLK_PERIC,

View File

@@ -105,7 +105,7 @@ static unsigned long _sprd_pll_recalc_rate(const struct sprd_pll *pll,
cfg = kcalloc(regs_num, sizeof(*cfg), GFP_KERNEL); cfg = kcalloc(regs_num, sizeof(*cfg), GFP_KERNEL);
if (!cfg) if (!cfg)
return -ENOMEM; return parent_rate;
for (i = 0; i < regs_num; i++) for (i = 0; i < regs_num; i++)
cfg[i] = sprd_pll_read(pll, i); cfg[i] = sprd_pll_read(pll, i);

View File

@@ -373,6 +373,7 @@ static void __init st_of_flexgen_setup(struct device_node *np)
break; break;
} }
flex_flags &= ~CLK_IS_CRITICAL;
of_clk_detect_critical(np, i, &flex_flags); of_clk_detect_critical(np, i, &flex_flags);
/* /*

View File

@@ -98,7 +98,7 @@ static void sun6i_a31_get_pll1_factors(struct factors_request *req)
* Round down the frequency to the closest multiple of either * Round down the frequency to the closest multiple of either
* 6 or 16 * 6 or 16
*/ */
u32 round_freq_6 = round_down(freq_mhz, 6); u32 round_freq_6 = rounddown(freq_mhz, 6);
u32 round_freq_16 = round_down(freq_mhz, 16); u32 round_freq_16 = round_down(freq_mhz, 16);
if (round_freq_6 > round_freq_16) if (round_freq_6 > round_freq_16)

View File

@@ -196,6 +196,7 @@ static void __init _register_composite(void *user,
if (!cclk->comp_clks[i]) if (!cclk->comp_clks[i])
continue; continue;
list_del(&cclk->comp_clks[i]->link); list_del(&cclk->comp_clks[i]->link);
kfree(cclk->comp_clks[i]->parent_names);
kfree(cclk->comp_clks[i]); kfree(cclk->comp_clks[i]);
} }

View File

@@ -168,8 +168,6 @@ struct omap_sham_hmac_ctx {
}; };
struct omap_sham_ctx { struct omap_sham_ctx {
struct omap_sham_dev *dd;
unsigned long flags; unsigned long flags;
/* fallback stuff */ /* fallback stuff */
@@ -921,27 +919,35 @@ static int omap_sham_update_dma_stop(struct omap_sham_dev *dd)
return 0; return 0;
} }
struct omap_sham_dev *omap_sham_find_dev(struct omap_sham_reqctx *ctx)
{
struct omap_sham_dev *dd;
if (ctx->dd)
return ctx->dd;
spin_lock_bh(&sham.lock);
dd = list_first_entry(&sham.dev_list, struct omap_sham_dev, list);
list_move_tail(&dd->list, &sham.dev_list);
ctx->dd = dd;
spin_unlock_bh(&sham.lock);
return dd;
}
static int omap_sham_init(struct ahash_request *req) static int omap_sham_init(struct ahash_request *req)
{ {
struct crypto_ahash *tfm = crypto_ahash_reqtfm(req); struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
struct omap_sham_ctx *tctx = crypto_ahash_ctx(tfm); struct omap_sham_ctx *tctx = crypto_ahash_ctx(tfm);
struct omap_sham_reqctx *ctx = ahash_request_ctx(req); struct omap_sham_reqctx *ctx = ahash_request_ctx(req);
struct omap_sham_dev *dd = NULL, *tmp; struct omap_sham_dev *dd;
int bs = 0; int bs = 0;
spin_lock_bh(&sham.lock); ctx->dd = NULL;
if (!tctx->dd) {
list_for_each_entry(tmp, &sham.dev_list, list) {
dd = tmp;
break;
}
tctx->dd = dd;
} else {
dd = tctx->dd;
}
spin_unlock_bh(&sham.lock);
ctx->dd = dd; dd = omap_sham_find_dev(ctx);
if (!dd)
return -ENODEV;
ctx->flags = 0; ctx->flags = 0;
@@ -1191,8 +1197,7 @@ static int omap_sham_handle_queue(struct omap_sham_dev *dd,
static int omap_sham_enqueue(struct ahash_request *req, unsigned int op) static int omap_sham_enqueue(struct ahash_request *req, unsigned int op)
{ {
struct omap_sham_reqctx *ctx = ahash_request_ctx(req); struct omap_sham_reqctx *ctx = ahash_request_ctx(req);
struct omap_sham_ctx *tctx = crypto_tfm_ctx(req->base.tfm); struct omap_sham_dev *dd = ctx->dd;
struct omap_sham_dev *dd = tctx->dd;
ctx->op = op; ctx->op = op;
@@ -1202,7 +1207,7 @@ static int omap_sham_enqueue(struct ahash_request *req, unsigned int op)
static int omap_sham_update(struct ahash_request *req) static int omap_sham_update(struct ahash_request *req)
{ {
struct omap_sham_reqctx *ctx = ahash_request_ctx(req); struct omap_sham_reqctx *ctx = ahash_request_ctx(req);
struct omap_sham_dev *dd = ctx->dd; struct omap_sham_dev *dd = omap_sham_find_dev(ctx);
if (!req->nbytes) if (!req->nbytes)
return 0; return 0;
@@ -1307,21 +1312,8 @@ static int omap_sham_setkey(struct crypto_ahash *tfm, const u8 *key,
struct omap_sham_hmac_ctx *bctx = tctx->base; struct omap_sham_hmac_ctx *bctx = tctx->base;
int bs = crypto_shash_blocksize(bctx->shash); int bs = crypto_shash_blocksize(bctx->shash);
int ds = crypto_shash_digestsize(bctx->shash); int ds = crypto_shash_digestsize(bctx->shash);
struct omap_sham_dev *dd = NULL, *tmp;
int err, i; int err, i;
spin_lock_bh(&sham.lock);
if (!tctx->dd) {
list_for_each_entry(tmp, &sham.dev_list, list) {
dd = tmp;
break;
}
tctx->dd = dd;
} else {
dd = tctx->dd;
}
spin_unlock_bh(&sham.lock);
err = crypto_shash_setkey(tctx->fallback, key, keylen); err = crypto_shash_setkey(tctx->fallback, key, keylen);
if (err) if (err)
return err; return err;
@@ -1339,7 +1331,7 @@ static int omap_sham_setkey(struct crypto_ahash *tfm, const u8 *key,
memset(bctx->ipad + keylen, 0, bs - keylen); memset(bctx->ipad + keylen, 0, bs - keylen);
if (!test_bit(FLAGS_AUTO_XOR, &dd->flags)) { if (!test_bit(FLAGS_AUTO_XOR, &sham.flags)) {
memcpy(bctx->opad, bctx->ipad, bs); memcpy(bctx->opad, bctx->ipad, bs);
for (i = 0; i < bs; i++) { for (i = 0; i < bs; i++) {
@@ -2142,6 +2134,7 @@ static int omap_sham_probe(struct platform_device *pdev)
} }
dd->flags |= dd->pdata->flags; dd->flags |= dd->pdata->flags;
sham.flags |= dd->pdata->flags;
pm_runtime_use_autosuspend(dev); pm_runtime_use_autosuspend(dev);
pm_runtime_set_autosuspend_delay(dev, DEFAULT_AUTOSUSPEND_DELAY); pm_runtime_set_autosuspend_delay(dev, DEFAULT_AUTOSUSPEND_DELAY);
@@ -2169,6 +2162,9 @@ static int omap_sham_probe(struct platform_device *pdev)
spin_unlock(&sham.lock); spin_unlock(&sham.lock);
for (i = 0; i < dd->pdata->algs_info_size; i++) { for (i = 0; i < dd->pdata->algs_info_size; i++) {
if (dd->pdata->algs_info[i].registered)
break;
for (j = 0; j < dd->pdata->algs_info[i].size; j++) { for (j = 0; j < dd->pdata->algs_info[i].size; j++) {
struct ahash_alg *alg; struct ahash_alg *alg;
@@ -2220,9 +2216,11 @@ static int omap_sham_remove(struct platform_device *pdev)
list_del(&dd->list); list_del(&dd->list);
spin_unlock(&sham.lock); spin_unlock(&sham.lock);
for (i = dd->pdata->algs_info_size - 1; i >= 0; i--) for (i = dd->pdata->algs_info_size - 1; i >= 0; i--)
for (j = dd->pdata->algs_info[i].registered - 1; j >= 0; j--) for (j = dd->pdata->algs_info[i].registered - 1; j >= 0; j--) {
crypto_unregister_ahash( crypto_unregister_ahash(
&dd->pdata->algs_info[i].algs_list[j]); &dd->pdata->algs_info[i].algs_list[j]);
dd->pdata->algs_info[i].registered--;
}
tasklet_kill(&dd->done_task); tasklet_kill(&dd->done_task);
pm_runtime_disable(&pdev->dev); pm_runtime_disable(&pdev->dev);

View File

@@ -128,7 +128,7 @@ static int adc_jack_probe(struct platform_device *pdev)
for (i = 0; data->adc_conditions[i].id != EXTCON_NONE; i++); for (i = 0; data->adc_conditions[i].id != EXTCON_NONE; i++);
data->num_conditions = i; data->num_conditions = i;
data->chan = iio_channel_get(&pdev->dev, pdata->consumer_channel); data->chan = devm_iio_channel_get(&pdev->dev, pdata->consumer_channel);
if (IS_ERR(data->chan)) if (IS_ERR(data->chan))
return PTR_ERR(data->chan); return PTR_ERR(data->chan);
@@ -170,7 +170,6 @@ static int adc_jack_remove(struct platform_device *pdev)
free_irq(data->irq, data); free_irq(data->irq, data);
cancel_work_sync(&data->handler.work); cancel_work_sync(&data->handler.work);
iio_channel_release(data->chan);
return 0; return 0;
} }

View File

@@ -18,7 +18,6 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/cpumask.h> #include <linux/cpumask.h>
#include <linux/export.h> #include <linux/export.h>
#include <linux/dma-direct.h>
#include <linux/dma-mapping.h> #include <linux/dma-mapping.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/types.h> #include <linux/types.h>
@@ -449,8 +448,7 @@ int qcom_scm_assign_mem(phys_addr_t mem_addr, size_t mem_sz,
struct qcom_scm_mem_map_info *mem_to_map; struct qcom_scm_mem_map_info *mem_to_map;
phys_addr_t mem_to_map_phys; phys_addr_t mem_to_map_phys;
phys_addr_t dest_phys; phys_addr_t dest_phys;
phys_addr_t ptr_phys; dma_addr_t ptr_phys;
dma_addr_t ptr_dma;
size_t mem_to_map_sz; size_t mem_to_map_sz;
size_t dest_sz; size_t dest_sz;
size_t src_sz; size_t src_sz;
@@ -468,10 +466,9 @@ int qcom_scm_assign_mem(phys_addr_t mem_addr, size_t mem_sz,
ptr_sz = ALIGN(src_sz, SZ_64) + ALIGN(mem_to_map_sz, SZ_64) + ptr_sz = ALIGN(src_sz, SZ_64) + ALIGN(mem_to_map_sz, SZ_64) +
ALIGN(dest_sz, SZ_64); ALIGN(dest_sz, SZ_64);
ptr = dma_alloc_coherent(__scm->dev, ptr_sz, &ptr_dma, GFP_KERNEL); ptr = dma_alloc_coherent(__scm->dev, ptr_sz, &ptr_phys, GFP_KERNEL);
if (!ptr) if (!ptr)
return -ENOMEM; return -ENOMEM;
ptr_phys = dma_to_phys(__scm->dev, ptr_dma);
/* Fill source vmid detail */ /* Fill source vmid detail */
src = ptr; src = ptr;
@@ -501,7 +498,7 @@ int qcom_scm_assign_mem(phys_addr_t mem_addr, size_t mem_sz,
ret = __qcom_scm_assign_mem(__scm->dev, mem_to_map_phys, mem_to_map_sz, ret = __qcom_scm_assign_mem(__scm->dev, mem_to_map_phys, mem_to_map_sz,
ptr_phys, src_sz, dest_phys, dest_sz); ptr_phys, src_sz, dest_phys, dest_sz);
dma_free_coherent(__scm->dev, ptr_sz, ptr, ptr_dma); dma_free_coherent(__scm->dev, ptr_sz, ptr, ptr_phys);
if (ret) { if (ret) {
dev_err(__scm->dev, dev_err(__scm->dev,
"Assign memory protection call failed %d.\n", ret); "Assign memory protection call failed %d.\n", ret);

View File

@@ -106,10 +106,10 @@ static int afu_dma_pin_pages(struct dfl_feature_platform_data *pdata,
region->pages); region->pages);
if (pinned < 0) { if (pinned < 0) {
ret = pinned; ret = pinned;
goto put_pages; goto free_pages;
} else if (pinned != npages) { } else if (pinned != npages) {
ret = -EFAULT; ret = -EFAULT;
goto free_pages; goto put_pages;
} }
dev_dbg(dev, "%d pages pinned\n", pinned); dev_dbg(dev, "%d pages pinned\n", pinned);

View File

@@ -51,7 +51,9 @@
#define GPIO_EXT_PORTC 0x58 #define GPIO_EXT_PORTC 0x58
#define GPIO_EXT_PORTD 0x5c #define GPIO_EXT_PORTD 0x5c
#define DWAPB_DRIVER_NAME "gpio-dwapb"
#define DWAPB_MAX_PORTS 4 #define DWAPB_MAX_PORTS 4
#define GPIO_EXT_PORT_STRIDE 0x04 /* register stride 32 bits */ #define GPIO_EXT_PORT_STRIDE 0x04 /* register stride 32 bits */
#define GPIO_SWPORT_DR_STRIDE 0x0c /* register stride 3*32 bits */ #define GPIO_SWPORT_DR_STRIDE 0x0c /* register stride 3*32 bits */
#define GPIO_SWPORT_DDR_STRIDE 0x0c /* register stride 3*32 bits */ #define GPIO_SWPORT_DDR_STRIDE 0x0c /* register stride 3*32 bits */
@@ -400,7 +402,7 @@ static void dwapb_configure_irqs(struct dwapb_gpio *gpio,
return; return;
err = irq_alloc_domain_generic_chips(gpio->domain, ngpio, 2, err = irq_alloc_domain_generic_chips(gpio->domain, ngpio, 2,
"gpio-dwapb", handle_level_irq, DWAPB_DRIVER_NAME, handle_level_irq,
IRQ_NOREQUEST, 0, IRQ_NOREQUEST, 0,
IRQ_GC_INIT_NESTED_LOCK); IRQ_GC_INIT_NESTED_LOCK);
if (err) { if (err) {
@@ -457,7 +459,7 @@ static void dwapb_configure_irqs(struct dwapb_gpio *gpio,
*/ */
err = devm_request_irq(gpio->dev, pp->irq[0], err = devm_request_irq(gpio->dev, pp->irq[0],
dwapb_irq_handler_mfd, dwapb_irq_handler_mfd,
IRQF_SHARED, "gpio-dwapb-mfd", gpio); IRQF_SHARED, DWAPB_DRIVER_NAME, gpio);
if (err) { if (err) {
dev_err(gpio->dev, "error requesting IRQ\n"); dev_err(gpio->dev, "error requesting IRQ\n");
irq_domain_remove(gpio->domain); irq_domain_remove(gpio->domain);
@@ -535,26 +537,33 @@ static int dwapb_gpio_add_port(struct dwapb_gpio *gpio,
dwapb_configure_irqs(gpio, port, pp); dwapb_configure_irqs(gpio, port, pp);
err = gpiochip_add_data(&port->gc, port); err = gpiochip_add_data(&port->gc, port);
if (err) if (err) {
dev_err(gpio->dev, "failed to register gpiochip for port%d\n", dev_err(gpio->dev, "failed to register gpiochip for port%d\n",
port->idx); port->idx);
else return err;
port->is_registered = true; }
/* Add GPIO-signaled ACPI event support */ /* Add GPIO-signaled ACPI event support */
if (pp->has_irq) acpi_gpiochip_request_interrupts(&port->gc);
acpi_gpiochip_request_interrupts(&port->gc);
return err; port->is_registered = true;
return 0;
} }
static void dwapb_gpio_unregister(struct dwapb_gpio *gpio) static void dwapb_gpio_unregister(struct dwapb_gpio *gpio)
{ {
unsigned int m; unsigned int m;
for (m = 0; m < gpio->nr_ports; ++m) for (m = 0; m < gpio->nr_ports; ++m) {
if (gpio->ports[m].is_registered) struct dwapb_gpio_port *port = &gpio->ports[m];
gpiochip_remove(&gpio->ports[m].gc);
if (!port->is_registered)
continue;
acpi_gpiochip_free_interrupts(&port->gc);
gpiochip_remove(&port->gc);
}
} }
static struct dwapb_platform_data * static struct dwapb_platform_data *
@@ -842,7 +851,7 @@ static SIMPLE_DEV_PM_OPS(dwapb_gpio_pm_ops, dwapb_gpio_suspend,
static struct platform_driver dwapb_gpio_driver = { static struct platform_driver dwapb_gpio_driver = {
.driver = { .driver = {
.name = "gpio-dwapb", .name = DWAPB_DRIVER_NAME,
.pm = &dwapb_gpio_pm_ops, .pm = &dwapb_gpio_pm_ops,
.of_match_table = of_match_ptr(dwapb_of_match), .of_match_table = of_match_ptr(dwapb_of_match),
.acpi_match_table = ACPI_PTR(dwapb_acpi_match), .acpi_match_table = ACPI_PTR(dwapb_acpi_match),
@@ -856,3 +865,4 @@ module_platform_driver(dwapb_gpio_driver);
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_AUTHOR("Jamie Iles"); MODULE_AUTHOR("Jamie Iles");
MODULE_DESCRIPTION("Synopsys DesignWare APB GPIO driver"); MODULE_DESCRIPTION("Synopsys DesignWare APB GPIO driver");
MODULE_ALIAS("platform:" DWAPB_DRIVER_NAME);

View File

@@ -238,7 +238,7 @@ static void ci_initialize_power_tune_defaults(struct pp_hwmgr *hwmgr)
switch (dev_id) { switch (dev_id) {
case 0x67BA: case 0x67BA:
case 0x66B1: case 0x67B1:
smu_data->power_tune_defaults = &defaults_hawaii_pro; smu_data->power_tune_defaults = &defaults_hawaii_pro;
break; break;
case 0x67B8: case 0x67B8:

View File

@@ -29,6 +29,7 @@
#include <linux/i2c.h> #include <linux/i2c.h>
#include <drm/drm_dp_mst_helper.h> #include <drm/drm_dp_mst_helper.h>
#include <drm/drmP.h> #include <drm/drmP.h>
#include <linux/iopoll.h>
#include <drm/drm_fixed.h> #include <drm/drm_fixed.h>
#include <drm/drm_atomic.h> #include <drm/drm_atomic.h>
@@ -2889,6 +2890,17 @@ static int drm_dp_dpcd_write_payload(struct drm_dp_mst_topology_mgr *mgr,
return ret; return ret;
} }
static int do_get_act_status(struct drm_dp_aux *aux)
{
int ret;
u8 status;
ret = drm_dp_dpcd_readb(aux, DP_PAYLOAD_TABLE_UPDATE_STATUS, &status);
if (ret < 0)
return ret;
return status;
}
/** /**
* drm_dp_check_act_status() - Check ACT handled status. * drm_dp_check_act_status() - Check ACT handled status.
@@ -2898,33 +2910,29 @@ static int drm_dp_dpcd_write_payload(struct drm_dp_mst_topology_mgr *mgr,
*/ */
int drm_dp_check_act_status(struct drm_dp_mst_topology_mgr *mgr) int drm_dp_check_act_status(struct drm_dp_mst_topology_mgr *mgr)
{ {
u8 status; /*
int ret; * There doesn't seem to be any recommended retry count or timeout in
int count = 0; * the MST specification. Since some hubs have been observed to take
* over 1 second to update their payload allocations under certain
* conditions, we use a rather large timeout value.
*/
const int timeout_ms = 3000;
int ret, status;
do { ret = readx_poll_timeout(do_get_act_status, mgr->aux, status,
ret = drm_dp_dpcd_readb(mgr->aux, DP_PAYLOAD_TABLE_UPDATE_STATUS, &status); status & DP_PAYLOAD_ACT_HANDLED || status < 0,
200, timeout_ms * USEC_PER_MSEC);
if (ret < 0) { if (ret < 0 && status >= 0) {
DRM_DEBUG_KMS("failed to read payload table status %d\n", ret); DRM_DEBUG_KMS("Failed to get ACT after %dms, last status: %02x\n",
goto fail; timeout_ms, status);
} return -EINVAL;
} else if (status < 0) {
if (status & DP_PAYLOAD_ACT_HANDLED) DRM_DEBUG_KMS("Failed to read payload table status: %d\n",
break; status);
count++; return status;
udelay(100);
} while (count < 30);
if (!(status & DP_PAYLOAD_ACT_HANDLED)) {
DRM_DEBUG_KMS("failed to get ACT bit %d after %d retries\n", status, count);
ret = -EINVAL;
goto fail;
} }
return 0; return 0;
fail:
return ret;
} }
EXPORT_SYMBOL(drm_dp_check_act_status); EXPORT_SYMBOL(drm_dp_check_act_status);

View File

@@ -84,7 +84,7 @@ int drm_i2c_encoder_init(struct drm_device *dev,
err = encoder_drv->encoder_init(client, dev, encoder); err = encoder_drv->encoder_init(client, dev, encoder);
if (err) if (err)
goto fail_unregister; goto fail_module_put;
if (info->platform_data) if (info->platform_data)
encoder->slave_funcs->set_config(&encoder->base, encoder->slave_funcs->set_config(&encoder->base,
@@ -92,9 +92,10 @@ int drm_i2c_encoder_init(struct drm_device *dev,
return 0; return 0;
fail_module_put:
module_put(module);
fail_unregister: fail_unregister:
i2c_unregister_device(client); i2c_unregister_device(client);
module_put(module);
fail: fail:
return err; return err;
} }

View File

@@ -570,6 +570,9 @@ struct drm_i915_reg_descriptor {
#define REG32(_reg, ...) \ #define REG32(_reg, ...) \
{ .addr = (_reg), __VA_ARGS__ } { .addr = (_reg), __VA_ARGS__ }
#define REG32_IDX(_reg, idx) \
{ .addr = _reg(idx) }
/* /*
* Convenience macro for adding 64-bit registers. * Convenience macro for adding 64-bit registers.
* *
@@ -667,6 +670,7 @@ static const struct drm_i915_reg_descriptor gen9_blt_regs[] = {
REG64_IDX(RING_TIMESTAMP, BSD_RING_BASE), REG64_IDX(RING_TIMESTAMP, BSD_RING_BASE),
REG32(BCS_SWCTRL), REG32(BCS_SWCTRL),
REG64_IDX(RING_TIMESTAMP, BLT_RING_BASE), REG64_IDX(RING_TIMESTAMP, BLT_RING_BASE),
REG32_IDX(RING_CTX_TIMESTAMP, BLT_RING_BASE),
REG64_IDX(BCS_GPR, 0), REG64_IDX(BCS_GPR, 0),
REG64_IDX(BCS_GPR, 1), REG64_IDX(BCS_GPR, 1),
REG64_IDX(BCS_GPR, 2), REG64_IDX(BCS_GPR, 2),

View File

@@ -3821,6 +3821,7 @@ static void gen11_hpd_irq_setup(struct drm_i915_private *dev_priv)
val = I915_READ(GEN11_DE_HPD_IMR); val = I915_READ(GEN11_DE_HPD_IMR);
val &= ~hotplug_irqs; val &= ~hotplug_irqs;
val |= ~enabled_irqs & hotplug_irqs;
I915_WRITE(GEN11_DE_HPD_IMR, val); I915_WRITE(GEN11_DE_HPD_IMR, val);
POSTING_READ(GEN11_DE_HPD_IMR); POSTING_READ(GEN11_DE_HPD_IMR);

View File

@@ -1021,7 +1021,8 @@ static int mdp5_init(struct platform_device *pdev, struct drm_device *dev)
return 0; return 0;
fail: fail:
mdp5_destroy(pdev); if (mdp5_kms)
mdp5_destroy(pdev);
return ret; return ret;
} }

View File

@@ -181,7 +181,7 @@ int qxl_device_init(struct qxl_device *qdev,
&(qdev->ram_header->cursor_ring_hdr), &(qdev->ram_header->cursor_ring_hdr),
sizeof(struct qxl_command), sizeof(struct qxl_command),
QXL_CURSOR_RING_SIZE, QXL_CURSOR_RING_SIZE,
qdev->io_base + QXL_IO_NOTIFY_CMD, qdev->io_base + QXL_IO_NOTIFY_CURSOR,
false, false,
&qdev->cursor_event); &qdev->cursor_event);

View File

@@ -152,7 +152,7 @@
#define SUN4I_HDMI_DDC_CMD_IMPLICIT_WRITE 3 #define SUN4I_HDMI_DDC_CMD_IMPLICIT_WRITE 3
#define SUN4I_HDMI_DDC_CLK_REG 0x528 #define SUN4I_HDMI_DDC_CLK_REG 0x528
#define SUN4I_HDMI_DDC_CLK_M(m) (((m) & 0x7) << 3) #define SUN4I_HDMI_DDC_CLK_M(m) (((m) & 0xf) << 3)
#define SUN4I_HDMI_DDC_CLK_N(n) ((n) & 0x7) #define SUN4I_HDMI_DDC_CLK_N(n) ((n) & 0x7)
#define SUN4I_HDMI_DDC_LINE_CTRL_REG 0x540 #define SUN4I_HDMI_DDC_LINE_CTRL_REG 0x540

View File

@@ -37,7 +37,7 @@ static unsigned long sun4i_ddc_calc_divider(unsigned long rate,
unsigned long best_rate = 0; unsigned long best_rate = 0;
u8 best_m = 0, best_n = 0, _m, _n; u8 best_m = 0, best_n = 0, _m, _n;
for (_m = 0; _m < 8; _m++) { for (_m = 0; _m < 16; _m++) {
for (_n = 0; _n < 8; _n++) { for (_n = 0; _n < 8; _n++) {
unsigned long tmp_rate; unsigned long tmp_rate;

View File

@@ -1124,6 +1124,9 @@
#define USB_DEVICE_ID_TPV_OPTICAL_TOUCHSCREEN_8882 0x8882 #define USB_DEVICE_ID_TPV_OPTICAL_TOUCHSCREEN_8882 0x8882
#define USB_DEVICE_ID_TPV_OPTICAL_TOUCHSCREEN_8883 0x8883 #define USB_DEVICE_ID_TPV_OPTICAL_TOUCHSCREEN_8883 0x8883
#define USB_VENDOR_ID_TRUST 0x145f
#define USB_DEVICE_ID_TRUST_PANORA_TABLET 0x0212
#define USB_VENDOR_ID_TURBOX 0x062a #define USB_VENDOR_ID_TURBOX 0x062a
#define USB_DEVICE_ID_TURBOX_KEYBOARD 0x0201 #define USB_DEVICE_ID_TURBOX_KEYBOARD 0x0201
#define USB_DEVICE_ID_ASUS_MD_5110 0x5110 #define USB_DEVICE_ID_ASUS_MD_5110 0x5110

View File

@@ -168,6 +168,7 @@ static const struct hid_device_id hid_quirks[] = {
{ HID_USB_DEVICE(USB_VENDOR_ID_TOUCHPACK, USB_DEVICE_ID_TOUCHPACK_RTS), HID_QUIRK_MULTI_INPUT }, { HID_USB_DEVICE(USB_VENDOR_ID_TOUCHPACK, USB_DEVICE_ID_TOUCHPACK_RTS), HID_QUIRK_MULTI_INPUT },
{ HID_USB_DEVICE(USB_VENDOR_ID_TPV, USB_DEVICE_ID_TPV_OPTICAL_TOUCHSCREEN_8882), HID_QUIRK_NOGET }, { HID_USB_DEVICE(USB_VENDOR_ID_TPV, USB_DEVICE_ID_TPV_OPTICAL_TOUCHSCREEN_8882), HID_QUIRK_NOGET },
{ HID_USB_DEVICE(USB_VENDOR_ID_TPV, USB_DEVICE_ID_TPV_OPTICAL_TOUCHSCREEN_8883), HID_QUIRK_NOGET }, { HID_USB_DEVICE(USB_VENDOR_ID_TPV, USB_DEVICE_ID_TPV_OPTICAL_TOUCHSCREEN_8883), HID_QUIRK_NOGET },
{ HID_USB_DEVICE(USB_VENDOR_ID_TRUST, USB_DEVICE_ID_TRUST_PANORA_TABLET), HID_QUIRK_MULTI_INPUT | HID_QUIRK_HIDINPUT_FORCE },
{ HID_USB_DEVICE(USB_VENDOR_ID_TURBOX, USB_DEVICE_ID_TURBOX_KEYBOARD), HID_QUIRK_NOGET }, { HID_USB_DEVICE(USB_VENDOR_ID_TURBOX, USB_DEVICE_ID_TURBOX_KEYBOARD), HID_QUIRK_NOGET },
{ HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_KNA5), HID_QUIRK_MULTI_INPUT }, { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_KNA5), HID_QUIRK_MULTI_INPUT },
{ HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_TWA60), HID_QUIRK_MULTI_INPUT }, { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_TWA60), HID_QUIRK_MULTI_INPUT },

View File

@@ -958,7 +958,8 @@ static int piix4_probe(struct pci_dev *dev, const struct pci_device_id *id)
} }
if (dev->vendor == PCI_VENDOR_ID_AMD && if (dev->vendor == PCI_VENDOR_ID_AMD &&
dev->device == PCI_DEVICE_ID_AMD_HUDSON2_SMBUS) { (dev->device == PCI_DEVICE_ID_AMD_HUDSON2_SMBUS ||
dev->device == PCI_DEVICE_ID_AMD_KERNCZ_SMBUS)) {
retval = piix4_setup_sb800(dev, id, 1); retval = piix4_setup_sb800(dev, id, 1);
} }

View File

@@ -315,11 +315,10 @@ static void i2c_pxa_scream_blue_murder(struct pxa_i2c *i2c, const char *why)
dev_err(dev, "IBMR: %08x IDBR: %08x ICR: %08x ISR: %08x\n", dev_err(dev, "IBMR: %08x IDBR: %08x ICR: %08x ISR: %08x\n",
readl(_IBMR(i2c)), readl(_IDBR(i2c)), readl(_ICR(i2c)), readl(_IBMR(i2c)), readl(_IDBR(i2c)), readl(_ICR(i2c)),
readl(_ISR(i2c))); readl(_ISR(i2c)));
dev_dbg(dev, "log: "); dev_err(dev, "log:");
for (i = 0; i < i2c->irqlogidx; i++) for (i = 0; i < i2c->irqlogidx; i++)
pr_debug("[%08x:%08x] ", i2c->isrlog[i], i2c->icrlog[i]); pr_cont(" [%03x:%05x]", i2c->isrlog[i], i2c->icrlog[i]);
pr_cont("\n");
pr_debug("\n");
} }
#else /* ifdef DEBUG */ #else /* ifdef DEBUG */
@@ -709,11 +708,9 @@ static inline void i2c_pxa_stop_message(struct pxa_i2c *i2c)
{ {
u32 icr; u32 icr;
/* /* Clear the START, STOP, ACK, TB and MA flags */
* Clear the STOP and ACK flags
*/
icr = readl(_ICR(i2c)); icr = readl(_ICR(i2c));
icr &= ~(ICR_STOP | ICR_ACKNAK); icr &= ~(ICR_START | ICR_STOP | ICR_ACKNAK | ICR_TB | ICR_MA);
writel(icr, _ICR(i2c)); writel(icr, _ICR(i2c));
} }

View File

@@ -261,6 +261,8 @@ static u32 bmp280_compensate_humidity(struct bmp280_data *data,
+ (s32)2097152) * calib->H2 + 8192) >> 14); + (s32)2097152) * calib->H2 + 8192) >> 14);
var -= ((((var >> 15) * (var >> 15)) >> 7) * (s32)calib->H1) >> 4; var -= ((((var >> 15) * (var >> 15)) >> 7) * (s32)calib->H1) >> 4;
var = clamp_val(var, 0, 419430400);
return var >> 12; return var >> 12;
}; };
@@ -703,7 +705,7 @@ static int bmp180_measure(struct bmp280_data *data, u8 ctrl_meas)
unsigned int ctrl; unsigned int ctrl;
if (data->use_eoc) if (data->use_eoc)
init_completion(&data->done); reinit_completion(&data->done);
ret = regmap_write(data->regmap, BMP280_REG_CTRL_MEAS, ctrl_meas); ret = regmap_write(data->regmap, BMP280_REG_CTRL_MEAS, ctrl_meas);
if (ret) if (ret)
@@ -959,6 +961,9 @@ static int bmp085_fetch_eoc_irq(struct device *dev,
"trying to enforce it\n"); "trying to enforce it\n");
irq_trig = IRQF_TRIGGER_RISING; irq_trig = IRQF_TRIGGER_RISING;
} }
init_completion(&data->done);
ret = devm_request_threaded_irq(dev, ret = devm_request_threaded_irq(dev,
irq, irq,
bmp085_eoc_irq, bmp085_eoc_irq,

View File

@@ -319,8 +319,21 @@ static struct config_group *make_cma_dev(struct config_group *group,
return ERR_PTR(err); return ERR_PTR(err);
} }
static void drop_cma_dev(struct config_group *cgroup, struct config_item *item)
{
struct config_group *group =
container_of(item, struct config_group, cg_item);
struct cma_dev_group *cma_dev_group =
container_of(group, struct cma_dev_group, device_group);
configfs_remove_default_groups(&cma_dev_group->ports_group);
configfs_remove_default_groups(&cma_dev_group->device_group);
config_item_put(item);
}
static struct configfs_group_operations cma_subsys_group_ops = { static struct configfs_group_operations cma_subsys_group_ops = {
.make_group = make_cma_dev, .make_group = make_cma_dev,
.drop_item = drop_cma_dev,
}; };
static const struct config_item_type cma_subsys_type = { static const struct config_item_type cma_subsys_type = {

View File

@@ -945,6 +945,7 @@ void c4iw_dealloc(struct uld_ctx *ctx)
static void c4iw_remove(struct uld_ctx *ctx) static void c4iw_remove(struct uld_ctx *ctx)
{ {
pr_debug("c4iw_dev %p\n", ctx->dev); pr_debug("c4iw_dev %p\n", ctx->dev);
debugfs_remove_recursive(ctx->dev->debugfs_root);
c4iw_unregister_device(ctx->dev); c4iw_unregister_device(ctx->dev);
c4iw_dealloc(ctx); c4iw_dealloc(ctx);
} }

View File

@@ -328,6 +328,7 @@ static bool devx_is_obj_modify_cmd(const void *in)
case MLX5_CMD_OP_SET_L2_TABLE_ENTRY: case MLX5_CMD_OP_SET_L2_TABLE_ENTRY:
case MLX5_CMD_OP_RST2INIT_QP: case MLX5_CMD_OP_RST2INIT_QP:
case MLX5_CMD_OP_INIT2RTR_QP: case MLX5_CMD_OP_INIT2RTR_QP:
case MLX5_CMD_OP_INIT2INIT_QP:
case MLX5_CMD_OP_RTR2RTS_QP: case MLX5_CMD_OP_RTR2RTS_QP:
case MLX5_CMD_OP_RTS2RTS_QP: case MLX5_CMD_OP_RTS2RTS_QP:
case MLX5_CMD_OP_SQERR2RTS_QP: case MLX5_CMD_OP_SQERR2RTS_QP:

View File

@@ -1432,7 +1432,7 @@ static int btree_gc_coalesce(struct btree *b, struct btree_op *op,
if (__set_blocks(n1, n1->keys + n2->keys, if (__set_blocks(n1, n1->keys + n2->keys,
block_bytes(b->c)) > block_bytes(b->c)) >
btree_blocks(new_nodes[i])) btree_blocks(new_nodes[i]))
goto out_nocoalesce; goto out_unlock_nocoalesce;
keys = n2->keys; keys = n2->keys;
/* Take the key of the node we're getting rid of */ /* Take the key of the node we're getting rid of */
@@ -1461,7 +1461,7 @@ static int btree_gc_coalesce(struct btree *b, struct btree_op *op,
if (__bch_keylist_realloc(&keylist, if (__bch_keylist_realloc(&keylist,
bkey_u64s(&new_nodes[i]->key))) bkey_u64s(&new_nodes[i]->key)))
goto out_nocoalesce; goto out_unlock_nocoalesce;
bch_btree_node_write(new_nodes[i], &cl); bch_btree_node_write(new_nodes[i], &cl);
bch_keylist_add(&keylist, &new_nodes[i]->key); bch_keylist_add(&keylist, &new_nodes[i]->key);
@@ -1507,6 +1507,10 @@ static int btree_gc_coalesce(struct btree *b, struct btree_op *op,
/* Invalidated our iterator */ /* Invalidated our iterator */
return -EINTR; return -EINTR;
out_unlock_nocoalesce:
for (i = 0; i < nodes; i++)
mutex_unlock(&new_nodes[i]->write_lock);
out_nocoalesce: out_nocoalesce:
closure_sync(&cl); closure_sync(&cl);
bch_keylist_free(&keylist); bch_keylist_free(&keylist);

View File

@@ -1868,7 +1868,7 @@ static int multipath_prepare_ioctl(struct dm_target *ti,
int r; int r;
current_pgpath = READ_ONCE(m->current_pgpath); current_pgpath = READ_ONCE(m->current_pgpath);
if (!current_pgpath) if (!current_pgpath || !test_bit(MPATHF_QUEUE_IO, &m->flags))
current_pgpath = choose_pgpath(m, 0); current_pgpath = choose_pgpath(m, 0);
if (current_pgpath) { if (current_pgpath) {

View File

@@ -1580,7 +1580,7 @@ static struct dm_zone *dmz_get_rnd_zone_for_reclaim(struct dmz_metadata *zmd)
return dzone; return dzone;
} }
return ERR_PTR(-EBUSY); return NULL;
} }
/* /*
@@ -1600,7 +1600,7 @@ static struct dm_zone *dmz_get_seq_zone_for_reclaim(struct dmz_metadata *zmd)
return zone; return zone;
} }
return ERR_PTR(-EBUSY); return NULL;
} }
/* /*

View File

@@ -348,8 +348,8 @@ static int dmz_do_reclaim(struct dmz_reclaim *zrc)
/* Get a data zone */ /* Get a data zone */
dzone = dmz_get_zone_for_reclaim(zmd); dzone = dmz_get_zone_for_reclaim(zmd);
if (IS_ERR(dzone)) if (!dzone)
return PTR_ERR(dzone); return -EBUSY;
start = jiffies; start = jiffies;

View File

@@ -1182,6 +1182,8 @@ static int super_90_validate(struct mddev *mddev, struct md_rdev *rdev)
mddev->new_layout = mddev->layout; mddev->new_layout = mddev->layout;
mddev->new_chunk_sectors = mddev->chunk_sectors; mddev->new_chunk_sectors = mddev->chunk_sectors;
} }
if (mddev->level == 0)
mddev->layout = -1;
if (sb->state & (1<<MD_SB_CLEAN)) if (sb->state & (1<<MD_SB_CLEAN))
mddev->recovery_cp = MaxSector; mddev->recovery_cp = MaxSector;
@@ -1598,6 +1600,10 @@ static int super_1_load(struct md_rdev *rdev, struct md_rdev *refdev, int minor_
rdev->ppl.sector = rdev->sb_start + rdev->ppl.offset; rdev->ppl.sector = rdev->sb_start + rdev->ppl.offset;
} }
if ((le32_to_cpu(sb->feature_map) & MD_FEATURE_RAID0_LAYOUT) &&
sb->level != 0)
return -EINVAL;
if (!refdev) { if (!refdev) {
ret = 1; ret = 1;
} else { } else {
@@ -1708,6 +1714,10 @@ static int super_1_validate(struct mddev *mddev, struct md_rdev *rdev)
mddev->new_chunk_sectors = mddev->chunk_sectors; mddev->new_chunk_sectors = mddev->chunk_sectors;
} }
if (mddev->level == 0 &&
!(le32_to_cpu(sb->feature_map) & MD_FEATURE_RAID0_LAYOUT))
mddev->layout = -1;
if (le32_to_cpu(sb->feature_map) & MD_FEATURE_JOURNAL) if (le32_to_cpu(sb->feature_map) & MD_FEATURE_JOURNAL)
set_bit(MD_HAS_JOURNAL, &mddev->flags); set_bit(MD_HAS_JOURNAL, &mddev->flags);
@@ -6784,6 +6794,9 @@ static int set_array_info(struct mddev *mddev, mdu_array_info_t *info)
mddev->external = 0; mddev->external = 0;
mddev->layout = info->layout; mddev->layout = info->layout;
if (mddev->level == 0)
/* Cannot trust RAID0 layout info here */
mddev->layout = -1;
mddev->chunk_sectors = info->chunk_size >> 9; mddev->chunk_sectors = info->chunk_size >> 9;
if (mddev->persistent) { if (mddev->persistent) {

View File

@@ -152,6 +152,9 @@ static int create_strip_zones(struct mddev *mddev, struct r0conf **private_conf)
if (conf->nr_strip_zones == 1) { if (conf->nr_strip_zones == 1) {
conf->layout = RAID0_ORIG_LAYOUT; conf->layout = RAID0_ORIG_LAYOUT;
} else if (mddev->layout == RAID0_ORIG_LAYOUT ||
mddev->layout == RAID0_ALT_MULTIZONE_LAYOUT) {
conf->layout = mddev->layout;
} else if (default_layout == RAID0_ORIG_LAYOUT || } else if (default_layout == RAID0_ORIG_LAYOUT ||
default_layout == RAID0_ALT_MULTIZONE_LAYOUT) { default_layout == RAID0_ALT_MULTIZONE_LAYOUT) {
conf->layout = default_layout; conf->layout = default_layout;

View File

@@ -704,3 +704,4 @@ module_i2c_driver(wm8994_i2c_driver);
MODULE_DESCRIPTION("Core support for the WM8994 audio CODEC"); MODULE_DESCRIPTION("Core support for the WM8994 audio CODEC");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>"); MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");
MODULE_SOFTDEP("pre: wm8994_regulator");

View File

@@ -235,7 +235,7 @@ static int ams_delta_init(struct platform_device *pdev)
goto out_gpio; goto out_gpio;
/* Scan to find existence of the device */ /* Scan to find existence of the device */
err = nand_scan(ams_delta_mtd, 1); err = nand_scan(this, 1);
if (err) if (err)
goto out_mtd; goto out_mtd;
@@ -264,7 +264,7 @@ static int ams_delta_cleanup(struct platform_device *pdev)
void __iomem *io_base = platform_get_drvdata(pdev); void __iomem *io_base = platform_get_drvdata(pdev);
/* Release resources, unregister device */ /* Release resources, unregister device */
nand_release(ams_delta_mtd); nand_release(mtd_to_nand(ams_delta_mtd));
gpio_free_array(_mandatory_gpio, ARRAY_SIZE(_mandatory_gpio)); gpio_free_array(_mandatory_gpio, ARRAY_SIZE(_mandatory_gpio));
gpio_free(AMS_DELTA_GPIO_PIN_NAND_RB); gpio_free(AMS_DELTA_GPIO_PIN_NAND_RB);

View File

@@ -1694,7 +1694,7 @@ atmel_nand_controller_add_nand(struct atmel_nand_controller *nc,
nc->caps->ops->nand_init(nc, nand); nc->caps->ops->nand_init(nc, nand);
ret = nand_scan(mtd, nand->numcs); ret = nand_scan(chip, nand->numcs);
if (ret) { if (ret) {
dev_err(nc->dev, "NAND scan failed: %d\n", ret); dev_err(nc->dev, "NAND scan failed: %d\n", ret);
return ret; return ret;

View File

@@ -466,7 +466,7 @@ static int au1550nd_probe(struct platform_device *pdev)
this->write_buf = (pd->devwidth) ? au_write_buf16 : au_write_buf; this->write_buf = (pd->devwidth) ? au_write_buf16 : au_write_buf;
this->read_buf = (pd->devwidth) ? au_read_buf16 : au_read_buf; this->read_buf = (pd->devwidth) ? au_read_buf16 : au_read_buf;
ret = nand_scan(mtd, 1); ret = nand_scan(this, 1);
if (ret) { if (ret) {
dev_err(&pdev->dev, "NAND scan failed with %d\n", ret); dev_err(&pdev->dev, "NAND scan failed with %d\n", ret);
goto out3; goto out3;
@@ -492,7 +492,7 @@ static int au1550nd_remove(struct platform_device *pdev)
struct au1550nd_ctx *ctx = platform_get_drvdata(pdev); struct au1550nd_ctx *ctx = platform_get_drvdata(pdev);
struct resource *r = platform_get_resource(pdev, IORESOURCE_MEM, 0); struct resource *r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
nand_release(nand_to_mtd(&ctx->chip)); nand_release(&ctx->chip);
iounmap(ctx->base); iounmap(ctx->base);
release_mem_region(r->start, 0x1000); release_mem_region(r->start, 0x1000);
kfree(ctx); kfree(ctx);

View File

@@ -65,7 +65,7 @@ static int bcm47xxnflash_remove(struct platform_device *pdev)
{ {
struct bcm47xxnflash *nflash = platform_get_drvdata(pdev); struct bcm47xxnflash *nflash = platform_get_drvdata(pdev);
nand_release(nand_to_mtd(&nflash->nand_chip)); nand_release(&nflash->nand_chip);
return 0; return 0;
} }

View File

@@ -423,7 +423,7 @@ int bcm47xxnflash_ops_bcm4706_init(struct bcm47xxnflash *b47n)
(w4 << 24 | w3 << 18 | w2 << 12 | w1 << 6 | w0)); (w4 << 24 | w3 << 18 | w2 << 12 | w1 << 6 | w0));
/* Scan NAND */ /* Scan NAND */
err = nand_scan(nand_to_mtd(&b47n->nand_chip), 1); err = nand_scan(&b47n->nand_chip, 1);
if (err) { if (err) {
pr_err("Could not scan NAND flash: %d\n", err); pr_err("Could not scan NAND flash: %d\n", err);
goto exit; goto exit;

View File

@@ -2304,7 +2304,7 @@ static int brcmnand_init_cs(struct brcmnand_host *host, struct device_node *dn)
nand_writereg(ctrl, cfg_offs, nand_writereg(ctrl, cfg_offs,
nand_readreg(ctrl, cfg_offs) & ~CFG_BUS_WIDTH); nand_readreg(ctrl, cfg_offs) & ~CFG_BUS_WIDTH);
ret = nand_scan(mtd, 1); ret = nand_scan(chip, 1);
if (ret) if (ret)
return ret; return ret;
@@ -2619,7 +2619,7 @@ int brcmnand_remove(struct platform_device *pdev)
struct brcmnand_host *host; struct brcmnand_host *host;
list_for_each_entry(host, &ctrl->host_list, node) list_for_each_entry(host, &ctrl->host_list, node)
nand_release(nand_to_mtd(&host->chip)); nand_release(&host->chip);
clk_disable_unprepare(ctrl->clk); clk_disable_unprepare(ctrl->clk);

View File

@@ -783,7 +783,7 @@ static int cafe_nand_probe(struct pci_dev *pdev,
/* Scan to find existence of the device */ /* Scan to find existence of the device */
cafe->nand.dummy_controller.ops = &cafe_nand_controller_ops; cafe->nand.dummy_controller.ops = &cafe_nand_controller_ops;
err = nand_scan(mtd, 2); err = nand_scan(&cafe->nand, 2);
if (err) if (err)
goto out_irq; goto out_irq;
@@ -819,7 +819,7 @@ static void cafe_nand_remove(struct pci_dev *pdev)
/* Disable NAND IRQ in global IRQ mask register */ /* Disable NAND IRQ in global IRQ mask register */
cafe_writel(cafe, ~1 & cafe_readl(cafe, GLOBAL_IRQ_MASK), GLOBAL_IRQ_MASK); cafe_writel(cafe, ~1 & cafe_readl(cafe, GLOBAL_IRQ_MASK), GLOBAL_IRQ_MASK);
free_irq(pdev->irq, mtd); free_irq(pdev->irq, mtd);
nand_release(mtd); nand_release(chip);
free_rs(cafe->rs); free_rs(cafe->rs);
pci_iounmap(pdev, cafe->mmio); pci_iounmap(pdev, cafe->mmio);
dma_free_coherent(&cafe->pdev->dev, 2112, cafe->dmabuf, cafe->dmaaddr); dma_free_coherent(&cafe->pdev->dev, 2112, cafe->dmabuf, cafe->dmaaddr);

View File

@@ -193,7 +193,7 @@ static int __init cmx270_init(void)
this->write_buf = cmx270_write_buf; this->write_buf = cmx270_write_buf;
/* Scan to find existence of the device */ /* Scan to find existence of the device */
ret = nand_scan(cmx270_nand_mtd, 1); ret = nand_scan(this, 1);
if (ret) { if (ret) {
pr_notice("No NAND device\n"); pr_notice("No NAND device\n");
goto err_scan; goto err_scan;
@@ -228,7 +228,7 @@ module_init(cmx270_init);
static void __exit cmx270_cleanup(void) static void __exit cmx270_cleanup(void)
{ {
/* Release resources, unregister device */ /* Release resources, unregister device */
nand_release(cmx270_nand_mtd); nand_release(mtd_to_nand(cmx270_nand_mtd));
gpio_free(GPIO_NAND_RB); gpio_free(GPIO_NAND_RB);
gpio_free(GPIO_NAND_CS); gpio_free(GPIO_NAND_CS);

View File

@@ -241,7 +241,7 @@ static int __init cs553x_init_one(int cs, int mmio, unsigned long adr)
} }
/* Scan to find existence of the device */ /* Scan to find existence of the device */
err = nand_scan(new_mtd, 1); err = nand_scan(this, 1);
if (err) if (err)
goto out_free; goto out_free;
@@ -336,7 +336,7 @@ static void __exit cs553x_cleanup(void)
mmio_base = this->IO_ADDR_R; mmio_base = this->IO_ADDR_R;
/* Release resources, unregister device */ /* Release resources, unregister device */
nand_release(mtd); nand_release(this);
kfree(mtd->name); kfree(mtd->name);
cs553x_mtd[i] = NULL; cs553x_mtd[i] = NULL;

View File

@@ -807,7 +807,7 @@ static int nand_davinci_probe(struct platform_device *pdev)
/* Scan to find existence of the device(s) */ /* Scan to find existence of the device(s) */
info->chip.dummy_controller.ops = &davinci_nand_controller_ops; info->chip.dummy_controller.ops = &davinci_nand_controller_ops;
ret = nand_scan(mtd, pdata->mask_chipsel ? 2 : 1); ret = nand_scan(&info->chip, pdata->mask_chipsel ? 2 : 1);
if (ret < 0) { if (ret < 0) {
dev_dbg(&pdev->dev, "no NAND chip(s) found\n"); dev_dbg(&pdev->dev, "no NAND chip(s) found\n");
return ret; return ret;
@@ -841,7 +841,7 @@ static int nand_davinci_remove(struct platform_device *pdev)
ecc4_busy = false; ecc4_busy = false;
spin_unlock_irq(&davinci_nand_lock); spin_unlock_irq(&davinci_nand_lock);
nand_release(nand_to_mtd(&info->chip)); nand_release(&info->chip);
return 0; return 0;
} }

View File

@@ -1384,7 +1384,7 @@ int denali_init(struct denali_nand_info *denali)
chip->setup_data_interface = denali_setup_data_interface; chip->setup_data_interface = denali_setup_data_interface;
chip->dummy_controller.ops = &denali_controller_ops; chip->dummy_controller.ops = &denali_controller_ops;
ret = nand_scan(mtd, denali->max_banks); ret = nand_scan(chip, denali->max_banks);
if (ret) if (ret)
goto disable_irq; goto disable_irq;
@@ -1407,9 +1407,7 @@ EXPORT_SYMBOL(denali_init);
void denali_remove(struct denali_nand_info *denali) void denali_remove(struct denali_nand_info *denali)
{ {
struct mtd_info *mtd = nand_to_mtd(&denali->nand); nand_release(&denali->nand);
nand_release(mtd);
denali_disable_irq(denali); denali_disable_irq(denali);
} }
EXPORT_SYMBOL(denali_remove); EXPORT_SYMBOL(denali_remove);

View File

@@ -1620,14 +1620,11 @@ static int __init doc_probe(unsigned long physadr)
else else
numchips = doc2001_init(mtd); numchips = doc2001_init(mtd);
if ((ret = nand_scan(mtd, numchips)) || (ret = doc->late_init(mtd))) { if ((ret = nand_scan(nand, numchips)) || (ret = doc->late_init(mtd))) {
/* DBB note: i believe nand_release is necessary here, as /* DBB note: i believe nand_cleanup is necessary here, as
buffers may have been allocated in nand_base. Check with buffers may have been allocated in nand_base. Check with
Thomas. FIX ME! */ Thomas. FIX ME! */
/* nand_release will call mtd_device_unregister, but we nand_cleanup(nand);
haven't yet added it. This is handled without incident by
mtd_device_unregister, as far as I can tell. */
nand_release(mtd);
goto fail; goto fail;
} }
@@ -1662,7 +1659,7 @@ static void release_nanddoc(void)
doc = nand_get_controller_data(nand); doc = nand_get_controller_data(nand);
nextmtd = doc->nextdoc; nextmtd = doc->nextdoc;
nand_release(mtd); nand_release(nand);
iounmap(doc->virtadr); iounmap(doc->virtadr);
release_mem_region(doc->physadr, DOC_IOREMAP_LEN); release_mem_region(doc->physadr, DOC_IOREMAP_LEN);
free_rs(doc->rs_decoder); free_rs(doc->rs_decoder);

View File

@@ -1391,7 +1391,7 @@ static int __init probe_docg4(struct platform_device *pdev)
* ->attach_chip callback. * ->attach_chip callback.
*/ */
nand->dummy_controller.ops = &docg4_controller_ops; nand->dummy_controller.ops = &docg4_controller_ops;
retval = nand_scan(mtd, 0); retval = nand_scan(nand, 0);
if (retval) if (retval)
goto free_nand; goto free_nand;
@@ -1420,7 +1420,7 @@ static int __init probe_docg4(struct platform_device *pdev)
static int __exit cleanup_docg4(struct platform_device *pdev) static int __exit cleanup_docg4(struct platform_device *pdev)
{ {
struct docg4_priv *doc = platform_get_drvdata(pdev); struct docg4_priv *doc = platform_get_drvdata(pdev);
nand_release(doc->mtd); nand_release(mtd_to_nand(doc->mtd));
kfree(mtd_to_nand(doc->mtd)); kfree(mtd_to_nand(doc->mtd));
iounmap(doc->virtadr); iounmap(doc->virtadr);
return 0; return 0;

View File

@@ -915,7 +915,7 @@ static int fsl_elbc_nand_probe(struct platform_device *pdev)
goto err; goto err;
priv->chip.controller->ops = &fsl_elbc_controller_ops; priv->chip.controller->ops = &fsl_elbc_controller_ops;
ret = nand_scan(mtd, 1); ret = nand_scan(&priv->chip, 1);
if (ret) if (ret)
goto err; goto err;
@@ -942,9 +942,8 @@ static int fsl_elbc_nand_remove(struct platform_device *pdev)
{ {
struct fsl_elbc_fcm_ctrl *elbc_fcm_ctrl = fsl_lbc_ctrl_dev->nand; struct fsl_elbc_fcm_ctrl *elbc_fcm_ctrl = fsl_lbc_ctrl_dev->nand;
struct fsl_elbc_mtd *priv = dev_get_drvdata(&pdev->dev); struct fsl_elbc_mtd *priv = dev_get_drvdata(&pdev->dev);
struct mtd_info *mtd = nand_to_mtd(&priv->chip);
nand_release(mtd); nand_release(&priv->chip);
fsl_elbc_chip_remove(priv); fsl_elbc_chip_remove(priv);
mutex_lock(&fsl_elbc_nand_mutex); mutex_lock(&fsl_elbc_nand_mutex);

View File

@@ -1079,7 +1079,7 @@ static int fsl_ifc_nand_probe(struct platform_device *dev)
goto err; goto err;
priv->chip.controller->ops = &fsl_ifc_controller_ops; priv->chip.controller->ops = &fsl_ifc_controller_ops;
ret = nand_scan(mtd, 1); ret = nand_scan(&priv->chip, 1);
if (ret) if (ret)
goto err; goto err;
@@ -1105,9 +1105,8 @@ static int fsl_ifc_nand_probe(struct platform_device *dev)
static int fsl_ifc_nand_remove(struct platform_device *dev) static int fsl_ifc_nand_remove(struct platform_device *dev)
{ {
struct fsl_ifc_mtd *priv = dev_get_drvdata(&dev->dev); struct fsl_ifc_mtd *priv = dev_get_drvdata(&dev->dev);
struct mtd_info *mtd = nand_to_mtd(&priv->chip);
nand_release(mtd); nand_release(&priv->chip);
fsl_ifc_chip_remove(priv); fsl_ifc_chip_remove(priv);
mutex_lock(&fsl_ifc_nand_mutex); mutex_lock(&fsl_ifc_nand_mutex);

View File

@@ -191,7 +191,7 @@ static int fun_chip_init(struct fsl_upm_nand *fun,
goto err; goto err;
} }
ret = nand_scan(mtd, fun->mchip_count); ret = nand_scan(&fun->chip, fun->mchip_count);
if (ret) if (ret)
goto err; goto err;
@@ -326,7 +326,7 @@ static int fun_remove(struct platform_device *ofdev)
struct mtd_info *mtd = nand_to_mtd(&fun->chip); struct mtd_info *mtd = nand_to_mtd(&fun->chip);
int i; int i;
nand_release(mtd); nand_release(&fun->chip);
kfree(mtd->name); kfree(mtd->name);
for (i = 0; i < fun->mchip_count; i++) { for (i = 0; i < fun->mchip_count; i++) {

View File

@@ -1125,7 +1125,7 @@ static int __init fsmc_nand_probe(struct platform_device *pdev)
* Scan to find existence of the device * Scan to find existence of the device
*/ */
nand->dummy_controller.ops = &fsmc_nand_controller_ops; nand->dummy_controller.ops = &fsmc_nand_controller_ops;
ret = nand_scan(mtd, 1); ret = nand_scan(nand, 1);
if (ret) if (ret)
goto release_dma_write_chan; goto release_dma_write_chan;
@@ -1161,7 +1161,7 @@ static int fsmc_nand_remove(struct platform_device *pdev)
struct fsmc_nand_data *host = platform_get_drvdata(pdev); struct fsmc_nand_data *host = platform_get_drvdata(pdev);
if (host) { if (host) {
nand_release(nand_to_mtd(&host->nand)); nand_release(&host->nand);
if (host->mode == USE_DMA_ACCESS) { if (host->mode == USE_DMA_ACCESS) {
dma_release_channel(host->write_dma_chan); dma_release_channel(host->write_dma_chan);

View File

@@ -194,7 +194,7 @@ static int gpio_nand_remove(struct platform_device *pdev)
{ {
struct gpiomtd *gpiomtd = platform_get_drvdata(pdev); struct gpiomtd *gpiomtd = platform_get_drvdata(pdev);
nand_release(nand_to_mtd(&gpiomtd->nand_chip)); nand_release(&gpiomtd->nand_chip);
/* Enable write protection and disable the chip */ /* Enable write protection and disable the chip */
if (gpiomtd->nwp && !IS_ERR(gpiomtd->nwp)) if (gpiomtd->nwp && !IS_ERR(gpiomtd->nwp))
@@ -289,7 +289,7 @@ static int gpio_nand_probe(struct platform_device *pdev)
if (gpiomtd->nwp && !IS_ERR(gpiomtd->nwp)) if (gpiomtd->nwp && !IS_ERR(gpiomtd->nwp))
gpiod_direction_output(gpiomtd->nwp, 1); gpiod_direction_output(gpiomtd->nwp, 1);
ret = nand_scan(mtd, 1); ret = nand_scan(chip, 1);
if (ret) if (ret)
goto err_wp; goto err_wp;

View File

@@ -1934,7 +1934,7 @@ static int gpmi_nand_init(struct gpmi_nand_data *this)
goto err_out; goto err_out;
chip->dummy_controller.ops = &gpmi_nand_controller_ops; chip->dummy_controller.ops = &gpmi_nand_controller_ops;
ret = nand_scan(mtd, GPMI_IS_MX6(this) ? 2 : 1); ret = nand_scan(chip, GPMI_IS_MX6(this) ? 2 : 1);
if (ret) if (ret)
goto err_out; goto err_out;
@@ -2026,7 +2026,7 @@ static int gpmi_nand_remove(struct platform_device *pdev)
{ {
struct gpmi_nand_data *this = platform_get_drvdata(pdev); struct gpmi_nand_data *this = platform_get_drvdata(pdev);
nand_release(nand_to_mtd(&this->nand)); nand_release(&this->nand);
gpmi_free_dma_buffer(this); gpmi_free_dma_buffer(this);
release_resources(this); release_resources(this);
return 0; return 0;

View File

@@ -811,7 +811,7 @@ static int hisi_nfc_probe(struct platform_device *pdev)
} }
chip->dummy_controller.ops = &hisi_nfc_controller_ops; chip->dummy_controller.ops = &hisi_nfc_controller_ops;
ret = nand_scan(mtd, max_chips); ret = nand_scan(chip, max_chips);
if (ret) if (ret)
return ret; return ret;
@@ -828,9 +828,8 @@ static int hisi_nfc_probe(struct platform_device *pdev)
static int hisi_nfc_remove(struct platform_device *pdev) static int hisi_nfc_remove(struct platform_device *pdev)
{ {
struct hinfc_host *host = platform_get_drvdata(pdev); struct hinfc_host *host = platform_get_drvdata(pdev);
struct mtd_info *mtd = nand_to_mtd(&host->chip);
nand_release(mtd); nand_release(&host->chip);
return 0; return 0;
} }

View File

@@ -331,7 +331,7 @@ static int jz_nand_detect_bank(struct platform_device *pdev,
if (chipnr == 0) { if (chipnr == 0) {
/* Detect first chip. */ /* Detect first chip. */
ret = nand_scan(mtd, 1); ret = nand_scan(chip, 1);
if (ret) if (ret)
goto notfound_id; goto notfound_id;
@@ -507,7 +507,7 @@ static int jz_nand_remove(struct platform_device *pdev)
struct jz_nand *nand = platform_get_drvdata(pdev); struct jz_nand *nand = platform_get_drvdata(pdev);
size_t i; size_t i;
nand_release(nand_to_mtd(&nand->chip)); nand_release(&nand->chip);
/* Deassert and disable all chips */ /* Deassert and disable all chips */
writel(0, nand->base + JZ_REG_NAND_CTRL); writel(0, nand->base + JZ_REG_NAND_CTRL);

View File

@@ -286,13 +286,13 @@ static int jz4780_nand_init_chip(struct platform_device *pdev,
nand_set_flash_node(chip, np); nand_set_flash_node(chip, np);
chip->controller->ops = &jz4780_nand_controller_ops; chip->controller->ops = &jz4780_nand_controller_ops;
ret = nand_scan(mtd, 1); ret = nand_scan(chip, 1);
if (ret) if (ret)
return ret; return ret;
ret = mtd_device_register(mtd, NULL, 0); ret = mtd_device_register(mtd, NULL, 0);
if (ret) { if (ret) {
nand_release(mtd); nand_release(chip);
return ret; return ret;
} }
@@ -307,7 +307,7 @@ static void jz4780_nand_cleanup_chips(struct jz4780_nand_controller *nfc)
while (!list_empty(&nfc->chips)) { while (!list_empty(&nfc->chips)) {
chip = list_first_entry(&nfc->chips, struct jz4780_nand_chip, chip_list); chip = list_first_entry(&nfc->chips, struct jz4780_nand_chip, chip_list);
nand_release(nand_to_mtd(&chip->chip)); nand_release(&chip->chip);
list_del(&chip->chip_list); list_del(&chip->chip_list);
} }
} }

View File

@@ -802,7 +802,7 @@ static int lpc32xx_nand_probe(struct platform_device *pdev)
* SMALL block or LARGE block. * SMALL block or LARGE block.
*/ */
nand_chip->dummy_controller.ops = &lpc32xx_nand_controller_ops; nand_chip->dummy_controller.ops = &lpc32xx_nand_controller_ops;
res = nand_scan(mtd, 1); res = nand_scan(nand_chip, 1);
if (res) if (res)
goto free_irq; goto free_irq;
@@ -839,9 +839,8 @@ static int lpc32xx_nand_probe(struct platform_device *pdev)
static int lpc32xx_nand_remove(struct platform_device *pdev) static int lpc32xx_nand_remove(struct platform_device *pdev)
{ {
struct lpc32xx_nand_host *host = platform_get_drvdata(pdev); struct lpc32xx_nand_host *host = platform_get_drvdata(pdev);
struct mtd_info *mtd = nand_to_mtd(&host->nand_chip);
nand_release(mtd); nand_release(&host->nand_chip);
free_irq(host->irq, host); free_irq(host->irq, host);
if (use_dma) if (use_dma)
dma_release_channel(host->dma_chan); dma_release_channel(host->dma_chan);

View File

@@ -925,7 +925,7 @@ static int lpc32xx_nand_probe(struct platform_device *pdev)
/* Find NAND device */ /* Find NAND device */
chip->dummy_controller.ops = &lpc32xx_nand_controller_ops; chip->dummy_controller.ops = &lpc32xx_nand_controller_ops;
res = nand_scan(mtd, 1); res = nand_scan(chip, 1);
if (res) if (res)
goto release_dma; goto release_dma;
@@ -956,9 +956,8 @@ static int lpc32xx_nand_remove(struct platform_device *pdev)
{ {
uint32_t tmp; uint32_t tmp;
struct lpc32xx_nand_host *host = platform_get_drvdata(pdev); struct lpc32xx_nand_host *host = platform_get_drvdata(pdev);
struct mtd_info *mtd = nand_to_mtd(&host->nand_chip);
nand_release(mtd); nand_release(&host->nand_chip);
dma_release_channel(host->dma_chan); dma_release_channel(host->dma_chan);
/* Force CE high */ /* Force CE high */

View File

@@ -2551,7 +2551,7 @@ static int marvell_nand_chip_init(struct device *dev, struct marvell_nfc *nfc,
chip->options |= NAND_BUSWIDTH_AUTO; chip->options |= NAND_BUSWIDTH_AUTO;
ret = nand_scan(mtd, marvell_nand->nsels); ret = nand_scan(chip, marvell_nand->nsels);
if (ret) { if (ret) {
dev_err(dev, "could not scan the nand chip\n"); dev_err(dev, "could not scan the nand chip\n");
return ret; return ret;
@@ -2564,7 +2564,7 @@ static int marvell_nand_chip_init(struct device *dev, struct marvell_nfc *nfc,
ret = mtd_device_register(mtd, NULL, 0); ret = mtd_device_register(mtd, NULL, 0);
if (ret) { if (ret) {
dev_err(dev, "failed to register mtd device: %d\n", ret); dev_err(dev, "failed to register mtd device: %d\n", ret);
nand_release(mtd); nand_release(chip);
return ret; return ret;
} }
@@ -2619,7 +2619,7 @@ static void marvell_nand_chips_cleanup(struct marvell_nfc *nfc)
struct marvell_nand_chip *entry, *temp; struct marvell_nand_chip *entry, *temp;
list_for_each_entry_safe(entry, temp, &nfc->chips, node) { list_for_each_entry_safe(entry, temp, &nfc->chips, node) {
nand_release(nand_to_mtd(&entry->chip)); nand_release(&entry->chip);
list_del(&entry->node); list_del(&entry->node);
} }
} }

View File

@@ -778,7 +778,7 @@ static int mpc5121_nfc_probe(struct platform_device *op)
} }
/* Detect NAND chips */ /* Detect NAND chips */
retval = nand_scan(mtd, be32_to_cpup(chips_no)); retval = nand_scan(chip, be32_to_cpup(chips_no));
if (retval) { if (retval) {
dev_err(dev, "NAND Flash not found !\n"); dev_err(dev, "NAND Flash not found !\n");
goto error; goto error;
@@ -828,7 +828,7 @@ static int mpc5121_nfc_remove(struct platform_device *op)
struct device *dev = &op->dev; struct device *dev = &op->dev;
struct mtd_info *mtd = dev_get_drvdata(dev); struct mtd_info *mtd = dev_get_drvdata(dev);
nand_release(mtd); nand_release(mtd_to_nand(mtd));
mpc5121_nfc_free(dev, mtd); mpc5121_nfc_free(dev, mtd);
return 0; return 0;

View File

@@ -1382,14 +1382,14 @@ static int mtk_nfc_nand_chip_init(struct device *dev, struct mtk_nfc *nfc,
mtk_nfc_hw_init(nfc); mtk_nfc_hw_init(nfc);
ret = nand_scan(mtd, nsels); ret = nand_scan(nand, nsels);
if (ret) if (ret)
return ret; return ret;
ret = mtd_device_register(mtd, NULL, 0); ret = mtd_device_register(mtd, NULL, 0);
if (ret) { if (ret) {
dev_err(dev, "mtd parse partition error\n"); dev_err(dev, "mtd parse partition error\n");
nand_release(mtd); nand_cleanup(nand);
return ret; return ret;
} }
@@ -1555,7 +1555,7 @@ static int mtk_nfc_remove(struct platform_device *pdev)
while (!list_empty(&nfc->chips)) { while (!list_empty(&nfc->chips)) {
chip = list_first_entry(&nfc->chips, struct mtk_nfc_nand_chip, chip = list_first_entry(&nfc->chips, struct mtk_nfc_nand_chip,
node); node);
nand_release(nand_to_mtd(&chip->nand)); nand_release(&chip->nand);
list_del(&chip->node); list_del(&chip->node);
} }

View File

@@ -1900,7 +1900,7 @@ static int mxcnd_probe(struct platform_device *pdev)
/* Scan the NAND device */ /* Scan the NAND device */
this->dummy_controller.ops = &mxcnd_controller_ops; this->dummy_controller.ops = &mxcnd_controller_ops;
err = nand_scan(mtd, is_imx25_nfc(host) ? 4 : 1); err = nand_scan(this, is_imx25_nfc(host) ? 4 : 1);
if (err) if (err)
goto escan; goto escan;
@@ -1928,7 +1928,7 @@ static int mxcnd_remove(struct platform_device *pdev)
{ {
struct mxc_nand_host *host = platform_get_drvdata(pdev); struct mxc_nand_host *host = platform_get_drvdata(pdev);
nand_release(nand_to_mtd(&host->nand)); nand_release(&host->nand);
if (host->clk_act) if (host->clk_act)
clk_disable_unprepare(host->clk); clk_disable_unprepare(host->clk);

View File

@@ -5953,7 +5953,7 @@ static int nand_dt_init(struct nand_chip *chip)
/** /**
* nand_scan_ident - Scan for the NAND device * nand_scan_ident - Scan for the NAND device
* @mtd: MTD device structure * @chip: NAND chip object
* @maxchips: number of chips to scan for * @maxchips: number of chips to scan for
* @table: alternative NAND ID table * @table: alternative NAND ID table
* *
@@ -5965,11 +5965,11 @@ static int nand_dt_init(struct nand_chip *chip)
* prevented dynamic allocations during this phase which was unconvenient and * prevented dynamic allocations during this phase which was unconvenient and
* as been banned for the benefit of the ->init_ecc()/cleanup_ecc() hooks. * as been banned for the benefit of the ->init_ecc()/cleanup_ecc() hooks.
*/ */
static int nand_scan_ident(struct mtd_info *mtd, int maxchips, static int nand_scan_ident(struct nand_chip *chip, int maxchips,
struct nand_flash_dev *table) struct nand_flash_dev *table)
{ {
struct mtd_info *mtd = nand_to_mtd(chip);
int i, nand_maf_id, nand_dev_id; int i, nand_maf_id, nand_dev_id;
struct nand_chip *chip = mtd_to_nand(mtd);
int ret; int ret;
/* Enforce the right timings for reset/detection */ /* Enforce the right timings for reset/detection */
@@ -6423,15 +6423,15 @@ static bool nand_ecc_strength_good(struct mtd_info *mtd)
/** /**
* nand_scan_tail - Scan for the NAND device * nand_scan_tail - Scan for the NAND device
* @mtd: MTD device structure * @chip: NAND chip object
* *
* This is the second phase of the normal nand_scan() function. It fills out * This is the second phase of the normal nand_scan() function. It fills out
* all the uninitialized function pointers with the defaults and scans for a * all the uninitialized function pointers with the defaults and scans for a
* bad block table if appropriate. * bad block table if appropriate.
*/ */
static int nand_scan_tail(struct mtd_info *mtd) static int nand_scan_tail(struct nand_chip *chip)
{ {
struct nand_chip *chip = mtd_to_nand(mtd); struct mtd_info *mtd = nand_to_mtd(chip);
struct nand_ecc_ctrl *ecc = &chip->ecc; struct nand_ecc_ctrl *ecc = &chip->ecc;
int ret, i; int ret, i;
@@ -6770,7 +6770,7 @@ static void nand_detach(struct nand_chip *chip)
/** /**
* nand_scan_with_ids - [NAND Interface] Scan for the NAND device * nand_scan_with_ids - [NAND Interface] Scan for the NAND device
* @mtd: MTD device structure * @chip: NAND chip object
* @maxchips: number of chips to scan for. @nand_scan_ident() will not be run if * @maxchips: number of chips to scan for. @nand_scan_ident() will not be run if
* this parameter is zero (useful for specific drivers that must * this parameter is zero (useful for specific drivers that must
* handle this part of the process themselves, e.g docg4). * handle this part of the process themselves, e.g docg4).
@@ -6780,14 +6780,13 @@ static void nand_detach(struct nand_chip *chip)
* The flash ID is read and the mtd/chip structures are filled with the * The flash ID is read and the mtd/chip structures are filled with the
* appropriate values. * appropriate values.
*/ */
int nand_scan_with_ids(struct mtd_info *mtd, int maxchips, int nand_scan_with_ids(struct nand_chip *chip, int maxchips,
struct nand_flash_dev *ids) struct nand_flash_dev *ids)
{ {
struct nand_chip *chip = mtd_to_nand(mtd);
int ret; int ret;
if (maxchips) { if (maxchips) {
ret = nand_scan_ident(mtd, maxchips, ids); ret = nand_scan_ident(chip, maxchips, ids);
if (ret) if (ret)
return ret; return ret;
} }
@@ -6796,7 +6795,7 @@ int nand_scan_with_ids(struct mtd_info *mtd, int maxchips,
if (ret) if (ret)
goto cleanup_ident; goto cleanup_ident;
ret = nand_scan_tail(mtd); ret = nand_scan_tail(chip);
if (ret) if (ret)
goto detach_chip; goto detach_chip;
@@ -6847,12 +6846,12 @@ EXPORT_SYMBOL_GPL(nand_cleanup);
/** /**
* nand_release - [NAND Interface] Unregister the MTD device and free resources * nand_release - [NAND Interface] Unregister the MTD device and free resources
* held by the NAND device * held by the NAND device
* @mtd: MTD device structure * @chip: NAND chip object
*/ */
void nand_release(struct mtd_info *mtd) void nand_release(struct nand_chip *chip)
{ {
mtd_device_unregister(mtd); mtd_device_unregister(nand_to_mtd(chip));
nand_cleanup(mtd_to_nand(mtd)); nand_cleanup(chip);
} }
EXPORT_SYMBOL_GPL(nand_release); EXPORT_SYMBOL_GPL(nand_release);

View File

@@ -2319,7 +2319,7 @@ static int __init ns_init_module(void)
goto error; goto error;
chip->dummy_controller.ops = &ns_controller_ops; chip->dummy_controller.ops = &ns_controller_ops;
retval = nand_scan(nsmtd, 1); retval = nand_scan(chip, 1);
if (retval) { if (retval) {
NS_ERR("Could not scan NAND Simulator device\n"); NS_ERR("Could not scan NAND Simulator device\n");
goto error; goto error;
@@ -2364,7 +2364,7 @@ static int __init ns_init_module(void)
err_exit: err_exit:
free_nandsim(nand); free_nandsim(nand);
nand_release(nsmtd); nand_release(chip);
for (i = 0;i < ARRAY_SIZE(nand->partitions); ++i) for (i = 0;i < ARRAY_SIZE(nand->partitions); ++i)
kfree(nand->partitions[i].name); kfree(nand->partitions[i].name);
error: error:
@@ -2386,7 +2386,7 @@ static void __exit ns_cleanup_module(void)
int i; int i;
free_nandsim(ns); /* Free nandsim private resources */ free_nandsim(ns); /* Free nandsim private resources */
nand_release(nsmtd); /* Unregister driver */ nand_release(chip); /* Unregister driver */
for (i = 0;i < ARRAY_SIZE(ns->partitions); ++i) for (i = 0;i < ARRAY_SIZE(ns->partitions); ++i)
kfree(ns->partitions[i].name); kfree(ns->partitions[i].name);
kfree(mtd_to_nand(nsmtd)); /* Free other structures */ kfree(mtd_to_nand(nsmtd)); /* Free other structures */

View File

@@ -181,7 +181,7 @@ static int ndfc_chip_init(struct ndfc_controller *ndfc,
goto err; goto err;
} }
ret = nand_scan(mtd, 1); ret = nand_scan(chip, 1);
if (ret) if (ret)
goto err; goto err;
@@ -258,7 +258,7 @@ static int ndfc_remove(struct platform_device *ofdev)
struct ndfc_controller *ndfc = dev_get_drvdata(&ofdev->dev); struct ndfc_controller *ndfc = dev_get_drvdata(&ofdev->dev);
struct mtd_info *mtd = nand_to_mtd(&ndfc->chip); struct mtd_info *mtd = nand_to_mtd(&ndfc->chip);
nand_release(mtd); nand_release(&ndfc->chip);
kfree(mtd->name); kfree(mtd->name);
return 0; return 0;

Some files were not shown because too many files have changed in this diff Show More