mirror of
https://github.com/hardkernel/linux.git
synced 2026-03-24 19:40:21 +09:00
Merge 5.15.150 into android14-5.15-lts
Changes in 5.15.150 net/sched: Retire CBQ qdisc net/sched: Retire ATM qdisc net/sched: Retire dsmark qdisc smb: client: fix OOB in receive_encrypted_standard() smb: client: fix potential OOBs in smb2_parse_contexts() smb: client: fix parsing of SMB3.1.1 POSIX create context sched/rt: sysctl_sched_rr_timeslice show default timeslice after reset PCI: dwc: Fix a 64bit bug in dw_pcie_ep_raise_msix_irq() bpf: Merge printk and seq_printf VARARG max macros bpf: Add struct for bin_args arg in bpf_bprintf_prepare bpf: Do cleanup in bpf_bprintf_cleanup only when needed bpf: Remove trace_printk_lock userfaultfd: fix mmap_changing checking in mfill_atomic_hugetlb zonefs: Improve error handling x86/fpu: Stop relying on userspace for info to fault in xsave buffer sched/rt: Fix sysctl_sched_rr_timeslice intial value sched/rt: Disallow writing invalid values to sched_rt_period_us scsi: target: core: Add TMF to tmr_list handling dmaengine: shdma: increase size of 'dev_id' dmaengine: fsl-qdma: increase size of 'irq_name' wifi: cfg80211: fix missing interfaces when dumping wifi: mac80211: fix race condition on enabling fast-xmit fbdev: savage: Error out if pixclock equals zero fbdev: sis: Error out if pixclock equals zero spi: hisi-sfc-v3xx: Return IRQ_NONE if no interrupts were detected ahci: asm1166: correct count of reported ports ahci: add 43-bit DMA address quirk for ASMedia ASM1061 controllers MIPS: reserve exception vector space ONLY ONCE platform/x86: touchscreen_dmi: Add info for the TECLAST X16 Plus tablet ext4: avoid dividing by 0 in mb_update_avg_fragment_size() when block bitmap corrupt ext4: avoid allocating blocks from corrupted group in ext4_mb_try_best_found() ext4: avoid allocating blocks from corrupted group in ext4_mb_find_by_goal() dmaengine: ti: edma: Add some null pointer checks to the edma_probe regulator: pwm-regulator: Add validity checks in continuous .get_voltage nvmet-tcp: fix nvme tcp ida memory leak ALSA: usb-audio: Check presence of valid altsetting control ASoC: sunxi: sun4i-spdif: Add support for Allwinner H616 spi: sh-msiof: avoid integer overflow in constants Input: xpad - add Lenovo Legion Go controllers netfilter: conntrack: check SCTP_CID_SHUTDOWN_ACK for vtag setting in sctp_new ALSA: usb-audio: Ignore clock selector errors for single connection nvme-fc: do not wait in vain when unloading module nvmet-fcloop: swap the list_add_tail arguments nvmet-fc: release reference on target port nvmet-fc: defer cleanup using RCU properly nvmet-fc: hold reference on hostport match nvmet-fc: abort command when there is no binding nvmet-fc: avoid deadlock on delete association path nvmet-fc: take ref count on tgtport before delete assoc ext4: correct the hole length returned by ext4_map_blocks() Input: i8042 - add Fujitsu Lifebook U728 to i8042 quirk table fs/ntfs3: Modified fix directory element type detection fs/ntfs3: Improve ntfs_dir_count fs/ntfs3: Correct hard links updating when dealing with DOS names fs/ntfs3: Print warning while fixing hard links count fs/ntfs3: Fix detected field-spanning write (size 8) of single field "le->name" fs/ntfs3: Add NULL ptr dereference checking at the end of attr_allocate_frame() fs/ntfs3: Disable ATTR_LIST_ENTRY size check fs/ntfs3: use non-movable memory for ntfs3 MFT buffer cache fs/ntfs3: Prevent generic message "attempt to access beyond end of device" fs/ntfs3: Correct function is_rst_area_valid fs/ntfs3: Update inode->i_size after success write into compressed file fs/ntfs3: Fix oob in ntfs_listxattr wifi: mac80211: adding missing drv_mgd_complete_tx() call efi: runtime: Fix potential overflow of soft-reserved region size efi: Don't add memblocks for soft-reserved memory hwmon: (coretemp) Enlarge per package core count limit scsi: lpfc: Use unsigned type for num_sge firewire: core: send bus reset promptly on gap count error drm/amdgpu: skip to program GFXDEC registers for suspend abort drm/amdgpu: reset gpu for s3 suspend abort case virtio-blk: Ensure no requests in virtqueues before deleting vqs. pmdomain: mediatek: fix race conditions with genpd ksmbd: free aux buffer if ksmbd_iov_pin_rsp_read fails pmdomain: renesas: r8a77980-sysc: CR7 must be always on erofs: fix lz4 inplace decompression IB/hfi1: Fix sdma.h tx->num_descs off-by-one error drm/ttm: Fix an invalid freeing on already freed page in error path dm-crypt: don't modify the data when using authenticated encryption platform/x86: intel-vbtn: Stop calling "VBDL" from notify_handler platform/x86: touchscreen_dmi: Allow partial (prefix) matches for ACPI names KVM: arm64: vgic-its: Test for valid IRQ in MOVALL handler KVM: arm64: vgic-its: Test for valid IRQ in its_sync_lpi_pending_table() gtp: fix use-after-free and null-ptr-deref in gtp_genl_dump_pdp() PCI/MSI: Prevent MSI hardware interrupt number truncation l2tp: pass correct message length to ip6_append_data ARM: ep93xx: Add terminator to gpiod_lookup_table Revert "x86/ftrace: Use alternative RET encoding" x86/text-patching: Make text_gen_insn() play nice with ANNOTATE_NOENDBR x86/ibt,paravirt: Use text_gen_insn() for paravirt_patch() x86/ftrace: Use alternative RET encoding x86/returnthunk: Allow different return thunks Revert "x86/alternative: Make custom return thunk unconditional" x86/alternative: Make custom return thunk unconditional serial: amba-pl011: Fix DMA transmission in RS485 mode usb: dwc3: gadget: Don't disconnect if not started usb: cdnsp: blocked some cdns3 specific code usb: cdnsp: fixed issue with incorrect detecting CDNSP family controllers usb: cdns3: fixed memory use after free at cdns3_gadget_ep_disable() usb: cdns3: fix memory double free when handle zero packet usb: gadget: ncm: Avoid dropping datagrams of properly parsed NTBs usb: roles: fix NULL pointer issue when put module's reference usb: roles: don't get/set_role() when usb_role_switch is unregistered mptcp: fix lockless access in subflow ULP diag clk: imx: imx8mp: add shared clk gate for usb suspend clk clk: qcom: gcc-qcs404: disable gpll[04]_out_aux parents clk: qcom: gcc-qcs404: fix names of the DSI clocks used as parents mtd: rawnand: sunxi: Fix the size of the last OOB region RISC-V: fix funct4 definition for c.jalr in parse_asm.h Input: iqs269a - drop unused device node references Input: iqs269a - configure device with a single block write Input: iqs269a - increase interrupt handler return delay clk: renesas: cpg-mssr: Fix use after free if cpg_mssr_common_init() failed Input: ads7846 - don't report pressure for ads7845 clk: renesas: cpg-mssr: Remove superfluous check in resume code clk: imx: avoid memory leak Input: ads7846 - always set last command to PWRDOWN Input: ads7846 - don't check penirq immediately for 7845 powerpc/powernv/ioda: Skip unallocated resources when mapping to PE clk: qcom: gpucc-sc7180: fix clk_dis_wait being programmed for CX GDSC clk: qcom: gpucc-sdm845: fix clk_dis_wait being programmed for CX GDSC clk: Honor CLK_OPS_PARENT_ENABLE in clk_core_is_enabled() powerpc/pseries/lparcfg: add missing RTAS retry status handling powerpc/perf/hv-24x7: add missing RTAS retry status handling powerpc/pseries/lpar: add missing RTAS retry status handling MIPS: SMP-CPS: fix build error when HOTPLUG_CPU not set MIPS: vpe-mt: drop physical_memsize vdpa/mlx5: Don't clear mr struct on destroy MR selftests: net: vrf-xfrm-tests: change authentication and encryption algos ARM: dts: BCM53573: Drop nonexistent #usb-cells RDMA/siw: Balance the reference of cep->kref in the error path RDMA/siw: Correct wrong debug message clk: linux/clk-provider.h: fix kernel-doc warnings and typos platform/x86: asus-wmi: Document the dgpu_disable sysfs attribute acpi: property: Let args be NULL in __acpi_node_get_property_reference ARM: dts: BCM53573: Drop nonexistent "default-off" LED trigger tools headers UAPI: Sync linux/fscrypt.h with the kernel sources perf beauty: Update copy of linux/socket.h with the kernel sources tools/virtio: fix build drm/amdgpu: init iommu after amdkfd device init f2fs: don't set GC_FAILURE_PIN for background GC f2fs: write checkpoint during FG_GC drm/i915/dg1: Update DMC_DEBUG3 register kernel/sched: Remove dl_boosted flag comment cifs: remove useless parameter 'is_fsctl' from SMB2_ioctl() serial: 8250: Remove serial_rs485 sanitization from em485 clk: imx8mp: Add DISP2 pixel clock clk: imx8mp: add clkout1/2 support dt-bindings: clocks: imx8mp: Add ID for usb suspend clock net: ethernet: ti: add missing of_node_put before return powerpc/rtas: make all exports GPL powerpc/rtas: ensure 4KB alignment for rtas_data_buf powerpc/eeh: Small refactor of eeh_handle_normal_event() powerpc/eeh: Set channel state after notifying the drivers PM: core: Redefine pm_ptr() macro PM: core: Add new *_PM_OPS macros, deprecate old ones mmc: jz4740: Use the new PM macros mmc: mxc: Use the new PM macros PM: core: Remove static qualifier in DEFINE_SIMPLE_DEV_PM_OPS macro Input: iqs269a - switch to DEFINE_SIMPLE_DEV_PM_OPS() and pm_sleep_ptr() Input: iqs269a - do not poll during suspend or resume Input: iqs269a - do not poll during ATI net/sched: Refactor qdisc_graft() for ingress and clsact Qdiscs netfilter: nf_tables: add rescheduling points during loop detection walks debugobjects: Recheck debug_objects_enabled before reporting nbd: Add the maximum limit of allocated index in nbd_dev_add md: fix data corruption for raid456 when reshape restart while grow up md/raid10: prevent soft lockup while flush writes posix-timers: Ensure timer ID search-loop limit is valid btrfs: add xxhash to fast checksum implementations ACPI: button: Add lid disable DMI quirk for Nextbook Ares 8A ACPI: video: Add backlight=native DMI quirk for Apple iMac11,3 ACPI: video: Add backlight=native DMI quirk for Lenovo ThinkPad X131e (3371 AMD version) arm64: set __exception_irq_entry with __irq_entry as a default arm64: mm: fix VA-range sanity check sched/fair: Don't balance task to its current running CPU wifi: ath11k: fix registration of 6Ghz-only phy without the full channel range bpf: Address KCSAN report on bpf_lru_list devlink: report devlink_port_type_warn source device wifi: wext-core: Fix -Wstringop-overflow warning in ioctl_standard_iw_point() igb: Fix igb_down hung on surprise removal wifi: iwlwifi: mvm: avoid baid size integer overflow exfat: support dynamic allocate bh for exfat_entry_set_cache arm64: dts: rockchip: fix regulator name on rk3399-rock-4 arm64: dts: rockchip: add ES8316 codec for ROCK Pi 4 arm64: dts: rockchip: add SPDIF node for ROCK Pi 4 ARM: dts: BCM53573: Describe on-SoC BCM53125 rev 4 switch ACPI: video: Add backlight=native DMI quirk for Apple iMac12,1 and iMac12,2 ACPI: resource: Add ASUS model S5402ZA to quirks ACPI: resource: Skip IRQ override on Asus Vivobook S5602ZA ACPI: resource: Add Asus ExpertBook B2502 to Asus quirks ACPI: resource: Skip IRQ override on Asus Expertbook B2402CBA ACPI: resource: Skip IRQ override on ASUS ExpertBook B1502CBA xhci: cleanup xhci_hub_control port references xhci: move port specific items such as state completions to port structure xhci: rename resume_done to resume_timestamp xhci: clear usb2 resume related variables in one place. xhci: decouple usb2 port resume and get_port_status request handling xhci: track port suspend state correctly in unsuccessful resume cases cifs: add a warning when the in-flight count goes negative IB/hfi1: Fix a memleak in init_credit_return RDMA/bnxt_re: Return error for SRQ resize RDMA/irdma: Fix KASAN issue with tasklet RDMA/irdma: Validate max_send_wr and max_recv_wr RDMA/irdma: Set the CQ read threshold for GEN 1 RDMA/irdma: Add AE for too many RNRS RDMA/srpt: Support specifying the srpt_service_guid parameter RDMA/qedr: Fix qedr_create_user_qp error flow arm64: dts: rockchip: set num-cs property for spi on px30 RDMA/srpt: fix function pointer cast warnings bpf, scripts: Correct GPL license name scsi: jazz_esp: Only build if SCSI core is builtin nouveau: fix function cast warnings net: stmmac: Fix incorrect dereference in interrupt handlers ipv4: properly combine dev_base_seq and ipv4.dev_addr_genid ipv6: properly combine dev_base_seq and ipv6.dev_addr_genid ata: libahci_platform: Convert to using devm bulk clocks API ata: libahci_platform: Introduce reset assertion/deassertion methods ata: ahci_ceva: fix error handling for Xilinx GT PHY support bpf: Fix racing between bpf_timer_cancel_and_free and bpf_timer_cancel afs: Increase buffer size in afs_update_volume_status() ipv6: sr: fix possible use-after-free and null-ptr-deref packet: move from strlcpy with unused retval to strscpy net: dev: Convert sa_data to flexible array in struct sockaddr drm/nouveau/instmem: fix uninitialized_var.cocci warning octeontx2-af: Consider the action set by PF s390: use the correct count for __iowrite64_copy() tls: rx: jump to a more appropriate label tls: rx: drop pointless else after goto tls: stop recv() if initial process_rx_list gave us non-DATA netfilter: nf_tables: set dormant flag on hook register failure netfilter: flowtable: simplify route logic netfilter: nft_flow_offload: reset dst in route object after setting up flow netfilter: nft_flow_offload: release dst in case direct xmit path is used drm/syncobj: call drm_syncobj_fence_add_wait when WAIT_AVAILABLE flag is set drm/amd/display: Fix memory leak in dm_sw_fini() i2c: imx: Add timer for handling the stop condition i2c: imx: when being a target, mark the last read as processed cifs: fix mid leak during reconnection after timeout threshold fs/aio: Restrict kiocb_set_cancel_fn() to I/O submitted via libaio arp: Prevent overflow in arp_req_get(). netfilter: nf_tables: fix scheduling-while-atomic splat ext4: regenerate buddy after block freeing failed if under fc replay ext4: avoid bb_free and bb_fragments inconsistency in mb_free_blocks() netfilter: nf_tables: can't schedule in nft_chain_validate r8169: use new PM macros Linux 5.15.150 Change-Id: I06c2e83ba84b59d0a35cf9fcaad15d0ab5276832 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
@@ -57,3 +57,12 @@ Description:
|
||||
* 0 - default,
|
||||
* 1 - overboost,
|
||||
* 2 - silent
|
||||
|
||||
What: /sys/devices/platform/<platform>/dgpu_disable
|
||||
Date: Aug 2022
|
||||
KernelVersion: 5.17
|
||||
Contact: "Luke Jones" <luke@ljones.dev>
|
||||
Description:
|
||||
Disable discrete GPU:
|
||||
* 0 - Enable dGPU,
|
||||
* 1 - Disable dGPU
|
||||
|
||||
2
Makefile
2
Makefile
@@ -1,7 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 5
|
||||
PATCHLEVEL = 15
|
||||
SUBLEVEL = 149
|
||||
SUBLEVEL = 150
|
||||
EXTRAVERSION =
|
||||
NAME = Trick or Treat
|
||||
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
wlan {
|
||||
label = "bcm53xx:blue:wlan";
|
||||
gpios = <&chipcommon 10 GPIO_ACTIVE_LOW>;
|
||||
linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
system {
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
5ghz {
|
||||
label = "bcm53xx:blue:5ghz";
|
||||
gpios = <&chipcommon 11 GPIO_ACTIVE_HIGH>;
|
||||
linux,default-trigger = "default-off";
|
||||
};
|
||||
|
||||
system {
|
||||
@@ -42,7 +41,6 @@
|
||||
2ghz {
|
||||
label = "bcm53xx:blue:2ghz";
|
||||
gpios = <&pcie0_chipcommon 3 GPIO_ACTIVE_HIGH>;
|
||||
linux,default-trigger = "default-off";
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -159,8 +159,6 @@
|
||||
};
|
||||
|
||||
ohci: usb@d000 {
|
||||
#usb-cells = <0>;
|
||||
|
||||
compatible = "generic-ohci";
|
||||
reg = <0xd000 0x1000>;
|
||||
interrupt-parent = <&gic>;
|
||||
@@ -183,6 +181,24 @@
|
||||
|
||||
gmac0: ethernet@5000 {
|
||||
reg = <0x5000 0x1000>;
|
||||
|
||||
mdio {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
switch: switch@1e {
|
||||
compatible = "brcm,bcm53125";
|
||||
reg = <0x1e>;
|
||||
|
||||
status = "disabled";
|
||||
|
||||
/* ports are defined in board DTS */
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
gmac1: ethernet@b000 {
|
||||
|
||||
@@ -337,6 +337,7 @@ static struct gpiod_lookup_table ep93xx_i2c_gpiod_table = {
|
||||
GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN),
|
||||
GPIO_LOOKUP_IDX("G", 0, NULL, 1,
|
||||
GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN),
|
||||
{ }
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
@@ -585,6 +585,7 @@
|
||||
clock-names = "spiclk", "apb_pclk";
|
||||
dmas = <&dmac 12>, <&dmac 13>;
|
||||
dma-names = "tx", "rx";
|
||||
num-cs = <2>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spi0_clk &spi0_csn &spi0_miso &spi0_mosi>;
|
||||
#address-cells = <1>;
|
||||
@@ -600,6 +601,7 @@
|
||||
clock-names = "spiclk", "apb_pclk";
|
||||
dmas = <&dmac 14>, <&dmac 15>;
|
||||
dma-names = "tx", "rx";
|
||||
num-cs = <2>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spi1_clk &spi1_csn0 &spi1_csn1 &spi1_miso &spi1_mosi>;
|
||||
#address-cells = <1>;
|
||||
|
||||
@@ -36,6 +36,29 @@
|
||||
reset-gpios = <&gpio0 RK_PB2 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
|
||||
sound {
|
||||
compatible = "audio-graph-card";
|
||||
label = "Analog";
|
||||
dais = <&i2s0_p0>;
|
||||
};
|
||||
|
||||
sound-dit {
|
||||
compatible = "audio-graph-card";
|
||||
label = "SPDIF";
|
||||
dais = <&spdif_p0>;
|
||||
};
|
||||
|
||||
spdif-dit {
|
||||
compatible = "linux,spdif-dit";
|
||||
#sound-dai-cells = <0>;
|
||||
|
||||
port {
|
||||
dit_p0_0: endpoint {
|
||||
remote-endpoint = <&spdif_p0_0>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
vcc12v_dcin: dc-12v {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "vcc12v_dcin";
|
||||
@@ -98,24 +121,25 @@
|
||||
vin-supply = <&vcc5v0_sys>;
|
||||
};
|
||||
|
||||
vcc5v0_typec: vcc5v0-typec-regulator {
|
||||
vbus_typec: vbus-typec-regulator {
|
||||
compatible = "regulator-fixed";
|
||||
enable-active-high;
|
||||
gpio = <&gpio1 RK_PA3 GPIO_ACTIVE_HIGH>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&vcc5v0_typec_en>;
|
||||
regulator-name = "vcc5v0_typec";
|
||||
regulator-name = "vbus_typec";
|
||||
regulator-always-on;
|
||||
vin-supply = <&vcc5v0_sys>;
|
||||
};
|
||||
|
||||
vcc_lan: vcc3v3-phy-regulator {
|
||||
vcc3v3_lan: vcc3v3-lan-regulator {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "vcc_lan";
|
||||
regulator-name = "vcc3v3_lan";
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
regulator-min-microvolt = <3300000>;
|
||||
regulator-max-microvolt = <3300000>;
|
||||
vin-supply = <&vcc3v3_sys>;
|
||||
};
|
||||
|
||||
vdd_log: vdd-log {
|
||||
@@ -162,7 +186,7 @@
|
||||
assigned-clocks = <&cru SCLK_RMII_SRC>;
|
||||
assigned-clock-parents = <&clkin_gmac>;
|
||||
clock_in_out = "input";
|
||||
phy-supply = <&vcc_lan>;
|
||||
phy-supply = <&vcc3v3_lan>;
|
||||
phy-mode = "rgmii";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&rgmii_pins>;
|
||||
@@ -267,8 +291,8 @@
|
||||
};
|
||||
};
|
||||
|
||||
vcc1v8_codec: LDO_REG1 {
|
||||
regulator-name = "vcc1v8_codec";
|
||||
vcca1v8_codec: LDO_REG1 {
|
||||
regulator-name = "vcca1v8_codec";
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
regulator-min-microvolt = <1800000>;
|
||||
@@ -278,8 +302,8 @@
|
||||
};
|
||||
};
|
||||
|
||||
vcc1v8_hdmi: LDO_REG2 {
|
||||
regulator-name = "vcc1v8_hdmi";
|
||||
vcca1v8_hdmi: LDO_REG2 {
|
||||
regulator-name = "vcca1v8_hdmi";
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
regulator-min-microvolt = <1800000>;
|
||||
@@ -336,8 +360,8 @@
|
||||
};
|
||||
};
|
||||
|
||||
vcc0v9_hdmi: LDO_REG7 {
|
||||
regulator-name = "vcc0v9_hdmi";
|
||||
vcca0v9_hdmi: LDO_REG7 {
|
||||
regulator-name = "vcca0v9_hdmi";
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
regulator-min-microvolt = <900000>;
|
||||
@@ -422,6 +446,20 @@
|
||||
i2c-scl-rising-time-ns = <300>;
|
||||
i2c-scl-falling-time-ns = <15>;
|
||||
status = "okay";
|
||||
|
||||
es8316: codec@11 {
|
||||
compatible = "everest,es8316";
|
||||
reg = <0x11>;
|
||||
clocks = <&cru SCLK_I2S_8CH_OUT>;
|
||||
clock-names = "mclk";
|
||||
#sound-dai-cells = <0>;
|
||||
|
||||
port {
|
||||
es8316_p0_0: endpoint {
|
||||
remote-endpoint = <&i2s0_p0_0>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&i2c3 {
|
||||
@@ -441,6 +479,14 @@
|
||||
rockchip,capture-channels = <2>;
|
||||
rockchip,playback-channels = <2>;
|
||||
status = "okay";
|
||||
|
||||
i2s0_p0: port {
|
||||
i2s0_p0_0: endpoint {
|
||||
dai-format = "i2s";
|
||||
mclk-fs = <256>;
|
||||
remote-endpoint = <&es8316_p0_0>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&i2s1 {
|
||||
@@ -456,7 +502,7 @@
|
||||
status = "okay";
|
||||
|
||||
bt656-supply = <&vcc_3v0>;
|
||||
audio-supply = <&vcc1v8_codec>;
|
||||
audio-supply = <&vcca1v8_codec>;
|
||||
sdmmc-supply = <&vcc_sdio>;
|
||||
gpio1830-supply = <&vcc_3v0>;
|
||||
};
|
||||
@@ -602,6 +648,15 @@
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&spdif {
|
||||
|
||||
spdif_p0: port {
|
||||
spdif_p0_0: endpoint {
|
||||
remote-endpoint = <&dit_p0_0>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&tcphy0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
@@ -8,16 +8,11 @@
|
||||
#define __ASM_EXCEPTION_H
|
||||
|
||||
#include <asm/esr.h>
|
||||
#include <asm/kprobes.h>
|
||||
#include <asm/ptrace.h>
|
||||
|
||||
#include <linux/interrupt.h>
|
||||
|
||||
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
|
||||
#define __exception_irq_entry __irq_entry
|
||||
#else
|
||||
#define __exception_irq_entry __kprobes
|
||||
#endif
|
||||
|
||||
static inline unsigned long disr_to_esr(u64 disr)
|
||||
{
|
||||
|
||||
@@ -462,6 +462,9 @@ static int its_sync_lpi_pending_table(struct kvm_vcpu *vcpu)
|
||||
}
|
||||
|
||||
irq = vgic_get_irq(vcpu->kvm, NULL, intids[i]);
|
||||
if (!irq)
|
||||
continue;
|
||||
|
||||
raw_spin_lock_irqsave(&irq->irq_lock, flags);
|
||||
irq->pending_latch = pendmask & (1U << bit_nr);
|
||||
vgic_queue_irq_unlock(vcpu->kvm, irq, flags);
|
||||
@@ -1427,6 +1430,8 @@ static int vgic_its_cmd_handle_movall(struct kvm *kvm, struct vgic_its *its,
|
||||
|
||||
for (i = 0; i < irq_count; i++) {
|
||||
irq = vgic_get_irq(kvm, NULL, intids[i]);
|
||||
if (!irq)
|
||||
continue;
|
||||
|
||||
update_affinity(irq, vcpu2);
|
||||
|
||||
|
||||
@@ -440,7 +440,7 @@ static phys_addr_t pgd_pgtable_alloc(int shift)
|
||||
static void __init create_mapping_noalloc(phys_addr_t phys, unsigned long virt,
|
||||
phys_addr_t size, pgprot_t prot)
|
||||
{
|
||||
if ((virt >= PAGE_END) && (virt < VMALLOC_START)) {
|
||||
if (virt < PAGE_OFFSET) {
|
||||
pr_warn("BUG: not creating mapping for %pa at 0x%016lx - outside kernel range\n",
|
||||
&phys, virt);
|
||||
return;
|
||||
@@ -467,7 +467,7 @@ void __init create_pgd_mapping(struct mm_struct *mm, phys_addr_t phys,
|
||||
static void update_mapping_prot(phys_addr_t phys, unsigned long virt,
|
||||
phys_addr_t size, pgprot_t prot)
|
||||
{
|
||||
if ((virt >= PAGE_END) && (virt < VMALLOC_START)) {
|
||||
if (virt < PAGE_OFFSET) {
|
||||
pr_warn("BUG: not updating mapping for %pa at 0x%016lx - outside kernel range\n",
|
||||
&phys, virt);
|
||||
return;
|
||||
|
||||
@@ -102,7 +102,6 @@ struct vpe_control {
|
||||
struct list_head tc_list; /* Thread contexts */
|
||||
};
|
||||
|
||||
extern unsigned long physical_memsize;
|
||||
extern struct vpe_control vpecontrol;
|
||||
extern const struct file_operations vpe_fops;
|
||||
|
||||
|
||||
@@ -424,9 +424,11 @@ static void cps_shutdown_this_cpu(enum cpu_death death)
|
||||
wmb();
|
||||
}
|
||||
} else {
|
||||
pr_debug("Gating power to core %d\n", core);
|
||||
/* Power down the core */
|
||||
cps_pm_enter_state(CPS_PM_POWER_GATED);
|
||||
if (IS_ENABLED(CONFIG_HOTPLUG_CPU)) {
|
||||
pr_debug("Gating power to core %d\n", core);
|
||||
/* Power down the core */
|
||||
cps_pm_enter_state(CPS_PM_POWER_GATED);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -2001,7 +2001,13 @@ unsigned long vi_handlers[64];
|
||||
|
||||
void reserve_exception_space(phys_addr_t addr, unsigned long size)
|
||||
{
|
||||
memblock_reserve(addr, size);
|
||||
/*
|
||||
* reserve exception space on CPUs other than CPU0
|
||||
* is too late, since memblock is unavailable when APs
|
||||
* up
|
||||
*/
|
||||
if (smp_processor_id() == 0)
|
||||
memblock_reserve(addr, size);
|
||||
}
|
||||
|
||||
void __init *set_except_vector(int n, void *addr)
|
||||
|
||||
@@ -92,12 +92,11 @@ int vpe_run(struct vpe *v)
|
||||
write_tc_c0_tchalt(read_tc_c0_tchalt() & ~TCHALT_H);
|
||||
|
||||
/*
|
||||
* The sde-kit passes 'memsize' to __start in $a3, so set something
|
||||
* here... Or set $a3 to zero and define DFLT_STACK_SIZE and
|
||||
* DFLT_HEAP_SIZE when you compile your program
|
||||
* We don't pass the memsize here, so VPE programs need to be
|
||||
* compiled with DFLT_STACK_SIZE and DFLT_HEAP_SIZE defined.
|
||||
*/
|
||||
mttgpr(7, 0);
|
||||
mttgpr(6, v->ntcs);
|
||||
mttgpr(7, physical_memsize);
|
||||
|
||||
/* set up VPE1 */
|
||||
/*
|
||||
|
||||
@@ -22,12 +22,6 @@
|
||||
DEFINE_SPINLOCK(ebu_lock);
|
||||
EXPORT_SYMBOL_GPL(ebu_lock);
|
||||
|
||||
/*
|
||||
* This is needed by the VPE loader code, just set it to 0 and assume
|
||||
* that the firmware hardcodes this value to something useful.
|
||||
*/
|
||||
unsigned long physical_memsize = 0L;
|
||||
|
||||
/*
|
||||
* this struct is filled by the soc specific detection code and holds
|
||||
* information about the specific soc type, revision and name
|
||||
|
||||
@@ -1054,45 +1054,46 @@ void eeh_handle_normal_event(struct eeh_pe *pe)
|
||||
}
|
||||
|
||||
pr_info("EEH: Recovery successful.\n");
|
||||
} else {
|
||||
/*
|
||||
* About 90% of all real-life EEH failures in the field
|
||||
* are due to poorly seated PCI cards. Only 10% or so are
|
||||
* due to actual, failed cards.
|
||||
*/
|
||||
pr_err("EEH: Unable to recover from failure from PHB#%x-PE#%x.\n"
|
||||
"Please try reseating or replacing it\n",
|
||||
pe->phb->global_number, pe->addr);
|
||||
goto out;
|
||||
}
|
||||
|
||||
eeh_slot_error_detail(pe, EEH_LOG_PERM);
|
||||
/*
|
||||
* About 90% of all real-life EEH failures in the field
|
||||
* are due to poorly seated PCI cards. Only 10% or so are
|
||||
* due to actual, failed cards.
|
||||
*/
|
||||
pr_err("EEH: Unable to recover from failure from PHB#%x-PE#%x.\n"
|
||||
"Please try reseating or replacing it\n",
|
||||
pe->phb->global_number, pe->addr);
|
||||
|
||||
/* Notify all devices that they're about to go down. */
|
||||
eeh_set_channel_state(pe, pci_channel_io_perm_failure);
|
||||
eeh_set_irq_state(pe, false);
|
||||
eeh_pe_report("error_detected(permanent failure)", pe,
|
||||
eeh_report_failure, NULL);
|
||||
eeh_slot_error_detail(pe, EEH_LOG_PERM);
|
||||
|
||||
/* Mark the PE to be removed permanently */
|
||||
eeh_pe_state_mark(pe, EEH_PE_REMOVED);
|
||||
/* Notify all devices that they're about to go down. */
|
||||
eeh_set_irq_state(pe, false);
|
||||
eeh_pe_report("error_detected(permanent failure)", pe,
|
||||
eeh_report_failure, NULL);
|
||||
eeh_set_channel_state(pe, pci_channel_io_perm_failure);
|
||||
|
||||
/*
|
||||
* Shut down the device drivers for good. We mark
|
||||
* all removed devices correctly to avoid access
|
||||
* the their PCI config any more.
|
||||
*/
|
||||
if (pe->type & EEH_PE_VF) {
|
||||
eeh_pe_dev_traverse(pe, eeh_rmv_device, NULL);
|
||||
eeh_pe_dev_mode_mark(pe, EEH_DEV_REMOVED);
|
||||
} else {
|
||||
eeh_pe_state_clear(pe, EEH_PE_PRI_BUS, true);
|
||||
eeh_pe_dev_mode_mark(pe, EEH_DEV_REMOVED);
|
||||
/* Mark the PE to be removed permanently */
|
||||
eeh_pe_state_mark(pe, EEH_PE_REMOVED);
|
||||
|
||||
pci_lock_rescan_remove();
|
||||
pci_hp_remove_devices(bus);
|
||||
pci_unlock_rescan_remove();
|
||||
/* The passed PE should no longer be used */
|
||||
return;
|
||||
}
|
||||
/*
|
||||
* Shut down the device drivers for good. We mark
|
||||
* all removed devices correctly to avoid access
|
||||
* the their PCI config any more.
|
||||
*/
|
||||
if (pe->type & EEH_PE_VF) {
|
||||
eeh_pe_dev_traverse(pe, eeh_rmv_device, NULL);
|
||||
eeh_pe_dev_mode_mark(pe, EEH_DEV_REMOVED);
|
||||
} else {
|
||||
eeh_pe_state_clear(pe, EEH_PE_PRI_BUS, true);
|
||||
eeh_pe_dev_mode_mark(pe, EEH_DEV_REMOVED);
|
||||
|
||||
pci_lock_rescan_remove();
|
||||
pci_hp_remove_devices(bus);
|
||||
pci_unlock_rescan_remove();
|
||||
/* The passed PE should no longer be used */
|
||||
return;
|
||||
}
|
||||
|
||||
out:
|
||||
@@ -1188,10 +1189,10 @@ void eeh_handle_special_event(void)
|
||||
|
||||
/* Notify all devices to be down */
|
||||
eeh_pe_state_clear(pe, EEH_PE_PRI_BUS, true);
|
||||
eeh_set_channel_state(pe, pci_channel_io_perm_failure);
|
||||
eeh_pe_report(
|
||||
"error_detected(permanent failure)", pe,
|
||||
eeh_report_failure, NULL);
|
||||
eeh_set_channel_state(pe, pci_channel_io_perm_failure);
|
||||
|
||||
pci_lock_rescan_remove();
|
||||
list_for_each_entry(hose, &hose_list, list_node) {
|
||||
|
||||
@@ -68,10 +68,10 @@ struct rtas_t rtas = {
|
||||
EXPORT_SYMBOL(rtas);
|
||||
|
||||
DEFINE_SPINLOCK(rtas_data_buf_lock);
|
||||
EXPORT_SYMBOL(rtas_data_buf_lock);
|
||||
EXPORT_SYMBOL_GPL(rtas_data_buf_lock);
|
||||
|
||||
char rtas_data_buf[RTAS_DATA_BUF_SIZE] __cacheline_aligned;
|
||||
EXPORT_SYMBOL(rtas_data_buf);
|
||||
char rtas_data_buf[RTAS_DATA_BUF_SIZE] __aligned(SZ_4K);
|
||||
EXPORT_SYMBOL_GPL(rtas_data_buf);
|
||||
|
||||
unsigned long rtas_rmo_buf;
|
||||
|
||||
@@ -80,7 +80,7 @@ unsigned long rtas_rmo_buf;
|
||||
* This is done like this so rtas_flash can be a module.
|
||||
*/
|
||||
void (*rtas_flash_term_hook)(int);
|
||||
EXPORT_SYMBOL(rtas_flash_term_hook);
|
||||
EXPORT_SYMBOL_GPL(rtas_flash_term_hook);
|
||||
|
||||
/* RTAS use home made raw locking instead of spin_lock_irqsave
|
||||
* because those can be called from within really nasty contexts
|
||||
@@ -328,7 +328,7 @@ void rtas_progress(char *s, unsigned short hex)
|
||||
|
||||
spin_unlock(&progress_lock);
|
||||
}
|
||||
EXPORT_SYMBOL(rtas_progress); /* needed by rtas_flash module */
|
||||
EXPORT_SYMBOL_GPL(rtas_progress); /* needed by rtas_flash module */
|
||||
|
||||
int rtas_token(const char *service)
|
||||
{
|
||||
@@ -338,7 +338,7 @@ int rtas_token(const char *service)
|
||||
tokp = of_get_property(rtas.dev, service, NULL);
|
||||
return tokp ? be32_to_cpu(*tokp) : RTAS_UNKNOWN_SERVICE;
|
||||
}
|
||||
EXPORT_SYMBOL(rtas_token);
|
||||
EXPORT_SYMBOL_GPL(rtas_token);
|
||||
|
||||
int rtas_service_present(const char *service)
|
||||
{
|
||||
@@ -498,7 +498,7 @@ int rtas_call(int token, int nargs, int nret, int *outputs, ...)
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(rtas_call);
|
||||
EXPORT_SYMBOL_GPL(rtas_call);
|
||||
|
||||
/* For RTAS_BUSY (-2), delay for 1 millisecond. For an extended busy status
|
||||
* code of 990n, perform the hinted delay of 10^n (last digit) milliseconds.
|
||||
@@ -533,7 +533,7 @@ unsigned int rtas_busy_delay(int status)
|
||||
|
||||
return ms;
|
||||
}
|
||||
EXPORT_SYMBOL(rtas_busy_delay);
|
||||
EXPORT_SYMBOL_GPL(rtas_busy_delay);
|
||||
|
||||
static int rtas_error_rc(int rtas_rc)
|
||||
{
|
||||
@@ -579,7 +579,7 @@ int rtas_get_power_level(int powerdomain, int *level)
|
||||
return rtas_error_rc(rc);
|
||||
return rc;
|
||||
}
|
||||
EXPORT_SYMBOL(rtas_get_power_level);
|
||||
EXPORT_SYMBOL_GPL(rtas_get_power_level);
|
||||
|
||||
int rtas_set_power_level(int powerdomain, int level, int *setlevel)
|
||||
{
|
||||
@@ -597,7 +597,7 @@ int rtas_set_power_level(int powerdomain, int level, int *setlevel)
|
||||
return rtas_error_rc(rc);
|
||||
return rc;
|
||||
}
|
||||
EXPORT_SYMBOL(rtas_set_power_level);
|
||||
EXPORT_SYMBOL_GPL(rtas_set_power_level);
|
||||
|
||||
int rtas_get_sensor(int sensor, int index, int *state)
|
||||
{
|
||||
@@ -615,7 +615,7 @@ int rtas_get_sensor(int sensor, int index, int *state)
|
||||
return rtas_error_rc(rc);
|
||||
return rc;
|
||||
}
|
||||
EXPORT_SYMBOL(rtas_get_sensor);
|
||||
EXPORT_SYMBOL_GPL(rtas_get_sensor);
|
||||
|
||||
int rtas_get_sensor_fast(int sensor, int index, int *state)
|
||||
{
|
||||
@@ -676,7 +676,7 @@ int rtas_set_indicator(int indicator, int index, int new_value)
|
||||
return rtas_error_rc(rc);
|
||||
return rc;
|
||||
}
|
||||
EXPORT_SYMBOL(rtas_set_indicator);
|
||||
EXPORT_SYMBOL_GPL(rtas_set_indicator);
|
||||
|
||||
/*
|
||||
* Ignoring RTAS extended delay
|
||||
|
||||
@@ -79,9 +79,8 @@ static u32 phys_coresperchip; /* Physical cores per chip */
|
||||
*/
|
||||
void read_24x7_sys_info(void)
|
||||
{
|
||||
int call_status, len, ntypes;
|
||||
|
||||
spin_lock(&rtas_data_buf_lock);
|
||||
const s32 token = rtas_token("ibm,get-system-parameter");
|
||||
int call_status;
|
||||
|
||||
/*
|
||||
* Making system parameter: chips and sockets and cores per chip
|
||||
@@ -91,32 +90,27 @@ void read_24x7_sys_info(void)
|
||||
phys_chipspersocket = 1;
|
||||
phys_coresperchip = 1;
|
||||
|
||||
call_status = rtas_call(rtas_token("ibm,get-system-parameter"), 3, 1,
|
||||
NULL,
|
||||
PROCESSOR_MODULE_INFO,
|
||||
__pa(rtas_data_buf),
|
||||
RTAS_DATA_BUF_SIZE);
|
||||
do {
|
||||
spin_lock(&rtas_data_buf_lock);
|
||||
call_status = rtas_call(token, 3, 1, NULL, PROCESSOR_MODULE_INFO,
|
||||
__pa(rtas_data_buf), RTAS_DATA_BUF_SIZE);
|
||||
if (call_status == 0) {
|
||||
int ntypes = be16_to_cpup((__be16 *)&rtas_data_buf[2]);
|
||||
int len = be16_to_cpup((__be16 *)&rtas_data_buf[0]);
|
||||
|
||||
if (len >= 8 && ntypes != 0) {
|
||||
phys_sockets = be16_to_cpup((__be16 *)&rtas_data_buf[4]);
|
||||
phys_chipspersocket = be16_to_cpup((__be16 *)&rtas_data_buf[6]);
|
||||
phys_coresperchip = be16_to_cpup((__be16 *)&rtas_data_buf[8]);
|
||||
}
|
||||
}
|
||||
spin_unlock(&rtas_data_buf_lock);
|
||||
} while (rtas_busy_delay(call_status));
|
||||
|
||||
if (call_status != 0) {
|
||||
pr_err("Error calling get-system-parameter %d\n",
|
||||
call_status);
|
||||
} else {
|
||||
len = be16_to_cpup((__be16 *)&rtas_data_buf[0]);
|
||||
if (len < 8)
|
||||
goto out;
|
||||
|
||||
ntypes = be16_to_cpup((__be16 *)&rtas_data_buf[2]);
|
||||
|
||||
if (!ntypes)
|
||||
goto out;
|
||||
|
||||
phys_sockets = be16_to_cpup((__be16 *)&rtas_data_buf[4]);
|
||||
phys_chipspersocket = be16_to_cpup((__be16 *)&rtas_data_buf[6]);
|
||||
phys_coresperchip = be16_to_cpup((__be16 *)&rtas_data_buf[8]);
|
||||
}
|
||||
|
||||
out:
|
||||
spin_unlock(&rtas_data_buf_lock);
|
||||
}
|
||||
|
||||
/* Domains for which more than one result element are returned for each event. */
|
||||
|
||||
@@ -2334,7 +2334,8 @@ static void pnv_ioda_setup_pe_res(struct pnv_ioda_pe *pe,
|
||||
int index;
|
||||
int64_t rc;
|
||||
|
||||
if (!res || !res->flags || res->start > res->end)
|
||||
if (!res || !res->flags || res->start > res->end ||
|
||||
res->flags & IORESOURCE_UNSET)
|
||||
return;
|
||||
|
||||
if (res->flags & IORESOURCE_IO) {
|
||||
|
||||
@@ -1434,22 +1434,22 @@ static inline void __init check_lp_set_hblkrm(unsigned int lp,
|
||||
|
||||
void __init pseries_lpar_read_hblkrm_characteristics(void)
|
||||
{
|
||||
const s32 token = rtas_token("ibm,get-system-parameter");
|
||||
unsigned char local_buffer[SPLPAR_TLB_BIC_MAXLENGTH];
|
||||
int call_status, len, idx, bpsize;
|
||||
|
||||
if (!firmware_has_feature(FW_FEATURE_BLOCK_REMOVE))
|
||||
return;
|
||||
|
||||
spin_lock(&rtas_data_buf_lock);
|
||||
memset(rtas_data_buf, 0, RTAS_DATA_BUF_SIZE);
|
||||
call_status = rtas_call(rtas_token("ibm,get-system-parameter"), 3, 1,
|
||||
NULL,
|
||||
SPLPAR_TLB_BIC_TOKEN,
|
||||
__pa(rtas_data_buf),
|
||||
RTAS_DATA_BUF_SIZE);
|
||||
memcpy(local_buffer, rtas_data_buf, SPLPAR_TLB_BIC_MAXLENGTH);
|
||||
local_buffer[SPLPAR_TLB_BIC_MAXLENGTH - 1] = '\0';
|
||||
spin_unlock(&rtas_data_buf_lock);
|
||||
do {
|
||||
spin_lock(&rtas_data_buf_lock);
|
||||
memset(rtas_data_buf, 0, RTAS_DATA_BUF_SIZE);
|
||||
call_status = rtas_call(token, 3, 1, NULL, SPLPAR_TLB_BIC_TOKEN,
|
||||
__pa(rtas_data_buf), RTAS_DATA_BUF_SIZE);
|
||||
memcpy(local_buffer, rtas_data_buf, SPLPAR_TLB_BIC_MAXLENGTH);
|
||||
local_buffer[SPLPAR_TLB_BIC_MAXLENGTH - 1] = '\0';
|
||||
spin_unlock(&rtas_data_buf_lock);
|
||||
} while (rtas_busy_delay(call_status));
|
||||
|
||||
if (call_status != 0) {
|
||||
pr_warn("%s %s Error calling get-system-parameter (0x%x)\n",
|
||||
|
||||
@@ -322,6 +322,7 @@ static void parse_mpp_x_data(struct seq_file *m)
|
||||
*/
|
||||
static void parse_system_parameter_string(struct seq_file *m)
|
||||
{
|
||||
const s32 token = rtas_token("ibm,get-system-parameter");
|
||||
int call_status;
|
||||
|
||||
unsigned char *local_buffer = kmalloc(SPLPAR_MAXLENGTH, GFP_KERNEL);
|
||||
@@ -331,16 +332,15 @@ static void parse_system_parameter_string(struct seq_file *m)
|
||||
return;
|
||||
}
|
||||
|
||||
spin_lock(&rtas_data_buf_lock);
|
||||
memset(rtas_data_buf, 0, SPLPAR_MAXLENGTH);
|
||||
call_status = rtas_call(rtas_token("ibm,get-system-parameter"), 3, 1,
|
||||
NULL,
|
||||
SPLPAR_CHARACTERISTICS_TOKEN,
|
||||
__pa(rtas_data_buf),
|
||||
RTAS_DATA_BUF_SIZE);
|
||||
memcpy(local_buffer, rtas_data_buf, SPLPAR_MAXLENGTH);
|
||||
local_buffer[SPLPAR_MAXLENGTH - 1] = '\0';
|
||||
spin_unlock(&rtas_data_buf_lock);
|
||||
do {
|
||||
spin_lock(&rtas_data_buf_lock);
|
||||
memset(rtas_data_buf, 0, SPLPAR_MAXLENGTH);
|
||||
call_status = rtas_call(token, 3, 1, NULL, SPLPAR_CHARACTERISTICS_TOKEN,
|
||||
__pa(rtas_data_buf), RTAS_DATA_BUF_SIZE);
|
||||
memcpy(local_buffer, rtas_data_buf, SPLPAR_MAXLENGTH);
|
||||
local_buffer[SPLPAR_MAXLENGTH - 1] = '\0';
|
||||
spin_unlock(&rtas_data_buf_lock);
|
||||
} while (rtas_busy_delay(call_status));
|
||||
|
||||
if (call_status != 0) {
|
||||
printk(KERN_INFO
|
||||
|
||||
@@ -128,7 +128,7 @@
|
||||
#define FUNCT3_C_J 0xa000
|
||||
#define FUNCT3_C_JAL 0x2000
|
||||
#define FUNCT4_C_JR 0x8000
|
||||
#define FUNCT4_C_JALR 0xf000
|
||||
#define FUNCT4_C_JALR 0x9000
|
||||
|
||||
#define FUNCT12_SRET 0x10200000
|
||||
|
||||
|
||||
@@ -228,7 +228,7 @@ resource_size_t pcibios_align_resource(void *data, const struct resource *res,
|
||||
/* combine single writes by using store-block insn */
|
||||
void __iowrite64_copy(void __iomem *to, const void *from, size_t count)
|
||||
{
|
||||
zpci_memcpy_toio(to, from, count);
|
||||
zpci_memcpy_toio(to, from, count * 8);
|
||||
}
|
||||
|
||||
static void __iomem *__ioremap(phys_addr_t addr, size_t size, pgprot_t prot)
|
||||
|
||||
@@ -207,6 +207,8 @@ extern void srso_alias_untrain_ret(void);
|
||||
extern void entry_untrain_ret(void);
|
||||
extern void entry_ibpb(void);
|
||||
|
||||
extern void (*x86_return_thunk)(void);
|
||||
|
||||
#ifdef CONFIG_RETPOLINE
|
||||
|
||||
typedef u8 retpoline_thunk_t[RETPOLINE_THUNK_SIZE];
|
||||
|
||||
@@ -95,25 +95,41 @@ union text_poke_insn {
|
||||
} __attribute__((packed));
|
||||
};
|
||||
|
||||
static __always_inline
|
||||
void __text_gen_insn(void *buf, u8 opcode, const void *addr, const void *dest, int size)
|
||||
{
|
||||
union text_poke_insn *insn = buf;
|
||||
|
||||
BUG_ON(size < text_opcode_size(opcode));
|
||||
|
||||
/*
|
||||
* Hide the addresses to avoid the compiler folding in constants when
|
||||
* referencing code, these can mess up annotations like
|
||||
* ANNOTATE_NOENDBR.
|
||||
*/
|
||||
OPTIMIZER_HIDE_VAR(insn);
|
||||
OPTIMIZER_HIDE_VAR(addr);
|
||||
OPTIMIZER_HIDE_VAR(dest);
|
||||
|
||||
insn->opcode = opcode;
|
||||
|
||||
if (size > 1) {
|
||||
insn->disp = (long)dest - (long)(addr + size);
|
||||
if (size == 2) {
|
||||
/*
|
||||
* Ensure that for JMP8 the displacement
|
||||
* actually fits the signed byte.
|
||||
*/
|
||||
BUG_ON((insn->disp >> 31) != (insn->disp >> 7));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static __always_inline
|
||||
void *text_gen_insn(u8 opcode, const void *addr, const void *dest)
|
||||
{
|
||||
static union text_poke_insn insn; /* per instance */
|
||||
int size = text_opcode_size(opcode);
|
||||
|
||||
insn.opcode = opcode;
|
||||
|
||||
if (size > 1) {
|
||||
insn.disp = (long)dest - (long)(addr + size);
|
||||
if (size == 2) {
|
||||
/*
|
||||
* Ensure that for JMP9 the displacement
|
||||
* actually fits the signed byte.
|
||||
*/
|
||||
BUG_ON((insn.disp >> 31) != (insn.disp >> 7));
|
||||
}
|
||||
}
|
||||
|
||||
__text_gen_insn(&insn, opcode, addr, dest, text_opcode_size(opcode));
|
||||
return &insn.text;
|
||||
}
|
||||
|
||||
|
||||
@@ -521,6 +521,7 @@ void __init_or_module noinline apply_retpolines(s32 *start, s32 *end)
|
||||
}
|
||||
|
||||
#ifdef CONFIG_RETHUNK
|
||||
|
||||
/*
|
||||
* Rewrite the compiler generated return thunk tail-calls.
|
||||
*
|
||||
@@ -536,14 +537,18 @@ static int patch_return(void *addr, struct insn *insn, u8 *bytes)
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
if (cpu_feature_enabled(X86_FEATURE_RETHUNK))
|
||||
return -1;
|
||||
if (cpu_feature_enabled(X86_FEATURE_RETHUNK)) {
|
||||
if (x86_return_thunk == __x86_return_thunk)
|
||||
return -1;
|
||||
|
||||
bytes[i++] = RET_INSN_OPCODE;
|
||||
i = JMP32_INSN_SIZE;
|
||||
__text_gen_insn(bytes, JMP32_INSN_OPCODE, addr, x86_return_thunk, i);
|
||||
} else {
|
||||
bytes[i++] = RET_INSN_OPCODE;
|
||||
}
|
||||
|
||||
for (; i < insn->length;)
|
||||
bytes[i++] = INT3_INSN_OPCODE;
|
||||
|
||||
return i;
|
||||
}
|
||||
|
||||
|
||||
@@ -246,12 +246,13 @@ static int __restore_fpregs_from_user(void __user *buf, u64 xrestore,
|
||||
* Attempt to restore the FPU registers directly from user memory.
|
||||
* Pagefaults are handled and any errors returned are fatal.
|
||||
*/
|
||||
static int restore_fpregs_from_user(void __user *buf, u64 xrestore,
|
||||
bool fx_only, unsigned int size)
|
||||
static int restore_fpregs_from_user(void __user *buf, u64 xrestore, bool fx_only)
|
||||
{
|
||||
struct fpu *fpu = ¤t->thread.fpu;
|
||||
int ret;
|
||||
|
||||
/* Restore enabled features only. */
|
||||
xrestore &= xfeatures_mask_all & XFEATURE_MASK_USER_SUPPORTED;
|
||||
retry:
|
||||
fpregs_lock();
|
||||
pagefault_disable();
|
||||
@@ -278,7 +279,7 @@ retry:
|
||||
if (ret != -EFAULT)
|
||||
return -EINVAL;
|
||||
|
||||
if (!fault_in_readable(buf, size))
|
||||
if (!fault_in_readable(buf, fpu_user_xstate_size))
|
||||
goto retry;
|
||||
return -EFAULT;
|
||||
}
|
||||
@@ -303,7 +304,6 @@ retry:
|
||||
static int __fpu_restore_sig(void __user *buf, void __user *buf_fx,
|
||||
bool ia32_fxstate)
|
||||
{
|
||||
int state_size = fpu_kernel_xstate_size;
|
||||
struct task_struct *tsk = current;
|
||||
struct fpu *fpu = &tsk->thread.fpu;
|
||||
struct user_i387_ia32_struct env;
|
||||
@@ -319,7 +319,6 @@ static int __fpu_restore_sig(void __user *buf, void __user *buf_fx,
|
||||
return ret;
|
||||
|
||||
fx_only = !fx_sw_user.magic1;
|
||||
state_size = fx_sw_user.xstate_size;
|
||||
user_xfeatures = fx_sw_user.xfeatures;
|
||||
} else {
|
||||
user_xfeatures = XFEATURE_MASK_FPSSE;
|
||||
@@ -332,8 +331,7 @@ static int __fpu_restore_sig(void __user *buf, void __user *buf_fx,
|
||||
* faults. If it does, fall back to the slow path below, going
|
||||
* through the kernel buffer with the enabled pagefault handler.
|
||||
*/
|
||||
return restore_fpregs_from_user(buf_fx, user_xfeatures, fx_only,
|
||||
state_size);
|
||||
return restore_fpregs_from_user(buf_fx, user_xfeatures, fx_only);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -367,10 +367,8 @@ create_trampoline(struct ftrace_ops *ops, unsigned int *tramp_size)
|
||||
goto fail;
|
||||
|
||||
ip = trampoline + size;
|
||||
|
||||
/* The trampoline ends with ret(q) */
|
||||
if (cpu_feature_enabled(X86_FEATURE_RETHUNK))
|
||||
memcpy(ip, text_gen_insn(JMP32_INSN_OPCODE, ip, &__x86_return_thunk), JMP32_INSN_SIZE);
|
||||
__text_gen_insn(ip, JMP32_INSN_OPCODE, ip, x86_return_thunk, JMP32_INSN_SIZE);
|
||||
else
|
||||
memcpy(ip, retq, sizeof(retq));
|
||||
|
||||
|
||||
@@ -58,29 +58,12 @@ static void paravirt_BUG(void)
|
||||
BUG();
|
||||
}
|
||||
|
||||
struct branch {
|
||||
unsigned char opcode;
|
||||
u32 delta;
|
||||
} __attribute__((packed));
|
||||
|
||||
static unsigned paravirt_patch_call(void *insn_buff, const void *target,
|
||||
unsigned long addr, unsigned len)
|
||||
{
|
||||
const int call_len = 5;
|
||||
struct branch *b = insn_buff;
|
||||
unsigned long delta = (unsigned long)target - (addr+call_len);
|
||||
|
||||
if (len < call_len) {
|
||||
pr_warn("paravirt: Failed to patch indirect CALL at %ps\n", (void *)addr);
|
||||
/* Kernel might not be viable if patching fails, bail out: */
|
||||
BUG_ON(1);
|
||||
}
|
||||
|
||||
b->opcode = 0xe8; /* call */
|
||||
b->delta = delta;
|
||||
BUILD_BUG_ON(sizeof(*b) != call_len);
|
||||
|
||||
return call_len;
|
||||
__text_gen_insn(insn_buff, CALL_INSN_OPCODE,
|
||||
(void *)addr, target, CALL_INSN_SIZE);
|
||||
return CALL_INSN_SIZE;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PARAVIRT_XXL
|
||||
|
||||
@@ -52,7 +52,7 @@ static void __ref __static_call_transform(void *insn, enum insn_type type,
|
||||
|
||||
case RET:
|
||||
if (cpu_feature_enabled(X86_FEATURE_RETHUNK))
|
||||
code = text_gen_insn(JMP32_INSN_OPCODE, insn, &__x86_return_thunk);
|
||||
code = text_gen_insn(JMP32_INSN_OPCODE, insn, x86_return_thunk);
|
||||
else
|
||||
code = &retinsn;
|
||||
break;
|
||||
|
||||
@@ -411,7 +411,7 @@ static void emit_return(u8 **pprog, u8 *ip)
|
||||
u8 *prog = *pprog;
|
||||
|
||||
if (cpu_feature_enabled(X86_FEATURE_RETHUNK)) {
|
||||
emit_jump(&prog, &__x86_return_thunk, ip);
|
||||
emit_jump(&prog, x86_return_thunk, ip);
|
||||
} else {
|
||||
EMIT1(0xC3); /* ret */
|
||||
if (IS_ENABLED(CONFIG_SLS))
|
||||
|
||||
@@ -77,6 +77,15 @@ static const struct dmi_system_id dmi_lid_quirks[] = {
|
||||
},
|
||||
.driver_data = (void *)(long)ACPI_BUTTON_LID_INIT_DISABLED,
|
||||
},
|
||||
{
|
||||
/* Nextbook Ares 8A tablet, _LID device always reports lid closed */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Insyde"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "CherryTrail"),
|
||||
DMI_MATCH(DMI_BIOS_VERSION, "M882"),
|
||||
},
|
||||
.driver_data = (void *)(long)ACPI_BUTTON_LID_INIT_DISABLED,
|
||||
},
|
||||
{
|
||||
/*
|
||||
* Lenovo Yoga 9 14ITL5, initial notification of the LID device
|
||||
|
||||
@@ -639,6 +639,7 @@ acpi_fwnode_get_named_child_node(const struct fwnode_handle *fwnode,
|
||||
* @index: Index of the reference to return
|
||||
* @num_args: Maximum number of arguments after each reference
|
||||
* @args: Location to store the returned reference with optional arguments
|
||||
* (may be NULL)
|
||||
*
|
||||
* Find property with @name, verifify that it is a package containing at least
|
||||
* one object reference and if so, store the ACPI device object pointer to the
|
||||
@@ -697,6 +698,9 @@ int __acpi_node_get_property_reference(const struct fwnode_handle *fwnode,
|
||||
if (ret)
|
||||
return ret == -ENODEV ? -EINVAL : ret;
|
||||
|
||||
if (!args)
|
||||
return 0;
|
||||
|
||||
args->fwnode = acpi_fwnode_handle(device);
|
||||
args->nargs = 0;
|
||||
return 0;
|
||||
|
||||
@@ -421,6 +421,41 @@ static const struct dmi_system_id asus_laptop[] = {
|
||||
DMI_MATCH(DMI_BOARD_NAME, "K3502ZA"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.ident = "Asus Vivobook S5402ZA",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "S5402ZA"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.ident = "Asus Vivobook S5602ZA",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "S5602ZA"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.ident = "Asus ExpertBook B1502CBA",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "B1502CBA"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.ident = "Asus ExpertBook B2402CBA",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "B2402CBA"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.ident = "Asus ExpertBook B2502",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "B2502CBA"),
|
||||
},
|
||||
},
|
||||
{ }
|
||||
};
|
||||
|
||||
|
||||
@@ -341,6 +341,40 @@ static const struct dmi_system_id video_detect_dmi_table[] = {
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "82BK"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = video_detect_force_native,
|
||||
/* Lenovo ThinkPad X131e (3371 AMD version) */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "3371"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = video_detect_force_native,
|
||||
/* Apple iMac11,3 */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "iMac11,3"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* https://gitlab.freedesktop.org/drm/amd/-/issues/1838 */
|
||||
.callback = video_detect_force_native,
|
||||
/* Apple iMac12,1 */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "iMac12,1"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* https://gitlab.freedesktop.org/drm/amd/-/issues/2753 */
|
||||
.callback = video_detect_force_native,
|
||||
/* Apple iMac12,2 */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "iMac12,2"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* https://bugzilla.redhat.com/show_bug.cgi?id=1217249 */
|
||||
.callback = video_detect_force_native,
|
||||
|
||||
@@ -49,6 +49,7 @@ enum {
|
||||
enum board_ids {
|
||||
/* board IDs by feature in alphabetical order */
|
||||
board_ahci,
|
||||
board_ahci_43bit_dma,
|
||||
board_ahci_ign_iferr,
|
||||
board_ahci_low_power,
|
||||
board_ahci_no_debounce_delay,
|
||||
@@ -129,6 +130,13 @@ static const struct ata_port_info ahci_port_info[] = {
|
||||
.udma_mask = ATA_UDMA6,
|
||||
.port_ops = &ahci_ops,
|
||||
},
|
||||
[board_ahci_43bit_dma] = {
|
||||
AHCI_HFLAGS (AHCI_HFLAG_43BIT_ONLY),
|
||||
.flags = AHCI_FLAG_COMMON,
|
||||
.pio_mask = ATA_PIO4,
|
||||
.udma_mask = ATA_UDMA6,
|
||||
.port_ops = &ahci_ops,
|
||||
},
|
||||
[board_ahci_ign_iferr] = {
|
||||
AHCI_HFLAGS (AHCI_HFLAG_IGN_IRQ_IF_ERR),
|
||||
.flags = AHCI_FLAG_COMMON,
|
||||
@@ -598,11 +606,11 @@ static const struct pci_device_id ahci_pci_tbl[] = {
|
||||
{ PCI_VDEVICE(PROMISE, 0x3f20), board_ahci }, /* PDC42819 */
|
||||
{ PCI_VDEVICE(PROMISE, 0x3781), board_ahci }, /* FastTrak TX8660 ahci-mode */
|
||||
|
||||
/* Asmedia */
|
||||
/* ASMedia */
|
||||
{ PCI_VDEVICE(ASMEDIA, 0x0601), board_ahci }, /* ASM1060 */
|
||||
{ PCI_VDEVICE(ASMEDIA, 0x0602), board_ahci }, /* ASM1060 */
|
||||
{ PCI_VDEVICE(ASMEDIA, 0x0611), board_ahci }, /* ASM1061 */
|
||||
{ PCI_VDEVICE(ASMEDIA, 0x0612), board_ahci }, /* ASM1062 */
|
||||
{ PCI_VDEVICE(ASMEDIA, 0x0611), board_ahci_43bit_dma }, /* ASM1061 */
|
||||
{ PCI_VDEVICE(ASMEDIA, 0x0612), board_ahci_43bit_dma }, /* ASM1061/1062 */
|
||||
{ PCI_VDEVICE(ASMEDIA, 0x0621), board_ahci }, /* ASM1061R */
|
||||
{ PCI_VDEVICE(ASMEDIA, 0x0622), board_ahci }, /* ASM1062R */
|
||||
|
||||
@@ -658,6 +666,11 @@ MODULE_PARM_DESC(mobile_lpm_policy, "Default LPM policy for mobile chipsets");
|
||||
static void ahci_pci_save_initial_config(struct pci_dev *pdev,
|
||||
struct ahci_host_priv *hpriv)
|
||||
{
|
||||
if (pdev->vendor == PCI_VENDOR_ID_ASMEDIA && pdev->device == 0x1166) {
|
||||
dev_info(&pdev->dev, "ASM1166 has only six ports\n");
|
||||
hpriv->saved_port_map = 0x3f;
|
||||
}
|
||||
|
||||
if (pdev->vendor == PCI_VENDOR_ID_JMICRON && pdev->device == 0x2361) {
|
||||
dev_info(&pdev->dev, "JMB361 has only one port\n");
|
||||
hpriv->force_port_map = 1;
|
||||
@@ -950,11 +963,20 @@ static int ahci_pci_device_resume(struct device *dev)
|
||||
|
||||
#endif /* CONFIG_PM */
|
||||
|
||||
static int ahci_configure_dma_masks(struct pci_dev *pdev, int using_dac)
|
||||
static int ahci_configure_dma_masks(struct pci_dev *pdev,
|
||||
struct ahci_host_priv *hpriv)
|
||||
{
|
||||
const int dma_bits = using_dac ? 64 : 32;
|
||||
int dma_bits;
|
||||
int rc;
|
||||
|
||||
if (hpriv->cap & HOST_CAP_64) {
|
||||
dma_bits = 64;
|
||||
if (hpriv->flags & AHCI_HFLAG_43BIT_ONLY)
|
||||
dma_bits = 43;
|
||||
} else {
|
||||
dma_bits = 32;
|
||||
}
|
||||
|
||||
/*
|
||||
* If the device fixup already set the dma_mask to some non-standard
|
||||
* value, don't extend it here. This happens on STA2X11, for example.
|
||||
@@ -1932,7 +1954,7 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
ahci_gtf_filter_workaround(host);
|
||||
|
||||
/* initialize adapter */
|
||||
rc = ahci_configure_dma_masks(pdev, hpriv->cap & HOST_CAP_64);
|
||||
rc = ahci_configure_dma_masks(pdev, hpriv);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
|
||||
@@ -39,7 +39,6 @@
|
||||
|
||||
enum {
|
||||
AHCI_MAX_PORTS = 32,
|
||||
AHCI_MAX_CLKS = 5,
|
||||
AHCI_MAX_SG = 168, /* hardware max is 64K */
|
||||
AHCI_DMA_BOUNDARY = 0xffffffff,
|
||||
AHCI_MAX_CMDS = 32,
|
||||
@@ -244,6 +243,7 @@ enum {
|
||||
AHCI_HFLAG_IGN_NOTSUPP_POWER_ON = BIT(27), /* ignore -EOPNOTSUPP
|
||||
from phy_power_on() */
|
||||
AHCI_HFLAG_NO_SXS = BIT(28), /* SXS not supported */
|
||||
AHCI_HFLAG_43BIT_ONLY = BIT(29), /* 43bit DMA addr limit */
|
||||
|
||||
/* ap->flags bits */
|
||||
|
||||
@@ -342,7 +342,9 @@ struct ahci_host_priv {
|
||||
u32 em_msg_type; /* EM message type */
|
||||
u32 remapped_nvme; /* NVMe remapped device count */
|
||||
bool got_runtime_pm; /* Did we do pm_runtime_get? */
|
||||
struct clk *clks[AHCI_MAX_CLKS]; /* Optional */
|
||||
unsigned int n_clks;
|
||||
struct clk_bulk_data *clks; /* Optional */
|
||||
unsigned int f_rsts;
|
||||
struct reset_control *rsts; /* Optional */
|
||||
struct regulator **target_pwrs; /* Optional */
|
||||
struct regulator *ahci_regulator;/* Optional */
|
||||
|
||||
@@ -88,7 +88,6 @@ struct ceva_ahci_priv {
|
||||
u32 axicc;
|
||||
bool is_cci_enabled;
|
||||
int flags;
|
||||
struct reset_control *rst;
|
||||
};
|
||||
|
||||
static unsigned int ceva_ahci_read_id(struct ata_device *dev,
|
||||
@@ -189,6 +188,60 @@ static struct scsi_host_template ahci_platform_sht = {
|
||||
AHCI_SHT(DRV_NAME),
|
||||
};
|
||||
|
||||
static int ceva_ahci_platform_enable_resources(struct ahci_host_priv *hpriv)
|
||||
{
|
||||
int rc, i;
|
||||
|
||||
rc = ahci_platform_enable_regulators(hpriv);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
rc = ahci_platform_enable_clks(hpriv);
|
||||
if (rc)
|
||||
goto disable_regulator;
|
||||
|
||||
/* Assert the controller reset */
|
||||
rc = ahci_platform_assert_rsts(hpriv);
|
||||
if (rc)
|
||||
goto disable_clks;
|
||||
|
||||
for (i = 0; i < hpriv->nports; i++) {
|
||||
rc = phy_init(hpriv->phys[i]);
|
||||
if (rc)
|
||||
goto disable_rsts;
|
||||
}
|
||||
|
||||
/* De-assert the controller reset */
|
||||
ahci_platform_deassert_rsts(hpriv);
|
||||
|
||||
for (i = 0; i < hpriv->nports; i++) {
|
||||
rc = phy_power_on(hpriv->phys[i]);
|
||||
if (rc) {
|
||||
phy_exit(hpriv->phys[i]);
|
||||
goto disable_phys;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
disable_rsts:
|
||||
ahci_platform_deassert_rsts(hpriv);
|
||||
|
||||
disable_phys:
|
||||
while (--i >= 0) {
|
||||
phy_power_off(hpriv->phys[i]);
|
||||
phy_exit(hpriv->phys[i]);
|
||||
}
|
||||
|
||||
disable_clks:
|
||||
ahci_platform_disable_clks(hpriv);
|
||||
|
||||
disable_regulator:
|
||||
ahci_platform_disable_regulators(hpriv);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int ceva_ahci_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device_node *np = pdev->dev.of_node;
|
||||
@@ -203,47 +256,19 @@ static int ceva_ahci_probe(struct platform_device *pdev)
|
||||
return -ENOMEM;
|
||||
|
||||
cevapriv->ahci_pdev = pdev;
|
||||
|
||||
cevapriv->rst = devm_reset_control_get_optional_exclusive(&pdev->dev,
|
||||
NULL);
|
||||
if (IS_ERR(cevapriv->rst))
|
||||
dev_err_probe(&pdev->dev, PTR_ERR(cevapriv->rst),
|
||||
"failed to get reset\n");
|
||||
|
||||
hpriv = ahci_platform_get_resources(pdev, 0);
|
||||
if (IS_ERR(hpriv))
|
||||
return PTR_ERR(hpriv);
|
||||
|
||||
if (!cevapriv->rst) {
|
||||
rc = ahci_platform_enable_resources(hpriv);
|
||||
if (rc)
|
||||
return rc;
|
||||
} else {
|
||||
int i;
|
||||
hpriv->rsts = devm_reset_control_get_optional_exclusive(&pdev->dev,
|
||||
NULL);
|
||||
if (IS_ERR(hpriv->rsts))
|
||||
return dev_err_probe(&pdev->dev, PTR_ERR(hpriv->rsts),
|
||||
"failed to get reset\n");
|
||||
|
||||
rc = ahci_platform_enable_clks(hpriv);
|
||||
if (rc)
|
||||
return rc;
|
||||
/* Assert the controller reset */
|
||||
reset_control_assert(cevapriv->rst);
|
||||
|
||||
for (i = 0; i < hpriv->nports; i++) {
|
||||
rc = phy_init(hpriv->phys[i]);
|
||||
if (rc)
|
||||
return rc;
|
||||
}
|
||||
|
||||
/* De-assert the controller reset */
|
||||
reset_control_deassert(cevapriv->rst);
|
||||
|
||||
for (i = 0; i < hpriv->nports; i++) {
|
||||
rc = phy_power_on(hpriv->phys[i]);
|
||||
if (rc) {
|
||||
phy_exit(hpriv->phys[i]);
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
}
|
||||
rc = ceva_ahci_platform_enable_resources(hpriv);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
if (of_property_read_bool(np, "ceva,broken-gen2"))
|
||||
cevapriv->flags = CEVA_FLAG_BROKEN_GEN2;
|
||||
@@ -252,52 +277,60 @@ static int ceva_ahci_probe(struct platform_device *pdev)
|
||||
if (of_property_read_u8_array(np, "ceva,p0-cominit-params",
|
||||
(u8 *)&cevapriv->pp2c[0], 4) < 0) {
|
||||
dev_warn(dev, "ceva,p0-cominit-params property not defined\n");
|
||||
return -EINVAL;
|
||||
rc = -EINVAL;
|
||||
goto disable_resources;
|
||||
}
|
||||
|
||||
if (of_property_read_u8_array(np, "ceva,p1-cominit-params",
|
||||
(u8 *)&cevapriv->pp2c[1], 4) < 0) {
|
||||
dev_warn(dev, "ceva,p1-cominit-params property not defined\n");
|
||||
return -EINVAL;
|
||||
rc = -EINVAL;
|
||||
goto disable_resources;
|
||||
}
|
||||
|
||||
/* Read OOB timing value for COMWAKE from device-tree*/
|
||||
if (of_property_read_u8_array(np, "ceva,p0-comwake-params",
|
||||
(u8 *)&cevapriv->pp3c[0], 4) < 0) {
|
||||
dev_warn(dev, "ceva,p0-comwake-params property not defined\n");
|
||||
return -EINVAL;
|
||||
rc = -EINVAL;
|
||||
goto disable_resources;
|
||||
}
|
||||
|
||||
if (of_property_read_u8_array(np, "ceva,p1-comwake-params",
|
||||
(u8 *)&cevapriv->pp3c[1], 4) < 0) {
|
||||
dev_warn(dev, "ceva,p1-comwake-params property not defined\n");
|
||||
return -EINVAL;
|
||||
rc = -EINVAL;
|
||||
goto disable_resources;
|
||||
}
|
||||
|
||||
/* Read phy BURST timing value from device-tree */
|
||||
if (of_property_read_u8_array(np, "ceva,p0-burst-params",
|
||||
(u8 *)&cevapriv->pp4c[0], 4) < 0) {
|
||||
dev_warn(dev, "ceva,p0-burst-params property not defined\n");
|
||||
return -EINVAL;
|
||||
rc = -EINVAL;
|
||||
goto disable_resources;
|
||||
}
|
||||
|
||||
if (of_property_read_u8_array(np, "ceva,p1-burst-params",
|
||||
(u8 *)&cevapriv->pp4c[1], 4) < 0) {
|
||||
dev_warn(dev, "ceva,p1-burst-params property not defined\n");
|
||||
return -EINVAL;
|
||||
rc = -EINVAL;
|
||||
goto disable_resources;
|
||||
}
|
||||
|
||||
/* Read phy RETRY interval timing value from device-tree */
|
||||
if (of_property_read_u16_array(np, "ceva,p0-retry-params",
|
||||
(u16 *)&cevapriv->pp5c[0], 2) < 0) {
|
||||
dev_warn(dev, "ceva,p0-retry-params property not defined\n");
|
||||
return -EINVAL;
|
||||
rc = -EINVAL;
|
||||
goto disable_resources;
|
||||
}
|
||||
|
||||
if (of_property_read_u16_array(np, "ceva,p1-retry-params",
|
||||
(u16 *)&cevapriv->pp5c[1], 2) < 0) {
|
||||
dev_warn(dev, "ceva,p1-retry-params property not defined\n");
|
||||
return -EINVAL;
|
||||
rc = -EINVAL;
|
||||
goto disable_resources;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -335,7 +368,7 @@ static int __maybe_unused ceva_ahci_resume(struct device *dev)
|
||||
struct ahci_host_priv *hpriv = host->private_data;
|
||||
int rc;
|
||||
|
||||
rc = ahci_platform_enable_resources(hpriv);
|
||||
rc = ceva_ahci_platform_enable_resources(hpriv);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
|
||||
@@ -163,7 +163,6 @@ static int ahci_da850_probe(struct platform_device *pdev)
|
||||
struct ahci_host_priv *hpriv;
|
||||
void __iomem *pwrdn_reg;
|
||||
struct resource *res;
|
||||
struct clk *clk;
|
||||
u32 mpy;
|
||||
int rc;
|
||||
|
||||
@@ -172,36 +171,28 @@ static int ahci_da850_probe(struct platform_device *pdev)
|
||||
return PTR_ERR(hpriv);
|
||||
|
||||
/*
|
||||
* Internally ahci_platform_get_resources() calls clk_get(dev, NULL)
|
||||
* when trying to obtain the functional clock. This SATA controller
|
||||
* uses two clocks for which we specify two connection ids. If we don't
|
||||
* have the functional clock at this point - call clk_get() again with
|
||||
* con_id = "fck".
|
||||
* Internally ahci_platform_get_resources() calls the bulk clocks
|
||||
* get method or falls back to using a single clk_get_optional().
|
||||
* This AHCI SATA controller uses two clocks: functional clock
|
||||
* with "fck" connection id and external reference clock with
|
||||
* "refclk" id. If we haven't got all of them re-try the clocks
|
||||
* getting procedure with the explicitly specified ids.
|
||||
*/
|
||||
if (!hpriv->clks[0]) {
|
||||
clk = clk_get(dev, "fck");
|
||||
if (IS_ERR(clk))
|
||||
return PTR_ERR(clk);
|
||||
if (hpriv->n_clks < 2) {
|
||||
hpriv->clks = devm_kcalloc(dev, 2, sizeof(*hpriv->clks), GFP_KERNEL);
|
||||
if (!hpriv->clks)
|
||||
return -ENOMEM;
|
||||
|
||||
hpriv->clks[0] = clk;
|
||||
hpriv->clks[0].id = "fck";
|
||||
hpriv->clks[1].id = "refclk";
|
||||
hpriv->n_clks = 2;
|
||||
|
||||
rc = devm_clk_bulk_get(dev, hpriv->n_clks, hpriv->clks);
|
||||
if (rc)
|
||||
return rc;
|
||||
}
|
||||
|
||||
/*
|
||||
* The second clock used by ahci-da850 is the external REFCLK. If we
|
||||
* didn't get it from ahci_platform_get_resources(), let's try to
|
||||
* specify the con_id in clk_get().
|
||||
*/
|
||||
if (!hpriv->clks[1]) {
|
||||
clk = clk_get(dev, "refclk");
|
||||
if (IS_ERR(clk)) {
|
||||
dev_err(dev, "unable to obtain the reference clock");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
hpriv->clks[1] = clk;
|
||||
}
|
||||
|
||||
mpy = ahci_da850_calculate_mpy(clk_get_rate(hpriv->clks[1]));
|
||||
mpy = ahci_da850_calculate_mpy(clk_get_rate(hpriv->clks[1].clk));
|
||||
if (mpy == 0) {
|
||||
dev_err(dev, "invalid REFCLK multiplier value: 0x%x", mpy);
|
||||
return -EINVAL;
|
||||
|
||||
@@ -69,12 +69,12 @@ static int ahci_dm816_phy_init(struct ahci_host_priv *hpriv, struct device *dev)
|
||||
* keep-alive clock and the external reference clock. We need the
|
||||
* rate of the latter to calculate the correct value of MPY bits.
|
||||
*/
|
||||
if (!hpriv->clks[1]) {
|
||||
if (hpriv->n_clks < 2) {
|
||||
dev_err(dev, "reference clock not supplied\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
refclk_rate = clk_get_rate(hpriv->clks[1]);
|
||||
refclk_rate = clk_get_rate(hpriv->clks[1].clk);
|
||||
if ((refclk_rate % 100) != 0) {
|
||||
dev_err(dev, "reference clock rate must be divisible by 100\n");
|
||||
return -EINVAL;
|
||||
|
||||
@@ -97,28 +97,14 @@ EXPORT_SYMBOL_GPL(ahci_platform_disable_phys);
|
||||
* ahci_platform_enable_clks - Enable platform clocks
|
||||
* @hpriv: host private area to store config values
|
||||
*
|
||||
* This function enables all the clks found in hpriv->clks, starting at
|
||||
* index 0. If any clk fails to enable it disables all the clks already
|
||||
* enabled in reverse order, and then returns an error.
|
||||
* This function enables all the clks found for the AHCI device.
|
||||
*
|
||||
* RETURNS:
|
||||
* 0 on success otherwise a negative error code
|
||||
*/
|
||||
int ahci_platform_enable_clks(struct ahci_host_priv *hpriv)
|
||||
{
|
||||
int c, rc;
|
||||
|
||||
for (c = 0; c < AHCI_MAX_CLKS && hpriv->clks[c]; c++) {
|
||||
rc = clk_prepare_enable(hpriv->clks[c]);
|
||||
if (rc)
|
||||
goto disable_unprepare_clk;
|
||||
}
|
||||
return 0;
|
||||
|
||||
disable_unprepare_clk:
|
||||
while (--c >= 0)
|
||||
clk_disable_unprepare(hpriv->clks[c]);
|
||||
return rc;
|
||||
return clk_bulk_prepare_enable(hpriv->n_clks, hpriv->clks);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ahci_platform_enable_clks);
|
||||
|
||||
@@ -126,19 +112,54 @@ EXPORT_SYMBOL_GPL(ahci_platform_enable_clks);
|
||||
* ahci_platform_disable_clks - Disable platform clocks
|
||||
* @hpriv: host private area to store config values
|
||||
*
|
||||
* This function disables all the clks found in hpriv->clks, in reverse
|
||||
* order of ahci_platform_enable_clks (starting at the end of the array).
|
||||
* This function disables all the clocks enabled before
|
||||
* (bulk-clocks-disable function is supposed to do that in reverse
|
||||
* from the enabling procedure order).
|
||||
*/
|
||||
void ahci_platform_disable_clks(struct ahci_host_priv *hpriv)
|
||||
{
|
||||
int c;
|
||||
|
||||
for (c = AHCI_MAX_CLKS - 1; c >= 0; c--)
|
||||
if (hpriv->clks[c])
|
||||
clk_disable_unprepare(hpriv->clks[c]);
|
||||
clk_bulk_disable_unprepare(hpriv->n_clks, hpriv->clks);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ahci_platform_disable_clks);
|
||||
|
||||
/**
|
||||
* ahci_platform_deassert_rsts - Deassert/trigger platform resets
|
||||
* @hpriv: host private area to store config values
|
||||
*
|
||||
* This function deasserts or triggers all the reset lines found for
|
||||
* the AHCI device.
|
||||
*
|
||||
* RETURNS:
|
||||
* 0 on success otherwise a negative error code
|
||||
*/
|
||||
int ahci_platform_deassert_rsts(struct ahci_host_priv *hpriv)
|
||||
{
|
||||
if (hpriv->f_rsts & AHCI_PLATFORM_RST_TRIGGER)
|
||||
return reset_control_reset(hpriv->rsts);
|
||||
|
||||
return reset_control_deassert(hpriv->rsts);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ahci_platform_deassert_rsts);
|
||||
|
||||
/**
|
||||
* ahci_platform_assert_rsts - Assert/rearm platform resets
|
||||
* @hpriv: host private area to store config values
|
||||
*
|
||||
* This function asserts or rearms (for self-deasserting resets) all
|
||||
* the reset controls found for the AHCI device.
|
||||
*
|
||||
* RETURNS:
|
||||
* 0 on success otherwise a negative error code
|
||||
*/
|
||||
int ahci_platform_assert_rsts(struct ahci_host_priv *hpriv)
|
||||
{
|
||||
if (hpriv->f_rsts & AHCI_PLATFORM_RST_TRIGGER)
|
||||
return reset_control_rearm(hpriv->rsts);
|
||||
|
||||
return reset_control_assert(hpriv->rsts);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ahci_platform_assert_rsts);
|
||||
|
||||
/**
|
||||
* ahci_platform_enable_regulators - Enable regulators
|
||||
* @hpriv: host private area to store config values
|
||||
@@ -236,18 +257,18 @@ int ahci_platform_enable_resources(struct ahci_host_priv *hpriv)
|
||||
if (rc)
|
||||
goto disable_regulator;
|
||||
|
||||
rc = reset_control_deassert(hpriv->rsts);
|
||||
rc = ahci_platform_deassert_rsts(hpriv);
|
||||
if (rc)
|
||||
goto disable_clks;
|
||||
|
||||
rc = ahci_platform_enable_phys(hpriv);
|
||||
if (rc)
|
||||
goto disable_resets;
|
||||
goto disable_rsts;
|
||||
|
||||
return 0;
|
||||
|
||||
disable_resets:
|
||||
reset_control_assert(hpriv->rsts);
|
||||
disable_rsts:
|
||||
ahci_platform_assert_rsts(hpriv);
|
||||
|
||||
disable_clks:
|
||||
ahci_platform_disable_clks(hpriv);
|
||||
@@ -274,7 +295,7 @@ void ahci_platform_disable_resources(struct ahci_host_priv *hpriv)
|
||||
{
|
||||
ahci_platform_disable_phys(hpriv);
|
||||
|
||||
reset_control_assert(hpriv->rsts);
|
||||
ahci_platform_assert_rsts(hpriv);
|
||||
|
||||
ahci_platform_disable_clks(hpriv);
|
||||
|
||||
@@ -292,8 +313,6 @@ static void ahci_platform_put_resources(struct device *dev, void *res)
|
||||
pm_runtime_disable(dev);
|
||||
}
|
||||
|
||||
for (c = 0; c < AHCI_MAX_CLKS && hpriv->clks[c]; c++)
|
||||
clk_put(hpriv->clks[c]);
|
||||
/*
|
||||
* The regulators are tied to child node device and not to the
|
||||
* SATA device itself. So we can't use devm for automatically
|
||||
@@ -374,8 +393,8 @@ static int ahci_platform_get_regulator(struct ahci_host_priv *hpriv, u32 port,
|
||||
* 1) mmio registers (IORESOURCE_MEM 0, mandatory)
|
||||
* 2) regulator for controlling the targets power (optional)
|
||||
* regulator for controlling the AHCI controller (optional)
|
||||
* 3) 0 - AHCI_MAX_CLKS clocks, as specified in the devs devicetree node,
|
||||
* or for non devicetree enabled platforms a single clock
|
||||
* 3) all clocks specified in the devicetree node, or a single
|
||||
* clock for non-OF platforms (optional)
|
||||
* 4) resets, if flags has AHCI_PLATFORM_GET_RESETS (optional)
|
||||
* 5) phys (optional)
|
||||
*
|
||||
@@ -385,11 +404,10 @@ static int ahci_platform_get_regulator(struct ahci_host_priv *hpriv, u32 port,
|
||||
struct ahci_host_priv *ahci_platform_get_resources(struct platform_device *pdev,
|
||||
unsigned int flags)
|
||||
{
|
||||
int child_nodes, rc = -ENOMEM, enabled_ports = 0;
|
||||
struct device *dev = &pdev->dev;
|
||||
struct ahci_host_priv *hpriv;
|
||||
struct clk *clk;
|
||||
struct device_node *child;
|
||||
int i, enabled_ports = 0, rc = -ENOMEM, child_nodes;
|
||||
u32 mask_port_map = 0;
|
||||
|
||||
if (!devres_open_group(dev, NULL, GFP_KERNEL))
|
||||
@@ -409,25 +427,38 @@ struct ahci_host_priv *ahci_platform_get_resources(struct platform_device *pdev,
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
for (i = 0; i < AHCI_MAX_CLKS; i++) {
|
||||
/*
|
||||
* For now we must use clk_get(dev, NULL) for the first clock,
|
||||
* because some platforms (da850, spear13xx) are not yet
|
||||
* converted to use devicetree for clocks. For new platforms
|
||||
* this is equivalent to of_clk_get(dev->of_node, 0).
|
||||
*/
|
||||
if (i == 0)
|
||||
clk = clk_get(dev, NULL);
|
||||
else
|
||||
clk = of_clk_get(dev->of_node, i);
|
||||
/*
|
||||
* Bulk clocks getting procedure can fail to find any clock due to
|
||||
* running on a non-OF platform or due to the clocks being defined in
|
||||
* bypass of the DT firmware (like da850, spear13xx). In that case we
|
||||
* fallback to getting a single clock source right from the dev clocks
|
||||
* list.
|
||||
*/
|
||||
rc = devm_clk_bulk_get_all(dev, &hpriv->clks);
|
||||
if (rc < 0)
|
||||
goto err_out;
|
||||
|
||||
if (IS_ERR(clk)) {
|
||||
rc = PTR_ERR(clk);
|
||||
if (rc == -EPROBE_DEFER)
|
||||
goto err_out;
|
||||
break;
|
||||
if (rc > 0) {
|
||||
/* Got clocks in bulk */
|
||||
hpriv->n_clks = rc;
|
||||
} else {
|
||||
/*
|
||||
* No clock bulk found: fallback to manually getting
|
||||
* the optional clock.
|
||||
*/
|
||||
hpriv->clks = devm_kzalloc(dev, sizeof(*hpriv->clks), GFP_KERNEL);
|
||||
if (!hpriv->clks) {
|
||||
rc = -ENOMEM;
|
||||
goto err_out;
|
||||
}
|
||||
hpriv->clks->clk = devm_clk_get_optional(dev, NULL);
|
||||
if (IS_ERR(hpriv->clks->clk)) {
|
||||
rc = PTR_ERR(hpriv->clks->clk);
|
||||
goto err_out;
|
||||
} else if (hpriv->clks->clk) {
|
||||
hpriv->clks->id = "ahci";
|
||||
hpriv->n_clks = 1;
|
||||
}
|
||||
hpriv->clks[i] = clk;
|
||||
}
|
||||
|
||||
hpriv->ahci_regulator = devm_regulator_get(dev, "ahci");
|
||||
@@ -449,6 +480,8 @@ struct ahci_host_priv *ahci_platform_get_resources(struct platform_device *pdev,
|
||||
rc = PTR_ERR(hpriv->rsts);
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
hpriv->f_rsts = flags & AHCI_PLATFORM_RST_TRIGGER;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -1715,7 +1715,8 @@ static struct nbd_device *nbd_dev_add(int index, unsigned int refs)
|
||||
if (err == -ENOSPC)
|
||||
err = -EEXIST;
|
||||
} else {
|
||||
err = idr_alloc(&nbd_index_idr, nbd, 0, 0, GFP_KERNEL);
|
||||
err = idr_alloc(&nbd_index_idr, nbd, 0,
|
||||
(MINORMASK >> part_shift) + 1, GFP_KERNEL);
|
||||
if (err >= 0)
|
||||
index = err;
|
||||
}
|
||||
|
||||
@@ -991,14 +991,15 @@ static int virtblk_freeze(struct virtio_device *vdev)
|
||||
{
|
||||
struct virtio_blk *vblk = vdev->priv;
|
||||
|
||||
/* Ensure no requests in virtqueues before deleting vqs. */
|
||||
blk_mq_freeze_queue(vblk->disk->queue);
|
||||
|
||||
/* Ensure we don't receive any more interrupts */
|
||||
vdev->config->reset(vdev);
|
||||
|
||||
/* Make sure no work handler is accessing the device. */
|
||||
flush_work(&vblk->config_work);
|
||||
|
||||
blk_mq_quiesce_queue(vblk->disk->queue);
|
||||
|
||||
vdev->config->del_vqs(vdev);
|
||||
kfree(vblk->vqs);
|
||||
|
||||
@@ -1016,7 +1017,7 @@ static int virtblk_restore(struct virtio_device *vdev)
|
||||
|
||||
virtio_device_ready(vdev);
|
||||
|
||||
blk_mq_unquiesce_queue(vblk->disk->queue);
|
||||
blk_mq_unfreeze_queue(vblk->disk->queue);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -253,6 +253,17 @@ static bool clk_core_is_enabled(struct clk_core *core)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* This could be called with the enable lock held, or from atomic
|
||||
* context. If the parent isn't enabled already, we can't do
|
||||
* anything here. We can also assume this clock isn't enabled.
|
||||
*/
|
||||
if ((core->flags & CLK_OPS_PARENT_ENABLE) && core->parent)
|
||||
if (!clk_core_is_enabled(core->parent)) {
|
||||
ret = false;
|
||||
goto done;
|
||||
}
|
||||
|
||||
ret = core->ops->is_enabled(core->hw);
|
||||
done:
|
||||
if (core->rpm_enabled)
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
|
||||
static u32 share_count_nand;
|
||||
static u32 share_count_media;
|
||||
static u32 share_count_usb;
|
||||
|
||||
static const char * const pll_ref_sels[] = { "osc_24m", "dummy", "dummy", "dummy", };
|
||||
static const char * const audio_pll1_bypass_sels[] = {"audio_pll1", "audio_pll1_ref_sel", };
|
||||
@@ -354,7 +355,7 @@ static const char * const imx8mp_media_mipi_phy1_ref_sels[] = {"osc_24m", "sys_p
|
||||
"clk_ext2", "audio_pll2_out",
|
||||
"video_pll1_out", };
|
||||
|
||||
static const char * const imx8mp_media_disp1_pix_sels[] = {"osc_24m", "video_pll1_out", "audio_pll2_out",
|
||||
static const char * const imx8mp_media_disp_pix_sels[] = {"osc_24m", "video_pll1_out", "audio_pll2_out",
|
||||
"audio_pll1_out", "sys_pll1_800m",
|
||||
"sys_pll2_1000m", "sys_pll3_out", "clk_ext4", };
|
||||
|
||||
@@ -395,6 +396,11 @@ static const char * const imx8mp_sai7_sels[] = {"osc_24m", "audio_pll1_out", "au
|
||||
|
||||
static const char * const imx8mp_dram_core_sels[] = {"dram_pll_out", "dram_alt_root", };
|
||||
|
||||
static const char * const imx8mp_clkout_sels[] = {"audio_pll1_out", "audio_pll2_out", "video_pll1_out",
|
||||
"dummy", "dummy", "gpu_pll_out", "vpu_pll_out",
|
||||
"arm_pll_out", "sys_pll1", "sys_pll2", "sys_pll3",
|
||||
"dummy", "dummy", "osc_24m", "dummy", "osc_32k"};
|
||||
|
||||
static struct clk_hw **hws;
|
||||
static struct clk_hw_onecell_data *clk_hw_data;
|
||||
|
||||
@@ -513,6 +519,15 @@ static int imx8mp_clocks_probe(struct platform_device *pdev)
|
||||
hws[IMX8MP_SYS_PLL2_500M] = imx_clk_hw_fixed_factor("sys_pll2_500m", "sys_pll2_500m_cg", 1, 2);
|
||||
hws[IMX8MP_SYS_PLL2_1000M] = imx_clk_hw_fixed_factor("sys_pll2_1000m", "sys_pll2_out", 1, 1);
|
||||
|
||||
hws[IMX8MP_CLK_CLKOUT1_SEL] = imx_clk_hw_mux2("clkout1_sel", anatop_base + 0x128, 4, 4,
|
||||
imx8mp_clkout_sels, ARRAY_SIZE(imx8mp_clkout_sels));
|
||||
hws[IMX8MP_CLK_CLKOUT1_DIV] = imx_clk_hw_divider("clkout1_div", "clkout1_sel", anatop_base + 0x128, 0, 4);
|
||||
hws[IMX8MP_CLK_CLKOUT1] = imx_clk_hw_gate("clkout1", "clkout1_div", anatop_base + 0x128, 8);
|
||||
hws[IMX8MP_CLK_CLKOUT2_SEL] = imx_clk_hw_mux2("clkout2_sel", anatop_base + 0x128, 20, 4,
|
||||
imx8mp_clkout_sels, ARRAY_SIZE(imx8mp_clkout_sels));
|
||||
hws[IMX8MP_CLK_CLKOUT2_DIV] = imx_clk_hw_divider("clkout2_div", "clkout2_sel", anatop_base + 0x128, 16, 4);
|
||||
hws[IMX8MP_CLK_CLKOUT2] = imx_clk_hw_gate("clkout2", "clkout2_div", anatop_base + 0x128, 24);
|
||||
|
||||
hws[IMX8MP_CLK_A53_DIV] = imx8m_clk_hw_composite_core("arm_a53_div", imx8mp_a53_sels, ccm_base + 0x8000);
|
||||
hws[IMX8MP_CLK_A53_SRC] = hws[IMX8MP_CLK_A53_DIV];
|
||||
hws[IMX8MP_CLK_A53_CG] = hws[IMX8MP_CLK_A53_DIV];
|
||||
@@ -547,6 +562,7 @@ static int imx8mp_clocks_probe(struct platform_device *pdev)
|
||||
hws[IMX8MP_CLK_AHB] = imx8m_clk_hw_composite_bus_critical("ahb_root", imx8mp_ahb_sels, ccm_base + 0x9000);
|
||||
hws[IMX8MP_CLK_AUDIO_AHB] = imx8m_clk_hw_composite_bus("audio_ahb", imx8mp_audio_ahb_sels, ccm_base + 0x9100);
|
||||
hws[IMX8MP_CLK_MIPI_DSI_ESC_RX] = imx8m_clk_hw_composite_bus("mipi_dsi_esc_rx", imx8mp_mipi_dsi_esc_rx_sels, ccm_base + 0x9200);
|
||||
hws[IMX8MP_CLK_MEDIA_DISP2_PIX] = imx8m_clk_hw_composite("media_disp2_pix", imx8mp_media_disp_pix_sels, ccm_base + 0x9300);
|
||||
|
||||
hws[IMX8MP_CLK_IPG_ROOT] = imx_clk_hw_divider2("ipg_root", "ahb_root", ccm_base + 0x9080, 0, 1);
|
||||
|
||||
@@ -608,7 +624,7 @@ static int imx8mp_clocks_probe(struct platform_device *pdev)
|
||||
hws[IMX8MP_CLK_USDHC3] = imx8m_clk_hw_composite("usdhc3", imx8mp_usdhc3_sels, ccm_base + 0xbc80);
|
||||
hws[IMX8MP_CLK_MEDIA_CAM1_PIX] = imx8m_clk_hw_composite("media_cam1_pix", imx8mp_media_cam1_pix_sels, ccm_base + 0xbd00);
|
||||
hws[IMX8MP_CLK_MEDIA_MIPI_PHY1_REF] = imx8m_clk_hw_composite("media_mipi_phy1_ref", imx8mp_media_mipi_phy1_ref_sels, ccm_base + 0xbd80);
|
||||
hws[IMX8MP_CLK_MEDIA_DISP1_PIX] = imx8m_clk_hw_composite("media_disp1_pix", imx8mp_media_disp1_pix_sels, ccm_base + 0xbe00);
|
||||
hws[IMX8MP_CLK_MEDIA_DISP1_PIX] = imx8m_clk_hw_composite("media_disp1_pix", imx8mp_media_disp_pix_sels, ccm_base + 0xbe00);
|
||||
hws[IMX8MP_CLK_MEDIA_CAM2_PIX] = imx8m_clk_hw_composite("media_cam2_pix", imx8mp_media_cam2_pix_sels, ccm_base + 0xbe80);
|
||||
hws[IMX8MP_CLK_MEDIA_LDB] = imx8m_clk_hw_composite("media_ldb", imx8mp_media_ldb_sels, ccm_base + 0xbf00);
|
||||
hws[IMX8MP_CLK_MEMREPAIR] = imx8m_clk_hw_composite_critical("mem_repair", imx8mp_memrepair_sels, ccm_base + 0xbf80);
|
||||
@@ -667,7 +683,8 @@ static int imx8mp_clocks_probe(struct platform_device *pdev)
|
||||
hws[IMX8MP_CLK_UART2_ROOT] = imx_clk_hw_gate4("uart2_root_clk", "uart2", ccm_base + 0x44a0, 0);
|
||||
hws[IMX8MP_CLK_UART3_ROOT] = imx_clk_hw_gate4("uart3_root_clk", "uart3", ccm_base + 0x44b0, 0);
|
||||
hws[IMX8MP_CLK_UART4_ROOT] = imx_clk_hw_gate4("uart4_root_clk", "uart4", ccm_base + 0x44c0, 0);
|
||||
hws[IMX8MP_CLK_USB_ROOT] = imx_clk_hw_gate4("usb_root_clk", "hsio_axi", ccm_base + 0x44d0, 0);
|
||||
hws[IMX8MP_CLK_USB_ROOT] = imx_clk_hw_gate2_shared2("usb_root_clk", "hsio_axi", ccm_base + 0x44d0, 0, &share_count_usb);
|
||||
hws[IMX8MP_CLK_USB_SUSP] = imx_clk_hw_gate2_shared2("usb_suspend_clk", "osc_32k", ccm_base + 0x44d0, 0, &share_count_usb);
|
||||
hws[IMX8MP_CLK_USB_PHY_ROOT] = imx_clk_hw_gate4("usb_phy_root_clk", "usb_phy_ref", ccm_base + 0x44f0, 0);
|
||||
hws[IMX8MP_CLK_USDHC1_ROOT] = imx_clk_hw_gate4("usdhc1_root_clk", "usdhc1", ccm_base + 0x4510, 0);
|
||||
hws[IMX8MP_CLK_USDHC2_ROOT] = imx_clk_hw_gate4("usdhc2_root_clk", "usdhc2", ccm_base + 0x4520, 0);
|
||||
|
||||
@@ -201,9 +201,10 @@ static int __init imx_clk_disable_uart(void)
|
||||
clk_disable_unprepare(imx_uart_clocks[i]);
|
||||
clk_put(imx_uart_clocks[i]);
|
||||
}
|
||||
kfree(imx_uart_clocks);
|
||||
}
|
||||
|
||||
kfree(imx_uart_clocks);
|
||||
|
||||
return 0;
|
||||
}
|
||||
late_initcall_sync(imx_clk_disable_uart);
|
||||
|
||||
@@ -25,11 +25,9 @@ enum {
|
||||
P_CORE_BI_PLL_TEST_SE,
|
||||
P_DSI0_PHY_PLL_OUT_BYTECLK,
|
||||
P_DSI0_PHY_PLL_OUT_DSICLK,
|
||||
P_GPLL0_OUT_AUX,
|
||||
P_GPLL0_OUT_MAIN,
|
||||
P_GPLL1_OUT_MAIN,
|
||||
P_GPLL3_OUT_MAIN,
|
||||
P_GPLL4_OUT_AUX,
|
||||
P_GPLL4_OUT_MAIN,
|
||||
P_GPLL6_OUT_AUX,
|
||||
P_HDMI_PHY_PLL_CLK,
|
||||
@@ -109,28 +107,24 @@ static const char * const gcc_parent_names_4[] = {
|
||||
static const struct parent_map gcc_parent_map_5[] = {
|
||||
{ P_XO, 0 },
|
||||
{ P_DSI0_PHY_PLL_OUT_BYTECLK, 1 },
|
||||
{ P_GPLL0_OUT_AUX, 2 },
|
||||
{ P_CORE_BI_PLL_TEST_SE, 7 },
|
||||
};
|
||||
|
||||
static const char * const gcc_parent_names_5[] = {
|
||||
"cxo",
|
||||
"dsi0pll_byteclk_src",
|
||||
"gpll0_out_aux",
|
||||
"dsi0pllbyte",
|
||||
"core_bi_pll_test_se",
|
||||
};
|
||||
|
||||
static const struct parent_map gcc_parent_map_6[] = {
|
||||
{ P_XO, 0 },
|
||||
{ P_DSI0_PHY_PLL_OUT_BYTECLK, 2 },
|
||||
{ P_GPLL0_OUT_AUX, 3 },
|
||||
{ P_CORE_BI_PLL_TEST_SE, 7 },
|
||||
};
|
||||
|
||||
static const char * const gcc_parent_names_6[] = {
|
||||
"cxo",
|
||||
"dsi0_phy_pll_out_byteclk",
|
||||
"gpll0_out_aux",
|
||||
"dsi0pllbyte",
|
||||
"core_bi_pll_test_se",
|
||||
};
|
||||
|
||||
@@ -139,7 +133,6 @@ static const struct parent_map gcc_parent_map_7[] = {
|
||||
{ P_GPLL0_OUT_MAIN, 1 },
|
||||
{ P_GPLL3_OUT_MAIN, 2 },
|
||||
{ P_GPLL6_OUT_AUX, 3 },
|
||||
{ P_GPLL4_OUT_AUX, 4 },
|
||||
{ P_CORE_BI_PLL_TEST_SE, 7 },
|
||||
};
|
||||
|
||||
@@ -148,7 +141,6 @@ static const char * const gcc_parent_names_7[] = {
|
||||
"gpll0_out_main",
|
||||
"gpll3_out_main",
|
||||
"gpll6_out_aux",
|
||||
"gpll4_out_aux",
|
||||
"core_bi_pll_test_se",
|
||||
};
|
||||
|
||||
@@ -175,7 +167,7 @@ static const struct parent_map gcc_parent_map_9[] = {
|
||||
static const char * const gcc_parent_names_9[] = {
|
||||
"cxo",
|
||||
"gpll0_out_main",
|
||||
"dsi0_phy_pll_out_dsiclk",
|
||||
"dsi0pll",
|
||||
"gpll6_out_aux",
|
||||
"core_bi_pll_test_se",
|
||||
};
|
||||
@@ -207,14 +199,12 @@ static const char * const gcc_parent_names_11[] = {
|
||||
static const struct parent_map gcc_parent_map_12[] = {
|
||||
{ P_XO, 0 },
|
||||
{ P_DSI0_PHY_PLL_OUT_DSICLK, 1 },
|
||||
{ P_GPLL0_OUT_AUX, 2 },
|
||||
{ P_CORE_BI_PLL_TEST_SE, 7 },
|
||||
};
|
||||
|
||||
static const char * const gcc_parent_names_12[] = {
|
||||
"cxo",
|
||||
"dsi0pll_pclk_src",
|
||||
"gpll0_out_aux",
|
||||
"dsi0pll",
|
||||
"core_bi_pll_test_se",
|
||||
};
|
||||
|
||||
@@ -237,40 +227,34 @@ static const char * const gcc_parent_names_13[] = {
|
||||
static const struct parent_map gcc_parent_map_14[] = {
|
||||
{ P_XO, 0 },
|
||||
{ P_GPLL0_OUT_MAIN, 1 },
|
||||
{ P_GPLL4_OUT_AUX, 2 },
|
||||
{ P_CORE_BI_PLL_TEST_SE, 7 },
|
||||
};
|
||||
|
||||
static const char * const gcc_parent_names_14[] = {
|
||||
"cxo",
|
||||
"gpll0_out_main",
|
||||
"gpll4_out_aux",
|
||||
"core_bi_pll_test_se",
|
||||
};
|
||||
|
||||
static const struct parent_map gcc_parent_map_15[] = {
|
||||
{ P_XO, 0 },
|
||||
{ P_GPLL0_OUT_AUX, 2 },
|
||||
{ P_CORE_BI_PLL_TEST_SE, 7 },
|
||||
};
|
||||
|
||||
static const char * const gcc_parent_names_15[] = {
|
||||
"cxo",
|
||||
"gpll0_out_aux",
|
||||
"core_bi_pll_test_se",
|
||||
};
|
||||
|
||||
static const struct parent_map gcc_parent_map_16[] = {
|
||||
{ P_XO, 0 },
|
||||
{ P_GPLL0_OUT_MAIN, 1 },
|
||||
{ P_GPLL0_OUT_AUX, 2 },
|
||||
{ P_CORE_BI_PLL_TEST_SE, 7 },
|
||||
};
|
||||
|
||||
static const char * const gcc_parent_names_16[] = {
|
||||
"cxo",
|
||||
"gpll0_out_main",
|
||||
"gpll0_out_aux",
|
||||
"core_bi_pll_test_se",
|
||||
};
|
||||
|
||||
|
||||
@@ -21,8 +21,6 @@
|
||||
#define CX_GMU_CBCR_SLEEP_SHIFT 4
|
||||
#define CX_GMU_CBCR_WAKE_MASK 0xF
|
||||
#define CX_GMU_CBCR_WAKE_SHIFT 8
|
||||
#define CLK_DIS_WAIT_SHIFT 12
|
||||
#define CLK_DIS_WAIT_MASK (0xf << CLK_DIS_WAIT_SHIFT)
|
||||
|
||||
enum {
|
||||
P_BI_TCXO,
|
||||
@@ -160,6 +158,7 @@ static struct clk_branch gpu_cc_cxo_clk = {
|
||||
static struct gdsc cx_gdsc = {
|
||||
.gdscr = 0x106c,
|
||||
.gds_hw_ctrl = 0x1540,
|
||||
.clk_dis_wait_val = 8,
|
||||
.pd = {
|
||||
.name = "cx_gdsc",
|
||||
},
|
||||
@@ -242,10 +241,6 @@ static int gpu_cc_sc7180_probe(struct platform_device *pdev)
|
||||
value = 0xF << CX_GMU_CBCR_WAKE_SHIFT | 0xF << CX_GMU_CBCR_SLEEP_SHIFT;
|
||||
regmap_update_bits(regmap, 0x1098, mask, value);
|
||||
|
||||
/* Configure clk_dis_wait for gpu_cx_gdsc */
|
||||
regmap_update_bits(regmap, 0x106c, CLK_DIS_WAIT_MASK,
|
||||
8 << CLK_DIS_WAIT_SHIFT);
|
||||
|
||||
return qcom_cc_really_probe(pdev, &gpu_cc_sc7180_desc, regmap);
|
||||
}
|
||||
|
||||
|
||||
@@ -22,8 +22,6 @@
|
||||
#define CX_GMU_CBCR_SLEEP_SHIFT 4
|
||||
#define CX_GMU_CBCR_WAKE_MASK 0xf
|
||||
#define CX_GMU_CBCR_WAKE_SHIFT 8
|
||||
#define CLK_DIS_WAIT_SHIFT 12
|
||||
#define CLK_DIS_WAIT_MASK (0xf << CLK_DIS_WAIT_SHIFT)
|
||||
|
||||
enum {
|
||||
P_BI_TCXO,
|
||||
@@ -121,6 +119,7 @@ static struct clk_branch gpu_cc_cxo_clk = {
|
||||
static struct gdsc gpu_cx_gdsc = {
|
||||
.gdscr = 0x106c,
|
||||
.gds_hw_ctrl = 0x1540,
|
||||
.clk_dis_wait_val = 0x8,
|
||||
.pd = {
|
||||
.name = "gpu_cx_gdsc",
|
||||
},
|
||||
@@ -193,10 +192,6 @@ static int gpu_cc_sdm845_probe(struct platform_device *pdev)
|
||||
value = 0xf << CX_GMU_CBCR_WAKE_SHIFT | 0xf << CX_GMU_CBCR_SLEEP_SHIFT;
|
||||
regmap_update_bits(regmap, 0x1098, mask, value);
|
||||
|
||||
/* Configure clk_dis_wait for gpu_cx_gdsc */
|
||||
regmap_update_bits(regmap, 0x106c, CLK_DIS_WAIT_MASK,
|
||||
8 << CLK_DIS_WAIT_SHIFT);
|
||||
|
||||
return qcom_cc_really_probe(pdev, &gpu_cc_sdm845_desc, regmap);
|
||||
}
|
||||
|
||||
|
||||
@@ -911,9 +911,8 @@ static int cpg_mssr_resume_noirq(struct device *dev)
|
||||
}
|
||||
|
||||
if (!i)
|
||||
dev_warn(dev, "Failed to enable %s%u[0x%x]\n",
|
||||
priv->reg_layout == CLK_REG_LAYOUT_RZ_A ?
|
||||
"STB" : "SMSTP", reg, oldval & mask);
|
||||
dev_warn(dev, "Failed to enable SMSTP%u[0x%x]\n", reg,
|
||||
oldval & mask);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -957,7 +956,6 @@ static int __init cpg_mssr_common_init(struct device *dev,
|
||||
goto out_err;
|
||||
}
|
||||
|
||||
cpg_mssr_priv = priv;
|
||||
priv->num_core_clks = info->num_total_core_clks;
|
||||
priv->num_mod_clks = info->num_hw_mod_clks;
|
||||
priv->last_dt_core_clk = info->last_dt_core_clk;
|
||||
@@ -987,6 +985,8 @@ static int __init cpg_mssr_common_init(struct device *dev,
|
||||
if (error)
|
||||
goto out_err;
|
||||
|
||||
cpg_mssr_priv = priv;
|
||||
|
||||
return 0;
|
||||
|
||||
out_err:
|
||||
|
||||
@@ -805,7 +805,7 @@ fsl_qdma_irq_init(struct platform_device *pdev,
|
||||
int i;
|
||||
int cpu;
|
||||
int ret;
|
||||
char irq_name[20];
|
||||
char irq_name[32];
|
||||
|
||||
fsl_qdma->error_irq =
|
||||
platform_get_irq_byname(pdev, "qdma-error");
|
||||
|
||||
@@ -25,7 +25,7 @@ struct sh_dmae_chan {
|
||||
const struct sh_dmae_slave_config *config; /* Slave DMA configuration */
|
||||
int xmit_shift; /* log_2(bytes_per_xfer) */
|
||||
void __iomem *base;
|
||||
char dev_id[16]; /* unique name per DMAC of channel */
|
||||
char dev_id[32]; /* unique name per DMAC of channel */
|
||||
int pm_error;
|
||||
dma_addr_t slave_addr;
|
||||
};
|
||||
|
||||
@@ -2462,6 +2462,11 @@ static int edma_probe(struct platform_device *pdev)
|
||||
if (irq > 0) {
|
||||
irq_name = devm_kasprintf(dev, GFP_KERNEL, "%s_ccint",
|
||||
dev_name(dev));
|
||||
if (!irq_name) {
|
||||
ret = -ENOMEM;
|
||||
goto err_disable_pm;
|
||||
}
|
||||
|
||||
ret = devm_request_irq(dev, irq, dma_irq_handler, 0, irq_name,
|
||||
ecc);
|
||||
if (ret) {
|
||||
@@ -2478,6 +2483,11 @@ static int edma_probe(struct platform_device *pdev)
|
||||
if (irq > 0) {
|
||||
irq_name = devm_kasprintf(dev, GFP_KERNEL, "%s_ccerrint",
|
||||
dev_name(dev));
|
||||
if (!irq_name) {
|
||||
ret = -ENOMEM;
|
||||
goto err_disable_pm;
|
||||
}
|
||||
|
||||
ret = devm_request_irq(dev, irq, dma_ccerr_handler, 0, irq_name,
|
||||
ecc);
|
||||
if (ret) {
|
||||
|
||||
@@ -429,7 +429,23 @@ static void bm_work(struct work_struct *work)
|
||||
*/
|
||||
card->bm_generation = generation;
|
||||
|
||||
if (root_device == NULL) {
|
||||
if (card->gap_count == 0) {
|
||||
/*
|
||||
* If self IDs have inconsistent gap counts, do a
|
||||
* bus reset ASAP. The config rom read might never
|
||||
* complete, so don't wait for it. However, still
|
||||
* send a PHY configuration packet prior to the
|
||||
* bus reset. The PHY configuration packet might
|
||||
* fail, but 1394-2008 8.4.5.2 explicitly permits
|
||||
* it in this case, so it should be safe to try.
|
||||
*/
|
||||
new_root_id = local_id;
|
||||
/*
|
||||
* We must always send a bus reset if the gap count
|
||||
* is inconsistent, so bypass the 5-reset limit.
|
||||
*/
|
||||
card->bm_retries = 0;
|
||||
} else if (root_device == NULL) {
|
||||
/*
|
||||
* Either link_on is false, or we failed to read the
|
||||
* config rom. In either case, pick another root.
|
||||
|
||||
@@ -107,7 +107,7 @@ static int __init arm_enable_runtime_services(void)
|
||||
efi_memory_desc_t *md;
|
||||
|
||||
for_each_efi_memory_desc(md) {
|
||||
int md_size = md->num_pages << EFI_PAGE_SHIFT;
|
||||
u64 md_size = md->num_pages << EFI_PAGE_SHIFT;
|
||||
struct resource *res;
|
||||
|
||||
if (!(md->attribute & EFI_MEMORY_SP))
|
||||
|
||||
@@ -141,15 +141,6 @@ static __init int is_usable_memory(efi_memory_desc_t *md)
|
||||
case EFI_BOOT_SERVICES_DATA:
|
||||
case EFI_CONVENTIONAL_MEMORY:
|
||||
case EFI_PERSISTENT_MEMORY:
|
||||
/*
|
||||
* Special purpose memory is 'soft reserved', which means it
|
||||
* is set aside initially, but can be hotplugged back in or
|
||||
* be assigned to the dax driver after boot.
|
||||
*/
|
||||
if (efi_soft_reserve_enabled() &&
|
||||
(md->attribute & EFI_MEMORY_SP))
|
||||
return false;
|
||||
|
||||
/*
|
||||
* According to the spec, these regions are no longer reserved
|
||||
* after calling ExitBootServices(). However, we can only use
|
||||
@@ -194,6 +185,16 @@ static __init void reserve_regions(void)
|
||||
size = npages << PAGE_SHIFT;
|
||||
|
||||
if (is_memory(md)) {
|
||||
/*
|
||||
* Special purpose memory is 'soft reserved', which
|
||||
* means it is set aside initially. Don't add a memblock
|
||||
* for it now so that it can be hotplugged back in or
|
||||
* be assigned to the dax driver after boot.
|
||||
*/
|
||||
if (efi_soft_reserve_enabled() &&
|
||||
(md->attribute & EFI_MEMORY_SP))
|
||||
continue;
|
||||
|
||||
early_init_dt_add_memory_arch(paddr, size);
|
||||
|
||||
if (!is_usable_memory(md))
|
||||
|
||||
@@ -85,7 +85,7 @@ static int __init riscv_enable_runtime_services(void)
|
||||
efi_memory_desc_t *md;
|
||||
|
||||
for_each_efi_memory_desc(md) {
|
||||
int md_size = md->num_pages << EFI_PAGE_SHIFT;
|
||||
u64 md_size = md->num_pages << EFI_PAGE_SHIFT;
|
||||
struct resource *res;
|
||||
|
||||
if (!(md->attribute & EFI_MEMORY_SP))
|
||||
|
||||
@@ -1045,6 +1045,8 @@ struct amdgpu_device {
|
||||
bool in_s3;
|
||||
bool in_s4;
|
||||
bool in_s0ix;
|
||||
/* indicate amdgpu suspension status */
|
||||
bool suspend_complete;
|
||||
|
||||
atomic_t in_gpu_reset;
|
||||
enum pp_mp1_state mp1_state;
|
||||
|
||||
@@ -2487,10 +2487,6 @@ static int amdgpu_device_ip_init(struct amdgpu_device *adev)
|
||||
if (r)
|
||||
goto init_failed;
|
||||
|
||||
r = amdgpu_amdkfd_resume_iommu(adev);
|
||||
if (r)
|
||||
goto init_failed;
|
||||
|
||||
r = amdgpu_device_ip_hw_init_phase1(adev);
|
||||
if (r)
|
||||
goto init_failed;
|
||||
@@ -2529,6 +2525,10 @@ static int amdgpu_device_ip_init(struct amdgpu_device *adev)
|
||||
if (!adev->gmc.xgmi.pending_reset)
|
||||
amdgpu_amdkfd_device_init(adev);
|
||||
|
||||
r = amdgpu_amdkfd_resume_iommu(adev);
|
||||
if (r)
|
||||
goto init_failed;
|
||||
|
||||
amdgpu_fru_get_product_info(adev);
|
||||
|
||||
init_failed:
|
||||
|
||||
@@ -2252,6 +2252,7 @@ static int amdgpu_pmops_suspend(struct device *dev)
|
||||
struct drm_device *drm_dev = dev_get_drvdata(dev);
|
||||
struct amdgpu_device *adev = drm_to_adev(drm_dev);
|
||||
|
||||
adev->suspend_complete = false;
|
||||
if (amdgpu_acpi_is_s0ix_active(adev))
|
||||
adev->in_s0ix = true;
|
||||
else
|
||||
@@ -2264,6 +2265,7 @@ static int amdgpu_pmops_suspend_noirq(struct device *dev)
|
||||
struct drm_device *drm_dev = dev_get_drvdata(dev);
|
||||
struct amdgpu_device *adev = drm_to_adev(drm_dev);
|
||||
|
||||
adev->suspend_complete = true;
|
||||
if (amdgpu_acpi_should_gpu_reset(adev))
|
||||
return amdgpu_asic_reset(adev);
|
||||
|
||||
|
||||
@@ -3268,6 +3268,14 @@ static int gfx_v9_0_cp_gfx_start(struct amdgpu_device *adev)
|
||||
|
||||
gfx_v9_0_cp_gfx_enable(adev, true);
|
||||
|
||||
/* Now only limit the quirk on the APU gfx9 series and already
|
||||
* confirmed that the APU gfx10/gfx11 needn't such update.
|
||||
*/
|
||||
if (adev->flags & AMD_IS_APU &&
|
||||
adev->in_s3 && !adev->suspend_complete) {
|
||||
DRM_INFO(" Will skip the CSB packet resubmit\n");
|
||||
return 0;
|
||||
}
|
||||
r = amdgpu_ring_alloc(ring, gfx_v9_0_get_csb_size(adev) + 4 + 3);
|
||||
if (r) {
|
||||
DRM_ERROR("amdgpu: cp failed to lock ring (%d).\n", r);
|
||||
|
||||
@@ -1490,10 +1490,32 @@ static int soc15_common_suspend(void *handle)
|
||||
return soc15_common_hw_fini(adev);
|
||||
}
|
||||
|
||||
static bool soc15_need_reset_on_resume(struct amdgpu_device *adev)
|
||||
{
|
||||
u32 sol_reg;
|
||||
|
||||
sol_reg = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_81);
|
||||
|
||||
/* Will reset for the following suspend abort cases.
|
||||
* 1) Only reset limit on APU side, dGPU hasn't checked yet.
|
||||
* 2) S3 suspend abort and TOS already launched.
|
||||
*/
|
||||
if (adev->flags & AMD_IS_APU && adev->in_s3 &&
|
||||
!adev->suspend_complete &&
|
||||
sol_reg)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static int soc15_common_resume(void *handle)
|
||||
{
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
|
||||
if (soc15_need_reset_on_resume(adev)) {
|
||||
dev_info(adev->dev, "S3 suspend abort case, let's reset ASIC.\n");
|
||||
soc15_asic_reset(adev);
|
||||
}
|
||||
return soc15_common_hw_init(adev);
|
||||
}
|
||||
|
||||
|
||||
@@ -2088,6 +2088,7 @@ static int dm_sw_fini(void *handle)
|
||||
|
||||
if (adev->dm.dmub_srv) {
|
||||
dmub_srv_destroy(adev->dm.dmub_srv);
|
||||
kfree(adev->dm.dmub_srv);
|
||||
adev->dm.dmub_srv = NULL;
|
||||
}
|
||||
|
||||
|
||||
@@ -1021,7 +1021,8 @@ static signed long drm_syncobj_array_wait_timeout(struct drm_syncobj **syncobjs,
|
||||
uint64_t *points;
|
||||
uint32_t signaled_count, i;
|
||||
|
||||
if (flags & DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT)
|
||||
if (flags & (DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT |
|
||||
DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE))
|
||||
lockdep_assert_none_held_once();
|
||||
|
||||
points = kmalloc_array(count, sizeof(*points), GFP_KERNEL);
|
||||
@@ -1090,7 +1091,8 @@ static signed long drm_syncobj_array_wait_timeout(struct drm_syncobj **syncobjs,
|
||||
* fallthough and try a 0 timeout wait!
|
||||
*/
|
||||
|
||||
if (flags & DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT) {
|
||||
if (flags & (DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT |
|
||||
DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE)) {
|
||||
for (i = 0; i < count; ++i)
|
||||
drm_syncobj_fence_add_wait(syncobjs[i], &entries[i]);
|
||||
}
|
||||
|
||||
@@ -571,8 +571,8 @@ static int i915_dmc_info(struct seq_file *m, void *unused)
|
||||
* reg for DC3CO debugging and validation,
|
||||
* but TGL DMC f/w is using DMC_DEBUG3 reg for DC3CO counter.
|
||||
*/
|
||||
seq_printf(m, "DC3CO count: %d\n",
|
||||
intel_de_read(dev_priv, DMC_DEBUG3));
|
||||
seq_printf(m, "DC3CO count: %d\n", intel_de_read(dev_priv, IS_DGFX(dev_priv) ?
|
||||
DG1_DMC_DEBUG3 : TGL_DMC_DEBUG3));
|
||||
} else {
|
||||
dc5_reg = IS_BROXTON(dev_priv) ? BXT_DMC_DC3_DC5_COUNT :
|
||||
SKL_DMC_DC3_DC5_COUNT;
|
||||
|
||||
@@ -7841,7 +7841,8 @@ enum {
|
||||
#define TGL_DMC_DEBUG_DC6_COUNT _MMIO(0x101088)
|
||||
#define DG1_DMC_DEBUG_DC5_COUNT _MMIO(0x134154)
|
||||
|
||||
#define DMC_DEBUG3 _MMIO(0x101090)
|
||||
#define TGL_DMC_DEBUG3 _MMIO(0x101090)
|
||||
#define DG1_DMC_DEBUG3 _MMIO(0x13415c)
|
||||
|
||||
/* Display Internal Timeout Register */
|
||||
#define RM_TIMEOUT _MMIO(0x42060)
|
||||
|
||||
@@ -154,11 +154,17 @@ shadow_fw_init(struct nvkm_bios *bios, const char *name)
|
||||
return (void *)fw;
|
||||
}
|
||||
|
||||
static void
|
||||
shadow_fw_release(void *fw)
|
||||
{
|
||||
release_firmware(fw);
|
||||
}
|
||||
|
||||
static const struct nvbios_source
|
||||
shadow_fw = {
|
||||
.name = "firmware",
|
||||
.init = shadow_fw_init,
|
||||
.fini = (void(*)(void *))release_firmware,
|
||||
.fini = shadow_fw_release,
|
||||
.read = shadow_fw_read,
|
||||
.rw = false,
|
||||
};
|
||||
|
||||
@@ -313,7 +313,7 @@ nv50_instobj_dtor(struct nvkm_memory *memory)
|
||||
struct nv50_instobj *iobj = nv50_instobj(memory);
|
||||
struct nvkm_instmem *imem = &iobj->imem->base;
|
||||
struct nvkm_vma *bar;
|
||||
void *map = map;
|
||||
void *map;
|
||||
|
||||
mutex_lock(&imem->mutex);
|
||||
if (likely(iobj->lru.next))
|
||||
|
||||
@@ -384,7 +384,7 @@ static void ttm_pool_free_range(struct ttm_pool *pool, struct ttm_tt *tt,
|
||||
enum ttm_caching caching,
|
||||
pgoff_t start_page, pgoff_t end_page)
|
||||
{
|
||||
struct page **pages = tt->pages;
|
||||
struct page **pages = &tt->pages[start_page];
|
||||
unsigned int order;
|
||||
pgoff_t i, nr;
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@ MODULE_PARM_DESC(tjmax, "TjMax value in degrees Celsius");
|
||||
|
||||
#define PKG_SYSFS_ATTR_NO 1 /* Sysfs attribute for package temp */
|
||||
#define BASE_SYSFS_ATTR_NO 2 /* Sysfs Base attr no for coretemp */
|
||||
#define NUM_REAL_CORES 128 /* Number of Real cores per cpu */
|
||||
#define NUM_REAL_CORES 512 /* Number of Real cores per cpu */
|
||||
#define CORETEMP_NAME_LENGTH 28 /* String Length of attrs */
|
||||
#define MAX_CORE_ATTRS 4 /* Maximum no of basic attrs */
|
||||
#define TOTAL_ATTRS (MAX_CORE_ATTRS + 1)
|
||||
|
||||
@@ -37,6 +37,8 @@
|
||||
#include <linux/io.h>
|
||||
#include <linux/iopoll.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/hrtimer.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_device.h>
|
||||
@@ -51,6 +53,8 @@
|
||||
/* This will be the driver name the kernel reports */
|
||||
#define DRIVER_NAME "imx-i2c"
|
||||
|
||||
#define I2C_IMX_CHECK_DELAY 30000 /* Time to check for bus idle, in NS */
|
||||
|
||||
/*
|
||||
* Enable DMA if transfer byte size is bigger than this threshold.
|
||||
* As the hardware request, it must bigger than 4 bytes.\
|
||||
@@ -210,6 +214,10 @@ struct imx_i2c_struct {
|
||||
struct imx_i2c_dma *dma;
|
||||
struct i2c_client *slave;
|
||||
enum i2c_slave_event last_slave_event;
|
||||
|
||||
/* For checking slave events. */
|
||||
spinlock_t slave_lock;
|
||||
struct hrtimer slave_timer;
|
||||
};
|
||||
|
||||
static const struct imx_i2c_hwdata imx1_i2c_hwdata = {
|
||||
@@ -680,7 +688,7 @@ static void i2c_imx_slave_event(struct imx_i2c_struct *i2c_imx,
|
||||
|
||||
static void i2c_imx_slave_finish_op(struct imx_i2c_struct *i2c_imx)
|
||||
{
|
||||
u8 val;
|
||||
u8 val = 0;
|
||||
|
||||
while (i2c_imx->last_slave_event != I2C_SLAVE_STOP) {
|
||||
switch (i2c_imx->last_slave_event) {
|
||||
@@ -701,10 +709,11 @@ static void i2c_imx_slave_finish_op(struct imx_i2c_struct *i2c_imx)
|
||||
}
|
||||
}
|
||||
|
||||
static irqreturn_t i2c_imx_slave_isr(struct imx_i2c_struct *i2c_imx,
|
||||
unsigned int status, unsigned int ctl)
|
||||
/* Returns true if the timer should be restarted, false if not. */
|
||||
static irqreturn_t i2c_imx_slave_handle(struct imx_i2c_struct *i2c_imx,
|
||||
unsigned int status, unsigned int ctl)
|
||||
{
|
||||
u8 value;
|
||||
u8 value = 0;
|
||||
|
||||
if (status & I2SR_IAL) { /* Arbitration lost */
|
||||
i2c_imx_clear_irq(i2c_imx, I2SR_IAL);
|
||||
@@ -712,6 +721,16 @@ static irqreturn_t i2c_imx_slave_isr(struct imx_i2c_struct *i2c_imx,
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
if (!(status & I2SR_IBB)) {
|
||||
/* No master on the bus, that could mean a stop condition. */
|
||||
i2c_imx_slave_finish_op(i2c_imx);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
if (!(status & I2SR_ICF))
|
||||
/* Data transfer still in progress, ignore this. */
|
||||
goto out;
|
||||
|
||||
if (status & I2SR_IAAS) { /* Addressed as a slave */
|
||||
i2c_imx_slave_finish_op(i2c_imx);
|
||||
if (status & I2SR_SRW) { /* Master wants to read from us*/
|
||||
@@ -737,16 +756,9 @@ static irqreturn_t i2c_imx_slave_isr(struct imx_i2c_struct *i2c_imx,
|
||||
imx_i2c_read_reg(i2c_imx, IMX_I2C_I2DR);
|
||||
}
|
||||
} else if (!(ctl & I2CR_MTX)) { /* Receive mode */
|
||||
if (status & I2SR_IBB) { /* No STOP signal detected */
|
||||
value = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2DR);
|
||||
i2c_imx_slave_event(i2c_imx,
|
||||
I2C_SLAVE_WRITE_RECEIVED, &value);
|
||||
} else { /* STOP signal is detected */
|
||||
dev_dbg(&i2c_imx->adapter.dev,
|
||||
"STOP signal detected");
|
||||
i2c_imx_slave_event(i2c_imx,
|
||||
I2C_SLAVE_STOP, &value);
|
||||
}
|
||||
value = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2DR);
|
||||
i2c_imx_slave_event(i2c_imx,
|
||||
I2C_SLAVE_WRITE_RECEIVED, &value);
|
||||
} else if (!(status & I2SR_RXAK)) { /* Transmit mode received ACK */
|
||||
ctl |= I2CR_MTX;
|
||||
imx_i2c_write_reg(ctl, i2c_imx, IMX_I2C_I2CR);
|
||||
@@ -755,15 +767,48 @@ static irqreturn_t i2c_imx_slave_isr(struct imx_i2c_struct *i2c_imx,
|
||||
I2C_SLAVE_READ_PROCESSED, &value);
|
||||
|
||||
imx_i2c_write_reg(value, i2c_imx, IMX_I2C_I2DR);
|
||||
} else { /* Transmit mode received NAK */
|
||||
} else { /* Transmit mode received NAK, operation is done */
|
||||
ctl &= ~I2CR_MTX;
|
||||
imx_i2c_write_reg(ctl, i2c_imx, IMX_I2C_I2CR);
|
||||
imx_i2c_read_reg(i2c_imx, IMX_I2C_I2DR);
|
||||
|
||||
/* flag the last byte as processed */
|
||||
i2c_imx_slave_event(i2c_imx,
|
||||
I2C_SLAVE_READ_PROCESSED, &value);
|
||||
|
||||
i2c_imx_slave_finish_op(i2c_imx);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
out:
|
||||
/*
|
||||
* No need to check the return value here. If it returns 0 or
|
||||
* 1, then everything is fine. If it returns -1, then the
|
||||
* timer is running in the handler. This will still work,
|
||||
* though it may be redone (or already have been done) by the
|
||||
* timer function.
|
||||
*/
|
||||
hrtimer_try_to_cancel(&i2c_imx->slave_timer);
|
||||
hrtimer_forward_now(&i2c_imx->slave_timer, I2C_IMX_CHECK_DELAY);
|
||||
hrtimer_restart(&i2c_imx->slave_timer);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static enum hrtimer_restart i2c_imx_slave_timeout(struct hrtimer *t)
|
||||
{
|
||||
struct imx_i2c_struct *i2c_imx = container_of(t, struct imx_i2c_struct,
|
||||
slave_timer);
|
||||
unsigned int ctl, status;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&i2c_imx->slave_lock, flags);
|
||||
status = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2SR);
|
||||
ctl = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2CR);
|
||||
i2c_imx_slave_handle(i2c_imx, status, ctl);
|
||||
spin_unlock_irqrestore(&i2c_imx->slave_lock, flags);
|
||||
return HRTIMER_NORESTART;
|
||||
}
|
||||
|
||||
static void i2c_imx_slave_init(struct imx_i2c_struct *i2c_imx)
|
||||
{
|
||||
int temp;
|
||||
@@ -843,7 +888,9 @@ static irqreturn_t i2c_imx_isr(int irq, void *dev_id)
|
||||
{
|
||||
struct imx_i2c_struct *i2c_imx = dev_id;
|
||||
unsigned int ctl, status;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&i2c_imx->slave_lock, flags);
|
||||
status = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2SR);
|
||||
ctl = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2CR);
|
||||
|
||||
@@ -851,14 +898,20 @@ static irqreturn_t i2c_imx_isr(int irq, void *dev_id)
|
||||
i2c_imx_clear_irq(i2c_imx, I2SR_IIF);
|
||||
if (i2c_imx->slave) {
|
||||
if (!(ctl & I2CR_MSTA)) {
|
||||
return i2c_imx_slave_isr(i2c_imx, status, ctl);
|
||||
} else if (i2c_imx->last_slave_event !=
|
||||
I2C_SLAVE_STOP) {
|
||||
i2c_imx_slave_finish_op(i2c_imx);
|
||||
irqreturn_t ret;
|
||||
|
||||
ret = i2c_imx_slave_handle(i2c_imx,
|
||||
status, ctl);
|
||||
spin_unlock_irqrestore(&i2c_imx->slave_lock,
|
||||
flags);
|
||||
return ret;
|
||||
}
|
||||
i2c_imx_slave_finish_op(i2c_imx);
|
||||
}
|
||||
spin_unlock_irqrestore(&i2c_imx->slave_lock, flags);
|
||||
return i2c_imx_master_isr(i2c_imx, status);
|
||||
}
|
||||
spin_unlock_irqrestore(&i2c_imx->slave_lock, flags);
|
||||
|
||||
return IRQ_NONE;
|
||||
}
|
||||
@@ -1380,6 +1433,10 @@ static int i2c_imx_probe(struct platform_device *pdev)
|
||||
if (!i2c_imx)
|
||||
return -ENOMEM;
|
||||
|
||||
spin_lock_init(&i2c_imx->slave_lock);
|
||||
hrtimer_init(&i2c_imx->slave_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS);
|
||||
i2c_imx->slave_timer.function = i2c_imx_slave_timeout;
|
||||
|
||||
match = device_get_match_data(&pdev->dev);
|
||||
if (match)
|
||||
i2c_imx->hwdata = match;
|
||||
@@ -1491,6 +1548,8 @@ static int i2c_imx_remove(struct platform_device *pdev)
|
||||
|
||||
ret = pm_runtime_get_sync(&pdev->dev);
|
||||
|
||||
hrtimer_cancel(&i2c_imx->slave_timer);
|
||||
|
||||
/* remove adapter */
|
||||
dev_dbg(&i2c_imx->adapter.dev, "adapter removed\n");
|
||||
i2c_del_adapter(&i2c_imx->adapter);
|
||||
|
||||
@@ -1705,7 +1705,7 @@ int bnxt_re_modify_srq(struct ib_srq *ib_srq, struct ib_srq_attr *srq_attr,
|
||||
switch (srq_attr_mask) {
|
||||
case IB_SRQ_MAX_WR:
|
||||
/* SRQ resize is not supported */
|
||||
break;
|
||||
return -EINVAL;
|
||||
case IB_SRQ_LIMIT:
|
||||
/* Change the SRQ threshold */
|
||||
if (srq_attr->srq_limit > srq->qplib_srq.max_wqe)
|
||||
@@ -1720,13 +1720,12 @@ int bnxt_re_modify_srq(struct ib_srq *ib_srq, struct ib_srq_attr *srq_attr,
|
||||
/* On success, update the shadow */
|
||||
srq->srq_limit = srq_attr->srq_limit;
|
||||
/* No need to Build and send response back to udata */
|
||||
break;
|
||||
return 0;
|
||||
default:
|
||||
ibdev_err(&rdev->ibdev,
|
||||
"Unsupported srq_attr_mask 0x%x", srq_attr_mask);
|
||||
return -EINVAL;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int bnxt_re_query_srq(struct ib_srq *ib_srq, struct ib_srq_attr *srq_attr)
|
||||
|
||||
@@ -2089,7 +2089,7 @@ int init_credit_return(struct hfi1_devdata *dd)
|
||||
"Unable to allocate credit return DMA range for NUMA %d\n",
|
||||
i);
|
||||
ret = -ENOMEM;
|
||||
goto done;
|
||||
goto free_cr_base;
|
||||
}
|
||||
}
|
||||
set_dev_node(&dd->pcidev->dev, dd->node);
|
||||
@@ -2097,6 +2097,10 @@ int init_credit_return(struct hfi1_devdata *dd)
|
||||
ret = 0;
|
||||
done:
|
||||
return ret;
|
||||
|
||||
free_cr_base:
|
||||
free_credit_return(dd);
|
||||
goto done;
|
||||
}
|
||||
|
||||
void free_credit_return(struct hfi1_devdata *dd)
|
||||
|
||||
@@ -3158,7 +3158,7 @@ int _pad_sdma_tx_descs(struct hfi1_devdata *dd, struct sdma_txreq *tx)
|
||||
{
|
||||
int rval = 0;
|
||||
|
||||
if ((unlikely(tx->num_desc + 1 == tx->desc_limit))) {
|
||||
if ((unlikely(tx->num_desc == tx->desc_limit))) {
|
||||
rval = _extend_sdma_tx_descs(dd, tx);
|
||||
if (rval) {
|
||||
__sdma_txclean(dd, tx);
|
||||
|
||||
@@ -345,6 +345,7 @@ enum irdma_cqp_op_type {
|
||||
#define IRDMA_AE_LLP_TOO_MANY_KEEPALIVE_RETRIES 0x050b
|
||||
#define IRDMA_AE_LLP_DOUBT_REACHABILITY 0x050c
|
||||
#define IRDMA_AE_LLP_CONNECTION_ESTABLISHED 0x050e
|
||||
#define IRDMA_AE_LLP_TOO_MANY_RNRS 0x050f
|
||||
#define IRDMA_AE_RESOURCE_EXHAUSTION 0x0520
|
||||
#define IRDMA_AE_RESET_SENT 0x0601
|
||||
#define IRDMA_AE_TERMINATE_SENT 0x0602
|
||||
|
||||
@@ -379,6 +379,7 @@ static void irdma_process_aeq(struct irdma_pci_f *rf)
|
||||
case IRDMA_AE_LLP_TOO_MANY_RETRIES:
|
||||
case IRDMA_AE_LCE_QP_CATASTROPHIC:
|
||||
case IRDMA_AE_LCE_FUNCTION_CATASTROPHIC:
|
||||
case IRDMA_AE_LLP_TOO_MANY_RNRS:
|
||||
case IRDMA_AE_LCE_CQ_CATASTROPHIC:
|
||||
case IRDMA_AE_UDA_XMIT_DGRAM_TOO_LONG:
|
||||
default:
|
||||
@@ -562,6 +563,13 @@ static void irdma_destroy_irq(struct irdma_pci_f *rf,
|
||||
dev->irq_ops->irdma_dis_irq(dev, msix_vec->idx);
|
||||
irq_set_affinity_hint(msix_vec->irq, NULL);
|
||||
free_irq(msix_vec->irq, dev_id);
|
||||
if (rf == dev_id) {
|
||||
tasklet_kill(&rf->dpc_tasklet);
|
||||
} else {
|
||||
struct irdma_ceq *iwceq = (struct irdma_ceq *)dev_id;
|
||||
|
||||
tasklet_kill(&iwceq->dpc_tasklet);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -749,7 +749,9 @@ static int irdma_validate_qp_attrs(struct ib_qp_init_attr *init_attr,
|
||||
|
||||
if (init_attr->cap.max_inline_data > uk_attrs->max_hw_inline ||
|
||||
init_attr->cap.max_send_sge > uk_attrs->max_hw_wq_frags ||
|
||||
init_attr->cap.max_recv_sge > uk_attrs->max_hw_wq_frags)
|
||||
init_attr->cap.max_recv_sge > uk_attrs->max_hw_wq_frags ||
|
||||
init_attr->cap.max_send_wr > uk_attrs->max_hw_wq_quanta ||
|
||||
init_attr->cap.max_recv_wr > uk_attrs->max_hw_rq_quanta)
|
||||
return -EINVAL;
|
||||
|
||||
if (rdma_protocol_roce(&iwdev->ibdev, 1)) {
|
||||
@@ -2074,9 +2076,8 @@ static int irdma_create_cq(struct ib_cq *ibcq,
|
||||
info.cq_base_pa = iwcq->kmem.pa;
|
||||
}
|
||||
|
||||
if (dev->hw_attrs.uk_attrs.hw_rev >= IRDMA_GEN_2)
|
||||
info.shadow_read_threshold = min(info.cq_uk_init_info.cq_size / 2,
|
||||
(u32)IRDMA_MAX_CQ_READ_THRESH);
|
||||
info.shadow_read_threshold = min(info.cq_uk_init_info.cq_size / 2,
|
||||
(u32)IRDMA_MAX_CQ_READ_THRESH);
|
||||
|
||||
if (irdma_sc_cq_init(cq, &info)) {
|
||||
ibdev_dbg(&iwdev->ibdev, "VERBS: init cq fail\n");
|
||||
|
||||
@@ -1888,8 +1888,17 @@ static int qedr_create_user_qp(struct qedr_dev *dev,
|
||||
/* RQ - read access only (0) */
|
||||
rc = qedr_init_user_queue(udata, dev, &qp->urq, ureq.rq_addr,
|
||||
ureq.rq_len, true, 0, alloc_and_init);
|
||||
if (rc)
|
||||
if (rc) {
|
||||
ib_umem_release(qp->usq.umem);
|
||||
qp->usq.umem = NULL;
|
||||
if (rdma_protocol_roce(&dev->ibdev, 1)) {
|
||||
qedr_free_pbl(dev, &qp->usq.pbl_info,
|
||||
qp->usq.pbl_tbl);
|
||||
} else {
|
||||
kfree(qp->usq.pbl_tbl);
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
|
||||
memset(&in_params, 0, sizeof(in_params));
|
||||
|
||||
@@ -1504,7 +1504,6 @@ error:
|
||||
|
||||
cep->cm_id = NULL;
|
||||
id->rem_ref(id);
|
||||
siw_cep_put(cep);
|
||||
|
||||
qp->cep = NULL;
|
||||
siw_cep_put(cep);
|
||||
|
||||
@@ -1492,7 +1492,7 @@ int siw_map_mr_sg(struct ib_mr *base_mr, struct scatterlist *sl, int num_sle,
|
||||
|
||||
if (pbl->max_buf < num_sle) {
|
||||
siw_dbg_mem(mem, "too many SGE's: %d > %d\n",
|
||||
mem->pbl->max_buf, num_sle);
|
||||
num_sle, pbl->max_buf);
|
||||
return -ENOMEM;
|
||||
}
|
||||
for_each_sg(sl, slp, num_sle, i) {
|
||||
|
||||
@@ -79,12 +79,16 @@ module_param(srpt_srq_size, int, 0444);
|
||||
MODULE_PARM_DESC(srpt_srq_size,
|
||||
"Shared receive queue (SRQ) size.");
|
||||
|
||||
static int srpt_set_u64_x(const char *buffer, const struct kernel_param *kp)
|
||||
{
|
||||
return kstrtou64(buffer, 16, (u64 *)kp->arg);
|
||||
}
|
||||
static int srpt_get_u64_x(char *buffer, const struct kernel_param *kp)
|
||||
{
|
||||
return sprintf(buffer, "0x%016llx\n", *(u64 *)kp->arg);
|
||||
}
|
||||
module_param_call(srpt_service_guid, NULL, srpt_get_u64_x, &srpt_service_guid,
|
||||
0444);
|
||||
module_param_call(srpt_service_guid, srpt_set_u64_x, srpt_get_u64_x,
|
||||
&srpt_service_guid, 0444);
|
||||
MODULE_PARM_DESC(srpt_service_guid,
|
||||
"Using this value for ioc_guid, id_ext, and cm_listen_id instead of using the node_guid of the first HCA.");
|
||||
|
||||
@@ -210,10 +214,12 @@ static const char *get_ch_state_name(enum rdma_ch_state s)
|
||||
/**
|
||||
* srpt_qp_event - QP event callback function
|
||||
* @event: Description of the event that occurred.
|
||||
* @ch: SRPT RDMA channel.
|
||||
* @ptr: SRPT RDMA channel.
|
||||
*/
|
||||
static void srpt_qp_event(struct ib_event *event, struct srpt_rdma_ch *ch)
|
||||
static void srpt_qp_event(struct ib_event *event, void *ptr)
|
||||
{
|
||||
struct srpt_rdma_ch *ch = ptr;
|
||||
|
||||
pr_debug("QP event %d on ch=%p sess_name=%s-%d state=%s\n",
|
||||
event->event, ch, ch->sess_name, ch->qp->qp_num,
|
||||
get_ch_state_name(ch->state));
|
||||
@@ -1807,8 +1813,7 @@ retry:
|
||||
ch->cq_size = ch->rq_size + sq_size;
|
||||
|
||||
qp_init->qp_context = (void *)ch;
|
||||
qp_init->event_handler
|
||||
= (void(*)(struct ib_event *, void*))srpt_qp_event;
|
||||
qp_init->event_handler = srpt_qp_event;
|
||||
qp_init->send_cq = ch->cq;
|
||||
qp_init->recv_cq = ch->cq;
|
||||
qp_init->sq_sig_type = IB_SIGNAL_REQ_WR;
|
||||
|
||||
@@ -276,6 +276,7 @@ static const struct xpad_device {
|
||||
{ 0x1689, 0xfd00, "Razer Onza Tournament Edition", 0, XTYPE_XBOX360 },
|
||||
{ 0x1689, 0xfd01, "Razer Onza Classic Edition", 0, XTYPE_XBOX360 },
|
||||
{ 0x1689, 0xfe00, "Razer Sabertooth", 0, XTYPE_XBOX360 },
|
||||
{ 0x17ef, 0x6182, "Lenovo Legion Controller for Windows", 0, XTYPE_XBOX360 },
|
||||
{ 0x1949, 0x041a, "Amazon Game Controller", 0, XTYPE_XBOX360 },
|
||||
{ 0x1bad, 0x0002, "Harmonix Rock Band Guitar", 0, XTYPE_XBOX360 },
|
||||
{ 0x1bad, 0x0003, "Harmonix Rock Band Drumkit", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 },
|
||||
@@ -464,6 +465,7 @@ static const struct usb_device_id xpad_table[] = {
|
||||
XPAD_XBOX360_VENDOR(0x15e4), /* Numark X-Box 360 controllers */
|
||||
XPAD_XBOX360_VENDOR(0x162e), /* Joytech X-Box 360 controllers */
|
||||
XPAD_XBOX360_VENDOR(0x1689), /* Razer Onza */
|
||||
XPAD_XBOX360_VENDOR(0x17ef), /* Lenovo */
|
||||
XPAD_XBOX360_VENDOR(0x1949), /* Amazon controllers */
|
||||
XPAD_XBOX360_VENDOR(0x1bad), /* Harminix Rock Band Guitar and Drums */
|
||||
XPAD_XBOX360_VENDOR(0x20d6), /* PowerA Controllers */
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
* axial sliders presented by the device.
|
||||
*/
|
||||
|
||||
#include <linux/completion.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/err.h>
|
||||
@@ -96,8 +97,6 @@
|
||||
#define IQS269_MISC_B_TRACKING_UI_ENABLE BIT(4)
|
||||
#define IQS269_MISC_B_FILT_STR_SLIDER GENMASK(1, 0)
|
||||
|
||||
#define IQS269_CHx_SETTINGS 0x8C
|
||||
|
||||
#define IQS269_CHx_ENG_A_MEAS_CAP_SIZE BIT(15)
|
||||
#define IQS269_CHx_ENG_A_RX_GND_INACTIVE BIT(13)
|
||||
#define IQS269_CHx_ENG_A_LOCAL_CAP_SIZE BIT(12)
|
||||
@@ -146,14 +145,7 @@
|
||||
#define IQS269_NUM_CH 8
|
||||
#define IQS269_NUM_SL 2
|
||||
|
||||
#define IQS269_ATI_POLL_SLEEP_US (iqs269->delay_mult * 10000)
|
||||
#define IQS269_ATI_POLL_TIMEOUT_US (iqs269->delay_mult * 500000)
|
||||
#define IQS269_ATI_STABLE_DELAY_MS (iqs269->delay_mult * 150)
|
||||
|
||||
#define IQS269_PWR_MODE_POLL_SLEEP_US IQS269_ATI_POLL_SLEEP_US
|
||||
#define IQS269_PWR_MODE_POLL_TIMEOUT_US IQS269_ATI_POLL_TIMEOUT_US
|
||||
|
||||
#define iqs269_irq_wait() usleep_range(100, 150)
|
||||
#define iqs269_irq_wait() usleep_range(200, 250)
|
||||
|
||||
enum iqs269_local_cap_size {
|
||||
IQS269_LOCAL_CAP_SIZE_0,
|
||||
@@ -245,6 +237,18 @@ struct iqs269_ver_info {
|
||||
u8 padding;
|
||||
} __packed;
|
||||
|
||||
struct iqs269_ch_reg {
|
||||
u8 rx_enable;
|
||||
u8 tx_enable;
|
||||
__be16 engine_a;
|
||||
__be16 engine_b;
|
||||
__be16 ati_comp;
|
||||
u8 thresh[3];
|
||||
u8 hyst;
|
||||
u8 assoc_select;
|
||||
u8 assoc_weight;
|
||||
} __packed;
|
||||
|
||||
struct iqs269_sys_reg {
|
||||
__be16 general;
|
||||
u8 active;
|
||||
@@ -266,18 +270,7 @@ struct iqs269_sys_reg {
|
||||
u8 timeout_swipe;
|
||||
u8 thresh_swipe;
|
||||
u8 redo_ati;
|
||||
} __packed;
|
||||
|
||||
struct iqs269_ch_reg {
|
||||
u8 rx_enable;
|
||||
u8 tx_enable;
|
||||
__be16 engine_a;
|
||||
__be16 engine_b;
|
||||
__be16 ati_comp;
|
||||
u8 thresh[3];
|
||||
u8 hyst;
|
||||
u8 assoc_select;
|
||||
u8 assoc_weight;
|
||||
struct iqs269_ch_reg ch_reg[IQS269_NUM_CH];
|
||||
} __packed;
|
||||
|
||||
struct iqs269_flags {
|
||||
@@ -292,13 +285,11 @@ struct iqs269_private {
|
||||
struct regmap *regmap;
|
||||
struct mutex lock;
|
||||
struct iqs269_switch_desc switches[ARRAY_SIZE(iqs269_events)];
|
||||
struct iqs269_ch_reg ch_reg[IQS269_NUM_CH];
|
||||
struct iqs269_sys_reg sys_reg;
|
||||
struct completion ati_done;
|
||||
struct input_dev *keypad;
|
||||
struct input_dev *slider[IQS269_NUM_SL];
|
||||
unsigned int keycode[ARRAY_SIZE(iqs269_events) * IQS269_NUM_CH];
|
||||
unsigned int suspend_mode;
|
||||
unsigned int delay_mult;
|
||||
unsigned int ch_num;
|
||||
bool hall_enable;
|
||||
bool ati_current;
|
||||
@@ -307,6 +298,7 @@ struct iqs269_private {
|
||||
static int iqs269_ati_mode_set(struct iqs269_private *iqs269,
|
||||
unsigned int ch_num, unsigned int mode)
|
||||
{
|
||||
struct iqs269_ch_reg *ch_reg = iqs269->sys_reg.ch_reg;
|
||||
u16 engine_a;
|
||||
|
||||
if (ch_num >= IQS269_NUM_CH)
|
||||
@@ -317,12 +309,12 @@ static int iqs269_ati_mode_set(struct iqs269_private *iqs269,
|
||||
|
||||
mutex_lock(&iqs269->lock);
|
||||
|
||||
engine_a = be16_to_cpu(iqs269->ch_reg[ch_num].engine_a);
|
||||
engine_a = be16_to_cpu(ch_reg[ch_num].engine_a);
|
||||
|
||||
engine_a &= ~IQS269_CHx_ENG_A_ATI_MODE_MASK;
|
||||
engine_a |= (mode << IQS269_CHx_ENG_A_ATI_MODE_SHIFT);
|
||||
|
||||
iqs269->ch_reg[ch_num].engine_a = cpu_to_be16(engine_a);
|
||||
ch_reg[ch_num].engine_a = cpu_to_be16(engine_a);
|
||||
iqs269->ati_current = false;
|
||||
|
||||
mutex_unlock(&iqs269->lock);
|
||||
@@ -333,13 +325,14 @@ static int iqs269_ati_mode_set(struct iqs269_private *iqs269,
|
||||
static int iqs269_ati_mode_get(struct iqs269_private *iqs269,
|
||||
unsigned int ch_num, unsigned int *mode)
|
||||
{
|
||||
struct iqs269_ch_reg *ch_reg = iqs269->sys_reg.ch_reg;
|
||||
u16 engine_a;
|
||||
|
||||
if (ch_num >= IQS269_NUM_CH)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&iqs269->lock);
|
||||
engine_a = be16_to_cpu(iqs269->ch_reg[ch_num].engine_a);
|
||||
engine_a = be16_to_cpu(ch_reg[ch_num].engine_a);
|
||||
mutex_unlock(&iqs269->lock);
|
||||
|
||||
engine_a &= IQS269_CHx_ENG_A_ATI_MODE_MASK;
|
||||
@@ -351,6 +344,7 @@ static int iqs269_ati_mode_get(struct iqs269_private *iqs269,
|
||||
static int iqs269_ati_base_set(struct iqs269_private *iqs269,
|
||||
unsigned int ch_num, unsigned int base)
|
||||
{
|
||||
struct iqs269_ch_reg *ch_reg = iqs269->sys_reg.ch_reg;
|
||||
u16 engine_b;
|
||||
|
||||
if (ch_num >= IQS269_NUM_CH)
|
||||
@@ -379,12 +373,12 @@ static int iqs269_ati_base_set(struct iqs269_private *iqs269,
|
||||
|
||||
mutex_lock(&iqs269->lock);
|
||||
|
||||
engine_b = be16_to_cpu(iqs269->ch_reg[ch_num].engine_b);
|
||||
engine_b = be16_to_cpu(ch_reg[ch_num].engine_b);
|
||||
|
||||
engine_b &= ~IQS269_CHx_ENG_B_ATI_BASE_MASK;
|
||||
engine_b |= base;
|
||||
|
||||
iqs269->ch_reg[ch_num].engine_b = cpu_to_be16(engine_b);
|
||||
ch_reg[ch_num].engine_b = cpu_to_be16(engine_b);
|
||||
iqs269->ati_current = false;
|
||||
|
||||
mutex_unlock(&iqs269->lock);
|
||||
@@ -395,13 +389,14 @@ static int iqs269_ati_base_set(struct iqs269_private *iqs269,
|
||||
static int iqs269_ati_base_get(struct iqs269_private *iqs269,
|
||||
unsigned int ch_num, unsigned int *base)
|
||||
{
|
||||
struct iqs269_ch_reg *ch_reg = iqs269->sys_reg.ch_reg;
|
||||
u16 engine_b;
|
||||
|
||||
if (ch_num >= IQS269_NUM_CH)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&iqs269->lock);
|
||||
engine_b = be16_to_cpu(iqs269->ch_reg[ch_num].engine_b);
|
||||
engine_b = be16_to_cpu(ch_reg[ch_num].engine_b);
|
||||
mutex_unlock(&iqs269->lock);
|
||||
|
||||
switch (engine_b & IQS269_CHx_ENG_B_ATI_BASE_MASK) {
|
||||
@@ -429,6 +424,7 @@ static int iqs269_ati_base_get(struct iqs269_private *iqs269,
|
||||
static int iqs269_ati_target_set(struct iqs269_private *iqs269,
|
||||
unsigned int ch_num, unsigned int target)
|
||||
{
|
||||
struct iqs269_ch_reg *ch_reg = iqs269->sys_reg.ch_reg;
|
||||
u16 engine_b;
|
||||
|
||||
if (ch_num >= IQS269_NUM_CH)
|
||||
@@ -439,12 +435,12 @@ static int iqs269_ati_target_set(struct iqs269_private *iqs269,
|
||||
|
||||
mutex_lock(&iqs269->lock);
|
||||
|
||||
engine_b = be16_to_cpu(iqs269->ch_reg[ch_num].engine_b);
|
||||
engine_b = be16_to_cpu(ch_reg[ch_num].engine_b);
|
||||
|
||||
engine_b &= ~IQS269_CHx_ENG_B_ATI_TARGET_MASK;
|
||||
engine_b |= target / 32;
|
||||
|
||||
iqs269->ch_reg[ch_num].engine_b = cpu_to_be16(engine_b);
|
||||
ch_reg[ch_num].engine_b = cpu_to_be16(engine_b);
|
||||
iqs269->ati_current = false;
|
||||
|
||||
mutex_unlock(&iqs269->lock);
|
||||
@@ -455,13 +451,14 @@ static int iqs269_ati_target_set(struct iqs269_private *iqs269,
|
||||
static int iqs269_ati_target_get(struct iqs269_private *iqs269,
|
||||
unsigned int ch_num, unsigned int *target)
|
||||
{
|
||||
struct iqs269_ch_reg *ch_reg = iqs269->sys_reg.ch_reg;
|
||||
u16 engine_b;
|
||||
|
||||
if (ch_num >= IQS269_NUM_CH)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&iqs269->lock);
|
||||
engine_b = be16_to_cpu(iqs269->ch_reg[ch_num].engine_b);
|
||||
engine_b = be16_to_cpu(ch_reg[ch_num].engine_b);
|
||||
mutex_unlock(&iqs269->lock);
|
||||
|
||||
*target = (engine_b & IQS269_CHx_ENG_B_ATI_TARGET_MASK) * 32;
|
||||
@@ -531,13 +528,7 @@ static int iqs269_parse_chan(struct iqs269_private *iqs269,
|
||||
if (fwnode_property_present(ch_node, "azoteq,slider1-select"))
|
||||
iqs269->sys_reg.slider_select[1] |= BIT(reg);
|
||||
|
||||
ch_reg = &iqs269->ch_reg[reg];
|
||||
|
||||
error = regmap_raw_read(iqs269->regmap,
|
||||
IQS269_CHx_SETTINGS + reg * sizeof(*ch_reg) / 2,
|
||||
ch_reg, sizeof(*ch_reg));
|
||||
if (error)
|
||||
return error;
|
||||
ch_reg = &iqs269->sys_reg.ch_reg[reg];
|
||||
|
||||
error = iqs269_parse_mask(ch_node, "azoteq,rx-enable",
|
||||
&ch_reg->rx_enable);
|
||||
@@ -694,6 +685,7 @@ static int iqs269_parse_chan(struct iqs269_private *iqs269,
|
||||
dev_err(&client->dev,
|
||||
"Invalid channel %u threshold: %u\n",
|
||||
reg, val);
|
||||
fwnode_handle_put(ev_node);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -707,6 +699,7 @@ static int iqs269_parse_chan(struct iqs269_private *iqs269,
|
||||
dev_err(&client->dev,
|
||||
"Invalid channel %u hysteresis: %u\n",
|
||||
reg, val);
|
||||
fwnode_handle_put(ev_node);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -721,8 +714,16 @@ static int iqs269_parse_chan(struct iqs269_private *iqs269,
|
||||
}
|
||||
}
|
||||
|
||||
if (fwnode_property_read_u32(ev_node, "linux,code", &val))
|
||||
error = fwnode_property_read_u32(ev_node, "linux,code", &val);
|
||||
fwnode_handle_put(ev_node);
|
||||
if (error == -EINVAL) {
|
||||
continue;
|
||||
} else if (error) {
|
||||
dev_err(&client->dev,
|
||||
"Failed to read channel %u code: %d\n", reg,
|
||||
error);
|
||||
return error;
|
||||
}
|
||||
|
||||
switch (reg) {
|
||||
case IQS269_CHx_HALL_ACTIVE:
|
||||
@@ -759,17 +760,6 @@ static int iqs269_parse_prop(struct iqs269_private *iqs269)
|
||||
iqs269->hall_enable = device_property_present(&client->dev,
|
||||
"azoteq,hall-enable");
|
||||
|
||||
if (!device_property_read_u32(&client->dev, "azoteq,suspend-mode",
|
||||
&val)) {
|
||||
if (val > IQS269_SYS_SETTINGS_PWR_MODE_MAX) {
|
||||
dev_err(&client->dev, "Invalid suspend mode: %u\n",
|
||||
val);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
iqs269->suspend_mode = val;
|
||||
}
|
||||
|
||||
error = regmap_raw_read(iqs269->regmap, IQS269_SYS_SETTINGS, sys_reg,
|
||||
sizeof(*sys_reg));
|
||||
if (error)
|
||||
@@ -980,13 +970,8 @@ static int iqs269_parse_prop(struct iqs269_private *iqs269)
|
||||
|
||||
general = be16_to_cpu(sys_reg->general);
|
||||
|
||||
if (device_property_present(&client->dev, "azoteq,clk-div")) {
|
||||
if (device_property_present(&client->dev, "azoteq,clk-div"))
|
||||
general |= IQS269_SYS_SETTINGS_CLK_DIV;
|
||||
iqs269->delay_mult = 4;
|
||||
} else {
|
||||
general &= ~IQS269_SYS_SETTINGS_CLK_DIV;
|
||||
iqs269->delay_mult = 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Configure the device to automatically switch between normal and low-
|
||||
@@ -997,6 +982,17 @@ static int iqs269_parse_prop(struct iqs269_private *iqs269)
|
||||
general &= ~IQS269_SYS_SETTINGS_DIS_AUTO;
|
||||
general &= ~IQS269_SYS_SETTINGS_PWR_MODE_MASK;
|
||||
|
||||
if (!device_property_read_u32(&client->dev, "azoteq,suspend-mode",
|
||||
&val)) {
|
||||
if (val > IQS269_SYS_SETTINGS_PWR_MODE_MAX) {
|
||||
dev_err(&client->dev, "Invalid suspend mode: %u\n",
|
||||
val);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
general |= (val << IQS269_SYS_SETTINGS_PWR_MODE_SHIFT);
|
||||
}
|
||||
|
||||
if (!device_property_read_u32(&client->dev, "azoteq,ulp-update",
|
||||
&val)) {
|
||||
if (val > IQS269_SYS_SETTINGS_ULP_UPDATE_MAX) {
|
||||
@@ -1032,10 +1028,7 @@ static int iqs269_parse_prop(struct iqs269_private *iqs269)
|
||||
|
||||
static int iqs269_dev_init(struct iqs269_private *iqs269)
|
||||
{
|
||||
struct iqs269_sys_reg *sys_reg = &iqs269->sys_reg;
|
||||
struct iqs269_ch_reg *ch_reg;
|
||||
unsigned int val;
|
||||
int error, i;
|
||||
int error;
|
||||
|
||||
mutex_lock(&iqs269->lock);
|
||||
|
||||
@@ -1045,38 +1038,17 @@ static int iqs269_dev_init(struct iqs269_private *iqs269)
|
||||
if (error)
|
||||
goto err_mutex;
|
||||
|
||||
for (i = 0; i < IQS269_NUM_CH; i++) {
|
||||
if (!(sys_reg->active & BIT(i)))
|
||||
continue;
|
||||
|
||||
ch_reg = &iqs269->ch_reg[i];
|
||||
|
||||
error = regmap_raw_write(iqs269->regmap,
|
||||
IQS269_CHx_SETTINGS + i *
|
||||
sizeof(*ch_reg) / 2, ch_reg,
|
||||
sizeof(*ch_reg));
|
||||
if (error)
|
||||
goto err_mutex;
|
||||
}
|
||||
error = regmap_raw_write(iqs269->regmap, IQS269_SYS_SETTINGS,
|
||||
&iqs269->sys_reg, sizeof(iqs269->sys_reg));
|
||||
if (error)
|
||||
goto err_mutex;
|
||||
|
||||
/*
|
||||
* The REDO-ATI and ATI channel selection fields must be written in the
|
||||
* same block write, so every field between registers 0x80 through 0x8B
|
||||
* (inclusive) must be written as well.
|
||||
* The following delay gives the device time to deassert its RDY output
|
||||
* so as to prevent an interrupt from being serviced prematurely.
|
||||
*/
|
||||
error = regmap_raw_write(iqs269->regmap, IQS269_SYS_SETTINGS, sys_reg,
|
||||
sizeof(*sys_reg));
|
||||
if (error)
|
||||
goto err_mutex;
|
||||
usleep_range(2000, 2100);
|
||||
|
||||
error = regmap_read_poll_timeout(iqs269->regmap, IQS269_SYS_FLAGS, val,
|
||||
!(val & IQS269_SYS_FLAGS_IN_ATI),
|
||||
IQS269_ATI_POLL_SLEEP_US,
|
||||
IQS269_ATI_POLL_TIMEOUT_US);
|
||||
if (error)
|
||||
goto err_mutex;
|
||||
|
||||
msleep(IQS269_ATI_STABLE_DELAY_MS);
|
||||
iqs269->ati_current = true;
|
||||
|
||||
err_mutex:
|
||||
@@ -1088,10 +1060,8 @@ err_mutex:
|
||||
static int iqs269_input_init(struct iqs269_private *iqs269)
|
||||
{
|
||||
struct i2c_client *client = iqs269->client;
|
||||
struct iqs269_flags flags;
|
||||
unsigned int sw_code, keycode;
|
||||
int error, i, j;
|
||||
u8 dir_mask, state;
|
||||
|
||||
iqs269->keypad = devm_input_allocate_device(&client->dev);
|
||||
if (!iqs269->keypad)
|
||||
@@ -1104,23 +1074,7 @@ static int iqs269_input_init(struct iqs269_private *iqs269)
|
||||
iqs269->keypad->name = "iqs269a_keypad";
|
||||
iqs269->keypad->id.bustype = BUS_I2C;
|
||||
|
||||
if (iqs269->hall_enable) {
|
||||
error = regmap_raw_read(iqs269->regmap, IQS269_SYS_FLAGS,
|
||||
&flags, sizeof(flags));
|
||||
if (error) {
|
||||
dev_err(&client->dev,
|
||||
"Failed to read initial status: %d\n", error);
|
||||
return error;
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(iqs269_events); i++) {
|
||||
dir_mask = flags.states[IQS269_ST_OFFS_DIR];
|
||||
if (!iqs269_events[i].dir_up)
|
||||
dir_mask = ~dir_mask;
|
||||
|
||||
state = flags.states[iqs269_events[i].st_offs] & dir_mask;
|
||||
|
||||
sw_code = iqs269->switches[i].code;
|
||||
|
||||
for (j = 0; j < IQS269_NUM_CH; j++) {
|
||||
@@ -1133,13 +1087,9 @@ static int iqs269_input_init(struct iqs269_private *iqs269)
|
||||
switch (j) {
|
||||
case IQS269_CHx_HALL_ACTIVE:
|
||||
if (iqs269->hall_enable &&
|
||||
iqs269->switches[i].enabled) {
|
||||
iqs269->switches[i].enabled)
|
||||
input_set_capability(iqs269->keypad,
|
||||
EV_SW, sw_code);
|
||||
input_report_switch(iqs269->keypad,
|
||||
sw_code,
|
||||
state & BIT(j));
|
||||
}
|
||||
fallthrough;
|
||||
|
||||
case IQS269_CHx_HALL_INACTIVE:
|
||||
@@ -1155,14 +1105,6 @@ static int iqs269_input_init(struct iqs269_private *iqs269)
|
||||
}
|
||||
}
|
||||
|
||||
input_sync(iqs269->keypad);
|
||||
|
||||
error = input_register_device(iqs269->keypad);
|
||||
if (error) {
|
||||
dev_err(&client->dev, "Failed to register keypad: %d\n", error);
|
||||
return error;
|
||||
}
|
||||
|
||||
for (i = 0; i < IQS269_NUM_SL; i++) {
|
||||
if (!iqs269->sys_reg.slider_select[i])
|
||||
continue;
|
||||
@@ -1222,6 +1164,9 @@ static int iqs269_report(struct iqs269_private *iqs269)
|
||||
return error;
|
||||
}
|
||||
|
||||
if (be16_to_cpu(flags.system) & IQS269_SYS_FLAGS_IN_ATI)
|
||||
return 0;
|
||||
|
||||
error = regmap_raw_read(iqs269->regmap, IQS269_SLIDER_X, slider_x,
|
||||
sizeof(slider_x));
|
||||
if (error) {
|
||||
@@ -1284,6 +1229,12 @@ static int iqs269_report(struct iqs269_private *iqs269)
|
||||
|
||||
input_sync(iqs269->keypad);
|
||||
|
||||
/*
|
||||
* The following completion signals that ATI has finished, any initial
|
||||
* switch states have been reported and the keypad can be registered.
|
||||
*/
|
||||
complete_all(&iqs269->ati_done);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1315,6 +1266,9 @@ static ssize_t counts_show(struct device *dev,
|
||||
if (!iqs269->ati_current || iqs269->hall_enable)
|
||||
return -EPERM;
|
||||
|
||||
if (!completion_done(&iqs269->ati_done))
|
||||
return -EBUSY;
|
||||
|
||||
/*
|
||||
* Unsolicited I2C communication prompts the device to assert its RDY
|
||||
* pin, so disable the interrupt line until the operation is finished
|
||||
@@ -1339,6 +1293,7 @@ static ssize_t hall_bin_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct iqs269_private *iqs269 = dev_get_drvdata(dev);
|
||||
struct iqs269_ch_reg *ch_reg = iqs269->sys_reg.ch_reg;
|
||||
struct i2c_client *client = iqs269->client;
|
||||
unsigned int val;
|
||||
int error;
|
||||
@@ -1353,8 +1308,8 @@ static ssize_t hall_bin_show(struct device *dev,
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
switch (iqs269->ch_reg[IQS269_CHx_HALL_ACTIVE].rx_enable &
|
||||
iqs269->ch_reg[IQS269_CHx_HALL_INACTIVE].rx_enable) {
|
||||
switch (ch_reg[IQS269_CHx_HALL_ACTIVE].rx_enable &
|
||||
ch_reg[IQS269_CHx_HALL_INACTIVE].rx_enable) {
|
||||
case IQS269_HALL_PAD_R:
|
||||
val &= IQS269_CAL_DATA_A_HALL_BIN_R_MASK;
|
||||
val >>= IQS269_CAL_DATA_A_HALL_BIN_R_SHIFT;
|
||||
@@ -1434,9 +1389,10 @@ static ssize_t rx_enable_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct iqs269_private *iqs269 = dev_get_drvdata(dev);
|
||||
struct iqs269_ch_reg *ch_reg = iqs269->sys_reg.ch_reg;
|
||||
|
||||
return scnprintf(buf, PAGE_SIZE, "%u\n",
|
||||
iqs269->ch_reg[iqs269->ch_num].rx_enable);
|
||||
ch_reg[iqs269->ch_num].rx_enable);
|
||||
}
|
||||
|
||||
static ssize_t rx_enable_store(struct device *dev,
|
||||
@@ -1444,6 +1400,7 @@ static ssize_t rx_enable_store(struct device *dev,
|
||||
size_t count)
|
||||
{
|
||||
struct iqs269_private *iqs269 = dev_get_drvdata(dev);
|
||||
struct iqs269_ch_reg *ch_reg = iqs269->sys_reg.ch_reg;
|
||||
unsigned int val;
|
||||
int error;
|
||||
|
||||
@@ -1456,7 +1413,7 @@ static ssize_t rx_enable_store(struct device *dev,
|
||||
|
||||
mutex_lock(&iqs269->lock);
|
||||
|
||||
iqs269->ch_reg[iqs269->ch_num].rx_enable = val;
|
||||
ch_reg[iqs269->ch_num].rx_enable = val;
|
||||
iqs269->ati_current = false;
|
||||
|
||||
mutex_unlock(&iqs269->lock);
|
||||
@@ -1568,7 +1525,9 @@ static ssize_t ati_trigger_show(struct device *dev,
|
||||
{
|
||||
struct iqs269_private *iqs269 = dev_get_drvdata(dev);
|
||||
|
||||
return scnprintf(buf, PAGE_SIZE, "%u\n", iqs269->ati_current);
|
||||
return scnprintf(buf, PAGE_SIZE, "%u\n",
|
||||
iqs269->ati_current &&
|
||||
completion_done(&iqs269->ati_done));
|
||||
}
|
||||
|
||||
static ssize_t ati_trigger_store(struct device *dev,
|
||||
@@ -1588,6 +1547,7 @@ static ssize_t ati_trigger_store(struct device *dev,
|
||||
return count;
|
||||
|
||||
disable_irq(client->irq);
|
||||
reinit_completion(&iqs269->ati_done);
|
||||
|
||||
error = iqs269_dev_init(iqs269);
|
||||
|
||||
@@ -1597,6 +1557,10 @@ static ssize_t ati_trigger_store(struct device *dev,
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
if (!wait_for_completion_timeout(&iqs269->ati_done,
|
||||
msecs_to_jiffies(2000)))
|
||||
return -ETIMEDOUT;
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
@@ -1655,6 +1619,7 @@ static int iqs269_probe(struct i2c_client *client)
|
||||
}
|
||||
|
||||
mutex_init(&iqs269->lock);
|
||||
init_completion(&iqs269->ati_done);
|
||||
|
||||
error = regmap_raw_read(iqs269->regmap, IQS269_VER_INFO, &ver_info,
|
||||
sizeof(ver_info));
|
||||
@@ -1690,6 +1655,22 @@ static int iqs269_probe(struct i2c_client *client)
|
||||
return error;
|
||||
}
|
||||
|
||||
if (!wait_for_completion_timeout(&iqs269->ati_done,
|
||||
msecs_to_jiffies(2000))) {
|
||||
dev_err(&client->dev, "Failed to complete ATI\n");
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
/*
|
||||
* The keypad may include one or more switches and is not registered
|
||||
* until ATI is complete and the initial switch states are read.
|
||||
*/
|
||||
error = input_register_device(iqs269->keypad);
|
||||
if (error) {
|
||||
dev_err(&client->dev, "Failed to register keypad: %d\n", error);
|
||||
return error;
|
||||
}
|
||||
|
||||
error = devm_device_add_group(&client->dev, &iqs269_attr_group);
|
||||
if (error)
|
||||
dev_err(&client->dev, "Failed to add attributes: %d\n", error);
|
||||
@@ -1697,113 +1678,61 @@ static int iqs269_probe(struct i2c_client *client)
|
||||
return error;
|
||||
}
|
||||
|
||||
static int __maybe_unused iqs269_suspend(struct device *dev)
|
||||
static u16 iqs269_general_get(struct iqs269_private *iqs269)
|
||||
{
|
||||
u16 general = be16_to_cpu(iqs269->sys_reg.general);
|
||||
|
||||
general &= ~IQS269_SYS_SETTINGS_REDO_ATI;
|
||||
general &= ~IQS269_SYS_SETTINGS_ACK_RESET;
|
||||
|
||||
return general | IQS269_SYS_SETTINGS_DIS_AUTO;
|
||||
}
|
||||
|
||||
static int iqs269_suspend(struct device *dev)
|
||||
{
|
||||
struct iqs269_private *iqs269 = dev_get_drvdata(dev);
|
||||
struct i2c_client *client = iqs269->client;
|
||||
unsigned int val;
|
||||
int error;
|
||||
u16 general = iqs269_general_get(iqs269);
|
||||
|
||||
if (!iqs269->suspend_mode)
|
||||
if (!(general & IQS269_SYS_SETTINGS_PWR_MODE_MASK))
|
||||
return 0;
|
||||
|
||||
disable_irq(client->irq);
|
||||
|
||||
/*
|
||||
* Automatic power mode switching must be disabled before the device is
|
||||
* forced into any particular power mode. In this case, the device will
|
||||
* transition into normal-power mode.
|
||||
*/
|
||||
error = regmap_update_bits(iqs269->regmap, IQS269_SYS_SETTINGS,
|
||||
IQS269_SYS_SETTINGS_DIS_AUTO, ~0);
|
||||
if (error)
|
||||
goto err_irq;
|
||||
error = regmap_write(iqs269->regmap, IQS269_SYS_SETTINGS, general);
|
||||
|
||||
/*
|
||||
* The following check ensures the device has completed its transition
|
||||
* into normal-power mode before a manual mode switch is performed.
|
||||
*/
|
||||
error = regmap_read_poll_timeout(iqs269->regmap, IQS269_SYS_FLAGS, val,
|
||||
!(val & IQS269_SYS_FLAGS_PWR_MODE_MASK),
|
||||
IQS269_PWR_MODE_POLL_SLEEP_US,
|
||||
IQS269_PWR_MODE_POLL_TIMEOUT_US);
|
||||
if (error)
|
||||
goto err_irq;
|
||||
|
||||
error = regmap_update_bits(iqs269->regmap, IQS269_SYS_SETTINGS,
|
||||
IQS269_SYS_SETTINGS_PWR_MODE_MASK,
|
||||
iqs269->suspend_mode <<
|
||||
IQS269_SYS_SETTINGS_PWR_MODE_SHIFT);
|
||||
if (error)
|
||||
goto err_irq;
|
||||
|
||||
/*
|
||||
* This last check ensures the device has completed its transition into
|
||||
* the desired power mode to prevent any spurious interrupts from being
|
||||
* triggered after iqs269_suspend has already returned.
|
||||
*/
|
||||
error = regmap_read_poll_timeout(iqs269->regmap, IQS269_SYS_FLAGS, val,
|
||||
(val & IQS269_SYS_FLAGS_PWR_MODE_MASK)
|
||||
== (iqs269->suspend_mode <<
|
||||
IQS269_SYS_FLAGS_PWR_MODE_SHIFT),
|
||||
IQS269_PWR_MODE_POLL_SLEEP_US,
|
||||
IQS269_PWR_MODE_POLL_TIMEOUT_US);
|
||||
|
||||
err_irq:
|
||||
iqs269_irq_wait();
|
||||
enable_irq(client->irq);
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
static int __maybe_unused iqs269_resume(struct device *dev)
|
||||
static int iqs269_resume(struct device *dev)
|
||||
{
|
||||
struct iqs269_private *iqs269 = dev_get_drvdata(dev);
|
||||
struct i2c_client *client = iqs269->client;
|
||||
unsigned int val;
|
||||
int error;
|
||||
u16 general = iqs269_general_get(iqs269);
|
||||
|
||||
if (!iqs269->suspend_mode)
|
||||
if (!(general & IQS269_SYS_SETTINGS_PWR_MODE_MASK))
|
||||
return 0;
|
||||
|
||||
disable_irq(client->irq);
|
||||
|
||||
error = regmap_update_bits(iqs269->regmap, IQS269_SYS_SETTINGS,
|
||||
IQS269_SYS_SETTINGS_PWR_MODE_MASK, 0);
|
||||
if (error)
|
||||
goto err_irq;
|
||||
error = regmap_write(iqs269->regmap, IQS269_SYS_SETTINGS,
|
||||
general & ~IQS269_SYS_SETTINGS_PWR_MODE_MASK);
|
||||
if (!error)
|
||||
error = regmap_write(iqs269->regmap, IQS269_SYS_SETTINGS,
|
||||
general & ~IQS269_SYS_SETTINGS_DIS_AUTO);
|
||||
|
||||
/*
|
||||
* This check ensures the device has returned to normal-power mode
|
||||
* before automatic power mode switching is re-enabled.
|
||||
*/
|
||||
error = regmap_read_poll_timeout(iqs269->regmap, IQS269_SYS_FLAGS, val,
|
||||
!(val & IQS269_SYS_FLAGS_PWR_MODE_MASK),
|
||||
IQS269_PWR_MODE_POLL_SLEEP_US,
|
||||
IQS269_PWR_MODE_POLL_TIMEOUT_US);
|
||||
if (error)
|
||||
goto err_irq;
|
||||
|
||||
error = regmap_update_bits(iqs269->regmap, IQS269_SYS_SETTINGS,
|
||||
IQS269_SYS_SETTINGS_DIS_AUTO, 0);
|
||||
if (error)
|
||||
goto err_irq;
|
||||
|
||||
/*
|
||||
* This step reports any events that may have been "swallowed" as a
|
||||
* result of polling PWR_MODE (which automatically acknowledges any
|
||||
* pending interrupts).
|
||||
*/
|
||||
error = iqs269_report(iqs269);
|
||||
|
||||
err_irq:
|
||||
iqs269_irq_wait();
|
||||
enable_irq(client->irq);
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
static SIMPLE_DEV_PM_OPS(iqs269_pm, iqs269_suspend, iqs269_resume);
|
||||
static DEFINE_SIMPLE_DEV_PM_OPS(iqs269_pm, iqs269_suspend, iqs269_resume);
|
||||
|
||||
static const struct of_device_id iqs269_of_match[] = {
|
||||
{ .compatible = "azoteq,iqs269a" },
|
||||
@@ -1815,7 +1744,7 @@ static struct i2c_driver iqs269_i2c_driver = {
|
||||
.driver = {
|
||||
.name = "iqs269a",
|
||||
.of_match_table = iqs269_of_match,
|
||||
.pm = &iqs269_pm,
|
||||
.pm = pm_sleep_ptr(&iqs269_pm),
|
||||
},
|
||||
.probe_new = iqs269_probe,
|
||||
};
|
||||
|
||||
@@ -625,6 +625,14 @@ static const struct dmi_system_id i8042_dmi_quirk_table[] __initconst = {
|
||||
},
|
||||
.driver_data = (void *)(SERIO_QUIRK_NOAUX)
|
||||
},
|
||||
{
|
||||
/* Fujitsu Lifebook U728 */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK U728"),
|
||||
},
|
||||
.driver_data = (void *)(SERIO_QUIRK_NOAUX)
|
||||
},
|
||||
{
|
||||
/* Gigabyte M912 */
|
||||
.matches = {
|
||||
|
||||
@@ -851,14 +851,8 @@ static void ads7846_report_state(struct ads7846 *ts)
|
||||
if (x == MAX_12BIT)
|
||||
x = 0;
|
||||
|
||||
if (ts->model == 7843) {
|
||||
if (ts->model == 7843 || ts->model == 7845) {
|
||||
Rt = ts->pressure_max / 2;
|
||||
} else if (ts->model == 7845) {
|
||||
if (get_pendown_state(ts))
|
||||
Rt = ts->pressure_max / 2;
|
||||
else
|
||||
Rt = 0;
|
||||
dev_vdbg(&ts->spi->dev, "x/y: %d/%d, PD %d\n", x, y, Rt);
|
||||
} else if (likely(x && z1)) {
|
||||
/* compute touch pressure resistance using equation #2 */
|
||||
Rt = z2;
|
||||
@@ -1074,6 +1068,9 @@ static int ads7846_setup_spi_msg(struct ads7846 *ts,
|
||||
struct ads7846_buf_layout *l = &packet->l[cmd_idx];
|
||||
unsigned int max_count;
|
||||
|
||||
if (cmd_idx == packet->cmds - 1)
|
||||
cmd_idx = ADS7846_PWDOWN;
|
||||
|
||||
if (ads7846_cmd_need_settle(cmd_idx))
|
||||
max_count = packet->count + packet->count_skip;
|
||||
else
|
||||
@@ -1110,7 +1107,12 @@ static int ads7846_setup_spi_msg(struct ads7846 *ts,
|
||||
|
||||
for (cmd_idx = 0; cmd_idx < packet->cmds; cmd_idx++) {
|
||||
struct ads7846_buf_layout *l = &packet->l[cmd_idx];
|
||||
u8 cmd = ads7846_get_cmd(cmd_idx, vref);
|
||||
u8 cmd;
|
||||
|
||||
if (cmd_idx == packet->cmds - 1)
|
||||
cmd_idx = ADS7846_PWDOWN;
|
||||
|
||||
cmd = ads7846_get_cmd(cmd_idx, vref);
|
||||
|
||||
for (b = 0; b < l->count; b++)
|
||||
packet->tx[l->offset + b].cmd = cmd;
|
||||
@@ -1323,8 +1325,9 @@ static int ads7846_probe(struct spi_device *spi)
|
||||
pdata->y_min ? : 0,
|
||||
pdata->y_max ? : MAX_12BIT,
|
||||
0, 0);
|
||||
input_set_abs_params(input_dev, ABS_PRESSURE,
|
||||
pdata->pressure_min, pdata->pressure_max, 0, 0);
|
||||
if (ts->model != 7845)
|
||||
input_set_abs_params(input_dev, ABS_PRESSURE,
|
||||
pdata->pressure_min, pdata->pressure_max, 0, 0);
|
||||
|
||||
/*
|
||||
* Parse common framework properties. Must be done here to ensure the
|
||||
|
||||
@@ -2065,6 +2065,12 @@ static void kcryptd_crypt_write_convert(struct dm_crypt_io *io)
|
||||
io->ctx.bio_out = clone;
|
||||
io->ctx.iter_out = clone->bi_iter;
|
||||
|
||||
if (crypt_integrity_aead(cc)) {
|
||||
bio_copy_data(clone, io->base_bio);
|
||||
io->ctx.bio_in = clone;
|
||||
io->ctx.iter_in = clone->bi_iter;
|
||||
}
|
||||
|
||||
sector += bio_sectors(clone);
|
||||
|
||||
crypt_inc_pending(io);
|
||||
|
||||
@@ -4919,11 +4919,21 @@ action_store(struct mddev *mddev, const char *page, size_t len)
|
||||
return -EINVAL;
|
||||
err = mddev_lock(mddev);
|
||||
if (!err) {
|
||||
if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery))
|
||||
if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) {
|
||||
err = -EBUSY;
|
||||
else {
|
||||
} else if (mddev->reshape_position == MaxSector ||
|
||||
mddev->pers->check_reshape == NULL ||
|
||||
mddev->pers->check_reshape(mddev)) {
|
||||
clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
|
||||
err = mddev->pers->start_reshape(mddev);
|
||||
} else {
|
||||
/*
|
||||
* If reshape is still in progress, and
|
||||
* md_check_recovery() can continue to reshape,
|
||||
* don't restart reshape because data can be
|
||||
* corrupted for raid456.
|
||||
*/
|
||||
clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
|
||||
}
|
||||
mddev_unlock(mddev);
|
||||
}
|
||||
|
||||
@@ -903,6 +903,7 @@ static void flush_pending_writes(struct r10conf *conf)
|
||||
else
|
||||
submit_bio_noacct(bio);
|
||||
bio = next;
|
||||
cond_resched();
|
||||
}
|
||||
blk_finish_plug(&plug);
|
||||
} else
|
||||
@@ -1116,6 +1117,7 @@ static void raid10_unplug(struct blk_plug_cb *cb, bool from_schedule)
|
||||
else
|
||||
submit_bio_noacct(bio);
|
||||
bio = next;
|
||||
cond_resched();
|
||||
}
|
||||
kfree(plug);
|
||||
}
|
||||
|
||||
@@ -1133,18 +1133,18 @@ static int jz4740_mmc_remove(struct platform_device *pdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __maybe_unused jz4740_mmc_suspend(struct device *dev)
|
||||
static int jz4740_mmc_suspend(struct device *dev)
|
||||
{
|
||||
return pinctrl_pm_select_sleep_state(dev);
|
||||
}
|
||||
|
||||
static int __maybe_unused jz4740_mmc_resume(struct device *dev)
|
||||
static int jz4740_mmc_resume(struct device *dev)
|
||||
{
|
||||
return pinctrl_select_default_state(dev);
|
||||
}
|
||||
|
||||
static SIMPLE_DEV_PM_OPS(jz4740_mmc_pm_ops, jz4740_mmc_suspend,
|
||||
jz4740_mmc_resume);
|
||||
static DEFINE_SIMPLE_DEV_PM_OPS(jz4740_mmc_pm_ops, jz4740_mmc_suspend,
|
||||
jz4740_mmc_resume);
|
||||
|
||||
static struct platform_driver jz4740_mmc_driver = {
|
||||
.probe = jz4740_mmc_probe,
|
||||
@@ -1153,7 +1153,7 @@ static struct platform_driver jz4740_mmc_driver = {
|
||||
.name = "jz4740-mmc",
|
||||
.probe_type = PROBE_PREFER_ASYNCHRONOUS,
|
||||
.of_match_table = of_match_ptr(jz4740_mmc_of_match),
|
||||
.pm = pm_ptr(&jz4740_mmc_pm_ops),
|
||||
.pm = pm_sleep_ptr(&jz4740_mmc_pm_ops),
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
@@ -1185,7 +1185,6 @@ static int mxcmci_remove(struct platform_device *pdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
static int mxcmci_suspend(struct device *dev)
|
||||
{
|
||||
struct mmc_host *mmc = dev_get_drvdata(dev);
|
||||
@@ -1212,9 +1211,8 @@ static int mxcmci_resume(struct device *dev)
|
||||
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
static SIMPLE_DEV_PM_OPS(mxcmci_pm_ops, mxcmci_suspend, mxcmci_resume);
|
||||
static DEFINE_SIMPLE_DEV_PM_OPS(mxcmci_pm_ops, mxcmci_suspend, mxcmci_resume);
|
||||
|
||||
static struct platform_driver mxcmci_driver = {
|
||||
.probe = mxcmci_probe,
|
||||
@@ -1222,7 +1220,7 @@ static struct platform_driver mxcmci_driver = {
|
||||
.driver = {
|
||||
.name = DRIVER_NAME,
|
||||
.probe_type = PROBE_PREFER_ASYNCHRONOUS,
|
||||
.pm = &mxcmci_pm_ops,
|
||||
.pm = pm_sleep_ptr(&mxcmci_pm_ops),
|
||||
.of_match_table = mxcmci_of_match,
|
||||
}
|
||||
};
|
||||
|
||||
@@ -1609,7 +1609,7 @@ static int sunxi_nand_ooblayout_free(struct mtd_info *mtd, int section,
|
||||
if (section < ecc->steps)
|
||||
oobregion->length = 4;
|
||||
else
|
||||
oobregion->offset = mtd->oobsize - oobregion->offset;
|
||||
oobregion->length = mtd->oobsize - oobregion->offset;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -9451,6 +9451,11 @@ static pci_ers_result_t igb_io_error_detected(struct pci_dev *pdev,
|
||||
struct net_device *netdev = pci_get_drvdata(pdev);
|
||||
struct igb_adapter *adapter = netdev_priv(netdev);
|
||||
|
||||
if (state == pci_channel_io_normal) {
|
||||
dev_warn(&pdev->dev, "Non-correctable non-fatal error reported.\n");
|
||||
return PCI_ERS_RESULT_CAN_RECOVER;
|
||||
}
|
||||
|
||||
netif_device_detach(netdev);
|
||||
|
||||
if (state == pci_channel_io_perm_failure)
|
||||
|
||||
@@ -436,6 +436,10 @@ static void npc_fixup_vf_rule(struct rvu *rvu, struct npc_mcam *mcam,
|
||||
return;
|
||||
}
|
||||
|
||||
/* AF modifies given action iff PF/VF has requested for it */
|
||||
if ((entry->action & 0xFULL) != NIX_RX_ACTION_DEFAULT)
|
||||
return;
|
||||
|
||||
/* copy VF default entry action to the VF mcam entry */
|
||||
rx_action = npc_get_default_entry_action(rvu, mcam, blkaddr,
|
||||
target_func);
|
||||
|
||||
@@ -4897,8 +4897,6 @@ static void rtl8169_net_suspend(struct rtl8169_private *tp)
|
||||
rtl8169_down(tp);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
static int rtl8169_runtime_resume(struct device *dev)
|
||||
{
|
||||
struct rtl8169_private *tp = dev_get_drvdata(dev);
|
||||
@@ -4914,7 +4912,7 @@ static int rtl8169_runtime_resume(struct device *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __maybe_unused rtl8169_suspend(struct device *device)
|
||||
static int rtl8169_suspend(struct device *device)
|
||||
{
|
||||
struct rtl8169_private *tp = dev_get_drvdata(device);
|
||||
|
||||
@@ -4927,7 +4925,7 @@ static int __maybe_unused rtl8169_suspend(struct device *device)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __maybe_unused rtl8169_resume(struct device *device)
|
||||
static int rtl8169_resume(struct device *device)
|
||||
{
|
||||
struct rtl8169_private *tp = dev_get_drvdata(device);
|
||||
|
||||
@@ -4969,13 +4967,11 @@ static int rtl8169_runtime_idle(struct device *device)
|
||||
}
|
||||
|
||||
static const struct dev_pm_ops rtl8169_pm_ops = {
|
||||
SET_SYSTEM_SLEEP_PM_OPS(rtl8169_suspend, rtl8169_resume)
|
||||
SET_RUNTIME_PM_OPS(rtl8169_runtime_suspend, rtl8169_runtime_resume,
|
||||
rtl8169_runtime_idle)
|
||||
SYSTEM_SLEEP_PM_OPS(rtl8169_suspend, rtl8169_resume)
|
||||
RUNTIME_PM_OPS(rtl8169_runtime_suspend, rtl8169_runtime_resume,
|
||||
rtl8169_runtime_idle)
|
||||
};
|
||||
|
||||
#endif /* CONFIG_PM */
|
||||
|
||||
static void rtl_wol_shutdown_quirk(struct rtl8169_private *tp)
|
||||
{
|
||||
/* WoL fails with 8168b when the receiver is disabled. */
|
||||
|
||||
@@ -5737,11 +5737,6 @@ static irqreturn_t stmmac_mac_interrupt(int irq, void *dev_id)
|
||||
struct net_device *dev = (struct net_device *)dev_id;
|
||||
struct stmmac_priv *priv = netdev_priv(dev);
|
||||
|
||||
if (unlikely(!dev)) {
|
||||
netdev_err(priv->dev, "%s: invalid dev pointer\n", __func__);
|
||||
return IRQ_NONE;
|
||||
}
|
||||
|
||||
/* Check if adapter is up */
|
||||
if (test_bit(STMMAC_DOWN, &priv->state))
|
||||
return IRQ_HANDLED;
|
||||
@@ -5757,11 +5752,6 @@ static irqreturn_t stmmac_safety_interrupt(int irq, void *dev_id)
|
||||
struct net_device *dev = (struct net_device *)dev_id;
|
||||
struct stmmac_priv *priv = netdev_priv(dev);
|
||||
|
||||
if (unlikely(!dev)) {
|
||||
netdev_err(priv->dev, "%s: invalid dev pointer\n", __func__);
|
||||
return IRQ_NONE;
|
||||
}
|
||||
|
||||
/* Check if adapter is up */
|
||||
if (test_bit(STMMAC_DOWN, &priv->state))
|
||||
return IRQ_HANDLED;
|
||||
@@ -5781,11 +5771,6 @@ static irqreturn_t stmmac_msi_intr_tx(int irq, void *data)
|
||||
|
||||
priv = container_of(tx_q, struct stmmac_priv, tx_queue[chan]);
|
||||
|
||||
if (unlikely(!data)) {
|
||||
netdev_err(priv->dev, "%s: invalid dev pointer\n", __func__);
|
||||
return IRQ_NONE;
|
||||
}
|
||||
|
||||
/* Check if adapter is up */
|
||||
if (test_bit(STMMAC_DOWN, &priv->state))
|
||||
return IRQ_HANDLED;
|
||||
@@ -5824,11 +5809,6 @@ static irqreturn_t stmmac_msi_intr_rx(int irq, void *data)
|
||||
|
||||
priv = container_of(rx_q, struct stmmac_priv, rx_queue[chan]);
|
||||
|
||||
if (unlikely(!data)) {
|
||||
netdev_err(priv->dev, "%s: invalid dev pointer\n", __func__);
|
||||
return IRQ_NONE;
|
||||
}
|
||||
|
||||
/* Check if adapter is up */
|
||||
if (test_bit(STMMAC_DOWN, &priv->state))
|
||||
return IRQ_HANDLED;
|
||||
|
||||
@@ -1856,13 +1856,14 @@ static int am65_cpsw_nuss_init_slave_ports(struct am65_cpsw_common *common)
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "%pOF error reading port_id %d\n",
|
||||
port_np, ret);
|
||||
return ret;
|
||||
goto of_node_put;
|
||||
}
|
||||
|
||||
if (!port_id || port_id > common->port_num) {
|
||||
dev_err(dev, "%pOF has invalid port_id %u %s\n",
|
||||
port_np, port_id, port_np->name);
|
||||
return -EINVAL;
|
||||
ret = -EINVAL;
|
||||
goto of_node_put;
|
||||
}
|
||||
|
||||
port = am65_common_get_port(common, port_id);
|
||||
@@ -1878,8 +1879,10 @@ static int am65_cpsw_nuss_init_slave_ports(struct am65_cpsw_common *common)
|
||||
(AM65_CPSW_NU_FRAM_PORT_OFFSET * (port_id - 1));
|
||||
|
||||
port->slave.mac_sl = cpsw_sl_get("am65", dev, port->port_base);
|
||||
if (IS_ERR(port->slave.mac_sl))
|
||||
return PTR_ERR(port->slave.mac_sl);
|
||||
if (IS_ERR(port->slave.mac_sl)) {
|
||||
ret = PTR_ERR(port->slave.mac_sl);
|
||||
goto of_node_put;
|
||||
}
|
||||
|
||||
port->disabled = !of_device_is_available(port_np);
|
||||
if (port->disabled) {
|
||||
@@ -1892,7 +1895,7 @@ static int am65_cpsw_nuss_init_slave_ports(struct am65_cpsw_common *common)
|
||||
ret = PTR_ERR(port->slave.ifphy);
|
||||
dev_err(dev, "%pOF error retrieving port phy: %d\n",
|
||||
port_np, ret);
|
||||
return ret;
|
||||
goto of_node_put;
|
||||
}
|
||||
|
||||
port->slave.mac_only =
|
||||
@@ -1901,10 +1904,12 @@ static int am65_cpsw_nuss_init_slave_ports(struct am65_cpsw_common *common)
|
||||
/* get phy/link info */
|
||||
if (of_phy_is_fixed_link(port_np)) {
|
||||
ret = of_phy_register_fixed_link(port_np);
|
||||
if (ret)
|
||||
return dev_err_probe(dev, ret,
|
||||
if (ret) {
|
||||
ret = dev_err_probe(dev, ret,
|
||||
"failed to register fixed-link phy %pOF\n",
|
||||
port_np);
|
||||
goto of_node_put;
|
||||
}
|
||||
port->slave.phy_node = of_node_get(port_np);
|
||||
} else {
|
||||
port->slave.phy_node =
|
||||
@@ -1914,14 +1919,15 @@ static int am65_cpsw_nuss_init_slave_ports(struct am65_cpsw_common *common)
|
||||
if (!port->slave.phy_node) {
|
||||
dev_err(dev,
|
||||
"slave[%d] no phy found\n", port_id);
|
||||
return -ENODEV;
|
||||
ret = -ENODEV;
|
||||
goto of_node_put;
|
||||
}
|
||||
|
||||
ret = of_get_phy_mode(port_np, &port->slave.phy_if);
|
||||
if (ret) {
|
||||
dev_err(dev, "%pOF read phy-mode err %d\n",
|
||||
port_np, ret);
|
||||
return ret;
|
||||
goto of_node_put;
|
||||
}
|
||||
|
||||
ret = of_get_mac_address(port_np, port->slave.mac_addr);
|
||||
@@ -1944,6 +1950,11 @@ static int am65_cpsw_nuss_init_slave_ports(struct am65_cpsw_common *common)
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
of_node_put:
|
||||
of_node_put(port_np);
|
||||
of_node_put(node);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void am65_cpsw_pcpu_stats_free(void *data)
|
||||
|
||||
@@ -1426,20 +1426,20 @@ static int __init gtp_init(void)
|
||||
if (err < 0)
|
||||
goto error_out;
|
||||
|
||||
err = genl_register_family(>p_genl_family);
|
||||
err = register_pernet_subsys(>p_net_ops);
|
||||
if (err < 0)
|
||||
goto unreg_rtnl_link;
|
||||
|
||||
err = register_pernet_subsys(>p_net_ops);
|
||||
err = genl_register_family(>p_genl_family);
|
||||
if (err < 0)
|
||||
goto unreg_genl_family;
|
||||
goto unreg_pernet_subsys;
|
||||
|
||||
pr_info("GTP module loaded (pdp ctx size %zd bytes)\n",
|
||||
sizeof(struct pdp_ctx));
|
||||
return 0;
|
||||
|
||||
unreg_genl_family:
|
||||
genl_unregister_family(>p_genl_family);
|
||||
unreg_pernet_subsys:
|
||||
unregister_pernet_subsys(>p_net_ops);
|
||||
unreg_rtnl_link:
|
||||
rtnl_link_unregister(>p_link_ops);
|
||||
error_out:
|
||||
|
||||
@@ -6313,7 +6313,7 @@ static int ath11k_mac_setup_channels_rates(struct ath11k *ar,
|
||||
}
|
||||
|
||||
if (supported_bands & WMI_HOST_WLAN_5G_CAP) {
|
||||
if (reg_cap->high_5ghz_chan >= ATH11K_MAX_6G_FREQ) {
|
||||
if (reg_cap->high_5ghz_chan >= ATH11K_MIN_6G_FREQ) {
|
||||
channels = kmemdup(ath11k_6ghz_channels,
|
||||
sizeof(ath11k_6ghz_channels), GFP_KERNEL);
|
||||
if (!channels) {
|
||||
|
||||
@@ -2544,7 +2544,7 @@ int iwl_mvm_sta_rx_agg(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
|
||||
}
|
||||
|
||||
if (iwl_mvm_has_new_rx_api(mvm) && start) {
|
||||
u16 reorder_buf_size = buf_size * sizeof(baid_data->entries[0]);
|
||||
u32 reorder_buf_size = buf_size * sizeof(baid_data->entries[0]);
|
||||
|
||||
/* sparse doesn't like the __align() so don't check */
|
||||
#ifndef __CHECKER__
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user