From ff60a514ffbb370853585e8f6ce9f2efdbd000f1 Mon Sep 17 00:00:00 2001 From: maoxiaochuan Date: Wed, 12 Mar 2025 16:53:34 +0800 Subject: [PATCH] update to 9f12731260 1.dts:ls2k300:Correct label of spi 2.ls2k300:Add a defconfig for rt 3.fix SD-card CMD48 stuck 4.fix i2c hang when touch for a long time --- arch/loongarch/boot/dts/loongson-2k0300.dtsi | 4 +- .../configs/loongson_2k300_defconfig | 3 +- .../configs/loongson_2k300_rt_defconfig | 800 ++++++++++++++++++ drivers/i2c/busses/i2c-lsfs.c | 626 +++++++------- drivers/mmc/host/ls2kmci.c | 10 +- drivers/net/can/ls_canfd/Makefile | 8 + .../net/can/ls_canfd/lscanfd_dma.o_shipped | Bin 45280 -> 45216 bytes .../net/can/ls_canfd/lscanfd_dma.o_shipped_rt | Bin 0 -> 45280 bytes .../can/ls_canfd/lscanfd_platform.o_shipped | Bin 8808 -> 8808 bytes .../ls_canfd/lscanfd_platform.o_shipped_rt | Bin 0 -> 8808 bytes 10 files changed, 1149 insertions(+), 302 deletions(-) create mode 100644 arch/loongarch/configs/loongson_2k300_rt_defconfig create mode 100644 drivers/net/can/ls_canfd/lscanfd_dma.o_shipped_rt create mode 100644 drivers/net/can/ls_canfd/lscanfd_platform.o_shipped_rt diff --git a/arch/loongarch/boot/dts/loongson-2k0300.dtsi b/arch/loongarch/boot/dts/loongson-2k0300.dtsi index bdf731fa7..88a3bca21 100644 --- a/arch/loongarch/boot/dts/loongson-2k0300.dtsi +++ b/arch/loongarch/boot/dts/loongson-2k0300.dtsi @@ -747,7 +747,7 @@ status = "disabled"; }; - spi2: spi@0x1601c000 { + spi2: spi@0x1610c000 { compatible = "loongson,ls-spi-io"; reg = <0 0x1610c000 0 0x2000>; #address-cells = <1>; @@ -758,7 +758,7 @@ status = "disabled"; }; - spi3: spi@0x1601e000 { + spi3: spi@0x1610e000 { compatible = "loongson,ls-spi-io"; reg = <0 0x1610e000 0 0x2000>; #address-cells = <1>; diff --git a/arch/loongarch/configs/loongson_2k300_defconfig b/arch/loongarch/configs/loongson_2k300_defconfig index 6cd8cbb8b..ea8bb099c 100644 --- a/arch/loongarch/configs/loongson_2k300_defconfig +++ b/arch/loongarch/configs/loongson_2k300_defconfig @@ -6,7 +6,7 @@ CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y CONFIG_BPF_SYSCALL=y CONFIG_BPF_JIT=y -CONFIG_PREEMPT_RT=y +CONFIG_PREEMPT=y CONFIG_BSD_PROCESS_ACCT=y CONFIG_BSD_PROCESS_ACCT_V3=y CONFIG_TASKSTATS=y @@ -349,7 +349,6 @@ CONFIG_EFI_ZBOOT=y CONFIG_EFI_BOOTLOADER_CONTROL=m CONFIG_EFI_CAPSULE_LOADER=m CONFIG_EFI_TEST=m -# CONFIG_EFI_DISABLE_RUNTIME is not set CONFIG_MTD=y CONFIG_MTD_CMDLINE_PARTS=y CONFIG_MTD_BLOCK=y diff --git a/arch/loongarch/configs/loongson_2k300_rt_defconfig b/arch/loongarch/configs/loongson_2k300_rt_defconfig new file mode 100644 index 000000000..6cd8cbb8b --- /dev/null +++ b/arch/loongarch/configs/loongson_2k300_rt_defconfig @@ -0,0 +1,800 @@ +CONFIG_LOCALVERSION=".lsgd" +# CONFIG_LOCALVERSION_AUTO is not set +CONFIG_SYSVIPC=y +CONFIG_POSIX_MQUEUE=y +CONFIG_NO_HZ=y +CONFIG_HIGH_RES_TIMERS=y +CONFIG_BPF_SYSCALL=y +CONFIG_BPF_JIT=y +CONFIG_PREEMPT_RT=y +CONFIG_BSD_PROCESS_ACCT=y +CONFIG_BSD_PROCESS_ACCT_V3=y +CONFIG_TASKSTATS=y +CONFIG_TASK_DELAY_ACCT=y +CONFIG_TASK_XACCT=y +CONFIG_TASK_IO_ACCOUNTING=y +CONFIG_LOG_BUF_SHIFT=18 +CONFIG_MEMCG=y +CONFIG_BLK_CGROUP=y +CONFIG_CFS_BANDWIDTH=y +CONFIG_RT_GROUP_SCHED=y +CONFIG_CGROUP_PIDS=y +CONFIG_CGROUP_RDMA=y +CONFIG_CGROUP_FREEZER=y +CONFIG_CGROUP_HUGETLB=y +CONFIG_CGROUP_DEVICE=y +CONFIG_CGROUP_CPUACCT=y +CONFIG_CGROUP_PERF=y +CONFIG_CGROUP_BPF=y +CONFIG_CGROUP_MISC=y +CONFIG_NAMESPACES=y +CONFIG_USER_NS=y +CONFIG_CHECKPOINT_RESTORE=y +CONFIG_SCHED_AUTOGROUP=y +CONFIG_RELAY=y +CONFIG_BLK_DEV_INITRD=y +CONFIG_EXPERT=y +CONFIG_KALLSYMS_ALL=y +CONFIG_PERF_EVENTS=y +CONFIG_KEXEC=y +CONFIG_LOONGSON_2K300=y +CONFIG_HZ_1000=y +CONFIG_CMDLINE="fbcon=logo-pos:center fbcon=logo-count:1" +CONFIG_CMDLINE_EXTEND=y +CONFIG_BUILTIN_DTB=y +# CONFIG_SUSPEND is not set +CONFIG_PM=y +# CONFIG_ACPI_AC is not set +# CONFIG_ACPI_BATTERY is not set +# CONFIG_ACPI_BUTTON is not set +# CONFIG_ACPI_FAN is not set +# CONFIG_ACPI_PROCESSOR is not set +# CONFIG_ACPI_TABLE_UPGRADE is not set +CONFIG_JUMP_LABEL=y +# CONFIG_RANDOMIZE_KSTACK_OFFSET is not set +CONFIG_MODULES=y +CONFIG_MODULE_FORCE_LOAD=y +CONFIG_MODULE_UNLOAD=y +CONFIG_MODULE_FORCE_UNLOAD=y +CONFIG_MODVERSIONS=y +CONFIG_BLK_DEV_INTEGRITY=y +CONFIG_BLK_DEV_ZONED=y +CONFIG_BLK_DEV_THROTTLING=y +CONFIG_BLK_WBT=y +CONFIG_BLK_CGROUP_IOLATENCY=y +CONFIG_BLK_CGROUP_IOCOST=y +CONFIG_BLK_CGROUP_IOPRIO=y +CONFIG_PARTITION_ADVANCED=y +CONFIG_BSD_DISKLABEL=y +CONFIG_UNIXWARE_DISKLABEL=y +CONFIG_CMDLINE_PARTITION=y +CONFIG_ZSWAP=y +CONFIG_ZSWAP_COMPRESSOR_DEFAULT_ZSTD=y +CONFIG_ZBUD=y +# CONFIG_COMPAT_BRK is not set +CONFIG_SPARSEMEM_MANUAL=y +CONFIG_PAGE_REPORTING=y +CONFIG_KSM=y +CONFIG_CMA=y +CONFIG_CMA_SYSFS=y +CONFIG_CMA_AREAS=20 +CONFIG_USERFAULTFD=y +CONFIG_NET=y +CONFIG_PACKET=y +CONFIG_UNIX=y +CONFIG_TLS=m +CONFIG_TLS_DEVICE=y +CONFIG_XFRM_USER=y +CONFIG_NET_KEY=y +CONFIG_XDP_SOCKETS=y +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +CONFIG_IP_ADVANCED_ROUTER=y +CONFIG_IP_MULTIPLE_TABLES=y +CONFIG_IP_ROUTE_MULTIPATH=y +CONFIG_IP_ROUTE_VERBOSE=y +CONFIG_IP_PNP=y +CONFIG_IP_PNP_DHCP=y +CONFIG_IP_PNP_BOOTP=y +CONFIG_IP_PNP_RARP=y +CONFIG_NET_IPIP=m +CONFIG_NET_IPGRE_DEMUX=m +CONFIG_NET_IPGRE=m +CONFIG_NET_IPGRE_BROADCAST=y +CONFIG_IP_MROUTE=y +CONFIG_IP_MROUTE_MULTIPLE_TABLES=y +CONFIG_IP_PIMSM_V1=y +CONFIG_IP_PIMSM_V2=y +CONFIG_INET_AH=m +CONFIG_INET_ESP=m +CONFIG_INET_ESP_OFFLOAD=m +CONFIG_INET_ESPINTCP=y +CONFIG_INET_IPCOMP=m +CONFIG_INET_UDP_DIAG=y +CONFIG_TCP_CONG_ADVANCED=y +CONFIG_TCP_CONG_BBR=m +CONFIG_IPV6_ROUTER_PREF=y +CONFIG_IPV6_ROUTE_INFO=y +CONFIG_INET6_AH=y +CONFIG_INET6_ESP=y +CONFIG_INET6_ESP_OFFLOAD=y +CONFIG_INET6_ESPINTCP=y +CONFIG_INET6_IPCOMP=y +CONFIG_IPV6_MULTIPLE_TABLES=y +CONFIG_IPV6_MROUTE=y +CONFIG_MPTCP=y +CONFIG_NETWORK_PHY_TIMESTAMPING=y +CONFIG_NETFILTER=y +CONFIG_BRIDGE_NETFILTER=m +CONFIG_NETFILTER_NETLINK_LOG=m +CONFIG_NF_CONNTRACK=m +CONFIG_NF_CONNTRACK_AMANDA=m +CONFIG_NF_CONNTRACK_FTP=m +CONFIG_NF_CONNTRACK_NETBIOS_NS=m +CONFIG_NF_CONNTRACK_SNMP=m +CONFIG_NF_CONNTRACK_PPTP=m +CONFIG_NF_CONNTRACK_TFTP=m +CONFIG_NF_CT_NETLINK=m +CONFIG_NF_TABLES=m +CONFIG_NF_TABLES_INET=y +CONFIG_NFT_CT=m +CONFIG_NFT_CONNLIMIT=m +CONFIG_NFT_LOG=m +CONFIG_NFT_LIMIT=m +CONFIG_NFT_MASQ=m +CONFIG_NFT_REDIR=m +CONFIG_NFT_NAT=m +CONFIG_NFT_TUNNEL=m +CONFIG_NFT_QUEUE=m +CONFIG_NFT_QUOTA=m +CONFIG_NFT_REJECT=m +CONFIG_NFT_COMPAT=m +CONFIG_NFT_HASH=m +CONFIG_NFT_FIB_INET=m +CONFIG_NFT_SOCKET=m +CONFIG_NFT_OSF=m +CONFIG_NFT_TPROXY=m +CONFIG_NETFILTER_XT_SET=m +CONFIG_NETFILTER_XT_TARGET_AUDIT=m +CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m +CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m +CONFIG_NETFILTER_XT_TARGET_CONNMARK=m +CONFIG_NETFILTER_XT_TARGET_CT=m +CONFIG_NETFILTER_XT_TARGET_DSCP=m +CONFIG_NETFILTER_XT_TARGET_HMARK=m +CONFIG_NETFILTER_XT_TARGET_IDLETIMER=m +CONFIG_NETFILTER_XT_TARGET_LED=m +CONFIG_NETFILTER_XT_TARGET_LOG=m +CONFIG_NETFILTER_XT_TARGET_MARK=m +CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m +CONFIG_NETFILTER_XT_TARGET_TRACE=m +CONFIG_NETFILTER_XT_TARGET_SECMARK=m +CONFIG_NETFILTER_XT_TARGET_TCPMSS=m +CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m +CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m +CONFIG_NETFILTER_XT_MATCH_BPF=m +CONFIG_NETFILTER_XT_MATCH_CGROUP=m +CONFIG_NETFILTER_XT_MATCH_CLUSTER=m +CONFIG_NETFILTER_XT_MATCH_COMMENT=m +CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m +CONFIG_NETFILTER_XT_MATCH_CONNLABEL=m +CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m +CONFIG_NETFILTER_XT_MATCH_CONNMARK=m +CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m +CONFIG_NETFILTER_XT_MATCH_CPU=m +CONFIG_NETFILTER_XT_MATCH_DCCP=m +CONFIG_NETFILTER_XT_MATCH_DEVGROUP=m +CONFIG_NETFILTER_XT_MATCH_DSCP=m +CONFIG_NETFILTER_XT_MATCH_ESP=m +CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m +CONFIG_NETFILTER_XT_MATCH_HELPER=m +CONFIG_NETFILTER_XT_MATCH_IPCOMP=m +CONFIG_NETFILTER_XT_MATCH_IPRANGE=m +CONFIG_NETFILTER_XT_MATCH_IPVS=m +CONFIG_NETFILTER_XT_MATCH_LENGTH=m +CONFIG_NETFILTER_XT_MATCH_LIMIT=m +CONFIG_NETFILTER_XT_MATCH_MAC=m +CONFIG_NETFILTER_XT_MATCH_MARK=m +CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m +CONFIG_NETFILTER_XT_MATCH_NFACCT=m +CONFIG_NETFILTER_XT_MATCH_OSF=m +CONFIG_NETFILTER_XT_MATCH_OWNER=m +CONFIG_NETFILTER_XT_MATCH_POLICY=m +CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m +CONFIG_NETFILTER_XT_MATCH_QUOTA=m +CONFIG_NETFILTER_XT_MATCH_RATEEST=m +CONFIG_NETFILTER_XT_MATCH_REALM=m +CONFIG_NETFILTER_XT_MATCH_SOCKET=m +CONFIG_NETFILTER_XT_MATCH_STATE=m +CONFIG_NETFILTER_XT_MATCH_STATISTIC=m +CONFIG_NETFILTER_XT_MATCH_STRING=m +CONFIG_NETFILTER_XT_MATCH_TCPMSS=m +CONFIG_NETFILTER_XT_MATCH_TIME=m +CONFIG_NETFILTER_XT_MATCH_U32=m +CONFIG_IP_SET=m +CONFIG_IP_VS=m +CONFIG_IP_VS_IPV6=y +CONFIG_IP_VS_PROTO_TCP=y +CONFIG_IP_VS_PROTO_UDP=y +CONFIG_IP_VS_PROTO_ESP=y +CONFIG_IP_VS_PROTO_AH=y +CONFIG_IP_VS_PROTO_SCTP=y +CONFIG_IP_VS_RR=m +CONFIG_IP_VS_WRR=m +CONFIG_IP_VS_NFCT=y +CONFIG_NFT_DUP_IPV4=m +CONFIG_NFT_FIB_IPV4=m +CONFIG_NF_TABLES_ARP=y +CONFIG_IP_NF_IPTABLES=m +CONFIG_IP_NF_MATCH_AH=m +CONFIG_IP_NF_MATCH_ECN=m +CONFIG_IP_NF_MATCH_RPFILTER=m +CONFIG_IP_NF_MATCH_TTL=m +CONFIG_IP_NF_FILTER=m +CONFIG_IP_NF_TARGET_REJECT=m +CONFIG_IP_NF_TARGET_SYNPROXY=m +CONFIG_IP_NF_NAT=m +CONFIG_IP_NF_TARGET_MASQUERADE=m +CONFIG_IP_NF_TARGET_NETMAP=m +CONFIG_IP_NF_TARGET_REDIRECT=m +CONFIG_IP_NF_MANGLE=m +CONFIG_IP_NF_TARGET_ECN=m +CONFIG_IP_NF_TARGET_TTL=m +CONFIG_IP_NF_RAW=m +CONFIG_IP_NF_SECURITY=m +CONFIG_IP_NF_ARPFILTER=m +CONFIG_IP_NF_ARP_MANGLE=m +CONFIG_NFT_FIB_IPV6=m +CONFIG_IP6_NF_IPTABLES=y +CONFIG_IP6_NF_MATCH_AH=m +CONFIG_IP6_NF_MATCH_EUI64=m +CONFIG_IP6_NF_MATCH_FRAG=m +CONFIG_IP6_NF_MATCH_OPTS=m +CONFIG_IP6_NF_MATCH_IPV6HEADER=m +CONFIG_IP6_NF_MATCH_MH=m +CONFIG_IP6_NF_MATCH_RPFILTER=m +CONFIG_IP6_NF_MATCH_RT=m +CONFIG_IP6_NF_MATCH_SRH=m +CONFIG_IP6_NF_FILTER=y +CONFIG_IP6_NF_TARGET_REJECT=m +CONFIG_IP6_NF_TARGET_SYNPROXY=m +CONFIG_IP6_NF_MANGLE=m +CONFIG_IP6_NF_RAW=m +CONFIG_IP6_NF_SECURITY=m +CONFIG_IP6_NF_NAT=m +CONFIG_IP6_NF_TARGET_MASQUERADE=m +CONFIG_IP6_NF_TARGET_NPT=m +CONFIG_NF_TABLES_BRIDGE=m +CONFIG_NF_CONNTRACK_BRIDGE=m +CONFIG_BRIDGE_NF_EBTABLES=m +CONFIG_BRIDGE_EBT_BROUTE=m +CONFIG_BRIDGE_EBT_T_FILTER=m +CONFIG_BRIDGE_EBT_T_NAT=m +CONFIG_BRIDGE_EBT_ARP=m +CONFIG_BRIDGE_EBT_IP=m +CONFIG_BRIDGE_EBT_IP6=m +CONFIG_IP_SCTP=m +CONFIG_RDS=y +CONFIG_L2TP=m +CONFIG_L2TP_V3=y +CONFIG_L2TP_IP=m +CONFIG_L2TP_ETH=m +CONFIG_BRIDGE=m +CONFIG_VLAN_8021Q=m +CONFIG_VLAN_8021Q_GVRP=y +CONFIG_VLAN_8021Q_MVRP=y +CONFIG_LLC2=m +CONFIG_NET_SCHED=y +CONFIG_NET_SCH_HTB=m +CONFIG_NET_SCH_PRIO=m +CONFIG_NET_SCH_SFQ=m +CONFIG_NET_SCH_TBF=m +CONFIG_NET_SCH_NETEM=m +CONFIG_NET_SCH_INGRESS=m +CONFIG_NET_CLS_BASIC=m +CONFIG_NET_CLS_FW=m +CONFIG_NET_CLS_U32=m +CONFIG_NET_CLS_CGROUP=m +CONFIG_NET_CLS_BPF=m +CONFIG_NET_CLS_ACT=y +CONFIG_NET_ACT_POLICE=m +CONFIG_NET_ACT_GACT=m +CONFIG_NET_ACT_MIRRED=m +CONFIG_NET_ACT_NAT=m +CONFIG_NET_ACT_BPF=m +CONFIG_OPENVSWITCH=m +CONFIG_VSOCKETS=m +CONFIG_VIRTIO_VSOCKETS=m +CONFIG_NETLINK_DIAG=y +CONFIG_CGROUP_NET_PRIO=y +CONFIG_BPF_STREAM_PARSER=y +CONFIG_CAN=y +CONFIG_BT=m +CONFIG_BT_RFCOMM=m +CONFIG_BT_RFCOMM_TTY=y +CONFIG_BT_BNEP=m +CONFIG_BT_BNEP_MC_FILTER=y +CONFIG_BT_BNEP_PROTO_FILTER=y +CONFIG_BT_HIDP=m +CONFIG_BT_HCIBTUSB=m +CONFIG_BT_HCIBTUSB_AUTOSUSPEND=y +CONFIG_BT_HCIBTUSB_MTK=y +CONFIG_BT_HCIUART=m +CONFIG_BT_HCIUART_BCSP=y +CONFIG_BT_HCIUART_ATH3K=y +CONFIG_BT_HCIUART_INTEL=y +CONFIG_BT_HCIUART_AG6XX=y +CONFIG_BT_HCIBCM203X=m +CONFIG_BT_HCIBPA10X=m +CONFIG_BT_HCIBFUSB=m +CONFIG_BT_HCIVHCI=m +CONFIG_BT_MRVL=m +CONFIG_BT_ATH3K=m +CONFIG_BT_VIRTIO=m +CONFIG_CFG80211=m +CONFIG_CFG80211_WEXT=y +CONFIG_MAC80211=m +CONFIG_RFKILL=m +CONFIG_RFKILL_INPUT=y +# CONFIG_PCIEASPM is not set +# CONFIG_VGA_ARB is not set +CONFIG_PCI_HOST_GENERIC=y +CONFIG_PCI_SW_SWITCHTEC=m +CONFIG_UEVENT_HELPER=y +CONFIG_DEVTMPFS=y +CONFIG_DEVTMPFS_MOUNT=y +CONFIG_FW_LOADER_COMPRESS=y +CONFIG_FW_LOADER_COMPRESS_ZSTD=y +CONFIG_EFI_ZBOOT=y +CONFIG_EFI_BOOTLOADER_CONTROL=m +CONFIG_EFI_CAPSULE_LOADER=m +CONFIG_EFI_TEST=m +# CONFIG_EFI_DISABLE_RUNTIME is not set +CONFIG_MTD=y +CONFIG_MTD_CMDLINE_PARTS=y +CONFIG_MTD_BLOCK=y +CONFIG_MTD_BLOCK2MTD=y +CONFIG_MTD_SPI_NOR=y +CONFIG_BLK_DEV_LOOP=y +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_SIZE=32768 +CONFIG_VIRTIO_BLK=y +CONFIG_EEPROM_AT24=m +CONFIG_SCSI=y +CONFIG_BLK_DEV_SD=y +# CONFIG_BLK_DEV_BSG is not set +CONFIG_NETDEVICES=y +CONFIG_BONDING=m +CONFIG_DUMMY=y +CONFIG_WIREGUARD=m +CONFIG_MACVLAN=m +CONFIG_MACVTAP=m +CONFIG_IPVLAN=m +CONFIG_VXLAN=y +CONFIG_TUN=m +CONFIG_VETH=m +CONFIG_VIRTIO_NET=m +# CONFIG_NET_VENDOR_3COM is not set +# CONFIG_NET_VENDOR_ADAPTEC is not set +# CONFIG_NET_VENDOR_AGERE is not set +# CONFIG_NET_VENDOR_ALACRITECH is not set +# CONFIG_NET_VENDOR_ALTEON is not set +# CONFIG_NET_VENDOR_AMAZON is not set +# CONFIG_NET_VENDOR_AMD is not set +# CONFIG_NET_VENDOR_AQUANTIA is not set +# CONFIG_NET_VENDOR_ARC is not set +# CONFIG_NET_VENDOR_ASIX is not set +# CONFIG_NET_VENDOR_ATHEROS is not set +# CONFIG_NET_VENDOR_BROADCOM is not set +# CONFIG_NET_VENDOR_CADENCE is not set +# CONFIG_NET_VENDOR_CAVIUM is not set +# CONFIG_NET_VENDOR_CHELSIO is not set +# CONFIG_NET_VENDOR_CISCO is not set +# CONFIG_NET_VENDOR_CORTINA is not set +# CONFIG_NET_VENDOR_DAVICOM is not set +# CONFIG_NET_VENDOR_DEC is not set +# CONFIG_NET_VENDOR_DLINK is not set +# CONFIG_NET_VENDOR_EMULEX is not set +# CONFIG_NET_VENDOR_ENGLEDER is not set +# CONFIG_NET_VENDOR_EZCHIP is not set +# CONFIG_NET_VENDOR_FUNGIBLE is not set +# CONFIG_NET_VENDOR_GOOGLE is not set +# CONFIG_NET_VENDOR_HUAWEI is not set +# CONFIG_NET_VENDOR_INTEL is not set +# CONFIG_NET_VENDOR_ADI is not set +# CONFIG_NET_VENDOR_LITEX is not set +# CONFIG_NET_VENDOR_MARVELL is not set +# CONFIG_NET_VENDOR_MELLANOX is not set +# CONFIG_NET_VENDOR_META is not set +# CONFIG_NET_VENDOR_MICREL is not set +# CONFIG_NET_VENDOR_MICROCHIP is not set +# CONFIG_NET_VENDOR_MICROSEMI is not set +# CONFIG_NET_VENDOR_MICROSOFT is not set +# CONFIG_NET_VENDOR_MYRI is not set +# CONFIG_NET_VENDOR_NI is not set +# CONFIG_NET_VENDOR_NATSEMI is not set +# CONFIG_NET_VENDOR_NETERION is not set +# CONFIG_NET_VENDOR_NETRONOME is not set +# CONFIG_NET_VENDOR_NVIDIA is not set +# CONFIG_NET_VENDOR_OKI is not set +# CONFIG_NET_VENDOR_PENSANDO is not set +# CONFIG_NET_VENDOR_QLOGIC is not set +# CONFIG_NET_VENDOR_BROCADE is not set +# CONFIG_NET_VENDOR_QUALCOMM is not set +# CONFIG_NET_VENDOR_RDC is not set +# CONFIG_NET_VENDOR_REALTEK is not set +# CONFIG_NET_VENDOR_RENESAS is not set +# CONFIG_NET_VENDOR_ROCKER is not set +# CONFIG_NET_VENDOR_SAMSUNG is not set +# CONFIG_NET_VENDOR_SEEQ is not set +# CONFIG_NET_VENDOR_SILAN is not set +# CONFIG_NET_VENDOR_SIS is not set +# CONFIG_NET_VENDOR_SOLARFLARE is not set +# CONFIG_NET_VENDOR_SMSC is not set +# CONFIG_NET_VENDOR_SOCIONEXT is not set +CONFIG_STMMAC_ETH=y +# CONFIG_DWMAC_LOONGSON is not set +# CONFIG_NET_VENDOR_SUN is not set +# CONFIG_NET_VENDOR_SYNOPSYS is not set +# CONFIG_NET_VENDOR_TEHUTI is not set +# CONFIG_NET_VENDOR_TI is not set +# CONFIG_NET_VENDOR_VERTEXCOM is not set +# CONFIG_NET_VENDOR_VIA is not set +# CONFIG_NET_VENDOR_WANGXUN is not set +# CONFIG_NET_VENDOR_WIZNET is not set +# CONFIG_NET_VENDOR_XILINX is not set +CONFIG_MOTORCOMM_PHY=y +CONFIG_REALTEK_PHY=m +CONFIG_CAN_LSCANFD=y +CONFIG_CAN_LSCANFD_PLATFORM=y +CONFIG_PPP=m +CONFIG_PPP_BSDCOMP=m +CONFIG_PPP_DEFLATE=m +CONFIG_PPP_FILTER=y +CONFIG_PPP_MPPE=m +CONFIG_PPP_MULTILINK=y +CONFIG_PPPOE=m +CONFIG_PPTP=m +CONFIG_PPPOL2TP=m +CONFIG_PPP_ASYNC=m +CONFIG_PPP_SYNC_TTY=m +CONFIG_USB_RTL8150=m +CONFIG_USB_RTL8152=m +# CONFIG_WLAN_VENDOR_ADMTEK is not set +# CONFIG_WLAN_VENDOR_ATH is not set +# CONFIG_WLAN_VENDOR_ATMEL is not set +# CONFIG_WLAN_VENDOR_BROADCOM is not set +# CONFIG_WLAN_VENDOR_INTEL is not set +# CONFIG_WLAN_VENDOR_INTERSIL is not set +# CONFIG_WLAN_VENDOR_MARVELL is not set +# CONFIG_WLAN_VENDOR_MEDIATEK is not set +# CONFIG_WLAN_VENDOR_MICROCHIP is not set +# CONFIG_WLAN_VENDOR_PURELIFI is not set +CONFIG_RT2X00=m +CONFIG_RT2800USB=m +# CONFIG_RT2800USB_RT33XX is not set +# CONFIG_RT2800USB_RT35XX is not set +CONFIG_RTL8187=m +CONFIG_RTL8192CE=m +CONFIG_RTL8192SE=m +CONFIG_RTL8192DE=m +CONFIG_RTL8723AE=m +CONFIG_RTL8723BE=m +CONFIG_RTL8188EE=m +CONFIG_RTL8192EE=m +CONFIG_RTL8821AE=m +CONFIG_RTL8192CU=m +# CONFIG_RTLWIFI_DEBUG is not set +CONFIG_RTL8XXXU=m +CONFIG_RTW88=m +CONFIG_RTW88_8822BU=m +CONFIG_RTW88_8822CU=m +CONFIG_RTW88_8723DU=m +CONFIG_RTW88_8821CU=m +# CONFIG_WLAN_VENDOR_RSI is not set +# CONFIG_WLAN_VENDOR_SILABS is not set +# CONFIG_WLAN_VENDOR_ST is not set +# CONFIG_WLAN_VENDOR_TI is not set +# CONFIG_WLAN_VENDOR_ZYDAS is not set +# CONFIG_WLAN_VENDOR_QUANTENNA is not set +CONFIG_INPUT_SPARSEKMAP=y +CONFIG_INPUT_MOUSEDEV=y +CONFIG_INPUT_MOUSEDEV_PSAUX=y +CONFIG_INPUT_EVDEV=y +# CONFIG_KEYBOARD_ATKBD is not set +CONFIG_KEYBOARD_XTKBD=m +# CONFIG_MOUSE_PS2 is not set +CONFIG_MOUSE_SERIAL=m +CONFIG_INPUT_TOUCHSCREEN=y +CONFIG_TOUCHSCREEN_GOODIX=y +CONFIG_INPUT_MISC=y +CONFIG_INPUT_UINPUT=m +CONFIG_SERIO=m +CONFIG_SERIO_LIBPS2=m +CONFIG_SERIO_RAW=m +CONFIG_LEGACY_PTY_COUNT=16 +CONFIG_SERIAL_8250=y +CONFIG_SERIAL_8250_CONSOLE=y +CONFIG_SERIAL_8250_NR_UARTS=16 +CONFIG_SERIAL_8250_RUNTIME_UARTS=16 +CONFIG_SERIAL_8250_EXTENDED=y +CONFIG_SERIAL_8250_MANY_PORTS=y +CONFIG_SERIAL_8250_SHARE_IRQ=y +CONFIG_SERIAL_8250_RSA=y +# CONFIG_SERIAL_8250_PERICOM is not set +CONFIG_SERIAL_OF_PLATFORM=y +CONFIG_SERIAL_NONSTANDARD=y +CONFIG_VIRTIO_CONSOLE=y +CONFIG_IPMI_HANDLER=m +CONFIG_IPMI_DEVICE_INTERFACE=m +CONFIG_IPMI_SI=m +CONFIG_HW_RANDOM=y +CONFIG_HW_RANDOM_VIRTIO=m +# CONFIG_ACPI_I2C_OPREGION is not set +CONFIG_I2C_CHARDEV=y +CONFIG_I2C_GPIO=y +CONFIG_I2C_LSFS=y +CONFIG_SPI=y +CONFIG_SPI_LS=y +CONFIG_SPI_LS_IO=y +CONFIG_PINCTRL=y +CONFIG_PINCTRL_SINGLE=y +CONFIG_GPIO_SYSFS=y +CONFIG_GPIO_LOONGSON_IRQCHIP=y +CONFIG_GPIO_LOONGSON_64BIT=y +CONFIG_GPIO_PCA953X=y +CONFIG_GPIO_PCA953X_IRQ=y +CONFIG_POWER_RESET=y +CONFIG_POWER_RESET_RESTART=y +CONFIG_POWER_RESET_SYSCON=y +CONFIG_POWER_RESET_SYSCON_POWEROFF=y +CONFIG_SYSCON_REBOOT_MODE=y +CONFIG_SENSORS_W83795=m +CONFIG_SENSORS_W83627HF=m +CONFIG_THERMAL=y +CONFIG_LOONGSON2_THERMAL=y +# CONFIG_MEDIA_CEC_SUPPORT is not set +CONFIG_MEDIA_SUPPORT=y +# CONFIG_DVB_CORE is not set +CONFIG_MEDIA_USB_SUPPORT=y +CONFIG_USB_VIDEO_CLASS=y +# CONFIG_RADIO_ADAPTERS is not set +# CONFIG_MEDIA_TUNER_E4000 is not set +# CONFIG_MEDIA_TUNER_FC0011 is not set +# CONFIG_MEDIA_TUNER_FC0012 is not set +# CONFIG_MEDIA_TUNER_FC0013 is not set +# CONFIG_MEDIA_TUNER_FC2580 is not set +# CONFIG_MEDIA_TUNER_IT913X is not set +# CONFIG_MEDIA_TUNER_M88RS6000T is not set +# CONFIG_MEDIA_TUNER_MAX2165 is not set +# CONFIG_MEDIA_TUNER_MC44S803 is not set +# CONFIG_MEDIA_TUNER_MSI001 is not set +# CONFIG_MEDIA_TUNER_MT2060 is not set +# CONFIG_MEDIA_TUNER_MT2063 is not set +# CONFIG_MEDIA_TUNER_MT20XX is not set +# CONFIG_MEDIA_TUNER_MT2131 is not set +# CONFIG_MEDIA_TUNER_MT2266 is not set +# CONFIG_MEDIA_TUNER_MXL301RF is not set +# CONFIG_MEDIA_TUNER_MXL5005S is not set +# CONFIG_MEDIA_TUNER_MXL5007T is not set +# CONFIG_MEDIA_TUNER_QM1D1B0004 is not set +# CONFIG_MEDIA_TUNER_QM1D1C0042 is not set +# CONFIG_MEDIA_TUNER_QT1010 is not set +# CONFIG_MEDIA_TUNER_R820T is not set +# CONFIG_MEDIA_TUNER_SI2157 is not set +# CONFIG_MEDIA_TUNER_SIMPLE is not set +# CONFIG_MEDIA_TUNER_TDA18212 is not set +# CONFIG_MEDIA_TUNER_TDA18218 is not set +# CONFIG_MEDIA_TUNER_TDA18250 is not set +# CONFIG_MEDIA_TUNER_TDA18271 is not set +# CONFIG_MEDIA_TUNER_TDA827X is not set +# CONFIG_MEDIA_TUNER_TDA8290 is not set +# CONFIG_MEDIA_TUNER_TDA9887 is not set +# CONFIG_MEDIA_TUNER_TEA5761 is not set +# CONFIG_MEDIA_TUNER_TEA5767 is not set +# CONFIG_MEDIA_TUNER_TUA9001 is not set +# CONFIG_MEDIA_TUNER_XC2028 is not set +# CONFIG_MEDIA_TUNER_XC4000 is not set +# CONFIG_MEDIA_TUNER_XC5000 is not set +CONFIG_DRM=y +CONFIG_DRM_PANEL_LVDS=y +CONFIG_DRM_DISPLAY_CONNECTOR=y +CONFIG_DRM_SIMPLE_BRIDGE=y +CONFIG_DRM_LOONGSON=y +CONFIG_DRM_SIMPLEDRM=y +CONFIG_FB=y +CONFIG_FB_EFI=y +CONFIG_FB_MODE_HELPERS=y +CONFIG_LCD_CLASS_DEVICE=y +CONFIG_LCD_PLATFORM=y +CONFIG_BACKLIGHT_CLASS_DEVICE=y +CONFIG_BACKLIGHT_GPIO=y +CONFIG_BACKLIGHT_LED=y +CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y +CONFIG_LOGO=y +CONFIG_SOUND=y +CONFIG_SND=y +CONFIG_SND_SEQUENCER=m +CONFIG_SND_SEQ_DUMMY=m +CONFIG_SND_BT87X=m +CONFIG_SND_BT87X_OVERCLOCK=y +CONFIG_SND_HDA_INTEL=y +CONFIG_SND_HDA_HWDEP=y +CONFIG_SND_HDA_INPUT_BEEP=y +CONFIG_SND_HDA_PATCH_LOADER=y +CONFIG_SND_HDA_CODEC_REALTEK=y +CONFIG_SND_HDA_CODEC_SIGMATEL=y +CONFIG_SND_HDA_CODEC_HDMI=y +CONFIG_SND_HDA_CODEC_CONEXANT=y +CONFIG_SND_USB_AUDIO=m +CONFIG_SND_SOC=y +CONFIG_SND_SOC_LOONGSON=y +CONFIG_SND_LS=y +CONFIG_SND_LS_PCM=y +CONFIG_SND_LS_PCM_GENERIC_DMA=y +CONFIG_SND_SOC_ES8328_I2C=y +CONFIG_SND_VIRTIO=m +CONFIG_HIDRAW=y +CONFIG_UHID=m +CONFIG_HID_A4TECH=m +CONFIG_HID_CHERRY=m +CONFIG_HID_LOGITECH=m +CONFIG_HID_LOGITECH_DJ=m +CONFIG_LOGITECH_FF=y +CONFIG_LOGIRUMBLEPAD2_FF=y +CONFIG_LOGIG940_FF=y +CONFIG_HID_MICROSOFT=m +CONFIG_HID_MULTITOUCH=m +CONFIG_HID_SUNPLUS=m +CONFIG_USB_HIDDEV=y +CONFIG_USB=y +# CONFIG_USB_PCI is not set +CONFIG_USB_OTG=y +CONFIG_USB_MON=y +CONFIG_USB_EHCI_HCD=y +CONFIG_USB_EHCI_ROOT_HUB_TT=y +CONFIG_USB_EHCI_HCD_PLATFORM=y +CONFIG_USB_OHCI_HCD=y +CONFIG_USB_OHCI_HCD_PLATFORM=y +CONFIG_USB_ACM=m +CONFIG_USB_PRINTER=m +CONFIG_USB_STORAGE=y +CONFIG_USB_UAS=y +CONFIG_USB_DWC2=y +CONFIG_USB_DWC2_HOST=y +CONFIG_USB_SERIAL=m +CONFIG_USB_SERIAL_CH341=m +CONFIG_USB_SERIAL_CP210X=m +CONFIG_USB_SERIAL_FTDI_SIO=m +CONFIG_USB_SERIAL_PL2303=m +CONFIG_USB_SERIAL_OPTION=m +CONFIG_USB_GADGET=y +CONFIG_TYPEC=m +CONFIG_TYPEC_TCPM=m +CONFIG_TYPEC_TCPCI=m +CONFIG_TYPEC_UCSI=m +CONFIG_UCSI_ACPI=m +CONFIG_MMC=y +CONFIG_MMC_LS2K=y +CONFIG_LEDS_GPIO=y +CONFIG_LEDS_PWM=y +CONFIG_LEDS_TRIGGER_HEARTBEAT=y +CONFIG_RTC_CLASS=y +CONFIG_RTC_DRV_DS1307=y +CONFIG_RTC_DRV_EFI=y +CONFIG_RTC_DRV_LOONGSON=y +CONFIG_DMADEVICES=y +CONFIG_LOONGSON2_APB_DMA=y +CONFIG_LSIA_DMA=y +CONFIG_UDMABUF=y +CONFIG_DMABUF_HEAPS=y +CONFIG_DMABUF_HEAPS_SYSTEM=y +CONFIG_DMABUF_HEAPS_CMA=y +CONFIG_UIO=y +CONFIG_UIO_PDRV_GENIRQ=y +CONFIG_UIO_DMEM_GENIRQ=y +# CONFIG_VIRTIO_MENU is not set +# CONFIG_VHOST_MENU is not set +# CONFIG_LOONGARCH_PLATFORM_DEVICES is not set +CONFIG_COMMON_CLK_LOONGSON2=y +CONFIG_IOMMU_DEBUGFS=y +CONFIG_LOONGSON2_GUTS=y +CONFIG_LOONGSON2_PM=y +CONFIG_IIO=y +CONFIG_LS_2K300_ADC=y +CONFIG_PWM=y +CONFIG_PWM_LOONGSON=y +CONFIG_GENERIC_PHY=y +CONFIG_EXT2_FS=y +CONFIG_EXT2_FS_XATTR=y +CONFIG_EXT2_FS_POSIX_ACL=y +CONFIG_EXT2_FS_SECURITY=y +CONFIG_EXT3_FS=y +CONFIG_EXT3_FS_POSIX_ACL=y +CONFIG_EXT3_FS_SECURITY=y +CONFIG_EXPORTFS_BLOCK_OPS=y +CONFIG_FANOTIFY=y +CONFIG_FANOTIFY_ACCESS_PERMISSIONS=y +CONFIG_QUOTA=y +CONFIG_AUTOFS_FS=y +CONFIG_OVERLAY_FS=y +CONFIG_OVERLAY_FS_INDEX=y +CONFIG_OVERLAY_FS_XINO_AUTO=y +CONFIG_OVERLAY_FS_METACOPY=y +CONFIG_ISO9660_FS=y +CONFIG_JOLIET=y +CONFIG_ZISOFS=y +CONFIG_MSDOS_FS=y +CONFIG_VFAT_FS=y +CONFIG_FAT_DEFAULT_CODEPAGE=936 +CONFIG_FAT_DEFAULT_IOCHARSET="gb2312" +CONFIG_EXFAT_FS=y +CONFIG_NTFS3_FS=y +CONFIG_NTFS3_64BIT_CLUSTER=y +CONFIG_NTFS3_LZX_XPRESS=y +CONFIG_PROC_KCORE=y +CONFIG_TMPFS=y +CONFIG_TMPFS_POSIX_ACL=y +CONFIG_HUGETLBFS=y +CONFIG_CONFIGFS_FS=y +# CONFIG_MISC_FILESYSTEMS is not set +CONFIG_NFS_FS=y +CONFIG_NFS_V3_ACL=y +CONFIG_NFS_V4=y +CONFIG_NFS_V4_1=y +CONFIG_NFS_V4_2=y +CONFIG_ROOT_NFS=y +# CONFIG_NFS_DISABLE_UDP_SUPPORT is not set +CONFIG_NLS_CODEPAGE_936=y +CONFIG_NLS_ASCII=y +CONFIG_NLS_UTF8=y +CONFIG_KEY_DH_OPERATIONS=y +CONFIG_SECURITY=y +CONFIG_SECURITY_SELINUX=y +CONFIG_SECURITY_SELINUX_BOOTPARAM=y +CONFIG_SECURITY_APPARMOR=y +CONFIG_SECURITY_YAMA=y +CONFIG_DEFAULT_SECURITY_DAC=y +CONFIG_CRYPTO_USER=m +# CONFIG_CRYPTO_MANAGER_DISABLE_TESTS is not set +CONFIG_CRYPTO_CRYPTD=m +CONFIG_CRYPTO_ANUBIS=m +CONFIG_CRYPTO_BLOWFISH=m +CONFIG_CRYPTO_CAST5=m +CONFIG_CRYPTO_CAST6=m +CONFIG_CRYPTO_KHAZAD=m +CONFIG_CRYPTO_SEED=m +CONFIG_CRYPTO_SERPENT=m +CONFIG_CRYPTO_TEA=m +CONFIG_CRYPTO_TWOFISH=m +CONFIG_CRYPTO_CHACHA20POLY1305=m +CONFIG_CRYPTO_ESSIV=m +CONFIG_CRYPTO_BLAKE2B=m +CONFIG_CRYPTO_VMAC=m +CONFIG_CRYPTO_WP512=m +CONFIG_CRYPTO_XXHASH=y +CONFIG_CRYPTO_CRC32=m +CONFIG_CRYPTO_LZO=m +CONFIG_CRYPTO_842=m +CONFIG_CRYPTO_LZ4=m +CONFIG_CRYPTO_LZ4HC=m +CONFIG_CRYPTO_USER_API_HASH=m +CONFIG_CRYPTO_USER_API_SKCIPHER=m +CONFIG_CRYPTO_USER_API_RNG=m +CONFIG_CRYPTO_USER_API_AEAD=m +CONFIG_CRYPTO_DEV_VIRTIO=m +CONFIG_CRC_ITU_T=m +# CONFIG_XZ_DEC_POWERPC is not set +# CONFIG_XZ_DEC_SPARC is not set +CONFIG_DMA_CMA=y +CONFIG_CMA_SIZE_MBYTES=0 +CONFIG_IRQ_POLL=y +CONFIG_PRINTK_TIME=y +CONFIG_DYNAMIC_DEBUG=y +CONFIG_STRIP_ASM_SYMS=y +CONFIG_MAGIC_SYSRQ=y +CONFIG_DEBUG_FS=y +# CONFIG_SCHED_DEBUG is not set +CONFIG_SCHEDSTATS=y +# CONFIG_FTRACE is not set +CONFIG_UNWINDER_ORC=y diff --git a/drivers/i2c/busses/i2c-lsfs.c b/drivers/i2c/busses/i2c-lsfs.c index 50e95d874..890c63141 100644 --- a/drivers/i2c/busses/i2c-lsfs.c +++ b/drivers/i2c/busses/i2c-lsfs.c @@ -23,49 +23,49 @@ #include /* Loongson I2C offset registers */ -#define I2C_CR1 0x00 -#define I2C_CR2 0x04 -#define I2C_DR 0x10 -#define I2C_SR1 0x14 -#define I2C_SR2 0x18 -#define I2C_CCR 0x1C -#define I2C_TRISE 0x20 -#define I2C_FLTR 0x24 +#define I2C_CR1 0x00 +#define I2C_CR2 0x04 +#define I2C_DR 0x10 +#define I2C_SR1 0x14 +#define I2C_SR2 0x18 +#define I2C_CCR 0x1C +#define I2C_TRISE 0x20 +#define I2C_FLTR 0x24 /* Loongson I2C control 1*/ -#define I2C_CR1_POS BIT(11) -#define I2C_CR1_ACK BIT(10) -#define I2C_CR1_STOP BIT(9) -#define I2C_CR1_START BIT(8) -#define I2C_CR1_PE BIT(0) +#define I2C_CR1_POS BIT(11) +#define I2C_CR1_ACK BIT(10) +#define I2C_CR1_STOP BIT(9) +#define I2C_CR1_START BIT(8) +#define I2C_CR1_PE BIT(0) /* Loongson I2C control 2 */ -#define I2C_CR2_FREQ_MASK GENMASK(5, 0) -#define I2C_CR2_FREQ(n) ((n) & I2C_CR2_FREQ_MASK) -#define I2C_CR2_ITBUFEN BIT(10) -#define I2C_CR2_ITEVTEN BIT(9) -#define I2C_CR2_ITERREN BIT(8) -#define I2C_CR2_IRQ_MASK (I2C_CR2_ITBUFEN | \ - I2C_CR2_ITEVTEN | \ - I2C_CR2_ITERREN) +#define I2C_CR2_FREQ_MASK GENMASK(5, 0) +#define I2C_CR2_FREQ(n) ((n) & I2C_CR2_FREQ_MASK) +#define I2C_CR2_ITBUFEN BIT(10) +#define I2C_CR2_ITEVTEN BIT(9) +#define I2C_CR2_ITERREN BIT(8) +#define I2C_CR2_IRQ_MASK (I2C_CR2_ITBUFEN | \ + I2C_CR2_ITEVTEN | \ + I2C_CR2_ITERREN) /* Loongson I2C Status 1 */ -#define I2C_SR1_AF BIT(10) -#define I2C_SR1_ARLO BIT(9) -#define I2C_SR1_BERR BIT(8) -#define I2C_SR1_TXE BIT(7) -#define I2C_SR1_RXNE BIT(6) -#define I2C_SR1_BTF BIT(2) -#define I2C_SR1_ADDR BIT(1) -#define I2C_SR1_SB BIT(0) -#define I2C_SR1_ITEVTEN_MASK (I2C_SR1_BTF | \ - I2C_SR1_ADDR | \ - I2C_SR1_SB) -#define I2C_SR1_ITBUFEN_MASK (I2C_SR1_TXE | \ - I2C_SR1_RXNE) -#define I2C_SR1_ITERREN_MASK (I2C_SR1_AF | \ - I2C_SR1_ARLO | \ - I2C_SR1_BERR) +#define I2C_SR1_AF BIT(10) +#define I2C_SR1_ARLO BIT(9) +#define I2C_SR1_BERR BIT(8) +#define I2C_SR1_TXE BIT(7) +#define I2C_SR1_RXNE BIT(6) +#define I2C_SR1_BTF BIT(2) +#define I2C_SR1_ADDR BIT(1) +#define I2C_SR1_SB BIT(0) +#define I2C_SR1_ITEVTEN_MASK (I2C_SR1_BTF | \ + I2C_SR1_ADDR | \ + I2C_SR1_SB) +#define I2C_SR1_ITBUFEN_MASK (I2C_SR1_TXE | \ + I2C_SR1_RXNE) +#define I2C_SR1_ITERREN_MASK (I2C_SR1_AF | \ + I2C_SR1_ARLO | \ + I2C_SR1_BERR) /* Loongson I2C Status 2 */ #define I2C_SR2_BUSY BIT(1) @@ -103,6 +103,7 @@ struct priv_msg { * @complete: completion of I2C message * @speed: Standard or Fast are supported * @msg: I2C transfer information + * @freq: I2C controller input clock freq */ struct ls_i2c_dev { struct i2c_adapter adap; @@ -111,6 +112,7 @@ struct ls_i2c_dev { struct completion complete; int speed; struct priv_msg msg; + int freq; }; static inline void i2c_set_bits(void __iomem *reg, u32 mask) @@ -130,7 +132,7 @@ static void ls_i2c_disable_irq(struct ls_i2c_dev *i2c_dev) i2c_clr_bits(reg, I2C_CR2_IRQ_MASK); } -#define INPUT_REF_CLK 120000000 +#define INPUT_DEFAULT_CLK 200000000 static int ls_i2c_hw_config(struct ls_i2c_dev *i2c_dev) { @@ -142,9 +144,9 @@ static int ls_i2c_hw_config(struct ls_i2c_dev *i2c_dev) i2c_set_bits(i2c_dev->base + I2C_TRISE, 0x3f); if (i2c_dev->speed == LS_I2C_SPEED_STANDARD) { - val = DIV_ROUND_UP(INPUT_REF_CLK, 100000 * 2); + val = DIV_ROUND_UP(i2c_dev->freq, 100000 * 2); } else { - val = DIV_ROUND_UP(INPUT_REF_CLK, 400000 * 3); + val = DIV_ROUND_UP(i2c_dev->freq, 400000 * 3); /* Select Fast mode */ ccr |= I2C_CCR_FS; @@ -164,9 +166,9 @@ static int ls_i2c_wait_free_bus(struct ls_i2c_dev *i2c_dev) int ret; ret = readl_poll_timeout(i2c_dev->base + I2C_SR2, - status, - !(status & I2C_SR2_BUSY), - 10, 1000); + status, + !(status & I2C_SR2_BUSY), + 10, 2000); if (ret) { dev_dbg(i2c_dev->dev, "bus not free\n"); ret = -EBUSY; @@ -175,262 +177,280 @@ static int ls_i2c_wait_free_bus(struct ls_i2c_dev *i2c_dev) return ret; } -static void ls_i2c_write_byte(struct ls_i2c_dev *i2c_dev, u8 byte) +static int i2c_wait_EV_signal(struct ls_i2c_dev *i2c_dev, int reg, int mask, int target) { - writel(byte, i2c_dev->base + I2C_DR); -} - -static void ls_i2c_read_msg(struct ls_i2c_dev *i2c_dev) -{ - struct priv_msg *msg = &i2c_dev->msg; - - *msg->buf++ = readl(i2c_dev->base + I2C_DR); - msg->count--; -} - -static void ls_i2c_terminate_xfer(struct ls_i2c_dev *i2c_dev) -{ - struct priv_msg *msg = &i2c_dev->msg; - - ls_i2c_disable_irq(i2c_dev); - i2c_set_bits(i2c_dev->base + I2C_CR1, (1 << (8 + msg->stop))); - complete(&i2c_dev->complete); -} - -static void ls_i2c_handle_write(struct ls_i2c_dev *i2c_dev) -{ - struct priv_msg *msg = &i2c_dev->msg; - void __iomem *reg = i2c_dev->base + I2C_CR2; - - if (msg->count) { - ls_i2c_write_byte(i2c_dev, *msg->buf++); - msg->count--; - if (!msg->count) - i2c_clr_bits(reg, I2C_CR2_ITBUFEN); - } else { - ls_i2c_terminate_xfer(i2c_dev); - } -} - -static void ls_i2c_handle_read(struct ls_i2c_dev *i2c_dev, int flag) -{ - struct priv_msg *msg = &i2c_dev->msg; - void __iomem *reg = i2c_dev->base + I2C_CR2; - int i; - - switch (msg->count) { - case 1: - /* only transmit 1 bytes condition */ - ls_i2c_disable_irq(i2c_dev); - ls_i2c_read_msg(i2c_dev); - complete(&i2c_dev->complete); - break; - case 2: - if (flag != 1) { - /* ensure only transmit 2 bytes condition */ - i2c_clr_bits(reg, I2C_CR2_ITBUFEN); - break; - } - i2c_set_bits(i2c_dev->base + I2C_CR1, (1 << (8 + msg->stop))); - - ls_i2c_disable_irq(i2c_dev); - - for (i = 2; i > 0; i--) - ls_i2c_read_msg(i2c_dev); - - i2c_clr_bits(i2c_dev->base + I2C_CR1, I2C_CR1_POS); - complete(&i2c_dev->complete); - break; - case 3: - if (readl(i2c_dev->base + I2C_CR2) & I2C_CR2_ITBUFEN) { - i2c_clr_bits(reg, I2C_CR2_ITBUFEN); - break; - } - - reg = i2c_dev->base + I2C_CR1; - i2c_clr_bits(reg, I2C_CR1_ACK); - fallthrough; - default: - ls_i2c_read_msg(i2c_dev); - } -} - -/** - * ls_i2c_handle_rx_addr() - * master receiver - * @i2c_dev: Controller's private data - */ -static void ls_i2c_handle_rx_addr(struct ls_i2c_dev *i2c_dev) -{ - struct priv_msg *msg = &i2c_dev->msg; - - switch (msg->count) { - case 0: - ls_i2c_terminate_xfer(i2c_dev); - break; - case 1: - i2c_clr_bits(i2c_dev->base + I2C_CR1, - (I2C_CR1_ACK | I2C_CR1_POS)); - /* start or stop */ - i2c_set_bits(i2c_dev->base + I2C_CR1, (1 << (8 + msg->stop))); - break; - case 2: - i2c_clr_bits(i2c_dev->base + I2C_CR1, I2C_CR1_ACK); - i2c_set_bits(i2c_dev->base + I2C_CR1, I2C_CR1_POS); - break; - - default: - i2c_set_bits(i2c_dev->base + I2C_CR1, I2C_CR1_ACK); - i2c_clr_bits(i2c_dev->base + I2C_CR1, I2C_CR1_POS); - break; - } -} - -static irqreturn_t ls_i2c_isr_error(u32 status, void *data) -{ - struct ls_i2c_dev *i2c_dev = data; - struct priv_msg *msg = &i2c_dev->msg; - - /* Arbitration lost */ - if (status & I2C_SR1_ARLO) { - i2c_clr_bits(i2c_dev->base + I2C_SR1, I2C_SR1_ARLO); - msg->result = -EAGAIN; - } - - /* - * Acknowledge failure: - * In master transmitter mode a Stop must be generated by software - */ - if (status & I2C_SR1_AF) { - i2c_set_bits(i2c_dev->base + I2C_CR1, I2C_CR1_STOP); - i2c_clr_bits(i2c_dev->base + I2C_SR1, I2C_SR1_AF); - msg->result = -EIO; - } - - /* Bus error */ - if (status & I2C_SR1_BERR) { - i2c_clr_bits(i2c_dev->base + I2C_SR1, I2C_SR1_BERR); - msg->result = -EIO; - } - - ls_i2c_disable_irq(i2c_dev); - complete(&i2c_dev->complete); - - return IRQ_HANDLED; -} - -/** - * ls_i2c_isr_event() - Interrupt routine for I2C bus event - * @irq: interrupt number - * @data: Controller's private data - */ -static irqreturn_t ls_i2c_isr_event(int irq, void *data) -{ - struct ls_i2c_dev *i2c_dev = data; - struct priv_msg *msg = &i2c_dev->msg; - u32 status, ien, event, cr2; - u32 possible_status = I2C_SR1_ITEVTEN_MASK; - int i; - - status = readl(i2c_dev->base + I2C_SR1); - if (status & (I2C_SR1_ARLO | I2C_SR1_AF | I2C_SR1_BERR)) - return ls_i2c_isr_error(status, data); - - cr2 = readl(i2c_dev->base + I2C_CR2); - ien = cr2 & I2C_CR2_IRQ_MASK; - - /* Update possible_status if buffer interrupt is enabled */ - if (ien & I2C_CR2_ITBUFEN) - possible_status |= I2C_SR1_ITBUFEN_MASK; - event = status & possible_status; - - if (!event) { - dev_dbg(i2c_dev->dev, - "spurious evt irq (status=0x%08x, ien=0x%08x)\n", - status, ien); - return IRQ_NONE; - } - - /* Start condition generated */ - if (event & I2C_SR1_SB) - ls_i2c_write_byte(i2c_dev, msg->addr); - - /* I2C Address sent */ - if (event & I2C_SR1_ADDR) { - if (msg->addr & I2C_M_RD) - ls_i2c_handle_rx_addr(i2c_dev); - /* Clear ADDR flag */ - readl(i2c_dev->base + I2C_SR2); - /* Enable buffer interrupts for RX/TX not empty events */ - i2c_set_bits(i2c_dev->base + I2C_CR2, I2C_CR2_ITBUFEN); - } - - if (msg->addr & I2C_M_RD) { - /* RX */ - if (event & 0x40) - ls_i2c_handle_read(i2c_dev, 0); - if (event & 0x4) - ls_i2c_handle_read(i2c_dev, 1); - } else { - /* TX */ - if (event & 0x84) - for (i = 0; i < 1 + !!((event & 0x84) == 0x84); i++) - ls_i2c_handle_write(i2c_dev); - } - - return IRQ_HANDLED; -} - -static int ls_i2c_xfer_msg(struct ls_i2c_dev *i2c_dev, - struct i2c_msg *msg, bool is_stop) -{ - struct priv_msg *priv_msg = &i2c_dev->msg; - unsigned long timeout; + u32 status; int ret; - priv_msg->addr = i2c_8bit_addr_from_msg(msg); - priv_msg->buf = msg->buf; - priv_msg->count = msg->len; - priv_msg->stop = is_stop; - priv_msg->result = 0; - - reinit_completion(&i2c_dev->complete); - - /* Enable events and errors interrupts */ - i2c_set_bits(i2c_dev->base + I2C_CR2, - I2C_CR2_ITEVTEN | I2C_CR2_ITERREN); - - timeout = wait_for_completion_timeout(&i2c_dev->complete, - i2c_dev->adap.timeout); - ret = priv_msg->result; - - if (!timeout) - ret = -ETIMEDOUT; + ret = readl_poll_timeout(i2c_dev->base + reg, + status, + (!!(status & mask) == target), + 20, 1000); + if (ret) { + dev_dbg(i2c_dev->dev, "wait timeout\n"); + ret = -EBUSY; + } return ret; } +// i2c_wait_EV_signal 返回非 0 时所在对应函数返回 I2C_XFER_TIMEOUT_ERROR +#define i2c_wait_EV_signal_t(dev, reg_offset, mask, target) if (i2c_wait_EV_signal(dev, reg_offset, mask, target)) { return -EBUSY;} + +/* + * @brief: i2c主模式,接收状态结束时的设置 + * @param: base: i2c控制器基地址 + * @param: stop: 是否发送关闭i2c总线信号 + */ +static inline void i2c_setup_CR1_end_read(unsigned char *base, uint8_t stop) +{ + unsigned int temp; + + temp = readl((base + I2C_CR1)); + temp |= (I2C_CR1_ACK | I2C_CR1_POS); + temp ^= (I2C_CR1_ACK | I2C_CR1_POS); + temp |= (stop << 9); + + writel(temp, (base + I2C_CR1)); +} + +/* + * @brief: i2c主模式接收状态,读取i2c DR 寄存器,放到msg的data里面 + * @param: base: i2c控制器基地址 + * @param: msg: i2c读取描述(i2c_msg)实例指针 + * @param: i: 当前读取数据所在data数组的下标 + */ +static inline void i2c_update_read_msg_data(unsigned char *base, struct i2c_msg *msg, int i) +{ + msg->buf[i] = ((readl(base + I2C_DR)) & 0xff); +} + +/* + * @brief: i2c主模式接收状态,当只读取1个字节时的操作函数(从地址发送后的操作) + * @param: i2c_dev: ls_i2c_dev + * @param: msg: i2c读取描述(i2c_msg)实例指针 + * @return: 0代表操作成功,否则操作失败 + */ +static int i2c_xfer_r_1(struct ls_i2c_dev *i2c_dev, struct i2c_msg *msg, int is_stop) +{ + unsigned char* base; + base = i2c_dev->base; + + i2c_setup_CR1_end_read(base, is_stop); + i2c_wait_EV_signal_t(i2c_dev, I2C_SR1, I2C_SR1_RXNE, 1); + i2c_update_read_msg_data(base, msg, 0); + return 0; +} + +/* + * @brief: i2c主模式接收状态,当只读取2个字节时的操作函数(从地址发送后的操作) + * @param: i2c_dev: ls_i2c_dev + * @param: msg: i2c读取描述(i2c_msg)实例指针 + * @return: 0代表操作成功,否则操作失败 + */ +static int i2c_xfer_r_2(struct ls_i2c_dev *i2c_dev, struct i2c_msg *msg, int is_stop) +{ + unsigned char* base; + base = i2c_dev->base; + + i2c_wait_EV_signal_t(i2c_dev, I2C_SR1, I2C_SR1_RXNE, 1); + i2c_update_read_msg_data(base, msg, 0); + i2c_setup_CR1_end_read(base, is_stop); + i2c_wait_EV_signal_t(i2c_dev, I2C_SR1, I2C_SR1_RXNE, 1); + i2c_update_read_msg_data(base, msg, 1); + return 0; +} + +/* + * @brief: i2c主模式接收状态,当读取大于等于3个字节时的操作函数(从地址发送后的操作) + * @param: i2c_dev: ls_i2c_dev + * @param: msg: i2c读取描述(i2c_msg)实例指针 + * @return: 0代表操作成功,否则操作失败 + */ +static int i2c_xfer_r_3m(struct ls_i2c_dev *i2c_dev, struct i2c_msg *msg, int is_stop) +{ + unsigned char* base; + int i; + int remain_read; + + base = i2c_dev->base; + + i = 0; + remain_read = msg->len; + while (1) + { + if (remain_read <= 3) + { + break; + } + // 倒数3个字节之前,看 I2C_SR1_RXNE 信号即可,有就读取DR + i2c_wait_EV_signal_t(i2c_dev, I2C_SR1, I2C_SR1_RXNE, 1); + i2c_update_read_msg_data(base, msg, i++); + --remain_read; + } + // 见2k300手册 主接收模式(非及时、3 字节)示意图 + i2c_wait_EV_signal_t(i2c_dev, I2C_SR1, I2C_SR1_BTF, 1); // 倒数3个字节,I2C_SR1_BTF信号为1时,代表已经接收了两个字节 + i2c_update_read_msg_data(base, msg, i++); // 读取DR,此时倒数第二个字节开始从移位寄存器到DR + i2c_setup_CR1_end_read(base, is_stop); // 下一个字节(也就是最后一个字节)之后需要发送 NACK 和 stop 命令了 + i2c_wait_EV_signal_t(i2c_dev, I2C_SR1, I2C_SR1_BTF, 1); // 这时已经最后一个字节到来 + i2c_update_read_msg_data(base, msg, i++); // 这次读取之后,等待移位寄存器填充DR + i2c_wait_EV_signal_t(i2c_dev, I2C_SR1, I2C_SR1_RXNE, 1); // 没有字节传输动作,但是移位寄存器已经把最后一个字节填充到DR + i2c_update_read_msg_data(base, msg, i++); // 读取DR + return 0; +} + +/* + * @brief: i2c主模式读取数据处理函数 + * @param: i2c_dev: ls_i2c_dev + * @param: msg: i2c读取描述(i2c_msg)实例指针 + * @return: 0代表操作成功,否则操作失败 + */ +static int i2c_xfer_r(struct ls_i2c_dev *i2c_dev, struct i2c_msg *msg, int is_stop) +{ + unsigned char* base; + unsigned int temp; + unsigned char xfer_data; + int ret; + + base = i2c_dev->base; + + // START信号发送开始命令,ACK则会在接收到数据后发送ACK命令 + temp = readl((base + I2C_CR1)); + temp |= I2C_CR1_START; + temp |= I2C_CR1_ACK; + writel(temp, (base + I2C_CR1)); + + i2c_wait_EV_signal_t(i2c_dev, I2C_SR1, I2C_SR1_SB, 1); + + // 把7bit地址左移一位,然后最后1bit设置为1,代表此从地址用于读取 + xfer_data = msg->addr; + xfer_data <<= 1; + xfer_data |= 1; // bit 0 == 1 read + writeb(xfer_data, (base + I2C_DR)); + + i2c_wait_EV_signal_t(i2c_dev, I2C_SR1, I2C_SR1_ADDR, 1); + temp = readl((base + I2C_SR2)); + + // 针对不同的需要读取的字节数,调用不同的处理函数 + if (msg->len == 1) // read 1 byte + { + ret = i2c_xfer_r_1(i2c_dev, msg, is_stop); + } + else if (msg->len == 2) // read 2 byte + { + ret = i2c_xfer_r_2(i2c_dev, msg, is_stop); + } + else if (msg->len > 3) // read 3 or more than 3 byte + { + ret = i2c_xfer_r_3m(i2c_dev, msg, is_stop); + } + + if (ret) + return ret; + + // 如果需要关闭总线,等待busy信号为0,代表总线总体已经空闲 + if (is_stop) + { + i2c_wait_EV_signal_t(i2c_dev, I2C_SR2, I2C_SR2_BUSY, 0); + } + + return 0; +} + +/* + * @brief: i2c主模式写入数据处理函数 + * @param: i2c_dev: ls_i2c_dev + * @param: msg: i2c写入描述(i2c_msg)实例指针 + * @return: 0代表操作成功,否则操作失败 + */ +static int i2c_xfer_w(struct ls_i2c_dev *i2c_dev, struct i2c_msg *msg, int is_stop) +{ + unsigned char* base; + unsigned int temp; + int i; + unsigned char xfer_data; + + base = i2c_dev->base; + + // START信号发送开始命令,ACK则会在接收到数据后发送ACK命令 + temp = readl((base + I2C_CR1)); + temp |= I2C_CR1_START; + writel(temp, (base + I2C_CR1)); + + i2c_wait_EV_signal_t(i2c_dev, I2C_SR1, I2C_SR1_SB, 1); + + // 把7bit地址左移一位,然后最后1bit设置为1,代表此从地址用于读取 + xfer_data = msg->addr; + xfer_data <<= 1; // bit 0 == 0 write + writeb(xfer_data, (base + I2C_DR)); + + i2c_wait_EV_signal_t(i2c_dev, I2C_SR1, I2C_SR1_ADDR, 1); + temp = readl((base + I2C_SR2)); + + // 等待发送数据寄存器为空 + i2c_wait_EV_signal_t(i2c_dev, I2C_SR1, I2C_SR1_TXE, 1); + + i = 0; + while (1) + { + if (i == msg->len) + { + break; + } + + xfer_data = msg->buf[i]; + ++i; + writeb(xfer_data, (base + I2C_DR)); + + // 等待传送结束 + i2c_wait_EV_signal_t(i2c_dev, I2C_SR1, I2C_SR1_BTF, 1); + } + + if (is_stop) + { + // 关闭总线 + temp = readl((base + I2C_CR1)); + temp |= (I2C_CR1_STOP); + writel(temp, (base + I2C_CR1)); + // 等待busy信号为0,代表总线总体已经空闲 + i2c_wait_EV_signal_t(i2c_dev, I2C_SR2, I2C_SR2_BUSY, 0); + } + + return 0; +} + /** * ls_i2c_xfer() - Transfer combined I2C message * @i2c_adap: Adapter pointer to the controller * @msgs: Pointer to data to be written. * @num: Number of messages to be executed */ -static int ls_i2c_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg msgs[], - int num) +static int ls_i2c_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg msgs[], int num) { struct ls_i2c_dev *i2c_dev = i2c_get_adapdata(i2c_adap); int ret = 0; + struct i2c_msg* cur_msg; int i; + int stop; ret = ls_i2c_wait_free_bus(i2c_dev); if (ret) return ret; - /* START generation */ - i2c_set_bits(i2c_dev->base + I2C_CR1, I2C_CR1_START); - for (i = 0; i < num && !ret; i++) - ret = ls_i2c_xfer_msg(i2c_dev, &msgs[i], i == num - 1); + for (i = 0; i < num; i++) { + cur_msg = msgs + i; + stop = (i == (num - 1)); + if (cur_msg->flags & I2C_M_RD) + { + ret += i2c_xfer_r(i2c_dev, cur_msg, stop); + } + else + { + ret += i2c_xfer_w(i2c_dev, cur_msg, stop); + } + if (ret) + dev_err(i2c_dev->dev, "i2c %s error(%d)\r\n", (cur_msg->flags & I2C_M_RD) ? "read" : "write", ret); + } return (ret < 0) ? ret : num; } @@ -445,15 +465,39 @@ static const struct i2c_algorithm ls_i2c_algo = { .functionality = ls_i2c_func, }; +static void ls_i2c_bus_clock_probe(struct ls_i2c_dev *i2c_dev) +{ + int ret; + struct clk* clk; + int of_clk_freq; + + i2c_dev->freq = INPUT_DEFAULT_CLK; + ret = 1; + clk = devm_clk_get_optional_enabled(i2c_dev->dev, NULL); + if (clk) { + ret = devm_clk_rate_exclusive_get(i2c_dev->dev, clk); + if (!ret) + i2c_dev->freq = clk_get_rate(clk); + } else { + if (!of_property_read_u32(i2c_dev->dev->of_node, "clock-frequency", &of_clk_freq)) { + ret = 0; + i2c_dev->freq = of_clk_freq; + } + } + + if (ret) + pr_info("%s warning: use default clk freq %d\n", __func__, INPUT_DEFAULT_CLK); +} + static int ls_i2c_probe(struct platform_device *pdev) { struct device_node *np = pdev->dev.of_node; struct ls_i2c_dev *i2c_dev; struct resource *res; - u32 irq_event, clk_rate; + u32 clk_rate; struct i2c_adapter *adap; int ret; - int name_buffer_len; + int name_buffer_len; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!res) { @@ -461,12 +505,6 @@ static int ls_i2c_probe(struct platform_device *pdev) return -ENODEV; } - irq_event = platform_get_irq(pdev, 0); - if (irq_event <= 0) { - dev_err(&pdev->dev, "IRQ event missing or invalid\n"); - return -EINVAL; - } - i2c_dev = devm_kzalloc(&pdev->dev, sizeof(*i2c_dev), GFP_KERNEL); if (!i2c_dev) return -ENOMEM; @@ -486,24 +524,18 @@ static int ls_i2c_probe(struct platform_device *pdev) i2c_dev->dev = &pdev->dev; - ret = request_irq(irq_event, ls_i2c_isr_event, IRQF_SHARED, - pdev->name, i2c_dev); - if (ret) { - dev_err(&pdev->dev, "Failed to request irq event %i\n", - irq_event); - goto free_i2c_ioremap; - } - + ls_i2c_bus_clock_probe(i2c_dev); ls_i2c_hw_config(i2c_dev); + ls_i2c_disable_irq(i2c_dev); // 不需要中断 轮询等待 adap = &i2c_dev->adap; i2c_set_adapdata(adap, i2c_dev); adap->nr = pdev->id; - name_buffer_len = strlen(pdev->name); - name_buffer_len = (name_buffer_len >= sizeof(adap->name)) ? sizeof(adap->name) - 1 : name_buffer_len; - memset(adap->name, 0, name_buffer_len + 1); + name_buffer_len = strlen(pdev->name); + name_buffer_len = (name_buffer_len >= sizeof(adap->name)) ? sizeof(adap->name) - 1 : name_buffer_len; + memset(adap->name, 0, name_buffer_len + 1); strncpy(adap->name, pdev->name, name_buffer_len); - adap->name[name_buffer_len] = 0; + adap->name[name_buffer_len] = 0; adap->owner = THIS_MODULE; adap->retries = 5; adap->algo = &ls_i2c_algo; diff --git a/drivers/mmc/host/ls2kmci.c b/drivers/mmc/host/ls2kmci.c index 7f21d8681..35a4af5de 100644 --- a/drivers/mmc/host/ls2kmci.c +++ b/drivers/mmc/host/ls2kmci.c @@ -780,7 +780,15 @@ static void ls2k_mci_request(struct mmc_host *mmc, struct mmc_request *mrq) host->status = "mmc request"; host->cmd_is_stop = 0; host->mrq = mrq; - +#if 1 + // 部分 SD 卡会读取 EXT-REG 触发 CMD48(SD_READ_EXTR_SINGLE) + // 然而 LS2K300 CMD48 丢失中断,故直接不发送 CMD48 规避该问题 + if (mrq->cmd->opcode == 48) + { + mmc_request_done(mmc, mrq); + return; + } +#endif if (ls2k_mci_card_present(mmc) == 0) { dbg(host, dbg_err, "%s: no medium present\n", __func__); host->mrq->cmd->error = -ENOMEDIUM; diff --git a/drivers/net/can/ls_canfd/Makefile b/drivers/net/can/ls_canfd/Makefile index a5c0f98fa..a98bfe7bb 100644 --- a/drivers/net/can/ls_canfd/Makefile +++ b/drivers/net/can/ls_canfd/Makefile @@ -8,11 +8,19 @@ # matching values else you do not screw only LS CAN FD build but even # base kernel build +ifeq ($(CONFIG_PREEMPT_RT), y) +quiet_cmd_build_lscanfd_dma = GEN $@ + cmd_build_lscanfd_dma = cp $(obj)/lscanfd_dma.o_shipped_rt $@ + +quiet_cmd_build_lscanfd_platform = GEN $@ + cmd_build_lscanfd_platform = cp $(obj)/lscanfd_platform.o_shipped_rt $@ +else quiet_cmd_build_lscanfd_dma = GEN $@ cmd_build_lscanfd_dma = cp $(obj)/lscanfd_dma.o_shipped $@ quiet_cmd_build_lscanfd_platform = GEN $@ cmd_build_lscanfd_platform = cp $(obj)/lscanfd_platform.o_shipped $@ +endif $(obj)/lscanfd_dma.o: FORCE $(call if_changed,build_lscanfd_dma) diff --git a/drivers/net/can/ls_canfd/lscanfd_dma.o_shipped b/drivers/net/can/ls_canfd/lscanfd_dma.o_shipped index 70e76b94710b6502e5b9518c559c16babbbd1c8e..f3384016abf046da8a40b49df39cecbce2376615 100644 GIT binary patch delta 14390 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 delta 14930 zcmaJ{4OmoV+J4U&K(v8C!NaKOpolX_$OsCgeH>(5vCKumq_PDRjkXc7DAcqWlr7u9 zsMpGNZH3j)63{N(T`V^TCAA{cFDv)!NBl|I#4Q)URTQ1?dCqwU9?y5}&UN{mbME{3 zd!P6B9IQPpcbt}MY*N81_Cyd5kCINmvT9Rcy(#|eMXpFw!Y|qa3)ad3rbt#Hu~~>N zl0KI%@+5ga$d}{<=>~saE`$3Cra!~|d6O-&%ZB>;2~RoEtb{mO~?h73j8cI-0G1L!v=sJe|g|2=^egn;85Ar%?}TJbJ!~NfPGCz zt9=**y^FD7RgzbJ)_TDHoR_Z}G|cU;ZMA>EBH2>bYJa~oj1{O}`-hO{Urk=wWo@-H zr<~no$})K}nA#;nL$P2G-zj1uhWGwLD&7VY=2CttjGdDsp?NIVQzbjQzEDj)IjZRr zTs>b(>R&3B0i`Z6U0tg(Z2XF|dgIT75e=X<9x>=8f6xLI5(CF(EP&S|zX1*Kb5(F3 z0{Dgsl?B#%UZPmavBEDPqwbbLaW3s6KI&kO<{d@&E)d7AoNHtY@ zRK^ZU{EIurx}RwdW1pRYm_O@!sM8M5=r=H|LbLrd_(z{;*D*TCxmazLi@+!RaxsQA zKhSw;oocFGDXATDp!05M`_jLJv8FeBVvYuSi{dW#^r{BuCWXdp|hvL>Y%FeI7D#O8a>ddXoWl%idu3I@S)@nm62nPNIDA*z9 zl^274Wwbu?e4}pW3@vCdJ@ZW%!-8TbY3(mv+c(&%)Z;7)I<8VZ#XJ_t85-=7L*SWr zhD1t_@>?N8-F{P+B02r{t{a151F0L&V=Sb1om?Hl@`@IDZ5Yb0>sxm#=h|4095o<= z{WRSpTVSzBOIKLbjTt6mI-5EGzf(0~sm-8gE@%9w&_VOkrMy6B<=fCg|8NU}EPsGj z`Jby`9f^h32YN{Bu(xTN*jjLlt=)2&&%Se*+i$+~;1Qc^-4R}4=_7m zb|3fU1cPfVay?wJ$ZhZsTj|U6)8PQY=7_~zfr@sDs{cdyo2ORTLnt%EW? zk~P~WZu0c72i#gUv-KH~hFScU9ccAeib zINJT`bE@f+p@-ReNLeeQxAnFn`nLCIg~n8|*qE+wjIXcwKE;y?7%(-kY7A$Q{8Z#T_Y`e`QcVv$#bV6X3VC+sLEA`(+hCFNmUYXn$q-^FEM&MN zQ9rIRaP;_%%HGAZR9{b^mc(2*>nO3h$Zdn4Eq$ULw{&-ksU^(wc+Og{vf273Ej0vJzGCP-cUF=ec@ zgjXw*hUsUfL#q{SIr6tT9%{gAA|oeQ*#hi;Gpv-*|F&ww5z1e)0BAqk#IpJB0TEI$ zUlV1WKID#=zRFy_ng2cPjo%N*kbM_!=Dc398YX}z;;YH}9`BoSE5{5`sv!bK>W{*& zM-Ai2QOTkHVIKf$LHl^DW#Ukbjq8dT))nk~%)$38A8HvX`*!lRmQ*+ueqf1{uJZGi zaU&OX+iE|O)rRq|xLsSjZ5wXxmyg2P=d+}6)->M5#}6AG>9QXkn8A9}f>Ub;GG_>@ zlpBG0WY{MY(b&N>&E$?l3fDzfoH+)#)M7=L+0isa&lM@$h%WdB}`L$V7xQn^bz zBJaOzzPsLpM^@a4f?(zcLS3*QeFrbh_XNuYQR?=79%|IbZw0cQaRP__`f&)os>@#s~glI<)65 zmhd&NA88%iWeZHK=<|S{{U`H#=3kFNuXn>6!o`snRY7m=Y`9zwv`t2=L&P*76R+RrD^ZjsbA3Lqpa`C$`AY->yOf> z{804HUqxTB)tZ@FDP7S{0$2yj1$ZSe^{**-s`Xr91sK!!(+~5t=PLaf$DQ_^D>=t~ z(Hn!qbRg(;v9+f7%x3=i=q1uYK6y+zz6R_XGb|R4(lFz&XEkfsOu9hjgO~)=ycl!eU2_MG#WiEgUSHq2 zt!tq_2A?~2zEr^99XlT0KE}D=bpyQ&J+@!=WHDz+ZL4jT$!lw0!~Z$<9(M=~f$BYB ztOyRX+X@fKOJTJ|br&3Fhe8vN%3c{ap4a~r#*P7BqI&H|qYukR|9IXWiahRYqc8T~ zpZT%>UMBcjxQD~ov9;&zM;E?h|9V=3{iNLOwts)%qW!xA-FB=w2KGcCmu*FSM zS6?fePG7VyWh}P#ZOQ2$_B05-f_T(`0)KL=tzO$D+%N#I#Dt)tbudLr;7m~sgZ^mG zyC%SF?xuTL9d)g&67#cEwHJg^K`wWh0HQG9Wv9XuV{juAQ@wL%+Qqo>yu!q3b=GQ^K z1AO^=Uh5@ck6dM|IW`dHfM4H@pjPqak`oigK)!Xo+Hup^#dspaVi|Gl4IDaJGNZfg zZ6R_o?X@?-#`n`r?FbYIQ~5Wqg)vc_hp;+**=QMxYGWe!tW`Tgc4F3AV3>!<8ONfg z4?_pn6&L965pijw;ThLypZi8m0wlR%Zy5U|{6@^j(br?v-)o9F+-DuEVeP@BU|mqk~$X0C3FFf zOKgy5k5qtN_QTq4o2NihQMdLXNo{Oxv(?U#)PWEs7>=L=p!@Nq<2KtwN!?HYK5D&o zPlwmuDtuP{%^Zt<;u@txHh&;r3U-(NQe{m0U!U*~#}6L^Yk=?08@Fls>!{W3Y)=kX z$3@J>ynSPC<}6jc+T!s76uJKNVHtZ77ZJ?S-(fh!{P#Z7P0hJqPsjPM;>WnZxqe$% zI$kg&2~IBATN1vA$AZFukPafBa8xmmvZ!2y=3A&?aO zroq2Yv^!m7@#V>iyGXDz0L&w7vB0woxQlrEjOcG8ejXxt1Mx%g79F3arFDQ9vz2s@QneMs>2{5`O$B36lntr0l3^ihIu<{2r9w2g)rv;>RKSdhSS7ELB1W`2xQJ zTsNWzM=kMCNZ4(}isB8tFjWaL57t$&MTz_-AhaeU_+^MYRp?;cg~T&_Ye-WpvxtX9 zgw5u2(iAC|zXvjpSAb^0ztJp09gFMVu%*b(+$LBYt6z{PCx++`h@T+1Iier`nBb{A z;~r>{V6oNNgjM-+V4Z}`C2SV212$W*SPjbN@#FU>a3%%+QjzATnD{9oepYbD6veVy zu$Xx(VJmsz6s7POVZS7-Svv~oGw3M6op6xFAA0*ryVJ!vf`3hLmA6h&+*yhaVOu^T zY=OYh+vfy#30xa31TQ5xt!EkWPsh~?9e$j-#t~~y;ICmDvzEDLn%skfW96hzF?oa7bb^b zF~5_9&E|E$<_Z>DTTIvmJp5k8;UczwBdmwuv~#NX?(u9M%(kx{y`rxSOE?b+nN< zq6W1B$3ze4xoNV21fYR;6P)_rL;NQ)cfY3=Vn74$BL>t_8^Ni5yTFZ!o*@4F5_LoT zlZ2p-z9l#f+#ztR9M$h6IMweWcwbfkZ4-U&!h3BbeJ~hKE zjo@{_#PC9368UjenYYmjp5TY$^)zK3ykPbH zTCDmlTG4IH9Nmu}({D8yFL2}NP2_c%iX~aF#<7~pj{`fEu(XU$E;(VXB@qvhhzqy_ z*aBj^l(5D8q0BMv{~<^V@pFRUCkg%y!8-+xEz*}ios1Z*U$HF|j}kam>|0%Bq;^Rb z1UjNA!bUS)kyKvjRHRva&UDx~h>Ih-3r!aBis_2Giuj?Us)pdSd>aLBEczy*Pe=1+ zqEG#7({X*_pau=XU>YQOfTX)e;Ks4gB5-3u`-nb0P_+~NB6dfAgkxAUo;uy^2hAkoZIpU^-KRR8RN0m&cz1z*uOgba^(;RP>_)=Ue%Z{!f1!lz5G>|-fZsbq znMaRAUSdn}lf>#2$t^KPe=v4kGQW&160ETUr}F45#iA0H=9$IkWGU`k!D@Muh%SPk zCirH7VLs%QJ+9+_W z2E{iMeersuS=ADKitix$;x${-Z_sgl-ce!?F|cZ?x@aK*DBdA(EX@x@{~YnNoZy|r z&vG`UpZS?MI^PeoUgGFUf(P(9_bVa6u{wm|&-1tLQ+U<=X3JE8V)dRPHd*}i{mQ*X z#HN$5E`tA^;H3h`9xUTGq1Va?>mgP@5_~K{t5%>(i z#GKMtFVUy?5rJb4UBu5hf?pzdr;fX|gUZu{=pq3qeuX&t2hoqQ=?@tACxT}Y{AYsa z3Va4&&(LinkI$J6-x!J6Wn#91;Plf%6~X^W^fwZGFTraG-c9fp9bclod|V;KNn-H7 z1n(3$wqqc{dj+0lzys{MlGZ`IdbSesFJhI*D`vw%Oz5D`a>7pKb-z?*I*Er1ge@X? zC&66=|2x4;xs+RnS$)TO>GBzJo0Z3{NRUgTn;%{=J0P4^7uCPw$5$)-*y>=uV|5tsTx|{S zgi!Q%kxOe7%Vo`Z5VL`E`n$>XUM{UwES2<}2W-4xH*v>WSf34Ss$jk1YdMC-U%J4PMa6U! z&MX42J6Eu&ycO6T;v0sa%@?ebUk29yvC7Z71Y5+T*C}rQhZjG)Qn0JV zr!PP55xCjvNA&CS0{_;4R}0)0eY-vvc$JQel@4@%Cy4cbhWt8> zf(_>3mC8*2E0LdlU$8Y|{rBUo0^el74+}h=FRxVO(h&aJ$^^MAr1|~If63B99{qwM zEz{(4ntWB0+cfznO}1+COHE$VWUnS4)?^5;TdznkCqPcpWQHamL}^(#kg>rqgR(>u zcZ+PF)Y#_*drh#L1^b%Dz9ZO;F*@8ZK)-&d`Tty#XEfQZ$zXo@Ma%@{6isGna;_#9 zX!1!-uGHjjHTgSDHlgHUFGazBL_+&7HF-vpKWWmZ$q0V@B}E#k$-8;oONwRY9gKyu zP_{`-#6;1C0?;`hkdly;%y%tP_|~e3fJq5SllYHSV*-*Ak|y);>M=l1OyLrm!c!BH9L)99qQa6TMfuB07ng`&lM*IQ!rK9k#6(BJM6?_d z0QX7!^9>frb7CS7dih958q3dL@^s0f{QLw*D*xu?Un`D8facAfIcMJV{F%=DC6Bun zgIOA1P%}I#^){;T>9XQwPXd|3U#^Kq!-QFxX(&=qOh)0D#M^6ZW0SS}RFo4nHHW4* zaiWGKY0|+*y>h{gh(ktAM-u8dWKC*T4q1yaF&SOMg99!TCuzE}0}Yc>1cM%vQUrs+ zlTuL`Y$jYXY*GKi(0*ur|R?HL&oPJ%7FV%05t}@ zQ|NCr;8%1!u5Z^_1bN^}&?^i!8w?nKZ@Xf#ik)gGPgatrS+f4S0>f z_wc&y%0n#%_M~9<8SpNFdkwgCtX|4C13rt_?STIsA=q{Uo6C>yz`tSqea9OhE8a;N zF~O+5~P>!1)0rzKnC-)CPY?( zwDP@8>GFMLdJ4O21GCHYMz-*bT`2>DtMsR3ykb|1RL=MAN|*k?dq6(O({`uJsejneWfM6Ci59AVH$Fc91}4Xh;(XkhuPNL!#hrs;R-6w)Q3=GmwiB%hZayXVELE!R2PR&Iz|~P# zU8}BE4JzSu_r*iGN?o1hj|c0A;-OXXc&MlDxnQ&|9;yrA&y9y-dCKioYS!aws`^5< z%Ikgk>EQA}+*#{Wm01}vr#Gl-GLY6>7Y~x2{vve`bOoU+2>rnZHQ)r4sthCVu;b3| z$$Uxm?3}DJHeR6;zf4raq@@k&ywe>U2(7Lg2(3{Aq0hmN`k{f)z43w2s=k5HeeOW$ z{=h)!vqSOF=lkNJhoHYyshlj>{_)qd)dpWYn5!P~=fCeQ*21hc1cvcYtrK zKc=$Zead%>0{t(d@r<)ilJj)~!(IU_<|86&kwT=RP$(?pzBS z3Pk+|P`~4THS@PqVoqX8+k#L9*6=iM)5s~2BTjV-Y8Bi}m^tZXK3 zp<0Dfvv-A6x6IsGFuL&~Cvmpe)iI%kx!G`%=H^Mf>)D+=qTO5JaB{qE7_TUxMf_ zLG+Cv`bH3aBZz(zME?l(KnMB}`re@KdnaE>wJp{8yQu$*A4s$&-bhrxcuASs`Qt0p z3tw{8+l!{CjRR8h-Ke6gX)i*`Cm!nM&-8faZS=x4a zB+*Lk@_y(k`qLFE3+{6Ai;cg9u4^w=aeUS;HrYfJe$@#FK=(~dmlBG;;6}laLs1kkY5b`4)+K&Fz`xDrVendJd{g=%e4dTt8y`Kymn`7_HcV__Mr(X=j7EY zZ+~%_+P@p~!$->0q*IsY^!_wQ?JvX_KI!Ukf8A7df5P>Xul7f$s{Q1Tjiy{Gi{@WB z=feIV><_}`AnK5ugR@3pN4>hh4zl6UA4DNZ=SEFen@?b`Xcp>j1lzJ4<)J_VmMX>aIA74 z^{+xZ)YrvB-$b1^4`oBl^s-#C&Hv`PRQd5o{_^rM-|6xnJC`h<%BC{O4k};UF$6neroLm^VfCzl9WMNU zy3?`lejL;4`*6&Tp})H5uYq`o<`3%=IzFz(u`!?K0q7W)of==nZbkZjwcc;}eLj^# zeQDaJwazEr`zJpROjSecluPZP=XmJOfR9P0H`c1&KL3<6J`;Ka4>%bc*E$dVI#H|p zVITY-!?C|E9)w*%*cF7Wvl`-YJr~=y@cQC)_(A(4KA_t^QJ&EKAuRjDk|&+S_e_7V z{eb$#YWRZs1NDW8@a^!jcyK$885_#>g(jlzz4iN?*iRZtXzaf88WtjZ_v{LitKqZv z8#(9xz#!IU1DF#Bu{ImT+H5e?9UBa-t{cRy6sS3sXxh}+m>19!Y;IhZqs?5OHR*ish@Mf>8R?{dG`fIQntey1s;IcCz*8MM#CBKp0q3gz1MBD)e3 zY;VS~eINXM5Xbi@j_<=bzAvwfhx&h*t)hI4$9_<@3$0PCkCScEmSRzi1FRpM4Ol}W z9;$?Wy=7bc{lE6t+<^F+)7h$*#-PyiFxB-JjyvqH@<-!1Z+Tf&(3+O|&hUc#*$;o| zT>0?4gX-a@&y`bONv5IC&4QflC$=AIjxxsThYzngS8n@cqT^ikbC<%O(^bX6D_nnW zR?K<$uJem&9QLTV9&bK1TjgTDOx%3F`lP?i{~Fq(Z@W|RLLBQ(^o5sRIbTkGO+0qK zI*PR`vGK_NI($p>Vg&L%)6Kk<_`td9E9?6G_x?w=BHvTHYJaq?OZv6feO~3Ft$W;; zRO~8W#UzwH5&PMJn4@x3Rc}eI>YeENac<$nKBX%9;qPx^&HEU9eiAxQy^^T4y46Bo zg^fpP{VvOitxyw39&k2bjUR4^2gw#In|R=S_1T#*CwD@bdh?c;a~0;|(wnEL-1pG0 zsr`hW%|qaqyMAh$EXZZ8QZ?$s%FTk^SvUJ?>>AbfV>-Umd}jB1F$d3rkH*D>4?JaP zpFlVHg#QD!4&VL4R{xcZF{EKs-0h|L3;2em~efBy596NM- zRhfB#<^=NNgBUBc#a+#XXcL><`1>j%pcR&rRI;28%peb4?Z{RF|zA*_-}t;(2=%bEC*wsQ7+9NS3!o_ zistuH98z@hz*8aE0V=V49 zYYbUl;_Y{<<=kM`1GWumZlE;*?bEuzt_d>GuM*YgtDCDY&6|W{`g12$;|||TijJ#v zJUukAOg&PXRT4j;+)0<0sYekXLfqT0DgW-N>K-q*{@z{ogU}?*FOz=?fv~H3_YIDZbU8@TTkJra6pR-(KOayS+TCuPT+%N>=s0q6DPlQ(g0ihX_DqWSO8 zPo}81aE>~00nWqWtLNrVRU6^2?YAI=&rZT$r>wskP|jDmoHCU2q?xCqLvi@opYsPg zF8(k_mvac^V1FjrL2H1^p?gv+=1fMtsLZdRj5#Qi%KHk+nK(;@F2A1J<-K?G`kvPD zwC2M4S+DEs`^*}j*87{G@2B{C2x}{Q44bCcMp#Fp&NTPXIY6vO)eX}cA)Y#>_F_#z z>xul!+)$q14IOvP+LNv)P(GA%!MdH=;4fOc#|9nUchoaHho#z|`qCFs#(v0TKp*uT zDv!#iF!6V^p2zh+tQmJh?!Gvk-{IOH)@7>#xF$G+b8q-yO)MVzY+XF`ITzOe1GokV zSy~s9&X1Sx)w*IEor)VVPrU!_Y}Jpse;WKq{-NW{am)cU|MlQ_m4)L~?_sBAWZ8bF z2l>ekl9zIiVQ$$7S@KU$yh07#rQGawF4oVkngli(e>Bd}fvR@knE6BeJyxWm{g`ul z3v<=P1-WYbIM+|d*j}_Zt*hv|;d5(OsE40VEdDFlLv8qx4waV`SnJ%5I?y$y{;Qmt z*3(XO0qSujj_i|M|KSw%#Js60Z;G0I6KuQoJ?evM>2o;FO}Z9xZkeL%7R%w!aT|@l|Dnr_<%5vf zkNS>_r`mxS9XH1vPBF4k+f=G5@=;E#NV)HaPZrFGJ6gxRnI+$UH6=d>GEd<8Wj}nd z;pN2236Rz0LvIDQYf>i=$!Fo1PS>9hhDuS7tHe3-{x#F|`oZ>K1&#*Xa|mruDYFWD#FI#>H!tgC-J zq0C9Vey;i(YuBLf#d3bLz??@U{_4Cwm)iha$R_W3FO5MOCwA;*U_Qba3u24~F~))z zdqIq|AjV!0V=aiW7Q|Q!Vyp!*)`AT&a}D1flW1K#e$RU6`*nNubrk9c$u#ymT^qOs zaqR=7XJJi2exY>*;`*G6(&(B|GB4@fHd=4upD{m(`vdo5PVn9vpnC?m{;TgB;QDXq z;URNBfYwiRetQ<{g^3^9?}RaL(EO==f$`dmIhF2pB;J1QZar@<@w-=5_`@`Z&^-cL zYn;Pea;@so_XxH(oDTLq?YR9Piq3xQd#8h6KKGP!25$0JKsx~bE~iMhbWt_S#QTY zbp_Jz*nfq}zG;g3@RK-J-h^W%u7}e+sQ%jL9-1C^=oqK{g0V_|`62wW0e;zzx*vpJ zsGhy3`weqP*Zml5#c|m=G&$~^8c3}CqtDmain{&bdk2Ci8x92DM1QCA2wG1bdLmna zhro5exf1K12wfwAfAl(T;qOfQWy4*Un|0BlJI{Y|c&vL3pYbK{HQ4Jhu^i96hTBs2 z8oc)z=)MB_8rIq7UIWb)bU(u0Yj7XKaRUCE3?EtlP5fiIe=HwwyM#utPNDO(#NVB({xc?0$3I@jD=_yg`O z4C7pZ`Z(Pepg9371QsGWZ2H~;_4R|Wo9-Nu-oinw(cVNq8AgA36ZsJj(Y>l( z+@k{1{bYEodkYiHb!M6i^*pxz@0{<)Q}bBj^X5A1su)Tb4i}A zDUz@CI)&~ZWcn-efAvn@1{`0v`@ZBKk3P^pM@45nux<8+eSw_qA9>urf7km}!3*!8 zZPz;cHz(Bol523!V7hwbCr)Fs47As{!nH}=`nZPmB9(Rh-S6g6d2?U~UGK6sd<*jc zt-~uXGuNkLmpBz!XP$COaUZi3$J-=<$v~mX0U-r3KJx@9NcjCHfMojbT;g@%RZ|-SXTgbkNBR_L0 zQIA=eFDbvhZcS;G3-f1x1obFD-m9uMJBL2H(O>%GDQbI}>pxgDMU`URf_c|1ePFGh z`t{pCLLZ^)k73f)s;?1RzZ0JYztA<{B*PkPBK&o7(GNn>CX#(nt<`puETxe>bX-H< zxnMor5I5Iz$6622Jpft@=xek?afil0;?eZ?4qkWnY5AV`0VCUbPG9?_^DgSwNnOxM z=U$|b&hwLfaoX?hj&+|~k@#eqYsP&>zqY6ESyRRx=c-FDGwq%5W6d%0g!3S^T@3Tb zJnXM|%IU#=5A9FEevI3e_CI9gZU0HUin(b|sy`+6o=dI+Xe?=a(WetP8%`{_exdt9 z-#f4G%g}uQx(9&k=OH>jdK`Z=zOpbbhuhUX)Gmo%ymmK@-Pkp%PVdhcG5a;x=WAAU z{hhA8>-ik>PD9MJRoZLs?$gHqv7Z~?;Cj%s9^9Y!nOM)DY^q1%QLJJ3-VOT2sCzbK zGucc1G7IzV7p9*H_F+NZ<2w_iympP6NB0W&98cHf4AqA>(W2oQ2lN6VE=y_l1^~%q%|>e5xi< zp653{Puy`~e!8aNt$*TuXxDhcsYm}?MfaeF22j51A6_t~qX?!vuaTnie$^U|4+ z2|~u)*Kz;MJTPSHt;d~vP}kk+d-x}ba;*2#-rut0=FgRx&fX!|sBQkJs`!g-4eZx# zq-_m6m$cRDdibY_a%&UalaoFltBi*Dh;twACtZy?R{GIz;<&Hm;yzRW_np+B9^dp_ z&x`mQ!5_oIezt`OK8`nUO zR?@n^&)oO9^6*nmY>BF9!5WUrJos7vJ;)P;9x6WwUBUZexW-zCYpgD=u?7Z%uq6oH z`o0Is3^ustTI)m{$2aW4^GBGAw$|@=n$a()KjIuCcqQs|$ca0&&ie+=KMx}v>zUA@ z>CZTa{_(ZYBuc02gx9^1iof#vRNN7K9pYHa9bWfZ=+LqsgkD(GA3Exs4*hoUjnIpO zr$cru+WxxFIiv0PGJJ-3kockN&V=l^Ieguj;J!s?LVrjkrjo6PU(RTxYoOnJ5$o)DW{F@W=KXS45x(1z*pP~cUcOMWFE zZh&vek2`$BN#E^w`HfIB#$Mm|eHC`yAZ@3$a?H)BvvsCtCiF8y;5}3}+KJXeEx7Kx z0qccB@BEXWuF>zfQPo&mPCCOlpEGtLZ)lv&i$0K8_~PA^kFE*gx@vI8B^mehpk8#1 zHSyu0yNPKVj;f>$@2uMvdT&8~sIJ`Sz7PHC+b6RX9os421YFalxiP}`vFUsg&wMy1 zXGcThaV?3;&V$|LfAYKZxo%^Wx9@phOzRmi#{On(6%+jsjcan zI@QO^sja9k+Lr51hxSc$8fBY)3waWFc7uF24s-t(zMie5@1!lZEp(Zvi*Ab?r-F`Q zx?Ic`lt%TF{a?$YUs2zWLMFBk&+NgbeNXr>R!qHYAOExcA3Er`k@)<3)wG8FGR|Rs zKKZ@8XQ#iLxBfMYd|2h9(xeM#174Rd*q^u8Y zo<;ZQynW{6;OXFrSIpXBd;OsE2>LDMYwnAOCSVOhYhmhB%|kKMM@(P9J!my+d)d>$ zzGr>zOd2=nLo{v>24lN?b<}5mx9)T>R_Aj`w(sLUcl*G;VBbf5?j^7-6W5F;p#RZ* zvr%~qeeRdh7h)(sHWUvHu+E-;%bKOj^z9GYauN&0`5oE7ZAW$e)6Ylp5?@QLGpSCx z4WT=Z`7m+$dlwwzDW7heSKrZT-Z_lwmY8v_y4l4uNN6Kkmpt7-@ow6*AZ5IVpT`EFht{~6FqpQ*_}i^x<|m8eOFVpO8or+SB7{HXI0gGS?$v*gxmSPKXA(%y zzp@MkE{zau#DAt^=4XrGdj#Lg+*@uxb8opD{U$T%e?sWV#DJxZxU5$ebJBk&3GkN9 zob*e6jnMO?6-MX^{*>T7g2x5lgvo<8Dwif&yKP}km*r+MCp!mCR{h(?d@=TZa~SIVyu^3u+j zke7OT1efv~nS1TTAk-W2y(X%E*Dzm-@@E$ z|5l;@E@6Ma&?EUyp=Y0vKPvP*E%=boBe}Z72$4Peg?zW*&j=n9{D9!Sf`DvkC2!Cj0<_G=YZf+{xEZ||Bnj&vfN{WOZ`Jazmz{Na=i`F+3q6wW7J3GS{6WDF2_D2r8EsUrU+S3oDHdGH*9d-C$kz!j_3UI$ ze)xot-^HB#Ao(7lN6tS71%F=X30!V=$o~H>c#YuF51Z2Pt<1gszn{6c|DP4|pA_Zd zc>}$XyyTh8$xd0XT)}0%@&%XclS1ZX=RLY4^Ha>6%9Z>Ep+~My)(bs_LQk*IBl$)l z|0yBAMaWCOl{wW{u1|3JMQ>#Pe=|}28y9*cA4#JpbF#@ydTNE9Eav0~$#a;KJ<<=2 zLJ#G!TU6+ge7%sbv%&~_g}mgOn0w3Z6ME`}o~=TU_1son9SsdLZK&zIoU4x zH9~%wkiS95OJ2d;Yk#HC(;)Oz2`>G%ROpxTHG)g|I-y6(hlRZ4(KPaHY2>#ur+WQL z*neb-*&%*J@T{B^e^&4k=3f8bAb6FKcbR+Jr9#Lr74l1jywp=AxRkG9PWBH9J$1~z zcH$PB-n{lS3i+_m(=FsBU&EZrmE*lfa6YBb+71i;YoR|&pYogI(ILSraDkRK(*GMB zGe5@#e?f3}n%SZH%5~`y=2TzF@qVM;NdGTQRR2bW9yyNM1efj7DfCPEZXq8L`teAU z-pC%QXT9K3eiL)DbI@efzlVi>S+65PkL1Hbe!0+dM#xKkmN}Ix+qXE^WcKzeJie|s zZ@;=h$geOWMo!2}Udf!wJu2j@gq}vhmkK?S-y`%$`|+;LXYJAR~aGFBd@pYzB=!`F4yxzg2#pa5$4`@ zRPQ%J-geAjPV%1?da{MQ0(x!KHj3 zbFy<#=;;^w=RtdA7t*e^N7$d%RMT%)N@R5S?&;X z^0SmbA-I$u7F?Elin-U$tblQ@x81V^m-=&@o1Ia zh)X{dGxz$lM9543+#uwoo(jRGd?jG5b|3E|98Q63w}iK zqk{j3;3t@qf36Zd=Q^`P{*gSFIo0c!kS}IVdZhg&LXYIG&@&+PR0{r#;7bKRAb41C zxeo7TPWBWE`Hh0hcHG3=+aERydD*^OguK+VRd6Za&wLSV85H*HV(ztbH*>E&dxX4P zZyyx$k{@Qi2xUq?9~E4#!-trYJuSk{)(bA%y;ta$@*9P`><^oSywtNr za4ElyIr(i+*t1*cm+Ses&?EU#q30!`r!dd#c>7_o;L^?#=HC8!gOHc@yFy;-St7WU zU&`ED->Bd(3;VY)C;R34vrp)kJY%NGO!{9HdUBXky`+4jkUuWu+n9U()+zLi>JLIb zDD-R+@{(^6@_dOx=js#kl5Z38mka&)wu|1VUXt$;@&O~Fe|HOc$%mMe-+m|Lj|)AY z5&VSEBl#(z=QSZeBJ{Kio-xbpko}TpGADbao?_C20=wHH|{J^(RbZRAY@`L0{h5V&LPmPe5e3y{tA+B@9g}mekn3J8u zLjQ5WPYQlQ=AhjL`E3A)gmCJ5=tQf-e#Ll;BI5F9y3;@EYbzJUlG)yd~tj z1s}C868w)sev{xo6}(UI(}M37{EXm71^=IdpI}b)xfU?Uf_=pM;)5 z!Jiepm^qcZO7I()Q@N5?2tBV0`LN(81dj^-KLl@MPUUtB-p!oKm0UlW1xEE9H4g~= zavs(B2(b-n6_m(0XsAeR;HX)upEJMRzTp9w@JG zX=&{YbVND>%bGeno0^+iRs`k*%FAvKG<5_bE%nQyk+8`yv%`ep$h}PskwCa99H6Yx zNd3K$Kzjr#O!{57|IO`p+DD0lu&BY^qY3;3L zw^ar@yBk_MZ%if-NBQNqR2s>OkCav1hG<7?b0l!fop%PBS~?@`?Oko1*9RI$ZmYgCa3c%n!!eKv%nawl1RFECI#;(v0yCps z`GL094ihP>EDtn=YnL}gqG3beFpAjvP!%JAhQ|7q6_Jj>^7hu|z|4+7XDfcSNJCe9 zd!(f^P~Q>`w6(*Dt#F9R1Xp)9Mgkr6&5`MWU~^MPMw%2zywYCJJ ztsU%brItaBwwev0dUkYnHLOf&2n3rt+HW*I3gsiUwXF?aGZ{L&mwj?(_*3w~GHp&* zhn6g|4MqCenrqv;TF^ZrwJXq7me)6-TLfo@$ujCk`REGN)~I$Q5?Iw3X$gF$E7BDS z)UT>v8JVsNB0XIl)L5odu(`^&U}i`D%y3{?*Yf3&cHQl$bxc!j zE2#VP(wf_EHNCm3Gtgi47D82Nrd$xY>*bm9%43YkN4* z(2DB98tvHYXVMVxj+g4{sxe0j@z&+bX-IXT)1$@Em?*Sp?m}IqXb0?C9i5S`p}ITG2v& zj--Ti5$(Jrr?WtFYdC@-g6=|% zi+n+hDwJu)KQ%P?#`3b&wmq98&9%$wJ0j$rwg7r7jKTzs)3``H|l{1-V+K@P`>uje=g zxf~}w^oWqv6JSpAU*b3gc^oJHw;ZRy<|92*#eN|rVk7y#(=qc?%yHtqf|qcd^w6Uj zRyC;6{&oPth{6W_#f3c5K?dOm9y>gi({lK&RRDcH(!;tz40f^8fp zJ+ts<_3UI$^55n-1-m#-d<(}Z*v)a$Bl~llIm!P6$0^vyapK?MI0XkdPI~0{I?SBp zALcj(M>tNrkK+^^9r*eaOajS&-$eCqhTx9~p2?i_&?%bLlP%;Q74kWPZxcLM=$Rw* z1cdw#gnXXh|0H-&=qV6-3WfYX3;ANfrJj;BdTiE*{Fhu};}nv=`US|~IPvX*|E0%u zkwr(zoE-w%WdIh|wc+|stiT78-#_0giUJyIX8#R4>$D9THn zM~v1-e(H!|IU25SUtNoH%eH6)R|H`8Xt{7J#5!wf@u?H6J#-#I!0vZ+b%2DE`|xL1 zGqP~HQHoy&e{>(2+K*1IXs)JsCWm9m|2Iw}Su0O^D4#9At-WuaZ?>&&sCQv_~EzHRkoF8@8Bp~>89H(Ht;3I-xY?SPIOk}2UNgMHSkID#uQH!iNKv}3(sIj%3=_@5m(lG5QwM?-s4 z8(kT@v9h(bwPi&Iu8~z%2h0V6^46Blc3cU?qJXMYj8*i_AB4vH332pP#%)e?~7dU+#oI-wrfC{X`5HIsX+2 zF6Y005nRrHO9e0CxL3a`_*@~sL~yCUN^q&aO>k*{x8U@o8VIa zPQi;gPQh-$rT)0!QvZCZ{>2>gj<>S@qQlXt6{#6c`ox$Ge5>Wz?`1Rao~p$kNigFIb1b6KlU;2XH#R? zx0~O7{Kf)=Kf@nBJC`JOPCNoa<>pT?N%lDUdzQCyHuS?~B)^O0Guefc5t9BkF2Tyr zX8AptCSeK7m$3XckNiiO4|({fS&#kx$40(tw}$2IamJSWb>{Z?W;v<#k9yLN3)1|u z)Q*VJKe6*}J6L}%LfWkUXRuHH*+dtsv7I%68e;jlNB$j_@8zZmaQkOrfRaD$@yF_) z2~PU^bB*FQmM>*~&HD}C#zUu)_1NQ#)e~WEj}MlAj`i#d7(Mn{=-;z^A41x!{6DjN z+jPT^a{XvNC;RREZRMY5Zs%Rg-(YU%OUuWh9;C<4bCy$Se*6aw@Ad&*?+bZI>q&9C zXG2>t^MKw{>Pil8W^T)~IscmZ5|*?4W6W!qU%}xr=5}0I{msnnc(d}|%=tDo_}Q?WIn@)tEZXUab#zZ!^|65ej>{s zW8Td?oB0XmcAV0@Oxqdewx3)3X^QuueY4RoXiIX${iEI#(8=mDJr1l^!{~Ra)|2Av zSs$hO^_?J!r8fFNqPatqVicRJ_0XLovlZG1LchKV9nC&s?sR{TLVCZ5!lMrHxMY>pQTc*^jjRg~z+cnFmITt3AxCJbZw;?f*7; zKl1|?aQF-6F%Lh?{H%xnhWTL+{}1N7J$#6HpNIdB`3dfyHu(+awjWyl7W1I!HEV|!&-U=knRi>o9GZ2&c(uf1&(&7HhXuOPCj89Lwz{<}{zlt%7-#hyOKmyAHK^s+gbh$bXDE%|mjde|V;_ ze%tNg%b45mBicOlF=CR>)$L{}-X&yikFPeRlX=V|e;;$P)YMsG%(v;#YQeJ~%+Gpw zFY_gyA^G>r+dOW`7saw z6Z7s&tHFdL%#V0DK1z!X>$g#NopB$Ld4`8iVs5|BXG_69L)3Z>Uuua7>Ephne~UdJ zb8>+Bh-WD~i+NA#5UF$IGv90%IIL$b^9qlA3G;aBkf(Fp%)HohsJexDk36s=M|<`o|K<;?B(Eo_!3^RP$0gSq{FgOy)x^?2lC%(DVk z(u5B(Kjz^Zm_UJrkW`TFZd%l9#_nK7C_%G|y;Y*V*0&&;#Lgu9sA_ik zY503-cn0R{vFbZH4WE&QFG#~H((t8e__8#-H4Xn<8vgfb_|`Q1Cu#UV8vg4v{A3zF zl7@dG4WEeP;#lnxNWaD#fP!<+?j^olZLma;q)N>So;4q z4Sy&N-;stto`&yD!+)KIzmkT(nT99Q@EjZh$ExqOY4{xQ$+%8(fX^QbP4`i^G2iUr zb!qh2r$_jG1o3KATUTdoOKVd&8i5Qwwnxv);Ux(?xtGkuZ{?--@nqk;xp-jEOSBU6 z;sd?!6d5gKk&vQ?_?C6HC-sc+oMdh7UAN!%(YtP`y{)1)9F8pOTCrfk!h(6lqw=Jl zog7Pie!;x?NpbT?%u7W{CsQF%BybTaXAx>wj+UmP)MJAuktnZ-dXX(qXemk7HPtM5c?qxI)wZ^E zBopT*n*klCGlEzC=#AA5=u8bpeg>|nP}`8=^c);qPR695c-#$Xqr13yq78Uqviu^% z%Bfw-b!;xh=Ftz?Up`+a=;Tt0Qoiy98k!^%*BIVLA{vW+wF)#A;s$GVx&xFKX;tVz zNW{RQUsJZ0#KfkYX)atVyxXTdZ@ISX6AX zQh7zXq#}pPE7E=`a&)%2+7RrJwR7idSw}0Gx6l-)ojY$Kr%>VZN=O)asPuUy#?~T| zF4n?Gq4JBh&#^;Ui?y4uLlzXz*L85TA;qO!S*^4XqusHwxjI%_TB5`9`6O7b^On!o zUY}2eme1Gz)3%q-r@ZC!X$+%>H>|{)tt)F+bk(d9V?e9jF+b6 zc)YzKf|vgcsc&ndr@ZmBItEL)wI!0uWV6r^Yie2EDpKfyd!ewKG?N%OtO&1esc&v- zsAU*lwnBAvL?e;5+ID(fo9xD$v7EZ9zP&|#x@kFH_3ltDWKOuLgWfk*^mcPC-fUF* zh{iAJLcLf6=%c^R)X~rw33t&m_jvP@bfc`!NR*x>MV3(_*r!4vi9_8=)s6@E@m6jv zy*ruQ>1xrt&;y6znRj}zx>mnrt*}bKn*lHlkFVlkez=tg9oR+zyeM9a7n4WZ%TMuB z20XRU))ooFv-$=4q$0el9F4Th4M!WaURvcO^>(ZzF?v4%kKAevir**3O9fH9Cd{rC zFEy+72+Z#2tnF;1*BYomcvSntd~YB%U-BCVrp{vvaCceD2QKT~vT+ zk@D2me!8o_hUNZ1SljPQ>PMV6IbXE=kuE5If{T5Luk|OzN;gDd3gbrr;y5{ zQ0k}sbe!b=T>4n~%vqijppeq-K6bICxZMxv$bVjrm5;MLg`_{u{-comXVbM9%CqTq z-`ew++E=GDIspo)ygDwALMqRuYcZ5()9rptM=rj-|99;TaCsDt)jpPMF>VjpF19?G zPI~NqwvIRf3W?i&nVybQIsd!)4s&^j+20h>cuDP(fD_PS2yMFAx4$;s?*CW#|Gx(s zP(}GjKn7RYa=VYqx_YzR-VU_4BQ39EIn(3K`?#b(%G~C&@@>p>Ikdc&_pkBrjl3W5 z@U6U`=i%FUKj`81dF6Z$-^0!*^zakRi#>dpd5MSH`{ef7Z(FZieP3BA*CTJ9+Zg@* z1X6A8m*aUPkG#2`jr*-0euni|d3ZnHzgp_y_P$n)hsRm|9uGgvyw1ZWE!y9!#kO8@o@W`LZ64*=X32iu;s>C&o+eICy0x6eDv?@o~Zoh+a0(GzEW zjfd}J9`Nuyejr$WkAn0EnFl@cOPS|;cn$MH54X={%kNZ>{s2EeQsR*hGQYvY!~C3! z>*3wZD?Hpj=d#4Z_XSWmwn`5_5YSjvdH50LOFcYix{tBzQvC7YE zFj)#YCzVG_G;jIsU{t=>ew=lmO4kjkUCTfF5T02|AHRZS-2k4%vKC0V)s z20LTfpZRGc<$X@ymTz@DkI0zzHyepMo*2n~TAJGY)_*U7QTbj!1v&w-%{D>u*V=Ex z6G*Y~q!1#1&G{vxxL20;JzYd+sp9;*r|Dh&zpQp6>b0N7q_^);j?7;A#s40{^E`6% zmQQUuR{mArG`T+L$>7=5?=Oy3hwp4Q`MvFD^V@o40F0IYV_QuAV>W}?P5O`8oVF=Q YAFKUKXkcLra{Z~jufd-!*S7!v0)dLNl>h($ literal 0 HcmV?d00001 diff --git a/drivers/net/can/ls_canfd/lscanfd_platform.o_shipped b/drivers/net/can/ls_canfd/lscanfd_platform.o_shipped index c52be3d00464e86970c66130fad666c9e13a7d52..cde1e4998178a922d176c3fbaf2dea64deb9c320 100644 GIT binary patch delta 106 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 H<@Ns`FiMQ# literal 0 HcmV?d00001