How to use both the MM6108 and the built-in Wi-Fi on the Raspberry Pi Zero 2W?

Hello,

I’m starting developing Wi-Fi HaLow related products by using the MM6108.
I’m using the MMECH06V6 (EKH01’s hat) and the RPi Zero 2W.

I’ve confirmed it works well on the default board configuration and the Raspbian OS (kernel ported by using your manual).
As you know that the RPi Zero 2W does not have an ethernet port, I’m trying to enable both 2.4GHz and Sub-1GHz Wi-Fi interfaces.

I modified the jumper resistors from SDIOs to SPIs.
I also commented out sdio, and mm_wlan overlays from the device tree overlay configurations.

After reboot, I found two wlan interfaces enabled as I expected.

[   14.067929] brcmfmac: brcmf_fw_alloc_request: using brcm/brcmfmac43430-sdio for chip BCM43430/1
[   14.068994] usbcore: registered new interface driver brcmfmac
[   14.156492] vc4-drm soc:gpu: [drm] fb0: vc4drmfb frame buffer device
[   14.316493] brcmfmac: brcmf_c_process_txcap_blob: no txcap_blob available (err=-2)
[   14.317365] brcmfmac: brcmf_c_preinit_dcmds: Firmware: BCM43430/1 wl0: Jun 14 2023 07:27:45 version 7.45.96.s1 (gf031a129) FWID 01-70bd2af7 es7
[   14.923691] Adding 524284k swap on /var/swap.  Priority:-2 extents:14 across:3874816k SS
[   16.389144] Morse Micro Dot11ah driver registration. Version 0-rel_1_12_4_2024_Jun_11-6-g63cd0768
[   17.019130] brcmfmac: brcmf_cfg80211_set_power_mgmt: power save enabled
[   17.689574] morse micro driver registration. Version 0-rel_1_12_4_2024_Jun_11-6-g63cd0768
[   17.690196] morse_spi spi0.0: Reading gpio pins configuration from device tree
[   17.690407] uaccess char driver major number is 236
[   17.690735] morse_io: Device node '/dev/morse_io' created successfully
[   17.715421] morse_spi spi0.0: Loaded firmware from morse/mm6108.bin, size 433044, crc32 0x436ba524
[   17.718809] morse_spi spi0.0: Loaded BCF from morse/bcf_boardtype_0801.bin, size 1003, crc32 0xaf924dcf
[   18.354269] ieee80211 phy1: Selected rate control algorithm 'minstrel_ht'
[   18.361724] morse_spi spi0.0: Driver loaded with kernel module parameters
[   18.361760] morse_spi spi0.0:     enable_1mhz_probes                      : Y
[   18.361774] morse_spi spi0.0:     enable_hw_scan                          : Y
[   18.361785] morse_spi spi0.0:     enable_pv1                              : N
[   18.361797] morse_spi spi0.0:     enable_page_slicing                     : N
[   18.361808] morse_spi spi0.0:     log_modparams_on_boot                   : Y
[   18.361820] morse_spi spi0.0:     enable_mcast_at_op_bw                   : N
[   18.361833] morse_spi spi0.0:     enable_mcast_whitelist                  : Y
[   18.361850] morse_spi spi0.0:     ocs_type                                : 1
[   18.361862] morse_spi spi0.0:     enable_auto_mpsw                        : Y
[   18.361875] morse_spi spi0.0:     duty_cycle_probe_retry_threshold        : 2500
[   18.361887] morse_spi spi0.0:     duty_cycle_mode                         : 0
[   18.361899] morse_spi spi0.0:     enable_auto_duty_cycle                  : Y
[   18.361913] morse_spi spi0.0:     dhcpc_lease_update_script               : /morse/scripts/dhcpc_update.sh
[   18.361925] morse_spi spi0.0:     enable_ibss_probe_filtering             : Y
[   18.361938] morse_spi spi0.0:     enable_dhcpc_offload                    : N
[   18.361951] morse_spi spi0.0:     enable_arp_offload                      : N
[   18.361963] morse_spi spi0.0:     enable_bcn_change_seq_monitor           : 0
[   18.361975] morse_spi spi0.0:     enable_cac                              : 0
[   18.361988] morse_spi spi0.0:     max_mc_frames                           : 10
[   18.362001] morse_spi spi0.0:     tx_max_power_mbm                        : 2200
[   18.362013] morse_spi spi0.0:     enable_twt                              : Y
[   18.362024] morse_spi spi0.0:     enable_mac80211_connection_monitor      : N
[   18.362036] morse_spi spi0.0:     enable_airtime_fairness                 : N
[   18.362048] morse_spi spi0.0:     enable_raw                              : Y
[   18.362059] morse_spi spi0.0:     max_aggregation_count                   : 0
[   18.362071] morse_spi spi0.0:     max_rate_tries                          : 1
[   18.362083] morse_spi spi0.0:     max_rates                               : 3
[   18.362095] morse_spi spi0.0:     enable_watchdog_reset                   : N
[   18.362107] morse_spi spi0.0:     watchdog_interval_secs                  : 30
[   18.362118] morse_spi spi0.0:     enable_watchdog                         : N
[   18.362131] morse_spi spi0.0:     country                                 : US
[   18.362144] morse_spi spi0.0:     enable_cts_to_self                      : N
[   18.362155] morse_spi spi0.0:     enable_rts_8mhz                         : N
[   18.362167] morse_spi spi0.0:     enable_trav_pilot                       : Y
[   18.362178] morse_spi spi0.0:     enable_sgi_rc                           : Y
[   18.362190] morse_spi spi0.0:     enable_mbssid_ie                        : N
[   18.362202] morse_spi spi0.0:     virtual_sta_max                         : 0
[   18.362214] morse_spi spi0.0:     thin_lmac                               : 0
[   18.362226] morse_spi spi0.0:     enable_dynamic_ps_offload               : Y
[   18.362238] morse_spi spi0.0:     enable_ps                               : 2
[   18.362249] morse_spi spi0.0:     enable_subbands                         : 2
[   18.362261] morse_spi spi0.0:     enable_survey                           : Y
[   18.362273] morse_spi spi0.0:     mcs10_mode                              : 0
[   18.362285] morse_spi spi0.0:     mcs_mask                                : 1023
[   18.362297] morse_spi spi0.0:     no_hwcrypt                              : 0
[   18.362309] morse_spi spi0.0:     enable_ext_xtal_init                    : N
[   18.362323] morse_spi spi0.0:     enable_otp_check                        : 1
[   18.362336] morse_spi spi0.0:     bcf                                     :
[   18.362348] morse_spi spi0.0:     serial                                  : default
[   18.362360] morse_spi spi0.0:     debug_mask                              : 8
[   18.362373] morse_spi spi0.0:     tx_status_lifetime_ms                   : 15000
[   18.362386] morse_spi spi0.0:     tx_queued_lifetime_ms                   : 1000
[   18.362398] morse_spi spi0.0:     max_txq_len                             : 32
[   18.362410] morse_spi spi0.0:     default_cmd_timeout_ms                  : 600
[   18.362422] morse_spi spi0.0:     enable_short_bcn_as_dtim_override       : -1
[   18.362435] morse_spi spi0.0:     fw_bin_file                             :
[   18.362447] morse_spi spi0.0:     sdio_reset_time                         : 400
[   18.362459] morse_spi spi0.0:     macaddr_suffix                          : 00:00:00
[   18.362472] morse_spi spi0.0:     macaddr_octet                           : 255
[   18.362485] morse_spi spi0.0:     max_total_vendor_ie_bytes               : 514
[   18.362500] morse_spi spi0.0:     coredump_include                        : 1
[   18.362512] morse_spi spi0.0:     coredump_method                         : 1
[   18.362524] morse_spi spi0.0:     enable_coredump                         : Y
[   18.362537] morse_spi spi0.0:     sdio_clk_debugfs                        :
[   18.362549] morse_spi spi0.0:     spi_use_edge_irq                        : N
[   18.362561] morse_spi spi0.0:     spi_clock_speed                         : 50000000
[   18.362574] morse_spi spi0.0:     enable_mm_vendor_ie                     : Y
[   21.640457] morse_spi spi0.0: Morse SPI device removed
[   21.640510] Resetting Morse Chip
[   21.660545] Done
[   21.822380] Remove /driver
[   21.837461] Perform reset with gpiod: gpiochip0 5
[   22.443130] Morse Micro Dot11ah driver registration. Version 0-rel_1_12_4_2024_Jun_11-6-g63cd0768
[   23.667899] morse micro driver registration. Version 0-rel_1_12_4_2024_Jun_11-6-g63cd0768
[   23.668505] morse_spi spi0.0: Reading gpio pins configuration from device tree
[   23.668738] uaccess char driver major number is 236
[   23.669051] morse_io: Device node '/dev/morse_io' created successfully
[   23.670396] morse_spi spi0.0: Loaded firmware from morse/mm6108.bin, size 433044, crc32 0x436ba524
[   23.670545] morse_spi spi0.0: Loaded BCF from morse/bcf_boardtype_0801.bin, size 1003, crc32 0xaf924dcf
[   24.263641] ieee80211 phy2: Selected rate control algorithm 'minstrel_ht'
[   24.269645] morse_spi spi0.0: Driver loaded with kernel module parameters
[   24.269679] morse_spi spi0.0:     enable_1mhz_probes                      : Y
[   24.269689] morse_spi spi0.0:     enable_hw_scan                          : Y
[   24.269699] morse_spi spi0.0:     enable_pv1                              : N
[   24.269707] morse_spi spi0.0:     enable_page_slicing                     : N
[   24.269717] morse_spi spi0.0:     log_modparams_on_boot                   : Y
[   24.269725] morse_spi spi0.0:     enable_mcast_at_op_bw                   : N
[   24.269734] morse_spi spi0.0:     enable_mcast_whitelist                  : Y
[   24.269747] morse_spi spi0.0:     ocs_type                                : 1
[   24.269756] morse_spi spi0.0:     enable_auto_mpsw                        : Y
[   24.269765] morse_spi spi0.0:     duty_cycle_probe_retry_threshold        : 2500
[   24.269774] morse_spi spi0.0:     duty_cycle_mode                         : 0
[   24.269782] morse_spi spi0.0:     enable_auto_duty_cycle                  : Y
[   24.269792] morse_spi spi0.0:     dhcpc_lease_update_script               : /morse/scripts/dhcpc_update.sh
[   24.269801] morse_spi spi0.0:     enable_ibss_probe_filtering             : Y
[   24.269809] morse_spi spi0.0:     enable_dhcpc_offload                    : N
[   24.269817] morse_spi spi0.0:     enable_arp_offload                      : N
[   24.269826] morse_spi spi0.0:     enable_bcn_change_seq_monitor           : 0
[   24.269835] morse_spi spi0.0:     enable_cac                              : 0
[   24.269844] morse_spi spi0.0:     max_mc_frames                           : 10
[   24.269853] morse_spi spi0.0:     tx_max_power_mbm                        : 2200
[   24.269862] morse_spi spi0.0:     enable_twt                              : Y
[   24.269870] morse_spi spi0.0:     enable_mac80211_connection_monitor      : N
[   24.269879] morse_spi spi0.0:     enable_airtime_fairness                 : N
[   24.269887] morse_spi spi0.0:     enable_raw                              : Y
[   24.269896] morse_spi spi0.0:     max_aggregation_count                   : 0
[   24.269905] morse_spi spi0.0:     max_rate_tries                          : 1
[   24.269913] morse_spi spi0.0:     max_rates                               : 3
[   24.269921] morse_spi spi0.0:     enable_watchdog_reset                   : N
[   24.269930] morse_spi spi0.0:     watchdog_interval_secs                  : 30
[   24.269939] morse_spi spi0.0:     enable_watchdog                         : N
[   24.269948] morse_spi spi0.0:     country                                 : US
[   24.269956] morse_spi spi0.0:     enable_cts_to_self                      : N
[   24.269965] morse_spi spi0.0:     enable_rts_8mhz                         : N
[   24.269973] morse_spi spi0.0:     enable_trav_pilot                       : Y
[   24.269981] morse_spi spi0.0:     enable_sgi_rc                           : Y
[   24.269989] morse_spi spi0.0:     enable_mbssid_ie                        : N
[   24.269998] morse_spi spi0.0:     virtual_sta_max                         : 0
[   24.270006] morse_spi spi0.0:     thin_lmac                               : 0
[   24.270015] morse_spi spi0.0:     enable_dynamic_ps_offload               : Y
[   24.270023] morse_spi spi0.0:     enable_ps                               : 2
[   24.270031] morse_spi spi0.0:     enable_subbands                         : 2
[   24.270040] morse_spi spi0.0:     enable_survey                           : Y
[   24.270048] morse_spi spi0.0:     mcs10_mode                              : 0
[   24.270056] morse_spi spi0.0:     mcs_mask                                : 1023
[   24.270065] morse_spi spi0.0:     no_hwcrypt                              : 0
[   24.270074] morse_spi spi0.0:     enable_ext_xtal_init                    : N
[   24.270085] morse_spi spi0.0:     enable_otp_check                        : 1
[   24.270094] morse_spi spi0.0:     bcf                                     :
[   24.270102] morse_spi spi0.0:     serial                                  : default
[   24.270110] morse_spi spi0.0:     debug_mask                              : 8
[   24.270119] morse_spi spi0.0:     tx_status_lifetime_ms                   : 15000
[   24.270127] morse_spi spi0.0:     tx_queued_lifetime_ms                   : 1000
[   24.270136] morse_spi spi0.0:     max_txq_len                             : 32
[   24.270145] morse_spi spi0.0:     default_cmd_timeout_ms                  : 600
[   24.270154] morse_spi spi0.0:     enable_short_bcn_as_dtim_override       : -1
[   24.270163] morse_spi spi0.0:     fw_bin_file                             :
[   24.270172] morse_spi spi0.0:     sdio_reset_time                         : 400
[   24.270180] morse_spi spi0.0:     macaddr_suffix                          : 00:00:00
[   24.270189] morse_spi spi0.0:     macaddr_octet                           : 255
[   24.270197] morse_spi spi0.0:     max_total_vendor_ie_bytes               : 514
[   24.270207] morse_spi spi0.0:     coredump_include                        : 1
[   24.270215] morse_spi spi0.0:     coredump_method                         : 1
[   24.270224] morse_spi spi0.0:     enable_coredump                         : Y
[   24.270232] morse_spi spi0.0:     sdio_clk_debugfs                        :
[   24.270261] morse_spi spi0.0:     spi_use_edge_irq                        : N
[   24.270272] morse_spi spi0.0:     spi_clock_speed                         : 50000000
[   24.270281] morse_spi spi0.0:     enable_mm_vendor_ie                     : Y
[   29.041892] systemd[895]: memfd_create() called without MFD_EXEC or MFD_NOEXEC_SEAL set
[   29.614274] systemd-journald[232]: File /var/log/journal/a6915c01b824498abe35002f60af7be7/user-1000.journal corrupted or uncleanly shut down, renaming and replacing.
iotown@cg4-dev:~ $ ifconfig
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 11  bytes 1633 (1.5 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 11  bytes 1633 (1.5 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.2  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 2001:470:24:199:f119:241d:6cba:1ac0  prefixlen 64  scopeid 0x0<global>
        inet6 fe80::dc51:7aa1:e523:953  prefixlen 64  scopeid 0x20<link>
        ether 2c:cf:67:ee:c1:34  txqueuelen 1000  (Ethernet)
        RX packets 157  bytes 14554 (14.2 KiB)
        RX errors 0  dropped 34  overruns 0  frame 0
        TX packets 220  bytes 80555 (78.6 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

wlan1: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        ether 0c:bf:74:00:0a:90  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

iotown@cg4-dev:~ $

But the MM6108 interface frequently failed every reboot the board.

[   13.862412] brcmfmac: F1 signature read @0x18000000=0x1541a9a6
[   13.874273] brcmfmac: brcmf_fw_alloc_request: using brcm/brcmfmac43430-sdio for chip BCM43430/1
[   13.875258] usbcore: registered new interface driver brcmfmac
[   14.166263] brcmfmac: brcmf_c_process_txcap_blob: no txcap_blob available (err=-2)
[   14.167688] brcmfmac: brcmf_c_preinit_dcmds: Firmware: BCM43430/1 wl0: Jun 14 2023 07:27:45 version 7.45.96.s1 (gf031a129) FWID 01-70bd2af7 es7
[   14.657884] Adding 524284k swap on /var/swap.  Priority:-2 extents:14 across:3874816k SS
[   16.278931] Morse Micro Dot11ah driver registration. Version 0-rel_1_12_4_2024_Jun_11-6-g63cd0768
[   16.683174] brcmfmac: brcmf_cfg80211_set_power_mgmt: power save enabled
[   17.588245] morse micro driver registration. Version 0-rel_1_12_4_2024_Jun_11-6-g63cd0768
[   17.588928] morse_spi spi0.0: Reading gpio pins configuration from device tree
[   17.589167] uaccess char driver major number is 236
[   17.589612] morse_io: Device node '/dev/morse_io' created successfully
[   17.614035] morse_spi spi0.0: Loaded firmware from morse/mm6108.bin, size 433044, crc32 0x436ba524
[   17.621454] morse_spi spi0.0: Loaded BCF from morse/bcf_boardtype_0801.bin, size 1003, crc32 0xaf924dcf
[   18.092439] Remove /driver
[   18.107356] Perform reset with gpiod: gpiochip0 5
[   18.116273] morse_spi_find_data_ack failed
[   18.116293] morse_spi_cmd53_write failed
[   18.116303] morse_spi spi0.0: morse_spi_mem_write failed (errno=-71)
[   18.116316] morse_spi spi0.0: morse_spi_dm_write failed -71
[   18.116475] morse_spi_cmd53_write failed
[   18.116484] morse_spi spi0.0: morse_spi_mem_write failed (errno=-71)
[   18.116494] morse_spi spi0.0: morse_spi_reg32_write failed (errno=-71)
[   18.525352] morse_spi spi0.0: morse_spi_set_func_address_base failed (errno=-61)
[   18.525383] morse_spi spi0.0: morse_spi_get_func failed
[   18.525392] morse_spi spi0.0: morse_spi_mem_write failed (errno=-95)
[   18.525402] morse_spi spi0.0: morse_spi_reg32_write failed (errno=-95)
[   18.525420] morse_spi spi0.0: morse_spi_set_func_address_base failed (errno=-61)
[   18.525430] morse_spi spi0.0: morse_spi_get_func failed
[   18.525438] morse_spi spi0.0: morse_spi_mem_write failed (errno=-95)
[   18.525446] morse_spi spi0.0: morse_spi_reg32_write failed (errno=-95)
[   18.525463] morse_spi spi0.0: morse_spi_set_func_address_base failed (errno=-61)
[   18.525472] morse_spi spi0.0: morse_spi_get_func failed
[   18.525479] morse_spi spi0.0: morse_spi_mem_write failed (errno=-95)
[   18.525488] morse_spi spi0.0: morse_spi_reg32_write failed (errno=-95)
[   18.943935] morse_spi spi0.0: morse_spi_set_func_address_base failed (errno=-61)
[   18.943975] morse_spi spi0.0: morse_spi_get_func failed
[   18.943984] morse_spi spi0.0: morse_spi_mem_write failed (errno=-95)
[   18.943993] morse_spi spi0.0: morse_spi_reg32_write failed (errno=-95)
[   18.944025] morse_spi spi0.0: morse_spi_set_func_address_base failed (errno=-61)
[   18.944034] morse_spi spi0.0: morse_spi_get_func failed
[   18.944042] morse_spi spi0.0: morse_spi_mem_write failed (errno=-95)
[   18.944051] morse_spi spi0.0: morse_spi_reg32_write failed (errno=-95)
[   18.944139] morse_spi spi0.0: morse_firmware_init failed: -5
[   18.944496] morse_spi_probe failed. The driver has not been loaded!
[   18.944534] morse_spi: probe of spi0.0 failed with error -5
[   23.897866] systemd[869]: memfd_create() called without MFD_EXEC or MFD_NOEXEC_SEAL set

Could you suggest any way to solve this problem, please?

Can I confirm that you mean the interface comes up correctly after a cold boot (eg a powercycle)? But after a warm boot (eg calling reboot) it fails?

The errors indicate that the host can’t communicate over the SPI bus to the MM6108. In the case of SPI, there is a special sequence the host must complete to put the MM6108 into SPI mode. I need to confirm what happens here when it is already in SPI mode, but if your issue is relating to warm boots only, then this could be caused by the MM6108 not being correctly reset when the driver is removed by the kernel.

Can you please share your SPI device tree configuration? Has the reset-gpios been defined correctly for the RPi Zero 2W?

Thank you for your reply.

Can I confirm that you mean the interface comes up correctly after a cold boot (eg a powercycle)? But after a warm boot (eg calling reboot ) it fails?

Yes.

I tested 10 times for each case.

For cold boot tests, I delayed about 3 seconds after power disconnect.
The result was 100% success.

However, the result of the warm boot case was 50% success.

Below kernel panic log was printed after every reboot when the MM6108 driver is not loaded correctly.

Can you please share your SPI device tree configuration? Has the reset-gpios been defined correctly for the RPi Zero 2W?

Yes. Below is the morse-spi.dts that obtained from /boot/firmware/overlays/morse-spi.dtbo by using dtc.

/dts-v1/;

/ {
        compatible = "brcm,bcm2835\0brcm,bcm2836\0brcm,bcm2708\0brcm,bcm2709\0brcm,bcm2711";

        fragment@0 {
                target = <0xffffffff>;

                __overlay__ {
                        pinctrl-0 = <0x01 0x02>;
                        cs-gpios = <0xffffffff 0x08 0x01>;
                        #address-cells = <0x01>;
                        #size-cells = <0x00>;
                        status = "okay";
                        phandle = <0x03>;

                        mm6108@0 {
                                compatible = "morse,mm610x-spi";
                                reg = <0x00>;
                                reset-gpios = <0xffffffff 0x05 0x00>;
                                power-gpios = <0xffffffff 0x03 0x00 0xffffffff 0x07 0x00>;
                                spi-irq-gpios = <0xffffffff 0x19 0x00>;
                                spi-max-frequency = <0x2faf080>;
                                status = "okay";
                                phandle = <0x04>;
                        };

                        spidev@0 {
                                reg = <0x00>;
                                status = "disabled";
                                phandle = <0x05>;
                        };

                        spidev@1 {
                                reg = <0x01>;
                                status = "disabled";
                                phandle = <0x06>;
                        };
                };
        };

        fragment@1 {
                target = <0xffffffff>;

                __overlay__ {

                        spi0_cs_pins {
                                brcm,pins = <0x08>;
                                brcm,function = <0x01>;
                                brcm,pull = <0x02>;
                                phandle = <0x02>;
                        };

                        spi0_pins {
                                brcm,pull = <0x02 0x02 0x02>;
                                phandle = <0x01>;
                        };
                };
        };

        __symbols__ {
                frag0 = "/fragment@0/__overlay__";
                mm6108 = "/fragment@0/__overlay__/mm6108@0";
                spidev0 = "/fragment@0/__overlay__/spidev@0";
                spidev1 = "/fragment@0/__overlay__/spidev@1";
                spi0_cs_pins = "/fragment@1/__overlay__/spi0_cs_pins";
                spi0_pins = "/fragment@1/__overlay__/spi0_pins";
        };

        __fixups__ {
                spi0 = "/fragment@0:target:0";
                gpio = "/fragment@0/__overlay__:cs-gpios:0\0/fragment@0/__overlay__/mm6108@0:reset-gpios:0\0/fragment@0/__overlay__/mm6108@0:power-gpios:0\0/fragment@0/__overlay__/mm6108@0:power-gpios:12\0/fragment@0/__overlay__/mm6108@0:spi-irq-gpios:0\0/fragment@1:target:0";
        };

        __local_fixups__ {

                fragment@0 {

                        __overlay__ {
                                pinctrl-0 = <0x00 0x04>;
                        };
                };
        };
};

I hope these information be helpful to solve this problem.

Best,

Hi @jsjeong

The device tree overlay should be fine for the Raspberry Pi Zero 2W.

I believe the issue you are seeing is definitely caused by the chip not being reset properly before the driver probe function is called. Our evaluation kits deploy a chip-reset script which is called early in the boot sequence.
This has some dependence on an MM_RESET to be added to your gpio-line-names in device tree which may not be a desired change.

Ultimately you need something like this

    gpioset -m time -u 50000 gpiochip0 5=0
    gpioget $1 > /dev/null
    sleep 0.05

installed as an early boot script. For most systems this could go in /etc/init.d/, but will need some additional boilerplate depending on your init system. See other scripts in that location for the appropriate format.


Alternatively, because you are using SPI, you could patch the Morse Micro driver to trigger the reset script on driver probe!

diff --git a/hw.c b/hw.c
index e363818..5944122 100644
--- a/hw.c
+++ b/hw.c
@@ -94,9 +94,10 @@ int morse_hw_reset(int reset_pin)
 
 	pr_info("Resetting Morse Chip\n");
 	gpio_direction_output(reset_pin, 0);
-	mdelay(20);
+	mdelay(100);
 	/* setting gpio as float to avoid forcing 3.3V High */
 	gpio_direction_input(reset_pin);
+	mdelay(1000);
 	pr_info("Done\n");
 
 	gpio_free(reset_pin);
diff --git a/spi.c b/spi.c
index 085f2be..28b2947 100644
--- a/spi.c
+++ b/spi.c
@@ -1270,6 +1270,15 @@ static int morse_spi_probe(struct spi_device *spi)
 		return -ENOMEM;
 	}
 
+
+	mors->cfg = &mm6108_cfg;
+
+	/* setting gpio pin configs from device tree */
+	morse_of_probe(&spi->dev, mors->cfg, morse_spi_of_match);
+
+	/* try chip reset to get in a known state */
+	morse_spi_reset(mors->cfg->mm_reset_gpio, spi);
+
 	/* update chip configuration */
 	mors->bus_ops = &morse_spi_ops;
 	mors->bus_type = MORSE_HOST_BUS_TYPE_SPI;
-- 
2.25.1