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 reverting d03727b248 ("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: Revert 241b1f419f ("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 commit bd0e6c9614 ("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 commit d1d1a96bdb
  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:
Ivaylo Georgiev 2020-12-11 05:07:26 -08:00 committed by Elliot Berman
commit 7781777d97
633 changed files with 168111 additions and 21099 deletions

6
.gitignore vendored
View File

@ -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

View File

@ -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

View File

@ -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
===========

View 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

View File

@ -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

View File

@ -1,4 +0,0 @@
[abi_whitelist]
# commonly used symbols
module_layout
__put_task_struct

View File

@ -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

View File

@ -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!)"

View File

@ -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
View File

@ -0,0 +1 @@
../../../arm64/boot/dts/vendor

View 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

View 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
View 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

View File

@ -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
/*

View File

@ -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 */

View File

@ -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

View File

@ -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

View File

@ -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);
}

View File

@ -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

View File

@ -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.

View File

@ -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);
}
}
}
/**

View File

@ -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();

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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",

View File

@ -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 ||

View File

@ -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);

View File

@ -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)

View File

@ -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;

View File

@ -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;

View File

@ -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);
}

View File

@ -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);

View File

@ -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);

View File

@ -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,

View File

@ -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;
}

View File

@ -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

View File

@ -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

View File

@ -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;
}
}

View File

@ -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 {

View File

@ -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

File diff suppressed because it is too large Load Diff

View File

@ -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

View File

@ -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

View File

@ -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,
},
};

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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)

View File

@ -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
View 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);

View 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

View File

@ -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)

View File

@ -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;

View File

@ -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 = &divider->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 = &divider->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);

View File

@ -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);

View File

@ -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

View File

@ -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

View File

@ -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");

View File

@ -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

View 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");

View File

@ -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",

View 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");

View 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");

View 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");

View File

@ -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,
},
};

File diff suppressed because it is too large Load Diff

View File

@ -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);

View File

@ -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");

File diff suppressed because it is too large Load Diff

View File

@ -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;

View File

@ -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, &regval);
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,

View 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");

View File

@ -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");

View 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");

View File

@ -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)) {

View 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

View File

@ -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,
},
};

View 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");

View File

@ -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

View File

@ -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");

View File

@ -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;
}

View File

@ -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

View File

@ -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

View 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");

View File

@ -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

View File

@ -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);

View File

@ -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);
}

View File

@ -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);

View File

@ -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(&notify_lock);
}
mutex_unlock(&cpu_grp->mons_lock);
mutex_lock(&notify_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(&notify_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);
}

View File

@ -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] },
{}
};

View File

@ -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");

View File

@ -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,
};

View File

@ -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