This is the 4.19.130 stable release
-----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEZH8oZUiU471FcZm+ONu9yGCSaT4FAl70p5sACgkQONu9yGCS aT4nRg/9HAG5FdyJgH3OnUY5LtrjtlVpRsD+AgdUnnftpDprZ0m4dZsUuUSF4fJJ hzEr98/vX41yYqi2ne9mZcPnm4uOw21dEJK9X/2Z5+654i4qOwcv9FfVQSAdSpXC KEN0rRlZw0MdXwISmU9UbBTwSRqxi0qJNWfSR3rS9DZRiSPhhxElMwbdcYXjpgKR GZ7Wd/pDb0q371mR2Ar7+13PVxsvBzoEwYUngbeTr3EXtCiWiavBqBzABpJQYH9L xm5ZfFLwLMsnQSd/gdW7DZGq+6JdLgf6HaY4FOcpkoDo5gSSDc2RNTg8jbzu8dM0 o2Wge54q9aTbuu+sc6k9x5HAaTPdv7uFnORdBvNhYGZWfXv69SZjCFgqwjsmPiww +wg6D4uYWeh+faIz4tNBHk/bjIIMACnSJifsd131aXUed1cm4GeeQEQgimT8ea99 uOZrKPSTd+tbY3tZJrX2TyixYKgtaegdYTh3GWLx0AmYS8dOTHKfezUMMtFj4F7F XTbZ3IWyVTSynO/7LRLdEGwAZjA/vWCK3YQS95qVCY1ni7h2vZw4FQb2C9CHyHAq BIqiu2rOvxAsmIgh6GFcLLYN6cAa+lgIifmOMn2DPYrfF2gcrrGt6iOm1fc0gr5t QbNYK7OQ/1L70BgvnI1lDAl4qG6lhSKV28SB6Csbzrz5WYzbfnE= =iU+4 -----END PGP SIGNATURE----- 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:
commit
b96549a28b
242 changed files with 1436 additions and 885 deletions
|
@ -246,7 +246,7 @@ necessary information about the device.
|
|||
this->eccmode = NAND_ECC_SOFT;
|
||||
|
||||
/* Scan to find existence of the device */
|
||||
if (nand_scan (board_mtd, 1)) {
|
||||
if (nand_scan (this, 1)) {
|
||||
err = -ENXIO;
|
||||
goto out_ior;
|
||||
}
|
||||
|
@ -277,7 +277,7 @@ unregisters the partitions in the MTD layer.
|
|||
static void __exit board_cleanup (void)
|
||||
{
|
||||
/* Release resources, unregister device */
|
||||
nand_release (board_mtd);
|
||||
nand_release (mtd_to_nand(board_mtd));
|
||||
|
||||
/* unmap physical address */
|
||||
iounmap(baseaddr);
|
||||
|
|
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 4
|
||||
PATCHLEVEL = 19
|
||||
SUBLEVEL = 129
|
||||
SUBLEVEL = 130
|
||||
EXTRAVERSION =
|
||||
NAME = "People's Front"
|
||||
|
||||
|
|
|
@ -32,7 +32,7 @@
|
|||
|
||||
pwr_led {
|
||||
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";
|
||||
};
|
||||
};
|
||||
|
|
|
@ -3,6 +3,8 @@ menuconfig ARCH_INTEGRATOR
|
|||
depends on ARCH_MULTI_V4T || ARCH_MULTI_V5 || ARCH_MULTI_V6
|
||||
select ARM_AMBA
|
||||
select COMMON_CLK_VERSATILE
|
||||
select CMA
|
||||
select DMA_CMA
|
||||
select HAVE_TCM
|
||||
select ICST
|
||||
select MFD_SYSCON
|
||||
|
@ -34,14 +36,13 @@ config INTEGRATOR_IMPD1
|
|||
select ARM_VIC
|
||||
select GPIO_PL061
|
||||
select GPIOLIB
|
||||
select REGULATOR
|
||||
select REGULATOR_FIXED_VOLTAGE
|
||||
help
|
||||
The IM-PD1 is an add-on logic module for the Integrator which
|
||||
allows ARM(R) Ltd PrimeCells to be developed and evaluated.
|
||||
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
|
||||
bool "Integrator/CM7TDMI core module"
|
||||
depends on ARCH_INTEGRATOR_AP
|
||||
|
|
|
@ -223,21 +223,21 @@
|
|||
cpu_on = <0x84000003>;
|
||||
};
|
||||
|
||||
clk26m: oscillator@0 {
|
||||
clk26m: oscillator0 {
|
||||
compatible = "fixed-clock";
|
||||
#clock-cells = <0>;
|
||||
clock-frequency = <26000000>;
|
||||
clock-output-names = "clk26m";
|
||||
};
|
||||
|
||||
clk32k: oscillator@1 {
|
||||
clk32k: oscillator1 {
|
||||
compatible = "fixed-clock";
|
||||
#clock-cells = <0>;
|
||||
clock-frequency = <32000>;
|
||||
clock-output-names = "clk32k";
|
||||
};
|
||||
|
||||
cpum_ck: oscillator@2 {
|
||||
cpum_ck: oscillator2 {
|
||||
compatible = "fixed-clock";
|
||||
#clock-cells = <0>;
|
||||
clock-frequency = <0>;
|
||||
|
@ -253,19 +253,19 @@
|
|||
sustainable-power = <1500>; /* milliwatts */
|
||||
|
||||
trips {
|
||||
threshold: trip-point@0 {
|
||||
threshold: trip-point0 {
|
||||
temperature = <68000>;
|
||||
hysteresis = <2000>;
|
||||
type = "passive";
|
||||
};
|
||||
|
||||
target: trip-point@1 {
|
||||
target: trip-point1 {
|
||||
temperature = <85000>;
|
||||
hysteresis = <2000>;
|
||||
type = "passive";
|
||||
};
|
||||
|
||||
cpu_crit: cpu_crit@0 {
|
||||
cpu_crit: cpu_crit0 {
|
||||
temperature = <115000>;
|
||||
hysteresis = <2000>;
|
||||
type = "critical";
|
||||
|
@ -273,12 +273,12 @@
|
|||
};
|
||||
|
||||
cooling-maps {
|
||||
map@0 {
|
||||
map0 {
|
||||
trip = <&target>;
|
||||
cooling-device = <&cpu0 0 0>;
|
||||
contribution = <3072>;
|
||||
};
|
||||
map@1 {
|
||||
map1 {
|
||||
trip = <&target>;
|
||||
cooling-device = <&cpu2 0 0>;
|
||||
contribution = <1024>;
|
||||
|
@ -291,7 +291,7 @@
|
|||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
ranges;
|
||||
vpu_dma_reserved: vpu_dma_mem_region {
|
||||
vpu_dma_reserved: vpu_dma_mem_region@b7000000 {
|
||||
compatible = "shared-dma-pool";
|
||||
reg = <0 0xb7000000 0 0x500000>;
|
||||
alignment = <0x1000>;
|
||||
|
@ -343,7 +343,7 @@
|
|||
reg = <0 0x10005000 0 0x1000>;
|
||||
};
|
||||
|
||||
pio: pinctrl@10005000 {
|
||||
pio: pinctrl@1000b000 {
|
||||
compatible = "mediatek,mt8173-pinctrl";
|
||||
reg = <0 0x1000b000 0 0x1000>;
|
||||
mediatek,pctl-regmap = <&syscfg_pctl_a>;
|
||||
|
@ -541,7 +541,7 @@
|
|||
status = "disabled";
|
||||
};
|
||||
|
||||
gic: interrupt-controller@10220000 {
|
||||
gic: interrupt-controller@10221000 {
|
||||
compatible = "arm,gic-400";
|
||||
#interrupt-cells = <3>;
|
||||
interrupt-parent = <&gic>;
|
||||
|
|
|
@ -32,7 +32,7 @@
|
|||
|
||||
phy-reset-gpios = <&gpio TEGRA194_MAIN_GPIO(G, 5) GPIO_ACTIVE_LOW>;
|
||||
phy-handle = <&phy>;
|
||||
phy-mode = "rgmii";
|
||||
phy-mode = "rgmii-id";
|
||||
|
||||
mdio {
|
||||
#address-cells = <1>;
|
||||
|
|
|
@ -737,6 +737,27 @@ static u64 get_distance_from_watchpoint(unsigned long addr, u64 val,
|
|||
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,
|
||||
struct pt_regs *regs)
|
||||
{
|
||||
|
@ -746,7 +767,6 @@ static int watchpoint_handler(unsigned long addr, unsigned int esr,
|
|||
u64 val;
|
||||
struct perf_event *wp, **slots;
|
||||
struct debug_info *debug_info;
|
||||
struct arch_hw_breakpoint *info;
|
||||
struct arch_hw_breakpoint_ctrl ctrl;
|
||||
|
||||
slots = this_cpu_ptr(wp_on_reg);
|
||||
|
@ -784,25 +804,13 @@ static int watchpoint_handler(unsigned long addr, unsigned int esr,
|
|||
if (dist != 0)
|
||||
continue;
|
||||
|
||||
info = counter_arch_bp(wp);
|
||||
info->trigger = addr;
|
||||
perf_bp_event(wp, regs);
|
||||
|
||||
/* Do we need to handle the stepping? */
|
||||
if (is_default_overflow_handler(wp))
|
||||
step = 1;
|
||||
step = watchpoint_report(wp, addr, regs);
|
||||
}
|
||||
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? */
|
||||
if (is_default_overflow_handler(wp))
|
||||
step = 1;
|
||||
}
|
||||
/* No exact match found? */
|
||||
if (min_dist > 0 && min_dist != -1)
|
||||
step = watchpoint_report(slots[closest_match], addr, regs);
|
||||
|
||||
rcu_read_unlock();
|
||||
|
||||
if (!step)
|
||||
|
|
|
@ -216,8 +216,10 @@ static int __init mcf_pci_init(void)
|
|||
|
||||
/* Keep a virtual mapping to IO/config space active */
|
||||
iospace = (unsigned long) ioremap(PCI_IO_PA, PCI_IO_SIZE);
|
||||
if (iospace == 0)
|
||||
if (iospace == 0) {
|
||||
pci_free_host_bridge(bridge);
|
||||
return -ENODEV;
|
||||
}
|
||||
pr_info("Coldfire: PCI IO/config window mapped to 0x%x\n",
|
||||
(u32) iospace);
|
||||
|
||||
|
|
|
@ -1170,13 +1170,13 @@ ENTRY(__sys_clone)
|
|||
l.movhi r29,hi(sys_clone)
|
||||
l.ori r29,r29,lo(sys_clone)
|
||||
l.j _fork_save_extra_regs_and_call
|
||||
l.addi r7,r1,0
|
||||
l.nop
|
||||
|
||||
ENTRY(__sys_fork)
|
||||
l.movhi r29,hi(sys_fork)
|
||||
l.ori r29,r29,lo(sys_fork)
|
||||
l.j _fork_save_extra_regs_and_call
|
||||
l.addi r3,r1,0
|
||||
l.nop
|
||||
|
||||
ENTRY(sys_rt_sigreturn)
|
||||
l.jal _sys_rt_sigreturn
|
||||
|
|
|
@ -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 pgd_page_vaddr(pgd) __va(pgd_val(pgd) & ~PGD_MASKED_BITS)
|
||||
|
||||
#define pgd_index(address) (((address) >> (PGDIR_SHIFT)) & (PTRS_PER_PGD - 1))
|
||||
#define pud_index(address) (((address) >> (PUD_SHIFT)) & (PTRS_PER_PUD - 1))
|
||||
#define pmd_index(address) (((address) >> (PMD_SHIFT)) & (PTRS_PER_PMD - 1))
|
||||
#define pte_index(address) (((address) >> (PAGE_SHIFT)) & (PTRS_PER_PTE - 1))
|
||||
static inline unsigned long pgd_index(unsigned long address)
|
||||
{
|
||||
return (address >> PGDIR_SHIFT) & (PTRS_PER_PGD - 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
|
||||
|
|
|
@ -386,7 +386,6 @@ struct thread_struct {
|
|||
#else
|
||||
#define INIT_THREAD { \
|
||||
.ksp = INIT_SP, \
|
||||
.regs = (struct pt_regs *)INIT_SP - 1, /* XXX bogus, I think */ \
|
||||
.addr_limit = KERNEL_DS, \
|
||||
.fpexc_mode = 0, \
|
||||
.ppr = INIT_PPR, \
|
||||
|
|
|
@ -950,15 +950,8 @@ start_here_multiplatform:
|
|||
std r0,0(r4)
|
||||
#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 */
|
||||
LOAD_REG_ADDR(r3,init_thread_union)
|
||||
LOAD_REG_IMMEDIATE(r1,THREAD_SIZE)
|
||||
add r1,r3,r1
|
||||
li r0,0
|
||||
|
|
|
@ -116,11 +116,12 @@ void machine_kexec(struct kimage *image)
|
|||
|
||||
void __init reserve_crashkernel(void)
|
||||
{
|
||||
unsigned long long crash_size, crash_base;
|
||||
unsigned long long crash_size, crash_base, total_mem_sz;
|
||||
int ret;
|
||||
|
||||
total_mem_sz = memory_limit ? memory_limit : memblock_phys_mem_size();
|
||||
/* 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);
|
||||
if (ret == 0 && crash_size > 0) {
|
||||
crashk_res.start = crash_base;
|
||||
|
@ -179,6 +180,7 @@ void __init reserve_crashkernel(void)
|
|||
/* Crash kernel trumps memory limit */
|
||||
if (memory_limit && memory_limit <= crashk_res.end) {
|
||||
memory_limit = crashk_res.end + 1;
|
||||
total_mem_sz = memory_limit;
|
||||
printk("Adjusted memory limit for crashkernel, now 0x%llx\n",
|
||||
memory_limit);
|
||||
}
|
||||
|
@ -187,7 +189,7 @@ void __init reserve_crashkernel(void)
|
|||
"for crashkernel (System RAM: %ldMB)\n",
|
||||
(unsigned long)(crash_size >> 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) ||
|
||||
memblock_reserve(crashk_res.start, crash_size)) {
|
||||
|
|
|
@ -171,7 +171,13 @@ static struct kmem_cache *kvm_pmd_cache;
|
|||
|
||||
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)
|
||||
|
@ -187,7 +193,13 @@ static inline int pmd_is_leaf(pmd_t pmd)
|
|||
|
||||
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)
|
||||
|
|
|
@ -1413,16 +1413,6 @@ static void h_24x7_event_read(struct perf_event *event)
|
|||
h24x7hw = &get_cpu_var(hv_24x7_hw);
|
||||
h24x7hw->events[i] = event;
|
||||
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);
|
||||
|
|
|
@ -1242,7 +1242,7 @@ static void __init ppc460sx_pciex_check_link(struct ppc4xx_pciex_port *port)
|
|||
if (mbase == NULL) {
|
||||
printk(KERN_ERR "%pOF: Can't map internal config space !",
|
||||
port->node);
|
||||
goto done;
|
||||
return;
|
||||
}
|
||||
|
||||
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)
|
||||
port->link = 1;
|
||||
done:
|
||||
iounmap(mbase);
|
||||
|
||||
}
|
||||
|
||||
static struct ppc4xx_pciex_hwops ppc460sx_pcie_hwops __initdata = {
|
||||
|
|
|
@ -212,13 +212,14 @@ void ps3_mm_vas_destroy(void)
|
|||
{
|
||||
int result;
|
||||
|
||||
DBG("%s:%d: map.vas_id = %llu\n", __func__, __LINE__, map.vas_id);
|
||||
|
||||
if (map.vas_id) {
|
||||
result = lv1_select_virtual_address_space(0);
|
||||
BUG_ON(result);
|
||||
result = lv1_destruct_virtual_address_space(map.vas_id);
|
||||
BUG_ON(result);
|
||||
result += lv1_destruct_virtual_address_space(map.vas_id);
|
||||
|
||||
if (result) {
|
||||
lv1_panic(0);
|
||||
}
|
||||
|
||||
map.vas_id = 0;
|
||||
}
|
||||
}
|
||||
|
@ -316,19 +317,20 @@ static void ps3_mm_region_destroy(struct mem_region *r)
|
|||
int result;
|
||||
|
||||
if (!r->destroy) {
|
||||
pr_info("%s:%d: Not destroying high region: %llxh %llxh\n",
|
||||
__func__, __LINE__, r->base, r->size);
|
||||
return;
|
||||
}
|
||||
|
||||
DBG("%s:%d: r->base = %llxh\n", __func__, __LINE__, r->base);
|
||||
|
||||
if (r->base) {
|
||||
result = lv1_release_memory(r->base);
|
||||
BUG_ON(result);
|
||||
|
||||
if (result) {
|
||||
lv1_panic(0);
|
||||
}
|
||||
|
||||
r->size = r->base = r->offset = 0;
|
||||
map.total = map.rm.size;
|
||||
}
|
||||
|
||||
ps3_mm_set_repository_highmem(NULL);
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
* 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) \
|
||||
((((A) >= 0x7000) && ((A) < 0x7ff0)) || \
|
||||
(((A) >= rtas.base) && ((A) < (rtas.base + rtas.size - 16))))
|
||||
((((A) >= 0x7000) && ((A) <= 0x8000 - 16)) || \
|
||||
(((A) >= rtas.base) && ((A) <= (rtas.base + rtas.size - 16))))
|
||||
|
||||
static inline struct rtas_error_log *fwnmi_get_errlog(void)
|
||||
{
|
||||
|
|
|
@ -38,7 +38,17 @@ static inline void syscall_rollback(struct task_struct *task,
|
|||
static inline long syscall_get_error(struct task_struct *task,
|
||||
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,
|
||||
|
|
|
@ -87,7 +87,7 @@ $(obj)/vmlinux.bin: $(obj)/compressed/vmlinux FORCE
|
|||
|
||||
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 $@
|
||||
cmd_zoffset = $(NM) $< | sed -n $(sed-zoffset) > $@
|
||||
|
|
|
@ -2024,7 +2024,7 @@ void __init init_apic_mappings(void)
|
|||
unsigned int new_apicid;
|
||||
|
||||
if (apic_validate_deadline_timer())
|
||||
pr_debug("TSC deadline timer available\n");
|
||||
pr_info("TSC deadline timer available\n");
|
||||
|
||||
if (x2apic_mode) {
|
||||
boot_cpu_physical_apicid = read_apic_id();
|
||||
|
|
|
@ -320,7 +320,11 @@ void __init idt_setup_apic_and_irq_gates(void)
|
|||
|
||||
#ifdef CONFIG_X86_LOCAL_APIC
|
||||
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);
|
||||
set_intr_gate(i, entry);
|
||||
}
|
||||
|
|
|
@ -765,16 +765,11 @@ asm(
|
|||
NOKPROBE_SYMBOL(kretprobe_trampoline);
|
||||
STACK_FRAME_NON_STANDARD(kretprobe_trampoline);
|
||||
|
||||
static struct kprobe kretprobe_kprobe = {
|
||||
.addr = (void *)kretprobe_trampoline,
|
||||
};
|
||||
|
||||
/*
|
||||
* Called from kretprobe_trampoline
|
||||
*/
|
||||
__visible __used void *trampoline_handler(struct pt_regs *regs)
|
||||
{
|
||||
struct kprobe_ctlblk *kcb;
|
||||
struct kretprobe_instance *ri = NULL;
|
||||
struct hlist_head *head, empty_rp;
|
||||
struct hlist_node *tmp;
|
||||
|
@ -784,16 +779,12 @@ __visible __used void *trampoline_handler(struct pt_regs *regs)
|
|||
void *frame_pointer;
|
||||
bool skipped = false;
|
||||
|
||||
preempt_disable();
|
||||
|
||||
/*
|
||||
* Set a dummy kprobe for avoiding kretprobe recursion.
|
||||
* Since kretprobe never run in kprobe handler, kprobe must not
|
||||
* be running at this point.
|
||||
*/
|
||||
kcb = get_kprobe_ctlblk();
|
||||
__this_cpu_write(current_kprobe, &kretprobe_kprobe);
|
||||
kcb->kprobe_status = KPROBE_HIT_ACTIVE;
|
||||
kprobe_busy_begin();
|
||||
|
||||
INIT_HLIST_HEAD(&empty_rp);
|
||||
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);
|
||||
ri->ret_addr = correct_ret_addr;
|
||||
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);
|
||||
|
@ -888,8 +879,7 @@ __visible __used void *trampoline_handler(struct pt_regs *regs)
|
|||
|
||||
kretprobe_hash_unlock(current, &flags);
|
||||
|
||||
__this_cpu_write(current_kprobe, NULL);
|
||||
preempt_enable();
|
||||
kprobe_busy_end();
|
||||
|
||||
hlist_for_each_entry_safe(ri, tmp, &empty_rp, hlist) {
|
||||
hlist_del(&ri->hlist);
|
||||
|
|
|
@ -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;
|
||||
|
||||
/*
|
||||
* 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 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);
|
||||
|
||||
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)
|
||||
{
|
||||
u8 low_phys_bits;
|
||||
|
@ -477,6 +497,8 @@ static void kvm_mmu_reset_all_pte_masks(void)
|
|||
shadow_present_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
|
||||
* 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;
|
||||
__reset_rsvds_bits_mask(vcpu, shadow_zero_check,
|
||||
boot_cpu_data.x86_phys_bits,
|
||||
shadow_phys_bits,
|
||||
context->shadow_root_level, uses_nx,
|
||||
guest_cpuid_has(vcpu, X86_FEATURE_GBPAGES),
|
||||
is_pse(vcpu), true);
|
||||
|
@ -4581,13 +4603,13 @@ reset_tdp_shadow_zero_bits_mask(struct kvm_vcpu *vcpu,
|
|||
|
||||
if (boot_cpu_is_amd())
|
||||
__reset_rsvds_bits_mask(vcpu, shadow_zero_check,
|
||||
boot_cpu_data.x86_phys_bits,
|
||||
shadow_phys_bits,
|
||||
context->shadow_root_level, false,
|
||||
boot_cpu_has(X86_FEATURE_GBPAGES),
|
||||
true, true);
|
||||
else
|
||||
__reset_rsvds_bits_mask_ept(shadow_zero_check,
|
||||
boot_cpu_data.x86_phys_bits,
|
||||
shadow_phys_bits,
|
||||
false);
|
||||
|
||||
if (!shadow_me_mask)
|
||||
|
@ -4608,7 +4630,7 @@ reset_ept_shadow_zero_bits_mask(struct kvm_vcpu *vcpu,
|
|||
struct kvm_mmu *context, bool execonly)
|
||||
{
|
||||
__reset_rsvds_bits_mask_ept(&context->shadow_zero_check,
|
||||
boot_cpu_data.x86_phys_bits, execonly);
|
||||
shadow_phys_bits, execonly);
|
||||
}
|
||||
|
||||
#define BYTE_MASK(access) \
|
||||
|
@ -6050,6 +6072,25 @@ static int set_nx_huge_pages(const char *val, const struct kernel_param *kp)
|
|||
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 ret = -ENOMEM;
|
||||
|
@ -6059,6 +6100,8 @@ int kvm_mmu_module_init(void)
|
|||
|
||||
kvm_mmu_reset_all_pte_masks();
|
||||
|
||||
kvm_set_mmio_spte_mask();
|
||||
|
||||
pte_list_desc_cache = kmem_cache_create("pte_list_desc",
|
||||
sizeof(struct pte_list_desc),
|
||||
0, SLAB_ACCOUNT, NULL);
|
||||
|
|
|
@ -6775,35 +6775,6 @@ static struct perf_guest_info_callbacks kvm_guest_cbs = {
|
|||
.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
|
||||
static void pvclock_gtod_update_fn(struct work_struct *work)
|
||||
{
|
||||
|
@ -6881,8 +6852,6 @@ int kvm_arch_init(void *opaque)
|
|||
if (r)
|
||||
goto out_free_percpu;
|
||||
|
||||
kvm_set_mmio_spte_mask();
|
||||
|
||||
kvm_x86_ops = ops;
|
||||
|
||||
kvm_mmu_set_mask_ptes(PT_USER_MASK, PT_ACCESSED_MASK,
|
||||
|
|
|
@ -15,7 +15,10 @@ $(obj)/sha256.o: $(srctree)/lib/sha256.c FORCE
|
|||
LDFLAGS_purgatory.ro := -e purgatory_start -r --no-undefined -nostdlib -z nodefaultlib
|
||||
targets += purgatory.ro
|
||||
|
||||
# Sanitizer, etc. runtimes are unavailable and cannot be linked here.
|
||||
GCOV_PROFILE := n
|
||||
KASAN_SANITIZE := n
|
||||
UBSAN_SANITIZE := n
|
||||
KCOV_INSTRUMENT := n
|
||||
|
||||
# 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 := -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
|
||||
# in turn leaves some undefined symbols like __fentry__ in purgatory and not
|
||||
|
|
|
@ -193,8 +193,6 @@ static int cryptomgr_schedule_probe(struct crypto_larval *larval)
|
|||
if (IS_ERR(thread))
|
||||
goto err_put_larval;
|
||||
|
||||
wait_for_completion_interruptible(&larval->completion);
|
||||
|
||||
return NOTIFY_STOP;
|
||||
|
||||
err_put_larval:
|
||||
|
|
|
@ -78,14 +78,10 @@ static int _skcipher_recvmsg(struct socket *sock, struct msghdr *msg,
|
|||
return PTR_ERR(areq);
|
||||
|
||||
/* 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)
|
||||
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
|
||||
* full block size buffers.
|
||||
|
|
|
@ -57,7 +57,6 @@
|
|||
#include <linux/workqueue.h>
|
||||
#include <linux/scatterlist.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/async.h>
|
||||
#include <linux/log2.h>
|
||||
#include <linux/slab.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 */
|
||||
for (i = 0; i < host->n_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;
|
||||
|
@ -6750,11 +6749,11 @@ void ata_host_detach(struct ata_host *host)
|
|||
{
|
||||
int i;
|
||||
|
||||
/* Ensure ata_port probe has completed */
|
||||
async_synchronize_full();
|
||||
|
||||
for (i = 0; i < host->n_ports; i++)
|
||||
for (i = 0; i < host->n_ports; i++) {
|
||||
/* Ensure ata_port probe has completed */
|
||||
async_synchronize_cookie(host->ports[i]->cookie + 1);
|
||||
ata_port_detach(host->ports[i]);
|
||||
}
|
||||
|
||||
/* the host is dead now, dissociate ACPI */
|
||||
ata_acpi_dissociate(host);
|
||||
|
|
|
@ -700,6 +700,8 @@ int __init_or_module __platform_driver_probe(struct platform_driver *drv,
|
|||
/* temporary section violation during probe() */
|
||||
drv->probe = probe;
|
||||
retval = code = __platform_driver_register(drv, module);
|
||||
if (retval)
|
||||
return retval;
|
||||
|
||||
/*
|
||||
* Fixup that section violation, being paranoid about code scanning
|
||||
|
|
|
@ -466,7 +466,6 @@ static int ps3disk_probe(struct ps3_system_bus_device *_dev)
|
|||
queue->queuedata = dev;
|
||||
|
||||
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_logical_block_size(queue, dev->blk_size);
|
||||
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
#include <linux/workqueue.h>
|
||||
#include <linux/uuid.h>
|
||||
#include <linux/nospec.h>
|
||||
#include <linux/vmalloc.h>
|
||||
|
||||
#define PFX "IPMI message handler: "
|
||||
|
||||
|
@ -1089,7 +1090,7 @@ static void free_user_work(struct work_struct *work)
|
|||
remove_work);
|
||||
|
||||
cleanup_srcu_struct(&user->release_barrier);
|
||||
kfree(user);
|
||||
vfree(user);
|
||||
}
|
||||
|
||||
int ipmi_create_user(unsigned int if_num,
|
||||
|
@ -1121,7 +1122,7 @@ int ipmi_create_user(unsigned int if_num,
|
|||
if (rv)
|
||||
return rv;
|
||||
|
||||
new_user = kmalloc(sizeof(*new_user), GFP_KERNEL);
|
||||
new_user = vzalloc(sizeof(*new_user));
|
||||
if (!new_user)
|
||||
return -ENOMEM;
|
||||
|
||||
|
@ -1170,7 +1171,7 @@ int ipmi_create_user(unsigned int if_num,
|
|||
|
||||
out_kfree:
|
||||
srcu_read_unlock(&ipmi_interfaces_srcu, index);
|
||||
kfree(new_user);
|
||||
vfree(new_user);
|
||||
return rv;
|
||||
}
|
||||
EXPORT_SYMBOL(ipmi_create_user);
|
||||
|
|
|
@ -1447,13 +1447,13 @@ static struct clk_hw *bcm2835_register_clock(struct bcm2835_cprman *cprman,
|
|||
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)
|
||||
{
|
||||
return clk_register_gate(cprman->dev, data->name, data->parent,
|
||||
CLK_IGNORE_UNUSED | CLK_SET_RATE_GATE,
|
||||
cprman->regs + data->ctl_reg,
|
||||
CM_GATE_BIT, 0, &cprman->regs_lock);
|
||||
return clk_hw_register_gate(cprman->dev, data->name, data->parent,
|
||||
CLK_IGNORE_UNUSED | CLK_SET_RATE_GATE,
|
||||
cprman->regs + data->ctl_reg,
|
||||
CM_GATE_BIT, 0, &cprman->regs_lock);
|
||||
}
|
||||
|
||||
typedef struct clk_hw *(*bcm2835_clk_register)(struct bcm2835_cprman *cprman,
|
||||
|
|
|
@ -268,7 +268,7 @@ static struct clk_pll gpll0 = {
|
|||
.l_reg = 0x21004,
|
||||
.m_reg = 0x21008,
|
||||
.n_reg = 0x2100c,
|
||||
.config_reg = 0x21014,
|
||||
.config_reg = 0x21010,
|
||||
.mode_reg = 0x21000,
|
||||
.status_reg = 0x2101c,
|
||||
.status_bit = 17,
|
||||
|
@ -295,7 +295,7 @@ static struct clk_pll gpll1 = {
|
|||
.l_reg = 0x20004,
|
||||
.m_reg = 0x20008,
|
||||
.n_reg = 0x2000c,
|
||||
.config_reg = 0x20014,
|
||||
.config_reg = 0x20010,
|
||||
.mode_reg = 0x20000,
|
||||
.status_reg = 0x2001c,
|
||||
.status_bit = 17,
|
||||
|
@ -322,7 +322,7 @@ static struct clk_pll gpll2 = {
|
|||
.l_reg = 0x4a004,
|
||||
.m_reg = 0x4a008,
|
||||
.n_reg = 0x4a00c,
|
||||
.config_reg = 0x4a014,
|
||||
.config_reg = 0x4a010,
|
||||
.mode_reg = 0x4a000,
|
||||
.status_reg = 0x4a01c,
|
||||
.status_bit = 17,
|
||||
|
@ -349,7 +349,7 @@ static struct clk_pll bimc_pll = {
|
|||
.l_reg = 0x23004,
|
||||
.m_reg = 0x23008,
|
||||
.n_reg = 0x2300c,
|
||||
.config_reg = 0x23014,
|
||||
.config_reg = 0x23010,
|
||||
.mode_reg = 0x23000,
|
||||
.status_reg = 0x2301c,
|
||||
.status_bit = 17,
|
||||
|
|
|
@ -597,7 +597,7 @@ static const struct samsung_div_clock exynos5800_div_clks[] __initconst = {
|
|||
|
||||
static const struct samsung_gate_clock exynos5800_gate_clks[] __initconst = {
|
||||
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_BUS_TOP, 27, CLK_IS_CRITICAL, 0),
|
||||
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_BUS_TOP, 4, CLK_IGNORE_UNUSED, 0),
|
||||
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_BUS_TOP, 6, CLK_IS_CRITICAL, 0),
|
||||
GATE(0, "aclk333_432_gscl", "mout_user_aclk333_432_gscl",
|
||||
GATE_BUS_TOP, 7, CLK_IGNORE_UNUSED, 0),
|
||||
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_BUS_TOP, 9, CLK_IGNORE_UNUSED, 0),
|
||||
GATE(0, "aclk66_psgen", "mout_user_aclk66_psgen",
|
||||
GATE_BUS_TOP, 10, CLK_IGNORE_UNUSED, 0),
|
||||
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_BUS_TOP, 14, CLK_IGNORE_UNUSED, 0),
|
||||
GATE(CLK_ACLK333, "aclk333", "mout_user_aclk333",
|
||||
GATE_BUS_TOP, 15, CLK_IS_CRITICAL, 0),
|
||||
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_BUS_TOP, 17, CLK_IS_CRITICAL, 0),
|
||||
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(CLK_SMMU_FIMCL1, "smmu_fimcl1", "dout_gscl_blk_333",
|
||||
GATE_IP_GSCL1, 4, 0, 0),
|
||||
GATE(CLK_GSCL_WA, "gscl_wa", "sclk_gscl_wa", GATE_IP_GSCL1, 12, 0, 0),
|
||||
GATE(CLK_GSCL_WB, "gscl_wb", "sclk_gscl_wb", GATE_IP_GSCL1, 13, 0, 0),
|
||||
GATE(CLK_GSCL_WA, "gscl_wa", "sclk_gscl_wa", GATE_IP_GSCL1, 12,
|
||||
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_IP_GSCL1, 16, 0, 0),
|
||||
GATE(CLK_FIMC_LITE3, "fimc_lite3", "aclk333_432_gscl",
|
||||
|
|
|
@ -1680,7 +1680,8 @@ static const struct samsung_gate_clock peric_gate_clks[] __initconst = {
|
|||
GATE(CLK_SCLK_PCM1, "sclk_pcm1", "sclk_pcm1_peric",
|
||||
ENABLE_SCLK_PERIC, 7, CLK_SET_RATE_PARENT, 0),
|
||||
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,
|
||||
5, CLK_SET_RATE_PARENT, 0),
|
||||
GATE(CLK_SCLK_SPI1, "sclk_spi1", "sclk_spi1_peric", ENABLE_SCLK_PERIC,
|
||||
|
|
|
@ -105,7 +105,7 @@ static unsigned long _sprd_pll_recalc_rate(const struct sprd_pll *pll,
|
|||
|
||||
cfg = kcalloc(regs_num, sizeof(*cfg), GFP_KERNEL);
|
||||
if (!cfg)
|
||||
return -ENOMEM;
|
||||
return parent_rate;
|
||||
|
||||
for (i = 0; i < regs_num; i++)
|
||||
cfg[i] = sprd_pll_read(pll, i);
|
||||
|
|
|
@ -373,6 +373,7 @@ static void __init st_of_flexgen_setup(struct device_node *np)
|
|||
break;
|
||||
}
|
||||
|
||||
flex_flags &= ~CLK_IS_CRITICAL;
|
||||
of_clk_detect_critical(np, i, &flex_flags);
|
||||
|
||||
/*
|
||||
|
|
|
@ -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
|
||||
* 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);
|
||||
|
||||
if (round_freq_6 > round_freq_16)
|
||||
|
|
|
@ -196,6 +196,7 @@ static void __init _register_composite(void *user,
|
|||
if (!cclk->comp_clks[i])
|
||||
continue;
|
||||
list_del(&cclk->comp_clks[i]->link);
|
||||
kfree(cclk->comp_clks[i]->parent_names);
|
||||
kfree(cclk->comp_clks[i]);
|
||||
}
|
||||
|
||||
|
|
|
@ -168,8 +168,6 @@ struct omap_sham_hmac_ctx {
|
|||
};
|
||||
|
||||
struct omap_sham_ctx {
|
||||
struct omap_sham_dev *dd;
|
||||
|
||||
unsigned long flags;
|
||||
|
||||
/* fallback stuff */
|
||||
|
@ -921,27 +919,35 @@ static int omap_sham_update_dma_stop(struct omap_sham_dev *dd)
|
|||
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)
|
||||
{
|
||||
struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
|
||||
struct omap_sham_ctx *tctx = crypto_ahash_ctx(tfm);
|
||||
struct omap_sham_reqctx *ctx = ahash_request_ctx(req);
|
||||
struct omap_sham_dev *dd = NULL, *tmp;
|
||||
struct omap_sham_dev *dd;
|
||||
int bs = 0;
|
||||
|
||||
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);
|
||||
ctx->dd = NULL;
|
||||
|
||||
ctx->dd = dd;
|
||||
dd = omap_sham_find_dev(ctx);
|
||||
if (!dd)
|
||||
return -ENODEV;
|
||||
|
||||
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)
|
||||
{
|
||||
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 = tctx->dd;
|
||||
struct omap_sham_dev *dd = ctx->dd;
|
||||
|
||||
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)
|
||||
{
|
||||
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)
|
||||
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;
|
||||
int bs = crypto_shash_blocksize(bctx->shash);
|
||||
int ds = crypto_shash_digestsize(bctx->shash);
|
||||
struct omap_sham_dev *dd = NULL, *tmp;
|
||||
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);
|
||||
if (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);
|
||||
|
||||
if (!test_bit(FLAGS_AUTO_XOR, &dd->flags)) {
|
||||
if (!test_bit(FLAGS_AUTO_XOR, &sham.flags)) {
|
||||
memcpy(bctx->opad, bctx->ipad, bs);
|
||||
|
||||
for (i = 0; i < bs; i++) {
|
||||
|
@ -2142,6 +2134,7 @@ static int omap_sham_probe(struct platform_device *pdev)
|
|||
}
|
||||
|
||||
dd->flags |= dd->pdata->flags;
|
||||
sham.flags |= dd->pdata->flags;
|
||||
|
||||
pm_runtime_use_autosuspend(dev);
|
||||
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);
|
||||
|
||||
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++) {
|
||||
struct ahash_alg *alg;
|
||||
|
||||
|
@ -2220,9 +2216,11 @@ static int omap_sham_remove(struct platform_device *pdev)
|
|||
list_del(&dd->list);
|
||||
spin_unlock(&sham.lock);
|
||||
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(
|
||||
&dd->pdata->algs_info[i].algs_list[j]);
|
||||
dd->pdata->algs_info[i].registered--;
|
||||
}
|
||||
tasklet_kill(&dd->done_task);
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
|
||||
|
|
|
@ -128,7 +128,7 @@ static int adc_jack_probe(struct platform_device *pdev)
|
|||
for (i = 0; data->adc_conditions[i].id != EXTCON_NONE; 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))
|
||||
return PTR_ERR(data->chan);
|
||||
|
||||
|
@ -170,7 +170,6 @@ static int adc_jack_remove(struct platform_device *pdev)
|
|||
|
||||
free_irq(data->irq, data);
|
||||
cancel_work_sync(&data->handler.work);
|
||||
iio_channel_release(data->chan);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -18,7 +18,6 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/cpumask.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/dma-direct.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/module.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;
|
||||
phys_addr_t mem_to_map_phys;
|
||||
phys_addr_t dest_phys;
|
||||
phys_addr_t ptr_phys;
|
||||
dma_addr_t ptr_dma;
|
||||
dma_addr_t ptr_phys;
|
||||
size_t mem_to_map_sz;
|
||||
size_t dest_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) +
|
||||
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)
|
||||
return -ENOMEM;
|
||||
ptr_phys = dma_to_phys(__scm->dev, ptr_dma);
|
||||
|
||||
/* Fill source vmid detail */
|
||||
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,
|
||||
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) {
|
||||
dev_err(__scm->dev,
|
||||
"Assign memory protection call failed %d.\n", ret);
|
||||
|
|
|
@ -106,10 +106,10 @@ static int afu_dma_pin_pages(struct dfl_feature_platform_data *pdata,
|
|||
region->pages);
|
||||
if (pinned < 0) {
|
||||
ret = pinned;
|
||||
goto put_pages;
|
||||
goto free_pages;
|
||||
} else if (pinned != npages) {
|
||||
ret = -EFAULT;
|
||||
goto free_pages;
|
||||
goto put_pages;
|
||||
}
|
||||
|
||||
dev_dbg(dev, "%d pages pinned\n", pinned);
|
||||
|
|
|
@ -51,7 +51,9 @@
|
|||
#define GPIO_EXT_PORTC 0x58
|
||||
#define GPIO_EXT_PORTD 0x5c
|
||||
|
||||
#define DWAPB_DRIVER_NAME "gpio-dwapb"
|
||||
#define DWAPB_MAX_PORTS 4
|
||||
|
||||
#define GPIO_EXT_PORT_STRIDE 0x04 /* register stride 32 bits */
|
||||
#define GPIO_SWPORT_DR_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;
|
||||
|
||||
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_GC_INIT_NESTED_LOCK);
|
||||
if (err) {
|
||||
|
@ -457,7 +459,7 @@ static void dwapb_configure_irqs(struct dwapb_gpio *gpio,
|
|||
*/
|
||||
err = devm_request_irq(gpio->dev, pp->irq[0],
|
||||
dwapb_irq_handler_mfd,
|
||||
IRQF_SHARED, "gpio-dwapb-mfd", gpio);
|
||||
IRQF_SHARED, DWAPB_DRIVER_NAME, gpio);
|
||||
if (err) {
|
||||
dev_err(gpio->dev, "error requesting IRQ\n");
|
||||
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);
|
||||
|
||||
err = gpiochip_add_data(&port->gc, port);
|
||||
if (err)
|
||||
if (err) {
|
||||
dev_err(gpio->dev, "failed to register gpiochip for port%d\n",
|
||||
port->idx);
|
||||
else
|
||||
port->is_registered = true;
|
||||
return err;
|
||||
}
|
||||
|
||||
/* 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)
|
||||
{
|
||||
unsigned int m;
|
||||
|
||||
for (m = 0; m < gpio->nr_ports; ++m)
|
||||
if (gpio->ports[m].is_registered)
|
||||
gpiochip_remove(&gpio->ports[m].gc);
|
||||
for (m = 0; m < gpio->nr_ports; ++m) {
|
||||
struct dwapb_gpio_port *port = &gpio->ports[m];
|
||||
|
||||
if (!port->is_registered)
|
||||
continue;
|
||||
|
||||
acpi_gpiochip_free_interrupts(&port->gc);
|
||||
gpiochip_remove(&port->gc);
|
||||
}
|
||||
}
|
||||
|
||||
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 = {
|
||||
.driver = {
|
||||
.name = "gpio-dwapb",
|
||||
.name = DWAPB_DRIVER_NAME,
|
||||
.pm = &dwapb_gpio_pm_ops,
|
||||
.of_match_table = of_match_ptr(dwapb_of_match),
|
||||
.acpi_match_table = ACPI_PTR(dwapb_acpi_match),
|
||||
|
@ -856,3 +865,4 @@ module_platform_driver(dwapb_gpio_driver);
|
|||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Jamie Iles");
|
||||
MODULE_DESCRIPTION("Synopsys DesignWare APB GPIO driver");
|
||||
MODULE_ALIAS("platform:" DWAPB_DRIVER_NAME);
|
||||
|
|
|
@ -238,7 +238,7 @@ static void ci_initialize_power_tune_defaults(struct pp_hwmgr *hwmgr)
|
|||
|
||||
switch (dev_id) {
|
||||
case 0x67BA:
|
||||
case 0x66B1:
|
||||
case 0x67B1:
|
||||
smu_data->power_tune_defaults = &defaults_hawaii_pro;
|
||||
break;
|
||||
case 0x67B8:
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
#include <linux/i2c.h>
|
||||
#include <drm/drm_dp_mst_helper.h>
|
||||
#include <drm/drmP.h>
|
||||
#include <linux/iopoll.h>
|
||||
|
||||
#include <drm/drm_fixed.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;
|
||||
}
|
||||
|
||||
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.
|
||||
|
@ -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)
|
||||
{
|
||||
u8 status;
|
||||
int ret;
|
||||
int count = 0;
|
||||
/*
|
||||
* There doesn't seem to be any recommended retry count or timeout in
|
||||
* 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 = drm_dp_dpcd_readb(mgr->aux, DP_PAYLOAD_TABLE_UPDATE_STATUS, &status);
|
||||
|
||||
if (ret < 0) {
|
||||
DRM_DEBUG_KMS("failed to read payload table status %d\n", ret);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if (status & DP_PAYLOAD_ACT_HANDLED)
|
||||
break;
|
||||
count++;
|
||||
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;
|
||||
ret = readx_poll_timeout(do_get_act_status, mgr->aux, status,
|
||||
status & DP_PAYLOAD_ACT_HANDLED || status < 0,
|
||||
200, timeout_ms * USEC_PER_MSEC);
|
||||
if (ret < 0 && status >= 0) {
|
||||
DRM_DEBUG_KMS("Failed to get ACT after %dms, last status: %02x\n",
|
||||
timeout_ms, status);
|
||||
return -EINVAL;
|
||||
} else if (status < 0) {
|
||||
DRM_DEBUG_KMS("Failed to read payload table status: %d\n",
|
||||
status);
|
||||
return status;
|
||||
}
|
||||
|
||||
return 0;
|
||||
fail:
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(drm_dp_check_act_status);
|
||||
|
||||
|
|
|
@ -84,7 +84,7 @@ int drm_i2c_encoder_init(struct drm_device *dev,
|
|||
|
||||
err = encoder_drv->encoder_init(client, dev, encoder);
|
||||
if (err)
|
||||
goto fail_unregister;
|
||||
goto fail_module_put;
|
||||
|
||||
if (info->platform_data)
|
||||
encoder->slave_funcs->set_config(&encoder->base,
|
||||
|
@ -92,9 +92,10 @@ int drm_i2c_encoder_init(struct drm_device *dev,
|
|||
|
||||
return 0;
|
||||
|
||||
fail_module_put:
|
||||
module_put(module);
|
||||
fail_unregister:
|
||||
i2c_unregister_device(client);
|
||||
module_put(module);
|
||||
fail:
|
||||
return err;
|
||||
}
|
||||
|
|
|
@ -570,6 +570,9 @@ struct drm_i915_reg_descriptor {
|
|||
#define REG32(_reg, ...) \
|
||||
{ .addr = (_reg), __VA_ARGS__ }
|
||||
|
||||
#define REG32_IDX(_reg, idx) \
|
||||
{ .addr = _reg(idx) }
|
||||
|
||||
/*
|
||||
* 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),
|
||||
REG32(BCS_SWCTRL),
|
||||
REG64_IDX(RING_TIMESTAMP, BLT_RING_BASE),
|
||||
REG32_IDX(RING_CTX_TIMESTAMP, BLT_RING_BASE),
|
||||
REG64_IDX(BCS_GPR, 0),
|
||||
REG64_IDX(BCS_GPR, 1),
|
||||
REG64_IDX(BCS_GPR, 2),
|
||||
|
|
|
@ -3821,6 +3821,7 @@ static void gen11_hpd_irq_setup(struct drm_i915_private *dev_priv)
|
|||
|
||||
val = I915_READ(GEN11_DE_HPD_IMR);
|
||||
val &= ~hotplug_irqs;
|
||||
val |= ~enabled_irqs & hotplug_irqs;
|
||||
I915_WRITE(GEN11_DE_HPD_IMR, val);
|
||||
POSTING_READ(GEN11_DE_HPD_IMR);
|
||||
|
||||
|
|
|
@ -1021,7 +1021,8 @@ static int mdp5_init(struct platform_device *pdev, struct drm_device *dev)
|
|||
|
||||
return 0;
|
||||
fail:
|
||||
mdp5_destroy(pdev);
|
||||
if (mdp5_kms)
|
||||
mdp5_destroy(pdev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -181,7 +181,7 @@ int qxl_device_init(struct qxl_device *qdev,
|
|||
&(qdev->ram_header->cursor_ring_hdr),
|
||||
sizeof(struct qxl_command),
|
||||
QXL_CURSOR_RING_SIZE,
|
||||
qdev->io_base + QXL_IO_NOTIFY_CMD,
|
||||
qdev->io_base + QXL_IO_NOTIFY_CURSOR,
|
||||
false,
|
||||
&qdev->cursor_event);
|
||||
|
||||
|
|
|
@ -152,7 +152,7 @@
|
|||
#define SUN4I_HDMI_DDC_CMD_IMPLICIT_WRITE 3
|
||||
|
||||
#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_LINE_CTRL_REG 0x540
|
||||
|
|
|
@ -37,7 +37,7 @@ static unsigned long sun4i_ddc_calc_divider(unsigned long rate,
|
|||
unsigned long best_rate = 0;
|
||||
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++) {
|
||||
unsigned long tmp_rate;
|
||||
|
||||
|
|
|
@ -1124,6 +1124,9 @@
|
|||
#define USB_DEVICE_ID_TPV_OPTICAL_TOUCHSCREEN_8882 0x8882
|
||||
#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_DEVICE_ID_TURBOX_KEYBOARD 0x0201
|
||||
#define USB_DEVICE_ID_ASUS_MD_5110 0x5110
|
||||
|
|
|
@ -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_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_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_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 },
|
||||
|
|
|
@ -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 &&
|
||||
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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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",
|
||||
readl(_IBMR(i2c)), readl(_IDBR(i2c)), readl(_ICR(i2c)),
|
||||
readl(_ISR(i2c)));
|
||||
dev_dbg(dev, "log: ");
|
||||
dev_err(dev, "log:");
|
||||
for (i = 0; i < i2c->irqlogidx; i++)
|
||||
pr_debug("[%08x:%08x] ", i2c->isrlog[i], i2c->icrlog[i]);
|
||||
|
||||
pr_debug("\n");
|
||||
pr_cont(" [%03x:%05x]", i2c->isrlog[i], i2c->icrlog[i]);
|
||||
pr_cont("\n");
|
||||
}
|
||||
|
||||
#else /* ifdef DEBUG */
|
||||
|
@ -709,11 +708,9 @@ static inline void i2c_pxa_stop_message(struct pxa_i2c *i2c)
|
|||
{
|
||||
u32 icr;
|
||||
|
||||
/*
|
||||
* Clear the STOP and ACK flags
|
||||
*/
|
||||
/* Clear the START, STOP, ACK, TB and MA flags */
|
||||
icr = readl(_ICR(i2c));
|
||||
icr &= ~(ICR_STOP | ICR_ACKNAK);
|
||||
icr &= ~(ICR_START | ICR_STOP | ICR_ACKNAK | ICR_TB | ICR_MA);
|
||||
writel(icr, _ICR(i2c));
|
||||
}
|
||||
|
||||
|
|
|
@ -261,6 +261,8 @@ static u32 bmp280_compensate_humidity(struct bmp280_data *data,
|
|||
+ (s32)2097152) * calib->H2 + 8192) >> 14);
|
||||
var -= ((((var >> 15) * (var >> 15)) >> 7) * (s32)calib->H1) >> 4;
|
||||
|
||||
var = clamp_val(var, 0, 419430400);
|
||||
|
||||
return var >> 12;
|
||||
};
|
||||
|
||||
|
@ -703,7 +705,7 @@ static int bmp180_measure(struct bmp280_data *data, u8 ctrl_meas)
|
|||
unsigned int ctrl;
|
||||
|
||||
if (data->use_eoc)
|
||||
init_completion(&data->done);
|
||||
reinit_completion(&data->done);
|
||||
|
||||
ret = regmap_write(data->regmap, BMP280_REG_CTRL_MEAS, ctrl_meas);
|
||||
if (ret)
|
||||
|
@ -959,6 +961,9 @@ static int bmp085_fetch_eoc_irq(struct device *dev,
|
|||
"trying to enforce it\n");
|
||||
irq_trig = IRQF_TRIGGER_RISING;
|
||||
}
|
||||
|
||||
init_completion(&data->done);
|
||||
|
||||
ret = devm_request_threaded_irq(dev,
|
||||
irq,
|
||||
bmp085_eoc_irq,
|
||||
|
|
|
@ -319,8 +319,21 @@ static struct config_group *make_cma_dev(struct config_group *group,
|
|||
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 = {
|
||||
.make_group = make_cma_dev,
|
||||
.drop_item = drop_cma_dev,
|
||||
};
|
||||
|
||||
static const struct config_item_type cma_subsys_type = {
|
||||
|
|
|
@ -945,6 +945,7 @@ void c4iw_dealloc(struct uld_ctx *ctx)
|
|||
static void c4iw_remove(struct uld_ctx *ctx)
|
||||
{
|
||||
pr_debug("c4iw_dev %p\n", ctx->dev);
|
||||
debugfs_remove_recursive(ctx->dev->debugfs_root);
|
||||
c4iw_unregister_device(ctx->dev);
|
||||
c4iw_dealloc(ctx);
|
||||
}
|
||||
|
|
|
@ -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_RST2INIT_QP:
|
||||
case MLX5_CMD_OP_INIT2RTR_QP:
|
||||
case MLX5_CMD_OP_INIT2INIT_QP:
|
||||
case MLX5_CMD_OP_RTR2RTS_QP:
|
||||
case MLX5_CMD_OP_RTS2RTS_QP:
|
||||
case MLX5_CMD_OP_SQERR2RTS_QP:
|
||||
|
|
|
@ -1432,7 +1432,7 @@ static int btree_gc_coalesce(struct btree *b, struct btree_op *op,
|
|||
if (__set_blocks(n1, n1->keys + n2->keys,
|
||||
block_bytes(b->c)) >
|
||||
btree_blocks(new_nodes[i]))
|
||||
goto out_nocoalesce;
|
||||
goto out_unlock_nocoalesce;
|
||||
|
||||
keys = n2->keys;
|
||||
/* 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,
|
||||
bkey_u64s(&new_nodes[i]->key)))
|
||||
goto out_nocoalesce;
|
||||
goto out_unlock_nocoalesce;
|
||||
|
||||
bch_btree_node_write(new_nodes[i], &cl);
|
||||
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 */
|
||||
return -EINTR;
|
||||
|
||||
out_unlock_nocoalesce:
|
||||
for (i = 0; i < nodes; i++)
|
||||
mutex_unlock(&new_nodes[i]->write_lock);
|
||||
|
||||
out_nocoalesce:
|
||||
closure_sync(&cl);
|
||||
bch_keylist_free(&keylist);
|
||||
|
|
|
@ -1868,7 +1868,7 @@ static int multipath_prepare_ioctl(struct dm_target *ti,
|
|||
int r;
|
||||
|
||||
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);
|
||||
|
||||
if (current_pgpath) {
|
||||
|
|
|
@ -1580,7 +1580,7 @@ static struct dm_zone *dmz_get_rnd_zone_for_reclaim(struct dmz_metadata *zmd)
|
|||
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 ERR_PTR(-EBUSY);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -348,8 +348,8 @@ static int dmz_do_reclaim(struct dmz_reclaim *zrc)
|
|||
|
||||
/* Get a data zone */
|
||||
dzone = dmz_get_zone_for_reclaim(zmd);
|
||||
if (IS_ERR(dzone))
|
||||
return PTR_ERR(dzone);
|
||||
if (!dzone)
|
||||
return -EBUSY;
|
||||
|
||||
start = jiffies;
|
||||
|
||||
|
|
|
@ -1182,6 +1182,8 @@ static int super_90_validate(struct mddev *mddev, struct md_rdev *rdev)
|
|||
mddev->new_layout = mddev->layout;
|
||||
mddev->new_chunk_sectors = mddev->chunk_sectors;
|
||||
}
|
||||
if (mddev->level == 0)
|
||||
mddev->layout = -1;
|
||||
|
||||
if (sb->state & (1<<MD_SB_CLEAN))
|
||||
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;
|
||||
}
|
||||
|
||||
if ((le32_to_cpu(sb->feature_map) & MD_FEATURE_RAID0_LAYOUT) &&
|
||||
sb->level != 0)
|
||||
return -EINVAL;
|
||||
|
||||
if (!refdev) {
|
||||
ret = 1;
|
||||
} else {
|
||||
|
@ -1708,6 +1714,10 @@ static int super_1_validate(struct mddev *mddev, struct md_rdev *rdev)
|
|||
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)
|
||||
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->layout = info->layout;
|
||||
if (mddev->level == 0)
|
||||
/* Cannot trust RAID0 layout info here */
|
||||
mddev->layout = -1;
|
||||
mddev->chunk_sectors = info->chunk_size >> 9;
|
||||
|
||||
if (mddev->persistent) {
|
||||
|
|
|
@ -152,6 +152,9 @@ static int create_strip_zones(struct mddev *mddev, struct r0conf **private_conf)
|
|||
|
||||
if (conf->nr_strip_zones == 1) {
|
||||
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 ||
|
||||
default_layout == RAID0_ALT_MULTIZONE_LAYOUT) {
|
||||
conf->layout = default_layout;
|
||||
|
|
|
@ -704,3 +704,4 @@ module_i2c_driver(wm8994_i2c_driver);
|
|||
MODULE_DESCRIPTION("Core support for the WM8994 audio CODEC");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");
|
||||
MODULE_SOFTDEP("pre: wm8994_regulator");
|
||||
|
|
|
@ -235,7 +235,7 @@ static int ams_delta_init(struct platform_device *pdev)
|
|||
goto out_gpio;
|
||||
|
||||
/* Scan to find existence of the device */
|
||||
err = nand_scan(ams_delta_mtd, 1);
|
||||
err = nand_scan(this, 1);
|
||||
if (err)
|
||||
goto out_mtd;
|
||||
|
||||
|
@ -264,7 +264,7 @@ static int ams_delta_cleanup(struct platform_device *pdev)
|
|||
void __iomem *io_base = platform_get_drvdata(pdev);
|
||||
|
||||
/* 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(AMS_DELTA_GPIO_PIN_NAND_RB);
|
||||
|
|
|
@ -1694,7 +1694,7 @@ atmel_nand_controller_add_nand(struct atmel_nand_controller *nc,
|
|||
|
||||
nc->caps->ops->nand_init(nc, nand);
|
||||
|
||||
ret = nand_scan(mtd, nand->numcs);
|
||||
ret = nand_scan(chip, nand->numcs);
|
||||
if (ret) {
|
||||
dev_err(nc->dev, "NAND scan failed: %d\n", ret);
|
||||
return ret;
|
||||
|
|
|
@ -466,7 +466,7 @@ static int au1550nd_probe(struct platform_device *pdev)
|
|||
this->write_buf = (pd->devwidth) ? au_write_buf16 : au_write_buf;
|
||||
this->read_buf = (pd->devwidth) ? au_read_buf16 : au_read_buf;
|
||||
|
||||
ret = nand_scan(mtd, 1);
|
||||
ret = nand_scan(this, 1);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "NAND scan failed with %d\n", ret);
|
||||
goto out3;
|
||||
|
@ -492,7 +492,7 @@ static int au1550nd_remove(struct platform_device *pdev)
|
|||
struct au1550nd_ctx *ctx = platform_get_drvdata(pdev);
|
||||
struct resource *r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
|
||||
nand_release(nand_to_mtd(&ctx->chip));
|
||||
nand_release(&ctx->chip);
|
||||
iounmap(ctx->base);
|
||||
release_mem_region(r->start, 0x1000);
|
||||
kfree(ctx);
|
||||
|
|
|
@ -65,7 +65,7 @@ static int bcm47xxnflash_remove(struct platform_device *pdev)
|
|||
{
|
||||
struct bcm47xxnflash *nflash = platform_get_drvdata(pdev);
|
||||
|
||||
nand_release(nand_to_mtd(&nflash->nand_chip));
|
||||
nand_release(&nflash->nand_chip);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -423,7 +423,7 @@ int bcm47xxnflash_ops_bcm4706_init(struct bcm47xxnflash *b47n)
|
|||
(w4 << 24 | w3 << 18 | w2 << 12 | w1 << 6 | w0));
|
||||
|
||||
/* Scan NAND */
|
||||
err = nand_scan(nand_to_mtd(&b47n->nand_chip), 1);
|
||||
err = nand_scan(&b47n->nand_chip, 1);
|
||||
if (err) {
|
||||
pr_err("Could not scan NAND flash: %d\n", err);
|
||||
goto exit;
|
||||
|
|
|
@ -2304,7 +2304,7 @@ static int brcmnand_init_cs(struct brcmnand_host *host, struct device_node *dn)
|
|||
nand_writereg(ctrl, cfg_offs,
|
||||
nand_readreg(ctrl, cfg_offs) & ~CFG_BUS_WIDTH);
|
||||
|
||||
ret = nand_scan(mtd, 1);
|
||||
ret = nand_scan(chip, 1);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
@ -2619,7 +2619,7 @@ int brcmnand_remove(struct platform_device *pdev)
|
|||
struct brcmnand_host *host;
|
||||
|
||||
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);
|
||||
|
||||
|
|
|
@ -783,7 +783,7 @@ static int cafe_nand_probe(struct pci_dev *pdev,
|
|||
|
||||
/* Scan to find existence of the device */
|
||||
cafe->nand.dummy_controller.ops = &cafe_nand_controller_ops;
|
||||
err = nand_scan(mtd, 2);
|
||||
err = nand_scan(&cafe->nand, 2);
|
||||
if (err)
|
||||
goto out_irq;
|
||||
|
||||
|
@ -819,7 +819,7 @@ static void cafe_nand_remove(struct pci_dev *pdev)
|
|||
/* Disable NAND IRQ in global IRQ mask register */
|
||||
cafe_writel(cafe, ~1 & cafe_readl(cafe, GLOBAL_IRQ_MASK), GLOBAL_IRQ_MASK);
|
||||
free_irq(pdev->irq, mtd);
|
||||
nand_release(mtd);
|
||||
nand_release(chip);
|
||||
free_rs(cafe->rs);
|
||||
pci_iounmap(pdev, cafe->mmio);
|
||||
dma_free_coherent(&cafe->pdev->dev, 2112, cafe->dmabuf, cafe->dmaaddr);
|
||||
|
|
|
@ -193,7 +193,7 @@ static int __init cmx270_init(void)
|
|||
this->write_buf = cmx270_write_buf;
|
||||
|
||||
/* Scan to find existence of the device */
|
||||
ret = nand_scan(cmx270_nand_mtd, 1);
|
||||
ret = nand_scan(this, 1);
|
||||
if (ret) {
|
||||
pr_notice("No NAND device\n");
|
||||
goto err_scan;
|
||||
|
@ -228,7 +228,7 @@ module_init(cmx270_init);
|
|||
static void __exit cmx270_cleanup(void)
|
||||
{
|
||||
/* 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_CS);
|
||||
|
|
|
@ -241,7 +241,7 @@ static int __init cs553x_init_one(int cs, int mmio, unsigned long adr)
|
|||
}
|
||||
|
||||
/* Scan to find existence of the device */
|
||||
err = nand_scan(new_mtd, 1);
|
||||
err = nand_scan(this, 1);
|
||||
if (err)
|
||||
goto out_free;
|
||||
|
||||
|
@ -336,7 +336,7 @@ static void __exit cs553x_cleanup(void)
|
|||
mmio_base = this->IO_ADDR_R;
|
||||
|
||||
/* Release resources, unregister device */
|
||||
nand_release(mtd);
|
||||
nand_release(this);
|
||||
kfree(mtd->name);
|
||||
cs553x_mtd[i] = NULL;
|
||||
|
||||
|
|
|
@ -807,7 +807,7 @@ static int nand_davinci_probe(struct platform_device *pdev)
|
|||
|
||||
/* Scan to find existence of the device(s) */
|
||||
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) {
|
||||
dev_dbg(&pdev->dev, "no NAND chip(s) found\n");
|
||||
return ret;
|
||||
|
@ -841,7 +841,7 @@ static int nand_davinci_remove(struct platform_device *pdev)
|
|||
ecc4_busy = false;
|
||||
spin_unlock_irq(&davinci_nand_lock);
|
||||
|
||||
nand_release(nand_to_mtd(&info->chip));
|
||||
nand_release(&info->chip);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -1384,7 +1384,7 @@ int denali_init(struct denali_nand_info *denali)
|
|||
chip->setup_data_interface = denali_setup_data_interface;
|
||||
|
||||
chip->dummy_controller.ops = &denali_controller_ops;
|
||||
ret = nand_scan(mtd, denali->max_banks);
|
||||
ret = nand_scan(chip, denali->max_banks);
|
||||
if (ret)
|
||||
goto disable_irq;
|
||||
|
||||
|
@ -1407,9 +1407,7 @@ EXPORT_SYMBOL(denali_init);
|
|||
|
||||
void denali_remove(struct denali_nand_info *denali)
|
||||
{
|
||||
struct mtd_info *mtd = nand_to_mtd(&denali->nand);
|
||||
|
||||
nand_release(mtd);
|
||||
nand_release(&denali->nand);
|
||||
denali_disable_irq(denali);
|
||||
}
|
||||
EXPORT_SYMBOL(denali_remove);
|
||||
|
|
|
@ -1620,14 +1620,11 @@ static int __init doc_probe(unsigned long physadr)
|
|||
else
|
||||
numchips = doc2001_init(mtd);
|
||||
|
||||
if ((ret = nand_scan(mtd, numchips)) || (ret = doc->late_init(mtd))) {
|
||||
/* DBB note: i believe nand_release is necessary here, as
|
||||
if ((ret = nand_scan(nand, numchips)) || (ret = doc->late_init(mtd))) {
|
||||
/* DBB note: i believe nand_cleanup is necessary here, as
|
||||
buffers may have been allocated in nand_base. Check with
|
||||
Thomas. FIX ME! */
|
||||
/* nand_release will call mtd_device_unregister, but we
|
||||
haven't yet added it. This is handled without incident by
|
||||
mtd_device_unregister, as far as I can tell. */
|
||||
nand_release(mtd);
|
||||
nand_cleanup(nand);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
|
@ -1662,7 +1659,7 @@ static void release_nanddoc(void)
|
|||
doc = nand_get_controller_data(nand);
|
||||
|
||||
nextmtd = doc->nextdoc;
|
||||
nand_release(mtd);
|
||||
nand_release(nand);
|
||||
iounmap(doc->virtadr);
|
||||
release_mem_region(doc->physadr, DOC_IOREMAP_LEN);
|
||||
free_rs(doc->rs_decoder);
|
||||
|
|
|
@ -1391,7 +1391,7 @@ static int __init probe_docg4(struct platform_device *pdev)
|
|||
* ->attach_chip callback.
|
||||
*/
|
||||
nand->dummy_controller.ops = &docg4_controller_ops;
|
||||
retval = nand_scan(mtd, 0);
|
||||
retval = nand_scan(nand, 0);
|
||||
if (retval)
|
||||
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)
|
||||
{
|
||||
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));
|
||||
iounmap(doc->virtadr);
|
||||
return 0;
|
||||
|
|
|
@ -915,7 +915,7 @@ static int fsl_elbc_nand_probe(struct platform_device *pdev)
|
|||
goto err;
|
||||
|
||||
priv->chip.controller->ops = &fsl_elbc_controller_ops;
|
||||
ret = nand_scan(mtd, 1);
|
||||
ret = nand_scan(&priv->chip, 1);
|
||||
if (ret)
|
||||
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_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);
|
||||
|
||||
mutex_lock(&fsl_elbc_nand_mutex);
|
||||
|
|
|
@ -1079,7 +1079,7 @@ static int fsl_ifc_nand_probe(struct platform_device *dev)
|
|||
goto err;
|
||||
|
||||
priv->chip.controller->ops = &fsl_ifc_controller_ops;
|
||||
ret = nand_scan(mtd, 1);
|
||||
ret = nand_scan(&priv->chip, 1);
|
||||
if (ret)
|
||||
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)
|
||||
{
|
||||
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);
|
||||
|
||||
mutex_lock(&fsl_ifc_nand_mutex);
|
||||
|
|
|
@ -191,7 +191,7 @@ static int fun_chip_init(struct fsl_upm_nand *fun,
|
|||
goto err;
|
||||
}
|
||||
|
||||
ret = nand_scan(mtd, fun->mchip_count);
|
||||
ret = nand_scan(&fun->chip, fun->mchip_count);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
|
@ -326,7 +326,7 @@ static int fun_remove(struct platform_device *ofdev)
|
|||
struct mtd_info *mtd = nand_to_mtd(&fun->chip);
|
||||
int i;
|
||||
|
||||
nand_release(mtd);
|
||||
nand_release(&fun->chip);
|
||||
kfree(mtd->name);
|
||||
|
||||
for (i = 0; i < fun->mchip_count; i++) {
|
||||
|
|
|
@ -1125,7 +1125,7 @@ static int __init fsmc_nand_probe(struct platform_device *pdev)
|
|||
* Scan to find existence of the device
|
||||
*/
|
||||
nand->dummy_controller.ops = &fsmc_nand_controller_ops;
|
||||
ret = nand_scan(mtd, 1);
|
||||
ret = nand_scan(nand, 1);
|
||||
if (ret)
|
||||
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);
|
||||
|
||||
if (host) {
|
||||
nand_release(nand_to_mtd(&host->nand));
|
||||
nand_release(&host->nand);
|
||||
|
||||
if (host->mode == USE_DMA_ACCESS) {
|
||||
dma_release_channel(host->write_dma_chan);
|
||||
|
|
|
@ -194,7 +194,7 @@ static int gpio_nand_remove(struct platform_device *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 */
|
||||
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))
|
||||
gpiod_direction_output(gpiomtd->nwp, 1);
|
||||
|
||||
ret = nand_scan(mtd, 1);
|
||||
ret = nand_scan(chip, 1);
|
||||
if (ret)
|
||||
goto err_wp;
|
||||
|
||||
|
|
|
@ -1934,7 +1934,7 @@ static int gpmi_nand_init(struct gpmi_nand_data *this)
|
|||
goto err_out;
|
||||
|
||||
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)
|
||||
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);
|
||||
|
||||
nand_release(nand_to_mtd(&this->nand));
|
||||
nand_release(&this->nand);
|
||||
gpmi_free_dma_buffer(this);
|
||||
release_resources(this);
|
||||
return 0;
|
||||
|
|
|
@ -811,7 +811,7 @@ static int hisi_nfc_probe(struct platform_device *pdev)
|
|||
}
|
||||
|
||||
chip->dummy_controller.ops = &hisi_nfc_controller_ops;
|
||||
ret = nand_scan(mtd, max_chips);
|
||||
ret = nand_scan(chip, max_chips);
|
||||
if (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)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -331,7 +331,7 @@ static int jz_nand_detect_bank(struct platform_device *pdev,
|
|||
|
||||
if (chipnr == 0) {
|
||||
/* Detect first chip. */
|
||||
ret = nand_scan(mtd, 1);
|
||||
ret = nand_scan(chip, 1);
|
||||
if (ret)
|
||||
goto notfound_id;
|
||||
|
||||
|
@ -507,7 +507,7 @@ static int jz_nand_remove(struct platform_device *pdev)
|
|||
struct jz_nand *nand = platform_get_drvdata(pdev);
|
||||
size_t i;
|
||||
|
||||
nand_release(nand_to_mtd(&nand->chip));
|
||||
nand_release(&nand->chip);
|
||||
|
||||
/* Deassert and disable all chips */
|
||||
writel(0, nand->base + JZ_REG_NAND_CTRL);
|
||||
|
|
|
@ -286,13 +286,13 @@ static int jz4780_nand_init_chip(struct platform_device *pdev,
|
|||
nand_set_flash_node(chip, np);
|
||||
|
||||
chip->controller->ops = &jz4780_nand_controller_ops;
|
||||
ret = nand_scan(mtd, 1);
|
||||
ret = nand_scan(chip, 1);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = mtd_device_register(mtd, NULL, 0);
|
||||
if (ret) {
|
||||
nand_release(mtd);
|
||||
nand_release(chip);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -307,7 +307,7 @@ static void jz4780_nand_cleanup_chips(struct jz4780_nand_controller *nfc)
|
|||
|
||||
while (!list_empty(&nfc->chips)) {
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -802,7 +802,7 @@ static int lpc32xx_nand_probe(struct platform_device *pdev)
|
|||
* SMALL block or LARGE block.
|
||||
*/
|
||||
nand_chip->dummy_controller.ops = &lpc32xx_nand_controller_ops;
|
||||
res = nand_scan(mtd, 1);
|
||||
res = nand_scan(nand_chip, 1);
|
||||
if (res)
|
||||
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)
|
||||
{
|
||||
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);
|
||||
if (use_dma)
|
||||
dma_release_channel(host->dma_chan);
|
||||
|
|
|
@ -925,7 +925,7 @@ static int lpc32xx_nand_probe(struct platform_device *pdev)
|
|||
|
||||
/* Find NAND device */
|
||||
chip->dummy_controller.ops = &lpc32xx_nand_controller_ops;
|
||||
res = nand_scan(mtd, 1);
|
||||
res = nand_scan(chip, 1);
|
||||
if (res)
|
||||
goto release_dma;
|
||||
|
||||
|
@ -956,9 +956,8 @@ static int lpc32xx_nand_remove(struct platform_device *pdev)
|
|||
{
|
||||
uint32_t tmp;
|
||||
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);
|
||||
|
||||
/* Force CE high */
|
||||
|
|
|
@ -2551,7 +2551,7 @@ static int marvell_nand_chip_init(struct device *dev, struct marvell_nfc *nfc,
|
|||
|
||||
chip->options |= NAND_BUSWIDTH_AUTO;
|
||||
|
||||
ret = nand_scan(mtd, marvell_nand->nsels);
|
||||
ret = nand_scan(chip, marvell_nand->nsels);
|
||||
if (ret) {
|
||||
dev_err(dev, "could not scan the nand chip\n");
|
||||
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);
|
||||
if (ret) {
|
||||
dev_err(dev, "failed to register mtd device: %d\n", ret);
|
||||
nand_release(mtd);
|
||||
nand_release(chip);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -2619,7 +2619,7 @@ static void marvell_nand_chips_cleanup(struct marvell_nfc *nfc)
|
|||
struct marvell_nand_chip *entry, *temp;
|
||||
|
||||
list_for_each_entry_safe(entry, temp, &nfc->chips, node) {
|
||||
nand_release(nand_to_mtd(&entry->chip));
|
||||
nand_release(&entry->chip);
|
||||
list_del(&entry->node);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -778,7 +778,7 @@ static int mpc5121_nfc_probe(struct platform_device *op)
|
|||
}
|
||||
|
||||
/* Detect NAND chips */
|
||||
retval = nand_scan(mtd, be32_to_cpup(chips_no));
|
||||
retval = nand_scan(chip, be32_to_cpup(chips_no));
|
||||
if (retval) {
|
||||
dev_err(dev, "NAND Flash not found !\n");
|
||||
goto error;
|
||||
|
@ -828,7 +828,7 @@ static int mpc5121_nfc_remove(struct platform_device *op)
|
|||
struct device *dev = &op->dev;
|
||||
struct mtd_info *mtd = dev_get_drvdata(dev);
|
||||
|
||||
nand_release(mtd);
|
||||
nand_release(mtd_to_nand(mtd));
|
||||
mpc5121_nfc_free(dev, mtd);
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -1382,14 +1382,14 @@ static int mtk_nfc_nand_chip_init(struct device *dev, struct mtk_nfc *nfc,
|
|||
|
||||
mtk_nfc_hw_init(nfc);
|
||||
|
||||
ret = nand_scan(mtd, nsels);
|
||||
ret = nand_scan(nand, nsels);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = mtd_device_register(mtd, NULL, 0);
|
||||
if (ret) {
|
||||
dev_err(dev, "mtd parse partition error\n");
|
||||
nand_release(mtd);
|
||||
nand_cleanup(nand);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -1555,7 +1555,7 @@ static int mtk_nfc_remove(struct platform_device *pdev)
|
|||
while (!list_empty(&nfc->chips)) {
|
||||
chip = list_first_entry(&nfc->chips, struct mtk_nfc_nand_chip,
|
||||
node);
|
||||
nand_release(nand_to_mtd(&chip->nand));
|
||||
nand_release(&chip->nand);
|
||||
list_del(&chip->node);
|
||||
}
|
||||
|
||||
|
|
|
@ -1900,7 +1900,7 @@ static int mxcnd_probe(struct platform_device *pdev)
|
|||
|
||||
/* Scan the NAND device */
|
||||
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)
|
||||
goto escan;
|
||||
|
||||
|
@ -1928,7 +1928,7 @@ static int mxcnd_remove(struct platform_device *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)
|
||||
clk_disable_unprepare(host->clk);
|
||||
|
||||
|
|
|
@ -5953,7 +5953,7 @@ static int nand_dt_init(struct nand_chip *chip)
|
|||
|
||||
/**
|
||||
* nand_scan_ident - Scan for the NAND device
|
||||
* @mtd: MTD device structure
|
||||
* @chip: NAND chip object
|
||||
* @maxchips: number of chips to scan for
|
||||
* @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
|
||||
* 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 mtd_info *mtd = nand_to_mtd(chip);
|
||||
int i, nand_maf_id, nand_dev_id;
|
||||
struct nand_chip *chip = mtd_to_nand(mtd);
|
||||
int ret;
|
||||
|
||||
/* 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
|
||||
* @mtd: MTD device structure
|
||||
* @chip: NAND chip object
|
||||
*
|
||||
* 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
|
||||
* 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;
|
||||
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
|
||||
* @mtd: MTD device structure
|
||||
* @chip: NAND chip object
|
||||
* @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
|
||||
* 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
|
||||
* 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_chip *chip = mtd_to_nand(mtd);
|
||||
int ret;
|
||||
|
||||
if (maxchips) {
|
||||
ret = nand_scan_ident(mtd, maxchips, ids);
|
||||
ret = nand_scan_ident(chip, maxchips, ids);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
@ -6796,7 +6795,7 @@ int nand_scan_with_ids(struct mtd_info *mtd, int maxchips,
|
|||
if (ret)
|
||||
goto cleanup_ident;
|
||||
|
||||
ret = nand_scan_tail(mtd);
|
||||
ret = nand_scan_tail(chip);
|
||||
if (ret)
|
||||
goto detach_chip;
|
||||
|
||||
|
@ -6847,12 +6846,12 @@ EXPORT_SYMBOL_GPL(nand_cleanup);
|
|||
/**
|
||||
* nand_release - [NAND Interface] Unregister the MTD device and free resources
|
||||
* 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);
|
||||
nand_cleanup(mtd_to_nand(mtd));
|
||||
mtd_device_unregister(nand_to_mtd(chip));
|
||||
nand_cleanup(chip);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(nand_release);
|
||||
|
||||
|
|
|
@ -2319,7 +2319,7 @@ static int __init ns_init_module(void)
|
|||
goto error;
|
||||
|
||||
chip->dummy_controller.ops = &ns_controller_ops;
|
||||
retval = nand_scan(nsmtd, 1);
|
||||
retval = nand_scan(chip, 1);
|
||||
if (retval) {
|
||||
NS_ERR("Could not scan NAND Simulator device\n");
|
||||
goto error;
|
||||
|
@ -2364,7 +2364,7 @@ static int __init ns_init_module(void)
|
|||
|
||||
err_exit:
|
||||
free_nandsim(nand);
|
||||
nand_release(nsmtd);
|
||||
nand_release(chip);
|
||||
for (i = 0;i < ARRAY_SIZE(nand->partitions); ++i)
|
||||
kfree(nand->partitions[i].name);
|
||||
error:
|
||||
|
@ -2386,7 +2386,7 @@ static void __exit ns_cleanup_module(void)
|
|||
int i;
|
||||
|
||||
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)
|
||||
kfree(ns->partitions[i].name);
|
||||
kfree(mtd_to_nand(nsmtd)); /* Free other structures */
|
||||
|
|
|
@ -181,7 +181,7 @@ static int ndfc_chip_init(struct ndfc_controller *ndfc,
|
|||
goto err;
|
||||
}
|
||||
|
||||
ret = nand_scan(mtd, 1);
|
||||
ret = nand_scan(chip, 1);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
|
@ -258,7 +258,7 @@ static int ndfc_remove(struct platform_device *ofdev)
|
|||
struct ndfc_controller *ndfc = dev_get_drvdata(&ofdev->dev);
|
||||
struct mtd_info *mtd = nand_to_mtd(&ndfc->chip);
|
||||
|
||||
nand_release(mtd);
|
||||
nand_release(&ndfc->chip);
|
||||
kfree(mtd->name);
|
||||
|
||||
return 0;
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue