diff -urN linux-4.4.13/.config linux-4.4.13-t030-20161102/.config
--- linux-4.4.13/.config	1970-01-01 01:00:00.000000000 +0100
+++ linux-4.4.13-t030-20161102/.config	2016-11-02 11:03:19.000000000 +0100
@@ -0,0 +1,1304 @@
+#
+# Automatically generated file; DO NOT EDIT.
+# Linux/m68k 4.4.13 Kernel Configuration
+#
+CONFIG_M68K=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_TIME_LOW_RES=y
+CONFIG_NO_IOPORT_MAP=y
+# CONFIG_NO_DMA is not set
+CONFIG_ZONE_DMA=y
+CONFIG_HZ=100
+CONFIG_PGTABLE_LEVELS=3
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+CONFIG_IRQ_WORK=y
+
+#
+# General setup
+#
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+CONFIG_CROSS_COMPILE=""
+# CONFIG_COMPILE_TEST is not set
+CONFIG_LOCALVERSION="-multi"
+CONFIG_LOCALVERSION_AUTO=y
+CONFIG_DEFAULT_HOSTNAME="(none)"
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+CONFIG_SYSVIPC_SYSCTL=y
+# CONFIG_POSIX_MQUEUE is not set
+CONFIG_CROSS_MEMORY_ATTACH=y
+CONFIG_FHANDLE=y
+CONFIG_USELIB=y
+# CONFIG_AUDIT is not set
+
+#
+# IRQ subsystem
+#
+CONFIG_GENERIC_IRQ_SHOW=y
+CONFIG_ARCH_USES_GETTIMEOFFSET=y
+
+#
+# CPU/Task time and stats accounting
+#
+CONFIG_TICK_CPU_ACCOUNTING=y
+CONFIG_BSD_PROCESS_ACCT=y
+CONFIG_BSD_PROCESS_ACCT_V3=y
+# CONFIG_TASKSTATS is not set
+
+#
+# RCU Subsystem
+#
+CONFIG_TINY_RCU=y
+# CONFIG_RCU_EXPERT is not set
+CONFIG_SRCU=y
+# CONFIG_TASKS_RCU is not set
+# CONFIG_RCU_STALL_COMMON is not set
+# CONFIG_TREE_RCU_TRACE is not set
+# CONFIG_RCU_EXPEDITE_BOOT is not set
+# CONFIG_BUILD_BIN2C is not set
+# CONFIG_IKCONFIG is not set
+CONFIG_LOG_BUF_SHIFT=16
+# CONFIG_CGROUPS is not set
+# CONFIG_CHECKPOINT_RESTORE is not set
+CONFIG_NAMESPACES=y
+# CONFIG_UTS_NS is not set
+# CONFIG_IPC_NS is not set
+# CONFIG_USER_NS is not set
+# CONFIG_PID_NS is not set
+CONFIG_NET_NS=y
+# CONFIG_SCHED_AUTOGROUP is not set
+# CONFIG_SYSFS_DEPRECATED is not set
+# CONFIG_RELAY is not set
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_RD_GZIP=y
+# CONFIG_RD_BZIP2 is not set
+# CONFIG_RD_LZMA is not set
+# CONFIG_RD_XZ is not set
+# CONFIG_RD_LZO is not set
+# CONFIG_RD_LZ4 is not set
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_SYSCTL=y
+CONFIG_ANON_INODES=y
+CONFIG_HAVE_UID16=y
+CONFIG_BPF=y
+# CONFIG_EXPERT is not set
+CONFIG_UID16=y
+CONFIG_MULTIUSER=y
+CONFIG_SGETMASK_SYSCALL=y
+CONFIG_SYSFS_SYSCALL=y
+# CONFIG_SYSCTL_SYSCALL is not set
+CONFIG_KALLSYMS=y
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_ELF_CORE=y
+CONFIG_BASE_FULL=y
+CONFIG_FUTEX=y
+CONFIG_HAVE_FUTEX_CMPXCHG=y
+CONFIG_EPOLL=y
+CONFIG_SIGNALFD=y
+CONFIG_TIMERFD=y
+CONFIG_EVENTFD=y
+# CONFIG_BPF_SYSCALL is not set
+CONFIG_SHMEM=y
+CONFIG_AIO=y
+CONFIG_ADVISE_SYSCALLS=y
+# CONFIG_USERFAULTFD is not set
+CONFIG_MEMBARRIER=y
+# CONFIG_EMBEDDED is not set
+
+#
+# Kernel Performance Events And Counters
+#
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_COMPAT_BRK=y
+CONFIG_SLAB=y
+# CONFIG_SLUB is not set
+# CONFIG_SYSTEM_DATA_VERIFICATION is not set
+# CONFIG_PROFILING is not set
+# CONFIG_UPROBES is not set
+# CONFIG_HAVE_64BIT_ALIGNED_ACCESS is not set
+CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y
+CONFIG_ARCH_WANT_IPC_PARSE_VERSION=y
+# CONFIG_CC_STACKPROTECTOR is not set
+CONFIG_HAVE_MOD_ARCH_SPECIFIC=y
+CONFIG_MODULES_USE_ELF_RELA=y
+CONFIG_MODULES_USE_ELF_REL=y
+CONFIG_OLD_SIGSUSPEND3=y
+CONFIG_OLD_SIGACTION=y
+
+#
+# GCOV-based kernel profiling
+#
+# CONFIG_ARCH_HAS_GCOV_PROFILE_ALL is not set
+# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
+CONFIG_SLABINFO=y
+CONFIG_RT_MUTEXES=y
+CONFIG_BASE_SMALL=0
+CONFIG_MODULES=y
+# CONFIG_MODULE_FORCE_LOAD is not set
+CONFIG_MODULE_UNLOAD=y
+# CONFIG_MODULE_FORCE_UNLOAD is not set
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+# CONFIG_MODULE_SIG is not set
+# CONFIG_MODULE_COMPRESS is not set
+CONFIG_BLOCK=y
+CONFIG_LBDAF=y
+# CONFIG_BLK_DEV_BSG is not set
+# CONFIG_BLK_DEV_BSGLIB is not set
+# CONFIG_BLK_DEV_INTEGRITY is not set
+# CONFIG_BLK_CMDLINE_PARSER is not set
+
+#
+# Partition Types
+#
+CONFIG_PARTITION_ADVANCED=y
+# CONFIG_ACORN_PARTITION is not set
+# CONFIG_AIX_PARTITION is not set
+# CONFIG_OSF_PARTITION is not set
+# CONFIG_AMIGA_PARTITION is not set
+# CONFIG_ATARI_PARTITION is not set
+# CONFIG_MAC_PARTITION is not set
+CONFIG_MSDOS_PARTITION=y
+# CONFIG_BSD_DISKLABEL is not set
+# CONFIG_MINIX_SUBPARTITION is not set
+# CONFIG_SOLARIS_X86_PARTITION is not set
+# CONFIG_UNIXWARE_DISKLABEL is not set
+# CONFIG_LDM_PARTITION is not set
+# CONFIG_SGI_PARTITION is not set
+# CONFIG_ULTRIX_PARTITION is not set
+# CONFIG_SUN_PARTITION is not set
+# CONFIG_KARMA_PARTITION is not set
+CONFIG_EFI_PARTITION=y
+# CONFIG_SYSV68_PARTITION is not set
+# CONFIG_CMDLINE_PARTITION is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+# CONFIG_IOSCHED_DEADLINE is not set
+# CONFIG_IOSCHED_CFQ is not set
+CONFIG_DEFAULT_NOOP=y
+CONFIG_DEFAULT_IOSCHED="noop"
+CONFIG_INLINE_SPIN_UNLOCK_IRQ=y
+CONFIG_INLINE_READ_UNLOCK=y
+CONFIG_INLINE_READ_UNLOCK_IRQ=y
+CONFIG_INLINE_WRITE_UNLOCK=y
+CONFIG_INLINE_WRITE_UNLOCK_IRQ=y
+# CONFIG_FREEZER is not set
+CONFIG_MMU=y
+CONFIG_MMU_MOTOROLA=y
+# CONFIG_KEXEC is not set
+
+#
+# Platform setup
+#
+
+#
+# Processor Type
+#
+CONFIG_M68KCLASSIC=y
+# CONFIG_COLDFIRE is not set
+# CONFIG_M68020 is not set
+CONFIG_M68030=y
+# CONFIG_M68040 is not set
+# CONFIG_M68060 is not set
+
+#
+# Processor Specific Options
+#
+CONFIG_M68KFPU_EMU=y
+# CONFIG_M68KFPU_EMU_EXTRAPREC is not set
+CONFIG_M68KFPU_EMU_ONLY=y
+CONFIG_ADVANCED=y
+CONFIG_RMW_INSNS=y
+# CONFIG_SINGLE_MEMORY_CHUNK is not set
+CONFIG_ARCH_DISCONTIGMEM_ENABLE=y
+CONFIG_NODES_SHIFT=3
+CONFIG_CPU_HAS_ADDRESS_SPACES=y
+CONFIG_FPU=y
+
+#
+# Machine Types
+#
+# CONFIG_AMIGA is not set
+# CONFIG_ATARI is not set
+# CONFIG_MAC is not set
+# CONFIG_APOLLO is not set
+# CONFIG_VME is not set
+# CONFIG_HP300 is not set
+# CONFIG_SUN3X is not set
+# CONFIG_Q40 is not set
+CONFIG_T030=y
+
+#
+# Bus Support
+#
+# CONFIG_GENERIC_ISA_DMA is not set
+
+#
+# Kernel Features
+#
+CONFIG_DISCONTIGMEM=y
+CONFIG_FLAT_NODE_MEM_MAP=y
+CONFIG_NEED_MULTIPLE_NODES=y
+# CONFIG_HAVE_BOOTMEM_INFO_NODE is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
+# CONFIG_COMPACTION is not set
+# CONFIG_PHYS_ADDR_T_64BIT is not set
+CONFIG_ZONE_DMA_FLAG=1
+# CONFIG_BOUNCE is not set
+CONFIG_VIRT_TO_BUS=y
+# CONFIG_KSM is not set
+CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
+CONFIG_NEED_PER_CPU_KM=y
+# CONFIG_CLEANCACHE is not set
+# CONFIG_FRONTSWAP is not set
+# CONFIG_ZPOOL is not set
+# CONFIG_ZBUD is not set
+# CONFIG_ZSMALLOC is not set
+# CONFIG_IDLE_PAGE_TRACKING is not set
+
+#
+# Executable file formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+CONFIG_BINFMT_SCRIPT=y
+CONFIG_HAVE_AOUT=y
+# CONFIG_BINFMT_AOUT is not set
+CONFIG_BINFMT_MISC=m
+CONFIG_COREDUMP=y
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_PACKET is not set
+CONFIG_UNIX=y
+# CONFIG_UNIX_DIAG is not set
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+# CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_XFRM_MIGRATE is not set
+# CONFIG_XFRM_STATISTICS is not set
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+# CONFIG_IP_ADVANCED_ROUTER is not set
+# CONFIG_IP_PNP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE_DEMUX is not set
+CONFIG_NET_IP_TUNNEL=y
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_NET_IPVTI is not set
+# CONFIG_NET_UDP_TUNNEL is not set
+# CONFIG_NET_FOU is not set
+# CONFIG_NET_FOU_IP_TUNNELS is not set
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
+# CONFIG_INET_XFRM_TUNNEL is not set
+CONFIG_INET_TUNNEL=y
+CONFIG_INET_XFRM_MODE_TRANSPORT=y
+CONFIG_INET_XFRM_MODE_TUNNEL=y
+CONFIG_INET_XFRM_MODE_BEET=y
+CONFIG_INET_LRO=y
+CONFIG_INET_DIAG=y
+CONFIG_INET_TCP_DIAG=y
+# CONFIG_INET_UDP_DIAG is not set
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+CONFIG_IPV6=y
+# CONFIG_IPV6_ROUTER_PREF is not set
+# CONFIG_IPV6_OPTIMISTIC_DAD is not set
+# CONFIG_INET6_AH is not set
+# CONFIG_INET6_ESP is not set
+# CONFIG_INET6_IPCOMP is not set
+# CONFIG_IPV6_MIP6 is not set
+# CONFIG_IPV6_ILA is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+CONFIG_INET6_XFRM_MODE_TRANSPORT=y
+CONFIG_INET6_XFRM_MODE_TUNNEL=y
+CONFIG_INET6_XFRM_MODE_BEET=y
+# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
+# CONFIG_IPV6_VTI is not set
+CONFIG_IPV6_SIT=y
+# CONFIG_IPV6_SIT_6RD is not set
+CONFIG_IPV6_NDISC_NODETYPE=y
+# CONFIG_IPV6_TUNNEL is not set
+# CONFIG_IPV6_GRE is not set
+# CONFIG_IPV6_MULTIPLE_TABLES is not set
+# CONFIG_IPV6_MROUTE is not set
+# CONFIG_NETWORK_SECMARK is not set
+# CONFIG_NET_PTP_CLASSIFY is not set
+# CONFIG_NETWORK_PHY_TIMESTAMPING is not set
+# CONFIG_NETFILTER is not set
+# CONFIG_IP_DCCP is not set
+# CONFIG_IP_SCTP is not set
+# CONFIG_RDS is not set
+# CONFIG_TIPC is not set
+# CONFIG_ATM is not set
+# CONFIG_L2TP is not set
+# CONFIG_BRIDGE is not set
+CONFIG_HAVE_NET_DSA=y
+# CONFIG_VLAN_8021Q is not set
+# CONFIG_DECNET is not set
+# CONFIG_LLC2 is not set
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_PHONET is not set
+# CONFIG_6LOWPAN is not set
+# CONFIG_IEEE802154 is not set
+# CONFIG_NET_SCHED is not set
+# CONFIG_DCB is not set
+CONFIG_DNS_RESOLVER=y
+# CONFIG_BATMAN_ADV is not set
+# CONFIG_OPENVSWITCH is not set
+# CONFIG_VSOCKETS is not set
+CONFIG_NETLINK_MMAP=y
+CONFIG_NETLINK_DIAG=y
+# CONFIG_MPLS is not set
+# CONFIG_HSR is not set
+# CONFIG_NET_SWITCHDEV is not set
+# CONFIG_NET_L3_MASTER_DEV is not set
+CONFIG_NET_RX_BUSY_POLL=y
+CONFIG_BQL=y
+
+#
+# Network testing
+#
+# CONFIG_NET_PKTGEN is not set
+# CONFIG_HAMRADIO is not set
+# CONFIG_CAN is not set
+# CONFIG_IRDA is not set
+# CONFIG_BT is not set
+# CONFIG_AF_RXRPC is not set
+CONFIG_WIRELESS=y
+# CONFIG_CFG80211 is not set
+# CONFIG_LIB80211 is not set
+
+#
+# CFG80211 needs to be enabled for MAC80211
+#
+CONFIG_MAC80211_STA_HASH_MAX_SIZE=0
+# CONFIG_WIMAX is not set
+# CONFIG_RFKILL is not set
+# CONFIG_NET_9P is not set
+# CONFIG_CAIF is not set
+# CONFIG_CEPH_LIB is not set
+# CONFIG_NFC is not set
+# CONFIG_LWTUNNEL is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+# CONFIG_UEVENT_HELPER is not set
+CONFIG_DEVTMPFS=y
+CONFIG_DEVTMPFS_MOUNT=y
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+# CONFIG_FIRMWARE_IN_KERNEL is not set
+CONFIG_EXTRA_FIRMWARE=""
+# CONFIG_FW_LOADER_USER_HELPER_FALLBACK is not set
+CONFIG_ALLOW_DEV_COREDUMP=y
+# CONFIG_SYS_HYPERVISOR is not set
+CONFIG_GENERIC_CPU_DEVICES=y
+# CONFIG_DMA_SHARED_BUFFER is not set
+
+#
+# Bus devices
+#
+# CONFIG_CONNECTOR is not set
+# CONFIG_MTD is not set
+# CONFIG_OF is not set
+# CONFIG_PARPORT is not set
+CONFIG_BLK_DEV=y
+# CONFIG_BLK_DEV_NULL_BLK is not set
+# CONFIG_BLK_DEV_COW_COMMON is not set
+# CONFIG_BLK_DEV_LOOP is not set
+# CONFIG_BLK_DEV_DRBD is not set
+# CONFIG_BLK_DEV_NBD is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_COUNT=4
+CONFIG_BLK_DEV_RAM_SIZE=4096
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+# CONFIG_BLK_DEV_HD is not set
+# CONFIG_BLK_DEV_RBD is not set
+
+#
+# Misc devices
+#
+# CONFIG_SENSORS_LIS3LV02D is not set
+# CONFIG_AD525X_DPOT is not set
+# CONFIG_DUMMY_IRQ is not set
+# CONFIG_ENCLOSURE_SERVICES is not set
+# CONFIG_TI_DAC7512 is not set
+# CONFIG_BMP085_SPI is not set
+# CONFIG_LATTICE_ECP3_CONFIG is not set
+# CONFIG_SRAM is not set
+# CONFIG_C2PORT is not set
+
+#
+# EEPROM support
+#
+# CONFIG_EEPROM_AT25 is not set
+# CONFIG_EEPROM_93CX6 is not set
+# CONFIG_EEPROM_93XX46 is not set
+
+#
+# Texas Instruments shared transport line discipline
+#
+# CONFIG_SENSORS_LIS3_SPI is not set
+
+#
+# Altera FPGA firmware download module
+#
+
+#
+# Intel MIC Bus Driver
+#
+
+#
+# SCIF Bus Driver
+#
+
+#
+# Intel MIC Host Driver
+#
+
+#
+# Intel MIC Card Driver
+#
+
+#
+# SCIF Driver
+#
+
+#
+# Intel MIC Coprocessor State Management (COSM) Drivers
+#
+# CONFIG_ECHO is not set
+# CONFIG_CXL_BASE is not set
+# CONFIG_CXL_KERNEL_API is not set
+# CONFIG_CXL_EEH is not set
+CONFIG_HAVE_IDE=y
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+CONFIG_SCSI_MOD=y
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_DMA is not set
+# CONFIG_SCSI_NETLINK is not set
+# CONFIG_MD is not set
+CONFIG_NETDEVICES=y
+CONFIG_NET_CORE=y
+# CONFIG_BONDING is not set
+# CONFIG_DUMMY is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_NET_TEAM is not set
+# CONFIG_MACVLAN is not set
+# CONFIG_IPVLAN is not set
+# CONFIG_VXLAN is not set
+# CONFIG_NETCONSOLE is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
+# CONFIG_TUN is not set
+# CONFIG_TUN_VNET_CROSS_LE is not set
+# CONFIG_VETH is not set
+# CONFIG_NLMON is not set
+
+#
+# CAIF transport drivers
+#
+
+#
+# Distributed Switch Architecture drivers
+#
+# CONFIG_NET_DSA_MV88E6XXX is not set
+# CONFIG_NET_DSA_MV88E6XXX_NEED_PPU is not set
+CONFIG_ETHERNET=y
+# CONFIG_ALTERA_TSE is not set
+# CONFIG_NET_VENDOR_ARC is not set
+# CONFIG_NET_VENDOR_AURORA is not set
+# CONFIG_NET_CADENCE is not set
+# CONFIG_NET_VENDOR_BROADCOM is not set
+# CONFIG_DNET is not set
+# CONFIG_NET_VENDOR_EZCHIP is not set
+# CONFIG_NET_VENDOR_INTEL is not set
+# CONFIG_NET_VENDOR_MARVELL is not set
+# CONFIG_NET_VENDOR_MICREL is not set
+CONFIG_NET_VENDOR_MICROCHIP=y
+CONFIG_ENC28J60=y
+# CONFIG_ENC28J60_WRITEVERIFY is not set
+# CONFIG_ENCX24J600 is not set
+# CONFIG_NET_VENDOR_NATSEMI is not set
+# CONFIG_ETHOC is not set
+# CONFIG_NET_VENDOR_QUALCOMM 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_STMICRO is not set
+# CONFIG_NET_VENDOR_SYNOPSYS is not set
+# CONFIG_NET_VENDOR_VIA is not set
+# CONFIG_NET_VENDOR_WIZNET is not set
+# CONFIG_PHYLIB is not set
+# CONFIG_MICREL_KS8995MA is not set
+# CONFIG_PPP is not set
+# CONFIG_SLIP is not set
+
+#
+# Host-side USB support is needed for USB Network Adapter support
+#
+# CONFIG_WLAN is not set
+
+#
+# Enable WiMAX (Networking options) to see the WiMAX drivers
+#
+# CONFIG_WAN is not set
+# CONFIG_ISDN is not set
+# CONFIG_NVM is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+CONFIG_INPUT_LEDS=y
+# CONFIG_INPUT_FF_MEMLESS is not set
+# CONFIG_INPUT_POLLDEV is not set
+# CONFIG_INPUT_SPARSEKMAP is not set
+# CONFIG_INPUT_MATRIXKMAP is not set
+
+#
+# Userland interfaces
+#
+# CONFIG_INPUT_MOUSEDEV is not set
+# CONFIG_INPUT_JOYDEV is not set
+CONFIG_INPUT_EVDEV=m
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input Device Drivers
+#
+# CONFIG_INPUT_KEYBOARD is not set
+# CONFIG_INPUT_MOUSE is not set
+# CONFIG_INPUT_JOYSTICK is not set
+# CONFIG_INPUT_TABLET is not set
+# CONFIG_INPUT_TOUCHSCREEN is not set
+# CONFIG_INPUT_MISC is not set
+
+#
+# Hardware I/O ports
+#
+CONFIG_SERIO=y
+CONFIG_SERIO_SERPORT=y
+# CONFIG_SERIO_LIBPS2 is not set
+# CONFIG_SERIO_RAW is not set
+# CONFIG_SERIO_ALTERA_PS2 is not set
+# CONFIG_SERIO_PS2MULT is not set
+# CONFIG_SERIO_ARC_PS2 is not set
+# CONFIG_USERIO is not set
+# CONFIG_GAMEPORT is not set
+
+#
+# Character devices
+#
+CONFIG_TTY=y
+CONFIG_VT=y
+CONFIG_CONSOLE_TRANSLATIONS=y
+CONFIG_VT_CONSOLE=y
+CONFIG_HW_CONSOLE=y
+CONFIG_VT_HW_CONSOLE_BINDING=y
+CONFIG_UNIX98_PTYS=y
+# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
+# CONFIG_LEGACY_PTYS is not set
+# CONFIG_SERIAL_NONSTANDARD is not set
+# CONFIG_N_GSM is not set
+# CONFIG_TRACE_SINK is not set
+CONFIG_DEVMEM=y
+# CONFIG_DEVKMEM is not set
+
+#
+# Serial drivers
+#
+# CONFIG_SERIAL_8250 is not set
+
+#
+# Non-8250 serial port support
+#
+# CONFIG_SERIAL_MAX3100 is not set
+# CONFIG_SERIAL_MAX310X is not set
+# CONFIG_SERIAL_UARTLITE is not set
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_SERIAL_MC68901=y
+# CONFIG_SERIAL_SCCNXP is not set
+# CONFIG_SERIAL_SC16IS7XX is not set
+# CONFIG_SERIAL_ALTERA_JTAGUART is not set
+# CONFIG_SERIAL_ALTERA_UART is not set
+# CONFIG_SERIAL_ARC is not set
+# CONFIG_SERIAL_FSL_LPUART is not set
+# CONFIG_IPMI_HANDLER is not set
+# CONFIG_HW_RANDOM is not set
+# CONFIG_GEN_RTC is not set
+# CONFIG_R3964 is not set
+# CONFIG_RAW_DRIVER is not set
+# CONFIG_TCG_TPM is not set
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+CONFIG_SPI=y
+CONFIG_SPI_MASTER=y
+
+#
+# SPI Master Controller Drivers
+#
+# CONFIG_SPI_ALTERA is not set
+CONFIG_SPI_BITBANG=y
+# CONFIG_SPI_CADENCE is not set
+# CONFIG_SPI_PXA2XX_PCI is not set
+CONFIG_SPI_TP3465=y
+# CONFIG_SPI_XILINX is not set
+# CONFIG_SPI_ZYNQMP_GQSPI is not set
+# CONFIG_SPI_DESIGNWARE is not set
+
+#
+# SPI Protocol Masters
+#
+# CONFIG_SPI_SPIDEV is not set
+# CONFIG_SPI_TLE62X0 is not set
+# CONFIG_SPMI is not set
+# CONFIG_HSI is not set
+
+#
+# PPS support
+#
+# CONFIG_PPS is not set
+
+#
+# PPS generators support
+#
+
+#
+# PTP clock support
+#
+# CONFIG_PTP_1588_CLOCK is not set
+
+#
+# Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks.
+#
+# CONFIG_W1 is not set
+# CONFIG_POWER_SUPPLY is not set
+# CONFIG_POWER_AVS is not set
+# CONFIG_HWMON is not set
+# CONFIG_THERMAL is not set
+# CONFIG_WATCHDOG is not set
+CONFIG_SSB_POSSIBLE=y
+
+#
+# Sonics Silicon Backplane
+#
+# CONFIG_SSB is not set
+CONFIG_BCMA_POSSIBLE=y
+
+#
+# Broadcom specific AMBA
+#
+# CONFIG_BCMA is not set
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_CORE is not set
+# CONFIG_MFD_DA9052_SPI is not set
+# CONFIG_MFD_MC13XXX_SPI is not set
+# CONFIG_HTC_PASIC3 is not set
+# CONFIG_MFD_KEMPLD is not set
+# CONFIG_MFD_MT6397 is not set
+# CONFIG_EZX_PCAP is not set
+# CONFIG_MFD_SM501 is not set
+# CONFIG_ABX500_CORE is not set
+# CONFIG_MFD_SYSCON is not set
+# CONFIG_MFD_TI_AM335X_TSCADC is not set
+# CONFIG_MFD_TMIO is not set
+# CONFIG_MFD_ARIZONA_SPI is not set
+# CONFIG_MFD_WM831X_SPI is not set
+# CONFIG_REGULATOR is not set
+# CONFIG_MEDIA_SUPPORT is not set
+
+#
+# Graphics support
+#
+# CONFIG_DRM is not set
+
+#
+# Frame buffer Devices
+#
+# CONFIG_FB is not set
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+# CONFIG_VGASTATE is not set
+
+#
+# Console display driver support
+#
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_DUMMY_CONSOLE_COLUMNS=80
+CONFIG_DUMMY_CONSOLE_ROWS=25
+# CONFIG_SOUND is not set
+
+#
+# HID support
+#
+# CONFIG_HID is not set
+CONFIG_USB_OHCI_LITTLE_ENDIAN=y
+# CONFIG_USB_SUPPORT is not set
+# CONFIG_UWB is not set
+CONFIG_MMC=y
+# CONFIG_MMC_DEBUG is not set
+
+#
+# MMC/SD/SDIO Card Drivers
+#
+CONFIG_MMC_BLOCK=y
+CONFIG_MMC_BLOCK_MINORS=8
+CONFIG_MMC_BLOCK_BOUNCE=y
+# CONFIG_SDIO_UART is not set
+# CONFIG_MMC_TEST is not set
+
+#
+# MMC/SD/SDIO Host Controller Drivers
+#
+# CONFIG_MMC_SDHCI is not set
+CONFIG_MMC_SPI=y
+# CONFIG_MMC_USDHI6ROL0 is not set
+# CONFIG_MMC_MTK is not set
+# CONFIG_MEMSTICK is not set
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+# CONFIG_LEDS_CLASS_FLASH is not set
+
+#
+# LED drivers
+#
+# CONFIG_LEDS_DAC124S085 is not set
+
+#
+# LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM)
+#
+CONFIG_LEDS_T030=y
+
+#
+# LED Triggers
+#
+CONFIG_LEDS_TRIGGERS=y
+# CONFIG_LEDS_TRIGGER_TIMER is not set
+# CONFIG_LEDS_TRIGGER_ONESHOT is not set
+CONFIG_LEDS_TRIGGER_HEARTBEAT=y
+# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
+# CONFIG_LEDS_TRIGGER_CPU is not set
+CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
+
+#
+# iptables trigger is under Netfilter config (LED target)
+#
+# CONFIG_LEDS_TRIGGER_TRANSIENT is not set
+# CONFIG_LEDS_TRIGGER_CAMERA is not set
+# CONFIG_ACCESSIBILITY is not set
+# CONFIG_RTC_CLASS is not set
+# CONFIG_DMADEVICES is not set
+# CONFIG_AUXDISPLAY is not set
+# CONFIG_UIO is not set
+# CONFIG_VIRT_DRIVERS is not set
+
+#
+# Virtio drivers
+#
+# CONFIG_VIRTIO_MMIO is not set
+
+#
+# Microsoft Hyper-V guest support
+#
+# CONFIG_STAGING is not set
+
+#
+# Hardware Spinlock drivers
+#
+# CONFIG_MAILBOX is not set
+# CONFIG_IOMMU_SUPPORT is not set
+
+#
+# Remoteproc drivers
+#
+# CONFIG_STE_MODEM_RPROC is not set
+
+#
+# Rpmsg drivers
+#
+
+#
+# SOC (System On Chip) specific Drivers
+#
+# CONFIG_SUNXI_SRAM is not set
+# CONFIG_SOC_TI is not set
+# CONFIG_PM_DEVFREQ is not set
+# CONFIG_EXTCON is not set
+# CONFIG_MEMORY is not set
+# CONFIG_IIO is not set
+# CONFIG_PWM is not set
+# CONFIG_IPACK_BUS is not set
+# CONFIG_RESET_CONTROLLER is not set
+# CONFIG_FMC is not set
+
+#
+# PHY Subsystem
+#
+# CONFIG_GENERIC_PHY is not set
+# CONFIG_PHY_PXA_28NM_HSIC is not set
+# CONFIG_PHY_PXA_28NM_USB2 is not set
+# CONFIG_BCM_KONA_USB2_PHY is not set
+# CONFIG_POWERCAP is not set
+# CONFIG_MCB is not set
+
+#
+# Performance monitor support
+#
+# CONFIG_RAS is not set
+
+#
+# Android
+#
+# CONFIG_ANDROID is not set
+# CONFIG_NVMEM is not set
+# CONFIG_STM is not set
+# CONFIG_STM_DUMMY is not set
+# CONFIG_STM_SOURCE_CONSOLE is not set
+# CONFIG_INTEL_TH is not set
+
+#
+# FPGA Configuration Support
+#
+# CONFIG_FPGA is not set
+
+#
+# Platform devices
+#
+CONFIG_PROC_HARDWARE=y
+
+#
+# Character devices
+#
+
+#
+# File systems
+#
+# CONFIG_EXT2_FS is not set
+# CONFIG_EXT3_FS is not set
+CONFIG_EXT4_FS=y
+CONFIG_EXT4_USE_FOR_EXT2=y
+# CONFIG_EXT4_FS_POSIX_ACL is not set
+# CONFIG_EXT4_FS_SECURITY is not set
+# CONFIG_EXT4_ENCRYPTION is not set
+# CONFIG_EXT4_DEBUG is not set
+CONFIG_JBD2=y
+# CONFIG_JBD2_DEBUG is not set
+CONFIG_FS_MBCACHE=y
+# CONFIG_REISERFS_FS is not set
+# CONFIG_JFS_FS is not set
+# CONFIG_XFS_FS is not set
+# CONFIG_GFS2_FS is not set
+# CONFIG_OCFS2_FS is not set
+# CONFIG_BTRFS_FS is not set
+# CONFIG_NILFS2_FS is not set
+# CONFIG_F2FS_FS is not set
+# CONFIG_FS_DAX is not set
+# CONFIG_FS_POSIX_ACL is not set
+CONFIG_EXPORTFS=y
+CONFIG_FILE_LOCKING=y
+CONFIG_FSNOTIFY=y
+CONFIG_DNOTIFY=y
+CONFIG_INOTIFY_USER=y
+CONFIG_FANOTIFY=y
+# CONFIG_QUOTA is not set
+# CONFIG_QUOTACTL is not set
+# CONFIG_AUTOFS4_FS is not set
+# CONFIG_FUSE_FS is not set
+# CONFIG_OVERLAY_FS is not set
+
+#
+# Caches
+#
+CONFIG_FSCACHE=y
+# CONFIG_FSCACHE_STATS is not set
+# CONFIG_FSCACHE_HISTOGRAM is not set
+# CONFIG_FSCACHE_DEBUG is not set
+# CONFIG_FSCACHE_OBJECT_LIST is not set
+# CONFIG_CACHEFILES is not set
+
+#
+# CD-ROM/DVD Filesystems
+#
+# CONFIG_ISO9660_FS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=y
+# CONFIG_MSDOS_FS is not set
+CONFIG_VFAT_FS=y
+CONFIG_FAT_DEFAULT_CODEPAGE=437
+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
+# CONFIG_NTFS_FS is not set
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+CONFIG_PROC_KCORE=y
+CONFIG_PROC_SYSCTL=y
+CONFIG_PROC_PAGE_MONITOR=y
+# CONFIG_PROC_CHILDREN is not set
+CONFIG_KERNFS=y
+CONFIG_SYSFS=y
+CONFIG_TMPFS=y
+# CONFIG_TMPFS_POSIX_ACL is not set
+# CONFIG_TMPFS_XATTR is not set
+# CONFIG_HUGETLB_PAGE is not set
+CONFIG_CONFIGFS_FS=m
+# CONFIG_MISC_FILESYSTEMS is not set
+# CONFIG_NETWORK_FILESYSTEMS is not set
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="iso8859-1"
+CONFIG_NLS_CODEPAGE_437=y
+# CONFIG_NLS_CODEPAGE_737 is not set
+# CONFIG_NLS_CODEPAGE_775 is not set
+# CONFIG_NLS_CODEPAGE_850 is not set
+# CONFIG_NLS_CODEPAGE_852 is not set
+# CONFIG_NLS_CODEPAGE_855 is not set
+# CONFIG_NLS_CODEPAGE_857 is not set
+# CONFIG_NLS_CODEPAGE_860 is not set
+# CONFIG_NLS_CODEPAGE_861 is not set
+# CONFIG_NLS_CODEPAGE_862 is not set
+# CONFIG_NLS_CODEPAGE_863 is not set
+# CONFIG_NLS_CODEPAGE_864 is not set
+# CONFIG_NLS_CODEPAGE_865 is not set
+# CONFIG_NLS_CODEPAGE_866 is not set
+# CONFIG_NLS_CODEPAGE_869 is not set
+# CONFIG_NLS_CODEPAGE_936 is not set
+# CONFIG_NLS_CODEPAGE_950 is not set
+# CONFIG_NLS_CODEPAGE_932 is not set
+# CONFIG_NLS_CODEPAGE_949 is not set
+# CONFIG_NLS_CODEPAGE_874 is not set
+# CONFIG_NLS_ISO8859_8 is not set
+# CONFIG_NLS_CODEPAGE_1250 is not set
+# CONFIG_NLS_CODEPAGE_1251 is not set
+CONFIG_NLS_ASCII=y
+CONFIG_NLS_ISO8859_1=y
+# CONFIG_NLS_ISO8859_2 is not set
+# CONFIG_NLS_ISO8859_3 is not set
+# CONFIG_NLS_ISO8859_4 is not set
+# CONFIG_NLS_ISO8859_5 is not set
+# CONFIG_NLS_ISO8859_6 is not set
+# CONFIG_NLS_ISO8859_7 is not set
+# CONFIG_NLS_ISO8859_9 is not set
+# CONFIG_NLS_ISO8859_13 is not set
+# CONFIG_NLS_ISO8859_14 is not set
+# CONFIG_NLS_ISO8859_15 is not set
+# CONFIG_NLS_KOI8_R is not set
+# CONFIG_NLS_KOI8_U is not set
+# CONFIG_NLS_MAC_ROMAN is not set
+# CONFIG_NLS_MAC_CELTIC is not set
+# CONFIG_NLS_MAC_CENTEURO is not set
+# CONFIG_NLS_MAC_CROATIAN is not set
+# CONFIG_NLS_MAC_CYRILLIC is not set
+# CONFIG_NLS_MAC_GAELIC is not set
+# CONFIG_NLS_MAC_GREEK is not set
+# CONFIG_NLS_MAC_ICELAND is not set
+# CONFIG_NLS_MAC_INUIT is not set
+# CONFIG_NLS_MAC_ROMANIAN is not set
+# CONFIG_NLS_MAC_TURKISH is not set
+CONFIG_NLS_UTF8=y
+# CONFIG_DLM is not set
+
+#
+# Kernel hacking
+#
+
+#
+# printk and dmesg options
+#
+# CONFIG_PRINTK_TIME is not set
+CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4
+
+#
+# Compile-time checks and compiler options
+#
+CONFIG_ENABLE_WARN_DEPRECATED=y
+CONFIG_ENABLE_MUST_CHECK=y
+CONFIG_FRAME_WARN=1024
+# CONFIG_STRIP_ASM_SYMS is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+# CONFIG_DEBUG_FS is not set
+# CONFIG_HEADERS_CHECK is not set
+# CONFIG_DEBUG_SECTION_MISMATCH is not set
+# CONFIG_SECTION_MISMATCH_WARN_ONLY is not set
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_DEBUG_KERNEL is not set
+
+#
+# Memory Debugging
+#
+# CONFIG_PAGE_EXTENSION is not set
+CONFIG_DEBUG_MEMORY_INIT=y
+
+#
+# Debug Lockups and Hangs
+#
+# CONFIG_PANIC_ON_OOPS is not set
+CONFIG_PANIC_ON_OOPS_VALUE=0
+CONFIG_PANIC_TIMEOUT=0
+# CONFIG_SCHED_INFO is not set
+# CONFIG_DEBUG_TIMEKEEPING is not set
+
+#
+# Lock Debugging (spinlocks, mutexes, etc...)
+#
+CONFIG_HAVE_DEBUG_BUGVERBOSE=y
+CONFIG_DEBUG_BUGVERBOSE=y
+
+#
+# RCU Debugging
+#
+# CONFIG_PROVE_RCU is not set
+# CONFIG_SPARSE_RCU_POINTER is not set
+# CONFIG_TORTURE_TEST is not set
+
+#
+# Runtime Testing
+#
+# CONFIG_ATOMIC64_SELFTEST is not set
+# CONFIG_TEST_HEXDUMP is not set
+# CONFIG_TEST_STRING_HELPERS is not set
+# CONFIG_TEST_KSTRTOX is not set
+# CONFIG_TEST_PRINTF is not set
+# CONFIG_TEST_RHASHTABLE is not set
+# CONFIG_TEST_LKM is not set
+# CONFIG_TEST_USER_COPY is not set
+# CONFIG_TEST_BPF is not set
+# CONFIG_TEST_FIRMWARE is not set
+# CONFIG_TEST_UDELAY is not set
+# CONFIG_TEST_STATIC_KEYS is not set
+# CONFIG_SAMPLES is not set
+# CONFIG_BOOTPARAM is not set
+CONFIG_EARLY_PRINTK=y
+
+#
+# Security options
+#
+CONFIG_KEYS=y
+# CONFIG_PERSISTENT_KEYRINGS is not set
+# CONFIG_BIG_KEYS is not set
+# CONFIG_ENCRYPTED_KEYS is not set
+# CONFIG_SECURITY_DMESG_RESTRICT is not set
+# CONFIG_SECURITY is not set
+# CONFIG_SECURITYFS is not set
+CONFIG_DEFAULT_SECURITY_DAC=y
+CONFIG_DEFAULT_SECURITY=""
+CONFIG_CRYPTO=y
+
+#
+# Crypto core or helper
+#
+CONFIG_CRYPTO_ALGAPI=y
+CONFIG_CRYPTO_ALGAPI2=y
+CONFIG_CRYPTO_AEAD=m
+CONFIG_CRYPTO_AEAD2=y
+CONFIG_CRYPTO_BLKCIPHER=y
+CONFIG_CRYPTO_BLKCIPHER2=y
+CONFIG_CRYPTO_HASH=y
+CONFIG_CRYPTO_HASH2=y
+CONFIG_CRYPTO_RNG=m
+CONFIG_CRYPTO_RNG2=y
+CONFIG_CRYPTO_RNG_DEFAULT=m
+CONFIG_CRYPTO_PCOMP2=y
+CONFIG_CRYPTO_AKCIPHER2=y
+# CONFIG_CRYPTO_RSA is not set
+CONFIG_CRYPTO_MANAGER=y
+CONFIG_CRYPTO_MANAGER2=y
+# CONFIG_CRYPTO_USER is not set
+# CONFIG_CRYPTO_MANAGER_DISABLE_TESTS is not set
+CONFIG_CRYPTO_GF128MUL=m
+CONFIG_CRYPTO_NULL=m
+CONFIG_CRYPTO_NULL2=y
+CONFIG_CRYPTO_WORKQUEUE=y
+# CONFIG_CRYPTO_CRYPTD is not set
+# CONFIG_CRYPTO_MCRYPTD is not set
+# CONFIG_CRYPTO_AUTHENC is not set
+# CONFIG_CRYPTO_TEST is not set
+
+#
+# Authenticated Encryption with Associated Data
+#
+# CONFIG_CRYPTO_CCM is not set
+# CONFIG_CRYPTO_GCM is not set
+# CONFIG_CRYPTO_CHACHA20POLY1305 is not set
+CONFIG_CRYPTO_SEQIV=m
+# CONFIG_CRYPTO_ECHAINIV is not set
+
+#
+# Block modes
+#
+# CONFIG_CRYPTO_CBC is not set
+# CONFIG_CRYPTO_CTR is not set
+# CONFIG_CRYPTO_CTS is not set
+CONFIG_CRYPTO_ECB=y
+# CONFIG_CRYPTO_LRW is not set
+# CONFIG_CRYPTO_PCBC is not set
+# CONFIG_CRYPTO_XTS is not set
+# CONFIG_CRYPTO_KEYWRAP is not set
+
+#
+# Hash modes
+#
+CONFIG_CRYPTO_CMAC=y
+CONFIG_CRYPTO_HMAC=y
+# CONFIG_CRYPTO_XCBC is not set
+# CONFIG_CRYPTO_VMAC is not set
+
+#
+# Digest
+#
+CONFIG_CRYPTO_CRC32C=y
+# CONFIG_CRYPTO_CRC32 is not set
+CONFIG_CRYPTO_CRCT10DIF=y
+# CONFIG_CRYPTO_GHASH is not set
+# CONFIG_CRYPTO_POLY1305 is not set
+CONFIG_CRYPTO_MD4=y
+CONFIG_CRYPTO_MD5=y
+# CONFIG_CRYPTO_MICHAEL_MIC is not set
+# CONFIG_CRYPTO_RMD128 is not set
+# CONFIG_CRYPTO_RMD160 is not set
+# CONFIG_CRYPTO_RMD256 is not set
+# CONFIG_CRYPTO_RMD320 is not set
+CONFIG_CRYPTO_SHA1=m
+CONFIG_CRYPTO_SHA256=y
+# CONFIG_CRYPTO_SHA512 is not set
+# CONFIG_CRYPTO_TGR192 is not set
+# CONFIG_CRYPTO_WP512 is not set
+
+#
+# Ciphers
+#
+CONFIG_CRYPTO_AES=y
+# CONFIG_CRYPTO_ANUBIS is not set
+CONFIG_CRYPTO_ARC4=y
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_CAMELLIA is not set
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+CONFIG_CRYPTO_DES=y
+# CONFIG_CRYPTO_FCRYPT is not set
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_SALSA20 is not set
+# CONFIG_CRYPTO_CHACHA20 is not set
+# CONFIG_CRYPTO_SEED is not set
+# CONFIG_CRYPTO_SERPENT is not set
+# CONFIG_CRYPTO_TEA is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+
+#
+# Compression
+#
+# CONFIG_CRYPTO_DEFLATE is not set
+# CONFIG_CRYPTO_ZLIB is not set
+# CONFIG_CRYPTO_LZO is not set
+# CONFIG_CRYPTO_842 is not set
+# CONFIG_CRYPTO_LZ4 is not set
+# CONFIG_CRYPTO_LZ4HC is not set
+
+#
+# Random Number Generation
+#
+# CONFIG_CRYPTO_ANSI_CPRNG is not set
+CONFIG_CRYPTO_DRBG_MENU=m
+CONFIG_CRYPTO_DRBG_HMAC=y
+CONFIG_CRYPTO_DRBG_HASH=y
+CONFIG_CRYPTO_DRBG_CTR=y
+CONFIG_CRYPTO_DRBG=m
+CONFIG_CRYPTO_JITTERENTROPY=m
+# CONFIG_CRYPTO_USER_API_HASH is not set
+# CONFIG_CRYPTO_USER_API_SKCIPHER is not set
+# CONFIG_CRYPTO_USER_API_RNG is not set
+# CONFIG_CRYPTO_USER_API_AEAD is not set
+# CONFIG_CRYPTO_HW is not set
+# CONFIG_ASYMMETRIC_KEY_TYPE is not set
+
+#
+# Certificates for signature checking
+#
+# CONFIG_SYSTEM_TRUSTED_KEYRING is not set
+# CONFIG_BINARY_PRINTF is not set
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+# CONFIG_HAVE_ARCH_BITREVERSE is not set
+CONFIG_GENERIC_STRNCPY_FROM_USER=y
+CONFIG_GENERIC_STRNLEN_USER=y
+CONFIG_GENERIC_NET_UTILS=y
+CONFIG_GENERIC_PCI_IOMAP=y
+CONFIG_GENERIC_IOMAP=y
+CONFIG_GENERIC_IO=y
+# CONFIG_CRC_CCITT is not set
+CONFIG_CRC16=y
+CONFIG_CRC_T10DIF=y
+CONFIG_CRC_ITU_T=y
+CONFIG_CRC32=y
+# CONFIG_CRC32_SELFTEST is not set
+CONFIG_CRC32_SLICEBY8=y
+# CONFIG_CRC32_SLICEBY4 is not set
+# CONFIG_CRC32_SARWATE is not set
+# CONFIG_CRC32_BIT is not set
+CONFIG_CRC7=y
+CONFIG_LIBCRC32C=m
+# CONFIG_CRC8 is not set
+# CONFIG_AUDIT_ARCH_COMPAT_GENERIC is not set
+# CONFIG_RANDOM32_SELFTEST is not set
+CONFIG_ZLIB_INFLATE=y
+# CONFIG_XZ_DEC is not set
+# CONFIG_XZ_DEC_BCJ is not set
+CONFIG_DECOMPRESS_GZIP=y
+CONFIG_ASSOCIATIVE_ARRAY=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_DMA=y
+CONFIG_DQL=y
+CONFIG_NLATTR=y
+CONFIG_GENERIC_ATOMIC64=y
+CONFIG_ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE=y
+# CONFIG_CORDIC is not set
+# CONFIG_DDR is not set
+# CONFIG_SG_SPLIT is not set
+# CONFIG_ARCH_HAS_SG_CHAIN is not set
diff -urN linux-4.4.13/arch/m68k/Kconfig.machine linux-4.4.13-t030-20161102/arch/m68k/Kconfig.machine
--- linux-4.4.13/arch/m68k/Kconfig.machine	2016-06-08 03:14:51.000000000 +0200
+++ linux-4.4.13-t030-20161102/arch/m68k/Kconfig.machine	2016-06-23 10:30:26.000000000 +0200
@@ -132,6 +132,14 @@
 
 	  If you don't want to compile a kernel exclusively for a Sun 3, say N.
 
+config T030
+    bool "T030 support"
+    depends on MMU
+    select MMU_MOTOROLA if MMU
+    select M68030
+    help
+        Support for the T030 SBC by Tobias Rathje.
+
 endif # M68KCLASSIC
 
 config PILOT
diff -urN linux-4.4.13/arch/m68k/Makefile linux-4.4.13-t030-20161102/arch/m68k/Makefile
--- linux-4.4.13/arch/m68k/Makefile	2016-06-08 03:14:51.000000000 +0200
+++ linux-4.4.13-t030-20161102/arch/m68k/Makefile	2016-06-23 13:15:30.000000000 +0200
@@ -105,6 +105,7 @@
 core-$(CONFIG_MAC)		+= arch/m68k/mac/
 core-$(CONFIG_HP300)		+= arch/m68k/hp300/
 core-$(CONFIG_APOLLO)		+= arch/m68k/apollo/
+core-$(CONFIG_T030)           += arch/m68k/t030/
 core-$(CONFIG_MVME147)		+= arch/m68k/mvme147/
 core-$(CONFIG_MVME16x)		+= arch/m68k/mvme16x/
 core-$(CONFIG_BVME6000)		+= arch/m68k/bvme6000/
diff -urN linux-4.4.13/arch/m68k/include/asm/irq.h linux-4.4.13-t030-20161102/arch/m68k/include/asm/irq.h
--- linux-4.4.13/arch/m68k/include/asm/irq.h	2016-06-08 03:14:51.000000000 +0200
+++ linux-4.4.13-t030-20161102/arch/m68k/include/asm/irq.h	2016-06-23 13:41:50.000000000 +0200
@@ -11,7 +11,7 @@
  */
 #if defined(CONFIG_COLDFIRE)
 #define NR_IRQS 256
-#elif defined(CONFIG_VME) || defined(CONFIG_SUN3) || defined(CONFIG_SUN3X)
+#elif defined(CONFIG_VME) || defined(CONFIG_SUN3) || defined(CONFIG_SUN3X) || defined(CONFIG_T030)
 #define NR_IRQS 200
 #elif defined(CONFIG_ATARI)
 #define NR_IRQS 141
diff -urN linux-4.4.13/arch/m68k/include/asm/setup.h linux-4.4.13-t030-20161102/arch/m68k/include/asm/setup.h
--- linux-4.4.13/arch/m68k/include/asm/setup.h	2016-06-08 03:14:51.000000000 +0200
+++ linux-4.4.13-t030-20161102/arch/m68k/include/asm/setup.h	2016-06-23 10:53:44.000000000 +0200
@@ -37,7 +37,8 @@
 #elif defined(CONFIG_ATARI) || defined(CONFIG_MAC) || defined(CONFIG_APOLLO) \
 	|| defined(CONFIG_MVME16x) || defined(CONFIG_BVME6000)               \
 	|| defined(CONFIG_HP300) || defined(CONFIG_Q40)                      \
-	|| defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)
+	|| defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)                  \
+	|| defined(CONFIG_T030)
 #  define MACH_IS_AMIGA (m68k_machtype == MACH_AMIGA)
 #else
 #  define MACH_AMIGA_ONLY
@@ -50,7 +51,8 @@
 #elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_APOLLO) \
 	|| defined(CONFIG_MVME16x) || defined(CONFIG_BVME6000)               \
 	|| defined(CONFIG_HP300) || defined(CONFIG_Q40)                      \
-	|| defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)
+	|| defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)                  \
+	|| defined(CONFIG_T030)
 #  define MACH_IS_ATARI (m68k_machtype == MACH_ATARI)
 #else
 #  define MACH_ATARI_ONLY
@@ -63,7 +65,8 @@
 #elif defined(CONFIG_AMIGA) || defined(CONFIG_ATARI) || defined(CONFIG_APOLLO) \
 	|| defined(CONFIG_MVME16x) || defined(CONFIG_BVME6000)                 \
 	|| defined(CONFIG_HP300) || defined(CONFIG_Q40)                        \
-	|| defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)
+	|| defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)                    \
+	|| defined(CONFIG_T030)
 #  define MACH_IS_MAC (m68k_machtype == MACH_MAC)
 #else
 #  define MACH_MAC_ONLY
@@ -84,7 +87,8 @@
 #elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \
 	|| defined(CONFIG_MVME16x) || defined(CONFIG_BVME6000)              \
 	|| defined(CONFIG_HP300) || defined(CONFIG_Q40)                     \
-	|| defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)
+	|| defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)                 \
+	|| defined(CONFIG_T030)
 #  define MACH_IS_APOLLO (m68k_machtype == MACH_APOLLO)
 #else
 #  define MACH_APOLLO_ONLY
@@ -97,7 +101,8 @@
 #elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \
 	|| defined(CONFIG_APOLLO) || defined(CONFIG_BVME6000)               \
 	|| defined(CONFIG_HP300) || defined(CONFIG_Q40)                     \
-	|| defined(CONFIG_SUN3X) || defined(CONFIG_MVME16x)
+	|| defined(CONFIG_SUN3X) || defined(CONFIG_MVME16x)                 \
+	|| defined(CONFIG_T030)
 #  define MACH_IS_MVME147 (m68k_machtype == MACH_MVME147)
 #else
 #  define MACH_MVME147_ONLY
@@ -110,7 +115,8 @@
 #elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \
 	|| defined(CONFIG_APOLLO) || defined(CONFIG_BVME6000)               \
 	|| defined(CONFIG_HP300) || defined(CONFIG_Q40)                     \
-	|| defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)
+	|| defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)                 \
+	|| defined(CONFIG_T030)
 #  define MACH_IS_MVME16x (m68k_machtype == MACH_MVME16x)
 #else
 #  define MACH_MVME16x_ONLY
@@ -123,7 +129,8 @@
 #elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \
 	|| defined(CONFIG_APOLLO) || defined(CONFIG_MVME16x)                \
 	|| defined(CONFIG_HP300) || defined(CONFIG_Q40)                     \
-	|| defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)
+	|| defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)                 \
+	|| defined(CONFIG_T030)
 #  define MACH_IS_BVME6000 (m68k_machtype == MACH_BVME6000)
 #else
 #  define MACH_BVME6000_ONLY
@@ -134,9 +141,10 @@
 #if !defined (CONFIG_HP300)
 #  define MACH_IS_HP300 (0)
 #elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \
-	|| defined(CONFIG_APOLLO) || defined(CONFIG_MVME16x) \
-	|| defined(CONFIG_BVME6000) || defined(CONFIG_Q40) \
-	|| defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)
+	|| defined(CONFIG_APOLLO) || defined(CONFIG_MVME16x)                \
+	|| defined(CONFIG_BVME6000) || defined(CONFIG_Q40)                  \
+	|| defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)                 \
+	|| defined(CONFIG_T030)
 #  define MACH_IS_HP300 (m68k_machtype == MACH_HP300)
 #else
 #  define MACH_HP300_ONLY
@@ -149,7 +157,8 @@
 #elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \
 	|| defined(CONFIG_APOLLO) || defined(CONFIG_MVME16x)                \
 	|| defined(CONFIG_BVME6000) || defined(CONFIG_HP300)                \
-	|| defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)
+	|| defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)                 \
+	|| defined(CONFIG_T030)
 #  define MACH_IS_Q40 (m68k_machtype == MACH_Q40)
 #else
 #  define MACH_Q40_ONLY
@@ -157,12 +166,27 @@
 #  define MACH_TYPE (MACH_Q40)
 #endif
 
+#if !defined (CONFIG_T030)
+#  define MACH_IS_T030 (0)
+#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \
+	|| defined(CONFIG_APOLLO) || defined(CONFIG_MVME16x)                \
+	|| defined(CONFIG_BVME6000) || defined(CONFIG_HP300)                \
+	|| defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)                 \
+	|| defined(CONFIG_Q40)
+#  define MACH_IS_T030 (m68k_machtype == MACH_T030)
+#else
+#  define MACH_T030_ONLY
+#  define MACH_IS_T030 (1)
+#  define MACH_TYPE (MACH_T030)
+#endif
+
 #if !defined (CONFIG_SUN3X)
 #  define MACH_IS_SUN3X (0)
 #elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \
 	|| defined(CONFIG_APOLLO) || defined(CONFIG_MVME16x)                \
 	|| defined(CONFIG_BVME6000) || defined(CONFIG_HP300)                \
-	|| defined(CONFIG_Q40) || defined(CONFIG_MVME147)
+	|| defined(CONFIG_Q40) || defined(CONFIG_MVME147)                   \
+	|| defined(CONFIG_T030)
 #  define MACH_IS_SUN3X (m68k_machtype == MACH_SUN3X)
 #else
 #  define CONFIG_SUN3X_ONLY
diff -urN linux-4.4.13/arch/m68k/include/asm/t030hw.h linux-4.4.13-t030-20161102/arch/m68k/include/asm/t030hw.h
--- linux-4.4.13/arch/m68k/include/asm/t030hw.h	1970-01-01 01:00:00.000000000 +0100
+++ linux-4.4.13-t030-20161102/arch/m68k/include/asm/t030hw.h	2016-08-22 10:22:53.000000000 +0200
@@ -0,0 +1,43 @@
+#ifndef _M68K_T030HW_H
+#define _M68K_T030HW_H
+
+/*
+ * arch/m68k/include/asm/t030hw.h
+ * 
+ * (c) 2016 Tobias Rathje
+ *
+ */
+
+#include <asm/bootinfo-t030.h>
+
+#define T030_MFP_BASE   0xFE100000
+#define T030_MFP_GPDR   (T030_MFP_BASE + 0x0)   /* GPIO data register */
+#define T030_MFP_AER    (T030_MFP_BASE + 0x1)   /* active edge register */
+#define T030_MFP_DDR    (T030_MFP_BASE + 0x2)   /* data direction register */
+#define T030_MFP_IERA   (T030_MFP_BASE + 0x3)   /* interrupt enable register A */
+#define T030_MFP_IERB   (T030_MFP_BASE + 0x4)   /* interrupt enable register B */
+#define T030_MFP_IPRA   (T030_MFP_BASE + 0x5)   /* interrupt pending register A */
+#define T030_MFP IPRB   (T030_MFP_BASE + 0x6)   /* interrupt pending register B */
+#define T030_MFP_ISRA   (T030_MFP_BASE + 0x7)   /* interrupt in service register A */
+#define T030_MFP_ISRB   (T030_MFP_BASE + 0x8)   /* interrupt in service register B */
+#define T030_MFP_IMRA   (T030_MFP_BASE + 0x9)   /* interrupt mask register A */
+#define T030_MFP_IMRB   (T030_MFP_BASE + 0xa)   /* interrupt mask register B */
+#define T030_MFP_VR     (T030_MFP_BASE + 0xb)   /* vector register */
+#define T030_MFP_TACR   (T030_MFP_BASE + 0xc)   /* timer A control register */
+#define T030_MFP_TBCR   (T030_MFP_BASE + 0xd)   /* timer B control register */
+#define T030_MFP_TCDCR  (T030_MFP_BASE + 0xe)   /* timer C/D control register */
+#define T030_MFP_TADR   (T030_MFP_BASE + 0xf)   /* timer A data register */
+#define T030_MFP_TBDR   (T030_MFP_BASE + 0x10)  /* timer B data register */
+#define T030_MFP_TCDR   (T030_MFP_BASE + 0x11)  /* timer C data register */
+#define T030_MFP_TDDR   (T030_MFP_BASE + 0x12)  /* timer D data register */
+#define T030_MFP_SCR    (T030_MFP_BASE + 0x13)  /* synchronous character register */
+#define T030_MFP_UCR    (T030_MFP_BASE + 0x14)  /* USART control register */
+#define T030_MFP_RSR    (T030_MFP_BASE + 0x15)  /* receiver status register */
+#define T030_MFP_TSR    (T030_MFP_BASE + 0x16)  /* transmitter status register */
+#define T030_MFP_UDR    (T030_MFP_BASE + 0x17)  /* USART data register */
+
+#define T030_SPI_BASE   0xFE180000
+
+#define T030_REG(x) *((volatile unsigned char*)x)
+
+#endif /* _M68K_T030HW_H */
diff -urN linux-4.4.13/arch/m68k/include/uapi/asm/bootinfo-t030.h linux-4.4.13-t030-20161102/arch/m68k/include/uapi/asm/bootinfo-t030.h
--- linux-4.4.13/arch/m68k/include/uapi/asm/bootinfo-t030.h	1970-01-01 01:00:00.000000000 +0100
+++ linux-4.4.13-t030-20161102/arch/m68k/include/uapi/asm/bootinfo-t030.h	2016-06-23 10:28:22.000000000 +0200
@@ -0,0 +1,12 @@
+/*
+** asm/bootinfo-t030.h -- T030-specific boot information definitions
+*/
+
+#ifndef _UAPI_ASM_M68K_BOOTINFO_T030_H
+#define _UAPI_ASM_M68K_BOOTINFO_T030_H
+
+/* Latest bootinfo version */
+
+#define T030_BOOTI_VERSION    MK_BI_VERSION(2, 0)
+
+#endif /* _UAPI_ASM_M68K_BOOTINFO_T030_H */
diff -urN linux-4.4.13/arch/m68k/include/uapi/asm/bootinfo.h linux-4.4.13-t030-20161102/arch/m68k/include/uapi/asm/bootinfo.h
--- linux-4.4.13/arch/m68k/include/uapi/asm/bootinfo.h	2016-06-08 03:14:51.000000000 +0200
+++ linux-4.4.13-t030-20161102/arch/m68k/include/uapi/asm/bootinfo.h	2016-06-23 10:56:45.000000000 +0200
@@ -81,6 +81,7 @@
 #define MACH_Q40		10
 #define MACH_SUN3X		11
 #define MACH_M54XX		12
+#define MACH_T030		13
 
 
     /*
diff -urN linux-4.4.13/arch/m68k/kernel/Makefile linux-4.4.13-t030-20161102/arch/m68k/kernel/Makefile
--- linux-4.4.13/arch/m68k/kernel/Makefile	2016-06-08 03:14:51.000000000 +0200
+++ linux-4.4.13-t030-20161102/arch/m68k/kernel/Makefile	2016-06-23 10:48:09.000000000 +0200
@@ -9,6 +9,7 @@
 extra-$(CONFIG_VME)	:= head.o
 extra-$(CONFIG_HP300)	:= head.o
 extra-$(CONFIG_Q40)	:= head.o
+extra-$(CONFIG_T030)    := head.o
 extra-$(CONFIG_SUN3X)	:= head.o
 extra-$(CONFIG_SUN3)	:= sun3-head.o
 extra-y			+= vmlinux.lds
diff -urN linux-4.4.13/arch/m68k/kernel/head.S linux-4.4.13-t030-20161102/arch/m68k/kernel/head.S
--- linux-4.4.13/arch/m68k/kernel/head.S	2016-06-08 03:14:51.000000000 +0200
+++ linux-4.4.13-t030-20161102/arch/m68k/kernel/head.S	2016-06-23 10:19:06.000000000 +0200
@@ -261,6 +261,7 @@
 #include <asm/bootinfo-hp300.h>
 #include <asm/bootinfo-mac.h>
 #include <asm/bootinfo-q40.h>
+#include <asm/bootinfo-t030.h>
 #include <asm/bootinfo-vme.h>
 #include <asm/setup.h>
 #include <asm/entry.h>
@@ -270,6 +271,9 @@
 #ifdef CONFIG_MAC
 #  include <asm/machw.h>
 #endif
+#ifdef CONFIG_T030
+#   include <asm/t030hw.h>
+#endif
 
 #ifdef CONFIG_EARLY_PRINTK
 #  define SERIAL_DEBUG
@@ -534,6 +538,7 @@
 #define is_not_apollo(lab) cmpl &MACH_APOLLO,%pc@(m68k_machtype); jne lab
 #define is_not_q40(lab) cmpl &MACH_Q40,%pc@(m68k_machtype); jne lab
 #define is_not_sun3x(lab) cmpl &MACH_SUN3X,%pc@(m68k_machtype); jne lab
+#define is_not_t030(lab) cmpl &MACH_T030,%pc@(m68k_machtype); jne lab
 
 #define hasnt_leds(lab) cmpl &MACH_HP300,%pc@(m68k_machtype); \
 			jeq 42f; \
@@ -579,6 +584,7 @@
 	.long	MACH_MAC, MAC_BOOTI_VERSION
 	.long	MACH_Q40, Q40_BOOTI_VERSION
 	.long	MACH_HP300, HP300_BOOTI_VERSION
+	.long	MACH_T030, T030_BOOTI_VERSION
 	.long	0
 1:	jra	__start
 
@@ -616,6 +622,11 @@
 
 	leds	0x1
 
+#ifdef CONFIG_T030
+    /* Turn on yellow LED */
+    bset #1,T030_MFP_GPDR
+#endif
+
 #ifdef CONFIG_MAC
 /*
  * For Macintosh, we need to determine the display parameters early (at least
@@ -1237,6 +1248,19 @@
 L(notsun3x):
 #endif
 
+#ifdef CONFIG_T030
+    is_not_t030(L(nott030))
+
+    putc    'T'
+
+    /* Map IO range transparent */
+    mmu_map_tt  #1,#0xFE000000,#0x01000000,#_PAGE_NOCACHE030    
+
+    jbra    L(mmu_init_done)
+          
+ L(nott030):
+#endif
+
 #ifdef CONFIG_APOLLO
 	is_not_apollo(L(notapollo))
 
@@ -2977,6 +3001,10 @@
 /* We count on the boot loader initialising the UART */
 #endif
 
+#ifdef CONFIG_T030
+/* We count on the boot loader initialising the UART */
+#endif
+
 L(serial_init_done):
 func_return	serial_init
 
@@ -3131,6 +3159,15 @@
 2:
 #endif
 
+#ifdef CONFIG_T030
+    is_not_t030(2f)
+1:  btst    #7,T030_MFP_TSR
+    beq.s   1b
+    moveb   %d0,T030_MFP_UDR
+    jbra    L(serial_putc_done)
+2:
+#endif
+
 #ifdef CONFIG_SUN3X
 	is_not_sun3x(2f)
 	movel	%d0,-(%sp)
diff -urN linux-4.4.13/arch/m68k/kernel/setup_mm.c linux-4.4.13-t030-20161102/arch/m68k/kernel/setup_mm.c
--- linux-4.4.13/arch/m68k/kernel/setup_mm.c	2016-06-08 03:14:51.000000000 +0200
+++ linux-4.4.13-t030-20161102/arch/m68k/kernel/setup_mm.c	2016-06-23 10:47:15.000000000 +0200
@@ -125,6 +125,7 @@
 extern int mvme147_parse_bootinfo(const struct bi_record *);
 extern int hp300_parse_bootinfo(const struct bi_record *);
 extern int apollo_parse_bootinfo(const struct bi_record *);
+extern int t030_parse_bootinfo(const struct bi_record *);
 
 extern void config_amiga(void);
 extern void config_atari(void);
@@ -137,6 +138,7 @@
 extern void config_hp300(void);
 extern void config_q40(void);
 extern void config_sun3x(void);
+extern void config_t030(void);
 
 #define MASK_256K 0xfffc0000
 
@@ -206,6 +208,8 @@
 				unknown = hp300_parse_bootinfo(record);
 			else if (MACH_IS_APOLLO)
 				unknown = apollo_parse_bootinfo(record);
+            else if (MACH_IS_T030)
+				unknown = t030_parse_bootinfo(record);
 			else
 				unknown = 1;
 		}
@@ -334,6 +338,11 @@
 		config_q40();
 		break;
 #endif
+#ifdef CONFIG_T030
+	case MACH_T030:
+		config_t030();
+		break;
+#endif
 #ifdef CONFIG_SUN3X
 	case MACH_SUN3X:
 		config_sun3x();
diff -urN linux-4.4.13/arch/m68k/kernel/vmlinux.lds linux-4.4.13-t030-20161102/arch/m68k/kernel/vmlinux.lds
--- linux-4.4.13/arch/m68k/kernel/vmlinux.lds	1970-01-01 01:00:00.000000000 +0100
+++ linux-4.4.13-t030-20161102/arch/m68k/kernel/vmlinux.lds	2016-09-13 13:15:41.000000000 +0200
@@ -0,0 +1,393 @@
+/*
+ *
+ * Automatically generated file; DO NOT EDIT.
+ * Linux/m68k 4.4.13 Kernel Configuration
+ *
+ */
+/*
+ * Helper macros to use CONFIG_ options in C/CPP expressions. Note that
+ * these only work with boolean and tristate options.
+ */
+/*
+ * Getting something that works in C and CPP for an arg that may or may
+ * not be defined is tricky.  Here, if we have "#define CONFIG_BOOGER 1"
+ * we match on the placeholder define, insert the "0," for arg1 and generate
+ * the triplet (0, 1, 0).  Then the last step cherry picks the 2nd arg (a one).
+ * When CONFIG_BOOGER is not defined, we generate a (... 1, 0) pair, and when
+ * the last step cherry picks the 2nd arg, we get a zero.
+ */
+/*
+ * IS_BUILTIN(CONFIG_FOO) evaluates to 1 if CONFIG_FOO is set to 'y', 0
+ * otherwise. For boolean options, this is equivalent to
+ * IS_ENABLED(CONFIG_FOO).
+ */
+/*
+ * IS_MODULE(CONFIG_FOO) evaluates to 1 if CONFIG_FOO is set to 'm', 0
+ * otherwise.
+ */
+/*
+ * IS_REACHABLE(CONFIG_FOO) evaluates to 1 if the currently compiled
+ * code can call a function defined in code compiled based on CONFIG_FOO.
+ * This is similar to IS_ENABLED(), but returns false when invoked from
+ * built-in code when CONFIG_FOO is set to 'm'.
+ */
+/*
+ * IS_ENABLED(CONFIG_FOO) evaluates to 1 if CONFIG_FOO is set to 'y' or 'm',
+ * 0 otherwise.
+ */
+PHDRS
+{
+  text PT_LOAD FILEHDR PHDRS FLAGS (7);
+  data PT_LOAD FLAGS (7);
+}
+/* ld script to make m68k Linux kernel */
+/*
+ * Helper macros to support writing architecture specific
+ * linker scripts.
+ *
+ * A minimal linker scripts has following content:
+ * [This is a sample, architectures may have special requiriements]
+ *
+ * OUTPUT_FORMAT(...)
+ * OUTPUT_ARCH(...)
+ * ENTRY(...)
+ * SECTIONS
+ * {
+ *	. = START;
+ *	__init_begin = .;
+ *	HEAD_TEXT_SECTION
+ *	INIT_TEXT_SECTION(PAGE_SIZE)
+ *	INIT_DATA_SECTION(...)
+ *	PERCPU_SECTION(CACHELINE_SIZE)
+ *	__init_end = .;
+ *
+ *	_stext = .;
+ *	TEXT_SECTION = 0
+ *	_etext = .;
+ *
+ *      _sdata = .;
+ *	RO_DATA_SECTION(PAGE_SIZE)
+ *	RW_DATA_SECTION(...)
+ *	_edata = .;
+ *
+ *	EXCEPTION_TABLE(...)
+ *	NOTES
+ *
+ *	BSS_SECTION(0, 0, 0)
+ *	_end = .;
+ *
+ *	STABS_DEBUG
+ *	DWARF_DEBUG
+ *
+ *	DISCARDS		// must be the last
+ * }
+ *
+ * [__init_begin, __init_end] is the init section that may be freed after init
+ * 	// __init_begin and __init_end should be page aligned, so that we can
+ *	// free the whole .init memory
+ * [_stext, _etext] is the text section
+ * [_sdata, _edata] is the data section
+ *
+ * Some of the included output section have their own set of constants.
+ * Examples are: [__initramfs_start, __initramfs_end] for initramfs and
+ *               [__nosave_begin, __nosave_end] for the nosave data
+ */
+/*
+ * Export symbols from the kernel to modules.  Forked from module.h
+ * to reduce the amount of pointless cruft we feed to gcc when only
+ * exporting a simple symbol or two.
+ *
+ * Try not to add #includes here.  It slows compilation and makes kernel
+ * hackers place grumpy comments in header files.
+ */
+/* Some toolchains use a `_' prefix for all user symbols. */
+/* Indirect, so macros are expanded before pasting. */
+/* Align . to a 8 byte boundary equals to maximum function alignment. */
+/*
+ * Align to a 32 byte boundary equal to the
+ * alignment gcc 4.5 uses for a struct
+ */
+/* The actual configuration determine if the init/exit sections
+ * are handled as text/data or they can be discarded (which
+ * often happens at runtime)
+ */
+/* .data section */
+/*
+ * Data section helpers
+ */
+/*
+ * Read only Data
+ */
+/* RODATA & RO_DATA provided for backward compatibility.
+ * All archs are supposed to use RO_DATA() */
+/* .text section. Map to function alignment to avoid address changes
+ * during second ld run in second ld pass when generating System.map */
+/* sched.text is aling to function alignment to secure we have same
+ * address even at second ld pass when generating System.map */
+/* spinlock.text is aling to function alignment to secure we have same
+ * address even at second ld pass when generating System.map */
+/* Section used for early init (in .S files) */
+/*
+ * Exception table
+ */
+/*
+ * Init task
+ */
+/* init and exit section handling */
+/*
+ * bss (Block Started by Symbol) - uninitialized data
+ * zeroed during startup
+ */
+/*
+ * Allow archectures to redefine BSS_FIRST_SECTIONS to add extra
+ * sections to the front of bss.
+ */
+/*
+ * DWARF debug sections.
+ * Symbols in the DWARF debugging sections are relative to
+ * the beginning of the section so we begin them at 0.
+ */
+  /* Stabs debugging sections.  */
+/*
+ * Default discarded sections.
+ *
+ * Some archs want to discard exit text/data at runtime rather than
+ * link time due to cross-section references such as alt instructions,
+ * bug table, eh_frame, etc.  DISCARDS must be the last of output
+ * section definitions so that such archs put those in earlier section
+ * definitions.
+ */
+/**
+ * PERCPU_INPUT - the percpu input sections
+ * @cacheline: cacheline size
+ *
+ * The core percpu section names and core symbols which do not rely
+ * directly upon load addresses.
+ *
+ * @cacheline is used to align subsections to avoid false cacheline
+ * sharing between subsections for different purposes.
+ */
+/**
+ * PERCPU_VADDR - define output section for percpu area
+ * @cacheline: cacheline size
+ * @vaddr: explicit base address (optional)
+ * @phdr: destination PHDR (optional)
+ *
+ * Macro which expands to output section for percpu area.
+ *
+ * @cacheline is used to align subsections to avoid false cacheline
+ * sharing between subsections for different purposes.
+ *
+ * If @vaddr is not blank, it specifies explicit base address and all
+ * percpu symbols will be offset from the given address.  If blank,
+ * @vaddr always equals @laddr + LOAD_OFFSET.
+ *
+ * @phdr defines the output PHDR to use if not blank.  Be warned that
+ * output PHDR is sticky.  If @phdr is specified, the next output
+ * section in the linker script will go there too.  @phdr should have
+ * a leading colon.
+ *
+ * Note that this macros defines __per_cpu_load as an absolute symbol.
+ * If there is no need to put the percpu section at a predetermined
+ * address, use PERCPU_SECTION.
+ */
+/**
+ * PERCPU_SECTION - define output section for percpu area, simple version
+ * @cacheline: cacheline size
+ *
+ * Align to PAGE_SIZE and outputs output section for percpu area.  This
+ * macro doesn't manipulate @vaddr or @phdr and __per_cpu_load and
+ * __per_cpu_start will be identical.
+ *
+ * This macro is equivalent to ALIGN(PAGE_SIZE); PERCPU_VADDR(@cacheline,,)
+ * except that __per_cpu_load is defined as a relative symbol against
+ * .data..percpu which is required for relocatable x86_32 configuration.
+ */
+/*
+ * Definition of the high level *_SECTION macros
+ * They will fit only a subset of the architectures
+ */
+/*
+ * Writeable data.
+ * All sections are combined in a single .data section.
+ * The sections following CONSTRUCTORS are arranged so their
+ * typical alignment matches.
+ * A cacheline is typical/always less than a PAGE_SIZE so
+ * the sections that has this restriction (or similar)
+ * is located before the ones requiring PAGE_SIZE alignment.
+ * NOSAVE_DATA starts and ends with a PAGE_SIZE alignment which
+ * matches the requirement of PAGE_ALIGNED_DATA.
+ *
+ * use 0 as page_align if page_aligned data is not used */
+/* const.h: Macros for dealing with constants.  */
+/* Some constant macros are used in both assembler and
+ * C code.  Therefore we cannot annotate them always with
+ * 'UL' and other type specifiers unilaterally.  We
+ * use the following macros to deal with this.
+ *
+ * Similarly, _AT() will cast an expression with a type in C, but
+ * leave it unchanged in asm.
+ */
+/*
+** asm/setup.h -- Definition of the Linux/m68k setup information
+**
+** Copyright 1992 by Greg Harp
+**
+** This file is subject to the terms and conditions of the GNU General Public
+** License.  See the file COPYING in the main directory of this archive
+** for more details.
+**
+** Created 09/29/92 by Greg Harp
+**
+** 5/2/94 Roman Hodek:
+**   Added bi_atari part of the machine dependent union bi_un; for now it
+**   contains just a model field to distinguish between TT and Falcon.
+** 26/7/96 Roman Zippel:
+**   Renamed to setup.h; added some useful macros to allow gcc some
+**   optimizations if possible.
+** 5/10/96 Geert Uytterhoeven:
+**   Redesign of the boot information structure; moved boot information
+**   structure to bootinfo.h
+*/
+/*
+ * asm/bootinfo.h -- Definition of the Linux/m68k boot information structure
+ *
+ * Copyright 1992 by Greg Harp
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file COPYING in the main directory of this archive
+ * for more details.
+ */
+/*
+ * int-ll64 is used everywhere now.
+ */
+/*
+ * asm-generic/int-ll64.h
+ *
+ * Integer declarations for architectures which use "long long"
+ * for 64-bit types.
+ */
+/*
+ * asm-generic/int-ll64.h
+ *
+ * Integer declarations for architectures which use "long long"
+ * for 64-bit types.
+ */
+/*
+ * There seems to be no way of detecting this automatically from user
+ * space, so 64 bit architectures should override this in their
+ * bitsperlong.h. In particular, an architecture that supports
+ * both 32 and 64 bit user space must not rely on CONFIG_64BIT
+ * to decide it, but rather check a compiler provided macro.
+ */
+/*
+ * FIXME: The check currently breaks x86-64 build, so it's
+ * temporarily disabled. Please fix x86-64 and reenable
+ */
+    /*
+     *  Tag Definitions
+     *
+     *  Machine independent tags start counting from 0x0000
+     *  Machine dependent tags start counting from 0x8000
+     */
+     /* (struct mem_info) */
+     /* (struct mem_info) */
+     /* (string) */
+    /*
+     *  Linux/m68k Architectures (BI_MACHTYPE)
+     */
+    /*
+     *  CPU, FPU and MMU types (BI_CPUTYPE, BI_FPUTYPE, BI_MMUTYPE)
+     *
+     *  Note: we may rely on the following equalities:
+     *
+     *      CPU_68020 == MMU_68851
+     *      CPU_68030 == MMU_68030
+     *      CPU_68040 == FPU_68040 == MMU_68040
+     *      CPU_68060 == FPU_68060 == MMU_68060
+     */
+    /*
+     * Stuff for bootinfo interface versioning
+     *
+     * At the start of kernel code, a 'struct bootversion' is located.
+     * bootstrap checks for a matching version of the interface before booting
+     * a kernel, to avoid user confusion if kernel and bootstrap don't work
+     * together :-)
+     *
+     * If incompatible changes are made to the bootinfo interface, the major
+     * number below should be stepped (and the minor reset to 0) for the
+     * appropriate machine. If a change is backward-compatible, the minor
+     * should be stepped. "Backwards-compatible" means that booting will work,
+     * but certain features may not.
+     */
+/*
+** asm/setup.h -- Definition of the Linux/m68k setup information
+**
+** Copyright 1992 by Greg Harp
+**
+** This file is subject to the terms and conditions of the GNU General Public
+** License.  See the file COPYING in the main directory of this archive
+** for more details.
+*/
+    /*
+     *  Miscellaneous
+     */
+/* This handles the memory map.. */
+/* PAGE_SHIFT determines the page size */
+/* define constants */
+/* Address spaces (FC0-FC2) */
+/*
+ * On machines with 4k pages we default to an 8k thread size, though we
+ * allow a 4k with config option. Any other machine page size then
+ * the thread size must match the page size (which is 8k and larger here).
+ */
+/* entry.S relies on these definitions!
+ * bits 0-7 are tested at every exception exit
+ * bits 8-15 are also tested at syscall exit
+ */
+OUTPUT_FORMAT("elf32-m68k", "elf32-m68k", "elf32-m68k")
+OUTPUT_ARCH(m68k)
+ENTRY(_start)
+jiffies = jiffies_64 + 4;
+SECTIONS
+{
+  . = 0x1000;
+  _text = .; /* Text and read-only data */
+  .text : {
+ *(.head.text)
+ . = ALIGN(8); *(.text.hot .text .text.fixup .text.unlikely) *(.ref.text)
+ . = ALIGN(8); __sched_text_start = .; *(.sched.text) __sched_text_end = .;
+ . = ALIGN(8); __lock_text_start = .; *(.spinlock.text) __lock_text_end = .;
+ *(.fixup)
+ *(.gnu.warning)
+ } :text = 0x4e75
+  _etext = .; /* End of text section */
+  . = ALIGN(16); __ex_table : AT(ADDR(__ex_table) - 0) { __start___ex_table = .; *(__ex_table) __stop___ex_table = .; }
+  _sdata = .; /* Start of data section */
+  . = ALIGN((4096)); .rodata : AT(ADDR(.rodata) - 0) { __start_rodata = .; *(.rodata) *(.rodata.*) *(__vermagic) . = ALIGN(8); __start___tracepoints_ptrs = .; *(__tracepoints_ptrs) __stop___tracepoints_ptrs = .; *(__tracepoints_strings) } .rodata1 : AT(ADDR(.rodata1) - 0) { *(.rodata1) } .pci_fixup : AT(ADDR(.pci_fixup) - 0) { __start_pci_fixups_early = .; *(.pci_fixup_early) __end_pci_fixups_early = .; __start_pci_fixups_header = .; *(.pci_fixup_header) __end_pci_fixups_header = .; __start_pci_fixups_final = .; *(.pci_fixup_final) __end_pci_fixups_final = .; __start_pci_fixups_enable = .; *(.pci_fixup_enable) __end_pci_fixups_enable = .; __start_pci_fixups_resume = .; *(.pci_fixup_resume) __end_pci_fixups_resume = .; __start_pci_fixups_resume_early = .; *(.pci_fixup_resume_early) __end_pci_fixups_resume_early = .; __start_pci_fixups_suspend = .; *(.pci_fixup_suspend) __end_pci_fixups_suspend = .; __start_pci_fixups_suspend_late = .; *(.pci_fixup_suspend_late) __end_pci_fixups_suspend_late = .; } .builtin_fw : AT(ADDR(.builtin_fw) - 0) { __start_builtin_fw = .; *(.builtin_fw) __end_builtin_fw = .; } __ksymtab : AT(ADDR(__ksymtab) - 0) { __start___ksymtab = .; *(SORT(___ksymtab+*)) __stop___ksymtab = .; } __ksymtab_gpl : AT(ADDR(__ksymtab_gpl) - 0) { __start___ksymtab_gpl = .; *(SORT(___ksymtab_gpl+*)) __stop___ksymtab_gpl = .; } __ksymtab_unused : AT(ADDR(__ksymtab_unused) - 0) { __start___ksymtab_unused = .; *(SORT(___ksymtab_unused+*)) __stop___ksymtab_unused = .; } __ksymtab_unused_gpl : AT(ADDR(__ksymtab_unused_gpl) - 0) { __start___ksymtab_unused_gpl = .; *(SORT(___ksymtab_unused_gpl+*)) __stop___ksymtab_unused_gpl = .; } __ksymtab_gpl_future : AT(ADDR(__ksymtab_gpl_future) - 0) { __start___ksymtab_gpl_future = .; *(SORT(___ksymtab_gpl_future+*)) __stop___ksymtab_gpl_future = .; } __kcrctab : AT(ADDR(__kcrctab) - 0) { __start___kcrctab = .; *(SORT(___kcrctab+*)) __stop___kcrctab = .; } __kcrctab_gpl : AT(ADDR(__kcrctab_gpl) - 0) { __start___kcrctab_gpl = .; *(SORT(___kcrctab_gpl+*)) __stop___kcrctab_gpl = .; } __kcrctab_unused : AT(ADDR(__kcrctab_unused) - 0) { __start___kcrctab_unused = .; *(SORT(___kcrctab_unused+*)) __stop___kcrctab_unused = .; } __kcrctab_unused_gpl : AT(ADDR(__kcrctab_unused_gpl) - 0) { __start___kcrctab_unused_gpl = .; *(SORT(___kcrctab_unused_gpl+*)) __stop___kcrctab_unused_gpl = .; } __kcrctab_gpl_future : AT(ADDR(__kcrctab_gpl_future) - 0) { __start___kcrctab_gpl_future = .; *(SORT(___kcrctab_gpl_future+*)) __stop___kcrctab_gpl_future = .; } __ksymtab_strings : AT(ADDR(__ksymtab_strings) - 0) { *(__ksymtab_strings) } __init_rodata : AT(ADDR(__init_rodata) - 0) { *(.ref.rodata) } __param : AT(ADDR(__param) - 0) { __start___param = .; *(__param) __stop___param = .; } __modver : AT(ADDR(__modver) - 0) { __start___modver = .; *(__modver) __stop___modver = .; . = ALIGN((4096)); __end_rodata = .; } . = ALIGN((4096));
+  . = ALIGN((1 << 12)); .data : AT(ADDR(.data) - 0) { . = ALIGN(8192); *(.data..init_task) . = ALIGN((1 << 12)); __nosave_begin = .; *(.data..nosave) . = ALIGN((1 << 12)); __nosave_end = .; . = ALIGN((1 << 12)); *(.data..page_aligned) . = ALIGN(16); *(.data..cacheline_aligned) . = ALIGN(16); *(.data..read_mostly) . = ALIGN(16); *(.data) *(.ref.data) *(.data..shared_aligned) *(.data.unlikely) . = ALIGN(32); *(__tracepoints) . = ALIGN(8); __start___jump_table = .; *(__jump_table) __stop___jump_table = .; . = ALIGN(8); __start___verbose = .; *(__verbose) __stop___verbose = .; CONSTRUCTORS }
+  . = ALIGN(0); __bss_start = .; . = ALIGN(0); .sbss : AT(ADDR(.sbss) - 0) { *(.sbss) *(.scommon) } . = ALIGN(0); .bss : AT(ADDR(.bss) - 0) { *(.bss..page_aligned) *(.dynbss) *(.bss) *(COMMON) } . = ALIGN(0); __bss_stop = .;
+  _edata = .; /* End of data section */
+  /* will be freed after init */
+  . = ALIGN((1 << 12)); /* Init code and data */
+  __init_begin = .;
+  . = ALIGN((1 << 12)); .init.text : AT(ADDR(.init.text) - 0) { _sinittext = .; *(.init.text) *(.meminit.text) _einittext = .; } :data
+  .init.data : AT(ADDR(.init.data) - 0) { *(.init.data) *(.meminit.data) *(.init.rodata) *(.meminit.rodata) . = ALIGN(32); __dtb_start = .; *(.dtb.init.rodata) __dtb_end = .; . = ALIGN(16); __setup_start = .; *(.init.setup) __setup_end = .; __initcall_start = .; *(.initcallearly.init) __initcall0_start = .; *(.initcall0.init) *(.initcall0s.init) __initcall1_start = .; *(.initcall1.init) *(.initcall1s.init) __initcall2_start = .; *(.initcall2.init) *(.initcall2s.init) __initcall3_start = .; *(.initcall3.init) *(.initcall3s.init) __initcall4_start = .; *(.initcall4.init) *(.initcall4s.init) __initcall5_start = .; *(.initcall5.init) *(.initcall5s.init) __initcallrootfs_start = .; *(.initcallrootfs.init) *(.initcallrootfss.init) __initcall6_start = .; *(.initcall6.init) *(.initcall6s.init) __initcall7_start = .; *(.initcall7.init) *(.initcall7s.init) __initcall_end = .; __con_initcall_start = .; *(.con_initcall.init) __con_initcall_end = .; __security_initcall_start = .; *(.security_initcall.init) __security_initcall_end = .; . = ALIGN(4); __initramfs_start = .; *(.init.ramfs) . = ALIGN(8); *(.init.ramfs.info) }
+  .m68k_fixup : {
+ __start_fixup = .;
+ *(.m68k_fixup)
+ __stop_fixup = .;
+  }
+  .notes : AT(ADDR(.notes) - 0) { __start_notes = .; *(.note.*) __stop_notes = .; }
+  .init_end : {
+ /* This ALIGN be in a section so that _end is at the end of the
+	   load segment. */
+ . = ALIGN((1 << 12));
+ __init_end = .;
+  }
+  _end = . ;
+  .stab 0 : { *(.stab) } .stabstr 0 : { *(.stabstr) } .stab.excl 0 : { *(.stab.excl) } .stab.exclstr 0 : { *(.stab.exclstr) } .stab.index 0 : { *(.stab.index) } .stab.indexstr 0 : { *(.stab.indexstr) } .comment 0 : { *(.comment) }
+  .comment 0 : { *(.comment) }
+  /* Sections to be discarded */
+  /DISCARD/ : { *(.exit.text) *(.memexit.text) *(.exit.data) *(.memexit.data) *(.memexit.rodata) *(.exitcall.exit) *(.discard) *(.discard.*) }
+}
diff -urN linux-4.4.13/arch/m68k/t030/Makefile linux-4.4.13-t030-20161102/arch/m68k/t030/Makefile
--- linux-4.4.13/arch/m68k/t030/Makefile	1970-01-01 01:00:00.000000000 +0100
+++ linux-4.4.13-t030-20161102/arch/m68k/t030/Makefile	2016-05-31 14:55:16.000000000 +0200
@@ -0,0 +1,5 @@
+#
+# Makefile for Linux arch/m68k/t030 source directory
+#
+
+obj-y		:= config.o ints.o
diff -urN linux-4.4.13/arch/m68k/t030/config.c linux-4.4.13-t030-20161102/arch/m68k/t030/config.c
--- linux-4.4.13/arch/m68k/t030/config.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-4.4.13-t030-20161102/arch/m68k/t030/config.c	2016-11-02 10:46:56.000000000 +0100
@@ -0,0 +1,204 @@
+/*
+ *  arch/m68k/t030/config.c
+ *
+ *  (c) 2016 Tobias Rathje
+ *
+ * Based on arch/m68k/kiss68030/config.c, which is:
+ * Copyright (C) 2015 William R Sowerbutts
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file README.legal in the main directory of this archive
+ * for more details.
+ */
+
+#include <linux/console.h>
+#include <asm/bootinfo.h>
+#include <asm/machdep.h>
+#include <asm/t030hw.h>
+#include <linux/platform_device.h>
+#include <linux/spi/spi.h>
+
+extern void __init t030_init_IRQ(void);
+
+/*
+ * UART resources
+ */
+static struct resource uart_res[] = {
+    {
+        .start          = T030_MFP_BASE,
+        .end            = T030_MFP_BASE + 31,
+        .flags          = IORESOURCE_MEM,
+    },
+    {
+        .start          = IRQ_USER + 12,
+        .end            = IRQ_USER + 12,
+        .flags          = IORESOURCE_IRQ,
+    }
+};
+
+/*
+ * UART device
+ */
+static struct platform_device t030_uart_device = {
+    .name               = "mc68901-serial",
+    .id                 = 0,
+    .num_resources      = ARRAY_SIZE(uart_res),
+    .resource           = uart_res,
+};
+
+/*
+ * SPI master resources
+ */
+static struct resource spi_master_res[] = {
+    {
+        .start          = T030_SPI_BASE,
+        .end            = T030_SPI_BASE + 15,
+        .flags          = IORESOURCE_MEM,
+    },
+    /*
+    {
+        .start          = IRQ_USER + 14,
+        .end            = IRQ_USER + 14,
+        .flags          = IORESOURCE_IRQ,
+    }
+    */
+};    
+
+/*
+ * SPI master device
+ */
+static struct platform_device t030_spi_master_device = {
+    .name               = "spi_tp3465",
+    .id                 = 0,
+    .num_resources      = ARRAY_SIZE(spi_master_res),
+    .resource           = spi_master_res,
+};
+
+/*
+ * LED resources
+ */
+static struct resource led_res[] = {
+    {   
+        .start          = T030_MFP_BASE,
+        .end            = T030_MFP_BASE,
+        .flags          = IORESOURCE_MEM,
+    }
+};
+
+/*
+ * LED device
+ */
+static struct platform_device t030_led_device = {
+    .name               = "t030-leds",
+    .id                 = 0,
+    .num_resources      = ARRAY_SIZE(led_res),
+    .resource           = led_res,
+};
+
+/*
+ * SD card SPI node
+ */
+static struct spi_board_info mmc_spi_info[] = {
+    {
+      .modalias         = "mmc_spi",
+      .mode             = SPI_MODE_0,
+      .max_speed_hz     = 3125000,
+      .chip_select      = 0,   
+    },
+}; 
+
+/*
+ * Ethernet SPI node
+ */
+static struct spi_board_info enc28j60_spi_info[] = {
+    {
+      .modalias         = "enc28j60",
+      .mode             = SPI_MODE_0,
+      .irq              = IRQ_USER + 15,
+      .max_speed_hz     = 3125000,
+      .chip_select      = 1,   
+    },
+}; 
+
+#ifdef CONFIG_EARLY_PRINTK
+/* Early UART debug console */
+static volatile unsigned char *const MFPTSR = (volatile unsigned char *)(T030_MFP_TSR);
+static volatile unsigned char *const MFPUDR = (volatile unsigned char *)(T030_MFP_UDR);
+
+static void t030_serial_putc(const char c)
+{
+	while(!(*MFPTSR & 0x80));
+	*MFPUDR = c;
+}
+
+static void t030_console_write(struct console *co, const char *s, unsigned int count)
+{
+	while(count--){
+		if(*s == '\n')
+			t030_serial_putc('\r');
+		t030_serial_putc(*s++);
+	}
+}
+
+static struct console t030_console_driver = {
+	.name   = "t030serial",
+        /* CON_BOOT flag causes this to be deregistered when a "real" console shows up later */
+	.flags  = CON_PRINTBUFFER | CON_BOOT, 
+	.index  = -1,
+	.write  = t030_console_write,
+};
+#endif
+
+static void t030_get_model(char *model)
+{
+	sprintf(model, "T030");
+}
+
+int __init t030_parse_bootinfo(const struct bi_record *rec)
+{
+	return 1;
+}
+
+void t030_sched_init(irq_handler_t timer_routine)
+{
+	if(request_irq(IRQ_USER + 13, timer_routine, 0, "timer", NULL))
+		panic("Could not register timer int");
+}
+
+void __init config_t030(void)
+{
+#ifdef CONFIG_EARLY_PRINTK
+	register_console(&t030_console_driver);
+#endif
+	mach_init_IRQ = t030_init_IRQ;
+	mach_sched_init = t030_sched_init;
+	mach_get_model = t030_get_model;
+	mach_max_dma_address = 0x10000000; /* ?? */
+}
+
+int __init t030_platform_init(void)
+{
+    /* 68901 UART */
+    if (platform_device_register(&t030_uart_device))
+        panic("Could not register MC68901 UART device");
+
+    /* TP3465 SPI master */
+    if (platform_device_register(&t030_spi_master_device))
+        panic("Could not register TP3465 SPI master");
+
+    /* LEDs */
+    if (platform_device_register(&t030_led_device))
+        panic("Could not register LED device");    
+
+    /* SD card */
+    if (spi_register_board_info(mmc_spi_info, ARRAY_SIZE(mmc_spi_info)))
+        pr_warn("Could not register SD card");    
+
+    /* ENC28J60 ethernet */
+    if (spi_register_board_info(enc28j60_spi_info, ARRAY_SIZE(enc28j60_spi_info)))
+        pr_warn("Could not register ENC28J60 ethernet");    
+
+	return 0;
+}
+
+arch_initcall(t030_platform_init);
diff -urN linux-4.4.13/arch/m68k/t030/ints.c linux-4.4.13-t030-20161102/arch/m68k/t030/ints.c
--- linux-4.4.13/arch/m68k/t030/ints.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-4.4.13-t030-20161102/arch/m68k/t030/ints.c	2016-08-22 22:35:22.000000000 +0200
@@ -0,0 +1,118 @@
+/*
+ *  arch/m68k/t030/ints.c
+ *
+ *  (c) 2016 Tobias Rathje
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file README.legal in the main directory of this archive
+ * for more details.
+ */
+
+#include <linux/interrupt.h>
+#include <linux/irq.h>
+#include <asm/traps.h>
+#include <asm/t030hw.h>
+
+
+void mc68901_irq_unmask(struct irq_data *data)
+{
+    unsigned short mask;
+
+    mask = T030_REG(T030_MFP_IMRA);
+    mask <<= 8;
+    mask |= T030_REG(T030_MFP_IMRB); 
+
+    mask |= 1 << (data->irq - IRQ_USER);
+
+    T030_REG(T030_MFP_IMRB) = mask;
+    T030_REG(T030_MFP_IMRA) = mask >> 8;
+}
+
+void mc68901_irq_mask(struct irq_data *data)
+{
+    unsigned short mask;
+
+    mask = T030_REG(T030_MFP_IMRA);
+    mask <<= 8;
+    mask |= T030_REG(T030_MFP_IMRB); 
+
+    mask &= ~(1 << (data->irq - IRQ_USER));
+
+    T030_REG(T030_MFP_IMRB) = mask;
+    T030_REG(T030_MFP_IMRA) = mask >> 8;
+}
+
+unsigned int mc68901_irq_startup(struct irq_data *data)
+{
+    unsigned short en;
+
+    en = T030_REG(T030_MFP_IERA);
+    en <<= 8;
+    en |= T030_REG(T030_MFP_IERB); 
+
+    en |= 1 << (data->irq - IRQ_USER);
+
+    T030_REG(T030_MFP_IERB) = en;
+    T030_REG(T030_MFP_IERA) = en >> 8;
+
+    mc68901_irq_unmask(data);
+
+    return m68k_irq_startup(data);
+}
+
+void mc68901_irq_shutdown(struct irq_data *data)
+{
+    unsigned short en;
+
+    en = T030_REG(T030_MFP_IERA);
+    en <<= 8;
+    en |= T030_REG(T030_MFP_IERB); 
+
+    en &= ~(1 << (data->irq - IRQ_USER));
+
+    T030_REG(T030_MFP_IERB) = en;
+    T030_REG(T030_MFP_IERA) = en >> 8;
+
+    mc68901_irq_mask(data);
+
+    m68k_irq_shutdown(data);
+}
+
+void mc68901_irq_eoi(struct irq_data *data)
+{
+    unsigned char __attribute__((unused)) val;
+}
+
+/* could change this to use the generic irq_chip driver? */
+static struct irq_chip mc68901_irq_chip = {
+    .name           = "mc68901",
+    .irq_startup    = mc68901_irq_startup,
+    .irq_shutdown   = mc68901_irq_shutdown,
+    .irq_mask       = mc68901_irq_mask,
+    .irq_unmask     = mc68901_irq_unmask,
+    .irq_eoi        = mc68901_irq_eoi,
+};
+
+void __init t030_init_IRQ(void)
+{
+    /* Declare the base vector we're going to use.
+     * count=0 is intentional -- leave the autovectors working */
+    m68k_setup_user_interrupt(VEC_USER, 0);
+
+    /* Configure interrupt controller */
+    T030_REG(T030_MFP_VR) = 0x40;   /* vector base */
+    T030_REG(T030_MFP_IERA) = 0x00; /* disable all interrupt channels */
+    T030_REG(T030_MFP_IERB) = 0x00;
+    T030_REG(T030_MFP_IMRA) = 0xff; /* unmask all interrupt channels */
+    T030_REG(T030_MFP_IMRB) = 0xff;
+
+    /* Configure timer A as timer tick */
+    T030_REG(T030_MFP_TADR) = 0x85;
+    T030_REG(T030_MFP_TACR) = 0x07;
+
+    /* Configure GPIO 6+7 as inputs, rest as outputs */
+    T030_REG(T030_MFP_DDR) = 0x3f;
+
+    /* first 16 interrupts are handled by the MFP */
+    m68k_setup_irq_controller(&mc68901_irq_chip, handle_simple_irq, IRQ_USER, 16); /* interrupts 8 ... 23 */
+}
diff -urN linux-4.4.13/drivers/leds/Kconfig linux-4.4.13-t030-20161102/drivers/leds/Kconfig
--- linux-4.4.13/drivers/leds/Kconfig	2016-06-08 03:14:51.000000000 +0200
+++ linux-4.4.13-t030-20161102/drivers/leds/Kconfig	2016-08-12 11:09:39.000000000 +0200
@@ -605,6 +605,13 @@
 	  This option enabled support for the LEDs on the ARM Versatile
 	  and RealView boards. Say Y to enabled these.
 
+config LEDS_T030
+    tristate "LED support for T030"
+    depends on T030
+    depends on LEDS_CLASS
+    help
+        LED support for the T030 SBC.
+
 comment "LED Triggers"
 source "drivers/leds/trigger/Kconfig"
 
diff -urN linux-4.4.13/drivers/leds/Makefile linux-4.4.13-t030-20161102/drivers/leds/Makefile
--- linux-4.4.13/drivers/leds/Makefile	2016-06-08 03:14:51.000000000 +0200
+++ linux-4.4.13-t030-20161102/drivers/leds/Makefile	2016-08-12 11:00:36.000000000 +0200
@@ -66,6 +66,7 @@
 obj-$(CONFIG_LEDS_KTD2692)		+= leds-ktd2692.o
 obj-$(CONFIG_LEDS_POWERNV)		+= leds-powernv.o
 obj-$(CONFIG_LEDS_SEAD3)		+= leds-sead3.o
+obj-$(CONFIG_LEDS_T030)		    += leds-t030.o
 
 # LED SPI Drivers
 obj-$(CONFIG_LEDS_DAC124S085)		+= leds-dac124s085.o
diff -urN linux-4.4.13/drivers/leds/leds-t030.c linux-4.4.13-t030-20161102/drivers/leds/leds-t030.c
--- linux-4.4.13/drivers/leds/leds-t030.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-4.4.13-t030-20161102/drivers/leds/leds-t030.c	2016-08-17 21:33:28.000000000 +0200
@@ -0,0 +1,92 @@
+/*
+ * T030 LED driver
+ * 
+ * (c) 2016 Tobias Rathje <tobbe@fasanix.com>
+ *
+ */
+
+#include <linux/io.h>
+#include <linux/ioport.h>
+#include <linux/leds.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/types.h>
+
+#define LED_GREEN	0x01
+#define LED_YELLOW	0x02
+
+static void __iomem *led_port;
+
+static void t030_led_green_set(struct led_classdev *led_cdev,
+			       enum led_brightness brightness)
+{
+    u8 val;
+
+    val = ioread8(led_port);
+    
+    if (brightness)
+    	iowrite8(val | LED_GREEN, led_port);
+    else
+        iowrite8(val & ~(LED_GREEN), led_port);
+}
+
+static void t030_led_yellow_set(struct led_classdev *led_cdev,
+                   enum led_brightness brightness)
+{   
+    u8 val;
+
+    val = ioread8(led_port);
+
+    if (brightness)
+        iowrite8(val | LED_YELLOW, led_port);
+    else
+        iowrite8(val & ~(LED_YELLOW), led_port);
+}
+
+static struct led_classdev t030_led_green = {
+	.name			= "t030:green",
+	.brightness		= LED_OFF,
+	.brightness_set		= t030_led_green_set,
+	.default_trigger	= "heartbeat",
+};
+
+static struct led_classdev t030_led_yellow = {
+    .name           = "t030:yellow",
+    .brightness     = LED_OFF,
+    .brightness_set     = t030_led_yellow_set,
+    .default_trigger    = "mmc0",
+};
+
+static int t030_led_probe(struct platform_device *pdev)
+{
+	struct resource *res;
+    int ret;
+
+	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+	if (!res)
+		return -EBUSY;
+
+	led_port = devm_ioremap(&pdev->dev, res->start, resource_size(res));
+	if (!led_port)
+		return -ENOMEM;
+
+    ret = devm_led_classdev_register(&pdev->dev, &t030_led_green);
+    if (ret < 0)
+        return ret;
+
+	return devm_led_classdev_register(&pdev->dev, &t030_led_yellow);
+}
+
+static struct platform_driver t030_led_driver = {
+	.probe	= t030_led_probe,
+	.driver	= {
+		.name	= "t030-leds",
+	},
+};
+
+module_platform_driver(t030_led_driver);
+
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("T030 LED driver");
+MODULE_AUTHOR("Tobias Rathje <tobbe@fasanix.com>");
+MODULE_ALIAS("platform:t030-leds");
diff -urN linux-4.4.13/drivers/spi/Kconfig linux-4.4.13-t030-20161102/drivers/spi/Kconfig
--- linux-4.4.13/drivers/spi/Kconfig	2016-06-08 03:14:51.000000000 +0200
+++ linux-4.4.13-t030-20161102/drivers/spi/Kconfig	2016-08-11 14:26:49.000000000 +0200
@@ -593,6 +593,12 @@
 	  This driver also supports the ML7213/ML7223/ML7831, a companion chip
 	  for the Atom E6xx series and compatible with the Intel EG20T PCH.
 
+config SPI_TP3465
+    tristate "TP3465 SPI Controller"
+    select SPI_BITBANG
+    help
+      SPI driver for TP3465 MID.
+
 config SPI_TXX9
 	tristate "Toshiba TXx9 SPI controller"
 	depends on GPIOLIB && (CPU_TX49XX || COMPILE_TEST)
diff -urN linux-4.4.13/drivers/spi/Makefile linux-4.4.13-t030-20161102/drivers/spi/Makefile
--- linux-4.4.13/drivers/spi/Makefile	2016-06-08 03:14:51.000000000 +0200
+++ linux-4.4.13-t030-20161102/drivers/spi/Makefile	2016-08-11 14:24:39.000000000 +0200
@@ -87,6 +87,7 @@
 obj-$(CONFIG_SPI_TEGRA20_SLINK)		+= spi-tegra20-slink.o
 obj-$(CONFIG_SPI_TLE62X0)		+= spi-tle62x0.o
 obj-$(CONFIG_SPI_TOPCLIFF_PCH)		+= spi-topcliff-pch.o
+obj-$(CONFIG_SPI_TP3465)           += spi-tp3465.o
 obj-$(CONFIG_SPI_TXX9)			+= spi-txx9.o
 obj-$(CONFIG_SPI_XCOMM)		+= spi-xcomm.o
 obj-$(CONFIG_SPI_XILINX)		+= spi-xilinx.o
diff -urN linux-4.4.13/drivers/spi/imr linux-4.4.13-t030-20161102/drivers/spi/imr
--- linux-4.4.13/drivers/spi/imr	1970-01-01 01:00:00.000000000 +0100
+++ linux-4.4.13-t030-20161102/drivers/spi/imr	2016-08-20 21:17:01.000000000 +0200
@@ -0,0 +1,739 @@
+spi-altera.c:			       hw->base + ALTERA_SPI_SLAVE_SEL);
+spi-altera.c:			hw->imr |= ALTERA_SPI_CONTROL_SSO_MSK;
+spi-altera.c:			writel(hw->imr, hw->base + ALTERA_SPI_CONTROL);
+spi-altera.c:			hw->imr &= ~ALTERA_SPI_CONTROL_SSO_MSK;
+spi-altera.c:			writel(hw->imr, hw->base + ALTERA_SPI_CONTROL);
+spi-altera.c:			writel(0, hw->base + ALTERA_SPI_SLAVE_SEL);
+spi-altera.c:			hw->imr &= ~ALTERA_SPI_CONTROL_SSO_MSK;
+spi-altera.c:			writel(hw->imr, hw->base + ALTERA_SPI_CONTROL);
+spi-altera.c:			       hw->base + ALTERA_SPI_SLAVE_SEL);
+spi-altera.c:			hw->imr |= ALTERA_SPI_CONTROL_SSO_MSK;
+spi-altera.c:			writel(hw->imr, hw->base + ALTERA_SPI_CONTROL);
+spi-altera.c:	if (hw->tx) {
+spi-altera.c:		switch (hw->bytes_per_word) {
+spi-altera.c:			return hw->tx[count];
+spi-altera.c:			return (hw->tx[count * 2]
+spi-altera.c:				| (hw->tx[count * 2 + 1] << 8));
+spi-altera.c:	hw->tx = t->tx_buf;
+spi-altera.c:	hw->rx = t->rx_buf;
+spi-altera.c:	hw->count = 0;
+spi-altera.c:	hw->bytes_per_word = DIV_ROUND_UP(t->bits_per_word, 8);
+spi-altera.c:	hw->len = t->len / hw->bytes_per_word;
+spi-altera.c:	if (hw->irq >= 0) {
+spi-altera.c:		hw->imr |= ALTERA_SPI_CONTROL_IRRDY_MSK;
+spi-altera.c:		writel(hw->imr, hw->base + ALTERA_SPI_CONTROL);
+spi-altera.c:		writel(hw_txbyte(hw, 0), hw->base + ALTERA_SPI_TXDATA);
+spi-altera.c:		wait_for_completion(&hw->done);
+spi-altera.c:		hw->imr &= ~ALTERA_SPI_CONTROL_IRRDY_MSK;
+spi-altera.c:		writel(hw->imr, hw->base + ALTERA_SPI_CONTROL);
+spi-altera.c:		while (hw->count < hw->len) {
+spi-altera.c:			writel(hw_txbyte(hw, hw->count),
+spi-altera.c:			       hw->base + ALTERA_SPI_TXDATA);
+spi-altera.c:			while (!(readl(hw->base + ALTERA_SPI_STATUS) &
+spi-altera.c:			rxd = readl(hw->base + ALTERA_SPI_RXDATA);
+spi-altera.c:			if (hw->rx) {
+spi-altera.c:				switch (hw->bytes_per_word) {
+spi-altera.c:					hw->rx[hw->count] = rxd;
+spi-altera.c:					hw->rx[hw->count * 2] = rxd;
+spi-altera.c:					hw->rx[hw->count * 2 + 1] = rxd >> 8;
+spi-altera.c:			hw->count++;
+spi-altera.c:	return hw->count * hw->bytes_per_word;
+spi-altera.c:	rxd = readl(hw->base + ALTERA_SPI_RXDATA);
+spi-altera.c:	if (hw->rx) {
+spi-altera.c:		switch (hw->bytes_per_word) {
+spi-altera.c:			hw->rx[hw->count] = rxd;
+spi-altera.c:			hw->rx[hw->count * 2] = rxd;
+spi-altera.c:			hw->rx[hw->count * 2 + 1] = rxd >> 8;
+spi-altera.c:	hw->count++;
+spi-altera.c:	if (hw->count < hw->len)
+spi-altera.c:		writel(hw_txbyte(hw, hw->count), hw->base + ALTERA_SPI_TXDATA);
+spi-altera.c:		complete(&hw->done);
+spi-altera.c:	hw->bitbang.master = master;
+spi-altera.c:	hw->bitbang.chipselect = altera_spi_chipsel;
+spi-altera.c:	hw->bitbang.txrx_bufs = altera_spi_txrx;
+spi-altera.c:	hw->base = devm_ioremap_resource(&pdev->dev, res);
+spi-altera.c:	if (IS_ERR(hw->base)) {
+spi-altera.c:		err = PTR_ERR(hw->base);
+spi-altera.c:	hw->imr = 0;		/* disable spi interrupts */
+spi-altera.c:	writel(hw->imr, hw->base + ALTERA_SPI_CONTROL);
+spi-altera.c:	writel(0, hw->base + ALTERA_SPI_STATUS);	/* clear status reg */
+spi-altera.c:	if (readl(hw->base + ALTERA_SPI_STATUS) & ALTERA_SPI_STATUS_RRDY_MSK)
+spi-altera.c:		readl(hw->base + ALTERA_SPI_RXDATA);	/* flush rxdata */
+spi-altera.c:	hw->irq = platform_get_irq(pdev, 0);
+spi-altera.c:	if (hw->irq >= 0) {
+spi-altera.c:		init_completion(&hw->done);
+spi-altera.c:		err = devm_request_irq(&pdev->dev, hw->irq, altera_spi_irq, 0,
+spi-altera.c:	err = spi_bitbang_start(&hw->bitbang);
+spi-altera.c:	dev_info(&pdev->dev, "base %p, irq %d\n", hw->base, hw->irq);
+spi-altera.c:	struct spi_master *master = hw->bitbang.master;
+spi-altera.c:	spi_bitbang_stop(&hw->bitbang);
+spi-au1550.c:	u32 mainclk_hz = hw->pdata->mainclk_hz;
+spi-au1550.c:	hw->regs->psc_spimsk =
+spi-au1550.c:	hw->regs->psc_spievent =
+spi-au1550.c:	hw->regs->psc_spipcr = PSC_SPIPCR_RC | PSC_SPIPCR_TC;
+spi-au1550.c:		pcr = hw->regs->psc_spipcr;
+spi-au1550.c:		if (hw->pdata->deactivate_cs)
+spi-au1550.c:			hw->pdata->deactivate_cs(hw->pdata, spi->chip_select,
+spi-au1550.c:		cfg = hw->regs->psc_spicfg;
+spi-au1550.c:		hw->regs->psc_spicfg = cfg & ~PSC_SPICFG_DE_ENABLE;
+spi-au1550.c:		if (hw->usedma && spi->bits_per_word <= 8)
+spi-au1550.c:		hw->regs->psc_spicfg = cfg | PSC_SPICFG_DE_ENABLE;
+spi-au1550.c:			stat = hw->regs->psc_spistat;
+spi-au1550.c:		if (hw->pdata->activate_cs)
+spi-au1550.c:			hw->pdata->activate_cs(hw->pdata, spi->chip_select,
+spi-au1550.c:	cfg = hw->regs->psc_spicfg;
+spi-au1550.c:	hw->regs->psc_spicfg = cfg & ~PSC_SPICFG_DE_ENABLE;
+spi-au1550.c:	if (hw->usedma && bpw <= 8)
+spi-au1550.c:	hw->regs->psc_spicfg = cfg;
+spi-au1550.c:			stat = hw->regs->psc_spistat;
+spi-au1550.c:	hw->dma_rx_tmpbuf = kmalloc(size, GFP_KERNEL);
+spi-au1550.c:	if (!hw->dma_rx_tmpbuf)
+spi-au1550.c:	hw->dma_rx_tmpbuf_size = size;
+spi-au1550.c:	hw->dma_rx_tmpbuf_addr = dma_map_single(hw->dev, hw->dma_rx_tmpbuf,
+spi-au1550.c:	if (dma_mapping_error(hw->dev, hw->dma_rx_tmpbuf_addr)) {
+spi-au1550.c:		kfree(hw->dma_rx_tmpbuf);
+spi-au1550.c:		hw->dma_rx_tmpbuf = 0;
+spi-au1550.c:		hw->dma_rx_tmpbuf_size = 0;
+spi-au1550.c:	dma_unmap_single(hw->dev, hw->dma_rx_tmpbuf_addr,
+spi-au1550.c:			hw->dma_rx_tmpbuf_size, DMA_FROM_DEVICE);
+spi-au1550.c:	kfree(hw->dma_rx_tmpbuf);
+spi-au1550.c:	hw->dma_rx_tmpbuf = 0;
+spi-au1550.c:	hw->dma_rx_tmpbuf_size = 0;
+spi-au1550.c:	hw->len = t->len;
+spi-au1550.c:	hw->tx_count = 0;
+spi-au1550.c:	hw->rx_count = 0;
+spi-au1550.c:	hw->tx = t->tx_buf;
+spi-au1550.c:	hw->rx = t->rx_buf;
+spi-au1550.c:			dma_tx_addr = dma_map_single(hw->dev,
+spi-au1550.c:			if (dma_mapping_error(hw->dev, dma_tx_addr))
+spi-au1550.c:				dev_err(hw->dev, "tx dma map error\n");
+spi-au1550.c:			dma_rx_addr = dma_map_single(hw->dev,
+spi-au1550.c:			if (dma_mapping_error(hw->dev, dma_rx_addr))
+spi-au1550.c:				dev_err(hw->dev, "rx dma map error\n");
+spi-au1550.c:		if (t->len > hw->dma_rx_tmpbuf_size) {
+spi-au1550.c:		hw->rx = hw->dma_rx_tmpbuf;
+spi-au1550.c:		dma_rx_addr = hw->dma_rx_tmpbuf_addr;
+spi-au1550.c:		dma_sync_single_for_device(hw->dev, dma_rx_addr,
+spi-au1550.c:		dma_sync_single_for_device(hw->dev, dma_rx_addr,
+spi-au1550.c:		hw->tx = hw->rx;
+spi-au1550.c:	res = au1xxx_dbdma_put_dest(hw->dma_rx_ch, virt_to_phys(hw->rx),
+spi-au1550.c:		dev_err(hw->dev, "rx dma put dest error\n");
+spi-au1550.c:	res = au1xxx_dbdma_put_source(hw->dma_tx_ch, virt_to_phys(hw->tx),
+spi-au1550.c:		dev_err(hw->dev, "tx dma put source error\n");
+spi-au1550.c:	au1xxx_dbdma_start(hw->dma_rx_ch);
+spi-au1550.c:	au1xxx_dbdma_start(hw->dma_tx_ch);
+spi-au1550.c:	hw->regs->psc_spimsk = PSC_SPIMSK_SD;
+spi-au1550.c:	hw->regs->psc_spipcr = PSC_SPIPCR_MS;
+spi-au1550.c:	wait_for_completion(&hw->master_done);
+spi-au1550.c:	au1xxx_dbdma_stop(hw->dma_tx_ch);
+spi-au1550.c:	au1xxx_dbdma_stop(hw->dma_rx_ch);
+spi-au1550.c:		dma_sync_single_for_cpu(hw->dev, dma_rx_addr, t->len,
+spi-au1550.c:		dma_unmap_single(hw->dev, dma_rx_addr, t->len,
+spi-au1550.c:		dma_unmap_single(hw->dev, dma_tx_addr, t->len,
+spi-au1550.c:	return hw->rx_count < hw->tx_count ? hw->rx_count : hw->tx_count;
+spi-au1550.c:	stat = hw->regs->psc_spistat;
+spi-au1550.c:	evnt = hw->regs->psc_spievent;
+spi-au1550.c:		dev_err(hw->dev, "Unexpected IRQ!\n");
+spi-au1550.c:		au1xxx_dbdma_stop(hw->dma_rx_ch);
+spi-au1550.c:		au1xxx_dbdma_stop(hw->dma_tx_ch);
+spi-au1550.c:		hw->rx_count = hw->len - au1xxx_get_dma_residue(hw->dma_rx_ch);
+spi-au1550.c:		hw->tx_count = hw->len - au1xxx_get_dma_residue(hw->dma_tx_ch);
+spi-au1550.c:		au1xxx_dbdma_reset(hw->dma_rx_ch);
+spi-au1550.c:		au1xxx_dbdma_reset(hw->dma_tx_ch);
+spi-au1550.c:			dev_err(hw->dev,
+spi-au1550.c:			dev_err(hw->dev,
+spi-au1550.c:		complete(&hw->master_done);
+spi-au1550.c:		hw->rx_count = hw->len;
+spi-au1550.c:		hw->tx_count = hw->len;
+spi-au1550.c:		complete(&hw->master_done);
+spi-au1550.c:	u32 fifoword = hw->regs->psc_spitxrx & (u32)(mask);		\
+spi-au1550.c:	if (hw->rx) {							\
+spi-au1550.c:		*(u##size *)hw->rx = (u##size)fifoword;			\
+spi-au1550.c:		hw->rx += (size) / 8;					\
+spi-au1550.c:	hw->rx_count += (size) / 8;					\
+spi-au1550.c:	if (hw->tx) {							\
+spi-au1550.c:		fifoword = *(u##size *)hw->tx & (u32)(mask);		\
+spi-au1550.c:		hw->tx += (size) / 8;					\
+spi-au1550.c:	hw->tx_count += (size) / 8;					\
+spi-au1550.c:	if (hw->tx_count >= hw->len)					\
+spi-au1550.c:	hw->regs->psc_spitxrx = fifoword;				\
+spi-au1550.c:	hw->tx = t->tx_buf;
+spi-au1550.c:	hw->rx = t->rx_buf;
+spi-au1550.c:	hw->len = t->len;
+spi-au1550.c:	hw->tx_count = 0;
+spi-au1550.c:	hw->rx_count = 0;
+spi-au1550.c:	while (hw->tx_count < hw->len) {
+spi-au1550.c:		hw->tx_word(hw);
+spi-au1550.c:		if (hw->tx_count >= hw->len) {
+spi-au1550.c:		stat = hw->regs->psc_spistat;
+spi-au1550.c:	hw->regs->psc_spimsk = mask;
+spi-au1550.c:	hw->regs->psc_spipcr = PSC_SPIPCR_MS;
+spi-au1550.c:	wait_for_completion(&hw->master_done);
+spi-au1550.c:	return hw->rx_count < hw->tx_count ? hw->rx_count : hw->tx_count;
+spi-au1550.c:	stat = hw->regs->psc_spistat;
+spi-au1550.c:	evnt = hw->regs->psc_spievent;
+spi-au1550.c:		dev_err(hw->dev, "Unexpected IRQ!\n");
+spi-au1550.c:		dev_err(hw->dev,
+spi-au1550.c:		complete(&hw->master_done);
+spi-au1550.c:		stat = hw->regs->psc_spistat;
+spi-au1550.c:		if (!(stat & PSC_SPISTAT_RE) && hw->rx_count < hw->len) {
+spi-au1550.c:			hw->rx_word(hw);
+spi-au1550.c:			if (!(stat & PSC_SPISTAT_TF) && hw->tx_count < hw->len)
+spi-au1550.c:				hw->tx_word(hw);
+spi-au1550.c:	hw->regs->psc_spievent = PSC_SPIEVNT_RR | PSC_SPIEVNT_TR;
+spi-au1550.c:		hw->regs->psc_spievent = PSC_SPIEVNT_TU | PSC_SPIEVNT_MD;
+spi-au1550.c:		hw->regs->psc_spipcr = PSC_SPIPCR_MS;
+spi-au1550.c:	if (hw->rx_count >= hw->len) {
+spi-au1550.c:		complete(&hw->master_done);
+spi-au1550.c:	return hw->txrx_bufs(spi, t);
+spi-au1550.c:	return hw->irq_callback(hw);
+spi-au1550.c:		if (hw->usedma) {
+spi-au1550.c:			hw->txrx_bufs = &au1550_spi_dma_txrxb;
+spi-au1550.c:			hw->irq_callback = &au1550_spi_dma_irq_callback;
+spi-au1550.c:			hw->rx_word = &au1550_spi_rx_word_8;
+spi-au1550.c:			hw->tx_word = &au1550_spi_tx_word_8;
+spi-au1550.c:			hw->txrx_bufs = &au1550_spi_pio_txrxb;
+spi-au1550.c:			hw->irq_callback = &au1550_spi_pio_irq_callback;
+spi-au1550.c:		hw->rx_word = &au1550_spi_rx_word_16;
+spi-au1550.c:		hw->tx_word = &au1550_spi_tx_word_16;
+spi-au1550.c:		hw->txrx_bufs = &au1550_spi_pio_txrxb;
+spi-au1550.c:		hw->irq_callback = &au1550_spi_pio_irq_callback;
+spi-au1550.c:		hw->rx_word = &au1550_spi_rx_word_32;
+spi-au1550.c:		hw->tx_word = &au1550_spi_tx_word_32;
+spi-au1550.c:		hw->txrx_bufs = &au1550_spi_pio_txrxb;
+spi-au1550.c:		hw->irq_callback = &au1550_spi_pio_irq_callback;
+spi-au1550.c:	hw->regs->psc_ctrl = PSC_CTRL_DISABLE;
+spi-au1550.c:	hw->regs->psc_sel = PSC_SEL_PS_SPIMODE;
+spi-au1550.c:	hw->regs->psc_spicfg = 0;
+spi-au1550.c:	hw->regs->psc_ctrl = PSC_CTRL_ENABLE;
+spi-au1550.c:		stat = hw->regs->psc_spistat;
+spi-au1550.c:	cfg = hw->usedma ? 0 : PSC_SPICFG_DD_DISABLE;
+spi-au1550.c:	hw->regs->psc_spicfg = cfg;
+spi-au1550.c:	hw->regs->psc_spicfg |= PSC_SPICFG_DE_ENABLE;
+spi-au1550.c:		stat = hw->regs->psc_spistat;
+spi-au1550.c:	hw->master = master;
+spi-au1550.c:	hw->pdata = dev_get_platdata(&pdev->dev);
+spi-au1550.c:	hw->dev = &pdev->dev;
+spi-au1550.c:	if (hw->pdata == NULL) {
+spi-au1550.c:	hw->irq = r->start;
+spi-au1550.c:	hw->usedma = 0;
+spi-au1550.c:		hw->dma_tx_id = r->start;
+spi-au1550.c:			hw->dma_rx_id = r->start;
+spi-au1550.c:					hw->usedma = 1;
+spi-au1550.c:	hw->ioarea = request_mem_region(r->start, sizeof(psc_spi_t),
+spi-au1550.c:	if (!hw->ioarea) {
+spi-au1550.c:	hw->regs = (psc_spi_t __iomem *)ioremap(r->start, sizeof(psc_spi_t));
+spi-au1550.c:	if (!hw->regs) {
+spi-au1550.c:	init_completion(&hw->master_done);
+spi-au1550.c:	hw->bitbang.master = hw->master;
+spi-au1550.c:	hw->bitbang.setup_transfer = au1550_spi_setupxfer;
+spi-au1550.c:	hw->bitbang.chipselect = au1550_spi_chipsel;
+spi-au1550.c:	hw->bitbang.txrx_bufs = au1550_spi_txrx_bufs;
+spi-au1550.c:	if (hw->usedma) {
+spi-au1550.c:		hw->dma_tx_ch = au1xxx_dbdma_chan_alloc(ddma_memid,
+spi-au1550.c:			hw->dma_tx_id, NULL, (void *)hw);
+spi-au1550.c:		if (hw->dma_tx_ch == 0) {
+spi-au1550.c:		au1xxx_dbdma_set_devwidth(hw->dma_tx_ch, 8);
+spi-au1550.c:		if (au1xxx_dbdma_ring_alloc(hw->dma_tx_ch,
+spi-au1550.c:		hw->dma_rx_ch = au1xxx_dbdma_chan_alloc(hw->dma_rx_id,
+spi-au1550.c:		if (hw->dma_rx_ch == 0) {
+spi-au1550.c:		au1xxx_dbdma_set_devwidth(hw->dma_rx_ch, 8);
+spi-au1550.c:		if (au1xxx_dbdma_ring_alloc(hw->dma_rx_ch,
+spi-au1550.c:	err = request_irq(hw->irq, au1550_spi_irq, 0, pdev->name, hw);
+spi-au1550.c:	master->num_chipselect = hw->pdata->num_chipselect;
+spi-au1550.c:		master->max_speed_hz = hw->pdata->mainclk_hz / min_div;
+spi-au1550.c:				hw->pdata->mainclk_hz / (max_div + 1) + 1;
+spi-au1550.c:	err = spi_bitbang_start(&hw->bitbang);
+spi-au1550.c:	free_irq(hw->irq, hw);
+spi-au1550.c:	if (hw->usedma)
+spi-au1550.c:		au1xxx_dbdma_chan_free(hw->dma_rx_ch);
+spi-au1550.c:	if (hw->usedma)
+spi-au1550.c:		au1xxx_dbdma_chan_free(hw->dma_tx_ch);
+spi-au1550.c:	iounmap((void __iomem *)hw->regs);
+spi-au1550.c:	spi_master_put(hw->master);
+spi-au1550.c:		hw->master->bus_num);
+spi-au1550.c:	spi_bitbang_stop(&hw->bitbang);
+spi-au1550.c:	free_irq(hw->irq, hw);
+spi-au1550.c:	iounmap((void __iomem *)hw->regs);
+spi-au1550.c:	release_mem_region(hw->ioarea->start, sizeof(psc_spi_t));
+spi-au1550.c:	if (hw->usedma) {
+spi-au1550.c:		au1xxx_dbdma_chan_free(hw->dma_rx_ch);
+spi-au1550.c:		au1xxx_dbdma_chan_free(hw->dma_tx_ch);
+spi-au1550.c:	spi_master_put(hw->master);
+spi-clps711x.c:	return regmap_update_bits(hw->syscon, SYSCON_OFFSET, SYSCON3_ADCCKNSEN,
+spi-clps711x.c:	clk_set_rate(hw->spi_clk, xfer->speed_hz ? : spi->max_speed_hz);
+spi-clps711x.c:	hw->len = xfer->len;
+spi-clps711x.c:	hw->bpw = xfer->bits_per_word;
+spi-clps711x.c:	hw->tx_buf = (u8 *)xfer->tx_buf;
+spi-clps711x.c:	hw->rx_buf = (u8 *)xfer->rx_buf;
+spi-clps711x.c:	data = hw->tx_buf ? *hw->tx_buf++ : 0;
+spi-clps711x.c:	writel(data | SYNCIO_FRMLEN(hw->bpw) | SYNCIO_TXFRMEN, hw->syncio);
+spi-clps711x.c:	data = readb(hw->syncio);
+spi-clps711x.c:	if (hw->rx_buf)
+spi-clps711x.c:		*hw->rx_buf++ = data;
+spi-clps711x.c:	if (--hw->len > 0) {
+spi-clps711x.c:		data = hw->tx_buf ? *hw->tx_buf++ : 0;
+spi-clps711x.c:		writel(data | SYNCIO_FRMLEN(hw->bpw) | SYNCIO_TXFRMEN,
+spi-clps711x.c:		       hw->syncio);
+spi-clps711x.c:	hw->spi_clk = devm_clk_get(&pdev->dev, NULL);
+spi-clps711x.c:	if (IS_ERR(hw->spi_clk)) {
+spi-clps711x.c:		ret = PTR_ERR(hw->spi_clk);
+spi-clps711x.c:	hw->syscon = syscon_regmap_lookup_by_pdevname("syscon.3");
+spi-clps711x.c:	if (IS_ERR(hw->syscon)) {
+spi-clps711x.c:		ret = PTR_ERR(hw->syscon);
+spi-clps711x.c:	hw->syncio = devm_ioremap_resource(&pdev->dev, res);
+spi-clps711x.c:	if (IS_ERR(hw->syncio)) {
+spi-clps711x.c:		ret = PTR_ERR(hw->syncio);
+spi-clps711x.c:	regmap_update_bits(hw->syscon, SYSCON_OFFSET, SYSCON3_ADCCON, 0);
+spi-clps711x.c:	readl(hw->syncio);
+spi-nuc900.c:	spin_lock_irqsave(&hw->lock, flags);
+spi-nuc900.c:	val = __raw_readl(hw->regs + USI_SSR);
+spi-nuc900.c:	__raw_writel(val, hw->regs + USI_SSR);
+spi-nuc900.c:	val = __raw_readl(hw->regs + USI_CNT);
+spi-nuc900.c:	__raw_writel(val, hw->regs + USI_CNT);
+spi-nuc900.c:	spin_unlock_irqrestore(&hw->lock, flags);
+spi-nuc900.c:	spin_lock_irqsave(&hw->lock, flags);
+spi-nuc900.c:	val = __raw_readl(hw->regs + USI_CNT) & ~TXNUM;
+spi-nuc900.c:	__raw_writel(val, hw->regs + USI_CNT);
+spi-nuc900.c:	spin_unlock_irqrestore(&hw->lock, flags);
+spi-nuc900.c:	spin_lock_irqsave(&hw->lock, flags);
+spi-nuc900.c:	val = __raw_readl(hw->regs + USI_CNT) & ~TXBITLEN;
+spi-nuc900.c:	__raw_writel(val, hw->regs + USI_CNT);
+spi-nuc900.c:	spin_unlock_irqrestore(&hw->lock, flags);
+spi-nuc900.c:	spin_lock_irqsave(&hw->lock, flags);
+spi-nuc900.c:	val = __raw_readl(hw->regs + USI_CNT);
+spi-nuc900.c:	__raw_writel(val, hw->regs + USI_CNT);
+spi-nuc900.c:	spin_unlock_irqrestore(&hw->lock, flags);
+spi-nuc900.c:	return hw->tx ? hw->tx[count] : 0;
+spi-nuc900.c:	hw->tx = t->tx_buf;
+spi-nuc900.c:	hw->rx = t->rx_buf;
+spi-nuc900.c:	hw->len = t->len;
+spi-nuc900.c:	hw->count = 0;
+spi-nuc900.c:	__raw_writel(hw_txbyte(hw, 0x0), hw->regs + USI_TX0);
+spi-nuc900.c:	wait_for_completion(&hw->done);
+spi-nuc900.c:	return hw->count;
+spi-nuc900.c:	unsigned int count = hw->count;
+spi-nuc900.c:	status = __raw_readl(hw->regs + USI_CNT);
+spi-nuc900.c:	__raw_writel(status, hw->regs + USI_CNT);
+spi-nuc900.c:		hw->count++;
+spi-nuc900.c:		if (hw->rx)
+spi-nuc900.c:			hw->rx[count] = __raw_readl(hw->regs + USI_RX0);
+spi-nuc900.c:		if (count < hw->len) {
+spi-nuc900.c:			__raw_writel(hw_txbyte(hw, count), hw->regs + USI_TX0);
+spi-nuc900.c:			complete(&hw->done);
+spi-nuc900.c:	complete(&hw->done);
+spi-nuc900.c:	spin_lock_irqsave(&hw->lock, flags);
+spi-nuc900.c:	val = __raw_readl(hw->regs + USI_CNT);
+spi-nuc900.c:	__raw_writel(val, hw->regs + USI_CNT);
+spi-nuc900.c:	spin_unlock_irqrestore(&hw->lock, flags);
+spi-nuc900.c:	spin_lock_irqsave(&hw->lock, flags);
+spi-nuc900.c:	val = __raw_readl(hw->regs + USI_CNT);
+spi-nuc900.c:	__raw_writel(val, hw->regs + USI_CNT);
+spi-nuc900.c:	spin_unlock_irqrestore(&hw->lock, flags);
+spi-nuc900.c:	spin_lock_irqsave(&hw->lock, flags);
+spi-nuc900.c:	val = __raw_readl(hw->regs + USI_CNT);
+spi-nuc900.c:	__raw_writel(val, hw->regs + USI_CNT);
+spi-nuc900.c:	spin_unlock_irqrestore(&hw->lock, flags);
+spi-nuc900.c:	spin_lock_irqsave(&hw->lock, flags);
+spi-nuc900.c:	val = __raw_readl(hw->regs + USI_CNT) & ~SLEEP;
+spi-nuc900.c:	__raw_writel(val, hw->regs + USI_CNT);
+spi-nuc900.c:	spin_unlock_irqrestore(&hw->lock, flags);
+spi-nuc900.c:	spin_lock_irqsave(&hw->lock, flags);
+spi-nuc900.c:	val = __raw_readl(hw->regs + USI_CNT);
+spi-nuc900.c:	__raw_writel(val, hw->regs + USI_CNT);
+spi-nuc900.c:	spin_unlock_irqrestore(&hw->lock, flags);
+spi-nuc900.c:	__raw_writel(hw->pdata->divider, hw->regs + USI_DIV);
+spi-nuc900.c:	clk_enable(hw->clk);
+spi-nuc900.c:	spin_lock_init(&hw->lock);
+spi-nuc900.c:	nuc900_tx_edge(hw, hw->pdata->txneg);
+spi-nuc900.c:	nuc900_rx_edge(hw, hw->pdata->rxneg);
+spi-nuc900.c:	nuc900_send_first(hw, hw->pdata->lsb);
+spi-nuc900.c:	nuc900_set_sleep(hw, hw->pdata->sleep);
+spi-nuc900.c:	nuc900_spi_setup_txbitlen(hw, hw->pdata->txbitlen);
+spi-nuc900.c:	nuc900_spi_setup_txnum(hw, hw->pdata->txnum);
+spi-nuc900.c:	hw->master = master;
+spi-nuc900.c:	hw->pdata  = dev_get_platdata(&pdev->dev);
+spi-nuc900.c:	if (hw->pdata == NULL) {
+spi-nuc900.c:	init_completion(&hw->done);
+spi-nuc900.c:	if (hw->pdata->lsb)
+spi-nuc900.c:	master->num_chipselect     = hw->pdata->num_cs;
+spi-nuc900.c:	master->bus_num            = hw->pdata->bus_num;
+spi-nuc900.c:	hw->bitbang.master         = hw->master;
+spi-nuc900.c:	hw->bitbang.chipselect     = nuc900_spi_chipsel;
+spi-nuc900.c:	hw->bitbang.txrx_bufs      = nuc900_spi_txrx;
+spi-nuc900.c:	hw->regs = devm_ioremap_resource(&pdev->dev, res);
+spi-nuc900.c:	if (IS_ERR(hw->regs)) {
+spi-nuc900.c:		err = PTR_ERR(hw->regs);
+spi-nuc900.c:	hw->irq = platform_get_irq(pdev, 0);
+spi-nuc900.c:	if (hw->irq < 0) {
+spi-nuc900.c:	err = devm_request_irq(&pdev->dev, hw->irq, nuc900_spi_irq, 0,
+spi-nuc900.c:	hw->clk = devm_clk_get(&pdev->dev, "spi");
+spi-nuc900.c:	if (IS_ERR(hw->clk)) {
+spi-nuc900.c:		err = PTR_ERR(hw->clk);
+spi-nuc900.c:	err = spi_bitbang_start(&hw->bitbang);
+spi-nuc900.c:	clk_disable(hw->clk);
+spi-nuc900.c:	spi_master_put(hw->master);
+spi-nuc900.c:	spi_bitbang_stop(&hw->bitbang);
+spi-nuc900.c:	clk_disable(hw->clk);
+spi-nuc900.c:	spi_master_put(hw->master);
+spi-oc-tiny.c:	return min(DIV_ROUND_UP(hw->freq, hz * 2), (1U << hw->baudwidth)) - 1;
+spi-oc-tiny.c:	if (hw->gpio_cs_count > 0) {
+spi-oc-tiny.c:		gpio_set_value(hw->gpio_cs[spi->chip_select],
+spi-oc-tiny.c:	unsigned int baud = hw->baud;
+spi-oc-tiny.c:		if (t->speed_hz && t->speed_hz != hw->speed_hz)
+spi-oc-tiny.c:	writel(baud, hw->base + TINY_SPI_BAUD);
+spi-oc-tiny.c:	writel(hw->mode, hw->base + TINY_SPI_CONTROL);
+spi-oc-tiny.c:	if (spi->max_speed_hz != hw->speed_hz) {
+spi-oc-tiny.c:		hw->speed_hz = spi->max_speed_hz;
+spi-oc-tiny.c:		hw->baud = tiny_spi_baud(spi, hw->speed_hz);
+spi-oc-tiny.c:	hw->mode = spi->mode & (SPI_CPOL | SPI_CPHA);
+spi-oc-tiny.c:	while (!(readb(hw->base + TINY_SPI_STATUS) &
+spi-oc-tiny.c:	while (!(readb(hw->base + TINY_SPI_STATUS) &
+spi-oc-tiny.c:	if (hw->irq >= 0) {
+spi-oc-tiny.c:		hw->len = t->len;
+spi-oc-tiny.c:		hw->txp = t->tx_buf;
+spi-oc-tiny.c:		hw->rxp = t->rx_buf;
+spi-oc-tiny.c:		hw->txc = 0;
+spi-oc-tiny.c:		hw->rxc = 0;
+spi-oc-tiny.c:			writeb(hw->txp ? *hw->txp++ : 0,
+spi-oc-tiny.c:			       hw->base + TINY_SPI_TXDATA);
+spi-oc-tiny.c:			hw->txc++;
+spi-oc-tiny.c:			writeb(hw->txp ? *hw->txp++ : 0,
+spi-oc-tiny.c:			       hw->base + TINY_SPI_TXDATA);
+spi-oc-tiny.c:			hw->txc++;
+spi-oc-tiny.c:			writeb(TINY_SPI_STATUS_TXR, hw->base + TINY_SPI_STATUS);
+spi-oc-tiny.c:			writeb(hw->txp ? *hw->txp++ : 0,
+spi-oc-tiny.c:			       hw->base + TINY_SPI_TXDATA);
+spi-oc-tiny.c:			hw->txc++;
+spi-oc-tiny.c:			writeb(TINY_SPI_STATUS_TXE, hw->base + TINY_SPI_STATUS);
+spi-oc-tiny.c:		wait_for_completion(&hw->done);
+spi-oc-tiny.c:		writeb(txp ? *txp++ : 0, hw->base + TINY_SPI_TXDATA);
+spi-oc-tiny.c:			writeb(txp ? *txp++ : 0, hw->base + TINY_SPI_TXDATA);
+spi-oc-tiny.c:				*rxp++ = readb(hw->base + TINY_SPI_TXDATA);
+spi-oc-tiny.c:			*rxp++ = readb(hw->base + TINY_SPI_RXDATA);
+spi-oc-tiny.c:	writeb(0, hw->base + TINY_SPI_STATUS);
+spi-oc-tiny.c:	if (hw->rxc + 1 == hw->len) {
+spi-oc-tiny.c:		if (hw->rxp)
+spi-oc-tiny.c:			*hw->rxp++ = readb(hw->base + TINY_SPI_RXDATA);
+spi-oc-tiny.c:		hw->rxc++;
+spi-oc-tiny.c:		complete(&hw->done);
+spi-oc-tiny.c:		if (hw->rxp)
+spi-oc-tiny.c:			*hw->rxp++ = readb(hw->base + TINY_SPI_TXDATA);
+spi-oc-tiny.c:		hw->rxc++;
+spi-oc-tiny.c:		if (hw->txc < hw->len) {
+spi-oc-tiny.c:			writeb(hw->txp ? *hw->txp++ : 0,
+spi-oc-tiny.c:			       hw->base + TINY_SPI_TXDATA);
+spi-oc-tiny.c:			hw->txc++;
+spi-oc-tiny.c:			       hw->base + TINY_SPI_STATUS);
+spi-oc-tiny.c:			       hw->base + TINY_SPI_STATUS);
+spi-oc-tiny.c:	hw->gpio_cs_count = of_gpio_count(np);
+spi-oc-tiny.c:	if (hw->gpio_cs_count > 0) {
+spi-oc-tiny.c:		hw->gpio_cs = devm_kzalloc(&pdev->dev,
+spi-oc-tiny.c:				hw->gpio_cs_count * sizeof(unsigned int),
+spi-oc-tiny.c:		if (!hw->gpio_cs)
+spi-oc-tiny.c:	for (i = 0; i < hw->gpio_cs_count; i++) {
+spi-oc-tiny.c:		hw->gpio_cs[i] = of_get_gpio_flags(np, i, NULL);
+spi-oc-tiny.c:		if (hw->gpio_cs[i] < 0)
+spi-oc-tiny.c:	hw->bitbang.master->dev.of_node = pdev->dev.of_node;
+spi-oc-tiny.c:		hw->freq = val;
+spi-oc-tiny.c:		hw->baudwidth = val;
+spi-oc-tiny.c:	hw->bitbang.master = master;
+spi-oc-tiny.c:	hw->bitbang.setup_transfer = tiny_spi_setup_transfer;
+spi-oc-tiny.c:	hw->bitbang.chipselect = tiny_spi_chipselect;
+spi-oc-tiny.c:	hw->bitbang.txrx_bufs = tiny_spi_txrx_bufs;
+spi-oc-tiny.c:	hw->base = devm_ioremap_resource(&pdev->dev, res);
+spi-oc-tiny.c:	if (IS_ERR(hw->base)) {
+spi-oc-tiny.c:		err = PTR_ERR(hw->base);
+spi-oc-tiny.c:	hw->irq = platform_get_irq(pdev, 0);
+spi-oc-tiny.c:	if (hw->irq >= 0) {
+spi-oc-tiny.c:		init_completion(&hw->done);
+spi-oc-tiny.c:		err = devm_request_irq(&pdev->dev, hw->irq, tiny_spi_irq, 0,
+spi-oc-tiny.c:		hw->gpio_cs_count = platp->gpio_cs_count;
+spi-oc-tiny.c:		hw->gpio_cs = platp->gpio_cs;
+spi-oc-tiny.c:		hw->freq = platp->freq;
+spi-oc-tiny.c:		hw->baudwidth = platp->baudwidth;
+spi-oc-tiny.c:	for (i = 0; i < hw->gpio_cs_count; i++) {
+spi-oc-tiny.c:		err = gpio_request(hw->gpio_cs[i], dev_name(&pdev->dev));
+spi-oc-tiny.c:		gpio_direction_output(hw->gpio_cs[i], 1);
+spi-oc-tiny.c:	hw->bitbang.master->num_chipselect = max(1, hw->gpio_cs_count);
+spi-oc-tiny.c:	err = spi_bitbang_start(&hw->bitbang);
+spi-oc-tiny.c:	dev_info(&pdev->dev, "base %p, irq %d\n", hw->base, hw->irq);
+spi-oc-tiny.c:		gpio_free(hw->gpio_cs[i]);
+spi-oc-tiny.c:	struct spi_master *master = hw->bitbang.master;
+spi-oc-tiny.c:	spi_bitbang_stop(&hw->bitbang);
+spi-oc-tiny.c:	for (i = 0; i < hw->gpio_cs_count; i++)
+spi-oc-tiny.c:		gpio_free(hw->gpio_cs[i]);
+spi-ppc4xx.c:	hw->tx = t->tx_buf;
+spi-ppc4xx.c:	hw->rx = t->rx_buf;
+spi-ppc4xx.c:	hw->len = t->len;
+spi-ppc4xx.c:	hw->count = 0;
+spi-ppc4xx.c:	data = hw->tx ? hw->tx[0] : 0;
+spi-ppc4xx.c:	out_8(&hw->regs->txd, data);
+spi-ppc4xx.c:	out_8(&hw->regs->cr, SPI_PPC4XX_CR_STR);
+spi-ppc4xx.c:	wait_for_completion(&hw->done);
+spi-ppc4xx.c:	return hw->count;
+spi-ppc4xx.c:	out_8(&hw->regs->mode, cs->mode);
+spi-ppc4xx.c:	scr = (hw->opb_freq / speed) - 1;
+spi-ppc4xx.c:	if (in_8(&hw->regs->cdm) != cdm)
+spi-ppc4xx.c:		out_8(&hw->regs->cdm, cdm);
+spi-ppc4xx.c:	mutex_lock(&hw->bitbang.lock);
+spi-ppc4xx.c:	if (!hw->bitbang.busy) {
+spi-ppc4xx.c:		hw->bitbang.chipselect(spi, BITBANG_CS_INACTIVE);
+spi-ppc4xx.c:	mutex_unlock(&hw->bitbang.lock);
+spi-ppc4xx.c:	if (!hw->master->num_chipselect || hw->gpios[cs] == -EEXIST)
+spi-ppc4xx.c:	gpio_set_value(hw->gpios[cs], cspol);
+spi-ppc4xx.c:	status = in_8(&hw->regs->sr);
+spi-ppc4xx.c:		dev_dbg(hw->dev, "got interrupt but spi still busy?\n");
+spi-ppc4xx.c:			lstatus = in_8(&hw->regs->sr);
+spi-ppc4xx.c:			dev_err(hw->dev, "busywait: too many loops!\n");
+spi-ppc4xx.c:			complete(&hw->done);
+spi-ppc4xx.c:			status = in_8(&hw->regs->sr);
+spi-ppc4xx.c:			dev_dbg(hw->dev, "loops %d status %x\n", cnt, status);
+spi-ppc4xx.c:	count = hw->count;
+spi-ppc4xx.c:	hw->count++;
+spi-ppc4xx.c:	data = in_8(&hw->regs->rxd);
+spi-ppc4xx.c:	if (hw->rx)
+spi-ppc4xx.c:		hw->rx[count] = data;
+spi-ppc4xx.c:	if (count < hw->len) {
+spi-ppc4xx.c:		data = hw->tx ? hw->tx[count] : 0;
+spi-ppc4xx.c:		out_8(&hw->regs->txd, data);
+spi-ppc4xx.c:		out_8(&hw->regs->cr, SPI_PPC4XX_CR_STR);
+spi-ppc4xx.c:		complete(&hw->done);
+spi-ppc4xx.c:	if (hw->master->num_chipselect) {
+spi-ppc4xx.c:		for (i = 0; i < hw->master->num_chipselect; i++)
+spi-ppc4xx.c:			if (gpio_is_valid(hw->gpios[i]))
+spi-ppc4xx.c:				gpio_free(hw->gpios[i]);
+spi-ppc4xx.c:		kfree(hw->gpios);
+spi-ppc4xx.c:		hw->gpios = NULL;
+spi-ppc4xx.c:	hw->master = master;
+spi-ppc4xx.c:	hw->dev = dev;
+spi-ppc4xx.c:	init_completion(&hw->done);
+spi-ppc4xx.c:		hw->gpios = kzalloc(sizeof(int) * num_gpios, GFP_KERNEL);
+spi-ppc4xx.c:		if (!hw->gpios) {
+spi-ppc4xx.c:			hw->gpios[i] = gpio;
+spi-ppc4xx.c:	bbp = &hw->bitbang;
+spi-ppc4xx.c:	bbp->master = hw->master;
+spi-ppc4xx.c:	hw->opb_freq = *clk;
+spi-ppc4xx.c:	hw->opb_freq >>= 2;
+spi-ppc4xx.c:	hw->mapbase = resource.start;
+spi-ppc4xx.c:	hw->mapsize = resource_size(&resource);
+spi-ppc4xx.c:	if (hw->mapsize < sizeof(struct spi_ppc4xx_regs)) {
+spi-ppc4xx.c:	hw->irqnum = irq_of_parse_and_map(np, 0);
+spi-ppc4xx.c:	ret = request_irq(hw->irqnum, spi_ppc4xx_int,
+spi-ppc4xx.c:	if (!request_mem_region(hw->mapbase, hw->mapsize, DRIVER_NAME)) {
+spi-ppc4xx.c:	hw->regs = ioremap(hw->mapbase, sizeof(struct spi_ppc4xx_regs));
+spi-ppc4xx.c:	if (!hw->regs) {
+spi-ppc4xx.c:	iounmap(hw->regs);
+spi-ppc4xx.c:	release_mem_region(hw->mapbase, hw->mapsize);
+spi-ppc4xx.c:	free_irq(hw->irqnum, hw);
+spi-ppc4xx.c:	spi_bitbang_stop(&hw->bitbang);
+spi-ppc4xx.c:	release_mem_region(hw->mapbase, hw->mapsize);
+spi-ppc4xx.c:	free_irq(hw->irqnum, hw);
+spi-ppc4xx.c:	iounmap(hw->regs);
+spi-s3c24xx.c:		hw->set_cs(hw->pdata, spi->chip_select, cspol^1);
+spi-s3c24xx.c:		writeb(cs->spcon, hw->regs + S3C2410_SPCON);
+spi-s3c24xx.c:		       hw->regs + S3C2410_SPCON);
+spi-s3c24xx.c:		hw->set_cs(hw->pdata, spi->chip_select, cspol);
+spi-s3c24xx.c:		clk = clk_get_rate(hw->clk);
+spi-s3c24xx.c:		writeb(cs->sppre, hw->regs + S3C2410_SPPRE);
+spi-s3c24xx.c:	mutex_lock(&hw->bitbang.lock);
+spi-s3c24xx.c:	if (!hw->bitbang.busy) {
+spi-s3c24xx.c:		hw->bitbang.chipselect(spi, BITBANG_CS_INACTIVE);
+spi-s3c24xx.c:	mutex_unlock(&hw->bitbang.lock);
+spi-s3c24xx.c:	return hw->tx ? hw->tx[count] : 0;
+spi-s3c24xx.c:	if (!hw->fiq_claimed) {
+spi-s3c24xx.c:		ret = claim_fiq(&hw->fiq_handler);
+spi-s3c24xx.c:	if (hw->tx && !hw->rx)
+spi-s3c24xx.c:	else if (hw->rx && !hw->tx)
+spi-s3c24xx.c:	regs.uregs[fiq_rspi] = (long)hw->regs;
+spi-s3c24xx.c:	regs.uregs[fiq_rrx]  = (long)hw->rx;
+spi-s3c24xx.c:	regs.uregs[fiq_rtx]  = (long)hw->tx + 1;
+spi-s3c24xx.c:	regs.uregs[fiq_rcount] = hw->len - 1;
+spi-s3c24xx.c:	if (hw->fiq_mode != mode) {
+spi-s3c24xx.c:		hw->fiq_mode = mode;
+spi-s3c24xx.c:		*ack_ptr = ack_bit(hw->irq);
+spi-s3c24xx.c:	s3c24xx_set_fiq(hw->irq, true);
+spi-s3c24xx.c:	hw->fiq_mode = mode;
+spi-s3c24xx.c:	hw->fiq_inuse = 1;
+spi-s3c24xx.c:		if (hw->fiq_inuse)
+spi-s3c24xx.c:		hw->fiq_mode = FIQ_MODE_NONE;
+spi-s3c24xx.c:		hw->fiq_claimed = 0;
+spi-s3c24xx.c:		hw->fiq_claimed = 1;
+spi-s3c24xx.c:	hw->fiq_handler.dev_id = hw;
+spi-s3c24xx.c:	hw->fiq_handler.name = dev_name(hw->dev);
+spi-s3c24xx.c:	hw->fiq_handler.fiq_op = s3c24xx_spi_fiqop;
+spi-s3c24xx.c:	return hw->pdata->use_fiq;
+spi-s3c24xx.c:	hw->tx = t->tx_buf;
+spi-s3c24xx.c:	hw->rx = t->rx_buf;
+spi-s3c24xx.c:	hw->len = t->len;
+spi-s3c24xx.c:	hw->count = 0;
+spi-s3c24xx.c:	init_completion(&hw->done);
+spi-s3c24xx.c:	hw->fiq_inuse = 0;
+spi-s3c24xx.c:	writeb(hw_txbyte(hw, 0), hw->regs + S3C2410_SPTDAT);
+spi-s3c24xx.c:	wait_for_completion(&hw->done);
+spi-s3c24xx.c:	return hw->count;
+spi-s3c24xx.c:	unsigned int spsta = readb(hw->regs + S3C2410_SPSTA);
+spi-s3c24xx.c:	unsigned int count = hw->count;
+spi-s3c24xx.c:		dev_dbg(hw->dev, "data-collision\n");
+spi-s3c24xx.c:		complete(&hw->done);
+spi-s3c24xx.c:		dev_dbg(hw->dev, "spi not ready for tx?\n");
+spi-s3c24xx.c:		complete(&hw->done);
+spi-s3c24xx.c:		hw->count++;
+spi-s3c24xx.c:		if (hw->rx)
+spi-s3c24xx.c:			hw->rx[count] = readb(hw->regs + S3C2410_SPRDAT);
+spi-s3c24xx.c:		if (count < hw->len)
+spi-s3c24xx.c:			writeb(hw_txbyte(hw, count), hw->regs + S3C2410_SPTDAT);
+spi-s3c24xx.c:			complete(&hw->done);
+spi-s3c24xx.c:		hw->count = hw->len;
+spi-s3c24xx.c:		hw->fiq_inuse = 0;
+spi-s3c24xx.c:		if (hw->rx)
+spi-s3c24xx.c:			hw->rx[hw->len-1] = readb(hw->regs + S3C2410_SPRDAT);
+spi-s3c24xx.c:		complete(&hw->done);
+spi-s3c24xx.c:	clk_enable(hw->clk);
+spi-s3c24xx.c:	writeb(0xff, hw->regs + S3C2410_SPPRE);
+spi-s3c24xx.c:	writeb(SPPIN_DEFAULT, hw->regs + S3C2410_SPPIN);
+spi-s3c24xx.c:	writeb(SPCON_DEFAULT, hw->regs + S3C2410_SPCON);
+spi-s3c24xx.c:	if (hw->pdata) {
+spi-s3c24xx.c:		if (hw->set_cs == s3c24xx_spi_gpiocs)
+spi-s3c24xx.c:			gpio_direction_output(hw->pdata->pin_cs, 1);
+spi-s3c24xx.c:		if (hw->pdata->gpio_setup)
+spi-s3c24xx.c:			hw->pdata->gpio_setup(hw->pdata, 1);
+spi-s3c24xx.c:	hw->master = master;
+spi-s3c24xx.c:	hw->pdata = pdata = dev_get_platdata(&pdev->dev);
+spi-s3c24xx.c:	hw->dev = &pdev->dev;
+spi-s3c24xx.c:	init_completion(&hw->done);
+spi-s3c24xx.c:	master->num_chipselect = hw->pdata->num_cs;
+spi-s3c24xx.c:	hw->bitbang.master         = hw->master;
+spi-s3c24xx.c:	hw->bitbang.setup_transfer = s3c24xx_spi_setupxfer;
+spi-s3c24xx.c:	hw->bitbang.chipselect     = s3c24xx_spi_chipsel;
+spi-s3c24xx.c:	hw->bitbang.txrx_bufs      = s3c24xx_spi_txrx;
+spi-s3c24xx.c:	hw->master->setup  = s3c24xx_spi_setup;
+spi-s3c24xx.c:	dev_dbg(hw->dev, "bitbang at %p\n", &hw->bitbang);
+spi-s3c24xx.c:	hw->regs = devm_ioremap_resource(&pdev->dev, res);
+spi-s3c24xx.c:	if (IS_ERR(hw->regs)) {
+spi-s3c24xx.c:		err = PTR_ERR(hw->regs);
+spi-s3c24xx.c:	hw->irq = platform_get_irq(pdev, 0);
+spi-s3c24xx.c:	if (hw->irq < 0) {
+spi-s3c24xx.c:	err = devm_request_irq(&pdev->dev, hw->irq, s3c24xx_spi_irq, 0,
+spi-s3c24xx.c:	hw->clk = devm_clk_get(&pdev->dev, "spi");
+spi-s3c24xx.c:	if (IS_ERR(hw->clk)) {
+spi-s3c24xx.c:		err = PTR_ERR(hw->clk);
+spi-s3c24xx.c:		hw->set_cs = s3c24xx_spi_gpiocs;
+spi-s3c24xx.c:		hw->set_cs = pdata->set_cs;
+spi-s3c24xx.c:	err = spi_bitbang_start(&hw->bitbang);
+spi-s3c24xx.c:	clk_disable(hw->clk);
+spi-s3c24xx.c:	spi_master_put(hw->master);
+spi-s3c24xx.c:	spi_bitbang_stop(&hw->bitbang);
+spi-s3c24xx.c:	clk_disable(hw->clk);
+spi-s3c24xx.c:	spi_master_put(hw->master);
+spi-s3c24xx.c:	ret = spi_master_suspend(hw->master);
+spi-s3c24xx.c:	if (hw->pdata && hw->pdata->gpio_setup)
+spi-s3c24xx.c:		hw->pdata->gpio_setup(hw->pdata, 0);
+spi-s3c24xx.c:	clk_disable(hw->clk);
+spi-s3c24xx.c:	return spi_master_resume(hw->master);
+spi-sc18is602.c:	int usecs = 1000000 * len / hw->speed + 1;
+spi-sc18is602.c:		err = i2c_master_recv(hw->client, dummy, 1);
+spi-sc18is602.c:	if (hw->tlen == 0) {
+spi-sc18is602.c:		hw->buffer[0] = 1 << msg->spi->chip_select;
+spi-sc18is602.c:		hw->tlen = 1;
+spi-sc18is602.c:		hw->rindex = 0;
+spi-sc18is602.c:		memcpy(&hw->buffer[hw->tlen], t->tx_buf, len);
+spi-sc18is602.c:		hw->tlen += len;
+spi-sc18is602.c:			hw->rindex = hw->tlen - 1;
+spi-sc18is602.c:		hw->rindex = hw->tlen - 1;
+spi-sc18is602.c:		memset(&hw->buffer[hw->tlen], 0, len);
+spi-sc18is602.c:		hw->tlen += len;
+spi-sc18is602.c:	if (do_transfer && hw->tlen > 1) {
+spi-sc18is602.c:		ret = i2c_master_send(hw->client, hw->buffer, hw->tlen);
+spi-sc18is602.c:		if (ret != hw->tlen)
+spi-sc18is602.c:			int rlen = hw->rindex + len;
+spi-sc18is602.c:			ret = sc18is602_wait_ready(hw, hw->tlen);
+spi-sc18is602.c:			ret = i2c_master_recv(hw->client, hw->buffer, rlen);
+spi-sc18is602.c:			memcpy(t->rx_buf, &hw->buffer[hw->rindex], len);
+spi-sc18is602.c:		hw->tlen = 0;
+spi-sc18is602.c:	if (hz >= hw->freq / 4) {
+spi-sc18is602.c:		hw->speed = hw->freq / 4;
+spi-sc18is602.c:	} else if (hz >= hw->freq / 16) {
+spi-sc18is602.c:		hw->speed = hw->freq / 16;
+spi-sc18is602.c:	} else if (hz >= hw->freq / 64) {
+spi-sc18is602.c:		hw->speed = hw->freq / 64;
+spi-sc18is602.c:		hw->speed = hw->freq / 128;
+spi-sc18is602.c:	 * value of 0xff for hw->ctrl ensures that the correct mode will be set
+spi-sc18is602.c:	if (ctrl == hw->ctrl)
+spi-sc18is602.c:	ret = i2c_smbus_write_byte_data(hw->client, 0xf0, ctrl);
+spi-sc18is602.c:	hw->ctrl = ctrl;
+spi-sc18is602.c:	hw->tlen = 0;
+spi-sc18is602.c:		status = sc18is602_check_transfer(spi, t, hw->tlen);
+spi-sc18is602.c:	if (hw->id == sc18is602 && spi->chip_select == 2)
+spi-sc18is602.c:	hw->master = master;
+spi-sc18is602.c:	hw->client = client;
+spi-sc18is602.c:	hw->dev = dev;
+spi-sc18is602.c:	hw->ctrl = 0xff;
+spi-sc18is602.c:	hw->id = id->driver_data;
+spi-sc18is602.c:	switch (hw->id) {
+spi-sc18is602.c:		hw->freq = SC18IS602_CLOCK;
+spi-sc18is602.c:			hw->freq = pdata->clock_frequency;
+spi-sc18is602.c:				hw->freq = be32_to_cpup(val);
+spi-sc18is602.c:		if (!hw->freq)
+spi-sc18is602.c:			hw->freq = SC18IS602_CLOCK;
+spi-sc18is602.c:	master->min_speed_hz = hw->freq / 128;
+spi-sc18is602.c:	master->max_speed_hz = hw->freq / 4;
+spi-tp3465.c:        iowrite8(0xff, hw->base + TP3465_SPI_CS);
+spi-tp3465.c:                iowrite8(0xfe, hw->base + TP3465_SPI_CS);
+spi-tp3465.c:                iowrite8(0xfd, hw->base + TP3465_SPI_CS);
+spi-tp3465.c:                iowrite8(0xfb, hw->base + TP3465_SPI_CS);
+spi-tp3465.c:                iowrite8(0xf7, hw->base + TP3465_SPI_CS);
+spi-tp3465.c:	if (hw->tx) {
+spi-tp3465.c:		switch (hw->bytes_per_word) {
+spi-tp3465.c:			return hw->tx[count];
+spi-tp3465.c:			return (hw->tx[count * 2]
+spi-tp3465.c:				| (hw->tx[count * 2 + 1] << 8));
+spi-tp3465.c:	hw->tx = t->tx_buf;
+spi-tp3465.c:	hw->rx = t->rx_buf;
+spi-tp3465.c:	hw->count = 0;
+spi-tp3465.c:	hw->bytes_per_word = DIV_ROUND_UP(t->bits_per_word, 8);
+spi-tp3465.c:	hw->len = t->len / hw->bytes_per_word;
+spi-tp3465.c:	if (hw->irq >= 0) {
+spi-tp3465.c:        iowrite8(0x82, hw->base + TP3465_SPI_SKR);
+spi-tp3465.c:        iowrite8(hw_txbyte(hw, 0), hw->base + TP3465_SPI_FMB);
+spi-tp3465.c:        wait_for_completion(&hw->done);
+spi-tp3465.c:        iowrite8(0x02, hw->base + TP3465_SPI_SKR);
+spi-tp3465.c:		while (hw->count < hw->len) {
+spi-tp3465.c:			iowrite8(hw_txbyte(hw, hw->count),
+spi-tp3465.c:			       hw->base + TP3465_SPI_FMB);
+spi-tp3465.c:			while (!(ioread8(hw->base + TP3465_SPI_ST) & 0x80))
+spi-tp3465.c:			rxd = readl(hw->base + TP3465_SPI_FMB);
+spi-tp3465.c:			if (hw->rx) {
+spi-tp3465.c:				switch (hw->bytes_per_word) {
+spi-tp3465.c:					hw->rx[hw->count] = rxd;
+spi-tp3465.c:					hw->rx[hw->count * 2] = rxd;
+spi-tp3465.c:					hw->rx[hw->count * 2 + 1] = rxd >> 8;
+spi-tp3465.c:			hw->count++;
+spi-tp3465.c:	return hw->count * hw->bytes_per_word;
+spi-tp3465.c:	rxd = ioread8(hw->base + TP3465_SPI_FMB);
+spi-tp3465.c:	if (hw->rx) {
+spi-tp3465.c:		switch (hw->bytes_per_word) {
+spi-tp3465.c:			hw->rx[hw->count] = rxd;
+spi-tp3465.c:			hw->rx[hw->count * 2] = rxd;
+spi-tp3465.c:			hw->rx[hw->count * 2 + 1] = rxd >> 8;
+spi-tp3465.c:	hw->count++;
+spi-tp3465.c:	if (hw->count < hw->len)
+spi-tp3465.c:		iowrite8(hw_txbyte(hw, hw->count), hw->base + TP3465_SPI_FMB);
+spi-tp3465.c:		complete(&hw->done);
+spi-tp3465.c:	hw->bitbang.master = master;
+spi-tp3465.c:	hw->bitbang.chipselect = tp3465_spi_chipsel;
+spi-tp3465.c:	hw->bitbang.txrx_bufs = tp3465_spi_txrx;
+spi-tp3465.c:	hw->base = devm_ioremap_resource(&pdev->dev, res);
+spi-tp3465.c:	if (IS_ERR(hw->base)) {
+spi-tp3465.c:		err = PTR_ERR(hw->base);
+spi-tp3465.c:	hw->imr = 0;		/* disable spi interrupts */
+spi-tp3465.c:    iowrite8(0, hw->base + TP3465_SPI_PD); /* all CS as output */
+spi-tp3465.c:    iowrite8(0x02, hw->base + TP3465_SPI_SKR); /* clk div 4 */
+spi-tp3465.c:	hw->irq = platform_get_irq(pdev, 0);
+spi-tp3465.c:	if (hw->irq >= 0) {
+spi-tp3465.c:		init_completion(&hw->done);
+spi-tp3465.c:		err = devm_request_irq(&pdev->dev, hw->irq, tp3465_spi_irq, 0,
+spi-tp3465.c:	err = spi_bitbang_start(&hw->bitbang);
+spi-tp3465.c:	dev_info(&pdev->dev, "base %p, irq %d\n", hw->base, hw->irq);
+spi-tp3465.c:	struct spi_master *master = hw->bitbang.master;
+spi-tp3465.c:	spi_bitbang_stop(&hw->bitbang);
diff -urN linux-4.4.13/drivers/spi/spi-tp3465.c linux-4.4.13-t030-20161102/drivers/spi/spi-tp3465.c
--- linux-4.4.13/drivers/spi/spi-tp3465.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-4.4.13-t030-20161102/drivers/spi/spi-tp3465.c	2016-08-27 22:54:04.000000000 +0200
@@ -0,0 +1,281 @@
+/*
+ * TP3465 SPI driver
+ *
+ * Copyright (C) 2016 Tobias Rathje
+ *
+ * Based on spi-altera.c, which is:
+ * Copyright (c) 2008 Thomas Chou <thomas@wytron.com.tw>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/interrupt.h>
+#include <linux/errno.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/spi/spi.h>
+#include <linux/spi/spi_bitbang.h>
+#include <linux/io.h>
+#include <linux/of.h>
+
+#define DRV_NAME "spi_tp3465"
+
+#define TP3465_SPI_SMB 0x0    /* second microwire byte register */
+#define TP3465_SPI_FMB 0x1    /* first microwire byte register */
+#define TP3465_SPI_FMBD0 0x2  /* first microwire byte dev0 register */
+#define TP3465_SPI_FMBD1 0x3  /* first microwire byte dev1 register */
+#define TP3465_SPI_FMBD2 0x4  /* first microwire byte dev2 register */
+#define TP3465_SPI_FMBD3 0x5  /* first microwire byte dev3 register */
+#define TP3465_SPI_FMBD4 0x6  /* first microwire byte dev4 register */
+#define TP3465_SPI_FMBD5 0x7  /* first microwire byte dev5 register */
+#define TP3465_SPI_FMBD6 0x8  /* first microwire byte dev6 register */
+#define TP3465_SPI_FMBD7 0x9  /* first microwire byte dev7 regiser */
+#define TP3465_SPI_CS  0xa    /* chip select register */
+#define TP3465_SPI_SKP 0xb    /* microwire clock polarity register */
+#define TP3465_SPI_MWM 0xc    /* microwire mode register */
+#define TP3465_SPI_SKR 0xd    /* microwire clock rate register */
+#define TP3465_SPI_ST 0xe     /* microwire status register */
+#define TP3465_SPI_PD 0xf     /* pin definition register */
+
+struct tp3465_spi {
+	/* bitbang has to be first */
+	struct spi_bitbang bitbang;
+	struct completion done;
+
+	void __iomem *base;
+	int irq;
+	int len;
+	int count;
+	int bytes_per_word;
+	unsigned long imr;
+
+	/* data buffers */
+	const unsigned char *tx;
+	unsigned char *rx;
+};
+
+static inline struct tp3465_spi *tp3465_spi_to_hw(struct spi_device *sdev)
+{
+	return spi_master_get_devdata(sdev->master);
+}
+
+static void tp3465_spi_chipsel(struct spi_device *spi, int value)
+{
+	struct tp3465_spi *hw = tp3465_spi_to_hw(spi);
+
+	switch (value) {
+	case BITBANG_CS_INACTIVE:
+        iowrite8(0xff, hw->base + TP3465_SPI_CS);
+		break;
+
+	case BITBANG_CS_ACTIVE:
+        switch (spi->chip_select)
+        {
+            case 0:
+                iowrite8(0xfe, hw->base + TP3465_SPI_CS);
+                break;
+            case 1:
+                iowrite8(0xfd, hw->base + TP3465_SPI_CS);
+		        break;
+            case 2:
+                iowrite8(0xfb, hw->base + TP3465_SPI_CS);
+		        break;
+            case 3:
+                iowrite8(0xf7, hw->base + TP3465_SPI_CS);
+		        break;
+        }
+	}
+}
+
+static inline unsigned int hw_txbyte(struct tp3465_spi *hw, int count)
+{
+	if (hw->tx) {
+		switch (hw->bytes_per_word) {
+		case 1:
+			return hw->tx[count];
+		case 2:
+			return (hw->tx[count * 2]
+				| (hw->tx[count * 2 + 1] << 8));
+		}
+	}
+	return 0;
+}
+
+static int tp3465_spi_txrx(struct spi_device *spi, struct spi_transfer *t)
+{
+	struct tp3465_spi *hw = tp3465_spi_to_hw(spi);
+
+	hw->tx = t->tx_buf;
+	hw->rx = t->rx_buf;
+	hw->count = 0;
+	hw->bytes_per_word = DIV_ROUND_UP(t->bits_per_word, 8);
+	hw->len = t->len / hw->bytes_per_word;
+
+	if (hw->irq >= 0) {
+        /* enable interrupts */ 
+        iowrite8(0x82, hw->base + TP3465_SPI_SKR);
+
+		/* send first byte */
+        iowrite8(hw_txbyte(hw, 0), hw->base + TP3465_SPI_FMB);
+
+        wait_for_completion(&hw->done);
+
+        /* disable interrupts */
+        iowrite8(0x02, hw->base + TP3465_SPI_SKR);
+	} else {
+		while (hw->count < hw->len) {
+			unsigned int rxd;
+
+			iowrite8(hw_txbyte(hw, hw->count),
+			       hw->base + TP3465_SPI_FMB);
+
+			while (!(ioread8(hw->base + TP3465_SPI_ST) & 0x80))
+				cpu_relax();
+
+			rxd = ioread8(hw->base + TP3465_SPI_FMB);
+
+			if (hw->rx) {
+				switch (hw->bytes_per_word) {
+				case 1:
+					hw->rx[hw->count] = rxd;
+					break;
+				case 2:
+					hw->rx[hw->count * 2] = rxd;
+					hw->rx[hw->count * 2 + 1] = rxd >> 8;
+					break;
+				}
+			}
+
+			hw->count++;
+		}
+	}
+
+	return hw->count * hw->bytes_per_word;
+}
+
+static irqreturn_t tp3465_spi_irq(int irq, void *dev)
+{
+	struct tp3465_spi *hw = dev;
+	unsigned int rxd;
+
+	rxd = ioread8(hw->base + TP3465_SPI_FMB);
+
+	if (hw->rx) {
+		switch (hw->bytes_per_word) {
+		case 1:
+			hw->rx[hw->count] = rxd;
+			break;
+		case 2:
+			hw->rx[hw->count * 2] = rxd;
+			hw->rx[hw->count * 2 + 1] = rxd >> 8;
+			break;
+		}
+	}
+
+	hw->count++;
+
+	if (hw->count < hw->len)
+		iowrite8(hw_txbyte(hw, hw->count), hw->base + TP3465_SPI_FMB);
+	else
+		complete(&hw->done);
+
+	return IRQ_HANDLED;
+}
+
+static int tp3465_spi_probe(struct platform_device *pdev)
+{
+	struct tp3465_spi *hw;
+	struct spi_master *master;
+	struct resource *res;
+	int err = -ENODEV;
+
+	master = spi_alloc_master(&pdev->dev, sizeof(struct tp3465_spi));
+	if (!master)
+		return err;
+
+	/* setup the master state. */
+	master->bus_num = pdev->id;
+	master->num_chipselect = 4;
+	master->mode_bits = SPI_CS_HIGH;
+	master->bits_per_word_mask = SPI_BPW_RANGE_MASK(1, 16);
+	master->dev.of_node = pdev->dev.of_node;
+
+	hw = spi_master_get_devdata(master);
+	platform_set_drvdata(pdev, hw);
+
+	/* setup the state for the bitbang driver */
+	hw->bitbang.master = master;
+	hw->bitbang.chipselect = tp3465_spi_chipsel;
+	hw->bitbang.txrx_bufs = tp3465_spi_txrx;
+
+	/* find and map our resources */
+	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+	hw->base = devm_ioremap_resource(&pdev->dev, res);
+	if (IS_ERR(hw->base)) {
+		err = PTR_ERR(hw->base);
+		goto exit;
+	}
+
+	/* program defaults into the registers */
+	hw->imr = 0;		/* disable spi interrupts */
+    iowrite8(0, hw->base + TP3465_SPI_PD); /* all CS as output */
+    iowrite8(0x02, hw->base + TP3465_SPI_SKR); /* clk div 4 */
+
+	/* irq is optional */
+	hw->irq = platform_get_irq(pdev, 0);
+	if (hw->irq >= 0) {
+		init_completion(&hw->done);
+		err = devm_request_irq(&pdev->dev, hw->irq, tp3465_spi_irq, 0,
+				       pdev->name, hw);
+		if (err)
+			goto exit;
+	}
+
+	/* register our spi controller */
+	err = spi_bitbang_start(&hw->bitbang);
+	if (err)
+		goto exit;
+	dev_info(&pdev->dev, "base %p, irq %d\n", hw->base, hw->irq);
+
+	return 0;
+exit:
+	spi_master_put(master);
+	return err;
+}
+
+static int tp3465_spi_remove(struct platform_device *dev)
+{
+	struct tp3465_spi *hw = platform_get_drvdata(dev);
+	struct spi_master *master = hw->bitbang.master;
+
+	spi_bitbang_stop(&hw->bitbang);
+	spi_master_put(master);
+	return 0;
+}
+
+#ifdef CONFIG_OF
+static const struct of_device_id tp3465_spi_match[] = {
+	{ .compatible = "TP3465,spi-1.0", },
+	{ .compatible = "tp3465,spi-1.0", },
+	{},
+};
+MODULE_DEVICE_TABLE(of, tp3465_spi_match);
+#endif /* CONFIG_OF */
+
+static struct platform_driver tp3465_spi_driver = {
+	.probe = tp3465_spi_probe,
+	.remove = tp3465_spi_remove,
+	.driver = {
+		.name = DRV_NAME,
+		.pm = NULL,
+		.of_match_table = of_match_ptr(tp3465_spi_match),
+	},
+};
+module_platform_driver(tp3465_spi_driver);
+
+MODULE_DESCRIPTION("TP3465 SPI driver");
+MODULE_AUTHOR("Tobias Rathje");
+MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:" DRV_NAME);
diff -urN linux-4.4.13/drivers/tty/serial/Kconfig linux-4.4.13-t030-20161102/drivers/tty/serial/Kconfig
--- linux-4.4.13/drivers/tty/serial/Kconfig	2016-06-08 03:14:51.000000000 +0200
+++ linux-4.4.13-t030-20161102/drivers/tty/serial/Kconfig	2016-06-28 12:40:10.000000000 +0200
@@ -1075,6 +1075,13 @@
 	depends on SERIAL_ETRAXFS
 	select SERIAL_CORE_CONSOLE
 
+config SERIAL_MC68901
+    bool "MC68901 serial port support"
+    select SERIAL_CORE
+	select SERIAL_CORE_CONSOLE
+    help
+        Support for MC68901 MFP UART
+
 config SERIAL_NETX
 	tristate "NetX serial port support"
 	depends on ARCH_NETX
diff -urN linux-4.4.13/drivers/tty/serial/Makefile linux-4.4.13-t030-20161102/drivers/tty/serial/Makefile
--- linux-4.4.13/drivers/tty/serial/Makefile	2016-06-08 03:14:51.000000000 +0200
+++ linux-4.4.13-t030-20161102/drivers/tty/serial/Makefile	2016-06-27 23:36:09.000000000 +0200
@@ -62,6 +62,7 @@
 obj-$(CONFIG_SERIAL_ATMEL) += atmel_serial.o
 obj-$(CONFIG_SERIAL_UARTLITE) += uartlite.o
 obj-$(CONFIG_SERIAL_MSM) += msm_serial.o
+obj-$(CONFIG_SERIAL_MC68901) += serial_mc68901.o
 obj-$(CONFIG_SERIAL_NETX) += netx-serial.o
 obj-$(CONFIG_SERIAL_OF_PLATFORM) += of_serial.o
 obj-$(CONFIG_SERIAL_OF_PLATFORM_NWPSERIAL) += nwpserial.o
diff -urN linux-4.4.13/drivers/tty/serial/serial_mc68901.c linux-4.4.13-t030-20161102/drivers/tty/serial/serial_mc68901.c
--- linux-4.4.13/drivers/tty/serial/serial_mc68901.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-4.4.13-t030-20161102/drivers/tty/serial/serial_mc68901.c	2016-08-22 11:18:42.000000000 +0200
@@ -0,0 +1,401 @@
+/*
+ * MC68901 serial driver
+ * 
+ * (c) 2016 Tobias Rathje
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include <linux/device.h>
+#include <linux/module.h>
+#include <linux/ioport.h>
+#include <linux/init.h>
+#include <linux/console.h>
+#include <linux/sysrq.h>
+#include <linux/platform_device.h>
+#include <linux/tty.h>
+#include <linux/tty_flip.h>
+#include <linux/serial_core.h>
+#include <linux/serial.h>
+
+#include <asm/io.h>
+#include <asm/irq.h>
+
+#define DRIVER_NAME "mc68901-serial"
+
+#define UART_CLK 153600
+
+#define PORT_SER901 114
+
+/* We just use the major/minor numbers from the 8250 driver */
+#define MINOR_START	64
+
+enum uart_regs {
+	UART_UCR             = 0x14,
+	UART_RSR             = 0x15,
+	UART_TSR             = 0x16,
+	UART_UDR             = 0x17,
+};
+
+#define RSR_BE (1<<3)
+#define RSR_FE (1<<4)
+#define RSR_PE (1<<5)
+#define RSR_OE (1<<6)
+
+struct ser901_port {
+	struct uart_port	port;
+};
+
+static struct ser901_port ser901_ports[1];
+
+static void ser901_stop_tx(struct uart_port *port)
+{
+    /* Not implemented */
+}
+
+static void ser901_stop_rx(struct uart_port *port)
+{
+    /* Not implemented */
+}
+
+static void ser901_enable_ms(struct uart_port *port)
+{
+    /* Not implemented */
+}
+
+static void ser901_uart_putchar(struct uart_port *port, int ch)
+{
+    while (!(ioread8(port->membase + UART_TSR) & 0x80))
+        cpu_relax();
+
+    iowrite8(ch, port->membase + UART_UDR);
+}
+
+static void ser901_start_tx(struct uart_port *port)
+{
+    struct circ_buf *xmit = &port->state->xmit;
+
+    while (!uart_circ_empty(xmit)) {
+        ser901_uart_putchar(port, xmit->buf[xmit->tail]);
+        xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
+        port->icount.tx++;
+    }
+}
+
+static unsigned int ser901_tx_empty(struct uart_port *port)
+{
+    if (ioread8(port->membase + UART_TSR) & 0x80)
+        return 1;
+    else
+        return 0;
+}
+
+static irqreturn_t ser901_int(int irq, void *dev_id)
+{
+    unsigned char ch, status, flag;
+	struct uart_port *port = dev_id;
+
+    ch = ioread8(port->membase + UART_UDR); 
+    status = ioread8(port->membase + UART_RSR);
+
+    flag = TTY_NORMAL;
+    port->icount.rx++;
+
+    if (unlikely(status & (RSR_FE | RSR_PE | RSR_OE))) {
+
+        if (status & RSR_PE)
+            port->icount.parity++;
+        else if (status & RSR_FE)
+            port->icount.frame++;
+        if (status & RSR_OE)
+            port->icount.overrun++;
+
+        status &= port->read_status_mask;
+
+        if (status & RSR_BE)
+            flag = TTY_BREAK;
+        else if (status & RSR_PE)
+            flag = TTY_PARITY;
+        else if (status & RSR_FE)
+            flag = TTY_FRAME;
+    }
+    
+    uart_insert_char(port, status, 0, ch, flag);
+
+    spin_unlock(&port->lock);
+	tty_flip_buffer_push(&port->state->port);
+    spin_lock(&port->lock);
+
+    return IRQ_HANDLED;
+}
+
+static unsigned int ser901_get_mctrl(struct uart_port *port)
+{
+    return TIOCM_CTS | TIOCM_DSR | TIOCM_CAR;
+}
+
+static void ser901_set_mctrl(struct uart_port *port, unsigned int mctrl)
+{
+    /* Not implemented */
+}
+
+static void ser901_break_ctl(struct uart_port *port, int break_state)
+{
+    /* Not implemented */
+}
+
+static int ser901_startup(struct uart_port *port)
+{
+	int ret;
+
+	ret = request_irq(port->irq, ser901_int, 0,
+			     DRIVER_NAME, port);
+	if (ret) {
+		dev_err(port->dev, "unable to grab irq %d\n",port->irq);
+		return -EBUSY;
+	}
+
+	return ret;
+}
+
+static void ser901_shutdown(struct uart_port *port)
+{
+	free_irq(port->irq, port);
+}
+
+static void
+ser901_set_termios(struct uart_port *port, struct ktermios *termios,
+		   struct ktermios *old)
+{
+    /* Not implemented */
+}
+
+static const char *ser901_type(struct uart_port *port)
+{
+	return port->type == PORT_SER901 ? "SER901" : NULL;
+}
+
+static void ser901_release_port(struct uart_port *port)
+{
+}
+
+static int ser901_request_port(struct uart_port *port)
+{
+    return 0;
+}
+
+static void ser901_config_port(struct uart_port *port, int flags)
+{
+	if (flags & UART_CONFIG_TYPE && ser901_request_port(port) == 0)
+		port->type = PORT_SER901;
+}
+
+static int
+ser901_verify_port(struct uart_port *port, struct serial_struct *ser)
+{
+	int ret = 0;
+
+	if (ser->type != PORT_UNKNOWN && ser->type != PORT_SER901)
+		ret = -EINVAL;
+
+	return ret;
+}
+
+static struct uart_ops ser901_pops = {
+	.tx_empty	= ser901_tx_empty,
+	.set_mctrl	= ser901_set_mctrl,
+	.get_mctrl	= ser901_get_mctrl,
+	.stop_tx	= ser901_stop_tx,
+	.start_tx	= ser901_start_tx,
+	.stop_rx	= ser901_stop_rx,
+	.enable_ms	= ser901_enable_ms,
+	.break_ctl	= ser901_break_ctl,
+	.startup	= ser901_startup,
+	.shutdown	= ser901_shutdown,
+	.set_termios	= ser901_set_termios,
+	.type		= ser901_type,
+	.release_port	= ser901_release_port,
+	.request_port	= ser901_request_port,
+	.config_port	= ser901_config_port,
+	.verify_port	= ser901_verify_port,
+};
+
+static void ser901_console_putchar(struct uart_port *port, int ch)
+{
+    while (!(ioread8(port->membase + UART_TSR) & 0x80))
+        cpu_relax();
+    
+    iowrite8(ch, port->membase + UART_UDR);
+}
+
+static void
+ser901_console_write(struct console *co, const char *s, unsigned int count)
+{
+	struct uart_port *port = &ser901_ports[co->index].port;
+    unsigned long flags;
+
+    spin_lock_irqsave(&port->lock, flags);
+	uart_console_write(port, s, count, ser901_console_putchar);
+    spin_unlock_irqrestore(&port->lock, flags);
+}
+
+static int __init
+ser901_console_setup(struct console *co, char *options)
+{
+	struct uart_port *port = &ser901_ports[co->index].port;
+
+    if (port->membase == NULL) {
+        /* Port not initialized yet - delay setup */
+        return -ENODEV;
+    }
+    
+    return 0;
+}
+
+static struct uart_driver ser901_reg;
+static struct console ser901_console = {
+	.name		= "ttyS",
+	.write		= ser901_console_write,
+	.device		= uart_console_device,
+	.setup		= ser901_console_setup,
+	.flags		= CON_PRINTBUFFER,
+	.index		= -1,
+	.data		= &ser901_reg,
+};
+
+static int __init ser901_console_init(void)
+{
+	register_console(&ser901_console);
+	return 0;
+}
+console_initcall(ser901_console_init);
+
+static struct uart_driver ser901_reg = {
+	.owner          = THIS_MODULE,
+	.driver_name    = DRIVER_NAME,
+	.dev_name       = "ttyS",
+	.major          = TTY_MAJOR,
+	.minor          = MINOR_START,
+	.nr             = ARRAY_SIZE(ser901_ports),
+	.cons           = &ser901_console,
+};
+
+static int serial_ser901_suspend(struct platform_device *pdev, pm_message_t state)
+{
+	struct ser901_port *sport = platform_get_drvdata(pdev);
+
+	if (sport)
+		uart_suspend_port(&ser901_reg, &sport->port);
+
+	return 0;
+}
+
+static int serial_ser901_resume(struct platform_device *pdev)
+{
+	struct ser901_port *sport = platform_get_drvdata(pdev);
+
+	if (sport)
+		uart_resume_port(&ser901_reg, &sport->port);
+
+	return 0;
+}
+
+static int serial_ser901_probe(struct platform_device *pdev)
+{
+	struct uart_port *port = &ser901_ports[pdev->id].port;
+    struct resource *res_mem, *res_irq;
+
+	dev_info(&pdev->dev, "initialising\n");
+
+	port->dev = &pdev->dev;
+
+    res_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+    if (res_mem)
+        port->mapbase = res_mem->start;
+    else
+        return -ENODEV;
+
+    res_irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
+    if (res_irq)
+        port->irq = res_irq->start;
+    else
+        return -ENODEV;
+
+    port->membase = ioremap(port->mapbase, 32);
+    port->uartclk = UART_CLK;
+
+    port->iotype = UPIO_MEM;
+    port->flags = UPF_BOOT_AUTOCONF;
+    port->line = pdev->id;
+    port->ops = &ser901_pops;
+    port->fifosize = 1;
+
+	uart_add_one_port(&ser901_reg, &ser901_ports[pdev->id].port);
+	platform_set_drvdata(pdev, &ser901_ports[pdev->id]);
+
+	return 0;
+}
+
+static int serial_ser901_remove(struct platform_device *pdev)
+{
+	struct ser901_port *sport = platform_get_drvdata(pdev);
+
+	if (sport)
+		uart_remove_one_port(&ser901_reg, &sport->port);
+
+	return 0;
+}
+
+static struct platform_driver serial_ser901_driver = {
+	.probe          = serial_ser901_probe,
+	.remove         = serial_ser901_remove,
+
+	.suspend	= serial_ser901_suspend,
+	.resume		= serial_ser901_resume,
+
+	.driver		= {
+		.name   = DRIVER_NAME,
+	},
+};
+
+static int __init ser901_serial_init(void)
+{
+	int ret;
+
+	printk(KERN_INFO "MC68901 serial driver (c) 2016 Tobias Rathje\n");
+
+	ret = uart_register_driver(&ser901_reg);
+	if (ret)
+		return ret;
+
+	ret = platform_driver_register(&serial_ser901_driver);
+	if (ret != 0)
+		uart_unregister_driver(&ser901_reg);
+
+	return 0;
+}
+
+static void __exit ser901_serial_exit(void)
+{
+	platform_driver_unregister(&serial_ser901_driver);
+	uart_unregister_driver(&ser901_reg);
+}
+
+module_init(ser901_serial_init);
+module_exit(ser901_serial_exit);
+
+MODULE_AUTHOR("Tobias Rathje");
+MODULE_DESCRIPTION("MC68901 serial driver");
+MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:" DRIVER_NAME);
