2024-03-18 11:44:22

by Lucas Tanure

[permalink] [raw]
Subject: [RFC][PATCH 0/2] Amlogic T7 (A113D2) Clock Driver

I am trying to port the T7 clock driver from Khadas 5.4 kernel for Vim4
to mainline, but I am encountering some issues in the path.

The kernel panics at clk_mux_val_to_index, but I believe that all the
needed clocks are registered.

If anyone from Amlogic or the community could help me understand what
my driver is missing, that would be great.
I will continue to try to figure out, but it has been some weeks
without progress =/.

Lucas Tanure (2):
clk: meson: T7: add support for Amlogic T7 SoC PLL clock driver
arm64: dts: amlogic: t7: SDCard, Ethernet and Clocking

.../amlogic/amlogic-t7-a311d2-khadas-vim4.dts | 66 +
arch/arm64/boot/dts/amlogic/amlogic-t7.dtsi | 189 +
drivers/clk/meson/Kconfig | 25 +
drivers/clk/meson/Makefile | 2 +
drivers/clk/meson/t7-peripherals.c | 6368 +++++++++++++++++
drivers/clk/meson/t7-peripherals.h | 131 +
drivers/clk/meson/t7-pll.c | 1543 ++++
drivers/clk/meson/t7-pll.h | 83 +
.../clock/amlogic,t7-peripherals-clkc.h | 410 ++
.../dt-bindings/clock/amlogic,t7-pll-clkc.h | 69 +
10 files changed, 8886 insertions(+)
create mode 100644 drivers/clk/meson/t7-peripherals.c
create mode 100644 drivers/clk/meson/t7-peripherals.h
create mode 100644 drivers/clk/meson/t7-pll.c
create mode 100644 drivers/clk/meson/t7-pll.h
create mode 100644 include/dt-bindings/clock/amlogic,t7-peripherals-clkc.h
create mode 100644 include/dt-bindings/clock/amlogic,t7-pll-clkc.h

Starting kernel ...

uboot time: 14277917 us
boot 64bit kernel
[ 0.000000] Booting Linux on physical CPU 0x0000000000 [0x410fd092]
[ 0.000000] Linux version 6.8.0-09793-gda876e5b54b3-dirty (tanureal@ryzen) (aarch64-none-linux-gnu-gcc (GNU Toolchain for the A-profile Architecture 10.3-2021.07 (arm-10.29)) 10.3.1 20210621, GNU ld (GNU Toolchain for the A-pr4
[ 0.000000] KASLR disabled due to lack of seed
[ 0.000000] Machine model: Khadas vim4
[ 0.000000] efi: UEFI not found.
[ 0.000000] OF: reserved mem: 0x0000000005000000..0x00000000052fffff (3072 KiB) nomap non-reusable secmon@5000000
[ 0.000000] OF: reserved mem: 0x0000000005300000..0x00000000072fffff (32768 KiB) nomap non-reusable secmon@5300000
[ 0.000000] NUMA: No NUMA configuration found
[ 0.000000] NUMA: Faking a node at [mem 0x0000000000000000-0x00000000df7fffff]
[ 0.000000] NUMA: NODE_DATA [mem 0xdf10c9c0-0xdf10efff]
[ 0.000000] Zone ranges:
[ 0.000000] DMA [mem 0x0000000000000000-0x00000000df7fffff]
[ 0.000000] DMA32 empty
[ 0.000000] Normal empty
[ 0.000000] Movable zone start for each node
[ 0.000000] Early memory node ranges
[ 0.000000] node 0: [mem 0x0000000000000000-0x0000000004ffffff]
[ 0.000000] node 0: [mem 0x0000000005000000-0x00000000072fffff]
[ 0.000000] node 0: [mem 0x0000000007300000-0x00000000df7fffff]
[ 0.000000] Initmem setup node 0 [mem 0x0000000000000000-0x00000000df7fffff]
[ 0.000000] On node 0, zone DMA: 2048 pages in unavailable ranges
[ 0.000000] cma: Reserved 32 MiB at 0x00000000d9800000 on node -1
[ 0.000000] psci: probing for conduit method from DT.
[ 0.000000] psci: PSCIv1.0 detected in firmware.
[ 0.000000] psci: Using standard PSCI v0.2 function IDs
[ 0.000000] psci: Trusted OS migration not required
[ 0.000000] psci: SMC Calling Convention v1.1
[ 0.000000] percpu: Embedded 24 pages/cpu s58152 r8192 d31960 u98304
[ 0.000000] Detected VIPT I-cache on CPU0
[ 0.000000] CPU features: detected: Spectre-v2
[ 0.000000] CPU features: detected: Spectre-v4
[ 0.000000] CPU features: detected: Spectre-BHB
[ 0.000000] CPU features: detected: ARM erratum 858921
[ 0.000000] alternatives: applying boot alternatives
[ 0.000000] Kernel command line: root=UUID=a91e7bfe-4263-4e53-867d-7824e7c6a992 rw rootfstype=ext4 console=ttyS0,921600 no_console_suspend earlycon=ttyS0,0xfe078000 khadas_board=VIM4 androidboot.selinux=permissive androidboot.0
[ 0.000000] Unknown kernel command line parameters "khadas_board=VIM4", will be passed to user space.
[ 0.000000] Dentry cache hash table entries: 524288 (order: 10, 4194304 bytes, linear)
[ 0.000000] Inode-cache hash table entries: 262144 (order: 9, 2097152 bytes, linear)
[ 0.000000] Fallback order for Node 0: 0
[ 0.000000] Built 1 zonelists, mobility grouping on. Total pages: 901152
[ 0.000000] Policy zone: DMA
[ 0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off
[ 0.000000] software IO TLB: SWIOTLB bounce buffer size adjusted to 3MB
[ 0.000000] software IO TLB: area num 8.
[ 0.000000] software IO TLB: SWIOTLB bounce buffer size roundup to 4MB
[ 0.000000] software IO TLB: mapped [mem 0x00000000d8e00000-0x00000000d9200000] (4MB)
[ 0.000000] Memory: 3445944K/3661824K available (16896K kernel code, 4426K rwdata, 9184K rodata, 9728K init, 611K bss, 183112K reserved, 32768K cma-reserved)
[ 0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=8, Nodes=1
[ 0.000000] rcu: Preemptible hierarchical RCU implementation.
[ 0.000000] rcu: RCU restricting CPUs from NR_CPUS=256 to nr_cpu_ids=8.
[ 0.000000] Trampoline variant of Tasks RCU enabled.
[ 0.000000] Tracing variant of Tasks RCU enabled.
[ 0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 25 jiffies.
[ 0.000000] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=8
[ 0.000000] RCU Tasks: Setting shift to 3 and lim to 1 rcu_task_cb_adjust=1.
[ 0.000000] RCU Tasks Trace: Setting shift to 3 and lim to 1 rcu_task_cb_adjust=1.
[ 0.000000] NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0
[ 0.000000] GIC: GICv2 detected, but range too small and irqchip.gicv2_force_probe not set
[ 0.000000] Root IRQ handler: gic_handle_irq
[ 0.000000] rcu: srcu_init: Setting srcu_struct sizes based on contention.
[ 0.000000] arch_timer: Enabling local workaround for ARM erratum 858921
[ 0.000000] arch_timer: CPU0: Trapping CNTVCT access
[ 0.000000] arch_timer: cp15 timer(s) running at 24.00MHz (phys).
[ 0.000000] clocksource: arch_sys_counter: mask: 0xffffffffffffff max_cycles: 0x588fe9dc0, max_idle_ns: 440795202592 ns
[ 0.000000] sched_clock: 56 bits at 24MHz, resolution 41ns, wraps every 4398046511097ns
[ 0.000210] Console: colour dummy device 80x25
[ 0.000253] Calibrating delay loop (skipped), value calculated using timer frequency.. 48.00 BogoMIPS (lpj=96000)
[ 0.000261] pid_max: default: 32768 minimum: 301
[ 0.000300] LSM: initializing lsm=capability
[ 0.000358] Mount-cache hash table entries: 8192 (order: 4, 65536 bytes, linear)
[ 0.000371] Mountpoint-cache hash table entries: 8192 (order: 4, 65536 bytes, linear)
[ 0.000920] cacheinfo: Unable to detect cache hierarchy for CPU 0
[ 0.001389] rcu: Hierarchical SRCU implementation.
[ 0.001391] rcu: Max phase no-delay instances is 1000.
[ 0.001834] EFI services will not be available.
[ 0.001999] smp: Bringing up secondary CPUs ...
[ 0.002408] CPU features: detected: ARM erratum 845719
[ 0.002426] Detected VIPT I-cache on CPU1
[ 0.002516] CPU1: Booted secondary processor 0x0000000100 [0x410fd034]
[ 0.003007] Detected VIPT I-cache on CPU2
[ 0.003054] CPU2: Booted secondary processor 0x0000000101 [0x410fd034]
[ 0.003497] Detected VIPT I-cache on CPU3
[ 0.003546] CPU3: Booted secondary processor 0x0000000102 [0x410fd034]
[ 0.003988] Detected VIPT I-cache on CPU4
[ 0.004038] CPU4: Booted secondary processor 0x0000000103 [0x410fd034]
[ 0.004472] Detected VIPT I-cache on CPU5
[ 0.004509] arch_timer: Enabling local workaround for ARM erratum 858921
[ 0.004519] arch_timer: CPU5: Trapping CNTVCT access
[ 0.004527] CPU5: Booted secondary processor 0x0000000001 [0x410fd092]
[ 0.004915] Detected VIPT I-cache on CPU6
[ 0.004940] arch_timer: Enabling local workaround for ARM erratum 858921
[ 0.004946] arch_timer: CPU6: Trapping CNTVCT access
[ 0.004951] CPU6: Booted secondary processor 0x0000000002 [0x410fd092]
[ 0.005333] Detected VIPT I-cache on CPU7
[ 0.005358] arch_timer: Enabling local workaround for ARM erratum 858921
[ 0.005364] arch_timer: CPU7: Trapping CNTVCT access
[ 0.005369] CPU7: Booted secondary processor 0x0000000003 [0x410fd092]
[ 0.005414] smp: Brought up 1 node, 8 CPUs
[ 0.005419] SMP: Total of 8 processors activated.
[ 0.005421] CPU: All CPU(s) started at EL2
[ 0.005434] CPU features: detected: 32-bit EL0 Support
[ 0.005437] CPU features: detected: 32-bit EL1 Support
[ 0.005440] CPU features: detected: CRC32 instructions
[ 0.005485] alternatives: applying system-wide alternatives
[ 0.006730] devtmpfs: initialized
[ 0.008534] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645041785100000 ns
[ 0.008545] futex hash table entries: 2048 (order: 5, 131072 bytes, linear)
[ 0.008989] pinctrl core: initialized pinctrl subsystem
[ 0.009581] DMI not present or invalid.
[ 0.011290] NET: Registered PF_NETLINK/PF_ROUTE protocol family
[ 0.011944] DMA: preallocated 512 KiB GFP_KERNEL pool for atomic allocations
[ 0.012293] DMA: preallocated 512 KiB GFP_KERNEL|GFP_DMA pool for atomic allocations
[ 0.012711] DMA: preallocated 512 KiB GFP_KERNEL|GFP_DMA32 pool for atomic allocations
[ 0.012832] audit: initializing netlink subsys (disabled)
[ 0.013075] audit: type=2000 audit(0.012:1): state=initialized audit_enabled=0 res=1
[ 0.013508] thermal_sys: Registered thermal governor 'step_wise'
[ 0.013512] thermal_sys: Registered thermal governor 'power_allocator'
[ 0.013557] cpuidle: using governor menu
[ 0.013675] hw-breakpoint: found 6 breakpoint and 4 watchpoint registers.
[ 0.013784] ASID allocator initialised with 65536 entries
[ 0.014630] Serial: AMBA PL011 UART driver
[ 0.017553] Modules: 22496 pages in range for non-PLT usage
[ 0.017556] Modules: 514016 pages in range for PLT usage
[ 0.017980] HugeTLB: registered 1.00 GiB page size, pre-allocated 0 pages
[ 0.017984] HugeTLB: 0 KiB vmemmap can be freed for a 1.00 GiB page
[ 0.017988] HugeTLB: registered 32.0 MiB page size, pre-allocated 0 pages
[ 0.017990] HugeTLB: 0 KiB vmemmap can be freed for a 32.0 MiB page
[ 0.017993] HugeTLB: registered 2.00 MiB page size, pre-allocated 0 pages
[ 0.017995] HugeTLB: 0 KiB vmemmap can be freed for a 2.00 MiB page
[ 0.017997] HugeTLB: registered 64.0 KiB page size, pre-allocated 0 pages
[ 0.018000] HugeTLB: 0 KiB vmemmap can be freed for a 64.0 KiB page
[ 0.018247] Demotion targets for Node 0: null
[ 0.018884] ACPI: Interpreter disabled.
[ 0.019584] iommu: Default domain type: Translated
[ 0.019587] iommu: DMA domain TLB invalidation policy: strict mode
[ 0.019979] SCSI subsystem initialized
[ 0.020174] usbcore: registered new interface driver usbfs
[ 0.020187] usbcore: registered new interface driver hub
[ 0.020200] usbcore: registered new device driver usb
[ 0.020434] pps_core: LinuxPPS API ver. 1 registered
[ 0.020437] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <[email protected]>
[ 0.020443] PTP clock support registered
[ 0.020487] EDAC MC: Ver: 3.0.0
[ 0.020717] scmi_core: SCMI protocol bus registered
[ 0.021039] FPGA manager framework
[ 0.021076] Advanced Linux Sound Architecture Driver Initialized.
[ 0.021612] vgaarb: loaded
[ 0.021857] clocksource: Switched to clocksource arch_sys_counter
[ 0.021967] VFS: Disk quotas dquot_6.6.0
[ 0.021984] VFS: Dquot-cache hash table entries: 512 (order 0, 4096 bytes)
[ 0.022062] pnp: PnP ACPI: disabled
[ 0.026651] NET: Registered PF_INET protocol family
[ 0.026781] IP idents hash table entries: 65536 (order: 7, 524288 bytes, linear)
[ 0.028598] tcp_listen_portaddr_hash hash table entries: 2048 (order: 3, 32768 bytes, linear)
[ 0.028615] Table-perturb hash table entries: 65536 (order: 6, 262144 bytes, linear)
[ 0.028622] TCP established hash table entries: 32768 (order: 6, 262144 bytes, linear)
[ 0.028750] TCP bind hash table entries: 32768 (order: 8, 1048576 bytes, linear)
[ 0.029019] TCP: Hash tables configured (established 32768 bind 32768)
[ 0.029096] UDP hash table entries: 2048 (order: 4, 65536 bytes, linear)
[ 0.029124] UDP-Lite hash table entries: 2048 (order: 4, 65536 bytes, linear)
[ 0.029225] NET: Registered PF_UNIX/PF_LOCAL protocol family
[ 0.029506] RPC: Registered named UNIX socket transport module.
[ 0.029510] RPC: Registered udp transport module.
[ 0.029512] RPC: Registered tcp transport module.
[ 0.029513] RPC: Registered tcp-with-tls transport module.
[ 0.029515] RPC: Registered tcp NFSv4.1 backchannel transport module.
[ 0.029524] PCI: CLS 0 bytes, default 64
[ 0.029649] Unpacking initramfs...
[ 0.033933] kvm [1]: IPA Size Limit: 40 bits
[ 0.034713] kvm [1]: Hyp mode initialized successfully
[ 0.035476] Initialise system trusted keyrings
[ 0.035582] workingset: timestamp_bits=42 max_order=20 bucket_order=0
[ 0.035747] squashfs: version 4.0 (2009/01/31) Phillip Lougher
[ 0.035906] NFS: Registering the id_resolver key type
[ 0.035919] Key type id_resolver registered
[ 0.035922] Key type id_legacy registered
[ 0.035933] nfs4filelayout_init: NFSv4 File Layout Driver Registering...
[ 0.035935] nfs4flexfilelayout_init: NFSv4 Flexfile Layout Driver Registering...
[ 0.036031] 9p: Installing v9fs 9p2000 file system support
[ 0.062587] Key type asymmetric registered
[ 0.062596] Asymmetric key parser 'x509' registered
[ 0.062657] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 245)
[ 0.062661] io scheduler mq-deadline registered
[ 0.062664] io scheduler kyber registered
[ 0.062688] io scheduler bfq registered
[ 0.063318] irq_meson_gpio: 157 to 12 gpio interrupt mux initialized
[ 0.068061] EINJ: ACPI disabled.
[ 0.072570] amlogic_t7_pll_probe
[ 0.072855] amlogic_t7_pll_probe ret 0
[ 0.072943] amlogic_a1_periphs_probe
[ 0.078155] amlogic_a1_periphs_probe ret 0
[ 0.084876] Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled
[ 0.086691] fe078000.serial: ttyS0 at MMIO 0xfe078000 (irq = 14, base_baud = 1500000) is a meson_uart
[ 0.086710] printk: legacy console [ttyS0] enabled
[ 0.229167] sysfs: cannot create duplicate filename '/class/tty/ttyS0'
[ 0.229669] CPU: 3 PID: 1 Comm: swapper/0 Not tainted 6.8.0-09793-gda876e5b54b3-dirty #15
[ 0.230684] Hardware name: Khadas vim4 (DT)
[ 0.231205] Call trace:
[ 0.231509] dump_backtrace+0x94/0xec
[ 0.231963] show_stack+0x18/0x24
[ 0.232374] dump_stack_lvl+0x78/0x90
[ 0.232829] dump_stack+0x18/0x24
[ 0.233241] sysfs_warn_dup+0x64/0x80
[ 0.233696] sysfs_do_create_link_sd+0xf0/0xf8
[ 0.234248] sysfs_create_link+0x20/0x40
[ 0.234736] device_add+0x27c/0x77c
[ 0.235169] device_register+0x20/0x30
[ 0.235635] tty_register_device_attr+0xfc/0x240
[ 0.236209] tty_port_register_device_attr_serdev+0x8c/0xac
[ 0.236902] serial_core_register_port+0x318/0x658
[ 0.237498] serial_ctrl_register_port+0x10/0x1c
[ 0.238072] uart_add_one_port+0x10/0x1c
[ 0.238560] meson_uart_probe+0x2c0/0x3b4
[ 0.239058] platform_probe+0x68/0xd8
[ 0.239513] really_probe+0x148/0x2b4
[ 0.239968] __driver_probe_device+0x78/0x12c
[ 0.240510] driver_probe_device+0xdc/0x160
[ 0.241030] __driver_attach+0x94/0x19c
[ 0.241507] bus_for_each_dev+0x74/0xd4
[ 0.241983] driver_attach+0x24/0x30
[ 0.242428] bus_add_driver+0xe4/0x1e8
[ 0.242893] driver_register+0x60/0x128
[ 0.243370] __platform_driver_register+0x28/0x34
[ 0.243955] meson_uart_platform_driver_init+0x1c/0x28
[ 0.244594] do_one_initcall+0x6c/0x1b0
[ 0.245071] kernel_init_freeable+0x1cc/0x294
[ 0.245613] kernel_init+0x20/0x1dc
[ 0.246046] ret_from_fork+0x10/0x20
[ 0.246555] meson_uart fe078000.serial: Cannot register tty device on line 0
[ 0.247729] msm_serial: driver initialized
[ 0.248150] SuperH (H)SCI(F) driver initialized
[ 0.248544] STM32 USART driver initialized
[ 0.263927] loop: module loaded
[ 0.264952] megasas: 07.727.03.00-rc1
[ 0.271065] tun: Universal TUN/TAP device driver, 1.6
[ 0.271824] thunder_xcv, ver 1.0
[ 0.271878] thunder_bgx, ver 1.0
[ 0.271956] nicpf, ver 1.0
[ 0.273230] hns3: Hisilicon Ethernet Network Driver for Hip08 Family - version
[ 0.273437] hns3: Copyright (c) 2017 Huawei Corporation.
[ 0.274148] hclge is initializing
[ 0.274541] e1000: Intel(R) PRO/1000 Network Driver
[ 0.275116] e1000: Copyright (c) 1999-2006 Intel Corporation.
[ 0.275860] e1000e: Intel(R) PRO/1000 Network Driver
[ 0.276449] e1000e: Copyright(c) 1999 - 2015 Intel Corporation.
[ 0.277209] igb: Intel(R) Gigabit Ethernet Network Driver
[ 0.277867] igb: Copyright (c) 2007-2014 Intel Corporation.
[ 0.278576] igbvf: Intel(R) Gigabit Virtual Function Network Driver
[ 0.279330] igbvf: Copyright (c) 2009 - 2012 Intel Corporation.
[ 0.280319] sky2: driver version 1.30
[ 0.281597] VFIO - User Level meta-driver version: 0.3
[ 0.283859] usbcore: registered new interface driver usb-storage
[ 0.286328] i2c_dev: i2c /dev entries driver
[ 0.292404] sdhci: Secure Digital Host Controller Interface driver
[ 0.292481] sdhci: Copyright(c) Pierre Ossman
[ 0.293577] Synopsys Designware Multimedia Card Interface Driver
[ 0.294572] sdhci-pltfm: SDHCI platform and OF driver helper
[ 0.296259] ledtrig-cpu: registered to indicate activity on CPUs
[ 0.298966] meson-sm: secure-monitor enabled
[ 0.299963] usbcore: registered new interface driver usbhid
[ 0.299997] usbhid: USB HID core driver
[ 0.306803] NET: Registered PF_PACKET protocol family
[ 0.306919] 9pnet: Installing 9P2000 support
[ 0.307331] Key type dns_resolver registered
[ 0.318926] Timer migration: 1 hierarchy levels; 8 children per group; 1 crossnode level
[ 0.319462] registered taskstats version 1
[ 0.319968] Loading compiled-in X.509 certificates
[ 0.362771] clk: Disabling unused clocks
[ 0.363100] PM: genpd: Disabling unused power domains
[ 0.363383] ALSA device list:
[ 0.363580] No soundcards found.
[ 0.368194] meson-gx-mmc fe08a000.sd: Got CD GPIO
[ 0.368524] SError Interrupt on CPU6, code 0x00000000bf000002 -- SError
[ 0.368531] CPU: 6 PID: 87 Comm: kworker/u32:3 Not tainted 6.8.0-09793-gda876e5b54b3-dirty #15
[ 0.368537] Hardware name: Khadas vim4 (DT)
[ 0.368540] Workqueue: async async_run_entry_fn
[ 0.368552] pstate: 20000005 (nzCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
[ 0.368556] pc : clk_mux_val_to_index+0x0/0xc0
[ 0.368565] lr : clk_mux_get_parent+0x4c/0x84
[ 0.368571] sp : ffff800082efba10
[ 0.368572] x29: ffff800082efba10 x28: ffff8000823279c0 x27: ffff800082327000
[ 0.368578] x26: ffff000004c361c0 x25: 0000000000000000 x24: 0000000000000002
[ 0.368584] x23: ffff000003f1d300 x22: ffff000003f1d2a0 x21: ffff000004c37280
[ 0.368589] x20: ffff000004c36ec0 x19: ffff000004bba800 x18: 0000000000000020
[ 0.368594] x17: ffff000000022000 x16: 0000000000000003 x15: ffffffffffffffff
[ 0.368599] x14: ffffffffffffffff x13: 0078756d2364732e x12: 3030306138306566
[ 0.368604] x11: 7f7f7f7f7f7f7f7f x10: ffff7fff83438910 x9 : 0000000000000005
[ 0.368609] x8 : 0101010101010101 x7 : 0000000000000000 x6 : 05114367045e5359
[ 0.368613] x5 : 0000000000000006 x4 : 0000000000000000 x3 : 0000000000000000
[ 0.368618] x2 : 0000000000000000 x1 : 0000000000000000 x0 : ffff000004c36ec0
[ 0.368624] Kernel panic - not syncing: Asynchronous SError Interrupt
[ 0.368626] CPU: 6 PID: 87 Comm: kworker/u32:3 Not tainted 6.8.0-09793-gda876e5b54b3-dirty #15
[ 0.368630] Hardware name: Khadas vim4 (DT)
[ 0.368631] Workqueue: async async_run_entry_fn
[ 0.368635] Call trace:
[ 0.368637] dump_backtrace+0x94/0xec
[ 0.368644] show_stack+0x18/0x24
[ 0.368649] dump_stack_lvl+0x38/0x90
[ 0.368656] dump_stack+0x18/0x24
[ 0.368661] panic+0x388/0x3c8
[ 0.368666] nmi_panic+0x48/0x94
[ 0.368670] arm64_serror_panic+0x6c/0x78
[ 0.368674] do_serror+0x3c/0x78
[ 0.368677] el1h_64_error_handler+0x30/0x48
[ 0.368681] el1h_64_error+0x64/0x68
[ 0.368684] clk_mux_val_to_index+0x0/0xc0
[ 0.368689] __clk_register+0x440/0x82c
[ 0.368693] devm_clk_register+0x5c/0xbc
[ 0.368697] meson_mmc_clk_init+0x11c/0x2a8
[ 0.368702] meson_mmc_probe+0x18c/0x3c0
[ 0.368705] platform_probe+0x68/0xd8
[ 0.368711] really_probe+0x148/0x2b4
[ 0.368714] __driver_probe_device+0x78/0x12c
[ 0.368718] driver_probe_device+0xdc/0x160
[ 0.368721] __device_attach_driver+0xb8/0x134
[ 0.368724] bus_for_each_drv+0x84/0xe0
[ 0.368727] __device_attach_async_helper+0xac/0xd0
[ 0.368730] async_run_entry_fn+0x34/0xe0
[ 0.368734] process_one_work+0x150/0x294
[ 0.368740] worker_thread+0x304/0x408
[ 0.368744] kthread+0x118/0x11c
[ 0.368748] ret_from_fork+0x10/0x20
[ 0.368753] SMP: stopping secondary CPUs
[ 0.368760] Kernel Offset: disabled
[ 0.368761] CPU features: 0x0,00000060,d0080000,0200421b
[ 0.368765] Memory Limit: none
[ 0.400328] ---[ end Kernel panic - not syncing: Asynchronous SError Interrupt ]---


--
2.44.0



2024-03-18 11:44:30

by Lucas Tanure

[permalink] [raw]
Subject: [RFC][PATCH 2/2] arm64: dts: amlogic: t7: SDCard, Ethernet and Clocking

Test Clocking, SDCard and Ethernet for Khadas Vim4.

This is RFC patch that enables SDCard, Ethernet and Clocking
for Amlogic T7 soc.
In this current state the patch doesn't work and gives a kernel
panic when probing the meson-axg-mmc for the SDCard.
DO NOT MERGE.

Signed-off-by: Lucas Tanure <[email protected]>
---
.../amlogic/amlogic-t7-a311d2-khadas-vim4.dts | 66 ++++++
arch/arm64/boot/dts/amlogic/amlogic-t7.dtsi | 189 ++++++++++++++++++
2 files changed, 255 insertions(+)

diff --git a/arch/arm64/boot/dts/amlogic/amlogic-t7-a311d2-khadas-vim4.dts b/arch/arm64/boot/dts/amlogic/amlogic-t7-a311d2-khadas-vim4.dts
index fffdab96b12e..473649223512 100644
--- a/arch/arm64/boot/dts/amlogic/amlogic-t7-a311d2-khadas-vim4.dts
+++ b/arch/arm64/boot/dts/amlogic/amlogic-t7-a311d2-khadas-vim4.dts
@@ -6,6 +6,8 @@
/dts-v1/;

#include "amlogic-t7.dtsi"
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/gpio/amlogic,t7-periphs-pinctrl.h>

/ {
model = "Khadas vim4";
@@ -44,6 +46,27 @@ xtal: xtal-clk {
clock-output-names = "xtal";
#clock-cells = <0>;
};
+
+ sdcard_power: regulator-sdcard {
+ compatible = "regulator-fixed";
+ regulator-name = "SDCARD_POWER";
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ gpio = <&gpio GPIOD_11 GPIO_ACTIVE_LOW>;
+ regulator-boot-on;
+ enable-active-low;
+ regulator-always-on;
+ };
+
+ vddio_card: gpio-regulator {
+ compatible = "regulator-gpio";
+ regulator-name = "VDDIO_CARD";
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <3300000>;
+ gpios = <&gpio GPIOD_9 GPIO_ACTIVE_HIGH>;
+ gpios-states = <1>;
+ states = <1800000 1 3300000 0>;
+ };

};

@@ -52,3 +75,46 @@ &uart_a {
clocks = <&xtal>, <&xtal>, <&xtal>;
clock-names = "xtal", "pclk", "baud";
};
+
+/* SD card */
+&sd_emmc_b {
+ status = "okay";
+ pinctrl-0 = <&sd_all_pins>;
+ pinctrl-1 = <&sd_1bit_pins>;
+ pinctrl-2 = <&sd_clk_gate_pins>;
+ pinctrl-names = "sd_default",
+ "sd_1bit_pins",
+ "clk-gate";
+ bus-width = <4>;
+ cap-sd-highspeed;
+ sd-uhs-sdr12;
+ sd-uhs-sdr25;
+ sd-uhs-sdr50;
+ sd-uhs-sdr104;
+ max-frequency = <200000000>;
+
+ disable-wp;
+
+ cd-gpios = <&gpio GPIOC_6 GPIO_ACTIVE_HIGH>;
+ //dat1-gpios = <&gpio GPIOC_1 GPIO_ACTIVE_HIGH>;
+ vmmc-supply = <&sdcard_power>;
+ vqmmc-supply = <&vddio_card>;
+};
+
+&ext_mdio {
+ external_phy: ethernet-phy@0 {
+ reg = <0>;
+ max-speed = <1000>;
+ };
+};
+
+&ethmac {
+ pinctrl-0 = <&eth_pins>, <&eth_rgmii_pins>;
+ pinctrl-names = "default";
+ status = "okay";
+ phy-mode = "rgmii";
+ phy-handle = <&external_phy>;
+ mc_val = <0x1621>;
+ cali_val = <0xa0000>;
+ amlogic,tx-delay-ns = <2>;
+};
diff --git a/arch/arm64/boot/dts/amlogic/amlogic-t7.dtsi b/arch/arm64/boot/dts/amlogic/amlogic-t7.dtsi
index 5248bdf824ea..376b352697b7 100644
--- a/arch/arm64/boot/dts/amlogic/amlogic-t7.dtsi
+++ b/arch/arm64/boot/dts/amlogic/amlogic-t7.dtsi
@@ -5,6 +5,8 @@

#include <dt-bindings/interrupt-controller/arm-gic.h>
#include <dt-bindings/power/amlogic,t7-pwrc.h>
+#include <dt-bindings/clock/amlogic,t7-pll-clkc.h>
+#include <dt-bindings/clock/amlogic,t7-peripherals-clkc.h>

/ {
interrupt-parent = <&gic>;
@@ -148,6 +150,42 @@ apb4: bus@fe000000 {
#address-cells = <2>;
#size-cells = <2>;
ranges = <0x0 0x0 0x0 0xfe000000 0x0 0x480000>;
+
+ clkc_periphs: clock-controller@0 {
+ compatible = "amlogic,t7-peripherals-clkc";
+ reg = <0x0 0x0 0x0 0x49c>;
+ clocks = <&clkc_pll CLKID_FCLK_DIV2>,
+ <&clkc_pll CLKID_FCLK_DIV2P5>,
+ <&clkc_pll CLKID_FCLK_DIV3>,
+ <&clkc_pll CLKID_FCLK_DIV4>,
+ <&clkc_pll CLKID_FCLK_DIV5>,
+ <&clkc_pll CLKID_FCLK_DIV7>,
+ <&clkc_pll CLKID_HIFI_PLL>,
+ <&clkc_pll CLKID_GP0_PLL>,
+ <&clkc_pll CLKID_GP1_PLL>,
+ <&clkc_pll CLKID_MPLL0>,
+ <&clkc_pll CLKID_MPLL1>,
+ <&clkc_pll CLKID_MPLL2>,
+ <&clkc_pll CLKID_MPLL3>,
+ <&clkc_pll CLKID_MPLL_50M_DIV>,
+ <&clkc_pll CLKID_HDMI_PLL>,
+ <&xtal>;
+ clock-names = "fclk_div2", "fclk_div2p5", "fclk_div3",
+ "fclk_div4", "fclk_div5", "fclk_div7",
+ "hifi_pll", "gp0_pll", "gp1_pll",
+ "mpll0", "mpll1", "mpll2", "mpll3",
+ "mpll_50m_div", "hdmi_pll", "xtal";
+ #clock-cells = <1>;
+ };
+
+ clkc_pll: clock-controller {
+ compatible = "amlogic,t7-pll-clkc";
+ #clock-cells = <1>;
+ reg = <0x0 0x8000 0x0 0x320>;
+ clocks = <&xtal>;
+ clock-names = "xtal";
+ status = "okay";
+ };

watchdog@2100 {
compatible = "amlogic,t7-wdt";
@@ -155,6 +193,41 @@ watchdog@2100 {
clocks = <&xtal>;
};

+ eth_phy: mdio-multiplexer@28000 {
+ compatible = "amlogic,g12a-mdio-mux";
+ reg = <0x0 0x28000 0x0 0xa4>;
+
+ clocks = <&clkc_periphs CLKID_ETHPHY>,
+ <&xtal>,
+ <&clkc_pll CLKID_MPLL_50M>;
+ clock-names = "pclk", "clkin0", "clkin1";
+ mdio-parent-bus = <&mdio0>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ enet_type = <5>;
+ tx_amp_src = <0xFE010330>;
+
+ ext_mdio: mdio@0 {
+ reg = <0>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ };
+
+ int_mdio: mdio@1 {
+ reg = <1>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ internal_ephy: ethernet_phy@8 {
+ compatible = "ethernet-phy-id0180.3301",
+ "ethernet-phy-ieee802.3-c22";
+ interrupts = <GIC_SPI 340 IRQ_TYPE_LEVEL_HIGH>;
+ reg = <8>;
+ max-speed = <100>;
+ };
+ };
+ };
+
periphs_pinctrl: pinctrl@4000 {
compatible = "amlogic,t7-periphs-pinctrl";
#address-cells = <2>;
@@ -187,7 +260,123 @@ uart_a: serial@78000 {
interrupts = <GIC_SPI 168 IRQ_TYPE_EDGE_RISING>;
status = "disabled";
};
+
+ sd_emmc_b: sd@8a000 {
+ compatible = "amlogic,meson-axg-mmc";
+ reg = <0x0 0x8a000 0x0 0x800>;
+ interrupts = <GIC_SPI 177 IRQ_TYPE_EDGE_RISING>;
+ status = "disabled";
+ clocks = <&clkc_periphs CLKID_SD_EMMC_B>,
+ <&clkc_periphs CLKID_SD_EMMC_B_CLK_MUX>,
+ <&clkc_periphs CLKID_SD_EMMC_B_CLK>,
+ <&xtal>,
+ <&clkc_pll CLKID_FCLK_DIV2>;
+ clock-names = "core", "mux0", "mux1", "clkin0", "clkin1";
+ card_type = <5>;
+ use_intf3_tuning;
+ mmc_debug_flag;
+ };
+
+ };
+
+ ethmac: ethernet@fdc00000 {
+ compatible = "amlogic,meson-axg-dwmac", "snps,dwmac-4.00";
+ reg = <0x0 0xfdc00000 0x0 0x10000>,
+ <0x0 0xfe024000 0x0 0x8>;
+ interrupts = <GIC_SPI 74 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-names = "macirq";
+ power-domains = <&pwrc PWRC_T7_ETH_ID>;
+ clocks = <&clkc_periphs CLKID_ETH>,
+ <&clkc_pll CLKID_FCLK_DIV2>,
+ <&clkc_pll CLKID_MPLL2>;
+ clock-names = "stmmaceth", "clkin0", "clkin1";
+ rx-fifo-depth = <4096>;
+ tx-fifo-depth = <2048>;
+
+ internal_phy = <1>;
+ status = "disabled";
+
+ mdio0: mdio {
+ #address-cells = <1>;
+ #size-cells = <0>;
+ compatible = "snps,dwmac-mdio";
+ };
+ };
+ };
+};
+
+&periphs_pinctrl {
+ sd_all_pins:sd_all_pins {
+ mux {
+ groups = "sdcard_d0",
+ "sdcard_d1",
+ "sdcard_d2",
+ "sdcard_d3",
+ "sdcard_cmd";
+ function = "sdcard";
+ bias-pull-up;
+ drive-strength-microamp = <4000>;
+ };
+ mux1 {
+ groups = "sdcard_clk";
+ function = "sdcard";
+ bias-pull-up;
+ drive-strength-microamp = <4000>;
+ };
+ };
+
+ sd_1bit_pins:sd_1bit_pins {
+ mux {
+ groups = "sdcard_d0",
+ "sdcard_cmd";
+ function = "sdcard";
+ bias-pull-up;
+ drive-strength-microamp = <4000>;
+ };
+ mux1 {
+ groups = "sdcard_clk";
+ function = "sdcard";
+ bias-pull-up;
+ drive-strength-microamp = <4000>;
};
+ };
+
+ sd_clk_gate_pins: sd_clk_gate {
+ mux {
+ groups = "GPIOC_4";
+ function = "gpio_periphs";
+ bias-pull-down;
+ drive-strength-microamp = <4000>;
+ };
+ };

+ eth_pins: eth {
+ mux {
+ groups = "eth_mdio",
+ "eth_mdc",
+ "eth_rgmii_rx_clk",
+ "eth_rx_dv",
+ "eth_rxd0",
+ "eth_rxd1",
+ "eth_txen",
+ "eth_txd0",
+ "eth_txd1";
+ function = "eth";
+ drive-strength-microamp = <4000>;
+ bias-disable;
+ };
+ };
+
+ eth_rgmii_pins: eth-rgmii {
+ mux {
+ groups = "eth_rxd2_rgmii",
+ "eth_rxd3_rgmii",
+ "eth_rgmii_tx_clk",
+ "eth_txd2_rgmii",
+ "eth_txd3_rgmii";
+ function = "eth";
+ drive-strength-microamp = <4000>;
+ bias-disable;
+ };
};
};
--
2.44.0


2024-03-18 11:44:55

by Lucas Tanure

[permalink] [raw]
Subject: [RFC][PATCH 1/2] clk: meson: T7: add support for Amlogic T7 SoC PLL clock driver

Add the T7 PLL clock controller driver in the T7 SoC family.

This is RFC patch that enables SDCard, Ethernet and Clocking
for Amlogic T7 soc.
In this current state the patch doesn't work and gives a kernel
panic when probing the meson-axg-mmc for the SDCard.
DO NOT MERGE.

Signed-off-by: Lucas Tanure <[email protected]>
---
drivers/clk/meson/Kconfig | 25 +
drivers/clk/meson/Makefile | 2 +
drivers/clk/meson/t7-peripherals.c | 6368 +++++++++++++++++
drivers/clk/meson/t7-peripherals.h | 131 +
drivers/clk/meson/t7-pll.c | 1543 ++++
drivers/clk/meson/t7-pll.h | 83 +
.../clock/amlogic,t7-peripherals-clkc.h | 410 ++
.../dt-bindings/clock/amlogic,t7-pll-clkc.h | 69 +
8 files changed, 8631 insertions(+)
create mode 100644 drivers/clk/meson/t7-peripherals.c
create mode 100644 drivers/clk/meson/t7-peripherals.h
create mode 100644 drivers/clk/meson/t7-pll.c
create mode 100644 drivers/clk/meson/t7-pll.h
create mode 100644 include/dt-bindings/clock/amlogic,t7-peripherals-clkc.h
create mode 100644 include/dt-bindings/clock/amlogic,t7-pll-clkc.h

diff --git a/drivers/clk/meson/Kconfig b/drivers/clk/meson/Kconfig
index 29ffd14d267b..467b4bf86572 100644
--- a/drivers/clk/meson/Kconfig
+++ b/drivers/clk/meson/Kconfig
@@ -169,4 +169,29 @@ config COMMON_CLK_S4_PERIPHERALS
help
Support for the peripherals clock controller on Amlogic S805X2 and S905Y4
devices, AKA S4. Say Y if you want S4 peripherals clock controller to work.
+
+config COMMON_CLK_T7_PLL
+ tristate "T7 SoC PLL clock controllers support"
+ depends on ARM64
+ default y
+ select COMMON_CLK_MESON_CLKC_UTILS
+ select COMMON_CLK_MESON_MPLL
+ select COMMON_CLK_MESON_PLL
+ select COMMON_CLK_MESON_REGMAP
+ help
+ Support for the PLL clock controller on Amlogic A113D2 device,AKA T7.
+ Say Y if you want the board to work, because PLLs are the parent of
+ most peripherals.
+
+config COMMON_CLK_T7_PERIPHERALS
+ tristate "T7 SoC peripherals clock controllers support"
+ depends on ARM64
+ default y
+ select COMMON_CLK_MESON_CLKC_UTILS
+ select COMMON_CLK_MESON_REGMAP
+ select COMMON_CLK_MESON_DUALDIV
+ select COMMON_CLK_MESON_VID_PLL_DIV
+ help
+ Support for the peripherals clock controller on Amlogic A113D2 device, AKA T7.
+ Say Y if you want T7 peripherals clock controller to work.
endmenu
diff --git a/drivers/clk/meson/Makefile b/drivers/clk/meson/Makefile
index 9ee4b954c896..9a044b70a227 100644
--- a/drivers/clk/meson/Makefile
+++ b/drivers/clk/meson/Makefile
@@ -24,3 +24,5 @@ obj-$(CONFIG_COMMON_CLK_G12A) += g12a.o g12a-aoclk.o
obj-$(CONFIG_COMMON_CLK_MESON8B) += meson8b.o meson8-ddr.o
obj-$(CONFIG_COMMON_CLK_S4_PLL) += s4-pll.o
obj-$(CONFIG_COMMON_CLK_S4_PERIPHERALS) += s4-peripherals.o
+obj-$(CONFIG_COMMON_CLK_T7_PLL) += t7-pll.o
+obj-$(CONFIG_COMMON_CLK_T7_PERIPHERALS) += t7-peripherals.o
diff --git a/drivers/clk/meson/t7-peripherals.c b/drivers/clk/meson/t7-peripherals.c
new file mode 100644
index 000000000000..f88fc2ae4dad
--- /dev/null
+++ b/drivers/clk/meson/t7-peripherals.c
@@ -0,0 +1,6368 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Amlogic Meson-T7 Clock Controller Driver
+ *
+ * Copyright (c) 2018 Amlogic, inc.
+ */
+
+#include <linux/clk-provider.h>
+#include <linux/of_device.h>
+#include <linux/platform_device.h>
+
+#include "clk-regmap.h"
+#include "vid-pll-div.h"
+#include "clk-dualdiv.h"
+#include "t7-peripherals.h"
+#include "meson-clkc-utils.h"
+#include <dt-bindings/clock/amlogic,t7-peripherals-clkc.h>
+
+
+/*
+ *rtc 32k clock
+ *
+ *xtal--GATE------------------GATE---------------------|\
+ * | -------- | \
+ * | | | | \
+ * ---| DUAL |----------------------| |
+ * | | | |____GATE__
+ * -------- | | rtc_32k_out
+ * PAD-----------------------------------------| /
+ * | /
+ * DUAL function: |/
+ * bit 28 in RTC_BY_OSCIN_CTRL0 control the dual function.
+ * when bit 28 = 0
+ * f = 24M/N0
+ * when bit 28 = 1
+ * output N1 and N2 in turns.
+ * T = (x*T1 + y*T2)/x+y
+ * f = (24M/(N0*M0 + N1*M1)) * (M0 + M1)
+ * f: the frequecy value (HZ)
+ * | | | |
+ * | Div1 |-| Cnt1 |
+ * /|______| |______|\
+ * -| ______ ______ ---> Out
+ * \| | | |/
+ * | Div2 |-| Cnt2 |
+ * |______| |______|
+ **/
+
+/*
+ * rtc 32k clock in gate
+ */
+static struct clk_regmap t7_rtc_32k_clkin = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_RTC_BY_OSCIN_CTRL0,
+ .bit_idx = 31,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "rtc_32k_clkin",
+ .ops = &clk_regmap_gate_ops,
+ .parent_data = &(const struct clk_parent_data) {
+ .fw_name = "xtal",
+ },
+ .num_parents = 1,
+ },
+};
+
+static const struct meson_clk_dualdiv_param t7_32k_div_table[] = {
+ {
+ .dual = 1,
+ .n1 = 733,
+ .m1 = 8,
+ .n2 = 732,
+ .m2 = 11,
+ },
+ {}
+};
+
+static struct clk_regmap t7_rtc_32k_div = {
+ .data = &(struct meson_clk_dualdiv_data){
+ .n1 = {
+ .reg_off = CLKCTRL_RTC_BY_OSCIN_CTRL0,
+ .shift = 0,
+ .width = 12,
+ },
+ .n2 = {
+ .reg_off = CLKCTRL_RTC_BY_OSCIN_CTRL0,
+ .shift = 12,
+ .width = 12,
+ },
+ .m1 = {
+ .reg_off = CLKCTRL_RTC_BY_OSCIN_CTRL1,
+ .shift = 0,
+ .width = 12,
+ },
+ .m2 = {
+ .reg_off = CLKCTRL_RTC_BY_OSCIN_CTRL1,
+ .shift = 12,
+ .width = 12,
+ },
+ .dual = {
+ .reg_off = CLKCTRL_RTC_BY_OSCIN_CTRL0,
+ .shift = 28,
+ .width = 1,
+ },
+ .table = t7_32k_div_table,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "rtc_32k_div",
+ .ops = &meson_clk_dualdiv_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_rtc_32k_clkin.hw
+ },
+ .num_parents = 1,
+ },
+};
+
+static struct clk_regmap t7_rtc_32k_xtal = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_RTC_BY_OSCIN_CTRL1,
+ .bit_idx = 24,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "rtc_32k_xtal",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_rtc_32k_clkin.hw
+ },
+ .num_parents = 1,
+ },
+};
+
+/*
+ * three parent for rtc clock out
+ * pad is from where?
+ */
+static u32 rtc_32k_sel[] = {0, 1};
+static struct clk_regmap t7_rtc_32k_sel = {
+ .data = &(struct clk_regmap_mux_data) {
+ .offset = CLKCTRL_RTC_CTRL,
+ .mask = 0x3,
+ .shift = 0,
+ .table = rtc_32k_sel,
+ .flags = CLK_MUX_ROUND_CLOSEST,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "rtc_32k_sel",
+ .ops = &clk_regmap_mux_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_rtc_32k_xtal.hw,
+ &t7_rtc_32k_div.hw
+ },
+ .num_parents = 2,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_rtc_clk = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_RTC_BY_OSCIN_CTRL0,
+ .bit_idx = 30,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "rtc_clk",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_rtc_32k_sel.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+/* sys clk */
+static u32 mux_table_sys_ab_clk_sel[] = { 0, 1, 2, 3, 4, 5, 7 };
+static const struct clk_parent_data t7_table_sys_ab_clk_sel[] = {
+ { .fw_name = "xtal", },
+ { .fw_name = "fclk_div2", },
+ { .fw_name = "fclk_div3", },
+ { .fw_name = "fclk_div4", },
+ { .fw_name = "fclk_div5", },
+ { .fw_name = "axi_clk_frcpu", },
+ { .hw = &t7_rtc_clk.hw }
+};
+
+static struct clk_regmap t7_sysclk_b_sel = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_SYS_CLK_CTRL0,
+ .mask = 0x7,
+ .shift = 26,
+ .table = mux_table_sys_ab_clk_sel,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "sysclk_b_sel",
+ .ops = &clk_regmap_mux_ro_ops,
+ .parent_data = t7_table_sys_ab_clk_sel,
+ .num_parents = ARRAY_SIZE(t7_table_sys_ab_clk_sel),
+ },
+};
+
+static struct clk_regmap t7_sysclk_b_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_SYS_CLK_CTRL0,
+ .shift = 16,
+ .width = 10,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "sysclk_b_div",
+ .ops = &clk_regmap_divider_ro_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_sysclk_b_sel.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_sysclk_b = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_SYS_CLK_CTRL0,
+ .bit_idx = 29,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "sysclk_b",
+ .ops = &clk_regmap_gate_ro_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_sysclk_b_div.hw
+ },
+ .num_parents = 1,
+ },
+};
+
+static struct clk_regmap t7_sysclk_a_sel = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_SYS_CLK_CTRL0,
+ .mask = 0x7,
+ .shift = 10,
+ .table = mux_table_sys_ab_clk_sel,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "sysclk_a_sel",
+ .ops = &clk_regmap_mux_ro_ops,
+ .parent_data = t7_table_sys_ab_clk_sel,
+ .num_parents = ARRAY_SIZE(t7_table_sys_ab_clk_sel),
+ },
+};
+
+static struct clk_regmap t7_sysclk_a_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_SYS_CLK_CTRL0,
+ .shift = 0,
+ .width = 10,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "sysclk_a_div",
+ .ops = &clk_regmap_divider_ro_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_sysclk_a_sel.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_sysclk_a = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_SYS_CLK_CTRL0,
+ .bit_idx = 13,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "sysclk_a",
+ .ops = &clk_regmap_gate_ro_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_sysclk_a_div.hw
+ },
+ .num_parents = 1,
+ },
+};
+
+static struct clk_regmap t7_sys_clk = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_SYS_CLK_CTRL0,
+ .mask = 0x1,
+ .shift = 15,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "sys_clk",
+ .ops = &clk_regmap_mux_ro_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_sysclk_a.hw,
+ &t7_sysclk_b.hw,
+ },
+ .num_parents = 2,
+ },
+};
+
+/*axi clk*/
+
+/*ceca_clk*/
+static struct clk_regmap t7_ceca_32k_clkin = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_CECA_CTRL0,
+ .bit_idx = 31,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "ceca_32k_clkin",
+ .ops = &clk_regmap_gate_ops,
+ .parent_data = &(const struct clk_parent_data) {
+ .fw_name = "xtal",
+ },
+ .num_parents = 1,
+ },
+};
+
+static struct clk_regmap t7_ceca_32k_div = {
+ .data = &(struct meson_clk_dualdiv_data){
+ .n1 = {
+ .reg_off = CLKCTRL_CECA_CTRL0,
+ .shift = 0,
+ .width = 12,
+ },
+ .n2 = {
+ .reg_off = CLKCTRL_CECA_CTRL0,
+ .shift = 12,
+ .width = 12,
+ },
+ .m1 = {
+ .reg_off = CLKCTRL_CECA_CTRL1,
+ .shift = 0,
+ .width = 12,
+ },
+ .m2 = {
+ .reg_off = CLKCTRL_CECA_CTRL1,
+ .shift = 12,
+ .width = 12,
+ },
+ .dual = {
+ .reg_off = CLKCTRL_CECA_CTRL0,
+ .shift = 28,
+ .width = 1,
+ },
+ .table = t7_32k_div_table,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "ceca_32k_div",
+ .ops = &meson_clk_dualdiv_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_ceca_32k_clkin.hw
+ },
+ .num_parents = 1,
+ },
+};
+
+static struct clk_regmap t7_ceca_32k_sel_pre = {
+ .data = &(struct clk_regmap_mux_data) {
+ .offset = CLKCTRL_CECA_CTRL1,
+ .mask = 0x1,
+ .shift = 24,
+ .flags = CLK_MUX_ROUND_CLOSEST,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "ceca_32k_sel_pre",
+ .ops = &clk_regmap_mux_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_ceca_32k_div.hw,
+ &t7_ceca_32k_clkin.hw
+ },
+ .num_parents = 2,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_ceca_32k_sel = {
+ .data = &(struct clk_regmap_mux_data) {
+ .offset = CLKCTRL_CECA_CTRL1,
+ .mask = 0x1,
+ .shift = 31,
+ .flags = CLK_MUX_ROUND_CLOSEST,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "ceca_32k_sel",
+ .ops = &clk_regmap_mux_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_ceca_32k_sel_pre.hw,
+ &t7_rtc_clk.hw
+ },
+ .num_parents = 2,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_ceca_32k_clkout = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_CECA_CTRL0,
+ .bit_idx = 30,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "ceca_32k_clkout",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_ceca_32k_sel.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+/*cecb_clk*/
+static struct clk_regmap t7_cecb_32k_clkin = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_CECB_CTRL0,
+ .bit_idx = 31,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "cecb_32k_clkin",
+ .ops = &clk_regmap_gate_ops,
+ .parent_data = &(const struct clk_parent_data) {
+ .fw_name = "xtal",
+ },
+ .num_parents = 1,
+ },
+};
+
+static struct clk_regmap t7_cecb_32k_div = {
+ .data = &(struct meson_clk_dualdiv_data){
+ .n1 = {
+ .reg_off = CLKCTRL_CECB_CTRL0,
+ .shift = 0,
+ .width = 12,
+ },
+ .n2 = {
+ .reg_off = CLKCTRL_CECB_CTRL0,
+ .shift = 12,
+ .width = 12,
+ },
+ .m1 = {
+ .reg_off = CLKCTRL_CECB_CTRL1,
+ .shift = 0,
+ .width = 12,
+ },
+ .m2 = {
+ .reg_off = CLKCTRL_CECB_CTRL1,
+ .shift = 12,
+ .width = 12,
+ },
+ .dual = {
+ .reg_off = CLKCTRL_CECB_CTRL0,
+ .shift = 28,
+ .width = 1,
+ },
+ .table = t7_32k_div_table,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "cecb_32k_div",
+ .ops = &meson_clk_dualdiv_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_cecb_32k_clkin.hw
+ },
+ .num_parents = 1,
+ },
+};
+
+static struct clk_regmap t7_cecb_32k_sel_pre = {
+ .data = &(struct clk_regmap_mux_data) {
+ .offset = CLKCTRL_CECB_CTRL1,
+ .mask = 0x1,
+ .shift = 24,
+ .flags = CLK_MUX_ROUND_CLOSEST,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "cecb_32k_sel_pre",
+ .ops = &clk_regmap_mux_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_cecb_32k_div.hw,
+ &t7_cecb_32k_clkin.hw
+ },
+ .num_parents = 2,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_cecb_32k_sel = {
+ .data = &(struct clk_regmap_mux_data) {
+ .offset = CLKCTRL_CECB_CTRL1,
+ .mask = 0x1,
+ .shift = 31,
+ .flags = CLK_MUX_ROUND_CLOSEST,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "cecb_32k_sel",
+ .ops = &clk_regmap_mux_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_cecb_32k_sel_pre.hw,
+ &t7_rtc_clk.hw
+ },
+ .num_parents = 2,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_cecb_32k_clkout = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_CECB_CTRL0,
+ .bit_idx = 30,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "cecb_32k_clkout",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_cecb_32k_sel.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static const struct clk_parent_data t7_sc_parent_data[] = {
+ { .fw_name = "fclk_div4", },
+ { .fw_name = "fclk_div3", },
+ { .fw_name = "fclk_div5", },
+ { .fw_name = "xtal", }
+};
+
+static struct clk_regmap t7_sc_clk_mux = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_SC_CLK_CTRL,
+ .mask = 0x3,
+ .shift = 9,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "sc_clk_mux",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_sc_parent_data,
+ .num_parents = ARRAY_SIZE(t7_sc_parent_data),
+ .flags = CLK_GET_RATE_NOCACHE,
+ },
+};
+
+static struct clk_regmap t7_sc_clk_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_SC_CLK_CTRL,
+ .shift = 0,
+ .width = 8,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "sc_clk_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_sc_clk_mux.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_sc_clk_gate = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_SC_CLK_CTRL,
+ .bit_idx = 8,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "sc_clk_gate",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_sc_clk_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
+ },
+};
+
+/*rama_clk*/
+
+/*dspa_clk*/
+static const struct clk_parent_data t7_dsp_parent_hws[] = {
+ { .fw_name = "xtal", },
+ { .fw_name = "fclk_div2p5", },
+ { .fw_name = "fclk_div3", },
+ { .fw_name = "fclk_div5", },
+ { .fw_name = "hifi_pll", },
+ { .fw_name = "fclk_div4", },
+ { .fw_name = "fclk_div7", },
+ { .hw = &t7_rtc_clk.hw }
+};
+
+static struct clk_regmap t7_dspa_a_mux = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_DSPA_CLK_CTRL0,
+ .mask = 0x7,
+ .shift = 10,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "dspa_a_mux",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_dsp_parent_hws,
+ .num_parents = ARRAY_SIZE(t7_dsp_parent_hws),
+ },
+};
+
+static struct clk_regmap t7_dspa_a_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_DSPA_CLK_CTRL0,
+ .shift = 0,
+ .width = 10,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "dspa_a_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_dspa_a_mux.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_dspa_a_gate = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_DSPA_CLK_CTRL0,
+ .bit_idx = 13,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "dspa_a_gate",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_dspa_a_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_dspa_b_mux = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_DSPA_CLK_CTRL0,
+ .mask = 0x7,
+ .shift = 26,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "dspa_b_mux",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_dsp_parent_hws,
+ .num_parents = ARRAY_SIZE(t7_dsp_parent_hws),
+ },
+};
+
+static struct clk_regmap t7_dspa_b_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_DSPA_CLK_CTRL0,
+ .shift = 16,
+ .width = 10,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "dspa_b_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_dspa_b_mux.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_dspa_b_gate = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_DSPA_CLK_CTRL0,
+ .bit_idx = 29,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "dspa_b_gate",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_dspa_b_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_dspa_mux = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_DSPA_CLK_CTRL0,
+ .mask = 0x1,
+ .shift = 15,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "dspa_mux",
+ .ops = &clk_regmap_mux_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_dspa_a_gate.hw,
+ &t7_dspa_b_gate.hw,
+ },
+ .num_parents = 2,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_dspb_a_mux = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_DSPB_CLK_CTRL0,
+ .mask = 0x7,
+ .shift = 10,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "dspb_a_mux",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_dsp_parent_hws,
+ .num_parents = ARRAY_SIZE(t7_dsp_parent_hws),
+ },
+};
+
+static struct clk_regmap t7_dspb_a_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_DSPB_CLK_CTRL0,
+ .shift = 0,
+ .width = 10,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "dspb_a_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_dspb_a_mux.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_dspb_a_gate = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_DSPB_CLK_CTRL0,
+ .bit_idx = 13,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "dspb_a_gate",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_dspb_a_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_dspb_b_mux = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_DSPB_CLK_CTRL0,
+ .mask = 0x7,
+ .shift = 26,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "dspb_b_mux",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_dsp_parent_hws,
+ .num_parents = ARRAY_SIZE(t7_dsp_parent_hws),
+ },
+};
+
+static struct clk_regmap t7_dspb_b_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_DSPB_CLK_CTRL0,
+ .shift = 16,
+ .width = 10,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "dspb_b_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_dspb_b_mux.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_dspb_b_gate = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_DSPB_CLK_CTRL0,
+ .bit_idx = 29,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "dspb_b_gate",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_dspb_b_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_dspb_mux = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_DSPB_CLK_CTRL0,
+ .mask = 0x1,
+ .shift = 15,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "dspb_mux",
+ .ops = &clk_regmap_mux_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_dspb_a_gate.hw,
+ &t7_dspb_b_gate.hw,
+ },
+ .num_parents = 2,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+/*12_24M clk*/
+static struct clk_regmap t7_24M_clk_gate = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_CLK12_24_CTRL,
+ .bit_idx = 11,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "24m",
+ .ops = &clk_regmap_gate_ops,
+ .parent_data = &(const struct clk_parent_data) {
+ .fw_name = "xtal",
+ },
+ .num_parents = 1,
+ },
+};
+
+static struct clk_fixed_factor t7_12M_clk_div = {
+ .mult = 1,
+ .div = 2,
+ .hw.init = &(struct clk_init_data){
+ .name = "24m_div2",
+ .ops = &clk_fixed_factor_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_24M_clk_gate.hw
+ },
+ .num_parents = 1,
+ },
+};
+
+static struct clk_regmap t7_12M_clk_gate = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_CLK12_24_CTRL,
+ .bit_idx = 10,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "12m",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_12M_clk_div.hw
+ },
+ .num_parents = 1,
+ },
+};
+
+static struct clk_regmap t7_25M_clk_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_CLK12_24_CTRL,
+ .shift = 0,
+ .width = 8,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "25M_clk_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_data = &(const struct clk_parent_data) {
+ .fw_name = "fclk_div2",
+ },
+ .num_parents = 1,
+ },
+};
+
+static struct clk_regmap t7_25M_clk_gate = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_CLK12_24_CTRL,
+ .bit_idx = 12,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "25m",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_25M_clk_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+/* Video Clocks */
+static struct clk_regmap t7_vid_pll_div = {
+ .data = &(struct meson_vid_pll_div_data){
+ .val = {
+ .reg_off = CLKCTRL_VID_PLL_CLK0_DIV,
+ .shift = 0,
+ .width = 15,
+ },
+ .sel = {
+ .reg_off = CLKCTRL_VID_PLL_CLK0_DIV,
+ .shift = 16,
+ .width = 2,
+ },
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "vid_pll_div",
+ .ops = &meson_vid_pll_div_ro_ops,
+ .parent_data = &(const struct clk_parent_data) {
+ .fw_name = "hdmi_pll",
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
+ },
+};
+
+static const struct clk_parent_data t7_vid_pll_parent_data[] = {
+ { .hw = &t7_vid_pll_div.hw, },
+ { .fw_name = "hdmi_pll", },
+};
+
+static struct clk_regmap t7_vid_pll_sel = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_VID_PLL_CLK0_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_data = t7_vid_pll_parent_data,
+ .num_parents = ARRAY_SIZE(t7_vid_pll_parent_data),
+ .flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
+ },
+};
+
+static struct clk_regmap t7_vid_pll = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_VID_PLL_CLK0_DIV,
+ .bit_idx = 19,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "vid_pll",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_vid_pll_sel.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+static const struct clk_parent_data t7_vclk_parent_data[] = {
+ { .hw = &t7_vid_pll.hw },
+ { .fw_name = "gp0_pll", },
+ { .fw_name = "hifi_pll", },
+ { .fw_name = "mpll1", },
+ { .fw_name = "fclk_div3", },
+ { .fw_name = "fclk_div4", },
+ { .fw_name = "fclk_div5", },
+ { .fw_name = "fclk_div7" },
+};
+
+static struct clk_regmap t7_vclk_sel = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_VID_CLK0_CTRL,
+ .mask = 0x7,
+ .shift = 16,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "vclk_sel",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_vclk_parent_data,
+ .num_parents = ARRAY_SIZE(t7_vclk_parent_data),
+ .flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
+ },
+};
+
+static struct clk_regmap t7_vclk2_sel = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_VIID_CLK0_CTRL,
+ .mask = 0x7,
+ .shift = 16,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "vclk2_sel",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_vclk_parent_data,
+ .num_parents = ARRAY_SIZE(t7_vclk_parent_data),
+ .flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
+ },
+};
+
+static struct clk_regmap t7_vclk_input = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_VID_CLK0_DIV,
+ .bit_idx = 16,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "vclk_input",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) { &t7_vclk_sel.hw },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+static struct clk_regmap t7_vclk2_input = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_VIID_CLK0_DIV,
+ .bit_idx = 16,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "vclk2_input",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) { &t7_vclk2_sel.hw },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+static struct clk_regmap t7_vclk_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_VID_CLK0_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 *[]) {
+ &t7_vclk_input.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_GET_RATE_NOCACHE,
+ },
+};
+
+static struct clk_regmap t7_vclk2_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_VIID_CLK0_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 *[]) {
+ &t7_vclk2_input.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_GET_RATE_NOCACHE,
+ },
+};
+
+static struct clk_regmap t7_vclk = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_VID_CLK0_CTRL,
+ .bit_idx = 19,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "vclk",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) { &t7_vclk_div.hw },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+static struct clk_regmap t7_vclk2 = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_VIID_CLK0_CTRL,
+ .bit_idx = 19,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "vclk2",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) { &t7_vclk2_div.hw },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+static struct clk_regmap t7_vclk_div1 = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_VID_CLK0_CTRL,
+ .bit_idx = 0,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "vclk_div1",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) { &t7_vclk.hw },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+static struct clk_regmap t7_vclk_div2_en = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_VID_CLK0_CTRL,
+ .bit_idx = 1,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "vclk_div2_en",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) { &t7_vclk.hw },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+static struct clk_regmap t7_vclk_div4_en = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_VID_CLK0_CTRL,
+ .bit_idx = 2,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "vclk_div4_en",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) { &t7_vclk.hw },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+static struct clk_regmap t7_vclk_div6_en = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_VID_CLK0_CTRL,
+ .bit_idx = 3,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "vclk_div6_en",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) { &t7_vclk.hw },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+static struct clk_regmap t7_vclk_div12_en = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_VID_CLK0_CTRL,
+ .bit_idx = 4,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "vclk_div12_en",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) { &t7_vclk.hw },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+static struct clk_regmap t7_vclk2_div1 = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_VIID_CLK0_CTRL,
+ .bit_idx = 0,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "vclk2_div1",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) { &t7_vclk2.hw },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+static struct clk_regmap t7_vclk2_div2_en = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_VIID_CLK0_CTRL,
+ .bit_idx = 1,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "vclk2_div2_en",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) { &t7_vclk2.hw },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+static struct clk_regmap t7_vclk2_div4_en = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_VIID_CLK0_CTRL,
+ .bit_idx = 2,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "vclk2_div4_en",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) { &t7_vclk2.hw },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+static struct clk_regmap t7_vclk2_div6_en = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_VIID_CLK0_CTRL,
+ .bit_idx = 3,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "vclk2_div6_en",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) { &t7_vclk2.hw },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+static struct clk_regmap t7_vclk2_div12_en = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_VIID_CLK0_CTRL,
+ .bit_idx = 4,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "vclk2_div12_en",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) { &t7_vclk2.hw },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+static struct clk_fixed_factor t7_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 *[]) {
+ &t7_vclk_div2_en.hw
+ },
+ .num_parents = 1,
+ },
+};
+
+static struct clk_fixed_factor t7_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 *[]) {
+ &t7_vclk_div4_en.hw
+ },
+ .num_parents = 1,
+ },
+};
+
+static struct clk_fixed_factor t7_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 *[]) {
+ &t7_vclk_div6_en.hw
+ },
+ .num_parents = 1,
+ },
+};
+
+static struct clk_fixed_factor t7_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 *[]) {
+ &t7_vclk_div12_en.hw
+ },
+ .num_parents = 1,
+ },
+};
+
+static struct clk_fixed_factor t7_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 *[]) {
+ &t7_vclk2_div2_en.hw
+ },
+ .num_parents = 1,
+ },
+};
+
+static struct clk_fixed_factor t7_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 *[]) {
+ &t7_vclk2_div4_en.hw
+ },
+ .num_parents = 1,
+ },
+};
+
+static struct clk_fixed_factor t7_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 *[]) {
+ &t7_vclk2_div6_en.hw
+ },
+ .num_parents = 1,
+ },
+};
+
+static struct clk_fixed_factor t7_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 *[]) {
+ &t7_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 *t7_cts_parent_hws[] = {
+ &t7_vclk_div1.hw,
+ &t7_vclk_div2.hw,
+ &t7_vclk_div4.hw,
+ &t7_vclk_div6.hw,
+ &t7_vclk_div12.hw,
+ &t7_vclk2_div1.hw,
+ &t7_vclk2_div2.hw,
+ &t7_vclk2_div4.hw,
+ &t7_vclk2_div6.hw,
+ &t7_vclk2_div12.hw
+};
+
+static struct clk_regmap t7_cts_enci_sel = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_VID_CLK0_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 = t7_cts_parent_hws,
+ .num_parents = ARRAY_SIZE(t7_cts_parent_hws),
+ .flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
+ },
+};
+
+static struct clk_regmap t7_cts_encp_sel = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_VID_CLK1_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 = t7_cts_parent_hws,
+ .num_parents = ARRAY_SIZE(t7_cts_parent_hws),
+ .flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
+ },
+};
+
+static struct clk_regmap t7_cts_vdac_sel = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_VIID_CLK1_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 = t7_cts_parent_hws,
+ .num_parents = ARRAY_SIZE(t7_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 *t7_cts_hdmi_tx_parent_hws[] = {
+ &t7_vclk_div1.hw,
+ &t7_vclk_div2.hw,
+ &t7_vclk_div4.hw,
+ &t7_vclk_div6.hw,
+ &t7_vclk_div12.hw,
+ &t7_vclk2_div1.hw,
+ &t7_vclk2_div2.hw,
+ &t7_vclk2_div4.hw,
+ &t7_vclk2_div6.hw,
+ &t7_vclk2_div12.hw
+};
+
+static struct clk_regmap t7_hdmi_tx_sel = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_HDMI_CLK_CTRL,
+ .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 = t7_cts_hdmi_tx_parent_hws,
+ .num_parents = ARRAY_SIZE(t7_cts_hdmi_tx_parent_hws),
+ .flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
+ },
+};
+
+static struct clk_regmap t7_cts_enci = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_VID_CLK2_CTRL2,
+ .bit_idx = 0,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "cts_enci",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_cts_enci_sel.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+static struct clk_regmap t7_cts_encp = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_VID_CLK2_CTRL2,
+ .bit_idx = 2,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "cts_encp",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_cts_encp_sel.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+static struct clk_regmap t7_cts_vdac = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_VID_CLK2_CTRL2,
+ .bit_idx = 4,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "cts_vdac",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_cts_vdac_sel.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+static struct clk_regmap t7_hdmi_tx = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_VID_CLK2_CTRL2,
+ .bit_idx = 5,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "hdmi_tx",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_hdmi_tx_sel.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+static const struct clk_parent_data t7_hdmitx_sys_parent_data[] = {
+ { .fw_name = "xtal", },
+ { .fw_name = "fclk_div4", },
+ { .fw_name = "fclk_div3", },
+ { .fw_name = "fclk_div5", }
+};
+
+static struct clk_regmap t7_hdmitx_sys_sel = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_HDMI_CLK_CTRL,
+ .mask = 0x3,
+ .shift = 9,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "hdmitx_sys_sel",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_hdmitx_sys_parent_data,
+ .num_parents = ARRAY_SIZE(t7_hdmitx_sys_parent_data),
+ },
+};
+
+static struct clk_regmap t7_hdmitx_sys_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_HDMI_CLK_CTRL,
+ .shift = 0,
+ .width = 7,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "hdmitx_sys_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) { &t7_hdmitx_sys_sel.hw },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT
+ },
+};
+
+static struct clk_regmap t7_hdmitx_sys = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_HDMI_CLK_CTRL,
+ .bit_idx = 8,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "hdmitx_sys",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) { &t7_hdmitx_sys.hw },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT
+ },
+};
+
+static struct clk_regmap t7_hdmitx_prif_sel = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_HTX_CLK_CTRL0,
+ .mask = 0x3,
+ .shift = 9,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "hdmitx_prif_sel",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_hdmitx_sys_parent_data,
+ .num_parents = ARRAY_SIZE(t7_hdmitx_sys_parent_data),
+ },
+};
+
+static struct clk_regmap t7_hdmitx_prif_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_HTX_CLK_CTRL0,
+ .shift = 0,
+ .width = 7,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "hdmitx_prif_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) { &t7_hdmitx_prif_sel.hw },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT
+ },
+};
+
+static struct clk_regmap t7_hdmitx_prif = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_HTX_CLK_CTRL0,
+ .bit_idx = 8,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "hdmitx_prif",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) { &t7_hdmitx_prif.hw },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT
+ },
+};
+
+static struct clk_regmap t7_hdmitx_200m_sel = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_HTX_CLK_CTRL0,
+ .mask = 0x3,
+ .shift = 25,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "hdmitx_200m_sel",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_hdmitx_sys_parent_data,
+ .num_parents = ARRAY_SIZE(t7_hdmitx_sys_parent_data),
+ },
+};
+
+static struct clk_regmap t7_hdmitx_200m_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_HTX_CLK_CTRL0,
+ .shift = 16,
+ .width = 7,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "hdmitx_200m_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) { &t7_hdmitx_200m_sel.hw },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT
+ },
+};
+
+static struct clk_regmap t7_hdmitx_200m = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_HTX_CLK_CTRL0,
+ .bit_idx = 24,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "hdmitx_200m",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) { &t7_hdmitx_200m.hw },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT
+ },
+};
+
+static struct clk_regmap t7_hdmitx_aud_sel = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_HTX_CLK_CTRL1,
+ .mask = 0x3,
+ .shift = 9,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "hdmitx_aud_sel",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_hdmitx_sys_parent_data,
+ .num_parents = ARRAY_SIZE(t7_hdmitx_sys_parent_data),
+ },
+};
+
+static struct clk_regmap t7_hdmitx_aud_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_HTX_CLK_CTRL1,
+ .shift = 0,
+ .width = 7,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "hdmitx_aud_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) { &t7_hdmitx_aud_sel.hw },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT
+ },
+};
+
+static struct clk_regmap t7_hdmitx_aud = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_HTX_CLK_CTRL1,
+ .bit_idx = 8,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "hdmitx_aud",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) { &t7_hdmitx_aud_sel.hw },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT
+ },
+};
+
+static struct clk_regmap t7_hdmirx_5m_sel = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_HRX_CLK_CTRL0,
+ .mask = 0x3,
+ .shift = 9,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "hdmirx_5m_sel",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_hdmitx_sys_parent_data,
+ .num_parents = ARRAY_SIZE(t7_hdmitx_sys_parent_data),
+ },
+};
+
+static struct clk_regmap t7_hdmirx_5m_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_HRX_CLK_CTRL0,
+ .shift = 0,
+ .width = 7,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "hdmirx_5m_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) { &t7_hdmirx_5m_sel.hw },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT
+ },
+};
+
+static struct clk_regmap t7_hdmirx_5m = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_HRX_CLK_CTRL0,
+ .bit_idx = 8,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "hdmirx_5m",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) { &t7_hdmirx_5m_div.hw },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT
+ },
+};
+
+static struct clk_regmap t7_hdmirx_2m_sel = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_HRX_CLK_CTRL0,
+ .mask = 0x3,
+ .shift = 25,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "hdmirx_2m_sel",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_hdmitx_sys_parent_data,
+ .num_parents = ARRAY_SIZE(t7_hdmitx_sys_parent_data),
+ },
+};
+
+static struct clk_regmap t7_hdmirx_2m_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_HRX_CLK_CTRL0,
+ .shift = 16,
+ .width = 7,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "hdmirx_2m_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) { &t7_hdmirx_2m_sel.hw },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT
+ },
+};
+
+static struct clk_regmap t7_hdmirx_2m = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_HRX_CLK_CTRL0,
+ .bit_idx = 24,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "hdmirx_2m",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) { &t7_hdmirx_2m_div.hw },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT
+ },
+};
+
+static struct clk_regmap t7_hdmirx_cfg_sel = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_HRX_CLK_CTRL1,
+ .mask = 0x3,
+ .shift = 9,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "hdmirx_cfg_sel",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_hdmitx_sys_parent_data,
+ .num_parents = ARRAY_SIZE(t7_hdmitx_sys_parent_data),
+ },
+};
+
+static struct clk_regmap t7_hdmirx_cfg_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_HRX_CLK_CTRL1,
+ .shift = 0,
+ .width = 7,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "hdmirx_cfg_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) { &t7_hdmirx_cfg_sel.hw },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT
+ },
+};
+
+static struct clk_regmap t7_hdmirx_cfg = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_HRX_CLK_CTRL1,
+ .bit_idx = 8,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "hdmirx_cfg",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) { &t7_hdmirx_cfg_div.hw },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT
+ },
+};
+
+static struct clk_regmap t7_hdmirx_hdcp_sel = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_HRX_CLK_CTRL1,
+ .mask = 0x3,
+ .shift = 25,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "hdmirx_hdcp_sel",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_hdmitx_sys_parent_data,
+ .num_parents = ARRAY_SIZE(t7_hdmitx_sys_parent_data),
+ },
+};
+
+static struct clk_regmap t7_hdmirx_hdcp_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_HRX_CLK_CTRL1,
+ .shift = 16,
+ .width = 7,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "hdmirx_hdcp_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) { &t7_hdmirx_hdcp_sel.hw },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT
+ },
+};
+
+static struct clk_regmap t7_hdmirx_hdcp = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_HRX_CLK_CTRL1,
+ .bit_idx = 24,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "hdmirx_hdcp",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) { &t7_hdmirx_hdcp_div.hw },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT
+ },
+};
+
+static struct clk_regmap t7_hdmirx_aud_pll_sel = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_HRX_CLK_CTRL2,
+ .mask = 0x3,
+ .shift = 9,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "hdmirx_aud_pll_sel",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_hdmitx_sys_parent_data,
+ .num_parents = ARRAY_SIZE(t7_hdmitx_sys_parent_data),
+ },
+};
+
+static struct clk_regmap t7_hdmirx_aud_pll_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_HRX_CLK_CTRL2,
+ .shift = 0,
+ .width = 7,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "hdmirx_aud_pll_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) { &t7_hdmirx_aud_pll_sel.hw },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT
+ },
+};
+
+static struct clk_regmap t7_hdmirx_aud_pll = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_HRX_CLK_CTRL2,
+ .bit_idx = 8,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "hdmirx_aud_pll",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) { &t7_hdmirx_aud_pll_div.hw },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT
+ },
+};
+
+static struct clk_regmap t7_hdmirx_acr_sel = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_HRX_CLK_CTRL2,
+ .mask = 0x3,
+ .shift = 25,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "hdmirx_acr_sel",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_hdmitx_sys_parent_data,
+ .num_parents = ARRAY_SIZE(t7_hdmitx_sys_parent_data),
+ },
+};
+
+static struct clk_regmap t7_hdmirx_acr_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_HRX_CLK_CTRL2,
+ .shift = 16,
+ .width = 7,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "hdmirx_acr_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) { &t7_hdmirx_acr_sel.hw },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT
+ },
+};
+
+static struct clk_regmap t7_hdmirx_acr = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_HRX_CLK_CTRL2,
+ .bit_idx = 24,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "hdmirx_acr",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) { &t7_hdmirx_acr_div.hw },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT
+ },
+};
+
+static struct clk_regmap t7_hdmirx_meter_sel = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_HRX_CLK_CTRL3,
+ .mask = 0x3,
+ .shift = 9,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "hdmirx_meter_sel",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_hdmitx_sys_parent_data,
+ .num_parents = ARRAY_SIZE(t7_hdmitx_sys_parent_data),
+ },
+};
+
+static struct clk_regmap t7_hdmirx_meter_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_HRX_CLK_CTRL3,
+ .shift = 0,
+ .width = 7,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "hdmirx_meter_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) { &t7_hdmirx_meter_sel.hw },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT
+ },
+};
+
+static struct clk_regmap t7_hdmirx_meter = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_HRX_CLK_CTRL3,
+ .bit_idx = 8,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "hdmirx_meter",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) { &t7_hdmirx_meter_div.hw },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT
+ },
+};
+
+static struct clk_regmap t7_vid_lock_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_VID_LOCK_CLK_CTRL,
+ .shift = 0,
+ .width = 7,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "vid_lock_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_data = &(const struct clk_parent_data) {
+ .fw_name = "xtal",
+ },
+ .num_parents = 1,
+ },
+};
+
+static struct clk_regmap t7_vid_lock_clk = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_VID_LOCK_CLK_CTRL,
+ .bit_idx = 7,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "vid_lock_clk",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) { &t7_vid_lock_div.hw },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT
+ },
+};
+
+static struct clk_regmap t7_ts_clk_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_TS_CLK_CTRL,
+ .shift = 0,
+ .width = 8,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "ts_clk_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_data = &(const struct clk_parent_data) {
+ .fw_name = "xtal",
+ },
+ .num_parents = 1,
+ },
+};
+
+static struct clk_regmap t7_ts_clk_gate = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_TS_CLK_CTRL,
+ .bit_idx = 8,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "ts_clk_gate",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_ts_clk_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT
+ },
+};
+
+/*mali_clk*/
+/*
+ * The MALI IP is clocked by two identical clocks (mali_0 and mali_1)
+ * muxed by a glitch-free switch on Meson8b and Meson8m2 and later.
+ *
+ * CLK_SET_RATE_PARENT is added for mali_0_sel clock
+ * 1.gp0 pll only support the 846M, avoid other rate 500/400M from it
+ * 2.hifi pll is used for other module, skip it, avoid some rate from it
+ */
+static u32 mux_table_mali[] = { 0, 3, 4, 5, 6};
+
+static const struct clk_parent_data t7_mali_0_1_parent_data[] = {
+ { .fw_name = "xtal", },
+ { .fw_name = "fclk_div2p5", },
+ { .fw_name = "fclk_div3", },
+ { .fw_name = "fclk_div4", },
+ { .fw_name = "fclk_div5", },
+};
+
+static struct clk_regmap t7_mali_0_sel = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_MALI_CLK_CTRL,
+ .mask = 0x7,
+ .shift = 9,
+ .table = mux_table_mali,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "mali_0_sel",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_mali_0_1_parent_data,
+ .num_parents = ARRAY_SIZE(t7_mali_0_1_parent_data),
+ .flags = CLK_GET_RATE_NOCACHE,
+ },
+};
+
+static struct clk_regmap t7_mali_0_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_MALI_CLK_CTRL,
+ .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 *[]) {
+ &t7_mali_0_sel.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_mali_0 = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_MALI_CLK_CTRL,
+ .bit_idx = 8,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "mali_0",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_mali_0_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_GATE | CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_mali_1_sel = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_MALI_CLK_CTRL,
+ .mask = 0x7,
+ .shift = 25,
+ .table = mux_table_mali,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "mali_1_sel",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_mali_0_1_parent_data,
+ .num_parents = ARRAY_SIZE(t7_mali_0_1_parent_data),
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_mali_1_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_MALI_CLK_CTRL,
+ .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 *[]) {
+ &t7_mali_1_sel.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_mali_1 = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_MALI_CLK_CTRL,
+ .bit_idx = 24,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "mali_1",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_mali_1_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_GATE | CLK_SET_RATE_PARENT,
+ },
+};
+
+static const struct clk_hw *t7_mali_parent_hws[] = {
+ &t7_mali_0.hw,
+ &t7_mali_1.hw
+};
+
+static struct clk_regmap t7_mali_mux = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_MALI_CLK_CTRL,
+ .mask = 1,
+ .shift = 31,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "mali",
+ .ops = &clk_regmap_mux_ops,
+ .parent_hws = t7_mali_parent_hws,
+ .num_parents = 2,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+/* cts_vdec_clk */
+static const struct clk_parent_data t7_dec_parent_hws[] = {
+ { .fw_name = "fclk_div2p5", },
+ { .fw_name = "fclk_div3", },
+ { .fw_name = "fclk_div4", },
+ { .fw_name = "fclk_div5", },
+ { .fw_name = "fclk_div7", },
+ { .fw_name = "hifi_pll", },
+ { .fw_name = "gp0_pll", },
+ { .fw_name = "xtal", }
+};
+
+static struct clk_regmap t7_vdec_p0_mux = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_VDEC_CLK_CTRL,
+ .mask = 0x7,
+ .shift = 9,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "vdec_p0_mux",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_dec_parent_hws,
+ .num_parents = ARRAY_SIZE(t7_dec_parent_hws),
+ .flags = CLK_GET_RATE_NOCACHE,
+ },
+};
+
+static struct clk_regmap t7_vdec_p0_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_VDEC_CLK_CTRL,
+ .shift = 0,
+ .width = 7,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "vdec_p0_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_vdec_p0_mux.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_vdec_p0 = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_VDEC_CLK_CTRL,
+ .bit_idx = 8,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "vdec_p0",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_vdec_p0_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_vdec_p1_mux = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_VDEC3_CLK_CTRL,
+ .mask = 0x7,
+ .shift = 9,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "vdec_p1_mux",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_dec_parent_hws,
+ .num_parents = ARRAY_SIZE(t7_dec_parent_hws),
+ .flags = CLK_GET_RATE_NOCACHE,
+ },
+};
+
+static struct clk_regmap t7_vdec_p1_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_VDEC3_CLK_CTRL,
+ .shift = 0,
+ .width = 7,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "vdec_p1_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_vdec_p1_mux.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_vdec_p1 = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_VDEC3_CLK_CTRL,
+ .bit_idx = 8,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "vdec_p1",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_vdec_p1_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_vdec_mux = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_VDEC3_CLK_CTRL,
+ .mask = 0x1,
+ .shift = 15,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "vdec_mux",
+ .ops = &clk_regmap_mux_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_vdec_p0.hw,
+ &t7_vdec_p1.hw
+ },
+ .num_parents = 2,
+ .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_hcodec_p0_mux = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_VDEC_CLK_CTRL,
+ .mask = 0x7,
+ .shift = 25,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "hcodec_p0_mux",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_dec_parent_hws,
+ .num_parents = ARRAY_SIZE(t7_dec_parent_hws),
+ .flags = CLK_GET_RATE_NOCACHE,
+ },
+};
+
+static struct clk_regmap t7_hcodec_p0_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_VDEC_CLK_CTRL,
+ .shift = 16,
+ .width = 7,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "hcodec_p0_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_hcodec_p0_mux.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_hcodec_p0 = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_VDEC_CLK_CTRL,
+ .bit_idx = 24,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "hcodec_p0",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_hcodec_p0_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_hcodec_p1_mux = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_VDEC3_CLK_CTRL,
+ .mask = 0x7,
+ .shift = 25,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "hcodec_p1_mux",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_dec_parent_hws,
+ .num_parents = ARRAY_SIZE(t7_dec_parent_hws),
+ .flags = CLK_GET_RATE_NOCACHE,
+ },
+};
+
+static struct clk_regmap t7_hcodec_p1_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_VDEC3_CLK_CTRL,
+ .shift = 16,
+ .width = 7,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "hcodec_p1_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_hcodec_p1_mux.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_hcodec_p1 = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_VDEC3_CLK_CTRL,
+ .bit_idx = 24,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "hcodec_p1",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_hcodec_p1_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_hcodec_mux = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_VDEC3_CLK_CTRL,
+ .mask = 0x1,
+ .shift = 31,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "hcodec_mux",
+ .ops = &clk_regmap_mux_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_hcodec_p0.hw,
+ &t7_hcodec_p1.hw
+ },
+ .num_parents = 2,
+ .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
+ },
+};
+
+static u32 mux_table_vdec[] = { 0, 1, 2, 3, 4};
+
+static const struct clk_parent_data t7_vdec_parent_data[] = {
+ { .fw_name = "fclk_div2p5", },
+ { .fw_name = "fclk_div3", },
+ { .fw_name = "fclk_div4", },
+ { .fw_name = "fclk_div5", },
+ { .fw_name = "fclk_div7", },
+};
+
+static struct clk_regmap t7_hevcb_p0_mux = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_VDEC2_CLK_CTRL,
+ .mask = 0x7,
+ .shift = 25,
+ .flags = CLK_MUX_ROUND_CLOSEST,
+ .table = mux_table_vdec,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "hevcb_p0_mux",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_vdec_parent_data,
+ .num_parents = ARRAY_SIZE(t7_vdec_parent_data),
+ },
+};
+
+static struct clk_regmap t7_hevcb_p0_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_VDEC2_CLK_CTRL,
+ .shift = 16,
+ .width = 7,
+ .flags = CLK_DIVIDER_ROUND_CLOSEST,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "hevcb_p0_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_hevcb_p0_mux.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_hevcb_p0 = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_VDEC2_CLK_CTRL,
+ .bit_idx = 24,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "hevcb_p0_gate",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_hevcb_p0_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_hevcb_p1_mux = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_VDEC4_CLK_CTRL,
+ .mask = 0x7,
+ .shift = 25,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "hevcb_p1_mux",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_vdec_parent_data,
+ .num_parents = ARRAY_SIZE(t7_vdec_parent_data),
+ },
+};
+
+static struct clk_regmap t7_hevcb_p1_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_VDEC4_CLK_CTRL,
+ .shift = 16,
+ .width = 7,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "hevc_p1_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_hevcb_p1_mux.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_hevcb_p1 = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_VDEC4_CLK_CTRL,
+ .bit_idx = 24,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "hevcb_p1_gate",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_hevcb_p1_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_hevcb_mux = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_VDEC4_CLK_CTRL,
+ .mask = 0x1,
+ .shift = 31,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "hevcb_mux",
+ .ops = &clk_regmap_mux_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_hevcb_p0.hw,
+ &t7_hevcb_p1.hw
+ },
+ .num_parents = 2,
+ .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_hevcf_p0_mux = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_VDEC2_CLK_CTRL,
+ .mask = 0x7,
+ .shift = 9,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "hevcf_p0_mux",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_dec_parent_hws,
+ .num_parents = ARRAY_SIZE(t7_dec_parent_hws),
+ .flags = CLK_GET_RATE_NOCACHE,
+ },
+};
+
+static struct clk_regmap t7_hevcf_p0_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_VDEC2_CLK_CTRL,
+ .shift = 0,
+ .width = 7,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "hevcf_p0_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_hevcf_p0_mux.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_hevcf_p0 = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_VDEC2_CLK_CTRL,
+ .bit_idx = 8,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "hevcf_p0_gate",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_hevcf_p0_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_hevcf_p1_mux = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_VDEC4_CLK_CTRL,
+ .mask = 0x7,
+ .shift = 9,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "hevcf_p1_mux",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_dec_parent_hws,
+ .num_parents = ARRAY_SIZE(t7_dec_parent_hws),
+ .flags = CLK_GET_RATE_NOCACHE,
+ },
+};
+
+static struct clk_regmap t7_hevcf_p1_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_VDEC4_CLK_CTRL,
+ .shift = 0,
+ .width = 7,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "hevcf_p1_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_hevcf_p1_mux.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_hevcf_p1 = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_VDEC4_CLK_CTRL,
+ .bit_idx = 8,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "hevcf_p1",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_hevcf_p1_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_hevcf_mux = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_VDEC4_CLK_CTRL,
+ .mask = 0x1,
+ .shift = 15,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "hevcf_mux",
+ .ops = &clk_regmap_mux_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_hevcf_p0.hw,
+ &t7_hevcf_p1.hw
+ },
+ .num_parents = 2,
+ .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
+ },
+};
+
+/*cts_wave420l_a/b/c_clk*/
+static const struct clk_parent_data t7_wave_parent_data[] = {
+ { .fw_name = "xtal", },
+ { .fw_name = "fclk_div4", },
+ { .fw_name = "fclk_div3", },
+ { .fw_name = "fclk_div5", },
+ { .fw_name = "fclk_div7", },
+ { .fw_name = "mpll2", },
+ { .fw_name = "mpll3", },
+ { .fw_name = "gp1_pll", }
+};
+
+static struct clk_regmap t7_wave_a_sel = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_WAVE521_CLK_CTRL2,
+ .mask = 0x7,
+ .shift = 9,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "wave_a_sel",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_wave_parent_data,
+ .num_parents = ARRAY_SIZE(t7_wave_parent_data),
+ },
+};
+
+static struct clk_regmap t7_wave_a_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_WAVE521_CLK_CTRL2,
+ .shift = 0,
+ .width = 7,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "wave_a_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_wave_a_sel.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_wave_aclk = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_WAVE521_CLK_CTRL2,
+ .bit_idx = 8,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "wave_aclk",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_wave_a_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_wave_b_sel = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_WAVE521_CLK_CTRL,
+ .mask = 0x7,
+ .shift = 9,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "wave_b_sel",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_wave_parent_data,
+ .num_parents = ARRAY_SIZE(t7_wave_parent_data),
+ },
+};
+
+static struct clk_regmap t7_wave_b_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_WAVE521_CLK_CTRL,
+ .shift = 0,
+ .width = 7,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "wave_b_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_wave_b_sel.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_wave_bclk = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_WAVE521_CLK_CTRL,
+ .bit_idx = 8,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "wave_bclk",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_wave_b_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_wave_c_sel = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_WAVE521_CLK_CTRL,
+ .mask = 0x7,
+ .shift = 25,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "wave_c_sel",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_wave_parent_data,
+ .num_parents = ARRAY_SIZE(t7_wave_parent_data),
+ },
+};
+
+static struct clk_regmap t7_wave_c_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_WAVE521_CLK_CTRL,
+ .shift = 16,
+ .width = 7,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "wave_c_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_wave_c_sel.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_wave_cclk = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_WAVE521_CLK_CTRL,
+ .bit_idx = 24,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "wave_cclk",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_wave_c_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_mipi_isp_sel = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_MIPI_ISP_CLK_CTRL,
+ .mask = 0x7,
+ .shift = 9,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "mipi_isp_sel",
+ .ops = &clk_regmap_mux_ops,
+ /* Share parent with wave clk */
+ .parent_data = t7_wave_parent_data,
+ .num_parents = ARRAY_SIZE(t7_wave_parent_data),
+ },
+};
+
+static struct clk_regmap t7_mipi_isp_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_MIPI_ISP_CLK_CTRL,
+ .shift = 0,
+ .width = 7,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "mipi_isp_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_mipi_isp_sel.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_mipi_isp = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_MIPI_ISP_CLK_CTRL,
+ .bit_idx = 8,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "mipi_isp",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_mipi_isp_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static const struct clk_parent_data t7_mipi_csi_parent_data[] = {
+ { .fw_name = "xtal", },
+ { .fw_name = "hifi_pll", },
+ { .fw_name = "mpll1", },
+ { .fw_name = "mpll2", },
+ { .fw_name = "fclk_div3", },
+ { .fw_name = "fclk_div4", },
+ { .fw_name = "fclk_div5", },
+ { .fw_name = "fclk_div7", }
+};
+
+static struct clk_regmap t7_mipi_csi_phy_sel0 = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_MIPI_CSI_PHY_CLK_CTRL,
+ .mask = 0x7,
+ .shift = 9,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "mipi_csi_phy_sel0",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_mipi_csi_parent_data,
+ .num_parents = ARRAY_SIZE(t7_mipi_csi_parent_data),
+ },
+};
+
+static struct clk_regmap t7_mipi_csi_phy_div0 = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_MIPI_CSI_PHY_CLK_CTRL,
+ .shift = 0,
+ .width = 7,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "mipi_csi_phy_div0",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_mipi_csi_phy_sel0.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_mipi_csi_phy0 = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_MIPI_CSI_PHY_CLK_CTRL,
+ .bit_idx = 8,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "mipi_csi_phy0",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_mipi_csi_phy_div0.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_mipi_csi_phy_sel1 = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_MIPI_CSI_PHY_CLK_CTRL,
+ .mask = 0x7,
+ .shift = 25,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "mipi_csi_phy_sel1",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_mipi_csi_parent_data,
+ .num_parents = ARRAY_SIZE(t7_mipi_csi_parent_data),
+ },
+};
+
+static struct clk_regmap t7_mipi_csi_phy_div1 = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_MIPI_CSI_PHY_CLK_CTRL,
+ .shift = 16,
+ .width = 7,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "mipi_csi_phy_div1",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_mipi_csi_phy_sel1.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_mipi_csi_phy1 = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_MIPI_CSI_PHY_CLK_CTRL,
+ .bit_idx = 24,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "mipi_csi_phy1",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_mipi_csi_phy_div1.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_mipi_csi_phy_clk = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_MIPI_CSI_PHY_CLK_CTRL,
+ .mask = 0x1,
+ .shift = 31,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "mipi_csi_phy_clk",
+ .ops = &clk_regmap_mux_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_mipi_csi_phy0.hw,
+ &t7_mipi_csi_phy1.hw
+ },
+ .num_parents = 2,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static const struct clk_parent_data t7_vpu_parent_data[] = {
+ { .fw_name = "fclk_div3", },
+ { .fw_name = "fclk_div4", },
+ { .fw_name = "fclk_div5", },
+ { .fw_name = "fclk_div7", },
+};
+
+static struct clk_regmap t7_vpu_0_sel = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_VPU_CLK_CTRL,
+ .mask = 0x3,
+ .shift = 9,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "vpu_0_sel",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_vpu_parent_data,
+ .num_parents = ARRAY_SIZE(t7_vpu_parent_data),
+ },
+};
+
+static struct clk_regmap t7_vpu_0_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_VPU_CLK_CTRL,
+ .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 *[]) { &t7_vpu_0_sel.hw },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_vpu_0 = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_VPU_CLK_CTRL,
+ .bit_idx = 8,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "vpu_0",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) { &t7_vpu_0_div.hw },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+static struct clk_regmap t7_vpu_1_sel = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_VPU_CLK_CTRL,
+ .mask = 0x3,
+ .shift = 25,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "vpu_1_sel",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_vpu_parent_data,
+ .num_parents = ARRAY_SIZE(t7_vpu_parent_data),
+ },
+};
+
+static struct clk_regmap t7_vpu_1_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_VPU_CLK_CTRL,
+ .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 *[]) { &t7_vpu_1_sel.hw },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_vpu_1 = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_VPU_CLK_CTRL,
+ .bit_idx = 24,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "vpu_1",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) { &t7_vpu_1_div.hw },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+static struct clk_regmap t7_vpu = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_VPU_CLK_CTRL,
+ .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 *[]) {
+ &t7_vpu_0.hw,
+ &t7_vpu_1.hw
+ },
+ .num_parents = 2,
+ .flags = CLK_SET_RATE_NO_REPARENT,
+ },
+};
+
+static const struct clk_parent_data vpu_clkb_tmp_parent_data[] = {
+ { .hw = &t7_vpu.hw, },
+ { .fw_name = "fclk_div4", },
+ { .fw_name = "fclk_div5", },
+ { .fw_name = "fclk_div7", },
+};
+
+static struct clk_regmap t7_vpu_clkb_tmp_mux = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_VPU_CLKB_CTRL,
+ .mask = 0x3,
+ .shift = 20,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "vpu_clkb_tmp_mux",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = vpu_clkb_tmp_parent_data,
+ .num_parents = ARRAY_SIZE(vpu_clkb_tmp_parent_data),
+ .flags = CLK_GET_RATE_NOCACHE,
+ },
+};
+
+static struct clk_regmap t7_vpu_clkb_tmp_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_VPU_CLKB_CTRL,
+ .shift = 16,
+ .width = 4,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "vpu_clkb_tmp_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_vpu_clkb_tmp_mux.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_vpu_clkb_tmp = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_VPU_CLKB_CTRL,
+ .bit_idx = 24,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "vpu_clkb_tmp",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_vpu_clkb_tmp_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_vpu_clkb_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_VPU_CLKB_CTRL,
+ .shift = 0,
+ .width = 8,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "vpu_clkb_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_vpu_clkb_tmp.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_vpu_clkb = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_VPU_CLKB_CTRL,
+ .bit_idx = 8,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "vpu_clkb",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_vpu_clkb_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
+ },
+};
+
+static const struct clk_parent_data vpu_clkc_parent_data[] = {
+ { .fw_name = "fclk_div4", },
+ { .fw_name = "fclk_div3", },
+ { .fw_name = "fclk_div5", },
+ { .fw_name = "fclk_div7", },
+};
+
+static struct clk_regmap t7_vpu_clkc_p0_mux = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_VPU_CLKC_CTRL,
+ .mask = 0x3,
+ .shift = 9,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "vpu_clkc_p0_mux",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = vpu_clkc_parent_data,
+ .num_parents = ARRAY_SIZE(vpu_clkc_parent_data),
+ .flags = CLK_GET_RATE_NOCACHE,
+ },
+};
+
+static struct clk_regmap t7_vpu_clkc_p0_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_VPU_CLKC_CTRL,
+ .shift = 0,
+ .width = 7,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "vpu_clkc_p0_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_vpu_clkc_p0_mux.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_vpu_clkc_p0 = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_VPU_CLKC_CTRL,
+ .bit_idx = 8,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "vpu_clkc_p0",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_vpu_clkc_p0_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_vpu_clkc_p1_mux = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_VPU_CLKC_CTRL,
+ .mask = 0x3,
+ .shift = 25,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "vpu_clkc_p1_mux",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = vpu_clkc_parent_data,
+ .num_parents = ARRAY_SIZE(vpu_clkc_parent_data),
+ .flags = CLK_GET_RATE_NOCACHE,
+ },
+};
+
+static struct clk_regmap t7_vpu_clkc_p1_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_VPU_CLKC_CTRL,
+ .shift = 16,
+ .width = 7,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "vpu_clkc_p1_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_vpu_clkc_p1_mux.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_vpu_clkc_p1 = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_VPU_CLKC_CTRL,
+ .bit_idx = 24,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "vpu_clkc_p1",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_vpu_clkc_p1_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_vpu_clkc_mux = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_VPU_CLKC_CTRL,
+ .mask = 0x1,
+ .shift = 31,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "vpu_clkc_mux",
+ .ops = &clk_regmap_mux_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_vpu_clkc_p0.hw,
+ &t7_vpu_clkc_p1.hw
+ },
+ .num_parents = 2,
+ .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
+ },
+};
+
+static u32 t7_vapb_table[] = { 0, 1, 2, 3, 7};
+static const struct clk_parent_data t7_vapb_parent_data[] = {
+ { .fw_name = "fclk_div4", },
+ { .fw_name = "fclk_div3", },
+ { .fw_name = "fclk_div5", },
+ { .fw_name = "fclk_div7", },
+ { .fw_name = "fclk_div2p5", },
+};
+
+static struct clk_regmap t7_vapb_0_sel = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_VAPBCLK_CTRL,
+ .mask = 0x7,
+ .shift = 9,
+ .table = t7_vapb_table
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "vapb_0_sel",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_vapb_parent_data,
+ .num_parents = ARRAY_SIZE(t7_vapb_parent_data),
+ },
+};
+
+static struct clk_regmap t7_vapb_0_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_VAPBCLK_CTRL,
+ .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 *[]) {
+ &t7_vapb_0_sel.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_vapb_0 = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_VAPBCLK_CTRL,
+ .bit_idx = 8,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "vapb_0",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_vapb_0_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+static struct clk_regmap t7_vapb_1_sel = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_VAPBCLK_CTRL,
+ .mask = 0x7,
+ .shift = 25,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "vapb_1_sel",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_vapb_parent_data,
+ .num_parents = ARRAY_SIZE(t7_vapb_parent_data),
+ .flags = CLK_SET_RATE_NO_REPARENT,
+ },
+};
+
+static struct clk_regmap t7_vapb_1_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_VAPBCLK_CTRL,
+ .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 *[]) {
+ &t7_vapb_1_sel.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_vapb_1 = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_VAPBCLK_CTRL,
+ .bit_idx = 24,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "vapb_1",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_vapb_1_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+static struct clk_regmap t7_vapb = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_VAPBCLK_CTRL,
+ .mask = 1,
+ .shift = 31,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "vapb_sel",
+ .ops = &clk_regmap_mux_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_vapb_0.hw,
+ &t7_vapb_1.hw
+ },
+ .num_parents = 2,
+ .flags = CLK_SET_RATE_NO_REPARENT | CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_gdcclk_0_sel = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_GDC_CLK_CTRL,
+ .mask = 0x7,
+ .shift = 9,
+ .table = t7_vapb_table
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "gdcclk_0_sel",
+ .ops = &clk_regmap_mux_ops,
+ /* Share parent with vapb clk */
+ .parent_data = t7_vapb_parent_data,
+ .num_parents = ARRAY_SIZE(t7_vapb_parent_data),
+ },
+};
+
+static struct clk_regmap t7_gdcclk_0_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_GDC_CLK_CTRL,
+ .shift = 0,
+ .width = 7,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "gdcclk_0_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_gdcclk_0_sel.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_gdcclk_0 = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_GDC_CLK_CTRL,
+ .bit_idx = 8,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "gdcclk_0",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) { &t7_gdcclk_0_div.hw },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+static struct clk_regmap t7_gdcclk_1_sel = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_GDC_CLK_CTRL,
+ .mask = 0x7,
+ .shift = 25,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "gdcclk_1_sel",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_vapb_parent_data,
+ .num_parents = ARRAY_SIZE(t7_vapb_parent_data),
+ .flags = CLK_SET_RATE_NO_REPARENT,
+ },
+};
+
+static struct clk_regmap t7_gdcclk_1_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_GDC_CLK_CTRL,
+ .shift = 16,
+ .width = 7,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "gdcclk_1_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_gdcclk_1_sel.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_gdcclk_1 = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_GDC_CLK_CTRL,
+ .bit_idx = 24,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "gdcclk_1",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_gdcclk_1_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+static struct clk_regmap t7_gdcclk = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_GDC_CLK_CTRL,
+ .mask = 1,
+ .shift = 31,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "gdcclk_sel",
+ .ops = &clk_regmap_mux_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_gdcclk_0.hw,
+ &t7_gdcclk_1.hw
+ },
+ .num_parents = 2,
+ .flags = CLK_SET_RATE_NO_REPARENT | CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_gdc_clk = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_GDC_CLK_CTRL,
+ .bit_idx = 30,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "gdc_clk",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_gdcclk.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+static struct clk_regmap t7_dewarpclk_0_sel = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_AMLGDC_CLK_CTRL,
+ .mask = 0x7,
+ .shift = 9,
+ .table = t7_vapb_table
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "dewarpclk_0_sel",
+ .ops = &clk_regmap_mux_ops,
+ /* Share parent with vapb clk */
+ .parent_data = t7_vapb_parent_data,
+ .num_parents = ARRAY_SIZE(t7_vapb_parent_data),
+ },
+};
+
+static struct clk_regmap t7_dewarpclk_0_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_AMLGDC_CLK_CTRL,
+ .shift = 0,
+ .width = 7,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "dewarpclk_0_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_dewarpclk_0_sel.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_dewarpclk_0 = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_AMLGDC_CLK_CTRL,
+ .bit_idx = 8,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "dewarpclk_0",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) { &t7_dewarpclk_0_div.hw },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+static struct clk_regmap t7_dewarpclk_1_sel = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_AMLGDC_CLK_CTRL,
+ .mask = 0x7,
+ .shift = 25,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "dewarpclk_1_sel",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_vapb_parent_data,
+ .num_parents = ARRAY_SIZE(t7_vapb_parent_data),
+ .flags = CLK_SET_RATE_NO_REPARENT,
+ },
+};
+
+static struct clk_regmap t7_dewarpclk_1_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_AMLGDC_CLK_CTRL,
+ .shift = 16,
+ .width = 7,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "dewarpclk_1_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_dewarpclk_1_sel.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_dewarpclk_1 = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_AMLGDC_CLK_CTRL,
+ .bit_idx = 24,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "dewarpclk_1",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_dewarpclk_1_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+static struct clk_regmap t7_dewarpclk = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_AMLGDC_CLK_CTRL,
+ .mask = 1,
+ .shift = 31,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "dewarpclk_sel",
+ .ops = &clk_regmap_mux_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_dewarpclk_0.hw,
+ &t7_dewarpclk_1.hw
+ },
+ .num_parents = 2,
+ .flags = CLK_SET_RATE_NO_REPARENT | CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_dewarp_clk = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_AMLGDC_CLK_CTRL,
+ .bit_idx = 30,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "dewarp_clk",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_dewarpclk.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+static u32 t7_anakin_table[] = { 0, 1, 2, 3, 7};
+static const struct clk_parent_data t7_anakin_parent_data[] = {
+ { .fw_name = "fclk_div4", },
+ { .fw_name = "fclk_div3", },
+ { .fw_name = "fclk_div5", },
+ { .fw_name = "fclk_div2", },
+ { .fw_name = "fclk_div2p5", },
+};
+
+static struct clk_regmap t7_anakin_0_sel = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_ANAKIN_CLK_CTRL,
+ .mask = 0x7,
+ .shift = 9,
+ .table = t7_anakin_table
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "anakin_0_sel",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_anakin_parent_data,
+ .num_parents = ARRAY_SIZE(t7_anakin_parent_data),
+ },
+};
+
+static struct clk_regmap t7_anakin_0_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_ANAKIN_CLK_CTRL,
+ .shift = 0,
+ .width = 7,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "anakin_0_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_anakin_0_sel.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_anakin_0 = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_ANAKIN_CLK_CTRL,
+ .bit_idx = 8,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "anakin_0",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) { &t7_anakin_0_div.hw },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_GATE | CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_anakin_1_sel = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_ANAKIN_CLK_CTRL,
+ .mask = 0x7,
+ .shift = 25,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "anakin_1_sel",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_anakin_parent_data,
+ .num_parents = ARRAY_SIZE(t7_anakin_parent_data),
+ },
+};
+
+static struct clk_regmap t7_anakin_1_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_ANAKIN_CLK_CTRL,
+ .shift = 16,
+ .width = 7,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "anakin_1_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_anakin_1_sel.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_anakin_1 = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_ANAKIN_CLK_CTRL,
+ .bit_idx = 24,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "anakin_1",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_anakin_1_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_GATE | CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_anakin = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_ANAKIN_CLK_CTRL,
+ .mask = 1,
+ .shift = 31,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "anakin_sel",
+ .ops = &clk_regmap_mux_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_anakin_0.hw,
+ &t7_anakin_1.hw
+ },
+ .num_parents = 2,
+ .flags = CLK_SET_RATE_PARENT
+ },
+};
+
+static struct clk_regmap t7_anakin_clk = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_ANAKIN_CLK_CTRL,
+ .bit_idx = 30,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "anakin_clk",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_anakin.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT
+ },
+};
+
+static struct clk_regmap t7_ge2d_gate = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_VAPBCLK_CTRL,
+ .bit_idx = 30,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "ge2d_gate",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) { &t7_vapb.hw },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+/*cts_hdcp22_esmclk*/
+
+/*cts_hdcp22_skpclk*/
+
+/* cts_vdin_meas_clk */
+static const struct clk_parent_data t7_vdin_parent_hws[] = {
+ { .fw_name = "xtal", },
+ { .fw_name = "fclk_div4", },
+ { .fw_name = "fclk_div3", },
+ { .fw_name = "fclk_div5", },
+ { .hw = &t7_vid_pll.hw }
+};
+
+static struct clk_regmap t7_vdin_meas_mux = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_VDIN_MEAS_CLK_CTRL,
+ .mask = 0x7,
+ .shift = 9,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "vdin_meas_mux",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_vdin_parent_hws,
+ .num_parents = ARRAY_SIZE(t7_vdin_parent_hws),
+ .flags = CLK_GET_RATE_NOCACHE,
+ },
+};
+
+static struct clk_regmap t7_vdin_meas_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_VDIN_MEAS_CLK_CTRL,
+ .shift = 0,
+ .width = 7,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "vdin_meas_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_vdin_meas_mux.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_vdin_meas_gate = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_VDIN_MEAS_CLK_CTRL,
+ .bit_idx = 8,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "vdin_meas_gate",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_vdin_meas_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
+ },
+};
+
+static const struct clk_parent_data t7_sd_emmc_clk0_parent_data[] = {
+ { .fw_name = "xtal", },
+ { .fw_name = "fclk_div2", },
+ { .fw_name = "fclk_div3", },
+ { .fw_name = "hifi_pll", },
+ { .fw_name = "fclk_div2p5", },
+ { .fw_name = "mpll2", },
+ { .fw_name = "mpll3", },
+ { .fw_name = "gp0_pll", }
+};
+
+static struct clk_regmap t7_sd_emmc_c_clk0_sel = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_NAND_CLK_CTRL,
+ .mask = 0x7,
+ .shift = 9,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "sd_emmc_c_clk0_sel",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_sd_emmc_clk0_parent_data,
+ .num_parents = ARRAY_SIZE(t7_sd_emmc_clk0_parent_data),
+ .flags = CLK_GET_RATE_NOCACHE
+ },
+};
+
+static struct clk_regmap t7_sd_emmc_c_clk0_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_NAND_CLK_CTRL,
+ .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 *[]) {
+ &t7_sd_emmc_c_clk0_sel.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT
+ },
+};
+
+static struct clk_regmap t7_sd_emmc_c_clk0 = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_NAND_CLK_CTRL,
+ .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 *[]) {
+ &t7_sd_emmc_c_clk0_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT
+ },
+};
+
+static struct clk_regmap t7_sd_emmc_a_clk0_sel = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_SD_EMMC_CLK_CTRL,
+ .mask = 0x7,
+ .shift = 9,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "sd_emmc_a_clk0_sel",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_sd_emmc_clk0_parent_data,
+ .num_parents = ARRAY_SIZE(t7_sd_emmc_clk0_parent_data),
+ .flags = CLK_GET_RATE_NOCACHE
+ },
+};
+
+static struct clk_regmap t7_sd_emmc_a_clk0_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_SD_EMMC_CLK_CTRL,
+ .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 *[]) {
+ &t7_sd_emmc_a_clk0_sel.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_sd_emmc_a_clk0 = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_SD_EMMC_CLK_CTRL,
+ .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 *[]) {
+ &t7_sd_emmc_a_clk0_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_sd_emmc_b_clk0_sel = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_SD_EMMC_CLK_CTRL,
+ .mask = 0x7,
+ .shift = 25,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "sd_emmc_b_clk0_sel",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_sd_emmc_clk0_parent_data,
+ .num_parents = ARRAY_SIZE(t7_sd_emmc_clk0_parent_data),
+ .flags = CLK_GET_RATE_NOCACHE
+ },
+};
+
+static struct clk_regmap t7_sd_emmc_b_clk0_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_SD_EMMC_CLK_CTRL,
+ .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 *[]) {
+ &t7_sd_emmc_b_clk0_sel.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT
+ },
+};
+
+static struct clk_regmap t7_sd_emmc_b_clk0 = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_SD_EMMC_CLK_CTRL,
+ .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 *[]) {
+ &t7_sd_emmc_b_clk0_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT
+ },
+};
+
+/*cts_cdac_clk*/
+
+static const struct clk_parent_data t7_spicc_parent_hws[] = {
+ { .fw_name = "xtal", },
+ { .hw = &t7_sys_clk.hw },
+ { .fw_name = "fclk_div4", },
+ { .fw_name = "fclk_div3", },
+ { .fw_name = "fclk_div2", },
+ { .fw_name = "fclk_div5", },
+ { .fw_name = "fclk_div7", },
+ { .fw_name = "hifi_pll", }
+};
+
+static struct clk_regmap t7_spicc0_mux = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_SPICC_CLK_CTRL,
+ .mask = 0x7,
+ .shift = 7,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "spicc0_mux",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_spicc_parent_hws,
+ .num_parents = ARRAY_SIZE(t7_spicc_parent_hws),
+ },
+};
+
+static struct clk_regmap t7_spicc0_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_SPICC_CLK_CTRL,
+ .shift = 0,
+ .width = 6,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "spicc0_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_spicc0_mux.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_spicc0_gate = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_SPICC_CLK_CTRL,
+ .bit_idx = 6,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "spicc0_gate",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_spicc0_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_spicc1_mux = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_SPICC_CLK_CTRL,
+ .mask = 0x7,
+ .shift = 23,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "spicc1_mux",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_spicc_parent_hws,
+ .num_parents = ARRAY_SIZE(t7_spicc_parent_hws),
+ },
+};
+
+static struct clk_regmap t7_spicc1_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_SPICC_CLK_CTRL,
+ .shift = 16,
+ .width = 6,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "spicc1_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_spicc1_mux.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_spicc1_gate = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_SPICC_CLK_CTRL,
+ .bit_idx = 22,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "spicc1_gate",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_spicc1_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_spicc2_mux = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_SPICC_CLK_CTRL1,
+ .mask = 0x7,
+ .shift = 7,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "spicc2_mux",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_spicc_parent_hws,
+ .num_parents = ARRAY_SIZE(t7_spicc_parent_hws),
+ },
+};
+
+static struct clk_regmap t7_spicc2_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_SPICC_CLK_CTRL1,
+ .shift = 0,
+ .width = 6,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "spicc2_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_spicc2_mux.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_spicc2_gate = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_SPICC_CLK_CTRL1,
+ .bit_idx = 6,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "spicc2_gate",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_spicc2_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_spicc3_mux = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_SPICC_CLK_CTRL1,
+ .mask = 0x7,
+ .shift = 23,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "spicc3_mux",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_spicc_parent_hws,
+ .num_parents = ARRAY_SIZE(t7_spicc_parent_hws),
+ },
+};
+
+static struct clk_regmap t7_spicc3_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_SPICC_CLK_CTRL1,
+ .shift = 16,
+ .width = 6,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "spicc3_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_spicc3_mux.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_spicc3_gate = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_SPICC_CLK_CTRL1,
+ .bit_idx = 22,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "spicc3_gate",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_spicc3_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_spicc4_mux = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_SPICC_CLK_CTRL2,
+ .mask = 0x7,
+ .shift = 7,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "spicc4_mux",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_spicc_parent_hws,
+ .num_parents = ARRAY_SIZE(t7_spicc_parent_hws),
+ },
+};
+
+static struct clk_regmap t7_spicc4_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_SPICC_CLK_CTRL2,
+ .shift = 0,
+ .width = 6,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "spicc4_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_spicc4_mux.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_spicc4_gate = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_SPICC_CLK_CTRL2,
+ .bit_idx = 6,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "spicc4_gate",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_spicc4_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_spicc5_mux = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_SPICC_CLK_CTRL2,
+ .mask = 0x7,
+ .shift = 23,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "spicc5_mux",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_spicc_parent_hws,
+ .num_parents = ARRAY_SIZE(t7_spicc_parent_hws),
+ },
+};
+
+static struct clk_regmap t7_spicc5_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_SPICC_CLK_CTRL2,
+ .shift = 16,
+ .width = 6,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "spicc5_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_spicc5_mux.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_spicc5_gate = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_SPICC_CLK_CTRL2,
+ .bit_idx = 22,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "spicc5_gate",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_spicc5_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+/*cts_bt656*/
+
+static const struct clk_parent_data t7_pwm_parent_data[] = {
+ { .fw_name = "xtal", },
+ { .hw = &t7_vid_pll.hw },
+ { .fw_name = "fclk_div4", },
+ { .fw_name = "fclk_div3", }
+};
+
+static struct clk_regmap t7_pwm_a_mux = {
+ .data = &(struct clk_regmap_mux_data) {
+ .offset = CLKCTRL_PWM_CLK_AB_CTRL,
+ .mask = 0x3,
+ .shift = 9,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "pwm_a_mux",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_pwm_parent_data,
+ .num_parents = ARRAY_SIZE(t7_pwm_parent_data),
+ .flags = CLK_IGNORE_UNUSED,
+ },
+};
+
+static struct clk_regmap t7_pwm_a_div = {
+ .data = &(struct clk_regmap_div_data) {
+ .offset = CLKCTRL_PWM_CLK_AB_CTRL,
+ .shift = 0,
+ .width = 8,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "pwm_a_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_pwm_a_mux.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+static struct clk_regmap t7_pwm_a_gate = {
+ .data = &(struct clk_regmap_gate_data) {
+ .offset = CLKCTRL_PWM_CLK_AB_CTRL,
+ .bit_idx = 8,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "pwm_a_gate",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_pwm_a_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+static struct clk_regmap t7_pwm_b_mux = {
+ .data = &(struct clk_regmap_mux_data) {
+ .offset = CLKCTRL_PWM_CLK_AB_CTRL,
+ .mask = 0x3,
+ .shift = 25,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "pwm_b_mux",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_pwm_parent_data,
+ .num_parents = ARRAY_SIZE(t7_pwm_parent_data),
+ .flags = CLK_IGNORE_UNUSED,
+ },
+};
+
+static struct clk_regmap t7_pwm_b_div = {
+ .data = &(struct clk_regmap_div_data) {
+ .offset = CLKCTRL_PWM_CLK_AB_CTRL,
+ .shift = 16,
+ .width = 8,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "pwm_b_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_pwm_b_mux.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+static struct clk_regmap t7_pwm_b_gate = {
+ .data = &(struct clk_regmap_gate_data) {
+ .offset = CLKCTRL_PWM_CLK_AB_CTRL,
+ .bit_idx = 24,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "pwm_b_gate",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_pwm_b_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+static struct clk_regmap t7_pwm_c_mux = {
+ .data = &(struct clk_regmap_mux_data) {
+ .offset = CLKCTRL_PWM_CLK_CD_CTRL,
+ .mask = 0x3,
+ .shift = 9,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "pwm_c_mux",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_pwm_parent_data,
+ .num_parents = ARRAY_SIZE(t7_pwm_parent_data),
+ .flags = CLK_IGNORE_UNUSED,
+ },
+};
+
+static struct clk_regmap t7_pwm_c_div = {
+ .data = &(struct clk_regmap_div_data) {
+ .offset = CLKCTRL_PWM_CLK_CD_CTRL,
+ .shift = 0,
+ .width = 8,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "pwm_c_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_pwm_c_mux.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+static struct clk_regmap t7_pwm_c_gate = {
+ .data = &(struct clk_regmap_gate_data) {
+ .offset = CLKCTRL_PWM_CLK_CD_CTRL,
+ .bit_idx = 8,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "pwm_c_gate",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_pwm_c_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+static struct clk_regmap t7_pwm_d_mux = {
+ .data = &(struct clk_regmap_mux_data) {
+ .offset = CLKCTRL_PWM_CLK_CD_CTRL,
+ .mask = 0x3,
+ .shift = 25,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "pwm_d_mux",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_pwm_parent_data,
+ .num_parents = ARRAY_SIZE(t7_pwm_parent_data),
+ .flags = CLK_IGNORE_UNUSED,
+ },
+};
+
+static struct clk_regmap t7_pwm_d_div = {
+ .data = &(struct clk_regmap_div_data) {
+ .offset = CLKCTRL_PWM_CLK_CD_CTRL,
+ .shift = 16,
+ .width = 8,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "pwm_d_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_pwm_d_mux.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+static struct clk_regmap t7_pwm_d_gate = {
+ .data = &(struct clk_regmap_gate_data) {
+ .offset = CLKCTRL_PWM_CLK_CD_CTRL,
+ .bit_idx = 24,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "pwm_d_gate",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_pwm_d_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+static struct clk_regmap t7_pwm_e_mux = {
+ .data = &(struct clk_regmap_mux_data) {
+ .offset = CLKCTRL_PWM_CLK_EF_CTRL,
+ .mask = 0x3,
+ .shift = 9,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "pwm_e_mux",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_pwm_parent_data,
+ .num_parents = ARRAY_SIZE(t7_pwm_parent_data),
+ .flags = CLK_IGNORE_UNUSED,
+ },
+};
+
+static struct clk_regmap t7_pwm_e_div = {
+ .data = &(struct clk_regmap_div_data) {
+ .offset = CLKCTRL_PWM_CLK_EF_CTRL,
+ .shift = 0,
+ .width = 8,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "pwm_e_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_pwm_e_mux.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+static struct clk_regmap t7_pwm_e_gate = {
+ .data = &(struct clk_regmap_gate_data) {
+ .offset = CLKCTRL_PWM_CLK_EF_CTRL,
+ .bit_idx = 8,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "pwm_e_gate",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_pwm_e_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+static struct clk_regmap t7_pwm_f_mux = {
+ .data = &(struct clk_regmap_mux_data) {
+ .offset = CLKCTRL_PWM_CLK_EF_CTRL,
+ .mask = 0x3,
+ .shift = 25,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "pwm_f_mux",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_pwm_parent_data,
+ .num_parents = ARRAY_SIZE(t7_pwm_parent_data),
+ .flags = CLK_IGNORE_UNUSED,
+ },
+};
+
+static struct clk_regmap t7_pwm_f_div = {
+ .data = &(struct clk_regmap_div_data) {
+ .offset = CLKCTRL_PWM_CLK_EF_CTRL,
+ .shift = 16,
+ .width = 8,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "pwm_f_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_pwm_f_mux.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+static struct clk_regmap t7_pwm_f_gate = {
+ .data = &(struct clk_regmap_gate_data) {
+ .offset = CLKCTRL_PWM_CLK_EF_CTRL,
+ .bit_idx = 24,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "pwm_f_gate",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_pwm_f_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+static struct clk_regmap t7_pwm_ao_a_mux = {
+ .data = &(struct clk_regmap_mux_data) {
+ .offset = CLKCTRL_PWM_CLK_AO_AB_CTRL,
+ .mask = 0x3,
+ .shift = 9,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "pwm_ao_a_mux",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_pwm_parent_data,
+ .num_parents = ARRAY_SIZE(t7_pwm_parent_data),
+ },
+};
+
+static struct clk_regmap t7_pwm_ao_a_div = {
+ .data = &(struct clk_regmap_div_data) {
+ .offset = CLKCTRL_PWM_CLK_AO_AB_CTRL,
+ .shift = 0,
+ .width = 8,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "pwm_ao_a_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_pwm_ao_a_mux.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_pwm_ao_a_gate = {
+ .data = &(struct clk_regmap_gate_data) {
+ .offset = CLKCTRL_PWM_CLK_AO_AB_CTRL,
+ .bit_idx = 8,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "pwm_ao_a_gate",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_pwm_ao_a_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+static struct clk_regmap t7_pwm_ao_b_mux = {
+ .data = &(struct clk_regmap_mux_data) {
+ .offset = CLKCTRL_PWM_CLK_AO_AB_CTRL,
+ .mask = 0x3,
+ .shift = 25,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "pwm_ao_b_mux",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_pwm_parent_data,
+ .num_parents = ARRAY_SIZE(t7_pwm_parent_data),
+ },
+};
+
+static struct clk_regmap t7_pwm_ao_b_div = {
+ .data = &(struct clk_regmap_div_data) {
+ .offset = CLKCTRL_PWM_CLK_AO_AB_CTRL,
+ .shift = 16,
+ .width = 8,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "pwm_ao_b_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_pwm_ao_b_mux.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_pwm_ao_b_gate = {
+ .data = &(struct clk_regmap_gate_data) {
+ .offset = CLKCTRL_PWM_CLK_AO_AB_CTRL,
+ .bit_idx = 24,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "pwm_ao_b_gate",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_pwm_ao_b_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+static struct clk_regmap t7_pwm_ao_c_mux = {
+ .data = &(struct clk_regmap_mux_data) {
+ .offset = CLKCTRL_PWM_CLK_AO_CD_CTRL,
+ .mask = 0x3,
+ .shift = 9,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "pwm_ao_c_mux",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_pwm_parent_data,
+ .num_parents = ARRAY_SIZE(t7_pwm_parent_data),
+ },
+};
+
+static struct clk_regmap t7_pwm_ao_c_div = {
+ .data = &(struct clk_regmap_div_data) {
+ .offset = CLKCTRL_PWM_CLK_AO_CD_CTRL,
+ .shift = 0,
+ .width = 8,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "pwm_ao_c_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_pwm_ao_c_mux.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT
+ },
+};
+
+static struct clk_regmap t7_pwm_ao_c_gate = {
+ .data = &(struct clk_regmap_gate_data) {
+ .offset = CLKCTRL_PWM_CLK_AO_CD_CTRL,
+ .bit_idx = 8,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "pwm_ao_c_gate",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_pwm_ao_c_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+static struct clk_regmap t7_pwm_ao_d_mux = {
+ .data = &(struct clk_regmap_mux_data) {
+ .offset = CLKCTRL_PWM_CLK_AO_CD_CTRL,
+ .mask = 0x3,
+ .shift = 25,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "pwm_ao_d_mux",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_pwm_parent_data,
+ .num_parents = ARRAY_SIZE(t7_pwm_parent_data),
+ },
+};
+
+static struct clk_regmap t7_pwm_ao_d_div = {
+ .data = &(struct clk_regmap_div_data) {
+ .offset = CLKCTRL_PWM_CLK_AO_CD_CTRL,
+ .shift = 16,
+ .width = 8,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "pwm_ao_d_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_pwm_ao_d_mux.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT
+ },
+};
+
+static struct clk_regmap t7_pwm_ao_d_gate = {
+ .data = &(struct clk_regmap_gate_data) {
+ .offset = CLKCTRL_PWM_CLK_AO_CD_CTRL,
+ .bit_idx = 24,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "pwm_ao_d_gate",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_pwm_ao_d_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+static struct clk_regmap t7_pwm_ao_e_mux = {
+ .data = &(struct clk_regmap_mux_data) {
+ .offset = CLKCTRL_PWM_CLK_AO_EF_CTRL,
+ .mask = 0x3,
+ .shift = 9,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "pwm_ao_e_mux",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_pwm_parent_data,
+ .num_parents = ARRAY_SIZE(t7_pwm_parent_data),
+ },
+};
+
+static struct clk_regmap t7_pwm_ao_e_div = {
+ .data = &(struct clk_regmap_div_data) {
+ .offset = CLKCTRL_PWM_CLK_AO_EF_CTRL,
+ .shift = 0,
+ .width = 8,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "pwm_ao_e_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_pwm_ao_e_mux.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT
+ },
+};
+
+static struct clk_regmap t7_pwm_ao_e_gate = {
+ .data = &(struct clk_regmap_gate_data) {
+ .offset = CLKCTRL_PWM_CLK_AO_EF_CTRL,
+ .bit_idx = 8,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "pwm_ao_e_gate",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_pwm_ao_e_div.hw
+ },
+ .num_parents = 1,
+ /*The clock feeds the GPU,it should be always on*/
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+static struct clk_regmap t7_pwm_ao_f_mux = {
+ .data = &(struct clk_regmap_mux_data) {
+ .offset = CLKCTRL_PWM_CLK_AO_EF_CTRL,
+ .mask = 0x3,
+ .shift = 25,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "pwm_ao_f_mux",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_pwm_parent_data,
+ .num_parents = ARRAY_SIZE(t7_pwm_parent_data),
+ },
+};
+
+static struct clk_regmap t7_pwm_ao_f_div = {
+ .data = &(struct clk_regmap_div_data) {
+ .offset = CLKCTRL_PWM_CLK_AO_EF_CTRL,
+ .shift = 16,
+ .width = 8,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "pwm_ao_f_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_pwm_ao_f_mux.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT
+ },
+};
+
+static struct clk_regmap t7_pwm_ao_f_gate = {
+ .data = &(struct clk_regmap_gate_data) {
+ .offset = CLKCTRL_PWM_CLK_AO_EF_CTRL,
+ .bit_idx = 24,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "pwm_ao_f_gate",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_pwm_ao_f_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+static struct clk_regmap t7_pwm_ao_g_mux = {
+ .data = &(struct clk_regmap_mux_data) {
+ .offset = CLKCTRL_PWM_CLK_AO_GH_CTRL,
+ .mask = 0x3,
+ .shift = 9,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "pwm_ao_g_mux",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_pwm_parent_data,
+ .num_parents = ARRAY_SIZE(t7_pwm_parent_data),
+ },
+};
+
+static struct clk_regmap t7_pwm_ao_g_div = {
+ .data = &(struct clk_regmap_div_data) {
+ .offset = CLKCTRL_PWM_CLK_AO_GH_CTRL,
+ .shift = 0,
+ .width = 8,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "pwm_ao_g_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_pwm_ao_g_mux.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT
+ },
+};
+
+static struct clk_regmap t7_pwm_ao_g_gate = {
+ .data = &(struct clk_regmap_gate_data) {
+ .offset = CLKCTRL_PWM_CLK_AO_GH_CTRL,
+ .bit_idx = 8,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "pwm_ao_g_gate",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_pwm_ao_g_div.hw
+ },
+ .num_parents = 1,
+ /*This clock feeds the DDR,it should be always on.*/
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+static struct clk_regmap t7_pwm_ao_h_mux = {
+ .data = &(struct clk_regmap_mux_data) {
+ .offset = CLKCTRL_PWM_CLK_AO_GH_CTRL,
+ .mask = 0x3,
+ .shift = 25,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "pwm_ao_h_mux",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_pwm_parent_data,
+ .num_parents = ARRAY_SIZE(t7_pwm_parent_data),
+ },
+};
+
+static struct clk_regmap t7_pwm_ao_h_div = {
+ .data = &(struct clk_regmap_div_data) {
+ .offset = CLKCTRL_PWM_CLK_AO_GH_CTRL,
+ .shift = 16,
+ .width = 8,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "pwm_ao_h_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_pwm_ao_h_mux.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT
+ },
+};
+
+static struct clk_regmap t7_pwm_ao_h_gate = {
+ .data = &(struct clk_regmap_gate_data) {
+ .offset = CLKCTRL_PWM_CLK_AO_GH_CTRL,
+ .bit_idx = 24,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "pwm_ao_h_gate",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_pwm_ao_h_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+static u32 t7_dsi_meas_table[] = { 0, 1, 2, 3, 6, 7};
+
+static const struct clk_parent_data t7_dsi_meas_parent_data[] = {
+ { .fw_name = "xtal", },
+ { .fw_name = "fclk_div4", },
+ { .fw_name = "fclk_div3", },
+ { .fw_name = "fclk_div5", },
+ { .fw_name = "fclk_div2", },
+ { .fw_name = "fclk_div7", }
+};
+
+static struct clk_regmap t7_dsi_a_meas_mux = {
+ .data = &(struct clk_regmap_mux_data) {
+ .offset = CLKCTRL_MIPI_DSI_MEAS_CLK_CTRL,
+ .mask = 0x3,
+ .shift = 9,
+ .table = t7_dsi_meas_table
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "dsi_a_meas_mux",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_dsi_meas_parent_data,
+ .num_parents = ARRAY_SIZE(t7_dsi_meas_parent_data)
+ },
+};
+
+static struct clk_regmap t7_dsi_a_meas_div = {
+ .data = &(struct clk_regmap_div_data) {
+ .offset = CLKCTRL_MIPI_DSI_MEAS_CLK_CTRL,
+ .shift = 0,
+ .width = 7,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "dsi_a_meas_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_dsi_a_meas_mux.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_dsi_a_meas_gate = {
+ .data = &(struct clk_regmap_gate_data) {
+ .offset = CLKCTRL_MIPI_DSI_MEAS_CLK_CTRL,
+ .bit_idx = 8,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "dsi_a_meas_clk",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_dsi_a_meas_div.hw
+ },
+ .num_parents = 1,
+ /* config it in U-boot, ignore it to avoid display abnormal */
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+static struct clk_regmap t7_dsi_b_meas_mux = {
+ .data = &(struct clk_regmap_mux_data) {
+ .offset = CLKCTRL_MIPI_DSI_MEAS_CLK_CTRL,
+ .mask = 0x3,
+ .shift = 21,
+ .table = t7_dsi_meas_table
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "dsi_b_meas_mux",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_dsi_meas_parent_data,
+ .num_parents = ARRAY_SIZE(t7_dsi_meas_parent_data)
+ },
+};
+
+static struct clk_regmap t7_dsi_b_meas_div = {
+ .data = &(struct clk_regmap_div_data) {
+ .offset = CLKCTRL_MIPI_DSI_MEAS_CLK_CTRL,
+ .shift = 12,
+ .width = 7,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "dsi_b_meas_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_dsi_b_meas_mux.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_dsi_b_meas_gate = {
+ .data = &(struct clk_regmap_gate_data) {
+ .offset = CLKCTRL_MIPI_DSI_MEAS_CLK_CTRL,
+ .bit_idx = 20,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "dsi_b_meas_clk",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_dsi_b_meas_div.hw
+ },
+ .num_parents = 1,
+ /* config it in U-boot, ignore it to avoid display abnormal */
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+static u32 t7_dsi_phy_table[] = { 4, 5, 6, 7};
+static const struct clk_parent_data t7_dsi_phy_parent_data[] = {
+ { .fw_name = "fclk_div2", },
+ { .fw_name = "fclk_div2p5", },
+ { .fw_name = "fclk_div3", },
+ { .fw_name = "fclk_div7", },
+};
+
+static struct clk_regmap t7_dsi0_phy_mux = {
+ .data = &(struct clk_regmap_mux_data) {
+ .offset = CLKCTRL_MIPIDSI_PHY_CLK_CTRL,
+ .mask = 0x3,
+ .shift = 12,
+ .table = t7_dsi_phy_table
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "dsi0_phy_mux",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_dsi_phy_parent_data,
+ .num_parents = ARRAY_SIZE(t7_dsi_phy_parent_data)
+ },
+};
+
+static struct clk_regmap t7_dsi0_phy_div = {
+ .data = &(struct clk_regmap_div_data) {
+ .offset = CLKCTRL_MIPIDSI_PHY_CLK_CTRL,
+ .shift = 0,
+ .width = 7,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "dsi0_phy_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_dsi0_phy_mux.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT
+ },
+};
+
+static struct clk_regmap t7_dsi0_phy_gate = {
+ .data = &(struct clk_regmap_gate_data) {
+ .offset = CLKCTRL_MIPIDSI_PHY_CLK_CTRL,
+ .bit_idx = 8,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "dsi0_phy_gate",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_dsi0_phy_div.hw
+ },
+ .num_parents = 1,
+ /* config it in U-boot, ignore it to avoid display abnormal */
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+static struct clk_regmap t7_dsi1_phy_mux = {
+ .data = &(struct clk_regmap_mux_data) {
+ .offset = CLKCTRL_MIPIDSI_PHY_CLK_CTRL,
+ .mask = 0x3,
+ .shift = 25,
+ .table = t7_dsi_phy_table
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "dsi1_phy_mux",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_dsi_phy_parent_data,
+ .num_parents = ARRAY_SIZE(t7_dsi_phy_parent_data)
+ },
+};
+
+static struct clk_regmap t7_dsi1_phy_div = {
+ .data = &(struct clk_regmap_div_data) {
+ .offset = CLKCTRL_MIPIDSI_PHY_CLK_CTRL,
+ .shift = 16,
+ .width = 7,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "dsi1_phy_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_dsi1_phy_mux.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT
+ },
+};
+
+static struct clk_regmap t7_dsi1_phy_gate = {
+ .data = &(struct clk_regmap_gate_data) {
+ .offset = CLKCTRL_MIPIDSI_PHY_CLK_CTRL,
+ .bit_idx = 24,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "dsi1_phy_gate",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_dsi1_phy_div.hw
+ },
+ .num_parents = 1,
+ /* config it in U-boot, ignore it to avoid display abnormal */
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+ },
+};
+
+static struct clk_regmap t7_eth_rmii_sel = {
+ .data = &(struct clk_regmap_mux_data) {
+ .offset = CLKCTRL_ETH_CLK_CTRL,
+ .mask = 0x1,
+ .shift = 9,
+ .table = t7_dsi_phy_table
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "eth_rmii_sel",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = (const struct clk_parent_data []) {
+ { .fw_name = "fclk_div2", },
+ { .fw_name = "gp1_pll", }
+ },
+ .num_parents = 2
+ },
+};
+
+static struct clk_regmap t7_eth_rmii_div = {
+ .data = &(struct clk_regmap_div_data) {
+ .offset = CLKCTRL_ETH_CLK_CTRL,
+ .shift = 0,
+ .width = 7,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "eth_rmii_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_eth_rmii_sel.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT
+ },
+};
+
+static struct clk_regmap t7_eth_rmii = {
+ .data = &(struct clk_regmap_gate_data) {
+ .offset = CLKCTRL_ETH_CLK_CTRL,
+ .bit_idx = 8,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "eth_rmii",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_eth_rmii_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT
+ },
+};
+
+static struct clk_fixed_factor t7_eth_div8 = {
+ .mult = 1,
+ .div = 8,
+ .hw.init = &(struct clk_init_data){
+ .name = "eth_div8",
+ .ops = &clk_fixed_factor_ops,
+ .parent_data = &(const struct clk_parent_data) {
+ .fw_name = "fclk_div2",
+ },
+ .num_parents = 1,
+ },
+};
+
+static struct clk_regmap t7_eth_125m = {
+ .data = &(struct clk_regmap_gate_data) {
+ .offset = CLKCTRL_ETH_CLK_CTRL,
+ .bit_idx = 7,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "eth_125m",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_eth_div8.hw
+ },
+ .num_parents = 1,
+ },
+};
+
+static struct clk_regmap t7_saradc_mux = {
+ .data = &(struct clk_regmap_mux_data) {
+ .offset = CLKCTRL_SAR_CLK_CTRL0,
+ .mask = 0x3,
+ .shift = 9,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "saradc_mux",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = (const struct clk_parent_data []) {
+ { .fw_name = "xtal", },
+ { .hw = &t7_sys_clk.hw },
+ },
+ .num_parents = 2,
+ },
+};
+
+static struct clk_regmap t7_saradc_div = {
+ .data = &(struct clk_regmap_div_data) {
+ .offset = CLKCTRL_SAR_CLK_CTRL0,
+ .shift = 0,
+ .width = 8,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "saradc_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_saradc_mux.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_saradc_gate = {
+ .data = &(struct clk_regmap_gate_data) {
+ .offset = CLKCTRL_SAR_CLK_CTRL0,
+ .bit_idx = 8,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "saradc_clk",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_saradc_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+/* gen clk */
+static u32 t7_gen_clk_mux_table[] = { 0, 5, 6, 7, 19, 21, 22,
+ 23, 24, 25, 26, 27, 28 };
+
+static const struct clk_parent_data t7_gen_clk_parent_data[] = {
+ { .fw_name = "xtal", },
+ { .fw_name = "gp0_pll", },
+ { .fw_name = "gp1_pll", },
+ { .fw_name = "hifi_pll", },
+ { .fw_name = "fclk_div2", },
+ { .fw_name = "fclk_div3", },
+ { .fw_name = "fclk_div4", },
+ { .fw_name = "fclk_div5", },
+ { .fw_name = "fclk_div7", },
+ { .fw_name = "mpll0", },
+ { .fw_name = "mpll1", },
+ { .fw_name = "mpll2", },
+ { .fw_name = "mpll3", }
+};
+
+static struct clk_regmap t7_gen_sel = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = CLKCTRL_GEN_CLK_CTRL,
+ .mask = 0x1f,
+ .shift = 12,
+ .table = t7_gen_clk_mux_table,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "gen_sel",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = t7_gen_clk_parent_data,
+ .num_parents = ARRAY_SIZE(t7_gen_clk_parent_data),
+ },
+};
+
+static struct clk_regmap t7_gen_div = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = CLKCTRL_GEN_CLK_CTRL,
+ .shift = 0,
+ .width = 11,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "gen_div",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_gen_sel.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_gen = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = CLKCTRL_GEN_CLK_CTRL,
+ .bit_idx = 11,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "gen",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_gen_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+#define MESON_T7_SYS_GATE(_name, _reg, _bit) \
+struct clk_regmap _name = { \
+ .data = &(struct clk_regmap_gate_data) { \
+ .offset = (_reg), \
+ .bit_idx = (_bit), \
+ }, \
+ .hw.init = &(struct clk_init_data) { \
+ .name = #_name, \
+ .ops = &clk_regmap_gate_ops, \
+ .parent_hws = (const struct clk_hw *[]) { \
+ &t7_sys_clk.hw \
+ }, \
+ .num_parents = 1, \
+ .flags = CLK_IGNORE_UNUSED, \
+ }, \
+}
+
+/*CLKCTRL_SYS_CLK_EN0_REG0*/
+static MESON_T7_SYS_GATE(t7_ddr, CLKCTRL_SYS_CLK_EN0_REG0, 0);
+static MESON_T7_SYS_GATE(t7_dos, CLKCTRL_SYS_CLK_EN0_REG0, 1);
+static MESON_T7_SYS_GATE(t7_mipi_dsi_a, CLKCTRL_SYS_CLK_EN0_REG0, 2);
+static MESON_T7_SYS_GATE(t7_mipi_dsi_b, CLKCTRL_SYS_CLK_EN0_REG0, 3);
+static MESON_T7_SYS_GATE(t7_ethphy, CLKCTRL_SYS_CLK_EN0_REG0, 4);
+static MESON_T7_SYS_GATE(t7_mali, CLKCTRL_SYS_CLK_EN0_REG0, 6);
+static MESON_T7_SYS_GATE(t7_aocpu, CLKCTRL_SYS_CLK_EN0_REG0, 13);
+static MESON_T7_SYS_GATE(t7_aucpu, CLKCTRL_SYS_CLK_EN0_REG0, 14);
+static MESON_T7_SYS_GATE(t7_cec, CLKCTRL_SYS_CLK_EN0_REG0, 16);
+static MESON_T7_SYS_GATE(t7_gdc, CLKCTRL_SYS_CLK_EN0_REG0, 17);
+static MESON_T7_SYS_GATE(t7_deswarp, CLKCTRL_SYS_CLK_EN0_REG0, 18);
+static MESON_T7_SYS_GATE(t7_ampipe_nand, CLKCTRL_SYS_CLK_EN0_REG0, 19);
+static MESON_T7_SYS_GATE(t7_ampipe_eth, CLKCTRL_SYS_CLK_EN0_REG0, 20);
+static MESON_T7_SYS_GATE(t7_am2axi0, CLKCTRL_SYS_CLK_EN0_REG0, 21);
+static MESON_T7_SYS_GATE(t7_am2axi1, CLKCTRL_SYS_CLK_EN0_REG0, 22);
+static MESON_T7_SYS_GATE(t7_am2axi2, CLKCTRL_SYS_CLK_EN0_REG0, 23);
+static MESON_T7_SYS_GATE(t7_sdemmca, CLKCTRL_SYS_CLK_EN0_REG0, 24);
+static MESON_T7_SYS_GATE(t7_sdemmcb, CLKCTRL_SYS_CLK_EN0_REG0, 25);
+static MESON_T7_SYS_GATE(t7_sdemmcc, CLKCTRL_SYS_CLK_EN0_REG0, 26);
+static MESON_T7_SYS_GATE(t7_smartcard, CLKCTRL_SYS_CLK_EN0_REG0, 27);
+static MESON_T7_SYS_GATE(t7_acodec, CLKCTRL_SYS_CLK_EN0_REG0, 28);
+static MESON_T7_SYS_GATE(t7_spifc, CLKCTRL_SYS_CLK_EN0_REG0, 29);
+static MESON_T7_SYS_GATE(t7_msr_clk, CLKCTRL_SYS_CLK_EN0_REG0, 30);
+static MESON_T7_SYS_GATE(t7_ir_ctrl, CLKCTRL_SYS_CLK_EN0_REG0, 31);
+
+/*CLKCTRL_SYS_CLK_EN0_REG1*/
+static MESON_T7_SYS_GATE(t7_audio, CLKCTRL_SYS_CLK_EN0_REG1, 0);
+static MESON_T7_SYS_GATE(t7_eth, CLKCTRL_SYS_CLK_EN0_REG1, 3);
+static MESON_T7_SYS_GATE(t7_uart_a, CLKCTRL_SYS_CLK_EN0_REG1, 5);
+static MESON_T7_SYS_GATE(t7_uart_b, CLKCTRL_SYS_CLK_EN0_REG1, 6);
+static MESON_T7_SYS_GATE(t7_uart_c, CLKCTRL_SYS_CLK_EN0_REG1, 7);
+static MESON_T7_SYS_GATE(t7_uart_d, CLKCTRL_SYS_CLK_EN0_REG1, 8);
+static MESON_T7_SYS_GATE(t7_uart_e, CLKCTRL_SYS_CLK_EN0_REG1, 9);
+static MESON_T7_SYS_GATE(t7_uart_f, CLKCTRL_SYS_CLK_EN0_REG1, 10);
+static MESON_T7_SYS_GATE(t7_aififo, CLKCTRL_SYS_CLK_EN0_REG1, 11);
+static MESON_T7_SYS_GATE(t7_spicc2, CLKCTRL_SYS_CLK_EN0_REG1, 12);
+static MESON_T7_SYS_GATE(t7_spicc3, CLKCTRL_SYS_CLK_EN0_REG1, 13);
+static MESON_T7_SYS_GATE(t7_spicc4, CLKCTRL_SYS_CLK_EN0_REG1, 14);
+static MESON_T7_SYS_GATE(t7_ts_a73, CLKCTRL_SYS_CLK_EN0_REG1, 15);
+static MESON_T7_SYS_GATE(t7_ts_a53, CLKCTRL_SYS_CLK_EN0_REG1, 16);
+static MESON_T7_SYS_GATE(t7_spicc5, CLKCTRL_SYS_CLK_EN0_REG1, 17);
+static MESON_T7_SYS_GATE(t7_g2d, CLKCTRL_SYS_CLK_EN0_REG1, 20);
+static MESON_T7_SYS_GATE(t7_spicc0, CLKCTRL_SYS_CLK_EN0_REG1, 21);
+static MESON_T7_SYS_GATE(t7_spicc1, CLKCTRL_SYS_CLK_EN0_REG1, 22);
+static MESON_T7_SYS_GATE(t7_pcie, CLKCTRL_SYS_CLK_EN0_REG1, 24);
+static MESON_T7_SYS_GATE(t7_usb, CLKCTRL_SYS_CLK_EN0_REG1, 26);
+static MESON_T7_SYS_GATE(t7_pcie_phy, CLKCTRL_SYS_CLK_EN0_REG1, 27);
+static MESON_T7_SYS_GATE(t7_i2c_ao_a, CLKCTRL_SYS_CLK_EN0_REG1, 28);
+static MESON_T7_SYS_GATE(t7_i2c_ao_b, CLKCTRL_SYS_CLK_EN0_REG1, 29);
+static MESON_T7_SYS_GATE(t7_i2c_m_a, CLKCTRL_SYS_CLK_EN0_REG1, 30);
+static MESON_T7_SYS_GATE(t7_i2c_m_b, CLKCTRL_SYS_CLK_EN0_REG1, 31);
+
+/*CLKCTRL_SYS_CLK_EN0_REG2*/
+static MESON_T7_SYS_GATE(t7_i2c_m_c, CLKCTRL_SYS_CLK_EN0_REG2, 0);
+static MESON_T7_SYS_GATE(t7_i2c_m_d, CLKCTRL_SYS_CLK_EN0_REG2, 1);
+static MESON_T7_SYS_GATE(t7_i2c_m_e, CLKCTRL_SYS_CLK_EN0_REG2, 2);
+static MESON_T7_SYS_GATE(t7_i2c_m_f, CLKCTRL_SYS_CLK_EN0_REG2, 3);
+static MESON_T7_SYS_GATE(t7_hdmitx_apb, CLKCTRL_SYS_CLK_EN0_REG2, 4);
+static MESON_T7_SYS_GATE(t7_i2c_s_a, CLKCTRL_SYS_CLK_EN0_REG2, 5);
+static MESON_T7_SYS_GATE(t7_hdmirx_pclk, CLKCTRL_SYS_CLK_EN0_REG2, 8);
+static MESON_T7_SYS_GATE(t7_mmc_apb, CLKCTRL_SYS_CLK_EN0_REG2, 11);
+static MESON_T7_SYS_GATE(t7_mipi_isp_pclk, CLKCTRL_SYS_CLK_EN0_REG2, 17);
+static MESON_T7_SYS_GATE(t7_rsa, CLKCTRL_SYS_CLK_EN0_REG2, 18);
+static MESON_T7_SYS_GATE(t7_pclk_sys_cpu_apb, CLKCTRL_SYS_CLK_EN0_REG2, 19);
+static MESON_T7_SYS_GATE(t7_a73pclk_cpu_apb, CLKCTRL_SYS_CLK_EN0_REG2, 20);
+static MESON_T7_SYS_GATE(t7_dspa, CLKCTRL_SYS_CLK_EN0_REG2, 21);
+static MESON_T7_SYS_GATE(t7_dspb, CLKCTRL_SYS_CLK_EN0_REG2, 22);
+static MESON_T7_SYS_GATE(t7_vpu_intr, CLKCTRL_SYS_CLK_EN0_REG2, 25);
+static MESON_T7_SYS_GATE(t7_sar_adc, CLKCTRL_SYS_CLK_EN0_REG2, 28);
+static MESON_T7_SYS_GATE(t7_gic, CLKCTRL_SYS_CLK_EN0_REG2, 30);
+static MESON_T7_SYS_GATE(t7_ts_gpu, CLKCTRL_SYS_CLK_EN0_REG2, 31);
+
+/*CLKCTRL_SYS_CLK_EN0_REG3*/
+static MESON_T7_SYS_GATE(t7_ts_nna, CLKCTRL_SYS_CLK_EN0_REG3, 0);
+static MESON_T7_SYS_GATE(t7_ts_vpu, CLKCTRL_SYS_CLK_EN0_REG3, 1);
+static MESON_T7_SYS_GATE(t7_ts_hevc, CLKCTRL_SYS_CLK_EN0_REG3, 2);
+static MESON_T7_SYS_GATE(t7_pwm_ao_ab, CLKCTRL_SYS_CLK_EN0_REG3, 3);
+static MESON_T7_SYS_GATE(t7_pwm_ao_cd, CLKCTRL_SYS_CLK_EN0_REG3, 4);
+static MESON_T7_SYS_GATE(t7_pwm_ao_ef, CLKCTRL_SYS_CLK_EN0_REG3, 5);
+static MESON_T7_SYS_GATE(t7_pwm_ao_gh, CLKCTRL_SYS_CLK_EN0_REG3, 6);
+static MESON_T7_SYS_GATE(t7_pwm_ab, CLKCTRL_SYS_CLK_EN0_REG3, 7);
+static MESON_T7_SYS_GATE(t7_pwm_cd, CLKCTRL_SYS_CLK_EN0_REG3, 8);
+static MESON_T7_SYS_GATE(t7_pwm_ef, CLKCTRL_SYS_CLK_EN0_REG3, 9);
+
+/* Array of all clocks provided by this provider */
+static struct clk_hw *t7_periphs_hw_clks[] = {
+ [CLKID_RTC_32K_CLKIN] = &t7_rtc_32k_clkin.hw,
+ [CLKID_RTC_32K_DIV] = &t7_rtc_32k_div.hw,
+ [CLKID_RTC_32K_XATL] = &t7_rtc_32k_xtal.hw,
+ [CLKID_RTC_32K_MUX] = &t7_rtc_32k_sel.hw,
+ [CLKID_RTC_CLK] = &t7_rtc_clk.hw,
+ [CLKID_SYS_CLK_B_MUX] = &t7_sysclk_b_sel.hw,
+ [CLKID_SYS_CLK_B_DIV] = &t7_sysclk_b_div.hw,
+ [CLKID_SYS_CLK_B_GATE] = &t7_sysclk_b.hw,
+ [CLKID_SYS_CLK_A_MUX] = &t7_sysclk_a_sel.hw,
+ [CLKID_SYS_CLK_A_DIV] = &t7_sysclk_a_div.hw,
+ [CLKID_SYS_CLK_A_GATE] = &t7_sysclk_a.hw,
+ [CLKID_SYS_CLK] = &t7_sys_clk.hw,
+ [CLKID_CECA_32K_CLKIN] = &t7_ceca_32k_clkin.hw,
+ [CLKID_CECA_32K_DIV] = &t7_ceca_32k_div.hw,
+ [CLKID_CECA_32K_MUX_PRE] = &t7_ceca_32k_sel_pre.hw,
+ [CLKID_CECA_32K_MUX] = &t7_ceca_32k_sel.hw,
+ [CLKID_CECA_32K_CLKOUT] = &t7_ceca_32k_clkout.hw,
+ [CLKID_CECB_32K_CLKIN] = &t7_cecb_32k_clkin.hw,
+ [CLKID_CECB_32K_DIV] = &t7_cecb_32k_div.hw,
+ [CLKID_CECB_32K_MUX_PRE] = &t7_cecb_32k_sel_pre.hw,
+ [CLKID_CECB_32K_MUX] = &t7_cecb_32k_sel.hw,
+ [CLKID_CECB_32K_CLKOUT] = &t7_cecb_32k_clkout.hw,
+ [CLKID_SC_CLK_MUX] = &t7_sc_clk_mux.hw,
+ [CLKID_SC_CLK_DIV] = &t7_sc_clk_div.hw,
+ [CLKID_SC_CLK_GATE] = &t7_sc_clk_gate.hw,
+ [CLKID_DSPA_CLK_B_MUX] = &t7_dspa_b_mux.hw,
+ [CLKID_DSPA_CLK_B_DIV] = &t7_dspa_b_div.hw,
+ [CLKID_DSPA_CLK_B_GATE] = &t7_dspa_b_gate.hw,
+ [CLKID_DSPA_CLK_A_MUX] = &t7_dspa_a_mux.hw,
+ [CLKID_DSPA_CLK_A_DIV] = &t7_dspa_a_div.hw,
+ [CLKID_DSPA_CLK_A_GATE] = &t7_dspa_a_gate.hw,
+ [CLKID_DSPA_CLK] = &t7_dspa_mux.hw,
+ [CLKID_DSPB_CLK_B_MUX] = &t7_dspb_b_mux.hw,
+ [CLKID_DSPB_CLK_B_DIV] = &t7_dspb_b_div.hw,
+ [CLKID_DSPB_CLK_B_GATE] = &t7_dspb_b_gate.hw,
+ [CLKID_DSPB_CLK_A_MUX] = &t7_dspb_a_mux.hw,
+ [CLKID_DSPB_CLK_A_DIV] = &t7_dspb_a_div.hw,
+ [CLKID_DSPB_CLK_A_GATE] = &t7_dspb_a_gate.hw,
+ [CLKID_DSPB_CLK] = &t7_dspb_mux.hw,
+ [CLKID_24M_CLK_GATE] = &t7_24M_clk_gate.hw,
+ [CLKID_12M_CLK_DIV] = &t7_12M_clk_div.hw,
+ [CLKID_12M_CLK_GATE] = &t7_12M_clk_gate.hw,
+ [CLKID_25M_CLK_DIV] = &t7_25M_clk_div.hw,
+ [CLKID_25M_CLK_GATE] = &t7_25M_clk_gate.hw,
+ [CLKID_VID_PLL] = &t7_vid_pll_div.hw,
+ [CLKID_VID_PLL_MUX] = &t7_vid_pll_sel.hw,
+ [CLKID_VID_PLL] = &t7_vid_pll.hw,
+ [CLKID_VCLK_MUX] = &t7_vclk_sel.hw,
+ [CLKID_VCLK2_MUX] = &t7_vclk2_sel.hw,
+ [CLKID_VCLK_INPUT] = &t7_vclk_input.hw,
+ [CLKID_VCLK2_INPUT] = &t7_vclk2_input.hw,
+ [CLKID_VCLK_DIV] = &t7_vclk_div.hw,
+ [CLKID_VCLK2_DIV] = &t7_vclk2_div.hw,
+ [CLKID_VCLK] = &t7_vclk.hw,
+ [CLKID_VCLK2] = &t7_vclk2.hw,
+ [CLKID_VCLK_DIV1] = &t7_vclk_div1.hw,
+ [CLKID_VCLK_DIV2_EN] = &t7_vclk_div2_en.hw,
+ [CLKID_VCLK_DIV4_EN] = &t7_vclk_div4_en.hw,
+ [CLKID_VCLK_DIV6_EN] = &t7_vclk_div6_en.hw,
+ [CLKID_VCLK_DIV12_EN] = &t7_vclk_div12_en.hw,
+ [CLKID_VCLK2_DIV1] = &t7_vclk2_div1.hw,
+ [CLKID_VCLK2_DIV2_EN] = &t7_vclk2_div2_en.hw,
+ [CLKID_VCLK2_DIV4_EN] = &t7_vclk2_div4_en.hw,
+ [CLKID_VCLK2_DIV6_EN] = &t7_vclk2_div6_en.hw,
+ [CLKID_VCLK2_DIV12_EN] = &t7_vclk2_div12_en.hw,
+ [CLKID_VCLK_DIV2] = &t7_vclk_div2.hw,
+ [CLKID_VCLK_DIV4] = &t7_vclk_div4.hw,
+ [CLKID_VCLK_DIV6] = &t7_vclk_div6.hw,
+ [CLKID_VCLK_DIV12] = &t7_vclk_div12.hw,
+ [CLKID_VCLK2_DIV2] = &t7_vclk2_div2.hw,
+ [CLKID_VCLK2_DIV4] = &t7_vclk2_div4.hw,
+ [CLKID_VCLK2_DIV6] = &t7_vclk2_div6.hw,
+ [CLKID_VCLK2_DIV12] = &t7_vclk2_div12.hw,
+ [CLKID_CTS_ENCI_MUX] = &t7_cts_enci_sel.hw,
+ [CLKID_CTS_ENCP_MUX] = &t7_cts_encp_sel.hw,
+ [CLKID_CTS_VDAC_MUX] = &t7_cts_vdac_sel.hw,
+ [CLKID_HDMI_TX_MUX] = &t7_hdmi_tx_sel.hw,
+ [CLKID_CTS_ENCI] = &t7_cts_enci.hw,
+ [CLKID_CTS_ENCP] = &t7_cts_encp.hw,
+ [CLKID_CTS_VDAC] = &t7_cts_vdac.hw,
+ [CLKID_HDMI_TX] = &t7_hdmi_tx.hw,
+ [CLKID_HDMITX_SYS_MUX] = &t7_hdmitx_sys_sel.hw,
+ [CLKID_HDMITX_SYS_DIV] = &t7_hdmitx_sys_div.hw,
+ [CLKID_HDMITX_SYS] = &t7_hdmitx_sys.hw,
+ [CLKID_HDMITX_PRIF_MUX] = &t7_hdmitx_prif_sel.hw,
+ [CLKID_HDMITX_PRIF_DIV] = &t7_hdmitx_prif_div.hw,
+ [CLKID_HDMITX_PRIF] = &t7_hdmitx_prif.hw,
+ [CLKID_HDMITX_200M_MUX] = &t7_hdmitx_200m_sel.hw,
+ [CLKID_HDMITX_200M_DIV] = &t7_hdmitx_200m_div.hw,
+ [CLKID_HDMITX_200M] = &t7_hdmitx_200m.hw,
+ [CLKID_HDMITX_AUD_MUX] = &t7_hdmitx_aud_sel.hw,
+ [CLKID_HDMITX_AUD_DIV] = &t7_hdmitx_aud_div.hw,
+ [CLKID_HDMITX_AUD] = &t7_hdmitx_aud.hw,
+ [CLKID_HDMIRX_5M_MUX] = &t7_hdmirx_5m_sel.hw,
+ [CLKID_HDMIRX_5M_DIV] = &t7_hdmirx_5m_div.hw,
+ [CLKID_HDMIRX_5M] = &t7_hdmirx_5m.hw,
+ [CLKID_HDMIRX_2M_MUX] = &t7_hdmirx_2m_sel.hw,
+ [CLKID_HDMIRX_2M_DIV] = &t7_hdmirx_2m_div.hw,
+ [CLKID_HDMIRX_2M] = &t7_hdmirx_2m.hw,
+ [CLKID_HDMIRX_CFG_MUX] = &t7_hdmirx_cfg_sel.hw,
+ [CLKID_HDMIRX_CFG_DIV] = &t7_hdmirx_cfg_div.hw,
+ [CLKID_HDMIRX_CFG] = &t7_hdmirx_cfg.hw,
+ [CLKID_HDMIRX_HDCP_MUX] = &t7_hdmirx_hdcp_sel.hw,
+ [CLKID_HDMIRX_HDCP_DIV] = &t7_hdmirx_hdcp_div.hw,
+ [CLKID_HDMIRX_HDCP] = &t7_hdmirx_hdcp.hw,
+ [CLKID_HDMIRX_AUD_PLL_MUX] = &t7_hdmirx_aud_pll_sel.hw,
+ [CLKID_HDMIRX_AUD_PLL_DIV] = &t7_hdmirx_aud_pll_div.hw,
+ [CLKID_HDMIRX_AUD_PLL] = &t7_hdmirx_aud_pll.hw,
+ [CLKID_HDMIRX_ACR_MUX] = &t7_hdmirx_acr_sel.hw,
+ [CLKID_HDMIRX_ACR_DIV] = &t7_hdmirx_acr_div.hw,
+ [CLKID_HDMIRX_ACR] = &t7_hdmirx_acr.hw,
+ [CLKID_HDMIRX_METER_MUX] = &t7_hdmirx_meter_sel.hw,
+ [CLKID_HDMIRX_METER_DIV] = &t7_hdmirx_meter_div.hw,
+ [CLKID_HDMIRX_METER] = &t7_hdmirx_meter.hw,
+ [CLKID_TS_CLK_DIV] = &t7_ts_clk_div.hw,
+ [CLKID_TS_CLK_GATE] = &t7_ts_clk_gate.hw,
+ [CLKID_MALI_0_SEL] = &t7_mali_0_sel.hw,
+ [CLKID_MALI_0_DIV] = &t7_mali_0_div.hw,
+ [CLKID_MALI_0] = &t7_mali_0.hw,
+ [CLKID_MALI_1_SEL] = &t7_mali_1_sel.hw,
+ [CLKID_MALI_1_DIV] = &t7_mali_1_div.hw,
+ [CLKID_MALI_1] = &t7_mali_1.hw,
+ [CLKID_MALI_MUX] = &t7_mali_mux.hw,
+ [CLKID_VDEC_P0_MUX] = &t7_vdec_p0_mux.hw,
+ [CLKID_VDEC_P0_DIV] = &t7_vdec_p0_div.hw,
+ [CLKID_VDEC_P0] = &t7_vdec_p0.hw,
+ [CLKID_VDEC_P1_MUX] = &t7_vdec_p1_mux.hw,
+ [CLKID_VDEC_P1_DIV] = &t7_vdec_p1_div.hw,
+ [CLKID_VDEC_P1] = &t7_vdec_p1.hw,
+ [CLKID_VDEC_MUX] = &t7_vdec_mux.hw,
+ [CLKID_HCODEC_P0_MUX] = &t7_hcodec_p0_mux.hw,
+ [CLKID_HCODEC_P0_DIV] = &t7_hcodec_p0_div.hw,
+ [CLKID_HCODEC_P0] = &t7_hcodec_p0.hw,
+ [CLKID_HCODEC_P1_MUX] = &t7_hcodec_p1_mux.hw,
+ [CLKID_HCODEC_P1_DIV] = &t7_hcodec_p1_div.hw,
+ [CLKID_HCODEC_P1] = &t7_hcodec_p1.hw,
+ [CLKID_HCODEC_MUX] = &t7_hcodec_mux.hw,
+ [CLKID_HEVCB_P0_MUX] = &t7_hevcb_p0_mux.hw,
+ [CLKID_HEVCB_P0_DIV] = &t7_hevcb_p0_div.hw,
+ [CLKID_HEVCB_P0] = &t7_hevcb_p0.hw,
+ [CLKID_HEVCB_P1_MUX] = &t7_hevcb_p1_mux.hw,
+ [CLKID_HEVCB_P1_DIV] = &t7_hevcb_p1_div.hw,
+ [CLKID_HEVCB_P1] = &t7_hevcb_p1.hw,
+ [CLKID_HEVCB_MUX] = &t7_hevcb_mux.hw,
+ [CLKID_HEVCF_P0_MUX] = &t7_hevcf_p0_mux.hw,
+ [CLKID_HEVCF_P0_DIV] = &t7_hevcf_p0_div.hw,
+ [CLKID_HEVCF_P0] = &t7_hevcf_p0.hw,
+ [CLKID_HEVCF_P1_MUX] = &t7_hevcf_p1_mux.hw,
+ [CLKID_HEVCF_P1_DIV] = &t7_hevcf_p1_div.hw,
+ [CLKID_HEVCF_P1] = &t7_hevcf_p1.hw,
+ [CLKID_HEVCF_MUX] = &t7_hevcf_mux.hw,
+ [CLKID_WAVE_A_MUX] = &t7_wave_a_sel.hw,
+ [CLKID_WAVE_A_DIV] = &t7_wave_a_div.hw,
+ [CLKID_WAVE_A_GATE] = &t7_wave_aclk.hw,
+ [CLKID_WAVE_B_MUX] = &t7_wave_b_sel.hw,
+ [CLKID_WAVE_B_DIV] = &t7_wave_b_div.hw,
+ [CLKID_WAVE_B_GATE] = &t7_wave_bclk.hw,
+ [CLKID_WAVE_C_MUX] = &t7_wave_c_sel.hw,
+ [CLKID_WAVE_C_DIV] = &t7_wave_c_div.hw,
+ [CLKID_WAVE_C_GATE] = &t7_wave_cclk.hw,
+ [CLKID_MIPI_ISP_MUX] = &t7_mipi_isp_sel.hw,
+ [CLKID_MIPI_ISP_DIV] = &t7_mipi_isp_div.hw,
+ [CLKID_MIPI_ISP] = &t7_mipi_isp.hw,
+ [CLKID_MIPI_CSI_PHY_SEL0] = &t7_mipi_csi_phy_sel0.hw,
+ [CLKID_MIPI_CSI_PHY_DIV0] = &t7_mipi_csi_phy_div0.hw,
+ [CLKID_MIPI_CSI_PHY0] = &t7_mipi_csi_phy0.hw,
+ [CLKID_MIPI_CSI_PHY_SEL1] = &t7_mipi_csi_phy_sel1.hw,
+ [CLKID_MIPI_CSI_PHY_DIV1] = &t7_mipi_csi_phy_div1.hw,
+ [CLKID_MIPI_CSI_PHY1] = &t7_mipi_csi_phy1.hw,
+ [CLKID_MIPI_CSI_PHY_CLK] = &t7_mipi_csi_phy_clk.hw,
+ [CLKID_VPU_0_MUX] = &t7_vpu_0_sel.hw,
+ [CLKID_VPU_0_DIV] = &t7_vpu_0_div.hw,
+ [CLKID_VPU_0] = &t7_vpu_0.hw,
+ [CLKID_VPU_1_MUX] = &t7_vpu_1_sel.hw,
+ [CLKID_VPU_1_DIV] = &t7_vpu_1_div.hw,
+ [CLKID_VPU_1] = &t7_vpu_1.hw,
+ [CLKID_VPU] = &t7_vpu.hw,
+ [CLKID_VPU_CLKB_TMP_MUX] = &t7_vpu_clkb_tmp_mux.hw,
+ [CLKID_VPU_CLKB_TMP_DIV] = &t7_vpu_clkb_tmp_div.hw,
+ [CLKID_VPU_CLKB_TMP] = &t7_vpu_clkb_tmp.hw,
+ [CLKID_VPU_CLKB_DIV] = &t7_vpu_clkb_div.hw,
+ [CLKID_VPU_CLKB] = &t7_vpu_clkb.hw,
+ [CLKID_VPU_CLKC_P0_MUX] = &t7_vpu_clkc_p0_mux.hw,
+ [CLKID_VPU_CLKC_P0_DIV] = &t7_vpu_clkc_p0_div.hw,
+ [CLKID_VPU_CLKC_P0] = &t7_vpu_clkc_p0.hw,
+ [CLKID_VPU_CLKC_P1_MUX] = &t7_vpu_clkc_p1_mux.hw,
+ [CLKID_VPU_CLKC_P1_DIV] = &t7_vpu_clkc_p1_div.hw,
+ [CLKID_VPU_CLKC_P1] = &t7_vpu_clkc_p1.hw,
+ [CLKID_VPU_CLKC_MUX] = &t7_vpu_clkc_mux.hw,
+ [CLKID_VAPB_0_MUX] = &t7_vapb_0_sel.hw,
+ [CLKID_VAPB_0_DIV] = &t7_vapb_0_div.hw,
+ [CLKID_VAPB_0] = &t7_vapb_0.hw,
+ [CLKID_VAPB_1_MUX] = &t7_vapb_1_sel.hw,
+ [CLKID_VAPB_1_DIV] = &t7_vapb_1_div.hw,
+ [CLKID_VAPB_1] = &t7_vapb_1.hw,
+ [CLKID_VAPB] = &t7_vapb.hw,
+ [CLKID_GDCCLK_0_MUX] = &t7_gdcclk_0_sel.hw,
+ [CLKID_GDCCLK_0_DIV] = &t7_gdcclk_0_div.hw,
+ [CLKID_GDCCLK_0] = &t7_gdcclk_0.hw,
+ [CLKID_GDCCLK_1_MUX] = &t7_gdcclk_1_sel.hw,
+ [CLKID_GDCCLK_1_DIV] = &t7_gdcclk_1_div.hw,
+ [CLKID_GDCCLK_1] = &t7_gdcclk_1.hw,
+ [CLKID_GDCCLK] = &t7_gdcclk.hw,
+ [CLKID_GDC_CLK] = &t7_gdc_clk.hw,
+ [CLKID_DEWARPCLK_0_MUX] = &t7_dewarpclk_0_sel.hw,
+ [CLKID_DEWARPCLK_0_DIV] = &t7_dewarpclk_0_div.hw,
+ [CLKID_DEWARPCLK_0] = &t7_dewarpclk_0.hw,
+ [CLKID_DEWARPCLK_1_MUX] = &t7_dewarpclk_1_sel.hw,
+ [CLKID_DEWARPCLK_1_DIV] = &t7_dewarpclk_1_div.hw,
+ [CLKID_DEWARPCLK_1] = &t7_dewarpclk_1.hw,
+ [CLKID_DEWARPCLK] = &t7_dewarpclk.hw,
+ [CLKID_DEWARP_CLK] = &t7_dewarp_clk.hw,
+ [CLKID_ANAKIN_0_MUX] = &t7_anakin_0_sel.hw,
+ [CLKID_ANAKIN_0_DIV] = &t7_anakin_0_div.hw,
+ [CLKID_ANAKIN_0] = &t7_anakin_0.hw,
+ [CLKID_ANAKIN_1_MUX] = &t7_anakin_1_sel.hw,
+ [CLKID_ANAKIN_1_DIV] = &t7_anakin_1_div.hw,
+ [CLKID_ANAKIN_1] = &t7_anakin_1.hw,
+ [CLKID_ANAKIN] = &t7_anakin.hw,
+ [CLKID_ANAKIN_CLK] = &t7_anakin_clk.hw,
+ [CLKID_GE2D] = &t7_ge2d_gate.hw,
+ [CLKID_VDIN_MEAS_MUX] = &t7_vdin_meas_mux.hw,
+ [CLKID_VDIN_MEAS_DIV] = &t7_vdin_meas_div.hw,
+ [CLKID_VDIN_MEAS_GATE] = &t7_vdin_meas_gate.hw,
+ [CLKID_VID_LOCK_DIV] = &t7_vid_lock_div.hw,
+ [CLKID_VID_LOCK] = &t7_vid_lock_clk.hw,
+ [CLKID_PWM_A_MUX] = &t7_pwm_a_mux.hw,
+ [CLKID_PWM_A_DIV] = &t7_pwm_a_div.hw,
+ [CLKID_PWM_A_GATE] = &t7_pwm_a_gate.hw,
+ [CLKID_PWM_B_MUX] = &t7_pwm_b_mux.hw,
+ [CLKID_PWM_B_DIV] = &t7_pwm_b_div.hw,
+ [CLKID_PWM_B_GATE] = &t7_pwm_b_gate.hw,
+ [CLKID_PWM_C_MUX] = &t7_pwm_c_mux.hw,
+ [CLKID_PWM_C_DIV] = &t7_pwm_c_div.hw,
+ [CLKID_PWM_C_GATE] = &t7_pwm_c_gate.hw,
+ [CLKID_PWM_D_MUX] = &t7_pwm_d_mux.hw,
+ [CLKID_PWM_D_DIV] = &t7_pwm_d_div.hw,
+ [CLKID_PWM_D_GATE] = &t7_pwm_d_gate.hw,
+ [CLKID_PWM_E_MUX] = &t7_pwm_e_mux.hw,
+ [CLKID_PWM_E_DIV] = &t7_pwm_e_div.hw,
+ [CLKID_PWM_E_GATE] = &t7_pwm_e_gate.hw,
+ [CLKID_PWM_F_MUX] = &t7_pwm_f_mux.hw,
+ [CLKID_PWM_F_DIV] = &t7_pwm_f_div.hw,
+ [CLKID_PWM_F_GATE] = &t7_pwm_f_gate.hw,
+ [CLKID_PWM_AO_A_MUX] = &t7_pwm_ao_a_mux.hw,
+ [CLKID_PWM_AO_A_DIV] = &t7_pwm_ao_a_div.hw,
+ [CLKID_PWM_AO_A_GATE] = &t7_pwm_ao_a_gate.hw,
+ [CLKID_PWM_AO_B_MUX] = &t7_pwm_ao_b_mux.hw,
+ [CLKID_PWM_AO_B_DIV] = &t7_pwm_ao_b_div.hw,
+ [CLKID_PWM_AO_B_GATE] = &t7_pwm_ao_b_gate.hw,
+ [CLKID_PWM_AO_C_MUX] = &t7_pwm_ao_c_mux.hw,
+ [CLKID_PWM_AO_C_DIV] = &t7_pwm_ao_c_div.hw,
+ [CLKID_PWM_AO_C_GATE] = &t7_pwm_ao_c_gate.hw,
+ [CLKID_PWM_AO_D_MUX] = &t7_pwm_ao_d_mux.hw,
+ [CLKID_PWM_AO_D_DIV] = &t7_pwm_ao_d_div.hw,
+ [CLKID_PWM_AO_D_GATE] = &t7_pwm_ao_d_gate.hw,
+ [CLKID_PWM_AO_E_MUX] = &t7_pwm_ao_e_mux.hw,
+ [CLKID_PWM_AO_E_DIV] = &t7_pwm_ao_e_div.hw,
+ [CLKID_PWM_AO_E_GATE] = &t7_pwm_ao_e_gate.hw,
+ [CLKID_PWM_AO_F_MUX] = &t7_pwm_ao_f_mux.hw,
+ [CLKID_PWM_AO_F_DIV] = &t7_pwm_ao_f_div.hw,
+ [CLKID_PWM_AO_F_GATE] = &t7_pwm_ao_f_gate.hw,
+ [CLKID_PWM_AO_G_MUX] = &t7_pwm_ao_g_mux.hw,
+ [CLKID_PWM_AO_G_DIV] = &t7_pwm_ao_g_div.hw,
+ [CLKID_PWM_AO_G_GATE] = &t7_pwm_ao_g_gate.hw,
+ [CLKID_PWM_AO_H_MUX] = &t7_pwm_ao_h_mux.hw,
+ [CLKID_PWM_AO_H_DIV] = &t7_pwm_ao_h_div.hw,
+ [CLKID_PWM_AO_H_GATE] = &t7_pwm_ao_h_gate.hw,
+ [CLKID_SPICC0_MUX] = &t7_spicc0_mux.hw,
+ [CLKID_SPICC0_DIV] = &t7_spicc0_div.hw,
+ [CLKID_SPICC0_GATE] = &t7_spicc0_gate.hw,
+ [CLKID_SPICC1_MUX] = &t7_spicc1_mux.hw,
+ [CLKID_SPICC1_DIV] = &t7_spicc1_div.hw,
+ [CLKID_SPICC1_GATE] = &t7_spicc1_gate.hw,
+ [CLKID_SPICC2_MUX] = &t7_spicc2_mux.hw,
+ [CLKID_SPICC2_DIV] = &t7_spicc2_div.hw,
+ [CLKID_SPICC2_GATE] = &t7_spicc2_gate.hw,
+ [CLKID_SPICC3_MUX] = &t7_spicc3_mux.hw,
+ [CLKID_SPICC3_DIV] = &t7_spicc3_div.hw,
+ [CLKID_SPICC3_GATE] = &t7_spicc3_gate.hw,
+ [CLKID_SPICC4_MUX] = &t7_spicc4_mux.hw,
+ [CLKID_SPICC4_DIV] = &t7_spicc4_div.hw,
+ [CLKID_SPICC4_GATE] = &t7_spicc4_gate.hw,
+ [CLKID_SPICC5_MUX] = &t7_spicc5_mux.hw,
+ [CLKID_SPICC5_DIV] = &t7_spicc5_div.hw,
+ [CLKID_SPICC5_GATE] = &t7_spicc5_gate.hw,
+ [CLKID_SD_EMMC_C_CLK_MUX] = &t7_sd_emmc_c_clk0_sel.hw,
+ [CLKID_SD_EMMC_C_CLK_DIV] = &t7_sd_emmc_c_clk0_div.hw,
+ [CLKID_SD_EMMC_C_CLK] = &t7_sd_emmc_c_clk0.hw,
+ [CLKID_SD_EMMC_A_CLK_MUX] = &t7_sd_emmc_a_clk0_sel.hw,
+ [CLKID_SD_EMMC_A_CLK_DIV] = &t7_sd_emmc_a_clk0_div.hw,
+ [CLKID_SD_EMMC_A_CLK] = &t7_sd_emmc_a_clk0.hw,
+ [CLKID_SD_EMMC_B_CLK_MUX] = &t7_sd_emmc_b_clk0_sel.hw,
+ [CLKID_SD_EMMC_B_CLK_DIV] = &t7_sd_emmc_b_clk0_div.hw,
+ [CLKID_SD_EMMC_B_CLK] = &t7_sd_emmc_b_clk0.hw,
+ [CLKID_DSI_A_MEAS_MUX] = &t7_dsi_a_meas_mux.hw,
+ [CLKID_DSI_A_MEAS_DIV] = &t7_dsi_a_meas_div.hw,
+ [CLKID_DSI_A_MEAS_GATE] = &t7_dsi_a_meas_gate.hw,
+ [CLKID_DSI_B_MEAS_MUX] = &t7_dsi_b_meas_mux.hw,
+ [CLKID_DSI_B_MEAS_DIV] = &t7_dsi_b_meas_div.hw,
+ [CLKID_DSI_B_MEAS_GATE] = &t7_dsi_b_meas_gate.hw,
+ [CLKID_DSI0_PHY_MUX] = &t7_dsi0_phy_mux.hw,
+ [CLKID_DSI0_PHY_DIV] = &t7_dsi0_phy_div.hw,
+ [CLKID_DSI0_PHY_GATE] = &t7_dsi0_phy_gate.hw,
+ [CLKID_DSI1_PHY_MUX] = &t7_dsi1_phy_mux.hw,
+ [CLKID_DSI1_PHY_DIV] = &t7_dsi1_phy_div.hw,
+ [CLKID_DSI1_PHY_GATE] = &t7_dsi1_phy_gate.hw,
+ [CLKID_ETH_RMII_SEL] = &t7_eth_rmii_sel.hw,
+ [CLKID_ETH_RMII_DIV] = &t7_eth_rmii_div.hw,
+ [CLKID_ETH_RMII] = &t7_eth_rmii.hw,
+ [CLKID_ETH_DIV8] = &t7_eth_div8.hw,
+ [CLKID_ETH_125M] = &t7_eth_125m.hw,
+ [CLKID_SARADC_MUX] = &t7_saradc_mux.hw,
+ [CLKID_SARADC_DIV] = &t7_saradc_div.hw,
+ [CLKID_SARADC_GATE] = &t7_saradc_gate.hw,
+ [CLKID_GEN_MUX] = &t7_gen_sel.hw,
+ [CLKID_GEN_DIV] = &t7_gen_div.hw,
+ [CLKID_GEN_GATE] = &t7_gen.hw,
+ [CLKID_DDR] = &t7_ddr.hw,
+ [CLKID_DOS] = &t7_dos.hw,
+ [CLKID_MIPI_DSI_A] = &t7_mipi_dsi_a.hw,
+ [CLKID_MIPI_DSI_B] = &t7_mipi_dsi_b.hw,
+ [CLKID_ETHPHY] = &t7_ethphy.hw,
+ [CLKID_MALI] = &t7_mali.hw,
+ [CLKID_AOCPU] = &t7_aocpu.hw,
+ [CLKID_AUCPU] = &t7_aucpu.hw,
+ [CLKID_CEC] = &t7_cec.hw,
+ [CLKID_GDC] = &t7_gdc.hw,
+ [CLKID_DESWARP] = &t7_deswarp.hw,
+ [CLKID_AMPIPE_NAND] = &t7_ampipe_nand.hw,
+ [CLKID_AMPIPE_ETH] = &t7_ampipe_eth.hw,
+ [CLKID_AM2AXI0] = &t7_am2axi0.hw,
+ [CLKID_AM2AXI1] = &t7_am2axi1.hw,
+ [CLKID_AM2AXI2] = &t7_am2axi2.hw,
+ [CLKID_SD_EMMC_A] = &t7_sdemmca.hw,
+ [CLKID_SD_EMMC_B] = &t7_sdemmcb.hw,
+ [CLKID_SD_EMMC_C] = &t7_sdemmcc.hw,
+ [CLKID_SMARTCARD] = &t7_smartcard.hw,
+ [CLKID_ACODEC] = &t7_acodec.hw,
+ [CLKID_SPIFC] = &t7_spifc.hw,
+ [CLKID_MSR_CLK] = &t7_msr_clk.hw,
+ [CLKID_IR_CTRL] = &t7_ir_ctrl.hw,
+ [CLKID_AUDIO] = &t7_audio.hw,
+ [CLKID_ETH] = &t7_eth.hw,
+ [CLKID_UART_A] = &t7_uart_a.hw,
+ [CLKID_UART_B] = &t7_uart_b.hw,
+ [CLKID_UART_C] = &t7_uart_c.hw,
+ [CLKID_UART_D] = &t7_uart_d.hw,
+ [CLKID_UART_E] = &t7_uart_e.hw,
+ [CLKID_UART_F] = &t7_uart_f.hw,
+ [CLKID_AIFIFO] = &t7_aififo.hw,
+ [CLKID_SPICC2] = &t7_spicc2.hw,
+ [CLKID_SPICC3] = &t7_spicc3.hw,
+ [CLKID_SPICC4] = &t7_spicc4.hw,
+ [CLKID_TS_A73] = &t7_ts_a73.hw,
+ [CLKID_TS_A53] = &t7_ts_a53.hw,
+ [CLKID_SPICC5] = &t7_spicc5.hw,
+ [CLKID_G2D] = &t7_g2d.hw,
+ [CLKID_SPICC0] = &t7_spicc0.hw,
+ [CLKID_SPICC1] = &t7_spicc1.hw,
+ [CLKID_PCIE] = &t7_pcie.hw,
+ [CLKID_USB] = &t7_usb.hw,
+ [CLKID_PCIE_PHY] = &t7_pcie_phy.hw,
+ [CLKID_I2C_AO_A] = &t7_i2c_ao_a.hw,
+ [CLKID_I2C_AO_B] = &t7_i2c_ao_b.hw,
+ [CLKID_I2C_M_A] = &t7_i2c_m_a.hw,
+ [CLKID_I2C_M_B] = &t7_i2c_m_b.hw,
+ [CLKID_I2C_M_C] = &t7_i2c_m_c.hw,
+ [CLKID_I2C_M_D] = &t7_i2c_m_d.hw,
+ [CLKID_I2C_M_E] = &t7_i2c_m_e.hw,
+ [CLKID_I2C_M_F] = &t7_i2c_m_f.hw,
+ [CLKID_HDMITX_APB] = &t7_hdmitx_apb.hw,
+ [CLKID_I2C_S_A] = &t7_i2c_s_a.hw,
+ [CLKID_HDMIRX_PCLK] = &t7_hdmirx_pclk.hw,
+ [CLKID_MMC_APB] = &t7_mmc_apb.hw,
+ [CLKID_MIPI_ISP_PCLK] = &t7_mipi_isp_pclk.hw,
+ [CLKID_RSA] = &t7_rsa.hw,
+ [CLKID_PCLK_SYS_CPU_APB] = &t7_pclk_sys_cpu_apb.hw,
+ [CLKID_A73PCLK_CPU_APB] = &t7_a73pclk_cpu_apb.hw,
+ [CLKID_DSPA] = &t7_dspa.hw,
+ [CLKID_DSPB] = &t7_dspb.hw,
+ [CLKID_VPU_INTR] = &t7_vpu_intr.hw,
+ [CLKID_SAR_ADC] = &t7_sar_adc.hw,
+ [CLKID_GIC] = &t7_gic.hw,
+ [CLKID_TS_GPU] = &t7_ts_gpu.hw,
+ [CLKID_TS_NNA] = &t7_ts_nna.hw,
+ [CLKID_TS_VPU] = &t7_ts_vpu.hw,
+ [CLKID_TS_HEVC] = &t7_ts_hevc.hw,
+ [CLKID_PWM_AB] = &t7_pwm_ab.hw,
+ [CLKID_PWM_CD] = &t7_pwm_cd.hw,
+ [CLKID_PWM_EF] = &t7_pwm_ef.hw,
+ [CLKID_PWM_AO_AB] = &t7_pwm_ao_ab.hw,
+ [CLKID_PWM_AO_CD] = &t7_pwm_ao_cd.hw,
+ [CLKID_PWM_AO_EF] = &t7_pwm_ao_ef.hw,
+ [CLKID_PWM_AO_GH] = &t7_pwm_ao_gh.hw,
+};
+
+/* Convenience table to populate regmap in .probe */
+static struct clk_regmap *const t7_clk_regmaps[] = {
+ &t7_rtc_32k_clkin,
+ &t7_rtc_32k_div,
+ &t7_rtc_32k_xtal,
+ &t7_rtc_32k_sel,
+ &t7_rtc_clk,
+ &t7_sysclk_b_sel,
+ &t7_sysclk_b_div,
+ &t7_sysclk_b,
+ &t7_sysclk_a_sel,
+ &t7_sysclk_a_div,
+ &t7_sysclk_a,
+ &t7_sys_clk,
+ &t7_ceca_32k_clkin,
+ &t7_ceca_32k_div,
+ &t7_ceca_32k_sel_pre,
+ &t7_ceca_32k_sel,
+ &t7_ceca_32k_clkout,
+ &t7_cecb_32k_clkin,
+ &t7_cecb_32k_div,
+ &t7_cecb_32k_sel_pre,
+ &t7_cecb_32k_sel,
+ &t7_cecb_32k_clkout,
+ &t7_sc_clk_mux,
+ &t7_sc_clk_div,
+ &t7_sc_clk_gate,
+ &t7_dspa_a_mux,
+ &t7_dspa_a_div,
+ &t7_dspa_a_gate,
+ &t7_dspa_b_mux,
+ &t7_dspa_b_div,
+ &t7_dspa_b_gate,
+ &t7_dspa_mux,
+ &t7_dspb_a_mux,
+ &t7_dspb_a_div,
+ &t7_dspb_a_gate,
+ &t7_dspb_b_mux,
+ &t7_dspb_b_div,
+ &t7_dspb_b_gate,
+ &t7_dspb_mux,
+ &t7_24M_clk_gate,
+ &t7_12M_clk_gate,
+ &t7_25M_clk_div,
+ &t7_25M_clk_gate,
+ &t7_vid_pll_div,
+ &t7_vid_pll_sel,
+ &t7_vid_pll,
+ &t7_vclk_sel,
+ &t7_vclk2_sel,
+ &t7_vclk_input,
+ &t7_vclk2_input,
+ &t7_vclk_div,
+ &t7_vclk2_div,
+ &t7_vclk,
+ &t7_vclk2,
+ &t7_vclk_div1,
+ &t7_vclk_div2_en,
+ &t7_vclk_div4_en,
+ &t7_vclk_div6_en,
+ &t7_vclk_div12_en,
+ &t7_vclk2_div1,
+ &t7_vclk2_div2_en,
+ &t7_vclk2_div4_en,
+ &t7_vclk2_div6_en,
+ &t7_vclk2_div12_en,
+ &t7_cts_enci_sel,
+ &t7_cts_encp_sel,
+ &t7_cts_vdac_sel,
+ &t7_hdmi_tx_sel,
+ &t7_cts_enci,
+ &t7_cts_encp,
+ &t7_cts_vdac,
+ &t7_hdmi_tx,
+ &t7_hdmitx_sys_sel,
+ &t7_hdmitx_sys_div,
+ &t7_hdmitx_sys,
+ &t7_hdmitx_prif_sel,
+ &t7_hdmitx_prif_div,
+ &t7_hdmitx_prif,
+ &t7_hdmitx_200m_sel,
+ &t7_hdmitx_200m_div,
+ &t7_hdmitx_200m,
+ &t7_hdmitx_aud_sel,
+ &t7_hdmitx_aud_div,
+ &t7_hdmitx_aud,
+ &t7_hdmirx_5m_sel,
+ &t7_hdmirx_5m_div,
+ &t7_hdmirx_5m,
+ &t7_hdmirx_2m_sel,
+ &t7_hdmirx_2m_div,
+ &t7_hdmirx_2m,
+ &t7_hdmirx_cfg_sel,
+ &t7_hdmirx_cfg_div,
+ &t7_hdmirx_cfg,
+ &t7_hdmirx_hdcp_sel,
+ &t7_hdmirx_hdcp_div,
+ &t7_hdmirx_hdcp,
+ &t7_hdmirx_aud_pll_sel,
+ &t7_hdmirx_aud_pll_div,
+ &t7_hdmirx_aud_pll,
+ &t7_hdmirx_acr_sel,
+ &t7_hdmirx_acr_div,
+ &t7_hdmirx_acr,
+ &t7_hdmirx_meter_sel,
+ &t7_hdmirx_meter_div,
+ &t7_hdmirx_meter,
+ &t7_ts_clk_div,
+ &t7_ts_clk_gate,
+ &t7_mali_0_sel,
+ &t7_mali_0_div,
+ &t7_mali_0,
+ &t7_mali_1_sel,
+ &t7_mali_1_div,
+ &t7_mali_1,
+ &t7_mali_mux,
+ &t7_vdec_p0_mux,
+ &t7_vdec_p0_div,
+ &t7_vdec_p0,
+ &t7_vdec_p1_mux,
+ &t7_vdec_p1_div,
+ &t7_vdec_p1,
+ &t7_vdec_mux,
+ &t7_hcodec_p0_mux,
+ &t7_hcodec_p0_div,
+ &t7_hcodec_p0,
+ &t7_hcodec_p1_mux,
+ &t7_hcodec_p1_div,
+ &t7_hcodec_p1,
+ &t7_hcodec_mux,
+ &t7_hevcb_p0_mux,
+ &t7_hevcb_p0_div,
+ &t7_hevcb_p0,
+ &t7_hevcb_p1_mux,
+ &t7_hevcb_p1_div,
+ &t7_hevcb_p1,
+ &t7_hevcb_mux,
+ &t7_hevcf_p0_mux,
+ &t7_hevcf_p0_div,
+ &t7_hevcf_p0,
+ &t7_hevcf_p1_mux,
+ &t7_hevcf_p1_div,
+ &t7_hevcf_p1,
+ &t7_hevcf_mux,
+ &t7_wave_a_sel,
+ &t7_wave_a_div,
+ &t7_wave_aclk,
+ &t7_wave_b_sel,
+ &t7_wave_b_div,
+ &t7_wave_bclk,
+ &t7_wave_c_sel,
+ &t7_wave_c_div,
+ &t7_wave_cclk,
+ &t7_mipi_isp_sel,
+ &t7_mipi_isp_div,
+ &t7_mipi_isp,
+ &t7_mipi_csi_phy_sel0,
+ &t7_mipi_csi_phy_div0,
+ &t7_mipi_csi_phy0,
+ &t7_mipi_csi_phy_sel1,
+ &t7_mipi_csi_phy_div1,
+ &t7_mipi_csi_phy1,
+ &t7_mipi_csi_phy_clk,
+ &t7_vpu_0_sel,
+ &t7_vpu_0_div,
+ &t7_vpu_0,
+ &t7_vpu_1_sel,
+ &t7_vpu_1_div,
+ &t7_vpu_1,
+ &t7_vpu,
+ &t7_vpu_clkb_tmp_mux,
+ &t7_vpu_clkb_tmp_div,
+ &t7_vpu_clkb_tmp,
+ &t7_vpu_clkb_div,
+ &t7_vpu_clkb,
+ &t7_vpu_clkc_p0_mux,
+ &t7_vpu_clkc_p0_div,
+ &t7_vpu_clkc_p0,
+ &t7_vpu_clkc_p1_mux,
+ &t7_vpu_clkc_p1_div,
+ &t7_vpu_clkc_p1,
+ &t7_vpu_clkc_mux,
+ &t7_vapb_0_sel,
+ &t7_vapb_0_div,
+ &t7_vapb_0,
+ &t7_vapb_1_sel,
+ &t7_vapb_1_div,
+ &t7_vapb_1,
+ &t7_vapb,
+ &t7_gdcclk_0_sel,
+ &t7_gdcclk_0_div,
+ &t7_gdcclk_0,
+ &t7_gdcclk_1_sel,
+ &t7_gdcclk_1_div,
+ &t7_gdcclk_1,
+ &t7_gdcclk,
+ &t7_gdc_clk,
+ &t7_dewarpclk_0_sel,
+ &t7_dewarpclk_0_div,
+ &t7_dewarpclk_0,
+ &t7_dewarpclk_1_sel,
+ &t7_dewarpclk_1_div,
+ &t7_dewarpclk_1,
+ &t7_dewarpclk,
+ &t7_dewarp_clk,
+ &t7_anakin_0_sel,
+ &t7_anakin_0_div,
+ &t7_anakin_0,
+ &t7_anakin_1_sel,
+ &t7_anakin_1_div,
+ &t7_anakin_1,
+ &t7_anakin,
+ &t7_anakin_clk,
+ &t7_ge2d_gate,
+ &t7_vdin_meas_mux,
+ &t7_vdin_meas_div,
+ &t7_vdin_meas_gate,
+ &t7_vid_lock_div,
+ &t7_vid_lock_clk,
+ &t7_pwm_a_mux,
+ &t7_pwm_a_div,
+ &t7_pwm_a_gate,
+ &t7_pwm_b_mux,
+ &t7_pwm_b_div,
+ &t7_pwm_b_gate,
+ &t7_pwm_c_mux,
+ &t7_pwm_c_div,
+ &t7_pwm_c_gate,
+ &t7_pwm_d_mux,
+ &t7_pwm_d_div,
+ &t7_pwm_d_gate,
+ &t7_pwm_e_mux,
+ &t7_pwm_e_div,
+ &t7_pwm_e_gate,
+ &t7_pwm_f_mux,
+ &t7_pwm_f_div,
+ &t7_pwm_f_gate,
+ &t7_pwm_ao_a_mux,
+ &t7_pwm_ao_a_div,
+ &t7_pwm_ao_a_gate,
+ &t7_pwm_ao_b_mux,
+ &t7_pwm_ao_b_div,
+ &t7_pwm_ao_b_gate,
+ &t7_pwm_ao_c_mux,
+ &t7_pwm_ao_c_div,
+ &t7_pwm_ao_c_gate,
+ &t7_pwm_ao_d_mux,
+ &t7_pwm_ao_d_div,
+ &t7_pwm_ao_d_gate,
+ &t7_pwm_ao_e_mux,
+ &t7_pwm_ao_e_div,
+ &t7_pwm_ao_e_gate,
+ &t7_pwm_ao_f_mux,
+ &t7_pwm_ao_f_div,
+ &t7_pwm_ao_f_gate,
+ &t7_pwm_ao_g_mux,
+ &t7_pwm_ao_g_div,
+ &t7_pwm_ao_g_gate,
+ &t7_pwm_ao_h_mux,
+ &t7_pwm_ao_h_div,
+ &t7_pwm_ao_h_gate,
+ &t7_spicc0_mux,
+ &t7_spicc0_div,
+ &t7_spicc0_gate,
+ &t7_spicc1_mux,
+ &t7_spicc1_div,
+ &t7_spicc1_gate,
+ &t7_spicc2_mux,
+ &t7_spicc2_div,
+ &t7_spicc2_gate,
+ &t7_spicc3_mux,
+ &t7_spicc3_div,
+ &t7_spicc3_gate,
+ &t7_spicc4_mux,
+ &t7_spicc4_div,
+ &t7_spicc4_gate,
+ &t7_spicc5_mux,
+ &t7_spicc5_div,
+ &t7_spicc5_gate,
+ &t7_sd_emmc_c_clk0_sel,
+ &t7_sd_emmc_c_clk0_div,
+ &t7_sd_emmc_c_clk0,
+ &t7_sd_emmc_a_clk0_sel,
+ &t7_sd_emmc_a_clk0_div,
+ &t7_sd_emmc_a_clk0,
+ &t7_sd_emmc_b_clk0_sel,
+ &t7_sd_emmc_b_clk0_div,
+ &t7_sd_emmc_b_clk0,
+ &t7_eth_rmii_sel,
+ &t7_eth_rmii_div,
+ &t7_eth_rmii,
+ &t7_eth_125m,
+ &t7_dsi_a_meas_mux,
+ &t7_dsi_a_meas_div,
+ &t7_dsi_a_meas_gate,
+ &t7_dsi_b_meas_mux,
+ &t7_dsi_b_meas_div,
+ &t7_dsi_b_meas_gate,
+ &t7_dsi0_phy_mux,
+ &t7_dsi0_phy_div,
+ &t7_dsi0_phy_gate,
+ &t7_dsi1_phy_mux,
+ &t7_dsi1_phy_div,
+ &t7_dsi1_phy_gate,
+ &t7_saradc_mux,
+ &t7_saradc_div,
+ &t7_saradc_gate,
+ &t7_gen_sel,
+ &t7_gen_div,
+ &t7_gen,
+
+ &t7_ddr,
+ &t7_dos,
+ &t7_mipi_dsi_a,
+ &t7_mipi_dsi_b,
+ &t7_ethphy,
+ &t7_mali,
+ &t7_aocpu,
+ &t7_aucpu,
+ &t7_cec,
+ &t7_gdc,
+ &t7_deswarp,
+ &t7_ampipe_nand,
+ &t7_ampipe_eth,
+ &t7_am2axi0,
+ &t7_am2axi1,
+ &t7_am2axi2,
+ &t7_sdemmca,
+ &t7_sdemmcb,
+ &t7_sdemmcc,
+ &t7_smartcard,
+ &t7_acodec,
+ &t7_spifc,
+ &t7_msr_clk,
+ &t7_ir_ctrl,
+ &t7_audio,
+ &t7_eth,
+ &t7_uart_a,
+ &t7_uart_b,
+ &t7_uart_c,
+ &t7_uart_d,
+ &t7_uart_e,
+ &t7_uart_f,
+ &t7_aififo,
+ &t7_spicc2,
+ &t7_spicc3,
+ &t7_spicc4,
+ &t7_ts_a73,
+ &t7_ts_a53,
+ &t7_spicc5,
+ &t7_g2d,
+ &t7_spicc0,
+ &t7_spicc1,
+ &t7_pcie,
+ &t7_usb,
+ &t7_pcie_phy,
+ &t7_i2c_ao_a,
+ &t7_i2c_ao_b,
+ &t7_i2c_m_a,
+ &t7_i2c_m_b,
+ &t7_i2c_m_c,
+ &t7_i2c_m_d,
+ &t7_i2c_m_e,
+ &t7_i2c_m_f,
+ &t7_hdmitx_apb,
+ &t7_i2c_s_a,
+ &t7_hdmirx_pclk,
+ &t7_mmc_apb,
+ &t7_mipi_isp_pclk,
+ &t7_rsa,
+ &t7_pclk_sys_cpu_apb,
+ &t7_a73pclk_cpu_apb,
+ &t7_dspa,
+ &t7_dspb,
+ &t7_vpu_intr,
+ &t7_sar_adc,
+ &t7_gic,
+ &t7_ts_gpu,
+ &t7_ts_nna,
+ &t7_ts_vpu,
+ &t7_ts_hevc,
+ &t7_pwm_ab,
+ &t7_pwm_cd,
+ &t7_pwm_ef,
+ &t7_pwm_ao_ab,
+ &t7_pwm_ao_cd,
+ &t7_pwm_ao_ef,
+ &t7_pwm_ao_gh,
+};
+
+static struct regmap_config clkc_regmap_config = {
+ .reg_bits = 32,
+ .val_bits = 32,
+ .reg_stride = 4,
+};
+
+static struct meson_clk_hw_data t7_periphs_clks = {
+ .hws = t7_periphs_hw_clks,
+ .num = ARRAY_SIZE(t7_periphs_hw_clks),
+};
+
+static int amlogic_a1_periphs_probe(struct platform_device *pdev)
+{
+ struct device *dev = &pdev->dev;
+ struct regmap *regmap;
+ void __iomem *base;
+ int ret, i;
+
+ base = devm_platform_ioremap_resource(pdev, 0);
+ if (IS_ERR(base))
+ return dev_err_probe(dev, PTR_ERR(base), "can't ioremap resource\n");
+
+ regmap = devm_regmap_init_mmio(dev, base, &clkc_regmap_config);
+ if (IS_ERR(regmap))
+ return dev_err_probe(dev, PTR_ERR(regmap), "can't init regmap mmio region\n");
+
+ /* Populate regmap for the regmap backed clocks */
+ for (i = 0; i < ARRAY_SIZE(t7_clk_regmaps); i++)
+ t7_clk_regmaps[i]->map = regmap;
+
+ for (i = 0; i < t7_periphs_clks.num; i++) {
+ /* array might be sparse */
+ if (!t7_periphs_clks.hws[i])
+ continue;
+
+ ret = devm_clk_hw_register(dev, t7_periphs_clks.hws[i]);
+ if (ret)
+ return dev_err_probe(dev, ret, "clock[%d] registration failed\n", i);
+ }
+
+ return devm_of_clk_add_hw_provider(dev, meson_clk_hw_get, &t7_periphs_clks);
+}
+
+static const struct of_device_id t7_periphs_clkc_match_table[] = {
+ { .compatible = "amlogic,t7-peripherals-clkc", },
+ {}
+};
+MODULE_DEVICE_TABLE(of, t7_periphs_clkc_match_table);
+
+static struct platform_driver t7_periphs_clkc_driver = {
+ .probe = amlogic_a1_periphs_probe,
+ .driver = {
+ .name = "t7-periphs-clkc",
+ .of_match_table = t7_periphs_clkc_match_table,
+ },
+};
+
+module_platform_driver(t7_periphs_clkc_driver);
+MODULE_AUTHOR("Yu Tu <[email protected]>");
+MODULE_AUTHOR("Lucas Tanure <[email protected]>");
+MODULE_LICENSE("GPL");
diff --git a/drivers/clk/meson/t7-peripherals.h b/drivers/clk/meson/t7-peripherals.h
new file mode 100644
index 000000000000..0ac5e0919b5e
--- /dev/null
+++ b/drivers/clk/meson/t7-peripherals.h
@@ -0,0 +1,131 @@
+/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
+/*
+ * Copyright (c) 2019 Amlogic, Inc. All rights reserved.
+ */
+
+#ifndef __T7_PERIPHERALS_H
+#define __T7_PERIPHERALS_H
+
+/* basic clk: 0xfe000000 */
+#define CLKCTRL_OSCIN_CTRL (0x0001 << 2)
+#define CLKCTRL_RTC_BY_OSCIN_CTRL0 (0x0002 << 2)
+#define CLKCTRL_RTC_BY_OSCIN_CTRL1 (0x0003 << 2)
+#define CLKCTRL_RTC_CTRL (0x0004 << 2)
+#define CLKCTRL_CHECK_CLK_RESULT (0x0005 << 2)
+#define CLKCTRL_MBIST_ATSPEED_CTRL (0x0006 << 2)
+#define CLKCTRL_LOCK_BIT_REG0 (0x0008 << 2)
+#define CLKCTRL_LOCK_BIT_REG1 (0x0009 << 2)
+#define CLKCTRL_LOCK_BIT_REG2 (0x000a << 2)
+#define CLKCTRL_LOCK_BIT_REG3 (0x000b << 2)
+#define CLKCTRL_PROT_BIT_REG0 (0x000c << 2)
+#define CLKCTRL_PROT_BIT_REG1 (0x000d << 2)
+#define CLKCTRL_PROT_BIT_REG2 (0x000e << 2)
+#define CLKCTRL_PROT_BIT_REG3 (0x000f << 2)
+#define CLKCTRL_SYS_CLK_CTRL0 (0x0010 << 2)
+#define CLKCTRL_SYS_CLK_EN0_REG0 (0x0011 << 2)
+#define CLKCTRL_SYS_CLK_EN0_REG1 (0x0012 << 2)
+#define CLKCTRL_SYS_CLK_EN0_REG2 (0x0013 << 2)
+#define CLKCTRL_SYS_CLK_EN0_REG3 (0x0014 << 2)
+#define CLKCTRL_SYS_CLK_EN1_REG0 (0x0015 << 2)
+#define CLKCTRL_SYS_CLK_EN1_REG1 (0x0016 << 2)
+#define CLKCTRL_SYS_CLK_EN1_REG2 (0x0017 << 2)
+#define CLKCTRL_SYS_CLK_EN1_REG3 (0x0018 << 2)
+#define CLKCTRL_SYS_CLK_VPU_EN0 (0x0019 << 2)
+#define CLKCTRL_SYS_CLK_VPU_EN1 (0x001a << 2)
+#define CLKCTRL_AXI_CLK_CTRL0 (0x001b << 2)
+#define CLKCTRL_TST_CTRL0 (0x0020 << 2)
+#define CLKCTRL_TST_CTRL1 (0x0021 << 2)
+#define CLKCTRL_CECA_CTRL0 (0x0022 << 2)
+#define CLKCTRL_CECA_CTRL1 (0x0023 << 2)
+#define CLKCTRL_CECB_CTRL0 (0x0024 << 2)
+#define CLKCTRL_CECB_CTRL1 (0x0025 << 2)
+#define CLKCTRL_SC_CLK_CTRL (0x0026 << 2)
+#define CLKCTRL_DSPA_CLK_CTRL0 (0x0027 << 2)
+#define CLKCTRL_DSPB_CLK_CTRL0 (0x0028 << 2)
+#define CLKCTRL_CLK12_24_CTRL (0x002a << 2)
+#define CLKCTRL_ANAKIN_CLK_CTRL (0x002b << 2)
+#define CLKCTRL_GDC_CLK_CTRL (0x002c << 2)
+#define CLKCTRL_AMLGDC_CLK_CTRL (0x002d << 2)
+#define CLKCTRL_VID_CLK0_CTRL (0x0030 << 2)
+#define CLKCTRL_VID_CLK0_CTRL2 (0x0031 << 2)
+#define CLKCTRL_VID_CLK0_DIV (0x0032 << 2)
+#define CLKCTRL_VIID_CLK0_DIV (0x0033 << 2)
+#define CLKCTRL_VIID_CLK0_CTRL (0x0034 << 2)
+#define CLKCTRL_ENC0_HDMI_CLK_CTRL (0x0035 << 2)
+#define CLKCTRL_ENC2_HDMI_CLK_CTRL (0x0036 << 2)
+#define CLKCTRL_ENC_HDMI_CLK_CTRL (0x0037 << 2)
+#define CLKCTRL_HDMI_CLK_CTRL (0x0038 << 2)
+#define CLKCTRL_VID_PLL_CLK0_DIV (0x0039 << 2)
+#define CLKCTRL_VPU_CLK_CTRL (0x003a << 2)
+#define CLKCTRL_VPU_CLKB_CTRL (0x003b << 2)
+#define CLKCTRL_VPU_CLKC_CTRL (0x003c << 2)
+#define CLKCTRL_VID_LOCK_CLK_CTRL (0x003d << 2)
+#define CLKCTRL_VDIN_MEAS_CLK_CTRL (0x003e << 2)
+#define CLKCTRL_VAPBCLK_CTRL (0x003f << 2)
+#define CLKCTRL_MIPIDSI_PHY_CLK_CTRL (0x0041 << 2)
+#define CLKCTRL_MIPI_CSI_PHY_CLK_CTRL (0x0043 << 2)
+#define CLKCTRL_MIPI_ISP_CLK_CTRL (0x0044 << 2)
+#define CLKCTRL_WAVE420L_CLK_CTRL (0x0045 << 2)
+#define CLKCTRL_WAVE420L_CLK_CTRL2 (0x0046 << 2)
+#define CLKCTRL_HTX_CLK_CTRL0 (0x0047 << 2)
+#define CLKCTRL_HTX_CLK_CTRL1 (0x0048 << 2)
+#define CLKCTRL_HRX_CLK_CTRL0 (0x004a << 2)
+#define CLKCTRL_HRX_CLK_CTRL1 (0x004b << 2)
+#define CLKCTRL_HRX_CLK_CTRL2 (0x004c << 2)
+#define CLKCTRL_HRX_CLK_CTRL3 (0x004d << 2)
+#define CLKCTRL_VDEC_CLK_CTRL (0x0050 << 2)
+#define CLKCTRL_VDEC2_CLK_CTRL (0x0051 << 2)
+#define CLKCTRL_VDEC3_CLK_CTRL (0x0052 << 2)
+#define CLKCTRL_VDEC4_CLK_CTRL (0x0053 << 2)
+#define CLKCTRL_WAVE521_CLK_CTRL (0x0054 << 2)
+#define CLKCTRL_WAVE521_CLK_CTRL2 (0x0055 << 2)
+#define CLKCTRL_TS_CLK_CTRL (0x0056 << 2)
+#define CLKCTRL_MALI_CLK_CTRL (0x0057 << 2)
+#define CLKCTRL_VIPNANOQ_CLK_CTRL (0x0058 << 2)
+#define CLKCTRL_ETH_CLK_CTRL (0x0059 << 2)
+#define CLKCTRL_NAND_CLK_CTRL (0x005a << 2)
+#define CLKCTRL_SD_EMMC_CLK_CTRL (0x005b << 2)
+#define CLKCTRL_BT656_CLK_CTRL (0x005c << 2)
+#define CLKCTRL_SPICC_CLK_CTRL (0x005d << 2)
+#define CLKCTRL_GEN_CLK_CTRL (0x005e << 2)
+#define CLKCTRL_SAR_CLK_CTRL0 (0x005f << 2)
+#define CLKCTRL_PWM_CLK_AB_CTRL (0x0060 << 2)
+#define CLKCTRL_PWM_CLK_CD_CTRL (0x0061 << 2)
+#define CLKCTRL_PWM_CLK_EF_CTRL (0x0062 << 2)
+#define CLKCTRL_PWM_CLK_AO_AB_CTRL (0x0068 << 2)
+#define CLKCTRL_PWM_CLK_AO_CD_CTRL (0x0069 << 2)
+#define CLKCTRL_PWM_CLK_AO_EF_CTRL (0x006a << 2)
+#define CLKCTRL_PWM_CLK_AO_GH_CTRL (0x006b << 2)
+#define CLKCTRL_SPICC_CLK_CTRL1 (0x0070 << 2)
+#define CLKCTRL_SPICC_CLK_CTRL2 (0x0071 << 2)
+#define CLKCTRL_VID_CLK1_CTRL (0x0073 << 2)
+#define CLKCTRL_VID_CLK1_CTRL2 (0x0074 << 2)
+#define CLKCTRL_VID_CLK1_DIV (0x0075 << 2)
+#define CLKCTRL_VIID_CLK1_DIV (0x0076 << 2)
+#define CLKCTRL_VIID_CLK1_CTRL (0x0077 << 2)
+#define CLKCTRL_VID_CLK2_CTRL (0x0078 << 2)
+#define CLKCTRL_VID_CLK2_CTRL2 (0x0079 << 2)
+#define CLKCTRL_VID_CLK2_DIV (0x007a << 2)
+#define CLKCTRL_VIID_CLK2_DIV (0x007b << 2)
+#define CLKCTRL_VIID_CLK2_CTRL (0x007c << 2)
+#define CLKCTRL_VID_PLL_CLK1_DIV (0x007d << 2)
+#define CLKCTRL_VID_PLL_CLK2_DIV (0x007e << 2)
+#define CLKCTRL_MIPI_DSI_MEAS_CLK_CTRL (0x0080 << 2)
+#define CLKCTRL_TIMESTAMP_CTRL (0x0100 << 2)
+#define CLKCTRL_TIMESTAMP_CTRL1 (0x0101 << 2)
+#define CLKCTRL_TIMESTAMP_CTRL2 (0x0103 << 2)
+#define CLKCTRL_TIMESTAMP_RD0 (0x0104 << 2)
+#define CLKCTRL_TIMESTAMP_RD1 (0x0105 << 2)
+#define CLKCTRL_TIMEBASE_CTRL0 (0x0106 << 2)
+#define CLKCTRL_TIMEBASE_CTRL1 (0x0107 << 2)
+#define CLKCTRL_EFUSE_CPU_CFG01 (0x0120 << 2)
+#define CLKCTRL_EFUSE_CPU_CFG2 (0x0121 << 2)
+#define CLKCTRL_EFUSE_ENCP_CFG0 (0x0122 << 2)
+#define CLKCTRL_EFUSE_MALI_CFG01 (0x0123 << 2)
+#define CLKCTRL_EFUSE_HEVCB_CFG01 (0x0124 << 2)
+#define CLKCTRL_EFUSE_HEVCB_CFG2 (0x0125 << 2)
+#define CLKCTRL_EFUSE_LOCK (0x0126 << 2)
+#define CLKCTRL_EFUSE_A73_CFG01 (0x0127 << 2)
+#define CLKCTRL_EFUSE_A73_CFG2 (0x0128 << 2)
+
+#endif /* __T7_PERIPHERALS_H */
diff --git a/drivers/clk/meson/t7-pll.c b/drivers/clk/meson/t7-pll.c
new file mode 100644
index 000000000000..bd18df5e965a
--- /dev/null
+++ b/drivers/clk/meson/t7-pll.c
@@ -0,0 +1,1543 @@
+// SPDX-License-Identifier: (GPL-2.0-only OR MIT)
+/*
+ * Amlogic T7 PLL Clock Controller Driver
+ *
+ * Copyright (c) 2022-2023 Amlogic, inc. All rights reserved
+ * Author: Yu Tu <[email protected]>
+ */
+#include <linux/clk-provider.h>
+#include <linux/of_device.h>
+#include <linux/platform_device.h>
+
+#include "clk-mpll.h"
+#include "clk-pll.h"
+#include "clk-regmap.h"
+#include "t7-pll.h"
+#include "meson-clkc-utils.h"
+#include <dt-bindings/clock/amlogic,t7-pll-clkc.h>
+
+static DEFINE_SPINLOCK(meson_clk_lock);
+
+static struct clk_regmap t7_fixed_pll_dco = {
+ .data = &(struct meson_clk_pll_data){
+ .en = {
+ .reg_off = ANACTRL_FIXPLL_CTRL0,
+ .shift = 28,
+ .width = 1,
+ },
+ .m = {
+ .reg_off = ANACTRL_FIXPLL_CTRL0,
+ .shift = 0,
+ .width = 8,
+ },
+ .n = {
+ .reg_off = ANACTRL_FIXPLL_CTRL0,
+ .shift = 10,
+ .width = 5,
+ },
+ .frac = {
+ .reg_off = ANACTRL_FIXPLL_CTRL1,
+ .shift = 0,
+ .width = 19,
+ },
+ .l = {
+ .reg_off = ANACTRL_FIXPLL_CTRL0,
+ .shift = 31,
+ .width = 1,
+ },
+ .rst = {
+ .reg_off = ANACTRL_FIXPLL_CTRL0,
+ .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,
+ .flags = CLK_IS_CRITICAL | CLK_GET_RATE_NOCACHE,
+ },
+};
+
+static struct clk_regmap t7_fixed_pll = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = ANACTRL_FIXPLL_CTRL0,
+ .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 *[]) {
+ &t7_fixed_pll_dco.hw
+ },
+ .num_parents = 1,
+ /*
+ * This clock won't ever change at runtime so
+ * CLK_SET_RATE_PARENT is not required
+ */
+ .flags = CLK_IS_CRITICAL | CLK_GET_RATE_NOCACHE,
+ },
+};
+
+static const struct clk_ops meson_pll_clk_no_ops = {};
+
+/*
+ * the sys pll DCO value should be 3G~6G,
+ * otherwise the sys pll can not lock.
+ * od is for 32 bit.
+ */
+
+static const struct pll_params_table t7_sys_pll_params_table[] = {
+ PLL_PARAMS(67, 1), /*DCO=1608M OD=1608MM*/
+ PLL_PARAMS(71, 1), /*DCO=1704MM OD=1704M*/
+ PLL_PARAMS(75, 1), /*DCO=1800M OD=1800M*/
+ PLL_PARAMS(126, 1), /*DCO=3024 OD=1512M*/
+ PLL_PARAMS(116, 1), /*DCO=2784 OD=1392M*/
+ PLL_PARAMS(118, 1), /*DCO=2832M OD=1416M*/
+ PLL_PARAMS(100, 1), /*DCO=2400M OD=1200M*/
+ PLL_PARAMS(79, 1), /*DCO=1896M OD=1896M*/
+ PLL_PARAMS(80, 1), /*DCO=1920M OD=1920M*/
+ PLL_PARAMS(84, 1), /*DCO=2016M OD=2016M*/
+ PLL_PARAMS(92, 1), /*DCO=2208M OD=2208M*/
+ {0, 0},
+};
+
+static struct clk_regmap t7_sys_pll_dco = {
+ .data = &(struct meson_clk_pll_data){
+ .en = {
+ .reg_off = ANACTRL_SYS0PLL_CTRL0,
+ .shift = 28,
+ .width = 1,
+ },
+ .m = {
+ .reg_off = ANACTRL_SYS0PLL_CTRL0,
+ .shift = 0,
+ .width = 8,
+ },
+ .n = {
+ .reg_off = ANACTRL_SYS0PLL_CTRL0,
+ .shift = 16,
+ .width = 5,
+ },
+ .l = {
+ .reg_off = ANACTRL_SYS0PLL_CTRL0,
+ .shift = 31,
+ .width = 1,
+ },
+ .rst = {
+ .reg_off = ANACTRL_SYS0PLL_CTRL0,
+ .shift = 29,
+ .width = 1,
+ },
+ .table = t7_sys_pll_params_table,
+ },
+ .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 t7_sys1_pll_dco = {
+ .data = &(struct meson_clk_pll_data){
+ .en = {
+ .reg_off = ANACTRL_SYS1PLL_CTRL0,
+ .shift = 28,
+ .width = 1,
+ },
+ .m = {
+ .reg_off = ANACTRL_SYS1PLL_CTRL0,
+ .shift = 0,
+ .width = 8,
+ },
+ .n = {
+ .reg_off = ANACTRL_SYS1PLL_CTRL0,
+ .shift = 16,
+ .width = 5,
+ },
+ .table = t7_sys_pll_params_table,
+ .l = {
+ .reg_off = ANACTRL_SYS1PLL_CTRL0,
+ .shift = 31,
+ .width = 1,
+ },
+ .rst = {
+ .reg_off = ANACTRL_SYS1PLL_CTRL0,
+ .shift = 29,
+ .width = 1,
+ },
+ },
+ .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 t7_sys_pll = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = ANACTRL_SYS0PLL_CTRL0,
+ .shift = 12,
+ .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 *[]) {
+ &t7_sys_pll_dco.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_sys1_pll = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = ANACTRL_SYS1PLL_CTRL0,
+ .shift = 12,
+ .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 *[]) {
+ &t7_sys1_pll_dco.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_fixed_factor t7_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 *[]) { &t7_fixed_pll.hw },
+ .num_parents = 1,
+ },
+};
+
+static struct clk_regmap t7_fclk_div2 = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = ANACTRL_FIXPLL_CTRL1,
+ .bit_idx = 24,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "fclk_div2",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_fclk_div2_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_IS_CRITICAL,
+ },
+};
+
+static struct clk_fixed_factor t7_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 *[]) { &t7_fixed_pll.hw },
+ .num_parents = 1,
+ },
+};
+
+static struct clk_regmap t7_fclk_div3 = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = ANACTRL_FIXPLL_CTRL1,
+ .bit_idx = 20,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "fclk_div3",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_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,
+ },
+};
+
+static struct clk_fixed_factor t7_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 *[]) { &t7_fixed_pll.hw },
+ .num_parents = 1,
+ },
+};
+
+static struct clk_regmap t7_fclk_div4 = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = ANACTRL_FIXPLL_CTRL1,
+ .bit_idx = 21,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "fclk_div4",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_fclk_div4_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_IS_CRITICAL,
+ },
+};
+
+static struct clk_fixed_factor t7_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 *[]) { &t7_fixed_pll.hw },
+ .num_parents = 1,
+ },
+};
+
+static struct clk_regmap t7_fclk_div5 = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = ANACTRL_FIXPLL_CTRL1,
+ .bit_idx = 22,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "fclk_div5",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_fclk_div5_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_IS_CRITICAL,
+ },
+};
+
+static struct clk_fixed_factor t7_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 *[]) { &t7_fixed_pll.hw },
+ .num_parents = 1,
+ },
+};
+
+static struct clk_regmap t7_fclk_div7 = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = ANACTRL_FIXPLL_CTRL1,
+ .bit_idx = 23,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "fclk_div7",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_fclk_div7_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_IS_CRITICAL,
+ },
+};
+
+static struct clk_fixed_factor t7_fclk_div2p5_div = {
+ .mult = 2,
+ .div = 5,
+ .hw.init = &(struct clk_init_data){
+ .name = "fclk_div2p5_div",
+ .ops = &clk_fixed_factor_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_fixed_pll.hw
+ },
+ .num_parents = 1,
+ },
+};
+
+static struct clk_regmap t7_fclk_div2p5 = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = ANACTRL_FIXPLL_CTRL1,
+ .bit_idx = 25,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "fclk_div2p5",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_fclk_div2p5_div.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_IS_CRITICAL,
+ },
+};
+
+static const struct pll_params_table t7_gp0_pll_table[] = {
+ PLL_PARAMS(141, 1), /* DCO = 3384M OD = 2 PLL = 846M */
+ PLL_PARAMS(132, 1), /* DCO = 3168M OD = 2 PLL = 792M */
+ PLL_PARAMS(248, 1), /* DCO = 5952M OD = 3 PLL = 744M */
+ PLL_PARAMS(96, 1), /* DCO = 2304M OD = 1 PLL = 1152M */
+ { /* sentinel */ }
+};
+
+/*
+ * Internal gp0 pll emulation configuration parameters
+ */
+static const struct reg_sequence t7_gp0_init_regs[] = {
+ { .reg = ANACTRL_GP0PLL_CTRL1, .def = 0x00000000 },
+ { .reg = ANACTRL_GP0PLL_CTRL2, .def = 0x00000000 },
+ { .reg = ANACTRL_GP0PLL_CTRL3, .def = 0x48681c00 },
+ { .reg = ANACTRL_GP0PLL_CTRL4, .def = 0x88770290 },
+ { .reg = ANACTRL_GP0PLL_CTRL5, .def = 0x3927200a },
+ { .reg = ANACTRL_GP0PLL_CTRL6, .def = 0x56540000 }
+};
+
+static struct clk_regmap t7_gp0_pll_dco = {
+ .data = &(struct meson_clk_pll_data){
+ .en = {
+ .reg_off = ANACTRL_GP0PLL_CTRL0,
+ .shift = 28,
+ .width = 1,
+ },
+ .m = {
+ .reg_off = ANACTRL_GP0PLL_CTRL0,
+ .shift = 0,
+ .width = 8,
+ },
+ .n = {
+ .reg_off = ANACTRL_GP0PLL_CTRL0,
+ .shift = 10,
+ .width = 5,
+ },
+ .frac = {
+ .reg_off = ANACTRL_GP0PLL_CTRL1,
+ .shift = 0,
+ .width = 19,
+ },
+ .l = {
+ .reg_off = ANACTRL_GP0PLL_CTRL0,
+ .shift = 31,
+ .width = 1,
+ },
+ .rst = {
+ .reg_off = ANACTRL_GP0PLL_CTRL0,
+ .shift = 29,
+ .width = 1,
+ },
+ .table = t7_gp0_pll_table,
+ .init_regs = t7_gp0_init_regs,
+ .init_count = ARRAY_SIZE(t7_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,
+ .flags = CLK_GET_RATE_NOCACHE,
+ },
+};
+
+static struct clk_regmap t7_gp0_pll = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = ANACTRL_GP0PLL_CTRL0,
+ .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 *[]) {
+ &t7_gp0_pll_dco.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
+ },
+};
+
+static const struct pll_params_table t7_gp1_pll_table[] = {
+ PLL_PARAMS(100, 1), /*DCO=4800M OD=1200M*/
+ PLL_PARAMS(125, 1), /*DCO=3000M OD=1500M*/
+ { /* sentinel */ }
+};
+
+static const struct reg_sequence t7_gp1_init_regs[] = {
+ { .reg = ANACTRL_GP1PLL_CTRL1, .def = 0x1420500f },
+ { .reg = ANACTRL_GP1PLL_CTRL2, .def = 0x00023001 },
+ { .reg = ANACTRL_GP1PLL_CTRL3, .def = 0x0, .delay_us = 20 },
+};
+
+static struct clk_regmap t7_gp1_pll_dco = {
+ .data = &(struct meson_clk_pll_data){
+ .en = {
+ .reg_off = ANACTRL_GP1PLL_CTRL0,
+ .shift = 28,
+ .width = 1,
+ },
+ .m = {
+ .reg_off = ANACTRL_GP1PLL_CTRL0,
+ .shift = 0,
+ .width = 8,
+ },
+ .n = {
+ .reg_off = ANACTRL_GP1PLL_CTRL0,
+ .shift = 16,
+ .width = 5,
+ },
+ .l = {
+ .reg_off = ANACTRL_GP1PLL_CTRL0,
+ .shift = 31,
+ .width = 1,
+ },
+ .rst = {
+ .reg_off = ANACTRL_GP1PLL_CTRL0,
+ .shift = 29,
+ .width = 1,
+ },
+ .table = t7_gp1_pll_table,
+ .init_regs = t7_gp1_init_regs,
+ .init_count = ARRAY_SIZE(t7_gp1_init_regs)
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "gp1_pll_dco",
+ .ops = &meson_clk_pll_ops,
+ .parent_data = &(const struct clk_parent_data) {
+ .fw_name = "xtal",
+ },
+ .num_parents = 1,
+ /* This clock feeds the DSU, avoid disabling it */
+ .flags = CLK_GET_RATE_NOCACHE,
+ },
+};
+
+static struct clk_regmap t7_gp1_pll = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = ANACTRL_GP1PLL_CTRL0,
+ .shift = 12,
+ .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_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_gp1_pll_dco.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
+ },
+};
+
+static const struct pll_params_table t7_mclk_pll_table[] = {
+ PLL_PARAMS(99, 1), /* DCO = 2376M OD = 1 PLL = 1152M */
+ PLL_PARAMS(100, 1), /* DCO = 2400M */
+ { /* sentinel */ }
+};
+
+static const struct reg_sequence t7_mclk_init_regs[] = {
+ { .reg = ANACTRL_MCLK_PLL_CNTL0, .def = 0x20011064, .delay_us = 20 },
+ { .reg = ANACTRL_MCLK_PLL_CNTL0, .def = 0x30011064 },
+ { .reg = ANACTRL_MCLK_PLL_CNTL1, .def = 0x1470500f },
+ { .reg = ANACTRL_MCLK_PLL_CNTL2, .def = 0x00023041 },
+ { .reg = ANACTRL_MCLK_PLL_CNTL3, .def = 0x18180000 },
+ { .reg = ANACTRL_MCLK_PLL_CNTL4, .def = 0x00180303 },
+ { .reg = ANACTRL_MCLK_PLL_CNTL0, .def = 0x10011064, .delay_us = 20 },
+ { .reg = ANACTRL_MCLK_PLL_CNTL2, .def = 0x00023001, .delay_us = 20 }
+};
+
+static struct clk_regmap t7_mclk_pll_dco = {
+ .data = &(struct meson_clk_pll_data){
+ .en = {
+ .reg_off = ANACTRL_MCLK_PLL_CNTL0,
+ .shift = 28,
+ .width = 1,
+ },
+ .m = {
+ .reg_off = ANACTRL_MCLK_PLL_CNTL0,
+ .shift = 0,
+ .width = 8,
+ },
+ .n = {
+ .reg_off = ANACTRL_MCLK_PLL_CNTL0,
+ .shift = 16,
+ .width = 5,
+ },
+ .l = {
+ .reg_off = ANACTRL_MCLK_PLL_CNTL0,
+ .shift = 31,
+ .width = 1,
+ },
+ .rst = {
+ .reg_off = ANACTRL_MCLK_PLL_CNTL0,
+ .shift = 29,
+ .width = 1,
+ },
+ .table = t7_mclk_pll_table,
+ .init_regs = t7_mclk_init_regs,
+ .init_count = ARRAY_SIZE(t7_mclk_init_regs),
+ //.ignore_init = false
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "mclk_pll_dco",
+ .ops = &meson_clk_pll_ops,
+ .parent_data = &(const struct clk_parent_data) {
+ .fw_name = "xtal",
+ },
+ .num_parents = 1,
+ .flags = CLK_GET_RATE_NOCACHE | CLK_IGNORE_UNUSED
+ },
+};
+
+/* max div is 16 */
+static const struct clk_div_table mclk_div[] = {
+ { .val = 0, .div = 1 },
+ { .val = 1, .div = 2 },
+ { .val = 2, .div = 4 },
+ { .val = 3, .div = 8 },
+ { .val = 4, .div = 16 },
+ { /* sentinel */ }
+};
+
+static struct clk_regmap t7_mclk_pre_od = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = ANACTRL_MCLK_PLL_CNTL0,
+ .shift = 12,
+ .width = 3,
+ .table = mclk_div,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "mclk_pre_od",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_mclk_pll_dco.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_mclk_pll = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = ANACTRL_MCLK_PLL_CNTL4,
+ .shift = 16,
+ .width = 5,
+ .flags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ROUND_CLOSEST |
+ CLK_DIVIDER_ALLOW_ZERO,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "mclk_pll",
+ .ops = &clk_regmap_divider_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_mclk_pre_od.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
+ },
+};
+
+static const struct pll_params_table t7_hifi_pll_table[] = {
+ PLL_PARAMS(163, 1), /* DCO = 3932.16M */
+ { /* sentinel */ }
+};
+
+/*
+ * Internal hifi pll emulation configuration parameters
+ */
+static const struct reg_sequence t7_hifi_init_regs[] = {
+ { .reg = ANACTRL_HIFIPLL_CTRL1, .def = 0x00014820 }, /*frac = 20.16M */
+ { .reg = ANACTRL_HIFIPLL_CTRL2, .def = 0x00000000 },
+ { .reg = ANACTRL_HIFIPLL_CTRL3, .def = 0x6a285c00 },
+ { .reg = ANACTRL_HIFIPLL_CTRL4, .def = 0x65771290 },
+ { .reg = ANACTRL_HIFIPLL_CTRL5, .def = 0x3927200a },
+ { .reg = ANACTRL_HIFIPLL_CTRL6, .def = 0x56540000 }
+};
+
+static struct clk_regmap t7_hifi_pll_dco = {
+ .data = &(struct meson_clk_pll_data){
+ .en = {
+ .reg_off = ANACTRL_HIFIPLL_CTRL0,
+ .shift = 28,
+ .width = 1,
+ },
+ .m = {
+ .reg_off = ANACTRL_HIFIPLL_CTRL0,
+ .shift = 0,
+ .width = 8,
+ },
+ .n = {
+ .reg_off = ANACTRL_HIFIPLL_CTRL0,
+ .shift = 10,
+ .width = 5,
+ },
+ .frac = {
+ .reg_off = ANACTRL_HIFIPLL_CTRL1,
+ .shift = 0,
+ .width = 19,
+ },
+ .l = {
+ .reg_off = ANACTRL_HIFIPLL_CTRL0,
+ .shift = 31,
+ .width = 1,
+ },
+ .rst = {
+ .reg_off = ANACTRL_HIFIPLL_CTRL0,
+ .shift = 29,
+ .width = 1,
+ },
+ .table = t7_hifi_pll_table,
+ .init_regs = t7_hifi_init_regs,
+ .init_count = ARRAY_SIZE(t7_hifi_init_regs),
+ .flags = CLK_MESON_PLL_ROUND_CLOSEST,
+ //.new_frac = 1,
+ },
+ .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 t7_hifi_pll = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = ANACTRL_HIFIPLL_CTRL0,
+ .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 *[]) {
+ &t7_hifi_pll_dco.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
+ },
+};
+
+/*
+ * The Meson t7 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 t7_pcie_pll_init_regs[] = {
+ { .reg = ANACTRL_PCIEPLL_CTRL0, .def = 0x200c04c8 },
+ { .reg = ANACTRL_PCIEPLL_CTRL0, .def = 0x300c04c8 },
+ { .reg = ANACTRL_PCIEPLL_CTRL1, .def = 0x30000000 },
+ { .reg = ANACTRL_PCIEPLL_CTRL2, .def = 0x00001100 },
+ { .reg = ANACTRL_PCIEPLL_CTRL3, .def = 0x10058e00 },
+ { .reg = ANACTRL_PCIEPLL_CTRL4, .def = 0x000100c0 },
+ { .reg = ANACTRL_PCIEPLL_CTRL5, .def = 0x68000040 },
+ { .reg = ANACTRL_PCIEPLL_CTRL5, .def = 0x68000060, .delay_us = 20 },
+ { .reg = ANACTRL_PCIEPLL_CTRL4, .def = 0x008100c0, .delay_us = 10 },
+ { .reg = ANACTRL_PCIEPLL_CTRL0, .def = 0x340c04c8 },
+ { .reg = ANACTRL_PCIEPLL_CTRL0, .def = 0x140c04c8, .delay_us = 10 },
+ { .reg = ANACTRL_PCIEPLL_CTRL2, .def = 0x00001000 }
+};
+
+/* Keep a single entry table for recalc/round_rate() ops */
+static const struct pll_params_table t7_pcie_pll_table[] = {
+ PLL_PARAMS(150, 1),
+ {0, 0}
+};
+
+static struct clk_regmap t7_pcie_pll_dco = {
+ .data = &(struct meson_clk_pll_data){
+ .en = {
+ .reg_off = ANACTRL_PCIEPLL_CTRL0,
+ .shift = 28,
+ .width = 1,
+ },
+ .m = {
+ .reg_off = ANACTRL_PCIEPLL_CTRL0,
+ .shift = 0,
+ .width = 8,
+ },
+ .n = {
+ .reg_off = ANACTRL_PCIEPLL_CTRL0,
+ .shift = 10,
+ .width = 5,
+ },
+ .frac = {
+ .reg_off = ANACTRL_PCIEPLL_CTRL1,
+ .shift = 0,
+ .width = 12,
+ },
+ .l = {
+ .reg_off = ANACTRL_PCIEPLL_CTRL0,
+ .shift = 31,
+ .width = 1,
+ },
+ .rst = {
+ .reg_off = ANACTRL_PCIEPLL_CTRL0,
+ .shift = 29,
+ .width = 1,
+ },
+ .table = t7_pcie_pll_table,
+ .init_regs = t7_pcie_pll_init_regs,
+ .init_count = ARRAY_SIZE(t7_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 t7_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 *[]) {
+ &t7_pcie_pll_dco.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_pcie_pll_od = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = ANACTRL_PCIEPLL_CTRL0,
+ .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 *[]) {
+ &t7_pcie_pll_dco_div2.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
+ },
+};
+
+static struct clk_fixed_factor t7_pcie_pll = {
+ .mult = 1,
+ .div = 2,
+ .hw.init = &(struct clk_init_data){
+ .name = "pcie_pll",
+ .ops = &clk_fixed_factor_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_pcie_pll_od.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_pcie_bgp = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = ANACTRL_PCIEPLL_CTRL5,
+ .bit_idx = 27,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "pcie_bgp",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) { &t7_pcie_pll.hw },
+ .num_parents = 1,
+ .flags = CLK_IGNORE_UNUSED,
+ },
+};
+
+static struct clk_regmap t7_pcie_hcsl = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = ANACTRL_PCIEPLL_CTRL5,
+ .bit_idx = 3,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "pcie_hcsl",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) { &t7_pcie_bgp.hw },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
+ },
+};
+
+static struct clk_regmap t7_hdmi_pll_dco = {
+ .data = &(struct meson_clk_pll_data){
+ .en = {
+ .reg_off = ANACTRL_HDMIPLL_CTRL0,
+ .shift = 28,
+ .width = 1,
+ },
+ .m = {
+ .reg_off = ANACTRL_HDMIPLL_CTRL0,
+ .shift = 0,
+ .width = 8,
+ },
+ .n = {
+ .reg_off = ANACTRL_HDMIPLL_CTRL0,
+ .shift = 10,
+ .width = 5,
+ },
+ .frac = {
+ .reg_off = ANACTRL_HDMIPLL_CTRL1,
+ .shift = 0,
+ .width = 19,
+ },
+ .l = {
+ .reg_off = ANACTRL_HDMIPLL_CTRL0,
+ .shift = 31,
+ .width = 1,
+ },
+ .rst = {
+ .reg_off = ANACTRL_HDMIPLL_CTRL0,
+ .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 t7_hdmi_pll_od = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = ANACTRL_HDMIPLL_CTRL0,
+ .shift = 16,
+ .width = 4,
+ .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 *[]) {
+ &t7_hdmi_pll_dco.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_hdmi_pll = {
+ .data = &(struct clk_regmap_div_data){
+ .offset = ANACTRL_HDMIPLL_CTRL0,
+ .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 *[]) {
+ &t7_hdmi_pll_od.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_fixed_factor t7_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 *[]) {
+ &t7_fixed_pll_dco.hw
+ },
+ .num_parents = 1,
+ },
+};
+
+static const struct clk_parent_data t7_mpll_50m_sel[] = {
+ { .fw_name = "xtal", },
+ { .hw = &t7_mpll_50m_div.hw },
+};
+
+static struct clk_regmap t7_mpll_50m = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = ANACTRL_FIXPLL_CTRL3,
+ .mask = 0x1,
+ .shift = 5,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "mpll_50m",
+ .ops = &clk_regmap_mux_ro_ops,
+ .parent_data = t7_mpll_50m_sel,
+ .num_parents = ARRAY_SIZE(t7_mpll_50m_sel),
+ },
+};
+
+static struct clk_fixed_factor t7_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 *[]) {
+ &t7_fixed_pll_dco.hw
+ },
+ .num_parents = 1,
+ },
+};
+
+static const struct reg_sequence t7_mpll0_init_regs[] = {
+ { .reg = ANACTRL_MPLL_CTRL2, .def = 0x40000033 }
+};
+
+static struct clk_regmap t7_mpll0_div = {
+ .data = &(struct meson_clk_mpll_data){
+ .sdm = {
+ .reg_off = ANACTRL_MPLL_CTRL1,
+ .shift = 0,
+ .width = 14,
+ },
+ .sdm_en = {
+ .reg_off = ANACTRL_MPLL_CTRL1,
+ .shift = 30,
+ .width = 1,
+ },
+ .n2 = {
+ .reg_off = ANACTRL_MPLL_CTRL1,
+ .shift = 20,
+ .width = 9,
+ },
+ .ssen = {
+ .reg_off = ANACTRL_MPLL_CTRL1,
+ .shift = 29,
+ .width = 1,
+ },
+ .lock = &meson_clk_lock,
+ .init_regs = t7_mpll0_init_regs,
+ .init_count = ARRAY_SIZE(t7_mpll0_init_regs),
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "mpll0_div",
+ .ops = &meson_clk_mpll_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_mpll_prediv.hw
+ },
+ .num_parents = 1,
+ },
+};
+
+static struct clk_regmap t7_mpll0 = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = ANACTRL_MPLL_CTRL1,
+ .bit_idx = 31,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "mpll0",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) { &t7_mpll0_div.hw },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static const struct reg_sequence t7_mpll1_init_regs[] = {
+ { .reg = ANACTRL_MPLL_CTRL4, .def = 0x40000033 }
+};
+
+static struct clk_regmap t7_mpll1_div = {
+ .data = &(struct meson_clk_mpll_data){
+ .sdm = {
+ .reg_off = ANACTRL_MPLL_CTRL3,
+ .shift = 0,
+ .width = 14,
+ },
+ .sdm_en = {
+ .reg_off = ANACTRL_MPLL_CTRL3,
+ .shift = 30,
+ .width = 1,
+ },
+ .n2 = {
+ .reg_off = ANACTRL_MPLL_CTRL3,
+ .shift = 20,
+ .width = 9,
+ },
+ .ssen = {
+ .reg_off = ANACTRL_MPLL_CTRL3,
+ .shift = 29,
+ .width = 1,
+ },
+ .lock = &meson_clk_lock,
+ .init_regs = t7_mpll1_init_regs,
+ .init_count = ARRAY_SIZE(t7_mpll1_init_regs),
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "mpll1_div",
+ .ops = &meson_clk_mpll_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_mpll_prediv.hw
+ },
+ .num_parents = 1,
+ },
+};
+
+static struct clk_regmap t7_mpll1 = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = ANACTRL_MPLL_CTRL3,
+ .bit_idx = 31,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "mpll1",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) { &t7_mpll1_div.hw },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static const struct reg_sequence t7_mpll2_init_regs[] = {
+ { .reg = ANACTRL_MPLL_CTRL6, .def = 0x40000033 }
+};
+
+static struct clk_regmap t7_mpll2_div = {
+ .data = &(struct meson_clk_mpll_data){
+ .sdm = {
+ .reg_off = ANACTRL_MPLL_CTRL5,
+ .shift = 0,
+ .width = 14,
+ },
+ .sdm_en = {
+ .reg_off = ANACTRL_MPLL_CTRL5,
+ .shift = 30,
+ .width = 1,
+ },
+ .n2 = {
+ .reg_off = ANACTRL_MPLL_CTRL5,
+ .shift = 20,
+ .width = 9,
+ },
+ .ssen = {
+ .reg_off = ANACTRL_MPLL_CTRL5,
+ .shift = 29,
+ .width = 1,
+ },
+ .lock = &meson_clk_lock,
+ .init_regs = t7_mpll2_init_regs,
+ .init_count = ARRAY_SIZE(t7_mpll2_init_regs),
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "mpll2_div",
+ .ops = &meson_clk_mpll_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_mpll_prediv.hw
+ },
+ .num_parents = 1,
+ },
+};
+
+static struct clk_regmap t7_mpll2 = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = ANACTRL_MPLL_CTRL5,
+ .bit_idx = 31,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "mpll2",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) { &t7_mpll2_div.hw },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static const struct reg_sequence t7_mpll3_init_regs[] = {
+ { .reg = ANACTRL_MPLL_CTRL8, .def = 0x40000033 }
+};
+
+static struct clk_regmap t7_mpll3_div = {
+ .data = &(struct meson_clk_mpll_data){
+ .sdm = {
+ .reg_off = ANACTRL_MPLL_CTRL7,
+ .shift = 0,
+ .width = 14,
+ },
+ .sdm_en = {
+ .reg_off = ANACTRL_MPLL_CTRL7,
+ .shift = 30,
+ .width = 1,
+ },
+ .n2 = {
+ .reg_off = ANACTRL_MPLL_CTRL7,
+ .shift = 20,
+ .width = 9,
+ },
+ .ssen = {
+ .reg_off = ANACTRL_MPLL_CTRL7,
+ .shift = 29,
+ .width = 1,
+ },
+ .lock = &meson_clk_lock,
+ .init_regs = t7_mpll3_init_regs,
+ .init_count = ARRAY_SIZE(t7_mpll3_init_regs),
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "mpll3_div",
+ .ops = &meson_clk_mpll_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_mpll_prediv.hw
+ },
+ .num_parents = 1,
+ },
+};
+
+static struct clk_regmap t7_mpll3 = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = ANACTRL_MPLL_CTRL7,
+ .bit_idx = 31,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "mpll3",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) { &t7_mpll3_div.hw },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_mclk_0_sel = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = ANACTRL_MCLK_PLL_CNTL4,
+ .mask = 0x3,
+ .shift = 4,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "mclk_0_sel",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = (const struct clk_parent_data []) {
+ { .hw = &t7_mclk_pll.hw },
+ { .fw_name = "xtal", },
+ { .hw = &t7_mpll_50m.hw },
+ },
+ .num_parents = 3,
+ },
+};
+
+static struct clk_fixed_factor t7_mclk_0_div2 = {
+ .mult = 1,
+ .div = 2,
+ .hw.init = &(struct clk_init_data){
+ .name = "mclk_0_div2",
+ .ops = &clk_fixed_factor_ops,
+ .parent_hws = (const struct clk_hw *[]) { &t7_mclk_0_sel.hw },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_mclk_0_pre = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = ANACTRL_MCLK_PLL_CNTL4,
+ .bit_idx = 2,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "mclk_0_pre",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_mclk_0_div2.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_mclk_0 = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = ANACTRL_MCLK_PLL_CNTL4,
+ .bit_idx = 0,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "mclk_0",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_mclk_0_pre.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_mclk_1_sel = {
+ .data = &(struct clk_regmap_mux_data){
+ .offset = ANACTRL_MCLK_PLL_CNTL4,
+ .mask = 0x3,
+ .shift = 12,
+ },
+ .hw.init = &(struct clk_init_data){
+ .name = "mclk_1_sel",
+ .ops = &clk_regmap_mux_ops,
+ .parent_data = (const struct clk_parent_data []) {
+ { .hw = &t7_mclk_pll.hw },
+ { .fw_name = "xtal", },
+ { .hw = &t7_mpll_50m.hw },
+ },
+ .num_parents = 3,
+ },
+};
+
+static struct clk_fixed_factor t7_mclk_1_div2 = {
+ .mult = 1,
+ .div = 2,
+ .hw.init = &(struct clk_init_data){
+ .name = "mclk_1_div2",
+ .ops = &clk_fixed_factor_ops,
+ .parent_hws = (const struct clk_hw *[]) { &t7_mclk_1_sel.hw },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_mclk_1_pre = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = ANACTRL_MCLK_PLL_CNTL4,
+ .bit_idx = 10,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "mclk_1_pre",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_mclk_1_div2.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+static struct clk_regmap t7_mclk_1 = {
+ .data = &(struct clk_regmap_gate_data){
+ .offset = ANACTRL_MCLK_PLL_CNTL4,
+ .bit_idx = 8,
+ },
+ .hw.init = &(struct clk_init_data) {
+ .name = "mclk_1",
+ .ops = &clk_regmap_gate_ops,
+ .parent_hws = (const struct clk_hw *[]) {
+ &t7_mclk_1_pre.hw
+ },
+ .num_parents = 1,
+ .flags = CLK_SET_RATE_PARENT,
+ },
+};
+
+/* Array of all clocks provided by this provider */
+static struct clk_hw *t7_pll_hw_clks[] = {
+ [CLKID_FIXED_PLL_DCO] = &t7_fixed_pll_dco.hw,
+ [CLKID_FIXED_PLL] = &t7_fixed_pll.hw,
+ [CLKID_SYS_PLL_DCO] = &t7_sys_pll_dco.hw,
+ [CLKID_SYS_PLL] = &t7_sys_pll.hw,
+ [CLKID_SYS1_PLL_DCO] = &t7_sys1_pll_dco.hw,
+ [CLKID_SYS1_PLL] = &t7_sys1_pll.hw,
+ [CLKID_FCLK_DIV2_DIV] = &t7_fclk_div2_div.hw,
+ [CLKID_FCLK_DIV2] = &t7_fclk_div2.hw,
+ [CLKID_FCLK_DIV3_DIV] = &t7_fclk_div3_div.hw,
+ [CLKID_FCLK_DIV3] = &t7_fclk_div3.hw,
+ [CLKID_FCLK_DIV4_DIV] = &t7_fclk_div4_div.hw,
+ [CLKID_FCLK_DIV4] = &t7_fclk_div4.hw,
+ [CLKID_FCLK_DIV5_DIV] = &t7_fclk_div5_div.hw,
+ [CLKID_FCLK_DIV5] = &t7_fclk_div5.hw,
+ [CLKID_FCLK_DIV7_DIV] = &t7_fclk_div7_div.hw,
+ [CLKID_FCLK_DIV7] = &t7_fclk_div7.hw,
+ [CLKID_FCLK_DIV2P5_DIV] = &t7_fclk_div2p5_div.hw,
+ [CLKID_FCLK_DIV2P5] = &t7_fclk_div2p5.hw,
+ [CLKID_GP0_PLL_DCO] = &t7_gp0_pll_dco.hw,
+ [CLKID_GP0_PLL] = &t7_gp0_pll.hw,
+ [CLKID_GP1_PLL_DCO] = &t7_gp1_pll_dco.hw,
+ [CLKID_GP1_PLL] = &t7_gp1_pll.hw,
+ [CLKID_MCLK_PLL_DCO] = &t7_mclk_pll_dco.hw,
+ [CLKID_MCLK_PRE] = &t7_mclk_pre_od.hw,
+ [CLKID_MCLK_PLL] = &t7_mclk_pll.hw,
+ [CLKID_HIFI_PLL_DCO] = &t7_hifi_pll_dco.hw,
+ [CLKID_HIFI_PLL] = &t7_hifi_pll.hw,
+ [CLKID_PCIE_PLL_DCO] = &t7_pcie_pll_dco.hw,
+ [CLKID_PCIE_PLL_DCO_DIV2] = &t7_pcie_pll_dco_div2.hw,
+ [CLKID_PCIE_PLL_OD] = &t7_pcie_pll_od.hw,
+ [CLKID_PCIE_PLL] = &t7_pcie_pll.hw,
+ [CLKID_PCIE_BGP] = &t7_pcie_bgp.hw,
+ [CLKID_PCIE_HCSL] = &t7_pcie_hcsl.hw,
+ [CLKID_HDMI_PLL_DCO] = &t7_hdmi_pll_dco.hw,
+ [CLKID_HDMI_PLL_OD] = &t7_hdmi_pll_od.hw,
+ [CLKID_HDMI_PLL] = &t7_hdmi_pll.hw,
+ [CLKID_MPLL_50M_DIV] = &t7_mpll_50m_div.hw,
+ [CLKID_MPLL_50M] = &t7_mpll_50m.hw,
+ [CLKID_MPLL_PREDIV] = &t7_mpll_prediv.hw,
+ [CLKID_MPLL0_DIV] = &t7_mpll0_div.hw,
+ [CLKID_MPLL0] = &t7_mpll0.hw,
+ [CLKID_MPLL1_DIV] = &t7_mpll1_div.hw,
+ [CLKID_MPLL1] = &t7_mpll1.hw,
+ [CLKID_MPLL2_DIV] = &t7_mpll2_div.hw,
+ [CLKID_MPLL2] = &t7_mpll2.hw,
+ [CLKID_MPLL3_DIV] = &t7_mpll3_div.hw,
+ [CLKID_MPLL3] = &t7_mpll3.hw,
+ [CLKID_MCLK_0_SEL] = &t7_mclk_0_sel.hw,
+ [CLKID_MCLK_0_DIV2] = &t7_mclk_0_div2.hw,
+ [CLKID_MCLK_0_PRE] = &t7_mclk_0_pre.hw,
+ [CLKID_MCLK_0] = &t7_mclk_0.hw,
+ [CLKID_MCLK_1_SEL] = &t7_mclk_1_sel.hw,
+ [CLKID_MCLK_1_DIV2] = &t7_mclk_1_div2.hw,
+ [CLKID_MCLK_1_PRE] = &t7_mclk_1_pre.hw,
+ [CLKID_MCLK_1] = &t7_mclk_1.hw,
+};
+
+static struct clk_regmap *const t7_pll_clk_regmaps[] = {
+ &t7_fixed_pll_dco,
+ &t7_fixed_pll,
+ &t7_sys_pll_dco,
+ &t7_sys_pll,
+ &t7_sys1_pll_dco,
+ &t7_sys1_pll,
+ &t7_fclk_div2,
+ &t7_fclk_div3,
+ &t7_fclk_div4,
+ &t7_fclk_div5,
+ &t7_fclk_div7,
+ &t7_fclk_div2p5,
+ &t7_gp0_pll_dco,
+ &t7_gp0_pll,
+ &t7_gp1_pll_dco,
+ &t7_gp1_pll,
+ &t7_mclk_pll_dco,
+ &t7_mclk_pre_od,
+ &t7_mclk_pll,
+ &t7_hifi_pll_dco,
+ &t7_hifi_pll,
+ &t7_pcie_pll_dco,
+ &t7_pcie_pll_od,
+ &t7_pcie_bgp,
+ &t7_pcie_hcsl,
+ &t7_hdmi_pll_dco,
+ &t7_hdmi_pll_od,
+ &t7_hdmi_pll,
+ &t7_mpll_50m,
+ &t7_mpll0_div,
+ &t7_mpll0,
+ &t7_mpll1_div,
+ &t7_mpll1,
+ &t7_mpll2_div,
+ &t7_mpll2,
+ &t7_mpll3_div,
+ &t7_mpll3,
+ &t7_mclk_0_sel,
+ &t7_mclk_0_pre,
+ &t7_mclk_0,
+ &t7_mclk_1_sel,
+ &t7_mclk_1_pre,
+ &t7_mclk_1
+};
+
+static const struct reg_sequence t7_init_regs[] = {
+ { .reg = ANACTRL_MPLL_CTRL0, .def = 0x00000543 },
+};
+
+static struct regmap_config clkc_regmap_config = {
+ .reg_bits = 32,
+ .val_bits = 32,
+ .reg_stride = 4,
+};
+
+static struct meson_clk_hw_data t7_pll_clks = {
+ .hws = t7_pll_hw_clks,
+ .num = ARRAY_SIZE(t7_pll_hw_clks),
+};
+
+static int amlogic_t7_pll_probe(struct platform_device *pdev)
+{
+ struct device *dev = &pdev->dev;
+ struct regmap *regmap;
+ void __iomem *base;
+ int ret, i;
+
+ base = devm_platform_ioremap_resource(pdev, 0);
+ if (IS_ERR(base))
+ return dev_err_probe(dev, PTR_ERR(base), "can't ioremap resource\n");
+
+ regmap = devm_regmap_init_mmio(dev, base, &clkc_regmap_config);
+ if (IS_ERR(regmap))
+ return dev_err_probe(dev, PTR_ERR(regmap), "can't init regmap mmio region\n");
+
+ ret = regmap_multi_reg_write(regmap, t7_init_regs, ARRAY_SIZE(t7_init_regs));
+ if (ret)
+ return dev_err_probe(dev, ret, "Failed to init registers\n");
+
+ for (i = 0; i < ARRAY_SIZE(t7_pll_clk_regmaps); i++)
+ t7_pll_clk_regmaps[i]->map = regmap;
+
+ /* Register clocks */
+ for (i = 0; i < t7_pll_clks.num; i++) {
+ /* array might be sparse */
+ if (!t7_pll_clks.hws[i])
+ continue;
+
+ ret = devm_clk_hw_register(dev, t7_pll_clks.hws[i]);
+ if (ret)
+ return dev_err_probe(dev, ret, "clock[%d] registration failed\n", i);
+ }
+
+ return devm_of_clk_add_hw_provider(dev, meson_clk_hw_get, &t7_pll_clks);
+}
+
+static const struct of_device_id t7_pll_clkc_match_table[] = {
+ { .compatible = "amlogic,t7-pll-clkc", },
+ {}
+};
+MODULE_DEVICE_TABLE(of, t7_pll_clkc_match_table);
+
+static struct platform_driver t7_pll_clkc_driver = {
+ .probe = amlogic_t7_pll_probe,
+ .driver = {
+ .name = "t7-pll-clkc",
+ .of_match_table = t7_pll_clkc_match_table,
+ },
+};
+
+module_platform_driver(t7_pll_clkc_driver);
+MODULE_AUTHOR("Yu Tu <[email protected]>");
+MODULE_AUTHOR("Lucas Tanure <[email protected]>");
+MODULE_LICENSE("GPL");
diff --git a/drivers/clk/meson/t7-pll.h b/drivers/clk/meson/t7-pll.h
new file mode 100644
index 000000000000..bb0d66198780
--- /dev/null
+++ b/drivers/clk/meson/t7-pll.h
@@ -0,0 +1,83 @@
+/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
+/*
+ * Copyright (c) 2019 Amlogic, Inc. All rights reserved.
+ */
+
+#ifndef __MESON_T7_PLL_H__
+#define __MESON_T7_PLL_H__
+
+/* ANA_CTRL - Registers
+ * REG_BASE: REGISTER_BASE_ADDR = 0xfe008000
+ */
+#define ANACTRL_SYS0PLL_CTRL0 (0x0000 << 2)
+#define ANACTRL_SYS0PLL_CTRL1 (0x0001 << 2)
+#define ANACTRL_SYS0PLL_CTRL2 (0x0002 << 2)
+#define ANACTRL_SYS0PLL_CTRL3 (0x0003 << 2)
+#define ANACTRL_SYS0PLL_STS (0x0004 << 2)
+#define ANACTRL_SYS1PLL_CTRL0 (0x0008 << 2)
+#define ANACTRL_SYS1PLL_CTRL1 (0x0009 << 2)
+#define ANACTRL_SYS1PLL_CTRL2 (0x000a << 2)
+#define ANACTRL_SYS1PLL_CTRL3 (0x000b << 2)
+#define ANACTRL_SYS1PLL_STS (0x000c << 2)
+#define ANACTRL_FIXPLL_CTRL0 (0x0010 << 2)
+#define ANACTRL_FIXPLL_CTRL1 (0x0011 << 2)
+#define ANACTRL_FIXPLL_CTRL2 (0x0012 << 2)
+#define ANACTRL_FIXPLL_CTRL3 (0x0013 << 2)
+#define ANACTRL_FIXPLL_CTRL4 (0x0014 << 2)
+#define ANACTRL_FIXPLL_CTRL5 (0x0015 << 2)
+#define ANACTRL_FIXPLL_CTRL6 (0x0016 << 2)
+#define ANACTRL_FIXPLL_STS (0x0017 << 2)
+#define ANACTRL_GP0PLL_CTRL0 (0x0020 << 2)
+#define ANACTRL_GP0PLL_CTRL1 (0x0021 << 2)
+#define ANACTRL_GP0PLL_CTRL2 (0x0022 << 2)
+#define ANACTRL_GP0PLL_CTRL3 (0x0023 << 2)
+#define ANACTRL_GP0PLL_CTRL4 (0x0024 << 2)
+#define ANACTRL_GP0PLL_CTRL5 (0x0025 << 2)
+#define ANACTRL_GP0PLL_CTRL6 (0x0026 << 2)
+#define ANACTRL_GP0PLL_STS (0x0027 << 2)
+#define ANACTRL_GP1PLL_CTRL0 (0x0030 << 2)
+#define ANACTRL_GP1PLL_CTRL1 (0x0031 << 2)
+#define ANACTRL_GP1PLL_CTRL2 (0x0032 << 2)
+#define ANACTRL_GP1PLL_CTRL3 (0x0033 << 2)
+#define ANACTRL_GP1PLL_STS (0x0037 << 2)
+#define ANACTRL_HIFIPLL_CTRL0 (0x0040 << 2)
+#define ANACTRL_HIFIPLL_CTRL1 (0x0041 << 2)
+#define ANACTRL_HIFIPLL_CTRL2 (0x0042 << 2)
+#define ANACTRL_HIFIPLL_CTRL3 (0x0043 << 2)
+#define ANACTRL_HIFIPLL_CTRL4 (0x0044 << 2)
+#define ANACTRL_HIFIPLL_CTRL5 (0x0045 << 2)
+#define ANACTRL_HIFIPLL_CTRL6 (0x0046 << 2)
+#define ANACTRL_HIFIPLL_STS (0x0047 << 2)
+#define ANACTRL_PCIEPLL_CTRL0 (0x0050 << 2)
+#define ANACTRL_PCIEPLL_CTRL1 (0x0051 << 2)
+#define ANACTRL_PCIEPLL_CTRL2 (0x0052 << 2)
+#define ANACTRL_PCIEPLL_CTRL3 (0x0053 << 2)
+#define ANACTRL_PCIEPLL_CTRL4 (0x0054 << 2)
+#define ANACTRL_PCIEPLL_CTRL5 (0x0055 << 2)
+#define ANACTRL_PCIEPLL_STS (0x0056 << 2)
+#define ANACTRL_MPLL_CTRL0 (0x0060 << 2)
+#define ANACTRL_MPLL_CTRL1 (0x0061 << 2)
+#define ANACTRL_MPLL_CTRL2 (0x0062 << 2)
+#define ANACTRL_MPLL_CTRL3 (0x0063 << 2)
+#define ANACTRL_MPLL_CTRL4 (0x0064 << 2)
+#define ANACTRL_MPLL_CTRL5 (0x0065 << 2)
+#define ANACTRL_MPLL_CTRL6 (0x0066 << 2)
+#define ANACTRL_MPLL_CTRL7 (0x0067 << 2)
+#define ANACTRL_MPLL_CTRL8 (0x0068 << 2)
+#define ANACTRL_MPLL_STS (0x0069 << 2)
+#define ANACTRL_HDMIPLL_CTRL0 (0x0070 << 2)
+#define ANACTRL_HDMIPLL_CTRL1 (0x0071 << 2)
+#define ANACTRL_HDMIPLL_CTRL2 (0x0072 << 2)
+#define ANACTRL_HDMIPLL_CTRL3 (0x0073 << 2)
+#define ANACTRL_HDMIPLL_CTRL4 (0x0074 << 2)
+#define ANACTRL_HDMIPLL_CTRL5 (0x0075 << 2)
+#define ANACTRL_HDMIPLL_CTRL6 (0x0076 << 2)
+#define ANACTRL_HDMIPLL_STS (0x0077 << 2)
+#define ANACTRL_MCLK_PLL_CNTL0 (0x00c0 << 2)
+#define ANACTRL_MCLK_PLL_CNTL1 (0x00c1 << 2)
+#define ANACTRL_MCLK_PLL_CNTL2 (0x00c2 << 2)
+#define ANACTRL_MCLK_PLL_CNTL3 (0x00c3 << 2)
+#define ANACTRL_MCLK_PLL_CNTL4 (0x00c4 << 2)
+#define ANACTRL_MCLK_PLL_STS (0x00c5 << 2)
+
+#endif /* __MESON_T7_PLL_H__ */
diff --git a/include/dt-bindings/clock/amlogic,t7-peripherals-clkc.h b/include/dt-bindings/clock/amlogic,t7-peripherals-clkc.h
new file mode 100644
index 000000000000..64731385c64b
--- /dev/null
+++ b/include/dt-bindings/clock/amlogic,t7-peripherals-clkc.h
@@ -0,0 +1,410 @@
+/* SPDX-License-Identifier: (GPL-2.0-only OR MIT) */
+/*
+ * Copyright (c) 2022-2023 Amlogic, Inc. All rights reserved.
+ * Author: Yu Tu <[email protected]>
+ */
+
+#ifndef _DT_BINDINGS_CLOCK_AMLOGIC_T7_PERIPHERALS_CLKC_H
+#define _DT_BINDINGS_CLOCK_AMLOGIC_T7_PERIPHERALS_CLKC_H
+
+#define CLKID_RTC_32K_CLKIN 0
+#define CLKID_RTC_32K_DIV 1
+#define CLKID_RTC_32K_XATL 2
+#define CLKID_RTC_32K_MUX 3
+#define CLKID_RTC_CLK 4
+#define CLKID_SYS_CLK_B_MUX 5
+#define CLKID_SYS_CLK_B_DIV 6
+#define CLKID_SYS_CLK_B_GATE 7
+#define CLKID_SYS_CLK_A_MUX 8
+#define CLKID_SYS_CLK_A_DIV 9
+#define CLKID_SYS_CLK_A_GATE 10
+#define CLKID_SYS_CLK 11
+#define CLKID_CECA_32K_CLKIN 12
+#define CLKID_CECA_32K_DIV 13
+#define CLKID_CECA_32K_MUX_PRE 14
+#define CLKID_CECA_32K_MUX 15
+#define CLKID_CECA_32K_CLKOUT 16
+#define CLKID_CECB_32K_CLKIN 17
+#define CLKID_CECB_32K_DIV 18
+#define CLKID_CECB_32K_MUX_PRE 19
+#define CLKID_CECB_32K_MUX 20
+#define CLKID_CECB_32K_CLKOUT 21
+#define CLKID_SC_CLK_MUX 22
+#define CLKID_SC_CLK_DIV 23
+#define CLKID_SC_CLK_GATE 24
+#define CLKID_DSPA_CLK_B_MUX 25
+#define CLKID_DSPA_CLK_B_DIV 26
+#define CLKID_DSPA_CLK_B_GATE 27
+#define CLKID_DSPA_CLK_A_MUX 28
+#define CLKID_DSPA_CLK_A_DIV 29
+#define CLKID_DSPA_CLK_A_GATE 30
+#define CLKID_DSPA_CLK 31
+#define CLKID_24M_CLK_GATE 32
+#define CLKID_12M_CLK_DIV 33
+#define CLKID_12M_CLK_GATE 34
+#define CLKID_25M_CLK_DIV 35
+#define CLKID_25M_CLK_GATE 36
+#define CLKID_VID_PLL_DIV 37
+#define CLKID_VID_PLL_MUX 38
+#define CLKID_VID_PLL 39
+#define CLKID_VCLK_MUX 40
+#define CLKID_VCLK2_MUX 41
+#define CLKID_VCLK_INPUT 42
+#define CLKID_VCLK2_INPUT 43
+#define CLKID_VCLK_DIV 44
+#define CLKID_VCLK2_DIV 45
+#define CLKID_VCLK 46
+#define CLKID_VCLK2 47
+#define CLKID_VCLK_DIV1 48
+#define CLKID_VCLK_DIV2_EN 49
+#define CLKID_VCLK_DIV4_EN 50
+#define CLKID_VCLK_DIV6_EN 51
+#define CLKID_VCLK_DIV12_EN 52
+#define CLKID_VCLK2_DIV1 53
+#define CLKID_VCLK2_DIV2_EN 54
+#define CLKID_VCLK2_DIV4_EN 55
+#define CLKID_VCLK2_DIV6_EN 56
+#define CLKID_VCLK2_DIV12_EN 57
+#define CLKID_VCLK_DIV2 58
+#define CLKID_VCLK_DIV4 59
+#define CLKID_VCLK_DIV6 60
+#define CLKID_VCLK_DIV12 61
+#define CLKID_VCLK2_DIV2 62
+#define CLKID_VCLK2_DIV4 63
+#define CLKID_VCLK2_DIV6 64
+#define CLKID_VCLK2_DIV12 65
+#define CLKID_CTS_ENCI_MUX 66
+#define CLKID_CTS_ENCP_MUX 67
+#define CLKID_CTS_VDAC_MUX 68
+#define CLKID_HDMI_TX_MUX 69
+#define CLKID_CTS_ENCI 70
+#define CLKID_CTS_ENCP 71
+#define CLKID_CTS_VDAC 72
+#define CLKID_HDMI_TX 73
+#define CLKID_HDMITX_SYS_MUX 74
+#define CLKID_HDMITX_SYS_DIV 75
+#define CLKID_HDMITX_SYS 76
+#define CLKID_TS_CLK_DIV 77
+#define CLKID_TS_CLK_GATE 78
+#define CLKID_MALI_0_SEL 79
+#define CLKID_MALI_0_DIV 80
+#define CLKID_MALI_0 81
+#define CLKID_MALI_1_SEL 82
+#define CLKID_MALI_1_DIV 83
+#define CLKID_MALI_1 84
+#define CLKID_MALI_MUX 85
+#define CLKID_VDEC_P0_MUX 86
+#define CLKID_VDEC_P0_DIV 87
+#define CLKID_VDEC_P0 88
+#define CLKID_VDEC_P1_MUX 89
+#define CLKID_VDEC_P1_DIV 90
+#define CLKID_VDEC_P1 91
+#define CLKID_VDEC_MUX 92
+#define CLKID_HCODEC_P0_MUX 93
+#define CLKID_HCODEC_P0_DIV 94
+#define CLKID_HCODEC_P0 95
+#define CLKID_HCODEC_P1_MUX 96
+#define CLKID_HCODEC_P1_DIV 97
+#define CLKID_HCODEC_P1 98
+#define CLKID_HCODEC_MUX 99
+#define CLKID_HEVCB_P0_MUX 100
+#define CLKID_HEVCB_P0_DIV 101
+#define CLKID_HEVCB_P0 102
+#define CLKID_HEVCB_P1_MUX 103
+#define CLKID_HEVCB_P1_DIV 104
+#define CLKID_HEVCB_P1 105
+#define CLKID_HEVCB_MUX 106
+#define CLKID_HEVCF_P0_MUX 107
+#define CLKID_HEVCF_P0_DIV 108
+#define CLKID_HEVCF_P0 109
+#define CLKID_HEVCF_P1_MUX 110
+#define CLKID_HEVCF_P1_DIV 111
+#define CLKID_HEVCF_P1 112
+#define CLKID_HEVCF_MUX 113
+#define CLKID_WAVE_A_MUX 114
+#define CLKID_WAVE_A_DIV 115
+#define CLKID_WAVE_A_GATE 116
+#define CLKID_WAVE_B_MUX 117
+#define CLKID_WAVE_B_DIV 118
+#define CLKID_WAVE_B_GATE 119
+#define CLKID_WAVE_C_MUX 120
+#define CLKID_WAVE_C_DIV 121
+#define CLKID_WAVE_C_GATE 122
+#define CLKID_VPU_0_MUX 123
+#define CLKID_VPU_0_DIV 124
+#define CLKID_VPU_0 125
+#define CLKID_VPU_1_MUX 126
+#define CLKID_VPU_1_DIV 127
+#define CLKID_VPU_1 128
+#define CLKID_VPU 129
+#define CLKID_VPU_CLKB_TMP_MUX 130
+#define CLKID_VPU_CLKB_TMP_DIV 131
+#define CLKID_VPU_CLKB_TMP 132
+#define CLKID_VPU_CLKB_DIV 133
+#define CLKID_VPU_CLKB 134
+#define CLKID_VPU_CLKC_P0_MUX 135
+#define CLKID_VPU_CLKC_P0_DIV 136
+#define CLKID_VPU_CLKC_P0 137
+#define CLKID_VPU_CLKC_P1_MUX 138
+#define CLKID_VPU_CLKC_P1_DIV 139
+#define CLKID_VPU_CLKC_P1 140
+#define CLKID_VPU_CLKC_MUX 141
+#define CLKID_VAPB_0_MUX 142
+#define CLKID_VAPB_0_DIV 143
+#define CLKID_VAPB_0 144
+#define CLKID_VAPB_1_MUX 145
+#define CLKID_VAPB_1_DIV 146
+#define CLKID_VAPB_1 147
+#define CLKID_VAPB 148
+#define CLKID_GE2D 149
+#define CLKID_VDIN_MEAS_MUX 150
+#define CLKID_VDIN_MEAS_DIV 151
+#define CLKID_VDIN_MEAS_GATE 152
+#define CLKID_DSI_A_MEAS_MUX 153
+#define CLKID_DSI_A_MEAS_DIV 154
+#define CLKID_DSI_A_MEAS_GATE 155
+#define CLKID_DSI_B_MEAS_MUX 156
+#define CLKID_DSI_B_MEAS_DIV 157
+#define CLKID_DSI_B_MEAS_GATE 158
+#define CLKID_DSI0_PHY_MUX 159
+#define CLKID_DSI0_PHY_DIV 160
+#define CLKID_DSI0_PHY_GATE 161
+#define CLKID_DSI1_PHY_MUX 162
+#define CLKID_DSI1_PHY_DIV 163
+#define CLKID_DSI1_PHY_GATE 164
+#define CLKID_VID_LOCK_DIV 165
+#define CLKID_VID_LOCK 166
+#define CLKID_PWM_A_MUX 167
+#define CLKID_PWM_A_DIV 168
+#define CLKID_PWM_A_GATE 169
+#define CLKID_PWM_B_MUX 170
+#define CLKID_PWM_B_DIV 171
+#define CLKID_PWM_B_GATE 172
+#define CLKID_PWM_C_MUX 173
+#define CLKID_PWM_C_DIV 174
+#define CLKID_PWM_C_GATE 175
+#define CLKID_PWM_D_MUX 176
+#define CLKID_PWM_D_DIV 177
+#define CLKID_PWM_D_GATE 178
+#define CLKID_PWM_E_MUX 179
+#define CLKID_PWM_E_DIV 180
+#define CLKID_PWM_E_GATE 181
+#define CLKID_PWM_F_MUX 182
+#define CLKID_PWM_F_DIV 183
+#define CLKID_PWM_F_GATE 184
+#define CLKID_PWM_AO_A_MUX 185
+#define CLKID_PWM_AO_A_DIV 186
+#define CLKID_PWM_AO_A_GATE 187
+#define CLKID_PWM_AO_B_MUX 188
+#define CLKID_PWM_AO_B_DIV 189
+#define CLKID_PWM_AO_B_GATE 190
+#define CLKID_PWM_AO_C_MUX 191
+#define CLKID_PWM_AO_C_DIV 192
+#define CLKID_PWM_AO_C_GATE 193
+#define CLKID_PWM_AO_D_MUX 194
+#define CLKID_PWM_AO_D_DIV 195
+#define CLKID_PWM_AO_D_GATE 196
+#define CLKID_PWM_AO_E_MUX 197
+#define CLKID_PWM_AO_E_DIV 198
+#define CLKID_PWM_AO_E_GATE 199
+#define CLKID_PWM_AO_F_MUX 200
+#define CLKID_PWM_AO_F_DIV 201
+#define CLKID_PWM_AO_F_GATE 202
+#define CLKID_PWM_AO_G_MUX 203
+#define CLKID_PWM_AO_G_DIV 204
+#define CLKID_PWM_AO_G_GATE 205
+#define CLKID_PWM_AO_H_MUX 206
+#define CLKID_PWM_AO_H_DIV 207
+#define CLKID_PWM_AO_H_GATE 208
+#define CLKID_SPICC0_MUX 209
+#define CLKID_SPICC0_DIV 210
+#define CLKID_SPICC0_GATE 211
+#define CLKID_SPICC1_MUX 212
+#define CLKID_SPICC1_DIV 213
+#define CLKID_SPICC1_GATE 214
+#define CLKID_SPICC2_MUX 215
+#define CLKID_SPICC2_DIV 216
+#define CLKID_SPICC2_GATE 217
+#define CLKID_SPICC3_MUX 218
+#define CLKID_SPICC3_DIV 219
+#define CLKID_SPICC3_GATE 220
+#define CLKID_SPICC4_MUX 221
+#define CLKID_SPICC4_DIV 222
+#define CLKID_SPICC4_GATE 223
+#define CLKID_SPICC5_MUX 224
+#define CLKID_SPICC5_DIV 225
+#define CLKID_SPICC5_GATE 226
+#define CLKID_SD_EMMC_C_CLK_MUX 227
+#define CLKID_SD_EMMC_C_CLK_DIV 228
+#define CLKID_SD_EMMC_C_CLK 229
+#define CLKID_SD_EMMC_A_CLK_MUX 230
+#define CLKID_SD_EMMC_A_CLK_DIV 231
+#define CLKID_SD_EMMC_A_CLK 232
+#define CLKID_SD_EMMC_B_CLK_MUX 233
+#define CLKID_SD_EMMC_B_CLK_DIV 234
+#define CLKID_SD_EMMC_B_CLK 235
+#define CLKID_ETH_RMII_SEL 236
+#define CLKID_ETH_RMII_DIV 237
+#define CLKID_ETH_RMII 238
+#define CLKID_ETH_DIV8 239
+#define CLKID_ETH_125M 240
+#define CLKID_SARADC_MUX 241
+#define CLKID_SARADC_DIV 242
+#define CLKID_SARADC_GATE 243
+#define CLKID_GEN_MUX 244
+#define CLKID_GEN_DIV 245
+#define CLKID_GEN_GATE 246
+#define CLKID_DSPB_CLK_B_MUX 247
+#define CLKID_DSPB_CLK_B_DIV 248
+#define CLKID_DSPB_CLK_B_GATE 249
+#define CLKID_DSPB_CLK_A_MUX 250
+#define CLKID_DSPB_CLK_A_DIV 251
+#define CLKID_DSPB_CLK_A_GATE 252
+#define CLKID_DSPB_CLK 253
+#define CLKID_MIPI_ISP_MUX 254
+#define CLKID_MIPI_ISP_DIV 255
+#define CLKID_MIPI_ISP 256
+#define CLKID_MIPI_CSI_PHY_SEL0 257
+#define CLKID_MIPI_CSI_PHY_DIV0 258
+#define CLKID_MIPI_CSI_PHY0 259
+#define CLKID_MIPI_CSI_PHY_SEL1 260
+#define CLKID_MIPI_CSI_PHY_DIV1 261
+#define CLKID_MIPI_CSI_PHY1 262
+#define CLKID_MIPI_CSI_PHY_CLK 263
+#define CLKID_GDCCLK_0_MUX 264
+#define CLKID_GDCCLK_0_DIV 265
+#define CLKID_GDCCLK_0 266
+#define CLKID_GDCCLK_1_MUX 267
+#define CLKID_GDCCLK_1_DIV 268
+#define CLKID_GDCCLK_1 269
+#define CLKID_GDCCLK 270
+#define CLKID_GDC_CLK 271
+#define CLKID_DEWARPCLK_0_MUX 272
+#define CLKID_DEWARPCLK_0_DIV 273
+#define CLKID_DEWARPCLK_0 274
+#define CLKID_DEWARPCLK_1_MUX 275
+#define CLKID_DEWARPCLK_1_DIV 276
+#define CLKID_DEWARPCLK_1 277
+#define CLKID_DEWARPCLK 278
+#define CLKID_DEWARP_CLK 279
+#define CLKID_ANAKIN_0_MUX 280
+#define CLKID_ANAKIN_0_DIV 281
+#define CLKID_ANAKIN_0 282
+#define CLKID_ANAKIN_1_MUX 283
+#define CLKID_ANAKIN_1_DIV 284
+#define CLKID_ANAKIN_1 285
+#define CLKID_ANAKIN 286
+#define CLKID_ANAKIN_CLK 287
+#define CLKID_HDMITX_PRIF_MUX 288
+#define CLKID_HDMITX_PRIF_DIV 289
+#define CLKID_HDMITX_PRIF 290
+#define CLKID_HDMITX_200M_MUX 291
+#define CLKID_HDMITX_200M_DIV 292
+#define CLKID_HDMITX_200M 293
+#define CLKID_HDMITX_AUD_MUX 294
+#define CLKID_HDMITX_AUD_DIV 295
+#define CLKID_HDMITX_AUD 296
+#define CLKID_HDMIRX_2M_MUX 297
+#define CLKID_HDMIRX_2M_DIV 298
+#define CLKID_HDMIRX_2M 299
+#define CLKID_HDMIRX_5M_MUX 300
+#define CLKID_HDMIRX_5M_DIV 301
+#define CLKID_HDMIRX_5M 302
+#define CLKID_HDMIRX_CFG_MUX 303
+#define CLKID_HDMIRX_CFG_DIV 304
+#define CLKID_HDMIRX_CFG 305
+#define CLKID_HDMIRX_HDCP_MUX 306
+#define CLKID_HDMIRX_HDCP_DIV 307
+#define CLKID_HDMIRX_HDCP 308
+#define CLKID_HDMIRX_AUD_PLL_MUX 309
+#define CLKID_HDMIRX_AUD_PLL_DIV 310
+#define CLKID_HDMIRX_AUD_PLL 311
+#define CLKID_HDMIRX_ACR_MUX 312
+#define CLKID_HDMIRX_ACR_DIV 313
+#define CLKID_HDMIRX_ACR 314
+#define CLKID_HDMIRX_METER_MUX 315
+#define CLKID_HDMIRX_METER_DIV 316
+#define CLKID_HDMIRX_METER 317
+#define CLKID_DDR 318
+#define CLKID_DOS 319
+#define CLKID_ETHPHY 320
+#define CLKID_MALI 321
+#define CLKID_TS_A53 322
+#define CLKID_TS_A73 323
+#define CLKID_CEC 324
+#define CLKID_SD_EMMC_A 325
+#define CLKID_SD_EMMC_B 326
+#define CLKID_SD_EMMC_C 327
+#define CLKID_SMARTCARD 328
+#define CLKID_ACODEC 329
+#define CLKID_SPIFC 330
+#define CLKID_MSR_CLK 331
+#define CLKID_IR_CTRL 332
+#define CLKID_AUDIO 333
+#define CLKID_ETH 334
+#define CLKID_UART_A 335
+#define CLKID_UART_B 336
+#define CLKID_UART_C 337
+#define CLKID_UART_D 338
+#define CLKID_UART_E 339
+#define CLKID_AIFIFO 340
+#define CLKID_TS_DDR 341
+#define CLKID_TS_PLL 342
+#define CLKID_G2D 343
+#define CLKID_SPICC0 344
+#define CLKID_SPICC1 345
+#define CLKID_PCIE 346
+#define CLKID_USB 347
+#define CLKID_PCIE_PHY 348
+#define CLKID_I2C_M_A 349
+#define CLKID_I2C_M_B 350
+#define CLKID_I2C_M_C 351
+#define CLKID_I2C_M_D 352
+#define CLKID_I2C_M_E 353
+#define CLKID_I2C_M_F 354
+#define CLKID_HDMITX_APB 355
+#define CLKID_I2C_S_A 356
+#define CLKID_USB1_TO_DDR 357
+#define CLKID_AOCPU 358
+#define CLKID_MMC_APB 359
+#define CLKID_RSA 360
+#define CLKID_AUCPU 361
+#define CLKID_DSPA 362
+#define CLKID_VPU_INTR 363
+#define CLKID_SAR_ADC 364
+#define CLKID_GIC 365
+#define CLKID_PWM_AB 366
+#define CLKID_PWM_CD 367
+#define CLKID_PWM_EF 368
+#define CLKID_PWM_GH 369
+#define CLKID_PWM_AO_AB 370
+#define CLKID_MIPI_DSI_A 371
+#define CLKID_MIPI_DSI_B 372
+#define CLKID_GDC 373
+#define CLKID_DESWARP 374
+#define CLKID_AMPIPE_NAND 375
+#define CLKID_AMPIPE_ETH 376
+#define CLKID_AM2AXI0 377
+#define CLKID_AM2AXI1 378
+#define CLKID_AM2AXI2 379
+#define CLKID_PWM_AO_CD 380
+#define CLKID_PWM_AO_EF 381
+#define CLKID_PWM_AO_GH 382
+#define CLKID_TS_NNA 383
+#define CLKID_TS_GPU 384
+#define CLKID_TS_HEVC 385
+#define CLKID_DSPB 386
+#define CLKID_SPICC2 387
+#define CLKID_SPICC3 388
+#define CLKID_SPICC4 389
+#define CLKID_SPICC5 390
+#define CLKID_I2C_AO_A 391
+#define CLKID_I2C_AO_B 392
+#define CLKID_UART_F 393
+#define CLKID_MIPI_ISP_PCLK 394
+#define CLKID_HDMIRX_PCLK 395
+#define CLKID_PCLK_SYS_CPU_APB 396
+#define CLKID_A73PCLK_CPU_APB 397
+#define CLKID_TS_VPU 398
+
+#endif /* _DT_BINDINGS_CLOCK_AMLOGIC_T7_PERIPHERALS_CLKC_H */
diff --git a/include/dt-bindings/clock/amlogic,t7-pll-clkc.h b/include/dt-bindings/clock/amlogic,t7-pll-clkc.h
new file mode 100644
index 000000000000..89ee62069772
--- /dev/null
+++ b/include/dt-bindings/clock/amlogic,t7-pll-clkc.h
@@ -0,0 +1,69 @@
+/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
+/*
+ * Copyright (c) 2019 Amlogic Inc. All rights reserved.
+ */
+
+#ifndef __T7_CLKC_H
+#define __T7_CLKC_H
+
+/*
+ * CLKID index values
+ */
+
+#define CLKID_FIXED_PLL_DCO 0
+#define CLKID_FIXED_PLL 1
+#define CLKID_SYS_PLL_DCO 2
+#define CLKID_SYS_PLL 3
+#define CLKID_FCLK_DIV2_DIV 4
+#define CLKID_FCLK_DIV2 5
+#define CLKID_FCLK_DIV3_DIV 6
+#define CLKID_FCLK_DIV3 7
+#define CLKID_FCLK_DIV4_DIV 8
+#define CLKID_FCLK_DIV4 9
+#define CLKID_FCLK_DIV5_DIV 10
+#define CLKID_FCLK_DIV5 11
+#define CLKID_FCLK_DIV7_DIV 12
+#define CLKID_FCLK_DIV7 13
+#define CLKID_FCLK_DIV2P5_DIV 14
+#define CLKID_FCLK_DIV2P5 15
+#define CLKID_GP0_PLL_DCO 16
+#define CLKID_GP0_PLL 17
+#define CLKID_GP1_PLL_DCO 18
+#define CLKID_GP1_PLL 19
+#define CLKID_SYS1_PLL_DCO 20
+#define CLKID_SYS1_PLL 21
+#define CLKID_MCLK_PLL_DCO 22
+#define CLKID_MCLK_PRE 23
+#define CLKID_MCLK_PLL 24
+#define CLKID_HIFI_PLL_DCO 25
+#define CLKID_HIFI_PLL 26
+#define CLKID_PCIE_PLL_DCO 27
+#define CLKID_PCIE_PLL_DCO_DIV2 28
+#define CLKID_PCIE_PLL_OD 29
+#define CLKID_PCIE_PLL 30
+#define CLKID_HDMI_PLL_DCO 31
+#define CLKID_HDMI_PLL_OD 32
+#define CLKID_HDMI_PLL 33
+#define CLKID_MPLL_50M_DIV 34
+#define CLKID_MPLL_50M 35
+#define CLKID_MPLL_PREDIV 36
+#define CLKID_MPLL0_DIV 37
+#define CLKID_MPLL0 38
+#define CLKID_MPLL1_DIV 39
+#define CLKID_MPLL1 40
+#define CLKID_MPLL2_DIV 41
+#define CLKID_MPLL2 42
+#define CLKID_MPLL3_DIV 43
+#define CLKID_MPLL3 44
+#define CLKID_PCIE_BGP 45
+#define CLKID_PCIE_HCSL 46
+#define CLKID_MCLK_0_SEL 47
+#define CLKID_MCLK_0_DIV2 48
+#define CLKID_MCLK_0_PRE 49
+#define CLKID_MCLK_0 50
+#define CLKID_MCLK_1_SEL 51
+#define CLKID_MCLK_1_DIV2 52
+#define CLKID_MCLK_1_PRE 53
+#define CLKID_MCLK_1 54
+
+#endif /* __T7_CLKC_H */
--
2.44.0


2024-03-18 14:54:34

by Rob Herring

[permalink] [raw]
Subject: Re: [RFC][PATCH 1/2] clk: meson: T7: add support for Amlogic T7 SoC PLL clock driver

On Mon, Mar 18, 2024 at 11:43:45AM +0000, Lucas Tanure wrote:
> Add the T7 PLL clock controller driver in the T7 SoC family.
>
> This is RFC patch that enables SDCard, Ethernet and Clocking
> for Amlogic T7 soc.
> In this current state the patch doesn't work and gives a kernel
> panic when probing the meson-axg-mmc for the SDCard.
> DO NOT MERGE.
>
> Signed-off-by: Lucas Tanure <[email protected]>
> ---
> drivers/clk/meson/Kconfig | 25 +
> drivers/clk/meson/Makefile | 2 +
> drivers/clk/meson/t7-peripherals.c | 6368 +++++++++++++++++
> drivers/clk/meson/t7-peripherals.h | 131 +
> drivers/clk/meson/t7-pll.c | 1543 ++++
> drivers/clk/meson/t7-pll.h | 83 +
> .../clock/amlogic,t7-peripherals-clkc.h | 410 ++
> .../dt-bindings/clock/amlogic,t7-pll-clkc.h | 69 +
> 8 files changed, 8631 insertions(+)
> create mode 100644 drivers/clk/meson/t7-peripherals.c
> create mode 100644 drivers/clk/meson/t7-peripherals.h
> create mode 100644 drivers/clk/meson/t7-pll.c
> create mode 100644 drivers/clk/meson/t7-pll.h

> create mode 100644 include/dt-bindings/clock/amlogic,t7-peripherals-clkc.h
> create mode 100644 include/dt-bindings/clock/amlogic,t7-pll-clkc.h

I'm assuming since this is an RFC you know these go in a separate patch
with the DT binding schema which is missing.

Rob

2024-03-18 15:00:48

by Lucas Tanure

[permalink] [raw]
Subject: Re: [RFC][PATCH 1/2] clk: meson: T7: add support for Amlogic T7 SoC PLL clock driver

On Mon, Mar 18, 2024 at 2:54 PM Rob Herring <[email protected]> wrote:
>
> On Mon, Mar 18, 2024 at 11:43:45AM +0000, Lucas Tanure wrote:
> > Add the T7 PLL clock controller driver in the T7 SoC family.
> >
> > This is RFC patch that enables SDCard, Ethernet and Clocking
> > for Amlogic T7 soc.
> > In this current state the patch doesn't work and gives a kernel
> > panic when probing the meson-axg-mmc for the SDCard.
> > DO NOT MERGE.
> >
> > Signed-off-by: Lucas Tanure <[email protected]>
> > ---
> > drivers/clk/meson/Kconfig | 25 +
> > drivers/clk/meson/Makefile | 2 +
> > drivers/clk/meson/t7-peripherals.c | 6368 +++++++++++++++++
> > drivers/clk/meson/t7-peripherals.h | 131 +
> > drivers/clk/meson/t7-pll.c | 1543 ++++
> > drivers/clk/meson/t7-pll.h | 83 +
> > .../clock/amlogic,t7-peripherals-clkc.h | 410 ++
> > .../dt-bindings/clock/amlogic,t7-pll-clkc.h | 69 +
> > 8 files changed, 8631 insertions(+)
> > create mode 100644 drivers/clk/meson/t7-peripherals.c
> > create mode 100644 drivers/clk/meson/t7-peripherals.h
> > create mode 100644 drivers/clk/meson/t7-pll.c
> > create mode 100644 drivers/clk/meson/t7-pll.h
>
> > create mode 100644 include/dt-bindings/clock/amlogic,t7-peripherals-clkc.h
> > create mode 100644 include/dt-bindings/clock/amlogic,t7-pll-clkc.h
>
> I'm assuming since this is an RFC you know these go in a separate patch
> with the DT binding schema which is missing.
>
> Rob

Yes, This would be a few patches at least. The thing right now is to
get it to work.
I think some obscure thing is missing when setting up these clocks,
and only Amlogic knows.

After I have a working driver, I will submit a proper patch series
with documentation for the drivers and device trees.

Thanks
Lucas Tanure

2024-03-31 18:34:01

by Lucas Tanure

[permalink] [raw]
Subject: Re: [RFC][PATCH 1/2] clk: meson: T7: add support for Amlogic T7 SoC PLL clock driver

On Sun, Mar 31, 2024 at 7:25 PM Lucas Tanure <[email protected]> wrote:
>
> On Mon, Mar 18, 2024 at 11:44 AM Lucas Tanure <[email protected]> wrote:
> >
> > Add the T7 PLL clock controller driver in the T7 SoC family.
> >
> > This is RFC patch that enables SDCard, Ethernet and Clocking
> > for Amlogic T7 soc.
> > In this current state the patch doesn't work and gives a kernel
> > panic when probing the meson-axg-mmc for the SDCard.
> > DO NOT MERGE.
> >
> > Signed-off-by: Lucas Tanure <[email protected]>
> > ---
> > drivers/clk/meson/Kconfig | 25 +
> > drivers/clk/meson/Makefile | 2 +
> > drivers/clk/meson/t7-peripherals.c | 6368 +++++++++++++++++
> > drivers/clk/meson/t7-peripherals.h | 131 +
> > drivers/clk/meson/t7-pll.c | 1543 ++++
> > drivers/clk/meson/t7-pll.h | 83 +
> > .../clock/amlogic,t7-peripherals-clkc.h | 410 ++
> > .../dt-bindings/clock/amlogic,t7-pll-clkc.h | 69 +
> > 8 files changed, 8631 insertions(+)
> > create mode 100644 drivers/clk/meson/t7-peripherals.c
> > create mode 100644 drivers/clk/meson/t7-peripherals.h
> > create mode 100644 drivers/clk/meson/t7-pll.c
> > create mode 100644 drivers/clk/meson/t7-pll.h
> > create mode 100644 include/dt-bindings/clock/amlogic,t7-peripherals-clkc.h
> > create mode 100644 include/dt-bindings/clock/amlogic,t7-pll-clkc.h
> >
> > diff --git a/drivers/clk/meson/Kconfig b/drivers/clk/meson/Kconfig
> > index 29ffd14d267b..467b4bf86572 100644
> > --- a/drivers/clk/meson/Kconfig
> > +++ b/drivers/clk/meson/Kconfig
> > @@ -169,4 +169,29 @@ config COMMON_CLK_S4_PERIPHERALS
> > help
> > Support for the peripherals clock controller on Amlogic S805X2 and S905Y4
> > devices, AKA S4. Say Y if you want S4 peripherals clock controller to work.
> > +
> > +config COMMON_CLK_T7_PLL
> > + tristate "T7 SoC PLL clock controllers support"
> > + depends on ARM64
> > + default y
> > + select COMMON_CLK_MESON_CLKC_UTILS
> > + select COMMON_CLK_MESON_MPLL
> > + select COMMON_CLK_MESON_PLL
> > + select COMMON_CLK_MESON_REGMAP
> > + help
> > + Support for the PLL clock controller on Amlogic A113D2 device,AKA T7.
> > + Say Y if you want the board to work, because PLLs are the parent of
> > + most peripherals.
> > +
> > +config COMMON_CLK_T7_PERIPHERALS
> > + tristate "T7 SoC peripherals clock controllers support"
> > + depends on ARM64
> > + default y
> > + select COMMON_CLK_MESON_CLKC_UTILS
> > + select COMMON_CLK_MESON_REGMAP
> > + select COMMON_CLK_MESON_DUALDIV
> > + select COMMON_CLK_MESON_VID_PLL_DIV
> > + help
> > + Support for the peripherals clock controller on Amlogic A113D2 device, AKA T7.
> > + Say Y if you want T7 peripherals clock controller to work.
> > endmenu
> > diff --git a/drivers/clk/meson/Makefile b/drivers/clk/meson/Makefile
> > index 9ee4b954c896..9a044b70a227 100644
> > --- a/drivers/clk/meson/Makefile
> > +++ b/drivers/clk/meson/Makefile
> > @@ -24,3 +24,5 @@ obj-$(CONFIG_COMMON_CLK_G12A) += g12a.o g12a-aoclk.o
> > obj-$(CONFIG_COMMON_CLK_MESON8B) += meson8b.o meson8-ddr.o
> > obj-$(CONFIG_COMMON_CLK_S4_PLL) += s4-pll.o
> > obj-$(CONFIG_COMMON_CLK_S4_PERIPHERALS) += s4-peripherals.o
> > +obj-$(CONFIG_COMMON_CLK_T7_PLL) += t7-pll.o
> > +obj-$(CONFIG_COMMON_CLK_T7_PERIPHERALS) += t7-peripherals.o
> > diff --git a/drivers/clk/meson/t7-peripherals.c b/drivers/clk/meson/t7-peripherals.c
> > new file mode 100644
> > index 000000000000..f88fc2ae4dad
> > --- /dev/null
> > +++ b/drivers/clk/meson/t7-peripherals.c
> > @@ -0,0 +1,6368 @@
> > +// SPDX-License-Identifier: GPL-2.0+
> > +/*
> > + * Amlogic Meson-T7 Clock Controller Driver
> > + *
> > + * Copyright (c) 2018 Amlogic, inc.
> > + */
> > +
> > +#include <linux/clk-provider.h>
> > +#include <linux/of_device.h>
> > +#include <linux/platform_device.h>
> > +
> > +#include "clk-regmap.h"
> > +#include "vid-pll-div.h"
> > +#include "clk-dualdiv.h"
> > +#include "t7-peripherals.h"
> > +#include "meson-clkc-utils.h"
> > +#include <dt-bindings/clock/amlogic,t7-peripherals-clkc.h>
> > +
> > +
> > +/*
> > + *rtc 32k clock
> > + *
> > + *xtal--GATE------------------GATE---------------------|\
> > + * | -------- | \
> > + * | | | | \
> > + * ---| DUAL |----------------------| |
> > + * | | | |____GATE__
> > + * -------- | | rtc_32k_out
> > + * PAD-----------------------------------------| /
> > + * | /
> > + * DUAL function: |/
> > + * bit 28 in RTC_BY_OSCIN_CTRL0 control the dual function.
> > + * when bit 28 = 0
> > + * f = 24M/N0
> > + * when bit 28 = 1
> > + * output N1 and N2 in turns.
> > + * T = (x*T1 + y*T2)/x+y
> > + * f = (24M/(N0*M0 + N1*M1)) * (M0 + M1)
> > + * f: the frequecy value (HZ)
> > + * | | | |
> > + * | Div1 |-| Cnt1 |
> > + * /|______| |______|\
> > + * -| ______ ______ ---> Out
> > + * \| | | |/
> > + * | Div2 |-| Cnt2 |
> > + * |______| |______|
> > + **/
> > +
> > +/*
> > + * rtc 32k clock in gate
> > + */
> > +static struct clk_regmap t7_rtc_32k_clkin = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_RTC_BY_OSCIN_CTRL0,
> > + .bit_idx = 31,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "rtc_32k_clkin",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_data = &(const struct clk_parent_data) {
> > + .fw_name = "xtal",
> > + },
> > + .num_parents = 1,
> > + },
> > +};
> > +
> > +static const struct meson_clk_dualdiv_param t7_32k_div_table[] = {
> > + {
> > + .dual = 1,
> > + .n1 = 733,
> > + .m1 = 8,
> > + .n2 = 732,
> > + .m2 = 11,
> > + },
> > + {}
> > +};
> > +
> > +static struct clk_regmap t7_rtc_32k_div = {
> > + .data = &(struct meson_clk_dualdiv_data){
> > + .n1 = {
> > + .reg_off = CLKCTRL_RTC_BY_OSCIN_CTRL0,
> > + .shift = 0,
> > + .width = 12,
> > + },
> > + .n2 = {
> > + .reg_off = CLKCTRL_RTC_BY_OSCIN_CTRL0,
> > + .shift = 12,
> > + .width = 12,
> > + },
> > + .m1 = {
> > + .reg_off = CLKCTRL_RTC_BY_OSCIN_CTRL1,
> > + .shift = 0,
> > + .width = 12,
> > + },
> > + .m2 = {
> > + .reg_off = CLKCTRL_RTC_BY_OSCIN_CTRL1,
> > + .shift = 12,
> > + .width = 12,
> > + },
> > + .dual = {
> > + .reg_off = CLKCTRL_RTC_BY_OSCIN_CTRL0,
> > + .shift = 28,
> > + .width = 1,
> > + },
> > + .table = t7_32k_div_table,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "rtc_32k_div",
> > + .ops = &meson_clk_dualdiv_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_rtc_32k_clkin.hw
> > + },
> > + .num_parents = 1,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_rtc_32k_xtal = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_RTC_BY_OSCIN_CTRL1,
> > + .bit_idx = 24,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "rtc_32k_xtal",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_rtc_32k_clkin.hw
> > + },
> > + .num_parents = 1,
> > + },
> > +};
> > +
> > +/*
> > + * three parent for rtc clock out
> > + * pad is from where?
> > + */
> > +static u32 rtc_32k_sel[] = {0, 1};
> > +static struct clk_regmap t7_rtc_32k_sel = {
> > + .data = &(struct clk_regmap_mux_data) {
> > + .offset = CLKCTRL_RTC_CTRL,
> > + .mask = 0x3,
> > + .shift = 0,
> > + .table = rtc_32k_sel,
> > + .flags = CLK_MUX_ROUND_CLOSEST,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "rtc_32k_sel",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_rtc_32k_xtal.hw,
> > + &t7_rtc_32k_div.hw
> > + },
> > + .num_parents = 2,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_rtc_clk = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_RTC_BY_OSCIN_CTRL0,
> > + .bit_idx = 30,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "rtc_clk",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_rtc_32k_sel.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +/* sys clk */
> > +static u32 mux_table_sys_ab_clk_sel[] = { 0, 1, 2, 3, 4, 5, 7 };
> > +static const struct clk_parent_data t7_table_sys_ab_clk_sel[] = {
> > + { .fw_name = "xtal", },
> > + { .fw_name = "fclk_div2", },
> > + { .fw_name = "fclk_div3", },
> > + { .fw_name = "fclk_div4", },
> > + { .fw_name = "fclk_div5", },
> > + { .fw_name = "axi_clk_frcpu", },
> > + { .hw = &t7_rtc_clk.hw }
> > +};
> > +
> > +static struct clk_regmap t7_sysclk_b_sel = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_SYS_CLK_CTRL0,
> > + .mask = 0x7,
> > + .shift = 26,
> > + .table = mux_table_sys_ab_clk_sel,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "sysclk_b_sel",
> > + .ops = &clk_regmap_mux_ro_ops,
> > + .parent_data = t7_table_sys_ab_clk_sel,
> > + .num_parents = ARRAY_SIZE(t7_table_sys_ab_clk_sel),
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_sysclk_b_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_SYS_CLK_CTRL0,
> > + .shift = 16,
> > + .width = 10,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "sysclk_b_div",
> > + .ops = &clk_regmap_divider_ro_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_sysclk_b_sel.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_sysclk_b = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_SYS_CLK_CTRL0,
> > + .bit_idx = 29,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "sysclk_b",
> > + .ops = &clk_regmap_gate_ro_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_sysclk_b_div.hw
> > + },
> > + .num_parents = 1,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_sysclk_a_sel = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_SYS_CLK_CTRL0,
> > + .mask = 0x7,
> > + .shift = 10,
> > + .table = mux_table_sys_ab_clk_sel,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "sysclk_a_sel",
> > + .ops = &clk_regmap_mux_ro_ops,
> > + .parent_data = t7_table_sys_ab_clk_sel,
> > + .num_parents = ARRAY_SIZE(t7_table_sys_ab_clk_sel),
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_sysclk_a_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_SYS_CLK_CTRL0,
> > + .shift = 0,
> > + .width = 10,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "sysclk_a_div",
> > + .ops = &clk_regmap_divider_ro_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_sysclk_a_sel.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_sysclk_a = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_SYS_CLK_CTRL0,
> > + .bit_idx = 13,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "sysclk_a",
> > + .ops = &clk_regmap_gate_ro_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_sysclk_a_div.hw
> > + },
> > + .num_parents = 1,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_sys_clk = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_SYS_CLK_CTRL0,
> > + .mask = 0x1,
> > + .shift = 15,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "sys_clk",
> > + .ops = &clk_regmap_mux_ro_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_sysclk_a.hw,
> > + &t7_sysclk_b.hw,
> > + },
> > + .num_parents = 2,
> > + },
> > +};
> > +
> > +/*axi clk*/
> > +
> > +/*ceca_clk*/
> > +static struct clk_regmap t7_ceca_32k_clkin = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_CECA_CTRL0,
> > + .bit_idx = 31,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "ceca_32k_clkin",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_data = &(const struct clk_parent_data) {
> > + .fw_name = "xtal",
> > + },
> > + .num_parents = 1,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_ceca_32k_div = {
> > + .data = &(struct meson_clk_dualdiv_data){
> > + .n1 = {
> > + .reg_off = CLKCTRL_CECA_CTRL0,
> > + .shift = 0,
> > + .width = 12,
> > + },
> > + .n2 = {
> > + .reg_off = CLKCTRL_CECA_CTRL0,
> > + .shift = 12,
> > + .width = 12,
> > + },
> > + .m1 = {
> > + .reg_off = CLKCTRL_CECA_CTRL1,
> > + .shift = 0,
> > + .width = 12,
> > + },
> > + .m2 = {
> > + .reg_off = CLKCTRL_CECA_CTRL1,
> > + .shift = 12,
> > + .width = 12,
> > + },
> > + .dual = {
> > + .reg_off = CLKCTRL_CECA_CTRL0,
> > + .shift = 28,
> > + .width = 1,
> > + },
> > + .table = t7_32k_div_table,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "ceca_32k_div",
> > + .ops = &meson_clk_dualdiv_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_ceca_32k_clkin.hw
> > + },
> > + .num_parents = 1,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_ceca_32k_sel_pre = {
> > + .data = &(struct clk_regmap_mux_data) {
> > + .offset = CLKCTRL_CECA_CTRL1,
> > + .mask = 0x1,
> > + .shift = 24,
> > + .flags = CLK_MUX_ROUND_CLOSEST,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "ceca_32k_sel_pre",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_ceca_32k_div.hw,
> > + &t7_ceca_32k_clkin.hw
> > + },
> > + .num_parents = 2,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_ceca_32k_sel = {
> > + .data = &(struct clk_regmap_mux_data) {
> > + .offset = CLKCTRL_CECA_CTRL1,
> > + .mask = 0x1,
> > + .shift = 31,
> > + .flags = CLK_MUX_ROUND_CLOSEST,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "ceca_32k_sel",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_ceca_32k_sel_pre.hw,
> > + &t7_rtc_clk.hw
> > + },
> > + .num_parents = 2,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_ceca_32k_clkout = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_CECA_CTRL0,
> > + .bit_idx = 30,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "ceca_32k_clkout",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_ceca_32k_sel.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +/*cecb_clk*/
> > +static struct clk_regmap t7_cecb_32k_clkin = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_CECB_CTRL0,
> > + .bit_idx = 31,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "cecb_32k_clkin",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_data = &(const struct clk_parent_data) {
> > + .fw_name = "xtal",
> > + },
> > + .num_parents = 1,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_cecb_32k_div = {
> > + .data = &(struct meson_clk_dualdiv_data){
> > + .n1 = {
> > + .reg_off = CLKCTRL_CECB_CTRL0,
> > + .shift = 0,
> > + .width = 12,
> > + },
> > + .n2 = {
> > + .reg_off = CLKCTRL_CECB_CTRL0,
> > + .shift = 12,
> > + .width = 12,
> > + },
> > + .m1 = {
> > + .reg_off = CLKCTRL_CECB_CTRL1,
> > + .shift = 0,
> > + .width = 12,
> > + },
> > + .m2 = {
> > + .reg_off = CLKCTRL_CECB_CTRL1,
> > + .shift = 12,
> > + .width = 12,
> > + },
> > + .dual = {
> > + .reg_off = CLKCTRL_CECB_CTRL0,
> > + .shift = 28,
> > + .width = 1,
> > + },
> > + .table = t7_32k_div_table,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "cecb_32k_div",
> > + .ops = &meson_clk_dualdiv_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_cecb_32k_clkin.hw
> > + },
> > + .num_parents = 1,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_cecb_32k_sel_pre = {
> > + .data = &(struct clk_regmap_mux_data) {
> > + .offset = CLKCTRL_CECB_CTRL1,
> > + .mask = 0x1,
> > + .shift = 24,
> > + .flags = CLK_MUX_ROUND_CLOSEST,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "cecb_32k_sel_pre",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_cecb_32k_div.hw,
> > + &t7_cecb_32k_clkin.hw
> > + },
> > + .num_parents = 2,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_cecb_32k_sel = {
> > + .data = &(struct clk_regmap_mux_data) {
> > + .offset = CLKCTRL_CECB_CTRL1,
> > + .mask = 0x1,
> > + .shift = 31,
> > + .flags = CLK_MUX_ROUND_CLOSEST,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "cecb_32k_sel",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_cecb_32k_sel_pre.hw,
> > + &t7_rtc_clk.hw
> > + },
> > + .num_parents = 2,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_cecb_32k_clkout = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_CECB_CTRL0,
> > + .bit_idx = 30,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "cecb_32k_clkout",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_cecb_32k_sel.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static const struct clk_parent_data t7_sc_parent_data[] = {
> > + { .fw_name = "fclk_div4", },
> > + { .fw_name = "fclk_div3", },
> > + { .fw_name = "fclk_div5", },
> > + { .fw_name = "xtal", }
> > +};
> > +
> > +static struct clk_regmap t7_sc_clk_mux = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_SC_CLK_CTRL,
> > + .mask = 0x3,
> > + .shift = 9,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "sc_clk_mux",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_sc_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_sc_parent_data),
> > + .flags = CLK_GET_RATE_NOCACHE,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_sc_clk_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_SC_CLK_CTRL,
> > + .shift = 0,
> > + .width = 8,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "sc_clk_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_sc_clk_mux.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_sc_clk_gate = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_SC_CLK_CTRL,
> > + .bit_idx = 8,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "sc_clk_gate",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_sc_clk_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +/*rama_clk*/
> > +
> > +/*dspa_clk*/
> > +static const struct clk_parent_data t7_dsp_parent_hws[] = {
> > + { .fw_name = "xtal", },
> > + { .fw_name = "fclk_div2p5", },
> > + { .fw_name = "fclk_div3", },
> > + { .fw_name = "fclk_div5", },
> > + { .fw_name = "hifi_pll", },
> > + { .fw_name = "fclk_div4", },
> > + { .fw_name = "fclk_div7", },
> > + { .hw = &t7_rtc_clk.hw }
> > +};
> > +
> > +static struct clk_regmap t7_dspa_a_mux = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_DSPA_CLK_CTRL0,
> > + .mask = 0x7,
> > + .shift = 10,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "dspa_a_mux",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_dsp_parent_hws,
> > + .num_parents = ARRAY_SIZE(t7_dsp_parent_hws),
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_dspa_a_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_DSPA_CLK_CTRL0,
> > + .shift = 0,
> > + .width = 10,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "dspa_a_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_dspa_a_mux.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_dspa_a_gate = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_DSPA_CLK_CTRL0,
> > + .bit_idx = 13,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "dspa_a_gate",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_dspa_a_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_dspa_b_mux = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_DSPA_CLK_CTRL0,
> > + .mask = 0x7,
> > + .shift = 26,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "dspa_b_mux",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_dsp_parent_hws,
> > + .num_parents = ARRAY_SIZE(t7_dsp_parent_hws),
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_dspa_b_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_DSPA_CLK_CTRL0,
> > + .shift = 16,
> > + .width = 10,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "dspa_b_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_dspa_b_mux.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_dspa_b_gate = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_DSPA_CLK_CTRL0,
> > + .bit_idx = 29,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "dspa_b_gate",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_dspa_b_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_dspa_mux = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_DSPA_CLK_CTRL0,
> > + .mask = 0x1,
> > + .shift = 15,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "dspa_mux",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_dspa_a_gate.hw,
> > + &t7_dspa_b_gate.hw,
> > + },
> > + .num_parents = 2,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_dspb_a_mux = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_DSPB_CLK_CTRL0,
> > + .mask = 0x7,
> > + .shift = 10,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "dspb_a_mux",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_dsp_parent_hws,
> > + .num_parents = ARRAY_SIZE(t7_dsp_parent_hws),
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_dspb_a_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_DSPB_CLK_CTRL0,
> > + .shift = 0,
> > + .width = 10,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "dspb_a_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_dspb_a_mux.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_dspb_a_gate = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_DSPB_CLK_CTRL0,
> > + .bit_idx = 13,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "dspb_a_gate",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_dspb_a_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_dspb_b_mux = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_DSPB_CLK_CTRL0,
> > + .mask = 0x7,
> > + .shift = 26,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "dspb_b_mux",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_dsp_parent_hws,
> > + .num_parents = ARRAY_SIZE(t7_dsp_parent_hws),
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_dspb_b_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_DSPB_CLK_CTRL0,
> > + .shift = 16,
> > + .width = 10,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "dspb_b_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_dspb_b_mux.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_dspb_b_gate = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_DSPB_CLK_CTRL0,
> > + .bit_idx = 29,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "dspb_b_gate",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_dspb_b_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_dspb_mux = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_DSPB_CLK_CTRL0,
> > + .mask = 0x1,
> > + .shift = 15,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "dspb_mux",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_dspb_a_gate.hw,
> > + &t7_dspb_b_gate.hw,
> > + },
> > + .num_parents = 2,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +/*12_24M clk*/
> > +static struct clk_regmap t7_24M_clk_gate = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_CLK12_24_CTRL,
> > + .bit_idx = 11,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "24m",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_data = &(const struct clk_parent_data) {
> > + .fw_name = "xtal",
> > + },
> > + .num_parents = 1,
> > + },
> > +};
> > +
> > +static struct clk_fixed_factor t7_12M_clk_div = {
> > + .mult = 1,
> > + .div = 2,
> > + .hw.init = &(struct clk_init_data){
> > + .name = "24m_div2",
> > + .ops = &clk_fixed_factor_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_24M_clk_gate.hw
> > + },
> > + .num_parents = 1,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_12M_clk_gate = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_CLK12_24_CTRL,
> > + .bit_idx = 10,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "12m",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_12M_clk_div.hw
> > + },
> > + .num_parents = 1,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_25M_clk_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_CLK12_24_CTRL,
> > + .shift = 0,
> > + .width = 8,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "25M_clk_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_data = &(const struct clk_parent_data) {
> > + .fw_name = "fclk_div2",
> > + },
> > + .num_parents = 1,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_25M_clk_gate = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_CLK12_24_CTRL,
> > + .bit_idx = 12,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "25m",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_25M_clk_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +/* Video Clocks */
> > +static struct clk_regmap t7_vid_pll_div = {
> > + .data = &(struct meson_vid_pll_div_data){
> > + .val = {
> > + .reg_off = CLKCTRL_VID_PLL_CLK0_DIV,
> > + .shift = 0,
> > + .width = 15,
> > + },
> > + .sel = {
> > + .reg_off = CLKCTRL_VID_PLL_CLK0_DIV,
> > + .shift = 16,
> > + .width = 2,
> > + },
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "vid_pll_div",
> > + .ops = &meson_vid_pll_div_ro_ops,
> > + .parent_data = &(const struct clk_parent_data) {
> > + .fw_name = "hdmi_pll",
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
> > + },
> > +};
> > +
> > +static const struct clk_parent_data t7_vid_pll_parent_data[] = {
> > + { .hw = &t7_vid_pll_div.hw, },
> > + { .fw_name = "hdmi_pll", },
> > +};
> > +
> > +static struct clk_regmap t7_vid_pll_sel = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_VID_PLL_CLK0_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_data = t7_vid_pll_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_vid_pll_parent_data),
> > + .flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_vid_pll = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_VID_PLL_CLK0_DIV,
> > + .bit_idx = 19,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "vid_pll",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_vid_pll_sel.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static const struct clk_parent_data t7_vclk_parent_data[] = {
> > + { .hw = &t7_vid_pll.hw },
> > + { .fw_name = "gp0_pll", },
> > + { .fw_name = "hifi_pll", },
> > + { .fw_name = "mpll1", },
> > + { .fw_name = "fclk_div3", },
> > + { .fw_name = "fclk_div4", },
> > + { .fw_name = "fclk_div5", },
> > + { .fw_name = "fclk_div7" },
> > +};
> > +
> > +static struct clk_regmap t7_vclk_sel = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_VID_CLK0_CTRL,
> > + .mask = 0x7,
> > + .shift = 16,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "vclk_sel",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_vclk_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_vclk_parent_data),
> > + .flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_vclk2_sel = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_VIID_CLK0_CTRL,
> > + .mask = 0x7,
> > + .shift = 16,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "vclk2_sel",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_vclk_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_vclk_parent_data),
> > + .flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_vclk_input = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_VID_CLK0_DIV,
> > + .bit_idx = 16,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "vclk_input",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) { &t7_vclk_sel.hw },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_vclk2_input = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_VIID_CLK0_DIV,
> > + .bit_idx = 16,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "vclk2_input",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) { &t7_vclk2_sel.hw },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_vclk_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_VID_CLK0_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 *[]) {
> > + &t7_vclk_input.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_GET_RATE_NOCACHE,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_vclk2_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_VIID_CLK0_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 *[]) {
> > + &t7_vclk2_input.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_GET_RATE_NOCACHE,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_vclk = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_VID_CLK0_CTRL,
> > + .bit_idx = 19,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "vclk",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) { &t7_vclk_div.hw },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_vclk2 = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_VIID_CLK0_CTRL,
> > + .bit_idx = 19,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "vclk2",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) { &t7_vclk2_div.hw },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_vclk_div1 = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_VID_CLK0_CTRL,
> > + .bit_idx = 0,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "vclk_div1",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) { &t7_vclk.hw },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_vclk_div2_en = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_VID_CLK0_CTRL,
> > + .bit_idx = 1,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "vclk_div2_en",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) { &t7_vclk.hw },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_vclk_div4_en = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_VID_CLK0_CTRL,
> > + .bit_idx = 2,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "vclk_div4_en",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) { &t7_vclk.hw },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_vclk_div6_en = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_VID_CLK0_CTRL,
> > + .bit_idx = 3,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "vclk_div6_en",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) { &t7_vclk.hw },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_vclk_div12_en = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_VID_CLK0_CTRL,
> > + .bit_idx = 4,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "vclk_div12_en",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) { &t7_vclk.hw },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_vclk2_div1 = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_VIID_CLK0_CTRL,
> > + .bit_idx = 0,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "vclk2_div1",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) { &t7_vclk2.hw },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_vclk2_div2_en = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_VIID_CLK0_CTRL,
> > + .bit_idx = 1,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "vclk2_div2_en",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) { &t7_vclk2.hw },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_vclk2_div4_en = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_VIID_CLK0_CTRL,
> > + .bit_idx = 2,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "vclk2_div4_en",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) { &t7_vclk2.hw },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_vclk2_div6_en = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_VIID_CLK0_CTRL,
> > + .bit_idx = 3,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "vclk2_div6_en",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) { &t7_vclk2.hw },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_vclk2_div12_en = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_VIID_CLK0_CTRL,
> > + .bit_idx = 4,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "vclk2_div12_en",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) { &t7_vclk2.hw },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static struct clk_fixed_factor t7_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 *[]) {
> > + &t7_vclk_div2_en.hw
> > + },
> > + .num_parents = 1,
> > + },
> > +};
> > +
> > +static struct clk_fixed_factor t7_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 *[]) {
> > + &t7_vclk_div4_en.hw
> > + },
> > + .num_parents = 1,
> > + },
> > +};
> > +
> > +static struct clk_fixed_factor t7_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 *[]) {
> > + &t7_vclk_div6_en.hw
> > + },
> > + .num_parents = 1,
> > + },
> > +};
> > +
> > +static struct clk_fixed_factor t7_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 *[]) {
> > + &t7_vclk_div12_en.hw
> > + },
> > + .num_parents = 1,
> > + },
> > +};
> > +
> > +static struct clk_fixed_factor t7_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 *[]) {
> > + &t7_vclk2_div2_en.hw
> > + },
> > + .num_parents = 1,
> > + },
> > +};
> > +
> > +static struct clk_fixed_factor t7_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 *[]) {
> > + &t7_vclk2_div4_en.hw
> > + },
> > + .num_parents = 1,
> > + },
> > +};
> > +
> > +static struct clk_fixed_factor t7_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 *[]) {
> > + &t7_vclk2_div6_en.hw
> > + },
> > + .num_parents = 1,
> > + },
> > +};
> > +
> > +static struct clk_fixed_factor t7_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 *[]) {
> > + &t7_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 *t7_cts_parent_hws[] = {
> > + &t7_vclk_div1.hw,
> > + &t7_vclk_div2.hw,
> > + &t7_vclk_div4.hw,
> > + &t7_vclk_div6.hw,
> > + &t7_vclk_div12.hw,
> > + &t7_vclk2_div1.hw,
> > + &t7_vclk2_div2.hw,
> > + &t7_vclk2_div4.hw,
> > + &t7_vclk2_div6.hw,
> > + &t7_vclk2_div12.hw
> > +};
> > +
> > +static struct clk_regmap t7_cts_enci_sel = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_VID_CLK0_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 = t7_cts_parent_hws,
> > + .num_parents = ARRAY_SIZE(t7_cts_parent_hws),
> > + .flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_cts_encp_sel = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_VID_CLK1_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 = t7_cts_parent_hws,
> > + .num_parents = ARRAY_SIZE(t7_cts_parent_hws),
> > + .flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_cts_vdac_sel = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_VIID_CLK1_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 = t7_cts_parent_hws,
> > + .num_parents = ARRAY_SIZE(t7_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 *t7_cts_hdmi_tx_parent_hws[] = {
> > + &t7_vclk_div1.hw,
> > + &t7_vclk_div2.hw,
> > + &t7_vclk_div4.hw,
> > + &t7_vclk_div6.hw,
> > + &t7_vclk_div12.hw,
> > + &t7_vclk2_div1.hw,
> > + &t7_vclk2_div2.hw,
> > + &t7_vclk2_div4.hw,
> > + &t7_vclk2_div6.hw,
> > + &t7_vclk2_div12.hw
> > +};
> > +
> > +static struct clk_regmap t7_hdmi_tx_sel = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_HDMI_CLK_CTRL,
> > + .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 = t7_cts_hdmi_tx_parent_hws,
> > + .num_parents = ARRAY_SIZE(t7_cts_hdmi_tx_parent_hws),
> > + .flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_cts_enci = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_VID_CLK2_CTRL2,
> > + .bit_idx = 0,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "cts_enci",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_cts_enci_sel.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_cts_encp = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_VID_CLK2_CTRL2,
> > + .bit_idx = 2,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "cts_encp",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_cts_encp_sel.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_cts_vdac = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_VID_CLK2_CTRL2,
> > + .bit_idx = 4,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "cts_vdac",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_cts_vdac_sel.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_hdmi_tx = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_VID_CLK2_CTRL2,
> > + .bit_idx = 5,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "hdmi_tx",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_hdmi_tx_sel.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static const struct clk_parent_data t7_hdmitx_sys_parent_data[] = {
> > + { .fw_name = "xtal", },
> > + { .fw_name = "fclk_div4", },
> > + { .fw_name = "fclk_div3", },
> > + { .fw_name = "fclk_div5", }
> > +};
> > +
> > +static struct clk_regmap t7_hdmitx_sys_sel = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_HDMI_CLK_CTRL,
> > + .mask = 0x3,
> > + .shift = 9,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "hdmitx_sys_sel",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_hdmitx_sys_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_hdmitx_sys_parent_data),
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_hdmitx_sys_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_HDMI_CLK_CTRL,
> > + .shift = 0,
> > + .width = 7,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "hdmitx_sys_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) { &t7_hdmitx_sys_sel.hw },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_hdmitx_sys = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_HDMI_CLK_CTRL,
> > + .bit_idx = 8,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "hdmitx_sys",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) { &t7_hdmitx_sys.hw },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_hdmitx_prif_sel = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_HTX_CLK_CTRL0,
> > + .mask = 0x3,
> > + .shift = 9,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "hdmitx_prif_sel",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_hdmitx_sys_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_hdmitx_sys_parent_data),
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_hdmitx_prif_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_HTX_CLK_CTRL0,
> > + .shift = 0,
> > + .width = 7,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "hdmitx_prif_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) { &t7_hdmitx_prif_sel.hw },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_hdmitx_prif = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_HTX_CLK_CTRL0,
> > + .bit_idx = 8,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "hdmitx_prif",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) { &t7_hdmitx_prif.hw },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_hdmitx_200m_sel = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_HTX_CLK_CTRL0,
> > + .mask = 0x3,
> > + .shift = 25,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "hdmitx_200m_sel",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_hdmitx_sys_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_hdmitx_sys_parent_data),
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_hdmitx_200m_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_HTX_CLK_CTRL0,
> > + .shift = 16,
> > + .width = 7,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "hdmitx_200m_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) { &t7_hdmitx_200m_sel.hw },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_hdmitx_200m = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_HTX_CLK_CTRL0,
> > + .bit_idx = 24,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "hdmitx_200m",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) { &t7_hdmitx_200m.hw },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_hdmitx_aud_sel = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_HTX_CLK_CTRL1,
> > + .mask = 0x3,
> > + .shift = 9,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "hdmitx_aud_sel",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_hdmitx_sys_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_hdmitx_sys_parent_data),
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_hdmitx_aud_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_HTX_CLK_CTRL1,
> > + .shift = 0,
> > + .width = 7,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "hdmitx_aud_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) { &t7_hdmitx_aud_sel.hw },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_hdmitx_aud = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_HTX_CLK_CTRL1,
> > + .bit_idx = 8,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "hdmitx_aud",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) { &t7_hdmitx_aud_sel.hw },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_hdmirx_5m_sel = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_HRX_CLK_CTRL0,
> > + .mask = 0x3,
> > + .shift = 9,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "hdmirx_5m_sel",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_hdmitx_sys_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_hdmitx_sys_parent_data),
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_hdmirx_5m_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_HRX_CLK_CTRL0,
> > + .shift = 0,
> > + .width = 7,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "hdmirx_5m_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) { &t7_hdmirx_5m_sel.hw },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_hdmirx_5m = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_HRX_CLK_CTRL0,
> > + .bit_idx = 8,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "hdmirx_5m",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) { &t7_hdmirx_5m_div.hw },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_hdmirx_2m_sel = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_HRX_CLK_CTRL0,
> > + .mask = 0x3,
> > + .shift = 25,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "hdmirx_2m_sel",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_hdmitx_sys_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_hdmitx_sys_parent_data),
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_hdmirx_2m_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_HRX_CLK_CTRL0,
> > + .shift = 16,
> > + .width = 7,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "hdmirx_2m_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) { &t7_hdmirx_2m_sel.hw },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_hdmirx_2m = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_HRX_CLK_CTRL0,
> > + .bit_idx = 24,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "hdmirx_2m",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) { &t7_hdmirx_2m_div.hw },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_hdmirx_cfg_sel = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_HRX_CLK_CTRL1,
> > + .mask = 0x3,
> > + .shift = 9,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "hdmirx_cfg_sel",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_hdmitx_sys_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_hdmitx_sys_parent_data),
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_hdmirx_cfg_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_HRX_CLK_CTRL1,
> > + .shift = 0,
> > + .width = 7,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "hdmirx_cfg_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) { &t7_hdmirx_cfg_sel.hw },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_hdmirx_cfg = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_HRX_CLK_CTRL1,
> > + .bit_idx = 8,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "hdmirx_cfg",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) { &t7_hdmirx_cfg_div.hw },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_hdmirx_hdcp_sel = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_HRX_CLK_CTRL1,
> > + .mask = 0x3,
> > + .shift = 25,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "hdmirx_hdcp_sel",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_hdmitx_sys_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_hdmitx_sys_parent_data),
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_hdmirx_hdcp_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_HRX_CLK_CTRL1,
> > + .shift = 16,
> > + .width = 7,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "hdmirx_hdcp_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) { &t7_hdmirx_hdcp_sel.hw },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_hdmirx_hdcp = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_HRX_CLK_CTRL1,
> > + .bit_idx = 24,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "hdmirx_hdcp",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) { &t7_hdmirx_hdcp_div.hw },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_hdmirx_aud_pll_sel = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_HRX_CLK_CTRL2,
> > + .mask = 0x3,
> > + .shift = 9,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "hdmirx_aud_pll_sel",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_hdmitx_sys_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_hdmitx_sys_parent_data),
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_hdmirx_aud_pll_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_HRX_CLK_CTRL2,
> > + .shift = 0,
> > + .width = 7,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "hdmirx_aud_pll_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) { &t7_hdmirx_aud_pll_sel.hw },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_hdmirx_aud_pll = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_HRX_CLK_CTRL2,
> > + .bit_idx = 8,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "hdmirx_aud_pll",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) { &t7_hdmirx_aud_pll_div.hw },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_hdmirx_acr_sel = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_HRX_CLK_CTRL2,
> > + .mask = 0x3,
> > + .shift = 25,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "hdmirx_acr_sel",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_hdmitx_sys_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_hdmitx_sys_parent_data),
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_hdmirx_acr_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_HRX_CLK_CTRL2,
> > + .shift = 16,
> > + .width = 7,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "hdmirx_acr_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) { &t7_hdmirx_acr_sel.hw },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_hdmirx_acr = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_HRX_CLK_CTRL2,
> > + .bit_idx = 24,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "hdmirx_acr",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) { &t7_hdmirx_acr_div.hw },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_hdmirx_meter_sel = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_HRX_CLK_CTRL3,
> > + .mask = 0x3,
> > + .shift = 9,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "hdmirx_meter_sel",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_hdmitx_sys_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_hdmitx_sys_parent_data),
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_hdmirx_meter_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_HRX_CLK_CTRL3,
> > + .shift = 0,
> > + .width = 7,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "hdmirx_meter_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) { &t7_hdmirx_meter_sel.hw },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_hdmirx_meter = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_HRX_CLK_CTRL3,
> > + .bit_idx = 8,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "hdmirx_meter",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) { &t7_hdmirx_meter_div.hw },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_vid_lock_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_VID_LOCK_CLK_CTRL,
> > + .shift = 0,
> > + .width = 7,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "vid_lock_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_data = &(const struct clk_parent_data) {
> > + .fw_name = "xtal",
> > + },
> > + .num_parents = 1,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_vid_lock_clk = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_VID_LOCK_CLK_CTRL,
> > + .bit_idx = 7,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "vid_lock_clk",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) { &t7_vid_lock_div.hw },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_ts_clk_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_TS_CLK_CTRL,
> > + .shift = 0,
> > + .width = 8,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "ts_clk_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_data = &(const struct clk_parent_data) {
> > + .fw_name = "xtal",
> > + },
> > + .num_parents = 1,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_ts_clk_gate = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_TS_CLK_CTRL,
> > + .bit_idx = 8,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "ts_clk_gate",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_ts_clk_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT
> > + },
> > +};
> > +
> > +/*mali_clk*/
> > +/*
> > + * The MALI IP is clocked by two identical clocks (mali_0 and mali_1)
> > + * muxed by a glitch-free switch on Meson8b and Meson8m2 and later.
> > + *
> > + * CLK_SET_RATE_PARENT is added for mali_0_sel clock
> > + * 1.gp0 pll only support the 846M, avoid other rate 500/400M from it
> > + * 2.hifi pll is used for other module, skip it, avoid some rate from it
> > + */
> > +static u32 mux_table_mali[] = { 0, 3, 4, 5, 6};
> > +
> > +static const struct clk_parent_data t7_mali_0_1_parent_data[] = {
> > + { .fw_name = "xtal", },
> > + { .fw_name = "fclk_div2p5", },
> > + { .fw_name = "fclk_div3", },
> > + { .fw_name = "fclk_div4", },
> > + { .fw_name = "fclk_div5", },
> > +};
> > +
> > +static struct clk_regmap t7_mali_0_sel = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_MALI_CLK_CTRL,
> > + .mask = 0x7,
> > + .shift = 9,
> > + .table = mux_table_mali,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "mali_0_sel",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_mali_0_1_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_mali_0_1_parent_data),
> > + .flags = CLK_GET_RATE_NOCACHE,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_mali_0_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_MALI_CLK_CTRL,
> > + .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 *[]) {
> > + &t7_mali_0_sel.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_mali_0 = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_MALI_CLK_CTRL,
> > + .bit_idx = 8,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "mali_0",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_mali_0_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_GATE | CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_mali_1_sel = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_MALI_CLK_CTRL,
> > + .mask = 0x7,
> > + .shift = 25,
> > + .table = mux_table_mali,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "mali_1_sel",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_mali_0_1_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_mali_0_1_parent_data),
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_mali_1_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_MALI_CLK_CTRL,
> > + .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 *[]) {
> > + &t7_mali_1_sel.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_mali_1 = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_MALI_CLK_CTRL,
> > + .bit_idx = 24,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "mali_1",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_mali_1_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_GATE | CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static const struct clk_hw *t7_mali_parent_hws[] = {
> > + &t7_mali_0.hw,
> > + &t7_mali_1.hw
> > +};
> > +
> > +static struct clk_regmap t7_mali_mux = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_MALI_CLK_CTRL,
> > + .mask = 1,
> > + .shift = 31,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "mali",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_hws = t7_mali_parent_hws,
> > + .num_parents = 2,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +/* cts_vdec_clk */
> > +static const struct clk_parent_data t7_dec_parent_hws[] = {
> > + { .fw_name = "fclk_div2p5", },
> > + { .fw_name = "fclk_div3", },
> > + { .fw_name = "fclk_div4", },
> > + { .fw_name = "fclk_div5", },
> > + { .fw_name = "fclk_div7", },
> > + { .fw_name = "hifi_pll", },
> > + { .fw_name = "gp0_pll", },
> > + { .fw_name = "xtal", }
> > +};
> > +
> > +static struct clk_regmap t7_vdec_p0_mux = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_VDEC_CLK_CTRL,
> > + .mask = 0x7,
> > + .shift = 9,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "vdec_p0_mux",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_dec_parent_hws,
> > + .num_parents = ARRAY_SIZE(t7_dec_parent_hws),
> > + .flags = CLK_GET_RATE_NOCACHE,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_vdec_p0_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_VDEC_CLK_CTRL,
> > + .shift = 0,
> > + .width = 7,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "vdec_p0_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_vdec_p0_mux.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_vdec_p0 = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_VDEC_CLK_CTRL,
> > + .bit_idx = 8,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "vdec_p0",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_vdec_p0_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_vdec_p1_mux = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_VDEC3_CLK_CTRL,
> > + .mask = 0x7,
> > + .shift = 9,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "vdec_p1_mux",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_dec_parent_hws,
> > + .num_parents = ARRAY_SIZE(t7_dec_parent_hws),
> > + .flags = CLK_GET_RATE_NOCACHE,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_vdec_p1_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_VDEC3_CLK_CTRL,
> > + .shift = 0,
> > + .width = 7,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "vdec_p1_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_vdec_p1_mux.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_vdec_p1 = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_VDEC3_CLK_CTRL,
> > + .bit_idx = 8,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "vdec_p1",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_vdec_p1_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_vdec_mux = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_VDEC3_CLK_CTRL,
> > + .mask = 0x1,
> > + .shift = 15,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "vdec_mux",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_vdec_p0.hw,
> > + &t7_vdec_p1.hw
> > + },
> > + .num_parents = 2,
> > + .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_hcodec_p0_mux = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_VDEC_CLK_CTRL,
> > + .mask = 0x7,
> > + .shift = 25,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "hcodec_p0_mux",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_dec_parent_hws,
> > + .num_parents = ARRAY_SIZE(t7_dec_parent_hws),
> > + .flags = CLK_GET_RATE_NOCACHE,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_hcodec_p0_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_VDEC_CLK_CTRL,
> > + .shift = 16,
> > + .width = 7,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "hcodec_p0_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_hcodec_p0_mux.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_hcodec_p0 = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_VDEC_CLK_CTRL,
> > + .bit_idx = 24,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "hcodec_p0",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_hcodec_p0_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_hcodec_p1_mux = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_VDEC3_CLK_CTRL,
> > + .mask = 0x7,
> > + .shift = 25,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "hcodec_p1_mux",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_dec_parent_hws,
> > + .num_parents = ARRAY_SIZE(t7_dec_parent_hws),
> > + .flags = CLK_GET_RATE_NOCACHE,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_hcodec_p1_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_VDEC3_CLK_CTRL,
> > + .shift = 16,
> > + .width = 7,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "hcodec_p1_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_hcodec_p1_mux.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_hcodec_p1 = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_VDEC3_CLK_CTRL,
> > + .bit_idx = 24,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "hcodec_p1",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_hcodec_p1_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_hcodec_mux = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_VDEC3_CLK_CTRL,
> > + .mask = 0x1,
> > + .shift = 31,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "hcodec_mux",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_hcodec_p0.hw,
> > + &t7_hcodec_p1.hw
> > + },
> > + .num_parents = 2,
> > + .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static u32 mux_table_vdec[] = { 0, 1, 2, 3, 4};
> > +
> > +static const struct clk_parent_data t7_vdec_parent_data[] = {
> > + { .fw_name = "fclk_div2p5", },
> > + { .fw_name = "fclk_div3", },
> > + { .fw_name = "fclk_div4", },
> > + { .fw_name = "fclk_div5", },
> > + { .fw_name = "fclk_div7", },
> > +};
> > +
> > +static struct clk_regmap t7_hevcb_p0_mux = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_VDEC2_CLK_CTRL,
> > + .mask = 0x7,
> > + .shift = 25,
> > + .flags = CLK_MUX_ROUND_CLOSEST,
> > + .table = mux_table_vdec,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "hevcb_p0_mux",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_vdec_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_vdec_parent_data),
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_hevcb_p0_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_VDEC2_CLK_CTRL,
> > + .shift = 16,
> > + .width = 7,
> > + .flags = CLK_DIVIDER_ROUND_CLOSEST,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "hevcb_p0_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_hevcb_p0_mux.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_hevcb_p0 = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_VDEC2_CLK_CTRL,
> > + .bit_idx = 24,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "hevcb_p0_gate",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_hevcb_p0_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_hevcb_p1_mux = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_VDEC4_CLK_CTRL,
> > + .mask = 0x7,
> > + .shift = 25,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "hevcb_p1_mux",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_vdec_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_vdec_parent_data),
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_hevcb_p1_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_VDEC4_CLK_CTRL,
> > + .shift = 16,
> > + .width = 7,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "hevc_p1_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_hevcb_p1_mux.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_hevcb_p1 = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_VDEC4_CLK_CTRL,
> > + .bit_idx = 24,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "hevcb_p1_gate",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_hevcb_p1_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_hevcb_mux = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_VDEC4_CLK_CTRL,
> > + .mask = 0x1,
> > + .shift = 31,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "hevcb_mux",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_hevcb_p0.hw,
> > + &t7_hevcb_p1.hw
> > + },
> > + .num_parents = 2,
> > + .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_hevcf_p0_mux = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_VDEC2_CLK_CTRL,
> > + .mask = 0x7,
> > + .shift = 9,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "hevcf_p0_mux",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_dec_parent_hws,
> > + .num_parents = ARRAY_SIZE(t7_dec_parent_hws),
> > + .flags = CLK_GET_RATE_NOCACHE,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_hevcf_p0_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_VDEC2_CLK_CTRL,
> > + .shift = 0,
> > + .width = 7,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "hevcf_p0_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_hevcf_p0_mux.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_hevcf_p0 = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_VDEC2_CLK_CTRL,
> > + .bit_idx = 8,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "hevcf_p0_gate",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_hevcf_p0_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_hevcf_p1_mux = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_VDEC4_CLK_CTRL,
> > + .mask = 0x7,
> > + .shift = 9,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "hevcf_p1_mux",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_dec_parent_hws,
> > + .num_parents = ARRAY_SIZE(t7_dec_parent_hws),
> > + .flags = CLK_GET_RATE_NOCACHE,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_hevcf_p1_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_VDEC4_CLK_CTRL,
> > + .shift = 0,
> > + .width = 7,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "hevcf_p1_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_hevcf_p1_mux.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_hevcf_p1 = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_VDEC4_CLK_CTRL,
> > + .bit_idx = 8,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "hevcf_p1",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_hevcf_p1_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_hevcf_mux = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_VDEC4_CLK_CTRL,
> > + .mask = 0x1,
> > + .shift = 15,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "hevcf_mux",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_hevcf_p0.hw,
> > + &t7_hevcf_p1.hw
> > + },
> > + .num_parents = 2,
> > + .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +/*cts_wave420l_a/b/c_clk*/
> > +static const struct clk_parent_data t7_wave_parent_data[] = {
> > + { .fw_name = "xtal", },
> > + { .fw_name = "fclk_div4", },
> > + { .fw_name = "fclk_div3", },
> > + { .fw_name = "fclk_div5", },
> > + { .fw_name = "fclk_div7", },
> > + { .fw_name = "mpll2", },
> > + { .fw_name = "mpll3", },
> > + { .fw_name = "gp1_pll", }
> > +};
> > +
> > +static struct clk_regmap t7_wave_a_sel = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_WAVE521_CLK_CTRL2,
> > + .mask = 0x7,
> > + .shift = 9,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "wave_a_sel",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_wave_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_wave_parent_data),
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_wave_a_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_WAVE521_CLK_CTRL2,
> > + .shift = 0,
> > + .width = 7,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "wave_a_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_wave_a_sel.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_wave_aclk = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_WAVE521_CLK_CTRL2,
> > + .bit_idx = 8,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "wave_aclk",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_wave_a_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_wave_b_sel = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_WAVE521_CLK_CTRL,
> > + .mask = 0x7,
> > + .shift = 9,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "wave_b_sel",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_wave_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_wave_parent_data),
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_wave_b_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_WAVE521_CLK_CTRL,
> > + .shift = 0,
> > + .width = 7,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "wave_b_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_wave_b_sel.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_wave_bclk = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_WAVE521_CLK_CTRL,
> > + .bit_idx = 8,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "wave_bclk",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_wave_b_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_wave_c_sel = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_WAVE521_CLK_CTRL,
> > + .mask = 0x7,
> > + .shift = 25,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "wave_c_sel",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_wave_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_wave_parent_data),
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_wave_c_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_WAVE521_CLK_CTRL,
> > + .shift = 16,
> > + .width = 7,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "wave_c_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_wave_c_sel.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_wave_cclk = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_WAVE521_CLK_CTRL,
> > + .bit_idx = 24,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "wave_cclk",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_wave_c_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_mipi_isp_sel = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_MIPI_ISP_CLK_CTRL,
> > + .mask = 0x7,
> > + .shift = 9,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "mipi_isp_sel",
> > + .ops = &clk_regmap_mux_ops,
> > + /* Share parent with wave clk */
> > + .parent_data = t7_wave_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_wave_parent_data),
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_mipi_isp_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_MIPI_ISP_CLK_CTRL,
> > + .shift = 0,
> > + .width = 7,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "mipi_isp_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_mipi_isp_sel.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_mipi_isp = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_MIPI_ISP_CLK_CTRL,
> > + .bit_idx = 8,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "mipi_isp",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_mipi_isp_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static const struct clk_parent_data t7_mipi_csi_parent_data[] = {
> > + { .fw_name = "xtal", },
> > + { .fw_name = "hifi_pll", },
> > + { .fw_name = "mpll1", },
> > + { .fw_name = "mpll2", },
> > + { .fw_name = "fclk_div3", },
> > + { .fw_name = "fclk_div4", },
> > + { .fw_name = "fclk_div5", },
> > + { .fw_name = "fclk_div7", }
> > +};
> > +
> > +static struct clk_regmap t7_mipi_csi_phy_sel0 = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_MIPI_CSI_PHY_CLK_CTRL,
> > + .mask = 0x7,
> > + .shift = 9,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "mipi_csi_phy_sel0",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_mipi_csi_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_mipi_csi_parent_data),
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_mipi_csi_phy_div0 = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_MIPI_CSI_PHY_CLK_CTRL,
> > + .shift = 0,
> > + .width = 7,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "mipi_csi_phy_div0",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_mipi_csi_phy_sel0.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_mipi_csi_phy0 = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_MIPI_CSI_PHY_CLK_CTRL,
> > + .bit_idx = 8,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "mipi_csi_phy0",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_mipi_csi_phy_div0.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_mipi_csi_phy_sel1 = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_MIPI_CSI_PHY_CLK_CTRL,
> > + .mask = 0x7,
> > + .shift = 25,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "mipi_csi_phy_sel1",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_mipi_csi_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_mipi_csi_parent_data),
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_mipi_csi_phy_div1 = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_MIPI_CSI_PHY_CLK_CTRL,
> > + .shift = 16,
> > + .width = 7,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "mipi_csi_phy_div1",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_mipi_csi_phy_sel1.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_mipi_csi_phy1 = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_MIPI_CSI_PHY_CLK_CTRL,
> > + .bit_idx = 24,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "mipi_csi_phy1",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_mipi_csi_phy_div1.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_mipi_csi_phy_clk = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_MIPI_CSI_PHY_CLK_CTRL,
> > + .mask = 0x1,
> > + .shift = 31,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "mipi_csi_phy_clk",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_mipi_csi_phy0.hw,
> > + &t7_mipi_csi_phy1.hw
> > + },
> > + .num_parents = 2,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static const struct clk_parent_data t7_vpu_parent_data[] = {
> > + { .fw_name = "fclk_div3", },
> > + { .fw_name = "fclk_div4", },
> > + { .fw_name = "fclk_div5", },
> > + { .fw_name = "fclk_div7", },
> > +};
> > +
> > +static struct clk_regmap t7_vpu_0_sel = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_VPU_CLK_CTRL,
> > + .mask = 0x3,
> > + .shift = 9,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "vpu_0_sel",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_vpu_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_vpu_parent_data),
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_vpu_0_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_VPU_CLK_CTRL,
> > + .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 *[]) { &t7_vpu_0_sel.hw },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_vpu_0 = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_VPU_CLK_CTRL,
> > + .bit_idx = 8,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "vpu_0",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) { &t7_vpu_0_div.hw },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_vpu_1_sel = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_VPU_CLK_CTRL,
> > + .mask = 0x3,
> > + .shift = 25,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "vpu_1_sel",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_vpu_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_vpu_parent_data),
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_vpu_1_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_VPU_CLK_CTRL,
> > + .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 *[]) { &t7_vpu_1_sel.hw },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_vpu_1 = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_VPU_CLK_CTRL,
> > + .bit_idx = 24,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "vpu_1",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) { &t7_vpu_1_div.hw },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_vpu = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_VPU_CLK_CTRL,
> > + .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 *[]) {
> > + &t7_vpu_0.hw,
> > + &t7_vpu_1.hw
> > + },
> > + .num_parents = 2,
> > + .flags = CLK_SET_RATE_NO_REPARENT,
> > + },
> > +};
> > +
> > +static const struct clk_parent_data vpu_clkb_tmp_parent_data[] = {
> > + { .hw = &t7_vpu.hw, },
> > + { .fw_name = "fclk_div4", },
> > + { .fw_name = "fclk_div5", },
> > + { .fw_name = "fclk_div7", },
> > +};
> > +
> > +static struct clk_regmap t7_vpu_clkb_tmp_mux = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_VPU_CLKB_CTRL,
> > + .mask = 0x3,
> > + .shift = 20,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "vpu_clkb_tmp_mux",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = vpu_clkb_tmp_parent_data,
> > + .num_parents = ARRAY_SIZE(vpu_clkb_tmp_parent_data),
> > + .flags = CLK_GET_RATE_NOCACHE,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_vpu_clkb_tmp_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_VPU_CLKB_CTRL,
> > + .shift = 16,
> > + .width = 4,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "vpu_clkb_tmp_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_vpu_clkb_tmp_mux.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_vpu_clkb_tmp = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_VPU_CLKB_CTRL,
> > + .bit_idx = 24,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "vpu_clkb_tmp",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_vpu_clkb_tmp_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_vpu_clkb_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_VPU_CLKB_CTRL,
> > + .shift = 0,
> > + .width = 8,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "vpu_clkb_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_vpu_clkb_tmp.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_vpu_clkb = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_VPU_CLKB_CTRL,
> > + .bit_idx = 8,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "vpu_clkb",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_vpu_clkb_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static const struct clk_parent_data vpu_clkc_parent_data[] = {
> > + { .fw_name = "fclk_div4", },
> > + { .fw_name = "fclk_div3", },
> > + { .fw_name = "fclk_div5", },
> > + { .fw_name = "fclk_div7", },
> > +};
> > +
> > +static struct clk_regmap t7_vpu_clkc_p0_mux = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_VPU_CLKC_CTRL,
> > + .mask = 0x3,
> > + .shift = 9,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "vpu_clkc_p0_mux",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = vpu_clkc_parent_data,
> > + .num_parents = ARRAY_SIZE(vpu_clkc_parent_data),
> > + .flags = CLK_GET_RATE_NOCACHE,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_vpu_clkc_p0_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_VPU_CLKC_CTRL,
> > + .shift = 0,
> > + .width = 7,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "vpu_clkc_p0_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_vpu_clkc_p0_mux.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_vpu_clkc_p0 = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_VPU_CLKC_CTRL,
> > + .bit_idx = 8,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "vpu_clkc_p0",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_vpu_clkc_p0_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_vpu_clkc_p1_mux = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_VPU_CLKC_CTRL,
> > + .mask = 0x3,
> > + .shift = 25,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "vpu_clkc_p1_mux",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = vpu_clkc_parent_data,
> > + .num_parents = ARRAY_SIZE(vpu_clkc_parent_data),
> > + .flags = CLK_GET_RATE_NOCACHE,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_vpu_clkc_p1_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_VPU_CLKC_CTRL,
> > + .shift = 16,
> > + .width = 7,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "vpu_clkc_p1_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_vpu_clkc_p1_mux.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_vpu_clkc_p1 = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_VPU_CLKC_CTRL,
> > + .bit_idx = 24,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "vpu_clkc_p1",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_vpu_clkc_p1_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_vpu_clkc_mux = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_VPU_CLKC_CTRL,
> > + .mask = 0x1,
> > + .shift = 31,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "vpu_clkc_mux",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_vpu_clkc_p0.hw,
> > + &t7_vpu_clkc_p1.hw
> > + },
> > + .num_parents = 2,
> > + .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static u32 t7_vapb_table[] = { 0, 1, 2, 3, 7};
> > +static const struct clk_parent_data t7_vapb_parent_data[] = {
> > + { .fw_name = "fclk_div4", },
> > + { .fw_name = "fclk_div3", },
> > + { .fw_name = "fclk_div5", },
> > + { .fw_name = "fclk_div7", },
> > + { .fw_name = "fclk_div2p5", },
> > +};
> > +
> > +static struct clk_regmap t7_vapb_0_sel = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_VAPBCLK_CTRL,
> > + .mask = 0x7,
> > + .shift = 9,
> > + .table = t7_vapb_table
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "vapb_0_sel",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_vapb_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_vapb_parent_data),
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_vapb_0_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_VAPBCLK_CTRL,
> > + .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 *[]) {
> > + &t7_vapb_0_sel.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_vapb_0 = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_VAPBCLK_CTRL,
> > + .bit_idx = 8,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "vapb_0",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_vapb_0_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_vapb_1_sel = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_VAPBCLK_CTRL,
> > + .mask = 0x7,
> > + .shift = 25,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "vapb_1_sel",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_vapb_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_vapb_parent_data),
> > + .flags = CLK_SET_RATE_NO_REPARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_vapb_1_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_VAPBCLK_CTRL,
> > + .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 *[]) {
> > + &t7_vapb_1_sel.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_vapb_1 = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_VAPBCLK_CTRL,
> > + .bit_idx = 24,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "vapb_1",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_vapb_1_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_vapb = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_VAPBCLK_CTRL,
> > + .mask = 1,
> > + .shift = 31,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "vapb_sel",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_vapb_0.hw,
> > + &t7_vapb_1.hw
> > + },
> > + .num_parents = 2,
> > + .flags = CLK_SET_RATE_NO_REPARENT | CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_gdcclk_0_sel = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_GDC_CLK_CTRL,
> > + .mask = 0x7,
> > + .shift = 9,
> > + .table = t7_vapb_table
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "gdcclk_0_sel",
> > + .ops = &clk_regmap_mux_ops,
> > + /* Share parent with vapb clk */
> > + .parent_data = t7_vapb_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_vapb_parent_data),
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_gdcclk_0_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_GDC_CLK_CTRL,
> > + .shift = 0,
> > + .width = 7,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "gdcclk_0_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_gdcclk_0_sel.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_gdcclk_0 = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_GDC_CLK_CTRL,
> > + .bit_idx = 8,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "gdcclk_0",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) { &t7_gdcclk_0_div.hw },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_gdcclk_1_sel = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_GDC_CLK_CTRL,
> > + .mask = 0x7,
> > + .shift = 25,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "gdcclk_1_sel",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_vapb_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_vapb_parent_data),
> > + .flags = CLK_SET_RATE_NO_REPARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_gdcclk_1_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_GDC_CLK_CTRL,
> > + .shift = 16,
> > + .width = 7,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "gdcclk_1_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_gdcclk_1_sel.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_gdcclk_1 = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_GDC_CLK_CTRL,
> > + .bit_idx = 24,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "gdcclk_1",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_gdcclk_1_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_gdcclk = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_GDC_CLK_CTRL,
> > + .mask = 1,
> > + .shift = 31,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "gdcclk_sel",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_gdcclk_0.hw,
> > + &t7_gdcclk_1.hw
> > + },
> > + .num_parents = 2,
> > + .flags = CLK_SET_RATE_NO_REPARENT | CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_gdc_clk = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_GDC_CLK_CTRL,
> > + .bit_idx = 30,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "gdc_clk",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_gdcclk.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_dewarpclk_0_sel = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_AMLGDC_CLK_CTRL,
> > + .mask = 0x7,
> > + .shift = 9,
> > + .table = t7_vapb_table
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "dewarpclk_0_sel",
> > + .ops = &clk_regmap_mux_ops,
> > + /* Share parent with vapb clk */
> > + .parent_data = t7_vapb_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_vapb_parent_data),
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_dewarpclk_0_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_AMLGDC_CLK_CTRL,
> > + .shift = 0,
> > + .width = 7,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "dewarpclk_0_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_dewarpclk_0_sel.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_dewarpclk_0 = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_AMLGDC_CLK_CTRL,
> > + .bit_idx = 8,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "dewarpclk_0",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) { &t7_dewarpclk_0_div.hw },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_dewarpclk_1_sel = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_AMLGDC_CLK_CTRL,
> > + .mask = 0x7,
> > + .shift = 25,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "dewarpclk_1_sel",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_vapb_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_vapb_parent_data),
> > + .flags = CLK_SET_RATE_NO_REPARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_dewarpclk_1_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_AMLGDC_CLK_CTRL,
> > + .shift = 16,
> > + .width = 7,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "dewarpclk_1_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_dewarpclk_1_sel.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_dewarpclk_1 = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_AMLGDC_CLK_CTRL,
> > + .bit_idx = 24,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "dewarpclk_1",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_dewarpclk_1_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_dewarpclk = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_AMLGDC_CLK_CTRL,
> > + .mask = 1,
> > + .shift = 31,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "dewarpclk_sel",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_dewarpclk_0.hw,
> > + &t7_dewarpclk_1.hw
> > + },
> > + .num_parents = 2,
> > + .flags = CLK_SET_RATE_NO_REPARENT | CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_dewarp_clk = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_AMLGDC_CLK_CTRL,
> > + .bit_idx = 30,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "dewarp_clk",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_dewarpclk.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static u32 t7_anakin_table[] = { 0, 1, 2, 3, 7};
> > +static const struct clk_parent_data t7_anakin_parent_data[] = {
> > + { .fw_name = "fclk_div4", },
> > + { .fw_name = "fclk_div3", },
> > + { .fw_name = "fclk_div5", },
> > + { .fw_name = "fclk_div2", },
> > + { .fw_name = "fclk_div2p5", },
> > +};
> > +
> > +static struct clk_regmap t7_anakin_0_sel = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_ANAKIN_CLK_CTRL,
> > + .mask = 0x7,
> > + .shift = 9,
> > + .table = t7_anakin_table
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "anakin_0_sel",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_anakin_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_anakin_parent_data),
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_anakin_0_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_ANAKIN_CLK_CTRL,
> > + .shift = 0,
> > + .width = 7,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "anakin_0_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_anakin_0_sel.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_anakin_0 = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_ANAKIN_CLK_CTRL,
> > + .bit_idx = 8,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "anakin_0",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) { &t7_anakin_0_div.hw },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_GATE | CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_anakin_1_sel = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_ANAKIN_CLK_CTRL,
> > + .mask = 0x7,
> > + .shift = 25,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "anakin_1_sel",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_anakin_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_anakin_parent_data),
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_anakin_1_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_ANAKIN_CLK_CTRL,
> > + .shift = 16,
> > + .width = 7,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "anakin_1_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_anakin_1_sel.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_anakin_1 = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_ANAKIN_CLK_CTRL,
> > + .bit_idx = 24,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "anakin_1",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_anakin_1_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_GATE | CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_anakin = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_ANAKIN_CLK_CTRL,
> > + .mask = 1,
> > + .shift = 31,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "anakin_sel",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_anakin_0.hw,
> > + &t7_anakin_1.hw
> > + },
> > + .num_parents = 2,
> > + .flags = CLK_SET_RATE_PARENT
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_anakin_clk = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_ANAKIN_CLK_CTRL,
> > + .bit_idx = 30,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "anakin_clk",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_anakin.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_ge2d_gate = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_VAPBCLK_CTRL,
> > + .bit_idx = 30,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "ge2d_gate",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) { &t7_vapb.hw },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +/*cts_hdcp22_esmclk*/
> > +
> > +/*cts_hdcp22_skpclk*/
> > +
> > +/* cts_vdin_meas_clk */
> > +static const struct clk_parent_data t7_vdin_parent_hws[] = {
> > + { .fw_name = "xtal", },
> > + { .fw_name = "fclk_div4", },
> > + { .fw_name = "fclk_div3", },
> > + { .fw_name = "fclk_div5", },
> > + { .hw = &t7_vid_pll.hw }
> > +};
> > +
> > +static struct clk_regmap t7_vdin_meas_mux = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_VDIN_MEAS_CLK_CTRL,
> > + .mask = 0x7,
> > + .shift = 9,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "vdin_meas_mux",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_vdin_parent_hws,
> > + .num_parents = ARRAY_SIZE(t7_vdin_parent_hws),
> > + .flags = CLK_GET_RATE_NOCACHE,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_vdin_meas_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_VDIN_MEAS_CLK_CTRL,
> > + .shift = 0,
> > + .width = 7,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "vdin_meas_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_vdin_meas_mux.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_vdin_meas_gate = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_VDIN_MEAS_CLK_CTRL,
> > + .bit_idx = 8,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "vdin_meas_gate",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_vdin_meas_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static const struct clk_parent_data t7_sd_emmc_clk0_parent_data[] = {
> > + { .fw_name = "xtal", },
> > + { .fw_name = "fclk_div2", },
> > + { .fw_name = "fclk_div3", },
> > + { .fw_name = "hifi_pll", },
> > + { .fw_name = "fclk_div2p5", },
> > + { .fw_name = "mpll2", },
> > + { .fw_name = "mpll3", },
> > + { .fw_name = "gp0_pll", }
> > +};
> > +
> > +static struct clk_regmap t7_sd_emmc_c_clk0_sel = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_NAND_CLK_CTRL,
> > + .mask = 0x7,
> > + .shift = 9,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "sd_emmc_c_clk0_sel",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_sd_emmc_clk0_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_sd_emmc_clk0_parent_data),
> > + .flags = CLK_GET_RATE_NOCACHE
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_sd_emmc_c_clk0_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_NAND_CLK_CTRL,
> > + .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 *[]) {
> > + &t7_sd_emmc_c_clk0_sel.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_sd_emmc_c_clk0 = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_NAND_CLK_CTRL,
> > + .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 *[]) {
> > + &t7_sd_emmc_c_clk0_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_sd_emmc_a_clk0_sel = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_SD_EMMC_CLK_CTRL,
> > + .mask = 0x7,
> > + .shift = 9,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "sd_emmc_a_clk0_sel",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_sd_emmc_clk0_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_sd_emmc_clk0_parent_data),
> > + .flags = CLK_GET_RATE_NOCACHE
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_sd_emmc_a_clk0_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_SD_EMMC_CLK_CTRL,
> > + .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 *[]) {
> > + &t7_sd_emmc_a_clk0_sel.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_sd_emmc_a_clk0 = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_SD_EMMC_CLK_CTRL,
> > + .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 *[]) {
> > + &t7_sd_emmc_a_clk0_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_sd_emmc_b_clk0_sel = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_SD_EMMC_CLK_CTRL,
> > + .mask = 0x7,
> > + .shift = 25,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "sd_emmc_b_clk0_sel",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_sd_emmc_clk0_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_sd_emmc_clk0_parent_data),
> > + .flags = CLK_GET_RATE_NOCACHE
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_sd_emmc_b_clk0_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_SD_EMMC_CLK_CTRL,
> > + .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 *[]) {
> > + &t7_sd_emmc_b_clk0_sel.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_sd_emmc_b_clk0 = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_SD_EMMC_CLK_CTRL,
> > + .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 *[]) {
> > + &t7_sd_emmc_b_clk0_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT
> > + },
> > +};
> > +
> > +/*cts_cdac_clk*/
> > +
> > +static const struct clk_parent_data t7_spicc_parent_hws[] = {
> > + { .fw_name = "xtal", },
> > + { .hw = &t7_sys_clk.hw },
> > + { .fw_name = "fclk_div4", },
> > + { .fw_name = "fclk_div3", },
> > + { .fw_name = "fclk_div2", },
> > + { .fw_name = "fclk_div5", },
> > + { .fw_name = "fclk_div7", },
> > + { .fw_name = "hifi_pll", }
> > +};
> > +
> > +static struct clk_regmap t7_spicc0_mux = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_SPICC_CLK_CTRL,
> > + .mask = 0x7,
> > + .shift = 7,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "spicc0_mux",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_spicc_parent_hws,
> > + .num_parents = ARRAY_SIZE(t7_spicc_parent_hws),
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_spicc0_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_SPICC_CLK_CTRL,
> > + .shift = 0,
> > + .width = 6,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "spicc0_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_spicc0_mux.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_spicc0_gate = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_SPICC_CLK_CTRL,
> > + .bit_idx = 6,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "spicc0_gate",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_spicc0_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_spicc1_mux = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_SPICC_CLK_CTRL,
> > + .mask = 0x7,
> > + .shift = 23,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "spicc1_mux",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_spicc_parent_hws,
> > + .num_parents = ARRAY_SIZE(t7_spicc_parent_hws),
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_spicc1_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_SPICC_CLK_CTRL,
> > + .shift = 16,
> > + .width = 6,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "spicc1_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_spicc1_mux.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_spicc1_gate = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_SPICC_CLK_CTRL,
> > + .bit_idx = 22,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "spicc1_gate",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_spicc1_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_spicc2_mux = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_SPICC_CLK_CTRL1,
> > + .mask = 0x7,
> > + .shift = 7,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "spicc2_mux",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_spicc_parent_hws,
> > + .num_parents = ARRAY_SIZE(t7_spicc_parent_hws),
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_spicc2_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_SPICC_CLK_CTRL1,
> > + .shift = 0,
> > + .width = 6,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "spicc2_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_spicc2_mux.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_spicc2_gate = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_SPICC_CLK_CTRL1,
> > + .bit_idx = 6,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "spicc2_gate",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_spicc2_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_spicc3_mux = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_SPICC_CLK_CTRL1,
> > + .mask = 0x7,
> > + .shift = 23,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "spicc3_mux",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_spicc_parent_hws,
> > + .num_parents = ARRAY_SIZE(t7_spicc_parent_hws),
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_spicc3_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_SPICC_CLK_CTRL1,
> > + .shift = 16,
> > + .width = 6,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "spicc3_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_spicc3_mux.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_spicc3_gate = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_SPICC_CLK_CTRL1,
> > + .bit_idx = 22,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "spicc3_gate",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_spicc3_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_spicc4_mux = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_SPICC_CLK_CTRL2,
> > + .mask = 0x7,
> > + .shift = 7,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "spicc4_mux",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_spicc_parent_hws,
> > + .num_parents = ARRAY_SIZE(t7_spicc_parent_hws),
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_spicc4_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_SPICC_CLK_CTRL2,
> > + .shift = 0,
> > + .width = 6,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "spicc4_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_spicc4_mux.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_spicc4_gate = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_SPICC_CLK_CTRL2,
> > + .bit_idx = 6,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "spicc4_gate",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_spicc4_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_spicc5_mux = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_SPICC_CLK_CTRL2,
> > + .mask = 0x7,
> > + .shift = 23,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "spicc5_mux",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_spicc_parent_hws,
> > + .num_parents = ARRAY_SIZE(t7_spicc_parent_hws),
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_spicc5_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_SPICC_CLK_CTRL2,
> > + .shift = 16,
> > + .width = 6,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "spicc5_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_spicc5_mux.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_spicc5_gate = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_SPICC_CLK_CTRL2,
> > + .bit_idx = 22,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "spicc5_gate",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_spicc5_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +/*cts_bt656*/
> > +
> > +static const struct clk_parent_data t7_pwm_parent_data[] = {
> > + { .fw_name = "xtal", },
> > + { .hw = &t7_vid_pll.hw },
> > + { .fw_name = "fclk_div4", },
> > + { .fw_name = "fclk_div3", }
> > +};
> > +
> > +static struct clk_regmap t7_pwm_a_mux = {
> > + .data = &(struct clk_regmap_mux_data) {
> > + .offset = CLKCTRL_PWM_CLK_AB_CTRL,
> > + .mask = 0x3,
> > + .shift = 9,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "pwm_a_mux",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_pwm_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_pwm_parent_data),
> > + .flags = CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_pwm_a_div = {
> > + .data = &(struct clk_regmap_div_data) {
> > + .offset = CLKCTRL_PWM_CLK_AB_CTRL,
> > + .shift = 0,
> > + .width = 8,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "pwm_a_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_pwm_a_mux.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_pwm_a_gate = {
> > + .data = &(struct clk_regmap_gate_data) {
> > + .offset = CLKCTRL_PWM_CLK_AB_CTRL,
> > + .bit_idx = 8,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "pwm_a_gate",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_pwm_a_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_pwm_b_mux = {
> > + .data = &(struct clk_regmap_mux_data) {
> > + .offset = CLKCTRL_PWM_CLK_AB_CTRL,
> > + .mask = 0x3,
> > + .shift = 25,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "pwm_b_mux",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_pwm_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_pwm_parent_data),
> > + .flags = CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_pwm_b_div = {
> > + .data = &(struct clk_regmap_div_data) {
> > + .offset = CLKCTRL_PWM_CLK_AB_CTRL,
> > + .shift = 16,
> > + .width = 8,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "pwm_b_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_pwm_b_mux.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_pwm_b_gate = {
> > + .data = &(struct clk_regmap_gate_data) {
> > + .offset = CLKCTRL_PWM_CLK_AB_CTRL,
> > + .bit_idx = 24,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "pwm_b_gate",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_pwm_b_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_pwm_c_mux = {
> > + .data = &(struct clk_regmap_mux_data) {
> > + .offset = CLKCTRL_PWM_CLK_CD_CTRL,
> > + .mask = 0x3,
> > + .shift = 9,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "pwm_c_mux",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_pwm_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_pwm_parent_data),
> > + .flags = CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_pwm_c_div = {
> > + .data = &(struct clk_regmap_div_data) {
> > + .offset = CLKCTRL_PWM_CLK_CD_CTRL,
> > + .shift = 0,
> > + .width = 8,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "pwm_c_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_pwm_c_mux.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_pwm_c_gate = {
> > + .data = &(struct clk_regmap_gate_data) {
> > + .offset = CLKCTRL_PWM_CLK_CD_CTRL,
> > + .bit_idx = 8,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "pwm_c_gate",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_pwm_c_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_pwm_d_mux = {
> > + .data = &(struct clk_regmap_mux_data) {
> > + .offset = CLKCTRL_PWM_CLK_CD_CTRL,
> > + .mask = 0x3,
> > + .shift = 25,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "pwm_d_mux",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_pwm_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_pwm_parent_data),
> > + .flags = CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_pwm_d_div = {
> > + .data = &(struct clk_regmap_div_data) {
> > + .offset = CLKCTRL_PWM_CLK_CD_CTRL,
> > + .shift = 16,
> > + .width = 8,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "pwm_d_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_pwm_d_mux.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_pwm_d_gate = {
> > + .data = &(struct clk_regmap_gate_data) {
> > + .offset = CLKCTRL_PWM_CLK_CD_CTRL,
> > + .bit_idx = 24,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "pwm_d_gate",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_pwm_d_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_pwm_e_mux = {
> > + .data = &(struct clk_regmap_mux_data) {
> > + .offset = CLKCTRL_PWM_CLK_EF_CTRL,
> > + .mask = 0x3,
> > + .shift = 9,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "pwm_e_mux",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_pwm_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_pwm_parent_data),
> > + .flags = CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_pwm_e_div = {
> > + .data = &(struct clk_regmap_div_data) {
> > + .offset = CLKCTRL_PWM_CLK_EF_CTRL,
> > + .shift = 0,
> > + .width = 8,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "pwm_e_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_pwm_e_mux.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_pwm_e_gate = {
> > + .data = &(struct clk_regmap_gate_data) {
> > + .offset = CLKCTRL_PWM_CLK_EF_CTRL,
> > + .bit_idx = 8,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "pwm_e_gate",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_pwm_e_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_pwm_f_mux = {
> > + .data = &(struct clk_regmap_mux_data) {
> > + .offset = CLKCTRL_PWM_CLK_EF_CTRL,
> > + .mask = 0x3,
> > + .shift = 25,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "pwm_f_mux",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_pwm_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_pwm_parent_data),
> > + .flags = CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_pwm_f_div = {
> > + .data = &(struct clk_regmap_div_data) {
> > + .offset = CLKCTRL_PWM_CLK_EF_CTRL,
> > + .shift = 16,
> > + .width = 8,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "pwm_f_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_pwm_f_mux.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_pwm_f_gate = {
> > + .data = &(struct clk_regmap_gate_data) {
> > + .offset = CLKCTRL_PWM_CLK_EF_CTRL,
> > + .bit_idx = 24,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "pwm_f_gate",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_pwm_f_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_pwm_ao_a_mux = {
> > + .data = &(struct clk_regmap_mux_data) {
> > + .offset = CLKCTRL_PWM_CLK_AO_AB_CTRL,
> > + .mask = 0x3,
> > + .shift = 9,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "pwm_ao_a_mux",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_pwm_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_pwm_parent_data),
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_pwm_ao_a_div = {
> > + .data = &(struct clk_regmap_div_data) {
> > + .offset = CLKCTRL_PWM_CLK_AO_AB_CTRL,
> > + .shift = 0,
> > + .width = 8,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "pwm_ao_a_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_pwm_ao_a_mux.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_pwm_ao_a_gate = {
> > + .data = &(struct clk_regmap_gate_data) {
> > + .offset = CLKCTRL_PWM_CLK_AO_AB_CTRL,
> > + .bit_idx = 8,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "pwm_ao_a_gate",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_pwm_ao_a_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_pwm_ao_b_mux = {
> > + .data = &(struct clk_regmap_mux_data) {
> > + .offset = CLKCTRL_PWM_CLK_AO_AB_CTRL,
> > + .mask = 0x3,
> > + .shift = 25,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "pwm_ao_b_mux",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_pwm_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_pwm_parent_data),
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_pwm_ao_b_div = {
> > + .data = &(struct clk_regmap_div_data) {
> > + .offset = CLKCTRL_PWM_CLK_AO_AB_CTRL,
> > + .shift = 16,
> > + .width = 8,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "pwm_ao_b_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_pwm_ao_b_mux.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_pwm_ao_b_gate = {
> > + .data = &(struct clk_regmap_gate_data) {
> > + .offset = CLKCTRL_PWM_CLK_AO_AB_CTRL,
> > + .bit_idx = 24,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "pwm_ao_b_gate",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_pwm_ao_b_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_pwm_ao_c_mux = {
> > + .data = &(struct clk_regmap_mux_data) {
> > + .offset = CLKCTRL_PWM_CLK_AO_CD_CTRL,
> > + .mask = 0x3,
> > + .shift = 9,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "pwm_ao_c_mux",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_pwm_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_pwm_parent_data),
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_pwm_ao_c_div = {
> > + .data = &(struct clk_regmap_div_data) {
> > + .offset = CLKCTRL_PWM_CLK_AO_CD_CTRL,
> > + .shift = 0,
> > + .width = 8,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "pwm_ao_c_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_pwm_ao_c_mux.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_pwm_ao_c_gate = {
> > + .data = &(struct clk_regmap_gate_data) {
> > + .offset = CLKCTRL_PWM_CLK_AO_CD_CTRL,
> > + .bit_idx = 8,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "pwm_ao_c_gate",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_pwm_ao_c_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_pwm_ao_d_mux = {
> > + .data = &(struct clk_regmap_mux_data) {
> > + .offset = CLKCTRL_PWM_CLK_AO_CD_CTRL,
> > + .mask = 0x3,
> > + .shift = 25,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "pwm_ao_d_mux",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_pwm_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_pwm_parent_data),
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_pwm_ao_d_div = {
> > + .data = &(struct clk_regmap_div_data) {
> > + .offset = CLKCTRL_PWM_CLK_AO_CD_CTRL,
> > + .shift = 16,
> > + .width = 8,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "pwm_ao_d_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_pwm_ao_d_mux.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_pwm_ao_d_gate = {
> > + .data = &(struct clk_regmap_gate_data) {
> > + .offset = CLKCTRL_PWM_CLK_AO_CD_CTRL,
> > + .bit_idx = 24,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "pwm_ao_d_gate",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_pwm_ao_d_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_pwm_ao_e_mux = {
> > + .data = &(struct clk_regmap_mux_data) {
> > + .offset = CLKCTRL_PWM_CLK_AO_EF_CTRL,
> > + .mask = 0x3,
> > + .shift = 9,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "pwm_ao_e_mux",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_pwm_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_pwm_parent_data),
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_pwm_ao_e_div = {
> > + .data = &(struct clk_regmap_div_data) {
> > + .offset = CLKCTRL_PWM_CLK_AO_EF_CTRL,
> > + .shift = 0,
> > + .width = 8,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "pwm_ao_e_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_pwm_ao_e_mux.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_pwm_ao_e_gate = {
> > + .data = &(struct clk_regmap_gate_data) {
> > + .offset = CLKCTRL_PWM_CLK_AO_EF_CTRL,
> > + .bit_idx = 8,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "pwm_ao_e_gate",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_pwm_ao_e_div.hw
> > + },
> > + .num_parents = 1,
> > + /*The clock feeds the GPU,it should be always on*/
> > + .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_pwm_ao_f_mux = {
> > + .data = &(struct clk_regmap_mux_data) {
> > + .offset = CLKCTRL_PWM_CLK_AO_EF_CTRL,
> > + .mask = 0x3,
> > + .shift = 25,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "pwm_ao_f_mux",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_pwm_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_pwm_parent_data),
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_pwm_ao_f_div = {
> > + .data = &(struct clk_regmap_div_data) {
> > + .offset = CLKCTRL_PWM_CLK_AO_EF_CTRL,
> > + .shift = 16,
> > + .width = 8,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "pwm_ao_f_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_pwm_ao_f_mux.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_pwm_ao_f_gate = {
> > + .data = &(struct clk_regmap_gate_data) {
> > + .offset = CLKCTRL_PWM_CLK_AO_EF_CTRL,
> > + .bit_idx = 24,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "pwm_ao_f_gate",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_pwm_ao_f_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_pwm_ao_g_mux = {
> > + .data = &(struct clk_regmap_mux_data) {
> > + .offset = CLKCTRL_PWM_CLK_AO_GH_CTRL,
> > + .mask = 0x3,
> > + .shift = 9,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "pwm_ao_g_mux",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_pwm_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_pwm_parent_data),
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_pwm_ao_g_div = {
> > + .data = &(struct clk_regmap_div_data) {
> > + .offset = CLKCTRL_PWM_CLK_AO_GH_CTRL,
> > + .shift = 0,
> > + .width = 8,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "pwm_ao_g_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_pwm_ao_g_mux.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_pwm_ao_g_gate = {
> > + .data = &(struct clk_regmap_gate_data) {
> > + .offset = CLKCTRL_PWM_CLK_AO_GH_CTRL,
> > + .bit_idx = 8,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "pwm_ao_g_gate",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_pwm_ao_g_div.hw
> > + },
> > + .num_parents = 1,
> > + /*This clock feeds the DDR,it should be always on.*/
> > + .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_pwm_ao_h_mux = {
> > + .data = &(struct clk_regmap_mux_data) {
> > + .offset = CLKCTRL_PWM_CLK_AO_GH_CTRL,
> > + .mask = 0x3,
> > + .shift = 25,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "pwm_ao_h_mux",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_pwm_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_pwm_parent_data),
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_pwm_ao_h_div = {
> > + .data = &(struct clk_regmap_div_data) {
> > + .offset = CLKCTRL_PWM_CLK_AO_GH_CTRL,
> > + .shift = 16,
> > + .width = 8,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "pwm_ao_h_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_pwm_ao_h_mux.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_pwm_ao_h_gate = {
> > + .data = &(struct clk_regmap_gate_data) {
> > + .offset = CLKCTRL_PWM_CLK_AO_GH_CTRL,
> > + .bit_idx = 24,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "pwm_ao_h_gate",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_pwm_ao_h_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static u32 t7_dsi_meas_table[] = { 0, 1, 2, 3, 6, 7};
> > +
> > +static const struct clk_parent_data t7_dsi_meas_parent_data[] = {
> > + { .fw_name = "xtal", },
> > + { .fw_name = "fclk_div4", },
> > + { .fw_name = "fclk_div3", },
> > + { .fw_name = "fclk_div5", },
> > + { .fw_name = "fclk_div2", },
> > + { .fw_name = "fclk_div7", }
> > +};
> > +
> > +static struct clk_regmap t7_dsi_a_meas_mux = {
> > + .data = &(struct clk_regmap_mux_data) {
> > + .offset = CLKCTRL_MIPI_DSI_MEAS_CLK_CTRL,
> > + .mask = 0x3,
> > + .shift = 9,
> > + .table = t7_dsi_meas_table
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "dsi_a_meas_mux",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_dsi_meas_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_dsi_meas_parent_data)
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_dsi_a_meas_div = {
> > + .data = &(struct clk_regmap_div_data) {
> > + .offset = CLKCTRL_MIPI_DSI_MEAS_CLK_CTRL,
> > + .shift = 0,
> > + .width = 7,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "dsi_a_meas_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_dsi_a_meas_mux.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_dsi_a_meas_gate = {
> > + .data = &(struct clk_regmap_gate_data) {
> > + .offset = CLKCTRL_MIPI_DSI_MEAS_CLK_CTRL,
> > + .bit_idx = 8,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "dsi_a_meas_clk",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_dsi_a_meas_div.hw
> > + },
> > + .num_parents = 1,
> > + /* config it in U-boot, ignore it to avoid display abnormal */
> > + .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_dsi_b_meas_mux = {
> > + .data = &(struct clk_regmap_mux_data) {
> > + .offset = CLKCTRL_MIPI_DSI_MEAS_CLK_CTRL,
> > + .mask = 0x3,
> > + .shift = 21,
> > + .table = t7_dsi_meas_table
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "dsi_b_meas_mux",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_dsi_meas_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_dsi_meas_parent_data)
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_dsi_b_meas_div = {
> > + .data = &(struct clk_regmap_div_data) {
> > + .offset = CLKCTRL_MIPI_DSI_MEAS_CLK_CTRL,
> > + .shift = 12,
> > + .width = 7,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "dsi_b_meas_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_dsi_b_meas_mux.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_dsi_b_meas_gate = {
> > + .data = &(struct clk_regmap_gate_data) {
> > + .offset = CLKCTRL_MIPI_DSI_MEAS_CLK_CTRL,
> > + .bit_idx = 20,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "dsi_b_meas_clk",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_dsi_b_meas_div.hw
> > + },
> > + .num_parents = 1,
> > + /* config it in U-boot, ignore it to avoid display abnormal */
> > + .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static u32 t7_dsi_phy_table[] = { 4, 5, 6, 7};
> > +static const struct clk_parent_data t7_dsi_phy_parent_data[] = {
> > + { .fw_name = "fclk_div2", },
> > + { .fw_name = "fclk_div2p5", },
> > + { .fw_name = "fclk_div3", },
> > + { .fw_name = "fclk_div7", },
> > +};
> > +
> > +static struct clk_regmap t7_dsi0_phy_mux = {
> > + .data = &(struct clk_regmap_mux_data) {
> > + .offset = CLKCTRL_MIPIDSI_PHY_CLK_CTRL,
> > + .mask = 0x3,
> > + .shift = 12,
> > + .table = t7_dsi_phy_table
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "dsi0_phy_mux",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_dsi_phy_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_dsi_phy_parent_data)
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_dsi0_phy_div = {
> > + .data = &(struct clk_regmap_div_data) {
> > + .offset = CLKCTRL_MIPIDSI_PHY_CLK_CTRL,
> > + .shift = 0,
> > + .width = 7,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "dsi0_phy_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_dsi0_phy_mux.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_dsi0_phy_gate = {
> > + .data = &(struct clk_regmap_gate_data) {
> > + .offset = CLKCTRL_MIPIDSI_PHY_CLK_CTRL,
> > + .bit_idx = 8,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "dsi0_phy_gate",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_dsi0_phy_div.hw
> > + },
> > + .num_parents = 1,
> > + /* config it in U-boot, ignore it to avoid display abnormal */
> > + .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_dsi1_phy_mux = {
> > + .data = &(struct clk_regmap_mux_data) {
> > + .offset = CLKCTRL_MIPIDSI_PHY_CLK_CTRL,
> > + .mask = 0x3,
> > + .shift = 25,
> > + .table = t7_dsi_phy_table
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "dsi1_phy_mux",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_dsi_phy_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_dsi_phy_parent_data)
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_dsi1_phy_div = {
> > + .data = &(struct clk_regmap_div_data) {
> > + .offset = CLKCTRL_MIPIDSI_PHY_CLK_CTRL,
> > + .shift = 16,
> > + .width = 7,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "dsi1_phy_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_dsi1_phy_mux.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_dsi1_phy_gate = {
> > + .data = &(struct clk_regmap_gate_data) {
> > + .offset = CLKCTRL_MIPIDSI_PHY_CLK_CTRL,
> > + .bit_idx = 24,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "dsi1_phy_gate",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_dsi1_phy_div.hw
> > + },
> > + .num_parents = 1,
> > + /* config it in U-boot, ignore it to avoid display abnormal */
> > + .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_eth_rmii_sel = {
> > + .data = &(struct clk_regmap_mux_data) {
> > + .offset = CLKCTRL_ETH_CLK_CTRL,
> > + .mask = 0x1,
> > + .shift = 9,
> > + .table = t7_dsi_phy_table
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "eth_rmii_sel",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = (const struct clk_parent_data []) {
> > + { .fw_name = "fclk_div2", },
> > + { .fw_name = "gp1_pll", }
> > + },
> > + .num_parents = 2
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_eth_rmii_div = {
> > + .data = &(struct clk_regmap_div_data) {
> > + .offset = CLKCTRL_ETH_CLK_CTRL,
> > + .shift = 0,
> > + .width = 7,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "eth_rmii_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_eth_rmii_sel.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_eth_rmii = {
> > + .data = &(struct clk_regmap_gate_data) {
> > + .offset = CLKCTRL_ETH_CLK_CTRL,
> > + .bit_idx = 8,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "eth_rmii",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_eth_rmii_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT
> > + },
> > +};
> > +
> > +static struct clk_fixed_factor t7_eth_div8 = {
> > + .mult = 1,
> > + .div = 8,
> > + .hw.init = &(struct clk_init_data){
> > + .name = "eth_div8",
> > + .ops = &clk_fixed_factor_ops,
> > + .parent_data = &(const struct clk_parent_data) {
> > + .fw_name = "fclk_div2",
> > + },
> > + .num_parents = 1,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_eth_125m = {
> > + .data = &(struct clk_regmap_gate_data) {
> > + .offset = CLKCTRL_ETH_CLK_CTRL,
> > + .bit_idx = 7,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "eth_125m",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_eth_div8.hw
> > + },
> > + .num_parents = 1,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_saradc_mux = {
> > + .data = &(struct clk_regmap_mux_data) {
> > + .offset = CLKCTRL_SAR_CLK_CTRL0,
> > + .mask = 0x3,
> > + .shift = 9,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "saradc_mux",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = (const struct clk_parent_data []) {
> > + { .fw_name = "xtal", },
> > + { .hw = &t7_sys_clk.hw },
> > + },
> > + .num_parents = 2,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_saradc_div = {
> > + .data = &(struct clk_regmap_div_data) {
> > + .offset = CLKCTRL_SAR_CLK_CTRL0,
> > + .shift = 0,
> > + .width = 8,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "saradc_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_saradc_mux.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_saradc_gate = {
> > + .data = &(struct clk_regmap_gate_data) {
> > + .offset = CLKCTRL_SAR_CLK_CTRL0,
> > + .bit_idx = 8,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "saradc_clk",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_saradc_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +/* gen clk */
> > +static u32 t7_gen_clk_mux_table[] = { 0, 5, 6, 7, 19, 21, 22,
> > + 23, 24, 25, 26, 27, 28 };
> > +
> > +static const struct clk_parent_data t7_gen_clk_parent_data[] = {
> > + { .fw_name = "xtal", },
> > + { .fw_name = "gp0_pll", },
> > + { .fw_name = "gp1_pll", },
> > + { .fw_name = "hifi_pll", },
> > + { .fw_name = "fclk_div2", },
> > + { .fw_name = "fclk_div3", },
> > + { .fw_name = "fclk_div4", },
> > + { .fw_name = "fclk_div5", },
> > + { .fw_name = "fclk_div7", },
> > + { .fw_name = "mpll0", },
> > + { .fw_name = "mpll1", },
> > + { .fw_name = "mpll2", },
> > + { .fw_name = "mpll3", }
> > +};
> > +
> > +static struct clk_regmap t7_gen_sel = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = CLKCTRL_GEN_CLK_CTRL,
> > + .mask = 0x1f,
> > + .shift = 12,
> > + .table = t7_gen_clk_mux_table,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "gen_sel",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = t7_gen_clk_parent_data,
> > + .num_parents = ARRAY_SIZE(t7_gen_clk_parent_data),
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_gen_div = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = CLKCTRL_GEN_CLK_CTRL,
> > + .shift = 0,
> > + .width = 11,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "gen_div",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_gen_sel.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_gen = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = CLKCTRL_GEN_CLK_CTRL,
> > + .bit_idx = 11,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "gen",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_gen_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +#define MESON_T7_SYS_GATE(_name, _reg, _bit) \
> > +struct clk_regmap _name = { \
> > + .data = &(struct clk_regmap_gate_data) { \
> > + .offset = (_reg), \
> > + .bit_idx = (_bit), \
> > + }, \
> > + .hw.init = &(struct clk_init_data) { \
> > + .name = #_name, \
> > + .ops = &clk_regmap_gate_ops, \
> > + .parent_hws = (const struct clk_hw *[]) { \
> > + &t7_sys_clk.hw \
> > + }, \
> > + .num_parents = 1, \
> > + .flags = CLK_IGNORE_UNUSED, \
> > + }, \
> > +}
> > +
> > +/*CLKCTRL_SYS_CLK_EN0_REG0*/
> > +static MESON_T7_SYS_GATE(t7_ddr, CLKCTRL_SYS_CLK_EN0_REG0, 0);
> > +static MESON_T7_SYS_GATE(t7_dos, CLKCTRL_SYS_CLK_EN0_REG0, 1);
> > +static MESON_T7_SYS_GATE(t7_mipi_dsi_a, CLKCTRL_SYS_CLK_EN0_REG0, 2);
> > +static MESON_T7_SYS_GATE(t7_mipi_dsi_b, CLKCTRL_SYS_CLK_EN0_REG0, 3);
> > +static MESON_T7_SYS_GATE(t7_ethphy, CLKCTRL_SYS_CLK_EN0_REG0, 4);
> > +static MESON_T7_SYS_GATE(t7_mali, CLKCTRL_SYS_CLK_EN0_REG0, 6);
> > +static MESON_T7_SYS_GATE(t7_aocpu, CLKCTRL_SYS_CLK_EN0_REG0, 13);
> > +static MESON_T7_SYS_GATE(t7_aucpu, CLKCTRL_SYS_CLK_EN0_REG0, 14);
> > +static MESON_T7_SYS_GATE(t7_cec, CLKCTRL_SYS_CLK_EN0_REG0, 16);
> > +static MESON_T7_SYS_GATE(t7_gdc, CLKCTRL_SYS_CLK_EN0_REG0, 17);
> > +static MESON_T7_SYS_GATE(t7_deswarp, CLKCTRL_SYS_CLK_EN0_REG0, 18);
> > +static MESON_T7_SYS_GATE(t7_ampipe_nand, CLKCTRL_SYS_CLK_EN0_REG0, 19);
> > +static MESON_T7_SYS_GATE(t7_ampipe_eth, CLKCTRL_SYS_CLK_EN0_REG0, 20);
> > +static MESON_T7_SYS_GATE(t7_am2axi0, CLKCTRL_SYS_CLK_EN0_REG0, 21);
> > +static MESON_T7_SYS_GATE(t7_am2axi1, CLKCTRL_SYS_CLK_EN0_REG0, 22);
> > +static MESON_T7_SYS_GATE(t7_am2axi2, CLKCTRL_SYS_CLK_EN0_REG0, 23);
> > +static MESON_T7_SYS_GATE(t7_sdemmca, CLKCTRL_SYS_CLK_EN0_REG0, 24);
> > +static MESON_T7_SYS_GATE(t7_sdemmcb, CLKCTRL_SYS_CLK_EN0_REG0, 25);
> > +static MESON_T7_SYS_GATE(t7_sdemmcc, CLKCTRL_SYS_CLK_EN0_REG0, 26);
> > +static MESON_T7_SYS_GATE(t7_smartcard, CLKCTRL_SYS_CLK_EN0_REG0, 27);
> > +static MESON_T7_SYS_GATE(t7_acodec, CLKCTRL_SYS_CLK_EN0_REG0, 28);
> > +static MESON_T7_SYS_GATE(t7_spifc, CLKCTRL_SYS_CLK_EN0_REG0, 29);
> > +static MESON_T7_SYS_GATE(t7_msr_clk, CLKCTRL_SYS_CLK_EN0_REG0, 30);
> > +static MESON_T7_SYS_GATE(t7_ir_ctrl, CLKCTRL_SYS_CLK_EN0_REG0, 31);
> > +
> > +/*CLKCTRL_SYS_CLK_EN0_REG1*/
> > +static MESON_T7_SYS_GATE(t7_audio, CLKCTRL_SYS_CLK_EN0_REG1, 0);
> > +static MESON_T7_SYS_GATE(t7_eth, CLKCTRL_SYS_CLK_EN0_REG1, 3);
> > +static MESON_T7_SYS_GATE(t7_uart_a, CLKCTRL_SYS_CLK_EN0_REG1, 5);
> > +static MESON_T7_SYS_GATE(t7_uart_b, CLKCTRL_SYS_CLK_EN0_REG1, 6);
> > +static MESON_T7_SYS_GATE(t7_uart_c, CLKCTRL_SYS_CLK_EN0_REG1, 7);
> > +static MESON_T7_SYS_GATE(t7_uart_d, CLKCTRL_SYS_CLK_EN0_REG1, 8);
> > +static MESON_T7_SYS_GATE(t7_uart_e, CLKCTRL_SYS_CLK_EN0_REG1, 9);
> > +static MESON_T7_SYS_GATE(t7_uart_f, CLKCTRL_SYS_CLK_EN0_REG1, 10);
> > +static MESON_T7_SYS_GATE(t7_aififo, CLKCTRL_SYS_CLK_EN0_REG1, 11);
> > +static MESON_T7_SYS_GATE(t7_spicc2, CLKCTRL_SYS_CLK_EN0_REG1, 12);
> > +static MESON_T7_SYS_GATE(t7_spicc3, CLKCTRL_SYS_CLK_EN0_REG1, 13);
> > +static MESON_T7_SYS_GATE(t7_spicc4, CLKCTRL_SYS_CLK_EN0_REG1, 14);
> > +static MESON_T7_SYS_GATE(t7_ts_a73, CLKCTRL_SYS_CLK_EN0_REG1, 15);
> > +static MESON_T7_SYS_GATE(t7_ts_a53, CLKCTRL_SYS_CLK_EN0_REG1, 16);
> > +static MESON_T7_SYS_GATE(t7_spicc5, CLKCTRL_SYS_CLK_EN0_REG1, 17);
> > +static MESON_T7_SYS_GATE(t7_g2d, CLKCTRL_SYS_CLK_EN0_REG1, 20);
> > +static MESON_T7_SYS_GATE(t7_spicc0, CLKCTRL_SYS_CLK_EN0_REG1, 21);
> > +static MESON_T7_SYS_GATE(t7_spicc1, CLKCTRL_SYS_CLK_EN0_REG1, 22);
> > +static MESON_T7_SYS_GATE(t7_pcie, CLKCTRL_SYS_CLK_EN0_REG1, 24);
> > +static MESON_T7_SYS_GATE(t7_usb, CLKCTRL_SYS_CLK_EN0_REG1, 26);
> > +static MESON_T7_SYS_GATE(t7_pcie_phy, CLKCTRL_SYS_CLK_EN0_REG1, 27);
> > +static MESON_T7_SYS_GATE(t7_i2c_ao_a, CLKCTRL_SYS_CLK_EN0_REG1, 28);
> > +static MESON_T7_SYS_GATE(t7_i2c_ao_b, CLKCTRL_SYS_CLK_EN0_REG1, 29);
> > +static MESON_T7_SYS_GATE(t7_i2c_m_a, CLKCTRL_SYS_CLK_EN0_REG1, 30);
> > +static MESON_T7_SYS_GATE(t7_i2c_m_b, CLKCTRL_SYS_CLK_EN0_REG1, 31);
> > +
> > +/*CLKCTRL_SYS_CLK_EN0_REG2*/
> > +static MESON_T7_SYS_GATE(t7_i2c_m_c, CLKCTRL_SYS_CLK_EN0_REG2, 0);
> > +static MESON_T7_SYS_GATE(t7_i2c_m_d, CLKCTRL_SYS_CLK_EN0_REG2, 1);
> > +static MESON_T7_SYS_GATE(t7_i2c_m_e, CLKCTRL_SYS_CLK_EN0_REG2, 2);
> > +static MESON_T7_SYS_GATE(t7_i2c_m_f, CLKCTRL_SYS_CLK_EN0_REG2, 3);
> > +static MESON_T7_SYS_GATE(t7_hdmitx_apb, CLKCTRL_SYS_CLK_EN0_REG2, 4);
> > +static MESON_T7_SYS_GATE(t7_i2c_s_a, CLKCTRL_SYS_CLK_EN0_REG2, 5);
> > +static MESON_T7_SYS_GATE(t7_hdmirx_pclk, CLKCTRL_SYS_CLK_EN0_REG2, 8);
> > +static MESON_T7_SYS_GATE(t7_mmc_apb, CLKCTRL_SYS_CLK_EN0_REG2, 11);
> > +static MESON_T7_SYS_GATE(t7_mipi_isp_pclk, CLKCTRL_SYS_CLK_EN0_REG2, 17);
> > +static MESON_T7_SYS_GATE(t7_rsa, CLKCTRL_SYS_CLK_EN0_REG2, 18);
> > +static MESON_T7_SYS_GATE(t7_pclk_sys_cpu_apb, CLKCTRL_SYS_CLK_EN0_REG2, 19);
> > +static MESON_T7_SYS_GATE(t7_a73pclk_cpu_apb, CLKCTRL_SYS_CLK_EN0_REG2, 20);
> > +static MESON_T7_SYS_GATE(t7_dspa, CLKCTRL_SYS_CLK_EN0_REG2, 21);
> > +static MESON_T7_SYS_GATE(t7_dspb, CLKCTRL_SYS_CLK_EN0_REG2, 22);
> > +static MESON_T7_SYS_GATE(t7_vpu_intr, CLKCTRL_SYS_CLK_EN0_REG2, 25);
> > +static MESON_T7_SYS_GATE(t7_sar_adc, CLKCTRL_SYS_CLK_EN0_REG2, 28);
> > +static MESON_T7_SYS_GATE(t7_gic, CLKCTRL_SYS_CLK_EN0_REG2, 30);
> > +static MESON_T7_SYS_GATE(t7_ts_gpu, CLKCTRL_SYS_CLK_EN0_REG2, 31);
> > +
> > +/*CLKCTRL_SYS_CLK_EN0_REG3*/
> > +static MESON_T7_SYS_GATE(t7_ts_nna, CLKCTRL_SYS_CLK_EN0_REG3, 0);
> > +static MESON_T7_SYS_GATE(t7_ts_vpu, CLKCTRL_SYS_CLK_EN0_REG3, 1);
> > +static MESON_T7_SYS_GATE(t7_ts_hevc, CLKCTRL_SYS_CLK_EN0_REG3, 2);
> > +static MESON_T7_SYS_GATE(t7_pwm_ao_ab, CLKCTRL_SYS_CLK_EN0_REG3, 3);
> > +static MESON_T7_SYS_GATE(t7_pwm_ao_cd, CLKCTRL_SYS_CLK_EN0_REG3, 4);
> > +static MESON_T7_SYS_GATE(t7_pwm_ao_ef, CLKCTRL_SYS_CLK_EN0_REG3, 5);
> > +static MESON_T7_SYS_GATE(t7_pwm_ao_gh, CLKCTRL_SYS_CLK_EN0_REG3, 6);
> > +static MESON_T7_SYS_GATE(t7_pwm_ab, CLKCTRL_SYS_CLK_EN0_REG3, 7);
> > +static MESON_T7_SYS_GATE(t7_pwm_cd, CLKCTRL_SYS_CLK_EN0_REG3, 8);
> > +static MESON_T7_SYS_GATE(t7_pwm_ef, CLKCTRL_SYS_CLK_EN0_REG3, 9);
> > +
> > +/* Array of all clocks provided by this provider */
> > +static struct clk_hw *t7_periphs_hw_clks[] = {
> > + [CLKID_RTC_32K_CLKIN] = &t7_rtc_32k_clkin.hw,
> > + [CLKID_RTC_32K_DIV] = &t7_rtc_32k_div.hw,
> > + [CLKID_RTC_32K_XATL] = &t7_rtc_32k_xtal.hw,
> > + [CLKID_RTC_32K_MUX] = &t7_rtc_32k_sel.hw,
> > + [CLKID_RTC_CLK] = &t7_rtc_clk.hw,
> > + [CLKID_SYS_CLK_B_MUX] = &t7_sysclk_b_sel.hw,
> > + [CLKID_SYS_CLK_B_DIV] = &t7_sysclk_b_div.hw,
> > + [CLKID_SYS_CLK_B_GATE] = &t7_sysclk_b.hw,
> > + [CLKID_SYS_CLK_A_MUX] = &t7_sysclk_a_sel.hw,
> > + [CLKID_SYS_CLK_A_DIV] = &t7_sysclk_a_div.hw,
> > + [CLKID_SYS_CLK_A_GATE] = &t7_sysclk_a.hw,
> > + [CLKID_SYS_CLK] = &t7_sys_clk.hw,
> > + [CLKID_CECA_32K_CLKIN] = &t7_ceca_32k_clkin.hw,
> > + [CLKID_CECA_32K_DIV] = &t7_ceca_32k_div.hw,
> > + [CLKID_CECA_32K_MUX_PRE] = &t7_ceca_32k_sel_pre.hw,
> > + [CLKID_CECA_32K_MUX] = &t7_ceca_32k_sel.hw,
> > + [CLKID_CECA_32K_CLKOUT] = &t7_ceca_32k_clkout.hw,
> > + [CLKID_CECB_32K_CLKIN] = &t7_cecb_32k_clkin.hw,
> > + [CLKID_CECB_32K_DIV] = &t7_cecb_32k_div.hw,
> > + [CLKID_CECB_32K_MUX_PRE] = &t7_cecb_32k_sel_pre.hw,
> > + [CLKID_CECB_32K_MUX] = &t7_cecb_32k_sel.hw,
> > + [CLKID_CECB_32K_CLKOUT] = &t7_cecb_32k_clkout.hw,
> > + [CLKID_SC_CLK_MUX] = &t7_sc_clk_mux.hw,
> > + [CLKID_SC_CLK_DIV] = &t7_sc_clk_div.hw,
> > + [CLKID_SC_CLK_GATE] = &t7_sc_clk_gate.hw,
> > + [CLKID_DSPA_CLK_B_MUX] = &t7_dspa_b_mux.hw,
> > + [CLKID_DSPA_CLK_B_DIV] = &t7_dspa_b_div.hw,
> > + [CLKID_DSPA_CLK_B_GATE] = &t7_dspa_b_gate.hw,
> > + [CLKID_DSPA_CLK_A_MUX] = &t7_dspa_a_mux.hw,
> > + [CLKID_DSPA_CLK_A_DIV] = &t7_dspa_a_div.hw,
> > + [CLKID_DSPA_CLK_A_GATE] = &t7_dspa_a_gate.hw,
> > + [CLKID_DSPA_CLK] = &t7_dspa_mux.hw,
> > + [CLKID_DSPB_CLK_B_MUX] = &t7_dspb_b_mux.hw,
> > + [CLKID_DSPB_CLK_B_DIV] = &t7_dspb_b_div.hw,
> > + [CLKID_DSPB_CLK_B_GATE] = &t7_dspb_b_gate.hw,
> > + [CLKID_DSPB_CLK_A_MUX] = &t7_dspb_a_mux.hw,
> > + [CLKID_DSPB_CLK_A_DIV] = &t7_dspb_a_div.hw,
> > + [CLKID_DSPB_CLK_A_GATE] = &t7_dspb_a_gate.hw,
> > + [CLKID_DSPB_CLK] = &t7_dspb_mux.hw,
> > + [CLKID_24M_CLK_GATE] = &t7_24M_clk_gate.hw,
> > + [CLKID_12M_CLK_DIV] = &t7_12M_clk_div.hw,
> > + [CLKID_12M_CLK_GATE] = &t7_12M_clk_gate.hw,
> > + [CLKID_25M_CLK_DIV] = &t7_25M_clk_div.hw,
> > + [CLKID_25M_CLK_GATE] = &t7_25M_clk_gate.hw,
> > + [CLKID_VID_PLL] = &t7_vid_pll_div.hw,
> > + [CLKID_VID_PLL_MUX] = &t7_vid_pll_sel.hw,
> > + [CLKID_VID_PLL] = &t7_vid_pll.hw,
> > + [CLKID_VCLK_MUX] = &t7_vclk_sel.hw,
> > + [CLKID_VCLK2_MUX] = &t7_vclk2_sel.hw,
> > + [CLKID_VCLK_INPUT] = &t7_vclk_input.hw,
> > + [CLKID_VCLK2_INPUT] = &t7_vclk2_input.hw,
> > + [CLKID_VCLK_DIV] = &t7_vclk_div.hw,
> > + [CLKID_VCLK2_DIV] = &t7_vclk2_div.hw,
> > + [CLKID_VCLK] = &t7_vclk.hw,
> > + [CLKID_VCLK2] = &t7_vclk2.hw,
> > + [CLKID_VCLK_DIV1] = &t7_vclk_div1.hw,
> > + [CLKID_VCLK_DIV2_EN] = &t7_vclk_div2_en.hw,
> > + [CLKID_VCLK_DIV4_EN] = &t7_vclk_div4_en.hw,
> > + [CLKID_VCLK_DIV6_EN] = &t7_vclk_div6_en.hw,
> > + [CLKID_VCLK_DIV12_EN] = &t7_vclk_div12_en.hw,
> > + [CLKID_VCLK2_DIV1] = &t7_vclk2_div1.hw,
> > + [CLKID_VCLK2_DIV2_EN] = &t7_vclk2_div2_en.hw,
> > + [CLKID_VCLK2_DIV4_EN] = &t7_vclk2_div4_en.hw,
> > + [CLKID_VCLK2_DIV6_EN] = &t7_vclk2_div6_en.hw,
> > + [CLKID_VCLK2_DIV12_EN] = &t7_vclk2_div12_en.hw,
> > + [CLKID_VCLK_DIV2] = &t7_vclk_div2.hw,
> > + [CLKID_VCLK_DIV4] = &t7_vclk_div4.hw,
> > + [CLKID_VCLK_DIV6] = &t7_vclk_div6.hw,
> > + [CLKID_VCLK_DIV12] = &t7_vclk_div12.hw,
> > + [CLKID_VCLK2_DIV2] = &t7_vclk2_div2.hw,
> > + [CLKID_VCLK2_DIV4] = &t7_vclk2_div4.hw,
> > + [CLKID_VCLK2_DIV6] = &t7_vclk2_div6.hw,
> > + [CLKID_VCLK2_DIV12] = &t7_vclk2_div12.hw,
> > + [CLKID_CTS_ENCI_MUX] = &t7_cts_enci_sel.hw,
> > + [CLKID_CTS_ENCP_MUX] = &t7_cts_encp_sel.hw,
> > + [CLKID_CTS_VDAC_MUX] = &t7_cts_vdac_sel.hw,
> > + [CLKID_HDMI_TX_MUX] = &t7_hdmi_tx_sel.hw,
> > + [CLKID_CTS_ENCI] = &t7_cts_enci.hw,
> > + [CLKID_CTS_ENCP] = &t7_cts_encp.hw,
> > + [CLKID_CTS_VDAC] = &t7_cts_vdac.hw,
> > + [CLKID_HDMI_TX] = &t7_hdmi_tx.hw,
> > + [CLKID_HDMITX_SYS_MUX] = &t7_hdmitx_sys_sel.hw,
> > + [CLKID_HDMITX_SYS_DIV] = &t7_hdmitx_sys_div.hw,
> > + [CLKID_HDMITX_SYS] = &t7_hdmitx_sys.hw,
> > + [CLKID_HDMITX_PRIF_MUX] = &t7_hdmitx_prif_sel.hw,
> > + [CLKID_HDMITX_PRIF_DIV] = &t7_hdmitx_prif_div.hw,
> > + [CLKID_HDMITX_PRIF] = &t7_hdmitx_prif.hw,
> > + [CLKID_HDMITX_200M_MUX] = &t7_hdmitx_200m_sel.hw,
> > + [CLKID_HDMITX_200M_DIV] = &t7_hdmitx_200m_div.hw,
> > + [CLKID_HDMITX_200M] = &t7_hdmitx_200m.hw,
> > + [CLKID_HDMITX_AUD_MUX] = &t7_hdmitx_aud_sel.hw,
> > + [CLKID_HDMITX_AUD_DIV] = &t7_hdmitx_aud_div.hw,
> > + [CLKID_HDMITX_AUD] = &t7_hdmitx_aud.hw,
> > + [CLKID_HDMIRX_5M_MUX] = &t7_hdmirx_5m_sel.hw,
> > + [CLKID_HDMIRX_5M_DIV] = &t7_hdmirx_5m_div.hw,
> > + [CLKID_HDMIRX_5M] = &t7_hdmirx_5m.hw,
> > + [CLKID_HDMIRX_2M_MUX] = &t7_hdmirx_2m_sel.hw,
> > + [CLKID_HDMIRX_2M_DIV] = &t7_hdmirx_2m_div.hw,
> > + [CLKID_HDMIRX_2M] = &t7_hdmirx_2m.hw,
> > + [CLKID_HDMIRX_CFG_MUX] = &t7_hdmirx_cfg_sel.hw,
> > + [CLKID_HDMIRX_CFG_DIV] = &t7_hdmirx_cfg_div.hw,
> > + [CLKID_HDMIRX_CFG] = &t7_hdmirx_cfg.hw,
> > + [CLKID_HDMIRX_HDCP_MUX] = &t7_hdmirx_hdcp_sel.hw,
> > + [CLKID_HDMIRX_HDCP_DIV] = &t7_hdmirx_hdcp_div.hw,
> > + [CLKID_HDMIRX_HDCP] = &t7_hdmirx_hdcp.hw,
> > + [CLKID_HDMIRX_AUD_PLL_MUX] = &t7_hdmirx_aud_pll_sel.hw,
> > + [CLKID_HDMIRX_AUD_PLL_DIV] = &t7_hdmirx_aud_pll_div.hw,
> > + [CLKID_HDMIRX_AUD_PLL] = &t7_hdmirx_aud_pll.hw,
> > + [CLKID_HDMIRX_ACR_MUX] = &t7_hdmirx_acr_sel.hw,
> > + [CLKID_HDMIRX_ACR_DIV] = &t7_hdmirx_acr_div.hw,
> > + [CLKID_HDMIRX_ACR] = &t7_hdmirx_acr.hw,
> > + [CLKID_HDMIRX_METER_MUX] = &t7_hdmirx_meter_sel.hw,
> > + [CLKID_HDMIRX_METER_DIV] = &t7_hdmirx_meter_div.hw,
> > + [CLKID_HDMIRX_METER] = &t7_hdmirx_meter.hw,
> > + [CLKID_TS_CLK_DIV] = &t7_ts_clk_div.hw,
> > + [CLKID_TS_CLK_GATE] = &t7_ts_clk_gate.hw,
> > + [CLKID_MALI_0_SEL] = &t7_mali_0_sel.hw,
> > + [CLKID_MALI_0_DIV] = &t7_mali_0_div.hw,
> > + [CLKID_MALI_0] = &t7_mali_0.hw,
> > + [CLKID_MALI_1_SEL] = &t7_mali_1_sel.hw,
> > + [CLKID_MALI_1_DIV] = &t7_mali_1_div.hw,
> > + [CLKID_MALI_1] = &t7_mali_1.hw,
> > + [CLKID_MALI_MUX] = &t7_mali_mux.hw,
> > + [CLKID_VDEC_P0_MUX] = &t7_vdec_p0_mux.hw,
> > + [CLKID_VDEC_P0_DIV] = &t7_vdec_p0_div.hw,
> > + [CLKID_VDEC_P0] = &t7_vdec_p0.hw,
> > + [CLKID_VDEC_P1_MUX] = &t7_vdec_p1_mux.hw,
> > + [CLKID_VDEC_P1_DIV] = &t7_vdec_p1_div.hw,
> > + [CLKID_VDEC_P1] = &t7_vdec_p1.hw,
> > + [CLKID_VDEC_MUX] = &t7_vdec_mux.hw,
> > + [CLKID_HCODEC_P0_MUX] = &t7_hcodec_p0_mux.hw,
> > + [CLKID_HCODEC_P0_DIV] = &t7_hcodec_p0_div.hw,
> > + [CLKID_HCODEC_P0] = &t7_hcodec_p0.hw,
> > + [CLKID_HCODEC_P1_MUX] = &t7_hcodec_p1_mux.hw,
> > + [CLKID_HCODEC_P1_DIV] = &t7_hcodec_p1_div.hw,
> > + [CLKID_HCODEC_P1] = &t7_hcodec_p1.hw,
> > + [CLKID_HCODEC_MUX] = &t7_hcodec_mux.hw,
> > + [CLKID_HEVCB_P0_MUX] = &t7_hevcb_p0_mux.hw,
> > + [CLKID_HEVCB_P0_DIV] = &t7_hevcb_p0_div.hw,
> > + [CLKID_HEVCB_P0] = &t7_hevcb_p0.hw,
> > + [CLKID_HEVCB_P1_MUX] = &t7_hevcb_p1_mux.hw,
> > + [CLKID_HEVCB_P1_DIV] = &t7_hevcb_p1_div.hw,
> > + [CLKID_HEVCB_P1] = &t7_hevcb_p1.hw,
> > + [CLKID_HEVCB_MUX] = &t7_hevcb_mux.hw,
> > + [CLKID_HEVCF_P0_MUX] = &t7_hevcf_p0_mux.hw,
> > + [CLKID_HEVCF_P0_DIV] = &t7_hevcf_p0_div.hw,
> > + [CLKID_HEVCF_P0] = &t7_hevcf_p0.hw,
> > + [CLKID_HEVCF_P1_MUX] = &t7_hevcf_p1_mux.hw,
> > + [CLKID_HEVCF_P1_DIV] = &t7_hevcf_p1_div.hw,
> > + [CLKID_HEVCF_P1] = &t7_hevcf_p1.hw,
> > + [CLKID_HEVCF_MUX] = &t7_hevcf_mux.hw,
> > + [CLKID_WAVE_A_MUX] = &t7_wave_a_sel.hw,
> > + [CLKID_WAVE_A_DIV] = &t7_wave_a_div.hw,
> > + [CLKID_WAVE_A_GATE] = &t7_wave_aclk.hw,
> > + [CLKID_WAVE_B_MUX] = &t7_wave_b_sel.hw,
> > + [CLKID_WAVE_B_DIV] = &t7_wave_b_div.hw,
> > + [CLKID_WAVE_B_GATE] = &t7_wave_bclk.hw,
> > + [CLKID_WAVE_C_MUX] = &t7_wave_c_sel.hw,
> > + [CLKID_WAVE_C_DIV] = &t7_wave_c_div.hw,
> > + [CLKID_WAVE_C_GATE] = &t7_wave_cclk.hw,
> > + [CLKID_MIPI_ISP_MUX] = &t7_mipi_isp_sel.hw,
> > + [CLKID_MIPI_ISP_DIV] = &t7_mipi_isp_div.hw,
> > + [CLKID_MIPI_ISP] = &t7_mipi_isp.hw,
> > + [CLKID_MIPI_CSI_PHY_SEL0] = &t7_mipi_csi_phy_sel0.hw,
> > + [CLKID_MIPI_CSI_PHY_DIV0] = &t7_mipi_csi_phy_div0.hw,
> > + [CLKID_MIPI_CSI_PHY0] = &t7_mipi_csi_phy0.hw,
> > + [CLKID_MIPI_CSI_PHY_SEL1] = &t7_mipi_csi_phy_sel1.hw,
> > + [CLKID_MIPI_CSI_PHY_DIV1] = &t7_mipi_csi_phy_div1.hw,
> > + [CLKID_MIPI_CSI_PHY1] = &t7_mipi_csi_phy1.hw,
> > + [CLKID_MIPI_CSI_PHY_CLK] = &t7_mipi_csi_phy_clk.hw,
> > + [CLKID_VPU_0_MUX] = &t7_vpu_0_sel.hw,
> > + [CLKID_VPU_0_DIV] = &t7_vpu_0_div.hw,
> > + [CLKID_VPU_0] = &t7_vpu_0.hw,
> > + [CLKID_VPU_1_MUX] = &t7_vpu_1_sel.hw,
> > + [CLKID_VPU_1_DIV] = &t7_vpu_1_div.hw,
> > + [CLKID_VPU_1] = &t7_vpu_1.hw,
> > + [CLKID_VPU] = &t7_vpu.hw,
> > + [CLKID_VPU_CLKB_TMP_MUX] = &t7_vpu_clkb_tmp_mux.hw,
> > + [CLKID_VPU_CLKB_TMP_DIV] = &t7_vpu_clkb_tmp_div.hw,
> > + [CLKID_VPU_CLKB_TMP] = &t7_vpu_clkb_tmp.hw,
> > + [CLKID_VPU_CLKB_DIV] = &t7_vpu_clkb_div.hw,
> > + [CLKID_VPU_CLKB] = &t7_vpu_clkb.hw,
> > + [CLKID_VPU_CLKC_P0_MUX] = &t7_vpu_clkc_p0_mux.hw,
> > + [CLKID_VPU_CLKC_P0_DIV] = &t7_vpu_clkc_p0_div.hw,
> > + [CLKID_VPU_CLKC_P0] = &t7_vpu_clkc_p0.hw,
> > + [CLKID_VPU_CLKC_P1_MUX] = &t7_vpu_clkc_p1_mux.hw,
> > + [CLKID_VPU_CLKC_P1_DIV] = &t7_vpu_clkc_p1_div.hw,
> > + [CLKID_VPU_CLKC_P1] = &t7_vpu_clkc_p1.hw,
> > + [CLKID_VPU_CLKC_MUX] = &t7_vpu_clkc_mux.hw,
> > + [CLKID_VAPB_0_MUX] = &t7_vapb_0_sel.hw,
> > + [CLKID_VAPB_0_DIV] = &t7_vapb_0_div.hw,
> > + [CLKID_VAPB_0] = &t7_vapb_0.hw,
> > + [CLKID_VAPB_1_MUX] = &t7_vapb_1_sel.hw,
> > + [CLKID_VAPB_1_DIV] = &t7_vapb_1_div.hw,
> > + [CLKID_VAPB_1] = &t7_vapb_1.hw,
> > + [CLKID_VAPB] = &t7_vapb.hw,
> > + [CLKID_GDCCLK_0_MUX] = &t7_gdcclk_0_sel.hw,
> > + [CLKID_GDCCLK_0_DIV] = &t7_gdcclk_0_div.hw,
> > + [CLKID_GDCCLK_0] = &t7_gdcclk_0.hw,
> > + [CLKID_GDCCLK_1_MUX] = &t7_gdcclk_1_sel.hw,
> > + [CLKID_GDCCLK_1_DIV] = &t7_gdcclk_1_div.hw,
> > + [CLKID_GDCCLK_1] = &t7_gdcclk_1.hw,
> > + [CLKID_GDCCLK] = &t7_gdcclk.hw,
> > + [CLKID_GDC_CLK] = &t7_gdc_clk.hw,
> > + [CLKID_DEWARPCLK_0_MUX] = &t7_dewarpclk_0_sel.hw,
> > + [CLKID_DEWARPCLK_0_DIV] = &t7_dewarpclk_0_div.hw,
> > + [CLKID_DEWARPCLK_0] = &t7_dewarpclk_0.hw,
> > + [CLKID_DEWARPCLK_1_MUX] = &t7_dewarpclk_1_sel.hw,
> > + [CLKID_DEWARPCLK_1_DIV] = &t7_dewarpclk_1_div.hw,
> > + [CLKID_DEWARPCLK_1] = &t7_dewarpclk_1.hw,
> > + [CLKID_DEWARPCLK] = &t7_dewarpclk.hw,
> > + [CLKID_DEWARP_CLK] = &t7_dewarp_clk.hw,
> > + [CLKID_ANAKIN_0_MUX] = &t7_anakin_0_sel.hw,
> > + [CLKID_ANAKIN_0_DIV] = &t7_anakin_0_div.hw,
> > + [CLKID_ANAKIN_0] = &t7_anakin_0.hw,
> > + [CLKID_ANAKIN_1_MUX] = &t7_anakin_1_sel.hw,
> > + [CLKID_ANAKIN_1_DIV] = &t7_anakin_1_div.hw,
> > + [CLKID_ANAKIN_1] = &t7_anakin_1.hw,
> > + [CLKID_ANAKIN] = &t7_anakin.hw,
> > + [CLKID_ANAKIN_CLK] = &t7_anakin_clk.hw,
> > + [CLKID_GE2D] = &t7_ge2d_gate.hw,
> > + [CLKID_VDIN_MEAS_MUX] = &t7_vdin_meas_mux.hw,
> > + [CLKID_VDIN_MEAS_DIV] = &t7_vdin_meas_div.hw,
> > + [CLKID_VDIN_MEAS_GATE] = &t7_vdin_meas_gate.hw,
> > + [CLKID_VID_LOCK_DIV] = &t7_vid_lock_div.hw,
> > + [CLKID_VID_LOCK] = &t7_vid_lock_clk.hw,
> > + [CLKID_PWM_A_MUX] = &t7_pwm_a_mux.hw,
> > + [CLKID_PWM_A_DIV] = &t7_pwm_a_div.hw,
> > + [CLKID_PWM_A_GATE] = &t7_pwm_a_gate.hw,
> > + [CLKID_PWM_B_MUX] = &t7_pwm_b_mux.hw,
> > + [CLKID_PWM_B_DIV] = &t7_pwm_b_div.hw,
> > + [CLKID_PWM_B_GATE] = &t7_pwm_b_gate.hw,
> > + [CLKID_PWM_C_MUX] = &t7_pwm_c_mux.hw,
> > + [CLKID_PWM_C_DIV] = &t7_pwm_c_div.hw,
> > + [CLKID_PWM_C_GATE] = &t7_pwm_c_gate.hw,
> > + [CLKID_PWM_D_MUX] = &t7_pwm_d_mux.hw,
> > + [CLKID_PWM_D_DIV] = &t7_pwm_d_div.hw,
> > + [CLKID_PWM_D_GATE] = &t7_pwm_d_gate.hw,
> > + [CLKID_PWM_E_MUX] = &t7_pwm_e_mux.hw,
> > + [CLKID_PWM_E_DIV] = &t7_pwm_e_div.hw,
> > + [CLKID_PWM_E_GATE] = &t7_pwm_e_gate.hw,
> > + [CLKID_PWM_F_MUX] = &t7_pwm_f_mux.hw,
> > + [CLKID_PWM_F_DIV] = &t7_pwm_f_div.hw,
> > + [CLKID_PWM_F_GATE] = &t7_pwm_f_gate.hw,
> > + [CLKID_PWM_AO_A_MUX] = &t7_pwm_ao_a_mux.hw,
> > + [CLKID_PWM_AO_A_DIV] = &t7_pwm_ao_a_div.hw,
> > + [CLKID_PWM_AO_A_GATE] = &t7_pwm_ao_a_gate.hw,
> > + [CLKID_PWM_AO_B_MUX] = &t7_pwm_ao_b_mux.hw,
> > + [CLKID_PWM_AO_B_DIV] = &t7_pwm_ao_b_div.hw,
> > + [CLKID_PWM_AO_B_GATE] = &t7_pwm_ao_b_gate.hw,
> > + [CLKID_PWM_AO_C_MUX] = &t7_pwm_ao_c_mux.hw,
> > + [CLKID_PWM_AO_C_DIV] = &t7_pwm_ao_c_div.hw,
> > + [CLKID_PWM_AO_C_GATE] = &t7_pwm_ao_c_gate.hw,
> > + [CLKID_PWM_AO_D_MUX] = &t7_pwm_ao_d_mux.hw,
> > + [CLKID_PWM_AO_D_DIV] = &t7_pwm_ao_d_div.hw,
> > + [CLKID_PWM_AO_D_GATE] = &t7_pwm_ao_d_gate.hw,
> > + [CLKID_PWM_AO_E_MUX] = &t7_pwm_ao_e_mux.hw,
> > + [CLKID_PWM_AO_E_DIV] = &t7_pwm_ao_e_div.hw,
> > + [CLKID_PWM_AO_E_GATE] = &t7_pwm_ao_e_gate.hw,
> > + [CLKID_PWM_AO_F_MUX] = &t7_pwm_ao_f_mux.hw,
> > + [CLKID_PWM_AO_F_DIV] = &t7_pwm_ao_f_div.hw,
> > + [CLKID_PWM_AO_F_GATE] = &t7_pwm_ao_f_gate.hw,
> > + [CLKID_PWM_AO_G_MUX] = &t7_pwm_ao_g_mux.hw,
> > + [CLKID_PWM_AO_G_DIV] = &t7_pwm_ao_g_div.hw,
> > + [CLKID_PWM_AO_G_GATE] = &t7_pwm_ao_g_gate.hw,
> > + [CLKID_PWM_AO_H_MUX] = &t7_pwm_ao_h_mux.hw,
> > + [CLKID_PWM_AO_H_DIV] = &t7_pwm_ao_h_div.hw,
> > + [CLKID_PWM_AO_H_GATE] = &t7_pwm_ao_h_gate.hw,
> > + [CLKID_SPICC0_MUX] = &t7_spicc0_mux.hw,
> > + [CLKID_SPICC0_DIV] = &t7_spicc0_div.hw,
> > + [CLKID_SPICC0_GATE] = &t7_spicc0_gate.hw,
> > + [CLKID_SPICC1_MUX] = &t7_spicc1_mux.hw,
> > + [CLKID_SPICC1_DIV] = &t7_spicc1_div.hw,
> > + [CLKID_SPICC1_GATE] = &t7_spicc1_gate.hw,
> > + [CLKID_SPICC2_MUX] = &t7_spicc2_mux.hw,
> > + [CLKID_SPICC2_DIV] = &t7_spicc2_div.hw,
> > + [CLKID_SPICC2_GATE] = &t7_spicc2_gate.hw,
> > + [CLKID_SPICC3_MUX] = &t7_spicc3_mux.hw,
> > + [CLKID_SPICC3_DIV] = &t7_spicc3_div.hw,
> > + [CLKID_SPICC3_GATE] = &t7_spicc3_gate.hw,
> > + [CLKID_SPICC4_MUX] = &t7_spicc4_mux.hw,
> > + [CLKID_SPICC4_DIV] = &t7_spicc4_div.hw,
> > + [CLKID_SPICC4_GATE] = &t7_spicc4_gate.hw,
> > + [CLKID_SPICC5_MUX] = &t7_spicc5_mux.hw,
> > + [CLKID_SPICC5_DIV] = &t7_spicc5_div.hw,
> > + [CLKID_SPICC5_GATE] = &t7_spicc5_gate.hw,
> > + [CLKID_SD_EMMC_C_CLK_MUX] = &t7_sd_emmc_c_clk0_sel.hw,
> > + [CLKID_SD_EMMC_C_CLK_DIV] = &t7_sd_emmc_c_clk0_div.hw,
> > + [CLKID_SD_EMMC_C_CLK] = &t7_sd_emmc_c_clk0.hw,
> > + [CLKID_SD_EMMC_A_CLK_MUX] = &t7_sd_emmc_a_clk0_sel.hw,
> > + [CLKID_SD_EMMC_A_CLK_DIV] = &t7_sd_emmc_a_clk0_div.hw,
> > + [CLKID_SD_EMMC_A_CLK] = &t7_sd_emmc_a_clk0.hw,
> > + [CLKID_SD_EMMC_B_CLK_MUX] = &t7_sd_emmc_b_clk0_sel.hw,
> > + [CLKID_SD_EMMC_B_CLK_DIV] = &t7_sd_emmc_b_clk0_div.hw,
> > + [CLKID_SD_EMMC_B_CLK] = &t7_sd_emmc_b_clk0.hw,
> > + [CLKID_DSI_A_MEAS_MUX] = &t7_dsi_a_meas_mux.hw,
> > + [CLKID_DSI_A_MEAS_DIV] = &t7_dsi_a_meas_div.hw,
> > + [CLKID_DSI_A_MEAS_GATE] = &t7_dsi_a_meas_gate.hw,
> > + [CLKID_DSI_B_MEAS_MUX] = &t7_dsi_b_meas_mux.hw,
> > + [CLKID_DSI_B_MEAS_DIV] = &t7_dsi_b_meas_div.hw,
> > + [CLKID_DSI_B_MEAS_GATE] = &t7_dsi_b_meas_gate.hw,
> > + [CLKID_DSI0_PHY_MUX] = &t7_dsi0_phy_mux.hw,
> > + [CLKID_DSI0_PHY_DIV] = &t7_dsi0_phy_div.hw,
> > + [CLKID_DSI0_PHY_GATE] = &t7_dsi0_phy_gate.hw,
> > + [CLKID_DSI1_PHY_MUX] = &t7_dsi1_phy_mux.hw,
> > + [CLKID_DSI1_PHY_DIV] = &t7_dsi1_phy_div.hw,
> > + [CLKID_DSI1_PHY_GATE] = &t7_dsi1_phy_gate.hw,
> > + [CLKID_ETH_RMII_SEL] = &t7_eth_rmii_sel.hw,
> > + [CLKID_ETH_RMII_DIV] = &t7_eth_rmii_div.hw,
> > + [CLKID_ETH_RMII] = &t7_eth_rmii.hw,
> > + [CLKID_ETH_DIV8] = &t7_eth_div8.hw,
> > + [CLKID_ETH_125M] = &t7_eth_125m.hw,
> > + [CLKID_SARADC_MUX] = &t7_saradc_mux.hw,
> > + [CLKID_SARADC_DIV] = &t7_saradc_div.hw,
> > + [CLKID_SARADC_GATE] = &t7_saradc_gate.hw,
> > + [CLKID_GEN_MUX] = &t7_gen_sel.hw,
> > + [CLKID_GEN_DIV] = &t7_gen_div.hw,
> > + [CLKID_GEN_GATE] = &t7_gen.hw,
> > + [CLKID_DDR] = &t7_ddr.hw,
> > + [CLKID_DOS] = &t7_dos.hw,
> > + [CLKID_MIPI_DSI_A] = &t7_mipi_dsi_a.hw,
> > + [CLKID_MIPI_DSI_B] = &t7_mipi_dsi_b.hw,
> > + [CLKID_ETHPHY] = &t7_ethphy.hw,
> > + [CLKID_MALI] = &t7_mali.hw,
> > + [CLKID_AOCPU] = &t7_aocpu.hw,
> > + [CLKID_AUCPU] = &t7_aucpu.hw,
> > + [CLKID_CEC] = &t7_cec.hw,
> > + [CLKID_GDC] = &t7_gdc.hw,
> > + [CLKID_DESWARP] = &t7_deswarp.hw,
> > + [CLKID_AMPIPE_NAND] = &t7_ampipe_nand.hw,
> > + [CLKID_AMPIPE_ETH] = &t7_ampipe_eth.hw,
> > + [CLKID_AM2AXI0] = &t7_am2axi0.hw,
> > + [CLKID_AM2AXI1] = &t7_am2axi1.hw,
> > + [CLKID_AM2AXI2] = &t7_am2axi2.hw,
> > + [CLKID_SD_EMMC_A] = &t7_sdemmca.hw,
> > + [CLKID_SD_EMMC_B] = &t7_sdemmcb.hw,
> > + [CLKID_SD_EMMC_C] = &t7_sdemmcc.hw,
> > + [CLKID_SMARTCARD] = &t7_smartcard.hw,
> > + [CLKID_ACODEC] = &t7_acodec.hw,
> > + [CLKID_SPIFC] = &t7_spifc.hw,
> > + [CLKID_MSR_CLK] = &t7_msr_clk.hw,
> > + [CLKID_IR_CTRL] = &t7_ir_ctrl.hw,
> > + [CLKID_AUDIO] = &t7_audio.hw,
> > + [CLKID_ETH] = &t7_eth.hw,
> > + [CLKID_UART_A] = &t7_uart_a.hw,
> > + [CLKID_UART_B] = &t7_uart_b.hw,
> > + [CLKID_UART_C] = &t7_uart_c.hw,
> > + [CLKID_UART_D] = &t7_uart_d.hw,
> > + [CLKID_UART_E] = &t7_uart_e.hw,
> > + [CLKID_UART_F] = &t7_uart_f.hw,
> > + [CLKID_AIFIFO] = &t7_aififo.hw,
> > + [CLKID_SPICC2] = &t7_spicc2.hw,
> > + [CLKID_SPICC3] = &t7_spicc3.hw,
> > + [CLKID_SPICC4] = &t7_spicc4.hw,
> > + [CLKID_TS_A73] = &t7_ts_a73.hw,
> > + [CLKID_TS_A53] = &t7_ts_a53.hw,
> > + [CLKID_SPICC5] = &t7_spicc5.hw,
> > + [CLKID_G2D] = &t7_g2d.hw,
> > + [CLKID_SPICC0] = &t7_spicc0.hw,
> > + [CLKID_SPICC1] = &t7_spicc1.hw,
> > + [CLKID_PCIE] = &t7_pcie.hw,
> > + [CLKID_USB] = &t7_usb.hw,
> > + [CLKID_PCIE_PHY] = &t7_pcie_phy.hw,
> > + [CLKID_I2C_AO_A] = &t7_i2c_ao_a.hw,
> > + [CLKID_I2C_AO_B] = &t7_i2c_ao_b.hw,
> > + [CLKID_I2C_M_A] = &t7_i2c_m_a.hw,
> > + [CLKID_I2C_M_B] = &t7_i2c_m_b.hw,
> > + [CLKID_I2C_M_C] = &t7_i2c_m_c.hw,
> > + [CLKID_I2C_M_D] = &t7_i2c_m_d.hw,
> > + [CLKID_I2C_M_E] = &t7_i2c_m_e.hw,
> > + [CLKID_I2C_M_F] = &t7_i2c_m_f.hw,
> > + [CLKID_HDMITX_APB] = &t7_hdmitx_apb.hw,
> > + [CLKID_I2C_S_A] = &t7_i2c_s_a.hw,
> > + [CLKID_HDMIRX_PCLK] = &t7_hdmirx_pclk.hw,
> > + [CLKID_MMC_APB] = &t7_mmc_apb.hw,
> > + [CLKID_MIPI_ISP_PCLK] = &t7_mipi_isp_pclk.hw,
> > + [CLKID_RSA] = &t7_rsa.hw,
> > + [CLKID_PCLK_SYS_CPU_APB] = &t7_pclk_sys_cpu_apb.hw,
> > + [CLKID_A73PCLK_CPU_APB] = &t7_a73pclk_cpu_apb.hw,
> > + [CLKID_DSPA] = &t7_dspa.hw,
> > + [CLKID_DSPB] = &t7_dspb.hw,
> > + [CLKID_VPU_INTR] = &t7_vpu_intr.hw,
> > + [CLKID_SAR_ADC] = &t7_sar_adc.hw,
> > + [CLKID_GIC] = &t7_gic.hw,
> > + [CLKID_TS_GPU] = &t7_ts_gpu.hw,
> > + [CLKID_TS_NNA] = &t7_ts_nna.hw,
> > + [CLKID_TS_VPU] = &t7_ts_vpu.hw,
> > + [CLKID_TS_HEVC] = &t7_ts_hevc.hw,
> > + [CLKID_PWM_AB] = &t7_pwm_ab.hw,
> > + [CLKID_PWM_CD] = &t7_pwm_cd.hw,
> > + [CLKID_PWM_EF] = &t7_pwm_ef.hw,
> > + [CLKID_PWM_AO_AB] = &t7_pwm_ao_ab.hw,
> > + [CLKID_PWM_AO_CD] = &t7_pwm_ao_cd.hw,
> > + [CLKID_PWM_AO_EF] = &t7_pwm_ao_ef.hw,
> > + [CLKID_PWM_AO_GH] = &t7_pwm_ao_gh.hw,
> > +};
> > +
> > +/* Convenience table to populate regmap in .probe */
> > +static struct clk_regmap *const t7_clk_regmaps[] = {
> > + &t7_rtc_32k_clkin,
> > + &t7_rtc_32k_div,
> > + &t7_rtc_32k_xtal,
> > + &t7_rtc_32k_sel,
> > + &t7_rtc_clk,
> > + &t7_sysclk_b_sel,
> > + &t7_sysclk_b_div,
> > + &t7_sysclk_b,
> > + &t7_sysclk_a_sel,
> > + &t7_sysclk_a_div,
> > + &t7_sysclk_a,
> > + &t7_sys_clk,
> > + &t7_ceca_32k_clkin,
> > + &t7_ceca_32k_div,
> > + &t7_ceca_32k_sel_pre,
> > + &t7_ceca_32k_sel,
> > + &t7_ceca_32k_clkout,
> > + &t7_cecb_32k_clkin,
> > + &t7_cecb_32k_div,
> > + &t7_cecb_32k_sel_pre,
> > + &t7_cecb_32k_sel,
> > + &t7_cecb_32k_clkout,
> > + &t7_sc_clk_mux,
> > + &t7_sc_clk_div,
> > + &t7_sc_clk_gate,
> > + &t7_dspa_a_mux,
> > + &t7_dspa_a_div,
> > + &t7_dspa_a_gate,
> > + &t7_dspa_b_mux,
> > + &t7_dspa_b_div,
> > + &t7_dspa_b_gate,
> > + &t7_dspa_mux,
> > + &t7_dspb_a_mux,
> > + &t7_dspb_a_div,
> > + &t7_dspb_a_gate,
> > + &t7_dspb_b_mux,
> > + &t7_dspb_b_div,
> > + &t7_dspb_b_gate,
> > + &t7_dspb_mux,
> > + &t7_24M_clk_gate,
> > + &t7_12M_clk_gate,
> > + &t7_25M_clk_div,
> > + &t7_25M_clk_gate,
> > + &t7_vid_pll_div,
> > + &t7_vid_pll_sel,
> > + &t7_vid_pll,
> > + &t7_vclk_sel,
> > + &t7_vclk2_sel,
> > + &t7_vclk_input,
> > + &t7_vclk2_input,
> > + &t7_vclk_div,
> > + &t7_vclk2_div,
> > + &t7_vclk,
> > + &t7_vclk2,
> > + &t7_vclk_div1,
> > + &t7_vclk_div2_en,
> > + &t7_vclk_div4_en,
> > + &t7_vclk_div6_en,
> > + &t7_vclk_div12_en,
> > + &t7_vclk2_div1,
> > + &t7_vclk2_div2_en,
> > + &t7_vclk2_div4_en,
> > + &t7_vclk2_div6_en,
> > + &t7_vclk2_div12_en,
> > + &t7_cts_enci_sel,
> > + &t7_cts_encp_sel,
> > + &t7_cts_vdac_sel,
> > + &t7_hdmi_tx_sel,
> > + &t7_cts_enci,
> > + &t7_cts_encp,
> > + &t7_cts_vdac,
> > + &t7_hdmi_tx,
> > + &t7_hdmitx_sys_sel,
> > + &t7_hdmitx_sys_div,
> > + &t7_hdmitx_sys,
> > + &t7_hdmitx_prif_sel,
> > + &t7_hdmitx_prif_div,
> > + &t7_hdmitx_prif,
> > + &t7_hdmitx_200m_sel,
> > + &t7_hdmitx_200m_div,
> > + &t7_hdmitx_200m,
> > + &t7_hdmitx_aud_sel,
> > + &t7_hdmitx_aud_div,
> > + &t7_hdmitx_aud,
> > + &t7_hdmirx_5m_sel,
> > + &t7_hdmirx_5m_div,
> > + &t7_hdmirx_5m,
> > + &t7_hdmirx_2m_sel,
> > + &t7_hdmirx_2m_div,
> > + &t7_hdmirx_2m,
> > + &t7_hdmirx_cfg_sel,
> > + &t7_hdmirx_cfg_div,
> > + &t7_hdmirx_cfg,
> > + &t7_hdmirx_hdcp_sel,
> > + &t7_hdmirx_hdcp_div,
> > + &t7_hdmirx_hdcp,
> > + &t7_hdmirx_aud_pll_sel,
> > + &t7_hdmirx_aud_pll_div,
> > + &t7_hdmirx_aud_pll,
> > + &t7_hdmirx_acr_sel,
> > + &t7_hdmirx_acr_div,
> > + &t7_hdmirx_acr,
> > + &t7_hdmirx_meter_sel,
> > + &t7_hdmirx_meter_div,
> > + &t7_hdmirx_meter,
> > + &t7_ts_clk_div,
> > + &t7_ts_clk_gate,
> > + &t7_mali_0_sel,
> > + &t7_mali_0_div,
> > + &t7_mali_0,
> > + &t7_mali_1_sel,
> > + &t7_mali_1_div,
> > + &t7_mali_1,
> > + &t7_mali_mux,
> > + &t7_vdec_p0_mux,
> > + &t7_vdec_p0_div,
> > + &t7_vdec_p0,
> > + &t7_vdec_p1_mux,
> > + &t7_vdec_p1_div,
> > + &t7_vdec_p1,
> > + &t7_vdec_mux,
> > + &t7_hcodec_p0_mux,
> > + &t7_hcodec_p0_div,
> > + &t7_hcodec_p0,
> > + &t7_hcodec_p1_mux,
> > + &t7_hcodec_p1_div,
> > + &t7_hcodec_p1,
> > + &t7_hcodec_mux,
> > + &t7_hevcb_p0_mux,
> > + &t7_hevcb_p0_div,
> > + &t7_hevcb_p0,
> > + &t7_hevcb_p1_mux,
> > + &t7_hevcb_p1_div,
> > + &t7_hevcb_p1,
> > + &t7_hevcb_mux,
> > + &t7_hevcf_p0_mux,
> > + &t7_hevcf_p0_div,
> > + &t7_hevcf_p0,
> > + &t7_hevcf_p1_mux,
> > + &t7_hevcf_p1_div,
> > + &t7_hevcf_p1,
> > + &t7_hevcf_mux,
> > + &t7_wave_a_sel,
> > + &t7_wave_a_div,
> > + &t7_wave_aclk,
> > + &t7_wave_b_sel,
> > + &t7_wave_b_div,
> > + &t7_wave_bclk,
> > + &t7_wave_c_sel,
> > + &t7_wave_c_div,
> > + &t7_wave_cclk,
> > + &t7_mipi_isp_sel,
> > + &t7_mipi_isp_div,
> > + &t7_mipi_isp,
> > + &t7_mipi_csi_phy_sel0,
> > + &t7_mipi_csi_phy_div0,
> > + &t7_mipi_csi_phy0,
> > + &t7_mipi_csi_phy_sel1,
> > + &t7_mipi_csi_phy_div1,
> > + &t7_mipi_csi_phy1,
> > + &t7_mipi_csi_phy_clk,
> > + &t7_vpu_0_sel,
> > + &t7_vpu_0_div,
> > + &t7_vpu_0,
> > + &t7_vpu_1_sel,
> > + &t7_vpu_1_div,
> > + &t7_vpu_1,
> > + &t7_vpu,
> > + &t7_vpu_clkb_tmp_mux,
> > + &t7_vpu_clkb_tmp_div,
> > + &t7_vpu_clkb_tmp,
> > + &t7_vpu_clkb_div,
> > + &t7_vpu_clkb,
> > + &t7_vpu_clkc_p0_mux,
> > + &t7_vpu_clkc_p0_div,
> > + &t7_vpu_clkc_p0,
> > + &t7_vpu_clkc_p1_mux,
> > + &t7_vpu_clkc_p1_div,
> > + &t7_vpu_clkc_p1,
> > + &t7_vpu_clkc_mux,
> > + &t7_vapb_0_sel,
> > + &t7_vapb_0_div,
> > + &t7_vapb_0,
> > + &t7_vapb_1_sel,
> > + &t7_vapb_1_div,
> > + &t7_vapb_1,
> > + &t7_vapb,
> > + &t7_gdcclk_0_sel,
> > + &t7_gdcclk_0_div,
> > + &t7_gdcclk_0,
> > + &t7_gdcclk_1_sel,
> > + &t7_gdcclk_1_div,
> > + &t7_gdcclk_1,
> > + &t7_gdcclk,
> > + &t7_gdc_clk,
> > + &t7_dewarpclk_0_sel,
> > + &t7_dewarpclk_0_div,
> > + &t7_dewarpclk_0,
> > + &t7_dewarpclk_1_sel,
> > + &t7_dewarpclk_1_div,
> > + &t7_dewarpclk_1,
> > + &t7_dewarpclk,
> > + &t7_dewarp_clk,
> > + &t7_anakin_0_sel,
> > + &t7_anakin_0_div,
> > + &t7_anakin_0,
> > + &t7_anakin_1_sel,
> > + &t7_anakin_1_div,
> > + &t7_anakin_1,
> > + &t7_anakin,
> > + &t7_anakin_clk,
> > + &t7_ge2d_gate,
> > + &t7_vdin_meas_mux,
> > + &t7_vdin_meas_div,
> > + &t7_vdin_meas_gate,
> > + &t7_vid_lock_div,
> > + &t7_vid_lock_clk,
> > + &t7_pwm_a_mux,
> > + &t7_pwm_a_div,
> > + &t7_pwm_a_gate,
> > + &t7_pwm_b_mux,
> > + &t7_pwm_b_div,
> > + &t7_pwm_b_gate,
> > + &t7_pwm_c_mux,
> > + &t7_pwm_c_div,
> > + &t7_pwm_c_gate,
> > + &t7_pwm_d_mux,
> > + &t7_pwm_d_div,
> > + &t7_pwm_d_gate,
> > + &t7_pwm_e_mux,
> > + &t7_pwm_e_div,
> > + &t7_pwm_e_gate,
> > + &t7_pwm_f_mux,
> > + &t7_pwm_f_div,
> > + &t7_pwm_f_gate,
> > + &t7_pwm_ao_a_mux,
> > + &t7_pwm_ao_a_div,
> > + &t7_pwm_ao_a_gate,
> > + &t7_pwm_ao_b_mux,
> > + &t7_pwm_ao_b_div,
> > + &t7_pwm_ao_b_gate,
> > + &t7_pwm_ao_c_mux,
> > + &t7_pwm_ao_c_div,
> > + &t7_pwm_ao_c_gate,
> > + &t7_pwm_ao_d_mux,
> > + &t7_pwm_ao_d_div,
> > + &t7_pwm_ao_d_gate,
> > + &t7_pwm_ao_e_mux,
> > + &t7_pwm_ao_e_div,
> > + &t7_pwm_ao_e_gate,
> > + &t7_pwm_ao_f_mux,
> > + &t7_pwm_ao_f_div,
> > + &t7_pwm_ao_f_gate,
> > + &t7_pwm_ao_g_mux,
> > + &t7_pwm_ao_g_div,
> > + &t7_pwm_ao_g_gate,
> > + &t7_pwm_ao_h_mux,
> > + &t7_pwm_ao_h_div,
> > + &t7_pwm_ao_h_gate,
> > + &t7_spicc0_mux,
> > + &t7_spicc0_div,
> > + &t7_spicc0_gate,
> > + &t7_spicc1_mux,
> > + &t7_spicc1_div,
> > + &t7_spicc1_gate,
> > + &t7_spicc2_mux,
> > + &t7_spicc2_div,
> > + &t7_spicc2_gate,
> > + &t7_spicc3_mux,
> > + &t7_spicc3_div,
> > + &t7_spicc3_gate,
> > + &t7_spicc4_mux,
> > + &t7_spicc4_div,
> > + &t7_spicc4_gate,
> > + &t7_spicc5_mux,
> > + &t7_spicc5_div,
> > + &t7_spicc5_gate,
> > + &t7_sd_emmc_c_clk0_sel,
> > + &t7_sd_emmc_c_clk0_div,
> > + &t7_sd_emmc_c_clk0,
> > + &t7_sd_emmc_a_clk0_sel,
> > + &t7_sd_emmc_a_clk0_div,
> > + &t7_sd_emmc_a_clk0,
> > + &t7_sd_emmc_b_clk0_sel,
> > + &t7_sd_emmc_b_clk0_div,
> > + &t7_sd_emmc_b_clk0,
> > + &t7_eth_rmii_sel,
> > + &t7_eth_rmii_div,
> > + &t7_eth_rmii,
> > + &t7_eth_125m,
> > + &t7_dsi_a_meas_mux,
> > + &t7_dsi_a_meas_div,
> > + &t7_dsi_a_meas_gate,
> > + &t7_dsi_b_meas_mux,
> > + &t7_dsi_b_meas_div,
> > + &t7_dsi_b_meas_gate,
> > + &t7_dsi0_phy_mux,
> > + &t7_dsi0_phy_div,
> > + &t7_dsi0_phy_gate,
> > + &t7_dsi1_phy_mux,
> > + &t7_dsi1_phy_div,
> > + &t7_dsi1_phy_gate,
> > + &t7_saradc_mux,
> > + &t7_saradc_div,
> > + &t7_saradc_gate,
> > + &t7_gen_sel,
> > + &t7_gen_div,
> > + &t7_gen,
> > +
> > + &t7_ddr,
> > + &t7_dos,
> > + &t7_mipi_dsi_a,
> > + &t7_mipi_dsi_b,
> > + &t7_ethphy,
> > + &t7_mali,
> > + &t7_aocpu,
> > + &t7_aucpu,
> > + &t7_cec,
> > + &t7_gdc,
> > + &t7_deswarp,
> > + &t7_ampipe_nand,
> > + &t7_ampipe_eth,
> > + &t7_am2axi0,
> > + &t7_am2axi1,
> > + &t7_am2axi2,
> > + &t7_sdemmca,
> > + &t7_sdemmcb,
> > + &t7_sdemmcc,
> > + &t7_smartcard,
> > + &t7_acodec,
> > + &t7_spifc,
> > + &t7_msr_clk,
> > + &t7_ir_ctrl,
> > + &t7_audio,
> > + &t7_eth,
> > + &t7_uart_a,
> > + &t7_uart_b,
> > + &t7_uart_c,
> > + &t7_uart_d,
> > + &t7_uart_e,
> > + &t7_uart_f,
> > + &t7_aififo,
> > + &t7_spicc2,
> > + &t7_spicc3,
> > + &t7_spicc4,
> > + &t7_ts_a73,
> > + &t7_ts_a53,
> > + &t7_spicc5,
> > + &t7_g2d,
> > + &t7_spicc0,
> > + &t7_spicc1,
> > + &t7_pcie,
> > + &t7_usb,
> > + &t7_pcie_phy,
> > + &t7_i2c_ao_a,
> > + &t7_i2c_ao_b,
> > + &t7_i2c_m_a,
> > + &t7_i2c_m_b,
> > + &t7_i2c_m_c,
> > + &t7_i2c_m_d,
> > + &t7_i2c_m_e,
> > + &t7_i2c_m_f,
> > + &t7_hdmitx_apb,
> > + &t7_i2c_s_a,
> > + &t7_hdmirx_pclk,
> > + &t7_mmc_apb,
> > + &t7_mipi_isp_pclk,
> > + &t7_rsa,
> > + &t7_pclk_sys_cpu_apb,
> > + &t7_a73pclk_cpu_apb,
> > + &t7_dspa,
> > + &t7_dspb,
> > + &t7_vpu_intr,
> > + &t7_sar_adc,
> > + &t7_gic,
> > + &t7_ts_gpu,
> > + &t7_ts_nna,
> > + &t7_ts_vpu,
> > + &t7_ts_hevc,
> > + &t7_pwm_ab,
> > + &t7_pwm_cd,
> > + &t7_pwm_ef,
> > + &t7_pwm_ao_ab,
> > + &t7_pwm_ao_cd,
> > + &t7_pwm_ao_ef,
> > + &t7_pwm_ao_gh,
> > +};
> > +
> > +static struct regmap_config clkc_regmap_config = {
> > + .reg_bits = 32,
> > + .val_bits = 32,
> > + .reg_stride = 4,
> > +};
> > +
> > +static struct meson_clk_hw_data t7_periphs_clks = {
> > + .hws = t7_periphs_hw_clks,
> > + .num = ARRAY_SIZE(t7_periphs_hw_clks),
> > +};
> > +
> > +static int amlogic_a1_periphs_probe(struct platform_device *pdev)
> > +{
> > + struct device *dev = &pdev->dev;
> > + struct regmap *regmap;
> > + void __iomem *base;
> > + int ret, i;
> > +
> > + base = devm_platform_ioremap_resource(pdev, 0);
> > + if (IS_ERR(base))
> > + return dev_err_probe(dev, PTR_ERR(base), "can't ioremap resource\n");
> > +
> > + regmap = devm_regmap_init_mmio(dev, base, &clkc_regmap_config);
> > + if (IS_ERR(regmap))
> > + return dev_err_probe(dev, PTR_ERR(regmap), "can't init regmap mmio region\n");
> > +
> > + /* Populate regmap for the regmap backed clocks */
> > + for (i = 0; i < ARRAY_SIZE(t7_clk_regmaps); i++)
> > + t7_clk_regmaps[i]->map = regmap;
> > +
> > + for (i = 0; i < t7_periphs_clks.num; i++) {
> > + /* array might be sparse */
> > + if (!t7_periphs_clks.hws[i])
> > + continue;
> > +
> > + ret = devm_clk_hw_register(dev, t7_periphs_clks.hws[i]);
> > + if (ret)
> > + return dev_err_probe(dev, ret, "clock[%d] registration failed\n", i);
> > + }
> > +
> > + return devm_of_clk_add_hw_provider(dev, meson_clk_hw_get, &t7_periphs_clks);
> > +}
> > +
> > +static const struct of_device_id t7_periphs_clkc_match_table[] = {
> > + { .compatible = "amlogic,t7-peripherals-clkc", },
> > + {}
> > +};
> > +MODULE_DEVICE_TABLE(of, t7_periphs_clkc_match_table);
> > +
> > +static struct platform_driver t7_periphs_clkc_driver = {
> > + .probe = amlogic_a1_periphs_probe,
> > + .driver = {
> > + .name = "t7-periphs-clkc",
> > + .of_match_table = t7_periphs_clkc_match_table,
> > + },
> > +};
> > +
> > +module_platform_driver(t7_periphs_clkc_driver);
> > +MODULE_AUTHOR("Yu Tu <[email protected]>");
> > +MODULE_AUTHOR("Lucas Tanure <[email protected]>");
> > +MODULE_LICENSE("GPL");
> > diff --git a/drivers/clk/meson/t7-peripherals.h b/drivers/clk/meson/t7-peripherals.h
> > new file mode 100644
> > index 000000000000..0ac5e0919b5e
> > --- /dev/null
> > +++ b/drivers/clk/meson/t7-peripherals.h
> > @@ -0,0 +1,131 @@
> > +/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
> > +/*
> > + * Copyright (c) 2019 Amlogic, Inc. All rights reserved.
> > + */
> > +
> > +#ifndef __T7_PERIPHERALS_H
> > +#define __T7_PERIPHERALS_H
> > +
> > +/* basic clk: 0xfe000000 */
> > +#define CLKCTRL_OSCIN_CTRL (0x0001 << 2)
> > +#define CLKCTRL_RTC_BY_OSCIN_CTRL0 (0x0002 << 2)
> > +#define CLKCTRL_RTC_BY_OSCIN_CTRL1 (0x0003 << 2)
> > +#define CLKCTRL_RTC_CTRL (0x0004 << 2)
> > +#define CLKCTRL_CHECK_CLK_RESULT (0x0005 << 2)
> > +#define CLKCTRL_MBIST_ATSPEED_CTRL (0x0006 << 2)
> > +#define CLKCTRL_LOCK_BIT_REG0 (0x0008 << 2)
> > +#define CLKCTRL_LOCK_BIT_REG1 (0x0009 << 2)
> > +#define CLKCTRL_LOCK_BIT_REG2 (0x000a << 2)
> > +#define CLKCTRL_LOCK_BIT_REG3 (0x000b << 2)
> > +#define CLKCTRL_PROT_BIT_REG0 (0x000c << 2)
> > +#define CLKCTRL_PROT_BIT_REG1 (0x000d << 2)
> > +#define CLKCTRL_PROT_BIT_REG2 (0x000e << 2)
> > +#define CLKCTRL_PROT_BIT_REG3 (0x000f << 2)
> > +#define CLKCTRL_SYS_CLK_CTRL0 (0x0010 << 2)
> > +#define CLKCTRL_SYS_CLK_EN0_REG0 (0x0011 << 2)
> > +#define CLKCTRL_SYS_CLK_EN0_REG1 (0x0012 << 2)
> > +#define CLKCTRL_SYS_CLK_EN0_REG2 (0x0013 << 2)
> > +#define CLKCTRL_SYS_CLK_EN0_REG3 (0x0014 << 2)
> > +#define CLKCTRL_SYS_CLK_EN1_REG0 (0x0015 << 2)
> > +#define CLKCTRL_SYS_CLK_EN1_REG1 (0x0016 << 2)
> > +#define CLKCTRL_SYS_CLK_EN1_REG2 (0x0017 << 2)
> > +#define CLKCTRL_SYS_CLK_EN1_REG3 (0x0018 << 2)
> > +#define CLKCTRL_SYS_CLK_VPU_EN0 (0x0019 << 2)
> > +#define CLKCTRL_SYS_CLK_VPU_EN1 (0x001a << 2)
> > +#define CLKCTRL_AXI_CLK_CTRL0 (0x001b << 2)
> > +#define CLKCTRL_TST_CTRL0 (0x0020 << 2)
> > +#define CLKCTRL_TST_CTRL1 (0x0021 << 2)
> > +#define CLKCTRL_CECA_CTRL0 (0x0022 << 2)
> > +#define CLKCTRL_CECA_CTRL1 (0x0023 << 2)
> > +#define CLKCTRL_CECB_CTRL0 (0x0024 << 2)
> > +#define CLKCTRL_CECB_CTRL1 (0x0025 << 2)
> > +#define CLKCTRL_SC_CLK_CTRL (0x0026 << 2)
> > +#define CLKCTRL_DSPA_CLK_CTRL0 (0x0027 << 2)
> > +#define CLKCTRL_DSPB_CLK_CTRL0 (0x0028 << 2)
> > +#define CLKCTRL_CLK12_24_CTRL (0x002a << 2)
> > +#define CLKCTRL_ANAKIN_CLK_CTRL (0x002b << 2)
> > +#define CLKCTRL_GDC_CLK_CTRL (0x002c << 2)
> > +#define CLKCTRL_AMLGDC_CLK_CTRL (0x002d << 2)
> > +#define CLKCTRL_VID_CLK0_CTRL (0x0030 << 2)
> > +#define CLKCTRL_VID_CLK0_CTRL2 (0x0031 << 2)
> > +#define CLKCTRL_VID_CLK0_DIV (0x0032 << 2)
> > +#define CLKCTRL_VIID_CLK0_DIV (0x0033 << 2)
> > +#define CLKCTRL_VIID_CLK0_CTRL (0x0034 << 2)
> > +#define CLKCTRL_ENC0_HDMI_CLK_CTRL (0x0035 << 2)
> > +#define CLKCTRL_ENC2_HDMI_CLK_CTRL (0x0036 << 2)
> > +#define CLKCTRL_ENC_HDMI_CLK_CTRL (0x0037 << 2)
> > +#define CLKCTRL_HDMI_CLK_CTRL (0x0038 << 2)
> > +#define CLKCTRL_VID_PLL_CLK0_DIV (0x0039 << 2)
> > +#define CLKCTRL_VPU_CLK_CTRL (0x003a << 2)
> > +#define CLKCTRL_VPU_CLKB_CTRL (0x003b << 2)
> > +#define CLKCTRL_VPU_CLKC_CTRL (0x003c << 2)
> > +#define CLKCTRL_VID_LOCK_CLK_CTRL (0x003d << 2)
> > +#define CLKCTRL_VDIN_MEAS_CLK_CTRL (0x003e << 2)
> > +#define CLKCTRL_VAPBCLK_CTRL (0x003f << 2)
> > +#define CLKCTRL_MIPIDSI_PHY_CLK_CTRL (0x0041 << 2)
> > +#define CLKCTRL_MIPI_CSI_PHY_CLK_CTRL (0x0043 << 2)
> > +#define CLKCTRL_MIPI_ISP_CLK_CTRL (0x0044 << 2)
> > +#define CLKCTRL_WAVE420L_CLK_CTRL (0x0045 << 2)
> > +#define CLKCTRL_WAVE420L_CLK_CTRL2 (0x0046 << 2)
> > +#define CLKCTRL_HTX_CLK_CTRL0 (0x0047 << 2)
> > +#define CLKCTRL_HTX_CLK_CTRL1 (0x0048 << 2)
> > +#define CLKCTRL_HRX_CLK_CTRL0 (0x004a << 2)
> > +#define CLKCTRL_HRX_CLK_CTRL1 (0x004b << 2)
> > +#define CLKCTRL_HRX_CLK_CTRL2 (0x004c << 2)
> > +#define CLKCTRL_HRX_CLK_CTRL3 (0x004d << 2)
> > +#define CLKCTRL_VDEC_CLK_CTRL (0x0050 << 2)
> > +#define CLKCTRL_VDEC2_CLK_CTRL (0x0051 << 2)
> > +#define CLKCTRL_VDEC3_CLK_CTRL (0x0052 << 2)
> > +#define CLKCTRL_VDEC4_CLK_CTRL (0x0053 << 2)
> > +#define CLKCTRL_WAVE521_CLK_CTRL (0x0054 << 2)
> > +#define CLKCTRL_WAVE521_CLK_CTRL2 (0x0055 << 2)
> > +#define CLKCTRL_TS_CLK_CTRL (0x0056 << 2)
> > +#define CLKCTRL_MALI_CLK_CTRL (0x0057 << 2)
> > +#define CLKCTRL_VIPNANOQ_CLK_CTRL (0x0058 << 2)
> > +#define CLKCTRL_ETH_CLK_CTRL (0x0059 << 2)
> > +#define CLKCTRL_NAND_CLK_CTRL (0x005a << 2)
> > +#define CLKCTRL_SD_EMMC_CLK_CTRL (0x005b << 2)
> > +#define CLKCTRL_BT656_CLK_CTRL (0x005c << 2)
> > +#define CLKCTRL_SPICC_CLK_CTRL (0x005d << 2)
> > +#define CLKCTRL_GEN_CLK_CTRL (0x005e << 2)
> > +#define CLKCTRL_SAR_CLK_CTRL0 (0x005f << 2)
> > +#define CLKCTRL_PWM_CLK_AB_CTRL (0x0060 << 2)
> > +#define CLKCTRL_PWM_CLK_CD_CTRL (0x0061 << 2)
> > +#define CLKCTRL_PWM_CLK_EF_CTRL (0x0062 << 2)
> > +#define CLKCTRL_PWM_CLK_AO_AB_CTRL (0x0068 << 2)
> > +#define CLKCTRL_PWM_CLK_AO_CD_CTRL (0x0069 << 2)
> > +#define CLKCTRL_PWM_CLK_AO_EF_CTRL (0x006a << 2)
> > +#define CLKCTRL_PWM_CLK_AO_GH_CTRL (0x006b << 2)
> > +#define CLKCTRL_SPICC_CLK_CTRL1 (0x0070 << 2)
> > +#define CLKCTRL_SPICC_CLK_CTRL2 (0x0071 << 2)
> > +#define CLKCTRL_VID_CLK1_CTRL (0x0073 << 2)
> > +#define CLKCTRL_VID_CLK1_CTRL2 (0x0074 << 2)
> > +#define CLKCTRL_VID_CLK1_DIV (0x0075 << 2)
> > +#define CLKCTRL_VIID_CLK1_DIV (0x0076 << 2)
> > +#define CLKCTRL_VIID_CLK1_CTRL (0x0077 << 2)
> > +#define CLKCTRL_VID_CLK2_CTRL (0x0078 << 2)
> > +#define CLKCTRL_VID_CLK2_CTRL2 (0x0079 << 2)
> > +#define CLKCTRL_VID_CLK2_DIV (0x007a << 2)
> > +#define CLKCTRL_VIID_CLK2_DIV (0x007b << 2)
> > +#define CLKCTRL_VIID_CLK2_CTRL (0x007c << 2)
> > +#define CLKCTRL_VID_PLL_CLK1_DIV (0x007d << 2)
> > +#define CLKCTRL_VID_PLL_CLK2_DIV (0x007e << 2)
> > +#define CLKCTRL_MIPI_DSI_MEAS_CLK_CTRL (0x0080 << 2)
> > +#define CLKCTRL_TIMESTAMP_CTRL (0x0100 << 2)
> > +#define CLKCTRL_TIMESTAMP_CTRL1 (0x0101 << 2)
> > +#define CLKCTRL_TIMESTAMP_CTRL2 (0x0103 << 2)
> > +#define CLKCTRL_TIMESTAMP_RD0 (0x0104 << 2)
> > +#define CLKCTRL_TIMESTAMP_RD1 (0x0105 << 2)
> > +#define CLKCTRL_TIMEBASE_CTRL0 (0x0106 << 2)
> > +#define CLKCTRL_TIMEBASE_CTRL1 (0x0107 << 2)
> > +#define CLKCTRL_EFUSE_CPU_CFG01 (0x0120 << 2)
> > +#define CLKCTRL_EFUSE_CPU_CFG2 (0x0121 << 2)
> > +#define CLKCTRL_EFUSE_ENCP_CFG0 (0x0122 << 2)
> > +#define CLKCTRL_EFUSE_MALI_CFG01 (0x0123 << 2)
> > +#define CLKCTRL_EFUSE_HEVCB_CFG01 (0x0124 << 2)
> > +#define CLKCTRL_EFUSE_HEVCB_CFG2 (0x0125 << 2)
> > +#define CLKCTRL_EFUSE_LOCK (0x0126 << 2)
> > +#define CLKCTRL_EFUSE_A73_CFG01 (0x0127 << 2)
> > +#define CLKCTRL_EFUSE_A73_CFG2 (0x0128 << 2)
> > +
> > +#endif /* __T7_PERIPHERALS_H */
> > diff --git a/drivers/clk/meson/t7-pll.c b/drivers/clk/meson/t7-pll.c
> > new file mode 100644
> > index 000000000000..bd18df5e965a
> > --- /dev/null
> > +++ b/drivers/clk/meson/t7-pll.c
> > @@ -0,0 +1,1543 @@
> > +// SPDX-License-Identifier: (GPL-2.0-only OR MIT)
> > +/*
> > + * Amlogic T7 PLL Clock Controller Driver
> > + *
> > + * Copyright (c) 2022-2023 Amlogic, inc. All rights reserved
> > + * Author: Yu Tu <[email protected]>
> > + */
> > +#include <linux/clk-provider.h>
> > +#include <linux/of_device.h>
> > +#include <linux/platform_device.h>
> > +
> > +#include "clk-mpll.h"
> > +#include "clk-pll.h"
> > +#include "clk-regmap.h"
> > +#include "t7-pll.h"
> > +#include "meson-clkc-utils.h"
> > +#include <dt-bindings/clock/amlogic,t7-pll-clkc.h>
> > +
> > +static DEFINE_SPINLOCK(meson_clk_lock);
> > +
> > +static struct clk_regmap t7_fixed_pll_dco = {
> > + .data = &(struct meson_clk_pll_data){
> > + .en = {
> > + .reg_off = ANACTRL_FIXPLL_CTRL0,
> > + .shift = 28,
> > + .width = 1,
> > + },
> > + .m = {
> > + .reg_off = ANACTRL_FIXPLL_CTRL0,
> > + .shift = 0,
> > + .width = 8,
> > + },
> > + .n = {
> > + .reg_off = ANACTRL_FIXPLL_CTRL0,
> > + .shift = 10,
> > + .width = 5,
> > + },
> > + .frac = {
> > + .reg_off = ANACTRL_FIXPLL_CTRL1,
> > + .shift = 0,
> > + .width = 19,
> > + },
> > + .l = {
> > + .reg_off = ANACTRL_FIXPLL_CTRL0,
> > + .shift = 31,
> > + .width = 1,
> > + },
> > + .rst = {
> > + .reg_off = ANACTRL_FIXPLL_CTRL0,
> > + .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,
> > + .flags = CLK_IS_CRITICAL | CLK_GET_RATE_NOCACHE,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_fixed_pll = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = ANACTRL_FIXPLL_CTRL0,
> > + .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 *[]) {
> > + &t7_fixed_pll_dco.hw
> > + },
> > + .num_parents = 1,
> > + /*
> > + * This clock won't ever change at runtime so
> > + * CLK_SET_RATE_PARENT is not required
> > + */
> > + .flags = CLK_IS_CRITICAL | CLK_GET_RATE_NOCACHE,
> > + },
> > +};
> > +
> > +static const struct clk_ops meson_pll_clk_no_ops = {};
> > +
> > +/*
> > + * the sys pll DCO value should be 3G~6G,
> > + * otherwise the sys pll can not lock.
> > + * od is for 32 bit.
> > + */
> > +
> > +static const struct pll_params_table t7_sys_pll_params_table[] = {
> > + PLL_PARAMS(67, 1), /*DCO=1608M OD=1608MM*/
> > + PLL_PARAMS(71, 1), /*DCO=1704MM OD=1704M*/
> > + PLL_PARAMS(75, 1), /*DCO=1800M OD=1800M*/
> > + PLL_PARAMS(126, 1), /*DCO=3024 OD=1512M*/
> > + PLL_PARAMS(116, 1), /*DCO=2784 OD=1392M*/
> > + PLL_PARAMS(118, 1), /*DCO=2832M OD=1416M*/
> > + PLL_PARAMS(100, 1), /*DCO=2400M OD=1200M*/
> > + PLL_PARAMS(79, 1), /*DCO=1896M OD=1896M*/
> > + PLL_PARAMS(80, 1), /*DCO=1920M OD=1920M*/
> > + PLL_PARAMS(84, 1), /*DCO=2016M OD=2016M*/
> > + PLL_PARAMS(92, 1), /*DCO=2208M OD=2208M*/
> > + {0, 0},
> > +};
> > +
> > +static struct clk_regmap t7_sys_pll_dco = {
> > + .data = &(struct meson_clk_pll_data){
> > + .en = {
> > + .reg_off = ANACTRL_SYS0PLL_CTRL0,
> > + .shift = 28,
> > + .width = 1,
> > + },
> > + .m = {
> > + .reg_off = ANACTRL_SYS0PLL_CTRL0,
> > + .shift = 0,
> > + .width = 8,
> > + },
> > + .n = {
> > + .reg_off = ANACTRL_SYS0PLL_CTRL0,
> > + .shift = 16,
> > + .width = 5,
> > + },
> > + .l = {
> > + .reg_off = ANACTRL_SYS0PLL_CTRL0,
> > + .shift = 31,
> > + .width = 1,
> > + },
> > + .rst = {
> > + .reg_off = ANACTRL_SYS0PLL_CTRL0,
> > + .shift = 29,
> > + .width = 1,
> > + },
> > + .table = t7_sys_pll_params_table,
> > + },
> > + .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 t7_sys1_pll_dco = {
> > + .data = &(struct meson_clk_pll_data){
> > + .en = {
> > + .reg_off = ANACTRL_SYS1PLL_CTRL0,
> > + .shift = 28,
> > + .width = 1,
> > + },
> > + .m = {
> > + .reg_off = ANACTRL_SYS1PLL_CTRL0,
> > + .shift = 0,
> > + .width = 8,
> > + },
> > + .n = {
> > + .reg_off = ANACTRL_SYS1PLL_CTRL0,
> > + .shift = 16,
> > + .width = 5,
> > + },
> > + .table = t7_sys_pll_params_table,
> > + .l = {
> > + .reg_off = ANACTRL_SYS1PLL_CTRL0,
> > + .shift = 31,
> > + .width = 1,
> > + },
> > + .rst = {
> > + .reg_off = ANACTRL_SYS1PLL_CTRL0,
> > + .shift = 29,
> > + .width = 1,
> > + },
> > + },
> > + .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 t7_sys_pll = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = ANACTRL_SYS0PLL_CTRL0,
> > + .shift = 12,
> > + .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 *[]) {
> > + &t7_sys_pll_dco.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_sys1_pll = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = ANACTRL_SYS1PLL_CTRL0,
> > + .shift = 12,
> > + .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 *[]) {
> > + &t7_sys1_pll_dco.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_fixed_factor t7_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 *[]) { &t7_fixed_pll.hw },
> > + .num_parents = 1,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_fclk_div2 = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = ANACTRL_FIXPLL_CTRL1,
> > + .bit_idx = 24,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "fclk_div2",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_fclk_div2_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_IS_CRITICAL,
> > + },
> > +};
> > +
> > +static struct clk_fixed_factor t7_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 *[]) { &t7_fixed_pll.hw },
> > + .num_parents = 1,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_fclk_div3 = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = ANACTRL_FIXPLL_CTRL1,
> > + .bit_idx = 20,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "fclk_div3",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_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,
> > + },
> > +};
> > +
> > +static struct clk_fixed_factor t7_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 *[]) { &t7_fixed_pll.hw },
> > + .num_parents = 1,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_fclk_div4 = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = ANACTRL_FIXPLL_CTRL1,
> > + .bit_idx = 21,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "fclk_div4",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_fclk_div4_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_IS_CRITICAL,
> > + },
> > +};
> > +
> > +static struct clk_fixed_factor t7_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 *[]) { &t7_fixed_pll.hw },
> > + .num_parents = 1,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_fclk_div5 = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = ANACTRL_FIXPLL_CTRL1,
> > + .bit_idx = 22,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "fclk_div5",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_fclk_div5_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_IS_CRITICAL,
> > + },
> > +};
> > +
> > +static struct clk_fixed_factor t7_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 *[]) { &t7_fixed_pll.hw },
> > + .num_parents = 1,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_fclk_div7 = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = ANACTRL_FIXPLL_CTRL1,
> > + .bit_idx = 23,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "fclk_div7",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_fclk_div7_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_IS_CRITICAL,
> > + },
> > +};
> > +
> > +static struct clk_fixed_factor t7_fclk_div2p5_div = {
> > + .mult = 2,
> > + .div = 5,
> > + .hw.init = &(struct clk_init_data){
> > + .name = "fclk_div2p5_div",
> > + .ops = &clk_fixed_factor_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_fixed_pll.hw
> > + },
> > + .num_parents = 1,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_fclk_div2p5 = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = ANACTRL_FIXPLL_CTRL1,
> > + .bit_idx = 25,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "fclk_div2p5",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_fclk_div2p5_div.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_IS_CRITICAL,
> > + },
> > +};
> > +
> > +static const struct pll_params_table t7_gp0_pll_table[] = {
> > + PLL_PARAMS(141, 1), /* DCO = 3384M OD = 2 PLL = 846M */
> > + PLL_PARAMS(132, 1), /* DCO = 3168M OD = 2 PLL = 792M */
> > + PLL_PARAMS(248, 1), /* DCO = 5952M OD = 3 PLL = 744M */
> > + PLL_PARAMS(96, 1), /* DCO = 2304M OD = 1 PLL = 1152M */
> > + { /* sentinel */ }
> > +};
> > +
> > +/*
> > + * Internal gp0 pll emulation configuration parameters
> > + */
> > +static const struct reg_sequence t7_gp0_init_regs[] = {
> > + { .reg = ANACTRL_GP0PLL_CTRL1, .def = 0x00000000 },
> > + { .reg = ANACTRL_GP0PLL_CTRL2, .def = 0x00000000 },
> > + { .reg = ANACTRL_GP0PLL_CTRL3, .def = 0x48681c00 },
> > + { .reg = ANACTRL_GP0PLL_CTRL4, .def = 0x88770290 },
> > + { .reg = ANACTRL_GP0PLL_CTRL5, .def = 0x3927200a },
> > + { .reg = ANACTRL_GP0PLL_CTRL6, .def = 0x56540000 }
> > +};
> > +
> > +static struct clk_regmap t7_gp0_pll_dco = {
> > + .data = &(struct meson_clk_pll_data){
> > + .en = {
> > + .reg_off = ANACTRL_GP0PLL_CTRL0,
> > + .shift = 28,
> > + .width = 1,
> > + },
> > + .m = {
> > + .reg_off = ANACTRL_GP0PLL_CTRL0,
> > + .shift = 0,
> > + .width = 8,
> > + },
> > + .n = {
> > + .reg_off = ANACTRL_GP0PLL_CTRL0,
> > + .shift = 10,
> > + .width = 5,
> > + },
> > + .frac = {
> > + .reg_off = ANACTRL_GP0PLL_CTRL1,
> > + .shift = 0,
> > + .width = 19,
> > + },
> > + .l = {
> > + .reg_off = ANACTRL_GP0PLL_CTRL0,
> > + .shift = 31,
> > + .width = 1,
> > + },
> > + .rst = {
> > + .reg_off = ANACTRL_GP0PLL_CTRL0,
> > + .shift = 29,
> > + .width = 1,
> > + },
> > + .table = t7_gp0_pll_table,
> > + .init_regs = t7_gp0_init_regs,
> > + .init_count = ARRAY_SIZE(t7_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,
> > + .flags = CLK_GET_RATE_NOCACHE,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_gp0_pll = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = ANACTRL_GP0PLL_CTRL0,
> > + .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 *[]) {
> > + &t7_gp0_pll_dco.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
> > + },
> > +};
> > +
> > +static const struct pll_params_table t7_gp1_pll_table[] = {
> > + PLL_PARAMS(100, 1), /*DCO=4800M OD=1200M*/
> > + PLL_PARAMS(125, 1), /*DCO=3000M OD=1500M*/
> > + { /* sentinel */ }
> > +};
> > +
> > +static const struct reg_sequence t7_gp1_init_regs[] = {
> > + { .reg = ANACTRL_GP1PLL_CTRL1, .def = 0x1420500f },
> > + { .reg = ANACTRL_GP1PLL_CTRL2, .def = 0x00023001 },
> > + { .reg = ANACTRL_GP1PLL_CTRL3, .def = 0x0, .delay_us = 20 },
> > +};
> > +
> > +static struct clk_regmap t7_gp1_pll_dco = {
> > + .data = &(struct meson_clk_pll_data){
> > + .en = {
> > + .reg_off = ANACTRL_GP1PLL_CTRL0,
> > + .shift = 28,
> > + .width = 1,
> > + },
> > + .m = {
> > + .reg_off = ANACTRL_GP1PLL_CTRL0,
> > + .shift = 0,
> > + .width = 8,
> > + },
> > + .n = {
> > + .reg_off = ANACTRL_GP1PLL_CTRL0,
> > + .shift = 16,
> > + .width = 5,
> > + },
> > + .l = {
> > + .reg_off = ANACTRL_GP1PLL_CTRL0,
> > + .shift = 31,
> > + .width = 1,
> > + },
> > + .rst = {
> > + .reg_off = ANACTRL_GP1PLL_CTRL0,
> > + .shift = 29,
> > + .width = 1,
> > + },
> > + .table = t7_gp1_pll_table,
> > + .init_regs = t7_gp1_init_regs,
> > + .init_count = ARRAY_SIZE(t7_gp1_init_regs)
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "gp1_pll_dco",
> > + .ops = &meson_clk_pll_ops,
> > + .parent_data = &(const struct clk_parent_data) {
> > + .fw_name = "xtal",
> > + },
> > + .num_parents = 1,
> > + /* This clock feeds the DSU, avoid disabling it */
> > + .flags = CLK_GET_RATE_NOCACHE,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_gp1_pll = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = ANACTRL_GP1PLL_CTRL0,
> > + .shift = 12,
> > + .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_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_gp1_pll_dco.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static const struct pll_params_table t7_mclk_pll_table[] = {
> > + PLL_PARAMS(99, 1), /* DCO = 2376M OD = 1 PLL = 1152M */
> > + PLL_PARAMS(100, 1), /* DCO = 2400M */
> > + { /* sentinel */ }
> > +};
> > +
> > +static const struct reg_sequence t7_mclk_init_regs[] = {
> > + { .reg = ANACTRL_MCLK_PLL_CNTL0, .def = 0x20011064, .delay_us = 20 },
> > + { .reg = ANACTRL_MCLK_PLL_CNTL0, .def = 0x30011064 },
> > + { .reg = ANACTRL_MCLK_PLL_CNTL1, .def = 0x1470500f },
> > + { .reg = ANACTRL_MCLK_PLL_CNTL2, .def = 0x00023041 },
> > + { .reg = ANACTRL_MCLK_PLL_CNTL3, .def = 0x18180000 },
> > + { .reg = ANACTRL_MCLK_PLL_CNTL4, .def = 0x00180303 },
> > + { .reg = ANACTRL_MCLK_PLL_CNTL0, .def = 0x10011064, .delay_us = 20 },
> > + { .reg = ANACTRL_MCLK_PLL_CNTL2, .def = 0x00023001, .delay_us = 20 }
> > +};
> > +
> > +static struct clk_regmap t7_mclk_pll_dco = {
> > + .data = &(struct meson_clk_pll_data){
> > + .en = {
> > + .reg_off = ANACTRL_MCLK_PLL_CNTL0,
> > + .shift = 28,
> > + .width = 1,
> > + },
> > + .m = {
> > + .reg_off = ANACTRL_MCLK_PLL_CNTL0,
> > + .shift = 0,
> > + .width = 8,
> > + },
> > + .n = {
> > + .reg_off = ANACTRL_MCLK_PLL_CNTL0,
> > + .shift = 16,
> > + .width = 5,
> > + },
> > + .l = {
> > + .reg_off = ANACTRL_MCLK_PLL_CNTL0,
> > + .shift = 31,
> > + .width = 1,
> > + },
> > + .rst = {
> > + .reg_off = ANACTRL_MCLK_PLL_CNTL0,
> > + .shift = 29,
> > + .width = 1,
> > + },
> > + .table = t7_mclk_pll_table,
> > + .init_regs = t7_mclk_init_regs,
> > + .init_count = ARRAY_SIZE(t7_mclk_init_regs),
> > + //.ignore_init = false
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "mclk_pll_dco",
> > + .ops = &meson_clk_pll_ops,
> > + .parent_data = &(const struct clk_parent_data) {
> > + .fw_name = "xtal",
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_GET_RATE_NOCACHE | CLK_IGNORE_UNUSED
> > + },
> > +};
> > +
> > +/* max div is 16 */
> > +static const struct clk_div_table mclk_div[] = {
> > + { .val = 0, .div = 1 },
> > + { .val = 1, .div = 2 },
> > + { .val = 2, .div = 4 },
> > + { .val = 3, .div = 8 },
> > + { .val = 4, .div = 16 },
> > + { /* sentinel */ }
> > +};
> > +
> > +static struct clk_regmap t7_mclk_pre_od = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = ANACTRL_MCLK_PLL_CNTL0,
> > + .shift = 12,
> > + .width = 3,
> > + .table = mclk_div,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "mclk_pre_od",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_mclk_pll_dco.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_mclk_pll = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = ANACTRL_MCLK_PLL_CNTL4,
> > + .shift = 16,
> > + .width = 5,
> > + .flags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ROUND_CLOSEST |
> > + CLK_DIVIDER_ALLOW_ZERO,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "mclk_pll",
> > + .ops = &clk_regmap_divider_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_mclk_pre_od.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static const struct pll_params_table t7_hifi_pll_table[] = {
> > + PLL_PARAMS(163, 1), /* DCO = 3932.16M */
> > + { /* sentinel */ }
> > +};
> > +
> > +/*
> > + * Internal hifi pll emulation configuration parameters
> > + */
> > +static const struct reg_sequence t7_hifi_init_regs[] = {
> > + { .reg = ANACTRL_HIFIPLL_CTRL1, .def = 0x00014820 }, /*frac = 20.16M */
> > + { .reg = ANACTRL_HIFIPLL_CTRL2, .def = 0x00000000 },
> > + { .reg = ANACTRL_HIFIPLL_CTRL3, .def = 0x6a285c00 },
> > + { .reg = ANACTRL_HIFIPLL_CTRL4, .def = 0x65771290 },
> > + { .reg = ANACTRL_HIFIPLL_CTRL5, .def = 0x3927200a },
> > + { .reg = ANACTRL_HIFIPLL_CTRL6, .def = 0x56540000 }
> > +};
> > +
> > +static struct clk_regmap t7_hifi_pll_dco = {
> > + .data = &(struct meson_clk_pll_data){
> > + .en = {
> > + .reg_off = ANACTRL_HIFIPLL_CTRL0,
> > + .shift = 28,
> > + .width = 1,
> > + },
> > + .m = {
> > + .reg_off = ANACTRL_HIFIPLL_CTRL0,
> > + .shift = 0,
> > + .width = 8,
> > + },
> > + .n = {
> > + .reg_off = ANACTRL_HIFIPLL_CTRL0,
> > + .shift = 10,
> > + .width = 5,
> > + },
> > + .frac = {
> > + .reg_off = ANACTRL_HIFIPLL_CTRL1,
> > + .shift = 0,
> > + .width = 19,
> > + },
> > + .l = {
> > + .reg_off = ANACTRL_HIFIPLL_CTRL0,
> > + .shift = 31,
> > + .width = 1,
> > + },
> > + .rst = {
> > + .reg_off = ANACTRL_HIFIPLL_CTRL0,
> > + .shift = 29,
> > + .width = 1,
> > + },
> > + .table = t7_hifi_pll_table,
> > + .init_regs = t7_hifi_init_regs,
> > + .init_count = ARRAY_SIZE(t7_hifi_init_regs),
> > + .flags = CLK_MESON_PLL_ROUND_CLOSEST,
> > + //.new_frac = 1,
> > + },
> > + .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 t7_hifi_pll = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = ANACTRL_HIFIPLL_CTRL0,
> > + .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 *[]) {
> > + &t7_hifi_pll_dco.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
> > + },
> > +};
> > +
> > +/*
> > + * The Meson t7 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 t7_pcie_pll_init_regs[] = {
> > + { .reg = ANACTRL_PCIEPLL_CTRL0, .def = 0x200c04c8 },
> > + { .reg = ANACTRL_PCIEPLL_CTRL0, .def = 0x300c04c8 },
> > + { .reg = ANACTRL_PCIEPLL_CTRL1, .def = 0x30000000 },
> > + { .reg = ANACTRL_PCIEPLL_CTRL2, .def = 0x00001100 },
> > + { .reg = ANACTRL_PCIEPLL_CTRL3, .def = 0x10058e00 },
> > + { .reg = ANACTRL_PCIEPLL_CTRL4, .def = 0x000100c0 },
> > + { .reg = ANACTRL_PCIEPLL_CTRL5, .def = 0x68000040 },
> > + { .reg = ANACTRL_PCIEPLL_CTRL5, .def = 0x68000060, .delay_us = 20 },
> > + { .reg = ANACTRL_PCIEPLL_CTRL4, .def = 0x008100c0, .delay_us = 10 },
> > + { .reg = ANACTRL_PCIEPLL_CTRL0, .def = 0x340c04c8 },
> > + { .reg = ANACTRL_PCIEPLL_CTRL0, .def = 0x140c04c8, .delay_us = 10 },
> > + { .reg = ANACTRL_PCIEPLL_CTRL2, .def = 0x00001000 }
> > +};
> > +
> > +/* Keep a single entry table for recalc/round_rate() ops */
> > +static const struct pll_params_table t7_pcie_pll_table[] = {
> > + PLL_PARAMS(150, 1),
> > + {0, 0}
> > +};
> > +
> > +static struct clk_regmap t7_pcie_pll_dco = {
> > + .data = &(struct meson_clk_pll_data){
> > + .en = {
> > + .reg_off = ANACTRL_PCIEPLL_CTRL0,
> > + .shift = 28,
> > + .width = 1,
> > + },
> > + .m = {
> > + .reg_off = ANACTRL_PCIEPLL_CTRL0,
> > + .shift = 0,
> > + .width = 8,
> > + },
> > + .n = {
> > + .reg_off = ANACTRL_PCIEPLL_CTRL0,
> > + .shift = 10,
> > + .width = 5,
> > + },
> > + .frac = {
> > + .reg_off = ANACTRL_PCIEPLL_CTRL1,
> > + .shift = 0,
> > + .width = 12,
> > + },
> > + .l = {
> > + .reg_off = ANACTRL_PCIEPLL_CTRL0,
> > + .shift = 31,
> > + .width = 1,
> > + },
> > + .rst = {
> > + .reg_off = ANACTRL_PCIEPLL_CTRL0,
> > + .shift = 29,
> > + .width = 1,
> > + },
> > + .table = t7_pcie_pll_table,
> > + .init_regs = t7_pcie_pll_init_regs,
> > + .init_count = ARRAY_SIZE(t7_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 t7_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 *[]) {
> > + &t7_pcie_pll_dco.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_pcie_pll_od = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = ANACTRL_PCIEPLL_CTRL0,
> > + .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 *[]) {
> > + &t7_pcie_pll_dco_div2.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
> > + },
> > +};
> > +
> > +static struct clk_fixed_factor t7_pcie_pll = {
> > + .mult = 1,
> > + .div = 2,
> > + .hw.init = &(struct clk_init_data){
> > + .name = "pcie_pll",
> > + .ops = &clk_fixed_factor_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_pcie_pll_od.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_pcie_bgp = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = ANACTRL_PCIEPLL_CTRL5,
> > + .bit_idx = 27,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "pcie_bgp",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) { &t7_pcie_pll.hw },
> > + .num_parents = 1,
> > + .flags = CLK_IGNORE_UNUSED,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_pcie_hcsl = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = ANACTRL_PCIEPLL_CTRL5,
> > + .bit_idx = 3,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "pcie_hcsl",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) { &t7_pcie_bgp.hw },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_hdmi_pll_dco = {
> > + .data = &(struct meson_clk_pll_data){
> > + .en = {
> > + .reg_off = ANACTRL_HDMIPLL_CTRL0,
> > + .shift = 28,
> > + .width = 1,
> > + },
> > + .m = {
> > + .reg_off = ANACTRL_HDMIPLL_CTRL0,
> > + .shift = 0,
> > + .width = 8,
> > + },
> > + .n = {
> > + .reg_off = ANACTRL_HDMIPLL_CTRL0,
> > + .shift = 10,
> > + .width = 5,
> > + },
> > + .frac = {
> > + .reg_off = ANACTRL_HDMIPLL_CTRL1,
> > + .shift = 0,
> > + .width = 19,
> > + },
> > + .l = {
> > + .reg_off = ANACTRL_HDMIPLL_CTRL0,
> > + .shift = 31,
> > + .width = 1,
> > + },
> > + .rst = {
> > + .reg_off = ANACTRL_HDMIPLL_CTRL0,
> > + .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 t7_hdmi_pll_od = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = ANACTRL_HDMIPLL_CTRL0,
> > + .shift = 16,
> > + .width = 4,
> > + .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 *[]) {
> > + &t7_hdmi_pll_dco.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_hdmi_pll = {
> > + .data = &(struct clk_regmap_div_data){
> > + .offset = ANACTRL_HDMIPLL_CTRL0,
> > + .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 *[]) {
> > + &t7_hdmi_pll_od.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_fixed_factor t7_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 *[]) {
> > + &t7_fixed_pll_dco.hw
> > + },
> > + .num_parents = 1,
> > + },
> > +};
> > +
> > +static const struct clk_parent_data t7_mpll_50m_sel[] = {
> > + { .fw_name = "xtal", },
> > + { .hw = &t7_mpll_50m_div.hw },
> > +};
> > +
> > +static struct clk_regmap t7_mpll_50m = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = ANACTRL_FIXPLL_CTRL3,
> > + .mask = 0x1,
> > + .shift = 5,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "mpll_50m",
> > + .ops = &clk_regmap_mux_ro_ops,
> > + .parent_data = t7_mpll_50m_sel,
> > + .num_parents = ARRAY_SIZE(t7_mpll_50m_sel),
> > + },
> > +};
> > +
> > +static struct clk_fixed_factor t7_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 *[]) {
> > + &t7_fixed_pll_dco.hw
> > + },
> > + .num_parents = 1,
> > + },
> > +};
> > +
> > +static const struct reg_sequence t7_mpll0_init_regs[] = {
> > + { .reg = ANACTRL_MPLL_CTRL2, .def = 0x40000033 }
> > +};
> > +
> > +static struct clk_regmap t7_mpll0_div = {
> > + .data = &(struct meson_clk_mpll_data){
> > + .sdm = {
> > + .reg_off = ANACTRL_MPLL_CTRL1,
> > + .shift = 0,
> > + .width = 14,
> > + },
> > + .sdm_en = {
> > + .reg_off = ANACTRL_MPLL_CTRL1,
> > + .shift = 30,
> > + .width = 1,
> > + },
> > + .n2 = {
> > + .reg_off = ANACTRL_MPLL_CTRL1,
> > + .shift = 20,
> > + .width = 9,
> > + },
> > + .ssen = {
> > + .reg_off = ANACTRL_MPLL_CTRL1,
> > + .shift = 29,
> > + .width = 1,
> > + },
> > + .lock = &meson_clk_lock,
> > + .init_regs = t7_mpll0_init_regs,
> > + .init_count = ARRAY_SIZE(t7_mpll0_init_regs),
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "mpll0_div",
> > + .ops = &meson_clk_mpll_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_mpll_prediv.hw
> > + },
> > + .num_parents = 1,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_mpll0 = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = ANACTRL_MPLL_CTRL1,
> > + .bit_idx = 31,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "mpll0",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) { &t7_mpll0_div.hw },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static const struct reg_sequence t7_mpll1_init_regs[] = {
> > + { .reg = ANACTRL_MPLL_CTRL4, .def = 0x40000033 }
> > +};
> > +
> > +static struct clk_regmap t7_mpll1_div = {
> > + .data = &(struct meson_clk_mpll_data){
> > + .sdm = {
> > + .reg_off = ANACTRL_MPLL_CTRL3,
> > + .shift = 0,
> > + .width = 14,
> > + },
> > + .sdm_en = {
> > + .reg_off = ANACTRL_MPLL_CTRL3,
> > + .shift = 30,
> > + .width = 1,
> > + },
> > + .n2 = {
> > + .reg_off = ANACTRL_MPLL_CTRL3,
> > + .shift = 20,
> > + .width = 9,
> > + },
> > + .ssen = {
> > + .reg_off = ANACTRL_MPLL_CTRL3,
> > + .shift = 29,
> > + .width = 1,
> > + },
> > + .lock = &meson_clk_lock,
> > + .init_regs = t7_mpll1_init_regs,
> > + .init_count = ARRAY_SIZE(t7_mpll1_init_regs),
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "mpll1_div",
> > + .ops = &meson_clk_mpll_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_mpll_prediv.hw
> > + },
> > + .num_parents = 1,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_mpll1 = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = ANACTRL_MPLL_CTRL3,
> > + .bit_idx = 31,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "mpll1",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) { &t7_mpll1_div.hw },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static const struct reg_sequence t7_mpll2_init_regs[] = {
> > + { .reg = ANACTRL_MPLL_CTRL6, .def = 0x40000033 }
> > +};
> > +
> > +static struct clk_regmap t7_mpll2_div = {
> > + .data = &(struct meson_clk_mpll_data){
> > + .sdm = {
> > + .reg_off = ANACTRL_MPLL_CTRL5,
> > + .shift = 0,
> > + .width = 14,
> > + },
> > + .sdm_en = {
> > + .reg_off = ANACTRL_MPLL_CTRL5,
> > + .shift = 30,
> > + .width = 1,
> > + },
> > + .n2 = {
> > + .reg_off = ANACTRL_MPLL_CTRL5,
> > + .shift = 20,
> > + .width = 9,
> > + },
> > + .ssen = {
> > + .reg_off = ANACTRL_MPLL_CTRL5,
> > + .shift = 29,
> > + .width = 1,
> > + },
> > + .lock = &meson_clk_lock,
> > + .init_regs = t7_mpll2_init_regs,
> > + .init_count = ARRAY_SIZE(t7_mpll2_init_regs),
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "mpll2_div",
> > + .ops = &meson_clk_mpll_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_mpll_prediv.hw
> > + },
> > + .num_parents = 1,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_mpll2 = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = ANACTRL_MPLL_CTRL5,
> > + .bit_idx = 31,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "mpll2",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) { &t7_mpll2_div.hw },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static const struct reg_sequence t7_mpll3_init_regs[] = {
> > + { .reg = ANACTRL_MPLL_CTRL8, .def = 0x40000033 }
> > +};
> > +
> > +static struct clk_regmap t7_mpll3_div = {
> > + .data = &(struct meson_clk_mpll_data){
> > + .sdm = {
> > + .reg_off = ANACTRL_MPLL_CTRL7,
> > + .shift = 0,
> > + .width = 14,
> > + },
> > + .sdm_en = {
> > + .reg_off = ANACTRL_MPLL_CTRL7,
> > + .shift = 30,
> > + .width = 1,
> > + },
> > + .n2 = {
> > + .reg_off = ANACTRL_MPLL_CTRL7,
> > + .shift = 20,
> > + .width = 9,
> > + },
> > + .ssen = {
> > + .reg_off = ANACTRL_MPLL_CTRL7,
> > + .shift = 29,
> > + .width = 1,
> > + },
> > + .lock = &meson_clk_lock,
> > + .init_regs = t7_mpll3_init_regs,
> > + .init_count = ARRAY_SIZE(t7_mpll3_init_regs),
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "mpll3_div",
> > + .ops = &meson_clk_mpll_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_mpll_prediv.hw
> > + },
> > + .num_parents = 1,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_mpll3 = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = ANACTRL_MPLL_CTRL7,
> > + .bit_idx = 31,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "mpll3",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) { &t7_mpll3_div.hw },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_mclk_0_sel = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = ANACTRL_MCLK_PLL_CNTL4,
> > + .mask = 0x3,
> > + .shift = 4,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "mclk_0_sel",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = (const struct clk_parent_data []) {
> > + { .hw = &t7_mclk_pll.hw },
> > + { .fw_name = "xtal", },
> > + { .hw = &t7_mpll_50m.hw },
> > + },
> > + .num_parents = 3,
> > + },
> > +};
> > +
> > +static struct clk_fixed_factor t7_mclk_0_div2 = {
> > + .mult = 1,
> > + .div = 2,
> > + .hw.init = &(struct clk_init_data){
> > + .name = "mclk_0_div2",
> > + .ops = &clk_fixed_factor_ops,
> > + .parent_hws = (const struct clk_hw *[]) { &t7_mclk_0_sel.hw },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_mclk_0_pre = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = ANACTRL_MCLK_PLL_CNTL4,
> > + .bit_idx = 2,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "mclk_0_pre",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_mclk_0_div2.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_mclk_0 = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = ANACTRL_MCLK_PLL_CNTL4,
> > + .bit_idx = 0,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "mclk_0",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_mclk_0_pre.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_mclk_1_sel = {
> > + .data = &(struct clk_regmap_mux_data){
> > + .offset = ANACTRL_MCLK_PLL_CNTL4,
> > + .mask = 0x3,
> > + .shift = 12,
> > + },
> > + .hw.init = &(struct clk_init_data){
> > + .name = "mclk_1_sel",
> > + .ops = &clk_regmap_mux_ops,
> > + .parent_data = (const struct clk_parent_data []) {
> > + { .hw = &t7_mclk_pll.hw },
> > + { .fw_name = "xtal", },
> > + { .hw = &t7_mpll_50m.hw },
> > + },
> > + .num_parents = 3,
> > + },
> > +};
> > +
> > +static struct clk_fixed_factor t7_mclk_1_div2 = {
> > + .mult = 1,
> > + .div = 2,
> > + .hw.init = &(struct clk_init_data){
> > + .name = "mclk_1_div2",
> > + .ops = &clk_fixed_factor_ops,
> > + .parent_hws = (const struct clk_hw *[]) { &t7_mclk_1_sel.hw },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_mclk_1_pre = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = ANACTRL_MCLK_PLL_CNTL4,
> > + .bit_idx = 10,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "mclk_1_pre",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_mclk_1_div2.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +static struct clk_regmap t7_mclk_1 = {
> > + .data = &(struct clk_regmap_gate_data){
> > + .offset = ANACTRL_MCLK_PLL_CNTL4,
> > + .bit_idx = 8,
> > + },
> > + .hw.init = &(struct clk_init_data) {
> > + .name = "mclk_1",
> > + .ops = &clk_regmap_gate_ops,
> > + .parent_hws = (const struct clk_hw *[]) {
> > + &t7_mclk_1_pre.hw
> > + },
> > + .num_parents = 1,
> > + .flags = CLK_SET_RATE_PARENT,
> > + },
> > +};
> > +
> > +/* Array of all clocks provided by this provider */
> > +static struct clk_hw *t7_pll_hw_clks[] = {
> > + [CLKID_FIXED_PLL_DCO] = &t7_fixed_pll_dco.hw,
> > + [CLKID_FIXED_PLL] = &t7_fixed_pll.hw,
> > + [CLKID_SYS_PLL_DCO] = &t7_sys_pll_dco.hw,
> > + [CLKID_SYS_PLL] = &t7_sys_pll.hw,
> > + [CLKID_SYS1_PLL_DCO] = &t7_sys1_pll_dco.hw,
> > + [CLKID_SYS1_PLL] = &t7_sys1_pll.hw,
> > + [CLKID_FCLK_DIV2_DIV] = &t7_fclk_div2_div.hw,
> > + [CLKID_FCLK_DIV2] = &t7_fclk_div2.hw,
> > + [CLKID_FCLK_DIV3_DIV] = &t7_fclk_div3_div.hw,
> > + [CLKID_FCLK_DIV3] = &t7_fclk_div3.hw,
> > + [CLKID_FCLK_DIV4_DIV] = &t7_fclk_div4_div.hw,
> > + [CLKID_FCLK_DIV4] = &t7_fclk_div4.hw,
> > + [CLKID_FCLK_DIV5_DIV] = &t7_fclk_div5_div.hw,
> > + [CLKID_FCLK_DIV5] = &t7_fclk_div5.hw,
> > + [CLKID_FCLK_DIV7_DIV] = &t7_fclk_div7_div.hw,
> > + [CLKID_FCLK_DIV7] = &t7_fclk_div7.hw,
> > + [CLKID_FCLK_DIV2P5_DIV] = &t7_fclk_div2p5_div.hw,
> > + [CLKID_FCLK_DIV2P5] = &t7_fclk_div2p5.hw,
> > + [CLKID_GP0_PLL_DCO] = &t7_gp0_pll_dco.hw,
> > + [CLKID_GP0_PLL] = &t7_gp0_pll.hw,
> > + [CLKID_GP1_PLL_DCO] = &t7_gp1_pll_dco.hw,
> > + [CLKID_GP1_PLL] = &t7_gp1_pll.hw,
> > + [CLKID_MCLK_PLL_DCO] = &t7_mclk_pll_dco.hw,
> > + [CLKID_MCLK_PRE] = &t7_mclk_pre_od.hw,
> > + [CLKID_MCLK_PLL] = &t7_mclk_pll.hw,
> > + [CLKID_HIFI_PLL_DCO] = &t7_hifi_pll_dco.hw,
> > + [CLKID_HIFI_PLL] = &t7_hifi_pll.hw,
> > + [CLKID_PCIE_PLL_DCO] = &t7_pcie_pll_dco.hw,
> > + [CLKID_PCIE_PLL_DCO_DIV2] = &t7_pcie_pll_dco_div2.hw,
> > + [CLKID_PCIE_PLL_OD] = &t7_pcie_pll_od.hw,
> > + [CLKID_PCIE_PLL] = &t7_pcie_pll.hw,
> > + [CLKID_PCIE_BGP] = &t7_pcie_bgp.hw,
> > + [CLKID_PCIE_HCSL] = &t7_pcie_hcsl.hw,
> > + [CLKID_HDMI_PLL_DCO] = &t7_hdmi_pll_dco.hw,
> > + [CLKID_HDMI_PLL_OD] = &t7_hdmi_pll_od.hw,
> > + [CLKID_HDMI_PLL] = &t7_hdmi_pll.hw,
> > + [CLKID_MPLL_50M_DIV] = &t7_mpll_50m_div.hw,
> > + [CLKID_MPLL_50M] = &t7_mpll_50m.hw,
> > + [CLKID_MPLL_PREDIV] = &t7_mpll_prediv.hw,
> > + [CLKID_MPLL0_DIV] = &t7_mpll0_div.hw,
> > + [CLKID_MPLL0] = &t7_mpll0.hw,
> > + [CLKID_MPLL1_DIV] = &t7_mpll1_div.hw,
> > + [CLKID_MPLL1] = &t7_mpll1.hw,
> > + [CLKID_MPLL2_DIV] = &t7_mpll2_div.hw,
> > + [CLKID_MPLL2] = &t7_mpll2.hw,
> > + [CLKID_MPLL3_DIV] = &t7_mpll3_div.hw,
> > + [CLKID_MPLL3] = &t7_mpll3.hw,
> > + [CLKID_MCLK_0_SEL] = &t7_mclk_0_sel.hw,
> > + [CLKID_MCLK_0_DIV2] = &t7_mclk_0_div2.hw,
> > + [CLKID_MCLK_0_PRE] = &t7_mclk_0_pre.hw,
> > + [CLKID_MCLK_0] = &t7_mclk_0.hw,
> > + [CLKID_MCLK_1_SEL] = &t7_mclk_1_sel.hw,
> > + [CLKID_MCLK_1_DIV2] = &t7_mclk_1_div2.hw,
> > + [CLKID_MCLK_1_PRE] = &t7_mclk_1_pre.hw,
> > + [CLKID_MCLK_1] = &t7_mclk_1.hw,
> > +};
> > +
> > +static struct clk_regmap *const t7_pll_clk_regmaps[] = {
> > + &t7_fixed_pll_dco,
> > + &t7_fixed_pll,
> > + &t7_sys_pll_dco,
> > + &t7_sys_pll,
> > + &t7_sys1_pll_dco,
> > + &t7_sys1_pll,
> > + &t7_fclk_div2,
> > + &t7_fclk_div3,
> > + &t7_fclk_div4,
> > + &t7_fclk_div5,
> > + &t7_fclk_div7,
> > + &t7_fclk_div2p5,
> > + &t7_gp0_pll_dco,
> > + &t7_gp0_pll,
> > + &t7_gp1_pll_dco,
> > + &t7_gp1_pll,
> > + &t7_mclk_pll_dco,
> > + &t7_mclk_pre_od,
> > + &t7_mclk_pll,
> > + &t7_hifi_pll_dco,
> > + &t7_hifi_pll,
> > + &t7_pcie_pll_dco,
> > + &t7_pcie_pll_od,
> > + &t7_pcie_bgp,
> > + &t7_pcie_hcsl,
> > + &t7_hdmi_pll_dco,
> > + &t7_hdmi_pll_od,
> > + &t7_hdmi_pll,
> > + &t7_mpll_50m,
> > + &t7_mpll0_div,
> > + &t7_mpll0,
> > + &t7_mpll1_div,
> > + &t7_mpll1,
> > + &t7_mpll2_div,
> > + &t7_mpll2,
> > + &t7_mpll3_div,
> > + &t7_mpll3,
> > + &t7_mclk_0_sel,
> > + &t7_mclk_0_pre,
> > + &t7_mclk_0,
> > + &t7_mclk_1_sel,
> > + &t7_mclk_1_pre,
> > + &t7_mclk_1
> > +};
> > +
> > +static const struct reg_sequence t7_init_regs[] = {
> > + { .reg = ANACTRL_MPLL_CTRL0, .def = 0x00000543 },
> > +};
> > +
> > +static struct regmap_config clkc_regmap_config = {
> > + .reg_bits = 32,
> > + .val_bits = 32,
> > + .reg_stride = 4,
> > +};
> > +
> > +static struct meson_clk_hw_data t7_pll_clks = {
> > + .hws = t7_pll_hw_clks,
> > + .num = ARRAY_SIZE(t7_pll_hw_clks),
> > +};
> > +
> > +static int amlogic_t7_pll_probe(struct platform_device *pdev)
> > +{
> > + struct device *dev = &pdev->dev;
> > + struct regmap *regmap;
> > + void __iomem *base;
> > + int ret, i;
> > +
> > + base = devm_platform_ioremap_resource(pdev, 0);
> > + if (IS_ERR(base))
> > + return dev_err_probe(dev, PTR_ERR(base), "can't ioremap resource\n");
> > +
> > + regmap = devm_regmap_init_mmio(dev, base, &clkc_regmap_config);
> > + if (IS_ERR(regmap))
> > + return dev_err_probe(dev, PTR_ERR(regmap), "can't init regmap mmio region\n");
> > +
> > + ret = regmap_multi_reg_write(regmap, t7_init_regs, ARRAY_SIZE(t7_init_regs));
> > + if (ret)
> > + return dev_err_probe(dev, ret, "Failed to init registers\n");
> > +
> > + for (i = 0; i < ARRAY_SIZE(t7_pll_clk_regmaps); i++)
> > + t7_pll_clk_regmaps[i]->map = regmap;
> > +
> > + /* Register clocks */
> > + for (i = 0; i < t7_pll_clks.num; i++) {
> > + /* array might be sparse */
> > + if (!t7_pll_clks.hws[i])
> > + continue;
> > +
> > + ret = devm_clk_hw_register(dev, t7_pll_clks.hws[i]);
> > + if (ret)
> > + return dev_err_probe(dev, ret, "clock[%d] registration failed\n", i);
> > + }
> > +
> > + return devm_of_clk_add_hw_provider(dev, meson_clk_hw_get, &t7_pll_clks);
> > +}
> > +
> > +static const struct of_device_id t7_pll_clkc_match_table[] = {
> > + { .compatible = "amlogic,t7-pll-clkc", },
> > + {}
> > +};
> > +MODULE_DEVICE_TABLE(of, t7_pll_clkc_match_table);
> > +
> > +static struct platform_driver t7_pll_clkc_driver = {
> > + .probe = amlogic_t7_pll_probe,
> > + .driver = {
> > + .name = "t7-pll-clkc",
> > + .of_match_table = t7_pll_clkc_match_table,
> > + },
> > +};
> > +
> > +module_platform_driver(t7_pll_clkc_driver);
> > +MODULE_AUTHOR("Yu Tu <[email protected]>");
> > +MODULE_AUTHOR("Lucas Tanure <[email protected]>");
> > +MODULE_LICENSE("GPL");
> > diff --git a/drivers/clk/meson/t7-pll.h b/drivers/clk/meson/t7-pll.h
> > new file mode 100644
> > index 000000000000..bb0d66198780
> > --- /dev/null
> > +++ b/drivers/clk/meson/t7-pll.h
> > @@ -0,0 +1,83 @@
> > +/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
> > +/*
> > + * Copyright (c) 2019 Amlogic, Inc. All rights reserved.
> > + */
> > +
> > +#ifndef __MESON_T7_PLL_H__
> > +#define __MESON_T7_PLL_H__
> > +
> > +/* ANA_CTRL - Registers
> > + * REG_BASE: REGISTER_BASE_ADDR = 0xfe008000
> > + */
> > +#define ANACTRL_SYS0PLL_CTRL0 (0x0000 << 2)
> > +#define ANACTRL_SYS0PLL_CTRL1 (0x0001 << 2)
> > +#define ANACTRL_SYS0PLL_CTRL2 (0x0002 << 2)
> > +#define ANACTRL_SYS0PLL_CTRL3 (0x0003 << 2)
> > +#define ANACTRL_SYS0PLL_STS (0x0004 << 2)
> > +#define ANACTRL_SYS1PLL_CTRL0 (0x0008 << 2)
> > +#define ANACTRL_SYS1PLL_CTRL1 (0x0009 << 2)
> > +#define ANACTRL_SYS1PLL_CTRL2 (0x000a << 2)
> > +#define ANACTRL_SYS1PLL_CTRL3 (0x000b << 2)
> > +#define ANACTRL_SYS1PLL_STS (0x000c << 2)
> > +#define ANACTRL_FIXPLL_CTRL0 (0x0010 << 2)
> > +#define ANACTRL_FIXPLL_CTRL1 (0x0011 << 2)
> > +#define ANACTRL_FIXPLL_CTRL2 (0x0012 << 2)
> > +#define ANACTRL_FIXPLL_CTRL3 (0x0013 << 2)
> > +#define ANACTRL_FIXPLL_CTRL4 (0x0014 << 2)
> > +#define ANACTRL_FIXPLL_CTRL5 (0x0015 << 2)
> > +#define ANACTRL_FIXPLL_CTRL6 (0x0016 << 2)
> > +#define ANACTRL_FIXPLL_STS (0x0017 << 2)
> > +#define ANACTRL_GP0PLL_CTRL0 (0x0020 << 2)
> > +#define ANACTRL_GP0PLL_CTRL1 (0x0021 << 2)
> > +#define ANACTRL_GP0PLL_CTRL2 (0x0022 << 2)
> > +#define ANACTRL_GP0PLL_CTRL3 (0x0023 << 2)
> > +#define ANACTRL_GP0PLL_CTRL4 (0x0024 << 2)
> > +#define ANACTRL_GP0PLL_CTRL5 (0x0025 << 2)
> > +#define ANACTRL_GP0PLL_CTRL6 (0x0026 << 2)
> > +#define ANACTRL_GP0PLL_STS (0x0027 << 2)
> > +#define ANACTRL_GP1PLL_CTRL0 (0x0030 << 2)
> > +#define ANACTRL_GP1PLL_CTRL1 (0x0031 << 2)
> > +#define ANACTRL_GP1PLL_CTRL2 (0x0032 << 2)
> > +#define ANACTRL_GP1PLL_CTRL3 (0x0033 << 2)
> > +#define ANACTRL_GP1PLL_STS (0x0037 << 2)
> > +#define ANACTRL_HIFIPLL_CTRL0 (0x0040 << 2)
> > +#define ANACTRL_HIFIPLL_CTRL1 (0x0041 << 2)
> > +#define ANACTRL_HIFIPLL_CTRL2 (0x0042 << 2)
> > +#define ANACTRL_HIFIPLL_CTRL3 (0x0043 << 2)
> > +#define ANACTRL_HIFIPLL_CTRL4 (0x0044 << 2)
> > +#define ANACTRL_HIFIPLL_CTRL5 (0x0045 << 2)
> > +#define ANACTRL_HIFIPLL_CTRL6 (0x0046 << 2)
> > +#define ANACTRL_HIFIPLL_STS (0x0047 << 2)
> > +#define ANACTRL_PCIEPLL_CTRL0 (0x0050 << 2)
> > +#define ANACTRL_PCIEPLL_CTRL1 (0x0051 << 2)
> > +#define ANACTRL_PCIEPLL_CTRL2 (0x0052 << 2)
> > +#define ANACTRL_PCIEPLL_CTRL3 (0x0053 << 2)
> > +#define ANACTRL_PCIEPLL_CTRL4 (0x0054 << 2)
> > +#define ANACTRL_PCIEPLL_CTRL5 (0x0055 << 2)
> > +#define ANACTRL_PCIEPLL_STS (0x0056 << 2)
> > +#define ANACTRL_MPLL_CTRL0 (0x0060 << 2)
> > +#define ANACTRL_MPLL_CTRL1 (0x0061 << 2)
> > +#define ANACTRL_MPLL_CTRL2 (0x0062 << 2)
> > +#define ANACTRL_MPLL_CTRL3 (0x0063 << 2)
> > +#define ANACTRL_MPLL_CTRL4 (0x0064 << 2)
> > +#define ANACTRL_MPLL_CTRL5 (0x0065 << 2)
> > +#define ANACTRL_MPLL_CTRL6 (0x0066 << 2)
> > +#define ANACTRL_MPLL_CTRL7 (0x0067 << 2)
> > +#define ANACTRL_MPLL_CTRL8 (0x0068 << 2)
> > +#define ANACTRL_MPLL_STS (0x0069 << 2)
> > +#define ANACTRL_HDMIPLL_CTRL0 (0x0070 << 2)
> > +#define ANACTRL_HDMIPLL_CTRL1 (0x0071 << 2)
> > +#define ANACTRL_HDMIPLL_CTRL2 (0x0072 << 2)
> > +#define ANACTRL_HDMIPLL_CTRL3 (0x0073 << 2)
> > +#define ANACTRL_HDMIPLL_CTRL4 (0x0074 << 2)
> > +#define ANACTRL_HDMIPLL_CTRL5 (0x0075 << 2)
> > +#define ANACTRL_HDMIPLL_CTRL6 (0x0076 << 2)
> > +#define ANACTRL_HDMIPLL_STS (0x0077 << 2)
> > +#define ANACTRL_MCLK_PLL_CNTL0 (0x00c0 << 2)
> > +#define ANACTRL_MCLK_PLL_CNTL1 (0x00c1 << 2)
> > +#define ANACTRL_MCLK_PLL_CNTL2 (0x00c2 << 2)
> > +#define ANACTRL_MCLK_PLL_CNTL3 (0x00c3 << 2)
> > +#define ANACTRL_MCLK_PLL_CNTL4 (0x00c4 << 2)
> > +#define ANACTRL_MCLK_PLL_STS (0x00c5 << 2)
> > +
> > +#endif /* __MESON_T7_PLL_H__ */
> > diff --git a/include/dt-bindings/clock/amlogic,t7-peripherals-clkc.h b/include/dt-bindings/clock/amlogic,t7-peripherals-clkc.h
> > new file mode 100644
> > index 000000000000..64731385c64b
> > --- /dev/null
> > +++ b/include/dt-bindings/clock/amlogic,t7-peripherals-clkc.h
> > @@ -0,0 +1,410 @@
> > +/* SPDX-License-Identifier: (GPL-2.0-only OR MIT) */
> > +/*
> > + * Copyright (c) 2022-2023 Amlogic, Inc. All rights reserved.
> > + * Author: Yu Tu <[email protected]>
> > + */
> > +
> > +#ifndef _DT_BINDINGS_CLOCK_AMLOGIC_T7_PERIPHERALS_CLKC_H
> > +#define _DT_BINDINGS_CLOCK_AMLOGIC_T7_PERIPHERALS_CLKC_H
> > +
> > +#define CLKID_RTC_32K_CLKIN 0
> > +#define CLKID_RTC_32K_DIV 1
> > +#define CLKID_RTC_32K_XATL 2
> > +#define CLKID_RTC_32K_MUX 3
> > +#define CLKID_RTC_CLK 4
> > +#define CLKID_SYS_CLK_B_MUX 5
> > +#define CLKID_SYS_CLK_B_DIV 6
> > +#define CLKID_SYS_CLK_B_GATE 7
> > +#define CLKID_SYS_CLK_A_MUX 8
> > +#define CLKID_SYS_CLK_A_DIV 9
> > +#define CLKID_SYS_CLK_A_GATE 10
> > +#define CLKID_SYS_CLK 11
> > +#define CLKID_CECA_32K_CLKIN 12
> > +#define CLKID_CECA_32K_DIV 13
> > +#define CLKID_CECA_32K_MUX_PRE 14
> > +#define CLKID_CECA_32K_MUX 15
> > +#define CLKID_CECA_32K_CLKOUT 16
> > +#define CLKID_CECB_32K_CLKIN 17
> > +#define CLKID_CECB_32K_DIV 18
> > +#define CLKID_CECB_32K_MUX_PRE 19
> > +#define CLKID_CECB_32K_MUX 20
> > +#define CLKID_CECB_32K_CLKOUT 21
> > +#define CLKID_SC_CLK_MUX 22
> > +#define CLKID_SC_CLK_DIV 23
> > +#define CLKID_SC_CLK_GATE 24
> > +#define CLKID_DSPA_CLK_B_MUX 25
> > +#define CLKID_DSPA_CLK_B_DIV 26
> > +#define CLKID_DSPA_CLK_B_GATE 27
> > +#define CLKID_DSPA_CLK_A_MUX 28
> > +#define CLKID_DSPA_CLK_A_DIV 29
> > +#define CLKID_DSPA_CLK_A_GATE 30
> > +#define CLKID_DSPA_CLK 31
> > +#define CLKID_24M_CLK_GATE 32
> > +#define CLKID_12M_CLK_DIV 33
> > +#define CLKID_12M_CLK_GATE 34
> > +#define CLKID_25M_CLK_DIV 35
> > +#define CLKID_25M_CLK_GATE 36
> > +#define CLKID_VID_PLL_DIV 37
> > +#define CLKID_VID_PLL_MUX 38
> > +#define CLKID_VID_PLL 39
> > +#define CLKID_VCLK_MUX 40
> > +#define CLKID_VCLK2_MUX 41
> > +#define CLKID_VCLK_INPUT 42
> > +#define CLKID_VCLK2_INPUT 43
> > +#define CLKID_VCLK_DIV 44
> > +#define CLKID_VCLK2_DIV 45
> > +#define CLKID_VCLK 46
> > +#define CLKID_VCLK2 47
> > +#define CLKID_VCLK_DIV1 48
> > +#define CLKID_VCLK_DIV2_EN 49
> > +#define CLKID_VCLK_DIV4_EN 50
> > +#define CLKID_VCLK_DIV6_EN 51
> > +#define CLKID_VCLK_DIV12_EN 52
> > +#define CLKID_VCLK2_DIV1 53
> > +#define CLKID_VCLK2_DIV2_EN 54
> > +#define CLKID_VCLK2_DIV4_EN 55
> > +#define CLKID_VCLK2_DIV6_EN 56
> > +#define CLKID_VCLK2_DIV12_EN 57
> > +#define CLKID_VCLK_DIV2 58
> > +#define CLKID_VCLK_DIV4 59
> > +#define CLKID_VCLK_DIV6 60
> > +#define CLKID_VCLK_DIV12 61
> > +#define CLKID_VCLK2_DIV2 62
> > +#define CLKID_VCLK2_DIV4 63
> > +#define CLKID_VCLK2_DIV6 64
> > +#define CLKID_VCLK2_DIV12 65
> > +#define CLKID_CTS_ENCI_MUX 66
> > +#define CLKID_CTS_ENCP_MUX 67
> > +#define CLKID_CTS_VDAC_MUX 68
> > +#define CLKID_HDMI_TX_MUX 69
> > +#define CLKID_CTS_ENCI 70
> > +#define CLKID_CTS_ENCP 71
> > +#define CLKID_CTS_VDAC 72
> > +#define CLKID_HDMI_TX 73
> > +#define CLKID_HDMITX_SYS_MUX 74
> > +#define CLKID_HDMITX_SYS_DIV 75
> > +#define CLKID_HDMITX_SYS 76
> > +#define CLKID_TS_CLK_DIV 77
> > +#define CLKID_TS_CLK_GATE 78
> > +#define CLKID_MALI_0_SEL 79
> > +#define CLKID_MALI_0_DIV 80
> > +#define CLKID_MALI_0 81
> > +#define CLKID_MALI_1_SEL 82
> > +#define CLKID_MALI_1_DIV 83
> > +#define CLKID_MALI_1 84
> > +#define CLKID_MALI_MUX 85
> > +#define CLKID_VDEC_P0_MUX 86
> > +#define CLKID_VDEC_P0_DIV 87
> > +#define CLKID_VDEC_P0 88
> > +#define CLKID_VDEC_P1_MUX 89
> > +#define CLKID_VDEC_P1_DIV 90
> > +#define CLKID_VDEC_P1 91
> > +#define CLKID_VDEC_MUX 92
> > +#define CLKID_HCODEC_P0_MUX 93
> > +#define CLKID_HCODEC_P0_DIV 94
> > +#define CLKID_HCODEC_P0 95
> > +#define CLKID_HCODEC_P1_MUX 96
> > +#define CLKID_HCODEC_P1_DIV 97
> > +#define CLKID_HCODEC_P1 98
> > +#define CLKID_HCODEC_MUX 99
> > +#define CLKID_HEVCB_P0_MUX 100
> > +#define CLKID_HEVCB_P0_DIV 101
> > +#define CLKID_HEVCB_P0 102
> > +#define CLKID_HEVCB_P1_MUX 103
> > +#define CLKID_HEVCB_P1_DIV 104
> > +#define CLKID_HEVCB_P1 105
> > +#define CLKID_HEVCB_MUX 106
> > +#define CLKID_HEVCF_P0_MUX 107
> > +#define CLKID_HEVCF_P0_DIV 108
> > +#define CLKID_HEVCF_P0 109
> > +#define CLKID_HEVCF_P1_MUX 110
> > +#define CLKID_HEVCF_P1_DIV 111
> > +#define CLKID_HEVCF_P1 112
> > +#define CLKID_HEVCF_MUX 113
> > +#define CLKID_WAVE_A_MUX 114
> > +#define CLKID_WAVE_A_DIV 115
> > +#define CLKID_WAVE_A_GATE 116
> > +#define CLKID_WAVE_B_MUX 117
> > +#define CLKID_WAVE_B_DIV 118
> > +#define CLKID_WAVE_B_GATE 119
> > +#define CLKID_WAVE_C_MUX 120
> > +#define CLKID_WAVE_C_DIV 121
> > +#define CLKID_WAVE_C_GATE 122
> > +#define CLKID_VPU_0_MUX 123
> > +#define CLKID_VPU_0_DIV 124
> > +#define CLKID_VPU_0 125
> > +#define CLKID_VPU_1_MUX 126
> > +#define CLKID_VPU_1_DIV 127
> > +#define CLKID_VPU_1 128
> > +#define CLKID_VPU 129
> > +#define CLKID_VPU_CLKB_TMP_MUX 130
> > +#define CLKID_VPU_CLKB_TMP_DIV 131
> > +#define CLKID_VPU_CLKB_TMP 132
> > +#define CLKID_VPU_CLKB_DIV 133
> > +#define CLKID_VPU_CLKB 134
> > +#define CLKID_VPU_CLKC_P0_MUX 135
> > +#define CLKID_VPU_CLKC_P0_DIV 136
> > +#define CLKID_VPU_CLKC_P0 137
> > +#define CLKID_VPU_CLKC_P1_MUX 138
> > +#define CLKID_VPU_CLKC_P1_DIV 139
> > +#define CLKID_VPU_CLKC_P1 140
> > +#define CLKID_VPU_CLKC_MUX 141
> > +#define CLKID_VAPB_0_MUX 142
> > +#define CLKID_VAPB_0_DIV 143
> > +#define CLKID_VAPB_0 144
> > +#define CLKID_VAPB_1_MUX 145
> > +#define CLKID_VAPB_1_DIV 146
> > +#define CLKID_VAPB_1 147
> > +#define CLKID_VAPB 148
> > +#define CLKID_GE2D 149
> > +#define CLKID_VDIN_MEAS_MUX 150
> > +#define CLKID_VDIN_MEAS_DIV 151
> > +#define CLKID_VDIN_MEAS_GATE 152
> > +#define CLKID_DSI_A_MEAS_MUX 153
> > +#define CLKID_DSI_A_MEAS_DIV 154
> > +#define CLKID_DSI_A_MEAS_GATE 155
> > +#define CLKID_DSI_B_MEAS_MUX 156
> > +#define CLKID_DSI_B_MEAS_DIV 157
> > +#define CLKID_DSI_B_MEAS_GATE 158
> > +#define CLKID_DSI0_PHY_MUX 159
> > +#define CLKID_DSI0_PHY_DIV 160
> > +#define CLKID_DSI0_PHY_GATE 161
> > +#define CLKID_DSI1_PHY_MUX 162
> > +#define CLKID_DSI1_PHY_DIV 163
> > +#define CLKID_DSI1_PHY_GATE 164
> > +#define CLKID_VID_LOCK_DIV 165
> > +#define CLKID_VID_LOCK 166
> > +#define CLKID_PWM_A_MUX 167
> > +#define CLKID_PWM_A_DIV 168
> > +#define CLKID_PWM_A_GATE 169
> > +#define CLKID_PWM_B_MUX 170
> > +#define CLKID_PWM_B_DIV 171
> > +#define CLKID_PWM_B_GATE 172
> > +#define CLKID_PWM_C_MUX 173
> > +#define CLKID_PWM_C_DIV 174
> > +#define CLKID_PWM_C_GATE 175
> > +#define CLKID_PWM_D_MUX 176
> > +#define CLKID_PWM_D_DIV 177
> > +#define CLKID_PWM_D_GATE 178
> > +#define CLKID_PWM_E_MUX 179
> > +#define CLKID_PWM_E_DIV 180
> > +#define CLKID_PWM_E_GATE 181
> > +#define CLKID_PWM_F_MUX 182
> > +#define CLKID_PWM_F_DIV 183
> > +#define CLKID_PWM_F_GATE 184
> > +#define CLKID_PWM_AO_A_MUX 185
> > +#define CLKID_PWM_AO_A_DIV 186
> > +#define CLKID_PWM_AO_A_GATE 187
> > +#define CLKID_PWM_AO_B_MUX 188
> > +#define CLKID_PWM_AO_B_DIV 189
> > +#define CLKID_PWM_AO_B_GATE 190
> > +#define CLKID_PWM_AO_C_MUX 191
> > +#define CLKID_PWM_AO_C_DIV 192
> > +#define CLKID_PWM_AO_C_GATE 193
> > +#define CLKID_PWM_AO_D_MUX 194
> > +#define CLKID_PWM_AO_D_DIV 195
> > +#define CLKID_PWM_AO_D_GATE 196
> > +#define CLKID_PWM_AO_E_MUX 197
> > +#define CLKID_PWM_AO_E_DIV 198
> > +#define CLKID_PWM_AO_E_GATE 199
> > +#define CLKID_PWM_AO_F_MUX 200
> > +#define CLKID_PWM_AO_F_DIV 201
> > +#define CLKID_PWM_AO_F_GATE 202
> > +#define CLKID_PWM_AO_G_MUX 203
> > +#define CLKID_PWM_AO_G_DIV 204
> > +#define CLKID_PWM_AO_G_GATE 205
> > +#define CLKID_PWM_AO_H_MUX 206
> > +#define CLKID_PWM_AO_H_DIV 207
> > +#define CLKID_PWM_AO_H_GATE 208
> > +#define CLKID_SPICC0_MUX 209
> > +#define CLKID_SPICC0_DIV 210
> > +#define CLKID_SPICC0_GATE 211
> > +#define CLKID_SPICC1_MUX 212
> > +#define CLKID_SPICC1_DIV 213
> > +#define CLKID_SPICC1_GATE 214
> > +#define CLKID_SPICC2_MUX 215
> > +#define CLKID_SPICC2_DIV 216
> > +#define CLKID_SPICC2_GATE 217
> > +#define CLKID_SPICC3_MUX 218
> > +#define CLKID_SPICC3_DIV 219
> > +#define CLKID_SPICC3_GATE 220
> > +#define CLKID_SPICC4_MUX 221
> > +#define CLKID_SPICC4_DIV 222
> > +#define CLKID_SPICC4_GATE 223
> > +#define CLKID_SPICC5_MUX 224
> > +#define CLKID_SPICC5_DIV 225
> > +#define CLKID_SPICC5_GATE 226
> > +#define CLKID_SD_EMMC_C_CLK_MUX 227
> > +#define CLKID_SD_EMMC_C_CLK_DIV 228
> > +#define CLKID_SD_EMMC_C_CLK 229
> > +#define CLKID_SD_EMMC_A_CLK_MUX 230
> > +#define CLKID_SD_EMMC_A_CLK_DIV 231
> > +#define CLKID_SD_EMMC_A_CLK 232
> > +#define CLKID_SD_EMMC_B_CLK_MUX 233
> > +#define CLKID_SD_EMMC_B_CLK_DIV 234
> > +#define CLKID_SD_EMMC_B_CLK 235
> > +#define CLKID_ETH_RMII_SEL 236
> > +#define CLKID_ETH_RMII_DIV 237
> > +#define CLKID_ETH_RMII 238
> > +#define CLKID_ETH_DIV8 239
> > +#define CLKID_ETH_125M 240
> > +#define CLKID_SARADC_MUX 241
> > +#define CLKID_SARADC_DIV 242
> > +#define CLKID_SARADC_GATE 243
> > +#define CLKID_GEN_MUX 244
> > +#define CLKID_GEN_DIV 245
> > +#define CLKID_GEN_GATE 246
> > +#define CLKID_DSPB_CLK_B_MUX 247
> > +#define CLKID_DSPB_CLK_B_DIV 248
> > +#define CLKID_DSPB_CLK_B_GATE 249
> > +#define CLKID_DSPB_CLK_A_MUX 250
> > +#define CLKID_DSPB_CLK_A_DIV 251
> > +#define CLKID_DSPB_CLK_A_GATE 252
> > +#define CLKID_DSPB_CLK 253
> > +#define CLKID_MIPI_ISP_MUX 254
> > +#define CLKID_MIPI_ISP_DIV 255
> > +#define CLKID_MIPI_ISP 256
> > +#define CLKID_MIPI_CSI_PHY_SEL0 257
> > +#define CLKID_MIPI_CSI_PHY_DIV0 258
> > +#define CLKID_MIPI_CSI_PHY0 259
> > +#define CLKID_MIPI_CSI_PHY_SEL1 260
> > +#define CLKID_MIPI_CSI_PHY_DIV1 261
> > +#define CLKID_MIPI_CSI_PHY1 262
> > +#define CLKID_MIPI_CSI_PHY_CLK 263
> > +#define CLKID_GDCCLK_0_MUX 264
> > +#define CLKID_GDCCLK_0_DIV 265
> > +#define CLKID_GDCCLK_0 266
> > +#define CLKID_GDCCLK_1_MUX 267
> > +#define CLKID_GDCCLK_1_DIV 268
> > +#define CLKID_GDCCLK_1 269
> > +#define CLKID_GDCCLK 270
> > +#define CLKID_GDC_CLK 271
> > +#define CLKID_DEWARPCLK_0_MUX 272
> > +#define CLKID_DEWARPCLK_0_DIV 273
> > +#define CLKID_DEWARPCLK_0 274
> > +#define CLKID_DEWARPCLK_1_MUX 275
> > +#define CLKID_DEWARPCLK_1_DIV 276
> > +#define CLKID_DEWARPCLK_1 277
> > +#define CLKID_DEWARPCLK 278
> > +#define CLKID_DEWARP_CLK 279
> > +#define CLKID_ANAKIN_0_MUX 280
> > +#define CLKID_ANAKIN_0_DIV 281
> > +#define CLKID_ANAKIN_0 282
> > +#define CLKID_ANAKIN_1_MUX 283
> > +#define CLKID_ANAKIN_1_DIV 284
> > +#define CLKID_ANAKIN_1 285
> > +#define CLKID_ANAKIN 286
> > +#define CLKID_ANAKIN_CLK 287
> > +#define CLKID_HDMITX_PRIF_MUX 288
> > +#define CLKID_HDMITX_PRIF_DIV 289
> > +#define CLKID_HDMITX_PRIF 290
> > +#define CLKID_HDMITX_200M_MUX 291
> > +#define CLKID_HDMITX_200M_DIV 292
> > +#define CLKID_HDMITX_200M 293
> > +#define CLKID_HDMITX_AUD_MUX 294
> > +#define CLKID_HDMITX_AUD_DIV 295
> > +#define CLKID_HDMITX_AUD 296
> > +#define CLKID_HDMIRX_2M_MUX 297
> > +#define CLKID_HDMIRX_2M_DIV 298
> > +#define CLKID_HDMIRX_2M 299
> > +#define CLKID_HDMIRX_5M_MUX 300
> > +#define CLKID_HDMIRX_5M_DIV 301
> > +#define CLKID_HDMIRX_5M 302
> > +#define CLKID_HDMIRX_CFG_MUX 303
> > +#define CLKID_HDMIRX_CFG_DIV 304
> > +#define CLKID_HDMIRX_CFG 305
> > +#define CLKID_HDMIRX_HDCP_MUX 306
> > +#define CLKID_HDMIRX_HDCP_DIV 307
> > +#define CLKID_HDMIRX_HDCP 308
> > +#define CLKID_HDMIRX_AUD_PLL_MUX 309
> > +#define CLKID_HDMIRX_AUD_PLL_DIV 310
> > +#define CLKID_HDMIRX_AUD_PLL 311
> > +#define CLKID_HDMIRX_ACR_MUX 312
> > +#define CLKID_HDMIRX_ACR_DIV 313
> > +#define CLKID_HDMIRX_ACR 314
> > +#define CLKID_HDMIRX_METER_MUX 315
> > +#define CLKID_HDMIRX_METER_DIV 316
> > +#define CLKID_HDMIRX_METER 317
> > +#define CLKID_DDR 318
> > +#define CLKID_DOS 319
> > +#define CLKID_ETHPHY 320
> > +#define CLKID_MALI 321
> > +#define CLKID_TS_A53 322
> > +#define CLKID_TS_A73 323
> > +#define CLKID_CEC 324
> > +#define CLKID_SD_EMMC_A 325
> > +#define CLKID_SD_EMMC_B 326
> > +#define CLKID_SD_EMMC_C 327
> > +#define CLKID_SMARTCARD 328
> > +#define CLKID_ACODEC 329
> > +#define CLKID_SPIFC 330
> > +#define CLKID_MSR_CLK 331
> > +#define CLKID_IR_CTRL 332
> > +#define CLKID_AUDIO 333
> > +#define CLKID_ETH 334
> > +#define CLKID_UART_A 335
> > +#define CLKID_UART_B 336
> > +#define CLKID_UART_C 337
> > +#define CLKID_UART_D 338
> > +#define CLKID_UART_E 339
> > +#define CLKID_AIFIFO 340
> > +#define CLKID_TS_DDR 341
> > +#define CLKID_TS_PLL 342
> > +#define CLKID_G2D 343
> > +#define CLKID_SPICC0 344
> > +#define CLKID_SPICC1 345
> > +#define CLKID_PCIE 346
> > +#define CLKID_USB 347
> > +#define CLKID_PCIE_PHY 348
> > +#define CLKID_I2C_M_A 349
> > +#define CLKID_I2C_M_B 350
> > +#define CLKID_I2C_M_C 351
> > +#define CLKID_I2C_M_D 352
> > +#define CLKID_I2C_M_E 353
> > +#define CLKID_I2C_M_F 354
> > +#define CLKID_HDMITX_APB 355
> > +#define CLKID_I2C_S_A 356
> > +#define CLKID_USB1_TO_DDR 357
> > +#define CLKID_AOCPU 358
> > +#define CLKID_MMC_APB 359
> > +#define CLKID_RSA 360
> > +#define CLKID_AUCPU 361
> > +#define CLKID_DSPA 362
> > +#define CLKID_VPU_INTR 363
> > +#define CLKID_SAR_ADC 364
> > +#define CLKID_GIC 365
> > +#define CLKID_PWM_AB 366
> > +#define CLKID_PWM_CD 367
> > +#define CLKID_PWM_EF 368
> > +#define CLKID_PWM_GH 369
> > +#define CLKID_PWM_AO_AB 370
> > +#define CLKID_MIPI_DSI_A 371
> > +#define CLKID_MIPI_DSI_B 372
> > +#define CLKID_GDC 373
> > +#define CLKID_DESWARP 374
> > +#define CLKID_AMPIPE_NAND 375
> > +#define CLKID_AMPIPE_ETH 376
> > +#define CLKID_AM2AXI0 377
> > +#define CLKID_AM2AXI1 378
> > +#define CLKID_AM2AXI2 379
> > +#define CLKID_PWM_AO_CD 380
> > +#define CLKID_PWM_AO_EF 381
> > +#define CLKID_PWM_AO_GH 382
> > +#define CLKID_TS_NNA 383
> > +#define CLKID_TS_GPU 384
> > +#define CLKID_TS_HEVC 385
> > +#define CLKID_DSPB 386
> > +#define CLKID_SPICC2 387
> > +#define CLKID_SPICC3 388
> > +#define CLKID_SPICC4 389
> > +#define CLKID_SPICC5 390
> > +#define CLKID_I2C_AO_A 391
> > +#define CLKID_I2C_AO_B 392
> > +#define CLKID_UART_F 393
> > +#define CLKID_MIPI_ISP_PCLK 394
> > +#define CLKID_HDMIRX_PCLK 395
> > +#define CLKID_PCLK_SYS_CPU_APB 396
> > +#define CLKID_A73PCLK_CPU_APB 397
> > +#define CLKID_TS_VPU 398
> > +
> > +#endif /* _DT_BINDINGS_CLOCK_AMLOGIC_T7_PERIPHERALS_CLKC_H */
> > diff --git a/include/dt-bindings/clock/amlogic,t7-pll-clkc.h b/include/dt-bindings/clock/amlogic,t7-pll-clkc.h
> > new file mode 100644
> > index 000000000000..89ee62069772
> > --- /dev/null
> > +++ b/include/dt-bindings/clock/amlogic,t7-pll-clkc.h
> > @@ -0,0 +1,69 @@
> > +/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
> > +/*
> > + * Copyright (c) 2019 Amlogic Inc. All rights reserved.
> > + */
> > +
> > +#ifndef __T7_CLKC_H
> > +#define __T7_CLKC_H
> > +
> > +/*
> > + * CLKID index values
> > + */
> > +
> > +#define CLKID_FIXED_PLL_DCO 0
> > +#define CLKID_FIXED_PLL 1
> > +#define CLKID_SYS_PLL_DCO 2
> > +#define CLKID_SYS_PLL 3
> > +#define CLKID_FCLK_DIV2_DIV 4
> > +#define CLKID_FCLK_DIV2 5
> > +#define CLKID_FCLK_DIV3_DIV 6
> > +#define CLKID_FCLK_DIV3 7
> > +#define CLKID_FCLK_DIV4_DIV 8
> > +#define CLKID_FCLK_DIV4 9
> > +#define CLKID_FCLK_DIV5_DIV 10
> > +#define CLKID_FCLK_DIV5 11
> > +#define CLKID_FCLK_DIV7_DIV 12
> > +#define CLKID_FCLK_DIV7 13
> > +#define CLKID_FCLK_DIV2P5_DIV 14
> > +#define CLKID_FCLK_DIV2P5 15
> > +#define CLKID_GP0_PLL_DCO 16
> > +#define CLKID_GP0_PLL 17
> > +#define CLKID_GP1_PLL_DCO 18
> > +#define CLKID_GP1_PLL 19
> > +#define CLKID_SYS1_PLL_DCO 20
> > +#define CLKID_SYS1_PLL 21
> > +#define CLKID_MCLK_PLL_DCO 22
> > +#define CLKID_MCLK_PRE 23
> > +#define CLKID_MCLK_PLL 24
> > +#define CLKID_HIFI_PLL_DCO 25
> > +#define CLKID_HIFI_PLL 26
> > +#define CLKID_PCIE_PLL_DCO 27
> > +#define CLKID_PCIE_PLL_DCO_DIV2 28
> > +#define CLKID_PCIE_PLL_OD 29
> > +#define CLKID_PCIE_PLL 30
> > +#define CLKID_HDMI_PLL_DCO 31
> > +#define CLKID_HDMI_PLL_OD 32
> > +#define CLKID_HDMI_PLL 33
> > +#define CLKID_MPLL_50M_DIV 34
> > +#define CLKID_MPLL_50M 35
> > +#define CLKID_MPLL_PREDIV 36
> > +#define CLKID_MPLL0_DIV 37
> > +#define CLKID_MPLL0 38
> > +#define CLKID_MPLL1_DIV 39
> > +#define CLKID_MPLL1 40
> > +#define CLKID_MPLL2_DIV 41
> > +#define CLKID_MPLL2 42
> > +#define CLKID_MPLL3_DIV 43
> > +#define CLKID_MPLL3 44
> > +#define CLKID_PCIE_BGP 45
> > +#define CLKID_PCIE_HCSL 46
> > +#define CLKID_MCLK_0_SEL 47
> > +#define CLKID_MCLK_0_DIV2 48
> > +#define CLKID_MCLK_0_PRE 49
> > +#define CLKID_MCLK_0 50
> > +#define CLKID_MCLK_1_SEL 51
> > +#define CLKID_MCLK_1_DIV2 52
> > +#define CLKID_MCLK_1_PRE 53
> > +#define CLKID_MCLK_1 54
> > +
> > +#endif /* __T7_CLKC_H */
> > --
> > 2.44.0
> >
Hi,

I have been trying to port the MMC driver to the mainline, but this
kernel panic is occurring frequently.
It doesn't seem to be from my driver. Can anybody help?

0.355428] meson-gx-mmc fe08a000.sd: host probe success!
[ 0.355850] clk: Disabling unused clocks
[ 0.356032] PM: genpd: Disabling unused power domains
[ 0.356554] ALSA device list:
[ 0.356894] No soundcards found.
[ 0.359563] SError Interrupt on CPU1, code 0x00000000bf000002 -- SError
[ 0.359575] CPU: 1 PID: 76 Comm: kworker/1:1 Not tainted
6.8.0-09794-g261238a64e1f-dirty #38
[ 0.359585] Hardware name: Khadas vim4 (DT)
[ 0.359590] Workqueue: events_freezable mmc_rescan
[ 0.359611] pstate: 80000005 (Nzcv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
[ 0.359620] pc : meson_mmc_request+0x1d0/0x624
[ 0.359630] lr : __mmc_start_request+0x68/0x13c
[ 0.359641] sp : ffff800082ff3b70
[ 0.359644] x29: ffff800082ff3b70 x28: 0000000000000000 x27: ffff800082327000
[ 0.359655] x26: ffff0001011d3040 x25: 0000000000000000 x24: ffff000100030405
[ 0.359666] x23: ffff800082ff3d20 x22: ffff0001031b8000 x21: 000000008840a800
[ 0.359677] x20: 0000000000000000 x19: ffff0001031b8580 x18: 0000000000000020
[ 0.359688] x17: 0000000000000080 x16: fffffdffc378e008 x15: 0000000000000000
[ 0.359698] x14: ffff0001003ca280 x13: 0000000000000000 x12: ffff800082329dc8
[ 0.359709] x11: ffff000100cc3500 x10: 0000000000000a70 x9 : ffff800082ff3b70
[ 0.359719] x8 : ffff0001003cacd0 x7 : ffff00021ef51d40 x6 : ffff80019d3c6000
[ 0.359730] x5 : 0000000000000008 x4 : 0000000000500000 x3 : 0000000088400000
[ 0.359741] x2 : 0000000000000008 x1 : ffff80008287d000 x0 : ffff80008287d000
[ 0.359753] Kernel panic - not syncing: Asynchronous SError Interrupt
[ 0.359757] CPU: 1 PID: 76 Comm: kworker/1:1 Not tainted
6.8.0-09794-g261238a64e1f-dirty #38
[ 0.359765] Hardware name: Khadas vim4 (DT)
[ 0.359769] Workqueue: events_freezable mmc_rescan
[ 0.359780] Call trace:
[ 0.359784] dump_backtrace+0x94/0xec
[ 0.359798] show_stack+0x18/0x24
[ 0.359809] dump_stack_lvl+0x38/0x90
[ 0.359818] dump_stack+0x18/0x24
[ 0.359824] panic+0x388/0x3c8
[ 0.359834] nmi_panic+0x48/0x94
[ 0.359846] arm64_serror_panic+0x6c/0x78
[ 0.359853] do_serror+0x3c/0x78
[ 0.359860] el1h_64_error_handler+0x30/0x48
[ 0.359870] el1h_64_error+0x64/0x68
[ 0.359878] meson_mmc_request+0x1d0/0x624
[ 0.359886] __mmc_start_request+0x68/0x13c
[ 0.359897] mmc_start_request+0x84/0xac
[ 0.359906] mmc_wait_for_req+0x70/0x100
[ 0.359916] mmc_wait_for_cmd+0x64/0x9c
[ 0.359925] mmc_send_if_cond_pcie+0x88/0x120
[ 0.359936] mmc_rescan+0x22c/0x31c
[ 0.359946] process_one_work+0x150/0x294
[ 0.359957] worker_thread+0x304/0x408
[ 0.359968] kthread+0x118/0x11c
[ 0.359977] ret_from_fork+0x10/0x20
[ 0.359987] SMP: stopping secondary CPUs
[ 0.360066] Kernel Offset: disabled
[ 0.360068] CPU features: 0x0,00000060,d0080000,0200421b
[ 0.360074] Memory Limit: none
[ 0.388534] ---[ end Kernel panic - not syncing: Asynchronous
SError Interrupt ]---

2024-04-03 06:45:13

by Xianwei Zhao

[permalink] [raw]
Subject: Re: [RFC][PATCH 0/2] Amlogic T7 (A113D2) Clock Driver

Hi Lucas,
As we are preparing the T7 clock patchset, we would like to your
purpose and plan of this RFC patches. Are you going to submit these
patches at last?

On 2024/3/18 19:43, Lucas Tanure wrote:
> [ EXTERNAL EMAIL ]
>
> I am trying to port the T7 clock driver from Khadas 5.4 kernel for Vim4
> to mainline, but I am encountering some issues in the path.
>
> The kernel panics at clk_mux_val_to_index, but I believe that all the
> needed clocks are registered.
>
> If anyone from Amlogic or the community could help me understand what
> my driver is missing, that would be great.
> I will continue to try to figure out, but it has been some weeks
> without progress =/.
>
> Lucas Tanure (2):
> clk: meson: T7: add support for Amlogic T7 SoC PLL clock driver
> arm64: dts: amlogic: t7: SDCard, Ethernet and Clocking
>
> .../amlogic/amlogic-t7-a311d2-khadas-vim4.dts | 66 +
> arch/arm64/boot/dts/amlogic/amlogic-t7.dtsi | 189 +
> drivers/clk/meson/Kconfig | 25 +
> drivers/clk/meson/Makefile | 2 +
> drivers/clk/meson/t7-peripherals.c | 6368 +++++++++++++++++
> drivers/clk/meson/t7-peripherals.h | 131 +
> drivers/clk/meson/t7-pll.c | 1543 ++++
> drivers/clk/meson/t7-pll.h | 83 +
> .../clock/amlogic,t7-peripherals-clkc.h | 410 ++
> .../dt-bindings/clock/amlogic,t7-pll-clkc.h | 69 +
> 10 files changed, 8886 insertions(+)
> create mode 100644 drivers/clk/meson/t7-peripherals.c
> create mode 100644 drivers/clk/meson/t7-peripherals.h
> create mode 100644 drivers/clk/meson/t7-pll.c
> create mode 100644 drivers/clk/meson/t7-pll.h
> create mode 100644 include/dt-bindings/clock/amlogic,t7-peripherals-clkc.h
> create mode 100644 include/dt-bindings/clock/amlogic,t7-pll-clkc.h
>
> Starting kernel ...
>
> uboot time: 14277917 us
> boot 64bit kernel
> [ 0.000000] Booting Linux on physical CPU 0x0000000000 [0x410fd092]
> [ 0.000000] Linux version 6.8.0-09793-gda876e5b54b3-dirty (tanureal@ryzen) (aarch64-none-linux-gnu-gcc (GNU Toolchain for the A-profile Architecture 10.3-2021.07 (arm-10.29)) 10.3.1 20210621, GNU ld (GNU Toolchain for the A-pr4
> [ 0.000000] KASLR disabled due to lack of seed
> [ 0.000000] Machine model: Khadas vim4
> [ 0.000000] efi: UEFI not found.
> [ 0.000000] OF: reserved mem: 0x0000000005000000..0x00000000052fffff (3072 KiB) nomap non-reusable secmon@5000000
> [ 0.000000] OF: reserved mem: 0x0000000005300000..0x00000000072fffff (32768 KiB) nomap non-reusable secmon@5300000
> [ 0.000000] NUMA: No NUMA configuration found
> [ 0.000000] NUMA: Faking a node at [mem 0x0000000000000000-0x00000000df7fffff]
> [ 0.000000] NUMA: NODE_DATA [mem 0xdf10c9c0-0xdf10efff]
> [ 0.000000] Zone ranges:
> [ 0.000000] DMA [mem 0x0000000000000000-0x00000000df7fffff]
> [ 0.000000] DMA32 empty
> [ 0.000000] Normal empty
> [ 0.000000] Movable zone start for each node
> [ 0.000000] Early memory node ranges
> [ 0.000000] node 0: [mem 0x0000000000000000-0x0000000004ffffff]
> [ 0.000000] node 0: [mem 0x0000000005000000-0x00000000072fffff]
> [ 0.000000] node 0: [mem 0x0000000007300000-0x00000000df7fffff]
> [ 0.000000] Initmem setup node 0 [mem 0x0000000000000000-0x00000000df7fffff]
> [ 0.000000] On node 0, zone DMA: 2048 pages in unavailable ranges
> [ 0.000000] cma: Reserved 32 MiB at 0x00000000d9800000 on node -1
> [ 0.000000] psci: probing for conduit method from DT.
> [ 0.000000] psci: PSCIv1.0 detected in firmware.
> [ 0.000000] psci: Using standard PSCI v0.2 function IDs
> [ 0.000000] psci: Trusted OS migration not required
> [ 0.000000] psci: SMC Calling Convention v1.1
> [ 0.000000] percpu: Embedded 24 pages/cpu s58152 r8192 d31960 u98304
> [ 0.000000] Detected VIPT I-cache on CPU0
> [ 0.000000] CPU features: detected: Spectre-v2
> [ 0.000000] CPU features: detected: Spectre-v4
> [ 0.000000] CPU features: detected: Spectre-BHB
> [ 0.000000] CPU features: detected: ARM erratum 858921
> [ 0.000000] alternatives: applying boot alternatives
> [ 0.000000] Kernel command line: root=UUID=a91e7bfe-4263-4e53-867d-7824e7c6a992 rw rootfstype=ext4 console=ttyS0,921600 no_console_suspend earlycon=ttyS0,0xfe078000 khadas_board=VIM4 androidboot.selinux=permissive androidboot.0
> [ 0.000000] Unknown kernel command line parameters "khadas_board=VIM4", will be passed to user space.
> [ 0.000000] Dentry cache hash table entries: 524288 (order: 10, 4194304 bytes, linear)
> [ 0.000000] Inode-cache hash table entries: 262144 (order: 9, 2097152 bytes, linear)
> [ 0.000000] Fallback order for Node 0: 0
> [ 0.000000] Built 1 zonelists, mobility grouping on. Total pages: 901152
> [ 0.000000] Policy zone: DMA
> [ 0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off
> [ 0.000000] software IO TLB: SWIOTLB bounce buffer size adjusted to 3MB
> [ 0.000000] software IO TLB: area num 8.
> [ 0.000000] software IO TLB: SWIOTLB bounce buffer size roundup to 4MB
> [ 0.000000] software IO TLB: mapped [mem 0x00000000d8e00000-0x00000000d9200000] (4MB)
> [ 0.000000] Memory: 3445944K/3661824K available (16896K kernel code, 4426K rwdata, 9184K rodata, 9728K init, 611K bss, 183112K reserved, 32768K cma-reserved)
> [ 0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=8, Nodes=1
> [ 0.000000] rcu: Preemptible hierarchical RCU implementation.
> [ 0.000000] rcu: RCU restricting CPUs from NR_CPUS=256 to nr_cpu_ids=8.
> [ 0.000000] Trampoline variant of Tasks RCU enabled.
> [ 0.000000] Tracing variant of Tasks RCU enabled.
> [ 0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 25 jiffies.
> [ 0.000000] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=8
> [ 0.000000] RCU Tasks: Setting shift to 3 and lim to 1 rcu_task_cb_adjust=1.
> [ 0.000000] RCU Tasks Trace: Setting shift to 3 and lim to 1 rcu_task_cb_adjust=1.
> [ 0.000000] NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0
> [ 0.000000] GIC: GICv2 detected, but range too small and irqchip.gicv2_force_probe not set
> [ 0.000000] Root IRQ handler: gic_handle_irq
> [ 0.000000] rcu: srcu_init: Setting srcu_struct sizes based on contention.
> [ 0.000000] arch_timer: Enabling local workaround for ARM erratum 858921
> [ 0.000000] arch_timer: CPU0: Trapping CNTVCT access
> [ 0.000000] arch_timer: cp15 timer(s) running at 24.00MHz (phys).
> [ 0.000000] clocksource: arch_sys_counter: mask: 0xffffffffffffff max_cycles: 0x588fe9dc0, max_idle_ns: 440795202592 ns
> [ 0.000000] sched_clock: 56 bits at 24MHz, resolution 41ns, wraps every 4398046511097ns
> [ 0.000210] Console: colour dummy device 80x25
> [ 0.000253] Calibrating delay loop (skipped), value calculated using timer frequency.. 48.00 BogoMIPS (lpj=96000)
> [ 0.000261] pid_max: default: 32768 minimum: 301
> [ 0.000300] LSM: initializing lsm=capability
> [ 0.000358] Mount-cache hash table entries: 8192 (order: 4, 65536 bytes, linear)
> [ 0.000371] Mountpoint-cache hash table entries: 8192 (order: 4, 65536 bytes, linear)
> [ 0.000920] cacheinfo: Unable to detect cache hierarchy for CPU 0
> [ 0.001389] rcu: Hierarchical SRCU implementation.
> [ 0.001391] rcu: Max phase no-delay instances is 1000.
> [ 0.001834] EFI services will not be available.
> [ 0.001999] smp: Bringing up secondary CPUs ...
> [ 0.002408] CPU features: detected: ARM erratum 845719
> [ 0.002426] Detected VIPT I-cache on CPU1
> [ 0.002516] CPU1: Booted secondary processor 0x0000000100 [0x410fd034]
> [ 0.003007] Detected VIPT I-cache on CPU2
> [ 0.003054] CPU2: Booted secondary processor 0x0000000101 [0x410fd034]
> [ 0.003497] Detected VIPT I-cache on CPU3
> [ 0.003546] CPU3: Booted secondary processor 0x0000000102 [0x410fd034]
> [ 0.003988] Detected VIPT I-cache on CPU4
> [ 0.004038] CPU4: Booted secondary processor 0x0000000103 [0x410fd034]
> [ 0.004472] Detected VIPT I-cache on CPU5
> [ 0.004509] arch_timer: Enabling local workaround for ARM erratum 858921
> [ 0.004519] arch_timer: CPU5: Trapping CNTVCT access
> [ 0.004527] CPU5: Booted secondary processor 0x0000000001 [0x410fd092]
> [ 0.004915] Detected VIPT I-cache on CPU6
> [ 0.004940] arch_timer: Enabling local workaround for ARM erratum 858921
> [ 0.004946] arch_timer: CPU6: Trapping CNTVCT access
> [ 0.004951] CPU6: Booted secondary processor 0x0000000002 [0x410fd092]
> [ 0.005333] Detected VIPT I-cache on CPU7
> [ 0.005358] arch_timer: Enabling local workaround for ARM erratum 858921
> [ 0.005364] arch_timer: CPU7: Trapping CNTVCT access
> [ 0.005369] CPU7: Booted secondary processor 0x0000000003 [0x410fd092]
> [ 0.005414] smp: Brought up 1 node, 8 CPUs
> [ 0.005419] SMP: Total of 8 processors activated.
> [ 0.005421] CPU: All CPU(s) started at EL2
> [ 0.005434] CPU features: detected: 32-bit EL0 Support
> [ 0.005437] CPU features: detected: 32-bit EL1 Support
> [ 0.005440] CPU features: detected: CRC32 instructions
> [ 0.005485] alternatives: applying system-wide alternatives
> [ 0.006730] devtmpfs: initialized
> [ 0.008534] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645041785100000 ns
> [ 0.008545] futex hash table entries: 2048 (order: 5, 131072 bytes, linear)
> [ 0.008989] pinctrl core: initialized pinctrl subsystem
> [ 0.009581] DMI not present or invalid.
> [ 0.011290] NET: Registered PF_NETLINK/PF_ROUTE protocol family
> [ 0.011944] DMA: preallocated 512 KiB GFP_KERNEL pool for atomic allocations
> [ 0.012293] DMA: preallocated 512 KiB GFP_KERNEL|GFP_DMA pool for atomic allocations
> [ 0.012711] DMA: preallocated 512 KiB GFP_KERNEL|GFP_DMA32 pool for atomic allocations
> [ 0.012832] audit: initializing netlink subsys (disabled)
> [ 0.013075] audit: type=2000 audit(0.012:1): state=initialized audit_enabled=0 res=1
> [ 0.013508] thermal_sys: Registered thermal governor 'step_wise'
> [ 0.013512] thermal_sys: Registered thermal governor 'power_allocator'
> [ 0.013557] cpuidle: using governor menu
> [ 0.013675] hw-breakpoint: found 6 breakpoint and 4 watchpoint registers.
> [ 0.013784] ASID allocator initialised with 65536 entries
> [ 0.014630] Serial: AMBA PL011 UART driver
> [ 0.017553] Modules: 22496 pages in range for non-PLT usage
> [ 0.017556] Modules: 514016 pages in range for PLT usage
> [ 0.017980] HugeTLB: registered 1.00 GiB page size, pre-allocated 0 pages
> [ 0.017984] HugeTLB: 0 KiB vmemmap can be freed for a 1.00 GiB page
> [ 0.017988] HugeTLB: registered 32.0 MiB page size, pre-allocated 0 pages
> [ 0.017990] HugeTLB: 0 KiB vmemmap can be freed for a 32.0 MiB page
> [ 0.017993] HugeTLB: registered 2.00 MiB page size, pre-allocated 0 pages
> [ 0.017995] HugeTLB: 0 KiB vmemmap can be freed for a 2.00 MiB page
> [ 0.017997] HugeTLB: registered 64.0 KiB page size, pre-allocated 0 pages
> [ 0.018000] HugeTLB: 0 KiB vmemmap can be freed for a 64.0 KiB page
> [ 0.018247] Demotion targets for Node 0: null
> [ 0.018884] ACPI: Interpreter disabled.
> [ 0.019584] iommu: Default domain type: Translated
> [ 0.019587] iommu: DMA domain TLB invalidation policy: strict mode
> [ 0.019979] SCSI subsystem initialized
> [ 0.020174] usbcore: registered new interface driver usbfs
> [ 0.020187] usbcore: registered new interface driver hub
> [ 0.020200] usbcore: registered new device driver usb
> [ 0.020434] pps_core: LinuxPPS API ver. 1 registered
> [ 0.020437] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <[email protected]>
> [ 0.020443] PTP clock support registered
> [ 0.020487] EDAC MC: Ver: 3.0.0
> [ 0.020717] scmi_core: SCMI protocol bus registered
> [ 0.021039] FPGA manager framework
> [ 0.021076] Advanced Linux Sound Architecture Driver Initialized.
> [ 0.021612] vgaarb: loaded
> [ 0.021857] clocksource: Switched to clocksource arch_sys_counter
> [ 0.021967] VFS: Disk quotas dquot_6.6.0
> [ 0.021984] VFS: Dquot-cache hash table entries: 512 (order 0, 4096 bytes)
> [ 0.022062] pnp: PnP ACPI: disabled
> [ 0.026651] NET: Registered PF_INET protocol family
> [ 0.026781] IP idents hash table entries: 65536 (order: 7, 524288 bytes, linear)
> [ 0.028598] tcp_listen_portaddr_hash hash table entries: 2048 (order: 3, 32768 bytes, linear)
> [ 0.028615] Table-perturb hash table entries: 65536 (order: 6, 262144 bytes, linear)
> [ 0.028622] TCP established hash table entries: 32768 (order: 6, 262144 bytes, linear)
> [ 0.028750] TCP bind hash table entries: 32768 (order: 8, 1048576 bytes, linear)
> [ 0.029019] TCP: Hash tables configured (established 32768 bind 32768)
> [ 0.029096] UDP hash table entries: 2048 (order: 4, 65536 bytes, linear)
> [ 0.029124] UDP-Lite hash table entries: 2048 (order: 4, 65536 bytes, linear)
> [ 0.029225] NET: Registered PF_UNIX/PF_LOCAL protocol family
> [ 0.029506] RPC: Registered named UNIX socket transport module.
> [ 0.029510] RPC: Registered udp transport module.
> [ 0.029512] RPC: Registered tcp transport module.
> [ 0.029513] RPC: Registered tcp-with-tls transport module.
> [ 0.029515] RPC: Registered tcp NFSv4.1 backchannel transport module.
> [ 0.029524] PCI: CLS 0 bytes, default 64
> [ 0.029649] Unpacking initramfs...
> [ 0.033933] kvm [1]: IPA Size Limit: 40 bits
> [ 0.034713] kvm [1]: Hyp mode initialized successfully
> [ 0.035476] Initialise system trusted keyrings
> [ 0.035582] workingset: timestamp_bits=42 max_order=20 bucket_order=0
> [ 0.035747] squashfs: version 4.0 (2009/01/31) Phillip Lougher
> [ 0.035906] NFS: Registering the id_resolver key type
> [ 0.035919] Key type id_resolver registered
> [ 0.035922] Key type id_legacy registered
> [ 0.035933] nfs4filelayout_init: NFSv4 File Layout Driver Registering...
> [ 0.035935] nfs4flexfilelayout_init: NFSv4 Flexfile Layout Driver Registering...
> [ 0.036031] 9p: Installing v9fs 9p2000 file system support
> [ 0.062587] Key type asymmetric registered
> [ 0.062596] Asymmetric key parser 'x509' registered
> [ 0.062657] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 245)
> [ 0.062661] io scheduler mq-deadline registered
> [ 0.062664] io scheduler kyber registered
> [ 0.062688] io scheduler bfq registered
> [ 0.063318] irq_meson_gpio: 157 to 12 gpio interrupt mux initialized
> [ 0.068061] EINJ: ACPI disabled.
> [ 0.072570] amlogic_t7_pll_probe
> [ 0.072855] amlogic_t7_pll_probe ret 0
> [ 0.072943] amlogic_a1_periphs_probe
> [ 0.078155] amlogic_a1_periphs_probe ret 0
> [ 0.084876] Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled
> [ 0.086691] fe078000.serial: ttyS0 at MMIO 0xfe078000 (irq = 14, base_baud = 1500000) is a meson_uart
> [ 0.086710] printk: legacy console [ttyS0] enabled
> [ 0.229167] sysfs: cannot create duplicate filename '/class/tty/ttyS0'
> [ 0.229669] CPU: 3 PID: 1 Comm: swapper/0 Not tainted 6.8.0-09793-gda876e5b54b3-dirty #15
> [ 0.230684] Hardware name: Khadas vim4 (DT)
> [ 0.231205] Call trace:
> [ 0.231509] dump_backtrace+0x94/0xec
> [ 0.231963] show_stack+0x18/0x24
> [ 0.232374] dump_stack_lvl+0x78/0x90
> [ 0.232829] dump_stack+0x18/0x24
> [ 0.233241] sysfs_warn_dup+0x64/0x80
> [ 0.233696] sysfs_do_create_link_sd+0xf0/0xf8
> [ 0.234248] sysfs_create_link+0x20/0x40
> [ 0.234736] device_add+0x27c/0x77c
> [ 0.235169] device_register+0x20/0x30
> [ 0.235635] tty_register_device_attr+0xfc/0x240
> [ 0.236209] tty_port_register_device_attr_serdev+0x8c/0xac
> [ 0.236902] serial_core_register_port+0x318/0x658
> [ 0.237498] serial_ctrl_register_port+0x10/0x1c
> [ 0.238072] uart_add_one_port+0x10/0x1c
> [ 0.238560] meson_uart_probe+0x2c0/0x3b4
> [ 0.239058] platform_probe+0x68/0xd8
> [ 0.239513] really_probe+0x148/0x2b4
> [ 0.239968] __driver_probe_device+0x78/0x12c
> [ 0.240510] driver_probe_device+0xdc/0x160
> [ 0.241030] __driver_attach+0x94/0x19c
> [ 0.241507] bus_for_each_dev+0x74/0xd4
> [ 0.241983] driver_attach+0x24/0x30
> [ 0.242428] bus_add_driver+0xe4/0x1e8
> [ 0.242893] driver_register+0x60/0x128
> [ 0.243370] __platform_driver_register+0x28/0x34
> [ 0.243955] meson_uart_platform_driver_init+0x1c/0x28
> [ 0.244594] do_one_initcall+0x6c/0x1b0
> [ 0.245071] kernel_init_freeable+0x1cc/0x294
> [ 0.245613] kernel_init+0x20/0x1dc
> [ 0.246046] ret_from_fork+0x10/0x20
> [ 0.246555] meson_uart fe078000.serial: Cannot register tty device on line 0
> [ 0.247729] msm_serial: driver initialized
> [ 0.248150] SuperH (H)SCI(F) driver initialized
> [ 0.248544] STM32 USART driver initialized
> [ 0.263927] loop: module loaded
> [ 0.264952] megasas: 07.727.03.00-rc1
> [ 0.271065] tun: Universal TUN/TAP device driver, 1.6
> [ 0.271824] thunder_xcv, ver 1.0
> [ 0.271878] thunder_bgx, ver 1.0
> [ 0.271956] nicpf, ver 1.0
> [ 0.273230] hns3: Hisilicon Ethernet Network Driver for Hip08 Family - version
> [ 0.273437] hns3: Copyright (c) 2017 Huawei Corporation.
> [ 0.274148] hclge is initializing
> [ 0.274541] e1000: Intel(R) PRO/1000 Network Driver
> [ 0.275116] e1000: Copyright (c) 1999-2006 Intel Corporation.
> [ 0.275860] e1000e: Intel(R) PRO/1000 Network Driver
> [ 0.276449] e1000e: Copyright(c) 1999 - 2015 Intel Corporation.
> [ 0.277209] igb: Intel(R) Gigabit Ethernet Network Driver
> [ 0.277867] igb: Copyright (c) 2007-2014 Intel Corporation.
> [ 0.278576] igbvf: Intel(R) Gigabit Virtual Function Network Driver
> [ 0.279330] igbvf: Copyright (c) 2009 - 2012 Intel Corporation.
> [ 0.280319] sky2: driver version 1.30
> [ 0.281597] VFIO - User Level meta-driver version: 0.3
> [ 0.283859] usbcore: registered new interface driver usb-storage
> [ 0.286328] i2c_dev: i2c /dev entries driver
> [ 0.292404] sdhci: Secure Digital Host Controller Interface driver
> [ 0.292481] sdhci: Copyright(c) Pierre Ossman
> [ 0.293577] Synopsys Designware Multimedia Card Interface Driver
> [ 0.294572] sdhci-pltfm: SDHCI platform and OF driver helper
> [ 0.296259] ledtrig-cpu: registered to indicate activity on CPUs
> [ 0.298966] meson-sm: secure-monitor enabled
> [ 0.299963] usbcore: registered new interface driver usbhid
> [ 0.299997] usbhid: USB HID core driver
> [ 0.306803] NET: Registered PF_PACKET protocol family
> [ 0.306919] 9pnet: Installing 9P2000 support
> [ 0.307331] Key type dns_resolver registered
> [ 0.318926] Timer migration: 1 hierarchy levels; 8 children per group; 1 crossnode level
> [ 0.319462] registered taskstats version 1
> [ 0.319968] Loading compiled-in X.509 certificates
> [ 0.362771] clk: Disabling unused clocks
> [ 0.363100] PM: genpd: Disabling unused power domains
> [ 0.363383] ALSA device list:
> [ 0.363580] No soundcards found.
> [ 0.368194] meson-gx-mmc fe08a000.sd: Got CD GPIO
> [ 0.368524] SError Interrupt on CPU6, code 0x00000000bf000002 -- SError
> [ 0.368531] CPU: 6 PID: 87 Comm: kworker/u32:3 Not tainted 6.8.0-09793-gda876e5b54b3-dirty #15
> [ 0.368537] Hardware name: Khadas vim4 (DT)
> [ 0.368540] Workqueue: async async_run_entry_fn
> [ 0.368552] pstate: 20000005 (nzCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
> [ 0.368556] pc : clk_mux_val_to_index+0x0/0xc0
> [ 0.368565] lr : clk_mux_get_parent+0x4c/0x84
> [ 0.368571] sp : ffff800082efba10
> [ 0.368572] x29: ffff800082efba10 x28: ffff8000823279c0 x27: ffff800082327000
> [ 0.368578] x26: ffff000004c361c0 x25: 0000000000000000 x24: 0000000000000002
> [ 0.368584] x23: ffff000003f1d300 x22: ffff000003f1d2a0 x21: ffff000004c37280
> [ 0.368589] x20: ffff000004c36ec0 x19: ffff000004bba800 x18: 0000000000000020
> [ 0.368594] x17: ffff000000022000 x16: 0000000000000003 x15: ffffffffffffffff
> [ 0.368599] x14: ffffffffffffffff x13: 0078756d2364732e x12: 3030306138306566
> [ 0.368604] x11: 7f7f7f7f7f7f7f7f x10: ffff7fff83438910 x9 : 0000000000000005
> [ 0.368609] x8 : 0101010101010101 x7 : 0000000000000000 x6 : 05114367045e5359
> [ 0.368613] x5 : 0000000000000006 x4 : 0000000000000000 x3 : 0000000000000000
> [ 0.368618] x2 : 0000000000000000 x1 : 0000000000000000 x0 : ffff000004c36ec0
> [ 0.368624] Kernel panic - not syncing: Asynchronous SError Interrupt
> [ 0.368626] CPU: 6 PID: 87 Comm: kworker/u32:3 Not tainted 6.8.0-09793-gda876e5b54b3-dirty #15
> [ 0.368630] Hardware name: Khadas vim4 (DT)
> [ 0.368631] Workqueue: async async_run_entry_fn
> [ 0.368635] Call trace:
> [ 0.368637] dump_backtrace+0x94/0xec
> [ 0.368644] show_stack+0x18/0x24
> [ 0.368649] dump_stack_lvl+0x38/0x90
> [ 0.368656] dump_stack+0x18/0x24
> [ 0.368661] panic+0x388/0x3c8
> [ 0.368666] nmi_panic+0x48/0x94
> [ 0.368670] arm64_serror_panic+0x6c/0x78
> [ 0.368674] do_serror+0x3c/0x78
> [ 0.368677] el1h_64_error_handler+0x30/0x48
> [ 0.368681] el1h_64_error+0x64/0x68
> [ 0.368684] clk_mux_val_to_index+0x0/0xc0
> [ 0.368689] __clk_register+0x440/0x82c
> [ 0.368693] devm_clk_register+0x5c/0xbc
> [ 0.368697] meson_mmc_clk_init+0x11c/0x2a8
> [ 0.368702] meson_mmc_probe+0x18c/0x3c0
> [ 0.368705] platform_probe+0x68/0xd8
> [ 0.368711] really_probe+0x148/0x2b4
> [ 0.368714] __driver_probe_device+0x78/0x12c
> [ 0.368718] driver_probe_device+0xdc/0x160
> [ 0.368721] __device_attach_driver+0xb8/0x134
> [ 0.368724] bus_for_each_drv+0x84/0xe0
> [ 0.368727] __device_attach_async_helper+0xac/0xd0
> [ 0.368730] async_run_entry_fn+0x34/0xe0
> [ 0.368734] process_one_work+0x150/0x294
> [ 0.368740] worker_thread+0x304/0x408
> [ 0.368744] kthread+0x118/0x11c
> [ 0.368748] ret_from_fork+0x10/0x20
> [ 0.368753] SMP: stopping secondary CPUs
> [ 0.368760] Kernel Offset: disabled
> [ 0.368761] CPU features: 0x0,00000060,d0080000,0200421b
> [ 0.368765] Memory Limit: none
> [ 0.400328] ---[ end Kernel panic - not syncing: Asynchronous SError Interrupt ]---
>
>
> --
> 2.44.0
>

2024-04-03 08:29:15

by Lucas Tanure

[permalink] [raw]
Subject: Re: [RFC][PATCH 0/2] Amlogic T7 (A113D2) Clock Driver

On Wed, Apr 3, 2024 at 7:44 AM Xianwei Zhao <[email protected]> wrote:
>
> Hi Lucas,
> As we are preparing the T7 clock patchset, we would like to your
> purpose and plan of this RFC patches. Are you going to submit these
> patches at last?

Hi Xianwei,

I made some progress, and now the SD card controller probes but fails
to read blocks from the SD card. I do think my port of the clock
driver is okay, but I will not send my clock driver until the SD card
fully works, so I am sure the clocking driver is tested.
But if you have something already done, please send it, and I will
test and review it from my side.

Any help with the sdcard controller is also much appreciated.

Thanks
Lucas

> On 2024/3/18 19:43, Lucas Tanure wrote:
> > [ EXTERNAL EMAIL ]
> >
> > I am trying to port the T7 clock driver from Khadas 5.4 kernel for Vim4
> > to mainline, but I am encountering some issues in the path.
> >
> > The kernel panics at clk_mux_val_to_index, but I believe that all the
> > needed clocks are registered.
> >
> > If anyone from Amlogic or the community could help me understand what
> > my driver is missing, that would be great.
> > I will continue to try to figure out, but it has been some weeks
> > without progress =/.
> >
> > Lucas Tanure (2):
> > clk: meson: T7: add support for Amlogic T7 SoC PLL clock driver
> > arm64: dts: amlogic: t7: SDCard, Ethernet and Clocking
> >
> > .../amlogic/amlogic-t7-a311d2-khadas-vim4.dts | 66 +
> > arch/arm64/boot/dts/amlogic/amlogic-t7.dtsi | 189 +
> > drivers/clk/meson/Kconfig | 25 +
> > drivers/clk/meson/Makefile | 2 +
> > drivers/clk/meson/t7-peripherals.c | 6368 +++++++++++++++++
> > drivers/clk/meson/t7-peripherals.h | 131 +
> > drivers/clk/meson/t7-pll.c | 1543 ++++
> > drivers/clk/meson/t7-pll.h | 83 +
> > .../clock/amlogic,t7-peripherals-clkc.h | 410 ++
> > .../dt-bindings/clock/amlogic,t7-pll-clkc.h | 69 +
> > 10 files changed, 8886 insertions(+)
> > create mode 100644 drivers/clk/meson/t7-peripherals.c
> > create mode 100644 drivers/clk/meson/t7-peripherals.h
> > create mode 100644 drivers/clk/meson/t7-pll.c
> > create mode 100644 drivers/clk/meson/t7-pll.h
> > create mode 100644 include/dt-bindings/clock/amlogic,t7-peripherals-clkc.h
> > create mode 100644 include/dt-bindings/clock/amlogic,t7-pll-clkc.h
> >
> > Starting kernel ...
> >
> > uboot time: 14277917 us
> > boot 64bit kernel
> > [ 0.000000] Booting Linux on physical CPU 0x0000000000 [0x410fd092]
> > [ 0.000000] Linux version 6.8.0-09793-gda876e5b54b3-dirty (tanureal@ryzen) (aarch64-none-linux-gnu-gcc (GNU Toolchain for the A-profile Architecture 10.3-2021.07 (arm-10.29)) 10.3.1 20210621, GNU ld (GNU Toolchain for the A-pr4
> > [ 0.000000] KASLR disabled due to lack of seed
> > [ 0.000000] Machine model: Khadas vim4
> > [ 0.000000] efi: UEFI not found.
> > [ 0.000000] OF: reserved mem: 0x0000000005000000..0x00000000052fffff (3072 KiB) nomap non-reusable secmon@5000000
> > [ 0.000000] OF: reserved mem: 0x0000000005300000..0x00000000072fffff (32768 KiB) nomap non-reusable secmon@5300000
> > [ 0.000000] NUMA: No NUMA configuration found
> > [ 0.000000] NUMA: Faking a node at [mem 0x0000000000000000-0x00000000df7fffff]
> > [ 0.000000] NUMA: NODE_DATA [mem 0xdf10c9c0-0xdf10efff]
> > [ 0.000000] Zone ranges:
> > [ 0.000000] DMA [mem 0x0000000000000000-0x00000000df7fffff]
> > [ 0.000000] DMA32 empty
> > [ 0.000000] Normal empty
> > [ 0.000000] Movable zone start for each node
> > [ 0.000000] Early memory node ranges
> > [ 0.000000] node 0: [mem 0x0000000000000000-0x0000000004ffffff]
> > [ 0.000000] node 0: [mem 0x0000000005000000-0x00000000072fffff]
> > [ 0.000000] node 0: [mem 0x0000000007300000-0x00000000df7fffff]
> > [ 0.000000] Initmem setup node 0 [mem 0x0000000000000000-0x00000000df7fffff]
> > [ 0.000000] On node 0, zone DMA: 2048 pages in unavailable ranges
> > [ 0.000000] cma: Reserved 32 MiB at 0x00000000d9800000 on node -1
> > [ 0.000000] psci: probing for conduit method from DT.
> > [ 0.000000] psci: PSCIv1.0 detected in firmware.
> > [ 0.000000] psci: Using standard PSCI v0.2 function IDs
> > [ 0.000000] psci: Trusted OS migration not required
> > [ 0.000000] psci: SMC Calling Convention v1.1
> > [ 0.000000] percpu: Embedded 24 pages/cpu s58152 r8192 d31960 u98304
> > [ 0.000000] Detected VIPT I-cache on CPU0
> > [ 0.000000] CPU features: detected: Spectre-v2
> > [ 0.000000] CPU features: detected: Spectre-v4
> > [ 0.000000] CPU features: detected: Spectre-BHB
> > [ 0.000000] CPU features: detected: ARM erratum 858921
> > [ 0.000000] alternatives: applying boot alternatives
> > [ 0.000000] Kernel command line: root=UUID=a91e7bfe-4263-4e53-867d-7824e7c6a992 rw rootfstype=ext4 console=ttyS0,921600 no_console_suspend earlycon=ttyS0,0xfe078000 khadas_board=VIM4 androidboot.selinux=permissive androidboot.0
> > [ 0.000000] Unknown kernel command line parameters "khadas_board=VIM4", will be passed to user space.
> > [ 0.000000] Dentry cache hash table entries: 524288 (order: 10, 4194304 bytes, linear)
> > [ 0.000000] Inode-cache hash table entries: 262144 (order: 9, 2097152 bytes, linear)
> > [ 0.000000] Fallback order for Node 0: 0
> > [ 0.000000] Built 1 zonelists, mobility grouping on. Total pages: 901152
> > [ 0.000000] Policy zone: DMA
> > [ 0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off
> > [ 0.000000] software IO TLB: SWIOTLB bounce buffer size adjusted to 3MB
> > [ 0.000000] software IO TLB: area num 8.
> > [ 0.000000] software IO TLB: SWIOTLB bounce buffer size roundup to 4MB
> > [ 0.000000] software IO TLB: mapped [mem 0x00000000d8e00000-0x00000000d9200000] (4MB)
> > [ 0.000000] Memory: 3445944K/3661824K available (16896K kernel code, 4426K rwdata, 9184K rodata, 9728K init, 611K bss, 183112K reserved, 32768K cma-reserved)
> > [ 0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=8, Nodes=1
> > [ 0.000000] rcu: Preemptible hierarchical RCU implementation.
> > [ 0.000000] rcu: RCU restricting CPUs from NR_CPUS=256 to nr_cpu_ids=8.
> > [ 0.000000] Trampoline variant of Tasks RCU enabled.
> > [ 0.000000] Tracing variant of Tasks RCU enabled.
> > [ 0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 25 jiffies.
> > [ 0.000000] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=8
> > [ 0.000000] RCU Tasks: Setting shift to 3 and lim to 1 rcu_task_cb_adjust=1.
> > [ 0.000000] RCU Tasks Trace: Setting shift to 3 and lim to 1 rcu_task_cb_adjust=1.
> > [ 0.000000] NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0
> > [ 0.000000] GIC: GICv2 detected, but range too small and irqchip.gicv2_force_probe not set
> > [ 0.000000] Root IRQ handler: gic_handle_irq
> > [ 0.000000] rcu: srcu_init: Setting srcu_struct sizes based on contention.
> > [ 0.000000] arch_timer: Enabling local workaround for ARM erratum 858921
> > [ 0.000000] arch_timer: CPU0: Trapping CNTVCT access
> > [ 0.000000] arch_timer: cp15 timer(s) running at 24.00MHz (phys).
> > [ 0.000000] clocksource: arch_sys_counter: mask: 0xffffffffffffff max_cycles: 0x588fe9dc0, max_idle_ns: 440795202592 ns
> > [ 0.000000] sched_clock: 56 bits at 24MHz, resolution 41ns, wraps every 4398046511097ns
> > [ 0.000210] Console: colour dummy device 80x25
> > [ 0.000253] Calibrating delay loop (skipped), value calculated using timer frequency.. 48.00 BogoMIPS (lpj=96000)
> > [ 0.000261] pid_max: default: 32768 minimum: 301
> > [ 0.000300] LSM: initializing lsm=capability
> > [ 0.000358] Mount-cache hash table entries: 8192 (order: 4, 65536 bytes, linear)
> > [ 0.000371] Mountpoint-cache hash table entries: 8192 (order: 4, 65536 bytes, linear)
> > [ 0.000920] cacheinfo: Unable to detect cache hierarchy for CPU 0
> > [ 0.001389] rcu: Hierarchical SRCU implementation.
> > [ 0.001391] rcu: Max phase no-delay instances is 1000.
> > [ 0.001834] EFI services will not be available.
> > [ 0.001999] smp: Bringing up secondary CPUs ...
> > [ 0.002408] CPU features: detected: ARM erratum 845719
> > [ 0.002426] Detected VIPT I-cache on CPU1
> > [ 0.002516] CPU1: Booted secondary processor 0x0000000100 [0x410fd034]
> > [ 0.003007] Detected VIPT I-cache on CPU2
> > [ 0.003054] CPU2: Booted secondary processor 0x0000000101 [0x410fd034]
> > [ 0.003497] Detected VIPT I-cache on CPU3
> > [ 0.003546] CPU3: Booted secondary processor 0x0000000102 [0x410fd034]
> > [ 0.003988] Detected VIPT I-cache on CPU4
> > [ 0.004038] CPU4: Booted secondary processor 0x0000000103 [0x410fd034]
> > [ 0.004472] Detected VIPT I-cache on CPU5
> > [ 0.004509] arch_timer: Enabling local workaround for ARM erratum 858921
> > [ 0.004519] arch_timer: CPU5: Trapping CNTVCT access
> > [ 0.004527] CPU5: Booted secondary processor 0x0000000001 [0x410fd092]
> > [ 0.004915] Detected VIPT I-cache on CPU6
> > [ 0.004940] arch_timer: Enabling local workaround for ARM erratum 858921
> > [ 0.004946] arch_timer: CPU6: Trapping CNTVCT access
> > [ 0.004951] CPU6: Booted secondary processor 0x0000000002 [0x410fd092]
> > [ 0.005333] Detected VIPT I-cache on CPU7
> > [ 0.005358] arch_timer: Enabling local workaround for ARM erratum 858921
> > [ 0.005364] arch_timer: CPU7: Trapping CNTVCT access
> > [ 0.005369] CPU7: Booted secondary processor 0x0000000003 [0x410fd092]
> > [ 0.005414] smp: Brought up 1 node, 8 CPUs
> > [ 0.005419] SMP: Total of 8 processors activated.
> > [ 0.005421] CPU: All CPU(s) started at EL2
> > [ 0.005434] CPU features: detected: 32-bit EL0 Support
> > [ 0.005437] CPU features: detected: 32-bit EL1 Support
> > [ 0.005440] CPU features: detected: CRC32 instructions
> > [ 0.005485] alternatives: applying system-wide alternatives
> > [ 0.006730] devtmpfs: initialized
> > [ 0.008534] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645041785100000 ns
> > [ 0.008545] futex hash table entries: 2048 (order: 5, 131072 bytes, linear)
> > [ 0.008989] pinctrl core: initialized pinctrl subsystem
> > [ 0.009581] DMI not present or invalid.
> > [ 0.011290] NET: Registered PF_NETLINK/PF_ROUTE protocol family
> > [ 0.011944] DMA: preallocated 512 KiB GFP_KERNEL pool for atomic allocations
> > [ 0.012293] DMA: preallocated 512 KiB GFP_KERNEL|GFP_DMA pool for atomic allocations
> > [ 0.012711] DMA: preallocated 512 KiB GFP_KERNEL|GFP_DMA32 pool for atomic allocations
> > [ 0.012832] audit: initializing netlink subsys (disabled)
> > [ 0.013075] audit: type=2000 audit(0.012:1): state=initialized audit_enabled=0 res=1
> > [ 0.013508] thermal_sys: Registered thermal governor 'step_wise'
> > [ 0.013512] thermal_sys: Registered thermal governor 'power_allocator'
> > [ 0.013557] cpuidle: using governor menu
> > [ 0.013675] hw-breakpoint: found 6 breakpoint and 4 watchpoint registers.
> > [ 0.013784] ASID allocator initialised with 65536 entries
> > [ 0.014630] Serial: AMBA PL011 UART driver
> > [ 0.017553] Modules: 22496 pages in range for non-PLT usage
> > [ 0.017556] Modules: 514016 pages in range for PLT usage
> > [ 0.017980] HugeTLB: registered 1.00 GiB page size, pre-allocated 0 pages
> > [ 0.017984] HugeTLB: 0 KiB vmemmap can be freed for a 1.00 GiB page
> > [ 0.017988] HugeTLB: registered 32.0 MiB page size, pre-allocated 0 pages
> > [ 0.017990] HugeTLB: 0 KiB vmemmap can be freed for a 32.0 MiB page
> > [ 0.017993] HugeTLB: registered 2.00 MiB page size, pre-allocated 0 pages
> > [ 0.017995] HugeTLB: 0 KiB vmemmap can be freed for a 2.00 MiB page
> > [ 0.017997] HugeTLB: registered 64.0 KiB page size, pre-allocated 0 pages
> > [ 0.018000] HugeTLB: 0 KiB vmemmap can be freed for a 64.0 KiB page
> > [ 0.018247] Demotion targets for Node 0: null
> > [ 0.018884] ACPI: Interpreter disabled.
> > [ 0.019584] iommu: Default domain type: Translated
> > [ 0.019587] iommu: DMA domain TLB invalidation policy: strict mode
> > [ 0.019979] SCSI subsystem initialized
> > [ 0.020174] usbcore: registered new interface driver usbfs
> > [ 0.020187] usbcore: registered new interface driver hub
> > [ 0.020200] usbcore: registered new device driver usb
> > [ 0.020434] pps_core: LinuxPPS API ver. 1 registered
> > [ 0.020437] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <[email protected]>
> > [ 0.020443] PTP clock support registered
> > [ 0.020487] EDAC MC: Ver: 3.0.0
> > [ 0.020717] scmi_core: SCMI protocol bus registered
> > [ 0.021039] FPGA manager framework
> > [ 0.021076] Advanced Linux Sound Architecture Driver Initialized.
> > [ 0.021612] vgaarb: loaded
> > [ 0.021857] clocksource: Switched to clocksource arch_sys_counter
> > [ 0.021967] VFS: Disk quotas dquot_6.6.0
> > [ 0.021984] VFS: Dquot-cache hash table entries: 512 (order 0, 4096 bytes)
> > [ 0.022062] pnp: PnP ACPI: disabled
> > [ 0.026651] NET: Registered PF_INET protocol family
> > [ 0.026781] IP idents hash table entries: 65536 (order: 7, 524288 bytes, linear)
> > [ 0.028598] tcp_listen_portaddr_hash hash table entries: 2048 (order: 3, 32768 bytes, linear)
> > [ 0.028615] Table-perturb hash table entries: 65536 (order: 6, 262144 bytes, linear)
> > [ 0.028622] TCP established hash table entries: 32768 (order: 6, 262144 bytes, linear)
> > [ 0.028750] TCP bind hash table entries: 32768 (order: 8, 1048576 bytes, linear)
> > [ 0.029019] TCP: Hash tables configured (established 32768 bind 32768)
> > [ 0.029096] UDP hash table entries: 2048 (order: 4, 65536 bytes, linear)
> > [ 0.029124] UDP-Lite hash table entries: 2048 (order: 4, 65536 bytes, linear)
> > [ 0.029225] NET: Registered PF_UNIX/PF_LOCAL protocol family
> > [ 0.029506] RPC: Registered named UNIX socket transport module.
> > [ 0.029510] RPC: Registered udp transport module.
> > [ 0.029512] RPC: Registered tcp transport module.
> > [ 0.029513] RPC: Registered tcp-with-tls transport module.
> > [ 0.029515] RPC: Registered tcp NFSv4.1 backchannel transport module.
> > [ 0.029524] PCI: CLS 0 bytes, default 64
> > [ 0.029649] Unpacking initramfs...
> > [ 0.033933] kvm [1]: IPA Size Limit: 40 bits
> > [ 0.034713] kvm [1]: Hyp mode initialized successfully
> > [ 0.035476] Initialise system trusted keyrings
> > [ 0.035582] workingset: timestamp_bits=42 max_order=20 bucket_order=0
> > [ 0.035747] squashfs: version 4.0 (2009/01/31) Phillip Lougher
> > [ 0.035906] NFS: Registering the id_resolver key type
> > [ 0.035919] Key type id_resolver registered
> > [ 0.035922] Key type id_legacy registered
> > [ 0.035933] nfs4filelayout_init: NFSv4 File Layout Driver Registering...
> > [ 0.035935] nfs4flexfilelayout_init: NFSv4 Flexfile Layout Driver Registering...
> > [ 0.036031] 9p: Installing v9fs 9p2000 file system support
> > [ 0.062587] Key type asymmetric registered
> > [ 0.062596] Asymmetric key parser 'x509' registered
> > [ 0.062657] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 245)
> > [ 0.062661] io scheduler mq-deadline registered
> > [ 0.062664] io scheduler kyber registered
> > [ 0.062688] io scheduler bfq registered
> > [ 0.063318] irq_meson_gpio: 157 to 12 gpio interrupt mux initialized
> > [ 0.068061] EINJ: ACPI disabled.
> > [ 0.072570] amlogic_t7_pll_probe
> > [ 0.072855] amlogic_t7_pll_probe ret 0
> > [ 0.072943] amlogic_a1_periphs_probe
> > [ 0.078155] amlogic_a1_periphs_probe ret 0
> > [ 0.084876] Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled
> > [ 0.086691] fe078000.serial: ttyS0 at MMIO 0xfe078000 (irq = 14, base_baud = 1500000) is a meson_uart
> > [ 0.086710] printk: legacy console [ttyS0] enabled
> > [ 0.229167] sysfs: cannot create duplicate filename '/class/tty/ttyS0'
> > [ 0.229669] CPU: 3 PID: 1 Comm: swapper/0 Not tainted 6.8.0-09793-gda876e5b54b3-dirty #15
> > [ 0.230684] Hardware name: Khadas vim4 (DT)
> > [ 0.231205] Call trace:
> > [ 0.231509] dump_backtrace+0x94/0xec
> > [ 0.231963] show_stack+0x18/0x24
> > [ 0.232374] dump_stack_lvl+0x78/0x90
> > [ 0.232829] dump_stack+0x18/0x24
> > [ 0.233241] sysfs_warn_dup+0x64/0x80
> > [ 0.233696] sysfs_do_create_link_sd+0xf0/0xf8
> > [ 0.234248] sysfs_create_link+0x20/0x40
> > [ 0.234736] device_add+0x27c/0x77c
> > [ 0.235169] device_register+0x20/0x30
> > [ 0.235635] tty_register_device_attr+0xfc/0x240
> > [ 0.236209] tty_port_register_device_attr_serdev+0x8c/0xac
> > [ 0.236902] serial_core_register_port+0x318/0x658
> > [ 0.237498] serial_ctrl_register_port+0x10/0x1c
> > [ 0.238072] uart_add_one_port+0x10/0x1c
> > [ 0.238560] meson_uart_probe+0x2c0/0x3b4
> > [ 0.239058] platform_probe+0x68/0xd8
> > [ 0.239513] really_probe+0x148/0x2b4
> > [ 0.239968] __driver_probe_device+0x78/0x12c
> > [ 0.240510] driver_probe_device+0xdc/0x160
> > [ 0.241030] __driver_attach+0x94/0x19c
> > [ 0.241507] bus_for_each_dev+0x74/0xd4
> > [ 0.241983] driver_attach+0x24/0x30
> > [ 0.242428] bus_add_driver+0xe4/0x1e8
> > [ 0.242893] driver_register+0x60/0x128
> > [ 0.243370] __platform_driver_register+0x28/0x34
> > [ 0.243955] meson_uart_platform_driver_init+0x1c/0x28
> > [ 0.244594] do_one_initcall+0x6c/0x1b0
> > [ 0.245071] kernel_init_freeable+0x1cc/0x294
> > [ 0.245613] kernel_init+0x20/0x1dc
> > [ 0.246046] ret_from_fork+0x10/0x20
> > [ 0.246555] meson_uart fe078000.serial: Cannot register tty device on line 0
> > [ 0.247729] msm_serial: driver initialized
> > [ 0.248150] SuperH (H)SCI(F) driver initialized
> > [ 0.248544] STM32 USART driver initialized
> > [ 0.263927] loop: module loaded
> > [ 0.264952] megasas: 07.727.03.00-rc1
> > [ 0.271065] tun: Universal TUN/TAP device driver, 1.6
> > [ 0.271824] thunder_xcv, ver 1.0
> > [ 0.271878] thunder_bgx, ver 1.0
> > [ 0.271956] nicpf, ver 1.0
> > [ 0.273230] hns3: Hisilicon Ethernet Network Driver for Hip08 Family - version
> > [ 0.273437] hns3: Copyright (c) 2017 Huawei Corporation.
> > [ 0.274148] hclge is initializing
> > [ 0.274541] e1000: Intel(R) PRO/1000 Network Driver
> > [ 0.275116] e1000: Copyright (c) 1999-2006 Intel Corporation.
> > [ 0.275860] e1000e: Intel(R) PRO/1000 Network Driver
> > [ 0.276449] e1000e: Copyright(c) 1999 - 2015 Intel Corporation.
> > [ 0.277209] igb: Intel(R) Gigabit Ethernet Network Driver
> > [ 0.277867] igb: Copyright (c) 2007-2014 Intel Corporation.
> > [ 0.278576] igbvf: Intel(R) Gigabit Virtual Function Network Driver
> > [ 0.279330] igbvf: Copyright (c) 2009 - 2012 Intel Corporation.
> > [ 0.280319] sky2: driver version 1.30
> > [ 0.281597] VFIO - User Level meta-driver version: 0.3
> > [ 0.283859] usbcore: registered new interface driver usb-storage
> > [ 0.286328] i2c_dev: i2c /dev entries driver
> > [ 0.292404] sdhci: Secure Digital Host Controller Interface driver
> > [ 0.292481] sdhci: Copyright(c) Pierre Ossman
> > [ 0.293577] Synopsys Designware Multimedia Card Interface Driver
> > [ 0.294572] sdhci-pltfm: SDHCI platform and OF driver helper
> > [ 0.296259] ledtrig-cpu: registered to indicate activity on CPUs
> > [ 0.298966] meson-sm: secure-monitor enabled
> > [ 0.299963] usbcore: registered new interface driver usbhid
> > [ 0.299997] usbhid: USB HID core driver
> > [ 0.306803] NET: Registered PF_PACKET protocol family
> > [ 0.306919] 9pnet: Installing 9P2000 support
> > [ 0.307331] Key type dns_resolver registered
> > [ 0.318926] Timer migration: 1 hierarchy levels; 8 children per group; 1 crossnode level
> > [ 0.319462] registered taskstats version 1
> > [ 0.319968] Loading compiled-in X.509 certificates
> > [ 0.362771] clk: Disabling unused clocks
> > [ 0.363100] PM: genpd: Disabling unused power domains
> > [ 0.363383] ALSA device list:
> > [ 0.363580] No soundcards found.
> > [ 0.368194] meson-gx-mmc fe08a000.sd: Got CD GPIO
> > [ 0.368524] SError Interrupt on CPU6, code 0x00000000bf000002 -- SError
> > [ 0.368531] CPU: 6 PID: 87 Comm: kworker/u32:3 Not tainted 6.8.0-09793-gda876e5b54b3-dirty #15
> > [ 0.368537] Hardware name: Khadas vim4 (DT)
> > [ 0.368540] Workqueue: async async_run_entry_fn
> > [ 0.368552] pstate: 20000005 (nzCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
> > [ 0.368556] pc : clk_mux_val_to_index+0x0/0xc0
> > [ 0.368565] lr : clk_mux_get_parent+0x4c/0x84
> > [ 0.368571] sp : ffff800082efba10
> > [ 0.368572] x29: ffff800082efba10 x28: ffff8000823279c0 x27: ffff800082327000
> > [ 0.368578] x26: ffff000004c361c0 x25: 0000000000000000 x24: 0000000000000002
> > [ 0.368584] x23: ffff000003f1d300 x22: ffff000003f1d2a0 x21: ffff000004c37280
> > [ 0.368589] x20: ffff000004c36ec0 x19: ffff000004bba800 x18: 0000000000000020
> > [ 0.368594] x17: ffff000000022000 x16: 0000000000000003 x15: ffffffffffffffff
> > [ 0.368599] x14: ffffffffffffffff x13: 0078756d2364732e x12: 3030306138306566
> > [ 0.368604] x11: 7f7f7f7f7f7f7f7f x10: ffff7fff83438910 x9 : 0000000000000005
> > [ 0.368609] x8 : 0101010101010101 x7 : 0000000000000000 x6 : 05114367045e5359
> > [ 0.368613] x5 : 0000000000000006 x4 : 0000000000000000 x3 : 0000000000000000
> > [ 0.368618] x2 : 0000000000000000 x1 : 0000000000000000 x0 : ffff000004c36ec0
> > [ 0.368624] Kernel panic - not syncing: Asynchronous SError Interrupt
> > [ 0.368626] CPU: 6 PID: 87 Comm: kworker/u32:3 Not tainted 6.8.0-09793-gda876e5b54b3-dirty #15
> > [ 0.368630] Hardware name: Khadas vim4 (DT)
> > [ 0.368631] Workqueue: async async_run_entry_fn
> > [ 0.368635] Call trace:
> > [ 0.368637] dump_backtrace+0x94/0xec
> > [ 0.368644] show_stack+0x18/0x24
> > [ 0.368649] dump_stack_lvl+0x38/0x90
> > [ 0.368656] dump_stack+0x18/0x24
> > [ 0.368661] panic+0x388/0x3c8
> > [ 0.368666] nmi_panic+0x48/0x94
> > [ 0.368670] arm64_serror_panic+0x6c/0x78
> > [ 0.368674] do_serror+0x3c/0x78
> > [ 0.368677] el1h_64_error_handler+0x30/0x48
> > [ 0.368681] el1h_64_error+0x64/0x68
> > [ 0.368684] clk_mux_val_to_index+0x0/0xc0
> > [ 0.368689] __clk_register+0x440/0x82c
> > [ 0.368693] devm_clk_register+0x5c/0xbc
> > [ 0.368697] meson_mmc_clk_init+0x11c/0x2a8
> > [ 0.368702] meson_mmc_probe+0x18c/0x3c0
> > [ 0.368705] platform_probe+0x68/0xd8
> > [ 0.368711] really_probe+0x148/0x2b4
> > [ 0.368714] __driver_probe_device+0x78/0x12c
> > [ 0.368718] driver_probe_device+0xdc/0x160
> > [ 0.368721] __device_attach_driver+0xb8/0x134
> > [ 0.368724] bus_for_each_drv+0x84/0xe0
> > [ 0.368727] __device_attach_async_helper+0xac/0xd0
> > [ 0.368730] async_run_entry_fn+0x34/0xe0
> > [ 0.368734] process_one_work+0x150/0x294
> > [ 0.368740] worker_thread+0x304/0x408
> > [ 0.368744] kthread+0x118/0x11c
> > [ 0.368748] ret_from_fork+0x10/0x20
> > [ 0.368753] SMP: stopping secondary CPUs
> > [ 0.368760] Kernel Offset: disabled
> > [ 0.368761] CPU features: 0x0,00000060,d0080000,0200421b
> > [ 0.368765] Memory Limit: none
> > [ 0.400328] ---[ end Kernel panic - not syncing: Asynchronous SError Interrupt ]---
> >
> >
> > --
> > 2.44.0
> >

2024-04-07 10:09:05

by Xianwei Zhao

[permalink] [raw]
Subject: Re: [RFC][PATCH 0/2] Amlogic T7 (A113D2) Clock Driver

Hi Lucas,
Thanks for your reply.

On 2024/4/3 16:12, Lucas Tanure wrote:
> [ EXTERNAL EMAIL ]
>
> On Wed, Apr 3, 2024 at 7:44 AM Xianwei Zhao <[email protected]> wrote:
>>
>> Hi Lucas,
>> As we are preparing the T7 clock patchset, we would like to your
>> purpose and plan of this RFC patches. Are you going to submit these
>> patches at last?
>
> Hi Xianwei,
>
> I made some progress, and now the SD card controller probes but fails
> to read blocks from the SD card. I do think my port of the clock
> driver is okay, but I will not send my clock driver until the SD card
> fully works, so I am sure the clocking driver is tested.
> But if you have something already done, please send it, and I will
> test and review it from my side.
>
> Any help with the sdcard controller is also much appreciated.
> The SDCard part works well on our clock patchset. Then we will send the
formal clock submission later. What do you think?
> Thanks
> Lucas
>
>> On 2024/3/18 19:43, Lucas Tanure wrote:
>>> [ EXTERNAL EMAIL ]
>>>
>>> I am trying to port the T7 clock driver from Khadas 5.4 kernel for Vim4
>>> to mainline, but I am encountering some issues in the path.
>>>
>>> The kernel panics at clk_mux_val_to_index, but I believe that all the
>>> needed clocks are registered.
>>>
>>> If anyone from Amlogic or the community could help me understand what
>>> my driver is missing, that would be great.
>>> I will continue to try to figure out, but it has been some weeks
>>> without progress =/.
>>>
>>> Lucas Tanure (2):
>>> clk: meson: T7: add support for Amlogic T7 SoC PLL clock driver
>>> arm64: dts: amlogic: t7: SDCard, Ethernet and Clocking
>>>
>>> .../amlogic/amlogic-t7-a311d2-khadas-vim4.dts | 66 +
>>> arch/arm64/boot/dts/amlogic/amlogic-t7.dtsi | 189 +
>>> drivers/clk/meson/Kconfig | 25 +
>>> drivers/clk/meson/Makefile | 2 +
>>> drivers/clk/meson/t7-peripherals.c | 6368 +++++++++++++++++
>>> drivers/clk/meson/t7-peripherals.h | 131 +
>>> drivers/clk/meson/t7-pll.c | 1543 ++++
>>> drivers/clk/meson/t7-pll.h | 83 +
>>> .../clock/amlogic,t7-peripherals-clkc.h | 410 ++
>>> .../dt-bindings/clock/amlogic,t7-pll-clkc.h | 69 +
>>> 10 files changed, 8886 insertions(+)
>>> create mode 100644 drivers/clk/meson/t7-peripherals.c
>>> create mode 100644 drivers/clk/meson/t7-peripherals.h
>>> create mode 100644 drivers/clk/meson/t7-pll.c
>>> create mode 100644 drivers/clk/meson/t7-pll.h
>>> create mode 100644 include/dt-bindings/clock/amlogic,t7-peripherals-clkc.h
>>> create mode 100644 include/dt-bindings/clock/amlogic,t7-pll-clkc.h
>>>
>>> Starting kernel ...
>>>
>>> uboot time: 14277917 us
>>> boot 64bit kernel
>>> [ 0.000000] Booting Linux on physical CPU 0x0000000000 [0x410fd092]
>>> [ 0.000000] Linux version 6.8.0-09793-gda876e5b54b3-dirty (tanureal@ryzen) (aarch64-none-linux-gnu-gcc (GNU Toolchain for the A-profile Architecture 10.3-2021.07 (arm-10.29)) 10.3.1 20210621, GNU ld (GNU Toolchain for the A-pr4
>>> [ 0.000000] KASLR disabled due to lack of seed
>>> [ 0.000000] Machine model: Khadas vim4
>>> [ 0.000000] efi: UEFI not found.
>>> [ 0.000000] OF: reserved mem: 0x0000000005000000..0x00000000052fffff (3072 KiB) nomap non-reusable secmon@5000000
>>> [ 0.000000] OF: reserved mem: 0x0000000005300000..0x00000000072fffff (32768 KiB) nomap non-reusable secmon@5300000
>>> [ 0.000000] NUMA: No NUMA configuration found
>>> [ 0.000000] NUMA: Faking a node at [mem 0x0000000000000000-0x00000000df7fffff]
>>> [ 0.000000] NUMA: NODE_DATA [mem 0xdf10c9c0-0xdf10efff]
>>> [ 0.000000] Zone ranges:
>>> [ 0.000000] DMA [mem 0x0000000000000000-0x00000000df7fffff]
>>> [ 0.000000] DMA32 empty
>>> [ 0.000000] Normal empty
>>> [ 0.000000] Movable zone start for each node
>>> [ 0.000000] Early memory node ranges
>>> [ 0.000000] node 0: [mem 0x0000000000000000-0x0000000004ffffff]
>>> [ 0.000000] node 0: [mem 0x0000000005000000-0x00000000072fffff]
>>> [ 0.000000] node 0: [mem 0x0000000007300000-0x00000000df7fffff]
>>> [ 0.000000] Initmem setup node 0 [mem 0x0000000000000000-0x00000000df7fffff]
>>> [ 0.000000] On node 0, zone DMA: 2048 pages in unavailable ranges
>>> [ 0.000000] cma: Reserved 32 MiB at 0x00000000d9800000 on node -1
>>> [ 0.000000] psci: probing for conduit method from DT.
>>> [ 0.000000] psci: PSCIv1.0 detected in firmware.
>>> [ 0.000000] psci: Using standard PSCI v0.2 function IDs
>>> [ 0.000000] psci: Trusted OS migration not required
>>> [ 0.000000] psci: SMC Calling Convention v1.1
>>> [ 0.000000] percpu: Embedded 24 pages/cpu s58152 r8192 d31960 u98304
>>> [ 0.000000] Detected VIPT I-cache on CPU0
>>> [ 0.000000] CPU features: detected: Spectre-v2
>>> [ 0.000000] CPU features: detected: Spectre-v4
>>> [ 0.000000] CPU features: detected: Spectre-BHB
>>> [ 0.000000] CPU features: detected: ARM erratum 858921
>>> [ 0.000000] alternatives: applying boot alternatives
>>> [ 0.000000] Kernel command line: root=UUID=a91e7bfe-4263-4e53-867d-7824e7c6a992 rw rootfstype=ext4 console=ttyS0,921600 no_console_suspend earlycon=ttyS0,0xfe078000 khadas_board=VIM4 androidboot.selinux=permissive androidboot.0
>>> [ 0.000000] Unknown kernel command line parameters "khadas_board=VIM4", will be passed to user space.
>>> [ 0.000000] Dentry cache hash table entries: 524288 (order: 10, 4194304 bytes, linear)
>>> [ 0.000000] Inode-cache hash table entries: 262144 (order: 9, 2097152 bytes, linear)
>>> [ 0.000000] Fallback order for Node 0: 0
>>> [ 0.000000] Built 1 zonelists, mobility grouping on. Total pages: 901152
>>> [ 0.000000] Policy zone: DMA
>>> [ 0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off
>>> [ 0.000000] software IO TLB: SWIOTLB bounce buffer size adjusted to 3MB
>>> [ 0.000000] software IO TLB: area num 8.
>>> [ 0.000000] software IO TLB: SWIOTLB bounce buffer size roundup to 4MB
>>> [ 0.000000] software IO TLB: mapped [mem 0x00000000d8e00000-0x00000000d9200000] (4MB)
>>> [ 0.000000] Memory: 3445944K/3661824K available (16896K kernel code, 4426K rwdata, 9184K rodata, 9728K init, 611K bss, 183112K reserved, 32768K cma-reserved)
>>> [ 0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=8, Nodes=1
>>> [ 0.000000] rcu: Preemptible hierarchical RCU implementation.
>>> [ 0.000000] rcu: RCU restricting CPUs from NR_CPUS=256 to nr_cpu_ids=8.
>>> [ 0.000000] Trampoline variant of Tasks RCU enabled.
>>> [ 0.000000] Tracing variant of Tasks RCU enabled.
>>> [ 0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 25 jiffies.
>>> [ 0.000000] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=8
>>> [ 0.000000] RCU Tasks: Setting shift to 3 and lim to 1 rcu_task_cb_adjust=1.
>>> [ 0.000000] RCU Tasks Trace: Setting shift to 3 and lim to 1 rcu_task_cb_adjust=1.
>>> [ 0.000000] NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0
>>> [ 0.000000] GIC: GICv2 detected, but range too small and irqchip.gicv2_force_probe not set
>>> [ 0.000000] Root IRQ handler: gic_handle_irq
>>> [ 0.000000] rcu: srcu_init: Setting srcu_struct sizes based on contention.
>>> [ 0.000000] arch_timer: Enabling local workaround for ARM erratum 858921
>>> [ 0.000000] arch_timer: CPU0: Trapping CNTVCT access
>>> [ 0.000000] arch_timer: cp15 timer(s) running at 24.00MHz (phys).
>>> [ 0.000000] clocksource: arch_sys_counter: mask: 0xffffffffffffff max_cycles: 0x588fe9dc0, max_idle_ns: 440795202592 ns
>>> [ 0.000000] sched_clock: 56 bits at 24MHz, resolution 41ns, wraps every 4398046511097ns
>>> [ 0.000210] Console: colour dummy device 80x25
>>> [ 0.000253] Calibrating delay loop (skipped), value calculated using timer frequency.. 48.00 BogoMIPS (lpj=96000)
>>> [ 0.000261] pid_max: default: 32768 minimum: 301
>>> [ 0.000300] LSM: initializing lsm=capability
>>> [ 0.000358] Mount-cache hash table entries: 8192 (order: 4, 65536 bytes, linear)
>>> [ 0.000371] Mountpoint-cache hash table entries: 8192 (order: 4, 65536 bytes, linear)
>>> [ 0.000920] cacheinfo: Unable to detect cache hierarchy for CPU 0
>>> [ 0.001389] rcu: Hierarchical SRCU implementation.
>>> [ 0.001391] rcu: Max phase no-delay instances is 1000.
>>> [ 0.001834] EFI services will not be available.
>>> [ 0.001999] smp: Bringing up secondary CPUs ...
>>> [ 0.002408] CPU features: detected: ARM erratum 845719
>>> [ 0.002426] Detected VIPT I-cache on CPU1
>>> [ 0.002516] CPU1: Booted secondary processor 0x0000000100 [0x410fd034]
>>> [ 0.003007] Detected VIPT I-cache on CPU2
>>> [ 0.003054] CPU2: Booted secondary processor 0x0000000101 [0x410fd034]
>>> [ 0.003497] Detected VIPT I-cache on CPU3
>>> [ 0.003546] CPU3: Booted secondary processor 0x0000000102 [0x410fd034]
>>> [ 0.003988] Detected VIPT I-cache on CPU4
>>> [ 0.004038] CPU4: Booted secondary processor 0x0000000103 [0x410fd034]
>>> [ 0.004472] Detected VIPT I-cache on CPU5
>>> [ 0.004509] arch_timer: Enabling local workaround for ARM erratum 858921
>>> [ 0.004519] arch_timer: CPU5: Trapping CNTVCT access
>>> [ 0.004527] CPU5: Booted secondary processor 0x0000000001 [0x410fd092]
>>> [ 0.004915] Detected VIPT I-cache on CPU6
>>> [ 0.004940] arch_timer: Enabling local workaround for ARM erratum 858921
>>> [ 0.004946] arch_timer: CPU6: Trapping CNTVCT access
>>> [ 0.004951] CPU6: Booted secondary processor 0x0000000002 [0x410fd092]
>>> [ 0.005333] Detected VIPT I-cache on CPU7
>>> [ 0.005358] arch_timer: Enabling local workaround for ARM erratum 858921
>>> [ 0.005364] arch_timer: CPU7: Trapping CNTVCT access
>>> [ 0.005369] CPU7: Booted secondary processor 0x0000000003 [0x410fd092]
>>> [ 0.005414] smp: Brought up 1 node, 8 CPUs
>>> [ 0.005419] SMP: Total of 8 processors activated.
>>> [ 0.005421] CPU: All CPU(s) started at EL2
>>> [ 0.005434] CPU features: detected: 32-bit EL0 Support
>>> [ 0.005437] CPU features: detected: 32-bit EL1 Support
>>> [ 0.005440] CPU features: detected: CRC32 instructions
>>> [ 0.005485] alternatives: applying system-wide alternatives
>>> [ 0.006730] devtmpfs: initialized
>>> [ 0.008534] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645041785100000 ns
>>> [ 0.008545] futex hash table entries: 2048 (order: 5, 131072 bytes, linear)
>>> [ 0.008989] pinctrl core: initialized pinctrl subsystem
>>> [ 0.009581] DMI not present or invalid.
>>> [ 0.011290] NET: Registered PF_NETLINK/PF_ROUTE protocol family
>>> [ 0.011944] DMA: preallocated 512 KiB GFP_KERNEL pool for atomic allocations
>>> [ 0.012293] DMA: preallocated 512 KiB GFP_KERNEL|GFP_DMA pool for atomic allocations
>>> [ 0.012711] DMA: preallocated 512 KiB GFP_KERNEL|GFP_DMA32 pool for atomic allocations
>>> [ 0.012832] audit: initializing netlink subsys (disabled)
>>> [ 0.013075] audit: type=2000 audit(0.012:1): state=initialized audit_enabled=0 res=1
>>> [ 0.013508] thermal_sys: Registered thermal governor 'step_wise'
>>> [ 0.013512] thermal_sys: Registered thermal governor 'power_allocator'
>>> [ 0.013557] cpuidle: using governor menu
>>> [ 0.013675] hw-breakpoint: found 6 breakpoint and 4 watchpoint registers.
>>> [ 0.013784] ASID allocator initialised with 65536 entries
>>> [ 0.014630] Serial: AMBA PL011 UART driver
>>> [ 0.017553] Modules: 22496 pages in range for non-PLT usage
>>> [ 0.017556] Modules: 514016 pages in range for PLT usage
>>> [ 0.017980] HugeTLB: registered 1.00 GiB page size, pre-allocated 0 pages
>>> [ 0.017984] HugeTLB: 0 KiB vmemmap can be freed for a 1.00 GiB page
>>> [ 0.017988] HugeTLB: registered 32.0 MiB page size, pre-allocated 0 pages
>>> [ 0.017990] HugeTLB: 0 KiB vmemmap can be freed for a 32.0 MiB page
>>> [ 0.017993] HugeTLB: registered 2.00 MiB page size, pre-allocated 0 pages
>>> [ 0.017995] HugeTLB: 0 KiB vmemmap can be freed for a 2.00 MiB page
>>> [ 0.017997] HugeTLB: registered 64.0 KiB page size, pre-allocated 0 pages
>>> [ 0.018000] HugeTLB: 0 KiB vmemmap can be freed for a 64.0 KiB page
>>> [ 0.018247] Demotion targets for Node 0: null
>>> [ 0.018884] ACPI: Interpreter disabled.
>>> [ 0.019584] iommu: Default domain type: Translated
>>> [ 0.019587] iommu: DMA domain TLB invalidation policy: strict mode
>>> [ 0.019979] SCSI subsystem initialized
>>> [ 0.020174] usbcore: registered new interface driver usbfs
>>> [ 0.020187] usbcore: registered new interface driver hub
>>> [ 0.020200] usbcore: registered new device driver usb
>>> [ 0.020434] pps_core: LinuxPPS API ver. 1 registered
>>> [ 0.020437] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <[email protected]>
>>> [ 0.020443] PTP clock support registered
>>> [ 0.020487] EDAC MC: Ver: 3.0.0
>>> [ 0.020717] scmi_core: SCMI protocol bus registered
>>> [ 0.021039] FPGA manager framework
>>> [ 0.021076] Advanced Linux Sound Architecture Driver Initialized.
>>> [ 0.021612] vgaarb: loaded
>>> [ 0.021857] clocksource: Switched to clocksource arch_sys_counter
>>> [ 0.021967] VFS: Disk quotas dquot_6.6.0
>>> [ 0.021984] VFS: Dquot-cache hash table entries: 512 (order 0, 4096 bytes)
>>> [ 0.022062] pnp: PnP ACPI: disabled
>>> [ 0.026651] NET: Registered PF_INET protocol family
>>> [ 0.026781] IP idents hash table entries: 65536 (order: 7, 524288 bytes, linear)
>>> [ 0.028598] tcp_listen_portaddr_hash hash table entries: 2048 (order: 3, 32768 bytes, linear)
>>> [ 0.028615] Table-perturb hash table entries: 65536 (order: 6, 262144 bytes, linear)
>>> [ 0.028622] TCP established hash table entries: 32768 (order: 6, 262144 bytes, linear)
>>> [ 0.028750] TCP bind hash table entries: 32768 (order: 8, 1048576 bytes, linear)
>>> [ 0.029019] TCP: Hash tables configured (established 32768 bind 32768)
>>> [ 0.029096] UDP hash table entries: 2048 (order: 4, 65536 bytes, linear)
>>> [ 0.029124] UDP-Lite hash table entries: 2048 (order: 4, 65536 bytes, linear)
>>> [ 0.029225] NET: Registered PF_UNIX/PF_LOCAL protocol family
>>> [ 0.029506] RPC: Registered named UNIX socket transport module.
>>> [ 0.029510] RPC: Registered udp transport module.
>>> [ 0.029512] RPC: Registered tcp transport module.
>>> [ 0.029513] RPC: Registered tcp-with-tls transport module.
>>> [ 0.029515] RPC: Registered tcp NFSv4.1 backchannel transport module.
>>> [ 0.029524] PCI: CLS 0 bytes, default 64
>>> [ 0.029649] Unpacking initramfs...
>>> [ 0.033933] kvm [1]: IPA Size Limit: 40 bits
>>> [ 0.034713] kvm [1]: Hyp mode initialized successfully
>>> [ 0.035476] Initialise system trusted keyrings
>>> [ 0.035582] workingset: timestamp_bits=42 max_order=20 bucket_order=0
>>> [ 0.035747] squashfs: version 4.0 (2009/01/31) Phillip Lougher
>>> [ 0.035906] NFS: Registering the id_resolver key type
>>> [ 0.035919] Key type id_resolver registered
>>> [ 0.035922] Key type id_legacy registered
>>> [ 0.035933] nfs4filelayout_init: NFSv4 File Layout Driver Registering...
>>> [ 0.035935] nfs4flexfilelayout_init: NFSv4 Flexfile Layout Driver Registering...
>>> [ 0.036031] 9p: Installing v9fs 9p2000 file system support
>>> [ 0.062587] Key type asymmetric registered
>>> [ 0.062596] Asymmetric key parser 'x509' registered
>>> [ 0.062657] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 245)
>>> [ 0.062661] io scheduler mq-deadline registered
>>> [ 0.062664] io scheduler kyber registered
>>> [ 0.062688] io scheduler bfq registered
>>> [ 0.063318] irq_meson_gpio: 157 to 12 gpio interrupt mux initialized
>>> [ 0.068061] EINJ: ACPI disabled.
>>> [ 0.072570] amlogic_t7_pll_probe
>>> [ 0.072855] amlogic_t7_pll_probe ret 0
>>> [ 0.072943] amlogic_a1_periphs_probe
>>> [ 0.078155] amlogic_a1_periphs_probe ret 0
>>> [ 0.084876] Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled
>>> [ 0.086691] fe078000.serial: ttyS0 at MMIO 0xfe078000 (irq = 14, base_baud = 1500000) is a meson_uart
>>> [ 0.086710] printk: legacy console [ttyS0] enabled
>>> [ 0.229167] sysfs: cannot create duplicate filename '/class/tty/ttyS0'
>>> [ 0.229669] CPU: 3 PID: 1 Comm: swapper/0 Not tainted 6.8.0-09793-gda876e5b54b3-dirty #15
>>> [ 0.230684] Hardware name: Khadas vim4 (DT)
>>> [ 0.231205] Call trace:
>>> [ 0.231509] dump_backtrace+0x94/0xec
>>> [ 0.231963] show_stack+0x18/0x24
>>> [ 0.232374] dump_stack_lvl+0x78/0x90
>>> [ 0.232829] dump_stack+0x18/0x24
>>> [ 0.233241] sysfs_warn_dup+0x64/0x80
>>> [ 0.233696] sysfs_do_create_link_sd+0xf0/0xf8
>>> [ 0.234248] sysfs_create_link+0x20/0x40
>>> [ 0.234736] device_add+0x27c/0x77c
>>> [ 0.235169] device_register+0x20/0x30
>>> [ 0.235635] tty_register_device_attr+0xfc/0x240
>>> [ 0.236209] tty_port_register_device_attr_serdev+0x8c/0xac
>>> [ 0.236902] serial_core_register_port+0x318/0x658
>>> [ 0.237498] serial_ctrl_register_port+0x10/0x1c
>>> [ 0.238072] uart_add_one_port+0x10/0x1c
>>> [ 0.238560] meson_uart_probe+0x2c0/0x3b4
>>> [ 0.239058] platform_probe+0x68/0xd8
>>> [ 0.239513] really_probe+0x148/0x2b4
>>> [ 0.239968] __driver_probe_device+0x78/0x12c
>>> [ 0.240510] driver_probe_device+0xdc/0x160
>>> [ 0.241030] __driver_attach+0x94/0x19c
>>> [ 0.241507] bus_for_each_dev+0x74/0xd4
>>> [ 0.241983] driver_attach+0x24/0x30
>>> [ 0.242428] bus_add_driver+0xe4/0x1e8
>>> [ 0.242893] driver_register+0x60/0x128
>>> [ 0.243370] __platform_driver_register+0x28/0x34
>>> [ 0.243955] meson_uart_platform_driver_init+0x1c/0x28
>>> [ 0.244594] do_one_initcall+0x6c/0x1b0
>>> [ 0.245071] kernel_init_freeable+0x1cc/0x294
>>> [ 0.245613] kernel_init+0x20/0x1dc
>>> [ 0.246046] ret_from_fork+0x10/0x20
>>> [ 0.246555] meson_uart fe078000.serial: Cannot register tty device on line 0
>>> [ 0.247729] msm_serial: driver initialized
>>> [ 0.248150] SuperH (H)SCI(F) driver initialized
>>> [ 0.248544] STM32 USART driver initialized
>>> [ 0.263927] loop: module loaded
>>> [ 0.264952] megasas: 07.727.03.00-rc1
>>> [ 0.271065] tun: Universal TUN/TAP device driver, 1.6
>>> [ 0.271824] thunder_xcv, ver 1.0
>>> [ 0.271878] thunder_bgx, ver 1.0
>>> [ 0.271956] nicpf, ver 1.0
>>> [ 0.273230] hns3: Hisilicon Ethernet Network Driver for Hip08 Family - version
>>> [ 0.273437] hns3: Copyright (c) 2017 Huawei Corporation.
>>> [ 0.274148] hclge is initializing
>>> [ 0.274541] e1000: Intel(R) PRO/1000 Network Driver
>>> [ 0.275116] e1000: Copyright (c) 1999-2006 Intel Corporation.
>>> [ 0.275860] e1000e: Intel(R) PRO/1000 Network Driver
>>> [ 0.276449] e1000e: Copyright(c) 1999 - 2015 Intel Corporation.
>>> [ 0.277209] igb: Intel(R) Gigabit Ethernet Network Driver
>>> [ 0.277867] igb: Copyright (c) 2007-2014 Intel Corporation.
>>> [ 0.278576] igbvf: Intel(R) Gigabit Virtual Function Network Driver
>>> [ 0.279330] igbvf: Copyright (c) 2009 - 2012 Intel Corporation.
>>> [ 0.280319] sky2: driver version 1.30
>>> [ 0.281597] VFIO - User Level meta-driver version: 0.3
>>> [ 0.283859] usbcore: registered new interface driver usb-storage
>>> [ 0.286328] i2c_dev: i2c /dev entries driver
>>> [ 0.292404] sdhci: Secure Digital Host Controller Interface driver
>>> [ 0.292481] sdhci: Copyright(c) Pierre Ossman
>>> [ 0.293577] Synopsys Designware Multimedia Card Interface Driver
>>> [ 0.294572] sdhci-pltfm: SDHCI platform and OF driver helper
>>> [ 0.296259] ledtrig-cpu: registered to indicate activity on CPUs
>>> [ 0.298966] meson-sm: secure-monitor enabled
>>> [ 0.299963] usbcore: registered new interface driver usbhid
>>> [ 0.299997] usbhid: USB HID core driver
>>> [ 0.306803] NET: Registered PF_PACKET protocol family
>>> [ 0.306919] 9pnet: Installing 9P2000 support
>>> [ 0.307331] Key type dns_resolver registered
>>> [ 0.318926] Timer migration: 1 hierarchy levels; 8 children per group; 1 crossnode level
>>> [ 0.319462] registered taskstats version 1
>>> [ 0.319968] Loading compiled-in X.509 certificates
>>> [ 0.362771] clk: Disabling unused clocks
>>> [ 0.363100] PM: genpd: Disabling unused power domains
>>> [ 0.363383] ALSA device list:
>>> [ 0.363580] No soundcards found.
>>> [ 0.368194] meson-gx-mmc fe08a000.sd: Got CD GPIO
>>> [ 0.368524] SError Interrupt on CPU6, code 0x00000000bf000002 -- SError
>>> [ 0.368531] CPU: 6 PID: 87 Comm: kworker/u32:3 Not tainted 6.8.0-09793-gda876e5b54b3-dirty #15
>>> [ 0.368537] Hardware name: Khadas vim4 (DT)
>>> [ 0.368540] Workqueue: async async_run_entry_fn
>>> [ 0.368552] pstate: 20000005 (nzCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
>>> [ 0.368556] pc : clk_mux_val_to_index+0x0/0xc0
>>> [ 0.368565] lr : clk_mux_get_parent+0x4c/0x84
>>> [ 0.368571] sp : ffff800082efba10
>>> [ 0.368572] x29: ffff800082efba10 x28: ffff8000823279c0 x27: ffff800082327000
>>> [ 0.368578] x26: ffff000004c361c0 x25: 0000000000000000 x24: 0000000000000002
>>> [ 0.368584] x23: ffff000003f1d300 x22: ffff000003f1d2a0 x21: ffff000004c37280
>>> [ 0.368589] x20: ffff000004c36ec0 x19: ffff000004bba800 x18: 0000000000000020
>>> [ 0.368594] x17: ffff000000022000 x16: 0000000000000003 x15: ffffffffffffffff
>>> [ 0.368599] x14: ffffffffffffffff x13: 0078756d2364732e x12: 3030306138306566
>>> [ 0.368604] x11: 7f7f7f7f7f7f7f7f x10: ffff7fff83438910 x9 : 0000000000000005
>>> [ 0.368609] x8 : 0101010101010101 x7 : 0000000000000000 x6 : 05114367045e5359
>>> [ 0.368613] x5 : 0000000000000006 x4 : 0000000000000000 x3 : 0000000000000000
>>> [ 0.368618] x2 : 0000000000000000 x1 : 0000000000000000 x0 : ffff000004c36ec0
>>> [ 0.368624] Kernel panic - not syncing: Asynchronous SError Interrupt
>>> [ 0.368626] CPU: 6 PID: 87 Comm: kworker/u32:3 Not tainted 6.8.0-09793-gda876e5b54b3-dirty #15
>>> [ 0.368630] Hardware name: Khadas vim4 (DT)
>>> [ 0.368631] Workqueue: async async_run_entry_fn
>>> [ 0.368635] Call trace:
>>> [ 0.368637] dump_backtrace+0x94/0xec
>>> [ 0.368644] show_stack+0x18/0x24
>>> [ 0.368649] dump_stack_lvl+0x38/0x90
>>> [ 0.368656] dump_stack+0x18/0x24
>>> [ 0.368661] panic+0x388/0x3c8
>>> [ 0.368666] nmi_panic+0x48/0x94
>>> [ 0.368670] arm64_serror_panic+0x6c/0x78
>>> [ 0.368674] do_serror+0x3c/0x78
>>> [ 0.368677] el1h_64_error_handler+0x30/0x48
>>> [ 0.368681] el1h_64_error+0x64/0x68
>>> [ 0.368684] clk_mux_val_to_index+0x0/0xc0
>>> [ 0.368689] __clk_register+0x440/0x82c
>>> [ 0.368693] devm_clk_register+0x5c/0xbc
>>> [ 0.368697] meson_mmc_clk_init+0x11c/0x2a8
>>> [ 0.368702] meson_mmc_probe+0x18c/0x3c0
>>> [ 0.368705] platform_probe+0x68/0xd8
>>> [ 0.368711] really_probe+0x148/0x2b4
>>> [ 0.368714] __driver_probe_device+0x78/0x12c
>>> [ 0.368718] driver_probe_device+0xdc/0x160
>>> [ 0.368721] __device_attach_driver+0xb8/0x134
>>> [ 0.368724] bus_for_each_drv+0x84/0xe0
>>> [ 0.368727] __device_attach_async_helper+0xac/0xd0
>>> [ 0.368730] async_run_entry_fn+0x34/0xe0
>>> [ 0.368734] process_one_work+0x150/0x294
>>> [ 0.368740] worker_thread+0x304/0x408
>>> [ 0.368744] kthread+0x118/0x11c
>>> [ 0.368748] ret_from_fork+0x10/0x20
>>> [ 0.368753] SMP: stopping secondary CPUs
>>> [ 0.368760] Kernel Offset: disabled
>>> [ 0.368761] CPU features: 0x0,00000060,d0080000,0200421b
>>> [ 0.368765] Memory Limit: none
>>> [ 0.400328] ---[ end Kernel panic - not syncing: Asynchronous SError Interrupt ]---
>>>
>>>
>>> --
>>> 2.44.0
>>>

2024-04-08 01:40:03

by Xianwei Zhao

[permalink] [raw]
Subject: Re: [RFC][PATCH 0/2] Amlogic T7 (A113D2) Clock Driver

Hi Lucas,
Thanks for your reply.

On 2024/4/3 16:12, Lucas Tanure wrote:
> [ EXTERNAL EMAIL ]
>
> On Wed, Apr 3, 2024 at 7:44 AM Xianwei Zhao <[email protected]> wrote:
>>
>> Hi Lucas,
>> As we are preparing the T7 clock patchset, we would like to your
>> purpose and plan of this RFC patches. Are you going to submit these
>> patches at last?
>
> Hi Xianwei,
>
> I made some progress, and now the SD card controller probes but fails
> to read blocks from the SD card. I do think my port of the clock
> driver is okay, but I will not send my clock driver until the SD card
> fully works, so I am sure the clocking driver is tested.
> But if you have something already done, please send it, and I will
> test and review it from my side.
>
> Any help with the sdcard controller is also much appreciated.
>

The SDCard part works well on our clock patchset. Then we will send the
formal clock submission later. What do you think?

> Thanks
> Lucas
>
>> On 2024/3/18 19:43, Lucas Tanure wrote:
>>> [ EXTERNAL EMAIL ]
>>>
>>> I am trying to port the T7 clock driver from Khadas 5.4 kernel for Vim4
>>> to mainline, but I am encountering some issues in the path.
>>>
>>> The kernel panics at clk_mux_val_to_index, but I believe that all the
>>> needed clocks are registered.
>>>
>>> If anyone from Amlogic or the community could help me understand what
>>> my driver is missing, that would be great.
>>> I will continue to try to figure out, but it has been some weeks
>>> without progress =/.
>>>
>>> Lucas Tanure (2):
>>> clk: meson: T7: add support for Amlogic T7 SoC PLL clock driver
>>> arm64: dts: amlogic: t7: SDCard, Ethernet and Clocking
>>>
>>> .../amlogic/amlogic-t7-a311d2-khadas-vim4.dts | 66 +
>>> arch/arm64/boot/dts/amlogic/amlogic-t7.dtsi | 189 +
>>> drivers/clk/meson/Kconfig | 25 +
>>> drivers/clk/meson/Makefile | 2 +
>>> drivers/clk/meson/t7-peripherals.c | 6368 +++++++++++++++++
>>> drivers/clk/meson/t7-peripherals.h | 131 +
>>> drivers/clk/meson/t7-pll.c | 1543 ++++
>>> drivers/clk/meson/t7-pll.h | 83 +
>>> .../clock/amlogic,t7-peripherals-clkc.h | 410 ++
>>> .../dt-bindings/clock/amlogic,t7-pll-clkc.h | 69 +
>>> 10 files changed, 8886 insertions(+)
>>> create mode 100644 drivers/clk/meson/t7-peripherals.c
>>> create mode 100644 drivers/clk/meson/t7-peripherals.h
>>> create mode 100644 drivers/clk/meson/t7-pll.c
>>> create mode 100644 drivers/clk/meson/t7-pll.h
>>> create mode 100644 include/dt-bindings/clock/amlogic,t7-peripherals-clkc.h
>>> create mode 100644 include/dt-bindings/clock/amlogic,t7-pll-clkc.h
>>>
>>> Starting kernel ...
>>>
>>> uboot time: 14277917 us
>>> boot 64bit kernel
>>> [ 0.000000] Booting Linux on physical CPU 0x0000000000 [0x410fd092]
>>> [ 0.000000] Linux version 6.8.0-09793-gda876e5b54b3-dirty (tanureal@ryzen) (aarch64-none-linux-gnu-gcc (GNU Toolchain for the A-profile Architecture 10.3-2021.07 (arm-10.29)) 10.3.1 20210621, GNU ld (GNU Toolchain for the A-pr4
>>> [ 0.000000] KASLR disabled due to lack of seed
>>> [ 0.000000] Machine model: Khadas vim4
>>> [ 0.000000] efi: UEFI not found.
>>> [ 0.000000] OF: reserved mem: 0x0000000005000000..0x00000000052fffff (3072 KiB) nomap non-reusable secmon@5000000
>>> [ 0.000000] OF: reserved mem: 0x0000000005300000..0x00000000072fffff (32768 KiB) nomap non-reusable secmon@5300000
>>> [ 0.000000] NUMA: No NUMA configuration found
>>> [ 0.000000] NUMA: Faking a node at [mem 0x0000000000000000-0x00000000df7fffff]
>>> [ 0.000000] NUMA: NODE_DATA [mem 0xdf10c9c0-0xdf10efff]
>>> [ 0.000000] Zone ranges:
>>> [ 0.000000] DMA [mem 0x0000000000000000-0x00000000df7fffff]
>>> [ 0.000000] DMA32 empty
>>> [ 0.000000] Normal empty
>>> [ 0.000000] Movable zone start for each node
>>> [ 0.000000] Early memory node ranges
>>> [ 0.000000] node 0: [mem 0x0000000000000000-0x0000000004ffffff]
>>> [ 0.000000] node 0: [mem 0x0000000005000000-0x00000000072fffff]
>>> [ 0.000000] node 0: [mem 0x0000000007300000-0x00000000df7fffff]
>>> [ 0.000000] Initmem setup node 0 [mem 0x0000000000000000-0x00000000df7fffff]
>>> [ 0.000000] On node 0, zone DMA: 2048 pages in unavailable ranges
>>> [ 0.000000] cma: Reserved 32 MiB at 0x00000000d9800000 on node -1
>>> [ 0.000000] psci: probing for conduit method from DT.
>>> [ 0.000000] psci: PSCIv1.0 detected in firmware.
>>> [ 0.000000] psci: Using standard PSCI v0.2 function IDs
>>> [ 0.000000] psci: Trusted OS migration not required
>>> [ 0.000000] psci: SMC Calling Convention v1.1
>>> [ 0.000000] percpu: Embedded 24 pages/cpu s58152 r8192 d31960 u98304
>>> [ 0.000000] Detected VIPT I-cache on CPU0
>>> [ 0.000000] CPU features: detected: Spectre-v2
>>> [ 0.000000] CPU features: detected: Spectre-v4
>>> [ 0.000000] CPU features: detected: Spectre-BHB
>>> [ 0.000000] CPU features: detected: ARM erratum 858921
>>> [ 0.000000] alternatives: applying boot alternatives
>>> [ 0.000000] Kernel command line: root=UUID=a91e7bfe-4263-4e53-867d-7824e7c6a992 rw rootfstype=ext4 console=ttyS0,921600 no_console_suspend earlycon=ttyS0,0xfe078000 khadas_board=VIM4 androidboot.selinux=permissive androidboot.0
>>> [ 0.000000] Unknown kernel command line parameters "khadas_board=VIM4", will be passed to user space.
>>> [ 0.000000] Dentry cache hash table entries: 524288 (order: 10, 4194304 bytes, linear)
>>> [ 0.000000] Inode-cache hash table entries: 262144 (order: 9, 2097152 bytes, linear)
>>> [ 0.000000] Fallback order for Node 0: 0
>>> [ 0.000000] Built 1 zonelists, mobility grouping on. Total pages: 901152
>>> [ 0.000000] Policy zone: DMA
>>> [ 0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off
>>> [ 0.000000] software IO TLB: SWIOTLB bounce buffer size adjusted to 3MB
>>> [ 0.000000] software IO TLB: area num 8.
>>> [ 0.000000] software IO TLB: SWIOTLB bounce buffer size roundup to 4MB
>>> [ 0.000000] software IO TLB: mapped [mem 0x00000000d8e00000-0x00000000d9200000] (4MB)
>>> [ 0.000000] Memory: 3445944K/3661824K available (16896K kernel code, 4426K rwdata, 9184K rodata, 9728K init, 611K bss, 183112K reserved, 32768K cma-reserved)
>>> [ 0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=8, Nodes=1
>>> [ 0.000000] rcu: Preemptible hierarchical RCU implementation.
>>> [ 0.000000] rcu: RCU restricting CPUs from NR_CPUS=256 to nr_cpu_ids=8.
>>> [ 0.000000] Trampoline variant of Tasks RCU enabled.
>>> [ 0.000000] Tracing variant of Tasks RCU enabled.
>>> [ 0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 25 jiffies.
>>> [ 0.000000] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=8
>>> [ 0.000000] RCU Tasks: Setting shift to 3 and lim to 1 rcu_task_cb_adjust=1.
>>> [ 0.000000] RCU Tasks Trace: Setting shift to 3 and lim to 1 rcu_task_cb_adjust=1.
>>> [ 0.000000] NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0
>>> [ 0.000000] GIC: GICv2 detected, but range too small and irqchip.gicv2_force_probe not set
>>> [ 0.000000] Root IRQ handler: gic_handle_irq
>>> [ 0.000000] rcu: srcu_init: Setting srcu_struct sizes based on contention.
>>> [ 0.000000] arch_timer: Enabling local workaround for ARM erratum 858921
>>> [ 0.000000] arch_timer: CPU0: Trapping CNTVCT access
>>> [ 0.000000] arch_timer: cp15 timer(s) running at 24.00MHz (phys).
>>> [ 0.000000] clocksource: arch_sys_counter: mask: 0xffffffffffffff max_cycles: 0x588fe9dc0, max_idle_ns: 440795202592 ns
>>> [ 0.000000] sched_clock: 56 bits at 24MHz, resolution 41ns, wraps every 4398046511097ns
>>> [ 0.000210] Console: colour dummy device 80x25
>>> [ 0.000253] Calibrating delay loop (skipped), value calculated using timer frequency.. 48.00 BogoMIPS (lpj=96000)
>>> [ 0.000261] pid_max: default: 32768 minimum: 301
>>> [ 0.000300] LSM: initializing lsm=capability
>>> [ 0.000358] Mount-cache hash table entries: 8192 (order: 4, 65536 bytes, linear)
>>> [ 0.000371] Mountpoint-cache hash table entries: 8192 (order: 4, 65536 bytes, linear)
>>> [ 0.000920] cacheinfo: Unable to detect cache hierarchy for CPU 0
>>> [ 0.001389] rcu: Hierarchical SRCU implementation.
>>> [ 0.001391] rcu: Max phase no-delay instances is 1000.
>>> [ 0.001834] EFI services will not be available.
>>> [ 0.001999] smp: Bringing up secondary CPUs ...
>>> [ 0.002408] CPU features: detected: ARM erratum 845719
>>> [ 0.002426] Detected VIPT I-cache on CPU1
>>> [ 0.002516] CPU1: Booted secondary processor 0x0000000100 [0x410fd034]
>>> [ 0.003007] Detected VIPT I-cache on CPU2
>>> [ 0.003054] CPU2: Booted secondary processor 0x0000000101 [0x410fd034]
>>> [ 0.003497] Detected VIPT I-cache on CPU3
>>> [ 0.003546] CPU3: Booted secondary processor 0x0000000102 [0x410fd034]
>>> [ 0.003988] Detected VIPT I-cache on CPU4
>>> [ 0.004038] CPU4: Booted secondary processor 0x0000000103 [0x410fd034]
>>> [ 0.004472] Detected VIPT I-cache on CPU5
>>> [ 0.004509] arch_timer: Enabling local workaround for ARM erratum 858921
>>> [ 0.004519] arch_timer: CPU5: Trapping CNTVCT access
>>> [ 0.004527] CPU5: Booted secondary processor 0x0000000001 [0x410fd092]
>>> [ 0.004915] Detected VIPT I-cache on CPU6
>>> [ 0.004940] arch_timer: Enabling local workaround for ARM erratum 858921
>>> [ 0.004946] arch_timer: CPU6: Trapping CNTVCT access
>>> [ 0.004951] CPU6: Booted secondary processor 0x0000000002 [0x410fd092]
>>> [ 0.005333] Detected VIPT I-cache on CPU7
>>> [ 0.005358] arch_timer: Enabling local workaround for ARM erratum 858921
>>> [ 0.005364] arch_timer: CPU7: Trapping CNTVCT access
>>> [ 0.005369] CPU7: Booted secondary processor 0x0000000003 [0x410fd092]
>>> [ 0.005414] smp: Brought up 1 node, 8 CPUs
>>> [ 0.005419] SMP: Total of 8 processors activated.
>>> [ 0.005421] CPU: All CPU(s) started at EL2
>>> [ 0.005434] CPU features: detected: 32-bit EL0 Support
>>> [ 0.005437] CPU features: detected: 32-bit EL1 Support
>>> [ 0.005440] CPU features: detected: CRC32 instructions
>>> [ 0.005485] alternatives: applying system-wide alternatives
>>> [ 0.006730] devtmpfs: initialized
>>> [ 0.008534] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645041785100000 ns
>>> [ 0.008545] futex hash table entries: 2048 (order: 5, 131072 bytes, linear)
>>> [ 0.008989] pinctrl core: initialized pinctrl subsystem
>>> [ 0.009581] DMI not present or invalid.
>>> [ 0.011290] NET: Registered PF_NETLINK/PF_ROUTE protocol family
>>> [ 0.011944] DMA: preallocated 512 KiB GFP_KERNEL pool for atomic allocations
>>> [ 0.012293] DMA: preallocated 512 KiB GFP_KERNEL|GFP_DMA pool for atomic allocations
>>> [ 0.012711] DMA: preallocated 512 KiB GFP_KERNEL|GFP_DMA32 pool for atomic allocations
>>> [ 0.012832] audit: initializing netlink subsys (disabled)
>>> [ 0.013075] audit: type=2000 audit(0.012:1): state=initialized audit_enabled=0 res=1
>>> [ 0.013508] thermal_sys: Registered thermal governor 'step_wise'
>>> [ 0.013512] thermal_sys: Registered thermal governor 'power_allocator'
>>> [ 0.013557] cpuidle: using governor menu
>>> [ 0.013675] hw-breakpoint: found 6 breakpoint and 4 watchpoint registers.
>>> [ 0.013784] ASID allocator initialised with 65536 entries
>>> [ 0.014630] Serial: AMBA PL011 UART driver
>>> [ 0.017553] Modules: 22496 pages in range for non-PLT usage
>>> [ 0.017556] Modules: 514016 pages in range for PLT usage
>>> [ 0.017980] HugeTLB: registered 1.00 GiB page size, pre-allocated 0 pages
>>> [ 0.017984] HugeTLB: 0 KiB vmemmap can be freed for a 1.00 GiB page
>>> [ 0.017988] HugeTLB: registered 32.0 MiB page size, pre-allocated 0 pages
>>> [ 0.017990] HugeTLB: 0 KiB vmemmap can be freed for a 32.0 MiB page
>>> [ 0.017993] HugeTLB: registered 2.00 MiB page size, pre-allocated 0 pages
>>> [ 0.017995] HugeTLB: 0 KiB vmemmap can be freed for a 2.00 MiB page
>>> [ 0.017997] HugeTLB: registered 64.0 KiB page size, pre-allocated 0 pages
>>> [ 0.018000] HugeTLB: 0 KiB vmemmap can be freed for a 64.0 KiB page
>>> [ 0.018247] Demotion targets for Node 0: null
>>> [ 0.018884] ACPI: Interpreter disabled.
>>> [ 0.019584] iommu: Default domain type: Translated
>>> [ 0.019587] iommu: DMA domain TLB invalidation policy: strict mode
>>> [ 0.019979] SCSI subsystem initialized
>>> [ 0.020174] usbcore: registered new interface driver usbfs
>>> [ 0.020187] usbcore: registered new interface driver hub
>>> [ 0.020200] usbcore: registered new device driver usb
>>> [ 0.020434] pps_core: LinuxPPS API ver. 1 registered
>>> [ 0.020437] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <[email protected]>
>>> [ 0.020443] PTP clock support registered
>>> [ 0.020487] EDAC MC: Ver: 3.0.0
>>> [ 0.020717] scmi_core: SCMI protocol bus registered
>>> [ 0.021039] FPGA manager framework
>>> [ 0.021076] Advanced Linux Sound Architecture Driver Initialized.
>>> [ 0.021612] vgaarb: loaded
>>> [ 0.021857] clocksource: Switched to clocksource arch_sys_counter
>>> [ 0.021967] VFS: Disk quotas dquot_6.6.0
>>> [ 0.021984] VFS: Dquot-cache hash table entries: 512 (order 0, 4096 bytes)
>>> [ 0.022062] pnp: PnP ACPI: disabled
>>> [ 0.026651] NET: Registered PF_INET protocol family
>>> [ 0.026781] IP idents hash table entries: 65536 (order: 7, 524288 bytes, linear)
>>> [ 0.028598] tcp_listen_portaddr_hash hash table entries: 2048 (order: 3, 32768 bytes, linear)
>>> [ 0.028615] Table-perturb hash table entries: 65536 (order: 6, 262144 bytes, linear)
>>> [ 0.028622] TCP established hash table entries: 32768 (order: 6, 262144 bytes, linear)
>>> [ 0.028750] TCP bind hash table entries: 32768 (order: 8, 1048576 bytes, linear)
>>> [ 0.029019] TCP: Hash tables configured (established 32768 bind 32768)
>>> [ 0.029096] UDP hash table entries: 2048 (order: 4, 65536 bytes, linear)
>>> [ 0.029124] UDP-Lite hash table entries: 2048 (order: 4, 65536 bytes, linear)
>>> [ 0.029225] NET: Registered PF_UNIX/PF_LOCAL protocol family
>>> [ 0.029506] RPC: Registered named UNIX socket transport module.
>>> [ 0.029510] RPC: Registered udp transport module.
>>> [ 0.029512] RPC: Registered tcp transport module.
>>> [ 0.029513] RPC: Registered tcp-with-tls transport module.
>>> [ 0.029515] RPC: Registered tcp NFSv4.1 backchannel transport module.
>>> [ 0.029524] PCI: CLS 0 bytes, default 64
>>> [ 0.029649] Unpacking initramfs...
>>> [ 0.033933] kvm [1]: IPA Size Limit: 40 bits
>>> [ 0.034713] kvm [1]: Hyp mode initialized successfully
>>> [ 0.035476] Initialise system trusted keyrings
>>> [ 0.035582] workingset: timestamp_bits=42 max_order=20 bucket_order=0
>>> [ 0.035747] squashfs: version 4.0 (2009/01/31) Phillip Lougher
>>> [ 0.035906] NFS: Registering the id_resolver key type
>>> [ 0.035919] Key type id_resolver registered
>>> [ 0.035922] Key type id_legacy registered
>>> [ 0.035933] nfs4filelayout_init: NFSv4 File Layout Driver Registering...
>>> [ 0.035935] nfs4flexfilelayout_init: NFSv4 Flexfile Layout Driver Registering...
>>> [ 0.036031] 9p: Installing v9fs 9p2000 file system support
>>> [ 0.062587] Key type asymmetric registered
>>> [ 0.062596] Asymmetric key parser 'x509' registered
>>> [ 0.062657] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 245)
>>> [ 0.062661] io scheduler mq-deadline registered
>>> [ 0.062664] io scheduler kyber registered
>>> [ 0.062688] io scheduler bfq registered
>>> [ 0.063318] irq_meson_gpio: 157 to 12 gpio interrupt mux initialized
>>> [ 0.068061] EINJ: ACPI disabled.
>>> [ 0.072570] amlogic_t7_pll_probe
>>> [ 0.072855] amlogic_t7_pll_probe ret 0
>>> [ 0.072943] amlogic_a1_periphs_probe
>>> [ 0.078155] amlogic_a1_periphs_probe ret 0
>>> [ 0.084876] Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled
>>> [ 0.086691] fe078000.serial: ttyS0 at MMIO 0xfe078000 (irq = 14, base_baud = 1500000) is a meson_uart
>>> [ 0.086710] printk: legacy console [ttyS0] enabled
>>> [ 0.229167] sysfs: cannot create duplicate filename '/class/tty/ttyS0'
>>> [ 0.229669] CPU: 3 PID: 1 Comm: swapper/0 Not tainted 6.8.0-09793-gda876e5b54b3-dirty #15
>>> [ 0.230684] Hardware name: Khadas vim4 (DT)
>>> [ 0.231205] Call trace:
>>> [ 0.231509] dump_backtrace+0x94/0xec
>>> [ 0.231963] show_stack+0x18/0x24
>>> [ 0.232374] dump_stack_lvl+0x78/0x90
>>> [ 0.232829] dump_stack+0x18/0x24
>>> [ 0.233241] sysfs_warn_dup+0x64/0x80
>>> [ 0.233696] sysfs_do_create_link_sd+0xf0/0xf8
>>> [ 0.234248] sysfs_create_link+0x20/0x40
>>> [ 0.234736] device_add+0x27c/0x77c
>>> [ 0.235169] device_register+0x20/0x30
>>> [ 0.235635] tty_register_device_attr+0xfc/0x240
>>> [ 0.236209] tty_port_register_device_attr_serdev+0x8c/0xac
>>> [ 0.236902] serial_core_register_port+0x318/0x658
>>> [ 0.237498] serial_ctrl_register_port+0x10/0x1c
>>> [ 0.238072] uart_add_one_port+0x10/0x1c
>>> [ 0.238560] meson_uart_probe+0x2c0/0x3b4
>>> [ 0.239058] platform_probe+0x68/0xd8
>>> [ 0.239513] really_probe+0x148/0x2b4
>>> [ 0.239968] __driver_probe_device+0x78/0x12c
>>> [ 0.240510] driver_probe_device+0xdc/0x160
>>> [ 0.241030] __driver_attach+0x94/0x19c
>>> [ 0.241507] bus_for_each_dev+0x74/0xd4
>>> [ 0.241983] driver_attach+0x24/0x30
>>> [ 0.242428] bus_add_driver+0xe4/0x1e8
>>> [ 0.242893] driver_register+0x60/0x128
>>> [ 0.243370] __platform_driver_register+0x28/0x34
>>> [ 0.243955] meson_uart_platform_driver_init+0x1c/0x28
>>> [ 0.244594] do_one_initcall+0x6c/0x1b0
>>> [ 0.245071] kernel_init_freeable+0x1cc/0x294
>>> [ 0.245613] kernel_init+0x20/0x1dc
>>> [ 0.246046] ret_from_fork+0x10/0x20
>>> [ 0.246555] meson_uart fe078000.serial: Cannot register tty device on line 0
>>> [ 0.247729] msm_serial: driver initialized
>>> [ 0.248150] SuperH (H)SCI(F) driver initialized
>>> [ 0.248544] STM32 USART driver initialized
>>> [ 0.263927] loop: module loaded
>>> [ 0.264952] megasas: 07.727.03.00-rc1
>>> [ 0.271065] tun: Universal TUN/TAP device driver, 1.6
>>> [ 0.271824] thunder_xcv, ver 1.0
>>> [ 0.271878] thunder_bgx, ver 1.0
>>> [ 0.271956] nicpf, ver 1.0
>>> [ 0.273230] hns3: Hisilicon Ethernet Network Driver for Hip08 Family - version
>>> [ 0.273437] hns3: Copyright (c) 2017 Huawei Corporation.
>>> [ 0.274148] hclge is initializing
>>> [ 0.274541] e1000: Intel(R) PRO/1000 Network Driver
>>> [ 0.275116] e1000: Copyright (c) 1999-2006 Intel Corporation.
>>> [ 0.275860] e1000e: Intel(R) PRO/1000 Network Driver
>>> [ 0.276449] e1000e: Copyright(c) 1999 - 2015 Intel Corporation.
>>> [ 0.277209] igb: Intel(R) Gigabit Ethernet Network Driver
>>> [ 0.277867] igb: Copyright (c) 2007-2014 Intel Corporation.
>>> [ 0.278576] igbvf: Intel(R) Gigabit Virtual Function Network Driver
>>> [ 0.279330] igbvf: Copyright (c) 2009 - 2012 Intel Corporation.
>>> [ 0.280319] sky2: driver version 1.30
>>> [ 0.281597] VFIO - User Level meta-driver version: 0.3
>>> [ 0.283859] usbcore: registered new interface driver usb-storage
>>> [ 0.286328] i2c_dev: i2c /dev entries driver
>>> [ 0.292404] sdhci: Secure Digital Host Controller Interface driver
>>> [ 0.292481] sdhci: Copyright(c) Pierre Ossman
>>> [ 0.293577] Synopsys Designware Multimedia Card Interface Driver
>>> [ 0.294572] sdhci-pltfm: SDHCI platform and OF driver helper
>>> [ 0.296259] ledtrig-cpu: registered to indicate activity on CPUs
>>> [ 0.298966] meson-sm: secure-monitor enabled
>>> [ 0.299963] usbcore: registered new interface driver usbhid
>>> [ 0.299997] usbhid: USB HID core driver
>>> [ 0.306803] NET: Registered PF_PACKET protocol family
>>> [ 0.306919] 9pnet: Installing 9P2000 support
>>> [ 0.307331] Key type dns_resolver registered
>>> [ 0.318926] Timer migration: 1 hierarchy levels; 8 children per group; 1 crossnode level
>>> [ 0.319462] registered taskstats version 1
>>> [ 0.319968] Loading compiled-in X.509 certificates
>>> [ 0.362771] clk: Disabling unused clocks
>>> [ 0.363100] PM: genpd: Disabling unused power domains
>>> [ 0.363383] ALSA device list:
>>> [ 0.363580] No soundcards found.
>>> [ 0.368194] meson-gx-mmc fe08a000.sd: Got CD GPIO
>>> [ 0.368524] SError Interrupt on CPU6, code 0x00000000bf000002 -- SError
>>> [ 0.368531] CPU: 6 PID: 87 Comm: kworker/u32:3 Not tainted 6.8.0-09793-gda876e5b54b3-dirty #15
>>> [ 0.368537] Hardware name: Khadas vim4 (DT)
>>> [ 0.368540] Workqueue: async async_run_entry_fn
>>> [ 0.368552] pstate: 20000005 (nzCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
>>> [ 0.368556] pc : clk_mux_val_to_index+0x0/0xc0
>>> [ 0.368565] lr : clk_mux_get_parent+0x4c/0x84
>>> [ 0.368571] sp : ffff800082efba10
>>> [ 0.368572] x29: ffff800082efba10 x28: ffff8000823279c0 x27: ffff800082327000
>>> [ 0.368578] x26: ffff000004c361c0 x25: 0000000000000000 x24: 0000000000000002
>>> [ 0.368584] x23: ffff000003f1d300 x22: ffff000003f1d2a0 x21: ffff000004c37280
>>> [ 0.368589] x20: ffff000004c36ec0 x19: ffff000004bba800 x18: 0000000000000020
>>> [ 0.368594] x17: ffff000000022000 x16: 0000000000000003 x15: ffffffffffffffff
>>> [ 0.368599] x14: ffffffffffffffff x13: 0078756d2364732e x12: 3030306138306566
>>> [ 0.368604] x11: 7f7f7f7f7f7f7f7f x10: ffff7fff83438910 x9 : 0000000000000005
>>> [ 0.368609] x8 : 0101010101010101 x7 : 0000000000000000 x6 : 05114367045e5359
>>> [ 0.368613] x5 : 0000000000000006 x4 : 0000000000000000 x3 : 0000000000000000
>>> [ 0.368618] x2 : 0000000000000000 x1 : 0000000000000000 x0 : ffff000004c36ec0
>>> [ 0.368624] Kernel panic - not syncing: Asynchronous SError Interrupt
>>> [ 0.368626] CPU: 6 PID: 87 Comm: kworker/u32:3 Not tainted 6.8.0-09793-gda876e5b54b3-dirty #15
>>> [ 0.368630] Hardware name: Khadas vim4 (DT)
>>> [ 0.368631] Workqueue: async async_run_entry_fn
>>> [ 0.368635] Call trace:
>>> [ 0.368637] dump_backtrace+0x94/0xec
>>> [ 0.368644] show_stack+0x18/0x24
>>> [ 0.368649] dump_stack_lvl+0x38/0x90
>>> [ 0.368656] dump_stack+0x18/0x24
>>> [ 0.368661] panic+0x388/0x3c8
>>> [ 0.368666] nmi_panic+0x48/0x94
>>> [ 0.368670] arm64_serror_panic+0x6c/0x78
>>> [ 0.368674] do_serror+0x3c/0x78
>>> [ 0.368677] el1h_64_error_handler+0x30/0x48
>>> [ 0.368681] el1h_64_error+0x64/0x68
>>> [ 0.368684] clk_mux_val_to_index+0x0/0xc0
>>> [ 0.368689] __clk_register+0x440/0x82c
>>> [ 0.368693] devm_clk_register+0x5c/0xbc
>>> [ 0.368697] meson_mmc_clk_init+0x11c/0x2a8
>>> [ 0.368702] meson_mmc_probe+0x18c/0x3c0
>>> [ 0.368705] platform_probe+0x68/0xd8
>>> [ 0.368711] really_probe+0x148/0x2b4
>>> [ 0.368714] __driver_probe_device+0x78/0x12c
>>> [ 0.368718] driver_probe_device+0xdc/0x160
>>> [ 0.368721] __device_attach_driver+0xb8/0x134
>>> [ 0.368724] bus_for_each_drv+0x84/0xe0
>>> [ 0.368727] __device_attach_async_helper+0xac/0xd0
>>> [ 0.368730] async_run_entry_fn+0x34/0xe0
>>> [ 0.368734] process_one_work+0x150/0x294
>>> [ 0.368740] worker_thread+0x304/0x408
>>> [ 0.368744] kthread+0x118/0x11c
>>> [ 0.368748] ret_from_fork+0x10/0x20
>>> [ 0.368753] SMP: stopping secondary CPUs
>>> [ 0.368760] Kernel Offset: disabled
>>> [ 0.368761] CPU features: 0x0,00000060,d0080000,0200421b
>>> [ 0.368765] Memory Limit: none
>>> [ 0.400328] ---[ end Kernel panic - not syncing: Asynchronous SError Interrupt ]---
>>>
>>>
>>> --
>>> 2.44.0
>>>