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:
@@ -246,7 +246,7 @@ necessary information about the device.
|
|||||||
this->eccmode = NAND_ECC_SOFT;
|
this->eccmode = NAND_ECC_SOFT;
|
||||||
|
|
||||||
/* Scan to find existence of the device */
|
/* Scan to find existence of the device */
|
||||||
if (nand_scan (board_mtd, 1)) {
|
if (nand_scan (this, 1)) {
|
||||||
err = -ENXIO;
|
err = -ENXIO;
|
||||||
goto out_ior;
|
goto out_ior;
|
||||||
}
|
}
|
||||||
@@ -277,7 +277,7 @@ unregisters the partitions in the MTD layer.
|
|||||||
static void __exit board_cleanup (void)
|
static void __exit board_cleanup (void)
|
||||||
{
|
{
|
||||||
/* Release resources, unregister device */
|
/* Release resources, unregister device */
|
||||||
nand_release (board_mtd);
|
nand_release (mtd_to_nand(board_mtd));
|
||||||
|
|
||||||
/* unmap physical address */
|
/* unmap physical address */
|
||||||
iounmap(baseaddr);
|
iounmap(baseaddr);
|
||||||
|
|||||||
2
Makefile
2
Makefile
@@ -1,7 +1,7 @@
|
|||||||
# SPDX-License-Identifier: GPL-2.0
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
VERSION = 4
|
VERSION = 4
|
||||||
PATCHLEVEL = 19
|
PATCHLEVEL = 19
|
||||||
SUBLEVEL = 129
|
SUBLEVEL = 130
|
||||||
EXTRAVERSION =
|
EXTRAVERSION =
|
||||||
NAME = "People's Front"
|
NAME = "People's Front"
|
||||||
|
|
||||||
|
|||||||
@@ -32,7 +32,7 @@
|
|||||||
|
|
||||||
pwr_led {
|
pwr_led {
|
||||||
label = "bananapi-m2-zero:red:pwr";
|
label = "bananapi-m2-zero:red:pwr";
|
||||||
gpios = <&r_pio 0 10 GPIO_ACTIVE_HIGH>; /* PL10 */
|
gpios = <&r_pio 0 10 GPIO_ACTIVE_LOW>; /* PL10 */
|
||||||
default-state = "on";
|
default-state = "on";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -3,6 +3,8 @@ menuconfig ARCH_INTEGRATOR
|
|||||||
depends on ARCH_MULTI_V4T || ARCH_MULTI_V5 || ARCH_MULTI_V6
|
depends on ARCH_MULTI_V4T || ARCH_MULTI_V5 || ARCH_MULTI_V6
|
||||||
select ARM_AMBA
|
select ARM_AMBA
|
||||||
select COMMON_CLK_VERSATILE
|
select COMMON_CLK_VERSATILE
|
||||||
|
select CMA
|
||||||
|
select DMA_CMA
|
||||||
select HAVE_TCM
|
select HAVE_TCM
|
||||||
select ICST
|
select ICST
|
||||||
select MFD_SYSCON
|
select MFD_SYSCON
|
||||||
@@ -34,14 +36,13 @@ config INTEGRATOR_IMPD1
|
|||||||
select ARM_VIC
|
select ARM_VIC
|
||||||
select GPIO_PL061
|
select GPIO_PL061
|
||||||
select GPIOLIB
|
select GPIOLIB
|
||||||
|
select REGULATOR
|
||||||
|
select REGULATOR_FIXED_VOLTAGE
|
||||||
help
|
help
|
||||||
The IM-PD1 is an add-on logic module for the Integrator which
|
The IM-PD1 is an add-on logic module for the Integrator which
|
||||||
allows ARM(R) Ltd PrimeCells to be developed and evaluated.
|
allows ARM(R) Ltd PrimeCells to be developed and evaluated.
|
||||||
The IM-PD1 can be found on the Integrator/PP2 platform.
|
The IM-PD1 can be found on the Integrator/PP2 platform.
|
||||||
|
|
||||||
To compile this driver as a module, choose M here: the
|
|
||||||
module will be called impd1.
|
|
||||||
|
|
||||||
config INTEGRATOR_CM7TDMI
|
config INTEGRATOR_CM7TDMI
|
||||||
bool "Integrator/CM7TDMI core module"
|
bool "Integrator/CM7TDMI core module"
|
||||||
depends on ARCH_INTEGRATOR_AP
|
depends on ARCH_INTEGRATOR_AP
|
||||||
|
|||||||
@@ -223,21 +223,21 @@
|
|||||||
cpu_on = <0x84000003>;
|
cpu_on = <0x84000003>;
|
||||||
};
|
};
|
||||||
|
|
||||||
clk26m: oscillator@0 {
|
clk26m: oscillator0 {
|
||||||
compatible = "fixed-clock";
|
compatible = "fixed-clock";
|
||||||
#clock-cells = <0>;
|
#clock-cells = <0>;
|
||||||
clock-frequency = <26000000>;
|
clock-frequency = <26000000>;
|
||||||
clock-output-names = "clk26m";
|
clock-output-names = "clk26m";
|
||||||
};
|
};
|
||||||
|
|
||||||
clk32k: oscillator@1 {
|
clk32k: oscillator1 {
|
||||||
compatible = "fixed-clock";
|
compatible = "fixed-clock";
|
||||||
#clock-cells = <0>;
|
#clock-cells = <0>;
|
||||||
clock-frequency = <32000>;
|
clock-frequency = <32000>;
|
||||||
clock-output-names = "clk32k";
|
clock-output-names = "clk32k";
|
||||||
};
|
};
|
||||||
|
|
||||||
cpum_ck: oscillator@2 {
|
cpum_ck: oscillator2 {
|
||||||
compatible = "fixed-clock";
|
compatible = "fixed-clock";
|
||||||
#clock-cells = <0>;
|
#clock-cells = <0>;
|
||||||
clock-frequency = <0>;
|
clock-frequency = <0>;
|
||||||
@@ -253,19 +253,19 @@
|
|||||||
sustainable-power = <1500>; /* milliwatts */
|
sustainable-power = <1500>; /* milliwatts */
|
||||||
|
|
||||||
trips {
|
trips {
|
||||||
threshold: trip-point@0 {
|
threshold: trip-point0 {
|
||||||
temperature = <68000>;
|
temperature = <68000>;
|
||||||
hysteresis = <2000>;
|
hysteresis = <2000>;
|
||||||
type = "passive";
|
type = "passive";
|
||||||
};
|
};
|
||||||
|
|
||||||
target: trip-point@1 {
|
target: trip-point1 {
|
||||||
temperature = <85000>;
|
temperature = <85000>;
|
||||||
hysteresis = <2000>;
|
hysteresis = <2000>;
|
||||||
type = "passive";
|
type = "passive";
|
||||||
};
|
};
|
||||||
|
|
||||||
cpu_crit: cpu_crit@0 {
|
cpu_crit: cpu_crit0 {
|
||||||
temperature = <115000>;
|
temperature = <115000>;
|
||||||
hysteresis = <2000>;
|
hysteresis = <2000>;
|
||||||
type = "critical";
|
type = "critical";
|
||||||
@@ -273,12 +273,12 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
cooling-maps {
|
cooling-maps {
|
||||||
map@0 {
|
map0 {
|
||||||
trip = <&target>;
|
trip = <&target>;
|
||||||
cooling-device = <&cpu0 0 0>;
|
cooling-device = <&cpu0 0 0>;
|
||||||
contribution = <3072>;
|
contribution = <3072>;
|
||||||
};
|
};
|
||||||
map@1 {
|
map1 {
|
||||||
trip = <&target>;
|
trip = <&target>;
|
||||||
cooling-device = <&cpu2 0 0>;
|
cooling-device = <&cpu2 0 0>;
|
||||||
contribution = <1024>;
|
contribution = <1024>;
|
||||||
@@ -291,7 +291,7 @@
|
|||||||
#address-cells = <2>;
|
#address-cells = <2>;
|
||||||
#size-cells = <2>;
|
#size-cells = <2>;
|
||||||
ranges;
|
ranges;
|
||||||
vpu_dma_reserved: vpu_dma_mem_region {
|
vpu_dma_reserved: vpu_dma_mem_region@b7000000 {
|
||||||
compatible = "shared-dma-pool";
|
compatible = "shared-dma-pool";
|
||||||
reg = <0 0xb7000000 0 0x500000>;
|
reg = <0 0xb7000000 0 0x500000>;
|
||||||
alignment = <0x1000>;
|
alignment = <0x1000>;
|
||||||
@@ -343,7 +343,7 @@
|
|||||||
reg = <0 0x10005000 0 0x1000>;
|
reg = <0 0x10005000 0 0x1000>;
|
||||||
};
|
};
|
||||||
|
|
||||||
pio: pinctrl@10005000 {
|
pio: pinctrl@1000b000 {
|
||||||
compatible = "mediatek,mt8173-pinctrl";
|
compatible = "mediatek,mt8173-pinctrl";
|
||||||
reg = <0 0x1000b000 0 0x1000>;
|
reg = <0 0x1000b000 0 0x1000>;
|
||||||
mediatek,pctl-regmap = <&syscfg_pctl_a>;
|
mediatek,pctl-regmap = <&syscfg_pctl_a>;
|
||||||
@@ -541,7 +541,7 @@
|
|||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
gic: interrupt-controller@10220000 {
|
gic: interrupt-controller@10221000 {
|
||||||
compatible = "arm,gic-400";
|
compatible = "arm,gic-400";
|
||||||
#interrupt-cells = <3>;
|
#interrupt-cells = <3>;
|
||||||
interrupt-parent = <&gic>;
|
interrupt-parent = <&gic>;
|
||||||
|
|||||||
@@ -32,7 +32,7 @@
|
|||||||
|
|
||||||
phy-reset-gpios = <&gpio TEGRA194_MAIN_GPIO(G, 5) GPIO_ACTIVE_LOW>;
|
phy-reset-gpios = <&gpio TEGRA194_MAIN_GPIO(G, 5) GPIO_ACTIVE_LOW>;
|
||||||
phy-handle = <&phy>;
|
phy-handle = <&phy>;
|
||||||
phy-mode = "rgmii";
|
phy-mode = "rgmii-id";
|
||||||
|
|
||||||
mdio {
|
mdio {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
|
|||||||
@@ -737,6 +737,27 @@ static u64 get_distance_from_watchpoint(unsigned long addr, u64 val,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int watchpoint_report(struct perf_event *wp, unsigned long addr,
|
||||||
|
struct pt_regs *regs)
|
||||||
|
{
|
||||||
|
int step = is_default_overflow_handler(wp);
|
||||||
|
struct arch_hw_breakpoint *info = counter_arch_bp(wp);
|
||||||
|
|
||||||
|
info->trigger = addr;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If we triggered a user watchpoint from a uaccess routine, then
|
||||||
|
* handle the stepping ourselves since userspace really can't help
|
||||||
|
* us with this.
|
||||||
|
*/
|
||||||
|
if (!user_mode(regs) && info->ctrl.privilege == AARCH64_BREAKPOINT_EL0)
|
||||||
|
step = 1;
|
||||||
|
else
|
||||||
|
perf_bp_event(wp, regs);
|
||||||
|
|
||||||
|
return step;
|
||||||
|
}
|
||||||
|
|
||||||
static int watchpoint_handler(unsigned long addr, unsigned int esr,
|
static int watchpoint_handler(unsigned long addr, unsigned int esr,
|
||||||
struct pt_regs *regs)
|
struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
@@ -746,7 +767,6 @@ static int watchpoint_handler(unsigned long addr, unsigned int esr,
|
|||||||
u64 val;
|
u64 val;
|
||||||
struct perf_event *wp, **slots;
|
struct perf_event *wp, **slots;
|
||||||
struct debug_info *debug_info;
|
struct debug_info *debug_info;
|
||||||
struct arch_hw_breakpoint *info;
|
|
||||||
struct arch_hw_breakpoint_ctrl ctrl;
|
struct arch_hw_breakpoint_ctrl ctrl;
|
||||||
|
|
||||||
slots = this_cpu_ptr(wp_on_reg);
|
slots = this_cpu_ptr(wp_on_reg);
|
||||||
@@ -784,25 +804,13 @@ static int watchpoint_handler(unsigned long addr, unsigned int esr,
|
|||||||
if (dist != 0)
|
if (dist != 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
info = counter_arch_bp(wp);
|
step = watchpoint_report(wp, addr, regs);
|
||||||
info->trigger = addr;
|
|
||||||
perf_bp_event(wp, regs);
|
|
||||||
|
|
||||||
/* Do we need to handle the stepping? */
|
|
||||||
if (is_default_overflow_handler(wp))
|
|
||||||
step = 1;
|
|
||||||
}
|
}
|
||||||
if (min_dist > 0 && min_dist != -1) {
|
|
||||||
/* No exact match found. */
|
|
||||||
wp = slots[closest_match];
|
|
||||||
info = counter_arch_bp(wp);
|
|
||||||
info->trigger = addr;
|
|
||||||
perf_bp_event(wp, regs);
|
|
||||||
|
|
||||||
/* Do we need to handle the stepping? */
|
/* No exact match found? */
|
||||||
if (is_default_overflow_handler(wp))
|
if (min_dist > 0 && min_dist != -1)
|
||||||
step = 1;
|
step = watchpoint_report(slots[closest_match], addr, regs);
|
||||||
}
|
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
|
|
||||||
if (!step)
|
if (!step)
|
||||||
|
|||||||
@@ -216,8 +216,10 @@ static int __init mcf_pci_init(void)
|
|||||||
|
|
||||||
/* Keep a virtual mapping to IO/config space active */
|
/* Keep a virtual mapping to IO/config space active */
|
||||||
iospace = (unsigned long) ioremap(PCI_IO_PA, PCI_IO_SIZE);
|
iospace = (unsigned long) ioremap(PCI_IO_PA, PCI_IO_SIZE);
|
||||||
if (iospace == 0)
|
if (iospace == 0) {
|
||||||
|
pci_free_host_bridge(bridge);
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
}
|
||||||
pr_info("Coldfire: PCI IO/config window mapped to 0x%x\n",
|
pr_info("Coldfire: PCI IO/config window mapped to 0x%x\n",
|
||||||
(u32) iospace);
|
(u32) iospace);
|
||||||
|
|
||||||
|
|||||||
@@ -1170,13 +1170,13 @@ ENTRY(__sys_clone)
|
|||||||
l.movhi r29,hi(sys_clone)
|
l.movhi r29,hi(sys_clone)
|
||||||
l.ori r29,r29,lo(sys_clone)
|
l.ori r29,r29,lo(sys_clone)
|
||||||
l.j _fork_save_extra_regs_and_call
|
l.j _fork_save_extra_regs_and_call
|
||||||
l.addi r7,r1,0
|
l.nop
|
||||||
|
|
||||||
ENTRY(__sys_fork)
|
ENTRY(__sys_fork)
|
||||||
l.movhi r29,hi(sys_fork)
|
l.movhi r29,hi(sys_fork)
|
||||||
l.ori r29,r29,lo(sys_fork)
|
l.ori r29,r29,lo(sys_fork)
|
||||||
l.j _fork_save_extra_regs_and_call
|
l.j _fork_save_extra_regs_and_call
|
||||||
l.addi r3,r1,0
|
l.nop
|
||||||
|
|
||||||
ENTRY(sys_rt_sigreturn)
|
ENTRY(sys_rt_sigreturn)
|
||||||
l.jal _sys_rt_sigreturn
|
l.jal _sys_rt_sigreturn
|
||||||
|
|||||||
@@ -985,10 +985,25 @@ extern struct page *pgd_page(pgd_t pgd);
|
|||||||
#define pud_page_vaddr(pud) __va(pud_val(pud) & ~PUD_MASKED_BITS)
|
#define pud_page_vaddr(pud) __va(pud_val(pud) & ~PUD_MASKED_BITS)
|
||||||
#define pgd_page_vaddr(pgd) __va(pgd_val(pgd) & ~PGD_MASKED_BITS)
|
#define pgd_page_vaddr(pgd) __va(pgd_val(pgd) & ~PGD_MASKED_BITS)
|
||||||
|
|
||||||
#define pgd_index(address) (((address) >> (PGDIR_SHIFT)) & (PTRS_PER_PGD - 1))
|
static inline unsigned long pgd_index(unsigned long address)
|
||||||
#define pud_index(address) (((address) >> (PUD_SHIFT)) & (PTRS_PER_PUD - 1))
|
{
|
||||||
#define pmd_index(address) (((address) >> (PMD_SHIFT)) & (PTRS_PER_PMD - 1))
|
return (address >> PGDIR_SHIFT) & (PTRS_PER_PGD - 1);
|
||||||
#define pte_index(address) (((address) >> (PAGE_SHIFT)) & (PTRS_PER_PTE - 1))
|
}
|
||||||
|
|
||||||
|
static inline unsigned long pud_index(unsigned long address)
|
||||||
|
{
|
||||||
|
return (address >> PUD_SHIFT) & (PTRS_PER_PUD - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline unsigned long pmd_index(unsigned long address)
|
||||||
|
{
|
||||||
|
return (address >> PMD_SHIFT) & (PTRS_PER_PMD - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline unsigned long pte_index(unsigned long address)
|
||||||
|
{
|
||||||
|
return (address >> PAGE_SHIFT) & (PTRS_PER_PTE - 1);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Find an entry in a page-table-directory. We combine the address region
|
* Find an entry in a page-table-directory. We combine the address region
|
||||||
|
|||||||
@@ -386,7 +386,6 @@ struct thread_struct {
|
|||||||
#else
|
#else
|
||||||
#define INIT_THREAD { \
|
#define INIT_THREAD { \
|
||||||
.ksp = INIT_SP, \
|
.ksp = INIT_SP, \
|
||||||
.regs = (struct pt_regs *)INIT_SP - 1, /* XXX bogus, I think */ \
|
|
||||||
.addr_limit = KERNEL_DS, \
|
.addr_limit = KERNEL_DS, \
|
||||||
.fpexc_mode = 0, \
|
.fpexc_mode = 0, \
|
||||||
.ppr = INIT_PPR, \
|
.ppr = INIT_PPR, \
|
||||||
|
|||||||
@@ -950,15 +950,8 @@ start_here_multiplatform:
|
|||||||
std r0,0(r4)
|
std r0,0(r4)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* The following gets the stack set up with the regs */
|
|
||||||
/* pointing to the real addr of the kernel stack. This is */
|
|
||||||
/* all done to support the C function call below which sets */
|
|
||||||
/* up the htab. This is done because we have relocated the */
|
|
||||||
/* kernel but are still running in real mode. */
|
|
||||||
|
|
||||||
LOAD_REG_ADDR(r3,init_thread_union)
|
|
||||||
|
|
||||||
/* set up a stack pointer */
|
/* set up a stack pointer */
|
||||||
|
LOAD_REG_ADDR(r3,init_thread_union)
|
||||||
LOAD_REG_IMMEDIATE(r1,THREAD_SIZE)
|
LOAD_REG_IMMEDIATE(r1,THREAD_SIZE)
|
||||||
add r1,r3,r1
|
add r1,r3,r1
|
||||||
li r0,0
|
li r0,0
|
||||||
|
|||||||
@@ -116,11 +116,12 @@ void machine_kexec(struct kimage *image)
|
|||||||
|
|
||||||
void __init reserve_crashkernel(void)
|
void __init reserve_crashkernel(void)
|
||||||
{
|
{
|
||||||
unsigned long long crash_size, crash_base;
|
unsigned long long crash_size, crash_base, total_mem_sz;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
total_mem_sz = memory_limit ? memory_limit : memblock_phys_mem_size();
|
||||||
/* use common parsing */
|
/* use common parsing */
|
||||||
ret = parse_crashkernel(boot_command_line, memblock_phys_mem_size(),
|
ret = parse_crashkernel(boot_command_line, total_mem_sz,
|
||||||
&crash_size, &crash_base);
|
&crash_size, &crash_base);
|
||||||
if (ret == 0 && crash_size > 0) {
|
if (ret == 0 && crash_size > 0) {
|
||||||
crashk_res.start = crash_base;
|
crashk_res.start = crash_base;
|
||||||
@@ -179,6 +180,7 @@ void __init reserve_crashkernel(void)
|
|||||||
/* Crash kernel trumps memory limit */
|
/* Crash kernel trumps memory limit */
|
||||||
if (memory_limit && memory_limit <= crashk_res.end) {
|
if (memory_limit && memory_limit <= crashk_res.end) {
|
||||||
memory_limit = crashk_res.end + 1;
|
memory_limit = crashk_res.end + 1;
|
||||||
|
total_mem_sz = memory_limit;
|
||||||
printk("Adjusted memory limit for crashkernel, now 0x%llx\n",
|
printk("Adjusted memory limit for crashkernel, now 0x%llx\n",
|
||||||
memory_limit);
|
memory_limit);
|
||||||
}
|
}
|
||||||
@@ -187,7 +189,7 @@ void __init reserve_crashkernel(void)
|
|||||||
"for crashkernel (System RAM: %ldMB)\n",
|
"for crashkernel (System RAM: %ldMB)\n",
|
||||||
(unsigned long)(crash_size >> 20),
|
(unsigned long)(crash_size >> 20),
|
||||||
(unsigned long)(crashk_res.start >> 20),
|
(unsigned long)(crashk_res.start >> 20),
|
||||||
(unsigned long)(memblock_phys_mem_size() >> 20));
|
(unsigned long)(total_mem_sz >> 20));
|
||||||
|
|
||||||
if (!memblock_is_region_memory(crashk_res.start, crash_size) ||
|
if (!memblock_is_region_memory(crashk_res.start, crash_size) ||
|
||||||
memblock_reserve(crashk_res.start, crash_size)) {
|
memblock_reserve(crashk_res.start, crash_size)) {
|
||||||
|
|||||||
@@ -171,7 +171,13 @@ static struct kmem_cache *kvm_pmd_cache;
|
|||||||
|
|
||||||
static pte_t *kvmppc_pte_alloc(void)
|
static pte_t *kvmppc_pte_alloc(void)
|
||||||
{
|
{
|
||||||
return kmem_cache_alloc(kvm_pte_cache, GFP_KERNEL);
|
pte_t *pte;
|
||||||
|
|
||||||
|
pte = kmem_cache_alloc(kvm_pte_cache, GFP_KERNEL);
|
||||||
|
/* pmd_populate() will only reference _pa(pte). */
|
||||||
|
kmemleak_ignore(pte);
|
||||||
|
|
||||||
|
return pte;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void kvmppc_pte_free(pte_t *ptep)
|
static void kvmppc_pte_free(pte_t *ptep)
|
||||||
@@ -187,7 +193,13 @@ static inline int pmd_is_leaf(pmd_t pmd)
|
|||||||
|
|
||||||
static pmd_t *kvmppc_pmd_alloc(void)
|
static pmd_t *kvmppc_pmd_alloc(void)
|
||||||
{
|
{
|
||||||
return kmem_cache_alloc(kvm_pmd_cache, GFP_KERNEL);
|
pmd_t *pmd;
|
||||||
|
|
||||||
|
pmd = kmem_cache_alloc(kvm_pmd_cache, GFP_KERNEL);
|
||||||
|
/* pud_populate() will only reference _pa(pmd). */
|
||||||
|
kmemleak_ignore(pmd);
|
||||||
|
|
||||||
|
return pmd;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void kvmppc_pmd_free(pmd_t *pmdp)
|
static void kvmppc_pmd_free(pmd_t *pmdp)
|
||||||
|
|||||||
@@ -1413,16 +1413,6 @@ static void h_24x7_event_read(struct perf_event *event)
|
|||||||
h24x7hw = &get_cpu_var(hv_24x7_hw);
|
h24x7hw = &get_cpu_var(hv_24x7_hw);
|
||||||
h24x7hw->events[i] = event;
|
h24x7hw->events[i] = event;
|
||||||
put_cpu_var(h24x7hw);
|
put_cpu_var(h24x7hw);
|
||||||
/*
|
|
||||||
* Clear the event count so we can compute the _change_
|
|
||||||
* in the 24x7 raw counter value at the end of the txn.
|
|
||||||
*
|
|
||||||
* Note that we could alternatively read the 24x7 value
|
|
||||||
* now and save its value in event->hw.prev_count. But
|
|
||||||
* that would require issuing a hcall, which would then
|
|
||||||
* defeat the purpose of using the txn interface.
|
|
||||||
*/
|
|
||||||
local64_set(&event->count, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
put_cpu_var(hv_24x7_reqb);
|
put_cpu_var(hv_24x7_reqb);
|
||||||
|
|||||||
@@ -1242,7 +1242,7 @@ static void __init ppc460sx_pciex_check_link(struct ppc4xx_pciex_port *port)
|
|||||||
if (mbase == NULL) {
|
if (mbase == NULL) {
|
||||||
printk(KERN_ERR "%pOF: Can't map internal config space !",
|
printk(KERN_ERR "%pOF: Can't map internal config space !",
|
||||||
port->node);
|
port->node);
|
||||||
goto done;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (attempt && (0 == (in_le32(mbase + PECFG_460SX_DLLSTA)
|
while (attempt && (0 == (in_le32(mbase + PECFG_460SX_DLLSTA)
|
||||||
@@ -1252,9 +1252,7 @@ static void __init ppc460sx_pciex_check_link(struct ppc4xx_pciex_port *port)
|
|||||||
}
|
}
|
||||||
if (attempt)
|
if (attempt)
|
||||||
port->link = 1;
|
port->link = 1;
|
||||||
done:
|
|
||||||
iounmap(mbase);
|
iounmap(mbase);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ppc4xx_pciex_hwops ppc460sx_pcie_hwops __initdata = {
|
static struct ppc4xx_pciex_hwops ppc460sx_pcie_hwops __initdata = {
|
||||||
|
|||||||
@@ -212,13 +212,14 @@ void ps3_mm_vas_destroy(void)
|
|||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
DBG("%s:%d: map.vas_id = %llu\n", __func__, __LINE__, map.vas_id);
|
|
||||||
|
|
||||||
if (map.vas_id) {
|
if (map.vas_id) {
|
||||||
result = lv1_select_virtual_address_space(0);
|
result = lv1_select_virtual_address_space(0);
|
||||||
BUG_ON(result);
|
result += lv1_destruct_virtual_address_space(map.vas_id);
|
||||||
result = lv1_destruct_virtual_address_space(map.vas_id);
|
|
||||||
BUG_ON(result);
|
if (result) {
|
||||||
|
lv1_panic(0);
|
||||||
|
}
|
||||||
|
|
||||||
map.vas_id = 0;
|
map.vas_id = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -316,19 +317,20 @@ static void ps3_mm_region_destroy(struct mem_region *r)
|
|||||||
int result;
|
int result;
|
||||||
|
|
||||||
if (!r->destroy) {
|
if (!r->destroy) {
|
||||||
pr_info("%s:%d: Not destroying high region: %llxh %llxh\n",
|
|
||||||
__func__, __LINE__, r->base, r->size);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
DBG("%s:%d: r->base = %llxh\n", __func__, __LINE__, r->base);
|
|
||||||
|
|
||||||
if (r->base) {
|
if (r->base) {
|
||||||
result = lv1_release_memory(r->base);
|
result = lv1_release_memory(r->base);
|
||||||
BUG_ON(result);
|
|
||||||
|
if (result) {
|
||||||
|
lv1_panic(0);
|
||||||
|
}
|
||||||
|
|
||||||
r->size = r->base = r->offset = 0;
|
r->size = r->base = r->offset = 0;
|
||||||
map.total = map.rm.size;
|
map.total = map.rm.size;
|
||||||
}
|
}
|
||||||
|
|
||||||
ps3_mm_set_repository_highmem(NULL);
|
ps3_mm_set_repository_highmem(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -328,10 +328,11 @@ static irqreturn_t ras_error_interrupt(int irq, void *dev_id)
|
|||||||
/*
|
/*
|
||||||
* Some versions of FWNMI place the buffer inside the 4kB page starting at
|
* Some versions of FWNMI place the buffer inside the 4kB page starting at
|
||||||
* 0x7000. Other versions place it inside the rtas buffer. We check both.
|
* 0x7000. Other versions place it inside the rtas buffer. We check both.
|
||||||
|
* Minimum size of the buffer is 16 bytes.
|
||||||
*/
|
*/
|
||||||
#define VALID_FWNMI_BUFFER(A) \
|
#define VALID_FWNMI_BUFFER(A) \
|
||||||
((((A) >= 0x7000) && ((A) < 0x7ff0)) || \
|
((((A) >= 0x7000) && ((A) <= 0x8000 - 16)) || \
|
||||||
(((A) >= rtas.base) && ((A) < (rtas.base + rtas.size - 16))))
|
(((A) >= rtas.base) && ((A) <= (rtas.base + rtas.size - 16))))
|
||||||
|
|
||||||
static inline struct rtas_error_log *fwnmi_get_errlog(void)
|
static inline struct rtas_error_log *fwnmi_get_errlog(void)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -38,7 +38,17 @@ static inline void syscall_rollback(struct task_struct *task,
|
|||||||
static inline long syscall_get_error(struct task_struct *task,
|
static inline long syscall_get_error(struct task_struct *task,
|
||||||
struct pt_regs *regs)
|
struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
return IS_ERR_VALUE(regs->gprs[2]) ? regs->gprs[2] : 0;
|
unsigned long error = regs->gprs[2];
|
||||||
|
#ifdef CONFIG_COMPAT
|
||||||
|
if (test_tsk_thread_flag(task, TIF_31BIT)) {
|
||||||
|
/*
|
||||||
|
* Sign-extend the value so (int)-EFOO becomes (long)-EFOO
|
||||||
|
* and will match correctly in comparisons.
|
||||||
|
*/
|
||||||
|
error = (long)(int)error;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return IS_ERR_VALUE(error) ? error : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline long syscall_get_return_value(struct task_struct *task,
|
static inline long syscall_get_return_value(struct task_struct *task,
|
||||||
|
|||||||
@@ -87,7 +87,7 @@ $(obj)/vmlinux.bin: $(obj)/compressed/vmlinux FORCE
|
|||||||
|
|
||||||
SETUP_OBJS = $(addprefix $(obj)/,$(setup-y))
|
SETUP_OBJS = $(addprefix $(obj)/,$(setup-y))
|
||||||
|
|
||||||
sed-zoffset := -e 's/^\([0-9a-fA-F]*\) [ABCDGRSTVW] \(startup_32\|startup_64\|efi32_stub_entry\|efi64_stub_entry\|efi_pe_entry\|input_data\|_end\|_ehead\|_text\|z_.*\)$$/\#define ZO_\2 0x\1/p'
|
sed-zoffset := -e 's/^\([0-9a-fA-F]*\) [a-zA-Z] \(startup_32\|startup_64\|efi32_stub_entry\|efi64_stub_entry\|efi_pe_entry\|input_data\|_end\|_ehead\|_text\|z_.*\)$$/\#define ZO_\2 0x\1/p'
|
||||||
|
|
||||||
quiet_cmd_zoffset = ZOFFSET $@
|
quiet_cmd_zoffset = ZOFFSET $@
|
||||||
cmd_zoffset = $(NM) $< | sed -n $(sed-zoffset) > $@
|
cmd_zoffset = $(NM) $< | sed -n $(sed-zoffset) > $@
|
||||||
|
|||||||
@@ -2024,7 +2024,7 @@ void __init init_apic_mappings(void)
|
|||||||
unsigned int new_apicid;
|
unsigned int new_apicid;
|
||||||
|
|
||||||
if (apic_validate_deadline_timer())
|
if (apic_validate_deadline_timer())
|
||||||
pr_debug("TSC deadline timer available\n");
|
pr_info("TSC deadline timer available\n");
|
||||||
|
|
||||||
if (x2apic_mode) {
|
if (x2apic_mode) {
|
||||||
boot_cpu_physical_apicid = read_apic_id();
|
boot_cpu_physical_apicid = read_apic_id();
|
||||||
|
|||||||
@@ -320,7 +320,11 @@ void __init idt_setup_apic_and_irq_gates(void)
|
|||||||
|
|
||||||
#ifdef CONFIG_X86_LOCAL_APIC
|
#ifdef CONFIG_X86_LOCAL_APIC
|
||||||
for_each_clear_bit_from(i, system_vectors, NR_VECTORS) {
|
for_each_clear_bit_from(i, system_vectors, NR_VECTORS) {
|
||||||
set_bit(i, system_vectors);
|
/*
|
||||||
|
* Don't set the non assigned system vectors in the
|
||||||
|
* system_vectors bitmap. Otherwise they show up in
|
||||||
|
* /proc/interrupts.
|
||||||
|
*/
|
||||||
entry = spurious_entries_start + 8 * (i - FIRST_SYSTEM_VECTOR);
|
entry = spurious_entries_start + 8 * (i - FIRST_SYSTEM_VECTOR);
|
||||||
set_intr_gate(i, entry);
|
set_intr_gate(i, entry);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -765,16 +765,11 @@ asm(
|
|||||||
NOKPROBE_SYMBOL(kretprobe_trampoline);
|
NOKPROBE_SYMBOL(kretprobe_trampoline);
|
||||||
STACK_FRAME_NON_STANDARD(kretprobe_trampoline);
|
STACK_FRAME_NON_STANDARD(kretprobe_trampoline);
|
||||||
|
|
||||||
static struct kprobe kretprobe_kprobe = {
|
|
||||||
.addr = (void *)kretprobe_trampoline,
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Called from kretprobe_trampoline
|
* Called from kretprobe_trampoline
|
||||||
*/
|
*/
|
||||||
__visible __used void *trampoline_handler(struct pt_regs *regs)
|
__visible __used void *trampoline_handler(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
struct kprobe_ctlblk *kcb;
|
|
||||||
struct kretprobe_instance *ri = NULL;
|
struct kretprobe_instance *ri = NULL;
|
||||||
struct hlist_head *head, empty_rp;
|
struct hlist_head *head, empty_rp;
|
||||||
struct hlist_node *tmp;
|
struct hlist_node *tmp;
|
||||||
@@ -784,16 +779,12 @@ __visible __used void *trampoline_handler(struct pt_regs *regs)
|
|||||||
void *frame_pointer;
|
void *frame_pointer;
|
||||||
bool skipped = false;
|
bool skipped = false;
|
||||||
|
|
||||||
preempt_disable();
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set a dummy kprobe for avoiding kretprobe recursion.
|
* Set a dummy kprobe for avoiding kretprobe recursion.
|
||||||
* Since kretprobe never run in kprobe handler, kprobe must not
|
* Since kretprobe never run in kprobe handler, kprobe must not
|
||||||
* be running at this point.
|
* be running at this point.
|
||||||
*/
|
*/
|
||||||
kcb = get_kprobe_ctlblk();
|
kprobe_busy_begin();
|
||||||
__this_cpu_write(current_kprobe, &kretprobe_kprobe);
|
|
||||||
kcb->kprobe_status = KPROBE_HIT_ACTIVE;
|
|
||||||
|
|
||||||
INIT_HLIST_HEAD(&empty_rp);
|
INIT_HLIST_HEAD(&empty_rp);
|
||||||
kretprobe_hash_lock(current, &head, &flags);
|
kretprobe_hash_lock(current, &head, &flags);
|
||||||
@@ -872,7 +863,7 @@ __visible __used void *trampoline_handler(struct pt_regs *regs)
|
|||||||
__this_cpu_write(current_kprobe, &ri->rp->kp);
|
__this_cpu_write(current_kprobe, &ri->rp->kp);
|
||||||
ri->ret_addr = correct_ret_addr;
|
ri->ret_addr = correct_ret_addr;
|
||||||
ri->rp->handler(ri, regs);
|
ri->rp->handler(ri, regs);
|
||||||
__this_cpu_write(current_kprobe, &kretprobe_kprobe);
|
__this_cpu_write(current_kprobe, &kprobe_busy);
|
||||||
}
|
}
|
||||||
|
|
||||||
recycle_rp_inst(ri, &empty_rp);
|
recycle_rp_inst(ri, &empty_rp);
|
||||||
@@ -888,8 +879,7 @@ __visible __used void *trampoline_handler(struct pt_regs *regs)
|
|||||||
|
|
||||||
kretprobe_hash_unlock(current, &flags);
|
kretprobe_hash_unlock(current, &flags);
|
||||||
|
|
||||||
__this_cpu_write(current_kprobe, NULL);
|
kprobe_busy_end();
|
||||||
preempt_enable();
|
|
||||||
|
|
||||||
hlist_for_each_entry_safe(ri, tmp, &empty_rp, hlist) {
|
hlist_for_each_entry_safe(ri, tmp, &empty_rp, hlist) {
|
||||||
hlist_del(&ri->hlist);
|
hlist_del(&ri->hlist);
|
||||||
|
|||||||
@@ -281,6 +281,11 @@ static const u64 shadow_nonpresent_or_rsvd_mask_len = 5;
|
|||||||
*/
|
*/
|
||||||
static u64 __read_mostly shadow_nonpresent_or_rsvd_lower_gfn_mask;
|
static u64 __read_mostly shadow_nonpresent_or_rsvd_lower_gfn_mask;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The number of non-reserved physical address bits irrespective of features
|
||||||
|
* that repurpose legal bits, e.g. MKTME.
|
||||||
|
*/
|
||||||
|
static u8 __read_mostly shadow_phys_bits;
|
||||||
|
|
||||||
static void mmu_spte_set(u64 *sptep, u64 spte);
|
static void mmu_spte_set(u64 *sptep, u64 spte);
|
||||||
static bool is_executable_pte(u64 spte);
|
static bool is_executable_pte(u64 spte);
|
||||||
@@ -464,6 +469,21 @@ void kvm_mmu_set_mask_ptes(u64 user_mask, u64 accessed_mask,
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(kvm_mmu_set_mask_ptes);
|
EXPORT_SYMBOL_GPL(kvm_mmu_set_mask_ptes);
|
||||||
|
|
||||||
|
static u8 kvm_get_shadow_phys_bits(void)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* boot_cpu_data.x86_phys_bits is reduced when MKTME is detected
|
||||||
|
* in CPU detection code, but MKTME treats those reduced bits as
|
||||||
|
* 'keyID' thus they are not reserved bits. Therefore for MKTME
|
||||||
|
* we should still return physical address bits reported by CPUID.
|
||||||
|
*/
|
||||||
|
if (!boot_cpu_has(X86_FEATURE_TME) ||
|
||||||
|
WARN_ON_ONCE(boot_cpu_data.extended_cpuid_level < 0x80000008))
|
||||||
|
return boot_cpu_data.x86_phys_bits;
|
||||||
|
|
||||||
|
return cpuid_eax(0x80000008) & 0xff;
|
||||||
|
}
|
||||||
|
|
||||||
static void kvm_mmu_reset_all_pte_masks(void)
|
static void kvm_mmu_reset_all_pte_masks(void)
|
||||||
{
|
{
|
||||||
u8 low_phys_bits;
|
u8 low_phys_bits;
|
||||||
@@ -477,6 +497,8 @@ static void kvm_mmu_reset_all_pte_masks(void)
|
|||||||
shadow_present_mask = 0;
|
shadow_present_mask = 0;
|
||||||
shadow_acc_track_mask = 0;
|
shadow_acc_track_mask = 0;
|
||||||
|
|
||||||
|
shadow_phys_bits = kvm_get_shadow_phys_bits();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If the CPU has 46 or less physical address bits, then set an
|
* If the CPU has 46 or less physical address bits, then set an
|
||||||
* appropriate mask to guard against L1TF attacks. Otherwise, it is
|
* appropriate mask to guard against L1TF attacks. Otherwise, it is
|
||||||
@@ -4544,7 +4566,7 @@ reset_shadow_zero_bits_mask(struct kvm_vcpu *vcpu, struct kvm_mmu *context)
|
|||||||
*/
|
*/
|
||||||
shadow_zero_check = &context->shadow_zero_check;
|
shadow_zero_check = &context->shadow_zero_check;
|
||||||
__reset_rsvds_bits_mask(vcpu, shadow_zero_check,
|
__reset_rsvds_bits_mask(vcpu, shadow_zero_check,
|
||||||
boot_cpu_data.x86_phys_bits,
|
shadow_phys_bits,
|
||||||
context->shadow_root_level, uses_nx,
|
context->shadow_root_level, uses_nx,
|
||||||
guest_cpuid_has(vcpu, X86_FEATURE_GBPAGES),
|
guest_cpuid_has(vcpu, X86_FEATURE_GBPAGES),
|
||||||
is_pse(vcpu), true);
|
is_pse(vcpu), true);
|
||||||
@@ -4581,13 +4603,13 @@ reset_tdp_shadow_zero_bits_mask(struct kvm_vcpu *vcpu,
|
|||||||
|
|
||||||
if (boot_cpu_is_amd())
|
if (boot_cpu_is_amd())
|
||||||
__reset_rsvds_bits_mask(vcpu, shadow_zero_check,
|
__reset_rsvds_bits_mask(vcpu, shadow_zero_check,
|
||||||
boot_cpu_data.x86_phys_bits,
|
shadow_phys_bits,
|
||||||
context->shadow_root_level, false,
|
context->shadow_root_level, false,
|
||||||
boot_cpu_has(X86_FEATURE_GBPAGES),
|
boot_cpu_has(X86_FEATURE_GBPAGES),
|
||||||
true, true);
|
true, true);
|
||||||
else
|
else
|
||||||
__reset_rsvds_bits_mask_ept(shadow_zero_check,
|
__reset_rsvds_bits_mask_ept(shadow_zero_check,
|
||||||
boot_cpu_data.x86_phys_bits,
|
shadow_phys_bits,
|
||||||
false);
|
false);
|
||||||
|
|
||||||
if (!shadow_me_mask)
|
if (!shadow_me_mask)
|
||||||
@@ -4608,7 +4630,7 @@ reset_ept_shadow_zero_bits_mask(struct kvm_vcpu *vcpu,
|
|||||||
struct kvm_mmu *context, bool execonly)
|
struct kvm_mmu *context, bool execonly)
|
||||||
{
|
{
|
||||||
__reset_rsvds_bits_mask_ept(&context->shadow_zero_check,
|
__reset_rsvds_bits_mask_ept(&context->shadow_zero_check,
|
||||||
boot_cpu_data.x86_phys_bits, execonly);
|
shadow_phys_bits, execonly);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define BYTE_MASK(access) \
|
#define BYTE_MASK(access) \
|
||||||
@@ -6050,6 +6072,25 @@ static int set_nx_huge_pages(const char *val, const struct kernel_param *kp)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void kvm_set_mmio_spte_mask(void)
|
||||||
|
{
|
||||||
|
u64 mask;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set a reserved PA bit in MMIO SPTEs to generate page faults with
|
||||||
|
* PFEC.RSVD=1 on MMIO accesses. 64-bit PTEs (PAE, x86-64, and EPT
|
||||||
|
* paging) support a maximum of 52 bits of PA, i.e. if the CPU supports
|
||||||
|
* 52-bit physical addresses then there are no reserved PA bits in the
|
||||||
|
* PTEs and so the reserved PA approach must be disabled.
|
||||||
|
*/
|
||||||
|
if (shadow_phys_bits < 52)
|
||||||
|
mask = BIT_ULL(51) | PT_PRESENT_MASK;
|
||||||
|
else
|
||||||
|
mask = 0;
|
||||||
|
|
||||||
|
kvm_mmu_set_mmio_spte_mask(mask, mask);
|
||||||
|
}
|
||||||
|
|
||||||
int kvm_mmu_module_init(void)
|
int kvm_mmu_module_init(void)
|
||||||
{
|
{
|
||||||
int ret = -ENOMEM;
|
int ret = -ENOMEM;
|
||||||
@@ -6059,6 +6100,8 @@ int kvm_mmu_module_init(void)
|
|||||||
|
|
||||||
kvm_mmu_reset_all_pte_masks();
|
kvm_mmu_reset_all_pte_masks();
|
||||||
|
|
||||||
|
kvm_set_mmio_spte_mask();
|
||||||
|
|
||||||
pte_list_desc_cache = kmem_cache_create("pte_list_desc",
|
pte_list_desc_cache = kmem_cache_create("pte_list_desc",
|
||||||
sizeof(struct pte_list_desc),
|
sizeof(struct pte_list_desc),
|
||||||
0, SLAB_ACCOUNT, NULL);
|
0, SLAB_ACCOUNT, NULL);
|
||||||
|
|||||||
@@ -6775,35 +6775,6 @@ static struct perf_guest_info_callbacks kvm_guest_cbs = {
|
|||||||
.get_guest_ip = kvm_get_guest_ip,
|
.get_guest_ip = kvm_get_guest_ip,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void kvm_set_mmio_spte_mask(void)
|
|
||||||
{
|
|
||||||
u64 mask;
|
|
||||||
int maxphyaddr = boot_cpu_data.x86_phys_bits;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Set the reserved bits and the present bit of an paging-structure
|
|
||||||
* entry to generate page fault with PFER.RSV = 1.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Mask the uppermost physical address bit, which would be reserved as
|
|
||||||
* long as the supported physical address width is less than 52.
|
|
||||||
*/
|
|
||||||
mask = 1ull << 51;
|
|
||||||
|
|
||||||
/* Set the present bit. */
|
|
||||||
mask |= 1ull;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If reserved bit is not supported, clear the present bit to disable
|
|
||||||
* mmio page fault.
|
|
||||||
*/
|
|
||||||
if (maxphyaddr == 52)
|
|
||||||
mask &= ~1ull;
|
|
||||||
|
|
||||||
kvm_mmu_set_mmio_spte_mask(mask, mask);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef CONFIG_X86_64
|
#ifdef CONFIG_X86_64
|
||||||
static void pvclock_gtod_update_fn(struct work_struct *work)
|
static void pvclock_gtod_update_fn(struct work_struct *work)
|
||||||
{
|
{
|
||||||
@@ -6881,8 +6852,6 @@ int kvm_arch_init(void *opaque)
|
|||||||
if (r)
|
if (r)
|
||||||
goto out_free_percpu;
|
goto out_free_percpu;
|
||||||
|
|
||||||
kvm_set_mmio_spte_mask();
|
|
||||||
|
|
||||||
kvm_x86_ops = ops;
|
kvm_x86_ops = ops;
|
||||||
|
|
||||||
kvm_mmu_set_mask_ptes(PT_USER_MASK, PT_ACCESSED_MASK,
|
kvm_mmu_set_mask_ptes(PT_USER_MASK, PT_ACCESSED_MASK,
|
||||||
|
|||||||
@@ -15,7 +15,10 @@ $(obj)/sha256.o: $(srctree)/lib/sha256.c FORCE
|
|||||||
LDFLAGS_purgatory.ro := -e purgatory_start -r --no-undefined -nostdlib -z nodefaultlib
|
LDFLAGS_purgatory.ro := -e purgatory_start -r --no-undefined -nostdlib -z nodefaultlib
|
||||||
targets += purgatory.ro
|
targets += purgatory.ro
|
||||||
|
|
||||||
|
# Sanitizer, etc. runtimes are unavailable and cannot be linked here.
|
||||||
|
GCOV_PROFILE := n
|
||||||
KASAN_SANITIZE := n
|
KASAN_SANITIZE := n
|
||||||
|
UBSAN_SANITIZE := n
|
||||||
KCOV_INSTRUMENT := n
|
KCOV_INSTRUMENT := n
|
||||||
|
|
||||||
# These are adjustments to the compiler flags used for objects that
|
# These are adjustments to the compiler flags used for objects that
|
||||||
@@ -23,7 +26,7 @@ KCOV_INSTRUMENT := n
|
|||||||
|
|
||||||
PURGATORY_CFLAGS_REMOVE := -mcmodel=kernel
|
PURGATORY_CFLAGS_REMOVE := -mcmodel=kernel
|
||||||
PURGATORY_CFLAGS := -mcmodel=large -ffreestanding -fno-zero-initialized-in-bss
|
PURGATORY_CFLAGS := -mcmodel=large -ffreestanding -fno-zero-initialized-in-bss
|
||||||
PURGATORY_CFLAGS += $(DISABLE_STACKLEAK_PLUGIN)
|
PURGATORY_CFLAGS += $(DISABLE_STACKLEAK_PLUGIN) -DDISABLE_BRANCH_PROFILING
|
||||||
|
|
||||||
# Default KBUILD_CFLAGS can have -pg option set when FTRACE is enabled. That
|
# Default KBUILD_CFLAGS can have -pg option set when FTRACE is enabled. That
|
||||||
# in turn leaves some undefined symbols like __fentry__ in purgatory and not
|
# in turn leaves some undefined symbols like __fentry__ in purgatory and not
|
||||||
|
|||||||
@@ -193,8 +193,6 @@ static int cryptomgr_schedule_probe(struct crypto_larval *larval)
|
|||||||
if (IS_ERR(thread))
|
if (IS_ERR(thread))
|
||||||
goto err_put_larval;
|
goto err_put_larval;
|
||||||
|
|
||||||
wait_for_completion_interruptible(&larval->completion);
|
|
||||||
|
|
||||||
return NOTIFY_STOP;
|
return NOTIFY_STOP;
|
||||||
|
|
||||||
err_put_larval:
|
err_put_larval:
|
||||||
|
|||||||
@@ -78,14 +78,10 @@ static int _skcipher_recvmsg(struct socket *sock, struct msghdr *msg,
|
|||||||
return PTR_ERR(areq);
|
return PTR_ERR(areq);
|
||||||
|
|
||||||
/* convert iovecs of output buffers into RX SGL */
|
/* convert iovecs of output buffers into RX SGL */
|
||||||
err = af_alg_get_rsgl(sk, msg, flags, areq, -1, &len);
|
err = af_alg_get_rsgl(sk, msg, flags, areq, ctx->used, &len);
|
||||||
if (err)
|
if (err)
|
||||||
goto free;
|
goto free;
|
||||||
|
|
||||||
/* Process only as much RX buffers for which we have TX data */
|
|
||||||
if (len > ctx->used)
|
|
||||||
len = ctx->used;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If more buffers are to be expected to be processed, process only
|
* If more buffers are to be expected to be processed, process only
|
||||||
* full block size buffers.
|
* full block size buffers.
|
||||||
|
|||||||
@@ -57,7 +57,6 @@
|
|||||||
#include <linux/workqueue.h>
|
#include <linux/workqueue.h>
|
||||||
#include <linux/scatterlist.h>
|
#include <linux/scatterlist.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
#include <linux/async.h>
|
|
||||||
#include <linux/log2.h>
|
#include <linux/log2.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/glob.h>
|
#include <linux/glob.h>
|
||||||
@@ -6610,7 +6609,7 @@ int ata_host_register(struct ata_host *host, struct scsi_host_template *sht)
|
|||||||
/* perform each probe asynchronously */
|
/* perform each probe asynchronously */
|
||||||
for (i = 0; i < host->n_ports; i++) {
|
for (i = 0; i < host->n_ports; i++) {
|
||||||
struct ata_port *ap = host->ports[i];
|
struct ata_port *ap = host->ports[i];
|
||||||
async_schedule(async_port_probe, ap);
|
ap->cookie = async_schedule(async_port_probe, ap);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@@ -6750,11 +6749,11 @@ void ata_host_detach(struct ata_host *host)
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* Ensure ata_port probe has completed */
|
for (i = 0; i < host->n_ports; i++) {
|
||||||
async_synchronize_full();
|
/* Ensure ata_port probe has completed */
|
||||||
|
async_synchronize_cookie(host->ports[i]->cookie + 1);
|
||||||
for (i = 0; i < host->n_ports; i++)
|
|
||||||
ata_port_detach(host->ports[i]);
|
ata_port_detach(host->ports[i]);
|
||||||
|
}
|
||||||
|
|
||||||
/* the host is dead now, dissociate ACPI */
|
/* the host is dead now, dissociate ACPI */
|
||||||
ata_acpi_dissociate(host);
|
ata_acpi_dissociate(host);
|
||||||
|
|||||||
@@ -700,6 +700,8 @@ int __init_or_module __platform_driver_probe(struct platform_driver *drv,
|
|||||||
/* temporary section violation during probe() */
|
/* temporary section violation during probe() */
|
||||||
drv->probe = probe;
|
drv->probe = probe;
|
||||||
retval = code = __platform_driver_register(drv, module);
|
retval = code = __platform_driver_register(drv, module);
|
||||||
|
if (retval)
|
||||||
|
return retval;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Fixup that section violation, being paranoid about code scanning
|
* Fixup that section violation, being paranoid about code scanning
|
||||||
|
|||||||
@@ -466,7 +466,6 @@ static int ps3disk_probe(struct ps3_system_bus_device *_dev)
|
|||||||
queue->queuedata = dev;
|
queue->queuedata = dev;
|
||||||
|
|
||||||
blk_queue_max_hw_sectors(queue, dev->bounce_size >> 9);
|
blk_queue_max_hw_sectors(queue, dev->bounce_size >> 9);
|
||||||
blk_queue_segment_boundary(queue, -1UL);
|
|
||||||
blk_queue_dma_alignment(queue, dev->blk_size-1);
|
blk_queue_dma_alignment(queue, dev->blk_size-1);
|
||||||
blk_queue_logical_block_size(queue, dev->blk_size);
|
blk_queue_logical_block_size(queue, dev->blk_size);
|
||||||
|
|
||||||
|
|||||||
@@ -30,6 +30,7 @@
|
|||||||
#include <linux/workqueue.h>
|
#include <linux/workqueue.h>
|
||||||
#include <linux/uuid.h>
|
#include <linux/uuid.h>
|
||||||
#include <linux/nospec.h>
|
#include <linux/nospec.h>
|
||||||
|
#include <linux/vmalloc.h>
|
||||||
|
|
||||||
#define PFX "IPMI message handler: "
|
#define PFX "IPMI message handler: "
|
||||||
|
|
||||||
@@ -1089,7 +1090,7 @@ static void free_user_work(struct work_struct *work)
|
|||||||
remove_work);
|
remove_work);
|
||||||
|
|
||||||
cleanup_srcu_struct(&user->release_barrier);
|
cleanup_srcu_struct(&user->release_barrier);
|
||||||
kfree(user);
|
vfree(user);
|
||||||
}
|
}
|
||||||
|
|
||||||
int ipmi_create_user(unsigned int if_num,
|
int ipmi_create_user(unsigned int if_num,
|
||||||
@@ -1121,7 +1122,7 @@ int ipmi_create_user(unsigned int if_num,
|
|||||||
if (rv)
|
if (rv)
|
||||||
return rv;
|
return rv;
|
||||||
|
|
||||||
new_user = kmalloc(sizeof(*new_user), GFP_KERNEL);
|
new_user = vzalloc(sizeof(*new_user));
|
||||||
if (!new_user)
|
if (!new_user)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
@@ -1170,7 +1171,7 @@ int ipmi_create_user(unsigned int if_num,
|
|||||||
|
|
||||||
out_kfree:
|
out_kfree:
|
||||||
srcu_read_unlock(&ipmi_interfaces_srcu, index);
|
srcu_read_unlock(&ipmi_interfaces_srcu, index);
|
||||||
kfree(new_user);
|
vfree(new_user);
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(ipmi_create_user);
|
EXPORT_SYMBOL(ipmi_create_user);
|
||||||
|
|||||||
@@ -1447,13 +1447,13 @@ static struct clk_hw *bcm2835_register_clock(struct bcm2835_cprman *cprman,
|
|||||||
return &clock->hw;
|
return &clock->hw;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct clk *bcm2835_register_gate(struct bcm2835_cprman *cprman,
|
static struct clk_hw *bcm2835_register_gate(struct bcm2835_cprman *cprman,
|
||||||
const struct bcm2835_gate_data *data)
|
const struct bcm2835_gate_data *data)
|
||||||
{
|
{
|
||||||
return clk_register_gate(cprman->dev, data->name, data->parent,
|
return clk_hw_register_gate(cprman->dev, data->name, data->parent,
|
||||||
CLK_IGNORE_UNUSED | CLK_SET_RATE_GATE,
|
CLK_IGNORE_UNUSED | CLK_SET_RATE_GATE,
|
||||||
cprman->regs + data->ctl_reg,
|
cprman->regs + data->ctl_reg,
|
||||||
CM_GATE_BIT, 0, &cprman->regs_lock);
|
CM_GATE_BIT, 0, &cprman->regs_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct clk_hw *(*bcm2835_clk_register)(struct bcm2835_cprman *cprman,
|
typedef struct clk_hw *(*bcm2835_clk_register)(struct bcm2835_cprman *cprman,
|
||||||
|
|||||||
@@ -268,7 +268,7 @@ static struct clk_pll gpll0 = {
|
|||||||
.l_reg = 0x21004,
|
.l_reg = 0x21004,
|
||||||
.m_reg = 0x21008,
|
.m_reg = 0x21008,
|
||||||
.n_reg = 0x2100c,
|
.n_reg = 0x2100c,
|
||||||
.config_reg = 0x21014,
|
.config_reg = 0x21010,
|
||||||
.mode_reg = 0x21000,
|
.mode_reg = 0x21000,
|
||||||
.status_reg = 0x2101c,
|
.status_reg = 0x2101c,
|
||||||
.status_bit = 17,
|
.status_bit = 17,
|
||||||
@@ -295,7 +295,7 @@ static struct clk_pll gpll1 = {
|
|||||||
.l_reg = 0x20004,
|
.l_reg = 0x20004,
|
||||||
.m_reg = 0x20008,
|
.m_reg = 0x20008,
|
||||||
.n_reg = 0x2000c,
|
.n_reg = 0x2000c,
|
||||||
.config_reg = 0x20014,
|
.config_reg = 0x20010,
|
||||||
.mode_reg = 0x20000,
|
.mode_reg = 0x20000,
|
||||||
.status_reg = 0x2001c,
|
.status_reg = 0x2001c,
|
||||||
.status_bit = 17,
|
.status_bit = 17,
|
||||||
@@ -322,7 +322,7 @@ static struct clk_pll gpll2 = {
|
|||||||
.l_reg = 0x4a004,
|
.l_reg = 0x4a004,
|
||||||
.m_reg = 0x4a008,
|
.m_reg = 0x4a008,
|
||||||
.n_reg = 0x4a00c,
|
.n_reg = 0x4a00c,
|
||||||
.config_reg = 0x4a014,
|
.config_reg = 0x4a010,
|
||||||
.mode_reg = 0x4a000,
|
.mode_reg = 0x4a000,
|
||||||
.status_reg = 0x4a01c,
|
.status_reg = 0x4a01c,
|
||||||
.status_bit = 17,
|
.status_bit = 17,
|
||||||
@@ -349,7 +349,7 @@ static struct clk_pll bimc_pll = {
|
|||||||
.l_reg = 0x23004,
|
.l_reg = 0x23004,
|
||||||
.m_reg = 0x23008,
|
.m_reg = 0x23008,
|
||||||
.n_reg = 0x2300c,
|
.n_reg = 0x2300c,
|
||||||
.config_reg = 0x23014,
|
.config_reg = 0x23010,
|
||||||
.mode_reg = 0x23000,
|
.mode_reg = 0x23000,
|
||||||
.status_reg = 0x2301c,
|
.status_reg = 0x2301c,
|
||||||
.status_bit = 17,
|
.status_bit = 17,
|
||||||
|
|||||||
@@ -597,7 +597,7 @@ static const struct samsung_div_clock exynos5800_div_clks[] __initconst = {
|
|||||||
|
|
||||||
static const struct samsung_gate_clock exynos5800_gate_clks[] __initconst = {
|
static const struct samsung_gate_clock exynos5800_gate_clks[] __initconst = {
|
||||||
GATE(CLK_ACLK550_CAM, "aclk550_cam", "mout_user_aclk550_cam",
|
GATE(CLK_ACLK550_CAM, "aclk550_cam", "mout_user_aclk550_cam",
|
||||||
GATE_BUS_TOP, 24, 0, 0),
|
GATE_BUS_TOP, 24, CLK_IS_CRITICAL, 0),
|
||||||
GATE(CLK_ACLK432_SCALER, "aclk432_scaler", "mout_user_aclk432_scaler",
|
GATE(CLK_ACLK432_SCALER, "aclk432_scaler", "mout_user_aclk432_scaler",
|
||||||
GATE_BUS_TOP, 27, CLK_IS_CRITICAL, 0),
|
GATE_BUS_TOP, 27, CLK_IS_CRITICAL, 0),
|
||||||
GATE(CLK_MAU_EPLL, "mau_epll", "mout_user_mau_epll",
|
GATE(CLK_MAU_EPLL, "mau_epll", "mout_user_mau_epll",
|
||||||
@@ -984,25 +984,25 @@ static const struct samsung_gate_clock exynos5x_gate_clks[] __initconst = {
|
|||||||
GATE(0, "aclk300_jpeg", "mout_user_aclk300_jpeg",
|
GATE(0, "aclk300_jpeg", "mout_user_aclk300_jpeg",
|
||||||
GATE_BUS_TOP, 4, CLK_IGNORE_UNUSED, 0),
|
GATE_BUS_TOP, 4, CLK_IGNORE_UNUSED, 0),
|
||||||
GATE(0, "aclk333_432_isp0", "mout_user_aclk333_432_isp0",
|
GATE(0, "aclk333_432_isp0", "mout_user_aclk333_432_isp0",
|
||||||
GATE_BUS_TOP, 5, 0, 0),
|
GATE_BUS_TOP, 5, CLK_IS_CRITICAL, 0),
|
||||||
GATE(0, "aclk300_gscl", "mout_user_aclk300_gscl",
|
GATE(0, "aclk300_gscl", "mout_user_aclk300_gscl",
|
||||||
GATE_BUS_TOP, 6, CLK_IS_CRITICAL, 0),
|
GATE_BUS_TOP, 6, CLK_IS_CRITICAL, 0),
|
||||||
GATE(0, "aclk333_432_gscl", "mout_user_aclk333_432_gscl",
|
GATE(0, "aclk333_432_gscl", "mout_user_aclk333_432_gscl",
|
||||||
GATE_BUS_TOP, 7, CLK_IGNORE_UNUSED, 0),
|
GATE_BUS_TOP, 7, CLK_IGNORE_UNUSED, 0),
|
||||||
GATE(0, "aclk333_432_isp", "mout_user_aclk333_432_isp",
|
GATE(0, "aclk333_432_isp", "mout_user_aclk333_432_isp",
|
||||||
GATE_BUS_TOP, 8, 0, 0),
|
GATE_BUS_TOP, 8, CLK_IS_CRITICAL, 0),
|
||||||
GATE(CLK_PCLK66_GPIO, "pclk66_gpio", "mout_user_pclk66_gpio",
|
GATE(CLK_PCLK66_GPIO, "pclk66_gpio", "mout_user_pclk66_gpio",
|
||||||
GATE_BUS_TOP, 9, CLK_IGNORE_UNUSED, 0),
|
GATE_BUS_TOP, 9, CLK_IGNORE_UNUSED, 0),
|
||||||
GATE(0, "aclk66_psgen", "mout_user_aclk66_psgen",
|
GATE(0, "aclk66_psgen", "mout_user_aclk66_psgen",
|
||||||
GATE_BUS_TOP, 10, CLK_IGNORE_UNUSED, 0),
|
GATE_BUS_TOP, 10, CLK_IGNORE_UNUSED, 0),
|
||||||
GATE(0, "aclk266_isp", "mout_user_aclk266_isp",
|
GATE(0, "aclk266_isp", "mout_user_aclk266_isp",
|
||||||
GATE_BUS_TOP, 13, 0, 0),
|
GATE_BUS_TOP, 13, CLK_IS_CRITICAL, 0),
|
||||||
GATE(0, "aclk166", "mout_user_aclk166",
|
GATE(0, "aclk166", "mout_user_aclk166",
|
||||||
GATE_BUS_TOP, 14, CLK_IGNORE_UNUSED, 0),
|
GATE_BUS_TOP, 14, CLK_IGNORE_UNUSED, 0),
|
||||||
GATE(CLK_ACLK333, "aclk333", "mout_user_aclk333",
|
GATE(CLK_ACLK333, "aclk333", "mout_user_aclk333",
|
||||||
GATE_BUS_TOP, 15, CLK_IS_CRITICAL, 0),
|
GATE_BUS_TOP, 15, CLK_IS_CRITICAL, 0),
|
||||||
GATE(0, "aclk400_isp", "mout_user_aclk400_isp",
|
GATE(0, "aclk400_isp", "mout_user_aclk400_isp",
|
||||||
GATE_BUS_TOP, 16, 0, 0),
|
GATE_BUS_TOP, 16, CLK_IS_CRITICAL, 0),
|
||||||
GATE(0, "aclk400_mscl", "mout_user_aclk400_mscl",
|
GATE(0, "aclk400_mscl", "mout_user_aclk400_mscl",
|
||||||
GATE_BUS_TOP, 17, CLK_IS_CRITICAL, 0),
|
GATE_BUS_TOP, 17, CLK_IS_CRITICAL, 0),
|
||||||
GATE(0, "aclk200_disp1", "mout_user_aclk200_disp1",
|
GATE(0, "aclk200_disp1", "mout_user_aclk200_disp1",
|
||||||
@@ -1208,8 +1208,10 @@ static const struct samsung_gate_clock exynos5x_gate_clks[] __initconst = {
|
|||||||
GATE_IP_GSCL1, 3, 0, 0),
|
GATE_IP_GSCL1, 3, 0, 0),
|
||||||
GATE(CLK_SMMU_FIMCL1, "smmu_fimcl1", "dout_gscl_blk_333",
|
GATE(CLK_SMMU_FIMCL1, "smmu_fimcl1", "dout_gscl_blk_333",
|
||||||
GATE_IP_GSCL1, 4, 0, 0),
|
GATE_IP_GSCL1, 4, 0, 0),
|
||||||
GATE(CLK_GSCL_WA, "gscl_wa", "sclk_gscl_wa", GATE_IP_GSCL1, 12, 0, 0),
|
GATE(CLK_GSCL_WA, "gscl_wa", "sclk_gscl_wa", GATE_IP_GSCL1, 12,
|
||||||
GATE(CLK_GSCL_WB, "gscl_wb", "sclk_gscl_wb", GATE_IP_GSCL1, 13, 0, 0),
|
CLK_IS_CRITICAL, 0),
|
||||||
|
GATE(CLK_GSCL_WB, "gscl_wb", "sclk_gscl_wb", GATE_IP_GSCL1, 13,
|
||||||
|
CLK_IS_CRITICAL, 0),
|
||||||
GATE(CLK_SMMU_FIMCL3, "smmu_fimcl3,", "dout_gscl_blk_333",
|
GATE(CLK_SMMU_FIMCL3, "smmu_fimcl3,", "dout_gscl_blk_333",
|
||||||
GATE_IP_GSCL1, 16, 0, 0),
|
GATE_IP_GSCL1, 16, 0, 0),
|
||||||
GATE(CLK_FIMC_LITE3, "fimc_lite3", "aclk333_432_gscl",
|
GATE(CLK_FIMC_LITE3, "fimc_lite3", "aclk333_432_gscl",
|
||||||
|
|||||||
@@ -1680,7 +1680,8 @@ static const struct samsung_gate_clock peric_gate_clks[] __initconst = {
|
|||||||
GATE(CLK_SCLK_PCM1, "sclk_pcm1", "sclk_pcm1_peric",
|
GATE(CLK_SCLK_PCM1, "sclk_pcm1", "sclk_pcm1_peric",
|
||||||
ENABLE_SCLK_PERIC, 7, CLK_SET_RATE_PARENT, 0),
|
ENABLE_SCLK_PERIC, 7, CLK_SET_RATE_PARENT, 0),
|
||||||
GATE(CLK_SCLK_I2S1, "sclk_i2s1", "sclk_i2s1_peric",
|
GATE(CLK_SCLK_I2S1, "sclk_i2s1", "sclk_i2s1_peric",
|
||||||
ENABLE_SCLK_PERIC, 6, CLK_SET_RATE_PARENT, 0),
|
ENABLE_SCLK_PERIC, 6,
|
||||||
|
CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 0),
|
||||||
GATE(CLK_SCLK_SPI2, "sclk_spi2", "sclk_spi2_peric", ENABLE_SCLK_PERIC,
|
GATE(CLK_SCLK_SPI2, "sclk_spi2", "sclk_spi2_peric", ENABLE_SCLK_PERIC,
|
||||||
5, CLK_SET_RATE_PARENT, 0),
|
5, CLK_SET_RATE_PARENT, 0),
|
||||||
GATE(CLK_SCLK_SPI1, "sclk_spi1", "sclk_spi1_peric", ENABLE_SCLK_PERIC,
|
GATE(CLK_SCLK_SPI1, "sclk_spi1", "sclk_spi1_peric", ENABLE_SCLK_PERIC,
|
||||||
|
|||||||
@@ -105,7 +105,7 @@ static unsigned long _sprd_pll_recalc_rate(const struct sprd_pll *pll,
|
|||||||
|
|
||||||
cfg = kcalloc(regs_num, sizeof(*cfg), GFP_KERNEL);
|
cfg = kcalloc(regs_num, sizeof(*cfg), GFP_KERNEL);
|
||||||
if (!cfg)
|
if (!cfg)
|
||||||
return -ENOMEM;
|
return parent_rate;
|
||||||
|
|
||||||
for (i = 0; i < regs_num; i++)
|
for (i = 0; i < regs_num; i++)
|
||||||
cfg[i] = sprd_pll_read(pll, i);
|
cfg[i] = sprd_pll_read(pll, i);
|
||||||
|
|||||||
@@ -373,6 +373,7 @@ static void __init st_of_flexgen_setup(struct device_node *np)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
flex_flags &= ~CLK_IS_CRITICAL;
|
||||||
of_clk_detect_critical(np, i, &flex_flags);
|
of_clk_detect_critical(np, i, &flex_flags);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -98,7 +98,7 @@ static void sun6i_a31_get_pll1_factors(struct factors_request *req)
|
|||||||
* Round down the frequency to the closest multiple of either
|
* Round down the frequency to the closest multiple of either
|
||||||
* 6 or 16
|
* 6 or 16
|
||||||
*/
|
*/
|
||||||
u32 round_freq_6 = round_down(freq_mhz, 6);
|
u32 round_freq_6 = rounddown(freq_mhz, 6);
|
||||||
u32 round_freq_16 = round_down(freq_mhz, 16);
|
u32 round_freq_16 = round_down(freq_mhz, 16);
|
||||||
|
|
||||||
if (round_freq_6 > round_freq_16)
|
if (round_freq_6 > round_freq_16)
|
||||||
|
|||||||
@@ -196,6 +196,7 @@ static void __init _register_composite(void *user,
|
|||||||
if (!cclk->comp_clks[i])
|
if (!cclk->comp_clks[i])
|
||||||
continue;
|
continue;
|
||||||
list_del(&cclk->comp_clks[i]->link);
|
list_del(&cclk->comp_clks[i]->link);
|
||||||
|
kfree(cclk->comp_clks[i]->parent_names);
|
||||||
kfree(cclk->comp_clks[i]);
|
kfree(cclk->comp_clks[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -168,8 +168,6 @@ struct omap_sham_hmac_ctx {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct omap_sham_ctx {
|
struct omap_sham_ctx {
|
||||||
struct omap_sham_dev *dd;
|
|
||||||
|
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
/* fallback stuff */
|
/* fallback stuff */
|
||||||
@@ -921,27 +919,35 @@ static int omap_sham_update_dma_stop(struct omap_sham_dev *dd)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct omap_sham_dev *omap_sham_find_dev(struct omap_sham_reqctx *ctx)
|
||||||
|
{
|
||||||
|
struct omap_sham_dev *dd;
|
||||||
|
|
||||||
|
if (ctx->dd)
|
||||||
|
return ctx->dd;
|
||||||
|
|
||||||
|
spin_lock_bh(&sham.lock);
|
||||||
|
dd = list_first_entry(&sham.dev_list, struct omap_sham_dev, list);
|
||||||
|
list_move_tail(&dd->list, &sham.dev_list);
|
||||||
|
ctx->dd = dd;
|
||||||
|
spin_unlock_bh(&sham.lock);
|
||||||
|
|
||||||
|
return dd;
|
||||||
|
}
|
||||||
|
|
||||||
static int omap_sham_init(struct ahash_request *req)
|
static int omap_sham_init(struct ahash_request *req)
|
||||||
{
|
{
|
||||||
struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
|
struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
|
||||||
struct omap_sham_ctx *tctx = crypto_ahash_ctx(tfm);
|
struct omap_sham_ctx *tctx = crypto_ahash_ctx(tfm);
|
||||||
struct omap_sham_reqctx *ctx = ahash_request_ctx(req);
|
struct omap_sham_reqctx *ctx = ahash_request_ctx(req);
|
||||||
struct omap_sham_dev *dd = NULL, *tmp;
|
struct omap_sham_dev *dd;
|
||||||
int bs = 0;
|
int bs = 0;
|
||||||
|
|
||||||
spin_lock_bh(&sham.lock);
|
ctx->dd = NULL;
|
||||||
if (!tctx->dd) {
|
|
||||||
list_for_each_entry(tmp, &sham.dev_list, list) {
|
|
||||||
dd = tmp;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
tctx->dd = dd;
|
|
||||||
} else {
|
|
||||||
dd = tctx->dd;
|
|
||||||
}
|
|
||||||
spin_unlock_bh(&sham.lock);
|
|
||||||
|
|
||||||
ctx->dd = dd;
|
dd = omap_sham_find_dev(ctx);
|
||||||
|
if (!dd)
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
ctx->flags = 0;
|
ctx->flags = 0;
|
||||||
|
|
||||||
@@ -1191,8 +1197,7 @@ static int omap_sham_handle_queue(struct omap_sham_dev *dd,
|
|||||||
static int omap_sham_enqueue(struct ahash_request *req, unsigned int op)
|
static int omap_sham_enqueue(struct ahash_request *req, unsigned int op)
|
||||||
{
|
{
|
||||||
struct omap_sham_reqctx *ctx = ahash_request_ctx(req);
|
struct omap_sham_reqctx *ctx = ahash_request_ctx(req);
|
||||||
struct omap_sham_ctx *tctx = crypto_tfm_ctx(req->base.tfm);
|
struct omap_sham_dev *dd = ctx->dd;
|
||||||
struct omap_sham_dev *dd = tctx->dd;
|
|
||||||
|
|
||||||
ctx->op = op;
|
ctx->op = op;
|
||||||
|
|
||||||
@@ -1202,7 +1207,7 @@ static int omap_sham_enqueue(struct ahash_request *req, unsigned int op)
|
|||||||
static int omap_sham_update(struct ahash_request *req)
|
static int omap_sham_update(struct ahash_request *req)
|
||||||
{
|
{
|
||||||
struct omap_sham_reqctx *ctx = ahash_request_ctx(req);
|
struct omap_sham_reqctx *ctx = ahash_request_ctx(req);
|
||||||
struct omap_sham_dev *dd = ctx->dd;
|
struct omap_sham_dev *dd = omap_sham_find_dev(ctx);
|
||||||
|
|
||||||
if (!req->nbytes)
|
if (!req->nbytes)
|
||||||
return 0;
|
return 0;
|
||||||
@@ -1307,21 +1312,8 @@ static int omap_sham_setkey(struct crypto_ahash *tfm, const u8 *key,
|
|||||||
struct omap_sham_hmac_ctx *bctx = tctx->base;
|
struct omap_sham_hmac_ctx *bctx = tctx->base;
|
||||||
int bs = crypto_shash_blocksize(bctx->shash);
|
int bs = crypto_shash_blocksize(bctx->shash);
|
||||||
int ds = crypto_shash_digestsize(bctx->shash);
|
int ds = crypto_shash_digestsize(bctx->shash);
|
||||||
struct omap_sham_dev *dd = NULL, *tmp;
|
|
||||||
int err, i;
|
int err, i;
|
||||||
|
|
||||||
spin_lock_bh(&sham.lock);
|
|
||||||
if (!tctx->dd) {
|
|
||||||
list_for_each_entry(tmp, &sham.dev_list, list) {
|
|
||||||
dd = tmp;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
tctx->dd = dd;
|
|
||||||
} else {
|
|
||||||
dd = tctx->dd;
|
|
||||||
}
|
|
||||||
spin_unlock_bh(&sham.lock);
|
|
||||||
|
|
||||||
err = crypto_shash_setkey(tctx->fallback, key, keylen);
|
err = crypto_shash_setkey(tctx->fallback, key, keylen);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
@@ -1339,7 +1331,7 @@ static int omap_sham_setkey(struct crypto_ahash *tfm, const u8 *key,
|
|||||||
|
|
||||||
memset(bctx->ipad + keylen, 0, bs - keylen);
|
memset(bctx->ipad + keylen, 0, bs - keylen);
|
||||||
|
|
||||||
if (!test_bit(FLAGS_AUTO_XOR, &dd->flags)) {
|
if (!test_bit(FLAGS_AUTO_XOR, &sham.flags)) {
|
||||||
memcpy(bctx->opad, bctx->ipad, bs);
|
memcpy(bctx->opad, bctx->ipad, bs);
|
||||||
|
|
||||||
for (i = 0; i < bs; i++) {
|
for (i = 0; i < bs; i++) {
|
||||||
@@ -2142,6 +2134,7 @@ static int omap_sham_probe(struct platform_device *pdev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
dd->flags |= dd->pdata->flags;
|
dd->flags |= dd->pdata->flags;
|
||||||
|
sham.flags |= dd->pdata->flags;
|
||||||
|
|
||||||
pm_runtime_use_autosuspend(dev);
|
pm_runtime_use_autosuspend(dev);
|
||||||
pm_runtime_set_autosuspend_delay(dev, DEFAULT_AUTOSUSPEND_DELAY);
|
pm_runtime_set_autosuspend_delay(dev, DEFAULT_AUTOSUSPEND_DELAY);
|
||||||
@@ -2169,6 +2162,9 @@ static int omap_sham_probe(struct platform_device *pdev)
|
|||||||
spin_unlock(&sham.lock);
|
spin_unlock(&sham.lock);
|
||||||
|
|
||||||
for (i = 0; i < dd->pdata->algs_info_size; i++) {
|
for (i = 0; i < dd->pdata->algs_info_size; i++) {
|
||||||
|
if (dd->pdata->algs_info[i].registered)
|
||||||
|
break;
|
||||||
|
|
||||||
for (j = 0; j < dd->pdata->algs_info[i].size; j++) {
|
for (j = 0; j < dd->pdata->algs_info[i].size; j++) {
|
||||||
struct ahash_alg *alg;
|
struct ahash_alg *alg;
|
||||||
|
|
||||||
@@ -2220,9 +2216,11 @@ static int omap_sham_remove(struct platform_device *pdev)
|
|||||||
list_del(&dd->list);
|
list_del(&dd->list);
|
||||||
spin_unlock(&sham.lock);
|
spin_unlock(&sham.lock);
|
||||||
for (i = dd->pdata->algs_info_size - 1; i >= 0; i--)
|
for (i = dd->pdata->algs_info_size - 1; i >= 0; i--)
|
||||||
for (j = dd->pdata->algs_info[i].registered - 1; j >= 0; j--)
|
for (j = dd->pdata->algs_info[i].registered - 1; j >= 0; j--) {
|
||||||
crypto_unregister_ahash(
|
crypto_unregister_ahash(
|
||||||
&dd->pdata->algs_info[i].algs_list[j]);
|
&dd->pdata->algs_info[i].algs_list[j]);
|
||||||
|
dd->pdata->algs_info[i].registered--;
|
||||||
|
}
|
||||||
tasklet_kill(&dd->done_task);
|
tasklet_kill(&dd->done_task);
|
||||||
pm_runtime_disable(&pdev->dev);
|
pm_runtime_disable(&pdev->dev);
|
||||||
|
|
||||||
|
|||||||
@@ -128,7 +128,7 @@ static int adc_jack_probe(struct platform_device *pdev)
|
|||||||
for (i = 0; data->adc_conditions[i].id != EXTCON_NONE; i++);
|
for (i = 0; data->adc_conditions[i].id != EXTCON_NONE; i++);
|
||||||
data->num_conditions = i;
|
data->num_conditions = i;
|
||||||
|
|
||||||
data->chan = iio_channel_get(&pdev->dev, pdata->consumer_channel);
|
data->chan = devm_iio_channel_get(&pdev->dev, pdata->consumer_channel);
|
||||||
if (IS_ERR(data->chan))
|
if (IS_ERR(data->chan))
|
||||||
return PTR_ERR(data->chan);
|
return PTR_ERR(data->chan);
|
||||||
|
|
||||||
@@ -170,7 +170,6 @@ static int adc_jack_remove(struct platform_device *pdev)
|
|||||||
|
|
||||||
free_irq(data->irq, data);
|
free_irq(data->irq, data);
|
||||||
cancel_work_sync(&data->handler.work);
|
cancel_work_sync(&data->handler.work);
|
||||||
iio_channel_release(data->chan);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,7 +18,6 @@
|
|||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/cpumask.h>
|
#include <linux/cpumask.h>
|
||||||
#include <linux/export.h>
|
#include <linux/export.h>
|
||||||
#include <linux/dma-direct.h>
|
|
||||||
#include <linux/dma-mapping.h>
|
#include <linux/dma-mapping.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
@@ -449,8 +448,7 @@ int qcom_scm_assign_mem(phys_addr_t mem_addr, size_t mem_sz,
|
|||||||
struct qcom_scm_mem_map_info *mem_to_map;
|
struct qcom_scm_mem_map_info *mem_to_map;
|
||||||
phys_addr_t mem_to_map_phys;
|
phys_addr_t mem_to_map_phys;
|
||||||
phys_addr_t dest_phys;
|
phys_addr_t dest_phys;
|
||||||
phys_addr_t ptr_phys;
|
dma_addr_t ptr_phys;
|
||||||
dma_addr_t ptr_dma;
|
|
||||||
size_t mem_to_map_sz;
|
size_t mem_to_map_sz;
|
||||||
size_t dest_sz;
|
size_t dest_sz;
|
||||||
size_t src_sz;
|
size_t src_sz;
|
||||||
@@ -468,10 +466,9 @@ int qcom_scm_assign_mem(phys_addr_t mem_addr, size_t mem_sz,
|
|||||||
ptr_sz = ALIGN(src_sz, SZ_64) + ALIGN(mem_to_map_sz, SZ_64) +
|
ptr_sz = ALIGN(src_sz, SZ_64) + ALIGN(mem_to_map_sz, SZ_64) +
|
||||||
ALIGN(dest_sz, SZ_64);
|
ALIGN(dest_sz, SZ_64);
|
||||||
|
|
||||||
ptr = dma_alloc_coherent(__scm->dev, ptr_sz, &ptr_dma, GFP_KERNEL);
|
ptr = dma_alloc_coherent(__scm->dev, ptr_sz, &ptr_phys, GFP_KERNEL);
|
||||||
if (!ptr)
|
if (!ptr)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
ptr_phys = dma_to_phys(__scm->dev, ptr_dma);
|
|
||||||
|
|
||||||
/* Fill source vmid detail */
|
/* Fill source vmid detail */
|
||||||
src = ptr;
|
src = ptr;
|
||||||
@@ -501,7 +498,7 @@ int qcom_scm_assign_mem(phys_addr_t mem_addr, size_t mem_sz,
|
|||||||
|
|
||||||
ret = __qcom_scm_assign_mem(__scm->dev, mem_to_map_phys, mem_to_map_sz,
|
ret = __qcom_scm_assign_mem(__scm->dev, mem_to_map_phys, mem_to_map_sz,
|
||||||
ptr_phys, src_sz, dest_phys, dest_sz);
|
ptr_phys, src_sz, dest_phys, dest_sz);
|
||||||
dma_free_coherent(__scm->dev, ptr_sz, ptr, ptr_dma);
|
dma_free_coherent(__scm->dev, ptr_sz, ptr, ptr_phys);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_err(__scm->dev,
|
dev_err(__scm->dev,
|
||||||
"Assign memory protection call failed %d.\n", ret);
|
"Assign memory protection call failed %d.\n", ret);
|
||||||
|
|||||||
@@ -106,10 +106,10 @@ static int afu_dma_pin_pages(struct dfl_feature_platform_data *pdata,
|
|||||||
region->pages);
|
region->pages);
|
||||||
if (pinned < 0) {
|
if (pinned < 0) {
|
||||||
ret = pinned;
|
ret = pinned;
|
||||||
goto put_pages;
|
goto free_pages;
|
||||||
} else if (pinned != npages) {
|
} else if (pinned != npages) {
|
||||||
ret = -EFAULT;
|
ret = -EFAULT;
|
||||||
goto free_pages;
|
goto put_pages;
|
||||||
}
|
}
|
||||||
|
|
||||||
dev_dbg(dev, "%d pages pinned\n", pinned);
|
dev_dbg(dev, "%d pages pinned\n", pinned);
|
||||||
|
|||||||
@@ -51,7 +51,9 @@
|
|||||||
#define GPIO_EXT_PORTC 0x58
|
#define GPIO_EXT_PORTC 0x58
|
||||||
#define GPIO_EXT_PORTD 0x5c
|
#define GPIO_EXT_PORTD 0x5c
|
||||||
|
|
||||||
|
#define DWAPB_DRIVER_NAME "gpio-dwapb"
|
||||||
#define DWAPB_MAX_PORTS 4
|
#define DWAPB_MAX_PORTS 4
|
||||||
|
|
||||||
#define GPIO_EXT_PORT_STRIDE 0x04 /* register stride 32 bits */
|
#define GPIO_EXT_PORT_STRIDE 0x04 /* register stride 32 bits */
|
||||||
#define GPIO_SWPORT_DR_STRIDE 0x0c /* register stride 3*32 bits */
|
#define GPIO_SWPORT_DR_STRIDE 0x0c /* register stride 3*32 bits */
|
||||||
#define GPIO_SWPORT_DDR_STRIDE 0x0c /* register stride 3*32 bits */
|
#define GPIO_SWPORT_DDR_STRIDE 0x0c /* register stride 3*32 bits */
|
||||||
@@ -400,7 +402,7 @@ static void dwapb_configure_irqs(struct dwapb_gpio *gpio,
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
err = irq_alloc_domain_generic_chips(gpio->domain, ngpio, 2,
|
err = irq_alloc_domain_generic_chips(gpio->domain, ngpio, 2,
|
||||||
"gpio-dwapb", handle_level_irq,
|
DWAPB_DRIVER_NAME, handle_level_irq,
|
||||||
IRQ_NOREQUEST, 0,
|
IRQ_NOREQUEST, 0,
|
||||||
IRQ_GC_INIT_NESTED_LOCK);
|
IRQ_GC_INIT_NESTED_LOCK);
|
||||||
if (err) {
|
if (err) {
|
||||||
@@ -457,7 +459,7 @@ static void dwapb_configure_irqs(struct dwapb_gpio *gpio,
|
|||||||
*/
|
*/
|
||||||
err = devm_request_irq(gpio->dev, pp->irq[0],
|
err = devm_request_irq(gpio->dev, pp->irq[0],
|
||||||
dwapb_irq_handler_mfd,
|
dwapb_irq_handler_mfd,
|
||||||
IRQF_SHARED, "gpio-dwapb-mfd", gpio);
|
IRQF_SHARED, DWAPB_DRIVER_NAME, gpio);
|
||||||
if (err) {
|
if (err) {
|
||||||
dev_err(gpio->dev, "error requesting IRQ\n");
|
dev_err(gpio->dev, "error requesting IRQ\n");
|
||||||
irq_domain_remove(gpio->domain);
|
irq_domain_remove(gpio->domain);
|
||||||
@@ -535,26 +537,33 @@ static int dwapb_gpio_add_port(struct dwapb_gpio *gpio,
|
|||||||
dwapb_configure_irqs(gpio, port, pp);
|
dwapb_configure_irqs(gpio, port, pp);
|
||||||
|
|
||||||
err = gpiochip_add_data(&port->gc, port);
|
err = gpiochip_add_data(&port->gc, port);
|
||||||
if (err)
|
if (err) {
|
||||||
dev_err(gpio->dev, "failed to register gpiochip for port%d\n",
|
dev_err(gpio->dev, "failed to register gpiochip for port%d\n",
|
||||||
port->idx);
|
port->idx);
|
||||||
else
|
return err;
|
||||||
port->is_registered = true;
|
}
|
||||||
|
|
||||||
/* Add GPIO-signaled ACPI event support */
|
/* Add GPIO-signaled ACPI event support */
|
||||||
if (pp->has_irq)
|
acpi_gpiochip_request_interrupts(&port->gc);
|
||||||
acpi_gpiochip_request_interrupts(&port->gc);
|
|
||||||
|
|
||||||
return err;
|
port->is_registered = true;
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dwapb_gpio_unregister(struct dwapb_gpio *gpio)
|
static void dwapb_gpio_unregister(struct dwapb_gpio *gpio)
|
||||||
{
|
{
|
||||||
unsigned int m;
|
unsigned int m;
|
||||||
|
|
||||||
for (m = 0; m < gpio->nr_ports; ++m)
|
for (m = 0; m < gpio->nr_ports; ++m) {
|
||||||
if (gpio->ports[m].is_registered)
|
struct dwapb_gpio_port *port = &gpio->ports[m];
|
||||||
gpiochip_remove(&gpio->ports[m].gc);
|
|
||||||
|
if (!port->is_registered)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
acpi_gpiochip_free_interrupts(&port->gc);
|
||||||
|
gpiochip_remove(&port->gc);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct dwapb_platform_data *
|
static struct dwapb_platform_data *
|
||||||
@@ -842,7 +851,7 @@ static SIMPLE_DEV_PM_OPS(dwapb_gpio_pm_ops, dwapb_gpio_suspend,
|
|||||||
|
|
||||||
static struct platform_driver dwapb_gpio_driver = {
|
static struct platform_driver dwapb_gpio_driver = {
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "gpio-dwapb",
|
.name = DWAPB_DRIVER_NAME,
|
||||||
.pm = &dwapb_gpio_pm_ops,
|
.pm = &dwapb_gpio_pm_ops,
|
||||||
.of_match_table = of_match_ptr(dwapb_of_match),
|
.of_match_table = of_match_ptr(dwapb_of_match),
|
||||||
.acpi_match_table = ACPI_PTR(dwapb_acpi_match),
|
.acpi_match_table = ACPI_PTR(dwapb_acpi_match),
|
||||||
@@ -856,3 +865,4 @@ module_platform_driver(dwapb_gpio_driver);
|
|||||||
MODULE_LICENSE("GPL");
|
MODULE_LICENSE("GPL");
|
||||||
MODULE_AUTHOR("Jamie Iles");
|
MODULE_AUTHOR("Jamie Iles");
|
||||||
MODULE_DESCRIPTION("Synopsys DesignWare APB GPIO driver");
|
MODULE_DESCRIPTION("Synopsys DesignWare APB GPIO driver");
|
||||||
|
MODULE_ALIAS("platform:" DWAPB_DRIVER_NAME);
|
||||||
|
|||||||
@@ -238,7 +238,7 @@ static void ci_initialize_power_tune_defaults(struct pp_hwmgr *hwmgr)
|
|||||||
|
|
||||||
switch (dev_id) {
|
switch (dev_id) {
|
||||||
case 0x67BA:
|
case 0x67BA:
|
||||||
case 0x66B1:
|
case 0x67B1:
|
||||||
smu_data->power_tune_defaults = &defaults_hawaii_pro;
|
smu_data->power_tune_defaults = &defaults_hawaii_pro;
|
||||||
break;
|
break;
|
||||||
case 0x67B8:
|
case 0x67B8:
|
||||||
|
|||||||
@@ -29,6 +29,7 @@
|
|||||||
#include <linux/i2c.h>
|
#include <linux/i2c.h>
|
||||||
#include <drm/drm_dp_mst_helper.h>
|
#include <drm/drm_dp_mst_helper.h>
|
||||||
#include <drm/drmP.h>
|
#include <drm/drmP.h>
|
||||||
|
#include <linux/iopoll.h>
|
||||||
|
|
||||||
#include <drm/drm_fixed.h>
|
#include <drm/drm_fixed.h>
|
||||||
#include <drm/drm_atomic.h>
|
#include <drm/drm_atomic.h>
|
||||||
@@ -2889,6 +2890,17 @@ static int drm_dp_dpcd_write_payload(struct drm_dp_mst_topology_mgr *mgr,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int do_get_act_status(struct drm_dp_aux *aux)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
u8 status;
|
||||||
|
|
||||||
|
ret = drm_dp_dpcd_readb(aux, DP_PAYLOAD_TABLE_UPDATE_STATUS, &status);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* drm_dp_check_act_status() - Check ACT handled status.
|
* drm_dp_check_act_status() - Check ACT handled status.
|
||||||
@@ -2898,33 +2910,29 @@ static int drm_dp_dpcd_write_payload(struct drm_dp_mst_topology_mgr *mgr,
|
|||||||
*/
|
*/
|
||||||
int drm_dp_check_act_status(struct drm_dp_mst_topology_mgr *mgr)
|
int drm_dp_check_act_status(struct drm_dp_mst_topology_mgr *mgr)
|
||||||
{
|
{
|
||||||
u8 status;
|
/*
|
||||||
int ret;
|
* There doesn't seem to be any recommended retry count or timeout in
|
||||||
int count = 0;
|
* the MST specification. Since some hubs have been observed to take
|
||||||
|
* over 1 second to update their payload allocations under certain
|
||||||
|
* conditions, we use a rather large timeout value.
|
||||||
|
*/
|
||||||
|
const int timeout_ms = 3000;
|
||||||
|
int ret, status;
|
||||||
|
|
||||||
do {
|
ret = readx_poll_timeout(do_get_act_status, mgr->aux, status,
|
||||||
ret = drm_dp_dpcd_readb(mgr->aux, DP_PAYLOAD_TABLE_UPDATE_STATUS, &status);
|
status & DP_PAYLOAD_ACT_HANDLED || status < 0,
|
||||||
|
200, timeout_ms * USEC_PER_MSEC);
|
||||||
if (ret < 0) {
|
if (ret < 0 && status >= 0) {
|
||||||
DRM_DEBUG_KMS("failed to read payload table status %d\n", ret);
|
DRM_DEBUG_KMS("Failed to get ACT after %dms, last status: %02x\n",
|
||||||
goto fail;
|
timeout_ms, status);
|
||||||
}
|
return -EINVAL;
|
||||||
|
} else if (status < 0) {
|
||||||
if (status & DP_PAYLOAD_ACT_HANDLED)
|
DRM_DEBUG_KMS("Failed to read payload table status: %d\n",
|
||||||
break;
|
status);
|
||||||
count++;
|
return status;
|
||||||
udelay(100);
|
|
||||||
|
|
||||||
} while (count < 30);
|
|
||||||
|
|
||||||
if (!(status & DP_PAYLOAD_ACT_HANDLED)) {
|
|
||||||
DRM_DEBUG_KMS("failed to get ACT bit %d after %d retries\n", status, count);
|
|
||||||
ret = -EINVAL;
|
|
||||||
goto fail;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
fail:
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(drm_dp_check_act_status);
|
EXPORT_SYMBOL(drm_dp_check_act_status);
|
||||||
|
|
||||||
|
|||||||
@@ -84,7 +84,7 @@ int drm_i2c_encoder_init(struct drm_device *dev,
|
|||||||
|
|
||||||
err = encoder_drv->encoder_init(client, dev, encoder);
|
err = encoder_drv->encoder_init(client, dev, encoder);
|
||||||
if (err)
|
if (err)
|
||||||
goto fail_unregister;
|
goto fail_module_put;
|
||||||
|
|
||||||
if (info->platform_data)
|
if (info->platform_data)
|
||||||
encoder->slave_funcs->set_config(&encoder->base,
|
encoder->slave_funcs->set_config(&encoder->base,
|
||||||
@@ -92,9 +92,10 @@ int drm_i2c_encoder_init(struct drm_device *dev,
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
fail_module_put:
|
||||||
|
module_put(module);
|
||||||
fail_unregister:
|
fail_unregister:
|
||||||
i2c_unregister_device(client);
|
i2c_unregister_device(client);
|
||||||
module_put(module);
|
|
||||||
fail:
|
fail:
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -570,6 +570,9 @@ struct drm_i915_reg_descriptor {
|
|||||||
#define REG32(_reg, ...) \
|
#define REG32(_reg, ...) \
|
||||||
{ .addr = (_reg), __VA_ARGS__ }
|
{ .addr = (_reg), __VA_ARGS__ }
|
||||||
|
|
||||||
|
#define REG32_IDX(_reg, idx) \
|
||||||
|
{ .addr = _reg(idx) }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Convenience macro for adding 64-bit registers.
|
* Convenience macro for adding 64-bit registers.
|
||||||
*
|
*
|
||||||
@@ -667,6 +670,7 @@ static const struct drm_i915_reg_descriptor gen9_blt_regs[] = {
|
|||||||
REG64_IDX(RING_TIMESTAMP, BSD_RING_BASE),
|
REG64_IDX(RING_TIMESTAMP, BSD_RING_BASE),
|
||||||
REG32(BCS_SWCTRL),
|
REG32(BCS_SWCTRL),
|
||||||
REG64_IDX(RING_TIMESTAMP, BLT_RING_BASE),
|
REG64_IDX(RING_TIMESTAMP, BLT_RING_BASE),
|
||||||
|
REG32_IDX(RING_CTX_TIMESTAMP, BLT_RING_BASE),
|
||||||
REG64_IDX(BCS_GPR, 0),
|
REG64_IDX(BCS_GPR, 0),
|
||||||
REG64_IDX(BCS_GPR, 1),
|
REG64_IDX(BCS_GPR, 1),
|
||||||
REG64_IDX(BCS_GPR, 2),
|
REG64_IDX(BCS_GPR, 2),
|
||||||
|
|||||||
@@ -3821,6 +3821,7 @@ static void gen11_hpd_irq_setup(struct drm_i915_private *dev_priv)
|
|||||||
|
|
||||||
val = I915_READ(GEN11_DE_HPD_IMR);
|
val = I915_READ(GEN11_DE_HPD_IMR);
|
||||||
val &= ~hotplug_irqs;
|
val &= ~hotplug_irqs;
|
||||||
|
val |= ~enabled_irqs & hotplug_irqs;
|
||||||
I915_WRITE(GEN11_DE_HPD_IMR, val);
|
I915_WRITE(GEN11_DE_HPD_IMR, val);
|
||||||
POSTING_READ(GEN11_DE_HPD_IMR);
|
POSTING_READ(GEN11_DE_HPD_IMR);
|
||||||
|
|
||||||
|
|||||||
@@ -1021,7 +1021,8 @@ static int mdp5_init(struct platform_device *pdev, struct drm_device *dev)
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
fail:
|
fail:
|
||||||
mdp5_destroy(pdev);
|
if (mdp5_kms)
|
||||||
|
mdp5_destroy(pdev);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -181,7 +181,7 @@ int qxl_device_init(struct qxl_device *qdev,
|
|||||||
&(qdev->ram_header->cursor_ring_hdr),
|
&(qdev->ram_header->cursor_ring_hdr),
|
||||||
sizeof(struct qxl_command),
|
sizeof(struct qxl_command),
|
||||||
QXL_CURSOR_RING_SIZE,
|
QXL_CURSOR_RING_SIZE,
|
||||||
qdev->io_base + QXL_IO_NOTIFY_CMD,
|
qdev->io_base + QXL_IO_NOTIFY_CURSOR,
|
||||||
false,
|
false,
|
||||||
&qdev->cursor_event);
|
&qdev->cursor_event);
|
||||||
|
|
||||||
|
|||||||
@@ -152,7 +152,7 @@
|
|||||||
#define SUN4I_HDMI_DDC_CMD_IMPLICIT_WRITE 3
|
#define SUN4I_HDMI_DDC_CMD_IMPLICIT_WRITE 3
|
||||||
|
|
||||||
#define SUN4I_HDMI_DDC_CLK_REG 0x528
|
#define SUN4I_HDMI_DDC_CLK_REG 0x528
|
||||||
#define SUN4I_HDMI_DDC_CLK_M(m) (((m) & 0x7) << 3)
|
#define SUN4I_HDMI_DDC_CLK_M(m) (((m) & 0xf) << 3)
|
||||||
#define SUN4I_HDMI_DDC_CLK_N(n) ((n) & 0x7)
|
#define SUN4I_HDMI_DDC_CLK_N(n) ((n) & 0x7)
|
||||||
|
|
||||||
#define SUN4I_HDMI_DDC_LINE_CTRL_REG 0x540
|
#define SUN4I_HDMI_DDC_LINE_CTRL_REG 0x540
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ static unsigned long sun4i_ddc_calc_divider(unsigned long rate,
|
|||||||
unsigned long best_rate = 0;
|
unsigned long best_rate = 0;
|
||||||
u8 best_m = 0, best_n = 0, _m, _n;
|
u8 best_m = 0, best_n = 0, _m, _n;
|
||||||
|
|
||||||
for (_m = 0; _m < 8; _m++) {
|
for (_m = 0; _m < 16; _m++) {
|
||||||
for (_n = 0; _n < 8; _n++) {
|
for (_n = 0; _n < 8; _n++) {
|
||||||
unsigned long tmp_rate;
|
unsigned long tmp_rate;
|
||||||
|
|
||||||
|
|||||||
@@ -1124,6 +1124,9 @@
|
|||||||
#define USB_DEVICE_ID_TPV_OPTICAL_TOUCHSCREEN_8882 0x8882
|
#define USB_DEVICE_ID_TPV_OPTICAL_TOUCHSCREEN_8882 0x8882
|
||||||
#define USB_DEVICE_ID_TPV_OPTICAL_TOUCHSCREEN_8883 0x8883
|
#define USB_DEVICE_ID_TPV_OPTICAL_TOUCHSCREEN_8883 0x8883
|
||||||
|
|
||||||
|
#define USB_VENDOR_ID_TRUST 0x145f
|
||||||
|
#define USB_DEVICE_ID_TRUST_PANORA_TABLET 0x0212
|
||||||
|
|
||||||
#define USB_VENDOR_ID_TURBOX 0x062a
|
#define USB_VENDOR_ID_TURBOX 0x062a
|
||||||
#define USB_DEVICE_ID_TURBOX_KEYBOARD 0x0201
|
#define USB_DEVICE_ID_TURBOX_KEYBOARD 0x0201
|
||||||
#define USB_DEVICE_ID_ASUS_MD_5110 0x5110
|
#define USB_DEVICE_ID_ASUS_MD_5110 0x5110
|
||||||
|
|||||||
@@ -168,6 +168,7 @@ static const struct hid_device_id hid_quirks[] = {
|
|||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_TOUCHPACK, USB_DEVICE_ID_TOUCHPACK_RTS), HID_QUIRK_MULTI_INPUT },
|
{ HID_USB_DEVICE(USB_VENDOR_ID_TOUCHPACK, USB_DEVICE_ID_TOUCHPACK_RTS), HID_QUIRK_MULTI_INPUT },
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_TPV, USB_DEVICE_ID_TPV_OPTICAL_TOUCHSCREEN_8882), HID_QUIRK_NOGET },
|
{ HID_USB_DEVICE(USB_VENDOR_ID_TPV, USB_DEVICE_ID_TPV_OPTICAL_TOUCHSCREEN_8882), HID_QUIRK_NOGET },
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_TPV, USB_DEVICE_ID_TPV_OPTICAL_TOUCHSCREEN_8883), HID_QUIRK_NOGET },
|
{ HID_USB_DEVICE(USB_VENDOR_ID_TPV, USB_DEVICE_ID_TPV_OPTICAL_TOUCHSCREEN_8883), HID_QUIRK_NOGET },
|
||||||
|
{ HID_USB_DEVICE(USB_VENDOR_ID_TRUST, USB_DEVICE_ID_TRUST_PANORA_TABLET), HID_QUIRK_MULTI_INPUT | HID_QUIRK_HIDINPUT_FORCE },
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_TURBOX, USB_DEVICE_ID_TURBOX_KEYBOARD), HID_QUIRK_NOGET },
|
{ HID_USB_DEVICE(USB_VENDOR_ID_TURBOX, USB_DEVICE_ID_TURBOX_KEYBOARD), HID_QUIRK_NOGET },
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_KNA5), HID_QUIRK_MULTI_INPUT },
|
{ HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_KNA5), HID_QUIRK_MULTI_INPUT },
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_TWA60), HID_QUIRK_MULTI_INPUT },
|
{ HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_TWA60), HID_QUIRK_MULTI_INPUT },
|
||||||
|
|||||||
@@ -958,7 +958,8 @@ static int piix4_probe(struct pci_dev *dev, const struct pci_device_id *id)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (dev->vendor == PCI_VENDOR_ID_AMD &&
|
if (dev->vendor == PCI_VENDOR_ID_AMD &&
|
||||||
dev->device == PCI_DEVICE_ID_AMD_HUDSON2_SMBUS) {
|
(dev->device == PCI_DEVICE_ID_AMD_HUDSON2_SMBUS ||
|
||||||
|
dev->device == PCI_DEVICE_ID_AMD_KERNCZ_SMBUS)) {
|
||||||
retval = piix4_setup_sb800(dev, id, 1);
|
retval = piix4_setup_sb800(dev, id, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -315,11 +315,10 @@ static void i2c_pxa_scream_blue_murder(struct pxa_i2c *i2c, const char *why)
|
|||||||
dev_err(dev, "IBMR: %08x IDBR: %08x ICR: %08x ISR: %08x\n",
|
dev_err(dev, "IBMR: %08x IDBR: %08x ICR: %08x ISR: %08x\n",
|
||||||
readl(_IBMR(i2c)), readl(_IDBR(i2c)), readl(_ICR(i2c)),
|
readl(_IBMR(i2c)), readl(_IDBR(i2c)), readl(_ICR(i2c)),
|
||||||
readl(_ISR(i2c)));
|
readl(_ISR(i2c)));
|
||||||
dev_dbg(dev, "log: ");
|
dev_err(dev, "log:");
|
||||||
for (i = 0; i < i2c->irqlogidx; i++)
|
for (i = 0; i < i2c->irqlogidx; i++)
|
||||||
pr_debug("[%08x:%08x] ", i2c->isrlog[i], i2c->icrlog[i]);
|
pr_cont(" [%03x:%05x]", i2c->isrlog[i], i2c->icrlog[i]);
|
||||||
|
pr_cont("\n");
|
||||||
pr_debug("\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#else /* ifdef DEBUG */
|
#else /* ifdef DEBUG */
|
||||||
@@ -709,11 +708,9 @@ static inline void i2c_pxa_stop_message(struct pxa_i2c *i2c)
|
|||||||
{
|
{
|
||||||
u32 icr;
|
u32 icr;
|
||||||
|
|
||||||
/*
|
/* Clear the START, STOP, ACK, TB and MA flags */
|
||||||
* Clear the STOP and ACK flags
|
|
||||||
*/
|
|
||||||
icr = readl(_ICR(i2c));
|
icr = readl(_ICR(i2c));
|
||||||
icr &= ~(ICR_STOP | ICR_ACKNAK);
|
icr &= ~(ICR_START | ICR_STOP | ICR_ACKNAK | ICR_TB | ICR_MA);
|
||||||
writel(icr, _ICR(i2c));
|
writel(icr, _ICR(i2c));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -261,6 +261,8 @@ static u32 bmp280_compensate_humidity(struct bmp280_data *data,
|
|||||||
+ (s32)2097152) * calib->H2 + 8192) >> 14);
|
+ (s32)2097152) * calib->H2 + 8192) >> 14);
|
||||||
var -= ((((var >> 15) * (var >> 15)) >> 7) * (s32)calib->H1) >> 4;
|
var -= ((((var >> 15) * (var >> 15)) >> 7) * (s32)calib->H1) >> 4;
|
||||||
|
|
||||||
|
var = clamp_val(var, 0, 419430400);
|
||||||
|
|
||||||
return var >> 12;
|
return var >> 12;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -703,7 +705,7 @@ static int bmp180_measure(struct bmp280_data *data, u8 ctrl_meas)
|
|||||||
unsigned int ctrl;
|
unsigned int ctrl;
|
||||||
|
|
||||||
if (data->use_eoc)
|
if (data->use_eoc)
|
||||||
init_completion(&data->done);
|
reinit_completion(&data->done);
|
||||||
|
|
||||||
ret = regmap_write(data->regmap, BMP280_REG_CTRL_MEAS, ctrl_meas);
|
ret = regmap_write(data->regmap, BMP280_REG_CTRL_MEAS, ctrl_meas);
|
||||||
if (ret)
|
if (ret)
|
||||||
@@ -959,6 +961,9 @@ static int bmp085_fetch_eoc_irq(struct device *dev,
|
|||||||
"trying to enforce it\n");
|
"trying to enforce it\n");
|
||||||
irq_trig = IRQF_TRIGGER_RISING;
|
irq_trig = IRQF_TRIGGER_RISING;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
init_completion(&data->done);
|
||||||
|
|
||||||
ret = devm_request_threaded_irq(dev,
|
ret = devm_request_threaded_irq(dev,
|
||||||
irq,
|
irq,
|
||||||
bmp085_eoc_irq,
|
bmp085_eoc_irq,
|
||||||
|
|||||||
@@ -319,8 +319,21 @@ static struct config_group *make_cma_dev(struct config_group *group,
|
|||||||
return ERR_PTR(err);
|
return ERR_PTR(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void drop_cma_dev(struct config_group *cgroup, struct config_item *item)
|
||||||
|
{
|
||||||
|
struct config_group *group =
|
||||||
|
container_of(item, struct config_group, cg_item);
|
||||||
|
struct cma_dev_group *cma_dev_group =
|
||||||
|
container_of(group, struct cma_dev_group, device_group);
|
||||||
|
|
||||||
|
configfs_remove_default_groups(&cma_dev_group->ports_group);
|
||||||
|
configfs_remove_default_groups(&cma_dev_group->device_group);
|
||||||
|
config_item_put(item);
|
||||||
|
}
|
||||||
|
|
||||||
static struct configfs_group_operations cma_subsys_group_ops = {
|
static struct configfs_group_operations cma_subsys_group_ops = {
|
||||||
.make_group = make_cma_dev,
|
.make_group = make_cma_dev,
|
||||||
|
.drop_item = drop_cma_dev,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct config_item_type cma_subsys_type = {
|
static const struct config_item_type cma_subsys_type = {
|
||||||
|
|||||||
@@ -945,6 +945,7 @@ void c4iw_dealloc(struct uld_ctx *ctx)
|
|||||||
static void c4iw_remove(struct uld_ctx *ctx)
|
static void c4iw_remove(struct uld_ctx *ctx)
|
||||||
{
|
{
|
||||||
pr_debug("c4iw_dev %p\n", ctx->dev);
|
pr_debug("c4iw_dev %p\n", ctx->dev);
|
||||||
|
debugfs_remove_recursive(ctx->dev->debugfs_root);
|
||||||
c4iw_unregister_device(ctx->dev);
|
c4iw_unregister_device(ctx->dev);
|
||||||
c4iw_dealloc(ctx);
|
c4iw_dealloc(ctx);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -328,6 +328,7 @@ static bool devx_is_obj_modify_cmd(const void *in)
|
|||||||
case MLX5_CMD_OP_SET_L2_TABLE_ENTRY:
|
case MLX5_CMD_OP_SET_L2_TABLE_ENTRY:
|
||||||
case MLX5_CMD_OP_RST2INIT_QP:
|
case MLX5_CMD_OP_RST2INIT_QP:
|
||||||
case MLX5_CMD_OP_INIT2RTR_QP:
|
case MLX5_CMD_OP_INIT2RTR_QP:
|
||||||
|
case MLX5_CMD_OP_INIT2INIT_QP:
|
||||||
case MLX5_CMD_OP_RTR2RTS_QP:
|
case MLX5_CMD_OP_RTR2RTS_QP:
|
||||||
case MLX5_CMD_OP_RTS2RTS_QP:
|
case MLX5_CMD_OP_RTS2RTS_QP:
|
||||||
case MLX5_CMD_OP_SQERR2RTS_QP:
|
case MLX5_CMD_OP_SQERR2RTS_QP:
|
||||||
|
|||||||
@@ -1432,7 +1432,7 @@ static int btree_gc_coalesce(struct btree *b, struct btree_op *op,
|
|||||||
if (__set_blocks(n1, n1->keys + n2->keys,
|
if (__set_blocks(n1, n1->keys + n2->keys,
|
||||||
block_bytes(b->c)) >
|
block_bytes(b->c)) >
|
||||||
btree_blocks(new_nodes[i]))
|
btree_blocks(new_nodes[i]))
|
||||||
goto out_nocoalesce;
|
goto out_unlock_nocoalesce;
|
||||||
|
|
||||||
keys = n2->keys;
|
keys = n2->keys;
|
||||||
/* Take the key of the node we're getting rid of */
|
/* Take the key of the node we're getting rid of */
|
||||||
@@ -1461,7 +1461,7 @@ static int btree_gc_coalesce(struct btree *b, struct btree_op *op,
|
|||||||
|
|
||||||
if (__bch_keylist_realloc(&keylist,
|
if (__bch_keylist_realloc(&keylist,
|
||||||
bkey_u64s(&new_nodes[i]->key)))
|
bkey_u64s(&new_nodes[i]->key)))
|
||||||
goto out_nocoalesce;
|
goto out_unlock_nocoalesce;
|
||||||
|
|
||||||
bch_btree_node_write(new_nodes[i], &cl);
|
bch_btree_node_write(new_nodes[i], &cl);
|
||||||
bch_keylist_add(&keylist, &new_nodes[i]->key);
|
bch_keylist_add(&keylist, &new_nodes[i]->key);
|
||||||
@@ -1507,6 +1507,10 @@ static int btree_gc_coalesce(struct btree *b, struct btree_op *op,
|
|||||||
/* Invalidated our iterator */
|
/* Invalidated our iterator */
|
||||||
return -EINTR;
|
return -EINTR;
|
||||||
|
|
||||||
|
out_unlock_nocoalesce:
|
||||||
|
for (i = 0; i < nodes; i++)
|
||||||
|
mutex_unlock(&new_nodes[i]->write_lock);
|
||||||
|
|
||||||
out_nocoalesce:
|
out_nocoalesce:
|
||||||
closure_sync(&cl);
|
closure_sync(&cl);
|
||||||
bch_keylist_free(&keylist);
|
bch_keylist_free(&keylist);
|
||||||
|
|||||||
@@ -1868,7 +1868,7 @@ static int multipath_prepare_ioctl(struct dm_target *ti,
|
|||||||
int r;
|
int r;
|
||||||
|
|
||||||
current_pgpath = READ_ONCE(m->current_pgpath);
|
current_pgpath = READ_ONCE(m->current_pgpath);
|
||||||
if (!current_pgpath)
|
if (!current_pgpath || !test_bit(MPATHF_QUEUE_IO, &m->flags))
|
||||||
current_pgpath = choose_pgpath(m, 0);
|
current_pgpath = choose_pgpath(m, 0);
|
||||||
|
|
||||||
if (current_pgpath) {
|
if (current_pgpath) {
|
||||||
|
|||||||
@@ -1580,7 +1580,7 @@ static struct dm_zone *dmz_get_rnd_zone_for_reclaim(struct dmz_metadata *zmd)
|
|||||||
return dzone;
|
return dzone;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ERR_PTR(-EBUSY);
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -1600,7 +1600,7 @@ static struct dm_zone *dmz_get_seq_zone_for_reclaim(struct dmz_metadata *zmd)
|
|||||||
return zone;
|
return zone;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ERR_PTR(-EBUSY);
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -348,8 +348,8 @@ static int dmz_do_reclaim(struct dmz_reclaim *zrc)
|
|||||||
|
|
||||||
/* Get a data zone */
|
/* Get a data zone */
|
||||||
dzone = dmz_get_zone_for_reclaim(zmd);
|
dzone = dmz_get_zone_for_reclaim(zmd);
|
||||||
if (IS_ERR(dzone))
|
if (!dzone)
|
||||||
return PTR_ERR(dzone);
|
return -EBUSY;
|
||||||
|
|
||||||
start = jiffies;
|
start = jiffies;
|
||||||
|
|
||||||
|
|||||||
@@ -1182,6 +1182,8 @@ static int super_90_validate(struct mddev *mddev, struct md_rdev *rdev)
|
|||||||
mddev->new_layout = mddev->layout;
|
mddev->new_layout = mddev->layout;
|
||||||
mddev->new_chunk_sectors = mddev->chunk_sectors;
|
mddev->new_chunk_sectors = mddev->chunk_sectors;
|
||||||
}
|
}
|
||||||
|
if (mddev->level == 0)
|
||||||
|
mddev->layout = -1;
|
||||||
|
|
||||||
if (sb->state & (1<<MD_SB_CLEAN))
|
if (sb->state & (1<<MD_SB_CLEAN))
|
||||||
mddev->recovery_cp = MaxSector;
|
mddev->recovery_cp = MaxSector;
|
||||||
@@ -1598,6 +1600,10 @@ static int super_1_load(struct md_rdev *rdev, struct md_rdev *refdev, int minor_
|
|||||||
rdev->ppl.sector = rdev->sb_start + rdev->ppl.offset;
|
rdev->ppl.sector = rdev->sb_start + rdev->ppl.offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((le32_to_cpu(sb->feature_map) & MD_FEATURE_RAID0_LAYOUT) &&
|
||||||
|
sb->level != 0)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
if (!refdev) {
|
if (!refdev) {
|
||||||
ret = 1;
|
ret = 1;
|
||||||
} else {
|
} else {
|
||||||
@@ -1708,6 +1714,10 @@ static int super_1_validate(struct mddev *mddev, struct md_rdev *rdev)
|
|||||||
mddev->new_chunk_sectors = mddev->chunk_sectors;
|
mddev->new_chunk_sectors = mddev->chunk_sectors;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mddev->level == 0 &&
|
||||||
|
!(le32_to_cpu(sb->feature_map) & MD_FEATURE_RAID0_LAYOUT))
|
||||||
|
mddev->layout = -1;
|
||||||
|
|
||||||
if (le32_to_cpu(sb->feature_map) & MD_FEATURE_JOURNAL)
|
if (le32_to_cpu(sb->feature_map) & MD_FEATURE_JOURNAL)
|
||||||
set_bit(MD_HAS_JOURNAL, &mddev->flags);
|
set_bit(MD_HAS_JOURNAL, &mddev->flags);
|
||||||
|
|
||||||
@@ -6784,6 +6794,9 @@ static int set_array_info(struct mddev *mddev, mdu_array_info_t *info)
|
|||||||
mddev->external = 0;
|
mddev->external = 0;
|
||||||
|
|
||||||
mddev->layout = info->layout;
|
mddev->layout = info->layout;
|
||||||
|
if (mddev->level == 0)
|
||||||
|
/* Cannot trust RAID0 layout info here */
|
||||||
|
mddev->layout = -1;
|
||||||
mddev->chunk_sectors = info->chunk_size >> 9;
|
mddev->chunk_sectors = info->chunk_size >> 9;
|
||||||
|
|
||||||
if (mddev->persistent) {
|
if (mddev->persistent) {
|
||||||
|
|||||||
@@ -152,6 +152,9 @@ static int create_strip_zones(struct mddev *mddev, struct r0conf **private_conf)
|
|||||||
|
|
||||||
if (conf->nr_strip_zones == 1) {
|
if (conf->nr_strip_zones == 1) {
|
||||||
conf->layout = RAID0_ORIG_LAYOUT;
|
conf->layout = RAID0_ORIG_LAYOUT;
|
||||||
|
} else if (mddev->layout == RAID0_ORIG_LAYOUT ||
|
||||||
|
mddev->layout == RAID0_ALT_MULTIZONE_LAYOUT) {
|
||||||
|
conf->layout = mddev->layout;
|
||||||
} else if (default_layout == RAID0_ORIG_LAYOUT ||
|
} else if (default_layout == RAID0_ORIG_LAYOUT ||
|
||||||
default_layout == RAID0_ALT_MULTIZONE_LAYOUT) {
|
default_layout == RAID0_ALT_MULTIZONE_LAYOUT) {
|
||||||
conf->layout = default_layout;
|
conf->layout = default_layout;
|
||||||
|
|||||||
@@ -704,3 +704,4 @@ module_i2c_driver(wm8994_i2c_driver);
|
|||||||
MODULE_DESCRIPTION("Core support for the WM8994 audio CODEC");
|
MODULE_DESCRIPTION("Core support for the WM8994 audio CODEC");
|
||||||
MODULE_LICENSE("GPL");
|
MODULE_LICENSE("GPL");
|
||||||
MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");
|
MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");
|
||||||
|
MODULE_SOFTDEP("pre: wm8994_regulator");
|
||||||
|
|||||||
@@ -235,7 +235,7 @@ static int ams_delta_init(struct platform_device *pdev)
|
|||||||
goto out_gpio;
|
goto out_gpio;
|
||||||
|
|
||||||
/* Scan to find existence of the device */
|
/* Scan to find existence of the device */
|
||||||
err = nand_scan(ams_delta_mtd, 1);
|
err = nand_scan(this, 1);
|
||||||
if (err)
|
if (err)
|
||||||
goto out_mtd;
|
goto out_mtd;
|
||||||
|
|
||||||
@@ -264,7 +264,7 @@ static int ams_delta_cleanup(struct platform_device *pdev)
|
|||||||
void __iomem *io_base = platform_get_drvdata(pdev);
|
void __iomem *io_base = platform_get_drvdata(pdev);
|
||||||
|
|
||||||
/* Release resources, unregister device */
|
/* Release resources, unregister device */
|
||||||
nand_release(ams_delta_mtd);
|
nand_release(mtd_to_nand(ams_delta_mtd));
|
||||||
|
|
||||||
gpio_free_array(_mandatory_gpio, ARRAY_SIZE(_mandatory_gpio));
|
gpio_free_array(_mandatory_gpio, ARRAY_SIZE(_mandatory_gpio));
|
||||||
gpio_free(AMS_DELTA_GPIO_PIN_NAND_RB);
|
gpio_free(AMS_DELTA_GPIO_PIN_NAND_RB);
|
||||||
|
|||||||
@@ -1694,7 +1694,7 @@ atmel_nand_controller_add_nand(struct atmel_nand_controller *nc,
|
|||||||
|
|
||||||
nc->caps->ops->nand_init(nc, nand);
|
nc->caps->ops->nand_init(nc, nand);
|
||||||
|
|
||||||
ret = nand_scan(mtd, nand->numcs);
|
ret = nand_scan(chip, nand->numcs);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_err(nc->dev, "NAND scan failed: %d\n", ret);
|
dev_err(nc->dev, "NAND scan failed: %d\n", ret);
|
||||||
return ret;
|
return ret;
|
||||||
|
|||||||
@@ -466,7 +466,7 @@ static int au1550nd_probe(struct platform_device *pdev)
|
|||||||
this->write_buf = (pd->devwidth) ? au_write_buf16 : au_write_buf;
|
this->write_buf = (pd->devwidth) ? au_write_buf16 : au_write_buf;
|
||||||
this->read_buf = (pd->devwidth) ? au_read_buf16 : au_read_buf;
|
this->read_buf = (pd->devwidth) ? au_read_buf16 : au_read_buf;
|
||||||
|
|
||||||
ret = nand_scan(mtd, 1);
|
ret = nand_scan(this, 1);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_err(&pdev->dev, "NAND scan failed with %d\n", ret);
|
dev_err(&pdev->dev, "NAND scan failed with %d\n", ret);
|
||||||
goto out3;
|
goto out3;
|
||||||
@@ -492,7 +492,7 @@ static int au1550nd_remove(struct platform_device *pdev)
|
|||||||
struct au1550nd_ctx *ctx = platform_get_drvdata(pdev);
|
struct au1550nd_ctx *ctx = platform_get_drvdata(pdev);
|
||||||
struct resource *r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
struct resource *r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||||
|
|
||||||
nand_release(nand_to_mtd(&ctx->chip));
|
nand_release(&ctx->chip);
|
||||||
iounmap(ctx->base);
|
iounmap(ctx->base);
|
||||||
release_mem_region(r->start, 0x1000);
|
release_mem_region(r->start, 0x1000);
|
||||||
kfree(ctx);
|
kfree(ctx);
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ static int bcm47xxnflash_remove(struct platform_device *pdev)
|
|||||||
{
|
{
|
||||||
struct bcm47xxnflash *nflash = platform_get_drvdata(pdev);
|
struct bcm47xxnflash *nflash = platform_get_drvdata(pdev);
|
||||||
|
|
||||||
nand_release(nand_to_mtd(&nflash->nand_chip));
|
nand_release(&nflash->nand_chip);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -423,7 +423,7 @@ int bcm47xxnflash_ops_bcm4706_init(struct bcm47xxnflash *b47n)
|
|||||||
(w4 << 24 | w3 << 18 | w2 << 12 | w1 << 6 | w0));
|
(w4 << 24 | w3 << 18 | w2 << 12 | w1 << 6 | w0));
|
||||||
|
|
||||||
/* Scan NAND */
|
/* Scan NAND */
|
||||||
err = nand_scan(nand_to_mtd(&b47n->nand_chip), 1);
|
err = nand_scan(&b47n->nand_chip, 1);
|
||||||
if (err) {
|
if (err) {
|
||||||
pr_err("Could not scan NAND flash: %d\n", err);
|
pr_err("Could not scan NAND flash: %d\n", err);
|
||||||
goto exit;
|
goto exit;
|
||||||
|
|||||||
@@ -2304,7 +2304,7 @@ static int brcmnand_init_cs(struct brcmnand_host *host, struct device_node *dn)
|
|||||||
nand_writereg(ctrl, cfg_offs,
|
nand_writereg(ctrl, cfg_offs,
|
||||||
nand_readreg(ctrl, cfg_offs) & ~CFG_BUS_WIDTH);
|
nand_readreg(ctrl, cfg_offs) & ~CFG_BUS_WIDTH);
|
||||||
|
|
||||||
ret = nand_scan(mtd, 1);
|
ret = nand_scan(chip, 1);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
@@ -2619,7 +2619,7 @@ int brcmnand_remove(struct platform_device *pdev)
|
|||||||
struct brcmnand_host *host;
|
struct brcmnand_host *host;
|
||||||
|
|
||||||
list_for_each_entry(host, &ctrl->host_list, node)
|
list_for_each_entry(host, &ctrl->host_list, node)
|
||||||
nand_release(nand_to_mtd(&host->chip));
|
nand_release(&host->chip);
|
||||||
|
|
||||||
clk_disable_unprepare(ctrl->clk);
|
clk_disable_unprepare(ctrl->clk);
|
||||||
|
|
||||||
|
|||||||
@@ -783,7 +783,7 @@ static int cafe_nand_probe(struct pci_dev *pdev,
|
|||||||
|
|
||||||
/* Scan to find existence of the device */
|
/* Scan to find existence of the device */
|
||||||
cafe->nand.dummy_controller.ops = &cafe_nand_controller_ops;
|
cafe->nand.dummy_controller.ops = &cafe_nand_controller_ops;
|
||||||
err = nand_scan(mtd, 2);
|
err = nand_scan(&cafe->nand, 2);
|
||||||
if (err)
|
if (err)
|
||||||
goto out_irq;
|
goto out_irq;
|
||||||
|
|
||||||
@@ -819,7 +819,7 @@ static void cafe_nand_remove(struct pci_dev *pdev)
|
|||||||
/* Disable NAND IRQ in global IRQ mask register */
|
/* Disable NAND IRQ in global IRQ mask register */
|
||||||
cafe_writel(cafe, ~1 & cafe_readl(cafe, GLOBAL_IRQ_MASK), GLOBAL_IRQ_MASK);
|
cafe_writel(cafe, ~1 & cafe_readl(cafe, GLOBAL_IRQ_MASK), GLOBAL_IRQ_MASK);
|
||||||
free_irq(pdev->irq, mtd);
|
free_irq(pdev->irq, mtd);
|
||||||
nand_release(mtd);
|
nand_release(chip);
|
||||||
free_rs(cafe->rs);
|
free_rs(cafe->rs);
|
||||||
pci_iounmap(pdev, cafe->mmio);
|
pci_iounmap(pdev, cafe->mmio);
|
||||||
dma_free_coherent(&cafe->pdev->dev, 2112, cafe->dmabuf, cafe->dmaaddr);
|
dma_free_coherent(&cafe->pdev->dev, 2112, cafe->dmabuf, cafe->dmaaddr);
|
||||||
|
|||||||
@@ -193,7 +193,7 @@ static int __init cmx270_init(void)
|
|||||||
this->write_buf = cmx270_write_buf;
|
this->write_buf = cmx270_write_buf;
|
||||||
|
|
||||||
/* Scan to find existence of the device */
|
/* Scan to find existence of the device */
|
||||||
ret = nand_scan(cmx270_nand_mtd, 1);
|
ret = nand_scan(this, 1);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
pr_notice("No NAND device\n");
|
pr_notice("No NAND device\n");
|
||||||
goto err_scan;
|
goto err_scan;
|
||||||
@@ -228,7 +228,7 @@ module_init(cmx270_init);
|
|||||||
static void __exit cmx270_cleanup(void)
|
static void __exit cmx270_cleanup(void)
|
||||||
{
|
{
|
||||||
/* Release resources, unregister device */
|
/* Release resources, unregister device */
|
||||||
nand_release(cmx270_nand_mtd);
|
nand_release(mtd_to_nand(cmx270_nand_mtd));
|
||||||
|
|
||||||
gpio_free(GPIO_NAND_RB);
|
gpio_free(GPIO_NAND_RB);
|
||||||
gpio_free(GPIO_NAND_CS);
|
gpio_free(GPIO_NAND_CS);
|
||||||
|
|||||||
@@ -241,7 +241,7 @@ static int __init cs553x_init_one(int cs, int mmio, unsigned long adr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Scan to find existence of the device */
|
/* Scan to find existence of the device */
|
||||||
err = nand_scan(new_mtd, 1);
|
err = nand_scan(this, 1);
|
||||||
if (err)
|
if (err)
|
||||||
goto out_free;
|
goto out_free;
|
||||||
|
|
||||||
@@ -336,7 +336,7 @@ static void __exit cs553x_cleanup(void)
|
|||||||
mmio_base = this->IO_ADDR_R;
|
mmio_base = this->IO_ADDR_R;
|
||||||
|
|
||||||
/* Release resources, unregister device */
|
/* Release resources, unregister device */
|
||||||
nand_release(mtd);
|
nand_release(this);
|
||||||
kfree(mtd->name);
|
kfree(mtd->name);
|
||||||
cs553x_mtd[i] = NULL;
|
cs553x_mtd[i] = NULL;
|
||||||
|
|
||||||
|
|||||||
@@ -807,7 +807,7 @@ static int nand_davinci_probe(struct platform_device *pdev)
|
|||||||
|
|
||||||
/* Scan to find existence of the device(s) */
|
/* Scan to find existence of the device(s) */
|
||||||
info->chip.dummy_controller.ops = &davinci_nand_controller_ops;
|
info->chip.dummy_controller.ops = &davinci_nand_controller_ops;
|
||||||
ret = nand_scan(mtd, pdata->mask_chipsel ? 2 : 1);
|
ret = nand_scan(&info->chip, pdata->mask_chipsel ? 2 : 1);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
dev_dbg(&pdev->dev, "no NAND chip(s) found\n");
|
dev_dbg(&pdev->dev, "no NAND chip(s) found\n");
|
||||||
return ret;
|
return ret;
|
||||||
@@ -841,7 +841,7 @@ static int nand_davinci_remove(struct platform_device *pdev)
|
|||||||
ecc4_busy = false;
|
ecc4_busy = false;
|
||||||
spin_unlock_irq(&davinci_nand_lock);
|
spin_unlock_irq(&davinci_nand_lock);
|
||||||
|
|
||||||
nand_release(nand_to_mtd(&info->chip));
|
nand_release(&info->chip);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1384,7 +1384,7 @@ int denali_init(struct denali_nand_info *denali)
|
|||||||
chip->setup_data_interface = denali_setup_data_interface;
|
chip->setup_data_interface = denali_setup_data_interface;
|
||||||
|
|
||||||
chip->dummy_controller.ops = &denali_controller_ops;
|
chip->dummy_controller.ops = &denali_controller_ops;
|
||||||
ret = nand_scan(mtd, denali->max_banks);
|
ret = nand_scan(chip, denali->max_banks);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto disable_irq;
|
goto disable_irq;
|
||||||
|
|
||||||
@@ -1407,9 +1407,7 @@ EXPORT_SYMBOL(denali_init);
|
|||||||
|
|
||||||
void denali_remove(struct denali_nand_info *denali)
|
void denali_remove(struct denali_nand_info *denali)
|
||||||
{
|
{
|
||||||
struct mtd_info *mtd = nand_to_mtd(&denali->nand);
|
nand_release(&denali->nand);
|
||||||
|
|
||||||
nand_release(mtd);
|
|
||||||
denali_disable_irq(denali);
|
denali_disable_irq(denali);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(denali_remove);
|
EXPORT_SYMBOL(denali_remove);
|
||||||
|
|||||||
@@ -1620,14 +1620,11 @@ static int __init doc_probe(unsigned long physadr)
|
|||||||
else
|
else
|
||||||
numchips = doc2001_init(mtd);
|
numchips = doc2001_init(mtd);
|
||||||
|
|
||||||
if ((ret = nand_scan(mtd, numchips)) || (ret = doc->late_init(mtd))) {
|
if ((ret = nand_scan(nand, numchips)) || (ret = doc->late_init(mtd))) {
|
||||||
/* DBB note: i believe nand_release is necessary here, as
|
/* DBB note: i believe nand_cleanup is necessary here, as
|
||||||
buffers may have been allocated in nand_base. Check with
|
buffers may have been allocated in nand_base. Check with
|
||||||
Thomas. FIX ME! */
|
Thomas. FIX ME! */
|
||||||
/* nand_release will call mtd_device_unregister, but we
|
nand_cleanup(nand);
|
||||||
haven't yet added it. This is handled without incident by
|
|
||||||
mtd_device_unregister, as far as I can tell. */
|
|
||||||
nand_release(mtd);
|
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1662,7 +1659,7 @@ static void release_nanddoc(void)
|
|||||||
doc = nand_get_controller_data(nand);
|
doc = nand_get_controller_data(nand);
|
||||||
|
|
||||||
nextmtd = doc->nextdoc;
|
nextmtd = doc->nextdoc;
|
||||||
nand_release(mtd);
|
nand_release(nand);
|
||||||
iounmap(doc->virtadr);
|
iounmap(doc->virtadr);
|
||||||
release_mem_region(doc->physadr, DOC_IOREMAP_LEN);
|
release_mem_region(doc->physadr, DOC_IOREMAP_LEN);
|
||||||
free_rs(doc->rs_decoder);
|
free_rs(doc->rs_decoder);
|
||||||
|
|||||||
@@ -1391,7 +1391,7 @@ static int __init probe_docg4(struct platform_device *pdev)
|
|||||||
* ->attach_chip callback.
|
* ->attach_chip callback.
|
||||||
*/
|
*/
|
||||||
nand->dummy_controller.ops = &docg4_controller_ops;
|
nand->dummy_controller.ops = &docg4_controller_ops;
|
||||||
retval = nand_scan(mtd, 0);
|
retval = nand_scan(nand, 0);
|
||||||
if (retval)
|
if (retval)
|
||||||
goto free_nand;
|
goto free_nand;
|
||||||
|
|
||||||
@@ -1420,7 +1420,7 @@ static int __init probe_docg4(struct platform_device *pdev)
|
|||||||
static int __exit cleanup_docg4(struct platform_device *pdev)
|
static int __exit cleanup_docg4(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct docg4_priv *doc = platform_get_drvdata(pdev);
|
struct docg4_priv *doc = platform_get_drvdata(pdev);
|
||||||
nand_release(doc->mtd);
|
nand_release(mtd_to_nand(doc->mtd));
|
||||||
kfree(mtd_to_nand(doc->mtd));
|
kfree(mtd_to_nand(doc->mtd));
|
||||||
iounmap(doc->virtadr);
|
iounmap(doc->virtadr);
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -915,7 +915,7 @@ static int fsl_elbc_nand_probe(struct platform_device *pdev)
|
|||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
priv->chip.controller->ops = &fsl_elbc_controller_ops;
|
priv->chip.controller->ops = &fsl_elbc_controller_ops;
|
||||||
ret = nand_scan(mtd, 1);
|
ret = nand_scan(&priv->chip, 1);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
@@ -942,9 +942,8 @@ static int fsl_elbc_nand_remove(struct platform_device *pdev)
|
|||||||
{
|
{
|
||||||
struct fsl_elbc_fcm_ctrl *elbc_fcm_ctrl = fsl_lbc_ctrl_dev->nand;
|
struct fsl_elbc_fcm_ctrl *elbc_fcm_ctrl = fsl_lbc_ctrl_dev->nand;
|
||||||
struct fsl_elbc_mtd *priv = dev_get_drvdata(&pdev->dev);
|
struct fsl_elbc_mtd *priv = dev_get_drvdata(&pdev->dev);
|
||||||
struct mtd_info *mtd = nand_to_mtd(&priv->chip);
|
|
||||||
|
|
||||||
nand_release(mtd);
|
nand_release(&priv->chip);
|
||||||
fsl_elbc_chip_remove(priv);
|
fsl_elbc_chip_remove(priv);
|
||||||
|
|
||||||
mutex_lock(&fsl_elbc_nand_mutex);
|
mutex_lock(&fsl_elbc_nand_mutex);
|
||||||
|
|||||||
@@ -1079,7 +1079,7 @@ static int fsl_ifc_nand_probe(struct platform_device *dev)
|
|||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
priv->chip.controller->ops = &fsl_ifc_controller_ops;
|
priv->chip.controller->ops = &fsl_ifc_controller_ops;
|
||||||
ret = nand_scan(mtd, 1);
|
ret = nand_scan(&priv->chip, 1);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
@@ -1105,9 +1105,8 @@ static int fsl_ifc_nand_probe(struct platform_device *dev)
|
|||||||
static int fsl_ifc_nand_remove(struct platform_device *dev)
|
static int fsl_ifc_nand_remove(struct platform_device *dev)
|
||||||
{
|
{
|
||||||
struct fsl_ifc_mtd *priv = dev_get_drvdata(&dev->dev);
|
struct fsl_ifc_mtd *priv = dev_get_drvdata(&dev->dev);
|
||||||
struct mtd_info *mtd = nand_to_mtd(&priv->chip);
|
|
||||||
|
|
||||||
nand_release(mtd);
|
nand_release(&priv->chip);
|
||||||
fsl_ifc_chip_remove(priv);
|
fsl_ifc_chip_remove(priv);
|
||||||
|
|
||||||
mutex_lock(&fsl_ifc_nand_mutex);
|
mutex_lock(&fsl_ifc_nand_mutex);
|
||||||
|
|||||||
@@ -191,7 +191,7 @@ static int fun_chip_init(struct fsl_upm_nand *fun,
|
|||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = nand_scan(mtd, fun->mchip_count);
|
ret = nand_scan(&fun->chip, fun->mchip_count);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
@@ -326,7 +326,7 @@ static int fun_remove(struct platform_device *ofdev)
|
|||||||
struct mtd_info *mtd = nand_to_mtd(&fun->chip);
|
struct mtd_info *mtd = nand_to_mtd(&fun->chip);
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
nand_release(mtd);
|
nand_release(&fun->chip);
|
||||||
kfree(mtd->name);
|
kfree(mtd->name);
|
||||||
|
|
||||||
for (i = 0; i < fun->mchip_count; i++) {
|
for (i = 0; i < fun->mchip_count; i++) {
|
||||||
|
|||||||
@@ -1125,7 +1125,7 @@ static int __init fsmc_nand_probe(struct platform_device *pdev)
|
|||||||
* Scan to find existence of the device
|
* Scan to find existence of the device
|
||||||
*/
|
*/
|
||||||
nand->dummy_controller.ops = &fsmc_nand_controller_ops;
|
nand->dummy_controller.ops = &fsmc_nand_controller_ops;
|
||||||
ret = nand_scan(mtd, 1);
|
ret = nand_scan(nand, 1);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto release_dma_write_chan;
|
goto release_dma_write_chan;
|
||||||
|
|
||||||
@@ -1161,7 +1161,7 @@ static int fsmc_nand_remove(struct platform_device *pdev)
|
|||||||
struct fsmc_nand_data *host = platform_get_drvdata(pdev);
|
struct fsmc_nand_data *host = platform_get_drvdata(pdev);
|
||||||
|
|
||||||
if (host) {
|
if (host) {
|
||||||
nand_release(nand_to_mtd(&host->nand));
|
nand_release(&host->nand);
|
||||||
|
|
||||||
if (host->mode == USE_DMA_ACCESS) {
|
if (host->mode == USE_DMA_ACCESS) {
|
||||||
dma_release_channel(host->write_dma_chan);
|
dma_release_channel(host->write_dma_chan);
|
||||||
|
|||||||
@@ -194,7 +194,7 @@ static int gpio_nand_remove(struct platform_device *pdev)
|
|||||||
{
|
{
|
||||||
struct gpiomtd *gpiomtd = platform_get_drvdata(pdev);
|
struct gpiomtd *gpiomtd = platform_get_drvdata(pdev);
|
||||||
|
|
||||||
nand_release(nand_to_mtd(&gpiomtd->nand_chip));
|
nand_release(&gpiomtd->nand_chip);
|
||||||
|
|
||||||
/* Enable write protection and disable the chip */
|
/* Enable write protection and disable the chip */
|
||||||
if (gpiomtd->nwp && !IS_ERR(gpiomtd->nwp))
|
if (gpiomtd->nwp && !IS_ERR(gpiomtd->nwp))
|
||||||
@@ -289,7 +289,7 @@ static int gpio_nand_probe(struct platform_device *pdev)
|
|||||||
if (gpiomtd->nwp && !IS_ERR(gpiomtd->nwp))
|
if (gpiomtd->nwp && !IS_ERR(gpiomtd->nwp))
|
||||||
gpiod_direction_output(gpiomtd->nwp, 1);
|
gpiod_direction_output(gpiomtd->nwp, 1);
|
||||||
|
|
||||||
ret = nand_scan(mtd, 1);
|
ret = nand_scan(chip, 1);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err_wp;
|
goto err_wp;
|
||||||
|
|
||||||
|
|||||||
@@ -1934,7 +1934,7 @@ static int gpmi_nand_init(struct gpmi_nand_data *this)
|
|||||||
goto err_out;
|
goto err_out;
|
||||||
|
|
||||||
chip->dummy_controller.ops = &gpmi_nand_controller_ops;
|
chip->dummy_controller.ops = &gpmi_nand_controller_ops;
|
||||||
ret = nand_scan(mtd, GPMI_IS_MX6(this) ? 2 : 1);
|
ret = nand_scan(chip, GPMI_IS_MX6(this) ? 2 : 1);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err_out;
|
goto err_out;
|
||||||
|
|
||||||
@@ -2026,7 +2026,7 @@ static int gpmi_nand_remove(struct platform_device *pdev)
|
|||||||
{
|
{
|
||||||
struct gpmi_nand_data *this = platform_get_drvdata(pdev);
|
struct gpmi_nand_data *this = platform_get_drvdata(pdev);
|
||||||
|
|
||||||
nand_release(nand_to_mtd(&this->nand));
|
nand_release(&this->nand);
|
||||||
gpmi_free_dma_buffer(this);
|
gpmi_free_dma_buffer(this);
|
||||||
release_resources(this);
|
release_resources(this);
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -811,7 +811,7 @@ static int hisi_nfc_probe(struct platform_device *pdev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
chip->dummy_controller.ops = &hisi_nfc_controller_ops;
|
chip->dummy_controller.ops = &hisi_nfc_controller_ops;
|
||||||
ret = nand_scan(mtd, max_chips);
|
ret = nand_scan(chip, max_chips);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
@@ -828,9 +828,8 @@ static int hisi_nfc_probe(struct platform_device *pdev)
|
|||||||
static int hisi_nfc_remove(struct platform_device *pdev)
|
static int hisi_nfc_remove(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct hinfc_host *host = platform_get_drvdata(pdev);
|
struct hinfc_host *host = platform_get_drvdata(pdev);
|
||||||
struct mtd_info *mtd = nand_to_mtd(&host->chip);
|
|
||||||
|
|
||||||
nand_release(mtd);
|
nand_release(&host->chip);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -331,7 +331,7 @@ static int jz_nand_detect_bank(struct platform_device *pdev,
|
|||||||
|
|
||||||
if (chipnr == 0) {
|
if (chipnr == 0) {
|
||||||
/* Detect first chip. */
|
/* Detect first chip. */
|
||||||
ret = nand_scan(mtd, 1);
|
ret = nand_scan(chip, 1);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto notfound_id;
|
goto notfound_id;
|
||||||
|
|
||||||
@@ -507,7 +507,7 @@ static int jz_nand_remove(struct platform_device *pdev)
|
|||||||
struct jz_nand *nand = platform_get_drvdata(pdev);
|
struct jz_nand *nand = platform_get_drvdata(pdev);
|
||||||
size_t i;
|
size_t i;
|
||||||
|
|
||||||
nand_release(nand_to_mtd(&nand->chip));
|
nand_release(&nand->chip);
|
||||||
|
|
||||||
/* Deassert and disable all chips */
|
/* Deassert and disable all chips */
|
||||||
writel(0, nand->base + JZ_REG_NAND_CTRL);
|
writel(0, nand->base + JZ_REG_NAND_CTRL);
|
||||||
|
|||||||
@@ -286,13 +286,13 @@ static int jz4780_nand_init_chip(struct platform_device *pdev,
|
|||||||
nand_set_flash_node(chip, np);
|
nand_set_flash_node(chip, np);
|
||||||
|
|
||||||
chip->controller->ops = &jz4780_nand_controller_ops;
|
chip->controller->ops = &jz4780_nand_controller_ops;
|
||||||
ret = nand_scan(mtd, 1);
|
ret = nand_scan(chip, 1);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
ret = mtd_device_register(mtd, NULL, 0);
|
ret = mtd_device_register(mtd, NULL, 0);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
nand_release(mtd);
|
nand_release(chip);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -307,7 +307,7 @@ static void jz4780_nand_cleanup_chips(struct jz4780_nand_controller *nfc)
|
|||||||
|
|
||||||
while (!list_empty(&nfc->chips)) {
|
while (!list_empty(&nfc->chips)) {
|
||||||
chip = list_first_entry(&nfc->chips, struct jz4780_nand_chip, chip_list);
|
chip = list_first_entry(&nfc->chips, struct jz4780_nand_chip, chip_list);
|
||||||
nand_release(nand_to_mtd(&chip->chip));
|
nand_release(&chip->chip);
|
||||||
list_del(&chip->chip_list);
|
list_del(&chip->chip_list);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -802,7 +802,7 @@ static int lpc32xx_nand_probe(struct platform_device *pdev)
|
|||||||
* SMALL block or LARGE block.
|
* SMALL block or LARGE block.
|
||||||
*/
|
*/
|
||||||
nand_chip->dummy_controller.ops = &lpc32xx_nand_controller_ops;
|
nand_chip->dummy_controller.ops = &lpc32xx_nand_controller_ops;
|
||||||
res = nand_scan(mtd, 1);
|
res = nand_scan(nand_chip, 1);
|
||||||
if (res)
|
if (res)
|
||||||
goto free_irq;
|
goto free_irq;
|
||||||
|
|
||||||
@@ -839,9 +839,8 @@ static int lpc32xx_nand_probe(struct platform_device *pdev)
|
|||||||
static int lpc32xx_nand_remove(struct platform_device *pdev)
|
static int lpc32xx_nand_remove(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct lpc32xx_nand_host *host = platform_get_drvdata(pdev);
|
struct lpc32xx_nand_host *host = platform_get_drvdata(pdev);
|
||||||
struct mtd_info *mtd = nand_to_mtd(&host->nand_chip);
|
|
||||||
|
|
||||||
nand_release(mtd);
|
nand_release(&host->nand_chip);
|
||||||
free_irq(host->irq, host);
|
free_irq(host->irq, host);
|
||||||
if (use_dma)
|
if (use_dma)
|
||||||
dma_release_channel(host->dma_chan);
|
dma_release_channel(host->dma_chan);
|
||||||
|
|||||||
@@ -925,7 +925,7 @@ static int lpc32xx_nand_probe(struct platform_device *pdev)
|
|||||||
|
|
||||||
/* Find NAND device */
|
/* Find NAND device */
|
||||||
chip->dummy_controller.ops = &lpc32xx_nand_controller_ops;
|
chip->dummy_controller.ops = &lpc32xx_nand_controller_ops;
|
||||||
res = nand_scan(mtd, 1);
|
res = nand_scan(chip, 1);
|
||||||
if (res)
|
if (res)
|
||||||
goto release_dma;
|
goto release_dma;
|
||||||
|
|
||||||
@@ -956,9 +956,8 @@ static int lpc32xx_nand_remove(struct platform_device *pdev)
|
|||||||
{
|
{
|
||||||
uint32_t tmp;
|
uint32_t tmp;
|
||||||
struct lpc32xx_nand_host *host = platform_get_drvdata(pdev);
|
struct lpc32xx_nand_host *host = platform_get_drvdata(pdev);
|
||||||
struct mtd_info *mtd = nand_to_mtd(&host->nand_chip);
|
|
||||||
|
|
||||||
nand_release(mtd);
|
nand_release(&host->nand_chip);
|
||||||
dma_release_channel(host->dma_chan);
|
dma_release_channel(host->dma_chan);
|
||||||
|
|
||||||
/* Force CE high */
|
/* Force CE high */
|
||||||
|
|||||||
@@ -2551,7 +2551,7 @@ static int marvell_nand_chip_init(struct device *dev, struct marvell_nfc *nfc,
|
|||||||
|
|
||||||
chip->options |= NAND_BUSWIDTH_AUTO;
|
chip->options |= NAND_BUSWIDTH_AUTO;
|
||||||
|
|
||||||
ret = nand_scan(mtd, marvell_nand->nsels);
|
ret = nand_scan(chip, marvell_nand->nsels);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_err(dev, "could not scan the nand chip\n");
|
dev_err(dev, "could not scan the nand chip\n");
|
||||||
return ret;
|
return ret;
|
||||||
@@ -2564,7 +2564,7 @@ static int marvell_nand_chip_init(struct device *dev, struct marvell_nfc *nfc,
|
|||||||
ret = mtd_device_register(mtd, NULL, 0);
|
ret = mtd_device_register(mtd, NULL, 0);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_err(dev, "failed to register mtd device: %d\n", ret);
|
dev_err(dev, "failed to register mtd device: %d\n", ret);
|
||||||
nand_release(mtd);
|
nand_release(chip);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2619,7 +2619,7 @@ static void marvell_nand_chips_cleanup(struct marvell_nfc *nfc)
|
|||||||
struct marvell_nand_chip *entry, *temp;
|
struct marvell_nand_chip *entry, *temp;
|
||||||
|
|
||||||
list_for_each_entry_safe(entry, temp, &nfc->chips, node) {
|
list_for_each_entry_safe(entry, temp, &nfc->chips, node) {
|
||||||
nand_release(nand_to_mtd(&entry->chip));
|
nand_release(&entry->chip);
|
||||||
list_del(&entry->node);
|
list_del(&entry->node);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -778,7 +778,7 @@ static int mpc5121_nfc_probe(struct platform_device *op)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Detect NAND chips */
|
/* Detect NAND chips */
|
||||||
retval = nand_scan(mtd, be32_to_cpup(chips_no));
|
retval = nand_scan(chip, be32_to_cpup(chips_no));
|
||||||
if (retval) {
|
if (retval) {
|
||||||
dev_err(dev, "NAND Flash not found !\n");
|
dev_err(dev, "NAND Flash not found !\n");
|
||||||
goto error;
|
goto error;
|
||||||
@@ -828,7 +828,7 @@ static int mpc5121_nfc_remove(struct platform_device *op)
|
|||||||
struct device *dev = &op->dev;
|
struct device *dev = &op->dev;
|
||||||
struct mtd_info *mtd = dev_get_drvdata(dev);
|
struct mtd_info *mtd = dev_get_drvdata(dev);
|
||||||
|
|
||||||
nand_release(mtd);
|
nand_release(mtd_to_nand(mtd));
|
||||||
mpc5121_nfc_free(dev, mtd);
|
mpc5121_nfc_free(dev, mtd);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -1382,14 +1382,14 @@ static int mtk_nfc_nand_chip_init(struct device *dev, struct mtk_nfc *nfc,
|
|||||||
|
|
||||||
mtk_nfc_hw_init(nfc);
|
mtk_nfc_hw_init(nfc);
|
||||||
|
|
||||||
ret = nand_scan(mtd, nsels);
|
ret = nand_scan(nand, nsels);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
ret = mtd_device_register(mtd, NULL, 0);
|
ret = mtd_device_register(mtd, NULL, 0);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_err(dev, "mtd parse partition error\n");
|
dev_err(dev, "mtd parse partition error\n");
|
||||||
nand_release(mtd);
|
nand_cleanup(nand);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1555,7 +1555,7 @@ static int mtk_nfc_remove(struct platform_device *pdev)
|
|||||||
while (!list_empty(&nfc->chips)) {
|
while (!list_empty(&nfc->chips)) {
|
||||||
chip = list_first_entry(&nfc->chips, struct mtk_nfc_nand_chip,
|
chip = list_first_entry(&nfc->chips, struct mtk_nfc_nand_chip,
|
||||||
node);
|
node);
|
||||||
nand_release(nand_to_mtd(&chip->nand));
|
nand_release(&chip->nand);
|
||||||
list_del(&chip->node);
|
list_del(&chip->node);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1900,7 +1900,7 @@ static int mxcnd_probe(struct platform_device *pdev)
|
|||||||
|
|
||||||
/* Scan the NAND device */
|
/* Scan the NAND device */
|
||||||
this->dummy_controller.ops = &mxcnd_controller_ops;
|
this->dummy_controller.ops = &mxcnd_controller_ops;
|
||||||
err = nand_scan(mtd, is_imx25_nfc(host) ? 4 : 1);
|
err = nand_scan(this, is_imx25_nfc(host) ? 4 : 1);
|
||||||
if (err)
|
if (err)
|
||||||
goto escan;
|
goto escan;
|
||||||
|
|
||||||
@@ -1928,7 +1928,7 @@ static int mxcnd_remove(struct platform_device *pdev)
|
|||||||
{
|
{
|
||||||
struct mxc_nand_host *host = platform_get_drvdata(pdev);
|
struct mxc_nand_host *host = platform_get_drvdata(pdev);
|
||||||
|
|
||||||
nand_release(nand_to_mtd(&host->nand));
|
nand_release(&host->nand);
|
||||||
if (host->clk_act)
|
if (host->clk_act)
|
||||||
clk_disable_unprepare(host->clk);
|
clk_disable_unprepare(host->clk);
|
||||||
|
|
||||||
|
|||||||
@@ -5953,7 +5953,7 @@ static int nand_dt_init(struct nand_chip *chip)
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* nand_scan_ident - Scan for the NAND device
|
* nand_scan_ident - Scan for the NAND device
|
||||||
* @mtd: MTD device structure
|
* @chip: NAND chip object
|
||||||
* @maxchips: number of chips to scan for
|
* @maxchips: number of chips to scan for
|
||||||
* @table: alternative NAND ID table
|
* @table: alternative NAND ID table
|
||||||
*
|
*
|
||||||
@@ -5965,11 +5965,11 @@ static int nand_dt_init(struct nand_chip *chip)
|
|||||||
* prevented dynamic allocations during this phase which was unconvenient and
|
* prevented dynamic allocations during this phase which was unconvenient and
|
||||||
* as been banned for the benefit of the ->init_ecc()/cleanup_ecc() hooks.
|
* as been banned for the benefit of the ->init_ecc()/cleanup_ecc() hooks.
|
||||||
*/
|
*/
|
||||||
static int nand_scan_ident(struct mtd_info *mtd, int maxchips,
|
static int nand_scan_ident(struct nand_chip *chip, int maxchips,
|
||||||
struct nand_flash_dev *table)
|
struct nand_flash_dev *table)
|
||||||
{
|
{
|
||||||
|
struct mtd_info *mtd = nand_to_mtd(chip);
|
||||||
int i, nand_maf_id, nand_dev_id;
|
int i, nand_maf_id, nand_dev_id;
|
||||||
struct nand_chip *chip = mtd_to_nand(mtd);
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
/* Enforce the right timings for reset/detection */
|
/* Enforce the right timings for reset/detection */
|
||||||
@@ -6423,15 +6423,15 @@ static bool nand_ecc_strength_good(struct mtd_info *mtd)
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* nand_scan_tail - Scan for the NAND device
|
* nand_scan_tail - Scan for the NAND device
|
||||||
* @mtd: MTD device structure
|
* @chip: NAND chip object
|
||||||
*
|
*
|
||||||
* This is the second phase of the normal nand_scan() function. It fills out
|
* This is the second phase of the normal nand_scan() function. It fills out
|
||||||
* all the uninitialized function pointers with the defaults and scans for a
|
* all the uninitialized function pointers with the defaults and scans for a
|
||||||
* bad block table if appropriate.
|
* bad block table if appropriate.
|
||||||
*/
|
*/
|
||||||
static int nand_scan_tail(struct mtd_info *mtd)
|
static int nand_scan_tail(struct nand_chip *chip)
|
||||||
{
|
{
|
||||||
struct nand_chip *chip = mtd_to_nand(mtd);
|
struct mtd_info *mtd = nand_to_mtd(chip);
|
||||||
struct nand_ecc_ctrl *ecc = &chip->ecc;
|
struct nand_ecc_ctrl *ecc = &chip->ecc;
|
||||||
int ret, i;
|
int ret, i;
|
||||||
|
|
||||||
@@ -6770,7 +6770,7 @@ static void nand_detach(struct nand_chip *chip)
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* nand_scan_with_ids - [NAND Interface] Scan for the NAND device
|
* nand_scan_with_ids - [NAND Interface] Scan for the NAND device
|
||||||
* @mtd: MTD device structure
|
* @chip: NAND chip object
|
||||||
* @maxchips: number of chips to scan for. @nand_scan_ident() will not be run if
|
* @maxchips: number of chips to scan for. @nand_scan_ident() will not be run if
|
||||||
* this parameter is zero (useful for specific drivers that must
|
* this parameter is zero (useful for specific drivers that must
|
||||||
* handle this part of the process themselves, e.g docg4).
|
* handle this part of the process themselves, e.g docg4).
|
||||||
@@ -6780,14 +6780,13 @@ static void nand_detach(struct nand_chip *chip)
|
|||||||
* The flash ID is read and the mtd/chip structures are filled with the
|
* The flash ID is read and the mtd/chip structures are filled with the
|
||||||
* appropriate values.
|
* appropriate values.
|
||||||
*/
|
*/
|
||||||
int nand_scan_with_ids(struct mtd_info *mtd, int maxchips,
|
int nand_scan_with_ids(struct nand_chip *chip, int maxchips,
|
||||||
struct nand_flash_dev *ids)
|
struct nand_flash_dev *ids)
|
||||||
{
|
{
|
||||||
struct nand_chip *chip = mtd_to_nand(mtd);
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (maxchips) {
|
if (maxchips) {
|
||||||
ret = nand_scan_ident(mtd, maxchips, ids);
|
ret = nand_scan_ident(chip, maxchips, ids);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -6796,7 +6795,7 @@ int nand_scan_with_ids(struct mtd_info *mtd, int maxchips,
|
|||||||
if (ret)
|
if (ret)
|
||||||
goto cleanup_ident;
|
goto cleanup_ident;
|
||||||
|
|
||||||
ret = nand_scan_tail(mtd);
|
ret = nand_scan_tail(chip);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto detach_chip;
|
goto detach_chip;
|
||||||
|
|
||||||
@@ -6847,12 +6846,12 @@ EXPORT_SYMBOL_GPL(nand_cleanup);
|
|||||||
/**
|
/**
|
||||||
* nand_release - [NAND Interface] Unregister the MTD device and free resources
|
* nand_release - [NAND Interface] Unregister the MTD device and free resources
|
||||||
* held by the NAND device
|
* held by the NAND device
|
||||||
* @mtd: MTD device structure
|
* @chip: NAND chip object
|
||||||
*/
|
*/
|
||||||
void nand_release(struct mtd_info *mtd)
|
void nand_release(struct nand_chip *chip)
|
||||||
{
|
{
|
||||||
mtd_device_unregister(mtd);
|
mtd_device_unregister(nand_to_mtd(chip));
|
||||||
nand_cleanup(mtd_to_nand(mtd));
|
nand_cleanup(chip);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(nand_release);
|
EXPORT_SYMBOL_GPL(nand_release);
|
||||||
|
|
||||||
|
|||||||
@@ -2319,7 +2319,7 @@ static int __init ns_init_module(void)
|
|||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
chip->dummy_controller.ops = &ns_controller_ops;
|
chip->dummy_controller.ops = &ns_controller_ops;
|
||||||
retval = nand_scan(nsmtd, 1);
|
retval = nand_scan(chip, 1);
|
||||||
if (retval) {
|
if (retval) {
|
||||||
NS_ERR("Could not scan NAND Simulator device\n");
|
NS_ERR("Could not scan NAND Simulator device\n");
|
||||||
goto error;
|
goto error;
|
||||||
@@ -2364,7 +2364,7 @@ static int __init ns_init_module(void)
|
|||||||
|
|
||||||
err_exit:
|
err_exit:
|
||||||
free_nandsim(nand);
|
free_nandsim(nand);
|
||||||
nand_release(nsmtd);
|
nand_release(chip);
|
||||||
for (i = 0;i < ARRAY_SIZE(nand->partitions); ++i)
|
for (i = 0;i < ARRAY_SIZE(nand->partitions); ++i)
|
||||||
kfree(nand->partitions[i].name);
|
kfree(nand->partitions[i].name);
|
||||||
error:
|
error:
|
||||||
@@ -2386,7 +2386,7 @@ static void __exit ns_cleanup_module(void)
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
free_nandsim(ns); /* Free nandsim private resources */
|
free_nandsim(ns); /* Free nandsim private resources */
|
||||||
nand_release(nsmtd); /* Unregister driver */
|
nand_release(chip); /* Unregister driver */
|
||||||
for (i = 0;i < ARRAY_SIZE(ns->partitions); ++i)
|
for (i = 0;i < ARRAY_SIZE(ns->partitions); ++i)
|
||||||
kfree(ns->partitions[i].name);
|
kfree(ns->partitions[i].name);
|
||||||
kfree(mtd_to_nand(nsmtd)); /* Free other structures */
|
kfree(mtd_to_nand(nsmtd)); /* Free other structures */
|
||||||
|
|||||||
@@ -181,7 +181,7 @@ static int ndfc_chip_init(struct ndfc_controller *ndfc,
|
|||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = nand_scan(mtd, 1);
|
ret = nand_scan(chip, 1);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
@@ -258,7 +258,7 @@ static int ndfc_remove(struct platform_device *ofdev)
|
|||||||
struct ndfc_controller *ndfc = dev_get_drvdata(&ofdev->dev);
|
struct ndfc_controller *ndfc = dev_get_drvdata(&ofdev->dev);
|
||||||
struct mtd_info *mtd = nand_to_mtd(&ndfc->chip);
|
struct mtd_info *mtd = nand_to_mtd(&ndfc->chip);
|
||||||
|
|
||||||
nand_release(mtd);
|
nand_release(&ndfc->chip);
|
||||||
kfree(mtd->name);
|
kfree(mtd->name);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user