Merge tag 'MMI-S2SE32.28-28-4' of https://github.com/MotorolaMobilityLLC/kernel-msm into lineage-20

hawao push for android 12

* tag 'MMI-S2SE32.28-28-4' of https://github.com/MotorolaMobilityLLC/kernel-msm: (4348 commits)
  Hawaii+ OLED: sim1+sim2+sd fast plugGing cause phone hang
  kernel/config: hawao: usb: sim1+sim2+sd fast plugGing cause phone hang
  shmem becomes bigger and bigger when launch apps
  driver/power: Add debug logs
  Hawao: Fix NFC power consumption in sleep mode.
  devon:charger bring up
  lib/iov_iter: initialize "flags" in new pipe_buffer
  BACKPORT: dmabuf: fix use-after-free of dmabuf's file->f_inode
  kernel:add bc12 detect channel definition
  Revert "(CR): drm: mipi: Disable the MIPI DSI commands 0x2E and 0x3E"
  devon4g: camera flash bringup
  sctp: add param size validation for SCTP_PARAM_SET_PRIMARY
  sctp: validate chunk size in __rcv_asconf_lookup
  sctp: add size validation when walking chunks
  sctp: validate from_addr_param return
  aio: fix use-after-free due to missing POLLFREE handling
  aio: keep poll requests on waitqueue until completed
  signalfd: use wake_up_pollfree()
  binder: use wake_up_pollfree()
  wait: add wake_up_pollfree()
  FROMGIT: binder: fix test regression due to sender_euid change
  UPSTREAM: binder: use cred instead of task for getsecid
  BACKPORT: binder: use cred instead of task for selinux checks
  UPSTREAM: binder: use euid from cred instead of using task
  arm64/defconfig: add devon extra configs
  USB: gadget: bRequestType is a bitfield, not a enum
  USB: gadget: zero allocate endpoint 0 buffers
  USB: gadget: detect too-big endpoint 0 requests
  hawao: devconfig: enable CHACHA20 crypto configs
  rhode: devconfig: enable CHACHA20 crypto configs
  regulator: Force shutdown all regulators when system power off.
  arm64: defconfig: Flash compatible
  TZ: Distinguishes encrypted and unencrypted TZ logs interfaces.
  TZ: Fix build err
  Hawaii+OLED:remove CONFIG_QCOM_FSA4480_I2C
  defconfig: Disable SLAB_MERGE.
  arm64/config:Enable Zram writeback on hawao
  Enable LZ4 on Rhode4G and Hawao
  dts: rhode: remove CONFIG_QCOM_FSA4480_I2C
  mm: zram: fix build error when zram wb disabled
  mm : zram fix swapcached issue on Zram Writeback
  fs:proc:abort reclaim once process goes to foreground
  ip_gre: add validation for csum_start
  arm64/config:Enable Zram writeback on Rhode
  kernel:add charger termination definition
  rhode:kernel: add wt6670 get firmware num node
  kernel/config:hawao:remove FTS TP config to use module
  kernel/input:hawao:update to use TP module ko
  kernel: remove wt6670 isp macro definition for user version
  kernel/config:hawao: add new FTS config to fix build error
  input/touchscreen: add ft3519 source config
  input/ft3519: hawao touch driver bringup
  Revert "(CR) hawaii OLED: visionox ft3519 touch drvier bringup"
  kernel: add wt6670 macro definition to control i2c nack
  QC3P:add iio channel definition
  Rhode: define CONFIG_CAMERA_FLASH_PWM
  display: Modify LDO driver initialization voltage compatibility
  Hawao: NFC Bringup(4) - driver
  hawaii OLED: visionox ft3519 touch drvier bringup
  kernel: qc3p wt6760 isp download function
  kernel:add ADC_GPIO3_DIV3 adc channel
  display/config: Add LDO driver config into the kernel.
  display: Load the regulator driver directly into the kernel.
  kernel: use orderly_poweroff when usb plugged out
  tty:diag:Move tty_flip_buffer_push out of spinlock
  Revert "tty:revert the tty update from qcom for moto tty_diag driver"
  kernel:dwc3 delay extcon module registeration
  ANDROID: xt_quota2: set usersize in xt_match registration object
  ANDROID: xt_quota2: clear quota2_log message before sending
  ANDROID: xt_quota2: remove trailing junk which might have a digit in it
  arm/defconfig: add hawao extra config
  usb:diag:revert the f_diag update from qcom for moto tty_diag driver
  tty:revert the tty update from qcom for moto tty_diag driver
  Enable samsung NFC driver
  integrate samsung RN4V NFC driver
  Rhode4G: wide camera bring up
  kernel: add charger gki
  kernel: change spi gpio for i2c gpio for charger
  Remove gpio3 from reserve list for rhode4g
  arm/defconfig: add rhode extra config
  [PATCH] f2fs: flush data when enabling checkpoint back
  [PATCH] f2fs: flush data when enabling checkpoint back
  Revert "(CR) guamp: emmc add ffu"
  Removing debug config
  [PATCH] qseecom: Call INIT_WORK() before flush_work()
  guamp: emmc add ffu
  Caprip: modify the actuator noise reduction work flow.
  Caprip: modify the actuator noise reduction work flow.
  APP data lost after first R upgrade
  Porting of (CR) replace WARN with pr_debug for IPA api
  (CR) Make NCM driver compatible with windows
  disable CONFIG_SLUB_DEBUG for user builds
  disable CONFIG_DEBUG_PANIC_ON_OOM in userdebug builds
  Include inlinecrypt at config.gz to fix Q->R upgrade
  usb: add xhci-hw-lpm-disable dt property support
  kernel:ram overwritten by TZ logs to cause random panics
  Caprip: Add start/stop vibrating notification to actuator.
  arm64: defconfig: Actuator noise reduction.
  kernel: driver/vibrator: diff vol for long/short vib
  skip ipa assert for debug build (patch 2)
  skip ipa assert for debug build
  limit ion cache size
  Revert "(CR) power: Add wakeup source in battery historian logGing"
  power: print active wakeup source before suspend.
  alarmtimer: add debug to identify alarmtimers
  charger:driver:fix non power off issue for factory kill.
  arm64/defconfig: Capri: open nfc driver for Capri
  arm64/defconfig: disable debug fs on user build
  charger:support typec high 2A current at non-turbo product
  arm/defconfig: enable CONFIG_DEBUG_LIST on R
  soc: qcom: service-locator: enlarge timeout value
  arm/defconfig: Caprip: init kernel deconfig
  arm/defconfig: Capri: init kernel deconfig
  Revert "Revert "msm: media: uapi: Redefine NV12 format with different alignment""
  Revert "msm: media: uapi: Redefine NV12 format with different alignment"
  clear SDAM for new battery profile loading.
  disable DEBUG_PANIC_ON_OOM on 3G ram device
  driver:qg:enale QG_DEBUG_SOC.
  Charge: fix slab out of bounds risk
  charge: qc2.0 adapter charge slow
  charge: Handle QC2.0 charger vbus rise 12V
  BCL: Enable charge bcl feature
  arm: setup: support mem= memory limit
  arm: call idle notifiers in CPU idle
  charger:improve micro-b input current to 1.9A per HW
  Capri bring up
  kernel:distinguish type-c and microb cdp input setting
  disable SPLIT_RSS_COUNTING to fix zero RSS issue
  charger:add battery test mode support for cebu.
  spi: disable_depth > 0 when pm runtime get sync
  driver/spi: spi driver suspend changes
  kernel: panel_notifier: Add new panel notify event type
  mmc:host:sdhci:Fix host->claimer NULL pointer problem
  Change ION fill mark from 100M to 16M to reduce the Lost RAM
  arm/defconfig: cebu: init kernel deconfig
  NFC VEN pin startup and shutdown sequence
  disable watermark boost
  charge:Config DCP 2A charge current
  tune memory configs
  charger:limit typec high to medium when hvdcp disabled
  charger:support 2A dcp charger
  arm64/defconfig: enable external usb camera
  power: reset: Use warm reset for dload mode
  Update kernel config of userdebug on Guam/GuamP to improve performance
  charger:duplicated apsd detection at pmi632
  expose ssr_reason to ss_ramdump
  SD: print SD interrupt log
  charger:SW_ICL do not used at moto
  charger:factory image charGing soc over 75%
  usb audio: Let the usb sound card index from 1
  kernel:USB DRP connect debug accessory test
  charge: config: config batt NTC for bornr NA
  Kernel: add sys node for panel supplier
  gpu/drm: Create panelRegDA sysfs to expose panel's reg
  pwrkey: change printk level to output to console
  Reboot: trigger warm reset when receive hw_warmreset cmd
  disable CONFIG_DEBUG_CONSOLE_UNHASHED_POINTERS for sts test
  Revert (CR): power: smb5: Clear HDC AICL
  arm/defconfig: borneo:  init kernel deconfig
  guam serials: remove kernel config for PASR
  Revert "mm, vmstat: hide /proc/pagetypeinfo from normal users"
  arm/defconfig: guam: init kernel deconfig
  arm/defconfig: add 32bit debug config
  defconfig.mk: add arch specific debug
  enable psi for guam guamp
  Revert "defconfig: disable MEMCG for bengal 32"
  Fix QC rebase issue for dual role sysfs access issue
  ion: display ion total size in debufs node
  ion: dmabuf improve debugfs
  kernel:support huawei p10 5A cable
  bengal:Enable dual role usb interface
  smb5:Add dual role class support in smb5
  usb:Add dual role class support
  sdcardfs: don't depend on reserved_mb to check free space
  sdcardfs: check the free space before creating files
  sdcardfs: copy inode size while getting attributes
  remove nfc function for guam
  charger:allow APSD re-run at factory usb detection
  CONFIG_FPR_FPC disable for rebase fingerprint fix
  defconfig.mk: Don't force make defconfig
  gitignore: ignore dts link
  guamp: arm64/dtsi enable regulator_fixed_voltage
  power: Add wakeup source in battery historian logGing
  arm64/defconfig: enable softlockup panic for debug
  arm64/defconfig : enable NFC
  kernel:add OCP charger current limitation
  guam: add touch module support
  Revert "(CR): config: disable CONFIG_PANIC_ON_REFCOUNT_ERROR"
  arm64/defconfig: disable debug config
  config: disable CONFIG_PANIC_ON_REFCOUNT_ERROR
  arm64/configs: sm4250: Enable USB console
  tty: msm_geni_serial: Support the match() callback
  printk: Keep boot console on if enabled
  arm64/config: support UAS of usb storage
  arm64/defconfig: enable usbnet drivers
  usb:configfs:Set udc_name NULL if attach failed
  usb/dwc3: msm: Enable all Debug Logs
  gadget: bcdUSB version back to 2.0 when not SuperSpeed
  usb: configfs: synchronize the secure and udc_name state
  usb: configfs: skip unregister gadget in secure
  usb: gadget: f_mtp: Return error if count is negative
  usb: gadget: storage: Support READ_TOC for MacOS
  usb: configfs: Implement secure attribute
  usb: configfs: Reset the use_os_desc flag
  usb: mass_storage: Add support for SC_REBOOT
  usb: f_mtp: Handle OS descriptors only when bound
  config:remove unused smb1355 config
  guam: input add touch class support
  arm64/config: enable DIAG_OVER_TTY
  drivers: tty: add tty diag module
  char: diag: add write done sync function
  panel_notify: add api for touch state
  guam: defconfig: enable panel notifications
  video: Add panel_notifier framework
  drm: mipi: disable Elvss dim of HBM for MIPI DSI
  Add new macro MIPI_DSI_MSG_READ
  gpu/drm: Create sysfs to expose panel vendor infor
  drm: mipi: Disable the MIPI DSI commands 0x2E and 0x3E
  drm/dsi: Implement DCS set disp brightness 2bytes
  guam: input add drm support
  defconfig: bengal: enable pstore
  power: Add function to show active wakelocks
  power: suspend: Save snapshot of gpio, vreg when suspend
  PM/Suspend: Print wall time at suspend entry and exit
  - Do not unload prov TZ app.
  add system restart warm and panic mode
  printk: increase log buffer size to 2k
  qpnp-power-on: Print system timestamp on Power key event
  regulator: core: Add sysfs node for debug
  pinctrl: msm: Add sysfs node for debug
  watchdog_v2: export watchdog trigger
  pinctrl: pinctrl-msm: do not dump unallocated GPIOs
  of: conditional status property
  arm64/dt add kpanic modules
  kernel:moto charger/battery driver enable
  config:battery 10k ntc enable
  guamp: input add touch support
  input add touch support
  kernel:JK50 NTC 10K report wrong temp
  arm/defconfig: update debug option
  defconfig: enable CONFIG_MEMCG config
  defconfig: bengal: Add moto defconfigs
  msm-poweroff: Store restart reason
  power: pmic-voter: Export Interfaces
  Do not build moto config while building MSI
  kernel/config: Add Moto ext_config feature
  soc: qcom: kconfig opt to build moto dtbs
  msm: kgsl: Zap performance counters across context switches
  msm: kgsl: Add a sysfs node to control performance counter reads
  soc: qcom: socinfo: Add soc information for KhajeP and KhajeQ
  spi: spi-msm-geni: Put device to suspend if PM status is active
  cnss2: Handle event processing after shutdown
  cfg80211: Add support to advertize OCV support
  i2c: i2c-msm-v2: Set frequency parameters to INT and validate
  drivers: thermal: validate cdev sysfs state request before using it
  USB: f_fs: Fix disconnect check during ongoing IO
  msm: diag: fix copyright
  diag: Validate the dci client before sending dci packet
  drivers: soc: qcom: Initialize blocking notifier as per lockdep
  usb: gadget: u_audio: fix race condition on endpoint stop
  usb: gadget: u_audio: Free requests only after callback
  defconfig: Enable usb peripheral audio on SXR2130
  msm: ADSPRPC: Fix to avoid Use after free in fastrpc_init_process
  clk: qcom: vdd-level: Update the vdd level for CX on Khaje
  msm: ipa3: Fix to validate the NAT table entries during NAT table init
  msm: synx: fix copyright
  clk: qcom: gpucc: Update the vdd level for CX on Khaje
  diag: Ensure dci entry is valid before sending the packet
  usb: pd: Process request message as soon as it is received
  mmc: sdhci-msm: Update the MGPI SW check to avoid irq timeout
  msm: kgsl: Perform cache flush on the pages obtained using get_user_pages()
  dfc: reset tx queue
  clk: qcom: gpucc: Add support for higher frequency for Khaje
  msm: ipa3: fix to cleanup the dma allocation
  clk: qcom: vdd-level: Update the VDD levels for Bengal/Khaje
  include: qcom,rpm-smd-regulator.h: Add SUPER_TURBO corner
  usb: gadget: qdss: Don't clear debug_inface_enabled upon unbind
  msm: adsprpc: Handle UAF in fastrpc debugfs read
  usb: gadget: f_hid: Fix unbind issues
  usb: gadget: f_uvc: Fix unbind issues
  msm: synx: remove synx handle details from logging
  clocksource/drivers/arm_arch_timer: Correct fault programming of CNTKCTL_EL1.EVNTI
  mmc: sdhci-msm: Ensure SD card power isn't ON when card removed
  msm: kgsl: Fix gpuaddr_in_range() to check upper bound
  clk: qcom: clk-alpha-pll: Update the steps to slew the Lucid PLL
  spi: spi-msm-geni: Protect from register access in suspend state
  spi: spi-msm-geni: Keep device to suspend if PM call fails
  regulator: qcom_pm8008-regulator: Avoid deadlock in OCP handling
  usb: gadget: f_uac1: Add support for UAC1 function
  tzlog: update struct to get normal and fatal diag logs
  firmware: qcom: Remove garbage characters from qsee log
  firmware: qcom: add enlarged qsee log support
  firmware: qcom: encrypted tz and qsee log support
  input: misc: qcom-power-on: Add support to log KPDPWR status
  tzlog: update struct to get normal and fatal diag logs
  firmware: qcom: Remove garbage characters from qsee log
  firmware: qcom: add enlarged qsee log support
  firmware: qcom: encrypted tz and qsee log support
  fs: crypto: Maintain reference count for class keys
  usb: pd: always log when state machine work is queued
  leds: qti-tri-led: remove LED_KEEP_TRIGGER flag
  usb: pd: add usbpd_dbg() in pd_send_msg()
  diag: Update log and event mask code ranges
  usb: gadget: Clear string index for RMNET
  drivers: usb: enable SET_REPORT through EP0 feature
  clk: qcom: debugcc: Remove gcc_pcnoc_mpu_cfg_ahb_clk for QM215
  clk: qcom: debugcc: Remove im_sleep/xo_div4 for QM215
  af_unix: fix garbage collect vs MSG_PEEK
  net: split out functions related to registering inflight socket files
  uapi: sound: add bt external sink delay parameter
  mhi: core: Increase RDDM timeout to 350ms
  msm: npu: remove asynchronous network execution support
  usb: max-3421: Prevent corruption of freed memory
  mmc: host: Add recovery_finish crypto vops
  seq_file: disallow extremely large seq buffer allocations
  dfc: hold wakelock while powersave timer is running
  diag: Avoid possible out of bound access while sending masks
  diag: Sanitize non-hdlc pkt length against buffer capacity
  diag: Allow DCI packets to be copied separately
  msm: gsi: Stop Channel support when in Flow Control State
  msm: kgsl: Signal fence only if last fence refcount was not put
  media: v4l2: Allow ioctl type of "U" for video devices like usb camera
  msm: adsprpc: Handle UAF in process shell memory
  cnss2: Check if firmware asserts before power off for CBC
  usb: gadget: cdev: Add single packet and dynamic buffer support for Rx path
  net: qrtr: Use radix_tree_iter_delete to delete tx flow
  ipa: Null persistent pointers after free
  net: qrtr: Cleanup flow control during DEL proc
  qdss_bridge: handle usb write done event
  net: qrtr: Cleanup flow control during remote socket release
  leds: qpnp-flash-v2: Add support for dynamic torch current update
  thermal: Update copyright info for ADC_TM driver
  net: qrtr: Converting DEL_PROC command to BYE command
  defconfig: Enable SPMI TEMP ALARM driver for SPF targets
  msm: ipa3: Fix to NULL terminate the header pointer in proc header table
  usb: dwc3: Prevent deadlock when wakeup happens through pwr event irq
  thermal: Read raw values for ADC_TM calibration channels
  qdss_bridge: fix stuck issue when driver remove
  media: uvcvideo: Use cached memory for USB transfers
  defconfig: Enable Novatek NT36xxx Touch for tron target
  cnss2: Dump PCIE SOC scratch registers along with mhi reg dumps
  ANDROID: mm: use raw seqcount variants in vm_write_*
  msm: kgsl: Update the IFPC power up reglist
  msm: ipa3: Add wait queue for the adpl
  msm: ipa3: Fix to unlock mutex before return
  cnss2: Update bound checks for sbl reg dumps to SRAM mem range
  cnss2: Fix the pbl log sram start address for QCA6490
  defconfig: arm: msm: 8937-Turn on coresight configs
  arm: msm: Add support for coresight etr for 32 bit
  soc: qcom: memory_dump: Support ETB/ETR register dump
  defconfig: arm64: msm: 8937-Turn on coresight configs
  drivers: thermal: Update a variable type in QMI encode logic
  BACKPORT: dma-buf: Move dma_buf_release() from fops to dentry_ops
  power: smb1398-charger: Toggle UVLO for Slave CP on USB removal
  msm: npu: handle system shutdown/reboot event properly
  dma-mapping-fast: Fix iova address leak with non-zero scatterlist offset
  net: qrtr: Change error logging in callback
  defconfig: Enable PMIC related configs for MSM8937_32
  defconfig: Enable PMIC related configs for MSM8937_64
  defconfig: Enable Charger/LED/RTC configs for MSM8937_32go
  power: linear-charger: Report the correct battery status at SOC=0
  power: charger/fg: Add charger/fg/bms drivers for QM215
  defconfig: Enable ADC thermal and SPMI configs for SPF targets
  thermal: Modify qpnp_adc_tm driver for IIO framework
  thermal: qpnp-adc: Add snapshot of qpnp-adc-tm driver
  msm: ipa3: Queue nop desc again if it fails
  diag: Drop packets to avoid memory exhaustion
  msm-ipa: fix use-after-free of rt_tbl
  net: qualcomm: rmnet: enable support for cksumv3
  serial: msm_geni_serial: Avoid port pointer access for earlyconsole case
  rpmsg: glink: Change error logging to avoid throttling
  USB: gadget: f_uvc: Enable more controls for CT and PU
  serial: msm_geni_serial: Reduce stale delay added in stop_rx_sequencer
  msm: kgsl: Add timeline traces
  msm: kgsl: Add software timelines
  serial: msm_geni_serial: Reduce stale delay added in stop_rx_sequencer
  usb: f_mtp: Limit MTP Tx req length to 16k for ChipIdea
  fuse: give wakeup hints to the scheduler
  wait: add wake_up_sync()
  msm: ipa: Fix to free up all pending EOB pages
  msm: kgsl: Add the user API definition for timelines
  Add support for new HSP version
  usb: dwc3: dwc3-msm: optimize perf vote work
  i2c: i2c-qcom-geni: Change the high and low time for SCL
  net: qrtr: fix a kernel-infoleak in qrtr_recvmsg()
  tty: Fix ->session locking
  msm: ipa3: increasing the uC interrupt timeout value
  msm: kgsl: Fix out of bound write in adreno_profile_submit_time
  diag: Update log and event mask code ranges
  soc: qcom: Set QOS only to silver cluster
  dwc3-msm: Move override usb speed functionality outside edev check
  cnss2: Update board data file name for certain RF chip ID
  platform: qpnp-revid: Add REVID support for PM8010
  regulator: qcom_pm8008-regulator: add support for PMIC PM8010
  regulator: qcom_pm8008: allow multiple PM8008 instances with unique names
  block: pm: Fix possible unbalanced nr_pending
  usb: f_mtp: Don't handle OS descriptors from MTP driver
  power: supply: qpnp-smb5: specify different ICL for QC2 9V/12V level
  phy: msm: usb: Check VBUS state before accessing registers in suspend
  phy: msm: usb: Fail suspend if psy_type is USB or USB_CDP
  USB: phy: msm: Apply DP pulse for CDP during bootup from sm_work
  msm: adsprpc: Allocate buffer taking NULL byte into consideration
  clk: qcom: debugcc: Remove the gcc_camss_camnoc clocks
  fbdev: msm: Avoid runtime sus/res for DP/HDMI
  uapi: Add UAPI headers for slatecom_interface driver
  soc: qcom: smsm: Add wakeup capable flags to SMSM IRQ
  f2fs: don't sleep while grabing nat_tree_lock
  Ignore -106 error while opening channel
  byte-cntr: Don't write csr register when byte-cntr is disabled
  arm64: defconfig: Set qrtr wakeup for lito
  net: qrtr: Make wakeup timeout configurable
  mhi: core: Avoid race condition mhi channel prepare and M0 event
  msm: synx: acquire ref of synx handle in each function
  msm: ipa3: Fix to handle zero length frag skb packet
  cnss_utils: Update the copyright years of file to 2017, 2019-2021
  FM: mutex changes modified
  Revert "qseecom: Add shmbrdige to allocate memory"
  Revert "ANDROID: net: ipv4: sysfs_net_ipv4: Add sysfs-based knobs for controlling TCP window size"
  Revert "RFC: ANDROID: net: ipv4: sysfs_net_ipv4: Fix TCP window size controlling knobs"
  ANDROID: xt_qtaguid: fix UAF race
  coresight: byte-cntr: Add ETR status check in bypass notifier
  clk: qcom: debugcc: Remove the gcc_camss_camnoc clocks
  usb: f_fs: Avoid invalid pointer access in ffs_fs_get_tree
  serial: msm_geni_serial: Enable SW flow on in runtime suspend
  defconfig: msm: Enable RPM SMD cooling device driver for KHAJE
  defconfig: Enable CONFIG_ION_SYSTEM_HEAP for bengal
  f2fs: fix the periodic wakeups of discard thread
  f2fs: allow to change discard policy based on cached discard cmds
  coresight: byte-cnter: limit error log output
  coresight: byte-cnter: Add ETR status check in bypass notifier
  msm: synx: fix synx_release_core race condition
  irqchip: mpm: Add mpm mapping for Khaje
  f2fs: change to use rwsem for cp_mutex
  cnss2: Assert on FW memory allocation failure
  msm: kgsl: Keep the context alive until its fences signal
  soc: qcom: secure_buffer: Fix the parameter passing to dmac_flush_range
  cnss_utils: Increase unsafe channel max num for 6G
  clk: qcom: gpucc: Update voltage fmax table for GPU clock for KHAJE
  msm: ipa3: Enable hardbyte limit for WAN consumer pipe
  dma-mapping-fast: Fix sg-list length calculation in fast_smmu_unmap_sg()
  qseecom: Add shmbrdige to allocate memory
  msm: kgsl: Use worker to put refcount on mem entry
  usb: phy: qusb: Add wrapper function for phy reset
  usb: pd: Clear vdm_tx if SVDM message is sent on SOP'
  drivers: thermal: virtual-sensor: Add new virtual sensor for MSM8917
  defconfig: Enable CONFIG_ION_SYSTEM_HEAP for bengal
  futex: Handle faults correctly for PI futexes
  f2fs: fix the periodic wakeups of discard thread
  f2fs: allow to change discard policy based on cached discard cmds
  futex: Simplify fixup_pi_state_owner()
  futex: Provide and use pi_state_update_owner()
  usb: phy: Reset PHY while disabling dpdm regulator
  futex: Replace pointless printk in fixup_owner()
  soc: qcom: smem: Update size of legacy partition
  USB: diag: Add check for ctxt in usb_diag_request_size()
  driver: Fix compilation error with new sdclang 12
  msm: ipa3: Changes to check disconnect in progress while sending data
  msm: adsprpc: Protect maps using map mutex
  USB: f_diag: Report Max request size as 16k for ChipIdea
  defconfig: Enable thermal emergency poweroff delay
  mmc: sdhci-msm: Switch to required pad voltage for vbias bypass
  mmc: sdhci-msm: Add vbias bypass specific hw WA flag
  Revert "mmc: sdhci-msm: Add support to vote for vdd io parent regulator"
  defconfig: kona: Add CONFIG_AQFWD for RB5 board
  clk: qcom: gpucc-khaje: Remove NOM_L1 fmax corner
  mmc: sdhci: Avoid dumping registers when SD card removed
  FM: Fix for no sound issue in FM Audio
  usb: gadget: Do not disconnect unregistered dev
  HID: add HID_QUIRK_INCREMENT_USAGE_ON_DUPLICATE for Gamevice devices
  defconfig: kona: Make configs required to pass CTS tests mandatory
  UPSTREAM: HID: playstation: Add DualSense player LED support
  UPSTREAM: HID: playstation: Add microphone mute support for DualSense
  UPSTREAM: HID: playstation: Add initial DualSense lightbar support
  UPSTREAM: HID: playstation: Fix unused variable in ps_battery_get_property
  UPSTREAM: HID: playstation: Fix array size comparison (off-by-one)
  BACKPORT: HID: playstation: Report DualSense hardware and firmware version
  UPSTREAM: HID: playstation: Add DualSense accelerometer and gyroscope
  BACKPORT: HID: playstation: Add DualSense classic rumble support
  msm: adsprpc: Lock list before removing node
  msm: pcie: Add ASM2806 PCIe device and vendor id
  TREAM: HID: playstation: Track devices in list
  UPSTREAM: HID: playstation: Add DualSense touchpad support
  UPSTREAM: HID: playstation: Add DualSense battery support
  UPSTREAM: HID: playstation: Add DualSense Bluetooth support
  UPSTREAM: HID: playstation: Use DualSense MAC address as unique identifier
  defconfig: arm64: msm: Enable CTI_SAVE_DISABLE for SDM660
  UPSTREAM: HID: playstation: Initial DualSense USB support
  defconfig: Enable smb1394 driver for khaje
  coresight-tmc-etr: remove mem_lock when call usb_qdss_close
  soc: qcom: socinfo: Add support for kona iot soc-id
  defconfig: sdm660: Add defconfig changes for camera
  usb: f_qdss: Flush connect_work in qdss close
  clk: qcom: gpucc: Update the post div ops for GPUCC PLL for KHAJE
  clk: qcom: clk-alpha-pll: Update implementation for Zonda PLL
  coresight: tmc: fix spinlock bad magic/usb_qdss_close
  scsi: ufs-qcom: fix the issue of get wrong ufs clk status from sysfs node
  futex: Ensure the correct return value from futex_lock_pi()
  defconfig: arm: msm: Enable debugcc config for SDM439
  dt-bindings: Add gpr header required for AR on kona
  clk: qcom: gpucc: Update the post div ops for GPUCC PLL for KHAJE
  clk: qcom: clk-alpha-pll: Update implementation for Zonda PLL
  drivers: thermal: Add support for RPM SMD cooling device
  diag: Avoid reallocating if buffer supports hdlc max pkt size
  mhi: core: Fix find_last_bit() usage
  diag: Update log and event mask code ranges
  drivers: rpmh: Always bug_on() upon timeout in rpmh_write_batch()
  clk: qcom: mdss: Fix flicker issue at early boot of kernel
  drivers: can: mcp25xxfd: Remove return 0 for void function
  Revert "kbuild: force to build vmlinux if CONFIG_MODVERSION=y"
  msm: ipa3: Enabling the HOLB on USB consumer pipe for APQ target
  soc: qcom: dcc: Avoid dcc_sram_writel overflow
  qxr-stdalonevwr: changes for oracle mic bias
  soc: qcom: dcc: Avoid huge memory allcation
  defconfig: msm8937_64: Update the defconfigs
  soc: qcom: dcc: Use sscanf instead of strlcpy
  power: qpnp-qg: Fix a DT property name
  mmc: host: OTA upgrade scenario support for multi fs combination
  drivers: cpuidle: lpm-levels: Correct missing list initialize
  serial: msm_geni_serial: Reset UART error code to default during shutdown
  serial: msm_geni_serial: Add Workqueue to dump the registers
  cnss2: Add code to do PCIe L2 suspend during shutdown
  pinctrl: Update reserved gpio list for Khaje
  config: enable dcc driver
  soc: qcom: dcc: Add snapshot of qcom-dcc driver
  serial: msm_geni_serial: Bailout from suspend if RX data is pending
  diag: Update log and event mask code ranges
  usb: f_fs: Free descriptors in func_unbind
  clk: qcom: alpha-pll: Update Alpha PLL width for Zonda PLL
  usb: gadget: f_rndis: Add 'wceis' flag to indicate 'Wireless' RNDIS
  clk: qcom: khaje: Update clock changes for GCC/GPUCC/DISPCC
  clk: qcom: cpu: Add support to L2 PC latency for SDM429/39
  clk: qcom: cpu-sdm: Add cpu clock driver for SDM439
  dt-bindings: clock: Add support for CPUCC clock ids for SDM439
  clk: qcom: Add LPM Latency support for CPU clocks
  clk: qcom: clk-pll: Add support for SPM event in PLL
  serial: msm_geni_serial: Reduce wait for transfer delay
  usb: f_fs: Avoid use-after-free of ffs_data
  include: uapi: Add support for 128x32 alignment of NV12
  defconfig: Enable refgen regulator driver for khaje
  clk: qcom: rcg2: Force enable the RCG before update for GFX
  mhi: core: Notify all mhi client's for PCIe link down recovery
  power: smblite: Fix max_limit_ma for smblite
  msm: ipa3: Fix to prevent Integer Overflow
  dcc_v2: Control the cti trigger of each link list individually
  msm: kgsl: Fix memory leak for anonymous buffers
  defconfig: Enable remaining defconfigs
  clk: qcom: debugcc: Add cpucc debugcc support for SDM439
  clk: qcom: gcc: Correct the frequencies in freq_tbl for SDM439
  clk: qcom: gcc: Add GPLL6 fixed factor support for qm215
  cnss2: Add code to notify mhi about link down
  defconfig: disable per-cgroup pressure tracking
  defconfig: arm64: msm: Enable MSM_DEBUG_LAR_UNLOCK for msm8937
  defconfig: arm: msm: Enable MSM_DEBUG_LAR_UNLOCK for msm8937
  soc: mem_dump: Enable MSM_DEBUG_LAR_UNLOCK for MSM8937
  defconfig: sdm660: Add missing coresight configs
  From bbfaa7d36c1eb465f120f2a3dfe25c1fe022195d Mon Sep 17 00:00:00 2001 From: KaiChieh Chuang <kaichieh.chuang@mediatek.com> Date: Thu, 7 Mar 2019 07:51:09 +0800 Subject: [PATCH] ASoC: dpcm: prevent snd_soc_dpcm use after free
  soc: qcom: Return correct error code when program_key fails fails
  msm: ADSPRPC: Fix deadlock during SSR
  soc: qcom: bam_dmux: Skip disconnect call on bootup
  usb: dwc3: Use pwr_evt_irq to wakeup if dp/dm directly connected to GIC
  BACKPORT: cgroup: make per-cgroup pressure stall tracking configurable
  usb: dwc3-msm: Enable pwr_evt_irq for wakeup after LPM is done
  power: qpnp-qg: Add support to clear soh upon first profile load
  msm: kgsl: Make sure gpu-speed-bin-vectors has the correct size
  msm: kgsl: Add multiple fuses based speed bin
  Change the subprocess argument to fix the build issue
  include: uapi: Add QBG UAPI headers
  defconfig: Enable AW2016 LED driver for khaje
  clk: qcom: gcc: Add halt check for MSS clocks for SDM660
  msm: adsprpc: Handle UAF in process shell memory
  msm: camera: Add gpio based flash driver support
  leds: aw2016: update breath sysfs node name
  Use environment variable to find unifdef tool
  kernel_headers: Explicitly run headers_install under 'sh'
  dt-bindings: msm: Add bindings for flash type
  clk: qcom: mmcc: Change halt to halt_voted for SDM660
  msm: kgsl: Keep private intact until last refcount is put
  clk: qcom: khaje: Update freq_tbl and pll configurations
  defconfig: Enable power delivery on Khaje
  coresight-tmc-etr: Fix deadlock issue while switching mode
  defconfig: Enable memory cgroup config
  leds: add initial driver for AW2016 LED device
  pinctrl: Update PINCTRL macro definition for Khaje
  input: touchscreen: nt36xxx: Add Chip id and firmware
  ANDROID: Incremental fs: Set credentials before reading/writing
  pinctrl: Add wakeup GPIO register and bit information for khaje
  defconfig: khaje: Enable khaje pinctrl
  pinctrl: msm: add range of reserved gpio for Khaje
  defconfig: disable debug configs
  ANDROID: Incremental fs: fix up attempt to copy structures with READ/WRITE_ONCE
  mmc: cqhci: Handle cqhci crypto configurations correctly
  disp: uapi: drm: Add fsc format modifier
  Revert "clk: qcom: Add enable_safe_config for gfx3d_clk_src"
  mhi: core: Prevent doorbell with invalid tre
  msm: adsprpc: Remove bad ioctl log
  pinctrl: qcom: Add support for Khaje SoC pin control
  dt-bindings: msm: Add bindings for flash type
  msm: ipa: Fix array out of bound and use after NULL check
  msm: ipa: Fix to check only reset IPA stats can have data as NULL
  msm: ipa: Fix pointer checked for NULL may be used
  msm: kgsl: Remove sysfs entries after releasing memory
  msm: kgsl: Remove debugfs directory inside lock
  leds: led-class: Retain the latest user brightness request
  leds: led-class: add support for max_brightness store
  mmc: core: Add at least 3 mclk cycle delay before next command after ACMD41
  FM: Reduce high scan time
  soc: qcom: Add check to handle out of bound access
  defconfig: Enable CONFIG_MSM_TZ_LOG for 8937-perf
  HID: make arrays usage and value to be the same
  md: dm-default-key: Override dun value for selected bios
  defconfig: khaje: Add support for clock controllers
  clk: qcom: debugcc: Add support for Debugcc for KHAJE
  fbdev: msm: Avoid race condition while iommu mapping from DSI flow
  md: dm-default-key: Fix IV with set_dun flag defined
  cnss2: Log SW_CTRL GPIO value if PCIe link training fails
  diag: Update log and event mask code ranges
  camera: smmu: fix for incorrect populated sids
  msm: npu: Use spinlock for ipc write to avoid context switch
  msm: kgsl: Fix nr_removed calculation while reducing pools
  Avoid fatal error if ICE registers are not defined
  rpmsg: qcom_smd: Return error if receive callback is not present
  clk: qcom: dispcc: Add support for dispcc driver for KHAJE
  phy-msm-usb: Add mutex for protecting msm_otg_reset
  wil6210: Drop unicast sub frame if part of a multicast amsdu
  clk: qcom: gpucc: Add Graphics Clock controller for KHAJE
  clk: qcom: gcc-khaje: Add GCC support for KHAJE
  dt-bindings: clock: gcc-khaje: Add support for USB3 MUX and BCR
  msm: ipa3: Fix to change the tag process timeout value in cleanup
  usb: dt-bindings: Add USB QMP PHY registers definition for Khaje
  power: supply: smb1398-charger: disable WIN_OV deglitch for SMB1394
  serial: msm_geni_serial: Add ioctl for sending uart error codes to BT host
  defconfig: Enable SDM429 configs
  mmc: cmdq_hci: Notify sdhci for enhanced strobe
  mmc: sdhci-msm: Skip PWRSAVE_DLL setting for sdcc minor verion 0x4D
  clk: qcom: Add enable_safe_config for gfx3d_clk_src
  fbdev: msm: Increment commit count during null commit
  msm: mdss: clear fences in ESD panel dead scenario
  defconfig: Add HSUSB PHY configurations to Khaje
  defconfig: Enable SDM429 configs
  diag: Add debug logs while reading masks into userspace
  tty: serial: msm: Add suspend resume support
  defconfig: Enable config CONFIG_UTS_NS for msm8937_32
  f_uac2: increase number of requests to 32 for UAC2
  defconfig: Enable SDM429 configs
  USB: dwc3: gadget: Queue data for 16 micro frames ahead in future
  USB: uvc: Fix video quality issues for streaming video over USB
  USB: dwc3: gadget: Increase TX fifo size for isochronous endpoint
  power: smb1398: Add support for SMB1394
  clk: qcom: mdss: fix blank / un-blank issue for DSI 12nm pll
  msm: camera: Add reset logic for snps phy
  msm: ipa: Fix considering prefetch buf size when mapping
  usb_bam: Set default BAM type as DWC3 if not specified
  dt-bindings: clock: Add support for KHAJE clock ids
  msm: drm: uapi: add rounded corner uapi
  USB: gadget: f_uvc: Enable required controls for CT and PU
  vidc_3x: Change to avoid unloading firmware
  msm: camera: Update SDM439 csiphy driver
  ipa: Remove overwrite copy
  Add support for new comanche 1.3 soc ID
  wil6210: check integrity of received AMSDU packets
  wil6210: Drop plaintext frames on secure network
  wil6210: AP should not forward eapol packets
  netfilter: nf_conntrack_h323: lost .data_len definition for Q.931/ipv6
  vidc_3x: Use static table governor for bus voting
  usb: f_qdss: Avoid wait_for_completion if qdss_disable is called
  msm: ipa2: free the skb
  defconfig: Enable ARCH_KHAJE
  msm: Add initial support for Khaje in Kconfig platform
  soc: qcom: socinfo: Add soc information for khaje
  defconfig: Enable config CONFIG_DEBUG_FS for msm8937_64
  clk: qcom: clk-alpha-pll: Add support for FSM legacy mode
  sysfs: ufs-qcom: Add sysfs entries for flashpvl
  scsi: ufs-qcom: Add one vendor specific sysfs group
  msm: ipa3: Fix to copy num of rules from user space
  defconfig: remove CONFIG_SECURITY_PERF_EVENTS_RESTRICT
  msm: kgsl: Fix snapshot collection for ib1
  input: qti-haptics: ensure valid pointer when calling kfree
  msm: kgsl: Avoid flooding kernel log with invalid ioctl errors
  rpmsg: qcom_smd: Add check for remote state in send api
  msm: kgsl: Flush mem workqueue and retry if failed to find SVM region
  msm: camera: Update csiphy data rate
  icnss2: Add support for MHI state info
  soc: qcom: ssr: Enable the irqs before powering up subsystems
  icnss2: Add new ipc context to log smp2p related logs
  diag: Update log and msg mask code ranges
  ARM: defconfig: Enable config for msm8937_32go
  usb: gadget: f_cdev: Fix use after free of port in f_cdev
  defconfig: arm64: Enable CONFIG_HID_NINTENDO for QM215
  defconfig: arm: Enable CONFIG_HID_NINTENDO for QM215
  defconfig: Enable config for msm8937_32
  fbdev: msm: Handle rotator init failure correctly
  tty: Fix ->pgrp locking in tiocspgrp()
  max31760: add support for additional registers
  Revert "ANDROID: security,perf: Allow further restriction of perf_event_open"
  USB: composite: Increase the IN endpoint buffer allocation
  USB: f_fs: Avoid NULL pointer dereference during epfile_io()
  USB: gadget: f_fs: Allocate extra buffer for IN endpoint
  USB: f_serial/f_acm: Increase the IN endpoint buffer allocation
  USB: f_fs: Increase the IN endpoint buffer allocation
  leds: qpnp-flash-v2: Add support to control flash ramp time
  msm: vidc_3x: Correct the arguments type to align with format string
  msm: vidc_3x: correct the flags set for bus mode
  defconfig: msm8937_32: Disable BUILD_ARM64_APPENDED_DTB_IMAGE flag
  defconfig: msm8937_64: Disable BUILD_ARM64_APPENDED_DTB_IMAGE flag
  soc: qcom: pil: Reuse carveout region for mdt header
  clk: qcom: gcc: Change rate max values for SDM439
  defconfig: msm8937_32go: Disable BUILD_ARM64_APPENDED_DTB_IMAGE flag
  qseecom: Update correct parameters before sending to smcinvoke
  msm: ADSPRPC: Add extra checks for Unsigned request
  msm: camera: QM215 delay during power up sequence
  config: enable rmnet_data, msm_rmnet_bam driver
  msm: kgsl: Add A504 GPU support for SDM429
  defconfig: Enable MSM8937 and SDM439 config
  defconfig: Enable SDM439 config
  defconfig: Enable MSM8937 and SDM439 config
  defconfig: Enable default-key driver for msm8937_32
  defconfig: Enable default-key driver for msm8937_64
  defconfig: Add Radio_IRIS related config parameter
  defconfig: Add Radio_IRIS related config parameter
  cnss2: Add CNSS_BUS_EVENT to report bus info
  cnss2: Add update_uevent API to notify CNSS event
  rpmsg: qcom_smd: Ensure ordering of channel info updates
  defconfig: Enable WCNSS configs
  soc: qcom: bam_dmux: Abort open/close cmd during SSR
  diag: Use valid data_source for a valid token
  Add support for new HSP version
  mmc: sdio: Retune sdio after resume
  diag: Copy length and buffer locally to send to userspace client
  diag: Update log mask code ranges
  config: enable new rmnet_data driver
  regulator: qpnp-lcdb: Add n_voltages property for LCDB regulators
  spi: spi-geni-qcom: Set IOEB for MHI on SPI RX only case
  diag: Prevent out of bound write while sending dci pkt to remote
  drivers: rpmsg: fix to avoid dump stack in rpm-smd driver
  msm: kgsl: Enable content protection for A505 GPU
  serial: msm_geni_serial: Bypass Flow control lines from termios
  defconfig: Enable config for msm8937_64
  iommu/arm-smmu: add option to enable halt/resume of SMMU
  config: enable new rmnet_data driver
  usb: gadget: Add snapshot of USB RMNET Function driver
  extcon: Initialize blocking notifier while registering
  clk: qcom: gcc: Add GCC driver node support for SDM429
  icnss: Avoid qmi register/unregister in case of qmi failure
  icnss2: Avoid qmi register/unregister in case of qmi failure
  tcp: adjust rto_base in retransmits_timed_out()
  tcp: retry more conservatively on local congestion
  tcp: create a helper to model exponential backoff
  tcp: always set retrans_stamp on recovery
  tcp: address problems caused by EDT misshaps
  cnss2: Add sysfs support for configuring qtimer sync interval
  iommu/arm-smmu: Allocate non-coherent memory for secure pagetables
  defconfig: msm: Enable dm-snapshot for msm8937_32go
  defconfig: msm: Enable dm-snapshot for msm8937_32
  defconfig: msm: Enable dm-snapshot for msm8937_64
  clk: qcom: clk-pll: Round off req_rate in determine rate
  include: uapi: Add charger specific headers for QM215
  clk: qcom: smd-rpm: Add RPM-SMD clock support for SDM429
  defconfig: Enable USB BAM and SMD configs
  mhi: dev: netdev: Set the mac header to 0 for skbs
  msm: adsprpc: overflow vulnerability by race condition in adsprpc driver
  defconfig: Enable USB BAM and SMD configs
  defconfig: Enable default-key driver for msm8937_32go
  signal: Avoid corrupting si_pid and si_uid in do_notify_parent
  defconfig: Enable MDSS PLL for msm8937
  defconfig: Initial defconfig files for MSM8937_64
  ice: add return value for functions where ICE is disabled
  cnss2: Check for BT Enable GPIO in QCA6390
  soc: qcom: Enable  MSM_TZ_SMMU msm8937
  usb: gadget: Setup DMA ops for OTG's gadget devices
  fbdev: msm: Enable mdss rotator driver
  defconfig: Enable MDSS PLL config for msm8937_32
  defconfig: Add Radio_IRIS related config parameter
  cnss2: Use unified API to get RDDM and recovery timeouts
  cnss2: Add new API to get QMI related timeouts
  cnss2: Add support to populate device memory information
  iommu: Update function for ARM_MSM_SECURE io pagetable type
  Don't use gpio_free() for output gpios
  clk: qcom: gcc: Add gcc-mdss driver node support for QM215
  RPMSG driver changes for FM in msm-4.19
  defconfig: Enable USB BAM configs
  defconfig: Initial defconfig files for MSM8937_32
  cnss2: Add CNSS wrapper function for msm_pcie_reg_dump()
  clk: qcom: gcc: Add GPLL3 derived frequencies for qm215
  iio: spmi-vadc: Add option to specify scale-fn-type in devicetree
  iio: adc: spmi-vadc: Add adc support for SPF targets
  cfg80211: Adjust 6 GHz frequency to channel conversion
  iommu: Do not set COHERENT flag for secure pagetable allocation
  soc: qcom: smp2p: Add proper retrigger detection
  drivers: soc: qcom: Fix compilation errors
  clk: qcom: mdss: Update VCO Clk enums for mdss-dsi-28lpm
  dt-bindings: clock: Add mdss-28nm-pll-clk for legacy targets
  drivers: soc: qcom: Add bam dmux smem state handling
  net: ethernet: Add snapshot of RMNET BAM driver
  scsi: ufs: Fix IOCTL error checking for input buffer
  clk: qcom: mdss: fix blank / unblank for DSI 28nm pll
  soc: qcom: Add support for MSM_TZ_SMMU
  iommu/arm-smmu: Do not write to slave side protected context banks
  net/sched: fix race between deactivation and dequeue for NOLOCK qdisc
  uio: msm_sharedmem: By pass failure for hyp_assign_phys
  defconfig: enable PSI config for MSM8937_32go
  spmi: spmi-pmic-arb-debug: replace ioremap_resource with ioremap
  qcom-geni-se: Avoid dumping of GENI registers in console
  dm verity: skip verity work on I/O errors when system is shutting down
  Return Immediately if failed to set to reset gpio state
  msm: adsprpc: Clean DMA handles maps in case of  error
  diag: Prevent possible out of bound copy to userspace
  ARM: decompressor: avoid speculative prefetch from protected regions
  power: smb5-lib: Fix race conditions for typec power role
  msm: mdss: update the DSI 12nm PHY programming sequence
  msm: mdss: update the power down sequence for DSI 12nm PHY
  msm: ice: Fix stack-out-of-bound erros on kasan builds
  clk: qcom: debugcc: Add cpucc debugcc support for QM215
  msm: ipa: Fix use-after-free in ipa3_alloc_counter_id
  msm: ipa: correct the pointer in idr for FnR stats counter
  fbdev: msm: update event callback function to perform ESD check
  ANDROID: xt_qtaguid: Remove tag_entry from process list on untag
  clk: qcom: mdss: update dsi 12nm clock driver
  msm: ipa: fix race condition on PM vote on sys pipes
  msm: ipa3: Fix to null pointer access
  radio: iris: Add snapshot of iris FM radio support
  defconfig: Add WCNSS related config parameter
  wcnss: Update pm wake api's for 4.19 kernel
  qtee_shmbridge: update copyright
  diag: Update event and log mask code ranges
  arm-smmu: add bitmap for secure context banks
  iommu/arm-smmu: override writel_relaxed in smmu global address space
  qseecom: Add flush_work based on flag
  icnss2: Add handler for SMMU faults
  wcnss: Add wcnss snapshot to msm-4.19
  mm: cma: Print correct request pages
  defconfig: Add clock controller support for QM215
  clk: qcom: cpu-sdm: Add cpu clock driver for SDM
  dt-bindings: iio: Add scale function for QM215 batt therm
  platform: msm: Add USB BAM support to ChipIdea/RMNET
  leds: vibrator: Add snapshot of vibrator driver
  tty: serial: msm_geni_serial: Resolve race btw stop rx and cancel rx
  msm: kgsl: Access map_count only if entry is successfully allocated
  tty: serial: msm_geni_serial: Fix timeout for Rx abort
  defconfig: Enable chipidea USB controller configs
  msm: sde: Update rotator OT settings for sdm660
  msm: mdss: dsi: set backlight handle to NULL in error case
  clk: qcom: mdss: Add check to read the gdsc status
  msm: npu: Don't send interrupt if command has been consumed
  msm: ipa: Send actual DL flt rule length to Q6
  sde: rotator: use shared lock while accessing vbif
  clk: qcom: clk-pll: Add support for HF PLL Ops
  clk: qcom: Add enable/disable to clk_regmap_mux_div_ops
  clk: qcom: Update parent map to use parent_map struct
  qseecom: Update the error val check
  ARM: qcom: add board config support for sdm439 and sdm429
  ARM: qcom: Add board config support for msm8937
  Set the default slot for Full Disk Encryption key to 31
  msm: ipa: Enable wdi3 API in ipa3 config
  iio: ch101: Return -ENODEV when get expander GPIO failed
  USB: EHCI: Add MSM Host Controller driver
  usb: gadget: Add snapshot of ChipIdea driver
  usb: phy: Add snapshot of PHY msm usb driver
  qdss_bridge: fix kfree issue
  rpmsg: glink: do not break from interrupt handler
  msm: kgsl: Set correct values for SMMU protect register for A3xx
  clk: qcom: clk-debug: Add support to dump GDSC registers
  usb: dwc3: gadget: Prevent double free scenario for cancelled_list
  diag: Enable graceful transfer of transport
  diag: Enable diag over rpmsg communication for adsp
  drivers: char: Fix compilation error for smd pkt driver
  defconfig: msm: Enable smd pkt driver for QM215/SDM429/439
  clk: qcom: mdss: update mdss-dsi-28lpm clk names
  rtc: rtc-pm8xxx: add support for PM8916 RTC
  msm: mdss: Fix race condition while iommu mapping from DSI flow
  defconfig: enable MDSS PLL config for MSM8937_32go
  msm: ipa: fix potential race condition ioctls
  dt-bindings: clock: Add support for CPUCC clock ids for QM215
  Add support for new versions for BT chip
  smcinvoke: Update the correct parameters and result from qseecom
  misc: add qrc ioctl functions
  misc: add qrc_core and qrc_uart
  diag: Sanitize the mempools with pool data size check
  socinfo: Add socinfo support for sdm450
  socinfo: Add socinfo support for msm8953
  ARM: qcom: Add board config support for sdm450
  ARM: qcom: Add board config support for msm8953
  usb: dwc3: Enable parkmode for Gen1 controllers
  msm: camera: Fix for HFR120 crash while
  msm: gsi: Using kzalloc instead of devm_kzalloc
  clk: qcom: debugcc: Add debugcc support for QM215
  clk: qcom: gcc: Add support for GCC clock driver
  usb: f_diag: Replace ERROR with pr_err
  clk: qcom: mdss: add dsi phy 12nm clock
  dt-bindings: clock: Add 12nm clock device tree bindings
  rpmsg: qcom_smd: Add NO_SUSPEND flag for smd edge irq
  rpmsg: qcom_smd: Read data of size equal to fifo size
  rpmsg: qcom_smd: Read data of size greater than fifo size
  rpmsg: qcom_smd: Add ipc logging for smd driver
  msm: kgsl: Change start variable type to int in kgsl_iommu_add_global
  rpmsg: smd: Signal the TX channel that smd driver read data
  rpmsg: qcom_smd: Add GET/SET signal support
  rpmsg: qcom_smd: increase bounce buffer size
  drivers: rpmsg: Add smd driver module at post core init
  kona_defconfig: Enable hidraw config
  usb: misc: nb7vpq904m: update suspend and resume function
  msm: kgsl: Use pid struct to find the process to reclaim
  mm: process_reclaim: pass pid struct instead of tgid
  msm: kgsl: Change vma->vm_file to shmem file
  mm: process_reclaim: skip target_vma
  iio: qcom-rradc: Update logic to monitor health of RRADC peripheral
  cfg80211: export regulatory_hint_user() API
  msm: mdss: update MDSS DSI ULPS configuration
  fbdev: msm: call pxl clk unprepare during suspend
  msm: mdss: add support to handle LP_RX_TO/BTA_TO errors for DSI 12nm PHY
  msm: mdss: perform DSI PHY s/w reset for 12nm PHY during unblank
  msm: mdss: update the MDSS DSI ULPS exit sequence
  msm: mdss: add support to program of HSTX drivers for DSI 12nm PHY
  msm: mdss: update DSI ULPS entry/exit sequence
  msm: mdss: add support for DSI 12nm PHY in DSI driver
  net: qrtr: Excessive logging casuing boot failure
  defconfig: msm: enable thermal efuse driver for kona iot
  drivers: thermal: qcom: Add driver to modify thermal zone based on efuse
  mmc: core: Set cqe_enabled flag correctly
  serial: msm_geni_serial: Fix false warning for reset failure
  Kconfig: enable default config of cpu freq qcom for msm8953
  msm: Add initial support for sdm450 Kconfig platform
  msm: Add initial support for msm8953 Kconfig platform
  Revert "cnss2: Dump mhi debug regs on receiving mhi WAKE event cb"
  msm: pcie: Restore BME for RC after link_down recovery on SBR
  msm: ADSPRPC: Substitute vfs check with flags
  icnss: Allow register/unregister driver execution in serial manner
  drivers: char: reset signal support for smd channels
  drivers: char: add stream like read support
  crypto: Fix possible stack out-of-bound error
  drivers: irqchip: qcom: Add MSM8953 pin data for MPM
  defconfig: Enable EXT4 configs
  drivers: iio: enable compile for TDK sensor
  power: smb2: Enable read/writing of Type-C Rp value
  usb: gadget: f_mass_storage: Remove runtime async resume
  drivers: iio: add Makefile and Kconfig for TDK chirp sensor
  backlight: qcom-wled: Add "qcom,sync-dly" device tree property
  usb: dwc3: Issue ENDTRANSFER cmd on ep0 unconditionally
  coresight: disable the path when enable source link fail
  qcom: fg-memif: correct timeout condition for memory grant
  power: qpnp-fg-gen3: Add a property to reset FG BCL device
  power_supply: Add FG_RESET_CLOCK property
  qseecom: Check error when allocating coherent buffer
  defconfig: Enable CPR Regulator for msm8937go
  diag: Acquire spinlock for list delete operation
  rpm-smd: Remove redundant spinlocks which are not required
  regulator: qpnp-lcdb: Disable step voltage ramp for PM8150L V3
  power: smb5-lib: Query POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN
  defconfig: Enable Incremental FS support for msm8937_32go
  media/dvb: Deregister dma buffers fom shmbridge
  msm: kgsl: Show max gpu temperature
  USB: pd: Add support for enabling PD2.0 only as source
  usb: gadget: Clear transfer started flag if endxfer cmd times out
  backlight: qcom-spmi-wled: Change the SYNC toggle sequence
  USB: pd: Restart host mode in high speed if no usb3 & dp concurrency
  defconfig: Initial defconfig files for MSM8937_32go
  TDK-Robotics-RB5 drivers source code files
  diag: Update event and log mask code latest range
  clk: qcom: smd-rpm: Add RPM-SMD clock support for QM215
  fs: crypto: Add support for legacy pfk based FBE
  fastrpc : fastrpc porting for kernel 4.19 SPF targets
  qdss_bridge: fix memory leak issue
  bindings: clock: qcom: Add support for clock IDs for QM215
  drivers: char: msm_smd_pkt: Return error in case driver is not ready
  kernel: driver: Added support msm_smd_pkt driver
  dt-bindings: clock: Add support for GCC clock ids for SDM429
  wigig_sensing: treat data ready as deep sleep exit when needed
  usb: dwc3: gadget: Replace dev with its parent sysdev in ep_disable
  usb: dwc3: gadget: Check controller status with endpoint enable/disable
  coresight: Make coresight functions as inline
  cnss2: WAR to trigger self-recovery for link recover callback
  net: qrtr: Excessive logging casuing boot failure
  pinctrl: Add support for msm8917 pinctrl
  pinctrl: Add support for msm8937 pinctrl
  msm: pcie : Extend link recovery for config space access failure
  cnss_prealloc: Add a 128kB to prealloc pool
  rpmsg: qcom_smd: allow smd create device if remote state is closing
  usb: pd: Add support to disable pps capability
  nl80211: add error messages to nl80211_parse_chandef()
  cnss2: Increase prealloc table to satisfy latest driver requirement
  power: smb5-lib: Add additional check to exit charge-termination WA
  cnss2: Dump mhi debug registers on receiving mhi WAKE event cb
  msm:ADSPRPC :Fix to avoid Use after free in fastrpc_internal_munmap
  qseecom: Add boundary checks between two subsequent fields
  diag: Read from USB without holding spinlock
  serial:msm_geni_serial: Handling the cts counter in uart driver
  arm64: fix bootloader_memory_limit
  usb: phy: qusb2: Update tune value for host mode
  coresight: cti: Solve boot up issue
  cnss2: retry mhi suspend in case packets are pending in MHI layer
  clk: qcom: mdss: Enable mdss 28lpm pll driver
  msm: pcie : Notify client driver on reading FF's
  msm: kgsl: Use pid struct to find the process to reclaim
  mm: process_reclaim: pass pid struct instead of tgid
  msm: kgsl: Change vma->vm_file to shmem file
  qcom: step-chg-jeita: Add support for jeita fcc scaling
  mm: process_reclaim: skip target_vma
  mhi: core: Check PCIe link status before accessing MHI registers
  power: qpnp-smb5: Add DT option to enable JEITA-ARB handling
  power: smb5-lib: Improve the charge-termination WA handling
  msm: pci: print PCIE LTSSM state at DRV suspend and resume
  msm: kgsl: Deregister gpu address on memdesc_sg_virt failure
  diag: Handle drops for diag over rpmsg
  diag: Enable diag over rpmsg communication for modem
  diag: Enable diag over rpmsg communication for wcnss
  usb: gadget: gsi: Ensure the doorbell is blocked before suspend
  drivers: irqchip: qcom: Add MSM8937 pin data for MPM
  ARM: qcom: Add board config support for qm215
  soc: qcom: socinfo: Add supprot for QM215 QRD soc-id
  soc: qcom: socinfo: Add support for msm8917 soc-id
  soc: qcom: socinfo: add support for sdm429 and sdm439
  soc: qcom: socinfo: Add support for msm8937 soc-id
  arm/arm64: Kconfig: Add support for qm215
  ARM: qcom: Add board config support for msm8917
  arm64: Kconfig: Add ARCH_SDM439 and ARCH_SDM429 support
  arm64: Kconfig: Add support for msm8937 on msm-4.9
  msm: adsprpc: null pointer check for sctx
  regulator: qpnp-lcdb: fix race between SC interrupt and lcdb enable
  msm: kgsl: Protect the memdesc->gpuaddr in SVM use cases
  msm: kgsl: Stop using memdesc->usermem
  net: sch_generic: fix the missing new qdisc assignment
  usb: gadget: composite: Add spinlock protection for usb string descriptor
  msm: kgsl: add condition to check gpuhtw_llc support
  icnss: Add code to send qdss mode and sysfs interface for qdss
  icnss: Add code to downdload qdss trace config
  leds: qpnp-flash-v2: Fix out-of-bound array access
  mm: skip speculative path for non-anonymous COW faults
  ARM: msm: Add board config support for 32 bit bengal apq iot
  cnss2: Add code to fix a print error in update timestamp api
  icnss2: change to avoid device crash if RF card is not present
  mmc: sdhci-msm: read this reg IPCAT_MINOR_MASK to sdhc host
  pci: msm: Add support for linkdown recovery on hot reset
  net: qrtr: print error case for qrtr receive
  spi: spi-geni-qcom: Calculate transfer timeout dynamically
  spi: spi-geni-qcom: Configure DFS index and clk before doing set rate
  cnss2: Add delay for pci link training retries
  Revert "msm: kgsl: Add GPUCC register dumps to A6xx GPU snapshot"
  cnss2: Add code to handle idle-restart failure gracefully
  icnss2: Clear SMP2P data during SSR
  Revert "msm: kgsl: Add GPUCC register dumps to A6xx GPU snapshot"
  net: qualcomm: rmnet: memset before sending genl response
  diag: Add support for querying diagid for wpss subsystem
  wil6210: add ability to help debug tx latency
  regulator: cpr: add snapshot of cpr-regulator driver
  scsi: ufshcd: Fix double release of hba
  walt: Add window rollover trace event
  msm: kgsl: Correct the refcount on current process PID
  USB: gadget: Add support for superspeed plus for UAC2 & UVC
  serial: msm_geni_serial: Perform Abort sequence for cancel failure
  serial: msm_geni_serial: Correct start rx sequence
  serial: msm_geni_serial: Pull RFR before stop_rx for uart
  Revert "nl80211: fix non-split wiphy information"
  qseecom: use legacy command for slateapp
  USB: f_uac2: Update terminal types as mic and speaker
  defconfig: kona: Enable USB UVC drivers
  usb: gadget: f_uvc: Fix video streaming quality issues
  usb: gadget: f_uvc: Fix crash on disconnect/connect during streaming
  msm: npu: Prevent unpaired power vote/unvote via sysfs node
  qdss_bridge: fix use-after-free is on cdev_put
  defconfig: set CONFIG_HZ = 250 for Bengal
  USB: uvc_video: Check for return value before halt bulk endpoint
  USB: configfs: Clear deactivation flag in configfs_composite_unbind()
  msm: ADSPRPC: Add check to avoid out of bound scenario
  uapi: ipa: Support uc header proc ctx for DSCP insertion
  usb: dwc3: core: Destroy ipc log context on remove
  msm: ipa: add check to see if pm client is not NULL
  cnss2: Fix KW issues for pointer check and variable init
  ANDROID: vfs: d_canonical_path for stacked FS
  msm: ipa3: Add change to increase timeout value
  defconfig: arm64: msm: enable CONFIG_RB5_GPIOS_ENABLE
  msm: driver: Add driver to enable RB5 GPIOs
  msm: ADSPRPC: Reset debug buffer allocation check flag
  power: smb1355: Extend minoff-time and dead-time for SMB1355
  defconfig: arm64: msm: enable CONFIG_RB5_FAN_CONTROLLER
  msm: fan: Add driver to control fan on RB5
  HID: qvr: Remove device pointer on disconnect
  usb: gadget: uvc: Update frame size as per frame type
  usb: gadget: f_uvc: Fix incorrect frame indexing
  usb: gadget: uvc: Add support for UVC 1.5
  usb: gadget: Add support for UVC function
  f2fs: prepare a waiter before entering io_schedule
  f2fs: fix deadlock between quota writes and checkpoint
  cnss2: Add api to get pci reg dump for hang data
  power: smb1398-charger: Toggle UVLO-config on USB removal and shutdown
  msm: ipa3: Add support PM api in ipav3
  fs: crypto: support IV_INO_LBLK_32 for legacy (V1) format
  msm: ipa3: Fix to unmap LOW LAT consumer pipe buffers
  msm: pcie: Dump PCIe registers for hang event
  trace: Fix race in trace_open and buffer resize call
  msm: ipa4: Add change to stop netdev
  msm: fbdev: dp: send video notiification after audio teardown
  msm: kgsl: Poll a6x crashdumper register memory for status
  usb: dwc3-msm: Rectify 64 bit dma address programming for GSI
  msm: ADSPRPC: Enable ram dumps collection
  f2fs: should avoid inode eviction in synchronous path
  i3c: i3c-master-qcom-geni: Add HW and FW version read support
  msm: ipa3: Add check to validate rule_cnt
  i3c: i3c-master-qcom-geni: Manage driver suspend in late PM stage
  net: qrtr: Use cyclic idr allocator for port assignment
  mmc: core: change judgement for card busy detection
  msm: ADSPRPC: Handle third party applications
  msm:ipa4: Fix race condition
  msm: kgsl: Check for gmu prealloc failure only in case of prealloc request
  msm: ipa: Use kvfree instead of kfree
  scsi : ufs-qcom: Add provision to set qcom specific supplies in LPM
  fbdev: msm: update fb_release sequence
  mhi: core: Increase RSC credit to 10
  HID: qvr: wake up after acknowledgment from viewer
  icnss: Update FW_INIT_DONE QMI indication with hang event params
  wil6210: add max_mcs attribute
  cnss2: Check link status before setting wlaon_pwr_ctrl registers
  defconfig: arm64: msm: Enable USB RMNET & RNDIS using IPA over BAM2BAM
  msm: kgsl: Add apb_pclk to the clock list and increase max clock count
  usb: gadget: Add snapshot of USB RMNET Function driver
  drivers: soc: qcom: Add usb bam changes
  usb: gadget: f_qc_rndis: Add RNDIS support using IPA over BAM2BAM
  serial: msm_geni_serial: Add enable/disable of dma irq bits
  serial: msm_geni_serial: Don't queue the rx dma buffer in stop rx
  msm: kgsl: Allow I/O coherency on imported buffers if we can
  drivers: phy: ufs: Remove the condition check to calibrate UFS Phy
  Reverting usb changes
  defconfig: Sync with Android-4.19 configs
  clk: qcom: gcc: Update the halt flags for clocks on SDM660
  power: qpnp-qg: Expose CHARGE_COUNTER_SHADOW power supply property
  cnss2: Check for BT Enable GPIO in QCA6490 & QCA6390
  icnss2: Avoid race between soc wake release threads
  icnss2: Add code for SSR dump collection feature for moselle
  nl80211: fix NL80211_ATTR_HE_6GHZ_CAPABILITY usage
  cfg80211: Indicate support 6GHz band in kernel
  cfg80211: treat 6 GHz channels as valid regardless of capability
  cfg80211: require HE capabilities for 6 GHz band
  cfg80211: reject HT/VHT capabilities on 6 GHz band
  cfg80211: add and expose HE 6 GHz band capabilities
  cfg80211: handle 6 GHz capability of new station
  ieee80211: add HE ext EIDs and 6 GHz capability defines
  ieee80211: add code to obtain and parse 6 GHz operation field
  cfg80211: add a helper to identify 6 GHz PSCs
  cfg80211: adapt to new channelization of the 6GHz band
  cfg80211: fix 6 GHz frequencies to kHz
  ieee80211: update HE IEs to D4.0 spec
  mac80211: update HE IEs to D3.3
  mac80211: update HE operation fields to D3.0
  ieee80211: remove redundant leading zeroes
  iwlwifi: split HE capabilities between AP and STA
  netlink: add ethernet address policy types
  netlink: add NLA_REJECT policy type
  wireless: align to draft 11ax D3.0
  mac80211: Add he_capa debugfs entry
  cfg80211: express channels with a KHz component
  cfg80211: Add support for 60GHz band channels 5 and 6
  cfg80211: apply same mandatory rate flags for 5GHz and 6GHz
  cfg80211: ibss: use 11a mandatory rates for 6GHz band operation
  clk: qcom: gpucc: Add support for new clock frequency for Lagoon
  soc: qcom: minidump: Change the way to locate log_buf
  qcom-cpufreq: Removing lmh-dcvs parsing in ready callback
  usb: dwc3: msm: allow suspend in host mode
  icnss2: Add support for host triggered recovery
  Bluetooth: Implement a minimum off-time for AON discharge issue
  defconfig: sdm660: Enable CONFIG_HID_NINTENDO for sdm660
  defconfig: For support api_30 kernel changes
  defconfig: Sync  with Android-4.19 configs
  defconfig: Disable CRYPTO_MD4 config
  defconfig: Enable VETH config
  msm:adsprpc: Prevent use after free in fastrpc_set_process_info
  Revert "ANDROID: Kbuild, LLVMLinux: allow overriding clang target triple"
  Correct the FM port numbers for Chk 3.x
  net/ipv4: always honour route mtu during forwarding
  usb: dwc3: Ensure blocking_sync waits until host mode starts or stops
  usb: dwc3: gadget: Fix double add due to cleanup_cancelled_request
  ANDROID: fuse: Add support for d_canonical_path
  ANDROID: vfs: add d_canonical_path for stacked filesystem support
  clk: qcom: clk-debug: Add support for debug clock API's
  cfg80211: use same IR permissive rules for 6GHz band
  cfg80211: add 6GHz in code handling array with NUM_NL80211_BANDS entries
  cfg80211: extend ieee80211_operating_class_to_band() for 6GHz
  cfg80211: util: add 6GHz channel to freq conversion and vice versa
  cfg80211: add 6GHz UNII band definitions
  nl80211: add 6GHz band definition to enum nl80211_band
  ANDROID: Temporarily disable XFRM_USER_COMPAT filtering
  msm: ipa3: Add debug logs to check unregister netdev completion time
  Revert "clk: Evict unregistered clks from parent caches"
  ANDROID: GKI: Enable DEBUG_INFO_DWARF4
  timekeeping/vsyscall: Prevent math overflow in BOOTTIME update
  UPSTREAM: mm/sl[uo]b: export __kmalloc_track(_node)_caller
  BACKPORT: xfrm/compat: Translate 32-bit user_policy from sockptr
  BACKPORT: xfrm/compat: Add 32=>64-bit messages translator
  UPSTREAM: xfrm/compat: Attach xfrm dumps to 64=>32 bit translator
  UPSTREAM: xfrm/compat: Add 64=>32-bit messages translator
  BACKPORT: xfrm: Provide API to register translator module
  ANDROID: Publish uncompressed Image on aarch64
  FROMLIST: crypto: arm64/poly1305-neon - reorder PAC authentication with SP update
  UPSTREAM: crypto: arm64/chacha - fix chacha_4block_xor_neon() for big endian
  UPSTREAM: crypto: arm64/chacha - fix hchacha_block_neon() for big endian
  msm: ipa: fix the use-after-free on qmi framework in ssr scenario
  fscrypt: Handle support for v1 encryption policy
  ANDROID: GKI: update the ABI xml
  spi: spi_qsd: Add ipc logging for spi driver
  qbt_handler: Memset userspace struct to zero
  drivers: soc: qcom: Port bam dmux driver
  drivers: soc: qcom: Add bam dmux driver support
  msm: kgsl: Compare pid pointer instead of TGID for a new process
  power: qpnp-smb5: Update legacy cable detection logic in bootup
  spi: spi_qsd: Add Shared EE property check for spi
  soc: qcom: Correct the module description for llcc-orchid
  usb: dwc3: core: Add ipc logs when sg lists are used
  icnss2: Send power save enter/exit via SMP2P
  ANDROID: clang: update to 11.0.5
  FROMLIST: arm64: link with -z norelro regardless of CONFIG_RELOCATABLE
  defconfig: Enable CONFIG_LEGACY_ENERGY_MODEL_DT for sdm660
  scsi: ufs: Increase fDeviceInit flag poll time to 5sec
  msm: pcie: update with link power on check for user PCIe resume
  scsi: ufs: Fix ufshcd_hold dead loop issue if error recovery is handing
  defconfig: arm64: msm: enable CONFIG_FORCE_ALLOC_FROM_DMA_ZONE
  ANDROID: GKI: enable CONFIG_WIREGUARD
  UPSTREAM: wireguard: peerlookup: take lock before checking hash in replace operation
  UPSTREAM: wireguard: noise: take lock when removing handshake entry from table
  UPSTREAM: wireguard: queueing: make use of ip_tunnel_parse_protocol
  UPSTREAM: net: ip_tunnel: add header_ops for layer 3 devices
  UPSTREAM: wireguard: receive: account for napi_gro_receive never returning GRO_DROP
  UPSTREAM: wireguard: device: avoid circular netns references
  UPSTREAM: wireguard: noise: do not assign initiation time in if condition
  UPSTREAM: wireguard: noise: separate receive counter from send counter
  UPSTREAM: wireguard: queueing: preserve flow hash across packet scrubbing
  UPSTREAM: wireguard: noise: read preshared key while taking lock
  UPSTREAM: wireguard: selftests: use newer iproute2 for gcc-10
  UPSTREAM: wireguard: send/receive: use explicit unlikely branch instead of implicit coalescing
  UPSTREAM: wireguard: selftests: initalize ipv6 members to NULL to squelch clang warning
  UPSTREAM: wireguard: send/receive: cond_resched() when processing worker ringbuffers
  UPSTREAM: wireguard: socket: remove errant restriction on looping to self
  UPSTREAM: wireguard: selftests: use normal kernel stack size on ppc64
  UPSTREAM: wireguard: receive: use tunnel helpers for decapsulating ECN markings
  UPSTREAM: wireguard: queueing: cleanup ptr_ring in error path of packet_queue_init
  UPSTREAM: wireguard: send: remove errant newline from packet_encrypt_worker
  UPSTREAM: wireguard: noise: error out precomputed DH during handshake rather than config
  UPSTREAM: wireguard: receive: remove dead code from default packet type case
  UPSTREAM: wireguard: queueing: account for skb->protocol==0
  UPSTREAM: wireguard: selftests: remove duplicated include <sys/types.h>
  UPSTREAM: wireguard: socket: remove extra call to synchronize_net
  UPSTREAM: wireguard: send: account for mtu=0 devices
  UPSTREAM: wireguard: receive: reset last_under_load to zero
  UPSTREAM: wireguard: selftests: reduce complexity and fix make races
  UPSTREAM: wireguard: device: use icmp_ndo_send helper
  UPSTREAM: wireguard: selftests: tie socket waiting to target pid
  UPSTREAM: wireguard: selftests: ensure non-addition of peers with failed precomputation
  UPSTREAM: wireguard: noise: reject peers with low order public keys
  UPSTREAM: wireguard: allowedips: fix use-after-free in root_remove_peer_lists
  UPSTREAM: net: skbuff: disambiguate argument and member for skb_list_walk_safe helper
  UPSTREAM: net: introduce skb_list_walk_safe for skb segment walking
  UPSTREAM: wireguard: socket: mark skbs as not on list when receiving via gro
  UPSTREAM: wireguard: queueing: do not account for pfmemalloc when clearing skb header
  UPSTREAM: wireguard: selftests: remove ancient kernel compatibility code
  UPSTREAM: wireguard: allowedips: use kfree_rcu() instead of call_rcu()
  UPSTREAM: wireguard: main: remove unused include <linux/version.h>
  UPSTREAM: wireguard: global: fix spelling mistakes in comments
  UPSTREAM: wireguard: Kconfig: select parent dependency for crypto
  UPSTREAM: wireguard: selftests: import harness makefile for test suite
  UPSTREAM: net: WireGuard secure network tunnel
  UPSTREAM: timekeeping: Boot should be boottime for coarse ns accessor
  UPSTREAM: timekeeping: Add missing _ns functions for coarse accessors
  UPSTREAM: icmp: introduce helper for nat'd source address in network device context
  UPSTREAM: crypto: poly1305-x86_64 - Use XORL r32,32
  UPSTREAM: crypto: curve25519-x86_64 - Use XORL r32,32
  UPSTREAM: crypto: arm/poly1305 - Add prototype for poly1305_blocks_neon
  UPSTREAM: crypto: arm/curve25519 - include <linux/scatterlist.h>
  UPSTREAM: crypto: x86/curve25519 - Remove unused carry variables
  UPSTREAM: crypto: x86/chacha-sse3 - use unaligned loads for state array
  UPSTREAM: crypto: lib/chacha20poly1305 - Add missing function declaration
  UPSTREAM: crypto: arch/lib - limit simd usage to 4k chunks
  UPSTREAM: crypto: arm[64]/poly1305 - add artifact to .gitignore files
  UPSTREAM: crypto: x86/curve25519 - leave r12 as spare register
  UPSTREAM: crypto: x86/curve25519 - replace with formally verified implementation
  UPSTREAM: crypto: arm64/chacha - correctly walk through blocks
  UPSTREAM: crypto: x86/curve25519 - support assemblers with no adx support
  UPSTREAM: crypto: chacha20poly1305 - prevent integer overflow on large input
  UPSTREAM: crypto: Kconfig - allow tests to be disabled when manager is disabled
  UPSTREAM: crypto: arm/chacha - fix build failured when kernel mode NEON is disabled
  UPSTREAM: crypto: x86/poly1305 - emit does base conversion itself
  UPSTREAM: crypto: chacha20poly1305 - add back missing test vectors and test chunking
  UPSTREAM: crypto: x86/poly1305 - fix .gitignore typo
  UPSTREAM: crypto: curve25519 - Fix selftest build error
  UPSTREAM: crypto: {arm,arm64,mips}/poly1305 - remove redundant non-reduction from emit
  UPSTREAM: crypto: x86/poly1305 - wire up faster implementations for kernel
  UPSTREAM: crypto: x86/poly1305 - import unmodified cryptogams implementation
  UPSTREAM: crypto: poly1305 - add new 32 and 64-bit generic versions
  UPSTREAM: crypto: lib/curve25519 - re-add selftests
  UPSTREAM: crypto: arm/curve25519 - add arch-specific key generation function
  UPSTREAM: crypto: chacha - fix warning message in header file
  UPSTREAM: crypto: arch - conditionalize crypto api in arch glue for lib code
  UPSTREAM: crypto: lib/chacha20poly1305 - use chacha20_crypt()
  UPSTREAM: crypto: x86/chacha - only unregister algorithms if registered
  UPSTREAM: crypto: chacha_generic - remove unnecessary setkey() functions
  UPSTREAM: crypto: lib/chacha20poly1305 - reimplement crypt_from_sg() routine
  UPSTREAM: crypto: chacha20poly1305 - import construction and selftest from Zinc
  UPSTREAM: crypto: arm/curve25519 - wire up NEON implementation
  UPSTREAM: crypto: arm/curve25519 - import Bernstein and Schwabe's Curve25519 ARM implementation
  UPSTREAM: crypto: curve25519 - x86_64 library and KPP implementations
  UPSTREAM: crypto: lib/curve25519 - work around Clang stack spilling issue
  UPSTREAM: crypto: curve25519 - implement generic KPP driver
  UPSTREAM: crypto: curve25519 - add kpp selftest
  UPSTREAM: crypto: curve25519 - generic C library implementations
  UPSTREAM: crypto: blake2s - x86_64 SIMD implementation
  UPSTREAM: crypto: blake2s - implement generic shash driver
  UPSTREAM: crypto: testmgr - add test cases for Blake2s
  UPSTREAM: crypto: blake2s - generic C library implementation and selftest
  UPSTREAM: crypto: mips/poly1305 - incorporate OpenSSL/CRYPTOGAMS optimized implementation
  UPSTREAM: crypto: arm/poly1305 - incorporate OpenSSL/CRYPTOGAMS NEON implementation
  i3c: i3c-master-qcom-geni: Handle timeout for DMA FSM reset
  UPSTREAM: crypto: arm64/poly1305 - incorporate OpenSSL/CRYPTOGAMS NEON implementation
  i3c: i3c-master-qcom-geni: Save master device info to debug list
  UPSTREAM: crypto: x86/poly1305 - expose existing driver as poly1305 library
  UPSTREAM: crypto: x86/poly1305 - depend on generic library not generic shash
  UPSTREAM: crypto: poly1305 - expose init/update/final library interface
  UPSTREAM: crypto: x86/poly1305 - unify Poly1305 state struct with generic code
  UPSTREAM: crypto: poly1305 - move core routines into a separate library
  UPSTREAM: crypto: chacha - unexport chacha_generic routines
  UPSTREAM: crypto: mips/chacha - wire up accelerated 32r2 code from Zinc
  UPSTREAM: crypto: mips/chacha - import 32r2 ChaCha code from Zinc
  UPSTREAM: crypto: arm/chacha - expose ARM ChaCha routine as library function
  UPSTREAM: crypto: arm/chacha - remove dependency on generic ChaCha driver
  UPSTREAM: crypto: arm/chacha - import Eric Biggers's scalar accelerated ChaCha code
  UPSTREAM: crypto: arm64/chacha - expose arm64 ChaCha routine as library function
  UPSTREAM: crypto: arm64/chacha - depend on generic chacha library instead of crypto driver
  UPSTREAM: crypto: arm64/chacha - use combined SIMD/ALU routine for more speed
  UPSTREAM: crypto: arm64/chacha - optimize for arbitrary length inputs
  UPSTREAM: crypto: x86/chacha - expose SIMD ChaCha routine as library function
  UPSTREAM: crypto: x86/chacha - depend on generic chacha library instead of crypto driver
  UPSTREAM: crypto: chacha - move existing library code into lib/crypto
  UPSTREAM: crypto: lib - tidy up lib/crypto Kconfig and Makefile
  UPSTREAM: crypto: chacha - constify ctx and iv arguments
  UPSTREAM: crypto: x86/poly1305 - Clear key material from stack in SSE2 variant
  i3c: i3c-master-qcom-geni: Log error if DMA mode fails
  defcong: sdm660 : Adding support to IPA driver
  msm: ipa: Add ipa rm support for ipa_v2
  UPSTREAM: crypto: xchacha20 - fix comments for test vectors
  UPSTREAM: crypto: xchacha - add test vector from XChaCha20 draft RFC
  UPSTREAM: crypto: arm64/chacha - add XChaCha12 support
  UPSTREAM: crypto: arm64/chacha20 - refactor to allow varying number of rounds
  UPSTREAM: crypto: arm64/chacha20 - add XChaCha20 support
  UPSTREAM: crypto: x86/chacha - avoid sleeping under kernel_fpu_begin()
  UPSTREAM: crypto: x86/chacha - yield the FPU occasionally
  UPSTREAM: crypto: x86/chacha - add XChaCha12 support
  UPSTREAM: crypto: x86/chacha20 - refactor to allow varying number of rounds
  UPSTREAM: crypto: x86/chacha20 - add XChaCha20 support
  UPSTREAM: crypto: x86/chacha20 - Add a 4-block AVX-512VL variant
  UPSTREAM: crypto: x86/chacha20 - Add a 2-block AVX-512VL variant
  UPSTREAM: crypto: x86/chacha20 - Add a 8-block AVX-512VL variant
  UPSTREAM: crypto: x86/chacha20 - Add a 4-block AVX2 variant
  UPSTREAM: crypto: x86/chacha20 - Add a 2-block AVX2 variant
  UPSTREAM: crypto: x86/chacha20 - Use larger block functions more aggressively
  UPSTREAM: crypto: x86/chacha20 - Support partial lengths in 8-block AVX2 variant
  UPSTREAM: crypto: x86/chacha20 - Support partial lengths in 4-block SSSE3 variant
  UPSTREAM: crypto: x86/chacha20 - Support partial lengths in 1-block SSSE3 variant
  msm: ipa3: Add low-level IPA client support
  net: support __alloc_skb to always use GFP_DMA
  msm: ipa2: Add changes compatible to kernel-4.19
  msm: ipa2: Add change to fix ipa padding
  msm: ipa: Add Kconfig changes of IPA2 driver
  msm: ipa2: Add changes compatible to kernel-4.14
  i3c: i3c-master-qcom-geni: Fix DMA and FIFO mode timeout scenario
  ANDROID: GKI: Enable CONFIG_USB_ANNOUNCE_NEW_DEVICES
  msm: ipa: Add support of IPA2 driver
  scsi: ufs: reomove Rst_N pulling up action in ufshcd_resume()
  serial: msm_geni_serial: Add new UART IPC log file in DMA mode
  serial: msm_geni_serial: Add delay for rx invalid transfer
  msm_geni_serial: Add ioctl for adding new IPC log in uart
  msm: kgsl: Don't allow re-importing memory owned by KGSL
  serial: msm_geni_serial: memset RX buffer to Zero
  icnss2: Avoid race between SOC WAKE REQ/RESP
  ANDROID: GKI: Enable CONFIG_X86_X2APIC
  i3c: i3c-master-qcom-geni: Manage probe time resources
  fbdev: msm: disable cpu sync during dma_buf_map_attachment
  scsi: ufs: Add back a missing sanity check to ufshcd_read_desc_param()
  icnss: check SKIP_QMI test bit for exported qmi messages
  ANDROID: move builds to use gas prebuilts
  i3c: i3c-master-qcom-geni: Force the xfer mode as DMA mode
  msm: ipa3: Fix to use proper clock timer
  i3c: i3c-master-qcom-geni: Fix IBI and Hot join related issues
  msm: ipa3: Add change to not reset HOLB timer
  UPSTREAM: binder: fix UAF when releasing todo list
  cnss2: Add support for PCIE gen switch
  FROMLIST: arm64: vdso32: Allow ld.lld to properly link the VDSO
  mmc: core: Fix clk scaling when card max freq below 50MHz
  msm: ipa3: Send enable force clear only for producer pipe
  sched/tune: Fix improper accounting of tasks
  usb: dwc3: Stop active transfer on control endpoints
  Add support for block disk encryption
  mmc: host: Use right parameter for ext4 plus eMMC
  mmc: host: reprogram the key to cover the invalid config case
  Fix OTA issue with vts fixes for new fbe framework
  msm: kgsl: Remove dev_err() from fenced write loop
  uapi: sound: Fix compilation error
  defconfig: msm: Enable FS related configs for Android R
  net:sockev: hold file reference till the sock event is sent
  net_sched: Add flow control support to prio qdisc
  msm: camera: Fix for memory leak
  defconfig: kona: Enable dm-crypt driver
  soc: qcom: Fix memcpy operations in ramdump_read
  md: dm-default-key: Use system sector size for SDHCI devices
  defconfig: msm: Enable CONFIG_STATIC_USERMODEHELPER for bengal_32
  fdt: Update CRC check for rng-seed
  usb: phy: snps: Enable auto resume feature only in host mode
  msm: ipa: Fix rndis client disconnection gracefully
  icnss: reject idle restart if wlan driver unregistered
  soc: qcom: Add LLCC driver for Orchid
  icnss2: Decrement soc wake ref count
  fbdev: msm: remove mappings before iommu detach
  clk: qcom: mdss: Update dfps data struct for FB targets
  usb: pd: Register typec partner in case AAA is connected
  binder: update low_latency selection for binder transactions
  sched/walt: Improve the scheduler
  msm: kgsl: Use regulator_is_enabled api when gpu-quirk-cx-gdsc is defined
  icnss2: Send enter power save after driver suspend
  mmc: host: Update HS400 timing mode before performing tuning
  defconfig: Enable CONFIG_UTS_NS for sdm660
  trace: f2fs: Fix kasan slab-out-of-bounds
  ANDROID: use arm-linux-androidkernel- for CROSS_COMPILE_COMPAT
  ANDROID: build.config.common: enable LLVM=1
  NFC: Add support for core init command
  icnss2: Fix race condition during SOC wake req/release
  msm: kgsl: Don't wait for room in context queue when context is invalidated
  dt-bindings: msm: Add bindings for MP limit fuse support
  fbdev: msm: set smmu cb domain attached during probe
  defconfig: enable SDE rotator
  mm/Kconfig: forcing allocators to return ZONE_DMA32 memory
  power: smb5: Fix LPD flag for PMI632
  ANDROID: GKI: prevent removal of monitored symbols
  firmware: qcom: Fix hyp_log issue
  soc: qcom: Fix smcinvoke_obj->fd assignment
  drm: increase max limit of drm open count to 128
  scsi: ufs: Fix unexpected values get from ufshcd_read_desc_param()
  usb: gadget: Don't giveback request if ep command times out
  icnss2: Avoid calibration during SSR of WCN6750
  ANDROID: Refresh ABI.xmls with libabigail 1.8.0-98bbf30d
  edac: improve gold CPU cache way parsing
  msm: kgsl: Update clk_set_rate() sequence for bimc_gpu_clk
  scsi: ufs: Fix ufs power down/on specs violation in suspend/resume path
  defconfig: msm: Enable CONFIG_STATIC_USERMODEHELPER for bengal_32
  fdt: Update CRC check for rng-seed
  defconfig: Enable blk-crypto-fallback to handle sw crypto request
  md: dm-default-key: Use system sector size for SDHCI devices
  msm: sde: rotator: enable sde rotator
  msm: pcie: provide client the ability to control PCIe target_link_speed
  qcom: qpnp-fg-gen3: Continue fg_gen3_probe() when !DEBUG_FS
  dcc_v2: fix 1 write 1 read register configuration fail issue
  leds: qpnp-flash-v2: Acquire the bms_psy handle at runtime
  regulator: qpnp-labibb: Don't handle LAB_VREG_OK in TTW mode for pmi8998
  regulator: qpnp-labibb: Add sysfs class to enable/disable the irq
  regulator: qpnp-lcdb: Disable the SC irq only for PM660L V1.1 and below
  regulator: qpnp-lcdb: Add sysfs class to enable/disable the irq
  cnss2: Enable self-recovery only when host driver detects linkdown
  ANDROID: drop KERNEL_DIR setting in build.config.common
  cnss2: Release qmi handle after server exit
  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
  msm: cvp: Avoid releasing non-existent ARP buffer
  cnss_utils: Update wlfw power save enter/exit qmi message
  msm: mink: Fix copy_to_user issue
  crypto: Fix possible stack out of bound error
  mhi: core: Extend mhi_device_get_sync_atomic() for panic cases
  cnss2: Log a message after assert/de-assert WLAN_EN GPIO
  cnss2: Assert when power on retry reaches maximum
  usb: dwc3: gadget: Properly handle failed kick_transfer
  f2fs: remove blk_plugging in block_operations
  power: smblite-lib: Reduce the ICL immediately when flash is active
  qseecom: Propagate correct return value from TZ
  mmc: Remove unused code
  ANDROID: Refresh ABI.xmls with libabigail 1.8.0-1dca710a
  irqchip: gic-v3: Add support to get pending irqs
  serial: msm_geni_serial: Don't use WARN_ON for console uart
  mmc: core: Fix issue of no clk scaling upon previous scaling failure
  power: smb1390: Fix taper condition for VPH configuration
  cnss2: Change to add prints on link down callback
  dm-crypt: Skip encryption if bio is fscrypto or blk-crypto encrypted
  power: smblite-lib/smb5-lib: Add partner registration for microusb otg
  clk: qcom: rpmh: Update new clocks support on LitoMagnus
  arm: dma-mapping.c: add cpu sync in map_sg and unmap_sg
  defconfig: Enable blk-crypto-fallback to handle sw crypto request
  dt-bindings: clock: qcom: Add support for RPMH clocks
  msm: ipa4: fix the unclock gsi IPA register access
  clk: qcom: Add BIMC logging support during kernel panic
  dt-bindings: clock: Add support for BIMC clock
  usb: core: Don't wait for completion of urbs
  msm: kgsl: Enable process reclaim for A610
  fuse: fix page dereference after free
  msm: media: uapi: Redefine NV12 format with different alignment
  sched/walt: Fix a potential accounting issue during window size change
  UPSTREAM: arm64: vdso: Build vDSO with -ffixed-x18
  mhi: core: Add checks for bhie offsets
  ANDROID: KMI symbol lists: migrate section name
  usb: phy: qusb: Set the voltage to regulator according to soc capacity
  cnss2: Collect shadow registers for RDDM scenario
  mm: slub: Add debugfs interface to capture slub allocs owner
  msm: kgsl: Don't skip gmufw preallocations during firmware read
  icnss2: Export API to host driver to exit power save
  msm: ipa: stay in NAPI mode when default pipe has low credits
  vidc_3x: Fix crash in user build
  msm: mink: Fix copy_to_user issue
  msm: ipa: update the iommu mapping for WDI rings
  mmc: Port changes for supporting SDIO functionality to 4.19 kernel
  ANDROID: ABI: refresh with latest libabigail 94f5d4ae
  ...

 Conflicts:
	.gitignore
	Documentation/arm64/tagged-address-abi.rst
	Makefile
	android/abi_gki_aarch64
	android/abi_gki_aarch64.xml
	android/abi_gki_aarch64_cuttlefish
	android/abi_gki_aarch64_qcom
	arch/Kconfig
	arch/arm/Kconfig
	arch/arm/configs/vendor/msm8937-perf_defconfig
	arch/arm/configs/vendor/msm8937_32go-perf_defconfig
	arch/arm/configs/vendor/msm8937_32go_defconfig
	arch/arm/configs/vendor/msm8937_defconfig
	arch/arm/crypto/curve25519-core.S
	arch/arm/crypto/poly1305-glue.c
	arch/arm64/Kconfig
	arch/arm64/boot/dts/vendor/bindings/bus/ti-sysc.txt
	arch/arm64/boot/dts/vendor/bindings/display/mediatek/mediatek,dpi.txt
	arch/arm64/boot/dts/vendor/bindings/iio/multiplexer/io-channel-mux.txt
	arch/arm64/boot/dts/vendor/bindings/net/fsl-fman.txt
	arch/arm64/boot/dts/vendor/bindings/sound/wm8994.txt
	arch/arm64/boot/dts/vendor/bindings/usb/dwc3.txt
	arch/arm64/configs/gki_defconfig
	arch/arm64/configs/vendor/bengal-perf_defconfig
	arch/arm64/configs/vendor/bengal_defconfig
	arch/arm64/configs/vendor/kona-perf_defconfig
	arch/arm64/configs/vendor/kona_defconfig
	arch/arm64/configs/vendor/lito-perf_defconfig
	arch/arm64/configs/vendor/lito_defconfig
	arch/arm64/configs/vendor/sdm660-perf_defconfig
	arch/arm64/configs/vendor/sdm660_defconfig
	arch/arm64/crypto/poly1305-glue.c
	arch/arm64/include/asm/alternative.h
	arch/arm64/include/asm/cpucaps.h
	arch/arm64/include/asm/cputype.h
	arch/arm64/include/asm/lse.h
	arch/arm64/include/asm/vdso/compat_barrier.h
	arch/arm64/include/asm/vdso/compat_gettimeofday.h
	arch/arm64/kernel/asm-offsets.c
	arch/arm64/kernel/cpu_errata.c
	arch/arm64/kernel/vdso.c
	arch/arm64/kernel/vdso/Makefile
	arch/arm64/kernel/vdso32/Makefile
	arch/arm64/mm/mmu.c
	arch/mips/crypto/Makefile
	arch/mips/crypto/poly1305-glue.c
	arch/mips/vdso/Makefile
	arch/x86/configs/gki_defconfig
	arch/x86/crypto/Makefile
	arch/x86/crypto/blake2s-glue.c
	arch/x86/crypto/poly1305_glue.c
	arch/x86/include/asm/vgtod.h
	arch/x86/kernel/cpu/common.c
	build.config.aarch64
	build.config.common
	build.config.gki_kasan
	build.config.x86_64
	crypto/Kconfig
	crypto/Makefile
	crypto/blake2s_generic.c
	crypto/testmgr.c
	crypto/testmgr.h
	drivers/android/binder_internal.h
	drivers/android/binderfs.c
	drivers/base/core.c
	drivers/base/power/wakeup_stats.c
	drivers/block/loop.c
	drivers/char/Kconfig
	drivers/char/adsprpc.c
	drivers/char/diag/diagfwd_peripheral.c
	drivers/char/random.c
	drivers/clk/qcom/clk-debug.c
	drivers/crypto/msm/qcedev.c
	drivers/devfreq/governor_gpubw_mon.c
	drivers/dma-buf/dma-buf.c
	drivers/firmware/qcom/tz_log.c
	drivers/gpu/drm/drm_connector.c
	drivers/gpu/drm/drm_mipi_dsi.c
	drivers/gpu/drm/drm_prime.c
	drivers/gpu/drm/virtio/virtgpu_ioctl.c
	drivers/gpu/msm/adreno_debugfs.c
	drivers/gpu/msm/kgsl.c
	drivers/gpu/msm/kgsl_device.h
	drivers/gpu/msm/kgsl_drawobj.c
	drivers/gpu/msm/kgsl_pool.c
	drivers/gpu/msm/kgsl_pwrctrl.c
	drivers/gpu/msm/kgsl_pwrctrl.h
	drivers/gpu/msm/kgsl_reclaim.c
	drivers/gpu/msm/kgsl_sharedmem.c
	drivers/gpu/msm/kgsl_timeline.c
	drivers/hid/hid-ids.h
	drivers/hid/hid-quirks.c
	drivers/hwtracing/coresight/coresight-etm-perf.c
	drivers/hwtracing/coresight/coresight-etm4x.c
	drivers/hwtracing/coresight/coresight-etm4x.h
	drivers/hwtracing/coresight/coresight-tmc-etr.c
	drivers/i2c/busses/i2c-qcom-geni.c
	drivers/md/dm-crypt.c
	drivers/md/dm-table.c
	drivers/md/dm-verity-target.c
	drivers/media/platform/msm/sde/rotator/sde_rotator_sync.c
	drivers/media/platform/msm/synx/synx.c
	drivers/media/platform/msm/synx/synx_debugfs.c
	drivers/media/platform/msm/synx/synx_util.c
	drivers/misc/Kconfig
	drivers/misc/Makefile
	drivers/misc/qseecom.c
	drivers/mmc/core/Kconfig
	drivers/mmc/core/block.c
	drivers/mmc/host/cqhci-crypto-qti.c
	drivers/mmc/host/sdhci-msm.c
	drivers/mmc/host/sdhci.c
	drivers/net/Kconfig
	drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.c
	drivers/net/wireguard/Makefile
	drivers/net/wireguard/allowedips.c
	drivers/net/wireguard/allowedips.h
	drivers/net/wireguard/device.c
	drivers/net/wireguard/device.h
	drivers/net/wireguard/main.c
	drivers/net/wireguard/peer.c
	drivers/net/wireguard/peer.h
	drivers/net/wireguard/queueing.c
	drivers/net/wireguard/queueing.h
	drivers/net/wireguard/ratelimiter.c
	drivers/net/wireguard/receive.c
	drivers/net/wireguard/selftest/allowedips.c
	drivers/net/wireguard/send.c
	drivers/net/wireguard/socket.c
	drivers/net/wireless/cnss2/pci.c
	drivers/net/wireless/mac80211_hwsim.c
	drivers/of/platform.c
	drivers/of/property.c
	drivers/pinctrl/qcom/pinctrl-khaje.c
	drivers/platform/msm/ipa/ipa_v3/ipa.c
	drivers/platform/msm/ipa/ipa_v3/ipa_client.c
	drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.c
	drivers/power/supply/power_supply_sysfs.c
	drivers/power/supply/qcom/Makefile
	drivers/power/supply/qcom/qg-reg.h
	drivers/power/supply/qcom/qpnp-qg.c
	drivers/power/supply/qcom/qpnp-smb5.c
	drivers/power/supply/qcom/smb1398-charger.c
	drivers/power/supply/qcom/smb5-lib.c
	drivers/scsi/ufs/ufshcd-crypto.c
	drivers/soc/qcom/crypto-qti-tz.c
	drivers/soc/qcom/icnss2/qmi.c
	drivers/soc/qcom/icnss_private.h
	drivers/soc/qcom/qmi_rmnet.c
	drivers/soc/qcom/qmi_rmnet_i.h
	drivers/soc/qcom/smcinvoke.c
	drivers/soc/qcom/socinfo.c
	drivers/soc/qcom/subsys-pil-tz.c
	drivers/spi/spi-geni-qcom.c
	drivers/staging/android/ion/ion.c
	drivers/tty/serial/msm_geni_serial.c
	drivers/usb/dwc3/dwc3-msm.c
	drivers/usb/dwc3/gadget.c
	drivers/usb/dwc3/gadget.h
	drivers/usb/gadget/composite.c
	drivers/usb/gadget/function/f_fs.c
	drivers/usb/gadget/function/f_hid.c
	drivers/usb/gadget/function/f_uac1.c
	drivers/usb/misc/ssusb-redriver-nb7vpq904m.c
	drivers/usb/musb/Kconfig
	drivers/usb/musb/mediatek.c
	drivers/usb/pd/policy_engine.c
	drivers/usb/phy/phy-msm-qusb.c
	drivers/usb/typec/bus.c
	drivers/usb/typec/mux.c
	drivers/video/fbdev/msm/mdss_sync.c
	fs/crypto/fscrypt_private.h
	fs/crypto/inline_crypt.c
	fs/crypto/keysetup.c
	fs/crypto/policy.c
	fs/ext4/dir.c
	fs/ext4/ext4.h
	fs/ext4/hash.c
	fs/ext4/namei.c
	fs/ext4/page-io.c
	fs/f2fs/super.c
	fs/incfs/data_mgmt.h
	fs/incfs/main.c
	fs/incfs/vfs.c
	include/crypto/blake2s.h
	include/crypto/chacha.h
	include/crypto/internal/blake2s.h
	include/crypto/internal/poly1305.h
	include/crypto/poly1305.h
	include/drm/drm_mipi_dsi.h
	include/linux/android_kabi.h
	include/linux/bits.h
	include/linux/diagchar.h
	include/linux/dma-buf.h
	include/linux/icmpv6.h
	include/linux/ipv6.h
	include/linux/page-flags-layout.h
	include/linux/power_supply.h
	include/linux/random.h
	include/linux/sched.h
	include/linux/usb/gadget.h
	include/net/icmp.h
	include/net/ndisc.h
	include/net/sock.h
	include/soc/qcom/icnss.h
	include/soc/qcom/socinfo.h
	include/trace/events/f2fs.h
	include/trace/events/random.h
	include/uapi/linux/android/binderfs.h
	include/uapi/linux/v4l2-controls.h
	include/uapi/linux/virtio_ids.h
	include/uapi/media/msm_camsensor_sdk.h
	include/uapi/media/msm_media_info.h
	include/vdso/bits.h
	include/vdso/datapage.h
	kernel/bpf/helpers.c
	kernel/cgroup/cgroup.c
	kernel/fork.c
	kernel/futex.c
	kernel/panic.c
	kernel/power/wakelock.c
	kernel/sched/core.c
	kernel/sched/cpufreq_schedutil.c
	kernel/sched/sched.h
	kernel/sched/topology.c
	kernel/sched/walt.h
	kernel/time/vsyscall.c
	lib/Kconfig.kasan
	lib/crypto/Kconfig
	lib/crypto/Makefile
	lib/crypto/blake2s-generic.c
	lib/crypto/blake2s-selftest.c
	lib/crypto/blake2s.c
	lib/crypto/poly1305-donna32.c
	lib/crypto/poly1305-donna64.c
	lib/crypto/poly1305.c
	lib/strnlen_user.c
	lib/test_meminit.c
	lib/test_stackinit.c
	mm/kasan/common.c
	mm/page_alloc.c
	mm/page_io.c
	net/core/filter.c
	net/ipv4/icmp.c
	net/ipv6/ip6_icmp.c
	net/sctp/input.c
	net/unix/scm.c
	net/wireless/core.c
	net/xfrm/xfrm_compat.c
	net/xfrm/xfrm_state.c
	net/xfrm/xfrm_user.c
	scripts/adjust_autoksyms.sh
	scripts/generate_initcall_order.pl
	scripts/setlocalversion
	scripts/tools-support-relr.sh
	security/Kconfig.hardening
	security/selinux/hooks.c
	security/selinux/include/classmap.h
	security/selinux/include/security.h
	security/selinux/nlmsgtab.c
	security/selinux/ss/mls.c
	security/selinux/ss/policydb.c
	security/selinux/ss/policydb.h
	security/selinux/ss/services.c
	tools/testing/selftests/wireguard/netns.sh
	tools/testing/selftests/wireguard/qemu/kernel.config

Change-Id: I5992ee11f94595fd75ea4cf60b15fe7eee0f28ad
This commit is contained in:
Michael Bestas 2023-04-15 19:29:19 +03:00
commit 726f1d1d73
No known key found for this signature in database
GPG key ID: CC95044519BE6669
213 changed files with 47208 additions and 265 deletions

View file

@ -33,9 +33,8 @@ $(warning Forcing kernel header generation only for '$(TARGET_KERNEL_HEADER_ARCH
KERNEL_HEADER_ARCH := $(TARGET_KERNEL_HEADER_ARCH)
endif
KERNEL_HEADER_DEFCONFIG := $(strip $(KERNEL_HEADER_DEFCONFIG))
ifeq ($(KERNEL_HEADER_DEFCONFIG),)
KERNEL_HEADER_DEFCONFIG := $(KERNEL_DEFCONFIG)
ifeq ($(shell echo $(KERNEL_DEFCONFIG) | grep vendor),)
KERNEL_DEFCONFIG := vendor/$(KERNEL_DEFCONFIG)
endif
# Force 32-bit binder IPC for 64bit kernel with 32bit userspace
@ -145,18 +144,38 @@ fi
endef
ifneq ($(KERNEL_LEGACY_DIR),true)
$(KERNEL_USR): $(KERNEL_HEADERS_INSTALL)
$(KERNEL_USR): | $(KERNEL_HEADERS_INSTALL)
rm -rf $(KERNEL_SYMLINK)
ln -s kernel/$(TARGET_KERNEL) $(KERNEL_SYMLINK)
$(TARGET_PREBUILT_INT_KERNEL): $(KERNEL_USR)
$(TARGET_PREBUILT_INT_KERNEL): | $(KERNEL_USR)
endif
include $(TARGET_KERNEL_SOURCE)/defconfig.mk
KERNEL_HEADER_DEFCONFIG := $(strip $(KERNEL_HEADER_DEFCONFIG))
ifeq ($(KERNEL_HEADER_DEFCONFIG),)
KERNEL_HEADER_DEFCONFIG := $(TARGET_DEFCONFIG)
endif
# Make the kernel config
# $1 output dir
# $2 kernel config filepath
# $3 defconfig
# $4 kernel source
# $5 kernel make env
# $6 kernel architecture
# $7 cross compile sub-command
# $8 make command
define do-kernel-config
( cp $(3) $(2) && $(8) -C $(4) O=$(1) $(5) ARCH=$(6) CROSS_COMPILE=$(7) $(9) defoldconfig ) || ( rm -f $(2) && false )
endef
$(KERNEL_OUT):
mkdir -p $(KERNEL_OUT)
$(KERNEL_CONFIG): $(KERNEL_OUT)
$(MAKE) -C $(TARGET_KERNEL_SOURCE) O=$(BUILD_ROOT_LOC)$(KERNEL_OUT) $(KERNEL_MAKE_ENV) ARCH=$(KERNEL_ARCH) CROSS_COMPILE=$(KERNEL_CROSS_COMPILE) $(real_cc) $(KERNEL_DEFCONFIG)
$(KERNEL_CONFIG): $(TARGET_DEFCONFIG) | $(KERNEL_OUT)
$(call do-kernel-config,$(BUILD_ROOT_LOC)$(KERNEL_OUT),$@,$(TARGET_DEFCONFIG),$(TARGET_KERNEL_SOURCE),$(KERNEL_MAKE_ENV),$(KERNEL_ARCH),$(KERNEL_CROSS_COMPILE),$(MAKE),$(real_cc))
$(hide) if [ ! -z "$(KERNEL_CONFIG_OVERRIDE)" ]; then \
echo "Overriding kernel config with '$(KERNEL_CONFIG_OVERRIDE)'"; \
echo $(KERNEL_CONFIG_OVERRIDE) >> $(KERNEL_OUT)/.config; \
@ -164,8 +183,8 @@ $(KERNEL_CONFIG): $(KERNEL_OUT)
ifeq ($(TARGET_KERNEL_APPEND_DTB), true)
TARGET_PREBUILT_INT_KERNEL_IMAGE := $(KERNEL_OUT)/arch/$(KERNEL_ARCH)/boot/Image
$(TARGET_PREBUILT_INT_KERNEL_IMAGE): $(KERNEL_USR)
$(TARGET_PREBUILT_INT_KERNEL_IMAGE): $(KERNEL_OUT) $(KERNEL_HEADERS_INSTALL)
$(TARGET_PREBUILT_INT_KERNEL_IMAGE):| $(KERNEL_USR)
$(TARGET_PREBUILT_INT_KERNEL_IMAGE): | $(KERNEL_OUT) $(KERNEL_CONFIG) $(KERNEL_HEADERS_INSTALL)
$(hide) echo "Building kernel modules..."
$(MAKE) -C $(TARGET_KERNEL_SOURCE) O=$(BUILD_ROOT_LOC)$(KERNEL_OUT) $(KERNEL_MAKE_ENV) ARCH=$(KERNEL_ARCH) CROSS_COMPILE=$(KERNEL_CROSS_COMPILE) $(real_cc) $(KERNEL_CFLAGS) Image
$(MAKE) -C $(TARGET_KERNEL_SOURCE) O=$(BUILD_ROOT_LOC)$(KERNEL_OUT) $(KERNEL_MAKE_ENV) ARCH=$(KERNEL_ARCH) CROSS_COMPILE=$(KERNEL_CROSS_COMPILE) $(real_cc) $(KERNEL_CFLAGS) modules
@ -173,13 +192,13 @@ $(TARGET_PREBUILT_INT_KERNEL_IMAGE): $(KERNEL_OUT) $(KERNEL_HEADERS_INSTALL)
$(mv-modules)
$(clean-module-folder)
$(TARGET_PREBUILT_INT_KERNEL): $(TARGET_PREBUILT_INT_KERNEL_IMAGE)
$(TARGET_PREBUILT_INT_KERNEL): | $(TARGET_PREBUILT_INT_KERNEL_IMAGE)
$(hide) echo "Building kernel..."
$(hide) rm -rf $(KERNEL_OUT)/arch/$(KERNEL_ARCH)/boot/dts
$(MAKE) -C $(TARGET_KERNEL_SOURCE) O=$(BUILD_ROOT_LOC)$(KERNEL_OUT) $(KERNEL_MAKE_ENV) ARCH=$(KERNEL_ARCH) CROSS_COMPILE=$(KERNEL_CROSS_COMPILE) $(real_cc) $(KERNEL_CFLAGS)
else
TARGET_PREBUILT_INT_KERNEL_IMAGE := $(TARGET_PREBUILT_INT_KERNEL)
$(TARGET_PREBUILT_INT_KERNEL): $(KERNEL_OUT) $(KERNEL_HEADERS_INSTALL)
$(TARGET_PREBUILT_INT_KERNEL): | $(KERNEL_OUT) $(KERNEL_CONFIG) $(KERNEL_HEADERS_INSTALL)
$(hide) echo "Building kernel..."
$(MAKE) -C $(TARGET_KERNEL_SOURCE) O=$(BUILD_ROOT_LOC)$(KERNEL_OUT) $(KERNEL_MAKE_ENV) ARCH=$(KERNEL_ARCH) CROSS_COMPILE=$(KERNEL_CROSS_COMPILE) $(real_cc) $(KERNEL_CFLAGS)
$(MAKE) -C $(TARGET_KERNEL_SOURCE) O=$(BUILD_ROOT_LOC)$(KERNEL_OUT) $(KERNEL_MAKE_ENV) ARCH=$(KERNEL_ARCH) CROSS_COMPILE=$(KERNEL_CROSS_COMPILE) $(real_cc) $(KERNEL_CFLAGS) modules
@ -188,10 +207,10 @@ $(TARGET_PREBUILT_INT_KERNEL): $(KERNEL_OUT) $(KERNEL_HEADERS_INSTALL)
$(clean-module-folder)
endif
$(KERNEL_HEADERS_INSTALL): $(KERNEL_OUT)
$(KERNEL_HEADERS_INSTALL): | $(KERNEL_OUT)
$(hide) if [ ! -z "$(KERNEL_HEADER_DEFCONFIG)" ]; then \
rm -f $(BUILD_ROOT_LOC)$(KERNEL_CONFIG); \
$(MAKE) -C $(TARGET_KERNEL_SOURCE) O=$(BUILD_ROOT_LOC)$(KERNEL_OUT) $(KERNEL_MAKE_ENV) ARCH=$(KERNEL_HEADER_ARCH) CROSS_COMPILE=$(KERNEL_CROSS_COMPILE) $(real_cc) $(KERNEL_HEADER_DEFCONFIG); \
$(call do-kernel-config,$(BUILD_ROOT_LOC)$(KERNEL_OUT),$(KERNEL_CONFIG),$(KERNEL_HEADER_DEFCONFIG),$(TARGET_KERNEL_SOURCE),$(KERNEL_MAKE_ENV),$(KERNEL_ARCH),$(KERNEL_CROSS_COMPILE),$(MAKE),$(real_cc)); \
$(MAKE) -C $(TARGET_KERNEL_SOURCE) O=$(BUILD_ROOT_LOC)$(KERNEL_OUT) $(KERNEL_MAKE_ENV) ARCH=$(KERNEL_HEADER_ARCH) CROSS_COMPILE=$(KERNEL_CROSS_COMPILE) $(real_cc) headers_install;\
if [ -d "$(KERNEL_HEADERS_INSTALL)/include/bringup_headers" ]; then \
cp -Rf $(KERNEL_HEADERS_INSTALL)/include/bringup_headers/* $(KERNEL_HEADERS_INSTALL)/include/ ;\
@ -200,7 +219,7 @@ $(KERNEL_HEADERS_INSTALL): $(KERNEL_OUT)
$(hide) if [ "$(KERNEL_HEADER_DEFCONFIG)" != "$(KERNEL_DEFCONFIG)" ]; then \
echo "Used a different defconfig for header generation"; \
rm -f $(BUILD_ROOT_LOC)$(KERNEL_CONFIG); \
$(MAKE) -C $(TARGET_KERNEL_SOURCE) O=$(BUILD_ROOT_LOC)$(KERNEL_OUT) $(KERNEL_MAKE_ENV) ARCH=$(KERNEL_ARCH) CROSS_COMPILE=$(KERNEL_CROSS_COMPILE) $(real_cc) $(KERNEL_DEFCONFIG); fi
$(call do-kernel-config,$(BUILD_ROOT_LOC)$(KERNEL_OUT),$(KERNEL_CONFIG),$(TARGET_DEFCONFIG),$(TARGET_KERNEL_SOURCE),$(KERNEL_MAKE_ENV),$(KERNEL_ARCH),$(KERNEL_CROSS_COMPILE),$(MAKE),$(real_cc)); fi
$(hide) if [ ! -z "$(KERNEL_CONFIG_OVERRIDE)" ]; then \
echo "Overriding kernel config with '$(KERNEL_CONFIG_OVERRIDE)'"; \
echo $(KERNEL_CONFIG_OVERRIDE) >> $(KERNEL_OUT)/.config; \

View file

@ -18,6 +18,8 @@ CONFIG_IKCONFIG=y
CONFIG_IKCONFIG_PROC=y
CONFIG_IKHEADERS=y
CONFIG_LOG_CPU_MAX_BUF_SHIFT=17
CONFIG_MEMCG=y
CONFIG_MEMCG_SWAP=y
CONFIG_BLK_CGROUP=y
CONFIG_CGROUP_FREEZER=y
CONFIG_CPUSETS=y

View file

@ -19,6 +19,8 @@ CONFIG_IKCONFIG=y
CONFIG_IKCONFIG_PROC=y
CONFIG_IKHEADERS=y
CONFIG_LOG_CPU_MAX_BUF_SHIFT=17
CONFIG_MEMCG=y
CONFIG_MEMCG_SWAP=y
CONFIG_BLK_CGROUP=y
CONFIG_DEBUG_BLK_CGROUP=y
CONFIG_CGROUP_FREEZER=y

1
arch/arm/configs/vendor/ext_config vendored Symbolic link
View file

@ -0,0 +1 @@
../../../arm64/configs/vendor/ext_config

View file

@ -87,12 +87,14 @@ void arch_cpu_idle_enter(void)
#ifdef CONFIG_PL310_ERRATA_769419
wmb();
#endif
idle_notifier_call_chain(IDLE_START);
}
void arch_cpu_idle_exit(void)
{
idle_notifier_call_chain(IDLE_END);
ledtrig_cpu(CPU_LED_IDLE_END);
idle_notifier_call_chain(IDLE_END);
}
void __show_regs(struct pt_regs *regs)

View file

@ -835,6 +835,8 @@ static int __init early_mem(char *p)
u64 size;
u64 start;
char *endp;
struct memblock_region *r;
phys_addr_t region_end;
/*
* If the user specifies memory size, we
@ -843,8 +845,8 @@ static int __init early_mem(char *p)
*/
if (usermem == 0) {
usermem = 1;
memblock_remove(memblock_start_of_DRAM(),
memblock_end_of_DRAM() - memblock_start_of_DRAM());
//memblock_remove(memblock_start_of_DRAM(),
// memblock_end_of_DRAM() - memblock_start_of_DRAM() + 1);
}
start = PHYS_OFFSET;
@ -852,7 +854,16 @@ static int __init early_mem(char *p)
if (*endp == '@')
start = memparse(endp + 1, NULL);
arm_add_memory(start, size);
for_each_memblock(memory, r) {
region_end = r->base - 1 + r->size;
}
//memblock_mem_limit_remove_map(size);
memblock_cap_memory_range(0, start + size);
for_each_memblock(memory, r) {
region_end = r->base - 1 + r->size;
}
//arm_add_memory(start, size);
//memblock_remove(0x7e280000, 0x80000000 - 0x7e280000);
return 0;
}

View file

@ -1696,3 +1696,21 @@ source "arch/arm64/kvm/Kconfig"
if CRYPTO
source "arch/arm64/crypto/Kconfig"
endif
config AF_NOISE_ELIMINATION
bool "For elimnating AF resonance noise"
default n
help
Enable it only for produts that suffering AF resonance noise.
config CAMERA_FLASH_PWM
bool "control flash"
default n
help
Enable it only for produts that control flash.
config CAMERA_FLASH_IIC_COMPATIBLE
bool "auto select iic flash suppliers"
default n
help
Enable it, this is automatically selected flash supplers.

View file

@ -532,7 +532,7 @@ CONFIG_QCOM_APCS_IPC=y
CONFIG_IOMMU_IO_PGTABLE_FAST=y
CONFIG_ARM_SMMU=y
CONFIG_QCOM_LAZY_MAPPING=y
CONFIG_IOMMU_DEBUG=y
# CONFIG_IOMMU_DEBUG is not set
CONFIG_IOMMU_TESTS=y
CONFIG_RPMSG_CHAR=y
CONFIG_RPMSG_QCOM_GLINK_RPM=y
@ -663,7 +663,7 @@ CONFIG_MAGIC_SYSRQ=y
CONFIG_PANIC_TIMEOUT=5
CONFIG_SCHEDSTATS=y
# CONFIG_DEBUG_PREEMPT is not set
CONFIG_DEBUG_LIST=y
# CONFIG_DEBUG_LIST is not set
CONFIG_IPC_LOGGING=y
CONFIG_CORESIGHT=y
CONFIG_CORESIGHT_LINK_AND_SINK_TMC=y
@ -677,3 +677,4 @@ CONFIG_CORESIGHT_HWEVENT=y
CONFIG_CORESIGHT_DUMMY=y
CONFIG_CORESIGHT_REMOTE_ETM=y
CONFIG_CORESIGHT_TGU=y
# CONFIG_SLUB_DEBUG is not set

View file

@ -0,0 +1,19 @@
#
# Please avoid changing the Qualcomm defconfig files and use this file to
# add any Motorola-specific configuration changes that are applicable to
# userdebug, eng, and user builds.
#
# After building, a list of all of the config files that are used can be found
# at the top of:
# out/target/product/$(PRODUCT)/obj/KERNEL_OBJ/mapphone_defconfig
#
# The actual output of the kernel configuration system can be found at:
# out/target/product/$(PRODUCT)/obj/KERNEL_OBJ/.config
#
# You can check the .config file to verify that your configuration option is
# being set as expected.
#
CONFIG_BORNEO_DTB=y
# CONFIG_BAT_NTC_10K is not set
CONFIG_PANEL_NOTIFICATIONS=y
# CONFIG_SMB1355_SLAVE_CHARGER is not set

View file

@ -0,0 +1,41 @@
#
# Please avoid changing the Qualcomm defconfig files and use this file to
# add any Motorola-specific configuration changes that are applicable to
# userdebug, eng, and user builds.
#
# After building, a list of all of the config files that are used can be found
# at the top of:
# out/target/product/$(PRODUCT)/obj/KERNEL_OBJ/mapphone_defconfig
#
# The actual output of the kernel configuration system can be found at:
# out/target/product/$(PRODUCT)/obj/KERNEL_OBJ/.config
#
# You can check the .config file to verify that your configuration option is
# being set as expected.
#
CONFIG_CAPRI_DTB=y
CONFIG_BAT_NTC_10K=y
CONFIG_PANEL_NOTIFICATIONS=y
# CONFIG_SMB1355_SLAVE_CHARGER is not set
CONFIG_NFC_NQ=y
# Android R compatibility requirements
CONFIG_ANDROID_BINDERFS=y
CONFIG_BPF_JIT=y
CONFIG_BPF_JIT_ALWAYS_ON=y
# CONFIG_CRYPTO_MD4 is not set
CONFIG_DM_SNAPSHOT=y
CONFIG_FS_VERITY=y
CONFIG_FS_VERITY_BUILTIN_SIGNATURES=y
# CONFIG_FW_CACHE is not set
# CONFIG_MODULE_FORCE_UNLOAD is not set
# CONFIG_PM_AUTOSLEEP is not set
# CONFIG_RT_GROUP_SCHED is not set
CONFIG_STATIC_USERMODEHELPER=y
CONFIG_UTS_NS=y
CONFIG_VETH=y
CONFIG_ARM64_SW_TTBR0_PAN=y
# DISALLOW_CONFIG_IKHEADERS_IS_N
CONFIG_IKHEADERS=y
CONFIG_EXT4_FS_POSIX_ACL=y
CONFIG_DEBUG_LIST=y

View file

@ -0,0 +1,42 @@
#
# Please avoid changing the Qualcomm defconfig files and use this file to
# add any Motorola-specific configuration changes that are applicable to
# userdebug, eng, and user builds.
#
# After building, a list of all of the config files that are used can be found
# at the top of:
# out/target/product/$(PRODUCT)/obj/KERNEL_OBJ/mapphone_defconfig
#
# The actual output of the kernel configuration system can be found at:
# out/target/product/$(PRODUCT)/obj/KERNEL_OBJ/.config
#
# You can check the .config file to verify that your configuration option is
# being set as expected.
#
CONFIG_CAPRIP_DTB=y
CONFIG_BAT_NTC_10K=y
CONFIG_PANEL_NOTIFICATIONS=y
# CONFIG_SMB1355_SLAVE_CHARGER is not set
CONFIG_NFC_NQ=y
# Android R compatibility requirements
CONFIG_ANDROID_BINDERFS=y
CONFIG_BPF_JIT=y
CONFIG_BPF_JIT_ALWAYS_ON=y
# CONFIG_CRYPTO_MD4 is not set
CONFIG_DM_SNAPSHOT=y
CONFIG_FS_VERITY=y
CONFIG_FS_VERITY_BUILTIN_SIGNATURES=y
# CONFIG_FW_CACHE is not set
# CONFIG_MODULE_FORCE_UNLOAD is not set
# CONFIG_PM_AUTOSLEEP is not set
# CONFIG_RT_GROUP_SCHED is not set
CONFIG_STATIC_USERMODEHELPER=y
CONFIG_UTS_NS=y
CONFIG_VETH=y
CONFIG_ARM64_SW_TTBR0_PAN=y
# DISALLOW_CONFIG_IKHEADERS_IS_N
CONFIG_IKHEADERS=y
CONFIG_EXT4_FS_POSIX_ACL=y
CONFIG_DEBUG_LIST=y
CONFIG_AF_NOISE_ELIMINATION=y

View file

@ -0,0 +1,42 @@
#
# Please avoid changing the Qualcomm defconfig files and use this file to
# add any Motorola-specific configuration changes that are applicable to
# userdebug, eng, and user builds.
#
# After building, a list of all of the config files that are used can be found
# at the top of:
# out/target/product/$(PRODUCT)/obj/KERNEL_OBJ/mapphone_defconfig
#
# The actual output of the kernel configuration system can be found at:
# out/target/product/$(PRODUCT)/obj/KERNEL_OBJ/.config
#
# You can check the .config file to verify that your configuration option is
# being set as expected.
#
CONFIG_CEBU_DTB=y
# CONFIG_BAT_NTC_10K is not set
CONFIG_PANEL_NOTIFICATIONS=y
# CONFIG_SMB1355_SLAVE_CHARGER is not set
CONFIG_NFC_NQ=y
# Android R compatibility requirements
CONFIG_ANDROID_BINDERFS=y
CONFIG_BPF_JIT=y
CONFIG_BPF_JIT_ALWAYS_ON=y
# CONFIG_CRYPTO_MD4 is not set
CONFIG_DM_SNAPSHOT=y
CONFIG_FS_VERITY=y
CONFIG_FS_VERITY_BUILTIN_SIGNATURES=y
# CONFIG_FW_CACHE is not set
# CONFIG_MODULE_FORCE_UNLOAD is not set
# CONFIG_PM_AUTOSLEEP is not set
# CONFIG_RT_GROUP_SCHED is not set
CONFIG_STATIC_USERMODEHELPER=y
CONFIG_UTS_NS=y
CONFIG_VETH=y
CONFIG_ARM64_SW_TTBR0_PAN=y
# DISALLOW_CONFIG_IKHEADERS_IS_N
CONFIG_IKHEADERS=y
CONFIG_EXT4_FS_POSIX_ACL=y
CONFIG_FS_ENCRYPTION_INLINE_CRYPT=y

View file

@ -0,0 +1,57 @@
#
# Please avoid changing the Qualcomm defconfig files and use this file to
# add any Motorola-specific configuration changes that are applicable to
# userdebug, eng, and user builds.
#
# After building, a list of all of the config files that are used can be found
# at the top of:
# out/target/product/$(PRODUCT)/obj/KERNEL_OBJ/mapphone_defconfig
#
# The actual output of the kernel configuration system can be found at:
# out/target/product/$(PRODUCT)/obj/KERNEL_OBJ/.config
#
# You can check the .config file to verify that your configuration option is
# being set as expected.
#
CONFIG_AT803X_PHY=y
CONFIG_BACKLIGHT_GENERIC=m
CONFIG_BRIDGE_EBT_ARPREPLY=y
CONFIG_BRIDGE_EBT_DNAT=y
CONFIG_BRIDGE_EBT_SNAT=y
CONFIG_BRIDGE_EBT_T_FILTER=y
CONFIG_BRIDGE_EBT_T_NAT=y
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
CONFIG_CFG80211_INTERNAL_REGDB=y
CONFIG_DEBUG_OBJECTS_FREE=y
CONFIG_DEBUG_OBJECTS_PERCPU_COUNTER=y
CONFIG_DEBUG_OBJECTS_RCU_HEAD=y
CONFIG_DEBUG_OBJECTS_TIMERS=y
CONFIG_DEBUG_OBJECTS_WORK=y
CONFIG_DEBUG_OBJECTS=y
CONFIG_DEVTMPFS_MOUNT=y
CONFIG_EFIVAR_FS=y
CONFIG_EFI=y
CONFIG_EXTCON_USB_GPIO=y
CONFIG_HIDRAW=y
CONFIG_INPUT_EVBUG=m
CONFIG_INPUT_GPIO=y
CONFIG_INPUT_KEYRESET=y
CONFIG_INPUT_TABLET=y
CONFIG_MEDIA_RADIO_SUPPORT=y
# CONFIG_MSM_JTAGV8 is not set
CONFIG_NLS_ASCII=y
CONFIG_PANIC_ON_OOPS=y
CONFIG_POSIX_MQUEUE=y
CONFIG_PTP_1588_CLOCK=y
CONFIG_QCOM_CPUSS_DUMP=y
CONFIG_SOC_CAMERA_PLATFORM=y
CONFIG_SOC_CAMERA=y
CONFIG_SPI_DEBUG=y
CONFIG_SPI_QUP=y
CONFIG_SPMI_MSM_PMIC_ARB_DEBUG=y
CONFIG_TASK_DELAY_ACCT=y
CONFIG_UFS_FAULT_INJECTION=y
CONFIG_USB_SERIAL=y
CONFIG_XZ_DEC=y

View file

@ -0,0 +1,24 @@
#
# Please avoid changing the Qualcomm defconfig files and use this file to
# add any Motorola-specific configuration changes that are applicable to
# userdebug, eng, and user builds.
#
# After building, a list of all of the config files that are used can be found
# at the top of:
# out/target/product/$(PRODUCT)/obj/KERNEL_OBJ/mapphone_defconfig
#
# The actual output of the kernel configuration system can be found at:
# out/target/product/$(PRODUCT)/obj/KERNEL_OBJ/.config
#
# You can check the .config file to verify that your configuration option is
# being set as expected.
#
CONFIG_ARM64_STRICT_BREAK_BEFORE_MAKE=y
CONFIG_EDAC_CORTEX_ARM64_DBE_IRQ_ONLY=y
CONFIG_EDAC_CORTEX_ARM64_PANIC_ON_UE=y
CONFIG_EDAC_CORTEX_ARM64=y
CONFIG_FUNCTION_TRACER=y
CONFIG_PAGE_POISONING=y
CONFIG_PRINT_VMEMLAYOUT=y
CONFIG_SCSI_UFSHCD_CMD_LOGGING=y
CONFIG_KPROBES=y

View file

@ -0,0 +1,16 @@
#
# Please avoid changing the Qualcomm defconfig files and use this file to
# add any Motorola-specific configuration changes that are applicable to
# userdebug, eng, and user builds.
#
# After building, a list of all of the config files that are used can be found
# at the top of:
# out/target/product/$(PRODUCT)/obj/KERNEL_OBJ/mapphone_defconfig
#
# The actual output of the kernel configuration system can be found at:
# out/target/product/$(PRODUCT)/obj/KERNEL_OBJ/.config
#
# You can check the .config file to verify that your configuration option is
# being set as expected.
#

View file

@ -0,0 +1,16 @@
#
# Please avoid changing the Qualcomm defconfig files and use this file to
# add any Motorola-specific configuration changes that are applicable to
# userdebug, eng, and user builds.
#
# After building, a list of all of the config files that are used can be found
# at the top of:
# out/target/product/$(PRODUCT)/obj/KERNEL_OBJ/mapphone_defconfig
#
# The actual output of the kernel configuration system can be found at:
# out/target/product/$(PRODUCT)/obj/KERNEL_OBJ/.config
#
# You can check the .config file to verify that your configuration option is
# being set as expected.
#

View file

@ -0,0 +1,16 @@
#
# Please avoid changing the Qualcomm defconfig files and use this file to
# add any Motorola-specific configuration changes that are applicable to
# userdebug, eng, and user builds.
#
# After building, a list of all of the config files that are used can be found
# at the top of:
# out/target/product/$(PRODUCT)/obj/KERNEL_OBJ/mapphone_defconfig
#
# The actual output of the kernel configuration system can be found at:
# out/target/product/$(PRODUCT)/obj/KERNEL_OBJ/.config
#
# You can check the .config file to verify that your configuration option is
# being set as expected.
#

View file

@ -0,0 +1,16 @@
#
# Please avoid changing the Qualcomm defconfig files and use this file to
# add any Motorola-specific configuration changes that are applicable to
# userdebug, eng, and user builds.
#
# After building, a list of all of the config files that are used can be found
# at the top of:
# out/target/product/$(PRODUCT)/obj/KERNEL_OBJ/mapphone_defconfig
#
# The actual output of the kernel configuration system can be found at:
# out/target/product/$(PRODUCT)/obj/KERNEL_OBJ/.config
#
# You can check the .config file to verify that your configuration option is
# being set as expected.
#

View file

@ -0,0 +1,16 @@
#
# Please avoid changing the Qualcomm defconfig files and use this file to
# add any Motorola-specific configuration changes that are applicable to
# userdebug, eng, and user builds.
#
# After building, a list of all of the config files that are used can be found
# at the top of:
# out/target/product/$(PRODUCT)/obj/KERNEL_OBJ/mapphone_defconfig
#
# The actual output of the kernel configuration system can be found at:
# out/target/product/$(PRODUCT)/obj/KERNEL_OBJ/.config
#
# You can check the .config file to verify that your configuration option is
# being set as expected.
#

View file

@ -0,0 +1,16 @@
#
# Please avoid changing the Qualcomm defconfig files and use this file to
# add any Motorola-specific configuration changes that are applicable to
# userdebug, eng, and user builds.
#
# After building, a list of all of the config files that are used can be found
# at the top of:
# out/target/product/$(PRODUCT)/obj/KERNEL_OBJ/mapphone_defconfig
#
# The actual output of the kernel configuration system can be found at:
# out/target/product/$(PRODUCT)/obj/KERNEL_OBJ/.config
#
# You can check the .config file to verify that your configuration option is
# being set as expected.
#

View file

@ -0,0 +1,17 @@
#
# Please avoid changing the Qualcomm defconfig files and use this file to
# add any Motorola-specific configuration changes that are applicable to
# userdebug, eng, and user builds.
#
# After building, a list of all of the config files that are used can be found
# at the top of:
# out/target/product/$(PRODUCT)/obj/KERNEL_OBJ/mapphone_defconfig
#
# The actual output of the kernel configuration system can be found at:
# out/target/product/$(PRODUCT)/obj/KERNEL_OBJ/.config
#
# You can check the .config file to verify that your configuration option is
# being set as expected.
#
# CONFIG_DEBUG_PANIC_ON_OOM is not set

View file

@ -0,0 +1,16 @@
#
# Please avoid changing the Qualcomm defconfig files and use this file to
# add any Motorola-specific configuration changes that are applicable to
# userdebug, eng, and user builds.
#
# After building, a list of all of the config files that are used can be found
# at the top of:
# out/target/product/$(PRODUCT)/obj/KERNEL_OBJ/mapphone_defconfig
#
# The actual output of the kernel configuration system can be found at:
# out/target/product/$(PRODUCT)/obj/KERNEL_OBJ/.config
#
# You can check the .config file to verify that your configuration option is
# being set as expected.
#

View file

@ -0,0 +1,16 @@
#
# Please avoid changing the Qualcomm defconfig files and use this file to
# add any Motorola-specific configuration changes that are applicable to
# userdebug, eng, and user builds.
#
# After building, a list of all of the config files that are used can be found
# at the top of:
# out/target/product/$(PRODUCT)/obj/KERNEL_OBJ/mapphone_defconfig
#
# The actual output of the kernel configuration system can be found at:
# out/target/product/$(PRODUCT)/obj/KERNEL_OBJ/.config
#
# You can check the .config file to verify that your configuration option is
# being set as expected.
#

View file

@ -0,0 +1,16 @@
#
# Please avoid changing the Qualcomm defconfig files and use this file to
# add any Motorola-specific configuration changes that are applicable to
# userdebug, eng, and user builds.
#
# After building, a list of all of the config files that are used can be found
# at the top of:
# out/target/product/$(PRODUCT)/obj/KERNEL_OBJ/mapphone_defconfig
#
# The actual output of the kernel configuration system can be found at:
# out/target/product/$(PRODUCT)/obj/KERNEL_OBJ/.config
#
# You can check the .config file to verify that your configuration option is
# being set as expected.
#

View file

@ -0,0 +1,88 @@
#
# Please avoid changing the Qualcomm defconfig files and use this file to
# add any Motorola-specific configuration changes that are applicable to
# userdebug, eng, and user builds.
#
# After building, a list of all of the config files that are used can be found
# at the top of:
# out/target/product/$(PRODUCT)/obj/KERNEL_OBJ/mapphone_defconfig
#
# The actual output of the kernel configuration system can be found at:
# out/target/product/$(PRODUCT)/obj/KERNEL_OBJ/.config
#
# You can check the .config file to verify that your configuration option is
# being set as expected.
#
CONFIG_LKDTM=m
CONFIG_ATOMIC64_SELFTEST=m
CONFIG_LOCK_TORTURE_TEST=m
# CONFIG_RCU_TORTURE_TEST is not set
# CONFIG_TEST_USER_COPY is no set
CONFIG_DEBUG_BLK_CGROUP=y
# CONFIG_CGROUP_DEBUG is not set
CONFIG_SLUB_DEBUG=y
# CONFIG_SLUB_DEBUG_ON is not set
CONFIG_PM_DEBUG=y
# CONFIG_CLEANCACHE is not set
# CONFIG_CMA_DEBUG is not set
# CONFIG_CMA_ALLOW_WRITE_DEBUGFS is not set
CONFIG_L2TP_DEBUGFS=y
CONFIG_SERIAL_MSM_GENI_CONSOLE=y
CONFIG_TTY_PRINTK=y
CONFIG_MMC_IPC_LOGGING=y
CONFIG_EDAC=y
CONFIG_QCOM_GPI_DMA_DEBUG=y
CONFIG_IOMMU_TLBSYNC_DEBUG=y
CONFIG_ARM_SMMU_TESTBUS_DUMP=y
CONFIG_MSM_CORE_HANG_DETECT=y
CONFIG_MSM_GLADIATOR_HANG_DETECT=y
CONFIG_MSM_GLADIATOR_ERP=y
CONFIG_PANIC_ON_GLADIATOR_ERROR=y
CONFIG_ICNSS_DEBUG=y
CONFIG_F2FS_CHECK_FS=y
CONFIG_DYNAMIC_DEBUG=y
# CONFIG_DEBUG_CONSOLE_UNHASHED_POINTERS is not set
CONFIG_DEBUG_MODULE_LOAD_INFO=y
# CONFIG_PAGE_OWNER is not set
CONFIG_DEBUG_SECTION_MISMATCH=y
# CONFIG_DEBUG_PAGEALLOC is not set
# CONFIG_DEBUG_PANIC_ON_OOM is not set
# CONFIG_DEBUG_PAGEALLOC_ENABLE_DEFAULT is not set
CONFIG_PAGE_POISONING=y
# CONFIG_PAGE_POISONING_ENABLE_DEFAULT is not set
# CONFIG_DEBUG_KMEMLEAK is not set
CONFIG_DEBUG_STACK_USAGE=y
CONFIG_DEBUG_MEMORY_INIT=y
CONFIG_SOFTLOCKUP_DETECTOR=y
CONFIG_WQ_WATCHDOG=y
CONFIG_PANIC_ON_SCHED_BUG=y
CONFIG_PANIC_ON_RT_THROTTLING=y
CONFIG_SCHED_STACK_END_CHECK=y
CONFIG_DEBUG_SPINLOCK=y
CONFIG_DEBUG_MUTEXES=y
CONFIG_DEBUG_ATOMIC_SLEEP=y
CONFIG_DEBUG_SG=y
CONFIG_DEBUG_NOTIFIERS=y
CONFIG_DEBUG_CREDENTIALS=y
CONFIG_FAULT_INJECTION=y
CONFIG_FAIL_PAGE_ALLOC=y
CONFIG_FAULT_INJECTION_DEBUG_FS=y
CONFIG_FAULT_INJECTION_STACKTRACE_FILTER=y
CONFIG_QCOM_RTB=y
CONFIG_QCOM_RTB_SEPARATE_CPUS=y
# CONFIG_PREEMPTIRQ_EVENTS is not set
CONFIG_IRQSOFF_TRACER=y
# CONFIG_PREEMPT_TRACER is not set
CONFIG_BLK_DEV_IO_TRACE=y
CONFIG_MEMTEST=y
CONFIG_SCSI_LOGGING=y
CONFIG_BUG_ON_DATA_CORRUPTION=y
CONFIG_PANIC_ON_DATA_CORRUPTION=y
CONFIG_PID_IN_CONTEXTIDR=y
CONFIG_CORESIGHT_SOURCE_ETM4X=y
CONFIG_SUSPEND_DEBUG=y
CONFIG_CPU_FREQ_STAT=y
CONFIG_THERMAL_EMULATION=y
# CONFIG_MODULE_SIG is not set
CONFIG_CRYPTO_SHA512=y
CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC=y

View file

@ -0,0 +1,59 @@
#
# Please avoid changing the Qualcomm defconfig files and use this file to
# add any Motorola-specific configuration changes that are applicable to
# userdebug, eng, and user builds.
#
# After building, a list of all of the config files that are used can be found
# at the top of:
# out/target/product/$(PRODUCT)/obj/KERNEL_OBJ/mapphone_defconfig
#
# The actual output of the kernel configuration system can be found at:
# out/target/product/$(PRODUCT)/obj/KERNEL_OBJ/.config
#
# You can check the .config file to verify that your configuration option is
# being set as expected.
#
CONFIG_DEVON_DTB=y
CONFIG_BAT_NTC_10K=y
CONFIG_PANEL_NOTIFICATIONS=y
# CONFIG_TOUCHSCREEN_FTS is not set
# CONFIG_TOUCHSCREEN_NT36XXX is not set
# CONFIG_SMB1355_SLAVE_CHARGER is not set
# Android R compatibility requirements
CONFIG_ANDROID_BINDERFS=y
CONFIG_BPF_JIT=y
CONFIG_BPF_JIT_ALWAYS_ON=y
# CONFIG_CRYPTO_MD4 is not set
CONFIG_DM_SNAPSHOT=y
CONFIG_FS_VERITY=y
CONFIG_FS_VERITY_BUILTIN_SIGNATURES=y
# CONFIG_FW_CACHE is not set
# CONFIG_MODULE_FORCE_UNLOAD is not set
# CONFIG_PM_AUTOSLEEP is not set
# CONFIG_RT_GROUP_SCHED is not set
CONFIG_STATIC_USERMODEHELPER=y
CONFIG_UTS_NS=y
CONFIG_VETH=y
CONFIG_ARM64_SW_TTBR0_PAN=y
# DISALLOW_CONFIG_IKHEADERS_IS_N
CONFIG_IKHEADERS=y
CONFIG_EXT4_FS_POSIX_ACL=y
CONFIG_DEBUG_LIST=y
CONFIG_AF_NOISE_ELIMINATION=y
#
#[Samsung NFC] Add config by Edith
#
CONFIG_NFC=y
CONFIG_SEC_NFC=y
CONFIG_SEC_NFC_PRODUCT_N5=y
CONFIG_SEC_NFC_IF_I2C=y
# CONFIG_SEC_NFC_GPIO_CLK is not set
# CONFIG_SEC_NFC_PMIC_LDO is not set
# CONFIG_SEC_NFC_DEDICATED_CLK is not set
# CONFIG_SEC_ESE_COLDRESET is not set
CONFIG_ZRAM_WRITEBACK=y
CONFIG_CAMERA_FLASH_PWM=y
CONFIG_CRYPTO_LZ4=y
# CONFIG_QCOM_FSA4480_I2C is not set
CONFIG_CAMERA_FLASH_IIC_COMPATIBLE=y
CONFIG_CRYPTO_CHACHA20POLY1305=y

View file

@ -0,0 +1,20 @@
#
# Please avoid changing the Qualcomm defconfig files and use this file to
# add any Motorola-specific configuration changes that are applicable to
# userdebug, eng, and user builds.
#
# After building, a list of all of the config files that are used can be found
# at the top of:
# out/target/product/$(PRODUCT)/obj/KERNEL_OBJ/mapphone_defconfig
#
# The actual output of the kernel configuration system can be found at:
# out/target/product/$(PRODUCT)/obj/KERNEL_OBJ/.config
#
# You can check the .config file to verify that your configuration option is
# being set as expected.
#
#CONFIG_DEVMEM is not set
CONFIG_REGMAP_ALLOW_WRITE_DEBUGFS=y
CONFIG_SUSPEND_DEBUG=y
CONFIG_QCOM_I2C_NACK_ERR_WA_FAC=y

View file

@ -0,0 +1,39 @@
#
# Please avoid changing the Qualcomm defconfig files and use this file to
# add any Motorola-specific configuration changes that are applicable to
# userdebug, eng, and user builds.
#
# After building, a list of all of the config files that are used can be found
# at the top of:
# out/target/product/$(PRODUCT)/obj/KERNEL_OBJ/mapphone_defconfig
#
# The actual output of the kernel configuration system can be found at:
# out/target/product/$(PRODUCT)/obj/KERNEL_OBJ/.config
#
# You can check the .config file to verify that your configuration option is
# being set as expected.
#
CONFIG_GUAM_DTB=y
CONFIG_BAT_NTC_10K=y
CONFIG_PANEL_NOTIFICATIONS=y
# CONFIG_SMB1355_SLAVE_CHARGER is not set
# Android R compatibility requirements
CONFIG_ANDROID_BINDERFS=y
CONFIG_BPF_JIT=y
CONFIG_BPF_JIT_ALWAYS_ON=y
# CONFIG_CRYPTO_MD4 is not set
CONFIG_DM_SNAPSHOT=y
CONFIG_FS_VERITY=y
CONFIG_FS_VERITY_BUILTIN_SIGNATURES=y
# CONFIG_FW_CACHE is not set
# CONFIG_MODULE_FORCE_UNLOAD is not set
# CONFIG_PM_AUTOSLEEP is not set
# CONFIG_RT_GROUP_SCHED is not set
CONFIG_STATIC_USERMODEHELPER=y
CONFIG_UTS_NS=y
CONFIG_VETH=y
CONFIG_ARM64_SW_TTBR0_PAN=y
# DISALLOW_CONFIG_IKHEADERS_IS_N
CONFIG_IKHEADERS=y
CONFIG_EXT4_FS_POSIX_ACL=y

View file

@ -0,0 +1,19 @@
#
# Please avoid changing the Qualcomm defconfig files and use this file to
# add any Motorola-specific configuration changes that are applicable to
# userdebug, eng, and user builds.
#
# After building, a list of all of the config files that are used can be found
# at the top of:
# out/target/product/$(PRODUCT)/obj/KERNEL_OBJ/mapphone_defconfig
#
# The actual output of the kernel configuration system can be found at:
# out/target/product/$(PRODUCT)/obj/KERNEL_OBJ/.config
#
# You can check the .config file to verify that your configuration option is
# being set as expected.
#
CONFIG_GUAMNA_DTB=y
CONFIG_BAT_NTC_10K=y
CONFIG_PANEL_NOTIFICATIONS=y
# CONFIG_SMB1355_SLAVE_CHARGER is not set

View file

@ -0,0 +1,21 @@
#
# Please avoid changing the Qualcomm defconfig files and use this file to
# add any Motorola-specific configuration changes that are applicable to
# userdebug, eng, and user builds.
#
# After building, a list of all of the config files that are used can be found
# at the top of:
# out/target/product/$(PRODUCT)/obj/KERNEL_OBJ/mapphone_defconfig
#
# The actual output of the kernel configuration system can be found at:
# out/target/product/$(PRODUCT)/obj/KERNEL_OBJ/.config
#
# You can check the .config file to verify that your configuration option is
# being set as expected.
#
CONFIG_GUAMP_DTB=y
CONFIG_BAT_NTC_10K=y
CONFIG_PANEL_NOTIFICATIONS=y
# CONFIG_SMB1355_SLAVE_CHARGER is not set
CONFIG_NFC_NQ=y
CONFIG_FS_ENCRYPTION_INLINE_CRYPT=y

View file

@ -0,0 +1,60 @@
#
# Please avoid changing the Qualcomm defconfig files and use this file to
# add any Motorola-specific configuration changes that are applicable to
# userdebug, eng, and user builds.
#
# After building, a list of all of the config files that are used can be found
# at the top of:
# out/target/product/$(PRODUCT)/obj/KERNEL_OBJ/mapphone_defconfig
#
# The actual output of the kernel configuration system can be found at:
# out/target/product/$(PRODUCT)/obj/KERNEL_OBJ/.config
#
# You can check the .config file to verify that your configuration option is
# being set as expected.
#
CONFIG_HAWAO_DTB=y
CONFIG_BAT_NTC_10K=y
CONFIG_PANEL_NOTIFICATIONS=y
# CONFIG_TOUCHSCREEN_FTS is not set
# CONFIG_TOUCHSCREEN_NT36XXX is not set
# CONFIG_SMB1355_SLAVE_CHARGER is not set
# Android R compatibility requirements
CONFIG_ANDROID_BINDERFS=y
CONFIG_BPF_JIT=y
CONFIG_BPF_JIT_ALWAYS_ON=y
# CONFIG_CRYPTO_MD4 is not set
CONFIG_DM_SNAPSHOT=y
CONFIG_FS_VERITY=y
CONFIG_FS_VERITY_BUILTIN_SIGNATURES=y
# CONFIG_FW_CACHE is not set
# CONFIG_MODULE_FORCE_UNLOAD is not set
# CONFIG_PM_AUTOSLEEP is not set
# CONFIG_RT_GROUP_SCHED is not set
CONFIG_STATIC_USERMODEHELPER=y
CONFIG_UTS_NS=y
CONFIG_VETH=y
CONFIG_ARM64_SW_TTBR0_PAN=y
# DISALLOW_CONFIG_IKHEADERS_IS_N
CONFIG_IKHEADERS=y
CONFIG_EXT4_FS_POSIX_ACL=y
CONFIG_DEBUG_LIST=y
CONFIG_AF_NOISE_ELIMINATION=y
#
#[Samsung NFC] Add config by Edith
#
CONFIG_NFC=y
CONFIG_SEC_NFC=y
CONFIG_SEC_NFC_PRODUCT_N5=y
CONFIG_SEC_NFC_IF_I2C=y
# CONFIG_SEC_NFC_GPIO_CLK is not set
# CONFIG_SEC_NFC_PMIC_LDO is not set
# CONFIG_SEC_NFC_DEDICATED_CLK is not set
# CONFIG_SEC_ESE_COLDRESET is not set
CONFIG_ZRAM_WRITEBACK=y
CONFIG_CRYPTO_LZ4=y
# CONFIG_QCOM_FSA4480_I2C is not set
CONFIG_CAMERA_FLASH_IIC_COMPATIBLE=y
CONFIG_CRYPTO_CHACHA20POLY1305=y
#Add this for hawao longer the sd dedoune time
CONFIG_SD_INSERT_DEBOUNCE_DELAY_LONGER=y

View file

@ -0,0 +1,69 @@
#
# Please avoid changing the Qualcomm defconfig files and use this file to
# add any Motorola-specific configuration changes that are applicable to
# userdebug, eng, and user builds.
#
# After building, a list of all of the config files that are used can be found
# at the top of:
# out/target/product/$(PRODUCT)/obj/KERNEL_OBJ/mapphone_defconfig
#
# The actual output of the kernel configuration system can be found at:
# out/target/product/$(PRODUCT)/obj/KERNEL_OBJ/.config
#
# You can check the .config file to verify that your configuration option is
# being set as expected.
#
CONFIG_MMI_DEVICE_DTBS=y
CONFIG_PSTORE=y
CONFIG_PSTORE_CONSOLE=y
CONFIG_PSTORE_RAM=y
CONFIG_PSTORE_PMSG=y
# CONFIG_PSTORE_DEFLATE_COMPRESS is not set
CONFIG_HZ_300=y
# CONFIG_CGROUP_DEBUG is not set
CONFIG_SERIAL_MSM_GENI_CONSOLE=y
CONFIG_BUILD_ARM64_DT_OVERLAY=y
CONFIG_DIAG_OVER_TTY=y
CONFIG_USB_USBNET=y
CONFIG_USB_UAS=y
CONFIG_USB_CONFIGFS_ACM=y
CONFIG_U_SERIAL_CONSOLE=y
CONFIG_REGULATOR_FIXED_VOLTAGE=y
# CONFIG_CORESIGHT is not set
# CONFIG_CORESIGHT_LINK_AND_SINK_TMC is not set
# CONFIG_CORESIGHT_DYNAMIC_REPLICATOR is not set
# CONFIG_CORESIGHT_STM is not set
# CONFIG_CORESIGHT_CTI is not set
# CONFIG_CORESIGHT_CTI_SAVE_DISABLE is not set
# CONFIG_CORESIGHT_TPDA is not set
# CONFIG_CORESIGHT_TPDM is not set
# CONFIG_CORESIGHT_HWEVENT is not set
# CONFIG_CORESIGHT_DUMMY is not set
# CONFIG_CORESIGHT_REMOTE_ETM is not set
# CONFIG_CORESIGHT_TGU is not set
# CONFIG_NFC_NQ is not set
# CONFIG_SMB1355_SLAVE_CHARGER is not set
# CONFIG_EXT4_USE_FOR_EXT2 is not set
# CONFIG_EXT4_USE_FOR_EXT3 is not set
# CONFIG_TOUCHSCREEN_SYNAPTICS_TCM_REFLASH is not set
# CONFIG_TOUCHSCREEN_SYNAPTICS_TCM_RECOVERY is not set
# CONFIG_TOUCHSCREEN_ST is not set
# CONFIG_TOUCHSCREEN_SYNAPTICS_DSX is not set
# CONFIG_TOUCHSCREEN_SYNAPTICS_TCM is not set
# CONFIG_FPR_FPC is not set
CONFIG_DUAL_ROLE_USB_INTF=y
# CONFIG_ANDROID_LOW_MEMORY_KILLER is not set
CONFIG_PSI=y
# CONFIG_MEMORY_HOTPLUG is not set
# CONFIG_MEMORY_HOTPLUG_DEFAULT_ONLINE is not set
# CONFIG_MEMORY_HOTPLUG_MOVABLE_NODE is not set
# CONFIG_MEMORY_HOTREMOVE is not set
# CONFIG_OVERRIDE_MEMORY_LIMIT is not set
# CONFIG_HOTPLUG_SIZE_BITS is not set
# CONFIG_QCOM_MEM_OFFLINE is not set
CONFIG_MEDIA_USB_SUPPORT=y
CONFIG_USB_VIDEO_CLASS=y
# CONFIG_ZRAM_DEDUP is not set
CONFIG_ION_POOL_FILL_MARK=16
CONFIG_DEBUG_BUGVERBOSE=n
# CONFIG_SLAB_MERGE_DEFAULT is not set

View file

@ -0,0 +1,50 @@
#
# Please avoid changing the Qualcomm defconfig files and use this file to
# add any Motorola-specific configuration changes that are applicable to
# userdebug, eng, and user builds.
#
# After building, a list of all of the config files that are used can be found
# at the top of:
# out/target/product/$(PRODUCT)/obj/KERNEL_OBJ/mapphone_defconfig
#
# The actual output of the kernel configuration system can be found at:
# out/target/product/$(PRODUCT)/obj/KERNEL_OBJ/.config
#
# You can check the .config file to verify that your configuration option is
# being set as expected.
#
CONFIG_RHODE_DTB=y
CONFIG_BAT_NTC_10K=y
CONFIG_PANEL_NOTIFICATIONS=y
# CONFIG_SMB1355_SLAVE_CHARGER is not set
# Android R compatibility requirements
CONFIG_ANDROID_BINDERFS=y
CONFIG_BPF_JIT=y
CONFIG_BPF_JIT_ALWAYS_ON=y
# CONFIG_CRYPTO_MD4 is not set
CONFIG_DM_SNAPSHOT=y
CONFIG_FS_VERITY=y
CONFIG_FS_VERITY_BUILTIN_SIGNATURES=y
# CONFIG_FW_CACHE is not set
# CONFIG_MODULE_FORCE_UNLOAD is not set
# CONFIG_PM_AUTOSLEEP is not set
# CONFIG_RT_GROUP_SCHED is not set
CONFIG_STATIC_USERMODEHELPER=y
CONFIG_UTS_NS=y
CONFIG_VETH=y
CONFIG_ARM64_SW_TTBR0_PAN=y
# DISALLOW_CONFIG_IKHEADERS_IS_N
CONFIG_IKHEADERS=y
CONFIG_EXT4_FS_POSIX_ACL=y
CONFIG_DEBUG_LIST=y
CONFIG_AF_NOISE_ELIMINATION=y
CONFIG_NFC=y
CONFIG_SEC_NFC=y
CONFIG_SEC_NFC_PRODUCT_N5=y
CONFIG_SEC_NFC_IF_I2C=y
CONFIG_REGULATOR_WL2868C=y
CONFIG_CAMERA_FLASH_PWM=y
CONFIG_ZRAM_WRITEBACK=y
# CONFIG_QCOM_FSA4480_I2C is not set
CONFIG_CRYPTO_LZ4=y
CONFIG_CRYPTO_CHACHA20POLY1305=y

62
defconfig.mk Normal file
View file

@ -0,0 +1,62 @@
DEFCONFIGSRC := $(TARGET_KERNEL_SOURCE)/arch/$(KERNEL_ARCH)/configs
LJAPDEFCONFIGSRC := ${DEFCONFIGSRC}/vendor/ext_config
DEFCONFIG_BASENAME := $(subst -perf,,$(subst _defconfig,,$(notdir $(KERNEL_DEFCONFIG))))
PRODUCT_SPECIFIC_DEFCONFIGS := $(DEFCONFIGSRC)/$(KERNEL_DEFCONFIG) $(LJAPDEFCONFIGSRC)/moto-$(DEFCONFIG_BASENAME).config
TARGET_DEFCONFIG := $(KERNEL_OUT)/mapphone_defconfig
KERNEL_DEBUG_DEFCONFIG := $(LJAPDEFCONFIGSRC)/debug-$(DEFCONFIG_BASENAME).config
KERNEL_DEBUG_ARCH_DEFCONFIG := $(LJAPDEFCONFIGSRC)/debug-$(DEFCONFIG_BASENAME)-$(KERNEL_ARCH).config
PRODUCT_KERNEL_DEBUG_DEFCONFIG := $(LJAPDEFCONFIGSRC)/$(PRODUCT_DEBUG_DEFCONFIG)
FACTORY_DEFCONFIG := $(LJAPDEFCONFIGSRC)/factory-$(DEFCONFIG_BASENAME).config
KERNEL_DEBUG_FS_DEFCONFIG := ${DEFCONFIGSRC}/vendor/debugfs.config
# add debug config file for non-user build
ifneq ($(TARGET_BUILD_VARIANT), user)
ifneq ($(TARGET_NO_KERNEL_DEBUG), true)
ifneq ($(wildcard $(KERNEL_DEBUG_DEFCONFIG)),)
PRODUCT_SPECIFIC_DEFCONFIGS += $(KERNEL_DEBUG_DEFCONFIG)
# add arch arm/arm64 debug config
ifneq ($(wildcard $(KERNEL_DEBUG_ARCH_DEFCONFIG)),)
PRODUCT_SPECIFIC_DEFCONFIGS += $(KERNEL_DEBUG_ARCH_DEFCONFIG)
endif
# Add a product-specific debug defconfig, too
ifneq ($(wildcard $(PRODUCT_KERNEL_DEBUG_DEFCONFIG)),)
PRODUCT_SPECIFIC_DEFCONFIGS += $(PRODUCT_KERNEL_DEBUG_DEFCONFIG)
endif
endif
endif
endif
ifeq ($(TARGET_FACTORY_DEFCONFIG), true)
PRODUCT_SPECIFIC_DEFCONFIGS += $(FACTORY_DEFCONFIG)
endif
# append all additional configs
ifneq ($(KERNEL_EXTRA_CONFIG),)
PRODUCT_SPECIFIC_DEFCONFIGS += $(KERNEL_EXTRA_CONFIG:%=$(LJAPDEFCONFIGSRC)/%.config)
endif
ifeq ($(TARGET_BUILD_VARIANT), user)
ifeq (true,$(call math_gt_or_eq,$(SHIPPING_API_LEVEL),30))
# disable debug fs
PRODUCT_SPECIFIC_DEFCONFIGS += $(KERNEL_DEBUG_FS_DEFCONFIG)
endif
endif
define do-make-defconfig
$(hide) mkdir -p $(dir $(1))
( perl -le 'print "# This file was automatically generated from:\n#\t" . join("\n#\t", @ARGV) . "\n"' $(2) && cat $(2) ) > $(1) || ( rm -f $(1) && false )
endef
#When building MSI, moto config does not really take effect
ifneq ($(findstring msi, $(TARGET_PRODUCT)),)
PRODUCT_SPECIFIC_DEFCONFIGS := $(DEFCONFIGSRC)/$(KERNEL_DEFCONFIG)
endif
#
# make combined defconfig file
#---------------------------------------
$(TARGET_DEFCONFIG): $(PRODUCT_SPECIFIC_DEFCONFIGS)
$(call do-make-defconfig,$@,$(PRODUCT_SPECIFIC_DEFCONFIGS))

View file

@ -438,7 +438,7 @@ static pm_callback_t pm_noirq_op(const struct dev_pm_ops *ops, pm_message_t stat
static void pm_dev_dbg(struct device *dev, pm_message_t state, const char *info)
{
dev_dbg(dev, "%s%s%s\n", info, pm_verb(state.event),
dev_info(dev, "%s%s%s\n", info, pm_verb(state.event),
((state.event & PM_EVENT_SLEEP) && device_may_wakeup(dev)) ?
", may wakeup" : "");
}
@ -464,7 +464,7 @@ static void dpm_show_time(ktime_t starttime, pm_message_t state, int error,
if (usecs == 0)
usecs = 1;
pm_pr_dbg("%s%s%s of devices %s after %ld.%03ld msecs\n",
pr_info("%s%s%s of devices %s after %ld.%03ld msecs\n",
info ?: "", info ? " " : "", pm_verb(state.event),
error ? "aborted" : "complete",
usecs / USEC_PER_MSEC, usecs % USEC_PER_MSEC);

View file

@ -861,7 +861,7 @@ void pm_print_active_wakeup_sources(void)
srcuidx = srcu_read_lock(&wakeup_srcu);
list_for_each_entry_rcu(ws, &wakeup_sources, entry) {
if (ws->active) {
pr_debug("active wakeup source: %s\n", ws->name);
pr_info("active wakeup source: %s\n", ws->name);
active = 1;
} else if (!active &&
(!last_activity_ws ||
@ -872,7 +872,7 @@ void pm_print_active_wakeup_sources(void)
}
if (!active && last_activity_ws)
pr_debug("last active wakeup source: %s\n",
pr_info("last active wakeup source: %s\n",
last_activity_ws->name);
srcu_read_unlock(&wakeup_srcu, srcuidx);
}
@ -1158,6 +1158,33 @@ static const struct seq_operations wakeup_sources_stats_seq_ops = {
.show = wakeup_sources_stats_seq_show,
};
int wakelock_dump_active_info(char *buf, int size)
{
struct wakeup_source *ws;
unsigned long flags;
char *p = buf;
rcu_read_lock();
list_for_each_entry_rcu(ws, &wakeup_sources, entry) {
spin_lock_irqsave(&ws->lock, flags);
if (ws->active) {
if (time_after(ws->timer_expires, jiffies)) {
long timeout = ws->timer_expires - jiffies;
p += snprintf(p, size - (p - buf),
" (active)[%s], time left %d (msecs)\n",
ws->name, jiffies_to_msecs(timeout));
} else /* active */
p += snprintf(p, size - (p - buf),
" (active)[%s]\n", ws->name);
}
spin_unlock_irqrestore(&ws->lock, flags);
}
rcu_read_unlock();
return p - buf;
}
static int wakeup_sources_stats_open(struct inode *inode, struct file *file)
{
return seq_open_private(file, &wakeup_sources_stats_seq_ops, sizeof(int));

View file

@ -25,6 +25,7 @@
#include <linux/genhd.h>
#include <linux/highmem.h>
#include <linux/slab.h>
#include <linux/swap.h>
#include <linux/backing-dev.h>
#include <linux/string.h>
#include <linux/vmalloc.h>
@ -1751,6 +1752,27 @@ static void zram_slot_free_notify(struct block_device *bdev,
zram_slot_unlock(zram, index);
}
/* Moto lulei1: check sync_io state on swap entry,
* return 0 on wb page, else return 1.
*/
#ifdef CONFIG_ZRAM_WRITEBACK
static int zram_ioctl(struct block_device *bdev, fmode_t mode,
unsigned int cmd, unsigned long index)
{
struct zram *zram;
int has_sync_io = 1;
if (cmd != SWP_SYNCHRONOUS_IO) return -EINVAL;
zram = bdev->bd_disk->private_data;
zram_slot_lock(zram, index);
has_sync_io = zram_test_flag(zram, index, ZRAM_WB) ? 0 : 1;
zram_slot_unlock(zram, index);
return has_sync_io;
}
#endif
static int zram_rw_page(struct block_device *bdev, sector_t sector,
struct page *page, unsigned int op)
{
@ -1943,6 +1965,9 @@ static int zram_open(struct block_device *bdev, fmode_t mode)
static const struct block_device_operations zram_devops = {
.open = zram_open,
.swap_slot_free_notify = zram_slot_free_notify,
#ifdef CONFIG_ZRAM_WRITEBACK
.ioctl = zram_ioctl,
#endif
.rw_page = zram_rw_page,
.owner = THIS_MODULE
};

View file

@ -36,4 +36,11 @@ config DIAGFWD_BRIDGE_CODE
over MHI or SMUX to communicate with the remote processors and
receive/send diag traffic to remote processors.
config DIAG_OVER_TTY
bool "Enable DIAG traffic to go over a tty to userspace"
depends on ARCH_QCOM && DIAG_OVER_USB
default n
help
This feature helps segregate code required for DIAG traffic to go over a TTY to userspace.
endmenu

View file

@ -352,7 +352,8 @@ static void usb_read_done_work_fn(struct work_struct *work)
}
static void diag_usb_write_done(struct diag_usb_info *ch,
struct diag_request *req)
struct diag_request *req,
int sync)
{
int ctxt = 0;
int len = 0;
@ -362,14 +363,15 @@ static void diag_usb_write_done(struct diag_usb_info *ch,
if (!ch || !req)
return;
spin_lock_irqsave(&ch->write_lock, flags);
if (!sync)
spin_lock_irqsave(&ch->write_lock, flags);
ch->write_cnt++;
entry = diag_usb_buf_tbl_get(ch, req->context);
if (!entry) {
pr_err_ratelimited("diag: In %s, unable to find entry %pK in the table\n",
__func__, req->context);
spin_unlock_irqrestore(&ch->write_lock, flags);
if (!sync)
spin_unlock_irqrestore(&ch->write_lock, flags);
return;
}
if (atomic_read(&entry->ref_count) != 0) {
@ -377,7 +379,8 @@ static void diag_usb_write_done(struct diag_usb_info *ch,
atomic_read(&entry->ref_count));
diag_ws_on_copy_complete(DIAG_WS_MUX);
diagmem_free(driver, req, ch->mempool);
spin_unlock_irqrestore(&ch->write_lock, flags);
if (!sync)
spin_unlock_irqrestore(&ch->write_lock, flags);
return;
}
DIAG_LOG(DIAG_DEBUG_MUX, "full write_done\n");
@ -394,7 +397,8 @@ static void diag_usb_write_done(struct diag_usb_info *ch,
len = 0;
ctxt = 0;
diagmem_free(driver, req, ch->mempool);
spin_unlock_irqrestore(&ch->write_lock, flags);
if(!sync)
spin_unlock_irqrestore(&ch->write_lock, flags);
}
static void diag_usb_notifier(void *priv, unsigned int event,
@ -439,7 +443,10 @@ static void diag_usb_notifier(void *priv, unsigned int event,
&usb_info->read_done_work);
break;
case USB_DIAG_WRITE_DONE:
diag_usb_write_done(usb_info, d_req);
diag_usb_write_done(usb_info, d_req, 0);
break;
case USB_DIAG_WRITE_DONE_SYNC:
diag_usb_write_done(usb_info, d_req, 1);
break;
default:
pr_err_ratelimited("diag: Unknown event from USB diag\n");

View file

@ -466,6 +466,9 @@ static long dma_buf_ioctl(struct file *file,
case DMA_BUF_SET_NAME_B:
return dma_buf_set_name(dmabuf, (const char __user *)arg);
case DMA_BUF_IOCTL_IMPORT_BUF_ADD_BY_MOTO:
dmabuf->ops->import_buf_add_by_moto(dmabuf);
return 0;
default:
return -ENOTTY;
}

View file

@ -1,7 +1,6 @@
# SPDX-License-Identifier: GPL-2.0-only
config MSM_TZ_LOG
tristate "MSM Trust Zone (TZ) Log Driver"
depends on DEBUG_FS
help
This option enables a driver with a debugfs interface for messages
produced by the Secure code (Trust zone). These messages provide

View file

@ -23,6 +23,13 @@
#include <soc/qcom/qseecomi.h>
#include <soc/qcom/qtee_shmbridge.h>
#ifndef CONFIG_DEBUG_FS
#include <linux/proc_fs.h>
static struct proc_dir_entry *tzdbg_root;
#define TZDBG_ROOT_DIR "tzdbg"
#endif
/* QSEE_LOG_BUF_SIZE = 32K */
#define QSEE_LOG_BUF_SIZE 0x8000
@ -1131,7 +1138,11 @@ static ssize_t tzdbgfs_read_unencrypted(struct file *file, char __user *buf,
size_t count, loff_t *offp)
{
int len = 0;
int tz_id = *(int *)(file->private_data);
#ifdef CONFIG_DEBUG_FS
int tz_id = *(int *)(file->private_data);
#else
int tz_id = *(int *)((struct seq_file *)file->private_data)->private;
#endif
if (tz_id == TZDBG_BOOT || tz_id == TZDBG_RESET ||
tz_id == TZDBG_INTERRUPT || tz_id == TZDBG_GENERAL ||
@ -1196,7 +1207,11 @@ static ssize_t tzdbgfs_read_encrypted(struct file *file, char __user *buf,
size_t count, loff_t *offp)
{
int len = 0, ret = 0;
int tz_id = *(int *)(file->private_data);
#ifdef CONFIG_DEBUG_FS
int tz_id = *(int *)(file->private_data);
#else
int tz_id = *(int *)((struct seq_file *)file->private_data)->private;
#endif
struct tzdbg_stat *stat = &(tzdbg.stat[tz_id]);
pr_debug("%s: tz_id = %d\n", __func__, tz_id);
@ -1253,10 +1268,22 @@ static ssize_t tzdbgfs_read(struct file *file, char __user *buf,
return tzdbgfs_read_encrypted(file, buf, count, offp);
}
#ifndef CONFIG_DEBUG_FS
static int tzdbg_proc_open(struct inode *inode, struct file *file)
{
return single_open(file, NULL, PDE_DATA(inode));
}
#endif
static const struct file_operations tzdbg_fops = {
.owner = THIS_MODULE,
.read = tzdbgfs_read,
#ifdef CONFIG_DEBUG_FS
.open = simple_open,
#else
.open = tzdbg_proc_open,
#endif
};
@ -1412,6 +1439,7 @@ static void tzdbg_free_encrypted_log_buf(struct platform_device *pdev)
static int tzdbgfs_init(struct platform_device *pdev)
{
#ifdef CONFIG_DEBUG_FS
int rc = 0;
int i;
struct dentry *dent_dir;
@ -1441,13 +1469,57 @@ err:
debugfs_remove_recursive(dent_dir);
return rc;
#else
int rc = 0;
int i;
struct proc_dir_entry *proc_d_entry = NULL;
tzdbg_root = proc_mkdir(TZDBG_ROOT_DIR, NULL);
if (NULL == tzdbg_root) {
dev_err(&pdev->dev, "Created dir /proc/%s error!\n", TZDBG_ROOT_DIR);
return -1;
}
dev_info(&pdev->dev, "Created dir /proc/%s \n", TZDBG_ROOT_DIR);
for (i = 0; i < TZDBG_STATS_MAX; i++) {
tzdbg.debug_tz[i] = i;
proc_d_entry = proc_create_data(tzdbg.stat[i].name, 0666, tzdbg_root, &tzdbg_fops, &tzdbg.debug_tz[i]);
if (proc_d_entry == NULL) {
dev_err(&pdev->dev, "TZ proc_create_data %s failed\n", tzdbg.stat[i].name);
rc = -ENOMEM;
goto err;
}
}
tzdbg.disp_buf = kzalloc(max(debug_rw_buf_size,
tzdbg.hyp_debug_rw_buf_size), GFP_KERNEL);
if (tzdbg.disp_buf == NULL)
goto err;
platform_set_drvdata(pdev, tzdbg_root);
return 0;
err:
remove_proc_subtree(TZDBG_ROOT_DIR, NULL);
return -1;
#endif
}
static void tzdbgfs_exit(struct platform_device *pdev)
{
#ifdef CONFIG_DEBUG_FS
struct dentry *dent_dir;
dent_dir = platform_get_drvdata(pdev);
debugfs_remove_recursive(dent_dir);
#else
kzfree(tzdbg.disp_buf);
remove_proc_subtree(TZDBG_ROOT_DIR, NULL);
if (g_qsee_log)
dma_free_coherent(&pdev->dev, QSEE_LOG_BUF_SIZE,
(void *)g_qsee_log, coh_pmem);
#endif
}
static int __update_hypdbg_base(struct platform_device *pdev,

View file

@ -1097,6 +1097,29 @@ int mipi_dsi_dcs_get_display_brightness(struct mipi_dsi_device *dsi,
}
EXPORT_SYMBOL(mipi_dsi_dcs_get_display_brightness);
/**
* mipi_dsi_dcs_set_display_brightness_2bytes() - sets the brightness value of
* the display with 2bytes value
* @dsi: DSI peripheral device
* @brightness: brightness value
*
* Return: 0 on success or a negative error code on failure.
*/
int mipi_dsi_dcs_set_display_brightness_2bytes(struct mipi_dsi_device *dsi,
u16 brightness)
{
u8 payload[2] = { (brightness & 0xff00) >> 8, brightness & 0xff};
ssize_t err;
err = mipi_dsi_dcs_write(dsi, MIPI_DCS_SET_DISPLAY_BRIGHTNESS,
payload, sizeof(payload));
if (err < 0)
return err;
return 0;
}
EXPORT_SYMBOL(mipi_dsi_dcs_set_display_brightness_2bytes);
/**
* mipi_dsi_dcs_set_display_brightness_large() - sets the 16-bit brightness value
* of the display
@ -1197,6 +1220,59 @@ int mipi_dsi_driver_register_full(struct mipi_dsi_driver *drv,
}
EXPORT_SYMBOL(mipi_dsi_driver_register_full);
int mipi_dsi_dcs_get_elvss_data(struct mipi_dsi_device *dsi)
{
u8 payload_f0[2] = { 0x5A, 0x5A };
u8 payload_b0 = 0x07;
ssize_t err;
err = mipi_dsi_dcs_write(dsi, 0xF0, payload_f0, sizeof(payload_f0));
err = mipi_dsi_dcs_write(dsi, 0xB0, &payload_b0, sizeof(payload_b0));
if (err < 0)
return err;
return 0;
}
EXPORT_SYMBOL(mipi_dsi_dcs_get_elvss_data);
int mipi_dsi_dcs_get_elvss_data_1(struct mipi_dsi_device *dsi)
{
u8 payload_f0_1[2] = { 0xA5, 0xA5 };
ssize_t err;
err = mipi_dsi_dcs_write(dsi, 0xF0, payload_f0_1, sizeof(payload_f0_1));
if (err < 0)
return err;
return 0;
}
EXPORT_SYMBOL(mipi_dsi_dcs_get_elvss_data_1);
int mipi_dsi_dcs_set_elvss_dim_off(struct mipi_dsi_device *dsi,
u8 val)
{
u8 payload_f0[2] = { 0x5A, 0x5A };
u8 payload_f0_1[2] = { 0xA5, 0xA5 };
u8 payload_b7[2] = { 0x01, 0x5B };
u8 payload_b0 = 0x07;
ssize_t err;
pr_info("set elvss data:%d\n", val);
err = mipi_dsi_dcs_write(dsi, 0xF0, payload_f0, sizeof(payload_f0));
err = mipi_dsi_dcs_write(dsi, 0xB7, payload_b7, sizeof(payload_b7));
err = mipi_dsi_dcs_write(dsi, 0xB0, &payload_b0, sizeof(payload_b0));
err = mipi_dsi_dcs_write(dsi, 0xB7, &val, sizeof(val));
err = mipi_dsi_dcs_write(dsi, 0xF0, payload_f0_1, sizeof(payload_f0_1));
if (err < 0)
return err;
return 0;
}
EXPORT_SYMBOL(mipi_dsi_dcs_set_elvss_dim_off);
/**
* mipi_dsi_driver_unregister() - unregister a driver for DSI devices
* @drv: DSI driver structure

View file

@ -229,16 +229,99 @@ static ssize_t modes_show(struct device *device,
return written;
}
static ssize_t panelId_show(struct device *device,
struct device_attribute *attr,
char *buf)
{
struct drm_connector *connector = to_drm_connector(device);
int written = 0;
mutex_lock(&connector->dev->mode_config.mutex);
written = snprintf(buf, PAGE_SIZE, "0x%016llx\n",
connector->display_info.panel_id);
mutex_unlock(&connector->dev->mode_config.mutex);
return written;
}
static ssize_t panelVer_show(struct device *device,
struct device_attribute *attr,
char *buf)
{
struct drm_connector *connector = to_drm_connector(device);
int written = 0;
mutex_lock(&connector->dev->mode_config.mutex);
written = snprintf(buf, PAGE_SIZE, "0x%016llx\n",
connector->display_info.panel_ver);
mutex_unlock(&connector->dev->mode_config.mutex);
return written;
}
static ssize_t panelName_show(struct device *device,
struct device_attribute *attr,
char *buf)
{
struct drm_connector *connector = to_drm_connector(device);
int written = 0;
mutex_lock(&connector->dev->mode_config.mutex);
written = snprintf(buf, PAGE_SIZE, "%s\n", connector->display_info.panel_name);
mutex_unlock(&connector->dev->mode_config.mutex);
return written;
}
static ssize_t panelRegDA_show(struct device *device,
struct device_attribute *attr,
char *buf)
{
struct drm_connector *connector = to_drm_connector(device);
int written = 0;
mutex_lock(&connector->dev->mode_config.mutex);
written = snprintf(buf, PAGE_SIZE, "0x%02x\n", connector->display_info.panel_regDA);
mutex_unlock(&connector->dev->mode_config.mutex);
return written;
}
static ssize_t panelSupplier_show(struct device *device,
struct device_attribute *attr,
char *buf)
{
struct drm_connector *connector = to_drm_connector(device);
int written = 0;
mutex_lock(&connector->dev->mode_config.mutex);
written = snprintf(buf, PAGE_SIZE, "%s\n", connector->display_info.panel_supplier);
mutex_unlock(&connector->dev->mode_config.mutex);
return written;
}
static DEVICE_ATTR_RW(status);
static DEVICE_ATTR_RO(enabled);
static DEVICE_ATTR_RO(dpms);
static DEVICE_ATTR_RO(modes);
static DEVICE_ATTR_RO(panelId);
static DEVICE_ATTR_RO(panelVer);
static DEVICE_ATTR_RO(panelName);
static DEVICE_ATTR_RO(panelRegDA);
static DEVICE_ATTR_RO(panelSupplier);
static struct attribute *connector_dev_attrs[] = {
&dev_attr_status.attr,
&dev_attr_enabled.attr,
&dev_attr_dpms.attr,
&dev_attr_modes.attr,
&dev_attr_panelId.attr,
&dev_attr_panelVer.attr,
&dev_attr_panelName.attr,
&dev_attr_panelRegDA.attr,
&dev_attr_panelSupplier.attr,
NULL
};

View file

@ -1400,7 +1400,7 @@ static const struct adreno_a6xx_core adreno_gpu_core_a610 = {
.base = {
DEFINE_ADRENO_REV(ADRENO_REV_A610, 6, 1, 0, ANY_ID),
.features = ADRENO_64BIT | ADRENO_CONTENT_PROTECTION |
ADRENO_PREEMPTION | ADRENO_PROCESS_RECLAIM,
ADRENO_PREEMPTION,
.gpudev = &adreno_a6xx_gpudev,
.gmem_size = (SZ_128K + SZ_4K),
.busy_mask = 0xfffffffe,

View file

@ -143,7 +143,14 @@ config I2C_DEBUG_BUS
debug messages to the system log. Select this if you are having
a problem with I2C support and want to see more of what is going
on.
config QCOM_I2C_NACK_ERR_WA_FAC
bool "I2C Bus nack err for fac"
default 'n'
help
Say Y here if you want the I2C bus drivers to produce a bunch of
debug messages to the system log. Select this if you are having
a problem with I2C support and want to see more of what is going
on.
endif # I2C
endmenu

View file

@ -18,3 +18,8 @@ obj-$(CONFIG_I2C_STUB) += i2c-stub.o
obj-$(CONFIG_I2C_SLAVE_EEPROM) += i2c-slave-eeprom.o
ccflags-$(CONFIG_I2C_DEBUG_CORE) := -DDEBUG
ifeq ($(CONFIG_QCOM_I2C_NACK_ERR_WA_FAC), y)
subdir-ccflags-y += -DQCOM_I2C_NACK_ERR_WA
endif

View file

@ -77,6 +77,10 @@
#define MAX_SE 20
#ifdef QCOM_I2C_NACK_ERR_WA
u8 i2c_wt6670_dl_mode = 0;
#endif
enum i2c_se_mode {
UNINITIALIZED,
FIFO_SE_DMA,
@ -245,7 +249,14 @@ static irqreturn_t geni_i2c_irq(int irq, void *dev)
u32 dm_rx_st = readl_relaxed(gi2c->base + SE_DMA_RX_IRQ_STAT);
u32 dma = readl_relaxed(gi2c->base + SE_GENI_DMA_MODE_EN);
struct i2c_msg *cur = gi2c->cur;
#ifdef QCOM_I2C_NACK_ERR_WA
//wt6670 download mode i2c addr
if(cur[0].addr == 0x2B){
i2c_wt6670_dl_mode = 1;
} else if(cur[0].addr == 0x35){
i2c_wt6670_dl_mode = 0;
}
#endif
if (!cur) {
geni_se_dump_dbg_regs(&gi2c->i2c_rsc, gi2c->base, gi2c->ipcl);
GENI_SE_ERR(gi2c->ipcl, false, gi2c->dev, "Spurious irq\n");
@ -256,9 +267,15 @@ static irqreturn_t geni_i2c_irq(int irq, void *dev)
(dm_rx_st & (DM_I2C_CB_ERR)) ||
(m_stat & M_CMD_CANCEL_EN) ||
(m_stat & M_CMD_ABORT_EN)) {
#ifdef QCOM_I2C_NACK_ERR_WA
if(i2c_wt6670_dl_mode == 0){
if (m_stat & M_GP_IRQ_1_EN)
geni_i2c_err(gi2c, I2C_NACK);
}
#else
if (m_stat & M_GP_IRQ_1_EN)
geni_i2c_err(gi2c, I2C_NACK);
#endif
if (m_stat & M_GP_IRQ_3_EN)
geni_i2c_err(gi2c, I2C_BUS_PROTO);
if (m_stat & M_GP_IRQ_4_EN)
@ -733,7 +750,14 @@ static int geni_i2c_xfer(struct i2c_adapter *adap,
int i, ret = 0, timeout = 0;
gi2c->err = 0;
#ifdef QCOM_I2C_NACK_ERR_WA
//wt6670 download mode i2c addr
if(msgs[0].addr == 0x2B){
i2c_wt6670_dl_mode = 1;
} else if( msgs[0].addr == 0x35){
i2c_wt6670_dl_mode = 0;
}
#endif
/* Client to respect system suspend */
if (!pm_runtime_enabled(gi2c->dev)) {
GENI_SE_ERR(gi2c->ipcl, false, gi2c->dev,
@ -903,8 +927,16 @@ static int geni_i2c_xfer(struct i2c_adapter *adap,
ret = gi2c->err;
if (gi2c->err) {
GENI_SE_ERR(gi2c->ipcl, true, gi2c->dev,
"i2c error :%d\n", gi2c->err);
GENI_SE_ERR(gi2c->ipcl, true, gi2c->dev,"i2c error :%d\n", gi2c->err);
#ifdef QCOM_I2C_NACK_ERR_WA
if(i2c_wt6670_dl_mode == 1){
if(gi2c->err == gi2c_log[I2C_NACK].err) {
GENI_SE_ERR(gi2c->ipcl, true, gi2c->dev,"wt6670 nack continue! :%d\n", gi2c->err);
continue;
}
}
#endif
break;
}
}

View file

@ -931,6 +931,8 @@ static const struct adc_channels adc_chans_pmic5[ADC_MAX_CHANNEL] = {
SCALE_HW_CALIB_THERM_100K_PULLUP)
[ADC_GPIO4_PU2] = ADC_CHAN_TEMP("gpio4_pu2", 1,
SCALE_HW_CALIB_THERM_100K_PULLUP)
[ADC_GPIO3_DIV3] = ADC_CHAN_VOLT("gpio3_div3", 1,
SCALE_HW_CALIB_DEFAULT)
};
static const struct adc_channels adc7_chans_pmic[ADC_MAX_CHANNEL] = {

View file

@ -555,7 +555,85 @@ struct lut_table {
u32 tablesize;
};
#ifdef CONFIG_BAT_NTC_10K
static const struct vadc_map_pt adcmap_batt_therm_30k_NTC10K[] = {
{1618, -400},
{1593, -380},
{1566, -360},
{1538, -340},
{1508, -320},
{1477, -300},
{1444, -280},
{1410, -260},
{1374, -240},
{1338, -220},
{1300, -200},
{1261, -180},
{1221, -160},
{1181, -140},
{1140, -120},
{1099, -100},
{1057, -80},
{1016, -60},
{974, -40},
{934, -20},
{893, 0},
{853, 20},
{814, 40},
{776, 60},
{738, 80},
{702, 100},
{667, 120},
{633, 140},
{600, 160},
{569, 180},
{539, 200},
{510, 220},
{482, 240},
{456, 260},
{431, 280},
{407, 300},
{384, 320},
{363, 340},
{342, 360},
{323, 380},
{305, 400},
{288, 420},
{272, 440},
{256, 460},
{242, 480},
{228, 500},
{215, 520},
{203, 540},
{192, 560},
{181, 580},
{171, 600},
{162, 620},
{153, 640},
{145, 660},
{137, 680},
{130, 700},
{123, 720},
{116, 740},
{110, 760},
{104, 780},
{99, 800},
{94, 820},
{89, 840},
{84, 860},
{80, 880},
{76, 900},
{72, 920},
{69, 940},
{65, 960},
{62, 980}
};
#endif
static const struct lut_table lut_table_30[] = {
#ifdef CONFIG_BAT_NTC_10K
{adcmap_batt_therm_30k_NTC10K, ARRAY_SIZE(adcmap_batt_therm_30k_NTC10K)},
#endif
{adcmap_batt_therm_30k, ARRAY_SIZE(adcmap_batt_therm_30k)},
{adcmap_batt_therm_30k_6125, ARRAY_SIZE(adcmap_batt_therm_30k_6125)},
};

View file

@ -25,6 +25,7 @@
#include <linux/regulator/driver.h>
#include <linux/regulator/machine.h>
#include <linux/regulator/of_regulator.h>
#include <linux/time.h>
#define PMIC_VER_8941 0x01
#define PMIC_VERSION_REG 0x0105
@ -86,6 +87,8 @@
#define QPNP_PON_S3_DBC_CTL(pon) ((pon)->base + 0x75)
#define QPNP_PON_SMPL_CTL(pon) ((pon)->base + 0x7F)
#define QPNP_PON_TRIGGER_EN(pon) ((pon)->base + 0x80)
#define QPNP_PON_PERPH_RB_SPARE(pon) ((pon)->base + 0x8C)
#define QPNP_PON_DVDD_RB_SPARE(pon) ((pon)->base + 0x8D)
#define QPNP_PON_XVDD_RB_SPARE(pon) ((pon)->base + 0x8E)
#define QPNP_PON_SOFT_RB_SPARE(pon) ((pon)->base + 0x8F)
#define QPNP_PON_SEC_ACCESS(pon) ((pon)->base + 0xD0)
@ -383,6 +386,50 @@ int qpnp_pon_set_restart_reason(enum pon_restart_reason reason)
}
EXPORT_SYMBOL(qpnp_pon_set_restart_reason);
/**
* qpnp_pon_store_extra_reset_info - Store extra reset info in PMIC register.
*
* Returns = 0 if PMIC feature is not available or store restart reason
* successfully.
* Returns > 0 for errors
*
* This function is used to store extra reset info in PMIC spare register
* which can be preserved during reset.
*/
int qpnp_pon_store_extra_reset_info(u16 mask, u16 val)
{
int rc = 0;
struct qpnp_pon *pon = sys_reset_dev;
if (!pon)
return 0;
if (mask & 0xFF) {
rc = qpnp_pon_masked_write(pon, QPNP_PON_DVDD_RB_SPARE(pon),
(mask & 0xFF), (val & 0xFF));
if (rc) {
dev_err(pon->dev,
"Failed to store extra reset info to 0x%x\n",
QPNP_PON_DVDD_RB_SPARE(pon));
return rc;
}
}
if (mask & 0xFF00) {
rc = qpnp_pon_masked_write(pon, QPNP_PON_XVDD_RB_SPARE(pon),
((mask >> 8) & 0xFF), ((val >> 8) & 0xFF));
if (rc) {
dev_err(pon->dev,
"Failed to store extra reset info to 0x%x\n",
QPNP_PON_XVDD_RB_SPARE(pon));
return rc;
}
}
return rc;
}
EXPORT_SYMBOL(qpnp_pon_store_extra_reset_info);
/*
* qpnp_pon_check_hard_reset_stored() - Checks if the PMIC need to
* store hard reset reason.
@ -917,6 +964,9 @@ static int qpnp_pon_input_dispatch(struct qpnp_pon *pon, u32 pon_type)
uint pon_rt_sts;
u64 elapsed_us;
int rc;
struct timeval timestamp;
struct tm tm;
char buff[255];
cfg = qpnp_get_cfg(pon, pon_type);
if (!cfg)
@ -943,6 +993,17 @@ static int qpnp_pon_input_dispatch(struct qpnp_pon *pon, u32 pon_type)
switch (cfg->pon_type) {
case PON_KPDPWR:
pon_rt_bit = QPNP_PON_KPDPWR_N_SET;
/* get the time stamp in readable format to print*/
do_gettimeofday(&timestamp);
time_to_tm((time_t)(timestamp.tv_sec), 0, &tm);
snprintf(buff, sizeof(buff),
"%u-%02d-%02d %02d:%02d:%02d UTC",
(int) tm.tm_year + 1900, tm.tm_mon + 1,
tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
pr_warn("Report pwrkey %s event at: %s\n", pon_rt_bit &
pon_rt_sts ? "press" : "release", buff);
break;
case PON_RESIN:
pon_rt_bit = QPNP_PON_RESIN_N_SET;

View file

@ -1354,6 +1354,19 @@ source "drivers/input/touchscreen/synaptics_tcm/Kconfig"
source "drivers/input/touchscreen/focaltech_touch/Kconfig"
source "drivers/input/touchscreen/ft3519/Kconfig"
source "drivers/input/touchscreen/nt36xxx/Kconfig"
config TOUCHSCREEN_HIMAX_CHIPSET
bool "Himax touchpanel CHIPSET"
depends on I2C
help
Say Y here if you have a Himax CHIPSET touchscreen.
HIMAX controllers are multi touch controllers which can
report 10 touches at a time.
If unsure, say N.
source "drivers/input/touchscreen/hxchipset/Kconfig"
endif

View file

@ -113,4 +113,6 @@ obj-$(CONFIG_TOUCHSCREEN_ST) += st/
obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_DSX) += synaptics_dsx/
obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_TCM) += synaptics_tcm/
obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_touch/
obj-$(CONFIG_TOUCHSCREEN_FT3519) += ft3519/
obj-$(CONFIG_TOUCHSCREEN_NT36XXX) += nt36xxx/
obj-$(CONFIG_TOUCHSCREEN_HIMAX_CHIPSET) += hxchipset/

View file

@ -0,0 +1,16 @@
#
# Focaltech Touchscreen driver configuration
#
config TOUCHSCREEN_FT3519
bool "Focaltech Touchscreen"
default n
help
Say Y here if you have Focaltech touch panel.
If unsure, say N.
config TOUCHSCREEN_FT3519_DIRECTORY
string "Focaltech ts directory name"
default "ft3519"
depends on TOUCHSCREEN_FT3519

View file

@ -0,0 +1,17 @@
# Makefile for the focaltech touchscreen drivers.
obj-$(CONFIG_TOUCHSCREEN_FT3519) += focaltech_core.o
obj-$(CONFIG_TOUCHSCREEN_FT3519) += focaltech_ex_fun.o
obj-$(CONFIG_TOUCHSCREEN_FT3519) += focaltech_ex_mode.o
obj-$(CONFIG_TOUCHSCREEN_FT3519) += focaltech_gesture.o
obj-$(CONFIG_TOUCHSCREEN_FT3519) += focaltech_esdcheck.o
obj-$(CONFIG_TOUCHSCREEN_FT3519) += focaltech_point_report_check.o
obj-$(CONFIG_TOUCHSCREEN_FT3519) += focaltech_test/
obj-$(CONFIG_TOUCHSCREEN_FT3519) += focaltech_flash.o
obj-$(CONFIG_TOUCHSCREEN_FT3519) += focaltech_flash/
obj-$(CONFIG_TOUCHSCREEN_FT3519) += focaltech_i2c.o

View file

@ -0,0 +1,177 @@
/*
*
* FocalTech fts TouchScreen driver.
*
* Copyright (c) 2012-2020, Focaltech Ltd. All rights reserved.
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
* may be copied, distributed, and modified under those terms.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*/
/*****************************************************************************
*
* File Name: focaltech_common.h
*
* Author: Focaltech Driver Team
*
* Created: 2016-08-16
*
* Abstract:
*
* Reference:
*
*****************************************************************************/
#ifndef __LINUX_FOCALTECH_COMMON_H__
#define __LINUX_FOCALTECH_COMMON_H__
#include "focaltech_config.h"
/*****************************************************************************
* Macro definitions using #define
*****************************************************************************/
#define FTS_DRIVER_VERSION "Focaltech V3.3.5 20210514"
#define BYTE_OFF_0(x) (u8)((x) & 0xFF)
#define BYTE_OFF_8(x) (u8)(((x) >> 8) & 0xFF)
#define BYTE_OFF_16(x) (u8)(((x) >> 16) & 0xFF)
#define BYTE_OFF_24(x) (u8)(((x) >> 24) & 0xFF)
#define FLAGBIT(x) (0x00000001 << (x))
#define FLAGBITS(x, y) ((0xFFFFFFFF >> (32 - (y) - 1)) & (0xFFFFFFFF << (x)))
#define FLAG_ICSERIALS_LEN 8
#define FLAG_HID_BIT 10
#define FLAG_IDC_BIT 11
#define IC_SERIALS (FTS_CHIP_TYPE & FLAGBITS(0, FLAG_ICSERIALS_LEN-1))
#define IC_TO_SERIALS(x) ((x) & FLAGBITS(0, FLAG_ICSERIALS_LEN-1))
#define FTS_CHIP_IDC ((FTS_CHIP_TYPE & FLAGBIT(FLAG_IDC_BIT)) == FLAGBIT(FLAG_IDC_BIT))
#define FTS_HID_SUPPORTTED ((FTS_CHIP_TYPE & FLAGBIT(FLAG_HID_BIT)) == FLAGBIT(FLAG_HID_BIT))
#define FTS_MAX_CHIP_IDS 8
#define FTS_CHIP_TYPE_MAPPING {{0x89, 0x54, 0x52, 0x54, 0x52, 0x54, 0x5B, 0x54, 0x5E}}
#define FILE_NAME_LENGTH 128
#define ENABLE 1
#define DISABLE 0
#define VALID 1
#define INVALID 0
#define FTS_CMD_START1 0x55
#define FTS_CMD_START2 0xAA
#define FTS_CMD_START_DELAY 12
#define FTS_CMD_READ_ID 0x90
#define FTS_CMD_READ_ID_LEN 4
#define FTS_CMD_READ_ID_LEN_INCELL 1
#define FTS_CMD_READ_FW_CONF 0xA8
/*register address*/
#define FTS_REG_INT_CNT 0x8F
#define FTS_REG_FLOW_WORK_CNT 0x91
#define FTS_REG_WORKMODE 0x00
#define FTS_REG_WORKMODE_FACTORY_VALUE 0x40
#define FTS_REG_WORKMODE_WORK_VALUE 0x00
#define FTS_REG_ESDCHECK_DISABLE 0x8D
#define FTS_REG_CHIP_ID 0xA3
#define FTS_REG_CHIP_ID2 0x9F
#define FTS_REG_POWER_MODE 0xA5
#define FTS_REG_POWER_MODE_SLEEP 0x03
#define FTS_REG_FW_VER 0xA6
#define FTS_REG_VENDOR_ID 0xA8
#define FTS_REG_LCD_BUSY_NUM 0xAB
#define FTS_REG_FACE_DEC_MODE_EN 0xB0
#define FTS_REG_FACTORY_MODE_DETACH_FLAG 0xB4
#define FTS_REG_FACE_DEC_MODE_STATUS 0x01
#define FTS_REG_IDE_PARA_VER_ID 0xB5
#define FTS_REG_IDE_PARA_STATUS 0xB6
#define FTS_REG_GLOVE_MODE_EN 0xC0
#define FTS_REG_COVER_MODE_EN 0xC1
#define FTS_REG_CHARGER_MODE_EN 0x8B
#define FTS_REG_GESTURE_EN 0xD0
#define FTS_REG_GESTURE_OUTPUT_ADDRESS 0xD3
#define FTS_REG_MODULE_ID 0xE3
#define FTS_REG_LIC_VER 0xE4
#define FTS_REG_ESD_SATURATE 0xED
#define FTS_SYSFS_ECHO_ON(buf) (buf[0] == '1')
#define FTS_SYSFS_ECHO_OFF(buf) (buf[0] == '0')
#define kfree_safe(pbuf) do {\
if (pbuf) {\
kfree(pbuf);\
pbuf = NULL;\
}\
} while(0)
/*****************************************************************************
* Alternative mode (When something goes wrong, the modules may be able to solve the problem.)
*****************************************************************************/
/*
* point report check
* default: disable
*/
#define FTS_POINT_REPORT_CHECK_EN 0
/*****************************************************************************
* Global variable or extern global variabls/functions
*****************************************************************************/
struct ft_chip_t {
u16 type;
u8 chip_idh;
u8 chip_idl;
u8 rom_idh;
u8 rom_idl;
u8 pb_idh;
u8 pb_idl;
u8 bl_idh;
u8 bl_idl;
};
struct ft_chip_id_t {
u16 type;
u16 chip_ids[FTS_MAX_CHIP_IDS];
};
struct ts_ic_info {
bool is_incell;
bool hid_supported;
struct ft_chip_t ids;
struct ft_chip_id_t cid;
};
/*****************************************************************************
* DEBUG function define here
*****************************************************************************/
#if FTS_DEBUG_EN
#define FTS_DEBUG(fmt, args...) do { \
printk("[FTS_TS]%s:"fmt"\n", __func__, ##args); \
} while (0)
#define FTS_FUNC_ENTER() do { \
printk("[FTS_TS]%s: Enter\n", __func__); \
} while (0)
#define FTS_FUNC_EXIT() do { \
printk("[FTS_TS]%s: Exit(%d)\n", __func__, __LINE__); \
} while (0)
#else /* #if FTS_DEBUG_EN*/
#define FTS_DEBUG(fmt, args...)
#define FTS_FUNC_ENTER()
#define FTS_FUNC_EXIT()
#endif
#define FTS_INFO(fmt, args...) do { \
printk(KERN_INFO "[FTS_TS/I]%s:"fmt"\n", __func__, ##args); \
} while (0)
#define FTS_ERROR(fmt, args...) do { \
printk(KERN_ERR "[FTS_TS/E]%s:"fmt"\n", __func__, ##args); \
} while (0)
#endif /* __LINUX_FOCALTECH_COMMON_H__ */

View file

@ -0,0 +1,299 @@
/*
*
* FocalTech TouchScreen driver.
*
* Copyright (c) 2012-2020, FocalTech Systems, Ltd., all rights reserved.
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
* may be copied, distributed, and modified under those terms.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*/
/************************************************************************
*
* File Name: focaltech_config.h
*
* Author: Focaltech Driver Team
*
* Created: 2016-08-08
*
* Abstract: global configurations
*
* Version: v1.0
*
************************************************************************/
#ifndef _LINUX_FOCLATECH_CONFIG_H_
#define _LINUX_FOCLATECH_CONFIG_H_
/**************************************************/
/****** G: A, I: B, S: C, U: D ******************/
/****** chip type defines, do not modify *********/
#define _FT8716 0x87160805
#define _FT8736 0x87360806
#define _FT8607 0x86070809
#define _FT8006U 0x8006D80B
#define _FT8006S 0x8006A80B
#define _FT8613 0x8613080C
#define _FT8719 0x8719080D
#define _FT8739 0x8739080E
#define _FT8615 0x8615080F
#define _FT8201 0x82010810
#define _FT8201AA 0x8201A810
#define _FT8006P 0x86220811
#define _FT7251 0x72510812
#define _FT7252 0x72520813
#define _FT8613S 0x8613C814
#define _FT8756 0x87560815
#define _FT8302 0x83020816
#define _FT8009 0x80090817
#define _FT8656 0x86560818
#define _FT8006S_AA 0x86320819
#define _FT7250 0x7250081A
#define _FT7120 0x7120081B
#define _FT8720 0x8720081C
#define _FT8726 0x8726081C
#define _FT8720H 0x8720E81C
#define _FT8720M 0x8720F81C
#define _FT8016 0x8016081D
#define _FT2388 0x2388081E
#define _FT8006S_AB 0x8642081F
#define _FT8722 0x87220820
#define _FT8201AB 0x8201B821
#define _FT8203 0x82030821
#define _FT5416 0x54160402
#define _FT5426 0x54260402
#define _FT5435 0x54350402
#define _FT5436 0x54360402
#define _FT5526 0x55260402
#define _FT5526I 0x5526B402
#define _FT5446 0x54460402
#define _FT5346 0x53460402
#define _FT5446I 0x5446B402
#define _FT5346I 0x5346B402
#define _FT7661 0x76610402
#define _FT7511 0x75110402
#define _FT7421 0x74210402
#define _FT7681 0x76810402
#define _FT3C47U 0x3C47D402
#define _FT3417 0x34170402
#define _FT3517 0x35170402
#define _FT3327 0x33270402
#define _FT3427 0x34270402
#define _FT7311 0x73110402
#define _FT5526_V00 0x5526C402
#define _FT5626 0x56260401
#define _FT5726 0x57260401
#define _FT5826B 0x5826B401
#define _FT5826S 0x5826C401
#define _FT7811 0x78110401
#define _FT3D47 0x3D470401
#define _FT3617 0x36170401
#define _FT3717 0x37170401
#define _FT3817B 0x3817B401
#define _FT3517U 0x3517D401
#define _FT6236U 0x6236D003
#define _FT6336G 0x6336A003
#define _FT6336U 0x6336D003
#define _FT6436U 0x6436D003
#define _FT6436T 0x6436E003
#define _FT3267 0x32670004
#define _FT3367 0x33670004
#define _FT3327G_003 0x3327A482
#define _FT3427_003 0x3427D482
#define _FT3427G_003 0x3427A482
#define _FT5446_003 0x5446D482
#define _FT5446_Q03 0x5446C482
#define _FT5446_P03 0x5446A481
#define _FT5446_N03 0x5446A489
#define _FT5426_003 0x5426D482
#define _FT5526_003 0x5526D482
#define _FT3518 0x35180481
#define _FT3518U 0x3518D481
#define _FT3558 0x35580481
#define _FT3528 0x35280481
#define _FT5536 0x55360481
#define _FT5536L 0x5536E481
#define _FT3418 0x34180481
#define _FT3519 0x35190489
#define _FT5446U 0x5446D083
#define _FT5456U 0x5456D083
#define _FT3417U 0x3417D083
#define _FT5426U 0x5426D083
#define _FT3428 0x34280083
#define _FT3437U 0x3437D083
#define _FT7302 0x73020084
#define _FT7202 0x72020084
#define _FT3308 0x33080084
#define _FT6446 0x64460084
#define _FT6346U 0x6346D085
#define _FT6346G 0x6346A085
#define _FT3067 0x30670085
#define _FT3068 0x30680085
#define _FT3168 0x31680085
#define _FT3268 0x32680085
#define _FT6146 0x61460085
#define _FT5726_003 0x5726D486
#define _FT5726_V03 0x5726C486
#define _FT3618 0x36180487
#define _FT5646 0x56460487
#define _FT3A58 0x3A580487
#define _FT3B58 0x3B580487
#define _FT3D58 0x3D580487
#define _FT5936 0x59360487
#define _FT5A36 0x5A360487
#define _FT5B36 0x5B360487
#define _FT5D36 0x5D360487
#define _FT5946 0x59460487
#define _FT5A46 0x5A460487
#define _FT5B46 0x5B460487
#define _FT5D46 0x5D460487
#define _FT3658U 0x3658D488
#define _FT3658G 0x3658A488
/*************************************************/
/*
* choose your ic chip type of focaltech
*/
#define FTS_CHIP_TYPE _FT3519
/******************* Enables *********************/
/*********** 1 to enable, 0 to disable ***********/
/*
* show debug log info
* enable it for debug, disable it for release
*/
#define FTS_DEBUG_EN 1
/*
* Linux MultiTouch Protocol
* 1: Protocol B(default), 0: Protocol A
*/
#define FTS_MT_PROTOCOL_B_EN 1
/*
* Report Pressure in multitouch
* 1:enable(default),0:disable
*/
#define FTS_REPORT_PRESSURE_EN 1
/*
* Stylus PEN enable
* 1:enable(default),0:disable
*/
#define FTS_PEN_EN 0
/*
* Gesture function enable
* default: disable
*/
#define FTS_GESTURE_EN 0
/*
* ESD check & protection
* default: disable
*/
#define FTS_ESDCHECK_EN 0
/*
* Production test enable
* 1: enable, 0:disable(default)
*/
#define FTS_TEST_EN 1
/*
* Pinctrl enable
* default: disable
*/
#define FTS_PINCTRL_EN 0
/*
* Customer power enable
* enable it when customer need control TP power
* default: disable
*/
#define FTS_POWER_SOURCE_CUST_EN 1
/****************************************************/
/********************** Upgrade ****************************/
/*
* auto upgrade
*/
#define FTS_AUTO_UPGRADE_EN 0
/*
* auto upgrade for lcd cfg
*/
#define FTS_AUTO_LIC_UPGRADE_EN 0
/*
* Numbers of modules support
*/
#define FTS_GET_MODULE_NUM 0
/*
* module_id: mean vendor_id generally, also maybe gpio or lcm_id...
* If means vendor_id, the FTS_MODULE_ID = PANEL_ID << 8 + VENDOR_ID
* FTS_GET_MODULE_NUM == 0/1, no check module id, you may ignore them
* FTS_GET_MODULE_NUM >= 2, compatible with FTS_MODULE2_ID
* FTS_GET_MODULE_NUM >= 3, compatible with FTS_MODULE3_ID
*/
#define FTS_MODULE_ID 0x0000
#define FTS_MODULE2_ID 0x0000
#define FTS_MODULE3_ID 0x0000
/*
* Need set the following when get firmware via firmware_request()
* For example: if module'vendor is tianma,
* #define FTS_MODULE_NAME "tianma"
* then file_name will be "focaltech_ts_fw_tianma"
* You should rename fw to "focaltech_ts_fw_tianma", and push it into
* etc/firmware or by customers
*/
#define FTS_MODULE_NAME ""
#define FTS_MODULE2_NAME ""
#define FTS_MODULE3_NAME ""
/*
* FW.i file for auto upgrade, you must replace it with your own
* define your own fw_file, the sample one to be replaced is invalid
* NOTE: if FTS_GET_MODULE_NUM > 1, it's the fw corresponding with FTS_VENDOR_ID
*/
#define FTS_UPGRADE_FW_FILE "include/firmware/fw_sample.i"
/*
* if FTS_GET_MODULE_NUM >= 2, fw corrsponding with FTS_VENDOR_ID2
* define your own fw_file, the sample one is invalid
*/
#define FTS_UPGRADE_FW2_FILE "include/firmware/fw_sample.i"
/*
* if FTS_GET_MODULE_NUM >= 3, fw corrsponding with FTS_VENDOR_ID3
* define your own fw_file, the sample one is invalid
*/
#define FTS_UPGRADE_FW3_FILE "include/firmware/fw_sample.i"
/*********************************************************/
#endif /* _LINUX_FOCLATECH_CONFIG_H_ */

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,308 @@
/*
*
* FocalTech TouchScreen driver.
*
* Copyright (c) 2012-2020, Focaltech Ltd. All rights reserved.
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
* may be copied, distributed, and modified under those terms.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*/
/*****************************************************************************
*
* File Name: focaltech_core.h
* Author: Focaltech Driver Team
*
* Created: 2016-08-08
*
* Abstract:
*
* Reference:
*
*****************************************************************************/
#ifndef __LINUX_FOCALTECH_CORE_H__
#define __LINUX_FOCALTECH_CORE_H__
/*****************************************************************************
* Included header files
*****************************************************************************/
#include <linux/kernel.h>
#include <linux/device.h>
#include <linux/i2c.h>
#include <linux/spi/spi.h>
#include <linux/input.h>
#include <linux/input/mt.h>
#include <linux/interrupt.h>
#include <linux/irq.h>
#include <linux/delay.h>
#include <linux/slab.h>
#include <linux/vmalloc.h>
#include <linux/gpio.h>
#include <linux/regulator/consumer.h>
#include <linux/uaccess.h>
#include <linux/firmware.h>
#include <linux/debugfs.h>
#include <linux/mutex.h>
#include <linux/workqueue.h>
#include <linux/wait.h>
#include <linux/time.h>
#include <linux/jiffies.h>
#include <linux/fs.h>
#include <linux/proc_fs.h>
#include <linux/version.h>
#include <linux/types.h>
#include <linux/sched.h>
#include <linux/kthread.h>
#include <linux/dma-mapping.h>
#include "focaltech_common.h"
/*****************************************************************************
* Private constant and macro definitions using #define
*****************************************************************************/
#define FTS_MAX_POINTS_SUPPORT 10 /* constant value, can't be changed */
#define FTS_MAX_KEYS 4
#define FTS_KEY_DIM 10
#define FTS_ONE_TCH_LEN 6
#define FTS_TOUCH_DATA_LEN (FTS_MAX_POINTS_SUPPORT * FTS_ONE_TCH_LEN + 3)
#define FTS_GESTURE_POINTS_MAX 6
#define FTS_GESTURE_DATA_LEN (FTS_GESTURE_POINTS_MAX * 4 + 4)
#define FTS_MAX_ID 0x0A
#define FTS_TOUCH_X_H_POS 3
#define FTS_TOUCH_X_L_POS 4
#define FTS_TOUCH_Y_H_POS 5
#define FTS_TOUCH_Y_L_POS 6
#define FTS_TOUCH_PRE_POS 7
#define FTS_TOUCH_AREA_POS 8
#define FTS_TOUCH_POINT_NUM 2
#define FTS_TOUCH_EVENT_POS 3
#define FTS_TOUCH_ID_POS 5
#define FTS_COORDS_ARR_SIZE 4
#define FTS_X_MIN_DISPLAY_DEFAULT 0
#define FTS_Y_MIN_DISPLAY_DEFAULT 0
#define FTS_X_MAX_DISPLAY_DEFAULT 720
#define FTS_Y_MAX_DISPLAY_DEFAULT 1280
#define FTS_TOUCH_DOWN 0
#define FTS_TOUCH_UP 1
#define FTS_TOUCH_CONTACT 2
#define EVENT_DOWN(flag) ((FTS_TOUCH_DOWN == flag) || (FTS_TOUCH_CONTACT == flag))
#define EVENT_UP(flag) (FTS_TOUCH_UP == flag)
#define EVENT_NO_DOWN(data) (!data->point_num)
#define FTS_MAX_COMPATIBLE_TYPE 4
#define FTS_MAX_COMMMAND_LENGTH 16
/*****************************************************************************
* Alternative mode (When something goes wrong, the modules may be able to solve the problem.)
*****************************************************************************/
/*
* For commnication error in PM(deep sleep) state
*/
#define FTS_PATCH_COMERR_PM 0
#define FTS_TIMEOUT_COMERR_PM 700
#define FTS_HIGH_REPORT 0
#define FTS_SIZE_DEFAULT 15
/*****************************************************************************
* Private enumerations, structures and unions using typedef
*****************************************************************************/
struct ftxxxx_proc {
struct proc_dir_entry *proc_entry;
u8 opmode;
u8 cmd_len;
u8 cmd[FTS_MAX_COMMMAND_LENGTH];
};
struct fts_ts_platform_data {
u32 irq_gpio;
u32 irq_gpio_flags;
u32 reset_gpio;
u32 reset_gpio_flags;
bool have_key;
u32 key_number;
u32 keys[FTS_MAX_KEYS];
u32 key_y_coords[FTS_MAX_KEYS];
u32 key_x_coords[FTS_MAX_KEYS];
u32 x_max;
u32 y_max;
u32 x_min;
u32 y_min;
u32 max_touch_number;
};
struct ts_event {
int x; /*x coordinate */
int y; /*y coordinate */
int p; /* pressure */
int flag; /* touch event flag: 0 -- down; 1-- up; 2 -- contact */
int id; /*touch ID */
int area;
};
struct pen_event {
int inrange;
int tip;
int x; /*x coordinate */
int y; /*y coordinate */
int p; /* pressure */
int flag; /* touch event flag: 0 -- down; 1-- up; 2 -- contact */
int id; /*touch ID */
int tilt_x;
int tilt_y;
int tool_type;
};
struct fts_ts_data {
struct i2c_client *client;
struct spi_device *spi;
struct device *dev;
struct input_dev *input_dev;
struct input_dev *pen_dev;
struct fts_ts_platform_data *pdata;
struct ts_ic_info ic_info;
struct workqueue_struct *ts_workqueue;
struct work_struct fwupg_work;
struct delayed_work esdcheck_work;
struct delayed_work prc_work;
struct work_struct resume_work;
struct ftxxxx_proc proc;
spinlock_t irq_lock;
struct mutex report_mutex;
struct mutex bus_lock;
unsigned long intr_jiffies;
int irq;
int log_level;
int fw_is_running; /* confirm fw is running when using spi:default 0 */
int dummy_byte;
#if defined(CONFIG_PM) && FTS_PATCH_COMERR_PM
struct completion pm_completion;
bool pm_suspend;
#endif
bool suspended;
bool fw_loading;
bool irq_disabled;
bool power_disabled;
bool glove_mode;
bool cover_mode;
bool charger_mode;
bool gesture_mode; /* gesture enable or disable, default: disable */
bool prc_mode;
struct pen_event pevent;
/* multi-touch */
struct ts_event *events;
u8 *bus_tx_buf;
u8 *bus_rx_buf;
int bus_type;
u8 *point_buf;
int pnt_buf_size;
int touchs;
int key_state;
int touch_point;
int point_num;
struct regulator *vdd;
struct regulator *vcc_i2c;
#if FTS_PINCTRL_EN
struct pinctrl *pinctrl;
struct pinctrl_state *pins_active;
struct pinctrl_state *pins_suspend;
struct pinctrl_state *pins_release;
#endif
#if defined(CONFIG_FB) || defined(CONFIG_DRM)
struct notifier_block fb_notif;
#elif defined(CONFIG_HAS_EARLYSUSPEND)
struct early_suspend early_suspend;
#endif
};
enum _FTS_BUS_TYPE {
BUS_TYPE_NONE,
BUS_TYPE_I2C,
BUS_TYPE_SPI,
BUS_TYPE_SPI_V2,
};
/*****************************************************************************
* Global variable or extern global variabls/functions
*****************************************************************************/
extern struct fts_ts_data *fts_data;
/* communication interface */
int fts_read(u8 *cmd, u32 cmdlen, u8 *data, u32 datalen);
int fts_read_reg(u8 addr, u8 *value);
int fts_write(u8 *writebuf, u32 writelen);
int fts_write_reg(u8 addr, u8 value);
void fts_hid2std(void);
int fts_bus_init(struct fts_ts_data *ts_data);
int fts_bus_exit(struct fts_ts_data *ts_data);
/* Gesture functions */
int fts_gesture_init(struct fts_ts_data *ts_data);
int fts_gesture_exit(struct fts_ts_data *ts_data);
void fts_gesture_recovery(struct fts_ts_data *ts_data);
int fts_gesture_readdata(struct fts_ts_data *ts_data, u8 *data);
int fts_gesture_suspend(struct fts_ts_data *ts_data);
int fts_gesture_resume(struct fts_ts_data *ts_data);
/* Apk and functions */
int fts_create_apk_debug_channel(struct fts_ts_data *);
void fts_release_apk_debug_channel(struct fts_ts_data *);
/* ADB functions */
int fts_create_sysfs(struct fts_ts_data *ts_data);
int fts_remove_sysfs(struct fts_ts_data *ts_data);
/* ESD */
#if FTS_ESDCHECK_EN
int fts_esdcheck_init(struct fts_ts_data *ts_data);
int fts_esdcheck_exit(struct fts_ts_data *ts_data);
int fts_esdcheck_switch(bool enable);
int fts_esdcheck_proc_busy(bool proc_debug);
int fts_esdcheck_set_intr(bool intr);
int fts_esdcheck_suspend(void);
int fts_esdcheck_resume(void);
#endif
/* Production test */
#if FTS_TEST_EN
int fts_test_init(struct fts_ts_data *ts_data);
int fts_test_exit(struct fts_ts_data *ts_data);
#endif
/* Point Report Check*/
#if FTS_POINT_REPORT_CHECK_EN
int fts_point_report_check_init(struct fts_ts_data *ts_data);
int fts_point_report_check_exit(struct fts_ts_data *ts_data);
void fts_prc_queue_work(struct fts_ts_data *ts_data);
#endif
/* FW upgrade */
int fts_fwupg_init(struct fts_ts_data *ts_data);
int fts_fwupg_exit(struct fts_ts_data *ts_data);
int fts_upgrade_bin(char *fw_name, bool force);
int fts_enter_test_environment(bool test_state);
/* Other */
int fts_reset_proc(int hdelayms);
int fts_check_cid(struct fts_ts_data *ts_data, u8 id_h);
int fts_wait_tp_to_valid(void);
void fts_release_all_finger(void);
void fts_tp_state_recovery(struct fts_ts_data *ts_data);
int fts_ex_mode_init(struct fts_ts_data *ts_data);
int fts_ex_mode_exit(struct fts_ts_data *ts_data);
int fts_ex_mode_recovery(struct fts_ts_data *ts_data);
void fts_irq_disable(void);
void fts_irq_enable(void);
#endif /* __LINUX_FOCALTECH_CORE_H__ */

View file

@ -0,0 +1,462 @@
/*
*
* FocalTech TouchScreen driver.
*
* Copyright (c) 2012-2020, FocalTech Systems, Ltd., all rights reserved.
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
* may be copied, distributed, and modified under those terms.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*/
/*****************************************************************************
*
* File Name: focaltech_esdcheck.c
*
* Author: Focaltech Driver Team
*
* Created: 2016-08-03
*
* Abstract: ESD check function
*
* Version: v1.0
*
* Revision History:
* v1.0:
* First release. By luougojin 2016-08-03
* v1.1: By luougojin 2017-02-15
* 1. Add LCD_ESD_PATCH to control idc_esdcheck_lcderror
*****************************************************************************/
/*****************************************************************************
* Included header files
*****************************************************************************/
#include "focaltech_core.h"
#if FTS_ESDCHECK_EN
/*****************************************************************************
* Private constant and macro definitions using #define
*****************************************************************************/
#define ESDCHECK_WAIT_TIME 1000 /* ms */
#define LCD_ESD_PATCH 0
#define ESDCHECK_INTRCNT_MAX 2
/*****************************************************************************
* Private enumerations, structures and unions using typedef
*****************************************************************************/
struct fts_esdcheck_st {
u8 mode : 1; /* 1- need check esd 0- no esd check */
u8 suspend : 1;
u8 proc_debug : 1; /* apk or adb use */
u8 intr : 1; /* 1- Interrupt trigger */
u8 unused : 4;
u8 intr_cnt;
u8 flow_work_hold_cnt; /* Flow Work Cnt(reg0x91) keep a same value for x times. >=5 times is ESD, need reset */
u8 flow_work_cnt_last; /* Save Flow Work Cnt(reg0x91) value */
u32 hardware_reset_cnt;
u32 nack_cnt;
u32 dataerror_cnt;
};
/*****************************************************************************
* Static variables
*****************************************************************************/
static struct fts_esdcheck_st fts_esdcheck_data;
/*****************************************************************************
* Global variable or extern global variabls/functions
*****************************************************************************/
/*****************************************************************************
* Static function prototypes
*****************************************************************************/
/*****************************************************************************
* functions body
*****************************************************************************/
#if LCD_ESD_PATCH
int lcd_need_reset;
static int tp_need_recovery; /* LCD reset cause Tp reset */
int idc_esdcheck_lcderror(struct fts_ts_data *ts_data)
{
int ret = 0;
u8 val = 0;
FTS_DEBUG("check LCD ESD");
if ( (tp_need_recovery == 1) && (lcd_need_reset == 0) ) {
tp_need_recovery = 0;
/* LCD reset, need recover TP state */
fts_release_all_finger();
fts_tp_state_recovery(ts_data);
}
ret = fts_read_reg(FTS_REG_ESD_SATURATE, &val);
if ( ret < 0) {
FTS_ERROR("read reg0xED fail,ret:%d", ret);
return -EIO;
}
if (val == 0xAA) {
/*
* 1. Set flag lcd_need_reset = 1;
* 2. LCD driver need reset(recovery) LCD and set lcd_need_reset to 0
* 3. recover TP state
*/
FTS_INFO("LCD ESD, need execute LCD reset");
lcd_need_reset = 1;
tp_need_recovery = 1;
}
return 0;
}
#endif
static int fts_esdcheck_tp_reset(struct fts_ts_data *ts_data)
{
FTS_FUNC_ENTER();
fts_esdcheck_data.flow_work_hold_cnt = 0;
fts_esdcheck_data.hardware_reset_cnt++;
fts_reset_proc(200);
fts_release_all_finger();
fts_tp_state_recovery(ts_data);
FTS_FUNC_EXIT();
return 0;
}
static bool get_chip_id(struct fts_ts_data *ts_data)
{
int ret = 0;
int i = 0;
u8 idh = 0;
u8 chip_id = ts_data->ic_info.ids.chip_idh;
for (i = 0; i < 3; i++) {
ret = fts_read_reg(FTS_REG_CHIP_ID, &idh);
if (ret < 0) {
FTS_ERROR("read chip id fail,ret:%d", ret);
fts_esdcheck_data.nack_cnt++;
} else {
if ((idh == chip_id) || (fts_check_cid(ts_data, idh) == 0)) {
break;
} else {
FTS_DEBUG("read chip_id:%x,retry:%d", idh, i);
fts_esdcheck_data.dataerror_cnt++;
}
}
msleep(10);
}
/* if can't get correct data in 3 times, then need hardware reset */
if (i >= 3) {
FTS_ERROR("read chip id 3 times fail, need execute TP reset");
return true;
}
return false;
}
/*****************************************************************************
* Name: get_flow_cnt
* Brief: Read flow cnt(0x91)
* Input:
* Output:
* Return: 1(true) - Reg 0x91(flow cnt) abnormal: hold a value for 5 times
* 0(false) - Reg 0x91(flow cnt) normal
*****************************************************************************/
static bool get_flow_cnt(struct fts_ts_data *ts_data)
{
int ret = 0;
u8 reg_value = 0;
u8 reg_addr = 0;
reg_addr = FTS_REG_FLOW_WORK_CNT;
ret = fts_read(&reg_addr, 1, &reg_value, 1);
if (ret < 0) {
FTS_ERROR("read reg0x91 fail,ret:%d", ret);
fts_esdcheck_data.nack_cnt++;
} else {
if ( reg_value == fts_esdcheck_data.flow_work_cnt_last ) {
FTS_DEBUG("reg0x91,val:%x,last:%x", reg_value,
fts_esdcheck_data.flow_work_cnt_last);
fts_esdcheck_data.flow_work_hold_cnt++;
} else {
fts_esdcheck_data.flow_work_hold_cnt = 0;
}
fts_esdcheck_data.flow_work_cnt_last = reg_value;
}
/* Flow Work Cnt keep a value for 5 times, need execute TP reset */
if (fts_esdcheck_data.flow_work_hold_cnt >= 5) {
FTS_DEBUG("reg0x91 keep a value for 5 times, need execute TP reset");
return true;
}
return false;
}
static int esdcheck_algorithm(struct fts_ts_data *ts_data)
{
int ret = 0;
u8 reg_value = 0;
u8 reg_addr = 0;
bool hardware_reset = 0;
/* 1. esdcheck is interrupt, then return */
if (fts_esdcheck_data.intr == 1) {
fts_esdcheck_data.intr_cnt++;
if (fts_esdcheck_data.intr_cnt > ESDCHECK_INTRCNT_MAX)
fts_esdcheck_data.intr = 0;
else
return 0;
}
/* 2. check power state, if suspend, no need check esd */
if (fts_esdcheck_data.suspend == 1) {
FTS_DEBUG("In suspend, not check esd");
/* because in suspend state, adb can be used, when upgrade FW, will
* active ESD check(active = 1); But in suspend, then will don't
* queue_delayed_work, when resume, don't check ESD again
*/
return 0;
}
/* 3. check fts_esdcheck_data.proc_debug state, if 1-proc busy, no need check esd*/
if (fts_esdcheck_data.proc_debug == 1) {
FTS_INFO("In apk/adb command mode, not check esd");
return 0;
}
/* 4. In factory mode, can't check esd */
reg_addr = FTS_REG_WORKMODE;
ret = fts_read_reg(reg_addr, &reg_value);
if ( ret < 0 ) {
fts_esdcheck_data.nack_cnt++;
} else if ( (reg_value & 0x70) != FTS_REG_WORKMODE_WORK_VALUE) {
FTS_DEBUG("not in work mode(%x), no check esd", reg_value);
return 0;
}
/* 5. IDC esd check lcd default:close */
#if LCD_ESD_PATCH
idc_esdcheck_lcderror(ts_data);
#endif
/* 6. Get Chip ID */
hardware_reset = get_chip_id(ts_data);
/* 7. get Flow work cnt: 0x91 If no change for 5 times, then ESD and reset */
if (!hardware_reset) {
hardware_reset = get_flow_cnt(ts_data);
}
/* 8. If need hardware reset, then handle it here */
if (hardware_reset == 1) {
FTS_DEBUG("NoACK=%d, Error Data=%d, Hardware Reset=%d",
fts_esdcheck_data.nack_cnt,
fts_esdcheck_data.dataerror_cnt,
fts_esdcheck_data.hardware_reset_cnt);
fts_esdcheck_tp_reset(ts_data);
}
return 0;
}
static void esdcheck_func(struct work_struct *work)
{
struct fts_ts_data *ts_data = container_of(work,
struct fts_ts_data, esdcheck_work.work);
if (ENABLE == fts_esdcheck_data.mode) {
esdcheck_algorithm(ts_data);
queue_delayed_work(ts_data->ts_workqueue, &ts_data->esdcheck_work,
msecs_to_jiffies(ESDCHECK_WAIT_TIME));
}
}
int fts_esdcheck_set_intr(bool intr)
{
/* interrupt don't add debug message */
fts_esdcheck_data.intr = intr;
fts_esdcheck_data.intr_cnt = (u8)intr;
return 0;
}
static int fts_esdcheck_get_status(void)
{
/* interrupt don't add debug message */
return fts_esdcheck_data.mode;
}
/*****************************************************************************
* Name: fts_esdcheck_proc_busy
* Brief: When APK or ADB command access TP via driver, then need set proc_debug,
* then will not check ESD.
* Input:
* Output:
* Return:
*****************************************************************************/
int fts_esdcheck_proc_busy(bool proc_debug)
{
fts_esdcheck_data.proc_debug = proc_debug;
return 0;
}
/*****************************************************************************
* Name: fts_esdcheck_switch
* Brief: FTS esd check function switch.
* Input: enable: 1 - Enable esd check
* 0 - Disable esd check
* Output:
* Return:
*****************************************************************************/
int fts_esdcheck_switch(bool enable)
{
struct fts_ts_data *ts_data = fts_data;
FTS_FUNC_ENTER();
if (fts_esdcheck_data.mode == ENABLE) {
if (enable) {
FTS_DEBUG("ESD check start");
fts_esdcheck_data.flow_work_hold_cnt = 0;
fts_esdcheck_data.flow_work_cnt_last = 0;
fts_esdcheck_data.intr = 0;
fts_esdcheck_data.intr_cnt = 0;
queue_delayed_work(ts_data->ts_workqueue,
&ts_data->esdcheck_work,
msecs_to_jiffies(ESDCHECK_WAIT_TIME));
} else {
FTS_DEBUG("ESD check stop");
cancel_delayed_work_sync(&ts_data->esdcheck_work);
}
}
FTS_FUNC_EXIT();
return 0;
}
int fts_esdcheck_suspend(void)
{
FTS_FUNC_ENTER();
fts_esdcheck_switch(DISABLE);
fts_esdcheck_data.suspend = 1;
fts_esdcheck_data.intr = 0;
fts_esdcheck_data.intr_cnt = 0;
FTS_FUNC_EXIT();
return 0;
}
int fts_esdcheck_resume( void )
{
FTS_FUNC_ENTER();
fts_esdcheck_switch(ENABLE);
fts_esdcheck_data.suspend = 0;
fts_esdcheck_data.intr = 0;
fts_esdcheck_data.intr_cnt = 0;
FTS_FUNC_EXIT();
return 0;
}
static ssize_t fts_esdcheck_store(
struct device *dev,
struct device_attribute *attr, const char *buf, size_t count)
{
struct input_dev *input_dev = fts_data->input_dev;
mutex_lock(&input_dev->mutex);
if (FTS_SYSFS_ECHO_ON(buf)) {
FTS_DEBUG("enable esdcheck");
fts_esdcheck_data.mode = ENABLE;
fts_esdcheck_switch(ENABLE);
} else if (FTS_SYSFS_ECHO_OFF(buf)) {
FTS_DEBUG("disable esdcheck");
fts_esdcheck_switch(DISABLE);
fts_esdcheck_data.mode = DISABLE;
}
mutex_unlock(&input_dev->mutex);
return count;
}
static ssize_t fts_esdcheck_show(
struct device *dev, struct device_attribute *attr, char *buf)
{
int count;
struct input_dev *input_dev = fts_data->input_dev;
mutex_lock(&input_dev->mutex);
count = snprintf(buf, PAGE_SIZE, "Esd check: %s\n", \
fts_esdcheck_get_status() ? "On" : "Off");
mutex_unlock(&input_dev->mutex);
return count;
}
/* sysfs esd node
* read example: cat fts_esd_mode ---read esd mode
* write example:echo 01 > fts_esd_mode ---make esdcheck enable
*
*/
static DEVICE_ATTR (fts_esd_mode, S_IRUGO | S_IWUSR, fts_esdcheck_show, fts_esdcheck_store);
static struct attribute *fts_esd_mode_attrs[] = {
&dev_attr_fts_esd_mode.attr,
NULL,
};
static struct attribute_group fts_esd_group = {
.attrs = fts_esd_mode_attrs,
};
int fts_create_esd_sysfs(struct device *dev)
{
int ret = 0;
ret = sysfs_create_group(&dev->kobj, &fts_esd_group);
if ( ret != 0) {
FTS_ERROR("fts_create_esd_sysfs(sysfs) create fail");
sysfs_remove_group(&dev->kobj, &fts_esd_group);
return ret;
}
return 0;
}
int fts_esdcheck_init(struct fts_ts_data *ts_data)
{
FTS_FUNC_ENTER();
if (ts_data->ts_workqueue) {
INIT_DELAYED_WORK(&ts_data->esdcheck_work, esdcheck_func);
} else {
FTS_ERROR("fts workqueue is NULL, can't run esd check function");
return -EINVAL;
}
memset((u8 *)&fts_esdcheck_data, 0, sizeof(struct fts_esdcheck_st));
fts_esdcheck_data.mode = ENABLE;
fts_esdcheck_data.intr = 0;
fts_esdcheck_data.intr_cnt = 0;
fts_esdcheck_switch(ENABLE);
fts_create_esd_sysfs(ts_data->dev);
FTS_FUNC_EXIT();
return 0;
}
int fts_esdcheck_exit(struct fts_ts_data *ts_data)
{
sysfs_remove_group(&ts_data->dev->kobj, &fts_esd_group);
return 0;
}
#endif /* FTS_ESDCHECK_EN */

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,307 @@
/*
*
* FocalTech ftxxxx TouchScreen driver.
*
* Copyright (c) 2012-2020, Focaltech Ltd. All rights reserved.
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
* may be copied, distributed, and modified under those terms.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*/
/*****************************************************************************
*
* File Name: focaltech_ex_mode.c
*
* Author: Focaltech Driver Team
*
* Created: 2016-08-31
*
* Abstract:
*
* Reference:
*
*****************************************************************************/
/*****************************************************************************
* 1.Included header files
*****************************************************************************/
#include "focaltech_core.h"
/*****************************************************************************
* 2.Private constant and macro definitions using #define
*****************************************************************************/
/*****************************************************************************
* 3.Private enumerations, structures and unions using typedef
*****************************************************************************/
enum _ex_mode {
MODE_GLOVE = 0,
MODE_COVER,
MODE_CHARGER,
};
/*****************************************************************************
* 4.Static variables
*****************************************************************************/
/*****************************************************************************
* 5.Global variable or extern global variabls/functions
*****************************************************************************/
/*****************************************************************************
* 6.Static function prototypes
*******************************************************************************/
static int fts_ex_mode_switch(enum _ex_mode mode, u8 value)
{
int ret = 0;
u8 m_val = 0;
if (value)
m_val = 0x01;
else
m_val = 0x00;
switch (mode) {
case MODE_GLOVE:
ret = fts_write_reg(FTS_REG_GLOVE_MODE_EN, m_val);
if (ret < 0) {
FTS_ERROR("MODE_GLOVE switch to %d fail", m_val);
}
break;
case MODE_COVER:
ret = fts_write_reg(FTS_REG_COVER_MODE_EN, m_val);
if (ret < 0) {
FTS_ERROR("MODE_COVER switch to %d fail", m_val);
}
break;
case MODE_CHARGER:
ret = fts_write_reg(FTS_REG_CHARGER_MODE_EN, m_val);
if (ret < 0) {
FTS_ERROR("MODE_CHARGER switch to %d fail", m_val);
}
break;
default:
FTS_ERROR("mode(%d) unsupport", mode);
ret = -EINVAL;
break;
}
return ret;
}
static ssize_t fts_glove_mode_show(
struct device *dev, struct device_attribute *attr, char *buf)
{
int count = 0;
u8 val = 0;
struct fts_ts_data *ts_data = fts_data;
struct input_dev *input_dev = ts_data->input_dev;
mutex_lock(&input_dev->mutex);
fts_read_reg(FTS_REG_GLOVE_MODE_EN, &val);
count = snprintf(buf + count, PAGE_SIZE, "Glove Mode:%s\n",
ts_data->glove_mode ? "On" : "Off");
count += snprintf(buf + count, PAGE_SIZE, "Glove Reg(0xC0):%d\n", val);
mutex_unlock(&input_dev->mutex);
return count;
}
static ssize_t fts_glove_mode_store(
struct device *dev,
struct device_attribute *attr, const char *buf, size_t count)
{
int ret = 0;
struct fts_ts_data *ts_data = fts_data;
if (FTS_SYSFS_ECHO_ON(buf)) {
if (!ts_data->glove_mode) {
FTS_DEBUG("enter glove mode");
ret = fts_ex_mode_switch(MODE_GLOVE, ENABLE);
if (ret >= 0) {
ts_data->glove_mode = ENABLE;
}
}
} else if (FTS_SYSFS_ECHO_OFF(buf)) {
if (ts_data->glove_mode) {
FTS_DEBUG("exit glove mode");
ret = fts_ex_mode_switch(MODE_GLOVE, DISABLE);
if (ret >= 0) {
ts_data->glove_mode = DISABLE;
}
}
}
FTS_DEBUG("glove mode:%d", ts_data->glove_mode);
return count;
}
static ssize_t fts_cover_mode_show(
struct device *dev, struct device_attribute *attr, char *buf)
{
int count = 0;
u8 val = 0;
struct fts_ts_data *ts_data = fts_data;
struct input_dev *input_dev = ts_data->input_dev;
mutex_lock(&input_dev->mutex);
fts_read_reg(FTS_REG_COVER_MODE_EN, &val);
count = snprintf(buf + count, PAGE_SIZE, "Cover Mode:%s\n",
ts_data->cover_mode ? "On" : "Off");
count += snprintf(buf + count, PAGE_SIZE, "Cover Reg(0xC1):%d\n", val);
mutex_unlock(&input_dev->mutex);
return count;
}
static ssize_t fts_cover_mode_store(
struct device *dev,
struct device_attribute *attr, const char *buf, size_t count)
{
int ret = 0;
struct fts_ts_data *ts_data = fts_data;
if (FTS_SYSFS_ECHO_ON(buf)) {
if (!ts_data->cover_mode) {
FTS_DEBUG("enter cover mode");
ret = fts_ex_mode_switch(MODE_COVER, ENABLE);
if (ret >= 0) {
ts_data->cover_mode = ENABLE;
}
}
} else if (FTS_SYSFS_ECHO_OFF(buf)) {
if (ts_data->cover_mode) {
FTS_DEBUG("exit cover mode");
ret = fts_ex_mode_switch(MODE_COVER, DISABLE);
if (ret >= 0) {
ts_data->cover_mode = DISABLE;
}
}
}
FTS_DEBUG("cover mode:%d", ts_data->cover_mode);
return count;
}
static ssize_t fts_charger_mode_show(
struct device *dev, struct device_attribute *attr, char *buf)
{
int count = 0;
u8 val = 0;
struct fts_ts_data *ts_data = fts_data;
struct input_dev *input_dev = ts_data->input_dev;
mutex_lock(&input_dev->mutex);
fts_read_reg(FTS_REG_CHARGER_MODE_EN, &val);
count = snprintf(buf + count, PAGE_SIZE, "Charger Mode:%s\n",
ts_data->charger_mode ? "On" : "Off");
count += snprintf(buf + count, PAGE_SIZE, "Charger Reg(0x8B):%d\n", val);
mutex_unlock(&input_dev->mutex);
return count;
}
static ssize_t fts_charger_mode_store(
struct device *dev,
struct device_attribute *attr, const char *buf, size_t count)
{
int ret = 0;
struct fts_ts_data *ts_data = fts_data;
if (FTS_SYSFS_ECHO_ON(buf)) {
if (!ts_data->charger_mode) {
FTS_DEBUG("enter charger mode");
ret = fts_ex_mode_switch(MODE_CHARGER, ENABLE);
if (ret >= 0) {
ts_data->charger_mode = ENABLE;
}
}
} else if (FTS_SYSFS_ECHO_OFF(buf)) {
if (ts_data->charger_mode) {
FTS_DEBUG("exit charger mode");
ret = fts_ex_mode_switch(MODE_CHARGER, DISABLE);
if (ret >= 0) {
ts_data->charger_mode = DISABLE;
}
}
}
FTS_DEBUG("charger mode:%d", ts_data->glove_mode);
return count;
}
/* read and write charger mode
* read example: cat fts_glove_mode ---read glove mode
* write example:echo 1 > fts_glove_mode ---write glove mode to 01
*/
static DEVICE_ATTR(fts_glove_mode, S_IRUGO | S_IWUSR,
fts_glove_mode_show, fts_glove_mode_store);
static DEVICE_ATTR(fts_cover_mode, S_IRUGO | S_IWUSR,
fts_cover_mode_show, fts_cover_mode_store);
static DEVICE_ATTR(fts_charger_mode, S_IRUGO | S_IWUSR,
fts_charger_mode_show, fts_charger_mode_store);
static struct attribute *fts_touch_mode_attrs[] = {
&dev_attr_fts_glove_mode.attr,
&dev_attr_fts_cover_mode.attr,
&dev_attr_fts_charger_mode.attr,
NULL,
};
static struct attribute_group fts_touch_mode_group = {
.attrs = fts_touch_mode_attrs,
};
int fts_ex_mode_recovery(struct fts_ts_data *ts_data)
{
if (ts_data->glove_mode) {
fts_ex_mode_switch(MODE_GLOVE, ENABLE);
}
if (ts_data->cover_mode) {
fts_ex_mode_switch(MODE_COVER, ENABLE);
}
if (ts_data->charger_mode) {
fts_ex_mode_switch(MODE_CHARGER, ENABLE);
}
return 0;
}
int fts_ex_mode_init(struct fts_ts_data *ts_data)
{
int ret = 0;
ts_data->glove_mode = DISABLE;
ts_data->cover_mode = DISABLE;
ts_data->charger_mode = DISABLE;
ret = sysfs_create_group(&ts_data->dev->kobj, &fts_touch_mode_group);
if (ret < 0) {
FTS_ERROR("create sysfs(ex_mode) fail");
sysfs_remove_group(&ts_data->dev->kobj, &fts_touch_mode_group);
return ret;
} else {
FTS_DEBUG("create sysfs(ex_mode) succeedfully");
}
return 0;
}
int fts_ex_mode_exit(struct fts_ts_data *ts_data)
{
sysfs_remove_group(&ts_data->dev->kobj, &fts_touch_mode_group);
return 0;
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,217 @@
/************************************************************************
* Copyright (c) 2012-2020, Focaltech Systems (R)£¬All Rights Reserved.
*
* File Name: focaltech_flash.h
*
* Author: Focaltech Driver Team
*
* Created: 2016-08-07
*
* Abstract:
*
************************************************************************/
#ifndef __LINUX_FOCALTECH_FLASH_H__
#define __LINUX_FOCALTECH_FLASH_H__
/*****************************************************************************
* 1.Included header files
*****************************************************************************/
#include "focaltech_core.h"
/*****************************************************************************
* Private constant and macro definitions using #define
*****************************************************************************/
#define FTS_CMD_RESET 0x07
#define FTS_ROMBOOT_CMD_SET_PRAM_ADDR 0xAD
#define FTS_ROMBOOT_CMD_SET_PRAM_ADDR_LEN 4
#define FTS_ROMBOOT_CMD_WRITE 0xAE
#define FTS_ROMBOOT_CMD_START_APP 0x08
#define FTS_DELAY_PRAMBOOT_START 100
#define FTS_ROMBOOT_CMD_ECC 0xCC
#define FTS_PRAM_SADDR 0x000000
#define FTS_DRAM_SADDR 0xD00000
#define FTS_CMD_READ 0x03
#define FTS_CMD_READ_DELAY 1
#define FTS_CMD_READ_LEN 4
#define FTS_CMD_READ_LEN_SPI 6
#define FTS_CMD_FLASH_TYPE 0x05
#define FTS_CMD_FLASH_MODE 0x09
#define FLASH_MODE_WRITE_FLASH_VALUE 0x0A
#define FLASH_MODE_UPGRADE_VALUE 0x0B
#define FLASH_MODE_LIC_VALUE 0x0C
#define FLASH_MODE_PARAM_VALUE 0x0D
#define FTS_CMD_ERASE_APP 0x61
#define FTS_REASE_APP_DELAY 1350
#define FTS_ERASE_SECTOR_DELAY 60
#define FTS_RETRIES_REASE 50
#define FTS_RETRIES_DELAY_REASE 400
#define FTS_CMD_FLASH_STATUS 0x6A
#define FTS_CMD_FLASH_STATUS_LEN 2
#define FTS_CMD_FLASH_STATUS_NOP 0x0000
#define FTS_CMD_FLASH_STATUS_ECC_OK 0xF055
#define FTS_CMD_FLASH_STATUS_ERASE_OK 0xF0AA
#define FTS_CMD_FLASH_STATUS_WRITE_OK 0x1000
#define FTS_CMD_ECC_INIT 0x64
#define FTS_CMD_ECC_CAL 0x65
#define FTS_CMD_ECC_CAL_LEN 7
#define FTS_RETRIES_ECC_CAL 10
#define FTS_RETRIES_DELAY_ECC_CAL 50
#define FTS_CMD_ECC_READ 0x66
#define FTS_CMD_DATA_LEN 0xB0
#define FTS_CMD_APP_DATA_LEN_INCELL 0x7A
#define FTS_CMD_DATA_LEN_LEN 4
#define FTS_CMD_SET_WFLASH_ADDR 0xAB
#define FTS_CMD_SET_RFLASH_ADDR 0xAC
#define FTS_LEN_SET_ADDR 4
#define FTS_CMD_WRITE 0xBF
#define FTS_RETRIES_WRITE 100
#define FTS_RETRIES_DELAY_WRITE 1
#define FTS_CMD_WRITE_LEN 6
#define FTS_DELAY_READ_ID 20
#define FTS_DELAY_UPGRADE_RESET 80
#define PRAMBOOT_MIN_SIZE 0x120
#define PRAMBOOT_MAX_SIZE (64*1024)
#define FTS_FLASH_PACKET_LENGTH 32 /* max=128 */
#define FTS_MAX_LEN_ECC_CALC 0xFFFE /* must be even */
#define FTS_MIN_LEN 0x120
#define FTS_MAX_LEN_FILE (256 * 1024)
#define FTS_MAX_LEN_APP (64 * 1024)
#define FTS_MAX_LEN_SECTOR (4 * 1024)
#define FTS_CONIFG_VENDORID_OFF 0x04
#define FTS_CONIFG_MODULEID_OFF 0x1E
#define FTS_CONIFG_PROJECTID_OFF 0x20
#define FTS_APPINFO_OFF 0x100
#define FTS_APPINFO_APPLEN_OFF 0x00
#define FTS_APPINFO_APPLEN2_OFF 0x12
#define FTS_REG_UPGRADE 0xFC
#define FTS_REG_UPGRADE2 0xBC
#define FTS_UPGRADE_AA 0xAA
#define FTS_UPGRADE_55 0x55
#define FTS_DELAY_UPGRADE_AA 10
#define FTS_UPGRADE_LOOP 30
#define FTS_HEADER_LEN 32
#define FTS_FW_BIN_FILEPATH "/sdcard/"
#define FTS_FW_IDE_SIG "IDE_"
#define FTS_FW_IDE_SIG_LEN 4
#define MAX_MODULE_VENDOR_NAME_LEN 16
#define FTS_ROMBOOT_CMD_ECC_NEW_LEN 7
#define FTS_ECC_FINISH_TIMEOUT 100
#define FTS_ROMBOOT_CMD_ECC_FINISH 0xCE
#define FTS_ROMBOOT_CMD_ECC_FINISH_OK_A5 0xA5
#define FTS_ROMBOOT_CMD_ECC_FINISH_OK_00 0x00
#define FTS_ROMBOOT_CMD_ECC_READ 0xCD
#define AL2_FCS_COEF ((1 << 15) + (1 << 10) + (1 << 3))
#define FTS_APP_INFO_OFFSET 0x100
enum FW_STATUS {
FTS_RUN_IN_ERROR,
FTS_RUN_IN_APP,
FTS_RUN_IN_ROM,
FTS_RUN_IN_PRAM,
FTS_RUN_IN_BOOTLOADER,
};
enum FW_FLASH_MODE {
FLASH_MODE_APP,
FLASH_MODE_LIC,
FLASH_MODE_PARAM,
FLASH_MODE_ALL,
};
enum ECC_CHECK_MODE {
ECC_CHECK_MODE_XOR,
ECC_CHECK_MODE_CRC16,
};
enum UPGRADE_SPEC {
UPGRADE_SPEC_V_1_0 = 0x0100,
};
/*****************************************************************************
* Private enumerations, structures and unions using typedef
*****************************************************************************/
/* IC info */
struct upgrade_func {
u16 ctype[FTS_MAX_COMPATIBLE_TYPE];
u32 fwveroff;
u32 fwcfgoff;
u32 appoff;
u32 licoff;
u32 paramcfgoff;
u32 paramcfgveroff;
u32 paramcfg2off;
int pram_ecc_check_mode;
int fw_ecc_check_mode;
int upgspec_version;
bool new_return_value_from_ic;
bool appoff_handle_in_ic;
bool is_reset_register_BC;
bool read_boot_id_need_reset;
bool hid_supported;
bool pramboot_supported;
u8 *pramboot;
u32 pb_length;
int (*init)(u8 *, u32);
int (*write_pramboot_private)(void);
int (*upgrade)(u8 *, u32);
int (*get_hlic_ver)(u8 *);
int (*lic_upgrade)(u8 *, u32);
int (*param_upgrade)(u8 *, u32);
int (*force_upgrade)(u8 *, u32);
};
struct upgrade_setting_nf {
u8 rom_idh;
u8 rom_idl;
u16 reserved;
u32 app2_offset;
u32 ecclen_max;
u8 eccok_val;
u8 upgsts_boot;
u8 delay_init;
bool spi_pe;
bool half_length;
bool fd_check;
bool drwr_support;
};
struct upgrade_module {
int id;
char vendor_name[MAX_MODULE_VENDOR_NAME_LEN];
u8 *fw_file;
u32 fw_len;
};
struct fts_upgrade {
struct fts_ts_data *ts_data;
struct upgrade_module *module_info;
struct upgrade_func *func;
struct upgrade_setting_nf *setting_nf;
int module_id;
bool fw_from_request;
u8 *fw;
u32 fw_length;
u8 *lic;
u32 lic_length;
};
/*****************************************************************************
* Global variable or extern global variabls/functions
*****************************************************************************/
extern struct upgrade_func upgrade_func_ft5452i;
/*****************************************************************************
* Static function prototypes
*****************************************************************************/
int fts_fwupg_reset_in_boot(void);
int fts_fwupg_enter_into_boot(void);
int fts_fwupg_erase(u32 delay);
int fts_fwupg_ecc_cal(u32 saddr, u32 len);
int fts_flash_write_buf(u32 saddr, u8 *buf, u32 len, u32 delay);
int fts_flash_read_buf(u32 saddr, u8 *buf, u32 len);
int fts_fwupg_upgrade(struct fts_upgrade *upg);
#endif

View file

@ -0,0 +1 @@
obj-$(CONFIG_TOUCHSCREEN_FT3519) += focaltech_upgrade_ft5452i.o

View file

@ -0,0 +1,186 @@
/*
*
* FocalTech fts TouchScreen driver.
*
* Copyright (c) 2012-2019, Focaltech Ltd. All rights reserved.
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
* may be copied, distributed, and modified under those terms.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*/
/*****************************************************************************
*
* File Name: focaltech_upgrade_ft5452.c
*
* Author: Focaltech Driver Team
*
* Created: 2016-08-15
*
* Abstract:
*
* Reference:
*
*****************************************************************************/
/*****************************************************************************
* 1.Included header files
*****************************************************************************/
#include "../focaltech_flash.h"
/************************************************************************
* Name: fts_ft5452_upgrade
* Brief:
* Input:
* Output:
* Return: return 0 if success, otherwise return error code
***********************************************************************/
static int fts_ft5452_upgrade(u8 *buf, u32 len)
{
int ret = 0;
u32 start_addr = 0;
u8 cmd[4] = { 0 };
int ecc_in_host = 0;
int ecc_in_tp = 0;
int i = 0;
u8 wbuf[7] = { 0 };
u8 reg_val[4] = {0};
if (NULL == buf) {
FTS_ERROR("fw buf is null");
return -EINVAL;
}
if ((len < FTS_MIN_LEN) || (len > (60 * 1024))) {
FTS_ERROR("fw buffer len(%x) fail", len);
return -EINVAL;
}
/* enter into upgrade environment */
ret = fts_fwupg_enter_into_boot();
if (ret < 0) {
FTS_ERROR("enter into pramboot/bootloader fail,ret=%d", ret);
goto fw_reset;
}
cmd[0] = FTS_CMD_FLASH_MODE;
cmd[1] = FLASH_MODE_UPGRADE_VALUE;
ret = fts_write(cmd, 2);
if (ret < 0) {
FTS_ERROR("upgrade mode(09) cmd write fail");
goto fw_reset;
}
cmd[0] = FTS_CMD_DATA_LEN;
cmd[1] = BYTE_OFF_16(len);
cmd[2] = BYTE_OFF_8(len);
cmd[3] = BYTE_OFF_0(len);
ret = fts_write(cmd, FTS_CMD_DATA_LEN_LEN);
if (ret < 0) {
FTS_ERROR("data len cmd write fail");
goto fw_reset;
}
ret = fts_fwupg_erase(FTS_REASE_APP_DELAY);
if (ret < 0) {
FTS_ERROR("erase cmd write fail");
goto fw_reset;
}
/* write app */
start_addr = upgrade_func_ft5452.appoff;
ecc_in_host = fts_flash_write_buf(start_addr, buf, len, 1);
if (ecc_in_host < 0 ) {
FTS_ERROR("lcd initial code write fail");
goto fw_reset;
}
FTS_INFO( "**********read out checksum**********");
/* check sum init */
wbuf[0] = FTS_CMD_ECC_INIT;
ret = fts_write(wbuf, 1);
if (ret < 0) {
FTS_ERROR("ecc init cmd write fail");
return ret;
}
/* send commond to start checksum */
wbuf[0] = FTS_CMD_ECC_CAL;
wbuf[1] = BYTE_OFF_16(start_addr);
wbuf[2] = BYTE_OFF_8(start_addr);
wbuf[3] = BYTE_OFF_0(start_addr);
wbuf[4] = BYTE_OFF_16(len);
wbuf[5] = BYTE_OFF_8(len);
wbuf[6] = BYTE_OFF_0(len);
FTS_DEBUG("ecc calc startaddr:0x%04x, len:%d", start_addr, len);
ret = fts_write(wbuf, 7);
if (ret < 0) {
FTS_ERROR("ecc calc cmd write fail");
return ret;
}
msleep(len / 256);
/* read status if check sum is finished */
for (i = 0; i < FTS_RETRIES_ECC_CAL; i++) {
wbuf[0] = FTS_CMD_FLASH_STATUS;
reg_val[0] = reg_val[1] = 0x00;
fts_read(wbuf, 1, reg_val, 2);
FTS_DEBUG("[UPGRADE]: reg_val[0]=%02x reg_val[0]=%02x!!", reg_val[0], reg_val[1]);
if ((0xF0 == reg_val[0]) && (0x55 == reg_val[1])) {
break;
}
msleep(FTS_RETRIES_DELAY_ECC_CAL);
}
/* read out check sum */
wbuf[0] = FTS_CMD_ECC_READ;
ret = fts_read(wbuf, 1, reg_val, 1);
if (ret < 0) {
FTS_ERROR( "ecc read cmd write fail");
return ret;
}
ecc_in_tp = reg_val[0];
FTS_INFO("ecc in tp:%x, host:%x", ecc_in_tp, ecc_in_host);
if (ecc_in_tp != ecc_in_host) {
FTS_ERROR("ecc check fail");
goto fw_reset;
}
FTS_INFO("upgrade success, reset to normal boot");
ret = fts_fwupg_reset_in_boot();
if (ret < 0) {
FTS_ERROR("reset to normal boot fail");
}
msleep(200);
return 0;
fw_reset:
FTS_INFO("upgrade fail, reset to normal boot");
ret = fts_fwupg_reset_in_boot();
if (ret < 0) {
FTS_ERROR("reset to normal boot fail");
}
return -EIO;
}
struct upgrade_func upgrade_func_ft5452 = {
.ctype = {0x81},
.fwveroff = 0x010E,
.fwcfgoff = 0x1FFB0,
.appoff = 0x0000,
.pramboot_supported = false,
.hid_supported = true,
.upgrade = fts_ft5452_upgrade,
};

View file

@ -0,0 +1,194 @@
/*
*
* FocalTech fts TouchScreen driver.
*
* Copyright (c) 2012-2020, Focaltech Ltd. All rights reserved.
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
* may be copied, distributed, and modified under those terms.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*/
/*****************************************************************************
*
* File Name: focaltech_upgrade_ft5452.c
*
* Author: Focaltech Driver Team
*
* Created: 2016-08-15
*
* Abstract:
*
* Reference:
*
*****************************************************************************/
/*****************************************************************************
* 1.Included header files
*****************************************************************************/
#include "../focaltech_flash.h"
/*****************************************************************************
* Global variable or extern global variabls/functions
*****************************************************************************/
u8 pb_file_ft5452i[] = {
#include "../include/pramboot/FT5452i_Pramboot_v4.1_20210427.i"
};
/*****************************************************************************
* Private constant and macro definitions using #define
*****************************************************************************/
/************************************************************************
* Name: fts_ft5452_upgrade
* Brief:
* Input:
* Output:
* Return: return 0 if success, otherwise return error code
***********************************************************************/
static int fts_ft5452i_upgrade(u8 *buf, u32 len)
{
int ret = 0;
u32 start_addr = 0;
u8 cmd[4] = { 0 };
int ecc_in_host = 0;
int ecc_in_tp = 0;
int i = 0;
u8 wbuf[7] = { 0 };
u8 reg_val[4] = {0};
if ((NULL == buf) || (len < FTS_MIN_LEN)) {
FTS_ERROR("buffer/len(%x) is invalid", len);
return -EINVAL;
}
/* enter into upgrade environment */
ret = fts_fwupg_enter_into_boot();
if (ret < 0) {
FTS_ERROR("enter into pramboot/bootloader fail,ret=%d", ret);
goto fw_reset;
}
cmd[0] = FTS_CMD_FLASH_MODE;
cmd[1] = FLASH_MODE_UPGRADE_VALUE;
ret = fts_write(cmd, 2);
if (ret < 0) {
FTS_ERROR("upgrade mode(09) cmd write fail");
goto fw_reset;
}
cmd[0] = FTS_CMD_DATA_LEN;
cmd[1] = BYTE_OFF_16(len);
cmd[2] = BYTE_OFF_8(len);
cmd[3] = BYTE_OFF_0(len);
ret = fts_write(cmd, FTS_CMD_DATA_LEN_LEN);
if (ret < 0) {
FTS_ERROR("data len cmd write fail");
goto fw_reset;
}
ret = fts_fwupg_erase(FTS_REASE_APP_DELAY);
if (ret < 0) {
FTS_ERROR("erase cmd write fail");
goto fw_reset;
}
/* write app */
start_addr = upgrade_func_ft5452i.appoff;
ecc_in_host = fts_flash_write_buf(start_addr, buf, len, 1);
if (ecc_in_host < 0 ) {
FTS_ERROR("flash write fail");
goto fw_reset;
}
FTS_INFO( "**********read out checksum**********");
/* check sum init */
wbuf[0] = FTS_CMD_ECC_INIT;
ret = fts_write(wbuf, 1);
if (ret < 0) {
FTS_ERROR("ecc init cmd write fail");
return ret;
}
/* send commond to start checksum */
wbuf[0] = FTS_CMD_ECC_CAL;
wbuf[1] = BYTE_OFF_16(start_addr);
wbuf[2] = BYTE_OFF_8(start_addr);
wbuf[3] = BYTE_OFF_0(start_addr);
wbuf[4] = BYTE_OFF_16(len);
wbuf[5] = BYTE_OFF_8(len);
wbuf[6] = BYTE_OFF_0(len);
FTS_DEBUG("ecc calc startaddr:0x%04x, len:%d", start_addr, len);
ret = fts_write(wbuf, 7);
if (ret < 0) {
FTS_ERROR("ecc calc cmd write fail");
return ret;
}
msleep(len / 256);
/* read status if check sum is finished */
for (i = 0; i < FTS_RETRIES_ECC_CAL; i++) {
wbuf[0] = FTS_CMD_FLASH_STATUS;
reg_val[0] = reg_val[1] = 0x00;
fts_read(wbuf, 1, reg_val, 2);
FTS_DEBUG("[UPGRADE]: reg_val[0]=%02x reg_val[0]=%02x!!", reg_val[0], reg_val[1]);
if ((0xF0 == reg_val[0]) && (0x55 == reg_val[1])) {
break;
}
msleep(FTS_RETRIES_DELAY_ECC_CAL);
}
/* read out check sum */
wbuf[0] = FTS_CMD_ECC_READ;
ret = fts_read(wbuf, 1, reg_val, 1);
if (ret < 0) {
FTS_ERROR( "ecc read cmd write fail");
return ret;
}
ecc_in_tp = reg_val[0];
FTS_INFO("ecc in tp:%x, host:%x", ecc_in_tp, ecc_in_host);
if (ecc_in_tp != ecc_in_host) {
FTS_ERROR("ecc check fail");
goto fw_reset;
}
FTS_INFO("upgrade success, reset to normal boot");
ret = fts_fwupg_reset_in_boot();
if (ret < 0) {
FTS_ERROR("reset to normal boot fail");
}
msleep(200);
return 0;
fw_reset:
FTS_INFO("upgrade fail, reset to normal boot");
ret = fts_fwupg_reset_in_boot();
if (ret < 0) {
FTS_ERROR("reset to normal boot fail");
}
return -EIO;
}
struct upgrade_func upgrade_func_ft5452i = {
.ctype = {0x89},
.fwveroff = 0x010E,
.fwcfgoff = 0x1FFB0,
.appoff = 0x0000,
.pramboot_supported = true,
.pramboot = pb_file_ft5452i,
.pb_length = sizeof(pb_file_ft5452i),
.pram_ecc_check_mode = ECC_CHECK_MODE_CRC16,
.new_return_value_from_ic = true,
.hid_supported = false,
.upgrade = fts_ft5452i_upgrade,
};

View file

@ -0,0 +1,460 @@
/*
*
* FocalTech TouchScreen driver.
*
* Copyright (c) 2012-2020, Focaltech Ltd. All rights reserved.
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
* may be copied, distributed, and modified under those terms.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*/
/*****************************************************************************
*
* File Name: focaltech_gestrue.c
*
* Author: Focaltech Driver Team
*
* Created: 2016-08-08
*
* Abstract:
*
* Reference:
*
*****************************************************************************/
/*****************************************************************************
* 1.Included header files
*****************************************************************************/
#include "focaltech_core.h"
/******************************************************************************
* Private constant and macro definitions using #define
*****************************************************************************/
#define KEY_GESTURE_U KEY_U
#define KEY_GESTURE_UP KEY_UP
#define KEY_GESTURE_DOWN KEY_DOWN
#define KEY_GESTURE_LEFT KEY_LEFT
#define KEY_GESTURE_RIGHT KEY_RIGHT
#define KEY_GESTURE_O KEY_O
#define KEY_GESTURE_E KEY_E
#define KEY_GESTURE_M KEY_M
#define KEY_GESTURE_L KEY_L
#define KEY_GESTURE_W KEY_W
#define KEY_GESTURE_S KEY_S
#define KEY_GESTURE_V KEY_V
#define KEY_GESTURE_C KEY_C
#define KEY_GESTURE_Z KEY_Z
#define GESTURE_LEFT 0x20
#define GESTURE_RIGHT 0x21
#define GESTURE_UP 0x22
#define GESTURE_DOWN 0x23
#define GESTURE_DOUBLECLICK 0x24
#define GESTURE_O 0x30
#define GESTURE_W 0x31
#define GESTURE_M 0x32
#define GESTURE_E 0x33
#define GESTURE_L 0x44
#define GESTURE_S 0x46
#define GESTURE_V 0x54
#define GESTURE_Z 0x41
#define GESTURE_C 0x34
/*****************************************************************************
* Private enumerations, structures and unions using typedef
*****************************************************************************/
/*
* gesture_id - mean which gesture is recognised
* point_num - points number of this gesture
* coordinate_x - All gesture point x coordinate
* coordinate_y - All gesture point y coordinate
* mode - gesture enable/disable, need enable by host
* - 1:enable gesture function(default) 0:disable
* active - gesture work flag,
* always set 1 when suspend, set 0 when resume
*/
struct fts_gesture_st {
u8 gesture_id;
u8 point_num;
u16 coordinate_x[FTS_GESTURE_POINTS_MAX];
u16 coordinate_y[FTS_GESTURE_POINTS_MAX];
};
/*****************************************************************************
* Static variables
*****************************************************************************/
static struct fts_gesture_st fts_gesture_data;
/*****************************************************************************
* Global variable or extern global variabls/functions
*****************************************************************************/
/*****************************************************************************
* Static function prototypes
*****************************************************************************/
static ssize_t fts_gesture_show(
struct device *dev, struct device_attribute *attr, char *buf)
{
int count = 0;
u8 val = 0;
struct fts_ts_data *ts_data = fts_data;
mutex_lock(&ts_data->input_dev->mutex);
fts_read_reg(FTS_REG_GESTURE_EN, &val);
count = snprintf(buf, PAGE_SIZE, "Gesture Mode:%s\n",
ts_data->gesture_mode ? "On" : "Off");
count += snprintf(buf + count, PAGE_SIZE, "Reg(0xD0)=%d\n", val);
mutex_unlock(&ts_data->input_dev->mutex);
return count;
}
static ssize_t fts_gesture_store(
struct device *dev,
struct device_attribute *attr, const char *buf, size_t count)
{
struct fts_ts_data *ts_data = fts_data;
mutex_lock(&ts_data->input_dev->mutex);
if (FTS_SYSFS_ECHO_ON(buf)) {
FTS_DEBUG("enable gesture");
ts_data->gesture_mode = ENABLE;
} else if (FTS_SYSFS_ECHO_OFF(buf)) {
FTS_DEBUG("disable gesture");
ts_data->gesture_mode = DISABLE;
}
mutex_unlock(&ts_data->input_dev->mutex);
return count;
}
static ssize_t fts_gesture_buf_show(
struct device *dev, struct device_attribute *attr, char *buf)
{
int count = 0;
int i = 0;
struct input_dev *input_dev = fts_data->input_dev;
struct fts_gesture_st *gesture = &fts_gesture_data;
mutex_lock(&input_dev->mutex);
count = snprintf(buf, PAGE_SIZE, "Gesture ID:%d\n", gesture->gesture_id);
count += snprintf(buf + count, PAGE_SIZE, "Gesture PointNum:%d\n",
gesture->point_num);
count += snprintf(buf + count, PAGE_SIZE, "Gesture Points Buffer:\n");
/* save point data,max:6 */
for (i = 0; i < FTS_GESTURE_POINTS_MAX; i++) {
count += snprintf(buf + count, PAGE_SIZE, "%3d(%4d,%4d) ", i,
gesture->coordinate_x[i], gesture->coordinate_y[i]);
if ((i + 1) % 4 == 0)
count += snprintf(buf + count, PAGE_SIZE, "\n");
}
count += snprintf(buf + count, PAGE_SIZE, "\n");
mutex_unlock(&input_dev->mutex);
return count;
}
static ssize_t fts_gesture_buf_store(
struct device *dev,
struct device_attribute *attr, const char *buf, size_t count)
{
return -EPERM;
}
/* sysfs gesture node
* read example: cat fts_gesture_mode ---read gesture mode
* write example:echo 1 > fts_gesture_mode --- write gesture mode to 1
*
*/
static DEVICE_ATTR(fts_gesture_mode, S_IRUGO | S_IWUSR, fts_gesture_show,
fts_gesture_store);
/*
* read example: cat fts_gesture_buf --- read gesture buf
*/
static DEVICE_ATTR(fts_gesture_buf, S_IRUGO | S_IWUSR,
fts_gesture_buf_show, fts_gesture_buf_store);
static struct attribute *fts_gesture_mode_attrs[] = {
&dev_attr_fts_gesture_mode.attr,
&dev_attr_fts_gesture_buf.attr,
NULL,
};
static struct attribute_group fts_gesture_group = {
.attrs = fts_gesture_mode_attrs,
};
static int fts_create_gesture_sysfs(struct device *dev)
{
int ret = 0;
ret = sysfs_create_group(&dev->kobj, &fts_gesture_group);
if (ret) {
FTS_ERROR("gesture sys node create fail");
sysfs_remove_group(&dev->kobj, &fts_gesture_group);
return ret;
}
return 0;
}
static void fts_gesture_report(struct input_dev *input_dev, int gesture_id)
{
int gesture;
FTS_DEBUG("gesture_id:0x%x", gesture_id);
switch (gesture_id) {
case GESTURE_LEFT:
gesture = KEY_GESTURE_LEFT;
break;
case GESTURE_RIGHT:
gesture = KEY_GESTURE_RIGHT;
break;
case GESTURE_UP:
gesture = KEY_GESTURE_UP;
break;
case GESTURE_DOWN:
gesture = KEY_GESTURE_DOWN;
break;
case GESTURE_DOUBLECLICK:
gesture = KEY_GESTURE_U;
break;
case GESTURE_O:
gesture = KEY_GESTURE_O;
break;
case GESTURE_W:
gesture = KEY_GESTURE_W;
break;
case GESTURE_M:
gesture = KEY_GESTURE_M;
break;
case GESTURE_E:
gesture = KEY_GESTURE_E;
break;
case GESTURE_L:
gesture = KEY_GESTURE_L;
break;
case GESTURE_S:
gesture = KEY_GESTURE_S;
break;
case GESTURE_V:
gesture = KEY_GESTURE_V;
break;
case GESTURE_Z:
gesture = KEY_GESTURE_Z;
break;
case GESTURE_C:
gesture = KEY_GESTURE_C;
break;
default:
gesture = -1;
break;
}
/* report event key */
if (gesture != -1) {
FTS_DEBUG("Gesture Code=%d", gesture);
input_report_key(input_dev, gesture, 1);
input_sync(input_dev);
input_report_key(input_dev, gesture, 0);
input_sync(input_dev);
}
}
/*****************************************************************************
* Name: fts_gesture_readdata
* Brief: Read information about gesture: enable flag/gesture points..., if ges-
* ture enable, save gesture points' information, and report to OS.
* It will be called this function every intrrupt when FTS_GESTURE_EN = 1
*
* gesture data length: 1(enable) + 1(reserve) + 2(header) + 6 * 4
* Input: ts_data - global struct data
* data - gesture data buffer if non-flash, else NULL
* Output:
* Return: 0 - read gesture data successfully, the report data is gesture data
* 1 - tp not in suspend/gesture not enable in TP FW
* -Exx - error
*****************************************************************************/
int fts_gesture_readdata(struct fts_ts_data *ts_data, u8 *data)
{
int ret = 0;
int i = 0;
int index = 0;
u8 buf[FTS_GESTURE_DATA_LEN] = { 0 };
struct input_dev *input_dev = ts_data->input_dev;
struct fts_gesture_st *gesture = &fts_gesture_data;
if (!ts_data->suspended || !ts_data->gesture_mode) {
return 1;
}
ret = fts_read_reg(FTS_REG_GESTURE_EN, &buf[0]);
if ((ret < 0) || (buf[0] != ENABLE)) {
FTS_DEBUG("gesture not enable in fw, don't process gesture");
return 1;
}
buf[2] = FTS_REG_GESTURE_OUTPUT_ADDRESS;
ret = fts_read(&buf[2], 1, &buf[2], FTS_GESTURE_DATA_LEN - 2);
if (ret < 0) {
FTS_ERROR("read gesture header data fail");
return ret;
}
/* init variable before read gesture point */
memset(gesture->coordinate_x, 0, FTS_GESTURE_POINTS_MAX * sizeof(u16));
memset(gesture->coordinate_y, 0, FTS_GESTURE_POINTS_MAX * sizeof(u16));
gesture->gesture_id = buf[2];
gesture->point_num = buf[3];
FTS_DEBUG("gesture_id=%d, point_num=%d",
gesture->gesture_id, gesture->point_num);
/* save point data,max:6 */
for (i = 0; i < FTS_GESTURE_POINTS_MAX; i++) {
index = 4 * i + 4;
gesture->coordinate_x[i] = (u16)(((buf[0 + index] & 0x0F) << 8)
+ buf[1 + index]);
gesture->coordinate_y[i] = (u16)(((buf[2 + index] & 0x0F) << 8)
+ buf[3 + index]);
}
/* report gesture to OS */
fts_gesture_report(input_dev, gesture->gesture_id);
return 0;
}
void fts_gesture_recovery(struct fts_ts_data *ts_data)
{
if (ts_data->gesture_mode && ts_data->suspended) {
FTS_DEBUG("gesture recovery...");
fts_write_reg(0xD1, 0xFF);
fts_write_reg(0xD2, 0xFF);
fts_write_reg(0xD5, 0xFF);
fts_write_reg(0xD6, 0xFF);
fts_write_reg(0xD7, 0xFF);
fts_write_reg(0xD8, 0xFF);
fts_write_reg(FTS_REG_GESTURE_EN, ENABLE);
}
}
int fts_gesture_suspend(struct fts_ts_data *ts_data)
{
int i = 0;
u8 state = 0xFF;
FTS_FUNC_ENTER();
if (enable_irq_wake(ts_data->irq)) {
FTS_DEBUG("enable_irq_wake(irq:%d) fail", ts_data->irq);
}
for (i = 0; i < 5; i++) {
fts_write_reg(0xD1, 0xFF);
fts_write_reg(0xD2, 0xFF);
fts_write_reg(0xD5, 0xFF);
fts_write_reg(0xD6, 0xFF);
fts_write_reg(0xD7, 0xFF);
fts_write_reg(0xD8, 0xFF);
fts_write_reg(FTS_REG_GESTURE_EN, ENABLE);
msleep(1);
fts_read_reg(FTS_REG_GESTURE_EN, &state);
if (state == ENABLE)
break;
}
if (i >= 5)
FTS_ERROR("make IC enter into gesture(suspend) fail,state:%x", state);
else
FTS_INFO("Enter into gesture(suspend) successfully");
FTS_FUNC_EXIT();
return 0;
}
int fts_gesture_resume(struct fts_ts_data *ts_data)
{
int i = 0;
u8 state = 0xFF;
FTS_FUNC_ENTER();
if (disable_irq_wake(ts_data->irq)) {
FTS_DEBUG("disable_irq_wake(irq:%d) fail", ts_data->irq);
}
for (i = 0; i < 5; i++) {
fts_write_reg(FTS_REG_GESTURE_EN, DISABLE);
msleep(1);
fts_read_reg(FTS_REG_GESTURE_EN, &state);
if (state == DISABLE)
break;
}
if (i >= 5)
FTS_ERROR("make IC exit gesture(resume) fail,state:%x", state);
else
FTS_INFO("resume from gesture successfully");
FTS_FUNC_EXIT();
return 0;
}
int fts_gesture_init(struct fts_ts_data *ts_data)
{
struct input_dev *input_dev = ts_data->input_dev;
FTS_FUNC_ENTER();
input_set_capability(input_dev, EV_KEY, KEY_POWER);
input_set_capability(input_dev, EV_KEY, KEY_GESTURE_U);
input_set_capability(input_dev, EV_KEY, KEY_GESTURE_UP);
input_set_capability(input_dev, EV_KEY, KEY_GESTURE_DOWN);
input_set_capability(input_dev, EV_KEY, KEY_GESTURE_LEFT);
input_set_capability(input_dev, EV_KEY, KEY_GESTURE_RIGHT);
input_set_capability(input_dev, EV_KEY, KEY_GESTURE_O);
input_set_capability(input_dev, EV_KEY, KEY_GESTURE_E);
input_set_capability(input_dev, EV_KEY, KEY_GESTURE_M);
input_set_capability(input_dev, EV_KEY, KEY_GESTURE_L);
input_set_capability(input_dev, EV_KEY, KEY_GESTURE_W);
input_set_capability(input_dev, EV_KEY, KEY_GESTURE_S);
input_set_capability(input_dev, EV_KEY, KEY_GESTURE_V);
input_set_capability(input_dev, EV_KEY, KEY_GESTURE_Z);
input_set_capability(input_dev, EV_KEY, KEY_GESTURE_C);
__set_bit(KEY_GESTURE_RIGHT, input_dev->keybit);
__set_bit(KEY_GESTURE_LEFT, input_dev->keybit);
__set_bit(KEY_GESTURE_UP, input_dev->keybit);
__set_bit(KEY_GESTURE_DOWN, input_dev->keybit);
__set_bit(KEY_GESTURE_U, input_dev->keybit);
__set_bit(KEY_GESTURE_O, input_dev->keybit);
__set_bit(KEY_GESTURE_E, input_dev->keybit);
__set_bit(KEY_GESTURE_M, input_dev->keybit);
__set_bit(KEY_GESTURE_W, input_dev->keybit);
__set_bit(KEY_GESTURE_L, input_dev->keybit);
__set_bit(KEY_GESTURE_S, input_dev->keybit);
__set_bit(KEY_GESTURE_V, input_dev->keybit);
__set_bit(KEY_GESTURE_C, input_dev->keybit);
__set_bit(KEY_GESTURE_Z, input_dev->keybit);
fts_create_gesture_sysfs(ts_data->dev);
memset(&fts_gesture_data, 0, sizeof(struct fts_gesture_st));
ts_data->gesture_mode = FTS_GESTURE_EN;
FTS_FUNC_EXIT();
return 0;
}
int fts_gesture_exit(struct fts_ts_data *ts_data)
{
FTS_FUNC_ENTER();
sysfs_remove_group(&ts_data->dev->kobj, &fts_gesture_group);
FTS_FUNC_EXIT();
return 0;
}

View file

@ -0,0 +1,193 @@
/*
*
* FocalTech TouchScreen driver.
*
* Copyright (c) 2012-2020, FocalTech Systems, Ltd., all rights reserved.
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
* may be copied, distributed, and modified under those terms.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*/
/************************************************************************
*
* File Name: focaltech_i2c.c
*
* Author: Focaltech Driver Team
*
* Created: 2016-08-04
*
* Abstract: i2c communication with TP
*
* Version: v1.0
*
* Revision History:
*
************************************************************************/
/*****************************************************************************
* Included header files
*****************************************************************************/
#include "focaltech_core.h"
/*****************************************************************************
* Private constant and macro definitions using #define
*****************************************************************************/
#define I2C_RETRY_NUMBER 3
#define I2C_BUF_LENGTH 256
/*****************************************************************************
* Private enumerations, structures and unions using typedef
*****************************************************************************/
/*****************************************************************************
* Static variables
*****************************************************************************/
/*****************************************************************************
* Global variable or extern global variabls/functions
*****************************************************************************/
/*****************************************************************************
* Static function prototypes
*****************************************************************************/
/*****************************************************************************
* functions body
*****************************************************************************/
int fts_read(u8 *cmd, u32 cmdlen, u8 *data, u32 datalen)
{
int ret = 0;
int i = 0;
struct fts_ts_data *ts_data = fts_data;
struct i2c_msg msg_list[2];
struct i2c_msg *msg = NULL;
int msg_num = 0;
/* must have data when read */
if (!ts_data || !ts_data->client || !data || !datalen
|| (datalen > I2C_BUF_LENGTH) || (cmdlen > I2C_BUF_LENGTH)) {
FTS_ERROR("fts_data/client/cmdlen(%d)/data/datalen(%d) is invalid",
cmdlen, datalen);
return -EINVAL;
}
mutex_lock(&ts_data->bus_lock);
memset(&msg_list[0], 0, sizeof(struct i2c_msg));
memset(&msg_list[1], 0, sizeof(struct i2c_msg));
memcpy(ts_data->bus_tx_buf, cmd, cmdlen);
msg_list[0].addr = ts_data->client->addr;
msg_list[0].flags = 0;
msg_list[0].len = cmdlen;
msg_list[0].buf = ts_data->bus_tx_buf;
msg_list[1].addr = ts_data->client->addr;
msg_list[1].flags = I2C_M_RD;
msg_list[1].len = datalen;
msg_list[1].buf = ts_data->bus_rx_buf;
if (cmd && cmdlen) {
msg = &msg_list[0];
msg_num = 2;
} else {
msg = &msg_list[1];
msg_num = 1;
}
for (i = 0; i < I2C_RETRY_NUMBER; i++) {
ret = i2c_transfer(ts_data->client->adapter, msg, msg_num);
if (ret < 0) {
FTS_ERROR("i2c_transfer(read) fail,ret:%d", ret);
} else {
memcpy(data, ts_data->bus_rx_buf, datalen);
break;
}
}
mutex_unlock(&ts_data->bus_lock);
return ret;
}
int fts_write(u8 *writebuf, u32 writelen)
{
int ret = 0;
int i = 0;
struct fts_ts_data *ts_data = fts_data;
struct i2c_msg msgs;
if (!ts_data || !ts_data->client || !writebuf || !writelen
|| (writelen > I2C_BUF_LENGTH)) {
FTS_ERROR("fts_data/client/data/datalen(%d) is invalid", writelen);
return -EINVAL;
}
mutex_lock(&ts_data->bus_lock);
memset(&msgs, 0, sizeof(struct i2c_msg));
memcpy(ts_data->bus_tx_buf, writebuf, writelen);
msgs.addr = ts_data->client->addr;
msgs.flags = 0;
msgs.len = writelen;
msgs.buf = ts_data->bus_tx_buf;
for (i = 0; i < I2C_RETRY_NUMBER; i++) {
ret = i2c_transfer(ts_data->client->adapter, &msgs, 1);
if (ret < 0) {
FTS_ERROR("i2c_transfer(write) fail,ret:%d", ret);
} else {
break;
}
}
mutex_unlock(&ts_data->bus_lock);
return ret;
}
int fts_read_reg(u8 addr, u8 *value)
{
return fts_read(&addr, 1, value, 1);
}
int fts_write_reg(u8 addr, u8 value)
{
u8 buf[2] = { 0 };
buf[0] = addr;
buf[1] = value;
return fts_write(buf, sizeof(buf));
}
int fts_bus_init(struct fts_ts_data *ts_data)
{
FTS_FUNC_ENTER();
ts_data->bus_tx_buf = kzalloc(I2C_BUF_LENGTH, GFP_KERNEL);
if (NULL == ts_data->bus_tx_buf) {
FTS_ERROR("failed to allocate memory for bus_tx_buf");
return -ENOMEM;
}
ts_data->bus_rx_buf = kzalloc(I2C_BUF_LENGTH, GFP_KERNEL);
if (NULL == ts_data->bus_rx_buf) {
FTS_ERROR("failed to allocate memory for bus_rx_buf");
return -ENOMEM;
}
FTS_FUNC_EXIT();
return 0;
}
int fts_bus_exit(struct fts_ts_data *ts_data)
{
FTS_FUNC_ENTER();
if (ts_data && ts_data->bus_tx_buf) {
kfree(ts_data->bus_tx_buf);
ts_data->bus_tx_buf = NULL;
}
if (ts_data && ts_data->bus_rx_buf) {
kfree(ts_data->bus_rx_buf);
ts_data->bus_rx_buf = NULL;
}
FTS_FUNC_EXIT();
return 0;
}

View file

@ -0,0 +1,129 @@
/*
*
* FocalTech TouchScreen driver.
*
* Copyright (c) 2012-2020, FocalTech Systems, Ltd., all rights reserved.
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
* may be copied, distributed, and modified under those terms.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*/
/*****************************************************************************
*
* File Name: focaltech_point_report_check.c
*
* Author: Focaltech Driver Team
*
* Created: 2016-11-16
*
* Abstract: point report check function
*
* Version: v1.0
*
* Revision History:
*
*****************************************************************************/
/*****************************************************************************
* Included header files
*****************************************************************************/
#include "focaltech_core.h"
#if FTS_POINT_REPORT_CHECK_EN
/*****************************************************************************
* Private constant and macro definitions using #define
*****************************************************************************/
#define POINT_REPORT_CHECK_WAIT_TIME 200 /* unit:ms */
#define PRC_INTR_INTERVALS 100 /* unit:ms */
/*****************************************************************************
* functions body
*****************************************************************************/
/*****************************************************************************
* Name: fts_prc_func
* Brief: fts point report check work func, report whole up of points
* Input:
* Output:
* Return:
*****************************************************************************/
static void fts_prc_func(struct work_struct *work)
{
struct fts_ts_data *ts_data = container_of(work,
struct fts_ts_data, prc_work.work);
unsigned long cur_jiffies = jiffies;
unsigned long intr_timeout = msecs_to_jiffies(PRC_INTR_INTERVALS);
intr_timeout += ts_data->intr_jiffies;
if (time_after(cur_jiffies, intr_timeout)) {
fts_release_all_finger();
ts_data->prc_mode = 0;
//FTS_DEBUG("interval:%lu", (cur_jiffies - ts_data->intr_jiffies) * 1000 / HZ);
} else {
queue_delayed_work(ts_data->ts_workqueue, &ts_data->prc_work,
msecs_to_jiffies(POINT_REPORT_CHECK_WAIT_TIME));
ts_data->prc_mode = 1;
}
}
/*****************************************************************************
* Name: fts_prc_queue_work
* Brief: fts point report check queue work, call it when interrupt comes
* Input:
* Output:
* Return:
*****************************************************************************/
void fts_prc_queue_work(struct fts_ts_data *ts_data)
{
ts_data->intr_jiffies = jiffies;
if (!ts_data->prc_mode) {
queue_delayed_work(ts_data->ts_workqueue, &ts_data->prc_work,
msecs_to_jiffies(POINT_REPORT_CHECK_WAIT_TIME));
ts_data->prc_mode = 1;
}
}
/*****************************************************************************
* Name: fts_point_report_check_init
* Brief:
* Input:
* Output:
* Return: < 0: Fail to create esd check queue
*****************************************************************************/
int fts_point_report_check_init(struct fts_ts_data *ts_data)
{
FTS_FUNC_ENTER();
if (ts_data->ts_workqueue) {
INIT_DELAYED_WORK(&ts_data->prc_work, fts_prc_func);
} else {
FTS_ERROR("fts workqueue is NULL, can't run point report check function");
return -EINVAL;
}
FTS_FUNC_EXIT();
return 0;
}
/*****************************************************************************
* Name: fts_point_report_check_exit
* Brief:
* Input:
* Output:
* Return:
*****************************************************************************/
int fts_point_report_check_exit(struct fts_ts_data *ts_data)
{
FTS_FUNC_ENTER();
FTS_FUNC_EXIT();
return 0;
}
#endif /* FTS_POINT_REPORT_CHECK_EN */

View file

@ -0,0 +1,3 @@
obj-$(CONFIG_TOUCHSCREEN_FT3519) += focaltech_test.o
obj-$(CONFIG_TOUCHSCREEN_FT3519) += focaltech_test_ini.o
obj-$(CONFIG_TOUCHSCREEN_FT3519) += supported_ic/

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,648 @@
/************************************************************************
* Copyright (c) 2012-2020, FocalTech Systems, Ltd., all rights reserved.
*
* File Name: focaltech_test.h
*
* Author: Focaltech Driver Team
*
* Created: 2016-08-01
*
* Abstract: test entry for all IC
*
************************************************************************/
#ifndef _TEST_LIB_H
#define _TEST_LIB_H
/*****************************************************************************
* Included header files
*****************************************************************************/
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/debugfs.h>
#include <asm/uaccess.h>
#include <linux/i2c.h>//iic
#include <linux/delay.h>//msleep
#include <linux/string.h>
#include <asm/unistd.h>
#include <linux/vmalloc.h>
#include <linux/time.h>
#include "../focaltech_core.h"
#include "focaltech_test_ini.h"
/*****************************************************************************
* Macro definitions using #define
*****************************************************************************/
#define FTS_INI_FILE_PATH "/mnt/sdcard/"
#define FTS_CSV_FILE_NAME "testdata.csv"
#define FTS_TXT_FILE_NAME "testresult.txt"
#define false 0
#define true 1
#define TEST_ICSERIES_LEN (8)
#define TEST_ICSERIES(x) ((x) >> TEST_ICSERIES_LEN)
#define TEST_OPEN_MAX_VALUE (255)
#define BYTES_PER_TIME (32) /* max:128 */
/* CSV & TXT */
#define CSV_LINE2_BUFFER_LEN (1024)
#define CSV_BUFFER_LEN (1024*80*5)
#define TXT_BUFFER_LEN (1024*80*5)
#define TEST_SAVE_FAIL_RESULT 0
/*-----------------------------------------------------------
Test Status
-----------------------------------------------------------*/
#define RESULT_NULL 0
#define RESULT_PASS 1
#define RESULT_NG 2
#define TX_NUM_MAX 60
#define RX_NUM_MAX 100
#define SC_NUM_MAX ((TX_NUM_MAX) + (RX_NUM_MAX))
#define NUM_MAX_SC (144)
#define KEY_NUM_MAX 6
#define TEST_ITEM_COUNT_MAX 32
#define TEST_ITEM_NAME_MAX 32
#define TEST_SHORT_RES_MAX 0xFFFF
/*
* factory test registers
*/
#define ENTER_WORK_FACTORY_RETRIES 5
#define START_SCAN_RETRIES_INCELL 20
#define START_SCAN_RETRIES_DELAY_INCELL 16
#define FACTORY_TEST_RETRY 50
#define FACTORY_TEST_DELAY 18
#define FACTORY_TEST_RETRY_DELAY 100
#define DEVIDE_MODE_ADDR 0x00
#define REG_FW_VERSION 0xA6
#define REG_VA_TOUCH_THR 0x80
#define REG_VKEY_TOUCH_THR 0x82
#define FACTORY_REG_LINE_ADDR 0x01
#define FACTORY_REG_CHX_NUM 0x02
#define FACTORY_REG_CHY_NUM 0x03
#define FACTORY_REG_CLB 0x04
#define FACTORY_REG_DATA_SELECT 0x06
#define FACTORY_REG_RAWBUF_SELECT 0x09
#define FACTORY_REG_KEY_CBWIDTH 0x0B
#define FACTORY_REG_PARAM_UPDATE_STATE 0x0E
#define FACTORY_REG_SHORT_TEST_EN 0x0F
#define FACTORY_REG_SHORT_TEST_STATE 0x10
#define FACTORY_REG_LCD_NOISE_START 0x11
#define FACTORY_REG_LCD_NOISE_FRAME 0x12
#define FACTORY_REG_LCD_NOISE_TEST_STATE 0x13
#define FACTORY_REG_LCD_NOISE_TTHR 0x14
#define FACTORY_REG_OPEN_START 0x15
#define FACTORY_REG_OPEN_STATE 0x16
#define FACTORY_REG_OPEN_ADDR 0xCF
#define FACTORY_REG_OPEN_IDLE 0x03
#define FACTORY_REG_OPEN_BUSY 0x01
#define FACTORY_REG_CB_ADDR_H 0x18
#define FACTORY_REG_CB_ADDR_L 0x19
#define FACTORY_REG_ORDER_ADDR_H 0x1A
#define FACTORY_REG_ORDER_ADDR_L 0x1B
#define FACTORY_REG_LCD_NOISE_STATE 0x1E
#define FACTORY_REG_KEYSHORT_EN 0x2E
#define FACTORY_REG_KEYSHORT_STATE 0x2F
#define FACTORY_REG_LEFT_KEY 0x1E
#define FACTORY_REG_RIGHT_KEY 0x1F
#define FACTORY_REG_OPEN_REG20 0x20
#define FACTORY_REG_OPEN_REG21 0x21
#define FACTORY_REG_OPEN_REG22 0x22
#define FACTORY_REG_OPEN_REG23 0x23
#define FACTORY_REG_OPEN_REG2E 0x2E
#define FACTORY_REG_OPEN_REG86 0x86
#define FACTORY_REG_K1 0x31
#define FACTORY_REG_K2 0x32
#define FACTORY_REG_RAWDATA_ADDR 0x6A
#define FACTORY_REG_ORDER_ADDR 0x6C
#define FACTORY_REG_CB_ADDR 0x6E
#define FACTORY_REG_SHORT_ADDR 0x89
#define FACTORY_REG_RAWDATA_TEST_EN 0x9E
#define FACTORY_REG_CB_TEST_EN 0x9F
#define FACTORY_REG_OPEN_TEST_EN 0xA0
#define FACTORY_REG_RAWDATA_TARGET 0xCA
/* mc_sc */
#define FACTORY_REG_FRE_LIST 0x0A
#define FACTORY_REG_DATA_TYPE 0x5B
#define FACTORY_REG_NORMALIZE 0x16
#define FACTORY_REG_RAWDATA_ADDR_MC_SC 0x36
#define FACTORY_REG_PATTERN 0x53
#define FACTORY_REG_NOMAPPING 0x54
#define FACTORY_REG_CHX_NUM_NOMAP 0x55
#define FACTORY_REG_CHY_NUM_NOMAP 0x56
#define FACTORY_REG_WC_SEL 0x09
#define FACTORY_REG_HC_SEL 0x0F
#define FACTORY_REG_MC_SC_MODE 0x44
#define FACTORY_REG_MC_SC_CB_ADDR_OFF 0x45
#define FACTORY_REG_MC_SC_CB_H_ADDR_OFF 0x49
#define FACTORY_REG_MC_SC_CB_ADDR 0x4E
#define FACTROY_REG_SHORT_TEST_EN 0x07
#define FACTROY_REG_SHORT_CA 0x01
#define FACTROY_REG_SHORT_CC 0x02
#define FACTROY_REG_SHORT_CG 0x03
#define FACTROY_REG_SHORT_OFFSET 0x04
#define FACTROY_REG_SHORT_AB_CH 0x58
#define FACTROY_REG_SHORT_RES_LEVEL 0x5A
#define FACTORY_REG_SHORT_ADDR_MC 0xF4
#define FACTORY_REG_FIR 0xFB
#define FACTROY_REG_SHORT2_TEST_EN 0xC0
#define FACTROY_REG_SHORT2_CA 0x01
#define FACTROY_REG_SHORT2_CC 0x02
#define FACTROY_REG_SHORT2_CG 0x03
#define FACTROY_REG_SHORT2_OFFSET 0x04
#define FACTROY_REG_SHORT2_RES_LEVEL 0xC1
#define FACTROY_REG_SHORT2_DEALY 0xC2
#define FACTROY_REG_SHORT2_TEST_STATE 0xC3
#define FACTORY_REG_SHORT2_ADDR_MC 0xC4
#define FACTROY_REG_SHORT2_AB_CH 0xC6
/* sc */
#define FACTORY_REG_SCAN_ADDR2 0x08
#define FACTORY_REG_CH_NUM_SC 0x0A
#define FACTORY_REG_KEY_NUM_SC 0x0B
#define FACTORY_REG_SC_CB_ADDR_OFF 0x33
#define FACTORY_REG_SC_CB_ADDR 0x39
#define FACTORY_REG_RAWDATA_SADDR_SC 0x34
#define FACTORY_REG_RAWDATA_ADDR_SC 0x35
#define FACTORY_REG_CB_SEL 0x41
#define FACTORY_REG_FMODE 0xAE
#define TEST_RETVAL_00 0x00
#define TEST_RETVAL_AA 0xAA
#define FTS_MAX_SORT_SC 32768
#define FTS_MIN_SORT_SC 0
/*****************************************************************************
* enumerations, structures and unions
*****************************************************************************/
struct item_info {
char name[TEST_ITEM_NAME_MAX];
int code;
int *data;
int datalen;
int result;
int mc_sc;
int key_support;
};
struct fts_test_data {
int item_count;
struct item_info info[TEST_ITEM_COUNT_MAX];
};
/* incell */
struct incell_testitem {
u32 short_test : 1;
u32 open_test : 1;
u32 cb_test : 1;
u32 rawdata_test : 1;
u32 lcdnoise_test : 1;
u32 keyshort_test : 1;
u32 mux_open_test : 1;
};
struct incell_threshold_b {
int short_res_min;
int short_res_vk_min;
int open_cb_min;
int open_k1_check;
int open_k1_value;
int open_k2_check;
int open_k2_value;
int cb_min;
int cb_max;
int cb_vkey_check;
int cb_min_vk;
int cb_max_vk;
int rawdata_min;
int rawdata_max;
int rawdata_vkey_check;
int rawdata_min_vk;
int rawdata_max_vk;
int lcdnoise_frame;
int lcdnoise_coefficient;
int lcdnoise_coefficient_vkey;
int open_diff_min;
int open_nmos;
int keyshort_k1;
int keyshort_cb_max;
int rawdata2_min;
int rawdata2_max;
int mux_open_cb_min;
int open_delta_V;
};
struct incell_threshold {
struct incell_threshold_b basic;
int *rawdata_min;
int *rawdata_max;
int *rawdata2_min;
int *rawdata2_max;
int *cb_min;
int *cb_max;
};
struct incell_test {
struct incell_threshold thr;
union {
int tmp;
struct incell_testitem item;
} u;
};
/* mc_sc */
enum mapping_type {
MAPPING = 0,
NO_MAPPING = 1,
};
struct mc_sc_testitem {
u32 rawdata_test : 1;
u32 rawdata_uniformity_test : 1;
u32 scap_cb_test : 1;
u32 scap_rawdata_test : 1;
u32 short_test : 1;
u32 panel_differ_test : 1;
};
struct mc_sc_threshold_b {
int rawdata_h_min;
int rawdata_h_max;
int rawdata_set_hfreq;
int rawdata_l_min;
int rawdata_l_max;
int rawdata_set_lfreq;
int uniformity_check_tx;
int uniformity_check_rx;
int uniformity_check_min_max;
int uniformity_tx_hole;
int uniformity_rx_hole;
int uniformity_min_max_hole;
int scap_cb_off_min;
int scap_cb_off_max;
int scap_cb_wp_off_check;
int scap_cb_on_min;
int scap_cb_on_max;
int scap_cb_wp_on_check;
int scap_rawdata_off_min;
int scap_rawdata_off_max;
int scap_rawdata_wp_off_check;
int scap_rawdata_on_min;
int scap_rawdata_on_max;
int scap_rawdata_wp_on_check;
int short_cg;
int short_cc;
int panel_differ_min;
int panel_differ_max;
int scap_cb_hi_min;
int scap_cb_hi_max;
int scap_cb_hi_check;
int scap_rawdata_hi_min;
int scap_rawdata_hi_max;
int scap_rawdata_hi_check;
int scap_cb_hov_min;
int scap_cb_hov_max;
int scap_cb_hov_check;
int scap_rawdata_hov_min;
int scap_rawdata_hov_max;
int scap_rawdata_hov_check;
};
struct mc_sc_threshold {
struct mc_sc_threshold_b basic;
int *rawdata_h_min;
int *rawdata_h_max;
int *rawdata_l_min;
int *rawdata_l_max;
int *tx_linearity_max;
int *tx_linearity_min;
int *rx_linearity_max;
int *rx_linearity_min;
int *scap_cb_off_min;
int *scap_cb_off_max;
int *scap_cb_on_min;
int *scap_cb_on_max;
int *scap_cb_hi_min;
int *scap_cb_hi_max;
int *scap_cb_hov_min;
int *scap_cb_hov_max;
int *scap_rawdata_off_min;
int *scap_rawdata_off_max;
int *scap_rawdata_on_min;
int *scap_rawdata_on_max;
int *scap_rawdata_hi_min;
int *scap_rawdata_hi_max;
int *scap_rawdata_hov_min;
int *scap_rawdata_hov_max;
int *panel_differ_min;
int *panel_differ_max;
};
struct mc_sc_test {
struct mc_sc_threshold thr;
union {
u32 tmp;
struct mc_sc_testitem item;
} u;
};
/* sc */
struct sc_testitem {
u32 rawdata_test : 1;
u32 cb_test : 1;
u32 delta_cb_test : 1;
u32 short_test : 1;
};
struct sc_threshold_b {
int rawdata_min;
int rawdata_max;
int cb_min;
int cb_max;
int dcb_base;
int dcb_differ_max;
int dcb_key_check;
int dcb_key_differ_max;
int dcb_ds1;
int dcb_ds2;
int dcb_ds3;
int dcb_ds4;
int dcb_ds5;
int dcb_ds6;
int dcb_critical_check;
int dcb_cs1;
int dcb_cs2;
int dcb_cs3;
int dcb_cs4;
int dcb_cs5;
int dcb_cs6;
int short_min;
};
struct sc_threshold {
struct sc_threshold_b basic;
int *rawdata_min;
int *rawdata_max;
int *cb_min;
int *cb_max;
int *dcb_sort;
int *dcb_base;
};
struct sc_test {
struct sc_threshold thr;
union {
u32 tmp;
struct sc_testitem item;
} u;
};
enum test_hw_type {
IC_HW_INCELL = 1,
IC_HW_MC_SC,
IC_HW_SC,
};
enum test_scan_mode {
SCAN_NORMAL = 0,
SCAN_SC,
};
struct fts_test_node {
int channel_num;
int tx_num;
int rx_num;
int node_num;
int key_num;
};
struct fts_test {
struct fts_ts_data *ts_data;
struct fts_test_node node;
struct fts_test_node sc_node;
u8 fw_ver;
u8 va_touch_thr;
u8 vk_touch_thr;
bool key_support;
bool v3_pattern;
u8 mapping;
u8 normalize;
int test_num;
int *buffer;
int buffer_length;
int *node_valid;
int *node_valid_sc;
int basic_thr_count;
int code1;
int code2;
int offset;
union {
struct incell_test incell;
struct mc_sc_test mc_sc;
struct sc_test sc;
} ic;
struct test_funcs *func;
struct fts_test_data testdata;
char *testresult;
int testresult_len;
int result;
#if defined(TEST_SAVE_FAIL_RESULT) && TEST_SAVE_FAIL_RESULT
struct timeval tv;
#endif
struct ini_data ini;
};
struct test_funcs {
u16 ctype[FTS_MAX_COMPATIBLE_TYPE];
enum test_hw_type hwtype;
int startscan_mode;
int key_num_total;
bool rawdata2_support;
bool force_touch;
bool mc_sc_short_v2;
bool raw_u16;
bool cb_high_support;
int (*param_init)(void);
int (*init)(void);
int (*start_test)(void);
};
enum byte_mode {
DATA_ONE_BYTE,
DATA_TWO_BYTE,
};
/* mc_sc */
enum normalize_type {
NORMALIZE_OVERALL,
NORMALIZE_AUTO,
};
enum wp_type {
WATER_PROOF_OFF = 0,
WATER_PROOF_ON = 1,
HIGH_SENSITIVITY = 2,
HOV = 3,
WATER_PROOF_ON_TX = 100,
WATER_PROOF_ON_RX,
WATER_PROOF_OFF_TX,
WATER_PROOF_OFF_RX,
};
/* mc end */
/* sc */
enum factory_mode {
FACTORY_NORMAL,
FACTORY_TESTMODE_1,
FACTORY_TESTMODE_2,
};
enum dcb_sort_num {
DCB_SORT_MIN = 1,
DCB_SORT_MAX = 6,
};
struct dcb_sort_d {
int ch_num;
int deviation;
int critical;
int min;
int max;
};
/* sc end */
enum csv_itemcode_incell {
CODE_ENTER_FACTORY_MODE = 0,
CODE_RAWDATA_TEST = 7,
CODE_CB_TEST = 12,
CODE_SHORT_TEST = 15,
CODE_OPEN_TEST = 25,
CODE_LCD_NOISE_TEST = 27,
CODE_MUX_OPEN_TEST = 41,
};
enum csv_itemcode_mc_sc {
CODE_M_RAWDATA_TEST = 7,
CODE_M_SCAP_CB_TEST = 9,
CODE_M_SCAP_RAWDATA_TEST = 10,
CODE_M_WEAK_SHORT_CIRCUIT_TEST = 15,
CODE_M_RAWDATA_UNIFORMITY_TEST = 16,
CODE_M_PANELDIFFER_TEST = 20,
};
enum csv_itemcode_sc {
CODE_S_RAWDATA_TEST = 7,
CODE_S_CB_TEST = 13,
CODE_S_DCB_TEST = 14,
};
/*****************************************************************************
* Global variable or extern global variabls/functions
*****************************************************************************/
extern struct test_funcs test_func_ft5452i;
extern struct fts_test *fts_ftest;
void sys_delay(int ms);
int fts_abs(int value);
void print_buffer(int *buffer, int length, int line_num);
int fts_test_read_reg(u8 addr, u8 *val);
int fts_test_write_reg(u8 addr, u8 val);
int fts_test_read(u8 addr, u8 *readbuf, int readlen);
int fts_test_write(u8 addr, u8 *writebuf, int writelen);
int enter_work_mode(void);
int enter_factory_mode(void);
int read_mass_data(u8 addr, int byte_num, int *buf);
int chip_clb(void);
int wait_state_update(u8 retval);
int get_cb_incell(u16 saddr, int byte_num, int *cb_buf);
int short_get_adcdata_incell(u8 retval, u8 ch_num, int byte_num, int *adc_buf);
int start_scan(void);
int get_rawdata(int *data);
int get_cb_sc(int byte_num, int *cb_buf, enum byte_mode mode);
bool compare_data(int *data, int min, int max, int min_vk, int max_vk, bool key);
bool compare_array(int *data, int *min, int *max, bool key);
void show_data(int *data, bool key);
/* mc_sc */
int mapping_switch(u8 mapping);
bool get_fw_wp(u8 wp_channel_select, enum wp_type water_proof_type);
int get_cb_mc_sc(u8 wp, int byte_num, int *cb_buf, enum byte_mode mode);
int get_rawdata_mc_sc(enum wp_type wp, int *data);
int get_rawdata_mc(u8 fre, u8 fir, int *rawdata);
int short_get_adc_data_mc(u8 retval, int byte_num, int *adc_buf, u8 mode);
bool compare_mc_sc(bool, bool, int *, int *, int *);
void show_data_mc_sc(int *data);
void *fts_malloc(size_t size);
void fts_free_proc(void *p);
void fts_test_save_data(char *name, int code, int *data, int datacnt,
bool mc_sc, bool key, bool result);
#define fts_malloc_r(p, size) do {\
if (NULL == p) {\
p = fts_malloc(size);\
if (NULL == p) {\
return -ENOMEM;\
}\
}\
} while(0)
#define fts_free(p) do {\
if (p) {\
fts_free_proc(p);\
p = NULL;\
}\
} while(0)
#define CSV_SUPPORT 1
#define TXT_SUPPORT 1
#define FTS_TEST_DBG(fmt, args...) do { \
printk("[FTS_TS][TEST]%s:"fmt"\n", __func__, ##args); \
} while (0)
#define FTS_TEST_FUNC_ENTER() do { \
printk("[FTS_TS][TEST]%s: Enter\n", __func__); \
} while (0)
#define FTS_TEST_FUNC_EXIT() do { \
printk("[FTS_TS][TEST]%s: Exit(%d)\n", __func__, __LINE__); \
} while (0)
#define FTS_TEST_INFO(fmt, args...) do { \
printk(KERN_ERR "[FTS_TS/I][TEST]%s:"fmt"\n", __func__, ##args); \
} while (0)
#define FTS_TEST_ERROR(fmt, args...) do { \
printk(KERN_ERR "[FTS_TS/E][TEST]%s:"fmt"\n", __func__, ##args); \
} while (0)
#define FTS_TEST_SAVE_INFO(fmt, args...) do { \
if (fts_ftest->testresult) { \
fts_ftest->testresult_len += snprintf( \
fts_ftest->testresult + fts_ftest->testresult_len, \
TXT_BUFFER_LEN, \
fmt, ##args);\
} \
} while (0)
#define FTS_TEST_SAVE_ERR(fmt, args...) do { \
if (fts_ftest->testresult && (fts_ftest->testresult_len < TXT_BUFFER_LEN)) { \
fts_ftest->testresult_len += snprintf( \
fts_ftest->testresult + fts_ftest->testresult_len, \
TXT_BUFFER_LEN, \
fmt, ##args);\
} \
printk(KERN_ERR "[FTS_TS/E][TEST]%s:"fmt"\n", __func__, ##args);\
} while (0)
#endif

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,146 @@
/************************************************************************
* Copyright (c) 2012-2020, Focaltech Systems (R)£¬All Rights Reserved.
*
* File Name: focaltech_test_ini.h
*
* Author: Focaltech Driver Team
*
* Created: 2016-08-01
*
* Abstract: parsing function of INI file
*
************************************************************************/
#ifndef _INI_H
#define _INI_H
/*****************************************************************************
* Private constant and macro definitions using #define
*****************************************************************************/
#define MAX_KEYWORD_NUM (1000)
#define MAX_KEYWORD_NAME_LEN (50)
#define MAX_KEYWORD_VALUE_LEN (512)
#define MAX_KEYWORD_VALUE_ONE_LEN (16)
#define MAX_INI_LINE_LEN (MAX_KEYWORD_NAME_LEN + MAX_KEYWORD_VALUE_LEN)
#define MAX_INI_SECTION_NUM (20)
#define MAX_IC_NAME_LEN (32)
#define MAX_TEST_ITEM (20)
#define IC_CODE_OFFSET (16)
/*****************************************************************************
* enumerations, structures and unions
*****************************************************************************/
struct ini_ic_type {
char ic_name[MAX_IC_NAME_LEN];
u32 ic_type;
};
enum line_type {
LINE_SECTION = 1,
LINE_KEYWORD = 2 ,
LINE_OTHER = 3,
};
struct ini_keyword {
char name[MAX_KEYWORD_NAME_LEN];
char value[MAX_KEYWORD_VALUE_LEN];
};
struct ini_section {
char name[MAX_KEYWORD_NAME_LEN];
int keyword_num;
/* point to ini.tmp, don't need free */
struct ini_keyword *keyword;
};
struct ini_data {
char *data;
int length;
int keyword_num_total;
int section_num;
struct ini_section section[MAX_INI_SECTION_NUM];
struct ini_keyword *tmp;
char ic_name[MAX_IC_NAME_LEN];
u32 ic_code;
};
#define TEST_ITEM_INCELL { \
"SHORT_CIRCUIT_TEST", \
"OPEN_TEST", \
"CB_TEST", \
"RAWDATA_TEST", \
"LCD_NOISE_TEST", \
"KEY_SHORT_TEST", \
"MUX_OPEN_TEST", \
}
#define BASIC_THRESHOLD_INCELL { \
"ShortCircuit_ResMin", "ShortCircuit_VkResMin", \
"OpenTest_CBMin", "OpenTest_Check_K1", "OpenTest_K1Threshold", "OpenTest_Check_K2", "OpenTest_K2Threshold", \
"CBTest_Min", "CBTest_Max", \
"CBTest_VKey_Check", "CBTest_Min_Vkey", "CBTest_Max_Vkey", \
"RawDataTest_Min", "RawDataTest_Max", \
"RawDataTest_VKey_Check", "RawDataTest_Min_VKey", "RawDataTest_Max_VKey", \
"LCD_NoiseTest_Frame", "LCD_NoiseTest_Coefficient", "LCD_NoiseTest_Coefficient_key", \
"OpenTest_DifferMin", \
}
#define TEST_ITEM_MC_SC { \
"RAWDATA_TEST", \
"UNIFORMITY_TEST", \
"SCAP_CB_TEST", \
"SCAP_RAWDATA_TEST", \
"WEAK_SHORT_CIRCUIT_TEST", \
"PANEL_DIFFER_TEST", \
}
#define BASIC_THRESHOLD_MC_SC { \
"RawDataTest_High_Min", "RawDataTest_High_Max", "RawDataTest_HighFreq", \
"RawDataTest_Low_Min", "RawDataTest_Low_Max", "RawDataTest_LowFreq", \
"UniformityTest_Check_Tx", "UniformityTest_Check_Rx","UniformityTest_Check_MinMax", \
"UniformityTest_Tx_Hole", "UniformityTest_Rx_Hole", "UniformityTest_MinMax_Hole", \
"SCapCbTest_OFF_Min", "SCapCbTest_OFF_Max", "ScapCBTest_SetWaterproof_OFF", \
"SCapCbTest_ON_Min", "SCapCbTest_ON_Max", "ScapCBTest_SetWaterproof_ON", \
"SCapRawDataTest_OFF_Min", "SCapRawDataTest_OFF_Max", "SCapRawDataTest_SetWaterproof_OFF", \
"SCapRawDataTest_ON_Min", "SCapRawDataTest_ON_Max", "SCapRawDataTest_SetWaterproof_ON", \
"WeakShortTest_CG", "WeakShortTest_CC", \
"PanelDifferTest_Min", "PanelDifferTest_Max", \
"SCapCbTest_High_Min", "SCapCbTest_High_Max", "ScapCBTest_SetHighSensitivity", \
"SCapRawDataTest_High_Min", "SCapRawDataTest_High_Max", "SCapRawDataTest_SetHighSensitivity", \
"SCapCbTest_Hov_Min", "SCapCbTest_Hov_Max", "ScapCBTest_SetHov", \
"SCapRawDataTest_Hov_Min", "SCapRawDataTest_Hov_Max", "SCapRawDataTest_SetHov", \
}
#define TEST_ITEM_SC { \
"RAWDATA_TEST", \
"CB_TEST", \
"DELTA_CB_TEST", \
"WEAK_SHORT_TEST", \
}
#define BASIC_THRESHOLD_SC { \
"RawDataTest_Min", "RawDataTest_Max", \
"CbTest_Min", "CbTest_Max", \
"DeltaCbTest_Base", "DeltaCbTest_Differ_Max", \
"DeltaCbTest_Include_Key_Test", "DeltaCbTest_Key_Differ_Max", \
"DeltaCbTest_Deviation_S1", "DeltaCbTest_Deviation_S2", "DeltaCbTest_Deviation_S3", \
"DeltaCbTest_Deviation_S4", "DeltaCbTest_Deviation_S5", "DeltaCbTest_Deviation_S6", \
"DeltaCbTest_Set_Critical", "DeltaCbTest_Critical_S1", "DeltaCbTest_Critical_S2", \
"DeltaCbTest_Critical_S3", "DeltaCbTest_Critical_S4", \
"DeltaCbTest_Critical_S5", "DeltaCbTest_Critical_S6", \
}
/*****************************************************************************
* Global variable or extern global variabls/functions
*****************************************************************************/
int fts_test_get_testparam_from_ini(char *config_name);
int get_keyword_value(char *section, char *name, int *value);
#define get_value_interface(name, value) \
get_keyword_value("Interface", name, value)
#define get_value_basic(name, value) \
get_keyword_value("Basic_Threshold", name, value)
#define get_value_detail(name, value) \
get_keyword_value("SpecialSet", name, value)
#define get_value_testitem(name, value) \
get_keyword_value("TestItem", name, value)
#endif /* _INI_H */

View file

@ -0,0 +1 @@
obj-$(CONFIG_TOUCHSCREEN_FT3519) += focaltech_test_ft5452i.o

View file

@ -0,0 +1,452 @@
0x2, 0x0, 0x46,0x32,0x0, 0x0, 0xb2,0x0, 0xff,0xff,0xff,0x2, 0x7, 0x45,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0x2, 0xd, 0x9a,0xff,0xff,0xff,0xff,0xff,0x2, 0xb, 0x91,0xff,0xff,
0xff,0xff,0xff,0x2, 0x0, 0x3, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0x2, 0xb, 0xdb,0x75,0x84,0x1, 0x7e,0x44,0x1f,0xff,0xe4,0x7a,0x49,
0xb0,0x1b,0x44,0x78,0xf9,0x7e,0xf8,0x13,0xff,0xd2,0x7, 0xc2,0x8, 0xc2,0x9, 0x75,
0x22,0x0, 0x75,0x27,0xff,0xd2,0x0, 0xc2,0x2, 0xc2,0x3, 0xc2,0x4, 0xc2,0x6, 0x7e,
0x4, 0x0, 0xff,0x7e,0x14,0x1, 0x45,0xb, 0xa, 0x40,0x5d,0x44,0x68,0x1a,0x69,0x20,
0x0, 0x2, 0xb, 0xe, 0xb, 0x44,0x80,0xa, 0x7e,0xb, 0xb0,0x7a,0x29,0xb0,0xb, 0x24,
0xb, 0xc, 0x1b,0x44,0x78,0xf2,0x80,0xdf,0x2, 0x19,0x93,0x6d,0x0, 0x74,0x10,0x4d,
0x0, 0x78,0xb, 0x4d,0x22,0x78,0x27,0x8d,0x31,0x7d,0x12,0x6d,0x22,0x22,0x7d,0x43,
0x7d,0x32,0x6d,0x22,0x2f,0x11,0x2d,0x44,0x50,0x2, 0xa5,0xf, 0xbf,0x10,0x40,0x4,
0x9f,0x10,0xb, 0x90,0x14,0x78,0xed,0x7f,0x1, 0x6d,0x22,0x7d,0x34,0x22,0x7d,0x41,
0x7d,0x13,0x8d,0x24,0x7d,0x2, 0x2f,0x0, 0x40,0x4, 0xbd,0x4, 0x40,0x4, 0x9d,0x4,
0xb, 0x14,0x14,0x78,0xf1,0x7d,0x23,0x7d,0x31,0x7d,0x10,0x6d,0x0, 0x22,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0x1c,0x40,0xe3,0xbf,0x93,0x6c,0xdd,0x22,0xff,0x0, 0xff,0x0, 0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xca,0xf8,0x7f,0x20,0x80,0xa, 0x7e,0x1b,0xf0,0x7a,0x2b,0xf0,0xb, 0x34,0xb, 0x54,
0x69,0xff,0xff,0xfc,0x7d,0xef,0x1b,0xe4,0x79,0xef,0xff,0xfc,0x4d,0xff,0x78,0xe6,
0x7f,0x10,0xda,0xf8,0x22,0x0, 0x1, 0x2, 0x79,0x0, 0x0, 0xa, 0x2, 0x7a,0x54,0x5b,
0xaa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0, 0x1, 0x2, 0x84,0x0, 0x0, 0x1, 0x2,
0x85,0xff,0x0, 0x2, 0x2, 0x86,0x0, 0x0, 0x0, 0x1, 0x3, 0x8c,0x0, 0x0, 0x1, 0x2,
0x44,0x0, 0x0, 0x1, 0x2, 0x46,0x0, 0x0, 0x2, 0x2, 0x61,0x0, 0x0, 0x0, 0x4, 0x2,
0x63,0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x2, 0x67,0x0, 0x0, 0x0, 0x1, 0x2, 0x69,0x0,
0x0, 0x1, 0x2, 0x6a,0xb, 0x0, 0x1, 0x2, 0x6b,0x0, 0x0, 0x0, 0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0x56,0x31,0x2e,0x32,0x5f,0x41,0x70,0x72,0x20,0x32,0x37,0x20,0x32,0x30,0x32,0x31,
0x46,0x54,0x53,0x35,0x34,0x35,0x32,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x7c,0x97,0x7c,0x8b,0x7f,0x70,0xd2,0xc9,0x7a,0x81,0xf2,0x75,0xf3,0x80,0xa, 0x59,
0x1b,0x54,0xf5,0xf4,0x75,0xf5,0x1, 0x6c,0xaa,0x80,0x14,0xe5,0xf5,0x54,0x80,0xb4,
0x80,0xf9,0xe5,0xf6,0xa, 0x3a,0x2d,0x3f,0x7d,0x2e,0x7a,0x1b,0xb0,0xb, 0xa0,0xbc,
0x9a,0x38,0xe8,0xc2,0xc9,0x22,0xd2,0xcf,0xe5,0xcc,0x54,0xf8,0xf5,0xcc,0xa9,0xd0,
0xce,0xa9,0xd2,0xc9,0xa9,0xd0,0xce,0xa9,0xd3,0xc9,0xa9,0xd5,0xca,0x75,0xeb,0x23,
0x75,0xed,0xf, 0x75,0xac,0x40,0x75,0xad,0x30,0xd2,0x86,0x75,0xec,0xff,0x75,0xee,
0xff,0xa9,0xc1,0xea,0xa9,0xc7,0x94,0xa9,0xc4,0x94,0xc2,0xae,0x7e,0x8, 0x0, 0xc,
0x74,0x21,0x7e,0x70,0x1, 0x91,0x20,0xe5,0xc, 0xbe,0xb0,0x9, 0x28,0x5, 0xa9,0xc3,
0xe2,0x80,0x3, 0xa9,0xd3,0xe2,0xe5,0xc, 0x7a,0xb3,0x2, 0x7d,0x22,0x7e,0x35,0x25,
0x7d,0x23,0x6d,0x33,0x2e,0x18,0x0, 0x8, 0x7a,0x1f,0x12,0xb0,0x7e,0x35,0x25,0x7d,
0x23,0x6d,0x33,0x2e,0x18,0x0, 0x8, 0x7a,0x1f,0x12,0xac,0x7e,0x35,0x25,0x2e,0x34,
0x0, 0xa, 0x7d,0x23,0x6d,0x33,0x2e,0x18,0x0, 0xa, 0x7a,0x1f,0x10,0xc, 0x7e,0x35,
0x25,0x2e,0x34,0x0, 0xa, 0x7d,0x23,0x6d,0x33,0x2e,0x18,0x0, 0x8, 0x7a,0x1f,0x12,
0xfc,0x22,0x7e,0x34,0x0, 0x4, 0x7e,0x54,0x0, 0x4, 0x7e,0x44,0x0, 0xff,0x69,0x12,
0x0, 0x2, 0xb, 0x2a,0x0, 0x79,0x30,0x0, 0x1e,0x7e,0x34,0x1, 0x0, 0x7e,0x24,0x10,
0x0, 0x9f,0x0, 0x59,0x12,0x0, 0x2, 0x1b,0x28,0x0, 0xb, 0x26,0x1b,0x34,0x78,0xf3,
0x7e,0x34,0x2, 0x88,0x7d,0x23,0x6d,0x33,0x2e,0x18,0x0, 0x8, 0x7a,0x1f,0x10,0x1c,
0x7e,0x34,0x2, 0x88,0x7d,0x23,0x6d,0x33,0x2e,0x18,0x0, 0x8, 0x7a,0x1f,0x10,0x20,
0x7e,0x34,0x2, 0x88,0x7d,0x23,0x6d,0x33,0x2e,0x18,0x0, 0x8, 0x7a,0x1f,0x11,0x54,
0x7e,0x34,0x2, 0x88,0x7d,0x23,0x6d,0x33,0x2e,0x18,0x0, 0x8, 0x7a,0x1f,0x12,0xa8,
0x7e,0x35,0x25,0x7d,0x23,0x6d,0x33,0x2e,0x18,0x0, 0x8, 0x7a,0x1f,0x12,0xb0,0x7e,
0x35,0x25,0x7d,0x23,0x6d,0x33,0x2e,0x18,0x0, 0x8, 0x7a,0x1f,0x12,0xac,0x7e,0x35,
0x25,0x2e,0x34,0x0, 0xa, 0x7d,0x23,0x6d,0x33,0x2e,0x18,0x0, 0xa, 0x7a,0x1f,0x10,
0xc, 0x7e,0x35,0x25,0x2e,0x34,0x0, 0xa, 0x7d,0x23,0x6d,0x33,0x2e,0x18,0x0, 0x8,
0x7a,0x1f,0x12,0xfc,0x7e,0x34,0x2, 0x63,0x7d,0x23,0x6d,0x33,0x2e,0x18,0x0, 0x8,
0x7a,0x1f,0x12,0xc0,0x7e,0x34,0x2, 0x7a,0x7d,0x23,0x6d,0x33,0x2e,0x18,0x0, 0xa,
0x7a,0x1f,0x12,0x40,0x7e,0x34,0x2, 0x88,0x7d,0x23,0x6d,0x33,0x2e,0x18,0x0, 0x8,
0x7a,0x1f,0x11,0x84,0x7e,0x34,0x2, 0x88,0x7d,0x23,0x6d,0x33,0x2e,0x18,0x0, 0x8,
0x7a,0x1f,0x11,0x7c,0x7e,0x34,0x2, 0x88,0x7d,0x23,0x6d,0x33,0x2e,0x18,0x0, 0x8,
0x7a,0x1f,0x11,0x88,0x7e,0x34,0x2, 0x67,0x7d,0x23,0x6d,0x33,0x2e,0x18,0x0, 0xa,
0x7a,0x1f,0x11,0xa8,0x7e,0x34,0x2, 0x79,0x7d,0x23,0x6d,0x33,0x2e,0x18,0x0, 0xa,
0x7a,0x1f,0x13,0x30,0x7e,0x34,0x2, 0x79,0x7d,0x23,0x6d,0x33,0x2e,0x18,0x0, 0xa,
0x7a,0x1f,0x11,0x98,0x7e,0x34,0x2, 0x79,0x7d,0x23,0x6d,0x33,0x2e,0x18,0x0, 0x8,
0x7a,0x1f,0x11,0x90,0x7e,0x34,0x2, 0x88,0x7d,0x23,0x6d,0x33,0x2e,0x18,0x0, 0x8,
0x7a,0x1f,0x11,0x94,0x7e,0x34,0x2, 0x88,0x7d,0x23,0x6d,0x33,0x2e,0x18,0x0, 0x8,
0x7a,0x1f,0x10,0x40,0x7e,0x34,0x2, 0x88,0x7d,0x23,0x6d,0x33,0x2e,0x18,0x0, 0x8,
0x7a,0x1f,0x10,0x24,0x22,0xa9,0xc4,0xe1,0xa9,0xc0,0xe1,0xa9,0xd0,0xce,0xd2,0xcc,
0x7e,0x34,0xff,0xff,0x7e,0x54,0x0, 0x4, 0x7e,0x44,0x0, 0xff,0x69,0x12,0x0, 0x2,
0xb, 0x2a,0x0, 0x79,0x30,0x0, 0x6, 0x7e,0x34,0x0, 0x1, 0x1b,0xa, 0x30,0xa9,0xc1,
0xe2,0xa9,0xc2,0xe2,0xd2,0x9e,0xc2,0x9d,0x43,0xeb,0xb4,0x7e,0x34,0x0, 0xef,0x7e,
0x54,0x0, 0x4, 0x7e,0x44,0x0, 0xff,0x69,0x12,0x0, 0x2, 0xb, 0x2a,0x0, 0x79,0x30,
0x0, 0x18,0x2e,0x14,0x0, 0xa, 0xb, 0xa, 0x30,0x5e,0x70,0xfc,0x1b,0xa, 0x30,0x7e,
0x34,0x0, 0x3, 0x7e,0x54,0x0, 0x4, 0x7e,0x44,0x0, 0xff,0x69,0x12,0x0, 0x2, 0xb,
0x2a,0x0, 0x79,0x30,0x0, 0x8, 0x7e,0x34,0x0, 0x8, 0x79,0x30,0x0, 0x4, 0x91,0xf2,
0xd2,0xac,0x22,0xc2,0xad,0x75,0x91,0x0, 0xc2,0x90,0xc2,0x91,0xa9,0xc0,0x93,0x75,
0x92,0x70,0xc2,0xc0,0xa9,0xd5,0xb7,0xd2,0xbd,0xd2,0xe8,0xd2,0xad,0x22,0x80,0x14,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x7d,0x23,0x1b,0x34,0x4d,0x22,0x78,0xe4,0x22,0xc2,0xa9,0xc2,
0x8c,0x43,0x89,0x2, 0x75,0x8c,0x1, 0x75,0x8a,0x0, 0xd2,0xa9,0x22,0xc2,0x8c,0x6d,
0x33,0x7a,0x37,0x2, 0x86,0xd2,0x8c,0x22,0x7e,0x37,0x2, 0x86,0xb, 0x34,0x7a,0x37,
0x2, 0x86,0x22,0xe1,0x38,0xca,0x39,0xf1,0x38,0xda,0x39,0x32,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0x7c,0xab,0x7e,0x70,0xef,0x7e,0xb3,0x2, 0x44,0x24,0xfd,0x68,0x5c,0x1b,0xb1,0x68,
0x48,0x24,0x9f,0x68,0x67,0x1b,0xb2,0x68,0x69,0x24,0xda,0x68,0x1f,0x24,0xc4,0x68,
0x53,0x1b,0xb2,0x68,0x51,0x24,0xf5,0x78,0x6e,0x7e,0xa3,0x2, 0x6e,0x7c,0xba,0x4,
0x7a,0xb3,0x2, 0x6e,0xa, 0x3a,0x9, 0x73,0x2, 0x51,0x80,0x5b,0x4c,0xaa,0x78,0x5,
0x7e,0x70,0x54,0x80,0x52,0xbe,0xa0,0x1, 0x78,0x5, 0x7e,0x70,0x5b,0x80,0x48,0xbe,
0xa0,0x2, 0x78,0x43,0x7e,0x70,0xaa,0x80,0x3e,0x4c,0xaa,0x78,0x2, 0x80,0x5, 0xbe,
0xa0,0x1, 0x78,0x33,0x7e,0x70,0x1, 0x80,0x2e,0xa, 0x3a,0x2e,0x35,0x25,0x9, 0x73,
0x0, 0xa, 0x80,0x23,0x80,0x6, 0x7e,0x73,0x3, 0x8c,0x80,0x1b,0x7e,0x73,0x2, 0x79,
0x80,0x15,0x4c,0xaa,0x78,0x8, 0x7e,0x37,0x2, 0x67,0xa, 0x36,0x80,0x9, 0xbe,0xa0,
0x1, 0x78,0x4, 0x7e,0x37,0x2, 0x67,0x7c,0xb7,0x22,0x7c,0x97,0x7c,0x8b,0xc2,0x2,
0x7e,0xb3,0x2, 0x44,0x14,0x78,0x2, 0x41,0xa2,0x1b,0xb1,0x78,0x2, 0x41,0x22,0x1b,
0xb1,0x78,0x2, 0x41,0xa2,0x1b,0xb1,0x78,0x2, 0x41,0x65,0x14,0x78,0x2, 0x41,0x81,
0x14,0x78,0x2, 0x41,0x87,0x24,0xf9,0x78,0x2, 0x41,0x9d,0x24,0xbb,0x68,0x55,0x24,
0xf6,0x78,0x2, 0x61,0x7e,0x1b,0xb1,0x78,0x2, 0x61,0x6c,0x14,0x78,0x2, 0x61,0x76,
0x1b,0xb1,0x78,0x2, 0x41,0xa5,0x14,0x78,0x2, 0x41,0xa7,0x14,0x78,0x2, 0x41,0xa2,
0x1b,0xb2,0x78,0x2, 0x41,0xa2,0x24,0xda,0x68,0x2e,0x24,0xe6,0x68,0x28,0x24,0xfa,
0x68,0x3f,0x24,0xf1,0x68,0x74,0x24,0xf3,0x78,0x2, 0x41,0xa2,0x24,0xec,0x78,0x2,
0x61,0x8c,0x24,0x5, 0x68,0x2, 0x61,0x90,0xbe,0x80,0x1, 0x68,0x2, 0x61,0x90,0x7a,
0x93,0x2, 0x6e,0x22,0x61,0x86,0x61,0x86,0xbe,0x80,0x4, 0x50,0xb, 0xe4,0x7a,0xb3,
0x2, 0x79,0xa, 0x58,0x19,0x95,0x2, 0x47,0x4c,0x88,0x68,0x2, 0x61,0x90,0xd2,0x2,
0x22,0x7c,0xb8,0x14,0x68,0xa, 0x14,0x68,0xf, 0x14,0x68,0x1e,0x24,0x3, 0x78,0x2a,
0xa, 0x39,0x7d,0x23,0x6d,0x33,0x80,0xc, 0x7c,0x29,0x6c,0x33,0x6d,0x0, 0x7e,0x1f,
0x2, 0x63,0x2f,0x10,0x7a,0x1f,0x2, 0x63,0x80,0x10,0xa, 0x19,0x6d,0x0, 0x7e,0x1f,
0x2, 0x63,0x2f,0x10,0x7a,0x1f,0x2, 0x63,0xd2,0x3, 0x7c,0xb8,0x14,0x68,0x19,0x14,
0x68,0x27,0x14,0x68,0x26,0x14,0x68,0x25,0x14,0x68,0x2a,0x24,0x5, 0x78,0x48,0x20,
0x1, 0x2, 0x41,0xcc,0x41,0xc6,0x41,0xcc,0xa, 0x39,0x7d,0x3, 0x6d,0x11,0x7e,0x35,
0x25,0x59,0x13,0x0, 0x2, 0x1b,0x38,0x0, 0x22,0x41,0xef,0x61,0x4, 0x7c,0x69,0x6c,
0x77,0x6d,0x22,0x61,0x1c,0xa, 0x59,0x6d,0x44,0x7e,0x25,0x25,0x7d,0x32,0xb, 0x36,
0x49,0x13,0x0, 0x2, 0xb, 0x38,0x0, 0x2f,0x2, 0x59,0x13,0x0, 0x2, 0x1b,0x38,0x0,
0x6d,0x33,0x59,0x32,0x0, 0x8, 0x22,0x7e,0xb3,0x2, 0x79,0x6c,0xb9,0x7a,0xb3,0x2,
0x79,0x7e,0x25,0x25,0x2e,0x24,0x0, 0x8, 0xb, 0x28,0x50,0x7d,0x35,0xb, 0x34,0x1b,
0x28,0x30,0x2e,0x55,0x25,0x19,0x95,0x0, 0xa, 0x7e,0x55,0x25,0x49,0x15,0x0, 0x8,
0x6d,0x0, 0x49,0x35,0x0, 0x6, 0x49,0x25,0x0, 0x4, 0xbf,0x1, 0x50,0x2, 0x61,0x90,
0x20,0x1, 0x3, 0xd3,0x80,0x1, 0xc3,0x92,0x1, 0x7a,0x55,0x23,0x7e,0x34,0x0, 0x2,
0x61,0x67,0x7c,0xb8,0x14,0x68,0x15,0x14,0x68,0x14,0x14,0x68,0x13,0x24,0x3, 0x68,
0x2, 0x61,0x90,0x20,0x1, 0x2, 0x41,0xcc,0x41,0xc6,0x41,0xcc,0x41,0xd4,0x41,0xef,
0xa, 0x59,0x6d,0x44,0x7e,0x15,0x25,0x49,0x31,0x0, 0x2, 0xb, 0x18,0x20,0x2f,0x12,
0x59,0x31,0x0, 0x2, 0x1b,0x18,0x20,0x7e,0x35,0x25,0x7a,0x35,0x23,0xd2,0x2, 0x7e,
0x34,0x0, 0x1, 0x61,0x67,0x75,0xe6,0x0, 0x75,0xe7,0x0, 0xe4,0x7e,0x34,0x1, 0x6,
0x7e,0x24,0x0, 0xff,0x7a,0x1b,0xb0,0x7e,0x34,0x1, 0x7, 0x7a,0x1b,0xb0,0xd2,0x6,
0x22,0x75,0xe6,0x0, 0xd2,0x9f,0x22,0xbe,0x80,0x1, 0x78,0x5, 0x7a,0x93,0x2, 0x6a,
0x22,0xbe,0x80,0x2, 0x68,0x2, 0x61,0x90,0x7a,0x93,0x2, 0x46,0x22,0x7a,0x93,0x2,
0x69,0x22,0xd2,0x2, 0x22,0x61,0x86,0x7c,0xb8,0x14,0x68,0x28,0x14,0x68,0x40,0x14,
0x68,0x52,0x14,0x68,0x61,0x14,0x68,0x70,0x14,0x78,0x2, 0x61,0x45,0x24,0x6, 0x68,
0x2, 0x61,0x90,0x30,0x1, 0x6, 0x7e,0x34,0x0, 0x28,0x80,0x4, 0x7e,0x34,0x1, 0x36,
0x7a,0x35,0x25,0x22,0xa, 0x39,0x6d,0x22,0x7e,0x15,0x25,0x59,0x31,0x0, 0x2, 0x1b,
0x18,0x20,0x49,0x31,0x0, 0x2, 0xb, 0x18,0x20,0x7d,0x23,0x6d,0x33,0x80,0x4e,0xa,
0x59,0x7c,0xab,0xe4,0x6d,0x44,0x7e,0x15,0x25,0x49,0x31,0x0, 0x2, 0xb, 0x18,0x20,
0x2f,0x12,0x80,0x39,0xa, 0x59,0x6d,0x44,0x7e,0x15,0x25,0x49,0x31,0x0, 0x2, 0xb,
0x18,0x20,0x2f,0x12,0x80,0x27,0xa, 0x39,0x7d,0x23,0x6d,0x33,0x7e,0x15,0x25,0x59,
0x31,0x0, 0x6, 0x59,0x21,0x0, 0x4, 0x22,0xa, 0x59,0x7c,0xab,0xe4,0x6d,0x44,0x7e,
0x15,0x25,0xb, 0x16,0x49,0x31,0x0, 0x2, 0xb, 0x18,0x20,0x2f,0x12,0x59,0x31,0x0,
0x2, 0x1b,0x18,0x20,0x22,0xa, 0x59,0x6d,0x44,0x7e,0x35,0x25,0x7d,0x23,0xb, 0x26,
0x49,0x12,0x0, 0x2, 0xb, 0x28,0x0, 0x2f,0x2, 0x59,0x12,0x0, 0x2, 0x1b,0x28,0x0,
0x7a,0x35,0x23,0x7e,0x34,0x0, 0x3, 0x7a,0x37,0x2, 0x61,0x22,0x7e,0x34,0x0, 0x4,
0x7a,0x37,0x2, 0x61,0x80,0x10,0xe4,0x7c,0x78,0x7c,0x69,0x2, 0x18,0x0, 0x7e,0x34,
0x0, 0x5, 0x7a,0x37,0x2, 0x61,0xe4,0x7a,0xb3,0x2, 0x79,0x22,0x7a,0x93,0x2, 0x84,
0x22,0xca,0x7b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xd2,0x0, 0x30,0x90,0x22,0xc2,0x90,
0x7e,0x71,0x91,0x7e,0xb3,0x2, 0x6b,0x70,0x4, 0x7a,0x73,0x2, 0x44,0x11,0x9a,0x7e,
0xb3,0x2, 0x6b,0x4, 0x7a,0xb3,0x2, 0x6b,0x30,0x2, 0x5, 0xe4,0x11,0x0, 0xf5,0x91,
0x30,0x91,0xf, 0xc2,0x91,0x7e,0xb3,0x2, 0x6b,0x4, 0x7a,0xb3,0x2, 0x6b,0x11,0x0,
0xf5,0x91,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x7b,0x32,0xca,0xb8,0xa9,0xc0,0x93,
0xe4,0x7a,0xb3,0x2, 0x6b,0xda,0xb8,0x32,0x7c,0x7b,0x2e,0x70,0xf9,0x78,0x2, 0x81,
0xe0,0x1b,0x70,0x78,0x2, 0x81,0xfc,0x1b,0x70,0x78,0x2, 0xa1,0x2, 0x2e,0x70,0xf9,
0x78,0x2, 0xa1,0x13,0x2e,0x70,0xb1,0x78,0x2, 0xa1,0x8c,0x1b,0x71,0x78,0x2, 0xa1,
0x79,0x1b,0x70,0x78,0x2, 0xa1,0x83,0x1b,0x71,0x78,0x2, 0xa1,0x1c,0x1b,0x70,0x78,
0x2, 0xa1,0x1e,0x2e,0x70,0xd5,0x68,0x1f,0x2e,0x70,0xe6,0x68,0x1a,0x1b,0x70,0x68,
0x29,0x1b,0x70,0x78,0x2, 0x81,0xb8,0x1b,0x72,0x68,0xe, 0x2e,0x70,0xf1,0x68,0x32,
0x2e,0x70,0x6a,0x68,0x2, 0xa1,0x99,0xa1,0x94,0x7e,0x1f,0x2, 0x63,0x7c,0x76,0x7c,
0x65,0xa, 0x24,0x7a,0x1f,0x2, 0x63,0xd2,0x3, 0x22,0x7e,0x15,0x25,0x49,0x31,0x0,
0x2, 0xb, 0x18,0x20,0x7c,0x76,0x7c,0x65,0xa, 0x24,0x59,0x31,0x0, 0x2, 0x1b,0x18,
0x20,0x22,0x7e,0x14,0x0, 0x4, 0x7e,0x4, 0x0, 0xff,0x69,0x30,0x0, 0x2, 0xb, 0xa,
0x20,0x69,0x11,0x0, 0x10,0x6d,0x0, 0x7e,0x35,0x25,0x59,0x13,0x0, 0x6, 0x59,0x3,
0x0, 0x4, 0x7a,0x35,0x23,0x7e,0x34,0x0, 0x2, 0x7a,0x37,0x2, 0x61,0x20,0x1, 0x3,
0xd3,0x80,0x1, 0xc3,0x92,0x1, 0x30,0x1, 0x6, 0x7e,0x34,0x0, 0x28,0x80,0x4, 0x7e,
0x34,0x1, 0x36,0x7a,0x35,0x25,0x80,0x25,0x7e,0x15,0x25,0x49,0x31,0x0, 0x2, 0xb,
0x18,0x20,0x7c,0x76,0x7c,0x65,0xa, 0x24,0x59,0x31,0x0, 0x2, 0x1b,0x18,0x20,0x7e,
0x35,0x25,0x7a,0x35,0x23,0x7e,0x34,0x0, 0x1, 0x7a,0x37,0x2, 0x61,0x2, 0x4, 0xad,
0x75,0xe6,0x0, 0x75,0xe7,0x0, 0xe4,0x7e,0x34,0x1, 0x6, 0x7e,0x24,0x0, 0xff,0x7a,
0x1b,0xb0,0x7e,0x34,0x1, 0x7, 0x7a,0x1b,0xb0,0xd2,0x6, 0x22,0x75,0xe6,0x0, 0xd2,
0x9f,0x22,0x7e,0x73,0x2, 0x88,0x7a,0x73,0x2, 0x6a,0x7e,0x73,0x2, 0x89,0x7a,0x73,
0x2, 0x46,0x22,0x7e,0x73,0x2, 0x88,0x7a,0x73,0x2, 0x69,0x22,0x80,0x76,0x7e,0x73,
0x2, 0x89,0xa, 0x37,0x6d,0x22,0x7c,0x67,0x6c,0x77,0x7e,0x33,0x2, 0x88,0xa, 0x13,
0x7d,0x1, 0x6d,0x11,0x2f,0x1, 0x7e,0x73,0x2, 0x8a,0xa, 0x37,0x2f,0x10,0x7e,0x15,
0x23,0x59,0x31,0x0, 0x2, 0x1b,0x18,0x20,0x7e,0x73,0x2, 0x8c,0xa, 0x37,0x6d,0x22,
0x7c,0x67,0x6c,0x77,0x7e,0x13,0x2, 0x8b,0xa, 0x51,0x7d,0x45,0x6d,0x55,0x2f,0x21,
0x7e,0x73,0x2, 0x8d,0xa, 0x37,0x2f,0x12,0x59,0x31,0x0, 0x6, 0x59,0x21,0x0, 0x4,
0x7e,0x34,0x0, 0x3, 0x7a,0x37,0x2, 0x61,0x22,0x7e,0x34,0x0, 0x4, 0x7a,0x37,0x2,
0x61,0x80,0x11,0x74,0x1, 0x6c,0x77,0x6c,0x66,0x2, 0x18,0x0, 0x7e,0x34,0x0, 0x5,
0x7a,0x37,0x2, 0x61,0xe4,0x7a,0xb3,0x2, 0x79,0x22,0xca,0x7b,0xca,0x2b,0xca,0x1b,
0xca,0xb, 0xc2,0x0, 0x7e,0x14,0x0, 0x4, 0x7e,0x4, 0x0, 0xff,0x69,0x50,0x0, 0x2,
0xb, 0xa, 0x40,0xb, 0x2a,0x30,0x4e,0x70,0x80,0x1b,0x2a,0x30,0x69,0x30,0x0, 0x2,
0xb, 0xa, 0x20,0x69,0x11,0x0, 0x2, 0x5e,0x14,0xff,0x0, 0x68,0x3f,0xb, 0x1a,0x10,
0x4e,0x30,0x8, 0x1b,0x1a,0x10,0x7e,0x14,0x0, 0x4, 0x7e,0x4, 0x0, 0xff,0x69,0x50,
0x0, 0x2, 0xb, 0xa, 0x40,0x69,0x12,0x0, 0x2, 0xa, 0x2, 0x1e,0x4, 0x1e,0x4, 0x5e,
0x4, 0x0, 0x1, 0x78,0xc, 0xa, 0x12,0x1e,0x14,0x5e,0x14,0x0, 0x1, 0x78,0x2, 0xc1,
0x96,0xb, 0x2a,0x10,0x4e,0x30,0x4, 0x1b,0x2a,0x10,0xc1,0x96,0x69,0x11,0x0, 0x2,
0x1e,0x14,0x1e,0x14,0x1e,0x14,0x5e,0x14,0x0, 0x1, 0x68,0x6, 0x69,0x51,0x0, 0xe,
0x71,0xe8,0x7e,0x34,0x0, 0x4, 0x7e,0x24,0x0, 0xff,0x69,0x11,0x0, 0x2, 0xb, 0x1a,
0x0, 0x69,0x30,0x0, 0x2, 0x1e,0x34,0x1e,0x34,0x5e,0x34,0x0, 0x1, 0x68,0x9, 0xb,
0xa, 0x30,0x5e,0x70,0xdf,0x1b,0xa, 0x30,0x7e,0x34,0x0, 0x4, 0x7e,0x24,0x0, 0xff,
0x69,0x11,0x0, 0x2, 0xb, 0x1a,0x0, 0x69,0x30,0x0, 0x2, 0x1e,0x34,0x5e,0x34,0x0,
0x1, 0x68,0xd, 0x2e,0x14,0x0, 0x6, 0xb, 0xa, 0x30,0x4e,0x70,0x2, 0x1b,0xa, 0x30,
0x7e,0x34,0x0, 0x4, 0x7e,0x24,0x0, 0xff,0x69,0x11,0x0, 0x2, 0xb, 0x1a,0x0, 0x69,
0x30,0x0, 0x2, 0x5e,0x34,0x0, 0x1, 0x68,0xd, 0x2e,0x14,0x0, 0x6, 0xb, 0xa, 0x30,
0x4e,0x70,0x1, 0x1b,0xa, 0x30,0x7e,0x34,0xff,0xff,0x7e,0x54,0x0, 0x4, 0x7e,0x44,
0x0, 0xff,0x69,0x12,0x0, 0x2, 0xb, 0x2a,0x0, 0x79,0x30,0x0, 0x6, 0xb, 0xa, 0x30,
0x5e,0x34,0x0, 0x3, 0x1b,0xa, 0x30,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x7b,0x32,
0x7f,0x50,0x7f,0x41,0x6c,0xaa,0xbe,0x58,0x0, 0x0, 0x38,0x3a,0x7e,0x58,0xff,0xff,
0x7e,0xa0,0x1, 0x80,0x31,0x7e,0x18,0x0, 0x80,0x7a,0x1d,0x10,0x7f,0x14,0x7e,0x8,
0x3, 0x8d,0x12,0x14,0x93,0x9e,0x58,0x0, 0x80,0x2e,0x48,0x0, 0x80,0x6d,0x44,0x9,
0x34,0x3, 0x8d,0x7e,0x1d,0xc, 0x7e,0x1b,0xb0,0x6c,0xb3,0x7a,0x1b,0xb0,0xb, 0x44,
0xbe,0x44,0x0, 0x80,0x78,0xe9,0xbe,0x58,0x0, 0x80,0x38,0xc9,0x4c,0xaa,0x68,0x2,
0xb, 0x5c,0x7a,0x5d,0x10,0x7f,0x14,0x7e,0x8, 0x3, 0x8d,0x12,0x14,0x93,0x6d,0x44,
0x80,0x11,0x9, 0x64,0x3, 0x8d,0x7e,0xd, 0xc, 0x7e,0xb, 0x70,0x6c,0x76,0x7a,0xb,
0x70,0xb, 0x44,0x7d,0x34,0x6d,0x22,0xbf,0x15,0x40,0xe7,0x22,0xca,0x3b,0x7f,0x60,
0x7f,0x71,0x7e,0x3d,0xc, 0x75,0x14,0x0, 0xa2,0x3, 0xe4,0x33,0x78,0xc, 0x7a,0x3d,
0x15,0x7f,0x17,0x7f,0x6, 0x12,0x11,0x6e,0xe1,0xf6,0x7f,0x57,0x7f,0x7, 0x2f,0x3,
0x7a,0xd, 0x10,0x7e,0x1f,0x2, 0x63,0xbf,0x1, 0x28,0x2, 0xe1,0xf6,0x4d,0xef,0x78,
0x3, 0x75,0x27,0x0, 0xe5,0x27,0xbe,0xb0,0x4, 0x50,0x46,0xe5,0x27,0xa, 0x2b,0x7e,
0x34,0x0, 0x4, 0x9d,0x32,0x7a,0x71,0x14,0xa, 0x37,0x6d,0x22,0xbf,0x13,0x28,0x4,
0x7c,0xbf,0xf5,0x14,0xe5,0x14,0xa, 0x3b,0xca,0x39,0xe5,0x27,0xa, 0x1b,0x2e,0x14,
0x2, 0x6f,0x6d,0x0, 0x7f,0x16,0x12,0x1, 0x20,0x1b,0xfd,0xe5,0x14,0x25,0x27,0xf5,
0x27,0xe5,0x14,0xa, 0x3b,0x6d,0x22,0x2f,0x51,0xe5,0x14,0xa, 0x1b,0x2d,0xd1,0x9f,
0x31,0xbe,0x38,0x0, 0x0, 0x28,0xa, 0x7a,0x3d,0x15,0x7f,0x15,0x7f,0x6, 0x12,0x11,
0x6e,0x7e,0xf, 0x2, 0x63,0x7e,0x1d,0x10,0xbf,0x10,0x78,0x1a,0xe5,0x27,0xb4,0x4,
0x15,0x7e,0x18,0x0, 0x4, 0x7a,0x1d,0x15,0x9f,0x11,0x7e,0x8, 0x2, 0x6f,0x12,0x11,
0x6e,0x75,0x27,0xff,0xc2,0x3, 0xda,0x3b,0x22,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xa9,0xc2,0xb4,0x74,0x9f,0x11,0x68,0x7e,0x8, 0x0, 0xc, 0x7e,0x18,0x0, 0x1, 0x11,
0x83,0xa9,0xd2,0xb4,0xe5,0xc, 0x60,0x5, 0xe5,0xc, 0xb4,0xff,0x2, 0xc3,0x22,0xd3,
0x22,0xd2,0xc8,0x43,0xed,0xf, 0xc2,0xea,0x75,0xb3,0x13,0xa9,0xd1,0xb4,0xa9,0xc0,
0xb4,0x22,0xca,0xf8,0x7e,0xf0,0x10,0x7e,0x34,0x15,0x0, 0xc2,0xa, 0x7d,0x23,0x1b,
0x34,0x4d,0x22,0x78,0xf8,0x11,0x0, 0x92,0xa, 0x20,0xa, 0x19,0x75,0xed,0x9f,0xd2,
0x8, 0xa9,0xd1,0xea,0xa9,0xd5,0xca,0xa9,0xc1,0xea,0x80,0x1, 0x0, 0x7c,0xaf,0x1b,
0xf0,0x4c,0xaa,0x78,0xf7,0xda,0xf8,0x22,0x7c,0x7b,0x7a,0x71,0xb5,0xa9,0x36,0xb3,
0xfc,0xa9,0xc6,0xb3,0xd3,0x22,0x75,0xb5,0x0, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,
0xe5,0xb5,0x22,0x7f,0x61,0x7f,0x70,0x9f,0x11,0x80,0x13,0x75,0xb5,0x0, 0xa9,0x36,
0xb3,0xfc,0xa9,0xc6,0xb3,0xe5,0xb5,0x7a,0x7b,0xb0,0xb, 0xf4,0xb, 0x1c,0xbf,0x16,
0x40,0xe9,0x22,0xa9,0xc2,0xb4,0x30,0xa, 0x6, 0x74,0x6, 0x11,0x68,0x80,0x4, 0x74,
0x4, 0x11,0x68,0xa9,0xd2,0xb4,0x22,0xa9,0xc2,0xb4,0x74,0x5, 0x11,0x68,0x11,0x76,
0xa9,0xd2,0xb4,0x30,0xe0,0x2, 0xd3,0x22,0xc3,0x22,0xca,0xf8,0x7f,0x1, 0x7c,0xfb,
0x7c,0xb1,0xf5,0x1f,0x7c,0xb2,0xf5,0x1e,0x7c,0xb3,0xf5,0x1d,0xa9,0xc2,0xb4,0x7c,
0xbf,0x11,0x68,0xe5,0x1f,0x11,0x68,0xe5,0x1e,0x11,0x68,0xe5,0x1d,0x11,0x68,0xda,
0xf8,0x22,0x7f,0x70,0x7f,0x61,0xe5,0x22,0xb4,0x1, 0x1d,0x7e,0x34,0xf0,0x0, 0x7e,
0x24,0x0, 0x1, 0xbf,0x61,0x50,0x11,0x7e,0xd, 0x19,0x2f,0x6, 0x7e,0x34,0xe0,0x0,
0x7e,0x24,0x0, 0x1, 0xbf,0x1, 0x38,0x55,0xd2,0xa, 0x11,0xa3,0x74,0x2, 0x7f,0x16,
0x11,0xca,0x9f,0x11,0x80,0x14,0x7d,0x13,0x2d,0x1f,0x7d,0xe, 0x7e,0xb, 0xb0,0xf5,
0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xb, 0x1c,0x7e,0xd, 0x19,0xbf,0x10,0x40,
0xe5,0xa9,0xd2,0xb4,0x12,0x7, 0x2d,0x11,0xb7,0x50,0xa, 0x7e,0x37,0x2, 0x86,0xbe,
0x34,0x1, 0xf4,0x28,0xf2,0x7e,0x37,0x2, 0x86,0xbe,0x34,0x1, 0xf4,0x38,0x3, 0x2,
0x7, 0x43,0xc2,0x86,0x7e,0x34,0x13,0x88,0x12,0x6, 0xfe,0xd2,0x86,0x22,0xca,0x3b,
0x7f,0x30,0x7f,0x51,0x7e,0x4d,0x15,0x7f,0x15,0x5e,0x34,0x0, 0x7f,0x7d,0x53,0x7e,
0x44,0x0, 0x80,0x9d,0x45,0x7d,0x34,0x6d,0x22,0xbf,0x14,0x40,0xc, 0x7a,0x4d,0x19,
0x7f,0x15,0x7f,0x3, 0x11,0xf2,0xd3,0x80,0x48,0x7d,0x34,0x6d,0x22,0x7a,0x1d,0x19,
0x7f,0x15,0x7f,0x3, 0x11,0xf2,0x7d,0x34,0x6d,0x22,0x9f,0x41,0x2f,0x51,0x2d,0x74,
0x80,0x19,0x7e,0x18,0x0, 0x80,0x7a,0x1d,0x19,0x7f,0x15,0x7f,0x3, 0x11,0xf2,0x9e,
0x48,0x0, 0x80,0x2e,0x74,0x0, 0x80,0x2e,0x58,0x0, 0x80,0xbe,0x48,0x0, 0x80,0x50,
0xe1,0xbe,0x48,0x0, 0x0, 0x68,0x9, 0x7a,0x4d,0x19,0x7f,0x15,0x7f,0x3, 0x11,0xf2,
0xd3,0xda,0x3b,0x22,0x7c,0x6b,0xd2,0xa, 0x11,0xa3,0x74,0x20,0xca,0xb8,0xa, 0x36,
0x6d,0x22,0x74,0xc, 0x2f,0x11,0x14,0x78,0xfb,0xda,0xb8,0x11,0xca,0xa9,0xd2,0xb4,
0x12,0x7, 0x2d,0x11,0xb7,0x50,0xa, 0x7e,0x37,0x2, 0x86,0xbe,0x34,0x1, 0xf4,0x28,
0xf2,0x7e,0x37,0x2, 0x86,0xbe,0x34,0x1, 0xf4,0x38,0x5, 0x12,0x7, 0x43,0xd3,0x22,
0xc2,0x86,0x7e,0x34,0x13,0x88,0x12,0x6, 0xfe,0xd2,0x86,0xc3,0x22,0xd2,0xa, 0x11,
0xa3,0xa9,0xc2,0xb4,0x74,0x60,0x11,0x68,0xa9,0xd2,0xb4,0x11,0xb7,0x40,0xfc,0xd3,
0x22,0x7c,0x7b,0xa9,0xc2,0xb4,0xa9,0xc6,0xb3,0x75,0xb5,0x5, 0xa9,0x36,0xb3,0xfc,
0xa9,0xc6,0xb3,0x75,0xb5,0x0, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x75,0xb5,0x0,
0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7a,0x71,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,
0xb3,0x75,0xb5,0x0, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x75,0xb5,0x0, 0xa9,0x36,
0xb3,0xfc,0xa9,0xc6,0xb3,0x7e,0x61,0xb5,0x75,0xb5,0x0, 0xa9,0x36,0xb3,0xfc,0xa9,
0xc6,0xb3,0x7e,0x71,0xb5,0xa9,0xd2,0xb4,0x7c,0x46,0x7c,0x64,0x22,0x7d,0x43,0x7c,
0x5b,0xa, 0x58,0x7d,0x34,0x7c,0x47,0xa9,0xc2,0xb4,0xa9,0xc6,0xb3,0x75,0xb5,0x1,
0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x75,0xb5,0x0, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,
0xb3,0x75,0xb5,0x0, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7a,0x51,0xb5,0xa9,0x36,
0xb3,0xfc,0xa9,0xc6,0xb3,0xf5,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7a,0x41,
0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xa9,0xd2,0xb4,0x22,0x7c,0x7b,0xbe,0x70,
0x0, 0x28,0x2, 0x61,0x22,0x74,0x1, 0x7e,0x34,0xdf,0xff,0x51,0x9d,0x74,0x6, 0x51,
0x41,0x7d,0x13,0x6c,0x33,0x7d,0x31,0x51,0x9d,0x74,0x6, 0x7d,0x31,0x51,0x9d,0x74,
0x6, 0x7d,0x31,0x51,0x9d,0x74,0x2, 0x51,0x41,0x7d,0x13,0x4e,0x30,0x1, 0x7d,0x31,
0x41,0x9d,0x74,0x6, 0x51,0x41,0x7d,0x13,0x7e,0x30,0xa5,0x7d,0x31,0x51,0x9d,0x7e,
0x30,0xf, 0x74,0x6, 0x7d,0x31,0x51,0x9d,0x7e,0x30,0x6a,0x74,0x6, 0x7d,0x31,0x51,
0x9d,0x7e,0x34,0x0, 0x5, 0x2, 0x6, 0xfe,0xca,0x79,0x7c,0xf7,0x7c,0xeb,0x74,0x1,
0x51,0xec,0x74,0x1, 0x6d,0x33,0x51,0x9d,0xe4,0x51,0x41,0x7d,0x13,0x5e,0x14,0x80,
0x0, 0x7c,0xf, 0x6c,0x11,0x3e,0x4, 0x4d,0x10,0x7d,0x31,0x51,0x9d,0x6d,0x0, 0xbe,
0xe0,0x1, 0x78,0x6, 0x7e,0x14,0x0, 0x8, 0x80,0x2, 0x7d,0x10,0x74,0x4, 0x7d,0x31,
0x51,0x9d,0x4e,0x30,0x10,0x4e,0x30,0x40,0x74,0x4, 0x7d,0x31,0x51,0x9d,0x7e,0x34,
0x0, 0x19,0x12,0x6, 0xfe,0x4e,0x30,0x1, 0x74,0x4, 0x7d,0x31,0x51,0x9d,0x7e,0x34,
0xa2,0x1c,0x12,0x6, 0xfe,0x5e,0x30,0xbf,0x74,0x4, 0x7d,0x31,0x51,0x9d,0x7e,0x34,
0x0, 0x19,0x12,0x6, 0xfe,0x5e,0x30,0xfe,0x74,0x4, 0x7d,0x31,0x51,0x9d,0x7e,0x34,
0x0, 0x19,0x12,0x6, 0xfe,0x5e,0x30,0xef,0x74,0x4, 0x7d,0x31,0x51,0x9d,0x7e,0x34,
0x0, 0x5, 0x12,0x6, 0xfe,0xe4,0x51,0xec,0x7e,0x34,0xff,0xf7,0x74,0x4, 0x51,0x9d,
0xda,0x79,0x22,0xca,0xf8,0x7c,0xfb,0x74,0x1, 0x51,0xec,0xe4,0x6d,0x33,0x51,0x9d,
0x74,0x1, 0x6d,0x33,0x51,0x9d,0x6d,0x0, 0xbe,0xf0,0x1, 0x78,0x6, 0x7e,0x14,0x0,
0x8, 0x80,0x2, 0x7d,0x10,0x74,0x4, 0x7d,0x31,0x51,0x9d,0x4e,0x30,0x10,0x4e,0x30,
0x40,0x4e,0x30,0x4, 0x74,0x4, 0x7d,0x31,0x51,0x9d,0x7e,0x34,0x0, 0x19,0x12,0x6,
0xfe,0x4e,0x30,0x1, 0x74,0x4, 0x7d,0x31,0x51,0x9d,0x7e,0x34,0xa2,0x1c,0x12,0x6,
0xfe,0x5e,0x30,0xbf,0x74,0x4, 0x7d,0x31,0x51,0x9d,0x7e,0x34,0x0, 0xa0,0x12,0x6,
0xfe,0x5e,0x30,0xfe,0x74,0x4, 0x7d,0x31,0x51,0x9d,0x7e,0x34,0x0, 0x19,0x12,0x6,
0xfe,0x5e,0x30,0xef,0x74,0x4, 0x7d,0x31,0x51,0x9d,0x7e,0x34,0x0, 0x1, 0x12,0x6,
0xfe,0xe4,0x51,0xec,0x7e,0x34,0xff,0xf7,0x74,0x4, 0x51,0x9d,0xda,0xf8,0x22,0x7f,
0x1, 0x7c,0xb1,0xf5,0x16,0x7c,0xb2,0xf5,0x15,0x7c,0xb3,0xf5,0x14,0xa9,0xc2,0xb4,
0x74,0xb, 0x11,0x68,0xe5,0x16,0x11,0x68,0xe5,0x15,0x11,0x68,0xe5,0x14,0x11,0x68,
0xe4,0x1, 0x68,0x7f,0x70,0x7f,0x1, 0x91,0x6f,0x7f,0x7, 0x7e,0x1d,0x10,0x11,0x83,
0xa9,0xd2,0xb4,0xd3,0x22,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0x7c,0xa7,0xa, 0xf6,0x6d,0xee,0x60,0x2, 0x1, 0xb0,0x1b,0xa0,0x68,0x23,0x1b,0xa0,
0x68,0x2e,0x1b,0xa0,0x68,0x3a,0x1b,0xa0,0x68,0x44,0x1b,0xa0,0x68,0x50,0x1b,0xa0,
0x68,0x6d,0x2e,0xa0,0x6, 0x68,0x2, 0x21,0x15,0x7e,0x34,0x0, 0x28,0x7a,0x35,0x25,
0x22,0x7d,0xf, 0x6d,0x11,0x7e,0x35,0x25,0x59,0x13,0x0, 0x2, 0x1b,0x38,0x0, 0x22,
0x7d,0x4e,0x7c,0x89,0x7d,0x5f,0x7c,0x9a,0x7c,0xab,0xe4,0x7e,0x15,0x25,0x80,0x2e,
0x7e,0x15,0x25,0x49,0x31,0x0, 0x2, 0xb, 0x18,0x20,0x2f,0x17,0x80,0x29,0x7d,0x2f,
0x6d,0x33,0x7e,0x15,0x25,0x59,0x31,0x0, 0x6, 0x59,0x21,0x0, 0x4, 0x22,0x7d,0x4e,
0x7c,0x89,0x7d,0x5f,0x7c,0x9a,0x7c,0xab,0xe4,0x7e,0x15,0x25,0xb, 0x16,0x49,0x31,
0x0, 0x2, 0xb, 0x18,0x20,0x2f,0x12,0x59,0x31,0x0, 0x2, 0x1b,0x18,0x20,0x22,0x7e,
0x35,0x25,0x7d,0x23,0xb, 0x26,0x49,0x12,0x0, 0x2, 0xb, 0x28,0x0, 0x2f,0x7, 0x59,
0x12,0x0, 0x2, 0x1b,0x28,0x0, 0x7e,0x24,0x0, 0x6, 0x7a,0x27,0x2, 0x61,0x80,0x5d,
0x7e,0x73,0x2, 0x89,0xa, 0x37,0x6d,0x22,0x7c,0x67,0x6c,0x77,0x7e,0x33,0x2, 0x88,
0xa, 0x13,0x7d,0x1, 0x6d,0x11,0x2f,0x1, 0x7e,0x73,0x2, 0x8a,0xa, 0x37,0x2f,0x10,
0x7e,0x15,0x25,0x59,0x31,0x0, 0x2, 0x1b,0x18,0x20,0x7e,0x73,0x2, 0x8c,0xa, 0x37,
0x6d,0x22,0x7c,0x67,0x6c,0x77,0x7e,0x13,0x2, 0x8b,0xa, 0x51,0x7d,0x45,0x6d,0x55,
0x2f,0x21,0x7e,0x73,0x2, 0x8d,0xa, 0x37,0x2f,0x12,0x59,0x31,0x0, 0x6, 0x59,0x21,
0x0, 0x4, 0x7e,0x34,0x0, 0x6, 0x7a,0x37,0x2, 0x61,0x7e,0x35,0x25,0x7a,0x35,0x23,
0xe4,0x7a,0xb3,0x2, 0x79,0x22,0x75,0xa8,0x0, 0x75,0xdf,0x0, 0x12,0x4, 0x56,0x12,
0x6, 0x65,0x12,0x10,0x21,0xd2,0x7, 0x12,0x10,0x32,0x12,0x6, 0xe3,0x12,0x7, 0x1d,
0xd2,0xaf,0x22,0x7e,0xb3,0x2, 0x69,0xb4,0xc, 0xb, 0xc2,0x86,0x7e,0x34,0x0, 0x64,
0x12,0x6, 0xfe,0xd2,0x86,0x22,0x7e,0xa3,0x2, 0x6a,0xbe,0xa0,0xb, 0x78,0x3a,0x7e,
0x1f,0x2, 0x63,0xbe,0x18,0x0, 0x0, 0x68,0x12,0x7e,0x14,0xe0,0x0, 0x7e,0x4, 0x0,
0x1, 0xbf,0x10,0x38,0x6, 0xa2,0x3, 0xe4,0x33,0x78,0x3, 0x74,0x1, 0x22,0x7e,0x45,
0x23,0x49,0xf4,0x0, 0x6, 0x49,0xe4,0x0, 0x4, 0x49,0x34,0x0, 0x2, 0xb, 0x48,0x20,
0x2f,0x17,0xbf,0x10,0x40,0xb, 0x74,0x1, 0x22,0xbe,0xa0,0xa, 0x68,0x3, 0x74,0x1,
0x22,0xe4,0x22,0x6d,0x33,0x7a,0x37,0x2, 0x61,0x7e,0x34,0x0, 0x28,0x7a,0x35,0x25,
0x31,0x16,0x7e,0x37,0x2, 0x61,0x1b,0x34,0x68,0x6d,0x1b,0x35,0x78,0x2, 0x41,0x4f,
0x1b,0x34,0x78,0x2, 0x41,0x81,0x1b,0x34,0x78,0x2, 0x61,0x3f,0x1b,0x34,0x78,0x2,
0x61,0x70,0xb, 0x36,0x68,0x2, 0x81,0x27,0x6d,0x33,0x7a,0x37,0x2, 0x61,0x7a,0x37,
0x2, 0x67,0x31,0x46,0x60,0x2, 0x81,0x27,0x7e,0x15,0x23,0x49,0x31,0x0, 0x6, 0x49,
0x21,0x0, 0x4, 0x7a,0x1d,0xc, 0x49,0x31,0x0, 0x2, 0xb, 0x18,0x20,0x2e,0x14,0x0,
0xa, 0x6d,0x0, 0x12,0xf, 0x3c,0x7e,0x55,0x23,0x49,0x15,0x0, 0x6, 0x49,0x5, 0x0,
0x4, 0x49,0x35,0x0, 0x2, 0xb, 0x58,0x20,0x12,0x0, 0x9d,0x2e,0x34,0x10,0x0, 0x7a,
0x37,0x2, 0x67,0x31,0x33,0x81,0x27,0x6d,0x33,0x7a,0x37,0x2, 0x61,0x7a,0x37,0x2,
0x67,0x7e,0x18,0x1, 0x0, 0x7a,0x1d,0x10,0x7e,0x15,0x23,0x49,0x31,0x0, 0x2, 0xb,
0x18,0x20,0x2e,0x14,0x0, 0xa, 0x6d,0x0, 0x12,0x14,0x93,0x30,0x0, 0x9, 0x7e,0x35,
0x23,0x9, 0xb3,0x0, 0xa, 0xf5,0x91,0x31,0x33,0x7e,0x34,0xf0,0x88,0x80,0x2c,0x6d,
0x33,0x7a,0x37,0x2, 0x61,0x7a,0x37,0x2, 0x67,0x7e,0x18,0x2, 0x79,0x7a,0x1d,0xc,
0x7e,0x55,0x23,0x49,0x35,0x0, 0x2, 0xb, 0x58,0x20,0x49,0x15,0x0, 0x6, 0x49,0x5,
0x0, 0x4, 0x12,0xe, 0xc0,0x31,0x33,0x7e,0x34,0xf0,0x55,0x7a,0x37,0x2, 0x67,0x81,
0x27,0x75,0x22,0x0, 0x6d,0x33,0x7a,0x37,0x2, 0x61,0x7a,0x37,0x2, 0x67,0x7e,0xb3,
0x2, 0x6a,0xb4,0xa, 0xe, 0x30,0x8, 0x6, 0xe4,0x12,0x13,0xe3,0x81,0x1d,0x12,0x12,
0x2d,0x81,0x1d,0x7e,0xb3,0x2, 0x6a,0xb4,0xb, 0x67,0x7e,0x1f,0x2, 0x63,0xbe,0x18,
0x0, 0x0, 0x78,0x2, 0x81,0x27,0x7e,0x14,0xe0,0x0, 0x7e,0x4, 0x0, 0x1, 0xbf,0x10,
0x28,0x2, 0x81,0x27,0xa2,0x3, 0xe4,0x33,0x78,0x2, 0x81,0x27,0x7d,0x13,0x5e,0x14,
0xf, 0xff,0x78,0x14,0x74,0xc, 0x7f,0x1, 0x1e,0x14,0x1e,0x4, 0x50,0x3, 0x4e,0x20,
0x80,0x14,0x78,0xf4,0x7c,0xb3,0x80,0x12,0x74,0xc, 0x1e,0x34,0x1e,0x24,0x50,0x3,
0x4e,0x60,0x80,0x14,0x78,0xf4,0x7f,0x21,0xb, 0x2c,0xf5,0xb, 0x75,0xa, 0x0, 0x80,
0x7, 0xe5,0xa, 0x12,0x11,0xe4,0x5, 0xa, 0xe5,0xb, 0xbe,0xb1,0xa, 0x38,0xf2,0x81,
0x1d,0x20,0x8, 0x2, 0x81,0x1d,0x7e,0x73,0x2, 0x6a,0xa, 0x57,0x9e,0x54,0x0, 0x80,
0xf5,0x8, 0x6d,0x66,0x80,0xd, 0xe4,0x7e,0xa1,0x8, 0xa, 0x3a,0x2d,0x36,0x12,0x13,
0x48,0xb, 0x64,0x7e,0x73,0x2, 0x46,0xa, 0x37,0xbd,0x36,0x18,0xe9,0x81,0x1d,0x75,
0x22,0x1, 0x6d,0x33,0x7a,0x37,0x2, 0x61,0x6d,0x22,0x7a,0x27,0x2, 0x67,0x30,0x8,
0x2, 0x81,0x1d,0x7d,0x63,0xbe,0x64,0x0, 0x1e,0x48,0x6, 0xbe,0x64,0x0, 0x1f,0x48,
0x5, 0x7c,0xbd,0x12,0x11,0xe4,0xb, 0x64,0xbe,0x64,0x0, 0x20,0x78,0xe7,0x81,0x1d,
0x6d,0x33,0x7a,0x37,0x2, 0x61,0x7a,0x37,0x2, 0x67,0x30,0x8, 0x2, 0x81,0x1d,0x7e,
0x15,0x23,0x49,0x31,0x0, 0x2, 0xb, 0x18,0x20,0x7d,0x3, 0x5e,0x4, 0xf, 0xff,0x68,
0x2, 0x81,0x27,0x49,0x31,0x0, 0x6, 0x49,0x21,0x0, 0x4, 0x4d,0x23,0x78,0x2, 0x81,
0x27,0x49,0x31,0x0, 0x2, 0xb, 0x18,0x20,0x74,0xc, 0x1e,0x34,0x1e,0x24,0x50,0x3,
0x4e,0x60,0x80,0x14,0x78,0xf4,0x7c,0xb7,0xf5,0x8, 0x49,0x31,0x0, 0x6, 0x49,0x21,
0x0, 0x4, 0x7d,0x3, 0x5e,0x4, 0xf, 0xff,0x78,0x1a,0x49,0x31,0x0, 0x6, 0x49,0x21,
0x0, 0x4, 0x74,0xc, 0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,
0x7c,0xe7,0x80,0x1a,0x49,0x31,0x0, 0x6, 0x49,0x21,0x0, 0x4, 0x74,0xc, 0x1e,0x34,
0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x7c,0xe7,0xb, 0xe0,0xa, 0x2e,
0xe5,0x8, 0xa, 0x3b,0x2d,0x32,0xbe,0x34,0x0, 0x1f,0x18,0x1b,0x6c,0xff,0x80,0x9,
0xe5,0x8, 0x2c,0xbf,0x12,0x11,0xe4,0xb, 0xf0,0xbc,0xef,0x38,0xf3,0x7e,0x34,0xf0,
0xaa,0x7a,0x37,0x2, 0x67,0x31,0x33,0x20,0x6, 0x2, 0x21,0xa2,0x7e,0x34,0x13,0x88,
0x12,0x6, 0xfe,0x7e,0x34,0x13,0x88,0x12,0x6, 0xfe,0x75,0xe9,0xff,0x21,0xa2,0xff,

View file

@ -0,0 +1,118 @@
#
# Himax Touchscreen driver configuration
#
config TOUCHSCREEN_HIMAX_COMMON
tristate "HIMAX chipset i2c touchscreen"
depends on TOUCHSCREEN_HIMAX_CHIPSET
help
This enables support for HIMAX CHIPSET over I2C based touchscreens.
choice
prompt "HIMAX touch IC types"
depends on TOUCHSCREEN_HIMAX_COMMON
default TOUCHSCREEN_HIMAX_INCELL
config TOUCHSCREEN_HIMAX_ONCELL
bool "HIMAX chipset on-cell function"
depends on TOUCHSCREEN_HIMAX_COMMON
help
This enables support for HIMAX CHIPSET of on-cell function.
config TOUCHSCREEN_HIMAX_INCELL
bool "HIMAX chipset in-cell function"
depends on TOUCHSCREEN_HIMAX_COMMON
help
This enables support for HIMAX CHIPSET of in-cell function.
endchoice
# ***************** On-cell Start *****************
config TOUCHSCREEN_HIMAX_IC_HX852xH
tristate "HIMAX chipset HX852xH function"
depends on TOUCHSCREEN_HIMAX_ONCELL
help
This enables support for HIMAX CHIPSET of HX852xH.
config TOUCHSCREEN_HIMAX_IC_HX852xG
tristate "HIMAX chipset HX852xG function"
depends on TOUCHSCREEN_HIMAX_ONCELL
help
This enables support for HIMAX CHIPSET of HX852xG.
# ***************** On-cell End *******************
# ***************** In-cell Start *****************
config TOUCHSCREEN_HIMAX_IC_HX83192
tristate "HIMAX chipset HX83192 function"
depends on TOUCHSCREEN_HIMAX_INCELL
help
This enables support for HIMAX CHIPSET of HX83192.
config TOUCHSCREEN_HIMAX_IC_HX83191
tristate "HIMAX chipset HX83191 function"
depends on TOUCHSCREEN_HIMAX_INCELL
help
This enables support for HIMAX CHIPSET of HX83191.
config TOUCHSCREEN_HIMAX_IC_HX83113
tristate "HIMAX chipset HX83113 function"
depends on TOUCHSCREEN_HIMAX_INCELL
help
This enables support for HIMAX CHIPSET of HX83113.
+config TOUCHSCREEN_HIMAX_IC_HX83112
tristate "HIMAX chipset HX83112 function"
depends on TOUCHSCREEN_HIMAX_INCELL
help
This enables support for HIMAX CHIPSET of HX83112.
config TOUCHSCREEN_HIMAX_IC_HX83111
tristate "HIMAX chipset HX83111 function"
depends on TOUCHSCREEN_HIMAX_INCELL
help
This enables support for HIMAX CHIPSET of HX83111.
config TOUCHSCREEN_HIMAX_IC_HX83106
tristate "HIMAX chipset HX83106 function"
depends on TOUCHSCREEN_HIMAX_INCELL
help
This enables support for HIMAX CHIPSET of HX83106.
config TOUCHSCREEN_HIMAX_IC_HX83103
tristate "HIMAX chipset HX83103 function"
depends on TOUCHSCREEN_HIMAX_INCELL
help
This enables support for HIMAX CHIPSET of HX83103.
config TOUCHSCREEN_HIMAX_IC_HX83102
tristate "HIMAX chipset HX83102 function"
depends on TOUCHSCREEN_HIMAX_INCELL
help
This enables support for HIMAX CHIPSET of HX83102.
# ***************** In-cell End *******************
config TOUCHSCREEN_HIMAX_DEBUG
bool "HIMAX debug function"
depends on TOUCHSCREEN_HIMAX_INCELL || TOUCHSCREEN_HIMAX_ONCELL
help
This enables support for HIMAX debug function.
config TOUCHSCREEN_HIMAX_INSPECT
bool "HIMAX inspect function"
depends on TOUCHSCREEN_HIMAX_INCELL || TOUCHSCREEN_HIMAX_ONCELL
help
This enables support for HIMAX debug function.
config TOUCHSCREEN_HIMAX_EMBEDDED_FIRMWARE
bool "HIMAX embedded firmware function"
depends on TOUCHSCREEN_HIMAX_INCELL || TOUCHSCREEN_HIMAX_ONCELL
help
This enables built-in FW inside kernel as binary array
config HMX_DB
bool "HIMAX driver test over Dragon Board"
depends on TOUCHSCREEN_HIMAX_COMMON
help
This enables support for HIMAX driver test over Dragon Board.

View file

@ -0,0 +1,170 @@
# Makefile for the Himax touchscreen drivers.
ifneq ($(filter y, $(CONFIG_KALLSYMS_ALL)),)
ccflags-y += -D__KERNEL_KALLSYMS_ALL_ENABLED__
endif
#ifneq ($(filter y, $(CONFIG_FB)),)
# ccflags-y += -DHX_CONFIG_FB
#endif
ifneq ($(filter y, $(CONFIG_DRM)),)
ccflags-y += -DHX_CONFIG_DRM
endif
ifneq ($(filter y m, $(CONFIG_TOUCHSCREEN_HIMAX_DEBUG)),)
himax_mmi-objs += himax_debug.o
endif
ifneq ($(filter y m, $(CONFIG_TOUCHSCREEN_HIMAX_INSPECT)),)
himax_mmi-objs += himax_inspection.o
endif
ifneq ($(filter y m, $(CONFIG_TOUCHSCREEN_HIMAX_INCELL)),)
himax_mmi-objs += himax_ic_incell_core.o
endif
ifneq ($(filter y m, $(CONFIG_TOUCHSCREEN_HIMAX_ONCELL)),)
himax_mmi-objs += himax_ic_oncell_core.o
endif
ifneq ($(filter y m, $(CONFIG_TOUCHSCREEN_HIMAX_IC_HX852xG)),)
ccflags-y += -D__HIMAX_HX852xG_MOD__
ifneq ($(filter m, $(CONFIG_TOUCHSCREEN_HIMAX_COMMON)),)
obj-m += himax_ic_HX852xG.o
endif
ifneq ($(filter y, $(CONFIG_TOUCHSCREEN_HIMAX_COMMON)),)
obj-y += himax_ic_HX852xG.o
endif
endif
ifneq ($(filter y m, $(CONFIG_TOUCHSCREEN_HIMAX_IC_HX852xH)),)
ccflags-y += -D__HIMAX_HX852xH_MOD__
ifneq ($(filter m, $(CONFIG_TOUCHSCREEN_HIMAX_COMMON)),)
obj-m += himax_ic_HX852xH.o
endif
ifneq ($(filter y, $(CONFIG_TOUCHSCREEN_HIMAX_COMMON)),)
obj-y += himax_ic_HX852xH.o
endif
endif
ifneq ($(filter y m, $(CONFIG_TOUCHSCREEN_HIMAX_IC_HX83102)),)
ccflags-y += -D__HIMAX_HX83102_MOD__
ifneq ($(filter m, $(CONFIG_TOUCHSCREEN_HIMAX_COMMON)),)
obj-m += himax_ic_HX83102.o
endif
ifneq ($(filter y, $(CONFIG_TOUCHSCREEN_HIMAX_COMMON)),)
obj-y += himax_ic_HX83102.o
endif
endif
ifneq ($(filter y m, $(CONFIG_TOUCHSCREEN_HIMAX_IC_HX83103)),)
ccflags-y += -D__HIMAX_HX83103_MOD__
ifneq ($(filter m, $(CONFIG_TOUCHSCREEN_HIMAX_COMMON)),)
obj-m += himax_ic_HX83103.o
endif
ifneq ($(filter y, $(CONFIG_TOUCHSCREEN_HIMAX_COMMON)),)
obj-y += himax_ic_HX83103.o
endif
endif
ifneq ($(filter y m, $(CONFIG_TOUCHSCREEN_HIMAX_IC_HX83106)),)
ccflags-y += -D__HIMAX_HX83106_MOD__
ifneq ($(filter m, $(CONFIG_TOUCHSCREEN_HIMAX_COMMON)),)
obj-m += himax_ic_HX83106.o
endif
ifneq ($(filter y, $(CONFIG_TOUCHSCREEN_HIMAX_COMMON)),)
obj-y += himax_ic_HX83106.o
endif
endif
ifneq ($(filter y m, $(CONFIG_TOUCHSCREEN_HIMAX_IC_HX83111)),)
ccflags-y += -D__HIMAX_HX83111_MOD__
ifneq ($(filter m, $(CONFIG_TOUCHSCREEN_HIMAX_COMMON)),)
obj-m += himax_ic_HX83111.o
endif
ifneq ($(filter y, $(CONFIG_TOUCHSCREEN_HIMAX_COMMON)),)
obj-y += himax_ic_HX83111.o
endif
endif
ifneq ($(filter y m, $(CONFIG_TOUCHSCREEN_HIMAX_IC_HX83112)),)
ccflags-y += -D__HIMAX_HX83112_MOD__
ifneq ($(filter m, $(CONFIG_TOUCHSCREEN_HIMAX_COMMON)),)
obj-m += himax_ic_HX83112.o
endif
ifneq ($(filter y, $(CONFIG_TOUCHSCREEN_HIMAX_COMMON)),)
obj-y += himax_ic_HX83112.o
endif
endif
ifneq ($(filter y m, $(CONFIG_TOUCHSCREEN_HIMAX_IC_HX83113)),)
ccflags-y += -D__HIMAX_HX83113_MOD__
ifneq ($(filter m, $(CONFIG_TOUCHSCREEN_HIMAX_COMMON)),)
obj-m += himax_ic_HX83113.o
endif
ifneq ($(filter y, $(CONFIG_TOUCHSCREEN_HIMAX_COMMON)),)
obj-y += himax_ic_HX83113.o
endif
endif
ifneq ($(filter y m, $(CONFIG_TOUCHSCREEN_HIMAX_IC_HX83192)),)
ccflags-y += -D__HIMAX_HX83192_MOD__
ifneq ($(filter m, $(CONFIG_TOUCHSCREEN_HIMAX_COMMON)),)
obj-m += himax_ic_HX83192.o
endif
ifneq ($(filter y, $(CONFIG_TOUCHSCREEN_HIMAX_COMMON)),)
obj-y += himax_ic_HX83192.o
endif
endif
ifneq ($(filter y m, $(CONFIG_TOUCHSCREEN_HIMAX_IC_HX83191)),)
ccflags-y += -D__HIMAX_HX83191_MOD__
ifneq ($(filter m, $(CONFIG_TOUCHSCREEN_HIMAX_COMMON)),)
obj-m += himax_ic_HX83191.o
endif
ifneq ($(filter y, $(CONFIG_TOUCHSCREEN_HIMAX_COMMON)),)
obj-y += himax_ic_HX83191.o
endif
endif
ifneq ($(filter m, $(CONFIG_TOUCHSCREEN_HIMAX_COMMON)),)
ccflags-y += -D__HIMAX_MOD__
himax_mmi-objs += himax_common.o
himax_mmi-objs += himax_platform.o
ifneq ($(filter y, $(CONFIG_TOUCHSCREEN_HIMAX_EMBEDDED_FIRMWARE)),)
himax_mmi-objs += Himax_firmware.o
endif
obj-m += himax_mmi.o
endif
ifneq ($(filter y, $(CONFIG_TOUCHSCREEN_HIMAX_COMMON)),)
himax_mmi-objs += himax_common.o
himax_mmi-objs += himax_platform.o
ifneq ($(filter y, $(CONFIG_TOUCHSCREEN_HIMAX_EMBEDDED_FIRMWARE)),)
himax_mmi-objs += Himax_firmware.o
endif
obj-y += himax_mmi.o
endif
ifneq ($(filter y, $(CONFIG_TOUCHSCREEN_HIMAX_EMBEDDED_FIRMWARE)),)
ccflags-y += -D__EMBEDDED_FW__
ld_array_start_str = _binary_$(srctree)/$(src)_Himax_firmware_bin_start
ld_array_start_sym = $(subst -,_,$(subst .,_,$(subst /,_,$(ld_array_start_str))))
obj_array_start_sym = _binary___Himax_firmware_bin_start
ld_array_size_str = _binary_$(srctree)/$(src)_Himax_firmware_bin_size
ld_array_size_sym = $(subst -,_,$(subst .,_,$(subst /,_,$(ld_array_size_str))))
obj_array_size_sym = _binary___Himax_firmware_bin_size
ld_array_end_str = _binary_$(srctree)/$(src)_Himax_firmware_bin_end
ld_array_end_sym = $(subst -,_,$(subst .,_,$(subst /,_,$(ld_array_end_str))))
obj_array_end_sym = _binary___Himax_firmware_bin_end
$(src)/Himax_firmware.o: $(src)/Himax_firmware.bin FORCE
$(LD) $(LDFLAGS) -r -b binary $(srctree)/$(src)/Himax_firmware.bin -o $(objtree)/$(obj)/Himax_firmware.o
$(OBJCOPY) --redefine-sym $(ld_array_start_sym)=$(obj_array_start_sym) $(objtree)/$(obj)/Himax_firmware.o
$(OBJCOPY) --redefine-sym $(ld_array_size_sym)=$(obj_array_size_sym) $(objtree)/$(obj)/Himax_firmware.o
$(OBJCOPY) --redefine-sym $(ld_array_end_sym)=$(obj_array_end_sym) $(objtree)/$(obj)/Himax_firmware.o
endif

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,545 @@
/* SPDX-License-Identifier: GPL-2.0 */
/* Himax Android Driver Sample Code for common functions
*
* Copyright (C) 2019 Himax Corporation.
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
* may be copied, distributed, and modified under those terms.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#ifndef HIMAX_COMMON_H
#define HIMAX_COMMON_H
#include <asm/segment.h>
#include <linux/uaccess.h>
#include <linux/atomic.h>
#include <linux/delay.h>
#include <linux/i2c.h>
#include <linux/input.h>
#include <linux/interrupt.h>
#include <linux/module.h>
#include <linux/async.h>
#include <linux/platform_device.h>
#include <linux/slab.h>
#include <linux/gpio.h>
#include <linux/input/mt.h>
#include <linux/firmware.h>
#include <linux/types.h>
#include <linux/fs.h>
#include <linux/buffer_head.h>
#include <linux/pm_wakeup.h>
#include <linux/seq_file.h>
#include <linux/proc_fs.h>
#include "himax_platform.h"
#include <linux/kallsyms.h>
#if defined(CONFIG_OF)
#include <linux/of_gpio.h>
#endif
#define HIMAX_DRIVER_VER "2.0.0.51_HTF065H035_01"
#define FLASH_DUMP_FILE "/sdcard/HX_Flash_Dump.bin"
#if defined(CONFIG_TOUCHSCREEN_HIMAX_DEBUG)
#define HX_TP_PROC_2T2R
/*if enable, selftest works in driver*/
/*#define HX_TP_SELF_TEST_DRIVER*/
#endif
/*===========Himax Option function=============*/
#define HX_RST_PIN_FUNC
#define HX_ESD_RECOVERY
/*#define HX_NEW_EVENT_STACK_FORMAT*/
/*#define HX_AUTO_UPDATE_FW*/
/*#define HX_SMART_WAKEUP*/
/*#define HX_GESTURE_TRACK*/
#define HX_RESUME_SEND_CMD /*Need to enable on TDDI chipset*/
/*#define HX_HIGH_SENSE*/
/*#define HX_PALM_REPORT*/
/*#define HX_USB_DETECT_GLOBAL*/
/* for MTK special platform.If turning on,
* it will report to system by using specific format.
*/
/*#define HX_PROTOCOL_A*/
#define HX_PROTOCOL_B_3PA
#define HX_ZERO_FLASH
/*system suspend-chipset power off,
*oncell chipset need to enable the definition
*/
/*#define HX_RESUME_HW_RESET*/
/*for Himax auto-motive chipset
*/
/*#define HX_PON_PIN_SUPPORT*/
/*=============================================*/
/* Enable it if driver go into suspend/resume twice */
/*#undef HX_CONFIG_FB*/
/* Enable it if driver go into suspend/resume twice */
/*#undef HX_CONFIG_DRM*/
#if defined(HX_CONFIG_FB)
#include <linux/notifier.h>
#include <linux/fb.h>
#elif defined(HX_CONFIG_DRM)
#include <drm/drm_panel.h>
#endif
#if defined(__HIMAX_MOD__)
#define HX_USE_KSYM
#if !defined(HX_USE_KSYM) || !defined(__KERNEL_KALLSYMS_ALL_ENABLED__)
#error Modulized driver must enable HX_USE_KSYM and CONFIG_KALLSYM_ALL
#endif
#endif
#if defined(HX_ZERO_FLASH)
/* zero flash case, you need to setup the fix_touch_info of module
*/
#define HX_FIX_TOUCH_INFO
#define HX_RESUME_SET_FW
#define HX_CODE_OVERLAY
/*Independent threads run the notification chain notification function resume
*/
#define HX_CONTAINER_SPEED_UP
#else
#define HX_TP_PROC_GUEST_INFO
#endif
#if defined(HX_AUTO_UPDATE_FW)
/* FW Auto upgrade case, you need to setup the fix_touch_info of module
*/
#define HX_FIX_TOUCH_INFO
#endif
#if defined(HX_SMART_WAKEUP)
/*This feature need P-sensor driver notified, and FW need to support
*/
/*#define HX_ULTRA_LOW_POWER*/
#endif
#if defined(HX_CONTAINER_SPEED_UP)
/*Resume queue delay work time after LCM RST (unit:ms)
*/
#define DELAY_TIME 40
#endif
#if defined(HX_CONFIG_FB)
int fb_notifier_callback(struct notifier_block *self,
unsigned long event, void *data);
#elif defined(HX_CONFIG_DRM)
int drm_notifier_callback(struct notifier_block *self,
unsigned long event, void *data);
#endif
#define HX_MAX_WRITE_SZ (64 * 1024 + 4)
#define HX_KEY_MAX_COUNT 4
#define DEFAULT_RETRY_CNT 3
#define HX_85XX_A_SERIES_PWON "HX85xxA"
#define HX_85XX_B_SERIES_PWON "HX85xxB"
#define HX_85XX_C_SERIES_PWON "HX85xxC"
#define HX_85XX_D_SERIES_PWON "HX85xxD"
#define HX_85XX_E_SERIES_PWON "HX85xxE"
#define HX_85XX_ES_SERIES_PWON "HX85xxES"
#define HX_85XX_F_SERIES_PWON "HX85xxF"
#define HX_85XX_H_SERIES_PWON "HX85xxH"
#define HX_83100A_SERIES_PWON "HX83100A"
#define HX_83102A_SERIES_PWON "HX83102A"
#define HX_83102B_SERIES_PWON "HX83102B"
#define HX_83102D_SERIES_PWON "HX83102D"
#define HX_83102E_SERIES_PWON "HX83102E"
#define HX_83103A_SERIES_PWON "HX83103A"
#define HX_83106A_SERIES_PWON "HX83106A"
#define HX_83110A_SERIES_PWON "HX83110A"
#define HX_83110B_SERIES_PWON "HX83110B"
#define HX_83111B_SERIES_PWON "HX83111B"
#define HX_83112A_SERIES_PWON "HX83112A"
#define HX_83112B_SERIES_PWON "HX83112B"
#define HX_83113A_SERIES_PWON "HX83113A"
#define HX_83112D_SERIES_PWON "HX83112D"
#define HX_83112E_SERIES_PWON "HX83112E"
#define HX_83112F_SERIES_PWON "HX83112F"
#define HX_83191A_SERIES_PWON "HX83191A"
#define HX_83192A_SERIES_PWON "HX83192A"
#define HX_TP_BIN_CHECKSUM_SW 1
#define HX_TP_BIN_CHECKSUM_HW 2
#define HX_TP_BIN_CHECKSUM_CRC 3
#define SHIFTBITS 5
#define FW_SIZE_32k 32768
#define FW_SIZE_60k 61440
#define FW_SIZE_64k 65536
#define FW_SIZE_124k 126976
#define FW_SIZE_128k 131072
#define NO_ERR 0
#define READY_TO_SERVE 1
#define WORK_OUT 2
#define I2C_FAIL -1
#define HX_INIT_FAIL -1
#define MEM_ALLOC_FAIL -2
#define CHECKSUM_FAIL -3
#define GESTURE_DETECT_FAIL -4
#define INPUT_REGISTER_FAIL -5
#define FW_NOT_READY -6
#define LENGTH_FAIL -7
#define OPEN_FILE_FAIL -8
#define PROBE_FAIL -9
#define ERR_WORK_OUT -10
#define ERR_STS_WRONG -11
#define ERR_TEST_FAIL -12
#define HW_CRC_FAIL 1
#define HX_FINGER_ON 1
#define HX_FINGER_LEAVE 2
#if defined(HX_PALM_REPORT)
#define PALM_REPORT 1
#define NOT_REPORT -1
#endif
#define PEN_INFO_SZ 12
#if defined(__EMBEDDED_FW__)
extern const uint8_t _binary___Himax_firmware_bin_start[];
extern const uint8_t _binary___Himax_firmware_bin_end[];
extern struct firmware g_embedded_fw;
#endif
enum HX_TS_PATH {
HX_REPORT_COORD = 1,
HX_REPORT_SMWP_EVENT,
HX_REPORT_COORD_RAWDATA,
};
enum HX_TS_STATUS {
HX_TS_GET_DATA_FAIL = -4,
HX_ESD_EVENT,
HX_CHKSUM_FAIL,
HX_PATH_FAIL,
HX_TS_NORMAL_END = 0,
HX_ESD_REC_OK,
HX_READY_SERVE,
HX_REPORT_DATA,
HX_ESD_WARNING,
HX_IC_RUNNING,
HX_ZERO_EVENT_COUNT,
HX_RST_OK,
};
enum cell_type {
CHIP_IS_ON_CELL,
CHIP_IS_IN_CELL
};
#if defined(HX_FIX_TOUCH_INFO)
enum fix_touch_info {
FIX_HX_RX_NUM = 18,
FIX_HX_TX_NUM = 32,
FIX_HX_BT_NUM = 0,
FIX_HX_X_RES = 1600,
FIX_HX_Y_RES = 720,
FIX_HX_MAX_PT = 10,
FIX_HX_XY_REVERSE = false,
FIX_HX_INT_IS_EDGE = true,
#if defined(HX_TP_PROC_2T2R)
FIX_HX_RX_NUM_2 = 0,
FIX_HX_TX_NUM_2 = 0,
#endif
};
#endif
#if defined(HX_ZERO_FLASH)
#define HX_SPI_OPERATION
#define HX_0F_DEBUG
#endif
struct himax_ic_data {
int vendor_fw_ver;
int vendor_config_ver;
int vendor_touch_cfg_ver;
int vendor_display_cfg_ver;
int vendor_cid_maj_ver;
int vendor_cid_min_ver;
int vendor_panel_ver;
int vendor_sensor_id;
int ic_adc_num;
uint8_t vendor_cus_info[12];
uint8_t vendor_proj_info[12];
uint8_t vendor_ic_id[13];
int HX_RX_NUM;
int HX_TX_NUM;
int HX_BT_NUM;
int HX_X_RES;
int HX_Y_RES;
int HX_MAX_PT;
bool HX_XY_REVERSE;
bool HX_INT_IS_EDGE;
bool HX_PEN_FUNC;
#if defined(HX_TP_PROC_2T2R)
int HX_RX_NUM_2;
int HX_TX_NUM_2;
#endif
};
struct himax_virtual_key {
int index;
int keycode;
int x_range_min;
int x_range_max;
int y_range_min;
int y_range_max;
};
struct himax_target_report_data {
int *x;
int *y;
int *w;
int *finger_id;
int finger_on;
int finger_num;
#if defined(HX_SMART_WAKEUP)
int SMWP_event_chk;
#endif
int32_t *p_x;
int32_t *p_y;
int32_t *p_w;
int32_t *pen_id;
uint32_t *p_hover;
int32_t *p_tilt_x;
uint32_t *p_btn;
uint32_t *p_btn2;
int32_t *p_tilt_y;
uint32_t *p_on;
int pre_p_btn;
int pre_p_btn2;
int ig_count;
};
struct himax_report_data {
int touch_all_size;
int raw_cnt_max;
int raw_cnt_rmd;
int touch_info_size;
uint8_t finger_num;
uint8_t finger_on;
uint8_t *hx_coord_buf;
uint8_t hx_state_info[2];
#if defined(HX_SMART_WAKEUP)
int event_size;
uint8_t *hx_event_buf;
#endif
int rawdata_size;
uint8_t diag_cmd;
uint8_t *hx_rawdata_buf;
uint8_t rawdata_frame_size;
};
struct himax_ts_data {
bool initialized;
bool suspended;
atomic_t suspend_mode;
uint8_t x_channel;
uint8_t y_channel;
uint8_t useScreenRes;
uint8_t diag_cmd;
char chip_name[30];
uint8_t chip_cell_type;
uint8_t protocol_type;
uint8_t first_pressed;
uint8_t coord_data_size;
uint8_t area_data_size;
uint8_t coordInfoSize;
uint8_t raw_data_frame_size;
uint8_t raw_data_nframes;
uint8_t nFinger_support;
uint8_t irq_enabled;
uint8_t diag_self[50];
uint16_t finger_pressed;
uint16_t last_slot;
uint16_t pre_finger_mask;
uint16_t old_finger;
int hx_point_num;
uint32_t debug_log_level;
uint32_t widthFactor;
uint32_t heightFactor;
uint32_t tw_x_min;
uint32_t tw_x_max;
uint32_t tw_y_min;
uint32_t tw_y_max;
uint32_t pl_x_min;
uint32_t pl_x_max;
uint32_t pl_y_min;
uint32_t pl_y_max;
int rst_gpio;
int use_irq;
int (*power)(int on);
int pre_finger_data[10][2];
struct device *dev;
struct workqueue_struct *himax_wq;
struct work_struct work;
struct input_dev *input_dev;
struct input_dev *hx_pen_dev;
struct hrtimer timer;
struct i2c_client *client;
struct himax_i2c_platform_data *pdata;
struct himax_virtual_key *button;
struct mutex rw_lock;
atomic_t irq_state;
spinlock_t irq_lock;
/******* SPI-start *******/
struct spi_device *spi;
int hx_irq;
uint8_t *xfer_buff;
/******* SPI-end *******/
int in_self_test;
int suspend_resume_done;
int bus_speed;
#if defined(HX_CONFIG_FB) || defined(HX_CONFIG_DRM)
struct notifier_block fb_notif;
struct workqueue_struct *himax_att_wq;
struct delayed_work work_att;
#endif
struct workqueue_struct *flash_wq;
struct work_struct flash_work;
#if defined(HX_AUTO_UPDATE_FW)
struct workqueue_struct *himax_update_wq;
struct delayed_work work_update;
#endif
#if defined(HX_ZERO_FLASH)
struct workqueue_struct *himax_0f_update_wq;
struct delayed_work work_0f_update;
#endif
#if defined(HX_CONTAINER_SPEED_UP)
struct workqueue_struct *ts_int_workqueue;
struct delayed_work ts_int_work;
#endif
struct workqueue_struct *himax_diag_wq;
struct delayed_work himax_diag_delay_wrok;
#if defined(HX_SMART_WAKEUP)
uint8_t SMWP_enable;
uint8_t gesture_cust_en[26];
struct wakeup_source ts_SMWP_wake_lock;
#if defined(HX_ULTRA_LOW_POWER)
bool psensor_flag;
#endif
#endif
#if defined(HX_HIGH_SENSE)
uint8_t HSEN_enable;
#endif
#if defined(HX_USB_DETECT_GLOBAL)
uint8_t usb_connected;
uint8_t *cable_config;
#endif
#if defined(HX_TP_PROC_GUEST_INFO)
struct workqueue_struct *guest_info_wq;
struct work_struct guest_info_work;
#endif
};
struct himax_debug {
bool flash_dump_going;
void (*fp_ts_dbg_func)(struct himax_ts_data *ts, int start);
int (*fp_set_diag_cmd)(struct himax_ic_data *ic_data,
struct himax_report_data *hx_touch_data);
};
enum input_protocol_type {
PROTOCOL_TYPE_A = 0x00,
PROTOCOL_TYPE_B = 0x01,
};
#if defined(HX_HIGH_SENSE)
void himax_set_HSEN_func(uint8_t HSEN_enable);
#endif
#if defined(HX_SMART_WAKEUP)
void himax_set_SMWP_func(uint8_t SMWP_enable);
#define GEST_PTLG_ID_LEN (4)
#define GEST_PTLG_HDR_LEN (4)
#define GEST_PTLG_HDR_ID1 (0xCC)
#define GEST_PTLG_HDR_ID2 (0x44)
#define GEST_PT_MAX_NUM (128)
extern uint8_t *wake_event_buffer;
#endif
extern int g_mmi_refcnt;
extern int *g_inspt_crtra_flag;
extern uint32_t g_hx_chip_inited;
/*void himax_HW_reset(uint8_t loadconfig,uint8_t int_off);*/
int himax_chip_common_suspend(struct himax_ts_data *ts);
int himax_chip_common_resume(struct himax_ts_data *ts);
extern struct filename* (*kp_getname_kernel)(const char *filename);
extern struct file * (*kp_file_open_name)(struct filename *name,
int flags, umode_t mode);
struct himax_core_fp;
extern struct himax_core_fp g_core_fp;
extern struct himax_ts_data *private_ts;
extern struct himax_ic_data *ic_data;
extern struct device *g_device;
#if defined(CONFIG_TOUCHSCREEN_HIMAX_DEBUG)
int himax_debug_init(void);
int himax_debug_remove(void);
#endif
#if defined(CONFIG_TOUCHSCREEN_HIMAX_INSPECT)
extern char *g_rslt_data;
extern void (*fp_himax_self_test_init)(void);
#endif
int himax_parse_dt(struct himax_ts_data *ts,
struct himax_i2c_platform_data *pdata);
int himax_report_data(struct himax_ts_data *ts, int ts_path, int ts_status);
int himax_report_data_init(void);
int himax_dev_set(struct himax_ts_data *ts);
int himax_input_register_device(struct input_dev *input_dev);
#endif

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,164 @@
/* SPDX-License-Identifier: GPL-2.0 */
/* Himax Android Driver Sample Code for debug nodes
*
* Copyright (C) 2019 Himax Corporation.
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
* may be copied, distributed, and modified under those terms.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#ifndef H_HIMAX_DEBUG
#define H_HIMAX_DEBUG
#include "himax_platform.h"
#include "himax_common.h"
#if defined(HX_ESD_RECOVERY)
extern u8 HX_ESD_RESET_ACTIVATE;
extern int hx_EB_event_flag;
extern int hx_EC_event_flag;
extern int hx_ED_event_flag;
#endif
#define HIMAX_PROC_VENDOR_FILE "vendor"
extern struct proc_dir_entry *himax_proc_vendor_file;
#define HIMAX_PROC_PEN_POS_FILE "pen_pos"
int himax_touch_proc_init(void);
void himax_touch_proc_deinit(void);
extern int himax_int_en_set(void);
extern uint8_t byte_length;
extern uint8_t register_command[4];
extern uint8_t cfg_flag;
#define HIMAX_PROC_DIAG_FOLDER "diag"
struct proc_dir_entry *himax_proc_diag_dir;
#define HIMAX_PROC_STACK_FILE "stack"
extern struct proc_dir_entry *himax_proc_stack_file;
#define HIMAX_PROC_DELTA_FILE "delta_s"
extern struct proc_dir_entry *himax_proc_delta_file;
#define HIMAX_PROC_DC_FILE "dc_s"
extern struct proc_dir_entry *himax_proc_dc_file;
#define HIMAX_PROC_BASELINE_FILE "baseline_s"
extern struct proc_dir_entry *himax_proc_baseline_file;
#if defined(HX_TP_PROC_2T2R)
extern uint32_t *diag_mutual_2;
int32_t *getMutualBuffer_2(void);
void setMutualBuffer_2(uint8_t x_num, uint8_t y_num);
#endif
extern int32_t *diag_mutual;
extern int32_t *diag_mutual_new;
extern int32_t *diag_mutual_old;
extern uint8_t diag_max_cnt;
extern uint8_t hx_state_info[2];
extern uint8_t diag_coor[128];
extern int32_t *diag_self;
extern int32_t *diag_self_new;
extern int32_t *diag_self_old;
int32_t *getMutualBuffer(void);
int32_t *getMutualNewBuffer(void);
int32_t *getMutualOldBuffer(void);
int32_t *getSelfBuffer(void);
int32_t *getSelfNewBuffer(void);
int32_t *getSelfOldBuffer(void);
void setMutualBuffer(uint8_t x_num, uint8_t y_num);
void setMutualNewBuffer(uint8_t x_num, uint8_t y_num);
void setMutualOldBuffer(uint8_t x_num, uint8_t y_num);
uint8_t process_type;
uint8_t mode_flag;
uint8_t overflow;
#define HIMAX_PROC_DEBUG_FILE "debug"
extern struct proc_dir_entry *himax_proc_debug_file;
extern bool fw_update_complete;
extern int handshaking_result;
extern unsigned char debug_level_cmd;
extern uint8_t cmd_set[8];
extern uint8_t mutual_set_flag;
#define HIMAX_PROC_FLASH_DUMP_FILE "flash_dump"
extern struct proc_dir_entry *himax_proc_flash_dump_file;
extern int Flash_Size;
extern uint8_t *flash_buffer;
extern uint8_t g_flash_cmd;
extern uint8_t g_flash_progress;
extern bool g_flash_dump_rst; /*Fail = 0, Pass = 1*/
void setFlashBuffer(void);
enum flash_dump_prog {
START,
ONGOING,
FINISHED,
};
extern uint32_t **raw_data_array;
extern uint8_t X_NUM4;
extern uint8_t Y_NUM;
extern uint8_t sel_type;
/* Moved from debug.c */
extern struct himax_debug *debug_data;
extern unsigned char IC_CHECKSUM;
extern int i2c_error_count;
extern struct proc_dir_entry *himax_touch_proc_dir;
#if defined(HX_TP_PROC_GUEST_INFO)
extern struct hx_guest_info *g_guest_info_data;
extern char *g_guest_info_item[];
#endif
extern int himax_input_register(struct himax_ts_data *ts);
#if defined(HX_TP_PROC_2T2R)
extern bool Is_2T2R;
#endif
#if defined(HX_RST_PIN_FUNC)
extern void himax_ic_reset(uint8_t loadconfig, uint8_t int_off);
#endif
#if defined(HX_ZERO_FLASH)
extern char *i_CTPM_firmware_name;
#endif
extern uint8_t HX_PROC_SEND_FLAG;
extern struct himax_target_report_data *g_target_report_data;
extern struct himax_report_data *hx_touch_data;
extern int g_ts_dbg;
/* Moved from debug.c end */
#define BUF_SIZE 1024
#define CMD_NUM 15
char *dbg_cmd_str[] = {
"crc_test",
"fw_debug",
"attn",
"layout",
"dd_debug",
"esd_cnt",
"senseonoff",
"debug_level",
"guest_info",
"int_en",
"register",
"reset",
"diag_arr",
"diag",
NULL
};
int dbg_cmd_flag;
char *dbg_cmd_par;
ssize_t (*dbg_func_ptr_r[CMD_NUM])(char *buf, size_t len);
ssize_t (*dbg_func_ptr_w[CMD_NUM])(char *buf, size_t len);
#endif

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,58 @@
/* SPDX-License-Identifier: GPL-2.0 */
/* Himax Android Driver Sample Code for HX83102 chipset
*
* Copyright (C) 2019 Himax Corporation.
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
* may be copied, distributed, and modified under those terms.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#include "himax_platform.h"
#include "himax_common.h"
#include "himax_ic_core.h"
#include <linux/slab.h>
#define hx83102ab_fw_addr_sorting_mode_en 0x100007FC
#define hx83102ab_fw_addr_selftest_addr_en 0x100007F8
#define hx83102ab_data_adc_cfg_1 0x10007B00
#define hx83102a_data_df_rx 48
#define hx83102a_data_df_tx 24
#define hx83102a_data_df_x_res 2160
#define hx83102a_data_df_y_res 3840
#define hx83102a_data_adc_num 100
#define hx83102b_data_df_x_res 720
#define hx83102b_data_df_y_res 1280
#define hx83102b_data_adc_num 64
#define hx83102d_fw_addr_raw_out_sel 0x800204f4
#define hx83102d_zf_data_adc_cfg_1 0x10007B00
#define hx83102d_zf_data_adc_cfg_2 0x10006A00
#define hx83102d_zf_data_adc_cfg_3 0x10007500
#define hx83102d_zf_data_bor_prevent_info 0x10007268
#define hx83102d_zf_data_notch_info 0x10007300
#define hx83102d_zf_func_info_en 0x10007FD0
#define hx83102d_zf_po_sub_func 0x10005A00
#define hx83102d_zf_data_sram_start_addr 0x20000000
#define hx83102d_data_df_x_res 720
#define hx83102d_data_df_y_res 1280
#define hx83102d_adr_osc_en 0x9000009C
#define hx83102d_adr_osc_pw 0x90000280
#define hx83102d_data_adc_num 48
#define hx83102e_fw_addr_raw_out_sel 0x100072EC
#define hx83102e_ic_adr_tcon_rst 0x80020004
#define hx83102e_data_df_rx 48
#define hx83102e_data_df_tx 30
#define hx83102e_data_df_x_res 1200
#define hx83102e_data_df_y_res 1920
#define hx83102e_data_adc_num 100
#if defined(HX_ESD_RECOVERY)
extern u8 HX_ESD_RESET_ACTIVATE;
#endif

View file

@ -0,0 +1,993 @@
/* SPDX-License-Identifier: GPL-2.0 */
/* Himax Android Driver Sample Code for ic core functions
*
* Copyright (C) 2019 Himax Corporation.
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
* may be copied, distributed, and modified under those terms.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#ifndef __HIMAX_IC_CORE_H__
#define __HIMAX_IC_CORE_H__
#include "himax_platform.h"
#include "himax_common.h"
#include <linux/slab.h>
#define DATA_LEN_8 8
#define DATA_LEN_4 4
#define ADDR_LEN_4 4
#define FLASH_RW_MAX_LEN 256
#define FLASH_WRITE_BURST_SZ 8
#define PROGRAM_SZ 48
#define MAX_I2C_TRANS_SZ 128
#define HIMAX_REG_RETRY_TIMES 5
#define FW_BIN_16K_SZ 0x4000
#define HIMAX_TOUCH_DATA_SIZE 128
#define MASK_BIT_0 0x01
#define MASK_BIT_1 0x02
#define MASK_BIT_2 0x04
#define FW_SECTOR_PER_BLOCK 8
#define FW_PAGE_PER_SECTOR 64
#define FW_PAGE_SEZE 128
#define HX256B 0x100
#define HX1K 0x400
#define HX4K 0x1000
#define HX_32K_SZ 0x8000
#define HX_40K_SZ 0xA000
#define HX_48K_SZ 0xC000
#define HX64K 0x10000
#define HX124K 0x1f000
#define HX4000K 0x1000000
#define HX_NORMAL_MODE 1
#define HX_SORTING_MODE 2
#define HX_CHANGE_MODE_FAIL (-1)
#define HX_RW_REG_FAIL (-1)
#define HX_DRIVER_MAX_IC_NUM 12
#if defined(__HIMAX_HX852xG_MOD__)
#define HX_MOD_KSYM_HX852xG HX_MOD_KSYM_HX852xG
#endif
#if defined(__HIMAX_HX852xH_MOD__)
#define HX_MOD_KSYM_HX852xH HX_MOD_KSYM_HX852xH
#endif
#if defined(__HIMAX_HX83102_MOD__)
#define HX_MOD_KSYM_HX83102 HX_MOD_KSYM_HX83102
#endif
#if defined(__HIMAX_HX83103_MOD__)
#define HX_MOD_KSYM_HX83103 HX_MOD_KSYM_HX83103
#endif
#if defined(__HIMAX_HX83106_MOD__)
#define HX_MOD_KSYM_HX83106 HX_MOD_KSYM_HX83106
#endif
#if defined(__HIMAX_HX83111_MOD__)
#define HX_MOD_KSYM_HX83111 HX_MOD_KSYM_HX83111
#endif
#if defined(__HIMAX_HX83112_MOD__)
#define HX_MOD_KSYM_HX83112 HX_MOD_KSYM_HX83112
#endif
#if defined(__HIMAX_HX83191_MOD__)
#define HX_MOD_KSYM_HX83191 HX_MOD_KSYM_HX83191
#endif
#if defined(__HIMAX_HX83192_MOD__)
#define HX_MOD_KSYM_HX83192 HX_MOD_KSYM_HX83192
#endif
#if defined(__HIMAX_HX83113_MOD__)
#define HX_MOD_KSYM_HX83113 HX_MOD_KSYM_HX83113
#endif
/* CORE_INIT */
/* CORE_IC */
/* CORE_FW */
/* CORE_FLASH */
/* CORE_SRAM */
/* CORE_DRIVER */
#define HX_0F_DEBUG
#if defined(CONFIG_TOUCHSCREEN_HIMAX_INCELL)
#if defined(HX_AUTO_UPDATE_FW) || defined(HX_ZERO_FLASH)
extern char *i_CTPM_firmware_name;
#endif
#if defined(HX_ZERO_FLASH)
extern int g_f_0f_updat;
#endif
#if defined(HX_TP_PROC_GUEST_INFO)
extern struct hx_guest_info *g_guest_info_data;
#endif
void himax_mcu_in_cmd_struct_free(void);
#endif
#if defined(CONFIG_TOUCHSCREEN_HIMAX_ONCELL)
void himax_mcu_on_cmd_struct_free(void);
#endif
#if defined(HX_AUTO_UPDATE_FW)
extern int g_i_FW_VER;
extern int g_i_CFG_VER;
extern int g_i_CID_MAJ;
extern int g_i_CID_MIN;
extern unsigned char *i_CTPM_FW;
#endif
extern unsigned long FW_VER_MAJ_FLASH_ADDR;
extern unsigned long FW_VER_MIN_FLASH_ADDR;
extern unsigned long CFG_VER_MAJ_FLASH_ADDR;
extern unsigned long CFG_VER_MIN_FLASH_ADDR;
extern unsigned long CID_VER_MAJ_FLASH_ADDR;
extern unsigned long CID_VER_MIN_FLASH_ADDR;
extern unsigned long FW_VER_MAJ_FLASH_LENG;
extern unsigned long FW_VER_MIN_FLASH_LENG;
extern unsigned long CFG_VER_MAJ_FLASH_LENG;
extern unsigned long CFG_VER_MIN_FLASH_LENG;
extern unsigned long CID_VER_MAJ_FLASH_LENG;
extern unsigned long CID_VER_MIN_FLASH_LENG;
extern unsigned char IC_CHECKSUM;
#if defined(HX_ESD_RECOVERY)
extern int g_zero_event_count;
#endif
#if defined(HX_RST_PIN_FUNC)
extern u8 HX_HW_RESET_ACTIVATE;
void himax_rst_gpio_set(int pinnum, uint8_t value);
#endif
#if defined(HX_USB_DETECT_GLOBAL)
void himax_cable_detect_func(bool force_renew);
#endif
int himax_report_data_init(void);
extern int i2c_error_count;
#if defined(HX_ESD_RECOVERY)
extern u8 HX_ESD_RESET_ACTIVATE;
#endif
/* CORE_INIT */
int himax_mcu_in_cmd_struct_init(void);
void himax_mcu_in_cmd_init(void);
int himax_mcu_on_cmd_struct_init(void);
void himax_mcu_on_cmd_init(void);
void himax_parse_assign_cmd(uint32_t addr, uint8_t *cmd, int len);
extern void (*himax_mcu_cmd_struct_free)(void);
/* CORE_INIT */
#if defined(HX_TP_PROC_GUEST_INFO)
#define HX_GUEST_INFO_FLASH_SADDR 0x20000
#define HX_GUEST_INFO_SIZE 10
#define HX_GUEST_INFO_LEN_SIZE 4
#define HX_GUEST_INFO_ID_SIZE 4
struct hx_guest_info {
int g_guest_info_ongoing; /* 0 stop, 1 ongoing */
uint8_t g_guest_str[10][128];
uint8_t g_guest_str_in_format[10][128];
uint8_t g_guest_data_type[10];
int g_guest_data_len[10];
int g_guest_info_type;
};
#endif
/* CORE_IC */
#define ic_adr_ahb_addr_byte_0 0x00
#define ic_adr_ahb_rdata_byte_0 0x08
#define ic_adr_ahb_access_direction 0x0c
#define ic_adr_conti 0x13
#define ic_adr_incr4 0x0D
#define ic_adr_i2c_psw_lb 0x31
#define ic_adr_i2c_psw_ub 0x32
#define ic_cmd_ahb_access_direction_read 0x00
#define ic_cmd_conti 0x31
#define ic_cmd_incr4 0x10
#define ic_cmd_i2c_psw_lb 0x27
#define ic_cmd_i2c_psw_ub 0x95
#define ic_adr_tcon_on_rst 0x80020020
#define ic_addr_adc_on_rst 0x80020094
#define ic_adr_psl 0x900000A0
#define ic_adr_cs_central_state 0x900000A8
#define ic_cmd_rst 0x00000000
#define ic_adr_osc_en 0x900880A8
#define ic_adr_osc_pw 0x900880E0
#define on_ic_adr_ahb_addr_byte_0 0x00
#define on_ic_adr_ahb_rdata_byte_0 0x08
#define on_ic_adr_ahb_access_direction 0x0c
#define on_ic_adr_conti 0x13
#define on_ic_adr_incr4 0x0D
#define on_ic_cmd_ahb_access_direction_read 0x00
#define on_ic_cmd_conti 0x31
#define on_ic_cmd_incr4 0x10
#define on_ic_adr_mcu_ctrl 0x82
#define on_ic_cmd_mcu_on 0x25
#define on_ic_cmd_mcu_off 0xDA
#define on_ic_adr_sleep_ctrl 0x99
#define on_ic_cmd_sleep_in 0x80
#define on_ic_adr_tcon_ctrl 0x80020000
#define on_ic_cmd_tcon_on 0x00000000
#define on_ic_adr_wdg_ctrl 0x9000800C
#define on_ic_cmd_wdg_psw 0x0000AC53
#define on_ic_adr_wdg_cnt_ctrl 0x90008010
#define on_ic_cmd_wdg_cnt_clr 0x000035CA
/* CORE_IC */
/* CORE_FW */
#define fw_addr_system_reset 0x90000018
#define fw_addr_safe_mode_release_pw 0x90000098
#define fw_addr_ctrl_fw 0x9000005c
#define fw_addr_flag_reset_event 0x900000e4
#define fw_addr_hsen_enable 0x10007F14
#define fw_addr_smwp_enable 0x10007F10
#define fw_usb_detect_addr 0x10007F38
#define fw_addr_program_reload_from 0x00000000
#define fw_addr_program_reload_to 0x08000000
#define fw_addr_program_reload_page_write 0x0000fb00
#define fw_addr_raw_out_sel 0x800204b4
#define fw_addr_reload_status 0x80050000
#define fw_addr_reload_crc32_result 0x80050018
#define fw_addr_reload_addr_from 0x80050020
#define fw_addr_reload_addr_cmd_beat 0x80050028
#define fw_data_system_reset 0x00000055
#define fw_data_safe_mode_release_pw_active 0x00000053
#define fw_data_safe_mode_release_pw_reset 0x00000000
#define fw_data_clear 0x00000000
#define fw_data_fw_stop 0x000000A5
#define fw_data_program_reload_start 0x0A3C3000
#define fw_data_program_reload_compare 0x04663000
#define fw_data_program_reload_break 0x15E75678
#define fw_addr_selftest_addr_en 0x10007F18
#define fw_addr_selftest_result_addr 0x10007f24
#define fw_data_selftest_request 0x00006AA6
#define fw_addr_criteria_addr 0x10007f1c
#define fw_data_criteria_aa_top 0x64
#define fw_data_criteria_aa_bot 0x00
#define fw_data_criteria_key_top 0x64
#define fw_data_criteria_key_bot 0x00
#define fw_data_criteria_avg_top 0x64
#define fw_data_criteria_avg_bot 0x00
#define fw_addr_set_frame_addr 0x10007294
#define fw_data_set_frame 0x0000000A
#define fw_data_selftest_ack_hb 0xa6
#define fw_data_selftest_ack_lb 0x6a
#define fw_data_selftest_pass 0xaa
#define fw_data_normal_cmd 0x00
#define fw_data_normal_status 0x99
#define fw_data_sorting_cmd 0xaa
#define fw_data_sorting_status 0xcc
#define fw_data_idle_dis_pwd 0x17
#define fw_data_idle_en_pwd 0x1f
#define fw_addr_sorting_mode_en 0x10007f04
#define fw_addr_fw_mode_status 0x10007088
#define fw_addr_icid_addr 0x900000d0
#define fw_addr_fw_ver_addr 0x10007004
#define fw_addr_fw_cfg_addr 0x10007084
#define fw_addr_fw_vendor_addr 0x10007000
#define fw_addr_cus_info 0x10007008
#define fw_addr_proj_info 0x10007014
#define fw_addr_fw_state_addr 0x900000f8
#define fw_addr_fw_dbg_msg_addr 0x10007f40
#define fw_addr_chk_fw_status 0x900000a8
#define fw_addr_dd_handshak_addr 0x900000fc
#define fw_addr_dd_data_addr 0x10007f80
#define fw_data_dd_request 0xaa
#define fw_data_dd_ack 0xbb
#define fw_data_rawdata_ready_hb 0xa3
#define fw_data_rawdata_ready_lb 0x3a
#define fw_addr_ahb_addr 0x11
#define fw_data_ahb_dis 0x00
#define fw_data_ahb_en 0x01
#define fw_addr_event_addr 0x30
#define fw_func_handshaking_pwd 0xA55AA55A
#define fw_func_handshaking_end 0x77887788
#define fw_addr_ulpm_33 0x33
#define fw_addr_ulpm_34 0x34
#define fw_data_ulpm_11 0x11
#define fw_data_ulpm_22 0x22
#define fw_data_ulpm_33 0x33
#define fw_data_ulpm_aa 0xAA
#define on_fw_addr_smwp_enable 0xA2
#define on_fw_usb_detect_addr 0xA4
#define on_fw_addr_program_reload_from 0x00000000
#define on_fw_addr_raw_out_sel 0x98
#define on_fw_addr_flash_checksum 0x80000044
#define on_fw_data_flash_checksum 0x00000491
#define on_fw_addr_crc_value 0x80000050
#define on_fw_data_safe_mode_release_pw_active 0x00000053
#define on_fw_data_safe_mode_release_pw_reset 0x00000000
#define on_fw_addr_criteria_addr 0x9A
#define on_fw_data_selftest_pass 0xaa
#define on_fw_addr_reK_crtl 0x8000000C
#define on_fw_data_reK_en 0x02
#define on_fw_data_reK_dis 0xFD
#define on_fw_data_rst_init 0xF0
#define on_fw_data_dc_set 0x02
#define on_fw_data_bank_set 0x03
#define on_fw_addr_selftest_addr_en 0x98
#define on_fw_addr_selftest_result_addr 0x9B
#define on_fw_data_selftest_request 0x06
#define on_fw_data_thx_avg_mul_dc_lsb 0x22
#define on_fw_data_thx_avg_mul_dc_msb 0x0B
#define on_fw_data_thx_mul_dc_up_low_bud 0x64
#define on_fw_data_thx_avg_slf_dc_lsb 0x14
#define on_fw_data_thx_avg_slf_dc_msb 0x05
#define on_fw_data_thx_slf_dc_up_low_bud 0x64
#define on_fw_data_thx_slf_bank_up 0x40
#define on_fw_data_thx_slf_bank_low 0x00
#define on_fw_data_idle_dis_pwd 0x40
#define on_fw_data_idle_en_pwd 0x00
#define on_fw_addr_fw_mode_status 0x99
#define on_fw_addr_icid_addr 0x900000d0
#define on_fw_addr_fw_ver_start 0x90
#define on_fw_data_rawdata_ready_hb 0xa3
#define on_fw_data_rawdata_ready_lb 0x3a
#define on_fw_addr_ahb_addr 0x11
#define on_fw_data_ahb_dis 0x00
#define on_fw_data_ahb_en 0x01
#define on_fw_addr_event_addr 0x30
/* CORE_FW */
/* CORE_FLASH */
#define flash_addr_ctrl_base 0x80000000
#define flash_addr_spi200_trans_fmt (flash_addr_ctrl_base + 0x10)
#define flash_addr_spi200_trans_ctrl (flash_addr_ctrl_base + 0x20)
#define flash_addr_spi200_cmd (flash_addr_ctrl_base + 0x24)
#define flash_addr_spi200_addr (flash_addr_ctrl_base + 0x28)
#define flash_addr_spi200_data (flash_addr_ctrl_base + 0x2c)
#define flash_addr_spi200_fifo_rst (flash_addr_ctrl_base + 0x30)
#define flash_addr_spi200_rst_status (flash_addr_ctrl_base + 0x34)
#define flash_addr_spi200_flash_speed (flash_addr_ctrl_base + 0x40)
#define flash_addr_spi200_bt_num (flash_addr_ctrl_base + 0xe8)
#define flash_data_spi200_txfifo_rst 0x00000004
#define flash_data_spi200_rxfifo_rst 0x00000002
#define flash_data_spi200_trans_fmt 0x00020780
#define flash_data_spi200_trans_ctrl_1 0x42000003
#define flash_data_spi200_trans_ctrl_2 0x47000000
#define flash_data_spi200_trans_ctrl_3 0x67000000
#define flash_data_spi200_trans_ctrl_4 0x610ff000
#define flash_data_spi200_trans_ctrl_5 0x694002ff
#define flash_data_spi200_trans_ctrl_6 0x42000000
#define flash_data_spi200_trans_ctrl_7 0x6940020f
#define flash_data_spi200_cmd_1 0x00000005
#define flash_data_spi200_cmd_2 0x00000006
#define flash_data_spi200_cmd_3 0x000000C7
#define flash_data_spi200_cmd_4 0x000000D8
#define flash_data_spi200_cmd_5 0x00000020
#define flash_data_spi200_cmd_6 0x00000002
#define flash_data_spi200_cmd_7 0x0000003b
#define flash_data_spi200_cmd_8 0x00000003
#define flash_data_spi200_addr 0x00000000
#define on_flash_addr_ctrl_base 0x80000000
#define on_flash_addr_ctrl_auto 0x80000004
#define on_flash_data_main_erase 0x0000A50D
#define on_flash_data_auto 0xA5
#define on_flash_data_main_read 0x03
#define on_flash_data_page_write 0x05
#define on_flash_data_spp_read 0x10
#define on_flash_data_sfr_read 0x14
#define on_flash_addr_ahb_ctrl 0x80000020
#define on_flash_data_ahb_squit 0x00000001
#define on_flash_addr_unlock_0 0x00000000
#define on_flash_addr_unlock_4 0x00000004
#define on_flash_addr_unlock_8 0x00000008
#define on_flash_addr_unlock_c 0x0000000C
#define on_flash_data_cmd0 0x28178EA0
#define on_flash_data_cmd1 0x0A0E03FF
#define on_flash_data_cmd2 0x8C203D0C
#define on_flash_data_cmd3 0x00300263
#define on_flash_data_lock 0x03400000
/* CORE_FLASH */
/* CORE_SRAM */
#define sram_adr_mkey 0x100070E8
#define sram_adr_rawdata_addr 0x10000000
#define sram_adr_rawdata_end 0x00000000
#define sram_passwrd_start 0x5AA5
#define sram_passwrd_end 0xA55A
#define on_sram_adr_rawdata_addr 0x080002E0
#define on_sram_adr_rawdata_end 0x00000000
#define on_sram_cmd_conti 0x44332211
#define on_sram_cmd_fin 0x00000000
#define on_sram_passwrd_start 0x5AA5
#define on_sram_passwrd_end 0xA55A
/* CORE_SRAM */
/* CORE_DRIVER */
#define driver_addr_fw_define_flash_reload 0x10007f00
#define driver_addr_fw_define_2nd_flash_reload 0x100072c0
#define driver_data_fw_define_flash_reload_dis 0x0000a55a
#define driver_data_fw_define_flash_reload_en 0x00000000
#define driver_addr_fw_define_int_is_edge 0x10007088
#define driver_addr_fw_define_rxnum_txnum_maxpt 0x100070f4
#define driver_data_fw_define_rxnum_txnum_maxpt_sorting 0x00000008
#define driver_data_fw_define_rxnum_txnum_maxpt_normal 0x00000014
#define driver_addr_fw_define_xy_res_enable 0x100070f8
#define driver_addr_fw_define_x_y_res 0x100070fc
#define driver_data_df_rx 36
#define driver_data_df_tx 18
#define driver_data_df_pt 10
#define driver_data_df_x_res 1080
#define driver_data_df_y_res 1920
#define on_driver_addr_fw_define_int_is_edge 0x10007088
#define on_driver_data_df_rx 28
#define on_driver_data_df_tx 14
#define on_driver_data_df_pt 10
#define on_driver_data_df_x_res 1080
#define on_driver_data_df_y_res 1920
#if !defined(HX_NEW_EVENT_STACK_FORMAT)
#define on_driver_addr_fw_rx_tx_maxpt_num 0x0800001C
#define on_driver_addr_fw_xy_rev_int_edge 0x0800000C
#define on_driver_addr_fw_define_x_y_res 0x08000030
#else
#define on_driver_addr_fw_rx_tx_maxpt_num 0x08000004
#define on_driver_addr_fw_maxpt_bt_num 0x0800000C
#define on_driver_addr_fw_xy_rev_int_edge 0x08000110
#define on_driver_addr_fw_define_x_y_res 0x08000010
#endif
/* CORE_DRIVER */
#if defined(HX_ZERO_FLASH)
#define zf_data_dis_flash_reload 0x00009AA9
#define zf_addr_system_reset 0x90000018
#define zf_data_system_reset 0x00000055
#define zf_data_sram_start_addr 0x08000000
#define zf_data_cfg_info 0x10007000
#define zf_data_fw_cfg_1 0x10007084
#define zf_data_fw_cfg_2 0x10007264
#define zf_data_fw_cfg_3 0x10007300
#define zf_data_adc_cfg_1 0x10006A00
#define zf_data_adc_cfg_2 0x10007B28
#define zf_data_adc_cfg_3 0x10007AF0
#define zf_data_map_table 0x10007500
/* #define zf_data_mode_switch 0x10007294*/
#define zf_addr_sts_chk 0x900000A8
#define zf_data_activ_sts 0x05
#define zf_addr_activ_relod 0x90000048
#define zf_data_activ_in 0xEC
#if defined(HX_CODE_OVERLAY)
#define ovl_section_num 3
#define ovl_gesture_request 0x11
#define ovl_gesture_reply 0x22
#define ovl_border_request 0x55
#define ovl_border_reply 0x66
#define ovl_sorting_request 0x99
#define ovl_sorting_reply 0xAA
#define ovl_fault 0xFF
#endif
struct zf_info {
uint8_t sram_addr[4];
int write_size;
uint32_t fw_addr;
uint32_t cfg_addr;
};
#endif
struct ic_operation {
uint8_t addr_ahb_addr_byte_0[1];
uint8_t addr_ahb_rdata_byte_0[1];
uint8_t addr_ahb_access_direction[1];
uint8_t addr_conti[1];
uint8_t addr_incr4[1];
uint8_t adr_i2c_psw_lb[1];
uint8_t adr_i2c_psw_ub[1];
uint8_t data_ahb_access_direction_read[1];
uint8_t data_conti[1];
uint8_t data_incr4[1];
uint8_t data_i2c_psw_lb[1];
uint8_t data_i2c_psw_ub[1];
uint8_t addr_tcon_on_rst[4];
uint8_t addr_adc_on_rst[4];
uint8_t addr_psl[4];
uint8_t addr_cs_central_state[4];
uint8_t data_rst[4];
uint8_t adr_osc_en[4];
uint8_t adr_osc_pw[4];
};
struct fw_operation {
uint8_t addr_system_reset[4];
uint8_t addr_safe_mode_release_pw[4];
uint8_t addr_ctrl_fw_isr[4];
uint8_t addr_flag_reset_event[4];
uint8_t addr_hsen_enable[4];
uint8_t addr_smwp_enable[4];
uint8_t addr_program_reload_from[4];
uint8_t addr_program_reload_to[4];
uint8_t addr_program_reload_page_write[4];
uint8_t addr_raw_out_sel[4];
uint8_t addr_reload_status[4];
uint8_t addr_reload_crc32_result[4];
uint8_t addr_reload_addr_from[4];
uint8_t addr_reload_addr_cmd_beat[4];
uint8_t addr_selftest_addr_en[4];
uint8_t addr_criteria_addr[4];
uint8_t addr_set_frame_addr[4];
uint8_t addr_selftest_result_addr[4];
uint8_t addr_sorting_mode_en[4];
uint8_t addr_fw_mode_status[4];
uint8_t addr_icid_addr[4];
uint8_t addr_fw_ver_addr[4];
uint8_t addr_fw_cfg_addr[4];
uint8_t addr_fw_vendor_addr[4];
uint8_t addr_cus_info[4];
uint8_t addr_proj_info[4];
uint8_t addr_fw_state_addr[4];
uint8_t addr_fw_dbg_msg_addr[4];
uint8_t addr_chk_fw_status[4];
uint8_t addr_dd_handshak_addr[4];
uint8_t addr_dd_data_addr[4];
uint8_t data_system_reset[4];
uint8_t data_safe_mode_release_pw_active[4];
uint8_t data_safe_mode_release_pw_reset[4];
uint8_t data_clear[4];
uint8_t data_fw_stop[4];
uint8_t data_program_reload_start[4];
uint8_t data_program_reload_compare[4];
uint8_t data_program_reload_break[4];
uint8_t data_selftest_request[4];
uint8_t data_criteria_aa_top[1];
uint8_t data_criteria_aa_bot[1];
uint8_t data_criteria_key_top[1];
uint8_t data_criteria_key_bot[1];
uint8_t data_criteria_avg_top[1];
uint8_t data_criteria_avg_bot[1];
uint8_t data_set_frame[4];
uint8_t data_selftest_ack_hb[1];
uint8_t data_selftest_ack_lb[1];
uint8_t data_selftest_pass[1];
uint8_t data_normal_cmd[1];
uint8_t data_normal_status[1];
uint8_t data_sorting_cmd[1];
uint8_t data_sorting_status[1];
uint8_t data_dd_request[1];
uint8_t data_dd_ack[1];
uint8_t data_idle_dis_pwd[1];
uint8_t data_idle_en_pwd[1];
uint8_t data_rawdata_ready_hb[1];
uint8_t data_rawdata_ready_lb[1];
uint8_t addr_ahb_addr[1];
uint8_t data_ahb_dis[1];
uint8_t data_ahb_en[1];
uint8_t addr_event_addr[1];
uint8_t addr_usb_detect[4];
uint8_t addr_ulpm_33[1];
uint8_t addr_ulpm_34[1];
uint8_t data_ulpm_11[1];
uint8_t data_ulpm_22[1];
uint8_t data_ulpm_33[1];
uint8_t data_ulpm_aa[1];
};
struct flash_operation {
uint8_t addr_spi200_trans_fmt[4];
uint8_t addr_spi200_trans_ctrl[4];
uint8_t addr_spi200_fifo_rst[4];
uint8_t addr_spi200_rst_status[4];
uint8_t addr_spi200_flash_speed[4];
uint8_t addr_spi200_cmd[4];
uint8_t addr_spi200_addr[4];
uint8_t addr_spi200_data[4];
uint8_t addr_spi200_bt_num[4];
uint8_t data_spi200_txfifo_rst[4];
uint8_t data_spi200_rxfifo_rst[4];
uint8_t data_spi200_trans_fmt[4];
uint8_t data_spi200_trans_ctrl_1[4];
uint8_t data_spi200_trans_ctrl_2[4];
uint8_t data_spi200_trans_ctrl_3[4];
uint8_t data_spi200_trans_ctrl_4[4];
uint8_t data_spi200_trans_ctrl_5[4];
uint8_t data_spi200_trans_ctrl_6[4];
uint8_t data_spi200_trans_ctrl_7[4];
uint8_t data_spi200_cmd_1[4];
uint8_t data_spi200_cmd_2[4];
uint8_t data_spi200_cmd_3[4];
uint8_t data_spi200_cmd_4[4];
uint8_t data_spi200_cmd_5[4];
uint8_t data_spi200_cmd_6[4];
uint8_t data_spi200_cmd_7[4];
uint8_t data_spi200_cmd_8[4];
uint8_t data_spi200_addr[4];
};
struct sram_operation {
uint8_t addr_mkey[4];
uint8_t addr_rawdata_addr[4];
uint8_t addr_rawdata_end[4];
uint8_t passwrd_start[2];
uint8_t passwrd_end[2];
};
struct driver_operation {
uint8_t addr_fw_define_flash_reload[4];
uint8_t addr_fw_define_2nd_flash_reload[4];
uint8_t addr_fw_define_int_is_edge[4];
uint8_t addr_fw_define_rxnum_txnum_maxpt[4];
uint8_t addr_fw_define_xy_res_enable[4];
uint8_t addr_fw_define_x_y_res[4];
uint8_t data_df_rx[1];
uint8_t data_df_tx[1];
uint8_t data_df_pt[1];
uint8_t data_df_x_res[2];
uint8_t data_df_y_res[2];
uint8_t data_fw_define_flash_reload_dis[4];
uint8_t data_fw_define_flash_reload_en[4];
uint8_t data_fw_define_rxnum_txnum_maxpt_sorting[4];
uint8_t data_fw_define_rxnum_txnum_maxpt_normal[4];
};
struct zf_operation {
uint8_t data_dis_flash_reload[4];
uint8_t addr_system_reset[4];
uint8_t data_system_reset[4];
uint8_t data_sram_start_addr[4];
uint8_t data_sram_clean[4];
uint8_t data_cfg_info[4];
uint8_t data_fw_cfg_1[4];
uint8_t data_fw_cfg_2[4];
uint8_t data_fw_cfg_3[4];
uint8_t data_adc_cfg_1[4];
uint8_t data_adc_cfg_2[4];
uint8_t data_adc_cfg_3[4];
uint8_t data_map_table[4];
/* uint8_t data_mode_switch[4];*/
uint8_t addr_sts_chk[4];
uint8_t data_activ_sts[1];
uint8_t addr_activ_relod[4];
uint8_t data_activ_in[1];
};
struct himax_core_command_operation {
struct ic_operation *ic_op;
struct fw_operation *fw_op;
struct flash_operation *flash_op;
struct sram_operation *sram_op;
struct driver_operation *driver_op;
struct zf_operation *zf_op;
};
struct on_ic_operation {
uint8_t addr_ahb_addr_byte_0[1];
uint8_t addr_ahb_rdata_byte_0[1];
uint8_t addr_ahb_access_direction[1];
uint8_t addr_conti[1];
uint8_t addr_incr4[1];
uint8_t adr_mcu_ctrl[1];
uint8_t data_ahb_access_direction_read[1];
uint8_t data_conti[1];
uint8_t data_incr4[1];
uint8_t cmd_mcu_on[1];
uint8_t cmd_mcu_off[1];
uint8_t adr_sleep_ctrl[1];
uint8_t cmd_sleep_in[1];
uint8_t adr_tcon_ctrl[4];
uint8_t cmd_tcon_on[4];
uint8_t adr_wdg_ctrl[4];
uint8_t cmd_wdg_psw[4];
uint8_t adr_wdg_cnt_ctrl[4];
uint8_t cmd_wdg_cnt_clr[4];
};
struct on_fw_operation {
uint8_t addr_smwp_enable[1];
uint8_t addr_program_reload_from[4];
uint8_t addr_raw_out_sel[1];
uint8_t addr_flash_checksum[4];
uint8_t data_flash_checksum[4];
uint8_t addr_crc_value[4];
uint8_t addr_reload_status[4];
uint8_t addr_reload_crc32_result[4];
uint8_t addr_reload_addr_from[4];
uint8_t addr_reload_addr_cmd_beat[4];
uint8_t addr_set_frame_addr[4];
uint8_t addr_fw_mode_status[1];
uint8_t addr_icid_addr[4];
uint8_t addr_fw_ver_start[1];
uint8_t data_safe_mode_release_pw_active[4];
uint8_t data_safe_mode_release_pw_reset[4];
uint8_t data_clear[4];
uint8_t addr_criteria_addr[1];
uint8_t data_selftest_pass[1];
uint8_t addr_reK_crtl[4];
uint8_t data_reK_en[1];
uint8_t data_reK_dis[1];
uint8_t data_rst_init[1];
uint8_t data_dc_set[1];
uint8_t data_bank_set[1];
uint8_t addr_selftest_addr_en[1];
uint8_t addr_selftest_result_addr[1];
uint8_t data_selftest_request[1];
uint8_t data_thx_avg_mul_dc_lsb[1];
uint8_t data_thx_avg_mul_dc_msb[1];
uint8_t data_thx_mul_dc_up_low_bud[1];
uint8_t data_thx_avg_slf_dc_lsb[1];
uint8_t data_thx_avg_slf_dc_msb[1];
uint8_t data_thx_slf_dc_up_low_bud[1];
uint8_t data_thx_slf_bank_up[1];
uint8_t data_thx_slf_bank_low[1];
uint8_t data_idle_dis_pwd[1];
uint8_t data_idle_en_pwd[1];
uint8_t data_rawdata_ready_hb[1];
uint8_t data_rawdata_ready_lb[1];
uint8_t addr_ahb_addr[1];
uint8_t data_ahb_dis[1];
uint8_t data_ahb_en[1];
uint8_t addr_event_addr[1];
uint8_t addr_usb_detect[1];
};
struct on_flash_operation {
uint8_t addr_ctrl_base[4];
uint8_t addr_ctrl_auto[4];
uint8_t data_main_erase[4];
uint8_t data_auto[1];
uint8_t data_main_read[1];
uint8_t data_page_write[1];
uint8_t data_sfr_read[1];
uint8_t data_spp_read[1];
uint8_t addr_ahb_ctrl[4];
uint8_t data_ahb_squit[4];
uint8_t addr_unlock_0[4];
uint8_t addr_unlock_4[4];
uint8_t addr_unlock_8[4];
uint8_t addr_unlock_c[4];
uint8_t data_cmd0[4];
uint8_t data_cmd1[4];
uint8_t data_cmd2[4];
uint8_t data_cmd3[4];
uint8_t data_lock[4];
};
struct on_sram_operation {
uint8_t addr_rawdata_addr[4];
uint8_t addr_rawdata_end[4];
uint8_t data_conti[4];
uint8_t data_fin[4];
uint8_t passwrd_start[2];
uint8_t passwrd_end[2];
};
struct on_driver_operation {
uint8_t addr_fw_define_int_is_edge[4];
uint8_t addr_fw_rx_tx_maxpt_num[4];
#if defined(HX_NEW_EVENT_STACK_FORMAT)
uint8_t addr_fw_maxpt_bt_num[4];
#endif
uint8_t addr_fw_xy_rev_int_edge[4];
uint8_t addr_fw_define_x_y_res[4];
uint8_t data_fw_define_rxnum_txnum_maxpt_sorting[4];
uint8_t data_fw_define_rxnum_txnum_maxpt_normal[4];
uint8_t data_df_rx[1];
uint8_t data_df_tx[1];
uint8_t data_df_pt[1];
uint8_t data_df_x_res[2];
uint8_t data_df_y_res[2];
};
struct himax_on_core_command_operation {
struct on_ic_operation *ic_op;
struct on_fw_operation *fw_op;
struct on_flash_operation *flash_op;
struct on_sram_operation *sram_op;
struct on_driver_operation *driver_op;
};
struct himax_chip_detect {
bool (*fp_chip_detect)(void);
};
struct himax_chip_entry {
struct himax_chip_detect *core_chip_dt;
uint32_t hx_ic_dt_num;
};
struct himax_core_fp {
/* CORE_IC */
void (*fp_burst_enable)(uint8_t auto_add_4_byte);
int (*fp_register_read)(uint8_t *read_addr, uint32_t read_length,
uint8_t *read_data, uint8_t cfg_flag);
/*int (*fp_flash_write_burst)(uint8_t *reg_byte, uint8_t *write_data);*/
/*void (*fp_flash_write_burst_lenth)(uint8_t *reg_byte,
* uint8_t *write_data, uint32_t length);
*/
int (*fp_register_write)(uint8_t *write_addr, uint32_t write_length,
uint8_t *write_data, uint8_t cfg_flag);
void (*fp_interface_on)(void);
void (*fp_sense_on)(uint8_t FlashMode);
void (*fp_tcon_on)(void);
bool (*fp_watch_dog_off)(void);
bool (*fp_sense_off)(bool check_en);
void (*fp_sleep_in)(void);
bool (*fp_wait_wip)(int Timing);
void (*fp_init_psl)(void);
void (*fp_resume_ic_action)(void);
void (*fp_suspend_ic_action)(void);
void (*fp_power_on_init)(void);
bool (*fp_dd_clk_set)(bool enable);
void (*fp_dd_reg_en)(bool enable);
bool (*fp_dd_reg_write)(uint8_t addr, uint8_t pa_num, int len,
uint8_t *data, uint8_t bank);
bool (*fp_dd_reg_read)(uint8_t addr, uint8_t pa_num, int len,
uint8_t *data, uint8_t bank);
bool (*fp_ic_id_read)(void);
bool (*fp_slave_tcon_reset)(void);
bool (*fp_slave_adc_reset_slave)(void);
bool (*fp_slave_wdt_off_slave)(void);
/* CORE_IC */
/* CORE_FW */
void (*fp_parse_raw_data)(struct himax_report_data *hx_touch_data,
int mul_num,
int self_num,
uint8_t diag_cmd,
int16_t *mutual_data,
int16_t *self_data);
void (*fp_system_reset)(void);
int (*fp_Calculate_CRC_with_AP)(unsigned char *FW_content,
int CRC_from_FW,
int len);
uint32_t (*fp_check_CRC)(uint8_t *start_addr, int reload_length);
void (*fp_set_reload_cmd)(uint8_t *write_data,
int idx,
uint32_t cmd_from,
uint32_t cmd_to,
uint32_t cmd_beat);
bool (*fp_program_reload)(void);
void (*fp_set_SMWP_enable)(uint8_t SMWP_enable, bool suspended);
void (*fp_set_HSEN_enable)(uint8_t HSEN_enable, bool suspended);
void (*fp_diag_register_set)(uint8_t diag_command,
uint8_t storage_type, bool is_dirly);
#if defined(HX_TP_SELF_TEST_DRIVER)
void (*fp_control_reK)(bool enable);
#endif
int (*fp_chip_self_test)(struct seq_file *s, void *v);
void (*fp_idle_mode)(int disable);
void (*fp_reload_disable)(int disable);
bool (*fp_check_chip_version)(void);
int (*fp_read_ic_trigger_type)(void);
int (*fp_read_i2c_status)(void);
void (*fp_read_FW_ver)(void);
bool (*fp_read_event_stack)(uint8_t *buf, uint8_t length);
void (*fp_return_event_stack)(void);
bool (*fp_calculateChecksum)(bool change_iref, uint32_t size);
int (*fp_read_FW_status)(uint8_t *state_addr, uint8_t *tmp_addr);
void (*fp_irq_switch)(int switch_on);
int (*fp_assign_sorting_mode)(uint8_t *tmp_data);
int (*fp_check_sorting_mode)(uint8_t *tmp_data);
int (*fp_get_max_dc)(void);
uint8_t (*fp_read_DD_status)(uint8_t *cmd_set, uint8_t *tmp_data);
int (*fp_ulpm_in)(void);
int (*fp_black_gest_ctrl)(bool enable);
int (*_diff_overlay_bin)(void);
/* CORE_FW */
/* CORE_FLASH */
void (*fp_chip_erase)(void);
bool (*fp_block_erase)(int start_addr, int length);
bool (*fp_sector_erase)(int start_addr);
void (*fp_flash_programming)(uint8_t *FW_content, int FW_Size);
void (*fp_flash_page_write)(uint8_t *write_addr, int length,
uint8_t *write_data);
int (*fp_fts_ctpm_fw_upgrade_with_sys_fs_32k)(unsigned char *fw,
int len, bool change_iref);
int (*fp_fts_ctpm_fw_upgrade_with_sys_fs_60k)(unsigned char *fw,
int len, bool change_iref);
int (*fp_fts_ctpm_fw_upgrade_with_sys_fs_64k)(unsigned char *fw,
int len, bool change_iref);
int (*fp_fts_ctpm_fw_upgrade_with_sys_fs_124k)(unsigned char *fw,
int len, bool change_iref);
int (*fp_fts_ctpm_fw_upgrade_with_sys_fs_128k)(unsigned char *fw,
int len, bool change_iref);
void (*fp_flash_dump_func)(uint8_t local_flash_command,
int Flash_Size, uint8_t *flash_buffer);
bool (*fp_flash_lastdata_check)(uint32_t size);
bool (*fp_ahb_squit)(void);
void (*fp_flash_read)(uint8_t *r_data, int start_addr, int length);
bool (*fp_sfr_rw)(uint8_t *addr, int length,
uint8_t *data, uint8_t rw_ctrl);
bool (*fp_lock_flash)(void);
bool (*fp_unlock_flash)(void);
void (*fp_init_auto_func)(void);
int (*_diff_overlay_flash)(void);
/* CORE_FLASH */
/* CORE_SRAM */
void (*fp_sram_write)(uint8_t *FW_content);
bool (*fp_sram_verify)(uint8_t *FW_File, int FW_Size);
bool (*fp_get_DSRAM_data)(uint8_t *info_data, bool DSRAM_Flag);
/* CORE_SRAM */
/* CORE_DRIVER */
void (*fp_chip_init)(void);
#if defined(HX_AUTO_UPDATE_FW)
int (*fp_fw_ver_bin)(void);
#endif
void (*fp_pin_reset)(void);
void (*fp_touch_information)(void);
void (*fp_reload_config)(void);
int (*fp_get_touch_data_size)(void);
void (*fp_usb_detect_set)(uint8_t *cable_config);
int (*fp_hand_shaking)(void);
int (*fp_determin_diag_rawdata)(int diag_command);
int (*fp_determin_diag_storage)(int diag_command);
int (*fp_cal_data_len)(int raw_cnt_rmd, int HX_MAX_PT, int raw_cnt_max);
bool (*fp_diag_check_sum)(struct himax_report_data *hx_touch_data);
void (*fp_diag_parse_raw_data)(struct himax_report_data *hx_touch_data,
int mul_num,
int self_num,
uint8_t diag_cmd,
int32_t *mutual_data,
int32_t *self_data);
void (*fp_ic_reset)(uint8_t loadconfig, uint8_t int_off);
int (*fp_ic_esd_recovery)(int hx_esd_event,
int hx_zero_event, int length);
void (*fp_esd_ic_reset)(void);
void (*fp_resend_cmd_func)(bool suspended);
#if defined(HX_TP_PROC_GUEST_INFO)
int (*guest_info_get_status)(void);
int (*read_guest_info)(void);
#endif
/* CORE_DRIVER */
#if defined(HX_ZERO_FLASH)
void (*fp_clean_sram_0f)(uint8_t *addr, int write_len, int type);
void (*fp_write_sram_0f)(const struct firmware *fw_entry,
uint8_t *addr,
int start_index,
uint32_t write_len);
int (*fp_write_sram_0f_crc)(const struct firmware *fw_entry,
uint8_t *addr,
int start_index,
uint32_t write_len);
void (*fp_firmware_update_0f)(const struct firmware *fw_entry);
int (*fp_0f_operation_dirly)(void);
int (*fp_0f_op_file_dirly)(char *file_name);
void (*fp_0f_operation)(struct work_struct *work);
int (*fp_0f_esd_check)(void);
void (*fp_0f_reload_to_active)(void);
#if defined(HX_0F_DEBUG)
void (*fp_read_sram_0f)(const struct firmware *fw_entry,
uint8_t *addr,
int start_index,
int read_len);
void (*fp_read_all_sram)(uint8_t *addr, int read_len);
void (*fp_firmware_read_0f)(const struct firmware *fw_entry, int type);
void (*fp_0f_operation_check)(int type);
#endif
#if defined(HX_CODE_OVERLAY)
int (*fp_0f_overlay)(int ovl_type, int mode);
#endif
#endif
};
#endif

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,292 @@
/* SPDX-License-Identifier: GPL-2.0 */
/* Himax Android Driver Sample Code for inspection functions
*
* Copyright (C) 2019 Himax Corporation.
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
* may be copied, distributed, and modified under those terms.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#include "himax_platform.h"
#include "himax_common.h"
#include "himax_ic_core.h"
/*#define HX_GAP_TEST*/
/*#define HX_INSP_LP_TEST*/
/*#define HX_ACT_IDLE_TEST*/
#define HX_RSLT_OUT_PATH "/sdcard/"
#define HX_RSLT_OUT_FILE "hx_test_result.txt"
#define PI(x...) pr_cont(x)
#define HX_SZ_ICID 60
#if defined(HX_ESD_RECOVERY)
extern u8 HX_ESD_RESET_ACTIVATE;
#endif
#define BS_RAWDATA 10
#define BS_NOISE 10
#define BS_OPENSHORT 0
#define BS_LPWUG 1
#define BS_LP_dile 1
#define BS_ACT_IDLE 1
/* skip notch & dummy */
#define SKIP_NOTCH_START 5
#define SKIP_NOTCH_END 10
/* TX+SKIP_NOTCH_START */
#define SKIP_DUMMY_START 23
/* TX+SKIP_NOTCH_END*/
#define SKIP_DUMMY_END 28
#define NOISEFRAME (BS_NOISE+1)
#define NORMAL_IDLE_RAWDATA_NOISEFRAME 10
#define LP_RAWDATAFRAME 1
#define LP_NOISEFRAME 1
#define LP_IDLE_RAWDATAFRAME 1
#define LP_IDLE_NOISEFRAME 1
#define OTHERSFRAME 2
#define UNIFMAX 500
/*Himax MP Password*/
#define PWD_OPEN_START 0x77
#define PWD_OPEN_END 0x88
#define PWD_SHORT_START 0x11
#define PWD_SHORT_END 0x33
#define PWD_RAWDATA_START 0x00
#define PWD_RAWDATA_END 0x99
#define PWD_NOISE_START 0x00
#define PWD_NOISE_END 0x99
#define PWD_SORTING_START 0xAA
#define PWD_SORTING_END 0xCC
#define PWD_ACT_IDLE_START 0x22
#define PWD_ACT_IDLE_END 0x44
#define PWD_LP_START 0x55
#define PWD_LP_END 0x66
#define PWD_LP_IDLE_START 0x50
#define PWD_LP_IDLE_END 0x60
#define PWD_TURN_ON_MPAP_OVL 0x107380
/*Himax DataType*/
#define DATA_SORTING 0x0A
#define DATA_OPEN 0x0B
#define DATA_MICRO_OPEN 0x0C
#define DATA_SHORT 0x0A
#define DATA_RAWDATA 0x0A
#define DATA_NOISE 0x0F
#define DATA_BACK_NORMAL 0x00
#define DATA_LP_RAWDATA 0x0C
#define DATA_LP_NOISE 0x0F
#define DATA_ACT_IDLE_RAWDATA 0x0A
#define DATA_ACT_IDLE_NOISE 0x0F
#define DATA_LP_IDLE_RAWDATA 0x0A
#define DATA_LP_IDLE_NOISE 0x0F
/*Himax Data Ready Password*/
#define Data_PWD0 0xA5
#define Data_PWD1 0x5A
/* ASCII format */
#define ASCII_LF (0x0A)
#define ASCII_CR (0x0D)
#define ASCII_COMMA (0x2C)
#define ASCII_ZERO (0x30)
#define CHAR_EL '\0'
#define CHAR_NL '\n'
#define ACSII_SPACE (0x20)
/* INSOECTION Setting */
void himax_inspection_init(void);
extern int *g_test_item_flag;
extern int HX_CRITERIA_ITEM;
extern int *g_test_item_flag;
extern char *g_himax_inspection_mode[];
/*Inspection register*/
#define addr_normal_noise_thx 0x1000708C
#define addr_lpwug_noise_thx 0x10007090
#define addr_recal_thx 0x10007090
#define addr_palm_num 0x100070A8
#define addr_weight_sup 0x100072C8
#define addr_normal_weight_a 0x1000709C
#define addr_lpwug_weight_a 0x100070A0
#define addr_weight_b 0x10007094
#define addr_max_dc 0x10007FC8
#define addr_skip_frame 0x100070F4
#define addr_neg_noise_sup 0x10007FD8
#define data_neg_noise 0x7F0C0000
#define addr_ctrl_mpap_ovl 0x100073EC
/*Need to map *g_himax_inspection_mode[]*/
enum THP_INSPECTION_ENUM {
HX_OPEN,
HX_MICRO_OPEN,
HX_SHORT,
HX_RAWDATA,
HX_BPN_RAWDATA,
HX_SC,
HX_WT_NOISE,
HX_ABS_NOISE,
HX_SORTING,
HX_GAPTEST_RAW,
/*HX_GAPTEST_RAW_X,*/
/*HX_GAPTEST_RAW_Y,*/
HX_ACT_IDLE_RAWDATA,
HX_ACT_IDLE_BPN_RAWDATA,
HX_ACT_IDLE_NOISE,
/*LPWUG test must put after Normal test*/
HX_LP_RAWDATA,
HX_LP_BPN_RAWDATA,
HX_LP_WT_NOISE,
HX_LP_ABS_NOISE,
HX_LP_IDLE_RAWDATA,
HX_LP_IDLE_BPN_RAWDATA,
HX_LP_IDLE_NOISE,
HX_BACK_NORMAL,/*Must put in the end*/
};
enum HX_CRITERIA_ENUM {
IDX_RAWMIN = 0,
IDX_RAWMAX,
IDX_BPN_RAWMIN,
IDX_BPN_RAWMAX,
IDX_SCMIN,
IDX_SCMAX,
IDX_SC_GOLDEN,
IDX_SHORTMIN,
IDX_SHORTMAX,
IDX_OPENMIN,
IDX_OPENMAX,
IDX_M_OPENMIN,
IDX_M_OPENMAX,
IDX_WT_NOISEMIN,
IDX_WT_NOISEMAX,
IDX_ABS_NOISEMIN,
IDX_ABS_NOISEMAX,
IDX_SORTMIN,
IDX_SORTMAX,
IDX_GAP_HOR_RAWMAX,
IDX_GAP_HOR_RAWMIN,
IDX_GAP_VER_RAWMAX,
IDX_GAP_VER_RAWMIN,
IDX_ACT_IDLE_NOISE_MIN,
IDX_ACT_IDLE_NOISE_MAX,
IDX_ACT_IDLE_RAWDATA_MIN,
IDX_ACT_IDLE_RAWDATA_MAX,
IDX_ACT_IDLE_RAW_BPN_MIN,
IDX_ACT_IDLE_RAW_BPN_MAX,
IDX_LP_WT_NOISEMIN,
IDX_LP_WT_NOISEMAX,
IDX_LP_NOISE_ABS_MIN,
IDX_LP_NOISE_ABS_MAX,
IDX_LP_RAWDATA_MIN,
IDX_LP_RAWDATA_MAX,
IDX_LP_RAW_BPN_MIN,
IDX_LP_RAW_BPN_MAX,
IDX_LP_IDLE_NOISE_MIN,
IDX_LP_IDLE_NOISE_MAX,
IDX_LP_IDLE_RAWDATA_MIN,
IDX_LP_IDLE_RAWDATA_MAX,
IDX_LP_IDLE_RAW_BPN_MIN,
IDX_LP_IDLE_RAW_BPN_MAX,
};
#define ERR_SFT 4
/* Error code of Inspection */
enum HX_INSP_ERR_ENUM {
/* OK */
HX_INSP_OK = 0,
/* Criteria file error*/
HX_INSP_EFILE = 1,
/* Get raw data errors */
HX_INSP_EGETRAW = 1 << 1,
/* Memory allocate errors */
HX_INSP_MEMALLCTFAIL = 1 << 2,
/* Switch mode error*/
HX_INSP_ESWITCHMODE = 1 << 3,
/* Sensor open error */
HX_EOPEN = 1 << (HX_OPEN + ERR_SFT),
/* Sensor micro open error */
HX_EMOPEN = 1 << (HX_MICRO_OPEN + ERR_SFT),
/* Sensor short error */
HX_ESHORT = 1 << (HX_SHORT + ERR_SFT),
/* Raw data error */
HX_ERAW = 1 << (HX_RAWDATA + ERR_SFT),
/* Raw data BPN error */
HX_EBPNRAW = 1 << (HX_BPN_RAWDATA + ERR_SFT),
/* Get SC errors */
HX_ESC = 1 << (HX_SC + ERR_SFT),
/* Noise error */
HX_WT_ENOISE = 1 << (HX_WT_NOISE + ERR_SFT),
/* Noise error */
HX_ABS_ENOISE = 1 << (HX_ABS_NOISE + ERR_SFT),
/* Sorting error*/
HX_ESORT = 1 << (HX_SORTING + ERR_SFT),
/* Raw Data GAP */
HX_EGAP_RAW = 1 << (HX_GAPTEST_RAW + ERR_SFT),
/* ACT_IDLE RAW ERROR */
HX_EACT_IDLE_RAW = 1 << (HX_ACT_IDLE_RAWDATA + ERR_SFT),
/* ACT_IDLE NOISE ERROR */
HX_EACT_IDLE_NOISE = 1 << (HX_ACT_IDLE_NOISE + ERR_SFT),
/* LPWUG RAW ERROR */
HX_ELP_RAW = 1 << (HX_LP_RAWDATA + ERR_SFT),
/* LPWUG NOISE ERROR */
HX_ELP_WT_NOISE = 1 << (HX_LP_WT_NOISE + ERR_SFT),
/* LPWUG NOISE ERROR */
HX_ELP_ABS_NOISE = 1 << (HX_LP_ABS_NOISE + ERR_SFT),
/* LPWUG IDLE RAW ERROR */
HX_ELP_IDLE_RAW = 1 << (HX_LP_IDLE_RAWDATA + ERR_SFT),
/* LPWUG IDLE NOISE ERROR */
HX_ELP_IDLE_NOISE = 1 << (HX_LP_IDLE_NOISE + ERR_SFT),
HX_EACT_IDLE_BPNRAW = 1 << (HX_ACT_IDLE_BPN_RAWDATA + ERR_SFT),
HX_ELP_BPNRAW = 1 << (HX_LP_BPN_RAWDATA + ERR_SFT),
HX_ELP_IDLE_BPNRAW = 1 << (HX_LP_IDLE_BPN_RAWDATA + ERR_SFT),
};
extern void himax_inspect_data_clear(void);

View file

@ -0,0 +1,398 @@
/* SPDX-License-Identifier: GPL-2.0 */
/* Himax Android Driver Sample Code for modularize functions
*
* Copyright (C) 2019 Himax Corporation.
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
* may be copied, distributed, and modified under those terms.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#ifndef __HIMAX_MODULAR_H__
#define __HIMAX_MODULAR_H__
#include "himax_modular_table.h"
static bool (*this_detect_fp)(void);
#if defined(HX_USE_KSYM)
static void himax_add_chip_dt(bool (*detect_fp)(void))
{
int32_t idx;
struct himax_chip_entry *entry;
this_detect_fp = detect_fp;
idx = himax_get_ksym_idx();
if (idx < 0) {
/*TODO: No entry, handle this error*/
E("%s: no entry exist, please insert ic module first!",
__func__);
} else {
entry = (void *)kallsyms_lookup_name(himax_ksym_lookup[idx]);
if (/*!(entry->core_chip_dt)*/isEmpty(idx) == 1) {
entry->core_chip_dt = kcalloc(HX_DRIVER_MAX_IC_NUM,
sizeof(struct himax_chip_detect), GFP_KERNEL);
if (entry->core_chip_dt == NULL) {
E("%s: Failed to allocate core_chip_dt\n",
__func__);
return;
}
entry->hx_ic_dt_num = 0;
}
entry->core_chip_dt[entry->hx_ic_dt_num++].fp_chip_detect =
detect_fp;
}
}
#else
static void himax_add_chip_dt(bool (*detect_fp)(void))
{
this_detect_fp = detect_fp;
if (himax_ksym_lookup.core_chip_dt == NULL) {
himax_ksym_lookup.core_chip_dt = kcalloc(HX_DRIVER_MAX_IC_NUM,
sizeof(struct himax_chip_detect), GFP_KERNEL);
if (himax_ksym_lookup.core_chip_dt == NULL) {
E("%s: Failed to allocate core_chip_dt\n", __func__);
return;
}
himax_ksym_lookup.hx_ic_dt_num = 0;
}
himax_ksym_lookup.core_chip_dt
[himax_ksym_lookup.hx_ic_dt_num].fp_chip_detect = detect_fp;
himax_ksym_lookup.hx_ic_dt_num++;
}
#endif
static void free_chip_dt_table(void)
{
int i, j, idx;
struct himax_chip_entry *entry;
idx = himax_get_ksym_idx();
if (idx >= 0) {
if (isEmpty(idx) != 0) {
I("%s: no chip registered or entry clean up\n",
__func__);
return;
}
entry = get_chip_entry_by_index(idx);
for (i = 0; i < entry->hx_ic_dt_num; i++) {
if (entry->core_chip_dt
[i].fp_chip_detect == this_detect_fp) {
if (i == (entry->hx_ic_dt_num - 1)) {
entry->core_chip_dt
[i].fp_chip_detect = NULL;
entry->hx_ic_dt_num = 0;
} else {
for (j = i; j < entry
->hx_ic_dt_num; j++)
entry->core_chip_dt
[i].fp_chip_detect =
entry->core_chip_dt
[j].fp_chip_detect;
entry->core_chip_dt
[j].fp_chip_detect = NULL;
entry->hx_ic_dt_num--;
}
}
}
if (entry->hx_ic_dt_num == 0) {
kfree(entry->core_chip_dt);
entry->core_chip_dt = NULL;
}
}
}
#if !defined(HX_USE_KSYM)
#define setup_symbol(sym) ({kp_##sym = &(sym); kp_##sym; })
#define setup_symbol_func(sym) ({kp_##sym = (sym); kp_##sym; })
#else
#define setup_symbol(sym) ({kp_##sym = (void *)kallsyms_lookup_name(#sym); \
kp_##sym; })
#define setup_symbol_func(sym) setup_symbol(sym)
#endif
#define assert_on_symbol(sym) \
do { \
if (!setup_symbol(sym)) { \
E("%s: setup %s failed!\n", __func__, #sym); \
ret = -1; \
} \
} while (0)
#define assert_on_symbol_func(sym) \
do { \
if (!setup_symbol_func(sym)) { \
E("%s: setup %s failed!\n", __func__, #sym); \
ret = -1; \
} \
} while (0)
#if !defined(__HIMAX_HX852xH_MOD__) && !defined(__HIMAX_HX852xG_MOD__)
static struct fw_operation **kp_pfw_op;
static struct ic_operation **kp_pic_op;
static struct flash_operation **kp_pflash_op;
static struct driver_operation **kp_pdriver_op;
#endif
#if defined(HX_ZERO_FLASH) && defined(CONFIG_TOUCHSCREEN_HIMAX_INCELL)
static struct zf_operation **kp_pzf_op;
static int *kp_G_POWERONOF;
#endif
static unsigned char *kp_IC_CHECKSUM;
#if defined(HX_ESD_RECOVERY)
static u8 *kp_HX_ESD_RESET_ACTIVATE;
#endif
#if defined(HX_ZERO_FLASH) && defined(HX_CODE_OVERLAY)
#if defined(CONFIG_TOUCHSCREEN_HIMAX_INCELL)
static uint8_t **kp_ovl_idx;
#endif
#endif
static unsigned long *kp_FW_VER_MAJ_FLASH_ADDR;
static unsigned long *kp_FW_VER_MIN_FLASH_ADDR;
static unsigned long *kp_CFG_VER_MAJ_FLASH_ADDR;
static unsigned long *kp_CFG_VER_MIN_FLASH_ADDR;
static unsigned long *kp_CID_VER_MAJ_FLASH_ADDR;
static unsigned long *kp_CID_VER_MIN_FLASH_ADDR;
static unsigned long *kp_FW_VER_MAJ_FLASH_LENG;
static unsigned long *kp_FW_VER_MIN_FLASH_LENG;
static unsigned long *kp_CFG_VER_MAJ_FLASH_LENG;
static unsigned long *kp_CFG_VER_MIN_FLASH_LENG;
static unsigned long *kp_CID_VER_MAJ_FLASH_LENG;
static unsigned long *kp_CID_VER_MIN_FLASH_LENG;
#if defined(HX_AUTO_UPDATE_FW)
static int *kp_g_i_FW_VER;
static int *kp_g_i_CFG_VER;
static int *kp_g_i_CID_MAJ;
static int *kp_g_i_CID_MIN;
static unsigned char **kp_i_CTPM_FW;
#endif
#if defined(HX_TP_PROC_2T2R)
static bool *kp_Is_2T2R;
#endif
#if defined(HX_USB_DETECT_GLOBAL)
static void (*kp_himax_cable_detect_func)(bool force_renew);
#endif
#if defined(HX_RST_PIN_FUNC)
static void (*kp_himax_rst_gpio_set)(int pinnum, uint8_t value);
#endif
static struct himax_ts_data **kp_private_ts;
static struct himax_core_fp *kp_g_core_fp;
static struct himax_ic_data **kp_ic_data;
#if defined(__HIMAX_HX852xH_MOD__) || defined(__HIMAX_HX852xG_MOD__)
#if defined(__HIMAX_HX852xG_MOD__)
static struct on_driver_operation **kp_on_pdriver_op;
#endif
static void (*kp_himax_mcu_on_cmd_init)(void);
static int (*kp_himax_mcu_on_cmd_struct_init)(void);
#else
static void (*kp_himax_mcu_in_cmd_init)(void);
static int (*kp_himax_mcu_in_cmd_struct_init)(void);
#endif
static void (*kp_himax_parse_assign_cmd)(uint32_t addr, uint8_t *cmd,
int len);
static int (*kp_himax_bus_read)(uint8_t command, uint8_t *data,
uint32_t length, uint8_t toRetry);
static int (*kp_himax_bus_write)(uint8_t command, uint8_t *data,
uint32_t length, uint8_t toRetry);
static int (*kp_himax_bus_write_command)(uint8_t command, uint8_t toRetry);
static void (*kp_himax_int_enable)(int enable);
static int (*kp_himax_ts_register_interrupt)(void);
static uint8_t (*kp_himax_int_gpio_read)(int pinnum);
static int (*kp_himax_gpio_power_config)(struct himax_i2c_platform_data *pdata);
#if !defined(HX_USE_KSYM)
#if !defined(__HIMAX_HX852xH_MOD__) && !defined(__HIMAX_HX852xG_MOD__)
extern struct fw_operation *pfw_op;
extern struct ic_operation *pic_op;
extern struct flash_operation *pflash_op;
extern struct driver_operation *pdriver_op;
#endif
#if defined(HX_ZERO_FLASH) && defined(CONFIG_TOUCHSCREEN_HIMAX_INCELL)
extern struct zf_operation *pzf_op;
extern int G_POWERONOF;
#endif
extern unsigned char IC_CHECKSUM;
#if defined(HX_ESD_RECOVERY)
extern u8 HX_ESD_RESET_ACTIVATE;
#endif
#if defined(HX_ZERO_FLASH) && defined(HX_CODE_OVERLAY)
#if defined(CONFIG_TOUCHSCREEN_HIMAX_INCELL)
extern uint8_t *ovl_idx;
#endif
#endif
extern unsigned long FW_VER_MAJ_FLASH_ADDR;
extern unsigned long FW_VER_MIN_FLASH_ADDR;
extern unsigned long CFG_VER_MAJ_FLASH_ADDR;
extern unsigned long CFG_VER_MIN_FLASH_ADDR;
extern unsigned long CID_VER_MAJ_FLASH_ADDR;
extern unsigned long CID_VER_MIN_FLASH_ADDR;
extern unsigned long FW_VER_MAJ_FLASH_LENG;
extern unsigned long FW_VER_MIN_FLASH_LENG;
extern unsigned long CFG_VER_MAJ_FLASH_LENG;
extern unsigned long CFG_VER_MIN_FLASH_LENG;
extern unsigned long CID_VER_MAJ_FLASH_LENG;
extern unsigned long CID_VER_MIN_FLASH_LENG;
#if defined(HX_AUTO_UPDATE_FW)
extern int g_i_FW_VER;
extern int g_i_CFG_VER;
extern int g_i_CID_MAJ;
extern int g_i_CID_MIN;
extern unsigned char *i_CTPM_FW;
#endif
#if defined(HX_TP_PROC_2T2R)
extern bool Is_2T2R;
#endif
#if defined(HX_USB_DETECT_GLOBAL)
extern void (himax_cable_detect_func)(bool force_renew);
#endif
#if defined(HX_RST_PIN_FUNC)
extern void (himax_rst_gpio_set)(int pinnum, uint8_t value);
#endif
extern struct himax_ts_data *private_ts;
extern struct himax_core_fp g_core_fp;
extern struct himax_ic_data *ic_data;
#if defined(__HIMAX_HX852xH_MOD__) || defined(__HIMAX_HX852xG_MOD__)
#if defined(__HIMAX_HX852xG_MOD__)
extern struct on_driver_operation *on_pdriver_op;
#endif
extern void (himax_mcu_on_cmd_init)(void);
extern int (himax_mcu_on_cmd_struct_init)(void);
#else
extern void (himax_mcu_in_cmd_init)(void);
extern int (himax_mcu_in_cmd_struct_init)(void);
#endif
extern void (himax_parse_assign_cmd)(uint32_t addr, uint8_t *cmd, int len);
extern int (himax_bus_read)(uint8_t command, uint8_t *data, uint32_t length,
uint8_t toRetry);
extern int (himax_bus_write)(uint8_t command, uint8_t *data, uint32_t length,
uint8_t toRetry);
extern int (himax_bus_write_command)(uint8_t command, uint8_t toRetry);
extern void (himax_int_enable)(int enable);
extern int (himax_ts_register_interrupt)(void);
extern uint8_t (himax_int_gpio_read)(int pinnum);
extern int (himax_gpio_power_config)(struct himax_i2c_platform_data *pdata);
#endif
static int32_t himax_ic_setup_external_symbols(void)
{
int32_t ret = 0;
#if !defined(__HIMAX_HX852xH_MOD__) && !defined(__HIMAX_HX852xG_MOD__)
assert_on_symbol(pfw_op);
assert_on_symbol(pic_op);
assert_on_symbol(pflash_op);
assert_on_symbol(pdriver_op);
#endif
assert_on_symbol(private_ts);
assert_on_symbol(g_core_fp);
assert_on_symbol(ic_data);
#if defined(__HIMAX_HX852xH_MOD__) || defined(__HIMAX_HX852xG_MOD__)
#if defined(__HIMAX_HX852xG_MOD__)
assert_on_symbol(on_pdriver_op);
#endif
assert_on_symbol_func(himax_mcu_on_cmd_init);
assert_on_symbol_func(himax_mcu_on_cmd_struct_init);
#else
assert_on_symbol_func(himax_mcu_in_cmd_init);
assert_on_symbol_func(himax_mcu_in_cmd_struct_init);
#endif
assert_on_symbol_func(himax_parse_assign_cmd);
assert_on_symbol_func(himax_bus_read);
assert_on_symbol_func(himax_bus_write);
assert_on_symbol_func(himax_bus_write_command);
assert_on_symbol_func(himax_int_enable);
assert_on_symbol_func(himax_ts_register_interrupt);
assert_on_symbol_func(himax_int_gpio_read);
assert_on_symbol_func(himax_gpio_power_config);
#if defined(HX_ZERO_FLASH) && defined(CONFIG_TOUCHSCREEN_HIMAX_INCELL)
assert_on_symbol(pzf_op);
assert_on_symbol(G_POWERONOF);
#endif
assert_on_symbol(IC_CHECKSUM);
assert_on_symbol(FW_VER_MAJ_FLASH_ADDR);
assert_on_symbol(FW_VER_MIN_FLASH_ADDR);
assert_on_symbol(CFG_VER_MAJ_FLASH_ADDR);
assert_on_symbol(CFG_VER_MIN_FLASH_ADDR);
assert_on_symbol(CID_VER_MAJ_FLASH_ADDR);
assert_on_symbol(CID_VER_MIN_FLASH_ADDR);
assert_on_symbol(FW_VER_MAJ_FLASH_LENG);
assert_on_symbol(FW_VER_MIN_FLASH_LENG);
assert_on_symbol(CFG_VER_MAJ_FLASH_LENG);
assert_on_symbol(CFG_VER_MIN_FLASH_LENG);
assert_on_symbol(CID_VER_MAJ_FLASH_LENG);
assert_on_symbol(CID_VER_MIN_FLASH_LENG);
#if defined(HX_AUTO_UPDATE_FW)
assert_on_symbol(g_i_FW_VER);
assert_on_symbol(g_i_CFG_VER);
assert_on_symbol(g_i_CID_MAJ);
assert_on_symbol(g_i_CID_MIN);
assert_on_symbol(i_CTPM_FW);
#endif
#if defined(HX_TP_PROC_2T2R)
assert_on_symbol(Is_2T2R);
#endif
#if defined(HX_USB_DETECT_GLOBAL)
assert_on_symbol_func(himax_cable_detect_func);
#endif
#if defined(HX_RST_PIN_FUNC)
assert_on_symbol_func(himax_rst_gpio_set);
#endif
#if defined(HX_ESD_RECOVERY)
assert_on_symbol(HX_ESD_RESET_ACTIVATE);
#endif
#if defined(HX_ZERO_FLASH) && defined(HX_CODE_OVERLAY)
#if defined(CONFIG_TOUCHSCREEN_HIMAX_INCELL)
assert_on_symbol(ovl_idx);
#endif
#endif
return ret;
}
#endif

View file

@ -0,0 +1,156 @@
/* SPDX-License-Identifier: GPL-2.0 */
/* Himax Android Driver Sample Code for modularize functions
*
* Copyright (C) 2019 Himax Corporation.
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
* may be copied, distributed, and modified under those terms.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#ifndef __HIMAX_MODULAR_TABLE_H__
#define __HIMAX_MODULAR_TABLE_H__
#include "himax_ic_core.h"
#define TO_STR(VAR) #VAR
enum modular_table {
MODULE_NOT_FOUND = -1,
MODULE_FOUND,
MODULE_EMPTY,
};
#if defined(HX_USE_KSYM)
#define DECLARE(sym) struct himax_chip_entry sym; \
EXPORT_SYMBOL(sym)
static const char * const himax_ksym_lookup[] = {
#if defined(HX_MOD_KSYM_HX852xG)
TO_STR(HX_MOD_KSYM_HX852xG),
#endif
#if defined(HX_MOD_KSYM_HX852xH)
TO_STR(HX_MOD_KSYM_HX852xH),
#endif
#if defined(HX_MOD_KSYM_HX83102)
TO_STR(HX_MOD_KSYM_HX83102),
#endif
#if defined(HX_MOD_KSYM_HX83103)
TO_STR(HX_MOD_KSYM_HX83103),
#endif
#if defined(HX_MOD_KSYM_HX83106)
TO_STR(HX_MOD_KSYM_HX83106),
#endif
#if defined(HX_MOD_KSYM_HX83111)
TO_STR(HX_MOD_KSYM_HX83111),
#endif
#if defined(HX_MOD_KSYM_HX83112)
TO_STR(HX_MOD_KSYM_HX83112),
#endif
#if defined(HX_MOD_KSYM_HX83113)
TO_STR(HX_MOD_KSYM_HX83113),
#endif
#if defined(HX_MOD_KSYM_HX83192)
TO_STR(HX_MOD_KSYM_HX83192),
#endif
#if defined(HX_MOD_KSYM_HX83191)
TO_STR(HX_MOD_KSYM_HX83191),
#endif
NULL
};
static struct himax_chip_entry *get_chip_entry_by_index(int32_t idx)
{
return (void *)kallsyms_lookup_name(himax_ksym_lookup[idx]);
}
/*
* Return 1 when specified entry is empty, 0 when not, -1 when index error
*/
static int32_t isEmpty(int32_t idx)
{
int32_t size = sizeof(himax_ksym_lookup) / sizeof(char *);
struct himax_chip_entry *entry;
if (idx < 0 || idx >= size)
return MODULE_NOT_FOUND;
entry = get_chip_entry_by_index(idx);
if (entry)
return (entry->core_chip_dt == NULL)?MODULE_EMPTY:MODULE_FOUND;
return MODULE_NOT_FOUND;
}
/*
* Search for created entry, if not existed, return 1st
* Return index of himax_ksym_lookup
*/
static int32_t himax_get_ksym_idx(void)
{
int32_t i, first = -1;
int32_t size = sizeof(himax_ksym_lookup) / sizeof(char *);
struct himax_chip_entry *entry;
I("%s: symtable size: %d\n", __func__, size);
for (i = 0; i < size; i++) {
if (himax_ksym_lookup[i] == NULL)
break;
I("%s: %s\n", __func__, himax_ksym_lookup[i]);
entry = get_chip_entry_by_index(i);
if (entry) {
if (first < 0)
first = i;
if (isEmpty(i) == 0)
return i;
}
}
if (first >= 0)
return first;
/*incorrect use state, means no ic defined*/
return MODULE_NOT_FOUND;
}
#else
#define DECLARE(sym)
extern struct himax_chip_entry himax_ksym_lookup;
static struct himax_chip_entry *get_chip_entry_by_index(int32_t idx)
{
return &himax_ksym_lookup;
}
static int32_t isEmpty(int32_t idx)
{
struct himax_chip_entry *entry;
if (idx < 0)
return MODULE_NOT_FOUND;
entry = get_chip_entry_by_index(idx);
if (entry)
return (entry->core_chip_dt == NULL)?MODULE_EMPTY:MODULE_FOUND;
return MODULE_NOT_FOUND;
}
static int32_t himax_get_ksym_idx(void)
{
int32_t size;
size = himax_ksym_lookup.hx_ic_dt_num;
I("%s: symtable size: %d\n", __func__, size);
return 0;
}
#endif
#endif

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,143 @@
/* SPDX-License-Identifier: GPL-2.0 */
/* Himax Android Driver Sample Code for QCT platform
*
* Copyright (C) 2019 Himax Corporation.
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
* may be copied, distributed, and modified under those terms.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#ifndef HIMAX_PLATFORM_H
#define HIMAX_PLATFORM_H
#include <linux/delay.h>
#include <linux/fs.h>
#include <linux/gpio.h>
#include <linux/types.h>
#include <linux/spi/spi.h>
#include <linux/interrupt.h>
#if defined(CONFIG_HMX_DB)
#include <linux/regulator/consumer.h>
#endif
#define HIMAX_SPI_FIFO_POLLING
#define HIMAX_I2C_RETRY_TIMES 3
#if defined(CONFIG_TOUCHSCREEN_HIMAX_DEBUG)
#define D(x...) pr_debug("[HXTP] " x)
#define I(x...) pr_info("[HXTP] " x)
#define W(x...) pr_warn("[HXTP][WARNING] " x)
#define E(x...) pr_err("[HXTP][ERROR] " x)
#define DIF(x...) \
do { \
if (debug_flag) \
pr_debug("[HXTP][DEBUG] " x) \
} while (0)
#else
#define D(x...)
#define I(x...)
#define W(x...)
#define E(x...)
#define DIF(x...)
#endif
#if defined(CONFIG_HMX_DB)
/* Analog voltage @2.7 V */
#define HX_VTG_MIN_UV 2700000
#define HX_VTG_MAX_UV 3300000
#define HX_ACTIVE_LOAD_UA 15000
#define HX_LPM_LOAD_UA 10
/* Digital voltage @1.8 V */
#define HX_VTG_DIG_MIN_UV 1800000
#define HX_VTG_DIG_MAX_UV 1800000
#define HX_ACTIVE_LOAD_DIG_UA 10000
#define HX_LPM_LOAD_DIG_UA 10
#define HX_I2C_VTG_MIN_UV 1800000
#define HX_I2C_VTG_MAX_UV 1800000
#define HX_I2C_LOAD_UA 10000
#define HX_I2C_LPM_LOAD_UA 10
#endif
#define HIMAX_common_NAME "himax_tp"
#define HIMAX_I2C_ADDR 0x48
#define INPUT_DEV_NAME "himax-touchscreen"
struct himax_i2c_platform_data {
int abs_x_min;
int abs_x_max;
int abs_x_fuzz;
int abs_y_min;
int abs_y_max;
int abs_y_fuzz;
int abs_pressure_min;
int abs_pressure_max;
int abs_pressure_fuzz;
int abs_width_min;
int abs_width_max;
int screenWidth;
int screenHeight;
uint8_t fw_version;
uint8_t tw_id;
uint8_t powerOff3V3;
uint8_t cable_config[2];
uint8_t protocol_type;
int gpio_irq;
int gpio_reset;
int gpio_3v3_en;
int (*power)(int on);
void (*reset)(void);
struct himax_virtual_key *virtual_key;
struct kobject *vk_obj;
struct kobj_attribute *vk2Use;
int hx_config_size;
#if defined(CONFIG_HMX_DB)
bool i2c_pull_up;
bool digital_pwr_regulator;
int reset_gpio;
u32 reset_gpio_flags;
int irq_gpio;
u32 irq_gpio_flags;
struct regulator *vcc_ana; /* For Dragon Board */
struct regulator *vcc_dig; /* For Dragon Board */
struct regulator *vcc_i2c; /* For Dragon Board */
#endif
};
extern struct himax_ic_data *ic_data;
extern struct himax_ts_data *private_ts;
int himax_chip_common_init(void);
void himax_chip_common_deinit(void);
void himax_ts_work(struct himax_ts_data *ts);
enum hrtimer_restart himax_ts_timer_func(struct hrtimer *timer);
extern int himax_bus_read(uint8_t command, uint8_t *data,
uint32_t length, uint8_t toRetry);
extern int himax_bus_write(uint8_t command, uint8_t *data,
uint32_t length, uint8_t toRetry);
extern int himax_bus_write_command(uint8_t command, uint8_t toRetry);
extern void himax_int_enable(int enable);
extern int himax_ts_register_interrupt(void);
int himax_ts_unregister_interrupt(void);
extern uint8_t himax_int_gpio_read(int pinnum);
extern int himax_gpio_power_config(struct himax_i2c_platform_data *pdata);
void himax_gpio_power_deconfig(struct himax_i2c_platform_data *pdata);
#if defined(HX_CONFIG_FB)
extern int fb_notifier_callback(struct notifier_block *self,
unsigned long event, void *data);
#elif defined(HX_CONFIG_DRM)
extern int drm_notifier_callback(struct notifier_block *self,
unsigned long event, void *data);
#endif
#endif

View file

@ -37,6 +37,11 @@
#define QPNP_VIB_MAX_PLAY_MS 15000
#define QPNP_VIB_OVERDRIVE_PLAY_MS 30
#ifdef CONFIG_AF_NOISE_ELIMINATION
extern int mot_actuator_on_vibrate_start(void);
extern int mot_actuator_on_vibrate_stop(void);
#endif
struct vib_ldo_chip {
struct led_classdev cdev;
struct regmap *regmap;
@ -54,6 +59,10 @@ struct vib_ldo_chip {
u64 vib_play_ms;
bool vib_enabled;
bool disable_overdrive;
bool dis_short_long;
int dis_long_ms;
int vmax_uV_long;
};
static inline int qpnp_vib_ldo_poll_status(struct vib_ldo_chip *chip)
@ -111,10 +120,23 @@ static int qpnp_vib_ldo_set_voltage(struct vib_ldo_chip *chip, int new_uV)
static inline int qpnp_vib_ldo_enable(struct vib_ldo_chip *chip, bool enable)
{
int ret;
#ifdef CONFIG_AF_NOISE_ELIMINATION
static int mot_actuator_started = 0;
#endif
if (chip->vib_enabled == enable)
return 0;
#ifdef CONFIG_AF_NOISE_ELIMINATION
if ((chip->vib_play_ms > 80) && (enable)) {
mot_actuator_on_vibrate_start();
mot_actuator_started = 1;
}
if(!enable && (mot_actuator_started == 1 )) {
mot_actuator_on_vibrate_stop();
mot_actuator_started = 0;
}
#endif
ret = regmap_update_bits(chip->regmap,
chip->base + QPNP_VIB_LDO_REG_EN_CTL,
QPNP_VIB_LDO_EN,
@ -144,6 +166,13 @@ static int qpnp_vibrator_play_on(struct vib_ldo_chip *chip)
int ret;
volt_uV = chip->vmax_uV;
if (chip->dis_short_long) {
pr_warn("vib in dis short and long, play ms=%d, dis_longms=%d, vmax_uV=%d, vmax_uV_long=%d\n",
chip->vib_play_ms, chip->dis_long_ms, chip->vmax_uV, chip->vmax_uV_long);
if (chip->vib_play_ms > chip->dis_long_ms) {
volt_uV = chip->vmax_uV_long;
}
}
if (!chip->disable_overdrive)
volt_uV = chip->overdrive_volt_uV ? chip->overdrive_volt_uV
: min(chip->vmax_uV * 2, QPNP_VIB_LDO_VMAX_UV);
@ -386,6 +415,29 @@ static int qpnp_vib_parse_dt(struct device *dev, struct vib_ldo_chip *chip)
return ret;
}
chip->dis_short_long = of_property_read_bool(dev->of_node,
"qcom,vib-dis-short-long");
if (chip->dis_short_long) {
pr_warn("read dis_short_long true");
ret = of_property_read_u32(dev->of_node, "qcom,vib-dis-short-long-val",
&chip->dis_long_ms);
if (ret < 0) {
pr_err("qcom,vib-dis-short-long-val property read failed, ret=%d\n",
ret);
return ret;
}
pr_warn("read dis_long_ms=%d\n", chip->dis_long_ms);
ret = of_property_read_u32(dev->of_node, "qcom,vib-ldo-volt-uv-long",
&chip->vmax_uV_long);
if (ret < 0) {
pr_err("qcom,vib-ldo-volt-uv-long property read failed, ret=%d\n",
ret);
return ret;
}
pr_warn("read vmax_uV_long=%d\n", chip->vmax_uV_long);
}
chip->disable_overdrive = of_property_read_bool(dev->of_node,
"qcom,disable-overdrive");

View file

@ -2884,16 +2884,17 @@ static int crypt_map(struct dm_target *ti, struct bio *bio)
* - for REQ_PREFLUSH device-mapper core ensures that no IO is in-flight
* - for REQ_OP_DISCARD caller must use flush if IO ordering matters
*/
// BEGIN IKSWR-71527 lutcho@motorola.com 2021/05/11
// bio_should_skip_dm_default_key(bio) reverted
if (unlikely(bio->bi_opf & REQ_PREFLUSH ||
bio_op(bio) == REQ_OP_DISCARD ||
bio_should_skip_dm_default_key(bio))) {
bio_op(bio) == REQ_OP_DISCARD )){
bio_set_dev(bio, cc->dev->bdev);
if (bio_sectors(bio))
bio->bi_iter.bi_sector = cc->start +
dm_target_offset(ti, bio->bi_iter.bi_sector);
return DM_MAPIO_REMAPPED;
}
// END IKSWR-71527
/*
* Check if bio is too large, split as needed.
*/

View file

@ -3087,6 +3087,11 @@ static int qseecom_unload_app(struct qseecom_dev_handle *data,
goto unload_exit;
}
if (!memcmp(data->client.app_name, "prov", strlen("prov"))) {
pr_debug("Do not unload prov app from tz\n");
goto unload_exit;
}
__qseecom_cleanup_app(data);
__qseecom_reentrancy_check_if_no_app_blocked(TZ_OS_APP_SHUTDOWN_ID);
@ -9673,6 +9678,9 @@ static int qseecom_suspend(struct platform_device *pdev, pm_message_t state)
mutex_lock(&qsee_bw_mutex);
mutex_lock(&clk_access_lock);
INIT_WORK(&qseecom.bw_inactive_req_ws,
qseecom_bw_inactive_req_work);
if (qseecom.current_mode != INACTIVE) {
ret = msm_bus_scale_client_update_request(
qseecom.qsee_perf_client, INACTIVE);

View file

@ -108,3 +108,6 @@ config MMC_CRYPTO
Enabling this makes it possible for the kernel to use the crypto
capabilities of the MMC device (if present) to perform crypto
operations on data being transferred to/from the device.
config SD_INSERT_DEBOUNCE_DELAY_LONGER
bool "add the debounce time when sdcard insert"
default n

View file

@ -39,11 +39,21 @@ static irqreturn_t mmc_gpio_cd_irqt(int irq, void *dev_id)
struct mmc_gpio *ctx = host->slot.handler_priv;
int present = host->ops->get_cd(host);
pr_debug("%s: cd gpio irq, gpio state %d (CARD_%s)\n",
pr_info("%s: cd gpio irq, gpio state %d (CARD_%s)\n",
mmc_hostname(host), present, present?"INSERT":"REMOVAL");
host->trigger_card_event = true;
mmc_detect_change(host, msecs_to_jiffies(ctx->cd_debounce_delay_ms));
#ifdef CONFIG_SD_INSERT_DEBOUNCE_DELAY_LONGER
if(present){
mmc_detect_change(host, msecs_to_jiffies(1500));
}
else{
mmc_detect_change(host, msecs_to_jiffies(ctx->cd_debounce_delay_ms));
}
#else //other project not use this function
mmc_detect_change(host, msecs_to_jiffies(ctx->cd_debounce_delay_ms));
#endif
return IRQ_HANDLED;
}

Some files were not shown because too many files have changed in this diff Show more