Merge msm-5.4 (158801d
) into msm-5.10
* refs/heads/msm-5.4: serial: msm_geni_serial: Register normal suspend instead of suspend_noirq mm: page_alloc: avoid fatal sig check for GFP_NOFS msm-perf: Added node for perf notification defconfig: lahaina-qgki: Enable CONFIG_PSTORE_PMSG msm: kgsl: Sending KGSL events to msm perf module defconfig: enable memlat hw log driver drivers: soc: qcom: add initial support for rimps logging defconfig: enable RIMPS memlat drivers drivers: soc: qcom: add initial support of rimps memlat interface arm64: defconfig: Enable misc config for debugging for Holi arm64: defconfig: Enable configs related to Watchdog in Holi power: step-chg-jeita: Add support to tune hysteresis for jeita-fcc-step clk: qcom: lahaina: Add runtime_pm support clk: qcom: clk-debug: Resume devices before accessing HW clk: qcom: Add functions to suspend or resume a clk_regmap's device clk: qcom: Add common runtime_pm support soc: qcom: pmic_glink: add an error log when pmic_glink_write fails cnss2: Allow cold boot calibration skip for debug dt-bindings: iio: add smb139x IIO channels dt-bindings: iio: update pm8350b ADC channel list msm; kgsl: Correct secure pagetable pointer check drivers: soc: qcom: add initial support for memlat scmi client driver Firmware: arm_scmi: add initial support for memlat vendor protocol soc: qcom: mem-buf: Fix memory leak in mem_buf_alloc() defconfig: Enable Qcom Rimps mailbox driver soc: qcom: Add support for RIMPS mailbox controller haven: Add support for the MEM_ACCEPTED notification msm: kgsl: Add gcc_bimc_gpu_axi clock to smmu clock voteable list power: smb1398: Update min-ilim setting to 1A msm: cvp: update hbb bit based on ddr type for shima and lahaina defconfig: lahaina: Enable USB_BAM and USB_F_QDSS for GKI usb: gadget: qdss: Use usb_ep_autoconfig() instead of ss() variant media: v4l2-core: remove the unused code usb: dwc3: dwc3-msm: Export msm_data_fifo_config() for QDSS platform: msm: Export usb_bam symbols for module compilation usb: gadget: qdss: Fix overlapping comparison operators mem-offline: add a knob to allow to skip sending RPM/AOP msg dcc_v2: fix 1 write 1 read register configuration fail issue defconfig: Enable smcinvoke on haven staging: android: ion: Remove system heap aliasing scsi: ufs-qcom: lane validity after link-startup soc: qcom: Replace SPCOM channel owner pid with tgid defconfig: Enable SMB1398 driver for holi power: supply: smb1398: Add support to make SMB1398 driver GKI compliant scsi: ufs: Add fixup_dev_quirks vops on qcom platform coresight: stm: Remove debug fuse status check for stm power: supply: qcom: Fix SMB5 and QG IIO device names memshare: Use carveouts for memory sharing usecases mm/Kconfig: Default Enable LIMIT_MOVABLE_ZONE_ALLOC iommu: Default Enable DMA_CONFIGURE_ALIGNMENT usb: phy: qusb2: Update tune params based on efuse value msm: cvp: fix for arbitrary command packet sending to CVP FW arm: defconfig: Enable STM_PROTO_BASIC for holi soc: qcom: Enable slabowner support in minidump irqchip: gicv3: add hardware irq print in gic_show_resume_irq() soc: qcom: Enable pageowner support in minidump arm64: defconfig: Enable PRIORITIZE_OOM_TASKS for holi power: smblite: Add snapshot of SMBLITE driver and its dependencies hwmon: qti_amoled_ecm: add debug log for nvmem writes hwmon: qti_amoled_ecm: Fix initial value for ECM_WRITE_TO_SDAM cnss2: Call mhi_device_get_sync() if timeout requested is 0 usb: dwc3: Fix enumeration failure with reset during transfers clk: qcom: clk-rpmh: Add div_clk1 for Lahaina dt-bindings: clock: Add rpmh_div_clk1 clock msm: kgsl: Skip state change in idle check, if requested state is NONE arm64: defconfig: Enable misc config for debugging for Lahaina/Shima power: battery: Fix typo for cp_slave channel name msm: kgsl: Show max gpu temperature msm: kgsl: Fix permission in /sys/kernel/gpu/ clk: qcom: smd-rpm: Add panic notifier in HOLI dt-bindings: clock: qcom: Add bimc_freq_log id for HOLI input: qcom-hv-haptics: read CAL_TLRA_CL_STS from SDAM after boot up arm64: defconfig: add trusted touch support to GKI defconfig arm64: defconfig: Add trusted touch config for genericarmv8 mhi: core: Remove verbose log from threaded interrupt handler cnss2: Add cnss_smmu_unmap API input: touchscreen: focaltech: Add trusted touch support arch: arm64: Enable thermal emergency poweroff delay drivers: thermal: notify at least one thermal zone if no trips are violated soc: qcom: msm_perf: fix error checks lpm-levels: Wakeup the isolated core for new PMQoS update msm: adsprpc: Free dma handles in RPC call with no parameters mmc: sdhci-msm: Add suspend late cb rpmsg: glink: reset read/write index after ssr msm-perf: Kgsl events collection for perf input: touchscreen: mxt: reset IC before read again sched/walt: Improve the scheduler msm: kgsl: Make kgsl_iommu_clocks list dynamic sched/fair: Improve the scheduler input: qcom-hv-haptics: Disable haptics module during suspend scsi: ufs: Put hba into LPM during clk gating soc: qcom: minidump: Add md_get_region function soc: qcom: Enable slabinfo support in minidump soc: qcom: Enable meminfo support in minidump defconfig: msm: Enable QCOM_INITIAL_LOGBUF for lahaina defconfig: msm: Enable irq stats for lahaina arm64: defconfig: Enable L3 interconnect driver for Holi defconfig: msm: Enable minidump ftrace and panic registration input: touchscreen: mxt: configure proper sleep state soc: qcom: Add module info registration to minidump soc: qcom: Dump cpu registers content during panic soc: qcom: Add minidump collection on panic soc: qcom: Enable ftrace support in minidump mmc: sdhci-msm: Disable always-on LDO's when eMMC is absent soc: qcom: pil: track secure pages used by pil platform: msm: free the codec node after disconnect backlight: qcom-spmi-wled: Force HFRC off when WLED is disabled binder: update low_latency selection for binder transactions interconnect: qcom: Enable QoS for Shima dt-bindings: iio: Add IIO channel numbers for SMB1398 iio: adc: Correct smb1398 scaling function soc: qcom: add disable/enable SPSS SSR ioctl() arm64: defconfig: Enable cpufreq hw debug for HOLI and SHIMA thermal: qcom-spmi-temp-alarm: enable stage 2 shutdown when required mailbox: msm_qmp: Add msgram readback cpufreq: qcom: Add support for performance lock feature soc: qcom: Add support to dump initial bootup logs soc: wdog: implement irq tracker to get stats dt-bindings: msm: Add bindings for MFHDR fuse support power: qpnp-smb5: Update the interrupt handler names mem-offline: improve the effective utilization of movable zone scsi: ufs-qcom: configure ufs clocks core memory usb: pd: Clear send_get_status flag in protocol reset Minidump: Add registration/update support for suspend context soc: qcom: Handle device hangs during suspend/resume soc: qcom: Move watchdog suspend/resume callbacks to syscore ops Minidump: Add support for cpu current stack pstore: Register pstore reserved memory into Minidump Minidump: Add update region support for minidump regions soc: qcom: eud: Do not fail the EUD probe for secure device mmc: sdhci-msm: Add the missing check in sdhci_msm_check_power_status icnss: Allow register/unregister driver execution in serial manner crypto: Fix possible stack out of bound error soc: qcom: Register irq stacks with minidump mmc: sdhci_msm: Allow turning off SD card's power during initialization clk: qcom: Add BIMC logging support during kernel panic power: qpnp-qg: Do not round-up/down battery SOC in BASS power: qpnp-qg: Battery-temp based ESR enable power: qpnp-qg: Allow signed values for Rconn property power: qpnp-qg: Add the SDAM flash-ocv offset power: battery: Add support to enable PPS to work in CV mode power: qpnp-smb5: Do not set BC1P2_START_ON_CC on DAM power: smb5-lib: Report the CURRENT_MAX as 1A in CC-mode power: smb5-lib: Add support for microusb usb: dwc3: gadget: improve several ipc log pci: msm: Read clkreq override bit irrespective of rpmsg_send status Revert "msm: pcie: add support to manage PCIe PHY PLL block" cnss2: Set CNSS PM ops to PM domain cnss2: Increase prealloc table to satisfy latest driver requirement qtee_shmbridge: register bridges for CMA heaps smcinvoke: add support of secure memory objects clk: qcom: smd-rpm: Add support for clock handoff clk: qcom: clk-smd-rpm: Remove support for LN_BB_CLK3 for Holi soc: qcom: watchdog: Add MODULE_LICENSE and MODULE_DESCRIPTION dt-bindings: clock: Add support for BIMC clock arm64: defconfig: Enable QCOM_SPMI_WLED driver for holi backlight: qcom-spmi-wled: Convert power_supply properties to iio backlight: qcom-spmi-wled: Add support for QCOM SPMI WLED driver input: misc: qcom-hv-haptics: disable auto resonance for FIFO streaming clk: qcom: gcc-lahaina: Keep gcc_ddrss_gpu_axi_clk always on usb: typec: ucsi: check partner changed flag during notification msm: adsprpc: remove error log in case of rpmsg_send failures msm: cvp: All CVP load treated as real-time power: supply: qti_battery_charger: Fix FCC configuration qcom: scm: Milestone call to enable kernel memory protection msm: kgsl: Capture gpu globals in hwsched snapshot msm: kgsl: Add a6xx_hwsched_snapshot function msm: kgsl: Add hwsched based reset and recovery msm: kgsl: Add suspend and resume for hwsched driver msm: kgsl: Fix check for oversized HFI messages msm: kgsl: Get rid of a6xx_hfi_send_req function msm: kgsl: Add user command profiling with hw scheduling msm: kgsl: Add support for kernel profiling in hw scheduler msm: kgsl: Add the f2h daemon msm: kgsl: Assign dispatch queue based on context priority msm: kgsl: Modify the a6xx interrupt mask for hwsched msm: kgsl: Add the hwsched dispatcher msm: kgsl: Add context unregister HFI defconfig: lahaina: Fix INTERCONNECT_TEST being disabled for QGKI cnss2: Add changes to handle MHI power up failure properly msm: kgsl: Add support for multiple ack waiters msm: kgsl: Dispatch submissions using hwscheduling msm: kgsl: Add asynchronous processing of acks msm: kgsl: Allow sending CP INIT via GMU msm: kgsl: Add memalloc hfi support msm: kgsl: Add the hwsched platform driver power: smb1398: Update win-uv threshold to 10mV power: smb1398: Do not disable FP_FET during IREV condition interconnect: qcom: Enable QoS for Holi icc: dt-bindings: Update endpoint IDs for interconnects for HOLI msm: adsprpc: block untrusted apps from creating multiple sessions input: touchscreen: synaptics_dsx: add new touch driver proc/meminfo: include offlined region for mem total PM / devfreq: qoslat: add support for multiple clients msm: adsprpc: send non-zero message PID for process kill message soc: qcom: secure_buffer: Add support for qcom,vmid-cp-camera-preview-ro msm: kgsl: Add support for split pagetables msm: kgsl: Toggle loop_en while disabling gx gdsc msm: kgsl: Use a token address for memstore USB: Move MBIM interface related IOCTLs definition to uapi directory arm64: defconfig: Enable CONFIG_QCOM_QFPROM_SYSFS on Holi iommu/arm-smmu: Remove [alloc/free]_pages_exact usage iommu/arm-smmu: Deprecate msm_iommu_flush ops msm: kgsl: Enable IFPC for A660 GPU variant drivers: lpm-levels: Update the RIMPS register pasring from DT interconnect: qcom: Add QoS config support for BIMC masters clk: qcom: clk-debug: Detach the clock request from syscon regmap soc: qcom: eud: Update the state of extcon too during probe arm64: defconfig: Enable CONFIG_QCOM_QFPROM_SYSFS on Lahaina/Shima msm: kgsl: Define RBBM_SW_RESET_CMD for a6xx targets BACKPORT: FROMLIST: firmware_loader: fix memory leak for paged buffer defconfig: holi: Enable Incremental FS support defconfig: msm: Enable ARCH_SHIMA for genericarmv8 serial: msm_geni_serial: Reduce nos HSUART port supported input: qcom-hv-haptics: add LRA impedance detection support spmi: spmi-pmic-arb-debug: replace ioremap_resource with ioremap defconfig: lahaina-gki: enable QPNP PBS driver power: qpnp-qg: Add support for SMB-sensing for SMB1395/6 power: qpnp-qg: Fix the sleep_length value in process_suspend scsi: ufs: Increase ah8 idle to 10ms arm64: defconfig: Enable vWDT support to SVM msm: ipa: IPAv5 updates iommu/io-pgtable: Add support for io-pgtable accounting msm: kgsl: Add gpu_frequency trace during SLUMBER entry and exit msm: kgsl: Add gpu_frequency tracepoint to power trace system msm: kgsl: Drive FAL QACTIVE signal high before GMU boot clk: qcom: debugcc: Update clk measure for gcc clocks for HOLI defconfig: lahaina: Enable F2FS_CHECK_FS for lahaina BACKPORT: cfg80211: Adjust 6 GHz frequency to channel conversion power: smb5-lib: Use the unlocked version votable for FV drivers: coresight: Add interrupt service routine for apss tgu defconfig: gki: Enable power delivery on Holi usb: pd: Fix cyclic dependency of pd modules build.config: Add qnoc-qos.ko module for Lahaina interconnect: qcom: Build qnoc-qos as module Revert "dwc3-msm: Add support to vote USB FORCE_MEM_CORE_ON" ABI: Add regmap_mmio_detach_clk API to QCOM whitelist mfd: qcom-i2c-pmic: Reduce the stat-toggle delay mfd: qcom-i2c-pmic: Toggle STAT pin at init arm64: defconfig: enable debugging of cpuidle governor in SVM ANDROID: db845c_gki.fragment: Remove CONFIG_USB_NET_AX88* ANDROID: GKI: enable CONFIG_MTK_TIMER ANDROID: ABI: Update ABI description after symbol list updates ANDROID: ABI: Added symbols for allwinner power: supply: qti_battery_charger: Change wireless power supply type ANDROID: ABI: Update allowed list for QCOM mhi: core: Check for RDDM cookie set by device to indicate readiness mhi: core: Move to error state if firmware could not be loaded UPSTREAM: scsi: ufs: ufs-mediatek: Modify the minimum RX/TX lane count to 2 UPSTREAM: scsi: ufs: Fix possible infinite loop in ufshcd_hold UPSTREAM: scsi: ufs-mediatek: Fix incorrect time to wait link status UPSTREAM: scsi: ufs-mediatek: Apply DELAY_AFTER_LPM quirk to Micron devices UPSTREAM: scsi: ufs: Introduce device quirk "DELAY_AFTER_LPM" UPSTREAM: scsi: ufs-mediatek: Prevent LPM operation on undeclared VCC BACKPORT: scsi: ufs-mediatek: Add inline encryption support ANDROID: Update ABI ANDROID: net: enable wireless core features with GKI_LEGACY_WEXT_ALLCONFIG clk: qcom: gcc-shima: Update CPUSS AHB clock frequency to 19.2MHz Revert "binder: Prevent context manager from incrementing ref 0" cnss2: Disable LPASS full power collapse on DRV suspend pci: msm: Add support to send vote against DRV PC power: supply: qcom: Update SMB5 charger properties for GKI compliance dt-bindings: iio: Add PSY_IIO_TYPEC_ACCESSORY_MODE for SMB5 sched/preemptirq: Use restricted trace hooks FROMLIST: ufs: skip manual flush for write booster Revert "binder: Prevent context manager from incrementing ref 0" byte-cntr: Add mutex_unlock when rwp_offset is invalid defconfig: Avoid disabling temp_alarm driver for holi msm: kgsl: Add GPU minimum bandwidth vote state regulator: rpm-smd: Update sync_state call arm64: defconfig: Enable panic on corruption for holi i2c-msm-geni: Add log to print the i2c bus frequency clk: qcom: gdsc-regulator: Update support to skip GDSC disable BACKPORT: cfg80211: Squash of all 6GHz changes ASoC: soc-pcm: Fix playback shutdown sequence interconnect: qcom: Add sync_state for Shima cnss2: Remove unnecessary logs for Bus BW voting msm: kgsl: Set the bit mask for read-modify-write of GMU registers ANDROID: ion: export some ion symbols serial: msm_geni_serial: Log CTS and RX IO line status interconnect: qcom: Add support for utility factor defconfig: arm64: Enable data configs arm64: defconfig: Remove SDCARD_FS for holi interconnect: qcom: sdxlemur: Remove stub functions ANDROID: gki_defconfig: enable CONFIG_ARCH_SUNXI. FROMLIST: clk: sunxi-ng: add support for the Allwinner A100 CCU FROMLIST: pinctrl: sunxi: add support for the Allwinner A100 pin controller sched/walt: Improve the scheduler NFC: Fix NFC firmware download issue soc: jtagv8: Correct the sequence of restoring the etm registers drivers: soc: qcom: update sct table for LLCC on Shima ANDROID: vendor_hooks: Add new android vendor hooks for ipi stop arm: defconfig: Enable gcc clock driver for sdxlemur msm: cvp: enable cache op by default msm: cvp: Print detail NOC error info defconfig: lahaina-gki: enable PMIC PON log parser driver soc: qcom: add PMIC PON log parser driver cnss2: Set PCIe link state in proper state during resume defconfig: sdxlemur: Enable drivers required for PMIC devices cnss2: Add support to use new ramdump APIs ANDROID: kernel: cgroup: cpuset: Clear cpus_requested for empty buf ANDROID: cpuset: Make cpusets restore on hotplug cpuidle: record state entry failed statistics msm: adsprpc: store glink transaction history in global buffer cnss2: Setup interconnect path for bandwidth voting defconfig: msm: Enable debug module info config for Lahaina/Shima Kconfig.debug: module: Add debug config to debug modules ANDROID: Incremental fs: fix magic compatibility again usb: pd: Add support for IIO based properties pinctrl: qcom: Update reserved GPIOs for Shima Delay opening slimbus ports for A2DP for Apache usb: pd: Add support of qpnp-pdphy and policy_engine drivers Linux 5.4.61 KVM: arm64: Only reschedule if MMU_NOTIFIER_RANGE_BLOCKABLE is not set KVM: Pass MMU notifier range flags to kvm_unmap_hva_range() xen: don't reschedule in preemption off sections mm/hugetlb: fix calculation of adjust_range_if_pmd_sharing_possible do_epoll_ctl(): clean the failure exits up a bit epoll: Keep a reference on files added to the check list efi: add missed destroy_workqueue when efisubsys_init fails powerpc/pseries: Do not initiate shutdown when system is running on UPS net: dsa: b53: check for timeout hv_netvsc: Fix the queue_mapping in netvsc_vf_xmit() net: gemini: Fix missing free_netdev() in error path of gemini_ethernet_port_probe() net: ena: Prevent reset after device destruction bonding: fix active-backup failover for current ARP slave ARM64: vdso32: Install vdso32 from vdso_install afs: Fix NULL deref in afs_dynroot_depopulate() RDMA/bnxt_re: Do not add user qps to flushlist Fix build error when CONFIG_ACPI is not set/enabled: efi: avoid error message when booting under Xen kconfig: qconf: fix signal connection to invalid slots kconfig: qconf: do not limit the pop-up menu to the first row Revert "scsi: qla2xxx: Disable T10-DIF feature with FC-NVMe during probe" kvm: x86: Toggling CR4.PKE does not load PDPTEs in PAE mode kvm: x86: Toggling CR4.SMAP does not load PDPTEs in PAE mode vfio/type1: Add proper error unwind for vfio_iommu_replay() ASoC: intel: Fix memleak in sst_media_open ASoC: msm8916-wcd-analog: fix register Interrupt offset s390/ptrace: fix storage key handling s390/runtime_instrumentation: fix storage key handling bonding: fix a potential double-unregister can: j1939: add rxtimer for multipacket broadcast session can: j1939: abort multipacket broadcast session when timeout occurs can: j1939: cancel rxtimer on multipacket broadcast session complete can: j1939: fix support for multipacket broadcast message bonding: show saner speed for broadcast mode net: fec: correct the error path for regulator disable in probe i40e: Fix crash during removing i40e driver i40e: Set RX_ONLY mode for unicast promiscuous on VLAN can: j1939: transport: add j1939_session_skb_find_by_offset() function can: j1939: transport: j1939_simple_recv(): ignore local J1939 messages send not by J1939 stack can: j1939: fix kernel-infoleak in j1939_sk_sock2sockaddr_can() bpf: sock_ops sk access may stomp registers when dst_reg = src_reg ASoC: q6routing: add dummy register read/write function ASoC: q6afe-dai: mark all widgets registers as SND_SOC_NOPM spi: stm32: fixes suspend/resume management netfilter: nf_tables: nft_exthdr: the presence return value should be little-endian ext4: don't allow overlapping system zones ext4: fix potential negative array index in do_split() fs/signalfd.c: fix inconsistent return codes for signalfd4 alpha: fix annotation of io{read,write}{16,32}be() xfs: Fix UBSAN null-ptr-deref in xfs_sysfs_init tools/testing/selftests/cgroup/cgroup_util.c: cg_read_strcmp: fix null pointer dereference media: camss: fix memory leaks on error handling paths in probe virtio_ring: Avoid loop when vq is broken in virtqueue_poll scsi: libfc: Free skb in fc_disc_gpn_id_resp() for valid cases cpufreq: intel_pstate: Fix cpuinfo_max_freq when MSR_TURBO_RATIO_LIMIT is 0 swiotlb-xen: use vmalloc_to_page on vmalloc virt addresses ceph: fix use-after-free for fsc->mdsc jffs2: fix UAF problem drm/ttm: fix offset in VMAs with a pg_offs in ttm_bo_vm_access xfs: fix inode quota reservation checks svcrdma: Fix another Receive buffer leak m68knommu: fix overwriting of bits in ColdFire V3 cache control MIPS: Fix unable to reserve memory for Crash kernel Input: psmouse - add a newline when printing 'proto' by sysfs media: vpss: clean up resources in init rtc: goldfish: Enable interrupt in set_alarm() when necessary media: budget-core: Improve exception handling in budget_register() scsi: target: tcmu: Fix crash in tcmu_flush_dcache_range on ARM scsi: ufs: Add DELAY_BEFORE_LPM quirk for Micron devices opp: Enable resources again if they were disabled earlier kthread: Do not preempt current task if it is going to call schedule() drm/amd/display: fix pow() crashing when given base 0 drm/amd/display: Fix EDID parsing after resume from suspend drm/amdgpu/display: use GFP_ATOMIC in dcn20_validate_bandwidth_internal scsi: zfcp: Fix use-after-free in request timeout handlers jbd2: add the missing unlock_buffer() in the error path of jbd2_write_superblock() ext4: fix checking of directory entry validity for inline directories RDMA/hfi1: Correct an interlock issue for TID RDMA WRITE request mm, page_alloc: fix core hung in free_pcppages_bulk() mm: include CMA pages in lowmem_reserve at boot uprobes: __replace_page() avoid BUG in munlock_vma_page() kernel/relay.c: fix memleak on destroy relay channel romfs: fix uninitialized memory leak in romfs_dev_read() spi: Prevent adding devices below an unregistering controller can: j1939: socket: j1939_sk_bind(): make sure ml_priv is allocated can: j1939: transport: j1939_session_tx_dat(): fix use-after-free read in j1939_tp_txtimer() ALSA: hda/realtek: Add quirk for Samsung Galaxy Book Ion ALSA: hda/realtek: Add quirk for Samsung Galaxy Flex Book btrfs: add wrapper for transaction abort predicate btrfs: return EROFS for BTRFS_FS_STATE_ERROR cases btrfs: don't show full path of bind mounts in subvol= btrfs: export helpers for subvolume name/id resolution bcache: avoid nr_stripes overflow in bcache_device_init() khugepaged: adjust VM_BUG_ON_MM() in __khugepaged_enter() khugepaged: khugepaged_test_exit() check mmget_still_valid() perf probe: Fix memory leakage when the probe point is not found gfs2: Never call gfs2_block_zero_range with an open transaction gfs2: Improve mmap write vs. punch_hole consistency drm/vgem: Replace opencoded version of drm_gem_dumb_map_offset() kbuild: support LLVM=1 to switch the default tools to Clang/LLVM kbuild: replace AS=clang with LLVM_IAS=1 kbuild: remove AS variable kbuild: remove PYTHON2 variable x86/boot: kbuild: allow readelf executable to be specified net: wan: wanxl: use $(M68KCC) instead of $(M68KAS) for rebuilding firmware net: wan: wanxl: use allow to pass CROSS_COMPILE_M68k for rebuilding firmware Documentation/llvm: fix the name of llvm-size Documentation/llvm: add documentation on building w/ Clang/LLVM cnss2: set high 32bit of MSI addr only when device is 64 bit capable msm: kgsl: Make ACD QMP message sending failure non fatal pci: msm: Configure L23 ready poll timeout using sysfs ANDROID: ABI: Added symbols for db845c and hikey960 ANDROID: Update abi_gki_aarch64_hikey960 ANDROID: Update abi_gki_aarch64_db845c ANDROID: build.config.hikey960: Set KMI_SYMBOL_LIST ANDROID: build.config.d845c: Set KMI_SYMBOL_LIST ANDROID: hikey960_gki.fragment: Remove unused CONFIG_SERIAL_8250_DW drivers: thermal: sdpm: Add support for regulator notification BACKPORT: FROMLIST: clk: Export clk_register_composite ANDROID: power: Export log_{suspend_abort,abnormal_wakeup}_reason arm64: defconfig: Enable selinux config soc: qcom: ramdump: Fix 'complete ramdump' collection cpuidle: menu: trace menu governor decisions debug-pagealloc: Panic on pagealloc corruption kernel/lib: add additional debug capabilities for data corruption debug-pagealloc: print physical address for detected corruption msm: kgsl: Fix maximum allowed power level for A660 msm: kgsl: Enable Adaptive Clock Distribution feature for A660 v2 msm: kgsl: Include data from all power levels in ACD table kgsl: msm: Correctly check hardware idle status for a619_holi target i2c: i2c-msm-geni: Avoid usage of dma chan_id in case of GSI transfer ANDROID: ABI: add already existing __arm_smccc_smc to unisoc mmc: sdhci-msm: Add support for ice core clock arm64: defconfig: Add qcom debug config for perf build in HOLI usb: gadget: u_ether: Add skb check in eth_start_xmit cfg80211: Indicate support for AKM advertisement per interface cnss2: Trigger recovery when link is down before force RDDM cnss2: Add prefix to firmware name based on device ID sched/cpupri: skip isolated cpus Revert "input: qcom-hv-haptics: read CAL_TLRA_CL_STS from SDAM after boot up" cnss2: Donot assert if BDF download fails on reboot leds: qti-flash: Show on_time and off_time in microseconds soc: qcom: hyp_core_ctl: Catch uninitialized freq QOS object kernel: crypto: Possible null pointer dereference ANDROID: ion: Remove unused local variable 'vaddr' ANDROID: ion: remove kmap from begin[end]_cpu_access scsi: ufs: Remove ufshcd-qti driver interconnect: qcom: Add sync_state for Holi sched: Cleanup allowed cpus in task placement arm64: defconfig: Enable DYNAMIC_DEBUG for holi target Revert "mmc: sdhci-msm: skip eMMC slot probe if eMMC isn't a bootdevice" msm: kgsl: Add handler for GPC interrupt on A6xx GPU ANDROID: GKI: Update abi_gki_aarch64_exynos iommu: skip iommu_tlb_sync in iommu_unmap() ANDROID: tty: fix tty name overflow Revert "tracing: Move pipe reference to trace array instead of current_tracer" Revert "ANDROID: Revert: Merge 5.4.60 into android11-5.4" msm_rtb: Evaluate parameter only once in reads/writes clk: qcom: shima: Fix stuck at off warnings during probe defconfig: Cleanup of wlan related config flags for holi arm64: defconfig: enable CONFIG_DEBUG_PREEMPT for debug config defconfig: Enable SMB5 and QG drivers for holi power: supply: qg: Add support to make QG driver GKI compliant dt-bindings: iio: add IIO channel IDs for QG device clk: qcom: gcc-sdxlemur: Add PCIe and USB3 clock muxes dt-bindings: clk: Add PCIe pipe and USB3 pipe clocks power: supply: qcom: Add support to make SMB5 charger GKI compliant dt-bindings: iio: Add IIO channel numbers for QPNP-SMB5 charger scsi: ufs-qcom: Increase ah8 timeout to 5ms defconfig: Enable CONFIG_VMSPLIT_3G_OPT ANDROID: arm64: add __va_function cnss2: Use correct timer for forcing FW assert defconfig: lahaina: Disable console on GKI builds mmc: core: Fix uninitialized clock scaling's freq table soc: mmrm: Multimedia Resource Manager interface ANDROID: ABI: fix ABI breakage ANDROID: sched: add vendor hook for correcting cpu capacity ANDROID: Revert: Merge 5.4.60 into android11-5.4 arm64: defconfig: enable autosleep and wakelock configs haven: configure dbl and msgq interrupts as wakeup capable ANDROID: sched: Use normal vendor hook in scheduler tick ANDROID: Add vendor hooks to the scheduler Linux 5.4.60 drm/amd/display: dchubbub p-state warning during surface planes switch drm/amdgpu: Fix bug where DPM is not enabled after hibernate and resume drm: fix drm_dp_mst_port refcount leaks in drm_dp_mst_allocate_vcpi drm: Added orientation quirk for ASUS tablet model T103HAF drm/panfrost: Use kvfree() to free bo->sgts arm64: dts: marvell: espressobin: add ethernet alias khugepaged: retract_page_tables() remember to test exit sh: landisk: Add missing initialization of sh_io_port_base perf/x86/rapl: Fix missing psys sysfs attributes tools build feature: Quote CC and CXX for their arguments perf bench mem: Always memset source before memcpy ALSA: echoaudio: Fix potential Oops in snd_echo_resume() crypto: algif_aead - fix uninitialized ctx->init mfd: dln2: Run event handler loop under spinlock i2c: iproc: fix race between client unreg and isr test_kmod: avoid potential double free in trigger_config_run_type() fs/ufs: avoid potential u32 multiplication overflow fs/minix: remove expected error message in block_to_path() fs/minix: fix block limit check for V1 filesystems fs/minix: set s_maxbytes correctly nfs: Fix getxattr kernel panic and memory overflow net: qcom/emac: add missed clk_disable_unprepare in error path of emac_clks_phase1_init drm/vmwgfx: Fix two list_for_each loop exit tests drm/vmwgfx: Use correct vmw_legacy_display_unit pointer recordmcount: Fix build failure on non arm64 Input: sentelic - fix error return when fsp_reg_write fails x86/tsr: Fix tsc frequency enumeration bug on Lightning Mountain SoC md-cluster: Fix potential error pointer dereference in resize_bitmaps() watchdog: initialize device before misc_register nfs: nfs_file_write() should check for writeback errors scsi: lpfc: nvmet: Avoid hang / use-after-free again when destroying targetport openrisc: Fix oops caused when dumping stack libnvdimm/security: ensure sysfs poll thread woke up and fetch updated attr libnvdimm/security: fix a typo clk: bcm2835: Do not use prediv with bcm2711's PLLs ubifs: Fix wrong orphan node deletion in ubifs_jnl_update|rename nfs: ensure correct writeback errors are returned on close() i2c: rcar: avoid race when unregistering slave tools build feature: Use CC and CXX from parent pwm: bcm-iproc: handle clk_get_rate() return clk: clk-atlas6: fix return value check in atlas6_clk_init() clk: qcom: gcc-sdm660: Fix up gcc_mss_mnoc_bimc_axi_clk i2c: rcar: slave: only send STOP event when we have been addressed iommu/vt-d: Enforce PASID devTLB field mask clk: qcom: clk-alpha-pll: remove unused/incorrect PLL_CAL_VAL clk: qcom: gcc: fix sm8150 GPU and NPU clocks iommu/omap: Check for failure of a call to omap_iommu_dump_ctx selftests/powerpc: ptrace-pkey: Don't update expected UAMOR value selftests/powerpc: ptrace-pkey: Update the test to mark an invalid pkey correctly selftests/powerpc: ptrace-pkey: Rename variables to make it easier to follow code clk: actions: Fix h_clk for Actions S500 SoC dm rq: don't call blk_mq_queue_stopped() in dm_stop_queue() gpu: ipu-v3: image-convert: Wait for all EOFs before completing a tile gpu: ipu-v3: image-convert: Combine rotate/no-rotate irq handlers crypto: caam - Remove broken arc4 support mmc: renesas_sdhi_internal_dmac: clean up the code for dma complete RDMA/counter: Allow manually bind QPs with different pids to same counter RDMA/counter: Only bind user QPs in auto mode devres: keep both device name and resource name in pretty name crypto: af_alg - Fix regression on empty requests USB: serial: ftdi_sio: clean up receive processing USB: serial: ftdi_sio: make process-packet buffer unsigned selftests/bpf: test_progs use another shell exit on non-actions selftests/bpf: Test_progs indicate to shell on non-actions IB/uverbs: Set IOVA on IB MR in uverbs layer media: rockchip: rga: Only set output CSC mode for RGB input media: rockchip: rga: Introduce color fmt macros and refactor CSC mode logic RDMA/ipoib: Fix ABBA deadlock with ipoib_reap_ah() RDMA/ipoib: Return void from ipoib_ib_dev_stop() platform/chrome: cros_ec_ishtp: Fix a double-unlock issue mtd: rawnand: fsl_upm: Remove unused mtd var octeontx2-af: change (struct qmem)->entry_sz from u8 to u16 mfd: arizona: Ensure 32k clock is put on driver unbind and error crypto: algif_aead - Only wake up when ctx->more is zero pinctrl: ingenic: Properly detect GPIO direction when configured for IRQ orangefs: get rid of knob code... drm/imx: imx-ldb: Disable both channels for split mode in enc->disable() remoteproc: qcom_q6v5_mss: Validate modem blob firmware size before load remoteproc: qcom_q6v5_mss: Validate MBA firmware size before load remoteproc: qcom: q6v5: Update running state before requesting stop perf intel-pt: Fix duplicate branch after CBR perf intel-pt: Fix FUP packet state module: Correctly truncate sysfs sections output pseries: Fix 64 bit logical memory block panic ceph: handle zero-length feature mask in session messages ceph: set sec_context xattr on symlink creation watchdog: f71808e_wdt: clear watchdog timeout occurred flag watchdog: f71808e_wdt: remove use of wrong watchdog_info option watchdog: f71808e_wdt: indicate WDIOF_CARDRESET support in watchdog_info.options tracing: Move pipe reference to trace array instead of current_tracer tracing: Use trace_sched_process_free() instead of exit() for pid tracing tracing/hwlat: Honor the tracing_cpumask kprobes: Fix NULL pointer dereference at kprobe_ftrace_handler ftrace: Setup correct FTRACE_FL_REGS flags for module mm/memory_hotplug: fix unpaired mem_hotplug_begin/done mm/page_counter.c: fix protection usage propagation ocfs2: change slot number type s16 to u16 khugepaged: collapse_pte_mapped_thp() protect the pmd lock khugepaged: collapse_pte_mapped_thp() flush the right range ext2: fix missing percpu_counter_inc MIPS: qi_lb60: Fix routing to audio amplifier MIPS: CPU#0 is not hotpluggable driver core: Avoid binding drivers to dead devices mac80211: fix misplaced while instead of if bcache: fix overflow in offset_to_stripe() bcache: allocate meta data pages as compound pages md/raid5: Fix Force reconstruct-write io stuck in degraded raid5 net/compat: Add missing sock updates for SCM_RIGHTS net: stmmac: dwmac1000: provide multicast filter fallback net: ethernet: stmmac: Disable hardware multicast filter media: vsp1: dl: Fix NULL pointer dereference on unbind pinctrl: ingenic: Enhance support for IRQ_TYPE_EDGE_BOTH powerpc: Fix circular dependency between percpu.h and mmu.h powerpc: Allow 4224 bytes of stack expansion for the signal frame powerpc/ptdump: Fix build failure in hashpagetable.c cifs: Fix leak when handling lease break for cached root fid xtensa: fix xtensa_pmu_setup prototype xtensa: add missing exclusive access state management iio: dac: ad5592r: fix unbalanced mutex unlocks in ad5592r_read_raw() dt-bindings: iio: io-channel-mux: Fix compatible string in example code arm64: perf: Correct the event index in sysfs btrfs: fix return value mixup in btrfs_get_extent btrfs: make sure SB_I_VERSION doesn't get unset by remount btrfs: fix memory leaks after failure to lookup checksums during inode logging btrfs: inode: fix NULL pointer dereference if inode doesn't need compression btrfs: only search for left_info if there is no right_info in try_merge_free_space btrfs: fix messages after changing compression level by remount btrfs: fix race between page release and a fast fsync btrfs: don't WARN if we abort a transaction with EROFS btrfs: sysfs: use NOFS for device creation btrfs: avoid possible signal interruption of btrfs_drop_snapshot() on relocation tree btrfs: add missing check for nocow and compression inode flags btrfs: relocation: review the call sites which can be interrupted by signal btrfs: move the chunk_mutex in btrfs_read_chunk_tree btrfs: open device without device_list_mutex btrfs: don't traverse into the seed devices in show_devname btrfs: remove no longer needed use of log_writers for the log root tree btrfs: stop incremening log_batch for the log root tree when syncing log btrfs: ref-verify: fix memory leak in add_block_entry btrfs: don't allocate anonymous block device for user invisible roots btrfs: free anon block device right after subvolume deletion btrfs: allow use of global block reserve for balance item deletion PCI: qcom: Add support for tx term offset for rev 2.1.0 PCI: qcom: Define some PARF params needed for ipq8064 SoC PCI: Add device even if driver attach failed PCI: Mark AMD Navi10 GPU rev 0x00 ATS as broken PCI: hotplug: ACPI: Fix context refcounting in acpiphp_grab_context() genirq/PM: Always unlock IRQ descriptor in rearm_wake_irq() genirq/affinity: Make affinity setting if activated opt-in smb3: warn on confusing error scenario with sec=krb5 defconfig: Enable CONFIG_NL80211_TESTMODE config for holi interconnect: qcom: Add L3 support for Holi iicc: dt-bindings: add endpoint IDs for L3 interconnect for HOLI msm: kgsl: Update preemption context record size for a660 msm: kgsl: Fix overflow issue to gpu_busy drivers: thermal: cpu_voltage: Use the child device node cnss2: Wait for power up complete during SSR restart ANDROID: ABI: FPSIMD save/restore using vendor_hooks ANDROID: vendor_hooks: FPSIMD save/restore by using vendor_hooks msm: cvp: Fixed a deadlock during power update ANDROID: futex: Add vendor hook for wait queue ANDROID: sched: add vendor hooks to handle scheduling priority ANDROID: rwsem: Add vendor hook to the rw-semaphore ANDROID: binder: Add vendor hook to the binder soc: qcom: ramdump: Abort user-space read if timed-out msm: kgsl: Save and restore the power ctrl_flags during recovery NFC: Align DT property name with DTSI files FROMLIST: ufs: introduce a callback to get info of command completion ANDROID: scsi: ufs: export ufshcd_wb_ctrl func ANDROID: GKI: enable some USB_NET_ config options regulator: rpm-smd: Correct proxy regulator registration ANDROID: sched: add restrict vendor hook to modify task placement policy in EAS mailbox: msm_qmp: Assert on timeout iommu/arm-smmu: Ensure power resources are enabled during tlb maintenance block: Fix a race in the runtime power management code byte-cntr: Don't start usb transfer when rwp offset is invalid soc: qcom: eud: Fix inconsistent nature of the cmdline cnss2: Free saved default PCIe config space BACKPORT: kthread: Do not preempt current task if it is going to call schedule() cnss2: Notify MSM PCIe bus driver when detect link down cnss2: print message for abrupt device reset to PBL cnss2: Try to recover PCIe link to collect dump after link down cnss2: Save default config space without BME enabled pci: msm: Add support to handle ep driver requested link down ANDROID: GKI: enable CONFIG_USB_ROLE_SWITCH ANDROID: ABI: Update ABI after UFS error recovery patches BACKPORT: FROMGIT: scsi: ufs: Properly release resources if a task is aborted successfully BACKPORT: FROMGIT: scsi: ufs: Fix a race condition between error handler and runtime PM ops FROMGIT: scsi: ufs: Move dumps in IRQ handler to error handler BACKPORT: FROMGIT: scsi: ufs: Recover HBA runtime PM error in error handler BACKPORT: FROMGIT: scsi: ufs: Fix concurrency of error handler and other error recovery paths BACKPORT: FROMGIT: scsi: ufs: Add some debug information to ufshcd_print_host_state() FROMGIT: scsi: ufs-qcom: Remove testbus dump in ufs_qcom_dump_dbg_regs FROMGIT: scsi: ufs: ufs-qcom: Fix race conditions caused by ufs_qcom_testbus_config() FROMGIT: scsi: ufs: Add checks before setting clk-gating states mm: Allow pages that are swapped in to come from the movable zone ANDROID: kbuild: don't preprocess module-lto.lds ANDROID: vendor_hooks: Add vendor hook to the net drivers: qcom: rpmh-rsc: check for control TCS availablilty cpuidle: lpm-levels: Fix RIMPS timer programming defconfig: Enable scheduler Uclamp for Holi arm64: defconfig: Enable CONFIG_MEDIA_RADIO_SUPPORT on Lahaina Revert "ALSA: usb-audio: work around streaming quirk for MacroSilicon MS2109" msm: kgsl: Avoid race of fault handler and recovery Linux 5.4.59 io_uring: Fix NULL pointer dereference in loop_rw_iter() s390/gmap: improve THP splitting s390/dasd: fix inability to use DASD with DIAG driver xen/gntdev: Fix dmabuf import with non-zero sgt offset xen/balloon: make the balloon wait interruptible xen/balloon: fix accounting in alloc_xenballooned_pages error path fs/minix: reject too-large maximum file size fs/minix: don't allow getting deleted inodes fs/minix: check return value of sb_getblk() bitfield.h: don't compile-time validate _val in FIELD_FIT crypto: cpt - don't sleep of CRYPTO_TFM_REQ_MAY_SLEEP was not specified crypto: ccp - Fix use of merged scatterlists crypto: qat - fix double free in qat_uclo_create_batch_init_list crypto: hisilicon - don't sleep of CRYPTO_TFM_REQ_MAY_SLEEP was not specified pstore: Fix linking when crypto API disabled tpm: Unify the mismatching TPM space buffer sizes ALSA: usb-audio: add quirk for Pioneer DDJ-RB irqdomain/treewide: Free firmware node after domain removal ARM: 8992/1: Fix unwind_frame for clang-built kernels parisc: mask out enable and reserved bits from sba imask parisc: Implement __smp_store_release and __smp_load_acquire barriers parisc: Do not use an ordered store in pa_tlb_lock() Revert "parisc: Revert "Release spinlocks using ordered store"" Revert "parisc: Use ldcw instruction for SMP spinlock release barrier" Revert "parisc: Drop LDCW barrier in CAS code when running UP" erofs: fix extended inode could cross boundary mtd: rawnand: qcom: avoid write to unavailable register spi: spidev: Align buffers for DMA include/asm-generic/vmlinux.lds.h: align ro_after_init cpufreq: dt: fix oops on armada37xx cpufreq: Fix locking issues with governors NFS: Don't return layout segments that are in use NFS: Don't move layouts to plh_return_segs list while in use io_uring: set ctx sq/cq entry count earlier drm/ttm/nouveau: don't call tt destroy callback on alloc failure. media: media-request: Fix crash if memory allocation fails 9p: Fix memory leak in v9fs_mount ALSA: usb-audio: work around streaming quirk for MacroSilicon MS2109 ALSA: usb-audio: fix overeager device match for MacroSilicon MS2109 ALSA: usb-audio: Creative USB X-Fi Pro SB1095 volume knob support ALSA: hda - fix the micmute led status for Lenovo ThinkCentre AIO USB: serial: cp210x: enable usb generic throttle/unthrottle USB: serial: cp210x: re-enable auto-RTS on open net: initialize fastreuse on inet_inherit_port net: refactor bind_bucket fastreuse into helper vmxnet3: use correct tcp hdr length when packet is encapsulated tcp: correct read of TFO keys on big endian systems net/tls: Fix kmap usage net: Set fput_needed iff FDPUT_FPUT is set net: phy: fix memory leak in device-create error path net/nfc/rawsock.c: add CAP_NET_RAW check. net: Fix potential memory leak in proto_register() drivers/net/wan/lapbether: Added needed_headroom and a skb->len check af_packet: TPACKET_V3: fix fill status rwlock imbalance crypto: aesni - add compatibility with IAS x86/fsgsbase/64: Fix NULL deref in 86_fsgsbase_read_task SUNRPC: Fix ("SUNRPC: Add "@len" parameter to gss_unwrap()") svcrdma: Fix page leak in svc_rdma_recv_read_chunk() pinctrl-single: fix pcs_parse_pinconf() return value ocfs2: fix unbalanced locking dlm: Fix kobject memleak net: thunderx: initialize VF's mailbox mutex before first usage fsl/fman: fix eth hash table allocation fsl/fman: check dereferencing null pointer fsl/fman: fix unreachable code fsl/fman: fix dereference null return value fsl/fman: use 32-bit unsigned integer net: spider_net: Fix the size used in a 'dma_free_coherent()' call liquidio: Fix wrong return value in cn23xx_get_pf_num() net: ethernet: aquantia: Fix wrong return value net/mlx5: Delete extra dump stack that gives nothing net/mlx5: DR, Change push vlan action sequence tools, bpftool: Fix wrong return value in do_dump() tools, build: Propagate build failures from tools/build/Makefile.build wl1251: fix always return 0 error rtw88: coex: only skip coex triggered by BT info rtw88: fix short GI capability based on current bandwidth rtw88: fix LDPC field for RA info ice: Graceful error handling in HW table calloc failure s390/qeth: don't process empty bridge port events ASoC: fsl_sai: Fix value of FSL_SAI_CR1_RFW_MASK ASoC: meson: axg-tdm-formatters: fix sclk inversion ASoC: meson: axg-tdmin: fix g12a skew ASoC: meson: axg-tdm-interface: fix link fmt setup selftests/powerpc: Fix online CPU selection cpufreq: ap806: fix cpufreq driver needs ap cpu clk PCI: Release IVRS table in AMD ACS quirk RDMA/netlink: Remove CAP_NET_RAW check when dump a raw QP selftests/powerpc: Fix CPU affinity for child process powerpc/boot: Fix CONFIG_PPC_MPC52XX references powerpc/32s: Fix CONFIG_BOOK3S_601 uses selftests/powerpc: Squash spurious errors due to device removal xfs: fix inode allocation block res calculation precedence net: dsa: rtl8366: Fix VLAN set-up net: dsa: rtl8366: Fix VLAN semantics Bluetooth: hci_serdev: Only unregister device if it was registered Bluetooth: hci_h5: Set HCI_UART_RESET_ON_INIT to correct flags power: supply: check if calc_soc succeeded in pm860x_init_battery Smack: prevent underflow in smk_set_cipso() Smack: fix another vsscanf out of bounds RDMA/core: Fix return error value in _ib_modify_qp() to negative PCI: cadence: Fix updating Vendor ID and Subsystem Vendor ID register macintosh/via-macii: Access autopoll_devs when inside lock net: dsa: mv88e6xxx: MV88E6097 does not support jumbo configuration scsi: mesh: Fix panic after host or bus reset scsi: megaraid_sas: Clear affinity hint usb: gadget: f_uac2: fix AC Interface Header Descriptor wTotalLength usb: dwc2: Fix error path in gadget registration MIPS: OCTEON: add missing put_device() call in dwc3_octeon_device_init() phy: armada-38x: fix NETA lockup when repeatedly switching speeds mt76: mt7615: fix potential memory leak in mcu message handler powerpc/perf: Fix missing is_sier_aviable() during build coresight: tmc: Fix TMC mode read in tmc_read_unprepare_etb() thermal: ti-soc-thermal: Fix reversed condition in ti_thermal_expose_sensor() usb: core: fix quirks_param_set() writing to a const pointer USB: serial: iuu_phoenix: fix led-activity helpers spi: lantiq-ssc: Fix warning by using WQ_MEM_RECLAIM gpu: ipu-v3: Restore RGB32, BGR32 drm/imx: tve: fix regulator_disable error path drm/imx: fix use after free powerpc/book3s64/pkeys: Use PVR check instead of cpu feature phy: renesas: rcar-gen3-usb2: move irq registration to init PCI/ASPM: Add missing newline in sysfs 'policy' ASoC: meson: fixes the missed kfree() for axg_card_add_tdm_loopback staging: rtl8192u: fix a dubious looking mask before a shift ima: Have the LSM free its audit rule RDMA/rxe: Prevent access to wr->next ptr afrer wr is posted to send queue RDMA/qedr: SRQ's bug fixes powerpc/vdso: Fix vdso cpu truncation powerpc/rtas: don't online CPUs for partition suspend kernfs: do not call fsnotify() with name without a parent mwifiex: Prevent memory corruption handling keys scsi: scsi_debug: Add check for sdebug_max_queue during module init drm/bridge: sil_sii8620: initialize return of sii8620_readb phy: exynos5-usbdrd: Calibrating makes sense only for USB2.0 PHY drm: panel: simple: Fix bpc for LG LB070WV8 panel leds: core: Flush scheduled work for system suspend kobject: Avoid premature parent object freeing in kobject_cleanup() drm/stm: repair runtime power management PCI: Fix pci_cfg_wait queue locking problem RDMA/rxe: Skip dgid check in loopback mode xfs: fix reflink quota reservation accounting error xfs: don't eat an EIO/ENOSPC writeback error when scrubbing data fork media: cros-ec-cec: do not bail on device_init_wakeup failure media: exynos4-is: Add missed check for pinctrl_lookup_state() media: firewire: Using uninitialized values in node_probe() ipvs: allow connection reuse for unconfirmed conntrack scsi: eesox: Fix different dev_id between request_irq() and free_irq() scsi: powertec: Fix different dev_id between request_irq() and free_irq() RDMA/core: Fix bogus WARN_ON during ib_unregister_device_queued() iavf: Fix updating statistics iavf: fix error return code in iavf_init_get_resources() staging: vchiq_arm: Add a matching unregister call drm/radeon: fix array out-of-bounds read and write issues cxl: Fix kobject memleak drm/mipi: use dcs write for mipi_dsi_dcs_set_tear_scanline scsi: cumana_2: Fix different dev_id between request_irq() and free_irq() ASoC: Intel: bxt_rt298: add missing .owner field ASoC: SOF: nocodec: add missing .owner field media: omap3isp: Add missed v4l2_ctrl_handler_free() for preview_init_entities() media: marvell-ccic: Add missed v4l2_async_notifier_cleanup() media: cxusb-analog: fix V4L2 dependency Bluetooth: btmtksdio: fix up firmware download sequence Bluetooth: btusb: fix up firmware download sequence leds: lm355x: avoid enum conversion warning clk: bcm63xx-gate: fix last clock availability drm/arm: fix unintentional integer overflow on left shift drm/etnaviv: Fix error path on failure to enable bus clk iio: improve IIO_CONCENTRATION channel type description ath10k: Acquire tx_lock in tx error paths video: pxafb: Fix the function used to balance a 'dma_alloc_coherent()' call console: newport_con: fix an issue about leak related system resources video: fbdev: sm712fb: fix an issue about iounmap for a wrong address btmrvl: Fix firmware filename for sd8997 chipset btmrvl: Fix firmware filename for sd8977 chipset mwifiex: Fix firmware filename for sd8997 chipset mwifiex: Fix firmware filename for sd8977 chipset agp/intel: Fix a memory leak on module initialisation failure drm/bridge: ti-sn65dsi86: Clear old error bits before AUX transfers drm/gem: Fix a leak in drm_gem_objects_lookup() drm/msm: ratelimit crtc event overflow error ACPICA: Do not increment operation_region reference counts for field units bcache: fix super block seq numbers comparision in register_cache_set() dyndbg: fix a BUG_ON in ddebug_describe_flags usb: bdc: Halt controller on suspend bdc: Fix bug causing crash after multiple disconnects usb: gadget: net2280: fix memory leak on probe error handling paths mmc: sdhci-pci-o2micro: Bug fix for O2 host controller Seabird1 ionic: update eid test for overflow gpu: host1x: debug: Fix multiple channels emitting messages simultaneously iwlegacy: Check the return value of pcie_capability_read_*() platform/x86: asus-nb-wmi: add support for ASUS ROG Zephyrus G14 and G15 brcmfmac: set state of hanger slot to FREE when flushing PSQ brcmfmac: To fix Bss Info flag definition Bug brcmfmac: keep SDIO watchdog running when console_interval is non-zero bpf: Fix fds_example SIGSEGV error drm/amd/powerplay: fix compile error with ARCH=arc drm/amdgpu/display bail early in dm_pp_get_static_clocks mm/mmap.c: Add cond_resched() for exit_mmap() CPU stalls irqchip/irq-mtk-sysirq: Replace spinlock with raw_spinlock drm/radeon: disable AGP by default drm/debugfs: fix plain echo to connector "force" attribute drm/msm: Fix a null pointer access in msm_gem_shrinker_count() drm: msm: a6xx: fix gpu failure after system resume usb: mtu3: clear dual mode of u3port when disable device btrfs: fix lockdep splat from btrfs_dump_space_info mmc: sdhci-cadence: do not use hardware tuning for SD mode drm/nouveau: fix multiple instances of reference count leaks drm/nouveau: fix reference count leak in nouveau_debugfs_strap_peek drm/etnaviv: fix ref count leak via pm_runtime_get_sync arm64: dts: hisilicon: hikey: fixes to comply with adi, adv7533 DT binding drm/nouveau/kms/nv50-: Fix disabling dithering md-cluster: fix wild pointer of unlock_all_bitmaps() bus: ti-sysc: Add missing quirk flags for usb_host_hs video: fbdev: neofb: fix memory leak in neo_scan_monitor() video: fbdev: savage: fix memory leak on error handling path in probe crypto: aesni - Fix build with LLVM_IAS=1 drm/radeon: Fix reference count leaks caused by pm_runtime_get_sync drm/amdgpu: avoid dereferencing a NULL pointer fs/btrfs: Add cond_resched() for try_release_extent_mapping() stalls ANDROID: fix a bug in quota2 loop: be paranoid on exit and prevent new additions / removals Bluetooth: add a mutex lock to avoid UAF in do_enale_set soc: qcom: rpmh-rsc: Set suppress_bind_attrs flag drm/tilcdc: fix leak & null ref in panel_connector_get_modes nvme-multipath: do not fall back to __nvme_find_path() for non-optimized paths nvme-multipath: fix logic for non-optimized paths nvme-rdma: fix controller reset hang during traffic nvme-tcp: fix controller reset hang during traffic md: raid0/linear: fix dereference before null check on pointer mddev seccomp: Fix ioctl number for SECCOMP_IOCTL_NOTIF_ID_VALID irqchip/ti-sci-inta: Fix return value about devm_ioremap_resource() iocost: Fix check condition of iocg abs_vdebt ARM: socfpga: PM: add missing put_device() call in socfpga_setup_ocram_self_refresh() spi: rockchip: Fix error in SPI slave pio read io_uring: fix sq array offset calculation regulator: fix memory leak on error path of regulator_register() recordmcount: only record relocation of type R_AARCH64_CALL26 on arm64. tpm: Require that all digests are present in TCG_PCR_EVENT2 structures spi: lantiq: fix: Rx overflow error in full duplex mode ARM: dts: sunxi: bananapi-m2-plus-v1.2: Fix CPU supply voltages ARM: dts: sunxi: bananapi-m2-plus-v1.2: Add regulator supply to all CPU cores ARM: at91: pm: add missing put_device() call in at91_pm_sram_init() ARM: dts: gose: Fix ports node name for adv7612 ARM: dts: gose: Fix ports node name for adv7180 platform/x86: intel-vbtn: Fix return value check in check_acpi_dev() platform/x86: intel-hid: Fix return value check in check_acpi_dev() m68k: mac: Fix IOP status/control register writes m68k: mac: Don't send IOP message until channel is idle clk: scmi: Fix min and max rate when registering clocks with discrete rates sched/uclamp: Fix initialization of struct uclamp_rq arm64: dts: exynos: Fix silent hang after boot on Espresso firmware: arm_scmi: Fix SCMI genpd domain probing ARM: exynos: MCPM: Restore big.LITTLE cpuidle support crypto: ccree - fix resource leak on error path blktrace: fix debugfs use after free arm64: dts: qcom: msm8916: Replace invalid bias-pull-none property crc-t10dif: Fix potential crypto notify dead-lock EDAC: Fix reference count leaks arm64: dts: rockchip: fix rk3399-puma gmac reset gpio arm64: dts: rockchip: fix rk3399-puma vcc5v0-host gpio arm64: dts: rockchip: fix rk3368-lion gmac reset gpio sched: correct SD_flags returned by tl->sd_flags() sched/fair: Fix NOHZ next idle balance x86/mce/inject: Fix a wrong assignment of i_mce.status clk: qcom: clk-rpmh: Wait for completion when enabling clocks fs/io_uring.c: Fix uninitialized variable is referenced in io_submit_sqe nvme: add a Identify Namespace Identification Descriptor list quirk HID: input: Fix devices that return multiple bytes in battery report tracepoint: Mark __tracepoint_string's __used spi: spi-msm-geni: Add support to disable dma mode for SPI transfers msm: adsprpc: prevent use-after-free from fastrpc ctx arm64: defconfig: Trim genericarmv8 defconfig ANDROID: ABI: Update allowed list for QCOM arm64: defconfig: Set panic timeout and panic oops config arm64: defconfig: Enabled SOC and Haven watchdog drivers haven: watchdog: Add virtual watchdog support soc: qcom: Add qcom watchdog framework support soc: qcom: Create framework for qcom watchdogs soc: qcom: Remove watchdog percpu interrupts soc: qcom: Remove unused member variables soc: qcom: Remove unused macros soc: qcom: Remove watchdog slack accounting arm64: defconfig: Add watchdog core config soc: qcom: Rename msm watchdog to wdt core soc: qcom: Remove msm watchdog config aarch64: ABI: add kernel_restart to GKI KMI symbol list mhi: core: Add checks for bhi and bhie offsets cnss2: Update device MMIO region length for MHI core mhi: core: Skip RDDM download if execution env is unknown mhi: core: Add NULL check in mhi_get_exec_env ANDROID: db845c: set BUILD_INITRAMFS=1 soc: qcom: mem-buf: Relinquish unclaimed donated memory soc: qcom: mem-buf: Use an unbound high priority workqueue for mem-buf power: qpnp-smb5: Fix Initialize mutex for PD typec designs coresight: tmc: Modified trigger number for reset CTI sched/walt: Improve the scheduler mhi: core: Set bhi and bhie to NULL upon power down soc: qcom: add microdump collector input: qcom-hv-haptics: toggle CAL_EN mode if HBST is in open loop ANDROID: GKI: Build CEC_{CORE,NOTIFIER,PIN} in input: qcom-hv-haptics: read CAL_TLRA_CL_STS from SDAM after boot up input: qcom-hv-haptics: update RC_CLK_CAL_COUNT calculation arch: arm64: Add RCU related configs for lahaina msm: kgsl: Clean up adreno_spin_idle_debug msm: kgsl: Add LPAC information to snapshot msm: kgsl: Add A660 specific registers to snapshot ANDROID: GKI: Enable CEC support scsi: ufs: Add UFS_DEVICE_QUIRK_PA_HIBER8TIME quirk power: supply: qti_battery_charger: allow setting ICL for USB_PD charger ANDROID: ABI: Update ABI snapshot after additions to struct io_pgtable_cfg usb: dwc3: Set FORCE_MEM_CORE_ON bit of GCC_USB30_MASTER_CLK drivers: thermal: don't reset ops pointer in of-thermal sensor unregister usb: XHCI: Implement xhci_handshake_check_state() API usb: xhci: Reduce command abort handshake timeout msm: kgsl: Correctly clean up dma buffer attachment in case of error arm: defconfig: Remove I3C driver support ANDROID: iommu/io-pgtable: Allow IOMMU drivers to allocate/free page-table memory msm: synx: fix cleanup of fence during handle creation msm: adsprpc: Add capability for error code change in kernel msm: adsprpc: Race conditions when handling the ADSP SSR sched/walt: Improve the scheduler ANDROID: update ABI soc: qcom: socinfo: Add support for IDP and ATP platforms abi: Update qcom whitelist for netdev_update_features clk: qcom: gcc: update frequency table for csi3phytimer clock clk: qcom: debugcc: Update the debug mux for CPUSS pinctrl: qcom: spmi-gpio: Add support for PMX65 clk: qcom: gcc-lahaina: Enable clocks for pm8008 by default cnss2: Check for FW / IMS status for WFC QMI messages msm: kgsl: Add clocks to access KGSL SMMU register space msm: kgsl: Fix GBIF Halt ack timeout for a619_holi UPSTREAM: update to latest version of scripts/checkpatch.pl input: touchscreen: synaptics_tcm: defer probe if panel not found FROMLIST: ufs: change the way to complete fDeviceInit soc: qcom: msm_perf: use cpuinfo.min/max while adding freq qos request msm: kgsl: Fix GMEM base for A615 family GPUs msm: adsprpc: allow unsigned PD offload to secure channel msm: kgsl: Add suspend_context to gmu based targets msm: kgsl: Fix gmu fence error during slumber msm: kgsl: Kick dcvs in idle thread for gmu targets msm: kgsl: Fix KGSL_PROP_PWRCTRL property for gmu based targets msm: kgsl: Turn off gpu interrupts during stall-on-fault mm: memblock: Add more debug logs clk: qcom: rpmh: Add support for RPMH clocks for sdxlemur clk: qcom: common: Return NULL from clk_hw OF provider defconfig: Add support for ARM_APPENDED_DTB for sdxlemur ANDROID: GKI: add built-in BCM Bluetooth driver Revert "Revert "genetlink: remove genl_bind"" ANDROID: GKI: enable CONFIG_LEDS_TRIGGER_TIMER cpuidle: lpm-levels: Set suspend and s2idle ops later during probe mmc: sdhci-msm: Calculate timeout value based on the base clock mmc: sdhci-msm: Introduce timeout freq divider in sdhci host sched:/fair: check cpu_allowed mask when find target ANDROID: GKI: add abi_gki_aarch64_oplus ANDROID: GKI: fix up abi .xml file due to previous changes. msm: kgsl: skip if requested address doesn't fall in the svm range msm: kgsl: Remove VM_MAYWRITE flag to restrict mprotect ANDROID: GKI: add some padding to some driver core structures arm64: defconfig: Enable eMMC/SD card on holi arm64: defconfig: Enable eMMC/SD card driver for holi QGKI defconfig clk: qcom: clk-debug: Fix clk measurement algorithm leds: qti-flash: Fix early return in qti_flash_led_disable() sound: usb: Add NULL check against udev with uaudio_dev_cleanup() API msm: pcie: fix race between DRV suspend/resume and RPMSG operations mhi: core: Add missing EXPORT_SYMBOL for some public APIs ANDROID: vendor_hooks: add waiting information for blocked tasks kernel: time: Fix accuracy for low resolution timer ANDROID: GKI: Update abi_gki_aarch64_exynos cnss_utils: Increase unsafe channel max num for 6G USB: gadget: composite: Allow bMaxPower=0 if self-powered ANDROID: include/linux: add low power mode and fps to notifier msm: ADSPRPC: Size check before allocating memory from DMA BACKPORT: scsi: ufs: Fix and simplify setup_xfer_req variant operation qseecom : Fixes to enable shmbridge defconfig: msm: enable event sharing in kernel for lahaina/holi ANDROID: GKI: enable USB UVC drivers input: touchscreen: st: increase LDO load ANDROID: GKI: enabled CONFIG_USB_CONFIGFS_NCM=y arm64: defconfig: Enable GENI and slimbus drivers leds: qti-flash: Handle error return path properly scsi: ufs: Fix some racing problems in ufshcd_shutdown() icnss2: Send SMMU IOVA range only when SMMU S1 is enabled ANDROID: GKI: enable LEDS_CLASS_FLASH ASoC: Add backend user count check ANDROID: Revert "module: Refactor section attr into bin attribute" ANDROID: Revert "module: Do not expose section addresses to non-CAP_SYSLOG" sched: Improve the Scheduler Revert "drm/drm_fb_helper: fix fbdev with sparc64" qcom: pil: Move the IMEM location for disabling timeouts msm: kgsl: Mark the scratch buffer as privileged msm: kgsl: Use per-target scratch memory for preemption ANDROID: fix redefinition error for restricted vendor hooks qtee_shmbridge: Enable shmbridge on lahaina dt-bindings: clock: Add rpmh header for sdxlemur Linux 5.4.58 nfsd: Fix NFSv4 READ on RDMA when using readv ima: move APPRAISE_BOOTPARAM dependency on ARCH_POLICY to runtime tcp: apply a floor of 1 for RTT samples from TCP timestamps selftests/net: relax cpu affinity requirement in msg_zerocopy test Revert "vxlan: fix tos value before xmit" openvswitch: Prevent kernel-infoleak in ovs_ct_put_key() net: thunderx: use spin_lock_bh in nicvf_set_rx_mode_task() net: gre: recompute gre csum for sctp over gre tunnels hv_netvsc: do not use VF device if link is down dpaa2-eth: Fix passing zero to 'PTR_ERR' warning appletalk: Fix atalk_proc_init() return path net: lan78xx: replace bogus endpoint lookup vxlan: Ensure FDB dump is performed under RCU rxrpc: Fix race between recvmsg and sendmsg on immediate call failure net: ethernet: mtk_eth_soc: fix MTU warnings ipv6: Fix nexthop refcnt leak when creating ipv6 route info ipv6: fix memory leaks on IPV6_ADDRFORM path ipv4: Silence suspicious RCU usage warning PCI: tegra: Revert tegra124 raw_violation_fixup Revert "powerpc/kasan: Fix shadow pages allocation failure" xattr: break delegations in {set,remove}xattr Drivers: hv: vmbus: Ignore CHANNELMSG_TL_CONNECT_RESULT(23) tools lib traceevent: Fix memory leak in process_dynamic_array_len atm: fix atm_dev refcnt leaks in atmtcp_remove_persistent igb: reinit_locked() should be called with rtnl_lock cfg80211: check vendor command doit pointer before use firmware: Fix a reference count leak. ALSA: hda: fix NULL pointer dereference during suspend net: ethernet: mtk_eth_soc: Always call mtk_gmac0_rgmii_adjust() for mt7623 usb: hso: check for return value in hso_serial_common_create() i2c: slave: add sanity check when unregistering i2c: slave: improve sanity check when registering drm/drm_fb_helper: fix fbdev with sparc64 nvme-pci: prevent SK hynix PC400 from using Write Zeroes command drm/nouveau/fbcon: zero-initialise the mode_cmd2 structure drm/nouveau/fbcon: fix module unload when fbcon init has failed for some reason net/9p: validate fds in p9_fd_open leds: 88pm860x: fix use-after-free on unbind leds: lm3533: fix use-after-free on unbind leds: da903x: fix use-after-free on unbind leds: lm36274: fix use-after-free on unbind leds: wm831x-status: fix use-after-free on unbind mtd: properly check all write ioctls for permissions vgacon: Fix for missing check in scrollback handling scripts: add dummy report mode to add_namespace.cocci Smack: fix use-after-free in smk_write_relabel_self() binder: Prevent context manager from incrementing ref 0 omapfb: dss: Fix max fclk divider for omap36xx Bluetooth: Prevent out-of-bounds read in hci_inquiry_result_with_rssi_evt() Bluetooth: Prevent out-of-bounds read in hci_inquiry_result_evt() Bluetooth: Fix slab-out-of-bounds read in hci_extended_inquiry_result_evt() Staging: rtl8188eu: rtw_mlme: Fix uninitialized variable authmode staging: rtl8712: handle firmware load failure staging: android: ashmem: Fix lockdep warning for write operation ALSA: seq: oss: Serialize ioctls ALSA: hda/ca0132 - Fix AE-5 microphone selection commands. ALSA: hda/ca0132 - Fix ZxR Headphone gain control get value. ALSA: hda/ca0132 - Add new quirk ID for Recon3D. ALSA: hda/realtek: Add alc269/alc662 pin-tables for Loongson-3 laptops Revert "ALSA: hda: call runtime_allow() for all hda controllers" io_uring: Fix use-after-free in io_sq_wq_submit_work() io_uring: prevent re-read of sqe->opcode usb: xhci: Fix ASMedia ASM1142 DMA addressing usb: xhci: define IDs for various ASMedia host controllers USB: iowarrior: fix up report size handling for some devices perf/core: Fix endless multiplex timer USB: serial: qcserial: add EM7305 QDL product ID ANDROID: GKI: update abi based on wifi 6GHz changes BACKPORT: cfg80211: require HE capabilities for 6 GHz band BACKPORT: cfg80211: reject HT/VHT capabilities on 6 GHz band BACKPORT: cfg80211: treat 6 GHz channels as valid regardless of capability BACKPORT: mac80211: Add HE 6GHz capabilities element to probe request BACKPORT: mac80211: add HE 6 GHz Band Capability element BACKPORT: cfg80211: add and expose HE 6 GHz band capabilities BACKPORT: cfg80211: handle 6 GHz capability of new station BACKPORT: ieee80211: add HE ext EIDs and 6 GHz capability defines BACKPORT: ieee80211: add code to obtain and parse 6 GHz operation field BACKPORT: cfg80211: add a helper to identify 6 GHz PSCs BACKPORT: cfg80211: adapt to new channelization of the 6GHz band BACKPORT: cfg80211: fix 6 GHz frequencies to kHz BACKPORT: cfg80211: express channels with a KHz component coresight: tmc: Set flush cti for both etr and etb spi: spi-msm-geni: Return error if setup transfer fails platform: msm-geni-se: Disable CMD_DONE in DMA mode for I2C and SPI i2c: i2c-msm-geni: Reinitialize the variables after every transfer Perf: core: create/delete shared kernel/user events soc: qcom: Add rpm master stats driver serial: msm_geni_serial: Fix DMA RX FSM reset sequence msm: cvp: Avoid releasing non-existent ARP Revert "Revert "Revert "ANDROID: ALSA: jack: Update supported ja..." mhi: core: prioritize BHI error debug registers set dump usb: dwc3: gadget: Prevent core from processing stale TRBs mhi: core: Extend mhi_device_get_sync_atomic() for panic cases UPSTREAM: loop: Fix wrong masking of status flags UPSTREAM: loop: Add LOOP_CONFIGURE ioctl UPSTREAM: loop: Clean up LOOP_SET_STATUS lo_flags handling UPSTREAM: loop: Rework lo_ioctl() __user argument casting UPSTREAM: loop: Move loop_set_status_from_info() and friends up BACKPORT: loop: Factor out configuring loop from status UPSTREAM: loop: Remove figure_loop_size() UPSTREAM: loop: Refactor loop_set_status() size calculation UPSTREAM: loop: Factor out setting loop device size UPSTREAM: loop: Remove sector_t truncation checks UPSTREAM: loop: Call loop_config_discard() only after new config is applied adsprpc: Avoid race condition during map find and free mmc: sdhci-msm: Update DDR_CONFIG reg with HSR value if supplied UPSTREAM: mmc: sdhci-msm: Don't enable PWRSAVE_DLL for certain sdhc hosts mmc: sdhci-msm: skip eMMC slot probe if eMMC isn't a bootdevice drivers: soc: qcom: update sct table for LLCC on Shima defconfig: holi: enable recommended memory configs sched: rt: Add trace point for taskplacement sched/walt: Improve the scheduler irqchip: mpm: Update the mpm to gic irq mapping irqchip: mpm: Forward the irq type for the mpm parent sched: Improve the scheduler msm: kgsl: Add back power tracepoints to gmu and rgmu targets msm: kgsl: Fix device check when enabling counters via cmdstream msm: kgsl: Do not capture DTCM on gmu boot failure leds: qti-flash: Fix error logging in qti_flash_led_symmetry_config() msm: adsprpc: Put upper limit on IOMMU mapping size ANDROID: Revert "module: Refactor section attr into bin attribute" ANDROID: Revert "module: Do not expose section addresses to non-CAP_SYSLOG" clk: qcom: gpucc-lahaina: Fix "stuck at on" warning qseecom : Pass proper device node pointer scsi: ufs: Add workaround to bypass cfgready signal for UFS gear4 FROMLIST: rpmsg: Guard against null endpoint ops in destroy Add support for returning power sources status ANDROID: GKI: Add some symbols to symbol list Linux 5.4.57 bpf: sockmap: Require attach_bpf_fd when detaching a program selftests: bpf: Fix detach from sockmap tests ext4: fix direct I/O read error arm64: Workaround circular dependency in pointer_auth.h random32: move the pseudo-random 32-bit definitions to prandom.h random32: remove net_rand_state from the latent entropy gcc plugin random: fix circular include dependency on arm64 after addition of percpu.h ARM: percpu.h: fix build error random32: update the net random state on interrupt and activity msm: cvp: Add DSP error handling ANDROID: Update ABI xml UPSTREAM: of: property: Add device link support for pinctrl-0 through pinctrl-8 UPSTREAM: of: property: Add device link support for multiple DT bindings UPSTREAM: of: property: Add device link support for extcon UPSTREAM: driver core: Change delimiter in devlink device's name to "--" UPSTREAM: driver core: Fix sleeping in invalid context during device link deletion BACKPORT: driver core: Add waiting_for_supplier sysfs file for devices msm: kgsl: Fix kgsl context debug stat msm: kgsl: Fix HFI start failed on SA8155 msm: kgsl: Fix stuck issue while booting legacy UPSTREAM: driver core: Add state_synced sysfs file for devices that support it UPSTREAM: driver core: Expose device link details in sysfs UPSTREAM: driver core: Avoid deferred probe due to fw_devlink_pause/resume() UPSTREAM: driver core: Rename dev_links_info.defer_sync to defer_hook UPSTREAM: driver core: Don't do deferred probe in parallel with kernel_init thread UPSTREAM: arm64/module: Optimize module load time by optimizing PLT counting mhi: core: Make sure to powerdown if mhi_sync_power_up fails msm: kgsl: Disable stall on fault for GMU context bank clk: qcom: clk-debug: Fix clk_measure files not being created cnss2: Fix for static analysis issue cnss2: Fix SBL logging for invalid log location address firmware: psci: setup OSI mode at init soc: qcom: Add support to enable eud if enabled in xbl soc: qcom: eud: Add support for EUD TCSR register check FROMGIT: scsi: block: pm: Simplify resume handling sched: rt: Fix double accounting of cpu util in task placement decision spi: spi-msm-geni: Propagate change form 4.14 to 5.4 RTC6226: send the SEEK COMPLETE event when seek cancel defconfig: sdxlemur: add support for qdss msm: cvp: adding new target and read fw name from dtsi arm64: defconfig: Enable interconnect driver for Holi RTC6226: disable the RDS during scan operation Bluetooth: Update TCS content table based on PA config cnss2: Add support for PCIE gen switch msm: adsprpc: do not check for domains support in kernel msm: cvp: power off cvp core before fw boot cnss2: Check device power state for Suspend / Resume operations power: supply: qti_battery_charger: update USB power supply type runtime power: supply: qti_battery_charger: add some more properties build.config.common: Move to clang-11 msm: adsprpc: Clean buffers on remote invocation failure msm_rtb: Don't lose the __user tag on relaxed reads/writes drivers: edac: Add panic notifier for kryo EDAC device defconfig: Shima: enable recommended memory configs usb: u_ether: Add null pointer check for sk_buff in eth_start_xmit serial: msm_geni_serial: Do not place msm_geni_console_setup under __init icnss2: Do not clear SHUTDOWN_DONE flag until reinit is done icnss2: Add support for Runtime PM soc: qcom: hyp_core_ctl: Minor cleanup soc: qcom: hyp_core_ctl: fix issue with CPU Freq policy dependency soc: qcom: secure_buffer: add API page_accessible soc: qcom: secure_buffer: track all hyp based secure pages input: touchscreen: focaltech_touch: support dynamic report rate spi: spi-msm-geni: Add lock/unlock tre support in SPI GSI mode Linux 5.4.56 perf bench: Share some global variables to fix build with gcc 10 perf env: Do not return pointers to local variables perf tests bp_account: Make global variable static x86/i8259: Use printk_deferred() to prevent deadlock KVM: LAPIC: Prevent setting the tscdeadline timer if the lapic is hw disabled KVM: arm64: Don't inherit exec permission across page-table levels drivers/net/wan: lapb: Corrected the usage of skb_cow RISC-V: Set maximum number of mapped pages correctly xen-netfront: fix potential deadlock in xennet_remove() cxgb4: add missing release on skb in uld_send() x86/stacktrace: Fix reliable check for empty user task stacks x86/unwind/orc: Fix ORC for newly forked tasks Revert "i2c: cadence: Fix the hold bit setting" net: ethernet: ravb: exit if re-initialization fails in tx timeout parisc: add support for cmpxchg on u8 pointers scsi: core: Run queue in case of I/O resource contention failure nfc: s3fwrn5: add missing release on skb in s3fwrn5_recv_frame selftests: net: ip_defrag: modprobe missing nf_defrag_ipv6 support qed: Disable "MFW indication via attention" SPAM every 5 minutes selftests: fib_nexthop_multiprefix: fix cleanup() netns deletion usb: hso: Fix debug compile warning on sparc32 vxlan: fix memleak of fdb perf tools: Fix record failure when mixed with ARM SPE event net/mlx5e: fix bpf_prog reference count leaks in mlx5e_alloc_rq net: gemini: Fix missing clk_disable_unprepare() in error path of gemini_ethernet_port_probe() net: nixge: fix potential memory leak in nixge_probe() Bluetooth: fix kernel oops in store_pending_adv_report arm64: csum: Fix handling of bad packets arm64/alternatives: move length validation inside the subsection mac80211: mesh: Free pending skb when destroying a mpath mac80211: mesh: Free ie data when leaving mesh bpf: Fix map leak in HASH_OF_MAPS map ibmvnic: Fix IRQ mapping disposal in error path mlxsw: core: Free EMAD transactions using kfree_rcu() mlxsw: core: Increase scope of RCU read-side critical section mlx4: disable device on shutdown rhashtable: Fix unprotected RCU dereference in __rht_ptr net: lan78xx: fix transfer-buffer memory leak net: lan78xx: add missing endpoint sanity check net/mlx5e: Fix kernel crash when setting vf VLANID on a VF dev net/mlx5e: Modify uplink state on interface up/down net/mlx5: Verify Hardware supports requested ptp function on a given pin net/mlx5e: Fix error path of device attach net/mlx5: E-switch, Destroy TSAR when fail to enable the mode net: hns3: fix aRFS FD rules leftover after add a user FD rule net: hns3: fix a TX timeout issue sh: Fix validation of system call number sh/tlb: Fix PGTABLE_LEVELS > 2 selftests/net: so_txtime: fix clang issues for target arch PowerPC selftests/net: psock_fanout: fix clang issues for target arch PowerPC selftests/net: rxtimestamp: fix clang issues for target arch PowerPC nvme-tcp: fix possible hang waiting for icresp response ARM: dts: armada-38x: fix NETA lockup when repeatedly switching speeds xfrm: Fix crash when the hold queue is used. ARM: dts sunxi: Relax a bit the CMA pool allocation range xfrm: policy: match with both mark and mask on user interfaces net/x25: Fix null-ptr-deref in x25_disconnect net/x25: Fix x25_neigh refcnt leak when x25 disconnect libtraceevent: Fix build with binutils 2.35 rds: Prevent kernel-infoleak in rds_notify_queue_get() drm: hold gem reference until object is no longer accessed drm/dbi: Fix SPI Type 1 (9-bit) transfer drm/amdgpu: Prevent kernel-infoleak in amdgpu_info_ioctl() drm/amd/display: Clear dm_state for fast updates Revert "drm/amdgpu: Fix NULL dereference in dpm sysfs handlers" virtio_balloon: fix up endian-ness for free cmd id ARM: dts: imx6qdl-icore: Fix OTG_ID pin and sdcard detect ARM: dts: imx6sx-sdb: Fix the phy-mode on fec2 ARM: dts: imx6sx-sabreauto: Fix the phy-mode on fec2 ARM: 8986/1: hw_breakpoint: Don't invoke overflow handler on uaccess watchpoints wireless: Use offsetof instead of custom macro. 9p/trans_fd: Fix concurrency del of req_list in p9_fd_cancelled/p9_read_work vhost/scsi: fix up req type endian-ness IB/rdmavt: Fix RQ counting issues causing use of an invalid RWQE ALSA: hda/hdmi: Fix keep_power assignment for non-component devices ALSA: hda/realtek - Fixed HP right speaker no sound ALSA: hda/realtek: Fix add a "ultra_low_power" function for intel reference board (alc256) ALSA: hda/realtek: typo_fix: enable headset mic of ASUS ROG Zephyrus G14(GA401) series with ALC289 ALSA: hda/realtek: enable headset mic of ASUS ROG Zephyrus G15(GA502) series with ALC289 ALSA: usb-audio: Add implicit feedback quirk for SSL2 mm/filemap.c: don't bother dropping mmap_sem for zero size readahead PCI/ASPM: Disable ASPM on ASMedia ASM1083/1085 PCIe-to-PCI bridge ath10k: enable transmit data ack RSSI for QCA9884 sunrpc: check that domain table is empty at module unload. media: rc: prevent memory leak in cx23888_ir_probe crypto: ccp - Release all allocated memory if sha type is invalid spi: spi-msm-geni: Rename shared_se flag to gsi_mode flag arm64: defconfig: Enable SPI driver configs for trusted VM on lahaina usb: phy: qmp: Disable LDOs and clocks in error handling path clk: qcom: smd_rpm: RPM-SDM changes for XO BUFFERS in HOLI cnss: Add code to migrate from debugfs node to sysfs node soc: qcom: llcc: Add support for CPU TLB System Cache Id ABI: Disable USB_ROLE_SWITCH and TYPEC in GKI sched/fair: Add policy for restricting prefer_spread to newly idle balance sched/fair: Tighten prefer_spread feature mhi: cntrl: Update device MMIO region length for MHI core iommu/arm-smmu: add support to configure IOVA range icnss2: Fix -Wmisleading-indentation warning ANDROID: ABI: Update allowed list for QCOM Revert "ANDROID: GKI: update abi symbol lists now that CONFIG_DWC3 is enabled." ANDROID: kallsyms: increase KSYM_NAME_LEN msm: kgsl: Use the correct pointer for preemption records arm64: defconfig: Add incremental fs config for Lahaina iommu/io-pgtable-fast: optimize statically allocated pages msm: kgsl: Fix snapshot collection for gmu wrapper registers PM / devfreq: memlat: Add writeback percentage as a lat condition mmc: sdhci-msm: Add sysfs entry for pm qos & clk gating mmc: sdhci-msm: Club bus voting with clk gating arm64: defconfig: Enable QPNP_FLASH_V2 driver for holi ABI: Add iio_write_channel_raw API to GKI qcom whitelist RTC6226: extend the seek timeout to 15 sec mmc: sdhci-msm: Make clk gating a delayed work clk: qcom: gdsc-regulator: Add support to skip GDSC disable ANDROID: GKI: update KMI after RCU CONFIGs added ANDROID: GKI: enable RCU configs ANDROID: KABI updates for db845c (USB_DWC3 whiplash fixups) ANDROID: Revert "ANDROID: db845c_gki.fragment: Remove DWC3 modules built into GKI" ANDROID: Open-code OWNERS emails for now rpmsg: glink: do not serve intent request if no callback present net: qrtr: haven: Add fragmentation support usb: dwc3-msm: Add orientation setting capability via sysfs msm: adsprpc: Fix concurrency in early wake of fastrpc ANDROID: Initial OWNERS for abi metafiles hwkm: fail on last byte corruption soc: qcom: Reset string table index for each dump collection request soc: qcom: Skip setting wakeup for ipcc irqchip msm: adsprpc: check for fastrpc session ctx initialization mmc: sdhci-msm: Add support for pm qos in sdcc defconfig: Support for SSG HLOS drivers ANDROID: ABI: update symbols of charger-manager.ko to unisoc Bluetooth: Move missing dts entries logs to info message Bluetooth: Update power sources for QCA6390/QCA6490 arm64: defconfig: Disable LSE_ATOMIC for holi target defconfig: Disable CTI save function on perf build for holi defconfig: Disable the CONFIG_ARM_CPUILDE_PSCI for holi defconfig: holi-gki: Enable various configfs functions arm64: defconfig: Enable mem2mem drivers on Holi ANDROID: GKI: fix symbol_get/put() build error on arm64 defconfig arm64: defconfig: Enable dmabuf destructor support on all targets dma-buf: Add support to set a destructor on a dma-buf arm64: defconfig: Enable PMIC drivers required for holi interconnect: qcom: Add USB3 master for Holi Revert "qrtr: orphan socket in qrtr_release()" icc: dt-bindings: Add USB3 master ID for Holi msm: cvp: Dynamic clock voting ANDROID: GKI: Fix up "do not export symbol_get/put()" commit arm64: defconfig: Add support for clock/CPUFREQHW in HOLI ANDROID: GKI: fix up abi definition files scsi: ufs: Make sure clk scaling happens only when hba is runtime ACTIVE cnss2: Add support to remove WLAN recovery from SSR framework soc: qcom: msm_perf: fix invalid usage of dev freq qos apis ABI: Update whitelist for arch timer Revert "ANDROID: GKI: Enable CONFIG_USB_DWC3" ANDROID: GKI: remove symbols from sunxi for uas driver Linux 5.4.55 Revert "dpaa_eth: fix usage as DSA master, try 3" PM: wakeup: Show statistics for deleted wakeup sources again regmap: debugfs: check count when read regmap file udp: Improve load balancing for SO_REUSEPORT. udp: Copy has_conns in reuseport_grow(). sctp: shrink stream outq when fails to do addstream reconf sctp: shrink stream outq only when new outcnt < old outcnt AX.25: Prevent integer overflows in connect and sendmsg tcp: allow at most one TLP probe per flight rxrpc: Fix sendmsg() returning EPIPE due to recvmsg() returning ENODATA rtnetlink: Fix memory(net_device) leak when ->newlink fails qrtr: orphan socket in qrtr_release() net: udp: Fix wrong clean up for IS_UDPLITE macro net-sysfs: add a newline when printing 'tx_timeout' by sysfs ip6_gre: fix null-ptr-deref in ip6gre_init_net() drivers/net/wan/x25_asy: Fix to make it work dev: Defer free of skbs in flush_backlog AX.25: Prevent out-of-bounds read in ax25_sendmsg() AX.25: Fix out-of-bounds read in ax25_connect() Revert "Revert "ANDROID: ALSA: jack: Update supported jack switch types"" Revert "Revert "ANDROID: ASoC: compress: fix unsigned integer overflow check"" msm: cvp: Add support of mdt loader ANDROID: GKI: enable CONFIG_VIDEO_V4L2_SUBDEV_API FROMLIST: power: add "Wireless" to power_supply_type and power_supply_type_text Revert "ANDROID: ASoC: compress: fix unsigned integer overflow check" Revert "ANDROID: ALSA: jack: Update supported jack switch types" arm64: defconfig: Enable interconnect driver for sdxlemur iommu/iommu-logger: Log IOMMU client name in debug structures msm: kgsl: Don't map DDR as strongly ordered msm: kgsl: Don't print pagefault debugging in global space msm: kgsl: Make sure that IB addresses are dword aligned msm: kgsl: Add back apriv bit for legacy targets msm: kgsl: Limit the HFI error log to 16 characters msm: kgsl: Initialize CP engine before loading the zap shader msm: kgsl: Detect missing per-process pagetable support and fallback cnss2: Add support of runtime Vreg enable for QCA6490 msm: msi: add support for Synopsys MSI sound: usb: Fix error handling path sound: usb: Fix possible race between release and cleanup sound: usb: Clear in_use if wait_event fails while disconnect sound: usb: Ensure proper cleanup of uaudio_dev under all scenarios leds: qpnp-flash-v2: Convert power_supply properties to iio leds: qpnp-flash-v2: Add support for qpnp-flash-v2 driver pinctrl: qcom: Update GPIO to PDC wakeirq map for shima soc-compress: Update error handling to cleanup backend msm: kgsl: Fix possible use-after-free while adding context to active list defconfig: Enable TouchScreen for QRD holi target arm64: enable internal regdb for holi icnss2: Extend thermal mitigation support feature Revert "soc: qcom: rpmh: Update dirty flag only when data changes" Revert "soc: qcom: rpmh: Invalidate SLEEP and WAKE TCSes before flushing new data" Revert "soc: qcom: rpmh-rsc: Clear active mode configuration for wake TCS" Revert "soc: qcom: rpmh-rsc: Allow using free WAKE TCS for active request" Revert "soc: qcom: rpmh: Dirt can only make you dirtier, not cleaner" Bluetooth: Add support for WCN399x series BT SoC clk: qcom: Add debug cc clk measure nodes for SDXLEMUR clk: qcom: gcc-sdxlemur: Add support for GCC clock driver driver: pinctrl: Add reserved GPIOs for Holi firmware: qcom: Remove garbage characters from qsee log qseecom: Check error when allocating coherent buffer msm:adsprpc: Prevent use after free in fastrpc_set_process_info iommu/arm-smmu: Support client configured dynamic domains only in QGKI cfg80211: Indicate support for BIGTK configuration PM / devfreq: qoslat: move registration to late init leds: qti-flash: Fix LMH mitigation configuration leds: qti-flash: Fix indentations and change macros to enum ABI: Add clock API's to GKI qcom whitelist BACKPORT: FROMLIST: cpuidle: change enter_s2idle() prototype scsi: ufs: Configure Vccq/Vccq2 with supplied load in LPM msm: ipa: Move internal definitions to the techpack defconfig: Enable TSENS and cooling device drivers for holi Linux 5.4.54 ath9k: Fix regression with Atheros 9271 ath9k: Fix general protection fault in ath9k_hif_usb_rx_cb dm integrity: fix integrity recalculation that is improperly skipped ASoC: topology: fix tlvs in error handling for widget_dmixer ASoC: topology: fix kernel oops on route addition error ASoC: qcom: Drop HAS_DMA dependency to fix link failure ASoC: rt5670: Add new gpio1_is_ext_spk_en quirk and enable it on the Lenovo Miix 2 10 x86, vmlinux.lds: Page-align end of ..page_aligned sections parisc: Add atomic64_set_release() define to avoid CPU soft lockups drm/amd/powerplay: fix a crash when overclocking Vega M drm/amdgpu: Fix NULL dereference in dpm sysfs handlers mmc: sdhci-of-aspeed: Fix clock divider calculation io-mapping: indicate mapping failure khugepaged: fix null-pointer dereference due to race mm: memcg/slab: fix memory leak at non-root kmem_cache destroy mm/memcg: fix refcount error while moving and swapping mm/mmap.c: close race between munmap() and expand_upwards()/downwards() Makefile: Fix GCC_TOOLCHAIN_DIR prefix for Clang cross compilation vt: Reject zero-sized screen buffer size. fbdev: Detect integer underflow at "struct fbcon_ops"->clear_margins. /dev/mem: Add missing memory barriers for devmem_inode serial: 8250_mtk: Fix high-speed baud rates clamping serial: 8250: fix null-ptr-deref in serial8250_start_tx() serial: tegra: fix CREAD handling for PIO staging: comedi: addi_apci_1564: check INSN_CONFIG_DIGITAL_TRIG shift staging: comedi: addi_apci_1500: check INSN_CONFIG_DIGITAL_TRIG shift staging: comedi: ni_6527: fix INSN_CONFIG_DIGITAL_TRIG support staging: comedi: addi_apci_1032: check INSN_CONFIG_DIGITAL_TRIG shift staging: wlan-ng: properly check endpoint types tty: xilinx_uartps: Really fix id assignment iwlwifi: mvm: don't call iwl_mvm_free_inactive_queue() under RCU Revert "cifs: Fix the target file was deleted when rename failed." usb: xhci: Fix ASM2142/ASM3142 DMA addressing usb: xhci-mtk: fix the failure of bandwidth allocation binder: Don't use mmput() from shrinker function. RISC-V: Upgrade smp_mb__after_spinlock() to iorw,iorw drivers/perf: Prevent forced unbinding of PMU drivers asm-generic/mmiowb: Allow mmiowb_set_pending() when preemptible() x86: math-emu: Fix up 'cmp' insn for clang ias arm64: Use test_tsk_thread_flag() for checking TIF_SINGLESTEP drivers/perf: Fix kernel panic when rmmod PMU modules during perf sampling ALSA: hda/realtek - fixup for yet another Intel reference board hwmon: (scmi) Fix potential buffer overflow in scmi_hwmon_probe() platform/x86: asus-wmi: allow BAT1 battery name platform/x86: ISST: Add new PCI device ids hwmon: (nct6775) Accept PECI Calibration as temperature source for NCT6798D drm/amdgpu: fix preemption unit test drm/amdgpu/gfx10: fix race condition for kiq hwmon: (adm1275) Make sure we are reading enough data for different chips usb: cdns3: trace: fix some endian issues usb: cdns3: ep0: fix some endian issues usb: gadget: udc: gr_udc: fix memleak on error handling path in gr_ep_init() usb: dwc3: pci: add support for the Intel Jasper Lake usb: dwc3: pci: add support for the Intel Tiger Lake PCH -H variant Input: elan_i2c - only increment wakeup count on touch Input: synaptics - enable InterTouch for ThinkPad X1E 1st gen dmaengine: ioat setting ioat timeout as module parameter dmaengine: fsl-edma: fix wrong tcd endianness for big-endian cpu hwmon: (aspeed-pwm-tacho) Avoid possible buffer overflow regmap: dev_get_regmap_match(): fix string comparison spi: mediatek: use correct SPI_CFG2_REG MACRO ARM: dts: n900: remove mmc1 card detect gpio Input: add `SW_MACHINE_COVER` dmaengine: tegra210-adma: Fix runtime PM imbalance on error HID: apple: Disable Fn-key key-re-mapping on clone keyboards HID: steam: fixes race in handling device list. HID: alps: support devices with report id 2 HID: i2c-hid: add Mediacom FlexBook edge13 to descriptor override scripts/gdb: fix lx-symbols 'gdb.error' while loading modules scripts/decode_stacktrace: strip basepath from all paths serial: exar: Fix GPIO configuration for Sealevel cards based on XR17V35X geneve: fix an uninitialized value in geneve_changelink() bonding: check return value of register_netdevice() in bond_newlink() i2c: i2c-qcom-geni: Fix DMA transfer race i2c: rcar: always clear ICSAR to avoid side effects enetc: Remove the mdio bus on PF probe bailout nfsd4: fix NULL dereference in nfsd/clients display code Revert "PCI/PM: Assume ports without DLL Link Active train links in 100 ms" net: ethernet: ave: Fix error returns in ave_init ipvs: fix the connection sync failed in some cases qed: suppress false-positives interrupt error messages on HW init qed: suppress "don't support RoCE & iWARP" flooding on HW init netdevsim: fix unbalaced locking in nsim_create() net: dsa: microchip: call phy_remove_link_mode during probe net: hns3: fix error handling for desc filling net: ag71xx: add missed clk_disable_unprepare in error path of probe ionic: fix up filter locks and debug msgs ionic: use offset for ethtool regs data mlxsw: destroy workqueue when trap_register in mlxsw_emad_init bonding: check error value of register_netdevice() immediately net: smc91x: Fix possible memory leak in smc_drv_probe() drm: sun4i: hdmi: Fix inverted HPD result ieee802154: fix one possible memleak in adf7242_probe net: dp83640: fix SIOCSHWTSTAMP to update the struct with actual configuration ASoC: Intel: bytcht_es8316: Add missed put_device() RDMA/mlx5: Use xa_lock_irq when access to SRQ table ax88172a: fix ax88172a_unbind() failures vsock/virtio: annotate 'the_virtio_vsock' RCU pointer hippi: Fix a size used in a 'pci_free_consistent()' in an error handling path fpga: dfl: fix bug in port reset handshake fpga: dfl: pci: reduce the scope of variable 'ret' bnxt_en: Fix completion ring sizing with TPA enabled. bnxt_en: Fix race when modifying pause settings. btrfs: fix page leaks after failure to lock page for delalloc btrfs: fix mount failure caused by race with umount btrfs: fix double free on ulist after backref resolution failure ASoC: rt5670: Correct RT5670_LDO_SEL_MASK ALSA: info: Drop WARN_ON() from buffer NULL sanity check ALSA: hda/realtek: Fixed ALC298 sound bug by adding quirk for Samsung Notebook Pen S uprobes: Change handle_swbp() to send SIGTRAP with si_code=SI_KERNEL, to fix GDB regression btrfs: reloc: clear DEAD_RELOC_TREE bit for orphan roots to prevent runaway balance btrfs: reloc: fix reloc root leak and NULL pointer dereference SUNRPC revertingd03727b248
("NFSv4 fix CLOSE not waiting for direct IO compeletion") drm/amd/display: Check DMCU Exists Before Loading dmabuf: use spinlock to access dmabuf->name ARM: dts: imx6qdl-gw551x: fix audio SSI ARM: dts: imx6qdl-gw551x: Do not use 'simple-audio-card,dai-link' irqdomain/treewide: Keep firmware node unconditionally allocated fuse: fix weird page warning drivers/firmware/psci: Fix memory leakage in alloc_init_cpu_groups() dm: use bio_uninit instead of bio_disassociate_blkg scsi: dh: Add Fujitsu device to devinfo and dh lists scsi: mpt3sas: Fix error returns in BRM_status_show drm/nouveau/i2c/g94-: increase NV_PMGR_DP_AUXCTL_TRANSACTREQ timeout net: sky2: initialize return of gm_phy_read ALSA: hda/hdmi: fix failures at PCM open on Intel ICL and later drivers/net/wan/lapbether: Fixed the value of hard_header_len scsi: mpt3sas: Fix unlock imbalance xtensa: update *pos in cpuinfo_op.next xtensa: fix __sync_fetch_and_{and,or}_4 declarations scsi: scsi_transport_spi: Fix function pointer check mac80211: allow rx of mesh eapol frames with default rx key pinctrl: amd: fix npins for uart0 in kerncz_groups gpio: arizona: put pm_runtime in case of failure gpio: arizona: handle pm_runtime_get_sync failure case soc: qcom: rpmh: Dirt can only make you dirtier, not cleaner usb: gadget: audio: Free requests only after callback arm64: defconfig: Enable USB_CONFIGFS_F_UAC2 for Lahaina usb: gadget: Allow USB_CONFIGFS_F_UAC2 to be built as a module usb: f_uac2: Add SS/SSP support to UAC2 function usb: gadget: uac2: Change synchronization type of data ep to SYNC msm: kgsl: Update pagefault policy when KGSL_STATE_ACTIVE usb: xhci: Replace HCD_RH_RUNNING() check in xhci_stop_endpoint ABI: Sybmol list update regulator: rpm-smd: Add support for BOB on PMIC5 RTC6226: append the valid channel in scan list net: qrtr: ns: Increase socket recvbuf usb: misc: nb7vpq904m: support 4 lanes display cnss2: Update QMI header file for PCIE gen switch and bdf data cnss2: Get Bus bandwidth voting table from DT usb: dwc3: Disable parkmode for Gen1 controllers msm: cvp: Dump testbus for CVP debugging USB: configfs: Don't send DISCONNECT uevent during unbind dma-mapping-fast: Fix sg-list length calculation in fast_smmu_unmap_sg() dma-mapping-fast: Add tracepoints for sg-list mapping functions msm: ADSPRPC: Map and FD non-NULL check before dereferencing dwc3: trace: Remove unused field with dwc3 request tracing cnss2: Add additional PBL registers to debug dumps ANDROID: build: update ABI definitions arm64: defconfig: Enabled download/reboot reason drivers for Lahaina firmware: qcom_scm: Add SCM call to perform warm reboot firmware: qcom_scm: Disable SDI during shutdown soc: qcom: Add watchdog bite in panic power: reset: Add qcom reboot reason driver power: reset: qcom-dload-mode: Add support for changing dump mode power: reset: qcom-dload-mode: Store KASLR offset when available power: reset: qcom-dload-mode: Add support for setting emmc dload mode power: reset: Add qcom-dload-mode driver defconfig: sdxlemur: enable QCOM PCIe drivers msm: pcie: remove legacy arm32 IRQ support msm: pcie: check return value when enabling PCIe GDSC ARM: qcom: enable PCI for sdxlemur RTC6226: send the hardware error event when tune/seek timed out scsi: ufs-qcom: Do not return uninitialized err value msm: kgsl: Unbind adreno from component device for nogmu sched/walt: Improve the scheduler msm: kgsl: Allow state transition to nap from valid states soc: qcom: Add support to enable eud if enabled in xbl clk: qcom: debugcc: Move the initcall for HOLI pinctrl: qcom: function group for qup13_f* instance for holi coresight: tpdm: add integration_test sysfs node regmap: irq: Add support to clear ack registers drm/bridge: LT9611UXC: add LT9611UXC driver for HDK8350 dt-bindings: regulator: define RPM-SMD regulator modes msm: kgsl: fix a condition error and set L3 clock rate fail soc: altmode: Add correct notify message length check msm: kgsl: Delete unused source file msm: kgsl: Add Battery Current Limiting support for A6xx ABI: symbols: Update symbol list ANDROID: update the kernel release format for GKI usb: dwc3-msm: Add eud to MODULE_SOFTDEP Revert "UPSTREAM: mmc: sdhci-msm: Don't enable PWRSAVE_DLL for certain sdhc hosts" Revert "BACKPORT: mmc: sdhci-msm: Set IO pins in low power state during suspend" Revert "mmc: sdhci-msm: Update DDR_CONFIG reg with HSR value if supplied" msm: cvp: Relocate CVP HW PC control leds: qti-flash: Allow dynamic symmetry current redistribution msm: kgsl: Enable Preemption on A660 target scsi: ufs: Read device tree to find UFS's Vccq2 voltage level sched/walt: Improve the scheduler msm: adsprpc: Allow kernel and static handle contexts arm64: defconfig: Enable interconnect driver for Holi ANDROID: GKI: update clocksource abi due to upstream fixes needed for VDSO backport UPSTREAM: arm64: arch_timer: Disable the compat vdso for cores affected by ARM64_WORKAROUND_1418040 UPSTREAM: arm64: arch_timer: Allow an workaround descriptor to disable compat vdso UPSTREAM: arm64: Introduce a way to disable the 32bit vdso msm: kgsl: Add support for gmu wrapper memory region ABI: Update CRC for audio fixes input: qcom-hv-haptics: update LRA period calculations Revert "pinctrl: set gpio 4 and 5 for qup14" input: qcom-hv-haptics: notify HBOOST to keep VREG on during play regulator: rpm-smd: Add support for min dropout voltage drivers: thermal: use zero C status as sensor value instead of min temp ANDROID: staging: android: ion: Fix compilation error for ion_trace.h drivers: pinctrl: sdxlemur: add GPIO PDC map defconfig: enable power management functionality for sdxlemur soc: qcom: mem-offline: log additional time stats power: supply: qti_battery_charger: Keep device awake during notification usb: dwc3: gadget: Check controller status with endpoint enable/disable soc: qcom: pil: Do not do complete ramdump for minidump elf32 iommu-debug: Remove calls to iommu_enable_config_clocks iommu-debug: Remove trigger-fault functionality io-pgtable-fast: Remove av8l_fast_cfg defconfig: Enable MM defconfigs for sdxlemur defconfig: Enable Ion for sdxlemur defconfig: Enable CONFIG_ARM_SMMU for sdxlemur ANDROID: GKI: enable CONFIG_SCSI_UFS_BSG=y ABI: Update snapshot with CRC information soc: qcom: pil: Add property to change minidump ELF format ANDROID: Incremental fs: magic number compatible 32-bit cpufreq: qcom-cpufreq-hw: Add support for CPUFreq hardware debug soc: qcom: mem-offline: add pasr support for rpm-smd based targets memshare: Support hot plug detection for memshare sched/tracing: GKI friendly long preempt/irq disable traces lpm-levels: Add RIMPS timer base rail/PLL turn off functionality ANDROID: kbuild: don't merge .*..compoundliteral in modules scsi: ufs: Fix overlapping quirks ANDROID: kbuild: merge more sections with LTO ANDROID: kbuild: don't merge .*..compoundliteral in modules scsi: ufs-qcom: Skip getting fsm state in dme context scsi:ufs: Keep UFS's high power mode when bkops enabled net: qrtr: ns: Change to ratelimited prints net: qrtr: ns: Improve ipc logging usb: dwc3: gadget: Rate limit error message within ep_dequeue() API msm: kgsl: Enable UCHE dual command queue ANDROID: KABI updates for db845c (QCOM_COMMAND_DB fixups) ANDROID: soc: qcom: cmd-db: Allow COMMAND_DB driver to be loaded as a module NFC: Enable NFC driver in the GKI build drivers: thermal: qmi_cooling: Treat all devices as max type devices pinctrl: set gpio 4 and 5 for qup14 soc: fix gapless playback failure ANDROID: GKI: preserve ABI for struct sock_cgroup_data Revert "genetlink: remove genl_bind" Revert "arm64/alternatives: use subsections for replacement sequences" defconfig: Enable TouchScreen for holi target phy: ufs: Add UFS PHY support for Holi mhi: core: Error handling for pending packets in mission_mode dt-bindings: Add macros for defining USB QMP PHY registers ANDROID: KABI updates for db845c (USB_EHCI_HCD, USB_EHCI_HCD_PLATFORM and DWC3 fixups) ANDROID: db845c_gki.fragment: Remove DWC3 modules built into GKI ANDROID: db845c_gki.fragment: Remove modules built into GKI tracing/sched: Clean up preemptoff/irqsoff extensions cpuidle: lpm-levels: Remove dependency on QGKI ANDROID: power: wakeup_reason: refine wakeup logs ANDROID: power: wakeup_reason: export log_threaded_irq_wakeup_reason rpmsg: glink: Update signals interface firmware: qcom_scm: Set DMA coherent mask as well as the streaming mask mm/oom_kill: Online memory before running oom-killer mm/memory_hotplug: Fix try_online_one_block() logic mm/memory_hotplug: Fix deadlock in try_online_one_block() haven: ctrl: add nohypuart commandline parameter drivers: thermal: Add support for RPM SMD cooling device drivers: thermal: regulator-cdev: Snapshot of regulator cooling device fsa4480: Fix headset not detected during system suspend clk: qcom: shima: Update frequency tables and VDD data clk: qcom: gcc: Update GCC code for HOLI Linux 5.4.53 gpio: pca953x: disable regmap locking for automatic address incrementing drm/i915/gvt: Fix two CFL MMIO handling caused by regression. iommu/vt-d: Make Intel SVM code 64-bit only ionic: export features for vlans to use spi: sprd: switch the sequence of setting WDG_LOAD_LOW and _HIGH rxrpc: Fix trace string libceph: don't omit recovery_deletes in target_copy() block: fix get_max_segment_size() overflow on 32bit arch block: fix splitting segments on boundary masks drm/i915/gt: Ignore irq enabling on the virtual engines drm/amdgpu/sdma5: fix wptr overwritten in ->get_wptr() genirq/affinity: Handle affinity setting on inactive interrupts correctly sched/fair: handle case of task_h_load() returning 0 sched: Fix unreliable rseq cpu_id for new tasks arm64: compat: Ensure upper 32 bits of x0 are zero on syscall return arm64: ptrace: Consistently use pseudo-singlestep exceptions arm64: ptrace: Override SPSR.SS when single-stepping is enabled thermal/drivers/cpufreq_cooling: Fix wrong frequency converted from power thermal: int3403_thermal: Downgrade error message misc: atmel-ssc: lock with mutex instead of spinlock dmaengine: fsl-edma-common: correct DSIZE_32BYTE dmaengine: mcf-edma: Fix NULL pointer exception in mcf_edma_tx_handler dmaengine: fsl-edma: Fix NULL pointer exception in fsl_edma_tx_handler intel_th: Fix a NULL dereference when hub driver is not loaded intel_th: pci: Add Emmitsburg PCH support intel_th: pci: Add Tiger Lake PCH-H support intel_th: pci: Add Jasper Lake CPU support powerpc/pseries/svm: Fix incorrect check for shared_lppaca_size powerpc/book3s64/pkeys: Fix pkey_access_permitted() for execute disable pkey hwmon: (emc2103) fix unable to change fan pwm1_enable attribute riscv: use 16KB kernel stack on 64-bit timer: Fix wheel index calculation on last level timer: Prevent base->clk from moving backward scsi: megaraid_sas: Remove undefined ENABLE_IRQ_POLL macro uio_pdrv_genirq: fix use without device tree and no interrupt uio_pdrv_genirq: Remove warning when irq is not specified Input: elan_i2c - add more hardware ID for Lenovo laptops Input: i8042 - add Lenovo XiaoXin Air 12 to i8042 nomux list mei: bus: don't clean driver pointer Revert "zram: convert remaining CLASS_ATTR() to CLASS_ATTR_RO()" fuse: Fix parameter for FS_IOC_{GET,SET}FLAGS fuse: use ->reconfigure() instead of ->remount_fs() fuse: ignore 'data' argument of mount(..., MS_REMOUNT) ovl: fix unneeded call to ovl_change_flags() ovl: relax WARN_ON() when decoding lower directory file handle ovl: inode reference leak in ovl_is_inuse true case. ovl: fix regression with re-formatted lower squashfs serial: mxs-auart: add missed iounmap() in probe failure and remove virtio: virtio_console: add missing MODULE_DEVICE_TABLE() for rproc serial Revert "tty: xilinx_uartps: Fix missing id assignment to the console" virt: vbox: Fix guest capabilities mask check virt: vbox: Fix VBGL_IOCTL_VMMDEV_REQUEST_BIG and _LOG req numbers to match upstream USB: serial: option: add Quectel EG95 LTE modem USB: serial: option: add GosunCn GM500 series USB: serial: ch341: add new Product ID for CH340 USB: serial: cypress_m8: enable Simply Automated UPB PIM USB: serial: iuu_phoenix: fix memory corruption usb: gadget: function: fix missing spinlock in f_uac1_legacy usb: chipidea: core: add wakeup support for extcon usb: dwc2: Fix shutdown callback in platform USB: c67x00: fix use after free in c67x00_giveback_urb ALSA: hda/realtek - Enable Speaker for ASUS UX563 ALSA: hda/realtek - Enable Speaker for ASUS UX533 and UX534 ALSA: hda/realtek: Enable headset mic of Acer TravelMate B311R-31 with ALC256 ALSA: hda/realtek: enable headset mic of ASUS ROG Zephyrus G14(G401) series with ALC289 ALSA: hda/realtek - change to suitable link model for ASUS platform ALSA: usb-audio: Fix race against the error recovery URB submission ALSA: line6: Sync the pending work cancel at disconnection ALSA: line6: Perform sanity check for each URB creation HID: quirks: Ignore Simply Automated UPB PIM HID: quirks: Always poll Obins Anne Pro 2 keyboard HID: magicmouse: do not set up autorepeat HID: logitech-hidpp: avoid repeated "multiplier = " log messages slimbus: core: Fix mismatch in of_node_get/put clk: qcom: gcc: Add missing UFS clocks for SM8150 clk: qcom: gcc: Add GPU and NPU clocks for SM8150 mtd: rawnand: oxnas: Release all devices in the _remove() path mtd: rawnand: oxnas: Unregister all devices on error mtd: rawnand: oxnas: Keep track of registered devices mtd: rawnand: brcmnand: fix CS0 layout mtd: rawnand: brcmnand: correctly verify erased pages mtd: rawnand: timings: Fix default tR_max and tCCS_min timings mtd: rawnand: marvell: Fix probe error path mtd: rawnand: marvell: Use nand_cleanup() when the device is not yet registered mtd: rawnand: marvell: Fix the condition on a return code RDMA/mlx5: Verify that QP is created with RQ or SQ soc: qcom: rpmh-rsc: Allow using free WAKE TCS for active request soc: qcom: rpmh-rsc: Clear active mode configuration for wake TCS soc: qcom: rpmh: Invalidate SLEEP and WAKE TCSes before flushing new data soc: qcom: rpmh: Update dirty flag only when data changes perf stat: Zero all the 'ena' and 'run' array slot stats for interval mode PCI/PM: Call .bridge_d3() hook only if non-NULL habanalabs: Align protection bits configuration of all TPCs apparmor: ensure that dfa state tables have entries soc: qcom: socinfo: add missing soc_id sysfs entry arm: dts: mt7623: add phy-mode property for gmac2 copy_xstate_to_kernel: Fix typo which caused GDB regression regmap: debugfs: Don't sleep while atomic for fast_io regmaps keys: asymmetric: fix error return code in software_key_query() arm64: dts: spcfpga: Align GIC, NAND and UART nodenames with dtschema ARM: dts: socfpga: Align L2 cache-controller nodename with dtschema xprtrdma: fix incorrect header size calculations Revert "thermal: mediatek: fix register index error" ARM: dts: Fix dcan driver probe failed on am437x platform fuse: don't ignore errors from fuse_writepages_fill() NFS: Fix interrupted slots by sending a solo SEQUENCE operation clk: AST2600: Add mux for EMMC clock clk: mvebu: ARMADA_AP_CPU_CLK needs to select ARMADA_AP_CP_HELPER staging: comedi: verify array index is correct before using it usb: gadget: udc: atmel: fix uninitialized read in debug printk spi: spi-sun6i: sun6i_spi_transfer_one(): fix setting of clock rate dmaengine: dmatest: stop completed threads when running without set channel dmaengine: dw: Initialize channel before each transfer iio: adc: ad7780: Fix a resource handling path in 'ad7780_probe()' bus: ti-sysc: Do not disable on suspend for no-idle bus: ti-sysc: Fix sleeping function called from invalid context for RTC quirk bus: ti-sysc: Fix wakeirq sleeping function called from invalid context arm64: dts: meson-gxl-s805x: reduce initial Mali450 core frequency arm64: dts: meson: add missing gxl rng clock phy: sun4i-usb: fix dereference of pointer phy0 before it is null checked dmaengine: sh: usb-dmac: set tx_result parameters soundwire: intel: fix memory leak with devm_kasprintf iio:health:afe4404 Fix timestamp alignment and prevent data leak. ALSA: usb-audio: Add registration quirk for Kingston HyperX Cloud Flight S bus: ti-sysc: Use optional clocks on for enable and wait for softreset bit ACPI: video: Use native backlight on Acer TravelMate 5735Z Input: mms114 - add extra compatible for mms345l ALSA: usb-audio: Add quirk for Focusrite Scarlett 2i2 ALSA: usb-audio: Add registration quirk for Kingston HyperX Cloud Alpha S ACPI: video: Use native backlight on Acer Aspire 5783z ALSA: usb-audio: Rewrite registration quirk handling mmc: sdhci: do not enable card detect interrupt for gpio cd type doc: dt: bindings: usb: dwc3: Update entries for disabling SS instances in park mode ALSA: usb-audio: Create a registration quirk for Kingston HyperX Amp (0951:16d8) Input: goodix - fix touch coordinates on Cube I15-TC ALSA: usb-audio: Add support for MOTU MicroBook IIc bus: ti-sysc: Detect EDMA and set quirk flags for tptc arm64: dts: g12-common: add parkmode_disable_ss_quirk on DWC3 controller bus: ti-sysc: Detect display subsystem related devices bus: ti-sysc: Handle module unlock quirk needed for some RTC bus: ti-sysc: Consider non-existing registers too when matching quirks bus: ti-sysc: Rename clk related quirks to pre_reset and post_reset quirks scsi: sr: remove references to BLK_DEV_SR_VENDOR, leave it enabled drm/sun4i: tcon: Separate quirks for tcon0 and tcon1 on A20 ARM: at91: pm: add quirk for sam9x60's ulp1 HID: quirks: Remove ITE 8595 entry from hid_have_special_driver mmc: mmci: Support any block sizes for ux500v2 and qcom variant ARM: OMAP2+: use separate IOMMU pdata to fix DRA7 IPU1 boot ARM: OMAP2+: Add workaround for DRA7 DSP MStandby errata i879 ARM: OMAP4+: remove pdata quirks for omap4+ iommus net: sfp: add some quirks for GPON modules net: sfp: add support for module quirks Revert "usb/xhci-plat: Set PM runtime as active on resume" Revert "usb/ehci-platform: Set PM runtime as active on resume" Revert "usb/ohci-platform: Fix a warning when hibernating" net: ethernet: mvneta: Add back interface mode validation net: ethernet: mvneta: Do not error out in non serdes modes net: macb: call pm_runtime_put_sync on failure path of: of_mdio: Correct loop scanning logic net: dsa: bcm_sf2: Fix node reference count spi: spi-fsl-dspi: Fix lockup if device is shutdown during SPI transfer iio:health:afe4403 Fix timestamp alignment and prevent data leak. iio:pressure:ms5611 Fix buffer element alignment iio:humidity:hts221 Fix alignment and data leak issues iio: pressure: zpa2326: handle pm_runtime_get_sync failure iio: mma8452: Add missed iio_device_unregister() call in mma8452_probe() iio: core: add missing IIO_MOD_H2/ETHANOL string identifiers iio: magnetometer: ak8974: Fix runtime PM imbalance on error iio:humidity:hdc100x Fix alignment and data leak issues iio:magnetometer:ak8974: Fix alignment and data leak issues arm64/alternatives: don't patch up internal branches i2c: eg20t: Load module automatically if ID matches gfs2: read-only mounts should grab the sd_freeze_gl glock tpm_tis: extra chip->ops check on error path in tpm_tis_core_init arm64/alternatives: use subsections for replacement sequences cifs: prevent truncation from long to int in wait_for_free_credits dt-bindings: mailbox: zynqmp_ipi: fix unit address m68k: mm: fix node memblock init m68k: nommu: register start of the memory with memblock blk-mq-debugfs: update blk_queue_flag_name[] accordingly for new flags thermal/drivers: imx: Fix missing of_node_put() at probe time x86/fpu: Reset MXCSR to default in kernel_fpu_begin() drm/exynos: fix ref count leak in mic_pre_enable drm/exynos: Properly propagate return value in drm_iommu_attach_device() drm/msm/dpu: allow initialization of encoder locks during encoder init drm/msm: fix potential memleak in error branch arm64: arch_timer: Disable the compat vdso for cores affected by ARM64_WORKAROUND_1418040 arm64: arch_timer: Allow an workaround descriptor to disable compat vdso arm64: Introduce a way to disable the 32bit vdso ip: Fix SO_MARK in RST, ACK and ICMP packets cgroup: Fix sock_cgroup_data on big-endian. cgroup: fix cgroup_sk_alloc() for sk_clone_lock() tcp: md5: allow changing MD5 keys in all socket states tcp: md5: refine tcp_md5_do_add()/tcp_md5_hash_key() barriers vlan: consolidate VLAN parsing code and limit max parsing depth tcp: md5: do not send silly options in SYNCOOKIES tcp: md5: add missing memory barriers in tcp_md5_do_add()/tcp_md5_hash_key() tcp: make sure listeners don't initialize congestion-control state tcp: fix SO_RCVLOWAT possible hangs under high mem pressure sched: consistently handle layer3 header accesses in the presence of VLANs net: usb: qmi_wwan: add support for Quectel EG95 LTE modem net_sched: fix a memory leak in atm_tc_init() net: dsa: microchip: set the correct number of ports net: Added pointer check for dst->ops->neigh_lookup in dst_neigh_lookup_skb llc: make sure applications use ARPHRD_ETHER l2tp: remove skb_dst_set() from l2tp_xmit_skb() ipv6: Fix use of anycast address with loopback ipv6: fib6_select_path can not use out path for nexthop objects ipv4: fill fl4_icmp_{type,code} in ping_v4_sendmsg genetlink: remove genl_bind bridge: mcast: Fix MLD2 Report IPv6 payload length check net: rmnet: fix lower interface leak net: atlantic: fix ip dst and ipv6 address filters crypto: atmel - Fix build error of CRYPTO_AUTHENC crypto: atmel - Fix selection of CRYPTO_AUTHENC irqchip: mpm: Update mpm mapping for tsense interrupts for holi interconnect: qcom: Add interconnect provider driver for Holi spi: spi-msm-geni: Add support in SPI driver for Trusted VM dt-bindings: clock: Update GCC clock ids for HOLI defconfig: msm: enable remote debugger driver scripts: gki: Disable DEBUG_FS for user variant builds crypto: msm: Fix null pointer dereference msm: cvp: Cancel pending synx during SSR ANDROID: GKI: update abi symbol lists now that CONFIG_DWC3 is enabled. defconfig: lahaina-qgki: enable system PM violators driver sched/walt: Improve the scheduler ANDROID: GKI: Enable CONFIG_USB_DWC3 usb: dt-bindings: Add USB QMP PHY registers definition ANDROID: ABI: add the symbols of dwc3.ko and sprd-dma.ko to unisoc msm: kgsl: Use correct gpudev for A660 GPU variant drivers: thermal: Add modem and wlan bandwidth cdevs to QMI devices msm: ipa: Add ipa hw and gsi changes for holi input: touchscreen: synaptics_tcm: Fix Propagation input: touchscreen: synaptics_tcm: enable touch driver clk: Add support to provide OPP tables for clocks coresight: cti: Add sys interface to show max trigger number ufs: ufs-qcom: add device quirk for Micron to avoid OCP usb: gadget: f_midi: Avoid invalid pointer access Revert "usb: dwc3: gadget: Properly handle ClearFeature(halt)" Revert "ANDROID: kbuild: merge more sections with LTO" ANDROID: ABI: Update the ABI whitelist for QCOM soc: qcom: socinfo: Add the soc-id for Lahaina ATP soc: qcom: eud: Enable EUD IRQs by default defconfig: lahaina: enable DSCP based match msm: pcie: add DRV enabled status for each RC usb: gadget: qdss: Add error log with set_alt failure cases usb: dwc3: gadget: WARN on no-resource status clk: qcom: debugcc: Add support for Debugcc for HOLI clk: qcom: dispcc: Add support for dispcc driver drivers: thermal: pe_sensor: Clear the victim IRQ status ANDROID: GKI: Update CF abi list for virtio-console usb: phy: Add snapshot of QUSB-V2 PHY driver usb: misc: nb7vpq904m: move gpio init before register ucsi callback usb: phy: snps: Enable auto-resume during host mode bus suspend arm64: defconfig: Disable CONFIG_CFI_PERMISSIVE flag sound: usb: qmi: Clean up log messages defconfig: holi: Enable dispcc and debugcc drivers: soc: qcom: Make global minidump table pointer NULL interconnect: qcom: Add SDC1 master for Shima icc: dt-bindings: Add SDC1 master ID for Shima arm64: defconfig: Add support for DISPCC, debugCC for SHIMA clk: qcom: debugcc: Add debug clock controller support for SHIMA clk: qcom: dispcc: Add display clock controller for SHIMA coresight-tmc: Use sysfs_buf for byte-cntr and sw usb cases clk: qcom: Add support for pm ops for Multimedia clock controllers ABI: Add pm_clk* symbols to qcom whitelist msm: adsprpc: double free when creating dynamic process leds: qti-flash: Support zero duration for flash safety timer leds: qti-flash: Fix debug prints, read more than one byte kernel: sound: remove decoder structure definition adsprpc: set QoS only to silver cluster UPSTREAM: lkdtm/heap: Avoid edge and middle of slabs UPSTREAM: lkdtm: Avoid more compiler optimizations for bad writes sched: Enable latency sensitive feature sound: usb: qmi: Move QMI service init to driver probe interconnect: qcom: Compile Shima interconnect provider driver dwc3: gadget: Don't perform SET XFER resource with USB GSI endpoint ANDROID: GKI: Update ABI after RPMH config change ANDROID: GKI: Adjust symbol lists after RPMH removed from gki_defconfig ANDROID: db845c_gki.fragment: Add QCOM_RPMH and QCOM_RPMHPD as modules ANDROID: gki_defconfig: Remove QCOM_RPMH from the gki_defconfig ANDROID: Kconfig.gki: Remove GKI_QCOM_CLKS_CONFIGS and QCOM_RPMHPD from GKI_HACKS config option FROMLIST: soc: qcom: rpmh: Allow RPMH driver to be loaded as a module UPSTREAM: soc: qcom: rpmhpd: Allow RPMHPD driver to be loaded as a module ABI: Update internal whitelist with hyp assign ANDROID: GKI: Export memblock_free to drivers qseecom: Change in buffer sharing mechanism in qseecom firmware: scm: Remove arch check for dma_set_mask cpuidle: lpm-levels: no hotplug for single core drivers: qcom: rpmh: allow RPMH on ARM SoC drivers: irqchip: pdc: Add irqchip for sdxlemur usb: f_qdss: Cleanup control interface as no longer in use drivers: qcom: stats: define readq_relaxed for ARM variants clk: qcom: Update GCC/GPUCC code for HOLI platform: msm-geni-se: Return correct Error code in probe context icc: dt-bindings: Update endpoint IDs for interconnects for HOLI ANDROID: GKI: do not export symbol_get/put() scsi: ufs: Clear uic_cmd->cmd_active before calling complete() soc: qcom: spcom: spcom vote for PM runtime suspend/resume serail: msm_geni_serial: Stop TX Engine during port close soc: qcom: rpmh-rsc: Set suppress_bind_attrs flag ANDROID: add xfs back to allmodconfig build tests iommu-debug: Use apply_to_new_mapping to reset fastmap arm: dma-mapping: Use iommu_dma ops for arm32 iommu-debug: Remove extra iterations arm: dma-mapping: Add support for CONFIG_IOMMU_DMA irqchip: qcom-pdc: Add support to load PDC on shima as module FROMLIST: rpmsg: core: Add signal API support pci: pci-msm-msi: Update the msi address size msm: kgsl: Make sure first boot sequence is complete during touch event ANDROID: GKI: Fix x86 warning on DMA_VIRTUAL_CHANNELS ANDROID: GKI: Update ABI and export list for qcom Revert "ANDROID: net: enable wireless core features with GKI_LEGACY_WEXT_ALLCONFIG" Revert "ALSA: compress: fix partial_drain completion state" Linux 5.4.52 s390/maccess: add no DAT mode to kernel_write s390: Change s390_kernel_write() return type to match memcpy() pwm: jz4740: Fix build failure perf scripts python: exported-sql-viewer.py: Fix unexpanded 'Find' result perf scripts python: exported-sql-viewer.py: Fix zero id in call tree 'Find' result perf scripts python: exported-sql-viewer.py: Fix zero id in call graph 'Find' result perf scripts python: export-to-postgresql.py: Fix struct.pack() int argument dm writecache: reject asynchronous pmem devices blk-mq: consider non-idle request as "inflight" in blk_mq_rq_inflight() s390/mm: fix huge pte soft dirty copying s390/setup: init jump labels before command line parsing ARC: elf: use right ELF_ARCH ARC: entry: fix potential EFA clobber when TIF_SYSCALL_TRACE mmc: meson-gx: limit segments to 1 when dram-access-quirk is needed dm: use noio when sending kobject event drm/amdgpu: don't do soft recovery if gpu_recovery=0 drm/radeon: fix double free btrfs: fix double put of block group with nocow btrfs: fix fatal extent_buffer readahead vs releasepage race Revert "ath9k: Fix general protection fault in ath9k_hif_usb_rx_cb" bpf: Check correct cred for CAP_SYSLOG in bpf_dump_raw_ok() kprobes: Do not expose probe addresses to non-CAP_SYSLOG module: Do not expose section addresses to non-CAP_SYSLOG module: Refactor section attr into bin attribute kallsyms: Refactor kallsyms_show_value() to take cred KVM: arm64: Fix kvm_reset_vcpu() return code being incorrect with SVE KVM: x86: Mark CR4.TSD as being possibly owned by the guest KVM: x86: Inject #GP if guest attempts to toggle CR4.LA57 in 64-bit mode KVM: x86: bit 8 of non-leaf PDPEs is not reserved KVM: arm64: Annotate hyp NMI-related functions as __always_inline KVM: arm64: Stop clobbering x0 for HVC_SOFT_RESTART KVM: arm64: Fix definition of PAGE_HYP_DEVICE ALSA: hda/realtek: Enable headset mic of Acer Veriton N4660G with ALC269VC ALSA: hda/realtek: Enable headset mic of Acer C20-820 with ALC269VC ALSA: hda/realtek - Enable audio jacks of Acer vCopperbox with ALC269VC ALSA: hda/realtek - Fix Lenovo Thinkpad X1 Carbon 7th quirk subdevice id ALSA: usb-audio: Add implicit feedback quirk for RTX6001 ALSA: usb-audio: add quirk for MacroSilicon MS2109 ALSA: hda - let hs_mic be picked ahead of hp_mic ALSA: opl3: fix infoleak in opl3 IB/hfi1: Do not destroy link_wq when the device is shut down IB/hfi1: Do not destroy hfi1_wq when the device is shut down mlxsw: pci: Fix use-after-free in case of failed devlink reload mlxsw: spectrum_router: Remove inappropriate usage of WARN_ON() net: macb: fix call to pm_runtime in the suspend/resume functions net: macb: mark device wake capable when "magic-packet" property present net: macb: fix wakeup test in runtime suspend/resume routines bnxt_en: fix NULL dereference in case SR-IOV configuration fails net/mlx5e: Fix 50G per lane indication net/mlx5: Fix eeprom support for SFP module qed: Populate nvm-file attributes while reading nvm config partition. IB/mlx5: Fix 50G per lane indication cxgb4: fix all-mask IP address comparison nbd: Fix memory leak in nbd_add_socket arm64: kgdb: Fix single-step exception handling oops RDMA/siw: Fix reporting vendor_part_id ALSA: compress: fix partial_drain completion state net: hns3: fix use-after-free when doing self test net: hns3: add a missing uninit debugfs when unload driver smsc95xx: avoid memory leak in smsc95xx_bind smsc95xx: check return value of smsc95xx_reset perf intel-pt: Fix PEBS sample for XMM registers perf intel-pt: Fix recording PEBS-via-PT with registers perf report TUI: Fix segmentation fault in perf_evsel__hists_browse() netfilter: conntrack: refetch conntrack after nf_conntrack_update() net: dsa: microchip: set the correct number of ports IB/sa: Resolv use-after-free in ib_nl_make_request() net: cxgb4: fix return error value in t4_prep_fw net: mvneta: fix use of state->speed netfilter: ipset: call ip_set_free() instead of kfree() bpf, sockmap: RCU dereferenced psock may be used outside RCU block bpf, sockmap: RCU splat with redirect and strparser error or TLS drm/mediatek: Check plane visibility in atomic_update nl80211: don't return err unconditionally in nl80211_start_ap() gpio: pca953x: Fix GPIO resource leak on Intel Galileo Gen 2 gpio: pca953x: Override IRQ for one of the expanders on Galileo Gen 2 net: qrtr: Fix an out of bounds read qrtr_endpoint_post() sched/core: Check cpus_mask, not cpus_ptr in __set_cpus_allowed_ptr(), to fix mask corruption x86/entry: Increase entry_stack size to a full page nvme-rdma: assign completion vector correctly block: release bip in a right way in error path usb: dwc3: pci: Fix reference count leak in dwc3_pci_resume_work scsi: mptscsih: Fix read sense data size ARM: imx6: add missing put_device() call in imx6q_suspend_init() cifs: update ctime and mtime during truncate s390/kasan: fix early pgm check handler execution drm: panel-orientation-quirks: Use generic orientation-data for Acer S1003 drm: panel-orientation-quirks: Add quirk for Asus T101HA panel iommu/vt-d: Don't apply gfx quirks to untrusted devices powerpc/kvm/book3s64: Fix kernel crash with nested kvm & DEBUG_VIRTUAL ibmvnic: continue to init in CRQ reset returns H_CLOSED i40e: protect ring accesses with READ- and WRITE_ONCE ixgbe: protect ring accesses with READ- and WRITE_ONCE net: ethernet: mvneta: Add 2500BaseX support for SoCs without comphy net: ethernet: mvneta: Fix Serdes configuration for SoCs without comphy spi: spidev: fix a potential use-after-free in spidev_release() spi: spidev: fix a race between spidev_release and spidev_remove ALSA: hda: Intel: add missing PCI IDs for ICL-H, TGL-H and EKL ASoC: SOF: Intel: add PCI ID for CometLake-S drm: mcde: Fix display initialization problem gpu: host1x: Detach driver on unregister drm/tegra: hub: Do not enable orphaned window group drm/ttm: Fix dma_fence refcnt leak when adding move fence ARM: dts: omap4-droid4: Fix spi configuration and increase rate perf/x86/rapl: Fix RAPL config variable bug perf/x86/rapl: Move RAPL support to common x86 code regmap: fix alignment issue spi: spi-fsl-dspi: Fix lockup if device is removed during SPI transfer spi: spi-fsl-dspi: Adding shutdown hook KVM: s390: reduce number of IO pins to 1 msm: adsprpc: use current PID instead of stored PID for validation dt-bindings: clock: Update clock ID's of GPUCC and DISPCC for SHIMA ANDROID: ABI: add already existing symbols of ufs_* to unisoc msm: adsprpc: remove use of vfs_stat API in the fastrpc driver defconfig: lahaina: Fix INTERCONNECT_TEST being disabled for QGKI soc: qcom: pil: Handle uninitialized 'ret' ion: Restore GKI system heap implementation msm: kgsl: Add support to configure bus dcvs sampling interval input: event_notify: Remove the support ion: Update the system heap type to MSM_SYSTEM and update sys heap ID ion: Move the msm system heap source into its own files defconfig: Enable icnss2 config for holi ANDROID: ABI: add nf_* symbols to unisoc ANDROID: GKI: update abi xml file icnss2: Remove vbatt feature code for holi msm: kgsl: Add GPUCC register dumps to A6xx GPU snapshot ANDROID: GKI: build in more Bluetooth drivers ARM64: mm: Add log in fixmap_remap_fdt for static memory mm: page_alloc: Add debug log in free_reserved_area for static memory ANDROID: GKI: update abi xml file ANDROID: GKI: Enable CONFIG_BT_HIDP as it is needed by some platforms ANDROID: GKI: add CONFIG_BT to x86 gki_defconfig cnss2: Notify WLAN host driver when SMMU fault is detected clk: qcom: gcc-shima: Update video_axi clks to clk_branch2_force_off_ops Revert "FROMLIST: f2fs: fix use-after-free when accessing bio->bi_crypt_context" binder: update latency_sensitive flag for binder transactions Revert "scsi: ufs: Dump PA_VS_STATUS_REG1 in eh" mhi: core: Prevent extra votes for multiple timesync requests power: reset: Remove flush_cache_all usage ANDROID: GKI: update abi definitions ANDROID: mm: add vendor padding for SPECULATIVE_PAGE_FAULTS net: qrtr: haven: Add doorbell retry for secondary leds: qti-flash: Allow symmetrical switch on with no channels configured ANDROID: GKI: enable usb storage drivers drivers: thermal: Change parameters in thermal zone configuration ANDROID: fscrypt: fix DUN contiguity with inline encryption + IV_INO_LBLK_32 policies coresight: Delete path from active paths when exception happens arm64: defconfig: remove mass storage as module mmc: sdhci-msm: Remove unneeded device tree entries mmc: core: Add at least 3 mclk cycle delay before next command after ACMD41 mmc: sdhci-msm: Update DDR_CONFIG reg with HSR value if supplied UPSTREAM: mmc: sdhci-msm: Don't enable PWRSAVE_DLL for certain sdhc hosts drivers/base/memory.c: Optimize allocated_bytes_show() input: touchscreen: synaptics_tcm: add new touch driver sound: usb: Use IOMMU_CACHE mapping if USB controller is dma-coherent input: qcom-hv-haptics: set effect to NULL in constant playing msm: kgsl: Update preemption keepalive on a660 soc: qcom: hyp_core_ctl: Fix conditional statement boundries defconfig: Enable USB related config flags on sdxlemur ANDROID: GKI: set CONFIG_STATIC_USERMODEHELPER_PATH build.config.aarch64: s/COMPAT/ARM32 usb: f_qdss: Fix race between qdss_alloc_req & qdss_close msm:ipa3: removed duplicate entries in defconfig power: supply: qti_battery_charger: Enable Ship mode shutdown msm: kgsl: Add snapshot size and highest bank bit for a619 ANDROID: sound: usb: Add vendor's hooking interface mm: remove the speculative page fault traces clk: qcom: gcc: use the holi specific vdd file BACKPORT: mmc: sdhci-msm: Set IO pins in low power state during suspend defconfig: Enable CPUFREQ HW module for cpu scaling cnss2: Add debug assert on idle restart timeout tmc-etr: Call usb_qdss_open after all etr settings are done UPSTREAM: slimbus: core: Set fwnode for a device when setting of_node ANDROID: f2fs: add back compress inode check msm: cvp: Fix linked list corruption in CVP driver ANDROID: abi: update abi dump for CONFIG_KPROBES Move from dma_buf_kmap to dma_buf_vmap for ION f2fs: fix use-after-free when accessing bio->bi_crypt_context pstore: Add support to cached pages usb: f_qdss: Setting channel to NULL in qdss_close ANDROID: gki_defconfig: Enable Kprobes msm: cvp: Avoid NULL pointer dereference msm: cvp: addressing the LF making issue mhi: core: Use appropriate names for BHI/BHIe firmware load functions mhi: cntrl: qcom: Add support for fatal error processing mhi: core: block unbind from userspace till channel reset mhi: core: Add extra checks for RDDM event handling mhi: core: move PM state to SYS_ERROR if the event arrives before RDDM arm64: defconfig: enable DRM display driver configs ANDROID: Correct branch name after rename scsi: ufs: Support query the spm/rpm level from device tree msm:adsprpc: Fixed NULL dereference in getargs() msm: kgsl: Wait for active count when last kgsl instance is closed kernel_headers: Disable headers matching arm: defconfig: Enable MPROC stack for sdxlemur scsi: ufshcd: Allow zero value setting to Auto-Hibernate Timer soc: qcom: add VTCM debug test support soc: qcom: mem-buf: Include Haven structure definitions msm: kgsl: Add support for clk_set_options() to enable NAP feature ANDROID: GKI: update ABI due to power supply changes UPSTREAM: power: supply: core: add POWER_SUPPLY_HEALTH_CALIBRATION_REQUIRED UPSTREAM: power: supply: core: add manufacture date properties UPSTREAM: power: supply: core: add capacity error margin property UPSTREAM: power: supply: core: Add type property to uevent env UPSTREAM: power: supply: core: Add a macro that maps enum properties to text values UPSTREAM: power: supply: core: Use designated initializer for property text arrays UPSTREAM: power: supply: core: Cleanup power supply sysfs attribute list UPSTREAM: power: supply: core: reduce power_supply_show_usb_type() parameters clk: qcom: clk-alpha-pll: Add support for Lucid EVO PLL ANDROID: fix copyright notice ANDROID: add support for vendor hooks ANDROID: GKI: update abi definitions iommu/iova: Free global iova rcache on iova alloc failure iommu/iova: Retry from last rb tree node if iova search fails pinctrl: qcom: Update pinctrl for HOLI soc Linux 5.4.51 efi: Make it possible to disable efivar_ssdt entirely dm zoned: assign max_io_len correctly x86/resctrl: Fix memory bandwidth counter width for AMD mm, compaction: make capture control handling safe wrt interrupts mm, compaction: fully assume capture is not NULL in compact_zone_order() irqchip/gic: Atomically update affinity dma-buf: Move dma_buf_release() from fops to dentry_ops drm/amdgpu/atomfirmware: fix vram_info fetching for renoir drm/amdgpu: use %u rather than %d for sclk/mclk drm/amd/display: Only revalidate bandwidth on medium and fast updates MIPS: Add missing EHB in mtc0 -> mfc0 sequence for DSPen MIPS: lantiq: xway: sysctrl: fix the GPHY clock alias names cifs: Fix the target file was deleted when rename failed. SMB3: Honor 'handletimeout' flag for multiuser mounts SMB3: Honor lease disabling for multiuser mounts SMB3: Honor persistent/resilient handle flags for multiuser mounts SMB3: Honor 'seal' flag for multiuser mounts Revert "ALSA: usb-audio: Improve frames size computation" nfsd: apply umask on fs without ACL support spi: spi-fsl-dspi: Fix external abort on interrupt in resume or exit paths i2c: mlxcpld: check correct size of maximum RECV_LEN packet i2c: algo-pca: Add 0x78 as SCL stuck low status for PCA9665 samples/vfs: avoid warning in statx override nvme: fix a crash in nvme_mpath_add_disk nvme: fix identify error status silent ignore SMB3: Honor 'posix' flag for multiuser mounts virtio-blk: free vblk-vqs in error path of virtblk_probe() drm: sun4i: hdmi: Remove extra HPD polling nfsd: fix nfsdfs inode reference count leak nfsd4: fix nfsdfs reference count loop thermal/drivers/rcar_gen3: Fix undefined temperature if negative thermal/drivers/mediatek: Fix bank number settings on mt8183 hwmon: (acpi_power_meter) Fix potential memory leak in acpi_power_meter_add() hwmon: (max6697) Make sure the OVERT mask is set correctly cxgb4: fix SGE queue dump destination buffer context cxgb4: use correct type for all-mask IP address comparison cxgb4: fix endian conversions for L4 ports in filters cxgb4: parse TC-U32 key values and masks natively cxgb4: use unaligned conversion for fetching timestamp RDMA/counter: Query a counter before release rxrpc: Fix afs large storage transmission performance drop drm/msm/dpu: fix error return code in dpu_encoder_init crypto: af_alg - fix use-after-free in af_alg_accept() due to bh_lock_sock() tpm: Fix TIS locality timeout problems selftests: tpm: Use /bin/sh instead of /bin/bash kgdb: Avoid suspicious RCU usage warning nvme-multipath: fix bogus request queue reference put nvme-multipath: fix deadlock due to head->lock nvme-multipath: fix deadlock between ana_work and scan_work nvme-multipath: set bdi capabilities once s390/debug: avoid kernel warning on too large number of pages tools lib traceevent: Handle __attribute__((user)) in field names tools lib traceevent: Add append() function helper for appending strings usb: usbtest: fix missing kfree(dev->buf) in usbtest_disconnect rxrpc: Fix race between incoming ACK parser and retransmitter mm/slub: fix stack overruns with SLUB_STATS mm/slub.c: fix corrupted freechain in deactivate_slab() sched/debug: Make sd->flags sysctl read-only usbnet: smsc95xx: Fix use-after-free after removal EDAC/amd64: Read back the scrub rate PCI register on F15h mm: fix swap cache node allocation mask io_uring: make sure async workqueue is canceled on exit sound: usb: Ensure UAC3 Power Domain is set to D0 when enabling stream usb: gadget: Fix interface descriptor fields for QTI functions PM / devfreq: make memlat and bwmon governors immutable ANDROID: update the ABI representation after ion sysfs changes ANDROID: add ion_stat tracepoint to common kernel ANDROID: staging: android: ion: Expose total heap and pool sizes via sysfs ANDROID: Update ABI representation for libabigail update ANDROID: Update the ABI representation icnss2: Add snapshot of icnss2 driver dt-bindings: clock: add MDSS clock names for 10nm architecture iommu/iova: Don't BUG on invalid PFNs input: qcom-hv-haptics: Update sequence of reading STATUS_DATA drivers: pinctrl: Add gpio to mpm mapping for holi ufs: ufs-qcom: Fix racing caused by ufs_qcom_testbus_config() clk: qcom: gpucc-lahaina: Fix gpu_cc_cx_gmu_clk stuck off warning mmc: Change locking for clk scaling from bh to irqsave msm: cvp: Increase delay during AXI reset pulse ANDROID: GKI: Incremental fs: move MODULE_IMPORT_NS() line msm: adsprpc: Reserve contexts for all static handles memshare: Move ramdump collection to AFTER_SHUTDOWN event ANDROID: GKI: set vfs-only exports into their own namespace ANDROID: gki: build-in DMA_VIRTUAL_CHANNELS ANDROID: GKI: make VIDEOBUF2_DMA_CONTIG under GKI_HIDDEN_MEDIA_CONFIGS ANDROID: PM: sleep: export device_pm_callback_start/end trace event ANDROID: fix copyright notice ANDROID: GKI: add android_vendor.h arm64: defconfig: Enable BFQ io scheduler on holi ANDROID: GKI: enable CONFIG_V4L_PLATFORM_DRIVERS mm: reduce the time spend by killed tasks in alloc path arm64: defconfig: Move to upstream ufshcd core RTC6226: keep tuned to valid lower band channel for dwell time uio: msm_sharedmem: shared memory region access is also given to vm-nav soc: qcom: secure_buffer: add support for VMID_NAV uio: msm_sharedmem: add guard page around shared memory arm64: defconfig: Enable shima interconnect driver ANDROID: GKI: enable CONFIG_TYPEC_TCPM ANDROID: GKI: support CONFIG_INPUT_TOUCHSCREEN input: qcom-hv-haptics: clear HW faults before enabling play ANDROID: GKI: move abi files to android/ ANDROID: GKI: drop unneeded "_whitelist" off of symbol filenames msm: kgsl: Add support for A660 GPU variant interconnect: qcom: Add Shima interconnect provider driver bindings: clock: gcc: Add support for REF clock for HOLI defconfig: arm64: Enable the GPUCC clock controller clk: qcom: gpucc: Add Graphics Clock controller for HOLI defconfig: lahaina: Enable memshare driver on lahaina_debug ANDROID: GKI: modules should not run programs phy: ufs: Add UFS PHY support for Holi msm_rtb: Include <asm/io.h> header in rtb for QGKI UPSTREAM: net: bpf: Make bpf_ktime_get_ns() available to non GPL programs kernel: add header file for audio compressed formats in bp arm64: defconfig: Enable IO_PGTABLE_PAGE_ACCOUNTING for debug configs UPSTREAM: bpf: Add gso_size to __sk_buff clk: qcom: gcc-lahaina: Update video_axi clks to clk_branch2_force_off_ops cnss2: Add PBL and SBL dump only for QCA6490 UPSTREAM: usb: musb: mediatek: add reset FADDR to zero in reset interrupt handle ANDROID: ABI/Whitelist: update symbols of incrementalfs.ko and sprd_*.ko to unisoc whitelist ANDROID: GKI: update abi definition now that EHCI driver is built in ANDROID: GKI: support CONFIG_USB_EHCI_HCD_PLATFORM ANDROID: GKI: support CONFIG_USB_EHCI_HCD byte-cntr: Set offset as rwp offset when sw usb mode start ABI: Update internal whitelist for cnss symbols UPSTREAM: mmc: sdhci-msm: Deactivate CQE during SDHC reset UPSTREAM: mmc: cqhci: Add cqhci_deactivate() mhi: core: Expose API to check device execution environment mhi: core: Use high priority workqueue for all MHI work mhi: core: Move to error state as soon as RDDM is detected cnss2: set rddm support boolean for MHI mhi: core: Move power down check within the RDDM image support mhi: core: Separate rddm support and dump collection mhi: cntrl: qcom: expand debug modes for new device bringup mhi: core: move certain logs to controller log buffer mhi: cntrl: qcom: move certain logs to controller log buffer mhi: cntrl: qcom: reduce timesync and bootlogger log buffer size mhi: cntrl: qcom: add support for controller ipc logs cnss2: add support for controller IPC logs mhi: core: add log buffer for controller bootup and shutdown input: touchscreen: focaltech_touch: Remove vfs_read() ANDROID: Update kabi for db845c (keeping up with ufs-qcom zig-zag) input: qcom-hv-haptics: adjust frequency calibration sequence HID: qvr: using different dma-buf APIs cnss2: Add support to create device sysfs group abi: Update qcom whitelist with devm_device* APIs ANDROID: GKI: scripts: Makefile: update the lz4 command (#2) pci: msm: Add support to disable L1SS sleep scsi: ufs: Read device tree to find UFS's Vcc voltage level Linux 5.4.50 Revert "tty: hvc: Fix data abort due to race in hvc_open" xfs: add agf freeblocks verify in xfs_agf_verify dm writecache: add cond_resched to loop in persistent_memory_claim() dm writecache: correct uncommitted_block when discarding uncommitted entry xprtrdma: Fix handling of RDMA_ERROR replies NFSv4 fix CLOSE not waiting for direct IO compeletion pNFS/flexfiles: Fix list corruption if the mirror count changes SUNRPC: Properly set the @subbuf parameter of xdr_buf_subsegment() sunrpc: fixed rollback in rpc_gssd_dummy_populate() Staging: rtl8723bs: prevent buffer overflow in update_sta_support_rate() drm/amdgpu: add fw release for sdma v5_0 drm/radeon: fix fb_div check in ni_init_smc_spll_table() drm: rcar-du: Fix build error drm/amd: fix potential memleak in err branch ring-buffer: Zero out time extend if it is nested and not absolute tracing: Fix event trigger to accept redundant spaces arm64: dts: imx8mn-ddr4-evk: correct ldo1/ldo2 voltage range arm64: dts: imx8mm-evk: correct ldo1/ldo2 voltage range arm64: perf: Report the PC value in REGS_ABI_32 mode mm/memcontrol.c: add missed css_put() ocfs2: fix panic on nfs server over ocfs2 ocfs2: fix value of OCFS2_INVALID_SLOT ocfs2: load global_inode_alloc ocfs2: avoid inode removal while nfsd is accessing it mm/slab: use memzero_explicit() in kzfree() btrfs: fix failure of RWF_NOWAIT write into prealloc extent beyond eof btrfs: check if a log root exists before locking the log_mutex on unlink btrfs: fix data block group relocation failure due to concurrent scrub btrfs: fix bytes_may_use underflow when running balance and scrub in parallel x86/asm/64: Align start of __clear_user() loop to 16-bytes x86/cpu: Use pinning mask for CR4 bits needing to be 0 KVM: VMX: Stop context switching MSR_IA32_UMWAIT_CONTROL KVM: nVMX: Plumb L2 GPA through to PML emulation KVM: X86: Fix MSR range of APIC registers in X2APIC mode erofs: fix partially uninitialized misuse in z_erofs_onlinepage_fixup ACPI: configfs: Disallow loading ACPI tables when locked down ACPI: sysfs: Fix pm_profile_attr type ALSA: hda/realtek: Add mute LED and micmute LED support for HP systems ALSA: hda/realtek - Add quirk for MSI GE63 laptop ALSA: hda: Add NVIDIA codec IDs 9a & 9d through a0 to patch table RISC-V: Don't allow write+exec only page mapping request in mmap block: update hctx map when use multiple maps blktrace: break out of blktrace setup on concurrent calls kprobes: Suppress the suspicious RCU warning on kprobes recordmcount: support >64k sections kbuild: improve cc-option to clean up all temporary files arm64: sve: Fix build failure when ARM64_SVE=y and SYSCTL=n s390/vdso: fix vDSO clock_getres() s390/vdso: Use $(LD) instead of $(CC) to link vDSO s390/ptrace: fix setting syscall number s390/ptrace: pass invalid syscall numbers to tracing pinctrl: tegra: Use noirq suspend/resume callbacks pinctrl: qcom: spmi-gpio: fix warning about irq chip reusage test_objagg: Fix potential memory leak in error handling net: alx: fix race condition in alx_remove ibmvnic: Harden device login requests hwrng: ks-sa - Fix runtime PM imbalance on error riscv/atomic: Fix sign extension for RV64I drm/amd/display: Use kfree() to free rgb_user in calculate_user_regamma_ramp() ata/libata: Fix usage of page address by page_address in ata_scsi_mode_select_xlat function sata_rcar: handle pm_runtime_get_sync failure cases sched/core: Fix PI boosting between RT and DEADLINE tasks sched/deadline: Initialize ->dl_boosted afs: Fix storage of cell names i2c: core: check returned size of emulated smbus block read i2c: fsi: Fix the port number field in status register clk: sifive: allocate sufficient memory for struct __prci_data net: bcmgenet: use hardware padding of runt frames netfilter: ipset: fix unaligned atomic access nvme: don't protect ns mutation with ns->head->lock usb: renesas_usbhs: getting residue from callback_result usb: gadget: udc: Potential Oops in error handling code scsi: lpfc: Avoid another null dereference in lpfc_sli4_hba_unset() ARM: imx5: add missing put_device() call in imx_suspend_alloc_ocram() cxgb4: move handling L2T ARP failures to caller net: qede: fix use-after-free on recovery and AER handling net: qede: fix PTP initialization on recovery net: qed: fix excessive QM ILT lines consumption net: qed: fix NVMe login fails over VFs net: qede: stop adding events on an already destroyed workqueue net: qed: fix async event callbacks unregistering net: qed: fix left elements count calculation iommu/vt-d: Update scalable mode paging structure coherency iommu/vt-d: Enable PCI ACS for platform opt in hint selftests/net: report etf errors correctly RDMA/mad: Fix possible memory leak in ib_mad_post_receive_mads() s390/qeth: fix error handling for isolation mode cmds ASoC: rockchip: Fix a reference count leak. RDMA/cma: Protect bind_list and listen_list while finding matching cm id RDMA/qedr: Fix KASAN: use-after-free in ucma_event_handler+0x532 RDMA/rvt: Fix potential memory leak caused by rvt_alloc_rq rxrpc: Fix handling of rwind from an ACK packet ARM: dts: NSP: Correct FA2 mailbox node bpf: Don't return EINVAL from {get,set}sockopt when optlen > PAGE_SIZE devmap: Use bpf_map_area_alloc() for allocating hash buckets regmap: Fix memory leak from regmap_register_patch x86/resctrl: Fix a NULL vs IS_ERR() static checker warning in rdt_cdp_peer_get() ARM: dts: Fix duovero smsc interrupt for suspend ARM: dts: am335x-pocketbeagle: Fix mmc0 Write Protect bpf, xdp, samples: Fix null pointer dereference in *_user code samples/bpf: xdp_redirect_cpu: Set MAX_CPUS according to NR_CPUS ASoC: fsl_ssi: Fix bclk calculation for mono channel RDMA/siw: Fix pointer-to-int-cast warning in siw_rx_pbl() regualtor: pfuze100: correct sw1a/sw2 on pfuze3000 ASoC: qcom: common: set correct directions for dailinks ASoc: q6afe: add support to get port direction efi/esrt: Fix reference count leak in esre_create_sysfs_entry. efi/tpm: Verify event log header before parsing ASoC: q6asm: handle EOS correctly xfrm: Fix double ESP trailer insertion in IPsec crypto offload. ARM: OMAP2+: Fix legacy mode dss_reset bus: ti-sysc: Ignore clockactivity unless specified as a quirk bus: ti-sysc: Flush posted write on enable and disable IB/hfi1: Fix module use count flaw due to leftover module put calls IB/mad: Fix use after free when destroying MAD agent loop: replace kill_bdev with invalidate_bdev cdc-acm: Add DISABLE_ECHO quirk for Microchip/SMSC chip xhci: Return if xHCI doesn't support LPM xhci: Fix enumeration issue when setting max packet size for FS devices. xhci: Fix incorrect EP_STATE_MASK cifs/smb3: Fix data inconsistent when zero file range cifs/smb3: Fix data inconsistent when punch hole cifs: Fix cached_fid refcnt leak in open_shroot scsi: zfcp: Fix panic on ERP timeout for previously dismissed ERP action scsi: qla2xxx: Keep initiator ports after RSCN usb: cdns3: ep0: add spinlock for cdns3_check_new_setup usb: cdns3: ep0: fix the test mode set incorrectly usb: cdns3: trace: using correct dir value ALSA: usb-audio: Fix OOB access of mixer element list ALSA: usb-audio: add quirk for Samsung USBC Headset (AKG) ALSA: usb-audio: add quirk for Denon DCD-1500RE ALSA: usb-audio: Add implicit feedback quirk for SSL2+. usb: typec: tcpci_rt1711h: avoid screaming irq causing boot hangs usb: host: ehci-exynos: Fix error check in exynos_ehci_probe() xhci: Poll for U0 after disabling USB2 LPM usb: host: xhci-mtk: avoid runtime suspend when removing hcd USB: ehci: reopen solution for Synopsys HC bug usb: add USB_QUIRK_DELAY_INIT for Logitech C922 usb: dwc2: Postponed gadget registration to the udc class driver USB: ohci-sm501: Add missed iounmap() in remove binder: fix null deref of proc->context ALSA: usb-audio: Fix potential use-after-free of streams fix a braino in "sparc32: fix register window handling in genregs32_[gs]et()" net: sched: export __netdev_watchdog_up() btrfs: fix a block group ref counter leak after failure to remove block group Revert "i2c: tegra: Fix suspending in active runtime PM state" tcp_cubic: fix spurious HYSTART_DELAY exit upon drop in min RTT sch_cake: fix a few style nits sch_cake: don't call diffserv parsing code when it is not needed sch_cake: don't try to reallocate or unshare skb unconditionally ip_tunnel: fix use-after-free in ip_tunnel_lookup() net: phy: Check harder for errors in get_phy_id() ip6_gre: fix use-after-free in ip6gre_tunnel_lookup() tg3: driver sleeps indefinitely when EEH errors exceed eeh_max_freezes tcp: grow window for OOO packets only for SACK flows tcp: don't ignore ECN CWR on pure ACK sctp: Don't advertise IPv4 addresses if ipv6only is set on the socket rxrpc: Fix notification call on completion of discarded calls rocker: fix incorrect error handling in dma_rings_init openvswitch: take into account de-fragmentation/gso_size in execute_check_pkt_len net: usb: ax88179_178a: fix packet alignment padding net: increment xmit_recursion level in dev_direct_xmit() net: Fix the arp error in some cases net: fix memleak in register_netdevice() net: Do not clear the sock TX queue in sk_set_socket() net: core: reduce recursion limit value net: bridge: enfore alignment for ethernet address mvpp2: ethtool rxtx stats fix mld: fix memory leak in ipv6_mc_destroy_dev() ibmveth: Fix max MTU limit geneve: allow changing DF behavior after creation enetc: Fix tx rings bitmap iteration range, irq handling block/bio-integrity: don't free 'buf' if bio_integrity_add_page() failed msm: kgsl: Update current frequency in devfreq status structure mm, memory_hotplug: update pcp lists everytime onlining a memory block sound: usb: Fix check with usb_get_controller_id() for valid controller id ANDROID: GKI: revert part of the ufshcd_* export removals ANDROID: GKI: update ABI definitions based on recent wifi backports BACKPORT: cfg80211: Configure PMK lifetime and reauth threshold for PMKSA entries BACKPORT: nl80211: add no pre-auth attribute and ext. feature flag for ctrl. port BACKPORT: nl80211: modify TID-config API BACKPORT: nl80211: Add NL command to support TID speicific configurations BACKPORT: cfg80211: Support key configuration for Beacon protection (BIGTK) BACKPORT: cfg80211: More error messages for key addition failures BACKPORT: cfg80211: Enhance the AKM advertizement to support per interface. BACKPORT: nl80211: add handling for BSS color BACKPORT: cfg80211: VLAN offload support for set_key and set_sta_vlan drivers: thermal: Avoid multiple TSENS controller re-init simultaneously spi: spi-msm-geni: Propagate missing change from 4.19 to 5.4 spi: spi-msm-geni: Propagate missing change from 4.19 to 5.4 spi: spi-msm-geni: Propagate missing change from 4.19 to 5.4 ASoC: pcm: add null check for be_substream spi: spi-msm-geni: Propagate missing change from 4.19 to 5.4 defconfig: msm: Enable CONFIG_QTI_TZ_LOG on perf builds arm64: defconfig: configuration for UTS namespace spi: spi-msm-geni: Propagate missing change from 4.19 to 5.4 spi: spi-msm-geni: Propagate missing change from 4.19 to 5.4 msm: cvp: Re-initialize the HFI queue headers after CDSP-SSR FROMGIT: binder: fix null deref of proc->context Revert "ANDROID: fscrypt: add key removal notifier chain" drivers: thermal: bcl: Update the threshold conversion soc: qcom: altmode-glink: Execute client callback in work drivers: thermal: pe_sensor: Add code to clear victim irq status UPSTREAM: scsi: ufs: Fix imprecise load calculation in devfreq window UPSTREAM: scsi: ufs: Add trace event for UIC commands UPSTREAM: scsi: ufs: Add DELAY_BEFORE_LPM quirk for Micron devices UPSTREAM: scsi: ufs-mediatek: Allow unbound mphy UPSTREAM: scsi: ufs-mediatek: Fix unbalanced clock on/off UPSTREAM: scsi: ufs-mediatek: Introduce low-power mode for device power supply UPSTREAM: scsi: ufs-mediatek: Do not gate clocks if auto-hibern8 is not entered yet UPSTREAM: scsi: ufs-mediatek: Fix imprecise waiting time for ref-clk control BACKPORT: scsi: ufs: Disable WriteBooster capability in non-supported UFS device BACKPORT: scsi: ufs: Fix WriteBooster flush during runtime suspend BACKPORT: scsi: ufs: Fix index of attributes query for WriteBooster feature BACKPORT: scsi: ufs: Allow WriteBooster on UFS 2.2 devices UPSTREAM: scsi: ufs-mediatek: Customize WriteBooster flush policy UPSTREAM: scsi: ufs: Customize flush threshold for WriteBooster BACKPORT: scsi: ufs: Introduce ufs_hba_variant_params to group customizable parameters UPSTREAM: scsi: ufs-mediatek: Make ufs_mtk_fixup_dev_quirks static UPSTREAM: scsi: ufs: Cleanup WriteBooster feature UPSTREAM: scsi: ufs-mediatek: Enable WriteBooster capability BACKPORT: scsi: ufs: Add LU Dedicated buffer mode support for WriteBooster BACKPORT: scsi: ufs: Add "index" in parameter list of ufshcd_query_flag() UPSTREAM: scsi: ufs-mediatek: Add fixup_dev_quirks vops UPSTREAM: scsi: ufs: Export ufs_fixup_device_setup() function BACKPORT: scsi: ufs: Introduce fixup_dev_quirks vops UPSTREAM: scsi: ufs-mediatek: add error recovery for suspend and resume UPSTREAM: scsi: ufs: export ufshcd_link_recovery UPSTREAM: scsi: ufs-mediatek: customize the delay for enabling host UPSTREAM: scsi: ufs: make HCE polling more compact to improve initialization latency BACKPORT: scsi: ufs: allow custom delay prior to host enabling UPSTREAM: scsi: ufs-mediatek: use common delay function UPSTREAM: scsi: ufs: introduce common and flexible delay function UPSTREAM: scsi: ufs: fix uninitialized tx_lanes in ufshcd_disable_tx_lcc() UPSTREAM: scsi: ufs-mediatek: fix HOST_PA_TACTIVATE quirk for Samsung UFS Devices BACKPORT: scsi: ufs: Add max_lu_supported in struct ufs_dev_info RTC6226: set the the Channel spacing value in Radio Config register ANDROID: GKI: remove ufshcd_* exports from whitelists defconfig: enable fixed and stub regulator for sdxlemur ANDROID: GKI: enable CONFIG_SCSI_UFS_DWC_TC_PLATFORM ANDROID: GKI: enable QCOM and HISI UFS drivers ANDROID: GKI: enable UFS for x86 gki builds and SCSI_UFSHCD_PCI icc: dt-bindings: Update endpoint IDs for interconnects for SHIMA soc: qcom: crypto-qti-hwkm: add wrapped raw secret interconnect: qcom: Add sdxlemur interconnect provider driver dt-bindings: interconnect: Add support for SDXLEMUR DT bindings msm: cvp: Avoid reset CVP clock during power off msm: cvp: Avoids sending random error code to DSP tmc-etr: Fix duplicate logs issue when use sw usb mode Revert "irqdomain: Implement and expose API to clear IRQ mapping for radix tree" buses: i2c: update i2c geni driver to include irq.h UPSTREAM: amba: Retry adding deferred devices at late_initcall scsi: ufs-qcom: add qos support for ufs arm64: defconfig: remove configs to fix kw issues net: qrtr: ns: Change servers radix tree to xarray net: qrtr: ns: Change nodes radix tree to xarray mailbox: qcom-apcs: Add compatible for sdxlemur defconfig: arm64: Disable SDCARD_FS for Lahaina clk: qcom: clk-branch: Add clk_branch2_force_off_ops to force off a clock ANDROID: GKI: Enable INTERVAL_TREE FROMGIT: binder: fix null deref of proc->context cnss2: Handle PCI register rw operation during crash shutdown build.config.msm.lahaina: Add qgki-consolidate as a supported variant ANDROID: Makefile: append BUILD_NUMBER to version string when defined arm64: defconfig: add trusted touch support to GKI defconfig arm64: defconfig: add trusted touch config for genericarmv8 ABI: Update whitelist defconfig: enable system pm violators for lahaina mm: memory_hotplug: wait on device_hotplug_lock in OOM path mm: change max readahead size to 512KB mm: disable fault around on emulated access bit architecture mm: allocate swapin pages from movable zone ABI: Add synx driver ABIs for QCOM whitelist bindings: clock: qcom: Update the GPU CC clock IDs clk: qcom: clk-branch: Add clock ops for Voltage voting clk: qcom: Add qcom implementation of qcom_clk_set_flags defconfig: Enable MPM driver for Holi dt-bindings: clock: Add support for clock ids for SDXLEMUR soc: qcom: rpmh-rsc: Correctly handle zero active TCS for solver mode defconfig: msm: Disable CONFIG_MSM_TZ_LOG from perf builds staging: android: ion: Add support for the audio ML heap soc: qcom: secure_buffer: Add support for VMID_ADSP_HEAP and VMID_LPASS iommu: Remove iommu_debugfs_top iommu: Refactor IOMMU pagetable page accounting into a config option iommu: add a function to get MID/PID/BID info soc: qcom: hwkm: Re-format cmd packet for system kdf leds: qti-flash: Disable flash LED channel after De-strobe leds: qti-flash: Disable flash LED when brightness is set to 0 usb: gadget: composite: Inform controller driver of self-powered scsi: ufs: Try to save power mode change and UIC cmd completion timeout ANDROID: GKI: update the abi definitions due to 5.4.49 and padding ANDROID: GKI: USB: Gadget: add Android ABI padding to struct usb_gadget ANDROID: GKI: sound/usb/card.h: add Android ABI padding to struct snd_usb_endpoint sched/fair: Fix need_idle argument in sched_task_util trace point power: smb1355: Add snapshot of SMB1355 charger driver arm64: defconfig: Add support for CAMCC, VIDEOCC, GPUCC for SHIMA msm: adsprpc: Add support for recover session on DSP ANDROID: ext4: Optimize match for casefolded encrypted dirs ANDROID: ext4: Handle casefolding with encryption pil: Fix minidump collection during SSR arm64: Enable a bunch of android recommended configs cnss2: Add debug dump for Wlan FW PBL and SBL msm: cvp: Increase delay during AXI reset pulse ufs: sysfs: Use snprintf instead of sprintf Linux 5.4.49 net: core: device_rename: Use rwsem instead of a seqcount sched/rt, net: Use CONFIG_PREEMPTION.patch pwm: jz4740: Enhance precision in calculation of duty cycle net: octeon: mgmt: Repair filling of RX ring e1000e: Do not wake up the system via WOL if device wakeup is disabled kretprobe: Prevent triggering kretprobe from within kprobe_flush_task kprobes: Fix to protect kick_kprobe_optimizer() by kprobe_mutex tracing/probe: Fix memleak in fetch_op_data operations crypto: algboss - don't wait during notifier callback crypto: algif_skcipher - Cap recv SG list at ctx->used Revert "drm/amd/display: disable dcn20 abm feature for bring up" drm/i915/icl+: Fix hotplug interrupt disabling after storm detection drm/amd/display: Use kvfree() to free coeff in build_regamma() drm/connector: notify userspace on hotplug after register complete drm/i915: Whitelist context-local timestamp in the gen9 cmdparser drm/i915/gem: Avoid iterating an empty list drm/msm: Check for powered down HW in the devfreq callbacks drm/i915: Fix AUX power domain toggling across TypeC mode resets s390: fix syscall_get_error for compat processes f2fs: avoid utf8_strncasecmp() with unstable name f2fs: split f2fs_d_compare() from f2fs_match_name() net/mlx5: DR, Fix freeing in dr_create_rc_qp() block: nr_sects_write(): Disable preemption on seqcount write x86/boot/compressed: Relax sed symbol type regex for LLVM ld.lld drm/amd/display: Use swap() where appropriate drm/dp_mst: Increase ACT retry timeout to 3s ext4: avoid race conditions when remounting with options that change dax jbd2: clean __jbd2_journal_abort_hard() and __journal_abort_soft() selinux: fix double free drm/amdgpu: Replace invalid device ID with a valid device ID drm/qxl: Use correct notify port address when creating cursor ring drm/dp_mst: Reformat drm_dp_check_act_status() a bit ext4: avoid utf8_strncasecmp() with unstable name ext4: fix partial cluster initialization when splitting extent drm: encoder_slave: fix refcouting error for modules libata: Use per port sync for detach arm64: hw_breakpoint: Don't invoke overflow handler on uaccess watchpoints mvpp2: remove module bugfix block: Fix use-after-free in blkdev_get() scsi: ufs-bsg: Fix runtime PM imbalance on error bnxt_en: Return from timer if interface is not in open state. afs: Fix the mapping of the UAEOVERFLOW abort code afs: Set error flag rather than return error from file status decode afs: Always include dir in bulk status fetch from afs_do_lookup() afs: Fix EOF corruption afs: afs_write_end() should change i_size under the right lock afs: Fix non-setting of mtime when writing into mmap powerpc: Fix kernel crash in show_instructions() w/DEBUG_VIRTUAL bcache: fix potential deadlock problem in btree_gc_coalesce ext4: stop overwrite the errcode in ext4_setup_super perf stat: Fix NULL pointer dereference perf report: Fix NULL pointer dereference in hists__fprintf_nr_sample_events() usb/ehci-platform: Set PM runtime as active on resume usb: host: ehci-platform: add a quirk to avoid stuck usb/xhci-plat: Set PM runtime as active on resume bpf: Fix memlock accounting for sock_hash iavf: fix speed reporting over virtchnl xdp: Fix xsk_generic_xmit errno nfs: set invalid blocks after NFSv4 writes nvme-pci: use simple suspend when a HMB is enabled net/filter: Permit reading NET in load_bytes_relative when MAC not set x86/idt: Keep spurious entries unset in system_vectors scsi: acornscsi: Fix an error handling path in acornscsi_probe() libbpf: Handle GCC noreturn-turned-volatile quirk drm/sun4i: hdmi ddc clk: Fix size of m divider tracing/probe: Fix bpf_task_fd_query() for kprobes and uprobes bpf, sockhash: Synchronize delete from bucket list on map free bpf/sockmap: Fix kernel panic at __tcp_bpf_recvmsg ASoC: rt5645: Add platform-data for Asus T101HA ASoC: Intel: bytcr_rt5640: Add quirk for Toshiba Encore WT10-A tablet ASoC: SOF: nocodec: conditionally set dpcm_capture/dpcm_playback flags ASoC: core: only convert non DPCM link to DPCM link afs: Fix memory leak in afs_put_sysnames() f2fs: don't return vmalloc() memory from f2fs_kmalloc() selftests/net: in timestamping, strncpy needs to preserve null byte drivers/perf: hisi: Fix wrong value for all counters enable i2c: icy: Fix build with CONFIG_AMIGA_PCMCIA=n NTB: ntb_test: Fix bug when counting remote files NTB: perf: Fix race condition when run with ntb_test NTB: perf: Fix support for hardware that doesn't have port numbers NTB: perf: Don't require one more memory window than number of peers NTB: Revert the change to use the NTB device dev for DMA allocations NTB: ntb_tool: reading the link file should not end in a NULL byte ntb_tool: pass correct struct device to dma_alloc_coherent ntb_perf: pass correct struct device to dma_alloc_coherent net: marvell: Fix OF_MDIO config check gfs2: fix use-after-free on transaction ail lists blktrace: fix endianness for blk_log_remap() blktrace: fix endianness in get_pdu_int() blktrace: use errno instead of bi_status selftests/vm/pkeys: fix alloc_random_pkey() to make it really random include/linux/bitops.h: avoid clang shift-count-overflow warnings lib/zlib: remove outdated and incorrect pre-increment optimization geneve: change from tx_error to tx_dropped on missing metadata crypto: omap-sham - add proper load balancing support for multicore drm/amd/display: Revalidate bandwidth before commiting DC updates nfsd: safer handling of corrupted c_type pinctrl: freescale: imx: Fix an error handling path in 'imx_pinctrl_probe()' pinctrl: imxl: Fix an error handling path in 'imx1_pinctrl_core_probe()' scsi: ufs: Don't update urgent bkops level when toggling auto bkops scsi: iscsi: Fix reference count leak in iscsi_boot_create_kobj gfs2: Allow lock_nolock mount to specify jid=X nfsd4: make drc_slab global, not per-net ceph: don't return -ESTALE if there's still an open file drm/nouveau/disp/gm200-: fix NV_PDISP_SOR_HDMI2_CTRL(n) selection openrisc: Fix issue with argument clobbering for clone/fork rxrpc: Adjust /proc/net/rxrpc/calls to display call->debug_id not user_ID mailbox: zynqmp-ipi: Fix NULL vs IS_ERR() check in zynqmp_ipi_mbox_probe() rtc: rv3028: Add missed check for devm_regmap_init_i2c() vfio/mdev: Fix reference count leak in add_mdev_supported_type ASoC: fsl_asrc_dma: Fix dma_chan leak when config DMA channel failed extcon: adc-jack: Fix an error handling path in 'adc_jack_probe()' powerpc/4xx: Don't unmap NULL mbase input: i8042 - Remove special PowerPC handling of: Fix a refcounting bug in __of_attach_node_sysfs() NFSv4.1 fix rpc_call_done assignment for BIND_CONN_TO_SESSION net: sunrpc: Fix off-by-one issues in 'rpc_ntop6' /dev/mem: Revoke mappings when a driver claims the region misc: xilinx-sdfec: improve get_user_pages_fast() error handling clk: ast2600: Fix AHB clock divider for A1 clk: sprd: return correct type of value for _sprd_pll_recalc_rate KVM: PPC: Book3S: Fix some RCU-list locks KVM: PPC: Book3S HV: Ignore kmemleak false positives scsi: ufs-qcom: Fix scheduling while atomic issue clk: bcm2835: Fix return type of bcm2835_register_gate scsi: target: tcmu: Fix a use after free in tcmu_check_expired_queue_cmd() ASoC: fix incomplete error-handling in img_i2s_in_probe. powerpc/32s: Don't warn when mapping RO data ROX. mfd: stmfx: Disable IRQ in suspend to avoid spurious interrupt mfd: stmfx: Fix stmfx_irq_init error path mfd: stmfx: Reset chip on resume as supply was disabled x86/apic: Make TSC deadline timer detection message visible RDMA/iw_cxgb4: cleanup device debugfs entries on ULD remove scripts: headers_install: Exit with error on config leak usb: gadget: Fix issue with config_ep_by_speed function usb: gadget: fix potential double-free in m66592_probe. usb: gadget: lpc32xx_udc: don't dereference ep pointer before null check USB: gadget: udc: s3c2410_udc: Remove pointless NULL check in s3c2410_udc_nuke usb: dwc2: gadget: move gadget resume after the core is in L0 state watchdog: da9062: No need to ping manually before setting timeout IB/cma: Fix ports memory leak in cma_configfs PCI: amlogic: meson: Don't use FAST_LINK_MODE to set up link PCI: dwc: Fix inner MSI IRQ domain registration PCI/PTM: Inherit Switch Downstream Port PTM settings from Upstream Port dm zoned: return NULL if dmz_get_zone_for_reclaim() fails to find a zone powerpc/64s/pgtable: fix an undefined behaviour arm64: tegra: Fix flag for 64-bit resources in 'ranges' property arm64: tegra: Fix ethernet phy-mode for Jetson Xavier fuse: copy_file_range should truncate cache fuse: fix copy_file_range cache issues firmware: imx: scu: Fix possible memory leak in imx_scu_probe() scsi: target: tcmu: Userspace must not complete queued commands RDMA/hns: Fix cmdq parameter of querying pf timer resource RDMA/hns: Bugfix for querying qkey clk: samsung: exynos5433: Add IGNORE_UNUSED flag to sclk_i2s1 fpga: dfl: afu: Corrected error handling levels tty: n_gsm: Fix bogus i++ in gsm_data_kick USB: host: ehci-mxc: Add error handling in ehci_mxc_drv_probe() ASoC: Intel: bytcr_rt5640: Add quirk for Toshiba Encore WT8-A tablet drm/msm/mdp5: Fix mdp5_init error path for failed mdp5_kms allocation usb/ohci-platform: Fix a warning when hibernating vfio-pci: Mask cap zero powerpc/ps3: Fix kexec shutdown hang drivers: phy: sr-usb: do not use internal fsm for USB2 phy init powerpc/pseries/ras: Fix FWNMI_VALID off by one powerpc/64s/exception: Fix machine check no-loss idle wakeup ipmi: use vzalloc instead of kmalloc for user creation habanalabs: increase timeout during reset PCI/PM: Assume ports without DLL Link Active train links in 100 ms HID: Add quirks for Trust Panora Graphic Tablet ALSA: usb-audio: Add duplex sound support for USB devices using implicit feedback tty: n_gsm: Fix waking up upper tty layer when room available tty: n_gsm: Fix SOF skipping powerpc/64: Don't initialise init_task->thread.regs PCI: Fix pci_register_host_bridge() device_register() error handling clk: ti: composite: fix memory leak USB: ohci-sm501: fix error return code in ohci_hcd_sm501_drv_probe() dlm: remove BUG() before panic() pinctrl: rockchip: fix memleak in rockchip_dt_node_to_map ASoC: ti: omap-mcbsp: Fix an error handling path in 'asoc_mcbsp_probe()' ASoC: ux500: mop500: Fix some refcounted resources issues SoC: rsnd: add interrupt support for SSI BUSIF buffer scsi: mpt3sas: Fix double free warnings scsi: target: loopback: Fix READ with data and sensebytes arm64: dts: msm8996: Fix CSI IRQ types ASoC: SOF: core: fix error return code in sof_probe_continue() power: supply: smb347-charger: IRQSTAT_D is volatile power: supply: lp8788: Fix an error handling path in 'lp8788_charger_probe()' ALSA: firewire-lib: fix invalid assignment to union data for directional parameter scsi: qla2xxx: Fix warning after FC target reset PCI/ASPM: Allow ASPM on links to PCIe-to-PCI/PCI-X Bridges PCI: rcar: Fix incorrect programming of OB windows drivers: base: Fix NULL pointer exception in __platform_driver_probe() if a driver developer is foolish serial: amba-pl011: Make sure we initialize the port.lock spinlock i2c: pxa: fix i2c_pxa_scream_blue_murder() debug output PCI: v3-semi: Fix a memory leak in v3_pci_probe() error handling paths staging: sm750fb: add missing case while setting FB_VISUAL staging: wilc1000: Increase the size of wid_list array usb: dwc3: gadget: Properly handle failed kick_transfer usb: dwc3: gadget: Properly handle ClearFeature(halt) HID: intel-ish-hid: avoid bogus uninitialized-variable warning soundwire: slave: don't init debugfs on device registration error ASoC: max98373: reorder max98373_reset() in resume clk: meson: meson8b: Don't rely on u-boot to init all GP_PLL registers thermal/drivers/ti-soc-thermal: Avoid dereferencing ERR_PTR gpio: pca953x: fix handling of automatic address incrementing clk: meson: meson8b: Fix the vclk_div{1, 2, 4, 6, 12}_en gate bits clk: meson: meson8b: Fix the polarity of the RESET_N lines clk: meson: meson8b: Fix the first parent of vid_pll_in_sel slimbus: ngd: get drvdata from correct device tty: hvc: Fix data abort due to race in hvc_open s390/qdio: put thinint indicator after early error ALSA: usb-audio: Fix racy list management in output queue ALSA: usb-audio: Improve frames size computation staging: gasket: Fix mapping refcnt leak when register/store fails staging: gasket: Fix mapping refcnt leak when put attribute fails firmware: qcom_scm: fix bogous abuse of dma-direct internals arm64: dts: qcom: fix pm8150 gpio interrupts virtiofs: schedule blocking async replies in separate worker pinctrl: rza1: Fix wrong array assignment of rza1l_swio_entries scsi: qedf: Fix crash when MFW calls for protocol stats while function is still probing gpio: dwapb: Append MODULE_ALIAS for platform driver RDMA/mlx5: Fix udata response upon SRQ creation ARM: dts: sun8i-h2-plus-bananapi-m2-zero: Fix led polarity arm64: dts: qcom: msm8916: remove unit name for thermal trip points scsi: qedi: Do not flush offload work if ARP not resolved arm64: dts: mt8173: fix unit name warnings staging: greybus: fix a missing-check bug in gb_lights_light_config() x86/purgatory: Disable various profiling and sanitizing options apparmor: fix nnp subset test for unconfined scsi: ibmvscsi: Don't send host info in adapter info MAD after LPM scsi: sr: Fix sr_probe() missing deallocate of device minor bpf, sockhash: Fix memory leak when unlinking sockets in sock_hash_free ASoC: meson: add missing free_irq() in error path f2fs: handle readonly filesystem in f2fs_ioc_shutdown() apparmor: check/put label on apparmor_sk_clone_security() net: dsa: lantiq_gswip: fix and improve the unsupported interface error apparmor: fix introspection of of task mode for unconfined tasks mksysmap: Fix the mismatch of '.L' symbols in System.map NTB: Fix the default port and peer numbers for legacy drivers NTB: ntb_pingpong: Choose doorbells based on port number yam: fix possible memory leak in yam_init_driver sparc32: mm: Don't try to free page-table pages if ctor() fails pwm: img: Call pm_runtime_put() in pm_runtime_get_sync() failed case powerpc/crashkernel: Take "mem=" option into account ASoC: qcom: q6asm-dai: kCFI fix cifs: set up next DFS target before generic_ip_connect() RDMA/core: Fix several reference count leaks. PCI: vmd: Filter resource type bits from shadow register nfsd: Fix svc_xprt refcnt leak when setup callback client failed powerpc/perf/hv-24x7: Fix inconsistent output values incase multiple hv-24x7 events run IB/mlx5: Fix DEVX support for MLX5_CMD_OP_INIT2INIT_QP command clk: clk-flexgen: fix clock-critical handling scsi: vhost: Notify TCM about the maximum sg entries supported per command scsi: lpfc: Fix lpfc_nodelist leak when processing unsolicited event clk: zynqmp: fix memory leak in zynqmp_register_clocks scsi: cxgb3i: Fix some leaks in init_act_open() mfd: wm8994: Fix driver operation if loaded as modules powerpc/ptdump: Add _PAGE_COHERENT flag usb: gadget: core: sync interrupt before unbind the udc gpio: dwapb: Call acpi_gpiochip_free_interrupts() on GPIO chip de-registration m68k/PCI: Fix a memory leak in an error handling path PCI: pci-bridge-emul: Fix PCIe bit conflicts scsi: hisi_sas: Do not reset phy timer to wait for stray phy up RDMA/mlx5: Add init2init as a modify command coresight: tmc: Fix TMC mode read in tmc_read_prepare_etb() vfio/pci: fix memory leaks in alloc_perm_bits() arm64: dts: fvp/juno: Fix node address fields ps3disk: use the default segment boundary PCI: aardvark: Don't blindly enable ASPM L0s and don't write to read-only register arm64: dts: fvp: Fix GIC child nodes ASoC: SOF: Do nothing when DSP PM callbacks are not set clk: renesas: cpg-mssr: Fix STBCR suspend/resume handling pinctrl: ocelot: Fix GPIO interrupt decoding on Jaguar2 arm64: dts: juno: Fix GIC child nodes arm64: dts: armada-3720-turris-mox: fix SFP binding arm64: dts: armada-3720-turris-mox: forbid SDR104 on SDIO for FCC purposes dm mpath: switch paths in dm_blk_ioctl() code path misc: fastrpc: fix potential fastrpc_invoke_ctx leak misc: fastrpc: Fix an incomplete memory release in fastrpc_rpmsg_probe() serial: 8250: Fix max baud limit in generic 8250 port usblp: poison URBs upon disconnect clk: samsung: Mark top ISP and CAM clocks on Exynos542x as critical remoteproc: qcom_q6v5_mss: map/unmap mpss segments before/after use i2c: pxa: clear all master action bits in i2c_pxa_stop_message() f2fs: report delalloc reserve as non-free in statfs for project quota iio: bmp280: fix compensation of humidity rtc: mc13xxx: fix a double-unlock issue powerpc/kasan: Fix stack overflow by increasing THREAD_SHIFT Input: edt-ft5x06 - fix get_default register write access scsi: qla2xxx: Fix issue with adapter's stopping state PCI: Allow pci_resize_resource() for devices on root bus ALSA: isa/wavefront: prevent out of bounds write in ioctl ALSA: hda/realtek - Introduce polarity for micmute LED GPIO arm64: dts: meson: fixup SCP sram nodes scsi: qedi: Check for buffer overflow in qedi_set_path() scsi: core: free sgtables in case command setup fails ARM: dts: stm32: Add missing ethernet PHY reset on AV96 ARM: integrator: Add some Kconfig selections ASoC: davinci-mcasp: Fix dma_chan refcnt leak when getting dma type ARM: dts: renesas: Fix IOMMU device node names backlight: lp855x: Ensure regulators are disabled on probe failure ASoC: fsl_esai: Disable exception interrupt before scheduling tasklet clk: qcom: msm8916: Fix the address location of pll->config_reg remoteproc: Fix IDR initialisation in rproc_alloc() iio: pressure: bmp280: Tolerate IRQ before registering ASoC: SOF: imx8: Fix randbuild error i2c: piix4: Detect secondary SMBus controller on AMD AM4 chipsets ASoC: tegra: tegra_wm8903: Support nvidia, headset property clk: sunxi: Fix incorrect usage of round_down() power: supply: bq24257_charger: Replace depends on REGMAP_I2C with select memshare: Add debug logs to track subsystem notification ANDROID: abi_gki_aarch64_qcom_whitelist: Add reboot_mode cpufreq: qcom: cpufreq-hw: Remove enable of GT_IRQ for EPSS usb: dwc3-msm: Fix potential array out-of- bounds access clk: qcom: gpucc: Add Support for GPUCC clock driver for SHIMA msm: kgsl: Fix kgsl_state_is_awake for gmu targets msm: kgsl: Move rscc to a6xx gmu space msm: kgsl: Get rid of gmu_core_snapshot and gmu_core_dev_snapshot msm: kgsl: Pare down the gmu core and dev ops msm: kgsl: Move gmu_fault from snapshot structure msm: kgsl: Do inline gmu and rgmu snapshot msm: kgsl: Make kgsl_pwrctrl_axi return a value ANDROID: Update kabi for db845c (following moving pinctrl to a module) ANDROID: GKI: Remove msm_pinctrl-* symbols from the abi lists ANDROID: db845c_gki.fragment: Add PINCTRL_MSM=m ANDROID: GKI: Remove PINCTRL_MSM as built in driver ANDROID: pinctrl: qcom: Allow pinctrl-msm code to be loadable as a module msm: kgsl: Add target specific clock and bus scaling config: Enable module signature in generic defconfig msm: ipa: Add more ipa API to ipa framework serial: msm_geni_serial: Fix DMA TX FSM reset sequence serial: msm-geni-serial: Fix possible null pointer access with handle_rx msm: kgsl: Fix datatype of count in kgsl_alloc_secure_pages power: smb1398: Add snapshot of driver trace: increase caller depth for preempt/irqs disable events serial: Refactor code to reduce cyclomatic complexity input: touchscreen: st: add trusted touch support msm: adsprpc: limit number of pending invocations to DSP sched: use wake_q length only when WALT is enabled ANDROID: GKI: update ABI after struct vm_fault changes ANDROID: GKI: mm: add struct vm_fault fields for SPECULATIVE_PAGE_FAULTS net: qrtr: ns: Add ipc logging to ns net: qrtr: Fix early exit in del client and bye cmds msm: adsprpc: limit number of cached buffers FROMLIST: f2fs: fix use-after-free when accessing bio->bi_crypt_context ANDROID: GKI: Update ABI for incremental fs ANDROID: GKI: Update whitelist and defconfig for incfs sysfs: ufs-qcom: Add sysfs entries for flashpvl ANDROID: gki_defconfig: x86: Enable KERNEL_LZ4 ANDROID: GKI: scripts: Makefile: update the lz4 command msm: kgsl: Do not clear dispatcher fault when adreno reset fails ANDROID: Use depmod from the hermetic toolchain ANDROID: ABI/Whitelist: update symbols of unisoc whitelist taskstats: extended taskstats2 with acct fields Linux 5.4.48 perf symbols: Fix kernel maps for kcore and eBPF perf symbols: Fix debuginfo search for Ubuntu perf probe: Check address correctness by map instead of _etext perf probe: Fix to check blacklist address correctly perf probe: Do not show the skipped events f2fs: fix checkpoint=disable:%u%% w1: omap-hdq: cleanup to add missing newline for some dev_dbg mtd: rawnand: tmio: Fix the probe error path mtd: rawnand: mtk: Fix the probe error path mtd: rawnand: pasemi: Fix the probe error path mtd: rawnand: plat_nand: Fix the probe error path mtd: rawnand: sunxi: Fix the probe error path mtd: rawnand: oxnas: Fix the probe error path mtd: rawnand: socrates: Fix the probe error path mtd: rawnand: orion: Fix the probe error path mtd: rawnand: xway: Fix the probe error path mtd: rawnand: ingenic: Fix the probe error path mtd: rawnand: sharpsl: Fix the probe error path mtd: rawnand: diskonchip: Fix the probe error path mtd: rawnand: brcmnand: fix hamming oob layout mtd: rawnand: onfi: Fix redundancy detection check mtd: rawnand: Fix nand_gpio_waitrdy() sunrpc: clean up properly in gss_mech_unregister() sunrpc: svcauth_gss_register_pseudoflavor must reject duplicate registrations. kbuild: force to build vmlinux if CONFIG_MODVERSION=y powerpc/64s: Save FSCR to init_task.thread.fscr after feature init powerpc/64s: Don't let DT CPU features set FSCR_DSCR powerpc/32: Disable KASAN with pages bigger than 16k powerpc/kasan: Fix shadow pages allocation failure powerpc/kasan: Fix issues by lowering KASAN_SHADOW_END powerpc/32s: Fix another build failure with CONFIG_PPC_KUAP_DEBUG drivers/macintosh: Fix memleak in windfarm_pm112 driver ARM: dts: s5pv210: Set keep-power-in-suspend for SDHCI1 on Aries ARM: dts: at91: sama5d2_ptc_ek: fix vbus pin ARM: dts: exynos: Fix GPIO polarity for thr GalaxyS3 CM36651 sensor's bus soc/tegra: pmc: Select GENERIC_PINCONF ARM: tegra: Correct PL310 Auxiliary Control Register initialization kernel/cpu_pm: Fix uninitted local in cpu_pm powerpc/fadump: Account for memory_limit while reserving memory powerpc/fadump: consider reserved ranges while reserving memory powerpc/fadump: use static allocation for reserved memory ranges alpha: fix memory barriers so that they conform to the specification dm crypt: avoid truncating the logical block size sparc64: fix misuses of access_process_vm() in genregs32_[sg]et() sparc32: fix register window handling in genregs32_[gs]et() gnss: sirf: fix error return code in sirf_probe() pinctrl: samsung: Save/restore eint_mask over suspend for EINT_TYPE GPIOs pinctrl: samsung: Correct setting of eint wakeup mask on s5pv210 power: supply: core: fix memory leak in HWMON error path power: supply: core: fix HWMON temperature labels power: vexpress: add suppress_bind_attrs to true EDAC/amd64: Add AMD family 17h model 60h PCI IDs hwmon: (k10temp) Add AMD family 17h model 60h PCI match igb: Report speed and duplex as unknown when device is runtime suspended clk: mediatek: assign the initial value to clk_init_data of mtk_mux media: ov5640: fix use of destroyed mutex b43_legacy: Fix connection problem with WPA3 b43: Fix connection problem with WPA3 b43legacy: Fix case where channel status is corrupted Bluetooth: hci_bcm: fix freeing not-requested IRQ serial: 8250: Avoid error message on reprobe media: cedrus: Program output format during each run media: go7007: fix a miss of snd_card_free carl9170: remove P2P_GO support e1000e: Relax condition to trigger reset for ME workaround e1000e: Disable TSO for buffer overrun workaround PCI: Program MPS for RCiEP devices ima: Set again build_ima_appraise variable ima: Remove redundant policy rule set in add_rules() x86/amd_nb: Add AMD family 17h model 60h PCI IDs serial: 8250_pci: Move Pericom IDs to pci_ids.h PCI: Add Loongson vendor ID x86/amd_nb: Add Family 19h PCI IDs PCI: vmd: Add device id for VMD device 8086:9A0B PCI: Add ACS quirk for Intel Root Complex Integrated Endpoints PCI: Avoid FLR for AMD Starship USB 3.0 PCI: Avoid FLR for AMD Matisse HD Audio & USB 3.0 PCI: Avoid Pericom USB controller OHCI/EHCI PME# defect ext4: fix race between ext4_sync_parent() and rename() ext4: fix error pointer dereference ext4: fix EXT_MAX_EXTENT/INDEX to check for zeroed eh_max evm: Fix possible memory leak in evm_calc_hmac_or_hash() ima: Remove __init annotation from ima_pcrread() ima: Call ima_calc_boot_aggregate() in ima_eventdigest_init() ima: Directly assign the ima_default_policy pointer to ima_rules ima: Evaluate error in init_ima() ima: Switch to ima_hash_algo for boot aggregate ima: Fix ima digest hash table key calculation mm: call cond_resched() from deferred_init_memmap() mm/pagealloc.c: call touch_nmi_watchdog() on max order boundaries in deferred init mm: initialize deferred pages with interrupts enabled mm: thp: make the THP mapcount atomic against __split_huge_pmd_locked() powerpc/mm: Fix conditions to perform MMU specific management by blocks on PPC32. btrfs: fix space_info bytes_may_use underflow during space cache writeout btrfs: fix space_info bytes_may_use underflow after nocow buffered write btrfs: fix wrong file range cleanup after an error filling dealloc range btrfs: fix error handling when submitting direct I/O bio btrfs: force chunk allocation if our global rsv is larger than metadata btrfs: send: emit file capabilities after chown btrfs: include non-missing as a qualifier for the latest_bdev btrfs: free alien device after device add string.h: fix incompatibility between FORTIFY_SOURCE and KASAN kasan: stop tests being eliminated as dead code with FORTIFY_SOURCE selftests/bpf, flow_dissector: Close TAP device FD after the test bpf: Fix running sk_skb program types with ktls bpf: Refactor sockmap redirect code so its easy to reuse bpf: Fix map permissions check libbpf: Fix perf_buffer__free() API for sparse allocs platform/x86: asus_wmi: Reserve more space for struct bias_args platform/x86: intel-vbtn: Only blacklist SW_TABLET_MODE on the 9 / "Laptop" chasis-type platform/x86: intel-hid: Add a quirk to support HP Spectre X2 (2015) platform/x86: hp-wmi: Convert simple_strtoul() to kstrtou32() cpuidle: Fix three reference count leaks spi: dw: Return any value retrieved from the dma_transfer callback mmc: sdhci-esdhc-imx: fix the mask for tuning start point iwlwifi: mvm: fix aux station leak ixgbe: fix signed-integer-overflow warning ice: fix potential double free in probe unrolling mmc: via-sdmmc: Respect the cmd->busy_timeout from the mmc core staging: greybus: sdio: Respect the cmd->busy_timeout from the mmc core mmc: sdhci-msm: Set SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12 quirk bcache: fix refcount underflow in bcache_device_free() MIPS: Fix IRQ tracing when call handle_fpe() and handle_msa_fpe() PCI: Don't disable decoding when mmio_always_on is set macvlan: Skip loopback packets in RX handler btrfs: qgroup: mark qgroup inconsistent if we're inherting snapshot to a new qgroup btrfs: improve global reserve stealing logic m68k: mac: Don't call via_flush_cache() on Mac IIfx MIPS: tools: Fix resource leak in elf-entry.c x86/mm: Stop printing BRK addresses selftests/bpf: CONFIG_IPV6_SEG6_BPF required for test_seg6_loop.o drm/amdgpu: Sync with VM root BO when switching VM to CPU update mode drm/amd/powerpay: Disable gfxoff when setting manual mode on picasso and raven crypto: stm32/crc32 - fix multi-instance crypto: stm32/crc32 - fix run-time self test issue. crypto: stm32/crc32 - fix ext4 chksum BUG_ON() mips: Add udelay lpj numbers adjustment mips: MAAR: Use more precise address mask sched: Defend cfs and rt bandwidth quota against overflow x86/boot: Correct relocation destination on old linkers kgdboc: Use a platform device to handle tty drivers showing up late mwifiex: Fix memory corruption in dump_station rtlwifi: Fix a double free in _rtl_usb_tx_urb_setup() net/mlx5e: IPoIB, Drop multicast packets that this interface sent veth: Adjust hard_start offset on redirect XDP frames iocost: don't let vrate run wild while there's no saturation signal raid5: remove gfp flags from scribble_alloc() md: don't flush workqueue unconditionally in md_open mt76: avoid rx reorder buffer overflow drm/mcde: dsi: Fix return value check in mcde_dsi_bind() net: qed*: Reduce RX and TX default ring count when running inside kdump kernel wcn36xx: Fix error handling path in 'wcn36xx_probe()' ath10k: Remove msdu from idr when management pkt send fails nvme-tcp: use bh_lock in data_ready nvme-pci: align io queue count with allocted nvme_queue in nvme_probe nvme: refine the Qemu Identify CNS quirk iwlwifi: avoid debug max amsdu config overwriting itself platform/x86: intel-vbtn: Also handle tablet-mode switch on "Detachable" and "Portable" chassis-types platform/x86: intel-vbtn: Do not advertise switches to userspace if they are not there platform/x86: intel-vbtn: Split keymap into buttons and switches parts platform/x86: intel-vbtn: Use acpi_evaluate_integer() xfs: fix duplicate verification from xfs_qm_dqflush() xfs: reset buffer write failure state on successful completion kgdb: Fix spurious true from in_dbg_master() mips: cm: Fix an invalid error code of INTVN_*_ERR MIPS: Truncate link address into 32bit for 32bit kernel Crypto/chcr: fix for ccm(aes) failed test xfs: clean up the error handling in xfs_swap_extents libertas_tf: avoid a null dereference in pointer priv powerpc/spufs: fix copy_to_user while atomic net: allwinner: Fix use correct return type for ndo_start_xmit() media: cec: silence shift wrapping warning in __cec_s_log_addrs() drivers: net: davinci_mdio: fix potential NULL dereference in davinci_mdio_probe() selinux: fix error return code in policydb_read() net: lpc-enet: fix error return code in lpc_mii_init() iocost_monitor: drop string wrap around numbers when outputting json drivers/perf: hisi: Fix typo in events attribute array sched/core: Fix illegal RCU from offline CPUs exit: Move preemption fixup up, move blocking operations down lib/mpi: Fix 64-bit MIPS build with Clang net: bcmgenet: Fix WoL with password after deep sleep net: bcmgenet: set Rx mode before starting netif selftests/bpf: Fix memory leak in extract_build_id() netfilter: nft_nat: return EOPNOTSUPP if type or flags are not supported dpaa2-eth: fix return codes used in ndo_setup_tc Drivers: hv: vmbus: Always handle the VMBus messages on CPU0 audit: fix a net reference leak in audit_list_rules_send() Bluetooth: btbcm: Add 2 missing models to subver tables ath10k: add flush tx packets for SDIO chip MIPS: Make sparse_init() using top-down allocation media: platform: fcp: Set appropriate DMA parameters media: dvb: return -EREMOTEIO on i2c transfer failure. audit: fix a net reference leak in audit_send_reply() drm/mediatek: set dpi pin mode to gpio low to avoid leakage current dt-bindings: display: mediatek: control dpi pins mode to avoid leakage e1000: Distribute switch variables for initialization tools api fs: Make xxx__mountpoint() more scalable regulator: qcom-rpmh: Fix typos in pm8150 and pm8150l brcmfmac: fix wrong location to get firmware feature spi: Respect DataBitLength field of SpiSerialBusV2() ACPI resource media: staging/intel-ipu3: Implement lock for stream on/off operations ath10k: fix kernel null pointer dereference staging: android: ion: use vmap instead of vm_map_ram x86: fix vmap arguments in map_irq_stack net: vmxnet3: fix possible buffer overflow caused by bad DMA value in vmxnet3_get_rss() x86/kvm/hyper-v: Explicitly align hcall param for kvm_hyperv_exit spi: dw: Fix Rx-only DMA transfers Bluetooth: btmtkuart: Improve exception handling in btmtuart_probe() mmc: meson-mx-sdio: trigger a soft reset after a timeout or CRC error ice: Fix for memory leaks and modify ICE_FREE_CQ_BUFS ice: Fix memory leak batman-adv: Revert "disable ethtool link speed detection when auto negotiation off" ARM: 8978/1: mm: make act_mm() respect THREAD_SIZE btrfs: do not ignore error from btrfs_next_leaf() when inserting checksums btrfs: account for trans_block_rsv in may_commit_transaction media: dvbdev: Fix tuner->demod media controller link clocksource: dw_apb_timer_of: Fix missing clockevent timers clocksource: dw_apb_timer: Make CPU-affiliation being optional spi: dw: Enable interrupts in accordance with DMA xfer mode mips: Fix cpu_has_mips64r1/2 activation for MIPS32 CPUs ACPI/IORT: Fix PMCG node single ID mapping handling pmu/smmuv3: Clear IRQ affinity hint on device removal kgdb: Prevent infinite recursive entries to the debugger kgdb: Disable WARN_CONSOLE_UNLOCKED for all kgdb Bluetooth: Add SCO fallback for invalid LMP parameters error MIPS: Loongson: Build ATI Radeon GPU driver as module platform/x86: dell-laptop: don't register micmute LED if there is no token ixgbe: Fix XDP redirect on archs with PAGE_SIZE above 4K lockdown: Allow unprivileged users to see lockdown status drm: rcar-du: Set primary plane zpos immutably at initializing block: reset mapping if failed to update hardware queue count arm64: insn: Fix two bugs in encoding 32-bit logical immediates block: alloc map and request for new hardware queue ACPICA: Dispatcher: add status checks spi: dw: Zero DMA Tx and Rx configurations on stack rtw88: fix an issue about leak system resources media: staging: ipu3: Fix stale list entries on parameter queue failure arm64: cacheflush: Fix KGDB trap detection ath10k: remove the max_sched_scan_reqs value efi/libstub/x86: Work around LLVM ELF quirk build regression net: ena: fix error returning in ena_com_get_hash_function() net: atlantic: make hw_get_regs optional sched/fair: Refill bandwidth before scaling x86,smap: Fix smap_{save,restore}() alternatives spi: pxa2xx: Apply CS clk quirk to BXT libbpf: Fix memory leak and possible double-free in hashmap__clear arm64/kernel: Fix range on invalidating dcache for boot page tables drm/amdgpu: Init data to avoid oops while reading pp_num_states. spi: spi-mem: Fix Dual/Quad modes on Octal-capable devices objtool: Ignore empty alternatives media: si2157: Better check for running tuner in init media: vicodec: Fix error codes in probe function crypto: ccp -- don't "select" CONFIG_DMADEVICES media: imx: imx7-mipi-csis: Cleanup and fix subdev pad format handling media: staging: imgu: do not hold spinlock during freeing mmu page table drm: bridge: adv7511: Extend list of audio sample rates ath10k: Fix the race condition in firmware dump work queue drm/amdgpu: fix and cleanup amdgpu_gem_object_close v4 ACPI: GED: use correct trigger type field in _Exx / _Lxx handling clk: qcom: Add clk_list_rates support for divider clocks serial: Propagate missing UART fix 4.19 to 5.4 defconfig: arm64: Enable SMD-RPM clock for HOLI clk: qcom: clk-smd-rpm: Refactor the code for HOLI pinctrl: qcom: Expose ufs_reset as gpio on holi usb: gadget: Fix double free of device descriptor pointers dwc3: gadget: Separate out top and bottom half based logging msm: cvp: add trace utililty for systrace profiling defconfig: lahaina-qgki: Enable debug clock controller msm: kgsl: Add target specific touch wakeup function msm: kgsl: Create a6xx rgmu power ops msm: kgsl: Separate out reset sequence for a6xx gmu targets msm: kgsl: Add a6xx gmu suspend and resume msm: kgsl: Create a6xx gmu power ops msm: kgsl: Remove fault argument from target specific reset msm: kgsl: Move bus counter allocation to its own function msm: kgsl: Move kgsl_idle_check to target specific probe msm: kgsl: Create adreno power operations msm: kgsl: Consolidate gmu register programming msm: kgsl: Remove duplicated register write msm: kgsl: Remove gmu_core_dev_enable_lm function msm: kgsl: Remove any eCP references writeback: Drop I_DIRTY_TIME_EXPIRE writeback: Fix sync livelock due to b_dirty_time processing writeback: Avoid skipping inode writeback writeback: Protect inode->i_io_list with inode->i_lock Revert "writeback: Avoid skipping inode writeback" sched/walt: Improve the scheduler sched/walt: Improve the scheduler sched/walt: Improve the scheduler sched: Improve the scheduler arm64: defconfig: Enable CONFIG_PSI_FTRACE on Lahaina vmscan: Support multiple kswapd threads per node coresight: tpdm: add an option "qcom,cmb-msr-skip" for tpdm msm: cvp: Add IPCC mapping for CVP FW soc: qcom: Check rmb status register for spss bootup status msm: synx: fence callback fixes ABI: Add cnss2 symbol bluetooth: fix the gpio names in devicetree scsi: ufshcd: Properly set the device Icc Level ANDROID: GKI: enable some more USB configfs options mm: support vector address ranges for process_madvise mm/madvise: allow KSM hints for remote API mm/madvise: support both pid and pidfd for process_madvise pid: move pidfd_get_pid() to pid.c mm/madvise: check fatal signal pending of target process mm/madvise: introduce process_madvise() syscall: an external memory hinting API driver: pinctrl: Add reserved GPIOs for Shima taskstats: remove redundant MM_STAT config check pinctrl: qcom: Update configuration for Shima mhi: core: add mhi_device_get_sync_atomic() to wait until M0 scsi: ufs: Record last intr status and its timestamp scsi: ufs: Fix imbalanced scsi_block_reqs_cnt caused by ufshcd_hold() soc: qcom: hwkm: check key size before unwrap drivers: qcom: rpmh: caching batch requests should flag the cache dirty drivers: soc: Add devcoredump based ramdump APIs drivers: qcom: add system PM violators debug driver Linux 5.4.47 KVM: arm64: Save the host's PtrAuth keys in non-preemptible context KVM: arm64: Synchronize sysreg state on injecting an AArch32 exception xen/pvcalls-back: test for errors when calling backend_connect() block/floppy: fix contended case in floppy_queue_rq() mmc: sdio: Fix several potential memory leaks in mmc_sdio_init_card() mmc: sdio: Fix potential NULL pointer error in mmc_sdio_init_card() ARM: dts: at91: sama5d2_ptc_ek: fix sdmmc0 node description mmc: uniphier-sd: call devm_request_irq() after tmio_mmc_host_probe() mmc: tmio: Further fixup runtime PM management at remove mmc: mmci_sdmmc: fix DMA API warning overlapping mappings mmc: sdhci-msm: Clear tuning done flag while hs400 tuning agp/intel: Reinforce the barrier after GTT updates perf: Add cond_resched() to task_function_call() fat: don't allow to mount if the FAT length == 0 mm/slub: fix a memory leak in sysfs_slab_add() drm/vkms: Hold gem object while still in-use Smack: slab-out-of-bounds in vsscanf ath9k: Fix general protection fault in ath9k_hif_usb_rx_cb ath9x: Fix stack-out-of-bounds Write in ath9k_hif_usb_rx_cb ath9k: Fix use-after-free Write in ath9k_htc_rx_msg ath9k: Fix use-after-free Read in ath9k_wmi_ctrl_rx ath9k: Fix use-after-free Read in htc_connect_service selftests/ftrace: Return unsupported if no error_log file scsi: lpfc: Fix negation of else clause in lpfc_prep_node_fc4type scsi: megaraid_sas: TM command refire leads to controller firmware crash KVM: arm64: Make vcpu_cp1x() work on Big Endian hosts KVM: arm64: Stop writing aarch32's CSSELR into ACTLR KVM: MIPS: Fix VPN2_MASK definition for variable cpu_vmbits KVM: MIPS: Define KVM_ENTRYHI_ASID to cpu_asid_mask(&boot_cpu_data) KVM: nVMX: Consult only the "basic" exit reason when routing nested exit KVM: nSVM: leave ASID aside in copy_vmcb_control_area KVM: nSVM: fix condition for filtering async PF KVM: nVMX: Skip IBPB when switching between vmcs01 and vmcs02 video: fbdev: w100fb: Fix a potential double free. video: vt8500lcdfb: fix fallthrough warning EDAC/skx: Use the mcmtr register to retrieve close_pg/bank_xor_enable cpufreq: Fix up cpufreq_boost_set_sw() remoteproc: Fix and restore the parenting hierarchy for vdev remoteproc: Fall back to using parent memory pool if no dedicated available proc: Use new_inode not new_inode_pseudo ovl: initialize error in ovl_copy_xattr net/mlx5e: Fix repeated XSK usage on one channel net/mlx5: Fix fatal error handling during device load net/mlx5: drain health workqueue in case of driver load error selftests/net: in rxtimestamp getopt_long needs terminating null entry dccp: Fix possible memleak in dccp_init and dccp_fini crypto: virtio: Fix dest length calculation in __virtio_crypto_skcipher_do_req() crypto: virtio: Fix src/dst scatterlist calculation in __virtio_crypto_skcipher_do_req() crypto: virtio: Fix use-after-free in virtio_crypto_skcipher_finalize_req() firmware: imx: scu: Fix corruption of header firmware: imx-scu: Support one TX and one RX firmware: imx: warn on unexpected RX x86/{mce,mm}: Unmap the entire page if the whole page is affected and poisoned crypto: drbg - fix error return code in drbg_alloc_state() crypto: algapi - Avoid spurious modprobe on LOADED crypto: cavium/nitrox - Fix 'nitrox_get_first_device()' when ndevlist is fully iterated gup: document and work around "COW can break either way" issue PM: runtime: clk: Fix clk_pm_runtime_get() error path spi: bcm-qspi: when tx/rx buffer is NULL set to 0 spi: bcm-qspi: Handle clock probe deferral spi: bcm2835aux: Fix controller unregister order spi: bcm2835: Fix controller unregister order spi: pxa2xx: Fix runtime PM ref imbalance on probe error spi: pxa2xx: Fix controller unregister order spi: Fix controller unregister order spi: dw: Fix controller unregister order nilfs2: fix null pointer dereference at nilfs_segctor_do_construct() lib/lzo: fix ambiguous encoding bug in lzo-rle arm64: acpi: fix UBSAN warning ACPI: PM: Avoid using power resources if there are none for D0 ACPI: GED: add support for _Exx / _Lxx handler methods ACPI: CPPC: Fix reference count leak in acpi_cppc_processor_probe() ACPI: sysfs: Fix reference count leak in acpi_sysfs_add_hotplug_profile() ALSA: usb-audio: Add vendor, product and profile name for HP Thunderbolt Dock ALSA: usb-audio: Fix inconsistent card PM state after resume ALSA: pcm: fix snd_pcm_link() lockdep splat ALSA: pcm: disallow linking stream to itself ALSA: hda/realtek - add a pintbl quirk for several Lenovo machines ALSA: fireface: fix configuration error for nominal sampling transfer frequency ALSA: es1688: Add the missed snd_card_free() watchdog: imx_sc_wdt: Fix reboot on crash smb3: add indatalen that can be a non-zero value to calculation of credit charge in smb2 ioctl smb3: fix incorrect number of credits when ioctl MaxOutputResponse > 64K efi/efivars: Add missing kobject_put() in sysfs entry creation error path io_uring: use kvfree() in io_sqe_buffer_register() ASoC: max9867: fix volume controls powerpc/ptdump: Properly handle non standard page size KVM: x86: Fix APIC page invalidation race KVM: x86: respect singlestep when emulating instruction KVM: x86/mmu: Set mmio_value to '0' if reserved #PF can't be generated perf/x86/intel: Add more available bits for OFFCORE_RESPONSE of Intel Tremont x86/reboot/quirks: Add MacBook6,1 reboot quirk x86/speculation: PR_SPEC_FORCE_DISABLE enforcement for indirect branches. x86/speculation: Avoid force-disabling IBPB based on STIBP and enhanced IBRS. x86/speculation: Prevent rogue cross-process SSBD shutdown x86/PCI: Mark Intel C620 MROMs as having non-compliant BARs x86_64: Fix jiffies ODR violation sctp: fix refcount bug in sctp_wfree sctp: fix possibly using a bad saddr with a given dst iwlwifi: mvm: fix NVM check for 3168 devices ipv4: fix a RCU-list lock in fib_triestat_seq_show aio: fix async fsync creds fanotify: fix ignore mask logic for events on child and on dir selftests: fix flower parent qdisc mm: add kvfree_sensitive() for freeing sensitive data objects perf probe: Accept the instance number of kretprobe event PCI/PM: Adjust pcie_wait_for_link_delay() for caller delay KVM: x86: only do L1TF workaround on affected processors x86/cpu/amd: Make erratum #1054 a legacy erratum s390/pci: Log new handle in clp_disable_fh() padata: add separate cpuhp node for CPUHP_PADATA_DEAD RDMA/uverbs: Make the event_queue fds return POLLERR when disassociated smack: avoid unused 'sip' variable warning ath9k_htc: Silence undersized packet warnings spi: dw: Fix native CS being unset powerpc/xive: Clear the page tables for the ESB IO mapping drivers/net/ibmvnic: Update VNIC protocol version reporting gfs2: Even more gfs2_find_jhead fixes csky: Fixup abiv2 syscall_trace break a4 & a5 Input: synaptics - add a second working PNP_ID for Lenovo T470s sched/fair: Don't NUMA balance for kthreads ARM: 8977/1: ptrace: Fix mask for thumb breakpoint hook Input: mms114 - fix handling of mms345l elfnote: mark all .note sections SHF_ALLOC bpf: Support llvm-objcopy for vmlinux BTF vxlan: Avoid infinite loop when suppressing NS messages with invalid options bridge: Avoid infinite loop when suppressing NS messages with invalid options tun: correct header offsets in napi frags mode net_failover: fixed rollback in net_failover_open() mlxsw: core: Use different get_trend() callbacks for different thermal zones ipv6: fix IPV6_ADDRFORM operation logic Revert "interconnect: qcom: Build icc-rpmh with qnoc-lahaina" msm: adsprpc: Fix array index underflow problem net: qrtr: haven: Add svm device tree parsing net: qrtr: haven: Add memory sharing support net: qrtr: haven: Read peer name from device tree net: qrtr: haven: Store haven label scsi: ufs: Dump PA_VS_STATUS_REG1 in eh mm: allow vmas with vm_ops to be speculatively handled defconfig: lahaina: Enable LIMIT_MOVABLE_ZONE_ALLOC pagemap.h: Allow readahead Movable allocations from CMA region mm: direct previous __GFP_CMA allocations to offlinable memory mm: Allow only __GFP_OFFLINABLE allocations from Movable zone cnss2: Add synchronized force wake support firmware: qcom_scm: Add support to read LMH data power: supply: qti_battery_charger: support wireless firmware update defconfig: arm64: Enable SDPM clock monitor for Lahaina defconfig: arm64: Enable Policy Engine sensor for Lahaina drivers: thermal: sdpm: Add SDPM clock notifier driver drivers: thermal: pe_sensor: Add Policy Engine sensor fs-verity: remove unnecessary extern keywords fs-verity: fix all kerneldoc warnings fscrypt: add support for IV_INO_LBLK_32 policies fscrypt: make test_dummy_encryption use v2 by default fscrypt: support test_dummy_encryption=v2 defconfig: Add UAPI_HEADER_TEST for Lahaina GKI usb: dwc3: trace: print enqueue/dequeue pointers too usb: dwc3: gadget: Properly handle failed kick_transfer usb: dwc3: gadget: Fix request completion check usb: dwc3: gadget: Refactor dwc3_gadget_ep_dequeue fscrypt: add fscrypt_add_test_dummy_key() linux/parser.h: add include guards fscrypt: remove unnecessary extern keywords fscrypt: name all function parameters fscrypt: fix all kerneldoc warnings clk: qcom: lahaina: Lucid PLL 5LPE config and frequency plan update soc: qcom: mem-buf: Treat zero-sized sg-lists as invalid inputs arm64: defconfig: Add support for KPROBE for lahaina/shima/holi debug soc: qcom: spcom: remove excessive debug prints mm: process_reclaim: consider compound pages tmc-etr: Correct condition for SW USB mode when setup sysfs buf defconfig: Add support for compiling sdxlemur target usb: dwc3: gadget: Remove unnecessary checks usb: dwc3: gadget: Check for in-progress END_TRANSFER neuron: ch_haven: Add support for svm device tree format neuron: ch_haven: Add memory sharing support neuron: ch_haven: Store haven label for future use neuron: ch_haven: Read peer name from device tree soc: qcom: guestvm_loader: Wait for ready state before start sched/walt: Fix negative count of sched_asym_cpucapacity static key sched/fair: Depend on sched_asym_cpucapacity for new ilb aarch64: ABI: Update snapshot with newer libabigail version msm: cvp:fix potential prop_array idx out range scsi: ufshcd-crypto-qti.c: do not resume for key reprogram ANDROID: GKI: enable CONFIG_EXT4_FS_POSIX_ACL. msm: cvp:fix potential null ptr dereference msghdr msm: kgsl: Move RGMU to the a6xx target specific space msm: kgsl: Finish the GMU transition to a6xx msm: kgsl: Move HFI to the a6xx space msm: kgsl: Make all GMU code target specific msm: kgsl: Remove gmu_core_regulator_isenabled() msm: kgsl: Add a6xx probe function msm: kgsl: Add a5xx probe function msm: kgsl: Add a3xx probe function msm: kgsl: Add target specific probe functions scripts: headers_install: Turn CONFIG_* leak checker to report error scripts: headers_install: Add sysstats.h and taskstats.h into the bypass list net: qrtr: Add tracepoint support USB: f_accessory: Set manufacturer and model string to default value scsi: ufs: Fixes line-reset and adapt sequence ANDROID: arch: arm: Increase kernel command line size ANDROID: arch: arm64: Increase kernel command line size ANDROID: scsi: ufs: Handle clocks when lrbp fails Use data format as unspecified for voice ANDROID: net: bpf: permit redirect from ingress L3 to egress L2 devices at near max mtu msm: kgsl: Use BW_STEP as 50 for AB voting Revert "ALSA: PCM: volume API implementation" cpufreq: qcom: Add code to support module removal drver:soc:llcc_perfmon: qdss clk node control ANDROID: ABI: Add typec symbols to QCOM ABI whitelist UPSTREAM: usb: typec: Remove the callback members from struct typec_capability UPSTREAM: usb: typec: ucsi: Start using struct typec_operations UPSTREAM: usb: typec: tps6598x: Start using struct typec_operations UPSTREAM: usb: typec: tcpm: Start using struct typec_operations UPSTREAM: usb: typec: Separate the operations vector UPSTREAM: usb: typec: Introduce typec_get_drvdata() UPSTREAM: usb: typec: Copy everything from struct typec_capability during registration sched/walt: Remove dependency on sd_asym_cpucapacity for task placement ion: Add support for the display non-secure CMA heap soc: qcom: mem-buf: Add support for consumers to import dma-bufs soc: qcom: mem-buf: Avoid clearing transferred memory twice soc: qcom: mem-buf: Add support for suppliers to export dma-bufs ion: msm: Add support for dynamically preventing dma-buf mappings cnss2: Ignore debugfs non availability during init soc: qcom: crypto-qti-hwkm: Return negative errors input: qcom-hv-haptics: Fix a possible NULL pointer dereference pci: controller: msm: Remove support for loopback ABI: Update rmnet_ctl symbols .gitignore: ignore GKI generated defconfigs scripts: gki: Add support for qgki-consolidate_defconfig defconfig: Add initial defconfig fragment of consolidate for Lahaina msm: kgsl: Enable IFPC on A660 target input: qcom-hv-haptics: restore RC calibration mode after FIFO playing input: qcom-hv-haptics: Deglitch fifo-empty interrupt dma: gpi: Add support to assign static GPII for I2C Touch on Lahaina i2c: i2c-msm-geni: Add per session lock/unlock support in i2c UPSTREAM: mmc: sdhci-msm: Add CQHCI support for sdhci-msm mmc: sdhci: Let a vendor driver supply and update ADMA descriptor size coresight: byte-cnter: Replace dev_err with ratelimited API arm64: defconfig: Remove unnecessary configs in genericarmv8-64 arm64: defconfig: Disable tracing on genericarmv8-64 ANDROID: kbuild: ensure __cfi_check is correctly aligned ANDROID: kbuild: merge more sections with LTO msm: kgsl: PERFCNTR_CTRL needs to be at end of restore list msm: kgsl: Add support to toggle GPU GX CPR loop enable UPSTREAM: driver core: Remove unnecessary is_fwnode_dev variable in device_add() UPSTREAM: driver core: Remove check in driver_deferred_probe_force_trigger() UPSTREAM: of: platform: Batch fwnode parsing when adding all top level devices BACKPORT: driver core: fw_devlink: Add support for batching fwnode parsing BACKPORT: driver core: Look for waiting consumers only for a fwnode's primary device scsi: ufs-qcom: Remove unnecessary devm_kfree UPSTREAM: usb: musb: Add support for MediaTek musb controller UPSTREAM: usb: musb: Add musb_clearb/w() interface UPSTREAM: usb: musb: Add noirq type of dma create interface UPSTREAM: usb: musb: Add get/set toggle hooks UPSTREAM: dt-bindings: usb: musb: Add support for MediaTek musb controller mmc: sdhci-msm: Ensure larger discard size mm: Fix sleeping while atomic during speculative page fault mm: don't do swap readahead during speculative page fault mm: protect against PTE changes done by dup_mmap() arm64/mm: add speculative page fault arm64/mm: define ARCH_SUPPORTS_SPECULATIVE_PAGE_FAULT mm: add speculative page fault vmstats mm: speculative page fault handler return VMA mm: adding speculative page fault failure trace events mm: provide speculative fault infrastructure mm: protect mm_rb tree with a rwlock mm: introduce __page_add_new_anon_rmap() mm: introduce __vm_normal_page() mm: introduce __lru_cache_add_active_or_unevictable mm/migrate: Pass vm_fault pointer to migrate_misplaced_page() mm: cache some VMA fields in the vm_fault structure sched: walt: Improve the scheduler llcc_perfmon: Initialize variable before use coresight: tmc-etr: Fix deadlock issue while reading from ETR ABI: Update internal whitelist with debugfs symbols power: qti_battery_charger: call power_supply_changed() if fake_soc is set cnss2: Make sure PCIe/MHI is up before collecting RAM dump sched: Improve the scheduler sound: usb: Increase upper bound check for bInterval to 16 Revert "ANDROID: Remove default y on BRIDGE_IGMP_SNOOPING" usb: xhci: Don't check for USB_STATE_NOTATTACHED in sec_event_ring_cleanup Linux 5.4.46 Revert "net/mlx5: Annotate mutex destroy for root ns" uprobes: ensure that uprobe->offset and ->ref_ctr_offset are properly aligned x86/speculation: Add Ivy Bridge to affected list x86/speculation: Add SRBDS vulnerability and mitigation documentation x86/speculation: Add Special Register Buffer Data Sampling (SRBDS) mitigation x86/cpu: Add 'table' argument to cpu_matches() x86/cpu: Add a steppings field to struct x86_cpu_id x86/speculation/spectre_v2: Exclude Zhaoxin CPUs from SPECTRE_V2 nvmem: qfprom: remove incorrect write support CDC-ACM: heed quirk also in error handling staging: rtl8712: Fix IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK tty: hvc_console, fix crashes on parallel open/close vt: keyboard: avoid signed integer overflow in k_ascii usb: musb: Fix runtime PM imbalance on error usb: musb: start session in resume for host port iio: adc: stm32-adc: fix a wrong error message when probing interrupts iio:chemical:pms7003: Fix timestamp alignment and prevent data leak. iio: vcnl4000: Fix i2c swapped word reading. iio:chemical:sps30: Fix timestamp alignment USB: serial: ch341: add basis for quirk detection USB: serial: option: add Telit LE910C1-EUX compositions USB: serial: usb_wwan: do not resubmit rx urb on fatal errors USB: serial: qcserial: add DW5816e QDL support net: be more gentle about silly gso requests coming from user net: check untrusted gso_size at kernel entry vsock: fix timeout in vsock_accept() nfp: flower: fix used time of merge flow statistics NFC: st21nfca: add missed kfree_skb() in an error path net: usb: qmi_wwan: add Telit LE910C1-EUX composition net: stmmac: enable timestamp snapshot for required PTP packets in dwmac v5.10a net/mlx5: Fix crash upon suspend/resume l2tp: do not use inet_hash()/inet_unhash() l2tp: add sk_family checks to l2tp_validate_socket devinet: fix memleak in inetdev_init() ANDROID: GKI: Update ABI after scsi/ufs changes soc: qti_battery_debug: Move qbg_context to device bin file genirq/cpuhotplug: Reduce logging level for couple of prints smcinvoke: Move error message to debug FROMLIST: Documentation:sysfs-ufs: Add WriteBooster documentation FROMGIT: scsi: ufs-qcom: Configure write booster type FROMGIT: scsi: ufs: sysfs: Add sysfs entries for write booster BACKPORT: FROMGIT: scsi: ufs: Add write booster feature support coresight: byte-cnter: Add ETR status check in bypass notifier dma-mapping-fast: reduce TLBI during map clk: qcom: gcc: Make gcc_ddrss_gpu_axi_clk as always ON arm64: enable internal regdb for lahaina coresight: Forbid enabling sink while reading sink ANDROID: ABI/Whitelist: update symbols of unisoc whitelist ANDROID: scs: fix recursive spinlock in scs_check_usage usb: xhci: Don't check for USB_STATE_NOTATTACHED in xhci_stop_endpoint qcom: whitelist: Remove symbol from whitelist arm64: defconfig: enable USB redriver on Lahaina QRD usb: typec: ucsi: Modify IPC log string scsi: ufs: Enable WriteBooster defconfig: msm: Add config fragment for DEBUG_FS disablement sched/tracing: Fix format specifiers in sched_compute_energy scsi: ufs: Move ufshcd_vops_dbg_register_dump out of ufshcd_print_host_regs uapi: qg: Fix UAPI header to enable UAPI_HEADER_TEST BACKPORT: FROMGIT: scsi: ufs: Remove unnecessary memset for dev_info devfreq: memlat: fix potential deadlock during CPU hotplug build.config: Add build.config files for Lahaina ANDROID: staging: ion: Fix potential memory corruption ANDROID: staging: ion: optimize cache operation for non-cached buffer ANDROID: staging: ion: Skip sync if not mapped ANDROID: staging: ion: use dma_[un]map_sg_attrs msm: cvp: Allow re-send DSP HFI queue after SSR net: qrtr: Use radix_tree_iter_delete net: qrtr: avoid calling node lookup from rx worker net: qrtr: Use lock while looking up tx flow msm: kgsl: Add support for gpu busy multiplier ANDROID: arch: arm64: vdso: export the symbols for time() ANDROID: dm-bow: Add block_size option aarch64: ABI: Update the QCOM whitelist ANDROID: GKI: remove squashfs-needed symbols from exported abi sched/tracing: Print task status in sched_migrate_task ANDROID: GKI: remove erofs symbols from exported abi ANDROID: GKI: enable CONFIG_EROFS_FS=y ANDROID: scs: fix recursive spinlock in scs_check_usage clk: qcom: videocc: Update frequency table of video_cc_mvs0_clk_src scsi: ufs-qcom: Dump bus test and PHY registers only if sleep is allowed scsi: ufs: add checks before setting clk-gating states sched: Improve the scheduler ion: Derive CMA buffer struct page without using priv_virt mm: protect SPF handler against anon_vma changes mm: protect mremap() against SPF hanlder mm: protect VMA modifications using VMA sequence count mm: VMA sequence count mm: introduce INIT_VMA() mm: make pte_unmap_same compatible with SPF mm: introduce pte_spinlock for FAULT_FLAG_SPECULATIVE mm: prepare for FAULT_FLAG_SPECULATIVE mm: introduce CONFIG_SPECULATIVE_PAGE_FAULT dt-bindings: clock: Add support for GPUCC PLL0 ANDROID: GKI: Enable SYS_HYPERVISOR f2fs: attach IO flags to the missing cases f2fs: add node_io_flag for bio flags likewise data_io_flag f2fs: remove unused parameter of f2fs_put_rpages_mapping() f2fs: handle readonly filesystem in f2fs_ioc_shutdown() f2fs: avoid utf8_strncasecmp() with unstable name f2fs: don't return vmalloc() memory from f2fs_kmalloc() ANDROID: GKI: set CONFIG_BLK_DEV_LOOP_MIN_COUNT to 16 soc: qcom: mem-buf: Improve modularity of certain functions soc: qcom: mem-buf: Add tracepoints and augment logging mmc: Kconfig: Change MMC_SDHCI_MSM to be static module ANDROID: Incremental fs: Remove dependency on PKCS7_MESSAGE_PARSER ANDROID: Incremental fs: Cache successful hash calculations arm64: defconfig: Enable SMCInvoke for GKI based config arm: mm: Fix compilation error when IOMMU is disabled ANDROID: Incremental fs: Fix four error-path bugs interconnect: qcom: Add check to return status of clk_bulk_prepare_enable drivers: soc: qcom: update sct table for LLCC on lahaina interconnect: qcom: Fix the link error on 32bit architecture RTIC: Move selinux_state to a separate 4k power: supply: qcom: Add snapshot of SMB5 charger driver defconfig: Update initial defconfig fragments for Holi input: qcom-hv-haptics: update drive waveform data format input: qcom-hv-haptics: detect 5V variant and update gain setting msm: adsprpc: Check size with length passed by client power: supply: Add snapshot of QPNP QG driver and its dependencies ANDROID: GKI: mm: add struct vm_fault fields for SPECULATIVE_PAGE_FAULTS dcc_v2: Add dcc region to minidump table soc: qcom: mem-offline: Restore page table mappings properly in online path msm: adsprpc: ignoring error messages for duplicate RPC respond packets Linux 5.4.45 net: smsc911x: Fix runtime PM imbalance on error selftests: mlxsw: qos_mc_aware: Specify arping timeout as an integer net: ethernet: stmmac: Enable interface clocks on probe for IPQ806x net/ethernet/freescale: rework quiesce/activate for ucc_geth null_blk: return error for invalid zone size s390/mm: fix set_huge_pte_at() for empty ptes drm/edid: Add Oculus Rift S to non-desktop list net: bmac: Fix read of MAC address from ROM x86/mmiotrace: Use cpumask_available() for cpumask_var_t variables io_uring: initialize ctx->sqo_wait earlier i2c: altera: Fix race between xfer_msg and isr thread scsi: pm: Balance pm_only counter of request queue during system resume evm: Fix RCU list related warnings ARC: [plat-eznps]: Restrict to CONFIG_ISA_ARCOMPACT ARC: Fix ICCM & DCCM runtime size checks RDMA/qedr: Fix synchronization methods and memory leaks in qedr RDMA/qedr: Fix qpids xarray api used s390/ftrace: save traced function caller ASoC: intel - fix the card names spi: dw: use "smp_mb()" to avoid sending spi data error powerpc/xmon: Restrict when kernel is locked down powerpc/powernv: Avoid re-registration of imc debugfs directory scsi: hisi_sas: Check sas_port before using it drm/i915: fix port checks for MST support on gen >= 11 airo: Fix read overflows sending packets net: dsa: mt7530: set CPU port to fallback mode scsi: ufs: Release clock if DMA map fails media: staging: ipu3-imgu: Move alignment attribute to field media: Revert "staging: imgu: Address a compiler warning on alignment" mmc: fix compilation of user API kernel/relay.c: handle alloc_percpu returning NULL in relay_open mt76: mt76x02u: Add support for newer versions of the XBox One wifi adapter p54usb: add AirVasT USB stick device-id HID: i2c-hid: add Schneider SCL142ALM to descriptor override HID: multitouch: enable multi-input as a quirk for some devices HID: sony: Fix for broken buttons on DS3 USB dongles mm: Fix mremap not considering huge pmd devmap Revert "cgroup: Add memory barriers to plug cgroup_rstat_updated() race window" clk: qcom: alpha-pll: Add odd/even support for Trion PLL soc: qcom: smd-rpm: Support new clocks resources dt-bindings: clock: Update the SMD-RPM clock ID msm: kgsl: Make GPU core initialization consistent across the list aarch64: ABI: Update the QCOM whitelist tracing: Remove unnecessary DEBUG_FS dependency usb: dwc3: debugfs: Add LPM check for ep_info_register net: qrtr: Handle error from skb_put_padto msm:adsprpc: Fix 32 bit error in capability API scsi: Block reset attempts to UFS through scsi ioctl soc: qcom: qti_battery_debug: Add NULL check iommu: arm-smmu: Add support for new attributes soc: qcom: mem-buf: Fix error handling when releasing memory haven: dbl: Fix use-after-free in tx/rx unregister soc: qcom: mem-buf: Do not free memory if hyp_assign() fails soc: qcom: mem-buf: Align allocation sizes to MHP subsection size defconfig: lahaina: Enable AMOLED ECM driver haven: irq: Support lending from other domains include: linux: remove unused APIs when CORESIGHT is disabled cpuidle: lpm_levels: Wakeup biased cpu config: Enable TOS and DSCP target support msm: synx: default user callback fix taskstats: handle NULL nla case in taskstats2 taskstats: add support for system stats taskstats: add a option to send all tasks data to user mm: skip rss check on MM_UNRECLAIMABLE ion: add ion pages to NR_UNRECLAIMABLE_PAGES mm: introduce NR_UNRECLAIMABLE_PAGES mm: add rss counter for unreclaimable pages mm/madvise: pass task and mm to do_madvise mm: check that mm is still valid in madvise() mm: make do_madvise() available internally clk: qcom: clk-rcg2: Add support to print rcg's CMD_DFSR register clk: qcom: clk-alpha-pll: Add support to print PLL SSC registers dwc3-msm: Add support to vote USB FORCE_MEM_CORE_ON mhi: core: Trigger host resume if client requests device vote usb: phy: Reset and initialize HSPHY in host mode when EUD is enable dwc3-msm: Move override usb speed functionality outside edev check f2fs: fix retry logic in f2fs_write_cache_pages() sched: Compile cpu_isolated_mask in SCHED_WALT only arm64: configs: Disable DCC console for Lahaina defconfig: arm64: Enable Global clock controller for HOLI Revert "defconfig: holi: Add support for Global clock controller" clk: qcom: gcc-lahaina: Add USB force_mem_core_on clocks dt-bindings: clock: Add USB FORCE_MEM_CORE_ON bindings ANDROID: GKI: Enable SYS_HYPERVISOR arm64: defconfig: change VA bits to 39 from 48 kernel: sound: update codec options with block size ANDROID: Update ABI representation radio: RTC6226: implement file read for rtc6226 driver leds: qti-flash: Do not enable flash without the timeout ANDROID: GKI: disable CONFIG_I2C_CHARDEV hwmon: Add QTI AMOLED ECM driver abi: Update qcom whitelist for cnss and netif cpuidle: lpm-levels: Track and predict next rescheduling ipi uapi: sound: add support for TTP render mode msm: ADSPRPC: Fix to avoid race condition and use after free msm: camera: Add camera dt binding definitions sched/walt: Consolidate WALT parameters sched/walt: Create WALT specific datatype sched/walt: Cleanup cpu_util_freq msm: cvp: poll on cvp lpi status during power down msm: kgsl: Disable UCHE dual command queue mmc: sdhci_msm: keep a reference to the sdhc host instance cnss2: Allow WLAN driver register after cold boot calibration bluetooth: Vote VREG_L7E_2P8 from BT driver usb: dwc3: gsi: Disable GSI wrapper on clearing run_stop qseecom: Enable APIs only when module is enabled clk: qcom: lahaina: Add pll test ctl regs ANDROID: GKI: remove netfilter apis from supported symbols sched: Improve the scheduler sched: Improve the scheduler Linux 5.4.44 perf: Make perf able to build with latest libbfd netfilter: nf_conntrack_pptp: fix compilation warning with W=1 build netfilter: conntrack: Pass value of ctinfo to __nf_conntrack_update netfilter: conntrack: comparison of unsigned in cthelper confirmation bonding: Fix reference count leak in bond_sysfs_slave_add. net: dsa: declare lockless TX feature for slave ports ipv4: nexthop version of fib_info_nh_uses_dev nexthop: Expand nexthop_is_multipath in a few places nexthops: don't modify published nexthop groups nexthops: Move code from remove_nexthop_from_groups to remove_nh_grp_entry crypto: chelsio/chtls: properly set tp->lsndtime qlcnic: fix missing release in qlcnic_83xx_interrupt_test. xsk: Add overflow check for u64 division, stored into u32 ieee80211: Fix incorrect mask for default PE duration bnxt_en: Fix accumulation of bp->net_stats_prev. esp6: get the right proto for transport mode in esp6_gso_encap netfilter: nf_conntrack_pptp: prevent buffer overflows in debug code netfilter: nfnetlink_cthelper: unbreak userspace helper support netfilter: conntrack: make conntrack userspace helpers work again netfilter: ipset: Fix subcounter update skip netfilter: nft_reject_bridge: enable reject with bridge vlan ip_vti: receive ipip packet by calling ip_tunnel_rcv xfrm: fix error in comment xfrm: fix a NULL-ptr deref in xfrm_local_error xfrm: fix a warning in xfrm_policy_insert_list xfrm interface: fix oops when deleting a x-netns interface xfrm: call xfrm_output_gso when inner_protocol is set in xfrm_output xfrm: remove the xfrm_state_put call becofe going to out_reset xfrm: do pskb_pull properly in __xfrm_transport_prep xfrm: allow to accept packets with ipv6 NEXTHDR_HOP in xfrm_input copy_xstate_to_kernel(): don't leave parts of destination uninitialized x86/dma: Fix max PFN arithmetic overflow on 32 bit systems mac80211: mesh: fix discovery timer re-arming issue / crash x86/syscalls: Revert "x86/syscalls: Make __X32_SYSCALL_BIT be unsigned long" cfg80211: fix debugfs rename crash parisc: Fix kernel panic in mem_init() iommu: Fix reference count leak in iommu_group_alloc. gpio: fix locking open drain IRQ lines Revert "block: end bio with BLK_STS_AGAIN in case of non-mq devs and REQ_NOWAIT" include/asm-generic/topology.h: guard cpumask_of_node() macro argument fs/binfmt_elf.c: allocate initialized memory in fill_thread_core_info() mm: remove VM_BUG_ON(PageSlab()) from page_mapcount() mm,thp: stop leaking unreleased file pages IB/ipoib: Fix double free of skb in case of multicast traffic in CM mode drm/amd/display: drop cursor position check in atomic test RDMA/core: Fix double destruction of uobject ceph: flush release queue when handling caps for unknown inode libceph: ignore pool overlay and cache logic on redirects ALSA: hda/realtek - Add new codec supported for ALC287 ALSA: usb-audio: Quirks for Gigabyte TRX40 Aorus Master onboard audio clk: qcom: gcc: Fix parent for gpll0_out_even exec: Always set cap_ambient in cap_bprm_set_creds ALSA: usb-audio: mixer: volume quirk for ESS Technology Asus USB DAC ALSA: hda/realtek - Add a model for Thinkpad T570 without DAC workaround ALSA: hwdep: fix a left shifting 1 by 31 UB bug RDMA/pvrdma: Fix missing pci disable in pvrdma_pci_probe() gpio: bcm-kona: Fix return value of bcm_kona_gpio_probe() gpio: pxa: Fix return value of pxa_gpio_probe() mmc: block: Fix use-after-free issue for rpmb ARM: dts: bcm: HR2: Fix PPI interrupt types ARM: dts: bcm2835-rpi-zero-w: Fix led polarity ARM: dts/imx6q-bx50v3: Set display interface clock parents IB/qib: Call kobject_put() when kobject_init_and_add() fails gpu/drm: Ingenic: Fix opaque pointer casted to wrong type soc: mediatek: cmdq: return send msg error code arm64: dts: mt8173: fix vcodec-enc clock gpio: exar: Fix bad handling for ida_simple_get error path ARM: uaccess: fix DACR mismatch with nested exceptions ARM: uaccess: integrate uaccess_save and uaccess_restore ARM: uaccess: consolidate uaccess asm to asm/uaccess-asm.h ARM: 8970/1: decompressor: increase tag size Input: synaptics-rmi4 - fix error return code in rmi_driver_probe() Input: synaptics-rmi4 - really fix attn_data use-after-free Input: i8042 - add ThinkPad S230u to i8042 reset list Input: dlink-dir685-touchkeys - fix a typo in driver name Input: xpad - add custom init packet for Xbox One S controllers Input: evdev - call input_flush_device() on release(), not flush() Input: usbtouchscreen - add support for BonXeon TP drivers: net: hamradio: Fix suspicious RCU usage warning in bpqether.c samples: bpf: Fix build error csky: Fixup raw_copy_from_user() cifs: Fix null pointer check in cifs_read hwmon: (nct7904) Fix incorrect range of temperature limit registers csky: Fixup remove duplicate irq_disable csky: Fixup perf callchain unwind csky: Fixup msa highest 3 bits mask clk: ti: am33xx: fix RTC clock parent riscv: stacktrace: Fix undefined reference to `walk_stackframe' IB/i40iw: Remove bogus call to netdev_master_upper_dev_get() net: freescale: select CONFIG_FIXED_PHY where needed usb: gadget: legacy: fix redundant initialization warnings usb: phy: twl6030-usb: Fix a resource leak in an error handling path in 'twl6030_usb_probe()' usb: dwc3: pci: Enable extcon driver for Intel Merrifield cachefiles: Fix race between read_waiter and read_copier involving op->to_do drm/amdgpu: Use GEM obj reference for KFD BOs drm/amd/powerplay: perform PG ungate prior to CG ungate drm/amdgpu: drop unnecessary cancel_delayed_work_sync on PG ungate gfs2: Grab glock reference sooner in gfs2_add_revoke gfs2: move privileged user check to gfs2_quota_lock_check net: microchip: encx24j600: add missed kthread_stop ALSA: usb-audio: add mapping for ASRock TRX40 Creator gpio: tegra: mask GPIO IRQs during IRQ shutdown ARM: dts: rockchip: fix pinctrl sub nodename for spi in rk322x.dtsi ARM: dts: rockchip: swap clock-names of gpu nodes arm64: dts: rockchip: swap interrupts interrupt-names rk3399 gpu node arm64: dts: rockchip: fix status for &gmac2phy in rk3328-evb.dts ARM: dts: rockchip: fix phy nodename for rk3229-xms6 ARM: dts: rockchip: fix phy nodename for rk3228-evb mlxsw: spectrum: Fix use-after-free of split/unsplit/type_set in case reload fails net/mlx4_core: fix a memory leak bug. net: sun: fix missing release regions in cas_init_one(). net/tls: free record only on encryption error net/tls: fix encryption error checking net/mlx5: Annotate mutex destroy for root ns net/mlx5: Fix error flow in case of function_setup failure net/mlx5e: Update netdev txq on completions during closure net/mlx5: Fix memory leak in mlx5_events_init net/mlx5e: Fix inner tirs handling net/mlx5e: kTLS, Destroy key object after destroying the TIS tipc: block BH before using dst_cache sctp: Start shutdown on association restart if in SHUTDOWN-SENT state and socket is closed sctp: Don't add the shutdown timer if its already been added r8152: support additional Microsoft Surface Ethernet Adapter variant nexthop: Fix attribute checking for groups net/tls: fix race condition causing kernel panic net sched: fix reporting the first-time use timestamp net: revert "net: get rid of an signed integer overflow in ip_idents_reserve()" net: qrtr: Fix passing invalid reference to qrtr_local_enqueue() net: nlmsg_cancel() if put fails for nhmsg net: mvpp2: fix RX hashing for non-10G ports net/mlx5: Add command entry handling completion net: ipip: fix wrong address family in init error path net: inet_csk: Fix so_reuseport bind-address cache in tb->fast* __netif_receive_skb_core: pass skb by reference net: ethernet: ti: cpsw: fix ASSERT_RTNL() warning during suspend net: dsa: mt7530: fix roaming from DSA user ports net: don't return invalid table id error when we fall back to PF_UNSPEC dpaa_eth: fix usage as DSA master, try 3 ax25: fix setsockopt(SO_BINDTODEVICE) proc: update perms of node "reclaim" add documentation about reclaim knob on proc.txt mm: Support address range reclaim mm: Enhance per process reclaim to consider shared pages mhi: core: Read transfer length from an event properly clk: qcom: Add API to query corner voltage on given clk frequency mhi: core: Fix out of bound channel id handling dwc3: gadget: Don't block doorbell before halting USB controller ANDROID: GKI: enable CONFIG_USB_DUMMY_HCD haven: touch: add touch notify tag for memory sharing haven: touch: add IRQ label for trusted touch drivers: soc: qcom: handle system sleep activities drivers: irqchip: Add support to make mpm as module drivers: irqchip: mpm: Add QTI SoC interrupt controller defconfig: Enable RPM_SMD driver for Holi config: Enable TOS and DSCP target support FROMGIT: USB: dummy-hcd: use configurable endpoint naming scheme soc: qcom: dcc: avoid memory access violation ANDROID: GKI: enable a bunch of HID config options =y UPSTREAM: usb: raw-gadget: fix null-ptr-deref when reenabling endpoints UPSTREAM: usb: raw-gadget: documentation updates UPSTREAM: usb: raw-gadget: support stalling/halting/wedging endpoints UPSTREAM: usb: raw-gadget: fix gadget endpoint selection UPSTREAM: usb: raw-gadget: improve uapi headers comments UPSTREAM: usb: raw-gadget: fix return value of ep read ioctls UPSTREAM: usb: raw-gadget: fix raw_event_queue_fetch locking UPSTREAM: usb: raw-gadget: Fix copy_to/from_user() checks qbt: Add support for touch events from input framework radio: RTC6226: remove the V4L2_CAP_DEVICE_CAPS cap as device_caps cpufreq: qcom: Set the register for GT Limits Management interrupt aarch64: ABI: Update abi snapshot for enabling CFI in enforcement mode msm: adsprpc: use persistent header buffers msm: cvp: Support new HFI FLUSH MSG value msm: kgsl: Fix gpu boot ab vote ANDROID: GKI: update abi definitions after enabling PCIEPORTBUS Revert "ANDROID: gki_defconfig: Drop CONFIG_PCIEPORTBUS" tty: hvc_console, fix crashes on parallel open/close msm: adsprpc: Fix error code for invalid ioctl defconfig: lahaina: Enable linux bridge Revert "usb: dwc3: gadget: Enable SUSPEND event after CONNECT DONE" block, bfq: fix use-after-free in bfq_idle_slice_timer_body msm: cvp: Fix a CVP SSR deadlock f2fs: fix wrong discard space f2fs: compress: don't compress any datas after cp stop f2fs: remove unneeded return value of __insert_discard_tree() f2fs: fix wrong value of tracepoint parameter f2fs: protect new segment allocation in expand_inode_data f2fs: code cleanup by removing ifdef macro surrounding writeback: Avoid skipping inode writeback clk: qcom: clk-rcg2: Fix possible dereference of clk parent for dfs clocks i2c: i2c-msm-geni: Do I2C configurations during resume clk: qcom: clk-debug: Fix possible NULL dereference in _mux_get_parent clk: qcom: gdsc-regulator: Fix using uninitialized variable ANDROID: net: bpf: permit redirect from ingress L3 to egress L2 devices at near max mtu msm: kgsl: Add GPU_RBBM_GBIF_CLIENT_QOS_CNTL to powerup register list Revert "ALSA: PCM: User control API implementation" msm: ipa: Add support to notify wan upstream iface info arm64: defconfig: Reduce default CMA pool from to 8 MB for trusted VM cnss2: Save PCIe GEN speed and width changed from device cnss2: Add support for bus bandwidth scale msm: kgsl: Do not program CP_LPAC_ROQ_THRESHOLDS registers soc: qcom: mem-buf: Fix compilation errors when hotplug is disabled mm/memory_hotplug: Rate limit page migration warnings pwm: qti-lpg: Read tick duration via device tree mhi: core: expose soc reset and register dump debugfs entries scripts: gki: Add generic configuration options for defconfig ANDROID: GKI: update abi definitions now that sdcardfs is gone Revert "ANDROID: sdcardfs: Enable modular sdcardfs" ANDROID: remove sdcardfs-needed exports from whitelist Revert "ANDROID: vfs: Add setattr2 for filesystems with per mount permissions" Revert "ANDROID: vfs: Add permission2 for filesystems with per mount permissions" Revert "ANDROID: vfs: add d_canonical_path for stacked filesystem support" Revert "ANDROID: fs: Restore vfs_path_lookup() export" ANDROID: sdcardfs: remove sdcardfs from system ion: Use kthread_run for ion heap pool kworker threads PM / devfreq: icc: add support for L3 BW devices arm64: defconfig: Add support for Global clock controller for SHIMA dwc3-msm: Force USB speed as high speed if SS release lane is called memory_dump: resolve the issue of configuring core_reg_numer mhi: core: Do a null pointer check before reading debug registers regulator: core: avoid deadlock in QTI addition to regulator_unregister() FROMGIT: driver core: Update device link status correctly for SYNC_STATE_ONLY links UPSTREAM: driver core: Fix handling of SYNC_STATE_ONLY + STATELESS device links UPSTREAM: driver core: Fix SYNC_STATE_ONLY device link implementation net: qrtr: Allocate workqueue before kernel_bind pwm: qti-lpg: Adapt to two-nvmem PBS triggering scheme soc: qcom: spcom: add channel name for each txn_id print NFC: Add support for LDO voting mhi: core: Enable both time synchronization methods to co-exist mhi: core: improve time synchronization events handling mhi: core: block fast suspends on controller device bus vote pwm: qti-lpg: Support two-nvmem PPG scheme scsi: ufs: Don't update urgent bkops level when toggle auto bkops input: qcom-hv-haptics: adjust T_LRA for auto RC CLK calibration case coresight: etm4x: Fix use-after-free of per-cpu etm drvdata PM / devfreq: memlat: increase ratio_ceil limit uapi: Fix QCOM headers to work with UAPI_HEADER_TEST Revert "ANDROID: Incremental fs: Avoid continually recalculating hashes" .gitignore: Ignore vendor devicetree directories from git aarch64: ABI: add symbols to qcom whitelist msm: kgsl: Add BICUBIC registers to power up register list ANDROID: remove unused variable scsi: ufshcd: Move to ufshcd core scsi: ufshcd: Turn-off Vdd-hba during suspend scsi: ufshcd: Add a wmb before sending uic cmd scsi: ufs: remove unnecessary memset bluetooth: add support for retrieving power resource values arm64: defconfig: Enable config to add QTI specific code cnss2: Set no_d3hot flag to avoid PCIe framework saving config space msm: kgsl: 'qcom,kgsl-3d0' device does not need to get regulators Linux 5.4.43 sched/fair: Fix enqueue_task_fair() warning some more sched/fair: Fix reordering of enqueue/dequeue_task_fair() sched/fair: Reorder enqueue/dequeue_task_fair path tpm: check event log version before reading final events rxrpc: Fix ack discard rxrpc: Trace discarded ACKs iio: adc: stm32-dfsdm: fix device used to request dma iio: adc: stm32-dfsdm: Use dma_request_chan() instead dma_request_slave_channel() iio: adc: stm32-adc: fix device used to request dma iio: adc: stm32-adc: Use dma_request_chan() instead dma_request_slave_channel() x86/unwind/orc: Fix unwind_get_return_address_ptr() for inactive tasks flow_dissector: Drop BPF flow dissector prog ref on netns cleanup s390/kexec_file: fix initrd location for kdump kernel rxrpc: Fix a memory leak in rxkad_verify_response() rxrpc: Fix the excessive initial retransmission timeout kasan: disable branch tracing for core runtime rapidio: fix an error in get_user_pages_fast() error handling device-dax: don't leak kernel memory to user space after unloading kmem s390/kaslr: add support for R_390_JMP_SLOT relocation type s390/pci: Fix s390_mmio_read/write with MIO ipack: tpci200: fix error return code in tpci200_register() mei: release me_cl object reference tty: serial: add missing spin_lock_init for SiFive serial console misc: rtsx: Add short delay after exit from ASPM iio: adc: ti-ads8344: Fix channel selection iio: dac: vf610: Fix an error handling path in 'vf610_dac_probe()' iio: sca3000: Remove an erroneous 'get_device()' staging: greybus: Fix uninitialized scalar variable staging: kpc2000: fix error return code in kp2000_pcie_probe() staging: iio: ad2s1210: Fix SPI reading media: fdp1: Fix R-Car M3-N naming in debug message Revert "gfs2: Don't demote a glock until its revokes are written" kbuild: Remove debug info from kallsyms linking bpf: Avoid setting bpf insns pages read-only when prog is jited powerpc/64s: Disable STRICT_KERNEL_RWX powerpc: Remove STRICT_KERNEL_RWX incompatibility with RELOCATABLE drm/i915: Propagate error from completed fences drm/i915/gvt: Init DPLL/DDI vreg for virtual display instead of inheritance. vsprintf: don't obfuscate NULL and error pointers dmaengine: owl: Use correct lock in owl_dma_get_pchan() dmaengine: dmatest: Restore default for channel drm/etnaviv: Fix a leak in submit_pin_objects() dmaengine: tegra210-adma: Fix an error handling path in 'tegra_adma_probe()' apparmor: Fix aa_label refcnt leak in policy_update apparmor: fix potential label refcnt leak in aa_change_profile apparmor: Fix use-after-free in aa_audit_rule_init drm/etnaviv: fix perfmon domain interation arm64: Fix PTRACE_SYSEMU semantics scsi: target: Put lun_ref at end of tmr processing scsi: qla2xxx: Do not log message when reading port speed via sysfs ALSA: hda/realtek - Add more fixup entries for Clevo machines ALSA: hda/realtek - Fix silent output on Gigabyte X570 Aorus Xtreme ALSA: pcm: fix incorrect hw_base increase ALSA: iec1712: Initialize STDSP24 properly when using the model=staudio option KVM: x86: Fix pkru save/restore when guest CR4.PKE=0, move it to x86.c ALSA: hda/realtek: Enable headset mic of ASUS UX581LV with ALC295 ALSA: hda/realtek - Enable headset mic of ASUS UX550GE with ALC295 ALSA: hda/realtek - Enable headset mic of ASUS GL503VM with ALC295 ALSA: hda/realtek: Add quirk for Samsung Notebook ALSA: hda/realtek - Add HP new mute led supported for ALC236 ALSA: hda/realtek - Add supported new mute Led for HP ALSA: hda: Manage concurrent reg access more properly ALSA: hda: patch_realtek: fix empty macro usage in if block ALSA: hda - constify and cleanup static NodeID tables scripts/gdb: repair rb_first() and rb_last() ARM: futex: Address build warning KVM: selftests: Fix build for evmcs.h drm/amd/display: Prevent dpcd reads with passive dongles iommu/amd: Call domain_flush_complete() in update_domain() platform/x86: asus-nb-wmi: Do not load on Asus T100TA and T200TA USB: core: Fix misleading driver bug report stmmac: fix pointer check after utilization in stmmac_interrupt ceph: fix double unlock in handle_cap_export() HID: quirks: Add HID_QUIRK_NO_INIT_REPORTS quirk for Dell K12A keyboard-dock gtp: set NLM_F_MULTI flag in gtp_genl_dump_pdp() x86/apic: Move TSC deadline timer debug printk ftrace/selftest: make unresolved cases cause failure if --fail-unresolved set ibmvnic: Skip fatal error reset after passive init x86/mm/cpa: Flush direct map alias during cpa HID: i2c-hid: reset Synaptics SYNA2393 on resume scsi: ibmvscsi: Fix WARN_ON during event pool release net/ena: Fix build warning in ena_xdp_set() component: Silence bind error on -EPROBE_DEFER aquantia: Fix the media type of AQC100 ethernet controller in the driver vhost/vsock: fix packet delivery order to monitoring devices configfs: fix config_item refcnt leak in configfs_rmdir() scsi: qla2xxx: Delete all sessions before unregister local nvme port scsi: qla2xxx: Fix hang when issuing nvme disconnect-all in NPIV HID: alps: ALPS_1657 is too specific; use U1_UNICORN_LEGACY instead HID: alps: Add AUI1657 device ID HID: multitouch: add eGalaxTouch P80H84 support gcc-common.h: Update for GCC 10 net: drop_monitor: use IS_REACHABLE() to guard net_dm_hw_report() kbuild: avoid concurrency issue in parallel building dtbs and dtbs_check mtd: Fix mtd not registered due to nvmem name collision afs: Don't unlock fetched data pages until the op completes successfully ubi: Fix seq_file usage in detailed_erase_block_info debugfs file i2c: mux: demux-pinctrl: Fix an error handling path in 'i2c_demux_pinctrl_probe()' evm: Fix a small race in init_desc() iommu/amd: Fix over-read of ACPI UID from IVRS table i2c: fix missing pm_runtime_put_sync in i2c_device_probe ubifs: remove broken lazytime support fix multiplication overflow in copy_fdtable() mtd: spinand: Propagate ECC information to the MTD structure ACPI: EC: PM: Avoid flushing EC work when EC GPE is inactive ubifs: fix wrong use of crypto_shash_descsize() ima: Fix return value of ima_write_policy() evm: Check also if *tfm is an error pointer in init_desc() ima: Set file->f_mode instead of file->f_flags in ima_calc_file_hash() KVM: SVM: Fix potential memory leak in svm_cpu_init() i2c: dev: Fix the race between the release of i2c_dev and cdev Kconfig: Add menu choice option to reclaim virtual memory dma-mapping: add i/o coherency support for 32bit soc: qcom: Add VTCM handling to cdsprm driver Revert "arm: dma: Allow CMA pages to not have a kernel mapping" msm: cvp: stop session queue when session closed usb: dwc3: gadget: Avoid spuriously printing NO_PULLUP in log usb: dwc3: gadget: Rate limit ep_queue() error message defconfig: holi: Enable GPU driver pci: framework: disable auto suspend link NFC: Enable NFC driver in the GKI build ANDROID: scsi: ufs: Handle clocks when lrbp fails net: qrtr: Ignore ENODEV failures in ns net: qrtr: Add pr_fmt to ns soc: qcom: socinfo: Add LAHAINAP's soc-id clk: qcom: clk-alpha-pll: Add support for Lucid EVO PLL print registers clk: qcom: clk-alpha-pll: Add support for fixed Lucid EVO PLL msm: adsprpc: Fix NULL pointer error when DEBUG_FS is disabled ANDROID: ABI/Whitelist: add erofs whitelist to unisoc whitelist msm: rdbg: Add snapshot of remote debugger driver aarch64: ABI: Remove slim_* APIs from whitelist msm: adsprpc: remove exsessive logging in context_free arm: dma: Allow CMA pages to not have a kernel mapping arm: dma-mapping: map_page map to nearest page arm: dma-mapping: fix data types to hold size_t arm: dma-mapping: DMA buf may not have cpu virtual addr arm: make default iova alignment as 2mb arm: provision page alloc debug support arm: mm: program ptes for access restriction arm: dma-mapping: handle IOVA address zero arm: dma-mapping: map sg lists into the SMMU as virtually contiguous arm: dma: Expand the page protection attributes arm: keep address range pmd aligned while remap arm: mm: consider only lowmem regions while remap arm: mm: fix pte allocation with CONFIG_FORCE_PAGES feature arm: Allow remapping lowmem as 4K pages arm: dma-mapping: add dma mapper for io-pgtable-fast for 32 bit arm: dma_mapping: Support for DOMAIN_ATTR_S1_BYPASS attribute arm: dma-mapping: Use default iommu domain msm: synx: support for external dma fence input: touchscreen: st: fix security issue f2fs: avoid inifinite loop to wait for flushing node pages at cp_error soc: qcom: spss_utils: fix driver module remove soc: qcom: spcom: pr_fmt to print function name clk: qcom: camcc: Add support for CAMCC clock driver for SHIMA dt-bindings: clock: Update clock ids and BCRs of CAMCC and GPUCC for SHIMA net: qrtr: Fix FIXME related to qrtr_ns_init() net: qrtr: Fix error pointer vs NULL bugs net: qrtr: Respond to HELLO message net: qrtr: fix spelling mistake "serivce" -> "service" net: qrtr: Migrate nameservice to kernel from userspace aarch64: ABI: Update the ABI whitelist with kernel_bind mmc: Enable SD card clock scaling soc: qcom: mem-buf: Limit the number of input ACL entries soc: qcom: mem-buf: Fix message queue registration check soc: qcom: mem-buf: Configure the mem-buf device's DMA mask msm: cvp: handles dsp error more reliably haven: Fix compilation error when DEBUG_FS is disabled ANDROID: GKI: Update abi for 5.4.42 update usb: dwc3: debugfs: Add support for 64bit division on 32bit chipsets UPSTREAM: serial: samsung: 32-bit access for TX/RX hold registers BACKPORT: serial: samsung: dt-bindings: Add reg-io-width compatible UPSTREAM: serial: samsung: Replace rd_regb/wr_regb with rd_reg/wr_reg coresight: tmc: set buffer size to 32MB on SW USB mode coresight: etm4x: call cpus_read_unlock in error exit msm: kgsl: Add support for A619 GPU variant usb: phy: qmp: Call chain notifier for cable connect/disconnect usb: dwc3: gadget: Give back staled requests trace: msm_low_power: update text description input: qcom-hv-haptics: check FIFO fill status before stopping play input: qcom-hv-haptics: Add debugfs files for more brake settings input: qcom-hv-haptics: Add LRA frequency calibration interfaces soc: qti_battery_debug: Remove CONFIG_DEBUG_FS dependency scsi: ufshcd-qti: Invoke sysfs node creation scsi: ufs: Resume ufs host before accessing ufs device Makefile: Add a check of CONFIG_TRIM_UNUSED_KSYMS before remaking vmlinux ANDROID: fscrypt: handle direct I/O with IV_INO_LBLK_32 BACKPORT: FROMLIST: fscrypt: add support for IV_INO_LBLK_32 policies msm: cvp: Treat DME stream corrupt as warning thermal: core: Add appropriate error checks soc: qcom: pil: allow subsystem to allocate extra memory iommu/arm-smmu: add qcom smmuv2 support clk: qcom: gcc-shima: Add support for ref clocks dt-bindings: clock: Add clock ids of ref clocks in GCC for SHIMA thermal: adc-tm: Ensure valid match data is obtained dwc3: Remove check for HWO flag in dwc3_gadget_ep_reclaim_trb_sg() usb: dwc3: gadget: Wrap around when skip TRBs usb: dwc3: gadget: Don't clear flags before transfer ended mmc: sdhci-msm: Ensure SD card power isn't ON when card removed mhi: core: improve bandwidth switch events processing build.config.common: Revert the compiler back to clang-r370808 cnss2: Assert if unexpected second QMI server arrive comes drivers: rpm-smd: Add support to make rpm-smd as module PM / devfreq: bw_hwmon: remove unused variable PM / devfreq: bw_hwmon: add bw_hwmon_debug event msm: kgsl: Add kobject sysfs ops for the /sys/kernel/gpu directory msm: adsprpc: Print and return appropriate error codes Linux 5.4.42 bpf: Test_progs, fix test_get_stack_rawtp_err.c build selftest/bpf: fix backported test_select_reuseport selftest changes libbpf: Extract and generalize CPU mask parsing logic Makefile: disallow data races on gcc-10 as well KVM: x86: Fix off-by-one error in kvm_vcpu_ioctl_x86_setup_mce bpf: Fix sk_psock refcnt leak when receiving message SUNRPC: Revert241b1f419f
("SUNRPC: Remove xdr_buf_trim()") ARM: dts: r8a7740: Add missing extal2 to CPG node arm64: dts: renesas: r8a77980: Fix IPMMU VIP[01] nodes ARM: dts: r8a73a4: Add missing CMT1 interrupts arm64: dts: imx8mn: Change SDMA1 ahb clock for imx8mn arm64: dts: rockchip: Rename dwc3 device nodes on rk3399 to make dtc happy arm64: dts: rockchip: Replace RK805 PMIC node name with "pmic" on rk3328 boards arm64: dts: meson-g12-common: fix dwc2 clock names arm64: dts: meson-g12b-khadas-vim3: add missing frddr_a status property clk: Unlink clock if failed to prepare or enable Revert "ALSA: hda/realtek: Fix pop noise on ALC225" usb: gadget: legacy: fix error return code in cdc_bind() usb: gadget: legacy: fix error return code in gncm_bind() usb: gadget: audio: Fix a missing error return value in audio_bind() usb: gadget: net2272: Fix a memory leak in an error handling path in 'net2272_plat_probe()' fanotify: fix merging marks masks with FAN_ONDIR dwc3: Remove check for HWO flag in dwc3_gadget_ep_reclaim_trb_sg() clk: rockchip: fix incorrect configuration of rk3228 aclk_gpu* clocks exec: Move would_dump into flush_old_exec x86/unwind/orc: Fix error handling in __unwind_start() x86: Fix early boot crash on gcc-10, third try cifs: fix leaked reference on requeued write powerpc/32s: Fix build failure with CONFIG_PPC_KUAP_DEBUG drm/amd/display: add basic atomic check for cursor plane ARM: dts: imx6dl-yapp4: Fix Ursa board Ethernet connection ARM: dts: imx27-phytec-phycard-s-rdk: Fix the I2C1 pinctrl entries ARM: dts: dra7: Fix bus_dma_limit for PCIe Make the "Reducing compressed framebufer size" message be DRM_INFO_ONCE() usb: xhci: Fix NULL pointer dereference when enqueuing trbs from urb sg list USB: gadget: fix illegal array access in binding with UDC usb: cdns3: gadget: prev_req->trb is NULL for ep0 usb: host: xhci-plat: keep runtime active when removing host usb: core: hub: limit HUB_QUIRK_DISABLE_AUTOSUSPEND to USB5534B ALSA: usb-audio: Add control message quirk delay for Kingston HyperX headset ALSA: rawmidi: Fix racy buffer resize under concurrent accesses ALSA: hda/realtek - Add COEF workaround for ASUS ZenBook UX431DA ALSA: hda/realtek - Limit int mic boost for Thinkpad T530 USB: usbfs: fix mmap dma mismatch usb: usbfs: correct kernel->user page attribute mismatch gcc-10: avoid shadowing standard library 'free()' in crypto gcc-10: mark more functions __init to avoid section mismatch warnings gcc-10 warnings: fix low-hanging fruit gcc-10: disable 'restrict' warning for now gcc-10: disable 'stringop-overflow' warning for now gcc-10: disable 'array-bounds' warning for now gcc-10: disable 'zero-length-bounds' warning for now Stop the ad-hoc games with -Wno-maybe-initialized net/rds: Use ERR_PTR for rds_message_alloc_sgs() pnp: Use list_for_each_entry() instead of open coding NFSv3: fix rpc receive buffer size for MOUNT call mm, memcg: fix inconsistent oom event behavior s390/ism: fix error return code in ism_probe() hwmon: (da9052) Synchronize access with mfd RDMA/iw_cxgb4: Fix incorrect function parameters RDMA/core: Fix double put of resource IB/core: Fix potential NULL pointer dereference in pkey cache IB/mlx4: Test return value of calls to ib_get_cached_pkey RDMA/rxe: Always return ERR_PTR from rxe_create_mmap_info() netfilter: nft_set_rbtree: Add missing expired checks netfilter: nft_set_rbtree: Introduce and use nft_rbtree_interval_start() SUNRPC: Signalled ASYNC tasks need to exit nfs: fix NULL deference in nfs4_get_valid_delegation arm64: fix the flush_icache_range arguments in machine_kexec drm/i915/gvt: Fix kernel oops for 3-level ppgtt guest netfilter: conntrack: avoid gcc-10 zero-length-bounds warning NFSv4: Fix fscache cookie aux_data to ensure change_attr is included nfs: fscache: use timespec64 in inode auxdata NFS: Fix fscache super_cookie index_key from changing after umount drm/amdgpu: force fbdev into vram fork: prevent accidental access to clone3 features gfs2: More gfs2_find_jhead fixes mmc: block: Fix request completion in the CQE timeout path mmc: core: Fix recursive locking issue in CQE recovery path mmc: core: Check request type before completing the request mmc: sdhci-pci-gli: Fix can not access GL9750 after reboot from Windows 10 mmc: alcor: Fix a resource leak in the error path for ->probe() bpf, sockmap: bpf_tcp_ingress needs to subtract bytes from sg.size bpf, sockmap: msg_pop_data can incorrecty set an sge length drm/i915: Don't enable WaIncreaseLatencyIPCEnabled when IPC is disabled i40iw: Fix error handling in i40iw_manage_arp_cache() ALSA: firewire-lib: fix 'function sizeof not defined' error of tracepoints format bpf: Fix error return code in map_lookup_and_delete_elem() pinctrl: cherryview: Add missing spinlock usage in chv_gpio_irq_handler pinctrl: qcom: fix wrong write in update_dual_edge pinctrl: baytrail: Enable pin configuration setting for GPIO chip pinctrl: sunrisepoint: Fix PAD lock register offset for SPT-H ACPI: EC: PM: Avoid premature returns from acpi_s2idle_wake() IB/hfi1: Fix another case where pq is left on waitlist mmc: sdhci-pci-gli: Fix no irq handler from suspend gfs2: Another gfs2_walk_metadata fix ALSA: hda/realtek - Fix S3 pop noise on Dell Wyse ipc/util.c: sysvipc_find_ipc() incorrectly updates position index drm/amdgpu: invalidate L2 before SDMA IBs (v2) drm/amdgpu: simplify padding calculations (v2) drm/qxl: lost qxl_bo_kunmap_atomic_page in qxl_image_init_helper() drm/amd/display: Update downspread percent to match spreadsheet for DCN2.1 drm/amd/display: check if REFCLK_CNTL register is present drm/amd/powerplay: avoid using pm_en before it is initialized revised ALSA: hda/hdmi: fix race in monitor detection during probe cpufreq: intel_pstate: Only mention the BIOS disabling turbo mode once selftests/ftrace: Check the first record for kprobe_args_type.tc dmaengine: mmp_tdma: Reset channel error on release dmaengine: mmp_tdma: Do not ignore slave config validation errors dmaengine: pch_dma.c: Avoid data race between probe and irq handler riscv: fix vdso build with lld umh: fix memory leak on execve failure r8169: re-establish support for RTL8401 chip version nfp: abm: fix error return code in nfp_abm_vnic_alloc() net: tcp: fix rx timestamp behavior for tcp_recvmsg netprio_cgroup: Fix unlimited memory leak of v2 cgroups net: ipv4: really enforce backoff for redirects net: dsa: loop: Add module soft dependency hinic: fix a bug of ndo_stop dpaa2-eth: prevent array underflow in update_cls_rule() virtio_net: fix lockdep warning on 32 bit tcp: fix SO_RCVLOWAT hangs with fat skbs tcp: fix error recovery in tcp_zerocopy_receive() Revert "ipv6: add mtu lock check in __ip6_rt_update_pmtu" pppoe: only process PADT targeted at local interfaces net: stmmac: fix num_por initialization net: phy: fix aneg restart in phy_ethtool_set_eee netlabel: cope with NULL catmap net: fix a potential recursive NETDEV_FEAT_CHANGE dpaa2-eth: properly handle buffer size restrictions mmc: sdhci-acpi: Add SDHCI_QUIRK2_BROKEN_64_BIT_DMA for AMDI0040 selftests/bpf: fix goto cleanup label not defined scsi: sg: add sg_remove_request in sg_write net_sched: fix tcm_parent in tc filter dump sun6i: dsi: fix gcc-4.8 virtio-blk: handle block_device_operations callbacks after hot unplug drop_monitor: work around gcc-10 stringop-overflow warning ftrace/selftests: workaround cgroup RT scheduling issues net: moxa: Fix a potential double 'free_irq()' net/sonic: Fix a resource leak in an error handling path in 'jazz_sonic_probe()' SUNRPC: Fix GSS privacy computation of auth->au_ralign SUNRPC: Add "@len" parameter to gss_unwrap() gpio: pca953x: Fix pca953x_gpio_set_config KVM: arm: vgic: Synchronize the whole guest on GIC{D,R}_I{S,C}ACTIVER read net: phy: microchip_t1: add lan87xx_phy_init to initialize the lan87xx phy. shmem: fix possible deadlocks on shmlock_user_lock net: dsa: Do not make user port errors fatal crypto: msm: make qcrypto and qcedev independent of DEBUG_FS cpufreq: qcom: Update the scheduler of throttle removal net: qrtr: Remove rcu logic for port lookup/remove net: qrtr: Do not take sock lock on blocking recv Revert "SoC: soc-pcm: call pcm_new when creating new pcm" ALSA: pcm: add macro SND_PCM_ADD_VOLUME_CTL and SND_PCM_ADD_USR_CTL mm: Remove shrink_page msm: cvp: Avoids DSP memory leak cnss2: Add build type info to wlfw_cap_req_msg msm: kgsl: Add a flag for guard page allocation dwc3: gadget: Add handling of bus resume and L1 resume functionality cnss2: Assert for recovery if there is already a recovery going on dwc3: core: Add ssp u3 u0 link state related quirk leds: qti-flash: Limit off_time of switch to a maximum of 1280 ms aarch64: ABI: Update the ABI whitelist with __ioread32_copy f2fs: compress: fix zstd data corruption f2fs: add compressed/gc data read IO stat f2fs: fix potential use-after-free issue f2fs: compress: don't handle non-compressed data in workqueue f2fs: remove redundant assignment to variable err f2fs: refactor resize_fs to avoid meta updates in progress f2fs: use round_up to enhance calculation f2fs: introduce F2FS_IOC_RESERVE_COMPRESS_BLOCKS f2fs: Avoid double lock for cp_rwsem during checkpoint f2fs: report delalloc reserve as non-free in statfs for project quota f2fs: Fix wrong stub helper update_sit_info f2fs: compress: let lz4 compressor handle output buffer budget properly f2fs: remove blk_plugging in block_operations f2fs: introduce F2FS_IOC_RELEASE_COMPRESS_BLOCKS f2fs: shrink spinlock coverage f2fs: correctly fix the parent inode number during fsync() f2fs: compress: support lzo-rle compress algorithm f2fs: introduce mempool for {,de}compress intermediate page allocation f2fs: introduce f2fs_bmap_compress() f2fs: support fiemap on compressed inode f2fs: flush dirty meta pages when flushing them f2fs: support partial truncation on compressed inode f2fs: fix checkpoint=disable:%u%% f2fs: remove redundant compress inode check f2fs: use strcmp() in parse_options() f2fs: Use the correct style for SPDX License Identifier f2fs: rework filename handling f2fs: split f2fs_d_compare() from f2fs_match_name() f2fs: don't leak filename in f2fs_try_convert_inline_dir() ANDROID: clang: update to 11.0.1 FROMLIST: x86_64: fix jiffies ODR violation ANDROID: ABI/Whitelist: add ufs whitelist to unisoc whitelist aarch64: ABI: Update the ABI whitelist with qcom_scm symbols msm: cvp: Avoid sending DSP HFI buf twice ANDROID: GKI: Enable net testing options clk: qcom: Add support for VIDEOCC clock driver for SHIMA soc: altmode: Detect when remote subsys fails to respond soc: altmode: Add debugfs nodes to send PAN EN and PAN ACK soc: altmode: Remove altmode device name soc: altmode: Update client APIs, notifier bookkeeping ANDROID: fscrypt: set dun_bytes more precisely ANDROID: dm-default-key: set dun_bytes more precisely ANDROID: block: backport the ability to specify max_dun_bytes aarch64: ABI: Add drm_dp_check_act_status to the whitelist pwm: qti-lpg: Fix erroneous clearing of LUT cnss2: Reject idle restart if fails to get driver ops lock cnss2: Add mutex protection between unregister driver and idle restart cnss2: Serialize driver load and unload ANDROID: Incremental fs: wake up log pollers less often ANDROID: Incremental fs: Fix scheduling while atomic error ANDROID: Incremental fs: Avoid continually recalculating hashes firmware: qcom_scm: fix the arguments types information ANDROID: export: Disable symbol trimming on modules pinctrl: qcom: Update configuration for Shima ANDROID: ABI/Whitelist: add the symbol sdhci_request_atomic to unisoc whitelist soc: qcom: dcc: Set transaction timeout for dcc linklist Enable RTIC MPGen using QGKI firmware: qcom_scm: Pass arginfo for sec_wdog_trigger FROMGIT: media: uapi: h264: Add new profile and levels FROMGIT: media: v4l2-ctrl: Add H264 profile and levels ANDROID: dm-default-key: Update key size for wrapped keys nvmem: qcom-spmi-sdam: Enable multiple devices dt-bindings: clock: dispcc: Remove mdss dp crypto clocks clk: qcom: Add support to proxy vote until clk controllers sync states clk: qcom: lahaina: Enable common regulator handle initialization clk: qcom: Add common regulator handle initialization PM / devfreq: qoslat: implement get_dev_status() ANDROID: GKI: abi update due to mmc patches merged cpufreq: qcom-cpufreq-hw: Simplify the boost frequency drivers: qcom: rpmh_master_stat: Remove unused size for SMEM item FROMGIT: mmc: host: sdhci-sprd: Implement the request_atomic() API FROMGIT: mmc: host: sdhci: Implement the request_atomic() API FROMGIT: mmc: host: Introduce the request_atomic() for the host FROMGIT: mmc: sdhci: Reduce maximum time under spinlock in sdhci_send_command() FROMGIT: mmc: sdhci: Tidy sdhci_request() a bit FROMGIT: mmc: sdhci: Remove unneeded forward declaration of sdhci_finish_data() FROMGIT: mmc: sdhci: Stop exporting sdhci_send_command() FROMGIT: mmc: sdhci: Add helpers for the auto-CMD23 flag FROMGIT: mmc: sdhci-sprd: Drop redundant cap flags msm: kgsl: Disable GBIF_CLIENT_QOS on all A660 GPU revisions ANDROID: GKI: update abi definition due to 5.4.41 merge CSR: Keep qdss clk being on for msr register before msr_reset nvmem: core: Export nvmem cell info to userspace Linux 5.4.41 fanotify: merge duplicate events on parent and child fsnotify: replace inode pointer with an object id bdi: add a ->dev_name field to struct backing_dev_info bdi: move bdi_dev_name out of line mm, memcg: fix error return value of mem_cgroup_css_alloc() scripts/decodecode: fix trapping instruction formatting iommu/virtio: Reverse arguments to list_add objtool: Fix stack offset tracking for indirect CFAs netfilter: nf_osf: avoid passing pointer to local var netfilter: nat: never update the UDP checksum when it's 0 arch/x86/kvm/svm/sev.c: change flag passed to GUP fast in sev_pin_memory() KVM: x86: Fixes posted interrupt check for IRQs delivery modes x86/unwind/orc: Fix premature unwind stoppage due to IRET frames x86/unwind/orc: Fix error path for bad ORC entry type x86/unwind/orc: Prevent unwinding before ORC initialization x86/unwind/orc: Don't skip the first frame for inactive tasks x86/entry/64: Fix unwind hints in rewind_stack_do_exit() x86/entry/64: Fix unwind hints in kernel exit path x86/entry/64: Fix unwind hints in register clearing code batman-adv: Fix refcnt leak in batadv_v_ogm_process batman-adv: Fix refcnt leak in batadv_store_throughput_override batman-adv: Fix refcnt leak in batadv_show_throughput_override batman-adv: fix batadv_nc_random_weight_tq iocost: protect iocg->abs_vdebt with iocg->waitq.lock riscv: set max_pfn to the PFN of the last page coredump: fix crash when umh is disabled staging: gasket: Check the return value of gasket_get_bar_index() ceph: demote quotarealm lookup warning to a debug message ceph: fix endianness bug when handling MDS session feature bits mm: limit boost_watermark on small zones mm/page_alloc: fix watchdog soft lockups during set_zone_contiguous() eventpoll: fix missing wakeup for ovflist in ep_poll_callback epoll: atomically remove wait entry on wake up ipc/mqueue.c: change __do_notify() to bypass check_kill_permission() drm: ingenic-drm: add MODULE_DEVICE_TABLE arm64: hugetlb: avoid potential NULL dereference KVM: arm64: Fix 32bit PC wrap-around KVM: arm: vgic: Fix limit condition when writing to GICD_I[CS]ACTIVER KVM: VMX: Explicitly clear RFLAGS.CF and RFLAGS.ZF in VM-Exit RSB path KVM: s390: Remove false WARN_ON_ONCE for the PQAP instruction crypto: arch/nhpoly1305 - process in explicit 4k chunks tracing: Add a vmalloc_sync_mappings() for safe measure USB: serial: garmin_gps: add sanity checking for data length usb: chipidea: msm: Ensure proper controller reset using role switch API USB: uas: add quirk for LaCie 2Big Quadra HID: wacom: Report 2nd-gen Intuos Pro S center button status over BT HID: usbhid: Fix race between usbhid_close() and usbhid_stop() Revert "HID: wacom: generic: read the number of expected touches on a per collection basis" sctp: Fix bundling of SHUTDOWN with COOKIE-ACK HID: wacom: Read HID_DG_CONTACTMAX directly for non-generic devices net: mvpp2: cls: Prevent buffer overflow in mvpp2_ethtool_cls_rule_del() net: mvpp2: prevent buffer overflow in mvpp22_rss_ctx() net/mlx5: Fix command entry leak in Internal Error State net/mlx5: Fix forced completion access non initialized command entry net/mlx5: DR, On creation set CQ's arm_db member to right value bnxt_en: Fix VLAN acceleration handling in bnxt_fix_features(). bnxt_en: Return error when allocating zero size context memory. bnxt_en: Improve AER slot reset. bnxt_en: Reduce BNXT_MSIX_VEC_MAX value to supported CQs per PF. bnxt_en: Fix VF anti-spoof filter setup. tunnel: Propagate ECT(1) when decapsulating as recommended by RFC6040 tipc: fix partial topology connection closure sch_sfq: validate silly quantum values sch_choke: avoid potential panic in choke_reset() nfp: abm: fix a memory leak bug net: usb: qmi_wwan: add support for DW5816e net/tls: Fix sk_psock refcnt leak when in tls_data_ready() net/tls: Fix sk_psock refcnt leak in bpf_exec_tx_verdict() net: tc35815: Fix phydev supported/advertising mask net: stricter validation of untrusted gso packets net_sched: sch_skbprio: add message validation to skbprio_change() net/mlx4_core: Fix use of ENOSPC around mlx4_counter_alloc() net: macsec: preserve ingress frame ordering net: macb: fix an issue about leak related system resources net: dsa: Do not leave DSA master with NULL netdev_ops neigh: send protocol value in neighbor create notification mlxsw: spectrum_acl_tcam: Position vchunk in a vregion list properly ipv6: Use global sernum for dst validation with nexthop objects fq_codel: fix TCA_FQ_CODEL_DROP_BATCH_SIZE sanity checks dp83640: reverse arguments to list_add_tail devlink: fix return value after hitting end in region read tty: xilinx_uartps: Fix missing id assignment to the console vt: fix unicode console freeing with a common interface drm/amdgpu: drop redundant cg/pg ungate on runpm enter drm/amdgpu: move kfd suspend after ip_suspend_phase1 net: macb: Fix runtime PM refcounting tracing/kprobes: Fix a double initialization typo nvme: fix possible hang when ns scanning fails during error recovery nvme: refactor nvme_identify_ns_descs error handling USB: serial: qcserial: Add DW5816e support iommu/arm-smmu: Updates probe defer handle from secure_buffer arm64: ABI: Update the ABI whitelist for OOM notifiers msm: pcie: add support to manage PCIe PHY PLL block msm: adsprpc: add support to print logs on VERIFY failures msm: pcie: add DRV SSR support during DRV resume qseecom: process smcinvoke callback request ARM: dts: msm: Create softlink for vendor specific dt drivers: pinctrl: Add pinctrl support for SDXLEMUR target ALSA: Compress - dont use lock for all ioctls Revert "ALSA: jack: Add support to report second microphone" usb: dwc3: Use an ordered workqueue for sm_work defconfig: Enable CONFIG_DEBUG_FS for holi ASoC: pcm: QGKI startup sequence for playback and capture arm64: defconfig: Disable CONFIG_CFI_PERMISSIVE flag soc: qcom: mem-buf: Add support for restricting memory transfers UPSTREAM: driver core: Skip unnecessary work when device doesn't have sync_state() arm64: add config option to enable DT overlay defconfig: holi: Add support for Global clock controller ANDROID: GKI: enable CONFIG_IRQ_TIME_ACCOUNTING soc: qcom: socinfo: Fix array out-of-bounds access cnss2: Enable io-coherency arm64: defconfig: Enable CONFIG_UNUSED_KSYMS_WHITELIST_ONLY kbuild: Add support for CONFIG_UNUSED_KSYMS_WHITELIST_ONLY ABI: Add initial snapshot of QCOM whitelists ANDROID: GKI: Enable CONFIG_STATIC_USERMODEHELPER drivers: cpuidle: lpm-levels: check for valid LPM stats radio: RTC6226: add support to scan valid lower freq channel soc: qcom: spss_utils: protect from event signaled twice radio: RTC6226: post original tune event after scan complete usb: gadget: Allow f_rndis and f_gsi to coexist as modules Revert "usb: Add support for rndis uplink aggregation" Revert "usb: gadget: Add support for rndis flow control callback" ANDROID: dm-default-key: Update key size for wrapped keys scsi: ufshcd-qti: Keep the correct device and link state usb: gadget: f_qdss: Add ipc logging for qdss driver msm: ipa: enable SYSPIPE_ERR_DETECTION bit for deaggr_err mmc: Define config flag to add qcom code to upstream module mmc: Add MMC clock scaling support for sdhci-msm layer mmc: Add MMC clock scaling support to core layer mmc: Add MMC clock scaling support in the block layer sched: Completely remove CFS_BANDWIDTH support in WALT msm: cvp: Rename cvpss to evass pinctrl: qcom: Add affinity callbacks to msmgpio IRQ chip Send actual keylen to TZ soc: qcom: hwkm: fix minor issues soc: qcom: spss_utils: add spss events support thermal: qcom-spmi-temp-alarm: Don't suppress negative temp Add ports and port child node check in legacy function qseecom: Set max size for dma segment defconfig: Enable Glink over RPM defconfig for Holi Revert "sched: reduce sleep duration in wait_task_inactive()" kthread: Do not preempt current task if it is going to call schedule() Revert "ASoC: soc-pcm: BE dai needs prepare when pause release after resume" msm: cvp: Remove deprecated old synx usage ANDROID: GKI: x86: Drop CONFIG_DEVPORT Linux 5.4.40 PM / devfreq: Add missing locking while setting suspend_freq udp: document udp_rcv_segment special case for looped packets tools headers UAPI: Sync copy of arm64's asm/unistd.h with the kernel sources Revert "drm/amd/display: setting the DIG_MODE to the correct value." mm/mremap: Add comment explaining the untagging behaviour of mremap() libbpf: Fix readelf output parsing for Fedora cgroup, netclassid: remove double cond_resched mac80211: add ieee80211_is_any_nullfunc() ACPI: PM: s2idle: Fix comment in acpi_s2idle_prepare_late() platform/x86: GPD pocket fan: Fix error message when temp-limits are out of range x86/kvm: fix a missing-prototypes "vmread_error" ALSA: hda: Match both PCI ID and SSID for driver blacklist hexagon: define ioremap_uc hexagon: clean up ioremap mfd: intel-lpss: Use devm_ioremap_uc for MMIO lib: devres: add a helper function for ioremap_uc Revert "software node: Simplify software_node_release() function" drm/amdgpu: Fix oops when pp_funcs is unset in ACPI event sctp: Fix SHUTDOWN CTSN Ack in the peer restart case drm/i915: Extend WaDisableDARBFClkGating to icl,ehl,tgl net: systemport: suppress warnings on failed Rx SKB allocations net: bcmgenet: suppress warnings on failed Rx SKB allocations mac80211: sta_info: Add lockdep condition for RCU list usage lib/mpi: Fix building for powerpc with clang tracing: Fix memory leaks in trace_events_hist.c cifs: do not share tcons with DFS scripts/config: allow colons in option strings for sed cifs: protect updating server->dstaddr with a spinlock ASoC: rsnd: Fix "status check failed" spam for multi-SSI ASoC: rsnd: Don't treat master SSI in multi SSI setup as parent net: stmmac: Fix sub-second increment net: stmmac: fix enabling socfpga's ptp_ref_clock wimax/i2400m: Fix potential urb refcnt leak drm/amdgpu: Correctly initialize thermal controller for GPUs with Powerplay table v0 (e.g Hawaii) remoteproc: qcom_q6v5_mss: fix a bug in q6v5_probe() ASoC: codecs: hdac_hdmi: Fix incorrect use of list_for_each_entry ASoC: rsnd: Fix HDMI channel mapping for multi-SSI mode ASoC: rsnd: Fix parent SSI start/stop in multi-SSI mode usb: dwc3: gadget: Properly set maxpacket limit ASoC: topology: Fix endianness issue ASoC: sgtl5000: Fix VAG power-on handling selftests/ipc: Fix test failure seen after initial test run ASoC: topology: Check return value of soc_tplg_dai_config ASoC: topology: Check return value of pcm_new_ver ASoC: topology: Check soc_tplg_add_route return value ASoC: topology: Check return value of soc_tplg_*_create ASoC: topology: Check return value of soc_tplg_create_tlv drm/bridge: analogix_dp: Split bind() into probe() and real bind() vhost: vsock: kick send_pkt worker once device is started msm: cvp: Enhance CVP release persist buf process lpm-levels: Read next hrtimer event after tick_nohz_idle_stop_tick() arm64: defconfig: Add support for Global clock controller for SHIMA clk: qcom: gcc: Update voltage voting Support for GCC CPUSS AHB clock cpufreq: qcom: Update logic to register for GT Limits Management interrupt msm: kgsl: Handle page allocation failure defconfig: enable display configs for trusted VM firmware: qcom: add enlarged qsee log support regulator: qcom_pm8008-regulator: avoid transactions after suspend msm: pcie: add new DRV commands for APPS to control PCIe L1ss sleep hvc: haven: Prevent tty layer from closing SELF console drivers: Fix compilation issues when debugfs is disabled haven: Fix non-zero input SG-List handling for MEM_ACCEPT iommu: iommu-debug: Fix functional_fast_dma test iommu/arm-smmu: Add support for split page table domains Revert "usb: gadget: rndis: Add packet filter handling for hw accelerated path" Revert "usb: gadget: rndis: Add new rndis parameters" Revert "USB: rndis: Honor dl_max_packet_size value sent by host" iommu: Introduce DOMAIN_ATTR_SPLIT_TABLES devfreq: memlat: correct null pointer derference mm: make shrink_page_list with pages work from multiple zones mm: Per process reclaim coresight: Fix support for sparsely populated ports i2c: i2c-msm-geni: Propagate missing changes from 4.19 to 5.4 msm: kgsl: Use DMA APIs for cache operations interconnect: qcom: Fix small BW votes being truncated to zero regulator: qpnp-amoled: add support to configure single phase for IBB regulator: qpnp-amoled: Fix IBB load current threshold clk: qcom: gdsc-regulator: Poll PWR_ON during GDSC HW to SW mode switch soc/qcom/hyp_core_ctl: update reserved CPUs only after VM is booted arm64: defconfig: enable dynamic debug for genericarmv8 ANDROID: GKI: update abi definition due to FAIR_GROUP_SCHED removal ANDROID: GKI: Remove FAIR_GROUP_SCHED ANDROID: Drop ABI monitoring from KASAN build config ANDROID: Enforce KMI stability Linux 5.4.39 selinux: properly handle multiple messages in selinux_netlink_send() arm64: vdso: Add -fasynchronous-unwind-tables to cflags dmaengine: dmatest: Fix process hang when reading 'wait' parameter dmaengine: dmatest: Fix iteration non-stop logic nfs: Fix potential posix_acl refcnt leak in nfs3_set_acl nvme: prevent double free in nvme_alloc_ns() error handling Fix use after free in get_tree_bdev() ALSA: opti9xx: shut up gcc-10 range warning i2c: aspeed: Avoid i2c interrupt status clear race condition. iommu/amd: Fix legacy interrupt remapping for x2APIC-enabled system scsi: target/iblock: fix WRITE SAME zeroing iommu/qcom: Fix local_base status check vfio/type1: Fix VA->PA translation for PFNMAP VMAs in vaddr_get_pfn() vfio: avoid possible overflow in vfio_iommu_type1_pin_pages i2c: iproc: generate stop event for slave writes RDMA/cm: Fix an error check in cm_alloc_id_priv() RDMA/cm: Fix ordering of xa_alloc_cyclic() in ib_create_cm_id() RDMA/core: Fix race between destroy and release FD object RDMA/core: Prevent mixed use of FDs between shared ufiles RDMA/siw: Fix potential siw_mem refcnt leak in siw_fastreg_mr() RDMA/mlx4: Initialize ib_spec on the stack RDMA/mlx5: Set GRH fields in query QP on RoCE scsi: qla2xxx: check UNLOADING before posting async work scsi: qla2xxx: set UNLOADING before waiting for session deletion ARM: dts: imx6qdl-sr-som-ti: indicate powering off wifi is safe dm multipath: use updated MPATHF_QUEUE_IO on mapping for bio-based mpath dm writecache: fix data corruption when reloading the target dm verity fec: fix hash block number in verity_fec_decode PM: hibernate: Freeze kernel threads in software_resume() PM: ACPI: Output correct message on target power state IB/rdmavt: Always return ERR_PTR from rvt_create_mmap_info() dlmfs_file_write(): fix the bogosity in handling non-zero *ppos Drivers: hv: vmbus: Fix Suspend-to-Idle for Generation-2 VM i2c: amd-mp2-pci: Fix Oops in amd_mp2_pci_init() error handling ALSA: pcm: oss: Place the plugin buffer overflow checks correctly ALSA: line6: Fix POD HD500 audio playback ALSA: hda/hdmi: fix without unlocked before return ALSA: usb-audio: Correct a typo of NuPrime DAC-10 USB ID ALSA: hda/realtek - Two front mics on a Lenovo ThinkCenter crypto: caam - fix the address of the last entry of S/G mmc: meson-mx-sdio: remove the broken ->card_busy() op mmc: meson-mx-sdio: Set MMC_CAP_WAIT_WHILE_BUSY mmc: sdhci-msm: Enable host capabilities pertains to R1b response mmc: sdhci-pci: Fix eMMC driver strength for BYT-based controllers mmc: sdhci-xenon: fix annoying 1.8V regulator warning mmc: cqhci: Avoid false "cqhci: CQE stuck on" by not open-coding timeout loop btrfs: transaction: Avoid deadlock due to bad initialization timing of fs_info::journal_info btrfs: fix partial loss of prealloc extent past i_size after fsync btrfs: fix block group leak when removing fails btrfs: fix transaction leak in btrfs_recover_relocation NFSv4.1: fix handling of backchannel binding in BIND_CONN_TO_SESSION drm/qxl: qxl_release use after free drm/qxl: qxl_release leak in qxl_hw_surface_alloc() drm/qxl: qxl_release leak in qxl_draw_dirty_fb() drm/amd/display: Fix green screen issue after suspend drm/edid: Fix off-by-one in DispID DTD pixel clock dma-buf: Fix SET_NAME ioctl uapi msm: cvp: Fix a cvp BW over-voting problem ANDROID: Rename build.config.gki.arch_kasan ANDROID: Incremental fs: Fix issues with very large files msm: cvp: Allows concurrent DSP commands handling sched: walt: Improve the scheduler ANDROID: Correct build.config branch name FROMGIT: f2fs: fix missing check for f2fs_unlock_op ANDROID: Fix build.config.gki-debug UPSTREAM: vdso: Fix clocksource.h macro detection Linux 5.4.38 Revert "ASoC: meson: axg-card: fix codec-to-codec link setup" ANDROID: GKI: update abi definition due to added padding ANDROID: GKI: user_namespace.h: add Android ABI padding to a structure ANDROID: GKI: timer.h: add Android ABI padding to a structure ANDROID: GKI: quota.h: add Android ABI padding to some structures ANDROID: GKI: mmu_notifier.h: add Android ABI padding to some structures ANDROID: GKI: mm.h: add Android ABI padding to a structure ANDROID: GKI: kobject.h: add Android ABI padding to some structures ANDROID: GKI: kernfs.h: add Android ABI padding to some structures ANDROID: GKI: irqdomain.h: add Android ABI padding to a structure ANDROID: GKI: ioport.h: add Android ABI padding to a structure ANDROID: GKI: iomap.h: add Android ABI padding to a structure ANDROID: GKI: hrtimer.h: add Android ABI padding to a structure ANDROID: GKI: genhd.h: add Android ABI padding to some structures ANDROID: GKI: ethtool.h: add Android ABI padding to a structure ANDROID: GKI: dma-mapping.h: add Android ABI padding to a structure ANDROID: GKI: sched: add Android ABI padding to some structures ANDROID: GKI: networking: add Android ABI padding to a lot of networking structures ANDROID: GKI: blk_types.h: add Android ABI padding to a structure ANDROID: GKI: scsi.h: add Android ABI padding to a structure ANDROID: GKI: pci: add Android ABI padding to some structures ANDROID: GKI: update abi definition due to 5.4.37 merge Linux 5.4.37 ASoC: stm32: spdifrx: fix regmap status check ASoC: soc-core: disable route checks for legacy devices ext4: check for non-zero journal inum in ext4_calculate_overhead qed: Fix use after free in qed_chain_free net: use indirect call wrappers for skb_copy_datagram_iter() Crypto: chelsio - Fixes a hang issue during driver registration qed: Fix race condition between scheduling and destroying the slowpath workqueue taprio: do not use BIT() in TCA_TAPRIO_ATTR_FLAG_* definitions hwmon: (jc42) Fix name to have no illegal characters blk-mq: Put driver tag in blk_mq_dispatch_rq_list() when no budget ext4: convert BUG_ON's to WARN_ON's in mballoc.c ext4: increase wait time needed before reuse of deleted inode numbers ext4: use matching invalidatepage in ext4_writepage arm64: Delete the space separator in __emit_inst mac80211: fix channel switch trigger from unknown mesh peer net: stmmac: socfpga: Allow all RGMII modes ALSA: hda: call runtime_allow() for all hda controllers xen/xenbus: ensure xenbus_map_ring_valloc() returns proper grant status objtool: Support Clang non-section symbols in ORC dump objtool: Fix CONFIG_UBSAN_TRAP unreachable warnings scsi: target: tcmu: reset_ring should reset TCMU_DEV_BIT_BROKEN scsi: target: fix PR IN / READ FULL STATUS for FC ALSA: hda: Explicitly permit using autosuspend if runtime PM is supported ALSA: hda: Keep the controller initialization even if no codecs found ALSA: hda: Release resources at error in delayed probe xfs: fix partially uninitialized structure in xfs_reflink_remap_extent afs: Fix length of dump of bad YFSFetchStatus record signal: check sig before setting info in kill_pid_usb_asyncio x86: hyperv: report value of misc_features net: fec: set GPR bit on suspend by DT configuration. libbpf: Initialize *nl_pid so gcc 10 is happy bpf, x86: Fix encoding for lower 8-bit registers in BPF_STX BPF_B xfs: clear PF_MEMALLOC before exiting xfsaild thread mm: shmem: disable interrupt when acquiring info->lock in userfaultfd_copy path bpf, x86_32: Fix logic error in BPF_LDX zero-extension bpf, x86_32: Fix clobbering of dst for BPF_JSET bpf, x86_32: Fix incorrect encoding in BPF_LDX zero-extension um: ensure `make ARCH=um mrproper` removes arch/$(SUBARCH)/include/generated/ blk-iocost: Fix error on iocost_ioc_vrate_adj PM: sleep: core: Switch back to async_schedule_dev() netfilter: nat: fix error handling upon registering inet hook perf/core: fix parent pid/tid in task exit events sched/core: Fix reset-on-fork from RT with uclamp net/mlx5: Fix failing fw tracer allocation on s390 s390/pci: do not set affinity for floating irqs cpumap: Avoid warning when CONFIG_DEBUG_PER_CPU_MAPS is enabled ARM: dts: bcm283x: Disable dsi0 node PCI: Move Apex Edge TPU class quirk to fix BAR assignment PCI: Add ACS quirk for Zhaoxin Root/Downstream Ports PCI: Add Zhaoxin Vendor ID PCI: Unify ACS quirk desired vs provided checking PCI: Make ACS quirk implementations more uniform PCI: Add ACS quirk for Zhaoxin multi-function devices PCI: Avoid ASMedia XHCI USB PME# from D0 defect net/mlx5e: Get the latest values from counters in switchdev mode net/mlx5e: Don't trigger IRQ multiple times on XSK wakeup to avoid WQ overruns svcrdma: Fix leak of svc_rdma_recv_ctxt objects svcrdma: Fix trace point use-after-free race xfs: acquire superblock freeze protection on eofblocks scans net/cxgb4: Check the return from t4_query_params properly rxrpc: Fix DATA Tx to disable nofrag for UDP on AF_INET6 socket i2c: altera: use proper variable to hold errno bpf: Forbid XADD on spilled pointers for unprivileged users nfsd: memory corruption in nfsd4_lock() drivers: soc: xilinx: fix firmware driver Kconfig dependency ASoC: wm8960: Fix wrong clock after suspend & resume ASoC: meson: axg-card: fix codec-to-codec link setup ASoC: tas571x: disable regulators on failed probe ASoC: q6dsp6: q6afe-dai: add missing channels to MI2S DAIs s390/ftrace: fix potential crashes when switching tracers counter: 104-quad-8: Add lock guards - generic interface propagate_one(): mnt_set_mountpoint() needs mount_lock iio:ad7797: Use correct attribute_group afs: Fix to actually set AFS_SERVER_FL_HAVE_EPOCH afs: Make record checking use TASK_UNINTERRUPTIBLE when appropriate usb: gadget: udc: atmel: Fix vbus disconnect handling usb: gadget: udc: bdc: Remove unnecessary NULL checks in bdc_req_complete kbuild: fix DT binding schema rule again to avoid needless rebuilds usb: dwc3: gadget: Do link recovery for SS and SSP ASoC: stm32: sai: fix sai probe printk: queue wake_up_klogd irq_work only if per-CPU areas are ready ubifs: Fix ubifs_tnc_lookup() usage in do_kill_orphans() remoteproc: Fix wrong rvring index computation defconfig: lahaina: Enable gpu devfreq governors for GKI ANDROID: Update ABI representation after enabling CONFIG_HID_BATTERY_STRENGTH ANDROID: GKI: enable CONFIG_HID_BATTERY_STRENGTH pinctrl: qcom: spmi-gpio: Add support for PMIC5 variants ANDROID: Update ABI representation after adding exynos whitelist ANDROID: Add abi_gki_aarch64_exynos_whitelist ANDROID: build.config.gki.aarch64: Enable WHITELIST_STRICT_MODE ANDROID: abi_gki_aarch64_sunxi_whitelist: remove stale symbols ANDROID: abi_gki_aarch64_unisoc_whitelist: remove stale symbols ANDROID: abi_gki_aarch64_qcom_whitelist: Sync with android-5.4 ANDROID: abi_gki_aarch64_hikey960_whitelist: remove stale symbols ANDROID: Incremental fs: Add setattr call msm: cvp: disable cache op by default ANDROID: GKI: enable CONFIG_RTC_SYSTOHC on x86 ANDROID: drivers: gpu: drm: fix export symbol type ANDROID: driver: gpu: drm: fix export symbol types ANDROID: drm: kirin: fix export symbol type ANDROID: iommu: fix export symbol type ANDROID: ion: fix export symbol type ANDROID: mm/memory.c: fix export symbol type ANDROID: sdcardfs: fix export symbol type ANDROID: SoC: core: fix export symbol type ANDROID: ufshcd-crypto: fix export symbol type Revert "ANDROID: gki_defconfig: enabled UAPI header compile testing" xhci-plat: Mark usb1 and usb2 devices as wakeup source ANDROID: GKI: update abi and cf/gf whitelists ANDROID: GKI: enable CONFIG_RTC_SYSTOHC ANDROID: virt_wifi: fix export symbol types ANDROID: vfs: fix export symbol type ANDROID: vfs: fix export symbol types ANDROID: fscrypt: fix export symbol type ANDROID: cfi: fix export symbol types ANDROID: bpf: fix export symbol type Linux 5.4.36 s390/mm: fix page table upgrade vs 2ndary address mode accesses compat: ARM64: always include asm-generic/compat.h powerpc/mm: Fix CONFIG_PPC_KUAP_DEBUG on PPC32 powerpc/kuap: PPC_KUAP_DEBUG should depend on PPC_KUAP Revert "serial: uartps: Register own uart console and driver structures" Revert "serial: uartps: Move Port ID to device data structure" Revert "serial: uartps: Change uart ID port allocation" Revert "serial: uartps: Do not allow use aliases >= MAX_UART_INSTANCES" Revert "serial: uartps: Fix error path when alloc failed" Revert "serial: uartps: Use the same dynamic major number for all ports" Revert "serial: uartps: Fix uartps_major handling" serial: sh-sci: Make sure status register SCxSR is read in correct sequence xhci: Don't clear hub TT buffer on ep0 protocol stall xhci: prevent bus suspend if a roothub port detected a over-current condition xhci: Fix handling halted endpoint even if endpoint ring appears empty usb: typec: altmode: Fix typec_altmode_get_partner sometimes returning an invalid pointer usb: typec: tcpm: Ignore CC and vbus changes in PORT_RESET change usb: f_fs: Clear OS Extended descriptor counts to zero in ffs_data_reset() usb: dwc3: gadget: Fix request completion check fpga: dfl: pci: fix return value of cci_pci_sriov_configure UAS: fix deadlock in error handling and PM flushing work UAS: no use logging any details in case of ENODEV cdc-acm: introduce a cool down cdc-acm: close race betrween suspend() and acm_softint staging: vt6656: Power save stop wake_up_count wrap around. staging: vt6656: Fix pairwise key entry save. staging: vt6656: Fix drivers TBTT timing counter. staging: vt6656: Fix calling conditions of vnt_set_bss_mode staging: vt6656: Don't set RCR_MULTICAST or RCR_BROADCAST by default. vt: don't use kmalloc() for the unicode screen buffer vt: don't hardcode the mem allocation upper bound staging: comedi: Fix comedi_device refcnt leak in comedi_open staging: comedi: dt2815: fix writing hi byte of analog output powerpc/setup_64: Set cache-line-size based on cache-block-size ARM: imx: provide v7_cpu_resume() only on ARM_CPU_SUSPEND=y cifs: fix uninitialised lease_key in open_shroot() iwlwifi: mvm: fix inactive TID removal return value usage iwlwifi: mvm: Do not declare support for ACK Enabled Aggregation iwlwifi: mvm: limit maximum queue appropriately iwlwifi: mvm: beacon statistics shouldn't go backwards iwlwifi: pcie: actually release queue memory in TVQM SUNRPC: Fix backchannel RPC soft lockups mac80211: populate debugfs only after cfg80211 init ASoC: dapm: fixup dapm kcontrol widget audit: check the length of userspace generated audit records signal: Avoid corrupting si_pid and si_uid in do_notify_parent usb-storage: Add unusual_devs entry for JMicron JMS566 tty: rocket, avoid OOB access tty: hvc: fix buffer overflow during hvc_alloc(). KVM: VMX: Enable machine check support for 32bit targets KVM: Check validity of resolved slot when searching memslots KVM: s390: Return last valid slot if approx index is out-of-bounds tpm: ibmvtpm: retry on H_CLOSED in tpm_ibmvtpm_send() tpm: fix wrong return value in tpm_pcr_extend tpm/tpm_tis: Free IRQ if probing fails ALSA: usb-audio: Filter out unsupported sample rates on Focusrite devices ALSA: usb-audio: Fix usb audio refcnt leak when getting spdif ALSA: hda/hdmi: Add module option to disable audio component binding ALSA: hda/realtek - Add new codec supported for ALC245 ALSA: hda/realtek - Fix unexpected init_amp override ALSA: usx2y: Fix potential NULL dereference tools/vm: fix cross-compile build mm/ksm: fix NULL pointer dereference when KSM zero page is enabled mm/hugetlb: fix a addressing exception caused by huge_pte_offset coredump: fix null pointer dereference on coredump staging: gasket: Fix incongruency in handling of sysfs entries creation vmalloc: fix remap_vmalloc_range() bounds checks tty: serial: owl: add "much needed" clk_prepare_enable() USB: hub: Revert commitbd0e6c9614
("usb: hub: try old enumeration scheme first for high speed devices") USB: hub: Fix handling of connect changes during sleep USB: core: Fix free-while-in-use bug in the USB S-Glibrary USB: early: Handle AMD's spec-compliant identifiers, too USB: Add USB_QUIRK_DELAY_CTRL_MSG and USB_QUIRK_DELAY_INIT for Corsair K70 RGB RAPIDFIRE USB: sisusbvga: Change port variable from signed to unsigned iio: xilinx-xadc: Make sure not exceed maximum samplerate iio: xilinx-xadc: Fix sequencer configuration for aux channels in simultaneous mode iio: xilinx-xadc: Fix clearing interrupt when enabling trigger iio: xilinx-xadc: Fix ADC-B powerdown iio: adc: ti-ads8344: properly byte swap value iio: adc: stm32-adc: fix sleep in atomic context iio: st_sensors: rely on odr mask to know if odr can be set iio: core: remove extra semi-colon from devm_iio_device_register() macro ALSA: usb-audio: Add connector notifier delegation ALSA: usb-audio: Add static mapping table for ALC1220-VB-based mobos ALSA: hda: Remove ASUS ROG Zenith from the blacklist KEYS: Avoid false positive ENOMEM error on key read vrf: Check skb for XFRM_TRANSFORMED flag xfrm: Always set XFRM_TRANSFORMED in xfrm{4,6}_output_finish geneve: use the correct nlattr array in NL_SET_ERR_MSG_ATTR vxlan: use the correct nlattr array in NL_SET_ERR_MSG_ATTR net: dsa: b53: b53_arl_rw_op() needs to select IVL or SVL net: dsa: b53: Rework ARL bin logic net: dsa: b53: Fix ARL register definitions net: dsa: b53: Fix valid setting for MDB entries net: dsa: b53: Lookup VID in ARL searches when VLAN is enabled vrf: Fix IPv6 with qdisc and xfrm team: fix hang in team_mode_get() tcp: cache line align MAX_TCP_HEADER selftests: Fix suppress test in fib_tests.sh sched: etf: do not assume all sockets are full blown net/x25: Fix x25_neigh refcnt leak when receiving frame net: stmmac: dwmac-meson8b: Add missing boundary to RGMII TX clock array net: openvswitch: ovs_ct_exit to be done under ovs_lock net: netrom: Fix potential nr_neigh refcnt leak in nr_add_node net/mlx4_en: avoid indirect call in TX completion net: bcmgenet: correct per TX/RX ring statistics mlxsw: Fix some IS_ERR() vs NULL bugs macvlan: fix null dereference in macvlan_device_event() macsec: avoid to set wrong mtu ipv6: fix restrict IPV6_ADDRFORM operation ipv4: Update fib_select_default to handle nexthop objects cxgb4: fix large delays in PTP synchronization cxgb4: fix adapter crash due to wrong MC size PCI/PM: Add missing link delays required by the PCIe spec PCI/ASPM: Allow re-enabling Clock PM scsi: smartpqi: fix problem with unique ID for physical device scsi: smartpqi: fix call trace in device discovery scsi: smartpqi: fix controller lockup observed during force reboot virtio-blk: improve virtqueue error to BLK_STS tracing/selftests: Turn off timeout setting ASoC: SOF: trace: fix unconditional free in trace release PCI: pciehp: Prevent deadlock on disconnect libbpf: Fix readelf output parsing on powerpc with recent binutils PCI/PM: Add pcie_wait_for_link_delay() drm/amd/display: Not doing optimize bandwidth if flip pending. xhci: Finetune host initiated USB3 rootport link suspend and resume xhci: Wait until link state trainsits to U0 after setting USB_SS_PORT_LS_U0 xhci: Ensure link state is U3 after setting USB_SS_PORT_LS_U3 ALSA: usb-audio: Add Pioneer DJ DJM-250MK2 quirk ASoC: Intel: bytcr_rt5640: Add quirk for MPMAN MPWIN895CL tablet drm/amd/display: Calculate scaling ratios on every medium/full update perf/core: Disable page faults when getting phys address pwm: bcm2835: Dynamically allocate base pwm: renesas-tpu: Fix late Runtime PM enablement nvme: fix compat address handling in several ioctls powerpc/pseries: Fix MCE handling on pseries Revert "powerpc/64: irq_work avoid interrupt when called with hardware irqs enabled" loop: Better discard support for block devices s390/cio: avoid duplicated 'ADD' uevents s390/cio: generate delayed uevent for vfio-ccw subchannels lib/raid6/test: fix build on distros whose /bin/sh is not bash kconfig: qconf: Fix a few alignment issues ipc/util.c: sysvipc_find_ipc() should increase position index selftests: kmod: fix handling test numbers above 9 kernel/gcov/fs.c: gcov_seq_next() should increase position index dma-direct: fix data truncation in dma_direct_get_required_mask() drm/amd/display: Update stream adjust in dc_stream_adjust_vmin_vmax nvme: fix deadlock caused by ANA update wrong locking ASoC: Intel: atom: Take the drv->lock mutex before calling sst_send_slot_map() tools/test/nvdimm: Fix out of tree build scsi: iscsi: Report unbind session event when the target has been removed nvme-tcp: fix possible crash in write_zeroes processing pwm: rcar: Fix late Runtime PM enablement ceph: don't skip updating wanted caps when cap is stale ceph: return ceph_mdsc_do_request() errors from __get_parent() scsi: libfc: If PRLI rejected, move rport to PLOGI state scsi: lpfc: Fix crash in target side cable pulls hitting WAIT_FOR_UNREG scsi: lpfc: Fix crash after handling a pci error scsi: lpfc: Fix kasan slab-out-of-bounds error in lpfc_unreg_login watchdog: reset last_hw_keepalive time at start tools/testing/nvdimm: Fix compilation failure without CONFIG_DEV_DAX_PMEM_COMPAT arm64: Silence clang warning on mismatched value/register sizes arm64: compat: Workaround Neoverse-N1 #1542419 for compat user-space arm64: Fake the IminLine size on systems affected by Neoverse-N1 #1542419 arm64: errata: Hide CTR_EL0.DIC on systems affected by Neoverse-N1 #1542419 net, ip_tunnel: fix interface lookup with no key f2fs: fix to avoid memory leakage in f2fs_listxattr ext4: fix extent_status fragmentation for plain files ANDROID: GKI: Update abi and cf/gf whitelists defconfig: msm: enable remote debugger driver on Lahaina ANDROID: ABI/Whitelist: update pcie whitelist to unisoc whitelist ANDROID: GKI: Update ABI for DRM core changes ANDROID: add compat cross compiler UPSTREAM: arm64: vdso32: Enable Clang Compilation BACKPORT: lib/vdso: Enable common headers BACKPORT: arm: vdso: Enable arm to use common headers BACKPORT: x86/vdso: Enable x86 to use common headers UPSTREAM: arm64: vdso32: Include common headers in the vdso library UPSTREAM: arm64: vdso: Include common headers in the vdso library UPSTREAM: arm64: Introduce asm/vdso/processor.h UPSTREAM: arm64: vdso32: Code clean up UPSTREAM: linux/elfnote.h: Replace elf.h with UAPI equivalent UPSTREAM: scripts: Fix the inclusion order in modpost UPSTREAM: common: Introduce processor.h UPSTREAM: linux/ktime.h: Extract common header for vDSO UPSTREAM: linux/jiffies.h: Extract common header for vDSO UPSTREAM: linux/time64.h: Extract common header for vDSO BACKPORT: linux/time32.h: Extract common header for vDSO BACKPORT: linux/time.h: Extract common header for vDSO UPSTREAM: linux/math64.h: Extract common header for vDSO BACKPORT: linux/clocksource.h: Extract common header for vDSO BACKPORT: arm64: Introduce asm/vdso/clocksource.h BACKPORT: arm: Introduce asm/vdso/clocksource.h BACKPORT: x86: Introduce asm/vdso/clocksource.h UPSTREAM: linux/limits.h: Extract common header for vDSO UPSTREAM: linux/bits.h: Extract common header for vDSO UPSTREAM: linux/const.h: Extract common header for vDSO BACKPORT: lib/vdso: Allow the high resolution parts to be compiled out BACKPORT: lib/vdso: Only read hrtimer_res when needed in __cvdso_clock_getres() UPSTREAM: lib/vdso: Mark do_hres() and do_coarse() as __always_inline UPSTREAM: lib/vdso: Avoid duplication in __cvdso_clock_getres() UPSTREAM: lib/vdso: Let do_coarse() return 0 to simplify the callsite UPSTREAM: lib/vdso: Remove checks on return value for 32 bit vDSO UPSTREAM: lib/vdso: Build 32 bit specific functions in the right context UPSTREAM: lib/vdso: Make __cvdso_clock_getres() static UPSTREAM: arm64: compat: vdso: Expose BUILD_VDSO32 ANDROID: GKI: Enable GENERIC_IRQ_CHIP ANDROID: ABI/Whitelist: update unisoc Whitelist after CONFIG_PPP =m ANDROID: ABI/Whitelist: update for allwinner. ANDROID: gki_defconfig: enable CONFIG_PM_DEVFREQ_EVENT. ANDROID: Incremental fs: Use simple compression in log buffer ANDROID: dm-bow: Fix not to skip trim at framented range ANDROID: Remove VLA from uid_sys_stats.c ANDROID: ABI/Whitelist: add net whitelist to unisoc Whitelist f2fs: fix missing check for f2fs_unlock_op ANDROID: gki_defconfig: enable CONFIG_MMC_CRYPTO ANDROID: Add padding for crypto related structs in UFS and MMC ANDROID: mmc: MMC crypto API ANDROID: GKI: USB: Add vendor specified variables to hc_driver ANDROID: hikey960_gki.fragment enable CONFIG_SDCARD_FS=m ANDROID: GKI: update abi.xml due to additional Android ABI padding ANDROID: GKI: elevator: add Android ABI padding to some structures ANDROID: GKI: dentry: add Android ABI padding to some structures ANDROID: GKI: bio: add Android ABI padding to some structures ANDROID: GKI: scsi: add Android ABI padding to some structures ANDROID: GKI: ufs: add Android ABI padding to some structures ANDROID: sdcardfs: fix export symbol types Linux 5.4.35 bpf, test_verifier: switch bpf_get_stack's 0 s> r8 test bpf: Test_progs, add test to catch retval refine error handling bpf: Test_verifier, bpf_get_stack return value add <0 bpf: fix buggy r0 retval refinement for tracing helpers KEYS: Don't write out to userspace while holding key semaphore mtd: phram: fix a double free issue in error path mtd: lpddr: Fix a double free in probe() docs: Fix path to MTD command line partition parser mtd: spinand: Explicitly use MTD_OPS_RAW to write the bad block marker to OOB mtd: rawnand: free the nand_device object locktorture: Print ratio of acquisitions, not failures tty: evh_bytechan: Fix out of bounds accesses fbmem: Adjust indentation in fb_prepare_logo and fb_blank iio: si1133: read 24-bit signed integer for measurement ARM: dts: sunxi: Fix DE2 clocks register range fbdev: potential information leak in do_fb_ioctl() dma-debug: fix displaying of dma allocation type net: dsa: bcm_sf2: Fix overflow checks drm/nouveau/gr/gp107,gp108: implement workaround for HW hanging during init f2fs: fix to wait all node page writeback iommu/amd: Fix the configuration of GCR3 table root pointer libnvdimm: Out of bounds read in __nd_ioctl() power: supply: axp288_fuel_gauge: Broaden vendor check for Intel Compute Sticks. csky: Fixup init_fpu compile warning with __init sunrpc: Fix gss_unwrap_resp_integ() again ext2: fix debug reference to ext2_xattr_cache iommu/vt-d: Fix page request descriptor size iommu/vt-d: Silence RCU-list debugging warning in dmar_find_atsr() ext2: fix empty body warnings when -Wextra is used SUNRPC: fix krb5p mount to provide large enough buffer in rq_rcvsize iommu/vt-d: Fix mm reference leak iommu/virtio: Fix freeing of incomplete domains drm/vc4: Fix HDMI mode validation um: falloc.h needs to be directly included for older libc ACPICA: Fixes for acpiExec namespace init file f2fs: fix NULL pointer dereference in f2fs_write_begin() csky: Fixup get wrong psr value from phyical reg NFS: Fix memory leaks in nfs_pageio_stop_mirroring() drm/amdkfd: kfree the wrong pointer csky: Fixup cpu speculative execution to IO area x86: ACPI: fix CPU hotplug deadlock leds: core: Fix warning message when init_data drm/nouveau: workaround runpm fail by disabling PCI power management on certain intel bridges KVM: s390: vsie: Fix possible race when shadowing region 3 tables compiler.h: fix error in BUILD_BUG_ON() reporting percpu_counter: fix a data race at vm_committed_as include/linux/swapops.h: correct guards for non_swap_entry() drm/nouveau/svm: fix vma range check for migration drm/nouveau/svm: check for SVM initialized before migrating mm/hugetlb: fix build failure with HUGETLB_PAGE but not HUGEBTLBFS cifs: Allocate encryption header through kmalloc um: ubd: Prevent buffer overrun on command completion ext4: do not commit super on read-only bdev s390/cpum_sf: Fix wrong page count in error message powerpc/maple: Fix declaration made after definition powerpc/prom_init: Pass the "os-term" message to hypervisor btrfs: add RCU locks around block group initialization hibernate: Allow uswsusp to write to swap s390/cpuinfo: fix wrong output when CPU0 is offline f2fs: Add a new CP flag to help fsck fix resize SPO issues f2fs: Fix mount failure due to SPO after a successful online resize FS NFS: direct.c: Fix memory leak of dreq when nfs_get_lock_context fails phy: uniphier-usb3ss: Add Pro5 support f2fs: fix to show norecovery mount option KVM: PPC: Book3S HV: Fix H_CEDE return code for nested guests ARM: dts: rockchip: fix lvds-encoder ports subnode for rk3188-bqedison2qc NFSv4.2: error out when relink swapfile NFSv4/pnfs: Return valid stateids in nfs_layout_find_inode_by_stateid() NFS: alloc_nfs_open_context() must use the file cred when available rtc: 88pm860x: fix possible race condition dma-coherent: fix integer overflow in the reserved-memory dma allocation soc: imx: gpc: fix power up sequencing arm64: dts: clearfog-gt-8k: set gigabit PHY reset deassert delay arm64: tegra: Fix Tegra194 PCIe compatible string arm64: tegra: Add PCIe endpoint controllers nodes for Tegra194 clk: tegra: Fix Tegra PMC clock out parents power: supply: bq27xxx_battery: Silence deferred-probe error arm64: dts: allwinner: a64: Fix display clock register range ARM: dts: rockchip: fix vqmmc-supply property name for rk3188-bqedison2qc f2fs: fix the panic in do_checkpoint() net/mlx5e: Enforce setting of a single FEC mode clk: at91: usb: continue if clk_hw_round_rate() return zero clk: Don't cache errors from clk_ops::get_phase() drm/ttm: flush the fence on the bo after we individualize the reservation object x86/Hyper-V: Free hv_panic_page when fail to register kmsg dump rbd: call rbd_dev_unprobe() after unwatching and flushing notifies rbd: avoid a deadlock on header_rwsem when flushing notifies block, bfq: invoke flush_idle_tree after reparent_active_queues in pd_offline block, bfq: make reparent_leaf_entity actually work only on leaf entities block, bfq: turn put_queue into release_process_ref in __bfq_bic_change_cgroup afs: Fix race between post-modification dir edit and readdir/d_revalidate afs: Fix afs_d_validate() to set the right directory version afs: Fix rename operation status delivery afs: Fix decoding of inline abort codes from version 1 status records afs: Fix missing XDR advance in xdr_decode_{AFS,YFS}FSFetchStatus() x86/Hyper-V: Report crash data in die() when panic_on_oops is set x86/Hyper-V: Report crash register data when sysctl_record_panic_msg is not set x86/Hyper-V: Report crash register data or kmsg before running crash kernel x86/Hyper-V: Trigger crash enlightenment only once during system crash. x86/Hyper-V: Unload vmbus channel in hv panic callback of: overlay: kmemleak in dup_and_fixup_symbol_prop() of: unittest: kmemleak in of_unittest_overlay_high_level() of: unittest: kmemleak in of_unittest_platform_populate() of: unittest: kmemleak on changeset destroy xsk: Add missing check on user supplied headroom size ALSA: hda: Don't release card at firmware loading error irqchip/mbigen: Free msi_desc on device teardown netfilter: nf_tables: report EOPNOTSUPP on unsupported flags/object type kbuild, btf: Fix dependencies for DEBUG_INFO_BTF ARM: dts: imx6: Use gpc for FEC interrupt controller to fix wake on LAN. ALSA: hda: Honor PM disablement in PM freeze and thaw_noirq ops scsi: sg: add sg_remove_request in sg_common_write objtool: Fix switch table detection in .text.unlikely arm, bpf: Fix offset overflow for BPF_MEM BPF_DW arm, bpf: Fix bugs with ALU64 {RSH, ARSH} BPF_K shift by 0 xsk: Fix out of boundary write in __xsk_rcv_memcpy watchdog: sp805: fix restart handler ext4: use non-movable memory for superblock readahead ANDROID: ABI/Whitelist: update unisoc Whitelist to latest ANDROID: iommu: Kconfig: Make ARM_SMMU depend on QCOM_SCM || !QCOM_SCM ANDROID: GKI: enable CONFIG_DYNAMIC_DEBUG_CORE FROMLIST: BACKPORT: dynamic_debug: Add an option to enable dynamic debug for modules only ANDROID: init: GKI: enable hidden configs for GPU FROMLIST: clocksource/drivers/sprd: Add module support to Spreadtrum timer FROMLIST: drivers/clocksource/timer-of: Remove __init markings UPSTREAM: gpu/trace: add a gpu total memory usage tracepoint Linux 5.4.34 x86/microcode/AMD: Increase microcode PATCH_MAX_SIZE scsi: target: fix hang when multiple threads try to destroy the same iscsi session scsi: target: remove boilerplate code x86/resctrl: Fix invalid attempt at removing the default resource group x86/resctrl: Preserve CDP enable over CPU hotplug irqchip/ti-sci-inta: Fix processing of masked irqs ext4: do not zeroout extents beyond i_disksize i2c: designware: platdrv: Remove DPM_FLAG_SMART_SUSPEND flag on BYT and CHT drm/amdgpu: fix the hw hang during perform system reboot and reset drm/amd/powerplay: force the trim of the mclk dpm_levels if OD is enabled net/mlx5e: Use preactivate hook to set the indirection table net/mlx5e: Rename hw_modify to preactivate net/mlx5e: Encapsulate updating netdev queues into a function mac80211_hwsim: Use kstrndup() in place of kasprintf() mac80211: fix race in ieee80211_register_hw() nl80211: fix NL80211_ATTR_FTM_RESPONDER policy btrfs: check commit root generation in should_ignore_root tracing: Fix the race between registering 'snapshot' event trigger and triggering 'snapshot' operation keys: Fix proc_keys_next to increase position index arm64: vdso: don't free unallocated pages ALSA: usb-audio: Check mapping at creating connector controls, too ALSA: usb-audio: Don't create jack controls for PCM terminals ALSA: usb-audio: Don't override ignore_ctl_error value from the map ALSA: usb-audio: Filter error from connector kctl ops, too ALSA: hda/realtek - Enable the headset mic on Asus FX505DT ASoC: Intel: mrfld: return error codes when an error occurs ASoC: Intel: mrfld: fix incorrect check on p->sink usb: dwc3: gadget: Don't clear flags before transfer ended arm64: dts: librem5-devkit: add a vbus supply to usb0 ARM: dts: imx7-colibri: fix muxing of usbc_det pin clk: at91: usb: use proper usbs_mask clk: at91: sam9x60: fix usb clock parents ext4: fix incorrect inodes per group in error message ext4: fix incorrect group count in ext4_fill_super error message net/bpfilter: remove superfluous testing message pwm: pca9685: Fix PWM/GPIO inter-operation perf report: Fix no branch type statistics report issue acpi/nfit: improve bounds checking for 'func' jbd2: improve comments about freeing data buffers whose page mapping is NULL platform/chrome: cros_ec_rpmsg: Fix race with host event scsi: ufs: Fix ufshcd_hold() caused scheduling while atomic ovl: fix value of i_ino for lower hardlink corner case Revert "ACPI: EC: Do not clear boot_ec_is_ecdt in acpi_ec_add()" net: stmmac: dwmac-sunxi: Provide TX and RX fifo sizes net/mlx5e: Fix pfnum in devlink port attribute net/mlx5e: Fix nest_level for vlan pop action net/mlx5e: Add missing release firmware call net/mlx5: Fix frequent ioread PCI access during recovery net: ethernet: mediatek: move mt7623 settings out off the mt7530 net: dsa: mt7530: move mt7623 settings out off the mt7530 net: tun: record RX queue in skb before do_xdp_generic() net: revert default NAPI poll timeout to 2 jiffies net: qrtr: send msgs from local of same id as broadcast net: phy: micrel: use genphy_read_status for KSZ9131 net: ipv6: do not consider routes via gateways for anycast address check net: ipv4: devinet: Fix crash when add/del multicast IP with autojoin net: dsa: mt7530: fix tagged frames pass-through in VLAN-unaware mode l2tp: Allow management of tunnels and session in user namespace hsr: check protocol version in hsr_newlink() amd-xgbe: Use __napi_schedule() in BH context crypto: msm: change clock operation in qcedev driver ANDROID: Add C protos for dma_buf/drm_prime get_uuid f2fs: fix quota_sync failure due to f2fs_lock_op f2fs: support read iostat f2fs: Fix the accounting of dcc->undiscard_blks f2fs: fix to handle error path of f2fs_ra_meta_pages() f2fs: report the discard cmd errors properly f2fs: fix long latency due to discard during umount f2fs: add tracepoint for f2fs iostat f2fs: introduce sysfs/data_io_flag to attach REQ_META/FUA ANDROID: GKI: update abi for 5.4.33 changes Linux 5.4.33 scsi: lpfc: fix inlining of lpfc_sli4_cleanup_poll_list() ASoC: stm32: sai: Add missing cleanup efi/x86: Fix the deletion of variables in mixed mode mfd: dln2: Fix sanity checking for endpoints bpf: Fix tnum constraints for 32-bit comparisons mmc: sdhci: Refactor sdhci_set_timeout() mmc: sdhci: Convert sdhci_set_timeout_irq() to non-static powerpc/kasan: Fix kasan_remap_early_shadow_ro() drm/i915/icl+: Don't enable DDI IO power on a TypeC port in TBT mode drm/amdgpu: fix gfx hang during suspend with video playback (v2) drm/dp_mst: Fix clearing payload state on topology disable Revert "drm/dp_mst: Remove VCPI while disabling topology mgr" scsi: lpfc: Fix broken Credit Recovery after driver load scsi: lpfc: Fix configuration of BB credit recovery in service parameters scsi: lpfc: Fix Fabric hostname registration if system hostname changes scsi: lpfc: Add registration for CPU Offline/Online events dm clone: Add missing casts to prevent overflows and data corruption dm clone: Fix handling of partial region discards dm clone: replace spin_lock_irqsave with spin_lock_irq dm zoned: remove duplicate nr_rnd_zones increase in dmz_init_zone() arm64: Always force a branch protection mode when the compiler has one powerpc: Make setjmp/longjmp signature standard scsi: mpt3sas: Fix kernel panic observed on soft HBA unplug powerpc/64: Prevent stack protection in early boot powerpc/kprobes: Ignore traps that happened in real mode powerpc/xive: Fix xmon support on the PowerNV platform powerpc/64: Setup a paca before parsing device tree etc. powerpc/xive: Use XIVE_BAD_IRQ instead of zero to catch non configured IPIs powerpc/hash64/devmap: Use H_PAGE_THP_HUGE when setting up huge devmap PTE entries powerpc/fsl_booke: Avoid creating duplicate tlb1 entry powerpc/64/tm: Don't let userspace set regs->trap via sigreturn xen/blkfront: fix memory allocation flags in blkfront_setup_indirect() ipmi: fix hung processes in __get_guid() libata: Return correct status in sata_pmp_eh_recover_pm() when ATA_DFLAG_DETACH is set hfsplus: fix crash and filesystem corruption when deleting files cpufreq: powernv: Fix use-after-free kmod: make request_module() return an error when autoloading is disabled clk: ingenic/TCU: Fix round_rate returning error clk: ingenic/jz4770: Exit with error if CGU init failed ftrace/kprobe: Show the maxactive number on kprobe_events Input: i8042 - add Acer Aspire 5738z to nomux list s390/diag: fix display of diagnose call statistics perf tools: Support Python 3.8+ in Makefile ocfs2: no need try to truncate file beyond i_size fs/filesystems.c: downgrade user-reachable WARN_ONCE() to pr_warn_once() ext4: fix a data race at inode->i_blocks NFS: Fix a page leak in nfs_destroy_unlinked_subrequests() NFS: Fix use-after-free issues in nfs_pageio_add_request() nfsd: fsnotify on rmdir under nfsd/clients/ powerpc/pseries: Avoid NULL pointer dereference when drmem is unavailable drm/amdgpu: unify fw_write_wait for new gfx9 asics drm/amdgpu/powerplay: using the FCLK DPM table to set the MCLK drm: Remove PageReserved manipulation from drm_pci_alloc drm/etnaviv: rework perfmon query infrastructure drm/i915/gem: Flush all the reloc_gpu batch vfio: platform: Switch to platform_get_irq_optional() selftests/powerpc: Add tlbie_test in .gitignore selftests/vm: fix map_hugetlb length used for testing read and write selftests: vm: drop dependencies on page flags from mlock2 tests arm64: armv8_deprecated: Fix undef_hook mask for thumb setend arm64: dts: ti: k3-am65: Add clocks to dwc3 nodes ARM: dts: exynos: Fix polarity of the LCD SPI bus on UniversalC210 board scsi: lpfc: Fix lpfc_io_buf resource leak in lpfc_get_scsi_buf_s4 error path scsi: ufs: fix Auto-Hibern8 error detection scsi: zfcp: fix missing erp_lock in port recovery trigger for point-to-point crypto: ccree - dec auth tag size from cryptlen map crypto: ccree - only try to map auth tag if needed crypto: ccree - protect against empty or NULL scatterlists crypto: caam - update xts sector size for large input length crypto: caam/qi2 - fix chacha20 data size error xarray: Fix early termination of xas_for_each_marked XArray: Fix xas_pause for large multi-index entries dm clone metadata: Fix return type of dm_clone_nr_of_hydrated_regions() dm clone: Add overflow check for number of regions dm verity fec: fix memory leak in verity_fec_dtr dm integrity: fix a crash with unusually large tag size dm writecache: add cond_resched to avoid CPU hangs mm, memcg: do not high throttle allocators based on wraparound arm64: dts: allwinner: h5: Fix PMU compatible sched/core: Remove duplicate assignment in sched_tick_remote() arm64: dts: allwinner: h6: Fix PMU compatible net: qualcomm: rmnet: Allow configuration updates to existing devices tools: gpio: Fix out-of-tree build regression powerpc/pseries: Drop pointless static qualifier in vpa_debugfs_init() mmc: sdhci-of-esdhc: fix esdhc_reset() for different controller versions io_uring: honor original task RLIMIT_FSIZE erofs: correct the remaining shrink objects crypto: mxs-dcp - fix scatterlist linearization for hash crypto: rng - Fix a refcounting bug in crypto_rng_reset() remoteproc: Fix NULL pointer dereference in rproc_virtio_notify remoteproc: qcom_q6v5_mss: Reload the mba region on coredump remoteproc: qcom_q6v5_mss: Don't reassign mpss region on shutdown btrfs: use nofs allocations for running delayed items btrfs: fix missing semaphore unlock in btrfs_sync_file btrfs: unset reloc control if we fail to recover btrfs: fix missing file extent item for hole after ranged fsync btrfs: drop block from cache on error in relocation btrfs: set update the uuid generation as soon as possible btrfs: reloc: clean dirty subvols if we fail to start a transaction Btrfs: fix crash during unmount due to race with delayed inode workers btrfs: Don't submit any btree write bio if the fs has errors mtd: spinand: Do not erase the block before writing a bad block marker mtd: spinand: Stop using spinand->oobbuf for buffering bad block markers CIFS: Fix bug which the return value by asynchronous read is error smb3: fix performance regression with setting mtime KVM: VMX: fix crash cleanup when KVM wasn't used KVM: VMX: Add a trampoline to fix VMREAD error handling KVM: x86: Gracefully handle __vmalloc() failure during VM allocation KVM: VMX: Always VMCLEAR in-use VMCSes during crash with kexec support KVM: x86: Allocate new rmap and large page tracking when moving memslot KVM: s390: vsie: Fix delivery of addressing exceptions KVM: s390: vsie: Fix region 1 ASCE sanity shadow address checks KVM: nVMX: Properly handle userspace interrupt window request platform/x86: asus-wmi: Support laptops where the first battery is named BATT x86/entry/32: Add missing ASM_CLAC to general_protection entry x86/tsc_msr: Make MSR derived TSC frequency more accurate x86/tsc_msr: Fix MSR_FSB_FREQ mask for Cherry Trail devices x86/tsc_msr: Use named struct initializers signal: Extend exec_id to 64bits ath9k: Handle txpower changes even when TPC is disabled PM: sleep: wakeup: Skip wakeup_source_sysfs_remove() if device is not there PM / Domains: Allow no domain-idle-states DT property in genpd when parsing MIPS: OCTEON: irq: Fix potential NULL pointer dereference MIPS/tlbex: Fix LDDIR usage in setup_pw() for Loongson-3 pstore: pstore_ftrace_seq_next should increase position index io_uring: remove bogus RLIMIT_NOFILE check in file registration irqchip/versatile-fpga: Apply clear-mask earlier genirq/debugfs: Add missing sanity checks to interrupt injection cpu/hotplug: Ignore pm_wakeup_pending() for disable_nonboot_cpus() KEYS: reaching the keys quotas correctly tpm: tpm2_bios_measurements_next should increase position index tpm: tpm1_bios_measurements_next should increase position index tpm: Don't make log failures fatal sched/fair: Fix enqueue_task_fair warning PCI: endpoint: Fix for concurrent memory allocation in OB address region PCI: qcom: Fix the fixup of PCI_VENDOR_ID_QCOM PCI: Add boot interrupt quirk mechanism for Xeon chipsets PCI/ASPM: Clear the correct bits when enabling L1 substates PCI: pciehp: Fix indefinite wait on sysfs requests efi/x86: Add TPM related EFI tables to unencrypted mapping checks nvme-fc: Revert "add module to ops template to allow module references" nvmet-tcp: fix maxh2cdata icresp parameter thermal: devfreq_cooling: inline all stubs for CONFIG_DEVFREQ_THERMAL=n ACPI: PM: s2idle: Refine active GPEs check ACPICA: Allow acpi_any_gpe_status_set() to skip one GPE acpi/x86: ignore unspecified bit positions in the ACPI global lock field seccomp: Add missing compat_ioctl for notify media: ti-vpe: cal: fix a kernel oops when unloading module media: ti-vpe: cal: fix disable_irqs to only the intended target media: hantro: Read be32 words starting at every fourth byte media: venus: firmware: Ignore secure call error on first resume ALSA: hda/realtek - Add quirk for MSI GL63 ALSA: hda/realtek - Add quirk for Lenovo Carbon X1 8th gen ALSA: hda/realtek - Remove now-unnecessary XPS 13 headphone noise fixups ALSA: hda/realtek - Set principled PC Beep configuration for ALC256 ALSA: doc: Document PC Beep Hidden Register on Realtek ALC256 ALSA: hda/realtek - a fake key event is triggered by running shutup ALSA: hda/realtek: Enable mute LED on an HP system ALSA: pcm: oss: Fix regression by buffer overflow fix ALSA: ice1724: Fix invalid access for enumerated ctl items ALSA: hda: Fix potential access overflow in beep helper ALSA: hda: Add driver blacklist ALSA: usb-audio: Add mixer workaround for TRX40 and co usb: gadget: composite: Inform controller driver of self-powered usb: gadget: f_fs: Fix use after free issue as part of queue failure ASoC: topology: use name_prefix for new kcontrol ASoC: dpcm: allow start or stop during pause for backend ASoC: dapm: connect virtual mux with default value ASoC: fix regwmask btrfs: track reloc roots based on their commit root bytenr btrfs: restart relocate_tree_blocks properly btrfs: remove a BUG_ON() from merge_reloc_roots() btrfs: qgroup: ensure qgroup_rescan_running is only set when the worker is at least queued block, bfq: fix use-after-free in bfq_idle_slice_timer_body locking/lockdep: Avoid recursion in lockdep_count_{for,back}ward_deps() spi: spi-fsl-dspi: Replace interruptible wait queue with a simple completion firmware: fix a double abort case with fw_load_sysfs_fallback md: check arrays is suspended in mddev_detach before call quiesce operations irqchip/gic-v4: Provide irq_retrigger to avoid circular locking dependency usb: dwc3: core: add support for disabling SS instances in park mode media: i2c: ov5695: Fix power on and off sequences block: Fix use-after-free issue accessing struct io_cq genirq/irqdomain: Check pointer in irq_domain_alloc_irqs_hierarchy() efi/x86: Ignore the memory attributes table on i386 x86/boot: Use unsigned comparison for addresses cpufreq: imx6q: fix error handling gfs2: Don't demote a glock until its revokes are written gfs2: Do log_flush in gfs2_ail_empty_gl even if ail list is empty pstore/platform: fix potential mem leak if pstore_init_fs failed libata: Remove extra scsi_host_put() in ata_scsi_add_hosts() media: i2c: video-i2c: fix build errors due to 'imply hwmon' block, bfq: move forward the getting of an extra ref in bfq_bfqq_move PCI/switchtec: Fix init_completion race condition with poll_wait() selftests/x86/ptrace_syscall_32: Fix no-vDSO segfault sched: Avoid scale real weight down to zero media: allegro: fix type of gop_length in channel_create message time/sched_clock: Expire timer in hardirq context irqchip/versatile-fpga: Handle chained IRQs properly debugfs: Check module state before warning in {full/open}_proxy_open() block: keep bdi->io_pages in sync with max_sectors_kb for stacked devices dma-mapping: Fix dma_pgprot() for unencrypted coherent pages x86: Don't let pgprot_modify() change the page encryption bit ACPI: EC: Do not clear boot_ec_is_ecdt in acpi_ec_add() xhci: bail out early if driver can't accress host in resume media: imx: imx7-media-csi: Fix video field handling media: imx: imx7_mipi_csis: Power off the source when stopping streaming null_blk: fix spurious IO errors after failed past-wp access null_blk: Handle null_add_dev() failures properly null_blk: Fix the null_add_dev() error path firmware: arm_sdei: fix double-lock on hibernate with shared events media: venus: hfi_parser: Ignore HEVC encoding for V1 staging: wilc1000: avoid double unlocking of 'wilc->hif_cs' mutex cpufreq: imx6q: Fixes unwanted cpu overclocking on i.MX6ULL media: rc: add keymap for Videostrong KII Pro i2c: pca-platform: Use platform_irq_get_optional i2c: st: fix missing struct parameter description qlcnic: Fix bad kzalloc null test cfg80211: Do not warn on same channel at the end of CSA drm/scheduler: fix rare NULL ptr race cxgb4/ptp: pass the sign of offset delta in FW CMD selftests/net: add definition for SOL_DCCP to fix compilation errors for old libc hinic: fix wrong value of MIN_SKB_LEN hinic: fix wrong para of wait_for_completion_timeout hinic: fix out-of-order excution in arm cpu hinic: fix the bug of clearing event queue hinic: fix a bug of waitting for IO stopped net: vxge: fix wrong __VA_ARGS__ usage net: stmmac: platform: Fix misleading interrupt error msg rxrpc: Fix call interruptibility handling rxrpc: Abstract out the calculation of whether there's Tx space soc: fsl: dpio: register dpio irq handlers after dpio create Input: tm2-touchkey - add support for Coreriver TC360 variant iwlwifi: mvm: Fix rate scale NSS configuration bpf: Fix deadlock with rq_lock in bpf_send_signal() ARM: dts: Fix dm814x Ethernet by changing to use rgmii-id mode bus: sunxi-rsb: Return correct data when mixing 16-bit and 8-bit reads ARM: dts: sun8i-a83t-tbs-a711: HM5065 doesn't like such a high voltage ANDROID: GKI: ABI update for dma-buf/DRM get_uuid change ANDROID: ABI/Whitelist: update for db845c after changing drivers to modules. ANDROID: Switch CONFIG_QCOM_PDC CONFIG_QCOM_SCM and CONFIG_ARM_SMMU to be loaded as modules ANDROID: firmware: QCOM_SCM: Allow qcom_scm driver to be loadable as a permenent module ANDROID: irqchip: Allow QCOM_PDC to be loadable as a perment module ANDROID: irq: irqchip: Export irq_chip_retrigger_hierarchy and irq_chip_set_vcpu_affinity_parent ANDROID: irq: irqdomain: Export irq_domain_update_bus_token ANDROID: GKI: Add DRM_TTM config to GKI FROMLIST: drm/prime: add support for virtio exported objects FROMLIST: dma-buf: add support for virtio exported objects ANDROID: Incremental fs: Fix create_file performance UPSTREAM: Merge remote-tracking branch 'aosp/upstream-f2fs-stable-linux-5.4.y' into android-5.4 (v5.7-rc1) ANDROID: fix allmodconfig build to use the right toolchain ANDROID: Incremental fs: Fix compound page usercopy crash ANDROID: Incremental fs: Clean up incfs_test build process ANDROID: Incremental fs: make remount log buffer change atomic ANDROID: Incremental fs: Optimize get_filled_block ANDROID: Incremental fs: Fix mislabeled __user ptrs ANDROID: Incremental fs: Use 64-bit int for file_size when writing hash blocks Linux 5.4.32 iommu/vt-d: Allow devices with RMRRs to use identity domain drm/i915: Fix ref->mutex deadlock in i915_active_wait() fbcon: fix null-ptr-deref in fbcon_switch blk-mq: Keep set->nr_hw_queues and set->map[].nr_queues in sync RDMA/cm: Update num_paths in cma_resolve_iboe_route error flow Bluetooth: RFCOMM: fix ODEBUG bug in rfcomm_dev_ioctl RDMA/siw: Fix passive connection establishment RDMA/cma: Teach lockdep about the order of rtnl and lock RDMA/ucma: Put a lock around every call to the rdma_cm layer include/uapi/linux/swab.h: fix userspace breakage, use __BITS_PER_LONG for swap ceph: canonicalize server path in place ceph: remove the extra slashes in the server path ARM: imx: only select ARM_ERRATA_814220 for ARMv7-A ARM: imx: Enable ARM_ERRATA_814220 for i.MX6UL and i.MX7D IB/mlx5: Replace tunnel mpls capability bits for tunnel_offloads IB/hfi1: Fix memory leaks in sysfs registration and unregistration IB/hfi1: Call kobject_put() when kobject_init_and_add() fails ASoC: jz4740-i2s: Fix divider written at incorrect offset in register platform/x86: intel_int0002_vgpio: Use acpi_register_wakeup_handler() ACPI: PM: Add acpi_[un]register_wakeup_handler() hwrng: imx-rngc - fix an error path tools/accounting/getdelays.c: fix netlink attribute length slub: improve bit diffusion for freelist ptr obfuscation uapi: rename ext2_swab() to swab() and share globally in swab.h usb: dwc3: gadget: Wrap around when skip TRBs random: always use batched entropy for get_random_u{32,64} s390: prevent leaking kernel address in BEAR r8169: change back SG and TSO to be disabled by default mlxsw: spectrum_flower: Do not stop at FLOW_ACTION_VLAN_MANGLE tun: Don't put_page() for all negative return values from XDP program slcan: Don't transmit uninitialized stack data in padding net: stmmac: dwmac1000: fix out-of-bounds mac address reg setting net_sched: fix a missing refcnt in tcindex_init() net_sched: add a temporary refcnt for struct tcindex_data net: phy: micrel: kszphy_resume(): add delay after genphy_resume() before accessing PHY registers net: dsa: mt7530: fix null pointer dereferencing in port5 setup net: dsa: bcm_sf2: Ensure correct sub-node is parsed net: dsa: bcm_sf2: Do not register slave MDIO bus with OF ipv6: don't auto-add link-local address to lag ports cxgb4: fix MPS index overwrite when setting MAC address net: phy: realtek: fix handling of RTL8105e-integrated PHY ANDROID: ABI/Whitelist: add display whitelist to unisoc whitelist ANDROID: Kconfig.gki Add SND_SOC_TOPOLOGY ANDROID: GKI: enable CONFIG_ARM_PSCI_CPUIDLE ANDROID: power: wakeup_reason: wake reason enhancements UPSTREAM: cpufreq: Make cpufreq_global_kobject static ANDROID: staging: ion: implement vmap for built-in heaps ANDROID: KABI: Update kABI after dropping CONFIG_PCIEPORTBUS from gki_defconfig ANDROID: gki_defconfig: Drop CONFIG_PCIEPORTBUS pci: pci-msm-msi: Re-name irq chip name for the driver ubifs: wire up FS_IOC_GET_ENCRYPTION_NONCE f2fs: wire up FS_IOC_GET_ENCRYPTION_NONCE ext4: wire up FS_IOC_GET_ENCRYPTION_NONCE fscrypt: add FS_IOC_GET_ENCRYPTION_NONCE ioctl FROMLIST: power_supply: Add additional health properties to the header UPSTREAM: power: supply: core: Update sysfs-class-power ABI document ANDROID: GKI: update ABI for mmc changes UPSTREAM: mmc: sdhci-sprd: Set the missing MMC_CAP_WAIT_WHILE_BUSY flag UPSTREAM: mmc: host: hsq: Add missing MODULE_LICENSE() and MODULE_DESCRIPTION() UPSTREAM: mmc: host: sdhci-sprd: Add software queue support UPSTREAM: mmc: host: sdhci: Add a variable to defer to complete requests if needed UPSTREAM: mmc: host: sdhci: Add request_done ops for struct sdhci_ops UPSTREAM: mmc: core: Enable the MMC host software queue for the SD card UPSTREAM: mmc: Add MMC host software queue support FROMGIT: kbuild: mkcompile_h: Include $LD version in /proc/version ANDROID: ignore compiler tag __must_check for GENKSYMS UPSTREAM: mfd: sc27xx: Add USB charger type detection support UPSTREAM: Revert "gpio: eic-sprd: Use devm_platform_ioremap_resource()" UPSTREAM: pinctrl: sprd: Add pin high impedance mode support UPSTREAM: pinctrl: sprd: Use the correct pin output configuration UPSTREAM: nvmem: sprd: Determine double data programming from device data UPSTREAM: nvmem: sprd: Optimize the block lock operation UPSTREAM: nvmem: sprd: Fix the block lock operation UPSTREAM: dmaengine: sprd: Set request pending flag when DMA controller is active Linux 5.4.31 mm: mempolicy: require at least one nodeid for MPOL_PREFERRED padata: always acquire cpu_hotplug_lock before pinst->lock net: Fix Tx hash bound checking i2c: i801: Do not add ICH_RES_IO_SMI for the iTCO_wdt device watchdog: iTCO_wdt: Make ICH_RES_IO_SMI optional watchdog: iTCO_wdt: Export vendorsupport tcp: fix TFO SYNACK undo to avoid double-timestamp-undo IB/hfi1: Ensure pq is not left on waitlist rxrpc: Fix sendmsg(MSG_WAITALL) handling iwlwifi: dbg: don't abort if sending DBGC_SUSPEND_RESUME fails iwlwifi: yoyo: don't add TLV offset when reading FIFOs iwlwifi: consider HE capability when setting LDPC net/mlx5e: kTLS, Fix wrong value in record tracker enum soc: mediatek: knows_txdone needs to be set in Mediatek CMDQ helper ALSA: hda/ca0132 - Add Recon3Di quirk to handle integrated sound on EVGA X99 Classified motherboard Revert "dm: always call blk_queue_split() in dm_process_bio()" power: supply: axp288_charger: Add special handling for HP Pavilion x2 10 extcon: axp288: Add wakeup support nvmem: check for NULL reg_read and reg_write before dereferencing mei: me: add cedar fork device ids coresight: do not use the BIT() macro in the UAPI header PCI: sysfs: Revert "rescan" file renames misc: pci_endpoint_test: Avoid using module parameter to determine irqtype misc: pci_endpoint_test: Fix to support > 10 pci-endpoint-test devices misc: rtsx: set correct pcr_ops for rts522A brcmfmac: abort and release host after error padata: fix uninitialized return value in padata_replace() XArray: Fix xa_find_next for large multi-index entries net/mlx5e: kTLS, Fix TCP seq off-by-1 issue in TX resync flow tools/power turbostat: Fix 32-bit capabilities warning tools/power turbostat: Fix missing SYS_LPI counter on some Chromebooks tools/power turbostat: Fix gcc build warnings drm/amdgpu: fix typo for vcn1 idle check initramfs: restore default compression behavior drm/bochs: downgrade pci_request_region failure from error to warning drm/amd/display: Add link_rate quirk for Apple 15" MBP 2017 kconfig: introduce m32-flag and m64-flag nvme-rdma: Avoid double freeing of async event data ANDROID: GKI: update ABI for SCHED_AUTOGROUP removal ANDROID: GKI: Remove SCHED_AUTOGROUP ANDROID: fscrypt: fall back to filesystem-layer crypto when needed ANDROID: block: require drivers to declare supported crypto key type(s) ANDROID: block: make blk_crypto_start_using_mode() properly check for support lib: stackdepot: Add support to configure STACK_HASH_SIZE mm: workingset: remove zero-seek setting for shadow node shrinker ANDROID: GKI: defconfig: modify debug configs ANDROID: kbuild: ensure __cfi_check is correctly aligned f2fs: keep inline_data when compression conversion f2fs: fix to disable compression on directory f2fs: add missing CONFIG_F2FS_FS_COMPRESSION f2fs: switch discard_policy.timeout to bool type f2fs: fix to verify tpage before releasing in f2fs_free_dic() f2fs: show compression in statx f2fs: clean up dic->tpages assignment f2fs: compress: support zstd compress algorithm f2fs: compress: add .{init,destroy}_decompress_ctx callback f2fs: compress: fix to call missing destroy_compress_ctx() f2fs: change default compression algorithm f2fs: clean up {cic,dic}.ref handling f2fs: fix to use f2fs_readpage_limit() in f2fs_read_multi_pages() f2fs: xattr.h: Make stub helpers inline f2fs: fix to avoid double unlock f2fs: fix potential .flags overflow on 32bit architecture f2fs: fix NULL pointer dereference in f2fs_verity_work() f2fs: fix to clear PG_error if fsverity failed f2fs: don't call fscrypt_get_encryption_info() explicitly in f2fs_tmpfile() f2fs: don't trigger data flush in foreground operation f2fs: fix NULL pointer dereference in f2fs_write_begin() f2fs: clean up f2fs_may_encrypt() f2fs: fix to avoid potential deadlock f2fs: don't change inode status under page lock f2fs: fix potential deadlock on compressed quota file f2fs: delete DIO read lock f2fs: don't mark compressed inode dirty during f2fs_iget() FROMLIST: kmod: make request_module() return an error when autoloading is disabled UPSTREAM: loop: Only freeze block queue when needed. UPSTREAM: loop: Only change blocksize when needed. ANDROID: GKI: Fix ABI for CMA page allocation ANDROID: GKI: mm: add cma pcp list ANDROID: GKI: cma: redirect page allocation to CMA ANDROID: Fix wq fp check for CFI builds ANDROID: Incremental fs: Fix remount ANDROID: Incremental fs: Protect get_fill_block, and add a field ANDROID: Incremental fs: Fix crash polling 0 size read_log ANDROID: Incremental fs: get_filled_blocks: better index_out UPSTREAM: sched/rt: cpupri_find: Trigger a full search as fallback UPSTREAM: sched/rt: Remove unnecessary push for unfit tasks UPSTREAM: sched/rt: Allow pulling unfitting task UPSTREAM: sched/rt: Optimize cpupri_find() on non-heterogenous systems UPSTREAM: sched/rt: Re-instate old behavior in select_task_rq_rt() UPSTREAM: sched/rt: cpupri_find: Implement fallback mechanism for !fit case ANDROID: staging: ion: move definition of attachment ANDROID: Incremental fs: Fix four resource bugs Linux 5.4.30 arm64: dts: ls1046ardb: set RGMII interfaces to RGMII_ID mode arm64: dts: ls1043a-rdb: correct RGMII delay mode to rgmii-id ARM: dts: sun8i: r40: Move AHCI device node based on address order ARM: dts: N900: fix onenand timings ARM: dts: imx6: phycore-som: fix arm and soc minimum voltage ARM: bcm2835-rpi-zero-w: Add missing pinctrl name ARM: dts: oxnas: Fix clear-mask property perf map: Fix off by one in strncpy() size argument arm64: alternative: fix build with clang integrated assembler libceph: fix alloc_msg_with_page_vector() memory leaks clk: ti: am43xx: Fix clock parent for RTC clock clk: imx: Align imx sc clock parent msg structs to 4 clk: imx: Align imx sc clock msg structs to 4 net: ks8851-ml: Fix IO operations, again gpiolib: acpi: Add quirk to ignore EC wakeups on HP x2 10 CHT + AXP288 model bpf: Explicitly memset some bpf info structures declared on the stack bpf: Explicitly memset the bpf_attr structure platform/x86: pmc_atom: Add Lex 2I385SW to critclk_systems DMI table vt: vt_ioctl: fix use-after-free in vt_in_use() vt: vt_ioctl: fix VT_DISALLOCATE freeing in-use virtual console vt: vt_ioctl: remove unnecessary console allocation checks vt: switch vt_dont_switch to bool vt: ioctl, switch VT_IS_IN_USE and VT_BUSY to inlines vt: selection, introduce vc_is_sel serial: sprd: Fix a dereference warning mac80211: fix authentication with iwlwifi/mvm mac80211: Check port authorization in the ieee80211_tx_dequeue() case ANDROID: 5.4.29 ABI update ANDROID: GKI: remove kernel_read/write from whitelists ANDROID: GKI: Fix ABI for scsi/ufs patches FROMGIT: scsi: ufs-qcom: Override devfreq parameters BACKPORT: FROMGIT: scsi: ufshcd: Let vendor override devfreq parameters FROMGIT: scsi: ufshcd: Update the set frequency to devfreq FROMLIST: scsi: ufs: full reinit upon resume if link was off FROMGIT: scsi: ufs: set device as active power mode after resetting device FROMGIT: scsi: ufs: Enable block layer runtime PM for well-known logical units UPSTREAM: scsi: ufs: Fix possible unclocked access to auto hibern8 timer register ANDROID: db845c build: Use merge_configs ANDROID: ABI/Whitelist: update whitelist of unisoc Linux 5.4.29 net: Fix CONFIG_NET_CLS_ACT=n and CONFIG_NFT_FWD_NETDEV={y, m} build media: v4l2-core: fix a use-after-free bug of sd->devnode media: xirlink_cit: add missing descriptor sanity checks media: stv06xx: add missing descriptor sanity checks media: dib0700: fix rc endpoint lookup media: ov519: add missing endpoint sanity checks libfs: fix infoleak in simple_attr_read() ahci: Add Intel Comet Lake H RAID PCI ID staging: wlan-ng: fix use-after-free Read in hfa384x_usbin_callback staging: wlan-ng: fix ODEBUG bug in prism2sta_disconnect_usb staging: rtl8188eu: Add ASUS USB-N10 Nano B1 to device table staging: kpc2000: prevent underflow in cpld_reconfigure() media: usbtv: fix control-message timeouts media: flexcop-usb: fix endpoint sanity check usb: musb: fix crash with highmen PIO and usbmon USB: serial: io_edgeport: fix slab-out-of-bounds read in edge_interrupt_callback USB: cdc-acm: restore capability check order USB: serial: option: add Wistron Neweb D19Q1 USB: serial: option: add BroadMobi BM806U USB: serial: option: add support for ASKEY WWHC050 bpf: Undo incorrect __reg_bound_offset32 handling clocksource/drivers/hyper-v: Untangle stimers and timesync from clocksources r8169: fix PHY driver check on platforms w/o module softdeps vti6: Fix memory leak of skb if input policy check fails ARM: dts: sun8i-a83t-tbs-a711: Fix USB OTG mode detection bpf, sockmap: Remove bucket->lock from sock_{hash|map}_free bpf/btf: Fix BTF verification of enum members in struct/union bpf: Initialize storage pointers to NULL to prevent freeing garbage pointer bpf, x32: Fix bug with JMP32 JSET BPF_X checking upper bits i2c: nvidia-gpu: Handle timeout correctly in gpu_i2c_check_status() netfilter: nft_fwd_netdev: allow to redirect to ifb via ingress netfilter: nft_fwd_netdev: validate family and chain type netfilter: flowtable: reload ip{v6}h in nf_flow_tuple_ip{v6} mac80211: set IEEE80211_TX_CTRL_PORT_CTRL_PROTO for nl80211 TX ieee80211: fix HE SPR size calculation afs: Fix unpinned address list during probing afs: Fix some tracing details afs: Fix client call Rx-phase signal handling xfrm: policy: Fix doulbe free in xfrm_policy_timer xfrm: add the missing verify_sec_ctx_len check in xfrm_add_acquire xfrm: fix uctx len check in verify_sec_ctx_len RDMA/mlx5: Block delay drop to unprivileged users RDMA/mlx5: Fix access to wrong pointer while performing flush due to error RDMA/mlx5: Fix the number of hwcounters of a dynamic counter vti[6]: fix packet tx through bpf_redirect() in XinY cases xfrm: handle NETDEV_UNREGISTER for xfrm device genirq: Fix reference leaks on irq affinity notifiers afs: Fix handling of an abort from a service handler RDMA/core: Ensure security pkey modify is not lost bpf: Fix cgroup ref leak in cgroup_bpf_inherit on out-of-memory gpiolib: acpi: Add quirk to ignore EC wakeups on HP x2 10 BYT + AXP288 model gpiolib: acpi: Rework honor_wakeup option into an ignore_wake option gpiolib: acpi: Correct comment for HP x2 10 honor_wakeup quirk mm: fork: fix kernel_stack memcg stats for various stack implementations mm/sparse: fix kernel crash with pfn_section_valid check drivers/base/memory.c: indicate all memory blocks as removable mm/swapfile.c: move inode_lock out of claim_swapfile mac80211: mark station unauthorized before key removal mac80211: drop data frames without key on encrypted links nl80211: fix NL80211_ATTR_CHANNEL_WIDTH attribute type scsi: sd: Fix optimal I/O size for devices that change reported values scripts/dtc: Remove redundant YYLOC global declaration tools: Let O= makes handle a relative path with -C option rtlwifi: rtl8188ee: Fix regression due to commitd1d1a96bdb
perf probe: Do not depend on dwfl_module_addrsym() perf probe: Fix to delete multiple probe event x86/ioremap: Fix CONFIG_EFI=n build ARM: dts: omap5: Add bus_dma_limit for L3 bus ARM: dts: dra7: Add bus_dma_limit for L3 bus ceph: fix memory leak in ceph_cleanup_snapid_map() ceph: check POOL_FLAG_FULL/NEARFULL in addition to OSDMAP_FULL/NEARFULL RDMA/mad: Do not crash if the rdma device does not have a umad interface RDMA/nl: Do not permit empty devices names during RDMA_NLDEV_CMD_NEWLINK/SET gpiolib: Fix irq_disable() semantics RDMA/core: Fix missing error check on dev_set_name() IB/rdmavt: Free kernel completion queue when done Input: avoid BIT() macro usage in the serio.h UAPI header Input: synaptics - enable RMI on HP Envy 13-ad105ng Input: fix stale timestamp on key autorepeat events Input: raydium_i2c_ts - fix error codes in raydium_i2c_boot_trigger() i2c: hix5hd2: add missed clk_disable_unprepare in remove iwlwifi: mvm: fix non-ACPI function iommu/vt-d: Populate debugfs if IOMMUs are detected iommu/vt-d: Fix debugfs register reads net: hns3: fix "tc qdisc del" failed issue sxgbe: Fix off by one in samsung driver strncpy size arg dpaa_eth: Remove unnecessary boolean expression in dpaa_get_headroom mac80211: Do not send mesh HWMP PREQ if HWMP is disabled scsi: ipr: Fix softlockup when rescanning devices in petitboot s390/qeth: handle error when backing RX buffer s390/qeth: don't reset default_out_queue iommu/vt-d: Silence RCU-list debugging warnings drm/exynos: Fix cleanup of IOMMU related objects drm/amdgpu: correct ROM_INDEX/DATA offset for VEGA20 drm/amd/display: update soc bb for nv14 fsl/fman: detect FMan erratum A050385 arm64: dts: ls1043a: FMan erratum A050385 dt-bindings: net: FMan erratum A050385 cgroup1: don't call release_agent when it is "" drivers/of/of_mdio.c:fix of_mdiobus_register() cpupower: avoid multiple definition with gcc -fno-common nfs: add minor version to nfs_server_key for fscache cgroup-v1: cgroup_pidlist_next should update position index net/mlx5e: Do not recover from a non-fatal syndrome net/mlx5e: Fix ICOSQ recovery flow with Striding RQ net/mlx5e: Fix missing reset of SW metadata in Striding RQ reset net/mlx5e: Enhance ICOSQ WQE info fields net/mlx5: DR, Fix postsend actions write length hsr: set .netnsok flag hsr: add restart routine into hsr_get_node_list() hsr: use rcu_read_lock() in hsr_get_node_{list/status}() net: ip_gre: Accept IFLA_INFO_DATA-less configuration net: ip_gre: Separate ERSPAN newlink / changelink callbacks bnxt_en: Reset rings if ring reservation fails during open() bnxt_en: Free context memory after disabling PCI in probe error path. bnxt_en: Return error if bnxt_alloc_ctx_mem() fails. bnxt_en: fix memory leaks in bnxt_dcbnl_ieee_getets() bnxt_en: Fix Priority Bytes and Packets counters in ethtool -S. vxlan: check return value of gro_cells_init() tcp: repair: fix TCP_QUEUE_SEQ implementation tcp: ensure skb->dev is NULL before leaving TCP stack tcp: also NULL skb->dev when copy was needed slcan: not call free_netdev before rtnl_unlock in slcan_open r8169: re-enable MSI on RTL8168c NFC: fdp: Fix a signedness bug in fdp_nci_send_patch() net: stmmac: dwmac-rk: fix error path in rk_gmac_probe net_sched: keep alloc_hash updated after hash allocation net_sched: hold rtnl lock in tcindex_partial_destroy_work() net_sched: cls_route: remove the right filter from hashtable net/sched: act_ct: Fix leak of ct zone template on replace net: qmi_wwan: add support for ASKEY WWHC050 net: phy: mdio-mux-bcm-iproc: check clk_prepare_enable() return value net: phy: mdio-bcm-unimac: Fix clock handling net: phy: dp83867: w/a for fld detect threshold bootstrapping issue net/packet: tpacket_rcv: avoid a producer race condition net: mvneta: Fix the case where the last poll did not process all rx net: ena: Add PCI shutdown handler to allow safe kexec net: dsa: tag_8021q: replace dsa_8021q_remove_header with __skb_vlan_pop net: dsa: mt7530: Change the LINK bit to reflect the link status net: dsa: Fix duplicate frames flooded by learning net: cbs: Fix software cbs to consider packet sending time net/bpfilter: fix dprintf usage for /dev/kmsg mlxsw: spectrum_mr: Fix list iteration in error path mlxsw: pci: Only issue reset when system is ready macsec: restrict to ethernet devices ipv4: fix a RCU-list lock in inet_dump_fib() hsr: fix general protection fault in hsr_addr_is_self() geneve: move debug check after netdev unregister cxgb4: fix Txq restart check during backpressure cxgb4: fix throughput drop during Tx backpressure ACPI: PM: s2idle: Rework ACPI events synchronization mmc: sdhci-tegra: Fix busy detection by enabling MMC_CAP_NEED_RSP_BUSY mmc: sdhci-omap: Fix busy detection by enabling MMC_CAP_NEED_RSP_BUSY mmc: core: Respect MMC_CAP_NEED_RSP_BUSY for eMMC sleep command mmc: core: Respect MMC_CAP_NEED_RSP_BUSY for erase/trim/discard mmc: core: Allow host controllers to require R1B for CMD6 ANDROID: GKI: defconfig: enable CONFIG_THERMAL_GOV_POWER_ALLOCATOR UPSTREAM: usb: raw_gadget: fix compilation warnings in uapi headers BACKPORT: usb: gadget: add raw-gadget interface UPSTREAM: usb: gadget: move choice ... endchoice to legacy/Kconfig ANDROID: GKI: Added goldfish whitelist to aarch64 abi ANDROID: GKI: update cf whitelist + gki whitelist UPSTREAM: ipv6: ndisc: add support for 'PREF64' dns64 prefix identifier ANDROID: ABI: Add initial ABI whitelist for QCOM ANDROID: GKI: Removed cuttlefish configs ANDROID: GKI: Removed cuttlefish configs ANDROID: ABI/Whitelist: update for db845c ANDROID: clang: update to 10.0.5 FROMLIST: arm64: define __alloc_zeroed_user_highpage BACKPORT: extcon: Mark extcon_get_edev_name() function as exported symbol ANDROID: Incremental fs: Fix two typos ANDROID: gki_defconfig: Enable CONFIG_REMOTEPROC ANDROID: GKI: Add CONFIG_RPMSG to gki_defconfig Revert "sched/core: Prevent race condition between cpuset and __sched_setscheduler()" Revert "ANDROID: binder: fix sleeping from invalid function caused by RT inheritance" ANDROID: Incremental fs: Add INCFS_IOC_GET_FILLED_BLOCKS f2fs: fix to account compressed blocks in f2fs_compressed_blocks() f2fs: xattr.h: Replace zero-length array with flexible-array member f2fs: fix to update f2fs_super_block fields under sb_lock f2fs: Add a new CP flag to help fsck fix resize SPO issues f2fs: Fix mount failure due to SPO after a successful online resize FS f2fs: use kmem_cache pool during inline xattr lookups f2fs: skip migration only when BG_GC is called f2fs: fix to show tracepoint correctly f2fs: avoid __GFP_NOFAIL in f2fs_bio_alloc f2fs: introduce F2FS_IOC_GET_COMPRESS_BLOCKS f2fs: fix to avoid triggering IO in write path f2fs: add prefix for f2fs slab cache name f2fs: introduce DEFAULT_IO_TIMEOUT f2fs: skip GC when section is full f2fs: add migration count iff migration happens f2fs: clean up bggc mount option f2fs: clean up lfs/adaptive mount option f2fs: fix to show norecovery mount option f2fs: clean up parameter of macro XATTR_SIZE() f2fs: clean up codes with {f2fs_,}data_blkaddr() f2fs: show mounted time f2fs: Use scnprintf() for avoiding potential buffer overflow f2fs: allow to clear F2FS_COMPR_FL flag f2fs: fix to check dirty pages during compressed inode conversion f2fs: fix to account compressed inode correctly f2fs: fix wrong check on F2FS_IOC_FSSETXATTR f2fs: fix to avoid use-after-free in f2fs_write_multi_pages() f2fs: fix to avoid using uninitialized variable f2fs: fix inconsistent comments f2fs: remove i_sem lock coverage in f2fs_setxattr() f2fs: cover last_disk_size update with spinlock f2fs: fix to check i_compr_blocks correctly f2fs: fix to avoid potential deadlock f2fs: add missing function name in kernel message f2fs: recycle unused compress_data.chksum feild f2fs: fix to avoid NULL pointer dereference f2fs: fix leaking uninitialized memory in compressed clusters f2fs: fix the panic in do_checkpoint() f2fs: fix to wait all node page writeback mm/swapfile.c: move inode_lock out of claim_swapfile ANDROID: GKI: defconfig: Enable CONFIG_SHUFFLE_PAGE_ALLOCATOR ANDROID: gki_defconfig: disable CONFIG_HARDENED_USERCOPY_FALLBACK ANDROID: gki_defconfig: enable CONFIG_DEBUG_LIST ANDROID: Follow aosp/1233812 to update ABI whitelists post-TPM addition. ANDROID: dm-bow: Fix free_show value is incorrect ANDROID: GKI: workqueue.h: add Android ABI padding to some structures ANDROID: gki_defconfig: enabled UAPI header compile testing ANDROID: GKI: fs.h: add Android ABI padding to some structures FROMLIST: media: v4l2-fh: define v4l2_fh struct regardless of condition ANDROID: update ABI for 5.4.28 ANDROID: kbuild: do not merge .section..* into .section in modules Linux 5.4.28 staging: greybus: loopback_test: fix potential path truncations staging: greybus: loopback_test: fix potential path truncation drm/bridge: dw-hdmi: fix AVI frame colorimetry nvmet-tcp: set MSG_MORE only if we actually have more to send arm64: smp: fix crash_smp_send_stop() behaviour arm64: smp: fix smp_send_stop() behaviour ALSA: hda/realtek: Fix pop noise on ALC225 futex: Unbreak futex hashing futex: Fix inode life-time issue x86/mm: split vmalloc_sync_all() page-flags: fix a crash at SetPageError(THP_SWAP) mm, slub: prevent kmalloc_node crashes and memory leaks mm: slub: be more careful about the double cmpxchg of freelist epoll: fix possible lost wakeup on epoll_ctl() path mm: do not allow MADV_PAGEOUT for CoW pages mm/hotplug: fix hot remove failure in SPARSEMEM|!VMEMMAP case mm, memcg: throttle allocators based on ancestral memory.high mm, memcg: fix corruption on 64-bit divisor in memory.high throttling memcg: fix NULL pointer dereference in __mem_cgroup_usage_unregister_event stm class: sys-t: Fix the use of time_after() drm/lease: fix WARNING in idr_destroy drm/amd/amdgpu: Fix GPR read from debugfs (v2) btrfs: fix log context list corruption after rename whiteout error xhci: Do not open code __print_symbolic() in xhci trace events arm64: compat: Fix syscall number of compat_clock_getres rtc: max8907: add missing select REGMAP_IRQ modpost: move the namespace field in Module.symvers last intel_th: pci: Add Elkhart Lake CPU support intel_th: Fix user-visible error codes intel_th: msu: Fix the unexpected state warning staging/speakup: fix get_word non-space look-ahead staging: greybus: loopback_test: fix poll-mask build breakage staging: rtl8188eu: Add device id for MERCUSYS MW150US v2 kbuild: Disable -Wpointer-to-enum-cast CIFS: fiemap: do not return EINVAL if get nothing mmc: sdhci-cadence: set SDHCI_QUIRK2_PRESET_VALUE_BROKEN for UniPhier mmc: sdhci-of-at91: fix cd-gpios for SAMA5D2 mmc: rtsx_pci: Fix support for speed-modes that relies on tuning iio: light: vcnl4000: update sampling periods for vcnl4040 iio: light: vcnl4000: update sampling periods for vcnl4200 iio: adc: at91-sama5d2_adc: fix differential channels in triggered mode iio: adc: stm32-dfsdm: fix sleep in atomic context iio: magnetometer: ak8974: Fix negative raw values in sysfs iio: accel: adxl372: Set iio_chan BE iio: trigger: stm32-timer: disable master mode when stopping iio: st_sensors: remap SMO8840 to LIS2DH12 iio: chemical: sps30: fix missing triggered buffer dependency tty: fix compat TIOCGSERIAL checking wrong function ptr tty: fix compat TIOCGSERIAL leaking uninitialized memory ALSA: pcm: oss: Remove WARNING from snd_pcm_plug_alloc() checks ALSA: pcm: oss: Avoid plugin buffer overflow ALSA: seq: oss: Fix running status after receiving sysex ALSA: seq: virmidi: Fix running status after receiving sysex ALSA: hda/realtek - Enable the headset of Acer N50-600 with ALC662 ALSA: hda/realtek - Enable headset mic of Acer X2660G with ALC662 ALSA: line6: Fix endless MIDI read loop USB: cdc-acm: fix rounding error in TIOCSSERIAL USB: cdc-acm: fix close_delay and closing_wait units in TIOCSSERIAL usb: typec: ucsi: displayport: Fix a potential race during registration usb: typec: ucsi: displayport: Fix NULL pointer dereference usb: xhci: apply XHCI_SUSPEND_DELAY to AMD XHCI controller 1022:145c USB: serial: pl2303: add device-id for HP LD381 usb: host: xhci-plat: add a shutdown USB: serial: option: add ME910G1 ECM composition 0x110b usb: quirks: add NO_LPM quirk for RTL8153 based ethernet adapters USB: Disable LPM on WD19's Realtek Hub Revert "drm/fbdev: Fallback to non tiled mode if all tiles not present" binderfs: use refcount for binder control devices too parse-maintainers: Mark as executable block, bfq: fix overwrite of bfq_group pointer in bfq_find_set_group() xenbus: req->err should be updated before req->state xenbus: req->body should be updated before req->state drm/amd/display: fix dcc swath size calculations on dcn1 drm/amd/display: Clear link settings on MST disable connector drm/amdgpu: clean wptr on wb when gpu recovery riscv: Fix range looking for kernel image memblock riscv: Force flat memory model with no-mmu spi: spi_register_controller(): free bus id on error paths ASoC: stm32: sai: manage rebind issue riscv: avoid the PIC offset of static percpu data in module beyond 2G limits dm integrity: use dm_bio_record and dm_bio_restore dm bio record: save/restore bi_end_io and bi_integrity altera-stapl: altera_get_note: prevent write beyond end of 'key' drivers/perf: arm_pmu_acpi: Fix incorrect checking of gicc pointer drivers/perf: fsl_imx8_ddr: Correct the CLEAR bit definition drm/exynos: hdmi: don't leak enable HDMI_EN regulator if probe fails drm/exynos: dsi: fix workaround for the legacy clock name drm/exynos: dsi: propagate error value and silence meaningless warning spi/zynqmp: remove entry that causes a cs glitch spi: pxa2xx: Add CS control clock quirk ARM: dts: dra7: Add "dma-ranges" property to PCIe RC DT nodes cifs: add missing mount option to /proc/mounts cifs: fix potential mismatch of UNC paths powerpc: Include .BTF section spi: qup: call spi_qup_pm_resume_runtime before suspending ARM: dts: dra7-l4: mark timer13-16 as pwm capable phy: ti: gmii-sel: do not fail in case of gmii phy: ti: gmii-sel: fix set of copy-paste errors drm/mediatek: Find the cursor plane instead of hard coding it spi: spi-omap2-mcspi: Support probe deferral for DMA channels locks: reinstate locks_delete_block optimization locks: fix a potential use-after-free problem when wakeup a waiter ANDROID: ABI/Whitelist: update whitelist of unisoc ANDROID: staging: ion: Allow for attach and detach ops to be overridden ANDROID: scsi: ufs: add ->map_sg_crypto() variant op ANDROID: ABI/Whitelist: update for db845c ANDROID: GKI: Add CONFIG_SOC_BUS to gki_defconfig ANDROID: ABI/Whitelist: update for hikey960 ANDROID: hikey960: Add external mali driver support to build.config.hikey960 ANDROID: hikey960: Add build.config.hikey960 ANDROID: config: Add hikey960_gki fragment ANDROID: misc: hisi_hikey_usb: Driver to support usb functionality of Hikey960 ANDROID: dt-bindings: misc: Add bindings for HiSilicon usb hub and data role switch functionality on HiKey960 FROMGIT: usb: dwc3: Rework resets initialization to be more flexible FROMGIT: usb: dwc3: Rework clock initialization to be more flexible FROMGIT: dt-bindings: usb: dwc3: Allow clock list & resets to be more flexible FROMGIT: usb: dwc3: Add support for role-switch-default-mode binding FROMGIT: dt-bindings: usb: generic: Add role-switch-default-mode binding FROMGIT: usb: dwc3: Registering a role switch in the DRD code. UPSTREAM: bpf: Explicitly memset some bpf info structures declared on the stack UPSTREAM: bpf: Explicitly memset the bpf_attr structure FROMGIT: BACKPORT: driver core: Add device links from fwnode only for the primary device Linux 5.4.27 ipv4: ensure rcu_read_lock() in cipso_v4_error() ARM: 8961/2: Fix Kbuild issue caused by per-task stack protector GCC plugin HID: add ALWAYS_POLL quirk to lenovo pixart mouse HID: google: add moonball USB id mm: slub: add missing TID bump in kmem_cache_alloc_bulk() ARM: 8958/1: rename missed uaccess .fixup section ARM: 8957/1: VDSO: Match ARMv8 timer in cntvct_functional() net: qrtr: fix len of skb_put_padto in qrtr_node_enqueue blk-mq: insert flush request to the front of dispatch queue jbd2: fix data races at struct journal_head sfc: fix timestamp reconstruction at 16-bit rollover points net: rmnet: fix packet forwarding in rmnet bridge mode net: rmnet: fix bridge mode bugs net: rmnet: use upper/lower device infrastructure net: rmnet: do not allow to change mux id if mux id is duplicated net: rmnet: remove rcu_read_lock in rmnet_force_unassociate_device() net: rmnet: fix suspicious RCU usage net: rmnet: fix NULL pointer dereference in rmnet_changelink() net: rmnet: fix NULL pointer dereference in rmnet_newlink() hinic: fix a bug of rss configuration hinic: fix a bug of setting hw_ioctxt hinic: fix a irq affinity bug net: phy: mscc: fix firmware paths slip: not call free_netdev before rtnl_unlock in slip_open signal: avoid double atomic counter increments for user accounting kbuild: add dt_binding_check to PHONY in a correct place kbuild: add dtbs_check to PHONY drm/amdgpu: fix memory leak during TDR test(v2) blk-mq: insert passthrough request into hctx->dispatch directly net: ll_temac: Handle DMA halt condition caused by buffer underrun net: ll_temac: Fix RX buffer descriptor handling on GFP_ATOMIC pressure net: ll_temac: Add more error handling of dma_map_single() calls net: ll_temac: Fix race condition causing TX hang mac80211: rx: avoid RCU list traversal under mutex net: ks8851-ml: Fix IRQ handling and locking net: usb: qmi_wwan: restore mtu min/max values after raw_ip switch scsi: libfc: free response frame from GPN_ID cfg80211: check reg_rule for NULL in handle_channel_custom() tracing: Fix number printing bug in print_synth_event() selftests/rseq: Fix out-of-tree compilation HID: hid-bigbenff: fix race condition for scheduled work during removal HID: hid-bigbenff: call hid_hw_stop() in case of error HID: hid-bigbenff: fix general protection fault caused by double kfree HID: i2c-hid: add Trekstor Surfbook E11B to descriptor override ACPI: watchdog: Set default timeout in probe HID: apple: Add support for recent firmware on Magic Keyboards ACPI: watchdog: Allow disabling WDAT at boot drm/amdgpu: Fix TLB invalidation request when using semaphore netfilter: xt_hashlimit: unregister proc file before releasing mutex netfilter: hashlimit: do not use indirect calls during gc ANDROID: staging: ion: Export query function to be used in modules UPSTREAM: Bluetooth: hci_qca: Add support for Qualcomm Bluetooth SoC WCN3991 UPSTREAM: Bluetooth: btqca: Rename ROME specific variables to generic variables ANDROID: ABI: Update abi after enabling CONFIG_USB_PHY ANDROID: GKI: Enable CONFIG_USB_PHY for usb drivers like dwc3 ANDROID: Update abi_gki_aarch64_unisoc_whitelist ANDROID: GKI: USB: add Android ABI padding to some structures FROMLIST: ubifs: wire up FS_IOC_GET_ENCRYPTION_NONCE FROMLIST: f2fs: wire up FS_IOC_GET_ENCRYPTION_NONCE FROMLIST: ext4: wire up FS_IOC_GET_ENCRYPTION_NONCE FROMLIST: fscrypt: add FS_IOC_GET_ENCRYPTION_NONCE ioctl ANDROID: GKI: mm: add Android ABI padding to some structures ANDROID: GKI: mount.h: add Android ABI padding to some structures ANDROID: GKI: sched.h: add Android ABI padding to some structures ANDROID: GKI: sock.h: add Android ABI padding to some structures ANDROID: GKI: module.h: add Android ABI padding to some structures UPSTREAM: driver core: Skip unnecessary work when device doesn't have sync_state() ANDROID: Incremental fs: Add INCFS_IOC_PERMIT_FILL ANDROID: Incremental fs: Remove signature checks from kernel ANDROID: Incremental fs: Pad hash blocks ANDROID: Incremental fs: Make fill block an ioctl ANDROID: Incremental fs: Remove all access_ok checks ANDROID: GKI: device.h: add Android ABI padding to some structures ANDROID: GKI: phy: add Android ABI padding to some structures ANDROID: ABI update for 5.4.26 Linux 5.4.26 net/smc: cancel event worker during device removal net/smc: check for valid ib_client_data ipv6: restrict IPV6_ADDRFORM operation iommu/amd: Fix IOMMU AVIC not properly update the is_run bit in IRTE i2c: acpi: put device when verifying client fails iommu/vt-d: Ignore devices with out-of-spec domain number iommu/vt-d: Fix the wrong printing in RHSA parsing netfilter: nft_chain_nat: inet family is missing module ownership netfilter: nf_tables: dump NFTA_CHAIN_FLAGS attribute netfilter: nft_tunnel: add missing attribute validation for tunnels netfilter: nft_payload: add missing attribute validation for payload csum flags netfilter: cthelper: add missing attribute validation for cthelper perf bench futex-wake: Restore thread count default to online CPU count nl80211: add missing attribute validation for channel switch nl80211: add missing attribute validation for beacon report scanning nl80211: add missing attribute validation for critical protocol indication i2c: gpio: suppress error on probe defer iommu/vt-d: Fix RCU-list bugs in intel_iommu_init() driver code: clarify and fix platform device DMA mask allocation drm/i915/gvt: Fix unnecessary schedule timer when no vGPU exits pinctrl: core: Remove extra kref_get which blocks hogs being freed drm/i915/gvt: Fix dma-buf display blur issue on CFL virtio_ring: Fix mem leak with vring_new_virtqueue() pinctrl: imx: scu: Align imx sc msg structs to 4 pinctrl: meson-gxl: fix GPIOX sdio pins clk: imx8mn: Fix incorrect clock defines batman-adv: Don't schedule OGM for disabled interface iommu/vt-d: Fix a bug in intel_iommu_iova_to_phys() for huge page iommu/vt-d: Fix RCU list debugging warnings iommu/vt-d: dmar: replace WARN_TAINT with pr_warn + add_taint iommu/dma: Fix MSI reservation allocation x86/mce: Fix logic and comments around MSR_PPIN_CTL perf/amd/uncore: Replace manual sampling check with CAP_NO_INTERRUPT flag mt76: fix array overflow on receiving too many fragments for a packet i2c: designware-pci: Fix BUG_ON during device removal efi: Add a sanity check to efivar_store_raw() efi: Fix a race and a buffer overflow while reading efivars via sysfs x86/ioremap: Map EFI runtime services data as encrypted for SEV macintosh: windfarm: fix MODINFO regression fscrypt: don't evict dirty inodes after removing key blk-iocost: fix incorrect vtime comparison in iocg_is_idle() ipmi_si: Avoid spurious errors for optional IRQs s390/dasd: fix data corruption for thin provisioned devices fuse: fix stack use after return ARC: define __ALIGN_STR and __ALIGN symbols for ARC KVM: nVMX: avoid NULL pointer dereference with incorrect EVMCS GPAs KVM: x86: clear stale x86_emulate_ctxt->intercept value gfs2_atomic_open(): fix O_EXCL|O_CREAT handling on cold dcache cifs_atomic_open(): fix double-put on late allocation failure ktest: Add timeout for ssh sync testing pinctrl: falcon: fix syntax error mmc: sdhci-pci-gli: Enable MSI interrupt for GL975x drm/i915: Defer semaphore priority bumping to a workqueue drm/i915: be more solid in checking the alignment drm/amd/display: remove duplicated assignment to grph_obj_type workqueue: don't use wq_select_unbound_cpu() for bound works netfilter: x_tables: xt_mttg_seq_next should increase position index netfilter: xt_recent: recent_seq_next should increase position index netfilter: synproxy: synproxy_cpu_seq_next should increase position index netfilter: nf_conntrack: ct_cpu_seq_next should increase position index iommu/vt-d: quirk_ioat_snb_local_iommu: replace WARN_TAINT with pr_warn + add_taint virtio-blk: fix hw_queue stopped on arbitrary error iwlwifi: mvm: Do not require PHY_SKU NVM section for 3168 devices netfilter: nf_tables: fix infinite loop when expr is not available cgroup: Iterate tasks that did not finish do_exit() cgroup: cgroup_procs_next should increase position index net: phy: Avoid multiple suspends net: dsa: Don't instantiate phylink for CPU/DSA ports unless needed selftests/net/fib_tests: update addr_metric_test for peer route testing net/ipv6: remove the old peer route if change it to a new one net/ipv6: need update peer route when modify metric net: phy: fix MDIO bus PM PHY resuming net: phy: avoid clearing PHY interrupts twice in irq handler nfc: add missing attribute validation for vendor subcommand nfc: add missing attribute validation for deactivate target nfc: add missing attribute validation for SE API tipc: add missing attribute validation for MTU property team: add missing attribute validation for array index team: add missing attribute validation for port ifindex net: taprio: add missing attribute validation for txtime delay net: fq: add missing attribute validation for orphan mask macsec: add missing attribute validation for port can: add missing attribute validation for termination nl802154: add missing attribute validation for dev_type nl802154: add missing attribute validation fib: add missing attribute validation for tun_id devlink: validate length of region addr/len devlink: validate length of param values net: memcg: fix lockdep splat in inet_csk_accept() net: memcg: late association of sock to memcg cgroup: memcg: net: do not associate sock with unrelated cgroup bnxt_en: fix error handling when flashing from file bnxt_en: reinitialize IRQs when MTU is modified bonding/alb: make sure arp header is pulled before accessing it taprio: Fix sending packets without dequeueing them slip: make slhc_compress() more robust against malicious packets sfc: detach from cb_page in efx_copy_channel() r8152: check disconnect status after long sleep net: systemport: fix index check to avoid an array out of bounds access net: stmmac: dwmac1000: Disable ACS if enhanced descs are not used net: phy: bcm63xx: fix OOPS due to missing driver name net/packet: tpacket_rcv: do not increment ring index on drop net: nfc: fix bounds checking bugs on "pipe" net: macsec: update SCI upon MAC address change. netlink: Use netlink header as base to calculate bad attribute offset net/ipv6: use configured metric when add peer route net: hns3: fix a not link up issue when fibre port supports autoneg net: fec: validate the new settings in fec_enet_set_coalesce() net: dsa: mv88e6xxx: fix lockup on warm boot net: dsa: fix phylink_start()/phylink_stop() calls macvlan: add cond_resched() during multicast processing ipvlan: don't deref eth hdr before checking it's set ipvlan: do not use cond_resched_rcu() in ipvlan_process_multicast() ipvlan: do not add hardware address of master to its unicast filter list ipvlan: add cond_resched_rcu() while processing muticast backlog ipv6/addrconf: call ipv6_mc_up() for non-Ethernet interface inet_diag: return classid for all socket types gre: fix uninit-value in __iptunnel_pull_header cgroup, netclassid: periodically release file_lock on classid updating ALSA: hda/realtek - Fixed one of HP ALC671 platform Headset Mic supported ALSA: hda/realtek - Add Headset Mic supported for HP cPC ALSA: hda/realtek - More constifications virtio_balloon: Adjust label in virtballoon_probe ANDROID: GKI: Revert "mm: unexport free_reserved_area" ANDROID: Export functions to be used with dma_map_ops in modules ANDROID: GKI: add android_kabi.h ANDROID: GKI: update abi due to CONFIG_JUMP_LABEL being enabled ANDROID: GKI: enable CONFIG_JUMP_LABEL ANDROID: Add build.config.gki-debug.x86_64 ANDROID: update the abi signatures ANDROID: Add build.config.gki-debug.aarch64 Revert "ANDROID: drm: edid: add support for additional CEA extension blocks" Revert "ANDROID: drm: Parse Colorimetry data block from EDID" ANDROID: Add build.config files for ARM 32-bit ANDROID: Kconfig.gki: Add FRAME_VECTOR UPSTREAM: cgroup: Iterate tasks that did not finish do_exit() ANDROID: gki_defconfig: Enable more USB_CONFIGFS gadgets Revert "ANDROID: tty: serdev: Fix broken serial console input" ANDROID: serdev: restrict claim of platform devices ANDROID: Add TPM support and the vTPM proxy to Cuttlefish. FROMGIT: ASoC: sprd: Allow the MCDT driver to build into modules FROMGIT: thermal: sprd: Add Spreadtrum thermal driver support FROMGIT: dt-bindings: thermal: sprd: Add the Spreadtrum thermal documentation ANDROID: ABI update due to power supply patches being merged FROMGIT: pinctrl: sprd: Fix the kconfig warning FROMGIT: pinctrl: sprd: Allow the SPRD pinctrl driver building into a module FROMGIT: pinctrl: Export some needed symbols at module load time FROMGIT: power: reset: sc27xx: Allow the SC27XX poweroff driver building into a module FROMGIT: power: reset: sc27xx: Change to use cpu_down() FROMGIT: power: reset: sc27xx: Power off the external subsystems' connection FROMGIT: power: supply: sc27xx: Add POWER_SUPPLY_PROP_CHARGE_NOW attribute UPSTREAM: power: supply: sc27xx: Calibrate the resistance of coulomb counter UPSTREAM: dt-bindings: power: sc27xx: Add a new property to describe the real resistance of coulomb counter chip UPSTREAM: power: supply: sc27xx: Optimize the battery resistance with measuring temperature UPSTREAM: power: supply: core: Add battery internal resistance temperature table support UPSTREAM: dt-bindings: power: Introduce one property to describe the battery resistance with temperature changes ANDROID: abi_gki_aarch64_whitelist: update after whitelist changes ANDROID: update abi_gki_aarch64_cuttlefish_whitelist ANDROID: update abi_gki_aarch64_db845c_whitelist ANDROID: update abi due to interconnect changes UPSTREAM: interconnect: Handle memory allocation errors UPSTREAM: interconnect: Add basic tracepoints UPSTREAM: interconnect: Add a name to struct icc_path UPSTREAM: interconnect: Move internal structs into a separate file Linux 5.4.25 drm/virtio: module_param_named() requires linux/moduleparam.h csky: Implement copy_thread_tls block, bfq: remove ifdefs from around gets/puts of bfq groups block, bfq: get a ref to a group when adding it to a service tree efi: READ_ONCE rng seed size before munmap efi/x86: Handle by-ref arguments covering multiple pages in mixed mode efi/x86: Align GUIDs to their size in the mixed mode runtime wrapper powerpc: fix hardware PMU exception bug on PowerVM compatibility mode systems EDAC/synopsys: Do not print an error with back-to-back snprintf() calls bus: ti-sysc: Fix 1-wire reset quirk arm64: dts: meson: fix gxm-khadas-vim2 wifi dmaengine: coh901318: Fix a double lock bug in dma_tc_handle() dma-buf: free dmabuf->name in dma_buf_release() hwmon: (adt7462) Fix an error return in ADT7462_REG_VOLT() ARM: dts: imx7-colibri: Fix frequency for sd/mmc ARM: dts: dra7xx-clocks: Fixup IPU1 mux clock parent source ARM: dts: am437x-idk-evm: Fix incorrect OPP node names ARM: imx: build v7_cpu_resume() unconditionally IB/hfi1, qib: Ensure RCU is locked when accessing list RMDA/cm: Fix missing ib_cm_destroy_id() in ib_cm_insert_listen() regulator: stm32-vrefbuf: fix a possible overshoot when re-enabling RDMA/core: Fix protection fault in ib_mr_pool_destroy RDMA/iwcm: Fix iwcm work deallocation RDMA/siw: Fix failure handling during device creation RDMA/nldev: Fix crash when set a QP to a new counter but QPN is missing RDMA/rw: Fix error flow during RDMA context initialization Revert "RDMA/cma: Simplify rdma_resolve_addr() error flow" soc: imx-scu: Align imx sc msg structs to 4 firmware: imx: Align imx_sc_msg_req_cpu_start to 4 firmware: imx: scu-pd: Align imx sc msg structs to 4 firmware: imx: misc: Align imx sc msg structs to 4 arm64: dts: imx8qxp-mek: Remove unexisting Ethernet PHY ARM: dts: imx6: phycore-som: fix emmc supply phy: mapphone-mdm6600: Fix write timeouts with shorter GPIO toggle interval phy: mapphone-mdm6600: Fix timeouts by adding wake-up handling drm/i915/selftests: Fix return in assert_mmap_offset() drm/i915: Program MBUS with rmw during initialization drm/sun4i: de2/de3: Remove unsupported VI layer formats drm/sun4i: Fix DE2 VI layer format support drm/sun4i: Add separate DE3 VI layer formats drm: kirin: Revert "Fix for hikey620 display offset problem" drm/panfrost: Don't try to map on error faults spi: atmel-quadspi: fix possible MMIO window size overrun ASoC: dapm: Correct DAPM handling of active widgets during shutdown ASoC: Intel: Skylake: Fix available clock counter incrementation ASoC: pcm512x: Fix unbalanced regulator enable call in probe error path ASoC: pcm: Fix possible buffer overflow in dpcm state sysfs output powerpc/mm: Fix missing KUAP disable in flush_coherent_icache() powerpc: Convert flush_icache_range & friends to C powerpc: define helpers to get L1 icache sizes ASoC: intel: skl: Fix possible buffer overflow in debug outputs ASoC: intel: skl: Fix pin debug prints ASoC: SOF: Fix snd_sof_ipc_stream_posn() ASoC: topology: Fix memleak in soc_tplg_manifest_load() ASoC: topology: Fix memleak in soc_tplg_link_elems_load() drm/virtio: fix resource id creation race drm/virtio: make resource id workaround runtime switchable. spi: bcm63xx-hsspi: Really keep pll clk enabled ARM: dts: ls1021a: Restore MDIO compatible to gianfar arm64: dts: meson-sm1-sei610: add missing interrupt-names dm: fix congested_fn for request-based device dm zoned: Fix reference counter initial value of chunk works dm writecache: verify watermark during resume dm: report suspended device during destroy dm cache: fix a crash due to incorrect work item cancelling dm integrity: fix invalid table returned due to argument count mismatch dm integrity: fix a deadlock due to offloading to an incorrect workqueue dm integrity: fix recalculation when moving from journal mode to bitmap mode dmaengine: tegra-apb: Prevent race conditions of tasklet vs free list dmaengine: tegra-apb: Fix use-after-free dmaengine: imx-sdma: Fix the event id check to include RX event for UART6 dmaengine: imx-sdma: fix context cache s390/mm: fix panic in gup_fast on large pud s390/pci: Fix unexpected write combine on resource x86/pkeys: Manually set X86_FEATURE_OSPKE to preserve existing changes spi: spidev: Fix CS polarity if GPIO descriptors are used perf arm-spe: Fix endless record after being terminated perf cs-etm: Fix endless record after being terminated perf intel-bts: Fix endless record after being terminated perf intel-pt: Fix endless record after being terminated media: v4l2-mem2mem.c: fix broken links media: vicodec: process all 4 components for RGB32 formats media: mc-entity.c: use & to check pad flags, not == media: hantro: Fix broken media controller links vt: selection, push sel_lock up vt: selection, push console lock down vt: selection, close sel_buffer race serial: 8250_exar: add support for ACCES cards tty: serial: fsl_lpuart: free IDs allocated by IDA tty:serial:mvebu-uart:fix a wrong return arm: dts: dra76x: Fix mmc3 max-frequency arm64: dts: socfpga: agilex: Fix gmac compatible btrfs: fix RAID direct I/O reads with alternate csums fat: fix uninit-memory access for partial initialized inode mm, hotplug: fix page online with DEBUG_PAGEALLOC compiled but not enabled mm: fix possible PMD dirty bit lost in set_pmd_migration_entry() mm, numa: fix bad pmd by atomically check for pmd_trans_huge when marking page tables prot_numa vgacon: Fix a UAF in vgacon_invert_region usb: core: port: do error out if usb_autopm_get_interface() fails usb: core: hub: do error out if usb_autopm_get_interface() fails usb: core: hub: fix unhandled return by employing a void function usb: cdns3: gadget: toggle cycle bit before reset endpoint usb: cdns3: gadget: link trb should point to next request usb: dwc3: gadget: Update chain bit correctly when using sg list usb: quirks: add NO_LPM quirk for Logitech Screen Share usb: storage: Add quirk for Samsung Fit flash cifs: fix rename() by ensuring source handle opened with DELETE bit cifs: don't leak -EAGAIN for stat() during reconnect ALSA: hda/realtek - Enable the headset of ASUS B9450FA with ALC294 ALSA: hda/realtek - Fix silent output on Gigabyte X570 Aorus Master ALSA: hda/realtek - Add Headset Button supported for ThinkPad X1 ALSA: hda/realtek - Add Headset Mic supported binder: prevent UAF for binderfs devices II binder: prevent UAF for binderfs devices firmware: imx: scu: Ensure sequential TX selftests: forwarding: vxlan_bridge_1d: use more proper tos value arch/csky: fix some Kconfig typos csky: Fixup compile warning for three unimplemented syscalls csky: Fixup ftrace modify panic csky/smp: Fixup boot failed when CONFIG_SMP csky: Set regs->usp to kernel sp, when the exception is from kernel csky/mm: Fixup export invalid_pte_table symbol net: thunderx: workaround BGX TX Underflow issue x86/xen: Distribute switch variables for initialization ice: Don't tell the OS that link is going down nvme: Fix uninitialized-variable warning s390/qdio: fill SL with absolute addresses x86/boot/compressed: Don't declare __force_order in kaslr_64.c nvme-pci: Use single IRQ vector for old Apple models nvme/pci: Add sleep quirk for Samsung and Toshiba drives iommu/amd: Disable IOMMU on Stoney Ridge systems net/mlx5: DR, Fix matching on vport gvmi efi: Only print errors about failing to get certs if EFI vars are found s390: make 'install' not depend on vmlinux s390/cio: cio_ignore_proc_seq_next should increase position index watchdog: da9062: do not ping the hw during stop() net: ethernet: dm9000: Handle -EPROBE_DEFER in dm9000_parse_dt() net: ks8851-ml: Fix 16-bit IO operation net: ks8851-ml: Fix 16-bit data access net: ks8851-ml: Remove 8-bit bus accessors net: atlantic: check rpc result and wait for rpc address selftests: forwarding: vxlan_bridge_1d: fix tos value selftests: forwarding: use proto icmp for {gretap, ip6gretap}_mac testing drm/msm/dsi/pll: call vco set rate explicitly drm/msm/dsi: save pll state before dsi host is powered off scsi: megaraid_sas: silence a warning drm/modes: Allow DRM_MODE_ROTATE_0 when applying video mode parameters drm/modes: Make sure to parse valid rotation value from cmdline drm: msm: Fix return type of dsi_mgr_connector_mode_valid for kCFI drm/msm/mdp5: rate limit pp done timeout warnings habanalabs: patched cb equals user cb in device memset habanalabs: do not halt CoreSight during hard reset habanalabs: halt the engines before hard-reset usb: gadget: serial: fix Tx stall after buffer overflow usb: gadget: ffs: ffs_aio_cancel(): Save/restore IRQ flags usb: gadget: composite: Support more than 500mA MaxPower selftests: fix too long argument serial: ar933x_uart: set UART_CS_{RX,TX}_READY_ORIDE ALSA: hda: do not override bus codec_mask in link_get() blktrace: fix dereference after null check kprobes: Fix optimize_kprobe()/unoptimize_kprobe() cancellation logic kbuild: fix 'No such file or directory' warning when cleaning RDMA/core: Fix use of logical OR in get_new_pps RDMA/core: Fix pkey and port assignment in get_new_pps dm thin metadata: fix lockdep complaint net: stmmac: fix notifier registration net: dsa: bcm_sf2: Forcibly configure IMP port for 1Gb/sec ALSA: hda/realtek - Fix a regression for mute led on Lenovo Carbon X1 block, bfq: do not insert oom queue into position tree block, bfq: get extra ref to prevent a queue from being freed during a group move FROMGIT: kallsyms: unexport kallsyms_lookup_name() and kallsyms_on_each_symbol() FROMGIT: samples/hw_breakpoint: drop use of kallsyms_lookup_name() FROMGIT: samples/hw_breakpoint: drop HW_BREAKPOINT_R when reporting writes UPSTREAM: fscrypt: don't evict dirty inodes after removing key fscrypt: don't evict dirty inodes after removing key ANDROID: ABI/Whitelist: update whitelist of unisoc upstream code ANDROID: gki_defconfig: Enable CONFIG_VM_EVENT_COUNTERS ANDROID: gki_defconfig: Enable CONFIG_CLEANCACHE ANDROID: arm64: update the abi with the new gki_defconfig ANDROID: gki_defconfig: disable CONFIG_DEBUG_DEVRES ANDROID: Update the abi xml file ANDROID: GKI: arm64: reserve space in cpu_hwcaps and cpu_hwcap_keys arrays FROMGIT: power: supply: Allow charger manager can be built as a module ANDROID: arm64: gki_defconfig: disable CONFIG_DEBUG_PREEMPT ANDROID: iommu/iova: Fix to use __alloc_and_insert_iova_best_fit ANDROID: enable CONFIG_WATCHDOG_CORE=y ANDROID: kbuild: align UNUSED_KSYMS_WHITELIST with upstream FROMLIST: f2fs: fix wrong check on F2FS_IOC_FSSETXATTR ANDROID: gki_defconfig: enable CONFIG_TYPEC UPSTREAM: scsi: ufs: ufs-mediatek: add waiting time for reference clock UPSTREAM: scsi: ufs: introduce common function to disable host TX LCC UPSTREAM: scsi: ufs: ufs-mediatek: fix TX LCC disabling timing UPSTREAM: scsi: ufs: ufs-mediatek: gate ref-clk during Auto-Hibern8 UPSTREAM: scsi: ufs: fix Auto-Hibern8 error detection UPSTREAM: scsi: ufs: ufs-mediatek: support linkoff state during suspend UPSTREAM: scsi: ufs: ufs-mediatek: ensure UniPro is not powered down before linkup UPSTREAM: scsi: ufs: Move ufshcd_get_max_pwr_mode() to ufshcd_device_params_init() BACKPORT: scsi: ufs: Split ufshcd_probe_hba() based on its called flow FROMGIT: driver core: Reevaluate dev->links.need_for_probe as suppliers are added FROMGIT: driver core: Call sync_state() even if supplier has no consumers ANDROID: cpufreq: times: Remove per-UID time in state tracking Revert "ANDROID: proc: Add /proc/uid directory" Revert "ANDROID: cpufreq: Add time_in_state to /proc/uid directories" ANDROID: cpufreq: times: Remove /proc/uid_concurrent_{active,policy}_time ANDROID: drm: Add support for DP 1.4 Compliance edid corruption test Revert "ANDROID: drm: Add support for DP 1.4 Compliance edid corruption test" ANDROID: staging: ion: Add an in-kernel interface to request heap info. FROMLIST: lib: test_stackinit.c: XFAIL switch variable init tests UPSTREAM: scsi: ufs: Abort gating if clock on request is pending UPSTREAM: scsi: ufs: Fix irq return code UPSTREAM: scsi: ufs: Fix register dump caused sleep in atomic context UPSTREAM: scsi: ufs-qcom: Add reset control support for host controller UPSTREAM: scsi: ufs: Add device reset in link recovery path FROMGIT: scsi: ufs-qcom: Delay specific time before gate ref clk BACKPORT: FROMGIT: scsi: ufs: Add dev ref clock gating wait time support Revert "FROMLIST: scsi: ufs: Add dev ref clock gating wait time support" FROMGIT: scsi: ufs-qcom: Adjust bus bandwidth voting and unvoting Revert "FROMLIST: scsi: ufs-qcom: Adjust bus bandwidth voting and unvoting" ANDROID: CC_FLAGS_CFI add -fno-sanitize-blacklist Conflicts: .gitignore Documentation/ABI/testing/sysfs-class-devlink Documentation/ABI/testing/sysfs-class-power Documentation/ABI/testing/sysfs-fs-f2fs Documentation/admin-guide/hw-vuln/special-register-buffer-data-sampling.rst Documentation/admin-guide/kernel-parameters.txt Documentation/filesystems/f2fs.txt Documentation/filesystems/porting.rst Documentation/filesystems/proc.txt Documentation/kbuild/index.rst Documentation/kbuild/llvm.rst Documentation/kbuild/modules.rst Documentation/lzo.txt Documentation/media/uapi/v4l/ext-ctrls-codec.rst Documentation/usb/index.rst Documentation/virt/kvm/api.txt Makefile abi_gki_aarch64.xml arch/alpha/kernel/syscalls/syscall.tbl arch/arc/plat-eznps/Kconfig arch/arm/Kconfig arch/arm/boot/compressed/Makefile arch/arm/boot/compressed/vmlinux.lds.S arch/arm/boot/dts/bcm283x.dtsi arch/arm/boot/dts/exynos4412-galaxy-s3.dtsi arch/arm/boot/dts/stm32mp157a-avenger96.dts arch/arm/boot/dts/sun8i-r40.dtsi arch/arm/boot/dts/vexpress-v2m-rs1.dtsi arch/arm/include/asm/clocksource.h arch/arm/include/asm/kvm_emulate.h arch/arm/include/asm/kvm_host.h arch/arm/include/asm/percpu.h arch/arm/include/asm/vdso/clocksource.h arch/arm/include/asm/vdso/gettimeofday.h arch/arm/kernel/hw_breakpoint.c arch/arm/kernel/vdso.c arch/arm/mach-integrator/Kconfig arch/arm/mach-omap2/omap-iommu.c arch/arm/mach-tegra/cpuidle-tegra114.c arch/arm/mm/dma-mapping.c arch/arm/mm/proc-macros.S arch/arm/tools/syscall.tbl arch/arm64/Kconfig arch/arm64/Makefile arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi arch/arm64/boot/dts/amlogic/meson-g12b-khadas-vim3.dtsi arch/arm64/boot/dts/amlogic/meson-gxl-s805x.dtsi arch/arm64/boot/dts/arm/foundation-v8-gicv3.dtsi arch/arm64/boot/dts/arm/foundation-v8.dtsi arch/arm64/boot/dts/arm/juno-motherboard.dtsi arch/arm64/boot/dts/arm/rtsm_ve-motherboard-rs2.dtsi arch/arm64/boot/dts/arm/rtsm_ve-motherboard.dtsi arch/arm64/boot/dts/freescale/imx8mm-evk.dts arch/arm64/boot/dts/freescale/imx8mn-ddr4-evk.dts arch/arm64/boot/dts/freescale/imx8qxp-mek.dts arch/arm64/boot/dts/marvell/armada-3720-espressobin.dts arch/arm64/boot/dts/mediatek/mt8173.dtsi arch/arm64/boot/dts/nvidia/tegra194.dtsi arch/arm64/boot/dts/qcom/msm8916-pins.dtsi arch/arm64/boot/dts/qcom/msm8916.dtsi arch/arm64/configs/db845c_gki.fragment arch/arm64/configs/gki_defconfig arch/arm64/configs/vendor/genericarmv8-64_defconfig arch/arm64/configs/vendor/holi_GKI.config arch/arm64/configs/vendor/holi_QGKI.config arch/arm64/configs/vendor/holi_debug.config arch/arm64/configs/vendor/lahaina_GKI.config arch/arm64/configs/vendor/lahaina_QGKI.config arch/arm64/configs/vendor/lahaina_debug.config arch/arm64/include/asm/clocksource.h arch/arm64/include/asm/cpucaps.h arch/arm64/include/asm/kvm_asm.h arch/arm64/include/asm/memory.h arch/arm64/include/asm/page.h arch/arm64/include/asm/pgtable-prot.h arch/arm64/include/asm/pointer_auth.h arch/arm64/include/asm/processor.h arch/arm64/include/asm/unistd.h arch/arm64/include/asm/unistd32.h arch/arm64/include/asm/vdso/clocksource.h arch/arm64/include/asm/vdso/compat_gettimeofday.h arch/arm64/include/asm/vdso/gettimeofday.h arch/arm64/include/asm/vdso/vsyscall.h arch/arm64/kernel/cpu_errata.c arch/arm64/kernel/perf_regs.c arch/arm64/kernel/process.c arch/arm64/kernel/ptrace.c arch/arm64/kernel/smp.c arch/arm64/kernel/vdso.c arch/arm64/kernel/vdso32/Makefile arch/arm64/kernel/vmlinux.lds.S arch/arm64/kvm/guest.c arch/arm64/kvm/handle_exit.c arch/arm64/kvm/hyp-init.S arch/arm64/kvm/reset.c arch/arm64/mm/fault.c arch/csky/Kconfig arch/csky/include/asm/processor.h arch/csky/kernel/entry.S arch/csky/kernel/process.c arch/csky/kernel/setup.c arch/csky/kernel/smp.c arch/csky/kernel/traps.c arch/csky/mm/fault.c arch/hexagon/include/asm/io.h arch/ia64/kernel/syscalls/syscall.tbl arch/m68k/kernel/syscalls/syscall.tbl arch/microblaze/kernel/syscalls/syscall.tbl arch/mips/configs/loongson3_defconfig arch/mips/include/asm/cpu-features.h arch/mips/kernel/mips-cm.c arch/mips/kernel/setup.c arch/mips/kernel/syscalls/syscall_n32.tbl arch/mips/kernel/syscalls/syscall_n64.tbl arch/mips/lantiq/xway/sysctrl.c arch/parisc/kernel/syscalls/syscall.tbl arch/powerpc/Kconfig arch/powerpc/include/asm/book3s/64/pgtable.h arch/powerpc/include/asm/cache.h arch/powerpc/include/asm/cacheflush.h arch/powerpc/include/asm/drmem.h arch/powerpc/include/asm/processor.h arch/powerpc/include/asm/ptrace.h arch/powerpc/include/asm/timex.h arch/powerpc/kernel/Makefile arch/powerpc/kernel/cputable.c arch/powerpc/kernel/fadump.c arch/powerpc/kernel/machine_kexec.c arch/powerpc/kernel/misc_32.S arch/powerpc/kernel/signal_64.c arch/powerpc/kernel/syscalls/syscall.tbl arch/powerpc/mm/book3s64/pkeys.c arch/powerpc/mm/fault.c arch/powerpc/mm/kasan/kasan_init_32.c arch/powerpc/mm/mem.c arch/powerpc/mm/ptdump/ptdump.c arch/powerpc/platforms/cell/spufs/file.c arch/powerpc/platforms/powernv/opal-imc.c arch/powerpc/platforms/pseries/suspend.c arch/powerpc/xmon/xmon.c arch/riscv/kernel/module.c arch/riscv/mm/init.c arch/s390/include/asm/uaccess.h arch/s390/include/asm/vdso.h arch/s390/kernel/asm-offsets.c arch/s390/kernel/entry.S arch/s390/kernel/mcount.S arch/s390/kernel/perf_cpum_sf.c arch/s390/kernel/smp.c arch/s390/kernel/syscalls/syscall.tbl arch/s390/kernel/time.c arch/s390/kernel/vdso64/Makefile arch/s390/kernel/vdso64/clock_getres.S arch/s390/mm/gmap.c arch/s390/pci/pci_mmio.c arch/sh/kernel/entry-common.S arch/sh/kernel/syscalls/syscall.tbl arch/sparc/kernel/ptrace_32.c arch/sparc/kernel/ptrace_64.c arch/sparc/kernel/syscalls/syscall.tbl arch/sparc/mm/srmmu.c arch/um/Makefile arch/x86/boot/Makefile arch/x86/boot/compressed/Makefile arch/x86/boot/compressed/head_32.S arch/x86/boot/compressed/head_64.S arch/x86/boot/compressed/kaslr_64.c arch/x86/configs/gki_defconfig arch/x86/entry/entry_32.S arch/x86/entry/entry_64.S arch/x86/entry/syscalls/syscall_32.tbl arch/x86/entry/syscalls/syscall_64.tbl arch/x86/events/Kconfig arch/x86/events/rapl.c arch/x86/include/asm/fpu/internal.h arch/x86/include/asm/kvm_host.h arch/x86/include/asm/pgtable_types.h arch/x86/include/asm/processor.h arch/x86/include/asm/vdso/clocksource.h arch/x86/kernel/apic/apic.c arch/x86/kernel/apic/msi.c arch/x86/kernel/cpu/bugs.c arch/x86/kernel/cpu/common.c arch/x86/kernel/cpu/mce/core.c arch/x86/kernel/cpu/resctrl/core.c arch/x86/kernel/cpu/resctrl/internal.h arch/x86/kernel/cpu/resctrl/monitor.c arch/x86/kernel/fpu/xstate.c arch/x86/kernel/kprobes/core.c arch/x86/kernel/livepatch.c arch/x86/kernel/unwind_orc.c arch/x86/kvm/kvm_cache_regs.h arch/x86/kvm/lapic.c arch/x86/kvm/mmu.c arch/x86/kvm/mmu.h arch/x86/kvm/paging_tmpl.h arch/x86/kvm/svm.c arch/x86/kvm/vmx/nested.c arch/x86/kvm/vmx/ops.h arch/x86/kvm/vmx/vmenter.S arch/x86/kvm/vmx/vmx.c arch/x86/kvm/vmx/vmx.h arch/x86/kvm/x86.c arch/x86/mm/fault.c arch/x86/mm/pageattr.c arch/x86/net/bpf_jit_comp.c arch/x86/platform/efi/efi.c arch/x86/purgatory/Makefile arch/x86/xen/enlighten_pv.c arch/xtensa/kernel/syscalls/syscall.tbl block/bio-integrity.c block/blk-core.c block/blk-crypto-fallback.c block/blk-crypto-internal.h block/blk-crypto.c block/blk-iocost.c block/blk-mq-sched.c block/blk-mq.c block/blk-settings.c block/keyslot-manager.c build.config.aarch64 build.config.allmodconfig.arm build.config.arm build.config.common build.config.db845c build.config.gki-debug.aarch64 build.config.gki-debug.x86_64 build.config.gki.aarch64 build.config.gki_kasan.aarch64 build.config.gki_kasan.x86_64 build.config.msm.common build.config.msm.gki build.config.msm.lahaina build.targets crypto/af_alg.c crypto/lrw.c crypto/xts.c drivers/acpi/apei/ghes.c drivers/acpi/ec.c drivers/acpi/evged.c drivers/acpi/nfit/core.c drivers/acpi/nfit/nfit.h drivers/acpi/processor_idle.c drivers/acpi/sleep.c drivers/android/Kconfig drivers/android/binder.c drivers/android/binder_alloc.c drivers/android/vendor_hooks.c drivers/ata/ahci.c drivers/base/arch_topology.c drivers/base/core.c drivers/base/dd.c drivers/base/firmware_loader/main.c drivers/base/memory.c drivers/base/power/wakeup.c drivers/base/regmap/regmap-irq.c drivers/block/loop.c drivers/block/null_blk_zoned.c drivers/block/rbd.c drivers/bluetooth/btmrvl_sdio.c drivers/bluetooth/btqca.c drivers/bluetooth/hci_h5.c drivers/bluetooth/hci_qca.c drivers/bluetooth/hci_serdev.c drivers/bus/ti-sysc.c drivers/char/Kconfig drivers/char/adsprpc.c drivers/char/hw_random/imx-rngc.c drivers/char/ipmi/ipmi_msghandler.c drivers/clk/actions/owl-s500.c drivers/clk/at91/clk-usb.c drivers/clk/at91/sam9x60.c drivers/clk/bcm/clk-bcm2835.c drivers/clk/clk-composite.c drivers/clk/clk.c drivers/clk/qcom/Kconfig drivers/clk/qcom/Makefile drivers/clk/qcom/clk-alpha-pll.c drivers/clk/qcom/clk-alpha-pll.h drivers/clk/qcom/clk-debug.c drivers/clk/qcom/clk-rpmh.c drivers/clk/qcom/clk-smd-rpm.c drivers/clk/qcom/common.h drivers/clk/qcom/vdd-class.c drivers/clk/renesas/renesas-cpg-mssr.c drivers/clk/samsung/clk-exynos5420.c drivers/clk/tegra/clk-tegra-pmc.c drivers/clocksource/arm_arch_timer.c drivers/clocksource/hyperv_timer.c drivers/cpufreq/cpufreq.c drivers/cpufreq/imx6q-cpufreq.c drivers/cpufreq/qcom-cpufreq-hw.c drivers/cpuidle/Kconfig.arm drivers/cpuidle/cpuidle.c drivers/cpuidle/governors/menu.c drivers/cpuidle/lpm-levels-of.c drivers/cpuidle/lpm-levels.c drivers/cpuidle/lpm-levels.h drivers/cpuidle/sysfs.c drivers/crypto/Kconfig drivers/crypto/ccree/cc_buffer_mgr.c drivers/crypto/ccree/cc_buffer_mgr.h drivers/crypto/ccree/cc_cipher.c drivers/crypto/chelsio/chtls/chtls_io.c drivers/crypto/omap-sham.c drivers/crypto/stm32/stm32-crc32.c drivers/crypto/virtio/virtio_crypto_algs.c drivers/dax/kmem.c drivers/dma-buf/Kconfig drivers/dma-buf/dma-buf.c drivers/dma/dmatest.c drivers/dma/imx-sdma.c drivers/dma/ioat/dma.c drivers/edac/amd64_edac.c drivers/edac/synopsys_edac.c drivers/firmware/arm_sdei.c drivers/firmware/efi/Kconfig drivers/firmware/efi/libstub/Makefile drivers/firmware/efi/libstub/tpm.c drivers/firmware/imx/imx-scu.c drivers/firmware/psci/psci.c drivers/firmware/qcom_scm-smc.c drivers/firmware/qcom_scm.c drivers/firmware/qcom_scm.h drivers/fpga/dfl-afu-dma-region.c drivers/gpio/gpio-dwapb.c drivers/gpio/gpio-pca953x.c drivers/gpio/gpiolib-acpi.c drivers/gpio/gpiolib.c drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c drivers/gpu/drm/amd/amdgpu/amdgpu_device.c drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c drivers/gpu/drm/amd/display/dc/core/dc.c drivers/gpu/drm/amd/display/dc/core/dc_link.c drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c drivers/gpu/drm/amd/powerplay/amd_powerplay.c drivers/gpu/drm/amd/powerplay/amdgpu_smu.c drivers/gpu/drm/amd/powerplay/hwmgr/processpptables.c drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c drivers/gpu/drm/amd/powerplay/renoir_ppt.c drivers/gpu/drm/amd/powerplay/renoir_ppt.h drivers/gpu/drm/amd/powerplay/smu_v11_0.c drivers/gpu/drm/amd/powerplay/smumgr/ci_smumgr.c drivers/gpu/drm/amd/powerplay/smumgr/vegam_smumgr.c drivers/gpu/drm/bridge/Kconfig drivers/gpu/drm/bridge/Makefile drivers/gpu/drm/drm_dp_helper.c drivers/gpu/drm/drm_dp_mst_topology.c drivers/gpu/drm/drm_encoder_slave.c drivers/gpu/drm/drm_gem.c drivers/gpu/drm/drm_panel.c drivers/gpu/drm/drm_pci.c drivers/gpu/drm/etnaviv/etnaviv_gpu.c drivers/gpu/drm/exynos/exynos_drm_dma.c drivers/gpu/drm/exynos/exynos_drm_dsi.c drivers/gpu/drm/hisilicon/kirin/kirin_drm_dsi.c drivers/gpu/drm/i915/display/intel_ddi.c drivers/gpu/drm/i915/display/intel_display.c drivers/gpu/drm/i915/display/intel_display_power.c drivers/gpu/drm/i915/display/intel_dp.c drivers/gpu/drm/i915/display/intel_dp_mst.c drivers/gpu/drm/i915/display/intel_fbc.c drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c drivers/gpu/drm/i915/gem/i915_gem_userptr.c drivers/gpu/drm/i915/gvt/display.c drivers/gpu/drm/i915/gvt/handlers.c drivers/gpu/drm/i915/gvt/scheduler.c drivers/gpu/drm/i915/gvt/vgpu.c drivers/gpu/drm/i915/i915_active.c drivers/gpu/drm/i915/i915_active.h drivers/gpu/drm/i915/i915_request.c drivers/gpu/drm/i915/intel_pm.c drivers/gpu/drm/imx/dw_hdmi-imx.c drivers/gpu/drm/imx/parallel-display.c drivers/gpu/drm/ingenic/ingenic-drm.c drivers/gpu/drm/msm/adreno/a6xx_gmu.c drivers/gpu/drm/nouveau/nouveau_sgdma.c drivers/gpu/drm/nouveau/nouveau_svm.c drivers/gpu/drm/sun4i/sun4i_tcon.c drivers/gpu/drm/sun4i/sun8i_mixer.c drivers/gpu/drm/ttm/ttm_bo.c drivers/gpu/drm/vc4/vc4_hdmi.c drivers/gpu/drm/virtio/virtgpu_object.c drivers/gpu/drm/vkms/vkms_gem.c drivers/gpu/msm/adreno_a6xx_preempt.c drivers/hid/hid-ids.h drivers/hid/hid-multitouch.c drivers/hid/hid-quirks.c drivers/hid/hid-qvr.c drivers/hv/channel_mgmt.c drivers/hv/vmbus_drv.c drivers/hwtracing/coresight/Makefile drivers/hwtracing/coresight/coresight-cti.c drivers/hwtracing/coresight/coresight-etm4x.c drivers/hwtracing/coresight/coresight-platform.c drivers/hwtracing/coresight/coresight-stm.c drivers/hwtracing/coresight/coresight-tmc-etf.c drivers/hwtracing/coresight/coresight-tmc-etr.c drivers/hwtracing/coresight/coresight.c drivers/hwtracing/intel_th/pci.c drivers/i2c/busses/i2c-altera.c drivers/i2c/busses/i2c-aspeed.c drivers/i2c/busses/i2c-designware-platdrv.c drivers/i2c/busses/i2c-rcar.c drivers/i2c/busses/i2c-tegra.c drivers/i2c/i2c-core-base.c drivers/idle/intel_idle.c drivers/iio/adc/at91-sama5d2_adc.c drivers/iio/adc/stm32-adc.c drivers/iio/adc/stm32-dfsdm-adc.c drivers/iio/dac/ad5592r-base.c drivers/iio/health/afe4403.c drivers/iio/industrialio-core.c drivers/iio/light/si1133.c drivers/iio/light/vcnl4000.c drivers/iio/magnetometer/ak8974.c drivers/infiniband/core/cm.c drivers/infiniband/core/cma.c drivers/infiniband/core/core_priv.h drivers/infiniband/core/nldev.c drivers/infiniband/core/ucma.c drivers/infiniband/core/uverbs_cmd.c drivers/infiniband/hw/mlx4/qp.c drivers/infiniband/hw/mlx5/main.c drivers/infiniband/hw/mlx5/qp.c drivers/infiniband/hw/qedr/qedr_iw_cm.c drivers/infiniband/hw/qedr/verbs.c drivers/infiniband/sw/rdmavt/cq.c drivers/infiniband/sw/rxe/rxe_recv.c drivers/infiniband/sw/siw/siw_cm.c drivers/infiniband/sw/siw/siw_main.c drivers/input/mouse/elan_i2c_core.c drivers/input/mouse/synaptics.c drivers/input/serio/i8042-x86ia64io.h drivers/input/touchscreen/Makefile drivers/interconnect/Makefile drivers/interconnect/core.c drivers/interconnect/qcom/Kconfig drivers/interconnect/qcom/Makefile drivers/interconnect/qcom/bcm-voter.c drivers/interconnect/qcom/icc-rpmh.c drivers/iommu/Kconfig drivers/iommu/amd_iommu.c drivers/iommu/amd_iommu_init.c drivers/iommu/amd_iommu_types.h drivers/iommu/arm-smmu-impl.c drivers/iommu/arm-smmu-qcom.c drivers/iommu/arm-smmu.c drivers/iommu/arm-smmu.h drivers/iommu/dma-mapping-fast.c drivers/iommu/dmar.c drivers/iommu/intel-iommu-debugfs.c drivers/iommu/intel-iommu.c drivers/iommu/intel-svm.c drivers/iommu/intel_irq_remapping.c drivers/iommu/io-pgtable-arm.c drivers/iommu/io-pgtable-fast.c drivers/iommu/io-pgtable.c drivers/iommu/iommu.c drivers/iommu/qcom_iommu.c drivers/iommu/virtio-iommu.c drivers/irqchip/Kconfig drivers/irqchip/Makefile drivers/irqchip/irq-gic-v3.c drivers/irqchip/irq-gic.c drivers/irqchip/qcom-pdc.c drivers/leds/Makefile drivers/leds/leds-lm36274.c drivers/macintosh/via-macii.c drivers/mailbox/qcom-apcs-ipc-mailbox.c drivers/md/bcache/btree.c drivers/md/bcache/super.c drivers/md/dm-bow.c drivers/md/dm-clone-target.c drivers/md/dm-default-key.c drivers/md/dm-integrity.c drivers/md/dm-mpath.c drivers/md/dm-writecache.c drivers/md/dm-zoned-reclaim.c drivers/md/dm-zoned-target.c drivers/md/dm.c drivers/md/md.c drivers/md/raid5.c drivers/media/cec/cec-adap.c drivers/media/firewire/firedtv-fw.c drivers/media/platform/cros-ec-cec/cros-ec-cec.c drivers/media/platform/exynos4-is/media-dev.c drivers/media/platform/rcar-fcp.c drivers/media/platform/ti-vpe/cal.c drivers/media/platform/vicodec/codec-v4l2-fwht.c drivers/media/platform/vicodec/vicodec-core.c drivers/media/usb/b2c2/flexcop-usb.c drivers/mfd/sprd-sc27xx-spi.c drivers/misc/Kconfig drivers/misc/habanalabs/device.c drivers/misc/habanalabs/habanalabs.h drivers/misc/hisi_hikey_usb.c drivers/misc/pci_endpoint_test.c drivers/misc/qseecom.c drivers/misc/xilinx_sdfec.c drivers/mmc/core/block.c drivers/mmc/core/host.c drivers/mmc/core/mmc_ops.c drivers/mmc/core/queue.c drivers/mmc/core/sdio.c drivers/mmc/host/Kconfig drivers/mmc/host/meson-mx-sdio.c drivers/mmc/host/mmci.c drivers/mmc/host/renesas_sdhi_internal_dmac.c drivers/mmc/host/sdhci-esdhc-imx.c drivers/mmc/host/sdhci-msm.c drivers/mmc/host/sdhci-omap.c drivers/mmc/host/sdhci-pci-gli.c drivers/mmc/host/sdhci-sprd.c drivers/mmc/host/sdhci-tegra.c drivers/mmc/host/sdhci.c drivers/mmc/host/sdhci.h drivers/mtd/nand/raw/brcmnand/brcmnand.c drivers/mtd/nand/raw/fsl_upm.c drivers/mtd/nand/raw/marvell_nand.c drivers/mtd/nand/raw/nand_onfi.c drivers/mtd/nand/raw/nand_timings.c drivers/mtd/nand/raw/oxnas_nand.c drivers/mtd/nand/spi/core.c drivers/net/Kconfig drivers/net/caif/Kconfig drivers/net/dsa/b53/b53_common.c drivers/net/dsa/bcm_sf2.c drivers/net/dsa/microchip/ksz8795.c drivers/net/dsa/mt7530.c drivers/net/dsa/rtl8366.c drivers/net/ethernet/amazon/ena/ena_com.c drivers/net/ethernet/amazon/ena/ena_netdev.c drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh_internal.h drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils.c drivers/net/ethernet/broadcom/bnxt/bnxt.c drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.h drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c drivers/net/ethernet/broadcom/genet/bcmgenet.h drivers/net/ethernet/broadcom/genet/bcmgenet_wol.c drivers/net/ethernet/cadence/macb_main.c drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_flower.c drivers/net/ethernet/cortina/gemini.c drivers/net/ethernet/freescale/Kconfig drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c drivers/net/ethernet/freescale/dpaa2/dpaa2-ethtool.c drivers/net/ethernet/freescale/enetc/Kconfig drivers/net/ethernet/freescale/enetc/enetc_pf.c drivers/net/ethernet/freescale/fec_main.c drivers/net/ethernet/huawei/hinic/hinic_hw_dev.c drivers/net/ethernet/huawei/hinic/hinic_hw_eqs.c drivers/net/ethernet/huawei/hinic/hinic_hw_mgmt.c drivers/net/ethernet/huawei/hinic/hinic_hw_qp.h drivers/net/ethernet/huawei/hinic/hinic_main.c drivers/net/ethernet/huawei/hinic/hinic_rx.c drivers/net/ethernet/ibm/ibmvnic.c drivers/net/ethernet/intel/iavf/iavf_virtchnl.c drivers/net/ethernet/intel/ice/ice_controlq.c drivers/net/ethernet/intel/ixgbe/ixgbe_main.c drivers/net/ethernet/mediatek/mtk_eth_soc.c drivers/net/ethernet/mellanox/mlx5/core/cmd.c drivers/net/ethernet/mellanox/mlx5/core/diag/fw_tracer.c drivers/net/ethernet/mellanox/mlx5/core/en.h drivers/net/ethernet/mellanox/mlx5/core/en/txrx.h drivers/net/ethernet/mellanox/mlx5/core/en/xsk/setup.c drivers/net/ethernet/mellanox/mlx5/core/en/xsk/tx.c drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls.c drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls.h drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c drivers/net/ethernet/mellanox/mlx5/core/en_main.c drivers/net/ethernet/mellanox/mlx5/core/en_rep.c drivers/net/ethernet/mellanox/mlx5/core/en_rx.c drivers/net/ethernet/mellanox/mlx5/core/en_tx.c drivers/net/ethernet/mellanox/mlx5/core/en_txrx.c drivers/net/ethernet/mellanox/mlx5/core/health.c drivers/net/ethernet/mellanox/mlx5/core/lib/clock.c drivers/net/ethernet/mellanox/mlx5/core/steering/dr_send.c drivers/net/ethernet/mellanox/mlx5/core/steering/dr_ste.c drivers/net/ethernet/mellanox/mlxsw/spectrum.c drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c drivers/net/ethernet/micrel/ks8851_mll.c drivers/net/ethernet/qlogic/qed/qed_dev.c drivers/net/ethernet/qlogic/qed/qed_int.c drivers/net/ethernet/qlogic/qede/qede_main.c drivers/net/ethernet/realtek/r8169_main.c drivers/net/ethernet/rocker/rocker_main.c drivers/net/ethernet/sfc/efx.c drivers/net/ethernet/xilinx/ll_temac.h drivers/net/ethernet/xilinx/ll_temac_main.c drivers/net/geneve.c drivers/net/hippi/rrunner.c drivers/net/macsec.c drivers/net/netdevsim/netdev.c drivers/net/phy/dp83867.c drivers/net/phy/mdio-bcm-unimac.c drivers/net/phy/mdio-mux-bcm-iproc.c drivers/net/phy/mscc.c drivers/net/phy/phy.c drivers/net/phy/sfp-bus.c drivers/net/usb/smsc95xx.c drivers/net/veth.c drivers/net/vxlan.c drivers/net/wan/Makefile drivers/net/wan/lapbether.c drivers/net/wireless/ath/ath9k/hif_usb.c drivers/net/wireless/ath/ath9k/htc_drv_init.c drivers/net/wireless/ath/ath9k/wmi.c drivers/net/wireless/ath/ath9k/wmi.h drivers/net/wireless/intel/iwlwifi/mvm/fw.c drivers/net/wireless/intel/iwlwifi/mvm/rs-fw.c drivers/net/wireless/intel/iwlwifi/mvm/sta.h drivers/net/wireless/intel/iwlwifi/pcie/tx-gen2.c drivers/net/wireless/marvell/mwifiex/sta_cmdresp.c drivers/net/wireless/mediatek/mt76/mt76.h drivers/nfc/qti/nfc_common.h drivers/nvme/host/core.c drivers/nvme/host/fc.c drivers/nvme/host/multipath.c drivers/nvme/host/nvme.h drivers/nvme/host/pci.c drivers/nvme/host/rdma.c drivers/nvme/host/tcp.c drivers/nvme/target/tcp.c drivers/nvmem/core.c drivers/nvmem/nvmem-sysfs.c drivers/nvmem/qcom-spmi-sdam.c drivers/nvmem/qfprom.c drivers/of/of_mdio.c drivers/opp/core.c drivers/pci/controller/Kconfig drivers/pci/controller/dwc/pci-meson.c drivers/pci/controller/dwc/pcie-qcom.c drivers/pci/controller/pci-aardvark.c drivers/pci/controller/pcie-cadence-host.c drivers/pci/controller/pcie-rcar.c drivers/pci/controller/vmd.c drivers/pci/endpoint/pci-epc-mem.c drivers/pci/pci-bridge-emul.c drivers/pci/pci-driver.c drivers/pci/pci.c drivers/pci/pcie/aspm.c drivers/pci/probe.c drivers/pci/quirks.c drivers/pci/switch/switchtec.c drivers/perf/arm_dsu_pmu.c drivers/phy/renesas/phy-rcar-gen3-usb2.c drivers/pinctrl/intel/pinctrl-cherryview.c drivers/pinctrl/intel/pinctrl-sunrisepoint.c drivers/pinctrl/pinctrl-ingenic.c drivers/pinctrl/pinctrl-rza1.c drivers/pinctrl/qcom/Makefile drivers/pinctrl/qcom/pinctrl-msm.c drivers/pinctrl/qcom/pinctrl-spmi-gpio.c drivers/pinctrl/samsung/pinctrl-exynos.c drivers/platform/msm/ipa_fmwk/ipa_fmwk.c drivers/platform/msm/msm_ext_display.c drivers/platform/x86/Kconfig drivers/platform/x86/asus-nb-wmi.c drivers/platform/x86/asus-wmi.c drivers/platform/x86/intel-vbtn.c drivers/platform/x86/intel_int0002_vgpio.c drivers/power/reset/Makefile drivers/power/reset/sc27xx-poweroff.c drivers/power/supply/Kconfig drivers/power/supply/Makefile drivers/power/supply/bq27xxx_battery.c drivers/power/supply/power_supply_core.c drivers/power/supply/power_supply_hwmon.c drivers/power/supply/power_supply_sysfs.c drivers/power/supply/sc27xx_fuel_gauge.c drivers/pwm/pwm-jz4740.c drivers/pwm/pwm-pca9685.c drivers/pwm/pwm-renesas-tpu.c drivers/regulator/core.c drivers/regulator/qcom_pm8008-regulator.c drivers/remoteproc/qcom_q6v5_mss.c drivers/remoteproc/remoteproc_core.c drivers/remoteproc/remoteproc_virtio.c drivers/rpmsg/qcom_glink_native.c drivers/rpmsg/rpmsg_core.c drivers/rpmsg/rpmsg_internal.h drivers/rtc/rtc-88pm860x.c drivers/s390/block/dasd.c drivers/s390/cio/qdio_setup.c drivers/s390/net/qeth_core_main.c drivers/scsi/lpfc/lpfc.h drivers/scsi/lpfc/lpfc_hbadisc.c drivers/scsi/lpfc/lpfc_init.c drivers/scsi/lpfc/lpfc_sli.c drivers/scsi/megaraid/megaraid_sas_fusion.c drivers/scsi/scsi_debug.c drivers/scsi/scsi_lib.c drivers/scsi/scsi_transport_iscsi.c drivers/scsi/sg.c drivers/scsi/smartpqi/smartpqi.h drivers/scsi/smartpqi/smartpqi_init.c drivers/scsi/sr.c drivers/scsi/ufs/Makefile drivers/scsi/ufs/ufs-mediatek.c drivers/scsi/ufs/ufs-mediatek.h drivers/scsi/ufs/ufs-qcom.c drivers/scsi/ufs/ufs-qcom.h drivers/scsi/ufs/ufs-sysfs.c drivers/scsi/ufs/ufs.h drivers/scsi/ufs/ufs_quirks.h drivers/scsi/ufs/ufshcd-crypto.c drivers/scsi/ufs/ufshcd-crypto.h drivers/scsi/ufs/ufshcd.c drivers/scsi/ufs/ufshcd.h drivers/soc/imx/soc-imx-scu.c drivers/soc/qcom/Kconfig drivers/soc/qcom/Makefile drivers/soc/qcom/cmd-db.c drivers/soc/qcom/ddr_stats.c drivers/soc/qcom/eud.c drivers/soc/qcom/llcc-lahaina.c drivers/soc/qcom/llcc-shima.c drivers/soc/qcom/rpmh-rsc.c drivers/soc/qcom/rpmh_master_stat.c drivers/soc/qcom/soc_sleep_stats.c drivers/soc/qcom/spcom.c drivers/soc/qcom/spss_utils.c drivers/soc/qcom/sys_pm_vx.c drivers/spi/spi-bcm2835.c drivers/spi/spi-dw-mid.c drivers/spi/spi-dw.c drivers/spi/spi-fsl-dspi.c drivers/spi/spi-omap2-mcspi.c drivers/spi/spi-stm32.c drivers/spi/spi-sun6i.c drivers/staging/android/ion/heaps/ion_msm_system_heap.c drivers/staging/android/ion/heaps/ion_msm_system_heap.h drivers/staging/android/ion/heaps/ion_page_pool.c drivers/staging/android/ion/heaps/ion_system_heap.c drivers/staging/android/ion/heaps/msm_ion.c drivers/staging/android/ion/heaps/msm_ion_dma_buf.c drivers/staging/android/ion/ion.c drivers/staging/android/ion/ion_dma_buf.c drivers/staging/media/allegro-dvt/allegro-core.c drivers/staging/media/hantro/hantro_h1_jpeg_enc.c drivers/staging/media/hantro/rk3399_vpu_hw_jpeg_enc.c drivers/staging/media/imx/imx7-mipi-csis.c drivers/staging/rtl8188eu/core/rtw_mlme.c drivers/staging/rtl8712/wifi.h drivers/staging/sm750fb/sm750.c drivers/staging/speakup/main.c drivers/staging/speakup/selection.c drivers/staging/vt6656/int.c drivers/staging/vt6656/key.c drivers/staging/vt6656/main_usb.c drivers/staging/wilc1000/wilc_wlan.c drivers/staging/wlan-ng/prism2usb.c drivers/target/target_core_user.c drivers/thermal/Kconfig drivers/thermal/Makefile drivers/thermal/of-thermal.c drivers/thermal/sprd_thermal.c drivers/tty/n_gsm.c drivers/tty/serial/8250/8250_exar.c drivers/tty/serial/kgdboc.c drivers/tty/serial/msm_geni_serial.c drivers/tty/serial/serial-tegra.c drivers/tty/serial/xilinx_uartps.c drivers/tty/vt/selection.c drivers/tty/vt/vt_ioctl.c drivers/usb/cdns3/ep0.c drivers/usb/cdns3/gadget.c drivers/usb/class/cdc-acm.c drivers/usb/class/cdc-acm.h drivers/usb/core/hub.c drivers/usb/core/quirks.c drivers/usb/dwc2/platform.c drivers/usb/dwc3/core.c drivers/usb/dwc3/core.h drivers/usb/dwc3/drd.c drivers/usb/dwc3/dwc3-msm.c drivers/usb/dwc3/gadget.c drivers/usb/gadget/function/f_fs.c drivers/usb/gadget/function/f_qdss.c drivers/usb/gadget/function/u_ether.c drivers/usb/gadget/legacy/Kconfig drivers/usb/gadget/udc/bdc/bdc_core.c drivers/usb/gadget/udc/net2272.c drivers/usb/host/ehci-platform.c drivers/usb/host/xhci-hub.c drivers/usb/musb/Kconfig drivers/usb/musb/Makefile drivers/usb/musb/mediatek.c drivers/usb/serial/ch341.c drivers/usb/serial/ftdi_sio.c drivers/usb/serial/option.c drivers/usb/serial/pl2303.c drivers/usb/storage/unusual_devs.h drivers/usb/storage/unusual_uas.h drivers/usb/typec/tcpm/tcpm.c drivers/vfio/vfio_iommu_type1.c drivers/video/backlight/Makefile drivers/video/console/vgacon.c drivers/virt/haven/hh_ctrl.c drivers/virtio/virtio_balloon.c drivers/w1/masters/omap_hdq.c drivers/watchdog/iTCO_wdt.c drivers/watchdog/watchdog_dev.c drivers/xen/preempt.c drivers/xen/xenbus/xenbus_client.c fs/afs/cmservice.c fs/afs/dir.c fs/afs/dir_silly.c fs/afs/fs_probe.c fs/afs/fsclient.c fs/afs/inode.c fs/afs/internal.h fs/afs/rotate.c fs/afs/rxrpc.c fs/afs/server.c fs/afs/vl_probe.c fs/afs/volume.c fs/afs/write.c fs/afs/yfsclient.c fs/binfmt_elf.c fs/block_dev.c fs/btrfs/block-group.c fs/btrfs/block-rsv.c fs/btrfs/ctree.h fs/btrfs/disk-io.c fs/btrfs/extent_io.c fs/btrfs/file.c fs/btrfs/inode.c fs/btrfs/qgroup.c fs/btrfs/relocation.c fs/btrfs/space-info.c fs/btrfs/sysfs.c fs/btrfs/volumes.c fs/ceph/super.c fs/cifs/connect.c fs/cifs/file.c fs/cifs/inode.c fs/cifs/smb2ops.c fs/cifs/transport.c fs/crypto/bio.c fs/crypto/fname.c fs/crypto/fscrypt_private.h fs/crypto/inline_crypt.c fs/crypto/keysetup.c fs/crypto/policy.c fs/debugfs/file.c fs/erofs/utils.c fs/eventpoll.c fs/exec.c fs/ext4/block_validity.c fs/ext4/ext4.h fs/ext4/inline.c fs/ext4/inode.c fs/ext4/namei.c fs/ext4/super.c fs/f2fs/checkpoint.c fs/f2fs/compress.c fs/f2fs/data.c fs/f2fs/dir.c fs/f2fs/f2fs.h fs/f2fs/file.c fs/f2fs/gc.c fs/f2fs/inode.c fs/f2fs/namei.c fs/f2fs/node.c fs/f2fs/segment.c fs/f2fs/super.c fs/f2fs/sysfs.c fs/f2fs/xattr.c fs/fuse/dev.c fs/fuse/file.c fs/fuse/inode.c fs/fuse/virtio_fs.c fs/gfs2/glops.c fs/gfs2/ops_fstype.c fs/incfs/Kconfig fs/incfs/data_mgmt.c fs/incfs/data_mgmt.h fs/incfs/format.c fs/incfs/format.h fs/incfs/vfs.c fs/internal.h fs/io_uring.c fs/jbd2/journal.c fs/kernfs/file.c fs/libfs.c fs/namei.c fs/nfs/callback_proc.c fs/nfs/mount_clnt.c fs/nfs/pagelist.c fs/nfs/write.c fs/nfsd/nfs4callback.c fs/nfsd/nfs4xdr.c fs/nfsd/nfscache.c fs/nfsd/nfsd.h fs/notify/fanotify/fanotify.c fs/notify/inotify/inotify_fsnotify.c fs/ocfs2/dlmfs/dlmfs.c fs/open.c fs/orangefs/file.c fs/overlayfs/file.c fs/overlayfs/inode.c fs/overlayfs/super.c fs/proc/Kconfig fs/proc/meminfo.c fs/pstore/ram.c fs/userfaultfd.c fs/xattr.c fs/xfs/libxfs/xfs_trans_space.h fs/xfs/xfs_buf.c fs/xfs/xfs_dquot.c fs/xfs/xfs_reflink.c fs/xfs/xfs_trans_dquot.c include/asm-generic/vmlinux.lds.h include/drm/drm_dp_helper.h include/drm/drm_panel.h include/dt-bindings/clock/qcom,rpmcc.h include/dt-bindings/clock/qcom,rpmh.h include/dt-bindings/iio/qcom,spmi-adc7-pm8350b.h include/dt-bindings/iio/qcom,spmi-vadc.h include/keys/big_key-type.h include/linux/bio-crypt-ctx.h include/linux/bio.h include/linux/blk-crypto.h include/linux/bpf.h include/linux/cgroup-defs.h include/linux/compiler.h include/linux/coresight-stm.h include/linux/coresight.h include/linux/cpu.h include/linux/cpuidle.h include/linux/dcache.h include/linux/device.h include/linux/dma-buf.h include/linux/dma-mapping.h include/linux/dsa/8021q.h include/linux/dynamic_debug.h include/linux/ethtool.h include/linux/fs.h include/linux/fscrypt.h include/linux/fsnotify.h include/linux/fwnode.h include/linux/genhd.h include/linux/hyperv.h include/linux/inet_diag.h include/linux/intel-iommu.h include/linux/io-pgtable-fast.h include/linux/io-pgtable.h include/linux/iommu.h include/linux/ipa.h include/linux/ipa_fmwk.h include/linux/irq.h include/linux/irqdomain.h include/linux/keyslot-manager.h include/linux/memcontrol.h include/linux/mhi.h include/linux/mm.h include/linux/mm_types.h include/linux/mmc/host.h include/linux/mmu_notifier.h include/linux/mmzone.h include/linux/module.h include/linux/mount.h include/linux/namei.h include/linux/net.h include/linux/netdevice.h include/linux/nfs_fs.h include/linux/pci-epc.h include/linux/phy.h include/linux/pid.h include/linux/platform_data/ti-sysc.h include/linux/platform_device.h include/linux/power/charger-manager.h include/linux/prandom.h include/linux/printk.h include/linux/qcom_scm.h include/linux/qed/qed_chain.h include/linux/random.h include/linux/regmap.h include/linux/rhashtable.h include/linux/rpmsg.h include/linux/sched.h include/linux/sched/mm.h include/linux/sched/signal.h include/linux/sched/topology.h include/linux/scmi_protocol.h include/linux/soc/qcom/llcc-qcom.h include/linux/soc/qcom/msm_mmrm.h include/linux/sunrpc/clnt.h include/linux/sunrpc/svc_rdma.h include/linux/sunrpc/xdr.h include/linux/swap.h include/linux/syscalls.h include/linux/tcp.h include/linux/time32.h include/linux/tracepoint.h include/linux/usb.h include/linux/usb/gadget.h include/linux/vmalloc.h include/net/af_rxrpc.h include/net/cfg80211.h include/net/drop_monitor.h include/net/genetlink.h include/net/ndisc.h include/net/nexthop.h include/net/tcp.h include/scsi/scsi_cmnd.h include/scsi/scsi_device.h include/soc/qcom/lpm_levels.h include/sound/jack.h include/sound/pcm.h include/sound/rt5670.h include/sound/soc.h include/trace/events/f2fs.h include/trace/events/gpu_mem.h include/trace/events/iocost.h include/trace/events/rpcrdma.h include/trace/events/rxrpc.h include/trace/events/sched.h include/trace/events/trace_msm_low_power.h include/trace/hooks/debug.h include/trace/hooks/sched.h include/trace/hooks/topology.h include/trace/hooks/vendor_hooks.h include/uapi/asm-generic/unistd.h include/uapi/linux/incrementalfs.h include/uapi/linux/msm_ion_ids.h include/uapi/linux/msm_ipa.h include/uapi/linux/nl80211.h include/uapi/linux/seccomp.h include/uapi/linux/taskstats.h include/uapi/linux/wireless.h include/uapi/sound/compress_params.h include/vdso/datapage.h include/vdso/time.h init/Kconfig.gki init/Makefile kernel/audit.c kernel/bpf/cgroup.c kernel/bpf/core.c kernel/bpf/helpers.c kernel/bpf/syscall.c kernel/bpf/sysfs_btf.c kernel/bpf/verifier.c kernel/cfi.c kernel/cgroup/cgroup-v1.c kernel/cgroup/cgroup.c kernel/cpu_pm.c kernel/dma/mapping.c kernel/events/core.c kernel/exit.c kernel/fork.c kernel/futex.c kernel/irq/debugfs.c kernel/kallsyms.c kernel/kprobes.c kernel/livepatch/core.c kernel/locking/lockdep.c kernel/locking/rwsem.c kernel/module.c kernel/notifier.c kernel/pid.c kernel/power/hibernate.c kernel/power/wakeup_reason.c kernel/printk/printk.c kernel/sched/core.c kernel/sched/cpufreq_schedutil.c kernel/sched/cpupri.c kernel/sched/deadline.c kernel/sched/debug.c kernel/sched/fair.c kernel/sched/idle.c kernel/sched/rt.c kernel/sched/sched.h kernel/sched/stop_task.c kernel/sched/topology.c kernel/scs.c kernel/sysctl.c kernel/taskstats.c kernel/time/timer.c kernel/trace/blktrace.c kernel/trace/ftrace.c kernel/trace/power-traces.c kernel/trace/ring_buffer.c kernel/trace/trace.c kernel/trace/trace_events_hist.c kernel/umh.c kernel/workqueue.c lib/Kconfig.debug lib/Makefile lib/crc-t10dif.c lib/devres.c lib/dynamic_debug.c lib/find_bit.c lib/kobject.c lib/raid6/test/Makefile lib/random32.c lib/test_kasan.c lib/vdso/gettimeofday.c mm/Kconfig mm/compaction.c mm/filemap.c mm/gup.c mm/huge_memory.c mm/hugetlb.c mm/kasan/Makefile mm/khugepaged.c mm/ksm.c mm/madvise.c mm/memblock.c mm/memcontrol.c mm/memory-failure.c mm/memory.c mm/memory_hotplug.c mm/mempolicy.c mm/migrate.c mm/mmap.c mm/mprotect.c mm/nommu.c mm/oom_kill.c mm/page_alloc.c mm/page_owner.c mm/slab_common.c mm/slub.c mm/sparse.c mm/swap.c mm/swap_state.c mm/swapfile.c mm/vmalloc.c mm/vmscan.c mm/vmstat.c mm/zsmalloc.c modules.list.msm.lahaina net/ax25/af_ax25.c net/bridge/Kconfig net/bridge/br_private.h net/ceph/osd_client.c net/ceph/osdmap.c net/compat.c net/core/dev.c net/core/devlink.c net/core/filter.c net/core/flow_dissector.c net/core/skmsg.c net/core/sock_map.c net/dsa/dsa2.c net/dsa/master.c net/dsa/port.c net/dsa/slave.c net/dsa/tag_8021q.c net/dsa/tag_mtk.c net/dsa/tag_sja1105.c net/hsr/hsr_netlink.c net/hsr/hsr_slave.c net/ipv4/inet_diag.c net/ipv4/ip_vti.c net/ipv4/netfilter/nf_nat_pptp.c net/ipv4/nexthop.c net/ipv4/tcp.c net/ipv4/tcp_bpf.c net/ipv4/tcp_input.c net/ipv4/tcp_ipv4.c net/ipv4/tcp_output.c net/ipv4/udp.c net/ipv4/xfrm4_output.c net/ipv6/icmp.c net/ipv6/udp.c net/ipv6/xfrm6_output.c net/l2tp/l2tp_core.c net/mac80211/ieee80211_i.h net/mac80211/main.c net/mac80211/mesh.c net/mac80211/mesh_hwmp.c net/mac80211/mesh_plink.c net/mac80211/mlme.c net/mac80211/rc80211_minstrel_ht.c net/mac80211/status.c net/mac80211/tx.c net/mac80211/util.c net/netfilter/nf_tables_api.c net/netfilter/nft_set_rbtree.c net/netlink/af_netlink.c net/qrtr/ns.c net/qrtr/qrtr.c net/rxrpc/af_rxrpc.c net/rxrpc/ar-internal.h net/rxrpc/conn_client.c net/rxrpc/input.c net/rxrpc/key.c net/rxrpc/local_object.c net/rxrpc/output.c net/rxrpc/peer_object.c net/rxrpc/rtt.c net/sched/act_ct.c net/sched/sch_cake.c net/smc/smc_ib.c net/sunrpc/auth_gss/auth_gss.c net/sunrpc/auth_gss/gss_krb5_wrap.c net/sunrpc/auth_gss/svcauth_gss.c net/sunrpc/svcsock.c net/sunrpc/xprtrdma/svc_rdma_backchannel.c net/sunrpc/xprtrdma/svc_rdma_rw.c net/sunrpc/xprtrdma/svc_rdma_sendto.c net/sunrpc/xprtrdma/svc_rdma_transport.c net/wireless/chan.c net/wireless/nl80211.c net/wireless/reg.c net/wireless/sme.c net/wireless/util.c net/xdp/xdp_umem.c net/xdp/xsk.c net/xfrm/xfrm_device.c net/xfrm/xfrm_interface.c samples/bpf/xdp_redirect_cpu_user.c scripts/Kconfig.include scripts/Makefile.extrawarn scripts/Makefile.lib scripts/checkpatch.pl scripts/gcc-plugins/Makefile scripts/gen_autoksyms.sh scripts/headers_install.sh scripts/kconfig/qconf.cc scripts/link-vmlinux.sh scripts/mkcompile_h scripts/mod/modpost.c scripts/module-lto.lds security/integrity/ima/ima.h security/integrity/ima/ima_appraise.c security/integrity/ima/ima_crypto.c security/integrity/ima/ima_policy.c security/integrity/platform_certs/load_uefi.c security/keys/big_key.c security/keys/encrypted-keys/encrypted.c security/keys/keyctl.c security/keys/trusted.c security/selinux/hooks.c security/smack/smack_lsm.c sound/core/compress_offload.c sound/core/hwdep.c sound/core/jack.c sound/core/oss/pcm_plugin.c sound/core/seq/oss/seq_oss.c sound/pci/hda/hda_intel.c sound/pci/hda/patch_ca0132.c sound/pci/hda/patch_hdmi.c sound/pci/hda/patch_realtek.c sound/soc/codecs/max98373.c sound/soc/codecs/rt5670.c sound/soc/fsl/fsl_asrc_dma.c sound/soc/fsl/fsl_esai.c sound/soc/intel/atom/sst-mfld-platform-pcm.c sound/soc/intel/boards/bytcr_rt5640.c sound/soc/meson/axg-tdm-interface.c sound/soc/qcom/Kconfig sound/soc/qcom/common.c sound/soc/qcom/qdsp6/q6afe-dai.c sound/soc/sh/rcar/ssi.c sound/soc/soc-compress.c sound/soc/soc-core.c sound/soc/soc-pcm.c sound/soc/soc-topology.c sound/soc/sof/imx/Kconfig sound/soc/stm/stm32_sai_sub.c sound/usb/card.c sound/usb/format.c sound/usb/line6/podhd.c sound/usb/mixer_maps.c sound/usb/pcm.c sound/usb/quirks-table.h sound/usb/quirks.c tools/arch/x86/include/uapi/asm/unistd.h tools/cgroup/iocost_monitor.py tools/lib/bpf/hashmap.c tools/lib/bpf/libbpf.c tools/lib/bpf/libbpf_internal.h tools/objtool/check.c tools/perf/arch/arm/util/auxtrace.c tools/perf/arch/arm/util/cs-etm.c tools/perf/arch/arm64/util/arm-spe.c tools/perf/arch/x86/util/intel-bts.c tools/perf/arch/x86/util/intel-pt.c tools/perf/bench/epoll-wait.c tools/perf/bench/futex-hash.c tools/perf/bench/futex-lock-pi.c tools/perf/util/evsel.c tools/perf/util/map.c tools/perf/util/probe-event.c tools/perf/util/probe-finder.c tools/perf/util/stat.c tools/testing/selftests/bpf/prog_tests/flow_dissector.c tools/testing/selftests/bpf/progs/test_get_stack_rawtp_err.c tools/testing/selftests/bpf/test_select_reuseport.c tools/testing/selftests/bpf/verifier/bpf_get_stack.c tools/testing/selftests/filesystems/incfs/Makefile tools/testing/selftests/filesystems/incfs/incfs_test.c tools/testing/selftests/filesystems/incfs/utils.c tools/testing/selftests/filesystems/incfs/utils.h tools/testing/selftests/ftrace/test.d/ftrace/tracing-error-log.tc tools/testing/selftests/lib.mk tools/testing/selftests/networking/timestamping/rxtimestamp.c tools/testing/selftests/networking/timestamping/timestamping.c tools/testing/selftests/powerpc/mm/.gitignore tools/testing/selftests/x86/protection_keys.c usr/Kconfig virt/kvm/arm/aarch32.c virt/kvm/arm/arm.c virt/kvm/arm/hyp/aarch32.c virt/kvm/arm/mmu.c virt/kvm/arm/vgic/vgic-mmio-v2.c virt/kvm/arm/vgic/vgic-mmio-v3.c virt/kvm/arm/vgic/vgic-mmio.c virt/kvm/arm/vgic/vgic-mmio.h Change-Id: I5dd433d183ce212962dd0dea2b4bbc5400ae3a00 Signed-off-by: Ivaylo Georgiev <irgeorgiev@codeaurora.org> Signed-off-by: Blagovest Kolenichev <bkolenichev@codeaurora.org>
This commit is contained in:
commit
7781777d97
6
.gitignore
vendored
6
.gitignore
vendored
@ -153,10 +153,8 @@ x509.genkey
|
||||
# Clang's compilation database file
|
||||
/compile_commands.json
|
||||
|
||||
# GKI generated defconfigs
|
||||
arch/*/configs/vendor/*-gki_defconfig
|
||||
arch/*/configs/vendor/*-qgki_defconfig
|
||||
arch/*/configs/vendor/*-qgki-debug_defconfig
|
||||
# generated defconfigs
|
||||
arch/*/configs/vendor/*_defconfig
|
||||
|
||||
# vendor device tree directories
|
||||
arch/arm64/boot/dts/vendor
|
||||
|
@ -3,7 +3,7 @@ Ramoops oops/panic logger
|
||||
|
||||
Sergiu Iordache <sergiu@chromium.org>
|
||||
|
||||
Updated: 17 November 2011
|
||||
Updated: 10 July 2020
|
||||
|
||||
Introduction
|
||||
------------
|
||||
@ -29,7 +29,9 @@ mapping to pgprot_writecombine. Setting ``mem_type=1`` attempts to use
|
||||
``pgprot_noncached``, which only works on some platforms. This is because pstore
|
||||
depends on atomic operations. At least on ARM, pgprot_noncached causes the
|
||||
memory to be mapped strongly ordered, and atomic operations on strongly ordered
|
||||
memory are implementation defined, and won't work on many ARMs such as omaps.
|
||||
memory are implementation defined, and won't work on many ARMs such as omaps. Setting
|
||||
``mem_type=2`` attempts to treat the memory region as normal memory, which enables
|
||||
full cache on it. This can improve the performance.
|
||||
|
||||
The memory area is divided into ``record_size`` chunks (also rounded down to
|
||||
power of two) and each kmesg dump writes a ``record_size`` chunk of
|
||||
|
@ -41,6 +41,7 @@ Currently, these files are in /proc/sys/vm:
|
||||
- extra_free_kbytes
|
||||
- highmem_is_dirtyable
|
||||
- hugetlb_shm_group
|
||||
- kswapd_threads
|
||||
- laptop_mode
|
||||
- legacy_va_layout
|
||||
- lowmem_reserve_ratio
|
||||
@ -329,6 +330,25 @@ hugetlb_shm_group
|
||||
hugetlb_shm_group contains group id that is allowed to create SysV
|
||||
shared memory segment using hugetlb page.
|
||||
|
||||
kswapd_threads
|
||||
==============
|
||||
kswapd_threads allows you to control the number of kswapd threads per node
|
||||
running on the system. This provides the ability to devote additional CPU
|
||||
resources toward proactive page replacement with the goal of reducing
|
||||
direct reclaims. When direct reclaims are prevented, the CPU consumed
|
||||
by them is prevented as well. Depending on the workload, the result can
|
||||
cause aggregate CPU usage on the system to go up, down or stay the same.
|
||||
|
||||
More aggressive page replacement can reduce direct reclaims which cause
|
||||
latency for tasks and decrease throughput when doing filesystem IO through
|
||||
the pagecache. Direct reclaims are recorded using the allocstall counter
|
||||
in /proc/vmstat.
|
||||
|
||||
The default value is 1 and the range of acceptible values are 1-16.
|
||||
Always start with lower values in the 2-6 range. Higher values should
|
||||
be justified with testing. If direct reclaims occur in spite of high
|
||||
values, the cost of direct reclaims (in latency) that occur can be
|
||||
higher due to increased lock contention.
|
||||
|
||||
laptop_mode
|
||||
===========
|
||||
|
468
Documentation/arm/msm/remote_debug_drv.txt
Normal file
468
Documentation/arm/msm/remote_debug_drv.txt
Normal file
@ -0,0 +1,468 @@
|
||||
Introduction
|
||||
============
|
||||
|
||||
The goal of this debug feature is to provide a reliable, responsive,
|
||||
accurate and secure debug capability to developers interested in
|
||||
debugging MSM subsystem processor images without the use of a hardware
|
||||
debugger.
|
||||
|
||||
The Debug Agent along with the Remote Debug Driver implements a shared
|
||||
memory based transport mechanism that allows for a debugger (ex. GDB)
|
||||
running on a host PC to communicate with a remote stub running on
|
||||
peripheral subsystems such as the ADSP, MODEM etc.
|
||||
|
||||
The diagram below depicts end to end the components involved to
|
||||
support remote debugging:
|
||||
|
||||
|
||||
: :
|
||||
: HOST (PC) : MSM
|
||||
: ,--------, : ,-------,
|
||||
: | | : | Debug | ,--------,
|
||||
: |Debugger|<--:-->| Agent | | Remote |
|
||||
: | | : | App | +----->| Debug |
|
||||
: `--------` : |-------| ,--------, | | Stub |
|
||||
: : | Remote| | |<---+ `--------`
|
||||
: : | Debug |<-->|--------|
|
||||
: : | Driver| | |<---+ ,--------,
|
||||
: : `-------` `--------` | | Remote |
|
||||
: : LA Shared +----->| Debug |
|
||||
: : Memory | Stub |
|
||||
: : `--------`
|
||||
: : Peripheral Subsystems
|
||||
: : (ADSP, MODEM, ...)
|
||||
|
||||
|
||||
Debugger: Debugger application running on the host PC that
|
||||
communicates with the remote stub.
|
||||
Examples: GDB, LLDB
|
||||
|
||||
Debug Agent: Software that runs on the Linux Android platform
|
||||
that provides connectivity from the MSM to the
|
||||
host PC. This involves two portions:
|
||||
1) User mode Debug Agent application that discovers
|
||||
processes running on the subsystems and creates
|
||||
TCP/IP sockets for the host to connect to. In addition
|
||||
to this, it creates an info (or meta) port that
|
||||
users can connect to discover the various
|
||||
processes and their corresponding debug ports.
|
||||
|
||||
Remote Debug A character based driver that the Debug
|
||||
Driver: Agent uses to transport the payload received from the
|
||||
host to the debug stub running on the subsystem
|
||||
processor over shared memory and vice versa.
|
||||
|
||||
Shared Memory: Shared memory from the SMEM pool that is accessible
|
||||
from the Applications Processor (AP) and the
|
||||
subsystem processors.
|
||||
|
||||
Remote Debug Privileged code that runs in the kernels of the
|
||||
Stub: subsystem processors that receives debug commands
|
||||
from the debugger running on the host and
|
||||
acts on these commands. These commands include reading
|
||||
and writing to registers and memory belonging to the
|
||||
subsystem's address space, setting breakpoints,
|
||||
single stepping etc.
|
||||
|
||||
Hardware description
|
||||
====================
|
||||
|
||||
The Remote Debug Driver interfaces with the Remote Debug stubs
|
||||
running on the subsystem processors and does not drive or
|
||||
manage any hardware resources.
|
||||
|
||||
Software description
|
||||
====================
|
||||
|
||||
The debugger and the remote stubs use Remote Serial Protocol (RSP)
|
||||
to communicate with each other. This is widely used protocol by both
|
||||
software and hardware debuggers. RSP is an ASCII based protocol
|
||||
and used when it is not possible to run GDB server on the target under
|
||||
debug.
|
||||
|
||||
The Debug Agent application along with the Remote Debug Driver
|
||||
is responsible for establishing a bi-directional connection from
|
||||
the debugger application running on the host to the remote debug
|
||||
stub running on a subsystem. The Debug Agent establishes connectivity
|
||||
to the host PC via TCP/IP sockets.
|
||||
|
||||
This feature uses ADB port forwarding to establish connectivity
|
||||
between the debugger running on the host and the target under debug.
|
||||
|
||||
Please note the Debug Agent does not expose HLOS memory to the
|
||||
remote subsystem processors.
|
||||
|
||||
Design
|
||||
======
|
||||
|
||||
Here is the overall flow:
|
||||
|
||||
1) When the Debug Agent application starts up, it opens up a shared memory
|
||||
based transport channel to the various subsystem processor images.
|
||||
|
||||
2) The Debug Agent application sends messages across to the remote stubs
|
||||
to discover the various processes that are running on the subsystem and
|
||||
creates debug sockets for each of them.
|
||||
|
||||
3) Whenever a process running on a subsystem exits, the Debug Agent
|
||||
is notified by the stub so that the debug port and other resources
|
||||
can be reclaimed.
|
||||
|
||||
4) The Debug Agent uses the services of the Remote Debug Driver to
|
||||
transport payload from the host debugger to the remote stub and vice versa.
|
||||
|
||||
5) Communication between the Remote Debug Driver and the Remote Debug stub
|
||||
running on the subsystem processor is done over shared memory (see figure).
|
||||
SMEM services are used to allocate the shared memory that will
|
||||
be readable and writeable by the AP and the subsystem image under debug.
|
||||
|
||||
A separate SMEM allocation takes place for each subsystem processor
|
||||
involved in remote debugging. The remote stub running on each of the
|
||||
subsystems allocates a SMEM buffer using a unique identifier so that both
|
||||
the AP and subsystem get the same physical block of memory. It should be
|
||||
noted that subsystem images can be restarted at any time.
|
||||
However, when a subsystem comes back up, its stub uses the same unique
|
||||
SMEM identifier to allocate the SMEM block. This would not result in a
|
||||
new allocation rather the same block of memory in the first bootup instance
|
||||
is provided back to the stub running on the subsystem.
|
||||
|
||||
An 8KB chunk of shared memory is allocated and used for communication
|
||||
per subsystem. For multi-process capable subsystems, 16KB chunk of shared
|
||||
memory is allocated to allow for simultaneous debugging of more than one
|
||||
process running on a single subsystem.
|
||||
|
||||
The shared memory is used as a circular ring buffer in each direction.
|
||||
Thus we have a bi-directional shared memory channel between the AP
|
||||
and a subsystem. We call this SMQ. Each memory channel contains a header,
|
||||
data and a control mechanism that is used to synchronize read and write
|
||||
of data between the AP and the remote subsystem.
|
||||
|
||||
Overall SMQ memory view:
|
||||
:
|
||||
: +------------------------------------------------+
|
||||
: | SMEM buffer |
|
||||
: |-----------------------+------------------------|
|
||||
: |Producer: LA | Producer: Remote |
|
||||
: |Consumer: Remote | subsystem |
|
||||
: | subsystem | Consumer: LA |
|
||||
: | | |
|
||||
: | Producer| Consumer|
|
||||
: +-----------------------+------------------------+
|
||||
: | |
|
||||
: | |
|
||||
: | +--------------------------------------+
|
||||
: | |
|
||||
: | |
|
||||
: v v
|
||||
: +--------------------------------------------------------------+
|
||||
: | Header | Data | Control |
|
||||
: +-----------+---+---+---+-----+----+--+--+-----+---+--+--+-----+
|
||||
: | | b | b | b | | S |n |n | | S |n |n | |
|
||||
: | Producer | l | l | l | | M |o |o | | M |o |o | |
|
||||
: | Ver | o | o | o | | Q |d |d | | Q |d |d | |
|
||||
: |-----------| c | c | c | ... | |e |e | ... | |e |e | ... |
|
||||
: | | k | k | k | | O | | | | I | | | |
|
||||
: | Consumer | | | | | u |0 |1 | | n |0 |1 | |
|
||||
: | Ver | 0 | 1 | 2 | | t | | | | | | | |
|
||||
: +-----------+---+---+---+-----+----+--+--+-----+---+--+--+-----+
|
||||
: | |
|
||||
: + |
|
||||
: |
|
||||
: +------------------------+
|
||||
: |
|
||||
: v
|
||||
: +----+----+----+----+
|
||||
: | SMQ Nodes |
|
||||
: |----|----|----|----|
|
||||
: Node # | 0 | 1 | 2 | ...|
|
||||
: |----|----|----|----|
|
||||
: Starting Block Index # | 0 | 3 | 8 | ...|
|
||||
: |----|----|----|----|
|
||||
: # of blocks | 3 | 5 | 1 | ...|
|
||||
: +----+----+----+----+
|
||||
:
|
||||
|
||||
Header: Contains version numbers for software compatibility to ensure
|
||||
that both producers and consumers on the AP and subsystems know how to
|
||||
read from and write to the queue.
|
||||
Both the producer and consumer versions are 1.
|
||||
: +---------+-------------------+
|
||||
: | Size | Field |
|
||||
: +---------+-------------------+
|
||||
: | 1 byte | Producer Version |
|
||||
: +---------+-------------------+
|
||||
: | 1 byte | Consumer Version |
|
||||
: +---------+-------------------+
|
||||
|
||||
|
||||
Data: The data portion contains multiple blocks [0..N] of a fixed size.
|
||||
The block size SM_BLOCKSIZE is fixed to 128 bytes for header version #1.
|
||||
Payload sent from the debug agent app is split (if necessary) and placed
|
||||
in these blocks. The first data block is placed at the next 8 byte aligned
|
||||
address after the header.
|
||||
|
||||
The number of blocks for a given SMEM allocation is derived as follows:
|
||||
Number of Blocks = ((Total Size - Alignment - Size of Header
|
||||
- Size of SMQIn - Size of SMQOut)/(SM_BLOCKSIZE))
|
||||
|
||||
The producer maintains a private block map of each of these blocks to
|
||||
determine which of these blocks in the queue is available and which are free.
|
||||
|
||||
Control:
|
||||
The control portion contains a list of nodes [0..N] where N is number
|
||||
of available data blocks. Each node identifies the data
|
||||
block indexes that contain a particular debug message to be transferred,
|
||||
and the number of blocks it took to hold the contents of the message.
|
||||
|
||||
Each node has the following structure:
|
||||
: +---------+-------------------+
|
||||
: | Size | Field |
|
||||
: +---------+-------------------+
|
||||
: | 2 bytes |Staring Block Index|
|
||||
: +---------+-------------------+
|
||||
: | 2 bytes |Number of Blocks |
|
||||
: +---------+-------------------+
|
||||
|
||||
The producer and the consumer update different parts of the control channel
|
||||
(SMQOut / SMQIn) respectively. Each of these control data structures contains
|
||||
information about the last node that was written / read, and the actual nodes
|
||||
that were written/read.
|
||||
|
||||
SMQOut Structure (R/W by producer, R by consumer):
|
||||
: +---------+-------------------+
|
||||
: | Size | Field |
|
||||
: +---------+-------------------+
|
||||
: | 4 bytes | Magic Init Number |
|
||||
: +---------+-------------------+
|
||||
: | 4 bytes | Reset |
|
||||
: +---------+-------------------+
|
||||
: | 4 bytes | Last Sent Index |
|
||||
: +---------+-------------------+
|
||||
: | 4 bytes | Index Free Read |
|
||||
: +---------+-------------------+
|
||||
|
||||
SMQIn Structure (R/W by consumer, R by producer):
|
||||
: +---------+-------------------+
|
||||
: | Size | Field |
|
||||
: +---------+-------------------+
|
||||
: | 4 bytes | Magic Init Number |
|
||||
: +---------+-------------------+
|
||||
: | 4 bytes | Reset ACK |
|
||||
: +---------+-------------------+
|
||||
: | 4 bytes | Last Read Index |
|
||||
: +---------+-------------------+
|
||||
: | 4 bytes | Index Free Write |
|
||||
: +---------+-------------------+
|
||||
|
||||
Magic Init Number:
|
||||
Both SMQ Out and SMQ In initialize this field with a predefined magic
|
||||
number so as to make sure that both the consumer and producer blocks
|
||||
have fully initialized and have valid data in the shared memory control area.
|
||||
Producer Magic #: 0xFF00FF01
|
||||
Consumer Magic #: 0xFF00FF02
|
||||
|
||||
SMQ Out's Last Sent Index and Index Free Read:
|
||||
Only a producer can write to these indexes and they are updated whenever
|
||||
there is new payload to be inserted into the SMQ in order to be sent to a
|
||||
consumer.
|
||||
|
||||
The number of blocks required for the SMQ allocation is determined as:
|
||||
(payload size + SM_BLOCKSIZE - 1) / SM_BLOCKSIZE
|
||||
|
||||
The private block map is searched for a large enough continuous set of blocks
|
||||
and the user data is copied into the data blocks.
|
||||
|
||||
The starting index of the free block(s) is updated in the SMQOut's Last Sent
|
||||
Index. This update keeps track of which index was last written to and the
|
||||
producer uses it to determine where the the next allocation could be done.
|
||||
|
||||
Every allocation, a producer updates the Index Free Read from its
|
||||
collaborating consumer's Index Free Write field (if they are unequal).
|
||||
This index value indicates that the consumer has read all blocks associated
|
||||
with allocation on the SMQ and that the producer can reuse these blocks for
|
||||
subsquent allocations since this is a circular queue.
|
||||
|
||||
At cold boot and restart, these indexes are initialized to zero and all
|
||||
blocks are marked as available for allocation.
|
||||
|
||||
SMQ In's Last Read Index and Index Free Write:
|
||||
These indexes are written to only by a consumer and are updated whenever
|
||||
there is new payload to be read from the SMQ. The Last Read Index keeps
|
||||
track of which index was last read by the consumer and using this, it
|
||||
determines where the next read should be done.
|
||||
After completing a read, Last Read Index is incremented to the
|
||||
next block index. A consumer updates Index Free Write to the starting
|
||||
index of an allocation whenever it has completed processing the blocks.
|
||||
This is an optimization that can be used to prevent an additional copy
|
||||
of data from the queue into a client's data buffer and the data in the queue
|
||||
itself can be used.
|
||||
Once Index Free Write is updated, the collaborating producer (on the next
|
||||
data allocation) reads the updated Index Free Write value and it then
|
||||
updates its corresponding SMQ Out's Index Free Read and marks the blocks
|
||||
associated with that index as available for allocation. At cold boot and
|
||||
restart, these indexes are initialized to zero.
|
||||
|
||||
SMQ Out Reset# and SMQ In Reset ACK #:
|
||||
Since subsystems can restart at anytime, the data blocks and control channel
|
||||
can be in an inconsistent state when a producer or consumer comes up.
|
||||
We use Reset and Reset ACK to manage this. At cold boot, the producer
|
||||
initializes the Reset# to a known number ex. 1. Every other reset that the
|
||||
producer undergoes, the Reset#1 is simply incremented by 1. All the producer
|
||||
indexes are reset.
|
||||
When the producer notifies the consumer of data availability, the consumer
|
||||
reads the producers Reset # and copies that into its SMQ In Reset ACK#
|
||||
field when they differ. When that occurs, the consumer resets its
|
||||
indexes to 0.
|
||||
|
||||
6) Asynchronous notifications between a producer and consumer are
|
||||
done using the SMP2P service which is interrupt based.
|
||||
|
||||
Power Management
|
||||
================
|
||||
|
||||
None
|
||||
|
||||
SMP/multi-core
|
||||
==============
|
||||
|
||||
The driver uses completion to wake up the Debug Agent client threads.
|
||||
|
||||
Security
|
||||
========
|
||||
|
||||
From the perspective of the subsystem, the AP is untrusted. The remote
|
||||
stubs consult the secure debug fuses to determine whether or not the
|
||||
remote debugging will be enabled at the subsystem.
|
||||
|
||||
If the hardware debug fuses indicate that debugging is disabled, the
|
||||
remote stubs will not be functional on the subsystem. Writes to the
|
||||
queue will only be done if the driver sees that the remote stub has been
|
||||
initialized on the subsystem.
|
||||
|
||||
Therefore even if any untrusted software running on the AP requests
|
||||
the services of the Remote Debug Driver and inject RSP messages
|
||||
into the shared memory buffer, these RSP messages will be discarded and
|
||||
an appropriate error code will be sent up to the invoking application.
|
||||
|
||||
Performance
|
||||
===========
|
||||
|
||||
During operation, the Remote Debug Driver copies RSP messages
|
||||
asynchronously sent from the host debugger to the remote stub and vice
|
||||
versa. The debug messages are ASCII based and relatively short
|
||||
(<25 bytes) and may once in a while go up to a maximum 700 bytes
|
||||
depending on the command the user requested. Thus we do not
|
||||
anticipate any major performance impact. Moreover, in a typical
|
||||
functional debug scenario performance should not be a concern.
|
||||
|
||||
Interface
|
||||
=========
|
||||
|
||||
The Remote Debug Driver is a character based device that manages
|
||||
a piece of shared memory that is used as a bi-directional
|
||||
single producer/consumer circular queue using a next fit allocator.
|
||||
Every subsystem, has its own shared memory buffer that is managed
|
||||
like a separate device.
|
||||
|
||||
The driver distinguishes each subsystem processor's buffer by
|
||||
registering a node with a different minor number.
|
||||
|
||||
For each subsystem that is supported, the driver exposes a user space
|
||||
interface through the following node:
|
||||
- /dev/rdbg-<subsystem>
|
||||
Ex. /dev/rdbg-adsp (for the ADSP subsystem)
|
||||
|
||||
The standard open(), close(), read() and write() API set is
|
||||
implemented.
|
||||
|
||||
The open() syscall will fail if a subsystem is not present or supported
|
||||
by the driver or a shared memory buffer cannot be allocated for the
|
||||
AP - subsystem communication. It will also fail if the subsytem has
|
||||
not initialized the queue on its side. Here are the error codes returned
|
||||
in case a call to open() fails:
|
||||
ENODEV - memory was not yet allocated for the device
|
||||
EEXIST - device is already opened
|
||||
ENOMEM - SMEM allocation failed
|
||||
ECOMM - Subsytem queue is not yet setup
|
||||
ENOMEM - Failure to initialize SMQ
|
||||
|
||||
read() is a blocking call that will return with the number of bytes written
|
||||
by the subsystem whenever the subsystem sends it some payload. Here are the
|
||||
error codes returned in case a call to read() fails:
|
||||
EINVAL - Invalid input
|
||||
ENODEV - Device has not been opened yet
|
||||
ERESTARTSYS - call to wait_for_completion_interruptible is interrupted
|
||||
ENODATA - call to smq_receive failed
|
||||
|
||||
write() attempts to send user mode payload out to the subsystem. It can fail
|
||||
if the SMQ is full. The number of bytes written is returned back to the user.
|
||||
Here are the error codes returned in case a call to write() fails:
|
||||
EINVAL - Invalid input
|
||||
ECOMM - SMQ send failed
|
||||
|
||||
In the close() syscall, the control information state of the SMQ is
|
||||
initialized to zero thereby preventing any further communication between
|
||||
the AP and the subsystem. Here is the error code returned in case
|
||||
a call to close() fails:
|
||||
ENODEV - device wasn't opened/initialized
|
||||
|
||||
The Remote Debug driver uses SMP2P for bi-directional AP to subsystem
|
||||
notification. Notifications are sent to indicate that there are new
|
||||
debug messages available for processing. Each subsystem that is
|
||||
supported will need to add a device tree entry per the usage
|
||||
specification of SMP2P driver.
|
||||
|
||||
In case the remote stub becomes non operational or the security configuration
|
||||
on the subsystem does not permit debugging, any messages put in the SMQ will
|
||||
not be responded to. It is the responsibility of the Debug Agent app and the
|
||||
host debugger application such as GDB to timeout and notify the user of the
|
||||
non availability of remote debugging.
|
||||
|
||||
Driver parameters
|
||||
=================
|
||||
|
||||
None
|
||||
|
||||
Config options
|
||||
==============
|
||||
|
||||
The driver is configured with a device tree entry to map an SMP2P entry
|
||||
to the device. The SMP2P entry name used is "rdbg". Please see
|
||||
kernel\Documentation\arm\msm\msm_smp2p.txt for information about the
|
||||
device tree entry required to configure SMP2P.
|
||||
|
||||
The driver uses the SMEM allocation type SMEM_LC_DEBUGGER to allocate memory
|
||||
for the queue that is used to share data with the subsystems.
|
||||
|
||||
Dependencies
|
||||
============
|
||||
|
||||
The Debug Agent driver requires services of SMEM to
|
||||
allocate shared memory buffers.
|
||||
|
||||
SMP2P is used as a bi-directional notification
|
||||
mechanism between the AP and a subsystem processor.
|
||||
|
||||
User space utilities
|
||||
====================
|
||||
|
||||
This driver is meant to be used in conjunction with the user mode
|
||||
Remote Debug Agent application.
|
||||
|
||||
Other
|
||||
=====
|
||||
|
||||
None
|
||||
|
||||
Known issues
|
||||
============
|
||||
For targets with an external subsystem, we cannot use
|
||||
shared memory for communication and would have to use the prevailing
|
||||
transport mechanisms that exists between the AP and the external subsystem.
|
||||
|
||||
This driver cannot be leveraged for such targets.
|
||||
|
||||
To do
|
||||
=====
|
||||
|
||||
None
|
@ -1,814 +0,0 @@
|
||||
[abi_whitelist]
|
||||
# commonly used symbols
|
||||
add_wait_queue
|
||||
alloc_etherdev_mqs
|
||||
__alloc_pages_nodemask
|
||||
__alloc_skb
|
||||
alloc_workqueue
|
||||
__arch_copy_from_user
|
||||
__arch_copy_to_user
|
||||
arm64_const_caps_ready
|
||||
bus_register
|
||||
bus_unregister
|
||||
cancel_delayed_work_sync
|
||||
capable
|
||||
__cfi_slowpath
|
||||
__check_object_size
|
||||
__const_udelay
|
||||
consume_skb
|
||||
cpu_hwcap_keys
|
||||
cpu_hwcaps
|
||||
cpumask_next
|
||||
cpu_number
|
||||
__cpu_online_mask
|
||||
cpus_read_lock
|
||||
cpus_read_unlock
|
||||
debug_smp_processor_id
|
||||
delayed_work_timer_fn
|
||||
destroy_workqueue
|
||||
dev_driver_string
|
||||
_dev_err
|
||||
device_register
|
||||
device_unregister
|
||||
_dev_info
|
||||
__dev_kfree_skb_any
|
||||
devm_kmalloc
|
||||
dev_queue_xmit
|
||||
dev_set_name
|
||||
_dev_warn
|
||||
dma_alloc_attrs
|
||||
dma_direct_map_page
|
||||
dma_direct_unmap_page
|
||||
dma_fence_release
|
||||
dma_fence_wait_timeout
|
||||
dma_free_attrs
|
||||
dma_resv_add_excl_fence
|
||||
dma_set_coherent_mask
|
||||
dma_set_mask
|
||||
ethtool_op_get_link
|
||||
eth_validate_addr
|
||||
event_triggers_call
|
||||
fd_install
|
||||
finish_wait
|
||||
flush_work
|
||||
fput
|
||||
free_irq
|
||||
free_netdev
|
||||
__free_pages
|
||||
get_random_bytes
|
||||
get_unused_fd_flags
|
||||
ida_alloc_range
|
||||
ida_free
|
||||
init_net
|
||||
init_timer_key
|
||||
init_wait_entry
|
||||
__init_waitqueue_head
|
||||
jiffies
|
||||
kfree
|
||||
kfree_skb
|
||||
__kmalloc
|
||||
kmalloc_caches
|
||||
kmem_cache_alloc_trace
|
||||
kmemdup
|
||||
kvfree
|
||||
kvmalloc_node
|
||||
__local_bh_enable_ip
|
||||
lock_sock_nested
|
||||
memcpy
|
||||
memset
|
||||
__module_get
|
||||
module_put
|
||||
msleep
|
||||
__mutex_init
|
||||
mutex_lock
|
||||
mutex_lock_interruptible
|
||||
mutex_trylock
|
||||
mutex_unlock
|
||||
netdev_err
|
||||
netdev_info
|
||||
netdev_rx_handler_register
|
||||
netdev_rx_handler_unregister
|
||||
netdev_upper_dev_unlink
|
||||
netif_carrier_off
|
||||
netif_carrier_on
|
||||
netif_device_detach
|
||||
netif_tx_stop_all_queues
|
||||
netif_tx_wake_queue
|
||||
noop_llseek
|
||||
nr_cpu_ids
|
||||
param_ops_bool
|
||||
param_ops_charp
|
||||
param_ops_int
|
||||
param_ops_uint
|
||||
passthru_features_check
|
||||
pci_disable_device
|
||||
pci_enable_device
|
||||
pci_read_config_dword
|
||||
__pci_register_driver
|
||||
pci_set_master
|
||||
pci_unregister_driver
|
||||
__per_cpu_offset
|
||||
perf_trace_buf_alloc
|
||||
perf_trace_run_bpf_submit
|
||||
platform_device_add
|
||||
platform_device_alloc
|
||||
platform_device_del
|
||||
platform_device_put
|
||||
platform_device_unregister
|
||||
__platform_driver_register
|
||||
platform_driver_unregister
|
||||
preempt_count_add
|
||||
preempt_count_sub
|
||||
preempt_schedule
|
||||
preempt_schedule_notrace
|
||||
prepare_to_wait_event
|
||||
printk
|
||||
put_device
|
||||
__put_page
|
||||
queue_delayed_work_on
|
||||
queue_work_on
|
||||
_raw_read_lock
|
||||
_raw_read_unlock
|
||||
_raw_spin_lock
|
||||
_raw_spin_lock_bh
|
||||
_raw_spin_lock_irq
|
||||
_raw_spin_lock_irqsave
|
||||
_raw_spin_unlock
|
||||
_raw_spin_unlock_bh
|
||||
_raw_spin_unlock_irq
|
||||
_raw_spin_unlock_irqrestore
|
||||
__rcu_read_lock
|
||||
__rcu_read_unlock
|
||||
refcount_dec_and_test_checked
|
||||
refcount_inc_checked
|
||||
register_netdev
|
||||
register_netdevice_notifier
|
||||
release_sock
|
||||
remove_wait_queue
|
||||
request_threaded_irq
|
||||
rtnl_lock
|
||||
rtnl_unlock
|
||||
schedule
|
||||
schedule_timeout
|
||||
schedule_timeout_uninterruptible
|
||||
seq_printf
|
||||
sg_init_one
|
||||
sg_init_table
|
||||
sg_next
|
||||
skb_clone
|
||||
skb_put
|
||||
sk_free
|
||||
snd_device_new
|
||||
snd_pcm_alt_chmaps
|
||||
snprintf
|
||||
sprintf
|
||||
sscanf
|
||||
__stack_chk_fail
|
||||
__stack_chk_guard
|
||||
strcmp
|
||||
strcpy
|
||||
strlcpy
|
||||
strlen
|
||||
strstr
|
||||
synchronize_irq
|
||||
synchronize_net
|
||||
system_wq
|
||||
trace_define_field
|
||||
trace_event_buffer_commit
|
||||
trace_event_buffer_reserve
|
||||
trace_event_ignore_this_pid
|
||||
trace_event_raw_init
|
||||
trace_event_reg
|
||||
trace_handle_return
|
||||
trace_raw_output_prep
|
||||
trace_seq_printf
|
||||
unregister_netdev
|
||||
unregister_netdevice_notifier
|
||||
unregister_netdevice_queue
|
||||
vmemmap
|
||||
wait_woken
|
||||
__wake_up
|
||||
__warn_printk
|
||||
woken_wake_function
|
||||
ww_mutex_lock_interruptible
|
||||
ww_mutex_unlock
|
||||
|
||||
# required by binfmt_misc.ko
|
||||
bin2hex
|
||||
bprm_change_interp
|
||||
clear_inode
|
||||
__close_fd
|
||||
copy_strings_kernel
|
||||
_ctype
|
||||
current_time
|
||||
d_drop
|
||||
default_llseek
|
||||
dentry_open
|
||||
d_instantiate
|
||||
down_write
|
||||
dput
|
||||
drop_nlink
|
||||
filp_close
|
||||
free_pages
|
||||
__get_free_pages
|
||||
get_next_ino
|
||||
get_tree_single
|
||||
iput
|
||||
kernel_read
|
||||
kill_litter_super
|
||||
kstrtoint
|
||||
lockref_get
|
||||
lookup_one_len
|
||||
new_inode
|
||||
open_exec
|
||||
prepare_binprm
|
||||
_raw_write_lock
|
||||
_raw_write_unlock
|
||||
__register_binfmt
|
||||
register_filesystem
|
||||
remove_arg_zero
|
||||
search_binary_handler
|
||||
simple_fill_super
|
||||
simple_pin_fs
|
||||
simple_read_from_buffer
|
||||
simple_release_fs
|
||||
simple_statfs
|
||||
strchr
|
||||
string_unescape
|
||||
strrchr
|
||||
unregister_binfmt
|
||||
unregister_filesystem
|
||||
up_write
|
||||
would_dump
|
||||
|
||||
# required by blk-mq-virtio.ko
|
||||
blk_mq_map_queues
|
||||
|
||||
# required by dummy-cpufreq.ko
|
||||
cpufreq_generic_attr
|
||||
cpufreq_register_driver
|
||||
cpufreq_unregister_driver
|
||||
|
||||
# required by dummy_hcd.ko
|
||||
device_create_file
|
||||
device_remove_file
|
||||
ktime_get_ts64
|
||||
mod_timer
|
||||
platform_device_add_data
|
||||
scnprintf
|
||||
sg_miter_next
|
||||
sg_miter_start
|
||||
sg_miter_stop
|
||||
usb_add_gadget_udc
|
||||
usb_add_hcd
|
||||
usb_create_hcd
|
||||
usb_create_shared_hcd
|
||||
usb_del_gadget_udc
|
||||
usb_disabled
|
||||
usb_ep_set_maxpacket_limit
|
||||
usb_gadget_giveback_request
|
||||
usb_gadget_udc_reset
|
||||
usb_get_dev
|
||||
usb_hcd_check_unlink_urb
|
||||
usb_hcd_giveback_urb
|
||||
usb_hcd_is_primary_hcd
|
||||
usb_hcd_link_urb_to_ep
|
||||
usb_hcd_poll_rh_status
|
||||
usb_hcd_resume_root_hub
|
||||
usb_hcd_unlink_urb_from_ep
|
||||
usb_put_dev
|
||||
usb_put_hcd
|
||||
usb_remove_hcd
|
||||
usleep_range
|
||||
|
||||
# required by failover.ko
|
||||
netdev_master_upper_dev_link
|
||||
rtnl_is_locked
|
||||
|
||||
# required by gnss-cmdline.ko
|
||||
bus_find_device
|
||||
device_find_child
|
||||
device_match_name
|
||||
kstrdup
|
||||
platform_bus_type
|
||||
strsep
|
||||
|
||||
# required by gnss-serial.ko
|
||||
gnss_allocate_device
|
||||
gnss_deregister_device
|
||||
gnss_insert_raw
|
||||
gnss_put_device
|
||||
gnss_register_device
|
||||
of_property_read_variable_u32_array
|
||||
__pm_runtime_disable
|
||||
pm_runtime_enable
|
||||
__pm_runtime_idle
|
||||
__pm_runtime_resume
|
||||
serdev_device_close
|
||||
serdev_device_open
|
||||
serdev_device_set_baudrate
|
||||
serdev_device_set_flow_control
|
||||
serdev_device_wait_until_sent
|
||||
serdev_device_write
|
||||
serdev_device_write_wakeup
|
||||
|
||||
# required by nd_virtio.ko
|
||||
bio_alloc_bioset
|
||||
bio_chain
|
||||
bio_clone_blkg_association
|
||||
fs_bio_set
|
||||
submit_bio
|
||||
|
||||
# required by net_failover.ko
|
||||
call_netdevice_notifiers
|
||||
dev_close
|
||||
dev_get_stats
|
||||
dev_mc_sync_multiple
|
||||
dev_mc_unsync
|
||||
dev_open
|
||||
dev_set_mtu
|
||||
dev_uc_sync_multiple
|
||||
dev_uc_unsync
|
||||
__ethtool_get_link_ksettings
|
||||
netdev_change_features
|
||||
netdev_increment_features
|
||||
netdev_lower_state_changed
|
||||
netdev_pick_tx
|
||||
pci_bus_type
|
||||
|
||||
# required by rtc-test.ko
|
||||
add_timer
|
||||
del_timer
|
||||
device_init_wakeup
|
||||
devm_rtc_allocate_device
|
||||
ktime_get_real_seconds
|
||||
__rtc_register_device
|
||||
rtc_time64_to_tm
|
||||
rtc_tm_to_time64
|
||||
rtc_update_irq
|
||||
|
||||
# required by snd-ac97-codec.ko
|
||||
pci_read_config_word
|
||||
simple_strtoul
|
||||
snd_component_add
|
||||
snd_ctl_add
|
||||
_snd_ctl_add_slave
|
||||
snd_ctl_boolean_mono_info
|
||||
snd_ctl_enum_info
|
||||
snd_ctl_find_id
|
||||
snd_ctl_make_virtual_master
|
||||
snd_ctl_new1
|
||||
snd_ctl_remove_id
|
||||
snd_info_create_card_entry
|
||||
snd_info_free_entry
|
||||
snd_interval_refine
|
||||
snd_pcm_hw_rule_add
|
||||
snd_pcm_std_chmaps
|
||||
strcat
|
||||
|
||||
# required by snd-intel8x0.ko
|
||||
ktime_get
|
||||
param_ops_bint
|
||||
pci_iomap
|
||||
pci_release_regions
|
||||
pci_request_regions
|
||||
pci_write_config_dword
|
||||
snd_card_disconnect
|
||||
snd_card_free
|
||||
snd_card_new
|
||||
snd_card_register
|
||||
snd_card_rw_proc_new
|
||||
snd_dma_alloc_pages
|
||||
snd_dma_free_pages
|
||||
snd_pci_quirk_lookup
|
||||
snd_pcm_add_chmap_ctls
|
||||
snd_pcm_hw_constraint_integer
|
||||
snd_pcm_hw_constraint_list
|
||||
snd_pcm_hw_constraint_msbits
|
||||
snd_pcm_lib_free_pages
|
||||
snd_pcm_lib_ioctl
|
||||
snd_pcm_lib_malloc_pages
|
||||
snd_pcm_lib_preallocate_pages_for_all
|
||||
snd_pcm_limit_hw_rates
|
||||
snd_pcm_new
|
||||
snd_pcm_period_elapsed
|
||||
snd_pcm_set_ops
|
||||
|
||||
# required by ttm.ko
|
||||
clear_page
|
||||
copy_page
|
||||
devres_add
|
||||
__devres_alloc_node
|
||||
devres_destroy
|
||||
devres_free
|
||||
dma_fence_enable_sw_signaling
|
||||
dma_fence_signal
|
||||
dma_resv_add_shared_fence
|
||||
dma_resv_copy_fences
|
||||
dma_resv_fini
|
||||
dma_resv_init
|
||||
dma_resv_reserve_shared
|
||||
dma_resv_test_signaled_rcu
|
||||
dma_resv_wait_timeout_rcu
|
||||
drm_class_device_register
|
||||
drm_class_device_unregister
|
||||
drm_clflush_pages
|
||||
drm_mm_init
|
||||
drm_mm_insert_node_in_range
|
||||
drm_mm_print
|
||||
drm_mm_remove_node
|
||||
drm_mm_takedown
|
||||
drm_printf
|
||||
__drm_printfn_debug
|
||||
drm_vma_offset_add
|
||||
drm_vma_offset_lookup_locked
|
||||
drm_vma_offset_manager_destroy
|
||||
drm_vma_offset_manager_init
|
||||
drm_vma_offset_remove
|
||||
flush_workqueue
|
||||
__ioremap
|
||||
iounmap
|
||||
kimage_vaddr
|
||||
kobject_del
|
||||
kobject_init_and_add
|
||||
kobject_put
|
||||
mark_page_accessed
|
||||
__memcpy_fromio
|
||||
__memcpy_toio
|
||||
__memset_io
|
||||
mutex_is_locked
|
||||
nr_swap_pages
|
||||
refcount_inc_not_zero_checked
|
||||
register_shrinker
|
||||
reservation_ww_class
|
||||
set_page_dirty
|
||||
shmem_file_setup
|
||||
shmem_read_mapping_page_gfp
|
||||
si_mem_available
|
||||
si_meminfo
|
||||
unmap_mapping_range
|
||||
unregister_shrinker
|
||||
up_read
|
||||
vmalloc_to_page
|
||||
vmap
|
||||
vmf_insert_mixed
|
||||
vmf_insert_pfn
|
||||
vm_get_page_prot
|
||||
vunmap
|
||||
ww_mutex_lock
|
||||
|
||||
# required by virt_wifi.ko
|
||||
cfg80211_connect_done
|
||||
cfg80211_disconnected
|
||||
cfg80211_inform_bss_data
|
||||
cfg80211_put_bss
|
||||
cfg80211_scan_done
|
||||
__dev_get_by_index
|
||||
dev_printk
|
||||
ether_setup
|
||||
ktime_get_with_offset
|
||||
netdev_upper_dev_link
|
||||
netif_stacked_transfer_operstate
|
||||
register_netdevice
|
||||
rtnl_link_register
|
||||
rtnl_link_unregister
|
||||
unregister_netdevice_many
|
||||
wiphy_free
|
||||
wiphy_new_nm
|
||||
wiphy_register
|
||||
wiphy_unregister
|
||||
|
||||
# required by virtio-gpu.ko
|
||||
bpf_trace_run2
|
||||
dma_direct_map_sg
|
||||
dma_direct_sync_sg_for_device
|
||||
dma_direct_unmap_sg
|
||||
dma_fence_context_alloc
|
||||
dma_fence_init
|
||||
dma_fence_match_context
|
||||
dma_fence_signal_locked
|
||||
drm_add_edid_modes
|
||||
drm_add_modes_noedid
|
||||
drm_atomic_helper_check
|
||||
drm_atomic_helper_cleanup_planes
|
||||
drm_atomic_helper_commit
|
||||
drm_atomic_helper_commit_hw_done
|
||||
drm_atomic_helper_commit_modeset_disables
|
||||
drm_atomic_helper_commit_modeset_enables
|
||||
drm_atomic_helper_commit_planes
|
||||
drm_atomic_helper_connector_destroy_state
|
||||
drm_atomic_helper_connector_duplicate_state
|
||||
drm_atomic_helper_connector_reset
|
||||
drm_atomic_helper_crtc_destroy_state
|
||||
drm_atomic_helper_crtc_duplicate_state
|
||||
drm_atomic_helper_crtc_reset
|
||||
drm_atomic_helper_dirtyfb
|
||||
drm_atomic_helper_disable_plane
|
||||
drm_atomic_helper_page_flip
|
||||
drm_atomic_helper_plane_destroy_state
|
||||
drm_atomic_helper_plane_duplicate_state
|
||||
drm_atomic_helper_plane_reset
|
||||
drm_atomic_helper_set_config
|
||||
drm_atomic_helper_shutdown
|
||||
drm_atomic_helper_update_plane
|
||||
drm_atomic_helper_wait_for_vblanks
|
||||
drm_compat_ioctl
|
||||
drm_connector_attach_edid_property
|
||||
drm_connector_attach_encoder
|
||||
drm_connector_cleanup
|
||||
drm_connector_init
|
||||
drm_connector_register
|
||||
drm_connector_unregister
|
||||
drm_connector_update_edid_property
|
||||
drm_crtc_cleanup
|
||||
drm_crtc_init_with_planes
|
||||
drm_crtc_send_vblank_event
|
||||
drm_cvt_mode
|
||||
drm_dbg
|
||||
drm_dev_alloc
|
||||
drm_dev_put
|
||||
drm_dev_register
|
||||
drm_dev_set_unique
|
||||
drm_dev_unregister
|
||||
drm_do_get_edid
|
||||
drm_encoder_cleanup
|
||||
drm_encoder_init
|
||||
drm_err
|
||||
drm_framebuffer_init
|
||||
drm_gem_fb_create_handle
|
||||
drm_gem_fb_destroy
|
||||
drm_gem_handle_create
|
||||
drm_gem_object_init
|
||||
drm_gem_object_lookup
|
||||
drm_gem_object_put_unlocked
|
||||
drm_gem_object_release
|
||||
drm_gem_prime_fd_to_handle
|
||||
drm_gem_prime_handle_to_fd
|
||||
drm_gem_prime_mmap
|
||||
drm_helper_hpd_irq_event
|
||||
drm_helper_mode_fill_fb_struct
|
||||
drm_helper_probe_single_connector_modes
|
||||
drm_ioctl
|
||||
drm_kms_helper_hotplug_event
|
||||
drm_mode_config_cleanup
|
||||
drm_mode_config_init
|
||||
drm_mode_config_reset
|
||||
drm_mode_probed_add
|
||||
drm_open
|
||||
drm_plane_cleanup
|
||||
drm_poll
|
||||
drm_prime_pages_to_sg
|
||||
drm_put_dev
|
||||
drm_read
|
||||
drm_release
|
||||
drm_set_preferred_mode
|
||||
drm_universal_plane_init
|
||||
__get_task_comm
|
||||
kmalloc_order_trace
|
||||
kmem_cache_alloc
|
||||
kmem_cache_create
|
||||
kmem_cache_destroy
|
||||
kmem_cache_free
|
||||
memdup_user
|
||||
put_unused_fd
|
||||
__sg_alloc_table_from_pages
|
||||
sg_free_table
|
||||
strncpy
|
||||
sync_file_create
|
||||
sync_file_get_fence
|
||||
__tracepoint_dma_fence_emit
|
||||
|
||||
# required by virtio-rng.ko
|
||||
complete
|
||||
hwrng_register
|
||||
hwrng_unregister
|
||||
wait_for_completion
|
||||
wait_for_completion_killable
|
||||
|
||||
# required by virtio.ko
|
||||
add_uevent_var
|
||||
device_add
|
||||
device_initialize
|
||||
driver_register
|
||||
driver_unregister
|
||||
ida_destroy
|
||||
panic
|
||||
|
||||
# required by virtio_blk.ko
|
||||
__alloc_disk_node
|
||||
blk_cleanup_queue
|
||||
blk_execute_rq
|
||||
blk_get_request
|
||||
blk_mq_alloc_tag_set
|
||||
blk_mq_complete_request
|
||||
blk_mq_end_request
|
||||
blk_mq_free_tag_set
|
||||
blk_mq_init_queue
|
||||
blk_mq_quiesce_queue
|
||||
blk_mq_start_request
|
||||
blk_mq_start_stopped_hw_queues
|
||||
blk_mq_stop_hw_queue
|
||||
blk_mq_unquiesce_queue
|
||||
blk_put_request
|
||||
blk_queue_alignment_offset
|
||||
blk_queue_flag_set
|
||||
blk_queue_io_min
|
||||
blk_queue_io_opt
|
||||
blk_queue_logical_block_size
|
||||
blk_queue_max_discard_sectors
|
||||
blk_queue_max_discard_segments
|
||||
blk_queue_max_hw_sectors
|
||||
blk_queue_max_segments
|
||||
blk_queue_max_segment_size
|
||||
blk_queue_max_write_zeroes_sectors
|
||||
blk_queue_physical_block_size
|
||||
blk_queue_write_cache
|
||||
blk_rq_map_kern
|
||||
blk_rq_map_sg
|
||||
blk_status_to_errno
|
||||
del_gendisk
|
||||
device_add_disk
|
||||
_dev_notice
|
||||
kobject_uevent_env
|
||||
memmove
|
||||
put_disk
|
||||
register_blkdev
|
||||
revalidate_disk
|
||||
set_disk_ro
|
||||
string_get_size
|
||||
__sysfs_match_string
|
||||
unregister_blkdev
|
||||
|
||||
# required by virtio_crypto.ko
|
||||
cpu_bit_bitmap
|
||||
cpu_topology
|
||||
crypto_ablkcipher_type
|
||||
crypto_engine_alloc_init
|
||||
crypto_engine_exit
|
||||
crypto_engine_start
|
||||
crypto_finalize_ablkcipher_request
|
||||
crypto_register_alg
|
||||
crypto_transfer_ablkcipher_request_to_engine
|
||||
crypto_unregister_alg
|
||||
kzfree
|
||||
scatterwalk_map_and_copy
|
||||
sg_nents
|
||||
sg_nents_for_len
|
||||
try_module_get
|
||||
|
||||
# required by virtio_input.ko
|
||||
input_alloc_absinfo
|
||||
input_allocate_device
|
||||
input_event
|
||||
input_free_device
|
||||
input_mt_init_slots
|
||||
input_register_device
|
||||
input_set_abs_params
|
||||
input_unregister_device
|
||||
|
||||
# required by virtio_mmio.ko
|
||||
device_for_each_child
|
||||
devm_ioremap
|
||||
devm_kfree
|
||||
__devm_request_region
|
||||
iomem_resource
|
||||
memparse
|
||||
platform_device_register_full
|
||||
platform_get_irq
|
||||
platform_get_resource
|
||||
|
||||
# required by virtio_net.ko
|
||||
arch_bpf_jit_check_func
|
||||
bcmp
|
||||
bpf_prog_add
|
||||
bpf_prog_put
|
||||
bpf_prog_sub
|
||||
bpf_stats_enabled_key
|
||||
bpf_warn_invalid_xdp_action
|
||||
build_skb
|
||||
__cpuhp_remove_state
|
||||
__cpuhp_setup_state
|
||||
__cpuhp_state_add_instance
|
||||
__cpuhp_state_remove_instance
|
||||
cpumask_next_wrap
|
||||
eth_commit_mac_addr_change
|
||||
eth_prepare_mac_addr_change
|
||||
ethtool_op_get_ts_info
|
||||
eth_type_trans
|
||||
find_next_bit
|
||||
flow_keys_basic_dissector
|
||||
__napi_alloc_skb
|
||||
napi_complete_done
|
||||
napi_consume_skb
|
||||
napi_disable
|
||||
napi_gro_receive
|
||||
napi_hash_del
|
||||
__napi_schedule
|
||||
napi_schedule_prep
|
||||
netdev_notify_peers
|
||||
netdev_warn
|
||||
netif_device_attach
|
||||
netif_napi_add
|
||||
netif_napi_del
|
||||
netif_schedule_queue
|
||||
netif_set_real_num_rx_queues
|
||||
netif_set_real_num_tx_queues
|
||||
__netif_set_xps_queue
|
||||
net_ratelimit
|
||||
nf_conntrack_destroy
|
||||
__num_online_cpus
|
||||
_raw_spin_trylock
|
||||
sched_clock
|
||||
skb_add_rx_frag
|
||||
skb_coalesce_rx_frag
|
||||
__skb_flow_dissect
|
||||
skb_page_frag_refill
|
||||
skb_partial_csum_set
|
||||
skb_to_sgvec
|
||||
skb_tstamp_tx
|
||||
softnet_data
|
||||
__this_cpu_preempt_check
|
||||
__tracepoint_xdp_exception
|
||||
xdp_convert_zc_to_xdp_frame
|
||||
xdp_do_flush_map
|
||||
xdp_do_redirect
|
||||
xdp_return_frame
|
||||
xdp_return_frame_rx_napi
|
||||
xdp_rxq_info_reg
|
||||
xdp_rxq_info_reg_mem_model
|
||||
xdp_rxq_info_unreg
|
||||
|
||||
# required by virtio_pci.ko
|
||||
get_device
|
||||
irq_set_affinity_hint
|
||||
pci_alloc_irq_vectors_affinity
|
||||
pci_find_capability
|
||||
pci_find_ext_capability
|
||||
pci_find_next_capability
|
||||
pci_free_irq_vectors
|
||||
pci_iomap_range
|
||||
pci_irq_get_affinity
|
||||
pci_irq_vector
|
||||
pci_read_config_byte
|
||||
pci_release_selected_regions
|
||||
pci_request_selected_regions
|
||||
|
||||
# required by virtio_pmem.ko
|
||||
nvdimm_bus_register
|
||||
nvdimm_bus_unregister
|
||||
nvdimm_pmem_region_create
|
||||
|
||||
# required by virtio_ring.ko
|
||||
alloc_pages_exact
|
||||
dma_max_mapping_size
|
||||
free_pages_exact
|
||||
kimage_voffset
|
||||
physvirt_offset
|
||||
vabits_actual
|
||||
|
||||
# required by vmw_vsock_virtio_transport.ko
|
||||
synchronize_rcu
|
||||
|
||||
# required by vmw_vsock_virtio_transport_common.ko
|
||||
bpf_trace_run10
|
||||
bpf_trace_run8
|
||||
cancel_delayed_work
|
||||
_copy_from_iter_full
|
||||
_copy_to_iter
|
||||
trace_print_symbols_seq
|
||||
|
||||
# required by vsock.ko
|
||||
autoremove_wake_function
|
||||
misc_deregister
|
||||
misc_register
|
||||
nonseekable_open
|
||||
prandom_u32
|
||||
prepare_to_wait
|
||||
proto_register
|
||||
proto_unregister
|
||||
__put_cred
|
||||
_raw_write_lock_bh
|
||||
_raw_write_unlock_bh
|
||||
security_sock_graft
|
||||
sk_alloc
|
||||
skb_dequeue
|
||||
sock_init_data
|
||||
sock_no_accept
|
||||
sock_no_getsockopt
|
||||
sock_no_ioctl
|
||||
sock_no_listen
|
||||
sock_no_mmap
|
||||
sock_no_sendpage
|
||||
sock_no_setsockopt
|
||||
sock_no_socketpair
|
||||
sock_queue_rcv_skb
|
||||
sock_register
|
||||
sock_unregister
|
||||
|
||||
# required by vsock_diag.ko
|
||||
__netlink_dump_start
|
||||
__nlmsg_put
|
||||
sock_diag_register
|
||||
sock_diag_save_cookie
|
||||
sock_diag_unregister
|
||||
sock_i_ino
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,4 +0,0 @@
|
||||
[abi_whitelist]
|
||||
# commonly used symbols
|
||||
module_layout
|
||||
__put_task_struct
|
@ -6,6 +6,7 @@ config ARM
|
||||
select ARCH_HAS_BINFMT_FLAT
|
||||
select ARCH_HAS_DEBUG_VIRTUAL if MMU
|
||||
select ARCH_HAS_DEVMEM_IS_ALLOWED
|
||||
select ARCH_HAS_DMA_PREP_COHERENT if IOMMU_DMA
|
||||
select ARCH_HAS_DMA_WRITE_COMBINE if !ARM_DMA_MEM_BUFFERABLE
|
||||
select ARCH_HAS_ELF_RANDOMIZE
|
||||
select ARCH_HAS_FORTIFY_SOURCE
|
||||
@ -19,8 +20,8 @@ config ARM
|
||||
select ARCH_HAS_SET_MEMORY
|
||||
select ARCH_HAS_STRICT_KERNEL_RWX if MMU && !XIP_KERNEL
|
||||
select ARCH_HAS_STRICT_MODULE_RWX if MMU
|
||||
select ARCH_HAS_SYNC_DMA_FOR_DEVICE if SWIOTLB
|
||||
select ARCH_HAS_SYNC_DMA_FOR_CPU if SWIOTLB
|
||||
select ARCH_HAS_SYNC_DMA_FOR_DEVICE if SWIOTLB || IOMMU_DMA
|
||||
select ARCH_HAS_SYNC_DMA_FOR_CPU if SWIOTLB || IOMMU_DMA
|
||||
select ARCH_HAS_TEARDOWN_DMA_OPS if MMU
|
||||
select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST
|
||||
select ARCH_HAVE_CUSTOM_GPIO_H
|
||||
@ -122,6 +123,7 @@ config ARM
|
||||
select RTC_LIB
|
||||
select SET_FS
|
||||
select SYS_SUPPORTS_APM_EMULATION
|
||||
select IOMMU_DMA if IOMMU_SUPPORT
|
||||
# Above selects are sorted alphabetically; please add new ones
|
||||
# according to that. Thanks.
|
||||
help
|
||||
@ -145,7 +147,7 @@ if ARM_DMA_USE_IOMMU
|
||||
config ARM_DMA_IOMMU_ALIGNMENT
|
||||
int "Maximum PAGE_SIZE order of alignment for DMA IOMMU buffers"
|
||||
range 4 9
|
||||
default 8
|
||||
default 9
|
||||
help
|
||||
DMA mapping framework by default aligns all buffers to the smallest
|
||||
PAGE_SIZE order which is greater than or equal to the requested buffer
|
||||
@ -1595,6 +1597,35 @@ config ARM_MODULE_PLTS
|
||||
Disabling this is usually safe for small single-platform
|
||||
configurations. If unsure, say y.
|
||||
|
||||
choice
|
||||
prompt "Virtual Memory Reclaim"
|
||||
default NO_VM_RECLAIM
|
||||
help
|
||||
Select the method of reclaiming virtual memory. Two values
|
||||
are allowed to choose, one is NO_VM_RECLAIM, the other is
|
||||
ENABLE_VMALLOC_SAVING.
|
||||
|
||||
If you are not absolutely sure what you are doing, leave this
|
||||
option alone.
|
||||
|
||||
config ENABLE_VMALLOC_SAVING
|
||||
bool "Reclaim memory for each subsystem"
|
||||
help
|
||||
Enable this config to reclaim the virtual space belonging
|
||||
to any subsystem which is expected to have a lifetime of
|
||||
the entire system. This feature allows lowmem to be non-
|
||||
contiguous.
|
||||
|
||||
config NO_VM_RECLAIM
|
||||
bool "Do not reclaim memory"
|
||||
help
|
||||
Do not reclaim any memory. This might result in less lowmem
|
||||
and wasting some virtual memory space which could otherwise
|
||||
be reclaimed by using any of the other two config options as
|
||||
above.
|
||||
|
||||
endchoice
|
||||
|
||||
config FORCE_MAX_ZONEORDER
|
||||
int "Maximum zone order"
|
||||
default "12" if SOC_AM33XX
|
||||
|
@ -99,6 +99,21 @@ config DEBUG_USER
|
||||
8 - SIGSEGV faults
|
||||
16 - SIGBUS faults
|
||||
|
||||
config ARCH_SUPPORTS_DEBUG_PAGEALLOC
|
||||
def_bool y
|
||||
depends on FORCE_PAGES
|
||||
|
||||
config FORCE_PAGES
|
||||
bool "Force lowmem to be mapped with 4K pages"
|
||||
help
|
||||
There are some advanced debug features that can only be done when
|
||||
memory is mapped with pages instead of sections. Enable this option
|
||||
to always map lowmem pages with pages. This may have a performance
|
||||
cost due to increased TLB pressure.
|
||||
|
||||
If unsure say N.
|
||||
|
||||
|
||||
# These options are only for real kernel hackers who want to get their hands dirty.
|
||||
config DEBUG_LL
|
||||
bool "Kernel low-level debugging functions (read help!)"
|
||||
|
@ -14,10 +14,6 @@
|
||||
OBJCOPYFLAGS :=-O binary -R .comment -S
|
||||
|
||||
include $(srctree)/arch/arm/boot/dts/Makefile
|
||||
ifneq ($(DTSSUBDIR),)
|
||||
DTSSUBDIR_INCS=$(foreach DIR, $(DTSSUBDIR), $(addsuffix /Makefile, $(addprefix $(srctree)/arch/arm/boot/dts/, $(DIR))))
|
||||
include $(DTSSUBDIR_INCS)
|
||||
endif
|
||||
|
||||
# Note: the following conditions must always be true:
|
||||
# ZRELADDR == virt_to_phys(PAGE_OFFSET + TEXT_OFFSET)
|
||||
|
1
arch/arm/boot/dts/vendor
Symbolic link
1
arch/arm/boot/dts/vendor
Symbolic link
@ -0,0 +1 @@
|
||||
../../../arm64/boot/dts/vendor
|
245
arch/arm/configs/generic_defconfig
Normal file
245
arch/arm/configs/generic_defconfig
Normal file
@ -0,0 +1,245 @@
|
||||
CONFIG_NO_HZ=y
|
||||
CONFIG_HIGH_RES_TIMERS=y
|
||||
CONFIG_PREEMPT=y
|
||||
CONFIG_IKCONFIG=y
|
||||
CONFIG_IKCONFIG_PROC=y
|
||||
CONFIG_CGROUPS=y
|
||||
CONFIG_CGROUP_SCHED=y
|
||||
# CONFIG_FAIR_GROUP_SCHED is not set
|
||||
CONFIG_RT_GROUP_SCHED=y
|
||||
CONFIG_CGROUP_FREEZER=y
|
||||
CONFIG_CGROUP_CPUACCT=y
|
||||
CONFIG_CGROUP_DEBUG=y
|
||||
CONFIG_NAMESPACES=y
|
||||
# CONFIG_UTS_NS is not set
|
||||
# CONFIG_PID_NS is not set
|
||||
CONFIG_RELAY=y
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
# CONFIG_RD_XZ is not set
|
||||
# CONFIG_RD_LZ4 is not set
|
||||
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
|
||||
CONFIG_KALLSYMS_ALL=y
|
||||
CONFIG_EMBEDDED=y
|
||||
CONFIG_PROFILING=y
|
||||
CONFIG_ARCH_QCOM=y
|
||||
CONFIG_VDSO=y
|
||||
CONFIG_CPU_FREQ=y
|
||||
CONFIG_CPU_IDLE=y
|
||||
CONFIG_VFP=y
|
||||
CONFIG_NEON=y
|
||||
CONFIG_PM_AUTOSLEEP=y
|
||||
CONFIG_MODULES=y
|
||||
CONFIG_MODULE_UNLOAD=y
|
||||
CONFIG_MODULE_FORCE_UNLOAD=y
|
||||
CONFIG_MODULE_SIG=y
|
||||
CONFIG_PARTITION_ADVANCED=y
|
||||
# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
|
||||
CONFIG_CMA=y
|
||||
CONFIG_NET=y
|
||||
CONFIG_PACKET=y
|
||||
CONFIG_UNIX=y
|
||||
CONFIG_INET=y
|
||||
CONFIG_IP_MULTICAST=y
|
||||
CONFIG_IP_ADVANCED_ROUTER=y
|
||||
CONFIG_IP_MULTIPLE_TABLES=y
|
||||
CONFIG_IP_MROUTE=y
|
||||
CONFIG_IP_MROUTE_MULTIPLE_TABLES=y
|
||||
CONFIG_IP_PIMSM_V2=y
|
||||
CONFIG_IPV6_MULTIPLE_TABLES=y
|
||||
CONFIG_IPV6_SUBTREES=y
|
||||
CONFIG_IPV6_MROUTE=y
|
||||
CONFIG_IPV6_MROUTE_MULTIPLE_TABLES=y
|
||||
CONFIG_IPV6_PIMSM_V2=y
|
||||
CONFIG_NETFILTER=y
|
||||
CONFIG_NF_CONNTRACK=y
|
||||
CONFIG_NF_CONNTRACK_EVENTS=y
|
||||
CONFIG_NF_CONNTRACK_TIMEOUT=y
|
||||
CONFIG_NF_CONNTRACK_TIMESTAMP=y
|
||||
CONFIG_NF_CONNTRACK_AMANDA=y
|
||||
CONFIG_NF_CONNTRACK_FTP=y
|
||||
CONFIG_NF_CONNTRACK_H323=y
|
||||
CONFIG_NF_CONNTRACK_IRC=y
|
||||
CONFIG_NF_CONNTRACK_NETBIOS_NS=y
|
||||
CONFIG_NF_CONNTRACK_SNMP=y
|
||||
CONFIG_NF_CONNTRACK_PPTP=y
|
||||
CONFIG_NF_CONNTRACK_SIP=y
|
||||
CONFIG_NF_CONNTRACK_TFTP=y
|
||||
CONFIG_NF_CT_NETLINK=y
|
||||
CONFIG_NF_CT_NETLINK_TIMEOUT=y
|
||||
CONFIG_NETFILTER_XT_TARGET_LOG=y
|
||||
CONFIG_NETFILTER_XT_TARGET_MARK=y
|
||||
CONFIG_NETFILTER_XT_TARGET_NFLOG=y
|
||||
CONFIG_NETFILTER_XT_TARGET_NFQUEUE=y
|
||||
CONFIG_NETFILTER_XT_TARGET_NOTRACK=y
|
||||
CONFIG_NETFILTER_XT_TARGET_TPROXY=y
|
||||
CONFIG_NETFILTER_XT_TARGET_TRACE=y
|
||||
CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=y
|
||||
CONFIG_NETFILTER_XT_MATCH_CONNLABEL=y
|
||||
CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=y
|
||||
CONFIG_NETFILTER_XT_MATCH_CONNMARK=y
|
||||
CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y
|
||||
CONFIG_NETFILTER_XT_MATCH_DSCP=y
|
||||
CONFIG_NETFILTER_XT_MATCH_ESP=y
|
||||
CONFIG_NETFILTER_XT_MATCH_IPRANGE=y
|
||||
CONFIG_NETFILTER_XT_MATCH_LIMIT=y
|
||||
CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y
|
||||
CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y
|
||||
CONFIG_NETFILTER_XT_MATCH_STATE=y
|
||||
CONFIG_IP_SET=y
|
||||
CONFIG_IP_NF_IPTABLES=y
|
||||
CONFIG_IP_NF_MATCH_AH=y
|
||||
CONFIG_IP_NF_MATCH_ECN=y
|
||||
CONFIG_IP_NF_MATCH_TTL=y
|
||||
CONFIG_IP_NF_FILTER=y
|
||||
CONFIG_IP_NF_TARGET_REJECT=y
|
||||
CONFIG_IP_NF_NAT=y
|
||||
CONFIG_IP_NF_TARGET_MASQUERADE=y
|
||||
CONFIG_IP_NF_TARGET_NETMAP=y
|
||||
CONFIG_IP_NF_TARGET_REDIRECT=y
|
||||
CONFIG_IP_NF_MANGLE=y
|
||||
CONFIG_IP_NF_TARGET_ECN=y
|
||||
CONFIG_IP_NF_TARGET_TTL=y
|
||||
CONFIG_IP_NF_RAW=y
|
||||
CONFIG_IP_NF_ARPTABLES=y
|
||||
CONFIG_IP_NF_ARPFILTER=y
|
||||
CONFIG_IP_NF_ARP_MANGLE=y
|
||||
CONFIG_IP6_NF_IPTABLES=y
|
||||
CONFIG_IP6_NF_MATCH_AH=y
|
||||
CONFIG_IP6_NF_MATCH_FRAG=y
|
||||
CONFIG_IP6_NF_MATCH_OPTS=y
|
||||
CONFIG_IP6_NF_MATCH_HL=y
|
||||
CONFIG_IP6_NF_MATCH_IPV6HEADER=y
|
||||
CONFIG_IP6_NF_MATCH_MH=y
|
||||
CONFIG_IP6_NF_MATCH_RT=y
|
||||
CONFIG_IP6_NF_FILTER=y
|
||||
CONFIG_IP6_NF_TARGET_REJECT=y
|
||||
CONFIG_IP6_NF_MANGLE=y
|
||||
CONFIG_IP6_NF_RAW=y
|
||||
CONFIG_BRIDGE_NF_EBTABLES=y
|
||||
CONFIG_BRIDGE_EBT_BROUTE=y
|
||||
CONFIG_BRIDGE_EBT_T_FILTER=y
|
||||
CONFIG_BRIDGE_EBT_T_NAT=y
|
||||
CONFIG_BRIDGE_EBT_ARP=y
|
||||
CONFIG_BRIDGE_EBT_IP=y
|
||||
CONFIG_BRIDGE_EBT_IP6=y
|
||||
CONFIG_BRIDGE_EBT_ARPREPLY=y
|
||||
CONFIG_BRIDGE_EBT_DNAT=y
|
||||
CONFIG_BRIDGE_EBT_SNAT=y
|
||||
CONFIG_BRIDGE=y
|
||||
CONFIG_NET_SCHED=y
|
||||
CONFIG_NET_SCH_PRIO=y
|
||||
CONFIG_CFG80211=y
|
||||
CONFIG_RFKILL=y
|
||||
CONFIG_MTD=y
|
||||
CONFIG_MTD_TESTS=m
|
||||
CONFIG_MTD_CMDLINE_PARTS=y
|
||||
CONFIG_MTD_BLOCK=y
|
||||
CONFIG_MTD_UBI=y
|
||||
CONFIG_BLK_DEV_LOOP=y
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_SCSI=y
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_CHR_DEV_SG=y
|
||||
CONFIG_CHR_DEV_SCH=y
|
||||
CONFIG_SCSI_CONSTANTS=y
|
||||
CONFIG_SCSI_LOGGING=y
|
||||
CONFIG_SCSI_SCAN_ASYNC=y
|
||||
CONFIG_NETDEVICES=y
|
||||
CONFIG_TUN=y
|
||||
# CONFIG_NET_VENDOR_BROADCOM is not set
|
||||
# CONFIG_NET_VENDOR_CIRRUS is not set
|
||||
# CONFIG_NET_VENDOR_FARADAY is not set
|
||||
# CONFIG_NET_VENDOR_INTEL is not set
|
||||
CONFIG_KS8851=y
|
||||
# CONFIG_NET_VENDOR_MICROCHIP is not set
|
||||
# CONFIG_NET_VENDOR_NATSEMI is not set
|
||||
# CONFIG_NET_VENDOR_SEEQ is not set
|
||||
# CONFIG_NET_VENDOR_SMSC is not set
|
||||
# CONFIG_NET_VENDOR_STMICRO is not set
|
||||
CONFIG_PPP=y
|
||||
CONFIG_PPP_ASYNC=y
|
||||
CONFIG_USB_USBNET=y
|
||||
CONFIG_USB_NET_SMSC75XX=y
|
||||
CONFIG_USB_NET_SMSC95XX=y
|
||||
CONFIG_CLD_LL_CORE=y
|
||||
CONFIG_WCNSS_MEM_PRE_ALLOC=y
|
||||
CONFIG_INPUT_EVDEV=y
|
||||
# CONFIG_INPUT_KEYBOARD is not set
|
||||
# CONFIG_INPUT_MOUSE is not set
|
||||
CONFIG_INPUT_MISC=y
|
||||
CONFIG_INPUT_UINPUT=y
|
||||
CONFIG_SERIO_LIBPS2=y
|
||||
# CONFIG_LEGACY_PTYS is not set
|
||||
CONFIG_HW_RANDOM=y
|
||||
CONFIG_I2C=y
|
||||
CONFIG_I2C_CHARDEV=y
|
||||
CONFIG_SPI=y
|
||||
CONFIG_SPI_SPIDEV=m
|
||||
CONFIG_GPIOLIB=y
|
||||
CONFIG_POWER_RESET=y
|
||||
CONFIG_POWER_SUPPLY=y
|
||||
CONFIG_THERMAL=y
|
||||
CONFIG_FB=y
|
||||
CONFIG_SOUND=y
|
||||
CONFIG_SND=y
|
||||
CONFIG_SND_SOC=y
|
||||
CONFIG_UHID=y
|
||||
CONFIG_HID_APPLE=y
|
||||
CONFIG_HID_ELECOM=y
|
||||
CONFIG_HID_MAGICMOUSE=y
|
||||
CONFIG_HID_MICROSOFT=y
|
||||
CONFIG_HID_MULTITOUCH=y
|
||||
CONFIG_USB=y
|
||||
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
|
||||
CONFIG_USB_XHCI_HCD=y
|
||||
CONFIG_USB_XHCI_PLATFORM=y
|
||||
CONFIG_USB_EHCI_HCD=y
|
||||
CONFIG_USB_ACM=y
|
||||
CONFIG_USB_STORAGE=y
|
||||
CONFIG_USB_STORAGE_DEBUG=y
|
||||
CONFIG_USB_STORAGE_DATAFAB=y
|
||||
CONFIG_USB_STORAGE_FREECOM=y
|
||||
CONFIG_USB_STORAGE_ISD200=y
|
||||
CONFIG_USB_STORAGE_USBAT=y
|
||||
CONFIG_USB_STORAGE_SDDR09=y
|
||||
CONFIG_USB_STORAGE_SDDR55=y
|
||||
CONFIG_USB_STORAGE_JUMPSHOT=y
|
||||
CONFIG_USB_STORAGE_ALAUDA=y
|
||||
CONFIG_USB_STORAGE_ONETOUCH=y
|
||||
CONFIG_USB_STORAGE_KARMA=y
|
||||
CONFIG_USB_STORAGE_CYPRESS_ATACB=y
|
||||
CONFIG_NOP_USB_XCEIV=y
|
||||
CONFIG_USB_GADGET=y
|
||||
CONFIG_USB_GADGET_DEBUG_FILES=y
|
||||
CONFIG_USB_GADGET_VBUS_DRAW=500
|
||||
CONFIG_RTC_CLASS=y
|
||||
CONFIG_DMADEVICES=y
|
||||
CONFIG_UIO=y
|
||||
CONFIG_STAGING=y
|
||||
CONFIG_SPS=y
|
||||
CONFIG_SPS_SUPPORT_NDP_BAM=y
|
||||
CONFIG_HWSPINLOCK=y
|
||||
CONFIG_PWM=y
|
||||
CONFIG_ANDROID=y
|
||||
CONFIG_STM=y
|
||||
CONFIG_SLIMBUS=y
|
||||
CONFIG_EXT3_FS=y
|
||||
CONFIG_EXT4_FS_SECURITY=y
|
||||
CONFIG_VFAT_FS=y
|
||||
CONFIG_TMPFS=y
|
||||
CONFIG_UBIFS_FS=y
|
||||
CONFIG_UBIFS_FS_ADVANCED_COMPR=y
|
||||
CONFIG_NLS_CODEPAGE_437=y
|
||||
CONFIG_NLS_ASCII=y
|
||||
CONFIG_NLS_ISO8859_1=y
|
||||
CONFIG_CRYPTO_ECB=y
|
||||
CONFIG_CRYPTO_CMAC=y
|
||||
CONFIG_XZ_DEC=y
|
||||
CONFIG_DMA_CMA=y
|
||||
CONFIG_CMA_SIZE_MBYTES=12
|
||||
CONFIG_PRINTK_TIME=y
|
||||
CONFIG_DEBUG_INFO=y
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_PANIC_TIMEOUT=5
|
||||
CONFIG_SCHEDSTATS=y
|
||||
# CONFIG_FTRACE is not set
|
31
arch/arm/configs/vendor/sdxlemur-debug.config
vendored
Normal file
31
arch/arm/configs/vendor/sdxlemur-debug.config
vendored
Normal file
@ -0,0 +1,31 @@
|
||||
CONFIG_LOCALVERSION="-debug"
|
||||
CONFIG_SERIAL_MSM=y
|
||||
CONFIG_SERIAL_MSM_CONSOLE=y
|
||||
CONFIG_HVC_DCC=y
|
||||
CONFIG_DYNAMIC_DEBUG=y
|
||||
CONFIG_DEBUG_PAGEALLOC=y
|
||||
CONFIG_DEBUG_KMEMLEAK=y
|
||||
CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF=y
|
||||
CONFIG_DEBUG_STACK_USAGE=y
|
||||
CONFIG_DEBUG_MEMORY_INIT=y
|
||||
CONFIG_DEBUG_SPINLOCK=y
|
||||
CONFIG_DEBUG_MUTEXES=y
|
||||
CONFIG_DEBUG_ATOMIC_SLEEP=y
|
||||
CONFIG_DEBUG_LIST=y
|
||||
CONFIG_FAULT_INJECTION=y
|
||||
CONFIG_FAIL_PAGE_ALLOC=y
|
||||
CONFIG_FAULT_INJECTION_DEBUG_FS=y
|
||||
CONFIG_FAULT_INJECTION_STACKTRACE_FILTER=y
|
||||
CONFIG_DEBUG_USER=y
|
||||
# CONFIG_USB_GADGET_DEBUG_FS is not set
|
||||
CONFIG_IOMMU_DEBUG=y
|
||||
CONFIG_IOMMU_TESTS=y
|
||||
CONFIG_IOMMU_TLBSYNC_DEBUG=y
|
||||
CONFIG_DEBUG_PANIC_ON_OOM=y
|
||||
CONFIG_OF_RESERVED_MEM_CHECK=y
|
||||
CONFIG_REGULATOR_FIXED_VOLTAGE=y
|
||||
CONFIG_REGULATOR_PROXY_CONSUMER=y
|
||||
CONFIG_REGULATOR_STUB=y
|
||||
# CONFIG_REGULATOR_PROXY_CONSUMER_LEGACY is not set
|
||||
CONFIG_CORESIGHT_SOURCE_ETM3X=y
|
||||
# CONFIG_CORESIGHT_CTI_SAVE_DISABLE is not set
|
105
arch/arm/configs/vendor/sdxlemur.config
vendored
Normal file
105
arch/arm/configs/vendor/sdxlemur.config
vendored
Normal file
@ -0,0 +1,105 @@
|
||||
CONFIG_LOCALVERSION="-perf"
|
||||
CONFIG_ARCH_SDXLEMUR=y
|
||||
CONFIG_HWSPINLOCK_QCOM=y
|
||||
CONFIG_MSM_BOOT_STATS=y
|
||||
CONFIG_QCOM_SMEM=y
|
||||
CONFIG_SLIMBUS=y
|
||||
CONFIG_IPC_LOGGING=y
|
||||
# CONFIG_USB_GADGET_DEBUG_FS is not set
|
||||
CONFIG_PINCTRL_SDXLEMUR=y
|
||||
CONFIG_BUILD_ARM_APPENDED_DTB_IMAGE=y
|
||||
CONFIG_REGULATOR_FIXED_VOLTAGE=y
|
||||
CONFIG_REGULATOR_PROXY_CONSUMER=y
|
||||
CONFIG_REGULATOR_STUB=y
|
||||
# CONFIG_REGULATOR_PROXY_CONSUMER_LEGACY is not set
|
||||
CONFIG_ARM_SMMU=y
|
||||
CONFIG_IOMMU_DYNAMIC_DOMAINS=y
|
||||
CONFIG_IOMMU_IO_PGTABLE_FAST=y
|
||||
CONFIG_QCOM_IOMMU_IO_PGTABLE_QUIRKS=y
|
||||
CONFIG_IOMMU_LIMIT_IOVA_ALIGNMENT=y
|
||||
CONFIG_QTI_IOMMU_SUPPORT=y
|
||||
CONFIG_QCOM_SCM=y
|
||||
CONFIG_QCOM_SECURE_BUFFER=y
|
||||
CONFIG_DMA_COHERENT_HINT_CACHED=y
|
||||
CONFIG_ION=y
|
||||
CONFIG_ION_MSM_HEAPS=y
|
||||
CONFIG_ION_DEFER_FREE_NO_SCHED_IDLE=y
|
||||
CONFIG_QCOM_LAZY_MAPPING=y
|
||||
CONFIG_SLAB_FREELIST_RANDOM=y
|
||||
CONFIG_SLAB_FREELIST_HARDENED=y
|
||||
CONFIG_ZSMALLOC=y
|
||||
CONFIG_ZRAM=y
|
||||
CONFIG_BALANCE_ANON_FILE_RECLAIM=y
|
||||
CONFIG_VM_EVENT_COUNT_CLEAN_PAGE_RECLAIM=y
|
||||
CONFIG_VMSPLIT_3G_OPT=y
|
||||
CONFIG_QRTR=y
|
||||
CONFIG_QRTR_SMD=y
|
||||
CONFIG_MAILBOX=y
|
||||
CONFIG_MSM_QMP=y
|
||||
CONFIG_RPMSG_QCOM_GLINK_SMEM=y
|
||||
CONFIG_QCOM_SMP2P=y
|
||||
CONFIG_QCOM_GLINK_PKT=y
|
||||
CONFIG_QMP_DEBUGFS_CLIENT=y
|
||||
CONFIG_QCOM_GLINK=y
|
||||
CONFIG_MSM_GLINK_SSR=y
|
||||
CONFIG_QCOM_APCS_IPC=y
|
||||
CONFIG_USB_DWC3=y
|
||||
CONFIG_USB_DWC3_MSM=y
|
||||
CONFIG_USB_QCOM_EMU_PHY=y
|
||||
CONFIG_USB_MSM_SSPHY_QMP=y
|
||||
CONFIG_MSM_HSUSB_PHY=y
|
||||
CONFIG_SPMI=y
|
||||
CONFIG_MFD_I2C_PMIC=y
|
||||
CONFIG_MFD_SPMI_PMIC=y
|
||||
CONFIG_PWM_QTI_LPG=y
|
||||
CONFIG_QCOM_SPMI_TEMP_ALARM=y
|
||||
CONFIG_IIO=y
|
||||
CONFIG_PINCTRL_QCOM_SPMI_PMIC=y
|
||||
CONFIG_INPUT_QPNP_POWER_ON=y
|
||||
CONFIG_QCOM_SPMI_ADC5=y
|
||||
CONFIG_NVMEM_SPMI_SDAM=y
|
||||
CONFIG_RTC_DRV_PM8XXX=y
|
||||
CONFIG_SPMI_PMIC_CLKDIV=y
|
||||
CONFIG_QTI_ADC_TM=y
|
||||
CONFIG_QTI_BCL_PMIC5=y
|
||||
CONFIG_QTI_BCL_SOC_DRIVER=y
|
||||
CONFIG_USB_CONFIGFS=y
|
||||
CONFIG_USB_CONFIGFS_UEVENT=y
|
||||
CONFIG_USB_CONFIGFS_MASS_STORAGE=y
|
||||
CONFIG_USB_CONFIGFS_F_FS=y
|
||||
CONFIG_USB_CONFIGFS_F_QDSS=y
|
||||
CONFIG_USB_CONFIGFS_F_CDEV=y
|
||||
CONFIG_USB_CONFIGFS_F_GSI=y
|
||||
CONFIG_USB_CONFIGFS_F_DIAG=y
|
||||
CONFIG_ARM_PSCI=y
|
||||
CONFIG_ARM_QCOM_LPM_CPUIDLE=y
|
||||
CONFIG_QCOM_COMMAND_DB=y
|
||||
CONFIG_QCOM_PM=y
|
||||
CONFIG_QCOM_RPMH=y
|
||||
CONFIG_QTI_RPM_STATS_LOG=y
|
||||
CONFIG_QTI_DDR_STATS_LOG=y
|
||||
CONFIG_QCOM_SOC_SLEEP_STATS=y
|
||||
CONFIG_QCOM_PDC=y
|
||||
CONFIG_PCI_MSM=y
|
||||
CONFIG_INTERCONNECT=y
|
||||
CONFIG_INTERCONNECT_TEST=y
|
||||
CONFIG_INTERCONNECT_QCOM=y
|
||||
CONFIG_INTERCONNECT_QCOM_SDXLEMUR=y
|
||||
CONFIG_QGKI=y
|
||||
CONFIG_DEBUG_FS=y
|
||||
CONFIG_REGMAP_QTI_DEBUG=y
|
||||
CONFIG_REGMAP_ALLOW_WRITE_DEBUGFS=y
|
||||
CONFIG_CORESIGHT_QGKI=y
|
||||
CONFIG_CORESIGHT_LINK_AND_SINK_TMC=y
|
||||
CONFIG_CORESIGHT_CTI=y
|
||||
CONFIG_CORESIGHT_CTI_SAVE_DISABLE=y
|
||||
CONFIG_CORESIGHT_TPDA=y
|
||||
CONFIG_CORESIGHT_TPDM=y
|
||||
CONFIG_CORESIGHT_HWEVENT=y
|
||||
CONFIG_CORESIGHT_DUMMY=y
|
||||
CONFIG_CORESIGHT_REMOTE_ETM=y
|
||||
CONFIG_CORESIGHT_TGU=y
|
||||
CONFIG_QCOM_DCC_V2=y
|
||||
# CONFIG_CORESIGHT_CATU is not set
|
||||
# CONFIG_CORESIGHT_TPDM_DEFAULT_ENABLE is not set
|
||||
CONFIG_SDX_GCC_LEMUR=y
|
@ -156,8 +156,14 @@ extern void __cpuc_flush_dcache_area(void *, size_t);
|
||||
* is visible to DMA, or data written by DMA to system memory is
|
||||
* visible to the CPU.
|
||||
*/
|
||||
extern void __dma_map_area(const void *addr, size_t size, int dir);
|
||||
extern void __dma_unmap_area(const void *addr, size_t size, int dir);
|
||||
extern void dmac_flush_range(const void *, const void *);
|
||||
|
||||
static inline void __dma_flush_area(const void *start, size_t len)
|
||||
{
|
||||
dmac_flush_range(start, start + len);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
@ -11,6 +11,7 @@
|
||||
struct dma_iommu_mapping {
|
||||
/* iommu specific data */
|
||||
struct iommu_domain *domain;
|
||||
const struct dma_map_ops *ops;
|
||||
|
||||
unsigned long **bitmaps; /* array of bitmaps */
|
||||
unsigned int nr_bitmaps; /* nr of elements in array */
|
||||
|
@ -156,6 +156,11 @@ static inline void nop_dma_unmap_area(const void *s, size_t l, int f) { }
|
||||
#define __cpuc_flush_dcache_area __glue(_CACHE,_flush_kern_dcache_area)
|
||||
|
||||
#define dmac_flush_range __glue(_CACHE,_dma_flush_range)
|
||||
#define dmac_map_area __glue(_CACHE, _dma_map_area)
|
||||
#define dmac_unmap_area __glue(_CACHE, _dma_unmap_area)
|
||||
|
||||
#define __dma_map_area dmac_map_area
|
||||
#define __dma_unmap_area dmac_unmap_area
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
@ -17,7 +17,7 @@
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
#define COMMAND_LINE_SIZE 1024
|
||||
#define COMMAND_LINE_SIZE 4096
|
||||
|
||||
/* The list ends with an ATAG_NONE node. */
|
||||
#define ATAG_NONE 0x00000000
|
||||
|
@ -48,6 +48,8 @@
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mpu.h>
|
||||
|
||||
#include <soc/qcom/lpm_levels.h>
|
||||
|
||||
#define CREATE_TRACE_POINTS
|
||||
#include <trace/events/ipi.h>
|
||||
|
||||
@ -748,6 +750,7 @@ void __init set_smp_ipi_range(int ipi_base, int n)
|
||||
|
||||
void smp_send_reschedule(int cpu)
|
||||
{
|
||||
update_ipi_history(cpu);
|
||||
smp_cross_call(cpumask_of(cpu), IPI_RESCHEDULE);
|
||||
}
|
||||
|
||||
|
@ -54,9 +54,10 @@ config ARCH_SDXLEMUR
|
||||
select CPU_V7
|
||||
select ARM_GIC
|
||||
select HAVE_ARM_ARCH_TIMER
|
||||
select HAVE_PCI
|
||||
select MSM_CORTEX_A7
|
||||
select PINCTRL
|
||||
select PCI
|
||||
select PINCTRL
|
||||
select QCOM_SCM if SMP
|
||||
select MSM_JTAG_MM if CORESIGHT_ETM
|
||||
select PM_DEVFREQ
|
||||
|
@ -5,8 +5,6 @@
|
||||
#include <asm/glue-cache.h>
|
||||
|
||||
#ifndef MULTI_CACHE
|
||||
#define dmac_map_area __glue(_CACHE,_dma_map_area)
|
||||
#define dmac_unmap_area __glue(_CACHE,_dma_unmap_area)
|
||||
|
||||
/*
|
||||
* These are private to the dma-mapping API. Do not use directly.
|
||||
|
@ -420,6 +420,9 @@ struct section_perm {
|
||||
pmdval_t mask;
|
||||
pmdval_t prot;
|
||||
pmdval_t clear;
|
||||
pteval_t ptemask;
|
||||
pteval_t pteprot;
|
||||
pteval_t pteclear;
|
||||
};
|
||||
|
||||
/* First section-aligned location at or after __start_rodata. */
|
||||
@ -433,6 +436,8 @@ static struct section_perm nx_perms[] = {
|
||||
.end = (unsigned long)_stext,
|
||||
.mask = ~PMD_SECT_XN,
|
||||
.prot = PMD_SECT_XN,
|
||||
.ptemask = ~L_PTE_XN,
|
||||
.pteprot = L_PTE_XN,
|
||||
},
|
||||
/* Make init RW (set NX). */
|
||||
{
|
||||
@ -441,6 +446,8 @@ static struct section_perm nx_perms[] = {
|
||||
.end = (unsigned long)_sdata,
|
||||
.mask = ~PMD_SECT_XN,
|
||||
.prot = PMD_SECT_XN,
|
||||
.ptemask = ~L_PTE_XN,
|
||||
.pteprot = L_PTE_XN,
|
||||
},
|
||||
/* Make rodata NX (set RO in ro_perms below). */
|
||||
{
|
||||
@ -449,6 +456,8 @@ static struct section_perm nx_perms[] = {
|
||||
.end = (unsigned long)__init_begin,
|
||||
.mask = ~PMD_SECT_XN,
|
||||
.prot = PMD_SECT_XN,
|
||||
.ptemask = ~L_PTE_XN,
|
||||
.pteprot = L_PTE_XN,
|
||||
},
|
||||
};
|
||||
|
||||
@ -466,6 +475,8 @@ static struct section_perm ro_perms[] = {
|
||||
.prot = PMD_SECT_APX | PMD_SECT_AP_WRITE,
|
||||
.clear = PMD_SECT_AP_WRITE,
|
||||
#endif
|
||||
.ptemask = ~L_PTE_RDONLY,
|
||||
.pteprot = L_PTE_RDONLY,
|
||||
},
|
||||
};
|
||||
|
||||
@ -474,6 +485,34 @@ static struct section_perm ro_perms[] = {
|
||||
* copied into each mm). During startup, this is the init_mm. Is only
|
||||
* safe to be called with preemption disabled, as under stop_machine().
|
||||
*/
|
||||
struct pte_data {
|
||||
pteval_t mask;
|
||||
pteval_t val;
|
||||
};
|
||||
|
||||
static int __pte_update(pte_t *ptep, unsigned long addr, void *d)
|
||||
{
|
||||
struct pte_data *data = d;
|
||||
pte_t pte = *ptep;
|
||||
|
||||
pte = __pte((pte_val(*ptep) & data->mask) | data->val);
|
||||
set_pte_ext(ptep, pte, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void pte_update(unsigned long addr, pteval_t mask,
|
||||
pteval_t prot, struct mm_struct *mm)
|
||||
{
|
||||
struct pte_data data;
|
||||
|
||||
data.mask = mask;
|
||||
data.val = prot;
|
||||
|
||||
apply_to_page_range(mm, addr, SECTION_SIZE, __pte_update, &data);
|
||||
flush_tlb_kernel_range(addr, addr + SECTION_SIZE);
|
||||
}
|
||||
|
||||
static inline void section_update(unsigned long addr, pmdval_t mask,
|
||||
pmdval_t prot, struct mm_struct *mm)
|
||||
{
|
||||
@ -522,11 +561,21 @@ static void set_section_perms(struct section_perm *perms, int n, bool set,
|
||||
|
||||
for (addr = perms[i].start;
|
||||
addr < perms[i].end;
|
||||
addr += SECTION_SIZE)
|
||||
section_update(addr, perms[i].mask,
|
||||
set ? perms[i].prot : perms[i].clear, mm);
|
||||
}
|
||||
addr += SECTION_SIZE) {
|
||||
pmd_t *pmd;
|
||||
|
||||
pmd = pmd_offset(pud_offset(pgd_offset(mm, addr),
|
||||
addr), addr);
|
||||
if (pmd_bad(*pmd))
|
||||
section_update(addr, perms[i].mask,
|
||||
set ? perms[i].prot : perms[i].clear,
|
||||
mm);
|
||||
else
|
||||
pte_update(addr, perms[i].ptemask,
|
||||
set ? perms[i].pteprot : perms[i].pteclear,
|
||||
mm);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1584,6 +1584,119 @@ static void __init early_paging_init(const struct machine_desc *mdesc)
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_FORCE_PAGES
|
||||
/*
|
||||
* remap a PMD into pages
|
||||
* We split a single pmd here none of this two pmd nonsense
|
||||
*/
|
||||
static noinline void __init split_pmd(pmd_t *pmd, unsigned long addr,
|
||||
unsigned long end, unsigned long pfn,
|
||||
const struct mem_type *type)
|
||||
{
|
||||
pte_t *pte, *start_pte;
|
||||
pmd_t *base_pmd;
|
||||
|
||||
base_pmd = pmd_offset(
|
||||
pud_offset(pgd_offset(&init_mm, addr), addr), addr);
|
||||
|
||||
if (pmd_none(*base_pmd) || pmd_bad(*base_pmd)) {
|
||||
start_pte = early_alloc(PTE_HWTABLE_OFF + PTE_HWTABLE_SIZE);
|
||||
#ifndef CONFIG_ARM_LPAE
|
||||
/*
|
||||
* Following is needed when new pte is allocated for pmd[1]
|
||||
* cases, which may happen when base (start) address falls
|
||||
* under pmd[1].
|
||||
*/
|
||||
if (addr & SECTION_SIZE)
|
||||
start_pte += pte_index(addr);
|
||||
#endif
|
||||
} else {
|
||||
start_pte = pte_offset_kernel(base_pmd, addr);
|
||||
}
|
||||
|
||||
pte = start_pte;
|
||||
|
||||
do {
|
||||
set_pte_ext(pte, pfn_pte(pfn, type->prot_pte), 0);
|
||||
pfn++;
|
||||
} while (pte++, addr += PAGE_SIZE, addr != end);
|
||||
|
||||
*pmd = __pmd((__pa(start_pte) + PTE_HWTABLE_OFF) | type->prot_l1);
|
||||
mb(); /* let pmd be programmed */
|
||||
flush_pmd_entry(pmd);
|
||||
flush_tlb_all();
|
||||
}
|
||||
|
||||
/*
|
||||
* It's significantly easier to remap as pages later after all memory is
|
||||
* mapped. Everything is sections so all we have to do is split
|
||||
*/
|
||||
static void __init remap_pages(void)
|
||||
{
|
||||
struct memblock_region *reg;
|
||||
|
||||
for_each_memblock(memory, reg) {
|
||||
phys_addr_t phys_start = reg->base;
|
||||
phys_addr_t phys_end = reg->base + reg->size;
|
||||
unsigned long addr = (unsigned long)__va(phys_start);
|
||||
unsigned long end = (unsigned long)__va(phys_end);
|
||||
pmd_t *pmd = NULL;
|
||||
unsigned long next;
|
||||
unsigned long pfn = __phys_to_pfn(phys_start);
|
||||
bool fixup = false;
|
||||
unsigned long saved_start = addr;
|
||||
|
||||
if (phys_start > arm_lowmem_limit)
|
||||
break;
|
||||
if (phys_end > arm_lowmem_limit)
|
||||
end = (unsigned long)__va(arm_lowmem_limit);
|
||||
if (phys_start >= phys_end)
|
||||
break;
|
||||
|
||||
pmd = pmd_offset(
|
||||
pud_offset(pgd_offset(&init_mm, addr), addr), addr);
|
||||
|
||||
#ifndef CONFIG_ARM_LPAE
|
||||
if (addr & SECTION_SIZE) {
|
||||
fixup = true;
|
||||
pmd_empty_section_gap((addr - SECTION_SIZE) & PMD_MASK);
|
||||
pmd++;
|
||||
}
|
||||
|
||||
if (end & SECTION_SIZE)
|
||||
pmd_empty_section_gap(end);
|
||||
#endif
|
||||
|
||||
do {
|
||||
next = addr + SECTION_SIZE;
|
||||
|
||||
if (pmd_none(*pmd) || pmd_bad(*pmd))
|
||||
split_pmd(pmd, addr, next, pfn,
|
||||
&mem_types[MT_MEMORY_RWX]);
|
||||
pmd++;
|
||||
pfn += SECTION_SIZE >> PAGE_SHIFT;
|
||||
|
||||
} while (addr = next, addr < end);
|
||||
|
||||
if (fixup) {
|
||||
/*
|
||||
* Put a faulting page table here to avoid detecting no
|
||||
* pmd when accessing an odd section boundary. This
|
||||
* needs to be faulting to help catch errors and avoid
|
||||
* speculation
|
||||
*/
|
||||
pmd = pmd_off_k(saved_start);
|
||||
pmd[0] = pmd[1] & ~1;
|
||||
}
|
||||
}
|
||||
}
|
||||
#else
|
||||
static void __init remap_pages(void)
|
||||
{
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
static void __init early_fixmap_shutdown(void)
|
||||
{
|
||||
int i;
|
||||
@ -1626,6 +1739,7 @@ void __init paging_init(const struct machine_desc *mdesc)
|
||||
memblock_set_current_limit(arm_lowmem_limit);
|
||||
dma_contiguous_remap();
|
||||
early_fixmap_shutdown();
|
||||
remap_pages();
|
||||
devicemaps_init(mdesc);
|
||||
kmap_init();
|
||||
tcm_init();
|
||||
|
@ -1,6 +1,6 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (c) 2014, The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2014,2017-2018 The Linux Foundation. All rights reserved.
|
||||
*/
|
||||
#include <linux/mm.h>
|
||||
#include <linux/module.h>
|
||||
@ -46,7 +46,8 @@ static int change_memory_common(unsigned long addr, int numpages,
|
||||
if (!size)
|
||||
return 0;
|
||||
|
||||
if (!in_range(start, size, MODULES_VADDR, MODULES_END) &&
|
||||
if (!IS_ENABLED(CONFIG_FORCE_PAGES) &&
|
||||
!in_range(start, size, MODULES_VADDR, MODULES_END) &&
|
||||
!in_range(start, size, VMALLOC_START, VMALLOC_END))
|
||||
return -EINVAL;
|
||||
|
||||
@ -87,3 +88,19 @@ int set_memory_x(unsigned long addr, int numpages)
|
||||
__pgprot(0),
|
||||
__pgprot(L_PTE_XN));
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC
|
||||
void __kernel_map_pages(struct page *page, int numpages, int enable)
|
||||
{
|
||||
unsigned long addr;
|
||||
|
||||
if (PageHighMem(page))
|
||||
return;
|
||||
|
||||
addr = (unsigned long) page_address(page);
|
||||
if (enable)
|
||||
set_memory_rw(addr, numpages);
|
||||
else
|
||||
set_memory_ro(addr, numpages);
|
||||
}
|
||||
#endif
|
||||
|
@ -18,6 +18,21 @@ OBJCOPYFLAGS_Image :=-O binary -R .note -R .note.gnu.build-id -R .comment -S
|
||||
|
||||
targets := Image Image.bz2 Image.gz Image.lz4 Image.lzma Image.lzo
|
||||
|
||||
ifeq ($(CONFIG_QCOM_RTIC),y)
|
||||
# Add RTIC DTB to the DTB list if RTIC MPGen is enabled
|
||||
# Note, we keep this for compatibility with
|
||||
# BUILD_ARM64_APPENDED_DTB_IMAGE targets.
|
||||
# The rtic_mp.dts would be generated with the vmlinux if
|
||||
# MPGen enabled (RTIC_MPGEN defined).
|
||||
ifdef RTIC_MPGEN
|
||||
DTB_OBJS += rtic_mp.dtb
|
||||
endif
|
||||
|
||||
rtic_mp.dtb: vmlinux FORCE
|
||||
$(DTC) -O dtb -o rtic_mp.dtb -b 0 $(DTC_FLAGS) rtic_mp.dts
|
||||
|
||||
endif
|
||||
|
||||
$(obj)/Image: vmlinux FORCE
|
||||
$(call if_changed,objcopy)
|
||||
|
||||
|
50
arch/arm64/configs/vendor/lahaina_GKI.config
vendored
50
arch/arm64/configs/vendor/lahaina_GKI.config
vendored
@ -1,10 +1,11 @@
|
||||
CONFIG_ARCH_QCOM=y
|
||||
CONFIG_ARCH_LAHAINA=y
|
||||
CONFIG_ARCH_SHIMA=y
|
||||
CONFIG_HVC_DCC=y
|
||||
CONFIG_HVC_DCC_SERIALIZE_SMP=y
|
||||
CONFIG_QCOM_RPMH=m
|
||||
CONFIG_QCOM_RPMHPD=m
|
||||
CONFIG_REGULATOR_STUB=m
|
||||
CONFIG_REGULATOR_PROXY_CONSUMER=m
|
||||
CONFIG_PINCTRL_MSM=m
|
||||
CONFIG_PINCTRL_LAHAINA=m
|
||||
CONFIG_SND_USB_AUDIO_QMI=m
|
||||
CONFIG_SPMI_MSM_PMIC_ARB=m
|
||||
@ -30,7 +31,7 @@ CONFIG_USB_CONFIGFS_F_CCID=m
|
||||
CONFIG_USB_CONFIGFS_F_CDEV=m
|
||||
CONFIG_USB_CONFIGFS_F_GSI=m
|
||||
CONFIG_USB_CONFIGFS_F_QDSS=m
|
||||
CONFIG_USB_BAM=m
|
||||
CONFIG_USB_CONFIGFS_F_UAC2=m
|
||||
CONFIG_SDCARD_FS=m
|
||||
CONFIG_TYPEC_UCSI=m
|
||||
CONFIG_INTERCONNECT_QCOM=m
|
||||
@ -43,7 +44,8 @@ CONFIG_SCSI_UFS_BSG=y
|
||||
CONFIG_CHR_DEV_SG=m
|
||||
CONFIG_MSM_CORE_HANG_DETECT=m
|
||||
CONFIG_QCOM_LLCC=m
|
||||
CONFIG_QCOM_WATCHDOG=m
|
||||
CONFIG_QCOM_IPCC=m
|
||||
CONFIG_QCOM_WDT_CORE=m
|
||||
CONFIG_QCOM_FORCE_WDOG_BITE_ON_PANIC=y
|
||||
CONFIG_QCOM_SCM=m
|
||||
CONFIG_QTEE_SHM_BRIDGE=y
|
||||
@ -56,9 +58,18 @@ CONFIG_QCOM_SMSM=m
|
||||
CONFIG_MSM_QMP=m
|
||||
CONFIG_QCOM_SMP2P_SLEEPSTATE=m
|
||||
CONFIG_MSM_GLINK_SSR=m
|
||||
CONFIG_QTI_PMIC_GLINK=m
|
||||
CONFIG_QTI_BATTERY_CHARGER=m
|
||||
CONFIG_QTI_BATTERY_GLINK_DEBUG=m
|
||||
CONFIG_QTI_ALTMODE_GLINK=m
|
||||
CONFIG_QTI_PMIC_PON_LOG=m
|
||||
CONFIG_QRTR_MHI=m
|
||||
CONFIG_QSEE_IPC_IRQ_BRIDGE=m
|
||||
CONFIG_SENSORS_SSC=m
|
||||
CONFIG_POWER_RESET_MSM=m
|
||||
CONFIG_POWER_RESET_QCOM_DOWNLOAD_MODE=m
|
||||
CONFIG_POWER_RESET_QCOM_DOWNLOAD_MODE_DEFAULT=y
|
||||
CONFIG_POWER_RESET_QCOM_REBOOT_REASON=m
|
||||
CONFIG_MSM_SUBSYSTEM_RESTART=m
|
||||
CONFIG_SETUP_SSR_NOTIF_TIMEOUTS=y
|
||||
CONFIG_SSR_SYSMON_NOTIF_TIMEOUT=20000
|
||||
@ -72,6 +83,8 @@ CONFIG_REGULATOR_RPMH=m
|
||||
CONFIG_REGULATOR_QTI_FIXED_VOLTAGE=m
|
||||
CONFIG_REGULATOR_QCOM_PM8008=m
|
||||
CONFIG_REGULATOR_QPNP_AMOLED=m
|
||||
CONFIG_HWMON=m
|
||||
CONFIG_SENSORS_QTI_AMOLED_ECM=m
|
||||
CONFIG_MSM_GCC_LAHAINA=m
|
||||
CONFIG_REGULATOR_REFGEN=m
|
||||
CONFIG_MSM_VIDEOCC_LAHAINA=m
|
||||
@ -114,6 +127,7 @@ CONFIG_INTERCONNECT_QCOM_EPSS_L3=m
|
||||
CONFIG_LEDS_QTI_FLASH=m
|
||||
CONFIG_LEDS_QTI_TRI_LED=m
|
||||
CONFIG_MSM_ADSPRPC=m
|
||||
CONFIG_MSM_RDBG=m
|
||||
CONFIG_MSM_CDSP_LOADER=m
|
||||
CONFIG_UIO_MSM_SHAREDMEM=m
|
||||
CONFIG_QCOM_SOCINFO=m
|
||||
@ -127,7 +141,6 @@ CONFIG_HH_MEM_NOTIFIER=m
|
||||
CONFIG_HH_DBL=m
|
||||
CONFIG_HVC_HAVEN=m
|
||||
# CONFIG_HVC_HAVEN_CONSOLE is not set
|
||||
# CONFIG_CFI_PERMISSIVE is not set
|
||||
# CONFIG_SND_SOC_WCD9335 is not set
|
||||
# CONFIG_SLIM_QCOM_CTRL is not set
|
||||
# CONFIG_SLIM_QCOM_NGD_CTRL is not set
|
||||
@ -143,6 +156,8 @@ CONFIG_SPI_SPIDEV=y
|
||||
# CONFIG_SERIAL_MSM is not set
|
||||
CONFIG_MSM_GPI_DMA=m
|
||||
CONFIG_MSM_GPI_DMA_DEBUG=y
|
||||
CONFIG_QSEECOM=m
|
||||
CONFIG_QCOM_SMCINVOKE=m
|
||||
CONFIG_HDCP_QSEECOM=m
|
||||
CONFIG_HW_RANDOM_MSM_LEGACY=m
|
||||
CONFIG_MHI_BUS=m
|
||||
@ -151,13 +166,13 @@ CONFIG_MHI_UCI=m
|
||||
CONFIG_EXTCON_USB_GPIO=m
|
||||
CONFIG_MMC_SDHCI_MSM=m
|
||||
# CONFIG_MSM_CVP is not set
|
||||
# CONFIG_QSEECOM is not set
|
||||
# CONFIG_MSM_QBT_HANDLER is not set
|
||||
CONFIG_QCOM_RPMH=m
|
||||
CONFIG_QCOM_RPMHPD=m
|
||||
CONFIG_QCOM_QFPROM=m
|
||||
CONFIG_DEVFREQ_GOV_QCOM_GPUBW_MON=m
|
||||
CONFIG_DEVFREQ_GOV_QCOM_ADRENO_TZ=m
|
||||
CONFIG_INTERCONNECT_TEST=m
|
||||
CONFIG_QRTR_HAVEN=m
|
||||
CONFIG_QCOM_CDSP_RM=m
|
||||
CONFIG_QCOM_PDC=m
|
||||
CONFIG_HEADER_TEST=y
|
||||
CONFIG_KERNEL_HEADER_TEST=y
|
||||
@ -166,7 +181,24 @@ CONFIG_TOUCHSCREEN_ATMEL_MXT=m
|
||||
CONFIG_SPS=m
|
||||
CONFIG_SPS_SUPPORT_NDP_BAM=y
|
||||
# CONFIG_SPS_SUPPORT_BAMDMA is not set
|
||||
CONFIG_USB_BAM=m
|
||||
CONFIG_UTS_NS=y
|
||||
CONFIG_HH_IRQ_LEND=m
|
||||
CONFIG_SM_GCC_SHIMA=m
|
||||
CONFIG_NFC_QTI_I2C=m
|
||||
CONFIG_NETFILTER_XT_TARGET_DSCP=y
|
||||
CONFIG_USB_REDRIVER_NB7VPQ904M=m
|
||||
CONFIG_UAPI_HEADER_TEST=y
|
||||
CONFIG_SM_VIDEOCC_SHIMA=m
|
||||
CONFIG_SM_CAMCC_SHIMA=m
|
||||
CONFIG_SM_GPUCC_SHIMA=m
|
||||
CONFIG_INTERCONNECT_QCOM_SHIMA=m
|
||||
CONFIG_SM_DISPCC_SHIMA=m
|
||||
CONFIG_NETFILTER_XT_MATCH_DSCP=y
|
||||
CONFIG_QCOM_MICRODUMP=m
|
||||
CONFIG_HH_VIRT_WATCHDOG=m
|
||||
CONFIG_QCOM_SOC_WATCHDOG=m
|
||||
CONFIG_QPNP_PBS=m
|
||||
# CONFIG_TOUCHSCREEN_ST is not set
|
||||
# CONFIG_TOUCHSCREEN_FTS is not set
|
||||
# CONFIG_QCOM_KGSL is not set
|
||||
@ -176,7 +208,6 @@ CONFIG_HH_IRQ_LEND=m
|
||||
CONFIG_QCOM_SOC_SLEEP_STATS=m
|
||||
CONFIG_QTI_SYS_PM_VX=m
|
||||
CONFIG_SERIAL_MSM_GENI_CONSOLE=m
|
||||
CONFIG_POWER_RESET_MSM=m
|
||||
CONFIG_QCOM_Q6V5_PAS=m
|
||||
CONFIG_QCOM_SYSMON=m
|
||||
CONFIG_RPMSG_QCOM_SMD=m
|
||||
@ -188,3 +219,4 @@ CONFIG_RPMSG_QCOM_SMD=m
|
||||
CONFIG_QCOM_CPUSS_SLEEP_STATS=m
|
||||
CONFIG_IPC_LOGGING=m
|
||||
# CONFIG_FTRACE_STARTUP_TEST is not set
|
||||
# CONFIG_TOUCHSCREEN_SYNAPTICS_TCM is not set
|
||||
|
@ -957,6 +957,12 @@ static void binder_wakeup_poll_threads_ilocked(struct binder_proc *proc,
|
||||
thread = rb_entry(n, struct binder_thread, rb_node);
|
||||
if (thread->looper & BINDER_LOOPER_STATE_POLL &&
|
||||
binder_available_for_proc_work_ilocked(thread)) {
|
||||
#ifdef CONFIG_SCHED_WALT
|
||||
if (thread->task && current->signal &&
|
||||
(current->signal->oom_score_adj == 0) &&
|
||||
(current->prio < DEFAULT_PRIO))
|
||||
thread->task->wts.low_latency = true;
|
||||
#endif
|
||||
if (sync)
|
||||
wake_up_interruptible_sync(&thread->wait);
|
||||
else
|
||||
@ -1016,6 +1022,12 @@ static void binder_wakeup_thread_ilocked(struct binder_proc *proc,
|
||||
assert_spin_locked(&proc->inner_lock);
|
||||
|
||||
if (thread) {
|
||||
#ifdef CONFIG_SCHED_WALT
|
||||
if (thread->task && current->signal &&
|
||||
(current->signal->oom_score_adj == 0) &&
|
||||
(current->prio < DEFAULT_PRIO))
|
||||
thread->task->wts.low_latency = true;
|
||||
#endif
|
||||
if (sync)
|
||||
wake_up_interruptible_sync(&thread->wait);
|
||||
else
|
||||
@ -4671,6 +4683,10 @@ static int binder_thread_read(struct binder_proc *proc,
|
||||
ptr += trsize;
|
||||
|
||||
trace_binder_transaction_received(t);
|
||||
#ifdef CONFIG_SCHED_WALT
|
||||
if (current->wts.low_latency)
|
||||
current->wts.low_latency = false;
|
||||
#endif
|
||||
binder_stat_br(proc, thread, cmd);
|
||||
binder_debug(BINDER_DEBUG_TRANSACTION,
|
||||
"%d:%d %s %d %d:%d, cmd %d size %zd-%zd ptr %016llx-%016llx\n",
|
||||
|
@ -21,6 +21,10 @@
|
||||
#include "btfm_slim.h"
|
||||
#include "btfm_slim_slave.h"
|
||||
|
||||
#define DELAY_FOR_PORT_OPEN_MS (200)
|
||||
|
||||
static bool btfm_is_port_opening_delayed = true;
|
||||
|
||||
int btfm_slim_write(struct btfmslim *btfmslim,
|
||||
uint16_t reg, int bytes, void *src, uint8_t pgd)
|
||||
{
|
||||
@ -110,6 +114,19 @@ int btfm_slim_read_inf(struct btfmslim *btfmslim,
|
||||
return btfm_slim_read(btfmslim, reg, bytes, dest, IFD);
|
||||
}
|
||||
|
||||
static bool btfm_slim_is_sb_reset_needed(int chip_ver)
|
||||
{
|
||||
switch (chip_ver) {
|
||||
case QCA_APACHE_SOC_ID_0100:
|
||||
case QCA_APACHE_SOC_ID_0110:
|
||||
case QCA_APACHE_SOC_ID_0120:
|
||||
case QCA_APACHE_SOC_ID_0121:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
int btfm_slim_enable_ch(struct btfmslim *btfmslim, struct btfmslim_ch *ch,
|
||||
uint8_t rxport, uint32_t rates, uint8_t grp, uint8_t nchan)
|
||||
{
|
||||
@ -117,6 +134,7 @@ int btfm_slim_enable_ch(struct btfmslim *btfmslim, struct btfmslim_ch *ch,
|
||||
struct slim_ch prop;
|
||||
struct btfmslim_ch *chan = ch;
|
||||
uint16_t ch_h[2];
|
||||
int chipset_ver;
|
||||
|
||||
if (!btfmslim || !ch)
|
||||
return -EINVAL;
|
||||
@ -128,9 +146,28 @@ int btfm_slim_enable_ch(struct btfmslim *btfmslim, struct btfmslim_ch *ch,
|
||||
SLIM_PUSH : SLIM_AUTO_ISO;
|
||||
prop.baser = ((rates == 44100) || (rates == 88200)) ?
|
||||
SLIM_RATE_11025HZ : SLIM_RATE_4000HZ;
|
||||
prop.dataf = ((rates == 48000) || (rates == 44100) ||
|
||||
(rates == 88200) || (rates == 96000)) ?
|
||||
SLIM_CH_DATAF_NOT_DEFINED : SLIM_CH_DATAF_LPCM_AUDIO;
|
||||
prop.dataf = SLIM_CH_DATAF_NOT_DEFINED;
|
||||
|
||||
chipset_ver = btpower_get_chipset_version();
|
||||
BTFMSLIM_INFO("chipset soc version:%x", chipset_ver);
|
||||
|
||||
/* Delay port opening for few chipsets if:
|
||||
* 1. for 8k, feedback channel
|
||||
* 2. 44.1k, 88.2k rxports
|
||||
*/
|
||||
if (((rates == 8000 && btfm_feedback_ch_setting && rxport == 0) ||
|
||||
(rxport == 1 && (rates == 44100 || rates == 88200))) &&
|
||||
btfm_slim_is_sb_reset_needed(chipset_ver)) {
|
||||
|
||||
BTFMSLIM_INFO("btfm_is_port_opening_delayed %d",
|
||||
btfm_is_port_opening_delayed);
|
||||
|
||||
if (!btfm_is_port_opening_delayed) {
|
||||
BTFMSLIM_INFO("SB reset needed, sleeping");
|
||||
btfm_is_port_opening_delayed = true;
|
||||
msleep(DELAY_FOR_PORT_OPEN_MS);
|
||||
}
|
||||
}
|
||||
|
||||
/* for feedback channel, PCM bit should not be set */
|
||||
if (btfm_feedback_ch_setting) {
|
||||
@ -232,6 +269,8 @@ int btfm_slim_disable_ch(struct btfmslim *btfmslim, struct btfmslim_ch *ch,
|
||||
BTFMSLIM_INFO("port:%d, grp: %d, ch->grph:0x%x, ch->ch_hdl:0x%x ",
|
||||
ch->port, grp, ch->grph, ch->ch_hdl);
|
||||
|
||||
btfm_is_port_opening_delayed = false;
|
||||
|
||||
/* For 44.1/88.2 Khz A2DP Rx, disconnect the port first */
|
||||
if (rxport &&
|
||||
(btfmslim->sample_rate == 44100 ||
|
||||
|
@ -22,6 +22,8 @@
|
||||
#include <linux/clk.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/btpower.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <soc/qcom/cmd-db.h>
|
||||
|
||||
#if defined CONFIG_BT_SLIM_QCA6390 || \
|
||||
defined CONFIG_BT_SLIM_QCA6490 || \
|
||||
@ -30,29 +32,106 @@
|
||||
#endif
|
||||
#include <linux/fs.h>
|
||||
|
||||
#define PWR_SRC_NOT_AVAILABLE -2
|
||||
#define DEFAULT_INVALID_VALUE -1
|
||||
#define PWR_SRC_INIT_STATE_IDX 0
|
||||
|
||||
enum power_src_pos {
|
||||
BT_RESET_GPIO = PWR_SRC_INIT_STATE_IDX,
|
||||
BT_SW_CTRL_GPIO,
|
||||
BT_VDD_AON_LDO,
|
||||
BT_VDD_DIG_LDO,
|
||||
BT_VDD_RFA1_LDO,
|
||||
BT_VDD_RFA2_LDO,
|
||||
BT_VDD_ASD_LDO,
|
||||
BT_VDD_XTAL_LDO,
|
||||
BT_VDD_PA_LDO,
|
||||
BT_VDD_CORE_LDO,
|
||||
BT_VDD_IO_LDO,
|
||||
BT_VDD_LDO,
|
||||
BT_VDD_RFA_0p8,
|
||||
BT_VDD_RFACMN,
|
||||
// these indexes GPIOs/regs value are fetched during crash.
|
||||
BT_RESET_GPIO_CURRENT,
|
||||
BT_SW_CTRL_GPIO_CURRENT,
|
||||
BT_VDD_AON_LDO_CURRENT,
|
||||
BT_VDD_DIG_LDO_CURRENT,
|
||||
BT_VDD_RFA1_LDO_CURRENT,
|
||||
BT_VDD_RFA2_LDO_CURRENT,
|
||||
BT_VDD_ASD_LDO_CURRENT,
|
||||
BT_VDD_XTAL_LDO_CURRENT,
|
||||
BT_VDD_PA_LDO_CURRENT,
|
||||
BT_VDD_CORE_LDO_CURRENT,
|
||||
BT_VDD_IO_LDO_CURRENT,
|
||||
BT_VDD_LDO_CURRENT,
|
||||
BT_VDD_RFA_0p8_CURRENT,
|
||||
BT_VDD_RFACMN_CURRENT
|
||||
};
|
||||
|
||||
// Regulator structure for QCA6390 and QCA6490 BT SoC series
|
||||
static struct bt_power_vreg_data bt_vregs_info_qca6x9x[] = {
|
||||
{NULL, "qcom,bt-vdd-io", 1800000, 1800000, 0, false, true,
|
||||
{BT_VDD_IO_LDO, BT_VDD_IO_LDO_CURRENT}},
|
||||
{NULL, "qcom,bt-vdd-aon", 950000, 950000, 0, false, true,
|
||||
{BT_VDD_AON_LDO, BT_VDD_AON_LDO_CURRENT}},
|
||||
{NULL, "qcom,bt-vdd-rfacmn", 950000, 950000, 0, false, true,
|
||||
{BT_VDD_RFACMN, BT_VDD_RFACMN_CURRENT}},
|
||||
/* BT_CX_MX */
|
||||
{NULL, "qcom,bt-vdd-dig", 950000, 952000, 0, false, true,
|
||||
{BT_VDD_DIG_LDO, BT_VDD_DIG_LDO_CURRENT}},
|
||||
{NULL, "qcom,bt-vdd-rfa-0p8", 950000, 952000, 0, false, true,
|
||||
{BT_VDD_RFA_0p8, BT_VDD_RFA_0p8_CURRENT}},
|
||||
{NULL, "qcom,bt-vdd-rfa1", 1900000, 1900000, 0, false, true,
|
||||
{BT_VDD_RFA1_LDO, BT_VDD_RFA1_LDO_CURRENT}},
|
||||
{NULL, "qcom,bt-vdd-rfa2", 1900000, 1900000, 0, false, true,
|
||||
{BT_VDD_RFA2_LDO, BT_VDD_RFA2_LDO_CURRENT}},
|
||||
{NULL, "qcom,bt-vdd-asd", 2800000, 2800000, 0, false, true,
|
||||
{BT_VDD_ASD_LDO, BT_VDD_ASD_LDO_CURRENT}},
|
||||
};
|
||||
|
||||
// Regulator structure for WCN399x BT SoC series
|
||||
static struct bt_power bt_vreg_info_wcn399x = {
|
||||
.compatible = "qcom,wcn3990",
|
||||
.vregs = (struct bt_power_vreg_data []) {
|
||||
{NULL, "qcom,bt-vdd-io", 1700000, 1900000, 0, false, false,
|
||||
{BT_VDD_IO_LDO, BT_VDD_IO_LDO_CURRENT}},
|
||||
{NULL, "qcom,bt-vdd-core", 1304000, 1304000, 0, false, false,
|
||||
{BT_VDD_CORE_LDO, BT_VDD_CORE_LDO_CURRENT}},
|
||||
{NULL, "qcom,bt-vdd-pa", 3000000, 3312000, 0, false, false,
|
||||
{BT_VDD_PA_LDO, BT_VDD_PA_LDO_CURRENT}},
|
||||
{NULL, "qcom,bt-vdd-xtal", 1700000, 1900000, 0, false, false,
|
||||
{BT_VDD_XTAL_LDO, BT_VDD_XTAL_LDO_CURRENT}},
|
||||
},
|
||||
.num_vregs = 4,
|
||||
};
|
||||
|
||||
static struct bt_power bt_vreg_info_qca6390 = {
|
||||
.compatible = "qcom,qca6390",
|
||||
.vregs = bt_vregs_info_qca6x9x,
|
||||
.num_vregs = ARRAY_SIZE(bt_vregs_info_qca6x9x),
|
||||
};
|
||||
|
||||
static struct bt_power bt_vreg_info_qca6490 = {
|
||||
.compatible = "qcom,qca6490",
|
||||
.vregs = bt_vregs_info_qca6x9x,
|
||||
.num_vregs = ARRAY_SIZE(bt_vregs_info_qca6x9x),
|
||||
};
|
||||
|
||||
static const struct of_device_id bt_power_match_table[] = {
|
||||
{ .compatible = "qcom,qca6174" },
|
||||
{ .compatible = "qcom,wcn3990" },
|
||||
{ .compatible = "qcom,qca6390" },
|
||||
{ .compatible = "qcom,qca6490" },
|
||||
{ .compatible = "qcom,wcn3990", .data = &bt_vreg_info_wcn399x},
|
||||
{ .compatible = "qcom,qca6390", .data = &bt_vreg_info_qca6390},
|
||||
{ .compatible = "qcom,qca6490", .data = &bt_vreg_info_qca6490},
|
||||
{},
|
||||
};
|
||||
|
||||
static struct bt_power_vreg_data bt_power_vreg_info[] = {
|
||||
{NULL, "qcom,bt-vdd-aon", 950000, 950000, 0, false, true},
|
||||
{NULL, "qcom,bt-vdd-dig", 950000, 952000, 0, false, true},
|
||||
{NULL, "qcom,bt-vdd-rfa1", 1900000, 1900000, 0, false, true},
|
||||
{NULL, "qcom,bt-vdd-rfa2", 1900000, 1900000, 0, false, true},
|
||||
{NULL, "qcom,bt-vdd-asd", 0, 0, 0, false, false},
|
||||
};
|
||||
|
||||
#define BT_VREG_INFO_SIZE ARRAY_SIZE(bt_power_vreg_info)
|
||||
|
||||
static int bt_power_vreg_get(struct platform_device *pdev);
|
||||
static int bt_power_vreg_set(enum bt_power_modes mode);
|
||||
static void bt_power_vreg_put(void);
|
||||
static int bt_dt_parse_chipset_info(struct device *dev);
|
||||
static int btpower_get_tcs_table_info(struct platform_device *plat_dev,
|
||||
struct bluetooth_power_platform_data *bt_power_pdata);
|
||||
static int btpower_enable_ipa_vreg(struct platform_device *plat_dev,
|
||||
struct bluetooth_power_platform_data *bt_power_pdata);
|
||||
|
||||
static int bt_power_src_status[BT_POWER_SRC_SIZE];
|
||||
static struct bluetooth_power_platform_data *bt_power_pdata;
|
||||
static struct platform_device *btpdev;
|
||||
static bool previous;
|
||||
@ -139,7 +218,7 @@ static int bt_vreg_disable(struct bt_power_vreg_data *vreg)
|
||||
if (!vreg)
|
||||
return rc;
|
||||
|
||||
pr_debug("vreg_disable for : %s\n", __func__, vreg->name);
|
||||
pr_debug("%s for : %s\n", __func__, vreg->name);
|
||||
|
||||
if (vreg->is_enabled) {
|
||||
rc = regulator_disable(vreg->reg);
|
||||
@ -218,8 +297,9 @@ static int bt_configure_gpios(int on)
|
||||
{
|
||||
int rc = 0;
|
||||
int bt_reset_gpio = bt_power_pdata->bt_gpio_sys_rst;
|
||||
|
||||
pr_debug("%s: bt_gpio= %d on: %d\n", __func__, bt_reset_gpio, on);
|
||||
int bt_sw_ctrl_gpio = bt_power_pdata->bt_gpio_sw_ctrl;
|
||||
int bt_debug_gpio = bt_power_pdata->bt_gpio_debug;
|
||||
int assert_dbg_gpio = 0;
|
||||
|
||||
if (on) {
|
||||
rc = gpio_request(bt_reset_gpio, "bt_sys_rst_n");
|
||||
@ -234,17 +314,75 @@ static int bt_configure_gpios(int on)
|
||||
pr_err("%s: Unable to set direction\n", __func__);
|
||||
return rc;
|
||||
}
|
||||
bt_power_src_status[BT_RESET_GPIO] =
|
||||
gpio_get_value(bt_reset_gpio);
|
||||
msleep(50);
|
||||
pr_info("BTON:Turn Bt Off bt-reset-gpio(%d) value(%d)\n",
|
||||
bt_reset_gpio, gpio_get_value(bt_reset_gpio));
|
||||
if (bt_sw_ctrl_gpio >= 0) {
|
||||
pr_info("BTON:Turn Bt Off\n");
|
||||
bt_power_src_status[BT_SW_CTRL_GPIO] =
|
||||
gpio_get_value(bt_sw_ctrl_gpio);
|
||||
pr_info("bt-sw-ctrl-gpio(%d) value(%d)\n",
|
||||
bt_sw_ctrl_gpio,
|
||||
bt_power_src_status[BT_SW_CTRL_GPIO]);
|
||||
}
|
||||
|
||||
rc = gpio_direction_output(bt_reset_gpio, 1);
|
||||
if (rc) {
|
||||
pr_err("%s: Unable to set direction\n", __func__);
|
||||
return rc;
|
||||
}
|
||||
bt_power_src_status[BT_RESET_GPIO] =
|
||||
gpio_get_value(bt_reset_gpio);
|
||||
msleep(50);
|
||||
/* Check if SW_CTRL is asserted */
|
||||
if (bt_sw_ctrl_gpio >= 0) {
|
||||
rc = gpio_direction_input(bt_sw_ctrl_gpio);
|
||||
if (rc) {
|
||||
pr_err("%s:SWCTRL Dir Set Problem:%d\n",
|
||||
__func__, rc);
|
||||
} else if (!gpio_get_value(bt_sw_ctrl_gpio)) {
|
||||
/* SW_CTRL not asserted, assert debug GPIO */
|
||||
if (bt_debug_gpio >= 0)
|
||||
assert_dbg_gpio = 1;
|
||||
}
|
||||
}
|
||||
if (assert_dbg_gpio) {
|
||||
rc = gpio_request(bt_debug_gpio, "bt_debug_n");
|
||||
if (rc) {
|
||||
pr_err("unable to request Debug Gpio\n");
|
||||
} else {
|
||||
rc = gpio_direction_output(bt_debug_gpio, 1);
|
||||
if (rc)
|
||||
pr_err("%s:Prob Set Debug-Gpio\n",
|
||||
__func__);
|
||||
}
|
||||
}
|
||||
pr_info("BTON:Turn Bt On bt-reset-gpio(%d) value(%d)\n",
|
||||
bt_reset_gpio, gpio_get_value(bt_reset_gpio));
|
||||
if (bt_sw_ctrl_gpio >= 0) {
|
||||
pr_info("BTON:Turn Bt On\n");
|
||||
bt_power_src_status[BT_SW_CTRL_GPIO] =
|
||||
gpio_get_value(bt_sw_ctrl_gpio);
|
||||
pr_info("bt-sw-ctrl-gpio(%d) value(%d)\n",
|
||||
bt_sw_ctrl_gpio,
|
||||
bt_power_src_status[BT_SW_CTRL_GPIO]);
|
||||
}
|
||||
} else {
|
||||
gpio_set_value(bt_reset_gpio, 0);
|
||||
msleep(100);
|
||||
pr_info("BT-OFF:bt-reset-gpio(%d) value(%d)\n",
|
||||
bt_reset_gpio, gpio_get_value(bt_reset_gpio));
|
||||
if (bt_sw_ctrl_gpio >= 0) {
|
||||
pr_info("BT-OFF:bt-sw-ctrl-gpio(%d) value(%d)\n",
|
||||
bt_sw_ctrl_gpio,
|
||||
gpio_get_value(bt_sw_ctrl_gpio));
|
||||
}
|
||||
}
|
||||
|
||||
pr_info("%s: bt_gpio= %d on: %d\n", __func__, bt_reset_gpio, on);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
@ -273,6 +411,10 @@ static int bluetooth_power(int on)
|
||||
}
|
||||
}
|
||||
if (bt_power_pdata->bt_gpio_sys_rst > 0) {
|
||||
bt_power_src_status[BT_RESET_GPIO] =
|
||||
DEFAULT_INVALID_VALUE;
|
||||
bt_power_src_status[BT_SW_CTRL_GPIO] =
|
||||
DEFAULT_INVALID_VALUE;
|
||||
rc = bt_configure_gpios(on);
|
||||
if (rc < 0) {
|
||||
pr_err("%s: bt_power gpio config failed\n",
|
||||
@ -287,6 +429,10 @@ static int bluetooth_power(int on)
|
||||
gpio_fail:
|
||||
if (bt_power_pdata->bt_gpio_sys_rst > 0)
|
||||
gpio_free(bt_power_pdata->bt_gpio_sys_rst);
|
||||
if (bt_power_pdata->bt_gpio_sw_ctrl > 0)
|
||||
gpio_free(bt_power_pdata->bt_gpio_sw_ctrl);
|
||||
if (bt_power_pdata->bt_gpio_debug > 0)
|
||||
gpio_free(bt_power_pdata->bt_gpio_debug);
|
||||
if (bt_power_pdata->bt_chip_clk)
|
||||
bt_clk_disable(bt_power_pdata->bt_chip_clk);
|
||||
clk_fail:
|
||||
@ -379,20 +525,29 @@ static void bluetooth_power_rfkill_remove(struct platform_device *pdev)
|
||||
|
||||
#define MAX_PROP_SIZE 32
|
||||
static int bt_dt_parse_vreg_info(struct device *dev,
|
||||
struct bt_power_vreg_data **vreg_data, const char *vreg_name)
|
||||
struct bt_power_vreg_data *vreg_data)
|
||||
{
|
||||
int len;
|
||||
int len, ret = 0;
|
||||
const __be32 *prop;
|
||||
char prop_name[MAX_PROP_SIZE];
|
||||
struct bt_power_vreg_data *vreg = *vreg_data;
|
||||
struct bt_power_vreg_data *vreg = vreg_data;
|
||||
struct device_node *np = dev->of_node;
|
||||
const char *vreg_name = vreg_data->name;
|
||||
|
||||
pr_debug("%s: vreg dev tree parse for %s\n", __func__, vreg_name);
|
||||
|
||||
snprintf(prop_name, sizeof(prop_name), "%s-supply", vreg_name);
|
||||
if (of_parse_phandle(np, prop_name, 0)) {
|
||||
snprintf(prop_name, sizeof(prop_name), "%s-config", vreg->name);
|
||||
vreg->reg = regulator_get(dev, vreg_name);
|
||||
if (IS_ERR(vreg->reg)) {
|
||||
ret = PTR_ERR(vreg->reg);
|
||||
vreg->reg = NULL;
|
||||
pr_warn("%s: failed to get: %s error:%d\n", __func__,
|
||||
vreg_name, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
snprintf(prop_name, sizeof(prop_name), "%s-config", vreg->name);
|
||||
prop = of_get_property(dev->of_node, prop_name, &len);
|
||||
if (!prop || len != (4 * sizeof(__be32))) {
|
||||
pr_debug("%s: Property %s %s, use default\n",
|
||||
@ -402,17 +557,18 @@ static int bt_dt_parse_vreg_info(struct device *dev,
|
||||
vreg->min_vol = be32_to_cpup(&prop[0]);
|
||||
vreg->max_vol = be32_to_cpup(&prop[1]);
|
||||
vreg->load_curr = be32_to_cpup(&prop[2]);
|
||||
vreg->is_retention_supp = be32_to_cpup(&prop[4]);
|
||||
vreg->is_retention_supp = be32_to_cpup(&prop[3]);
|
||||
}
|
||||
|
||||
pr_debug("%s: Got regulator: %s, min_vol: %u, max_vol: %u, load_curr: %u,is_retention_supp: %u\n",
|
||||
__func__, vreg->name, vreg->min_vol, vreg->max_vol,
|
||||
vreg->load_curr, vreg->is_retention_supp);
|
||||
} else
|
||||
pr_info("%s: %s is not provided in device tree\n",
|
||||
__func__, vreg_name);
|
||||
} else {
|
||||
pr_info("%s: %s is not provided in device tree\n", __func__,
|
||||
vreg_name);
|
||||
}
|
||||
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int bt_dt_parse_clk_info(struct device *dev,
|
||||
@ -462,89 +618,62 @@ static int bt_dt_parse_clk_info(struct device *dev,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int bt_dt_parse_chipset_info(struct device *dev)
|
||||
{
|
||||
int ret = -EINVAL;
|
||||
struct device_node *np = dev->of_node;
|
||||
|
||||
/* Allocated 32 byte size buffer for compatible string */
|
||||
bt_power_pdata->compatible_chipset_version = devm_kzalloc(dev,
|
||||
MAX_PROP_SIZE, GFP_KERNEL);
|
||||
if (bt_power_pdata->compatible_chipset_version == NULL) {
|
||||
ret = -ENOMEM;
|
||||
return ret;
|
||||
}
|
||||
ret = of_property_read_string(np, "compatible",
|
||||
&bt_power_pdata->compatible_chipset_version);
|
||||
if (ret < 0) {
|
||||
pr_err("%s: reading \"compatible\" failed\n",
|
||||
__func__);
|
||||
} else {
|
||||
pr_debug("%s: compatible =%s\n", __func__,
|
||||
bt_power_pdata->compatible_chipset_version);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int bt_power_vreg_get(struct platform_device *pdev)
|
||||
{
|
||||
struct bt_power_vreg_data *vreg_info;
|
||||
int i = 0, ret = 0;
|
||||
int num_vregs, i = 0, ret = 0;
|
||||
const struct bt_power *data;
|
||||
|
||||
bt_power_pdata->vreg_info =
|
||||
devm_kzalloc(&(pdev->dev),
|
||||
sizeof(bt_power_vreg_info),
|
||||
GFP_KERNEL);
|
||||
if (!bt_power_pdata->vreg_info) {
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
memcpy(bt_power_pdata->vreg_info, bt_power_vreg_info,
|
||||
sizeof(bt_power_vreg_info));
|
||||
|
||||
for (; i < BT_VREG_INFO_SIZE; i++) {
|
||||
vreg_info = &bt_power_pdata->vreg_info[i];
|
||||
ret = bt_dt_parse_vreg_info(&(pdev->dev), &vreg_info,
|
||||
vreg_info->name);
|
||||
data = of_device_get_match_data(&pdev->dev);
|
||||
if (!data) {
|
||||
pr_err("%s: failed to get dev node\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
memcpy(&bt_power_pdata->compatible, &data->compatible, MAX_PROP_SIZE);
|
||||
bt_power_pdata->vreg_info = data->vregs;
|
||||
num_vregs = bt_power_pdata->num_vregs = data->num_vregs;
|
||||
for (; i < num_vregs; i++) {
|
||||
ret = bt_dt_parse_vreg_info(&(pdev->dev),
|
||||
&bt_power_pdata->vreg_info[i]);
|
||||
/* No point to go further if failed to get regulator handler */
|
||||
if (ret)
|
||||
break;
|
||||
}
|
||||
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int bt_power_vreg_set(enum bt_power_modes mode)
|
||||
{
|
||||
int i = 0, ret = 0;
|
||||
int num_vregs, i = 0, ret = 0;
|
||||
int log_indx;
|
||||
struct bt_power_vreg_data *vreg_info = NULL;
|
||||
struct device *dev = &btpdev->dev;
|
||||
|
||||
num_vregs = bt_power_pdata->num_vregs;
|
||||
if (mode == BT_POWER_ENABLE) {
|
||||
for (; i < BT_VREG_INFO_SIZE; i++) {
|
||||
for (; i < num_vregs; i++) {
|
||||
vreg_info = &bt_power_pdata->vreg_info[i];
|
||||
|
||||
/* set vreg handle if not already set */
|
||||
if (!(vreg_info->reg)) {
|
||||
vreg_info->reg = regulator_get(dev,
|
||||
vreg_info->name);
|
||||
if (IS_ERR(vreg_info->reg)) {
|
||||
ret = PTR_ERR(vreg_info->reg);
|
||||
vreg_info->reg = NULL;
|
||||
pr_err("%s: regulator_get(%s) failed. rc=%d\n",
|
||||
__func__, vreg_info->name, ret);
|
||||
log_indx = vreg_info->indx.init;
|
||||
if (vreg_info->reg) {
|
||||
bt_power_src_status[log_indx] =
|
||||
DEFAULT_INVALID_VALUE;
|
||||
ret = bt_vreg_enable(vreg_info);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
if (vreg_info->is_enabled) {
|
||||
bt_power_src_status[log_indx] =
|
||||
regulator_get_voltage(
|
||||
vreg_info->reg);
|
||||
}
|
||||
}
|
||||
ret = bt_vreg_enable(vreg_info);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
}
|
||||
} else if (mode == BT_POWER_DISABLE) {
|
||||
for (; i < BT_VREG_INFO_SIZE; i++) {
|
||||
for (; i < num_vregs; i++) {
|
||||
vreg_info = &bt_power_pdata->vreg_info[i];
|
||||
ret = bt_vreg_disable(vreg_info);
|
||||
}
|
||||
} else if (mode == BT_POWER_RETENTION) {
|
||||
for (; i < BT_VREG_INFO_SIZE; i++) {
|
||||
for (; i < num_vregs; i++) {
|
||||
vreg_info = &bt_power_pdata->vreg_info[i];
|
||||
ret = bt_vreg_enable_retention(vreg_info);
|
||||
}
|
||||
@ -561,8 +690,9 @@ static void bt_power_vreg_put(void)
|
||||
{
|
||||
int i = 0;
|
||||
struct bt_power_vreg_data *vreg_info = NULL;
|
||||
int num_vregs = bt_power_pdata->num_vregs;
|
||||
|
||||
for (; i < BT_VREG_INFO_SIZE; i++) {
|
||||
for (; i < num_vregs; i++) {
|
||||
vreg_info = &bt_power_pdata->vreg_info[i];
|
||||
if (vreg_info->reg)
|
||||
regulator_put(vreg_info->reg);
|
||||
@ -580,23 +710,32 @@ static int bt_power_populate_dt_pinfo(struct platform_device *pdev)
|
||||
return -ENOMEM;
|
||||
|
||||
if (pdev->dev.of_node) {
|
||||
bt_power_vreg_get(pdev);
|
||||
rc = bt_power_vreg_get(pdev);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
bt_power_pdata->bt_gpio_sys_rst =
|
||||
of_get_named_gpio(pdev->dev.of_node,
|
||||
"qcom,bt-reset-gpio", 0);
|
||||
if (bt_power_pdata->bt_gpio_sys_rst < 0)
|
||||
pr_err("%s: bt-reset-gpio not provided in device tree\n",
|
||||
__func__);
|
||||
pr_warn("bt-reset-gpio not provided in devicetree\n");
|
||||
|
||||
bt_power_pdata->bt_gpio_sw_ctrl =
|
||||
of_get_named_gpio(pdev->dev.of_node,
|
||||
"qcom,bt-sw-ctrl-gpio", 0);
|
||||
if (bt_power_pdata->bt_gpio_sw_ctrl < 0)
|
||||
pr_warn("bt-sw-ctrl-gpio not provided in devicetree\n");
|
||||
|
||||
bt_power_pdata->bt_gpio_debug =
|
||||
of_get_named_gpio(pdev->dev.of_node,
|
||||
"qcom,bt-debug-gpio", 0);
|
||||
if (bt_power_pdata->bt_gpio_debug < 0)
|
||||
pr_warn("bt-debug-gpio not provided in devicetree\n");
|
||||
|
||||
rc = bt_dt_parse_clk_info(&pdev->dev,
|
||||
&bt_power_pdata->bt_chip_clk);
|
||||
if (rc < 0)
|
||||
pr_err("%s: clock not provided in device tree\n",
|
||||
__func__);
|
||||
rc = bt_dt_parse_chipset_info(&pdev->dev);
|
||||
if (rc < 0)
|
||||
pr_err("%s: compatible not provided in device tree\n",
|
||||
pr_warn("%s: clock not provided in device tree\n",
|
||||
__func__);
|
||||
}
|
||||
|
||||
@ -608,9 +747,17 @@ static int bt_power_populate_dt_pinfo(struct platform_device *pdev)
|
||||
static int bt_power_probe(struct platform_device *pdev)
|
||||
{
|
||||
int ret = 0;
|
||||
int itr;
|
||||
|
||||
pr_debug("%s\n", __func__);
|
||||
|
||||
/* Fill whole array with -2 i.e NOT_AVAILABLE state by default
|
||||
* for any GPIO or Reg handle.
|
||||
*/
|
||||
for (itr = PWR_SRC_INIT_STATE_IDX;
|
||||
itr < BT_POWER_SRC_SIZE; ++itr)
|
||||
bt_power_src_status[itr] = PWR_SRC_NOT_AVAILABLE;
|
||||
|
||||
bt_power_pdata = kzalloc(sizeof(*bt_power_pdata), GFP_KERNEL);
|
||||
|
||||
if (!bt_power_pdata)
|
||||
@ -644,6 +791,8 @@ static int bt_power_probe(struct platform_device *pdev)
|
||||
goto free_pdata;
|
||||
|
||||
btpdev = pdev;
|
||||
if (btpower_get_tcs_table_info(pdev, bt_power_pdata) < 0)
|
||||
pr_err("%s: Failed to get TCS table info\n", __func__);
|
||||
|
||||
return 0;
|
||||
|
||||
@ -683,10 +832,50 @@ int btpower_get_chipset_version(void)
|
||||
}
|
||||
EXPORT_SYMBOL(btpower_get_chipset_version);
|
||||
|
||||
static void set_pwr_srcs_status(struct bt_power_vreg_data *handle)
|
||||
{
|
||||
int ldo_index;
|
||||
|
||||
if (handle) {
|
||||
ldo_index = handle->indx.crash;
|
||||
bt_power_src_status[ldo_index] =
|
||||
DEFAULT_INVALID_VALUE;
|
||||
if (handle->is_enabled &&
|
||||
(regulator_is_enabled(handle->reg))) {
|
||||
bt_power_src_status[ldo_index] =
|
||||
(int)regulator_get_voltage(handle->reg);
|
||||
pr_err("%s(%d) value(%d)\n", handle->name,
|
||||
handle, bt_power_src_status[ldo_index]);
|
||||
} else {
|
||||
pr_err("%s:%s is_enabled: %d\n",
|
||||
__func__, handle->name,
|
||||
handle->is_enabled);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void set_gpios_srcs_status(char *gpio_name,
|
||||
int gpio_index, int handle)
|
||||
{
|
||||
if (handle >= 0) {
|
||||
bt_power_src_status[gpio_index] =
|
||||
DEFAULT_INVALID_VALUE;
|
||||
bt_power_src_status[gpio_index] =
|
||||
gpio_get_value(handle);
|
||||
pr_err("%s(%d) value(%d)\n", gpio_name,
|
||||
handle, bt_power_src_status[gpio_index]);
|
||||
} else {
|
||||
pr_err("%s: %s not configured\n",
|
||||
__func__, gpio_name);
|
||||
}
|
||||
}
|
||||
|
||||
static long bt_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
int ret = 0, pwr_cntrl = 0;
|
||||
int chipset_version = 0;
|
||||
int itr, num_vregs;
|
||||
struct bt_power_vreg_data *vreg_info = NULL;
|
||||
|
||||
switch (cmd) {
|
||||
case BT_CMD_SLIM_TEST:
|
||||
@ -704,7 +893,7 @@ static long bt_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
break;
|
||||
case BT_CMD_PWR_CTRL:
|
||||
pwr_cntrl = (int)arg;
|
||||
pr_err("%s: BT_CMD_PWR_CTRL pwr_cntrl: %d\n",
|
||||
pr_warn("%s: BT_CMD_PWR_CTRL pwr_cntrl: %d\n",
|
||||
__func__, pwr_cntrl);
|
||||
if (pwr_state != pwr_cntrl) {
|
||||
ret = bluetooth_power(pwr_cntrl);
|
||||
@ -718,8 +907,8 @@ static long bt_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
break;
|
||||
case BT_CMD_CHIPSET_VERS:
|
||||
chipset_version = (int)arg;
|
||||
pr_err("%s: BT_CMD_CHIP_VERS soc_version:%x\n", __func__,
|
||||
chipset_version);
|
||||
pr_warn("%s: unified Current SOC Version : %x\n", __func__,
|
||||
chipset_version);
|
||||
if (chipset_version) {
|
||||
soc_id = chipset_version;
|
||||
} else {
|
||||
@ -728,18 +917,60 @@ static long bt_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
}
|
||||
break;
|
||||
case BT_CMD_GET_CHIPSET_ID:
|
||||
if (bt_power_pdata->compatible_chipset_version) {
|
||||
if (copy_to_user((void __user *)arg,
|
||||
bt_power_pdata->compatible_chipset_version,
|
||||
MAX_PROP_SIZE)) {
|
||||
pr_err("%s: copy to user failed\n", __func__);
|
||||
ret = -EFAULT;
|
||||
if (copy_to_user((void __user *)arg, bt_power_pdata->compatible,
|
||||
MAX_PROP_SIZE)) {
|
||||
pr_err("%s: copy to user failed\n", __func__);
|
||||
ret = -EFAULT;
|
||||
}
|
||||
break;
|
||||
case BT_CMD_CHECK_SW_CTRL:
|
||||
/* Check if SW_CTRL is asserted */
|
||||
pr_info("BT_CMD_CHECK_SW_CTRL\n");
|
||||
if (bt_power_pdata->bt_gpio_sw_ctrl > 0) {
|
||||
bt_power_src_status[BT_SW_CTRL_GPIO] =
|
||||
DEFAULT_INVALID_VALUE;
|
||||
ret = gpio_direction_input(
|
||||
bt_power_pdata->bt_gpio_sw_ctrl);
|
||||
if (ret) {
|
||||
pr_err("%s:gpio_direction_input api\n",
|
||||
__func__);
|
||||
pr_err("%s:failed for SW_CTRL:%d\n",
|
||||
__func__, ret);
|
||||
} else {
|
||||
bt_power_src_status[BT_SW_CTRL_GPIO] =
|
||||
gpio_get_value(
|
||||
bt_power_pdata->bt_gpio_sw_ctrl);
|
||||
pr_info("bt-sw-ctrl-gpio(%d) value(%d)\n",
|
||||
bt_power_pdata->bt_gpio_sw_ctrl,
|
||||
bt_power_src_status[BT_SW_CTRL_GPIO]);
|
||||
}
|
||||
} else {
|
||||
pr_err("%s: compatible string not valid\n", __func__);
|
||||
ret = -EINVAL;
|
||||
pr_err("bt_gpio_sw_ctrl not configured\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
break;
|
||||
case BT_CMD_GETVAL_POWER_SRCS:
|
||||
pr_err("BT_CMD_GETVAL_POWER_SRCS\n");
|
||||
set_gpios_srcs_status("BT_RESET_GPIO", BT_RESET_GPIO_CURRENT,
|
||||
bt_power_pdata->bt_gpio_sys_rst);
|
||||
set_gpios_srcs_status("SW_CTRL_GPIO", BT_SW_CTRL_GPIO_CURRENT,
|
||||
bt_power_pdata->bt_gpio_sw_ctrl);
|
||||
|
||||
num_vregs = bt_power_pdata->num_vregs;
|
||||
for (itr = 0; itr < num_vregs; itr++) {
|
||||
vreg_info = &bt_power_pdata->vreg_info[itr];
|
||||
set_pwr_srcs_status(vreg_info);
|
||||
}
|
||||
if (copy_to_user((void __user *)arg,
|
||||
bt_power_src_status, sizeof(bt_power_src_status))) {
|
||||
pr_err("%s: copy to user failed\n", __func__);
|
||||
ret = -EFAULT;
|
||||
}
|
||||
break;
|
||||
case BT_CMD_SET_IPA_TCS_INFO:
|
||||
pr_err("%s: BT_CMD_SET_IPA_TCS_INFO\n", __func__);
|
||||
btpower_enable_ipa_vreg(btpdev, bt_power_pdata);
|
||||
break;
|
||||
default:
|
||||
return -ENOIOCTLCMD;
|
||||
}
|
||||
@ -803,6 +1034,78 @@ static int __init bluetooth_power_init(void)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int btpower_get_tcs_table_info(struct platform_device *dev,
|
||||
struct bluetooth_power_platform_data *bt_power_pdata)
|
||||
{
|
||||
struct platform_device *plat_dev = dev;
|
||||
struct btpower_tcs_table_info *tcs_table_info =
|
||||
&bt_power_pdata->tcs_table_info;
|
||||
struct resource *res;
|
||||
resource_size_t addr_len;
|
||||
void __iomem *tcs_cmd_base_addr;
|
||||
int ret = -1;
|
||||
|
||||
res = platform_get_resource_byname(plat_dev, IORESOURCE_MEM, "tcs_cmd");
|
||||
if (!res) {
|
||||
pr_err("No TCS CMD entry found in DTSI\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
tcs_table_info->tcs_cmd_base_addr = res->start;
|
||||
addr_len = resource_size(res);
|
||||
pr_info("TCS CMD base address is %pa with length %pa\n",
|
||||
&tcs_table_info->tcs_cmd_base_addr, &addr_len);
|
||||
|
||||
tcs_cmd_base_addr = devm_ioremap_resource(&plat_dev->dev, res);
|
||||
if (IS_ERR(tcs_cmd_base_addr)) {
|
||||
ret = PTR_ERR(tcs_cmd_base_addr);
|
||||
pr_err("Failed to map TCS CMD address, err = %d\n",
|
||||
ret);
|
||||
goto out;
|
||||
}
|
||||
|
||||
tcs_table_info->tcs_cmd_base_addr_io = tcs_cmd_base_addr;
|
||||
|
||||
return 0;
|
||||
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int btpower_enable_ipa_vreg(struct platform_device *dev,
|
||||
struct bluetooth_power_platform_data *bt_power_pdata)
|
||||
{
|
||||
struct platform_device *plat_dev = dev;
|
||||
struct btpower_tcs_table_info *tcs_table_info =
|
||||
&bt_power_pdata->tcs_table_info;
|
||||
u32 offset, addr_val, data_val;
|
||||
void __iomem *tcs_cmd;
|
||||
int ret = 0;
|
||||
|
||||
if (!tcs_table_info->tcs_cmd_base_addr_io) {
|
||||
pr_err("TCS command not configured\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ret = of_property_read_u32(plat_dev->dev.of_node,
|
||||
"qcom,tcs_offset_ipa",
|
||||
&offset);
|
||||
if (ret) {
|
||||
pr_err("iPA failed to configure\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
tcs_cmd = tcs_table_info->tcs_cmd_base_addr_io + offset;
|
||||
addr_val = readl_relaxed(tcs_cmd);
|
||||
tcs_cmd += TCS_CMD_IO_ADDR_OFFSET;
|
||||
|
||||
writel_relaxed(1, tcs_cmd);
|
||||
|
||||
data_val = readl_relaxed(tcs_cmd);
|
||||
pr_info("Configure S3E TCS Addr : %x with Data: %d\n"
|
||||
, addr_val, data_val);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __exit bluetooth_power_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&bt_power_driver);
|
||||
|
@ -40,16 +40,18 @@ struct arch_info {
|
||||
#define DLOG "Dev->Host: "
|
||||
#define HLOG "Host: "
|
||||
|
||||
#define MHI_TSYNC_LOG_PAGES (10)
|
||||
#define MHI_TSYNC_LOG_PAGES (2)
|
||||
|
||||
#ifdef CONFIG_MHI_DEBUG
|
||||
|
||||
#define MHI_IPC_LOG_PAGES (100)
|
||||
#define MHI_CNTRL_LOG_PAGES (25)
|
||||
enum MHI_DEBUG_LEVEL mhi_ipc_log_lvl = MHI_MSG_LVL_VERBOSE;
|
||||
|
||||
#else
|
||||
|
||||
#define MHI_IPC_LOG_PAGES (10)
|
||||
#define MHI_CNTRL_LOG_PAGES (5)
|
||||
enum MHI_DEBUG_LEVEL mhi_ipc_log_lvl = MHI_MSG_LVL_ERROR;
|
||||
|
||||
#endif
|
||||
@ -146,7 +148,7 @@ static void mhi_arch_pci_link_state_cb(struct msm_pcie_notify *notify)
|
||||
|
||||
switch (notify->event) {
|
||||
case MSM_PCIE_EVENT_WAKEUP:
|
||||
MHI_LOG("Received MSM_PCIE_EVENT_WAKE signal\n");
|
||||
MHI_CNTRL_LOG("Received PCIE_WAKE signal\n");
|
||||
|
||||
/* bring link out of d3cold */
|
||||
if (mhi_dev->powered_on) {
|
||||
@ -155,14 +157,14 @@ static void mhi_arch_pci_link_state_cb(struct msm_pcie_notify *notify)
|
||||
}
|
||||
break;
|
||||
case MSM_PCIE_EVENT_L1SS_TIMEOUT:
|
||||
MHI_VERB("Received MSM_PCIE_EVENT_L1SS_TIMEOUT signal\n");
|
||||
MHI_VERB("Received PCIE_L1SS_TIMEOUT signal\n");
|
||||
|
||||
pm_runtime_mark_last_busy(&pci_dev->dev);
|
||||
pm_request_autosuspend(&pci_dev->dev);
|
||||
break;
|
||||
case MSM_PCIE_EVENT_DRV_CONNECT:
|
||||
/* drv is connected we can suspend now */
|
||||
MHI_LOG("Received MSM_PCIE_EVENT_DRV_CONNECT signal\n");
|
||||
MHI_CNTRL_LOG("Received DRV_CONNECT signal\n");
|
||||
|
||||
arch_info->drv_connected = true;
|
||||
|
||||
@ -177,7 +179,7 @@ static void mhi_arch_pci_link_state_cb(struct msm_pcie_notify *notify)
|
||||
mutex_unlock(&mhi_cntrl->pm_mutex);
|
||||
break;
|
||||
case MSM_PCIE_EVENT_DRV_DISCONNECT:
|
||||
MHI_LOG("Received MSM_PCIE_EVENT_DRV_DISCONNECT signal\n");
|
||||
MHI_CNTRL_LOG("Received DRV_DISCONNECT signal\n");
|
||||
|
||||
/*
|
||||
* if link suspended bring it out of suspend and disable runtime
|
||||
@ -187,7 +189,7 @@ static void mhi_arch_pci_link_state_cb(struct msm_pcie_notify *notify)
|
||||
pm_runtime_forbid(&pci_dev->dev);
|
||||
break;
|
||||
default:
|
||||
MHI_ERR("Unhandled event 0x%x\n", notify->event);
|
||||
MHI_CNTRL_LOG("Unhandled event 0x%x\n", notify->event);
|
||||
}
|
||||
}
|
||||
|
||||
@ -200,12 +202,12 @@ static int mhi_arch_esoc_ops_power_on(void *priv, unsigned int flags)
|
||||
|
||||
mutex_lock(&mhi_cntrl->pm_mutex);
|
||||
if (mhi_dev->powered_on) {
|
||||
MHI_LOG("MHI still in active state\n");
|
||||
MHI_CNTRL_LOG("MHI still in active state\n");
|
||||
mutex_unlock(&mhi_cntrl->pm_mutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
MHI_LOG("Enter: mdm_crashed:%d\n", flags & ESOC_HOOK_MDM_CRASH);
|
||||
MHI_CNTRL_LOG("Enter: mdm_crashed:%d\n", flags & ESOC_HOOK_MDM_CRASH);
|
||||
|
||||
/* reset rpm state */
|
||||
pm_runtime_set_active(&pci_dev->dev);
|
||||
@ -214,7 +216,7 @@ static int mhi_arch_esoc_ops_power_on(void *priv, unsigned int flags)
|
||||
pm_runtime_forbid(&pci_dev->dev);
|
||||
ret = pm_runtime_get_sync(&pci_dev->dev);
|
||||
if (ret < 0) {
|
||||
MHI_ERR("Error with rpm resume, ret:%d\n", ret);
|
||||
MHI_CNTRL_ERR("Error with rpm resume, ret:%d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -222,7 +224,7 @@ static int mhi_arch_esoc_ops_power_on(void *priv, unsigned int flags)
|
||||
ret = msm_pcie_pm_control(MSM_PCIE_RESUME, pci_dev->bus->number,
|
||||
pci_dev, NULL, 0);
|
||||
if (ret) {
|
||||
MHI_ERR("Failed to resume pcie bus ret %d\n", ret);
|
||||
MHI_CNTRL_ERR("Failed to resume pcie bus ret %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -234,7 +236,7 @@ static void mhi_arch_link_off(struct mhi_controller *mhi_cntrl)
|
||||
struct mhi_dev *mhi_dev = mhi_controller_get_devdata(mhi_cntrl);
|
||||
struct pci_dev *pci_dev = mhi_dev->pci_dev;
|
||||
|
||||
MHI_LOG("Entered\n");
|
||||
MHI_CNTRL_LOG("Entered\n");
|
||||
|
||||
pci_set_power_state(pci_dev, PCI_D3hot);
|
||||
|
||||
@ -242,7 +244,7 @@ static void mhi_arch_link_off(struct mhi_controller *mhi_cntrl)
|
||||
msm_pcie_pm_control(MSM_PCIE_SUSPEND, mhi_cntrl->bus, pci_dev, NULL, 0);
|
||||
mhi_arch_set_bus_request(mhi_cntrl, 0);
|
||||
|
||||
MHI_LOG("Exited\n");
|
||||
MHI_CNTRL_LOG("Exited\n");
|
||||
}
|
||||
|
||||
static void mhi_arch_esoc_ops_power_off(void *priv, unsigned int flags)
|
||||
@ -253,7 +255,7 @@ static void mhi_arch_esoc_ops_power_off(void *priv, unsigned int flags)
|
||||
struct pci_dev *pci_dev = mhi_dev->pci_dev;
|
||||
bool mdm_state = (flags & ESOC_HOOK_MDM_CRASH);
|
||||
|
||||
MHI_LOG("Enter: mdm_crashed:%d\n", mdm_state);
|
||||
MHI_CNTRL_LOG("Enter: mdm_crashed:%d\n", mdm_state);
|
||||
|
||||
/*
|
||||
* Abort system suspend if system is preparing to go to suspend
|
||||
@ -269,7 +271,7 @@ static void mhi_arch_esoc_ops_power_off(void *priv, unsigned int flags)
|
||||
|
||||
mutex_lock(&mhi_cntrl->pm_mutex);
|
||||
if (!mhi_dev->powered_on) {
|
||||
MHI_LOG("Not in active state\n");
|
||||
MHI_CNTRL_LOG("Not in active state\n");
|
||||
mutex_unlock(&mhi_cntrl->pm_mutex);
|
||||
pm_runtime_put_noidle(&pci_dev->dev);
|
||||
return;
|
||||
@ -279,7 +281,7 @@ static void mhi_arch_esoc_ops_power_off(void *priv, unsigned int flags)
|
||||
|
||||
pm_runtime_put_noidle(&pci_dev->dev);
|
||||
|
||||
MHI_LOG("Triggering shutdown process\n");
|
||||
MHI_CNTRL_LOG("Triggering shutdown process\n");
|
||||
mhi_power_down(mhi_cntrl, !mdm_state);
|
||||
|
||||
/* turn the link off */
|
||||
@ -296,12 +298,10 @@ static void mhi_arch_esoc_ops_mdm_error(void *priv)
|
||||
{
|
||||
struct mhi_controller *mhi_cntrl = priv;
|
||||
|
||||
MHI_LOG("Enter: mdm asserted\n");
|
||||
MHI_CNTRL_LOG("Enter: mdm asserted\n");
|
||||
|
||||
/* transition MHI state into error state */
|
||||
mhi_control_error(mhi_cntrl);
|
||||
|
||||
MHI_LOG("Exit\n");
|
||||
}
|
||||
|
||||
static void mhi_bl_dl_cb(struct mhi_device *mhi_device,
|
||||
@ -378,8 +378,9 @@ static int mhi_arch_pcie_scale_bw(struct mhi_controller *mhi_cntrl,
|
||||
/* do a bus scale vote based on gen speeds */
|
||||
mhi_arch_set_bus_request(mhi_cntrl, link_info->target_link_speed);
|
||||
|
||||
MHI_VERB("bw changed to speed:0x%x width:0x%x\n",
|
||||
link_info->target_link_speed, link_info->target_link_width);
|
||||
MHI_LOG("BW changed to speed:0x%x width:0x%x\n",
|
||||
link_info->target_link_speed,
|
||||
link_info->target_link_width);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -406,7 +407,7 @@ static int mhi_bl_probe(struct mhi_device *mhi_device,
|
||||
mhi_device->slot);
|
||||
|
||||
arch_info->boot_dev = mhi_device;
|
||||
arch_info->boot_ipc_log = ipc_log_context_create(MHI_IPC_LOG_PAGES,
|
||||
arch_info->boot_ipc_log = ipc_log_context_create(MHI_CNTRL_LOG_PAGES,
|
||||
node_name, 0);
|
||||
ipc_log_string(arch_info->boot_ipc_log, HLOG
|
||||
"Entered SBL, Session ID:0x%x\n", mhi_cntrl->session_id);
|
||||
@ -461,6 +462,12 @@ int mhi_arch_pcie_init(struct mhi_controller *mhi_cntrl)
|
||||
node, 0);
|
||||
mhi_cntrl->log_lvl = mhi_ipc_log_lvl;
|
||||
|
||||
snprintf(node, sizeof(node), "mhi_cntrl_%04x_%02u.%02u.%02u",
|
||||
mhi_cntrl->dev_id, mhi_cntrl->domain, mhi_cntrl->bus,
|
||||
mhi_cntrl->slot);
|
||||
mhi_cntrl->cntrl_log_buf = ipc_log_context_create(
|
||||
MHI_CNTRL_LOG_PAGES, node, 0);
|
||||
|
||||
snprintf(node, sizeof(node), "mhi_tsync_%04x_%02u.%02u.%02u",
|
||||
mhi_cntrl->dev_id, mhi_cntrl->domain, mhi_cntrl->bus,
|
||||
mhi_cntrl->slot);
|
||||
@ -516,7 +523,8 @@ int mhi_arch_pcie_init(struct mhi_controller *mhi_cntrl)
|
||||
reg_event->notify.data = mhi_cntrl;
|
||||
ret = msm_pcie_register_event(reg_event);
|
||||
if (ret)
|
||||
MHI_LOG("Failed to reg. for link up notification\n");
|
||||
MHI_CNTRL_ERR(
|
||||
"Failed to reg. for link up notification\n");
|
||||
|
||||
init_completion(&arch_info->pm_completion);
|
||||
|
||||
@ -533,7 +541,7 @@ int mhi_arch_pcie_init(struct mhi_controller *mhi_cntrl)
|
||||
arch_info->esoc_client = devm_register_esoc_client(
|
||||
&mhi_dev->pci_dev->dev, "mdm");
|
||||
if (IS_ERR_OR_NULL(arch_info->esoc_client)) {
|
||||
MHI_ERR("Failed to register esoc client\n");
|
||||
MHI_CNTRL_ERR("Failed to register esoc client\n");
|
||||
} else {
|
||||
/* register for power on/off hooks */
|
||||
struct esoc_client_hook *esoc_ops =
|
||||
@ -551,7 +559,7 @@ int mhi_arch_pcie_init(struct mhi_controller *mhi_cntrl)
|
||||
ret = esoc_register_client_hook(arch_info->esoc_client,
|
||||
esoc_ops);
|
||||
if (ret)
|
||||
MHI_ERR("Failed to register esoc ops\n");
|
||||
MHI_CNTRL_ERR("Failed to register esoc ops\n");
|
||||
}
|
||||
|
||||
/*
|
||||
@ -602,7 +610,7 @@ static int mhi_arch_drv_suspend(struct mhi_controller *mhi_cntrl)
|
||||
link_info.target_link_width = cur_link_info->target_link_width;
|
||||
ret = mhi_arch_pcie_scale_bw(mhi_cntrl, pci_dev, &link_info);
|
||||
if (ret) {
|
||||
MHI_ERR("Failed to switch Gen1 speed\n");
|
||||
MHI_CNTRL_ERR("Failed to switch Gen1 speed\n");
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
@ -632,7 +640,8 @@ int mhi_arch_link_suspend(struct mhi_controller *mhi_cntrl)
|
||||
struct pci_dev *pci_dev = mhi_dev->pci_dev;
|
||||
int ret = 0;
|
||||
|
||||
MHI_LOG("Entered\n");
|
||||
MHI_LOG("Entered with suspend_mode:%s\n",
|
||||
TO_MHI_SUSPEND_MODE_STR(mhi_dev->suspend_mode));
|
||||
|
||||
/* disable inactivity timer */
|
||||
msm_pcie_l1ss_timeout_disable(pci_dev);
|
||||
@ -642,7 +651,8 @@ int mhi_arch_link_suspend(struct mhi_controller *mhi_cntrl)
|
||||
pci_clear_master(pci_dev);
|
||||
ret = pci_save_state(mhi_dev->pci_dev);
|
||||
if (ret) {
|
||||
MHI_ERR("Failed with pci_save_state, ret:%d\n", ret);
|
||||
MHI_CNTRL_ERR("Failed with pci_save_state, ret:%d\n",
|
||||
ret);
|
||||
goto exit_suspend;
|
||||
}
|
||||
|
||||
@ -661,6 +671,7 @@ int mhi_arch_link_suspend(struct mhi_controller *mhi_cntrl)
|
||||
break;
|
||||
case MHI_ACTIVE_STATE:
|
||||
case MHI_FAST_LINK_ON:/* keeping link on do nothing */
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
@ -681,8 +692,6 @@ static int __mhi_arch_link_resume(struct mhi_controller *mhi_cntrl)
|
||||
struct mhi_link_info *cur_info = &mhi_cntrl->mhi_link_info;
|
||||
int ret;
|
||||
|
||||
MHI_LOG("Entered\n");
|
||||
|
||||
/* request bus scale voting based on higher gen speed */
|
||||
ret = mhi_arch_set_bus_request(mhi_cntrl,
|
||||
cur_info->target_link_speed);
|
||||
@ -725,7 +734,8 @@ int mhi_arch_link_resume(struct mhi_controller *mhi_cntrl)
|
||||
struct mhi_link_info *cur_info = &mhi_cntrl->mhi_link_info;
|
||||
int ret = 0;
|
||||
|
||||
MHI_LOG("Entered\n");
|
||||
MHI_LOG("Entered with suspend_mode:%s\n",
|
||||
TO_MHI_SUSPEND_MODE_STR(mhi_dev->suspend_mode));
|
||||
|
||||
switch (mhi_dev->suspend_mode) {
|
||||
case MHI_DEFAULT_SUSPEND:
|
||||
@ -743,26 +753,23 @@ int mhi_arch_link_resume(struct mhi_controller *mhi_cntrl)
|
||||
* only print an error here.
|
||||
*/
|
||||
if (mhi_arch_pcie_scale_bw(mhi_cntrl, pci_dev, cur_info))
|
||||
MHI_ERR(
|
||||
MHI_CNTRL_ERR(
|
||||
"Failed to honor bw request: speed:0x%x width:0x%x\n",
|
||||
cur_info->target_link_speed,
|
||||
cur_info->target_link_width);
|
||||
break;
|
||||
case MHI_ACTIVE_STATE:
|
||||
case MHI_FAST_LINK_ON:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (ret) {
|
||||
MHI_ERR("Link training failed, ret:%d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
if (!ret)
|
||||
msm_pcie_l1ss_timeout_enable(pci_dev);
|
||||
|
||||
msm_pcie_l1ss_timeout_enable(pci_dev);
|
||||
MHI_LOG("Exited with ret:%d\n", ret);
|
||||
|
||||
MHI_LOG("Exited\n");
|
||||
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
int mhi_arch_link_lpm_disable(struct mhi_controller *mhi_cntrl)
|
||||
|
@ -33,12 +33,19 @@ static const struct firmware_info firmware_table[] = {
|
||||
|
||||
static int debug_mode;
|
||||
|
||||
const char * const mhi_suspend_mode_str[MHI_SUSPEND_MODE_MAX] = {
|
||||
[MHI_ACTIVE_STATE] = "Active",
|
||||
[MHI_DEFAULT_SUSPEND] = "Default",
|
||||
[MHI_FAST_LINK_OFF] = "Fast Link Off",
|
||||
[MHI_FAST_LINK_ON] = "Fast Link On",
|
||||
};
|
||||
|
||||
int mhi_debugfs_trigger_m0(void *data, u64 val)
|
||||
{
|
||||
struct mhi_controller *mhi_cntrl = data;
|
||||
struct mhi_dev *mhi_dev = mhi_controller_get_devdata(mhi_cntrl);
|
||||
|
||||
MHI_LOG("Trigger M3 Exit\n");
|
||||
MHI_CNTRL_LOG("Trigger M3 Exit\n");
|
||||
pm_runtime_get(&mhi_dev->pci_dev->dev);
|
||||
pm_runtime_put(&mhi_dev->pci_dev->dev);
|
||||
|
||||
@ -52,7 +59,7 @@ int mhi_debugfs_trigger_m3(void *data, u64 val)
|
||||
struct mhi_controller *mhi_cntrl = data;
|
||||
struct mhi_dev *mhi_dev = mhi_controller_get_devdata(mhi_cntrl);
|
||||
|
||||
MHI_LOG("Trigger M3 Entry\n");
|
||||
MHI_CNTRL_LOG("Trigger M3 Entry\n");
|
||||
pm_runtime_mark_last_busy(&mhi_dev->pci_dev->dev);
|
||||
pm_request_autosuspend(&mhi_dev->pci_dev->dev);
|
||||
|
||||
@ -91,19 +98,19 @@ static int mhi_init_pci_dev(struct mhi_controller *mhi_cntrl)
|
||||
mhi_dev->resn = MHI_PCI_BAR_NUM;
|
||||
ret = pci_assign_resource(pci_dev, mhi_dev->resn);
|
||||
if (ret) {
|
||||
MHI_ERR("Error assign pci resources, ret:%d\n", ret);
|
||||
MHI_CNTRL_ERR("Error assign pci resources, ret:%d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = pci_enable_device(pci_dev);
|
||||
if (ret) {
|
||||
MHI_ERR("Error enabling device, ret:%d\n", ret);
|
||||
MHI_CNTRL_ERR("Error enabling device, ret:%d\n", ret);
|
||||
goto error_enable_device;
|
||||
}
|
||||
|
||||
ret = pci_request_region(pci_dev, mhi_dev->resn, "mhi");
|
||||
if (ret) {
|
||||
MHI_ERR("Error pci_request_region, ret:%d\n", ret);
|
||||
MHI_CNTRL_ERR("Error pci_request_region, ret:%d\n", ret);
|
||||
goto error_request_region;
|
||||
}
|
||||
|
||||
@ -113,14 +120,15 @@ static int mhi_init_pci_dev(struct mhi_controller *mhi_cntrl)
|
||||
len = pci_resource_len(pci_dev, mhi_dev->resn);
|
||||
mhi_cntrl->regs = ioremap(mhi_cntrl->base_addr, len);
|
||||
if (!mhi_cntrl->regs) {
|
||||
MHI_ERR("Error ioremap region\n");
|
||||
MHI_CNTRL_ERR("Error ioremap region\n");
|
||||
goto error_ioremap;
|
||||
}
|
||||
mhi_cntrl->len = len;
|
||||
|
||||
ret = pci_alloc_irq_vectors(pci_dev, mhi_cntrl->msi_required,
|
||||
mhi_cntrl->msi_required, PCI_IRQ_MSI);
|
||||
if (IS_ERR_VALUE((ulong)ret) || ret < mhi_cntrl->msi_required) {
|
||||
MHI_ERR("Failed to enable MSI, ret:%d\n", ret);
|
||||
MHI_CNTRL_ERR("Failed to enable MSI, ret:%d\n", ret);
|
||||
goto error_req_msi;
|
||||
}
|
||||
|
||||
@ -394,7 +402,12 @@ static int mhi_force_suspend(struct mhi_controller *mhi_cntrl)
|
||||
struct mhi_dev *mhi_dev = mhi_controller_get_devdata(mhi_cntrl);
|
||||
int itr = DIV_ROUND_UP(mhi_cntrl->timeout_ms, delayms);
|
||||
|
||||
MHI_LOG("Entered\n");
|
||||
MHI_CNTRL_LOG("Entered\n");
|
||||
|
||||
if (debug_mode == MHI_DEBUG_NO_D3 || debug_mode == MHI_FWIMAGE_NO_D3) {
|
||||
MHI_CNTRL_LOG("Exited due to debug mode:%d\n", debug_mode);
|
||||
return ret;
|
||||
}
|
||||
|
||||
mutex_lock(&mhi_cntrl->pm_mutex);
|
||||
|
||||
@ -410,12 +423,12 @@ static int mhi_force_suspend(struct mhi_controller *mhi_cntrl)
|
||||
if (!ret || ret != -EBUSY)
|
||||
break;
|
||||
|
||||
MHI_LOG("MHI busy, sleeping and retry\n");
|
||||
MHI_CNTRL_LOG("MHI busy, sleeping and retry\n");
|
||||
msleep(delayms);
|
||||
}
|
||||
|
||||
if (ret) {
|
||||
MHI_ERR("Force suspend ret with %d\n", ret);
|
||||
MHI_CNTRL_ERR("Force suspend ret:%d\n", ret);
|
||||
goto exit_force_suspend;
|
||||
}
|
||||
|
||||
@ -513,6 +526,22 @@ static int mhi_qcom_power_up(struct mhi_controller *mhi_cntrl)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void mhi_qcom_fatal_worker(struct work_struct *work)
|
||||
{
|
||||
struct mhi_dev *mhi_dev = container_of(work, struct mhi_dev,
|
||||
fatal_worker);
|
||||
struct device *dev = &mhi_dev->pci_dev->dev;
|
||||
struct mhi_controller *mhi_cntrl = dev_get_drvdata(dev);
|
||||
int ret;
|
||||
|
||||
mhi_power_down(mhi_cntrl, true);
|
||||
|
||||
ret = mhi_qcom_power_up(mhi_cntrl);
|
||||
if (ret)
|
||||
MHI_ERR("Power up failure after SYS ERROR in PBL, ret:%d\n",
|
||||
ret);
|
||||
}
|
||||
|
||||
static int mhi_runtime_get(struct mhi_controller *mhi_cntrl, void *priv)
|
||||
{
|
||||
struct mhi_dev *mhi_dev = priv;
|
||||
@ -551,14 +580,18 @@ static void mhi_status_cb(struct mhi_controller *mhi_cntrl,
|
||||
pm_runtime_get(dev);
|
||||
ret = mhi_force_suspend(mhi_cntrl);
|
||||
if (!ret) {
|
||||
MHI_LOG("Attempt resume after forced suspend\n");
|
||||
MHI_CNTRL_LOG("Attempt resume after forced suspend\n");
|
||||
mhi_runtime_resume(dev);
|
||||
}
|
||||
pm_runtime_put(dev);
|
||||
mhi_arch_mission_mode_enter(mhi_cntrl);
|
||||
break;
|
||||
case MHI_CB_FATAL_ERROR:
|
||||
MHI_CNTRL_ERR("Perform power cycle due to SYS ERROR in PBL\n");
|
||||
schedule_work(&mhi_dev->fatal_worker);
|
||||
break;
|
||||
default:
|
||||
MHI_ERR("Unhandled cb:0x%x\n", reason);
|
||||
MHI_CNTRL_LOG("Unhandled cb:0x%x\n", reason);
|
||||
}
|
||||
}
|
||||
|
||||
@ -669,7 +702,7 @@ static struct mhi_controller *mhi_register_controller(struct pci_dev *pci_dev)
|
||||
bool use_s1;
|
||||
u32 addr_win[2];
|
||||
const char *iommu_dma_type;
|
||||
int ret, i;
|
||||
int ret, i, len;
|
||||
|
||||
if (!of_node)
|
||||
return ERR_PTR(-ENODEV);
|
||||
@ -745,14 +778,22 @@ static struct mhi_controller *mhi_register_controller(struct pci_dev *pci_dev)
|
||||
if (ret)
|
||||
goto error_register;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(firmware_table); i++) {
|
||||
len = ARRAY_SIZE(firmware_table);
|
||||
for (i = 0; i < len; i++) {
|
||||
firmware_info = firmware_table + i;
|
||||
|
||||
/* debug mode always use default */
|
||||
if (!debug_mode && mhi_cntrl->dev_id == firmware_info->dev_id)
|
||||
if (mhi_cntrl->dev_id == firmware_info->dev_id)
|
||||
break;
|
||||
}
|
||||
|
||||
if (debug_mode) {
|
||||
if (debug_mode <= MHI_DEBUG_D3)
|
||||
firmware_info = firmware_table + (len - 1);
|
||||
MHI_CNTRL_LOG("fw info: debug_mode:%d dev_id:%d image:%s\n",
|
||||
debug_mode, firmware_info->dev_id,
|
||||
firmware_info->fw_image);
|
||||
}
|
||||
|
||||
mhi_cntrl->fw_image = firmware_info->fw_image;
|
||||
mhi_cntrl->edl_image = firmware_info->edl_image;
|
||||
|
||||
@ -762,6 +803,7 @@ static struct mhi_controller *mhi_register_controller(struct pci_dev *pci_dev)
|
||||
goto error_register;
|
||||
|
||||
INIT_WORK(&mhi_cntrl->reg_write_work, mhi_reg_write_work);
|
||||
INIT_WORK(&mhi_dev->fatal_worker, mhi_qcom_fatal_worker);
|
||||
|
||||
mhi_cntrl->reg_write_q = kcalloc(REG_WRITE_QUEUE_LEN,
|
||||
sizeof(*mhi_cntrl->reg_write_q),
|
||||
@ -772,7 +814,7 @@ static struct mhi_controller *mhi_register_controller(struct pci_dev *pci_dev)
|
||||
atomic_set(&mhi_cntrl->write_idx, -1);
|
||||
|
||||
if (sysfs_create_group(&mhi_cntrl->mhi_dev->dev.kobj, &mhi_qcom_group))
|
||||
MHI_ERR("Error while creating the sysfs group\n");
|
||||
MHI_CNTRL_ERR("Error while creating the sysfs group\n");
|
||||
|
||||
return mhi_cntrl;
|
||||
|
||||
@ -829,7 +871,7 @@ int mhi_pci_probe(struct pci_dev *pci_dev,
|
||||
|
||||
pm_runtime_mark_last_busy(&pci_dev->dev);
|
||||
|
||||
MHI_LOG("Return successful\n");
|
||||
MHI_CNTRL_LOG("Return successful\n");
|
||||
|
||||
return 0;
|
||||
|
||||
|
@ -33,14 +33,26 @@
|
||||
extern const char * const mhi_ee_str[MHI_EE_MAX];
|
||||
#define TO_MHI_EXEC_STR(ee) (ee >= MHI_EE_MAX ? "INVALID_EE" : mhi_ee_str[ee])
|
||||
|
||||
enum mhi_debug_mode {
|
||||
MHI_DEBUG_MODE_OFF,
|
||||
MHI_DEBUG_NO_D3, /* use debug.mbn as fw image and skip first M3/D3 */
|
||||
MHI_DEBUG_D3, /* use debug.mbn as fw image and allow first M3/D3 */
|
||||
MHI_FWIMAGE_NO_D3, /* use fw image if found and skip first M3/D3 */
|
||||
MHI_FWIMAGE_D3, /* use fw image if found and allow first M3/D3 */
|
||||
MHI_DEBUG_MODE_MAX = MHI_FWIMAGE_D3,
|
||||
};
|
||||
|
||||
enum mhi_suspend_mode {
|
||||
MHI_ACTIVE_STATE,
|
||||
MHI_DEFAULT_SUSPEND,
|
||||
MHI_FAST_LINK_OFF,
|
||||
MHI_FAST_LINK_ON,
|
||||
MHI_SUSPEND_MODE_MAX,
|
||||
};
|
||||
|
||||
#define MHI_IS_SUSPENDED(mode) (mode)
|
||||
extern const char * const mhi_suspend_mode_str[MHI_SUSPEND_MODE_MAX];
|
||||
#define TO_MHI_SUSPEND_MODE_STR(mode) \
|
||||
(mode >= MHI_SUSPEND_MODE_MAX ? "Invalid" : mhi_suspend_mode_str[mode])
|
||||
|
||||
struct mhi_dev {
|
||||
struct pci_dev *pci_dev;
|
||||
@ -51,6 +63,7 @@ struct mhi_dev {
|
||||
dma_addr_t iova_start;
|
||||
dma_addr_t iova_stop;
|
||||
enum mhi_suspend_mode suspend_mode;
|
||||
struct work_struct fatal_worker;
|
||||
|
||||
/* hardware info */
|
||||
u32 serial_num;
|
||||
|
@ -51,7 +51,7 @@ static void mhi_process_sfr(struct mhi_controller *mhi_cntrl,
|
||||
rem_seg_len = 0;
|
||||
seg_idx++;
|
||||
if (seg_idx == mhi_cntrl->rddm_image->entries) {
|
||||
MHI_ERR("invalid size for SFR file\n");
|
||||
MHI_CNTRL_ERR("invalid size for SFR file\n");
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
@ -80,7 +80,7 @@ static int mhi_find_next_file_offset(struct mhi_controller *mhi_cntrl,
|
||||
while (info->file_size) {
|
||||
info->seg_idx++;
|
||||
if (info->seg_idx == mhi_cntrl->rddm_image->entries) {
|
||||
MHI_ERR("invalid size for file %s\n",
|
||||
MHI_CNTRL_ERR("invalid size for file %s\n",
|
||||
table_info->file_name);
|
||||
return -EINVAL;
|
||||
}
|
||||
@ -111,14 +111,14 @@ void mhi_dump_sfr(struct mhi_controller *mhi_cntrl)
|
||||
|
||||
if (rddm_header->header_size > sizeof(*rddm_header) ||
|
||||
rddm_header->header_size < 8) {
|
||||
MHI_ERR("invalid reported header size %u\n",
|
||||
MHI_CNTRL_ERR("invalid reported header size %u\n",
|
||||
rddm_header->header_size);
|
||||
return;
|
||||
}
|
||||
|
||||
table_size = (rddm_header->header_size - 8) / sizeof(*table_info);
|
||||
if (!table_size) {
|
||||
MHI_ERR("invalid rddm table size %u\n", table_size);
|
||||
MHI_CNTRL_ERR("invalid rddm table size %u\n", table_size);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -139,6 +139,31 @@ void mhi_dump_sfr(struct mhi_controller *mhi_cntrl)
|
||||
}
|
||||
EXPORT_SYMBOL(mhi_dump_sfr);
|
||||
|
||||
bool mhi_scan_rddm_cookie(struct mhi_controller *mhi_cntrl, u32 cookie)
|
||||
{
|
||||
int ret;
|
||||
u32 val;
|
||||
|
||||
if (!mhi_cntrl->rddm_supported || !cookie)
|
||||
return false;
|
||||
|
||||
MHI_CNTRL_LOG("Checking BHI debug register for 0x%x\n", cookie);
|
||||
|
||||
if (!MHI_REG_ACCESS_VALID(mhi_cntrl->pm_state))
|
||||
return false;
|
||||
|
||||
ret = mhi_read_reg(mhi_cntrl, mhi_cntrl->bhi, BHI_ERRDBG2, &val);
|
||||
if (ret)
|
||||
return false;
|
||||
|
||||
MHI_CNTRL_LOG("BHI_ERRDBG2 value:0x%x\n", val);
|
||||
if (val == cookie)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
EXPORT_SYMBOL(mhi_scan_rddm_cookie);
|
||||
|
||||
/* setup rddm vector table for rddm transfer and program rxvec */
|
||||
void mhi_rddm_prepare(struct mhi_controller *mhi_cntrl,
|
||||
struct image_info *img_info)
|
||||
@ -150,13 +175,13 @@ void mhi_rddm_prepare(struct mhi_controller *mhi_cntrl,
|
||||
int i = 0;
|
||||
|
||||
for (i = 0; i < img_info->entries - 1; i++, mhi_buf++, bhi_vec++) {
|
||||
MHI_VERB("Setting vector:%pad size:%zu\n",
|
||||
&mhi_buf->dma_addr, mhi_buf->len);
|
||||
MHI_CNTRL_LOG("Setting vector:%pad size:%zu\n",
|
||||
&mhi_buf->dma_addr, mhi_buf->len);
|
||||
bhi_vec->dma_addr = mhi_buf->dma_addr;
|
||||
bhi_vec->size = mhi_buf->len;
|
||||
}
|
||||
|
||||
MHI_LOG("BHIe programming for RDDM\n");
|
||||
MHI_CNTRL_LOG("BHIe programming for RDDM\n");
|
||||
|
||||
mhi_cntrl->write_reg(mhi_cntrl, base, BHIE_RXVECADDR_HIGH_OFFS,
|
||||
upper_32_bits(mhi_buf->dma_addr));
|
||||
@ -175,8 +200,8 @@ void mhi_rddm_prepare(struct mhi_controller *mhi_cntrl,
|
||||
BHIE_RXVECDB_SEQNUM_BMSK, BHIE_RXVECDB_SEQNUM_SHFT,
|
||||
sequence_id);
|
||||
|
||||
MHI_LOG("address:%pad len:0x%lx sequence:%u\n",
|
||||
&mhi_buf->dma_addr, mhi_buf->len, sequence_id);
|
||||
MHI_CNTRL_LOG("address:%pad len:0x%lx sequence:%u\n",
|
||||
&mhi_buf->dma_addr, mhi_buf->len, sequence_id);
|
||||
}
|
||||
|
||||
/* collect rddm during kernel panic */
|
||||
@ -191,10 +216,10 @@ static int __mhi_download_rddm_in_panic(struct mhi_controller *mhi_cntrl)
|
||||
int rddm_retry = rddm_timeout_us / delayus; /* time to enter rddm */
|
||||
void __iomem *base = mhi_cntrl->bhie;
|
||||
|
||||
MHI_LOG("Entered with pm_state:%s dev_state:%s ee:%s\n",
|
||||
to_mhi_pm_state_str(mhi_cntrl->pm_state),
|
||||
TO_MHI_STATE_STR(mhi_cntrl->dev_state),
|
||||
TO_MHI_EXEC_STR(mhi_cntrl->ee));
|
||||
MHI_CNTRL_LOG("Entered with pm_state:%s dev_state:%s ee:%s\n",
|
||||
to_mhi_pm_state_str(mhi_cntrl->pm_state),
|
||||
TO_MHI_STATE_STR(mhi_cntrl->dev_state),
|
||||
TO_MHI_EXEC_STR(mhi_cntrl->ee));
|
||||
|
||||
/*
|
||||
* This should only be executing during a kernel panic, we expect all
|
||||
@ -217,12 +242,15 @@ static int __mhi_download_rddm_in_panic(struct mhi_controller *mhi_cntrl)
|
||||
* waiting for image download completion.
|
||||
*/
|
||||
ee = mhi_get_exec_env(mhi_cntrl);
|
||||
if (ee == MHI_EE_MAX)
|
||||
goto err_no_rddm;
|
||||
|
||||
if (ee != MHI_EE_RDDM) {
|
||||
|
||||
MHI_LOG("Trigger device into RDDM mode using SYSERR\n");
|
||||
MHI_CNTRL_LOG("Trigger device into RDDM mode using SYSERR\n");
|
||||
mhi_set_mhi_state(mhi_cntrl, MHI_STATE_SYS_ERR);
|
||||
|
||||
MHI_LOG("Waiting for device to enter RDDM\n");
|
||||
MHI_CNTRL_LOG("Waiting for device to enter RDDM\n");
|
||||
while (rddm_retry--) {
|
||||
ee = mhi_get_exec_env(mhi_cntrl);
|
||||
if (ee == MHI_EE_RDDM)
|
||||
@ -233,7 +261,7 @@ static int __mhi_download_rddm_in_panic(struct mhi_controller *mhi_cntrl)
|
||||
|
||||
if (rddm_retry <= 0) {
|
||||
/* Hardware reset; force device to enter rddm */
|
||||
MHI_LOG(
|
||||
MHI_CNTRL_LOG(
|
||||
"Did not enter RDDM, do a host req. reset\n");
|
||||
mhi_cntrl->write_reg(mhi_cntrl, mhi_cntrl->regs,
|
||||
MHI_SOC_RESET_REQ_OFFSET,
|
||||
@ -244,8 +272,8 @@ static int __mhi_download_rddm_in_panic(struct mhi_controller *mhi_cntrl)
|
||||
ee = mhi_get_exec_env(mhi_cntrl);
|
||||
}
|
||||
|
||||
MHI_LOG("Waiting for image download completion, current EE:%s\n",
|
||||
TO_MHI_EXEC_STR(ee));
|
||||
MHI_CNTRL_LOG("Waiting for image download completion, current EE:%s\n",
|
||||
TO_MHI_EXEC_STR(ee));
|
||||
while (retry--) {
|
||||
ret = mhi_read_reg_field(mhi_cntrl, base, BHIE_RXVECSTATUS_OFFS,
|
||||
BHIE_RXVECSTATUS_STATUS_BMSK,
|
||||
@ -255,7 +283,7 @@ static int __mhi_download_rddm_in_panic(struct mhi_controller *mhi_cntrl)
|
||||
return -EIO;
|
||||
|
||||
if (rx_status == BHIE_RXVECSTATUS_STATUS_XFER_COMPL) {
|
||||
MHI_LOG("RDDM successfully collected\n");
|
||||
MHI_CNTRL_LOG("RDDM successfully collected\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -265,9 +293,11 @@ static int __mhi_download_rddm_in_panic(struct mhi_controller *mhi_cntrl)
|
||||
ee = mhi_get_exec_env(mhi_cntrl);
|
||||
ret = mhi_read_reg(mhi_cntrl, base, BHIE_RXVECSTATUS_OFFS, &rx_status);
|
||||
|
||||
MHI_ERR("Did not complete RDDM transfer\n");
|
||||
MHI_ERR("Current EE:%s\n", TO_MHI_EXEC_STR(ee));
|
||||
MHI_ERR("RXVEC_STATUS:0x%x, ret:%d\n", rx_status, ret);
|
||||
MHI_CNTRL_ERR("RXVEC_STATUS:0x%x, ret:%d\n", rx_status, ret);
|
||||
|
||||
err_no_rddm:
|
||||
MHI_CNTRL_ERR("Current EE:%s\n", TO_MHI_EXEC_STR(ee));
|
||||
MHI_CNTRL_ERR("Did not complete RDDM transfer\n");
|
||||
|
||||
return -EIO;
|
||||
}
|
||||
@ -278,10 +308,14 @@ int mhi_download_rddm_img(struct mhi_controller *mhi_cntrl, bool in_panic)
|
||||
void __iomem *base = mhi_cntrl->bhie;
|
||||
u32 rx_status;
|
||||
|
||||
/* device supports RDDM but controller wants to skip ramdumps */
|
||||
if (!mhi_cntrl->rddm_supported || !mhi_cntrl->rddm_image)
|
||||
return -EINVAL;
|
||||
|
||||
if (in_panic)
|
||||
return __mhi_download_rddm_in_panic(mhi_cntrl);
|
||||
|
||||
MHI_LOG("Waiting for image download completion\n");
|
||||
MHI_CNTRL_LOG("Waiting for image download completion\n");
|
||||
|
||||
/* waiting for image download completion */
|
||||
wait_event_timeout(mhi_cntrl->state_event,
|
||||
@ -296,7 +330,7 @@ int mhi_download_rddm_img(struct mhi_controller *mhi_cntrl, bool in_panic)
|
||||
}
|
||||
EXPORT_SYMBOL(mhi_download_rddm_img);
|
||||
|
||||
static int mhi_fw_load_amss(struct mhi_controller *mhi_cntrl,
|
||||
static int mhi_fw_load_bhie(struct mhi_controller *mhi_cntrl,
|
||||
const struct mhi_buf *mhi_buf)
|
||||
{
|
||||
void __iomem *base = mhi_cntrl->bhie;
|
||||
@ -309,7 +343,7 @@ static int mhi_fw_load_amss(struct mhi_controller *mhi_cntrl,
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
MHI_LOG("Starting BHIe Programming\n");
|
||||
MHI_CNTRL_LOG("Starting BHIe Programming\n");
|
||||
|
||||
mhi_cntrl->write_reg(mhi_cntrl, base, BHIE_TXVECADDR_HIGH_OFFS,
|
||||
upper_32_bits(mhi_buf->dma_addr));
|
||||
@ -329,11 +363,11 @@ static int mhi_fw_load_amss(struct mhi_controller *mhi_cntrl,
|
||||
mhi_cntrl->sequence_id);
|
||||
read_unlock_bh(pm_lock);
|
||||
|
||||
MHI_LOG("Upper:0x%x Lower:0x%x len:0x%lx sequence:%u\n",
|
||||
upper_32_bits(mhi_buf->dma_addr),
|
||||
lower_32_bits(mhi_buf->dma_addr),
|
||||
mhi_buf->len, mhi_cntrl->sequence_id);
|
||||
MHI_LOG("Waiting for image transfer completion\n");
|
||||
MHI_CNTRL_LOG("Upper:0x%x Lower:0x%x len:0x%lx sequence:%u\n",
|
||||
upper_32_bits(mhi_buf->dma_addr),
|
||||
lower_32_bits(mhi_buf->dma_addr),
|
||||
mhi_buf->len, mhi_cntrl->sequence_id);
|
||||
MHI_CNTRL_LOG("Waiting for image transfer completion\n");
|
||||
|
||||
/* waiting for image download completion */
|
||||
wait_event_timeout(mhi_cntrl->state_event,
|
||||
@ -351,7 +385,7 @@ static int mhi_fw_load_amss(struct mhi_controller *mhi_cntrl,
|
||||
return (tx_status == BHIE_TXVECSTATUS_STATUS_XFER_COMPL) ? 0 : -EIO;
|
||||
}
|
||||
|
||||
static int mhi_fw_load_sbl(struct mhi_controller *mhi_cntrl,
|
||||
static int mhi_fw_load_bhi(struct mhi_controller *mhi_cntrl,
|
||||
dma_addr_t dma_addr,
|
||||
size_t size)
|
||||
{
|
||||
@ -370,7 +404,7 @@ static int mhi_fw_load_sbl(struct mhi_controller *mhi_cntrl,
|
||||
{ NULL },
|
||||
};
|
||||
|
||||
MHI_LOG("Starting BHI programming\n");
|
||||
MHI_CNTRL_LOG("Starting BHI programming\n");
|
||||
|
||||
/* program start sbl download via bhi protocol */
|
||||
read_lock_bh(pm_lock);
|
||||
@ -393,7 +427,7 @@ static int mhi_fw_load_sbl(struct mhi_controller *mhi_cntrl,
|
||||
mhi_cntrl->session_id);
|
||||
read_unlock_bh(pm_lock);
|
||||
|
||||
MHI_LOG("Waiting for image transfer completion\n");
|
||||
MHI_CNTRL_LOG("Waiting for image transfer completion\n");
|
||||
|
||||
/* waiting for image download completion */
|
||||
wait_event_timeout(mhi_cntrl->state_event,
|
||||
@ -406,7 +440,7 @@ static int mhi_fw_load_sbl(struct mhi_controller *mhi_cntrl,
|
||||
goto invalid_pm_state;
|
||||
|
||||
if (tx_status == BHI_STATUS_ERROR) {
|
||||
MHI_ERR("Image transfer failed\n");
|
||||
MHI_CNTRL_ERR("Image transfer failed\n");
|
||||
read_lock_bh(pm_lock);
|
||||
if (MHI_REG_ACCESS_VALID(mhi_cntrl->pm_state)) {
|
||||
for (i = 0; error_reg[i].name; i++) {
|
||||
@ -414,8 +448,8 @@ static int mhi_fw_load_sbl(struct mhi_controller *mhi_cntrl,
|
||||
error_reg[i].offset, &val);
|
||||
if (ret)
|
||||
break;
|
||||
MHI_ERR("reg:%s value:0x%x\n",
|
||||
error_reg[i].name, val);
|
||||
MHI_CNTRL_ERR("reg:%s value:0x%x\n",
|
||||
error_reg[i].name, val);
|
||||
}
|
||||
}
|
||||
read_unlock_bh(pm_lock);
|
||||
@ -435,6 +469,9 @@ void mhi_free_bhie_table(struct mhi_controller *mhi_cntrl,
|
||||
int i;
|
||||
struct mhi_buf *mhi_buf = image_info->mhi_buf;
|
||||
|
||||
if (!image_info)
|
||||
return;
|
||||
|
||||
for (i = 0; i < image_info->entries; i++, mhi_buf++)
|
||||
mhi_free_contig_coherent(mhi_cntrl, mhi_buf->len, mhi_buf->buf,
|
||||
mhi_buf->dma_addr);
|
||||
@ -454,8 +491,8 @@ int mhi_alloc_bhie_table(struct mhi_controller *mhi_cntrl,
|
||||
struct image_info *img_info;
|
||||
struct mhi_buf *mhi_buf;
|
||||
|
||||
MHI_LOG("Allocating bytes:%zu seg_size:%zu total_seg:%u\n",
|
||||
alloc_size, seg_size, segments);
|
||||
MHI_CNTRL_LOG("Allocating bytes:%zu seg_size:%zu total_seg:%u\n",
|
||||
alloc_size, seg_size, segments);
|
||||
|
||||
img_info = kzalloc(sizeof(*img_info), GFP_KERNEL);
|
||||
if (!img_info)
|
||||
@ -482,7 +519,7 @@ int mhi_alloc_bhie_table(struct mhi_controller *mhi_cntrl,
|
||||
if (!mhi_buf->buf)
|
||||
goto error_alloc_segment;
|
||||
|
||||
MHI_LOG("Entry:%d Address:0x%llx size:%lu\n", i,
|
||||
MHI_CNTRL_LOG("Entry:%d Address:0x%llx size:%lu\n", i,
|
||||
mhi_buf->dma_addr, mhi_buf->len);
|
||||
}
|
||||
|
||||
@ -490,7 +527,7 @@ int mhi_alloc_bhie_table(struct mhi_controller *mhi_cntrl,
|
||||
img_info->entries = segments;
|
||||
*image_info = img_info;
|
||||
|
||||
MHI_LOG("Successfully allocated bhi vec table\n");
|
||||
MHI_CNTRL_LOG("Successfully allocated bhi vec table\n");
|
||||
|
||||
return 0;
|
||||
|
||||
@ -545,11 +582,11 @@ void mhi_fw_load_handler(struct mhi_controller *mhi_cntrl)
|
||||
size_t size;
|
||||
|
||||
if (MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state)) {
|
||||
MHI_ERR("MHI is not in valid state\n");
|
||||
MHI_CNTRL_ERR("MHI is not in valid state\n");
|
||||
return;
|
||||
}
|
||||
|
||||
MHI_LOG("Device current EE:%s\n", TO_MHI_EXEC_STR(mhi_cntrl->ee));
|
||||
MHI_CNTRL_LOG("Device current EE:%s\n", TO_MHI_EXEC_STR(mhi_cntrl->ee));
|
||||
|
||||
/* if device in pthru, do reset to ready state transition */
|
||||
if (mhi_cntrl->ee == MHI_EE_PTHRU)
|
||||
@ -560,23 +597,24 @@ void mhi_fw_load_handler(struct mhi_controller *mhi_cntrl)
|
||||
|
||||
if (!fw_name || (mhi_cntrl->fbc_download && (!mhi_cntrl->sbl_size ||
|
||||
!mhi_cntrl->seg_len))) {
|
||||
MHI_ERR("No firmware image defined or !sbl_size || !seg_len\n");
|
||||
return;
|
||||
MHI_CNTRL_ERR(
|
||||
"No firmware image defined or !sbl_size || !seg_len\n");
|
||||
goto fw_load_error;
|
||||
}
|
||||
|
||||
ret = request_firmware(&firmware, fw_name, mhi_cntrl->dev);
|
||||
if (ret) {
|
||||
if (!mhi_cntrl->fw_image_fallback) {
|
||||
MHI_ERR("Error loading fw, ret:%d\n", ret);
|
||||
return;
|
||||
MHI_CNTRL_ERR("Error loading fw, ret:%d\n", ret);
|
||||
goto fw_load_error;
|
||||
}
|
||||
|
||||
/* re-try with fall back fw image */
|
||||
ret = request_firmware(&firmware, mhi_cntrl->fw_image_fallback,
|
||||
mhi_cntrl->dev);
|
||||
if (ret) {
|
||||
MHI_ERR("Error loading fw_fb, ret:%d\n", ret);
|
||||
return;
|
||||
MHI_CNTRL_ERR("Error loading fw_fb, ret:%d\n", ret);
|
||||
goto fw_load_error;
|
||||
}
|
||||
|
||||
mhi_cntrl->status_cb(mhi_cntrl, mhi_cntrl->priv_data,
|
||||
@ -591,23 +629,26 @@ void mhi_fw_load_handler(struct mhi_controller *mhi_cntrl)
|
||||
|
||||
buf = mhi_alloc_coherent(mhi_cntrl, size, &dma_addr, GFP_KERNEL);
|
||||
if (!buf) {
|
||||
MHI_ERR("Could not allocate memory for image\n");
|
||||
MHI_CNTRL_ERR("Could not allocate memory for image\n");
|
||||
goto fw_load_error_release;
|
||||
}
|
||||
|
||||
/* load sbl or edl image via BHI */
|
||||
memcpy(buf, firmware->data, size);
|
||||
ret = mhi_fw_load_bhi(mhi_cntrl, dma_addr, size);
|
||||
mhi_free_coherent(mhi_cntrl, size, buf, dma_addr);
|
||||
|
||||
if (ret) {
|
||||
MHI_CNTRL_ERR("MHI did not load SBL/EDL image, ret:%d\n", ret);
|
||||
goto fw_load_error_release;
|
||||
}
|
||||
|
||||
/* we are done with FW load is EE is EDL */
|
||||
if (mhi_cntrl->ee == MHI_EE_EDL) {
|
||||
release_firmware(firmware);
|
||||
return;
|
||||
}
|
||||
|
||||
/* load sbl image */
|
||||
memcpy(buf, firmware->data, size);
|
||||
ret = mhi_fw_load_sbl(mhi_cntrl, dma_addr, size);
|
||||
mhi_free_coherent(mhi_cntrl, size, buf, dma_addr);
|
||||
|
||||
if (!mhi_cntrl->fbc_download || ret || mhi_cntrl->ee == MHI_EE_EDL)
|
||||
release_firmware(firmware);
|
||||
|
||||
/* error or in edl, we're done */
|
||||
if (ret || mhi_cntrl->ee == MHI_EE_EDL)
|
||||
return;
|
||||
|
||||
write_lock_irq(&mhi_cntrl->pm_lock);
|
||||
mhi_cntrl->dev_state = MHI_STATE_RESET;
|
||||
write_unlock_irq(&mhi_cntrl->pm_lock);
|
||||
@ -620,33 +661,35 @@ void mhi_fw_load_handler(struct mhi_controller *mhi_cntrl)
|
||||
ret = mhi_alloc_bhie_table(mhi_cntrl, &mhi_cntrl->fbc_image,
|
||||
firmware->size);
|
||||
if (ret) {
|
||||
MHI_ERR("Error alloc size of %zu\n", firmware->size);
|
||||
goto error_alloc_fw_table;
|
||||
MHI_CNTRL_ERR("Error alloc size:%zu\n", firmware->size);
|
||||
goto fw_load_error_ready;
|
||||
}
|
||||
|
||||
MHI_LOG("Copying firmware image into vector table\n");
|
||||
MHI_CNTRL_LOG("Copying firmware image into vector table\n");
|
||||
|
||||
/* load the firmware into BHIE vec table */
|
||||
mhi_firmware_copy(mhi_cntrl, firmware, mhi_cntrl->fbc_image);
|
||||
}
|
||||
|
||||
release_firmware(firmware);
|
||||
firmware = NULL;
|
||||
|
||||
fw_load_ee_pthru:
|
||||
/* transitioning into MHI RESET->READY state */
|
||||
ret = mhi_ready_state_transition(mhi_cntrl);
|
||||
|
||||
MHI_LOG("To Reset->Ready PM_STATE:%s MHI_STATE:%s EE:%s, ret:%d\n",
|
||||
to_mhi_pm_state_str(mhi_cntrl->pm_state),
|
||||
TO_MHI_STATE_STR(mhi_cntrl->dev_state),
|
||||
TO_MHI_EXEC_STR(mhi_cntrl->ee), ret);
|
||||
|
||||
if (!mhi_cntrl->fbc_download)
|
||||
return;
|
||||
|
||||
MHI_CNTRL_LOG("To Reset->Ready PM_STATE:%s MHI_STATE:%s EE:%s ret:%d\n",
|
||||
to_mhi_pm_state_str(mhi_cntrl->pm_state),
|
||||
TO_MHI_STATE_STR(mhi_cntrl->dev_state),
|
||||
TO_MHI_EXEC_STR(mhi_cntrl->ee), ret);
|
||||
if (ret) {
|
||||
MHI_ERR("Did not transition to READY state\n");
|
||||
goto error_read;
|
||||
MHI_CNTRL_ERR("Did not transition to READY state\n");
|
||||
goto fw_load_error_ready;
|
||||
}
|
||||
|
||||
if (!mhi_cntrl->fbc_download || mhi_cntrl->ee == MHI_EE_PTHRU)
|
||||
return;
|
||||
|
||||
/* wait for SBL event */
|
||||
ret = wait_event_timeout(mhi_cntrl->state_event,
|
||||
mhi_cntrl->ee == MHI_EE_SBL ||
|
||||
@ -654,26 +697,40 @@ void mhi_fw_load_handler(struct mhi_controller *mhi_cntrl)
|
||||
msecs_to_jiffies(mhi_cntrl->timeout_ms));
|
||||
|
||||
if (!ret || MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state)) {
|
||||
MHI_ERR("MHI did not enter BHIE\n");
|
||||
goto error_read;
|
||||
MHI_CNTRL_ERR("MHI did not enter BHIE\n");
|
||||
goto fw_load_error_ready;
|
||||
}
|
||||
|
||||
/* start full firmware image download */
|
||||
image_info = mhi_cntrl->fbc_image;
|
||||
ret = mhi_fw_load_amss(mhi_cntrl,
|
||||
ret = mhi_fw_load_bhie(mhi_cntrl,
|
||||
/* last entry is vec table */
|
||||
&image_info->mhi_buf[image_info->entries - 1]);
|
||||
|
||||
MHI_LOG("amss fw_load, ret:%d\n", ret);
|
||||
MHI_CNTRL_LOG("amss fw_load ret:%d\n", ret);
|
||||
|
||||
release_firmware(firmware);
|
||||
if (ret)
|
||||
goto fw_load_error;
|
||||
|
||||
return;
|
||||
|
||||
error_read:
|
||||
fw_load_error_ready:
|
||||
mhi_free_bhie_table(mhi_cntrl, mhi_cntrl->fbc_image);
|
||||
mhi_cntrl->fbc_image = NULL;
|
||||
|
||||
error_alloc_fw_table:
|
||||
fw_load_error_release:
|
||||
release_firmware(firmware);
|
||||
|
||||
fw_load_error:
|
||||
write_lock_irq(&mhi_cntrl->pm_lock);
|
||||
mhi_cntrl->pm_state = MHI_PM_FW_DL_ERR;
|
||||
wake_up_all(&mhi_cntrl->state_event);
|
||||
write_unlock_irq(&mhi_cntrl->pm_lock);
|
||||
}
|
||||
|
||||
void mhi_perform_soc_reset(struct mhi_controller *mhi_cntrl)
|
||||
{
|
||||
mhi_cntrl->write_reg(mhi_cntrl, mhi_cntrl->regs,
|
||||
MHI_SOC_RESET_REQ_OFFSET,
|
||||
MHI_SOC_RESET_REQ);
|
||||
}
|
||||
|
@ -348,6 +348,9 @@ void mhi_destroy_sysfs(struct mhi_controller *mhi_cntrl)
|
||||
}
|
||||
spin_unlock(&mhi_tsync->lock);
|
||||
|
||||
if (mhi_tsync->db_response_pending)
|
||||
complete(&mhi_tsync->db_completion);
|
||||
|
||||
kfree(mhi_cntrl->mhi_tsync);
|
||||
mhi_cntrl->mhi_tsync = NULL;
|
||||
mutex_unlock(&mhi_cntrl->tsync_mutex);
|
||||
@ -432,8 +435,8 @@ int mhi_init_irq_setup(struct mhi_controller *mhi_cntrl)
|
||||
mhi_msi_handlr, IRQF_SHARED | IRQF_NO_SUSPEND,
|
||||
"mhi", mhi_event);
|
||||
if (ret) {
|
||||
MHI_ERR("Error requesting irq:%d for ev:%d\n",
|
||||
mhi_cntrl->irq[mhi_event->msi], i);
|
||||
MHI_CNTRL_ERR("Error requesting irq:%d for ev:%d\n",
|
||||
mhi_cntrl->irq[mhi_event->msi], i);
|
||||
goto error_request;
|
||||
}
|
||||
}
|
||||
@ -522,6 +525,12 @@ static int mhi_init_debugfs_mhi_vote_open(struct inode *inode, struct file *fp)
|
||||
return single_open(fp, mhi_debugfs_mhi_vote_show, inode->i_private);
|
||||
}
|
||||
|
||||
static int mhi_init_debugfs_mhi_regdump_open(struct inode *inode,
|
||||
struct file *fp)
|
||||
{
|
||||
return single_open(fp, mhi_debugfs_mhi_regdump_show, inode->i_private);
|
||||
}
|
||||
|
||||
static const struct file_operations debugfs_state_ops = {
|
||||
.open = mhi_init_debugfs_mhi_states_open,
|
||||
.release = single_release,
|
||||
@ -546,9 +555,18 @@ static const struct file_operations debugfs_vote_ops = {
|
||||
.read = seq_read,
|
||||
};
|
||||
|
||||
static const struct file_operations debugfs_regdump_ops = {
|
||||
.open = mhi_init_debugfs_mhi_regdump_open,
|
||||
.release = single_release,
|
||||
.read = seq_read,
|
||||
};
|
||||
|
||||
DEFINE_DEBUGFS_ATTRIBUTE(debugfs_trigger_reset_fops, NULL,
|
||||
mhi_debugfs_trigger_reset, "%llu\n");
|
||||
|
||||
DEFINE_DEBUGFS_ATTRIBUTE(debugfs_trigger_soc_reset_fops, NULL,
|
||||
mhi_debugfs_trigger_soc_reset, "%llu\n");
|
||||
|
||||
void mhi_init_debugfs(struct mhi_controller *mhi_cntrl)
|
||||
{
|
||||
struct dentry *dentry;
|
||||
@ -575,6 +593,11 @@ void mhi_init_debugfs(struct mhi_controller *mhi_cntrl)
|
||||
&debugfs_vote_ops);
|
||||
debugfs_create_file_unsafe("reset", 0444, dentry, mhi_cntrl,
|
||||
&debugfs_trigger_reset_fops);
|
||||
debugfs_create_file_unsafe("regdump", 0444, dentry, mhi_cntrl,
|
||||
&debugfs_regdump_ops);
|
||||
debugfs_create_file_unsafe("soc_reset", 0444, dentry, mhi_cntrl,
|
||||
&debugfs_trigger_soc_reset_fops);
|
||||
|
||||
mhi_cntrl->dentry = dentry;
|
||||
}
|
||||
|
||||
@ -769,7 +792,7 @@ static int mhi_init_timesync(struct mhi_controller *mhi_cntrl)
|
||||
ret = mhi_get_capability_offset(mhi_cntrl, TIMESYNC_CAP_ID,
|
||||
&time_offset);
|
||||
if (ret) {
|
||||
MHI_LOG("No timesync capability found\n");
|
||||
MHI_CNTRL_LOG("No timesync capability found\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -784,7 +807,7 @@ static int mhi_init_timesync(struct mhi_controller *mhi_cntrl)
|
||||
INIT_LIST_HEAD(&mhi_tsync->head);
|
||||
|
||||
/* save time_offset for obtaining time */
|
||||
MHI_LOG("TIME OFFS:0x%x\n", time_offset);
|
||||
MHI_CNTRL_LOG("TIME OFFS:0x%x\n", time_offset);
|
||||
mhi_tsync->time_reg = mhi_cntrl->regs + time_offset
|
||||
+ TIMESYNC_TIME_LOW_OFFSET;
|
||||
|
||||
@ -793,7 +816,7 @@ static int mhi_init_timesync(struct mhi_controller *mhi_cntrl)
|
||||
/* get timesync event ring configuration */
|
||||
er_index = mhi_get_er_index(mhi_cntrl, MHI_ER_TSYNC_ELEMENT_TYPE);
|
||||
if (er_index < 0) {
|
||||
MHI_LOG("Could not find timesync event ring\n");
|
||||
MHI_CNTRL_LOG("Could not find timesync event ring\n");
|
||||
return er_index;
|
||||
}
|
||||
|
||||
@ -822,7 +845,7 @@ int mhi_init_sfr(struct mhi_controller *mhi_cntrl)
|
||||
sfr_info->buf_addr = mhi_alloc_coherent(mhi_cntrl, sfr_info->len,
|
||||
&sfr_info->dma_addr, GFP_KERNEL);
|
||||
if (!sfr_info->buf_addr) {
|
||||
MHI_ERR("Failed to allocate memory for sfr\n");
|
||||
MHI_CNTRL_ERR("Failed to allocate memory for sfr\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
@ -830,14 +853,14 @@ int mhi_init_sfr(struct mhi_controller *mhi_cntrl)
|
||||
|
||||
ret = mhi_send_cmd(mhi_cntrl, NULL, MHI_CMD_SFR_CFG);
|
||||
if (ret) {
|
||||
MHI_ERR("Failed to send sfr cfg cmd\n");
|
||||
MHI_CNTRL_ERR("Failed to send sfr cfg cmd\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = wait_for_completion_timeout(&sfr_info->completion,
|
||||
msecs_to_jiffies(mhi_cntrl->timeout_ms));
|
||||
if (!ret || sfr_info->ccs != MHI_EV_CC_SUCCESS) {
|
||||
MHI_ERR("Failed to get sfr cfg cmd completion\n");
|
||||
MHI_CNTRL_ERR("Failed to get sfr cfg cmd completion\n");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
@ -865,7 +888,7 @@ static int mhi_init_bw_scale(struct mhi_controller *mhi_cntrl)
|
||||
|
||||
bw_cfg_offset += BW_SCALE_CFG_OFFSET;
|
||||
|
||||
MHI_LOG("BW_CFG OFFSET:0x%x\n", bw_cfg_offset);
|
||||
MHI_CNTRL_LOG("BW_CFG OFFSET:0x%x\n", bw_cfg_offset);
|
||||
|
||||
/* advertise host support */
|
||||
mhi_cntrl->write_reg(mhi_cntrl, mhi_cntrl->regs, bw_cfg_offset,
|
||||
@ -954,7 +977,7 @@ int mhi_init_mmio(struct mhi_controller *mhi_cntrl)
|
||||
{ 0, 0, 0 }
|
||||
};
|
||||
|
||||
MHI_LOG("Initializing MMIO\n");
|
||||
MHI_CNTRL_LOG("Initializing MMIO\n");
|
||||
|
||||
/* set up DB register for all the chan rings */
|
||||
ret = mhi_read_reg_field(mhi_cntrl, base, CHDBOFF, CHDBOFF_CHDBOFF_MASK,
|
||||
@ -962,7 +985,7 @@ int mhi_init_mmio(struct mhi_controller *mhi_cntrl)
|
||||
if (ret)
|
||||
return -EIO;
|
||||
|
||||
MHI_LOG("CHDBOFF:0x%x\n", val);
|
||||
MHI_CNTRL_LOG("CHDBOFF:0x%x\n", val);
|
||||
|
||||
/* setup wake db */
|
||||
mhi_cntrl->wake_db = base + val + (8 * MHI_DEV_WAKE_DB);
|
||||
@ -985,7 +1008,7 @@ int mhi_init_mmio(struct mhi_controller *mhi_cntrl)
|
||||
if (ret)
|
||||
return -EIO;
|
||||
|
||||
MHI_LOG("ERDBOFF:0x%x\n", val);
|
||||
MHI_CNTRL_LOG("ERDBOFF:0x%x\n", val);
|
||||
|
||||
mhi_event = mhi_cntrl->mhi_event;
|
||||
for (i = 0; i < mhi_cntrl->total_ev_rings; i++, val += 8, mhi_event++) {
|
||||
@ -998,7 +1021,7 @@ int mhi_init_mmio(struct mhi_controller *mhi_cntrl)
|
||||
/* set up DB register for primary CMD rings */
|
||||
mhi_cntrl->mhi_cmd[PRIMARY_CMD_RING].ring.db_addr = base + CRDB_LOWER;
|
||||
|
||||
MHI_LOG("Programming all MMIO values.\n");
|
||||
MHI_CNTRL_LOG("Programming all MMIO values.\n");
|
||||
for (i = 0; reg_info[i].offset; i++)
|
||||
mhi_write_reg_field(mhi_cntrl, base, reg_info[i].offset,
|
||||
reg_info[i].mask, reg_info[i].shift,
|
||||
@ -1234,7 +1257,7 @@ static int of_parse_ev_cfg(struct mhi_controller *mhi_cntrl,
|
||||
mhi_event->process_event = mhi_process_ctrl_ev_ring;
|
||||
break;
|
||||
case MHI_ER_TSYNC_ELEMENT_TYPE:
|
||||
mhi_event->process_event = mhi_process_tsync_event_ring;
|
||||
mhi_event->process_event = mhi_process_tsync_ev_ring;
|
||||
break;
|
||||
case MHI_ER_BW_SCALE_ELEMENT_TYPE:
|
||||
mhi_event->process_event = mhi_process_bw_scale_ev_ring;
|
||||
@ -1556,9 +1579,9 @@ int of_register_mhi_controller(struct mhi_controller *mhi_cntrl)
|
||||
INIT_WORK(&mhi_cntrl->st_worker, mhi_pm_st_worker);
|
||||
init_waitqueue_head(&mhi_cntrl->state_event);
|
||||
|
||||
mhi_cntrl->special_wq = alloc_ordered_workqueue("mhi_special_w",
|
||||
mhi_cntrl->wq = alloc_ordered_workqueue("mhi_w",
|
||||
WQ_MEM_RECLAIM | WQ_HIGHPRI);
|
||||
if (!mhi_cntrl->special_wq)
|
||||
if (!mhi_cntrl->wq)
|
||||
goto error_alloc_cmd;
|
||||
|
||||
INIT_WORK(&mhi_cntrl->special_work, mhi_special_purpose_work);
|
||||
@ -1684,7 +1707,7 @@ int of_register_mhi_controller(struct mhi_controller *mhi_cntrl)
|
||||
|
||||
error_alloc_dev:
|
||||
kfree(mhi_cntrl->mhi_cmd);
|
||||
destroy_workqueue(mhi_cntrl->special_wq);
|
||||
destroy_workqueue(mhi_cntrl->wq);
|
||||
|
||||
error_alloc_cmd:
|
||||
vfree(mhi_cntrl->mhi_chan);
|
||||
@ -1749,7 +1772,7 @@ int mhi_prepare_for_power_up(struct mhi_controller *mhi_cntrl)
|
||||
|
||||
ret = mhi_init_dev_ctxt(mhi_cntrl);
|
||||
if (ret) {
|
||||
MHI_ERR("Error with init dev_ctxt\n");
|
||||
MHI_CNTRL_ERR("Error with init dev_ctxt\n");
|
||||
goto error_dev_ctxt;
|
||||
}
|
||||
|
||||
@ -1757,7 +1780,7 @@ int mhi_prepare_for_power_up(struct mhi_controller *mhi_cntrl)
|
||||
* allocate rddm table if specified, this table is for debug purpose
|
||||
* so we'll ignore erros
|
||||
*/
|
||||
if (mhi_cntrl->rddm_size) {
|
||||
if (mhi_cntrl->rddm_supported && mhi_cntrl->rddm_size) {
|
||||
mhi_alloc_bhie_table(mhi_cntrl, &mhi_cntrl->rddm_image,
|
||||
mhi_cntrl->rddm_size);
|
||||
|
||||
@ -1769,7 +1792,7 @@ int mhi_prepare_for_power_up(struct mhi_controller *mhi_cntrl)
|
||||
ret = mhi_read_reg(mhi_cntrl, mhi_cntrl->regs, BHIEOFF,
|
||||
&bhie_off);
|
||||
if (ret) {
|
||||
MHI_ERR("Error getting bhie offset\n");
|
||||
MHI_CNTRL_ERR("Error getting bhie offset\n");
|
||||
goto bhie_error;
|
||||
}
|
||||
|
||||
@ -1944,7 +1967,8 @@ static int mhi_driver_remove(struct device *dev)
|
||||
MHI_CH_STATE_DISABLED,
|
||||
MHI_CH_STATE_DISABLED
|
||||
};
|
||||
int dir;
|
||||
int dir, ret;
|
||||
bool interrupted = false;
|
||||
|
||||
/* control device has no work to do */
|
||||
if (mhi_dev->dev_type == MHI_CONTROLLER_TYPE)
|
||||
@ -1952,11 +1976,11 @@ static int mhi_driver_remove(struct device *dev)
|
||||
|
||||
MHI_LOG("Removing device for chan:%s\n", mhi_dev->chan_name);
|
||||
|
||||
/* reset both channels */
|
||||
/* move both channels to suspended state and disallow processing */
|
||||
for (dir = 0; dir < 2; dir++) {
|
||||
mhi_chan = dir ? mhi_dev->ul_chan : mhi_dev->dl_chan;
|
||||
|
||||
if (!mhi_chan)
|
||||
if (!mhi_chan || mhi_chan->offload_ch)
|
||||
continue;
|
||||
|
||||
/* wake all threads waiting for completion */
|
||||
@ -1965,15 +1989,45 @@ static int mhi_driver_remove(struct device *dev)
|
||||
complete_all(&mhi_chan->completion);
|
||||
write_unlock_irq(&mhi_chan->lock);
|
||||
|
||||
/* move channel state to disable, no more processing */
|
||||
mutex_lock(&mhi_chan->mutex);
|
||||
write_lock_irq(&mhi_chan->lock);
|
||||
if (mhi_chan->ch_state != MHI_CH_STATE_DISABLED) {
|
||||
ch_state[dir] = mhi_chan->ch_state;
|
||||
mhi_chan->ch_state = MHI_CH_STATE_SUSPENDED;
|
||||
}
|
||||
write_unlock_irq(&mhi_chan->lock);
|
||||
mutex_unlock(&mhi_chan->mutex);
|
||||
}
|
||||
|
||||
/* wait for each channel to close and reset both channels */
|
||||
for (dir = 0; dir < 2; dir++) {
|
||||
mhi_chan = dir ? mhi_dev->ul_chan : mhi_dev->dl_chan;
|
||||
|
||||
if (!mhi_chan || mhi_chan->offload_ch)
|
||||
continue;
|
||||
|
||||
/* unbind request from userspace, wait for channel reset */
|
||||
if (!(mhi_cntrl->power_down ||
|
||||
MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state)) &&
|
||||
ch_state[dir] != MHI_CH_STATE_DISABLED && !interrupted) {
|
||||
MHI_ERR("Channel %s busy, wait for it to be reset\n",
|
||||
mhi_dev->chan_name);
|
||||
ret = wait_event_interruptible(mhi_cntrl->state_event,
|
||||
mhi_chan->ch_state == MHI_CH_STATE_DISABLED ||
|
||||
MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state));
|
||||
if (unlikely(ret))
|
||||
interrupted = true;
|
||||
}
|
||||
|
||||
/* update channel state as an error can exit above wait */
|
||||
mutex_lock(&mhi_chan->mutex);
|
||||
|
||||
write_lock_irq(&mhi_chan->lock);
|
||||
ch_state[dir] = mhi_chan->ch_state;
|
||||
mhi_chan->ch_state = MHI_CH_STATE_SUSPENDED;
|
||||
write_unlock_irq(&mhi_chan->lock);
|
||||
|
||||
/* reset the channel */
|
||||
if (!mhi_chan->offload_ch)
|
||||
/* reset channel if it was left enabled */
|
||||
if (ch_state[dir] != MHI_CH_STATE_DISABLED)
|
||||
mhi_reset_chan(mhi_cntrl, mhi_chan);
|
||||
|
||||
mutex_unlock(&mhi_chan->mutex);
|
||||
@ -1991,7 +2045,7 @@ static int mhi_driver_remove(struct device *dev)
|
||||
|
||||
mutex_lock(&mhi_chan->mutex);
|
||||
|
||||
if (ch_state[dir] == MHI_CH_STATE_ENABLED &&
|
||||
if (ch_state[dir] != MHI_CH_STATE_DISABLED &&
|
||||
!mhi_chan->offload_ch)
|
||||
mhi_deinit_chan_ctxt(mhi_cntrl, mhi_chan);
|
||||
|
||||
|
@ -716,8 +716,6 @@ struct mhi_chan {
|
||||
struct tsync_node {
|
||||
struct list_head node;
|
||||
u32 sequence;
|
||||
u32 int_sequence;
|
||||
u64 local_time;
|
||||
u64 remote_time;
|
||||
struct mhi_device *mhi_dev;
|
||||
void (*cb_func)(struct mhi_device *mhi_dev, u32 sequence,
|
||||
@ -727,7 +725,11 @@ struct tsync_node {
|
||||
struct mhi_timesync {
|
||||
void __iomem *time_reg;
|
||||
u32 int_sequence;
|
||||
u64 local_time;
|
||||
u64 remote_time;
|
||||
bool db_support;
|
||||
bool db_response_pending;
|
||||
struct completion db_completion;
|
||||
spinlock_t lock; /* list protection */
|
||||
struct list_head head;
|
||||
};
|
||||
@ -748,16 +750,20 @@ struct mhi_bus {
|
||||
|
||||
/* default MHI timeout */
|
||||
#define MHI_TIMEOUT_MS (1000)
|
||||
#define MHI_FORCE_WAKE_DELAY_US (100)
|
||||
|
||||
extern struct mhi_bus mhi_bus;
|
||||
|
||||
struct mhi_controller *find_mhi_controller_by_name(const char *name);
|
||||
|
||||
/* debug fs related functions */
|
||||
int mhi_debugfs_mhi_regdump_show(struct seq_file *m, void *d);
|
||||
int mhi_debugfs_mhi_vote_show(struct seq_file *m, void *d);
|
||||
int mhi_debugfs_mhi_chan_show(struct seq_file *m, void *d);
|
||||
int mhi_debugfs_mhi_event_show(struct seq_file *m, void *d);
|
||||
int mhi_debugfs_mhi_states_show(struct seq_file *m, void *d);
|
||||
int mhi_debugfs_trigger_reset(void *data, u64 val);
|
||||
int mhi_debugfs_trigger_soc_reset(void *data, u64 val);
|
||||
|
||||
void mhi_deinit_debugfs(struct mhi_controller *mhi_cntrl);
|
||||
void mhi_init_debugfs(struct mhi_controller *mhi_cntrl);
|
||||
@ -786,8 +792,8 @@ int mhi_process_data_event_ring(struct mhi_controller *mhi_cntrl,
|
||||
struct mhi_event *mhi_event, u32 event_quota);
|
||||
int mhi_process_ctrl_ev_ring(struct mhi_controller *mhi_cntrl,
|
||||
struct mhi_event *mhi_event, u32 event_quota);
|
||||
int mhi_process_tsync_event_ring(struct mhi_controller *mhi_cntrl,
|
||||
struct mhi_event *mhi_event, u32 event_quota);
|
||||
int mhi_process_tsync_ev_ring(struct mhi_controller *mhi_cntrl,
|
||||
struct mhi_event *mhi_event, u32 event_quota);
|
||||
int mhi_process_bw_scale_ev_ring(struct mhi_controller *mhi_cntrl,
|
||||
struct mhi_event *mhi_event, u32 event_quota);
|
||||
int mhi_send_cmd(struct mhi_controller *mhi_cntrl, struct mhi_chan *mhi_chan,
|
||||
@ -964,6 +970,7 @@ int mhi_prepare_channel(struct mhi_controller *mhi_cntrl,
|
||||
struct mhi_chan *mhi_chan);
|
||||
void mhi_reset_reg_write_q(struct mhi_controller *mhi_cntrl);
|
||||
void mhi_force_reg_write(struct mhi_controller *mhi_cntrl);
|
||||
void mhi_perform_soc_reset(struct mhi_controller *mhi_cntrl);
|
||||
|
||||
/* isr handlers */
|
||||
irqreturn_t mhi_msi_handlr(int irq_number, void *dev);
|
||||
|
@ -244,11 +244,17 @@ static enum mhi_ee mhi_translate_dev_ee(struct mhi_controller *mhi_cntrl,
|
||||
|
||||
enum mhi_ee mhi_get_exec_env(struct mhi_controller *mhi_cntrl)
|
||||
{
|
||||
int ret;
|
||||
u32 exec;
|
||||
int ret = mhi_read_reg(mhi_cntrl, mhi_cntrl->bhi, BHI_EXECENV, &exec);
|
||||
|
||||
if (!mhi_cntrl || !mhi_cntrl->bhi)
|
||||
return MHI_EE_MAX;
|
||||
|
||||
ret = mhi_read_reg(mhi_cntrl, mhi_cntrl->bhi, BHI_EXECENV, &exec);
|
||||
|
||||
return (ret) ? MHI_EE_MAX : mhi_translate_dev_ee(mhi_cntrl, exec);
|
||||
}
|
||||
EXPORT_SYMBOL(mhi_get_exec_env);
|
||||
|
||||
enum mhi_dev_state mhi_get_mhi_state(struct mhi_controller *mhi_cntrl)
|
||||
{
|
||||
@ -258,6 +264,7 @@ enum mhi_dev_state mhi_get_mhi_state(struct mhi_controller *mhi_cntrl)
|
||||
MHISTATUS_MHISTATE_SHIFT, &state);
|
||||
return ret ? MHI_STATE_MAX : state;
|
||||
}
|
||||
EXPORT_SYMBOL(mhi_get_mhi_state);
|
||||
|
||||
int mhi_queue_sclist(struct mhi_device *mhi_dev,
|
||||
struct mhi_chan *mhi_chan,
|
||||
@ -1070,7 +1077,9 @@ static int parse_rsc_event(struct mhi_controller *mhi_cntrl,
|
||||
|
||||
result.transaction_status = (ev_code == MHI_EV_CC_OVERFLOW) ?
|
||||
-EOVERFLOW : 0;
|
||||
result.bytes_xferd = xfer_len;
|
||||
|
||||
/* truncate to buf len if xfer_len is larger */
|
||||
result.bytes_xferd = min_t(u16, xfer_len, buf_info->len);
|
||||
result.buf_addr = buf_info->cb_buf;
|
||||
result.dir = mhi_chan->dir;
|
||||
|
||||
@ -1205,19 +1214,21 @@ int mhi_process_ctrl_ev_ring(struct mhi_controller *mhi_cntrl,
|
||||
enum MHI_PM_STATE new_state;
|
||||
|
||||
/*
|
||||
* Don't process sys error if device support
|
||||
* rddm since we will be processing rddm ee
|
||||
* event instead of sys error state change event
|
||||
* Allow move to SYS_ERROR even if RDDM is
|
||||
* supported so that core driver is inactive
|
||||
* with anticipation of an upcoming RDDM event
|
||||
*/
|
||||
if (mhi_cntrl->ee == MHI_EE_RDDM ||
|
||||
mhi_cntrl->rddm_image)
|
||||
break;
|
||||
|
||||
MHI_ERR("MHI system error detected\n");
|
||||
write_lock_irq(&mhi_cntrl->pm_lock);
|
||||
/* skip if RDDM event was already processed */
|
||||
if (mhi_cntrl->ee == MHI_EE_RDDM) {
|
||||
write_unlock_irq(&mhi_cntrl->pm_lock);
|
||||
break;
|
||||
}
|
||||
new_state = mhi_tryset_pm_state(mhi_cntrl,
|
||||
MHI_PM_SYS_ERR_DETECT);
|
||||
write_unlock_irq(&mhi_cntrl->pm_lock);
|
||||
|
||||
MHI_ERR("MHI system error detected\n");
|
||||
if (new_state == MHI_PM_SYS_ERR_DETECT)
|
||||
mhi_process_sys_err(mhi_cntrl);
|
||||
break;
|
||||
@ -1255,6 +1266,22 @@ int mhi_process_ctrl_ev_ring(struct mhi_controller *mhi_cntrl,
|
||||
st = MHI_ST_TRANSITION_MISSION_MODE;
|
||||
break;
|
||||
case MHI_EE_RDDM:
|
||||
if (mhi_cntrl->ee == MHI_EE_RDDM ||
|
||||
mhi_cntrl->power_down)
|
||||
break;
|
||||
|
||||
MHI_ERR("RDDM event occurred!\n");
|
||||
write_lock_irq(&mhi_cntrl->pm_lock);
|
||||
mhi_cntrl->ee = MHI_EE_RDDM;
|
||||
write_unlock_irq(&mhi_cntrl->pm_lock);
|
||||
|
||||
/* notify critical clients */
|
||||
mhi_control_error(mhi_cntrl);
|
||||
|
||||
mhi_cntrl->status_cb(mhi_cntrl,
|
||||
mhi_cntrl->priv_data,
|
||||
MHI_CB_EE_RDDM);
|
||||
wake_up_all(&mhi_cntrl->state_event);
|
||||
break;
|
||||
default:
|
||||
MHI_ERR("Unhandled EE event:%s\n",
|
||||
@ -1321,7 +1348,7 @@ int mhi_process_data_event_ring(struct mhi_controller *mhi_cntrl,
|
||||
chan = MHI_TRE_GET_EV_CHID(local_rp);
|
||||
if (chan >= mhi_cntrl->max_chan) {
|
||||
MHI_ERR("invalid channel id %u\n", chan);
|
||||
continue;
|
||||
goto next_er_element;
|
||||
}
|
||||
mhi_chan = &mhi_cntrl->mhi_chan[chan];
|
||||
|
||||
@ -1333,6 +1360,7 @@ int mhi_process_data_event_ring(struct mhi_controller *mhi_cntrl,
|
||||
event_quota--;
|
||||
}
|
||||
|
||||
next_er_element:
|
||||
mhi_recycle_ev_ring_element(mhi_cntrl, ev_ring);
|
||||
local_rp = ev_ring->rp;
|
||||
dev_rp = mhi_to_virtual(ev_ring, er_ctxt->rp);
|
||||
@ -1348,82 +1376,98 @@ int mhi_process_data_event_ring(struct mhi_controller *mhi_cntrl,
|
||||
return count;
|
||||
}
|
||||
|
||||
int mhi_process_tsync_event_ring(struct mhi_controller *mhi_cntrl,
|
||||
struct mhi_event *mhi_event,
|
||||
u32 event_quota)
|
||||
int mhi_process_tsync_ev_ring(struct mhi_controller *mhi_cntrl,
|
||||
struct mhi_event *mhi_event,
|
||||
u32 event_quota)
|
||||
{
|
||||
struct mhi_tre *dev_rp, *local_rp;
|
||||
struct mhi_tre *dev_rp;
|
||||
struct mhi_ring *ev_ring = &mhi_event->ring;
|
||||
struct mhi_event_ctxt *er_ctxt =
|
||||
&mhi_cntrl->mhi_ctxt->er_ctxt[mhi_event->er_index];
|
||||
struct mhi_timesync *mhi_tsync = mhi_cntrl->mhi_tsync;
|
||||
int count = 0;
|
||||
u32 int_sequence, unit;
|
||||
u32 sequence;
|
||||
u64 remote_time;
|
||||
int ret = 0;
|
||||
|
||||
if (unlikely(MHI_EVENT_ACCESS_INVALID(mhi_cntrl->pm_state))) {
|
||||
MHI_LOG("No EV access, PM_STATE:%s\n",
|
||||
to_mhi_pm_state_str(mhi_cntrl->pm_state));
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
spin_lock_bh(&mhi_event->lock);
|
||||
dev_rp = mhi_to_virtual(ev_ring, er_ctxt->rp);
|
||||
local_rp = ev_ring->rp;
|
||||
|
||||
while (dev_rp != local_rp) {
|
||||
enum MHI_PKT_TYPE type = MHI_TRE_GET_EV_TYPE(local_rp);
|
||||
struct tsync_node *tsync_node;
|
||||
|
||||
MHI_VERB("Processing Event:0x%llx 0x%08x 0x%08x\n",
|
||||
local_rp->ptr, local_rp->dword[0], local_rp->dword[1]);
|
||||
|
||||
MHI_ASSERT(type != MHI_PKT_TYPE_TSYNC_EVENT, "!TSYNC event");
|
||||
|
||||
int_sequence = MHI_TRE_GET_EV_TSYNC_SEQ(local_rp);
|
||||
unit = MHI_TRE_GET_EV_TSYNC_UNIT(local_rp);
|
||||
remote_time = MHI_TRE_GET_EV_TIME(local_rp);
|
||||
|
||||
do {
|
||||
spin_lock(&mhi_tsync->lock);
|
||||
tsync_node = list_first_entry_or_null(&mhi_tsync->head,
|
||||
struct tsync_node, node);
|
||||
if (!tsync_node) {
|
||||
spin_unlock(&mhi_tsync->lock);
|
||||
break;
|
||||
}
|
||||
|
||||
list_del(&tsync_node->node);
|
||||
spin_unlock(&mhi_tsync->lock);
|
||||
|
||||
/*
|
||||
* device may not able to process all time sync commands
|
||||
* host issue and only process last command it receive
|
||||
*/
|
||||
if (tsync_node->int_sequence == int_sequence) {
|
||||
tsync_node->cb_func(tsync_node->mhi_dev,
|
||||
tsync_node->sequence,
|
||||
tsync_node->local_time,
|
||||
remote_time);
|
||||
kfree(tsync_node);
|
||||
} else {
|
||||
kfree(tsync_node);
|
||||
}
|
||||
} while (true);
|
||||
|
||||
mhi_recycle_ev_ring_element(mhi_cntrl, ev_ring);
|
||||
local_rp = ev_ring->rp;
|
||||
dev_rp = mhi_to_virtual(ev_ring, er_ctxt->rp);
|
||||
count++;
|
||||
if (ev_ring->rp == dev_rp) {
|
||||
spin_unlock_bh(&mhi_event->lock);
|
||||
goto exit_tsync_process;
|
||||
}
|
||||
|
||||
/* if rp points to base, we need to wrap it around */
|
||||
if (dev_rp == ev_ring->base)
|
||||
dev_rp = ev_ring->base + ev_ring->len;
|
||||
dev_rp--;
|
||||
|
||||
/* fast forward to currently processed element and recycle er */
|
||||
ev_ring->rp = dev_rp;
|
||||
ev_ring->wp = dev_rp - 1;
|
||||
if (ev_ring->wp < ev_ring->base)
|
||||
ev_ring->wp = ev_ring->base + ev_ring->len - ev_ring->el_size;
|
||||
mhi_recycle_fwd_ev_ring_element(mhi_cntrl, ev_ring);
|
||||
|
||||
MHI_ASSERT(MHI_TRE_GET_EV_TYPE(dev_rp) != MHI_PKT_TYPE_TSYNC_EVENT,
|
||||
"!TSYNC event");
|
||||
|
||||
sequence = MHI_TRE_GET_EV_TSYNC_SEQ(dev_rp);
|
||||
remote_time = MHI_TRE_GET_EV_TIME(dev_rp);
|
||||
|
||||
MHI_VERB("Received TSYNC event with seq:0x%llx time:0x%llx\n",
|
||||
sequence, remote_time);
|
||||
|
||||
read_lock_bh(&mhi_cntrl->pm_lock);
|
||||
if (likely(MHI_DB_ACCESS_VALID(mhi_cntrl)))
|
||||
mhi_ring_er_db(mhi_event);
|
||||
read_unlock_bh(&mhi_cntrl->pm_lock);
|
||||
spin_unlock_bh(&mhi_event->lock);
|
||||
|
||||
mutex_lock(&mhi_cntrl->tsync_mutex);
|
||||
|
||||
if (unlikely(mhi_tsync->int_sequence != sequence)) {
|
||||
MHI_ASSERT(1, "Unexpected response:0x%llx Expected:0x%llx\n",
|
||||
sequence, mhi_tsync->int_sequence);
|
||||
|
||||
mhi_device_put(mhi_cntrl->mhi_dev,
|
||||
MHI_VOTE_DEVICE | MHI_VOTE_BUS);
|
||||
|
||||
mutex_unlock(&mhi_cntrl->tsync_mutex);
|
||||
goto exit_tsync_process;
|
||||
}
|
||||
|
||||
do {
|
||||
struct tsync_node *tsync_node;
|
||||
|
||||
spin_lock(&mhi_tsync->lock);
|
||||
tsync_node = list_first_entry_or_null(&mhi_tsync->head,
|
||||
struct tsync_node, node);
|
||||
if (!tsync_node) {
|
||||
spin_unlock(&mhi_tsync->lock);
|
||||
break;
|
||||
}
|
||||
|
||||
list_del(&tsync_node->node);
|
||||
spin_unlock(&mhi_tsync->lock);
|
||||
|
||||
tsync_node->cb_func(tsync_node->mhi_dev,
|
||||
tsync_node->sequence,
|
||||
mhi_tsync->local_time, remote_time);
|
||||
kfree(tsync_node);
|
||||
} while (true);
|
||||
|
||||
mhi_tsync->db_response_pending = false;
|
||||
mhi_tsync->remote_time = remote_time;
|
||||
complete(&mhi_tsync->db_completion);
|
||||
|
||||
mhi_device_put(mhi_cntrl->mhi_dev, MHI_VOTE_DEVICE | MHI_VOTE_BUS);
|
||||
|
||||
mutex_unlock(&mhi_cntrl->tsync_mutex);
|
||||
|
||||
exit_tsync_process:
|
||||
MHI_VERB("exit er_index:%u\n", mhi_event->er_index);
|
||||
|
||||
return count;
|
||||
return ret;
|
||||
}
|
||||
|
||||
int mhi_process_bw_scale_ev_ring(struct mhi_controller *mhi_cntrl,
|
||||
@ -1437,29 +1481,12 @@ int mhi_process_bw_scale_ev_ring(struct mhi_controller *mhi_cntrl,
|
||||
struct mhi_link_info link_info, *cur_info = &mhi_cntrl->mhi_link_info;
|
||||
int result, ret = 0;
|
||||
|
||||
if (unlikely(MHI_EVENT_ACCESS_INVALID(mhi_cntrl->pm_state))) {
|
||||
MHI_LOG("No EV access, PM_STATE:%s\n",
|
||||
to_mhi_pm_state_str(mhi_cntrl->pm_state));
|
||||
ret = -EIO;
|
||||
goto exit_no_lock;
|
||||
}
|
||||
|
||||
ret = __mhi_device_get_sync(mhi_cntrl);
|
||||
if (ret)
|
||||
goto exit_no_lock;
|
||||
|
||||
mutex_lock(&mhi_cntrl->pm_mutex);
|
||||
|
||||
spin_lock_bh(&mhi_event->lock);
|
||||
dev_rp = mhi_to_virtual(ev_ring, er_ctxt->rp);
|
||||
|
||||
if (ev_ring->rp == dev_rp) {
|
||||
spin_unlock_bh(&mhi_event->lock);
|
||||
read_lock_bh(&mhi_cntrl->pm_lock);
|
||||
mhi_cntrl->wake_put(mhi_cntrl, false);
|
||||
read_unlock_bh(&mhi_cntrl->pm_lock);
|
||||
MHI_VERB("no pending event found\n");
|
||||
goto exit_bw_process;
|
||||
goto exit_bw_scale_process;
|
||||
}
|
||||
|
||||
/* if rp points to base, we need to wrap it around */
|
||||
@ -1467,6 +1494,13 @@ int mhi_process_bw_scale_ev_ring(struct mhi_controller *mhi_cntrl,
|
||||
dev_rp = ev_ring->base + ev_ring->len;
|
||||
dev_rp--;
|
||||
|
||||
/* fast forward to currently processed element and recycle er */
|
||||
ev_ring->rp = dev_rp;
|
||||
ev_ring->wp = dev_rp - 1;
|
||||
if (ev_ring->wp < ev_ring->base)
|
||||
ev_ring->wp = ev_ring->base + ev_ring->len - ev_ring->el_size;
|
||||
mhi_recycle_fwd_ev_ring_element(mhi_cntrl, ev_ring);
|
||||
|
||||
MHI_ASSERT(MHI_TRE_GET_EV_TYPE(dev_rp) != MHI_PKT_TYPE_BW_REQ_EVENT,
|
||||
"!BW SCALE REQ event");
|
||||
|
||||
@ -1479,19 +1513,19 @@ int mhi_process_bw_scale_ev_ring(struct mhi_controller *mhi_cntrl,
|
||||
link_info.target_link_speed,
|
||||
link_info.target_link_width);
|
||||
|
||||
/* fast forward to currently processed element and recycle er */
|
||||
ev_ring->rp = dev_rp;
|
||||
ev_ring->wp = dev_rp - 1;
|
||||
if (ev_ring->wp < ev_ring->base)
|
||||
ev_ring->wp = ev_ring->base + ev_ring->len - ev_ring->el_size;
|
||||
mhi_recycle_fwd_ev_ring_element(mhi_cntrl, ev_ring);
|
||||
|
||||
read_lock_bh(&mhi_cntrl->pm_lock);
|
||||
if (likely(MHI_DB_ACCESS_VALID(mhi_cntrl)))
|
||||
mhi_ring_er_db(mhi_event);
|
||||
read_unlock_bh(&mhi_cntrl->pm_lock);
|
||||
spin_unlock_bh(&mhi_event->lock);
|
||||
|
||||
ret = mhi_device_get_sync(mhi_cntrl->mhi_dev,
|
||||
MHI_VOTE_DEVICE | MHI_VOTE_BUS);
|
||||
if (ret)
|
||||
goto exit_bw_scale_process;
|
||||
|
||||
mutex_lock(&mhi_cntrl->pm_mutex);
|
||||
|
||||
ret = mhi_cntrl->bw_scale(mhi_cntrl, &link_info);
|
||||
if (!ret)
|
||||
*cur_info = link_info;
|
||||
@ -1501,17 +1535,16 @@ int mhi_process_bw_scale_ev_ring(struct mhi_controller *mhi_cntrl,
|
||||
read_lock_bh(&mhi_cntrl->pm_lock);
|
||||
if (likely(MHI_DB_ACCESS_VALID(mhi_cntrl)))
|
||||
mhi_cntrl->write_reg(mhi_cntrl, mhi_cntrl->bw_scale_db, 0,
|
||||
MHI_BW_SCALE_RESULT(result,
|
||||
link_info.sequence_num));
|
||||
|
||||
mhi_cntrl->wake_put(mhi_cntrl, false);
|
||||
MHI_BW_SCALE_RESULT(result,
|
||||
link_info.sequence_num));
|
||||
read_unlock_bh(&mhi_cntrl->pm_lock);
|
||||
|
||||
exit_bw_process:
|
||||
mhi_device_put(mhi_cntrl->mhi_dev, MHI_VOTE_DEVICE | MHI_VOTE_BUS);
|
||||
|
||||
mutex_unlock(&mhi_cntrl->pm_mutex);
|
||||
|
||||
exit_no_lock:
|
||||
MHI_VERB("exit er_index:%u\n", mhi_event->er_index);
|
||||
exit_bw_scale_process:
|
||||
MHI_VERB("exit er_index:%u ret:%d\n", mhi_event->er_index, ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -1615,8 +1648,6 @@ irqreturn_t mhi_intvec_threaded_handlr(int irq_number, void *dev)
|
||||
enum MHI_PM_STATE pm_state = 0;
|
||||
enum mhi_ee ee = 0;
|
||||
|
||||
MHI_VERB("Enter\n");
|
||||
|
||||
write_lock_irq(&mhi_cntrl->pm_lock);
|
||||
if (!MHI_REG_ACCESS_VALID(mhi_cntrl->pm_state)) {
|
||||
write_unlock_irq(&mhi_cntrl->pm_lock);
|
||||
@ -1630,20 +1661,20 @@ irqreturn_t mhi_intvec_threaded_handlr(int irq_number, void *dev)
|
||||
TO_MHI_EXEC_STR(ee),
|
||||
TO_MHI_STATE_STR(state));
|
||||
|
||||
if (mhi_cntrl->power_down) {
|
||||
write_unlock_irq(&mhi_cntrl->pm_lock);
|
||||
goto exit_intvec;
|
||||
}
|
||||
|
||||
if (state == MHI_STATE_SYS_ERR) {
|
||||
MHI_ERR("MHI system error detected\n");
|
||||
pm_state = mhi_tryset_pm_state(mhi_cntrl,
|
||||
MHI_PM_SYS_ERR_DETECT);
|
||||
}
|
||||
write_unlock_irq(&mhi_cntrl->pm_lock);
|
||||
|
||||
if (ee == MHI_EE_RDDM) {
|
||||
write_lock_irq(&mhi_cntrl->pm_lock);
|
||||
if (mhi_cntrl->rddm_supported) {
|
||||
/* exit as power down is already initiated */
|
||||
if (mhi_cntrl->power_down || ee != MHI_EE_RDDM) {
|
||||
write_unlock_irq(&mhi_cntrl->pm_lock);
|
||||
goto exit_intvec;
|
||||
}
|
||||
|
||||
/* prevent multiple entries for RDDM execution environment */
|
||||
if (mhi_cntrl->ee == MHI_EE_RDDM) {
|
||||
write_unlock_irq(&mhi_cntrl->pm_lock);
|
||||
goto exit_intvec;
|
||||
@ -1652,16 +1683,19 @@ irqreturn_t mhi_intvec_threaded_handlr(int irq_number, void *dev)
|
||||
write_unlock_irq(&mhi_cntrl->pm_lock);
|
||||
|
||||
MHI_ERR("RDDM event occurred!\n");
|
||||
mhi_cntrl->status_cb(mhi_cntrl, mhi_cntrl->priv_data,
|
||||
MHI_CB_EE_RDDM);
|
||||
wake_up_all(&mhi_cntrl->state_event);
|
||||
|
||||
/* notify critical clients with early notifications */
|
||||
mhi_control_error(mhi_cntrl);
|
||||
|
||||
mhi_cntrl->status_cb(mhi_cntrl, mhi_cntrl->priv_data,
|
||||
MHI_CB_EE_RDDM);
|
||||
wake_up_all(&mhi_cntrl->state_event);
|
||||
|
||||
goto exit_intvec;
|
||||
}
|
||||
|
||||
write_unlock_irq(&mhi_cntrl->pm_lock);
|
||||
|
||||
/* if device is in RDDM, don't bother processing SYS_ERR */
|
||||
if (ee != MHI_EE_RDDM && pm_state == MHI_PM_SYS_ERR_DETECT) {
|
||||
wake_up_all(&mhi_cntrl->state_event);
|
||||
@ -1675,8 +1709,6 @@ irqreturn_t mhi_intvec_threaded_handlr(int irq_number, void *dev)
|
||||
}
|
||||
|
||||
exit_intvec:
|
||||
MHI_VERB("Exit\n");
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
@ -1697,7 +1729,7 @@ irqreturn_t mhi_intvec_handlr(int irq_number, void *dev)
|
||||
MHI_VERB("Exit\n");
|
||||
|
||||
if (MHI_IN_MISSION_MODE(mhi_cntrl->ee))
|
||||
queue_work(mhi_cntrl->special_wq, &mhi_cntrl->special_work);
|
||||
queue_work(mhi_cntrl->wq, &mhi_cntrl->special_work);
|
||||
|
||||
return IRQ_WAKE_THREAD;
|
||||
}
|
||||
@ -1888,7 +1920,8 @@ int mhi_prepare_channel(struct mhi_controller *mhi_cntrl,
|
||||
return 0;
|
||||
|
||||
error_dec_pendpkt:
|
||||
atomic_dec(&mhi_cntrl->pending_pkts);
|
||||
if (in_mission_mode)
|
||||
atomic_dec(&mhi_cntrl->pending_pkts);
|
||||
error_pm_state:
|
||||
if (!mhi_chan->offload_ch)
|
||||
mhi_deinit_chan_ctxt(mhi_cntrl, mhi_chan);
|
||||
@ -2025,19 +2058,22 @@ static void __mhi_unprepare_channel(struct mhi_controller *mhi_cntrl,
|
||||
{
|
||||
int ret;
|
||||
bool in_mission_mode = false;
|
||||
bool notify = false;
|
||||
|
||||
MHI_LOG("Entered: unprepare channel:%d\n", mhi_chan->chan);
|
||||
|
||||
/* no more processing events for this channel */
|
||||
mutex_lock(&mhi_chan->mutex);
|
||||
write_lock_irq(&mhi_chan->lock);
|
||||
if (mhi_chan->ch_state != MHI_CH_STATE_ENABLED) {
|
||||
if (mhi_chan->ch_state != MHI_CH_STATE_ENABLED &&
|
||||
mhi_chan->ch_state != MHI_CH_STATE_SUSPENDED) {
|
||||
MHI_LOG("chan:%d is already disabled\n", mhi_chan->chan);
|
||||
write_unlock_irq(&mhi_chan->lock);
|
||||
mutex_unlock(&mhi_chan->mutex);
|
||||
return;
|
||||
}
|
||||
|
||||
if (mhi_chan->ch_state == MHI_CH_STATE_SUSPENDED)
|
||||
notify = true;
|
||||
mhi_chan->ch_state = MHI_CH_STATE_DISABLED;
|
||||
write_unlock_irq(&mhi_chan->lock);
|
||||
|
||||
@ -2078,11 +2114,73 @@ static void __mhi_unprepare_channel(struct mhi_controller *mhi_cntrl,
|
||||
if (!mhi_chan->offload_ch) {
|
||||
mhi_reset_chan(mhi_cntrl, mhi_chan);
|
||||
mhi_deinit_chan_ctxt(mhi_cntrl, mhi_chan);
|
||||
|
||||
/* notify waiters to proceed with unbinding channel */
|
||||
if (notify)
|
||||
wake_up_all(&mhi_cntrl->state_event);
|
||||
}
|
||||
MHI_LOG("chan:%d successfully resetted\n", mhi_chan->chan);
|
||||
mutex_unlock(&mhi_chan->mutex);
|
||||
}
|
||||
|
||||
int mhi_debugfs_mhi_regdump_show(struct seq_file *m, void *d)
|
||||
{
|
||||
struct mhi_controller *mhi_cntrl = m->private;
|
||||
enum mhi_dev_state state;
|
||||
enum mhi_ee ee;
|
||||
int i, ret;
|
||||
u32 val;
|
||||
void __iomem *mhi_base = mhi_cntrl->regs;
|
||||
void __iomem *bhi_base = mhi_cntrl->bhi;
|
||||
void __iomem *bhie_base = mhi_cntrl->bhie;
|
||||
void __iomem *wake_db = mhi_cntrl->wake_db;
|
||||
struct {
|
||||
const char *name;
|
||||
int offset;
|
||||
void __iomem *base;
|
||||
} debug_reg[] = {
|
||||
{ "BHI_ERRDBG2", BHI_ERRDBG2, bhi_base},
|
||||
{ "BHI_ERRDBG3", BHI_ERRDBG3, bhi_base},
|
||||
{ "BHI_ERRDBG1", BHI_ERRDBG1, bhi_base},
|
||||
{ "BHI_ERRCODE", BHI_ERRCODE, bhi_base},
|
||||
{ "BHI_EXECENV", BHI_EXECENV, bhi_base},
|
||||
{ "BHI_STATUS", BHI_STATUS, bhi_base},
|
||||
{ "MHI_CNTRL", MHICTRL, mhi_base},
|
||||
{ "MHI_STATUS", MHISTATUS, mhi_base},
|
||||
{ "MHI_WAKE_DB", 0, wake_db},
|
||||
{ "BHIE_TXVEC_DB", BHIE_TXVECDB_OFFS, bhie_base},
|
||||
{ "BHIE_TXVEC_STATUS", BHIE_TXVECSTATUS_OFFS, bhie_base},
|
||||
{ "BHIE_RXVEC_DB", BHIE_RXVECDB_OFFS, bhie_base},
|
||||
{ "BHIE_RXVEC_STATUS", BHIE_RXVECSTATUS_OFFS, bhie_base},
|
||||
{ NULL },
|
||||
};
|
||||
|
||||
if (!MHI_REG_ACCESS_VALID(mhi_cntrl->pm_state))
|
||||
return -EIO;
|
||||
|
||||
seq_printf(m, "host pm_state:%s dev_state:%s ee:%s\n",
|
||||
to_mhi_pm_state_str(mhi_cntrl->pm_state),
|
||||
TO_MHI_STATE_STR(mhi_cntrl->dev_state),
|
||||
TO_MHI_EXEC_STR(mhi_cntrl->ee));
|
||||
|
||||
state = mhi_get_mhi_state(mhi_cntrl);
|
||||
ee = mhi_get_exec_env(mhi_cntrl);
|
||||
|
||||
seq_printf(m, "device ee:%s dev_state:%s\n", TO_MHI_EXEC_STR(ee),
|
||||
TO_MHI_STATE_STR(state));
|
||||
|
||||
for (i = 0; debug_reg[i].name; i++) {
|
||||
if (!debug_reg[i].base)
|
||||
continue;
|
||||
ret = mhi_read_reg(mhi_cntrl, debug_reg[i].base,
|
||||
debug_reg[i].offset, &val);
|
||||
seq_printf(m, "reg:%s val:0x%x, ret:%d\n", debug_reg[i].name,
|
||||
val, ret);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int mhi_debugfs_mhi_states_show(struct seq_file *m, void *d)
|
||||
{
|
||||
struct mhi_controller *mhi_cntrl = m->private;
|
||||
@ -2290,7 +2388,8 @@ static int mhi_update_channel_state(struct mhi_controller *mhi_cntrl,
|
||||
mhi_chan->chan, cmd == MHI_CMD_START_CHAN ? "START" : "STOP");
|
||||
|
||||
/* if channel is not active state state do not allow to state change */
|
||||
if (mhi_chan->ch_state != MHI_CH_STATE_ENABLED) {
|
||||
if (mhi_chan->ch_state != MHI_CH_STATE_ENABLED &&
|
||||
mhi_chan->ch_state != MHI_CH_STATE_SUSPENDED) {
|
||||
ret = -EINVAL;
|
||||
MHI_LOG("channel:%d is not in active state, ch_state%d\n",
|
||||
mhi_chan->chan, mhi_chan->ch_state);
|
||||
@ -2473,13 +2572,37 @@ int mhi_get_remote_time_sync(struct mhi_device *mhi_dev,
|
||||
{
|
||||
struct mhi_controller *mhi_cntrl = mhi_dev->mhi_cntrl;
|
||||
struct mhi_timesync *mhi_tsync = mhi_cntrl->mhi_tsync;
|
||||
u64 local_time;
|
||||
int ret;
|
||||
|
||||
mutex_lock(&mhi_cntrl->tsync_mutex);
|
||||
/* not all devices support time features */
|
||||
if (!mhi_tsync) {
|
||||
ret = -EIO;
|
||||
goto error_unlock;
|
||||
if (!mhi_tsync)
|
||||
return -EINVAL;
|
||||
|
||||
if (unlikely(MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state))) {
|
||||
MHI_ERR("MHI is not in active state, pm_state:%s\n",
|
||||
to_mhi_pm_state_str(mhi_cntrl->pm_state));
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
mutex_lock(&mhi_cntrl->tsync_mutex);
|
||||
|
||||
/* return times from last async request completion */
|
||||
if (mhi_tsync->db_response_pending) {
|
||||
local_time = mhi_tsync->local_time;
|
||||
mutex_unlock(&mhi_cntrl->tsync_mutex);
|
||||
|
||||
ret = wait_for_completion_timeout(&mhi_tsync->db_completion,
|
||||
msecs_to_jiffies(mhi_cntrl->timeout_ms));
|
||||
if (MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state) || !ret) {
|
||||
MHI_ERR("Pending DB request did not complete, abort\n");
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
*t_host = local_time;
|
||||
*t_dev = mhi_tsync->remote_time;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* bring to M0 state */
|
||||
@ -2549,17 +2672,16 @@ int mhi_get_remote_time(struct mhi_device *mhi_dev,
|
||||
struct mhi_controller *mhi_cntrl = mhi_dev->mhi_cntrl;
|
||||
struct mhi_timesync *mhi_tsync = mhi_cntrl->mhi_tsync;
|
||||
struct tsync_node *tsync_node;
|
||||
int ret;
|
||||
int ret = 0;
|
||||
|
||||
/* not all devices support all time features */
|
||||
mutex_lock(&mhi_cntrl->tsync_mutex);
|
||||
if (!mhi_tsync || !mhi_tsync->db_support) {
|
||||
ret = -EIO;
|
||||
goto error_unlock;
|
||||
}
|
||||
if (!mhi_tsync || !mhi_tsync->db_support)
|
||||
return -EINVAL;
|
||||
|
||||
/* tsync db can only be rung in M0 state */
|
||||
ret = __mhi_device_get_sync(mhi_cntrl);
|
||||
mutex_lock(&mhi_cntrl->tsync_mutex);
|
||||
|
||||
ret = mhi_device_get_sync(mhi_cntrl->mhi_dev,
|
||||
MHI_VOTE_DEVICE | MHI_VOTE_BUS);
|
||||
if (ret)
|
||||
goto error_unlock;
|
||||
|
||||
@ -2573,6 +2695,10 @@ int mhi_get_remote_time(struct mhi_device *mhi_dev,
|
||||
}
|
||||
read_unlock_bh(&mhi_cntrl->pm_lock);
|
||||
|
||||
MHI_LOG("Enter with pm_state:%s MHI_STATE:%s\n",
|
||||
to_mhi_pm_state_str(mhi_cntrl->pm_state),
|
||||
TO_MHI_STATE_STR(mhi_cntrl->dev_state));
|
||||
|
||||
/*
|
||||
* technically we can use GFP_KERNEL, but wants to avoid
|
||||
* # of times scheduling out
|
||||
@ -2583,15 +2709,20 @@ int mhi_get_remote_time(struct mhi_device *mhi_dev,
|
||||
goto error_no_mem;
|
||||
}
|
||||
|
||||
tsync_node->sequence = sequence;
|
||||
tsync_node->cb_func = cb_func;
|
||||
tsync_node->mhi_dev = mhi_dev;
|
||||
|
||||
if (mhi_tsync->db_response_pending) {
|
||||
mhi_device_put(mhi_cntrl->mhi_dev,
|
||||
MHI_VOTE_DEVICE | MHI_VOTE_BUS);
|
||||
goto skip_tsync_db;
|
||||
}
|
||||
|
||||
mhi_tsync->int_sequence++;
|
||||
if (mhi_tsync->int_sequence == 0xFFFFFFFF)
|
||||
mhi_tsync->int_sequence = 0;
|
||||
|
||||
tsync_node->sequence = sequence;
|
||||
tsync_node->int_sequence = mhi_tsync->int_sequence;
|
||||
tsync_node->cb_func = cb_func;
|
||||
tsync_node->mhi_dev = mhi_dev;
|
||||
|
||||
/* disable link level low power modes */
|
||||
ret = mhi_cntrl->lpm_disable(mhi_cntrl, mhi_cntrl->priv_data);
|
||||
if (ret) {
|
||||
@ -2600,10 +2731,6 @@ int mhi_get_remote_time(struct mhi_device *mhi_dev,
|
||||
goto error_invalid_state;
|
||||
}
|
||||
|
||||
spin_lock(&mhi_tsync->lock);
|
||||
list_add_tail(&tsync_node->node, &mhi_tsync->head);
|
||||
spin_unlock(&mhi_tsync->lock);
|
||||
|
||||
/*
|
||||
* time critical code, delay between these two steps should be
|
||||
* deterministic as possible.
|
||||
@ -2611,9 +2738,9 @@ int mhi_get_remote_time(struct mhi_device *mhi_dev,
|
||||
preempt_disable();
|
||||
local_irq_disable();
|
||||
|
||||
tsync_node->local_time =
|
||||
mhi_tsync->local_time =
|
||||
mhi_cntrl->time_get(mhi_cntrl, mhi_cntrl->priv_data);
|
||||
writel_relaxed_no_log(tsync_node->int_sequence, mhi_cntrl->tsync_db);
|
||||
writel_relaxed_no_log(mhi_tsync->int_sequence, mhi_cntrl->tsync_db);
|
||||
/* write must go thru immediately */
|
||||
wmb();
|
||||
|
||||
@ -2622,15 +2749,24 @@ int mhi_get_remote_time(struct mhi_device *mhi_dev,
|
||||
|
||||
mhi_cntrl->lpm_enable(mhi_cntrl, mhi_cntrl->priv_data);
|
||||
|
||||
ret = 0;
|
||||
MHI_VERB("time DB request with seq:0x%llx\n", mhi_tsync->int_sequence);
|
||||
|
||||
mhi_tsync->db_response_pending = true;
|
||||
init_completion(&mhi_tsync->db_completion);
|
||||
|
||||
skip_tsync_db:
|
||||
spin_lock(&mhi_tsync->lock);
|
||||
list_add_tail(&tsync_node->node, &mhi_tsync->head);
|
||||
spin_unlock(&mhi_tsync->lock);
|
||||
|
||||
mutex_unlock(&mhi_cntrl->tsync_mutex);
|
||||
|
||||
return 0;
|
||||
|
||||
error_invalid_state:
|
||||
if (ret)
|
||||
kfree(tsync_node);
|
||||
kfree(tsync_node);
|
||||
error_no_mem:
|
||||
read_lock_bh(&mhi_cntrl->pm_lock);
|
||||
mhi_cntrl->wake_put(mhi_cntrl, false);
|
||||
read_unlock_bh(&mhi_cntrl->pm_lock);
|
||||
mhi_device_put(mhi_cntrl->mhi_dev, MHI_VOTE_DEVICE | MHI_VOTE_BUS);
|
||||
error_unlock:
|
||||
mutex_unlock(&mhi_cntrl->tsync_mutex);
|
||||
return ret;
|
||||
@ -2652,15 +2788,15 @@ void mhi_debug_reg_dump(struct mhi_controller *mhi_cntrl)
|
||||
int offset;
|
||||
void __iomem *base;
|
||||
} debug_reg[] = {
|
||||
{ "BHI_ERRDBG2", BHI_ERRDBG2, bhi_base},
|
||||
{ "BHI_ERRDBG3", BHI_ERRDBG3, bhi_base},
|
||||
{ "BHI_ERRDBG1", BHI_ERRDBG1, bhi_base},
|
||||
{ "BHI_ERRCODE", BHI_ERRCODE, bhi_base},
|
||||
{ "BHI_EXECENV", BHI_EXECENV, bhi_base},
|
||||
{ "BHI_STATUS", BHI_STATUS, bhi_base},
|
||||
{ "MHI_CNTRL", MHICTRL, mhi_base},
|
||||
{ "MHI_STATUS", MHISTATUS, mhi_base},
|
||||
{ "MHI_WAKE_DB", 0, wake_db},
|
||||
{ "BHI_EXECENV", BHI_EXECENV, bhi_base},
|
||||
{ "BHI_STATUS", BHI_STATUS, bhi_base},
|
||||
{ "BHI_ERRCODE", BHI_ERRCODE, bhi_base},
|
||||
{ "BHI_ERRDBG1", BHI_ERRDBG1, bhi_base},
|
||||
{ "BHI_ERRDBG2", BHI_ERRDBG2, bhi_base},
|
||||
{ "BHI_ERRDBG3", BHI_ERRDBG3, bhi_base},
|
||||
{ "BHIE_TXVEC_DB", BHIE_TXVECDB_OFFS, bhie_base},
|
||||
{ "BHIE_TXVEC_STATUS", BHIE_TXVECSTATUS_OFFS, bhie_base},
|
||||
{ "BHIE_RXVEC_DB", BHIE_RXVECDB_OFFS, bhie_base},
|
||||
@ -2680,6 +2816,8 @@ void mhi_debug_reg_dump(struct mhi_controller *mhi_cntrl)
|
||||
TO_MHI_STATE_STR(state));
|
||||
|
||||
for (i = 0; debug_reg[i].name; i++) {
|
||||
if (!debug_reg[i].base)
|
||||
continue;
|
||||
ret = mhi_read_reg(mhi_cntrl, debug_reg[i].base,
|
||||
debug_reg[i].offset, &val);
|
||||
MHI_LOG("reg:%s val:0x%x, ret:%d\n", debug_reg[i].name, val,
|
||||
|
@ -102,8 +102,9 @@ static struct mhi_pm_transitions const mhi_state_transitions[] = {
|
||||
},
|
||||
{
|
||||
MHI_PM_SYS_ERR_DETECT,
|
||||
MHI_PM_SYS_ERR_PROCESS | MHI_PM_SHUTDOWN_PROCESS |
|
||||
MHI_PM_LD_ERR_FATAL_DETECT | MHI_PM_SHUTDOWN_NO_ACCESS
|
||||
MHI_PM_DEVICE_ERR_DETECT | MHI_PM_SYS_ERR_PROCESS |
|
||||
MHI_PM_SHUTDOWN_PROCESS | MHI_PM_LD_ERR_FATAL_DETECT |
|
||||
MHI_PM_SHUTDOWN_NO_ACCESS
|
||||
},
|
||||
{
|
||||
MHI_PM_SYS_ERR_PROCESS,
|
||||
@ -256,7 +257,7 @@ int mhi_ready_state_transition(struct mhi_controller *mhi_cntrl)
|
||||
enum MHI_PM_STATE cur_state;
|
||||
int ret, i;
|
||||
|
||||
MHI_LOG("Waiting to enter READY state\n");
|
||||
MHI_CNTRL_LOG("Waiting to enter READY state\n");
|
||||
|
||||
/* wait for RESET to be cleared and READY bit to be set */
|
||||
wait_event_timeout(mhi_cntrl->state_event,
|
||||
@ -278,16 +279,16 @@ int mhi_ready_state_transition(struct mhi_controller *mhi_cntrl)
|
||||
if (reset || !ready)
|
||||
return -ETIMEDOUT;
|
||||
|
||||
MHI_LOG("Device in READY State\n");
|
||||
MHI_CNTRL_LOG("Device in READY State\n");
|
||||
write_lock_irq(&mhi_cntrl->pm_lock);
|
||||
cur_state = mhi_tryset_pm_state(mhi_cntrl, MHI_PM_POR);
|
||||
mhi_cntrl->dev_state = MHI_STATE_READY;
|
||||
write_unlock_irq(&mhi_cntrl->pm_lock);
|
||||
|
||||
if (cur_state != MHI_PM_POR) {
|
||||
MHI_ERR("Error moving to state %s from %s\n",
|
||||
to_mhi_pm_state_str(MHI_PM_POR),
|
||||
to_mhi_pm_state_str(cur_state));
|
||||
MHI_CNTRL_ERR("Error moving to state %s from %s\n",
|
||||
to_mhi_pm_state_str(MHI_PM_POR),
|
||||
to_mhi_pm_state_str(cur_state));
|
||||
return -EIO;
|
||||
}
|
||||
read_lock_bh(&mhi_cntrl->pm_lock);
|
||||
@ -296,7 +297,7 @@ int mhi_ready_state_transition(struct mhi_controller *mhi_cntrl)
|
||||
|
||||
ret = mhi_init_mmio(mhi_cntrl);
|
||||
if (ret) {
|
||||
MHI_ERR("Error programming mmio registers\n");
|
||||
MHI_CNTRL_ERR("Error programming mmio registers\n");
|
||||
goto error_mmio;
|
||||
}
|
||||
|
||||
@ -408,35 +409,42 @@ void mhi_pm_m1_transition(struct mhi_controller *mhi_cntrl)
|
||||
enum MHI_PM_STATE state;
|
||||
|
||||
write_lock_irq(&mhi_cntrl->pm_lock);
|
||||
/* Just check if we are racing with device_wake assertion */
|
||||
if (atomic_read(&mhi_cntrl->dev_wake))
|
||||
MHI_VERB("M2 transition request post dev_wake:%d\n",
|
||||
atomic_read(&mhi_cntrl->dev_wake));
|
||||
|
||||
/* if it fails, means we transition to M3 */
|
||||
state = mhi_tryset_pm_state(mhi_cntrl, MHI_PM_M2);
|
||||
if (state == MHI_PM_M2) {
|
||||
MHI_VERB("Entered M2 State\n");
|
||||
mhi_set_mhi_state(mhi_cntrl, MHI_STATE_M2);
|
||||
mhi_cntrl->dev_state = MHI_STATE_M2;
|
||||
mhi_cntrl->M2++;
|
||||
|
||||
write_unlock_irq(&mhi_cntrl->pm_lock);
|
||||
wake_up_all(&mhi_cntrl->state_event);
|
||||
|
||||
/* transfer pending, exit M2 immediately */
|
||||
if (unlikely(atomic_read(&mhi_cntrl->pending_pkts) ||
|
||||
atomic_read(&mhi_cntrl->dev_wake))) {
|
||||
MHI_VERB(
|
||||
"Exiting M2 Immediately, pending_pkts:%d dev_wake:%d\n",
|
||||
atomic_read(&mhi_cntrl->pending_pkts),
|
||||
atomic_read(&mhi_cntrl->dev_wake));
|
||||
read_lock_bh(&mhi_cntrl->pm_lock);
|
||||
mhi_cntrl->wake_get(mhi_cntrl, true);
|
||||
mhi_cntrl->wake_put(mhi_cntrl, true);
|
||||
read_unlock_bh(&mhi_cntrl->pm_lock);
|
||||
} else {
|
||||
mhi_cntrl->status_cb(mhi_cntrl, mhi_cntrl->priv_data,
|
||||
MHI_CB_IDLE);
|
||||
}
|
||||
} else {
|
||||
if (state != MHI_PM_M2) {
|
||||
/* Nothing to be done, handle M3 transition later */
|
||||
write_unlock_irq(&mhi_cntrl->pm_lock);
|
||||
return;
|
||||
}
|
||||
|
||||
MHI_VERB("Entered M2 State\n");
|
||||
mhi_set_mhi_state(mhi_cntrl, MHI_STATE_M2);
|
||||
mhi_cntrl->dev_state = MHI_STATE_M2;
|
||||
mhi_cntrl->M2++;
|
||||
|
||||
write_unlock_irq(&mhi_cntrl->pm_lock);
|
||||
wake_up_all(&mhi_cntrl->state_event);
|
||||
|
||||
/* transfer pending, exit M2 immediately */
|
||||
if (unlikely(atomic_read(&mhi_cntrl->pending_pkts) ||
|
||||
atomic_read(&mhi_cntrl->dev_wake))) {
|
||||
MHI_VERB(
|
||||
"Exiting M2 Immediately, pending_pkts:%d dev_wake:%d\n",
|
||||
atomic_read(&mhi_cntrl->pending_pkts),
|
||||
atomic_read(&mhi_cntrl->dev_wake));
|
||||
read_lock_bh(&mhi_cntrl->pm_lock);
|
||||
mhi_cntrl->wake_get(mhi_cntrl, true);
|
||||
mhi_cntrl->wake_put(mhi_cntrl, true);
|
||||
read_unlock_bh(&mhi_cntrl->pm_lock);
|
||||
return;
|
||||
}
|
||||
|
||||
mhi_cntrl->status_cb(mhi_cntrl, mhi_cntrl->priv_data, MHI_CB_IDLE);
|
||||
}
|
||||
|
||||
int mhi_pm_m3_transition(struct mhi_controller *mhi_cntrl)
|
||||
@ -468,17 +476,20 @@ static int mhi_pm_mission_mode_transition(struct mhi_controller *mhi_cntrl)
|
||||
enum mhi_ee ee = 0;
|
||||
struct mhi_event *mhi_event;
|
||||
|
||||
MHI_LOG("Processing Mission Mode Transition\n");
|
||||
MHI_CNTRL_LOG("Processing Mission Mode Transition\n");
|
||||
|
||||
write_lock_irq(&mhi_cntrl->pm_lock);
|
||||
if (MHI_REG_ACCESS_VALID(mhi_cntrl->pm_state))
|
||||
ee = mhi_get_exec_env(mhi_cntrl);
|
||||
write_unlock_irq(&mhi_cntrl->pm_lock);
|
||||
|
||||
if (!MHI_IN_MISSION_MODE(ee)) {
|
||||
MHI_ERR("Invalid EE:%s\n", TO_MHI_EXEC_STR(ee));
|
||||
MHI_CNTRL_ERR("Invalid EE:%s\n", TO_MHI_EXEC_STR(ee));
|
||||
mhi_cntrl->pm_state = MHI_PM_FW_DL_ERR;
|
||||
wake_up_all(&mhi_cntrl->state_event);
|
||||
write_unlock_irq(&mhi_cntrl->pm_lock);
|
||||
return -EIO;
|
||||
}
|
||||
write_unlock_irq(&mhi_cntrl->pm_lock);
|
||||
|
||||
mhi_cntrl->status_cb(mhi_cntrl, mhi_cntrl->priv_data,
|
||||
MHI_CB_EE_MISSION_MODE);
|
||||
@ -539,7 +550,7 @@ static int mhi_pm_mission_mode_transition(struct mhi_controller *mhi_cntrl)
|
||||
/* setup sysfs nodes for userspace votes */
|
||||
mhi_create_sysfs(mhi_cntrl);
|
||||
|
||||
MHI_LOG("Adding new devices\n");
|
||||
MHI_CNTRL_LOG("Adding new devices\n");
|
||||
|
||||
/* add supported devices */
|
||||
mhi_create_devices(mhi_cntrl);
|
||||
@ -550,7 +561,7 @@ static int mhi_pm_mission_mode_transition(struct mhi_controller *mhi_cntrl)
|
||||
mhi_cntrl->wake_put(mhi_cntrl, false);
|
||||
read_unlock_bh(&mhi_cntrl->pm_lock);
|
||||
|
||||
MHI_LOG("Exit with ret:%d\n", ret);
|
||||
MHI_CNTRL_LOG("Exit with ret:%d\n", ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -567,7 +578,8 @@ static void mhi_pm_disable_transition(struct mhi_controller *mhi_cntrl,
|
||||
struct mhi_sfr_info *sfr_info = mhi_cntrl->mhi_sfr;
|
||||
int ret, i;
|
||||
|
||||
MHI_LOG("Enter with from pm_state:%s MHI_STATE:%s to pm_state:%s\n",
|
||||
MHI_CNTRL_LOG(
|
||||
"Enter with from pm_state:%s MHI_STATE:%s to pm_state:%s\n",
|
||||
to_mhi_pm_state_str(mhi_cntrl->pm_state),
|
||||
TO_MHI_STATE_STR(mhi_cntrl->dev_state),
|
||||
to_mhi_pm_state_str(transition_state));
|
||||
@ -598,8 +610,8 @@ static void mhi_pm_disable_transition(struct mhi_controller *mhi_cntrl,
|
||||
|
||||
/* not handling sys_err, could be middle of shut down */
|
||||
if (cur_state != transition_state) {
|
||||
MHI_LOG("Failed to transition to state:0x%x from:0x%x\n",
|
||||
transition_state, cur_state);
|
||||
MHI_CNTRL_LOG("Failed to transition to state:0x%x from:0x%x\n",
|
||||
transition_state, cur_state);
|
||||
mutex_unlock(&mhi_cntrl->pm_mutex);
|
||||
return;
|
||||
}
|
||||
@ -608,7 +620,7 @@ static void mhi_pm_disable_transition(struct mhi_controller *mhi_cntrl,
|
||||
if (MHI_REG_ACCESS_VALID(prev_state)) {
|
||||
unsigned long timeout = msecs_to_jiffies(mhi_cntrl->timeout_ms);
|
||||
|
||||
MHI_LOG("Trigger device into MHI_RESET\n");
|
||||
MHI_CNTRL_LOG("Trigger device into MHI_RESET\n");
|
||||
|
||||
write_lock_irq(&mhi_cntrl->pm_lock);
|
||||
mhi_set_mhi_state(mhi_cntrl, MHI_STATE_RESET);
|
||||
@ -634,7 +646,8 @@ static void mhi_pm_disable_transition(struct mhi_controller *mhi_cntrl,
|
||||
mhi_cntrl->initiate_mhi_reset = false;
|
||||
}
|
||||
|
||||
MHI_LOG("Waiting for all pending event ring processing to complete\n");
|
||||
MHI_CNTRL_LOG(
|
||||
"Waiting for all pending event ring processing to complete\n");
|
||||
mhi_event = mhi_cntrl->mhi_event;
|
||||
for (i = 0; i < mhi_cntrl->total_ev_rings; i++, mhi_event++) {
|
||||
if (!mhi_event->request_irq)
|
||||
@ -644,7 +657,7 @@ static void mhi_pm_disable_transition(struct mhi_controller *mhi_cntrl,
|
||||
|
||||
mutex_unlock(&mhi_cntrl->pm_mutex);
|
||||
|
||||
MHI_LOG("Reset all active channels and remove mhi devices\n");
|
||||
MHI_CNTRL_LOG("Reset all active channels and remove mhi devices\n");
|
||||
device_for_each_child(mhi_cntrl->dev, NULL, mhi_destroy_device);
|
||||
|
||||
MHI_LOG("Finish resetting channels\n");
|
||||
@ -652,7 +665,7 @@ static void mhi_pm_disable_transition(struct mhi_controller *mhi_cntrl,
|
||||
/* remove support for userspace votes */
|
||||
mhi_destroy_sysfs(mhi_cntrl);
|
||||
|
||||
MHI_LOG("Waiting for all pending threads to complete\n");
|
||||
MHI_CNTRL_LOG("Waiting for all pending threads to complete\n");
|
||||
wake_up_all(&mhi_cntrl->state_event);
|
||||
flush_work(&mhi_cntrl->special_work);
|
||||
|
||||
@ -668,7 +681,7 @@ static void mhi_pm_disable_transition(struct mhi_controller *mhi_cntrl,
|
||||
MHI_ASSERT(atomic_read(&mhi_cntrl->pending_pkts), "pending_pkts != 0");
|
||||
|
||||
/* reset the ev rings and cmd rings */
|
||||
MHI_LOG("Resetting EV CTXT and CMD CTXT\n");
|
||||
MHI_CNTRL_LOG("Resetting EV CTXT and CMD CTXT\n");
|
||||
mhi_cmd = mhi_cntrl->mhi_cmd;
|
||||
cmd_ctxt = mhi_cntrl->mhi_ctxt->cmd_ctxt;
|
||||
for (i = 0; i < NR_OF_CMD_RINGS; i++, mhi_cmd++, cmd_ctxt++) {
|
||||
@ -704,25 +717,37 @@ static void mhi_pm_disable_transition(struct mhi_controller *mhi_cntrl,
|
||||
cur_state = mhi_tryset_pm_state(mhi_cntrl, MHI_PM_DISABLE);
|
||||
write_unlock_irq(&mhi_cntrl->pm_lock);
|
||||
if (unlikely(cur_state != MHI_PM_DISABLE))
|
||||
MHI_ERR("Error moving from pm state:%s to state:%s\n",
|
||||
MHI_CNTRL_ERR(
|
||||
"Error moving from pm state:%s to state:%s\n",
|
||||
to_mhi_pm_state_str(cur_state),
|
||||
to_mhi_pm_state_str(MHI_PM_DISABLE));
|
||||
}
|
||||
|
||||
MHI_LOG("Exit with pm_state:%s mhi_state:%s\n",
|
||||
to_mhi_pm_state_str(mhi_cntrl->pm_state),
|
||||
TO_MHI_STATE_STR(mhi_cntrl->dev_state));
|
||||
MHI_CNTRL_LOG("Exit with pm_state:%s mhi_state:%s\n",
|
||||
to_mhi_pm_state_str(mhi_cntrl->pm_state),
|
||||
TO_MHI_STATE_STR(mhi_cntrl->dev_state));
|
||||
|
||||
mutex_unlock(&mhi_cntrl->pm_mutex);
|
||||
}
|
||||
|
||||
int mhi_debugfs_trigger_soc_reset(void *data, u64 val)
|
||||
{
|
||||
struct mhi_controller *mhi_cntrl = data;
|
||||
|
||||
MHI_LOG("Trigger MHI SOC Reset\n");
|
||||
|
||||
mhi_perform_soc_reset(mhi_cntrl);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int mhi_debugfs_trigger_reset(void *data, u64 val)
|
||||
{
|
||||
struct mhi_controller *mhi_cntrl = data;
|
||||
enum MHI_PM_STATE cur_state;
|
||||
int ret;
|
||||
|
||||
MHI_LOG("Trigger MHI Reset\n");
|
||||
MHI_CNTRL_LOG("Trigger MHI Reset\n");
|
||||
|
||||
/* exit lpm first */
|
||||
mhi_cntrl->runtime_get(mhi_cntrl, mhi_cntrl->priv_data);
|
||||
@ -734,7 +759,8 @@ int mhi_debugfs_trigger_reset(void *data, u64 val)
|
||||
msecs_to_jiffies(mhi_cntrl->timeout_ms));
|
||||
|
||||
if (!ret || MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state)) {
|
||||
MHI_ERR("Did not enter M0 state, cur_state:%s pm_state:%s\n",
|
||||
MHI_CNTRL_ERR(
|
||||
"Did not enter M0 state, cur_state:%s pm_state:%s\n",
|
||||
TO_MHI_STATE_STR(mhi_cntrl->dev_state),
|
||||
to_mhi_pm_state_str(mhi_cntrl->pm_state));
|
||||
return -EIO;
|
||||
@ -766,7 +792,7 @@ static int mhi_queue_disable_transition(
|
||||
list_add_tail(&item->node, &mhi_cntrl->transition_list);
|
||||
spin_unlock_irqrestore(&mhi_cntrl->transition_lock, flags);
|
||||
|
||||
schedule_work(&mhi_cntrl->st_worker);
|
||||
queue_work(mhi_cntrl->wq, &mhi_cntrl->st_worker);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -786,7 +812,7 @@ int mhi_queue_state_transition(struct mhi_controller *mhi_cntrl,
|
||||
list_add_tail(&item->node, &mhi_cntrl->transition_list);
|
||||
spin_unlock_irqrestore(&mhi_cntrl->transition_lock, flags);
|
||||
|
||||
schedule_work(&mhi_cntrl->st_worker);
|
||||
queue_work(mhi_cntrl->wq, &mhi_cntrl->st_worker);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -802,8 +828,7 @@ static void mhi_special_events_pending(struct mhi_controller *mhi_cntrl)
|
||||
|
||||
spin_lock_bh(&mhi_event->lock);
|
||||
if (ev_ring->rp != mhi_to_virtual(ev_ring, er_ctxt->rp)) {
|
||||
queue_work(mhi_cntrl->special_wq,
|
||||
&mhi_cntrl->special_work);
|
||||
queue_work(mhi_cntrl->wq, &mhi_cntrl->special_work);
|
||||
spin_unlock_bh(&mhi_event->lock);
|
||||
break;
|
||||
}
|
||||
@ -823,6 +848,9 @@ void mhi_special_purpose_work(struct work_struct *work)
|
||||
TO_MHI_STATE_STR(mhi_cntrl->dev_state),
|
||||
TO_MHI_EXEC_STR(mhi_cntrl->ee));
|
||||
|
||||
if (unlikely(MHI_EVENT_ACCESS_INVALID(mhi_cntrl->pm_state)))
|
||||
return;
|
||||
|
||||
/* check special purpose event rings and process events */
|
||||
list_for_each_entry(mhi_event, &mhi_cntrl->sp_ev_rings, node)
|
||||
mhi_event->process_event(mhi_cntrl, mhi_event, U32_MAX);
|
||||
@ -834,8 +862,9 @@ void mhi_process_sys_err(struct mhi_controller *mhi_cntrl)
|
||||
* if controller supports rddm, we do not process sys error state,
|
||||
* instead we will jump directly to rddm state
|
||||
*/
|
||||
if (mhi_cntrl->rddm_image) {
|
||||
MHI_LOG("Controller supports RDDM, skipping SYS_ERR_PROCESS\n");
|
||||
if (mhi_cntrl->rddm_supported) {
|
||||
MHI_CNTRL_LOG(
|
||||
"Controller supports RDDM, skipping SYS_ERR_PROCESS\n");
|
||||
return;
|
||||
}
|
||||
|
||||
@ -859,8 +888,8 @@ void mhi_pm_st_worker(struct work_struct *work)
|
||||
|
||||
list_for_each_entry_safe(itr, tmp, &head, node) {
|
||||
list_del(&itr->node);
|
||||
MHI_LOG("Transition to state:%s\n",
|
||||
TO_MHI_STATE_TRANS_STR(itr->state));
|
||||
MHI_CNTRL_LOG("Transition to state:%s\n",
|
||||
TO_MHI_STATE_TRANS_STR(itr->state));
|
||||
|
||||
switch (itr->state) {
|
||||
case MHI_ST_TRANSITION_PBL:
|
||||
@ -897,7 +926,7 @@ int mhi_async_power_up(struct mhi_controller *mhi_cntrl)
|
||||
enum MHI_ST_TRANSITION next_state;
|
||||
struct mhi_device *mhi_dev = mhi_cntrl->mhi_dev;
|
||||
|
||||
MHI_LOG("Requested to power on\n");
|
||||
MHI_CNTRL_LOG("Requested to power on\n");
|
||||
|
||||
if (mhi_cntrl->msi_allocated < mhi_cntrl->total_ev_rings)
|
||||
return -EINVAL;
|
||||
@ -922,14 +951,14 @@ int mhi_async_power_up(struct mhi_controller *mhi_cntrl)
|
||||
/* setup device context */
|
||||
ret = mhi_init_dev_ctxt(mhi_cntrl);
|
||||
if (ret) {
|
||||
MHI_ERR("Error setting dev_context\n");
|
||||
MHI_CNTRL_ERR("Error setting dev_context\n");
|
||||
goto error_dev_ctxt;
|
||||
}
|
||||
}
|
||||
|
||||
ret = mhi_init_irq_setup(mhi_cntrl);
|
||||
if (ret) {
|
||||
MHI_ERR("Error setting up irq\n");
|
||||
MHI_CNTRL_ERR("Error setting up irq\n");
|
||||
goto error_setup_irq;
|
||||
}
|
||||
|
||||
@ -942,6 +971,13 @@ int mhi_async_power_up(struct mhi_controller *mhi_cntrl)
|
||||
goto error_bhi_offset;
|
||||
}
|
||||
|
||||
if (val >= mhi_cntrl->len) {
|
||||
ret = -ENODEV;
|
||||
write_unlock_irq(&mhi_cntrl->pm_lock);
|
||||
MHI_ERR("Invalid bhi offset:%x\n", val);
|
||||
goto error_bhi_offset;
|
||||
}
|
||||
|
||||
mhi_cntrl->bhi = mhi_cntrl->regs + val;
|
||||
|
||||
/* setup bhie offset if not set */
|
||||
@ -949,7 +985,14 @@ int mhi_async_power_up(struct mhi_controller *mhi_cntrl)
|
||||
ret = mhi_read_reg(mhi_cntrl, mhi_cntrl->regs, BHIEOFF, &val);
|
||||
if (ret) {
|
||||
write_unlock_irq(&mhi_cntrl->pm_lock);
|
||||
MHI_ERR("Error getting bhie offset\n");
|
||||
MHI_CNTRL_ERR("Error getting bhie offset\n");
|
||||
goto error_bhi_offset;
|
||||
}
|
||||
|
||||
if (val >= mhi_cntrl->len) {
|
||||
ret = -ENODEV;
|
||||
write_unlock_irq(&mhi_cntrl->pm_lock);
|
||||
MHI_ERR("Invalid bhie offset:%x\n", val);
|
||||
goto error_bhi_offset;
|
||||
}
|
||||
|
||||
@ -965,7 +1008,8 @@ int mhi_async_power_up(struct mhi_controller *mhi_cntrl)
|
||||
|
||||
/* confirm device is in valid exec env */
|
||||
if (!MHI_IN_PBL(current_ee) && current_ee != MHI_EE_AMSS) {
|
||||
MHI_ERR("Not a valid ee for power on\n");
|
||||
MHI_CNTRL_ERR("Not a valid EE for power on:%s\n",
|
||||
TO_MHI_EXEC_STR(current_ee));
|
||||
ret = -EIO;
|
||||
goto error_bhi_offset;
|
||||
}
|
||||
@ -980,7 +1024,7 @@ int mhi_async_power_up(struct mhi_controller *mhi_cntrl)
|
||||
|
||||
mutex_unlock(&mhi_cntrl->pm_mutex);
|
||||
|
||||
MHI_LOG("Power on setup success\n");
|
||||
MHI_CNTRL_LOG("Power on setup success\n");
|
||||
|
||||
return 0;
|
||||
|
||||
@ -1005,15 +1049,15 @@ void mhi_control_error(struct mhi_controller *mhi_cntrl)
|
||||
enum MHI_PM_STATE cur_state, transition_state;
|
||||
struct mhi_sfr_info *sfr_info = mhi_cntrl->mhi_sfr;
|
||||
|
||||
MHI_LOG("Enter with pm_state:%s MHI_STATE:%s\n",
|
||||
to_mhi_pm_state_str(mhi_cntrl->pm_state),
|
||||
TO_MHI_STATE_STR(mhi_cntrl->dev_state));
|
||||
MHI_CNTRL_LOG("Enter with pm_state:%s MHI_STATE:%s\n",
|
||||
to_mhi_pm_state_str(mhi_cntrl->pm_state),
|
||||
TO_MHI_STATE_STR(mhi_cntrl->dev_state));
|
||||
|
||||
/* copy subsystem failure reason string if supported */
|
||||
if (sfr_info && sfr_info->buf_addr) {
|
||||
memcpy(sfr_info->str, sfr_info->buf_addr, sfr_info->len);
|
||||
pr_err("mhi: %s sfr: %s\n", mhi_cntrl->name,
|
||||
sfr_info->buf_addr);
|
||||
MHI_CNTRL_ERR("mhi:%s sfr: %s\n", mhi_cntrl->name,
|
||||
sfr_info->buf_addr);
|
||||
}
|
||||
|
||||
/* link is not down if device is in RDDM */
|
||||
@ -1026,9 +1070,9 @@ void mhi_control_error(struct mhi_controller *mhi_cntrl)
|
||||
|
||||
/* proceed if we move to device error or are already in error state */
|
||||
if (!MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state)) {
|
||||
MHI_ERR("Failed to transition to state:%s from:%s\n",
|
||||
to_mhi_pm_state_str(transition_state),
|
||||
to_mhi_pm_state_str(cur_state));
|
||||
MHI_CNTRL_ERR("Failed to transition to state:%s from:%s\n",
|
||||
to_mhi_pm_state_str(transition_state),
|
||||
to_mhi_pm_state_str(cur_state));
|
||||
goto exit_control_error;
|
||||
}
|
||||
|
||||
@ -1041,9 +1085,9 @@ void mhi_control_error(struct mhi_controller *mhi_cntrl)
|
||||
device_for_each_child(mhi_cntrl->dev, NULL, mhi_early_notify_device);
|
||||
|
||||
exit_control_error:
|
||||
MHI_LOG("Exit with pm_state:%s MHI_STATE:%s\n",
|
||||
to_mhi_pm_state_str(mhi_cntrl->pm_state),
|
||||
TO_MHI_STATE_STR(mhi_cntrl->dev_state));
|
||||
MHI_CNTRL_LOG("Exit with pm_state:%s MHI_STATE:%s\n",
|
||||
to_mhi_pm_state_str(mhi_cntrl->pm_state),
|
||||
TO_MHI_STATE_STR(mhi_cntrl->dev_state));
|
||||
}
|
||||
EXPORT_SYMBOL(mhi_control_error);
|
||||
|
||||
@ -1061,7 +1105,7 @@ void mhi_power_down(struct mhi_controller *mhi_cntrl, bool graceful)
|
||||
cur_state = mhi_tryset_pm_state(mhi_cntrl,
|
||||
MHI_PM_LD_ERR_FATAL_DETECT);
|
||||
if (cur_state != MHI_PM_LD_ERR_FATAL_DETECT)
|
||||
MHI_ERR("Failed to move to state:%s from:%s\n",
|
||||
MHI_CNTRL_ERR("Failed to move to state:%s from:%s\n",
|
||||
to_mhi_pm_state_str(MHI_PM_LD_ERR_FATAL_DETECT),
|
||||
to_mhi_pm_state_str(mhi_cntrl->pm_state));
|
||||
transition_state = MHI_PM_SHUTDOWN_NO_ACCESS;
|
||||
@ -1072,7 +1116,7 @@ void mhi_power_down(struct mhi_controller *mhi_cntrl, bool graceful)
|
||||
|
||||
mhi_queue_disable_transition(mhi_cntrl, transition_state);
|
||||
|
||||
MHI_LOG("Wait for shutdown to complete\n");
|
||||
MHI_CNTRL_LOG("Wait for shutdown to complete\n");
|
||||
flush_work(&mhi_cntrl->st_worker);
|
||||
|
||||
mhi_deinit_debugfs(mhi_cntrl);
|
||||
@ -1087,6 +1131,10 @@ void mhi_power_down(struct mhi_controller *mhi_cntrl, bool graceful)
|
||||
}
|
||||
mhi_deinit_dev_ctxt(mhi_cntrl);
|
||||
}
|
||||
|
||||
/* reset set bhi and bhie to prevent reg access */
|
||||
mhi_cntrl->bhi = NULL;
|
||||
mhi_cntrl->bhie = NULL;
|
||||
}
|
||||
EXPORT_SYMBOL(mhi_power_down);
|
||||
|
||||
@ -1102,7 +1150,13 @@ int mhi_sync_power_up(struct mhi_controller *mhi_cntrl)
|
||||
MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state),
|
||||
msecs_to_jiffies(mhi_cntrl->timeout_ms));
|
||||
|
||||
return (MHI_IN_MISSION_MODE(mhi_cntrl->ee)) ? 0 : -ETIMEDOUT;
|
||||
if (!MHI_IN_MISSION_MODE(mhi_cntrl->ee)) {
|
||||
if (!mhi_cntrl->rddm_supported)
|
||||
mhi_power_down(mhi_cntrl, false);
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(mhi_sync_power_up);
|
||||
|
||||
@ -1223,6 +1277,7 @@ int mhi_pm_fast_suspend(struct mhi_controller *mhi_cntrl, bool notify_client)
|
||||
int ret;
|
||||
enum MHI_PM_STATE new_state;
|
||||
struct mhi_chan *itr, *tmp;
|
||||
struct mhi_device *mhi_dev = mhi_cntrl->mhi_dev;
|
||||
|
||||
read_lock_bh(&mhi_cntrl->pm_lock);
|
||||
if (mhi_cntrl->pm_state == MHI_PM_DISABLE) {
|
||||
@ -1237,7 +1292,8 @@ int mhi_pm_fast_suspend(struct mhi_controller *mhi_cntrl, bool notify_client)
|
||||
read_unlock_bh(&mhi_cntrl->pm_lock);
|
||||
|
||||
/* do a quick check to see if any pending votes to keep us busy */
|
||||
if (atomic_read(&mhi_cntrl->pending_pkts)) {
|
||||
if (atomic_read(&mhi_cntrl->pending_pkts) ||
|
||||
atomic_read(&mhi_dev->bus_vote)) {
|
||||
MHI_VERB("Busy, aborting M3\n");
|
||||
return -EBUSY;
|
||||
}
|
||||
@ -1256,7 +1312,8 @@ int mhi_pm_fast_suspend(struct mhi_controller *mhi_cntrl, bool notify_client)
|
||||
* Check the votes once more to see if we should abort
|
||||
* suspend.
|
||||
*/
|
||||
if (atomic_read(&mhi_cntrl->pending_pkts)) {
|
||||
if (atomic_read(&mhi_cntrl->pending_pkts) ||
|
||||
atomic_read(&mhi_dev->bus_vote)) {
|
||||
MHI_VERB("Busy, aborting M3\n");
|
||||
ret = -EBUSY;
|
||||
goto error_suspend;
|
||||
@ -1457,6 +1514,26 @@ int mhi_pm_fast_resume(struct mhi_controller *mhi_cntrl, bool notify_client)
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
if (mhi_cntrl->rddm_supported) {
|
||||
if (mhi_get_exec_env(mhi_cntrl) == MHI_EE_RDDM &&
|
||||
!mhi_cntrl->power_down) {
|
||||
mhi_cntrl->ee = MHI_EE_RDDM;
|
||||
write_unlock_irq(&mhi_cntrl->pm_lock);
|
||||
|
||||
MHI_ERR("RDDM event occurred!\n");
|
||||
|
||||
/* notify critical clients with early notifications */
|
||||
mhi_control_error(mhi_cntrl);
|
||||
|
||||
mhi_cntrl->status_cb(mhi_cntrl, mhi_cntrl->priv_data,
|
||||
MHI_CB_EE_RDDM);
|
||||
wake_up_all(&mhi_cntrl->state_event);
|
||||
|
||||
tasklet_enable(&mhi_cntrl->mhi_event->task);
|
||||
goto exit_pm_fast_resume;
|
||||
}
|
||||
}
|
||||
|
||||
/* restore the states */
|
||||
mhi_cntrl->pm_state = mhi_cntrl->saved_pm_state;
|
||||
mhi_cntrl->dev_state = mhi_cntrl->saved_dev_state;
|
||||
@ -1500,6 +1577,7 @@ int mhi_pm_fast_resume(struct mhi_controller *mhi_cntrl, bool notify_client)
|
||||
/* schedules worker if any special purpose events need to be handled */
|
||||
mhi_special_events_pending(mhi_cntrl);
|
||||
|
||||
exit_pm_fast_resume:
|
||||
MHI_LOG("Exit with pm_state:%s dev_state:%s\n",
|
||||
to_mhi_pm_state_str(mhi_cntrl->pm_state),
|
||||
TO_MHI_STATE_STR(mhi_cntrl->dev_state));
|
||||
@ -1552,6 +1630,7 @@ void mhi_device_get(struct mhi_device *mhi_dev, int vote)
|
||||
|
||||
if (vote & MHI_VOTE_DEVICE) {
|
||||
read_lock_bh(&mhi_cntrl->pm_lock);
|
||||
mhi_trigger_resume(mhi_cntrl);
|
||||
mhi_cntrl->wake_get(mhi_cntrl, true);
|
||||
MHI_LOG("dev_wake %d\n", atomic_read(&mhi_cntrl->dev_wake));
|
||||
read_unlock_bh(&mhi_cntrl->pm_lock);
|
||||
@ -1596,6 +1675,67 @@ int mhi_device_get_sync(struct mhi_device *mhi_dev, int vote)
|
||||
}
|
||||
EXPORT_SYMBOL(mhi_device_get_sync);
|
||||
|
||||
int mhi_device_get_sync_atomic(struct mhi_device *mhi_dev, int timeout_us,
|
||||
bool in_panic)
|
||||
{
|
||||
struct mhi_controller *mhi_cntrl = mhi_dev->mhi_cntrl;
|
||||
|
||||
read_lock_bh(&mhi_cntrl->pm_lock);
|
||||
if (MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state)) {
|
||||
read_unlock_bh(&mhi_cntrl->pm_lock);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
mhi_cntrl->wake_get(mhi_cntrl, true);
|
||||
read_unlock_bh(&mhi_cntrl->pm_lock);
|
||||
|
||||
atomic_inc(&mhi_dev->dev_vote);
|
||||
pm_wakeup_hard_event(&mhi_cntrl->mhi_dev->dev);
|
||||
mhi_cntrl->runtime_get(mhi_cntrl, mhi_cntrl->priv_data);
|
||||
|
||||
/* Return if client doesn't want us to wait */
|
||||
if (!timeout_us) {
|
||||
if (mhi_cntrl->pm_state != MHI_PM_M0)
|
||||
MHI_ERR("Return without waiting for M0\n");
|
||||
|
||||
mhi_cntrl->runtime_put(mhi_cntrl, mhi_cntrl->priv_data);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (in_panic) {
|
||||
while (mhi_get_mhi_state(mhi_cntrl) != MHI_STATE_M0 &&
|
||||
!MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state) &&
|
||||
timeout_us > 0) {
|
||||
udelay(MHI_FORCE_WAKE_DELAY_US);
|
||||
timeout_us -= MHI_FORCE_WAKE_DELAY_US;
|
||||
}
|
||||
} else {
|
||||
while (mhi_cntrl->pm_state != MHI_PM_M0 &&
|
||||
!MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state) &&
|
||||
timeout_us > 0) {
|
||||
udelay(MHI_FORCE_WAKE_DELAY_US);
|
||||
timeout_us -= MHI_FORCE_WAKE_DELAY_US;
|
||||
}
|
||||
}
|
||||
|
||||
if (MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state) || timeout_us <= 0) {
|
||||
MHI_ERR("Did not enter M0 state, cur_state:%s pm_state:%s\n",
|
||||
TO_MHI_STATE_STR(mhi_cntrl->dev_state),
|
||||
to_mhi_pm_state_str(mhi_cntrl->pm_state));
|
||||
read_lock_bh(&mhi_cntrl->pm_lock);
|
||||
mhi_cntrl->wake_put(mhi_cntrl, false);
|
||||
read_unlock_bh(&mhi_cntrl->pm_lock);
|
||||
atomic_dec(&mhi_dev->dev_vote);
|
||||
mhi_cntrl->runtime_put(mhi_cntrl, mhi_cntrl->priv_data);
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
mhi_cntrl->runtime_put(mhi_cntrl, mhi_cntrl->priv_data);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(mhi_device_get_sync_atomic);
|
||||
|
||||
void mhi_device_put(struct mhi_device *mhi_dev, int vote)
|
||||
{
|
||||
struct mhi_controller *mhi_cntrl = mhi_dev->mhi_cntrl;
|
||||
@ -1628,27 +1768,31 @@ int mhi_force_rddm_mode(struct mhi_controller *mhi_cntrl)
|
||||
{
|
||||
int ret;
|
||||
|
||||
MHI_LOG("Enter with pm_state:%s ee:%s\n",
|
||||
to_mhi_pm_state_str(mhi_cntrl->pm_state),
|
||||
TO_MHI_EXEC_STR(mhi_cntrl->ee));
|
||||
MHI_CNTRL_LOG("Enter with pm_state:%s ee:%s\n",
|
||||
to_mhi_pm_state_str(mhi_cntrl->pm_state),
|
||||
TO_MHI_EXEC_STR(mhi_cntrl->ee));
|
||||
|
||||
/* device does not support RDDM */
|
||||
if (!mhi_cntrl->rddm_supported)
|
||||
return -EINVAL;
|
||||
|
||||
/* device already in rddm */
|
||||
if (mhi_cntrl->ee == MHI_EE_RDDM)
|
||||
return 0;
|
||||
|
||||
MHI_LOG("Triggering SYS_ERR to force rddm state\n");
|
||||
MHI_CNTRL_LOG("Triggering SYS_ERR to force rddm state\n");
|
||||
mhi_set_mhi_state(mhi_cntrl, MHI_STATE_SYS_ERR);
|
||||
|
||||
/* wait for rddm event */
|
||||
MHI_LOG("Waiting for device to enter RDDM state\n");
|
||||
MHI_CNTRL_LOG("Waiting for device to enter RDDM state\n");
|
||||
ret = wait_event_timeout(mhi_cntrl->state_event,
|
||||
mhi_cntrl->ee == MHI_EE_RDDM,
|
||||
msecs_to_jiffies(mhi_cntrl->timeout_ms));
|
||||
ret = ret ? 0 : -EIO;
|
||||
|
||||
MHI_LOG("Exiting with pm_state:%s ee:%s ret:%d\n",
|
||||
to_mhi_pm_state_str(mhi_cntrl->pm_state),
|
||||
TO_MHI_EXEC_STR(mhi_cntrl->ee), ret);
|
||||
MHI_CNTRL_LOG("Exiting with pm_state:%s ee:%s ret:%d\n",
|
||||
to_mhi_pm_state_str(mhi_cntrl->pm_state),
|
||||
TO_MHI_EXEC_STR(mhi_cntrl->ee), ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -469,6 +469,14 @@ config MSM_ADSPRPC
|
||||
applications/compute DSP processor.
|
||||
Say M if you want to enable this module.
|
||||
|
||||
config MSM_RDBG
|
||||
tristate "QTI Remote debug driver"
|
||||
help
|
||||
Implements a shared memory based transport mechanism that allows
|
||||
for a debugger running on a host PC to communicate with a remote
|
||||
stub running on peripheral subsystems such as the ADSP, MODEM etc.
|
||||
Say M if you want to enable this module.
|
||||
|
||||
config ADI
|
||||
tristate "SPARC Privileged ADI driver"
|
||||
depends on SPARC64
|
||||
|
@ -52,3 +52,4 @@ ifdef CONFIG_COMPAT
|
||||
endif
|
||||
obj-$(CONFIG_MSM_ADSPRPC) += frpc-adsprpc.o
|
||||
obj-$(CONFIG_ADI) += adi.o
|
||||
obj-$(CONFIG_MSM_RDBG) += rdbg.o
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -313,7 +313,7 @@ static int compat_get_fastrpc_ioctl_invoke2(
|
||||
{
|
||||
int err = 0;
|
||||
compat_uptr_t pparam;
|
||||
compat_uint_t req, size;
|
||||
compat_uint_t req, size, ref_size = 0;
|
||||
struct fastrpc_ioctl_invoke2 __user *inv2_user = NULL;
|
||||
struct fastrpc_ioctl_invoke_async __user *asyncinv_user;
|
||||
|
||||
@ -362,9 +362,13 @@ static int compat_get_fastrpc_ioctl_invoke2(
|
||||
break;
|
||||
}
|
||||
case FASTRPC_INVOKE2_ASYNC_RESPONSE:
|
||||
ref_size = sizeof(struct fastrpc_ioctl_async_response);
|
||||
/* intentional fall through */
|
||||
case FASTRPC_INVOKE2_KERNEL_OPTIMIZATIONS:
|
||||
{
|
||||
VERIFY(err,
|
||||
size == sizeof(struct fastrpc_ioctl_async_response));
|
||||
if (!ref_size)
|
||||
ref_size = sizeof(uint32_t);
|
||||
VERIFY(err, size == ref_size);
|
||||
if (err) {
|
||||
err = -EBADE;
|
||||
goto bail;
|
||||
@ -384,7 +388,7 @@ static int compat_get_fastrpc_ioctl_invoke2(
|
||||
break;
|
||||
}
|
||||
default:
|
||||
err = -EBADRQC;
|
||||
err = -ENOTTY;
|
||||
break;
|
||||
}
|
||||
*inva = inv2_user;
|
||||
@ -739,7 +743,7 @@ static int compat_fastrpc_get_dsp_info(struct file *filp,
|
||||
unsigned long arg)
|
||||
{
|
||||
struct compat_fastrpc_ioctl_capability __user *info32;
|
||||
struct fastrpc_ioctl_capability *info;
|
||||
struct fastrpc_ioctl_capability __user *info;
|
||||
compat_uint_t u;
|
||||
long ret;
|
||||
int err = 0;
|
||||
@ -752,6 +756,10 @@ static int compat_fastrpc_get_dsp_info(struct file *filp,
|
||||
|
||||
err = get_user(u, &info32->domain);
|
||||
err |= put_user(u, &info->domain);
|
||||
|
||||
err = get_user(u, &info32->attribute_ID);
|
||||
err |= put_user(u, &info->attribute_ID);
|
||||
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@ -983,6 +991,6 @@ long compat_fastrpc_device_ioctl(struct file *filp, unsigned int cmd,
|
||||
case COMPAT_FASTRPC_IOCTL_MUNMAP:
|
||||
return compat_fastrpc_mmap_device_ioctl(filp, cmd, arg);
|
||||
default:
|
||||
return -ENOIOCTLCMD;
|
||||
return -ENOTTY;
|
||||
}
|
||||
}
|
||||
|
@ -105,8 +105,9 @@
|
||||
#define REMOTE_SCALARS_MAKE(method, in, out) \
|
||||
REMOTE_SCALARS_MAKEX(0, method, in, out, 0, 0)
|
||||
|
||||
|
||||
#ifndef VERIFY_PRINT_ERROR
|
||||
#ifdef VERIFY_PRINT_ERROR
|
||||
#define VERIFY_EPRINTF(format, ...) pr_err(format, ##__VA_ARGS__)
|
||||
#else
|
||||
#define VERIFY_EPRINTF(format, args) (void)0
|
||||
#endif
|
||||
|
||||
@ -118,19 +119,35 @@
|
||||
#define __STR__(x) #x ":"
|
||||
#define __TOSTR__(x) __STR__(x)
|
||||
#define __FILE_LINE__ __FILE__ ":" __TOSTR__(__LINE__)
|
||||
#define __ADSPRPC_LINE__ "adsprpc:" __TOSTR__(__LINE__)
|
||||
|
||||
#define VERIFY(err, val) \
|
||||
do {\
|
||||
VERIFY_IPRINTF(__FILE_LINE__"info: calling: " #val "\n");\
|
||||
if ((val) == 0) {\
|
||||
(err) = (err) == 0 ? -1 : (err);\
|
||||
VERIFY_EPRINTF(__FILE_LINE__"error: %d: " #val "\n", (err));\
|
||||
VERIFY_EPRINTF(__ADSPRPC_LINE__" error: %d: "#val "\n", (err));\
|
||||
} else {\
|
||||
VERIFY_IPRINTF(__FILE_LINE__"info: passed: " #val "\n");\
|
||||
} \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
#define ADSPRPC_ERR(fmt, args...)\
|
||||
pr_err("Error: adsprpc (%d): %s: %s: " fmt, __LINE__,\
|
||||
current->comm, __func__, ##args)
|
||||
#define ADSPRPC_INFO(fmt, args...)\
|
||||
pr_info("Info: adsprpc (%d): %s: %s: " fmt, __LINE__,\
|
||||
current->comm, __func__, ##args)
|
||||
#define ADSPRPC_WARN(fmt, args...)\
|
||||
pr_warn("Warning: adsprpc (%d): %s: %s: " fmt, __LINE__,\
|
||||
current->comm, __func__, ##args)
|
||||
#define ADSPRPC_DEBUG(fmt, args...)\
|
||||
pr_debug("Debug: adsprpc (%d): %s: %s: " fmt, __LINE__,\
|
||||
current->comm, __func__, ##args)
|
||||
|
||||
#define DEBUG_PRINT_SIZE_LIMIT (512*1024)
|
||||
|
||||
#define remote_arg64_t union remote_arg64
|
||||
|
||||
struct remote_buf64 {
|
||||
@ -214,6 +231,7 @@ struct fastrpc_ioctl_async_response {
|
||||
enum fastrpc_invoke2_type {
|
||||
FASTRPC_INVOKE2_ASYNC = 1,
|
||||
FASTRPC_INVOKE2_ASYNC_RESPONSE = 2,
|
||||
FASTRPC_INVOKE2_KERNEL_OPTIMIZATIONS,
|
||||
};
|
||||
|
||||
struct fastrpc_ioctl_invoke2 {
|
||||
@ -343,6 +361,27 @@ struct fastrpc_ioctl_mem_unmap {
|
||||
};
|
||||
};
|
||||
|
||||
/*
|
||||
* This enum is shared with DSP. So, existing values should NOT
|
||||
* be modified. Only new members can be added.
|
||||
*/
|
||||
enum dsp_map_flags {
|
||||
/* Add memory to static PD pool, protection thru XPU */
|
||||
ADSP_MMAP_HEAP_ADDR = 4,
|
||||
|
||||
/* Add memory to static PD pool, protection thru hypervisor */
|
||||
ADSP_MMAP_REMOTE_HEAP_ADDR = 8,
|
||||
|
||||
/* Add memory to userPD pool, for user heap */
|
||||
ADSP_MMAP_ADD_PAGES = 0x1000,
|
||||
|
||||
/* Add memory to userPD pool, for LLC heap */
|
||||
ADSP_MMAP_ADD_PAGES_LLC = 0x3000,
|
||||
|
||||
/* Map persistent header buffer on DSP */
|
||||
ADSP_MMAP_PERSIST_HDR = 0x4000,
|
||||
};
|
||||
|
||||
struct fastrpc_ioctl_perf { /* kernel performance data */
|
||||
uintptr_t data;
|
||||
uint32_t numkeys;
|
||||
@ -355,6 +394,8 @@ enum fastrpc_control_type {
|
||||
FASTRPC_CONTROL_KALLOC = 3,
|
||||
FASTRPC_CONTROL_WAKELOCK = 4,
|
||||
FASTRPC_CONTROL_PM = 5,
|
||||
/* Clean process on DSP */
|
||||
FASTRPC_CONTROL_DSPPROCESS_CLEAN = 6,
|
||||
};
|
||||
|
||||
struct fastrpc_ctrl_latency {
|
||||
@ -385,7 +426,7 @@ struct fastrpc_ioctl_control {
|
||||
};
|
||||
|
||||
#define FASTRPC_MAX_DSP_ATTRIBUTES (256)
|
||||
#define FASTRPC_MAX_ATTRIBUTES (257)
|
||||
#define FASTRPC_MAX_ATTRIBUTES (258)
|
||||
#define ASYNC_FASTRPC_CAP (9)
|
||||
|
||||
struct fastrpc_ioctl_capability {
|
||||
|
@ -1,6 +1,6 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
menuconfig AGP
|
||||
tristate "/dev/agpgart (AGP Support)"
|
||||
bool "/dev/agpgart (AGP Support)"
|
||||
depends on ALPHA || IA64 || PARISC || PPC || X86
|
||||
depends on PCI
|
||||
help
|
||||
|
1212
drivers/char/rdbg.c
Normal file
1212
drivers/char/rdbg.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -62,7 +62,7 @@ config QCOM_CLK_RPM
|
||||
|
||||
config QCOM_CLK_SMD_RPM
|
||||
tristate "RPM over SMD based Clock Controller"
|
||||
depends on QCOM_SMD_RPM
|
||||
depends on MSM_RPM_SMD
|
||||
select QCOM_RPMCC
|
||||
help
|
||||
The RPM (Resource Power Manager) is a dedicated hardware engine for
|
||||
@ -639,4 +639,94 @@ config MSM_CAMCC_WAIPIO
|
||||
Say Y if you want to support camera devices and functionality such as
|
||||
capturing pictures.
|
||||
|
||||
config SM_VIDEOCC_SHIMA
|
||||
tristate "SHIMA Video Clock Controller"
|
||||
depends on SM_GCC_SHIMA
|
||||
help
|
||||
Support for the video clock controller on Qualcomm Technologies, Inc.
|
||||
SHIMA devices.
|
||||
Say Y if you want to support video devices and functionality such as
|
||||
video encode/decode.
|
||||
|
||||
config SM_CAMCC_SHIMA
|
||||
tristate "Shima Camera Clock Controller"
|
||||
depends on SM_GCC_SHIMA
|
||||
help
|
||||
Support for the camera clock controller on Qualcomm Technologies, Inc.
|
||||
SHIMA devices.
|
||||
Say Y if you want to support camera devices and functionality such as
|
||||
capturing pictures.
|
||||
|
||||
config SM_GPUCC_SHIMA
|
||||
tristate "SHIMA Graphics Clock Controller"
|
||||
depends on SM_GCC_SHIMA
|
||||
help
|
||||
Support for the graphics clock controller on Qualcomm Technologies, Inc.
|
||||
SHIMA devices.
|
||||
Say Y if you want to support graphics controller devices and
|
||||
functionality such as 3D graphics.
|
||||
|
||||
config SM_GPUCC_HOLI
|
||||
tristate "HOLI Graphics Clock Controller"
|
||||
select SM_GCC_HOLI
|
||||
help
|
||||
Support for the graphics clock controller on Qualcomm Technologies,
|
||||
Inc. HOLI devices.
|
||||
Say Y if you want to support graphics controller devices and
|
||||
functionality such as 3D graphics.
|
||||
|
||||
config SM_DISPCC_SHIMA
|
||||
tristate "SHIMA Display Clock Controller"
|
||||
depends on SM_GCC_SHIMA
|
||||
help
|
||||
Support for the display clock controller on Qualcomm Technologies, Inc.
|
||||
Shima devices.
|
||||
Say Y if you want to support display devices and functionality such as
|
||||
splash screen.
|
||||
|
||||
config SM_DEBUGCC_SHIMA
|
||||
tristate "SHIMA Debug Clock Controller"
|
||||
depends on SM_GCC_SHIMA
|
||||
help
|
||||
Support for the debug clock controller on Qualcomm Technologies, Inc.
|
||||
Shima devices.
|
||||
Say Y if you want to support the debug clocks such as clock measurement
|
||||
functionality.
|
||||
|
||||
config SM_DISPCC_HOLI
|
||||
tristate "HOLI Display Clock Controller"
|
||||
select SM_GCC_HOLI
|
||||
help
|
||||
Support for the display clock controller on Qualcomm Technologies,
|
||||
Inc. HOLI devices.
|
||||
Say Y if you want to support display devices and functionality such as
|
||||
splash screen.
|
||||
|
||||
config SM_DEBUGCC_HOLI
|
||||
tristate "HOLI Debug Clock Controller"
|
||||
depends on SM_GCC_HOLI
|
||||
help
|
||||
Support for the debug clock controller on Qualcomm Technologies, Inc.
|
||||
HOLI devices.
|
||||
Say Y if you want to support the debug clocks such as
|
||||
clock measurement functionality.
|
||||
|
||||
config SDX_GCC_LEMUR
|
||||
tristate "SDXLEMUR Global Clock Controller"
|
||||
depends on COMMON_CLK_QCOM
|
||||
help
|
||||
Support for the global clock controller on Qualcomm Technologies, Inc.
|
||||
SDXLEMUR devices.
|
||||
Say Y if you want to use peripheral devices such as UART, SPI, I2C,
|
||||
USB, UFS, SD/eMMC, PCIe, etc.
|
||||
|
||||
config SDX_DEBUGCC_LEMUR
|
||||
tristate "SDXLEMUR Debug Clock Controller"
|
||||
depends on COMMON_CLK_QCOM
|
||||
help
|
||||
Support for the debug clock controller on Qualcomm Technologies, Inc.
|
||||
sdxlemur devices.
|
||||
Say Y if you want to support the debug clocks such as
|
||||
clock measurement functionality.
|
||||
|
||||
endif
|
||||
|
@ -5,6 +5,7 @@ clk-qcom-y += common.o
|
||||
clk-qcom-y += vdd-class.o
|
||||
clk-qcom-y += clk-regmap.o
|
||||
clk-qcom-y += clk-alpha-pll.o
|
||||
clk-qcom-y += clk-opp.o
|
||||
clk-qcom-y += clk-pll.o
|
||||
clk-qcom-y += clk-rcg.o
|
||||
clk-qcom-y += clk-rcg2.o
|
||||
@ -77,6 +78,13 @@ obj-$(CONFIG_SDM_GPUCC_845) += gpucc-sdm845.o
|
||||
obj-$(CONFIG_SDM_LPASSCC_845) += lpasscc-sdm845.o
|
||||
obj-$(CONFIG_SDM_VIDEOCC_845) += videocc-sdm845.o
|
||||
obj-$(CONFIG_SM_DISPCC_8250) += dispcc-sm8250.o
|
||||
obj-$(CONFIG_SDX_DEBUGCC_LEMUR) += debugcc-sdxlemur.o
|
||||
obj-$(CONFIG_SDX_GCC_LEMUR) += gcc-sdxlemur.o
|
||||
obj-$(CONFIG_SM_CAMCC_SHIMA) += camcc-shima.o
|
||||
obj-$(CONFIG_SM_DEBUGCC_HOLI) += debugcc-holi.o
|
||||
obj-$(CONFIG_SM_DEBUGCC_SHIMA) += debugcc-shima.o
|
||||
obj-$(CONFIG_SM_DISPCC_HOLI) += dispcc-holi.o
|
||||
obj-$(CONFIG_SM_DISPCC_SHIMA) += dispcc-shima.o
|
||||
obj-$(CONFIG_SM_GCC_8150) += gcc-sm8150.o
|
||||
obj-$(CONFIG_SM_GCC_HOLI) += gcc-holi.o
|
||||
obj-$(CONFIG_SM_GCC_SHIMA) += gcc-shima.o
|
||||
@ -90,6 +98,9 @@ obj-$(CONFIG_SM_GPUCC_8150) += gpucc-sm8150.o
|
||||
obj-$(CONFIG_SM_GPUCC_8250) += gpucc-sm8250.o
|
||||
obj-$(CONFIG_SM_VIDEOCC_8150) += videocc-sm8150.o
|
||||
obj-$(CONFIG_SM_VIDEOCC_8250) += videocc-sm8250.o
|
||||
obj-$(CONFIG_SM_GPUCC_HOLI) += gpucc-holi.o
|
||||
obj-$(CONFIG_SM_GPUCC_SHIMA) += gpucc-shima.o
|
||||
obj-$(CONFIG_SM_VIDEOCC_SHIMA) += videocc-shima.o
|
||||
obj-$(CONFIG_SPMI_PMIC_CLKDIV) += clk-spmi-pmic-div.o
|
||||
obj-$(CONFIG_KPSS_XCC) += kpss-xcc.o
|
||||
obj-$(CONFIG_QCOM_HFPLL) += hfpll.o
|
||||
|
@ -1,6 +1,6 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (c) 2019, The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2019-2020, The Linux Foundation. All rights reserved.
|
||||
*/
|
||||
|
||||
#include <linux/clk.h>
|
||||
@ -10,6 +10,7 @@
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
|
||||
#include <dt-bindings/clock/qcom,camcc-lahaina.h>
|
||||
|
||||
@ -24,8 +25,13 @@
|
||||
#include "reset.h"
|
||||
#include "vdd-level.h"
|
||||
|
||||
static DEFINE_VDD_REGULATORS(vdd_mm, VDD_NUM, 1, vdd_corner);
|
||||
static DEFINE_VDD_REGULATORS(vdd_mx, VDD_NUM, 1, vdd_corner);
|
||||
static DEFINE_VDD_REGULATORS(vdd_mm, VDD_NOMINAL + 1, 1, vdd_corner);
|
||||
static DEFINE_VDD_REGULATORS(vdd_mx, VDD_HIGH + 1, 1, vdd_corner);
|
||||
|
||||
static struct clk_vdd_class *cam_cc_lahaina_regulators[] = {
|
||||
&vdd_mm,
|
||||
&vdd_mx,
|
||||
};
|
||||
|
||||
enum {
|
||||
P_BI_TCXO,
|
||||
@ -44,7 +50,7 @@ enum {
|
||||
};
|
||||
|
||||
static struct pll_vco lucid_5lpe_vco[] = {
|
||||
{ 249600000, 2000000000, 0 },
|
||||
{ 249600000, 1750000000, 0 },
|
||||
};
|
||||
|
||||
static struct pll_vco zonda_5lpe_vco[] = {
|
||||
@ -57,7 +63,10 @@ static const struct alpha_pll_config cam_cc_pll0_config = {
|
||||
.alpha = 0x8000,
|
||||
.config_ctl_val = 0x20485699,
|
||||
.config_ctl_hi_val = 0x00002261,
|
||||
.config_ctl_hi1_val = 0x029A699C,
|
||||
.config_ctl_hi1_val = 0x2A9A699C,
|
||||
.test_ctl_val = 0x00000000,
|
||||
.test_ctl_hi_val = 0x00000000,
|
||||
.test_ctl_hi1_val = 0x01800000,
|
||||
.user_ctl_val = 0x00003100,
|
||||
.user_ctl_hi_val = 0x00000805,
|
||||
.user_ctl_hi1_val = 0x00000000,
|
||||
@ -84,8 +93,8 @@ static struct clk_alpha_pll cam_cc_pll0 = {
|
||||
.rate_max = (unsigned long[VDD_NUM]) {
|
||||
[VDD_MIN] = 615000000,
|
||||
[VDD_LOW] = 1066000000,
|
||||
[VDD_LOW_L1] = 1600000000,
|
||||
[VDD_NOMINAL] = 2000000000},
|
||||
[VDD_LOW_L1] = 1500000000,
|
||||
[VDD_NOMINAL] = 1750000000},
|
||||
},
|
||||
},
|
||||
};
|
||||
@ -142,7 +151,10 @@ static const struct alpha_pll_config cam_cc_pll1_config = {
|
||||
.alpha = 0x4000,
|
||||
.config_ctl_val = 0x20485699,
|
||||
.config_ctl_hi_val = 0x00002261,
|
||||
.config_ctl_hi1_val = 0x029A699C,
|
||||
.config_ctl_hi1_val = 0x2A9A699C,
|
||||
.test_ctl_val = 0x00000000,
|
||||
.test_ctl_hi_val = 0x00000000,
|
||||
.test_ctl_hi1_val = 0x01800000,
|
||||
.user_ctl_val = 0x00000100,
|
||||
.user_ctl_hi_val = 0x00000805,
|
||||
.user_ctl_hi1_val = 0x00000000,
|
||||
@ -169,8 +181,8 @@ static struct clk_alpha_pll cam_cc_pll1 = {
|
||||
.rate_max = (unsigned long[VDD_NUM]) {
|
||||
[VDD_MIN] = 615000000,
|
||||
[VDD_LOW] = 1066000000,
|
||||
[VDD_LOW_L1] = 1600000000,
|
||||
[VDD_NOMINAL] = 2000000000},
|
||||
[VDD_LOW_L1] = 1500000000,
|
||||
[VDD_NOMINAL] = 1750000000},
|
||||
},
|
||||
},
|
||||
};
|
||||
@ -207,6 +219,15 @@ static const struct alpha_pll_config cam_cc_pll2_config = {
|
||||
.config_ctl_hi1_val = 0x00000000,
|
||||
};
|
||||
|
||||
static const struct alpha_pll_config cam_cc_pll2_config_sm8350_v2 = {
|
||||
.l = 0x32,
|
||||
.cal_l = 0x32,
|
||||
.alpha = 0x0,
|
||||
.config_ctl_val = 0x08200800,
|
||||
.config_ctl_hi_val = 0x05028011,
|
||||
.config_ctl_hi1_val = 0x08000000,
|
||||
};
|
||||
|
||||
static struct clk_alpha_pll cam_cc_pll2 = {
|
||||
.offset = 0x2000,
|
||||
.vco_table = zonda_5lpe_vco,
|
||||
@ -240,7 +261,10 @@ static const struct alpha_pll_config cam_cc_pll3_config = {
|
||||
.alpha = 0x3555,
|
||||
.config_ctl_val = 0x20485699,
|
||||
.config_ctl_hi_val = 0x00002261,
|
||||
.config_ctl_hi1_val = 0x029A699C,
|
||||
.config_ctl_hi1_val = 0x2A9A699C,
|
||||
.test_ctl_val = 0x00000000,
|
||||
.test_ctl_hi_val = 0x00000000,
|
||||
.test_ctl_hi1_val = 0x01800000,
|
||||
.user_ctl_val = 0x00000100,
|
||||
.user_ctl_hi_val = 0x00000805,
|
||||
.user_ctl_hi1_val = 0x00000000,
|
||||
@ -267,8 +291,8 @@ static struct clk_alpha_pll cam_cc_pll3 = {
|
||||
.rate_max = (unsigned long[VDD_NUM]) {
|
||||
[VDD_MIN] = 615000000,
|
||||
[VDD_LOW] = 1066000000,
|
||||
[VDD_LOW_L1] = 1600000000,
|
||||
[VDD_NOMINAL] = 2000000000},
|
||||
[VDD_LOW_L1] = 1500000000,
|
||||
[VDD_NOMINAL] = 1750000000},
|
||||
},
|
||||
},
|
||||
};
|
||||
@ -302,7 +326,10 @@ static const struct alpha_pll_config cam_cc_pll4_config = {
|
||||
.alpha = 0x3555,
|
||||
.config_ctl_val = 0x20485699,
|
||||
.config_ctl_hi_val = 0x00002261,
|
||||
.config_ctl_hi1_val = 0x029A699C,
|
||||
.config_ctl_hi1_val = 0x2A9A699C,
|
||||
.test_ctl_val = 0x00000000,
|
||||
.test_ctl_hi_val = 0x00000000,
|
||||
.test_ctl_hi1_val = 0x01800000,
|
||||
.user_ctl_val = 0x00000100,
|
||||
.user_ctl_hi_val = 0x00000805,
|
||||
.user_ctl_hi1_val = 0x00000000,
|
||||
@ -329,8 +356,8 @@ static struct clk_alpha_pll cam_cc_pll4 = {
|
||||
.rate_max = (unsigned long[VDD_NUM]) {
|
||||
[VDD_MIN] = 615000000,
|
||||
[VDD_LOW] = 1066000000,
|
||||
[VDD_LOW_L1] = 1600000000,
|
||||
[VDD_NOMINAL] = 2000000000},
|
||||
[VDD_LOW_L1] = 1500000000,
|
||||
[VDD_NOMINAL] = 1750000000},
|
||||
},
|
||||
},
|
||||
};
|
||||
@ -364,7 +391,10 @@ static const struct alpha_pll_config cam_cc_pll5_config = {
|
||||
.alpha = 0x3555,
|
||||
.config_ctl_val = 0x20485699,
|
||||
.config_ctl_hi_val = 0x00002261,
|
||||
.config_ctl_hi1_val = 0x029A699C,
|
||||
.config_ctl_hi1_val = 0x2A9A699C,
|
||||
.test_ctl_val = 0x00000000,
|
||||
.test_ctl_hi_val = 0x00000000,
|
||||
.test_ctl_hi1_val = 0x01800000,
|
||||
.user_ctl_val = 0x00000100,
|
||||
.user_ctl_hi_val = 0x00000805,
|
||||
.user_ctl_hi1_val = 0x00000000,
|
||||
@ -391,8 +421,8 @@ static struct clk_alpha_pll cam_cc_pll5 = {
|
||||
.rate_max = (unsigned long[VDD_NUM]) {
|
||||
[VDD_MIN] = 615000000,
|
||||
[VDD_LOW] = 1066000000,
|
||||
[VDD_LOW_L1] = 1600000000,
|
||||
[VDD_NOMINAL] = 2000000000},
|
||||
[VDD_LOW_L1] = 1500000000,
|
||||
[VDD_NOMINAL] = 1750000000},
|
||||
},
|
||||
},
|
||||
};
|
||||
@ -426,7 +456,10 @@ static const struct alpha_pll_config cam_cc_pll6_config = {
|
||||
.alpha = 0x0,
|
||||
.config_ctl_val = 0x20485699,
|
||||
.config_ctl_hi_val = 0x00002261,
|
||||
.config_ctl_hi1_val = 0x029A699C,
|
||||
.config_ctl_hi1_val = 0x2A9A699C,
|
||||
.test_ctl_val = 0x00000000,
|
||||
.test_ctl_hi_val = 0x00000000,
|
||||
.test_ctl_hi1_val = 0x01800000,
|
||||
.user_ctl_val = 0x00000100,
|
||||
.user_ctl_hi_val = 0x00000805,
|
||||
.user_ctl_hi1_val = 0x00000000,
|
||||
@ -453,8 +486,8 @@ static struct clk_alpha_pll cam_cc_pll6 = {
|
||||
.rate_max = (unsigned long[VDD_NUM]) {
|
||||
[VDD_MIN] = 615000000,
|
||||
[VDD_LOW] = 1066000000,
|
||||
[VDD_LOW_L1] = 1600000000,
|
||||
[VDD_NOMINAL] = 2000000000},
|
||||
[VDD_LOW_L1] = 1500000000,
|
||||
[VDD_NOMINAL] = 1750000000},
|
||||
},
|
||||
},
|
||||
};
|
||||
@ -1899,24 +1932,6 @@ static struct clk_branch cam_cc_csiphy5_clk = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch cam_cc_gdsc_clk = {
|
||||
.halt_reg = 0xc148,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0xc148,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "cam_cc_gdsc_clk",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.hw = &cam_cc_xo_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_IS_CRITICAL | CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch cam_cc_icp_ahb_clk = {
|
||||
.halt_reg = 0xc094,
|
||||
.halt_check = BRANCH_HALT,
|
||||
@ -2834,7 +2849,6 @@ static struct clk_regmap *cam_cc_lahaina_clocks[] = {
|
||||
[CAM_CC_CSIPHY4_CLK] = &cam_cc_csiphy4_clk.clkr,
|
||||
[CAM_CC_CSIPHY5_CLK] = &cam_cc_csiphy5_clk.clkr,
|
||||
[CAM_CC_FAST_AHB_CLK_SRC] = &cam_cc_fast_ahb_clk_src.clkr,
|
||||
[CAM_CC_GDSC_CLK] = &cam_cc_gdsc_clk.clkr,
|
||||
[CAM_CC_ICP_AHB_CLK] = &cam_cc_icp_ahb_clk.clkr,
|
||||
[CAM_CC_ICP_CLK] = &cam_cc_icp_clk.clkr,
|
||||
[CAM_CC_ICP_CLK_SRC] = &cam_cc_icp_clk_src.clkr,
|
||||
@ -2940,54 +2954,64 @@ static const struct regmap_config cam_cc_lahaina_regmap_config = {
|
||||
.fast_io = true,
|
||||
};
|
||||
|
||||
static const struct qcom_cc_desc cam_cc_lahaina_desc = {
|
||||
static struct qcom_cc_desc cam_cc_lahaina_desc = {
|
||||
.config = &cam_cc_lahaina_regmap_config,
|
||||
.clks = cam_cc_lahaina_clocks,
|
||||
.num_clks = ARRAY_SIZE(cam_cc_lahaina_clocks),
|
||||
.resets = cam_cc_lahaina_resets,
|
||||
.num_resets = ARRAY_SIZE(cam_cc_lahaina_resets),
|
||||
.clk_regulators = cam_cc_lahaina_regulators,
|
||||
.num_clk_regulators = ARRAY_SIZE(cam_cc_lahaina_regulators),
|
||||
};
|
||||
|
||||
static const struct of_device_id cam_cc_lahaina_match_table[] = {
|
||||
{ .compatible = "qcom,lahaina-camcc" },
|
||||
{ .compatible = "qcom,lahaina-camcc-v2" },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, cam_cc_lahaina_match_table);
|
||||
|
||||
static void cam_cc_lahaina_fixup_lahainav2(struct regmap *regmap)
|
||||
{
|
||||
clk_zonda_5lpe_pll_configure(&cam_cc_pll2, regmap,
|
||||
&cam_cc_pll2_config_sm8350_v2);
|
||||
}
|
||||
|
||||
static int cam_cc_lahaina_fixup(struct platform_device *pdev,
|
||||
struct regmap *regmap)
|
||||
{
|
||||
const char *compat = NULL;
|
||||
int compatlen = 0;
|
||||
|
||||
compat = of_get_property(pdev->dev.of_node, "compatible", &compatlen);
|
||||
if (!compat || (compatlen <= 0))
|
||||
return -EINVAL;
|
||||
|
||||
if (!strcmp(compat, "qcom,lahaina-camcc-v2"))
|
||||
cam_cc_lahaina_fixup_lahainav2(regmap);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cam_cc_lahaina_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct regmap *regmap;
|
||||
struct clk *clk;
|
||||
int ret;
|
||||
|
||||
clk = devm_clk_get(&pdev->dev, "cfg_ahb_clk");
|
||||
if (IS_ERR(clk)) {
|
||||
if (PTR_ERR(clk) != -EPROBE_DEFER)
|
||||
dev_err(&pdev->dev, "Unable to get ahb clock handle\n");
|
||||
return PTR_ERR(clk);
|
||||
}
|
||||
devm_clk_put(&pdev->dev, clk);
|
||||
|
||||
vdd_mm.regulator[0] = devm_regulator_get(&pdev->dev, "vdd_mm");
|
||||
if (IS_ERR(vdd_mm.regulator[0])) {
|
||||
if (PTR_ERR(vdd_mm.regulator[0]) != -EPROBE_DEFER)
|
||||
dev_err(&pdev->dev, "Unable to get vdd_mm regulator\n");
|
||||
return PTR_ERR(vdd_mm.regulator[0]);
|
||||
}
|
||||
|
||||
vdd_mx.regulator[0] = devm_regulator_get(&pdev->dev, "vdd_mx");
|
||||
if (IS_ERR(vdd_mx.regulator[0])) {
|
||||
if (PTR_ERR(vdd_mx.regulator[0]) != -EPROBE_DEFER)
|
||||
dev_err(&pdev->dev, "Unable to get vdd_mx regulator\n");
|
||||
return PTR_ERR(vdd_mx.regulator[0]);
|
||||
}
|
||||
|
||||
regmap = qcom_cc_map(pdev, &cam_cc_lahaina_desc);
|
||||
if (IS_ERR(regmap)) {
|
||||
dev_err(&pdev->dev, "Failed to map cam CC registers\n");
|
||||
return PTR_ERR(regmap);
|
||||
}
|
||||
|
||||
ret = qcom_cc_runtime_init(pdev, &cam_cc_lahaina_desc);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = pm_runtime_get_sync(&pdev->dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
clk_lucid_5lpe_pll_configure(&cam_cc_pll0, regmap, &cam_cc_pll0_config);
|
||||
clk_lucid_5lpe_pll_configure(&cam_cc_pll1, regmap, &cam_cc_pll1_config);
|
||||
clk_zonda_5lpe_pll_configure(&cam_cc_pll2, regmap, &cam_cc_pll2_config);
|
||||
@ -2996,12 +3020,23 @@ static int cam_cc_lahaina_probe(struct platform_device *pdev)
|
||||
clk_lucid_5lpe_pll_configure(&cam_cc_pll5, regmap, &cam_cc_pll5_config);
|
||||
clk_lucid_5lpe_pll_configure(&cam_cc_pll6, regmap, &cam_cc_pll6_config);
|
||||
|
||||
ret = cam_cc_lahaina_fixup(pdev, regmap);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/*
|
||||
* Keep clocks always enabled:
|
||||
* cam_cc_gdsc_clk
|
||||
*/
|
||||
regmap_update_bits(regmap, 0xc148, BIT(0), BIT(0));
|
||||
|
||||
ret = qcom_cc_really_probe(pdev, &cam_cc_lahaina_desc, regmap);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "Failed to register CAM CC clocks\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
pm_runtime_put_sync(&pdev->dev);
|
||||
dev_info(&pdev->dev, "Registered CAM CC clocks\n");
|
||||
|
||||
return ret;
|
||||
@ -3012,12 +3047,17 @@ static void cam_cc_lahaina_sync_state(struct device *dev)
|
||||
qcom_cc_sync_state(dev, &cam_cc_lahaina_desc);
|
||||
}
|
||||
|
||||
static const struct dev_pm_ops cam_cc_lahaina_pm_ops = {
|
||||
SET_RUNTIME_PM_OPS(qcom_cc_runtime_suspend, qcom_cc_runtime_resume, NULL)
|
||||
};
|
||||
|
||||
static struct platform_driver cam_cc_lahaina_driver = {
|
||||
.probe = cam_cc_lahaina_probe,
|
||||
.driver = {
|
||||
.name = "lahaina-cam_cc",
|
||||
.of_match_table = cam_cc_lahaina_match_table,
|
||||
.sync_state = cam_cc_lahaina_sync_state,
|
||||
.pm = &cam_cc_lahaina_pm_ops,
|
||||
},
|
||||
};
|
||||
|
||||
|
2833
drivers/clk/qcom/camcc-shima.c
Normal file
2833
drivers/clk/qcom/camcc-shima.c
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,6 +1,6 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Copyright (c) 2015-2016, 2018-2019, The Linux Foundation.
|
||||
* Copyright (c) 2015-2016, 2018-2020 The Linux Foundation.
|
||||
* All rights reserved.
|
||||
*/
|
||||
|
||||
@ -21,6 +21,8 @@ enum {
|
||||
CLK_ALPHA_PLL_TYPE_ZONDA,
|
||||
CLK_ALPHA_PLL_TYPE_LUCID_5LPE,
|
||||
CLK_ALPHA_PLL_TYPE_ZONDA_5LPE,
|
||||
CLK_ALPHA_PLL_TYPE_REGERA,
|
||||
CLK_ALPHA_PLL_TYPE_AGERA,
|
||||
CLK_ALPHA_PLL_TYPE_LUCID_EVO,
|
||||
CLK_ALPHA_PLL_TYPE_RIVIAN_EVO,
|
||||
CLK_ALPHA_PLL_TYPE_MAX,
|
||||
@ -45,6 +47,9 @@ enum {
|
||||
PLL_OFF_OPMODE,
|
||||
PLL_OFF_FRAC,
|
||||
PLL_OFF_CAL_VAL,
|
||||
PLL_OFF_SSC_DELTA_ALPHA,
|
||||
PLL_OFF_SSC_NUM_STEPS,
|
||||
PLL_OFF_SSC_UPDATE_RATE,
|
||||
PLL_OFF_MAX_REGS
|
||||
};
|
||||
|
||||
@ -78,6 +83,7 @@ struct clk_alpha_pll {
|
||||
#define SUPPORTS_OFFLINE_REQ BIT(0)
|
||||
#define SUPPORTS_FSM_MODE BIT(2)
|
||||
#define SUPPORTS_DYNAMIC_UPDATE BIT(3)
|
||||
#define SUPPORTS_FSM_LEGACY_MODE BIT(4)
|
||||
u8 flags;
|
||||
|
||||
struct clk_regmap clkr;
|
||||
@ -170,10 +176,22 @@ extern const struct clk_ops clk_alpha_pll_postdiv_lucid_evo_ops;
|
||||
extern const struct clk_ops clk_alpha_pll_lucid_evo_ops;
|
||||
extern const struct clk_ops clk_alpha_pll_rivian_evo_ops;
|
||||
|
||||
extern const struct clk_ops clk_regera_pll_ops;
|
||||
extern const struct clk_ops clk_agera_pll_ops;
|
||||
|
||||
extern const struct clk_ops clk_alpha_pll_fixed_lucid_evo_ops;
|
||||
extern const struct clk_ops clk_alpha_pll_postdiv_lucid_evo_ops;
|
||||
extern const struct clk_ops clk_alpha_pll_lucid_evo_ops;
|
||||
|
||||
void clk_alpha_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap,
|
||||
const struct alpha_pll_config *config);
|
||||
void clk_fabia_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap,
|
||||
int clk_fabia_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap,
|
||||
const struct alpha_pll_config *config);
|
||||
int clk_trion_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap,
|
||||
const struct alpha_pll_config *config);
|
||||
#define clk_lucid_pll_configure(pll, regmap, config) \
|
||||
clk_trion_pll_configure(pll, regmap, config)
|
||||
|
||||
int clk_zonda_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap,
|
||||
const struct alpha_pll_config *config);
|
||||
int clk_lucid_5lpe_pll_configure(struct clk_alpha_pll *pll,
|
||||
@ -182,13 +200,13 @@ int clk_lucid_5lpe_pll_configure(struct clk_alpha_pll *pll,
|
||||
int clk_zonda_5lpe_pll_configure(struct clk_alpha_pll *pll,
|
||||
struct regmap *regmap,
|
||||
const struct alpha_pll_config *config);
|
||||
int clk_regera_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap,
|
||||
const struct alpha_pll_config *config);
|
||||
int clk_agera_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap,
|
||||
const struct alpha_pll_config *config);
|
||||
int clk_lucid_evo_pll_configure(struct clk_alpha_pll *pll,
|
||||
struct regmap *regmap,
|
||||
const struct alpha_pll_config *config);
|
||||
void clk_trion_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap,
|
||||
const struct alpha_pll_config *config);
|
||||
#define clk_lucid_pll_configure(pll, regmap, config) \
|
||||
clk_trion_pll_configure(pll, regmap, config)
|
||||
int clk_rivian_evo_pll_configure(struct clk_alpha_pll *pll,
|
||||
struct regmap *regmap,
|
||||
const struct alpha_pll_config *config);
|
||||
|
@ -1,6 +1,6 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2017-2020, The Linux Foundation. All rights reserved.
|
||||
*/
|
||||
|
||||
#define pr_fmt(fmt) "%s: " fmt, __func__
|
||||
@ -13,6 +13,7 @@
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/mailbox_client.h>
|
||||
#include <linux/mailbox_controller.h>
|
||||
#include <dt-bindings/clock/qcom,aop-qmp.h>
|
||||
|
||||
#define MAX_LEN 96
|
||||
@ -217,10 +218,43 @@ DEFINE_CLK_AOP_QMP(qdss_qmp_clk, clock, qdss, QDSS_CLK_LEVEL_DYNAMIC,
|
||||
QDSS_CLK_LEVEL_OFF, 0);
|
||||
DEFINE_CLK_AOP_QMP(qdss_ao_qmp_clk, clock, qdss_ao, QDSS_CLK_LEVEL_DYNAMIC,
|
||||
QDSS_CLK_LEVEL_OFF, 0);
|
||||
DEFINE_CLK_AOP_QMP(bimc_qmp_clk, ddr, ddr_log, 1, 0, 0);
|
||||
|
||||
static struct clk_hw *aop_qmp_clk_hws[] = {
|
||||
[QDSS_CLK] = &qdss_qmp_clk.hw,
|
||||
[QDSS_AO_CLK] = &qdss_ao_qmp_clk.hw,
|
||||
[BIMC_CLK] = &bimc_qmp_clk.hw,
|
||||
};
|
||||
|
||||
static int aop_qmp_clk_panic_callback(struct notifier_block *nfb,
|
||||
unsigned long event, void *unused)
|
||||
{
|
||||
struct qmp_pkt pkt;
|
||||
struct clk_aop_qmp *clk = &bimc_qmp_clk;
|
||||
char mbox_msg[MAX_LEN];
|
||||
int ret;
|
||||
|
||||
/*
|
||||
* The mbox channel cannot be used in blocking mode as panic notifier
|
||||
* callback function is called in atomic context. So update the channel
|
||||
* to non-blocking mode before sending message.
|
||||
*/
|
||||
clk->mbox->cl->tx_block = false;
|
||||
snprintf(mbox_msg, MAX_LEN, "{class: %s, res: %s, val: 0}",
|
||||
clk->msg.class, clk->msg.res);
|
||||
pkt.size = MAX_LEN;
|
||||
pkt.data = mbox_msg;
|
||||
|
||||
ret = mbox_send_message(clk->mbox, &pkt);
|
||||
if (ret < 0)
|
||||
pr_err("BIMC logging request failed, ret %d\n", ret);
|
||||
|
||||
return NOTIFY_OK;
|
||||
}
|
||||
|
||||
static struct notifier_block aop_qmp_clk_panic_notifier = {
|
||||
.notifier_call = aop_qmp_clk_panic_callback,
|
||||
.priority = 1,
|
||||
};
|
||||
|
||||
static int qmp_update_client(struct clk_hw *hw, struct device *dev,
|
||||
@ -320,6 +354,10 @@ static int aop_qmp_clk_probe(struct platform_device *pdev)
|
||||
|
||||
dev_info(&pdev->dev, "Registered clocks with AOP\n");
|
||||
|
||||
if (of_property_read_bool(np, "qcom,clk-stop-bimc-log"))
|
||||
atomic_notifier_chain_register(&panic_notifier_list,
|
||||
&aop_qmp_clk_panic_notifier);
|
||||
|
||||
return ret;
|
||||
fail:
|
||||
mbox_free_channel(mbox);
|
||||
|
@ -1,6 +1,6 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (c) 2013, 2016-2019, The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2013, 2016-2020, The Linux Foundation. All rights reserved.
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
@ -11,6 +11,7 @@
|
||||
#include <linux/clk.h>
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/clk/qcom.h>
|
||||
|
||||
#include "clk-branch.h"
|
||||
#include "clk-debug.h"
|
||||
@ -46,6 +47,7 @@ static bool clk_branch_check_halt(const struct clk_branch *br, bool enabling)
|
||||
#define BRANCH_NOC_FSM_STATUS_SHIFT 28
|
||||
#define BRANCH_NOC_FSM_STATUS_MASK 0x7
|
||||
#define BRANCH_NOC_FSM_STATUS_ON (0x2 << BRANCH_NOC_FSM_STATUS_SHIFT)
|
||||
#define BRANCH_CLK_DIS_MASK BIT(22)
|
||||
|
||||
static bool clk_branch2_check_halt(const struct clk_branch *br, bool enabling)
|
||||
{
|
||||
@ -149,6 +151,26 @@ static void clk_branch2_disable(struct clk_hw *hw)
|
||||
clk_branch_toggle(hw, false, clk_branch2_check_halt);
|
||||
}
|
||||
|
||||
static int clk_branch2_force_off_enable(struct clk_hw *hw)
|
||||
{
|
||||
struct clk_regmap *rclk = to_clk_regmap(hw);
|
||||
|
||||
regmap_update_bits(rclk->regmap, rclk->enable_reg,
|
||||
BRANCH_CLK_DIS_MASK,
|
||||
0x0);
|
||||
return clk_branch2_enable(hw);
|
||||
}
|
||||
|
||||
static void clk_branch2_force_off_disable(struct clk_hw *hw)
|
||||
{
|
||||
struct clk_regmap *rclk = to_clk_regmap(hw);
|
||||
|
||||
regmap_update_bits(rclk->regmap, rclk->enable_reg,
|
||||
BRANCH_CLK_DIS_MASK,
|
||||
BRANCH_CLK_DIS_MASK);
|
||||
clk_branch2_disable(hw);
|
||||
}
|
||||
|
||||
static void clk_branch2_list_registers(struct seq_file *f, struct clk_hw *hw)
|
||||
{
|
||||
struct clk_branch *br = to_clk_branch(hw);
|
||||
@ -201,6 +223,10 @@ static int clk_branch2_init(struct clk_hw *hw)
|
||||
}
|
||||
|
||||
const struct clk_ops clk_branch2_ops = {
|
||||
.prepare = clk_prepare_regmap,
|
||||
.unprepare = clk_unprepare_regmap,
|
||||
.pre_rate_change = clk_pre_change_regmap,
|
||||
.post_rate_change = clk_post_change_regmap,
|
||||
.enable = clk_branch2_enable,
|
||||
.disable = clk_branch2_disable,
|
||||
.is_enabled = clk_is_enabled_regmap,
|
||||
@ -217,6 +243,15 @@ const struct clk_ops clk_branch2_aon_ops = {
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(clk_branch2_aon_ops);
|
||||
|
||||
const struct clk_ops clk_branch2_force_off_ops = {
|
||||
.enable = clk_branch2_force_off_enable,
|
||||
.disable = clk_branch2_force_off_disable,
|
||||
.is_enabled = clk_is_enabled_regmap,
|
||||
.init = clk_branch2_init,
|
||||
.debug_init = clk_branch_debug_init,
|
||||
};
|
||||
EXPORT_SYMBOL(clk_branch2_force_off_ops);
|
||||
|
||||
static unsigned long clk_branch2_hw_ctl_recalc_rate(struct clk_hw *hw,
|
||||
unsigned long parent_rate)
|
||||
{
|
||||
@ -274,3 +309,55 @@ const struct clk_ops clk_branch_simple_ops = {
|
||||
.is_enabled = clk_is_enabled_regmap,
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(clk_branch_simple_ops);
|
||||
|
||||
int qcom_clk_set_flags(struct clk *clk, unsigned long flags)
|
||||
{
|
||||
struct clk_hw *hw;
|
||||
struct clk_branch *br;
|
||||
u32 cbcr_val = 0, cbcr_mask;
|
||||
int ret;
|
||||
|
||||
if (IS_ERR_OR_NULL(clk))
|
||||
return 0;
|
||||
|
||||
hw = __clk_get_hw(clk);
|
||||
if (IS_ERR_OR_NULL(hw))
|
||||
return -EINVAL;
|
||||
|
||||
switch (flags) {
|
||||
case CLKFLAG_PERIPH_OFF_SET:
|
||||
cbcr_val = cbcr_mask = BIT(12);
|
||||
break;
|
||||
case CLKFLAG_PERIPH_OFF_CLEAR:
|
||||
cbcr_mask = BIT(12);
|
||||
break;
|
||||
case CLKFLAG_RETAIN_PERIPH:
|
||||
cbcr_val = cbcr_mask = BIT(13);
|
||||
break;
|
||||
case CLKFLAG_NORETAIN_PERIPH:
|
||||
cbcr_mask = BIT(13);
|
||||
break;
|
||||
case CLKFLAG_RETAIN_MEM:
|
||||
cbcr_val = cbcr_mask = BIT(14);
|
||||
break;
|
||||
case CLKFLAG_NORETAIN_MEM:
|
||||
cbcr_mask = BIT(14);
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
br = to_clk_branch(hw);
|
||||
ret = regmap_update_bits(br->clkr.regmap, br->halt_reg, cbcr_mask,
|
||||
cbcr_val);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Make sure power is enabled/disabled before returning. */
|
||||
mb();
|
||||
|
||||
udelay(1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(qcom_clk_set_flags);
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/* Copyright (c) 2013, 2016, The Linux Foundation. All rights reserved. */
|
||||
/* Copyright (c) 2013, 2016, 2020 The Linux Foundation. All rights reserved. */
|
||||
|
||||
#ifndef __QCOM_CLK_BRANCH_H__
|
||||
#define __QCOM_CLK_BRANCH_H__
|
||||
@ -42,6 +42,7 @@ extern const struct clk_ops clk_branch2_ops;
|
||||
extern const struct clk_ops clk_branch2_hw_ctl_ops;
|
||||
extern const struct clk_ops clk_branch_simple_ops;
|
||||
extern const struct clk_ops clk_branch2_aon_ops;
|
||||
extern const struct clk_ops clk_branch2_force_off_ops;
|
||||
|
||||
#define to_clk_branch(_hw) \
|
||||
container_of(to_clk_regmap(_hw), struct clk_branch, clkr)
|
||||
|
@ -266,12 +266,22 @@ static u32 get_mux_divs(struct clk_hw *mux)
|
||||
|
||||
static int clk_debug_measure_get(void *data, u64 *val)
|
||||
{
|
||||
struct clk_regmap *rclk = NULL;
|
||||
struct clk_debug_mux *mux;
|
||||
struct clk_hw *hw = data;
|
||||
struct clk_hw *parent;
|
||||
int ret = 0;
|
||||
u32 regval;
|
||||
|
||||
if (clk_is_regmap_clk(hw))
|
||||
rclk = to_clk_regmap(hw);
|
||||
|
||||
if (rclk) {
|
||||
ret = clk_runtime_get_regmap(rclk);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
mutex_lock(&clk_debug_lock);
|
||||
|
||||
ret = clk_find_and_set_parent(measure, hw);
|
||||
@ -306,6 +316,8 @@ static int clk_debug_measure_get(void *data, u64 *val)
|
||||
}
|
||||
exit:
|
||||
mutex_unlock(&clk_debug_lock);
|
||||
if (rclk)
|
||||
clk_runtime_put_regmap(rclk);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -501,8 +513,14 @@ static void clk_debug_print_hw(struct clk_hw *hw, struct seq_file *f)
|
||||
|
||||
if (clk_is_regmap_clk(hw)) {
|
||||
rclk = to_clk_regmap(hw);
|
||||
|
||||
if (clk_runtime_get_regmap(rclk))
|
||||
return;
|
||||
|
||||
if (rclk->ops && rclk->ops->list_registers)
|
||||
rclk->ops->list_registers(f, hw);
|
||||
|
||||
clk_runtime_put_regmap(rclk);
|
||||
}
|
||||
}
|
||||
|
||||
|
178
drivers/clk/qcom/clk-opp.c
Normal file
178
drivers/clk/qcom/clk-opp.c
Normal file
@ -0,0 +1,178 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/* Copyright (c) 2020, The Linux Foundation. All rights reserved. */
|
||||
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/pm_opp.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include "clk-opp.h"
|
||||
#include "clk-regmap.h"
|
||||
|
||||
static int derive_device_list(struct device **device_list,
|
||||
struct clk_hw *hw,
|
||||
struct device_node *np,
|
||||
char *clk_handle_name, int count)
|
||||
{
|
||||
struct platform_device *pdev;
|
||||
struct device_node *dev_node;
|
||||
int j;
|
||||
|
||||
for (j = 0; j < count; j++) {
|
||||
device_list[j] = NULL;
|
||||
dev_node = of_parse_phandle(np, clk_handle_name, j);
|
||||
if (!dev_node) {
|
||||
pr_err("Unable to get device_node pointer for %s opp-handle (%s)\n",
|
||||
clk_hw_get_name(hw), clk_handle_name);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
pdev = of_find_device_by_node(dev_node);
|
||||
if (!pdev) {
|
||||
pr_err("Unable to find platform_device node for %s opp-handle\n",
|
||||
clk_hw_get_name(hw));
|
||||
return -ENODEV;
|
||||
}
|
||||
device_list[j] = &pdev->dev;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int clk_get_voltage(struct clk_hw *hw, unsigned long rate, int n)
|
||||
{
|
||||
struct clk_regmap *rclk = to_clk_regmap(hw);
|
||||
struct clk_vdd_class_data *vdd_data = &rclk->vdd_data;
|
||||
struct clk_vdd_class *vdd;
|
||||
int level, corner;
|
||||
|
||||
/* Use the first regulator in the vdd class for the OPP table. */
|
||||
vdd = rclk->vdd_data.vdd_class;
|
||||
if (vdd->num_regulators > 1) {
|
||||
corner = vdd->vdd_uv[vdd->num_regulators * n];
|
||||
} else {
|
||||
level = clk_find_vdd_level(hw, vdd_data, rate);
|
||||
if (level < 0) {
|
||||
pr_err("Could not find vdd level\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
corner = vdd->vdd_uv[level];
|
||||
}
|
||||
|
||||
if (!corner) {
|
||||
pr_err("%s: Unable to find vdd level for rate %lu\n",
|
||||
clk_hw_get_name(hw), rate);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return corner;
|
||||
}
|
||||
|
||||
static int clk_add_and_print_opp(struct clk_hw *hw,
|
||||
struct device **device_list, int count,
|
||||
unsigned long rate, int uv, int n)
|
||||
{
|
||||
int j, ret;
|
||||
|
||||
for (j = 0; j < count; j++) {
|
||||
ret = dev_pm_opp_add(device_list[j], rate, uv);
|
||||
if (ret) {
|
||||
pr_err("%s: couldn't add OPP for %lu - err: %d\n",
|
||||
clk_hw_get_name(hw), rate, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
pr_info("%s: set OPP pair(%lu Hz: %u uV) on %s\n",
|
||||
clk_hw_get_name(hw), rate, uv,
|
||||
dev_name(device_list[j]));
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void clk_hw_populate_clock_opp_table(struct device_node *np, struct clk_hw *hw)
|
||||
{
|
||||
struct device **device_list;
|
||||
struct clk_regmap *rclk = to_clk_regmap(hw);
|
||||
struct clk_vdd_class_data *vdd_data;
|
||||
char clk_handle_name[MAX_LEN_OPP_HANDLE];
|
||||
int n, len, count, uv, ret;
|
||||
unsigned long rate = 0, rrate;
|
||||
|
||||
if (!rclk->vdd_data.vdd_class || !rclk->vdd_data.num_rate_max)
|
||||
return;
|
||||
|
||||
if (strlen(clk_hw_get_name(hw)) + LEN_OPP_HANDLE < MAX_LEN_OPP_HANDLE) {
|
||||
ret = scnprintf(clk_handle_name, ARRAY_SIZE(clk_handle_name),
|
||||
"qcom,%s-opp-handle", clk_hw_get_name(hw));
|
||||
if (ret < strlen(clk_hw_get_name(hw)) + LEN_OPP_HANDLE) {
|
||||
pr_err("%s: Failed to hold clk_handle_name\n",
|
||||
clk_hw_get_name(hw));
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
pr_err("clk name (%s) too large to fit in clk_handle_name\n",
|
||||
clk_hw_get_name(hw));
|
||||
return;
|
||||
}
|
||||
|
||||
if (of_find_property(np, clk_handle_name, &len)) {
|
||||
count = len/sizeof(u32);
|
||||
|
||||
device_list = kmalloc_array(count, sizeof(struct device *),
|
||||
GFP_KERNEL);
|
||||
if (!device_list)
|
||||
return;
|
||||
|
||||
ret = derive_device_list(device_list, hw, np,
|
||||
clk_handle_name, count);
|
||||
if (ret < 0) {
|
||||
pr_err("Failed to fill device_list for %s\n",
|
||||
clk_handle_name);
|
||||
goto err_derive_device_list;
|
||||
}
|
||||
} else {
|
||||
pr_debug("Unable to find %s\n", clk_handle_name);
|
||||
return;
|
||||
}
|
||||
|
||||
vdd_data = &rclk->vdd_data;
|
||||
|
||||
for (n = 0; n < vdd_data->num_rate_max; n++) {
|
||||
rrate = clk_hw_round_rate(hw, rate + 1);
|
||||
if (!rrate) {
|
||||
/*
|
||||
* If the parent is not ready before this clock,
|
||||
* most likely the round rate would fail.
|
||||
*/
|
||||
pr_err("clk_hw_round_rate failed for %s\n",
|
||||
clk_hw_get_name(hw));
|
||||
goto err_derive_device_list;
|
||||
}
|
||||
|
||||
pr_debug("Rate %lu , uv %d, rrate %lu\n", rate + 1, uv,
|
||||
clk_hw_round_rate(hw, rate + 1));
|
||||
|
||||
/*
|
||||
* If clk_hw_round_rate gives the same value on consecutive
|
||||
* iterations, exit the loop since we're at the maximum clock
|
||||
* frequency.
|
||||
*/
|
||||
if (rate == rrate)
|
||||
break;
|
||||
rate = rrate;
|
||||
|
||||
uv = clk_get_voltage(hw, rate, n);
|
||||
if (uv < 0)
|
||||
goto err_derive_device_list;
|
||||
|
||||
ret = clk_add_and_print_opp(hw, device_list, count,
|
||||
rate, uv, n);
|
||||
if (ret)
|
||||
pr_err("Failed to add OPP table\n");
|
||||
}
|
||||
|
||||
err_derive_device_list:
|
||||
kfree(device_list);
|
||||
}
|
||||
EXPORT_SYMBOL(clk_hw_populate_clock_opp_table);
|
13
drivers/clk/qcom/clk-opp.h
Normal file
13
drivers/clk/qcom/clk-opp.h
Normal file
@ -0,0 +1,13 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/* Copyright (c) 2020, The Linux Foundation. All rights reserved. */
|
||||
|
||||
#ifndef __QCOM_CLK_OPP_H__
|
||||
#define __QCOM_CLK_OPP_H__
|
||||
|
||||
void clk_hw_populate_clock_opp_table(struct device_node *np,
|
||||
struct clk_hw *hw);
|
||||
|
||||
#define MAX_LEN_OPP_HANDLE 50
|
||||
#define LEN_OPP_HANDLE 16
|
||||
|
||||
#endif
|
@ -1,5 +1,5 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/* Copyright (c) 2013, 2016-2019, The Linux Foundation. All rights reserved. */
|
||||
/* Copyright (c) 2013, 2016-2020, The Linux Foundation. All rights reserved. */
|
||||
|
||||
#ifndef __QCOM_CLK_RCG_H__
|
||||
#define __QCOM_CLK_RCG_H__
|
||||
@ -159,6 +159,7 @@ struct clk_rcg2 {
|
||||
u8 flags;
|
||||
#define FORCE_ENABLE_RCG BIT(0)
|
||||
#define HW_CLK_CTRL_MODE BIT(1)
|
||||
#define DFS_SUPPORT BIT(2)
|
||||
};
|
||||
|
||||
#define to_clk_rcg2(_hw) container_of(to_clk_regmap(_hw), struct clk_rcg2, clkr)
|
||||
|
@ -1,6 +1,6 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (c) 2013, 2016-2019, The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2013, 2016-2020, The Linux Foundation. All rights reserved.
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
@ -452,36 +452,47 @@ static int clk_rcg2_configure(struct clk_rcg2 *rcg, const struct freq_tbl *f)
|
||||
static void clk_rcg2_list_registers(struct seq_file *f, struct clk_hw *hw)
|
||||
{
|
||||
struct clk_rcg2 *rcg = to_clk_rcg2(hw);
|
||||
int i = 0, size = 0, val;
|
||||
|
||||
static struct clk_register_data data[] = {
|
||||
{"CMD_RCGR", 0x0},
|
||||
{"CFG_RCGR", 0x4},
|
||||
};
|
||||
static struct clk_register_data *data;
|
||||
int i, val;
|
||||
|
||||
static struct clk_register_data data1[] = {
|
||||
{"CMD_RCGR", 0x0},
|
||||
{"CFG_RCGR", 0x4},
|
||||
{ },
|
||||
};
|
||||
|
||||
static struct clk_register_data data2[] = {
|
||||
{"CMD_RCGR", 0x0},
|
||||
{"CFG_RCGR", 0x4},
|
||||
{"M_VAL", 0x8},
|
||||
{"N_VAL", 0xC},
|
||||
{"D_VAL", 0x10},
|
||||
{ },
|
||||
};
|
||||
|
||||
if (rcg->mnd_width) {
|
||||
size = ARRAY_SIZE(data1);
|
||||
for (i = 0; i < size; i++) {
|
||||
regmap_read(rcg->clkr.regmap, (rcg->cmd_rcgr +
|
||||
data1[i].offset), &val);
|
||||
seq_printf(f, "%20s: 0x%.8x\n", data1[i].name, val);
|
||||
}
|
||||
} else {
|
||||
size = ARRAY_SIZE(data);
|
||||
for (i = 0; i < size; i++) {
|
||||
regmap_read(rcg->clkr.regmap, (rcg->cmd_rcgr +
|
||||
static struct clk_register_data data3[] = {
|
||||
{"CMD_RCGR", 0x0},
|
||||
{"CFG_RCGR", 0x4},
|
||||
{"M_VAL", 0x8},
|
||||
{"N_VAL", 0xC},
|
||||
{"D_VAL", 0x10},
|
||||
{"CMD_DFSR", 0x14},
|
||||
{ },
|
||||
};
|
||||
|
||||
if (rcg->flags & DFS_SUPPORT)
|
||||
data = data3;
|
||||
else if (rcg->mnd_width)
|
||||
data = data2;
|
||||
else
|
||||
data = data1;
|
||||
|
||||
for (i = 0; data[i].name != NULL; i++) {
|
||||
regmap_read(rcg->clkr.regmap, (rcg->cmd_rcgr +
|
||||
data[i].offset), &val);
|
||||
seq_printf(f, "%20s: 0x%.8x\n", data[i].name, val);
|
||||
}
|
||||
seq_printf(f, "%20s: 0x%.8x\n", data[i].name, val);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* Return the nth supported frequency for a given clock. */
|
||||
@ -1438,7 +1449,7 @@ const struct clk_ops clk_rcg2_shared_ops = {
|
||||
EXPORT_SYMBOL_GPL(clk_rcg2_shared_ops);
|
||||
|
||||
/* Common APIs to be used for DFS based RCGR */
|
||||
static void clk_rcg2_dfs_populate_freq(struct clk_hw *hw, unsigned int l,
|
||||
static int clk_rcg2_dfs_populate_freq(struct clk_hw *hw, unsigned int l,
|
||||
struct freq_tbl *f)
|
||||
{
|
||||
struct clk_rcg2 *rcg = to_clk_rcg2(hw);
|
||||
@ -1462,6 +1473,8 @@ static void clk_rcg2_dfs_populate_freq(struct clk_hw *hw, unsigned int l,
|
||||
if (src == rcg->parent_map[i].cfg) {
|
||||
f->src = rcg->parent_map[i].src;
|
||||
p = clk_hw_get_parent_by_index(&rcg->clkr.hw, i);
|
||||
if (!p)
|
||||
return -EINVAL;
|
||||
prate = clk_hw_get_rate(p);
|
||||
}
|
||||
}
|
||||
@ -1485,12 +1498,13 @@ static void clk_rcg2_dfs_populate_freq(struct clk_hw *hw, unsigned int l,
|
||||
}
|
||||
|
||||
f->freq = calc_rate(prate, f->m, f->n, mode, f->pre_div);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int clk_rcg2_dfs_populate_freq_table(struct clk_rcg2 *rcg)
|
||||
{
|
||||
struct freq_tbl *freq_tbl;
|
||||
int i;
|
||||
int i, ret;
|
||||
|
||||
/* Allocate space for 1 extra since table is NULL terminated */
|
||||
freq_tbl = kcalloc(MAX_PERF_LEVEL + 1, sizeof(*freq_tbl), GFP_KERNEL);
|
||||
@ -1498,10 +1512,13 @@ static int clk_rcg2_dfs_populate_freq_table(struct clk_rcg2 *rcg)
|
||||
return -ENOMEM;
|
||||
rcg->freq_tbl = freq_tbl;
|
||||
|
||||
for (i = 0; i < MAX_PERF_LEVEL; i++)
|
||||
for (i = 0; i < MAX_PERF_LEVEL; i++) {
|
||||
ret =
|
||||
clk_rcg2_dfs_populate_freq(&rcg->clkr.hw, i, freq_tbl + i);
|
||||
|
||||
return 0;
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int clk_rcg2_dfs_determine_rate(struct clk_hw *hw,
|
||||
@ -1593,6 +1610,8 @@ static int clk_rcg2_enable_dfs(const struct clk_rcg_dfs_data *data,
|
||||
u32 val;
|
||||
int ret;
|
||||
|
||||
rcg->flags |= DFS_SUPPORT;
|
||||
|
||||
ret = regmap_read(regmap, rcg->cmd_rcgr + SE_CMD_DFSR_OFFSET, &val);
|
||||
if (ret)
|
||||
return -EINVAL;
|
||||
|
@ -1,6 +1,6 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (c) 2014, 2016-2019, The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2014, 2016-2020, The Linux Foundation. All rights reserved.
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
@ -9,6 +9,7 @@
|
||||
#include <linux/export.h>
|
||||
|
||||
#include "clk-regmap-divider.h"
|
||||
#include "clk-debug.h"
|
||||
|
||||
static inline struct clk_regmap_div *to_clk_regmap_div(struct clk_hw *hw)
|
||||
{
|
||||
@ -73,6 +74,41 @@ static unsigned long div_recalc_rate(struct clk_hw *hw,
|
||||
divider->width);
|
||||
}
|
||||
|
||||
static long clk_regmap_div_list_rate(struct clk_hw *hw, unsigned int n,
|
||||
unsigned long fmax)
|
||||
{
|
||||
struct clk_regmap_div *divider = to_clk_regmap_div(hw);
|
||||
struct clk_hw *parent_hw = clk_hw_get_parent(hw);
|
||||
struct clk_regmap *clkr = ÷r->clkr;
|
||||
struct clk_regmap *parent_clkr = to_clk_regmap(parent_hw);
|
||||
u32 div;
|
||||
|
||||
regmap_read(clkr->regmap, divider->reg, &div);
|
||||
div >>= divider->shift;
|
||||
div &= BIT(divider->width) - 1;
|
||||
div += 1;
|
||||
|
||||
if (parent_clkr && parent_clkr->ops && parent_clkr->ops->list_rate)
|
||||
return (parent_clkr->ops->list_rate(parent_hw, n, fmax) / div);
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static struct clk_regmap_ops clk_regmap_div_regmap_ops = {
|
||||
.list_rate = clk_regmap_div_list_rate,
|
||||
};
|
||||
|
||||
static int clk_regmap_div_init(struct clk_hw *hw)
|
||||
{
|
||||
struct clk_regmap_div *divider = to_clk_regmap_div(hw);
|
||||
struct clk_regmap *clkr = ÷r->clkr;
|
||||
|
||||
if (!clkr->ops)
|
||||
clkr->ops = &clk_regmap_div_regmap_ops;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
const struct clk_ops clk_regmap_div_ops = {
|
||||
.round_rate = div_round_rate,
|
||||
.set_rate = div_set_rate,
|
||||
@ -83,5 +119,7 @@ EXPORT_SYMBOL_GPL(clk_regmap_div_ops);
|
||||
const struct clk_ops clk_regmap_div_ro_ops = {
|
||||
.round_rate = div_round_ro_rate,
|
||||
.recalc_rate = div_recalc_rate,
|
||||
.init = clk_regmap_div_init,
|
||||
.debug_init = clk_common_debug_init,
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(clk_regmap_div_ro_ops);
|
||||
|
@ -7,6 +7,7 @@
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
|
||||
#include "clk-regmap.h"
|
||||
|
||||
@ -270,6 +271,8 @@ int devm_clk_register_regmap(struct device *dev, struct clk_regmap *rclk)
|
||||
{
|
||||
int ret;
|
||||
|
||||
rclk->dev = dev;
|
||||
|
||||
if (dev && dev_get_regmap(dev, NULL))
|
||||
rclk->regmap = dev_get_regmap(dev, NULL);
|
||||
else if (dev && dev->parent)
|
||||
@ -282,3 +285,24 @@ int devm_clk_register_regmap(struct device *dev, struct clk_regmap *rclk)
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devm_clk_register_regmap);
|
||||
|
||||
int clk_runtime_get_regmap(struct clk_regmap *rclk)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (pm_runtime_enabled(rclk->dev)) {
|
||||
ret = pm_runtime_get_sync(rclk->dev);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(clk_runtime_get_regmap);
|
||||
|
||||
void clk_runtime_put_regmap(struct clk_regmap *rclk)
|
||||
{
|
||||
if (pm_runtime_enabled(rclk->dev))
|
||||
pm_runtime_put_sync(rclk->dev);
|
||||
}
|
||||
EXPORT_SYMBOL(clk_runtime_put_regmap);
|
||||
|
@ -50,6 +50,7 @@ struct clk_regmap {
|
||||
struct clk_vdd_class_data vdd_data;
|
||||
struct clk_regmap_ops *ops;
|
||||
struct list_head list_node;
|
||||
struct device *dev;
|
||||
};
|
||||
#define to_clk_regmap(_hw) container_of(_hw, struct clk_regmap, hw)
|
||||
|
||||
@ -71,4 +72,7 @@ struct clk_register_data {
|
||||
u32 offset;
|
||||
};
|
||||
|
||||
int clk_runtime_get_regmap(struct clk_regmap *rclk);
|
||||
void clk_runtime_put_regmap(struct clk_regmap *rclk);
|
||||
|
||||
#endif
|
||||
|
@ -460,6 +460,7 @@ static const struct clk_rpmh_desc clk_rpmh_sc7180 = {
|
||||
};
|
||||
|
||||
DEFINE_CLK_RPMH_ARC(lahaina, bi_tcxo, bi_tcxo_ao, "xo.lvl", 0x3, 2);
|
||||
DEFINE_CLK_RPMH_VRM_OPT(lahaina, div_clk1, div_clk1_ao, "divclka1", 2);
|
||||
DEFINE_CLK_RPMH_VRM(lahaina, ln_bb_clk1, ln_bb_clk1_ao, "lnbclka1", 2);
|
||||
DEFINE_CLK_RPMH_VRM(lahaina, ln_bb_clk2, ln_bb_clk2_ao, "lnbclka2", 2);
|
||||
DEFINE_CLK_RPMH_VRM(lahaina, rf_clk1, rf_clk1_ao, "rfclka1", 1);
|
||||
@ -474,6 +475,8 @@ DEFINE_CLK_RPMH_BCM(lahaina, hwkm, "HK0");
|
||||
static struct clk_hw *lahaina_rpmh_clocks[] = {
|
||||
[RPMH_CXO_CLK] = &lahaina_bi_tcxo.hw,
|
||||
[RPMH_CXO_CLK_A] = &lahaina_bi_tcxo_ao.hw,
|
||||
[RPMH_DIV_CLK1] = &lahaina_div_clk1.hw,
|
||||
[RPMH_DIV_CLK1_A] = &lahaina_div_clk1_ao.hw,
|
||||
[RPMH_LN_BB_CLK1] = &lahaina_ln_bb_clk1.hw,
|
||||
[RPMH_LN_BB_CLK1_A] = &lahaina_ln_bb_clk1_ao.hw,
|
||||
[RPMH_LN_BB_CLK2] = &lahaina_ln_bb_clk2.hw,
|
||||
@ -570,6 +573,32 @@ static const struct clk_rpmh_desc clk_rpmh_waipio = {
|
||||
.num_clks = ARRAY_SIZE(waipio_rpmh_clocks),
|
||||
};
|
||||
|
||||
DEFINE_CLK_RPMH_ARC(sdxlemur, bi_tcxo, bi_tcxo_ao, "xo.lvl", 0x3, 4);
|
||||
DEFINE_CLK_RPMH_VRM(sdxlemur, ln_bb_clk1, ln_bb_clk1_ao, "lnbclka1", 4);
|
||||
DEFINE_CLK_RPMH_BCM(sdxlemur, qpic_clk, "QP0");
|
||||
|
||||
static struct clk_hw *sdxlemur_rpmh_clocks[] = {
|
||||
[RPMH_CXO_CLK] = &sdxlemur_bi_tcxo.hw,
|
||||
[RPMH_CXO_CLK_A] = &sdxlemur_bi_tcxo_ao.hw,
|
||||
[RPMH_LN_BB_CLK1] = &sdxlemur_ln_bb_clk1.hw,
|
||||
[RPMH_LN_BB_CLK1_A] = &sdxlemur_ln_bb_clk1_ao.hw,
|
||||
[RPMH_RF_CLK1] = &lahaina_rf_clk1.hw,
|
||||
[RPMH_RF_CLK1_A] = &lahaina_rf_clk1_ao.hw,
|
||||
[RPMH_RF_CLK2] = &lahaina_rf_clk2.hw,
|
||||
[RPMH_RF_CLK2_A] = &lahaina_rf_clk2_ao.hw,
|
||||
[RPMH_RF_CLK3] = &lahaina_rf_clk3.hw,
|
||||
[RPMH_RF_CLK3_A] = &lahaina_rf_clk3_ao.hw,
|
||||
[RPMH_RF_CLK4] = &lahaina_rf_clk4.hw,
|
||||
[RPMH_RF_CLK4_A] = &lahaina_rf_clk4_ao.hw,
|
||||
[RPMH_IPA_CLK] = &lahaina_ipa.hw,
|
||||
[RPMH_QPIC_CLK] = &sdxlemur_qpic_clk.hw,
|
||||
};
|
||||
|
||||
static const struct clk_rpmh_desc clk_rpmh_sdxlemur = {
|
||||
.clks = sdxlemur_rpmh_clocks,
|
||||
.num_clks = ARRAY_SIZE(sdxlemur_rpmh_clocks),
|
||||
};
|
||||
|
||||
static struct clk_hw *of_clk_rpmh_hw_get(struct of_phandle_args *clkspec,
|
||||
void *data)
|
||||
{
|
||||
@ -671,6 +700,7 @@ static const struct of_device_id clk_rpmh_match_table[] = {
|
||||
{ .compatible = "qcom,shima-rpmh-clk", .data = &clk_rpmh_shima},
|
||||
{ .compatible = "qcom,sm8250-rpmh-clk", .data = &clk_rpmh_sm8250},
|
||||
{ .compatible = "qcom,waipio-rpmh-clk", .data = &clk_rpmh_waipio},
|
||||
{ .compatible = "qcom,sdxlemur-rpmh-clk", .data = &clk_rpmh_sdxlemur},
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, clk_rpmh_match_table);
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -11,12 +11,19 @@
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/reset-controller.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/clk/qcom.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/interconnect.h>
|
||||
#include <linux/pm_clock.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
|
||||
#include "common.h"
|
||||
#include "clk-opp.h"
|
||||
#include "clk-rcg.h"
|
||||
#include "clk-regmap.h"
|
||||
#include "reset.h"
|
||||
#include "gdsc.h"
|
||||
#include "vdd-level.h"
|
||||
|
||||
struct qcom_cc {
|
||||
struct qcom_reset_controller reset;
|
||||
@ -320,6 +327,8 @@ int qcom_cc_really_probe(struct platform_device *pdev,
|
||||
ret = devm_clk_register_regmap(dev, rclks[i]);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
clk_hw_populate_clock_opp_table(dev->of_node, &rclks[i]->hw);
|
||||
}
|
||||
|
||||
ret = devm_of_clk_add_hw_provider(dev, qcom_cc_clk_hw_get, cc);
|
||||
@ -371,4 +380,141 @@ void qcom_cc_sync_state(struct device *dev, const struct qcom_cc_desc *desc)
|
||||
}
|
||||
EXPORT_SYMBOL(qcom_cc_sync_state);
|
||||
|
||||
int qcom_clk_get_voltage(struct clk *clk, unsigned long rate)
|
||||
{
|
||||
struct clk_regmap *rclk;
|
||||
struct clk_hw *hw = __clk_get_hw(clk);
|
||||
int vdd_level;
|
||||
|
||||
if (!clk_is_regmap_clk(hw))
|
||||
return -EINVAL;
|
||||
|
||||
rclk = to_clk_regmap(hw);
|
||||
vdd_level = clk_find_vdd_level(hw, &rclk->vdd_data, rate);
|
||||
if (vdd_level < 0)
|
||||
return vdd_level;
|
||||
|
||||
return rclk->vdd_data.vdd_class->vdd_uv[vdd_level];
|
||||
}
|
||||
EXPORT_SYMBOL(qcom_clk_get_voltage);
|
||||
|
||||
int qcom_cc_runtime_init(struct platform_device *pdev,
|
||||
struct qcom_cc_desc *desc)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
struct clk *clk;
|
||||
int ret;
|
||||
|
||||
clk = clk_get_optional(dev, "iface");
|
||||
if (IS_ERR(clk)) {
|
||||
if (PTR_ERR(clk) != -EPROBE_DEFER)
|
||||
dev_err(dev, "unable to get iface clock\n");
|
||||
return PTR_ERR(clk);
|
||||
}
|
||||
clk_put(clk);
|
||||
|
||||
ret = clk_regulator_init(dev, desc);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
desc->path = of_icc_get(dev, NULL);
|
||||
if (IS_ERR(desc->path)) {
|
||||
if (PTR_ERR(desc->path) != -EPROBE_DEFER)
|
||||
dev_err(dev, "error getting path\n");
|
||||
return PTR_ERR(desc->path);
|
||||
}
|
||||
|
||||
platform_set_drvdata(pdev, desc);
|
||||
pm_runtime_enable(dev);
|
||||
|
||||
ret = pm_clk_create(dev);
|
||||
if (ret)
|
||||
goto disable_pm_runtime;
|
||||
|
||||
ret = pm_clk_add(dev, "iface");
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "failed to acquire iface clock\n");
|
||||
goto destroy_pm_clk;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
destroy_pm_clk:
|
||||
pm_clk_destroy(dev);
|
||||
|
||||
disable_pm_runtime:
|
||||
pm_runtime_disable(dev);
|
||||
icc_put(desc->path);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(qcom_cc_runtime_init);
|
||||
|
||||
int qcom_cc_runtime_resume(struct device *dev)
|
||||
{
|
||||
struct qcom_cc_desc *desc = dev_get_drvdata(dev);
|
||||
struct clk_vdd_class_data vdd_data = {0};
|
||||
int ret;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < desc->num_clk_regulators; i++) {
|
||||
vdd_data.vdd_class = desc->clk_regulators[i];
|
||||
if (!vdd_data.vdd_class)
|
||||
continue;
|
||||
|
||||
ret = clk_vote_vdd_level(&vdd_data, 1);
|
||||
if (ret) {
|
||||
dev_warn(dev, "%s: failed to vote voltage\n", __func__);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
if (desc->path) {
|
||||
ret = icc_set_bw(desc->path, 0, 1);
|
||||
if (ret) {
|
||||
dev_warn(dev, "%s: failed to vote bw\n", __func__);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
ret = pm_clk_resume(dev);
|
||||
if (ret)
|
||||
dev_warn(dev, "%s: failed to enable clocks\n", __func__);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(qcom_cc_runtime_resume);
|
||||
|
||||
int qcom_cc_runtime_suspend(struct device *dev)
|
||||
{
|
||||
struct qcom_cc_desc *desc = dev_get_drvdata(dev);
|
||||
struct clk_vdd_class_data vdd_data = {0};
|
||||
int ret;
|
||||
int i;
|
||||
|
||||
ret = pm_clk_suspend(dev);
|
||||
if (ret)
|
||||
dev_warn(dev, "%s: failed to disable clocks\n", __func__);
|
||||
|
||||
if (desc->path) {
|
||||
ret = icc_set_bw(desc->path, 0, 0);
|
||||
if (ret)
|
||||
dev_warn(dev, "%s: failed to unvote bw\n", __func__);
|
||||
}
|
||||
|
||||
for (i = 0; i < desc->num_clk_regulators; i++) {
|
||||
vdd_data.vdd_class = desc->clk_regulators[i];
|
||||
if (!vdd_data.vdd_class)
|
||||
continue;
|
||||
|
||||
ret = clk_unvote_vdd_level(&vdd_data, 1);
|
||||
if (ret)
|
||||
dev_warn(dev, "%s: failed to unvote voltage\n",
|
||||
__func__);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(qcom_cc_runtime_suspend);
|
||||
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -33,6 +33,7 @@ struct qcom_cc_desc {
|
||||
size_t num_clk_hws;
|
||||
struct clk_vdd_class **clk_regulators;
|
||||
size_t num_clk_regulators;
|
||||
struct icc_path *path;
|
||||
};
|
||||
|
||||
/**
|
||||
@ -77,4 +78,10 @@ extern int qcom_cc_probe_by_index(struct platform_device *pdev, int index,
|
||||
const struct qcom_cc_desc *desc);
|
||||
extern const struct clk_ops clk_dummy_ops;
|
||||
void qcom_cc_sync_state(struct device *dev, const struct qcom_cc_desc *desc);
|
||||
|
||||
int qcom_cc_runtime_init(struct platform_device *pdev,
|
||||
struct qcom_cc_desc *desc);
|
||||
int qcom_cc_runtime_suspend(struct device *dev);
|
||||
int qcom_cc_runtime_resume(struct device *dev);
|
||||
|
||||
#endif
|
||||
|
652
drivers/clk/qcom/debugcc-holi.c
Normal file
652
drivers/clk/qcom/debugcc-holi.c
Normal file
@ -0,0 +1,652 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (c) 2020, The Linux Foundation. All rights reserved.
|
||||
*/
|
||||
|
||||
#define pr_fmt(fmt) "clk: %s: " fmt, __func__
|
||||
|
||||
#include <linux/clk.h>
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/mfd/syscon.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/regmap.h>
|
||||
|
||||
#include "clk-debug.h"
|
||||
#include "common.h"
|
||||
|
||||
static struct measure_clk_data debug_mux_priv = {
|
||||
.ctl_reg = 0x62038,
|
||||
.status_reg = 0x6203C,
|
||||
.xo_div4_cbcr = 0x28008,
|
||||
};
|
||||
|
||||
static const char *const cpu_cc_debug_mux_parent_names[] = {
|
||||
"l3_clk",
|
||||
"perfcl_clk",
|
||||
"pwrcl_clk",
|
||||
};
|
||||
|
||||
static int cpu_cc_debug_mux_sels[] = {
|
||||
0x41, /* l3_clk */
|
||||
0x25, /* perfcl_clk */
|
||||
0x21, /* pwrcl_clk */
|
||||
};
|
||||
|
||||
static int apss_cc_debug_mux_pre_divs[] = {
|
||||
0x4, /* l3_clk */
|
||||
0x8, /* perfcl_clk */
|
||||
0x4, /* pwrcl_clk */
|
||||
};
|
||||
|
||||
static struct clk_debug_mux cpu_cc_debug_mux = {
|
||||
.priv = &debug_mux_priv,
|
||||
.debug_offset = 0x0,
|
||||
.post_div_offset = 0x0,
|
||||
.cbcr_offset = 0,
|
||||
.src_sel_mask = 0x7F0,
|
||||
.src_sel_shift = 4,
|
||||
.post_div_mask = 0x7800,
|
||||
.post_div_shift = 11,
|
||||
.post_div_val = 1,
|
||||
.mux_sels = cpu_cc_debug_mux_sels,
|
||||
.pre_div_vals = apss_cc_debug_mux_pre_divs,
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "cpu_cc_debug_mux",
|
||||
.ops = &clk_debug_mux_ops,
|
||||
.parent_names = cpu_cc_debug_mux_parent_names,
|
||||
.num_parents = ARRAY_SIZE(cpu_cc_debug_mux_parent_names),
|
||||
.flags = CLK_IS_MEASURE,
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
static const char *const disp_cc_debug_mux_parent_names[] = {
|
||||
"disp_cc_mdss_ahb_clk",
|
||||
"disp_cc_mdss_byte0_clk",
|
||||
"disp_cc_mdss_byte0_intf_clk",
|
||||
"disp_cc_mdss_esc0_clk",
|
||||
"disp_cc_mdss_mdp_clk",
|
||||
"disp_cc_mdss_mdp_lut_clk",
|
||||
"disp_cc_mdss_non_gdsc_ahb_clk",
|
||||
"disp_cc_mdss_pclk0_clk",
|
||||
"disp_cc_mdss_rot_clk",
|
||||
"disp_cc_mdss_rscc_ahb_clk",
|
||||
"disp_cc_mdss_rscc_vsync_clk",
|
||||
"disp_cc_mdss_vsync_clk",
|
||||
"disp_cc_sleep_clk",
|
||||
"disp_cc_xo_clk",
|
||||
};
|
||||
|
||||
static int disp_cc_debug_mux_sels[] = {
|
||||
0x14, /* disp_cc_mdss_ahb_clk */
|
||||
0xC, /* disp_cc_mdss_byte0_clk */
|
||||
0xD, /* disp_cc_mdss_byte0_intf_clk */
|
||||
0xE, /* disp_cc_mdss_esc0_clk */
|
||||
0x8, /* disp_cc_mdss_mdp_clk */
|
||||
0xA, /* disp_cc_mdss_mdp_lut_clk */
|
||||
0x15, /* disp_cc_mdss_non_gdsc_ahb_clk */
|
||||
0x7, /* disp_cc_mdss_pclk0_clk */
|
||||
0x9, /* disp_cc_mdss_rot_clk */
|
||||
0x17, /* disp_cc_mdss_rscc_ahb_clk */
|
||||
0x16, /* disp_cc_mdss_rscc_vsync_clk */
|
||||
0xB, /* disp_cc_mdss_vsync_clk */
|
||||
0x1D, /* disp_cc_sleep_clk */
|
||||
0x1E, /* disp_cc_xo_clk */
|
||||
};
|
||||
|
||||
static struct clk_debug_mux disp_cc_debug_mux = {
|
||||
.priv = &debug_mux_priv,
|
||||
.debug_offset = 0x7000,
|
||||
.post_div_offset = 0x3000,
|
||||
.cbcr_offset = 0x3004,
|
||||
.src_sel_mask = 0xFF,
|
||||
.src_sel_shift = 0,
|
||||
.post_div_mask = 0x3,
|
||||
.post_div_shift = 0,
|
||||
.post_div_val = 4,
|
||||
.mux_sels = disp_cc_debug_mux_sels,
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "disp_cc_debug_mux",
|
||||
.ops = &clk_debug_mux_ops,
|
||||
.parent_names = disp_cc_debug_mux_parent_names,
|
||||
.num_parents = ARRAY_SIZE(disp_cc_debug_mux_parent_names),
|
||||
.flags = CLK_IS_MEASURE,
|
||||
},
|
||||
};
|
||||
|
||||
static const char *const gcc_debug_mux_parent_names[] = {
|
||||
"cpu_cc_debug_mux",
|
||||
"disp_cc_debug_mux",
|
||||
"gcc_ahb2phy_csi_clk",
|
||||
"gcc_ahb2phy_usb_clk",
|
||||
"gcc_bimc_gpu_axi_clk",
|
||||
"gcc_boot_rom_ahb_clk",
|
||||
"gcc_cam_throttle_nrt_clk",
|
||||
"gcc_cam_throttle_rt_clk",
|
||||
"gcc_camera_ahb_clk",
|
||||
"gcc_camera_xo_clk",
|
||||
"gcc_camss_axi_clk",
|
||||
"gcc_camss_camnoc_atb_clk",
|
||||
"gcc_camss_camnoc_nts_xo_clk",
|
||||
"gcc_camss_cci_0_clk",
|
||||
"gcc_camss_cci_1_clk",
|
||||
"gcc_camss_cphy_0_clk",
|
||||
"gcc_camss_cphy_1_clk",
|
||||
"gcc_camss_cphy_2_clk",
|
||||
"gcc_camss_cphy_3_clk",
|
||||
"gcc_camss_csi0phytimer_clk",
|
||||
"gcc_camss_csi1phytimer_clk",
|
||||
"gcc_camss_csi2phytimer_clk",
|
||||
"gcc_camss_csi3phytimer_clk",
|
||||
"gcc_camss_mclk0_clk",
|
||||
"gcc_camss_mclk1_clk",
|
||||
"gcc_camss_mclk2_clk",
|
||||
"gcc_camss_mclk3_clk",
|
||||
"gcc_camss_mclk4_clk",
|
||||
"gcc_camss_nrt_axi_clk",
|
||||
"gcc_camss_ope_ahb_clk",
|
||||
"gcc_camss_ope_clk",
|
||||
"gcc_camss_rt_axi_clk",
|
||||
"gcc_camss_tfe_0_clk",
|
||||
"gcc_camss_tfe_0_cphy_rx_clk",
|
||||
"gcc_camss_tfe_0_csid_clk",
|
||||
"gcc_camss_tfe_1_clk",
|
||||
"gcc_camss_tfe_1_cphy_rx_clk",
|
||||
"gcc_camss_tfe_1_csid_clk",
|
||||
"gcc_camss_tfe_2_clk",
|
||||
"gcc_camss_tfe_2_cphy_rx_clk",
|
||||
"gcc_camss_tfe_2_csid_clk",
|
||||
"gcc_camss_top_ahb_clk",
|
||||
"gcc_cfg_noc_usb3_prim_axi_clk",
|
||||
"gcc_cpuss_gnoc_clk",
|
||||
"gcc_disp_ahb_clk",
|
||||
"gcc_disp_gpll0_div_clk_src",
|
||||
"gcc_disp_hf_axi_clk",
|
||||
"gcc_disp_sleep_clk",
|
||||
"gcc_disp_throttle_core_clk",
|
||||
"gcc_disp_xo_clk",
|
||||
"gcc_gp1_clk",
|
||||
"gcc_gp2_clk",
|
||||
"gcc_gp3_clk",
|
||||
"gcc_gpu_cfg_ahb_clk",
|
||||
"gcc_gpu_gpll0_clk_src",
|
||||
"gcc_gpu_gpll0_div_clk_src",
|
||||
"gcc_gpu_memnoc_gfx_clk",
|
||||
"gcc_gpu_snoc_dvm_gfx_clk",
|
||||
"gcc_gpu_throttle_core_clk",
|
||||
"gcc_pdm2_clk",
|
||||
"gcc_pdm_ahb_clk",
|
||||
"gcc_pdm_xo4_clk",
|
||||
"gcc_prng_ahb_clk",
|
||||
"gcc_qmip_camera_nrt_ahb_clk",
|
||||
"gcc_qmip_camera_rt_ahb_clk",
|
||||
"gcc_qmip_disp_ahb_clk",
|
||||
"gcc_qmip_gpu_cfg_ahb_clk",
|
||||
"gcc_qmip_video_vcodec_ahb_clk",
|
||||
"gcc_qupv3_wrap0_core_2x_clk",
|
||||
"gcc_qupv3_wrap0_core_clk",
|
||||
"gcc_qupv3_wrap0_s0_clk",
|
||||
"gcc_qupv3_wrap0_s1_clk",
|
||||
"gcc_qupv3_wrap0_s2_clk",
|
||||
"gcc_qupv3_wrap0_s3_clk",
|
||||
"gcc_qupv3_wrap0_s4_clk",
|
||||
"gcc_qupv3_wrap0_s5_clk",
|
||||
"gcc_qupv3_wrap1_core_2x_clk",
|
||||
"gcc_qupv3_wrap1_core_clk",
|
||||
"gcc_qupv3_wrap1_s0_clk",
|
||||
"gcc_qupv3_wrap1_s1_clk",
|
||||
"gcc_qupv3_wrap1_s2_clk",
|
||||
"gcc_qupv3_wrap1_s3_clk",
|
||||
"gcc_qupv3_wrap1_s4_clk",
|
||||
"gcc_qupv3_wrap1_s5_clk",
|
||||
"gcc_qupv3_wrap_0_m_ahb_clk",
|
||||
"gcc_qupv3_wrap_0_s_ahb_clk",
|
||||
"gcc_qupv3_wrap_1_m_ahb_clk",
|
||||
"gcc_qupv3_wrap_1_s_ahb_clk",
|
||||
"gcc_sdcc1_ahb_clk",
|
||||
"gcc_sdcc1_apps_clk",
|
||||
"gcc_sdcc1_ice_core_clk",
|
||||
"gcc_sdcc2_ahb_clk",
|
||||
"gcc_sdcc2_apps_clk",
|
||||
"gcc_sys_noc_cpuss_ahb_clk",
|
||||
"gcc_sys_noc_ufs_phy_axi_clk",
|
||||
"gcc_sys_noc_usb3_prim_axi_clk",
|
||||
"gcc_ufs_phy_ahb_clk",
|
||||
"gcc_ufs_phy_axi_clk",
|
||||
"gcc_ufs_phy_ice_core_clk",
|
||||
"gcc_ufs_phy_phy_aux_clk",
|
||||
"gcc_ufs_phy_rx_symbol_0_clk",
|
||||
"gcc_ufs_phy_tx_symbol_0_clk",
|
||||
"gcc_ufs_phy_unipro_core_clk",
|
||||
"gcc_usb30_prim_master_clk",
|
||||
"gcc_usb30_prim_mock_utmi_clk",
|
||||
"gcc_usb30_prim_sleep_clk",
|
||||
"gcc_usb3_prim_phy_com_aux_clk",
|
||||
"gcc_usb3_prim_phy_pipe_clk",
|
||||
"gcc_vcodec0_axi_clk",
|
||||
"gcc_venus_ahb_clk",
|
||||
"gcc_venus_ctl_axi_clk",
|
||||
"gcc_video_ahb_clk",
|
||||
"gcc_video_axi0_clk",
|
||||
"gcc_video_throttle_core_clk",
|
||||
"gcc_video_vcodec0_sys_clk",
|
||||
"gcc_video_venus_ctl_clk",
|
||||
"gcc_video_xo_clk",
|
||||
"gpu_cc_debug_mux",
|
||||
"mc_cc_debug_mux",
|
||||
"measure_only_cnoc_clk",
|
||||
"measure_only_ipa_2x_clk",
|
||||
"measure_only_snoc_clk",
|
||||
"measure_only_hwkm_km_core_clk",
|
||||
"measure_only_hwkm_ahb_clk",
|
||||
"measure_only_pka_core_clk",
|
||||
"measure_only_pka_ahb_clk",
|
||||
};
|
||||
|
||||
static int gcc_debug_mux_sels[] = {
|
||||
0xBA, /* cpu_cc_debug_mux */
|
||||
0x41, /* disp_cc_debug_mux */
|
||||
0x63, /* gcc_ahb2phy_csi_clk */
|
||||
0x64, /* gcc_ahb2phy_usb_clk */
|
||||
0x99, /* gcc_bimc_gpu_axi_clk */
|
||||
0x80, /* gcc_boot_rom_ahb_clk */
|
||||
0x4B, /* gcc_cam_throttle_nrt_clk */
|
||||
0x4A, /* gcc_cam_throttle_rt_clk */
|
||||
0x36, /* gcc_camera_ahb_clk */
|
||||
0x3E, /* gcc_camera_xo_clk */
|
||||
0x14F, /* gcc_camss_axi_clk */
|
||||
0x151, /* gcc_camss_camnoc_atb_clk */
|
||||
0x152, /* gcc_camss_camnoc_nts_xo_clk */
|
||||
0x14C, /* gcc_camss_cci_0_clk */
|
||||
0x14D, /* gcc_camss_cci_1_clk */
|
||||
0x13B, /* gcc_camss_cphy_0_clk */
|
||||
0x13C, /* gcc_camss_cphy_1_clk */
|
||||
0x13D, /* gcc_camss_cphy_2_clk */
|
||||
0x13E, /* gcc_camss_cphy_3_clk */
|
||||
0x12B, /* gcc_camss_csi0phytimer_clk */
|
||||
0x12C, /* gcc_camss_csi1phytimer_clk */
|
||||
0x12D, /* gcc_camss_csi2phytimer_clk */
|
||||
0x12E, /* gcc_camss_csi3phytimer_clk */
|
||||
0x12F, /* gcc_camss_mclk0_clk */
|
||||
0x130, /* gcc_camss_mclk1_clk */
|
||||
0x131, /* gcc_camss_mclk2_clk */
|
||||
0x132, /* gcc_camss_mclk3_clk */
|
||||
0x133, /* gcc_camss_mclk4_clk */
|
||||
0x153, /* gcc_camss_nrt_axi_clk */
|
||||
0x14B, /* gcc_camss_ope_ahb_clk */
|
||||
0x149, /* gcc_camss_ope_clk */
|
||||
0x155, /* gcc_camss_rt_axi_clk */
|
||||
0x134, /* gcc_camss_tfe_0_clk */
|
||||
0x138, /* gcc_camss_tfe_0_cphy_rx_clk */
|
||||
0x13F, /* gcc_camss_tfe_0_csid_clk */
|
||||
0x135, /* gcc_camss_tfe_1_clk */
|
||||
0x139, /* gcc_camss_tfe_1_cphy_rx_clk */
|
||||
0x141, /* gcc_camss_tfe_1_csid_clk */
|
||||
0x136, /* gcc_camss_tfe_2_clk */
|
||||
0x13A, /* gcc_camss_tfe_2_cphy_rx_clk */
|
||||
0x143, /* gcc_camss_tfe_2_csid_clk */
|
||||
0x14E, /* gcc_camss_top_ahb_clk */
|
||||
0x1E, /* gcc_cfg_noc_usb3_prim_axi_clk */
|
||||
0xB5, /* gcc_cpuss_gnoc_clk */
|
||||
0x37, /* gcc_disp_ahb_clk */
|
||||
0x46, /* gcc_disp_gpll0_div_clk_src */
|
||||
0x3C, /* gcc_disp_hf_axi_clk */
|
||||
0x4C, /* gcc_disp_sleep_clk */
|
||||
0x48, /* gcc_disp_throttle_core_clk */
|
||||
0x3F, /* gcc_disp_xo_clk */
|
||||
0xC5, /* gcc_gp1_clk */
|
||||
0xC6, /* gcc_gp2_clk */
|
||||
0xC7, /* gcc_gp3_clk */
|
||||
0xF5, /* gcc_gpu_cfg_ahb_clk */
|
||||
0xFB, /* gcc_gpu_gpll0_clk_src */
|
||||
0xFC, /* gcc_gpu_gpll0_div_clk_src */
|
||||
0xF8, /* gcc_gpu_memnoc_gfx_clk */
|
||||
0xFA, /* gcc_gpu_snoc_dvm_gfx_clk */
|
||||
0xFF, /* gcc_gpu_throttle_core_clk */
|
||||
0x7D, /* gcc_pdm2_clk */
|
||||
0x7B, /* gcc_pdm_ahb_clk */
|
||||
0x7C, /* gcc_pdm_xo4_clk */
|
||||
0x7E, /* gcc_prng_ahb_clk */
|
||||
0x39, /* gcc_qmip_camera_nrt_ahb_clk */
|
||||
0x47, /* gcc_qmip_camera_rt_ahb_clk */
|
||||
0x3A, /* gcc_qmip_disp_ahb_clk */
|
||||
0xFD, /* gcc_qmip_gpu_cfg_ahb_clk */
|
||||
0x38, /* gcc_qmip_video_vcodec_ahb_clk */
|
||||
0x6A, /* gcc_qupv3_wrap0_core_2x_clk */
|
||||
0x69, /* gcc_qupv3_wrap0_core_clk */
|
||||
0x6B, /* gcc_qupv3_wrap0_s0_clk */
|
||||
0x6C, /* gcc_qupv3_wrap0_s1_clk */
|
||||
0x6D, /* gcc_qupv3_wrap0_s2_clk */
|
||||
0x6E, /* gcc_qupv3_wrap0_s3_clk */
|
||||
0x6F, /* gcc_qupv3_wrap0_s4_clk */
|
||||
0x70, /* gcc_qupv3_wrap0_s5_clk */
|
||||
0x74, /* gcc_qupv3_wrap1_core_2x_clk */
|
||||
0x73, /* gcc_qupv3_wrap1_core_clk */
|
||||
0x75, /* gcc_qupv3_wrap1_s0_clk */
|
||||
0x76, /* gcc_qupv3_wrap1_s1_clk */
|
||||
0x77, /* gcc_qupv3_wrap1_s2_clk */
|
||||
0x78, /* gcc_qupv3_wrap1_s3_clk */
|
||||
0x79, /* gcc_qupv3_wrap1_s4_clk */
|
||||
0x7A, /* gcc_qupv3_wrap1_s5_clk */
|
||||
0x67, /* gcc_qupv3_wrap_0_m_ahb_clk */
|
||||
0x68, /* gcc_qupv3_wrap_0_s_ahb_clk */
|
||||
0x71, /* gcc_qupv3_wrap_1_m_ahb_clk */
|
||||
0x72, /* gcc_qupv3_wrap_1_s_ahb_clk */
|
||||
0x103, /* gcc_sdcc1_ahb_clk */
|
||||
0x102, /* gcc_sdcc1_apps_clk */
|
||||
0x104, /* gcc_sdcc1_ice_core_clk */
|
||||
0x66, /* gcc_sdcc2_ahb_clk */
|
||||
0x65, /* gcc_sdcc2_apps_clk */
|
||||
0x9, /* gcc_sys_noc_cpuss_ahb_clk */
|
||||
0x1B, /* gcc_sys_noc_ufs_phy_axi_clk */
|
||||
0x1A, /* gcc_sys_noc_usb3_prim_axi_clk */
|
||||
0x122, /* gcc_ufs_phy_ahb_clk */
|
||||
0x121, /* gcc_ufs_phy_axi_clk */
|
||||
0x128, /* gcc_ufs_phy_ice_core_clk */
|
||||
0x129, /* gcc_ufs_phy_phy_aux_clk */
|
||||
0x124, /* gcc_ufs_phy_rx_symbol_0_clk */
|
||||
0x123, /* gcc_ufs_phy_tx_symbol_0_clk */
|
||||
0x127, /* gcc_ufs_phy_unipro_core_clk */
|
||||
0x5C, /* gcc_usb30_prim_master_clk */
|
||||
0x5E, /* gcc_usb30_prim_mock_utmi_clk */
|
||||
0x5D, /* gcc_usb30_prim_sleep_clk */
|
||||
0x5F, /* gcc_usb3_prim_phy_com_aux_clk */
|
||||
0x60, /* gcc_usb3_prim_phy_pipe_clk */
|
||||
0x15B, /* gcc_vcodec0_axi_clk */
|
||||
0x15C, /* gcc_venus_ahb_clk */
|
||||
0x15A, /* gcc_venus_ctl_axi_clk */
|
||||
0x35, /* gcc_video_ahb_clk */
|
||||
0x3B, /* gcc_video_axi0_clk */
|
||||
0x49, /* gcc_video_throttle_core_clk */
|
||||
0x158, /* gcc_video_vcodec0_sys_clk */
|
||||
0x156, /* gcc_video_venus_ctl_clk */
|
||||
0x3D, /* gcc_video_xo_clk */
|
||||
0xF7, /* gpu_cc_debug_mux */
|
||||
0xA9, /* mc_cc_debug_mux */
|
||||
0x1C, /* measure_only_cnoc_clk */
|
||||
0xD2, /* measure_only_ipa_2x_clk */
|
||||
0x7, /* measure_only_snoc_clk */
|
||||
0x162, /* measure_only_hwkm_km_core_clk */
|
||||
0x161, /* measure_only_hwkm_ahb_clk */
|
||||
0x15E, /* measure_only_pka_core_clk */
|
||||
0x15D, /* measure_only_pka_ahb_clk */
|
||||
};
|
||||
|
||||
static struct clk_debug_mux gcc_debug_mux = {
|
||||
.priv = &debug_mux_priv,
|
||||
.debug_offset = 0x62000,
|
||||
.post_div_offset = 0x30000,
|
||||
.cbcr_offset = 0x30004,
|
||||
.src_sel_mask = 0x3FF,
|
||||
.src_sel_shift = 0,
|
||||
.post_div_mask = 0xF,
|
||||
.post_div_shift = 0,
|
||||
.post_div_val = 1,
|
||||
.mux_sels = gcc_debug_mux_sels,
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gcc_debug_mux",
|
||||
.ops = &clk_debug_mux_ops,
|
||||
.parent_names = gcc_debug_mux_parent_names,
|
||||
.num_parents = ARRAY_SIZE(gcc_debug_mux_parent_names),
|
||||
.flags = CLK_IS_MEASURE,
|
||||
},
|
||||
};
|
||||
|
||||
static const char *const gpu_cc_debug_mux_parent_names[] = {
|
||||
"gpu_cc_ahb_clk",
|
||||
"gpu_cc_cx_gfx3d_clk",
|
||||
"gpu_cc_cx_gfx3d_slv_clk",
|
||||
"gpu_cc_cx_gmu_clk",
|
||||
"gpu_cc_cx_snoc_dvm_clk",
|
||||
"gpu_cc_cxo_aon_clk",
|
||||
"gpu_cc_cxo_clk",
|
||||
"gpu_cc_gx_cxo_clk",
|
||||
"gpu_cc_gx_gfx3d_clk",
|
||||
"gpu_cc_gx_gmu_clk",
|
||||
"gpu_cc_sleep_clk",
|
||||
};
|
||||
|
||||
static int gpu_cc_debug_mux_sels[] = {
|
||||
0x11, /* gpu_cc_ahb_clk */
|
||||
0x1A, /* gpu_cc_cx_gfx3d_clk */
|
||||
0x1B, /* gpu_cc_cx_gfx3d_slv_clk */
|
||||
0x19, /* gpu_cc_cx_gmu_clk */
|
||||
0x16, /* gpu_cc_cx_snoc_dvm_clk */
|
||||
0xB, /* gpu_cc_cxo_aon_clk */
|
||||
0xA, /* gpu_cc_cxo_clk */
|
||||
0xF, /* gpu_cc_gx_cxo_clk */
|
||||
0xC, /* gpu_cc_gx_gfx3d_clk */
|
||||
0x10, /* gpu_cc_gx_gmu_clk */
|
||||
0x17, /* gpu_cc_sleep_clk */
|
||||
};
|
||||
|
||||
static struct clk_debug_mux gpu_cc_debug_mux = {
|
||||
.priv = &debug_mux_priv,
|
||||
.debug_offset = 0x1568,
|
||||
.post_div_offset = 0x10FC,
|
||||
.cbcr_offset = 0x1100,
|
||||
.src_sel_mask = 0xFF,
|
||||
.src_sel_shift = 0,
|
||||
.post_div_mask = 0x3,
|
||||
.post_div_shift = 0,
|
||||
.post_div_val = 2,
|
||||
.mux_sels = gpu_cc_debug_mux_sels,
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_debug_mux",
|
||||
.ops = &clk_debug_mux_ops,
|
||||
.parent_names = gpu_cc_debug_mux_parent_names,
|
||||
.num_parents = ARRAY_SIZE(gpu_cc_debug_mux_parent_names),
|
||||
.flags = CLK_IS_MEASURE,
|
||||
},
|
||||
};
|
||||
|
||||
static const char *const mc_cc_debug_mux_parent_names[] = {
|
||||
"measure_only_mccc_clk",
|
||||
};
|
||||
|
||||
static struct clk_debug_mux mc_cc_debug_mux = {
|
||||
.period_offset = 0x20,
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "mc_cc_debug_mux",
|
||||
.ops = &clk_debug_mux_ops,
|
||||
.parent_names = mc_cc_debug_mux_parent_names,
|
||||
.num_parents = ARRAY_SIZE(mc_cc_debug_mux_parent_names),
|
||||
.flags = CLK_IS_MEASURE,
|
||||
},
|
||||
};
|
||||
|
||||
static struct mux_regmap_names mux_list[] = {
|
||||
{ .mux = &cpu_cc_debug_mux, .regmap_name = "qcom,cpucc" },
|
||||
{ .mux = &disp_cc_debug_mux, .regmap_name = "qcom,dispcc" },
|
||||
{ .mux = &gcc_debug_mux, .regmap_name = "qcom,gcc" },
|
||||
{ .mux = &gpu_cc_debug_mux, .regmap_name = "qcom,gpucc" },
|
||||
{ .mux = &mc_cc_debug_mux, .regmap_name = "qcom,mccc" },
|
||||
};
|
||||
|
||||
static struct clk_dummy measure_only_mccc_clk = {
|
||||
.rrate = 1000,
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "measure_only_mccc_clk",
|
||||
.ops = &clk_dummy_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_dummy measure_only_cnoc_clk = {
|
||||
.rrate = 1000,
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "measure_only_cnoc_clk",
|
||||
.ops = &clk_dummy_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_dummy measure_only_ipa_2x_clk = {
|
||||
.rrate = 1000,
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "measure_only_ipa_2x_clk",
|
||||
.ops = &clk_dummy_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_dummy measure_only_snoc_clk = {
|
||||
.rrate = 1000,
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "measure_only_snoc_clk",
|
||||
.ops = &clk_dummy_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_dummy measure_only_hwkm_km_core_clk = {
|
||||
.rrate = 1000,
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "measure_only_hwkm_km_core_clk",
|
||||
.ops = &clk_dummy_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_dummy measure_only_hwkm_ahb_clk = {
|
||||
.rrate = 1000,
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "measure_only_hwkm_ahb_clk",
|
||||
.ops = &clk_dummy_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_dummy measure_only_pka_core_clk = {
|
||||
.rrate = 1000,
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "measure_only_pka_core_clk",
|
||||
.ops = &clk_dummy_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_dummy measure_only_pka_ahb_clk = {
|
||||
.rrate = 1000,
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "measure_only_pka_ahb_clk",
|
||||
.ops = &clk_dummy_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_dummy perfcl_clk = {
|
||||
.rrate = 1000,
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "perfcl_clk",
|
||||
.ops = &clk_dummy_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_dummy pwrcl_clk = {
|
||||
.rrate = 1000,
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "pwrcl_clk",
|
||||
.ops = &clk_dummy_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_dummy l3_clk = {
|
||||
.rrate = 1000,
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "l3_clk",
|
||||
.ops = &clk_dummy_ops,
|
||||
},
|
||||
};
|
||||
|
||||
struct clk_hw *debugcc_holi_hws[] = {
|
||||
&measure_only_cnoc_clk.hw,
|
||||
&measure_only_ipa_2x_clk.hw,
|
||||
&measure_only_mccc_clk.hw,
|
||||
&measure_only_snoc_clk.hw,
|
||||
&measure_only_hwkm_km_core_clk.hw,
|
||||
&measure_only_hwkm_ahb_clk.hw,
|
||||
&measure_only_pka_core_clk.hw,
|
||||
&measure_only_pka_ahb_clk.hw,
|
||||
&perfcl_clk.hw,
|
||||
&pwrcl_clk.hw,
|
||||
&l3_clk.hw,
|
||||
};
|
||||
|
||||
static const struct of_device_id clk_debug_match_table[] = {
|
||||
{ .compatible = "qcom,holi-debugcc" },
|
||||
{ }
|
||||
};
|
||||
|
||||
static int clk_debug_holi_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct clk *clk;
|
||||
int ret = 0, i;
|
||||
|
||||
BUILD_BUG_ON(ARRAY_SIZE(disp_cc_debug_mux_parent_names) !=
|
||||
ARRAY_SIZE(disp_cc_debug_mux_sels));
|
||||
BUILD_BUG_ON(ARRAY_SIZE(gcc_debug_mux_parent_names) !=
|
||||
ARRAY_SIZE(gcc_debug_mux_sels));
|
||||
BUILD_BUG_ON(ARRAY_SIZE(gpu_cc_debug_mux_parent_names) !=
|
||||
ARRAY_SIZE(gpu_cc_debug_mux_sels));
|
||||
|
||||
clk = devm_clk_get(&pdev->dev, "xo_clk_src");
|
||||
if (IS_ERR(clk)) {
|
||||
if (PTR_ERR(clk) != -EPROBE_DEFER)
|
||||
dev_err(&pdev->dev, "Unable to get xo clock\n");
|
||||
return PTR_ERR(clk);
|
||||
}
|
||||
|
||||
debug_mux_priv.cxo = clk;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(mux_list); i++) {
|
||||
ret = map_debug_bases(pdev, mux_list[i].regmap_name,
|
||||
mux_list[i].mux);
|
||||
if (ret == -EBADR)
|
||||
continue;
|
||||
else if (ret)
|
||||
return ret;
|
||||
|
||||
clk = devm_clk_register(&pdev->dev, &mux_list[i].mux->hw);
|
||||
if (IS_ERR(clk)) {
|
||||
dev_err(&pdev->dev, "Unable to register %s, err:(%d)\n",
|
||||
clk_hw_get_name(&mux_list[i].mux->hw),
|
||||
PTR_ERR(clk));
|
||||
return PTR_ERR(clk);
|
||||
}
|
||||
}
|
||||
|
||||
ret = clk_debug_measure_register(&gcc_debug_mux.hw);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "Could not register Measure clocks\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(debugcc_holi_hws); i++) {
|
||||
clk = devm_clk_register(&pdev->dev, debugcc_holi_hws[i]);
|
||||
if (IS_ERR(clk)) {
|
||||
dev_err(&pdev->dev, "Unable to register %s, err:(%d)\n",
|
||||
clk_hw_get_name(debugcc_holi_hws[i]),
|
||||
PTR_ERR(clk));
|
||||
return PTR_ERR(clk);
|
||||
}
|
||||
}
|
||||
|
||||
dev_info(&pdev->dev, "Registered debug measure clocks\n");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static struct platform_driver clk_debug_driver = {
|
||||
.probe = clk_debug_holi_probe,
|
||||
.driver = {
|
||||
.name = "holi-debugcc",
|
||||
.of_match_table = clk_debug_match_table,
|
||||
},
|
||||
};
|
||||
|
||||
static int __init clk_debug_holi_init(void)
|
||||
{
|
||||
return platform_driver_register(&clk_debug_driver);
|
||||
}
|
||||
arch_initcall(clk_debug_holi_init);
|
||||
|
||||
MODULE_DESCRIPTION("QTI DEBUG CC HOLI Driver");
|
||||
MODULE_LICENSE("GPL v2");
|
@ -454,6 +454,14 @@ static const char *const gcc_debug_mux_parent_names[] = {
|
||||
"measure_only_ipa_2x_clk",
|
||||
"measure_only_memnoc_clk",
|
||||
"measure_only_snoc_clk",
|
||||
"pcie_0_pipe_clk",
|
||||
"pcie_1_pipe_clk",
|
||||
"ufs_card_rx_symbol_0_clk",
|
||||
"ufs_card_rx_symbol_1_clk",
|
||||
"ufs_card_tx_symbol_0_clk",
|
||||
"ufs_phy_rx_symbol_0_clk",
|
||||
"ufs_phy_rx_symbol_1_clk",
|
||||
"ufs_phy_tx_symbol_0_clk",
|
||||
"usb3_phy_wrapper_gcc_usb30_pipe_clk",
|
||||
"usb3_uni_phy_sec_gcc_usb30_pipe_clk",
|
||||
"video_cc_debug_mux",
|
||||
@ -591,6 +599,14 @@ static int gcc_debug_mux_sels[] = {
|
||||
0x140, /* measure_only_ipa_2x_clk */
|
||||
0xCF, /* measure_only_memnoc_clk */
|
||||
0x9, /* measure_only_snoc_clk */
|
||||
0xFB, /* pcie_0_pipe_clk */
|
||||
0x104, /* pcie_1_pipe_clk */
|
||||
0x10B, /* ufs_card_rx_symbol_0_clk */
|
||||
0x110, /* ufs_card_rx_symbol_1_clk */
|
||||
0x10A, /* ufs_card_tx_symbol_0_clk */
|
||||
0x117, /* ufs_phy_rx_symbol_0_clk */
|
||||
0x11C, /* ufs_phy_rx_symbol_1_clk */
|
||||
0x116, /* ufs_phy_tx_symbol_0_clk */
|
||||
0x7C, /* usb3_phy_wrapper_gcc_usb30_pipe_clk */
|
||||
0x7D, /* usb3_uni_phy_sec_gcc_usb30_pipe_clk */
|
||||
0x5A, /* video_cc_debug_mux */
|
||||
@ -900,13 +916,17 @@ static int clk_debug_lahaina_probe(struct platform_device *pdev)
|
||||
debug_mux_priv.cxo = clk;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(mux_list); i++) {
|
||||
ret = map_debug_bases(pdev, mux_list[i].regmap_name,
|
||||
mux_list[i].mux);
|
||||
if (ret == -EBADR)
|
||||
continue;
|
||||
else if (ret)
|
||||
return ret;
|
||||
if (IS_ERR_OR_NULL(mux_list[i].mux->regmap)) {
|
||||
ret = map_debug_bases(pdev,
|
||||
mux_list[i].regmap_name, mux_list[i].mux);
|
||||
if (ret == -EBADR)
|
||||
continue;
|
||||
else if (ret)
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(mux_list); i++) {
|
||||
clk = devm_clk_register(&pdev->dev, &mux_list[i].mux->hw);
|
||||
if (IS_ERR(clk)) {
|
||||
dev_err(&pdev->dev, "Unable to register %s, err:(%d)\n",
|
||||
|
318
drivers/clk/qcom/debugcc-sdxlemur.c
Normal file
318
drivers/clk/qcom/debugcc-sdxlemur.c
Normal file
@ -0,0 +1,318 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (c) 2020, The Linux Foundation. All rights reserved.
|
||||
*/
|
||||
|
||||
#define pr_fmt(fmt) "clk: %s: " fmt, __func__
|
||||
|
||||
#include <linux/clk.h>
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/mfd/syscon.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/regmap.h>
|
||||
|
||||
#include "clk-debug.h"
|
||||
#include "common.h"
|
||||
|
||||
static struct measure_clk_data debug_mux_priv = {
|
||||
.ctl_reg = 0x69004,
|
||||
.status_reg = 0x69008,
|
||||
.xo_div4_cbcr = 0x1E010,
|
||||
};
|
||||
|
||||
static const char *const apss_cc_debug_mux_parent_names[] = {
|
||||
"measure_only_apcs_clk",
|
||||
};
|
||||
|
||||
static int apss_cc_debug_mux_sels[] = {
|
||||
0x3, /* measure_only_apcs_clk */
|
||||
};
|
||||
|
||||
static int apss_cc_debug_mux_pre_divs[] = {
|
||||
0x1, /* measure_only_apcs_clk */
|
||||
};
|
||||
|
||||
static struct clk_debug_mux apss_cc_debug_mux = {
|
||||
.priv = &debug_mux_priv,
|
||||
.debug_offset = 0x18,
|
||||
.post_div_offset = 0x18,
|
||||
.cbcr_offset = 0x0,
|
||||
.src_sel_mask = 0x38,
|
||||
.src_sel_shift = 3,
|
||||
.post_div_mask = 0x0,
|
||||
.post_div_shift = 0x0,
|
||||
.post_div_val = 1,
|
||||
.mux_sels = apss_cc_debug_mux_sels,
|
||||
.pre_div_vals = apss_cc_debug_mux_pre_divs,
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "apss_cc_debug_mux",
|
||||
.ops = &clk_debug_mux_ops,
|
||||
.parent_names = apss_cc_debug_mux_parent_names,
|
||||
.num_parents = ARRAY_SIZE(apss_cc_debug_mux_parent_names),
|
||||
.flags = CLK_IS_MEASURE,
|
||||
},
|
||||
};
|
||||
|
||||
static const char *const gcc_debug_mux_parent_names[] = {
|
||||
"apss_cc_debug_mux",
|
||||
"gcc_ahb_pcie_link_clk",
|
||||
"gcc_blsp1_ahb_clk",
|
||||
"gcc_blsp1_qup1_i2c_apps_clk",
|
||||
"gcc_blsp1_qup1_spi_apps_clk",
|
||||
"gcc_blsp1_qup2_i2c_apps_clk",
|
||||
"gcc_blsp1_qup2_spi_apps_clk",
|
||||
"gcc_blsp1_qup3_i2c_apps_clk",
|
||||
"gcc_blsp1_qup3_spi_apps_clk",
|
||||
"gcc_blsp1_qup4_i2c_apps_clk",
|
||||
"gcc_blsp1_qup4_spi_apps_clk",
|
||||
"gcc_blsp1_sleep_clk",
|
||||
"gcc_blsp1_uart1_apps_clk",
|
||||
"gcc_blsp1_uart2_apps_clk",
|
||||
"gcc_blsp1_uart3_apps_clk",
|
||||
"gcc_blsp1_uart4_apps_clk",
|
||||
"gcc_boot_rom_ahb_clk",
|
||||
"gcc_cpuss_ahb_clk",
|
||||
"gcc_cpuss_gnoc_clk",
|
||||
"gcc_gp1_clk",
|
||||
"gcc_gp2_clk",
|
||||
"gcc_gp3_clk",
|
||||
"gcc_pcie_aux_clk",
|
||||
"gcc_pcie_cfg_ahb_clk",
|
||||
"gcc_pcie_mstr_axi_clk",
|
||||
"gcc_pcie_pipe_clk",
|
||||
"gcc_pcie_rchng_phy_clk",
|
||||
"gcc_pcie_sleep_clk",
|
||||
"gcc_pcie_slv_axi_clk",
|
||||
"gcc_pcie_slv_q2a_axi_clk",
|
||||
"gcc_pdm2_clk",
|
||||
"gcc_pdm_ahb_clk",
|
||||
"gcc_pdm_xo4_clk",
|
||||
"gcc_sdcc1_ahb_clk",
|
||||
"gcc_sdcc1_apps_clk",
|
||||
"gcc_sys_noc_cpuss_ahb_clk",
|
||||
"gcc_usb30_master_clk",
|
||||
"gcc_usb30_mock_utmi_clk",
|
||||
"gcc_usb30_mstr_axi_clk",
|
||||
"gcc_usb30_sleep_clk",
|
||||
"gcc_usb30_slv_ahb_clk",
|
||||
"gcc_usb3_phy_aux_clk",
|
||||
"gcc_usb3_phy_pipe_clk",
|
||||
"gcc_usb_phy_cfg_ahb2phy_clk",
|
||||
"gcc_xo_div4_clk",
|
||||
"gcc_xo_pcie_link_clk",
|
||||
"measure_only_ipa_2x_clk",
|
||||
"measure_only_snoc_clk",
|
||||
};
|
||||
|
||||
static int gcc_debug_mux_sels[] = {
|
||||
0x7C, /* apss_cc_debug_mux */
|
||||
0xCF, /* gcc_ahb_pcie_link_clk */
|
||||
0x34, /* gcc_blsp1_ahb_clk */
|
||||
0x37, /* gcc_blsp1_qup1_i2c_apps_clk */
|
||||
0x36, /* gcc_blsp1_qup1_spi_apps_clk */
|
||||
0x3B, /* gcc_blsp1_qup2_i2c_apps_clk */
|
||||
0x3A, /* gcc_blsp1_qup2_spi_apps_clk */
|
||||
0x3F, /* gcc_blsp1_qup3_i2c_apps_clk */
|
||||
0x3E, /* gcc_blsp1_qup3_spi_apps_clk */
|
||||
0x43, /* gcc_blsp1_qup4_i2c_apps_clk */
|
||||
0x42, /* gcc_blsp1_qup4_spi_apps_clk */
|
||||
0x35, /* gcc_blsp1_sleep_clk */
|
||||
0x38, /* gcc_blsp1_uart1_apps_clk */
|
||||
0x3C, /* gcc_blsp1_uart2_apps_clk */
|
||||
0x40, /* gcc_blsp1_uart3_apps_clk */
|
||||
0x44, /* gcc_blsp1_uart4_apps_clk */
|
||||
0x4B, /* gcc_boot_rom_ahb_clk */
|
||||
0x74, /* gcc_cpuss_ahb_clk */
|
||||
0x75, /* gcc_cpuss_gnoc_clk */
|
||||
0x85, /* gcc_gp1_clk */
|
||||
0x86, /* gcc_gp2_clk */
|
||||
0x87, /* gcc_gp3_clk */
|
||||
0x99, /* gcc_pcie_aux_clk */
|
||||
0x98, /* gcc_pcie_cfg_ahb_clk */
|
||||
0x97, /* gcc_pcie_mstr_axi_clk */
|
||||
0x9A, /* gcc_pcie_pipe_clk */
|
||||
0xB9, /* gcc_pcie_rchng_phy_clk */
|
||||
0x9C, /* gcc_pcie_sleep_clk */
|
||||
0x96, /* gcc_pcie_slv_axi_clk */
|
||||
0x95, /* gcc_pcie_slv_q2a_axi_clk */
|
||||
0x48, /* gcc_pdm2_clk */
|
||||
0x46, /* gcc_pdm_ahb_clk */
|
||||
0x47, /* gcc_pdm_xo4_clk */
|
||||
0x33, /* gcc_sdcc1_ahb_clk */
|
||||
0x32, /* gcc_sdcc1_apps_clk */
|
||||
0x10B, /* gcc_sys_noc_cpuss_ahb_clk */
|
||||
0x28, /* gcc_usb30_master_clk */
|
||||
0x2A, /* gcc_usb30_mock_utmi_clk */
|
||||
0x4F, /* gcc_usb30_mstr_axi_clk */
|
||||
0x29, /* gcc_usb30_sleep_clk */
|
||||
0x6B, /* gcc_usb30_slv_ahb_clk */
|
||||
0x2B, /* gcc_usb3_phy_aux_clk */
|
||||
0x2D, /* gcc_usb3_phy_pipe_clk */
|
||||
0x31, /* gcc_usb_phy_cfg_ahb2phy_clk */
|
||||
0x63, /* gcc_xo_div4_clk */
|
||||
0x77, /* gcc_xo_pcie_link_clk */
|
||||
0xAC, /* measure_only_ipa_2x_clk */
|
||||
0x109, /* measure_only_snoc_clk */
|
||||
};
|
||||
|
||||
static struct clk_debug_mux gcc_debug_mux = {
|
||||
.priv = &debug_mux_priv,
|
||||
.debug_offset = 0x69000,
|
||||
.post_div_offset = 0x25000,
|
||||
.cbcr_offset = 0x25004,
|
||||
.src_sel_mask = 0x3FF,
|
||||
.src_sel_shift = 0,
|
||||
.post_div_mask = 0xF,
|
||||
.post_div_shift = 0,
|
||||
.post_div_val = 4,
|
||||
.mux_sels = gcc_debug_mux_sels,
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gcc_debug_mux",
|
||||
.ops = &clk_debug_mux_ops,
|
||||
.parent_names = gcc_debug_mux_parent_names,
|
||||
.num_parents = ARRAY_SIZE(gcc_debug_mux_parent_names),
|
||||
.flags = CLK_IS_MEASURE,
|
||||
},
|
||||
};
|
||||
|
||||
static const char *const mc_cc_debug_mux_parent_names[] = {
|
||||
"measure_only_mccc_clk",
|
||||
};
|
||||
|
||||
static struct clk_debug_mux mc_cc_debug_mux = {
|
||||
.period_offset = 0x50,
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "mc_cc_debug_mux",
|
||||
.ops = &clk_debug_mux_ops,
|
||||
.parent_names = mc_cc_debug_mux_parent_names,
|
||||
.num_parents = ARRAY_SIZE(mc_cc_debug_mux_parent_names),
|
||||
.flags = CLK_IS_MEASURE,
|
||||
},
|
||||
};
|
||||
|
||||
static struct mux_regmap_names mux_list[] = {
|
||||
{ .mux = &apss_cc_debug_mux, .regmap_name = "qcom,apsscc" },
|
||||
{ .mux = &gcc_debug_mux, .regmap_name = "qcom,gcc" },
|
||||
{ .mux = &mc_cc_debug_mux, .regmap_name = "qcom,mccc" },
|
||||
};
|
||||
|
||||
static struct clk_dummy measure_only_apcs_clk = {
|
||||
.rrate = 1000,
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "measure_only_apcs_clk",
|
||||
.ops = &clk_dummy_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_dummy measure_only_ipa_2x_clk = {
|
||||
.rrate = 1000,
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "measure_only_ipa_2x_clk",
|
||||
.ops = &clk_dummy_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_dummy measure_only_snoc_clk = {
|
||||
.rrate = 1000,
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "measure_only_snoc_clk",
|
||||
.ops = &clk_dummy_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_dummy measure_only_mccc_clk = {
|
||||
.rrate = 1000,
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "measure_only_mccc_clk",
|
||||
.ops = &clk_dummy_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_hw *debugcc_sdxlemur_hws[] = {
|
||||
&measure_only_ipa_2x_clk.hw,
|
||||
&measure_only_snoc_clk.hw,
|
||||
&measure_only_mccc_clk.hw,
|
||||
&measure_only_apcs_clk.hw,
|
||||
};
|
||||
|
||||
static const struct of_device_id clk_debug_match_table[] = {
|
||||
{ .compatible = "qcom,sdxlemur-debugcc" },
|
||||
{ }
|
||||
};
|
||||
|
||||
static int clk_debug_sdxlemur_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct clk *clk;
|
||||
int ret = 0, i;
|
||||
|
||||
BUILD_BUG_ON(ARRAY_SIZE(gcc_debug_mux_parent_names) !=
|
||||
ARRAY_SIZE(gcc_debug_mux_sels));
|
||||
|
||||
clk = devm_clk_get(&pdev->dev, "xo_clk_src");
|
||||
if (IS_ERR(clk)) {
|
||||
if (PTR_ERR(clk) != -EPROBE_DEFER)
|
||||
dev_err(&pdev->dev, "Unable to get xo clock\n");
|
||||
return PTR_ERR(clk);
|
||||
}
|
||||
|
||||
debug_mux_priv.cxo = clk;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(mux_list); i++) {
|
||||
ret = map_debug_bases(pdev, mux_list[i].regmap_name,
|
||||
mux_list[i].mux);
|
||||
if (ret == -EBADR)
|
||||
continue;
|
||||
else if (ret)
|
||||
return ret;
|
||||
|
||||
clk = devm_clk_register(&pdev->dev, &mux_list[i].mux->hw);
|
||||
if (IS_ERR(clk)) {
|
||||
dev_err(&pdev->dev, "Unable to register %s, err:(%d)\n",
|
||||
clk_hw_get_name(&mux_list[i].mux->hw),
|
||||
PTR_ERR(clk));
|
||||
return PTR_ERR(clk);
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(debugcc_sdxlemur_hws); i++) {
|
||||
clk = devm_clk_register(&pdev->dev, debugcc_sdxlemur_hws[i]);
|
||||
if (IS_ERR(clk)) {
|
||||
dev_err(&pdev->dev, "Unable to register %s, err:(%d)\n",
|
||||
clk_hw_get_name(debugcc_sdxlemur_hws[i]),
|
||||
PTR_ERR(clk));
|
||||
return PTR_ERR(clk);
|
||||
}
|
||||
}
|
||||
|
||||
ret = clk_debug_measure_register(&gcc_debug_mux.hw);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "Could not register Measure clocks\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
dev_info(&pdev->dev, "Registered debug measure clocks\n");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static struct platform_driver clk_debug_driver = {
|
||||
.probe = clk_debug_sdxlemur_probe,
|
||||
.driver = {
|
||||
.name = "sdxlemur-debugcc",
|
||||
.of_match_table = clk_debug_match_table,
|
||||
},
|
||||
};
|
||||
|
||||
static int __init clk_debug_sdxlemur_init(void)
|
||||
{
|
||||
return platform_driver_register(&clk_debug_driver);
|
||||
}
|
||||
fs_initcall(clk_debug_sdxlemur_init);
|
||||
|
||||
MODULE_DESCRIPTION("QTI DEBUG CC SDXLEMUR Driver");
|
||||
MODULE_LICENSE("GPL v2");
|
875
drivers/clk/qcom/debugcc-shima.c
Normal file
875
drivers/clk/qcom/debugcc-shima.c
Normal file
@ -0,0 +1,875 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (c) 2020, The Linux Foundation. All rights reserved.
|
||||
*/
|
||||
|
||||
#include <linux/clk.h>
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/mfd/syscon.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/regmap.h>
|
||||
|
||||
#include "clk-debug.h"
|
||||
#include "common.h"
|
||||
|
||||
static struct measure_clk_data debug_mux_priv = {
|
||||
.ctl_reg = 0x62038,
|
||||
.status_reg = 0x6203C,
|
||||
.xo_div4_cbcr = 0x6200C,
|
||||
};
|
||||
|
||||
static const char *const apss_cc_debug_mux_parent_names[] = {
|
||||
"measure_only_apcs_gold_post_acd_clk",
|
||||
"measure_only_apcs_goldplus_post_acd_clk",
|
||||
"measure_only_apcs_l3_post_acd_clk",
|
||||
"measure_only_apcs_silver_post_acd_clk",
|
||||
};
|
||||
|
||||
static int apss_cc_debug_mux_sels[] = {
|
||||
0x25, /* measure_only_apcs_gold_post_acd_clk */
|
||||
0x61, /* measure_only_apcs_goldplus_post_acd_clk */
|
||||
0x41, /* measure_only_apcs_l3_post_acd_clk */
|
||||
0x21, /* measure_only_apcs_silver_post_acd_clk */
|
||||
};
|
||||
|
||||
static int apss_cc_debug_mux_pre_divs[] = {
|
||||
0x8, /* measure_only_apcs_gold_post_acd_clk */
|
||||
0x8, /* measure_only_apcs_goldplus_post_acd_clk */
|
||||
0x4, /* measure_only_apcs_l3_post_acd_clk */
|
||||
0x4, /* measure_only_apcs_silver_post_acd_clk */
|
||||
};
|
||||
|
||||
static struct clk_debug_mux apss_cc_debug_mux = {
|
||||
.priv = &debug_mux_priv,
|
||||
.debug_offset = 0x18,
|
||||
.post_div_offset = 0x18,
|
||||
.cbcr_offset = 0x0,
|
||||
.src_sel_mask = 0x7F0,
|
||||
.src_sel_shift = 4,
|
||||
.post_div_mask = 0x7800,
|
||||
.post_div_shift = 11,
|
||||
.post_div_val = 1,
|
||||
.mux_sels = apss_cc_debug_mux_sels,
|
||||
.pre_div_vals = apss_cc_debug_mux_pre_divs,
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "apss_cc_debug_mux",
|
||||
.ops = &clk_debug_mux_ops,
|
||||
.parent_names = apss_cc_debug_mux_parent_names,
|
||||
.num_parents = ARRAY_SIZE(apss_cc_debug_mux_parent_names),
|
||||
.flags = CLK_IS_MEASURE,
|
||||
},
|
||||
};
|
||||
|
||||
static const char *const cam_cc_debug_mux_parent_names[] = {
|
||||
"cam_cc_bps_ahb_clk",
|
||||
"cam_cc_bps_areg_clk",
|
||||
"cam_cc_bps_axi_clk",
|
||||
"cam_cc_bps_clk",
|
||||
"cam_cc_camnoc_axi_clk",
|
||||
"cam_cc_camnoc_dcd_xo_clk",
|
||||
"cam_cc_cci_0_clk",
|
||||
"cam_cc_cci_1_clk",
|
||||
"cam_cc_core_ahb_clk",
|
||||
"cam_cc_cpas_ahb_clk",
|
||||
"cam_cc_csi0phytimer_clk",
|
||||
"cam_cc_csi1phytimer_clk",
|
||||
"cam_cc_csi2phytimer_clk",
|
||||
"cam_cc_csi3phytimer_clk",
|
||||
"cam_cc_csi4phytimer_clk",
|
||||
"cam_cc_csi5phytimer_clk",
|
||||
"cam_cc_csiphy0_clk",
|
||||
"cam_cc_csiphy1_clk",
|
||||
"cam_cc_csiphy2_clk",
|
||||
"cam_cc_csiphy3_clk",
|
||||
"cam_cc_csiphy4_clk",
|
||||
"cam_cc_csiphy5_clk",
|
||||
"cam_cc_gdsc_clk",
|
||||
"cam_cc_icp_ahb_clk",
|
||||
"cam_cc_icp_clk",
|
||||
"cam_cc_ife_0_ahb_clk",
|
||||
"cam_cc_ife_0_areg_clk",
|
||||
"cam_cc_ife_0_axi_clk",
|
||||
"cam_cc_ife_0_clk",
|
||||
"cam_cc_ife_0_cphy_rx_clk",
|
||||
"cam_cc_ife_0_csid_clk",
|
||||
"cam_cc_ife_0_dsp_clk",
|
||||
"cam_cc_ife_1_ahb_clk",
|
||||
"cam_cc_ife_1_areg_clk",
|
||||
"cam_cc_ife_1_axi_clk",
|
||||
"cam_cc_ife_1_clk",
|
||||
"cam_cc_ife_1_cphy_rx_clk",
|
||||
"cam_cc_ife_1_csid_clk",
|
||||
"cam_cc_ife_1_dsp_clk",
|
||||
"cam_cc_ife_2_ahb_clk",
|
||||
"cam_cc_ife_2_areg_clk",
|
||||
"cam_cc_ife_2_axi_clk",
|
||||
"cam_cc_ife_2_clk",
|
||||
"cam_cc_ife_2_cphy_rx_clk",
|
||||
"cam_cc_ife_2_csid_clk",
|
||||
"cam_cc_ife_lite_ahb_clk",
|
||||
"cam_cc_ife_lite_axi_clk",
|
||||
"cam_cc_ife_lite_clk",
|
||||
"cam_cc_ife_lite_cphy_rx_clk",
|
||||
"cam_cc_ife_lite_csid_clk",
|
||||
"cam_cc_ipe_0_ahb_clk",
|
||||
"cam_cc_ipe_0_areg_clk",
|
||||
"cam_cc_ipe_0_axi_clk",
|
||||
"cam_cc_ipe_0_clk",
|
||||
"cam_cc_jpeg_clk",
|
||||
"cam_cc_mclk0_clk",
|
||||
"cam_cc_mclk1_clk",
|
||||
"cam_cc_mclk2_clk",
|
||||
"cam_cc_mclk3_clk",
|
||||
"cam_cc_mclk4_clk",
|
||||
"cam_cc_mclk5_clk",
|
||||
"cam_cc_sleep_clk",
|
||||
};
|
||||
|
||||
static int cam_cc_debug_mux_sels[] = {
|
||||
0x18, /* cam_cc_bps_ahb_clk */
|
||||
0x17, /* cam_cc_bps_areg_clk */
|
||||
0x16, /* cam_cc_bps_axi_clk */
|
||||
0x14, /* cam_cc_bps_clk */
|
||||
0x3C, /* cam_cc_camnoc_axi_clk */
|
||||
0x3D, /* cam_cc_camnoc_dcd_xo_clk */
|
||||
0x39, /* cam_cc_cci_0_clk */
|
||||
0x3A, /* cam_cc_cci_1_clk */
|
||||
0x40, /* cam_cc_core_ahb_clk */
|
||||
0x3B, /* cam_cc_cpas_ahb_clk */
|
||||
0x8, /* cam_cc_csi0phytimer_clk */
|
||||
0xA, /* cam_cc_csi1phytimer_clk */
|
||||
0xC, /* cam_cc_csi2phytimer_clk */
|
||||
0xE, /* cam_cc_csi3phytimer_clk */
|
||||
0x10, /* cam_cc_csi4phytimer_clk */
|
||||
0x12, /* cam_cc_csi5phytimer_clk */
|
||||
0x9, /* cam_cc_csiphy0_clk */
|
||||
0xB, /* cam_cc_csiphy1_clk */
|
||||
0xD, /* cam_cc_csiphy2_clk */
|
||||
0xF, /* cam_cc_csiphy3_clk */
|
||||
0x11, /* cam_cc_csiphy4_clk */
|
||||
0x13, /* cam_cc_csiphy5_clk */
|
||||
0x41, /* cam_cc_gdsc_clk */
|
||||
0x36, /* cam_cc_icp_ahb_clk */
|
||||
0x35, /* cam_cc_icp_clk */
|
||||
0x26, /* cam_cc_ife_0_ahb_clk */
|
||||
0x1F, /* cam_cc_ife_0_areg_clk */
|
||||
0x25, /* cam_cc_ife_0_axi_clk */
|
||||
0x1E, /* cam_cc_ife_0_clk */
|
||||
0x24, /* cam_cc_ife_0_cphy_rx_clk */
|
||||
0x22, /* cam_cc_ife_0_csid_clk */
|
||||
0x21, /* cam_cc_ife_0_dsp_clk */
|
||||
0x2E, /* cam_cc_ife_1_ahb_clk */
|
||||
0x29, /* cam_cc_ife_1_areg_clk */
|
||||
0x2D, /* cam_cc_ife_1_axi_clk */
|
||||
0x27, /* cam_cc_ife_1_clk */
|
||||
0x2C, /* cam_cc_ife_1_cphy_rx_clk */
|
||||
0x2B, /* cam_cc_ife_1_csid_clk */
|
||||
0x2A, /* cam_cc_ife_1_dsp_clk */
|
||||
0x54, /* cam_cc_ife_2_ahb_clk */
|
||||
0x37, /* cam_cc_ife_2_areg_clk */
|
||||
0x53, /* cam_cc_ife_2_axi_clk */
|
||||
0x7, /* cam_cc_ife_2_clk */
|
||||
0x52, /* cam_cc_ife_2_cphy_rx_clk */
|
||||
0x51, /* cam_cc_ife_2_csid_clk */
|
||||
0x32, /* cam_cc_ife_lite_ahb_clk */
|
||||
0x49, /* cam_cc_ife_lite_axi_clk */
|
||||
0x2F, /* cam_cc_ife_lite_clk */
|
||||
0x31, /* cam_cc_ife_lite_cphy_rx_clk */
|
||||
0x30, /* cam_cc_ife_lite_csid_clk */
|
||||
0x1D, /* cam_cc_ipe_0_ahb_clk */
|
||||
0x1C, /* cam_cc_ipe_0_areg_clk */
|
||||
0x1B, /* cam_cc_ipe_0_axi_clk */
|
||||
0x19, /* cam_cc_ipe_0_clk */
|
||||
0x33, /* cam_cc_jpeg_clk */
|
||||
0x1, /* cam_cc_mclk0_clk */
|
||||
0x2, /* cam_cc_mclk1_clk */
|
||||
0x3, /* cam_cc_mclk2_clk */
|
||||
0x4, /* cam_cc_mclk3_clk */
|
||||
0x5, /* cam_cc_mclk4_clk */
|
||||
0x6, /* cam_cc_mclk5_clk */
|
||||
0x42, /* cam_cc_sleep_clk */
|
||||
};
|
||||
|
||||
static struct clk_debug_mux cam_cc_debug_mux = {
|
||||
.priv = &debug_mux_priv,
|
||||
.debug_offset = 0xd000,
|
||||
.post_div_offset = 0xd004,
|
||||
.cbcr_offset = 0xd008,
|
||||
.src_sel_mask = 0xFF,
|
||||
.src_sel_shift = 0,
|
||||
.post_div_mask = 0xF,
|
||||
.post_div_shift = 0,
|
||||
.post_div_val = 4,
|
||||
.mux_sels = cam_cc_debug_mux_sels,
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "cam_cc_debug_mux",
|
||||
.ops = &clk_debug_mux_ops,
|
||||
.parent_names = cam_cc_debug_mux_parent_names,
|
||||
.num_parents = ARRAY_SIZE(cam_cc_debug_mux_parent_names),
|
||||
.flags = CLK_IS_MEASURE,
|
||||
},
|
||||
};
|
||||
|
||||
static const char *const disp_cc_debug_mux_parent_names[] = {
|
||||
"disp_cc_mdss_ahb_clk",
|
||||
"disp_cc_mdss_byte0_clk",
|
||||
"disp_cc_mdss_byte0_intf_clk",
|
||||
"disp_cc_mdss_byte1_clk",
|
||||
"disp_cc_mdss_byte1_intf_clk",
|
||||
"disp_cc_mdss_dp_aux_clk",
|
||||
"disp_cc_mdss_dp_link_clk",
|
||||
"disp_cc_mdss_dp_link_intf_clk",
|
||||
"disp_cc_mdss_dp_pixel1_clk",
|
||||
"disp_cc_mdss_dp_pixel_clk",
|
||||
"disp_cc_mdss_esc0_clk",
|
||||
"disp_cc_mdss_esc1_clk",
|
||||
"disp_cc_mdss_mdp_clk",
|
||||
"disp_cc_mdss_mdp_lut_clk",
|
||||
"disp_cc_mdss_non_gdsc_ahb_clk",
|
||||
"disp_cc_mdss_pclk0_clk",
|
||||
"disp_cc_mdss_pclk1_clk",
|
||||
"disp_cc_mdss_rot_clk",
|
||||
"disp_cc_mdss_rscc_ahb_clk",
|
||||
"disp_cc_mdss_rscc_vsync_clk",
|
||||
"disp_cc_mdss_vsync_clk",
|
||||
"disp_cc_sleep_clk",
|
||||
"disp_cc_xo_clk",
|
||||
};
|
||||
|
||||
static int disp_cc_debug_mux_sels[] = {
|
||||
0x1F, /* disp_cc_mdss_ahb_clk */
|
||||
0x13, /* disp_cc_mdss_byte0_clk */
|
||||
0x14, /* disp_cc_mdss_byte0_intf_clk */
|
||||
0x15, /* disp_cc_mdss_byte1_clk */
|
||||
0x16, /* disp_cc_mdss_byte1_intf_clk */
|
||||
0x1E, /* disp_cc_mdss_dp_aux_clk */
|
||||
0x19, /* disp_cc_mdss_dp_link_clk */
|
||||
0x1A, /* disp_cc_mdss_dp_link_intf_clk */
|
||||
0x1D, /* disp_cc_mdss_dp_pixel1_clk */
|
||||
0x1C, /* disp_cc_mdss_dp_pixel_clk */
|
||||
0x17, /* disp_cc_mdss_esc0_clk */
|
||||
0x18, /* disp_cc_mdss_esc1_clk */
|
||||
0xF, /* disp_cc_mdss_mdp_clk */
|
||||
0x11, /* disp_cc_mdss_mdp_lut_clk */
|
||||
0x20, /* disp_cc_mdss_non_gdsc_ahb_clk */
|
||||
0xD, /* disp_cc_mdss_pclk0_clk */
|
||||
0xE, /* disp_cc_mdss_pclk1_clk */
|
||||
0x10, /* disp_cc_mdss_rot_clk */
|
||||
0x22, /* disp_cc_mdss_rscc_ahb_clk */
|
||||
0x21, /* disp_cc_mdss_rscc_vsync_clk */
|
||||
0x12, /* disp_cc_mdss_vsync_clk */
|
||||
0x2B, /* disp_cc_sleep_clk */
|
||||
0x2A, /* disp_cc_xo_clk */
|
||||
};
|
||||
|
||||
static struct clk_debug_mux disp_cc_debug_mux = {
|
||||
.priv = &debug_mux_priv,
|
||||
.debug_offset = 0x7000,
|
||||
.post_div_offset = 0x5008,
|
||||
.cbcr_offset = 0x500c,
|
||||
.src_sel_mask = 0xFF,
|
||||
.src_sel_shift = 0,
|
||||
.post_div_mask = 0xF,
|
||||
.post_div_shift = 0,
|
||||
.post_div_val = 4,
|
||||
.mux_sels = disp_cc_debug_mux_sels,
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "disp_cc_debug_mux",
|
||||
.ops = &clk_debug_mux_ops,
|
||||
.parent_names = disp_cc_debug_mux_parent_names,
|
||||
.num_parents = ARRAY_SIZE(disp_cc_debug_mux_parent_names),
|
||||
.flags = CLK_IS_MEASURE,
|
||||
},
|
||||
};
|
||||
|
||||
static const char *const gcc_debug_mux_parent_names[] = {
|
||||
"apss_cc_debug_mux",
|
||||
"cam_cc_debug_mux",
|
||||
"core_bi_pll_test_se",
|
||||
"disp_cc_debug_mux",
|
||||
"gcc_aggre_noc_pcie_0_axi_clk",
|
||||
"gcc_aggre_noc_pcie_1_axi_clk",
|
||||
"gcc_aggre_ufs_phy_axi_clk",
|
||||
"gcc_aggre_usb3_prim_axi_clk",
|
||||
"gcc_camera_ahb_clk",
|
||||
"gcc_camera_hf_axi_clk",
|
||||
"gcc_camera_sf_axi_clk",
|
||||
"gcc_camera_xo_clk",
|
||||
"gcc_cfg_noc_usb3_prim_axi_clk",
|
||||
"gcc_cpuss_ahb_clk",
|
||||
"gcc_ddrss_gpu_axi_clk",
|
||||
"gcc_disp_ahb_clk",
|
||||
"gcc_disp_gpll0_clk_src",
|
||||
"gcc_disp_hf_axi_clk",
|
||||
"gcc_disp_sf_axi_clk",
|
||||
"gcc_disp_xo_clk",
|
||||
"gcc_gp1_clk",
|
||||
"gcc_gp2_clk",
|
||||
"gcc_gp3_clk",
|
||||
"gcc_gpu_cfg_ahb_clk",
|
||||
"gcc_gpu_gpll0_clk_src",
|
||||
"gcc_gpu_gpll0_div_clk_src",
|
||||
"gcc_gpu_memnoc_gfx_clk",
|
||||
"gcc_gpu_snoc_dvm_gfx_clk",
|
||||
"gcc_pcie0_phy_rchng_clk",
|
||||
"gcc_pcie1_phy_rchng_clk",
|
||||
"gcc_pcie_0_aux_clk",
|
||||
"gcc_pcie_0_cfg_ahb_clk",
|
||||
"gcc_pcie_0_mstr_axi_clk",
|
||||
"gcc_pcie_0_pipe_clk",
|
||||
"gcc_pcie_0_slv_axi_clk",
|
||||
"gcc_pcie_0_slv_q2a_axi_clk",
|
||||
"gcc_pcie_1_aux_clk",
|
||||
"gcc_pcie_1_cfg_ahb_clk",
|
||||
"gcc_pcie_1_mstr_axi_clk",
|
||||
"gcc_pcie_1_pipe_clk",
|
||||
"gcc_pcie_1_slv_axi_clk",
|
||||
"gcc_pcie_1_slv_q2a_axi_clk",
|
||||
"gcc_pcie_throttle_core_clk",
|
||||
"gcc_pdm2_clk",
|
||||
"gcc_pdm_ahb_clk",
|
||||
"gcc_pdm_xo4_clk",
|
||||
"gcc_qmip_camera_nrt_ahb_clk",
|
||||
"gcc_qmip_camera_rt_ahb_clk",
|
||||
"gcc_qmip_disp_ahb_clk",
|
||||
"gcc_qmip_video_cvp_ahb_clk",
|
||||
"gcc_qmip_video_vcodec_ahb_clk",
|
||||
"gcc_qupv3_wrap0_core_2x_clk",
|
||||
"gcc_qupv3_wrap0_core_clk",
|
||||
"gcc_qupv3_wrap0_s0_clk",
|
||||
"gcc_qupv3_wrap0_s1_clk",
|
||||
"gcc_qupv3_wrap0_s2_clk",
|
||||
"gcc_qupv3_wrap0_s3_clk",
|
||||
"gcc_qupv3_wrap0_s4_clk",
|
||||
"gcc_qupv3_wrap0_s5_clk",
|
||||
"gcc_qupv3_wrap0_s6_clk",
|
||||
"gcc_qupv3_wrap0_s7_clk",
|
||||
"gcc_qupv3_wrap1_core_2x_clk",
|
||||
"gcc_qupv3_wrap1_core_clk",
|
||||
"gcc_qupv3_wrap1_s0_clk",
|
||||
"gcc_qupv3_wrap1_s1_clk",
|
||||
"gcc_qupv3_wrap1_s2_clk",
|
||||
"gcc_qupv3_wrap1_s3_clk",
|
||||
"gcc_qupv3_wrap1_s4_clk",
|
||||
"gcc_qupv3_wrap1_s5_clk",
|
||||
"gcc_qupv3_wrap1_s6_clk",
|
||||
"gcc_qupv3_wrap1_s7_clk",
|
||||
"gcc_qupv3_wrap_0_m_ahb_clk",
|
||||
"gcc_qupv3_wrap_0_s_ahb_clk",
|
||||
"gcc_qupv3_wrap_1_m_ahb_clk",
|
||||
"gcc_qupv3_wrap_1_s_ahb_clk",
|
||||
"gcc_sdcc1_ahb_clk",
|
||||
"gcc_sdcc1_apps_clk",
|
||||
"gcc_sdcc1_ice_core_clk",
|
||||
"gcc_sdcc2_ahb_clk",
|
||||
"gcc_sdcc2_apps_clk",
|
||||
"gcc_sdcc4_ahb_clk",
|
||||
"gcc_sdcc4_apps_clk",
|
||||
"gcc_sys_noc_cpuss_ahb_clk",
|
||||
"gcc_throttle_pcie_ahb_clk",
|
||||
"gcc_titan_nrt_throttle_core_clk",
|
||||
"gcc_titan_rt_throttle_core_clk",
|
||||
"gcc_ufs_phy_ahb_clk",
|
||||
"gcc_ufs_phy_axi_clk",
|
||||
"gcc_ufs_phy_ice_core_clk",
|
||||
"gcc_ufs_phy_phy_aux_clk",
|
||||
"gcc_ufs_phy_rx_symbol_0_clk",
|
||||
"gcc_ufs_phy_rx_symbol_1_clk",
|
||||
"gcc_ufs_phy_tx_symbol_0_clk",
|
||||
"gcc_ufs_phy_unipro_core_clk",
|
||||
"gcc_usb30_prim_master_clk",
|
||||
"gcc_usb30_prim_mock_utmi_clk",
|
||||
"gcc_usb30_prim_sleep_clk",
|
||||
"gcc_usb3_prim_phy_aux_clk",
|
||||
"gcc_usb3_prim_phy_com_aux_clk",
|
||||
"gcc_usb3_prim_phy_pipe_clk",
|
||||
"gcc_video_ahb_clk",
|
||||
"gcc_video_axi0_clk",
|
||||
"gcc_video_axi1_clk",
|
||||
"gcc_video_cvp_throttle_core_clk",
|
||||
"gcc_video_mvp_throttle_core_clk",
|
||||
"gcc_video_xo_clk",
|
||||
"gpu_cc_debug_mux",
|
||||
"mc_cc_debug_mux",
|
||||
"measure_only_cnoc_clk",
|
||||
"measure_only_ipa_2x_clk",
|
||||
"measure_only_memnoc_clk",
|
||||
"measure_only_snoc_clk",
|
||||
"pcie_0_pipe_clk",
|
||||
"pcie_1_pipe_clk",
|
||||
"ufs_phy_rx_symbol_0_clk",
|
||||
"ufs_phy_rx_symbol_1_clk",
|
||||
"ufs_phy_tx_symbol_0_clk",
|
||||
"usb3_phy_wrapper_gcc_usb30_pipe_clk",
|
||||
"video_cc_debug_mux",
|
||||
};
|
||||
|
||||
static int gcc_debug_mux_sels[] = {
|
||||
0xE3, /* apss_cc_debug_mux */
|
||||
0x4D, /* cam_cc_debug_mux */
|
||||
0x5, /* core_bi_pll_test_se */
|
||||
0x53, /* disp_cc_debug_mux */
|
||||
0x122, /* gcc_aggre_noc_pcie_0_axi_clk */
|
||||
0x123, /* gcc_aggre_noc_pcie_1_axi_clk */
|
||||
0x125, /* gcc_aggre_ufs_phy_axi_clk */
|
||||
0x124, /* gcc_aggre_usb3_prim_axi_clk */
|
||||
0x45, /* gcc_camera_ahb_clk */
|
||||
0x48, /* gcc_camera_hf_axi_clk */
|
||||
0x4A, /* gcc_camera_sf_axi_clk */
|
||||
0x4C, /* gcc_camera_xo_clk */
|
||||
0x1B, /* gcc_cfg_noc_usb3_prim_axi_clk */
|
||||
0xDE, /* gcc_cpuss_ahb_clk */
|
||||
0xC3, /* gcc_ddrss_gpu_axi_clk */
|
||||
0x4E, /* gcc_disp_ahb_clk */
|
||||
0x44, /* gcc_disp_gpll0_clk_src */
|
||||
0x50, /* gcc_disp_hf_axi_clk */
|
||||
0x51, /* gcc_disp_sf_axi_clk */
|
||||
0x52, /* gcc_disp_xo_clk */
|
||||
0xEE, /* gcc_gp1_clk */
|
||||
0xEF, /* gcc_gp2_clk */
|
||||
0xF0, /* gcc_gp3_clk */
|
||||
0x13A, /* gcc_gpu_cfg_ahb_clk */
|
||||
0x141, /* gcc_gpu_gpll0_clk_src */
|
||||
0x142, /* gcc_gpu_gpll0_div_clk_src */
|
||||
0x13D, /* gcc_gpu_memnoc_gfx_clk */
|
||||
0x140, /* gcc_gpu_snoc_dvm_gfx_clk */
|
||||
0xF7, /* gcc_pcie0_phy_rchng_clk */
|
||||
0x100, /* gcc_pcie1_phy_rchng_clk */
|
||||
0xF5, /* gcc_pcie_0_aux_clk */
|
||||
0xF4, /* gcc_pcie_0_cfg_ahb_clk */
|
||||
0xF3, /* gcc_pcie_0_mstr_axi_clk */
|
||||
0xF6, /* gcc_pcie_0_pipe_clk */
|
||||
0xF2, /* gcc_pcie_0_slv_axi_clk */
|
||||
0xF1, /* gcc_pcie_0_slv_q2a_axi_clk */
|
||||
0xFE, /* gcc_pcie_1_aux_clk */
|
||||
0xFD, /* gcc_pcie_1_cfg_ahb_clk */
|
||||
0xFC, /* gcc_pcie_1_mstr_axi_clk */
|
||||
0xFF, /* gcc_pcie_1_pipe_clk */
|
||||
0xFB, /* gcc_pcie_1_slv_axi_clk */
|
||||
0xFA, /* gcc_pcie_1_slv_q2a_axi_clk */
|
||||
0x2F, /* gcc_pcie_throttle_core_clk */
|
||||
0x9A, /* gcc_pdm2_clk */
|
||||
0x98, /* gcc_pdm_ahb_clk */
|
||||
0x99, /* gcc_pdm_xo4_clk */
|
||||
0x46, /* gcc_qmip_camera_nrt_ahb_clk */
|
||||
0x47, /* gcc_qmip_camera_rt_ahb_clk */
|
||||
0x4F, /* gcc_qmip_disp_ahb_clk */
|
||||
0x55, /* gcc_qmip_video_cvp_ahb_clk */
|
||||
0x56, /* gcc_qmip_video_vcodec_ahb_clk */
|
||||
0x83, /* gcc_qupv3_wrap0_core_2x_clk */
|
||||
0x82, /* gcc_qupv3_wrap0_core_clk */
|
||||
0x84, /* gcc_qupv3_wrap0_s0_clk */
|
||||
0x85, /* gcc_qupv3_wrap0_s1_clk */
|
||||
0x86, /* gcc_qupv3_wrap0_s2_clk */
|
||||
0x87, /* gcc_qupv3_wrap0_s3_clk */
|
||||
0x88, /* gcc_qupv3_wrap0_s4_clk */
|
||||
0x89, /* gcc_qupv3_wrap0_s5_clk */
|
||||
0x8A, /* gcc_qupv3_wrap0_s6_clk */
|
||||
0x8B, /* gcc_qupv3_wrap0_s7_clk */
|
||||
0x8F, /* gcc_qupv3_wrap1_core_2x_clk */
|
||||
0x8E, /* gcc_qupv3_wrap1_core_clk */
|
||||
0x90, /* gcc_qupv3_wrap1_s0_clk */
|
||||
0x91, /* gcc_qupv3_wrap1_s1_clk */
|
||||
0x92, /* gcc_qupv3_wrap1_s2_clk */
|
||||
0x93, /* gcc_qupv3_wrap1_s3_clk */
|
||||
0x94, /* gcc_qupv3_wrap1_s4_clk */
|
||||
0x95, /* gcc_qupv3_wrap1_s5_clk */
|
||||
0x96, /* gcc_qupv3_wrap1_s6_clk */
|
||||
0x97, /* gcc_qupv3_wrap1_s7_clk */
|
||||
0x80, /* gcc_qupv3_wrap_0_m_ahb_clk */
|
||||
0x81, /* gcc_qupv3_wrap_0_s_ahb_clk */
|
||||
0x8C, /* gcc_qupv3_wrap_1_m_ahb_clk */
|
||||
0x8D, /* gcc_qupv3_wrap_1_s_ahb_clk */
|
||||
0x153, /* gcc_sdcc1_ahb_clk */
|
||||
0x154, /* gcc_sdcc1_apps_clk */
|
||||
0x155, /* gcc_sdcc1_ice_core_clk */
|
||||
0x7D, /* gcc_sdcc2_ahb_clk */
|
||||
0x7C, /* gcc_sdcc2_apps_clk */
|
||||
0x7F, /* gcc_sdcc4_ahb_clk */
|
||||
0x7E, /* gcc_sdcc4_apps_clk */
|
||||
0xA, /* gcc_sys_noc_cpuss_ahb_clk */
|
||||
0x39, /* gcc_throttle_pcie_ahb_clk */
|
||||
0x4B, /* gcc_titan_nrt_throttle_core_clk */
|
||||
0x49, /* gcc_titan_rt_throttle_core_clk */
|
||||
0x104, /* gcc_ufs_phy_ahb_clk */
|
||||
0x103, /* gcc_ufs_phy_axi_clk */
|
||||
0x10A, /* gcc_ufs_phy_ice_core_clk */
|
||||
0x10B, /* gcc_ufs_phy_phy_aux_clk */
|
||||
0x106, /* gcc_ufs_phy_rx_symbol_0_clk */
|
||||
0x10C, /* gcc_ufs_phy_rx_symbol_1_clk */
|
||||
0x105, /* gcc_ufs_phy_tx_symbol_0_clk */
|
||||
0x109, /* gcc_ufs_phy_unipro_core_clk */
|
||||
0x6F, /* gcc_usb30_prim_master_clk */
|
||||
0x71, /* gcc_usb30_prim_mock_utmi_clk */
|
||||
0x70, /* gcc_usb30_prim_sleep_clk */
|
||||
0x72, /* gcc_usb3_prim_phy_aux_clk */
|
||||
0x73, /* gcc_usb3_prim_phy_com_aux_clk */
|
||||
0x74, /* gcc_usb3_prim_phy_pipe_clk */
|
||||
0x54, /* gcc_video_ahb_clk */
|
||||
0x57, /* gcc_video_axi0_clk */
|
||||
0x59, /* gcc_video_axi1_clk */
|
||||
0x5A, /* gcc_video_cvp_throttle_core_clk */
|
||||
0x58, /* gcc_video_mvp_throttle_core_clk */
|
||||
0x5B, /* gcc_video_xo_clk */
|
||||
0x13C, /* gpu_cc_debug_mux */
|
||||
0xCD, /* mc_cc_debug_mux or ddrss_gcc_debug_clk */
|
||||
0x17, /* measure_only_cnoc_clk */
|
||||
0x128, /* measure_only_ipa_2x_clk */
|
||||
0xC9, /* measure_only_memnoc_clk */
|
||||
0x9, /* measure_only_snoc_clk */
|
||||
0xF8, /* pcie_0_pipe_clk */
|
||||
0x101, /* pcie_1_pipe_clk */
|
||||
0x108, /* ufs_phy_rx_symbol_0_clk */
|
||||
0x10D, /* ufs_phy_rx_symbol_1_clk */
|
||||
0x107, /* ufs_phy_tx_symbol_0_clk */
|
||||
0x78, /* usb3_phy_wrapper_gcc_usb30_pipe_clk */
|
||||
0x5C, /* video_cc_debug_mux */
|
||||
};
|
||||
|
||||
static struct clk_debug_mux gcc_debug_mux = {
|
||||
.priv = &debug_mux_priv,
|
||||
.debug_offset = 0x62000,
|
||||
.post_div_offset = 0x62004,
|
||||
.cbcr_offset = 0x62008,
|
||||
.src_sel_mask = 0x3FF,
|
||||
.src_sel_shift = 0,
|
||||
.post_div_mask = 0xF,
|
||||
.post_div_shift = 0,
|
||||
.post_div_val = 2,
|
||||
.mux_sels = gcc_debug_mux_sels,
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gcc_debug_mux",
|
||||
.ops = &clk_debug_mux_ops,
|
||||
.parent_names = gcc_debug_mux_parent_names,
|
||||
.num_parents = ARRAY_SIZE(gcc_debug_mux_parent_names),
|
||||
.flags = CLK_IS_MEASURE,
|
||||
},
|
||||
};
|
||||
|
||||
static const char *const gpu_cc_debug_mux_parent_names[] = {
|
||||
"gpu_cc_ahb_clk",
|
||||
"gpu_cc_cb_clk",
|
||||
"gpu_cc_crc_ahb_clk",
|
||||
"gpu_cc_cx_gmu_clk",
|
||||
"gpu_cc_cx_snoc_dvm_clk",
|
||||
"gpu_cc_cxo_aon_clk",
|
||||
"gpu_cc_cxo_clk",
|
||||
"gpu_cc_gx_gmu_clk",
|
||||
"gpu_cc_hub_aon_clk",
|
||||
"gpu_cc_hub_cx_int_clk",
|
||||
"gpu_cc_mnd1x_0_gfx3d_clk",
|
||||
"gpu_cc_mnd1x_1_gfx3d_clk",
|
||||
"gpu_cc_sleep_clk",
|
||||
"measure_only_gpu_cc_cx_gfx3d_clk",
|
||||
"measure_only_gpu_cc_cx_gfx3d_slv_clk",
|
||||
"measure_only_gpu_cc_gx_gfx3d_clk",
|
||||
};
|
||||
|
||||
static int gpu_cc_debug_mux_sels[] = {
|
||||
0x12, /* gpu_cc_ahb_clk */
|
||||
0x26, /* gpu_cc_cb_clk */
|
||||
0x13, /* gpu_cc_crc_ahb_clk */
|
||||
0x1A, /* gpu_cc_cx_gmu_clk */
|
||||
0x17, /* gpu_cc_cx_snoc_dvm_clk */
|
||||
0xB, /* gpu_cc_cxo_aon_clk */
|
||||
0x1B, /* gpu_cc_cxo_clk */
|
||||
0x11, /* gpu_cc_gx_gmu_clk */
|
||||
0x27, /* gpu_cc_hub_aon_clk */
|
||||
0x1C, /* gpu_cc_hub_cx_int_clk */
|
||||
0x21, /* gpu_cc_mnd1x_0_gfx3d_clk */
|
||||
0x22, /* gpu_cc_mnd1x_1_gfx3d_clk */
|
||||
0x18, /* gpu_cc_sleep_clk */
|
||||
0x1D, /* measure_only_gpu_cc_cx_gfx3d_clk */
|
||||
0x1E, /* measure_only_gpu_cc_cx_gfx3d_slv_clk */
|
||||
0xD, /* measure_only_gpu_cc_gx_gfx3d_clk */
|
||||
};
|
||||
|
||||
static struct clk_debug_mux gpu_cc_debug_mux = {
|
||||
.priv = &debug_mux_priv,
|
||||
.debug_offset = 0x1568,
|
||||
.post_div_offset = 0x10fc,
|
||||
.cbcr_offset = 0x1100,
|
||||
.src_sel_mask = 0xFF,
|
||||
.src_sel_shift = 0,
|
||||
.post_div_mask = 0xF,
|
||||
.post_div_shift = 0,
|
||||
.post_div_val = 2,
|
||||
.mux_sels = gpu_cc_debug_mux_sels,
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_debug_mux",
|
||||
.ops = &clk_debug_mux_ops,
|
||||
.parent_names = gpu_cc_debug_mux_parent_names,
|
||||
.num_parents = ARRAY_SIZE(gpu_cc_debug_mux_parent_names),
|
||||
.flags = CLK_IS_MEASURE,
|
||||
},
|
||||
};
|
||||
|
||||
static const char *const video_cc_debug_mux_parent_names[] = {
|
||||
"video_cc_ahb_clk",
|
||||
"video_cc_mvs0_clk",
|
||||
"video_cc_mvs0c_clk",
|
||||
"video_cc_mvs1_clk",
|
||||
"video_cc_mvs1_div2_clk",
|
||||
"video_cc_mvs1c_clk",
|
||||
"video_cc_sleep_clk",
|
||||
"video_cc_xo_clk",
|
||||
};
|
||||
|
||||
static int video_cc_debug_mux_sels[] = {
|
||||
0x7, /* video_cc_ahb_clk */
|
||||
0x3, /* video_cc_mvs0_clk */
|
||||
0x1, /* video_cc_mvs0c_clk */
|
||||
0x5, /* video_cc_mvs1_clk */
|
||||
0x8, /* video_cc_mvs1_div2_clk */
|
||||
0x9, /* video_cc_mvs1c_clk */
|
||||
0xC, /* video_cc_sleep_clk */
|
||||
0xB, /* video_cc_xo_clk */
|
||||
};
|
||||
|
||||
static struct clk_debug_mux video_cc_debug_mux = {
|
||||
.priv = &debug_mux_priv,
|
||||
.debug_offset = 0xa4c,
|
||||
.post_div_offset = 0xe9c,
|
||||
.cbcr_offset = 0xebc,
|
||||
.src_sel_mask = 0x3F,
|
||||
.src_sel_shift = 0,
|
||||
.post_div_mask = 0xF,
|
||||
.post_div_shift = 0,
|
||||
.post_div_val = 3,
|
||||
.mux_sels = video_cc_debug_mux_sels,
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "video_cc_debug_mux",
|
||||
.ops = &clk_debug_mux_ops,
|
||||
.parent_names = video_cc_debug_mux_parent_names,
|
||||
.num_parents = ARRAY_SIZE(video_cc_debug_mux_parent_names),
|
||||
.flags = CLK_IS_MEASURE,
|
||||
},
|
||||
};
|
||||
|
||||
static const char *const mc_cc_debug_mux_parent_names[] = {
|
||||
"measure_only_mccc_clk",
|
||||
};
|
||||
|
||||
static struct clk_debug_mux mc_cc_debug_mux = {
|
||||
.period_offset = 0x50,
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "mc_cc_debug_mux",
|
||||
.ops = &clk_debug_mux_ops,
|
||||
.parent_names = mc_cc_debug_mux_parent_names,
|
||||
.num_parents = ARRAY_SIZE(mc_cc_debug_mux_parent_names),
|
||||
.flags = CLK_IS_MEASURE,
|
||||
},
|
||||
};
|
||||
|
||||
static struct mux_regmap_names mux_list[] = {
|
||||
{ .mux = &apss_cc_debug_mux, .regmap_name = "qcom,apsscc" },
|
||||
{ .mux = &cam_cc_debug_mux, .regmap_name = "qcom,camcc" },
|
||||
{ .mux = &disp_cc_debug_mux, .regmap_name = "qcom,dispcc" },
|
||||
{ .mux = &gcc_debug_mux, .regmap_name = "qcom,gcc" },
|
||||
{ .mux = &gpu_cc_debug_mux, .regmap_name = "qcom,gpucc" },
|
||||
{ .mux = &mc_cc_debug_mux, .regmap_name = "qcom,mccc" },
|
||||
{ .mux = &video_cc_debug_mux, .regmap_name = "qcom,videocc" },
|
||||
};
|
||||
|
||||
static struct clk_dummy measure_only_apcs_gold_post_acd_clk = {
|
||||
.rrate = 1000,
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "measure_only_apcs_gold_post_acd_clk",
|
||||
.ops = &clk_dummy_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_dummy measure_only_apcs_goldplus_post_acd_clk = {
|
||||
.rrate = 1000,
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "measure_only_apcs_goldplus_post_acd_clk",
|
||||
.ops = &clk_dummy_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_dummy measure_only_apcs_l3_post_acd_clk = {
|
||||
.rrate = 1000,
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "measure_only_apcs_l3_post_acd_clk",
|
||||
.ops = &clk_dummy_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_dummy measure_only_apcs_silver_post_acd_clk = {
|
||||
.rrate = 1000,
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "measure_only_apcs_silver_post_acd_clk",
|
||||
.ops = &clk_dummy_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_dummy measure_only_cnoc_clk = {
|
||||
.rrate = 1000,
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "measure_only_cnoc_clk",
|
||||
.ops = &clk_dummy_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_dummy measure_only_gpu_cc_cx_gfx3d_clk = {
|
||||
.rrate = 1000,
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "measure_only_gpu_cc_cx_gfx3d_clk",
|
||||
.ops = &clk_dummy_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_dummy measure_only_gpu_cc_cx_gfx3d_slv_clk = {
|
||||
.rrate = 1000,
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "measure_only_gpu_cc_cx_gfx3d_slv_clk",
|
||||
.ops = &clk_dummy_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_dummy measure_only_gpu_cc_gx_gfx3d_clk = {
|
||||
.rrate = 1000,
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "measure_only_gpu_cc_gx_gfx3d_clk",
|
||||
.ops = &clk_dummy_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_dummy measure_only_mccc_clk = {
|
||||
.rrate = 1000,
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "measure_only_mccc_clk",
|
||||
.ops = &clk_dummy_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_dummy measure_only_ipa_2x_clk = {
|
||||
.rrate = 1000,
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "measure_only_ipa_2x_clk",
|
||||
.ops = &clk_dummy_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_dummy measure_only_memnoc_clk = {
|
||||
.rrate = 1000,
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "measure_only_memnoc_clk",
|
||||
.ops = &clk_dummy_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_dummy measure_only_snoc_clk = {
|
||||
.rrate = 1000,
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "measure_only_snoc_clk",
|
||||
.ops = &clk_dummy_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_hw *debugcc_shima_hws[] = {
|
||||
&measure_only_apcs_gold_post_acd_clk.hw,
|
||||
&measure_only_apcs_goldplus_post_acd_clk.hw,
|
||||
&measure_only_apcs_l3_post_acd_clk.hw,
|
||||
&measure_only_apcs_silver_post_acd_clk.hw,
|
||||
&measure_only_cnoc_clk.hw,
|
||||
&measure_only_gpu_cc_cx_gfx3d_clk.hw,
|
||||
&measure_only_gpu_cc_cx_gfx3d_slv_clk.hw,
|
||||
&measure_only_gpu_cc_gx_gfx3d_clk.hw,
|
||||
&measure_only_mccc_clk.hw,
|
||||
&measure_only_ipa_2x_clk.hw,
|
||||
&measure_only_memnoc_clk.hw,
|
||||
&measure_only_snoc_clk.hw,
|
||||
};
|
||||
|
||||
static const struct of_device_id clk_debug_match_table[] = {
|
||||
{ .compatible = "qcom,shima-debugcc" },
|
||||
{ }
|
||||
};
|
||||
|
||||
static int clk_debug_shima_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct clk *clk;
|
||||
int ret = 0, i;
|
||||
|
||||
BUILD_BUG_ON(ARRAY_SIZE(apss_cc_debug_mux_parent_names) !=
|
||||
ARRAY_SIZE(apss_cc_debug_mux_sels));
|
||||
BUILD_BUG_ON(ARRAY_SIZE(cam_cc_debug_mux_parent_names) !=
|
||||
ARRAY_SIZE(cam_cc_debug_mux_sels));
|
||||
BUILD_BUG_ON(ARRAY_SIZE(disp_cc_debug_mux_parent_names) !=
|
||||
ARRAY_SIZE(disp_cc_debug_mux_sels));
|
||||
BUILD_BUG_ON(ARRAY_SIZE(gcc_debug_mux_parent_names) !=
|
||||
ARRAY_SIZE(gcc_debug_mux_sels));
|
||||
BUILD_BUG_ON(ARRAY_SIZE(gpu_cc_debug_mux_parent_names) !=
|
||||
ARRAY_SIZE(gpu_cc_debug_mux_sels));
|
||||
BUILD_BUG_ON(ARRAY_SIZE(video_cc_debug_mux_parent_names) !=
|
||||
ARRAY_SIZE(video_cc_debug_mux_sels));
|
||||
|
||||
clk = devm_clk_get(&pdev->dev, "xo_clk_src");
|
||||
if (IS_ERR(clk)) {
|
||||
if (PTR_ERR(clk) != -EPROBE_DEFER)
|
||||
dev_err(&pdev->dev, "Unable to get xo clock\n");
|
||||
return PTR_ERR(clk);
|
||||
}
|
||||
|
||||
debug_mux_priv.cxo = clk;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(mux_list); i++) {
|
||||
ret = map_debug_bases(pdev, mux_list[i].regmap_name,
|
||||
mux_list[i].mux);
|
||||
if (ret == -EBADR)
|
||||
continue;
|
||||
else if (ret)
|
||||
return ret;
|
||||
|
||||
clk = devm_clk_register(&pdev->dev, &mux_list[i].mux->hw);
|
||||
if (IS_ERR(clk)) {
|
||||
dev_err(&pdev->dev, "Unable to register %s, err:(%d)\n",
|
||||
clk_hw_get_name(&mux_list[i].mux->hw),
|
||||
PTR_ERR(clk));
|
||||
return PTR_ERR(clk);
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(debugcc_shima_hws); i++) {
|
||||
clk = devm_clk_register(&pdev->dev, debugcc_shima_hws[i]);
|
||||
if (IS_ERR(clk)) {
|
||||
dev_err(&pdev->dev, "Unable to register %s, err:(%d)\n",
|
||||
clk_hw_get_name(debugcc_shima_hws[i]),
|
||||
PTR_ERR(clk));
|
||||
return PTR_ERR(clk);
|
||||
}
|
||||
}
|
||||
|
||||
ret = clk_debug_measure_register(&gcc_debug_mux.hw);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "Could not register Measure clocks\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
dev_info(&pdev->dev, "Registered debug measure clocks\n");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static struct platform_driver clk_debug_driver = {
|
||||
.probe = clk_debug_shima_probe,
|
||||
.driver = {
|
||||
.name = "shima-debugcc",
|
||||
.of_match_table = clk_debug_match_table,
|
||||
},
|
||||
};
|
||||
|
||||
static int __init clk_debug_shima_init(void)
|
||||
{
|
||||
return platform_driver_register(&clk_debug_driver);
|
||||
}
|
||||
fs_initcall(clk_debug_shima_init);
|
||||
|
||||
MODULE_DESCRIPTION("QTI DEBUG CC SHIMA Driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
MODULE_ALIAS("platform:debugcc-shima");
|
693
drivers/clk/qcom/dispcc-holi.c
Normal file
693
drivers/clk/qcom/dispcc-holi.c
Normal file
@ -0,0 +1,693 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (c) 2020, The Linux Foundation. All rights reserved.
|
||||
*/
|
||||
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/regmap.h>
|
||||
|
||||
#include <dt-bindings/clock/qcom,dispcc-holi.h>
|
||||
|
||||
#include "clk-alpha-pll.h"
|
||||
#include "clk-branch.h"
|
||||
#include "clk-rcg.h"
|
||||
#include "clk-regmap.h"
|
||||
#include "common.h"
|
||||
#include "clk-regmap-divider.h"
|
||||
#include "clk-regmap-mux.h"
|
||||
#include "reset.h"
|
||||
#include "vdd-level-holi.h"
|
||||
|
||||
static DEFINE_VDD_REGULATORS(vdd_cx, VDD_NUM, 1, vdd_corner);
|
||||
|
||||
enum {
|
||||
P_BI_TCXO,
|
||||
P_CORE_BI_PLL_TEST_SE,
|
||||
P_DISP_CC_PLL0_OUT_EVEN,
|
||||
P_DISP_CC_PLL0_OUT_MAIN,
|
||||
P_DSI0_PHY_PLL_OUT_BYTECLK,
|
||||
P_DSI0_PHY_PLL_OUT_DSICLK,
|
||||
P_GCC_DISP_GPLL0_CLK,
|
||||
};
|
||||
|
||||
static struct pll_vco fabia_vco[] = {
|
||||
{ 249600000, 2000000000, 0 },
|
||||
};
|
||||
|
||||
/* 1120MHz */
|
||||
static const struct alpha_pll_config disp_cc_pll0_config = {
|
||||
.l = 0x3A,
|
||||
.cal_l = 0x32,
|
||||
.alpha = 0x5555,
|
||||
.config_ctl_val = 0x20485699,
|
||||
.config_ctl_hi_val = 0x00002067,
|
||||
.test_ctl_val = 0x40000000,
|
||||
.test_ctl_hi_val = 0x00000002,
|
||||
.user_ctl_val = 0x00000000,
|
||||
.user_ctl_hi_val = 0x00004805,
|
||||
};
|
||||
|
||||
static struct clk_alpha_pll disp_cc_pll0 = {
|
||||
.offset = 0x0,
|
||||
.vco_table = fabia_vco,
|
||||
.num_vco = ARRAY_SIZE(fabia_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
|
||||
.clkr = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "disp_cc_pll0",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.fw_name = "bi_tcxo",
|
||||
},
|
||||
.num_parents = 1,
|
||||
.ops = &clk_alpha_pll_fabia_ops,
|
||||
},
|
||||
.vdd_data = {
|
||||
.vdd_class = &vdd_cx,
|
||||
.num_rate_max = VDD_NUM,
|
||||
.rate_max = (unsigned long[VDD_NUM]) {
|
||||
[VDD_MIN] = 615000000,
|
||||
[VDD_LOW] = 1066000000,
|
||||
[VDD_LOW_L1] = 1600000000,
|
||||
[VDD_NOMINAL] = 2000000000},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static const struct parent_map disp_cc_parent_map_0[] = {
|
||||
{ P_BI_TCXO, 0 },
|
||||
{ P_DSI0_PHY_PLL_OUT_BYTECLK, 1 },
|
||||
{ P_CORE_BI_PLL_TEST_SE, 7 },
|
||||
};
|
||||
|
||||
static const struct clk_parent_data disp_cc_parent_data_0[] = {
|
||||
{ .fw_name = "bi_tcxo" },
|
||||
{ .fw_name = "dsi0_phy_pll_out_byteclk", .name =
|
||||
"dsi0_phy_pll_out_byteclk" },
|
||||
{ .fw_name = "core_bi_pll_test_se", .name = "core_bi_pll_test_se" },
|
||||
};
|
||||
|
||||
static const struct parent_map disp_cc_parent_map_1[] = {
|
||||
{ P_BI_TCXO, 0 },
|
||||
{ P_DISP_CC_PLL0_OUT_MAIN, 1 },
|
||||
{ P_GCC_DISP_GPLL0_CLK, 4 },
|
||||
{ P_DISP_CC_PLL0_OUT_EVEN, 5 },
|
||||
{ P_CORE_BI_PLL_TEST_SE, 7 },
|
||||
};
|
||||
|
||||
static const struct clk_parent_data disp_cc_parent_data_1[] = {
|
||||
{ .fw_name = "bi_tcxo" },
|
||||
{ .hw = &disp_cc_pll0.clkr.hw },
|
||||
{ .fw_name = "gcc_disp_gpll0_clk" },
|
||||
{ .hw = &disp_cc_pll0.clkr.hw },
|
||||
{ .fw_name = "core_bi_pll_test_se", .name = "core_bi_pll_test_se" },
|
||||
};
|
||||
|
||||
static const struct parent_map disp_cc_parent_map_2[] = {
|
||||
{ P_BI_TCXO, 0 },
|
||||
{ P_GCC_DISP_GPLL0_CLK, 4 },
|
||||
{ P_CORE_BI_PLL_TEST_SE, 7 },
|
||||
};
|
||||
|
||||
static const struct clk_parent_data disp_cc_parent_data_2[] = {
|
||||
{ .fw_name = "bi_tcxo" },
|
||||
{ .fw_name = "gcc_disp_gpll0_clk" },
|
||||
{ .fw_name = "core_bi_pll_test_se", .name = "core_bi_pll_test_se" },
|
||||
};
|
||||
|
||||
static const struct parent_map disp_cc_parent_map_3[] = {
|
||||
{ P_BI_TCXO, 0 },
|
||||
{ P_DSI0_PHY_PLL_OUT_DSICLK, 1 },
|
||||
{ P_CORE_BI_PLL_TEST_SE, 7 },
|
||||
};
|
||||
|
||||
static const struct clk_parent_data disp_cc_parent_data_3[] = {
|
||||
{ .fw_name = "bi_tcxo" },
|
||||
{ .fw_name = "dsi0_phy_pll_out_dsiclk", .name =
|
||||
"dsi0_phy_pll_out_dsiclk" },
|
||||
{ .fw_name = "core_bi_pll_test_se", .name = "core_bi_pll_test_se" },
|
||||
};
|
||||
|
||||
static const struct parent_map disp_cc_parent_map_4[] = {
|
||||
{ P_BI_TCXO, 0 },
|
||||
{ P_CORE_BI_PLL_TEST_SE, 7 },
|
||||
};
|
||||
|
||||
static const struct clk_parent_data disp_cc_parent_data_4[] = {
|
||||
{ .fw_name = "bi_tcxo", .name = "bi_tcxo" },
|
||||
{ .fw_name = "core_bi_pll_test_se", .name = "core_bi_pll_test_se" },
|
||||
};
|
||||
|
||||
static const struct freq_tbl ftbl_disp_cc_mdss_ahb_clk_src[] = {
|
||||
F(19200000, P_BI_TCXO, 1, 0, 0),
|
||||
F(37500000, P_GCC_DISP_GPLL0_CLK, 8, 0, 0),
|
||||
F(75000000, P_GCC_DISP_GPLL0_CLK, 4, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 disp_cc_mdss_ahb_clk_src = {
|
||||
.cmd_rcgr = 0x115c,
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = disp_cc_parent_map_2,
|
||||
.freq_tbl = ftbl_disp_cc_mdss_ahb_clk_src,
|
||||
.enable_safe_config = true,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.name = "disp_cc_mdss_ahb_clk_src",
|
||||
.parent_data = disp_cc_parent_data_2,
|
||||
.num_parents = 3,
|
||||
.ops = &clk_rcg2_ops,
|
||||
},
|
||||
.clkr.vdd_data = {
|
||||
.vdd_class = &vdd_cx,
|
||||
.num_rate_max = VDD_NUM,
|
||||
.rate_max = (unsigned long[VDD_NUM]) {
|
||||
[VDD_LOWER] = 19200000,
|
||||
[VDD_LOW] = 37500000,
|
||||
[VDD_NOMINAL] = 75000000},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_rcg2 disp_cc_mdss_byte0_clk_src = {
|
||||
.cmd_rcgr = 0x10c4,
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = disp_cc_parent_map_0,
|
||||
.enable_safe_config = true,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.name = "disp_cc_mdss_byte0_clk_src",
|
||||
.parent_data = disp_cc_parent_data_0,
|
||||
.num_parents = 3,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_byte2_ops,
|
||||
},
|
||||
.clkr.vdd_data = {
|
||||
.vdd_class = &vdd_cx,
|
||||
.num_rate_max = VDD_NUM,
|
||||
.rate_max = (unsigned long[VDD_NUM]) {
|
||||
[VDD_LOWER] = 187500000,
|
||||
[VDD_LOW] = 300000000,
|
||||
[VDD_LOW_L1] = 358000000},
|
||||
},
|
||||
};
|
||||
|
||||
static const struct freq_tbl ftbl_disp_cc_mdss_esc0_clk_src[] = {
|
||||
F(19200000, P_BI_TCXO, 1, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 disp_cc_mdss_esc0_clk_src = {
|
||||
.cmd_rcgr = 0x10e0,
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = disp_cc_parent_map_0,
|
||||
.freq_tbl = ftbl_disp_cc_mdss_esc0_clk_src,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.name = "disp_cc_mdss_esc0_clk_src",
|
||||
.parent_data = disp_cc_parent_data_0,
|
||||
.num_parents = 3,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
},
|
||||
.clkr.vdd_data = {
|
||||
.vdd_class = &vdd_cx,
|
||||
.num_rate_max = VDD_NUM,
|
||||
.rate_max = (unsigned long[VDD_NUM]) {
|
||||
[VDD_LOWER] = 19200000},
|
||||
},
|
||||
};
|
||||
|
||||
static const struct freq_tbl ftbl_disp_cc_mdss_mdp_clk_src[] = {
|
||||
F(200000000, P_GCC_DISP_GPLL0_CLK, 1.5, 0, 0),
|
||||
F(300000000, P_GCC_DISP_GPLL0_CLK, 1, 0, 0),
|
||||
F(373333333, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
|
||||
F(448000000, P_DISP_CC_PLL0_OUT_MAIN, 2.5, 0, 0),
|
||||
F(560000000, P_DISP_CC_PLL0_OUT_MAIN, 2, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 disp_cc_mdss_mdp_clk_src = {
|
||||
.cmd_rcgr = 0x107c,
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = disp_cc_parent_map_1,
|
||||
.freq_tbl = ftbl_disp_cc_mdss_mdp_clk_src,
|
||||
.enable_safe_config = true,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.name = "disp_cc_mdss_mdp_clk_src",
|
||||
.parent_data = disp_cc_parent_data_1,
|
||||
.num_parents = 5,
|
||||
.ops = &clk_rcg2_ops,
|
||||
},
|
||||
.clkr.vdd_data = {
|
||||
.vdd_class = &vdd_cx,
|
||||
.num_rate_max = VDD_NUM,
|
||||
.rate_max = (unsigned long[VDD_NUM]) {
|
||||
[VDD_LOWER] = 200000000,
|
||||
[VDD_LOW] = 300000000,
|
||||
[VDD_LOW_L1] = 373333333,
|
||||
[VDD_NOMINAL] = 448000000,
|
||||
[VDD_HIGH] = 560000000},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_rcg2 disp_cc_mdss_pclk0_clk_src = {
|
||||
.cmd_rcgr = 0x1064,
|
||||
.mnd_width = 8,
|
||||
.hid_width = 5,
|
||||
.parent_map = disp_cc_parent_map_3,
|
||||
.enable_safe_config = true,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.name = "disp_cc_mdss_pclk0_clk_src",
|
||||
.parent_data = disp_cc_parent_data_3,
|
||||
.num_parents = 3,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_pixel_ops,
|
||||
},
|
||||
.clkr.vdd_data = {
|
||||
.vdd_class = &vdd_cx,
|
||||
.num_rate_max = VDD_NUM,
|
||||
.rate_max = (unsigned long[VDD_NUM]) {
|
||||
[VDD_LOWER] = 300000000,
|
||||
[VDD_LOW] = 525000000,
|
||||
[VDD_LOW_L1] = 625000000},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_rcg2 disp_cc_mdss_rot_clk_src = {
|
||||
.cmd_rcgr = 0x1094,
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = disp_cc_parent_map_1,
|
||||
.freq_tbl = ftbl_disp_cc_mdss_mdp_clk_src,
|
||||
.enable_safe_config = true,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.name = "disp_cc_mdss_rot_clk_src",
|
||||
.parent_data = disp_cc_parent_data_1,
|
||||
.num_parents = 5,
|
||||
.ops = &clk_rcg2_ops,
|
||||
},
|
||||
.clkr.vdd_data = {
|
||||
.vdd_class = &vdd_cx,
|
||||
.num_rate_max = VDD_NUM,
|
||||
.rate_max = (unsigned long[VDD_NUM]) {
|
||||
[VDD_LOWER] = 200000000,
|
||||
[VDD_LOW] = 300000000,
|
||||
[VDD_LOW_L1] = 373333333,
|
||||
[VDD_NOMINAL] = 448000000,
|
||||
[VDD_HIGH] = 560000000},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_rcg2 disp_cc_mdss_vsync_clk_src = {
|
||||
.cmd_rcgr = 0x10ac,
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = disp_cc_parent_map_4,
|
||||
.freq_tbl = ftbl_disp_cc_mdss_esc0_clk_src,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.name = "disp_cc_mdss_vsync_clk_src",
|
||||
.parent_data = disp_cc_parent_data_4,
|
||||
.num_parents = 2,
|
||||
.ops = &clk_rcg2_ops,
|
||||
},
|
||||
.clkr.vdd_data = {
|
||||
.vdd_class = &vdd_cx,
|
||||
.num_rate_max = VDD_NUM,
|
||||
.rate_max = (unsigned long[VDD_NUM]) {
|
||||
[VDD_LOWER] = 19200000},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap_div disp_cc_mdss_byte0_div_clk_src = {
|
||||
.reg = 0x10dc,
|
||||
.shift = 0,
|
||||
.width = 2,
|
||||
.clkr.hw.init = &(struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_byte0_div_clk_src",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.hw = &disp_cc_mdss_byte0_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_regmap_div_ro_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_mdss_ahb_clk = {
|
||||
.halt_reg = 0x104c,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x104c,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "disp_cc_mdss_ahb_clk",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.hw = &disp_cc_mdss_ahb_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_mdss_byte0_clk = {
|
||||
.halt_reg = 0x102c,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x102c,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "disp_cc_mdss_byte0_clk",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.hw = &disp_cc_mdss_byte0_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_mdss_byte0_intf_clk = {
|
||||
.halt_reg = 0x1030,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x1030,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "disp_cc_mdss_byte0_intf_clk",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.hw = &disp_cc_mdss_byte0_div_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_mdss_esc0_clk = {
|
||||
.halt_reg = 0x1034,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x1034,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "disp_cc_mdss_esc0_clk",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.hw = &disp_cc_mdss_esc0_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_mdss_mdp_clk = {
|
||||
.halt_reg = 0x1010,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x1010,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "disp_cc_mdss_mdp_clk",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.hw = &disp_cc_mdss_mdp_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_mdss_mdp_lut_clk = {
|
||||
.halt_reg = 0x1020,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.clkr = {
|
||||
.enable_reg = 0x1020,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "disp_cc_mdss_mdp_lut_clk",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.hw = &disp_cc_mdss_mdp_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_mdss_non_gdsc_ahb_clk = {
|
||||
.halt_reg = 0x2004,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.clkr = {
|
||||
.enable_reg = 0x2004,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "disp_cc_mdss_non_gdsc_ahb_clk",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.hw = &disp_cc_mdss_ahb_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_mdss_pclk0_clk = {
|
||||
.halt_reg = 0x100c,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x100c,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "disp_cc_mdss_pclk0_clk",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.hw = &disp_cc_mdss_pclk0_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_mdss_rot_clk = {
|
||||
.halt_reg = 0x1018,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x1018,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "disp_cc_mdss_rot_clk",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.hw = &disp_cc_mdss_rot_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_mdss_rscc_ahb_clk = {
|
||||
.halt_reg = 0x200c,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x200c,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "disp_cc_mdss_rscc_ahb_clk",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.hw = &disp_cc_mdss_ahb_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_mdss_rscc_vsync_clk = {
|
||||
.halt_reg = 0x2008,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x2008,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "disp_cc_mdss_rscc_vsync_clk",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.hw = &disp_cc_mdss_vsync_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_mdss_vsync_clk = {
|
||||
.halt_reg = 0x1028,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x1028,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "disp_cc_mdss_vsync_clk",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.hw = &disp_cc_mdss_vsync_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_sleep_clk = {
|
||||
.halt_reg = 0x5004,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x5004,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "disp_cc_sleep_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_xo_clk = {
|
||||
.halt_reg = 0x5008,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x5008,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "disp_cc_xo_clk",
|
||||
.flags = CLK_IS_CRITICAL,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap *disp_cc_holi_clocks[] = {
|
||||
[DISP_CC_MDSS_AHB_CLK] = &disp_cc_mdss_ahb_clk.clkr,
|
||||
[DISP_CC_MDSS_AHB_CLK_SRC] = &disp_cc_mdss_ahb_clk_src.clkr,
|
||||
[DISP_CC_MDSS_BYTE0_CLK] = &disp_cc_mdss_byte0_clk.clkr,
|
||||
[DISP_CC_MDSS_BYTE0_CLK_SRC] = &disp_cc_mdss_byte0_clk_src.clkr,
|
||||
[DISP_CC_MDSS_BYTE0_DIV_CLK_SRC] = &disp_cc_mdss_byte0_div_clk_src.clkr,
|
||||
[DISP_CC_MDSS_BYTE0_INTF_CLK] = &disp_cc_mdss_byte0_intf_clk.clkr,
|
||||
[DISP_CC_MDSS_ESC0_CLK] = &disp_cc_mdss_esc0_clk.clkr,
|
||||
[DISP_CC_MDSS_ESC0_CLK_SRC] = &disp_cc_mdss_esc0_clk_src.clkr,
|
||||
[DISP_CC_MDSS_MDP_CLK] = &disp_cc_mdss_mdp_clk.clkr,
|
||||
[DISP_CC_MDSS_MDP_CLK_SRC] = &disp_cc_mdss_mdp_clk_src.clkr,
|
||||
[DISP_CC_MDSS_MDP_LUT_CLK] = &disp_cc_mdss_mdp_lut_clk.clkr,
|
||||
[DISP_CC_MDSS_NON_GDSC_AHB_CLK] = &disp_cc_mdss_non_gdsc_ahb_clk.clkr,
|
||||
[DISP_CC_MDSS_PCLK0_CLK] = &disp_cc_mdss_pclk0_clk.clkr,
|
||||
[DISP_CC_MDSS_PCLK0_CLK_SRC] = &disp_cc_mdss_pclk0_clk_src.clkr,
|
||||
[DISP_CC_MDSS_ROT_CLK] = &disp_cc_mdss_rot_clk.clkr,
|
||||
[DISP_CC_MDSS_ROT_CLK_SRC] = &disp_cc_mdss_rot_clk_src.clkr,
|
||||
[DISP_CC_MDSS_RSCC_AHB_CLK] = &disp_cc_mdss_rscc_ahb_clk.clkr,
|
||||
[DISP_CC_MDSS_RSCC_VSYNC_CLK] = &disp_cc_mdss_rscc_vsync_clk.clkr,
|
||||
[DISP_CC_MDSS_VSYNC_CLK] = &disp_cc_mdss_vsync_clk.clkr,
|
||||
[DISP_CC_MDSS_VSYNC_CLK_SRC] = &disp_cc_mdss_vsync_clk_src.clkr,
|
||||
[DISP_CC_PLL0] = &disp_cc_pll0.clkr,
|
||||
[DISP_CC_SLEEP_CLK] = &disp_cc_sleep_clk.clkr,
|
||||
[DISP_CC_XO_CLK] = &disp_cc_xo_clk.clkr,
|
||||
};
|
||||
|
||||
static const struct qcom_reset_map disp_cc_holi_resets[] = {
|
||||
[DISP_CC_MDSS_CORE_BCR] = { 0x1000 },
|
||||
[DISP_CC_MDSS_RSCC_BCR] = { 0x2000 },
|
||||
};
|
||||
|
||||
static const struct regmap_config disp_cc_holi_regmap_config = {
|
||||
.reg_bits = 32,
|
||||
.reg_stride = 4,
|
||||
.val_bits = 32,
|
||||
.max_register = 0x10000,
|
||||
.fast_io = true,
|
||||
};
|
||||
|
||||
static const struct qcom_cc_desc disp_cc_holi_desc = {
|
||||
.config = &disp_cc_holi_regmap_config,
|
||||
.clks = disp_cc_holi_clocks,
|
||||
.num_clks = ARRAY_SIZE(disp_cc_holi_clocks),
|
||||
.resets = disp_cc_holi_resets,
|
||||
.num_resets = ARRAY_SIZE(disp_cc_holi_resets),
|
||||
};
|
||||
|
||||
static const struct of_device_id disp_cc_holi_match_table[] = {
|
||||
{ .compatible = "qcom,holi-dispcc" },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, disp_cc_holi_match_table);
|
||||
|
||||
static int disp_cc_holi_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct regmap *regmap;
|
||||
int ret;
|
||||
|
||||
vdd_cx.regulator[0] = devm_regulator_get(&pdev->dev, "vdd_cx");
|
||||
if (IS_ERR(vdd_cx.regulator[0])) {
|
||||
if (PTR_ERR(vdd_cx.regulator[0]) != -EPROBE_DEFER)
|
||||
dev_err(&pdev->dev, "Unable to get vdd_cx regulator\n");
|
||||
return PTR_ERR(vdd_cx.regulator[0]);
|
||||
}
|
||||
|
||||
regmap = qcom_cc_map(pdev, &disp_cc_holi_desc);
|
||||
if (IS_ERR(regmap))
|
||||
return PTR_ERR(regmap);
|
||||
|
||||
clk_fabia_pll_configure(&disp_cc_pll0, regmap, &disp_cc_pll0_config);
|
||||
|
||||
ret = qcom_cc_really_probe(pdev, &disp_cc_holi_desc, regmap);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "Failed to register DISP CC clocks\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
dev_info(&pdev->dev, "Registered DISP CC clocks\n");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void disp_cc_holi_sync_state(struct device *dev)
|
||||
{
|
||||
qcom_cc_sync_state(dev, &disp_cc_holi_desc);
|
||||
}
|
||||
|
||||
static struct platform_driver disp_cc_holi_driver = {
|
||||
.probe = disp_cc_holi_probe,
|
||||
.driver = {
|
||||
.name = "disp_cc-holi",
|
||||
.of_match_table = disp_cc_holi_match_table,
|
||||
.sync_state = disp_cc_holi_sync_state,
|
||||
},
|
||||
};
|
||||
|
||||
static int __init disp_cc_holi_init(void)
|
||||
{
|
||||
return platform_driver_register(&disp_cc_holi_driver);
|
||||
}
|
||||
subsys_initcall(disp_cc_holi_init);
|
||||
|
||||
static void __exit disp_cc_holi_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&disp_cc_holi_driver);
|
||||
}
|
||||
module_exit(disp_cc_holi_exit);
|
||||
|
||||
MODULE_DESCRIPTION("QTI DISP_CC HOLI Driver");
|
||||
MODULE_LICENSE("GPL v2");
|
@ -10,6 +10,7 @@
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
|
||||
#include <dt-bindings/clock/qcom,dispcc-lahaina.h>
|
||||
|
||||
@ -24,7 +25,11 @@
|
||||
#include "reset.h"
|
||||
#include "vdd-level.h"
|
||||
|
||||
static DEFINE_VDD_REGULATORS(vdd_mm, VDD_NUM, 1, vdd_corner);
|
||||
static DEFINE_VDD_REGULATORS(vdd_mm, VDD_NOMINAL + 1, 1, vdd_corner);
|
||||
|
||||
static struct clk_vdd_class *disp_cc_lahaina_regulators[] = {
|
||||
&vdd_mm,
|
||||
};
|
||||
|
||||
#define DISP_CC_MISC_CMD 0x8000
|
||||
|
||||
@ -50,7 +55,7 @@ enum {
|
||||
};
|
||||
|
||||
static struct pll_vco lucid_5lpe_vco[] = {
|
||||
{ 249600000, 2000000000, 0 },
|
||||
{ 249600000, 1750000000, 0 },
|
||||
};
|
||||
|
||||
static const struct alpha_pll_config disp_cc_pll0_config = {
|
||||
@ -59,7 +64,10 @@ static const struct alpha_pll_config disp_cc_pll0_config = {
|
||||
.alpha = 0xE000,
|
||||
.config_ctl_val = 0x20485699,
|
||||
.config_ctl_hi_val = 0x00002261,
|
||||
.config_ctl_hi1_val = 0x029A699C,
|
||||
.config_ctl_hi1_val = 0x2A9A699C,
|
||||
.test_ctl_val = 0x00000000,
|
||||
.test_ctl_hi_val = 0x00000000,
|
||||
.test_ctl_hi1_val = 0x01800000,
|
||||
.user_ctl_val = 0x00000000,
|
||||
.user_ctl_hi_val = 0x00000805,
|
||||
.user_ctl_hi1_val = 0x00000000,
|
||||
@ -86,8 +94,8 @@ static struct clk_alpha_pll disp_cc_pll0 = {
|
||||
.rate_max = (unsigned long[VDD_NUM]) {
|
||||
[VDD_MIN] = 615000000,
|
||||
[VDD_LOW] = 1066000000,
|
||||
[VDD_LOW_L1] = 1600000000,
|
||||
[VDD_NOMINAL] = 2000000000},
|
||||
[VDD_LOW_L1] = 1500000000,
|
||||
[VDD_NOMINAL] = 1750000000},
|
||||
},
|
||||
},
|
||||
};
|
||||
@ -98,7 +106,10 @@ static const struct alpha_pll_config disp_cc_pll1_config = {
|
||||
.alpha = 0x4000,
|
||||
.config_ctl_val = 0x20485699,
|
||||
.config_ctl_hi_val = 0x00002261,
|
||||
.config_ctl_hi1_val = 0x029A699C,
|
||||
.config_ctl_hi1_val = 0x2A9A699C,
|
||||
.test_ctl_val = 0x00000000,
|
||||
.test_ctl_hi_val = 0x00000000,
|
||||
.test_ctl_hi1_val = 0x01800000,
|
||||
.user_ctl_val = 0x00000000,
|
||||
.user_ctl_hi_val = 0x00000805,
|
||||
.user_ctl_hi1_val = 0x00000000,
|
||||
@ -125,8 +136,8 @@ static struct clk_alpha_pll disp_cc_pll1 = {
|
||||
.rate_max = (unsigned long[VDD_NUM]) {
|
||||
[VDD_MIN] = 615000000,
|
||||
[VDD_LOW] = 1066000000,
|
||||
[VDD_LOW_L1] = 1600000000,
|
||||
[VDD_NOMINAL] = 2000000000},
|
||||
[VDD_LOW_L1] = 1500000000,
|
||||
[VDD_NOMINAL] = 1750000000},
|
||||
},
|
||||
},
|
||||
};
|
||||
@ -1412,24 +1423,6 @@ static struct clk_branch disp_cc_sleep_clk = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_xo_clk = {
|
||||
.halt_reg = 0x605c,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x605c,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "disp_cc_xo_clk",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.hw = &disp_cc_xo_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_IS_CRITICAL | CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap *disp_cc_lahaina_clocks[] = {
|
||||
[DISP_CC_MDSS_AHB_CLK] = &disp_cc_mdss_ahb_clk.clkr,
|
||||
[DISP_CC_MDSS_AHB_CLK_SRC] = &disp_cc_mdss_ahb_clk_src.clkr,
|
||||
@ -1492,7 +1485,6 @@ static struct clk_regmap *disp_cc_lahaina_clocks[] = {
|
||||
[DISP_CC_PLL1] = &disp_cc_pll1.clkr,
|
||||
[DISP_CC_SLEEP_CLK] = &disp_cc_sleep_clk.clkr,
|
||||
[DISP_CC_SLEEP_CLK_SRC] = &disp_cc_sleep_clk_src.clkr,
|
||||
[DISP_CC_XO_CLK] = &disp_cc_xo_clk.clkr,
|
||||
[DISP_CC_XO_CLK_SRC] = &disp_cc_xo_clk_src.clkr,
|
||||
};
|
||||
|
||||
@ -1509,12 +1501,14 @@ static const struct regmap_config disp_cc_lahaina_regmap_config = {
|
||||
.fast_io = true,
|
||||
};
|
||||
|
||||
static const struct qcom_cc_desc disp_cc_lahaina_desc = {
|
||||
static struct qcom_cc_desc disp_cc_lahaina_desc = {
|
||||
.config = &disp_cc_lahaina_regmap_config,
|
||||
.clks = disp_cc_lahaina_clocks,
|
||||
.num_clks = ARRAY_SIZE(disp_cc_lahaina_clocks),
|
||||
.resets = disp_cc_lahaina_resets,
|
||||
.num_resets = ARRAY_SIZE(disp_cc_lahaina_resets),
|
||||
.clk_regulators = disp_cc_lahaina_regulators,
|
||||
.num_clk_regulators = ARRAY_SIZE(disp_cc_lahaina_regulators),
|
||||
};
|
||||
|
||||
static const struct of_device_id disp_cc_lahaina_match_table[] = {
|
||||
@ -1526,27 +1520,19 @@ MODULE_DEVICE_TABLE(of, disp_cc_lahaina_match_table);
|
||||
static int disp_cc_lahaina_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct regmap *regmap;
|
||||
struct clk *clk;
|
||||
int ret;
|
||||
|
||||
vdd_mm.regulator[0] = devm_regulator_get(&pdev->dev, "vdd_mm");
|
||||
if (IS_ERR(vdd_mm.regulator[0])) {
|
||||
if (PTR_ERR(vdd_mm.regulator[0]) != -EPROBE_DEFER)
|
||||
dev_err(&pdev->dev, "Unable to get vdd_mm regulator\n");
|
||||
return PTR_ERR(vdd_mm.regulator[0]);
|
||||
}
|
||||
|
||||
regmap = qcom_cc_map(pdev, &disp_cc_lahaina_desc);
|
||||
if (IS_ERR(regmap))
|
||||
return PTR_ERR(regmap);
|
||||
|
||||
clk = devm_clk_get(&pdev->dev, "cfg_ahb_clk");
|
||||
if (IS_ERR(clk)) {
|
||||
if (PTR_ERR(clk) != -EPROBE_DEFER)
|
||||
dev_err(&pdev->dev, "Unable to get ahb clock handle\n");
|
||||
return PTR_ERR(clk);
|
||||
}
|
||||
devm_clk_put(&pdev->dev, clk);
|
||||
ret = qcom_cc_runtime_init(pdev, &disp_cc_lahaina_desc);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = pm_runtime_get_sync(&pdev->dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
clk_lucid_5lpe_pll_configure(&disp_cc_pll0, regmap,
|
||||
&disp_cc_pll0_config);
|
||||
@ -1556,12 +1542,19 @@ static int disp_cc_lahaina_probe(struct platform_device *pdev)
|
||||
/* Enable clock gating for MDP clocks */
|
||||
regmap_update_bits(regmap, DISP_CC_MISC_CMD, 0x10, 0x10);
|
||||
|
||||
/*
|
||||
* Keep clocks always enabled:
|
||||
* disp_cc_xo_clk
|
||||
*/
|
||||
regmap_update_bits(regmap, 0x605c, BIT(0), BIT(0));
|
||||
|
||||
ret = qcom_cc_really_probe(pdev, &disp_cc_lahaina_desc, regmap);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "Failed to register DISP CC clocks\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
pm_runtime_put_sync(&pdev->dev);
|
||||
dev_info(&pdev->dev, "Registered DISP CC clocks\n");
|
||||
|
||||
return ret;
|
||||
@ -1572,12 +1565,17 @@ static void disp_cc_lahaina_sync_state(struct device *dev)
|
||||
qcom_cc_sync_state(dev, &disp_cc_lahaina_desc);
|
||||
}
|
||||
|
||||
static const struct dev_pm_ops disp_cc_lahaina_pm_ops = {
|
||||
SET_RUNTIME_PM_OPS(qcom_cc_runtime_suspend, qcom_cc_runtime_resume, NULL)
|
||||
};
|
||||
|
||||
static struct platform_driver disp_cc_lahaina_driver = {
|
||||
.probe = disp_cc_lahaina_probe,
|
||||
.driver = {
|
||||
.name = "disp_cc-lahaina",
|
||||
.of_match_table = disp_cc_lahaina_match_table,
|
||||
.sync_state = disp_cc_lahaina_sync_state,
|
||||
.pm = &disp_cc_lahaina_pm_ops,
|
||||
},
|
||||
};
|
||||
|
||||
|
1171
drivers/clk/qcom/dispcc-shima.c
Normal file
1171
drivers/clk/qcom/dispcc-shima.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -19,7 +19,7 @@
|
||||
#include "clk-regmap-mux.h"
|
||||
#include "clk-regmap-divider.h"
|
||||
#include "reset.h"
|
||||
#include "vdd-level.h"
|
||||
#include "vdd-level-holi.h"
|
||||
|
||||
static DEFINE_VDD_REGULATORS(vdd_cx, VDD_NUM, 1, vdd_corner);
|
||||
static DEFINE_VDD_REGULATORS(vdd_mx, VDD_NUM, 1, vdd_corner);
|
||||
@ -127,16 +127,17 @@ static struct clk_alpha_pll_postdiv gpll0_out_odd = {
|
||||
},
|
||||
};
|
||||
|
||||
/* 1152MHz Configuration */
|
||||
static const struct alpha_pll_config gpll10_config = {
|
||||
.l = 0x3C,
|
||||
.cal_l = 0x3C,
|
||||
.cal_l = 0x36,
|
||||
.alpha = 0x0,
|
||||
.config_ctl_val = 0x20485699,
|
||||
.config_ctl_hi_val = 0x00002067,
|
||||
.test_ctl_val = 0x40000000,
|
||||
.test_ctl_hi_val = 0x00000000,
|
||||
.user_ctl_val = 0x00000007,
|
||||
.user_ctl_hi_val = 0x00004005,
|
||||
.test_ctl_hi_val = 0x00000002,
|
||||
.user_ctl_val = 0x00000001,
|
||||
.user_ctl_hi_val = 0x00004805,
|
||||
};
|
||||
|
||||
static struct clk_alpha_pll gpll10 = {
|
||||
@ -168,16 +169,17 @@ static struct clk_alpha_pll gpll10 = {
|
||||
},
|
||||
};
|
||||
|
||||
/* 532MHz Configuration */
|
||||
static const struct alpha_pll_config gpll11_config = {
|
||||
.l = 0x1B,
|
||||
.cal_l = 0x21,
|
||||
.cal_l = 0x25,
|
||||
.alpha = 0xB555,
|
||||
.config_ctl_val = 0x20485699,
|
||||
.config_ctl_hi_val = 0x00002067,
|
||||
.test_ctl_val = 0x40000000,
|
||||
.test_ctl_hi_val = 0x00000000,
|
||||
.user_ctl_val = 0x00000007,
|
||||
.user_ctl_hi_val = 0x00004005,
|
||||
.test_ctl_hi_val = 0x00000002,
|
||||
.user_ctl_val = 0x00000001,
|
||||
.user_ctl_hi_val = 0x00004805,
|
||||
};
|
||||
|
||||
static struct clk_alpha_pll gpll11 = {
|
||||
@ -383,16 +385,17 @@ static struct clk_alpha_pll gpll7 = {
|
||||
},
|
||||
};
|
||||
|
||||
/* 420MHz Configuration */
|
||||
static const struct alpha_pll_config gpll8_config = {
|
||||
.l = 0x1B,
|
||||
.cal_l = 0x26,
|
||||
.alpha = 0xC555,
|
||||
.l = 0x15,
|
||||
.cal_l = 0x2A,
|
||||
.alpha = 0xE000,
|
||||
.config_ctl_val = 0x20485699,
|
||||
.config_ctl_hi_val = 0x00002067,
|
||||
.test_ctl_val = 0x40000000,
|
||||
.test_ctl_hi_val = 0x00000000,
|
||||
.test_ctl_hi_val = 0x00000002,
|
||||
.user_ctl_val = 0x00000103,
|
||||
.user_ctl_hi_val = 0x00004005,
|
||||
.user_ctl_hi_val = 0x00004805,
|
||||
};
|
||||
|
||||
static struct clk_alpha_pll gpll8 = {
|
||||
@ -447,11 +450,12 @@ static struct clk_alpha_pll_postdiv gpll8_out_even = {
|
||||
},
|
||||
};
|
||||
|
||||
/* 480MHz Configuration */
|
||||
static const struct alpha_pll_config gpll9_config = {
|
||||
.l = 0x64,
|
||||
.alpha = 0x0,
|
||||
.config_ctl_hi_val = 0x000003D2,
|
||||
.config_ctl_val = 0x20000AA8,
|
||||
.config_ctl_hi_val = 0x400003D2,
|
||||
.config_ctl_val = 0x20000800,
|
||||
.test_ctl_val = 0x4000400,
|
||||
.test_ctl_hi_val = 0x4000,
|
||||
.post_div_val = 0x3 << 8,
|
||||
@ -988,6 +992,29 @@ static struct clk_rcg2 gcc_camss_csi2phytimer_clk_src = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_rcg2 gcc_camss_csi3phytimer_clk_src = {
|
||||
.cmd_rcgr = 0x59054,
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = gcc_parent_map_4,
|
||||
.freq_tbl = ftbl_gcc_camss_csi0phytimer_clk_src,
|
||||
.enable_safe_config = true,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.name = "gcc_camss_csi3phytimer_clk_src",
|
||||
.parent_data = gcc_parent_data_4,
|
||||
.num_parents = 7,
|
||||
.ops = &clk_rcg2_ops,
|
||||
},
|
||||
.clkr.vdd_data = {
|
||||
.vdd_class = &vdd_cx,
|
||||
.num_rate_max = VDD_NUM,
|
||||
.rate_max = (unsigned long[VDD_NUM]) {
|
||||
[VDD_LOWER] = 19200000,
|
||||
[VDD_LOW] = 200000000,
|
||||
[VDD_NOMINAL] = 268800000},
|
||||
},
|
||||
};
|
||||
|
||||
static const struct freq_tbl ftbl_gcc_camss_mclk0_clk_src[] = {
|
||||
F(19200000, P_BI_TCXO, 1, 0, 0),
|
||||
F(24000000, P_GPLL9_OUT_MAIN, 1, 1, 20),
|
||||
@ -1134,8 +1161,8 @@ static const struct freq_tbl ftbl_gcc_camss_ope_clk_src[] = {
|
||||
F(19200000, P_BI_TCXO, 1, 0, 0),
|
||||
F(200000000, P_GPLL8_OUT_EVEN, 2, 0, 0),
|
||||
F(266600000, P_GPLL8_OUT_EVEN, 1, 0, 0),
|
||||
F(465000000, P_GPLL8_OUT_EVEN, 1, 0, 0),
|
||||
F(580000000, P_GPLL8_OUT_MAIN, 1, 0, 0),
|
||||
F(480000000, P_GPLL8_OUT_EVEN, 1, 0, 0),
|
||||
F(580000000, P_GPLL8_OUT_EVEN, 1, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
@ -1160,23 +1187,22 @@ static struct clk_rcg2 gcc_camss_ope_clk_src = {
|
||||
[VDD_LOWER] = 19200000,
|
||||
[VDD_LOW] = 200000000,
|
||||
[VDD_LOW_L1] = 266600000,
|
||||
[VDD_NOMINAL] = 465000000,
|
||||
[VDD_NOMINAL] = 480000000,
|
||||
[VDD_HIGH] = 580000000},
|
||||
},
|
||||
};
|
||||
|
||||
static const struct freq_tbl ftbl_gcc_camss_tfe_0_clk_src[] = {
|
||||
F(19200000, P_BI_TCXO, 1, 0, 0),
|
||||
F(128000000, P_GPLL10_OUT_EVEN, 9, 0, 0),
|
||||
F(135529412, P_GPLL10_OUT_EVEN, 8.5, 0, 0),
|
||||
F(144000000, P_GPLL10_OUT_EVEN, 8, 0, 0),
|
||||
F(153600000, P_GPLL10_OUT_EVEN, 7.5, 0, 0),
|
||||
F(164571429, P_GPLL10_OUT_EVEN, 7, 0, 0),
|
||||
F(177230769, P_GPLL10_OUT_EVEN, 6.5, 0, 0),
|
||||
F(192000000, P_GPLL10_OUT_EVEN, 6, 0, 0),
|
||||
F(209454545, P_GPLL10_OUT_EVEN, 5.5, 0, 0),
|
||||
F(230400000, P_GPLL10_OUT_EVEN, 5, 0, 0),
|
||||
F(288000000, P_GPLL10_OUT_EVEN, 4, 0, 0),
|
||||
F(120000000, P_GPLL0_OUT_MAIN, 5, 0, 0),
|
||||
F(133333333, P_GPLL0_OUT_MAIN, 4.5, 0, 0),
|
||||
F(137142857, P_GPLL9_OUT_MAIN, 3.5, 0, 0),
|
||||
F(150000000, P_GPLL0_OUT_MAIN, 4, 0, 0),
|
||||
F(160000000, P_GPLL9_OUT_MAIN, 3, 0, 0),
|
||||
F(171428571, P_GPLL0_OUT_MAIN, 3.5, 0, 0),
|
||||
F(192000000, P_GPLL9_OUT_MAIN, 2.5, 0, 0),
|
||||
F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0),
|
||||
F(240000000, P_GPLL0_OUT_MAIN, 2.5, 0, 0),
|
||||
F(300000000, P_GPLL0_OUT_MAIN, 2, 0, 0),
|
||||
F(329142857, P_GPLL10_OUT_EVEN, 3.5, 0, 0),
|
||||
F(384000000, P_GPLL10_OUT_EVEN, 3, 0, 0),
|
||||
@ -2301,7 +2327,7 @@ static struct clk_branch gcc_cam_throttle_rt_clk = {
|
||||
|
||||
static struct clk_branch gcc_camera_ahb_clk = {
|
||||
.halt_reg = 0x17008,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.halt_check = BRANCH_HALT_DELAY,
|
||||
.hwcg_reg = 0x17008,
|
||||
.hwcg_bit = 1,
|
||||
.clkr = {
|
||||
@ -2539,6 +2565,24 @@ static struct clk_branch gcc_camss_csi2phytimer_clk = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gcc_camss_csi3phytimer_clk = {
|
||||
.halt_reg = 0x5906c,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x5906c,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gcc_camss_csi3phytimer_clk",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.hw = &gcc_camss_csi3phytimer_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gcc_camss_mclk0_clk = {
|
||||
.halt_reg = 0x51018,
|
||||
.halt_check = BRANCH_HALT,
|
||||
@ -2611,6 +2655,24 @@ static struct clk_branch gcc_camss_mclk3_clk = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gcc_camss_mclk4_clk = {
|
||||
.halt_reg = 0x51088,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x51088,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gcc_camss_mclk4_clk",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.hw = &gcc_camss_mclk4_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gcc_camss_nrt_axi_clk = {
|
||||
.halt_reg = 0x58054,
|
||||
.halt_check = BRANCH_HALT,
|
||||
@ -2905,6 +2967,19 @@ static struct clk_branch gcc_disp_ahb_clk = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap_div gcc_disp_gpll0_clk_src = {
|
||||
.reg = 0x17058,
|
||||
.shift = 0,
|
||||
.width = 2,
|
||||
.clkr.hw.init = &(struct clk_init_data) {
|
||||
.name = "gcc_disp_gpll0_clk_src",
|
||||
.parent_names =
|
||||
(const char *[]){ "gpll0" },
|
||||
.num_parents = 1,
|
||||
.ops = &clk_regmap_div_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gcc_disp_gpll0_div_clk_src = {
|
||||
.halt_check = BRANCH_HALT_DELAY,
|
||||
.clkr = {
|
||||
@ -2913,7 +2988,7 @@ static struct clk_branch gcc_disp_gpll0_div_clk_src = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gcc_disp_gpll0_div_clk_src",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.hw = &gpll0.clkr.hw,
|
||||
.hw = &gcc_disp_gpll0_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
@ -3097,6 +3172,7 @@ static struct clk_branch gcc_gpu_memnoc_gfx_clk = {
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gcc_gpu_memnoc_gfx_clk",
|
||||
.flags = CLK_DONT_HOLD_STATE,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
@ -3905,6 +3981,32 @@ static struct clk_branch gcc_usb30_prim_sleep_clk = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gcc_ufs_mem_clkref_clk = {
|
||||
.halt_reg = 0x8c000,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x8c000,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gcc_ufs_mem_clkref_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gcc_rx5_pcie_clkref_en_clk = {
|
||||
.halt_reg = 0x8c00c,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x8c00c,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gcc_rx5_pcie_clkref_en_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gcc_usb3_prim_clkref_clk = {
|
||||
.halt_reg = 0x8c010,
|
||||
.halt_check = BRANCH_HALT,
|
||||
@ -3992,7 +4094,7 @@ static struct clk_branch gcc_venus_ctl_axi_clk = {
|
||||
|
||||
static struct clk_branch gcc_video_ahb_clk = {
|
||||
.halt_reg = 0x17004,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.halt_check = BRANCH_HALT_DELAY,
|
||||
.hwcg_reg = 0x17004,
|
||||
.hwcg_bit = 1,
|
||||
.clkr = {
|
||||
@ -4114,6 +4216,8 @@ static struct clk_regmap *gcc_holi_clocks[] = {
|
||||
[GCC_CAMSS_CSI1PHYTIMER_CLK_SRC] = &gcc_camss_csi1phytimer_clk_src.clkr,
|
||||
[GCC_CAMSS_CSI2PHYTIMER_CLK] = &gcc_camss_csi2phytimer_clk.clkr,
|
||||
[GCC_CAMSS_CSI2PHYTIMER_CLK_SRC] = &gcc_camss_csi2phytimer_clk_src.clkr,
|
||||
[GCC_CAMSS_CSI3PHYTIMER_CLK] = &gcc_camss_csi3phytimer_clk.clkr,
|
||||
[GCC_CAMSS_CSI3PHYTIMER_CLK_SRC] = &gcc_camss_csi3phytimer_clk_src.clkr,
|
||||
[GCC_CAMSS_MCLK0_CLK] = &gcc_camss_mclk0_clk.clkr,
|
||||
[GCC_CAMSS_MCLK0_CLK_SRC] = &gcc_camss_mclk0_clk_src.clkr,
|
||||
[GCC_CAMSS_MCLK1_CLK] = &gcc_camss_mclk1_clk.clkr,
|
||||
@ -4122,6 +4226,7 @@ static struct clk_regmap *gcc_holi_clocks[] = {
|
||||
[GCC_CAMSS_MCLK2_CLK_SRC] = &gcc_camss_mclk2_clk_src.clkr,
|
||||
[GCC_CAMSS_MCLK3_CLK] = &gcc_camss_mclk3_clk.clkr,
|
||||
[GCC_CAMSS_MCLK3_CLK_SRC] = &gcc_camss_mclk3_clk_src.clkr,
|
||||
[GCC_CAMSS_MCLK4_CLK] = &gcc_camss_mclk4_clk.clkr,
|
||||
[GCC_CAMSS_MCLK4_CLK_SRC] = &gcc_camss_mclk4_clk_src.clkr,
|
||||
[GCC_CAMSS_NRT_AXI_CLK] = &gcc_camss_nrt_axi_clk.clkr,
|
||||
[GCC_CAMSS_OPE_AHB_CLK] = &gcc_camss_ope_ahb_clk.clkr,
|
||||
@ -4152,6 +4257,7 @@ static struct clk_regmap *gcc_holi_clocks[] = {
|
||||
[GCC_CPUSS_AHB_POSTDIV_CLK_SRC] = &gcc_cpuss_ahb_postdiv_clk_src.clkr,
|
||||
[GCC_CPUSS_GNOC_CLK] = &gcc_cpuss_gnoc_clk.clkr,
|
||||
[GCC_DISP_AHB_CLK] = &gcc_disp_ahb_clk.clkr,
|
||||
[GCC_DISP_GPLL0_CLK_SRC] = &gcc_disp_gpll0_clk_src.clkr,
|
||||
[GCC_DISP_GPLL0_DIV_CLK_SRC] = &gcc_disp_gpll0_div_clk_src.clkr,
|
||||
[GCC_DISP_HF_AXI_CLK] = &gcc_disp_hf_axi_clk.clkr,
|
||||
[GCC_DISP_SLEEP_CLK] = &gcc_disp_sleep_clk.clkr,
|
||||
@ -4256,6 +4362,8 @@ static struct clk_regmap *gcc_holi_clocks[] = {
|
||||
[GCC_VIDEO_VENUS_CLK_SRC] = &gcc_video_venus_clk_src.clkr,
|
||||
[GCC_VIDEO_VENUS_CTL_CLK] = &gcc_video_venus_ctl_clk.clkr,
|
||||
[GCC_VIDEO_XO_CLK] = &gcc_video_xo_clk.clkr,
|
||||
[GCC_UFS_MEM_CLKREF_CLK] = &gcc_ufs_mem_clkref_clk.clkr,
|
||||
[GCC_RX5_PCIE_CLKREF_EN_CLK] = &gcc_rx5_pcie_clkref_en_clk.clkr,
|
||||
[GPLL0] = &gpll0.clkr,
|
||||
[GPLL0_OUT_EVEN] = &gpll0_out_even.clkr,
|
||||
[GPLL0_OUT_ODD] = &gpll0_out_odd.clkr,
|
||||
@ -4290,6 +4398,8 @@ static const struct qcom_reset_map gcc_holi_resets[] = {
|
||||
[GCC_SDCC2_BCR] = { 0x1e000 },
|
||||
[GCC_UFS_PHY_BCR] = { 0x45000 },
|
||||
[GCC_USB30_PRIM_BCR] = { 0x1a000 },
|
||||
[GCC_USB3_DP_PHY_PRIM_BCR] = { 0x1b020 },
|
||||
[GCC_USB3_PHY_PRIM_SP0_BCR] = { 0x1b000 },
|
||||
[GCC_USB_PHY_CFG_AHB2PHY_BCR] = { 0x1d000 },
|
||||
[GCC_VCODEC0_BCR] = { 0x58094 },
|
||||
[GCC_VENUS_BCR] = { 0x58078 },
|
||||
@ -4363,6 +4473,9 @@ static int gcc_holi_probe(struct platform_device *pdev)
|
||||
if (IS_ERR(regmap))
|
||||
return PTR_ERR(regmap);
|
||||
|
||||
/* GCC_DISP_GPLL0_CDIVR__CLK_DIV */
|
||||
regmap_update_bits(regmap, 0x17058, 0x1, 0x1);
|
||||
|
||||
clk_fabia_pll_configure(&gpll10, regmap, &gpll10_config);
|
||||
clk_fabia_pll_configure(&gpll11, regmap, &gpll11_config);
|
||||
clk_fabia_pll_configure(&gpll8, regmap, &gpll8_config);
|
||||
|
@ -28,7 +28,11 @@
|
||||
#include "reset.h"
|
||||
#include "vdd-level.h"
|
||||
|
||||
static DEFINE_VDD_REGULATORS(vdd_cx, VDD_NUM, 1, vdd_corner);
|
||||
static DEFINE_VDD_REGULATORS(vdd_cx, VDD_HIGH + 1, 1, vdd_corner);
|
||||
|
||||
static struct clk_vdd_class *gcc_lahaina_regulators[] = {
|
||||
&vdd_cx,
|
||||
};
|
||||
|
||||
enum {
|
||||
P_BI_TCXO,
|
||||
@ -50,14 +54,8 @@ enum {
|
||||
P_USB3_UNI_PHY_SEC_GCC_USB30_PIPE_CLK,
|
||||
};
|
||||
|
||||
static struct pll_vco lucid_5lpe_vco[] = {
|
||||
{ 249600000, 2000000000, 0 },
|
||||
};
|
||||
|
||||
static struct clk_alpha_pll gcc_gpll0 = {
|
||||
.offset = 0x0,
|
||||
.vco_table = lucid_5lpe_vco,
|
||||
.num_vco = ARRAY_SIZE(lucid_5lpe_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_5LPE],
|
||||
.clkr = {
|
||||
.enable_reg = 0x52018,
|
||||
@ -77,8 +75,8 @@ static struct clk_alpha_pll gcc_gpll0 = {
|
||||
.rate_max = (unsigned long[VDD_NUM]) {
|
||||
[VDD_MIN] = 615000000,
|
||||
[VDD_LOW] = 1066000000,
|
||||
[VDD_LOW_L1] = 1600000000,
|
||||
[VDD_NOMINAL] = 2000000000},
|
||||
[VDD_LOW_L1] = 1500000000,
|
||||
[VDD_NOMINAL] = 1750000000},
|
||||
},
|
||||
},
|
||||
};
|
||||
@ -107,8 +105,6 @@ static struct clk_alpha_pll_postdiv gcc_gpll0_out_even = {
|
||||
|
||||
static struct clk_alpha_pll gcc_gpll4 = {
|
||||
.offset = 0x76000,
|
||||
.vco_table = lucid_5lpe_vco,
|
||||
.num_vco = ARRAY_SIZE(lucid_5lpe_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_5LPE],
|
||||
.clkr = {
|
||||
.enable_reg = 0x52018,
|
||||
@ -128,16 +124,14 @@ static struct clk_alpha_pll gcc_gpll4 = {
|
||||
.rate_max = (unsigned long[VDD_NUM]) {
|
||||
[VDD_MIN] = 615000000,
|
||||
[VDD_LOW] = 1066000000,
|
||||
[VDD_LOW_L1] = 1600000000,
|
||||
[VDD_NOMINAL] = 2000000000},
|
||||
[VDD_LOW_L1] = 1500000000,
|
||||
[VDD_NOMINAL] = 1750000000},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_alpha_pll gcc_gpll9 = {
|
||||
.offset = 0x1c000,
|
||||
.vco_table = lucid_5lpe_vco,
|
||||
.num_vco = ARRAY_SIZE(lucid_5lpe_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_5LPE],
|
||||
.clkr = {
|
||||
.enable_reg = 0x52018,
|
||||
@ -157,8 +151,8 @@ static struct clk_alpha_pll gcc_gpll9 = {
|
||||
.rate_max = (unsigned long[VDD_NUM]) {
|
||||
[VDD_MIN] = 615000000,
|
||||
[VDD_LOW] = 1066000000,
|
||||
[VDD_LOW_L1] = 1600000000,
|
||||
[VDD_NOMINAL] = 2000000000},
|
||||
[VDD_LOW_L1] = 1500000000,
|
||||
[VDD_NOMINAL] = 1750000000},
|
||||
},
|
||||
},
|
||||
};
|
||||
@ -2101,7 +2095,7 @@ static struct clk_branch gcc_ddrss_gpu_axi_clk = {
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gcc_ddrss_gpu_axi_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
.ops = &clk_branch2_aon_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
@ -2985,24 +2979,6 @@ static struct clk_branch gcc_qupv3_wrap1_s4_clk = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gcc_qupv3_wrap1_s5_clk = {
|
||||
.halt_reg = 0x185fc,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.clkr = {
|
||||
.enable_reg = 0x52008,
|
||||
.enable_mask = BIT(27),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gcc_qupv3_wrap1_s5_clk",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.hw = &gcc_qupv3_wrap1_s5_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gcc_qupv3_wrap2_core_2x_clk = {
|
||||
.halt_reg = 0x23278,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
@ -3167,36 +3143,6 @@ static struct clk_branch gcc_qupv3_wrap_0_s_ahb_clk = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gcc_qupv3_wrap_1_m_ahb_clk = {
|
||||
.halt_reg = 0x18004,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.hwcg_reg = 0x18004,
|
||||
.hwcg_bit = 1,
|
||||
.clkr = {
|
||||
.enable_reg = 0x52008,
|
||||
.enable_mask = BIT(20),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gcc_qupv3_wrap_1_m_ahb_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gcc_qupv3_wrap_1_s_ahb_clk = {
|
||||
.halt_reg = 0x18008,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.hwcg_reg = 0x18008,
|
||||
.hwcg_bit = 1,
|
||||
.clkr = {
|
||||
.enable_reg = 0x52008,
|
||||
.enable_mask = BIT(21),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gcc_qupv3_wrap_1_s_ahb_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gcc_qupv3_wrap_2_m_ahb_clk = {
|
||||
.halt_reg = 0x1e004,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
@ -3791,6 +3737,19 @@ static struct clk_branch gcc_usb30_prim_master_clk = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gcc_usb30_prim_master_clk__force_mem_core_on = {
|
||||
.halt_reg = 0xf010,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0xf010,
|
||||
.enable_mask = BIT(14),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gcc_usb30_prim_master_clk__force_mem_core_on",
|
||||
.ops = &clk_branch_simple_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gcc_usb30_prim_mock_utmi_clk = {
|
||||
.halt_reg = 0xf01c,
|
||||
.halt_check = BRANCH_HALT,
|
||||
@ -3841,6 +3800,19 @@ static struct clk_branch gcc_usb30_sec_master_clk = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gcc_usb30_sec_master_clk__force_mem_core_on = {
|
||||
.halt_reg = 0x10010,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x10010,
|
||||
.enable_mask = BIT(14),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gcc_usb30_sec_master_clk__force_mem_core_on",
|
||||
.ops = &clk_branch_simple_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gcc_usb30_sec_mock_utmi_clk = {
|
||||
.halt_reg = 0x1001c,
|
||||
.halt_check = BRANCH_HALT,
|
||||
@ -4022,7 +3994,7 @@ static struct clk_branch gcc_video_axi0_clk = {
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gcc_video_axi0_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
.ops = &clk_branch2_force_off_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
@ -4037,7 +4009,7 @@ static struct clk_branch gcc_video_axi1_clk = {
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gcc_video_axi1_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
.ops = &clk_branch2_force_off_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
@ -4158,7 +4130,6 @@ static struct clk_regmap *gcc_lahaina_clocks[] = {
|
||||
[GCC_QUPV3_WRAP1_S3_CLK_SRC] = &gcc_qupv3_wrap1_s3_clk_src.clkr,
|
||||
[GCC_QUPV3_WRAP1_S4_CLK] = &gcc_qupv3_wrap1_s4_clk.clkr,
|
||||
[GCC_QUPV3_WRAP1_S4_CLK_SRC] = &gcc_qupv3_wrap1_s4_clk_src.clkr,
|
||||
[GCC_QUPV3_WRAP1_S5_CLK] = &gcc_qupv3_wrap1_s5_clk.clkr,
|
||||
[GCC_QUPV3_WRAP1_S5_CLK_SRC] = &gcc_qupv3_wrap1_s5_clk_src.clkr,
|
||||
[GCC_QUPV3_WRAP2_CORE_2X_CLK] = &gcc_qupv3_wrap2_core_2x_clk.clkr,
|
||||
[GCC_QUPV3_WRAP2_CORE_CLK] = &gcc_qupv3_wrap2_core_clk.clkr,
|
||||
@ -4176,8 +4147,6 @@ static struct clk_regmap *gcc_lahaina_clocks[] = {
|
||||
[GCC_QUPV3_WRAP2_S5_CLK_SRC] = &gcc_qupv3_wrap2_s5_clk_src.clkr,
|
||||
[GCC_QUPV3_WRAP_0_M_AHB_CLK] = &gcc_qupv3_wrap_0_m_ahb_clk.clkr,
|
||||
[GCC_QUPV3_WRAP_0_S_AHB_CLK] = &gcc_qupv3_wrap_0_s_ahb_clk.clkr,
|
||||
[GCC_QUPV3_WRAP_1_M_AHB_CLK] = &gcc_qupv3_wrap_1_m_ahb_clk.clkr,
|
||||
[GCC_QUPV3_WRAP_1_S_AHB_CLK] = &gcc_qupv3_wrap_1_s_ahb_clk.clkr,
|
||||
[GCC_QUPV3_WRAP_2_M_AHB_CLK] = &gcc_qupv3_wrap_2_m_ahb_clk.clkr,
|
||||
[GCC_QUPV3_WRAP_2_S_AHB_CLK] = &gcc_qupv3_wrap_2_s_ahb_clk.clkr,
|
||||
[GCC_SDCC2_AHB_CLK] = &gcc_sdcc2_ahb_clk.clkr,
|
||||
@ -4240,6 +4209,8 @@ static struct clk_regmap *gcc_lahaina_clocks[] = {
|
||||
[GCC_UFS_PHY_UNIPRO_CORE_HW_CTL_CLK] =
|
||||
&gcc_ufs_phy_unipro_core_hw_ctl_clk.clkr,
|
||||
[GCC_USB30_PRIM_MASTER_CLK] = &gcc_usb30_prim_master_clk.clkr,
|
||||
[GCC_USB30_PRIM_MASTER_CLK__FORCE_MEM_CORE_ON] =
|
||||
&gcc_usb30_prim_master_clk__force_mem_core_on.clkr,
|
||||
[GCC_USB30_PRIM_MASTER_CLK_SRC] = &gcc_usb30_prim_master_clk_src.clkr,
|
||||
[GCC_USB30_PRIM_MOCK_UTMI_CLK] = &gcc_usb30_prim_mock_utmi_clk.clkr,
|
||||
[GCC_USB30_PRIM_MOCK_UTMI_CLK_SRC] =
|
||||
@ -4248,6 +4219,8 @@ static struct clk_regmap *gcc_lahaina_clocks[] = {
|
||||
&gcc_usb30_prim_mock_utmi_postdiv_clk_src.clkr,
|
||||
[GCC_USB30_PRIM_SLEEP_CLK] = &gcc_usb30_prim_sleep_clk.clkr,
|
||||
[GCC_USB30_SEC_MASTER_CLK] = &gcc_usb30_sec_master_clk.clkr,
|
||||
[GCC_USB30_SEC_MASTER_CLK__FORCE_MEM_CORE_ON] =
|
||||
&gcc_usb30_sec_master_clk__force_mem_core_on.clkr,
|
||||
[GCC_USB30_SEC_MASTER_CLK_SRC] = &gcc_usb30_sec_master_clk_src.clkr,
|
||||
[GCC_USB30_SEC_MOCK_UTMI_CLK] = &gcc_usb30_sec_mock_utmi_clk.clkr,
|
||||
[GCC_USB30_SEC_MOCK_UTMI_CLK_SRC] =
|
||||
@ -4368,6 +4341,8 @@ static const struct qcom_cc_desc gcc_lahaina_desc = {
|
||||
.num_resets = ARRAY_SIZE(gcc_lahaina_resets),
|
||||
.clk_hws = gcc_lahaina_hws,
|
||||
.num_clk_hws = ARRAY_SIZE(gcc_lahaina_hws),
|
||||
.clk_regulators = gcc_lahaina_regulators,
|
||||
.num_clk_regulators = ARRAY_SIZE(gcc_lahaina_regulators),
|
||||
};
|
||||
|
||||
static const struct of_device_id gcc_lahaina_match_table[] = {
|
||||
@ -4381,13 +4356,6 @@ static int gcc_lahaina_probe(struct platform_device *pdev)
|
||||
struct regmap *regmap;
|
||||
int ret;
|
||||
|
||||
vdd_cx.regulator[0] = devm_regulator_get(&pdev->dev, "vdd_cx");
|
||||
if (IS_ERR(vdd_cx.regulator[0])) {
|
||||
if (PTR_ERR(vdd_cx.regulator[0]) != -EPROBE_DEFER)
|
||||
dev_err(&pdev->dev, "Unable to get vdd_cx regulator\n");
|
||||
return PTR_ERR(vdd_cx.regulator[0]);
|
||||
}
|
||||
|
||||
regmap = qcom_cc_map(pdev, &gcc_lahaina_desc);
|
||||
if (IS_ERR(regmap)) {
|
||||
dev_err(&pdev->dev, "Failed to map gcc registers\n");
|
||||
@ -4403,6 +4371,20 @@ static int gcc_lahaina_probe(struct platform_device *pdev)
|
||||
regmap_update_bits(regmap, gcc_ufs_phy_ice_core_clk.halt_reg,
|
||||
BIT(14), BIT(14));
|
||||
|
||||
/*
|
||||
* Enable clocks required by the i2c-connected pm8008 regulators. Don't
|
||||
* register them with the clock framework so that client requests are
|
||||
* short-circuited before grabbing the enable/prepare locks. This
|
||||
* prevents deadlocks between the clk/regulator frameworks.
|
||||
*
|
||||
* gcc_qupv3_wrap_1_m_ahb_clk
|
||||
* gcc_qupv3_wrap_1_s_ahb_clk
|
||||
* gcc_qupv3_wrap1_s5_clk
|
||||
*/
|
||||
regmap_update_bits(regmap, 0x52008, BIT(20), BIT(20));
|
||||
regmap_update_bits(regmap, 0x52008, BIT(21), BIT(21));
|
||||
regmap_update_bits(regmap, 0x52008, BIT(27), BIT(27));
|
||||
|
||||
ret = qcom_cc_really_probe(pdev, &gcc_lahaina_desc, regmap);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "Failed to register GCC clocks\n");
|
||||
|
1883
drivers/clk/qcom/gcc-sdxlemur.c
Normal file
1883
drivers/clk/qcom/gcc-sdxlemur.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -3,6 +3,7 @@
|
||||
* Copyright (c) 2020, The Linux Foundation. All rights reserved.
|
||||
*/
|
||||
|
||||
#include <linux/clk.h>
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
@ -62,8 +63,9 @@ static struct clk_alpha_pll gcc_gpll0 = {
|
||||
.rate_max = (unsigned long[VDD_NUM]) {
|
||||
[VDD_MIN] = 615000000,
|
||||
[VDD_LOW] = 1066000000,
|
||||
[VDD_LOW_L1] = 1600000000,
|
||||
[VDD_NOMINAL] = 2000000000},
|
||||
[VDD_LOW_L1] = 1500000000,
|
||||
[VDD_NOMINAL] = 1750000000,
|
||||
[VDD_HIGH] = 1800000000},
|
||||
},
|
||||
},
|
||||
};
|
||||
@ -132,8 +134,9 @@ static struct clk_alpha_pll gcc_gpll10 = {
|
||||
.rate_max = (unsigned long[VDD_NUM]) {
|
||||
[VDD_MIN] = 615000000,
|
||||
[VDD_LOW] = 1066000000,
|
||||
[VDD_LOW_L1] = 1600000000,
|
||||
[VDD_NOMINAL] = 2000000000},
|
||||
[VDD_LOW_L1] = 1500000000,
|
||||
[VDD_NOMINAL] = 1750000000,
|
||||
[VDD_HIGH] = 1800000000},
|
||||
},
|
||||
},
|
||||
};
|
||||
@ -158,8 +161,9 @@ static struct clk_alpha_pll gcc_gpll4 = {
|
||||
.rate_max = (unsigned long[VDD_NUM]) {
|
||||
[VDD_MIN] = 615000000,
|
||||
[VDD_LOW] = 1066000000,
|
||||
[VDD_LOW_L1] = 1600000000,
|
||||
[VDD_NOMINAL] = 2000000000},
|
||||
[VDD_LOW_L1] = 1500000000,
|
||||
[VDD_NOMINAL] = 1750000000,
|
||||
[VDD_HIGH] = 1800000000},
|
||||
},
|
||||
},
|
||||
};
|
||||
@ -184,8 +188,9 @@ static struct clk_alpha_pll gcc_gpll9 = {
|
||||
.rate_max = (unsigned long[VDD_NUM]) {
|
||||
[VDD_MIN] = 615000000,
|
||||
[VDD_LOW] = 1066000000,
|
||||
[VDD_LOW_L1] = 1600000000,
|
||||
[VDD_NOMINAL] = 2000000000},
|
||||
[VDD_LOW_L1] = 1500000000,
|
||||
[VDD_NOMINAL] = 1750000000,
|
||||
[VDD_HIGH] = 1800000000},
|
||||
},
|
||||
},
|
||||
};
|
||||
@ -484,7 +489,8 @@ static struct clk_rcg2 gcc_cpuss_ahb_clk_src = {
|
||||
.num_rate_max = VDD_NUM,
|
||||
.rate_max = (unsigned long[VDD_NUM]) {
|
||||
[VDD_LOWER] = 19200000,
|
||||
},
|
||||
[VDD_LOW] = 50000000,
|
||||
[VDD_NOMINAL] = 100000000},
|
||||
},
|
||||
};
|
||||
|
||||
@ -1228,7 +1234,8 @@ static struct clk_rcg2 gcc_sdcc4_apps_clk_src = {
|
||||
.vdd_class = &vdd_cx,
|
||||
.num_rate_max = VDD_NUM,
|
||||
.rate_max = (unsigned long[VDD_NUM]) {
|
||||
[VDD_LOWER] = 100000000},
|
||||
[VDD_LOWER] = 50000000,
|
||||
[VDD_LOW_L1] = 100000000},
|
||||
},
|
||||
};
|
||||
|
||||
@ -1646,7 +1653,7 @@ static struct clk_branch gcc_ddrss_gpu_axi_clk = {
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gcc_ddrss_gpu_axi_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
.ops = &clk_branch2_aon_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
@ -1832,6 +1839,19 @@ static struct clk_branch gcc_gpu_gpll0_div_clk_src = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gcc_gpu_iref_en = {
|
||||
.halt_reg = 0x8c014,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x8c014,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gcc_gpu_iref_en",
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gcc_gpu_memnoc_gfx_clk = {
|
||||
.halt_reg = 0x7100c,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
@ -1842,6 +1862,7 @@ static struct clk_branch gcc_gpu_memnoc_gfx_clk = {
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gcc_gpu_memnoc_gfx_clk",
|
||||
.flags = CLK_DONT_HOLD_STATE,
|
||||
.ops = &clk_branch2_aon_ops,
|
||||
},
|
||||
},
|
||||
@ -1855,6 +1876,7 @@ static struct clk_branch gcc_gpu_snoc_dvm_gfx_clk = {
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gcc_gpu_snoc_dvm_gfx_clk",
|
||||
.flags = CLK_DONT_HOLD_STATE,
|
||||
.ops = &clk_branch2_aon_ops,
|
||||
},
|
||||
},
|
||||
@ -2796,6 +2818,19 @@ static struct clk_branch gcc_titan_rt_throttle_core_clk = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gcc_ufs_1_clkref_en = {
|
||||
.halt_reg = 0x8c000,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x8c000,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gcc_ufs_1_clkref_en",
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gcc_ufs_phy_ahb_clk = {
|
||||
.halt_reg = 0x77018,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
@ -3157,7 +3192,7 @@ static struct clk_branch gcc_video_axi0_clk = {
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gcc_video_axi0_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
.ops = &clk_branch2_force_off_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
@ -3172,7 +3207,7 @@ static struct clk_branch gcc_video_axi1_clk = {
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gcc_video_axi1_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
.ops = &clk_branch2_force_off_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
@ -3257,6 +3292,7 @@ static struct clk_regmap *gcc_shima_clocks[] = {
|
||||
[GCC_GPU_CFG_AHB_CLK] = &gcc_gpu_cfg_ahb_clk.clkr,
|
||||
[GCC_GPU_GPLL0_CLK_SRC] = &gcc_gpu_gpll0_clk_src.clkr,
|
||||
[GCC_GPU_GPLL0_DIV_CLK_SRC] = &gcc_gpu_gpll0_div_clk_src.clkr,
|
||||
[GCC_GPU_IREF_EN] = &gcc_gpu_iref_en.clkr,
|
||||
[GCC_GPU_MEMNOC_GFX_CLK] = &gcc_gpu_memnoc_gfx_clk.clkr,
|
||||
[GCC_GPU_SNOC_DVM_GFX_CLK] = &gcc_gpu_snoc_dvm_gfx_clk.clkr,
|
||||
[GCC_PCIE0_PHY_RCHNG_CLK] = &gcc_pcie0_phy_rchng_clk.clkr,
|
||||
@ -3345,6 +3381,7 @@ static struct clk_regmap *gcc_shima_clocks[] = {
|
||||
[GCC_TITAN_NRT_THROTTLE_CORE_CLK] =
|
||||
&gcc_titan_nrt_throttle_core_clk.clkr,
|
||||
[GCC_TITAN_RT_THROTTLE_CORE_CLK] = &gcc_titan_rt_throttle_core_clk.clkr,
|
||||
[GCC_UFS_1_CLKREF_EN] = &gcc_ufs_1_clkref_en.clkr,
|
||||
[GCC_UFS_PHY_AHB_CLK] = &gcc_ufs_phy_ahb_clk.clkr,
|
||||
[GCC_UFS_PHY_AXI_CLK] = &gcc_ufs_phy_axi_clk.clkr,
|
||||
[GCC_UFS_PHY_AXI_CLK_SRC] = &gcc_ufs_phy_axi_clk_src.clkr,
|
||||
@ -3489,6 +3526,8 @@ static int gcc_shima_probe(struct platform_device *pdev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
clk_set_rate(gcc_cpuss_ahb_clk.clkr.hw.clk, 19200000);
|
||||
|
||||
dev_info(&pdev->dev, "Registered GCC clocks\n");
|
||||
|
||||
return ret;
|
||||
|
@ -75,6 +75,7 @@ struct gdsc {
|
||||
int reset_count;
|
||||
int root_clk_idx;
|
||||
u32 gds_timeout;
|
||||
bool skip_disable_before_enable;
|
||||
};
|
||||
|
||||
enum gdscr_status {
|
||||
@ -163,6 +164,9 @@ static int gdsc_is_enabled(struct regulator_dev *rdev)
|
||||
if (!sc->toggle_logic)
|
||||
return !sc->resets_asserted;
|
||||
|
||||
if (sc->skip_disable_before_enable)
|
||||
return false;
|
||||
|
||||
return sc->is_gdsc_enabled;
|
||||
}
|
||||
|
||||
@ -172,6 +176,9 @@ static int gdsc_enable(struct regulator_dev *rdev)
|
||||
uint32_t regval, hw_ctrl_regval = 0x0;
|
||||
int i, ret = 0;
|
||||
|
||||
if (sc->skip_disable_before_enable)
|
||||
return 0;
|
||||
|
||||
if (sc->root_en || sc->force_root_en) {
|
||||
clk_prepare_enable(sc->clocks[sc->root_clk_idx]);
|
||||
sc->is_root_clk_voted = true;
|
||||
@ -373,9 +380,11 @@ static int gdsc_disable(struct regulator_dev *rdev)
|
||||
udelay(TIMEOUT_US);
|
||||
} else {
|
||||
ret = poll_gdsc_status(sc, DISABLED);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
regmap_read(sc->regmap, REG_OFFSET, ®val);
|
||||
dev_err(&rdev->dev, "%s disable timed out: 0x%x\n",
|
||||
sc->rdesc.name, regval);
|
||||
}
|
||||
}
|
||||
|
||||
if (sc->domain_addr) {
|
||||
@ -489,6 +498,20 @@ static int gdsc_set_mode(struct regulator_dev *rdev, unsigned int mode)
|
||||
*/
|
||||
gdsc_mb(sc);
|
||||
udelay(1);
|
||||
/*
|
||||
* While switching from HW to SW mode, HW may be busy
|
||||
* updating internal required signals. Polling for PWR_ON
|
||||
* ensures that the GDSC switches to SW mode before software
|
||||
* starts to use SW mode.
|
||||
*/
|
||||
if (sc->is_gdsc_enabled) {
|
||||
ret = poll_gdsc_status(sc, ENABLED);
|
||||
if (ret) {
|
||||
dev_err(&rdev->dev, "%s enable timed out\n",
|
||||
sc->rdesc.name);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
sc->is_gdsc_hw_ctrl_mode = false;
|
||||
break;
|
||||
default:
|
||||
@ -575,6 +598,8 @@ static int gdsc_parse_dt_data(struct gdsc *sc, struct device *dev,
|
||||
"qcom,no-status-check-on-disable");
|
||||
sc->retain_ff_enable = of_property_read_bool(dev->of_node,
|
||||
"qcom,retain-regs");
|
||||
sc->skip_disable_before_enable = of_property_read_bool(dev->of_node,
|
||||
"qcom,skip-disable-before-sw-enable");
|
||||
|
||||
if (of_find_property(dev->of_node, "qcom,collapse-vote", NULL)) {
|
||||
ret = of_property_count_u32_elems(dev->of_node,
|
||||
|
537
drivers/clk/qcom/gpucc-holi.c
Normal file
537
drivers/clk/qcom/gpucc-holi.c
Normal file
@ -0,0 +1,537 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (c) 2020, The Linux Foundation. All rights reserved.
|
||||
*/
|
||||
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/regmap.h>
|
||||
|
||||
#include <dt-bindings/clock/qcom,gpucc-holi.h>
|
||||
|
||||
#include "clk-alpha-pll.h"
|
||||
#include "clk-branch.h"
|
||||
#include "clk-rcg.h"
|
||||
#include "clk-regmap.h"
|
||||
#include "common.h"
|
||||
#include "reset.h"
|
||||
#include "vdd-level-holi.h"
|
||||
|
||||
static DEFINE_VDD_REGULATORS(vdd_cx, VDD_NUM, 1, vdd_corner);
|
||||
static DEFINE_VDD_REGULATORS(vdd_mx, VDD_NUM, 1, vdd_corner);
|
||||
static DEFINE_VDD_REGULATORS(vdd_gx, VDD_NUM, 1, vdd_corner);
|
||||
|
||||
enum {
|
||||
P_BI_TCXO,
|
||||
P_CORE_BI_PLL_TEST_SE,
|
||||
P_GCC_GPU_GPLL0_CLK_SRC,
|
||||
P_GCC_GPU_GPLL0_DIV_CLK_SRC,
|
||||
P_GPU_CC_PLL0_OUT_EVEN,
|
||||
P_GPU_CC_PLL0_OUT_MAIN,
|
||||
P_GPU_CC_PLL0_OUT_ODD,
|
||||
P_GPU_CC_PLL1_OUT_EVEN,
|
||||
P_GPU_CC_PLL1_OUT_MAIN,
|
||||
P_GPU_CC_PLL1_OUT_ODD,
|
||||
};
|
||||
|
||||
static struct pll_vco fabia_vco[] = {
|
||||
{ 249600000, 2000000000, 0 },
|
||||
};
|
||||
|
||||
/* 506MHz configuration */
|
||||
static const struct alpha_pll_config gpu_cc_pll0_config = {
|
||||
.l = 0x1A,
|
||||
.cal_l = 0x3F,
|
||||
.alpha = 0x5AAA,
|
||||
.config_ctl_val = 0x20485699,
|
||||
.config_ctl_hi_val = 0x00002067,
|
||||
.test_ctl_val = 0x40000000,
|
||||
.test_ctl_hi_val = 0x00000002,
|
||||
.user_ctl_val = 0x00000001,
|
||||
.user_ctl_hi_val = 0x00004805,
|
||||
};
|
||||
|
||||
static struct clk_alpha_pll gpu_cc_pll0 = {
|
||||
.offset = 0x0,
|
||||
.vco_table = fabia_vco,
|
||||
.num_vco = ARRAY_SIZE(fabia_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
|
||||
.clkr = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_pll0",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.fw_name = "bi_tcxo",
|
||||
},
|
||||
.num_parents = 1,
|
||||
.ops = &clk_alpha_pll_fabia_ops,
|
||||
},
|
||||
.vdd_data = {
|
||||
.vdd_class = &vdd_mx,
|
||||
.num_rate_max = VDD_NUM,
|
||||
.rate_max = (unsigned long[VDD_NUM]) {
|
||||
[VDD_MIN] = 615000000,
|
||||
[VDD_LOW] = 1066000000,
|
||||
[VDD_LOW_L1] = 1600000000,
|
||||
[VDD_NOMINAL] = 2000000000},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
/* 514MHz configuration */
|
||||
static const struct alpha_pll_config gpu_cc_pll1_config = {
|
||||
.l = 0x1A,
|
||||
.cal_l = 0x3D,
|
||||
.alpha = 0xC555,
|
||||
.config_ctl_val = 0x20485699,
|
||||
.config_ctl_hi_val = 0x00002067,
|
||||
.test_ctl_val = 0x40000000,
|
||||
.test_ctl_hi_val = 0x00000002,
|
||||
.user_ctl_val = 0x00000001,
|
||||
.user_ctl_hi_val = 0x00004805,
|
||||
};
|
||||
|
||||
static struct clk_alpha_pll gpu_cc_pll1 = {
|
||||
.offset = 0x100,
|
||||
.vco_table = fabia_vco,
|
||||
.num_vco = ARRAY_SIZE(fabia_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
|
||||
.clkr = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_pll1",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.fw_name = "bi_tcxo",
|
||||
},
|
||||
.num_parents = 1,
|
||||
.ops = &clk_alpha_pll_fabia_ops,
|
||||
},
|
||||
.vdd_data = {
|
||||
.vdd_class = &vdd_mx,
|
||||
.num_rate_max = VDD_NUM,
|
||||
.rate_max = (unsigned long[VDD_NUM]) {
|
||||
[VDD_MIN] = 615000000,
|
||||
[VDD_LOW] = 1066000000,
|
||||
[VDD_LOW_L1] = 1600000000,
|
||||
[VDD_NOMINAL] = 2000000000},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static const struct parent_map gpu_cc_parent_map_0[] = {
|
||||
{ P_BI_TCXO, 0 },
|
||||
{ P_GPU_CC_PLL0_OUT_MAIN, 1 },
|
||||
{ P_GPU_CC_PLL1_OUT_MAIN, 3 },
|
||||
{ P_GCC_GPU_GPLL0_CLK_SRC, 5 },
|
||||
{ P_GCC_GPU_GPLL0_DIV_CLK_SRC, 6 },
|
||||
{ P_CORE_BI_PLL_TEST_SE, 7 },
|
||||
};
|
||||
|
||||
static const struct clk_parent_data gpu_cc_parent_data_0[] = {
|
||||
{ .fw_name = "bi_tcxo" },
|
||||
{ .hw = &gpu_cc_pll0.clkr.hw },
|
||||
{ .hw = &gpu_cc_pll1.clkr.hw },
|
||||
{ .fw_name = "gcc_gpu_gpll0_clk_src" },
|
||||
{ .fw_name = "gcc_gpu_gpll0_div_clk_src" },
|
||||
{ .fw_name = "core_bi_pll_test_se", .name = "core_bi_pll_test_se" },
|
||||
};
|
||||
|
||||
static const struct parent_map gpu_cc_parent_map_1[] = {
|
||||
{ P_BI_TCXO, 0 },
|
||||
{ P_GPU_CC_PLL0_OUT_EVEN, 1 },
|
||||
{ P_GPU_CC_PLL0_OUT_ODD, 2 },
|
||||
{ P_GPU_CC_PLL1_OUT_EVEN, 3 },
|
||||
{ P_GPU_CC_PLL1_OUT_ODD, 4 },
|
||||
{ P_GCC_GPU_GPLL0_CLK_SRC, 5 },
|
||||
{ P_CORE_BI_PLL_TEST_SE, 7 },
|
||||
};
|
||||
|
||||
static const struct clk_parent_data gpu_cc_parent_data_1[] = {
|
||||
{ .fw_name = "bi_tcxo" },
|
||||
{ .hw = &gpu_cc_pll0.clkr.hw },
|
||||
{ .hw = &gpu_cc_pll0.clkr.hw },
|
||||
{ .hw = &gpu_cc_pll1.clkr.hw },
|
||||
{ .hw = &gpu_cc_pll1.clkr.hw },
|
||||
{ .fw_name = "gcc_gpu_gpll0_clk_src" },
|
||||
{ .fw_name = "core_bi_pll_test_se", .name = "core_bi_pll_test_se" },
|
||||
};
|
||||
|
||||
static const struct parent_map gpu_cc_parent_map_2[] = {
|
||||
{ P_BI_TCXO, 0 },
|
||||
{ P_GCC_GPU_GPLL0_CLK_SRC, 5 },
|
||||
{ P_GCC_GPU_GPLL0_DIV_CLK_SRC, 6 },
|
||||
{ P_CORE_BI_PLL_TEST_SE, 7 },
|
||||
};
|
||||
|
||||
static const struct clk_parent_data gpu_cc_parent_data_2[] = {
|
||||
{ .fw_name = "bi_tcxo" },
|
||||
{ .fw_name = "gcc_gpu_gpll0_clk_src" },
|
||||
{ .fw_name = "gcc_gpu_gpll0_div_clk_src" },
|
||||
{ .fw_name = "core_bi_pll_test_se", .name = "core_bi_pll_test_se" },
|
||||
};
|
||||
|
||||
static const struct freq_tbl ftbl_gpu_cc_gmu_clk_src[] = {
|
||||
F(200000000, P_GCC_GPU_GPLL0_DIV_CLK_SRC, 1.5, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 gpu_cc_gmu_clk_src = {
|
||||
.cmd_rcgr = 0x1120,
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = gpu_cc_parent_map_0,
|
||||
.freq_tbl = ftbl_gpu_cc_gmu_clk_src,
|
||||
.enable_safe_config = true,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_gmu_clk_src",
|
||||
.parent_data = gpu_cc_parent_data_0,
|
||||
.num_parents = 6,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
},
|
||||
.clkr.vdd_data = {
|
||||
.vdd_class = &vdd_cx,
|
||||
.num_rate_max = VDD_NUM,
|
||||
.rate_max = (unsigned long[VDD_NUM]) {
|
||||
[VDD_LOWER] = 200000000},
|
||||
},
|
||||
};
|
||||
|
||||
static const struct freq_tbl ftbl_gpu_cc_gx_gfx3d_clk_src[] = {
|
||||
F(253000000, P_GPU_CC_PLL0_OUT_EVEN, 1, 0, 0),
|
||||
F(355000000, P_GPU_CC_PLL0_OUT_EVEN, 1, 0, 0),
|
||||
F(430000000, P_GPU_CC_PLL0_OUT_EVEN, 1, 0, 0),
|
||||
F(565000000, P_GPU_CC_PLL0_OUT_EVEN, 1, 0, 0),
|
||||
F(650000000, P_GPU_CC_PLL0_OUT_EVEN, 1, 0, 0),
|
||||
F(800000000, P_GPU_CC_PLL0_OUT_EVEN, 1, 0, 0),
|
||||
F(875000000, P_GPU_CC_PLL0_OUT_EVEN, 1, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 gpu_cc_gx_gfx3d_clk_src = {
|
||||
.cmd_rcgr = 0x101c,
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = gpu_cc_parent_map_1,
|
||||
.freq_tbl = ftbl_gpu_cc_gx_gfx3d_clk_src,
|
||||
.enable_safe_config = true,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_gx_gfx3d_clk_src",
|
||||
.parent_data = gpu_cc_parent_data_1,
|
||||
.num_parents = 7,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
},
|
||||
.clkr.vdd_data = {
|
||||
.vdd_class = &vdd_mx,
|
||||
.num_rate_max = VDD_NUM,
|
||||
.rate_max = (unsigned long[VDD_NUM]) {
|
||||
[VDD_LOWER] = 253000000,
|
||||
[VDD_LOW] = 355000000,
|
||||
[VDD_LOW_L1] = 430000000,
|
||||
[VDD_NOMINAL] = 565000000,
|
||||
[VDD_NOMINAL_L1] = 650000000,
|
||||
[VDD_HIGH] = 800000000,
|
||||
[VDD_HIGH_L1] = 875000000},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_ahb_clk = {
|
||||
.halt_reg = 0x1078,
|
||||
.halt_check = BRANCH_HALT_DELAY,
|
||||
.clkr = {
|
||||
.enable_reg = 0x1078,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_ahb_clk",
|
||||
.flags = CLK_IS_CRITICAL,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_cx_gfx3d_clk = {
|
||||
.halt_reg = 0x10a4,
|
||||
.halt_check = BRANCH_HALT_DELAY,
|
||||
.clkr = {
|
||||
.enable_reg = 0x10a4,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_cx_gfx3d_clk",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.hw = &gpu_cc_gx_gfx3d_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_cx_gfx3d_slv_clk = {
|
||||
.halt_reg = 0x10a8,
|
||||
.halt_check = BRANCH_HALT_DELAY,
|
||||
.clkr = {
|
||||
.enable_reg = 0x10a8,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_cx_gfx3d_slv_clk",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.hw = &gpu_cc_gx_gfx3d_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_cx_gmu_clk = {
|
||||
.halt_reg = 0x1098,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x1098,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_cx_gmu_clk",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.hw = &gpu_cc_gmu_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_cx_snoc_dvm_clk = {
|
||||
.halt_reg = 0x108c,
|
||||
.halt_check = BRANCH_HALT_DELAY,
|
||||
.clkr = {
|
||||
.enable_reg = 0x108c,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_cx_snoc_dvm_clk",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.fw_name = "gcc_gpu_snoc_dvm_gfx_clk",
|
||||
},
|
||||
.num_parents = 1,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_cxo_aon_clk = {
|
||||
.halt_reg = 0x1004,
|
||||
.halt_check = BRANCH_HALT_DELAY,
|
||||
.clkr = {
|
||||
.enable_reg = 0x1004,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_cxo_aon_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_cxo_clk = {
|
||||
.halt_reg = 0x109c,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x109c,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_cxo_clk",
|
||||
.flags = CLK_DONT_HOLD_STATE,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_gx_cxo_clk = {
|
||||
.halt_reg = 0x1060,
|
||||
.halt_check = BRANCH_HALT_DELAY,
|
||||
.clkr = {
|
||||
.enable_reg = 0x1060,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_gx_cxo_clk",
|
||||
.flags = CLK_IS_CRITICAL,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_gx_gfx3d_clk = {
|
||||
.halt_reg = 0x1054,
|
||||
.halt_check = BRANCH_HALT_DELAY,
|
||||
.clkr = {
|
||||
.enable_reg = 0x1054,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_gx_gfx3d_clk",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.hw = &gpu_cc_gx_gfx3d_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
.vdd_data = {
|
||||
.vdd_class = &vdd_gx,
|
||||
.num_rate_max = VDD_NUM,
|
||||
.rate_max = (unsigned long[VDD_NUM]) {
|
||||
[VDD_LOWER] = 253000000,
|
||||
[VDD_LOW] = 355000000,
|
||||
[VDD_LOW_L1] = 430000000,
|
||||
[VDD_NOMINAL] = 565000000,
|
||||
[VDD_NOMINAL_L1] = 650000000,
|
||||
[VDD_HIGH] = 800000000,
|
||||
[VDD_HIGH_L1] = 875000000},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_gx_gmu_clk = {
|
||||
.halt_reg = 0x1064,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x1064,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_gx_gmu_clk",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.hw = &gpu_cc_gmu_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_sleep_clk = {
|
||||
.halt_reg = 0x1090,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.clkr = {
|
||||
.enable_reg = 0x1090,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_sleep_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap *gpu_cc_holi_clocks[] = {
|
||||
[GPU_CC_AHB_CLK] = &gpu_cc_ahb_clk.clkr,
|
||||
[GPU_CC_CX_GFX3D_CLK] = &gpu_cc_cx_gfx3d_clk.clkr,
|
||||
[GPU_CC_CX_GFX3D_SLV_CLK] = &gpu_cc_cx_gfx3d_slv_clk.clkr,
|
||||
[GPU_CC_CX_GMU_CLK] = &gpu_cc_cx_gmu_clk.clkr,
|
||||
[GPU_CC_CX_SNOC_DVM_CLK] = &gpu_cc_cx_snoc_dvm_clk.clkr,
|
||||
[GPU_CC_CXO_AON_CLK] = &gpu_cc_cxo_aon_clk.clkr,
|
||||
[GPU_CC_CXO_CLK] = &gpu_cc_cxo_clk.clkr,
|
||||
[GPU_CC_GMU_CLK_SRC] = &gpu_cc_gmu_clk_src.clkr,
|
||||
[GPU_CC_GX_CXO_CLK] = &gpu_cc_gx_cxo_clk.clkr,
|
||||
[GPU_CC_GX_GFX3D_CLK] = &gpu_cc_gx_gfx3d_clk.clkr,
|
||||
[GPU_CC_GX_GFX3D_CLK_SRC] = &gpu_cc_gx_gfx3d_clk_src.clkr,
|
||||
[GPU_CC_GX_GMU_CLK] = &gpu_cc_gx_gmu_clk.clkr,
|
||||
[GPU_CC_PLL0] = &gpu_cc_pll0.clkr,
|
||||
[GPU_CC_PLL1] = &gpu_cc_pll1.clkr,
|
||||
[GPU_CC_SLEEP_CLK] = &gpu_cc_sleep_clk.clkr,
|
||||
};
|
||||
|
||||
static const struct regmap_config gpu_cc_holi_regmap_config = {
|
||||
.reg_bits = 32,
|
||||
.reg_stride = 4,
|
||||
.val_bits = 32,
|
||||
.max_register = 0x8008,
|
||||
.fast_io = true,
|
||||
};
|
||||
|
||||
static const struct qcom_cc_desc gpu_cc_holi_desc = {
|
||||
.config = &gpu_cc_holi_regmap_config,
|
||||
.clks = gpu_cc_holi_clocks,
|
||||
.num_clks = ARRAY_SIZE(gpu_cc_holi_clocks),
|
||||
};
|
||||
|
||||
static const struct of_device_id gpu_cc_holi_match_table[] = {
|
||||
{ .compatible = "qcom,holi-gpucc" },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, gpu_cc_holi_match_table);
|
||||
|
||||
static int gpu_cc_holi_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct regmap *regmap;
|
||||
int ret;
|
||||
|
||||
vdd_cx.regulator[0] = devm_regulator_get(&pdev->dev, "vdd_cx");
|
||||
if (IS_ERR(vdd_cx.regulator[0])) {
|
||||
if (PTR_ERR(vdd_cx.regulator[0]) != -EPROBE_DEFER)
|
||||
dev_err(&pdev->dev, "Unable to get vdd_cx regulator\n");
|
||||
return PTR_ERR(vdd_cx.regulator[0]);
|
||||
}
|
||||
|
||||
vdd_mx.regulator[0] = devm_regulator_get(&pdev->dev, "vdd_mx");
|
||||
if (IS_ERR(vdd_mx.regulator[0])) {
|
||||
if (PTR_ERR(vdd_mx.regulator[0]) != -EPROBE_DEFER)
|
||||
dev_err(&pdev->dev, "Unable to get vdd_mx regulator\n");
|
||||
return PTR_ERR(vdd_mx.regulator[0]);
|
||||
}
|
||||
|
||||
vdd_gx.regulator[0] = devm_regulator_get(&pdev->dev, "vdd_gx");
|
||||
if (IS_ERR(vdd_gx.regulator[0])) {
|
||||
if (PTR_ERR(vdd_gx.regulator[0]) != -EPROBE_DEFER)
|
||||
dev_err(&pdev->dev, "Unable to get vdd_gx regulator\n");
|
||||
return PTR_ERR(vdd_gx.regulator[0]);
|
||||
}
|
||||
|
||||
regmap = qcom_cc_map(pdev, &gpu_cc_holi_desc);
|
||||
if (IS_ERR(regmap))
|
||||
return PTR_ERR(regmap);
|
||||
|
||||
clk_fabia_pll_configure(&gpu_cc_pll0, regmap, &gpu_cc_pll0_config);
|
||||
clk_fabia_pll_configure(&gpu_cc_pll1, regmap, &gpu_cc_pll1_config);
|
||||
|
||||
ret = qcom_cc_really_probe(pdev, &gpu_cc_holi_desc, regmap);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "Failed to register GPU CC clocks\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
dev_info(&pdev->dev, "Registered GPU CC clocks\n");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void gpucc_holi_sync_state(struct device *dev)
|
||||
{
|
||||
qcom_cc_sync_state(dev, &gpu_cc_holi_desc);
|
||||
}
|
||||
|
||||
static struct platform_driver gpu_cc_holi_driver = {
|
||||
.probe = gpu_cc_holi_probe,
|
||||
.driver = {
|
||||
.name = "gpu_cc-holi",
|
||||
.of_match_table = gpu_cc_holi_match_table,
|
||||
.sync_state = gpucc_holi_sync_state,
|
||||
},
|
||||
};
|
||||
|
||||
static int __init gpu_cc_holi_init(void)
|
||||
{
|
||||
return platform_driver_register(&gpu_cc_holi_driver);
|
||||
}
|
||||
subsys_initcall(gpu_cc_holi_init);
|
||||
|
||||
static void __exit gpu_cc_holi_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&gpu_cc_holi_driver);
|
||||
}
|
||||
module_exit(gpu_cc_holi_exit);
|
||||
|
||||
MODULE_DESCRIPTION("QTI GPU_CC HOLI Driver");
|
||||
MODULE_LICENSE("GPL v2");
|
@ -24,7 +24,13 @@
|
||||
#include "reset.h"
|
||||
#include "vdd-level.h"
|
||||
|
||||
static DEFINE_VDD_REGULATORS(vdd_mx, VDD_NUM, 1, vdd_corner);
|
||||
static DEFINE_VDD_REGULATORS(vdd_mx, VDD_NOMINAL + 1, 1, vdd_corner);
|
||||
static DEFINE_VDD_REGULATORS(vdd_cx, VDD_NOMINAL + 1, 1, vdd_corner);
|
||||
|
||||
static struct clk_vdd_class *gpu_cc_lahaina_regulators[] = {
|
||||
&vdd_cx,
|
||||
&vdd_mx,
|
||||
};
|
||||
|
||||
enum {
|
||||
P_BI_TCXO,
|
||||
@ -36,7 +42,7 @@ enum {
|
||||
};
|
||||
|
||||
static struct pll_vco lucid_5lpe_vco[] = {
|
||||
{ 249600000, 2000000000, 0 },
|
||||
{ 249600000, 1750000000, 0 },
|
||||
};
|
||||
|
||||
static const struct alpha_pll_config gpu_cc_pll0_config = {
|
||||
@ -45,7 +51,7 @@ static const struct alpha_pll_config gpu_cc_pll0_config = {
|
||||
.alpha = 0x6000,
|
||||
.config_ctl_val = 0x20485699,
|
||||
.config_ctl_hi_val = 0x00002261,
|
||||
.config_ctl_hi1_val = 0x029A699C,
|
||||
.config_ctl_hi1_val = 0x2A9A699C,
|
||||
.test_ctl_val = 0x00000000,
|
||||
.test_ctl_hi_val = 0x00000000,
|
||||
.test_ctl_hi1_val = 0x01800000,
|
||||
@ -75,8 +81,8 @@ static struct clk_alpha_pll gpu_cc_pll0 = {
|
||||
.rate_max = (unsigned long[VDD_NUM]) {
|
||||
[VDD_MIN] = 615000000,
|
||||
[VDD_LOW] = 1066000000,
|
||||
[VDD_LOW_L1] = 1600000000,
|
||||
[VDD_NOMINAL] = 2000000000},
|
||||
[VDD_LOW_L1] = 1500000000,
|
||||
[VDD_NOMINAL] = 1750000000},
|
||||
},
|
||||
},
|
||||
};
|
||||
@ -87,7 +93,7 @@ static const struct alpha_pll_config gpu_cc_pll1_config = {
|
||||
.alpha = 0xAAA,
|
||||
.config_ctl_val = 0x20485699,
|
||||
.config_ctl_hi_val = 0x00002261,
|
||||
.config_ctl_hi1_val = 0x029A699C,
|
||||
.config_ctl_hi1_val = 0x2A9A699C,
|
||||
.test_ctl_val = 0x00000000,
|
||||
.test_ctl_hi_val = 0x00000000,
|
||||
.test_ctl_hi1_val = 0x01800000,
|
||||
@ -117,8 +123,8 @@ static struct clk_alpha_pll gpu_cc_pll1 = {
|
||||
.rate_max = (unsigned long[VDD_NUM]) {
|
||||
[VDD_MIN] = 615000000,
|
||||
[VDD_LOW] = 1066000000,
|
||||
[VDD_LOW_L1] = 1600000000,
|
||||
[VDD_NOMINAL] = 2000000000},
|
||||
[VDD_LOW_L1] = 1500000000,
|
||||
[VDD_NOMINAL] = 1750000000},
|
||||
},
|
||||
},
|
||||
};
|
||||
@ -132,8 +138,8 @@ static const struct parent_map gpu_cc_parent_map_0[] = {
|
||||
{ P_CORE_BI_PLL_TEST_SE, 7 },
|
||||
};
|
||||
|
||||
static const struct clk_parent_data gpu_cc_parent_data_0_ao[] = {
|
||||
{ .fw_name = "bi_tcxo_ao", .name = "bi_tcxo_ao" },
|
||||
static const struct clk_parent_data gpu_cc_parent_data_0[] = {
|
||||
{ .fw_name = "bi_tcxo", .name = "bi_tcxo" },
|
||||
{ .hw = &gpu_cc_pll0.clkr.hw },
|
||||
{ .hw = &gpu_cc_pll1.clkr.hw },
|
||||
{ .fw_name = "gcc_gpu_gpll0_clk_src", .name = "gcc_gpu_gpll0_clk_src" },
|
||||
@ -150,8 +156,8 @@ static const struct parent_map gpu_cc_parent_map_1[] = {
|
||||
{ P_CORE_BI_PLL_TEST_SE, 7 },
|
||||
};
|
||||
|
||||
static const struct clk_parent_data gpu_cc_parent_data_1_ao[] = {
|
||||
{ .fw_name = "bi_tcxo_ao", .name = "bi_tcxo_ao" },
|
||||
static const struct clk_parent_data gpu_cc_parent_data_1[] = {
|
||||
{ .fw_name = "bi_tcxo", .name = "bi_tcxo" },
|
||||
{ .hw = &gpu_cc_pll1.clkr.hw },
|
||||
{ .fw_name = "gcc_gpu_gpll0_clk_src", .name = "gcc_gpu_gpll0_clk_src" },
|
||||
{ .fw_name = "gcc_gpu_gpll0_div_clk_src", .name =
|
||||
@ -176,11 +182,18 @@ static struct clk_rcg2 gpu_cc_gmu_clk_src = {
|
||||
.flags = HW_CLK_CTRL_MODE,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_gmu_clk_src",
|
||||
.parent_data = gpu_cc_parent_data_0_ao,
|
||||
.parent_data = gpu_cc_parent_data_0,
|
||||
.num_parents = 6,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
},
|
||||
.clkr.vdd_data = {
|
||||
.vdd_class = &vdd_cx,
|
||||
.num_rate_max = VDD_NUM,
|
||||
.rate_max = (unsigned long[VDD_NUM]) {
|
||||
[VDD_LOWER] = 200000000,
|
||||
[VDD_LOW] = 500000000},
|
||||
},
|
||||
};
|
||||
|
||||
static const struct freq_tbl ftbl_gpu_cc_hub_clk_src[] = {
|
||||
@ -200,11 +213,19 @@ static struct clk_rcg2 gpu_cc_hub_clk_src = {
|
||||
.flags = HW_CLK_CTRL_MODE,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_hub_clk_src",
|
||||
.parent_data = gpu_cc_parent_data_1_ao,
|
||||
.parent_data = gpu_cc_parent_data_1,
|
||||
.num_parents = 5,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
},
|
||||
.clkr.vdd_data = {
|
||||
.vdd_class = &vdd_cx,
|
||||
.num_rate_max = VDD_NUM,
|
||||
.rate_max = (unsigned long[VDD_NUM]) {
|
||||
[VDD_LOWER] = 150000000,
|
||||
[VDD_LOW] = 240000000,
|
||||
[VDD_NOMINAL] = 300000000},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap_div gpu_cc_hub_ahb_div_clk_src = {
|
||||
@ -257,7 +278,7 @@ static struct clk_branch gpu_cc_ahb_clk = {
|
||||
|
||||
static struct clk_branch gpu_cc_cb_clk = {
|
||||
.halt_reg = 0x1170,
|
||||
.halt_check = BRANCH_HALT_SKIP,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x1170,
|
||||
.enable_mask = BIT(0),
|
||||
@ -301,7 +322,7 @@ static struct clk_branch gpu_cc_cx_apb_clk = {
|
||||
|
||||
static struct clk_branch gpu_cc_cx_gmu_clk = {
|
||||
.halt_reg = 0x1098,
|
||||
.halt_check = BRANCH_HALT_SKIP,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x1098,
|
||||
.enable_mask = BIT(0),
|
||||
@ -311,7 +332,7 @@ static struct clk_branch gpu_cc_cx_gmu_clk = {
|
||||
.hw = &gpu_cc_gmu_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.flags = CLK_SET_RATE_PARENT | CLK_DONT_HOLD_STATE,
|
||||
.ops = &clk_branch2_aon_ops,
|
||||
},
|
||||
},
|
||||
@ -455,7 +476,7 @@ static struct clk_branch gpu_cc_gx_vsense_clk = {
|
||||
|
||||
static struct clk_branch gpu_cc_hlos1_vote_gpu_smmu_clk = {
|
||||
.halt_reg = 0x5000,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.clkr = {
|
||||
.enable_reg = 0x5000,
|
||||
.enable_mask = BIT(0),
|
||||
@ -486,7 +507,7 @@ static struct clk_branch gpu_cc_hub_aon_clk = {
|
||||
|
||||
static struct clk_branch gpu_cc_hub_cx_int_clk = {
|
||||
.halt_reg = 0x1204,
|
||||
.halt_check = BRANCH_HALT_SKIP,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x1204,
|
||||
.enable_mask = BIT(0),
|
||||
@ -496,7 +517,7 @@ static struct clk_branch gpu_cc_hub_cx_int_clk = {
|
||||
.hw = &gpu_cc_hub_cx_int_div_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.flags = CLK_SET_RATE_PARENT | CLK_DONT_HOLD_STATE,
|
||||
.ops = &clk_branch2_aon_ops,
|
||||
},
|
||||
},
|
||||
@ -596,6 +617,8 @@ static const struct qcom_cc_desc gpu_cc_lahaina_desc = {
|
||||
.num_clks = ARRAY_SIZE(gpu_cc_lahaina_clocks),
|
||||
.resets = gpu_cc_lahaina_resets,
|
||||
.num_resets = ARRAY_SIZE(gpu_cc_lahaina_resets),
|
||||
.clk_regulators = gpu_cc_lahaina_regulators,
|
||||
.num_clk_regulators = ARRAY_SIZE(gpu_cc_lahaina_regulators),
|
||||
};
|
||||
|
||||
static const struct of_device_id gpu_cc_lahaina_match_table[] = {
|
||||
@ -609,13 +632,6 @@ static int gpu_cc_lahaina_probe(struct platform_device *pdev)
|
||||
struct regmap *regmap;
|
||||
int ret;
|
||||
|
||||
vdd_mx.regulator[0] = devm_regulator_get(&pdev->dev, "vdd_mx");
|
||||
if (IS_ERR(vdd_mx.regulator[0])) {
|
||||
if (PTR_ERR(vdd_mx.regulator[0]) != -EPROBE_DEFER)
|
||||
dev_err(&pdev->dev, "Unable to get vdd_mx regulator\n");
|
||||
return PTR_ERR(vdd_mx.regulator[0]);
|
||||
}
|
||||
|
||||
regmap = qcom_cc_map(pdev, &gpu_cc_lahaina_desc);
|
||||
if (IS_ERR(regmap)) {
|
||||
dev_err(&pdev->dev, "Failed to map gpu cc registers\n");
|
||||
|
592
drivers/clk/qcom/gpucc-shima.c
Normal file
592
drivers/clk/qcom/gpucc-shima.c
Normal file
@ -0,0 +1,592 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (c) 2020, The Linux Foundation. All rights reserved.
|
||||
*/
|
||||
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/pm_clock.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/regmap.h>
|
||||
|
||||
#include <dt-bindings/clock/qcom,gpucc-shima.h>
|
||||
|
||||
#include "clk-alpha-pll.h"
|
||||
#include "clk-branch.h"
|
||||
#include "clk-rcg.h"
|
||||
#include "clk-regmap-divider.h"
|
||||
#include "common.h"
|
||||
#include "reset.h"
|
||||
#include "vdd-level.h"
|
||||
|
||||
static DEFINE_VDD_REGULATORS(vdd_cx, VDD_NUM, 1, vdd_corner);
|
||||
static DEFINE_VDD_REGULATORS(vdd_mx, VDD_NUM, 1, vdd_corner);
|
||||
|
||||
enum {
|
||||
P_BI_TCXO,
|
||||
P_CORE_BI_PLL_TEST_SE,
|
||||
P_GPLL0_OUT_MAIN,
|
||||
P_GPLL0_OUT_MAIN_DIV,
|
||||
P_GPU_CC_PLL0_OUT_MAIN,
|
||||
P_GPU_CC_PLL1_OUT_MAIN,
|
||||
};
|
||||
|
||||
static struct pll_vco lucid_5lpe_vco[] = {
|
||||
{ 249600000, 1800000000, 0 },
|
||||
};
|
||||
|
||||
/* 468MHz Configuration */
|
||||
static const struct alpha_pll_config gpu_cc_pll0_config = {
|
||||
.l = 0x18,
|
||||
.alpha = 0x6000,
|
||||
.config_ctl_val = 0x20485699,
|
||||
.config_ctl_hi_val = 0x00002261,
|
||||
.config_ctl_hi1_val = 0x2A9A699C,
|
||||
.test_ctl_val = 0x00000000,
|
||||
.test_ctl_hi_val = 0x00000000,
|
||||
.test_ctl_hi1_val = 0x01800000,
|
||||
.user_ctl_val = 0x00000001,
|
||||
.user_ctl_hi_val = 0x00000805,
|
||||
.user_ctl_hi1_val = 0x00000000,
|
||||
};
|
||||
|
||||
static struct clk_alpha_pll gpu_cc_pll0 = {
|
||||
.offset = 0x0,
|
||||
.vco_table = lucid_5lpe_vco,
|
||||
.num_vco = ARRAY_SIZE(lucid_5lpe_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_5LPE],
|
||||
.clkr = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_pll0",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.fw_name = "bi_tcxo",
|
||||
},
|
||||
.num_parents = 1,
|
||||
.ops = &clk_alpha_pll_lucid_5lpe_ops,
|
||||
},
|
||||
.vdd_data = {
|
||||
.vdd_class = &vdd_mx,
|
||||
.num_rate_max = VDD_NUM,
|
||||
.rate_max = (unsigned long[VDD_NUM]) {
|
||||
[VDD_MIN] = 615000000,
|
||||
[VDD_LOW] = 1066000000,
|
||||
[VDD_LOW_L1] = 1500000000,
|
||||
[VDD_NOMINAL] = 1750000000,
|
||||
[VDD_HIGH] = 1800000000},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
/* 500MHz Configuration */
|
||||
static const struct alpha_pll_config gpu_cc_pll1_config = {
|
||||
.l = 0x1A,
|
||||
.alpha = 0xAAA,
|
||||
.config_ctl_val = 0x20485699,
|
||||
.config_ctl_hi_val = 0x00002261,
|
||||
.config_ctl_hi1_val = 0x2A9A699C,
|
||||
.test_ctl_val = 0x00000000,
|
||||
.test_ctl_hi_val = 0x00000000,
|
||||
.test_ctl_hi1_val = 0x01800000,
|
||||
.user_ctl_val = 0x00000001,
|
||||
.user_ctl_hi_val = 0x00000805,
|
||||
.user_ctl_hi1_val = 0x00000000,
|
||||
};
|
||||
|
||||
static struct clk_alpha_pll gpu_cc_pll1 = {
|
||||
.offset = 0x100,
|
||||
.vco_table = lucid_5lpe_vco,
|
||||
.num_vco = ARRAY_SIZE(lucid_5lpe_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_5LPE],
|
||||
.clkr = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_pll1",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.fw_name = "bi_tcxo",
|
||||
},
|
||||
.num_parents = 1,
|
||||
.ops = &clk_alpha_pll_lucid_5lpe_ops,
|
||||
},
|
||||
.vdd_data = {
|
||||
.vdd_class = &vdd_mx,
|
||||
.num_rate_max = VDD_NUM,
|
||||
.rate_max = (unsigned long[VDD_NUM]) {
|
||||
[VDD_MIN] = 615000000,
|
||||
[VDD_LOW] = 1066000000,
|
||||
[VDD_LOW_L1] = 1500000000,
|
||||
[VDD_NOMINAL] = 1750000000,
|
||||
[VDD_HIGH] = 1800000000},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static const struct parent_map gpu_cc_parent_map_0[] = {
|
||||
{ P_BI_TCXO, 0 },
|
||||
{ P_GPU_CC_PLL0_OUT_MAIN, 1 },
|
||||
{ P_GPU_CC_PLL1_OUT_MAIN, 3 },
|
||||
{ P_GPLL0_OUT_MAIN, 5 },
|
||||
{ P_GPLL0_OUT_MAIN_DIV, 6 },
|
||||
{ P_CORE_BI_PLL_TEST_SE, 7 },
|
||||
};
|
||||
|
||||
static const struct clk_parent_data gpu_cc_parent_data_0[] = {
|
||||
{ .fw_name = "bi_tcxo", },
|
||||
{ .hw = &gpu_cc_pll0.clkr.hw },
|
||||
{ .hw = &gpu_cc_pll1.clkr.hw },
|
||||
{ .fw_name = "gcc_gpu_gpll0_clk_src", },
|
||||
{ .fw_name = "gcc_gpu_gpll0_div_clk_src", },
|
||||
{ .fw_name = "core_bi_pll_test_se", .name = "core_bi_pll_test_se" },
|
||||
};
|
||||
|
||||
static const struct parent_map gpu_cc_parent_map_1[] = {
|
||||
{ P_BI_TCXO, 0 },
|
||||
{ P_GPU_CC_PLL1_OUT_MAIN, 3 },
|
||||
{ P_GPLL0_OUT_MAIN, 5 },
|
||||
{ P_GPLL0_OUT_MAIN_DIV, 6 },
|
||||
{ P_CORE_BI_PLL_TEST_SE, 7 },
|
||||
};
|
||||
|
||||
static const struct clk_parent_data gpu_cc_parent_data_1[] = {
|
||||
{ .fw_name = "bi_tcxo", },
|
||||
{ .hw = &gpu_cc_pll1.clkr.hw },
|
||||
{ .fw_name = "gcc_gpu_gpll0_clk_src", },
|
||||
{ .fw_name = "gcc_gpu_gpll0_div_clk_src", },
|
||||
{ .fw_name = "core_bi_pll_test_se", .name = "core_bi_pll_test_se" },
|
||||
};
|
||||
|
||||
static const struct freq_tbl ftbl_gpu_cc_gmu_clk_src[] = {
|
||||
F(19200000, P_BI_TCXO, 1, 0, 0),
|
||||
F(200000000, P_GPLL0_OUT_MAIN_DIV, 1.5, 0, 0),
|
||||
F(500000000, P_GPU_CC_PLL1_OUT_MAIN, 1, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 gpu_cc_gmu_clk_src = {
|
||||
.cmd_rcgr = 0x1120,
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = gpu_cc_parent_map_0,
|
||||
.freq_tbl = ftbl_gpu_cc_gmu_clk_src,
|
||||
.enable_safe_config = true,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_gmu_clk_src",
|
||||
.parent_data = gpu_cc_parent_data_0,
|
||||
.num_parents = 6,
|
||||
.ops = &clk_rcg2_ops,
|
||||
},
|
||||
.clkr.vdd_data = {
|
||||
.vdd_class = &vdd_cx,
|
||||
.num_rate_max = VDD_NUM,
|
||||
.rate_max = (unsigned long[VDD_NUM]) {
|
||||
[VDD_MIN] = 200000000,
|
||||
[VDD_LOW] = 500000000},
|
||||
},
|
||||
};
|
||||
|
||||
static const struct freq_tbl ftbl_gpu_cc_hub_clk_src[] = {
|
||||
F(150000000, P_GPLL0_OUT_MAIN_DIV, 2, 0, 0),
|
||||
F(240000000, P_GPLL0_OUT_MAIN, 2.5, 0, 0),
|
||||
F(300000000, P_GPLL0_OUT_MAIN, 2, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 gpu_cc_hub_clk_src = {
|
||||
.cmd_rcgr = 0x117c,
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = gpu_cc_parent_map_1,
|
||||
.freq_tbl = ftbl_gpu_cc_hub_clk_src,
|
||||
.enable_safe_config = true,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_hub_clk_src",
|
||||
.parent_data = gpu_cc_parent_data_1,
|
||||
.num_parents = 5,
|
||||
.ops = &clk_rcg2_ops,
|
||||
},
|
||||
.clkr.vdd_data = {
|
||||
.vdd_class = &vdd_cx,
|
||||
.num_rate_max = VDD_NUM,
|
||||
.rate_max = (unsigned long[VDD_NUM]) {
|
||||
[VDD_MIN] = 150000000,
|
||||
[VDD_LOW] = 240000000,
|
||||
[VDD_NOMINAL] = 300000000},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap_div gpu_cc_hub_ahb_div_clk_src = {
|
||||
.reg = 0x11c0,
|
||||
.shift = 0,
|
||||
.width = 4,
|
||||
.clkr.hw.init = &(struct clk_init_data) {
|
||||
.name = "gpu_cc_hub_ahb_div_clk_src",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.hw = &gpu_cc_hub_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_regmap_div_ro_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap_div gpu_cc_hub_cx_int_div_clk_src = {
|
||||
.reg = 0x11bc,
|
||||
.shift = 0,
|
||||
.width = 4,
|
||||
.clkr.hw.init = &(struct clk_init_data) {
|
||||
.name = "gpu_cc_hub_cx_int_div_clk_src",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.hw = &gpu_cc_hub_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_regmap_div_ro_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_ahb_clk = {
|
||||
.halt_reg = 0x1078,
|
||||
.halt_check = BRANCH_HALT_DELAY,
|
||||
.clkr = {
|
||||
.enable_reg = 0x1078,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_ahb_clk",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.hw = &gpu_cc_hub_ahb_div_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_cb_clk = {
|
||||
.halt_reg = 0x1170,
|
||||
.halt_check = BRANCH_HALT_SKIP,
|
||||
.clkr = {
|
||||
.enable_reg = 0x1170,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_cb_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_crc_ahb_clk = {
|
||||
.halt_reg = 0x107c,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.clkr = {
|
||||
.enable_reg = 0x107c,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_crc_ahb_clk",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.hw = &gpu_cc_hub_ahb_div_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_cx_gmu_clk = {
|
||||
.halt_reg = 0x1098,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x1098,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_cx_gmu_clk",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.hw = &gpu_cc_gmu_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT | CLK_DONT_HOLD_STATE,
|
||||
.ops = &clk_branch2_aon_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_cx_snoc_dvm_clk = {
|
||||
.halt_reg = 0x108c,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.clkr = {
|
||||
.enable_reg = 0x108c,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_cx_snoc_dvm_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_cxo_aon_clk = {
|
||||
.halt_reg = 0x1004,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.clkr = {
|
||||
.enable_reg = 0x1004,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_cxo_aon_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_cxo_clk = {
|
||||
.halt_reg = 0x109c,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x109c,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_cxo_clk",
|
||||
.flags = CLK_DONT_HOLD_STATE,
|
||||
.ops = &clk_branch2_aon_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_gx_gmu_clk = {
|
||||
.halt_reg = 0x1064,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x1064,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_gx_gmu_clk",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.hw = &gpu_cc_gmu_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_hlos1_vote_gpu_smmu_clk = {
|
||||
.halt_reg = 0x5000,
|
||||
.halt_check = BRANCH_VOTED,
|
||||
.clkr = {
|
||||
.enable_reg = 0x5000,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_hlos1_vote_gpu_smmu_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_hub_aon_clk = {
|
||||
.halt_reg = 0x1178,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x1178,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_hub_aon_clk",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.hw = &gpu_cc_hub_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_aon_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_hub_cx_int_clk = {
|
||||
.halt_reg = 0x1204,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x1204,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_hub_cx_int_clk",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.hw = &gpu_cc_hub_cx_int_div_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT | CLK_DONT_HOLD_STATE,
|
||||
.ops = &clk_branch2_aon_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_mnd1x_0_gfx3d_clk = {
|
||||
.halt_reg = 0x802c,
|
||||
.halt_check = BRANCH_HALT_SKIP,
|
||||
.clkr = {
|
||||
.enable_reg = 0x802c,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_mnd1x_0_gfx3d_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_mnd1x_1_gfx3d_clk = {
|
||||
.halt_reg = 0x8030,
|
||||
.halt_check = BRANCH_HALT_SKIP,
|
||||
.clkr = {
|
||||
.enable_reg = 0x8030,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_mnd1x_1_gfx3d_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_sleep_clk = {
|
||||
.halt_reg = 0x1090,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.clkr = {
|
||||
.enable_reg = 0x1090,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_sleep_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap *gpu_cc_shima_clocks[] = {
|
||||
[GPU_CC_AHB_CLK] = &gpu_cc_ahb_clk.clkr,
|
||||
[GPU_CC_CB_CLK] = &gpu_cc_cb_clk.clkr,
|
||||
[GPU_CC_CRC_AHB_CLK] = &gpu_cc_crc_ahb_clk.clkr,
|
||||
[GPU_CC_CX_GMU_CLK] = &gpu_cc_cx_gmu_clk.clkr,
|
||||
[GPU_CC_CX_SNOC_DVM_CLK] = &gpu_cc_cx_snoc_dvm_clk.clkr,
|
||||
[GPU_CC_CXO_AON_CLK] = &gpu_cc_cxo_aon_clk.clkr,
|
||||
[GPU_CC_CXO_CLK] = &gpu_cc_cxo_clk.clkr,
|
||||
[GPU_CC_GMU_CLK_SRC] = &gpu_cc_gmu_clk_src.clkr,
|
||||
[GPU_CC_GX_GMU_CLK] = &gpu_cc_gx_gmu_clk.clkr,
|
||||
[GPU_CC_HLOS1_VOTE_GPU_SMMU_CLK] = &gpu_cc_hlos1_vote_gpu_smmu_clk.clkr,
|
||||
[GPU_CC_HUB_AHB_DIV_CLK_SRC] = &gpu_cc_hub_ahb_div_clk_src.clkr,
|
||||
[GPU_CC_HUB_AON_CLK] = &gpu_cc_hub_aon_clk.clkr,
|
||||
[GPU_CC_HUB_CLK_SRC] = &gpu_cc_hub_clk_src.clkr,
|
||||
[GPU_CC_HUB_CX_INT_CLK] = &gpu_cc_hub_cx_int_clk.clkr,
|
||||
[GPU_CC_HUB_CX_INT_DIV_CLK_SRC] = &gpu_cc_hub_cx_int_div_clk_src.clkr,
|
||||
[GPU_CC_MND1X_0_GFX3D_CLK] = &gpu_cc_mnd1x_0_gfx3d_clk.clkr,
|
||||
[GPU_CC_MND1X_1_GFX3D_CLK] = &gpu_cc_mnd1x_1_gfx3d_clk.clkr,
|
||||
[GPU_CC_PLL0] = &gpu_cc_pll0.clkr,
|
||||
[GPU_CC_PLL1] = &gpu_cc_pll1.clkr,
|
||||
[GPU_CC_SLEEP_CLK] = &gpu_cc_sleep_clk.clkr,
|
||||
};
|
||||
|
||||
static const struct regmap_config gpu_cc_shima_regmap_config = {
|
||||
.reg_bits = 32,
|
||||
.reg_stride = 4,
|
||||
.val_bits = 32,
|
||||
.max_register = 0x8030,
|
||||
.fast_io = true,
|
||||
};
|
||||
|
||||
static const struct qcom_cc_desc gpu_cc_shima_desc = {
|
||||
.config = &gpu_cc_shima_regmap_config,
|
||||
.clks = gpu_cc_shima_clocks,
|
||||
.num_clks = ARRAY_SIZE(gpu_cc_shima_clocks),
|
||||
};
|
||||
|
||||
static const struct of_device_id gpu_cc_shima_match_table[] = {
|
||||
{ .compatible = "qcom,shima-gpucc" },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, gpu_cc_shima_match_table);
|
||||
|
||||
static int gpu_cc_shima_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct regmap *regmap;
|
||||
int ret;
|
||||
|
||||
vdd_cx.regulator[0] = devm_regulator_get(&pdev->dev, "vdd_cx");
|
||||
if (IS_ERR(vdd_cx.regulator[0])) {
|
||||
if (PTR_ERR(vdd_cx.regulator[0]) != -EPROBE_DEFER)
|
||||
dev_err(&pdev->dev, "Unable to get vdd_cx regulator\n");
|
||||
return PTR_ERR(vdd_cx.regulator[0]);
|
||||
}
|
||||
|
||||
vdd_mx.regulator[0] = devm_regulator_get(&pdev->dev, "vdd_mx");
|
||||
if (IS_ERR(vdd_mx.regulator[0])) {
|
||||
if (PTR_ERR(vdd_mx.regulator[0]) != -EPROBE_DEFER)
|
||||
dev_err(&pdev->dev, "Unable to get vdd_mx regulator\n");
|
||||
return PTR_ERR(vdd_mx.regulator[0]);
|
||||
}
|
||||
|
||||
regmap = qcom_cc_map(pdev, &gpu_cc_shima_desc);
|
||||
if (IS_ERR(regmap))
|
||||
return PTR_ERR(regmap);
|
||||
|
||||
pm_runtime_enable(&pdev->dev);
|
||||
ret = pm_clk_create(&pdev->dev);
|
||||
if (ret)
|
||||
goto disable_pm_runtime;
|
||||
|
||||
ret = pm_clk_add(&pdev->dev, "cfg_ahb");
|
||||
if (ret < 0) {
|
||||
dev_err(&pdev->dev, "Unable to get ahb clock handle\n");
|
||||
goto destroy_pm_clk;
|
||||
}
|
||||
|
||||
clk_lucid_5lpe_pll_configure(&gpu_cc_pll0, regmap, &gpu_cc_pll0_config);
|
||||
clk_lucid_5lpe_pll_configure(&gpu_cc_pll1, regmap, &gpu_cc_pll1_config);
|
||||
|
||||
ret = qcom_cc_really_probe(pdev, &gpu_cc_shima_desc, regmap);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "Failed to register GPU CC clocks\n");
|
||||
goto destroy_pm_clk;
|
||||
}
|
||||
|
||||
dev_info(&pdev->dev, "Registered GPU CC clocks\n");
|
||||
|
||||
return 0;
|
||||
|
||||
destroy_pm_clk:
|
||||
pm_clk_destroy(&pdev->dev);
|
||||
|
||||
disable_pm_runtime:
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct dev_pm_ops gpu_cc_shima_pm_ops = {
|
||||
SET_RUNTIME_PM_OPS(pm_clk_suspend, pm_clk_resume, NULL)
|
||||
};
|
||||
|
||||
static void gpu_cc_shima_sync_state(struct device *dev)
|
||||
{
|
||||
qcom_cc_sync_state(dev, &gpu_cc_shima_desc);
|
||||
}
|
||||
|
||||
static struct platform_driver gpu_cc_shima_driver = {
|
||||
.probe = gpu_cc_shima_probe,
|
||||
.driver = {
|
||||
.name = "gpu_cc-shima",
|
||||
.of_match_table = gpu_cc_shima_match_table,
|
||||
.sync_state = gpu_cc_shima_sync_state,
|
||||
.pm = &gpu_cc_shima_pm_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static int __init gpu_cc_shima_init(void)
|
||||
{
|
||||
return platform_driver_register(&gpu_cc_shima_driver);
|
||||
}
|
||||
subsys_initcall(gpu_cc_shima_init);
|
||||
|
||||
static void __exit gpu_cc_shima_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&gpu_cc_shima_driver);
|
||||
}
|
||||
module_exit(gpu_cc_shima_exit);
|
||||
|
||||
MODULE_DESCRIPTION("QTI GPU_CC SHIMA Driver");
|
||||
MODULE_LICENSE("GPL v2");
|
@ -157,6 +157,9 @@ int clk_find_vdd_level(struct clk_hw *hw,
|
||||
{
|
||||
int level;
|
||||
|
||||
if (!vdd_data->num_rate_max)
|
||||
return -ENODATA;
|
||||
|
||||
/*
|
||||
* For certain PLLs, due to the limitation in the bits allocated for
|
||||
* programming the fractional divider, the actual rate of the PLL will
|
||||
@ -202,6 +205,9 @@ int clk_regulator_init(struct device *dev, const struct qcom_cc_desc *desc)
|
||||
vdd_class = desc->clk_regulators[i];
|
||||
|
||||
for (cnt = 0; cnt < vdd_class->num_regulators; cnt++) {
|
||||
if (vdd_class->regulator[cnt])
|
||||
continue;
|
||||
|
||||
name = vdd_class->regulator_names[cnt];
|
||||
regulator = devm_regulator_get(dev, name);
|
||||
if (IS_ERR(regulator)) {
|
||||
|
35
drivers/clk/qcom/vdd-level-holi.h
Normal file
35
drivers/clk/qcom/vdd-level-holi.h
Normal file
@ -0,0 +1,35 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/* Copyright (c) 2020, The Linux Foundation. All rights reserved. */
|
||||
|
||||
#ifndef __DRIVERS_CLK_QCOM_VDD_LEVEL_H
|
||||
#define __DRIVERS_CLK_QCOM_VDD_LEVEL_H
|
||||
|
||||
#include <linux/regulator/consumer.h>
|
||||
#include <dt-bindings/regulator/qcom,rpmh-regulator-levels.h>
|
||||
|
||||
enum vdd_levels {
|
||||
VDD_NONE,
|
||||
VDD_MIN, /* MIN_SVS */
|
||||
VDD_LOWER, /* LOW_SVS / SVS2 */
|
||||
VDD_LOW, /* SVS */
|
||||
VDD_LOW_L1, /* SVS_L1 */
|
||||
VDD_NOMINAL, /* NOM */
|
||||
VDD_NOMINAL_L1, /* NOM L1 */
|
||||
VDD_HIGH, /* TURBO */
|
||||
VDD_HIGH_L1, /* TURBO_L1 */
|
||||
VDD_NUM,
|
||||
};
|
||||
|
||||
static int vdd_corner[] = {
|
||||
[VDD_NONE] = 0,
|
||||
[VDD_MIN] = RPMH_REGULATOR_LEVEL_MIN_SVS,
|
||||
[VDD_LOWER] = RPMH_REGULATOR_LEVEL_LOW_SVS,
|
||||
[VDD_LOW] = RPMH_REGULATOR_LEVEL_SVS,
|
||||
[VDD_LOW_L1] = RPMH_REGULATOR_LEVEL_SVS_L1,
|
||||
[VDD_NOMINAL] = RPMH_REGULATOR_LEVEL_NOM,
|
||||
[VDD_NOMINAL_L1] = RPMH_REGULATOR_LEVEL_NOM_L1,
|
||||
[VDD_HIGH] = RPMH_REGULATOR_LEVEL_TURBO,
|
||||
[VDD_HIGH_L1] = RPMH_REGULATOR_LEVEL_TURBO_L1,
|
||||
};
|
||||
|
||||
#endif
|
@ -1,6 +1,6 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (c) 2019, The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2019-2020, The Linux Foundation. All rights reserved.
|
||||
*/
|
||||
|
||||
#include <linux/clk.h>
|
||||
@ -10,6 +10,7 @@
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
|
||||
#include <dt-bindings/clock/qcom,videocc-lahaina.h>
|
||||
|
||||
@ -24,8 +25,13 @@
|
||||
#include "reset.h"
|
||||
#include "vdd-level.h"
|
||||
|
||||
static DEFINE_VDD_REGULATORS(vdd_mm, VDD_NUM, 1, vdd_corner);
|
||||
static DEFINE_VDD_REGULATORS(vdd_mx, VDD_NUM, 1, vdd_corner);
|
||||
static DEFINE_VDD_REGULATORS(vdd_mm, VDD_NOMINAL + 1, 1, vdd_corner);
|
||||
static DEFINE_VDD_REGULATORS(vdd_mx, VDD_NOMINAL + 1, 1, vdd_corner);
|
||||
|
||||
static struct clk_vdd_class *video_cc_lahaina_regulators[] = {
|
||||
&vdd_mm,
|
||||
&vdd_mx
|
||||
};
|
||||
|
||||
enum {
|
||||
P_BI_TCXO,
|
||||
@ -36,7 +42,7 @@ enum {
|
||||
};
|
||||
|
||||
static struct pll_vco lucid_5lpe_vco[] = {
|
||||
{ 249600000, 2000000000, 0 },
|
||||
{ 249600000, 1750000000, 0 },
|
||||
};
|
||||
|
||||
static const struct alpha_pll_config video_pll0_config = {
|
||||
@ -45,7 +51,10 @@ static const struct alpha_pll_config video_pll0_config = {
|
||||
.alpha = 0x8000,
|
||||
.config_ctl_val = 0x20485699,
|
||||
.config_ctl_hi_val = 0x00002261,
|
||||
.config_ctl_hi1_val = 0x029A699C,
|
||||
.config_ctl_hi1_val = 0x2A9A699C,
|
||||
.test_ctl_val = 0x00000000,
|
||||
.test_ctl_hi_val = 0x00000000,
|
||||
.test_ctl_hi1_val = 0x01800000,
|
||||
.user_ctl_val = 0x00000000,
|
||||
.user_ctl_hi_val = 0x00000805,
|
||||
.user_ctl_hi1_val = 0x00000000,
|
||||
@ -72,8 +81,8 @@ static struct clk_alpha_pll video_pll0 = {
|
||||
.rate_max = (unsigned long[VDD_NUM]) {
|
||||
[VDD_MIN] = 615000000,
|
||||
[VDD_LOW] = 1066000000,
|
||||
[VDD_LOW_L1] = 1600000000,
|
||||
[VDD_NOMINAL] = 2000000000},
|
||||
[VDD_LOW_L1] = 1500000000,
|
||||
[VDD_NOMINAL] = 1750000000},
|
||||
},
|
||||
},
|
||||
};
|
||||
@ -84,7 +93,10 @@ static const struct alpha_pll_config video_pll1_config = {
|
||||
.alpha = 0xC000,
|
||||
.config_ctl_val = 0x20485699,
|
||||
.config_ctl_hi_val = 0x00002261,
|
||||
.config_ctl_hi1_val = 0x029A699C,
|
||||
.config_ctl_hi1_val = 0x2A9A699C,
|
||||
.test_ctl_val = 0x00000000,
|
||||
.test_ctl_hi_val = 0x00000000,
|
||||
.test_ctl_hi1_val = 0x01800000,
|
||||
.user_ctl_val = 0x00000000,
|
||||
.user_ctl_hi_val = 0x00000805,
|
||||
.user_ctl_hi1_val = 0x00000000,
|
||||
@ -111,8 +123,8 @@ static struct clk_alpha_pll video_pll1 = {
|
||||
.rate_max = (unsigned long[VDD_NUM]) {
|
||||
[VDD_MIN] = 615000000,
|
||||
[VDD_LOW] = 1066000000,
|
||||
[VDD_LOW_L1] = 1600000000,
|
||||
[VDD_NOMINAL] = 2000000000},
|
||||
[VDD_LOW_L1] = 1500000000,
|
||||
[VDD_NOMINAL] = 1750000000},
|
||||
},
|
||||
},
|
||||
};
|
||||
@ -350,26 +362,6 @@ static struct clk_regmap_div video_cc_mvs1c_div2_div_clk_src = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch video_cc_ahb_clk = {
|
||||
.halt_reg = 0xe58,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.hwcg_reg = 0xe58,
|
||||
.hwcg_bit = 1,
|
||||
.clkr = {
|
||||
.enable_reg = 0xe58,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "video_cc_ahb_clk",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.hw = &video_cc_ahb_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_IS_CRITICAL | CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch video_cc_mvs0_clk = {
|
||||
.halt_reg = 0xd34,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
@ -450,7 +442,7 @@ static struct clk_branch video_cc_mvs1_div2_clk = {
|
||||
|
||||
static struct clk_branch video_cc_mvs1c_clk = {
|
||||
.halt_reg = 0xcd4,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0xcd4,
|
||||
.enable_mask = BIT(0),
|
||||
@ -484,26 +476,7 @@ static struct clk_branch video_cc_sleep_clk = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch video_cc_xo_clk = {
|
||||
.halt_reg = 0xeec,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0xeec,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "video_cc_xo_clk",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.hw = &video_cc_xo_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_IS_CRITICAL | CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap *video_cc_lahaina_clocks[] = {
|
||||
[VIDEO_CC_AHB_CLK] = &video_cc_ahb_clk.clkr,
|
||||
[VIDEO_CC_AHB_CLK_SRC] = &video_cc_ahb_clk_src.clkr,
|
||||
[VIDEO_CC_MVS0_CLK] = &video_cc_mvs0_clk.clkr,
|
||||
[VIDEO_CC_MVS0_CLK_SRC] = &video_cc_mvs0_clk_src.clkr,
|
||||
@ -520,7 +493,6 @@ static struct clk_regmap *video_cc_lahaina_clocks[] = {
|
||||
&video_cc_mvs1c_div2_div_clk_src.clkr,
|
||||
[VIDEO_CC_SLEEP_CLK] = &video_cc_sleep_clk.clkr,
|
||||
[VIDEO_CC_SLEEP_CLK_SRC] = &video_cc_sleep_clk_src.clkr,
|
||||
[VIDEO_CC_XO_CLK] = &video_cc_xo_clk.clkr,
|
||||
[VIDEO_CC_XO_CLK_SRC] = &video_cc_xo_clk_src.clkr,
|
||||
[VIDEO_PLL0] = &video_pll0.clkr,
|
||||
[VIDEO_PLL1] = &video_pll1.clkr,
|
||||
@ -544,12 +516,14 @@ static const struct regmap_config video_cc_lahaina_regmap_config = {
|
||||
.fast_io = true,
|
||||
};
|
||||
|
||||
static const struct qcom_cc_desc video_cc_lahaina_desc = {
|
||||
static struct qcom_cc_desc video_cc_lahaina_desc = {
|
||||
.config = &video_cc_lahaina_regmap_config,
|
||||
.clks = video_cc_lahaina_clocks,
|
||||
.num_clks = ARRAY_SIZE(video_cc_lahaina_clocks),
|
||||
.resets = video_cc_lahaina_resets,
|
||||
.num_resets = ARRAY_SIZE(video_cc_lahaina_resets),
|
||||
.clk_regulators = video_cc_lahaina_regulators,
|
||||
.num_clk_regulators = ARRAY_SIZE(video_cc_lahaina_regulators),
|
||||
};
|
||||
|
||||
static const struct of_device_id video_cc_lahaina_match_table[] = {
|
||||
@ -561,44 +535,38 @@ MODULE_DEVICE_TABLE(of, video_cc_lahaina_match_table);
|
||||
static int video_cc_lahaina_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct regmap *regmap;
|
||||
struct clk *clk;
|
||||
int ret;
|
||||
|
||||
vdd_mm.regulator[0] = devm_regulator_get(&pdev->dev, "vdd_mm");
|
||||
if (IS_ERR(vdd_mm.regulator[0])) {
|
||||
if (PTR_ERR(vdd_mm.regulator[0]) != -EPROBE_DEFER)
|
||||
dev_err(&pdev->dev, "Unable to get vdd_mm regulator\n");
|
||||
return PTR_ERR(vdd_mm.regulator[0]);
|
||||
}
|
||||
|
||||
vdd_mx.regulator[0] = devm_regulator_get(&pdev->dev, "vdd_mx");
|
||||
if (IS_ERR(vdd_mx.regulator[0])) {
|
||||
if (PTR_ERR(vdd_mx.regulator[0]) != -EPROBE_DEFER)
|
||||
dev_err(&pdev->dev, "Unable to get vdd_mx regulator\n");
|
||||
return PTR_ERR(vdd_mx.regulator[0]);
|
||||
}
|
||||
|
||||
regmap = qcom_cc_map(pdev, &video_cc_lahaina_desc);
|
||||
if (IS_ERR(regmap))
|
||||
return PTR_ERR(regmap);
|
||||
|
||||
clk = devm_clk_get(&pdev->dev, "cfg_ahb_clk");
|
||||
if (IS_ERR(clk)) {
|
||||
if (PTR_ERR(clk) != -EPROBE_DEFER)
|
||||
dev_err(&pdev->dev, "Unable to get ahb clock handle\n");
|
||||
return PTR_ERR(clk);
|
||||
}
|
||||
devm_clk_put(&pdev->dev, clk);
|
||||
ret = qcom_cc_runtime_init(pdev, &video_cc_lahaina_desc);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = pm_runtime_get_sync(&pdev->dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
clk_lucid_5lpe_pll_configure(&video_pll0, regmap, &video_pll0_config);
|
||||
clk_lucid_5lpe_pll_configure(&video_pll1, regmap, &video_pll1_config);
|
||||
|
||||
/*
|
||||
* Keep clocks always enabled:
|
||||
* video_cc_ahb_clk
|
||||
* video_cc_xo_clk
|
||||
*/
|
||||
regmap_update_bits(regmap, 0xe58, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0xeec, BIT(0), BIT(0));
|
||||
|
||||
ret = qcom_cc_really_probe(pdev, &video_cc_lahaina_desc, regmap);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "Failed to register VIDEO CC clocks\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
pm_runtime_put_sync(&pdev->dev);
|
||||
dev_info(&pdev->dev, "Registered VIDEO CC clocks\n");
|
||||
|
||||
return ret;
|
||||
@ -609,12 +577,17 @@ static void video_cc_lahaina_sync_state(struct device *dev)
|
||||
qcom_cc_sync_state(dev, &video_cc_lahaina_desc);
|
||||
}
|
||||
|
||||
static const struct dev_pm_ops video_cc_lahaina_pm_ops = {
|
||||
SET_RUNTIME_PM_OPS(qcom_cc_runtime_suspend, qcom_cc_runtime_resume, NULL)
|
||||
};
|
||||
|
||||
static struct platform_driver video_cc_lahaina_driver = {
|
||||
.probe = video_cc_lahaina_probe,
|
||||
.driver = {
|
||||
.name = "video_cc-lahaina",
|
||||
.of_match_table = video_cc_lahaina_match_table,
|
||||
.sync_state = video_cc_lahaina_sync_state,
|
||||
.pm = &video_cc_lahaina_pm_ops,
|
||||
},
|
||||
};
|
||||
|
||||
|
649
drivers/clk/qcom/videocc-shima.c
Normal file
649
drivers/clk/qcom/videocc-shima.c
Normal file
@ -0,0 +1,649 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (c) 2020, The Linux Foundation. All rights reserved.
|
||||
*/
|
||||
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/pm_clock.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/regmap.h>
|
||||
|
||||
#include <dt-bindings/clock/qcom,videocc-shima.h>
|
||||
|
||||
#include "clk-alpha-pll.h"
|
||||
#include "clk-branch.h"
|
||||
#include "clk-rcg.h"
|
||||
#include "clk-regmap-divider.h"
|
||||
#include "common.h"
|
||||
#include "reset.h"
|
||||
#include "vdd-level.h"
|
||||
|
||||
static DEFINE_VDD_REGULATORS(vdd_cx, VDD_NUM, 1, vdd_corner);
|
||||
static DEFINE_VDD_REGULATORS(vdd_mx, VDD_NUM, 1, vdd_corner);
|
||||
|
||||
enum {
|
||||
P_BI_TCXO,
|
||||
P_CORE_BI_PLL_TEST_SE,
|
||||
P_SLEEP_CLK,
|
||||
P_VIDEO_PLL0_OUT_MAIN,
|
||||
P_VIDEO_PLL1_OUT_MAIN,
|
||||
};
|
||||
|
||||
static struct pll_vco lucid_5lpe_vco[] = {
|
||||
{ 249600000, 1800000000, 0 },
|
||||
};
|
||||
|
||||
/* 604.8MHz Configuration */
|
||||
static const struct alpha_pll_config video_pll0_config = {
|
||||
.l = 0x1F,
|
||||
.alpha = 0x8000,
|
||||
.config_ctl_val = 0x20485699,
|
||||
.config_ctl_hi_val = 0x00002261,
|
||||
.config_ctl_hi1_val = 0x2A9A699C,
|
||||
.test_ctl_val = 0x00000000,
|
||||
.test_ctl_hi_val = 0x00000000,
|
||||
.test_ctl_hi1_val = 0x01800000,
|
||||
.user_ctl_val = 0x00000001,
|
||||
.user_ctl_hi_val = 0x00000805,
|
||||
.user_ctl_hi1_val = 0x00000000,
|
||||
};
|
||||
|
||||
static struct clk_alpha_pll video_pll0 = {
|
||||
.offset = 0x42c,
|
||||
.vco_table = lucid_5lpe_vco,
|
||||
.num_vco = ARRAY_SIZE(lucid_5lpe_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_5LPE],
|
||||
.clkr = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "video_pll0",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.fw_name = "bi_tcxo",
|
||||
},
|
||||
.num_parents = 1,
|
||||
.ops = &clk_alpha_pll_lucid_5lpe_ops,
|
||||
},
|
||||
.vdd_data = {
|
||||
.vdd_class = &vdd_mx,
|
||||
.num_rate_max = VDD_NUM,
|
||||
.rate_max = (unsigned long[VDD_NUM]) {
|
||||
[VDD_MIN] = 615000000,
|
||||
[VDD_LOW] = 1066000000,
|
||||
[VDD_LOW_L1] = 1500000000,
|
||||
[VDD_NOMINAL] = 1750000000,
|
||||
[VDD_HIGH] = 1800000000},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
/* 840MHz Configuration */
|
||||
static const struct alpha_pll_config video_pll1_config = {
|
||||
.l = 0x2B,
|
||||
.alpha = 0xC000,
|
||||
.config_ctl_val = 0x20485699,
|
||||
.config_ctl_hi_val = 0x00002261,
|
||||
.config_ctl_hi1_val = 0x2A9A699C,
|
||||
.test_ctl_val = 0x00000000,
|
||||
.test_ctl_hi_val = 0x00000000,
|
||||
.test_ctl_hi1_val = 0x01800000,
|
||||
.user_ctl_val = 0x00000001,
|
||||
.user_ctl_hi_val = 0x00000805,
|
||||
.user_ctl_hi1_val = 0x00000000,
|
||||
};
|
||||
|
||||
static struct clk_alpha_pll video_pll1 = {
|
||||
.offset = 0x7d0,
|
||||
.vco_table = lucid_5lpe_vco,
|
||||
.num_vco = ARRAY_SIZE(lucid_5lpe_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_5LPE],
|
||||
.clkr = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "video_pll1",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.fw_name = "bi_tcxo",
|
||||
},
|
||||
.num_parents = 1,
|
||||
.ops = &clk_alpha_pll_lucid_5lpe_ops,
|
||||
},
|
||||
.vdd_data = {
|
||||
.vdd_class = &vdd_mx,
|
||||
.num_rate_max = VDD_NUM,
|
||||
.rate_max = (unsigned long[VDD_NUM]) {
|
||||
[VDD_MIN] = 615000000,
|
||||
[VDD_LOW] = 1066000000,
|
||||
[VDD_LOW_L1] = 1500000000,
|
||||
[VDD_NOMINAL] = 1750000000,
|
||||
[VDD_HIGH] = 1800000000},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static const struct parent_map video_cc_parent_map_0[] = {
|
||||
{ P_BI_TCXO, 0 },
|
||||
{ P_CORE_BI_PLL_TEST_SE, 7 },
|
||||
};
|
||||
|
||||
static const struct clk_parent_data video_cc_parent_data_0_ao[] = {
|
||||
{ .fw_name = "bi_tcxo_ao", },
|
||||
{ .fw_name = "core_bi_pll_test_se", .name = "core_bi_pll_test_se" },
|
||||
};
|
||||
|
||||
static const struct parent_map video_cc_parent_map_1[] = {
|
||||
{ P_BI_TCXO, 0 },
|
||||
{ P_VIDEO_PLL0_OUT_MAIN, 1 },
|
||||
{ P_CORE_BI_PLL_TEST_SE, 7 },
|
||||
};
|
||||
|
||||
static const struct clk_parent_data video_cc_parent_data_1[] = {
|
||||
{ .fw_name = "bi_tcxo", },
|
||||
{ .hw = &video_pll0.clkr.hw },
|
||||
{ .fw_name = "core_bi_pll_test_se", .name = "core_bi_pll_test_se" },
|
||||
};
|
||||
|
||||
static const struct parent_map video_cc_parent_map_2[] = {
|
||||
{ P_BI_TCXO, 0 },
|
||||
{ P_VIDEO_PLL1_OUT_MAIN, 1 },
|
||||
{ P_CORE_BI_PLL_TEST_SE, 7 },
|
||||
};
|
||||
|
||||
static const struct clk_parent_data video_cc_parent_data_2[] = {
|
||||
{ .fw_name = "bi_tcxo", },
|
||||
{ .hw = &video_pll1.clkr.hw },
|
||||
{ .fw_name = "core_bi_pll_test_se", .name = "core_bi_pll_test_se" },
|
||||
};
|
||||
|
||||
static const struct parent_map video_cc_parent_map_3[] = {
|
||||
{ P_SLEEP_CLK, 0 },
|
||||
{ P_CORE_BI_PLL_TEST_SE, 7 },
|
||||
};
|
||||
|
||||
static const struct clk_parent_data video_cc_parent_data_3[] = {
|
||||
{ .fw_name = "sleep_clk", },
|
||||
{ .fw_name = "core_bi_pll_test_se", .name = "core_bi_pll_test_se" },
|
||||
};
|
||||
|
||||
static const struct freq_tbl ftbl_video_cc_ahb_clk_src[] = {
|
||||
F(19200000, P_BI_TCXO, 1, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 video_cc_ahb_clk_src = {
|
||||
.cmd_rcgr = 0xbd4,
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = video_cc_parent_map_0,
|
||||
.freq_tbl = ftbl_video_cc_ahb_clk_src,
|
||||
.enable_safe_config = true,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.name = "video_cc_ahb_clk_src",
|
||||
.parent_data = video_cc_parent_data_0_ao,
|
||||
.num_parents = 2,
|
||||
.ops = &clk_rcg2_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct freq_tbl ftbl_video_cc_mvs0_clk_src[] = {
|
||||
F(604800000, P_VIDEO_PLL0_OUT_MAIN, 1, 0, 0),
|
||||
F(720000000, P_VIDEO_PLL0_OUT_MAIN, 1, 0, 0),
|
||||
F(1014000000, P_VIDEO_PLL0_OUT_MAIN, 1, 0, 0),
|
||||
F(1094400000, P_VIDEO_PLL0_OUT_MAIN, 1, 0, 0),
|
||||
F(1098000000, P_VIDEO_PLL0_OUT_MAIN, 1, 0, 0),
|
||||
F(1332000000, P_VIDEO_PLL0_OUT_MAIN, 1, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 video_cc_mvs0_clk_src = {
|
||||
.cmd_rcgr = 0xb94,
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = video_cc_parent_map_1,
|
||||
.freq_tbl = ftbl_video_cc_mvs0_clk_src,
|
||||
.enable_safe_config = true,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.name = "video_cc_mvs0_clk_src",
|
||||
.parent_data = video_cc_parent_data_1,
|
||||
.num_parents = 3,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
},
|
||||
.clkr.vdd_data = {
|
||||
.vdd_class = &vdd_mx,
|
||||
.num_rate_max = VDD_NUM,
|
||||
.rate_max = (unsigned long[VDD_NUM]) {
|
||||
[VDD_LOWER] = 720000000,
|
||||
[VDD_LOW] = 1014000000,
|
||||
[VDD_LOW_L1] = 1098000000,
|
||||
[VDD_NOMINAL] = 1332000000},
|
||||
},
|
||||
};
|
||||
|
||||
static const struct freq_tbl ftbl_video_cc_mvs1_clk_src[] = {
|
||||
F(840000000, P_VIDEO_PLL1_OUT_MAIN, 1, 0, 0),
|
||||
F(1098000000, P_VIDEO_PLL1_OUT_MAIN, 1, 0, 0),
|
||||
F(1332000000, P_VIDEO_PLL1_OUT_MAIN, 1, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 video_cc_mvs1_clk_src = {
|
||||
.cmd_rcgr = 0xbb4,
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = video_cc_parent_map_2,
|
||||
.freq_tbl = ftbl_video_cc_mvs1_clk_src,
|
||||
.enable_safe_config = true,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.name = "video_cc_mvs1_clk_src",
|
||||
.parent_data = video_cc_parent_data_2,
|
||||
.num_parents = 3,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
},
|
||||
.clkr.vdd_data = {
|
||||
.vdd_class = &vdd_mx,
|
||||
.num_rate_max = VDD_NUM,
|
||||
.rate_max = (unsigned long[VDD_NUM]) {
|
||||
[VDD_LOWER] = 840000000,
|
||||
[VDD_LOW] = 1098000000,
|
||||
[VDD_NOMINAL] = 1332000000},
|
||||
},
|
||||
};
|
||||
|
||||
static const struct freq_tbl ftbl_video_cc_sleep_clk_src[] = {
|
||||
F(32000, P_SLEEP_CLK, 1, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 video_cc_sleep_clk_src = {
|
||||
.cmd_rcgr = 0xef0,
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = video_cc_parent_map_3,
|
||||
.freq_tbl = ftbl_video_cc_sleep_clk_src,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.name = "video_cc_sleep_clk_src",
|
||||
.parent_data = video_cc_parent_data_3,
|
||||
.num_parents = 2,
|
||||
.ops = &clk_rcg2_ops,
|
||||
},
|
||||
.clkr.vdd_data = {
|
||||
.vdd_class = &vdd_cx,
|
||||
.num_rate_max = VDD_NUM,
|
||||
.rate_max = (unsigned long[VDD_NUM]) {
|
||||
[VDD_LOWER] = 32000},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_rcg2 video_cc_xo_clk_src = {
|
||||
.cmd_rcgr = 0xecc,
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = video_cc_parent_map_0,
|
||||
.freq_tbl = ftbl_video_cc_ahb_clk_src,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.name = "video_cc_xo_clk_src",
|
||||
.parent_data = video_cc_parent_data_0_ao,
|
||||
.num_parents = 2,
|
||||
.ops = &clk_rcg2_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap_div video_cc_mvs0_div_clk_src = {
|
||||
.reg = 0xd54,
|
||||
.shift = 0,
|
||||
.width = 4,
|
||||
.clkr.hw.init = &(struct clk_init_data) {
|
||||
.name = "video_cc_mvs0_div_clk_src",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.hw = &video_cc_mvs0_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_regmap_div_ro_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap_div video_cc_mvs0c_div2_div_clk_src = {
|
||||
.reg = 0xc54,
|
||||
.shift = 0,
|
||||
.width = 4,
|
||||
.clkr.hw.init = &(struct clk_init_data) {
|
||||
.name = "video_cc_mvs0c_div2_div_clk_src",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.hw = &video_cc_mvs0_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_regmap_div_ro_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap_div video_cc_mvs1_div_clk_src = {
|
||||
.reg = 0xdd4,
|
||||
.shift = 0,
|
||||
.width = 4,
|
||||
.clkr.hw.init = &(struct clk_init_data) {
|
||||
.name = "video_cc_mvs1_div_clk_src",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.hw = &video_cc_mvs1_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_regmap_div_ro_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap_div video_cc_mvs1c_div2_div_clk_src = {
|
||||
.reg = 0xcf4,
|
||||
.shift = 0,
|
||||
.width = 4,
|
||||
.clkr.hw.init = &(struct clk_init_data) {
|
||||
.name = "video_cc_mvs1c_div2_div_clk_src",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.hw = &video_cc_mvs1_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_regmap_div_ro_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch video_cc_ahb_clk = {
|
||||
.halt_reg = 0xe58,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.hwcg_reg = 0xe58,
|
||||
.hwcg_bit = 1,
|
||||
.clkr = {
|
||||
.enable_reg = 0xe58,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "video_cc_ahb_clk",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.hw = &video_cc_ahb_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_IS_CRITICAL | CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch video_cc_mvs0_clk = {
|
||||
.halt_reg = 0xd34,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.hwcg_reg = 0xd34,
|
||||
.hwcg_bit = 1,
|
||||
.clkr = {
|
||||
.enable_reg = 0xd34,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "video_cc_mvs0_clk",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.hw = &video_cc_mvs0_div_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch video_cc_mvs0c_clk = {
|
||||
.halt_reg = 0xc34,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0xc34,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "video_cc_mvs0c_clk",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.hw = &video_cc_mvs0c_div2_div_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch video_cc_mvs1_clk = {
|
||||
.halt_reg = 0xdb4,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.hwcg_reg = 0xdb4,
|
||||
.hwcg_bit = 1,
|
||||
.clkr = {
|
||||
.enable_reg = 0xdb4,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "video_cc_mvs1_clk",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.hw = &video_cc_mvs1_div_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch video_cc_mvs1_div2_clk = {
|
||||
.halt_reg = 0xdf4,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.hwcg_reg = 0xdf4,
|
||||
.hwcg_bit = 1,
|
||||
.clkr = {
|
||||
.enable_reg = 0xdf4,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "video_cc_mvs1_div2_clk",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.hw = &video_cc_mvs1c_div2_div_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch video_cc_mvs1c_clk = {
|
||||
.halt_reg = 0xcd4,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0xcd4,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "video_cc_mvs1c_clk",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.hw = &video_cc_mvs1c_div2_div_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch video_cc_sleep_clk = {
|
||||
.halt_reg = 0xf10,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0xf10,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "video_cc_sleep_clk",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.hw = &video_cc_sleep_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch video_cc_xo_clk = {
|
||||
.halt_reg = 0xeec,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0xeec,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "video_cc_xo_clk",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.hw = &video_cc_xo_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_IS_CRITICAL | CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap *video_cc_shima_clocks[] = {
|
||||
[VIDEO_CC_AHB_CLK] = &video_cc_ahb_clk.clkr,
|
||||
[VIDEO_CC_AHB_CLK_SRC] = &video_cc_ahb_clk_src.clkr,
|
||||
[VIDEO_CC_MVS0_CLK] = &video_cc_mvs0_clk.clkr,
|
||||
[VIDEO_CC_MVS0_CLK_SRC] = &video_cc_mvs0_clk_src.clkr,
|
||||
[VIDEO_CC_MVS0_DIV_CLK_SRC] = &video_cc_mvs0_div_clk_src.clkr,
|
||||
[VIDEO_CC_MVS0C_CLK] = &video_cc_mvs0c_clk.clkr,
|
||||
[VIDEO_CC_MVS0C_DIV2_DIV_CLK_SRC] =
|
||||
&video_cc_mvs0c_div2_div_clk_src.clkr,
|
||||
[VIDEO_CC_MVS1_CLK] = &video_cc_mvs1_clk.clkr,
|
||||
[VIDEO_CC_MVS1_CLK_SRC] = &video_cc_mvs1_clk_src.clkr,
|
||||
[VIDEO_CC_MVS1_DIV2_CLK] = &video_cc_mvs1_div2_clk.clkr,
|
||||
[VIDEO_CC_MVS1_DIV_CLK_SRC] = &video_cc_mvs1_div_clk_src.clkr,
|
||||
[VIDEO_CC_MVS1C_CLK] = &video_cc_mvs1c_clk.clkr,
|
||||
[VIDEO_CC_MVS1C_DIV2_DIV_CLK_SRC] =
|
||||
&video_cc_mvs1c_div2_div_clk_src.clkr,
|
||||
[VIDEO_CC_SLEEP_CLK] = &video_cc_sleep_clk.clkr,
|
||||
[VIDEO_CC_SLEEP_CLK_SRC] = &video_cc_sleep_clk_src.clkr,
|
||||
[VIDEO_CC_XO_CLK] = &video_cc_xo_clk.clkr,
|
||||
[VIDEO_CC_XO_CLK_SRC] = &video_cc_xo_clk_src.clkr,
|
||||
[VIDEO_PLL0] = &video_pll0.clkr,
|
||||
[VIDEO_PLL1] = &video_pll1.clkr,
|
||||
};
|
||||
|
||||
static const struct qcom_reset_map video_cc_shima_resets[] = {
|
||||
[CVP_VIDEO_CC_INTERFACE_BCR] = { 0xe54 },
|
||||
[CVP_VIDEO_CC_MVS0_BCR] = { 0xd14 },
|
||||
[VIDEO_CC_MVS0C_CLK_ARES] = { 0xc34, 2 },
|
||||
[CVP_VIDEO_CC_MVS0C_BCR] = { 0xbf4 },
|
||||
[CVP_VIDEO_CC_MVS1_BCR] = { 0xd94 },
|
||||
[VIDEO_CC_MVS1C_CLK_ARES] = { 0xcd4, 2 },
|
||||
[CVP_VIDEO_CC_MVS1C_BCR] = { 0xc94 },
|
||||
};
|
||||
|
||||
static const struct regmap_config video_cc_shima_regmap_config = {
|
||||
.reg_bits = 32,
|
||||
.reg_stride = 4,
|
||||
.val_bits = 32,
|
||||
.max_register = 0xf4c,
|
||||
.fast_io = true,
|
||||
};
|
||||
|
||||
static const struct qcom_cc_desc video_cc_shima_desc = {
|
||||
.config = &video_cc_shima_regmap_config,
|
||||
.clks = video_cc_shima_clocks,
|
||||
.num_clks = ARRAY_SIZE(video_cc_shima_clocks),
|
||||
.resets = video_cc_shima_resets,
|
||||
.num_resets = ARRAY_SIZE(video_cc_shima_resets),
|
||||
};
|
||||
|
||||
static const struct of_device_id video_cc_shima_match_table[] = {
|
||||
{ .compatible = "qcom,shima-videocc" },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, video_cc_shima_match_table);
|
||||
|
||||
static int video_cc_shima_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct regmap *regmap;
|
||||
int ret;
|
||||
|
||||
vdd_cx.regulator[0] = devm_regulator_get(&pdev->dev, "vdd_cx");
|
||||
if (IS_ERR(vdd_cx.regulator[0])) {
|
||||
if (PTR_ERR(vdd_cx.regulator[0]) != -EPROBE_DEFER)
|
||||
dev_err(&pdev->dev, "Unable to get vdd_cx regulator\n");
|
||||
return PTR_ERR(vdd_cx.regulator[0]);
|
||||
}
|
||||
|
||||
vdd_mx.regulator[0] = devm_regulator_get(&pdev->dev, "vdd_mx");
|
||||
if (IS_ERR(vdd_mx.regulator[0])) {
|
||||
if (PTR_ERR(vdd_mx.regulator[0]) != -EPROBE_DEFER)
|
||||
dev_err(&pdev->dev, "Unable to get vdd_mx regulator\n");
|
||||
return PTR_ERR(vdd_mx.regulator[0]);
|
||||
}
|
||||
|
||||
regmap = qcom_cc_map(pdev, &video_cc_shima_desc);
|
||||
if (IS_ERR(regmap))
|
||||
return PTR_ERR(regmap);
|
||||
|
||||
pm_runtime_enable(&pdev->dev);
|
||||
ret = pm_clk_create(&pdev->dev);
|
||||
if (ret)
|
||||
goto disable_pm_runtime;
|
||||
|
||||
ret = pm_clk_add(&pdev->dev, "cfg_ahb");
|
||||
if (ret < 0) {
|
||||
dev_err(&pdev->dev, "Unable to get ahb clock handle\n");
|
||||
goto destroy_pm_clk;
|
||||
}
|
||||
|
||||
clk_lucid_5lpe_pll_configure(&video_pll0, regmap, &video_pll0_config);
|
||||
clk_lucid_5lpe_pll_configure(&video_pll1, regmap, &video_pll1_config);
|
||||
|
||||
ret = qcom_cc_really_probe(pdev, &video_cc_shima_desc, regmap);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "Failed to register VIDEO CC clocks\n");
|
||||
goto destroy_pm_clk;
|
||||
}
|
||||
|
||||
dev_info(&pdev->dev, "Registered VIDEO CC clocks\n");
|
||||
|
||||
return 0;
|
||||
|
||||
destroy_pm_clk:
|
||||
pm_clk_destroy(&pdev->dev);
|
||||
|
||||
disable_pm_runtime:
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct dev_pm_ops video_cc_shima_pm_ops = {
|
||||
SET_RUNTIME_PM_OPS(pm_clk_suspend, pm_clk_resume, NULL)
|
||||
};
|
||||
|
||||
static void video_cc_shima_sync_state(struct device *dev)
|
||||
{
|
||||
qcom_cc_sync_state(dev, &video_cc_shima_desc);
|
||||
}
|
||||
|
||||
static struct platform_driver video_cc_shima_driver = {
|
||||
.probe = video_cc_shima_probe,
|
||||
.driver = {
|
||||
.name = "video_cc-shima",
|
||||
.of_match_table = video_cc_shima_match_table,
|
||||
.sync_state = video_cc_shima_sync_state,
|
||||
.pm = &video_cc_shima_pm_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static int __init video_cc_shima_init(void)
|
||||
{
|
||||
return platform_driver_register(&video_cc_shima_driver);
|
||||
}
|
||||
subsys_initcall(video_cc_shima_init);
|
||||
|
||||
static void __exit video_cc_shima_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&video_cc_shima_driver);
|
||||
}
|
||||
module_exit(video_cc_shima_exit);
|
||||
|
||||
MODULE_DESCRIPTION("QTI VIDEO_CC SHIMA Driver");
|
||||
MODULE_LICENSE("GPL v2");
|
@ -476,7 +476,7 @@ config SYS_SUPPORTS_SH_CMT
|
||||
bool
|
||||
|
||||
config MTK_TIMER
|
||||
bool "Mediatek timer driver" if COMPILE_TEST
|
||||
bool "Mediatek timer driver"
|
||||
depends on HAS_IOMEM
|
||||
select TIMER_OF
|
||||
select CLKSRC_MMIO
|
||||
@ -484,7 +484,7 @@ config MTK_TIMER
|
||||
Support for Mediatek timer driver.
|
||||
|
||||
config SPRD_TIMER
|
||||
bool "Spreadtrum timer driver" if EXPERT
|
||||
tristate "Spreadtrum timer driver" if EXPERT
|
||||
depends on HAS_IOMEM
|
||||
depends on (ARCH_SPRD || COMPILE_TEST)
|
||||
default ARCH_SPRD
|
||||
|
@ -5,6 +5,8 @@
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include "timer-of.h"
|
||||
|
||||
@ -141,7 +143,7 @@ static struct timer_of to = {
|
||||
},
|
||||
};
|
||||
|
||||
static int __init sprd_timer_init(struct device_node *np)
|
||||
static int sprd_timer_init(struct device_node *np)
|
||||
{
|
||||
int ret;
|
||||
|
||||
@ -190,7 +192,7 @@ static struct clocksource suspend_clocksource = {
|
||||
.flags = CLOCK_SOURCE_IS_CONTINUOUS | CLOCK_SOURCE_SUSPEND_NONSTOP,
|
||||
};
|
||||
|
||||
static int __init sprd_suspend_timer_init(struct device_node *np)
|
||||
static int sprd_suspend_timer_init(struct device_node *np)
|
||||
{
|
||||
int ret;
|
||||
|
||||
@ -204,6 +206,37 @@ static int __init sprd_suspend_timer_init(struct device_node *np)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef MODULE
|
||||
static int sprd_timer_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device_node *np = pdev->dev.of_node;
|
||||
|
||||
if (of_property_read_bool(np, "interrupts"))
|
||||
return sprd_timer_init(np);
|
||||
|
||||
return sprd_suspend_timer_init(np);
|
||||
}
|
||||
|
||||
static const struct of_device_id sprd_timer_match_table[] = {
|
||||
{ .compatible = "sprd,sc9860-suspend-timer" },
|
||||
{ .compatible = "sprd,sc9860-timer" },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, sprd_timer_match_table);
|
||||
|
||||
static struct platform_driver sprd_timer_driver = {
|
||||
.probe = sprd_timer_probe,
|
||||
.driver = {
|
||||
.name = "sprd-timer",
|
||||
.of_match_table = sprd_timer_match_table,
|
||||
},
|
||||
};
|
||||
module_platform_driver(sprd_timer_driver);
|
||||
|
||||
#else
|
||||
TIMER_OF_DECLARE(sc9860_timer, "sprd,sc9860-timer", sprd_timer_init);
|
||||
TIMER_OF_DECLARE(sc9860_persistent_timer, "sprd,sc9860-suspend-timer",
|
||||
sprd_suspend_timer_init);
|
||||
#endif
|
||||
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -657,6 +657,8 @@ static int quad8_count_read(struct counter_device *counter,
|
||||
|
||||
mutex_lock(&priv->lock);
|
||||
|
||||
mutex_lock(&priv->lock);
|
||||
|
||||
/* Reset Byte Pointer; transfer Counter to Output Latch */
|
||||
outb(QUAD8_CTR_RLD | QUAD8_RLD_RESET_BP | QUAD8_RLD_CNTR_OUT,
|
||||
base_offset + 1);
|
||||
@ -666,6 +668,8 @@ static int quad8_count_read(struct counter_device *counter,
|
||||
|
||||
mutex_unlock(&priv->lock);
|
||||
|
||||
mutex_unlock(&priv->lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -150,6 +150,15 @@ config ARM_QCOM_CPUFREQ_HW
|
||||
The driver implements the cpufreq interface for this HW engine.
|
||||
Say Y if you want to support CPUFreq HW.
|
||||
|
||||
config ARM_QCOM_CPUFREQ_HW_DEBUG
|
||||
bool "QCOM CPUFreq HW debug"
|
||||
depends on ARM_QCOM_CPUFREQ_HW && DEBUG_FS
|
||||
help
|
||||
Support for the CPUFreq HW debug.
|
||||
CPUFreq HW debug provide the support to print the CPUFreq HW debug
|
||||
registers.
|
||||
Say Y if you want to support CPUFreq HW Debug.
|
||||
|
||||
config ARM_RASPBERRYPI_CPUFREQ
|
||||
tristate "Raspberry Pi cpufreq support"
|
||||
depends on CLK_RASPBERRYPI || COMPILE_TEST
|
||||
|
@ -68,6 +68,7 @@ obj-$(CONFIG_ARM_OMAP2PLUS_CPUFREQ) += omap-cpufreq.o
|
||||
obj-$(CONFIG_ARM_PXA2xx_CPUFREQ) += pxa2xx-cpufreq.o
|
||||
obj-$(CONFIG_PXA3xx) += pxa3xx-cpufreq.o
|
||||
obj-$(CONFIG_ARM_QCOM_CPUFREQ_HW) += qcom-cpufreq-hw.o
|
||||
obj-$(CONFIG_ARM_QCOM_CPUFREQ_HW_DEBUG) += qcom-cpufreq-hw-debug.o
|
||||
obj-$(CONFIG_ARM_QCOM_CPUFREQ_NVMEM) += qcom-cpufreq-nvmem.o
|
||||
obj-$(CONFIG_ARM_RASPBERRYPI_CPUFREQ) += raspberrypi-cpufreq.o
|
||||
obj-$(CONFIG_ARM_S3C2410_CPUFREQ) += s3c2410-cpufreq.o
|
||||
|
229
drivers/cpufreq/qcom-cpufreq-hw-debug.c
Normal file
229
drivers/cpufreq/qcom-cpufreq-hw-debug.c
Normal file
@ -0,0 +1,229 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (c) 2020, The Linux Foundation. All rights reserved.
|
||||
*/
|
||||
|
||||
#define pr_fmt(fmt) "cpufreq_hw_debug: %s: " fmt, __func__
|
||||
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/mfd/syscon.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of_platform.h>
|
||||
|
||||
enum debug_hw_regs_data {
|
||||
REG_PERF_STATE,
|
||||
REG_CYCLE_CNTR,
|
||||
REG_PSTATE_STATUS,
|
||||
|
||||
REG_ARRAY_SIZE,
|
||||
};
|
||||
|
||||
struct cpufreq_hwregs {
|
||||
void __iomem *base[REG_ARRAY_SIZE];
|
||||
int domain_cnt;
|
||||
struct dentry *debugfs_base;
|
||||
};
|
||||
|
||||
struct cpufreq_register_data {
|
||||
char *name;
|
||||
u16 offset;
|
||||
};
|
||||
|
||||
static struct cpufreq_hwregs *hw_regs;
|
||||
static const u16 *offsets;
|
||||
|
||||
static const u16 cpufreq_qcom_std_data[REG_ARRAY_SIZE] = {
|
||||
[REG_PERF_STATE] = 0x920,
|
||||
[REG_CYCLE_CNTR] = 0x9c0,
|
||||
[REG_PSTATE_STATUS] = 0x700,
|
||||
};
|
||||
|
||||
static const u16 cpufreq_qcom_std_epss_data[REG_ARRAY_SIZE] = {
|
||||
[REG_PERF_STATE] = 0x320,
|
||||
[REG_CYCLE_CNTR] = 0x3c4,
|
||||
[REG_PSTATE_STATUS] = 0x020,
|
||||
};
|
||||
|
||||
static int print_cpufreq_hw_debug_regs(struct seq_file *s, void *unused)
|
||||
{
|
||||
int i, j;
|
||||
u32 regval;
|
||||
|
||||
static struct cpufreq_register_data data[] = {
|
||||
{"PERF_STATE_DESIRED", REG_PERF_STATE},
|
||||
{"CYCLE_CNTR_VAL", REG_CYCLE_CNTR},
|
||||
{"PSTATE_STATUS", REG_PSTATE_STATUS},
|
||||
};
|
||||
|
||||
for (i = 0; i < hw_regs->domain_cnt; i++) {
|
||||
seq_printf(s, "FREQUENCY DOMAIN %d\n", i);
|
||||
for (j = 0; j < ARRAY_SIZE(data); j++) {
|
||||
regval = readl_relaxed(hw_regs->base[i] +
|
||||
offsets[data[j].offset]);
|
||||
seq_printf(s, "%25s: 0x%.8x\n", data[j].name, regval);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int print_cpufreq_hw_reg_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, print_cpufreq_hw_debug_regs, NULL);
|
||||
}
|
||||
|
||||
static const struct file_operations cpufreq_debug_register_fops = {
|
||||
.open = print_cpufreq_hw_reg_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = seq_release,
|
||||
};
|
||||
|
||||
static int cpufreq_panic_callback(struct notifier_block *nfb,
|
||||
unsigned long event, void *unused)
|
||||
{
|
||||
int i, j;
|
||||
u32 regval;
|
||||
|
||||
static struct cpufreq_register_data data[] = {
|
||||
{"PERF_STATE_DESIRED", REG_PERF_STATE},
|
||||
{"CYCLE_CNTR_VAL", REG_CYCLE_CNTR},
|
||||
{"PSTATE_STATUS", REG_PSTATE_STATUS},
|
||||
};
|
||||
|
||||
for (i = 0; i < hw_regs->domain_cnt; i++) {
|
||||
pr_err("FREQUENCY DOMAIN %d\n", i);
|
||||
for (j = 0; j < ARRAY_SIZE(data); j++) {
|
||||
regval = readl_relaxed(hw_regs->base[i] +
|
||||
offsets[data[j].offset]);
|
||||
pr_err("%25s: 0x%.8x\n", data[j].name, regval);
|
||||
}
|
||||
}
|
||||
|
||||
return NOTIFY_OK;
|
||||
}
|
||||
|
||||
static struct notifier_block cpufreq_panic_notifier = {
|
||||
.notifier_call = cpufreq_panic_callback,
|
||||
.priority = 1,
|
||||
};
|
||||
|
||||
static int cpufreq_get_hwregs(struct platform_device *pdev)
|
||||
{
|
||||
struct of_phandle_args args;
|
||||
struct property *prop;
|
||||
struct resource res;
|
||||
void __iomem *base;
|
||||
int i, ret;
|
||||
|
||||
offsets = of_device_get_match_data(&pdev->dev);
|
||||
if (!offsets)
|
||||
return -EINVAL;
|
||||
|
||||
hw_regs = devm_kzalloc(&pdev->dev, sizeof(*hw_regs), GFP_KERNEL);
|
||||
if (!hw_regs)
|
||||
return -ENOMEM;
|
||||
|
||||
prop = of_find_property(pdev->dev.of_node, "qcom,freq-hw-domain", NULL);
|
||||
if (!prop)
|
||||
return -EINVAL;
|
||||
|
||||
hw_regs->domain_cnt = prop->length / (2 * sizeof(prop->length));
|
||||
|
||||
for (i = 0; i < hw_regs->domain_cnt; i++) {
|
||||
ret = of_parse_phandle_with_fixed_args(pdev->dev.of_node,
|
||||
"qcom,freq-hw-domain", 1, i, &args);
|
||||
of_node_put(pdev->dev.of_node);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = of_address_to_resource(args.np, args.args[0], &res);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
base = devm_ioremap(&pdev->dev, res.start, resource_size(&res));
|
||||
if (!base)
|
||||
return -ENOMEM;
|
||||
|
||||
hw_regs->base[i] = base;
|
||||
}
|
||||
|
||||
atomic_notifier_chain_register(&panic_notifier_list,
|
||||
&cpufreq_panic_notifier);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int enable_cpufreq_hw_debug(struct platform_device *pdev)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = cpufreq_get_hwregs(pdev);
|
||||
if (ret < 0) {
|
||||
dev_err(&pdev->dev, "Failed to map cpufreq hw regs\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
hw_regs->debugfs_base = debugfs_create_dir("qcom-cpufreq-hw", NULL);
|
||||
if (!hw_regs->debugfs_base) {
|
||||
dev_err(&pdev->dev, "Failed to create debugfs entry\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if (!debugfs_create_file("print_cpufreq_debug_regs", 0444,
|
||||
hw_regs->debugfs_base, NULL, &cpufreq_debug_register_fops))
|
||||
goto debugfs_fail;
|
||||
|
||||
return 0;
|
||||
|
||||
debugfs_fail:
|
||||
dev_err(&pdev->dev, "Failed to create debugfs entry so cleaning up\n");
|
||||
debugfs_remove_recursive(hw_regs->debugfs_base);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static int qcom_cpufreq_hw_debug_probe(struct platform_device *pdev)
|
||||
{
|
||||
return enable_cpufreq_hw_debug(pdev);
|
||||
}
|
||||
|
||||
static int qcom_cpufreq_hw_debug_remove(struct platform_device *pdev)
|
||||
{
|
||||
debugfs_remove_recursive(hw_regs->debugfs_base);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct of_device_id qcom_cpufreq_hw_debug_match[] = {
|
||||
{ .compatible = "qcom,cpufreq-hw-debug",
|
||||
.data = &cpufreq_qcom_std_data },
|
||||
{ .compatible = "qcom,cpufreq-hw-epss-debug",
|
||||
.data = &cpufreq_qcom_std_epss_data },
|
||||
{}
|
||||
};
|
||||
|
||||
static struct platform_driver qcom_cpufreq_hw_debug = {
|
||||
.probe = qcom_cpufreq_hw_debug_probe,
|
||||
.remove = qcom_cpufreq_hw_debug_remove,
|
||||
.driver = {
|
||||
.name = "qcom-cpufreq-hw-debug",
|
||||
.of_match_table = qcom_cpufreq_hw_debug_match,
|
||||
},
|
||||
};
|
||||
|
||||
static int __init qcom_cpufreq_hw_debug_init(void)
|
||||
{
|
||||
return platform_driver_register(&qcom_cpufreq_hw_debug);
|
||||
}
|
||||
fs_initcall(qcom_cpufreq_hw_debug_init);
|
||||
|
||||
static void __exit qcom_cpufreq_hw_debug_exit(void)
|
||||
{
|
||||
return platform_driver_unregister(&qcom_cpufreq_hw_debug);
|
||||
}
|
||||
module_exit(qcom_cpufreq_hw_debug_exit);
|
||||
|
||||
MODULE_DESCRIPTION("QTI clock driver for CPUFREQ HW debug");
|
||||
MODULE_LICENSE("GPL v2");
|
@ -18,12 +18,32 @@ if CPU_IDLE
|
||||
config CPU_IDLE_MULTIPLE_DRIVERS
|
||||
bool
|
||||
|
||||
config QGKI_CPUIDLE_FAILED_STAT
|
||||
bool "Record failed attempts at entering idle states"
|
||||
depends on QGKI
|
||||
help
|
||||
CPU idle maintains statistics for successful entry to each idle
|
||||
state. It is also useful to record statistics of failure to
|
||||
enter each idle state.
|
||||
|
||||
Save and report the failed statistics in sysfs along with usage
|
||||
statistics.
|
||||
|
||||
config CPU_IDLE_GOV_LADDER
|
||||
bool "Ladder governor (for periodic timer tick)"
|
||||
|
||||
config CPU_IDLE_GOV_MENU
|
||||
bool "Menu governor (for tickless system)"
|
||||
|
||||
config QGKI_MENU_GOV_DEBUG
|
||||
bool "Trace menu governor decisions"
|
||||
depends on QGKI && CPU_IDLE_GOV_MENU && FTRACE
|
||||
help
|
||||
Trace menu governor decisions to help understand the system
|
||||
state. The predicted sleep time, latency requirement for the
|
||||
CPU and the idle state chosen based on the parameters are all
|
||||
logged in the trace.
|
||||
|
||||
config CPU_IDLE_GOV_TEO
|
||||
bool "Timer events oriented (TEO) governor (for tickless systems)"
|
||||
help
|
||||
|
@ -840,6 +840,11 @@ static int _ce_setup_cipher(struct qce_device *pce_dev, struct qce_req *creq,
|
||||
switch (creq->alg) {
|
||||
case CIPHER_ALG_DES:
|
||||
if (creq->mode != QCE_MODE_ECB) {
|
||||
if (ivsize > MAX_IV_LENGTH) {
|
||||
pr_err("%s: error: Invalid length parameter\n",
|
||||
__func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
_byte_stream_to_net_words(enciv32, creq->iv, ivsize);
|
||||
pce = cmdlistinfo->encr_cntr_iv;
|
||||
pce->data = enciv32[0];
|
||||
@ -2435,10 +2440,7 @@ static int _qce_sps_add_sg_data(struct qce_device *pce_dev,
|
||||
struct sps_iovec *iovec = sps_bam_pipe->iovec +
|
||||
sps_bam_pipe->iovec_count;
|
||||
|
||||
if (!sg_src)
|
||||
return -ENOENT;
|
||||
|
||||
while (nbytes > 0) {
|
||||
while (nbytes > 0 && sg_src) {
|
||||
len = min(nbytes, sg_dma_len(sg_src));
|
||||
nbytes -= len;
|
||||
addr = sg_dma_address(sg_src);
|
||||
|
@ -250,7 +250,6 @@ static int qcedev_open(struct inode *inode, struct file *file)
|
||||
|
||||
handle->cntl = podev;
|
||||
file->private_data = handle;
|
||||
qcedev_ce_high_bw_req(podev, true);
|
||||
|
||||
mutex_init(&handle->registeredbufs.lock);
|
||||
INIT_LIST_HEAD(&handle->registeredbufs.list);
|
||||
@ -272,10 +271,8 @@ static int qcedev_release(struct inode *inode, struct file *file)
|
||||
if (qcedev_unmap_all_buffers(handle))
|
||||
pr_err("%s: failed to unmap all ion buffers\n", __func__);
|
||||
|
||||
kzfree(handle);
|
||||
kfree_sensitive(handle);
|
||||
file->private_data = NULL;
|
||||
if (podev)
|
||||
qcedev_ce_high_bw_req(podev, false);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1698,6 +1695,10 @@ long qcedev_ioctl(struct file *file,
|
||||
init_completion(&qcedev_areq->complete);
|
||||
pstat = &_qcedev_stat;
|
||||
|
||||
if (cmd != QCEDEV_IOCTL_MAP_BUF_REQ &&
|
||||
cmd != QCEDEV_IOCTL_UNMAP_BUF_REQ)
|
||||
qcedev_ce_high_bw_req(podev, true);
|
||||
|
||||
switch (cmd) {
|
||||
case QCEDEV_IOCTL_ENC_REQ:
|
||||
case QCEDEV_IOCTL_DEC_REQ:
|
||||
@ -1986,6 +1987,9 @@ long qcedev_ioctl(struct file *file,
|
||||
}
|
||||
|
||||
exit_free_qcedev_areq:
|
||||
if (cmd != QCEDEV_IOCTL_MAP_BUF_REQ &&
|
||||
cmd != QCEDEV_IOCTL_UNMAP_BUF_REQ && podev != NULL)
|
||||
qcedev_ce_high_bw_req(podev, false);
|
||||
kfree(qcedev_areq);
|
||||
return err;
|
||||
}
|
||||
@ -2286,7 +2290,7 @@ static int _qcedev_debug_init(void)
|
||||
|
||||
_debug_dent = debugfs_create_dir("qcedev", NULL);
|
||||
if (IS_ERR(_debug_dent)) {
|
||||
pr_err("qcedev debugfs_create_dir fail, error %ld\n",
|
||||
pr_debug("qcedev debugfs_create_dir fail, error %ld\n",
|
||||
PTR_ERR(_debug_dent));
|
||||
return PTR_ERR(_debug_dent);
|
||||
}
|
||||
@ -2296,7 +2300,7 @@ static int _qcedev_debug_init(void)
|
||||
dent = debugfs_create_file(name, 0644, _debug_dent,
|
||||
&_debug_qcedev, &_debug_stats_ops);
|
||||
if (dent == NULL) {
|
||||
pr_err("qcedev debugfs_create_file fail, error %ld\n",
|
||||
pr_debug("qcedev debugfs_create_file fail, error %ld\n",
|
||||
PTR_ERR(dent));
|
||||
rc = PTR_ERR(dent);
|
||||
goto err;
|
||||
@ -2309,11 +2313,7 @@ static int _qcedev_debug_init(void)
|
||||
|
||||
static int qcedev_init(void)
|
||||
{
|
||||
int rc;
|
||||
|
||||
rc = _qcedev_debug_init();
|
||||
if (rc)
|
||||
return rc;
|
||||
_qcedev_debug_init();
|
||||
return platform_driver_register(&qcedev_plat_driver);
|
||||
}
|
||||
|
||||
|
@ -1346,7 +1346,7 @@ static void _qcrypto_remove_engine(struct crypto_engine *pengine)
|
||||
icc_put(pengine->icc_path);
|
||||
pengine->icc_path = NULL;
|
||||
|
||||
kzfree(pengine->preq_pool);
|
||||
kfree_sensitive(pengine->preq_pool);
|
||||
|
||||
if (cp->total_units)
|
||||
return;
|
||||
@ -1359,7 +1359,7 @@ static void _qcrypto_remove_engine(struct crypto_engine *pengine)
|
||||
if (q_alg->alg_type == QCRYPTO_ALG_AEAD)
|
||||
crypto_unregister_aead(&q_alg->aead_alg);
|
||||
list_del(&q_alg->entry);
|
||||
kzfree(q_alg);
|
||||
kfree_sensitive(q_alg);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1378,7 +1378,7 @@ static int _qcrypto_remove(struct platform_device *pdev)
|
||||
mutex_unlock(&cp->engine_lock);
|
||||
if (pengine->qce)
|
||||
qce_close(pengine->qce);
|
||||
kzfree(pengine);
|
||||
kfree_sensitive(pengine);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1841,7 +1841,7 @@ static void _qce_ablk_cipher_complete(void *cookie, unsigned char *icb,
|
||||
if (bytes != areq->nbytes)
|
||||
pr_warn("bytes copied=0x%x bytes to copy= 0x%x\n",
|
||||
bytes, areq->nbytes);
|
||||
kzfree(rctx->data);
|
||||
kfree_sensitive(rctx->data);
|
||||
}
|
||||
req_done(pqcrypto_req_control);
|
||||
}
|
||||
@ -1870,7 +1870,7 @@ static void _qce_aead_complete(void *cookie, unsigned char *icv,
|
||||
}
|
||||
|
||||
if (rctx->mode == QCE_MODE_CCM) {
|
||||
kzfree(rctx->adata);
|
||||
kfree_sensitive(rctx->adata);
|
||||
} else {
|
||||
uint32_t ivsize = crypto_aead_ivsize(aead);
|
||||
|
||||
@ -2179,7 +2179,7 @@ static int _qcrypto_process_aead(struct crypto_engine *pengine,
|
||||
rctx->adata = NULL;
|
||||
}
|
||||
if (ret) {
|
||||
kzfree(rctx->adata);
|
||||
kfree_sensitive(rctx->adata);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -3820,7 +3820,7 @@ static int _sha_update(struct ahash_request *req, uint32_t sha_block_size)
|
||||
rctx->trailing_buf_len);
|
||||
memcpy((rctx->data2 + rctx->trailing_buf_len),
|
||||
rctx->data, req->src->length);
|
||||
kzfree(rctx->data);
|
||||
kfree_sensitive(rctx->data);
|
||||
rctx->data = rctx->data2;
|
||||
sg_set_buf(&rctx->sg[0], rctx->data,
|
||||
(rctx->trailing_buf_len +
|
||||
@ -4006,7 +4006,7 @@ static int _sha_hmac_setkey(struct crypto_ahash *tfm, const u8 *key,
|
||||
reinit_completion(&sha_ctx->ahash_req_complete);
|
||||
}
|
||||
|
||||
kzfree(in_buf);
|
||||
kfree_sensitive(in_buf);
|
||||
ahash_request_free(ahash_req);
|
||||
|
||||
return ret;
|
||||
@ -5042,7 +5042,7 @@ static int _qcrypto_probe(struct platform_device *pdev)
|
||||
if (rc) {
|
||||
dev_err(&pdev->dev, "%s alg registration failed\n",
|
||||
q_alg->cipher_alg.cra_driver_name);
|
||||
kzfree(q_alg);
|
||||
kfree_sensitive(q_alg);
|
||||
} else {
|
||||
list_add_tail(&q_alg->entry, &cp->alg_list);
|
||||
dev_info(&pdev->dev, "%s\n",
|
||||
@ -5076,7 +5076,7 @@ static int _qcrypto_probe(struct platform_device *pdev)
|
||||
if (rc) {
|
||||
dev_err(&pdev->dev, "%s alg registration failed\n",
|
||||
q_alg->cipher_alg.cra_driver_name);
|
||||
kzfree(q_alg);
|
||||
kfree_sensitive(q_alg);
|
||||
} else {
|
||||
list_add_tail(&q_alg->entry, &cp->alg_list);
|
||||
dev_info(&pdev->dev, "%s\n",
|
||||
@ -5113,7 +5113,7 @@ static int _qcrypto_probe(struct platform_device *pdev)
|
||||
if (rc) {
|
||||
dev_err(&pdev->dev, "%s alg registration failed\n",
|
||||
q_alg->sha_alg.halg.base.cra_driver_name);
|
||||
kzfree(q_alg);
|
||||
kfree_sensitive(q_alg);
|
||||
} else {
|
||||
list_add_tail(&q_alg->entry, &cp->alg_list);
|
||||
dev_info(&pdev->dev, "%s\n",
|
||||
@ -5228,7 +5228,7 @@ static int _qcrypto_probe(struct platform_device *pdev)
|
||||
dev_err(&pdev->dev,
|
||||
"%s alg registration failed\n",
|
||||
q_alg->sha_alg.halg.base.cra_driver_name);
|
||||
kzfree(q_alg);
|
||||
kfree_sensitive(q_alg);
|
||||
} else {
|
||||
list_add_tail(&q_alg->entry, &cp->alg_list);
|
||||
dev_info(&pdev->dev, "%s\n",
|
||||
@ -5264,7 +5264,7 @@ static int _qcrypto_probe(struct platform_device *pdev)
|
||||
if (rc) {
|
||||
dev_err(&pdev->dev, "%s alg registration failed\n",
|
||||
q_alg->aead_alg.base.cra_driver_name);
|
||||
kzfree(q_alg);
|
||||
kfree_sensitive(q_alg);
|
||||
} else {
|
||||
list_add_tail(&q_alg->entry, &cp->alg_list);
|
||||
dev_info(&pdev->dev, "%s\n",
|
||||
@ -5306,7 +5306,7 @@ static int _qcrypto_probe(struct platform_device *pdev)
|
||||
return 0;
|
||||
err:
|
||||
_qcrypto_remove_engine(pengine);
|
||||
kzfree(pqcrypto_req_control);
|
||||
kfree_sensitive(pqcrypto_req_control);
|
||||
exit_unlock_mutex:
|
||||
mutex_unlock(&cp->engine_lock);
|
||||
exit_qce_close:
|
||||
@ -5512,7 +5512,7 @@ static int _qcrypto_debug_init(void)
|
||||
|
||||
_debug_dent = debugfs_create_dir("qcrypto", NULL);
|
||||
if (IS_ERR(_debug_dent)) {
|
||||
pr_err("qcrypto debugfs_create_dir fail, error %ld\n",
|
||||
pr_debug("qcrypto debugfs_create_dir fail, error %ld\n",
|
||||
PTR_ERR(_debug_dent));
|
||||
return PTR_ERR(_debug_dent);
|
||||
}
|
||||
@ -5522,7 +5522,7 @@ static int _qcrypto_debug_init(void)
|
||||
dent = debugfs_create_file(name, 0644, _debug_dent,
|
||||
&_debug_qcrypto, &_debug_stats_ops);
|
||||
if (dent == NULL) {
|
||||
pr_err("qcrypto debugfs_create_file fail, error %ld\n",
|
||||
pr_debug("qcrypto debugfs_create_file fail, error %ld\n",
|
||||
PTR_ERR(dent));
|
||||
rc = PTR_ERR(dent);
|
||||
goto err;
|
||||
@ -5535,12 +5535,9 @@ static int _qcrypto_debug_init(void)
|
||||
|
||||
static int __init _qcrypto_init(void)
|
||||
{
|
||||
int rc;
|
||||
struct crypto_priv *pcp = &qcrypto_dev;
|
||||
|
||||
rc = _qcrypto_debug_init();
|
||||
if (rc)
|
||||
return rc;
|
||||
_qcrypto_debug_init();
|
||||
INIT_LIST_HEAD(&pcp->alg_list);
|
||||
INIT_LIST_HEAD(&pcp->engine_list);
|
||||
init_llist_head(&pcp->ordered_resp_list);
|
||||
|
@ -68,8 +68,20 @@ struct cpu_data {
|
||||
* defaults to using all of @cpu_grp's CPUs.
|
||||
* @miss_ev_id: The event code corresponding to the @miss_ev
|
||||
* perf event. Will be 0 for compute.
|
||||
* @access_ev_id: The event code corresponding to the @access_ev
|
||||
* perf event. Optional - only needed for writeback
|
||||
* percent.
|
||||
* @wb_ev_id: The event code corresponding to the @wb_ev perf
|
||||
* event. Optional - only needed for writeback
|
||||
* percent.
|
||||
* @miss_ev: The cache miss perf event exclusive to this
|
||||
* mon. Will be NULL for compute.
|
||||
* @access_ev: The cache access perf event exclusive to this
|
||||
* mon. Optional - only needed for writeback
|
||||
* percent.
|
||||
* @wb_ev: The cache writeback perf event exclusive to this
|
||||
* mon. Optional - only needed for writeback
|
||||
* percent.
|
||||
* @requested_update_ms: The mon's desired polling rate. The lowest
|
||||
* @requested_update_ms of all mons determines
|
||||
* @cpu_grp's update_ms.
|
||||
@ -81,8 +93,12 @@ struct memlat_mon {
|
||||
bool is_active;
|
||||
cpumask_t cpus;
|
||||
unsigned int miss_ev_id;
|
||||
unsigned int access_ev_id;
|
||||
unsigned int wb_ev_id;
|
||||
unsigned int requested_update_ms;
|
||||
struct event_data *miss_ev;
|
||||
struct event_data *access_ev;
|
||||
struct event_data *wb_ev;
|
||||
struct memlat_hwmon hw;
|
||||
|
||||
struct memlat_cpu_grp *cpu_grp;
|
||||
@ -208,6 +224,10 @@ static void update_counts(struct memlat_cpu_grp *cpu_grp)
|
||||
cpu - cpumask_first(&mon->cpus);
|
||||
cpu_grp->read_event_cpu = cpu;
|
||||
read_event(&mon->miss_ev[mon_idx]);
|
||||
if (mon->wb_ev_id && mon->access_ev_id) {
|
||||
read_event(&mon->wb_ev[mon_idx]);
|
||||
read_event(&mon->access_ev[mon_idx]);
|
||||
}
|
||||
cpu_grp->read_event_cpu = -1;
|
||||
}
|
||||
}
|
||||
@ -238,6 +258,13 @@ static unsigned long get_cnt(struct memlat_hwmon *hw)
|
||||
devstats->inst_count = 0;
|
||||
devstats->mem_count = 1;
|
||||
}
|
||||
|
||||
if (mon->access_ev_id && mon->wb_ev_id)
|
||||
devstats->wb_pct =
|
||||
mult_frac(100, mon->wb_ev[mon_idx].last_delta,
|
||||
mon->access_ev[mon_idx].last_delta);
|
||||
else
|
||||
devstats->wb_pct = 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -366,6 +393,9 @@ static int memlat_hp_restart_events(unsigned int cpu, bool cpu_up)
|
||||
unsigned int idx;
|
||||
struct event_data *common_evs;
|
||||
|
||||
if (!attr)
|
||||
return -ENOMEM;
|
||||
|
||||
if (!cpu_grp)
|
||||
goto exit;
|
||||
|
||||
@ -458,8 +488,10 @@ static int memlat_event_hotplug_coming_up(unsigned int cpu)
|
||||
if (!cpu_grp)
|
||||
return -ENODEV;
|
||||
mutex_lock(&cpu_grp->mons_lock);
|
||||
ret = memlat_hp_restart_events(cpu, true);
|
||||
per_cpu(cpu_is_hp, cpu) = false;
|
||||
if (cpu_grp->num_active_mons) {
|
||||
ret = memlat_hp_restart_events(cpu, true);
|
||||
per_cpu(cpu_is_hp, cpu) = false;
|
||||
}
|
||||
mutex_unlock(&cpu_grp->mons_lock);
|
||||
|
||||
return ret;
|
||||
@ -474,8 +506,10 @@ static int memlat_event_hotplug_going_down(unsigned int cpu)
|
||||
return -ENODEV;
|
||||
/* avoid race between cpu hotplug and update_counts */
|
||||
mutex_lock(&cpu_grp->mons_lock);
|
||||
per_cpu(cpu_is_hp, cpu) = true;
|
||||
ret = memlat_hp_restart_events(cpu, false);
|
||||
if (cpu_grp->num_active_mons) {
|
||||
per_cpu(cpu_is_hp, cpu) = true;
|
||||
ret = memlat_hp_restart_events(cpu, false);
|
||||
}
|
||||
mutex_unlock(&cpu_grp->mons_lock);
|
||||
|
||||
return ret;
|
||||
@ -574,6 +608,18 @@ static int start_hwmon(struct memlat_hwmon *hw)
|
||||
mon->miss_ev_id, attr);
|
||||
if (ret < 0)
|
||||
goto unlock_out;
|
||||
|
||||
if (mon->access_ev_id && mon->wb_ev_id) {
|
||||
ret = set_event(&mon->access_ev[idx], cpu,
|
||||
mon->access_ev_id, attr);
|
||||
if (ret)
|
||||
goto unlock_out;
|
||||
|
||||
ret = set_event(&mon->wb_ev[idx], cpu,
|
||||
mon->wb_ev_id, attr);
|
||||
if (ret)
|
||||
goto unlock_out;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -617,6 +663,7 @@ static void stop_hwmon(struct memlat_hwmon *hw)
|
||||
devstats->mem_count = 0;
|
||||
devstats->freq = 0;
|
||||
devstats->stall_pct = 0;
|
||||
devstats->wb_pct = 0;
|
||||
}
|
||||
|
||||
if (!cpu_grp->num_active_mons) {
|
||||
@ -626,6 +673,7 @@ static void stop_hwmon(struct memlat_hwmon *hw)
|
||||
hp_idle_register_cnt--;
|
||||
mutex_unlock(¬ify_lock);
|
||||
}
|
||||
mutex_unlock(&cpu_grp->mons_lock);
|
||||
mutex_lock(¬ify_lock);
|
||||
if (!hp_idle_register_cnt) {
|
||||
cpuhp_remove_state_nocalls(CPUHP_AP_ONLINE_DYN);
|
||||
@ -636,7 +684,6 @@ static void stop_hwmon(struct memlat_hwmon *hw)
|
||||
}
|
||||
}
|
||||
mutex_unlock(¬ify_lock);
|
||||
mutex_unlock(&cpu_grp->mons_lock);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -887,6 +934,8 @@ static int memlat_mon_probe(struct platform_device *pdev, bool is_compute)
|
||||
*/
|
||||
if (is_compute) {
|
||||
mon->miss_ev_id = 0;
|
||||
mon->access_ev_id = 0;
|
||||
mon->wb_ev_id = 0;
|
||||
ret = register_compute(dev, hw);
|
||||
} else {
|
||||
mon->miss_ev =
|
||||
@ -907,6 +956,39 @@ static int memlat_mon_probe(struct platform_device *pdev, bool is_compute)
|
||||
}
|
||||
mon->miss_ev_id = event_id;
|
||||
|
||||
ret = of_property_read_u32(dev->of_node, "qcom,access-ev",
|
||||
&event_id);
|
||||
if (ret)
|
||||
dev_dbg(dev, "Access event not specified. Skipping.\n");
|
||||
else
|
||||
mon->access_ev_id = event_id;
|
||||
|
||||
ret = of_property_read_u32(dev->of_node, "qcom,wb-ev",
|
||||
&event_id);
|
||||
if (ret)
|
||||
dev_dbg(dev, "WB event not specified. Skipping.\n");
|
||||
else
|
||||
mon->wb_ev_id = event_id;
|
||||
|
||||
if (mon->wb_ev_id && mon->access_ev_id) {
|
||||
mon->access_ev =
|
||||
devm_kzalloc(dev, num_cpus *
|
||||
sizeof(*mon->access_ev),
|
||||
GFP_KERNEL);
|
||||
if (!mon->access_ev) {
|
||||
ret = -ENOMEM;
|
||||
goto unlock_out;
|
||||
}
|
||||
|
||||
mon->wb_ev =
|
||||
devm_kzalloc(dev, num_cpus *
|
||||
sizeof(*mon->wb_ev), GFP_KERNEL);
|
||||
if (!mon->wb_ev) {
|
||||
ret = -ENOMEM;
|
||||
goto unlock_out;
|
||||
}
|
||||
}
|
||||
|
||||
ret = register_memlat(dev, hw);
|
||||
}
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (c) 2013-2014, 2018-2019, The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2013-2014, 2018-2020, The Linux Foundation. All rights reserved.
|
||||
*/
|
||||
|
||||
#define pr_fmt(fmt) "devfreq-icc: " fmt
|
||||
@ -21,6 +21,7 @@
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_fdt.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <trace/events/power.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/interconnect.h>
|
||||
@ -28,13 +29,27 @@
|
||||
|
||||
/* Has to be ULL to prevent overflow where this macro is used. */
|
||||
#define MBYTE (1ULL << 20)
|
||||
#define HZ_TO_MBPS(hz, w) (mult_frac(w, hz, MBYTE))
|
||||
#define MBPS_TO_HZ(mbps, w) (mult_frac(mbps, MBYTE, w))
|
||||
|
||||
enum dev_type {
|
||||
STD_MBPS_DEV,
|
||||
L3_HZ_DEV,
|
||||
L3_MBPS_DEV,
|
||||
NUM_DEV_TYPES
|
||||
};
|
||||
|
||||
struct devfreq_icc_spec {
|
||||
enum dev_type type;
|
||||
};
|
||||
|
||||
struct dev_data {
|
||||
struct icc_path *icc_path;
|
||||
u32 cur_ab;
|
||||
u32 cur_ib;
|
||||
unsigned long gov_ab;
|
||||
bool is_l3;
|
||||
const struct devfreq_icc_spec *spec;
|
||||
unsigned int width;
|
||||
struct devfreq *df;
|
||||
struct devfreq_dev_profile dp;
|
||||
};
|
||||
@ -53,7 +68,10 @@ static int set_bw(struct device *dev, u32 new_ib, u32 new_ab)
|
||||
if (d->cur_ib == new_ib && d->cur_ab == new_ab)
|
||||
return 0;
|
||||
|
||||
if (!d->is_l3) {
|
||||
if (d->spec->type == L3_MBPS_DEV) {
|
||||
icc_ib = MBPS_TO_HZ(new_ib, d->width);
|
||||
icc_ab = MBPS_TO_HZ(new_ab, d->width);
|
||||
} else if (d->spec->type == STD_MBPS_DEV) {
|
||||
icc_ib = Bps_to_icc(new_ib * MBYTE);
|
||||
icc_ab = Bps_to_icc(new_ab * MBYTE);
|
||||
}
|
||||
@ -101,6 +119,7 @@ static int icc_get_dev_status(struct device *dev,
|
||||
|
||||
static int populate_l3_opp_table(struct device *dev)
|
||||
{
|
||||
struct dev_data *d = dev_get_drvdata(dev);
|
||||
int idx, ret;
|
||||
u32 data, src, mult, i;
|
||||
unsigned long freq, prev_freq = 0;
|
||||
@ -139,7 +158,10 @@ static int populate_l3_opp_table(struct device *dev)
|
||||
if (i > 0 && prev_freq == freq)
|
||||
break;
|
||||
|
||||
dev_pm_opp_add(dev, freq, 0);
|
||||
if (d->spec->type == L3_MBPS_DEV)
|
||||
dev_pm_opp_add(dev, HZ_TO_MBPS(freq, d->width), 0);
|
||||
else
|
||||
dev_pm_opp_add(dev, freq, 0);
|
||||
l3_freqs[i] = freq;
|
||||
prev_freq = freq;
|
||||
}
|
||||
@ -152,13 +174,18 @@ static int populate_l3_opp_table(struct device *dev)
|
||||
|
||||
static int copy_l3_opp_table(struct device *dev)
|
||||
{
|
||||
struct dev_data *d = dev_get_drvdata(dev);
|
||||
int idx;
|
||||
|
||||
for (idx = 0; idx < MAX_L3_ENTRIES; idx++) {
|
||||
if (l3_freqs[idx])
|
||||
dev_pm_opp_add(dev, l3_freqs[idx], 0);
|
||||
else
|
||||
if (!l3_freqs[idx])
|
||||
break;
|
||||
|
||||
if (d->spec->type == L3_MBPS_DEV)
|
||||
dev_pm_opp_add(dev,
|
||||
HZ_TO_MBPS(l3_freqs[idx], d->width), 0);
|
||||
else
|
||||
dev_pm_opp_add(dev, l3_freqs[idx], 0);
|
||||
}
|
||||
|
||||
if (!idx) {
|
||||
@ -186,8 +213,14 @@ int devfreq_add_icc(struct device *dev)
|
||||
return -ENOMEM;
|
||||
dev_set_drvdata(dev, d);
|
||||
|
||||
d->spec = of_device_get_match_data(dev);
|
||||
if (!d->spec) {
|
||||
dev_err(dev, "Unknown device type!\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
p = &d->dp;
|
||||
p->polling_ms = 50;
|
||||
p->polling_ms = 500;
|
||||
p->target = icc_target;
|
||||
p->get_dev_status = icc_get_dev_status;
|
||||
|
||||
@ -200,7 +233,16 @@ int devfreq_add_icc(struct device *dev)
|
||||
}
|
||||
}
|
||||
|
||||
if (of_device_is_compatible(dev->of_node, "qcom,devfreq-icc-l3")) {
|
||||
if (d->spec->type == L3_MBPS_DEV) {
|
||||
ret = of_property_read_u32(dev->of_node, "qcom,bus-width",
|
||||
&d->width);
|
||||
if (ret < 0 || !d->width) {
|
||||
dev_err(dev, "Missing or invalid bus-width: %d\n", ret);
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
if (d->spec->type == L3_HZ_DEV || d->spec->type == L3_MBPS_DEV) {
|
||||
mutex_lock(&l3_freqs_lock);
|
||||
if (use_cached_l3_freqs) {
|
||||
mutex_unlock(&l3_freqs_lock);
|
||||
@ -209,10 +251,8 @@ int devfreq_add_icc(struct device *dev)
|
||||
ret = populate_l3_opp_table(dev);
|
||||
mutex_unlock(&l3_freqs_lock);
|
||||
}
|
||||
d->is_l3 = true;
|
||||
} else {
|
||||
ret = dev_pm_opp_of_add_table(dev);
|
||||
d->is_l3 = false;
|
||||
}
|
||||
if (ret < 0)
|
||||
dev_err(dev, "Couldn't parse OPP table:%d\n", ret);
|
||||
@ -273,11 +313,18 @@ static int devfreq_icc_remove(struct platform_device *pdev)
|
||||
return devfreq_remove_icc(&pdev->dev);
|
||||
}
|
||||
|
||||
static const struct devfreq_icc_spec spec[] = {
|
||||
[0] = { STD_MBPS_DEV },
|
||||
[1] = { L3_HZ_DEV },
|
||||
[2] = { L3_MBPS_DEV },
|
||||
};
|
||||
|
||||
static const struct of_device_id devfreq_icc_match_table[] = {
|
||||
{ .compatible = "qcom,devfreq-icc-l3" },
|
||||
{ .compatible = "qcom,devfreq-icc-llcc" },
|
||||
{ .compatible = "qcom,devfreq-icc-ddr" },
|
||||
{ .compatible = "qcom,devfreq-icc" },
|
||||
{ .compatible = "qcom,devfreq-icc-l3bw", .data = &spec[2] },
|
||||
{ .compatible = "qcom,devfreq-icc-l3", .data = &spec[1] },
|
||||
{ .compatible = "qcom,devfreq-icc-llcc", .data = &spec[0] },
|
||||
{ .compatible = "qcom,devfreq-icc-ddr", .data = &spec[0] },
|
||||
{ .compatible = "qcom,devfreq-icc", .data = &spec[0] },
|
||||
{}
|
||||
};
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (c) 2019, The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2019-2020, The Linux Foundation. All rights reserved.
|
||||
*/
|
||||
|
||||
#define pr_fmt(fmt) "devfreq-qcom-qoslat: " fmt
|
||||
@ -25,21 +25,42 @@ struct qoslat_data {
|
||||
struct devfreq *df;
|
||||
struct devfreq_dev_profile profile;
|
||||
unsigned int qos_level;
|
||||
struct list_head list;
|
||||
};
|
||||
|
||||
#define QOS_LEVEL_OFF 1
|
||||
#define QOS_LEVEL_ON 2
|
||||
|
||||
static LIST_HEAD(qoslat_list);
|
||||
static DEFINE_SPINLOCK(qoslat_lock);
|
||||
static unsigned int agg_qos_level = QOS_LEVEL_OFF;
|
||||
|
||||
#define MAX_MSG_LEN 96
|
||||
static int update_qos_level(struct device *dev, struct qoslat_data *d)
|
||||
static int update_qos_level(struct device *dev)
|
||||
{
|
||||
struct qoslat_data *d;
|
||||
struct qmp_pkt pkt;
|
||||
char mbox_msg[MAX_MSG_LEN + 1] = {0};
|
||||
char *qos_msg = "off";
|
||||
unsigned int qos_lvl = QOS_LEVEL_OFF;
|
||||
int ret;
|
||||
|
||||
if (d->qos_level == QOS_LEVEL_ON)
|
||||
spin_lock(&qoslat_lock);
|
||||
list_for_each_entry(d, &qoslat_list, list)
|
||||
qos_lvl = max(d->qos_level, qos_lvl);
|
||||
|
||||
if (qos_lvl == agg_qos_level) {
|
||||
spin_unlock(&qoslat_lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
agg_qos_level = qos_lvl;
|
||||
|
||||
if (agg_qos_level == QOS_LEVEL_ON)
|
||||
qos_msg = "on";
|
||||
spin_unlock(&qoslat_lock);
|
||||
|
||||
d = dev_get_drvdata(dev);
|
||||
|
||||
snprintf(mbox_msg, MAX_MSG_LEN, "{class: ddr, perfmode: %s}", qos_msg);
|
||||
pkt.size = MAX_MSG_LEN;
|
||||
@ -70,7 +91,7 @@ static int dev_target(struct device *dev, unsigned long *freq, u32 flags)
|
||||
|
||||
d->qos_level = *freq;
|
||||
|
||||
return update_qos_level(dev, d);
|
||||
return update_qos_level(dev);
|
||||
}
|
||||
|
||||
static int dev_get_cur_freq(struct device *dev, unsigned long *freq)
|
||||
@ -82,6 +103,16 @@ static int dev_get_cur_freq(struct device *dev, unsigned long *freq)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int dev_get_dev_status(struct device *dev,
|
||||
struct devfreq_dev_status *stat)
|
||||
{
|
||||
struct qoslat_data *d = dev_get_drvdata(dev);
|
||||
|
||||
stat->current_frequency = d->qos_level;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int devfreq_qcom_qoslat_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
@ -114,6 +145,7 @@ static int devfreq_qcom_qoslat_probe(struct platform_device *pdev)
|
||||
p = &d->profile;
|
||||
p->target = dev_target;
|
||||
p->get_cur_freq = dev_get_cur_freq;
|
||||
p->get_dev_status = dev_get_dev_status;
|
||||
p->polling_ms = 10;
|
||||
|
||||
ret = dev_pm_opp_of_add_table(dev);
|
||||
@ -130,6 +162,10 @@ static int devfreq_qcom_qoslat_probe(struct platform_device *pdev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
spin_lock(&qoslat_lock);
|
||||
list_add_tail(&d->list, &qoslat_list);
|
||||
spin_unlock(&qoslat_lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -145,6 +181,12 @@ static struct platform_driver devfreq_qcom_qoslat_driver = {
|
||||
.of_match_table = devfreq_qoslat_match_table,
|
||||
},
|
||||
};
|
||||
module_platform_driver(devfreq_qcom_qoslat_driver);
|
||||
|
||||
static int __init register_devfreq_qcom_qoslat_driver(void)
|
||||
{
|
||||
return platform_driver_register(&devfreq_qcom_qoslat_driver);
|
||||
}
|
||||
|
||||
late_initcall(register_devfreq_qcom_qoslat_driver);
|
||||
MODULE_DESCRIPTION("Device driver for setting memory latency qos level");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -409,7 +409,6 @@ static unsigned long get_bw_and_set_irq(struct hwmon_node *node,
|
||||
hw->up_wake_mbps = (max(MIN_MBPS, req_mbps)
|
||||
* (100 + node->up_thres)) / 100;
|
||||
hw->down_wake_mbps = 0;
|
||||
hw->undo_over_req_mbps = 0;
|
||||
thres = mbps_to_bytes(max(MIN_MBPS, req_mbps / 2),
|
||||
node->sample_ms);
|
||||
} else {
|
||||
@ -422,10 +421,6 @@ static unsigned long get_bw_and_set_irq(struct hwmon_node *node,
|
||||
*/
|
||||
hw->up_wake_mbps = (req_mbps * (100 + node->up_thres)) / 100;
|
||||
hw->down_wake_mbps = (meas_mbps * node->down_thres) / 100;
|
||||
if (node->wake == UP_WAKE)
|
||||
hw->undo_over_req_mbps = min(req_mbps, meas_mbps_zone);
|
||||
else
|
||||
hw->undo_over_req_mbps = 0;
|
||||
thres = mbps_to_bytes(meas_mbps, node->sample_ms);
|
||||
}
|
||||
|
||||
@ -462,6 +457,14 @@ static unsigned long get_bw_and_set_irq(struct hwmon_node *node,
|
||||
*freq,
|
||||
hw->up_wake_mbps,
|
||||
hw->down_wake_mbps);
|
||||
|
||||
trace_bw_hwmon_debug(dev_name(node->hw->df->dev.parent),
|
||||
req_mbps,
|
||||
meas_mbps_zone,
|
||||
node->hist_max_mbps,
|
||||
node->hist_mem,
|
||||
node->hyst_mbps,
|
||||
node->hyst_en);
|
||||
return req_mbps;
|
||||
}
|
||||
|
||||
@ -537,7 +540,6 @@ static int start_monitor(struct devfreq *df, bool init)
|
||||
mbps = (df->previous_freq * node->io_percent) / 100;
|
||||
hw->up_wake_mbps = mbps;
|
||||
hw->down_wake_mbps = MIN_MBPS;
|
||||
hw->undo_over_req_mbps = 0;
|
||||
ret = hw->start_hwmon(hw, mbps);
|
||||
} else {
|
||||
ret = hw->resume_hwmon(hw);
|
||||
@ -614,6 +616,11 @@ static int gov_start(struct devfreq *df)
|
||||
goto err_sysfs;
|
||||
}
|
||||
|
||||
mutex_lock(&df->lock);
|
||||
df->min_freq = df->max_freq;
|
||||
update_devfreq(df);
|
||||
mutex_unlock(&df->lock);
|
||||
|
||||
return 0;
|
||||
|
||||
err_sysfs:
|
||||
@ -932,6 +939,7 @@ static int devfreq_bw_hwmon_ev_handler(struct devfreq *df,
|
||||
|
||||
static struct devfreq_governor devfreq_gov_bw_hwmon = {
|
||||
.name = "bw_hwmon",
|
||||
.immutable = 1,
|
||||
.get_target_freq = devfreq_bw_hwmon_get_freq,
|
||||
.event_handler = devfreq_bw_hwmon_ev_handler,
|
||||
};
|
||||
|
@ -52,7 +52,6 @@ struct bw_hwmon {
|
||||
struct device_node *of_node;
|
||||
struct devfreq_governor *gov;
|
||||
unsigned long up_wake_mbps;
|
||||
unsigned long undo_over_req_mbps;
|
||||
unsigned long down_wake_mbps;
|
||||
unsigned int down_cnt;
|
||||
struct devfreq *df;
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user