2df0fb4a4b
Changes in 5.10.50
Bluetooth: hci_qca: fix potential GPF
Bluetooth: btqca: Don't modify firmware contents in-place
Bluetooth: Remove spurious error message
ALSA: usb-audio: fix rate on Ozone Z90 USB headset
ALSA: usb-audio: Fix OOB access at proc output
ALSA: firewire-motu: fix stream format for MOTU 8pre FireWire
ALSA: usb-audio: scarlett2: Fix wrong resume call
ALSA: intel8x0: Fix breakage at ac97 clock measurement
ALSA: hda/realtek: fix mute/micmute LEDs for HP ProBook 450 G8
ALSA: hda/realtek: fix mute/micmute LEDs for HP ProBook 445 G8
ALSA: hda/realtek: fix mute/micmute LEDs for HP ProBook 630 G8
ALSA: hda/realtek: Add another ALC236 variant support
ALSA: hda/realtek: fix mute/micmute LEDs for HP EliteBook x360 830 G8
ALSA: hda/realtek: Improve fixup for HP Spectre x360 15-df0xxx
ALSA: hda/realtek: Fix bass speaker DAC mapping for Asus UM431D
ALSA: hda/realtek: Apply LED fixup for HP Dragonfly G1, too
ALSA: hda/realtek: fix mute/micmute LEDs for HP EliteBook 830 G8 Notebook PC
media: dvb-usb: fix wrong definition
Input: usbtouchscreen - fix control-request directions
net: can: ems_usb: fix use-after-free in ems_usb_disconnect()
usb: gadget: eem: fix echo command packet response issue
usb: renesas-xhci: Fix handling of unknown ROM state
USB: cdc-acm: blacklist Heimann USB Appset device
usb: dwc3: Fix debugfs creation flow
usb: typec: Add the missed altmode_id_remove() in typec_register_altmode()
xhci: solve a double free problem while doing s4
gfs2: Fix underflow in gfs2_page_mkwrite
gfs2: Fix error handling in init_statfs
ntfs: fix validity check for file name attribute
selftests/lkdtm: Avoid needing explicit sub-shell
copy_page_to_iter(): fix ITER_DISCARD case
iov_iter_fault_in_readable() should do nothing in xarray case
Input: joydev - prevent use of not validated data in JSIOCSBTNMAP ioctl
crypto: nx - Fix memcpy() over-reading in nonce
crypto: ccp - Annotate SEV Firmware file names
arm_pmu: Fix write counter incorrect in ARMv7 big-endian mode
ARM: dts: ux500: Fix LED probing
ARM: dts: at91: sama5d4: fix pinctrl muxing
btrfs: send: fix invalid path for unlink operations after parent orphanization
btrfs: compression: don't try to compress if we don't have enough pages
btrfs: clear defrag status of a root if starting transaction fails
ext4: cleanup in-core orphan list if ext4_truncate() failed to get a transaction handle
ext4: fix kernel infoleak via ext4_extent_header
ext4: fix overflow in ext4_iomap_alloc()
ext4: return error code when ext4_fill_flex_info() fails
ext4: correct the cache_nr in tracepoint ext4_es_shrink_exit
ext4: remove check for zero nr_to_scan in ext4_es_scan()
ext4: fix avefreec in find_group_orlov
ext4: use ext4_grp_locked_error in mb_find_extent
can: bcm: delay release of struct bcm_op after synchronize_rcu()
can: gw: synchronize rcu operations before removing gw job entry
can: isotp: isotp_release(): omit unintended hrtimer restart on socket release
can: j1939: j1939_sk_init(): set SOCK_RCU_FREE to call sk_destruct() after RCU is done
can: peak_pciefd: pucan_handle_status(): fix a potential starvation issue in TX path
mac80211: remove iwlwifi specific workaround that broke sta NDP tx
SUNRPC: Fix the batch tasks count wraparound.
SUNRPC: Should wake up the privileged task firstly.
bus: mhi: Wait for M2 state during system resume
mm/gup: fix try_grab_compound_head() race with split_huge_page()
perf/smmuv3: Don't trample existing events with global filter
KVM: nVMX: Handle split-lock #AC exceptions that happen in L2
KVM: PPC: Book3S HV: Workaround high stack usage with clang
KVM: x86/mmu: Treat NX as used (not reserved) for all !TDP shadow MMUs
KVM: x86/mmu: Use MMU's role to detect CR4.SMEP value in nested NPT walk
s390/cio: dont call css_wait_for_slow_path() inside a lock
s390: mm: Fix secure storage access exception handling
f2fs: Prevent swap file in LFS mode
clk: agilex/stratix10/n5x: fix how the bypass_reg is handled
clk: agilex/stratix10: remove noc_clk
clk: agilex/stratix10: fix bypass representation
rtc: stm32: Fix unbalanced clk_disable_unprepare() on probe error path
iio: frequency: adf4350: disable reg and clk on error in adf4350_probe()
iio: light: tcs3472: do not free unallocated IRQ
iio: ltr501: mark register holding upper 8 bits of ALS_DATA{0,1} and PS_DATA as volatile, too
iio: ltr501: ltr559: fix initialization of LTR501_ALS_CONTR
iio: ltr501: ltr501_read_ps(): add missing endianness conversion
iio: accel: bma180: Fix BMA25x bandwidth register values
serial: mvebu-uart: fix calculation of clock divisor
serial: sh-sci: Stop dmaengine transfer in sci_stop_tx()
serial_cs: Add Option International GSM-Ready 56K/ISDN modem
serial_cs: remove wrong GLOBETROTTER.cis entry
ath9k: Fix kernel NULL pointer dereference during ath_reset_internal()
ssb: sdio: Don't overwrite const buffer if block_write fails
rsi: Assign beacon rate settings to the correct rate_info descriptor field
rsi: fix AP mode with WPA failure due to encrypted EAPOL
tracing/histograms: Fix parsing of "sym-offset" modifier
tracepoint: Add tracepoint_probe_register_may_exist() for BPF tracing
seq_buf: Make trace_seq_putmem_hex() support data longer than 8
powerpc/stacktrace: Fix spurious "stale" traces in raise_backtrace_ipi()
loop: Fix missing discard support when using LOOP_CONFIGURE
evm: Execute evm_inode_init_security() only when an HMAC key is loaded
evm: Refuse EVM_ALLOW_METADATA_WRITES only if an HMAC key is loaded
fuse: Fix crash in fuse_dentry_automount() error path
fuse: Fix crash if superblock of submount gets killed early
fuse: Fix infinite loop in sget_fc()
fuse: ignore PG_workingset after stealing
fuse: check connected before queueing on fpq->io
fuse: reject internal errno
thermal/cpufreq_cooling: Update offline CPUs per-cpu thermal_pressure
spi: Make of_register_spi_device also set the fwnode
Add a reference to ucounts for each cred
staging: media: rkvdec: fix pm_runtime_get_sync() usage count
media: marvel-ccic: fix some issues when getting pm_runtime
media: mdk-mdp: fix pm_runtime_get_sync() usage count
media: s5p: fix pm_runtime_get_sync() usage count
media: am437x: fix pm_runtime_get_sync() usage count
media: sh_vou: fix pm_runtime_get_sync() usage count
media: mtk-vcodec: fix PM runtime get logic
media: s5p-jpeg: fix pm_runtime_get_sync() usage count
media: sunxi: fix pm_runtime_get_sync() usage count
media: sti/bdisp: fix pm_runtime_get_sync() usage count
media: exynos4-is: fix pm_runtime_get_sync() usage count
media: exynos-gsc: fix pm_runtime_get_sync() usage count
spi: spi-loopback-test: Fix 'tx_buf' might be 'rx_buf'
spi: spi-topcliff-pch: Fix potential double free in pch_spi_process_messages()
spi: omap-100k: Fix the length judgment problem
regulator: uniphier: Add missing MODULE_DEVICE_TABLE
sched/core: Initialize the idle task with preemption disabled
hwrng: exynos - Fix runtime PM imbalance on error
crypto: nx - add missing MODULE_DEVICE_TABLE
media: sti: fix obj-$(config) targets
media: cpia2: fix memory leak in cpia2_usb_probe
media: cobalt: fix race condition in setting HPD
media: hevc: Fix dependent slice segment flags
media: pvrusb2: fix warning in pvr2_i2c_core_done
media: imx: imx7_mipi_csis: Fix logging of only error event counters
crypto: qat - check return code of qat_hal_rd_rel_reg()
crypto: qat - remove unused macro in FW loader
crypto: qce: skcipher: Fix incorrect sg count for dma transfers
arm64: perf: Convert snprintf to sysfs_emit
sched/fair: Fix ascii art by relpacing tabs
media: i2c: ov2659: Use clk_{prepare_enable,disable_unprepare}() to set xvclk on/off
media: bt878: do not schedule tasklet when it is not setup
media: em28xx: Fix possible memory leak of em28xx struct
media: hantro: Fix .buf_prepare
media: cedrus: Fix .buf_prepare
media: v4l2-core: Avoid the dangling pointer in v4l2_fh_release
media: bt8xx: Fix a missing check bug in bt878_probe
media: st-hva: Fix potential NULL pointer dereferences
crypto: hisilicon/sec - fixup 3des minimum key size declaration
Makefile: fix GDB warning with CONFIG_RELR
media: dvd_usb: memory leak in cinergyt2_fe_attach
memstick: rtsx_usb_ms: fix UAF
mmc: sdhci-sprd: use sdhci_sprd_writew
mmc: via-sdmmc: add a check against NULL pointer dereference
spi: meson-spicc: fix a wrong goto jump for avoiding memory leak.
spi: meson-spicc: fix memory leak in meson_spicc_probe
crypto: shash - avoid comparing pointers to exported functions under CFI
media: dvb_net: avoid speculation from net slot
media: siano: fix device register error path
media: imx-csi: Skip first few frames from a BT.656 source
hwmon: (max31790) Report correct current pwm duty cycles
hwmon: (max31790) Fix pwmX_enable attributes
drivers/perf: fix the missed ida_simple_remove() in ddr_perf_probe()
KVM: PPC: Book3S HV: Fix TLB management on SMT8 POWER9 and POWER10 processors
btrfs: fix error handling in __btrfs_update_delayed_inode
btrfs: abort transaction if we fail to update the delayed inode
btrfs: sysfs: fix format string for some discard stats
btrfs: don't clear page extent mapped if we're not invalidating the full page
btrfs: disable build on platforms having page size 256K
locking/lockdep: Fix the dep path printing for backwards BFS
lockding/lockdep: Avoid to find wrong lock dep path in check_irq_usage()
KVM: s390: get rid of register asm usage
regulator: mt6358: Fix vdram2 .vsel_mask
regulator: da9052: Ensure enough delay time for .set_voltage_time_sel
media: Fix Media Controller API config checks
ACPI: video: use native backlight for GA401/GA502/GA503
HID: do not use down_interruptible() when unbinding devices
EDAC/ti: Add missing MODULE_DEVICE_TABLE
ACPI: processor idle: Fix up C-state latency if not ordered
hv_utils: Fix passing zero to 'PTR_ERR' warning
lib: vsprintf: Fix handling of number field widths in vsscanf
Input: goodix - platform/x86: touchscreen_dmi - Move upside down quirks to touchscreen_dmi.c
platform/x86: touchscreen_dmi: Add an extra entry for the upside down Goodix touchscreen on Teclast X89 tablets
platform/x86: touchscreen_dmi: Add info for the Goodix GT912 panel of TM800A550L tablets
ACPI: EC: Make more Asus laptops use ECDT _GPE
block_dump: remove block_dump feature in mark_inode_dirty()
blk-mq: grab rq->refcount before calling ->fn in blk_mq_tagset_busy_iter
blk-mq: clear stale request in tags->rq[] before freeing one request pool
fs: dlm: cancel work sync othercon
random32: Fix implicit truncation warning in prandom_seed_state()
open: don't silently ignore unknown O-flags in openat2()
drivers: hv: Fix missing error code in vmbus_connect()
fs: dlm: fix memory leak when fenced
ACPICA: Fix memory leak caused by _CID repair function
ACPI: bus: Call kobject_put() in acpi_init() error path
ACPI: resources: Add checks for ACPI IRQ override
block: fix race between adding/removing rq qos and normal IO
platform/x86: asus-nb-wmi: Revert "Drop duplicate DMI quirk structures"
platform/x86: asus-nb-wmi: Revert "add support for ASUS ROG Zephyrus G14 and G15"
platform/x86: toshiba_acpi: Fix missing error code in toshiba_acpi_setup_keyboard()
nvme-pci: fix var. type for increasing cq_head
nvmet-fc: do not check for invalid target port in nvmet_fc_handle_fcp_rqst()
EDAC/Intel: Do not load EDAC driver when running as a guest
PCI: hv: Add check for hyperv_initialized in init_hv_pci_drv()
cifs: improve fallocate emulation
ACPI: EC: trust DSDT GPE for certain HP laptop
clocksource: Retry clock read if long delays detected
clocksource: Check per-CPU clock synchronization when marked unstable
tpm_tis_spi: add missing SPI device ID entries
ACPI: tables: Add custom DSDT file as makefile prerequisite
HID: wacom: Correct base usage for capacitive ExpressKey status bits
cifs: fix missing spinlock around update to ses->status
mailbox: qcom: Use PLATFORM_DEVID_AUTO to register platform device
block: fix discard request merge
kthread_worker: fix return value when kthread_mod_delayed_work() races with kthread_cancel_delayed_work_sync()
ia64: mca_drv: fix incorrect array size calculation
writeback, cgroup: increment isw_nr_in_flight before grabbing an inode
spi: Allow to have all native CSs in use along with GPIOs
spi: Avoid undefined behaviour when counting unused native CSs
media: venus: Rework error fail recover logic
media: s5p_cec: decrement usage count if disabled
media: hantro: do a PM resume earlier
crypto: ixp4xx - dma_unmap the correct address
crypto: ixp4xx - update IV after requests
crypto: ux500 - Fix error return code in hash_hw_final()
sata_highbank: fix deferred probing
pata_rb532_cf: fix deferred probing
media: I2C: change 'RST' to "RSET" to fix multiple build errors
sched/uclamp: Fix wrong implementation of cpu.uclamp.min
sched/uclamp: Fix locking around cpu_util_update_eff()
kbuild: Fix objtool dependency for 'OBJECT_FILES_NON_STANDARD_<obj> := n'
pata_octeon_cf: avoid WARN_ON() in ata_host_activate()
evm: fix writing <securityfs>/evm overflow
x86/elf: Use _BITUL() macro in UAPI headers
crypto: sa2ul - Fix leaks on failure paths with sa_dma_init()
crypto: sa2ul - Fix pm_runtime enable in sa_ul_probe()
crypto: ccp - Fix a resource leak in an error handling path
media: rc: i2c: Fix an error message
pata_ep93xx: fix deferred probing
locking/lockdep: Reduce LOCKDEP dependency list
media: rkvdec: Fix .buf_prepare
media: exynos4-is: Fix a use after free in isp_video_release
media: au0828: fix a NULL vs IS_ERR() check
media: tc358743: Fix error return code in tc358743_probe_of()
media: gspca/gl860: fix zero-length control requests
m68k: atari: Fix ATARI_KBD_CORE kconfig unmet dependency warning
media: siano: Fix out-of-bounds warnings in smscore_load_firmware_family2()
regulator: fan53880: Fix vsel_mask setting for FAN53880_BUCK
crypto: nitrox - fix unchecked variable in nitrox_register_interrupts
crypto: omap-sham - Fix PM reference leak in omap sham ops
crypto: x86/curve25519 - fix cpu feature checking logic in mod_exit
crypto: sm2 - remove unnecessary reset operations
crypto: sm2 - fix a memory leak in sm2
mmc: usdhi6rol0: fix error return code in usdhi6_probe()
arm64: consistently use reserved_pg_dir
arm64/mm: Fix ttbr0 values stored in struct thread_info for software-pan
media: subdev: remove VIDIOC_DQEVENT_TIME32 handling
media: s5p-g2d: Fix a memory leak on ctx->fh.m2m_ctx
hwmon: (lm70) Use device_get_match_data()
hwmon: (lm70) Revert "hwmon: (lm70) Add support for ACPI"
hwmon: (max31722) Remove non-standard ACPI device IDs
hwmon: (max31790) Fix fan speed reporting for fan7..12
KVM: nVMX: Sync all PGDs on nested transition with shadow paging
KVM: nVMX: Ensure 64-bit shift when checking VMFUNC bitmap
KVM: nVMX: Don't clobber nested MMU's A/D status on EPTP switch
KVM: x86/mmu: Fix return value in tdp_mmu_map_handle_target_level()
perf/arm-cmn: Fix invalid pointer when access dtc object sharing the same IRQ number
KVM: arm64: Don't zero the cycle count register when PMCR_EL0.P is set
regulator: hi655x: Fix pass wrong pointer to config.driver_data
btrfs: clear log tree recovering status if starting transaction fails
x86/sev: Make sure IRQs are disabled while GHCB is active
x86/sev: Split up runtime #VC handler for correct state tracking
sched/rt: Fix RT utilization tracking during policy change
sched/rt: Fix Deadline utilization tracking during policy change
sched/uclamp: Fix uclamp_tg_restrict()
lockdep: Fix wait-type for empty stack
lockdep/selftests: Fix selftests vs PROVE_RAW_LOCK_NESTING
spi: spi-sun6i: Fix chipselect/clock bug
crypto: nx - Fix RCU warning in nx842_OF_upd_status
psi: Fix race between psi_trigger_create/destroy
media: v4l2-async: Clean v4l2_async_notifier_add_fwnode_remote_subdev
media: video-mux: Skip dangling endpoints
PM / devfreq: Add missing error code in devfreq_add_device()
ACPI: PM / fan: Put fan device IDs into separate header file
block: avoid double io accounting for flush request
nvme-pci: look for StorageD3Enable on companion ACPI device instead
ACPI: sysfs: Fix a buffer overrun problem with description_show()
mark pstore-blk as broken
clocksource/drivers/timer-ti-dm: Save and restore timer TIOCP_CFG
extcon: extcon-max8997: Fix IRQ freeing at error path
ACPI: APEI: fix synchronous external aborts in user-mode
blk-wbt: introduce a new disable state to prevent false positive by rwb_enabled()
blk-wbt: make sure throttle is enabled properly
ACPI: Use DEVICE_ATTR_<RW|RO|WO> macros
ACPI: bgrt: Fix CFI violation
cpufreq: Make cpufreq_online() call driver->offline() on errors
blk-mq: update hctx->dispatch_busy in case of real scheduler
ocfs2: fix snprintf() checking
dax: fix ENOMEM handling in grab_mapping_entry()
mm/debug_vm_pgtable/basic: add validation for dirtiness after write protect
mm/debug_vm_pgtable/basic: iterate over entire protection_map[]
mm/debug_vm_pgtable: ensure THP availability via has_transparent_hugepage()
swap: fix do_swap_page() race with swapoff
mm/shmem: fix shmem_swapin() race with swapoff
mm: memcg/slab: properly set up gfp flags for objcg pointer array
mm: page_alloc: refactor setup_per_zone_lowmem_reserve()
mm/page_alloc: fix counting of managed_pages
xfrm: xfrm_state_mtu should return at least 1280 for ipv6
drm/bridge/sii8620: fix dependency on extcon
drm/bridge: Fix the stop condition of drm_bridge_chain_pre_enable()
drm/amd/dc: Fix a missing check bug in dm_dp_mst_detect()
drm/ast: Fix missing conversions to managed API
video: fbdev: imxfb: Fix an error message
net: mvpp2: Put fwnode in error case during ->probe()
net: pch_gbe: Propagate error from devm_gpio_request_one()
pinctrl: renesas: r8a7796: Add missing bias for PRESET# pin
pinctrl: renesas: r8a77990: JTAG pins do not have pull-down capabilities
drm/vmwgfx: Mark a surface gpu-dirty after the SVGA3dCmdDXGenMips command
drm/vmwgfx: Fix cpu updates of coherent multisample surfaces
net: qrtr: ns: Fix error return code in qrtr_ns_init()
clk: meson: g12a: fix gp0 and hifi ranges
net: ftgmac100: add missing error return code in ftgmac100_probe()
drm: rockchip: set alpha_en to 0 if it is not used
drm/rockchip: cdn-dp-core: add missing clk_disable_unprepare() on error in cdn_dp_grf_write()
drm/rockchip: dsi: move all lane config except LCDC mux to bind()
drm/rockchip: lvds: Fix an error handling path
drm/rockchip: cdn-dp: fix sign extension on an int multiply for a u64 result
mptcp: fix pr_debug in mptcp_token_new_connect
mptcp: generate subflow hmac after mptcp_finish_join()
RDMA/srp: Fix a recently introduced memory leak
RDMA/rtrs-clt: Check state of the rtrs_clt_sess before reading its stats
RDMA/rtrs: Do not reset hb_missed_max after re-connection
RDMA/rtrs-srv: Fix memory leak of unfreed rtrs_srv_stats object
RDMA/rtrs-srv: Fix memory leak when having multiple sessions
RDMA/rtrs-clt: Check if the queue_depth has changed during a reconnection
RDMA/rtrs-clt: Fix memory leak of not-freed sess->stats and stats->pcpu_stats
ehea: fix error return code in ehea_restart_qps()
clk: tegra30: Use 300MHz for video decoder by default
xfrm: remove the fragment check for ipv6 beet mode
net/sched: act_vlan: Fix modify to allow 0
RDMA/core: Sanitize WQ state received from the userspace
drm/pl111: depend on CONFIG_VEXPRESS_CONFIG
RDMA/rxe: Fix failure during driver load
drm/pl111: Actually fix CONFIG_VEXPRESS_CONFIG depends
drm/vc4: hdmi: Fix error path of hpd-gpios
clk: vc5: fix output disabling when enabling a FOD
drm: qxl: ensure surf.data is ininitialized
tools/bpftool: Fix error return code in do_batch()
ath10k: go to path err_unsupported when chip id is not supported
ath10k: add missing error return code in ath10k_pci_probe()
wireless: carl9170: fix LEDS build errors & warnings
ieee802154: hwsim: Fix possible memory leak in hwsim_subscribe_all_others
clk: imx8mq: remove SYS PLL 1/2 clock gates
wcn36xx: Move hal_buf allocation to devm_kmalloc in probe
ssb: Fix error return code in ssb_bus_scan()
brcmfmac: fix setting of station info chains bitmask
brcmfmac: correctly report average RSSI in station info
brcmfmac: Fix a double-free in brcmf_sdio_bus_reset
brcmsmac: mac80211_if: Fix a resource leak in an error handling path
cw1200: Revert unnecessary patches that fix unreal use-after-free bugs
ath11k: Fix an error handling path in ath11k_core_fetch_board_data_api_n()
ath10k: Fix an error code in ath10k_add_interface()
ath11k: send beacon template after vdev_start/restart during csa
netlabel: Fix memory leak in netlbl_mgmt_add_common
RDMA/mlx5: Don't add slave port to unaffiliated list
netfilter: nft_exthdr: check for IPv6 packet before further processing
netfilter: nft_osf: check for TCP packet before further processing
netfilter: nft_tproxy: restrict support to TCP and UDP transport protocols
RDMA/rxe: Fix qp reference counting for atomic ops
selftests/bpf: Whitelist test_progs.h from .gitignore
xsk: Fix missing validation for skb and unaligned mode
xsk: Fix broken Tx ring validation
bpf: Fix libelf endian handling in resolv_btfids
RDMA/rtrs-srv: Set minimal max_send_wr and max_recv_wr
samples/bpf: Fix Segmentation fault for xdp_redirect command
samples/bpf: Fix the error return code of xdp_redirect's main()
mt76: fix possible NULL pointer dereference in mt76_tx
mt76: mt7615: fix NULL pointer dereference in tx_prepare_skb()
net: ethernet: aeroflex: fix UAF in greth_of_remove
net: ethernet: ezchip: fix UAF in nps_enet_remove
net: ethernet: ezchip: fix error handling
vrf: do not push non-ND strict packets with a source LLA through packet taps again
net: sched: add barrier to ensure correct ordering for lockless qdisc
tls: prevent oversized sendfile() hangs by ignoring MSG_MORE
netfilter: nf_tables_offload: check FLOW_DISSECTOR_KEY_BASIC in VLAN transfer logic
pkt_sched: sch_qfq: fix qfq_change_class() error path
xfrm: Fix xfrm offload fallback fail case
iwlwifi: increase PNVM load timeout
rtw88: 8822c: fix lc calibration timing
vxlan: add missing rcu_read_lock() in neigh_reduce()
ip6_tunnel: fix GRE6 segmentation
net/ipv4: swap flow ports when validating source
net: ti: am65-cpsw-nuss: Fix crash when changing number of TX queues
tc-testing: fix list handling
ieee802154: hwsim: Fix memory leak in hwsim_add_one
ieee802154: hwsim: avoid possible crash in hwsim_del_edge_nl()
bpf: Fix null ptr deref with mixed tail calls and subprogs
drm/msm: Fix error return code in msm_drm_init()
drm/msm/dpu: Fix error return code in dpu_mdss_init()
mac80211: remove iwlwifi specific workaround NDPs of null_response
net: bcmgenet: Fix attaching to PYH failed on RPi 4B
ipv6: exthdrs: do not blindly use init_net
can: j1939: j1939_sk_setsockopt(): prevent allocation of j1939 filter for optlen == 0
bpf: Do not change gso_size during bpf_skb_change_proto()
i40e: Fix error handling in i40e_vsi_open
i40e: Fix autoneg disabling for non-10GBaseT links
i40e: Fix missing rtnl locking when setting up pf switch
Revert "ibmvnic: remove duplicate napi_schedule call in open function"
ibmvnic: set ltb->buff to NULL after freeing
ibmvnic: free tx_pool if tso_pool alloc fails
RDMA/cma: Protect RMW with qp_mutex
net: macsec: fix the length used to copy the key for offloading
net: phy: mscc: fix macsec key length
net: atlantic: fix the macsec key length
ipv6: fix out-of-bound access in ip6_parse_tlv()
e1000e: Check the PCIm state
net: dsa: sja1105: fix NULL pointer dereference in sja1105_reload_cbs()
bpfilter: Specify the log level for the kmsg message
RDMA/cma: Fix incorrect Packet Lifetime calculation
gve: Fix swapped vars when fetching max queues
Revert "be2net: disable bh with spin_lock in be_process_mcc"
Bluetooth: mgmt: Fix slab-out-of-bounds in tlv_data_is_valid
Bluetooth: Fix not sending Set Extended Scan Response
Bluetooth: Fix Set Extended (Scan Response) Data
Bluetooth: Fix handling of HCI_LE_Advertising_Set_Terminated event
clk: actions: Fix UART clock dividers on Owl S500 SoC
clk: actions: Fix SD clocks factor table on Owl S500 SoC
clk: actions: Fix bisp_factor_table based clocks on Owl S500 SoC
clk: actions: Fix AHPPREDIV-H-AHB clock chain on Owl S500 SoC
clk: qcom: clk-alpha-pll: fix CAL_L write in alpha_pll_fabia_prepare
clk: si5341: Wait for DEVICE_READY on startup
clk: si5341: Avoid divide errors due to bogus register contents
clk: si5341: Check for input clock presence and PLL lock on startup
clk: si5341: Update initialization magic
writeback: fix obtain a reference to a freeing memcg css
net: lwtunnel: handle MTU calculation in forwading
net: sched: fix warning in tcindex_alloc_perfect_hash
net: tipc: fix FB_MTU eat two pages
RDMA/mlx5: Don't access NULL-cleared mpi pointer
RDMA/core: Always release restrack object
MIPS: Fix PKMAP with 32-bit MIPS huge page support
staging: fbtft: Rectify GPIO handling
staging: fbtft: Don't spam logs when probe is deferred
ASoC: rt5682: Disable irq on shutdown
rcu: Invoke rcu_spawn_core_kthreads() from rcu_spawn_gp_kthread()
serial: fsl_lpuart: don't modify arbitrary data on lpuart32
serial: fsl_lpuart: remove RTSCTS handling from get_mctrl()
serial: 8250_omap: fix a timeout loop condition
tty: nozomi: Fix a resource leak in an error handling function
mwifiex: re-fix for unaligned accesses
iio: adis_buffer: do not return ints in irq handlers
iio: adis16400: do not return ints in irq handlers
iio: adis16475: do not return ints in irq handlers
iio: accel: bma180: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
iio: accel: bma220: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
iio: accel: hid: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
iio: accel: kxcjk-1013: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
iio: accel: mxc4005: Fix overread of data and alignment issue.
iio: accel: stk8312: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
iio: accel: stk8ba50: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
iio: adc: ti-ads1015: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
iio: adc: vf610: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
iio: gyro: bmg160: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
iio: humidity: am2315: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
iio: prox: srf08: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
iio: prox: pulsed-light: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
iio: prox: as3935: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
iio: magn: hmc5843: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
iio: magn: bmc150: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
iio: light: isl29125: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
iio: light: tcs3414: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
iio: light: tcs3472: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
iio: chemical: atlas: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
iio: cros_ec_sensors: Fix alignment of buffer in iio_push_to_buffers_with_timestamp()
iio: potentiostat: lmp91000: Fix alignment of buffer in iio_push_to_buffers_with_timestamp()
ASoC: rk3328: fix missing clk_disable_unprepare() on error in rk3328_platform_probe()
ASoC: hisilicon: fix missing clk_disable_unprepare() on error in hi6210_i2s_startup()
backlight: lm3630a_bl: Put fwnode in error case during ->probe()
ASoC: rsnd: tidyup loop on rsnd_adg_clk_query()
Input: hil_kbd - fix error return code in hil_dev_connect()
perf scripting python: Fix tuple_set_u64()
mtd: partitions: redboot: seek fis-index-block in the right node
mtd: rawnand: arasan: Ensure proper configuration for the asserted target
staging: mmal-vchiq: Fix incorrect static vchiq_instance.
char: pcmcia: error out if 'num_bytes_read' is greater than 4 in set_protocol()
firmware: stratix10-svc: Fix a resource leak in an error handling path
tty: nozomi: Fix the error handling path of 'nozomi_card_init()'
leds: class: The -ENOTSUPP should never be seen by user space
leds: lm3532: select regmap I2C API
leds: lm36274: Put fwnode in error case during ->probe()
leds: lm3692x: Put fwnode in any case during ->probe()
leds: lm3697: Don't spam logs when probe is deferred
leds: lp50xx: Put fwnode in error case during ->probe()
scsi: FlashPoint: Rename si_flags field
scsi: iscsi: Flush block work before unblock
mfd: mp2629: Select MFD_CORE to fix build error
mfd: rn5t618: Fix IRQ trigger by changing it to level mode
fsi: core: Fix return of error values on failures
fsi: scom: Reset the FSI2PIB engine for any error
fsi: occ: Don't accept response from un-initialized OCC
fsi/sbefifo: Clean up correct FIFO when receiving reset request from SBE
fsi/sbefifo: Fix reset timeout
visorbus: fix error return code in visorchipset_init()
iommu/amd: Fix extended features logging
s390/irq: select HAVE_IRQ_EXIT_ON_IRQ_STACK
s390: enable HAVE_IOREMAP_PROT
s390: appldata depends on PROC_SYSCTL
selftests: splice: Adjust for handler fallback removal
iommu/dma: Fix IOVA reserve dma ranges
ASoC: max98373-sdw: use first_hw_init flag on resume
ASoC: rt1308-sdw: use first_hw_init flag on resume
ASoC: rt5682-sdw: use first_hw_init flag on resume
ASoC: rt700-sdw: use first_hw_init flag on resume
ASoC: rt711-sdw: use first_hw_init flag on resume
ASoC: rt715-sdw: use first_hw_init flag on resume
ASoC: rt5682: fix getting the wrong device id when the suspend_stress_test
ASoC: rt5682-sdw: set regcache_cache_only false before reading RT5682_DEVICE_ID
ASoC: mediatek: mtk-btcvsd: Fix an error handling path in 'mtk_btcvsd_snd_probe()'
usb: gadget: f_fs: Fix setting of device and driver data cross-references
usb: dwc2: Don't reset the core after setting turnaround time
eeprom: idt_89hpesx: Put fwnode in matching case during ->probe()
eeprom: idt_89hpesx: Restore printing the unsupported fwnode name
thunderbolt: Bond lanes only when dual_link_port != NULL in alloc_dev_default()
iio: adc: at91-sama5d2: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
iio: adc: hx711: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
iio: adc: mxs-lradc: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
iio: adc: ti-ads8688: Fix alignment of buffer in iio_push_to_buffers_with_timestamp()
iio: magn: rm3100: Fix alignment of buffer in iio_push_to_buffers_with_timestamp()
iio: light: vcnl4000: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
ASoC: fsl_spdif: Fix error handler with pm_runtime_enable
staging: gdm724x: check for buffer overflow in gdm_lte_multi_sdu_pkt()
staging: gdm724x: check for overflow in gdm_lte_netif_rx()
staging: rtl8712: fix error handling in r871xu_drv_init
staging: rtl8712: fix memory leak in rtl871x_load_fw_cb
coresight: core: Fix use of uninitialized pointer
staging: mt7621-dts: fix pci address for PCI memory range
serial: 8250: Actually allow UPF_MAGIC_MULTIPLIER baud rates
iio: light: vcnl4035: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
iio: prox: isl29501: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
ASoC: cs42l42: Correct definition of CS42L42_ADC_PDN_MASK
of: Fix truncation of memory sizes on 32-bit platforms
mtd: rawnand: marvell: add missing clk_disable_unprepare() on error in marvell_nfc_resume()
habanalabs: Fix an error handling path in 'hl_pci_probe()'
scsi: mpt3sas: Fix error return value in _scsih_expander_add()
soundwire: stream: Fix test for DP prepare complete
phy: uniphier-pcie: Fix updating phy parameters
phy: ti: dm816x: Fix the error handling path in 'dm816x_usb_phy_probe()
extcon: sm5502: Drop invalid register write in sm5502_reg_data
extcon: max8997: Add missing modalias string
powerpc/powernv: Fix machine check reporting of async store errors
ASoC: atmel-i2s: Fix usage of capture and playback at the same time
configfs: fix memleak in configfs_release_bin_file
ASoC: Intel: sof_sdw: add SOF_RT715_DAI_ID_FIX for AlderLake
ASoC: fsl_spdif: Fix unexpected interrupt after suspend
leds: as3645a: Fix error return code in as3645a_parse_node()
leds: ktd2692: Fix an error handling path
selftests/ftrace: fix event-no-pid on 1-core machine
serial: 8250: 8250_omap: Disable RX interrupt after DMA enable
serial: 8250: 8250_omap: Fix possible interrupt storm on K3 SoCs
powerpc: Offline CPU in stop_this_cpu()
powerpc/papr_scm: Properly handle UUID types and API
powerpc/64s: Fix copy-paste data exposure into newly created tasks
powerpc/papr_scm: Make 'perf_stats' invisible if perf-stats unavailable
ALSA: firewire-lib: Fix 'amdtp_domain_start()' when no AMDTP_OUT_STREAM stream is found
serial: mvebu-uart: do not allow changing baudrate when uartclk is not available
serial: mvebu-uart: correctly calculate minimal possible baudrate
arm64: dts: marvell: armada-37xx: Fix reg for standard variant of UART
vfio/pci: Handle concurrent vma faults
mm/pmem: avoid inserting hugepage PTE entry with fsdax if hugepage support is disabled
mm/huge_memory.c: remove dedicated macro HPAGE_CACHE_INDEX_MASK
mm/huge_memory.c: add missing read-only THP checking in transparent_hugepage_enabled()
mm/huge_memory.c: don't discard hugepage if other processes are mapping it
mm/hugetlb: use helper huge_page_order and pages_per_huge_page
mm/hugetlb: remove redundant check in preparing and destroying gigantic page
hugetlb: remove prep_compound_huge_page cleanup
include/linux/huge_mm.h: remove extern keyword
mm/z3fold: fix potential memory leak in z3fold_destroy_pool()
mm/z3fold: use release_z3fold_page_locked() to release locked z3fold page
lib/math/rational.c: fix divide by zero
selftests/vm/pkeys: fix alloc_random_pkey() to make it really, really random
selftests/vm/pkeys: handle negative sys_pkey_alloc() return code
selftests/vm/pkeys: refill shadow register after implicit kernel write
perf llvm: Return -ENOMEM when asprintf() fails
csky: fix syscache.c fallthrough warning
csky: syscache: Fixup duplicate cache flush
exfat: handle wrong stream entry size in exfat_readdir()
scsi: fc: Correct RHBA attributes length
scsi: target: cxgbit: Unmap DMA buffer before calling target_execute_cmd()
mailbox: qcom-ipcc: Fix IPCC mbox channel exhaustion
fscrypt: don't ignore minor_hash when hash is 0
fscrypt: fix derivation of SipHash keys on big endian CPUs
tpm: Replace WARN_ONCE() with dev_err_once() in tpm_tis_status()
erofs: fix error return code in erofs_read_superblock()
block: return the correct bvec when checking for gaps
io_uring: fix blocking inline submission
mmc: block: Disable CMDQ on the ioctl path
mmc: vub3000: fix control-request direction
media: exynos4-is: remove a now unused integer
scsi: core: Retry I/O for Notify (Enable Spinup) Required error
crypto: qce - fix error return code in qce_skcipher_async_req_handle()
s390: preempt: Fix preempt_count initialization
cred: add missing return error code when set_cred_ucounts() failed
iommu/dma: Fix compile warning in 32-bit builds
powerpc/preempt: Don't touch the idle task's preempt_count during hotplug
Linux 5.10.50
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Change-Id: Iec4eab24ea8eb5a6d79739a1aec8432d93a8f82c
5388 lines
142 KiB
C
5388 lines
142 KiB
C
// SPDX-License-Identifier: GPL-2.0+
|
|
/*
|
|
* Amlogic Meson-G12A Clock Controller Driver
|
|
*
|
|
* Copyright (c) 2016 Baylibre SAS.
|
|
* Author: Michael Turquette <mturquette@baylibre.com>
|
|
*
|
|
* Copyright (c) 2018 Amlogic, inc.
|
|
* Author: Qiufang Dai <qiufang.dai@amlogic.com>
|
|
* Author: Jian Hu <jian.hu@amlogic.com>
|
|
*/
|
|
|
|
#include <linux/clk-provider.h>
|
|
#include <linux/init.h>
|
|
#include <linux/of_device.h>
|
|
#include <linux/platform_device.h>
|
|
#include <linux/clk.h>
|
|
#include <linux/module.h>
|
|
|
|
#include "clk-mpll.h"
|
|
#include "clk-pll.h"
|
|
#include "clk-regmap.h"
|
|
#include "clk-cpu-dyndiv.h"
|
|
#include "vid-pll-div.h"
|
|
#include "meson-eeclk.h"
|
|
#include "g12a.h"
|
|
|
|
static DEFINE_SPINLOCK(meson_clk_lock);
|
|
|
|
static struct clk_regmap g12a_fixed_pll_dco = {
|
|
.data = &(struct meson_clk_pll_data){
|
|
.en = {
|
|
.reg_off = HHI_FIX_PLL_CNTL0,
|
|
.shift = 28,
|
|
.width = 1,
|
|
},
|
|
.m = {
|
|
.reg_off = HHI_FIX_PLL_CNTL0,
|
|
.shift = 0,
|
|
.width = 8,
|
|
},
|
|
.n = {
|
|
.reg_off = HHI_FIX_PLL_CNTL0,
|
|
.shift = 10,
|
|
.width = 5,
|
|
},
|
|
.frac = {
|
|
.reg_off = HHI_FIX_PLL_CNTL1,
|
|
.shift = 0,
|
|
.width = 17,
|
|
},
|
|
.l = {
|
|
.reg_off = HHI_FIX_PLL_CNTL0,
|
|
.shift = 31,
|
|
.width = 1,
|
|
},
|
|
.rst = {
|
|
.reg_off = HHI_FIX_PLL_CNTL0,
|
|
.shift = 29,
|
|
.width = 1,
|
|
},
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "fixed_pll_dco",
|
|
.ops = &meson_clk_pll_ro_ops,
|
|
.parent_data = &(const struct clk_parent_data) {
|
|
.fw_name = "xtal",
|
|
},
|
|
.num_parents = 1,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_fixed_pll = {
|
|
.data = &(struct clk_regmap_div_data){
|
|
.offset = HHI_FIX_PLL_CNTL0,
|
|
.shift = 16,
|
|
.width = 2,
|
|
.flags = CLK_DIVIDER_POWER_OF_TWO,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "fixed_pll",
|
|
.ops = &clk_regmap_divider_ro_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_fixed_pll_dco.hw
|
|
},
|
|
.num_parents = 1,
|
|
/*
|
|
* This clock won't ever change at runtime so
|
|
* CLK_SET_RATE_PARENT is not required
|
|
*/
|
|
},
|
|
};
|
|
|
|
static const struct pll_mult_range g12a_sys_pll_mult_range = {
|
|
.min = 128,
|
|
.max = 250,
|
|
};
|
|
|
|
static struct clk_regmap g12a_sys_pll_dco = {
|
|
.data = &(struct meson_clk_pll_data){
|
|
.en = {
|
|
.reg_off = HHI_SYS_PLL_CNTL0,
|
|
.shift = 28,
|
|
.width = 1,
|
|
},
|
|
.m = {
|
|
.reg_off = HHI_SYS_PLL_CNTL0,
|
|
.shift = 0,
|
|
.width = 8,
|
|
},
|
|
.n = {
|
|
.reg_off = HHI_SYS_PLL_CNTL0,
|
|
.shift = 10,
|
|
.width = 5,
|
|
},
|
|
.l = {
|
|
.reg_off = HHI_SYS_PLL_CNTL0,
|
|
.shift = 31,
|
|
.width = 1,
|
|
},
|
|
.rst = {
|
|
.reg_off = HHI_SYS_PLL_CNTL0,
|
|
.shift = 29,
|
|
.width = 1,
|
|
},
|
|
.range = &g12a_sys_pll_mult_range,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "sys_pll_dco",
|
|
.ops = &meson_clk_pll_ops,
|
|
.parent_data = &(const struct clk_parent_data) {
|
|
.fw_name = "xtal",
|
|
},
|
|
.num_parents = 1,
|
|
/* This clock feeds the CPU, avoid disabling it */
|
|
.flags = CLK_IS_CRITICAL,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_sys_pll = {
|
|
.data = &(struct clk_regmap_div_data){
|
|
.offset = HHI_SYS_PLL_CNTL0,
|
|
.shift = 16,
|
|
.width = 3,
|
|
.flags = CLK_DIVIDER_POWER_OF_TWO,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "sys_pll",
|
|
.ops = &clk_regmap_divider_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_sys_pll_dco.hw
|
|
},
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12b_sys1_pll_dco = {
|
|
.data = &(struct meson_clk_pll_data){
|
|
.en = {
|
|
.reg_off = HHI_SYS1_PLL_CNTL0,
|
|
.shift = 28,
|
|
.width = 1,
|
|
},
|
|
.m = {
|
|
.reg_off = HHI_SYS1_PLL_CNTL0,
|
|
.shift = 0,
|
|
.width = 8,
|
|
},
|
|
.n = {
|
|
.reg_off = HHI_SYS1_PLL_CNTL0,
|
|
.shift = 10,
|
|
.width = 5,
|
|
},
|
|
.l = {
|
|
.reg_off = HHI_SYS1_PLL_CNTL0,
|
|
.shift = 31,
|
|
.width = 1,
|
|
},
|
|
.rst = {
|
|
.reg_off = HHI_SYS1_PLL_CNTL0,
|
|
.shift = 29,
|
|
.width = 1,
|
|
},
|
|
.range = &g12a_sys_pll_mult_range,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "sys1_pll_dco",
|
|
.ops = &meson_clk_pll_ops,
|
|
.parent_data = &(const struct clk_parent_data) {
|
|
.fw_name = "xtal",
|
|
},
|
|
.num_parents = 1,
|
|
/* This clock feeds the CPU, avoid disabling it */
|
|
.flags = CLK_IS_CRITICAL,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12b_sys1_pll = {
|
|
.data = &(struct clk_regmap_div_data){
|
|
.offset = HHI_SYS1_PLL_CNTL0,
|
|
.shift = 16,
|
|
.width = 3,
|
|
.flags = CLK_DIVIDER_POWER_OF_TWO,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "sys1_pll",
|
|
.ops = &clk_regmap_divider_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12b_sys1_pll_dco.hw
|
|
},
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_sys_pll_div16_en = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_SYS_CPU_CLK_CNTL1,
|
|
.bit_idx = 24,
|
|
},
|
|
.hw.init = &(struct clk_init_data) {
|
|
.name = "sys_pll_div16_en",
|
|
.ops = &clk_regmap_gate_ro_ops,
|
|
.parent_hws = (const struct clk_hw *[]) { &g12a_sys_pll.hw },
|
|
.num_parents = 1,
|
|
/*
|
|
* This clock is used to debug the sys_pll range
|
|
* Linux should not change it at runtime
|
|
*/
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12b_sys1_pll_div16_en = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_SYS_CPUB_CLK_CNTL1,
|
|
.bit_idx = 24,
|
|
},
|
|
.hw.init = &(struct clk_init_data) {
|
|
.name = "sys1_pll_div16_en",
|
|
.ops = &clk_regmap_gate_ro_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12b_sys1_pll.hw
|
|
},
|
|
.num_parents = 1,
|
|
/*
|
|
* This clock is used to debug the sys_pll range
|
|
* Linux should not change it at runtime
|
|
*/
|
|
},
|
|
};
|
|
|
|
static struct clk_fixed_factor g12a_sys_pll_div16 = {
|
|
.mult = 1,
|
|
.div = 16,
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "sys_pll_div16",
|
|
.ops = &clk_fixed_factor_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_sys_pll_div16_en.hw
|
|
},
|
|
.num_parents = 1,
|
|
},
|
|
};
|
|
|
|
static struct clk_fixed_factor g12b_sys1_pll_div16 = {
|
|
.mult = 1,
|
|
.div = 16,
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "sys1_pll_div16",
|
|
.ops = &clk_fixed_factor_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12b_sys1_pll_div16_en.hw
|
|
},
|
|
.num_parents = 1,
|
|
},
|
|
};
|
|
|
|
static struct clk_fixed_factor g12a_fclk_div2_div = {
|
|
.mult = 1,
|
|
.div = 2,
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "fclk_div2_div",
|
|
.ops = &clk_fixed_factor_ops,
|
|
.parent_hws = (const struct clk_hw *[]) { &g12a_fixed_pll.hw },
|
|
.num_parents = 1,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_fclk_div2 = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_FIX_PLL_CNTL1,
|
|
.bit_idx = 24,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "fclk_div2",
|
|
.ops = &clk_regmap_gate_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_fclk_div2_div.hw
|
|
},
|
|
.num_parents = 1,
|
|
/*
|
|
* Similar to fclk_div3, it seems that this clock is used by
|
|
* the resident firmware and is required by the platform to
|
|
* operate correctly.
|
|
* Until the following condition are met, we need this clock to
|
|
* be marked as critical:
|
|
* a) Mark the clock used by a firmware resource, if possible
|
|
* b) CCF has a clock hand-off mechanism to make the sure the
|
|
* clock stays on until the proper driver comes along
|
|
*/
|
|
.flags = CLK_IS_CRITICAL,
|
|
},
|
|
};
|
|
|
|
static struct clk_fixed_factor g12a_fclk_div3_div = {
|
|
.mult = 1,
|
|
.div = 3,
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "fclk_div3_div",
|
|
.ops = &clk_fixed_factor_ops,
|
|
.parent_hws = (const struct clk_hw *[]) { &g12a_fixed_pll.hw },
|
|
.num_parents = 1,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_fclk_div3 = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_FIX_PLL_CNTL1,
|
|
.bit_idx = 20,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "fclk_div3",
|
|
.ops = &clk_regmap_gate_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_fclk_div3_div.hw
|
|
},
|
|
.num_parents = 1,
|
|
/*
|
|
* This clock is used by the resident firmware and is required
|
|
* by the platform to operate correctly.
|
|
* Until the following condition are met, we need this clock to
|
|
* be marked as critical:
|
|
* a) Mark the clock used by a firmware resource, if possible
|
|
* b) CCF has a clock hand-off mechanism to make the sure the
|
|
* clock stays on until the proper driver comes along
|
|
*/
|
|
.flags = CLK_IS_CRITICAL,
|
|
},
|
|
};
|
|
|
|
/* Datasheet names this field as "premux0" */
|
|
static struct clk_regmap g12a_cpu_clk_premux0 = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_SYS_CPU_CLK_CNTL0,
|
|
.mask = 0x3,
|
|
.shift = 0,
|
|
.flags = CLK_MUX_ROUND_CLOSEST,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "cpu_clk_dyn0_sel",
|
|
.ops = &clk_regmap_mux_ops,
|
|
.parent_data = (const struct clk_parent_data []) {
|
|
{ .fw_name = "xtal", },
|
|
{ .hw = &g12a_fclk_div2.hw },
|
|
{ .hw = &g12a_fclk_div3.hw },
|
|
},
|
|
.num_parents = 3,
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
/* Datasheet names this field as "premux1" */
|
|
static struct clk_regmap g12a_cpu_clk_premux1 = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_SYS_CPU_CLK_CNTL0,
|
|
.mask = 0x3,
|
|
.shift = 16,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "cpu_clk_dyn1_sel",
|
|
.ops = &clk_regmap_mux_ops,
|
|
.parent_data = (const struct clk_parent_data []) {
|
|
{ .fw_name = "xtal", },
|
|
{ .hw = &g12a_fclk_div2.hw },
|
|
{ .hw = &g12a_fclk_div3.hw },
|
|
},
|
|
.num_parents = 3,
|
|
/* This sub-tree is used a parking clock */
|
|
.flags = CLK_SET_RATE_NO_REPARENT
|
|
},
|
|
};
|
|
|
|
/* Datasheet names this field as "mux0_divn_tcnt" */
|
|
static struct clk_regmap g12a_cpu_clk_mux0_div = {
|
|
.data = &(struct meson_clk_cpu_dyndiv_data){
|
|
.div = {
|
|
.reg_off = HHI_SYS_CPU_CLK_CNTL0,
|
|
.shift = 4,
|
|
.width = 6,
|
|
},
|
|
.dyn = {
|
|
.reg_off = HHI_SYS_CPU_CLK_CNTL0,
|
|
.shift = 26,
|
|
.width = 1,
|
|
},
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "cpu_clk_dyn0_div",
|
|
.ops = &meson_clk_cpu_dyndiv_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_cpu_clk_premux0.hw
|
|
},
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
/* Datasheet names this field as "postmux0" */
|
|
static struct clk_regmap g12a_cpu_clk_postmux0 = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_SYS_CPU_CLK_CNTL0,
|
|
.mask = 0x1,
|
|
.shift = 2,
|
|
.flags = CLK_MUX_ROUND_CLOSEST,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "cpu_clk_dyn0",
|
|
.ops = &clk_regmap_mux_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_cpu_clk_premux0.hw,
|
|
&g12a_cpu_clk_mux0_div.hw,
|
|
},
|
|
.num_parents = 2,
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
/* Datasheet names this field as "Mux1_divn_tcnt" */
|
|
static struct clk_regmap g12a_cpu_clk_mux1_div = {
|
|
.data = &(struct clk_regmap_div_data){
|
|
.offset = HHI_SYS_CPU_CLK_CNTL0,
|
|
.shift = 20,
|
|
.width = 6,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "cpu_clk_dyn1_div",
|
|
.ops = &clk_regmap_divider_ro_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_cpu_clk_premux1.hw
|
|
},
|
|
.num_parents = 1,
|
|
},
|
|
};
|
|
|
|
/* Datasheet names this field as "postmux1" */
|
|
static struct clk_regmap g12a_cpu_clk_postmux1 = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_SYS_CPU_CLK_CNTL0,
|
|
.mask = 0x1,
|
|
.shift = 18,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "cpu_clk_dyn1",
|
|
.ops = &clk_regmap_mux_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_cpu_clk_premux1.hw,
|
|
&g12a_cpu_clk_mux1_div.hw,
|
|
},
|
|
.num_parents = 2,
|
|
/* This sub-tree is used a parking clock */
|
|
.flags = CLK_SET_RATE_NO_REPARENT,
|
|
},
|
|
};
|
|
|
|
/* Datasheet names this field as "Final_dyn_mux_sel" */
|
|
static struct clk_regmap g12a_cpu_clk_dyn = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_SYS_CPU_CLK_CNTL0,
|
|
.mask = 0x1,
|
|
.shift = 10,
|
|
.flags = CLK_MUX_ROUND_CLOSEST,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "cpu_clk_dyn",
|
|
.ops = &clk_regmap_mux_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_cpu_clk_postmux0.hw,
|
|
&g12a_cpu_clk_postmux1.hw,
|
|
},
|
|
.num_parents = 2,
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
/* Datasheet names this field as "Final_mux_sel" */
|
|
static struct clk_regmap g12a_cpu_clk = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_SYS_CPU_CLK_CNTL0,
|
|
.mask = 0x1,
|
|
.shift = 11,
|
|
.flags = CLK_MUX_ROUND_CLOSEST,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "cpu_clk",
|
|
.ops = &clk_regmap_mux_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_cpu_clk_dyn.hw,
|
|
&g12a_sys_pll.hw,
|
|
},
|
|
.num_parents = 2,
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
/* Datasheet names this field as "Final_mux_sel" */
|
|
static struct clk_regmap g12b_cpu_clk = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_SYS_CPU_CLK_CNTL0,
|
|
.mask = 0x1,
|
|
.shift = 11,
|
|
.flags = CLK_MUX_ROUND_CLOSEST,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "cpu_clk",
|
|
.ops = &clk_regmap_mux_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_cpu_clk_dyn.hw,
|
|
&g12b_sys1_pll.hw
|
|
},
|
|
.num_parents = 2,
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
/* Datasheet names this field as "premux0" */
|
|
static struct clk_regmap g12b_cpub_clk_premux0 = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_SYS_CPUB_CLK_CNTL,
|
|
.mask = 0x3,
|
|
.shift = 0,
|
|
.flags = CLK_MUX_ROUND_CLOSEST,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "cpub_clk_dyn0_sel",
|
|
.ops = &clk_regmap_mux_ops,
|
|
.parent_data = (const struct clk_parent_data []) {
|
|
{ .fw_name = "xtal", },
|
|
{ .hw = &g12a_fclk_div2.hw },
|
|
{ .hw = &g12a_fclk_div3.hw },
|
|
},
|
|
.num_parents = 3,
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
/* Datasheet names this field as "mux0_divn_tcnt" */
|
|
static struct clk_regmap g12b_cpub_clk_mux0_div = {
|
|
.data = &(struct meson_clk_cpu_dyndiv_data){
|
|
.div = {
|
|
.reg_off = HHI_SYS_CPUB_CLK_CNTL,
|
|
.shift = 4,
|
|
.width = 6,
|
|
},
|
|
.dyn = {
|
|
.reg_off = HHI_SYS_CPUB_CLK_CNTL,
|
|
.shift = 26,
|
|
.width = 1,
|
|
},
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "cpub_clk_dyn0_div",
|
|
.ops = &meson_clk_cpu_dyndiv_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12b_cpub_clk_premux0.hw
|
|
},
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
/* Datasheet names this field as "postmux0" */
|
|
static struct clk_regmap g12b_cpub_clk_postmux0 = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_SYS_CPUB_CLK_CNTL,
|
|
.mask = 0x1,
|
|
.shift = 2,
|
|
.flags = CLK_MUX_ROUND_CLOSEST,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "cpub_clk_dyn0",
|
|
.ops = &clk_regmap_mux_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12b_cpub_clk_premux0.hw,
|
|
&g12b_cpub_clk_mux0_div.hw
|
|
},
|
|
.num_parents = 2,
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
/* Datasheet names this field as "premux1" */
|
|
static struct clk_regmap g12b_cpub_clk_premux1 = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_SYS_CPUB_CLK_CNTL,
|
|
.mask = 0x3,
|
|
.shift = 16,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "cpub_clk_dyn1_sel",
|
|
.ops = &clk_regmap_mux_ops,
|
|
.parent_data = (const struct clk_parent_data []) {
|
|
{ .fw_name = "xtal", },
|
|
{ .hw = &g12a_fclk_div2.hw },
|
|
{ .hw = &g12a_fclk_div3.hw },
|
|
},
|
|
.num_parents = 3,
|
|
/* This sub-tree is used a parking clock */
|
|
.flags = CLK_SET_RATE_NO_REPARENT,
|
|
},
|
|
};
|
|
|
|
/* Datasheet names this field as "Mux1_divn_tcnt" */
|
|
static struct clk_regmap g12b_cpub_clk_mux1_div = {
|
|
.data = &(struct clk_regmap_div_data){
|
|
.offset = HHI_SYS_CPUB_CLK_CNTL,
|
|
.shift = 20,
|
|
.width = 6,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "cpub_clk_dyn1_div",
|
|
.ops = &clk_regmap_divider_ro_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12b_cpub_clk_premux1.hw
|
|
},
|
|
.num_parents = 1,
|
|
},
|
|
};
|
|
|
|
/* Datasheet names this field as "postmux1" */
|
|
static struct clk_regmap g12b_cpub_clk_postmux1 = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_SYS_CPUB_CLK_CNTL,
|
|
.mask = 0x1,
|
|
.shift = 18,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "cpub_clk_dyn1",
|
|
.ops = &clk_regmap_mux_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12b_cpub_clk_premux1.hw,
|
|
&g12b_cpub_clk_mux1_div.hw
|
|
},
|
|
.num_parents = 2,
|
|
/* This sub-tree is used a parking clock */
|
|
.flags = CLK_SET_RATE_NO_REPARENT,
|
|
},
|
|
};
|
|
|
|
/* Datasheet names this field as "Final_dyn_mux_sel" */
|
|
static struct clk_regmap g12b_cpub_clk_dyn = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_SYS_CPUB_CLK_CNTL,
|
|
.mask = 0x1,
|
|
.shift = 10,
|
|
.flags = CLK_MUX_ROUND_CLOSEST,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "cpub_clk_dyn",
|
|
.ops = &clk_regmap_mux_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12b_cpub_clk_postmux0.hw,
|
|
&g12b_cpub_clk_postmux1.hw
|
|
},
|
|
.num_parents = 2,
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
/* Datasheet names this field as "Final_mux_sel" */
|
|
static struct clk_regmap g12b_cpub_clk = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_SYS_CPUB_CLK_CNTL,
|
|
.mask = 0x1,
|
|
.shift = 11,
|
|
.flags = CLK_MUX_ROUND_CLOSEST,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "cpub_clk",
|
|
.ops = &clk_regmap_mux_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12b_cpub_clk_dyn.hw,
|
|
&g12a_sys_pll.hw
|
|
},
|
|
.num_parents = 2,
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap sm1_gp1_pll;
|
|
|
|
/* Datasheet names this field as "premux0" */
|
|
static struct clk_regmap sm1_dsu_clk_premux0 = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_SYS_CPU_CLK_CNTL5,
|
|
.mask = 0x3,
|
|
.shift = 0,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "dsu_clk_dyn0_sel",
|
|
.ops = &clk_regmap_mux_ro_ops,
|
|
.parent_data = (const struct clk_parent_data []) {
|
|
{ .fw_name = "xtal", },
|
|
{ .hw = &g12a_fclk_div2.hw },
|
|
{ .hw = &g12a_fclk_div3.hw },
|
|
{ .hw = &sm1_gp1_pll.hw },
|
|
},
|
|
.num_parents = 4,
|
|
},
|
|
};
|
|
|
|
/* Datasheet names this field as "premux1" */
|
|
static struct clk_regmap sm1_dsu_clk_premux1 = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_SYS_CPU_CLK_CNTL5,
|
|
.mask = 0x3,
|
|
.shift = 16,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "dsu_clk_dyn1_sel",
|
|
.ops = &clk_regmap_mux_ro_ops,
|
|
.parent_data = (const struct clk_parent_data []) {
|
|
{ .fw_name = "xtal", },
|
|
{ .hw = &g12a_fclk_div2.hw },
|
|
{ .hw = &g12a_fclk_div3.hw },
|
|
{ .hw = &sm1_gp1_pll.hw },
|
|
},
|
|
.num_parents = 4,
|
|
},
|
|
};
|
|
|
|
/* Datasheet names this field as "Mux0_divn_tcnt" */
|
|
static struct clk_regmap sm1_dsu_clk_mux0_div = {
|
|
.data = &(struct clk_regmap_div_data){
|
|
.offset = HHI_SYS_CPU_CLK_CNTL5,
|
|
.shift = 4,
|
|
.width = 6,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "dsu_clk_dyn0_div",
|
|
.ops = &clk_regmap_divider_ro_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&sm1_dsu_clk_premux0.hw
|
|
},
|
|
.num_parents = 1,
|
|
},
|
|
};
|
|
|
|
/* Datasheet names this field as "postmux0" */
|
|
static struct clk_regmap sm1_dsu_clk_postmux0 = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_SYS_CPU_CLK_CNTL5,
|
|
.mask = 0x1,
|
|
.shift = 2,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "dsu_clk_dyn0",
|
|
.ops = &clk_regmap_mux_ro_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&sm1_dsu_clk_premux0.hw,
|
|
&sm1_dsu_clk_mux0_div.hw,
|
|
},
|
|
.num_parents = 2,
|
|
},
|
|
};
|
|
|
|
/* Datasheet names this field as "Mux1_divn_tcnt" */
|
|
static struct clk_regmap sm1_dsu_clk_mux1_div = {
|
|
.data = &(struct clk_regmap_div_data){
|
|
.offset = HHI_SYS_CPU_CLK_CNTL5,
|
|
.shift = 20,
|
|
.width = 6,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "dsu_clk_dyn1_div",
|
|
.ops = &clk_regmap_divider_ro_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&sm1_dsu_clk_premux1.hw
|
|
},
|
|
.num_parents = 1,
|
|
},
|
|
};
|
|
|
|
/* Datasheet names this field as "postmux1" */
|
|
static struct clk_regmap sm1_dsu_clk_postmux1 = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_SYS_CPU_CLK_CNTL5,
|
|
.mask = 0x1,
|
|
.shift = 18,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "dsu_clk_dyn1",
|
|
.ops = &clk_regmap_mux_ro_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&sm1_dsu_clk_premux1.hw,
|
|
&sm1_dsu_clk_mux1_div.hw,
|
|
},
|
|
.num_parents = 2,
|
|
},
|
|
};
|
|
|
|
/* Datasheet names this field as "Final_dyn_mux_sel" */
|
|
static struct clk_regmap sm1_dsu_clk_dyn = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_SYS_CPU_CLK_CNTL5,
|
|
.mask = 0x1,
|
|
.shift = 10,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "dsu_clk_dyn",
|
|
.ops = &clk_regmap_mux_ro_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&sm1_dsu_clk_postmux0.hw,
|
|
&sm1_dsu_clk_postmux1.hw,
|
|
},
|
|
.num_parents = 2,
|
|
},
|
|
};
|
|
|
|
/* Datasheet names this field as "Final_mux_sel" */
|
|
static struct clk_regmap sm1_dsu_final_clk = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_SYS_CPU_CLK_CNTL5,
|
|
.mask = 0x1,
|
|
.shift = 11,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "dsu_clk_final",
|
|
.ops = &clk_regmap_mux_ro_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&sm1_dsu_clk_dyn.hw,
|
|
&g12a_sys_pll.hw,
|
|
},
|
|
.num_parents = 2,
|
|
},
|
|
};
|
|
|
|
/* Datasheet names this field as "Cpu_clk_sync_mux_sel" bit 0 */
|
|
static struct clk_regmap sm1_cpu1_clk = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_SYS_CPU_CLK_CNTL6,
|
|
.mask = 0x1,
|
|
.shift = 24,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "cpu1_clk",
|
|
.ops = &clk_regmap_mux_ro_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_cpu_clk.hw,
|
|
/* This CPU also have a dedicated clock tree */
|
|
},
|
|
.num_parents = 1,
|
|
},
|
|
};
|
|
|
|
/* Datasheet names this field as "Cpu_clk_sync_mux_sel" bit 1 */
|
|
static struct clk_regmap sm1_cpu2_clk = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_SYS_CPU_CLK_CNTL6,
|
|
.mask = 0x1,
|
|
.shift = 25,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "cpu2_clk",
|
|
.ops = &clk_regmap_mux_ro_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_cpu_clk.hw,
|
|
/* This CPU also have a dedicated clock tree */
|
|
},
|
|
.num_parents = 1,
|
|
},
|
|
};
|
|
|
|
/* Datasheet names this field as "Cpu_clk_sync_mux_sel" bit 2 */
|
|
static struct clk_regmap sm1_cpu3_clk = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_SYS_CPU_CLK_CNTL6,
|
|
.mask = 0x1,
|
|
.shift = 26,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "cpu3_clk",
|
|
.ops = &clk_regmap_mux_ro_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_cpu_clk.hw,
|
|
/* This CPU also have a dedicated clock tree */
|
|
},
|
|
.num_parents = 1,
|
|
},
|
|
};
|
|
|
|
/* Datasheet names this field as "Cpu_clk_sync_mux_sel" bit 4 */
|
|
static struct clk_regmap sm1_dsu_clk = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_SYS_CPU_CLK_CNTL6,
|
|
.mask = 0x1,
|
|
.shift = 27,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "dsu_clk",
|
|
.ops = &clk_regmap_mux_ro_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_cpu_clk.hw,
|
|
&sm1_dsu_final_clk.hw,
|
|
},
|
|
.num_parents = 2,
|
|
},
|
|
};
|
|
|
|
static int g12a_cpu_clk_mux_notifier_cb(struct notifier_block *nb,
|
|
unsigned long event, void *data)
|
|
{
|
|
if (event == POST_RATE_CHANGE || event == PRE_RATE_CHANGE) {
|
|
/* Wait for clock propagation before/after changing the mux */
|
|
udelay(100);
|
|
return NOTIFY_OK;
|
|
}
|
|
|
|
return NOTIFY_DONE;
|
|
}
|
|
|
|
static struct notifier_block g12a_cpu_clk_mux_nb = {
|
|
.notifier_call = g12a_cpu_clk_mux_notifier_cb,
|
|
};
|
|
|
|
struct g12a_cpu_clk_postmux_nb_data {
|
|
struct notifier_block nb;
|
|
struct clk_hw *xtal;
|
|
struct clk_hw *cpu_clk_dyn;
|
|
struct clk_hw *cpu_clk_postmux0;
|
|
struct clk_hw *cpu_clk_postmux1;
|
|
struct clk_hw *cpu_clk_premux1;
|
|
};
|
|
|
|
static int g12a_cpu_clk_postmux_notifier_cb(struct notifier_block *nb,
|
|
unsigned long event, void *data)
|
|
{
|
|
struct g12a_cpu_clk_postmux_nb_data *nb_data =
|
|
container_of(nb, struct g12a_cpu_clk_postmux_nb_data, nb);
|
|
|
|
switch (event) {
|
|
case PRE_RATE_CHANGE:
|
|
/*
|
|
* This notifier means cpu_clk_postmux0 clock will be changed
|
|
* to feed cpu_clk, this is the current path :
|
|
* cpu_clk
|
|
* \- cpu_clk_dyn
|
|
* \- cpu_clk_postmux0
|
|
* \- cpu_clk_muxX_div
|
|
* \- cpu_clk_premux0
|
|
* \- fclk_div3 or fclk_div2
|
|
* OR
|
|
* \- cpu_clk_premux0
|
|
* \- fclk_div3 or fclk_div2
|
|
*/
|
|
|
|
/* Setup cpu_clk_premux1 to xtal */
|
|
clk_hw_set_parent(nb_data->cpu_clk_premux1,
|
|
nb_data->xtal);
|
|
|
|
/* Setup cpu_clk_postmux1 to bypass divider */
|
|
clk_hw_set_parent(nb_data->cpu_clk_postmux1,
|
|
nb_data->cpu_clk_premux1);
|
|
|
|
/* Switch to parking clk on cpu_clk_postmux1 */
|
|
clk_hw_set_parent(nb_data->cpu_clk_dyn,
|
|
nb_data->cpu_clk_postmux1);
|
|
|
|
/*
|
|
* Now, cpu_clk is 24MHz in the current path :
|
|
* cpu_clk
|
|
* \- cpu_clk_dyn
|
|
* \- cpu_clk_postmux1
|
|
* \- cpu_clk_premux1
|
|
* \- xtal
|
|
*/
|
|
|
|
udelay(100);
|
|
|
|
return NOTIFY_OK;
|
|
|
|
case POST_RATE_CHANGE:
|
|
/*
|
|
* The cpu_clk_postmux0 has ben updated, now switch back
|
|
* cpu_clk_dyn to cpu_clk_postmux0 and take the changes
|
|
* in account.
|
|
*/
|
|
|
|
/* Configure cpu_clk_dyn back to cpu_clk_postmux0 */
|
|
clk_hw_set_parent(nb_data->cpu_clk_dyn,
|
|
nb_data->cpu_clk_postmux0);
|
|
|
|
/*
|
|
* new path :
|
|
* cpu_clk
|
|
* \- cpu_clk_dyn
|
|
* \- cpu_clk_postmux0
|
|
* \- cpu_clk_muxX_div
|
|
* \- cpu_clk_premux0
|
|
* \- fclk_div3 or fclk_div2
|
|
* OR
|
|
* \- cpu_clk_premux0
|
|
* \- fclk_div3 or fclk_div2
|
|
*/
|
|
|
|
udelay(100);
|
|
|
|
return NOTIFY_OK;
|
|
|
|
default:
|
|
return NOTIFY_DONE;
|
|
}
|
|
}
|
|
|
|
static struct g12a_cpu_clk_postmux_nb_data g12a_cpu_clk_postmux0_nb_data = {
|
|
.cpu_clk_dyn = &g12a_cpu_clk_dyn.hw,
|
|
.cpu_clk_postmux0 = &g12a_cpu_clk_postmux0.hw,
|
|
.cpu_clk_postmux1 = &g12a_cpu_clk_postmux1.hw,
|
|
.cpu_clk_premux1 = &g12a_cpu_clk_premux1.hw,
|
|
.nb.notifier_call = g12a_cpu_clk_postmux_notifier_cb,
|
|
};
|
|
|
|
static struct g12a_cpu_clk_postmux_nb_data g12b_cpub_clk_postmux0_nb_data = {
|
|
.cpu_clk_dyn = &g12b_cpub_clk_dyn.hw,
|
|
.cpu_clk_postmux0 = &g12b_cpub_clk_postmux0.hw,
|
|
.cpu_clk_postmux1 = &g12b_cpub_clk_postmux1.hw,
|
|
.cpu_clk_premux1 = &g12b_cpub_clk_premux1.hw,
|
|
.nb.notifier_call = g12a_cpu_clk_postmux_notifier_cb,
|
|
};
|
|
|
|
struct g12a_sys_pll_nb_data {
|
|
struct notifier_block nb;
|
|
struct clk_hw *sys_pll;
|
|
struct clk_hw *cpu_clk;
|
|
struct clk_hw *cpu_clk_dyn;
|
|
};
|
|
|
|
static int g12a_sys_pll_notifier_cb(struct notifier_block *nb,
|
|
unsigned long event, void *data)
|
|
{
|
|
struct g12a_sys_pll_nb_data *nb_data =
|
|
container_of(nb, struct g12a_sys_pll_nb_data, nb);
|
|
|
|
switch (event) {
|
|
case PRE_RATE_CHANGE:
|
|
/*
|
|
* This notifier means sys_pll clock will be changed
|
|
* to feed cpu_clk, this the current path :
|
|
* cpu_clk
|
|
* \- sys_pll
|
|
* \- sys_pll_dco
|
|
*/
|
|
|
|
/* Configure cpu_clk to use cpu_clk_dyn */
|
|
clk_hw_set_parent(nb_data->cpu_clk,
|
|
nb_data->cpu_clk_dyn);
|
|
|
|
/*
|
|
* Now, cpu_clk uses the dyn path
|
|
* cpu_clk
|
|
* \- cpu_clk_dyn
|
|
* \- cpu_clk_dynX
|
|
* \- cpu_clk_dynX_sel
|
|
* \- cpu_clk_dynX_div
|
|
* \- xtal/fclk_div2/fclk_div3
|
|
* \- xtal/fclk_div2/fclk_div3
|
|
*/
|
|
|
|
udelay(100);
|
|
|
|
return NOTIFY_OK;
|
|
|
|
case POST_RATE_CHANGE:
|
|
/*
|
|
* The sys_pll has ben updated, now switch back cpu_clk to
|
|
* sys_pll
|
|
*/
|
|
|
|
/* Configure cpu_clk to use sys_pll */
|
|
clk_hw_set_parent(nb_data->cpu_clk,
|
|
nb_data->sys_pll);
|
|
|
|
udelay(100);
|
|
|
|
/* new path :
|
|
* cpu_clk
|
|
* \- sys_pll
|
|
* \- sys_pll_dco
|
|
*/
|
|
|
|
return NOTIFY_OK;
|
|
|
|
default:
|
|
return NOTIFY_DONE;
|
|
}
|
|
}
|
|
|
|
static struct g12a_sys_pll_nb_data g12a_sys_pll_nb_data = {
|
|
.sys_pll = &g12a_sys_pll.hw,
|
|
.cpu_clk = &g12a_cpu_clk.hw,
|
|
.cpu_clk_dyn = &g12a_cpu_clk_dyn.hw,
|
|
.nb.notifier_call = g12a_sys_pll_notifier_cb,
|
|
};
|
|
|
|
/* G12B first CPU cluster uses sys1_pll */
|
|
static struct g12a_sys_pll_nb_data g12b_cpu_clk_sys1_pll_nb_data = {
|
|
.sys_pll = &g12b_sys1_pll.hw,
|
|
.cpu_clk = &g12b_cpu_clk.hw,
|
|
.cpu_clk_dyn = &g12a_cpu_clk_dyn.hw,
|
|
.nb.notifier_call = g12a_sys_pll_notifier_cb,
|
|
};
|
|
|
|
/* G12B second CPU cluster uses sys_pll */
|
|
static struct g12a_sys_pll_nb_data g12b_cpub_clk_sys_pll_nb_data = {
|
|
.sys_pll = &g12a_sys_pll.hw,
|
|
.cpu_clk = &g12b_cpub_clk.hw,
|
|
.cpu_clk_dyn = &g12b_cpub_clk_dyn.hw,
|
|
.nb.notifier_call = g12a_sys_pll_notifier_cb,
|
|
};
|
|
|
|
static struct clk_regmap g12a_cpu_clk_div16_en = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_SYS_CPU_CLK_CNTL1,
|
|
.bit_idx = 1,
|
|
},
|
|
.hw.init = &(struct clk_init_data) {
|
|
.name = "cpu_clk_div16_en",
|
|
.ops = &clk_regmap_gate_ro_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_cpu_clk.hw
|
|
},
|
|
.num_parents = 1,
|
|
/*
|
|
* This clock is used to debug the cpu_clk range
|
|
* Linux should not change it at runtime
|
|
*/
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12b_cpub_clk_div16_en = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_SYS_CPUB_CLK_CNTL1,
|
|
.bit_idx = 1,
|
|
},
|
|
.hw.init = &(struct clk_init_data) {
|
|
.name = "cpub_clk_div16_en",
|
|
.ops = &clk_regmap_gate_ro_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12b_cpub_clk.hw
|
|
},
|
|
.num_parents = 1,
|
|
/*
|
|
* This clock is used to debug the cpu_clk range
|
|
* Linux should not change it at runtime
|
|
*/
|
|
},
|
|
};
|
|
|
|
static struct clk_fixed_factor g12a_cpu_clk_div16 = {
|
|
.mult = 1,
|
|
.div = 16,
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "cpu_clk_div16",
|
|
.ops = &clk_fixed_factor_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_cpu_clk_div16_en.hw
|
|
},
|
|
.num_parents = 1,
|
|
},
|
|
};
|
|
|
|
static struct clk_fixed_factor g12b_cpub_clk_div16 = {
|
|
.mult = 1,
|
|
.div = 16,
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "cpub_clk_div16",
|
|
.ops = &clk_fixed_factor_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12b_cpub_clk_div16_en.hw
|
|
},
|
|
.num_parents = 1,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_cpu_clk_apb_div = {
|
|
.data = &(struct clk_regmap_div_data){
|
|
.offset = HHI_SYS_CPU_CLK_CNTL1,
|
|
.shift = 3,
|
|
.width = 3,
|
|
.flags = CLK_DIVIDER_POWER_OF_TWO,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "cpu_clk_apb_div",
|
|
.ops = &clk_regmap_divider_ro_ops,
|
|
.parent_hws = (const struct clk_hw *[]) { &g12a_cpu_clk.hw },
|
|
.num_parents = 1,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_cpu_clk_apb = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_SYS_CPU_CLK_CNTL1,
|
|
.bit_idx = 1,
|
|
},
|
|
.hw.init = &(struct clk_init_data) {
|
|
.name = "cpu_clk_apb",
|
|
.ops = &clk_regmap_gate_ro_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_cpu_clk_apb_div.hw
|
|
},
|
|
.num_parents = 1,
|
|
/*
|
|
* This clock is set by the ROM monitor code,
|
|
* Linux should not change it at runtime
|
|
*/
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_cpu_clk_atb_div = {
|
|
.data = &(struct clk_regmap_div_data){
|
|
.offset = HHI_SYS_CPU_CLK_CNTL1,
|
|
.shift = 6,
|
|
.width = 3,
|
|
.flags = CLK_DIVIDER_POWER_OF_TWO,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "cpu_clk_atb_div",
|
|
.ops = &clk_regmap_divider_ro_ops,
|
|
.parent_hws = (const struct clk_hw *[]) { &g12a_cpu_clk.hw },
|
|
.num_parents = 1,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_cpu_clk_atb = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_SYS_CPU_CLK_CNTL1,
|
|
.bit_idx = 17,
|
|
},
|
|
.hw.init = &(struct clk_init_data) {
|
|
.name = "cpu_clk_atb",
|
|
.ops = &clk_regmap_gate_ro_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_cpu_clk_atb_div.hw
|
|
},
|
|
.num_parents = 1,
|
|
/*
|
|
* This clock is set by the ROM monitor code,
|
|
* Linux should not change it at runtime
|
|
*/
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_cpu_clk_axi_div = {
|
|
.data = &(struct clk_regmap_div_data){
|
|
.offset = HHI_SYS_CPU_CLK_CNTL1,
|
|
.shift = 9,
|
|
.width = 3,
|
|
.flags = CLK_DIVIDER_POWER_OF_TWO,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "cpu_clk_axi_div",
|
|
.ops = &clk_regmap_divider_ro_ops,
|
|
.parent_hws = (const struct clk_hw *[]) { &g12a_cpu_clk.hw },
|
|
.num_parents = 1,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_cpu_clk_axi = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_SYS_CPU_CLK_CNTL1,
|
|
.bit_idx = 18,
|
|
},
|
|
.hw.init = &(struct clk_init_data) {
|
|
.name = "cpu_clk_axi",
|
|
.ops = &clk_regmap_gate_ro_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_cpu_clk_axi_div.hw
|
|
},
|
|
.num_parents = 1,
|
|
/*
|
|
* This clock is set by the ROM monitor code,
|
|
* Linux should not change it at runtime
|
|
*/
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_cpu_clk_trace_div = {
|
|
.data = &(struct clk_regmap_div_data){
|
|
.offset = HHI_SYS_CPU_CLK_CNTL1,
|
|
.shift = 20,
|
|
.width = 3,
|
|
.flags = CLK_DIVIDER_POWER_OF_TWO,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "cpu_clk_trace_div",
|
|
.ops = &clk_regmap_divider_ro_ops,
|
|
.parent_data = &(const struct clk_parent_data) {
|
|
/*
|
|
* Note:
|
|
* G12A and G12B have different cpu_clks (with
|
|
* different struct clk_hw). We fallback to the global
|
|
* naming string mechanism so cpu_clk_trace_div picks
|
|
* up the appropriate one.
|
|
*/
|
|
.name = "cpu_clk",
|
|
.index = -1,
|
|
},
|
|
.num_parents = 1,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_cpu_clk_trace = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_SYS_CPU_CLK_CNTL1,
|
|
.bit_idx = 23,
|
|
},
|
|
.hw.init = &(struct clk_init_data) {
|
|
.name = "cpu_clk_trace",
|
|
.ops = &clk_regmap_gate_ro_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_cpu_clk_trace_div.hw
|
|
},
|
|
.num_parents = 1,
|
|
/*
|
|
* This clock is set by the ROM monitor code,
|
|
* Linux should not change it at runtime
|
|
*/
|
|
},
|
|
};
|
|
|
|
static struct clk_fixed_factor g12b_cpub_clk_div2 = {
|
|
.mult = 1,
|
|
.div = 2,
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "cpub_clk_div2",
|
|
.ops = &clk_fixed_factor_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12b_cpub_clk.hw
|
|
},
|
|
.num_parents = 1,
|
|
},
|
|
};
|
|
|
|
static struct clk_fixed_factor g12b_cpub_clk_div3 = {
|
|
.mult = 1,
|
|
.div = 3,
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "cpub_clk_div3",
|
|
.ops = &clk_fixed_factor_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12b_cpub_clk.hw
|
|
},
|
|
.num_parents = 1,
|
|
},
|
|
};
|
|
|
|
static struct clk_fixed_factor g12b_cpub_clk_div4 = {
|
|
.mult = 1,
|
|
.div = 4,
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "cpub_clk_div4",
|
|
.ops = &clk_fixed_factor_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12b_cpub_clk.hw
|
|
},
|
|
.num_parents = 1,
|
|
},
|
|
};
|
|
|
|
static struct clk_fixed_factor g12b_cpub_clk_div5 = {
|
|
.mult = 1,
|
|
.div = 5,
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "cpub_clk_div5",
|
|
.ops = &clk_fixed_factor_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12b_cpub_clk.hw
|
|
},
|
|
.num_parents = 1,
|
|
},
|
|
};
|
|
|
|
static struct clk_fixed_factor g12b_cpub_clk_div6 = {
|
|
.mult = 1,
|
|
.div = 6,
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "cpub_clk_div6",
|
|
.ops = &clk_fixed_factor_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12b_cpub_clk.hw
|
|
},
|
|
.num_parents = 1,
|
|
},
|
|
};
|
|
|
|
static struct clk_fixed_factor g12b_cpub_clk_div7 = {
|
|
.mult = 1,
|
|
.div = 7,
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "cpub_clk_div7",
|
|
.ops = &clk_fixed_factor_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12b_cpub_clk.hw
|
|
},
|
|
.num_parents = 1,
|
|
},
|
|
};
|
|
|
|
static struct clk_fixed_factor g12b_cpub_clk_div8 = {
|
|
.mult = 1,
|
|
.div = 8,
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "cpub_clk_div8",
|
|
.ops = &clk_fixed_factor_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12b_cpub_clk.hw
|
|
},
|
|
.num_parents = 1,
|
|
},
|
|
};
|
|
|
|
static u32 mux_table_cpub[] = { 1, 2, 3, 4, 5, 6, 7 };
|
|
static struct clk_regmap g12b_cpub_clk_apb_sel = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_SYS_CPUB_CLK_CNTL1,
|
|
.mask = 7,
|
|
.shift = 3,
|
|
.table = mux_table_cpub,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "cpub_clk_apb_sel",
|
|
.ops = &clk_regmap_mux_ro_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12b_cpub_clk_div2.hw,
|
|
&g12b_cpub_clk_div3.hw,
|
|
&g12b_cpub_clk_div4.hw,
|
|
&g12b_cpub_clk_div5.hw,
|
|
&g12b_cpub_clk_div6.hw,
|
|
&g12b_cpub_clk_div7.hw,
|
|
&g12b_cpub_clk_div8.hw
|
|
},
|
|
.num_parents = 7,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12b_cpub_clk_apb = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_SYS_CPUB_CLK_CNTL1,
|
|
.bit_idx = 16,
|
|
.flags = CLK_GATE_SET_TO_DISABLE,
|
|
},
|
|
.hw.init = &(struct clk_init_data) {
|
|
.name = "cpub_clk_apb",
|
|
.ops = &clk_regmap_gate_ro_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12b_cpub_clk_apb_sel.hw
|
|
},
|
|
.num_parents = 1,
|
|
/*
|
|
* This clock is set by the ROM monitor code,
|
|
* Linux should not change it at runtime
|
|
*/
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12b_cpub_clk_atb_sel = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_SYS_CPUB_CLK_CNTL1,
|
|
.mask = 7,
|
|
.shift = 6,
|
|
.table = mux_table_cpub,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "cpub_clk_atb_sel",
|
|
.ops = &clk_regmap_mux_ro_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12b_cpub_clk_div2.hw,
|
|
&g12b_cpub_clk_div3.hw,
|
|
&g12b_cpub_clk_div4.hw,
|
|
&g12b_cpub_clk_div5.hw,
|
|
&g12b_cpub_clk_div6.hw,
|
|
&g12b_cpub_clk_div7.hw,
|
|
&g12b_cpub_clk_div8.hw
|
|
},
|
|
.num_parents = 7,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12b_cpub_clk_atb = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_SYS_CPUB_CLK_CNTL1,
|
|
.bit_idx = 17,
|
|
.flags = CLK_GATE_SET_TO_DISABLE,
|
|
},
|
|
.hw.init = &(struct clk_init_data) {
|
|
.name = "cpub_clk_atb",
|
|
.ops = &clk_regmap_gate_ro_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12b_cpub_clk_atb_sel.hw
|
|
},
|
|
.num_parents = 1,
|
|
/*
|
|
* This clock is set by the ROM monitor code,
|
|
* Linux should not change it at runtime
|
|
*/
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12b_cpub_clk_axi_sel = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_SYS_CPUB_CLK_CNTL1,
|
|
.mask = 7,
|
|
.shift = 9,
|
|
.table = mux_table_cpub,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "cpub_clk_axi_sel",
|
|
.ops = &clk_regmap_mux_ro_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12b_cpub_clk_div2.hw,
|
|
&g12b_cpub_clk_div3.hw,
|
|
&g12b_cpub_clk_div4.hw,
|
|
&g12b_cpub_clk_div5.hw,
|
|
&g12b_cpub_clk_div6.hw,
|
|
&g12b_cpub_clk_div7.hw,
|
|
&g12b_cpub_clk_div8.hw
|
|
},
|
|
.num_parents = 7,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12b_cpub_clk_axi = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_SYS_CPUB_CLK_CNTL1,
|
|
.bit_idx = 18,
|
|
.flags = CLK_GATE_SET_TO_DISABLE,
|
|
},
|
|
.hw.init = &(struct clk_init_data) {
|
|
.name = "cpub_clk_axi",
|
|
.ops = &clk_regmap_gate_ro_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12b_cpub_clk_axi_sel.hw
|
|
},
|
|
.num_parents = 1,
|
|
/*
|
|
* This clock is set by the ROM monitor code,
|
|
* Linux should not change it at runtime
|
|
*/
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12b_cpub_clk_trace_sel = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_SYS_CPUB_CLK_CNTL1,
|
|
.mask = 7,
|
|
.shift = 20,
|
|
.table = mux_table_cpub,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "cpub_clk_trace_sel",
|
|
.ops = &clk_regmap_mux_ro_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12b_cpub_clk_div2.hw,
|
|
&g12b_cpub_clk_div3.hw,
|
|
&g12b_cpub_clk_div4.hw,
|
|
&g12b_cpub_clk_div5.hw,
|
|
&g12b_cpub_clk_div6.hw,
|
|
&g12b_cpub_clk_div7.hw,
|
|
&g12b_cpub_clk_div8.hw
|
|
},
|
|
.num_parents = 7,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12b_cpub_clk_trace = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_SYS_CPUB_CLK_CNTL1,
|
|
.bit_idx = 23,
|
|
.flags = CLK_GATE_SET_TO_DISABLE,
|
|
},
|
|
.hw.init = &(struct clk_init_data) {
|
|
.name = "cpub_clk_trace",
|
|
.ops = &clk_regmap_gate_ro_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12b_cpub_clk_trace_sel.hw
|
|
},
|
|
.num_parents = 1,
|
|
/*
|
|
* This clock is set by the ROM monitor code,
|
|
* Linux should not change it at runtime
|
|
*/
|
|
},
|
|
};
|
|
|
|
static const struct pll_mult_range g12a_gp0_pll_mult_range = {
|
|
.min = 125,
|
|
.max = 255,
|
|
};
|
|
|
|
/*
|
|
* Internal gp0 pll emulation configuration parameters
|
|
*/
|
|
static const struct reg_sequence g12a_gp0_init_regs[] = {
|
|
{ .reg = HHI_GP0_PLL_CNTL1, .def = 0x00000000 },
|
|
{ .reg = HHI_GP0_PLL_CNTL2, .def = 0x00000000 },
|
|
{ .reg = HHI_GP0_PLL_CNTL3, .def = 0x48681c00 },
|
|
{ .reg = HHI_GP0_PLL_CNTL4, .def = 0x33771290 },
|
|
{ .reg = HHI_GP0_PLL_CNTL5, .def = 0x39272000 },
|
|
{ .reg = HHI_GP0_PLL_CNTL6, .def = 0x56540000 },
|
|
};
|
|
|
|
static struct clk_regmap g12a_gp0_pll_dco = {
|
|
.data = &(struct meson_clk_pll_data){
|
|
.en = {
|
|
.reg_off = HHI_GP0_PLL_CNTL0,
|
|
.shift = 28,
|
|
.width = 1,
|
|
},
|
|
.m = {
|
|
.reg_off = HHI_GP0_PLL_CNTL0,
|
|
.shift = 0,
|
|
.width = 8,
|
|
},
|
|
.n = {
|
|
.reg_off = HHI_GP0_PLL_CNTL0,
|
|
.shift = 10,
|
|
.width = 5,
|
|
},
|
|
.frac = {
|
|
.reg_off = HHI_GP0_PLL_CNTL1,
|
|
.shift = 0,
|
|
.width = 17,
|
|
},
|
|
.l = {
|
|
.reg_off = HHI_GP0_PLL_CNTL0,
|
|
.shift = 31,
|
|
.width = 1,
|
|
},
|
|
.rst = {
|
|
.reg_off = HHI_GP0_PLL_CNTL0,
|
|
.shift = 29,
|
|
.width = 1,
|
|
},
|
|
.range = &g12a_gp0_pll_mult_range,
|
|
.init_regs = g12a_gp0_init_regs,
|
|
.init_count = ARRAY_SIZE(g12a_gp0_init_regs),
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "gp0_pll_dco",
|
|
.ops = &meson_clk_pll_ops,
|
|
.parent_data = &(const struct clk_parent_data) {
|
|
.fw_name = "xtal",
|
|
},
|
|
.num_parents = 1,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_gp0_pll = {
|
|
.data = &(struct clk_regmap_div_data){
|
|
.offset = HHI_GP0_PLL_CNTL0,
|
|
.shift = 16,
|
|
.width = 3,
|
|
.flags = (CLK_DIVIDER_POWER_OF_TWO |
|
|
CLK_DIVIDER_ROUND_CLOSEST),
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "gp0_pll",
|
|
.ops = &clk_regmap_divider_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_gp0_pll_dco.hw
|
|
},
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap sm1_gp1_pll_dco = {
|
|
.data = &(struct meson_clk_pll_data){
|
|
.en = {
|
|
.reg_off = HHI_GP1_PLL_CNTL0,
|
|
.shift = 28,
|
|
.width = 1,
|
|
},
|
|
.m = {
|
|
.reg_off = HHI_GP1_PLL_CNTL0,
|
|
.shift = 0,
|
|
.width = 8,
|
|
},
|
|
.n = {
|
|
.reg_off = HHI_GP1_PLL_CNTL0,
|
|
.shift = 10,
|
|
.width = 5,
|
|
},
|
|
.frac = {
|
|
.reg_off = HHI_GP1_PLL_CNTL1,
|
|
.shift = 0,
|
|
.width = 17,
|
|
},
|
|
.l = {
|
|
.reg_off = HHI_GP1_PLL_CNTL0,
|
|
.shift = 31,
|
|
.width = 1,
|
|
},
|
|
.rst = {
|
|
.reg_off = HHI_GP1_PLL_CNTL0,
|
|
.shift = 29,
|
|
.width = 1,
|
|
},
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "gp1_pll_dco",
|
|
.ops = &meson_clk_pll_ro_ops,
|
|
.parent_data = &(const struct clk_parent_data) {
|
|
.fw_name = "xtal",
|
|
},
|
|
.num_parents = 1,
|
|
/* This clock feeds the DSU, avoid disabling it */
|
|
.flags = CLK_IS_CRITICAL,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap sm1_gp1_pll = {
|
|
.data = &(struct clk_regmap_div_data){
|
|
.offset = HHI_GP1_PLL_CNTL0,
|
|
.shift = 16,
|
|
.width = 3,
|
|
.flags = (CLK_DIVIDER_POWER_OF_TWO |
|
|
CLK_DIVIDER_ROUND_CLOSEST),
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "gp1_pll",
|
|
.ops = &clk_regmap_divider_ro_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&sm1_gp1_pll_dco.hw
|
|
},
|
|
.num_parents = 1,
|
|
},
|
|
};
|
|
|
|
/*
|
|
* Internal hifi pll emulation configuration parameters
|
|
*/
|
|
static const struct reg_sequence g12a_hifi_init_regs[] = {
|
|
{ .reg = HHI_HIFI_PLL_CNTL1, .def = 0x00000000 },
|
|
{ .reg = HHI_HIFI_PLL_CNTL2, .def = 0x00000000 },
|
|
{ .reg = HHI_HIFI_PLL_CNTL3, .def = 0x6a285c00 },
|
|
{ .reg = HHI_HIFI_PLL_CNTL4, .def = 0x65771290 },
|
|
{ .reg = HHI_HIFI_PLL_CNTL5, .def = 0x39272000 },
|
|
{ .reg = HHI_HIFI_PLL_CNTL6, .def = 0x56540000 },
|
|
};
|
|
|
|
static struct clk_regmap g12a_hifi_pll_dco = {
|
|
.data = &(struct meson_clk_pll_data){
|
|
.en = {
|
|
.reg_off = HHI_HIFI_PLL_CNTL0,
|
|
.shift = 28,
|
|
.width = 1,
|
|
},
|
|
.m = {
|
|
.reg_off = HHI_HIFI_PLL_CNTL0,
|
|
.shift = 0,
|
|
.width = 8,
|
|
},
|
|
.n = {
|
|
.reg_off = HHI_HIFI_PLL_CNTL0,
|
|
.shift = 10,
|
|
.width = 5,
|
|
},
|
|
.frac = {
|
|
.reg_off = HHI_HIFI_PLL_CNTL1,
|
|
.shift = 0,
|
|
.width = 17,
|
|
},
|
|
.l = {
|
|
.reg_off = HHI_HIFI_PLL_CNTL0,
|
|
.shift = 31,
|
|
.width = 1,
|
|
},
|
|
.rst = {
|
|
.reg_off = HHI_HIFI_PLL_CNTL0,
|
|
.shift = 29,
|
|
.width = 1,
|
|
},
|
|
.range = &g12a_gp0_pll_mult_range,
|
|
.init_regs = g12a_hifi_init_regs,
|
|
.init_count = ARRAY_SIZE(g12a_hifi_init_regs),
|
|
.flags = CLK_MESON_PLL_ROUND_CLOSEST,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "hifi_pll_dco",
|
|
.ops = &meson_clk_pll_ops,
|
|
.parent_data = &(const struct clk_parent_data) {
|
|
.fw_name = "xtal",
|
|
},
|
|
.num_parents = 1,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_hifi_pll = {
|
|
.data = &(struct clk_regmap_div_data){
|
|
.offset = HHI_HIFI_PLL_CNTL0,
|
|
.shift = 16,
|
|
.width = 2,
|
|
.flags = (CLK_DIVIDER_POWER_OF_TWO |
|
|
CLK_DIVIDER_ROUND_CLOSEST),
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "hifi_pll",
|
|
.ops = &clk_regmap_divider_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_hifi_pll_dco.hw
|
|
},
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
/*
|
|
* The Meson G12A PCIE PLL is fined tuned to deliver a very precise
|
|
* 100MHz reference clock for the PCIe Analog PHY, and thus requires
|
|
* a strict register sequence to enable the PLL.
|
|
*/
|
|
static const struct reg_sequence g12a_pcie_pll_init_regs[] = {
|
|
{ .reg = HHI_PCIE_PLL_CNTL0, .def = 0x20090496 },
|
|
{ .reg = HHI_PCIE_PLL_CNTL0, .def = 0x30090496 },
|
|
{ .reg = HHI_PCIE_PLL_CNTL1, .def = 0x00000000 },
|
|
{ .reg = HHI_PCIE_PLL_CNTL2, .def = 0x00001100 },
|
|
{ .reg = HHI_PCIE_PLL_CNTL3, .def = 0x10058e00 },
|
|
{ .reg = HHI_PCIE_PLL_CNTL4, .def = 0x000100c0 },
|
|
{ .reg = HHI_PCIE_PLL_CNTL5, .def = 0x68000048 },
|
|
{ .reg = HHI_PCIE_PLL_CNTL5, .def = 0x68000068, .delay_us = 20 },
|
|
{ .reg = HHI_PCIE_PLL_CNTL4, .def = 0x008100c0, .delay_us = 10 },
|
|
{ .reg = HHI_PCIE_PLL_CNTL0, .def = 0x34090496 },
|
|
{ .reg = HHI_PCIE_PLL_CNTL0, .def = 0x14090496, .delay_us = 10 },
|
|
{ .reg = HHI_PCIE_PLL_CNTL2, .def = 0x00001000 },
|
|
};
|
|
|
|
/* Keep a single entry table for recalc/round_rate() ops */
|
|
static const struct pll_params_table g12a_pcie_pll_table[] = {
|
|
PLL_PARAMS(150, 1),
|
|
{0, 0},
|
|
};
|
|
|
|
static struct clk_regmap g12a_pcie_pll_dco = {
|
|
.data = &(struct meson_clk_pll_data){
|
|
.en = {
|
|
.reg_off = HHI_PCIE_PLL_CNTL0,
|
|
.shift = 28,
|
|
.width = 1,
|
|
},
|
|
.m = {
|
|
.reg_off = HHI_PCIE_PLL_CNTL0,
|
|
.shift = 0,
|
|
.width = 8,
|
|
},
|
|
.n = {
|
|
.reg_off = HHI_PCIE_PLL_CNTL0,
|
|
.shift = 10,
|
|
.width = 5,
|
|
},
|
|
.frac = {
|
|
.reg_off = HHI_PCIE_PLL_CNTL1,
|
|
.shift = 0,
|
|
.width = 12,
|
|
},
|
|
.l = {
|
|
.reg_off = HHI_PCIE_PLL_CNTL0,
|
|
.shift = 31,
|
|
.width = 1,
|
|
},
|
|
.rst = {
|
|
.reg_off = HHI_PCIE_PLL_CNTL0,
|
|
.shift = 29,
|
|
.width = 1,
|
|
},
|
|
.table = g12a_pcie_pll_table,
|
|
.init_regs = g12a_pcie_pll_init_regs,
|
|
.init_count = ARRAY_SIZE(g12a_pcie_pll_init_regs),
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "pcie_pll_dco",
|
|
.ops = &meson_clk_pcie_pll_ops,
|
|
.parent_data = &(const struct clk_parent_data) {
|
|
.fw_name = "xtal",
|
|
},
|
|
.num_parents = 1,
|
|
},
|
|
};
|
|
|
|
static struct clk_fixed_factor g12a_pcie_pll_dco_div2 = {
|
|
.mult = 1,
|
|
.div = 2,
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "pcie_pll_dco_div2",
|
|
.ops = &clk_fixed_factor_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_pcie_pll_dco.hw
|
|
},
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_pcie_pll_od = {
|
|
.data = &(struct clk_regmap_div_data){
|
|
.offset = HHI_PCIE_PLL_CNTL0,
|
|
.shift = 16,
|
|
.width = 5,
|
|
.flags = CLK_DIVIDER_ROUND_CLOSEST |
|
|
CLK_DIVIDER_ONE_BASED |
|
|
CLK_DIVIDER_ALLOW_ZERO,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "pcie_pll_od",
|
|
.ops = &clk_regmap_divider_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_pcie_pll_dco_div2.hw
|
|
},
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
static struct clk_fixed_factor g12a_pcie_pll = {
|
|
.mult = 1,
|
|
.div = 2,
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "pcie_pll_pll",
|
|
.ops = &clk_fixed_factor_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_pcie_pll_od.hw
|
|
},
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_hdmi_pll_dco = {
|
|
.data = &(struct meson_clk_pll_data){
|
|
.en = {
|
|
.reg_off = HHI_HDMI_PLL_CNTL0,
|
|
.shift = 28,
|
|
.width = 1,
|
|
},
|
|
.m = {
|
|
.reg_off = HHI_HDMI_PLL_CNTL0,
|
|
.shift = 0,
|
|
.width = 8,
|
|
},
|
|
.n = {
|
|
.reg_off = HHI_HDMI_PLL_CNTL0,
|
|
.shift = 10,
|
|
.width = 5,
|
|
},
|
|
.frac = {
|
|
.reg_off = HHI_HDMI_PLL_CNTL1,
|
|
.shift = 0,
|
|
.width = 16,
|
|
},
|
|
.l = {
|
|
.reg_off = HHI_HDMI_PLL_CNTL0,
|
|
.shift = 30,
|
|
.width = 1,
|
|
},
|
|
.rst = {
|
|
.reg_off = HHI_HDMI_PLL_CNTL0,
|
|
.shift = 29,
|
|
.width = 1,
|
|
},
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "hdmi_pll_dco",
|
|
.ops = &meson_clk_pll_ro_ops,
|
|
.parent_data = &(const struct clk_parent_data) {
|
|
.fw_name = "xtal",
|
|
},
|
|
.num_parents = 1,
|
|
/*
|
|
* Display directly handle hdmi pll registers ATM, we need
|
|
* NOCACHE to keep our view of the clock as accurate as possible
|
|
*/
|
|
.flags = CLK_GET_RATE_NOCACHE,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_hdmi_pll_od = {
|
|
.data = &(struct clk_regmap_div_data){
|
|
.offset = HHI_HDMI_PLL_CNTL0,
|
|
.shift = 16,
|
|
.width = 2,
|
|
.flags = CLK_DIVIDER_POWER_OF_TWO,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "hdmi_pll_od",
|
|
.ops = &clk_regmap_divider_ro_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_hdmi_pll_dco.hw
|
|
},
|
|
.num_parents = 1,
|
|
.flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_hdmi_pll_od2 = {
|
|
.data = &(struct clk_regmap_div_data){
|
|
.offset = HHI_HDMI_PLL_CNTL0,
|
|
.shift = 18,
|
|
.width = 2,
|
|
.flags = CLK_DIVIDER_POWER_OF_TWO,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "hdmi_pll_od2",
|
|
.ops = &clk_regmap_divider_ro_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_hdmi_pll_od.hw
|
|
},
|
|
.num_parents = 1,
|
|
.flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_hdmi_pll = {
|
|
.data = &(struct clk_regmap_div_data){
|
|
.offset = HHI_HDMI_PLL_CNTL0,
|
|
.shift = 20,
|
|
.width = 2,
|
|
.flags = CLK_DIVIDER_POWER_OF_TWO,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "hdmi_pll",
|
|
.ops = &clk_regmap_divider_ro_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_hdmi_pll_od2.hw
|
|
},
|
|
.num_parents = 1,
|
|
.flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
static struct clk_fixed_factor g12a_fclk_div4_div = {
|
|
.mult = 1,
|
|
.div = 4,
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "fclk_div4_div",
|
|
.ops = &clk_fixed_factor_ops,
|
|
.parent_hws = (const struct clk_hw *[]) { &g12a_fixed_pll.hw },
|
|
.num_parents = 1,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_fclk_div4 = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_FIX_PLL_CNTL1,
|
|
.bit_idx = 21,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "fclk_div4",
|
|
.ops = &clk_regmap_gate_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_fclk_div4_div.hw
|
|
},
|
|
.num_parents = 1,
|
|
},
|
|
};
|
|
|
|
static struct clk_fixed_factor g12a_fclk_div5_div = {
|
|
.mult = 1,
|
|
.div = 5,
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "fclk_div5_div",
|
|
.ops = &clk_fixed_factor_ops,
|
|
.parent_hws = (const struct clk_hw *[]) { &g12a_fixed_pll.hw },
|
|
.num_parents = 1,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_fclk_div5 = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_FIX_PLL_CNTL1,
|
|
.bit_idx = 22,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "fclk_div5",
|
|
.ops = &clk_regmap_gate_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_fclk_div5_div.hw
|
|
},
|
|
.num_parents = 1,
|
|
},
|
|
};
|
|
|
|
static struct clk_fixed_factor g12a_fclk_div7_div = {
|
|
.mult = 1,
|
|
.div = 7,
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "fclk_div7_div",
|
|
.ops = &clk_fixed_factor_ops,
|
|
.parent_hws = (const struct clk_hw *[]) { &g12a_fixed_pll.hw },
|
|
.num_parents = 1,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_fclk_div7 = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_FIX_PLL_CNTL1,
|
|
.bit_idx = 23,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "fclk_div7",
|
|
.ops = &clk_regmap_gate_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_fclk_div7_div.hw
|
|
},
|
|
.num_parents = 1,
|
|
},
|
|
};
|
|
|
|
static struct clk_fixed_factor g12a_fclk_div2p5_div = {
|
|
.mult = 1,
|
|
.div = 5,
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "fclk_div2p5_div",
|
|
.ops = &clk_fixed_factor_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_fixed_pll_dco.hw
|
|
},
|
|
.num_parents = 1,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_fclk_div2p5 = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_FIX_PLL_CNTL1,
|
|
.bit_idx = 25,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "fclk_div2p5",
|
|
.ops = &clk_regmap_gate_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_fclk_div2p5_div.hw
|
|
},
|
|
.num_parents = 1,
|
|
},
|
|
};
|
|
|
|
static struct clk_fixed_factor g12a_mpll_50m_div = {
|
|
.mult = 1,
|
|
.div = 80,
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "mpll_50m_div",
|
|
.ops = &clk_fixed_factor_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_fixed_pll_dco.hw
|
|
},
|
|
.num_parents = 1,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_mpll_50m = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_FIX_PLL_CNTL3,
|
|
.mask = 0x1,
|
|
.shift = 5,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "mpll_50m",
|
|
.ops = &clk_regmap_mux_ro_ops,
|
|
.parent_data = (const struct clk_parent_data []) {
|
|
{ .fw_name = "xtal", },
|
|
{ .hw = &g12a_mpll_50m_div.hw },
|
|
},
|
|
.num_parents = 2,
|
|
},
|
|
};
|
|
|
|
static struct clk_fixed_factor g12a_mpll_prediv = {
|
|
.mult = 1,
|
|
.div = 2,
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "mpll_prediv",
|
|
.ops = &clk_fixed_factor_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_fixed_pll_dco.hw
|
|
},
|
|
.num_parents = 1,
|
|
},
|
|
};
|
|
|
|
static const struct reg_sequence g12a_mpll0_init_regs[] = {
|
|
{ .reg = HHI_MPLL_CNTL2, .def = 0x40000033 },
|
|
};
|
|
|
|
static struct clk_regmap g12a_mpll0_div = {
|
|
.data = &(struct meson_clk_mpll_data){
|
|
.sdm = {
|
|
.reg_off = HHI_MPLL_CNTL1,
|
|
.shift = 0,
|
|
.width = 14,
|
|
},
|
|
.sdm_en = {
|
|
.reg_off = HHI_MPLL_CNTL1,
|
|
.shift = 30,
|
|
.width = 1,
|
|
},
|
|
.n2 = {
|
|
.reg_off = HHI_MPLL_CNTL1,
|
|
.shift = 20,
|
|
.width = 9,
|
|
},
|
|
.ssen = {
|
|
.reg_off = HHI_MPLL_CNTL1,
|
|
.shift = 29,
|
|
.width = 1,
|
|
},
|
|
.lock = &meson_clk_lock,
|
|
.init_regs = g12a_mpll0_init_regs,
|
|
.init_count = ARRAY_SIZE(g12a_mpll0_init_regs),
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "mpll0_div",
|
|
.ops = &meson_clk_mpll_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_mpll_prediv.hw
|
|
},
|
|
.num_parents = 1,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_mpll0 = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_MPLL_CNTL1,
|
|
.bit_idx = 31,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "mpll0",
|
|
.ops = &clk_regmap_gate_ops,
|
|
.parent_hws = (const struct clk_hw *[]) { &g12a_mpll0_div.hw },
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
static const struct reg_sequence g12a_mpll1_init_regs[] = {
|
|
{ .reg = HHI_MPLL_CNTL4, .def = 0x40000033 },
|
|
};
|
|
|
|
static struct clk_regmap g12a_mpll1_div = {
|
|
.data = &(struct meson_clk_mpll_data){
|
|
.sdm = {
|
|
.reg_off = HHI_MPLL_CNTL3,
|
|
.shift = 0,
|
|
.width = 14,
|
|
},
|
|
.sdm_en = {
|
|
.reg_off = HHI_MPLL_CNTL3,
|
|
.shift = 30,
|
|
.width = 1,
|
|
},
|
|
.n2 = {
|
|
.reg_off = HHI_MPLL_CNTL3,
|
|
.shift = 20,
|
|
.width = 9,
|
|
},
|
|
.ssen = {
|
|
.reg_off = HHI_MPLL_CNTL3,
|
|
.shift = 29,
|
|
.width = 1,
|
|
},
|
|
.lock = &meson_clk_lock,
|
|
.init_regs = g12a_mpll1_init_regs,
|
|
.init_count = ARRAY_SIZE(g12a_mpll1_init_regs),
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "mpll1_div",
|
|
.ops = &meson_clk_mpll_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_mpll_prediv.hw
|
|
},
|
|
.num_parents = 1,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_mpll1 = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_MPLL_CNTL3,
|
|
.bit_idx = 31,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "mpll1",
|
|
.ops = &clk_regmap_gate_ops,
|
|
.parent_hws = (const struct clk_hw *[]) { &g12a_mpll1_div.hw },
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
static const struct reg_sequence g12a_mpll2_init_regs[] = {
|
|
{ .reg = HHI_MPLL_CNTL6, .def = 0x40000033 },
|
|
};
|
|
|
|
static struct clk_regmap g12a_mpll2_div = {
|
|
.data = &(struct meson_clk_mpll_data){
|
|
.sdm = {
|
|
.reg_off = HHI_MPLL_CNTL5,
|
|
.shift = 0,
|
|
.width = 14,
|
|
},
|
|
.sdm_en = {
|
|
.reg_off = HHI_MPLL_CNTL5,
|
|
.shift = 30,
|
|
.width = 1,
|
|
},
|
|
.n2 = {
|
|
.reg_off = HHI_MPLL_CNTL5,
|
|
.shift = 20,
|
|
.width = 9,
|
|
},
|
|
.ssen = {
|
|
.reg_off = HHI_MPLL_CNTL5,
|
|
.shift = 29,
|
|
.width = 1,
|
|
},
|
|
.lock = &meson_clk_lock,
|
|
.init_regs = g12a_mpll2_init_regs,
|
|
.init_count = ARRAY_SIZE(g12a_mpll2_init_regs),
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "mpll2_div",
|
|
.ops = &meson_clk_mpll_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_mpll_prediv.hw
|
|
},
|
|
.num_parents = 1,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_mpll2 = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_MPLL_CNTL5,
|
|
.bit_idx = 31,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "mpll2",
|
|
.ops = &clk_regmap_gate_ops,
|
|
.parent_hws = (const struct clk_hw *[]) { &g12a_mpll2_div.hw },
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
static const struct reg_sequence g12a_mpll3_init_regs[] = {
|
|
{ .reg = HHI_MPLL_CNTL8, .def = 0x40000033 },
|
|
};
|
|
|
|
static struct clk_regmap g12a_mpll3_div = {
|
|
.data = &(struct meson_clk_mpll_data){
|
|
.sdm = {
|
|
.reg_off = HHI_MPLL_CNTL7,
|
|
.shift = 0,
|
|
.width = 14,
|
|
},
|
|
.sdm_en = {
|
|
.reg_off = HHI_MPLL_CNTL7,
|
|
.shift = 30,
|
|
.width = 1,
|
|
},
|
|
.n2 = {
|
|
.reg_off = HHI_MPLL_CNTL7,
|
|
.shift = 20,
|
|
.width = 9,
|
|
},
|
|
.ssen = {
|
|
.reg_off = HHI_MPLL_CNTL7,
|
|
.shift = 29,
|
|
.width = 1,
|
|
},
|
|
.lock = &meson_clk_lock,
|
|
.init_regs = g12a_mpll3_init_regs,
|
|
.init_count = ARRAY_SIZE(g12a_mpll3_init_regs),
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "mpll3_div",
|
|
.ops = &meson_clk_mpll_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_mpll_prediv.hw
|
|
},
|
|
.num_parents = 1,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_mpll3 = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_MPLL_CNTL7,
|
|
.bit_idx = 31,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "mpll3",
|
|
.ops = &clk_regmap_gate_ops,
|
|
.parent_hws = (const struct clk_hw *[]) { &g12a_mpll3_div.hw },
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
static u32 mux_table_clk81[] = { 0, 2, 3, 4, 5, 6, 7 };
|
|
static const struct clk_parent_data clk81_parent_data[] = {
|
|
{ .fw_name = "xtal", },
|
|
{ .hw = &g12a_fclk_div7.hw },
|
|
{ .hw = &g12a_mpll1.hw },
|
|
{ .hw = &g12a_mpll2.hw },
|
|
{ .hw = &g12a_fclk_div4.hw },
|
|
{ .hw = &g12a_fclk_div3.hw },
|
|
{ .hw = &g12a_fclk_div5.hw },
|
|
};
|
|
|
|
static struct clk_regmap g12a_mpeg_clk_sel = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_MPEG_CLK_CNTL,
|
|
.mask = 0x7,
|
|
.shift = 12,
|
|
.table = mux_table_clk81,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "mpeg_clk_sel",
|
|
.ops = &clk_regmap_mux_ro_ops,
|
|
.parent_data = clk81_parent_data,
|
|
.num_parents = ARRAY_SIZE(clk81_parent_data),
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_mpeg_clk_div = {
|
|
.data = &(struct clk_regmap_div_data){
|
|
.offset = HHI_MPEG_CLK_CNTL,
|
|
.shift = 0,
|
|
.width = 7,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "mpeg_clk_div",
|
|
.ops = &clk_regmap_divider_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_mpeg_clk_sel.hw
|
|
},
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_clk81 = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_MPEG_CLK_CNTL,
|
|
.bit_idx = 7,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "clk81",
|
|
.ops = &clk_regmap_gate_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_mpeg_clk_div.hw
|
|
},
|
|
.num_parents = 1,
|
|
.flags = (CLK_SET_RATE_PARENT | CLK_IS_CRITICAL),
|
|
},
|
|
};
|
|
|
|
static const struct clk_parent_data g12a_sd_emmc_clk0_parent_data[] = {
|
|
{ .fw_name = "xtal", },
|
|
{ .hw = &g12a_fclk_div2.hw },
|
|
{ .hw = &g12a_fclk_div3.hw },
|
|
{ .hw = &g12a_fclk_div5.hw },
|
|
{ .hw = &g12a_fclk_div7.hw },
|
|
/*
|
|
* Following these parent clocks, we should also have had mpll2, mpll3
|
|
* and gp0_pll but these clocks are too precious to be used here. All
|
|
* the necessary rates for MMC and NAND operation can be acheived using
|
|
* g12a_ee_core or fclk_div clocks
|
|
*/
|
|
};
|
|
|
|
/* SDIO clock */
|
|
static struct clk_regmap g12a_sd_emmc_a_clk0_sel = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_SD_EMMC_CLK_CNTL,
|
|
.mask = 0x7,
|
|
.shift = 9,
|
|
},
|
|
.hw.init = &(struct clk_init_data) {
|
|
.name = "sd_emmc_a_clk0_sel",
|
|
.ops = &clk_regmap_mux_ops,
|
|
.parent_data = g12a_sd_emmc_clk0_parent_data,
|
|
.num_parents = ARRAY_SIZE(g12a_sd_emmc_clk0_parent_data),
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_sd_emmc_a_clk0_div = {
|
|
.data = &(struct clk_regmap_div_data){
|
|
.offset = HHI_SD_EMMC_CLK_CNTL,
|
|
.shift = 0,
|
|
.width = 7,
|
|
},
|
|
.hw.init = &(struct clk_init_data) {
|
|
.name = "sd_emmc_a_clk0_div",
|
|
.ops = &clk_regmap_divider_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_sd_emmc_a_clk0_sel.hw
|
|
},
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_sd_emmc_a_clk0 = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_SD_EMMC_CLK_CNTL,
|
|
.bit_idx = 7,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "sd_emmc_a_clk0",
|
|
.ops = &clk_regmap_gate_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_sd_emmc_a_clk0_div.hw
|
|
},
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
/* SDcard clock */
|
|
static struct clk_regmap g12a_sd_emmc_b_clk0_sel = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_SD_EMMC_CLK_CNTL,
|
|
.mask = 0x7,
|
|
.shift = 25,
|
|
},
|
|
.hw.init = &(struct clk_init_data) {
|
|
.name = "sd_emmc_b_clk0_sel",
|
|
.ops = &clk_regmap_mux_ops,
|
|
.parent_data = g12a_sd_emmc_clk0_parent_data,
|
|
.num_parents = ARRAY_SIZE(g12a_sd_emmc_clk0_parent_data),
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_sd_emmc_b_clk0_div = {
|
|
.data = &(struct clk_regmap_div_data){
|
|
.offset = HHI_SD_EMMC_CLK_CNTL,
|
|
.shift = 16,
|
|
.width = 7,
|
|
},
|
|
.hw.init = &(struct clk_init_data) {
|
|
.name = "sd_emmc_b_clk0_div",
|
|
.ops = &clk_regmap_divider_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_sd_emmc_b_clk0_sel.hw
|
|
},
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_sd_emmc_b_clk0 = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_SD_EMMC_CLK_CNTL,
|
|
.bit_idx = 23,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "sd_emmc_b_clk0",
|
|
.ops = &clk_regmap_gate_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_sd_emmc_b_clk0_div.hw
|
|
},
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
/* EMMC/NAND clock */
|
|
static struct clk_regmap g12a_sd_emmc_c_clk0_sel = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_NAND_CLK_CNTL,
|
|
.mask = 0x7,
|
|
.shift = 9,
|
|
},
|
|
.hw.init = &(struct clk_init_data) {
|
|
.name = "sd_emmc_c_clk0_sel",
|
|
.ops = &clk_regmap_mux_ops,
|
|
.parent_data = g12a_sd_emmc_clk0_parent_data,
|
|
.num_parents = ARRAY_SIZE(g12a_sd_emmc_clk0_parent_data),
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_sd_emmc_c_clk0_div = {
|
|
.data = &(struct clk_regmap_div_data){
|
|
.offset = HHI_NAND_CLK_CNTL,
|
|
.shift = 0,
|
|
.width = 7,
|
|
},
|
|
.hw.init = &(struct clk_init_data) {
|
|
.name = "sd_emmc_c_clk0_div",
|
|
.ops = &clk_regmap_divider_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_sd_emmc_c_clk0_sel.hw
|
|
},
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_sd_emmc_c_clk0 = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_NAND_CLK_CNTL,
|
|
.bit_idx = 7,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "sd_emmc_c_clk0",
|
|
.ops = &clk_regmap_gate_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_sd_emmc_c_clk0_div.hw
|
|
},
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
/* Video Clocks */
|
|
|
|
static struct clk_regmap g12a_vid_pll_div = {
|
|
.data = &(struct meson_vid_pll_div_data){
|
|
.val = {
|
|
.reg_off = HHI_VID_PLL_CLK_DIV,
|
|
.shift = 0,
|
|
.width = 15,
|
|
},
|
|
.sel = {
|
|
.reg_off = HHI_VID_PLL_CLK_DIV,
|
|
.shift = 16,
|
|
.width = 2,
|
|
},
|
|
},
|
|
.hw.init = &(struct clk_init_data) {
|
|
.name = "vid_pll_div",
|
|
.ops = &meson_vid_pll_div_ro_ops,
|
|
.parent_hws = (const struct clk_hw *[]) { &g12a_hdmi_pll.hw },
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
|
|
},
|
|
};
|
|
|
|
static const struct clk_hw *g12a_vid_pll_parent_hws[] = {
|
|
&g12a_vid_pll_div.hw,
|
|
&g12a_hdmi_pll.hw,
|
|
};
|
|
|
|
static struct clk_regmap g12a_vid_pll_sel = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_VID_PLL_CLK_DIV,
|
|
.mask = 0x1,
|
|
.shift = 18,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "vid_pll_sel",
|
|
.ops = &clk_regmap_mux_ops,
|
|
/*
|
|
* bit 18 selects from 2 possible parents:
|
|
* vid_pll_div or hdmi_pll
|
|
*/
|
|
.parent_hws = g12a_vid_pll_parent_hws,
|
|
.num_parents = ARRAY_SIZE(g12a_vid_pll_parent_hws),
|
|
.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_vid_pll = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_VID_PLL_CLK_DIV,
|
|
.bit_idx = 19,
|
|
},
|
|
.hw.init = &(struct clk_init_data) {
|
|
.name = "vid_pll",
|
|
.ops = &clk_regmap_gate_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_vid_pll_sel.hw
|
|
},
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
|
|
},
|
|
};
|
|
|
|
/* VPU Clock */
|
|
|
|
static const struct clk_hw *g12a_vpu_parent_hws[] = {
|
|
&g12a_fclk_div3.hw,
|
|
&g12a_fclk_div4.hw,
|
|
&g12a_fclk_div5.hw,
|
|
&g12a_fclk_div7.hw,
|
|
&g12a_mpll1.hw,
|
|
&g12a_vid_pll.hw,
|
|
&g12a_hifi_pll.hw,
|
|
&g12a_gp0_pll.hw,
|
|
};
|
|
|
|
static struct clk_regmap g12a_vpu_0_sel = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_VPU_CLK_CNTL,
|
|
.mask = 0x7,
|
|
.shift = 9,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "vpu_0_sel",
|
|
.ops = &clk_regmap_mux_ops,
|
|
.parent_hws = g12a_vpu_parent_hws,
|
|
.num_parents = ARRAY_SIZE(g12a_vpu_parent_hws),
|
|
.flags = CLK_SET_RATE_NO_REPARENT,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_vpu_0_div = {
|
|
.data = &(struct clk_regmap_div_data){
|
|
.offset = HHI_VPU_CLK_CNTL,
|
|
.shift = 0,
|
|
.width = 7,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "vpu_0_div",
|
|
.ops = &clk_regmap_divider_ops,
|
|
.parent_hws = (const struct clk_hw *[]) { &g12a_vpu_0_sel.hw },
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_vpu_0 = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_VPU_CLK_CNTL,
|
|
.bit_idx = 8,
|
|
},
|
|
.hw.init = &(struct clk_init_data) {
|
|
.name = "vpu_0",
|
|
.ops = &clk_regmap_gate_ops,
|
|
.parent_hws = (const struct clk_hw *[]) { &g12a_vpu_0_div.hw },
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_vpu_1_sel = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_VPU_CLK_CNTL,
|
|
.mask = 0x7,
|
|
.shift = 25,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "vpu_1_sel",
|
|
.ops = &clk_regmap_mux_ops,
|
|
.parent_hws = g12a_vpu_parent_hws,
|
|
.num_parents = ARRAY_SIZE(g12a_vpu_parent_hws),
|
|
.flags = CLK_SET_RATE_NO_REPARENT,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_vpu_1_div = {
|
|
.data = &(struct clk_regmap_div_data){
|
|
.offset = HHI_VPU_CLK_CNTL,
|
|
.shift = 16,
|
|
.width = 7,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "vpu_1_div",
|
|
.ops = &clk_regmap_divider_ops,
|
|
.parent_hws = (const struct clk_hw *[]) { &g12a_vpu_1_sel.hw },
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_vpu_1 = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_VPU_CLK_CNTL,
|
|
.bit_idx = 24,
|
|
},
|
|
.hw.init = &(struct clk_init_data) {
|
|
.name = "vpu_1",
|
|
.ops = &clk_regmap_gate_ops,
|
|
.parent_hws = (const struct clk_hw *[]) { &g12a_vpu_1_div.hw },
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_vpu = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_VPU_CLK_CNTL,
|
|
.mask = 1,
|
|
.shift = 31,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "vpu",
|
|
.ops = &clk_regmap_mux_ops,
|
|
/*
|
|
* bit 31 selects from 2 possible parents:
|
|
* vpu_0 or vpu_1
|
|
*/
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_vpu_0.hw,
|
|
&g12a_vpu_1.hw,
|
|
},
|
|
.num_parents = 2,
|
|
.flags = CLK_SET_RATE_NO_REPARENT,
|
|
},
|
|
};
|
|
|
|
/* VDEC clocks */
|
|
|
|
static const struct clk_hw *g12a_vdec_parent_hws[] = {
|
|
&g12a_fclk_div2p5.hw,
|
|
&g12a_fclk_div3.hw,
|
|
&g12a_fclk_div4.hw,
|
|
&g12a_fclk_div5.hw,
|
|
&g12a_fclk_div7.hw,
|
|
&g12a_hifi_pll.hw,
|
|
&g12a_gp0_pll.hw,
|
|
};
|
|
|
|
static struct clk_regmap g12a_vdec_1_sel = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_VDEC_CLK_CNTL,
|
|
.mask = 0x7,
|
|
.shift = 9,
|
|
.flags = CLK_MUX_ROUND_CLOSEST,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "vdec_1_sel",
|
|
.ops = &clk_regmap_mux_ops,
|
|
.parent_hws = g12a_vdec_parent_hws,
|
|
.num_parents = ARRAY_SIZE(g12a_vdec_parent_hws),
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_vdec_1_div = {
|
|
.data = &(struct clk_regmap_div_data){
|
|
.offset = HHI_VDEC_CLK_CNTL,
|
|
.shift = 0,
|
|
.width = 7,
|
|
.flags = CLK_DIVIDER_ROUND_CLOSEST,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "vdec_1_div",
|
|
.ops = &clk_regmap_divider_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_vdec_1_sel.hw
|
|
},
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_vdec_1 = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_VDEC_CLK_CNTL,
|
|
.bit_idx = 8,
|
|
},
|
|
.hw.init = &(struct clk_init_data) {
|
|
.name = "vdec_1",
|
|
.ops = &clk_regmap_gate_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_vdec_1_div.hw
|
|
},
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_vdec_hevcf_sel = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_VDEC2_CLK_CNTL,
|
|
.mask = 0x7,
|
|
.shift = 9,
|
|
.flags = CLK_MUX_ROUND_CLOSEST,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "vdec_hevcf_sel",
|
|
.ops = &clk_regmap_mux_ops,
|
|
.parent_hws = g12a_vdec_parent_hws,
|
|
.num_parents = ARRAY_SIZE(g12a_vdec_parent_hws),
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_vdec_hevcf_div = {
|
|
.data = &(struct clk_regmap_div_data){
|
|
.offset = HHI_VDEC2_CLK_CNTL,
|
|
.shift = 0,
|
|
.width = 7,
|
|
.flags = CLK_DIVIDER_ROUND_CLOSEST,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "vdec_hevcf_div",
|
|
.ops = &clk_regmap_divider_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_vdec_hevcf_sel.hw
|
|
},
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_vdec_hevcf = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_VDEC2_CLK_CNTL,
|
|
.bit_idx = 8,
|
|
},
|
|
.hw.init = &(struct clk_init_data) {
|
|
.name = "vdec_hevcf",
|
|
.ops = &clk_regmap_gate_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_vdec_hevcf_div.hw
|
|
},
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_vdec_hevc_sel = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_VDEC2_CLK_CNTL,
|
|
.mask = 0x7,
|
|
.shift = 25,
|
|
.flags = CLK_MUX_ROUND_CLOSEST,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "vdec_hevc_sel",
|
|
.ops = &clk_regmap_mux_ops,
|
|
.parent_hws = g12a_vdec_parent_hws,
|
|
.num_parents = ARRAY_SIZE(g12a_vdec_parent_hws),
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_vdec_hevc_div = {
|
|
.data = &(struct clk_regmap_div_data){
|
|
.offset = HHI_VDEC2_CLK_CNTL,
|
|
.shift = 16,
|
|
.width = 7,
|
|
.flags = CLK_DIVIDER_ROUND_CLOSEST,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "vdec_hevc_div",
|
|
.ops = &clk_regmap_divider_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_vdec_hevc_sel.hw
|
|
},
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_vdec_hevc = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_VDEC2_CLK_CNTL,
|
|
.bit_idx = 24,
|
|
},
|
|
.hw.init = &(struct clk_init_data) {
|
|
.name = "vdec_hevc",
|
|
.ops = &clk_regmap_gate_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_vdec_hevc_div.hw
|
|
},
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
/* VAPB Clock */
|
|
|
|
static const struct clk_hw *g12a_vapb_parent_hws[] = {
|
|
&g12a_fclk_div4.hw,
|
|
&g12a_fclk_div3.hw,
|
|
&g12a_fclk_div5.hw,
|
|
&g12a_fclk_div7.hw,
|
|
&g12a_mpll1.hw,
|
|
&g12a_vid_pll.hw,
|
|
&g12a_mpll2.hw,
|
|
&g12a_fclk_div2p5.hw,
|
|
};
|
|
|
|
static struct clk_regmap g12a_vapb_0_sel = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_VAPBCLK_CNTL,
|
|
.mask = 0x3,
|
|
.shift = 9,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "vapb_0_sel",
|
|
.ops = &clk_regmap_mux_ops,
|
|
.parent_hws = g12a_vapb_parent_hws,
|
|
.num_parents = ARRAY_SIZE(g12a_vapb_parent_hws),
|
|
.flags = CLK_SET_RATE_NO_REPARENT,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_vapb_0_div = {
|
|
.data = &(struct clk_regmap_div_data){
|
|
.offset = HHI_VAPBCLK_CNTL,
|
|
.shift = 0,
|
|
.width = 7,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "vapb_0_div",
|
|
.ops = &clk_regmap_divider_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_vapb_0_sel.hw
|
|
},
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_vapb_0 = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_VAPBCLK_CNTL,
|
|
.bit_idx = 8,
|
|
},
|
|
.hw.init = &(struct clk_init_data) {
|
|
.name = "vapb_0",
|
|
.ops = &clk_regmap_gate_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_vapb_0_div.hw
|
|
},
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_vapb_1_sel = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_VAPBCLK_CNTL,
|
|
.mask = 0x3,
|
|
.shift = 25,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "vapb_1_sel",
|
|
.ops = &clk_regmap_mux_ops,
|
|
.parent_hws = g12a_vapb_parent_hws,
|
|
.num_parents = ARRAY_SIZE(g12a_vapb_parent_hws),
|
|
.flags = CLK_SET_RATE_NO_REPARENT,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_vapb_1_div = {
|
|
.data = &(struct clk_regmap_div_data){
|
|
.offset = HHI_VAPBCLK_CNTL,
|
|
.shift = 16,
|
|
.width = 7,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "vapb_1_div",
|
|
.ops = &clk_regmap_divider_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_vapb_1_sel.hw
|
|
},
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_vapb_1 = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_VAPBCLK_CNTL,
|
|
.bit_idx = 24,
|
|
},
|
|
.hw.init = &(struct clk_init_data) {
|
|
.name = "vapb_1",
|
|
.ops = &clk_regmap_gate_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_vapb_1_div.hw
|
|
},
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_vapb_sel = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_VAPBCLK_CNTL,
|
|
.mask = 1,
|
|
.shift = 31,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "vapb_sel",
|
|
.ops = &clk_regmap_mux_ops,
|
|
/*
|
|
* bit 31 selects from 2 possible parents:
|
|
* vapb_0 or vapb_1
|
|
*/
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_vapb_0.hw,
|
|
&g12a_vapb_1.hw,
|
|
},
|
|
.num_parents = 2,
|
|
.flags = CLK_SET_RATE_NO_REPARENT,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_vapb = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_VAPBCLK_CNTL,
|
|
.bit_idx = 30,
|
|
},
|
|
.hw.init = &(struct clk_init_data) {
|
|
.name = "vapb",
|
|
.ops = &clk_regmap_gate_ops,
|
|
.parent_hws = (const struct clk_hw *[]) { &g12a_vapb_sel.hw },
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
|
|
},
|
|
};
|
|
|
|
static const struct clk_hw *g12a_vclk_parent_hws[] = {
|
|
&g12a_vid_pll.hw,
|
|
&g12a_gp0_pll.hw,
|
|
&g12a_hifi_pll.hw,
|
|
&g12a_mpll1.hw,
|
|
&g12a_fclk_div3.hw,
|
|
&g12a_fclk_div4.hw,
|
|
&g12a_fclk_div5.hw,
|
|
&g12a_fclk_div7.hw,
|
|
};
|
|
|
|
static struct clk_regmap g12a_vclk_sel = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_VID_CLK_CNTL,
|
|
.mask = 0x7,
|
|
.shift = 16,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "vclk_sel",
|
|
.ops = &clk_regmap_mux_ops,
|
|
.parent_hws = g12a_vclk_parent_hws,
|
|
.num_parents = ARRAY_SIZE(g12a_vclk_parent_hws),
|
|
.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_vclk2_sel = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_VIID_CLK_CNTL,
|
|
.mask = 0x7,
|
|
.shift = 16,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "vclk2_sel",
|
|
.ops = &clk_regmap_mux_ops,
|
|
.parent_hws = g12a_vclk_parent_hws,
|
|
.num_parents = ARRAY_SIZE(g12a_vclk_parent_hws),
|
|
.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_vclk_input = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_VID_CLK_DIV,
|
|
.bit_idx = 16,
|
|
},
|
|
.hw.init = &(struct clk_init_data) {
|
|
.name = "vclk_input",
|
|
.ops = &clk_regmap_gate_ops,
|
|
.parent_hws = (const struct clk_hw *[]) { &g12a_vclk_sel.hw },
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_vclk2_input = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_VIID_CLK_DIV,
|
|
.bit_idx = 16,
|
|
},
|
|
.hw.init = &(struct clk_init_data) {
|
|
.name = "vclk2_input",
|
|
.ops = &clk_regmap_gate_ops,
|
|
.parent_hws = (const struct clk_hw *[]) { &g12a_vclk2_sel.hw },
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_vclk_div = {
|
|
.data = &(struct clk_regmap_div_data){
|
|
.offset = HHI_VID_CLK_DIV,
|
|
.shift = 0,
|
|
.width = 8,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "vclk_div",
|
|
.ops = &clk_regmap_divider_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_vclk_input.hw
|
|
},
|
|
.num_parents = 1,
|
|
.flags = CLK_GET_RATE_NOCACHE,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_vclk2_div = {
|
|
.data = &(struct clk_regmap_div_data){
|
|
.offset = HHI_VIID_CLK_DIV,
|
|
.shift = 0,
|
|
.width = 8,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "vclk2_div",
|
|
.ops = &clk_regmap_divider_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_vclk2_input.hw
|
|
},
|
|
.num_parents = 1,
|
|
.flags = CLK_GET_RATE_NOCACHE,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_vclk = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_VID_CLK_CNTL,
|
|
.bit_idx = 19,
|
|
},
|
|
.hw.init = &(struct clk_init_data) {
|
|
.name = "vclk",
|
|
.ops = &clk_regmap_gate_ops,
|
|
.parent_hws = (const struct clk_hw *[]) { &g12a_vclk_div.hw },
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_vclk2 = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_VIID_CLK_CNTL,
|
|
.bit_idx = 19,
|
|
},
|
|
.hw.init = &(struct clk_init_data) {
|
|
.name = "vclk2",
|
|
.ops = &clk_regmap_gate_ops,
|
|
.parent_hws = (const struct clk_hw *[]) { &g12a_vclk2_div.hw },
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_vclk_div1 = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_VID_CLK_CNTL,
|
|
.bit_idx = 0,
|
|
},
|
|
.hw.init = &(struct clk_init_data) {
|
|
.name = "vclk_div1",
|
|
.ops = &clk_regmap_gate_ops,
|
|
.parent_hws = (const struct clk_hw *[]) { &g12a_vclk.hw },
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_vclk_div2_en = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_VID_CLK_CNTL,
|
|
.bit_idx = 1,
|
|
},
|
|
.hw.init = &(struct clk_init_data) {
|
|
.name = "vclk_div2_en",
|
|
.ops = &clk_regmap_gate_ops,
|
|
.parent_hws = (const struct clk_hw *[]) { &g12a_vclk.hw },
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_vclk_div4_en = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_VID_CLK_CNTL,
|
|
.bit_idx = 2,
|
|
},
|
|
.hw.init = &(struct clk_init_data) {
|
|
.name = "vclk_div4_en",
|
|
.ops = &clk_regmap_gate_ops,
|
|
.parent_hws = (const struct clk_hw *[]) { &g12a_vclk.hw },
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_vclk_div6_en = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_VID_CLK_CNTL,
|
|
.bit_idx = 3,
|
|
},
|
|
.hw.init = &(struct clk_init_data) {
|
|
.name = "vclk_div6_en",
|
|
.ops = &clk_regmap_gate_ops,
|
|
.parent_hws = (const struct clk_hw *[]) { &g12a_vclk.hw },
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_vclk_div12_en = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_VID_CLK_CNTL,
|
|
.bit_idx = 4,
|
|
},
|
|
.hw.init = &(struct clk_init_data) {
|
|
.name = "vclk_div12_en",
|
|
.ops = &clk_regmap_gate_ops,
|
|
.parent_hws = (const struct clk_hw *[]) { &g12a_vclk.hw },
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_vclk2_div1 = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_VIID_CLK_CNTL,
|
|
.bit_idx = 0,
|
|
},
|
|
.hw.init = &(struct clk_init_data) {
|
|
.name = "vclk2_div1",
|
|
.ops = &clk_regmap_gate_ops,
|
|
.parent_hws = (const struct clk_hw *[]) { &g12a_vclk2.hw },
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_vclk2_div2_en = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_VIID_CLK_CNTL,
|
|
.bit_idx = 1,
|
|
},
|
|
.hw.init = &(struct clk_init_data) {
|
|
.name = "vclk2_div2_en",
|
|
.ops = &clk_regmap_gate_ops,
|
|
.parent_hws = (const struct clk_hw *[]) { &g12a_vclk2.hw },
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_vclk2_div4_en = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_VIID_CLK_CNTL,
|
|
.bit_idx = 2,
|
|
},
|
|
.hw.init = &(struct clk_init_data) {
|
|
.name = "vclk2_div4_en",
|
|
.ops = &clk_regmap_gate_ops,
|
|
.parent_hws = (const struct clk_hw *[]) { &g12a_vclk2.hw },
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_vclk2_div6_en = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_VIID_CLK_CNTL,
|
|
.bit_idx = 3,
|
|
},
|
|
.hw.init = &(struct clk_init_data) {
|
|
.name = "vclk2_div6_en",
|
|
.ops = &clk_regmap_gate_ops,
|
|
.parent_hws = (const struct clk_hw *[]) { &g12a_vclk2.hw },
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_vclk2_div12_en = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_VIID_CLK_CNTL,
|
|
.bit_idx = 4,
|
|
},
|
|
.hw.init = &(struct clk_init_data) {
|
|
.name = "vclk2_div12_en",
|
|
.ops = &clk_regmap_gate_ops,
|
|
.parent_hws = (const struct clk_hw *[]) { &g12a_vclk2.hw },
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
|
|
},
|
|
};
|
|
|
|
static struct clk_fixed_factor g12a_vclk_div2 = {
|
|
.mult = 1,
|
|
.div = 2,
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "vclk_div2",
|
|
.ops = &clk_fixed_factor_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_vclk_div2_en.hw
|
|
},
|
|
.num_parents = 1,
|
|
},
|
|
};
|
|
|
|
static struct clk_fixed_factor g12a_vclk_div4 = {
|
|
.mult = 1,
|
|
.div = 4,
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "vclk_div4",
|
|
.ops = &clk_fixed_factor_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_vclk_div4_en.hw
|
|
},
|
|
.num_parents = 1,
|
|
},
|
|
};
|
|
|
|
static struct clk_fixed_factor g12a_vclk_div6 = {
|
|
.mult = 1,
|
|
.div = 6,
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "vclk_div6",
|
|
.ops = &clk_fixed_factor_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_vclk_div6_en.hw
|
|
},
|
|
.num_parents = 1,
|
|
},
|
|
};
|
|
|
|
static struct clk_fixed_factor g12a_vclk_div12 = {
|
|
.mult = 1,
|
|
.div = 12,
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "vclk_div12",
|
|
.ops = &clk_fixed_factor_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_vclk_div12_en.hw
|
|
},
|
|
.num_parents = 1,
|
|
},
|
|
};
|
|
|
|
static struct clk_fixed_factor g12a_vclk2_div2 = {
|
|
.mult = 1,
|
|
.div = 2,
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "vclk2_div2",
|
|
.ops = &clk_fixed_factor_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_vclk2_div2_en.hw
|
|
},
|
|
.num_parents = 1,
|
|
},
|
|
};
|
|
|
|
static struct clk_fixed_factor g12a_vclk2_div4 = {
|
|
.mult = 1,
|
|
.div = 4,
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "vclk2_div4",
|
|
.ops = &clk_fixed_factor_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_vclk2_div4_en.hw
|
|
},
|
|
.num_parents = 1,
|
|
},
|
|
};
|
|
|
|
static struct clk_fixed_factor g12a_vclk2_div6 = {
|
|
.mult = 1,
|
|
.div = 6,
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "vclk2_div6",
|
|
.ops = &clk_fixed_factor_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_vclk2_div6_en.hw
|
|
},
|
|
.num_parents = 1,
|
|
},
|
|
};
|
|
|
|
static struct clk_fixed_factor g12a_vclk2_div12 = {
|
|
.mult = 1,
|
|
.div = 12,
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "vclk2_div12",
|
|
.ops = &clk_fixed_factor_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_vclk2_div12_en.hw
|
|
},
|
|
.num_parents = 1,
|
|
},
|
|
};
|
|
|
|
static u32 mux_table_cts_sel[] = { 0, 1, 2, 3, 4, 8, 9, 10, 11, 12 };
|
|
static const struct clk_hw *g12a_cts_parent_hws[] = {
|
|
&g12a_vclk_div1.hw,
|
|
&g12a_vclk_div2.hw,
|
|
&g12a_vclk_div4.hw,
|
|
&g12a_vclk_div6.hw,
|
|
&g12a_vclk_div12.hw,
|
|
&g12a_vclk2_div1.hw,
|
|
&g12a_vclk2_div2.hw,
|
|
&g12a_vclk2_div4.hw,
|
|
&g12a_vclk2_div6.hw,
|
|
&g12a_vclk2_div12.hw,
|
|
};
|
|
|
|
static struct clk_regmap g12a_cts_enci_sel = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_VID_CLK_DIV,
|
|
.mask = 0xf,
|
|
.shift = 28,
|
|
.table = mux_table_cts_sel,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "cts_enci_sel",
|
|
.ops = &clk_regmap_mux_ops,
|
|
.parent_hws = g12a_cts_parent_hws,
|
|
.num_parents = ARRAY_SIZE(g12a_cts_parent_hws),
|
|
.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_cts_encp_sel = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_VID_CLK_DIV,
|
|
.mask = 0xf,
|
|
.shift = 20,
|
|
.table = mux_table_cts_sel,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "cts_encp_sel",
|
|
.ops = &clk_regmap_mux_ops,
|
|
.parent_hws = g12a_cts_parent_hws,
|
|
.num_parents = ARRAY_SIZE(g12a_cts_parent_hws),
|
|
.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_cts_vdac_sel = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_VIID_CLK_DIV,
|
|
.mask = 0xf,
|
|
.shift = 28,
|
|
.table = mux_table_cts_sel,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "cts_vdac_sel",
|
|
.ops = &clk_regmap_mux_ops,
|
|
.parent_hws = g12a_cts_parent_hws,
|
|
.num_parents = ARRAY_SIZE(g12a_cts_parent_hws),
|
|
.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
|
|
},
|
|
};
|
|
|
|
/* TOFIX: add support for cts_tcon */
|
|
static u32 mux_table_hdmi_tx_sel[] = { 0, 1, 2, 3, 4, 8, 9, 10, 11, 12 };
|
|
static const struct clk_hw *g12a_cts_hdmi_tx_parent_hws[] = {
|
|
&g12a_vclk_div1.hw,
|
|
&g12a_vclk_div2.hw,
|
|
&g12a_vclk_div4.hw,
|
|
&g12a_vclk_div6.hw,
|
|
&g12a_vclk_div12.hw,
|
|
&g12a_vclk2_div1.hw,
|
|
&g12a_vclk2_div2.hw,
|
|
&g12a_vclk2_div4.hw,
|
|
&g12a_vclk2_div6.hw,
|
|
&g12a_vclk2_div12.hw,
|
|
};
|
|
|
|
static struct clk_regmap g12a_hdmi_tx_sel = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_HDMI_CLK_CNTL,
|
|
.mask = 0xf,
|
|
.shift = 16,
|
|
.table = mux_table_hdmi_tx_sel,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "hdmi_tx_sel",
|
|
.ops = &clk_regmap_mux_ops,
|
|
.parent_hws = g12a_cts_hdmi_tx_parent_hws,
|
|
.num_parents = ARRAY_SIZE(g12a_cts_hdmi_tx_parent_hws),
|
|
.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_cts_enci = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_VID_CLK_CNTL2,
|
|
.bit_idx = 0,
|
|
},
|
|
.hw.init = &(struct clk_init_data) {
|
|
.name = "cts_enci",
|
|
.ops = &clk_regmap_gate_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_cts_enci_sel.hw
|
|
},
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_cts_encp = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_VID_CLK_CNTL2,
|
|
.bit_idx = 2,
|
|
},
|
|
.hw.init = &(struct clk_init_data) {
|
|
.name = "cts_encp",
|
|
.ops = &clk_regmap_gate_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_cts_encp_sel.hw
|
|
},
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_cts_vdac = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_VID_CLK_CNTL2,
|
|
.bit_idx = 4,
|
|
},
|
|
.hw.init = &(struct clk_init_data) {
|
|
.name = "cts_vdac",
|
|
.ops = &clk_regmap_gate_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_cts_vdac_sel.hw
|
|
},
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_hdmi_tx = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_VID_CLK_CNTL2,
|
|
.bit_idx = 5,
|
|
},
|
|
.hw.init = &(struct clk_init_data) {
|
|
.name = "hdmi_tx",
|
|
.ops = &clk_regmap_gate_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_hdmi_tx_sel.hw
|
|
},
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
|
|
},
|
|
};
|
|
|
|
/* HDMI Clocks */
|
|
|
|
static const struct clk_parent_data g12a_hdmi_parent_data[] = {
|
|
{ .fw_name = "xtal", },
|
|
{ .hw = &g12a_fclk_div4.hw },
|
|
{ .hw = &g12a_fclk_div3.hw },
|
|
{ .hw = &g12a_fclk_div5.hw },
|
|
};
|
|
|
|
static struct clk_regmap g12a_hdmi_sel = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_HDMI_CLK_CNTL,
|
|
.mask = 0x3,
|
|
.shift = 9,
|
|
.flags = CLK_MUX_ROUND_CLOSEST,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "hdmi_sel",
|
|
.ops = &clk_regmap_mux_ops,
|
|
.parent_data = g12a_hdmi_parent_data,
|
|
.num_parents = ARRAY_SIZE(g12a_hdmi_parent_data),
|
|
.flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_hdmi_div = {
|
|
.data = &(struct clk_regmap_div_data){
|
|
.offset = HHI_HDMI_CLK_CNTL,
|
|
.shift = 0,
|
|
.width = 7,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "hdmi_div",
|
|
.ops = &clk_regmap_divider_ops,
|
|
.parent_hws = (const struct clk_hw *[]) { &g12a_hdmi_sel.hw },
|
|
.num_parents = 1,
|
|
.flags = CLK_GET_RATE_NOCACHE,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_hdmi = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_HDMI_CLK_CNTL,
|
|
.bit_idx = 8,
|
|
},
|
|
.hw.init = &(struct clk_init_data) {
|
|
.name = "hdmi",
|
|
.ops = &clk_regmap_gate_ops,
|
|
.parent_hws = (const struct clk_hw *[]) { &g12a_hdmi_div.hw },
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
|
|
},
|
|
};
|
|
|
|
/*
|
|
* The MALI IP is clocked by two identical clocks (mali_0 and mali_1)
|
|
* muxed by a glitch-free switch. The CCF can manage this glitch-free
|
|
* mux because it does top-to-bottom updates the each clock tree and
|
|
* switches to the "inactive" one when CLK_SET_RATE_GATE is set.
|
|
*/
|
|
static const struct clk_parent_data g12a_mali_0_1_parent_data[] = {
|
|
{ .fw_name = "xtal", },
|
|
{ .hw = &g12a_gp0_pll.hw },
|
|
{ .hw = &g12a_hifi_pll.hw },
|
|
{ .hw = &g12a_fclk_div2p5.hw },
|
|
{ .hw = &g12a_fclk_div3.hw },
|
|
{ .hw = &g12a_fclk_div4.hw },
|
|
{ .hw = &g12a_fclk_div5.hw },
|
|
{ .hw = &g12a_fclk_div7.hw },
|
|
};
|
|
|
|
static struct clk_regmap g12a_mali_0_sel = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_MALI_CLK_CNTL,
|
|
.mask = 0x7,
|
|
.shift = 9,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "mali_0_sel",
|
|
.ops = &clk_regmap_mux_ops,
|
|
.parent_data = g12a_mali_0_1_parent_data,
|
|
.num_parents = 8,
|
|
/*
|
|
* Don't request the parent to change the rate because
|
|
* all GPU frequencies can be derived from the fclk_*
|
|
* clocks and one special GP0_PLL setting. This is
|
|
* important because we need the MPLL clocks for audio.
|
|
*/
|
|
.flags = 0,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_mali_0_div = {
|
|
.data = &(struct clk_regmap_div_data){
|
|
.offset = HHI_MALI_CLK_CNTL,
|
|
.shift = 0,
|
|
.width = 7,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "mali_0_div",
|
|
.ops = &clk_regmap_divider_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_mali_0_sel.hw
|
|
},
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_mali_0 = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_MALI_CLK_CNTL,
|
|
.bit_idx = 8,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "mali_0",
|
|
.ops = &clk_regmap_gate_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_mali_0_div.hw
|
|
},
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_GATE | CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_mali_1_sel = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_MALI_CLK_CNTL,
|
|
.mask = 0x7,
|
|
.shift = 25,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "mali_1_sel",
|
|
.ops = &clk_regmap_mux_ops,
|
|
.parent_data = g12a_mali_0_1_parent_data,
|
|
.num_parents = 8,
|
|
/*
|
|
* Don't request the parent to change the rate because
|
|
* all GPU frequencies can be derived from the fclk_*
|
|
* clocks and one special GP0_PLL setting. This is
|
|
* important because we need the MPLL clocks for audio.
|
|
*/
|
|
.flags = 0,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_mali_1_div = {
|
|
.data = &(struct clk_regmap_div_data){
|
|
.offset = HHI_MALI_CLK_CNTL,
|
|
.shift = 16,
|
|
.width = 7,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "mali_1_div",
|
|
.ops = &clk_regmap_divider_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_mali_1_sel.hw
|
|
},
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_mali_1 = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_MALI_CLK_CNTL,
|
|
.bit_idx = 24,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "mali_1",
|
|
.ops = &clk_regmap_gate_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_mali_1_div.hw
|
|
},
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_GATE | CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
static const struct clk_hw *g12a_mali_parent_hws[] = {
|
|
&g12a_mali_0.hw,
|
|
&g12a_mali_1.hw,
|
|
};
|
|
|
|
static struct clk_regmap g12a_mali = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_MALI_CLK_CNTL,
|
|
.mask = 1,
|
|
.shift = 31,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "mali",
|
|
.ops = &clk_regmap_mux_ops,
|
|
.parent_hws = g12a_mali_parent_hws,
|
|
.num_parents = 2,
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_ts_div = {
|
|
.data = &(struct clk_regmap_div_data){
|
|
.offset = HHI_TS_CLK_CNTL,
|
|
.shift = 0,
|
|
.width = 8,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "ts_div",
|
|
.ops = &clk_regmap_divider_ro_ops,
|
|
.parent_data = &(const struct clk_parent_data) {
|
|
.fw_name = "xtal",
|
|
},
|
|
.num_parents = 1,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_ts = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_TS_CLK_CNTL,
|
|
.bit_idx = 8,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "ts",
|
|
.ops = &clk_regmap_gate_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_ts_div.hw
|
|
},
|
|
.num_parents = 1,
|
|
},
|
|
};
|
|
|
|
/* SPICC SCLK source clock */
|
|
|
|
static const struct clk_parent_data spicc_sclk_parent_data[] = {
|
|
{ .fw_name = "xtal", },
|
|
{ .hw = &g12a_clk81.hw },
|
|
{ .hw = &g12a_fclk_div4.hw },
|
|
{ .hw = &g12a_fclk_div3.hw },
|
|
{ .hw = &g12a_fclk_div5.hw },
|
|
{ .hw = &g12a_fclk_div7.hw },
|
|
};
|
|
|
|
static struct clk_regmap g12a_spicc0_sclk_sel = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_SPICC_CLK_CNTL,
|
|
.mask = 7,
|
|
.shift = 7,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "spicc0_sclk_sel",
|
|
.ops = &clk_regmap_mux_ops,
|
|
.parent_data = spicc_sclk_parent_data,
|
|
.num_parents = ARRAY_SIZE(spicc_sclk_parent_data),
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_spicc0_sclk_div = {
|
|
.data = &(struct clk_regmap_div_data){
|
|
.offset = HHI_SPICC_CLK_CNTL,
|
|
.shift = 0,
|
|
.width = 6,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "spicc0_sclk_div",
|
|
.ops = &clk_regmap_divider_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_spicc0_sclk_sel.hw
|
|
},
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_spicc0_sclk = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_SPICC_CLK_CNTL,
|
|
.bit_idx = 6,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "spicc0_sclk",
|
|
.ops = &clk_regmap_gate_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_spicc0_sclk_div.hw
|
|
},
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_spicc1_sclk_sel = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_SPICC_CLK_CNTL,
|
|
.mask = 7,
|
|
.shift = 23,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "spicc1_sclk_sel",
|
|
.ops = &clk_regmap_mux_ops,
|
|
.parent_data = spicc_sclk_parent_data,
|
|
.num_parents = ARRAY_SIZE(spicc_sclk_parent_data),
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_spicc1_sclk_div = {
|
|
.data = &(struct clk_regmap_div_data){
|
|
.offset = HHI_SPICC_CLK_CNTL,
|
|
.shift = 16,
|
|
.width = 6,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "spicc1_sclk_div",
|
|
.ops = &clk_regmap_divider_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_spicc1_sclk_sel.hw
|
|
},
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap g12a_spicc1_sclk = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_SPICC_CLK_CNTL,
|
|
.bit_idx = 22,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "spicc1_sclk",
|
|
.ops = &clk_regmap_gate_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&g12a_spicc1_sclk_div.hw
|
|
},
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
/* Neural Network Accelerator source clock */
|
|
|
|
static const struct clk_parent_data nna_clk_parent_data[] = {
|
|
{ .fw_name = "xtal", },
|
|
{ .hw = &g12a_gp0_pll.hw, },
|
|
{ .hw = &g12a_hifi_pll.hw, },
|
|
{ .hw = &g12a_fclk_div2p5.hw, },
|
|
{ .hw = &g12a_fclk_div3.hw, },
|
|
{ .hw = &g12a_fclk_div4.hw, },
|
|
{ .hw = &g12a_fclk_div5.hw, },
|
|
{ .hw = &g12a_fclk_div7.hw },
|
|
};
|
|
|
|
static struct clk_regmap sm1_nna_axi_clk_sel = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_NNA_CLK_CNTL,
|
|
.mask = 7,
|
|
.shift = 9,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "nna_axi_clk_sel",
|
|
.ops = &clk_regmap_mux_ops,
|
|
.parent_data = nna_clk_parent_data,
|
|
.num_parents = ARRAY_SIZE(nna_clk_parent_data),
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap sm1_nna_axi_clk_div = {
|
|
.data = &(struct clk_regmap_div_data){
|
|
.offset = HHI_NNA_CLK_CNTL,
|
|
.shift = 0,
|
|
.width = 7,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "nna_axi_clk_div",
|
|
.ops = &clk_regmap_divider_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&sm1_nna_axi_clk_sel.hw
|
|
},
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap sm1_nna_axi_clk = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_NNA_CLK_CNTL,
|
|
.bit_idx = 8,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "nna_axi_clk",
|
|
.ops = &clk_regmap_gate_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&sm1_nna_axi_clk_div.hw
|
|
},
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap sm1_nna_core_clk_sel = {
|
|
.data = &(struct clk_regmap_mux_data){
|
|
.offset = HHI_NNA_CLK_CNTL,
|
|
.mask = 7,
|
|
.shift = 25,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "nna_core_clk_sel",
|
|
.ops = &clk_regmap_mux_ops,
|
|
.parent_data = nna_clk_parent_data,
|
|
.num_parents = ARRAY_SIZE(nna_clk_parent_data),
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap sm1_nna_core_clk_div = {
|
|
.data = &(struct clk_regmap_div_data){
|
|
.offset = HHI_NNA_CLK_CNTL,
|
|
.shift = 16,
|
|
.width = 7,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "nna_core_clk_div",
|
|
.ops = &clk_regmap_divider_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&sm1_nna_core_clk_sel.hw
|
|
},
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
static struct clk_regmap sm1_nna_core_clk = {
|
|
.data = &(struct clk_regmap_gate_data){
|
|
.offset = HHI_NNA_CLK_CNTL,
|
|
.bit_idx = 24,
|
|
},
|
|
.hw.init = &(struct clk_init_data){
|
|
.name = "nna_core_clk",
|
|
.ops = &clk_regmap_gate_ops,
|
|
.parent_hws = (const struct clk_hw *[]) {
|
|
&sm1_nna_core_clk_div.hw
|
|
},
|
|
.num_parents = 1,
|
|
.flags = CLK_SET_RATE_PARENT,
|
|
},
|
|
};
|
|
|
|
#define MESON_GATE(_name, _reg, _bit) \
|
|
MESON_PCLK(_name, _reg, _bit, &g12a_clk81.hw)
|
|
|
|
#define MESON_GATE_RO(_name, _reg, _bit) \
|
|
MESON_PCLK_RO(_name, _reg, _bit, &g12a_clk81.hw)
|
|
|
|
/* Everything Else (EE) domain gates */
|
|
static MESON_GATE(g12a_ddr, HHI_GCLK_MPEG0, 0);
|
|
static MESON_GATE(g12a_dos, HHI_GCLK_MPEG0, 1);
|
|
static MESON_GATE(g12a_audio_locker, HHI_GCLK_MPEG0, 2);
|
|
static MESON_GATE(g12a_mipi_dsi_host, HHI_GCLK_MPEG0, 3);
|
|
static MESON_GATE(g12a_eth_phy, HHI_GCLK_MPEG0, 4);
|
|
static MESON_GATE(g12a_isa, HHI_GCLK_MPEG0, 5);
|
|
static MESON_GATE(g12a_pl301, HHI_GCLK_MPEG0, 6);
|
|
static MESON_GATE(g12a_periphs, HHI_GCLK_MPEG0, 7);
|
|
static MESON_GATE(g12a_spicc_0, HHI_GCLK_MPEG0, 8);
|
|
static MESON_GATE(g12a_i2c, HHI_GCLK_MPEG0, 9);
|
|
static MESON_GATE(g12a_sana, HHI_GCLK_MPEG0, 10);
|
|
static MESON_GATE(g12a_sd, HHI_GCLK_MPEG0, 11);
|
|
static MESON_GATE(g12a_rng0, HHI_GCLK_MPEG0, 12);
|
|
static MESON_GATE(g12a_uart0, HHI_GCLK_MPEG0, 13);
|
|
static MESON_GATE(g12a_spicc_1, HHI_GCLK_MPEG0, 14);
|
|
static MESON_GATE(g12a_hiu_reg, HHI_GCLK_MPEG0, 19);
|
|
static MESON_GATE(g12a_mipi_dsi_phy, HHI_GCLK_MPEG0, 20);
|
|
static MESON_GATE(g12a_assist_misc, HHI_GCLK_MPEG0, 23);
|
|
static MESON_GATE(g12a_emmc_a, HHI_GCLK_MPEG0, 4);
|
|
static MESON_GATE(g12a_emmc_b, HHI_GCLK_MPEG0, 25);
|
|
static MESON_GATE(g12a_emmc_c, HHI_GCLK_MPEG0, 26);
|
|
static MESON_GATE(g12a_audio_codec, HHI_GCLK_MPEG0, 28);
|
|
|
|
static MESON_GATE(g12a_audio, HHI_GCLK_MPEG1, 0);
|
|
static MESON_GATE(g12a_eth_core, HHI_GCLK_MPEG1, 3);
|
|
static MESON_GATE(g12a_demux, HHI_GCLK_MPEG1, 4);
|
|
static MESON_GATE(g12a_audio_ififo, HHI_GCLK_MPEG1, 11);
|
|
static MESON_GATE(g12a_adc, HHI_GCLK_MPEG1, 13);
|
|
static MESON_GATE(g12a_uart1, HHI_GCLK_MPEG1, 16);
|
|
static MESON_GATE(g12a_g2d, HHI_GCLK_MPEG1, 20);
|
|
static MESON_GATE(g12a_reset, HHI_GCLK_MPEG1, 23);
|
|
static MESON_GATE(g12a_pcie_comb, HHI_GCLK_MPEG1, 24);
|
|
static MESON_GATE(g12a_parser, HHI_GCLK_MPEG1, 25);
|
|
static MESON_GATE(g12a_usb_general, HHI_GCLK_MPEG1, 26);
|
|
static MESON_GATE(g12a_pcie_phy, HHI_GCLK_MPEG1, 27);
|
|
static MESON_GATE(g12a_ahb_arb0, HHI_GCLK_MPEG1, 29);
|
|
|
|
static MESON_GATE(g12a_ahb_data_bus, HHI_GCLK_MPEG2, 1);
|
|
static MESON_GATE(g12a_ahb_ctrl_bus, HHI_GCLK_MPEG2, 2);
|
|
static MESON_GATE(g12a_htx_hdcp22, HHI_GCLK_MPEG2, 3);
|
|
static MESON_GATE(g12a_htx_pclk, HHI_GCLK_MPEG2, 4);
|
|
static MESON_GATE(g12a_bt656, HHI_GCLK_MPEG2, 6);
|
|
static MESON_GATE(g12a_usb1_to_ddr, HHI_GCLK_MPEG2, 8);
|
|
static MESON_GATE(g12a_mmc_pclk, HHI_GCLK_MPEG2, 11);
|
|
static MESON_GATE(g12a_uart2, HHI_GCLK_MPEG2, 15);
|
|
static MESON_GATE(g12a_vpu_intr, HHI_GCLK_MPEG2, 25);
|
|
static MESON_GATE(g12a_gic, HHI_GCLK_MPEG2, 30);
|
|
|
|
static MESON_GATE(g12a_vclk2_venci0, HHI_GCLK_OTHER, 1);
|
|
static MESON_GATE(g12a_vclk2_venci1, HHI_GCLK_OTHER, 2);
|
|
static MESON_GATE(g12a_vclk2_vencp0, HHI_GCLK_OTHER, 3);
|
|
static MESON_GATE(g12a_vclk2_vencp1, HHI_GCLK_OTHER, 4);
|
|
static MESON_GATE(g12a_vclk2_venct0, HHI_GCLK_OTHER, 5);
|
|
static MESON_GATE(g12a_vclk2_venct1, HHI_GCLK_OTHER, 6);
|
|
static MESON_GATE(g12a_vclk2_other, HHI_GCLK_OTHER, 7);
|
|
static MESON_GATE(g12a_vclk2_enci, HHI_GCLK_OTHER, 8);
|
|
static MESON_GATE(g12a_vclk2_encp, HHI_GCLK_OTHER, 9);
|
|
static MESON_GATE(g12a_dac_clk, HHI_GCLK_OTHER, 10);
|
|
static MESON_GATE(g12a_aoclk_gate, HHI_GCLK_OTHER, 14);
|
|
static MESON_GATE(g12a_iec958_gate, HHI_GCLK_OTHER, 16);
|
|
static MESON_GATE(g12a_enc480p, HHI_GCLK_OTHER, 20);
|
|
static MESON_GATE(g12a_rng1, HHI_GCLK_OTHER, 21);
|
|
static MESON_GATE(g12a_vclk2_enct, HHI_GCLK_OTHER, 22);
|
|
static MESON_GATE(g12a_vclk2_encl, HHI_GCLK_OTHER, 23);
|
|
static MESON_GATE(g12a_vclk2_venclmmc, HHI_GCLK_OTHER, 24);
|
|
static MESON_GATE(g12a_vclk2_vencl, HHI_GCLK_OTHER, 25);
|
|
static MESON_GATE(g12a_vclk2_other1, HHI_GCLK_OTHER, 26);
|
|
|
|
static MESON_GATE_RO(g12a_dma, HHI_GCLK_OTHER2, 0);
|
|
static MESON_GATE_RO(g12a_efuse, HHI_GCLK_OTHER2, 1);
|
|
static MESON_GATE_RO(g12a_rom_boot, HHI_GCLK_OTHER2, 2);
|
|
static MESON_GATE_RO(g12a_reset_sec, HHI_GCLK_OTHER2, 3);
|
|
static MESON_GATE_RO(g12a_sec_ahb_apb3, HHI_GCLK_OTHER2, 4);
|
|
|
|
/* Array of all clocks provided by this provider */
|
|
static struct clk_hw_onecell_data g12a_hw_onecell_data = {
|
|
.hws = {
|
|
[CLKID_SYS_PLL] = &g12a_sys_pll.hw,
|
|
[CLKID_FIXED_PLL] = &g12a_fixed_pll.hw,
|
|
[CLKID_FCLK_DIV2] = &g12a_fclk_div2.hw,
|
|
[CLKID_FCLK_DIV3] = &g12a_fclk_div3.hw,
|
|
[CLKID_FCLK_DIV4] = &g12a_fclk_div4.hw,
|
|
[CLKID_FCLK_DIV5] = &g12a_fclk_div5.hw,
|
|
[CLKID_FCLK_DIV7] = &g12a_fclk_div7.hw,
|
|
[CLKID_FCLK_DIV2P5] = &g12a_fclk_div2p5.hw,
|
|
[CLKID_GP0_PLL] = &g12a_gp0_pll.hw,
|
|
[CLKID_MPEG_SEL] = &g12a_mpeg_clk_sel.hw,
|
|
[CLKID_MPEG_DIV] = &g12a_mpeg_clk_div.hw,
|
|
[CLKID_CLK81] = &g12a_clk81.hw,
|
|
[CLKID_MPLL0] = &g12a_mpll0.hw,
|
|
[CLKID_MPLL1] = &g12a_mpll1.hw,
|
|
[CLKID_MPLL2] = &g12a_mpll2.hw,
|
|
[CLKID_MPLL3] = &g12a_mpll3.hw,
|
|
[CLKID_DDR] = &g12a_ddr.hw,
|
|
[CLKID_DOS] = &g12a_dos.hw,
|
|
[CLKID_AUDIO_LOCKER] = &g12a_audio_locker.hw,
|
|
[CLKID_MIPI_DSI_HOST] = &g12a_mipi_dsi_host.hw,
|
|
[CLKID_ETH_PHY] = &g12a_eth_phy.hw,
|
|
[CLKID_ISA] = &g12a_isa.hw,
|
|
[CLKID_PL301] = &g12a_pl301.hw,
|
|
[CLKID_PERIPHS] = &g12a_periphs.hw,
|
|
[CLKID_SPICC0] = &g12a_spicc_0.hw,
|
|
[CLKID_I2C] = &g12a_i2c.hw,
|
|
[CLKID_SANA] = &g12a_sana.hw,
|
|
[CLKID_SD] = &g12a_sd.hw,
|
|
[CLKID_RNG0] = &g12a_rng0.hw,
|
|
[CLKID_UART0] = &g12a_uart0.hw,
|
|
[CLKID_SPICC1] = &g12a_spicc_1.hw,
|
|
[CLKID_HIU_IFACE] = &g12a_hiu_reg.hw,
|
|
[CLKID_MIPI_DSI_PHY] = &g12a_mipi_dsi_phy.hw,
|
|
[CLKID_ASSIST_MISC] = &g12a_assist_misc.hw,
|
|
[CLKID_SD_EMMC_A] = &g12a_emmc_a.hw,
|
|
[CLKID_SD_EMMC_B] = &g12a_emmc_b.hw,
|
|
[CLKID_SD_EMMC_C] = &g12a_emmc_c.hw,
|
|
[CLKID_AUDIO_CODEC] = &g12a_audio_codec.hw,
|
|
[CLKID_AUDIO] = &g12a_audio.hw,
|
|
[CLKID_ETH] = &g12a_eth_core.hw,
|
|
[CLKID_DEMUX] = &g12a_demux.hw,
|
|
[CLKID_AUDIO_IFIFO] = &g12a_audio_ififo.hw,
|
|
[CLKID_ADC] = &g12a_adc.hw,
|
|
[CLKID_UART1] = &g12a_uart1.hw,
|
|
[CLKID_G2D] = &g12a_g2d.hw,
|
|
[CLKID_RESET] = &g12a_reset.hw,
|
|
[CLKID_PCIE_COMB] = &g12a_pcie_comb.hw,
|
|
[CLKID_PARSER] = &g12a_parser.hw,
|
|
[CLKID_USB] = &g12a_usb_general.hw,
|
|
[CLKID_PCIE_PHY] = &g12a_pcie_phy.hw,
|
|
[CLKID_AHB_ARB0] = &g12a_ahb_arb0.hw,
|
|
[CLKID_AHB_DATA_BUS] = &g12a_ahb_data_bus.hw,
|
|
[CLKID_AHB_CTRL_BUS] = &g12a_ahb_ctrl_bus.hw,
|
|
[CLKID_HTX_HDCP22] = &g12a_htx_hdcp22.hw,
|
|
[CLKID_HTX_PCLK] = &g12a_htx_pclk.hw,
|
|
[CLKID_BT656] = &g12a_bt656.hw,
|
|
[CLKID_USB1_DDR_BRIDGE] = &g12a_usb1_to_ddr.hw,
|
|
[CLKID_MMC_PCLK] = &g12a_mmc_pclk.hw,
|
|
[CLKID_UART2] = &g12a_uart2.hw,
|
|
[CLKID_VPU_INTR] = &g12a_vpu_intr.hw,
|
|
[CLKID_GIC] = &g12a_gic.hw,
|
|
[CLKID_SD_EMMC_A_CLK0_SEL] = &g12a_sd_emmc_a_clk0_sel.hw,
|
|
[CLKID_SD_EMMC_A_CLK0_DIV] = &g12a_sd_emmc_a_clk0_div.hw,
|
|
[CLKID_SD_EMMC_A_CLK0] = &g12a_sd_emmc_a_clk0.hw,
|
|
[CLKID_SD_EMMC_B_CLK0_SEL] = &g12a_sd_emmc_b_clk0_sel.hw,
|
|
[CLKID_SD_EMMC_B_CLK0_DIV] = &g12a_sd_emmc_b_clk0_div.hw,
|
|
[CLKID_SD_EMMC_B_CLK0] = &g12a_sd_emmc_b_clk0.hw,
|
|
[CLKID_SD_EMMC_C_CLK0_SEL] = &g12a_sd_emmc_c_clk0_sel.hw,
|
|
[CLKID_SD_EMMC_C_CLK0_DIV] = &g12a_sd_emmc_c_clk0_div.hw,
|
|
[CLKID_SD_EMMC_C_CLK0] = &g12a_sd_emmc_c_clk0.hw,
|
|
[CLKID_MPLL0_DIV] = &g12a_mpll0_div.hw,
|
|
[CLKID_MPLL1_DIV] = &g12a_mpll1_div.hw,
|
|
[CLKID_MPLL2_DIV] = &g12a_mpll2_div.hw,
|
|
[CLKID_MPLL3_DIV] = &g12a_mpll3_div.hw,
|
|
[CLKID_FCLK_DIV2_DIV] = &g12a_fclk_div2_div.hw,
|
|
[CLKID_FCLK_DIV3_DIV] = &g12a_fclk_div3_div.hw,
|
|
[CLKID_FCLK_DIV4_DIV] = &g12a_fclk_div4_div.hw,
|
|
[CLKID_FCLK_DIV5_DIV] = &g12a_fclk_div5_div.hw,
|
|
[CLKID_FCLK_DIV7_DIV] = &g12a_fclk_div7_div.hw,
|
|
[CLKID_FCLK_DIV2P5_DIV] = &g12a_fclk_div2p5_div.hw,
|
|
[CLKID_HIFI_PLL] = &g12a_hifi_pll.hw,
|
|
[CLKID_VCLK2_VENCI0] = &g12a_vclk2_venci0.hw,
|
|
[CLKID_VCLK2_VENCI1] = &g12a_vclk2_venci1.hw,
|
|
[CLKID_VCLK2_VENCP0] = &g12a_vclk2_vencp0.hw,
|
|
[CLKID_VCLK2_VENCP1] = &g12a_vclk2_vencp1.hw,
|
|
[CLKID_VCLK2_VENCT0] = &g12a_vclk2_venct0.hw,
|
|
[CLKID_VCLK2_VENCT1] = &g12a_vclk2_venct1.hw,
|
|
[CLKID_VCLK2_OTHER] = &g12a_vclk2_other.hw,
|
|
[CLKID_VCLK2_ENCI] = &g12a_vclk2_enci.hw,
|
|
[CLKID_VCLK2_ENCP] = &g12a_vclk2_encp.hw,
|
|
[CLKID_DAC_CLK] = &g12a_dac_clk.hw,
|
|
[CLKID_AOCLK] = &g12a_aoclk_gate.hw,
|
|
[CLKID_IEC958] = &g12a_iec958_gate.hw,
|
|
[CLKID_ENC480P] = &g12a_enc480p.hw,
|
|
[CLKID_RNG1] = &g12a_rng1.hw,
|
|
[CLKID_VCLK2_ENCT] = &g12a_vclk2_enct.hw,
|
|
[CLKID_VCLK2_ENCL] = &g12a_vclk2_encl.hw,
|
|
[CLKID_VCLK2_VENCLMMC] = &g12a_vclk2_venclmmc.hw,
|
|
[CLKID_VCLK2_VENCL] = &g12a_vclk2_vencl.hw,
|
|
[CLKID_VCLK2_OTHER1] = &g12a_vclk2_other1.hw,
|
|
[CLKID_FIXED_PLL_DCO] = &g12a_fixed_pll_dco.hw,
|
|
[CLKID_SYS_PLL_DCO] = &g12a_sys_pll_dco.hw,
|
|
[CLKID_GP0_PLL_DCO] = &g12a_gp0_pll_dco.hw,
|
|
[CLKID_HIFI_PLL_DCO] = &g12a_hifi_pll_dco.hw,
|
|
[CLKID_DMA] = &g12a_dma.hw,
|
|
[CLKID_EFUSE] = &g12a_efuse.hw,
|
|
[CLKID_ROM_BOOT] = &g12a_rom_boot.hw,
|
|
[CLKID_RESET_SEC] = &g12a_reset_sec.hw,
|
|
[CLKID_SEC_AHB_APB3] = &g12a_sec_ahb_apb3.hw,
|
|
[CLKID_MPLL_PREDIV] = &g12a_mpll_prediv.hw,
|
|
[CLKID_VPU_0_SEL] = &g12a_vpu_0_sel.hw,
|
|
[CLKID_VPU_0_DIV] = &g12a_vpu_0_div.hw,
|
|
[CLKID_VPU_0] = &g12a_vpu_0.hw,
|
|
[CLKID_VPU_1_SEL] = &g12a_vpu_1_sel.hw,
|
|
[CLKID_VPU_1_DIV] = &g12a_vpu_1_div.hw,
|
|
[CLKID_VPU_1] = &g12a_vpu_1.hw,
|
|
[CLKID_VPU] = &g12a_vpu.hw,
|
|
[CLKID_VAPB_0_SEL] = &g12a_vapb_0_sel.hw,
|
|
[CLKID_VAPB_0_DIV] = &g12a_vapb_0_div.hw,
|
|
[CLKID_VAPB_0] = &g12a_vapb_0.hw,
|
|
[CLKID_VAPB_1_SEL] = &g12a_vapb_1_sel.hw,
|
|
[CLKID_VAPB_1_DIV] = &g12a_vapb_1_div.hw,
|
|
[CLKID_VAPB_1] = &g12a_vapb_1.hw,
|
|
[CLKID_VAPB_SEL] = &g12a_vapb_sel.hw,
|
|
[CLKID_VAPB] = &g12a_vapb.hw,
|
|
[CLKID_HDMI_PLL_DCO] = &g12a_hdmi_pll_dco.hw,
|
|
[CLKID_HDMI_PLL_OD] = &g12a_hdmi_pll_od.hw,
|
|
[CLKID_HDMI_PLL_OD2] = &g12a_hdmi_pll_od2.hw,
|
|
[CLKID_HDMI_PLL] = &g12a_hdmi_pll.hw,
|
|
[CLKID_VID_PLL] = &g12a_vid_pll_div.hw,
|
|
[CLKID_VID_PLL_SEL] = &g12a_vid_pll_sel.hw,
|
|
[CLKID_VID_PLL_DIV] = &g12a_vid_pll.hw,
|
|
[CLKID_VCLK_SEL] = &g12a_vclk_sel.hw,
|
|
[CLKID_VCLK2_SEL] = &g12a_vclk2_sel.hw,
|
|
[CLKID_VCLK_INPUT] = &g12a_vclk_input.hw,
|
|
[CLKID_VCLK2_INPUT] = &g12a_vclk2_input.hw,
|
|
[CLKID_VCLK_DIV] = &g12a_vclk_div.hw,
|
|
[CLKID_VCLK2_DIV] = &g12a_vclk2_div.hw,
|
|
[CLKID_VCLK] = &g12a_vclk.hw,
|
|
[CLKID_VCLK2] = &g12a_vclk2.hw,
|
|
[CLKID_VCLK_DIV1] = &g12a_vclk_div1.hw,
|
|
[CLKID_VCLK_DIV2_EN] = &g12a_vclk_div2_en.hw,
|
|
[CLKID_VCLK_DIV4_EN] = &g12a_vclk_div4_en.hw,
|
|
[CLKID_VCLK_DIV6_EN] = &g12a_vclk_div6_en.hw,
|
|
[CLKID_VCLK_DIV12_EN] = &g12a_vclk_div12_en.hw,
|
|
[CLKID_VCLK2_DIV1] = &g12a_vclk2_div1.hw,
|
|
[CLKID_VCLK2_DIV2_EN] = &g12a_vclk2_div2_en.hw,
|
|
[CLKID_VCLK2_DIV4_EN] = &g12a_vclk2_div4_en.hw,
|
|
[CLKID_VCLK2_DIV6_EN] = &g12a_vclk2_div6_en.hw,
|
|
[CLKID_VCLK2_DIV12_EN] = &g12a_vclk2_div12_en.hw,
|
|
[CLKID_VCLK_DIV2] = &g12a_vclk_div2.hw,
|
|
[CLKID_VCLK_DIV4] = &g12a_vclk_div4.hw,
|
|
[CLKID_VCLK_DIV6] = &g12a_vclk_div6.hw,
|
|
[CLKID_VCLK_DIV12] = &g12a_vclk_div12.hw,
|
|
[CLKID_VCLK2_DIV2] = &g12a_vclk2_div2.hw,
|
|
[CLKID_VCLK2_DIV4] = &g12a_vclk2_div4.hw,
|
|
[CLKID_VCLK2_DIV6] = &g12a_vclk2_div6.hw,
|
|
[CLKID_VCLK2_DIV12] = &g12a_vclk2_div12.hw,
|
|
[CLKID_CTS_ENCI_SEL] = &g12a_cts_enci_sel.hw,
|
|
[CLKID_CTS_ENCP_SEL] = &g12a_cts_encp_sel.hw,
|
|
[CLKID_CTS_VDAC_SEL] = &g12a_cts_vdac_sel.hw,
|
|
[CLKID_HDMI_TX_SEL] = &g12a_hdmi_tx_sel.hw,
|
|
[CLKID_CTS_ENCI] = &g12a_cts_enci.hw,
|
|
[CLKID_CTS_ENCP] = &g12a_cts_encp.hw,
|
|
[CLKID_CTS_VDAC] = &g12a_cts_vdac.hw,
|
|
[CLKID_HDMI_TX] = &g12a_hdmi_tx.hw,
|
|
[CLKID_HDMI_SEL] = &g12a_hdmi_sel.hw,
|
|
[CLKID_HDMI_DIV] = &g12a_hdmi_div.hw,
|
|
[CLKID_HDMI] = &g12a_hdmi.hw,
|
|
[CLKID_MALI_0_SEL] = &g12a_mali_0_sel.hw,
|
|
[CLKID_MALI_0_DIV] = &g12a_mali_0_div.hw,
|
|
[CLKID_MALI_0] = &g12a_mali_0.hw,
|
|
[CLKID_MALI_1_SEL] = &g12a_mali_1_sel.hw,
|
|
[CLKID_MALI_1_DIV] = &g12a_mali_1_div.hw,
|
|
[CLKID_MALI_1] = &g12a_mali_1.hw,
|
|
[CLKID_MALI] = &g12a_mali.hw,
|
|
[CLKID_MPLL_50M_DIV] = &g12a_mpll_50m_div.hw,
|
|
[CLKID_MPLL_50M] = &g12a_mpll_50m.hw,
|
|
[CLKID_SYS_PLL_DIV16_EN] = &g12a_sys_pll_div16_en.hw,
|
|
[CLKID_SYS_PLL_DIV16] = &g12a_sys_pll_div16.hw,
|
|
[CLKID_CPU_CLK_DYN0_SEL] = &g12a_cpu_clk_premux0.hw,
|
|
[CLKID_CPU_CLK_DYN0_DIV] = &g12a_cpu_clk_mux0_div.hw,
|
|
[CLKID_CPU_CLK_DYN0] = &g12a_cpu_clk_postmux0.hw,
|
|
[CLKID_CPU_CLK_DYN1_SEL] = &g12a_cpu_clk_premux1.hw,
|
|
[CLKID_CPU_CLK_DYN1_DIV] = &g12a_cpu_clk_mux1_div.hw,
|
|
[CLKID_CPU_CLK_DYN1] = &g12a_cpu_clk_postmux1.hw,
|
|
[CLKID_CPU_CLK_DYN] = &g12a_cpu_clk_dyn.hw,
|
|
[CLKID_CPU_CLK] = &g12a_cpu_clk.hw,
|
|
[CLKID_CPU_CLK_DIV16_EN] = &g12a_cpu_clk_div16_en.hw,
|
|
[CLKID_CPU_CLK_DIV16] = &g12a_cpu_clk_div16.hw,
|
|
[CLKID_CPU_CLK_APB_DIV] = &g12a_cpu_clk_apb_div.hw,
|
|
[CLKID_CPU_CLK_APB] = &g12a_cpu_clk_apb.hw,
|
|
[CLKID_CPU_CLK_ATB_DIV] = &g12a_cpu_clk_atb_div.hw,
|
|
[CLKID_CPU_CLK_ATB] = &g12a_cpu_clk_atb.hw,
|
|
[CLKID_CPU_CLK_AXI_DIV] = &g12a_cpu_clk_axi_div.hw,
|
|
[CLKID_CPU_CLK_AXI] = &g12a_cpu_clk_axi.hw,
|
|
[CLKID_CPU_CLK_TRACE_DIV] = &g12a_cpu_clk_trace_div.hw,
|
|
[CLKID_CPU_CLK_TRACE] = &g12a_cpu_clk_trace.hw,
|
|
[CLKID_PCIE_PLL_DCO] = &g12a_pcie_pll_dco.hw,
|
|
[CLKID_PCIE_PLL_DCO_DIV2] = &g12a_pcie_pll_dco_div2.hw,
|
|
[CLKID_PCIE_PLL_OD] = &g12a_pcie_pll_od.hw,
|
|
[CLKID_PCIE_PLL] = &g12a_pcie_pll.hw,
|
|
[CLKID_VDEC_1_SEL] = &g12a_vdec_1_sel.hw,
|
|
[CLKID_VDEC_1_DIV] = &g12a_vdec_1_div.hw,
|
|
[CLKID_VDEC_1] = &g12a_vdec_1.hw,
|
|
[CLKID_VDEC_HEVC_SEL] = &g12a_vdec_hevc_sel.hw,
|
|
[CLKID_VDEC_HEVC_DIV] = &g12a_vdec_hevc_div.hw,
|
|
[CLKID_VDEC_HEVC] = &g12a_vdec_hevc.hw,
|
|
[CLKID_VDEC_HEVCF_SEL] = &g12a_vdec_hevcf_sel.hw,
|
|
[CLKID_VDEC_HEVCF_DIV] = &g12a_vdec_hevcf_div.hw,
|
|
[CLKID_VDEC_HEVCF] = &g12a_vdec_hevcf.hw,
|
|
[CLKID_TS_DIV] = &g12a_ts_div.hw,
|
|
[CLKID_TS] = &g12a_ts.hw,
|
|
[CLKID_SPICC0_SCLK_SEL] = &g12a_spicc0_sclk_sel.hw,
|
|
[CLKID_SPICC0_SCLK_DIV] = &g12a_spicc0_sclk_div.hw,
|
|
[CLKID_SPICC0_SCLK] = &g12a_spicc0_sclk.hw,
|
|
[CLKID_SPICC1_SCLK_SEL] = &g12a_spicc1_sclk_sel.hw,
|
|
[CLKID_SPICC1_SCLK_DIV] = &g12a_spicc1_sclk_div.hw,
|
|
[CLKID_SPICC1_SCLK] = &g12a_spicc1_sclk.hw,
|
|
[NR_CLKS] = NULL,
|
|
},
|
|
.num = NR_CLKS,
|
|
};
|
|
|
|
static struct clk_hw_onecell_data g12b_hw_onecell_data = {
|
|
.hws = {
|
|
[CLKID_SYS_PLL] = &g12a_sys_pll.hw,
|
|
[CLKID_FIXED_PLL] = &g12a_fixed_pll.hw,
|
|
[CLKID_FCLK_DIV2] = &g12a_fclk_div2.hw,
|
|
[CLKID_FCLK_DIV3] = &g12a_fclk_div3.hw,
|
|
[CLKID_FCLK_DIV4] = &g12a_fclk_div4.hw,
|
|
[CLKID_FCLK_DIV5] = &g12a_fclk_div5.hw,
|
|
[CLKID_FCLK_DIV7] = &g12a_fclk_div7.hw,
|
|
[CLKID_FCLK_DIV2P5] = &g12a_fclk_div2p5.hw,
|
|
[CLKID_GP0_PLL] = &g12a_gp0_pll.hw,
|
|
[CLKID_MPEG_SEL] = &g12a_mpeg_clk_sel.hw,
|
|
[CLKID_MPEG_DIV] = &g12a_mpeg_clk_div.hw,
|
|
[CLKID_CLK81] = &g12a_clk81.hw,
|
|
[CLKID_MPLL0] = &g12a_mpll0.hw,
|
|
[CLKID_MPLL1] = &g12a_mpll1.hw,
|
|
[CLKID_MPLL2] = &g12a_mpll2.hw,
|
|
[CLKID_MPLL3] = &g12a_mpll3.hw,
|
|
[CLKID_DDR] = &g12a_ddr.hw,
|
|
[CLKID_DOS] = &g12a_dos.hw,
|
|
[CLKID_AUDIO_LOCKER] = &g12a_audio_locker.hw,
|
|
[CLKID_MIPI_DSI_HOST] = &g12a_mipi_dsi_host.hw,
|
|
[CLKID_ETH_PHY] = &g12a_eth_phy.hw,
|
|
[CLKID_ISA] = &g12a_isa.hw,
|
|
[CLKID_PL301] = &g12a_pl301.hw,
|
|
[CLKID_PERIPHS] = &g12a_periphs.hw,
|
|
[CLKID_SPICC0] = &g12a_spicc_0.hw,
|
|
[CLKID_I2C] = &g12a_i2c.hw,
|
|
[CLKID_SANA] = &g12a_sana.hw,
|
|
[CLKID_SD] = &g12a_sd.hw,
|
|
[CLKID_RNG0] = &g12a_rng0.hw,
|
|
[CLKID_UART0] = &g12a_uart0.hw,
|
|
[CLKID_SPICC1] = &g12a_spicc_1.hw,
|
|
[CLKID_HIU_IFACE] = &g12a_hiu_reg.hw,
|
|
[CLKID_MIPI_DSI_PHY] = &g12a_mipi_dsi_phy.hw,
|
|
[CLKID_ASSIST_MISC] = &g12a_assist_misc.hw,
|
|
[CLKID_SD_EMMC_A] = &g12a_emmc_a.hw,
|
|
[CLKID_SD_EMMC_B] = &g12a_emmc_b.hw,
|
|
[CLKID_SD_EMMC_C] = &g12a_emmc_c.hw,
|
|
[CLKID_AUDIO_CODEC] = &g12a_audio_codec.hw,
|
|
[CLKID_AUDIO] = &g12a_audio.hw,
|
|
[CLKID_ETH] = &g12a_eth_core.hw,
|
|
[CLKID_DEMUX] = &g12a_demux.hw,
|
|
[CLKID_AUDIO_IFIFO] = &g12a_audio_ififo.hw,
|
|
[CLKID_ADC] = &g12a_adc.hw,
|
|
[CLKID_UART1] = &g12a_uart1.hw,
|
|
[CLKID_G2D] = &g12a_g2d.hw,
|
|
[CLKID_RESET] = &g12a_reset.hw,
|
|
[CLKID_PCIE_COMB] = &g12a_pcie_comb.hw,
|
|
[CLKID_PARSER] = &g12a_parser.hw,
|
|
[CLKID_USB] = &g12a_usb_general.hw,
|
|
[CLKID_PCIE_PHY] = &g12a_pcie_phy.hw,
|
|
[CLKID_AHB_ARB0] = &g12a_ahb_arb0.hw,
|
|
[CLKID_AHB_DATA_BUS] = &g12a_ahb_data_bus.hw,
|
|
[CLKID_AHB_CTRL_BUS] = &g12a_ahb_ctrl_bus.hw,
|
|
[CLKID_HTX_HDCP22] = &g12a_htx_hdcp22.hw,
|
|
[CLKID_HTX_PCLK] = &g12a_htx_pclk.hw,
|
|
[CLKID_BT656] = &g12a_bt656.hw,
|
|
[CLKID_USB1_DDR_BRIDGE] = &g12a_usb1_to_ddr.hw,
|
|
[CLKID_MMC_PCLK] = &g12a_mmc_pclk.hw,
|
|
[CLKID_UART2] = &g12a_uart2.hw,
|
|
[CLKID_VPU_INTR] = &g12a_vpu_intr.hw,
|
|
[CLKID_GIC] = &g12a_gic.hw,
|
|
[CLKID_SD_EMMC_A_CLK0_SEL] = &g12a_sd_emmc_a_clk0_sel.hw,
|
|
[CLKID_SD_EMMC_A_CLK0_DIV] = &g12a_sd_emmc_a_clk0_div.hw,
|
|
[CLKID_SD_EMMC_A_CLK0] = &g12a_sd_emmc_a_clk0.hw,
|
|
[CLKID_SD_EMMC_B_CLK0_SEL] = &g12a_sd_emmc_b_clk0_sel.hw,
|
|
[CLKID_SD_EMMC_B_CLK0_DIV] = &g12a_sd_emmc_b_clk0_div.hw,
|
|
[CLKID_SD_EMMC_B_CLK0] = &g12a_sd_emmc_b_clk0.hw,
|
|
[CLKID_SD_EMMC_C_CLK0_SEL] = &g12a_sd_emmc_c_clk0_sel.hw,
|
|
[CLKID_SD_EMMC_C_CLK0_DIV] = &g12a_sd_emmc_c_clk0_div.hw,
|
|
[CLKID_SD_EMMC_C_CLK0] = &g12a_sd_emmc_c_clk0.hw,
|
|
[CLKID_MPLL0_DIV] = &g12a_mpll0_div.hw,
|
|
[CLKID_MPLL1_DIV] = &g12a_mpll1_div.hw,
|
|
[CLKID_MPLL2_DIV] = &g12a_mpll2_div.hw,
|
|
[CLKID_MPLL3_DIV] = &g12a_mpll3_div.hw,
|
|
[CLKID_FCLK_DIV2_DIV] = &g12a_fclk_div2_div.hw,
|
|
[CLKID_FCLK_DIV3_DIV] = &g12a_fclk_div3_div.hw,
|
|
[CLKID_FCLK_DIV4_DIV] = &g12a_fclk_div4_div.hw,
|
|
[CLKID_FCLK_DIV5_DIV] = &g12a_fclk_div5_div.hw,
|
|
[CLKID_FCLK_DIV7_DIV] = &g12a_fclk_div7_div.hw,
|
|
[CLKID_FCLK_DIV2P5_DIV] = &g12a_fclk_div2p5_div.hw,
|
|
[CLKID_HIFI_PLL] = &g12a_hifi_pll.hw,
|
|
[CLKID_VCLK2_VENCI0] = &g12a_vclk2_venci0.hw,
|
|
[CLKID_VCLK2_VENCI1] = &g12a_vclk2_venci1.hw,
|
|
[CLKID_VCLK2_VENCP0] = &g12a_vclk2_vencp0.hw,
|
|
[CLKID_VCLK2_VENCP1] = &g12a_vclk2_vencp1.hw,
|
|
[CLKID_VCLK2_VENCT0] = &g12a_vclk2_venct0.hw,
|
|
[CLKID_VCLK2_VENCT1] = &g12a_vclk2_venct1.hw,
|
|
[CLKID_VCLK2_OTHER] = &g12a_vclk2_other.hw,
|
|
[CLKID_VCLK2_ENCI] = &g12a_vclk2_enci.hw,
|
|
[CLKID_VCLK2_ENCP] = &g12a_vclk2_encp.hw,
|
|
[CLKID_DAC_CLK] = &g12a_dac_clk.hw,
|
|
[CLKID_AOCLK] = &g12a_aoclk_gate.hw,
|
|
[CLKID_IEC958] = &g12a_iec958_gate.hw,
|
|
[CLKID_ENC480P] = &g12a_enc480p.hw,
|
|
[CLKID_RNG1] = &g12a_rng1.hw,
|
|
[CLKID_VCLK2_ENCT] = &g12a_vclk2_enct.hw,
|
|
[CLKID_VCLK2_ENCL] = &g12a_vclk2_encl.hw,
|
|
[CLKID_VCLK2_VENCLMMC] = &g12a_vclk2_venclmmc.hw,
|
|
[CLKID_VCLK2_VENCL] = &g12a_vclk2_vencl.hw,
|
|
[CLKID_VCLK2_OTHER1] = &g12a_vclk2_other1.hw,
|
|
[CLKID_FIXED_PLL_DCO] = &g12a_fixed_pll_dco.hw,
|
|
[CLKID_SYS_PLL_DCO] = &g12a_sys_pll_dco.hw,
|
|
[CLKID_GP0_PLL_DCO] = &g12a_gp0_pll_dco.hw,
|
|
[CLKID_HIFI_PLL_DCO] = &g12a_hifi_pll_dco.hw,
|
|
[CLKID_DMA] = &g12a_dma.hw,
|
|
[CLKID_EFUSE] = &g12a_efuse.hw,
|
|
[CLKID_ROM_BOOT] = &g12a_rom_boot.hw,
|
|
[CLKID_RESET_SEC] = &g12a_reset_sec.hw,
|
|
[CLKID_SEC_AHB_APB3] = &g12a_sec_ahb_apb3.hw,
|
|
[CLKID_MPLL_PREDIV] = &g12a_mpll_prediv.hw,
|
|
[CLKID_VPU_0_SEL] = &g12a_vpu_0_sel.hw,
|
|
[CLKID_VPU_0_DIV] = &g12a_vpu_0_div.hw,
|
|
[CLKID_VPU_0] = &g12a_vpu_0.hw,
|
|
[CLKID_VPU_1_SEL] = &g12a_vpu_1_sel.hw,
|
|
[CLKID_VPU_1_DIV] = &g12a_vpu_1_div.hw,
|
|
[CLKID_VPU_1] = &g12a_vpu_1.hw,
|
|
[CLKID_VPU] = &g12a_vpu.hw,
|
|
[CLKID_VAPB_0_SEL] = &g12a_vapb_0_sel.hw,
|
|
[CLKID_VAPB_0_DIV] = &g12a_vapb_0_div.hw,
|
|
[CLKID_VAPB_0] = &g12a_vapb_0.hw,
|
|
[CLKID_VAPB_1_SEL] = &g12a_vapb_1_sel.hw,
|
|
[CLKID_VAPB_1_DIV] = &g12a_vapb_1_div.hw,
|
|
[CLKID_VAPB_1] = &g12a_vapb_1.hw,
|
|
[CLKID_VAPB_SEL] = &g12a_vapb_sel.hw,
|
|
[CLKID_VAPB] = &g12a_vapb.hw,
|
|
[CLKID_HDMI_PLL_DCO] = &g12a_hdmi_pll_dco.hw,
|
|
[CLKID_HDMI_PLL_OD] = &g12a_hdmi_pll_od.hw,
|
|
[CLKID_HDMI_PLL_OD2] = &g12a_hdmi_pll_od2.hw,
|
|
[CLKID_HDMI_PLL] = &g12a_hdmi_pll.hw,
|
|
[CLKID_VID_PLL] = &g12a_vid_pll_div.hw,
|
|
[CLKID_VID_PLL_SEL] = &g12a_vid_pll_sel.hw,
|
|
[CLKID_VID_PLL_DIV] = &g12a_vid_pll.hw,
|
|
[CLKID_VCLK_SEL] = &g12a_vclk_sel.hw,
|
|
[CLKID_VCLK2_SEL] = &g12a_vclk2_sel.hw,
|
|
[CLKID_VCLK_INPUT] = &g12a_vclk_input.hw,
|
|
[CLKID_VCLK2_INPUT] = &g12a_vclk2_input.hw,
|
|
[CLKID_VCLK_DIV] = &g12a_vclk_div.hw,
|
|
[CLKID_VCLK2_DIV] = &g12a_vclk2_div.hw,
|
|
[CLKID_VCLK] = &g12a_vclk.hw,
|
|
[CLKID_VCLK2] = &g12a_vclk2.hw,
|
|
[CLKID_VCLK_DIV1] = &g12a_vclk_div1.hw,
|
|
[CLKID_VCLK_DIV2_EN] = &g12a_vclk_div2_en.hw,
|
|
[CLKID_VCLK_DIV4_EN] = &g12a_vclk_div4_en.hw,
|
|
[CLKID_VCLK_DIV6_EN] = &g12a_vclk_div6_en.hw,
|
|
[CLKID_VCLK_DIV12_EN] = &g12a_vclk_div12_en.hw,
|
|
[CLKID_VCLK2_DIV1] = &g12a_vclk2_div1.hw,
|
|
[CLKID_VCLK2_DIV2_EN] = &g12a_vclk2_div2_en.hw,
|
|
[CLKID_VCLK2_DIV4_EN] = &g12a_vclk2_div4_en.hw,
|
|
[CLKID_VCLK2_DIV6_EN] = &g12a_vclk2_div6_en.hw,
|
|
[CLKID_VCLK2_DIV12_EN] = &g12a_vclk2_div12_en.hw,
|
|
[CLKID_VCLK_DIV2] = &g12a_vclk_div2.hw,
|
|
[CLKID_VCLK_DIV4] = &g12a_vclk_div4.hw,
|
|
[CLKID_VCLK_DIV6] = &g12a_vclk_div6.hw,
|
|
[CLKID_VCLK_DIV12] = &g12a_vclk_div12.hw,
|
|
[CLKID_VCLK2_DIV2] = &g12a_vclk2_div2.hw,
|
|
[CLKID_VCLK2_DIV4] = &g12a_vclk2_div4.hw,
|
|
[CLKID_VCLK2_DIV6] = &g12a_vclk2_div6.hw,
|
|
[CLKID_VCLK2_DIV12] = &g12a_vclk2_div12.hw,
|
|
[CLKID_CTS_ENCI_SEL] = &g12a_cts_enci_sel.hw,
|
|
[CLKID_CTS_ENCP_SEL] = &g12a_cts_encp_sel.hw,
|
|
[CLKID_CTS_VDAC_SEL] = &g12a_cts_vdac_sel.hw,
|
|
[CLKID_HDMI_TX_SEL] = &g12a_hdmi_tx_sel.hw,
|
|
[CLKID_CTS_ENCI] = &g12a_cts_enci.hw,
|
|
[CLKID_CTS_ENCP] = &g12a_cts_encp.hw,
|
|
[CLKID_CTS_VDAC] = &g12a_cts_vdac.hw,
|
|
[CLKID_HDMI_TX] = &g12a_hdmi_tx.hw,
|
|
[CLKID_HDMI_SEL] = &g12a_hdmi_sel.hw,
|
|
[CLKID_HDMI_DIV] = &g12a_hdmi_div.hw,
|
|
[CLKID_HDMI] = &g12a_hdmi.hw,
|
|
[CLKID_MALI_0_SEL] = &g12a_mali_0_sel.hw,
|
|
[CLKID_MALI_0_DIV] = &g12a_mali_0_div.hw,
|
|
[CLKID_MALI_0] = &g12a_mali_0.hw,
|
|
[CLKID_MALI_1_SEL] = &g12a_mali_1_sel.hw,
|
|
[CLKID_MALI_1_DIV] = &g12a_mali_1_div.hw,
|
|
[CLKID_MALI_1] = &g12a_mali_1.hw,
|
|
[CLKID_MALI] = &g12a_mali.hw,
|
|
[CLKID_MPLL_50M_DIV] = &g12a_mpll_50m_div.hw,
|
|
[CLKID_MPLL_50M] = &g12a_mpll_50m.hw,
|
|
[CLKID_SYS_PLL_DIV16_EN] = &g12a_sys_pll_div16_en.hw,
|
|
[CLKID_SYS_PLL_DIV16] = &g12a_sys_pll_div16.hw,
|
|
[CLKID_CPU_CLK_DYN0_SEL] = &g12a_cpu_clk_premux0.hw,
|
|
[CLKID_CPU_CLK_DYN0_DIV] = &g12a_cpu_clk_mux0_div.hw,
|
|
[CLKID_CPU_CLK_DYN0] = &g12a_cpu_clk_postmux0.hw,
|
|
[CLKID_CPU_CLK_DYN1_SEL] = &g12a_cpu_clk_premux1.hw,
|
|
[CLKID_CPU_CLK_DYN1_DIV] = &g12a_cpu_clk_mux1_div.hw,
|
|
[CLKID_CPU_CLK_DYN1] = &g12a_cpu_clk_postmux1.hw,
|
|
[CLKID_CPU_CLK_DYN] = &g12a_cpu_clk_dyn.hw,
|
|
[CLKID_CPU_CLK] = &g12b_cpu_clk.hw,
|
|
[CLKID_CPU_CLK_DIV16_EN] = &g12a_cpu_clk_div16_en.hw,
|
|
[CLKID_CPU_CLK_DIV16] = &g12a_cpu_clk_div16.hw,
|
|
[CLKID_CPU_CLK_APB_DIV] = &g12a_cpu_clk_apb_div.hw,
|
|
[CLKID_CPU_CLK_APB] = &g12a_cpu_clk_apb.hw,
|
|
[CLKID_CPU_CLK_ATB_DIV] = &g12a_cpu_clk_atb_div.hw,
|
|
[CLKID_CPU_CLK_ATB] = &g12a_cpu_clk_atb.hw,
|
|
[CLKID_CPU_CLK_AXI_DIV] = &g12a_cpu_clk_axi_div.hw,
|
|
[CLKID_CPU_CLK_AXI] = &g12a_cpu_clk_axi.hw,
|
|
[CLKID_CPU_CLK_TRACE_DIV] = &g12a_cpu_clk_trace_div.hw,
|
|
[CLKID_CPU_CLK_TRACE] = &g12a_cpu_clk_trace.hw,
|
|
[CLKID_PCIE_PLL_DCO] = &g12a_pcie_pll_dco.hw,
|
|
[CLKID_PCIE_PLL_DCO_DIV2] = &g12a_pcie_pll_dco_div2.hw,
|
|
[CLKID_PCIE_PLL_OD] = &g12a_pcie_pll_od.hw,
|
|
[CLKID_PCIE_PLL] = &g12a_pcie_pll.hw,
|
|
[CLKID_VDEC_1_SEL] = &g12a_vdec_1_sel.hw,
|
|
[CLKID_VDEC_1_DIV] = &g12a_vdec_1_div.hw,
|
|
[CLKID_VDEC_1] = &g12a_vdec_1.hw,
|
|
[CLKID_VDEC_HEVC_SEL] = &g12a_vdec_hevc_sel.hw,
|
|
[CLKID_VDEC_HEVC_DIV] = &g12a_vdec_hevc_div.hw,
|
|
[CLKID_VDEC_HEVC] = &g12a_vdec_hevc.hw,
|
|
[CLKID_VDEC_HEVCF_SEL] = &g12a_vdec_hevcf_sel.hw,
|
|
[CLKID_VDEC_HEVCF_DIV] = &g12a_vdec_hevcf_div.hw,
|
|
[CLKID_VDEC_HEVCF] = &g12a_vdec_hevcf.hw,
|
|
[CLKID_TS_DIV] = &g12a_ts_div.hw,
|
|
[CLKID_TS] = &g12a_ts.hw,
|
|
[CLKID_SYS1_PLL_DCO] = &g12b_sys1_pll_dco.hw,
|
|
[CLKID_SYS1_PLL] = &g12b_sys1_pll.hw,
|
|
[CLKID_SYS1_PLL_DIV16_EN] = &g12b_sys1_pll_div16_en.hw,
|
|
[CLKID_SYS1_PLL_DIV16] = &g12b_sys1_pll_div16.hw,
|
|
[CLKID_CPUB_CLK_DYN0_SEL] = &g12b_cpub_clk_premux0.hw,
|
|
[CLKID_CPUB_CLK_DYN0_DIV] = &g12b_cpub_clk_mux0_div.hw,
|
|
[CLKID_CPUB_CLK_DYN0] = &g12b_cpub_clk_postmux0.hw,
|
|
[CLKID_CPUB_CLK_DYN1_SEL] = &g12b_cpub_clk_premux1.hw,
|
|
[CLKID_CPUB_CLK_DYN1_DIV] = &g12b_cpub_clk_mux1_div.hw,
|
|
[CLKID_CPUB_CLK_DYN1] = &g12b_cpub_clk_postmux1.hw,
|
|
[CLKID_CPUB_CLK_DYN] = &g12b_cpub_clk_dyn.hw,
|
|
[CLKID_CPUB_CLK] = &g12b_cpub_clk.hw,
|
|
[CLKID_CPUB_CLK_DIV16_EN] = &g12b_cpub_clk_div16_en.hw,
|
|
[CLKID_CPUB_CLK_DIV16] = &g12b_cpub_clk_div16.hw,
|
|
[CLKID_CPUB_CLK_DIV2] = &g12b_cpub_clk_div2.hw,
|
|
[CLKID_CPUB_CLK_DIV3] = &g12b_cpub_clk_div3.hw,
|
|
[CLKID_CPUB_CLK_DIV4] = &g12b_cpub_clk_div4.hw,
|
|
[CLKID_CPUB_CLK_DIV5] = &g12b_cpub_clk_div5.hw,
|
|
[CLKID_CPUB_CLK_DIV6] = &g12b_cpub_clk_div6.hw,
|
|
[CLKID_CPUB_CLK_DIV7] = &g12b_cpub_clk_div7.hw,
|
|
[CLKID_CPUB_CLK_DIV8] = &g12b_cpub_clk_div8.hw,
|
|
[CLKID_CPUB_CLK_APB_SEL] = &g12b_cpub_clk_apb_sel.hw,
|
|
[CLKID_CPUB_CLK_APB] = &g12b_cpub_clk_apb.hw,
|
|
[CLKID_CPUB_CLK_ATB_SEL] = &g12b_cpub_clk_atb_sel.hw,
|
|
[CLKID_CPUB_CLK_ATB] = &g12b_cpub_clk_atb.hw,
|
|
[CLKID_CPUB_CLK_AXI_SEL] = &g12b_cpub_clk_axi_sel.hw,
|
|
[CLKID_CPUB_CLK_AXI] = &g12b_cpub_clk_axi.hw,
|
|
[CLKID_CPUB_CLK_TRACE_SEL] = &g12b_cpub_clk_trace_sel.hw,
|
|
[CLKID_CPUB_CLK_TRACE] = &g12b_cpub_clk_trace.hw,
|
|
[CLKID_SPICC0_SCLK_SEL] = &g12a_spicc0_sclk_sel.hw,
|
|
[CLKID_SPICC0_SCLK_DIV] = &g12a_spicc0_sclk_div.hw,
|
|
[CLKID_SPICC0_SCLK] = &g12a_spicc0_sclk.hw,
|
|
[CLKID_SPICC1_SCLK_SEL] = &g12a_spicc1_sclk_sel.hw,
|
|
[CLKID_SPICC1_SCLK_DIV] = &g12a_spicc1_sclk_div.hw,
|
|
[CLKID_SPICC1_SCLK] = &g12a_spicc1_sclk.hw,
|
|
[NR_CLKS] = NULL,
|
|
},
|
|
.num = NR_CLKS,
|
|
};
|
|
|
|
static struct clk_hw_onecell_data sm1_hw_onecell_data = {
|
|
.hws = {
|
|
[CLKID_SYS_PLL] = &g12a_sys_pll.hw,
|
|
[CLKID_FIXED_PLL] = &g12a_fixed_pll.hw,
|
|
[CLKID_FCLK_DIV2] = &g12a_fclk_div2.hw,
|
|
[CLKID_FCLK_DIV3] = &g12a_fclk_div3.hw,
|
|
[CLKID_FCLK_DIV4] = &g12a_fclk_div4.hw,
|
|
[CLKID_FCLK_DIV5] = &g12a_fclk_div5.hw,
|
|
[CLKID_FCLK_DIV7] = &g12a_fclk_div7.hw,
|
|
[CLKID_FCLK_DIV2P5] = &g12a_fclk_div2p5.hw,
|
|
[CLKID_GP0_PLL] = &g12a_gp0_pll.hw,
|
|
[CLKID_MPEG_SEL] = &g12a_mpeg_clk_sel.hw,
|
|
[CLKID_MPEG_DIV] = &g12a_mpeg_clk_div.hw,
|
|
[CLKID_CLK81] = &g12a_clk81.hw,
|
|
[CLKID_MPLL0] = &g12a_mpll0.hw,
|
|
[CLKID_MPLL1] = &g12a_mpll1.hw,
|
|
[CLKID_MPLL2] = &g12a_mpll2.hw,
|
|
[CLKID_MPLL3] = &g12a_mpll3.hw,
|
|
[CLKID_DDR] = &g12a_ddr.hw,
|
|
[CLKID_DOS] = &g12a_dos.hw,
|
|
[CLKID_AUDIO_LOCKER] = &g12a_audio_locker.hw,
|
|
[CLKID_MIPI_DSI_HOST] = &g12a_mipi_dsi_host.hw,
|
|
[CLKID_ETH_PHY] = &g12a_eth_phy.hw,
|
|
[CLKID_ISA] = &g12a_isa.hw,
|
|
[CLKID_PL301] = &g12a_pl301.hw,
|
|
[CLKID_PERIPHS] = &g12a_periphs.hw,
|
|
[CLKID_SPICC0] = &g12a_spicc_0.hw,
|
|
[CLKID_I2C] = &g12a_i2c.hw,
|
|
[CLKID_SANA] = &g12a_sana.hw,
|
|
[CLKID_SD] = &g12a_sd.hw,
|
|
[CLKID_RNG0] = &g12a_rng0.hw,
|
|
[CLKID_UART0] = &g12a_uart0.hw,
|
|
[CLKID_SPICC1] = &g12a_spicc_1.hw,
|
|
[CLKID_HIU_IFACE] = &g12a_hiu_reg.hw,
|
|
[CLKID_MIPI_DSI_PHY] = &g12a_mipi_dsi_phy.hw,
|
|
[CLKID_ASSIST_MISC] = &g12a_assist_misc.hw,
|
|
[CLKID_SD_EMMC_A] = &g12a_emmc_a.hw,
|
|
[CLKID_SD_EMMC_B] = &g12a_emmc_b.hw,
|
|
[CLKID_SD_EMMC_C] = &g12a_emmc_c.hw,
|
|
[CLKID_AUDIO_CODEC] = &g12a_audio_codec.hw,
|
|
[CLKID_AUDIO] = &g12a_audio.hw,
|
|
[CLKID_ETH] = &g12a_eth_core.hw,
|
|
[CLKID_DEMUX] = &g12a_demux.hw,
|
|
[CLKID_AUDIO_IFIFO] = &g12a_audio_ififo.hw,
|
|
[CLKID_ADC] = &g12a_adc.hw,
|
|
[CLKID_UART1] = &g12a_uart1.hw,
|
|
[CLKID_G2D] = &g12a_g2d.hw,
|
|
[CLKID_RESET] = &g12a_reset.hw,
|
|
[CLKID_PCIE_COMB] = &g12a_pcie_comb.hw,
|
|
[CLKID_PARSER] = &g12a_parser.hw,
|
|
[CLKID_USB] = &g12a_usb_general.hw,
|
|
[CLKID_PCIE_PHY] = &g12a_pcie_phy.hw,
|
|
[CLKID_AHB_ARB0] = &g12a_ahb_arb0.hw,
|
|
[CLKID_AHB_DATA_BUS] = &g12a_ahb_data_bus.hw,
|
|
[CLKID_AHB_CTRL_BUS] = &g12a_ahb_ctrl_bus.hw,
|
|
[CLKID_HTX_HDCP22] = &g12a_htx_hdcp22.hw,
|
|
[CLKID_HTX_PCLK] = &g12a_htx_pclk.hw,
|
|
[CLKID_BT656] = &g12a_bt656.hw,
|
|
[CLKID_USB1_DDR_BRIDGE] = &g12a_usb1_to_ddr.hw,
|
|
[CLKID_MMC_PCLK] = &g12a_mmc_pclk.hw,
|
|
[CLKID_UART2] = &g12a_uart2.hw,
|
|
[CLKID_VPU_INTR] = &g12a_vpu_intr.hw,
|
|
[CLKID_GIC] = &g12a_gic.hw,
|
|
[CLKID_SD_EMMC_A_CLK0_SEL] = &g12a_sd_emmc_a_clk0_sel.hw,
|
|
[CLKID_SD_EMMC_A_CLK0_DIV] = &g12a_sd_emmc_a_clk0_div.hw,
|
|
[CLKID_SD_EMMC_A_CLK0] = &g12a_sd_emmc_a_clk0.hw,
|
|
[CLKID_SD_EMMC_B_CLK0_SEL] = &g12a_sd_emmc_b_clk0_sel.hw,
|
|
[CLKID_SD_EMMC_B_CLK0_DIV] = &g12a_sd_emmc_b_clk0_div.hw,
|
|
[CLKID_SD_EMMC_B_CLK0] = &g12a_sd_emmc_b_clk0.hw,
|
|
[CLKID_SD_EMMC_C_CLK0_SEL] = &g12a_sd_emmc_c_clk0_sel.hw,
|
|
[CLKID_SD_EMMC_C_CLK0_DIV] = &g12a_sd_emmc_c_clk0_div.hw,
|
|
[CLKID_SD_EMMC_C_CLK0] = &g12a_sd_emmc_c_clk0.hw,
|
|
[CLKID_MPLL0_DIV] = &g12a_mpll0_div.hw,
|
|
[CLKID_MPLL1_DIV] = &g12a_mpll1_div.hw,
|
|
[CLKID_MPLL2_DIV] = &g12a_mpll2_div.hw,
|
|
[CLKID_MPLL3_DIV] = &g12a_mpll3_div.hw,
|
|
[CLKID_FCLK_DIV2_DIV] = &g12a_fclk_div2_div.hw,
|
|
[CLKID_FCLK_DIV3_DIV] = &g12a_fclk_div3_div.hw,
|
|
[CLKID_FCLK_DIV4_DIV] = &g12a_fclk_div4_div.hw,
|
|
[CLKID_FCLK_DIV5_DIV] = &g12a_fclk_div5_div.hw,
|
|
[CLKID_FCLK_DIV7_DIV] = &g12a_fclk_div7_div.hw,
|
|
[CLKID_FCLK_DIV2P5_DIV] = &g12a_fclk_div2p5_div.hw,
|
|
[CLKID_HIFI_PLL] = &g12a_hifi_pll.hw,
|
|
[CLKID_VCLK2_VENCI0] = &g12a_vclk2_venci0.hw,
|
|
[CLKID_VCLK2_VENCI1] = &g12a_vclk2_venci1.hw,
|
|
[CLKID_VCLK2_VENCP0] = &g12a_vclk2_vencp0.hw,
|
|
[CLKID_VCLK2_VENCP1] = &g12a_vclk2_vencp1.hw,
|
|
[CLKID_VCLK2_VENCT0] = &g12a_vclk2_venct0.hw,
|
|
[CLKID_VCLK2_VENCT1] = &g12a_vclk2_venct1.hw,
|
|
[CLKID_VCLK2_OTHER] = &g12a_vclk2_other.hw,
|
|
[CLKID_VCLK2_ENCI] = &g12a_vclk2_enci.hw,
|
|
[CLKID_VCLK2_ENCP] = &g12a_vclk2_encp.hw,
|
|
[CLKID_DAC_CLK] = &g12a_dac_clk.hw,
|
|
[CLKID_AOCLK] = &g12a_aoclk_gate.hw,
|
|
[CLKID_IEC958] = &g12a_iec958_gate.hw,
|
|
[CLKID_ENC480P] = &g12a_enc480p.hw,
|
|
[CLKID_RNG1] = &g12a_rng1.hw,
|
|
[CLKID_VCLK2_ENCT] = &g12a_vclk2_enct.hw,
|
|
[CLKID_VCLK2_ENCL] = &g12a_vclk2_encl.hw,
|
|
[CLKID_VCLK2_VENCLMMC] = &g12a_vclk2_venclmmc.hw,
|
|
[CLKID_VCLK2_VENCL] = &g12a_vclk2_vencl.hw,
|
|
[CLKID_VCLK2_OTHER1] = &g12a_vclk2_other1.hw,
|
|
[CLKID_FIXED_PLL_DCO] = &g12a_fixed_pll_dco.hw,
|
|
[CLKID_SYS_PLL_DCO] = &g12a_sys_pll_dco.hw,
|
|
[CLKID_GP0_PLL_DCO] = &g12a_gp0_pll_dco.hw,
|
|
[CLKID_HIFI_PLL_DCO] = &g12a_hifi_pll_dco.hw,
|
|
[CLKID_DMA] = &g12a_dma.hw,
|
|
[CLKID_EFUSE] = &g12a_efuse.hw,
|
|
[CLKID_ROM_BOOT] = &g12a_rom_boot.hw,
|
|
[CLKID_RESET_SEC] = &g12a_reset_sec.hw,
|
|
[CLKID_SEC_AHB_APB3] = &g12a_sec_ahb_apb3.hw,
|
|
[CLKID_MPLL_PREDIV] = &g12a_mpll_prediv.hw,
|
|
[CLKID_VPU_0_SEL] = &g12a_vpu_0_sel.hw,
|
|
[CLKID_VPU_0_DIV] = &g12a_vpu_0_div.hw,
|
|
[CLKID_VPU_0] = &g12a_vpu_0.hw,
|
|
[CLKID_VPU_1_SEL] = &g12a_vpu_1_sel.hw,
|
|
[CLKID_VPU_1_DIV] = &g12a_vpu_1_div.hw,
|
|
[CLKID_VPU_1] = &g12a_vpu_1.hw,
|
|
[CLKID_VPU] = &g12a_vpu.hw,
|
|
[CLKID_VAPB_0_SEL] = &g12a_vapb_0_sel.hw,
|
|
[CLKID_VAPB_0_DIV] = &g12a_vapb_0_div.hw,
|
|
[CLKID_VAPB_0] = &g12a_vapb_0.hw,
|
|
[CLKID_VAPB_1_SEL] = &g12a_vapb_1_sel.hw,
|
|
[CLKID_VAPB_1_DIV] = &g12a_vapb_1_div.hw,
|
|
[CLKID_VAPB_1] = &g12a_vapb_1.hw,
|
|
[CLKID_VAPB_SEL] = &g12a_vapb_sel.hw,
|
|
[CLKID_VAPB] = &g12a_vapb.hw,
|
|
[CLKID_HDMI_PLL_DCO] = &g12a_hdmi_pll_dco.hw,
|
|
[CLKID_HDMI_PLL_OD] = &g12a_hdmi_pll_od.hw,
|
|
[CLKID_HDMI_PLL_OD2] = &g12a_hdmi_pll_od2.hw,
|
|
[CLKID_HDMI_PLL] = &g12a_hdmi_pll.hw,
|
|
[CLKID_VID_PLL] = &g12a_vid_pll_div.hw,
|
|
[CLKID_VID_PLL_SEL] = &g12a_vid_pll_sel.hw,
|
|
[CLKID_VID_PLL_DIV] = &g12a_vid_pll.hw,
|
|
[CLKID_VCLK_SEL] = &g12a_vclk_sel.hw,
|
|
[CLKID_VCLK2_SEL] = &g12a_vclk2_sel.hw,
|
|
[CLKID_VCLK_INPUT] = &g12a_vclk_input.hw,
|
|
[CLKID_VCLK2_INPUT] = &g12a_vclk2_input.hw,
|
|
[CLKID_VCLK_DIV] = &g12a_vclk_div.hw,
|
|
[CLKID_VCLK2_DIV] = &g12a_vclk2_div.hw,
|
|
[CLKID_VCLK] = &g12a_vclk.hw,
|
|
[CLKID_VCLK2] = &g12a_vclk2.hw,
|
|
[CLKID_VCLK_DIV1] = &g12a_vclk_div1.hw,
|
|
[CLKID_VCLK_DIV2_EN] = &g12a_vclk_div2_en.hw,
|
|
[CLKID_VCLK_DIV4_EN] = &g12a_vclk_div4_en.hw,
|
|
[CLKID_VCLK_DIV6_EN] = &g12a_vclk_div6_en.hw,
|
|
[CLKID_VCLK_DIV12_EN] = &g12a_vclk_div12_en.hw,
|
|
[CLKID_VCLK2_DIV1] = &g12a_vclk2_div1.hw,
|
|
[CLKID_VCLK2_DIV2_EN] = &g12a_vclk2_div2_en.hw,
|
|
[CLKID_VCLK2_DIV4_EN] = &g12a_vclk2_div4_en.hw,
|
|
[CLKID_VCLK2_DIV6_EN] = &g12a_vclk2_div6_en.hw,
|
|
[CLKID_VCLK2_DIV12_EN] = &g12a_vclk2_div12_en.hw,
|
|
[CLKID_VCLK_DIV2] = &g12a_vclk_div2.hw,
|
|
[CLKID_VCLK_DIV4] = &g12a_vclk_div4.hw,
|
|
[CLKID_VCLK_DIV6] = &g12a_vclk_div6.hw,
|
|
[CLKID_VCLK_DIV12] = &g12a_vclk_div12.hw,
|
|
[CLKID_VCLK2_DIV2] = &g12a_vclk2_div2.hw,
|
|
[CLKID_VCLK2_DIV4] = &g12a_vclk2_div4.hw,
|
|
[CLKID_VCLK2_DIV6] = &g12a_vclk2_div6.hw,
|
|
[CLKID_VCLK2_DIV12] = &g12a_vclk2_div12.hw,
|
|
[CLKID_CTS_ENCI_SEL] = &g12a_cts_enci_sel.hw,
|
|
[CLKID_CTS_ENCP_SEL] = &g12a_cts_encp_sel.hw,
|
|
[CLKID_CTS_VDAC_SEL] = &g12a_cts_vdac_sel.hw,
|
|
[CLKID_HDMI_TX_SEL] = &g12a_hdmi_tx_sel.hw,
|
|
[CLKID_CTS_ENCI] = &g12a_cts_enci.hw,
|
|
[CLKID_CTS_ENCP] = &g12a_cts_encp.hw,
|
|
[CLKID_CTS_VDAC] = &g12a_cts_vdac.hw,
|
|
[CLKID_HDMI_TX] = &g12a_hdmi_tx.hw,
|
|
[CLKID_HDMI_SEL] = &g12a_hdmi_sel.hw,
|
|
[CLKID_HDMI_DIV] = &g12a_hdmi_div.hw,
|
|
[CLKID_HDMI] = &g12a_hdmi.hw,
|
|
[CLKID_MALI_0_SEL] = &g12a_mali_0_sel.hw,
|
|
[CLKID_MALI_0_DIV] = &g12a_mali_0_div.hw,
|
|
[CLKID_MALI_0] = &g12a_mali_0.hw,
|
|
[CLKID_MALI_1_SEL] = &g12a_mali_1_sel.hw,
|
|
[CLKID_MALI_1_DIV] = &g12a_mali_1_div.hw,
|
|
[CLKID_MALI_1] = &g12a_mali_1.hw,
|
|
[CLKID_MALI] = &g12a_mali.hw,
|
|
[CLKID_MPLL_50M_DIV] = &g12a_mpll_50m_div.hw,
|
|
[CLKID_MPLL_50M] = &g12a_mpll_50m.hw,
|
|
[CLKID_SYS_PLL_DIV16_EN] = &g12a_sys_pll_div16_en.hw,
|
|
[CLKID_SYS_PLL_DIV16] = &g12a_sys_pll_div16.hw,
|
|
[CLKID_CPU_CLK_DYN0_SEL] = &g12a_cpu_clk_premux0.hw,
|
|
[CLKID_CPU_CLK_DYN0_DIV] = &g12a_cpu_clk_mux0_div.hw,
|
|
[CLKID_CPU_CLK_DYN0] = &g12a_cpu_clk_postmux0.hw,
|
|
[CLKID_CPU_CLK_DYN1_SEL] = &g12a_cpu_clk_premux1.hw,
|
|
[CLKID_CPU_CLK_DYN1_DIV] = &g12a_cpu_clk_mux1_div.hw,
|
|
[CLKID_CPU_CLK_DYN1] = &g12a_cpu_clk_postmux1.hw,
|
|
[CLKID_CPU_CLK_DYN] = &g12a_cpu_clk_dyn.hw,
|
|
[CLKID_CPU_CLK] = &g12a_cpu_clk.hw,
|
|
[CLKID_CPU_CLK_DIV16_EN] = &g12a_cpu_clk_div16_en.hw,
|
|
[CLKID_CPU_CLK_DIV16] = &g12a_cpu_clk_div16.hw,
|
|
[CLKID_CPU_CLK_APB_DIV] = &g12a_cpu_clk_apb_div.hw,
|
|
[CLKID_CPU_CLK_APB] = &g12a_cpu_clk_apb.hw,
|
|
[CLKID_CPU_CLK_ATB_DIV] = &g12a_cpu_clk_atb_div.hw,
|
|
[CLKID_CPU_CLK_ATB] = &g12a_cpu_clk_atb.hw,
|
|
[CLKID_CPU_CLK_AXI_DIV] = &g12a_cpu_clk_axi_div.hw,
|
|
[CLKID_CPU_CLK_AXI] = &g12a_cpu_clk_axi.hw,
|
|
[CLKID_CPU_CLK_TRACE_DIV] = &g12a_cpu_clk_trace_div.hw,
|
|
[CLKID_CPU_CLK_TRACE] = &g12a_cpu_clk_trace.hw,
|
|
[CLKID_PCIE_PLL_DCO] = &g12a_pcie_pll_dco.hw,
|
|
[CLKID_PCIE_PLL_DCO_DIV2] = &g12a_pcie_pll_dco_div2.hw,
|
|
[CLKID_PCIE_PLL_OD] = &g12a_pcie_pll_od.hw,
|
|
[CLKID_PCIE_PLL] = &g12a_pcie_pll.hw,
|
|
[CLKID_VDEC_1_SEL] = &g12a_vdec_1_sel.hw,
|
|
[CLKID_VDEC_1_DIV] = &g12a_vdec_1_div.hw,
|
|
[CLKID_VDEC_1] = &g12a_vdec_1.hw,
|
|
[CLKID_VDEC_HEVC_SEL] = &g12a_vdec_hevc_sel.hw,
|
|
[CLKID_VDEC_HEVC_DIV] = &g12a_vdec_hevc_div.hw,
|
|
[CLKID_VDEC_HEVC] = &g12a_vdec_hevc.hw,
|
|
[CLKID_VDEC_HEVCF_SEL] = &g12a_vdec_hevcf_sel.hw,
|
|
[CLKID_VDEC_HEVCF_DIV] = &g12a_vdec_hevcf_div.hw,
|
|
[CLKID_VDEC_HEVCF] = &g12a_vdec_hevcf.hw,
|
|
[CLKID_TS_DIV] = &g12a_ts_div.hw,
|
|
[CLKID_TS] = &g12a_ts.hw,
|
|
[CLKID_GP1_PLL_DCO] = &sm1_gp1_pll_dco.hw,
|
|
[CLKID_GP1_PLL] = &sm1_gp1_pll.hw,
|
|
[CLKID_DSU_CLK_DYN0_SEL] = &sm1_dsu_clk_premux0.hw,
|
|
[CLKID_DSU_CLK_DYN0_DIV] = &sm1_dsu_clk_premux1.hw,
|
|
[CLKID_DSU_CLK_DYN0] = &sm1_dsu_clk_mux0_div.hw,
|
|
[CLKID_DSU_CLK_DYN1_SEL] = &sm1_dsu_clk_postmux0.hw,
|
|
[CLKID_DSU_CLK_DYN1_DIV] = &sm1_dsu_clk_mux1_div.hw,
|
|
[CLKID_DSU_CLK_DYN1] = &sm1_dsu_clk_postmux1.hw,
|
|
[CLKID_DSU_CLK_DYN] = &sm1_dsu_clk_dyn.hw,
|
|
[CLKID_DSU_CLK_FINAL] = &sm1_dsu_final_clk.hw,
|
|
[CLKID_DSU_CLK] = &sm1_dsu_clk.hw,
|
|
[CLKID_CPU1_CLK] = &sm1_cpu1_clk.hw,
|
|
[CLKID_CPU2_CLK] = &sm1_cpu2_clk.hw,
|
|
[CLKID_CPU3_CLK] = &sm1_cpu3_clk.hw,
|
|
[CLKID_SPICC0_SCLK_SEL] = &g12a_spicc0_sclk_sel.hw,
|
|
[CLKID_SPICC0_SCLK_DIV] = &g12a_spicc0_sclk_div.hw,
|
|
[CLKID_SPICC0_SCLK] = &g12a_spicc0_sclk.hw,
|
|
[CLKID_SPICC1_SCLK_SEL] = &g12a_spicc1_sclk_sel.hw,
|
|
[CLKID_SPICC1_SCLK_DIV] = &g12a_spicc1_sclk_div.hw,
|
|
[CLKID_SPICC1_SCLK] = &g12a_spicc1_sclk.hw,
|
|
[CLKID_NNA_AXI_CLK_SEL] = &sm1_nna_axi_clk_sel.hw,
|
|
[CLKID_NNA_AXI_CLK_DIV] = &sm1_nna_axi_clk_div.hw,
|
|
[CLKID_NNA_AXI_CLK] = &sm1_nna_axi_clk.hw,
|
|
[CLKID_NNA_CORE_CLK_SEL] = &sm1_nna_core_clk_sel.hw,
|
|
[CLKID_NNA_CORE_CLK_DIV] = &sm1_nna_core_clk_div.hw,
|
|
[CLKID_NNA_CORE_CLK] = &sm1_nna_core_clk.hw,
|
|
[NR_CLKS] = NULL,
|
|
},
|
|
.num = NR_CLKS,
|
|
};
|
|
|
|
/* Convenience table to populate regmap in .probe */
|
|
static struct clk_regmap *const g12a_clk_regmaps[] = {
|
|
&g12a_clk81,
|
|
&g12a_dos,
|
|
&g12a_ddr,
|
|
&g12a_audio_locker,
|
|
&g12a_mipi_dsi_host,
|
|
&g12a_eth_phy,
|
|
&g12a_isa,
|
|
&g12a_pl301,
|
|
&g12a_periphs,
|
|
&g12a_spicc_0,
|
|
&g12a_i2c,
|
|
&g12a_sana,
|
|
&g12a_sd,
|
|
&g12a_rng0,
|
|
&g12a_uart0,
|
|
&g12a_spicc_1,
|
|
&g12a_hiu_reg,
|
|
&g12a_mipi_dsi_phy,
|
|
&g12a_assist_misc,
|
|
&g12a_emmc_a,
|
|
&g12a_emmc_b,
|
|
&g12a_emmc_c,
|
|
&g12a_audio_codec,
|
|
&g12a_audio,
|
|
&g12a_eth_core,
|
|
&g12a_demux,
|
|
&g12a_audio_ififo,
|
|
&g12a_adc,
|
|
&g12a_uart1,
|
|
&g12a_g2d,
|
|
&g12a_reset,
|
|
&g12a_pcie_comb,
|
|
&g12a_parser,
|
|
&g12a_usb_general,
|
|
&g12a_pcie_phy,
|
|
&g12a_ahb_arb0,
|
|
&g12a_ahb_data_bus,
|
|
&g12a_ahb_ctrl_bus,
|
|
&g12a_htx_hdcp22,
|
|
&g12a_htx_pclk,
|
|
&g12a_bt656,
|
|
&g12a_usb1_to_ddr,
|
|
&g12a_mmc_pclk,
|
|
&g12a_uart2,
|
|
&g12a_vpu_intr,
|
|
&g12a_gic,
|
|
&g12a_sd_emmc_a_clk0,
|
|
&g12a_sd_emmc_b_clk0,
|
|
&g12a_sd_emmc_c_clk0,
|
|
&g12a_mpeg_clk_div,
|
|
&g12a_sd_emmc_a_clk0_div,
|
|
&g12a_sd_emmc_b_clk0_div,
|
|
&g12a_sd_emmc_c_clk0_div,
|
|
&g12a_mpeg_clk_sel,
|
|
&g12a_sd_emmc_a_clk0_sel,
|
|
&g12a_sd_emmc_b_clk0_sel,
|
|
&g12a_sd_emmc_c_clk0_sel,
|
|
&g12a_mpll0,
|
|
&g12a_mpll1,
|
|
&g12a_mpll2,
|
|
&g12a_mpll3,
|
|
&g12a_mpll0_div,
|
|
&g12a_mpll1_div,
|
|
&g12a_mpll2_div,
|
|
&g12a_mpll3_div,
|
|
&g12a_fixed_pll,
|
|
&g12a_sys_pll,
|
|
&g12a_gp0_pll,
|
|
&g12a_hifi_pll,
|
|
&g12a_vclk2_venci0,
|
|
&g12a_vclk2_venci1,
|
|
&g12a_vclk2_vencp0,
|
|
&g12a_vclk2_vencp1,
|
|
&g12a_vclk2_venct0,
|
|
&g12a_vclk2_venct1,
|
|
&g12a_vclk2_other,
|
|
&g12a_vclk2_enci,
|
|
&g12a_vclk2_encp,
|
|
&g12a_dac_clk,
|
|
&g12a_aoclk_gate,
|
|
&g12a_iec958_gate,
|
|
&g12a_enc480p,
|
|
&g12a_rng1,
|
|
&g12a_vclk2_enct,
|
|
&g12a_vclk2_encl,
|
|
&g12a_vclk2_venclmmc,
|
|
&g12a_vclk2_vencl,
|
|
&g12a_vclk2_other1,
|
|
&g12a_fixed_pll_dco,
|
|
&g12a_sys_pll_dco,
|
|
&g12a_gp0_pll_dco,
|
|
&g12a_hifi_pll_dco,
|
|
&g12a_fclk_div2,
|
|
&g12a_fclk_div3,
|
|
&g12a_fclk_div4,
|
|
&g12a_fclk_div5,
|
|
&g12a_fclk_div7,
|
|
&g12a_fclk_div2p5,
|
|
&g12a_dma,
|
|
&g12a_efuse,
|
|
&g12a_rom_boot,
|
|
&g12a_reset_sec,
|
|
&g12a_sec_ahb_apb3,
|
|
&g12a_vpu_0_sel,
|
|
&g12a_vpu_0_div,
|
|
&g12a_vpu_0,
|
|
&g12a_vpu_1_sel,
|
|
&g12a_vpu_1_div,
|
|
&g12a_vpu_1,
|
|
&g12a_vpu,
|
|
&g12a_vapb_0_sel,
|
|
&g12a_vapb_0_div,
|
|
&g12a_vapb_0,
|
|
&g12a_vapb_1_sel,
|
|
&g12a_vapb_1_div,
|
|
&g12a_vapb_1,
|
|
&g12a_vapb_sel,
|
|
&g12a_vapb,
|
|
&g12a_hdmi_pll_dco,
|
|
&g12a_hdmi_pll_od,
|
|
&g12a_hdmi_pll_od2,
|
|
&g12a_hdmi_pll,
|
|
&g12a_vid_pll_div,
|
|
&g12a_vid_pll_sel,
|
|
&g12a_vid_pll,
|
|
&g12a_vclk_sel,
|
|
&g12a_vclk2_sel,
|
|
&g12a_vclk_input,
|
|
&g12a_vclk2_input,
|
|
&g12a_vclk_div,
|
|
&g12a_vclk2_div,
|
|
&g12a_vclk,
|
|
&g12a_vclk2,
|
|
&g12a_vclk_div1,
|
|
&g12a_vclk_div2_en,
|
|
&g12a_vclk_div4_en,
|
|
&g12a_vclk_div6_en,
|
|
&g12a_vclk_div12_en,
|
|
&g12a_vclk2_div1,
|
|
&g12a_vclk2_div2_en,
|
|
&g12a_vclk2_div4_en,
|
|
&g12a_vclk2_div6_en,
|
|
&g12a_vclk2_div12_en,
|
|
&g12a_cts_enci_sel,
|
|
&g12a_cts_encp_sel,
|
|
&g12a_cts_vdac_sel,
|
|
&g12a_hdmi_tx_sel,
|
|
&g12a_cts_enci,
|
|
&g12a_cts_encp,
|
|
&g12a_cts_vdac,
|
|
&g12a_hdmi_tx,
|
|
&g12a_hdmi_sel,
|
|
&g12a_hdmi_div,
|
|
&g12a_hdmi,
|
|
&g12a_mali_0_sel,
|
|
&g12a_mali_0_div,
|
|
&g12a_mali_0,
|
|
&g12a_mali_1_sel,
|
|
&g12a_mali_1_div,
|
|
&g12a_mali_1,
|
|
&g12a_mali,
|
|
&g12a_mpll_50m,
|
|
&g12a_sys_pll_div16_en,
|
|
&g12a_cpu_clk_premux0,
|
|
&g12a_cpu_clk_mux0_div,
|
|
&g12a_cpu_clk_postmux0,
|
|
&g12a_cpu_clk_premux1,
|
|
&g12a_cpu_clk_mux1_div,
|
|
&g12a_cpu_clk_postmux1,
|
|
&g12a_cpu_clk_dyn,
|
|
&g12a_cpu_clk,
|
|
&g12a_cpu_clk_div16_en,
|
|
&g12a_cpu_clk_apb_div,
|
|
&g12a_cpu_clk_apb,
|
|
&g12a_cpu_clk_atb_div,
|
|
&g12a_cpu_clk_atb,
|
|
&g12a_cpu_clk_axi_div,
|
|
&g12a_cpu_clk_axi,
|
|
&g12a_cpu_clk_trace_div,
|
|
&g12a_cpu_clk_trace,
|
|
&g12a_pcie_pll_od,
|
|
&g12a_pcie_pll_dco,
|
|
&g12a_vdec_1_sel,
|
|
&g12a_vdec_1_div,
|
|
&g12a_vdec_1,
|
|
&g12a_vdec_hevc_sel,
|
|
&g12a_vdec_hevc_div,
|
|
&g12a_vdec_hevc,
|
|
&g12a_vdec_hevcf_sel,
|
|
&g12a_vdec_hevcf_div,
|
|
&g12a_vdec_hevcf,
|
|
&g12a_ts_div,
|
|
&g12a_ts,
|
|
&g12b_cpu_clk,
|
|
&g12b_sys1_pll_dco,
|
|
&g12b_sys1_pll,
|
|
&g12b_sys1_pll_div16_en,
|
|
&g12b_cpub_clk_premux0,
|
|
&g12b_cpub_clk_mux0_div,
|
|
&g12b_cpub_clk_postmux0,
|
|
&g12b_cpub_clk_premux1,
|
|
&g12b_cpub_clk_mux1_div,
|
|
&g12b_cpub_clk_postmux1,
|
|
&g12b_cpub_clk_dyn,
|
|
&g12b_cpub_clk,
|
|
&g12b_cpub_clk_div16_en,
|
|
&g12b_cpub_clk_apb_sel,
|
|
&g12b_cpub_clk_apb,
|
|
&g12b_cpub_clk_atb_sel,
|
|
&g12b_cpub_clk_atb,
|
|
&g12b_cpub_clk_axi_sel,
|
|
&g12b_cpub_clk_axi,
|
|
&g12b_cpub_clk_trace_sel,
|
|
&g12b_cpub_clk_trace,
|
|
&sm1_gp1_pll_dco,
|
|
&sm1_gp1_pll,
|
|
&sm1_dsu_clk_premux0,
|
|
&sm1_dsu_clk_premux1,
|
|
&sm1_dsu_clk_mux0_div,
|
|
&sm1_dsu_clk_postmux0,
|
|
&sm1_dsu_clk_mux1_div,
|
|
&sm1_dsu_clk_postmux1,
|
|
&sm1_dsu_clk_dyn,
|
|
&sm1_dsu_final_clk,
|
|
&sm1_dsu_clk,
|
|
&sm1_cpu1_clk,
|
|
&sm1_cpu2_clk,
|
|
&sm1_cpu3_clk,
|
|
&g12a_spicc0_sclk_sel,
|
|
&g12a_spicc0_sclk_div,
|
|
&g12a_spicc0_sclk,
|
|
&g12a_spicc1_sclk_sel,
|
|
&g12a_spicc1_sclk_div,
|
|
&g12a_spicc1_sclk,
|
|
&sm1_nna_axi_clk_sel,
|
|
&sm1_nna_axi_clk_div,
|
|
&sm1_nna_axi_clk,
|
|
&sm1_nna_core_clk_sel,
|
|
&sm1_nna_core_clk_div,
|
|
&sm1_nna_core_clk,
|
|
};
|
|
|
|
static const struct reg_sequence g12a_init_regs[] = {
|
|
{ .reg = HHI_MPLL_CNTL0, .def = 0x00000543 },
|
|
};
|
|
|
|
#define DVFS_CON_ID "dvfs"
|
|
|
|
static int meson_g12a_dvfs_setup_common(struct device *dev,
|
|
struct clk_hw **hws)
|
|
{
|
|
struct clk *notifier_clk;
|
|
struct clk_hw *xtal;
|
|
int ret;
|
|
|
|
xtal = clk_hw_get_parent_by_index(hws[CLKID_CPU_CLK_DYN1_SEL], 0);
|
|
|
|
/* Setup clock notifier for cpu_clk_postmux0 */
|
|
g12a_cpu_clk_postmux0_nb_data.xtal = xtal;
|
|
notifier_clk = devm_clk_hw_get_clk(dev, &g12a_cpu_clk_postmux0.hw,
|
|
DVFS_CON_ID);
|
|
ret = devm_clk_notifier_register(dev, notifier_clk,
|
|
&g12a_cpu_clk_postmux0_nb_data.nb);
|
|
if (ret) {
|
|
dev_err(dev, "failed to register the cpu_clk_postmux0 notifier\n");
|
|
return ret;
|
|
}
|
|
|
|
/* Setup clock notifier for cpu_clk_dyn mux */
|
|
notifier_clk = devm_clk_hw_get_clk(dev, &g12a_cpu_clk_dyn.hw,
|
|
DVFS_CON_ID);
|
|
ret = devm_clk_notifier_register(dev, notifier_clk,
|
|
&g12a_cpu_clk_mux_nb);
|
|
if (ret) {
|
|
dev_err(dev, "failed to register the cpu_clk_dyn notifier\n");
|
|
return ret;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
static int meson_g12b_dvfs_setup(struct platform_device *pdev)
|
|
{
|
|
struct clk_hw **hws = g12b_hw_onecell_data.hws;
|
|
struct device *dev = &pdev->dev;
|
|
struct clk *notifier_clk;
|
|
struct clk_hw *xtal;
|
|
int ret;
|
|
|
|
ret = meson_g12a_dvfs_setup_common(dev, hws);
|
|
if (ret)
|
|
return ret;
|
|
|
|
xtal = clk_hw_get_parent_by_index(hws[CLKID_CPU_CLK_DYN1_SEL], 0);
|
|
|
|
/* Setup clock notifier for cpu_clk mux */
|
|
notifier_clk = devm_clk_hw_get_clk(dev, &g12b_cpu_clk.hw,
|
|
DVFS_CON_ID);
|
|
ret = devm_clk_notifier_register(dev, notifier_clk,
|
|
&g12a_cpu_clk_mux_nb);
|
|
if (ret) {
|
|
dev_err(dev, "failed to register the cpu_clk notifier\n");
|
|
return ret;
|
|
}
|
|
|
|
/* Setup clock notifier for sys1_pll */
|
|
notifier_clk = devm_clk_hw_get_clk(dev, &g12b_sys1_pll.hw,
|
|
DVFS_CON_ID);
|
|
ret = devm_clk_notifier_register(dev, notifier_clk,
|
|
&g12b_cpu_clk_sys1_pll_nb_data.nb);
|
|
if (ret) {
|
|
dev_err(dev, "failed to register the sys1_pll notifier\n");
|
|
return ret;
|
|
}
|
|
|
|
/* Add notifiers for the second CPU cluster */
|
|
|
|
/* Setup clock notifier for cpub_clk_postmux0 */
|
|
g12b_cpub_clk_postmux0_nb_data.xtal = xtal;
|
|
notifier_clk = devm_clk_hw_get_clk(dev, &g12b_cpub_clk_postmux0.hw,
|
|
DVFS_CON_ID);
|
|
ret = devm_clk_notifier_register(dev, notifier_clk,
|
|
&g12b_cpub_clk_postmux0_nb_data.nb);
|
|
if (ret) {
|
|
dev_err(dev, "failed to register the cpub_clk_postmux0 notifier\n");
|
|
return ret;
|
|
}
|
|
|
|
/* Setup clock notifier for cpub_clk_dyn mux */
|
|
notifier_clk = devm_clk_hw_get_clk(dev, &g12b_cpub_clk_dyn.hw, "dvfs");
|
|
ret = devm_clk_notifier_register(dev, notifier_clk,
|
|
&g12a_cpu_clk_mux_nb);
|
|
if (ret) {
|
|
dev_err(dev, "failed to register the cpub_clk_dyn notifier\n");
|
|
return ret;
|
|
}
|
|
|
|
/* Setup clock notifier for cpub_clk mux */
|
|
notifier_clk = devm_clk_hw_get_clk(dev, &g12b_cpub_clk.hw, DVFS_CON_ID);
|
|
ret = devm_clk_notifier_register(dev, notifier_clk,
|
|
&g12a_cpu_clk_mux_nb);
|
|
if (ret) {
|
|
dev_err(dev, "failed to register the cpub_clk notifier\n");
|
|
return ret;
|
|
}
|
|
|
|
/* Setup clock notifier for sys_pll */
|
|
notifier_clk = devm_clk_hw_get_clk(dev, &g12a_sys_pll.hw, DVFS_CON_ID);
|
|
ret = devm_clk_notifier_register(dev, notifier_clk,
|
|
&g12b_cpub_clk_sys_pll_nb_data.nb);
|
|
if (ret) {
|
|
dev_err(dev, "failed to register the sys_pll notifier\n");
|
|
return ret;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
static int meson_g12a_dvfs_setup(struct platform_device *pdev)
|
|
{
|
|
struct clk_hw **hws = g12a_hw_onecell_data.hws;
|
|
struct device *dev = &pdev->dev;
|
|
struct clk *notifier_clk;
|
|
int ret;
|
|
|
|
ret = meson_g12a_dvfs_setup_common(dev, hws);
|
|
if (ret)
|
|
return ret;
|
|
|
|
/* Setup clock notifier for cpu_clk mux */
|
|
notifier_clk = devm_clk_hw_get_clk(dev, &g12a_cpu_clk.hw, DVFS_CON_ID);
|
|
ret = devm_clk_notifier_register(dev, notifier_clk,
|
|
&g12a_cpu_clk_mux_nb);
|
|
if (ret) {
|
|
dev_err(dev, "failed to register the cpu_clk notifier\n");
|
|
return ret;
|
|
}
|
|
|
|
/* Setup clock notifier for sys_pll */
|
|
notifier_clk = devm_clk_hw_get_clk(dev, &g12a_sys_pll.hw, DVFS_CON_ID);
|
|
ret = devm_clk_notifier_register(dev, notifier_clk,
|
|
&g12a_sys_pll_nb_data.nb);
|
|
if (ret) {
|
|
dev_err(dev, "failed to register the sys_pll notifier\n");
|
|
return ret;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
struct meson_g12a_data {
|
|
const struct meson_eeclkc_data eeclkc_data;
|
|
int (*dvfs_setup)(struct platform_device *pdev);
|
|
};
|
|
|
|
static int meson_g12a_probe(struct platform_device *pdev)
|
|
{
|
|
const struct meson_eeclkc_data *eeclkc_data;
|
|
const struct meson_g12a_data *g12a_data;
|
|
int ret;
|
|
|
|
eeclkc_data = of_device_get_match_data(&pdev->dev);
|
|
if (!eeclkc_data)
|
|
return -EINVAL;
|
|
|
|
ret = meson_eeclkc_probe(pdev);
|
|
if (ret)
|
|
return ret;
|
|
|
|
g12a_data = container_of(eeclkc_data, struct meson_g12a_data,
|
|
eeclkc_data);
|
|
|
|
if (g12a_data->dvfs_setup)
|
|
return g12a_data->dvfs_setup(pdev);
|
|
|
|
return 0;
|
|
}
|
|
|
|
static const struct meson_g12a_data g12a_clkc_data = {
|
|
.eeclkc_data = {
|
|
.regmap_clks = g12a_clk_regmaps,
|
|
.regmap_clk_num = ARRAY_SIZE(g12a_clk_regmaps),
|
|
.hw_onecell_data = &g12a_hw_onecell_data,
|
|
.init_regs = g12a_init_regs,
|
|
.init_count = ARRAY_SIZE(g12a_init_regs),
|
|
},
|
|
.dvfs_setup = meson_g12a_dvfs_setup,
|
|
};
|
|
|
|
static const struct meson_g12a_data g12b_clkc_data = {
|
|
.eeclkc_data = {
|
|
.regmap_clks = g12a_clk_regmaps,
|
|
.regmap_clk_num = ARRAY_SIZE(g12a_clk_regmaps),
|
|
.hw_onecell_data = &g12b_hw_onecell_data,
|
|
},
|
|
.dvfs_setup = meson_g12b_dvfs_setup,
|
|
};
|
|
|
|
static const struct meson_g12a_data sm1_clkc_data = {
|
|
.eeclkc_data = {
|
|
.regmap_clks = g12a_clk_regmaps,
|
|
.regmap_clk_num = ARRAY_SIZE(g12a_clk_regmaps),
|
|
.hw_onecell_data = &sm1_hw_onecell_data,
|
|
},
|
|
.dvfs_setup = meson_g12a_dvfs_setup,
|
|
};
|
|
|
|
static const struct of_device_id clkc_match_table[] = {
|
|
{
|
|
.compatible = "amlogic,g12a-clkc",
|
|
.data = &g12a_clkc_data.eeclkc_data
|
|
},
|
|
{
|
|
.compatible = "amlogic,g12b-clkc",
|
|
.data = &g12b_clkc_data.eeclkc_data
|
|
},
|
|
{
|
|
.compatible = "amlogic,sm1-clkc",
|
|
.data = &sm1_clkc_data.eeclkc_data
|
|
},
|
|
{}
|
|
};
|
|
MODULE_DEVICE_TABLE(of, clkc_match_table);
|
|
|
|
static struct platform_driver g12a_driver = {
|
|
.probe = meson_g12a_probe,
|
|
.driver = {
|
|
.name = "g12a-clkc",
|
|
.of_match_table = clkc_match_table,
|
|
},
|
|
};
|
|
|
|
module_platform_driver(g12a_driver);
|
|
MODULE_LICENSE("GPL v2");
|