Merge tag 'ASB-2024-07-05_4.19-stable' of https://android.googlesource.com/kernel/common into lineage-21
https://source.android.com/docs/security/bulletin/2024-07-01 CVE-2024-26923 * tag 'ASB-2024-07-05_4.19-stable' of https://android.googlesource.com/kernel/common: Linux 4.19.317 arm64: dts: rockchip: Add sound-dai-cells for RK3368 tcp: Fix data races around icsk->icsk_af_ops. ipv6: Fix data races around sk->sk_prot. ipv6: annotate some data-races around sk->sk_prot pwm: stm32: Refuse too small period requests ftruncate: pass a signed offset ata: libata-core: Fix double free on error batman-adv: Don't accept TT entries for out-of-spec VIDs drm/nouveau/dispnv04: fix null pointer dereference in nv17_tv_get_hd_modes drm/nouveau/dispnv04: fix null pointer dereference in nv17_tv_get_ld_modes hexagon: fix fadvise64_64 calling conventions tty: mcf: MCF54418 has 10 UARTS usb: atm: cxacru: fix endpoint checking in cxacru_bind() usb: musb: da8xx: fix a resource leak in probe() usb: gadget: printer: SS+ support net: usb: ax88179_178a: improve link status logs iio: chemical: bme680: Fix sensor data read operation iio: chemical: bme680: Fix overflows in compensate() functions iio: chemical: bme680: Fix calibration data variable iio: chemical: bme680: Fix pressure value output iio: adc: ad7266: Fix variable checking bug mmc: sdhci-pci: Convert PCIBIOS_* return codes to errnos x86: stop playing stack games in profile_pc() i2c: ocores: set IACK bit after core is enabled i2c: ocores: stop transfer on timeout gpio: davinci: Validate the obtained number of IRQs nvme: fixup comment for nvme RDMA Provider Type soc: ti: wkup_m3_ipc: Send NULL dummy message instead of pointer message media: dvbdev: Initialize sbuf ALSA: emux: improve patch ioctl data validation net/iucv: Avoid explicit cpumask var allocation on stack drm/panel: ilitek-ili9881c: Fix warning with GPIO controllers that sleep netfilter: nf_tables: fully validate NFT_DATA_VALUE on store to data registers ASoC: fsl-asoc-card: set priv->pdev before using it netfilter: nf_tables: validate family when identifying table via handle drm/amdgpu: fix UBSAN warning in kv_dpm.c pinctrl: rockchip: fix pinmux reset in rockchip_pmx_set pinctrl: rockchip: fix pinmux bits for RK3328 GPIO3-B pins pinctrl: rockchip: fix pinmux bits for RK3328 GPIO2-B pins pinctrl: fix deadlock in create_pinctrl() when handling -EPROBE_DEFER usb: xhci: do not perform Soft Retry for some xHCI hosts xhci: Set correct transferred length for cancelled bulk transfers xhci: Use soft retry to recover faster from transaction errors scsi: mpt3sas: Avoid test/set_bit() operating in non-allocated memory scsi: mpt3sas: Gracefully handle online firmware update scsi: mpt3sas: Add ioc_<level> logging macros iio: dac: ad5592r: fix temperature channel scaling value iio: dac: ad5592r: un-indent code-block for scale read iio: dac: ad5592r-base: Replace indio_dev->mlock with own device lock x86/amd_nb: Check for invalid SMN reads PCI: Add PCI_ERROR_RESPONSE and related definitions perf/core: Fix missing wakeup when waiting for context reference tracing: Add MODULE_DESCRIPTION() to preemptirq_delay_test selftests/ftrace: Fix checkbashisms errors ARM: dts: samsung: smdk4412: fix keypad no-autorepeat ARM: dts: samsung: exynos4412-origen: fix keypad no-autorepeat ARM: dts: samsung: smdkv310: fix keypad no-autorepeat gcov: add support for GCC 14 drm/radeon: fix UBSAN warning in kv_dpm.c ACPICA: Revert "ACPICA: avoid Info: mapping multiple BARs. Your kernel is fine." dmaengine: ioatdma: Fix missing kmem_cache_destroy() regulator: core: Fix modpost error "regulator_get_regmap" undefined net: usb: rtl8150 fix unintiatilzed variables in rtl8150_get_link_ksettings virtio_net: checksum offloading handling fix xfrm6: check ip6_dst_idev() return value in xfrm6_get_saddr() ipv6: prevent possible NULL dereference in rt6_probe() netrom: Fix a memory leak in nr_heartbeat_expiry() cipso: fix total option length computation MIPS: Routerboard 532: Fix vendor retry check code MIPS: Octeon: Add PCIe link status check PCI/PM: Avoid D3cold for HP Pavilion 17 PC/1972 PCIe Ports udf: udftime: prevent overflow in udf_disk_stamp_to_time() usb: misc: uss720: check for incompatible versions of the Belkin F5U002 powerpc/io: Avoid clang null pointer arithmetic warnings powerpc/pseries: Enforce hcall result buffer validity and size scsi: qedi: Fix crash while reading debugfs attribute batman-adv: bypass empty buckets in batadv_purge_orig_ref() rcutorture: Fix rcu_torture_one_read() pipe_count overflow comment usb-storage: alauda: Check whether the media is initialized hugetlb_encode.h: fix undefined behaviour (34 << 26) hv_utils: drain the timesync packets on onchannelcallback nilfs2: fix potential kernel bug due to lack of writeback flag waiting intel_th: pci: Add Lunar Lake support intel_th: pci: Add Meteor Lake-S support intel_th: pci: Add Sapphire Rapids SOC support intel_th: pci: Add Granite Rapids SOC support intel_th: pci: Add Granite Rapids support dmaengine: axi-dmac: fix possible race in remove() PCI: rockchip-ep: Remove wrong mask on subsys_vendor_id ocfs2: fix races between hole punching and AIO+DIO ocfs2: use coarse time for new created files fs/proc: fix softlockup in __read_vmcore vmci: prevent speculation leaks by sanitizing event in event_deliver() drm/exynos/vidi: fix memory leak in .get_modes() drivers: core: synchronize really_probe() and dev_uevent() net/ipv6: Fix the RT cache flush via sysctl using a previous delay ipv6/route: Add a missing check on proc_dointvec Bluetooth: L2CAP: Fix rejecting L2CAP_CONN_PARAM_UPDATE_REQ tcp: fix race in tcp_v6_syn_recv_sock() drm/bridge/panel: Fix runtime warning on panel bridge release liquidio: Adjust a NULL pointer handling path in lio_vf_rep_copy_packet iommu/amd: Fix sysfs leak in iommu init HID: core: remove unnecessary WARN_ON() in implement() xsk: validate user input for XDP_{UMEM|COMPLETION}_FILL_RING Input: try trimming too long modalias strings xhci: Apply broken streams quirk to Etron EJ188 xHCI host xhci: Apply reset resume quirk to Etron EJ188 xHCI host jfs: xattr: fix buffer overflow for invalid xattr mei: me: release irq in mei_me_pci_resume error path USB: class: cdc-wdm: Fix CPU lockup caused by excessive log messages nilfs2: fix nilfs_empty_dir() misjudgment and long loop on I/O errors nilfs2: return the mapped address from nilfs_get_page() nilfs2: Remove check for PageError selftests/mm: compaction_test: fix bogus test success on Aarch64 selftests/mm: conform test to TAP format output selftests/mm: compaction_test: fix incorrect write of zero to nr_hugepages media: mc: mark the media devnode as registered from the, start serial: sc16is7xx: fix bug in sc16is7xx_set_baud() when using prescaler serial: sc16is7xx: replace hardcoded divisor value with BIT() macro drm/amd/display: Handle Y carry-over in VCP X.Y calculation usb: gadget: f_fs: Fix race between aio_cancel() and AIO request complete af_unix: Annotate data-race of sk->sk_shutdown in sk_diag_fill(). af_unix: Use skb_queue_len_lockless() in sk_diag_show_rqlen(). af_unix: Use unix_recvq_full_lockless() in unix_stream_connect(). af_unix: Annotate data-race of net->unx.sysctl_max_dgram_qlen. af_unix: Annotate data-races around sk->sk_state in UNIX_DIAG. af_unix: Annotate data-races around sk->sk_state in sendmsg() and recvmsg(). af_unix: Annotate data-races around sk->sk_state in unix_write_space() and poll(). af_unix: Annotate data-race of sk->sk_state in unix_inq_len(). ptp: Fix error message on failed pin verification tcp: count CLOSE-WAIT sockets for TCP_MIB_CURRESTAB vxlan: Fix regression when dropping packets due to invalid src addresses ipv6: sr: block BH in seg6_output_core() and seg6_input_core() wifi: iwlwifi: mvm: don't read past the mfuart notifcation wifi: iwlwifi: mvm: revert gen2 TX A-MPDU size to 64 wifi: mac80211: Fix deadlock in ieee80211_sta_ps_deliver_wakeup() wifi: mac80211: mesh: Fix leak of mesh_preq_queue objects ANDROID: arm64: Place CFI jump table sections in .text Linux 4.19.316 nfs: fix undefined behavior in nfs_block_bits() s390/ap: Fix crash in AP internal function modify_bitmap() ext4: fix mb_cache_entry's e_refcnt leak in ext4_xattr_block_cache_find() sparc: move struct termio to asm/termios.h net: fix __dst_negative_advice() race kdb: Use format-specifiers rather than memset() for padding in kdb_read() kdb: Merge identical case statements in kdb_read() kdb: Fix console handling when editing and tab-completing commands kdb: Use format-strings rather than '\0' injection in kdb_read() kdb: Fix buffer overflow during tab-complete sparc64: Fix number of online CPUs intel_th: pci: Add Meteor Lake-S CPU support net/9p: fix uninit-value in p9_client_rpc() crypto: qat - Fix ADF_DEV_RESET_SYNC memory leak KVM: arm64: Allow AArch32 PSTATE.M to be restored as System mode netfilter: nf_tables: discard table flag update with pending basechain deletion netfilter: nf_tables: reject new basechain after table flag update netfilter: nf_tables: mark set as dead when unbinding anonymous set with timeout netfilter: nf_tables: do not compare internal table flags on updates netfilter: nf_tables: allow NFPROTO_INET in nft_(match/target)_validate() netfilter: nf_tables: set dormant flag on hook register failure netfilter: nft_set_rbtree: skip end interval element from gc netfilter: nf_tables: validate NFPROTO_* family netfilter: nf_tables: skip dead set elements in netlink dump netfilter: nf_tables: mark newset as dead on transaction abort netfilter: nft_dynset: relax superfluous check on set updates netfilter: nft_dynset: report EOPNOTSUPP on missing set feature netfilter: nftables: exthdr: fix 4-byte stack OOB write netfilter: nft_dynset: fix timeouts later than 23 days netfilter: nf_tables: bogus EBUSY when deleting flowtable after flush (for 4.19) netfilter: nf_tables: disable toggling dormant table state more than once netfilter: nf_tables: fix table flag updates netfilter: nftables: update table flags from the commit phase netfilter: nf_tables: double hook unregistration in netns path netfilter: nf_tables: unregister flowtable hooks on netns exit netfilter: nf_tables: fix memleak when more than 255 elements expired netfilter: nft_set_hash: try later when GC hits EAGAIN on iteration netfilter: nft_set_rbtree: use read spinlock to avoid datapath contention netfilter: nft_set_rbtree: skip sync GC for new elements in this transaction netfilter: nf_tables: defer gc run if previous batch is still pending netfilter: nf_tables: GC transaction race with abort path netfilter: nf_tables: GC transaction race with netns dismantle netfilter: nf_tables: fix GC transaction races with netns and netlink event exit path netfilter: nf_tables: remove busy mark and gc batch API netfilter: nf_tables: adapt set backend to use GC transaction API netfilter: nf_tables: GC transaction API to avoid race with control plane netfilter: nf_tables: don't skip expired elements during walk netfilter: nft_set_rbtree: fix overlap expiration walk netfilter: nft_set_rbtree: fix null deref on element insertion netfilter: nft_set_rbtree: Switch to node list walk for overlap detection netfilter: nft_set_rbtree: Add missing expired checks netfilter: nft_set_rbtree: allow loose matching of closing element in interval netfilter: nf_tables: drop map element references from preparation phase netfilter: nftables: rename set element data activation/deactivation functions netfilter: nf_tables: pass context to nft_set_destroy() fbdev: savage: Handle err return when savagefb_check_var failed media: v4l2-core: hold videodev_lock until dev reg, finishes media: mxl5xx: Move xpt structures off stack arm64: dts: hi3798cv200: fix the size of GICR wifi: rtl8xxxu: Fix the TX power of RTL8192CU, RTL8723AU md/raid5: fix deadlock that raid5d() wait for itself to clear MD_SB_CHANGE_PENDING arm64: tegra: Correct Tegra132 I2C alias ata: pata_legacy: make legacy_exit() work again neighbour: fix unaligned access to pneigh_entry vxlan: Fix regression when dropping packets due to invalid src addresses nilfs2: fix use-after-free of timer for log writer thread mmc: core: Do not force a retune before RPMB switch binder: fix max_thread type inconsistency SUNRPC: Fix loop termination condition in gss_free_in_token_pages() genirq/cpuhotplug, x86/vector: Prevent vector leak during CPU offline ALSA: timer: Set lower bound of start tick time ipvlan: Dont Use skb->sk in ipvlan_process_v{4,6}_outbound kconfig: fix comparison to constant symbols, 'm', 'n' net:fec: Add fec_enet_deinit() net: usb: smsc95xx: fix changing LED_SEL bit value updated from EEPROM smsc95xx: use usbnet->driver_priv smsc95xx: remove redundant function arguments enic: Validate length of nl attributes in enic_set_vf_port dma-buf/sw-sync: don't enable IRQ from sync_print_obj() net/mlx5e: Use rx_missed_errors instead of rx_dropped for reporting buffer exhaustion nvmet: fix ns enable/disable possible hang spi: Don't mark message DMA mapped when no transfer in it is netfilter: nfnetlink_queue: acquire rcu_read_lock() in instance_destroy_rcu() nfc: nci: Fix handling of zero-length payload packets in nci_rx_work() nfc: nci: Fix kcov check in nci_rx_work() net: fec: avoid lock evasion when reading pps_enable virtio: delete vq in vp_find_vqs_msix() when request_irq() fails arm64: asm-bug: Add .align 2 to the end of __BUG_ENTRY openvswitch: Set the skbuff pkt_type for proper pmtud support. tcp: Fix shift-out-of-bounds in dctcp_update_alpha(). params: lift param_set_uint_minmax to common code ipv6: sr: fix memleak in seg6_hmac_init_algo nfc: nci: Fix uninit-value in nci_rx_work x86/kconfig: Select ARCH_WANT_FRAME_POINTERS again when UNWINDER_FRAME_POINTER=y null_blk: Fix the WARNING: modpost: missing MODULE_DESCRIPTION() media: cec: cec-api: add locking in cec_release() media: cec: cec-adap: always cancel work in cec_transmit_msg_fh um: Fix the -Wmissing-prototypes warning for __switch_mm powerpc/pseries: Add failure related checks for h_get_mpp and h_get_ppp media: stk1160: fix bounds checking in stk1160_copy_video() um: Add winch to winch_handlers before registering winch IRQ um: Fix return value in ubd_init() drm/msm/dpu: use kms stored hw mdp block Input: pm8xxx-vibrator - correct VIB_MAX_LEVELS calculation Input: ims-pcu - fix printf string overflow libsubcmd: Fix parse-options memory leak serial: sh-sci: protect invalidating RXDMA on shutdown serial: sh-sci: Extract sci_dma_rx_chan_invalidate() f2fs: fix to release node block count in error path of f2fs_new_node_page() f2fs: add error prints for debugging mount failure extcon: max8997: select IRQ_DOMAIN instead of depending on it ppdev: Add an error check in register_device ppdev: Remove usage of the deprecated ida_simple_xx() API stm class: Fix a double free in stm_register_device() usb: gadget: u_audio: Clear uac pointer when freed. microblaze: Remove early printk call from cpuinfo-static.c microblaze: Remove gcc flag for non existing early_printk.c file greybus: arche-ctrl: move device table to its right location serial: max3100: Fix bitwise types serial: max3100: Update uart_driver_registered on driver removal serial: max3100: Lock port->lock when calling uart_handle_cts_change() firmware: dmi-id: add a release callback function dmaengine: idma64: Add check for dma_set_max_seg_size greybus: lights: check return of get_channel_from_mode sched/fair: Allow disabling sched_balance_newidle with sched_relax_domain_level sched/topology: Don't set SD_BALANCE_WAKE on cpuset domain relax af_packet: do not call packet_read_pending() from tpacket_destruct_skb() netrom: fix possible dead-lock in nr_rt_ioctl() RDMA/IPoIB: Fix format truncation compilation errors selftests/kcmp: remove unused open mode selftests/kcmp: Make the test output consistent and clear SUNRPC: Fix gss_free_in_token_pages() ext4: avoid excessive credit estimate in ext4_tmpfile() x86/insn: Fix PUSH instruction in x86 instruction decoder opcode map RDMA/hns: Use complete parentheses in macros ASoC: tracing: Export SND_SOC_DAPM_DIR_OUT to its value drm/arm/malidp: fix a possible null pointer dereference fbdev: sh7760fb: allow modular build media: radio-shark2: Avoid led_names truncations media: ngene: Add dvb_ca_en50221_init return value check fbdev: sisfb: hide unused variables powerpc/fsl-soc: hide unused const variable drm/mediatek: Add 0 size check to mtk_drm_gem_obj fbdev: shmobile: fix snprintf truncation mtd: rawnand: hynix: fixed typo drm/amd/display: Fix potential index out of bounds in color transformation function ipv6: sr: fix invalid unregister error path ipv6: sr: fix incorrect unregister order ipv6: sr: add missing seg6_local_exit net: openvswitch: fix overwriting ct original tuple for ICMPv6 net: usb: smsc95xx: stop lying about skb->truesize af_unix: Fix data races in unix_release_sock/unix_stream_sendmsg net: ethernet: cortina: Locking fixes m68k: mac: Fix reboot hang on Mac IIci m68k/mac: Use '030 reset method on SE/30 m68k: Fix spinlock race in kernel thread creation net: usb: sr9700: stop lying about skb->truesize wifi: mwl8k: initialize cmd->addr[] properly scsi: qedf: Ensure the copied buf is NUL terminated scsi: bfa: Ensure the copied buf is NUL terminated Revert "sh: Handle calling csum_partial with misaligned data" sh: kprobes: Merge arch_copy_kprobe() into arch_prepare_kprobe() wifi: ar5523: enable proper endpoint verification wifi: carl9170: add a proper sanity check for endpoints macintosh/via-macii: Fix "BUG: sleeping function called from invalid context" macintosh/via-macii, macintosh/adb-iop: Clean up whitespace macintosh/via-macii: Remove BUG_ON assertions wifi: ath10k: populate board data for WCN3990 wifi: ath10k: Fix an error code problem in ath10k_dbg_sta_write_peer_debug_trigger() x86/purgatory: Switch to the position-independent small code model scsi: hpsa: Fix allocation size for Scsi_Host private data scsi: libsas: Fix the failure of adding phy with zero-address to port ACPI: disable -Wstringop-truncation irqchip/alpine-msi: Fix off-by-one in allocation error path scsi: ufs: core: Perform read back after disabling UIC_COMMAND_COMPL scsi: ufs: core: Perform read back after disabling interrupts scsi: ufs: add a low-level __ufshcd_issue_tm_cmd helper scsi: ufs: cleanup struct utp_task_req_desc scsi: ufs: qcom: Perform read back after writing reset bit qed: avoid truncating work queue length x86/boot: Ignore relocations in .notes sections in walk_relocs() too wifi: ath10k: poll service ready message before failing nfsd: drop st_mutex before calling move_to_close_lru() power: supply: cros_usbpd: provide ID table for avoiding fallback match md: fix resync softlockup when bitmap size is less than array size null_blk: Fix missing mutex_destroy() at module removal jffs2: prevent xattr node from overflowing the eraseblock s390/cio: fix tracepoint subchannel type field crypto: ccp - drop platform ifdef checks crypto: ccp - Remove forward declaration parisc: add missing export of __cmpxchg_u8() nilfs2: fix out-of-range warning ecryptfs: Fix buffer size for tag 66 packet firmware: raspberrypi: Use correct device for DMA mappings crypto: bcm - Fix pointer arithmetic ASoC: da7219-aad: fix usage of device_get_named_child_node() ASoC: dt-bindings: rt5645: add cbj sleeve gpio property ASoC: rt5645: Fix the electric noise due to the CBJ contacts floating drm/amd/display: Set color_mgmt_changed to true on unsuspend net: usb: qmi_wwan: add Telit FN920C04 compositions wifi: cfg80211: fix the order of arguments for trace events of the tx_rx_evt class tty: n_gsm: fix possible out-of-bounds in gsm0_receive() nilfs2: fix potential hang in nilfs_detach_log_writer() nilfs2: fix unexpected freezing of nilfs_segctor_sync() net: smc91x: Fix m68k kernel compilation for ColdFire CPU ring-buffer: Fix a race between readers and resize checks speakup: Fix sizeof() vs ARRAY_SIZE() bug x86/tsc: Trust initial offset in architectural TSC-adjust MSRs Change-Id: Ia8a0522057b7e917a9c165a869bec3a24bb9eb58 Signed-off-by: bengris32 <bengris32@protonmail.ch>
This commit is contained in:
@@ -16,6 +16,11 @@ Optional properties:
|
||||
a GPIO spec for the external headphone detect pin. If jd-mode = 0,
|
||||
we will get the JD status by getting the value of hp-detect-gpios.
|
||||
|
||||
- cbj-sleeve-gpios:
|
||||
a GPIO spec to control the external combo jack circuit to tie the sleeve/ring2
|
||||
contacts to the ground or floating. It could avoid some electric noise from the
|
||||
active speaker jacks.
|
||||
|
||||
- realtek,in2-differential
|
||||
Boolean. Indicate MIC2 input are differential, rather than single-ended.
|
||||
|
||||
@@ -64,6 +69,7 @@ codec: rt5650@1a {
|
||||
compatible = "realtek,rt5650";
|
||||
reg = <0x1a>;
|
||||
hp-detect-gpios = <&gpio 19 0>;
|
||||
cbj-sleeve-gpios = <&gpio 20 0>;
|
||||
interrupt-parent = <&gpio>;
|
||||
interrupts = <7 IRQ_TYPE_EDGE_FALLING>;
|
||||
realtek,dmic-en = "true";
|
||||
|
||||
2
Makefile
2
Makefile
@@ -1,7 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 4
|
||||
PATCHLEVEL = 19
|
||||
SUBLEVEL = 315
|
||||
SUBLEVEL = 317
|
||||
EXTRAVERSION =
|
||||
NAME = "People's Front"
|
||||
|
||||
|
||||
@@ -64,7 +64,7 @@
|
||||
&keypad {
|
||||
samsung,keypad-num-rows = <2>;
|
||||
samsung,keypad-num-columns = <8>;
|
||||
linux,keypad-no-autorepeat;
|
||||
linux,input-no-autorepeat;
|
||||
wakeup-source;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&keypad_rows &keypad_cols>;
|
||||
|
||||
@@ -437,7 +437,7 @@
|
||||
&keypad {
|
||||
samsung,keypad-num-rows = <3>;
|
||||
samsung,keypad-num-columns = <2>;
|
||||
linux,keypad-no-autorepeat;
|
||||
linux,input-no-autorepeat;
|
||||
wakeup-source;
|
||||
pinctrl-0 = <&keypad_rows &keypad_cols>;
|
||||
pinctrl-names = "default";
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
&keypad {
|
||||
samsung,keypad-num-rows = <3>;
|
||||
samsung,keypad-num-columns = <8>;
|
||||
linux,keypad-no-autorepeat;
|
||||
linux,input-no-autorepeat;
|
||||
wakeup-source;
|
||||
pinctrl-0 = <&keypad_rows &keypad_cols>;
|
||||
pinctrl-names = "default";
|
||||
|
||||
@@ -60,7 +60,7 @@
|
||||
gic: interrupt-controller@f1001000 {
|
||||
compatible = "arm,gic-400";
|
||||
reg = <0x0 0xf1001000 0x0 0x1000>, /* GICD */
|
||||
<0x0 0xf1002000 0x0 0x100>; /* GICC */
|
||||
<0x0 0xf1002000 0x0 0x2000>; /* GICC */
|
||||
#address-cells = <0>;
|
||||
#interrupt-cells = <3>;
|
||||
interrupt-controller;
|
||||
|
||||
@@ -9,8 +9,8 @@
|
||||
compatible = "nvidia,norrin", "nvidia,tegra132", "nvidia,tegra124";
|
||||
|
||||
aliases {
|
||||
rtc0 = "/i2c@7000d000/as3722@40";
|
||||
rtc1 = "/rtc@7000e000";
|
||||
rtc0 = &as3722;
|
||||
rtc1 = &tegra_rtc;
|
||||
serial0 = &uarta;
|
||||
};
|
||||
|
||||
|
||||
@@ -569,7 +569,7 @@
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
rtc@7000e000 {
|
||||
tegra_rtc: rtc@7000e000 {
|
||||
compatible = "nvidia,tegra124-rtc", "nvidia,tegra20-rtc";
|
||||
reg = <0x0 0x7000e000 0x0 0x100>;
|
||||
interrupts = <GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>;
|
||||
|
||||
@@ -677,6 +677,7 @@
|
||||
dma-names = "tx";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spdif_tx>;
|
||||
#sound-dai-cells = <0>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
@@ -688,6 +689,7 @@
|
||||
clocks = <&cru SCLK_I2S_2CH>, <&cru HCLK_I2S_2CH>;
|
||||
dmas = <&dmac_bus 6>, <&dmac_bus 7>;
|
||||
dma-names = "tx", "rx";
|
||||
#sound-dai-cells = <0>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
@@ -701,6 +703,7 @@
|
||||
dma-names = "tx", "rx";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&i2s_8ch_bus>;
|
||||
#sound-dai-cells = <0>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
||||
@@ -39,6 +39,7 @@
|
||||
14470: .long 14471f - 14470b; \
|
||||
_BUGVERBOSE_LOCATION(__FILE__, __LINE__) \
|
||||
.short flags; \
|
||||
.align 2; \
|
||||
.popsection; \
|
||||
14471:
|
||||
#else
|
||||
|
||||
@@ -134,6 +134,7 @@ SECTIONS
|
||||
IDMAP_TEXT
|
||||
HIBERNATE_TEXT
|
||||
TRAMP_TEXT
|
||||
*(.text..L.cfi.jumptable .text..L.cfi.jumptable.*)
|
||||
*(.fixup)
|
||||
*(.gnu.warning)
|
||||
. = ALIGN(16);
|
||||
|
||||
@@ -175,6 +175,7 @@ static int set_core_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg)
|
||||
case PSR_AA32_MODE_SVC:
|
||||
case PSR_AA32_MODE_ABT:
|
||||
case PSR_AA32_MODE_UND:
|
||||
case PSR_AA32_MODE_SYS:
|
||||
if (!vcpu_el1_is_32bit(vcpu))
|
||||
return -EINVAL;
|
||||
break;
|
||||
|
||||
6
arch/hexagon/include/asm/syscalls.h
Normal file
6
arch/hexagon/include/asm/syscalls.h
Normal file
@@ -0,0 +1,6 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
|
||||
#include <asm-generic/syscalls.h>
|
||||
|
||||
asmlinkage long sys_hexagon_fadvise64_64(int fd, int advice,
|
||||
u32 a2, u32 a3, u32 a4, u32 a5);
|
||||
@@ -27,6 +27,13 @@
|
||||
#undef __SYSCALL
|
||||
#define __SYSCALL(nr, call) [nr] = (call),
|
||||
|
||||
SYSCALL_DEFINE6(hexagon_fadvise64_64, int, fd, int, advice,
|
||||
SC_ARG64(offset), SC_ARG64(len))
|
||||
{
|
||||
return ksys_fadvise64_64(fd, SC_VAL64(loff_t, offset), SC_VAL64(loff_t, len), advice);
|
||||
}
|
||||
#define sys_fadvise64_64 sys_hexagon_fadvise64_64
|
||||
|
||||
void *sys_call_table[__NR_syscalls] = {
|
||||
#include <asm/unistd.h>
|
||||
};
|
||||
|
||||
@@ -425,7 +425,9 @@ resume:
|
||||
movec %a0,%dfc
|
||||
|
||||
/* restore status register */
|
||||
movew %a1@(TASK_THREAD+THREAD_SR),%sr
|
||||
movew %a1@(TASK_THREAD+THREAD_SR),%d0
|
||||
oriw #0x0700,%d0
|
||||
movew %d0,%sr
|
||||
|
||||
rts
|
||||
|
||||
|
||||
@@ -462,40 +462,18 @@ void mac_poweroff(void)
|
||||
|
||||
void mac_reset(void)
|
||||
{
|
||||
if (macintosh_config->adb_type == MAC_ADB_II) {
|
||||
unsigned long flags;
|
||||
|
||||
/* need ROMBASE in booter */
|
||||
/* indeed, plus need to MAP THE ROM !! */
|
||||
|
||||
if (mac_bi_data.rombase == 0)
|
||||
mac_bi_data.rombase = 0x40800000;
|
||||
|
||||
/* works on some */
|
||||
rom_reset = (void *) (mac_bi_data.rombase + 0xa);
|
||||
|
||||
if (macintosh_config->ident == MAC_MODEL_SE30) {
|
||||
/*
|
||||
* MSch: Machines known to crash on ROM reset ...
|
||||
*/
|
||||
} else {
|
||||
local_irq_save(flags);
|
||||
|
||||
rom_reset();
|
||||
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
#ifdef CONFIG_ADB_CUDA
|
||||
} else if (macintosh_config->adb_type == MAC_ADB_EGRET ||
|
||||
macintosh_config->adb_type == MAC_ADB_CUDA) {
|
||||
if (macintosh_config->adb_type == MAC_ADB_EGRET ||
|
||||
macintosh_config->adb_type == MAC_ADB_CUDA) {
|
||||
cuda_restart();
|
||||
} else
|
||||
#endif
|
||||
#ifdef CONFIG_ADB_PMU
|
||||
} else if (macintosh_config->adb_type == MAC_ADB_PB2) {
|
||||
if (macintosh_config->adb_type == MAC_ADB_PB2) {
|
||||
pmu_restart();
|
||||
} else
|
||||
#endif
|
||||
} else if (CPU_IS_030) {
|
||||
|
||||
if (CPU_IS_030) {
|
||||
/* 030-specific reset routine. The idea is general, but the
|
||||
* specific registers to reset are '030-specific. Until I
|
||||
* have a non-030 machine, I can't test anything else.
|
||||
@@ -543,6 +521,18 @@ void mac_reset(void)
|
||||
"jmp %/a0@\n\t" /* jump to the reset vector */
|
||||
".chip 68k"
|
||||
: : "r" (offset), "a" (rombase) : "a0");
|
||||
} else {
|
||||
/* need ROMBASE in booter */
|
||||
/* indeed, plus need to MAP THE ROM !! */
|
||||
|
||||
if (mac_bi_data.rombase == 0)
|
||||
mac_bi_data.rombase = 0x40800000;
|
||||
|
||||
/* works on some */
|
||||
rom_reset = (void *)(mac_bi_data.rombase + 0xa);
|
||||
|
||||
local_irq_disable();
|
||||
rom_reset();
|
||||
}
|
||||
|
||||
/* should never get here */
|
||||
|
||||
@@ -7,7 +7,6 @@ ifdef CONFIG_FUNCTION_TRACER
|
||||
# Do not trace early boot code and low level code
|
||||
CFLAGS_REMOVE_timer.o = -pg
|
||||
CFLAGS_REMOVE_intc.o = -pg
|
||||
CFLAGS_REMOVE_early_printk.o = -pg
|
||||
CFLAGS_REMOVE_ftrace.o = -pg
|
||||
CFLAGS_REMOVE_process.o = -pg
|
||||
endif
|
||||
|
||||
@@ -18,7 +18,7 @@ static const char family_string[] = CONFIG_XILINX_MICROBLAZE0_FAMILY;
|
||||
static const char cpu_ver_string[] = CONFIG_XILINX_MICROBLAZE0_HW_VER;
|
||||
|
||||
#define err_printk(x) \
|
||||
early_printk("ERROR: Microblaze " x "-different for kernel and DTS\n");
|
||||
pr_err("ERROR: Microblaze " x "-different for kernel and DTS\n");
|
||||
|
||||
void __init set_cpuinfo_static(struct cpuinfo *ci, struct device_node *cpu)
|
||||
{
|
||||
|
||||
@@ -112,8 +112,8 @@ retry:
|
||||
* gives them time to settle
|
||||
*/
|
||||
if (where == PCI_VENDOR_ID) {
|
||||
if (ret == 0xffffffff || ret == 0x00000000 ||
|
||||
ret == 0x0000ffff || ret == 0xffff0000) {
|
||||
if (*val == 0xffffffff || *val == 0x00000000 ||
|
||||
*val == 0x0000ffff || *val == 0xffff0000) {
|
||||
if (delay > 4)
|
||||
return 0;
|
||||
delay *= 2;
|
||||
|
||||
6
arch/mips/pci/pcie-octeon.c
Normal file → Executable file
6
arch/mips/pci/pcie-octeon.c
Normal file → Executable file
@@ -230,12 +230,18 @@ static inline uint64_t __cvmx_pcie_build_config_addr(int pcie_port, int bus,
|
||||
{
|
||||
union cvmx_pcie_address pcie_addr;
|
||||
union cvmx_pciercx_cfg006 pciercx_cfg006;
|
||||
union cvmx_pciercx_cfg032 pciercx_cfg032;
|
||||
|
||||
pciercx_cfg006.u32 =
|
||||
cvmx_pcie_cfgx_read(pcie_port, CVMX_PCIERCX_CFG006(pcie_port));
|
||||
if ((bus <= pciercx_cfg006.s.pbnum) && (dev != 0))
|
||||
return 0;
|
||||
|
||||
pciercx_cfg032.u32 =
|
||||
cvmx_pcie_cfgx_read(pcie_port, CVMX_PCIERCX_CFG032(pcie_port));
|
||||
if ((pciercx_cfg032.s.dlla == 0) || (pciercx_cfg032.s.lt == 1))
|
||||
return 0;
|
||||
|
||||
pcie_addr.u64 = 0;
|
||||
pcie_addr.config.upper = 2;
|
||||
pcie_addr.config.io = 1;
|
||||
|
||||
@@ -34,6 +34,7 @@ EXPORT_SYMBOL(memset);
|
||||
#include <linux/atomic.h>
|
||||
EXPORT_SYMBOL(__xchg8);
|
||||
EXPORT_SYMBOL(__xchg32);
|
||||
EXPORT_SYMBOL(__cmpxchg_u8);
|
||||
EXPORT_SYMBOL(__cmpxchg_u32);
|
||||
EXPORT_SYMBOL(__cmpxchg_u64);
|
||||
#ifdef CONFIG_SMP
|
||||
|
||||
@@ -383,7 +383,7 @@ long plpar_hcall_norets(unsigned long opcode, ...);
|
||||
* Used for all but the craziest of phyp interfaces (see plpar_hcall9)
|
||||
*/
|
||||
#define PLPAR_HCALL_BUFSIZE 4
|
||||
long plpar_hcall(unsigned long opcode, unsigned long *retbuf, ...);
|
||||
long plpar_hcall(unsigned long opcode, unsigned long retbuf[static PLPAR_HCALL_BUFSIZE], ...);
|
||||
|
||||
/**
|
||||
* plpar_hcall_raw: - Make a hypervisor call without calculating hcall stats
|
||||
@@ -397,7 +397,7 @@ long plpar_hcall(unsigned long opcode, unsigned long *retbuf, ...);
|
||||
* plpar_hcall, but plpar_hcall_raw works in real mode and does not
|
||||
* calculate hypervisor call statistics.
|
||||
*/
|
||||
long plpar_hcall_raw(unsigned long opcode, unsigned long *retbuf, ...);
|
||||
long plpar_hcall_raw(unsigned long opcode, unsigned long retbuf[static PLPAR_HCALL_BUFSIZE], ...);
|
||||
|
||||
/**
|
||||
* plpar_hcall9: - Make a pseries hypervisor call with up to 9 return arguments
|
||||
@@ -408,8 +408,8 @@ long plpar_hcall_raw(unsigned long opcode, unsigned long *retbuf, ...);
|
||||
* PLPAR_HCALL9_BUFSIZE to size the return argument buffer.
|
||||
*/
|
||||
#define PLPAR_HCALL9_BUFSIZE 9
|
||||
long plpar_hcall9(unsigned long opcode, unsigned long *retbuf, ...);
|
||||
long plpar_hcall9_raw(unsigned long opcode, unsigned long *retbuf, ...);
|
||||
long plpar_hcall9(unsigned long opcode, unsigned long retbuf[static PLPAR_HCALL9_BUFSIZE], ...);
|
||||
long plpar_hcall9_raw(unsigned long opcode, unsigned long retbuf[static PLPAR_HCALL9_BUFSIZE], ...);
|
||||
|
||||
struct hvcall_mpp_data {
|
||||
unsigned long entitled_mem;
|
||||
@@ -424,7 +424,7 @@ struct hvcall_mpp_data {
|
||||
unsigned long backing_mem;
|
||||
};
|
||||
|
||||
int h_get_mpp(struct hvcall_mpp_data *);
|
||||
long h_get_mpp(struct hvcall_mpp_data *mpp_data);
|
||||
|
||||
struct hvcall_mpp_x_data {
|
||||
unsigned long coalesced_bytes;
|
||||
|
||||
@@ -569,12 +569,12 @@ __do_out_asm(_rec_outl, "stwbrx")
|
||||
#define __do_inw(port) _rec_inw(port)
|
||||
#define __do_inl(port) _rec_inl(port)
|
||||
#else /* CONFIG_PPC32 */
|
||||
#define __do_outb(val, port) writeb(val,(PCI_IO_ADDR)_IO_BASE+port);
|
||||
#define __do_outw(val, port) writew(val,(PCI_IO_ADDR)_IO_BASE+port);
|
||||
#define __do_outl(val, port) writel(val,(PCI_IO_ADDR)_IO_BASE+port);
|
||||
#define __do_inb(port) readb((PCI_IO_ADDR)_IO_BASE + port);
|
||||
#define __do_inw(port) readw((PCI_IO_ADDR)_IO_BASE + port);
|
||||
#define __do_inl(port) readl((PCI_IO_ADDR)_IO_BASE + port);
|
||||
#define __do_outb(val, port) writeb(val,(PCI_IO_ADDR)(_IO_BASE+port));
|
||||
#define __do_outw(val, port) writew(val,(PCI_IO_ADDR)(_IO_BASE+port));
|
||||
#define __do_outl(val, port) writel(val,(PCI_IO_ADDR)(_IO_BASE+port));
|
||||
#define __do_inb(port) readb((PCI_IO_ADDR)(_IO_BASE + port));
|
||||
#define __do_inw(port) readw((PCI_IO_ADDR)(_IO_BASE + port));
|
||||
#define __do_inl(port) readl((PCI_IO_ADDR)(_IO_BASE + port));
|
||||
#endif /* !CONFIG_PPC32 */
|
||||
|
||||
#ifdef CONFIG_EEH
|
||||
@@ -590,12 +590,12 @@ __do_out_asm(_rec_outl, "stwbrx")
|
||||
#define __do_writesw(a, b, n) _outsw(PCI_FIX_ADDR(a),(b),(n))
|
||||
#define __do_writesl(a, b, n) _outsl(PCI_FIX_ADDR(a),(b),(n))
|
||||
|
||||
#define __do_insb(p, b, n) readsb((PCI_IO_ADDR)_IO_BASE+(p), (b), (n))
|
||||
#define __do_insw(p, b, n) readsw((PCI_IO_ADDR)_IO_BASE+(p), (b), (n))
|
||||
#define __do_insl(p, b, n) readsl((PCI_IO_ADDR)_IO_BASE+(p), (b), (n))
|
||||
#define __do_outsb(p, b, n) writesb((PCI_IO_ADDR)_IO_BASE+(p),(b),(n))
|
||||
#define __do_outsw(p, b, n) writesw((PCI_IO_ADDR)_IO_BASE+(p),(b),(n))
|
||||
#define __do_outsl(p, b, n) writesl((PCI_IO_ADDR)_IO_BASE+(p),(b),(n))
|
||||
#define __do_insb(p, b, n) readsb((PCI_IO_ADDR)(_IO_BASE+(p)), (b), (n))
|
||||
#define __do_insw(p, b, n) readsw((PCI_IO_ADDR)(_IO_BASE+(p)), (b), (n))
|
||||
#define __do_insl(p, b, n) readsl((PCI_IO_ADDR)(_IO_BASE+(p)), (b), (n))
|
||||
#define __do_outsb(p, b, n) writesb((PCI_IO_ADDR)(_IO_BASE+(p)),(b),(n))
|
||||
#define __do_outsw(p, b, n) writesw((PCI_IO_ADDR)(_IO_BASE+(p)),(b),(n))
|
||||
#define __do_outsl(p, b, n) writesl((PCI_IO_ADDR)(_IO_BASE+(p)),(b),(n))
|
||||
|
||||
#define __do_memset_io(addr, c, n) \
|
||||
_memset_io(PCI_FIX_ADDR(addr), c, n)
|
||||
|
||||
@@ -933,10 +933,10 @@ out:
|
||||
* h_get_mpp
|
||||
* H_GET_MPP hcall returns info in 7 parms
|
||||
*/
|
||||
int h_get_mpp(struct hvcall_mpp_data *mpp_data)
|
||||
long h_get_mpp(struct hvcall_mpp_data *mpp_data)
|
||||
{
|
||||
int rc;
|
||||
unsigned long retbuf[PLPAR_HCALL9_BUFSIZE];
|
||||
unsigned long retbuf[PLPAR_HCALL9_BUFSIZE] = {0};
|
||||
long rc;
|
||||
|
||||
rc = plpar_hcall9(H_GET_MPP, retbuf);
|
||||
|
||||
|
||||
@@ -114,8 +114,8 @@ struct hvcall_ppp_data {
|
||||
*/
|
||||
static unsigned int h_get_ppp(struct hvcall_ppp_data *ppp_data)
|
||||
{
|
||||
unsigned long rc;
|
||||
unsigned long retbuf[PLPAR_HCALL9_BUFSIZE];
|
||||
unsigned long retbuf[PLPAR_HCALL9_BUFSIZE] = {0};
|
||||
long rc;
|
||||
|
||||
rc = plpar_hcall9(H_GET_PPP, retbuf);
|
||||
|
||||
@@ -161,7 +161,7 @@ static void parse_ppp_data(struct seq_file *m)
|
||||
struct hvcall_ppp_data ppp_data;
|
||||
struct device_node *root;
|
||||
const __be32 *perf_level;
|
||||
int rc;
|
||||
long rc;
|
||||
|
||||
rc = h_get_ppp(&ppp_data);
|
||||
if (rc)
|
||||
|
||||
@@ -578,10 +578,12 @@ static const struct fsl_msi_feature ipic_msi_feature = {
|
||||
.msiir_offset = 0x38,
|
||||
};
|
||||
|
||||
#ifdef CONFIG_EPAPR_PARAVIRT
|
||||
static const struct fsl_msi_feature vmpic_msi_feature = {
|
||||
.fsl_pic_ip = FSL_PIC_IP_VMPIC,
|
||||
.msiir_offset = 0,
|
||||
};
|
||||
#endif
|
||||
|
||||
static const struct of_device_id fsl_of_msi_ids[] = {
|
||||
{
|
||||
|
||||
@@ -47,17 +47,12 @@ int __kprobes arch_prepare_kprobe(struct kprobe *p)
|
||||
if (OPCODE_RTE(opcode))
|
||||
return -EFAULT; /* Bad breakpoint */
|
||||
|
||||
memcpy(p->ainsn.insn, p->addr, MAX_INSN_SIZE * sizeof(kprobe_opcode_t));
|
||||
p->opcode = opcode;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void __kprobes arch_copy_kprobe(struct kprobe *p)
|
||||
{
|
||||
memcpy(p->ainsn.insn, p->addr, MAX_INSN_SIZE * sizeof(kprobe_opcode_t));
|
||||
p->opcode = *p->addr;
|
||||
}
|
||||
|
||||
void __kprobes arch_arm_kprobe(struct kprobe *p)
|
||||
{
|
||||
*p->addr = BREAKPOINT_INSTRUCTION;
|
||||
|
||||
@@ -36,7 +36,8 @@
|
||||
*/
|
||||
|
||||
/*
|
||||
* asmlinkage __wsum csum_partial(const void *buf, int len, __wsum sum);
|
||||
* unsigned int csum_partial(const unsigned char *buf, int len,
|
||||
* unsigned int sum);
|
||||
*/
|
||||
|
||||
.text
|
||||
@@ -48,31 +49,11 @@ ENTRY(csum_partial)
|
||||
* Fortunately, it is easy to convert 2-byte alignment to 4-byte
|
||||
* alignment for the unrolled loop.
|
||||
*/
|
||||
mov r5, r1
|
||||
mov r4, r0
|
||||
tst #3, r0 ! Check alignment.
|
||||
bt/s 2f ! Jump if alignment is ok.
|
||||
mov r4, r7 ! Keep a copy to check for alignment
|
||||
tst #2, r0 ! Check alignment.
|
||||
bt 2f ! Jump if alignment is ok.
|
||||
!
|
||||
tst #1, r0 ! Check alignment.
|
||||
bt 21f ! Jump if alignment is boundary of 2bytes.
|
||||
|
||||
! buf is odd
|
||||
tst r5, r5
|
||||
add #-1, r5
|
||||
bt 9f
|
||||
mov.b @r4+, r0
|
||||
extu.b r0, r0
|
||||
addc r0, r6 ! t=0 from previous tst
|
||||
mov r6, r0
|
||||
shll8 r6
|
||||
shlr16 r0
|
||||
shlr8 r0
|
||||
or r0, r6
|
||||
mov r4, r0
|
||||
tst #2, r0
|
||||
bt 2f
|
||||
21:
|
||||
! buf is 2 byte aligned (len could be 0)
|
||||
add #-2, r5 ! Alignment uses up two bytes.
|
||||
cmp/pz r5 !
|
||||
bt/s 1f ! Jump if we had at least two bytes.
|
||||
@@ -80,17 +61,16 @@ ENTRY(csum_partial)
|
||||
bra 6f
|
||||
add #2, r5 ! r5 was < 2. Deal with it.
|
||||
1:
|
||||
mov r5, r1 ! Save new len for later use.
|
||||
mov.w @r4+, r0
|
||||
extu.w r0, r0
|
||||
addc r0, r6
|
||||
bf 2f
|
||||
add #1, r6
|
||||
2:
|
||||
! buf is 4 byte aligned (len could be 0)
|
||||
mov r5, r1
|
||||
mov #-5, r0
|
||||
shld r0, r1
|
||||
tst r1, r1
|
||||
shld r0, r5
|
||||
tst r5, r5
|
||||
bt/s 4f ! if it's =0, go to 4f
|
||||
clrt
|
||||
.align 2
|
||||
@@ -112,31 +92,30 @@ ENTRY(csum_partial)
|
||||
addc r0, r6
|
||||
addc r2, r6
|
||||
movt r0
|
||||
dt r1
|
||||
dt r5
|
||||
bf/s 3b
|
||||
cmp/eq #1, r0
|
||||
! here, we know r1==0
|
||||
addc r1, r6 ! add carry to r6
|
||||
! here, we know r5==0
|
||||
addc r5, r6 ! add carry to r6
|
||||
4:
|
||||
mov r5, r0
|
||||
mov r1, r0
|
||||
and #0x1c, r0
|
||||
tst r0, r0
|
||||
bt 6f
|
||||
! 4 bytes or more remaining
|
||||
mov r0, r1
|
||||
shlr2 r1
|
||||
bt/s 6f
|
||||
mov r0, r5
|
||||
shlr2 r5
|
||||
mov #0, r2
|
||||
5:
|
||||
addc r2, r6
|
||||
mov.l @r4+, r2
|
||||
movt r0
|
||||
dt r1
|
||||
dt r5
|
||||
bf/s 5b
|
||||
cmp/eq #1, r0
|
||||
addc r2, r6
|
||||
addc r1, r6 ! r1==0 here, so it means add carry-bit
|
||||
addc r5, r6 ! r5==0 here, so it means add carry-bit
|
||||
6:
|
||||
! 3 bytes or less remaining
|
||||
mov r1, r5
|
||||
mov #3, r0
|
||||
and r0, r5
|
||||
tst r5, r5
|
||||
@@ -162,16 +141,6 @@ ENTRY(csum_partial)
|
||||
mov #0, r0
|
||||
addc r0, r6
|
||||
9:
|
||||
! Check if the buffer was misaligned, if so realign sum
|
||||
mov r7, r0
|
||||
tst #1, r0
|
||||
bt 10f
|
||||
mov r6, r0
|
||||
shll8 r6
|
||||
shlr16 r0
|
||||
shlr8 r0
|
||||
or r0, r6
|
||||
10:
|
||||
rts
|
||||
mov r6, r0
|
||||
|
||||
|
||||
@@ -47,7 +47,6 @@ void arch_send_call_function_ipi_mask(const struct cpumask *mask);
|
||||
int hard_smp_processor_id(void);
|
||||
#define raw_smp_processor_id() (current_thread_info()->cpu)
|
||||
|
||||
void smp_fill_in_cpu_possible_map(void);
|
||||
void smp_fill_in_sib_core_maps(void);
|
||||
void cpu_play_dead(void);
|
||||
|
||||
@@ -77,7 +76,6 @@ void __cpu_die(unsigned int cpu);
|
||||
#define smp_fill_in_sib_core_maps() do { } while (0)
|
||||
#define smp_fetch_global_regs() do { } while (0)
|
||||
#define smp_fetch_global_pmu() do { } while (0)
|
||||
#define smp_fill_in_cpu_possible_map() do { } while (0)
|
||||
#define smp_init_cpu_poke() do { } while (0)
|
||||
#define scheduler_poke() do { } while (0)
|
||||
|
||||
|
||||
@@ -13,16 +13,6 @@ typedef unsigned int tcflag_t;
|
||||
typedef unsigned long tcflag_t;
|
||||
#endif
|
||||
|
||||
#define NCC 8
|
||||
struct termio {
|
||||
unsigned short c_iflag; /* input mode flags */
|
||||
unsigned short c_oflag; /* output mode flags */
|
||||
unsigned short c_cflag; /* control mode flags */
|
||||
unsigned short c_lflag; /* local mode flags */
|
||||
unsigned char c_line; /* line discipline */
|
||||
unsigned char c_cc[NCC]; /* control characters */
|
||||
};
|
||||
|
||||
#define NCCS 17
|
||||
struct termios {
|
||||
tcflag_t c_iflag; /* input mode flags */
|
||||
|
||||
@@ -40,5 +40,14 @@ struct winsize {
|
||||
unsigned short ws_ypixel;
|
||||
};
|
||||
|
||||
#define NCC 8
|
||||
struct termio {
|
||||
unsigned short c_iflag; /* input mode flags */
|
||||
unsigned short c_oflag; /* output mode flags */
|
||||
unsigned short c_cflag; /* control mode flags */
|
||||
unsigned short c_lflag; /* local mode flags */
|
||||
unsigned char c_line; /* line discipline */
|
||||
unsigned char c_cc[NCC]; /* control characters */
|
||||
};
|
||||
|
||||
#endif /* _UAPI_SPARC_TERMIOS_H */
|
||||
|
||||
@@ -479,7 +479,9 @@ static void *record_one_cpu(struct device_node *dp, int cpuid, int arg)
|
||||
ncpus_probed++;
|
||||
#ifdef CONFIG_SMP
|
||||
set_cpu_present(cpuid, true);
|
||||
set_cpu_possible(cpuid, true);
|
||||
|
||||
if (num_possible_cpus() < nr_cpu_ids)
|
||||
set_cpu_possible(cpuid, true);
|
||||
#endif
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -690,7 +690,6 @@ void __init setup_arch(char **cmdline_p)
|
||||
|
||||
paging_init();
|
||||
init_sparc64_elf_hwcap();
|
||||
smp_fill_in_cpu_possible_map();
|
||||
/*
|
||||
* Once the OF device tree and MDESC have been setup and nr_cpus has
|
||||
* been parsed, we know the list of possible cpus. Therefore we can
|
||||
|
||||
@@ -1213,20 +1213,6 @@ void __init smp_setup_processor_id(void)
|
||||
xcall_deliver_impl = hypervisor_xcall_deliver;
|
||||
}
|
||||
|
||||
void __init smp_fill_in_cpu_possible_map(void)
|
||||
{
|
||||
int possible_cpus = num_possible_cpus();
|
||||
int i;
|
||||
|
||||
if (possible_cpus > nr_cpu_ids)
|
||||
possible_cpus = nr_cpu_ids;
|
||||
|
||||
for (i = 0; i < possible_cpus; i++)
|
||||
set_cpu_possible(i, true);
|
||||
for (; i < NR_CPUS; i++)
|
||||
set_cpu_possible(i, false);
|
||||
}
|
||||
|
||||
void smp_fill_in_sib_core_maps(void)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
@@ -683,24 +683,26 @@ void register_winch_irq(int fd, int tty_fd, int pid, struct tty_port *port,
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
*winch = ((struct winch) { .list = LIST_HEAD_INIT(winch->list),
|
||||
.fd = fd,
|
||||
*winch = ((struct winch) { .fd = fd,
|
||||
.tty_fd = tty_fd,
|
||||
.pid = pid,
|
||||
.port = port,
|
||||
.stack = stack });
|
||||
|
||||
spin_lock(&winch_handler_lock);
|
||||
list_add(&winch->list, &winch_handlers);
|
||||
spin_unlock(&winch_handler_lock);
|
||||
|
||||
if (um_request_irq(WINCH_IRQ, fd, IRQ_READ, winch_interrupt,
|
||||
IRQF_SHARED, "winch", winch) < 0) {
|
||||
printk(KERN_ERR "register_winch_irq - failed to register "
|
||||
"IRQ\n");
|
||||
spin_lock(&winch_handler_lock);
|
||||
list_del(&winch->list);
|
||||
spin_unlock(&winch_handler_lock);
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
spin_lock(&winch_handler_lock);
|
||||
list_add(&winch->list, &winch_handlers);
|
||||
spin_unlock(&winch_handler_lock);
|
||||
|
||||
return;
|
||||
|
||||
out_free:
|
||||
|
||||
@@ -1135,7 +1135,7 @@ static int __init ubd_init(void)
|
||||
|
||||
if (irq_req_buffer == NULL) {
|
||||
printk(KERN_ERR "Failed to initialize ubd buffering\n");
|
||||
return -1;
|
||||
return -ENOMEM;
|
||||
}
|
||||
io_req_buffer = kmalloc_array(UBD_REQ_BUFFER_SIZE,
|
||||
sizeof(struct io_thread_req *),
|
||||
@@ -1146,7 +1146,7 @@ static int __init ubd_init(void)
|
||||
|
||||
if (io_req_buffer == NULL) {
|
||||
printk(KERN_ERR "Failed to initialize ubd buffering\n");
|
||||
return -1;
|
||||
return -ENOMEM;
|
||||
}
|
||||
platform_driver_register(&ubd_driver);
|
||||
mutex_lock(&ubd_lock);
|
||||
|
||||
@@ -15,8 +15,6 @@ typedef struct mm_context {
|
||||
struct page *stub_pages[2];
|
||||
} mm_context_t;
|
||||
|
||||
extern void __switch_mm(struct mm_id * mm_idp);
|
||||
|
||||
/* Avoid tangled inclusion with asm/ldt.h */
|
||||
extern long init_new_ldt(struct mm_context *to_mm, struct mm_context *from_mm);
|
||||
extern void free_ldt(struct mm_context *mm);
|
||||
|
||||
@@ -14,4 +14,6 @@ struct mm_id {
|
||||
unsigned long stack;
|
||||
};
|
||||
|
||||
void __switch_mm(struct mm_id *mm_idp);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -376,6 +376,7 @@ config UNWINDER_ORC
|
||||
|
||||
config UNWINDER_FRAME_POINTER
|
||||
bool "Frame pointer unwinder"
|
||||
select ARCH_WANT_FRAME_POINTERS
|
||||
select FRAME_POINTER
|
||||
---help---
|
||||
This option enables the frame pointer unwinder for unwinding kernel
|
||||
@@ -403,7 +404,3 @@ config UNWINDER_GUESS
|
||||
overhead.
|
||||
|
||||
endchoice
|
||||
|
||||
config FRAME_POINTER
|
||||
depends on !UNWINDER_ORC && !UNWINDER_GUESS
|
||||
bool
|
||||
|
||||
@@ -145,7 +145,14 @@ out:
|
||||
|
||||
int amd_smn_read(u16 node, u32 address, u32 *value)
|
||||
{
|
||||
return __amd_smn_rw(node, address, value, false);
|
||||
int err = __amd_smn_rw(node, address, value, false);
|
||||
|
||||
if (PCI_POSSIBLE_ERROR(*value)) {
|
||||
err = -ENODEV;
|
||||
*value = 0;
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(amd_smn_read);
|
||||
|
||||
|
||||
@@ -915,7 +915,8 @@ static void __send_cleanup_vector(struct apic_chip_data *apicd)
|
||||
hlist_add_head(&apicd->clist, per_cpu_ptr(&cleanup_list, cpu));
|
||||
apic->send_IPI(cpu, IRQ_MOVE_CLEANUP_VECTOR);
|
||||
} else {
|
||||
apicd->prev_vector = 0;
|
||||
pr_warn("IRQ %u schedule cleanup for offline CPU %u\n", apicd->irq, cpu);
|
||||
free_moved_vector(apicd);
|
||||
}
|
||||
raw_spin_unlock(&vector_lock);
|
||||
}
|
||||
@@ -951,6 +952,7 @@ void irq_complete_move(struct irq_cfg *cfg)
|
||||
*/
|
||||
void irq_force_complete_move(struct irq_desc *desc)
|
||||
{
|
||||
unsigned int cpu = smp_processor_id();
|
||||
struct apic_chip_data *apicd;
|
||||
struct irq_data *irqd;
|
||||
unsigned int vector;
|
||||
@@ -975,10 +977,11 @@ void irq_force_complete_move(struct irq_desc *desc)
|
||||
goto unlock;
|
||||
|
||||
/*
|
||||
* If prev_vector is empty, no action required.
|
||||
* If prev_vector is empty or the descriptor is neither currently
|
||||
* nor previously on the outgoing CPU no action required.
|
||||
*/
|
||||
vector = apicd->prev_vector;
|
||||
if (!vector)
|
||||
if (!vector || (apicd->cpu != cpu && apicd->prev_cpu != cpu))
|
||||
goto unlock;
|
||||
|
||||
/*
|
||||
|
||||
@@ -26,26 +26,7 @@
|
||||
|
||||
unsigned long profile_pc(struct pt_regs *regs)
|
||||
{
|
||||
unsigned long pc = instruction_pointer(regs);
|
||||
|
||||
if (!user_mode(regs) && in_lock_functions(pc)) {
|
||||
#ifdef CONFIG_FRAME_POINTER
|
||||
return *(unsigned long *)(regs->bp + sizeof(long));
|
||||
#else
|
||||
unsigned long *sp =
|
||||
(unsigned long *)kernel_stack_pointer(regs);
|
||||
/*
|
||||
* Return address is either directly at stack pointer
|
||||
* or above a saved flags. Eflags has bits 22-31 zero,
|
||||
* kernel addresses don't.
|
||||
*/
|
||||
if (sp[0] >> 22)
|
||||
return sp[0];
|
||||
if (sp[1] >> 22)
|
||||
return sp[1];
|
||||
#endif
|
||||
}
|
||||
return pc;
|
||||
return instruction_pointer(regs);
|
||||
}
|
||||
EXPORT_SYMBOL(profile_pc);
|
||||
|
||||
|
||||
@@ -151,11 +151,9 @@ bool tsc_store_and_check_tsc_adjust(bool bootcpu)
|
||||
cur->warned = false;
|
||||
|
||||
/*
|
||||
* If a non-zero TSC value for socket 0 may be valid then the default
|
||||
* adjusted value cannot assumed to be zero either.
|
||||
* The default adjust value cannot be assumed to be zero on any socket.
|
||||
*/
|
||||
if (tsc_async_resets)
|
||||
cur->adjusted = bootval;
|
||||
cur->adjusted = bootval;
|
||||
|
||||
/*
|
||||
* Check whether this CPU is the first in a package to come up. In
|
||||
|
||||
@@ -148,7 +148,7 @@ AVXcode:
|
||||
65: SEG=GS (Prefix)
|
||||
66: Operand-Size (Prefix)
|
||||
67: Address-Size (Prefix)
|
||||
68: PUSH Iz (d64)
|
||||
68: PUSH Iz
|
||||
69: IMUL Gv,Ev,Iz
|
||||
6a: PUSH Ib (d64)
|
||||
6b: IMUL Gv,Ev,Ib
|
||||
|
||||
@@ -30,7 +30,8 @@ KCOV_INSTRUMENT := n
|
||||
# make up the standalone purgatory.ro
|
||||
|
||||
PURGATORY_CFLAGS_REMOVE := -mcmodel=kernel
|
||||
PURGATORY_CFLAGS := -mcmodel=large -ffreestanding -fno-zero-initialized-in-bss -g0
|
||||
PURGATORY_CFLAGS := -mcmodel=small -ffreestanding -fno-zero-initialized-in-bss -g0
|
||||
PURGATORY_CFLAGS += -fpic -fvisibility=hidden
|
||||
PURGATORY_CFLAGS += $(DISABLE_STACKLEAK_PLUGIN) -DDISABLE_BRANCH_PROFILING
|
||||
|
||||
# Default KBUILD_CFLAGS can have -pg option set when FTRACE is enabled. That
|
||||
|
||||
@@ -673,6 +673,15 @@ static void walk_relocs(int (*process)(struct section *sec, Elf_Rel *rel,
|
||||
if (!(sec_applies->shdr.sh_flags & SHF_ALLOC)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* Do not perform relocations in .notes sections; any
|
||||
* values there are meant for pre-boot consumption (e.g.
|
||||
* startup_xen).
|
||||
*/
|
||||
if (sec_applies->shdr.sh_type == SHT_NOTE)
|
||||
continue;
|
||||
|
||||
sh_symtab = sec_symtab->symtab;
|
||||
sym_strtab = sec_symtab->link->strtab;
|
||||
for (j = 0; j < sec->shdr.sh_size/sizeof(Elf_Rel); j++) {
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
|
||||
ccflags-y := -D_LINUX -DBUILDING_ACPICA
|
||||
ccflags-$(CONFIG_ACPI_DEBUG) += -DACPI_DEBUG_OUTPUT
|
||||
CFLAGS_tbfind.o += $(call cc-disable-warning, stringop-truncation)
|
||||
|
||||
# use acpi.o to put all files here into acpi.o modparam namespace
|
||||
obj-y += acpi.o
|
||||
|
||||
@@ -43,7 +43,6 @@ acpi_ex_system_memory_space_handler(u32 function,
|
||||
struct acpi_mem_space_context *mem_info = region_context;
|
||||
u32 length;
|
||||
acpi_size map_length;
|
||||
acpi_size page_boundary_map_length;
|
||||
#ifdef ACPI_MISALIGNMENT_NOT_SUPPORTED
|
||||
u32 remainder;
|
||||
#endif
|
||||
@@ -120,26 +119,8 @@ acpi_ex_system_memory_space_handler(u32 function,
|
||||
map_length = (acpi_size)
|
||||
((mem_info->address + mem_info->length) - address);
|
||||
|
||||
/*
|
||||
* If mapping the entire remaining portion of the region will cross
|
||||
* a page boundary, just map up to the page boundary, do not cross.
|
||||
* On some systems, crossing a page boundary while mapping regions
|
||||
* can cause warnings if the pages have different attributes
|
||||
* due to resource management.
|
||||
*
|
||||
* This has the added benefit of constraining a single mapping to
|
||||
* one page, which is similar to the original code that used a 4k
|
||||
* maximum window.
|
||||
*/
|
||||
page_boundary_map_length = (acpi_size)
|
||||
(ACPI_ROUND_UP(address, ACPI_DEFAULT_PAGE_SIZE) - address);
|
||||
if (page_boundary_map_length == 0) {
|
||||
page_boundary_map_length = ACPI_DEFAULT_PAGE_SIZE;
|
||||
}
|
||||
|
||||
if (map_length > page_boundary_map_length) {
|
||||
map_length = page_boundary_map_length;
|
||||
}
|
||||
if (map_length > ACPI_DEFAULT_PAGE_SIZE)
|
||||
map_length = ACPI_DEFAULT_PAGE_SIZE;
|
||||
|
||||
/* Create a new mapping starting at the address given */
|
||||
|
||||
|
||||
@@ -523,7 +523,7 @@ struct binder_proc {
|
||||
struct list_head todo;
|
||||
struct binder_stats stats;
|
||||
struct list_head delivered_death;
|
||||
int max_threads;
|
||||
u32 max_threads;
|
||||
int requested_threads;
|
||||
int requested_threads_started;
|
||||
int tmp_ref;
|
||||
@@ -5055,7 +5055,7 @@ static long binder_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
||||
goto err;
|
||||
break;
|
||||
case BINDER_SET_MAX_THREADS: {
|
||||
int max_threads;
|
||||
u32 max_threads;
|
||||
|
||||
if (copy_from_user(&max_threads, ubuf,
|
||||
sizeof(max_threads))) {
|
||||
|
||||
@@ -6212,8 +6212,10 @@ struct ata_host *ata_host_alloc(struct device *dev, int max_ports)
|
||||
if (!host)
|
||||
return NULL;
|
||||
|
||||
if (!devres_open_group(dev, NULL, GFP_KERNEL))
|
||||
goto err_free;
|
||||
if (!devres_open_group(dev, NULL, GFP_KERNEL)) {
|
||||
kfree(host);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
dr = devres_alloc(ata_devres_release, 0, GFP_KERNEL);
|
||||
if (!dr)
|
||||
@@ -6245,8 +6247,6 @@ struct ata_host *ata_host_alloc(struct device *dev, int max_ports)
|
||||
|
||||
err_out:
|
||||
devres_release_group(dev, NULL);
|
||||
err_free:
|
||||
kfree(host);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
@@ -128,8 +128,6 @@ static int legacy_port[NR_HOST] = { 0x1f0, 0x170, 0x1e8, 0x168, 0x1e0, 0x160 };
|
||||
static struct legacy_probe probe_list[NR_HOST];
|
||||
static struct legacy_data legacy_data[NR_HOST];
|
||||
static struct ata_host *legacy_host[NR_HOST];
|
||||
static int nr_legacy_host;
|
||||
|
||||
|
||||
static int probe_all; /* Set to check all ISA port ranges */
|
||||
static int ht6560a; /* HT 6560A on primary 1, second 2, both 3 */
|
||||
@@ -1253,9 +1251,11 @@ static __exit void legacy_exit(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < nr_legacy_host; i++) {
|
||||
for (i = 0; i < NR_HOST; i++) {
|
||||
struct legacy_data *ld = &legacy_data[i];
|
||||
ata_host_detach(legacy_host[i]);
|
||||
|
||||
if (legacy_host[i])
|
||||
ata_host_detach(legacy_host[i]);
|
||||
platform_device_unregister(ld->platform_dev);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1679,8 +1679,11 @@ static ssize_t uevent_show(struct device *dev, struct device_attribute *attr,
|
||||
if (!env)
|
||||
return -ENOMEM;
|
||||
|
||||
/* Synchronize with really_probe() */
|
||||
device_lock(dev);
|
||||
/* let the kset specific function add its keys */
|
||||
retval = kset->uevent_ops->uevent(kset, &dev->kobj, env);
|
||||
device_unlock(dev);
|
||||
if (retval)
|
||||
goto out;
|
||||
|
||||
|
||||
@@ -1967,10 +1967,13 @@ static void __exit null_exit(void)
|
||||
|
||||
if (g_queue_mode == NULL_Q_MQ && shared_tags)
|
||||
blk_mq_free_tag_set(&tag_set);
|
||||
|
||||
mutex_destroy(&lock);
|
||||
}
|
||||
|
||||
module_init(null_init);
|
||||
module_exit(null_exit);
|
||||
|
||||
MODULE_AUTHOR("Jens Axboe <axboe@kernel.dk>");
|
||||
MODULE_DESCRIPTION("multi queue aware block test driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
@@ -300,28 +300,35 @@ static int register_device(int minor, struct pp_struct *pp)
|
||||
if (!port) {
|
||||
pr_warn("%s: no associated port!\n", name);
|
||||
rc = -ENXIO;
|
||||
goto err;
|
||||
goto err_free_name;
|
||||
}
|
||||
|
||||
index = ida_alloc(&ida_index, GFP_KERNEL);
|
||||
if (index < 0) {
|
||||
pr_warn("%s: failed to get index!\n", name);
|
||||
rc = index;
|
||||
goto err_put_port;
|
||||
}
|
||||
|
||||
index = ida_simple_get(&ida_index, 0, 0, GFP_KERNEL);
|
||||
memset(&ppdev_cb, 0, sizeof(ppdev_cb));
|
||||
ppdev_cb.irq_func = pp_irq;
|
||||
ppdev_cb.flags = (pp->flags & PP_EXCL) ? PARPORT_FLAG_EXCL : 0;
|
||||
ppdev_cb.private = pp;
|
||||
pdev = parport_register_dev_model(port, name, &ppdev_cb, index);
|
||||
parport_put_port(port);
|
||||
|
||||
if (!pdev) {
|
||||
pr_warn("%s: failed to register device!\n", name);
|
||||
rc = -ENXIO;
|
||||
ida_simple_remove(&ida_index, index);
|
||||
goto err;
|
||||
ida_free(&ida_index, index);
|
||||
goto err_put_port;
|
||||
}
|
||||
|
||||
pp->pdev = pdev;
|
||||
pp->index = index;
|
||||
dev_dbg(&pdev->dev, "registered pardevice\n");
|
||||
err:
|
||||
err_put_port:
|
||||
parport_put_port(port);
|
||||
err_free_name:
|
||||
kfree(name);
|
||||
return rc;
|
||||
}
|
||||
@@ -766,7 +773,7 @@ static int pp_release(struct inode *inode, struct file *file)
|
||||
|
||||
if (pp->pdev) {
|
||||
parport_unregister_device(pp->pdev);
|
||||
ida_simple_remove(&ida_index, pp->index);
|
||||
ida_free(&ida_index, pp->index);
|
||||
pp->pdev = NULL;
|
||||
pr_debug(CHRDEV "%x: unregistered pardevice\n", minor);
|
||||
}
|
||||
|
||||
@@ -506,7 +506,7 @@ static void spu2_dump_omd(u8 *omd, u16 hash_key_len, u16 ciph_key_len,
|
||||
if (hash_iv_len) {
|
||||
packet_log(" Hash IV Length %u bytes\n", hash_iv_len);
|
||||
packet_dump(" hash IV: ", ptr, hash_iv_len);
|
||||
ptr += ciph_key_len;
|
||||
ptr += hash_iv_len;
|
||||
}
|
||||
|
||||
if (ciph_iv_len) {
|
||||
|
||||
@@ -33,30 +33,47 @@ struct sp_platform {
|
||||
unsigned int irq_count;
|
||||
};
|
||||
|
||||
static const struct acpi_device_id sp_acpi_match[];
|
||||
static const struct of_device_id sp_of_match[];
|
||||
static const struct sp_dev_vdata dev_vdata[] = {
|
||||
{
|
||||
.bar = 0,
|
||||
#ifdef CONFIG_CRYPTO_DEV_SP_CCP
|
||||
.ccp_vdata = &ccpv3_platform,
|
||||
#endif
|
||||
},
|
||||
};
|
||||
|
||||
static const struct acpi_device_id sp_acpi_match[] = {
|
||||
{ "AMDI0C00", (kernel_ulong_t)&dev_vdata[0] },
|
||||
{ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(acpi, sp_acpi_match);
|
||||
|
||||
static const struct of_device_id sp_of_match[] = {
|
||||
{ .compatible = "amd,ccp-seattle-v1a",
|
||||
.data = (const void *)&dev_vdata[0] },
|
||||
{ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, sp_of_match);
|
||||
|
||||
static struct sp_dev_vdata *sp_get_of_version(struct platform_device *pdev)
|
||||
{
|
||||
#ifdef CONFIG_OF
|
||||
const struct of_device_id *match;
|
||||
|
||||
match = of_match_node(sp_of_match, pdev->dev.of_node);
|
||||
if (match && match->data)
|
||||
return (struct sp_dev_vdata *)match->data;
|
||||
#endif
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static struct sp_dev_vdata *sp_get_acpi_version(struct platform_device *pdev)
|
||||
{
|
||||
#ifdef CONFIG_ACPI
|
||||
const struct acpi_device_id *match;
|
||||
|
||||
match = acpi_match_device(sp_acpi_match, &pdev->dev);
|
||||
if (match && match->driver_data)
|
||||
return (struct sp_dev_vdata *)match->driver_data;
|
||||
#endif
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -201,41 +218,11 @@ static int sp_platform_resume(struct platform_device *pdev)
|
||||
}
|
||||
#endif
|
||||
|
||||
static const struct sp_dev_vdata dev_vdata[] = {
|
||||
{
|
||||
.bar = 0,
|
||||
#ifdef CONFIG_CRYPTO_DEV_SP_CCP
|
||||
.ccp_vdata = &ccpv3_platform,
|
||||
#endif
|
||||
},
|
||||
};
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
static const struct acpi_device_id sp_acpi_match[] = {
|
||||
{ "AMDI0C00", (kernel_ulong_t)&dev_vdata[0] },
|
||||
{ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(acpi, sp_acpi_match);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
static const struct of_device_id sp_of_match[] = {
|
||||
{ .compatible = "amd,ccp-seattle-v1a",
|
||||
.data = (const void *)&dev_vdata[0] },
|
||||
{ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, sp_of_match);
|
||||
#endif
|
||||
|
||||
static struct platform_driver sp_platform_driver = {
|
||||
.driver = {
|
||||
.name = "ccp",
|
||||
#ifdef CONFIG_ACPI
|
||||
.acpi_match_table = sp_acpi_match,
|
||||
#endif
|
||||
#ifdef CONFIG_OF
|
||||
.of_match_table = sp_of_match,
|
||||
#endif
|
||||
},
|
||||
.probe = sp_platform_probe,
|
||||
.remove = sp_platform_remove,
|
||||
|
||||
@@ -139,8 +139,7 @@ static void adf_device_reset_worker(struct work_struct *work)
|
||||
if (adf_dev_init(accel_dev) || adf_dev_start(accel_dev)) {
|
||||
/* The device hanged and we can't restart it so stop here */
|
||||
dev_err(&GET_DEV(accel_dev), "Restart device failed\n");
|
||||
if (reset_data->mode == ADF_DEV_RESET_ASYNC ||
|
||||
completion_done(&reset_data->compl))
|
||||
if (reset_data->mode == ADF_DEV_RESET_ASYNC)
|
||||
kfree(reset_data);
|
||||
WARN(1, "QAT: device restart failed. Device is unusable\n");
|
||||
return;
|
||||
@@ -148,16 +147,8 @@ static void adf_device_reset_worker(struct work_struct *work)
|
||||
adf_dev_restarted_notify(accel_dev);
|
||||
clear_bit(ADF_STATUS_RESTARTING, &accel_dev->status);
|
||||
|
||||
/*
|
||||
* The dev is back alive. Notify the caller if in sync mode
|
||||
*
|
||||
* If device restart will take a more time than expected,
|
||||
* the schedule_reset() function can timeout and exit. This can be
|
||||
* detected by calling the completion_done() function. In this case
|
||||
* the reset_data structure needs to be freed here.
|
||||
*/
|
||||
if (reset_data->mode == ADF_DEV_RESET_ASYNC ||
|
||||
completion_done(&reset_data->compl))
|
||||
/* The dev is back alive. Notify the caller if in sync mode */
|
||||
if (reset_data->mode == ADF_DEV_RESET_ASYNC)
|
||||
kfree(reset_data);
|
||||
else
|
||||
complete(&reset_data->compl);
|
||||
@@ -192,10 +183,10 @@ static int adf_dev_aer_schedule_reset(struct adf_accel_dev *accel_dev,
|
||||
if (!timeout) {
|
||||
dev_err(&GET_DEV(accel_dev),
|
||||
"Reset device timeout expired\n");
|
||||
cancel_work_sync(&reset_data->reset_work);
|
||||
ret = -EFAULT;
|
||||
} else {
|
||||
kfree(reset_data);
|
||||
}
|
||||
kfree(reset_data);
|
||||
return ret;
|
||||
}
|
||||
return 0;
|
||||
|
||||
@@ -119,12 +119,12 @@ static void sync_print_obj(struct seq_file *s, struct sync_timeline *obj)
|
||||
|
||||
seq_printf(s, "%s: %d\n", obj->name, obj->value);
|
||||
|
||||
spin_lock_irq(&obj->lock);
|
||||
spin_lock(&obj->lock); /* Caller already disabled IRQ. */
|
||||
list_for_each(pos, &obj->pt_list) {
|
||||
struct sync_pt *pt = container_of(pos, struct sync_pt, link);
|
||||
sync_print_fence(s, &pt->base, false);
|
||||
}
|
||||
spin_unlock_irq(&obj->lock);
|
||||
spin_unlock(&obj->lock);
|
||||
}
|
||||
|
||||
static void sync_print_sync_file(struct seq_file *s,
|
||||
|
||||
@@ -710,8 +710,8 @@ static int axi_dmac_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct axi_dmac *dmac = platform_get_drvdata(pdev);
|
||||
|
||||
of_dma_controller_free(pdev->dev.of_node);
|
||||
free_irq(dmac->irq, dmac);
|
||||
of_dma_controller_free(pdev->dev.of_node);
|
||||
tasklet_kill(&dmac->chan.vchan.task);
|
||||
dma_async_device_unregister(&dmac->dma_dev);
|
||||
clk_disable_unprepare(dmac->clk);
|
||||
|
||||
@@ -603,7 +603,9 @@ static int idma64_probe(struct idma64_chip *chip)
|
||||
|
||||
idma64->dma.dev = chip->sysdev;
|
||||
|
||||
dma_set_max_seg_size(idma64->dma.dev, IDMA64C_CTLH_BLOCK_TS_MASK);
|
||||
ret = dma_set_max_seg_size(idma64->dma.dev, IDMA64C_CTLH_BLOCK_TS_MASK);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = dma_async_device_register(&idma64->dma);
|
||||
if (ret)
|
||||
|
||||
@@ -1429,6 +1429,7 @@ module_init(ioat_init_module);
|
||||
static void __exit ioat_exit_module(void)
|
||||
{
|
||||
pci_unregister_driver(&ioat_pci_driver);
|
||||
kmem_cache_destroy(ioat_sed_cache);
|
||||
kmem_cache_destroy(ioat_cache);
|
||||
}
|
||||
module_exit(ioat_exit_module);
|
||||
|
||||
@@ -101,7 +101,8 @@ config EXTCON_MAX77843
|
||||
|
||||
config EXTCON_MAX8997
|
||||
tristate "Maxim MAX8997 EXTCON Support"
|
||||
depends on MFD_MAX8997 && IRQ_DOMAIN
|
||||
depends on MFD_MAX8997
|
||||
select IRQ_DOMAIN
|
||||
help
|
||||
If you say yes here you get support for the MUIC device of
|
||||
Maxim MAX8997 PMIC. The MAX8997 MUIC is a USB port accessory
|
||||
|
||||
@@ -161,9 +161,14 @@ static int dmi_dev_uevent(struct device *dev, struct kobj_uevent_env *env)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void dmi_dev_release(struct device *dev)
|
||||
{
|
||||
kfree(dev);
|
||||
}
|
||||
|
||||
static struct class dmi_class = {
|
||||
.name = "dmi",
|
||||
.dev_release = (void(*)(struct device *)) kfree,
|
||||
.dev_release = dmi_dev_release,
|
||||
.dev_uevent = dmi_dev_uevent,
|
||||
};
|
||||
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/mailbox_client.h>
|
||||
#include <linux/mailbox_controller.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/platform_device.h>
|
||||
@@ -91,8 +92,8 @@ int rpi_firmware_property_list(struct rpi_firmware *fw,
|
||||
if (size & 3)
|
||||
return -EINVAL;
|
||||
|
||||
buf = dma_alloc_coherent(fw->cl.dev, PAGE_ALIGN(size), &bus_addr,
|
||||
GFP_ATOMIC);
|
||||
buf = dma_alloc_coherent(fw->chan->mbox->dev, PAGE_ALIGN(size),
|
||||
&bus_addr, GFP_ATOMIC);
|
||||
if (!buf)
|
||||
return -ENOMEM;
|
||||
|
||||
@@ -120,7 +121,7 @@ int rpi_firmware_property_list(struct rpi_firmware *fw,
|
||||
ret = -EINVAL;
|
||||
}
|
||||
|
||||
dma_free_coherent(fw->cl.dev, PAGE_ALIGN(size), buf, bus_addr);
|
||||
dma_free_coherent(fw->chan->mbox->dev, PAGE_ALIGN(size), buf, bus_addr);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -207,6 +207,11 @@ static int davinci_gpio_probe(struct platform_device *pdev)
|
||||
else
|
||||
nirq = DIV_ROUND_UP(ngpio, 16);
|
||||
|
||||
if (nirq > MAX_INT_PER_BANK) {
|
||||
dev_err(dev, "Too many IRQs!\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
nbank = DIV_ROUND_UP(ngpio, 32);
|
||||
chips = devm_kcalloc(dev,
|
||||
nbank, sizeof(struct davinci_gpio_controller),
|
||||
|
||||
@@ -164,6 +164,8 @@ static void sumo_construct_vid_mapping_table(struct amdgpu_device *adev,
|
||||
|
||||
for (i = 0; i < SUMO_MAX_HARDWARE_POWERLEVELS; i++) {
|
||||
if (table[i].ulSupportedSCLK != 0) {
|
||||
if (table[i].usVoltageIndex >= SUMO_MAX_NUMBER_VOLTAGES)
|
||||
continue;
|
||||
vid_mapping_table->entries[table[i].usVoltageIndex].vid_7bit =
|
||||
table[i].usVoltageID;
|
||||
vid_mapping_table->entries[table[i].usVoltageIndex].vid_2bit =
|
||||
|
||||
@@ -816,6 +816,7 @@ static int dm_resume(void *handle)
|
||||
dc_stream_release(dm_new_crtc_state->stream);
|
||||
dm_new_crtc_state->stream = NULL;
|
||||
}
|
||||
dm_new_crtc_state->base.color_mgmt_changed = true;
|
||||
}
|
||||
|
||||
for_each_new_plane_in_state(dm->cached_state, plane, new_plane_state, i) {
|
||||
|
||||
@@ -315,6 +315,11 @@ bool cm_helper_translate_curve_to_hw_format(
|
||||
i += increment) {
|
||||
if (j == hw_points - 1)
|
||||
break;
|
||||
if (i >= TRANSFER_FUNC_POINTS) {
|
||||
DC_LOG_ERROR("Index out of bounds: i=%d, TRANSFER_FUNC_POINTS=%d\n",
|
||||
i, TRANSFER_FUNC_POINTS);
|
||||
return false;
|
||||
}
|
||||
rgb_resulted[j].red = output_tf->tf_pts.red[i];
|
||||
rgb_resulted[j].green = output_tf->tf_pts.green[i];
|
||||
rgb_resulted[j].blue = output_tf->tf_pts.blue[i];
|
||||
|
||||
@@ -620,6 +620,12 @@ void enc1_stream_encoder_set_mst_bandwidth(
|
||||
x),
|
||||
26));
|
||||
|
||||
// If y rounds up to integer, carry it over to x.
|
||||
if (y >> 26) {
|
||||
x += 1;
|
||||
y = 0;
|
||||
}
|
||||
|
||||
REG_SET_2(DP_MSE_RATE_CNTL, 0,
|
||||
DP_MSE_RATE_X, x,
|
||||
DP_MSE_RATE_Y, y);
|
||||
|
||||
@@ -69,7 +69,10 @@ static void malidp_mw_connector_reset(struct drm_connector *connector)
|
||||
__drm_atomic_helper_connector_destroy_state(connector->state);
|
||||
|
||||
kfree(connector->state);
|
||||
__drm_atomic_helper_connector_reset(connector, &mw_state->base);
|
||||
connector->state = NULL;
|
||||
|
||||
if (mw_state)
|
||||
__drm_atomic_helper_connector_reset(connector, &mw_state->base);
|
||||
}
|
||||
|
||||
static enum drm_connector_status
|
||||
|
||||
@@ -205,9 +205,12 @@ EXPORT_SYMBOL(drm_panel_bridge_remove);
|
||||
|
||||
static void devm_drm_panel_bridge_release(struct device *dev, void *res)
|
||||
{
|
||||
struct drm_bridge **bridge = res;
|
||||
struct drm_bridge *bridge = *(struct drm_bridge **)res;
|
||||
|
||||
drm_panel_bridge_remove(*bridge);
|
||||
if (!bridge)
|
||||
return;
|
||||
|
||||
drm_bridge_remove(bridge);
|
||||
}
|
||||
|
||||
struct drm_bridge *devm_drm_panel_bridge_add(struct device *dev,
|
||||
|
||||
@@ -302,6 +302,7 @@ static int vidi_get_modes(struct drm_connector *connector)
|
||||
struct vidi_context *ctx = ctx_from_connector(connector);
|
||||
struct edid *edid;
|
||||
int edid_len;
|
||||
int count;
|
||||
|
||||
/*
|
||||
* the edid data comes from user side and it would be set
|
||||
@@ -321,7 +322,11 @@ static int vidi_get_modes(struct drm_connector *connector)
|
||||
|
||||
drm_connector_update_edid_property(connector, edid);
|
||||
|
||||
return drm_add_edid_modes(connector, edid);
|
||||
count = drm_add_edid_modes(connector, edid);
|
||||
|
||||
kfree(edid);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static const struct drm_connector_helper_funcs vidi_connector_helper_funcs = {
|
||||
|
||||
@@ -34,6 +34,9 @@ static struct mtk_drm_gem_obj *mtk_drm_gem_init(struct drm_device *dev,
|
||||
|
||||
size = round_up(size, PAGE_SIZE);
|
||||
|
||||
if (size == 0)
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
mtk_gem_obj = kzalloc(sizeof(*mtk_gem_obj), GFP_KERNEL);
|
||||
if (!mtk_gem_obj)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
@@ -823,7 +823,6 @@ struct dpu_encoder_phys *dpu_encoder_phys_cmd_init(
|
||||
{
|
||||
struct dpu_encoder_phys *phys_enc = NULL;
|
||||
struct dpu_encoder_phys_cmd *cmd_enc = NULL;
|
||||
struct dpu_hw_mdp *hw_mdp;
|
||||
struct dpu_encoder_irq *irq;
|
||||
int i, ret = 0;
|
||||
|
||||
@@ -836,14 +835,7 @@ struct dpu_encoder_phys *dpu_encoder_phys_cmd_init(
|
||||
goto fail;
|
||||
}
|
||||
phys_enc = &cmd_enc->base;
|
||||
|
||||
hw_mdp = dpu_rm_get_mdp(&p->dpu_kms->rm);
|
||||
if (IS_ERR_OR_NULL(hw_mdp)) {
|
||||
ret = PTR_ERR(hw_mdp);
|
||||
DPU_ERROR("failed to get mdptop\n");
|
||||
goto fail_mdp_init;
|
||||
}
|
||||
phys_enc->hw_mdptop = hw_mdp;
|
||||
phys_enc->hw_mdptop = p->dpu_kms->hw_mdp;
|
||||
phys_enc->intf_idx = p->intf_idx;
|
||||
|
||||
dpu_encoder_phys_cmd_init_ops(&phys_enc->ops);
|
||||
@@ -898,8 +890,6 @@ struct dpu_encoder_phys *dpu_encoder_phys_cmd_init(
|
||||
|
||||
return phys_enc;
|
||||
|
||||
fail_mdp_init:
|
||||
kfree(cmd_enc);
|
||||
fail:
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
@@ -829,7 +829,6 @@ struct dpu_encoder_phys *dpu_encoder_phys_vid_init(
|
||||
struct dpu_encoder_phys *phys_enc = NULL;
|
||||
struct dpu_encoder_phys_vid *vid_enc = NULL;
|
||||
struct dpu_rm_hw_iter iter;
|
||||
struct dpu_hw_mdp *hw_mdp;
|
||||
struct dpu_encoder_irq *irq;
|
||||
int i, ret = 0;
|
||||
|
||||
@@ -846,13 +845,7 @@ struct dpu_encoder_phys *dpu_encoder_phys_vid_init(
|
||||
|
||||
phys_enc = &vid_enc->base;
|
||||
|
||||
hw_mdp = dpu_rm_get_mdp(&p->dpu_kms->rm);
|
||||
if (IS_ERR_OR_NULL(hw_mdp)) {
|
||||
ret = PTR_ERR(hw_mdp);
|
||||
DPU_ERROR("failed to get mdptop\n");
|
||||
goto fail;
|
||||
}
|
||||
phys_enc->hw_mdptop = hw_mdp;
|
||||
phys_enc->hw_mdptop = p->dpu_kms->hw_mdp;
|
||||
phys_enc->intf_idx = p->intf_idx;
|
||||
|
||||
/**
|
||||
|
||||
@@ -208,6 +208,8 @@ static int nv17_tv_get_ld_modes(struct drm_encoder *encoder,
|
||||
struct drm_display_mode *mode;
|
||||
|
||||
mode = drm_mode_duplicate(encoder->dev, tv_mode);
|
||||
if (!mode)
|
||||
continue;
|
||||
|
||||
mode->clock = tv_norm->tv_enc_mode.vrefresh *
|
||||
mode->htotal / 1000 *
|
||||
@@ -257,6 +259,8 @@ static int nv17_tv_get_hd_modes(struct drm_encoder *encoder,
|
||||
if (modes[i].hdisplay == output_mode->hdisplay &&
|
||||
modes[i].vdisplay == output_mode->vdisplay) {
|
||||
mode = drm_mode_duplicate(encoder->dev, output_mode);
|
||||
if (!mode)
|
||||
continue;
|
||||
mode->type |= DRM_MODE_TYPE_PREFERRED;
|
||||
|
||||
} else {
|
||||
@@ -264,6 +268,8 @@ static int nv17_tv_get_hd_modes(struct drm_encoder *encoder,
|
||||
modes[i].vdisplay, 60, false,
|
||||
(output_mode->flags &
|
||||
DRM_MODE_FLAG_INTERLACE), false);
|
||||
if (!mode)
|
||||
continue;
|
||||
}
|
||||
|
||||
/* CVT modes are sometimes unsuitable... */
|
||||
|
||||
@@ -307,10 +307,10 @@ static int ili9881c_prepare(struct drm_panel *panel)
|
||||
msleep(5);
|
||||
|
||||
/* And reset it */
|
||||
gpiod_set_value(ctx->reset, 1);
|
||||
gpiod_set_value_cansleep(ctx->reset, 1);
|
||||
msleep(20);
|
||||
|
||||
gpiod_set_value(ctx->reset, 0);
|
||||
gpiod_set_value_cansleep(ctx->reset, 0);
|
||||
msleep(20);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(ili9881c_init); i++) {
|
||||
@@ -367,7 +367,7 @@ static int ili9881c_unprepare(struct drm_panel *panel)
|
||||
|
||||
mipi_dsi_dcs_enter_sleep_mode(ctx->dsi);
|
||||
regulator_disable(ctx->power);
|
||||
gpiod_set_value(ctx->reset, 1);
|
||||
gpiod_set_value_cansleep(ctx->reset, 1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1622,6 +1622,8 @@ void sumo_construct_vid_mapping_table(struct radeon_device *rdev,
|
||||
|
||||
for (i = 0; i < SUMO_MAX_HARDWARE_POWERLEVELS; i++) {
|
||||
if (table[i].ulSupportedSCLK != 0) {
|
||||
if (table[i].usVoltageIndex >= SUMO_MAX_NUMBER_VOLTAGES)
|
||||
continue;
|
||||
vid_mapping_table->entries[table[i].usVoltageIndex].vid_7bit =
|
||||
table[i].usVoltageID;
|
||||
vid_mapping_table->entries[table[i].usVoltageIndex].vid_2bit =
|
||||
|
||||
@@ -1273,7 +1273,6 @@ static void implement(const struct hid_device *hid, u8 *report,
|
||||
hid_warn(hid,
|
||||
"%s() called with too large value %d (n: %d)! (%s)\n",
|
||||
__func__, value, n, current->comm);
|
||||
WARN_ON(1);
|
||||
value &= m;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -294,10 +294,23 @@ static void timesync_onchannelcallback(void *context)
|
||||
struct ictimesync_ref_data *refdata;
|
||||
u8 *time_txf_buf = util_timesynch.recv_buffer;
|
||||
|
||||
vmbus_recvpacket(channel, time_txf_buf,
|
||||
PAGE_SIZE, &recvlen, &requestid);
|
||||
/*
|
||||
* Drain the ring buffer and use the last packet to update
|
||||
* host_ts
|
||||
*/
|
||||
while (1) {
|
||||
int ret = vmbus_recvpacket(channel, time_txf_buf,
|
||||
PAGE_SIZE, &recvlen,
|
||||
&requestid);
|
||||
if (ret) {
|
||||
pr_warn_once("TimeSync IC pkt recv failed (Err: %d)\n",
|
||||
ret);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!recvlen)
|
||||
break;
|
||||
|
||||
if (recvlen > 0) {
|
||||
icmsghdrp = (struct icmsg_hdr *)&time_txf_buf[
|
||||
sizeof(struct vmbuspipe_hdr)];
|
||||
|
||||
|
||||
@@ -250,6 +250,16 @@ static const struct pci_device_id intel_th_pci_id_table[] = {
|
||||
PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xa76f),
|
||||
.driver_data = (kernel_ulong_t)&intel_th_2x,
|
||||
},
|
||||
{
|
||||
/* Meteor Lake-S CPU */
|
||||
PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xae24),
|
||||
.driver_data = (kernel_ulong_t)&intel_th_2x,
|
||||
},
|
||||
{
|
||||
/* Meteor Lake-S */
|
||||
PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7f26),
|
||||
.driver_data = (kernel_ulong_t)&intel_th_2x,
|
||||
},
|
||||
{
|
||||
/* Raptor Lake-S */
|
||||
PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7a26),
|
||||
@@ -260,6 +270,26 @@ static const struct pci_device_id intel_th_pci_id_table[] = {
|
||||
PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7e24),
|
||||
.driver_data = (kernel_ulong_t)&intel_th_2x,
|
||||
},
|
||||
{
|
||||
/* Granite Rapids */
|
||||
PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x0963),
|
||||
.driver_data = (kernel_ulong_t)&intel_th_2x,
|
||||
},
|
||||
{
|
||||
/* Granite Rapids SOC */
|
||||
PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x3256),
|
||||
.driver_data = (kernel_ulong_t)&intel_th_2x,
|
||||
},
|
||||
{
|
||||
/* Sapphire Rapids SOC */
|
||||
PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x3456),
|
||||
.driver_data = (kernel_ulong_t)&intel_th_2x,
|
||||
},
|
||||
{
|
||||
/* Lunar Lake */
|
||||
PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xa824),
|
||||
.driver_data = (kernel_ulong_t)&intel_th_2x,
|
||||
},
|
||||
{
|
||||
/* Rocket Lake CPU */
|
||||
PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x4c19),
|
||||
|
||||
@@ -701,8 +701,11 @@ int stm_register_device(struct device *parent, struct stm_data *stm_data,
|
||||
return -ENOMEM;
|
||||
|
||||
stm->major = register_chrdev(0, stm_data->name, &stm_fops);
|
||||
if (stm->major < 0)
|
||||
goto err_free;
|
||||
if (stm->major < 0) {
|
||||
err = stm->major;
|
||||
vfree(stm);
|
||||
return err;
|
||||
}
|
||||
|
||||
device_initialize(&stm->dev);
|
||||
stm->dev.devt = MKDEV(stm->major, 0);
|
||||
@@ -746,10 +749,8 @@ int stm_register_device(struct device *parent, struct stm_data *stm_data,
|
||||
err_device:
|
||||
unregister_chrdev(stm->major, stm_data->name);
|
||||
|
||||
/* matches device_initialize() above */
|
||||
/* calls stm_device_release() */
|
||||
put_device(&stm->dev);
|
||||
err_free:
|
||||
vfree(stm);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -25,7 +25,12 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/log2.h>
|
||||
#include <linux/spinlock.h>
|
||||
|
||||
/**
|
||||
* @process_lock: protect I2C transfer process.
|
||||
* ocores_process() and ocores_process_timeout() can't run in parallel.
|
||||
*/
|
||||
struct ocores_i2c {
|
||||
void __iomem *base;
|
||||
u32 reg_shift;
|
||||
@@ -36,6 +41,7 @@ struct ocores_i2c {
|
||||
int pos;
|
||||
int nmsgs;
|
||||
int state; /* see STATE_ */
|
||||
spinlock_t process_lock;
|
||||
struct clk *clk;
|
||||
int ip_clock_khz;
|
||||
int bus_clock_khz;
|
||||
@@ -141,19 +147,26 @@ static void ocores_process(struct ocores_i2c *i2c)
|
||||
{
|
||||
struct i2c_msg *msg = i2c->msg;
|
||||
u8 stat = oc_getreg(i2c, OCI2C_STATUS);
|
||||
unsigned long flags;
|
||||
|
||||
/*
|
||||
* If we spin here is because we are in timeout, so we are going
|
||||
* to be in STATE_ERROR. See ocores_process_timeout()
|
||||
*/
|
||||
spin_lock_irqsave(&i2c->process_lock, flags);
|
||||
|
||||
if ((i2c->state == STATE_DONE) || (i2c->state == STATE_ERROR)) {
|
||||
/* stop has been sent */
|
||||
oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_IACK);
|
||||
wake_up(&i2c->wait);
|
||||
return;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* error? */
|
||||
if (stat & OCI2C_STAT_ARBLOST) {
|
||||
i2c->state = STATE_ERROR;
|
||||
oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_STOP);
|
||||
return;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if ((i2c->state == STATE_START) || (i2c->state == STATE_WRITE)) {
|
||||
@@ -163,7 +176,7 @@ static void ocores_process(struct ocores_i2c *i2c)
|
||||
if (stat & OCI2C_STAT_NACK) {
|
||||
i2c->state = STATE_ERROR;
|
||||
oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_STOP);
|
||||
return;
|
||||
goto out;
|
||||
}
|
||||
} else
|
||||
msg->buf[i2c->pos++] = oc_getreg(i2c, OCI2C_DATA);
|
||||
@@ -184,14 +197,14 @@ static void ocores_process(struct ocores_i2c *i2c)
|
||||
|
||||
oc_setreg(i2c, OCI2C_DATA, addr);
|
||||
oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_START);
|
||||
return;
|
||||
goto out;
|
||||
} else
|
||||
i2c->state = (msg->flags & I2C_M_RD)
|
||||
? STATE_READ : STATE_WRITE;
|
||||
} else {
|
||||
i2c->state = STATE_DONE;
|
||||
oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_STOP);
|
||||
return;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -202,6 +215,9 @@ static void ocores_process(struct ocores_i2c *i2c)
|
||||
oc_setreg(i2c, OCI2C_DATA, msg->buf[i2c->pos++]);
|
||||
oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_WRITE);
|
||||
}
|
||||
|
||||
out:
|
||||
spin_unlock_irqrestore(&i2c->process_lock, flags);
|
||||
}
|
||||
|
||||
static irqreturn_t ocores_isr(int irq, void *dev_id)
|
||||
@@ -213,9 +229,24 @@ static irqreturn_t ocores_isr(int irq, void *dev_id)
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
/**
|
||||
* Process timeout event
|
||||
* @i2c: ocores I2C device instance
|
||||
*/
|
||||
static void ocores_process_timeout(struct ocores_i2c *i2c)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&i2c->process_lock, flags);
|
||||
i2c->state = STATE_ERROR;
|
||||
oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_STOP);
|
||||
spin_unlock_irqrestore(&i2c->process_lock, flags);
|
||||
}
|
||||
|
||||
static int ocores_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
|
||||
{
|
||||
struct ocores_i2c *i2c = i2c_get_adapdata(adap);
|
||||
int ret;
|
||||
|
||||
i2c->msg = msgs;
|
||||
i2c->pos = 0;
|
||||
@@ -225,11 +256,14 @@ static int ocores_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
|
||||
oc_setreg(i2c, OCI2C_DATA, i2c_8bit_addr_from_msg(i2c->msg));
|
||||
oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_START);
|
||||
|
||||
if (wait_event_timeout(i2c->wait, (i2c->state == STATE_ERROR) ||
|
||||
(i2c->state == STATE_DONE), HZ))
|
||||
return (i2c->state == STATE_DONE) ? num : -EIO;
|
||||
else
|
||||
ret = wait_event_timeout(i2c->wait, (i2c->state == STATE_ERROR) ||
|
||||
(i2c->state == STATE_DONE), HZ);
|
||||
if (ret == 0) {
|
||||
ocores_process_timeout(i2c);
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
return (i2c->state == STATE_DONE) ? num : -EIO;
|
||||
}
|
||||
|
||||
static int ocores_init(struct device *dev, struct ocores_i2c *i2c)
|
||||
@@ -256,8 +290,8 @@ static int ocores_init(struct device *dev, struct ocores_i2c *i2c)
|
||||
oc_setreg(i2c, OCI2C_PREHIGH, prescale >> 8);
|
||||
|
||||
/* Init the device */
|
||||
oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_IACK);
|
||||
oc_setreg(i2c, OCI2C_CONTROL, ctrl | OCI2C_CTRL_IEN | OCI2C_CTRL_EN);
|
||||
oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_IACK);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -422,6 +456,8 @@ static int ocores_i2c_probe(struct platform_device *pdev)
|
||||
if (!i2c)
|
||||
return -ENOMEM;
|
||||
|
||||
spin_lock_init(&i2c->process_lock);
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
i2c->base = devm_ioremap_resource(&pdev->dev, res);
|
||||
if (IS_ERR(i2c->base))
|
||||
|
||||
@@ -160,6 +160,8 @@ static int ad7266_read_raw(struct iio_dev *indio_dev,
|
||||
ret = ad7266_read_single(st, val, chan->address);
|
||||
iio_device_release_direct_mode(indio_dev);
|
||||
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
*val = (*val >> 2) & 0xfff;
|
||||
if (chan->scan_type.sign == 's')
|
||||
*val = sign_extend32(*val, 11);
|
||||
|
||||
@@ -57,7 +57,9 @@
|
||||
#define BME680_NB_CONV_0_VAL 0
|
||||
|
||||
#define BME680_REG_MEAS_STAT_0 0x1D
|
||||
#define BME680_NEW_DATA_BIT BIT(7)
|
||||
#define BME680_GAS_MEAS_BIT BIT(6)
|
||||
#define BME680_MEAS_BIT BIT(5)
|
||||
|
||||
/* Calibration Parameters */
|
||||
#define BME680_T2_LSB_REG 0x8A
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
*/
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/bitfield.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/log2.h>
|
||||
@@ -38,7 +39,7 @@ struct bme680_calib {
|
||||
s8 par_h3;
|
||||
s8 par_h4;
|
||||
s8 par_h5;
|
||||
s8 par_h6;
|
||||
u8 par_h6;
|
||||
s8 par_h7;
|
||||
s8 par_gh1;
|
||||
s16 par_gh2;
|
||||
@@ -348,10 +349,10 @@ static s16 bme680_compensate_temp(struct bme680_data *data,
|
||||
if (!calib->par_t2)
|
||||
bme680_read_calib(data, calib);
|
||||
|
||||
var1 = (adc_temp >> 3) - (calib->par_t1 << 1);
|
||||
var1 = (adc_temp >> 3) - ((s32)calib->par_t1 << 1);
|
||||
var2 = (var1 * calib->par_t2) >> 11;
|
||||
var3 = ((var1 >> 1) * (var1 >> 1)) >> 12;
|
||||
var3 = (var3 * (calib->par_t3 << 4)) >> 14;
|
||||
var3 = (var3 * ((s32)calib->par_t3 << 4)) >> 14;
|
||||
data->t_fine = var2 + var3;
|
||||
calc_temp = (data->t_fine * 5 + 128) >> 8;
|
||||
|
||||
@@ -374,9 +375,9 @@ static u32 bme680_compensate_press(struct bme680_data *data,
|
||||
var1 = (data->t_fine >> 1) - 64000;
|
||||
var2 = ((((var1 >> 2) * (var1 >> 2)) >> 11) * calib->par_p6) >> 2;
|
||||
var2 = var2 + (var1 * calib->par_p5 << 1);
|
||||
var2 = (var2 >> 2) + (calib->par_p4 << 16);
|
||||
var2 = (var2 >> 2) + ((s32)calib->par_p4 << 16);
|
||||
var1 = (((((var1 >> 2) * (var1 >> 2)) >> 13) *
|
||||
(calib->par_p3 << 5)) >> 3) +
|
||||
((s32)calib->par_p3 << 5)) >> 3) +
|
||||
((calib->par_p2 * var1) >> 1);
|
||||
var1 = var1 >> 18;
|
||||
var1 = ((32768 + var1) * calib->par_p1) >> 15;
|
||||
@@ -394,7 +395,7 @@ static u32 bme680_compensate_press(struct bme680_data *data,
|
||||
var3 = ((press_comp >> 8) * (press_comp >> 8) *
|
||||
(press_comp >> 8) * calib->par_p10) >> 17;
|
||||
|
||||
press_comp += (var1 + var2 + var3 + (calib->par_p7 << 7)) >> 4;
|
||||
press_comp += (var1 + var2 + var3 + ((s32)calib->par_p7 << 7)) >> 4;
|
||||
|
||||
return press_comp;
|
||||
}
|
||||
@@ -420,7 +421,7 @@ static u32 bme680_compensate_humid(struct bme680_data *data,
|
||||
(((temp_scaled * ((temp_scaled * calib->par_h5) / 100))
|
||||
>> 6) / 100) + (1 << 14))) >> 10;
|
||||
var3 = var1 * var2;
|
||||
var4 = calib->par_h6 << 7;
|
||||
var4 = (s32)calib->par_h6 << 7;
|
||||
var4 = (var4 + ((temp_scaled * calib->par_h7) / 100)) >> 4;
|
||||
var5 = ((var3 >> 14) * (var3 >> 14)) >> 10;
|
||||
var6 = (var4 * var5) >> 1;
|
||||
@@ -536,6 +537,43 @@ static int bme680_set_mode(struct bme680_data *data, bool mode)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* Taken from Bosch BME680 API:
|
||||
* https://github.com/boschsensortec/BME68x_SensorAPI/blob/v4.4.8/bme68x.c#L490
|
||||
*/
|
||||
static int bme680_wait_for_eoc(struct bme680_data *data)
|
||||
{
|
||||
struct device *dev = regmap_get_device(data->regmap);
|
||||
unsigned int check;
|
||||
int ret;
|
||||
/*
|
||||
* (Sum of oversampling ratios * time per oversampling) +
|
||||
* TPH measurement + gas measurement + wait transition from forced mode
|
||||
* + heater duration
|
||||
*/
|
||||
int wait_eoc_us = ((data->oversampling_temp + data->oversampling_press +
|
||||
data->oversampling_humid) * 1936) + (477 * 4) +
|
||||
(477 * 5) + 1000 + (data->heater_dur * 1000);
|
||||
|
||||
usleep_range(wait_eoc_us, wait_eoc_us + 100);
|
||||
|
||||
ret = regmap_read(data->regmap, BME680_REG_MEAS_STAT_0, &check);
|
||||
if (ret) {
|
||||
dev_err(dev, "failed to read measurement status register.\n");
|
||||
return ret;
|
||||
}
|
||||
if (check & BME680_MEAS_BIT) {
|
||||
dev_err(dev, "Device measurement cycle incomplete.\n");
|
||||
return -EBUSY;
|
||||
}
|
||||
if (!(check & BME680_NEW_DATA_BIT)) {
|
||||
dev_err(dev, "No new data available from the device.\n");
|
||||
return -ENODATA;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int bme680_chip_config(struct bme680_data *data)
|
||||
{
|
||||
struct device *dev = regmap_get_device(data->regmap);
|
||||
@@ -622,6 +660,10 @@ static int bme680_read_temp(struct bme680_data *data, int *val)
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = bme680_wait_for_eoc(data);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = regmap_bulk_read(data->regmap, BME680_REG_TEMP_MSB,
|
||||
(u8 *) &tmp, 3);
|
||||
if (ret < 0) {
|
||||
@@ -678,7 +720,7 @@ static int bme680_read_press(struct bme680_data *data,
|
||||
}
|
||||
|
||||
*val = bme680_compensate_press(data, adc_press);
|
||||
*val2 = 100;
|
||||
*val2 = 1000;
|
||||
return IIO_VAL_FRACTIONAL;
|
||||
}
|
||||
|
||||
@@ -738,6 +780,10 @@ static int bme680_read_gas(struct bme680_data *data,
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = bme680_wait_for_eoc(data);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = regmap_read(data->regmap, BME680_REG_MEAS_STAT_0, &check);
|
||||
if (check & BME680_GAS_MEAS_BIT) {
|
||||
dev_err(dev, "gas measurement incomplete\n");
|
||||
|
||||
@@ -158,7 +158,6 @@ static void ad5592r_gpio_cleanup(struct ad5592r_state *st)
|
||||
static int ad5592r_reset(struct ad5592r_state *st)
|
||||
{
|
||||
struct gpio_desc *gpio;
|
||||
struct iio_dev *iio_dev = iio_priv_to_dev(st);
|
||||
|
||||
gpio = devm_gpiod_get_optional(st->dev, "reset", GPIOD_OUT_LOW);
|
||||
if (IS_ERR(gpio))
|
||||
@@ -168,10 +167,10 @@ static int ad5592r_reset(struct ad5592r_state *st)
|
||||
udelay(1);
|
||||
gpiod_set_value(gpio, 1);
|
||||
} else {
|
||||
mutex_lock(&iio_dev->mlock);
|
||||
mutex_lock(&st->lock);
|
||||
/* Writing this magic value resets the device */
|
||||
st->ops->reg_write(st, AD5592R_REG_RESET, 0xdac);
|
||||
mutex_unlock(&iio_dev->mlock);
|
||||
mutex_unlock(&st->lock);
|
||||
}
|
||||
|
||||
udelay(250);
|
||||
@@ -199,7 +198,6 @@ static int ad5592r_set_channel_modes(struct ad5592r_state *st)
|
||||
const struct ad5592r_rw_ops *ops = st->ops;
|
||||
int ret;
|
||||
unsigned i;
|
||||
struct iio_dev *iio_dev = iio_priv_to_dev(st);
|
||||
u8 pulldown = 0, tristate = 0, dac = 0, adc = 0;
|
||||
u16 read_back;
|
||||
|
||||
@@ -249,7 +247,7 @@ static int ad5592r_set_channel_modes(struct ad5592r_state *st)
|
||||
}
|
||||
}
|
||||
|
||||
mutex_lock(&iio_dev->mlock);
|
||||
mutex_lock(&st->lock);
|
||||
|
||||
/* Pull down unused pins to GND */
|
||||
ret = ops->reg_write(st, AD5592R_REG_PULLDOWN, pulldown);
|
||||
@@ -287,7 +285,7 @@ static int ad5592r_set_channel_modes(struct ad5592r_state *st)
|
||||
ret = -EIO;
|
||||
|
||||
err_unlock:
|
||||
mutex_unlock(&iio_dev->mlock);
|
||||
mutex_unlock(&st->lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -316,11 +314,11 @@ static int ad5592r_write_raw(struct iio_dev *iio_dev,
|
||||
if (!chan->output)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&iio_dev->mlock);
|
||||
mutex_lock(&st->lock);
|
||||
ret = st->ops->write_dac(st, chan->channel, val);
|
||||
if (!ret)
|
||||
st->cached_dac[chan->channel] = val;
|
||||
mutex_unlock(&iio_dev->mlock);
|
||||
mutex_unlock(&st->lock);
|
||||
return ret;
|
||||
case IIO_CHAN_INFO_SCALE:
|
||||
if (chan->type == IIO_VOLTAGE) {
|
||||
@@ -335,12 +333,12 @@ static int ad5592r_write_raw(struct iio_dev *iio_dev,
|
||||
else
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&iio_dev->mlock);
|
||||
mutex_lock(&st->lock);
|
||||
|
||||
ret = st->ops->reg_read(st, AD5592R_REG_CTRL,
|
||||
&st->cached_gp_ctrl);
|
||||
if (ret < 0) {
|
||||
mutex_unlock(&iio_dev->mlock);
|
||||
mutex_unlock(&st->lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -362,7 +360,7 @@ static int ad5592r_write_raw(struct iio_dev *iio_dev,
|
||||
|
||||
ret = st->ops->reg_write(st, AD5592R_REG_CTRL,
|
||||
st->cached_gp_ctrl);
|
||||
mutex_unlock(&iio_dev->mlock);
|
||||
mutex_unlock(&st->lock);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -380,11 +378,11 @@ static int ad5592r_read_raw(struct iio_dev *iio_dev,
|
||||
{
|
||||
struct ad5592r_state *st = iio_priv(iio_dev);
|
||||
u16 read_val;
|
||||
int ret;
|
||||
int ret, mult;
|
||||
|
||||
switch (m) {
|
||||
case IIO_CHAN_INFO_RAW:
|
||||
mutex_lock(&iio_dev->mlock);
|
||||
mutex_lock(&st->lock);
|
||||
|
||||
if (!chan->output) {
|
||||
ret = st->ops->read_adc(st, chan->channel, &read_val);
|
||||
@@ -417,29 +415,27 @@ static int ad5592r_read_raw(struct iio_dev *iio_dev,
|
||||
s64 tmp = *val * (3767897513LL / 25LL);
|
||||
*val = div_s64_rem(tmp, 1000000000LL, val2);
|
||||
|
||||
return IIO_VAL_INT_PLUS_MICRO;
|
||||
} else {
|
||||
int mult;
|
||||
|
||||
mutex_lock(&iio_dev->mlock);
|
||||
|
||||
if (chan->output)
|
||||
mult = !!(st->cached_gp_ctrl &
|
||||
AD5592R_REG_CTRL_DAC_RANGE);
|
||||
else
|
||||
mult = !!(st->cached_gp_ctrl &
|
||||
AD5592R_REG_CTRL_ADC_RANGE);
|
||||
|
||||
*val *= ++mult;
|
||||
|
||||
*val2 = chan->scan_type.realbits;
|
||||
ret = IIO_VAL_FRACTIONAL_LOG2;
|
||||
return IIO_VAL_INT_PLUS_NANO;
|
||||
}
|
||||
|
||||
mutex_lock(&st->lock);
|
||||
|
||||
if (chan->output)
|
||||
mult = !!(st->cached_gp_ctrl &
|
||||
AD5592R_REG_CTRL_DAC_RANGE);
|
||||
else
|
||||
mult = !!(st->cached_gp_ctrl &
|
||||
AD5592R_REG_CTRL_ADC_RANGE);
|
||||
|
||||
*val *= ++mult;
|
||||
|
||||
*val2 = chan->scan_type.realbits;
|
||||
ret = IIO_VAL_FRACTIONAL_LOG2;
|
||||
break;
|
||||
case IIO_CHAN_INFO_OFFSET:
|
||||
ret = ad5592r_get_vref(st);
|
||||
|
||||
mutex_lock(&iio_dev->mlock);
|
||||
mutex_lock(&st->lock);
|
||||
|
||||
if (st->cached_gp_ctrl & AD5592R_REG_CTRL_ADC_RANGE)
|
||||
*val = (-34365 * 25) / ret;
|
||||
@@ -452,7 +448,7 @@ static int ad5592r_read_raw(struct iio_dev *iio_dev,
|
||||
}
|
||||
|
||||
unlock:
|
||||
mutex_unlock(&iio_dev->mlock);
|
||||
mutex_unlock(&st->lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -627,6 +623,8 @@ int ad5592r_probe(struct device *dev, const char *name,
|
||||
iio_dev->info = &ad5592r_info;
|
||||
iio_dev->modes = INDIO_DIRECT_MODE;
|
||||
|
||||
mutex_init(&st->lock);
|
||||
|
||||
ad5592r_init_scales(st, ad5592r_get_vref(st));
|
||||
|
||||
ret = ad5592r_reset(st);
|
||||
|
||||
@@ -53,6 +53,7 @@ struct ad5592r_state {
|
||||
struct regulator *reg;
|
||||
struct gpio_chip gpiochip;
|
||||
struct mutex gpio_lock; /* Protect cached gpio_out, gpio_val, etc. */
|
||||
struct mutex lock;
|
||||
unsigned int num_channels;
|
||||
const struct ad5592r_rw_ops *ops;
|
||||
int scale_avail[2][2];
|
||||
|
||||
@@ -57,16 +57,16 @@ enum {
|
||||
(sizeof(struct scatterlist) + sizeof(void *)))
|
||||
|
||||
#define check_whether_bt_num_3(type, hop_num) \
|
||||
(type < HEM_TYPE_MTT && hop_num == 2)
|
||||
((type) < HEM_TYPE_MTT && (hop_num) == 2)
|
||||
|
||||
#define check_whether_bt_num_2(type, hop_num) \
|
||||
((type < HEM_TYPE_MTT && hop_num == 1) || \
|
||||
(type >= HEM_TYPE_MTT && hop_num == 2))
|
||||
(((type) < HEM_TYPE_MTT && (hop_num) == 1) || \
|
||||
((type) >= HEM_TYPE_MTT && (hop_num) == 2))
|
||||
|
||||
#define check_whether_bt_num_1(type, hop_num) \
|
||||
((type < HEM_TYPE_MTT && hop_num == HNS_ROCE_HOP_NUM_0) || \
|
||||
(type >= HEM_TYPE_MTT && hop_num == 1) || \
|
||||
(type >= HEM_TYPE_MTT && hop_num == HNS_ROCE_HOP_NUM_0))
|
||||
(((type) < HEM_TYPE_MTT && (hop_num) == HNS_ROCE_HOP_NUM_0) || \
|
||||
((type) >= HEM_TYPE_MTT && (hop_num) == 1) || \
|
||||
((type) >= HEM_TYPE_MTT && (hop_num) == HNS_ROCE_HOP_NUM_0))
|
||||
|
||||
enum {
|
||||
HNS_ROCE_HEM_PAGE_SHIFT = 12,
|
||||
|
||||
@@ -179,8 +179,12 @@ int ipoib_vlan_add(struct net_device *pdev, unsigned short pkey)
|
||||
|
||||
ppriv = ipoib_priv(pdev);
|
||||
|
||||
snprintf(intf_name, sizeof(intf_name), "%s.%04x",
|
||||
ppriv->dev->name, pkey);
|
||||
/* If you increase IFNAMSIZ, update snprintf below
|
||||
* to allow longer names.
|
||||
*/
|
||||
BUILD_BUG_ON(IFNAMSIZ != 16);
|
||||
snprintf(intf_name, sizeof(intf_name), "%.10s.%04x", ppriv->dev->name,
|
||||
pkey);
|
||||
|
||||
priv = ipoib_intf_alloc(ppriv->ca, ppriv->port, intf_name);
|
||||
if (!priv) {
|
||||
|
||||
@@ -1345,19 +1345,19 @@ static int input_print_modalias_bits(char *buf, int size,
|
||||
char name, unsigned long *bm,
|
||||
unsigned int min_bit, unsigned int max_bit)
|
||||
{
|
||||
int len = 0, i;
|
||||
int bit = min_bit;
|
||||
int len = 0;
|
||||
|
||||
len += snprintf(buf, max(size, 0), "%c", name);
|
||||
for (i = min_bit; i < max_bit; i++)
|
||||
if (bm[BIT_WORD(i)] & BIT_MASK(i))
|
||||
len += snprintf(buf + len, max(size - len, 0), "%X,", i);
|
||||
for_each_set_bit_from(bit, bm, max_bit)
|
||||
len += snprintf(buf + len, max(size - len, 0), "%X,", bit);
|
||||
return len;
|
||||
}
|
||||
|
||||
static int input_print_modalias(char *buf, int size, struct input_dev *id,
|
||||
int add_cr)
|
||||
static int input_print_modalias_parts(char *buf, int size, int full_len,
|
||||
struct input_dev *id)
|
||||
{
|
||||
int len;
|
||||
int len, klen, remainder, space;
|
||||
|
||||
len = snprintf(buf, max(size, 0),
|
||||
"input:b%04Xv%04Xp%04Xe%04X-",
|
||||
@@ -1366,8 +1366,49 @@ static int input_print_modalias(char *buf, int size, struct input_dev *id,
|
||||
|
||||
len += input_print_modalias_bits(buf + len, size - len,
|
||||
'e', id->evbit, 0, EV_MAX);
|
||||
len += input_print_modalias_bits(buf + len, size - len,
|
||||
|
||||
/*
|
||||
* Calculate the remaining space in the buffer making sure we
|
||||
* have place for the terminating 0.
|
||||
*/
|
||||
space = max(size - (len + 1), 0);
|
||||
|
||||
klen = input_print_modalias_bits(buf + len, size - len,
|
||||
'k', id->keybit, KEY_MIN_INTERESTING, KEY_MAX);
|
||||
len += klen;
|
||||
|
||||
/*
|
||||
* If we have more data than we can fit in the buffer, check
|
||||
* if we can trim key data to fit in the rest. We will indicate
|
||||
* that key data is incomplete by adding "+" sign at the end, like
|
||||
* this: * "k1,2,3,45,+,".
|
||||
*
|
||||
* Note that we shortest key info (if present) is "k+," so we
|
||||
* can only try to trim if key data is longer than that.
|
||||
*/
|
||||
if (full_len && size < full_len + 1 && klen > 3) {
|
||||
remainder = full_len - len;
|
||||
/*
|
||||
* We can only trim if we have space for the remainder
|
||||
* and also for at least "k+," which is 3 more characters.
|
||||
*/
|
||||
if (remainder <= space - 3) {
|
||||
int i;
|
||||
/*
|
||||
* We are guaranteed to have 'k' in the buffer, so
|
||||
* we need at least 3 additional bytes for storing
|
||||
* "+," in addition to the remainder.
|
||||
*/
|
||||
for (i = size - 1 - remainder - 3; i >= 0; i--) {
|
||||
if (buf[i] == 'k' || buf[i] == ',') {
|
||||
strcpy(buf + i + 1, "+,");
|
||||
len = i + 3; /* Not counting '\0' */
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
len += input_print_modalias_bits(buf + len, size - len,
|
||||
'r', id->relbit, 0, REL_MAX);
|
||||
len += input_print_modalias_bits(buf + len, size - len,
|
||||
@@ -1383,12 +1424,25 @@ static int input_print_modalias(char *buf, int size, struct input_dev *id,
|
||||
len += input_print_modalias_bits(buf + len, size - len,
|
||||
'w', id->swbit, 0, SW_MAX);
|
||||
|
||||
if (add_cr)
|
||||
len += snprintf(buf + len, max(size - len, 0), "\n");
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
static int input_print_modalias(char *buf, int size, struct input_dev *id)
|
||||
{
|
||||
int full_len;
|
||||
|
||||
/*
|
||||
* Printing is done in 2 passes: first one figures out total length
|
||||
* needed for the modalias string, second one will try to trim key
|
||||
* data in case when buffer is too small for the entire modalias.
|
||||
* If the buffer is too small regardless, it will fill as much as it
|
||||
* can (without trimming key data) into the buffer and leave it to
|
||||
* the caller to figure out what to do with the result.
|
||||
*/
|
||||
full_len = input_print_modalias_parts(NULL, 0, 0, id);
|
||||
return input_print_modalias_parts(buf, size, full_len, id);
|
||||
}
|
||||
|
||||
static ssize_t input_dev_show_modalias(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
char *buf)
|
||||
@@ -1396,7 +1450,9 @@ static ssize_t input_dev_show_modalias(struct device *dev,
|
||||
struct input_dev *id = to_input_dev(dev);
|
||||
ssize_t len;
|
||||
|
||||
len = input_print_modalias(buf, PAGE_SIZE, id, 1);
|
||||
len = input_print_modalias(buf, PAGE_SIZE, id);
|
||||
if (len < PAGE_SIZE - 2)
|
||||
len += snprintf(buf + len, PAGE_SIZE - len, "\n");
|
||||
|
||||
return min_t(int, len, PAGE_SIZE);
|
||||
}
|
||||
@@ -1569,6 +1625,23 @@ static int input_add_uevent_bm_var(struct kobj_uevent_env *env,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* This is a pretty gross hack. When building uevent data the driver core
|
||||
* may try adding more environment variables to kobj_uevent_env without
|
||||
* telling us, so we have no idea how much of the buffer we can use to
|
||||
* avoid overflows/-ENOMEM elsewhere. To work around this let's artificially
|
||||
* reduce amount of memory we will use for the modalias environment variable.
|
||||
*
|
||||
* The potential additions are:
|
||||
*
|
||||
* SEQNUM=18446744073709551615 - (%llu - 28 bytes)
|
||||
* HOME=/ (6 bytes)
|
||||
* PATH=/sbin:/bin:/usr/sbin:/usr/bin (34 bytes)
|
||||
*
|
||||
* 68 bytes total. Allow extra buffer - 96 bytes
|
||||
*/
|
||||
#define UEVENT_ENV_EXTRA_LEN 96
|
||||
|
||||
static int input_add_uevent_modalias_var(struct kobj_uevent_env *env,
|
||||
struct input_dev *dev)
|
||||
{
|
||||
@@ -1578,9 +1651,11 @@ static int input_add_uevent_modalias_var(struct kobj_uevent_env *env,
|
||||
return -ENOMEM;
|
||||
|
||||
len = input_print_modalias(&env->buf[env->buflen - 1],
|
||||
sizeof(env->buf) - env->buflen,
|
||||
dev, 0);
|
||||
if (len >= (sizeof(env->buf) - env->buflen))
|
||||
(int)sizeof(env->buf) - env->buflen -
|
||||
UEVENT_ENV_EXTRA_LEN,
|
||||
dev);
|
||||
if (len >= ((int)sizeof(env->buf) - env->buflen -
|
||||
UEVENT_ENV_EXTRA_LEN))
|
||||
return -ENOMEM;
|
||||
|
||||
env->buflen += len;
|
||||
|
||||
@@ -47,8 +47,8 @@ struct ims_pcu_backlight {
|
||||
#define IMS_PCU_PART_NUMBER_LEN 15
|
||||
#define IMS_PCU_SERIAL_NUMBER_LEN 8
|
||||
#define IMS_PCU_DOM_LEN 8
|
||||
#define IMS_PCU_FW_VERSION_LEN (9 + 1)
|
||||
#define IMS_PCU_BL_VERSION_LEN (9 + 1)
|
||||
#define IMS_PCU_FW_VERSION_LEN 16
|
||||
#define IMS_PCU_BL_VERSION_LEN 16
|
||||
#define IMS_PCU_BL_RESET_REASON_LEN (2 + 1)
|
||||
|
||||
#define IMS_PCU_PCU_B_DEVICE_ID 5
|
||||
|
||||
@@ -22,7 +22,8 @@
|
||||
|
||||
#define VIB_MAX_LEVEL_mV (3100)
|
||||
#define VIB_MIN_LEVEL_mV (1200)
|
||||
#define VIB_MAX_LEVELS (VIB_MAX_LEVEL_mV - VIB_MIN_LEVEL_mV)
|
||||
#define VIB_PER_STEP_mV (100)
|
||||
#define VIB_MAX_LEVELS (VIB_MAX_LEVEL_mV - VIB_MIN_LEVEL_mV + VIB_PER_STEP_mV)
|
||||
|
||||
#define MAX_FF_SPEED 0xff
|
||||
|
||||
@@ -126,10 +127,10 @@ static void pm8xxx_work_handler(struct work_struct *work)
|
||||
vib->active = true;
|
||||
vib->level = ((VIB_MAX_LEVELS * vib->speed) / MAX_FF_SPEED) +
|
||||
VIB_MIN_LEVEL_mV;
|
||||
vib->level /= 100;
|
||||
vib->level /= VIB_PER_STEP_mV;
|
||||
} else {
|
||||
vib->active = false;
|
||||
vib->level = VIB_MIN_LEVEL_mV / 100;
|
||||
vib->level = VIB_MIN_LEVEL_mV / VIB_PER_STEP_mV;
|
||||
}
|
||||
|
||||
pm8xxx_vib_set(vib, vib->active);
|
||||
|
||||
@@ -1409,8 +1409,17 @@ static int __init init_iommu_from_acpi(struct amd_iommu *iommu,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __init free_sysfs(struct amd_iommu *iommu)
|
||||
{
|
||||
if (iommu->iommu.dev) {
|
||||
iommu_device_unregister(&iommu->iommu);
|
||||
iommu_device_sysfs_remove(&iommu->iommu);
|
||||
}
|
||||
}
|
||||
|
||||
static void __init free_iommu_one(struct amd_iommu *iommu)
|
||||
{
|
||||
free_sysfs(iommu);
|
||||
free_command_buffer(iommu);
|
||||
free_event_buffer(iommu);
|
||||
free_ppr_log(iommu);
|
||||
|
||||
@@ -165,7 +165,7 @@ static int alpine_msix_middle_domain_alloc(struct irq_domain *domain,
|
||||
return 0;
|
||||
|
||||
err_sgi:
|
||||
irq_domain_free_irqs_parent(domain, virq, i - 1);
|
||||
irq_domain_free_irqs_parent(domain, virq, i);
|
||||
alpine_msix_free_sgi(priv, sgi, nr_irqs);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -20,13 +20,13 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/proc_fs.h>
|
||||
|
||||
#include <asm/macintosh.h>
|
||||
#include <asm/macints.h>
|
||||
#include <asm/macintosh.h>
|
||||
#include <asm/macints.h>
|
||||
#include <asm/mac_iop.h>
|
||||
#include <asm/mac_oss.h>
|
||||
#include <asm/adb_iop.h>
|
||||
|
||||
#include <linux/adb.h>
|
||||
#include <linux/adb.h>
|
||||
|
||||
/*#define DEBUG_ADB_IOP*/
|
||||
|
||||
@@ -38,9 +38,9 @@ static unsigned char *reply_ptr;
|
||||
#endif
|
||||
|
||||
static enum adb_iop_state {
|
||||
idle,
|
||||
sending,
|
||||
awaiting_reply
|
||||
idle,
|
||||
sending,
|
||||
awaiting_reply
|
||||
} adb_iop_state;
|
||||
|
||||
static void adb_iop_start(void);
|
||||
@@ -66,7 +66,8 @@ static void adb_iop_end_req(struct adb_request *req, int state)
|
||||
{
|
||||
req->complete = 1;
|
||||
current_req = req->next;
|
||||
if (req->done) (*req->done)(req);
|
||||
if (req->done)
|
||||
(*req->done)(req);
|
||||
adb_iop_state = state;
|
||||
}
|
||||
|
||||
@@ -100,7 +101,7 @@ static void adb_iop_complete(struct iop_msg *msg)
|
||||
|
||||
static void adb_iop_listen(struct iop_msg *msg)
|
||||
{
|
||||
struct adb_iopmsg *amsg = (struct adb_iopmsg *) msg->message;
|
||||
struct adb_iopmsg *amsg = (struct adb_iopmsg *)msg->message;
|
||||
struct adb_request *req;
|
||||
unsigned long flags;
|
||||
#ifdef DEBUG_ADB_IOP
|
||||
@@ -113,9 +114,9 @@ static void adb_iop_listen(struct iop_msg *msg)
|
||||
|
||||
#ifdef DEBUG_ADB_IOP
|
||||
printk("adb_iop_listen %p: rcvd packet, %d bytes: %02X %02X", req,
|
||||
(uint) amsg->count + 2, (uint) amsg->flags, (uint) amsg->cmd);
|
||||
(uint)amsg->count + 2, (uint)amsg->flags, (uint)amsg->cmd);
|
||||
for (i = 0; i < amsg->count; i++)
|
||||
printk(" %02X", (uint) amsg->data[i]);
|
||||
printk(" %02X", (uint)amsg->data[i]);
|
||||
printk("\n");
|
||||
#endif
|
||||
|
||||
@@ -168,14 +169,15 @@ static void adb_iop_start(void)
|
||||
|
||||
/* get the packet to send */
|
||||
req = current_req;
|
||||
if (!req) return;
|
||||
if (!req)
|
||||
return;
|
||||
|
||||
local_irq_save(flags);
|
||||
|
||||
#ifdef DEBUG_ADB_IOP
|
||||
printk("adb_iop_start %p: sending packet, %d bytes:", req, req->nbytes);
|
||||
for (i = 0 ; i < req->nbytes ; i++)
|
||||
printk(" %02X", (uint) req->data[i]);
|
||||
for (i = 0; i < req->nbytes; i++)
|
||||
printk(" %02X", (uint)req->data[i]);
|
||||
printk("\n");
|
||||
#endif
|
||||
|
||||
@@ -196,13 +198,14 @@ static void adb_iop_start(void)
|
||||
/* Now send it. The IOP manager will call adb_iop_complete */
|
||||
/* when the packet has been sent. */
|
||||
|
||||
iop_send_message(ADB_IOP, ADB_CHAN, req,
|
||||
sizeof(amsg), (__u8 *) &amsg, adb_iop_complete);
|
||||
iop_send_message(ADB_IOP, ADB_CHAN, req, sizeof(amsg), (__u8 *)&amsg,
|
||||
adb_iop_complete);
|
||||
}
|
||||
|
||||
int adb_iop_probe(void)
|
||||
{
|
||||
if (!iop_ism_present) return -ENODEV;
|
||||
if (!iop_ism_present)
|
||||
return -ENODEV;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -218,10 +221,12 @@ int adb_iop_send_request(struct adb_request *req, int sync)
|
||||
int err;
|
||||
|
||||
err = adb_iop_write(req);
|
||||
if (err) return err;
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (sync) {
|
||||
while (!req->complete) adb_iop_poll();
|
||||
while (!req->complete)
|
||||
adb_iop_poll();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -251,7 +256,9 @@ static int adb_iop_write(struct adb_request *req)
|
||||
}
|
||||
|
||||
local_irq_restore(flags);
|
||||
if (adb_iop_state == idle) adb_iop_start();
|
||||
|
||||
if (adb_iop_state == idle)
|
||||
adb_iop_start();
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -263,7 +270,8 @@ int adb_iop_autopoll(int devs)
|
||||
|
||||
void adb_iop_poll(void)
|
||||
{
|
||||
if (adb_iop_state == idle) adb_iop_start();
|
||||
if (adb_iop_state == idle)
|
||||
adb_iop_start();
|
||||
iop_ism_irq_poll(ADB_IOP);
|
||||
}
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
*
|
||||
* 1999-08-02 (jmt) - Initial rewrite for Unified ADB.
|
||||
* 2000-03-29 Tony Mantler <tonym@mac.linux-m68k.org>
|
||||
* - Big overhaul, should actually work now.
|
||||
* - Big overhaul, should actually work now.
|
||||
* 2006-12-31 Finn Thain - Another overhaul.
|
||||
*
|
||||
* Suggested reading:
|
||||
@@ -23,7 +23,7 @@
|
||||
* Apple's "ADB Analyzer" bus sniffer is invaluable:
|
||||
* ftp://ftp.apple.com/developer/Tool_Chest/Devices_-_Hardware/Apple_Desktop_Bus/
|
||||
*/
|
||||
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/errno.h>
|
||||
@@ -77,7 +77,7 @@ static volatile unsigned char *via;
|
||||
#define ST_ODD 0x20 /* ADB state: odd data byte */
|
||||
#define ST_IDLE 0x30 /* ADB state: idle, nothing to send */
|
||||
|
||||
static int macii_init_via(void);
|
||||
static int macii_init_via(void);
|
||||
static void macii_start(void);
|
||||
static irqreturn_t macii_interrupt(int irq, void *arg);
|
||||
static void macii_queue_poll(void);
|
||||
@@ -120,27 +120,11 @@ static int srq_asserted; /* have to poll for the device that asserted it */
|
||||
static int command_byte; /* the most recent command byte transmitted */
|
||||
static int autopoll_devs; /* bits set are device addresses to be polled */
|
||||
|
||||
/* Sanity check for request queue. Doesn't check for cycles. */
|
||||
static int request_is_queued(struct adb_request *req) {
|
||||
struct adb_request *cur;
|
||||
unsigned long flags;
|
||||
local_irq_save(flags);
|
||||
cur = current_req;
|
||||
while (cur) {
|
||||
if (cur == req) {
|
||||
local_irq_restore(flags);
|
||||
return 1;
|
||||
}
|
||||
cur = cur->next;
|
||||
}
|
||||
local_irq_restore(flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Check for MacII style ADB */
|
||||
static int macii_probe(void)
|
||||
{
|
||||
if (macintosh_config->adb_type != MAC_ADB_II) return -ENODEV;
|
||||
if (macintosh_config->adb_type != MAC_ADB_II)
|
||||
return -ENODEV;
|
||||
|
||||
via = via1;
|
||||
|
||||
@@ -151,25 +135,22 @@ static int macii_probe(void)
|
||||
/* Initialize the driver */
|
||||
int macii_init(void)
|
||||
{
|
||||
unsigned long flags;
|
||||
int err;
|
||||
|
||||
local_irq_save(flags);
|
||||
|
||||
|
||||
err = macii_init_via();
|
||||
if (err) goto out;
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = request_irq(IRQ_MAC_ADB, macii_interrupt, 0, "ADB",
|
||||
macii_interrupt);
|
||||
if (err) goto out;
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
macii_state = idle;
|
||||
out:
|
||||
local_irq_restore(flags);
|
||||
return err;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* initialize the hardware */
|
||||
/* initialize the hardware */
|
||||
static int macii_init_via(void)
|
||||
{
|
||||
unsigned char x;
|
||||
@@ -179,7 +160,7 @@ static int macii_init_via(void)
|
||||
|
||||
/* Set up state: idle */
|
||||
via[B] |= ST_IDLE;
|
||||
last_status = via[B] & (ST_MASK|CTLR_IRQ);
|
||||
last_status = via[B] & (ST_MASK | CTLR_IRQ);
|
||||
|
||||
/* Shift register on input */
|
||||
via[ACR] = (via[ACR] & ~SR_CTRL) | SR_EXT;
|
||||
@@ -205,7 +186,8 @@ static void macii_queue_poll(void)
|
||||
int next_device;
|
||||
static struct adb_request req;
|
||||
|
||||
if (!autopoll_devs) return;
|
||||
if (!autopoll_devs)
|
||||
return;
|
||||
|
||||
device_mask = (1 << (((command_byte & 0xF0) >> 4) + 1)) - 1;
|
||||
if (autopoll_devs & ~device_mask)
|
||||
@@ -213,10 +195,7 @@ static void macii_queue_poll(void)
|
||||
else
|
||||
next_device = ffs(autopoll_devs) - 1;
|
||||
|
||||
BUG_ON(request_is_queued(&req));
|
||||
|
||||
adb_request(&req, NULL, ADBREQ_NOSEND, 1,
|
||||
ADB_READREG(next_device, 0));
|
||||
adb_request(&req, NULL, ADBREQ_NOSEND, 1, ADB_READREG(next_device, 0));
|
||||
|
||||
req.sent = 0;
|
||||
req.complete = 0;
|
||||
@@ -237,18 +216,13 @@ static int macii_send_request(struct adb_request *req, int sync)
|
||||
int err;
|
||||
unsigned long flags;
|
||||
|
||||
BUG_ON(request_is_queued(req));
|
||||
|
||||
local_irq_save(flags);
|
||||
err = macii_write(req);
|
||||
local_irq_restore(flags);
|
||||
|
||||
if (!err && sync) {
|
||||
while (!req->complete) {
|
||||
if (!err && sync)
|
||||
while (!req->complete)
|
||||
macii_poll();
|
||||
}
|
||||
BUG_ON(request_is_queued(req));
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
@@ -260,7 +234,7 @@ static int macii_write(struct adb_request *req)
|
||||
req->complete = 1;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
||||
req->next = NULL;
|
||||
req->sent = 0;
|
||||
req->complete = 0;
|
||||
@@ -272,7 +246,8 @@ static int macii_write(struct adb_request *req)
|
||||
} else {
|
||||
current_req = req;
|
||||
last_req = req;
|
||||
if (macii_state == idle) macii_start();
|
||||
if (macii_state == idle)
|
||||
macii_start();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -287,7 +262,8 @@ static int macii_autopoll(int devs)
|
||||
/* bit 1 == device 1, and so on. */
|
||||
autopoll_devs = devs & 0xFFFE;
|
||||
|
||||
if (!autopoll_devs) return 0;
|
||||
if (!autopoll_devs)
|
||||
return 0;
|
||||
|
||||
local_irq_save(flags);
|
||||
|
||||
@@ -304,7 +280,8 @@ static int macii_autopoll(int devs)
|
||||
return err;
|
||||
}
|
||||
|
||||
static inline int need_autopoll(void) {
|
||||
static inline int need_autopoll(void)
|
||||
{
|
||||
/* Was the last command Talk Reg 0
|
||||
* and is the target on the autopoll list?
|
||||
*/
|
||||
@@ -326,9 +303,6 @@ static void macii_poll(void)
|
||||
static int macii_reset_bus(void)
|
||||
{
|
||||
static struct adb_request req;
|
||||
|
||||
if (request_is_queued(&req))
|
||||
return 0;
|
||||
|
||||
/* Command = 0, Address = ignored */
|
||||
adb_request(&req, NULL, 0, 1, ADB_BUSRESET);
|
||||
@@ -346,10 +320,6 @@ static void macii_start(void)
|
||||
|
||||
req = current_req;
|
||||
|
||||
BUG_ON(req == NULL);
|
||||
|
||||
BUG_ON(macii_state != idle);
|
||||
|
||||
/* Now send it. Be careful though, that first byte of the request
|
||||
* is actually ADB_PACKET; the real data begins at index 1!
|
||||
* And req->nbytes is the number of bytes of real data plus one.
|
||||
@@ -375,7 +345,7 @@ static void macii_start(void)
|
||||
* to be activity on the ADB bus. The chip will poll to achieve this.
|
||||
*
|
||||
* The basic ADB state machine was left unchanged from the original MacII code
|
||||
* by Alan Cox, which was based on the CUDA driver for PowerMac.
|
||||
* by Alan Cox, which was based on the CUDA driver for PowerMac.
|
||||
* The syntax of the ADB status lines is totally different on MacII,
|
||||
* though. MacII uses the states Command -> Even -> Odd -> Even ->...-> Idle
|
||||
* for sending and Idle -> Even -> Odd -> Even ->...-> Idle for receiving.
|
||||
@@ -387,7 +357,6 @@ static void macii_start(void)
|
||||
static irqreturn_t macii_interrupt(int irq, void *arg)
|
||||
{
|
||||
int x;
|
||||
static int entered;
|
||||
struct adb_request *req;
|
||||
|
||||
if (!arg) {
|
||||
@@ -398,153 +367,150 @@ static irqreturn_t macii_interrupt(int irq, void *arg)
|
||||
return IRQ_NONE;
|
||||
}
|
||||
|
||||
BUG_ON(entered++);
|
||||
|
||||
last_status = status;
|
||||
status = via[B] & (ST_MASK|CTLR_IRQ);
|
||||
status = via[B] & (ST_MASK | CTLR_IRQ);
|
||||
|
||||
switch (macii_state) {
|
||||
case idle:
|
||||
if (reading_reply) {
|
||||
reply_ptr = current_req->reply;
|
||||
} else {
|
||||
BUG_ON(current_req != NULL);
|
||||
reply_ptr = reply_buf;
|
||||
}
|
||||
case idle:
|
||||
if (reading_reply) {
|
||||
reply_ptr = current_req->reply;
|
||||
} else {
|
||||
WARN_ON(current_req);
|
||||
reply_ptr = reply_buf;
|
||||
}
|
||||
|
||||
x = via[SR];
|
||||
x = via[SR];
|
||||
|
||||
if ((status & CTLR_IRQ) && (x == 0xFF)) {
|
||||
/* Bus timeout without SRQ sequence:
|
||||
* data is "FF" while CTLR_IRQ is "H"
|
||||
*/
|
||||
reply_len = 0;
|
||||
srq_asserted = 0;
|
||||
macii_state = read_done;
|
||||
} else {
|
||||
macii_state = reading;
|
||||
*reply_ptr = x;
|
||||
reply_len = 1;
|
||||
}
|
||||
|
||||
/* set ADB state = even for first data byte */
|
||||
via[B] = (via[B] & ~ST_MASK) | ST_EVEN;
|
||||
break;
|
||||
|
||||
case sending:
|
||||
req = current_req;
|
||||
if (data_index >= req->nbytes) {
|
||||
req->sent = 1;
|
||||
macii_state = idle;
|
||||
|
||||
if (req->reply_expected) {
|
||||
reading_reply = 1;
|
||||
} else {
|
||||
req->complete = 1;
|
||||
current_req = req->next;
|
||||
if (req->done) (*req->done)(req);
|
||||
|
||||
if (current_req)
|
||||
macii_start();
|
||||
else
|
||||
if (need_autopoll())
|
||||
macii_autopoll(autopoll_devs);
|
||||
}
|
||||
|
||||
if (macii_state == idle) {
|
||||
/* reset to shift in */
|
||||
via[ACR] &= ~SR_OUT;
|
||||
x = via[SR];
|
||||
/* set ADB state idle - might get SRQ */
|
||||
via[B] = (via[B] & ~ST_MASK) | ST_IDLE;
|
||||
}
|
||||
} else {
|
||||
via[SR] = req->data[data_index++];
|
||||
|
||||
if ( (via[B] & ST_MASK) == ST_CMD ) {
|
||||
/* just sent the command byte, set to EVEN */
|
||||
via[B] = (via[B] & ~ST_MASK) | ST_EVEN;
|
||||
} else {
|
||||
/* invert state bits, toggle ODD/EVEN */
|
||||
via[B] ^= ST_MASK;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case reading:
|
||||
x = via[SR];
|
||||
BUG_ON((status & ST_MASK) == ST_CMD ||
|
||||
(status & ST_MASK) == ST_IDLE);
|
||||
|
||||
/* Bus timeout with SRQ sequence:
|
||||
* data is "XX FF" while CTLR_IRQ is "L L"
|
||||
* End of packet without SRQ sequence:
|
||||
* data is "XX...YY 00" while CTLR_IRQ is "L...H L"
|
||||
* End of packet SRQ sequence:
|
||||
* data is "XX...YY 00" while CTLR_IRQ is "L...L L"
|
||||
* (where XX is the first response byte and
|
||||
* YY is the last byte of valid response data.)
|
||||
if ((status & CTLR_IRQ) && (x == 0xFF)) {
|
||||
/* Bus timeout without SRQ sequence:
|
||||
* data is "FF" while CTLR_IRQ is "H"
|
||||
*/
|
||||
|
||||
reply_len = 0;
|
||||
srq_asserted = 0;
|
||||
if (!(status & CTLR_IRQ)) {
|
||||
if (x == 0xFF) {
|
||||
if (!(last_status & CTLR_IRQ)) {
|
||||
macii_state = read_done;
|
||||
reply_len = 0;
|
||||
srq_asserted = 1;
|
||||
}
|
||||
} else if (x == 0x00) {
|
||||
macii_state = read_done;
|
||||
if (!(last_status & CTLR_IRQ))
|
||||
srq_asserted = 1;
|
||||
}
|
||||
}
|
||||
macii_state = read_done;
|
||||
} else {
|
||||
macii_state = reading;
|
||||
*reply_ptr = x;
|
||||
reply_len = 1;
|
||||
}
|
||||
|
||||
if (macii_state == reading) {
|
||||
BUG_ON(reply_len > 15);
|
||||
reply_ptr++;
|
||||
*reply_ptr = x;
|
||||
reply_len++;
|
||||
}
|
||||
|
||||
/* invert state bits, toggle ODD/EVEN */
|
||||
via[B] ^= ST_MASK;
|
||||
break;
|
||||
|
||||
case read_done:
|
||||
x = via[SR];
|
||||
|
||||
if (reading_reply) {
|
||||
reading_reply = 0;
|
||||
req = current_req;
|
||||
req->reply_len = reply_len;
|
||||
req->complete = 1;
|
||||
current_req = req->next;
|
||||
if (req->done) (*req->done)(req);
|
||||
} else if (reply_len && autopoll_devs)
|
||||
adb_input(reply_buf, reply_len, 0);
|
||||
/* set ADB state = even for first data byte */
|
||||
via[B] = (via[B] & ~ST_MASK) | ST_EVEN;
|
||||
break;
|
||||
|
||||
case sending:
|
||||
req = current_req;
|
||||
if (data_index >= req->nbytes) {
|
||||
req->sent = 1;
|
||||
macii_state = idle;
|
||||
|
||||
/* SRQ seen before, initiate poll now */
|
||||
if (srq_asserted)
|
||||
macii_queue_poll();
|
||||
if (req->reply_expected) {
|
||||
reading_reply = 1;
|
||||
} else {
|
||||
req->complete = 1;
|
||||
current_req = req->next;
|
||||
if (req->done)
|
||||
(*req->done)(req);
|
||||
|
||||
if (current_req)
|
||||
macii_start();
|
||||
else
|
||||
if (need_autopoll())
|
||||
if (current_req)
|
||||
macii_start();
|
||||
else if (need_autopoll())
|
||||
macii_autopoll(autopoll_devs);
|
||||
}
|
||||
|
||||
if (macii_state == idle)
|
||||
if (macii_state == idle) {
|
||||
/* reset to shift in */
|
||||
via[ACR] &= ~SR_OUT;
|
||||
x = via[SR];
|
||||
/* set ADB state idle - might get SRQ */
|
||||
via[B] = (via[B] & ~ST_MASK) | ST_IDLE;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
via[SR] = req->data[data_index++];
|
||||
|
||||
default:
|
||||
if ((via[B] & ST_MASK) == ST_CMD) {
|
||||
/* just sent the command byte, set to EVEN */
|
||||
via[B] = (via[B] & ~ST_MASK) | ST_EVEN;
|
||||
} else {
|
||||
/* invert state bits, toggle ODD/EVEN */
|
||||
via[B] ^= ST_MASK;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case reading:
|
||||
x = via[SR];
|
||||
WARN_ON((status & ST_MASK) == ST_CMD ||
|
||||
(status & ST_MASK) == ST_IDLE);
|
||||
|
||||
/* Bus timeout with SRQ sequence:
|
||||
* data is "XX FF" while CTLR_IRQ is "L L"
|
||||
* End of packet without SRQ sequence:
|
||||
* data is "XX...YY 00" while CTLR_IRQ is "L...H L"
|
||||
* End of packet SRQ sequence:
|
||||
* data is "XX...YY 00" while CTLR_IRQ is "L...L L"
|
||||
* (where XX is the first response byte and
|
||||
* YY is the last byte of valid response data.)
|
||||
*/
|
||||
|
||||
srq_asserted = 0;
|
||||
if (!(status & CTLR_IRQ)) {
|
||||
if (x == 0xFF) {
|
||||
if (!(last_status & CTLR_IRQ)) {
|
||||
macii_state = read_done;
|
||||
reply_len = 0;
|
||||
srq_asserted = 1;
|
||||
}
|
||||
} else if (x == 0x00) {
|
||||
macii_state = read_done;
|
||||
if (!(last_status & CTLR_IRQ))
|
||||
srq_asserted = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (macii_state == reading &&
|
||||
reply_len < ARRAY_SIZE(reply_buf)) {
|
||||
reply_ptr++;
|
||||
*reply_ptr = x;
|
||||
reply_len++;
|
||||
}
|
||||
|
||||
/* invert state bits, toggle ODD/EVEN */
|
||||
via[B] ^= ST_MASK;
|
||||
break;
|
||||
|
||||
case read_done:
|
||||
x = via[SR];
|
||||
|
||||
if (reading_reply) {
|
||||
reading_reply = 0;
|
||||
req = current_req;
|
||||
req->reply_len = reply_len;
|
||||
req->complete = 1;
|
||||
current_req = req->next;
|
||||
if (req->done)
|
||||
(*req->done)(req);
|
||||
} else if (reply_len && autopoll_devs)
|
||||
adb_input(reply_buf, reply_len, 0);
|
||||
|
||||
macii_state = idle;
|
||||
|
||||
/* SRQ seen before, initiate poll now */
|
||||
if (srq_asserted)
|
||||
macii_queue_poll();
|
||||
|
||||
if (current_req)
|
||||
macii_start();
|
||||
else if (need_autopoll())
|
||||
macii_autopoll(autopoll_devs);
|
||||
|
||||
if (macii_state == idle)
|
||||
via[B] = (via[B] & ~ST_MASK) | ST_IDLE;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
entered--;
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
@@ -1358,7 +1358,7 @@ __acquires(bitmap->lock)
|
||||
sector_t chunk = offset >> bitmap->chunkshift;
|
||||
unsigned long page = chunk >> PAGE_COUNTER_SHIFT;
|
||||
unsigned long pageoff = (chunk & PAGE_COUNTER_MASK) << COUNTER_BYTE_SHIFT;
|
||||
sector_t csize;
|
||||
sector_t csize = ((sector_t)1) << bitmap->chunkshift;
|
||||
int err;
|
||||
|
||||
if (page >= bitmap->pages) {
|
||||
@@ -1367,6 +1367,7 @@ __acquires(bitmap->lock)
|
||||
* End-of-device while looking for a whole page or
|
||||
* user set a huge number to sysfs bitmap_set_bits.
|
||||
*/
|
||||
*blocks = csize - (offset & (csize - 1));
|
||||
return NULL;
|
||||
}
|
||||
err = md_bitmap_checkpage(bitmap, page, create, 0);
|
||||
@@ -1375,8 +1376,7 @@ __acquires(bitmap->lock)
|
||||
bitmap->bp[page].map == NULL)
|
||||
csize = ((sector_t)1) << (bitmap->chunkshift +
|
||||
PAGE_COUNTER_SHIFT);
|
||||
else
|
||||
csize = ((sector_t)1) << bitmap->chunkshift;
|
||||
|
||||
*blocks = csize - (offset & (csize - 1));
|
||||
|
||||
if (err < 0)
|
||||
|
||||
@@ -44,7 +44,6 @@
|
||||
*/
|
||||
|
||||
#include <linux/blkdev.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/kthread.h>
|
||||
#include <linux/raid/pq.h>
|
||||
#include <linux/async_tx.h>
|
||||
@@ -6294,6 +6293,9 @@ static void raid5d(struct md_thread *thread)
|
||||
int batch_size, released;
|
||||
unsigned int offset;
|
||||
|
||||
if (test_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags))
|
||||
break;
|
||||
|
||||
released = release_stripe_list(conf, conf->temp_inactive_list);
|
||||
if (released)
|
||||
clear_bit(R5_DID_ALLOC, &conf->cache_state);
|
||||
@@ -6330,18 +6332,7 @@ static void raid5d(struct md_thread *thread)
|
||||
spin_unlock_irq(&conf->device_lock);
|
||||
md_check_recovery(mddev);
|
||||
spin_lock_irq(&conf->device_lock);
|
||||
|
||||
/*
|
||||
* Waiting on MD_SB_CHANGE_PENDING below may deadlock
|
||||
* seeing md_check_recovery() is needed to clear
|
||||
* the flag when using mdmon.
|
||||
*/
|
||||
continue;
|
||||
}
|
||||
|
||||
wait_event_lock_irq(mddev->sb_wait,
|
||||
!test_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags),
|
||||
conf->device_lock);
|
||||
}
|
||||
pr_debug("%d stripes handled\n", handled);
|
||||
|
||||
|
||||
@@ -863,8 +863,7 @@ int cec_transmit_msg_fh(struct cec_adapter *adap, struct cec_msg *msg,
|
||||
*/
|
||||
mutex_unlock(&adap->lock);
|
||||
wait_for_completion_killable(&data->c);
|
||||
if (!data->completed)
|
||||
cancel_delayed_work_sync(&data->work);
|
||||
cancel_delayed_work_sync(&data->work);
|
||||
mutex_lock(&adap->lock);
|
||||
|
||||
/* Cancel the transmit if it was interrupted */
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user