Reinhard Russinger 7 years ago
commit
3171ae66cf
87 changed files with 16492 additions and 0 deletions
  1. 1 0
      .gitignore
  2. 41 0
      001-PSG_add_CrossCompile_sh.patch
  3. 6 0
      Config.in
  4. 17 0
      MakeBuildrootEnv.sh
  5. 1134 0
      board/PSG/iot2000/busybox.config
  6. 31 0
      board/PSG/iot2000/genimage.cfg
  7. 11 0
      board/PSG/iot2000/grub.cfg
  8. 68 0
      board/PSG/iot2000/linux-4.4-patches/0001-stmmac-Add-support-for-SIMATIC-IOT2000-platform.patch
  9. 33 0
      board/PSG/iot2000/linux-4.4-patches/0002-serial-uapi-Add-support-for-bus-termination.patch
  10. 103 0
      board/PSG/iot2000/linux-4.4-patches/0003-serial-8250_pci-Use-symbolic-constants-for-EXAR-s-MP.patch
  11. 32 0
      board/PSG/iot2000/linux-4.4-patches/0004-serial-8250_pci-Fix-EXAR-feature-control-register-co.patch
  12. 176 0
      board/PSG/iot2000/linux-4.4-patches/0005-serial-8250_pci-Add-support-for-IOT2000-platform.patch
  13. 152 0
      board/PSG/iot2000/linux-4.4-patches/0006-serial-8250_pci-Add-support-for-red-user-LED-on-IOT2.patch
  14. 67 0
      board/PSG/iot2000/linux-4.4-patches/0007-spi-pxa2xx-Factor-out-handle_bad_msg.patch
  15. 41 0
      board/PSG/iot2000/linux-4.4-patches/0008-spi-pxa2xx-Prepare-for-edge-triggered-interrupts.patch
  16. 39 0
      board/PSG/iot2000/linux-4.4-patches/0009-spi-pca2xx-pci-Allow-MSI.patch
  17. 129 0
      board/PSG/iot2000/linux-4.4-patches/0010-efi-Move-efi_status_to_err-to-drivers-firmware-efi.patch
  18. 431 0
      board/PSG/iot2000/linux-4.4-patches/0011-efi-Add-capsule-update-support.patch
  19. 69 0
      board/PSG/iot2000/linux-4.4-patches/0012-x86-efi-Force-EFI-reboot-to-process-pending-capsules.patch
  20. 425 0
      board/PSG/iot2000/linux-4.4-patches/0013-efi-Add-misc-char-driver-interface-to-update-EFI-fir.patch
  21. 130 0
      board/PSG/iot2000/linux-4.4-patches/0014-efi-capsule-Make-efi_capsule_pending-lockless.patch
  22. 101 0
      board/PSG/iot2000/linux-4.4-patches/0015-efi-capsule-Move-capsule-to-the-stack-in-efi_capsule.patch
  23. 93 0
      board/PSG/iot2000/linux-4.4-patches/0016-efi-capsule-Allocate-whole-capsule-into-virtual-memo.patch
  24. 40 0
      board/PSG/iot2000/linux-4.4-patches/0017-efi-capsule-Fix-return-code-on-failing-kmap-vmap.patch
  25. 70 0
      board/PSG/iot2000/linux-4.4-patches/0018-efi-capsule-Remove-pr_debug-on-ENOMEM-or-EFAULT.patch
  26. 88 0
      board/PSG/iot2000/linux-4.4-patches/0019-efi-capsule-Clean-up-pr_err-info-messages.patch
  27. 34 0
      board/PSG/iot2000/linux-4.4-patches/0020-efi-capsule-Adjust-return-type-of-efi_capsule_setup_.patch
  28. 128 0
      board/PSG/iot2000/linux-4.4-patches/0021-efi-capsule-loader-Use-a-cached-copy-of-the-capsule-.patch
  29. 144 0
      board/PSG/iot2000/linux-4.4-patches/0022-efi-capsule-loader-Redirect-calls-to-efi_capsule_set.patch
  30. 114 0
      board/PSG/iot2000/linux-4.4-patches/0023-efi-capsule-loader-Use-page-addresses-rather-than-st.patch
  31. 202 0
      board/PSG/iot2000/linux-4.4-patches/0024-efi-capsule-Add-support-for-Quark-security-header.patch
  32. 77 0
      board/PSG/iot2000/linux-4.4-patches/0025-mfd-intel_quark_i2c_gpio-Use-dmi_system_id-table-for.patch
  33. 45 0
      board/PSG/iot2000/linux-4.4-patches/0026-mfd-intel_quark_i2c_gpio-Add-support-for-SIMATIC-IOT.patch
  34. 44 0
      board/PSG/iot2000/linux-4.4-patches/0027-iot2000-hack-Work-around-DSDT-mistake.patch
  35. 95 0
      board/PSG/iot2000/linux-4.4-patches/0028-gpio-pca953x-provide-GPIO-base-based-on-_UID.patch
  36. 497 0
      board/PSG/iot2000/linux-4.4-patches/0029-staging-iio-add-support-for-ADC1x8s102.patch
  37. 154 0
      board/PSG/iot2000/linux-4.4-patches/0030-adc1x8s102-support-ACPI-based-enumeration.patch
  38. 373 0
      board/PSG/iot2000/linux-4.4-patches/0031-gpio-pca953x-add-drive-property.patch
  39. 939 0
      board/PSG/iot2000/linux-4.4-patches/0032-pca9685-PCA9685-PWM-and-GPIO-multi-function-device.patch
  40. 36 0
      board/PSG/iot2000/linux-4.4-patches/0033-spi-pxa2xx-fixed-ACPI-based-enumeration-of-SPI-devic.patch
  41. 1218 0
      board/PSG/iot2000/linux-4.4-patches/0034-acpi-added-a-custom-DSDT-file.patch
  42. 4499 0
      board/PSG/iot2000/linux-4.4.config
  43. 2 0
      board/PSG/iot2000/post-build.sh
  44. 13 0
      board/PSG/iot2000/post-image.sh
  45. 119 0
      board/PSG/iot2000/rootfs_overlay/etc/dhcp/dhcpd.conf
  46. 36 0
      board/PSG/iot2000/rootfs_overlay/etc/init.d/S09modload
  47. 38 0
      board/PSG/iot2000/rootfs_overlay/etc/init.d/S99CamProcess
  48. 39 0
      board/PSG/iot2000/rootfs_overlay/etc/init.d/S99TestBus
  49. 28 0
      board/PSG/iot2000/rootfs_overlay/etc/init.d/rcS
  50. 1349 0
      board/PSG/iot2000/rootfs_overlay/etc/joe/joerc
  51. 3 0
      board/PSG/iot2000/rootfs_overlay/etc/modules-load.galileo/galileo.conf
  52. 4 0
      board/PSG/iot2000/rootfs_overlay/etc/modules-load.galileo/galileo_gen2.conf
  53. 4 0
      board/PSG/iot2000/rootfs_overlay/etc/modules-load.galileo/simatic_iot2000.conf
  54. 24 0
      board/PSG/iot2000/rootfs_overlay/etc/network/interfaces
  55. 118 0
      board/PSG/iot2000/rootfs_overlay/etc/ssh/sshd_config
  56. BIN
      board/PSG/iot2000/rootfs_overlay/root/a.out
  57. 23 0
      board/PSG/iot2000/rootfs_overlay/root/gadget.sh
  58. 163 0
      configs/iot2000_defconfig
  59. 2 0
      external.desc
  60. 1 0
      external.mk
  61. 8 0
      package/adc1x8s102/Config.in
  62. 8 0
      package/adc1x8s102/adc1x8s102.mk
  63. 340 0
      package/adc1x8s102/src/COPYING
  64. 14 0
      package/adc1x8s102/src/Makefile
  65. 438 0
      package/adc1x8s102/src/adc1x8s102.c
  66. 30 0
      package/adc1x8s102/src/adc1x8s102.h
  67. 8 0
      package/galileo-spi1-spidev/Config.in
  68. 8 0
      package/galileo-spi1-spidev/galileo-spi1-spidev.mk
  69. 340 0
      package/galileo-spi1-spidev/src/COPYING
  70. 14 0
      package/galileo-spi1-spidev/src/Makefile
  71. 72 0
      package/galileo-spi1-spidev/src/galileo-spi1-spidev.c
  72. 8 0
      package/galileo-uio-gpio/Config.in
  73. 8 0
      package/galileo-uio-gpio/galileo-uio-gpio.mk
  74. 340 0
      package/galileo-uio-gpio/src/COPYING
  75. 14 0
      package/galileo-uio-gpio/src/Makefile
  76. 108 0
      package/galileo-uio-gpio/src/galileo-uio-gpio.c
  77. 8 0
      package/galileogen2-fake/Config.in
  78. 8 0
      package/galileogen2-fake/galileogen2-fake.mk
  79. 340 0
      package/galileogen2-fake/src/COPYING
  80. 14 0
      package/galileogen2-fake/src/Makefile
  81. 47 0
      package/galileogen2-fake/src/galileogen2-fake.c
  82. 6 0
      package/switchserialmode/Config.in
  83. 17 0
      package/switchserialmode/src/Makefile
  84. 144 0
      package/switchserialmode/src/switchserialmode.c
  85. 18 0
      package/switchserialmode/switchserialmode.mk
  86. 21 0
      package/wt/Config.in
  87. 18 0
      package/wt/wt.mk

+ 1 - 0
.gitignore

@@ -0,0 +1 @@
+*~

+ 41 - 0
001-PSG_add_CrossCompile_sh.patch

@@ -0,0 +1,41 @@
+diff --git a/CrossCompile.sh b/CrossCompile.sh
+new file mode 100755
+index 0000000..021beb2
+--- /dev/null
++++ b/CrossCompile.sh
+@@ -0,0 +1,35 @@
++#! /bin/bash
++#
++#
++
++WRKDIR=`pwd`
++CMDDIR=`dirname $0`
++cd $CMDDIR
++
++TOOLCHAIN=`grep BR2_HOST_DIR .config | awk -F\= -F\" '{print $2}'`
++echo $TOOLCHAIN
++
++if [[ $TOOLCHAIN = *\$\(BASE_DIR\)* ]]; then
++	export SYSROOTBIN=`readlink -f $CMDDIR`/output/host/usr/bin/
++else
++	export SYSROOTBIN=$TOOLCHAIN/usr/bin
++fi
++
++export PATH=$PATH:$SYSROOTBIN
++
++export CROSS_COMPILE=i586-buildroot-linux-gnu-
++export ARCH=arm
++export KERNELDIR=`pwd`/output/build/linux-linux-4.4.y
++export BB_KERNEL_SOURCES=$KERNELDIR
++export SYSROOT=`grep BR2_HOST_DIR .config | awk -F\= -F\" '{print $2}'`/usr/i586-buildroot-linux-gnu/sysroot
++export CC_FULLPATH="${SYSROOTBIN}${CROSS_COMPILE}"
++export CC=${CROSS_COMPILE}gcc
++export CXX=${CROSS_COMPILE}g++
++
++cd $WRKDIR
++if [ $# -eq "0" ] 
++then
++PROMPT_COMMAND='PS1="\[\033[0;31m\]CROSS CC:\[\033[0;32m\]$PS1";unset PROMPT_COMMAND' bash ; reset
++else
++$1
++fi

+ 6 - 0
Config.in

@@ -0,0 +1,6 @@
+source "$BR2_EXTERNAL_PSG_IOT2000_PATH/package/wt/Config.in"
+source "$BR2_EXTERNAL_PSG_IOT2000_PATH/package/switchserialmode/Config.in"
+source "$BR2_EXTERNAL_PSG_IOT2000_PATH/package/galileo-spi1-spidev/Config.in"
+source "$BR2_EXTERNAL_PSG_IOT2000_PATH/package/galileo-uio-gpio/Config.in"
+source "$BR2_EXTERNAL_PSG_IOT2000_PATH/package/galileogen2-fake/Config.in"
+source "$BR2_EXTERNAL_PSG_IOT2000_PATH/package/adc1x8s102/Config.in"

+ 17 - 0
MakeBuildrootEnv.sh

@@ -0,0 +1,17 @@
+#!/bin/bash
+PSGWRKDIR=`pwd`
+cd ..
+rm -rf buildroot
+git clone git://git.buildroot.net/buildroot
+cd buildroot
+#git checkout 63a20d5dfebe83e2b2bd683dc78ebdf787dff100 -b gfawrk
+git checkout master -b gfawrk
+#==== Patches
+patch -p1 < ../PSG/001-PSG_add_CrossCompile_sh.patch
+#
+chmod a+x *.sh
+cp ../PSG/configs/* ./configs
+git add .
+git commit -m "PSG wrk changes and setup"
+make  BR2_EXTERNAL=../PSG iot2000_defconfig
+cd $PSGWRKDIR

+ 1134 - 0
board/PSG/iot2000/busybox.config

@@ -0,0 +1,1134 @@
+#
+# Automatically generated make config: don't edit
+# Busybox version: 1.27.1
+# Sun Jul 30 15:27:03 2017
+#
+CONFIG_HAVE_DOT_CONFIG=y
+
+#
+# Busybox Settings
+#
+CONFIG_DESKTOP=y
+# CONFIG_EXTRA_COMPAT is not set
+CONFIG_INCLUDE_SUSv2=y
+# CONFIG_USE_PORTABLE_CODE is not set
+CONFIG_SHOW_USAGE=y
+CONFIG_FEATURE_VERBOSE_USAGE=y
+# CONFIG_FEATURE_COMPRESS_USAGE is not set
+CONFIG_BUSYBOX=y
+CONFIG_FEATURE_INSTALLER=y
+# CONFIG_INSTALL_NO_USR is not set
+# CONFIG_PAM is not set
+CONFIG_LONG_OPTS=y
+CONFIG_FEATURE_DEVPTS=y
+# CONFIG_FEATURE_CLEAN_UP is not set
+CONFIG_FEATURE_UTMP=y
+CONFIG_FEATURE_WTMP=y
+# CONFIG_FEATURE_PIDFILE is not set
+CONFIG_PID_FILE_PATH=""
+CONFIG_FEATURE_SUID=y
+# CONFIG_FEATURE_SUID_CONFIG is not set
+# CONFIG_FEATURE_SUID_CONFIG_QUIET is not set
+# CONFIG_SELINUX is not set
+# CONFIG_FEATURE_PREFER_APPLETS is not set
+CONFIG_BUSYBOX_EXEC_PATH="/proc/self/exe"
+CONFIG_FEATURE_SYSLOG=y
+# CONFIG_FEATURE_HAVE_RPC is not set
+CONFIG_PLATFORM_LINUX=y
+
+#
+# Build Options
+#
+# CONFIG_STATIC is not set
+# CONFIG_PIE is not set
+# CONFIG_NOMMU is not set
+# CONFIG_BUILD_LIBBUSYBOX is not set
+# CONFIG_FEATURE_INDIVIDUAL is not set
+# CONFIG_FEATURE_SHARED_BUSYBOX is not set
+CONFIG_LFS=y
+CONFIG_CROSS_COMPILER_PREFIX=""
+CONFIG_SYSROOT=""
+CONFIG_EXTRA_CFLAGS=""
+CONFIG_EXTRA_LDFLAGS=""
+CONFIG_EXTRA_LDLIBS=""
+
+#
+# Installation Options ("make install" behavior)
+#
+CONFIG_INSTALL_APPLET_SYMLINKS=y
+# CONFIG_INSTALL_APPLET_HARDLINKS is not set
+# CONFIG_INSTALL_APPLET_SCRIPT_WRAPPERS is not set
+# CONFIG_INSTALL_APPLET_DONT is not set
+# CONFIG_INSTALL_SH_APPLET_SYMLINK is not set
+# CONFIG_INSTALL_SH_APPLET_HARDLINK is not set
+# CONFIG_INSTALL_SH_APPLET_SCRIPT_WRAPPER is not set
+CONFIG_PREFIX="./_install"
+
+#
+# Debugging Options
+#
+# CONFIG_DEBUG is not set
+# CONFIG_DEBUG_PESSIMIZE is not set
+# CONFIG_DEBUG_SANITIZE is not set
+# CONFIG_UNIT_TEST is not set
+# CONFIG_WERROR is not set
+CONFIG_NO_DEBUG_LIB=y
+# CONFIG_DMALLOC is not set
+# CONFIG_EFENCE is not set
+
+#
+# Busybox Library Tuning
+#
+# CONFIG_FEATURE_USE_BSS_TAIL is not set
+CONFIG_FEATURE_RTMINMAX=y
+CONFIG_FEATURE_BUFFERS_USE_MALLOC=y
+# CONFIG_FEATURE_BUFFERS_GO_ON_STACK is not set
+# CONFIG_FEATURE_BUFFERS_GO_IN_BSS is not set
+CONFIG_PASSWORD_MINLEN=6
+CONFIG_MD5_SMALL=1
+CONFIG_SHA3_SMALL=1
+# CONFIG_FEATURE_FAST_TOP is not set
+# CONFIG_FEATURE_ETC_NETWORKS is not set
+CONFIG_FEATURE_EDITING=y
+CONFIG_FEATURE_EDITING_MAX_LEN=1024
+CONFIG_FEATURE_EDITING_VI=y
+CONFIG_FEATURE_EDITING_HISTORY=999
+CONFIG_FEATURE_EDITING_SAVEHISTORY=y
+# CONFIG_FEATURE_EDITING_SAVE_ON_EXIT is not set
+CONFIG_FEATURE_REVERSE_SEARCH=y
+CONFIG_FEATURE_TAB_COMPLETION=y
+# CONFIG_FEATURE_USERNAME_COMPLETION is not set
+CONFIG_FEATURE_EDITING_FANCY_PROMPT=y
+# CONFIG_FEATURE_EDITING_ASK_TERMINAL is not set
+# CONFIG_LOCALE_SUPPORT is not set
+# CONFIG_UNICODE_SUPPORT is not set
+# CONFIG_UNICODE_USING_LOCALE is not set
+# CONFIG_FEATURE_CHECK_UNICODE_IN_ENV is not set
+CONFIG_SUBST_WCHAR=0
+CONFIG_LAST_SUPPORTED_WCHAR=0
+# CONFIG_UNICODE_COMBINING_WCHARS is not set
+# CONFIG_UNICODE_WIDE_WCHARS is not set
+# CONFIG_UNICODE_BIDI_SUPPORT is not set
+# CONFIG_UNICODE_NEUTRAL_TABLE is not set
+# CONFIG_UNICODE_PRESERVE_BROKEN is not set
+CONFIG_FEATURE_NON_POSIX_CP=y
+# CONFIG_FEATURE_VERBOSE_CP_MESSAGE is not set
+CONFIG_FEATURE_USE_SENDFILE=y
+CONFIG_FEATURE_COPYBUF_KB=4
+CONFIG_FEATURE_SKIP_ROOTFS=y
+CONFIG_MONOTONIC_SYSCALL=y
+CONFIG_IOCTL_HEX2STR_ERROR=y
+CONFIG_FEATURE_HWIB=y
+
+#
+# Applets
+#
+
+#
+# Archival Utilities
+#
+# CONFIG_FEATURE_SEAMLESS_XZ is not set
+# CONFIG_FEATURE_SEAMLESS_LZMA is not set
+# CONFIG_FEATURE_SEAMLESS_BZ2 is not set
+# CONFIG_FEATURE_SEAMLESS_GZ is not set
+# CONFIG_FEATURE_SEAMLESS_Z is not set
+CONFIG_AR=y
+# CONFIG_FEATURE_AR_LONG_FILENAMES is not set
+CONFIG_FEATURE_AR_CREATE=y
+# CONFIG_UNCOMPRESS is not set
+CONFIG_GUNZIP=y
+CONFIG_ZCAT=y
+CONFIG_FEATURE_GUNZIP_LONG_OPTIONS=y
+CONFIG_BUNZIP2=y
+CONFIG_BZCAT=y
+CONFIG_UNLZMA=y
+CONFIG_LZCAT=y
+CONFIG_LZMA=y
+# CONFIG_FEATURE_LZMA_FAST is not set
+CONFIG_UNXZ=y
+CONFIG_XZCAT=y
+CONFIG_XZ=y
+# CONFIG_BZIP2 is not set
+CONFIG_FEATURE_BZIP2_DECOMPRESS=y
+CONFIG_CPIO=y
+# CONFIG_FEATURE_CPIO_O is not set
+# CONFIG_FEATURE_CPIO_P is not set
+# CONFIG_DPKG is not set
+# CONFIG_DPKG_DEB is not set
+CONFIG_GZIP=y
+# CONFIG_FEATURE_GZIP_LONG_OPTIONS is not set
+CONFIG_GZIP_FAST=0
+# CONFIG_FEATURE_GZIP_LEVELS is not set
+CONFIG_FEATURE_GZIP_DECOMPRESS=y
+# CONFIG_LZOP is not set
+CONFIG_UNLZOP=y
+CONFIG_LZOPCAT=y
+# CONFIG_LZOP_COMPR_HIGH is not set
+# CONFIG_RPM2CPIO is not set
+# CONFIG_RPM is not set
+CONFIG_TAR=y
+CONFIG_FEATURE_TAR_LONG_OPTIONS=y
+CONFIG_FEATURE_TAR_CREATE=y
+# CONFIG_FEATURE_TAR_AUTODETECT is not set
+CONFIG_FEATURE_TAR_FROM=y
+# CONFIG_FEATURE_TAR_OLDGNU_COMPATIBILITY is not set
+# CONFIG_FEATURE_TAR_OLDSUN_COMPATIBILITY is not set
+CONFIG_FEATURE_TAR_GNU_EXTENSIONS=y
+CONFIG_FEATURE_TAR_TO_COMMAND=y
+# CONFIG_FEATURE_TAR_UNAME_GNAME is not set
+# CONFIG_FEATURE_TAR_NOPRESERVE_TIME is not set
+# CONFIG_FEATURE_TAR_SELINUX is not set
+CONFIG_UNZIP=y
+CONFIG_FEATURE_UNZIP_CDF=y
+CONFIG_FEATURE_UNZIP_BZIP2=y
+CONFIG_FEATURE_UNZIP_LZMA=y
+CONFIG_FEATURE_UNZIP_XZ=y
+
+#
+# Coreutils
+#
+CONFIG_BASENAME=y
+CONFIG_CAT=y
+CONFIG_FEATURE_CATV=y
+CONFIG_CHGRP=y
+CONFIG_CHMOD=y
+CONFIG_CHOWN=y
+# CONFIG_FEATURE_CHOWN_LONG_OPTIONS is not set
+CONFIG_CHROOT=y
+CONFIG_CKSUM=y
+# CONFIG_COMM is not set
+CONFIG_CP=y
+# CONFIG_FEATURE_CP_LONG_OPTIONS is not set
+CONFIG_CUT=y
+CONFIG_DATE=y
+CONFIG_FEATURE_DATE_ISOFMT=y
+# CONFIG_FEATURE_DATE_NANO is not set
+CONFIG_FEATURE_DATE_COMPAT=y
+CONFIG_DD=y
+CONFIG_FEATURE_DD_SIGNAL_HANDLING=y
+# CONFIG_FEATURE_DD_THIRD_STATUS_LINE is not set
+CONFIG_FEATURE_DD_IBS_OBS=y
+CONFIG_FEATURE_DD_STATUS=y
+CONFIG_DF=y
+# CONFIG_FEATURE_DF_FANCY is not set
+CONFIG_DIRNAME=y
+CONFIG_DOS2UNIX=y
+CONFIG_UNIX2DOS=y
+CONFIG_DU=y
+CONFIG_FEATURE_DU_DEFAULT_BLOCKSIZE_1K=y
+CONFIG_ECHO=y
+CONFIG_FEATURE_FANCY_ECHO=y
+CONFIG_ENV=y
+# CONFIG_FEATURE_ENV_LONG_OPTIONS is not set
+# CONFIG_EXPAND is not set
+# CONFIG_FEATURE_EXPAND_LONG_OPTIONS is not set
+# CONFIG_UNEXPAND is not set
+# CONFIG_FEATURE_UNEXPAND_LONG_OPTIONS is not set
+CONFIG_EXPR=y
+CONFIG_EXPR_MATH_SUPPORT_64=y
+CONFIG_FACTOR=y
+CONFIG_FALSE=y
+CONFIG_FOLD=y
+# CONFIG_FSYNC is not set
+CONFIG_HEAD=y
+CONFIG_FEATURE_FANCY_HEAD=y
+CONFIG_HOSTID=y
+CONFIG_ID=y
+# CONFIG_GROUPS is not set
+CONFIG_INSTALL=y
+CONFIG_FEATURE_INSTALL_LONG_OPTIONS=y
+CONFIG_LINK=y
+CONFIG_LN=y
+CONFIG_LOGNAME=y
+CONFIG_LS=y
+CONFIG_FEATURE_LS_FILETYPES=y
+CONFIG_FEATURE_LS_FOLLOWLINKS=y
+CONFIG_FEATURE_LS_RECURSIVE=y
+CONFIG_FEATURE_LS_WIDTH=y
+CONFIG_FEATURE_LS_SORTFILES=y
+CONFIG_FEATURE_LS_TIMESTAMPS=y
+CONFIG_FEATURE_LS_USERNAME=y
+CONFIG_FEATURE_LS_COLOR=y
+CONFIG_FEATURE_LS_COLOR_IS_DEFAULT=y
+CONFIG_MD5SUM=y
+CONFIG_SHA1SUM=y
+CONFIG_SHA256SUM=y
+CONFIG_SHA512SUM=y
+CONFIG_SHA3SUM=y
+
+#
+# Common options for md5sum, sha1sum, sha256sum, sha512sum, sha3sum
+#
+CONFIG_FEATURE_MD5_SHA1_SUM_CHECK=y
+CONFIG_MKDIR=y
+CONFIG_FEATURE_MKDIR_LONG_OPTIONS=y
+CONFIG_MKFIFO=y
+CONFIG_MKNOD=y
+CONFIG_MKTEMP=y
+CONFIG_MV=y
+CONFIG_FEATURE_MV_LONG_OPTIONS=y
+CONFIG_NICE=y
+CONFIG_NL=y
+CONFIG_NOHUP=y
+CONFIG_NPROC=y
+CONFIG_OD=y
+CONFIG_PASTE=y
+CONFIG_PRINTENV=y
+CONFIG_PRINTF=y
+CONFIG_PWD=y
+CONFIG_READLINK=y
+CONFIG_FEATURE_READLINK_FOLLOW=y
+CONFIG_REALPATH=y
+CONFIG_RM=y
+CONFIG_RMDIR=y
+# CONFIG_FEATURE_RMDIR_LONG_OPTIONS is not set
+CONFIG_SEQ=y
+CONFIG_SHRED=y
+# CONFIG_SHUF is not set
+CONFIG_SLEEP=y
+CONFIG_FEATURE_FANCY_SLEEP=y
+CONFIG_FEATURE_FLOAT_SLEEP=y
+CONFIG_SORT=y
+CONFIG_FEATURE_SORT_BIG=y
+# CONFIG_SPLIT is not set
+# CONFIG_FEATURE_SPLIT_FANCY is not set
+# CONFIG_STAT is not set
+# CONFIG_FEATURE_STAT_FORMAT is not set
+# CONFIG_FEATURE_STAT_FILESYSTEM is not set
+CONFIG_STTY=y
+# CONFIG_SUM is not set
+CONFIG_SYNC=y
+# CONFIG_FEATURE_SYNC_FANCY is not set
+# CONFIG_TAC is not set
+CONFIG_TAIL=y
+CONFIG_FEATURE_FANCY_TAIL=y
+CONFIG_TEE=y
+CONFIG_FEATURE_TEE_USE_BLOCK_IO=y
+CONFIG_TEST=y
+CONFIG_TEST1=y
+CONFIG_TEST2=y
+CONFIG_FEATURE_TEST_64=y
+# CONFIG_TIMEOUT is not set
+CONFIG_TOUCH=y
+# CONFIG_FEATURE_TOUCH_NODEREF is not set
+CONFIG_FEATURE_TOUCH_SUSV3=y
+CONFIG_TR=y
+CONFIG_FEATURE_TR_CLASSES=y
+CONFIG_FEATURE_TR_EQUIV=y
+CONFIG_TRUE=y
+CONFIG_TRUNCATE=y
+CONFIG_TTY=y
+CONFIG_UNAME=y
+CONFIG_UNAME_OSNAME="GNU/Linux"
+CONFIG_UNIQ=y
+CONFIG_UNLINK=y
+CONFIG_USLEEP=y
+CONFIG_UUDECODE=y
+# CONFIG_BASE64 is not set
+CONFIG_UUENCODE=y
+CONFIG_WC=y
+# CONFIG_FEATURE_WC_LARGE is not set
+CONFIG_WHOAMI=y
+CONFIG_WHO=y
+CONFIG_W=y
+# CONFIG_USERS is not set
+CONFIG_YES=y
+
+#
+# Common options
+#
+CONFIG_FEATURE_VERBOSE=y
+
+#
+# Common options for cp and mv
+#
+CONFIG_FEATURE_PRESERVE_HARDLINKS=y
+
+#
+# Common options for df, du, ls
+#
+CONFIG_FEATURE_HUMAN_READABLE=y
+
+#
+# Console Utilities
+#
+CONFIG_CHVT=y
+CONFIG_CLEAR=y
+CONFIG_DEALLOCVT=y
+CONFIG_DUMPKMAP=y
+# CONFIG_FGCONSOLE is not set
+# CONFIG_KBD_MODE is not set
+CONFIG_LOADFONT=y
+# CONFIG_SETFONT is not set
+# CONFIG_FEATURE_SETFONT_TEXTUAL_MAP is not set
+CONFIG_DEFAULT_SETFONT_DIR=""
+
+#
+# Common options for loadfont and setfont
+#
+CONFIG_FEATURE_LOADFONT_PSF2=y
+CONFIG_FEATURE_LOADFONT_RAW=y
+CONFIG_LOADKMAP=y
+CONFIG_OPENVT=y
+CONFIG_RESET=y
+CONFIG_RESIZE=y
+CONFIG_FEATURE_RESIZE_PRINT=y
+CONFIG_SETCONSOLE=y
+# CONFIG_FEATURE_SETCONSOLE_LONG_OPTIONS is not set
+CONFIG_SETKEYCODES=y
+CONFIG_SETLOGCONS=y
+# CONFIG_SHOWKEY is not set
+
+#
+# Debian Utilities
+#
+CONFIG_PIPE_PROGRESS=y
+CONFIG_RUN_PARTS=y
+CONFIG_FEATURE_RUN_PARTS_LONG_OPTIONS=y
+# CONFIG_FEATURE_RUN_PARTS_FANCY is not set
+CONFIG_START_STOP_DAEMON=y
+CONFIG_FEATURE_START_STOP_DAEMON_LONG_OPTIONS=y
+CONFIG_FEATURE_START_STOP_DAEMON_FANCY=y
+CONFIG_WHICH=y
+
+#
+# Editors
+#
+CONFIG_AWK=y
+# CONFIG_FEATURE_AWK_LIBM is not set
+CONFIG_FEATURE_AWK_GNU_EXTENSIONS=y
+CONFIG_CMP=y
+CONFIG_DIFF=y
+# CONFIG_FEATURE_DIFF_LONG_OPTIONS is not set
+CONFIG_FEATURE_DIFF_DIR=y
+# CONFIG_ED is not set
+CONFIG_PATCH=y
+CONFIG_SED=y
+CONFIG_VI=y
+CONFIG_FEATURE_VI_MAX_LEN=4096
+CONFIG_FEATURE_VI_8BIT=y
+CONFIG_FEATURE_VI_COLON=y
+CONFIG_FEATURE_VI_YANKMARK=y
+CONFIG_FEATURE_VI_SEARCH=y
+# CONFIG_FEATURE_VI_REGEX_SEARCH is not set
+CONFIG_FEATURE_VI_USE_SIGNALS=y
+CONFIG_FEATURE_VI_DOT_CMD=y
+CONFIG_FEATURE_VI_READONLY=y
+CONFIG_FEATURE_VI_SETOPTS=y
+CONFIG_FEATURE_VI_SET=y
+CONFIG_FEATURE_VI_WIN_RESIZE=y
+CONFIG_FEATURE_VI_ASK_TERMINAL=y
+CONFIG_FEATURE_VI_UNDO=y
+CONFIG_FEATURE_VI_UNDO_QUEUE=y
+CONFIG_FEATURE_VI_UNDO_QUEUE_MAX=256
+CONFIG_FEATURE_ALLOW_EXEC=y
+
+#
+# Finding Utilities
+#
+CONFIG_FIND=y
+CONFIG_FEATURE_FIND_PRINT0=y
+CONFIG_FEATURE_FIND_MTIME=y
+CONFIG_FEATURE_FIND_MMIN=y
+CONFIG_FEATURE_FIND_PERM=y
+CONFIG_FEATURE_FIND_TYPE=y
+CONFIG_FEATURE_FIND_XDEV=y
+CONFIG_FEATURE_FIND_MAXDEPTH=y
+CONFIG_FEATURE_FIND_NEWER=y
+# CONFIG_FEATURE_FIND_INUM is not set
+CONFIG_FEATURE_FIND_EXEC=y
+CONFIG_FEATURE_FIND_EXEC_PLUS=y
+CONFIG_FEATURE_FIND_USER=y
+CONFIG_FEATURE_FIND_GROUP=y
+CONFIG_FEATURE_FIND_NOT=y
+CONFIG_FEATURE_FIND_DEPTH=y
+CONFIG_FEATURE_FIND_PAREN=y
+CONFIG_FEATURE_FIND_SIZE=y
+CONFIG_FEATURE_FIND_PRUNE=y
+# CONFIG_FEATURE_FIND_DELETE is not set
+CONFIG_FEATURE_FIND_PATH=y
+CONFIG_FEATURE_FIND_REGEX=y
+# CONFIG_FEATURE_FIND_CONTEXT is not set
+# CONFIG_FEATURE_FIND_LINKS is not set
+CONFIG_GREP=y
+CONFIG_EGREP=y
+CONFIG_FGREP=y
+CONFIG_FEATURE_GREP_CONTEXT=y
+CONFIG_XARGS=y
+# CONFIG_FEATURE_XARGS_SUPPORT_CONFIRMATION is not set
+CONFIG_FEATURE_XARGS_SUPPORT_QUOTES=y
+CONFIG_FEATURE_XARGS_SUPPORT_TERMOPT=y
+CONFIG_FEATURE_XARGS_SUPPORT_ZERO_TERM=y
+CONFIG_FEATURE_XARGS_SUPPORT_REPL_STR=y
+
+#
+# Init Utilities
+#
+# CONFIG_BOOTCHARTD is not set
+# CONFIG_FEATURE_BOOTCHARTD_BLOATED_HEADER is not set
+# CONFIG_FEATURE_BOOTCHARTD_CONFIG_FILE is not set
+CONFIG_HALT=y
+CONFIG_POWEROFF=y
+CONFIG_REBOOT=y
+# CONFIG_FEATURE_CALL_TELINIT is not set
+CONFIG_TELINIT_PATH=""
+CONFIG_INIT=y
+CONFIG_LINUXRC=y
+CONFIG_FEATURE_USE_INITTAB=y
+CONFIG_FEATURE_KILL_REMOVED=y
+CONFIG_FEATURE_KILL_DELAY=0
+CONFIG_FEATURE_INIT_SCTTY=y
+CONFIG_FEATURE_INIT_SYSLOG=y
+CONFIG_FEATURE_INIT_QUIET=y
+# CONFIG_FEATURE_INIT_COREDUMPS is not set
+CONFIG_INIT_TERMINAL_TYPE="linux"
+CONFIG_FEATURE_INIT_MODIFY_CMDLINE=y
+
+#
+# Login/Password Management Utilities
+#
+CONFIG_FEATURE_SHADOWPASSWDS=y
+# CONFIG_USE_BB_PWD_GRP is not set
+# CONFIG_USE_BB_SHADOW is not set
+CONFIG_USE_BB_CRYPT=y
+# CONFIG_USE_BB_CRYPT_SHA is not set
+CONFIG_ADDGROUP=y
+# CONFIG_FEATURE_ADDGROUP_LONG_OPTIONS is not set
+# CONFIG_FEATURE_ADDUSER_TO_GROUP is not set
+# CONFIG_ADD_SHELL is not set
+# CONFIG_REMOVE_SHELL is not set
+CONFIG_ADDUSER=y
+# CONFIG_FEATURE_ADDUSER_LONG_OPTIONS is not set
+# CONFIG_FEATURE_CHECK_NAMES is not set
+CONFIG_LAST_ID=60000
+CONFIG_FIRST_SYSTEM_ID=100
+CONFIG_LAST_SYSTEM_ID=999
+# CONFIG_CHPASSWD is not set
+CONFIG_FEATURE_DEFAULT_PASSWD_ALGO="md5"
+# CONFIG_CRYPTPW is not set
+CONFIG_MKPASSWD=y
+CONFIG_DELUSER=y
+CONFIG_DELGROUP=y
+# CONFIG_FEATURE_DEL_USER_FROM_GROUP is not set
+CONFIG_GETTY=y
+CONFIG_LOGIN=y
+# CONFIG_LOGIN_SESSION_AS_CHILD is not set
+# CONFIG_LOGIN_SCRIPTS is not set
+CONFIG_FEATURE_NOLOGIN=y
+CONFIG_FEATURE_SECURETTY=y
+CONFIG_PASSWD=y
+CONFIG_FEATURE_PASSWD_WEAK_CHECK=y
+CONFIG_SU=y
+CONFIG_FEATURE_SU_SYSLOG=y
+CONFIG_FEATURE_SU_CHECKS_SHELLS=y
+# CONFIG_FEATURE_SU_BLANK_PW_NEEDS_SECURE_TTY is not set
+CONFIG_SULOGIN=y
+CONFIG_VLOCK=y
+
+#
+# Linux Ext2 FS Progs
+#
+CONFIG_CHATTR=y
+CONFIG_FSCK=y
+CONFIG_LSATTR=y
+# CONFIG_TUNE2FS is not set
+
+#
+# Linux Module Utilities
+#
+# CONFIG_MODPROBE_SMALL is not set
+# CONFIG_DEPMOD is not set
+CONFIG_INSMOD=y
+CONFIG_LSMOD=y
+CONFIG_FEATURE_LSMOD_PRETTY_2_6_OUTPUT=y
+# CONFIG_MODINFO is not set
+CONFIG_MODPROBE=y
+# CONFIG_FEATURE_MODPROBE_BLACKLIST is not set
+CONFIG_RMMOD=y
+
+#
+# Options common to multiple modutils
+#
+CONFIG_FEATURE_CMDLINE_MODULE_OPTIONS=y
+# CONFIG_FEATURE_MODPROBE_SMALL_CHECK_ALREADY_LOADED is not set
+# CONFIG_FEATURE_2_4_MODULES is not set
+# CONFIG_FEATURE_INSMOD_VERSION_CHECKING is not set
+# CONFIG_FEATURE_INSMOD_KSYMOOPS_SYMBOLS is not set
+# CONFIG_FEATURE_INSMOD_LOADINKMEM is not set
+# CONFIG_FEATURE_INSMOD_LOAD_MAP is not set
+# CONFIG_FEATURE_INSMOD_LOAD_MAP_FULL is not set
+CONFIG_FEATURE_CHECK_TAINTED_MODULE=y
+# CONFIG_FEATURE_INSMOD_TRY_MMAP is not set
+CONFIG_FEATURE_MODUTILS_ALIAS=y
+CONFIG_FEATURE_MODUTILS_SYMBOLS=y
+CONFIG_DEFAULT_MODULES_DIR="/lib/modules"
+CONFIG_DEFAULT_DEPMOD_FILE="modules.dep"
+
+#
+# Linux System Utilities
+#
+# CONFIG_ACPID is not set
+# CONFIG_FEATURE_ACPID_COMPAT is not set
+# CONFIG_BLKDISCARD is not set
+CONFIG_BLKID=y
+# CONFIG_FEATURE_BLKID_TYPE is not set
+# CONFIG_BLOCKDEV is not set
+# CONFIG_CAL is not set
+CONFIG_CHRT=y
+CONFIG_DMESG=y
+CONFIG_FEATURE_DMESG_PRETTY=y
+CONFIG_EJECT=y
+# CONFIG_FEATURE_EJECT_SCSI is not set
+CONFIG_FALLOCATE=y
+# CONFIG_FATATTR is not set
+CONFIG_FBSET=y
+CONFIG_FEATURE_FBSET_FANCY=y
+CONFIG_FEATURE_FBSET_READMODE=y
+CONFIG_FDFORMAT=y
+CONFIG_FDISK=y
+# CONFIG_FDISK_SUPPORT_LARGE_DISKS is not set
+CONFIG_FEATURE_FDISK_WRITABLE=y
+# CONFIG_FEATURE_AIX_LABEL is not set
+# CONFIG_FEATURE_SGI_LABEL is not set
+# CONFIG_FEATURE_SUN_LABEL is not set
+# CONFIG_FEATURE_OSF_LABEL is not set
+CONFIG_FEATURE_GPT_LABEL=y
+CONFIG_FEATURE_FDISK_ADVANCED=y
+# CONFIG_FINDFS is not set
+CONFIG_FLOCK=y
+CONFIG_FDFLUSH=y
+CONFIG_FREERAMDISK=y
+# CONFIG_FSCK_MINIX is not set
+CONFIG_FSFREEZE=y
+CONFIG_FSTRIM=y
+CONFIG_GETOPT=y
+CONFIG_FEATURE_GETOPT_LONG=y
+CONFIG_HEXDUMP=y
+# CONFIG_FEATURE_HEXDUMP_REVERSE is not set
+# CONFIG_HD is not set
+CONFIG_XXD=y
+CONFIG_HWCLOCK=y
+CONFIG_FEATURE_HWCLOCK_LONG_OPTIONS=y
+CONFIG_FEATURE_HWCLOCK_ADJTIME_FHS=y
+# CONFIG_IONICE is not set
+CONFIG_IPCRM=y
+CONFIG_IPCS=y
+CONFIG_LAST=y
+# CONFIG_FEATURE_LAST_FANCY is not set
+CONFIG_LOSETUP=y
+CONFIG_LSPCI=y
+CONFIG_LSUSB=y
+CONFIG_MDEV=y
+CONFIG_FEATURE_MDEV_CONF=y
+CONFIG_FEATURE_MDEV_RENAME=y
+# CONFIG_FEATURE_MDEV_RENAME_REGEXP is not set
+CONFIG_FEATURE_MDEV_EXEC=y
+# CONFIG_FEATURE_MDEV_LOAD_FIRMWARE is not set
+CONFIG_MESG=y
+CONFIG_FEATURE_MESG_ENABLE_ONLY_GROUP=y
+CONFIG_MKE2FS=y
+# CONFIG_MKFS_EXT2 is not set
+# CONFIG_MKFS_MINIX is not set
+# CONFIG_FEATURE_MINIX2 is not set
+# CONFIG_MKFS_REISER is not set
+CONFIG_MKDOSFS=y
+# CONFIG_MKFS_VFAT is not set
+CONFIG_MKSWAP=y
+# CONFIG_FEATURE_MKSWAP_UUID is not set
+CONFIG_MORE=y
+CONFIG_MOUNT=y
+# CONFIG_FEATURE_MOUNT_FAKE is not set
+# CONFIG_FEATURE_MOUNT_VERBOSE is not set
+# CONFIG_FEATURE_MOUNT_HELPERS is not set
+# CONFIG_FEATURE_MOUNT_LABEL is not set
+# CONFIG_FEATURE_MOUNT_NFS is not set
+CONFIG_FEATURE_MOUNT_CIFS=y
+CONFIG_FEATURE_MOUNT_FLAGS=y
+CONFIG_FEATURE_MOUNT_FSTAB=y
+CONFIG_FEATURE_MOUNT_OTHERTAB=y
+CONFIG_MOUNTPOINT=y
+# CONFIG_NSENTER is not set
+# CONFIG_FEATURE_NSENTER_LONG_OPTS is not set
+CONFIG_PIVOT_ROOT=y
+CONFIG_RDATE=y
+# CONFIG_RDEV is not set
+CONFIG_READPROFILE=y
+CONFIG_RENICE=y
+# CONFIG_REV is not set
+# CONFIG_RTCWAKE is not set
+# CONFIG_SCRIPT is not set
+# CONFIG_SCRIPTREPLAY is not set
+CONFIG_SETARCH=y
+CONFIG_LINUX32=y
+CONFIG_LINUX64=y
+CONFIG_SETPRIV=y
+CONFIG_SETSID=y
+CONFIG_SWAPON=y
+# CONFIG_FEATURE_SWAPON_DISCARD is not set
+# CONFIG_FEATURE_SWAPON_PRI is not set
+CONFIG_SWAPOFF=y
+CONFIG_SWITCH_ROOT=y
+# CONFIG_TASKSET is not set
+# CONFIG_FEATURE_TASKSET_FANCY is not set
+CONFIG_UEVENT=y
+CONFIG_UMOUNT=y
+CONFIG_FEATURE_UMOUNT_ALL=y
+# CONFIG_UNSHARE is not set
+# CONFIG_WALL is not set
+
+#
+# Common options for mount/umount
+#
+CONFIG_FEATURE_MOUNT_LOOP=y
+CONFIG_FEATURE_MOUNT_LOOP_CREATE=y
+# CONFIG_FEATURE_MTAB_SUPPORT is not set
+CONFIG_VOLUMEID=y
+
+#
+# Filesystem/Volume identification
+#
+# CONFIG_FEATURE_VOLUMEID_BCACHE is not set
+# CONFIG_FEATURE_VOLUMEID_BTRFS is not set
+# CONFIG_FEATURE_VOLUMEID_CRAMFS is not set
+CONFIG_FEATURE_VOLUMEID_EXFAT=y
+CONFIG_FEATURE_VOLUMEID_EXT=y
+CONFIG_FEATURE_VOLUMEID_F2FS=y
+CONFIG_FEATURE_VOLUMEID_FAT=y
+# CONFIG_FEATURE_VOLUMEID_HFS is not set
+# CONFIG_FEATURE_VOLUMEID_ISO9660 is not set
+# CONFIG_FEATURE_VOLUMEID_JFS is not set
+# CONFIG_FEATURE_VOLUMEID_LINUXRAID is not set
+# CONFIG_FEATURE_VOLUMEID_LINUXSWAP is not set
+# CONFIG_FEATURE_VOLUMEID_LUKS is not set
+# CONFIG_FEATURE_VOLUMEID_NILFS is not set
+# CONFIG_FEATURE_VOLUMEID_NTFS is not set
+# CONFIG_FEATURE_VOLUMEID_OCFS2 is not set
+# CONFIG_FEATURE_VOLUMEID_REISERFS is not set
+# CONFIG_FEATURE_VOLUMEID_ROMFS is not set
+# CONFIG_FEATURE_VOLUMEID_SQUASHFS is not set
+# CONFIG_FEATURE_VOLUMEID_SYSV is not set
+CONFIG_FEATURE_VOLUMEID_UBIFS=y
+# CONFIG_FEATURE_VOLUMEID_UDF is not set
+# CONFIG_FEATURE_VOLUMEID_XFS is not set
+
+#
+# Miscellaneous Utilities
+#
+# CONFIG_ADJTIMEX is not set
+# CONFIG_BBCONFIG is not set
+# CONFIG_FEATURE_COMPRESS_BBCONFIG is not set
+# CONFIG_BEEP is not set
+CONFIG_FEATURE_BEEP_FREQ=0
+CONFIG_FEATURE_BEEP_LENGTH_MS=0
+# CONFIG_CHAT is not set
+# CONFIG_FEATURE_CHAT_NOFAIL is not set
+# CONFIG_FEATURE_CHAT_TTY_HIFI is not set
+# CONFIG_FEATURE_CHAT_IMPLICIT_CR is not set
+# CONFIG_FEATURE_CHAT_SWALLOW_OPTS is not set
+# CONFIG_FEATURE_CHAT_SEND_ESCAPES is not set
+# CONFIG_FEATURE_CHAT_VAR_ABORT_LEN is not set
+# CONFIG_FEATURE_CHAT_CLR_ABORT is not set
+# CONFIG_CONSPY is not set
+CONFIG_CROND=y
+# CONFIG_FEATURE_CROND_D is not set
+# CONFIG_FEATURE_CROND_CALL_SENDMAIL is not set
+CONFIG_FEATURE_CROND_DIR="/var/spool/cron"
+CONFIG_CRONTAB=y
+CONFIG_DC=y
+# CONFIG_FEATURE_DC_LIBM is not set
+# CONFIG_DEVFSD is not set
+# CONFIG_DEVFSD_MODLOAD is not set
+# CONFIG_DEVFSD_FG_NP is not set
+# CONFIG_DEVFSD_VERBOSE is not set
+# CONFIG_FEATURE_DEVFS is not set
+CONFIG_DEVMEM=y
+# CONFIG_FBSPLASH is not set
+# CONFIG_FLASHCP is not set
+# CONFIG_FLASH_ERASEALL is not set
+# CONFIG_FLASH_LOCK is not set
+# CONFIG_FLASH_UNLOCK is not set
+CONFIG_HDPARM=y
+CONFIG_FEATURE_HDPARM_GET_IDENTITY=y
+# CONFIG_FEATURE_HDPARM_HDIO_SCAN_HWIF is not set
+# CONFIG_FEATURE_HDPARM_HDIO_UNREGISTER_HWIF is not set
+# CONFIG_FEATURE_HDPARM_HDIO_DRIVE_RESET is not set
+# CONFIG_FEATURE_HDPARM_HDIO_TRISTATE_HWIF is not set
+# CONFIG_FEATURE_HDPARM_HDIO_GETSET_DMA is not set
+CONFIG_I2CGET=y
+CONFIG_I2CSET=y
+CONFIG_I2CDUMP=y
+CONFIG_I2CDETECT=y
+# CONFIG_INOTIFYD is not set
+CONFIG_LESS=y
+CONFIG_FEATURE_LESS_MAXLINES=9999999
+CONFIG_FEATURE_LESS_BRACKETS=y
+CONFIG_FEATURE_LESS_FLAGS=y
+CONFIG_FEATURE_LESS_TRUNCATE=y
+# CONFIG_FEATURE_LESS_MARKS is not set
+CONFIG_FEATURE_LESS_REGEXP=y
+# CONFIG_FEATURE_LESS_WINCH is not set
+# CONFIG_FEATURE_LESS_ASK_TERMINAL is not set
+# CONFIG_FEATURE_LESS_DASHCMD is not set
+# CONFIG_FEATURE_LESS_LINENUMS is not set
+CONFIG_LSSCSI=y
+CONFIG_MAKEDEVS=y
+# CONFIG_FEATURE_MAKEDEVS_LEAF is not set
+CONFIG_FEATURE_MAKEDEVS_TABLE=y
+# CONFIG_MAN is not set
+CONFIG_MICROCOM=y
+CONFIG_MT=y
+# CONFIG_NANDWRITE is not set
+# CONFIG_NANDDUMP is not set
+CONFIG_PARTPROBE=y
+# CONFIG_RAIDAUTORUN is not set
+# CONFIG_READAHEAD is not set
+# CONFIG_RFKILL is not set
+CONFIG_RUNLEVEL=y
+# CONFIG_RX is not set
+CONFIG_SETSERIAL=y
+CONFIG_STRINGS=y
+CONFIG_TIME=y
+# CONFIG_TTYSIZE is not set
+CONFIG_UBIRENAME=y
+# CONFIG_UBIATTACH is not set
+# CONFIG_UBIDETACH is not set
+# CONFIG_UBIMKVOL is not set
+# CONFIG_UBIRMVOL is not set
+# CONFIG_UBIRSVOL is not set
+# CONFIG_UBIUPDATEVOL is not set
+# CONFIG_VOLNAME is not set
+CONFIG_WATCHDOG=y
+
+#
+# Networking Utilities
+#
+CONFIG_FEATURE_IPV6=y
+# CONFIG_FEATURE_UNIX_LOCAL is not set
+CONFIG_FEATURE_PREFER_IPV4_ADDRESS=y
+# CONFIG_VERBOSE_RESOLUTION_ERRORS is not set
+CONFIG_ARP=y
+CONFIG_ARPING=y
+# CONFIG_BRCTL is not set
+# CONFIG_FEATURE_BRCTL_FANCY is not set
+# CONFIG_FEATURE_BRCTL_SHOW is not set
+CONFIG_DNSD=y
+CONFIG_ETHER_WAKE=y
+# CONFIG_FTPD is not set
+# CONFIG_FEATURE_FTPD_WRITE is not set
+# CONFIG_FEATURE_FTPD_ACCEPT_BROKEN_LIST is not set
+# CONFIG_FEATURE_FTPD_AUTHENTICATION is not set
+# CONFIG_FTPGET is not set
+# CONFIG_FTPPUT is not set
+# CONFIG_FEATURE_FTPGETPUT_LONG_OPTIONS is not set
+CONFIG_HOSTNAME=y
+CONFIG_DNSDOMAINNAME=y
+# CONFIG_HTTPD is not set
+# CONFIG_FEATURE_HTTPD_RANGES is not set
+# CONFIG_FEATURE_HTTPD_SETUID is not set
+# CONFIG_FEATURE_HTTPD_BASIC_AUTH is not set
+# CONFIG_FEATURE_HTTPD_AUTH_MD5 is not set
+# CONFIG_FEATURE_HTTPD_CGI is not set
+# CONFIG_FEATURE_HTTPD_CONFIG_WITH_SCRIPT_INTERPR is not set
+# CONFIG_FEATURE_HTTPD_SET_REMOTE_PORT_TO_ENV is not set
+# CONFIG_FEATURE_HTTPD_ENCODE_URL_STR is not set
+# CONFIG_FEATURE_HTTPD_ERROR_PAGES is not set
+# CONFIG_FEATURE_HTTPD_PROXY is not set
+# CONFIG_FEATURE_HTTPD_GZIP is not set
+CONFIG_IFCONFIG=y
+CONFIG_FEATURE_IFCONFIG_STATUS=y
+CONFIG_FEATURE_IFCONFIG_SLIP=y
+CONFIG_FEATURE_IFCONFIG_MEMSTART_IOADDR_IRQ=y
+CONFIG_FEATURE_IFCONFIG_HW=y
+# CONFIG_FEATURE_IFCONFIG_BROADCAST_PLUS is not set
+# CONFIG_IFENSLAVE is not set
+# CONFIG_IFPLUGD is not set
+CONFIG_IFUP=y
+CONFIG_IFDOWN=y
+CONFIG_IFUPDOWN_IFSTATE_PATH="/var/run/ifstate"
+CONFIG_FEATURE_IFUPDOWN_IP=y
+CONFIG_FEATURE_IFUPDOWN_IPV4=y
+CONFIG_FEATURE_IFUPDOWN_IPV6=y
+CONFIG_FEATURE_IFUPDOWN_MAPPING=y
+# CONFIG_FEATURE_IFUPDOWN_EXTERNAL_DHCP is not set
+CONFIG_INETD=y
+CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_ECHO=y
+CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DISCARD=y
+CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_TIME=y
+CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DAYTIME=y
+CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_CHARGEN=y
+# CONFIG_FEATURE_INETD_RPC is not set
+CONFIG_IP=y
+CONFIG_IPADDR=y
+CONFIG_IPLINK=y
+CONFIG_IPROUTE=y
+CONFIG_IPTUNNEL=y
+CONFIG_IPRULE=y
+CONFIG_IPNEIGH=y
+CONFIG_FEATURE_IP_ADDRESS=y
+CONFIG_FEATURE_IP_LINK=y
+CONFIG_FEATURE_IP_ROUTE=y
+CONFIG_FEATURE_IP_ROUTE_DIR="/etc/iproute2"
+CONFIG_FEATURE_IP_TUNNEL=y
+CONFIG_FEATURE_IP_RULE=y
+CONFIG_FEATURE_IP_NEIGH=y
+# CONFIG_FEATURE_IP_RARE_PROTOCOLS is not set
+# CONFIG_IPCALC is not set
+# CONFIG_FEATURE_IPCALC_LONG_OPTIONS is not set
+# CONFIG_FEATURE_IPCALC_FANCY is not set
+# CONFIG_FAKEIDENTD is not set
+CONFIG_NAMEIF=y
+# CONFIG_FEATURE_NAMEIF_EXTENDED is not set
+# CONFIG_NBDCLIENT is not set
+# CONFIG_NC is not set
+# CONFIG_NC_SERVER is not set
+# CONFIG_NC_EXTRA is not set
+# CONFIG_NC_110_COMPAT is not set
+CONFIG_NETSTAT=y
+# CONFIG_FEATURE_NETSTAT_WIDE is not set
+# CONFIG_FEATURE_NETSTAT_PRG is not set
+CONFIG_NSLOOKUP=y
+# CONFIG_NTPD is not set
+# CONFIG_FEATURE_NTPD_SERVER is not set
+# CONFIG_FEATURE_NTPD_CONF is not set
+CONFIG_PING=y
+# CONFIG_PING6 is not set
+CONFIG_FEATURE_FANCY_PING=y
+# CONFIG_PSCAN is not set
+CONFIG_ROUTE=y
+# CONFIG_SLATTACH is not set
+# CONFIG_SSL_CLIENT is not set
+# CONFIG_TCPSVD is not set
+# CONFIG_UDPSVD is not set
+CONFIG_TELNET=y
+CONFIG_FEATURE_TELNET_TTYPE=y
+CONFIG_FEATURE_TELNET_AUTOLOGIN=y
+CONFIG_FEATURE_TELNET_WIDTH=y
+# CONFIG_TELNETD is not set
+# CONFIG_FEATURE_TELNETD_STANDALONE is not set
+# CONFIG_FEATURE_TELNETD_INETD_WAIT is not set
+CONFIG_TFTP=y
+# CONFIG_TFTPD is not set
+
+#
+# Common options for tftp/tftpd
+#
+CONFIG_FEATURE_TFTP_GET=y
+CONFIG_FEATURE_TFTP_PUT=y
+CONFIG_FEATURE_TFTP_BLOCKSIZE=y
+# CONFIG_FEATURE_TFTP_PROGRESS_BAR is not set
+# CONFIG_TFTP_DEBUG is not set
+# CONFIG_TLS is not set
+CONFIG_TRACEROUTE=y
+# CONFIG_TRACEROUTE6 is not set
+# CONFIG_FEATURE_TRACEROUTE_VERBOSE is not set
+# CONFIG_FEATURE_TRACEROUTE_USE_ICMP is not set
+# CONFIG_TUNCTL is not set
+# CONFIG_FEATURE_TUNCTL_UG is not set
+CONFIG_VCONFIG=y
+CONFIG_WGET=y
+CONFIG_FEATURE_WGET_LONG_OPTIONS=y
+CONFIG_FEATURE_WGET_STATUSBAR=y
+CONFIG_FEATURE_WGET_AUTHENTICATION=y
+CONFIG_FEATURE_WGET_TIMEOUT=y
+# CONFIG_FEATURE_WGET_HTTPS is not set
+# CONFIG_FEATURE_WGET_OPENSSL is not set
+# CONFIG_WHOIS is not set
+# CONFIG_ZCIP is not set
+# CONFIG_UDHCPC6 is not set
+# CONFIG_FEATURE_UDHCPC6_RFC3646 is not set
+# CONFIG_FEATURE_UDHCPC6_RFC4704 is not set
+# CONFIG_FEATURE_UDHCPC6_RFC4833 is not set
+# CONFIG_UDHCPD is not set
+# CONFIG_FEATURE_UDHCPD_WRITE_LEASES_EARLY is not set
+# CONFIG_FEATURE_UDHCPD_BASE_IP_ON_MAC is not set
+CONFIG_DHCPD_LEASES_FILE=""
+# CONFIG_DUMPLEASES is not set
+# CONFIG_DHCPRELAY is not set
+CONFIG_UDHCPC=y
+CONFIG_FEATURE_UDHCPC_ARPING=y
+CONFIG_FEATURE_UDHCPC_SANITIZEOPT=y
+CONFIG_UDHCPC_DEFAULT_SCRIPT="/usr/share/udhcpc/default.script"
+# CONFIG_FEATURE_UDHCP_PORT is not set
+CONFIG_UDHCP_DEBUG=0
+# CONFIG_FEATURE_UDHCP_RFC3397 is not set
+CONFIG_FEATURE_UDHCP_8021Q=y
+CONFIG_UDHCPC_SLACK_FOR_BUGGY_SERVERS=80
+CONFIG_IFUPDOWN_UDHCPC_CMD_OPTIONS="-R -n"
+
+#
+# Print Utilities
+#
+# CONFIG_LPD is not set
+# CONFIG_LPR is not set
+# CONFIG_LPQ is not set
+
+#
+# Mail Utilities
+#
+# CONFIG_MAKEMIME is not set
+# CONFIG_POPMAILDIR is not set
+# CONFIG_FEATURE_POPMAILDIR_DELIVERY is not set
+# CONFIG_REFORMIME is not set
+# CONFIG_FEATURE_REFORMIME_COMPAT is not set
+# CONFIG_SENDMAIL is not set
+CONFIG_FEATURE_MIME_CHARSET=""
+
+#
+# Process Utilities
+#
+CONFIG_FREE=y
+CONFIG_FUSER=y
+# CONFIG_IOSTAT is not set
+CONFIG_KILL=y
+CONFIG_KILLALL=y
+CONFIG_KILLALL5=y
+CONFIG_LSOF=y
+# CONFIG_MPSTAT is not set
+# CONFIG_NMETER is not set
+# CONFIG_PGREP is not set
+# CONFIG_PKILL is not set
+CONFIG_PIDOF=y
+CONFIG_FEATURE_PIDOF_SINGLE=y
+CONFIG_FEATURE_PIDOF_OMIT=y
+# CONFIG_PMAP is not set
+# CONFIG_POWERTOP is not set
+# CONFIG_FEATURE_POWERTOP_INTERACTIVE is not set
+CONFIG_PS=y
+# CONFIG_FEATURE_PS_WIDE is not set
+# CONFIG_FEATURE_PS_LONG is not set
+# CONFIG_FEATURE_PS_TIME is not set
+# CONFIG_FEATURE_PS_UNUSUAL_SYSTEMS is not set
+# CONFIG_FEATURE_PS_ADDITIONAL_COLUMNS is not set
+# CONFIG_PSTREE is not set
+# CONFIG_PWDX is not set
+# CONFIG_SMEMCAP is not set
+CONFIG_BB_SYSCTL=y
+CONFIG_TOP=y
+CONFIG_FEATURE_TOP_INTERACTIVE=y
+CONFIG_FEATURE_TOP_CPU_USAGE_PERCENTAGE=y
+CONFIG_FEATURE_TOP_CPU_GLOBAL_PERCENTS=y
+# CONFIG_FEATURE_TOP_SMP_CPU is not set
+# CONFIG_FEATURE_TOP_DECIMALS is not set
+# CONFIG_FEATURE_TOP_SMP_PROCESS is not set
+# CONFIG_FEATURE_TOPMEM is not set
+CONFIG_UPTIME=y
+# CONFIG_FEATURE_UPTIME_UTMP_SUPPORT is not set
+CONFIG_WATCH=y
+# CONFIG_FEATURE_SHOW_THREADS is not set
+
+#
+# Runit Utilities
+#
+# CONFIG_CHPST is not set
+# CONFIG_SETUIDGID is not set
+# CONFIG_ENVUIDGID is not set
+# CONFIG_ENVDIR is not set
+# CONFIG_SOFTLIMIT is not set
+# CONFIG_RUNSV is not set
+# CONFIG_RUNSVDIR is not set
+# CONFIG_FEATURE_RUNSVDIR_LOG is not set
+# CONFIG_SV is not set
+CONFIG_SV_DEFAULT_SERVICE_DIR=""
+CONFIG_SVC=y
+# CONFIG_SVLOGD is not set
+# CONFIG_CHCON is not set
+# CONFIG_FEATURE_CHCON_LONG_OPTIONS is not set
+# CONFIG_GETENFORCE is not set
+# CONFIG_GETSEBOOL is not set
+# CONFIG_LOAD_POLICY is not set
+# CONFIG_MATCHPATHCON is not set
+# CONFIG_RUNCON is not set
+# CONFIG_FEATURE_RUNCON_LONG_OPTIONS is not set
+# CONFIG_SELINUXENABLED is not set
+# CONFIG_SESTATUS is not set
+# CONFIG_SETENFORCE is not set
+# CONFIG_SETFILES is not set
+# CONFIG_FEATURE_SETFILES_CHECK_OPTION is not set
+# CONFIG_RESTORECON is not set
+# CONFIG_SETSEBOOL is not set
+
+#
+# Shells
+#
+CONFIG_SH_IS_ASH=y
+# CONFIG_SH_IS_HUSH is not set
+# CONFIG_SH_IS_NONE is not set
+# CONFIG_BASH_IS_ASH is not set
+# CONFIG_BASH_IS_HUSH is not set
+CONFIG_BASH_IS_NONE=y
+CONFIG_ASH=y
+CONFIG_ASH_OPTIMIZE_FOR_SIZE=y
+CONFIG_ASH_INTERNAL_GLOB=y
+CONFIG_ASH_BASH_COMPAT=y
+CONFIG_ASH_JOB_CONTROL=y
+CONFIG_ASH_ALIAS=y
+CONFIG_ASH_RANDOM_SUPPORT=y
+CONFIG_ASH_EXPAND_PRMT=y
+CONFIG_ASH_IDLE_TIMEOUT=y
+# CONFIG_ASH_MAIL is not set
+CONFIG_ASH_ECHO=y
+CONFIG_ASH_PRINTF=y
+CONFIG_ASH_TEST=y
+CONFIG_ASH_HELP=y
+CONFIG_ASH_GETOPTS=y
+CONFIG_ASH_CMDCMD=y
+# CONFIG_CTTYHACK is not set
+# CONFIG_HUSH is not set
+# CONFIG_HUSH_BASH_COMPAT is not set
+# CONFIG_HUSH_BRACE_EXPANSION is not set
+# CONFIG_HUSH_INTERACTIVE is not set
+# CONFIG_HUSH_SAVEHISTORY is not set
+# CONFIG_HUSH_JOB is not set
+# CONFIG_HUSH_TICK is not set
+# CONFIG_HUSH_IF is not set
+# CONFIG_HUSH_LOOPS is not set
+# CONFIG_HUSH_CASE is not set
+# CONFIG_HUSH_FUNCTIONS is not set
+# CONFIG_HUSH_LOCAL is not set
+# CONFIG_HUSH_RANDOM_SUPPORT is not set
+# CONFIG_HUSH_MODE_X is not set
+# CONFIG_HUSH_ECHO is not set
+# CONFIG_HUSH_PRINTF is not set
+# CONFIG_HUSH_TEST is not set
+# CONFIG_HUSH_HELP is not set
+# CONFIG_HUSH_EXPORT is not set
+# CONFIG_HUSH_EXPORT_N is not set
+# CONFIG_HUSH_KILL is not set
+# CONFIG_HUSH_WAIT is not set
+# CONFIG_HUSH_TRAP is not set
+# CONFIG_HUSH_TYPE is not set
+# CONFIG_HUSH_READ is not set
+# CONFIG_HUSH_SET is not set
+# CONFIG_HUSH_UNSET is not set
+# CONFIG_HUSH_ULIMIT is not set
+# CONFIG_HUSH_UMASK is not set
+# CONFIG_HUSH_MEMLEAK is not set
+# CONFIG_MSH is not set
+
+#
+# Options common to all shells
+#
+CONFIG_FEATURE_SH_MATH=y
+CONFIG_FEATURE_SH_MATH_64=y
+CONFIG_FEATURE_SH_EXTRA_QUIET=y
+# CONFIG_FEATURE_SH_STANDALONE is not set
+# CONFIG_FEATURE_SH_NOFORK is not set
+# CONFIG_FEATURE_SH_HISTFILESIZE is not set
+
+#
+# System Logging Utilities
+#
+CONFIG_KLOGD=y
+CONFIG_FEATURE_KLOGD_KLOGCTL=y
+CONFIG_LOGGER=y
+# CONFIG_LOGREAD is not set
+# CONFIG_FEATURE_LOGREAD_REDUCED_LOCKING is not set
+CONFIG_SYSLOGD=y
+CONFIG_FEATURE_ROTATE_LOGFILE=y
+CONFIG_FEATURE_REMOTE_LOG=y
+# CONFIG_FEATURE_SYSLOGD_DUP is not set
+# CONFIG_FEATURE_SYSLOGD_CFG is not set
+CONFIG_FEATURE_SYSLOGD_READ_BUFFER_SIZE=256
+# CONFIG_FEATURE_IPC_SYSLOG is not set
+CONFIG_FEATURE_IPC_SYSLOG_BUFFER_SIZE=0
+# CONFIG_FEATURE_KMSG_SYSLOG is not set

+ 31 - 0
board/PSG/iot2000/genimage.cfg

@@ -0,0 +1,31 @@
+# Create an image of the efi partition
+image efi-part.vfat {
+	vfat {
+		file startup.nsh {
+			image = "efi-part/startup.nsh"
+		}
+		file EFI {
+			image = "efi-part/EFI"
+		}
+	}
+	size=512K
+}
+
+# Create the sdcard image, pulling in
+#  * the image created by buildroot
+#  * the efi-partition created above
+image sdcard.img {
+	hdimage {
+	}
+
+	partition boot {
+		partition-type = 0xC
+		image = "efi-part.vfat"
+	}
+
+	partition rootfs {
+		partition-type = 0x83
+		image = "rootfs.ext2"
+		size = 1024M
+	}
+}

+ 11 - 0
board/PSG/iot2000/grub.cfg

@@ -0,0 +1,11 @@
+set default="0"
+set timeout="0"
+
+menuentry "Buildroot" {
+	# Grub2 supports ext4, load the kernel from the Linux rootfs partition
+	# Set root tells grub to search the 2nd partition for the bzImage
+	set root=(hd0,msdos2)
+
+	# Set Linux to boot from the 2nd partition, SD/MMC support is baked into the kernel
+	linux /boot/bzImage root=/dev/mmcblk0p2 rootwait console=ttyS1,115200n8 earlycon=uart8250,mmio32,0x9000b000,115200n8 reboot=efi,warm apic=debug rw net.ifnames=0 
+}

+ 68 - 0
board/PSG/iot2000/linux-4.4-patches/0001-stmmac-Add-support-for-SIMATIC-IOT2000-platform.patch

@@ -0,0 +1,68 @@
+From 702a99a0434380b1b7ce1b9045a71fbc30b436bb Mon Sep 17 00:00:00 2001
+From: Jan Kiszka <jan.kiszka@siemens.com>
+Date: Wed, 6 Jul 2016 15:27:20 +0100
+Subject: [PATCH 01/27] stmmac: Add support for SIMATIC IOT2000 platform
+
+The IOT2000 is industrial controller platform, derived from the Intel
+Galileo Gen2 board. The variant IOT2020 comes with one LAN port, the
+IOT2040 has two of them. They can be told apart based on the board asset
+tag in the DMI table.
+
+Based on patch by Sascha Weisenberger.
+
+Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
+---
+ drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c | 16 +++++++++++++++-
+ 1 file changed, 15 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c
+index d71a721ea61c..4801a46d0f07 100644
+--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c
++++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c
+@@ -36,6 +36,7 @@
+  */
+ struct stmmac_pci_dmi_data {
+ 	const char *name;
++	const char *asset_tag;
+ 	unsigned int func;
+ 	int phy_addr;
+ };
+@@ -50,6 +51,7 @@ struct stmmac_pci_info {
+ static int stmmac_pci_find_phy_addr(struct stmmac_pci_info *info)
+ {
+ 	const char *name = dmi_get_system_info(DMI_BOARD_NAME);
++	const char *asset_tag = dmi_get_system_info(DMI_BOARD_ASSET_TAG);
+ 	unsigned int func = PCI_FUNC(info->pdev->devfn);
+ 	struct stmmac_pci_dmi_data *dmi;
+ 
+@@ -61,7 +63,8 @@ static int stmmac_pci_find_phy_addr(struct stmmac_pci_info *info)
+ 		return 1;
+ 
+ 	for (dmi = info->dmi; dmi->name && *dmi->name; dmi++) {
+-		if (!strcmp(dmi->name, name) && dmi->func == func)
++		if (dmi->func == func && !strcmp(dmi->name, name) &&
++		    (!dmi->asset_tag || !strcmp(dmi->asset_tag, asset_tag)))
+ 			return dmi->phy_addr;
+ 	}
+ 
+@@ -138,6 +141,17 @@ static struct stmmac_pci_dmi_data quark_pci_dmi_data[] = {
+ 		.func = 6,
+ 		.phy_addr = 1,
+ 	},
++	{
++		.name = "SIMATIC IOT2000",
++		.func = 6,
++		.phy_addr = 1,
++	},
++	{
++		.name = "SIMATIC IOT2000",
++		.asset_tag = "6ES7647-0AA00-1YA2",
++		.func = 7,
++		.phy_addr = 1,
++	},
+ 	{}
+ };
+ 
+-- 
+2.12.0
+

+ 33 - 0
board/PSG/iot2000/linux-4.4-patches/0002-serial-uapi-Add-support-for-bus-termination.patch

@@ -0,0 +1,33 @@
+From 78c076f026667f9a94592c54339b21af5ae09201 Mon Sep 17 00:00:00 2001
+From: Jan Kiszka <jan.kiszka@siemens.com>
+Date: Tue, 26 Jul 2016 20:31:09 +0200
+Subject: [PATCH 02/27] serial: uapi: Add support for bus termination
+
+The Siemens IOT2000 comes with a RS485 interface that allows to enable
+or disable bus termination via software. Add a bit to the flags field of
+serial_rs485 that applications can set in order to request this feature
+from the hardware. This seems generic enough to add it for everyone.
+Existing driver will simply ignore it when set.
+
+Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
+---
+ include/uapi/linux/serial.h | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/include/uapi/linux/serial.h b/include/uapi/linux/serial.h
+index 25331f9faa76..7934e3247b45 100644
+--- a/include/uapi/linux/serial.h
++++ b/include/uapi/linux/serial.h
+@@ -121,6 +121,9 @@ struct serial_rs485 {
+ #define SER_RS485_RTS_AFTER_SEND	(1 << 2)	/* Logical level for
+ 							   RTS pin after sent*/
+ #define SER_RS485_RX_DURING_TX		(1 << 4)
++#define SER_RS485_TERMINATE_BUS		(1 << 5)	/* Enable bus
++							   termination
++							   (if supported) */
+ 	__u32	delay_rts_before_send;	/* Delay before send (milliseconds) */
+ 	__u32	delay_rts_after_send;	/* Delay after send (milliseconds) */
+ 	__u32	padding[5];		/* Memory is cheap, new structs
+-- 
+2.12.0
+

+ 103 - 0
board/PSG/iot2000/linux-4.4-patches/0003-serial-8250_pci-Use-symbolic-constants-for-EXAR-s-MP.patch

@@ -0,0 +1,103 @@
+From 0b78ae582a7991832e13f01e25991a6287b5cd47 Mon Sep 17 00:00:00 2001
+From: Jan Kiszka <jan.kiszka@siemens.com>
+Date: Tue, 26 Jul 2016 21:00:59 +0200
+Subject: [PATCH 03/27] serial: 8250_pci: Use symbolic constants for EXAR's
+ MPIO registers
+
+Commit b6fce7382d72274336aeafe6e44da755a371ed32 upstream.
+
+Less magic that only requires comments.
+
+Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
+---
+ drivers/tty/serial/8250/8250_pci.c | 55 +++++++++++++++++++++++---------------
+ 1 file changed, 34 insertions(+), 21 deletions(-)
+
+diff --git a/drivers/tty/serial/8250/8250_pci.c b/drivers/tty/serial/8250/8250_pci.c
+index 83ff1724ec79..4df43fae4234 100644
+--- a/drivers/tty/serial/8250/8250_pci.c
++++ b/drivers/tty/serial/8250/8250_pci.c
+@@ -1755,6 +1755,19 @@ static int pci_eg20t_init(struct pci_dev *dev)
+ #define PCI_DEVICE_ID_EXAR_XR17V4358	0x4358
+ #define PCI_DEVICE_ID_EXAR_XR17V8358	0x8358
+ 
++#define UART_EXAR_MPIOINT_7_0	0x8f	/* MPIOINT[7:0] */
++#define UART_EXAR_MPIOLVL_7_0	0x90	/* MPIOLVL[7:0] */
++#define UART_EXAR_MPIO3T_7_0	0x91	/* MPIO3T[7:0] */
++#define UART_EXAR_MPIOINV_7_0	0x92	/* MPIOINV[7:0] */
++#define UART_EXAR_MPIOSEL_7_0	0x93	/* MPIOSEL[7:0] */
++#define UART_EXAR_MPIOOD_7_0	0x94	/* MPIOOD[7:0] */
++#define UART_EXAR_MPIOINT_15_8	0x95	/* MPIOINT[15:8] */
++#define UART_EXAR_MPIOLVL_15_8	0x96	/* MPIOLVL[15:8] */
++#define UART_EXAR_MPIO3T_15_8	0x97	/* MPIO3T[15:8] */
++#define UART_EXAR_MPIOINV_15_8	0x98	/* MPIOINV[15:8] */
++#define UART_EXAR_MPIOSEL_15_8	0x99	/* MPIOSEL[15:8] */
++#define UART_EXAR_MPIOOD_15_8	0x9a	/* MPIOOD[15:8] */
++
+ static int
+ pci_xr17c154_setup(struct serial_private *priv,
+ 		  const struct pciserial_board *board,
+@@ -1797,18 +1810,18 @@ pci_xr17v35x_setup(struct serial_private *priv,
+ 	 * Setup Multipurpose Input/Output pins.
+ 	 */
+ 	if (idx == 0) {
+-		writeb(0x00, p + 0x8f); /*MPIOINT[7:0]*/
+-		writeb(0x00, p + 0x90); /*MPIOLVL[7:0]*/
+-		writeb(0x00, p + 0x91); /*MPIO3T[7:0]*/
+-		writeb(0x00, p + 0x92); /*MPIOINV[7:0]*/
+-		writeb(0x00, p + 0x93); /*MPIOSEL[7:0]*/
+-		writeb(0x00, p + 0x94); /*MPIOOD[7:0]*/
+-		writeb(0x00, p + 0x95); /*MPIOINT[15:8]*/
+-		writeb(0x00, p + 0x96); /*MPIOLVL[15:8]*/
+-		writeb(0x00, p + 0x97); /*MPIO3T[15:8]*/
+-		writeb(0x00, p + 0x98); /*MPIOINV[15:8]*/
+-		writeb(0x00, p + 0x99); /*MPIOSEL[15:8]*/
+-		writeb(0x00, p + 0x9a); /*MPIOOD[15:8]*/
++		writeb(0x00, p + UART_EXAR_MPIOINT_7_0);
++		writeb(0x00, p + UART_EXAR_MPIOLVL_7_0);
++		writeb(0x00, p + UART_EXAR_MPIO3T_7_0);
++		writeb(0x00, p + UART_EXAR_MPIOINV_7_0);
++		writeb(0x00, p + UART_EXAR_MPIOSEL_7_0);
++		writeb(0x00, p + UART_EXAR_MPIOOD_7_0);
++		writeb(0x00, p + UART_EXAR_MPIOINT_15_8);
++		writeb(0x00, p + UART_EXAR_MPIOLVL_15_8);
++		writeb(0x00, p + UART_EXAR_MPIO3T_15_8);
++		writeb(0x00, p + UART_EXAR_MPIOINV_15_8);
++		writeb(0x00, p + UART_EXAR_MPIOSEL_15_8);
++		writeb(0x00, p + UART_EXAR_MPIOOD_15_8);
+ 	}
+ 	writeb(0x00, p + UART_EXAR_8XMODE);
+ 	writeb(UART_FCTR_EXAR_TRGD, p + UART_EXAR_FCTR);
+@@ -1844,20 +1857,20 @@ pci_fastcom335_setup(struct serial_private *priv,
+ 		switch (priv->dev->device) {
+ 		case PCI_DEVICE_ID_COMMTECH_4222PCI335:
+ 		case PCI_DEVICE_ID_COMMTECH_4224PCI335:
+-			writeb(0x78, p + 0x90); /* MPIOLVL[7:0] */
+-			writeb(0x00, p + 0x92); /* MPIOINV[7:0] */
+-			writeb(0x00, p + 0x93); /* MPIOSEL[7:0] */
++			writeb(0x78, p + UART_EXAR_MPIOLVL_7_0);
++			writeb(0x00, p + UART_EXAR_MPIOINV_7_0);
++			writeb(0x00, p + UART_EXAR_MPIOSEL_7_0);
+ 			break;
+ 		case PCI_DEVICE_ID_COMMTECH_2324PCI335:
+ 		case PCI_DEVICE_ID_COMMTECH_2328PCI335:
+-			writeb(0x00, p + 0x90); /* MPIOLVL[7:0] */
+-			writeb(0xc0, p + 0x92); /* MPIOINV[7:0] */
+-			writeb(0xc0, p + 0x93); /* MPIOSEL[7:0] */
++			writeb(0x00, p + UART_EXAR_MPIOLVL_7_0);
++			writeb(0xc0, p + UART_EXAR_MPIOINV_7_0);
++			writeb(0xc0, p + UART_EXAR_MPIOSEL_7_0);
+ 			break;
+ 		}
+-		writeb(0x00, p + 0x8f); /* MPIOINT[7:0] */
+-		writeb(0x00, p + 0x91); /* MPIO3T[7:0] */
+-		writeb(0x00, p + 0x94); /* MPIOOD[7:0] */
++		writeb(0x00, p + UART_EXAR_MPIOINT_7_0);
++		writeb(0x00, p + UART_EXAR_MPIO3T_7_0);
++		writeb(0x00, p + UART_EXAR_MPIOOD_7_0);
+ 	}
+ 	writeb(0x00, p + UART_EXAR_8XMODE);
+ 	writeb(UART_FCTR_EXAR_TRGD, p + UART_EXAR_FCTR);
+-- 
+2.12.0
+

+ 32 - 0
board/PSG/iot2000/linux-4.4-patches/0004-serial-8250_pci-Fix-EXAR-feature-control-register-co.patch

@@ -0,0 +1,32 @@
+From 2ace954358c4da794a73156bc701c3ecb0b33f19 Mon Sep 17 00:00:00 2001
+From: Jan Kiszka <jan.kiszka@siemens.com>
+Date: Tue, 26 Jul 2016 21:24:32 +0200
+Subject: [PATCH 04/27] serial: 8250_pci: Fix EXAR feature control register
+ constants
+
+According to the XR17V352 manual, bit 4 is IrDA control and bit 5 for
+485. Fortunately, no driver used them so far.
+
+Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
+---
+ include/uapi/linux/serial_reg.h | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/include/uapi/linux/serial_reg.h b/include/uapi/linux/serial_reg.h
+index 1e5ac4e776da..cdb9f97a63c7 100644
+--- a/include/uapi/linux/serial_reg.h
++++ b/include/uapi/linux/serial_reg.h
+@@ -366,8 +366,8 @@
+ #define UART_EXAR_DVID		0x8d	/* Device identification */
+ 
+ #define UART_EXAR_FCTR		0x08	/* Feature Control Register */
+-#define UART_FCTR_EXAR_IRDA	0x08	/* IrDa data encode select */
+-#define UART_FCTR_EXAR_485	0x10	/* Auto 485 half duplex dir ctl */
++#define UART_FCTR_EXAR_IRDA	0x10	/* IrDa data encode select */
++#define UART_FCTR_EXAR_485	0x20	/* Auto 485 half duplex dir ctl */
+ #define UART_FCTR_EXAR_TRGA	0x00	/* FIFO trigger table A */
+ #define UART_FCTR_EXAR_TRGB	0x60	/* FIFO trigger table B */
+ #define UART_FCTR_EXAR_TRGC	0x80	/* FIFO trigger table C */
+-- 
+2.12.0
+

+ 176 - 0
board/PSG/iot2000/linux-4.4-patches/0005-serial-8250_pci-Add-support-for-IOT2000-platform.patch

@@ -0,0 +1,176 @@
+From fcc7fd22dca592b95941a0c3440c07b232a3ce4b Mon Sep 17 00:00:00 2001
+From: Jan Kiszka <jan.kiszka@siemens.com>
+Date: Wed, 27 Jul 2016 16:32:20 +0200
+Subject: [PATCH 05/27] serial: 8250_pci: Add support for IOT2000 platform
+
+This implements the setup of RS232 and the switch-over to RS485 or RS422
+for the Siemens IOT2000 platform. That uses an EXAR XR17V352 with
+external logic to switch between the different modes. The external logic
+is controlled via MPIO pins of the EXAR controller.
+
+As the XR17V352 used on the IOT2000 is not equipped with an external
+EEPROM, it cannot present itself as IOT2000-variant via subvendor/
+subdevice IDs. Thus, we have to check via DMI for the target platform.
+
+Co-developed with Sascha Weisenberger.
+
+Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
+Signed-off-by: Sascha Weisenberger <sascha.weisenberger@siemens.com>
+---
+ drivers/tty/serial/8250/8250_pci.c | 96 ++++++++++++++++++++++++++++++++++++--
+ include/uapi/linux/serial_reg.h    |  2 +
+ 2 files changed, 95 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/tty/serial/8250/8250_pci.c b/drivers/tty/serial/8250/8250_pci.c
+index 4df43fae4234..1a918f924313 100644
+--- a/drivers/tty/serial/8250/8250_pci.c
++++ b/drivers/tty/serial/8250/8250_pci.c
+@@ -22,6 +22,7 @@
+ #include <linux/8250_pci.h>
+ #include <linux/bitops.h>
+ #include <linux/rational.h>
++#include <linux/dmi.h>
+ 
+ #include <asm/byteorder.h>
+ #include <asm/io.h>
+@@ -1786,11 +1787,92 @@ xr17v35x_has_slave(struct serial_private *priv)
+ 	        (dev_id == PCI_DEVICE_ID_EXAR_XR17V8358));
+ }
+ 
++/*
++ * IOT2000 MPIO wiring semantics:
++ *
++ * MPIO		Port	Function
++ * ----		----	--------
++ * 0		2 	Mode bit 0
++ * 1		2	Mode bit 1
++ * 2		2	Terminate bus
++ * 3		2	<reserved>
++ * 4		3	Mode bit 0
++ * 5		3	Mode bit 1
++ * 6		3	Terminate bus
++ * 7		3	<reserved>
++ * 8		3	Enable
++ * 9		3	Enable
++ * 10		-	Red LED
++ * 11..15	-	<unused>
++ */
++
++/* IOT2000 MPIOs 0..7 */
++#define IOT2000_UART_MODE_RS232		0x01
++#define IOT2000_UART_MODE_RS485		0x02
++#define IOT2000_UART_MODE_RS422		0x03
++#define IOT2000_UART_TERMINATE_BUS	0x04
++
++#define IOT2000_UART1_MASK		0x0f
++#define IOT2000_UART2_SHIFT		4
++
++#define IOT2000_UARTS_DEFAULT_MODE	0x11	/* both RS232 */
++#define IOT2000_UARTS_DEFAULT_GPIO_MODE	0x88	/* direction pins as input */
++
++/* IOT2000 MPIOs 8..15 */
++#define IOT2000_UARTS_ENABLE		0x03
++
++static int pci_iot2000_rs485_config(struct uart_port *port,
++				    struct serial_rs485 *rs485)
++{
++	u8 __iomem *p = port->membase;
++	u8 mask = IOT2000_UART1_MASK;
++	u8 mode, value;
++	bool is_rs485 = false;
++
++	if (rs485->flags & SER_RS485_ENABLED) {
++		is_rs485 = true;
++		if (rs485->flags & SER_RS485_RX_DURING_TX)
++			mode = IOT2000_UART_MODE_RS422;
++		else
++			mode = IOT2000_UART_MODE_RS485;
++
++		if (rs485->flags & SER_RS485_TERMINATE_BUS)
++			mode |= IOT2000_UART_TERMINATE_BUS;
++	} else {
++		mode = IOT2000_UART_MODE_RS232;
++	}
++
++	if (port->line == 3) {
++		mask <<= IOT2000_UART2_SHIFT;
++		mode <<= IOT2000_UART2_SHIFT;
++	}
++
++	value = readb(p + UART_EXAR_MPIOLVL_7_0);
++	value &= ~mask;
++	value |= mode;
++	writeb(value, p + UART_EXAR_MPIOLVL_7_0);
++
++	value = readb(p + UART_EXAR_FCTR);
++	if (is_rs485)
++		value |= UART_FCTR_EXAR_485;
++	else
++		value &= ~UART_FCTR_EXAR_485;
++	writeb(value, p + UART_EXAR_FCTR);
++
++	if (is_rs485)
++		writeb(UART_EXAR_RS485_DLY(4), p + UART_MSR);
++
++	port->rs485 = *rs485;
++
++	return 0;
++}
++
+ static int
+ pci_xr17v35x_setup(struct serial_private *priv,
+ 		  const struct pciserial_board *board,
+ 		  struct uart_8250_port *port, int idx)
+ {
++	bool is_iot2000;
+ 	u8 __iomem *p;
+ 
+ 	p = pci_ioremap_bar(priv->dev, 0);
+@@ -1799,6 +1881,11 @@ pci_xr17v35x_setup(struct serial_private *priv,
+ 
+ 	port->port.flags |= UPF_EXAR_EFR;
+ 
++	is_iot2000 = strcmp(dmi_get_system_info(DMI_BOARD_NAME),
++			    "SIMATIC IOT2000") == 0;
++	if (is_iot2000)
++		port->port.rs485_config = pci_iot2000_rs485_config;
++
+ 	/*
+ 	 * Setup the uart clock for the devices on expansion slot to
+ 	 * half the clock speed of the main chip (which is 125MHz)
+@@ -1811,13 +1898,16 @@ pci_xr17v35x_setup(struct serial_private *priv,
+ 	 */
+ 	if (idx == 0) {
+ 		writeb(0x00, p + UART_EXAR_MPIOINT_7_0);
+-		writeb(0x00, p + UART_EXAR_MPIOLVL_7_0);
++		writeb(is_iot2000 ? IOT2000_UARTS_DEFAULT_MODE : 0x00,
++		       p + UART_EXAR_MPIOLVL_7_0);
+ 		writeb(0x00, p + UART_EXAR_MPIO3T_7_0);
+ 		writeb(0x00, p + UART_EXAR_MPIOINV_7_0);
+-		writeb(0x00, p + UART_EXAR_MPIOSEL_7_0);
++		writeb(is_iot2000 ? IOT2000_UARTS_DEFAULT_GPIO_MODE : 0x00,
++		       p + UART_EXAR_MPIOSEL_7_0);
+ 		writeb(0x00, p + UART_EXAR_MPIOOD_7_0);
+ 		writeb(0x00, p + UART_EXAR_MPIOINT_15_8);
+-		writeb(0x00, p + UART_EXAR_MPIOLVL_15_8);
++		writeb(is_iot2000 ? IOT2000_UARTS_ENABLE : 0x00,
++		       p + UART_EXAR_MPIOLVL_15_8);
+ 		writeb(0x00, p + UART_EXAR_MPIO3T_15_8);
+ 		writeb(0x00, p + UART_EXAR_MPIOINV_15_8);
+ 		writeb(0x00, p + UART_EXAR_MPIOSEL_15_8);
+diff --git a/include/uapi/linux/serial_reg.h b/include/uapi/linux/serial_reg.h
+index cdb9f97a63c7..9be7eb2478fe 100644
+--- a/include/uapi/linux/serial_reg.h
++++ b/include/uapi/linux/serial_reg.h
+@@ -365,6 +365,8 @@
+ #define UART_EXAR_SLEEP		0x8b	/* Sleep mode */
+ #define UART_EXAR_DVID		0x8d	/* Device identification */
+ 
++#define UART_EXAR_RS485_DLY(x) (x << 4)
++
+ #define UART_EXAR_FCTR		0x08	/* Feature Control Register */
+ #define UART_FCTR_EXAR_IRDA	0x10	/* IrDa data encode select */
+ #define UART_FCTR_EXAR_485	0x20	/* Auto 485 half duplex dir ctl */
+-- 
+2.12.0
+

+ 152 - 0
board/PSG/iot2000/linux-4.4-patches/0006-serial-8250_pci-Add-support-for-red-user-LED-on-IOT2.patch

@@ -0,0 +1,152 @@
+From ef914549f1cbf53abf2720d8f5d163125484a000 Mon Sep 17 00:00:00 2001
+From: Jan Kiszka <jan.kiszka@siemens.com>
+Date: Mon, 9 Jan 2017 20:24:39 +0100
+Subject: [PATCH 06/27] serial: 8250_pci: Add support for red user LED on
+ IOT2040
+
+The IOT2040 has a red LED connected to one of the MPIOs of the EXAR
+on-board UARTs. Wire it up to the LED subsystem.
+
+Based on work by Frank Ehlis and Sascha Weisenberger.
+
+Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
+---
+ drivers/tty/serial/8250/8250_pci.c | 80 +++++++++++++++++++++++++++++++++++++-
+ 1 file changed, 79 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/tty/serial/8250/8250_pci.c b/drivers/tty/serial/8250/8250_pci.c
+index 1a918f924313..5cd4fb8cb20b 100644
+--- a/drivers/tty/serial/8250/8250_pci.c
++++ b/drivers/tty/serial/8250/8250_pci.c
+@@ -23,6 +23,7 @@
+ #include <linux/bitops.h>
+ #include <linux/rational.h>
+ #include <linux/dmi.h>
++#include <linux/leds.h>
+ 
+ #include <asm/byteorder.h>
+ #include <asm/io.h>
+@@ -59,6 +60,7 @@ struct serial_private {
+ 	void __iomem		*remapped_bar[PCI_NUM_BAR_RESOURCES];
+ 	struct pci_serial_quirk	*quirk;
+ 	const struct pciserial_board *board;
++	void			*quirk_private;
+ 	int			line[0];
+ };
+ 
+@@ -1820,6 +1822,14 @@ xr17v35x_has_slave(struct serial_private *priv)
+ 
+ /* IOT2000 MPIOs 8..15 */
+ #define IOT2000_UARTS_ENABLE		0x03
++#define IOT2000_UART_LED_RED		0x04
++
++#define IOT2000_UART_LEDFS_NAME		"mpio_uart_led:red:user"
++
++struct iot2000_serial_private {
++	u8 __iomem *membase;
++	struct led_classdev led;
++};
+ 
+ static int pci_iot2000_rs485_config(struct uart_port *port,
+ 				    struct serial_rs485 *rs485)
+@@ -1867,13 +1877,43 @@ static int pci_iot2000_rs485_config(struct uart_port *port,
+ 	return 0;
+ }
+ 
++static void iot2000_brightness_set(struct led_classdev *cdev,
++				   enum led_brightness brightness)
++{
++	struct iot2000_serial_private *iot2000_priv =
++		container_of(cdev, struct iot2000_serial_private, led);
++	u8 value;
++
++	value = readb(iot2000_priv->membase + UART_EXAR_MPIOLVL_15_8);
++	if (brightness == LED_OFF)
++		value &= ~IOT2000_UART_LED_RED;
++	else
++		value |= IOT2000_UART_LED_RED;
++	writeb(value, iot2000_priv->membase + UART_EXAR_MPIOLVL_15_8);
++}
++
++static enum led_brightness iot2000_brightness_get(struct led_classdev *cdev)
++{
++	struct iot2000_serial_private *iot2000_priv =
++		container_of(cdev, struct iot2000_serial_private, led);
++	u8 value;
++
++	value = readb(iot2000_priv->membase + UART_EXAR_MPIOLVL_15_8);
++	if (value & IOT2000_UART_LED_RED)
++		return LED_FULL;
++
++	return LED_OFF;
++}
++
+ static int
+ pci_xr17v35x_setup(struct serial_private *priv,
+ 		  const struct pciserial_board *board,
+ 		  struct uart_8250_port *port, int idx)
+ {
++	struct iot2000_serial_private *iot2000_priv = NULL;
+ 	bool is_iot2000;
+ 	u8 __iomem *p;
++	int ret;
+ 
+ 	p = pci_ioremap_bar(priv->dev, 0);
+ 	if (p == NULL)
+@@ -1919,7 +1959,44 @@ pci_xr17v35x_setup(struct serial_private *priv,
+ 	writeb(128, p + UART_EXAR_RXTRG);
+ 	iounmap(p);
+ 
+-	return pci_default_setup(priv, board, port, idx);
++	ret = pci_default_setup(priv, board, port, idx);
++	if (ret)
++		return ret;
++
++	/* on IOT2000, register the red LED attached to the MPIO */
++	if (is_iot2000 && idx == 0) {
++		iot2000_priv = kzalloc(sizeof(*iot2000_priv), GFP_KERNEL);
++		if (!iot2000_priv)
++			return -ENOMEM;
++
++		iot2000_priv->membase = port->port.membase;
++
++		iot2000_priv->led.name = IOT2000_UART_LEDFS_NAME;
++		iot2000_priv->led.max_brightness = 1;
++		iot2000_priv->led.brightness_set = iot2000_brightness_set;
++		iot2000_priv->led.brightness_get = iot2000_brightness_get;
++		iot2000_priv->led.default_trigger = "none";
++		ret = led_classdev_register(port->port.dev, &iot2000_priv->led);
++		if (ret) {
++			kfree(iot2000_priv);
++			return ret;
++		}
++
++		priv->quirk_private = iot2000_priv;
++	}
++
++	return 0;
++}
++
++void pci_xr17v35x_exit(struct pci_dev *dev)
++{
++	struct serial_private *priv = pci_get_drvdata(dev);
++	struct iot2000_serial_private *iot2000_priv = priv->quirk_private;
++
++	if (iot2000_priv) {
++		led_classdev_unregister(&iot2000_priv->led);
++		kfree(iot2000_priv);
++	}
+ }
+ 
+ #define PCI_DEVICE_ID_COMMTECH_4222PCI335 0x0004
+@@ -2571,6 +2648,7 @@ static struct pci_serial_quirk pci_serial_quirks[] __refdata = {
+ 		.subvendor	= PCI_ANY_ID,
+ 		.subdevice	= PCI_ANY_ID,
+ 		.setup		= pci_xr17v35x_setup,
++		.exit		= pci_xr17v35x_exit,
+ 	},
+ 	{
+ 		.vendor = PCI_VENDOR_ID_EXAR,
+-- 
+2.12.0
+

+ 67 - 0
board/PSG/iot2000/linux-4.4-patches/0007-spi-pxa2xx-Factor-out-handle_bad_msg.patch

@@ -0,0 +1,67 @@
+From fd5837ca7accfcdfa68d44ab38359d1fd0a6f142 Mon Sep 17 00:00:00 2001
+From: Jan Kiszka <jan.kiszka@siemens.com>
+Date: Mon, 16 Jan 2017 19:44:54 +0100
+Subject: [PATCH 07/27] spi: pxa2xx: Factor out handle_bad_msg
+
+Commit b03124825b8612bf371e5b4ccc2cd812ed3c2dbb upstream.
+
+As suggested by Andy Shevchenko: Decouple this corner cause from the
+general handling logic in ssp_int.
+
+Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
+Reviewed-by: Jarkko Nikula <jarkko.nikula@linux.intel.com>
+Signed-off-by: Mark Brown <broonie@kernel.org>
+---
+ drivers/spi/spi-pxa2xx.c | 29 +++++++++++++++--------------
+ 1 file changed, 15 insertions(+), 14 deletions(-)
+
+diff --git a/drivers/spi/spi-pxa2xx.c b/drivers/spi/spi-pxa2xx.c
+index 082d447ad929..904439fa6a00 100644
+--- a/drivers/spi/spi-pxa2xx.c
++++ b/drivers/spi/spi-pxa2xx.c
+@@ -677,6 +677,20 @@ static irqreturn_t interrupt_transfer(struct driver_data *drv_data)
+ 	return IRQ_HANDLED;
+ }
+ 
++static void handle_bad_msg(struct driver_data *drv_data)
++{
++	pxa2xx_spi_write(drv_data, SSCR0,
++			 pxa2xx_spi_read(drv_data, SSCR0) & ~SSCR0_SSE);
++	pxa2xx_spi_write(drv_data, SSCR1,
++			 pxa2xx_spi_read(drv_data, SSCR1) & ~drv_data->int_cr1);
++	if (!pxa25x_ssp_comp(drv_data))
++		pxa2xx_spi_write(drv_data, SSTO, 0);
++	write_SSSR_CS(drv_data, drv_data->clear_sr);
++
++	dev_err(&drv_data->pdev->dev,
++		"bad message state in interrupt handler\n");
++}
++
+ static irqreturn_t ssp_int(int irq, void *dev_id)
+ {
+ 	struct driver_data *drv_data = dev_id;
+@@ -717,20 +731,7 @@ static irqreturn_t ssp_int(int irq, void *dev_id)
+ 		return IRQ_NONE;
+ 
+ 	if (!drv_data->cur_msg) {
+-
+-		pxa2xx_spi_write(drv_data, SSCR0,
+-				 pxa2xx_spi_read(drv_data, SSCR0)
+-				 & ~SSCR0_SSE);
+-		pxa2xx_spi_write(drv_data, SSCR1,
+-				 pxa2xx_spi_read(drv_data, SSCR1)
+-				 & ~drv_data->int_cr1);
+-		if (!pxa25x_ssp_comp(drv_data))
+-			pxa2xx_spi_write(drv_data, SSTO, 0);
+-		write_SSSR_CS(drv_data, drv_data->clear_sr);
+-
+-		dev_err(&drv_data->pdev->dev,
+-			"bad message state in interrupt handler\n");
+-
++		handle_bad_msg(drv_data);
+ 		/* Never fail */
+ 		return IRQ_HANDLED;
+ 	}
+-- 
+2.12.0
+

+ 41 - 0
board/PSG/iot2000/linux-4.4-patches/0008-spi-pxa2xx-Prepare-for-edge-triggered-interrupts.patch

@@ -0,0 +1,41 @@
+From 7f9a454ea467bb1ee31cf77ce1c7e0aa1950d6d1 Mon Sep 17 00:00:00 2001
+From: Jan Kiszka <jan.kiszka@siemens.com>
+Date: Sat, 21 Jan 2017 10:06:38 +0100
+Subject: [PATCH 08/27] spi: pxa2xx: Prepare for edge-triggered interrupts
+
+Commit e51e9b93049f624c179bab2c651995bca22b5bb7 upstream.
+
+When using the a device with edge-triggered interrupts, such as MSIs,
+the interrupt handler has to ensure that there is a point in time during
+its execution where all interrupts sources are silent so that a new
+event can trigger a new interrupt again.
+
+This is achieved here by disabling all interrupt sources for a moment
+before processing them according to the status register. If a new
+interrupt should have arrived after we read the status, it will now
+re-trigger the interrupt, even in edge mode.
+
+Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
+Acked-by: Robert Jarzmik <robert.jarzmik@free.fr>
+Signed-off-by: Mark Brown <broonie@kernel.org>
+---
+ drivers/spi/spi-pxa2xx.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/drivers/spi/spi-pxa2xx.c b/drivers/spi/spi-pxa2xx.c
+index 904439fa6a00..b52faa295698 100644
+--- a/drivers/spi/spi-pxa2xx.c
++++ b/drivers/spi/spi-pxa2xx.c
+@@ -730,6 +730,9 @@ static irqreturn_t ssp_int(int irq, void *dev_id)
+ 	if (!(status & mask))
+ 		return IRQ_NONE;
+ 
++	pxa2xx_spi_write(drv_data, SSCR1, sccr1_reg & ~drv_data->int_cr1);
++	pxa2xx_spi_write(drv_data, SSCR1, sccr1_reg);
++
+ 	if (!drv_data->cur_msg) {
+ 		handle_bad_msg(drv_data);
+ 		/* Never fail */
+-- 
+2.12.0
+

+ 39 - 0
board/PSG/iot2000/linux-4.4-patches/0009-spi-pca2xx-pci-Allow-MSI.patch

@@ -0,0 +1,39 @@
+From e8bc5d5bb5b203ffe4a1266aa84dcfb740842f4a Mon Sep 17 00:00:00 2001
+From: Jan Kiszka <jan.kiszka@siemens.com>
+Date: Mon, 26 Sep 2016 08:52:49 +0200
+Subject: [PATCH 09/27] spi: pca2xx-pci: Allow MSI
+
+Backport of 64e02cb0bdfc7cef0a01e2ad4d567fdc0a74450e upstream.
+
+Now that the core is ready for edge-triggered interrupts, we can safely
+allow the PCI versions that provide this to enable the feature and,
+thus, have less shared interrupts.
+
+Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
+---
+ drivers/spi/spi-pxa2xx-pci.c | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/spi/spi-pxa2xx-pci.c b/drivers/spi/spi-pxa2xx-pci.c
+index 562ffc1282bc..0b1c9c4aa355 100644
+--- a/drivers/spi/spi-pxa2xx-pci.c
++++ b/drivers/spi/spi-pxa2xx-pci.c
+@@ -156,10 +156,14 @@ static int pxa2xx_spi_pci_probe(struct pci_dev *dev,
+ 		dev_err(&dev->dev, "failed to ioremap() registers\n");
+ 		return -EIO;
+ 	}
+-	ssp->irq = dev->irq;
+ 	ssp->port_id = (c->port_id >= 0) ? c->port_id : dev->devfn;
+ 	ssp->type = c->type;
+ 
++	pci_set_master(dev);
++
++	pci_enable_msi(dev);
++	ssp->irq = dev->irq;
++
+ 	snprintf(buf, sizeof(buf), "pxa2xx-spi.%d", ssp->port_id);
+ 	ssp->clk = clk_register_fixed_rate(&dev->dev, buf , NULL,
+ 					CLK_IS_ROOT, c->max_clk_rate);
+-- 
+2.12.0
+

+ 129 - 0
board/PSG/iot2000/linux-4.4-patches/0010-efi-Move-efi_status_to_err-to-drivers-firmware-efi.patch

@@ -0,0 +1,129 @@
+From b553ed1d8ee69dfde08677c0843dc2931c3c3ad0 Mon Sep 17 00:00:00 2001
+From: Matt Fleming <matt@codeblueprint.co.uk>
+Date: Mon, 25 Apr 2016 21:06:58 +0100
+Subject: [PATCH 10/27] efi: Move efi_status_to_err() to drivers/firmware/efi/
+
+Commit 806b0351c9ff9890c1ef0ba2c46237baef49ac79 upstream.
+
+Move efi_status_to_err() to the architecture independent code as it's
+generally useful in all bits of EFI code where there is a need to
+convert an efi_status_t to a kernel error value.
+
+Signed-off-by: Matt Fleming <matt@codeblueprint.co.uk>
+Acked-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
+Cc: Borislav Petkov <bp@alien8.de>
+Cc: Kweh Hock Leong <hock.leong.kweh@intel.com>
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: Thomas Gleixner <tglx@linutronix.de>
+Cc: joeyli <jlee@suse.com>
+Cc: linux-efi@vger.kernel.org
+Link: http://lkml.kernel.org/r/1461614832-17633-27-git-send-email-matt@codeblueprint.co.uk
+Signed-off-by: Ingo Molnar <mingo@kernel.org>
+Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
+---
+ drivers/firmware/efi/efi.c  | 33 +++++++++++++++++++++++++++++++++
+ drivers/firmware/efi/vars.c | 33 ---------------------------------
+ include/linux/efi.h         |  2 ++
+ 3 files changed, 35 insertions(+), 33 deletions(-)
+
+diff --git a/drivers/firmware/efi/efi.c b/drivers/firmware/efi/efi.c
+index 951d04e976c9..5e803916fbb6 100644
+--- a/drivers/firmware/efi/efi.c
++++ b/drivers/firmware/efi/efi.c
+@@ -748,3 +748,36 @@ u64 __weak efi_mem_attributes(unsigned long phys_addr)
+ 	}
+ 	return 0;
+ }
++
++int efi_status_to_err(efi_status_t status)
++{
++	int err;
++
++	switch (status) {
++	case EFI_SUCCESS:
++		err = 0;
++		break;
++	case EFI_INVALID_PARAMETER:
++		err = -EINVAL;
++		break;
++	case EFI_OUT_OF_RESOURCES:
++		err = -ENOSPC;
++		break;
++	case EFI_DEVICE_ERROR:
++		err = -EIO;
++		break;
++	case EFI_WRITE_PROTECTED:
++		err = -EROFS;
++		break;
++	case EFI_SECURITY_VIOLATION:
++		err = -EACCES;
++		break;
++	case EFI_NOT_FOUND:
++		err = -ENOENT;
++		break;
++	default:
++		err = -EINVAL;
++	}
++
++	return err;
++}
+diff --git a/drivers/firmware/efi/vars.c b/drivers/firmware/efi/vars.c
+index c7eeeb44e72a..56228c50c6f4 100644
+--- a/drivers/firmware/efi/vars.c
++++ b/drivers/firmware/efi/vars.c
+@@ -318,39 +318,6 @@ check_var_size(u32 attributes, unsigned long size)
+ 	return fops->query_variable_store(attributes, size);
+ }
+ 
+-static int efi_status_to_err(efi_status_t status)
+-{
+-	int err;
+-
+-	switch (status) {
+-	case EFI_SUCCESS:
+-		err = 0;
+-		break;
+-	case EFI_INVALID_PARAMETER:
+-		err = -EINVAL;
+-		break;
+-	case EFI_OUT_OF_RESOURCES:
+-		err = -ENOSPC;
+-		break;
+-	case EFI_DEVICE_ERROR:
+-		err = -EIO;
+-		break;
+-	case EFI_WRITE_PROTECTED:
+-		err = -EROFS;
+-		break;
+-	case EFI_SECURITY_VIOLATION:
+-		err = -EACCES;
+-		break;
+-	case EFI_NOT_FOUND:
+-		err = -ENOENT;
+-		break;
+-	default:
+-		err = -EINVAL;
+-	}
+-
+-	return err;
+-}
+-
+ static bool variable_is_present(efi_char16_t *variable_name, efi_guid_t *vendor,
+ 				struct list_head *head)
+ {
+diff --git a/include/linux/efi.h b/include/linux/efi.h
+index 496c2d4ff76e..729c9116a067 100644
+--- a/include/linux/efi.h
++++ b/include/linux/efi.h
+@@ -999,6 +999,8 @@ static inline void
+ efi_reboot(enum reboot_mode reboot_mode, const char *__unused) {}
+ #endif
+ 
++extern int efi_status_to_err(efi_status_t status);
++
+ /*
+  * Variable Attributes
+  */
+-- 
+2.12.0
+

+ 431 - 0
board/PSG/iot2000/linux-4.4-patches/0011-efi-Add-capsule-update-support.patch

@@ -0,0 +1,431 @@
+From 62694114a8052ff871f0cdc86034e4711f7b7579 Mon Sep 17 00:00:00 2001
+From: Matt Fleming <matt@codeblueprint.co.uk>
+Date: Mon, 25 Apr 2016 21:06:59 +0100
+Subject: [PATCH 11/27] efi: Add 'capsule' update support
+
+Commit f0133f3c5b8bb34ec4dec50c27e7a655aeee8935 upstream.
+
+The EFI capsule mechanism allows data blobs to be passed to the EFI
+firmware. A common use case is performing firmware updates. This patch
+just introduces the main infrastructure for interacting with the
+firmware, and a driver that allows users to upload capsules will come
+in a later patch.
+
+Once a capsule has been passed to the firmware, the next reboot must
+be performed using the ResetSystem() EFI runtime service, which may
+involve overriding the reboot type specified by reboot=. This ensures
+the reset value returned by QueryCapsuleCapabilities() is used to
+reset the system, which is required for the capsule to be processed.
+efi_capsule_pending() is provided for this purpose.
+
+At the moment we only allow a single capsule blob to be sent to the
+firmware despite the fact that UpdateCapsule() takes a 'CapsuleCount'
+parameter. This simplifies the API and shouldn't result in any
+downside since it is still possible to send multiple capsules by
+repeatedly calling UpdateCapsule().
+
+Signed-off-by: Matt Fleming <matt@codeblueprint.co.uk>
+Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
+Cc: Borislav Petkov <bp@alien8.de>
+Cc: Bryan O'Donoghue <pure.logic@nexus-software.ie>
+Cc: Kweh Hock Leong <hock.leong.kweh@intel.com>
+Cc: Mark Salter <msalter@redhat.com>
+Cc: Peter Jones <pjones@redhat.com>
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: Thomas Gleixner <tglx@linutronix.de>
+Cc: joeyli <jlee@suse.com>
+Cc: linux-efi@vger.kernel.org
+Link: http://lkml.kernel.org/r/1461614832-17633-28-git-send-email-matt@codeblueprint.co.uk
+Signed-off-by: Ingo Molnar <mingo@kernel.org>
+Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
+---
+ drivers/firmware/efi/Makefile  |   1 +
+ drivers/firmware/efi/capsule.c | 300 +++++++++++++++++++++++++++++++++++++++++
+ drivers/firmware/efi/reboot.c  |  12 +-
+ include/linux/efi.h            |  14 ++
+ 4 files changed, 326 insertions(+), 1 deletion(-)
+ create mode 100644 drivers/firmware/efi/capsule.c
+
+diff --git a/drivers/firmware/efi/Makefile b/drivers/firmware/efi/Makefile
+index ec379a4164cc..54b19cdbfcf8 100644
+--- a/drivers/firmware/efi/Makefile
++++ b/drivers/firmware/efi/Makefile
+@@ -10,6 +10,7 @@
+ KASAN_SANITIZE_runtime-wrappers.o	:= n
+ 
+ obj-$(CONFIG_EFI)			+= efi.o vars.o reboot.o
++obj-$(CONFIG_EFI)			+= capsule.o
+ obj-$(CONFIG_EFI_VARS)			+= efivars.o
+ obj-$(CONFIG_EFI_ESRT)			+= esrt.o
+ obj-$(CONFIG_EFI_VARS_PSTORE)		+= efi-pstore.o
+diff --git a/drivers/firmware/efi/capsule.c b/drivers/firmware/efi/capsule.c
+new file mode 100644
+index 000000000000..0de55944ac0b
+--- /dev/null
++++ b/drivers/firmware/efi/capsule.c
+@@ -0,0 +1,300 @@
++/*
++ * EFI capsule support.
++ *
++ * Copyright 2013 Intel Corporation; author Matt Fleming
++ *
++ * This file is part of the Linux kernel, and is made available under
++ * the terms of the GNU General Public License version 2.
++ */
++
++#define pr_fmt(fmt) "efi: " fmt
++
++#include <linux/slab.h>
++#include <linux/mutex.h>
++#include <linux/highmem.h>
++#include <linux/efi.h>
++#include <linux/vmalloc.h>
++#include <asm/io.h>
++
++typedef struct {
++	u64 length;
++	u64 data;
++} efi_capsule_block_desc_t;
++
++static bool capsule_pending;
++static int efi_reset_type = -1;
++
++/*
++ * capsule_mutex serialises access to both capsule_pending and
++ * efi_reset_type.
++ */
++static DEFINE_MUTEX(capsule_mutex);
++
++/**
++ * efi_capsule_pending - has a capsule been passed to the firmware?
++ * @reset_type: store the type of EFI reset if capsule is pending
++ *
++ * To ensure that the registered capsule is processed correctly by the
++ * firmware we need to perform a specific type of reset. If a capsule is
++ * pending return the reset type in @reset_type.
++ *
++ * This function will race with callers of efi_capsule_update(), for
++ * example, calling this function while somebody else is in
++ * efi_capsule_update() but hasn't reached efi_capsue_update_locked()
++ * will miss the updates to capsule_pending and efi_reset_type after
++ * efi_capsule_update_locked() completes.
++ *
++ * A non-racy use is from platform reboot code because we use
++ * system_state to ensure no capsules can be sent to the firmware once
++ * we're at SYSTEM_RESTART. See efi_capsule_update_locked().
++ */
++bool efi_capsule_pending(int *reset_type)
++{
++	bool rv = false;
++
++	mutex_lock(&capsule_mutex);
++	if (!capsule_pending)
++		goto out;
++
++	if (reset_type)
++		*reset_type = efi_reset_type;
++	rv = true;
++out:
++	mutex_unlock(&capsule_mutex);
++	return rv;
++}
++
++/*
++ * Whitelist of EFI capsule flags that we support.
++ *
++ * We do not handle EFI_CAPSULE_INITIATE_RESET because that would
++ * require us to prepare the kernel for reboot. Refuse to load any
++ * capsules with that flag and any other flags that we do not know how
++ * to handle.
++ */
++#define EFI_CAPSULE_SUPPORTED_FLAG_MASK			\
++	(EFI_CAPSULE_PERSIST_ACROSS_RESET | EFI_CAPSULE_POPULATE_SYSTEM_TABLE)
++
++/**
++ * efi_capsule_supported - does the firmware support the capsule?
++ * @guid: vendor guid of capsule
++ * @flags: capsule flags
++ * @size: size of capsule data
++ * @reset: the reset type required for this capsule
++ *
++ * Check whether a capsule with @flags is supported by the firmware
++ * and that @size doesn't exceed the maximum size for a capsule.
++ *
++ * No attempt is made to check @reset against the reset type required
++ * by any pending capsules because of the races involved.
++ */
++int efi_capsule_supported(efi_guid_t guid, u32 flags, size_t size, int *reset)
++{
++	efi_capsule_header_t *capsule;
++	efi_status_t status;
++	u64 max_size;
++	int rv = 0;
++
++	if (flags & ~EFI_CAPSULE_SUPPORTED_FLAG_MASK)
++		return -EINVAL;
++
++	capsule = kmalloc(sizeof(*capsule), GFP_KERNEL);
++	if (!capsule)
++		return -ENOMEM;
++
++	capsule->headersize = capsule->imagesize = sizeof(*capsule);
++	memcpy(&capsule->guid, &guid, sizeof(efi_guid_t));
++	capsule->flags = flags;
++
++	status = efi.query_capsule_caps(&capsule, 1, &max_size, reset);
++	if (status != EFI_SUCCESS) {
++		rv = efi_status_to_err(status);
++		goto out;
++	}
++
++	if (size > max_size)
++		rv = -ENOSPC;
++out:
++	kfree(capsule);
++	return rv;
++}
++EXPORT_SYMBOL_GPL(efi_capsule_supported);
++
++/*
++ * Every scatter gather list (block descriptor) page must end with a
++ * continuation pointer. The last continuation pointer of the last
++ * page must be zero to mark the end of the chain.
++ */
++#define SGLIST_PER_PAGE	((PAGE_SIZE / sizeof(efi_capsule_block_desc_t)) - 1)
++
++/*
++ * How many scatter gather list (block descriptor) pages do we need
++ * to map @count pages?
++ */
++static inline unsigned int sg_pages_num(unsigned int count)
++{
++	return DIV_ROUND_UP(count, SGLIST_PER_PAGE);
++}
++
++/**
++ * efi_capsule_update_locked - pass a single capsule to the firmware
++ * @capsule: capsule to send to the firmware
++ * @sg_pages: array of scatter gather (block descriptor) pages
++ * @reset: the reset type required for @capsule
++ *
++ * Since this function must be called under capsule_mutex check
++ * whether efi_reset_type will conflict with @reset, and atomically
++ * set it and capsule_pending if a capsule was successfully sent to
++ * the firmware.
++ *
++ * We also check to see if the system is about to restart, and if so,
++ * abort. This avoids races between efi_capsule_update() and
++ * efi_capsule_pending().
++ */
++static int
++efi_capsule_update_locked(efi_capsule_header_t *capsule,
++			  struct page **sg_pages, int reset)
++{
++	efi_physical_addr_t sglist_phys;
++	efi_status_t status;
++
++	lockdep_assert_held(&capsule_mutex);
++
++	/*
++	 * If someone has already registered a capsule that requires a
++	 * different reset type, we're out of luck and must abort.
++	 */
++	if (efi_reset_type >= 0 && efi_reset_type != reset) {
++		pr_err("Conflicting capsule reset type %d (%d).\n",
++		       reset, efi_reset_type);
++		return -EINVAL;
++	}
++
++	/*
++	 * If the system is getting ready to restart it may have
++	 * called efi_capsule_pending() to make decisions (such as
++	 * whether to force an EFI reboot), and we're racing against
++	 * that call. Abort in that case.
++	 */
++	if (unlikely(system_state == SYSTEM_RESTART)) {
++		pr_warn("Capsule update raced with reboot, aborting.\n");
++		return -EINVAL;
++	}
++
++	sglist_phys = page_to_phys(sg_pages[0]);
++
++	status = efi.update_capsule(&capsule, 1, sglist_phys);
++	if (status == EFI_SUCCESS) {
++		capsule_pending = true;
++		efi_reset_type = reset;
++	}
++
++	return efi_status_to_err(status);
++}
++
++/**
++ * efi_capsule_update - send a capsule to the firmware
++ * @capsule: capsule to send to firmware
++ * @pages: an array of capsule data pages
++ *
++ * Build a scatter gather list with EFI capsule block descriptors to
++ * map the capsule described by @capsule with its data in @pages and
++ * send it to the firmware via the UpdateCapsule() runtime service.
++ *
++ * @capsule must be a virtual mapping of the first page in @pages
++ * (@pages[0]) in the kernel address space. That is, a
++ * capsule_header_t that describes the entire contents of the capsule
++ * must be at the start of the first data page.
++ *
++ * Even though this function will validate that the firmware supports
++ * the capsule guid, users will likely want to check that
++ * efi_capsule_supported() returns true before calling this function
++ * because it makes it easier to print helpful error messages.
++ *
++ * If the capsule is successfully submitted to the firmware, any
++ * subsequent calls to efi_capsule_pending() will return true. @pages
++ * must not be released or modified if this function returns
++ * successfully.
++ *
++ * Callers must be prepared for this function to fail, which can
++ * happen if we raced with system reboot or if there is already a
++ * pending capsule that has a reset type that conflicts with the one
++ * required by @capsule. Do NOT use efi_capsule_pending() to detect
++ * this conflict since that would be racy. Instead, submit the capsule
++ * to efi_capsule_update() and check the return value.
++ *
++ * Return 0 on success, a converted EFI status code on failure.
++ */
++int efi_capsule_update(efi_capsule_header_t *capsule, struct page **pages)
++{
++	u32 imagesize = capsule->imagesize;
++	efi_guid_t guid = capsule->guid;
++	unsigned int count, sg_count;
++	u32 flags = capsule->flags;
++	struct page **sg_pages;
++	int rv, reset_type;
++	int i, j;
++
++	rv = efi_capsule_supported(guid, flags, imagesize, &reset_type);
++	if (rv)
++		return rv;
++
++	count = DIV_ROUND_UP(imagesize, PAGE_SIZE);
++	sg_count = sg_pages_num(count);
++
++	sg_pages = kzalloc(sg_count * sizeof(*sg_pages), GFP_KERNEL);
++	if (!sg_pages)
++		return -ENOMEM;
++
++	for (i = 0; i < sg_count; i++) {
++		sg_pages[i] = alloc_page(GFP_KERNEL);
++		if (!sg_pages[i]) {
++			rv = -ENOMEM;
++			goto out;
++		}
++	}
++
++	for (i = 0; i < sg_count; i++) {
++		efi_capsule_block_desc_t *sglist;
++
++		sglist = kmap(sg_pages[i]);
++		if (!sglist) {
++			rv = -ENOMEM;
++			goto out;
++		}
++
++		for (j = 0; j < SGLIST_PER_PAGE && count > 0; j++) {
++			u64 sz = min_t(u64, imagesize, PAGE_SIZE);
++
++			sglist[j].length = sz;
++			sglist[j].data = page_to_phys(*pages++);
++
++			imagesize -= sz;
++			count--;
++		}
++
++		/* Continuation pointer */
++		sglist[j].length = 0;
++
++		if (i + 1 == sg_count)
++			sglist[j].data = 0;
++		else
++			sglist[j].data = page_to_phys(sg_pages[i + 1]);
++
++		kunmap(sg_pages[i]);
++	}
++
++	mutex_lock(&capsule_mutex);
++	rv = efi_capsule_update_locked(capsule, sg_pages, reset_type);
++	mutex_unlock(&capsule_mutex);
++
++out:
++	for (i = 0; rv && i < sg_count; i++) {
++		if (sg_pages[i])
++			__free_page(sg_pages[i]);
++	}
++
++	kfree(sg_pages);
++	return rv;
++}
++EXPORT_SYMBOL_GPL(efi_capsule_update);
+diff --git a/drivers/firmware/efi/reboot.c b/drivers/firmware/efi/reboot.c
+index 9c59d1c795d1..62ead9b9d871 100644
+--- a/drivers/firmware/efi/reboot.c
++++ b/drivers/firmware/efi/reboot.c
+@@ -9,7 +9,8 @@ int efi_reboot_quirk_mode = -1;
+ 
+ void efi_reboot(enum reboot_mode reboot_mode, const char *__unused)
+ {
+-	int efi_mode;
++	const char *str[] = { "cold", "warm", "shutdown", "platform" };
++	int efi_mode, cap_reset_mode;
+ 
+ 	if (!efi_enabled(EFI_RUNTIME_SERVICES))
+ 		return;
+@@ -30,6 +31,15 @@ void efi_reboot(enum reboot_mode reboot_mode, const char *__unused)
+ 	if (efi_reboot_quirk_mode != -1)
+ 		efi_mode = efi_reboot_quirk_mode;
+ 
++	if (efi_capsule_pending(&cap_reset_mode)) {
++		if (efi_mode != cap_reset_mode)
++			printk(KERN_CRIT "efi: %s reset requested but pending "
++			       "capsule update requires %s reset... Performing "
++			       "%s reset.\n", str[efi_mode], str[cap_reset_mode],
++			       str[cap_reset_mode]);
++		efi_mode = cap_reset_mode;
++	}
++
+ 	efi.reset_system(efi_mode, EFI_SUCCESS, 0, NULL);
+ }
+ 
+diff --git a/include/linux/efi.h b/include/linux/efi.h
+index 729c9116a067..848678a1cace 100644
+--- a/include/linux/efi.h
++++ b/include/linux/efi.h
+@@ -123,6 +123,13 @@ typedef struct {
+ } efi_capsule_header_t;
+ 
+ /*
++ * EFI capsule flags
++ */
++#define EFI_CAPSULE_PERSIST_ACROSS_RESET	0x00010000
++#define EFI_CAPSULE_POPULATE_SYSTEM_TABLE	0x00020000
++#define EFI_CAPSULE_INITIATE_RESET		0x00040000
++
++/*
+  * Allocation types for calls to boottime->allocate_pages.
+  */
+ #define EFI_ALLOCATE_ANY_PAGES		0
+@@ -1214,6 +1221,13 @@ int efivars_sysfs_init(void);
+ #define EFIVARS_DATA_SIZE_MAX 1024
+ 
+ #endif /* CONFIG_EFI_VARS */
++extern bool efi_capsule_pending(int *reset_type);
++
++extern int efi_capsule_supported(efi_guid_t guid, u32 flags,
++				 size_t size, int *reset);
++
++extern int efi_capsule_update(efi_capsule_header_t *capsule,
++			      struct page **pages);
+ 
+ #ifdef CONFIG_EFI_RUNTIME_MAP
+ int efi_runtime_map_init(struct kobject *);
+-- 
+2.12.0
+

+ 69 - 0
board/PSG/iot2000/linux-4.4-patches/0012-x86-efi-Force-EFI-reboot-to-process-pending-capsules.patch

@@ -0,0 +1,69 @@
+From 6a03e25a705c8d59bb9a849b9eee13f04b0a7b1d Mon Sep 17 00:00:00 2001
+From: Matt Fleming <matt@codeblueprint.co.uk>
+Date: Mon, 25 Apr 2016 21:07:00 +0100
+Subject: [PATCH 12/27] x86/efi: Force EFI reboot to process pending capsules
+
+Commit 87615a34d561ef59bd0cffc73256a21220dfdffd upstream.
+
+If an EFI capsule has been sent to the firmware we must match the type
+of EFI reset against that required by the capsule to ensure it is
+processed correctly.
+
+Force an EFI reboot if a capsule is pending for the next reset.
+
+Signed-off-by: Matt Fleming <matt@codeblueprint.co.uk>
+Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
+Cc: Borislav Petkov <bp@alien8.de>
+Cc: Kweh Hock Leong <hock.leong.kweh@intel.com>
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: Thomas Gleixner <tglx@linutronix.de>
+Cc: joeyli <jlee@suse.com>
+Cc: linux-efi@vger.kernel.org
+Link: http://lkml.kernel.org/r/1461614832-17633-29-git-send-email-matt@codeblueprint.co.uk
+Signed-off-by: Ingo Molnar <mingo@kernel.org>
+Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
+---
+ arch/x86/kernel/reboot.c | 9 +++++++++
+ include/linux/efi.h      | 6 ++++++
+ 2 files changed, 15 insertions(+)
+
+diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c
+index f660d63f40fe..01d9e1edda07 100644
+--- a/arch/x86/kernel/reboot.c
++++ b/arch/x86/kernel/reboot.c
+@@ -535,6 +535,15 @@ static void native_machine_emergency_restart(void)
+ 	mode = reboot_mode == REBOOT_WARM ? 0x1234 : 0;
+ 	*((unsigned short *)__va(0x472)) = mode;
+ 
++	/*
++	 * If an EFI capsule has been registered with the firmware then
++	 * override the reboot= parameter.
++	 */
++	if (efi_capsule_pending(NULL)) {
++		pr_info("EFI capsule is pending, forcing EFI reboot.\n");
++		reboot_type = BOOT_EFI;
++	}
++
+ 	for (;;) {
+ 		/* Could also try the reset bit in the Hammer NB */
+ 		switch (reboot_type) {
+diff --git a/include/linux/efi.h b/include/linux/efi.h
+index 848678a1cace..a1a41d027b93 100644
+--- a/include/linux/efi.h
++++ b/include/linux/efi.h
+@@ -1004,6 +1004,12 @@ static inline bool efi_enabled(int feature)
+ }
+ static inline void
+ efi_reboot(enum reboot_mode reboot_mode, const char *__unused) {}
++
++static inline bool
++efi_capsule_pending(int *reset_type)
++{
++	return false;
++}
+ #endif
+ 
+ extern int efi_status_to_err(efi_status_t status);
+-- 
+2.12.0
+

+ 425 - 0
board/PSG/iot2000/linux-4.4-patches/0013-efi-Add-misc-char-driver-interface-to-update-EFI-fir.patch

@@ -0,0 +1,425 @@
+From d11fee242c86754daf76f76b6adab7ccddd1834e Mon Sep 17 00:00:00 2001
+From: "Kweh, Hock Leong" <hock.leong.kweh@intel.com>
+Date: Mon, 25 Apr 2016 21:07:01 +0100
+Subject: [PATCH 13/27] efi: Add misc char driver interface to update EFI
+ firmware
+
+Commit 65117f1aa1b2d145fd5ca376bde642794d0aae1b upstream.
+
+This patch introduces a kernel module to expose a capsule loader
+interface (misc char device file note) for users to upload capsule
+binaries.
+
+Example:
+
+  cat firmware.bin > /dev/efi_capsule_loader
+
+Any upload error will be returned while doing "cat" through file
+operation write() function call.
+
+Signed-off-by: Kweh, Hock Leong <hock.leong.kweh@intel.com>
+[ Update comments and Kconfig text ]
+Signed-off-by: Matt Fleming <matt@codeblueprint.co.uk>
+Reviewed-by: Bryan O'Donoghue <pure.logic@nexus-software.ie>
+Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Cc: Andy Lutomirski <luto@amacapital.net>
+Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
+Cc: Borislav Petkov <bp@alien8.de>
+Cc: Peter Jones <pjones@redhat.com>
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: Sam Protsenko <semen.protsenko@linaro.org>
+Cc: Thomas Gleixner <tglx@linutronix.de>
+Cc: joeyli <jlee@suse.com>
+Cc: linux-efi@vger.kernel.org
+Link: http://lkml.kernel.org/r/1461614832-17633-30-git-send-email-matt@codeblueprint.co.uk
+Signed-off-by: Ingo Molnar <mingo@kernel.org>
+Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
+---
+ drivers/firmware/efi/Kconfig          |  10 +
+ drivers/firmware/efi/Makefile         |   1 +
+ drivers/firmware/efi/capsule-loader.c | 343 ++++++++++++++++++++++++++++++++++
+ 3 files changed, 354 insertions(+)
+ create mode 100644 drivers/firmware/efi/capsule-loader.c
+
+diff --git a/drivers/firmware/efi/Kconfig b/drivers/firmware/efi/Kconfig
+index e1670d533f97..de221bbde9c9 100644
+--- a/drivers/firmware/efi/Kconfig
++++ b/drivers/firmware/efi/Kconfig
+@@ -87,6 +87,16 @@ config EFI_RUNTIME_WRAPPERS
+ config EFI_ARMSTUB
+ 	bool
+ 
++config EFI_CAPSULE_LOADER
++	tristate "EFI capsule loader"
++	depends on EFI
++	help
++	  This option exposes a loader interface "/dev/efi_capsule_loader" for
++	  users to load EFI capsules. This driver requires working runtime
++	  capsule support in the firmware, which many OEMs do not provide.
++
++	  Most users should say N.
++
+ endmenu
+ 
+ config UEFI_CPER
+diff --git a/drivers/firmware/efi/Makefile b/drivers/firmware/efi/Makefile
+index 54b19cdbfcf8..2c8562de3a5f 100644
+--- a/drivers/firmware/efi/Makefile
++++ b/drivers/firmware/efi/Makefile
+@@ -19,3 +19,4 @@ obj-$(CONFIG_EFI_RUNTIME_MAP)		+= runtime-map.o
+ obj-$(CONFIG_EFI_RUNTIME_WRAPPERS)	+= runtime-wrappers.o
+ obj-$(CONFIG_EFI_STUB)			+= libstub/
+ obj-$(CONFIG_EFI_FAKE_MEMMAP)		+= fake_mem.o
++obj-$(CONFIG_EFI_CAPSULE_LOADER)	+= capsule-loader.o
+diff --git a/drivers/firmware/efi/capsule-loader.c b/drivers/firmware/efi/capsule-loader.c
+new file mode 100644
+index 000000000000..c99c24bc79b0
+--- /dev/null
++++ b/drivers/firmware/efi/capsule-loader.c
+@@ -0,0 +1,343 @@
++/*
++ * EFI capsule loader driver.
++ *
++ * Copyright 2015 Intel Corporation
++ *
++ * This file is part of the Linux kernel, and is made available under
++ * the terms of the GNU General Public License version 2.
++ */
++
++#define pr_fmt(fmt) "efi: " fmt
++
++#include <linux/kernel.h>
++#include <linux/module.h>
++#include <linux/miscdevice.h>
++#include <linux/highmem.h>
++#include <linux/slab.h>
++#include <linux/mutex.h>
++#include <linux/efi.h>
++
++#define NO_FURTHER_WRITE_ACTION -1
++
++struct capsule_info {
++	bool		header_obtained;
++	int		reset_type;
++	long		index;
++	size_t		count;
++	size_t		total_size;
++	struct page	**pages;
++	size_t		page_bytes_remain;
++};
++
++/**
++ * efi_free_all_buff_pages - free all previous allocated buffer pages
++ * @cap_info: pointer to current instance of capsule_info structure
++ *
++ *	In addition to freeing buffer pages, it flags NO_FURTHER_WRITE_ACTION
++ *	to cease processing data in subsequent write(2) calls until close(2)
++ *	is called.
++ **/
++static void efi_free_all_buff_pages(struct capsule_info *cap_info)
++{
++	while (cap_info->index > 0)
++		__free_page(cap_info->pages[--cap_info->index]);
++
++	cap_info->index = NO_FURTHER_WRITE_ACTION;
++}
++
++/**
++ * efi_capsule_setup_info - obtain the efi capsule header in the binary and
++ *			    setup capsule_info structure
++ * @cap_info: pointer to current instance of capsule_info structure
++ * @kbuff: a mapped first page buffer pointer
++ * @hdr_bytes: the total received number of bytes for efi header
++ **/
++static ssize_t efi_capsule_setup_info(struct capsule_info *cap_info,
++				      void *kbuff, size_t hdr_bytes)
++{
++	efi_capsule_header_t *cap_hdr;
++	size_t pages_needed;
++	int ret;
++	void *temp_page;
++
++	/* Only process data block that is larger than efi header size */
++	if (hdr_bytes < sizeof(efi_capsule_header_t))
++		return 0;
++
++	/* Reset back to the correct offset of header */
++	cap_hdr = kbuff - cap_info->count;
++	pages_needed = ALIGN(cap_hdr->imagesize, PAGE_SIZE) >> PAGE_SHIFT;
++
++	if (pages_needed == 0) {
++		pr_err("%s: pages count invalid\n", __func__);
++		return -EINVAL;
++	}
++
++	/* Check if the capsule binary supported */
++	ret = efi_capsule_supported(cap_hdr->guid, cap_hdr->flags,
++				    cap_hdr->imagesize,
++				    &cap_info->reset_type);
++	if (ret) {
++		pr_err("%s: efi_capsule_supported() failed\n",
++		       __func__);
++		return ret;
++	}
++
++	cap_info->total_size = cap_hdr->imagesize;
++	temp_page = krealloc(cap_info->pages,
++			     pages_needed * sizeof(void *),
++			     GFP_KERNEL | __GFP_ZERO);
++	if (!temp_page) {
++		pr_debug("%s: krealloc() failed\n", __func__);
++		return -ENOMEM;
++	}
++
++	cap_info->pages = temp_page;
++	cap_info->header_obtained = true;
++
++	return 0;
++}
++
++/**
++ * efi_capsule_submit_update - invoke the efi_capsule_update API once binary
++ *			       upload done
++ * @cap_info: pointer to current instance of capsule_info structure
++ **/
++static ssize_t efi_capsule_submit_update(struct capsule_info *cap_info)
++{
++	int ret;
++	void *cap_hdr_temp;
++
++	cap_hdr_temp = kmap(cap_info->pages[0]);
++	if (!cap_hdr_temp) {
++		pr_debug("%s: kmap() failed\n", __func__);
++		return -EFAULT;
++	}
++
++	ret = efi_capsule_update(cap_hdr_temp, cap_info->pages);
++	kunmap(cap_info->pages[0]);
++	if (ret) {
++		pr_err("%s: efi_capsule_update() failed\n", __func__);
++		return ret;
++	}
++
++	/* Indicate capsule binary uploading is done */
++	cap_info->index = NO_FURTHER_WRITE_ACTION;
++	pr_info("%s: Successfully upload capsule file with reboot type '%s'\n",
++		__func__, !cap_info->reset_type ? "RESET_COLD" :
++		cap_info->reset_type == 1 ? "RESET_WARM" :
++		"RESET_SHUTDOWN");
++	return 0;
++}
++
++/**
++ * efi_capsule_write - store the capsule binary and pass it to
++ *		       efi_capsule_update() API
++ * @file: file pointer
++ * @buff: buffer pointer
++ * @count: number of bytes in @buff
++ * @offp: not used
++ *
++ *	Expectation:
++ *	- A user space tool should start at the beginning of capsule binary and
++ *	  pass data in sequentially.
++ *	- Users should close and re-open this file note in order to upload more
++ *	  capsules.
++ *	- After an error returned, user should close the file and restart the
++ *	  operation for the next try otherwise -EIO will be returned until the
++ *	  file is closed.
++ *	- An EFI capsule header must be located at the beginning of capsule
++ *	  binary file and passed in as first block data of write operation.
++ **/
++static ssize_t efi_capsule_write(struct file *file, const char __user *buff,
++				 size_t count, loff_t *offp)
++{
++	int ret = 0;
++	struct capsule_info *cap_info = file->private_data;
++	struct page *page;
++	void *kbuff = NULL;
++	size_t write_byte;
++
++	if (count == 0)
++		return 0;
++
++	/* Return error while NO_FURTHER_WRITE_ACTION is flagged */
++	if (cap_info->index < 0)
++		return -EIO;
++
++	/* Only alloc a new page when previous page is full */
++	if (!cap_info->page_bytes_remain) {
++		page = alloc_page(GFP_KERNEL);
++		if (!page) {
++			pr_debug("%s: alloc_page() failed\n", __func__);
++			ret = -ENOMEM;
++			goto failed;
++		}
++
++		cap_info->pages[cap_info->index++] = page;
++		cap_info->page_bytes_remain = PAGE_SIZE;
++	}
++
++	page = cap_info->pages[cap_info->index - 1];
++
++	kbuff = kmap(page);
++	if (!kbuff) {
++		pr_debug("%s: kmap() failed\n", __func__);
++		ret = -EFAULT;
++		goto failed;
++	}
++	kbuff += PAGE_SIZE - cap_info->page_bytes_remain;
++
++	/* Copy capsule binary data from user space to kernel space buffer */
++	write_byte = min_t(size_t, count, cap_info->page_bytes_remain);
++	if (copy_from_user(kbuff, buff, write_byte)) {
++		pr_debug("%s: copy_from_user() failed\n", __func__);
++		ret = -EFAULT;
++		goto fail_unmap;
++	}
++	cap_info->page_bytes_remain -= write_byte;
++
++	/* Setup capsule binary info structure */
++	if (!cap_info->header_obtained) {
++		ret = efi_capsule_setup_info(cap_info, kbuff,
++					     cap_info->count + write_byte);
++		if (ret)
++			goto fail_unmap;
++	}
++
++	cap_info->count += write_byte;
++	kunmap(page);
++
++	/* Submit the full binary to efi_capsule_update() API */
++	if (cap_info->header_obtained &&
++	    cap_info->count >= cap_info->total_size) {
++		if (cap_info->count > cap_info->total_size) {
++			pr_err("%s: upload size exceeded header defined size\n",
++			       __func__);
++			ret = -EINVAL;
++			goto failed;
++		}
++
++		ret = efi_capsule_submit_update(cap_info);
++		if (ret)
++			goto failed;
++	}
++
++	return write_byte;
++
++fail_unmap:
++	kunmap(page);
++failed:
++	efi_free_all_buff_pages(cap_info);
++	return ret;
++}
++
++/**
++ * efi_capsule_flush - called by file close or file flush
++ * @file: file pointer
++ * @id: not used
++ *
++ *	If a capsule is being partially uploaded then calling this function
++ *	will be treated as upload termination and will free those completed
++ *	buffer pages and -ECANCELED will be returned.
++ **/
++static int efi_capsule_flush(struct file *file, fl_owner_t id)
++{
++	int ret = 0;
++	struct capsule_info *cap_info = file->private_data;
++
++	if (cap_info->index > 0) {
++		pr_err("%s: capsule upload not complete\n", __func__);
++		efi_free_all_buff_pages(cap_info);
++		ret = -ECANCELED;
++	}
++
++	return ret;
++}
++
++/**
++ * efi_capsule_release - called by file close
++ * @inode: not used
++ * @file: file pointer
++ *
++ *	We will not free successfully submitted pages since efi update
++ *	requires data to be maintained across system reboot.
++ **/
++static int efi_capsule_release(struct inode *inode, struct file *file)
++{
++	struct capsule_info *cap_info = file->private_data;
++
++	kfree(cap_info->pages);
++	kfree(file->private_data);
++	file->private_data = NULL;
++	return 0;
++}
++
++/**
++ * efi_capsule_open - called by file open
++ * @inode: not used
++ * @file: file pointer
++ *
++ *	Will allocate each capsule_info memory for each file open call.
++ *	This provided the capability to support multiple file open feature
++ *	where user is not needed to wait for others to finish in order to
++ *	upload their capsule binary.
++ **/
++static int efi_capsule_open(struct inode *inode, struct file *file)
++{
++	struct capsule_info *cap_info;
++
++	cap_info = kzalloc(sizeof(*cap_info), GFP_KERNEL);
++	if (!cap_info)
++		return -ENOMEM;
++
++	cap_info->pages = kzalloc(sizeof(void *), GFP_KERNEL);
++	if (!cap_info->pages) {
++		kfree(cap_info);
++		return -ENOMEM;
++	}
++
++	file->private_data = cap_info;
++
++	return 0;
++}
++
++static const struct file_operations efi_capsule_fops = {
++	.owner = THIS_MODULE,
++	.open = efi_capsule_open,
++	.write = efi_capsule_write,
++	.flush = efi_capsule_flush,
++	.release = efi_capsule_release,
++	.llseek = no_llseek,
++};
++
++static struct miscdevice efi_capsule_misc = {
++	.minor = MISC_DYNAMIC_MINOR,
++	.name = "efi_capsule_loader",
++	.fops = &efi_capsule_fops,
++};
++
++static int __init efi_capsule_loader_init(void)
++{
++	int ret;
++
++	if (!efi_enabled(EFI_RUNTIME_SERVICES))
++		return -ENODEV;
++
++	ret = misc_register(&efi_capsule_misc);
++	if (ret)
++		pr_err("%s: Failed to register misc char file note\n",
++		       __func__);
++
++	return ret;
++}
++module_init(efi_capsule_loader_init);
++
++static void __exit efi_capsule_loader_exit(void)
++{
++	misc_deregister(&efi_capsule_misc);
++}
++module_exit(efi_capsule_loader_exit);
++
++MODULE_DESCRIPTION("EFI capsule firmware binary loader");
++MODULE_LICENSE("GPL v2");
+-- 
+2.12.0
+

+ 130 - 0
board/PSG/iot2000/linux-4.4-patches/0014-efi-capsule-Make-efi_capsule_pending-lockless.patch

@@ -0,0 +1,130 @@
+From 1aa79e59dad5141bc7e9f5ff12e1c2b361268314 Mon Sep 17 00:00:00 2001
+From: Matt Fleming <matt@codeblueprint.co.uk>
+Date: Fri, 6 May 2016 22:39:27 +0100
+Subject: [PATCH 14/27] efi/capsule: Make efi_capsule_pending() lockless
+
+Commit 62075e581802ea1842d5d3c490a7e46330bdb9e1 upstream.
+
+Taking a mutex in the reboot path is bogus because we cannot sleep
+with interrupts disabled, such as when rebooting due to panic(),
+
+  BUG: sleeping function called from invalid context at kernel/locking/mutex.c:97
+  in_atomic(): 0, irqs_disabled(): 1, pid: 7, name: rcu_sched
+  Call Trace:
+    dump_stack+0x63/0x89
+    ___might_sleep+0xd8/0x120
+    __might_sleep+0x49/0x80
+    mutex_lock+0x20/0x50
+    efi_capsule_pending+0x1d/0x60
+    native_machine_emergency_restart+0x59/0x280
+    machine_emergency_restart+0x19/0x20
+    emergency_restart+0x18/0x20
+    panic+0x1ba/0x217
+
+In this case all other CPUs will have been stopped by the time we
+execute the platform reboot code, so 'capsule_pending' cannot change
+under our feet. We wouldn't care even if it could since we cannot wait
+for it complete.
+
+Also, instead of relying on the external 'system_state' variable just
+use a reboot notifier, so we can set 'stop_capsules' while holding
+'capsule_mutex', thereby avoiding a race where system_state is updated
+while we're in the middle of efi_capsule_update_locked() (since CPUs
+won't have been stopped at that point).
+
+Signed-off-by: Matt Fleming <matt@codeblueprint.co.uk>
+Cc: Andy Lutomirski <luto@amacapital.net>
+Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
+Cc: Borislav Petkov <bp@alien8.de>
+Cc: Brian Gerst <brgerst@gmail.com>
+Cc: Bryan O'Donoghue <pure.logic@nexus-software.ie>
+Cc: Denys Vlasenko <dvlasenk@redhat.com>
+Cc: H. Peter Anvin <hpa@zytor.com>
+Cc: Kweh Hock Leong <hock.leong.kweh@intel.com>
+Cc: Linus Torvalds <torvalds@linux-foundation.org>
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: Thomas Gleixner <tglx@linutronix.de>
+Cc: joeyli <jlee@suse.com>
+Cc: linux-efi@vger.kernel.org
+Link: http://lkml.kernel.org/r/1462570771-13324-2-git-send-email-matt@codeblueprint.co.uk
+Signed-off-by: Ingo Molnar <mingo@kernel.org>
+Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
+---
+ drivers/firmware/efi/capsule.c | 35 +++++++++++++++++++++++++----------
+ 1 file changed, 25 insertions(+), 10 deletions(-)
+
+diff --git a/drivers/firmware/efi/capsule.c b/drivers/firmware/efi/capsule.c
+index 0de55944ac0b..e530540f368c 100644
+--- a/drivers/firmware/efi/capsule.c
++++ b/drivers/firmware/efi/capsule.c
+@@ -22,11 +22,12 @@ typedef struct {
+ } efi_capsule_block_desc_t;
+ 
+ static bool capsule_pending;
++static bool stop_capsules;
+ static int efi_reset_type = -1;
+ 
+ /*
+  * capsule_mutex serialises access to both capsule_pending and
+- * efi_reset_type.
++ * efi_reset_type and stop_capsules.
+  */
+ static DEFINE_MUTEX(capsule_mutex);
+ 
+@@ -50,18 +51,13 @@ static DEFINE_MUTEX(capsule_mutex);
+  */
+ bool efi_capsule_pending(int *reset_type)
+ {
+-	bool rv = false;
+-
+-	mutex_lock(&capsule_mutex);
+ 	if (!capsule_pending)
+-		goto out;
++		return false;
+ 
+ 	if (reset_type)
+ 		*reset_type = efi_reset_type;
+-	rv = true;
+-out:
+-	mutex_unlock(&capsule_mutex);
+-	return rv;
++
++	return true;
+ }
+ 
+ /*
+@@ -176,7 +172,7 @@ efi_capsule_update_locked(efi_capsule_header_t *capsule,
+ 	 * whether to force an EFI reboot), and we're racing against
+ 	 * that call. Abort in that case.
+ 	 */
+-	if (unlikely(system_state == SYSTEM_RESTART)) {
++	if (unlikely(stop_capsules)) {
+ 		pr_warn("Capsule update raced with reboot, aborting.\n");
+ 		return -EINVAL;
+ 	}
+@@ -298,3 +294,22 @@ out:
+ 	return rv;
+ }
+ EXPORT_SYMBOL_GPL(efi_capsule_update);
++
++static int capsule_reboot_notify(struct notifier_block *nb, unsigned long event, void *cmd)
++{
++	mutex_lock(&capsule_mutex);
++	stop_capsules = true;
++	mutex_unlock(&capsule_mutex);
++
++	return NOTIFY_DONE;
++}
++
++static struct notifier_block capsule_reboot_nb = {
++	.notifier_call = capsule_reboot_notify,
++};
++
++static int __init capsule_reboot_register(void)
++{
++	return register_reboot_notifier(&capsule_reboot_nb);
++}
++core_initcall(capsule_reboot_register);
+-- 
+2.12.0
+

+ 101 - 0
board/PSG/iot2000/linux-4.4-patches/0015-efi-capsule-Move-capsule-to-the-stack-in-efi_capsule.patch

@@ -0,0 +1,101 @@
+From 13110f0357554bb359de56f7f330a7425557b044 Mon Sep 17 00:00:00 2001
+From: Matt Fleming <matt@codeblueprint.co.uk>
+Date: Fri, 6 May 2016 22:39:29 +0100
+Subject: [PATCH 15/27] efi/capsule: Move 'capsule' to the stack in
+ efi_capsule_supported()
+
+Commit fb7a84cac03541f4da18dfa25b3f4767d4efc6fc upstream.
+
+Dan Carpenter reports that passing the address of the pointer to the
+kmalloc()'d memory for 'capsule' is dangerous:
+
+ "drivers/firmware/efi/capsule.c:109 efi_capsule_supported()
+  warn: did you mean to pass the address of 'capsule'
+
+   108
+   109          status = efi.query_capsule_caps(&capsule, 1, &max_size, reset);
+                                                ^^^^^^^^
+  If we modify capsule inside this function call then at the end of the
+  function we aren't freeing the original pointer that we allocated."
+
+Ard Biesheuvel noted that we don't even need to call kmalloc() since the
+object we allocate isn't very big and doesn't need to persist after the
+function returns.
+
+Place 'capsule' on the stack instead.
+
+Suggested-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
+Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
+Signed-off-by: Matt Fleming <matt@codeblueprint.co.uk>
+Acked-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
+Cc: Andy Lutomirski <luto@amacapital.net>
+Cc: Borislav Petkov <bp@alien8.de>
+Cc: Brian Gerst <brgerst@gmail.com>
+Cc: Bryan O'Donoghue <pure.logic@nexus-software.ie>
+Cc: Denys Vlasenko <dvlasenk@redhat.com>
+Cc: H. Peter Anvin <hpa@zytor.com>
+Cc: Kweh Hock Leong <hock.leong.kweh@intel.com>
+Cc: Linus Torvalds <torvalds@linux-foundation.org>
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: Thomas Gleixner <tglx@linutronix.de>
+Cc: joeyli <jlee@suse.com>
+Cc: linux-efi@vger.kernel.org
+Link: http://lkml.kernel.org/r/1462570771-13324-4-git-send-email-matt@codeblueprint.co.uk
+Signed-off-by: Ingo Molnar <mingo@kernel.org>
+Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
+---
+ drivers/firmware/efi/capsule.c | 29 +++++++++++------------------
+ 1 file changed, 11 insertions(+), 18 deletions(-)
+
+diff --git a/drivers/firmware/efi/capsule.c b/drivers/firmware/efi/capsule.c
+index e530540f368c..53b9fd2293ee 100644
+--- a/drivers/firmware/efi/capsule.c
++++ b/drivers/firmware/efi/capsule.c
+@@ -86,33 +86,26 @@ bool efi_capsule_pending(int *reset_type)
+  */
+ int efi_capsule_supported(efi_guid_t guid, u32 flags, size_t size, int *reset)
+ {
+-	efi_capsule_header_t *capsule;
++	efi_capsule_header_t capsule;
++	efi_capsule_header_t *cap_list[] = { &capsule };
+ 	efi_status_t status;
+ 	u64 max_size;
+-	int rv = 0;
+ 
+ 	if (flags & ~EFI_CAPSULE_SUPPORTED_FLAG_MASK)
+ 		return -EINVAL;
+ 
+-	capsule = kmalloc(sizeof(*capsule), GFP_KERNEL);
+-	if (!capsule)
+-		return -ENOMEM;
+-
+-	capsule->headersize = capsule->imagesize = sizeof(*capsule);
+-	memcpy(&capsule->guid, &guid, sizeof(efi_guid_t));
+-	capsule->flags = flags;
++	capsule.headersize = capsule.imagesize = sizeof(capsule);
++	memcpy(&capsule.guid, &guid, sizeof(efi_guid_t));
++	capsule.flags = flags;
+ 
+-	status = efi.query_capsule_caps(&capsule, 1, &max_size, reset);
+-	if (status != EFI_SUCCESS) {
+-		rv = efi_status_to_err(status);
+-		goto out;
+-	}
++	status = efi.query_capsule_caps(cap_list, 1, &max_size, reset);
++	if (status != EFI_SUCCESS)
++		return efi_status_to_err(status);
+ 
+ 	if (size > max_size)
+-		rv = -ENOSPC;
+-out:
+-	kfree(capsule);
+-	return rv;
++		return -ENOSPC;
++
++	return 0;
+ }
+ EXPORT_SYMBOL_GPL(efi_capsule_supported);
+ 
+-- 
+2.12.0
+

+ 93 - 0
board/PSG/iot2000/linux-4.4-patches/0016-efi-capsule-Allocate-whole-capsule-into-virtual-memo.patch

@@ -0,0 +1,93 @@
+From c5a04515ef38824a5f426e5d1b3f53ce2e34ceba Mon Sep 17 00:00:00 2001
+From: Austin Christ <austinwc@codeaurora.org>
+Date: Thu, 11 Aug 2016 11:42:00 +0100
+Subject: [PATCH 16/27] efi/capsule: Allocate whole capsule into virtual memory
+
+Commit 6862e6ad95e984991a6ceec592cf67831658f928 upstream.
+
+According to UEFI 2.6 section 7.5.3, the capsule should be in contiguous
+virtual memory and firmware may consume the capsule immediately. To
+correctly implement this functionality, the kernel driver needs to vmap
+the entire capsule at the time it is made available to firmware.
+
+The virtual allocation of the capsule update has been changed from kmap,
+which was only allocating the first page of the update, to vmap, and
+allocates the entire data payload.
+
+Signed-off-by: Austin Christ <austinwc@codeaurora.org>
+Signed-off-by: Matt Fleming <matt@codeblueprint.co.uk>
+Reviewed-by: Matt Fleming <matt@codeblueprint.co.uk>
+Reviewed-by: Lee, Chun-Yi <jlee@suse.com>
+Cc: <stable@vger.kernel.org> # v4.7
+Cc: Andy Lutomirski <luto@kernel.org>
+Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
+Cc: Borislav Petkov <bp@alien8.de>
+Cc: Brian Gerst <brgerst@gmail.com>
+Cc: Bryan O'Donoghue <pure.logic@nexus-software.ie>
+Cc: Denys Vlasenko <dvlasenk@redhat.com>
+Cc: H. Peter Anvin <hpa@zytor.com>
+Cc: Josh Poimboeuf <jpoimboe@redhat.com>
+Cc: Kweh Hock Leong <hock.leong.kweh@intel.com>
+Cc: Linus Torvalds <torvalds@linux-foundation.org>
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: Thomas Gleixner <tglx@linutronix.de>
+Cc: linux-efi@vger.kernel.org
+Link: http://lkml.kernel.org/r/1470912120-22831-3-git-send-email-matt@codeblueprint.co.uk
+Signed-off-by: Ingo Molnar <mingo@kernel.org>
+Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
+---
+ drivers/firmware/efi/capsule-loader.c | 8 +++++---
+ drivers/firmware/efi/capsule.c        | 6 +++---
+ 2 files changed, 8 insertions(+), 6 deletions(-)
+
+diff --git a/drivers/firmware/efi/capsule-loader.c b/drivers/firmware/efi/capsule-loader.c
+index c99c24bc79b0..9ae6c116c474 100644
+--- a/drivers/firmware/efi/capsule-loader.c
++++ b/drivers/firmware/efi/capsule-loader.c
+@@ -16,6 +16,7 @@
+ #include <linux/slab.h>
+ #include <linux/mutex.h>
+ #include <linux/efi.h>
++#include <linux/vmalloc.h>
+ 
+ #define NO_FURTHER_WRITE_ACTION -1
+ 
+@@ -108,14 +109,15 @@ static ssize_t efi_capsule_submit_update(struct capsule_info *cap_info)
+ 	int ret;
+ 	void *cap_hdr_temp;
+ 
+-	cap_hdr_temp = kmap(cap_info->pages[0]);
++	cap_hdr_temp = vmap(cap_info->pages, cap_info->index,
++			VM_MAP, PAGE_KERNEL);
+ 	if (!cap_hdr_temp) {
+-		pr_debug("%s: kmap() failed\n", __func__);
++		pr_debug("%s: vmap() failed\n", __func__);
+ 		return -EFAULT;
+ 	}
+ 
+ 	ret = efi_capsule_update(cap_hdr_temp, cap_info->pages);
+-	kunmap(cap_info->pages[0]);
++	vunmap(cap_hdr_temp);
+ 	if (ret) {
+ 		pr_err("%s: efi_capsule_update() failed\n", __func__);
+ 		return ret;
+diff --git a/drivers/firmware/efi/capsule.c b/drivers/firmware/efi/capsule.c
+index 53b9fd2293ee..6eedff45e6d7 100644
+--- a/drivers/firmware/efi/capsule.c
++++ b/drivers/firmware/efi/capsule.c
+@@ -190,9 +190,9 @@ efi_capsule_update_locked(efi_capsule_header_t *capsule,
+  * map the capsule described by @capsule with its data in @pages and
+  * send it to the firmware via the UpdateCapsule() runtime service.
+  *
+- * @capsule must be a virtual mapping of the first page in @pages
+- * (@pages[0]) in the kernel address space. That is, a
+- * capsule_header_t that describes the entire contents of the capsule
++ * @capsule must be a virtual mapping of the complete capsule update in the
++ * kernel address space, as the capsule can be consumed immediately.
++ * A capsule_header_t that describes the entire contents of the capsule
+  * must be at the start of the first data page.
+  *
+  * Even though this function will validate that the firmware supports
+-- 
+2.12.0
+

+ 40 - 0
board/PSG/iot2000/linux-4.4-patches/0017-efi-capsule-Fix-return-code-on-failing-kmap-vmap.patch

@@ -0,0 +1,40 @@
+From 986a04d80e757e09a5b69761c04af9443f44805d Mon Sep 17 00:00:00 2001
+From: Jan Kiszka <jan.kiszka@siemens.com>
+Date: Fri, 24 Mar 2017 18:34:14 +0100
+Subject: [PATCH 17/27] efi/capsule: Fix return code on failing kmap/vmap
+
+If kmap or vmap fail, it means we ran out of memory. There are no
+user-provided addressed involved that would justify EFAULT.
+
+Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
+Reviewed-by: Matt Fleming <matt@codeblueprint.co.uk>
+Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
+---
+ drivers/firmware/efi/capsule-loader.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/firmware/efi/capsule-loader.c b/drivers/firmware/efi/capsule-loader.c
+index 9ae6c116c474..91e91f7a8807 100644
+--- a/drivers/firmware/efi/capsule-loader.c
++++ b/drivers/firmware/efi/capsule-loader.c
+@@ -113,7 +113,7 @@ static ssize_t efi_capsule_submit_update(struct capsule_info *cap_info)
+ 			VM_MAP, PAGE_KERNEL);
+ 	if (!cap_hdr_temp) {
+ 		pr_debug("%s: vmap() failed\n", __func__);
+-		return -EFAULT;
++		return -ENOMEM;
+ 	}
+ 
+ 	ret = efi_capsule_update(cap_hdr_temp, cap_info->pages);
+@@ -185,7 +185,7 @@ static ssize_t efi_capsule_write(struct file *file, const char __user *buff,
+ 	kbuff = kmap(page);
+ 	if (!kbuff) {
+ 		pr_debug("%s: kmap() failed\n", __func__);
+-		ret = -EFAULT;
++		ret = -ENOMEM;
+ 		goto failed;
+ 	}
+ 	kbuff += PAGE_SIZE - cap_info->page_bytes_remain;
+-- 
+2.12.0
+

+ 70 - 0
board/PSG/iot2000/linux-4.4-patches/0018-efi-capsule-Remove-pr_debug-on-ENOMEM-or-EFAULT.patch

@@ -0,0 +1,70 @@
+From 6a1dbce069aa3ff38d2ec6fedb37a7802e946ff2 Mon Sep 17 00:00:00 2001
+From: Jan Kiszka <jan.kiszka@siemens.com>
+Date: Fri, 24 Mar 2017 18:34:15 +0100
+Subject: [PATCH 18/27] efi/capsule: Remove pr_debug on ENOMEM or EFAULT
+
+Both cases are not worth a debug log message - the error code is telling
+enough.
+
+Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
+Reviewed-by: Matt Fleming <matt@codeblueprint.co.uk>
+Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
+---
+ drivers/firmware/efi/capsule-loader.c | 11 ++---------
+ 1 file changed, 2 insertions(+), 9 deletions(-)
+
+diff --git a/drivers/firmware/efi/capsule-loader.c b/drivers/firmware/efi/capsule-loader.c
+index 91e91f7a8807..7b57dda2417d 100644
+--- a/drivers/firmware/efi/capsule-loader.c
++++ b/drivers/firmware/efi/capsule-loader.c
+@@ -88,10 +88,8 @@ static ssize_t efi_capsule_setup_info(struct capsule_info *cap_info,
+ 	temp_page = krealloc(cap_info->pages,
+ 			     pages_needed * sizeof(void *),
+ 			     GFP_KERNEL | __GFP_ZERO);
+-	if (!temp_page) {
+-		pr_debug("%s: krealloc() failed\n", __func__);
++	if (!temp_page)
+ 		return -ENOMEM;
+-	}
+ 
+ 	cap_info->pages = temp_page;
+ 	cap_info->header_obtained = true;
+@@ -111,10 +109,8 @@ static ssize_t efi_capsule_submit_update(struct capsule_info *cap_info)
+ 
+ 	cap_hdr_temp = vmap(cap_info->pages, cap_info->index,
+ 			VM_MAP, PAGE_KERNEL);
+-	if (!cap_hdr_temp) {
+-		pr_debug("%s: vmap() failed\n", __func__);
++	if (!cap_hdr_temp)
+ 		return -ENOMEM;
+-	}
+ 
+ 	ret = efi_capsule_update(cap_hdr_temp, cap_info->pages);
+ 	vunmap(cap_hdr_temp);
+@@ -171,7 +167,6 @@ static ssize_t efi_capsule_write(struct file *file, const char __user *buff,
+ 	if (!cap_info->page_bytes_remain) {
+ 		page = alloc_page(GFP_KERNEL);
+ 		if (!page) {
+-			pr_debug("%s: alloc_page() failed\n", __func__);
+ 			ret = -ENOMEM;
+ 			goto failed;
+ 		}
+@@ -184,7 +179,6 @@ static ssize_t efi_capsule_write(struct file *file, const char __user *buff,
+ 
+ 	kbuff = kmap(page);
+ 	if (!kbuff) {
+-		pr_debug("%s: kmap() failed\n", __func__);
+ 		ret = -ENOMEM;
+ 		goto failed;
+ 	}
+@@ -193,7 +187,6 @@ static ssize_t efi_capsule_write(struct file *file, const char __user *buff,
+ 	/* Copy capsule binary data from user space to kernel space buffer */
+ 	write_byte = min_t(size_t, count, cap_info->page_bytes_remain);
+ 	if (copy_from_user(kbuff, buff, write_byte)) {
+-		pr_debug("%s: copy_from_user() failed\n", __func__);
+ 		ret = -EFAULT;
+ 		goto fail_unmap;
+ 	}
+-- 
+2.12.0
+

+ 88 - 0
board/PSG/iot2000/linux-4.4-patches/0019-efi-capsule-Clean-up-pr_err-info-messages.patch

@@ -0,0 +1,88 @@
+From 99bed124420afaaa6aea9a80440e7fa80b27177b Mon Sep 17 00:00:00 2001
+From: Jan Kiszka <jan.kiszka@siemens.com>
+Date: Fri, 24 Mar 2017 18:34:16 +0100
+Subject: [PATCH 19/27] efi/capsule: Clean up pr_err/info messages
+
+Avoid __func__, improve the information provided by some of the
+messages.
+
+Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
+Reviewed-by: Matt Fleming <matt@codeblueprint.co.uk>
+Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
+---
+ drivers/firmware/efi/capsule-loader.c | 19 ++++++++-----------
+ 1 file changed, 8 insertions(+), 11 deletions(-)
+
+diff --git a/drivers/firmware/efi/capsule-loader.c b/drivers/firmware/efi/capsule-loader.c
+index 7b57dda2417d..3fb91e1597a9 100644
+--- a/drivers/firmware/efi/capsule-loader.c
++++ b/drivers/firmware/efi/capsule-loader.c
+@@ -70,7 +70,7 @@ static ssize_t efi_capsule_setup_info(struct capsule_info *cap_info,
+ 	pages_needed = ALIGN(cap_hdr->imagesize, PAGE_SIZE) >> PAGE_SHIFT;
+ 
+ 	if (pages_needed == 0) {
+-		pr_err("%s: pages count invalid\n", __func__);
++		pr_err("invalid capsule size");
+ 		return -EINVAL;
+ 	}
+ 
+@@ -79,8 +79,7 @@ static ssize_t efi_capsule_setup_info(struct capsule_info *cap_info,
+ 				    cap_hdr->imagesize,
+ 				    &cap_info->reset_type);
+ 	if (ret) {
+-		pr_err("%s: efi_capsule_supported() failed\n",
+-		       __func__);
++		pr_err("capsule not supported\n");
+ 		return ret;
+ 	}
+ 
+@@ -115,14 +114,14 @@ static ssize_t efi_capsule_submit_update(struct capsule_info *cap_info)
+ 	ret = efi_capsule_update(cap_hdr_temp, cap_info->pages);
+ 	vunmap(cap_hdr_temp);
+ 	if (ret) {
+-		pr_err("%s: efi_capsule_update() failed\n", __func__);
++		pr_err("capsule update failed\n");
+ 		return ret;
+ 	}
+ 
+ 	/* Indicate capsule binary uploading is done */
+ 	cap_info->index = NO_FURTHER_WRITE_ACTION;
+-	pr_info("%s: Successfully upload capsule file with reboot type '%s'\n",
+-		__func__, !cap_info->reset_type ? "RESET_COLD" :
++	pr_info("Successfully upload capsule file with reboot type '%s'\n",
++		!cap_info->reset_type ? "RESET_COLD" :
+ 		cap_info->reset_type == 1 ? "RESET_WARM" :
+ 		"RESET_SHUTDOWN");
+ 	return 0;
+@@ -207,8 +206,7 @@ static ssize_t efi_capsule_write(struct file *file, const char __user *buff,
+ 	if (cap_info->header_obtained &&
+ 	    cap_info->count >= cap_info->total_size) {
+ 		if (cap_info->count > cap_info->total_size) {
+-			pr_err("%s: upload size exceeded header defined size\n",
+-			       __func__);
++			pr_err("capsule upload size exceeded header defined size\n");
+ 			ret = -EINVAL;
+ 			goto failed;
+ 		}
+@@ -242,7 +240,7 @@ static int efi_capsule_flush(struct file *file, fl_owner_t id)
+ 	struct capsule_info *cap_info = file->private_data;
+ 
+ 	if (cap_info->index > 0) {
+-		pr_err("%s: capsule upload not complete\n", __func__);
++		pr_err("capsule upload not complete\n");
+ 		efi_free_all_buff_pages(cap_info);
+ 		ret = -ECANCELED;
+ 	}
+@@ -321,8 +319,7 @@ static int __init efi_capsule_loader_init(void)
+ 
+ 	ret = misc_register(&efi_capsule_misc);
+ 	if (ret)
+-		pr_err("%s: Failed to register misc char file note\n",
+-		       __func__);
++		pr_err("Unable to register capsule loader device\n");
+ 
+ 	return ret;
+ }
+-- 
+2.12.0
+

+ 34 - 0
board/PSG/iot2000/linux-4.4-patches/0020-efi-capsule-Adjust-return-type-of-efi_capsule_setup_.patch

@@ -0,0 +1,34 @@
+From 1bbe1e85d8f2dd2ad8ed3b120f04ea7f48d5a28e Mon Sep 17 00:00:00 2001
+From: Jan Kiszka <jan.kiszka@siemens.com>
+Date: Fri, 24 Mar 2017 18:34:17 +0100
+Subject: [PATCH 20/27] efi/capsule: Adjust return type of
+ efi_capsule_setup_info
+
+We actually expect int at the caller and never return any size
+information.
+
+Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
+Reviewed-by: Matt Fleming <matt@codeblueprint.co.uk>
+Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
+---
+ drivers/firmware/efi/capsule-loader.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/firmware/efi/capsule-loader.c b/drivers/firmware/efi/capsule-loader.c
+index 3fb91e1597a9..37d3f6ec2d28 100644
+--- a/drivers/firmware/efi/capsule-loader.c
++++ b/drivers/firmware/efi/capsule-loader.c
+@@ -53,8 +53,8 @@ static void efi_free_all_buff_pages(struct capsule_info *cap_info)
+  * @kbuff: a mapped first page buffer pointer
+  * @hdr_bytes: the total received number of bytes for efi header
+  **/
+-static ssize_t efi_capsule_setup_info(struct capsule_info *cap_info,
+-				      void *kbuff, size_t hdr_bytes)
++static int efi_capsule_setup_info(struct capsule_info *cap_info,
++				  void *kbuff, size_t hdr_bytes)
+ {
+ 	efi_capsule_header_t *cap_hdr;
+ 	size_t pages_needed;
+-- 
+2.12.0
+

+ 128 - 0
board/PSG/iot2000/linux-4.4-patches/0021-efi-capsule-loader-Use-a-cached-copy-of-the-capsule-.patch

@@ -0,0 +1,128 @@
+From bf59e06db6790038f4f4d25f641393d6e707907c Mon Sep 17 00:00:00 2001
+From: Ard Biesheuvel <ard.biesheuvel@linaro.org>
+Date: Tue, 28 Mar 2017 12:49:56 +0100
+Subject: [PATCH 21/27] efi/capsule-loader: Use a cached copy of the capsule
+ header
+
+Instead of kmapping the capsule data twice, copy the capsule header
+into the capsule info struct we keep locally. This is an improvement
+by itself, but will also enable handling of non-standard header formats
+more easily.
+
+Reviewed-by: Matt Fleming <matt@codeblueprint.co.uk>
+Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
+---
+ drivers/firmware/efi/capsule-loader.c | 41 +++++++++++++++--------------------
+ 1 file changed, 17 insertions(+), 24 deletions(-)
+
+diff --git a/drivers/firmware/efi/capsule-loader.c b/drivers/firmware/efi/capsule-loader.c
+index 37d3f6ec2d28..5b012a467d7d 100644
+--- a/drivers/firmware/efi/capsule-loader.c
++++ b/drivers/firmware/efi/capsule-loader.c
+@@ -21,13 +21,13 @@
+ #define NO_FURTHER_WRITE_ACTION -1
+ 
+ struct capsule_info {
+-	bool		header_obtained;
+-	int		reset_type;
+-	long		index;
+-	size_t		count;
+-	size_t		total_size;
+-	struct page	**pages;
+-	size_t		page_bytes_remain;
++	efi_capsule_header_t	header;
++	int			reset_type;
++	long			index;
++	size_t			count;
++	size_t			total_size;
++	struct page		**pages;
++	size_t			page_bytes_remain;
+ };
+ 
+ /**
+@@ -56,7 +56,6 @@ static void efi_free_all_buff_pages(struct capsule_info *cap_info)
+ static int efi_capsule_setup_info(struct capsule_info *cap_info,
+ 				  void *kbuff, size_t hdr_bytes)
+ {
+-	efi_capsule_header_t *cap_hdr;
+ 	size_t pages_needed;
+ 	int ret;
+ 	void *temp_page;
+@@ -66,8 +65,9 @@ static int efi_capsule_setup_info(struct capsule_info *cap_info,
+ 		return 0;
+ 
+ 	/* Reset back to the correct offset of header */
+-	cap_hdr = kbuff - cap_info->count;
+-	pages_needed = ALIGN(cap_hdr->imagesize, PAGE_SIZE) >> PAGE_SHIFT;
++	kbuff -= cap_info->count;
++	memcpy(&cap_info->header, kbuff, sizeof(cap_info->header));
++	pages_needed = ALIGN(cap_info->header.imagesize, PAGE_SIZE) / PAGE_SIZE;
+ 
+ 	if (pages_needed == 0) {
+ 		pr_err("invalid capsule size");
+@@ -75,15 +75,16 @@ static int efi_capsule_setup_info(struct capsule_info *cap_info,
+ 	}
+ 
+ 	/* Check if the capsule binary supported */
+-	ret = efi_capsule_supported(cap_hdr->guid, cap_hdr->flags,
+-				    cap_hdr->imagesize,
++	ret = efi_capsule_supported(cap_info->header.guid,
++				    cap_info->header.flags,
++				    cap_info->header.imagesize,
+ 				    &cap_info->reset_type);
+ 	if (ret) {
+ 		pr_err("capsule not supported\n");
+ 		return ret;
+ 	}
+ 
+-	cap_info->total_size = cap_hdr->imagesize;
++	cap_info->total_size = cap_info->header.imagesize;
+ 	temp_page = krealloc(cap_info->pages,
+ 			     pages_needed * sizeof(void *),
+ 			     GFP_KERNEL | __GFP_ZERO);
+@@ -91,7 +92,6 @@ static int efi_capsule_setup_info(struct capsule_info *cap_info,
+ 		return -ENOMEM;
+ 
+ 	cap_info->pages = temp_page;
+-	cap_info->header_obtained = true;
+ 
+ 	return 0;
+ }
+@@ -104,15 +104,8 @@ static int efi_capsule_setup_info(struct capsule_info *cap_info,
+ static ssize_t efi_capsule_submit_update(struct capsule_info *cap_info)
+ {
+ 	int ret;
+-	void *cap_hdr_temp;
+ 
+-	cap_hdr_temp = vmap(cap_info->pages, cap_info->index,
+-			VM_MAP, PAGE_KERNEL);
+-	if (!cap_hdr_temp)
+-		return -ENOMEM;
+-
+-	ret = efi_capsule_update(cap_hdr_temp, cap_info->pages);
+-	vunmap(cap_hdr_temp);
++	ret = efi_capsule_update(&cap_info->header, cap_info->pages);
+ 	if (ret) {
+ 		pr_err("capsule update failed\n");
+ 		return ret;
+@@ -192,7 +185,7 @@ static ssize_t efi_capsule_write(struct file *file, const char __user *buff,
+ 	cap_info->page_bytes_remain -= write_byte;
+ 
+ 	/* Setup capsule binary info structure */
+-	if (!cap_info->header_obtained) {
++	if (cap_info->header.headersize == 0) {
+ 		ret = efi_capsule_setup_info(cap_info, kbuff,
+ 					     cap_info->count + write_byte);
+ 		if (ret)
+@@ -203,7 +196,7 @@ static ssize_t efi_capsule_write(struct file *file, const char __user *buff,
+ 	kunmap(page);
+ 
+ 	/* Submit the full binary to efi_capsule_update() API */
+-	if (cap_info->header_obtained &&
++	if (cap_info->header.headersize > 0 &&
+ 	    cap_info->count >= cap_info->total_size) {
+ 		if (cap_info->count > cap_info->total_size) {
+ 			pr_err("capsule upload size exceeded header defined size\n");
+-- 
+2.12.0
+

+ 144 - 0
board/PSG/iot2000/linux-4.4-patches/0022-efi-capsule-loader-Redirect-calls-to-efi_capsule_set.patch

@@ -0,0 +1,144 @@
+From cb0b223e1c31d240e6a883851fb84b66dc820cbf Mon Sep 17 00:00:00 2001
+From: Ard Biesheuvel <ard.biesheuvel@linaro.org>
+Date: Tue, 28 Mar 2017 13:06:57 +0100
+Subject: [PATCH 22/27] efi/capsule-loader: Redirect calls to
+ efi_capsule_setup_info via weak alias
+
+To allow platform specific code to hook into the capsule loading
+routines, indirect calls to efi_capsule_setup_info() via a weak alias
+of __efi_capsule_setup_info(), allowing platforms to redefine the former
+but still use the latter.
+
+Cc: Matt Fleming <matt@codeblueprint.co.uk>
+Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
+---
+ drivers/firmware/efi/capsule-loader.c | 56 +++++++++++++++++------------------
+ include/linux/efi.h                   | 12 ++++++++
+ 2 files changed, 39 insertions(+), 29 deletions(-)
+
+diff --git a/drivers/firmware/efi/capsule-loader.c b/drivers/firmware/efi/capsule-loader.c
+index 5b012a467d7d..f7fdeab0bc37 100644
+--- a/drivers/firmware/efi/capsule-loader.c
++++ b/drivers/firmware/efi/capsule-loader.c
+@@ -20,16 +20,6 @@
+ 
+ #define NO_FURTHER_WRITE_ACTION -1
+ 
+-struct capsule_info {
+-	efi_capsule_header_t	header;
+-	int			reset_type;
+-	long			index;
+-	size_t			count;
+-	size_t			total_size;
+-	struct page		**pages;
+-	size_t			page_bytes_remain;
+-};
+-
+ /**
+  * efi_free_all_buff_pages - free all previous allocated buffer pages
+  * @cap_info: pointer to current instance of capsule_info structure
+@@ -46,28 +36,13 @@ static void efi_free_all_buff_pages(struct capsule_info *cap_info)
+ 	cap_info->index = NO_FURTHER_WRITE_ACTION;
+ }
+ 
+-/**
+- * efi_capsule_setup_info - obtain the efi capsule header in the binary and
+- *			    setup capsule_info structure
+- * @cap_info: pointer to current instance of capsule_info structure
+- * @kbuff: a mapped first page buffer pointer
+- * @hdr_bytes: the total received number of bytes for efi header
+- **/
+-static int efi_capsule_setup_info(struct capsule_info *cap_info,
+-				  void *kbuff, size_t hdr_bytes)
++int __efi_capsule_setup_info(struct capsule_info *cap_info)
+ {
+ 	size_t pages_needed;
+ 	int ret;
+ 	void *temp_page;
+ 
+-	/* Only process data block that is larger than efi header size */
+-	if (hdr_bytes < sizeof(efi_capsule_header_t))
+-		return 0;
+-
+-	/* Reset back to the correct offset of header */
+-	kbuff -= cap_info->count;
+-	memcpy(&cap_info->header, kbuff, sizeof(cap_info->header));
+-	pages_needed = ALIGN(cap_info->header.imagesize, PAGE_SIZE) / PAGE_SIZE;
++	pages_needed = ALIGN(cap_info->total_size, PAGE_SIZE) / PAGE_SIZE;
+ 
+ 	if (pages_needed == 0) {
+ 		pr_err("invalid capsule size");
+@@ -84,7 +59,6 @@ static int efi_capsule_setup_info(struct capsule_info *cap_info,
+ 		return ret;
+ 	}
+ 
+-	cap_info->total_size = cap_info->header.imagesize;
+ 	temp_page = krealloc(cap_info->pages,
+ 			     pages_needed * sizeof(void *),
+ 			     GFP_KERNEL | __GFP_ZERO);
+@@ -97,6 +71,30 @@ static int efi_capsule_setup_info(struct capsule_info *cap_info,
+ }
+ 
+ /**
++ * efi_capsule_setup_info - obtain the efi capsule header in the binary and
++ *			    setup capsule_info structure
++ * @cap_info: pointer to current instance of capsule_info structure
++ * @kbuff: a mapped first page buffer pointer
++ * @hdr_bytes: the total received number of bytes for efi header
++ *
++ * Platforms with non-standard capsule update mechanisms can override
++ * this __weak function so they can perform any required capsule
++ * image munging. See quark_quirk_function() for an example.
++ **/
++int __weak efi_capsule_setup_info(struct capsule_info *cap_info, void *kbuff,
++				  size_t hdr_bytes)
++{
++	/* Only process data block that is larger than efi header size */
++	if (hdr_bytes < sizeof(efi_capsule_header_t))
++		return 0;
++
++	memcpy(&cap_info->header, kbuff, sizeof(cap_info->header));
++	cap_info->total_size = cap_info->header.imagesize;
++
++	return __efi_capsule_setup_info(cap_info);
++}
++
++/**
+  * efi_capsule_submit_update - invoke the efi_capsule_update API once binary
+  *			       upload done
+  * @cap_info: pointer to current instance of capsule_info structure
+@@ -186,7 +184,7 @@ static ssize_t efi_capsule_write(struct file *file, const char __user *buff,
+ 
+ 	/* Setup capsule binary info structure */
+ 	if (cap_info->header.headersize == 0) {
+-		ret = efi_capsule_setup_info(cap_info, kbuff,
++		ret = efi_capsule_setup_info(cap_info, kbuff - cap_info->count,
+ 					     cap_info->count + write_byte);
+ 		if (ret)
+ 			goto fail_unmap;
+diff --git a/include/linux/efi.h b/include/linux/efi.h
+index a1a41d027b93..99d3f5bb9070 100644
+--- a/include/linux/efi.h
++++ b/include/linux/efi.h
+@@ -129,6 +129,18 @@ typedef struct {
+ #define EFI_CAPSULE_POPULATE_SYSTEM_TABLE	0x00020000
+ #define EFI_CAPSULE_INITIATE_RESET		0x00040000
+ 
++struct capsule_info {
++	efi_capsule_header_t	header;
++	int			reset_type;
++	long			index;
++	size_t			count;
++	size_t			total_size;
++	struct page		**pages;
++	size_t			page_bytes_remain;
++};
++
++int __efi_capsule_setup_info(struct capsule_info *cap_info);
++
+ /*
+  * Allocation types for calls to boottime->allocate_pages.
+  */
+-- 
+2.12.0
+

+ 114 - 0
board/PSG/iot2000/linux-4.4-patches/0023-efi-capsule-loader-Use-page-addresses-rather-than-st.patch

@@ -0,0 +1,114 @@
+From 30e7ad8198b22063c242d6f349d1e9d948e4d34d Mon Sep 17 00:00:00 2001
+From: Ard Biesheuvel <ard.biesheuvel@linaro.org>
+Date: Tue, 28 Mar 2017 18:09:39 +0100
+Subject: [PATCH 23/27] efi/capsule-loader: Use page addresses rather than
+ struct page pointers
+
+To give some leeway to code that handles non-standard capsule headers,
+let's keep an array of page addresses rather than struct page pointers.
+
+This gives special implementations of efi_capsule_setup_info() the
+opportunity to mangle the payload a bit before it is presented to the
+firmware, without putting any knowledge of the nature of such quirks
+into the generic code.
+
+Cc: Matt Fleming <matt@codeblueprint.co.uk>
+Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
+---
+ drivers/firmware/efi/capsule-loader.c | 12 ++++++++----
+ drivers/firmware/efi/capsule.c        |  7 ++++---
+ include/linux/efi.h                   |  4 ++--
+ 3 files changed, 14 insertions(+), 9 deletions(-)
+
+diff --git a/drivers/firmware/efi/capsule-loader.c b/drivers/firmware/efi/capsule-loader.c
+index f7fdeab0bc37..feeafb673c07 100644
+--- a/drivers/firmware/efi/capsule-loader.c
++++ b/drivers/firmware/efi/capsule-loader.c
+@@ -20,6 +20,10 @@
+ 
+ #define NO_FURTHER_WRITE_ACTION -1
+ 
++#ifndef phys_to_page
++#define phys_to_page(x)		pfn_to_page((x) >> PAGE_SHIFT)
++#endif
++
+ /**
+  * efi_free_all_buff_pages - free all previous allocated buffer pages
+  * @cap_info: pointer to current instance of capsule_info structure
+@@ -31,7 +35,7 @@
+ static void efi_free_all_buff_pages(struct capsule_info *cap_info)
+ {
+ 	while (cap_info->index > 0)
+-		__free_page(cap_info->pages[--cap_info->index]);
++		__free_page(phys_to_page(cap_info->pages[--cap_info->index]));
+ 
+ 	cap_info->index = NO_FURTHER_WRITE_ACTION;
+ }
+@@ -161,12 +165,12 @@ static ssize_t efi_capsule_write(struct file *file, const char __user *buff,
+ 			goto failed;
+ 		}
+ 
+-		cap_info->pages[cap_info->index++] = page;
++		cap_info->pages[cap_info->index++] = page_to_phys(page);
+ 		cap_info->page_bytes_remain = PAGE_SIZE;
++	} else {
++		page = phys_to_page(cap_info->pages[cap_info->index - 1]);
+ 	}
+ 
+-	page = cap_info->pages[cap_info->index - 1];
+-
+ 	kbuff = kmap(page);
+ 	if (!kbuff) {
+ 		ret = -ENOMEM;
+diff --git a/drivers/firmware/efi/capsule.c b/drivers/firmware/efi/capsule.c
+index 6eedff45e6d7..57f85256feb2 100644
+--- a/drivers/firmware/efi/capsule.c
++++ b/drivers/firmware/efi/capsule.c
+@@ -214,7 +214,7 @@ efi_capsule_update_locked(efi_capsule_header_t *capsule,
+  *
+  * Return 0 on success, a converted EFI status code on failure.
+  */
+-int efi_capsule_update(efi_capsule_header_t *capsule, struct page **pages)
++int efi_capsule_update(efi_capsule_header_t *capsule, phys_addr_t *pages)
+ {
+ 	u32 imagesize = capsule->imagesize;
+ 	efi_guid_t guid = capsule->guid;
+@@ -253,10 +253,11 @@ int efi_capsule_update(efi_capsule_header_t *capsule, struct page **pages)
+ 		}
+ 
+ 		for (j = 0; j < SGLIST_PER_PAGE && count > 0; j++) {
+-			u64 sz = min_t(u64, imagesize, PAGE_SIZE);
++			u64 sz = min_t(u64, imagesize,
++				       PAGE_SIZE - (u64)*pages % PAGE_SIZE);
+ 
+ 			sglist[j].length = sz;
+-			sglist[j].data = page_to_phys(*pages++);
++			sglist[j].data = *pages++;
+ 
+ 			imagesize -= sz;
+ 			count--;
+diff --git a/include/linux/efi.h b/include/linux/efi.h
+index 99d3f5bb9070..3a67ce06f7f3 100644
+--- a/include/linux/efi.h
++++ b/include/linux/efi.h
+@@ -135,7 +135,7 @@ struct capsule_info {
+ 	long			index;
+ 	size_t			count;
+ 	size_t			total_size;
+-	struct page		**pages;
++	phys_addr_t		*pages;
+ 	size_t			page_bytes_remain;
+ };
+ 
+@@ -1245,7 +1245,7 @@ extern int efi_capsule_supported(efi_guid_t guid, u32 flags,
+ 				 size_t size, int *reset);
+ 
+ extern int efi_capsule_update(efi_capsule_header_t *capsule,
+-			      struct page **pages);
++			      phys_addr_t *pages);
+ 
+ #ifdef CONFIG_EFI_RUNTIME_MAP
+ int efi_runtime_map_init(struct kobject *);
+-- 
+2.12.0
+

+ 202 - 0
board/PSG/iot2000/linux-4.4-patches/0024-efi-capsule-Add-support-for-Quark-security-header.patch

@@ -0,0 +1,202 @@
+From b36534fedba5c188eefabf9a8fbbf4dd39495605 Mon Sep 17 00:00:00 2001
+From: Jan Kiszka <jan.kiszka@siemens.com>
+Date: Fri, 24 Mar 2017 18:34:20 +0100
+Subject: [PATCH 24/27] efi/capsule: Add support for Quark security header
+
+The firmware for Quark X102x prepends a security header to the capsule
+which is needed to support the mandatory secure boot on this processor.
+The header can be detected by checking for the "_CSH" signature and -
+to avoid any GUID conflict - validating its size field to contain the
+expected value. Then we need to look for the EFI header right after the
+security header and pass the real header to __efi_capsule_setup_info.
+
+To be minimal invasive and maximal safe, the quirk version of
+efi_capsule_identify_image is only effective on Quark processors.
+
+Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
+---
+ arch/x86/platform/efi/quirks.c | 137 +++++++++++++++++++++++++++++++++++++++++
+ drivers/firmware/efi/Kconfig   |   9 +++
+ 2 files changed, 146 insertions(+)
+
+diff --git a/arch/x86/platform/efi/quirks.c b/arch/x86/platform/efi/quirks.c
+index 1c7380da65ff..f0361323a805 100644
+--- a/arch/x86/platform/efi/quirks.c
++++ b/arch/x86/platform/efi/quirks.c
+@@ -10,12 +10,66 @@
+ #include <linux/acpi.h>
+ #include <asm/efi.h>
+ #include <asm/uv/uv.h>
++#include <asm/cpu_device_id.h>
+ 
+ #define EFI_MIN_RESERVE 5120
+ 
+ #define EFI_DUMMY_GUID \
+ 	EFI_GUID(0x4424ac57, 0xbe4b, 0x47dd, 0x9e, 0x97, 0xed, 0x50, 0xf0, 0x9f, 0x92, 0xa9)
+ 
++#define QUARK_CSH_SIGNATURE		0x5f435348	/* _CSH */
++#define QUARK_SECURITY_HEADER_SIZE	0x400
++
++/*
++ * Header prepended to the standard EFI capsule on Quark systems the are based
++ * on Intel firmware BSP.
++ * @csh_signature:	Unique identifier to sanity check signed module
++ * 			presence ("_CSH").
++ * @version:		Current version of CSH used. Should be one for Quark A0.
++ * @modulesize:		Size of the entire module including the module header
++ * 			and payload.
++ * @security_version_number_index: Index of SVN to use for validation of signed
++ * 			module.
++ * @security_version_number: Used to prevent against roll back of modules.
++ * @rsvd_module_id:	Currently unused for Clanton (Quark).
++ * @rsvd_module_vendor:	Vendor Identifier. For Intel products value is
++ * 			0x00008086.
++ * @rsvd_date:		BCD representation of build date as yyyymmdd, where
++ * 			yyyy=4 digit year, mm=1-12, dd=1-31.
++ * @headersize:		Total length of the header including including any
++ * 			padding optionally added by the signing tool.
++ * @hash_algo:		What Hash is used in the module signing.
++ * @cryp_algo:		What Crypto is used in the module signing.
++ * @keysize:		Total length of the key data including including any
++ * 			padding optionally added by the signing tool.
++ * @signaturesize:	Total length of the signature including including any
++ * 			padding optionally added by the signing tool.
++ * @rsvd_next_header:	32-bit pointer to the next Secure Boot Module in the
++ * 			chain, if there is a next header.
++ * @rsvd:		Reserved, padding structure to required size.
++ *
++ * See also QuartSecurityHeader_t in
++ * Quark_EDKII_v1.2.1.1/QuarkPlatformPkg/Include/QuarkBootRom.h
++ * from https://downloadcenter.intel.com/download/23197/Intel-Quark-SoC-X1000-Board-Support-Package-BSP
++ */
++struct quark_security_header {
++	u32 csh_signature;
++	u32 version;
++	u32 modulesize;
++	u32 security_version_number_index;
++	u32 security_version_number;
++	u32 rsvd_module_id;
++	u32 rsvd_module_vendor;
++	u32 rsvd_date;
++	u32 headersize;
++	u32 hash_algo;
++	u32 cryp_algo;
++	u32 keysize;
++	u32 signaturesize;
++	u32 rsvd_next_header;
++	u32 rsvd[2];
++};
++
+ static efi_char16_t efi_dummy_name[6] = { 'D', 'U', 'M', 'M', 'Y', 0 };
+ 
+ static bool efi_no_storage_paranoia;
+@@ -288,3 +342,86 @@ bool efi_poweroff_required(void)
+ {
+ 	return !!acpi_gbl_reduced_hardware;
+ }
++
++#ifdef CONFIG_EFI_CAPSULE_QUIRK_QUARK_CSH
++
++static int qrk_capsule_setup_info(struct capsule_info *cap_info, void **pkbuff,
++				  size_t hdr_bytes)
++{
++	struct quark_security_header *csh = *pkbuff;
++
++	/* Only process data block that is larger than the security header */
++	if (hdr_bytes < sizeof(struct quark_security_header))
++		return 0;
++
++	if (csh->csh_signature != QUARK_CSH_SIGNATURE ||
++	    csh->headersize != QUARK_SECURITY_HEADER_SIZE)
++		return 1;
++
++	/* Only process data block if EFI header is included */
++	if (hdr_bytes < QUARK_SECURITY_HEADER_SIZE +
++			sizeof(efi_capsule_header_t))
++		return 0;
++
++	pr_debug("Quark security header detected\n");
++
++	if (csh->rsvd_next_header != 0) {
++		pr_err("multiple Quark security headers not supported\n");
++		return -EINVAL;
++	}
++
++	*pkbuff += csh->headersize;
++	cap_info->total_size = csh->headersize;
++
++	/*
++	 * Update the first page pointer to skip over the CSH header.
++	 */
++	cap_info->pages[0] += csh->headersize;
++
++	return 1;
++}
++
++#define ICPU(family, model, quirk_handler) \
++	{ X86_VENDOR_INTEL, family, model, X86_FEATURE_ANY, \
++	  (unsigned long)&quirk_handler }
++
++static const struct x86_cpu_id efi_capsule_quirk_ids[] = {
++	ICPU(5, 9, qrk_capsule_setup_info),	/* Intel Quark X1000 */
++	{ }
++};
++
++int efi_capsule_setup_info(struct capsule_info *cap_info, void *kbuff,
++			   size_t hdr_bytes)
++{
++	int (*quirk_handler)(struct capsule_info *, void **, size_t);
++	const struct x86_cpu_id *id;
++	int ret;
++
++	if (hdr_bytes < sizeof(efi_capsule_header_t))
++		return 0;
++
++	cap_info->total_size = 0;
++
++	id = x86_match_cpu(efi_capsule_quirk_ids);
++	if (id) {
++		/*
++		 * The quirk handler is supposed to return
++		 *  - a value > 0 if the setup should continue, after advancing
++		 *    kbuff as needed
++		 *  - 0 if not enough hdr_bytes are available yet
++		 *  - a negative error code otherwise
++		 */
++		quirk_handler = (typeof(quirk_handler))id->driver_data;
++		ret = quirk_handler(cap_info, &kbuff, hdr_bytes);
++		if (ret <= 0)
++			return ret;
++	}
++
++	memcpy(&cap_info->header, kbuff, sizeof(cap_info->header));
++
++	cap_info->total_size += cap_info->header.imagesize;
++
++	return __efi_capsule_setup_info(cap_info);
++}
++
++#endif
+diff --git a/drivers/firmware/efi/Kconfig b/drivers/firmware/efi/Kconfig
+index de221bbde9c9..8dfeee3b9e54 100644
+--- a/drivers/firmware/efi/Kconfig
++++ b/drivers/firmware/efi/Kconfig
+@@ -97,6 +97,15 @@ config EFI_CAPSULE_LOADER
+ 
+ 	  Most users should say N.
+ 
++config EFI_CAPSULE_QUIRK_QUARK_CSH
++	boolean "Add support for Quark capsules with non-standard headers"
++	depends on X86 && !64BIT
++	select EFI_CAPSULE_LOADER
++	default y
++	help
++	  Add support for processing Quark X1000 EFI capsules, whose header
++	  layout deviates from the layout mandated by the UEFI specification.
++
+ endmenu
+ 
+ config UEFI_CPER
+-- 
+2.12.0
+

+ 77 - 0
board/PSG/iot2000/linux-4.4-patches/0025-mfd-intel_quark_i2c_gpio-Use-dmi_system_id-table-for.patch

@@ -0,0 +1,77 @@
+From 81d39fbfbb4db3eab29c54c07ae79be1a24db599 Mon Sep 17 00:00:00 2001
+From: Jan Kiszka <jan.kiszka@siemens.com>
+Date: Sun, 21 May 2017 12:43:16 +0200
+Subject: [PATCH 25/27] mfd: intel_quark_i2c_gpio: Use dmi_system_id table for
+ retrieving frequency
+
+Avoids reimplementation of DMI matching in intel_quark_i2c_setup.
+
+Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
+---
+ drivers/mfd/intel_quark_i2c_gpio.c | 33 +++++++++++++--------------------
+ 1 file changed, 13 insertions(+), 20 deletions(-)
+
+diff --git a/drivers/mfd/intel_quark_i2c_gpio.c b/drivers/mfd/intel_quark_i2c_gpio.c
+index 042137465300..57d4396dab5d 100644
+--- a/drivers/mfd/intel_quark_i2c_gpio.c
++++ b/drivers/mfd/intel_quark_i2c_gpio.c
+@@ -60,19 +60,18 @@ struct intel_quark_mfd {
+ 	struct clk_lookup	*i2c_clk_lookup;
+ };
+ 
+-struct i2c_mode_info {
+-	const char *name;
+-	unsigned int i2c_scl_freq;
+-};
+-
+-static const struct i2c_mode_info platform_i2c_mode_info[] = {
++static const struct dmi_system_id dmi_platform_info[] = {
+ 	{
+-		.name = "Galileo",
+-		.i2c_scl_freq = 100000,
++		.matches = {
++			DMI_EXACT_MATCH(DMI_BOARD_NAME, "Galileo"),
++		},
++		.driver_data = (void *)100000,
+ 	},
+ 	{
+-		.name = "GalileoGen2",
+-		.i2c_scl_freq = 400000,
++		.matches = {
++			DMI_EXACT_MATCH(DMI_BOARD_NAME, "GalileoGen2"),
++		},
++		.driver_data = (void *)400000,
+ 	},
+ 	{}
+ };
+@@ -167,8 +166,7 @@ static void intel_quark_unregister_i2c_clk(struct pci_dev *pdev)
+ 
+ static int intel_quark_i2c_setup(struct pci_dev *pdev, struct mfd_cell *cell)
+ {
+-	const char *board_name = dmi_get_system_info(DMI_BOARD_NAME);
+-	const struct i2c_mode_info *info;
++	const struct dmi_system_id *dmi_id;
+ 	struct dw_i2c_platform_data *pdata;
+ 	struct resource *res = (struct resource *)cell->resources;
+ 	struct device *dev = &pdev->dev;
+@@ -188,14 +186,9 @@ static int intel_quark_i2c_setup(struct pci_dev *pdev, struct mfd_cell *cell)
+ 	/* Normal mode by default */
+ 	pdata->i2c_scl_freq = 100000;
+ 
+-	if (board_name) {
+-		for (info = platform_i2c_mode_info; info->name; info++) {
+-			if (!strcmp(board_name, info->name)) {
+-				pdata->i2c_scl_freq = info->i2c_scl_freq;
+-				break;
+-			}
+-		}
+-	}
++	dmi_id = dmi_first_match(dmi_platform_info);
++	if (dmi_id)
++		pdata->i2c_scl_freq = (uintptr_t)dmi_id->driver_data;
+ 
+ 	cell->platform_data = pdata;
+ 	cell->pdata_size = sizeof(*pdata);
+-- 
+2.12.0
+

+ 45 - 0
board/PSG/iot2000/linux-4.4-patches/0026-mfd-intel_quark_i2c_gpio-Add-support-for-SIMATIC-IOT.patch

@@ -0,0 +1,45 @@
+From 2b8b5ae2e33e47057261aa0f5bb38b6b6e69bcee Mon Sep 17 00:00:00 2001
+From: Jan Kiszka <jan.kiszka@siemens.com>
+Date: Sat, 6 May 2017 07:10:36 +0200
+Subject: [PATCH 26/27] mfd: intel_quark_i2c_gpio: Add support for SIMATIC
+ IOT2000 platform
+
+The SIMATIC IOT2020 and IOT2040 are derived from the Galileo Gen2 board
+and share its I2C frequency.
+
+Signed-off-by: Sascha Weisenberger <sascha.weisenberger@siemens.com>
+Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
+---
+ drivers/mfd/intel_quark_i2c_gpio.c | 16 ++++++++++++++++
+ 1 file changed, 16 insertions(+)
+
+diff --git a/drivers/mfd/intel_quark_i2c_gpio.c b/drivers/mfd/intel_quark_i2c_gpio.c
+index 57d4396dab5d..1c09604978d3 100644
+--- a/drivers/mfd/intel_quark_i2c_gpio.c
++++ b/drivers/mfd/intel_quark_i2c_gpio.c
+@@ -73,6 +73,22 @@ static const struct dmi_system_id dmi_platform_info[] = {
+ 		},
+ 		.driver_data = (void *)400000,
+ 	},
++	{
++		.matches = {
++			DMI_EXACT_MATCH(DMI_BOARD_NAME, "SIMATIC IOT2000"),
++			DMI_EXACT_MATCH(DMI_BOARD_ASSET_TAG,
++					"6ES7647-0AA00-0YA2"),
++		},
++		.driver_data = (void *)400000,
++	},
++	{
++		.matches = {
++			DMI_EXACT_MATCH(DMI_BOARD_NAME, "SIMATIC IOT2000"),
++			DMI_EXACT_MATCH(DMI_BOARD_ASSET_TAG,
++					"6ES7647-0AA00-1YA2"),
++		},
++		.driver_data = (void *)400000,
++	},
+ 	{}
+ };
+ 
+-- 
+2.12.0
+

+ 44 - 0
board/PSG/iot2000/linux-4.4-patches/0027-iot2000-hack-Work-around-DSDT-mistake.patch

@@ -0,0 +1,44 @@
+From c9125348a22f695fa543c96e8f6beca8cb26d6d7 Mon Sep 17 00:00:00 2001
+From: Jan Kiszka <jan.kiszka@siemens.com>
+Date: Thu, 25 May 2017 11:09:42 +0200
+Subject: [PATCH 27/27] iot2000-hack: Work around DSDT mistake
+
+Until we have a new firmware revision, fix up the incorrect GPIO
+interrupt pin in software.
+
+Nothing for upstream.
+
+Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
+---
+ drivers/gpio/gpiolib-acpi.c | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+diff --git a/drivers/gpio/gpiolib-acpi.c b/drivers/gpio/gpiolib-acpi.c
+index cbbb67a6f1d6..ec1a092e9911 100644
+--- a/drivers/gpio/gpiolib-acpi.c
++++ b/drivers/gpio/gpiolib-acpi.c
+@@ -10,6 +10,7 @@
+  * published by the Free Software Foundation.
+  */
+ 
++#include <linux/dmi.h>
+ #include <linux/errno.h>
+ #include <linux/gpio.h>
+ #include <linux/gpio/consumer.h>
+@@ -408,6 +409,13 @@ static int acpi_find_gpio(struct acpi_resource *ares, void *data)
+ 		if (pin_index >= agpio->pin_table_length)
+ 			return 1;
+ 
++		if (!strcmp(dmi_get_system_info(DMI_BOARD_NAME),
++			    "SIMATIC IOT2000") &&
++		    !strcmp(agpio->resource_source.string_ptr,
++			    "\\_SB.PCI0.GIP0.GPO") &&
++		    agpio->pin_table[pin_index] == 9)
++			agpio->pin_table[pin_index] = 1;
++
+ 		lookup->desc = acpi_get_gpiod(agpio->resource_source.string_ptr,
+ 					      agpio->pin_table[pin_index]);
+ 		lookup->info.gpioint =
+-- 
+2.12.0
+

+ 95 - 0
board/PSG/iot2000/linux-4.4-patches/0028-gpio-pca953x-provide-GPIO-base-based-on-_UID.patch

@@ -0,0 +1,95 @@
+From 81e166ec0a35ed5a01e2453603b0b1c73a0532cc Mon Sep 17 00:00:00 2001
+From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
+Date: Fri, 19 Feb 2016 07:18:26 -0800
+Subject: [PATCH 2/6] gpio: pca953x: provide GPIO base based on _UID
+
+Custom kernel for Intel Galileo Gen2 provides and moreover libmraa relies on
+the continuous GPIO space. To do such we have to configure GPIO base per each
+GPIO expander. The only value we can use is the ACPI _UID.
+
+Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
+
+Upstream-status: Inappropriate, custom code for legacy userspace
+Signed-off-by: Saul Wold <sgw@linux.intel.com>
+Signed-off-by: Bruce Ashfield <bruce.ashfield@windriver.com>
+---
+ drivers/gpio/gpio-pca953x.c | 44 +++++++++++++++++++++++++++++++++++++-------
+ 1 file changed, 37 insertions(+), 7 deletions(-)
+
+diff --git a/drivers/gpio/gpio-pca953x.c b/drivers/gpio/gpio-pca953x.c
+index 2d4892cc70fb..f23a4b4c26a2 100644
+--- a/drivers/gpio/gpio-pca953x.c
++++ b/drivers/gpio/gpio-pca953x.c
+@@ -77,12 +77,6 @@ static const struct i2c_device_id pca953x_id[] = {
+ };
+ MODULE_DEVICE_TABLE(i2c, pca953x_id);
+ 
+-static const struct acpi_device_id pca953x_acpi_ids[] = {
+-	{ "INT3491", 16 | PCA953X_TYPE | PCA_INT, },
+-	{ }
+-};
+-MODULE_DEVICE_TABLE(acpi, pca953x_acpi_ids);
+-
+ #define MAX_BANK 5
+ #define BANK_SZ 8
+ 
+@@ -109,6 +103,35 @@ struct pca953x_chip {
+ 	unsigned long driver_data;
+ };
+ 
++struct pca953x_info {
++	kernel_ulong_t driver_data;
++	void (*setup)(struct pca953x_chip *chip);
++};
++
++static void pca953x_setup_int3491(struct pca953x_chip *chip)
++{
++	struct acpi_device *adev = ACPI_COMPANION(&chip->client->dev);
++	unsigned int uid;
++
++	if (kstrtouint(acpi_device_uid(adev), 0, &uid) || !uid--)
++		return;
++
++	chip->gpio_start = 8 /* sch_gpio */ +
++			   8 /* gpio-dwapb */ +
++			  16 /* pca9535 */ * uid;
++}
++
++static const struct pca953x_info pca953x_info_int3491 = {
++	.driver_data = 16 | PCA953X_TYPE | PCA_INT,
++	.setup = pca953x_setup_int3491,
++};
++
++static const struct acpi_device_id pca953x_acpi_ids[] = {
++	{ "INT3491",  (kernel_ulong_t)&pca953x_info_int3491 },
++	{ }
++};
++MODULE_DEVICE_TABLE(acpi, pca953x_acpi_ids);
++
+ static inline struct pca953x_chip *to_pca(struct gpio_chip *gc)
+ {
+ 	return container_of(gc, struct pca953x_chip, gpio_chip);
+@@ -691,12 +714,19 @@ static int pca953x_probe(struct i2c_client *client,
+ 		chip->driver_data = id->driver_data;
+ 	} else {
+ 		const struct acpi_device_id *id;
++		const struct pca953x_info *info;
+ 
+ 		id = acpi_match_device(pca953x_acpi_ids, &client->dev);
+ 		if (!id)
+ 			return -ENODEV;
+ 
+-		chip->driver_data = id->driver_data;
++		info = (struct pca953x_info *)id->driver_data;
++		if (!info)
++			return -ENODEV;
++
++		chip->driver_data = info->driver_data;
++		if (info->setup)
++			info->setup(chip);
+ 	}
+ 
+ 	chip->chip_type = PCA_CHIP_TYPE(chip->driver_data);
+-- 
+2.5.0
+

+ 497 - 0
board/PSG/iot2000/linux-4.4-patches/0029-staging-iio-add-support-for-ADC1x8s102.patch

@@ -0,0 +1,497 @@
+From 903003b78c132f74a84e9bb722aac1c6af49825f Mon Sep 17 00:00:00 2001
+From: Todor Minchev <todor@minchev.co.uk>
+Date: Fri, 19 Feb 2016 07:18:29 -0800
+Subject: [PATCH 5/6] staging:iio: add support for ADC1x8s102.
+
+Adds new config and support for Texas Instruments ADC1x8S102 driver"
+
+config ADC1x8S102
+	tristate "Texas Instruments ADC1x8S102 driver"
+	depends on SPI
+	select IIO_BUFFER
+	select IIO_TRIGGERED_BUFFER
+	help
+		Say yes here to build support for Texas Instruments ADC1x8S102 ADC.
+		Provides direct access via sysfs.
+
+		To compile this driver as a module, choose M here: the module will
+		be called adc1x8s102
+
+Upstream-status: Forward-ported from Intel IOT Develper Kit Quark BSP
+
+Original author is Bogdan Pricop <bogdan.pricop@emutex.com>.
+Signed-off-by: Ismo Puustinen <ismo.puustinen@intel.com>
+Signed-off-by: Saul Wold <sgw@linux.intel.com>
+Signed-off-by: Bruce Ashfield <bruce.ashfield@windriver.com>
+---
+ drivers/staging/iio/adc/Kconfig          |  13 ++
+ drivers/staging/iio/adc/Makefile         |   1 +
+ drivers/staging/iio/adc/adc1x8s102.c     | 387 +++++++++++++++++++++++++++++++
+ include/linux/platform_data/adc1x8s102.h |  30 +++
+ 4 files changed, 431 insertions(+)
+ create mode 100644 drivers/staging/iio/adc/adc1x8s102.c
+ create mode 100644 include/linux/platform_data/adc1x8s102.h
+
+diff --git a/drivers/staging/iio/adc/Kconfig b/drivers/staging/iio/adc/Kconfig
+index 94ae4232ee77..537c78540457 100644
+--- a/drivers/staging/iio/adc/Kconfig
++++ b/drivers/staging/iio/adc/Kconfig
+@@ -115,4 +115,17 @@ config SPEAR_ADC
+ 
+ 	  To compile this driver as a module, choose M here: the
+ 	  module will be called spear_adc.
++
++config ADC1x8S102
++	tristate "Texas Instruments ADC1x8S102 driver"
++	depends on SPI
++	select IIO_BUFFER
++	select IIO_TRIGGERED_BUFFER
++	help
++		Say yes here to build support for Texas Instruments ADC1x8S102 ADC.
++		Provides direct access via sysfs.
++
++		To compile this driver as a module, choose M here: the module will
++		be called adc1x8s102
++
+ endmenu
+diff --git a/drivers/staging/iio/adc/Makefile b/drivers/staging/iio/adc/Makefile
+index 1c4277dbd318..3fe38805581c 100644
+--- a/drivers/staging/iio/adc/Makefile
++++ b/drivers/staging/iio/adc/Makefile
+@@ -15,3 +15,4 @@ obj-$(CONFIG_AD7280) += ad7280a.o
+ obj-$(CONFIG_LPC32XX_ADC) += lpc32xx_adc.o
+ obj-$(CONFIG_MXS_LRADC) += mxs-lradc.o
+ obj-$(CONFIG_SPEAR_ADC) += spear_adc.o
++obj-$(CONFIG_ADC1x8S102) += adc1x8s102.o
+diff --git a/drivers/staging/iio/adc/adc1x8s102.c b/drivers/staging/iio/adc/adc1x8s102.c
+new file mode 100644
+index 000000000000..52472e21823c
+--- /dev/null
++++ b/drivers/staging/iio/adc/adc1x8s102.c
+@@ -0,0 +1,387 @@
++/*
++ * ADC1x8S102 SPI ADC driver
++ *
++ * Copyright(c) 2013 Intel Corporation.
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms and conditions of the GNU General Public License,
++ * version 2, as published by the Free Software Foundation.
++ *
++ * This program is distributed in the hope 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.
++ *
++ * This IIO device driver is is designed to work with the following
++ * analog to digital converters from Texas Instruments:
++ *  ADC108S102
++ *  ADC128S102
++ * The communication with ADC chip is via the SPI bus (mode 3).
++ */
++
++
++#include <linux/iio/iio.h>
++#include <linux/iio/buffer.h>
++#include <linux/iio/types.h>
++#include <linux/iio/triggered_buffer.h>
++#include <linux/iio/trigger_consumer.h>
++
++#include <linux/interrupt.h>
++#include <linux/module.h>
++#include <linux/spi/spi.h>
++
++#include <linux/platform_data/adc1x8s102.h>
++#include <linux/regulator/consumer.h>
++
++/*
++ * Defining the ADC resolution being 12 bits, we can use the same driver for
++ * both ADC108S102 (10 bits resolution) and ADC128S102 (12 bits resolution)
++ * chips. The ADC108S102 effectively returns a 12-bit result with the 2
++ * least-significant bits unset.
++ */
++#define ADC1x8S102_BITS		12
++#define ADC1x8S102_MAX_CHANNELS	8
++
++/* 16-bit SPI command format:
++ *   [15:14] Ignored
++ *   [13:11] 3-bit channel address
++ *   [10:0]  Ignored
++ */
++#define ADC1x8S102_CMD(ch)		(((ch) << (8)) << (3))
++
++/*
++ * 16-bit SPI response format:
++ *   [15:12] Zeros
++ *   [11:0]  12-bit ADC sample (for ADC108S102, [1:0] will always be 0).
++ */
++#define ADC1x8S102_RES_DATA(res)	(res & ((1 << ADC1x8S102_BITS) - 1))
++
++struct adc1x8s102_state {
++	struct spi_device		*spi;
++	struct regulator		*reg;
++	u16				ext_vin;
++	/* SPI transfer used by triggered buffer handler*/
++	struct spi_transfer		ring_xfer;
++	/* SPI transfer used by direct scan */
++	struct spi_transfer		scan_single_xfer;
++	/* SPI message used by ring_xfer SPI transfer */
++	struct spi_message		ring_msg;
++	/* SPI message used by scan_single_xfer SPI transfer */
++	struct spi_message		scan_single_msg;
++
++	/* SPI message buffers:
++	 *  tx_buf: |C0|C1|C2|C3|C4|C5|C6|C7|XX|
++	 *  rx_buf: |XX|R0|R1|R2|R3|R4|R5|R6|R7|tt|tt|tt|tt|
++	 *
++	 *  tx_buf: 8 channel read commands, plus 1 dummy command
++	 *  rx_buf: 1 dummy response, 8 channel responses, plus 64-bit timestamp
++	 */
++	__be16				rx_buf[13] ____cacheline_aligned;
++	__be16				tx_buf[9];
++
++};
++
++#define ADC1X8S102_V_CHAN(index)					\
++	{								\
++		.type = IIO_VOLTAGE,					\
++		.indexed = 1,						\
++		.channel = index,					\
++		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
++			BIT(IIO_CHAN_INFO_SCALE),		\
++		.address = index,					\
++		.scan_index = index,					\
++		.scan_type = {						\
++			.sign = 'u',					\
++			.realbits = ADC1x8S102_BITS,			\
++			.storagebits = 16,				\
++			.endianness = IIO_BE,				\
++		},							\
++	}
++
++static const struct iio_chan_spec adc1x8s102_channels[] = {
++	ADC1X8S102_V_CHAN(0),
++	ADC1X8S102_V_CHAN(1),
++	ADC1X8S102_V_CHAN(2),
++	ADC1X8S102_V_CHAN(3),
++	ADC1X8S102_V_CHAN(4),
++	ADC1X8S102_V_CHAN(5),
++	ADC1X8S102_V_CHAN(6),
++	ADC1X8S102_V_CHAN(7),
++	IIO_CHAN_SOFT_TIMESTAMP(8),
++};
++
++
++static int adc1x8s102_update_scan_mode(struct iio_dev *indio_dev,
++		unsigned long const *active_scan_mask)
++{
++	struct adc1x8s102_state *st;
++	int i, j;
++
++	st = iio_priv(indio_dev);
++
++	/* Fill in the first x shorts of tx_buf with the number of channels
++	 * enabled for sampling by the triggered buffer
++	 */
++	for (i = 0, j = 0; i < ADC1x8S102_MAX_CHANNELS; i++) {
++		if (test_bit(i, active_scan_mask)) {
++			st->tx_buf[j] = cpu_to_be16(ADC1x8S102_CMD(i));
++			j++;
++		}
++	}
++	/* One dummy command added, to clock in the last response */
++	st->tx_buf[j] = 0x00;
++
++	/* build SPI ring message */
++	st->ring_xfer.tx_buf = &st->tx_buf[0];
++	st->ring_xfer.rx_buf = &st->rx_buf[0];
++	st->ring_xfer.len = (j + 1) * sizeof(__be16);
++
++	spi_message_init(&st->ring_msg);
++	spi_message_add_tail(&st->ring_xfer, &st->ring_msg);
++
++	return 0;
++}
++
++
++static irqreturn_t adc1x8s102_trigger_handler(int irq, void *p)
++{
++	struct iio_poll_func *pf = p;
++	struct iio_dev *indio_dev;
++	struct adc1x8s102_state *st;
++	s64 time_ns = 0;
++	int b_sent;
++
++	indio_dev = pf->indio_dev;
++	st = iio_priv(indio_dev);
++
++	b_sent = spi_sync(st->spi, &st->ring_msg);
++	if (b_sent)
++		goto done;
++	if (indio_dev->scan_timestamp) {
++		time_ns = iio_get_time_ns();
++		memcpy((u8 *)st->rx_buf + st->ring_xfer.len, &time_ns,
++				sizeof(time_ns));
++	}
++
++	/* Skip the dummy response in the first slot */
++	iio_push_to_buffers(indio_dev, (u8 *)&st->rx_buf[1]);
++done:
++	iio_trigger_notify_done(indio_dev->trig);
++
++	return IRQ_HANDLED;
++}
++
++
++/*
++ * returns:
++ * positive (>=0)  value => SUCCESS
++ * negative value => FAILURE
++ */
++static int adc1x8s102_scan_direct(struct adc1x8s102_state *st, unsigned ch)
++{
++	int ret;
++
++	if (ch >= ADC1x8S102_MAX_CHANNELS) {
++		dev_err(&st->spi->dev, "AD channel number too big: %u\n", ch);
++		return -1;
++	}
++
++	st->tx_buf[0] = cpu_to_be16(ADC1x8S102_CMD(ch));
++	ret = spi_sync(st->spi, &st->scan_single_msg);
++	if (ret)
++		return ret;
++
++	/* Skip the dummy response in the first slot */
++	return be16_to_cpu(st->rx_buf[1]);
++}
++
++
++/*
++ * returns:
++ * positive (>=0)  value => SUCCESS
++ * negative value => FAILURE
++ */
++static int adc1x8s102_read_raw(struct iio_dev *indio_dev,
++			   struct iio_chan_spec const *chan,
++			   int *val,
++			   int *val2,
++			   long m)
++{
++	int ret;
++	struct adc1x8s102_state *st;
++
++	st = iio_priv(indio_dev);
++
++	switch (m) {
++	case IIO_CHAN_INFO_RAW:
++		mutex_lock(&indio_dev->mlock);
++		if (indio_dev->currentmode == INDIO_BUFFER_TRIGGERED) {
++			ret = -EBUSY;
++			dev_warn(&st->spi->dev,
++			 "indio_dev->currentmode is INDIO_BUFFER_TRIGGERED\n");
++		} else {
++			ret = adc1x8s102_scan_direct(st, chan->address);
++		}
++		mutex_unlock(&indio_dev->mlock);
++
++		if (ret < 0)
++			return ret;
++		*val = ADC1x8S102_RES_DATA(ret);
++
++		return IIO_VAL_INT;
++	case IIO_CHAN_INFO_SCALE:
++		switch (chan->type) {
++		case IIO_VOLTAGE:
++			if (NULL != st->reg)
++				*val = regulator_get_voltage(st->reg) / 1000;
++			else
++				*val = st->ext_vin;
++
++			*val2 = chan->scan_type.realbits;
++			return IIO_VAL_FRACTIONAL_LOG2;
++		default:
++			dev_warn(&st->spi->dev,
++				 "Invalid channel type %u for channel %d\n",
++				 chan->type, chan->channel);
++			return -EINVAL;
++		}
++	default:
++		dev_warn(&st->spi->dev, "Invalid IIO_CHAN_INFO: %lu\n", m);
++		return -EINVAL;
++	}
++}
++
++
++
++static const struct iio_info adc1x8s102_info = {
++	.read_raw		= &adc1x8s102_read_raw,
++	.update_scan_mode	= &adc1x8s102_update_scan_mode,
++	.driver_module		= THIS_MODULE,
++};
++
++
++static int adc1x8s102_probe(struct spi_device *spi)
++{
++	struct adc1x8s102_platform_data *pdata = spi->dev.platform_data;
++	struct adc1x8s102_state *st;
++	struct iio_dev *indio_dev = iio_device_alloc(sizeof(*st));
++	int ret;
++
++	if (NULL == indio_dev) {
++		dev_crit(&spi->dev, "Cannot allocate memory for indio_dev\n");
++		return -ENOMEM;
++	}
++
++	st = iio_priv(indio_dev);
++	if (NULL == pdata) {
++		dev_err(&spi->dev, "Cannot get adc1x8s102 platform data\n");
++		return -EFAULT;
++	}
++	st->ext_vin = pdata->ext_vin;
++
++	/* Use regulator, if available. */
++	st->reg = regulator_get(&spi->dev, "vref");
++	if (IS_ERR(st->reg)) {
++		ret = PTR_ERR(st->reg);
++		dev_warn(&spi->dev,
++			 "Cannot get 'vref' regulator\n");
++		goto error_free;
++	}
++	ret = regulator_enable(st->reg);
++	if (ret < 0) {
++		dev_warn(&spi->dev,
++			 "Cannot enable vref regulator\n");
++		goto error_put_reg;
++	}
++
++	spi_set_drvdata(spi, indio_dev);
++	st->spi = spi;
++
++	indio_dev->name = spi_get_device_id(spi)->name;
++	indio_dev->dev.parent = &spi->dev;
++	indio_dev->modes = INDIO_DIRECT_MODE;
++	indio_dev->channels = adc1x8s102_channels;
++	indio_dev->num_channels = ARRAY_SIZE(adc1x8s102_channels);
++	indio_dev->info = &adc1x8s102_info;
++
++	/* Setup default message */
++	st->scan_single_xfer.tx_buf = st->tx_buf;
++	st->scan_single_xfer.rx_buf = st->rx_buf;
++	st->scan_single_xfer.len = 2 * sizeof(__be16);
++	st->scan_single_xfer.cs_change = 0;
++
++	spi_message_init(&st->scan_single_msg);
++	spi_message_add_tail(&st->scan_single_xfer, &st->scan_single_msg);
++
++	ret = iio_triggered_buffer_setup(indio_dev, NULL,
++			&adc1x8s102_trigger_handler, NULL);
++	if (ret)
++		goto error_disable_reg;
++
++	ret = iio_device_register(indio_dev);
++	if (ret) {
++		dev_err(&spi->dev,
++			"Failed to register IIO device\n");
++		goto error_cleanup_ring;
++	}
++	return 0;
++
++error_cleanup_ring:
++	iio_triggered_buffer_cleanup(indio_dev);
++error_disable_reg:
++	regulator_disable(st->reg);
++error_put_reg:
++	regulator_put(st->reg);
++error_free:
++	iio_device_free(indio_dev);
++
++	return ret;
++}
++
++
++static int adc1x8s102_remove(struct spi_device *spi)
++{
++	struct iio_dev *indio_dev;
++	struct adc1x8s102_state *st;
++
++	indio_dev = spi_get_drvdata(spi);
++	if (NULL == indio_dev) {
++		dev_err(&spi->dev, "Cannot get spi_device drvdata\n");
++		return -EFAULT;
++	}
++
++	st = iio_priv(indio_dev);
++
++	iio_device_unregister(indio_dev);
++
++	iio_triggered_buffer_cleanup(indio_dev);
++
++	regulator_disable(st->reg);
++	regulator_put(st->reg);
++
++	iio_device_free(indio_dev);
++
++	return 0;
++}
++
++
++static const struct spi_device_id adc1x8s102_id[] = {
++	{"adc1x8s102", 0},
++	{}
++};
++MODULE_DEVICE_TABLE(spi, adc1x8s102_id);
++
++static struct spi_driver adc1x8s102_driver = {
++	.driver = {
++		.name	= "adc1x8s102",
++		.owner	= THIS_MODULE,
++	},
++	.probe		= adc1x8s102_probe,
++	.remove		= adc1x8s102_remove,
++	.id_table	= adc1x8s102_id,
++};
++module_spi_driver(adc1x8s102_driver);
++
++MODULE_AUTHOR("Bogdan Pricop <bogdan.pricop@emutex.com>");
++MODULE_DESCRIPTION("Texas Instruments ADC1x8S102 driver");
++MODULE_LICENSE("GPL v2");
+diff --git a/include/linux/platform_data/adc1x8s102.h b/include/linux/platform_data/adc1x8s102.h
+new file mode 100644
+index 000000000000..a32a499eb9fd
+--- /dev/null
++++ b/include/linux/platform_data/adc1x8s102.h
+@@ -0,0 +1,30 @@
++/*
++ * ADC1x8S102 SPI ADC driver
++ *
++ * Copyright(c) 2013 Intel Corporation.
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms and conditions of the GNU General Public License,
++ * version 2, as published by the Free Software Foundation.
++ *
++ * This program is distributed in the hope 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.
++ */
++
++
++#ifndef __LINUX_PLATFORM_DATA_ADC1x8S102_H__
++#define __LINUX_PLATFORM_DATA_ADC1x8S102_H__
++
++
++/**
++ * struct adc1x8s102_platform_data - Platform data for the adc1x8s102 ADC driver
++ * @ext_vin: External input voltage range for all voltage input channels
++ *	This is the voltage level of pin VA in millivolts
++ **/
++struct adc1x8s102_platform_data {
++	u16  ext_vin;
++};
++
++#endif /* __LINUX_PLATFORM_DATA_ADC1x8S102_H__ */
+-- 
+2.5.0
+

+ 154 - 0
board/PSG/iot2000/linux-4.4-patches/0030-adc1x8s102-support-ACPI-based-enumeration.patch

@@ -0,0 +1,154 @@
+From 66009f8977a62d3bd29d4b89a8e29d1095524aea Mon Sep 17 00:00:00 2001
+From: Ismo Puustinen <ismo.puustinen@intel.com>
+Date: Fri, 19 Feb 2016 07:18:30 -0800
+Subject: [PATCH 6/6] adc1x8s102: support ACPI-based enumeration.
+
+Upstream-status: Pending for ADC1x8s102 patch upstreaming to Linux kernel
+
+Signed-off-by: Ismo Puustinen <ismo.puustinen@intel.com>
+Signed-off-by: Saul Wold <sgw@linux.intel.com>
+Signed-off-by: Bruce Ashfield <bruce.ashfield@windriver.com>
+---
+ drivers/staging/iio/adc/adc1x8s102.c | 76 ++++++++++++++++++++++++++++++------
+ 1 file changed, 63 insertions(+), 13 deletions(-)
+
+diff --git a/drivers/staging/iio/adc/adc1x8s102.c b/drivers/staging/iio/adc/adc1x8s102.c
+index 52472e21823c..881b145fd68a 100644
+--- a/drivers/staging/iio/adc/adc1x8s102.c
++++ b/drivers/staging/iio/adc/adc1x8s102.c
+@@ -1,7 +1,7 @@
+ /*
+  * ADC1x8S102 SPI ADC driver
+  *
+- * Copyright(c) 2013 Intel Corporation.
++ * Copyright(c) 2013-2015 Intel Corporation.
+  *
+  * This program is free software; you can redistribute it and/or modify it
+  * under the terms and conditions of the GNU General Public License,
+@@ -33,6 +33,13 @@
+ #include <linux/platform_data/adc1x8s102.h>
+ #include <linux/regulator/consumer.h>
+ 
++#include <linux/delay.h>
++#include <linux/acpi.h>
++#include <linux/property.h>
++#include <linux/gpio.h>
++
++#include <linux/spi/pxa2xx_spi.h>
++
+ /*
+  * Defining the ADC resolution being 12 bits, we can use the same driver for
+  * both ADC108S102 (10 bits resolution) and ADC128S102 (12 bits resolution)
+@@ -259,14 +266,60 @@ static const struct iio_info adc1x8s102_info = {
+ 	.driver_module		= THIS_MODULE,
+ };
+ 
++struct adc1x8s102_spi_info {
++	kernel_ulong_t driver_data;
++	void (*setup)(struct spi_device *spi);
++};
++
++static void adc1x8s102_setup_int3495(struct spi_device *spi)
++{
++	/* Galileo Gen 2 SPI setup */
++
++#define ADC1x8S102_GALILEO2_CS 8
++
++	struct pxa2xx_spi_chip *chip_data;
++	chip_data = devm_kzalloc(&spi->dev, sizeof(*chip_data), GFP_KERNEL);
++
++	if (chip_data) {
++		chip_data->gpio_cs = ADC1x8S102_GALILEO2_CS;
++		spi->controller_data = chip_data;
++		dev_info(&spi->dev, "setting GPIO CS value to %d\n", chip_data->gpio_cs);
++		spi_setup(spi);
++	}
++}
++
++static const struct adc1x8s102_spi_info adc1x8s102_info_int3495 = {
++	.driver_data = 0,
++	.setup = adc1x8s102_setup_int3495,
++};
++
++static const struct acpi_device_id adc1x8s102_acpi_ids[] = {
++	{ "INT3495",  (kernel_ulong_t)&adc1x8s102_info_int3495 },
++	{ }
++};
++MODULE_DEVICE_TABLE(acpi, adc1x8s102_acpi_ids);
+ 
+ static int adc1x8s102_probe(struct spi_device *spi)
+ {
+ 	struct adc1x8s102_platform_data *pdata = spi->dev.platform_data;
+ 	struct adc1x8s102_state *st;
+ 	struct iio_dev *indio_dev = iio_device_alloc(sizeof(*st));
++	const struct acpi_device_id *id;
+ 	int ret;
+ 
++	id = acpi_match_device(adc1x8s102_acpi_ids, &spi->dev);
++
++	if (id) {
++		const struct adc1x8s102_spi_info *info =
++				(struct adc1x8s102_spi_info *)id->driver_data;
++
++		if (!info)
++			return -ENODEV;
++
++		if (info->setup)
++			info->setup(spi);
++	}
++
+ 	if (NULL == indio_dev) {
+ 		dev_crit(&spi->dev, "Cannot allocate memory for indio_dev\n");
+ 		return -ENOMEM;
+@@ -274,10 +327,13 @@ static int adc1x8s102_probe(struct spi_device *spi)
+ 
+ 	st = iio_priv(indio_dev);
+ 	if (NULL == pdata) {
+-		dev_err(&spi->dev, "Cannot get adc1x8s102 platform data\n");
+-		return -EFAULT;
++		dev_warn(&spi->dev, "Cannot get adc1x8s102 platform data\n");
++		/* FIXME: make this ACPI-dependent */
++		st->ext_vin = 5000;
++	}
++	else {
++		st->ext_vin = pdata->ext_vin;
+ 	}
+-	st->ext_vin = pdata->ext_vin;
+ 
+ 	/* Use regulator, if available. */
+ 	st->reg = regulator_get(&spi->dev, "vref");
+@@ -297,7 +353,7 @@ static int adc1x8s102_probe(struct spi_device *spi)
+ 	spi_set_drvdata(spi, indio_dev);
+ 	st->spi = spi;
+ 
+-	indio_dev->name = spi_get_device_id(spi)->name;
++	indio_dev->name = spi->modalias;
+ 	indio_dev->dev.parent = &spi->dev;
+ 	indio_dev->modes = INDIO_DIRECT_MODE;
+ 	indio_dev->channels = adc1x8s102_channels;
+@@ -365,20 +421,14 @@ static int adc1x8s102_remove(struct spi_device *spi)
+ }
+ 
+ 
+-static const struct spi_device_id adc1x8s102_id[] = {
+-	{"adc1x8s102", 0},
+-	{}
+-};
+-MODULE_DEVICE_TABLE(spi, adc1x8s102_id);
+-
+ static struct spi_driver adc1x8s102_driver = {
+ 	.driver = {
+-		.name	= "adc1x8s102",
++		.name   = "adc1x8s102",
+ 		.owner	= THIS_MODULE,
++		.acpi_match_table = ACPI_PTR(adc1x8s102_acpi_ids),
+ 	},
+ 	.probe		= adc1x8s102_probe,
+ 	.remove		= adc1x8s102_remove,
+-	.id_table	= adc1x8s102_id,
+ };
+ module_spi_driver(adc1x8s102_driver);
+ 
+-- 
+2.5.0
+

+ 373 - 0
board/PSG/iot2000/linux-4.4-patches/0031-gpio-pca953x-add-drive-property.patch

@@ -0,0 +1,373 @@
+From 3d2455f9da30f923c6bd69014fad4cc4ea738be6 Mon Sep 17 00:00:00 2001
+From: Jussi Laako <jussi.laako@linux.intel.com>
+Date: Thu, 10 Mar 2016 11:58:11 -0800
+Subject: [PATCH] gpio-pca953x: add "drive" property
+
+Galileo gen 2 has support for setting GPIO modes. Expose these
+properties through the GPIO sysfs interface. This approach is bit hacky,
+since it changes the interface semantics.
+
+The original patch was by Josef Ahmad <josef.ahmad@linux.intel.com> and
+made on top of kernel 3.8.
+
+Signed-off-by: Ismo Puustinen <ismo.puustinen@intel.com>
+Signed-off-by: Jussi Laako <jussi.laako@linux.intel.com>
+Signed-off-by: Saul Wold <sgw@linux.intel.com>
+Signed-off-by: Bruce Ashfield <bruce.ashfield@windriver.com>
+---
+ drivers/gpio/gpio-pca953x.c   | 57 +++++++++++++++++++++++++++----
+ drivers/gpio/gpiolib-sysfs.c  | 78 +++++++++++++++++++++++++++++++++++++++++++
+ drivers/gpio/gpiolib.c        | 18 ++++++++++
+ drivers/gpio/gpiolib.h        |  4 +++
+ include/asm-generic/gpio.h    |  5 +++
+ include/linux/gpio.h          | 10 ++++++
+ include/linux/gpio/consumer.h | 11 ++++++
+ include/linux/gpio/driver.h   |  2 ++
+ 8 files changed, 178 insertions(+), 7 deletions(-)
+
+diff --git a/drivers/gpio/gpio-pca953x.c b/drivers/gpio/gpio-pca953x.c
+index f23a4b4c26a2..f99706fd470f 100644
+--- a/drivers/gpio/gpio-pca953x.c
++++ b/drivers/gpio/gpio-pca953x.c
+@@ -39,6 +39,9 @@
+ #define PCA957X_MSK		6
+ #define PCA957X_INTS		7
+ 
++#define PCA953X_PUPD_EN	35
++#define PCA953X_PUPD_SEL	36
++
+ #define PCA_GPIO_MASK		0x00FF
+ #define PCA_INT			0x0100
+ #define PCA953X_TYPE		0x1000
+@@ -375,6 +378,43 @@ exit:
+ 	mutex_unlock(&chip->i2c_lock);
+ }
+ 
++static int pca953x_gpio_set_drive(struct gpio_chip *gc,
++				 unsigned off, unsigned mode)
++{
++	struct pca953x_chip *chip;
++	int ret = 0;
++	int val;
++
++	chip = container_of(gc, struct pca953x_chip, gpio_chip);
++
++	if (chip->chip_type != PCA953X_TYPE)
++		return -EINVAL;
++
++	mutex_lock(&chip->i2c_lock);
++
++	switch (mode) {
++	case GPIOF_DRIVE_PULLUP:
++		ret = pca953x_write_single(chip, PCA953X_PUPD_EN, 1, off) ||
++				pca953x_write_single(chip, PCA953X_PUPD_SEL, 1, off);
++		break;
++	case GPIOF_DRIVE_PULLDOWN:
++		ret = pca953x_write_single(chip, PCA953X_PUPD_EN, 1, off) ||
++				pca953x_write_single(chip, PCA953X_PUPD_SEL, 0, off);
++		break;
++	case GPIOF_DRIVE_STRONG:
++	case GPIOF_DRIVE_HIZ:
++		ret = pca953x_read_single(chip, PCA953X_PUPD_EN, &val, off) ||
++				pca953x_write_single(chip, PCA953X_PUPD_EN, 0, off) ||
++				pca953x_write_single(chip, PCA953X_PUPD_SEL, val, off);
++		break;
++	default:
++		ret = -EINVAL;
++	}
++
++	mutex_unlock(&chip->i2c_lock);
++	return ret;
++}
++
+ static void pca953x_setup_gpio(struct pca953x_chip *chip, int gpios)
+ {
+ 	struct gpio_chip *gc;
+@@ -393,6 +433,9 @@ static void pca953x_setup_gpio(struct pca953x_chip *chip, int gpios)
+ 	gc->dev = &chip->client->dev;
+ 	gc->owner = THIS_MODULE;
+ 	gc->names = chip->names;
++
++	if (chip->chip_type == PCA953X_TYPE)
++		gc->set_drive = pca953x_gpio_set_drive;
+ }
+ 
+ #ifdef CONFIG_GPIO_PCA953X_IRQ
+@@ -552,7 +595,7 @@ static irqreturn_t pca953x_irq_handler(int irq, void *devid)
+ }
+ 
+ static int pca953x_irq_setup(struct pca953x_chip *chip,
+-			     int irq_base)
++				 int irq_base)
+ {
+ 	struct i2c_client *client = chip->client;
+ 	int ret, i, offset = 0;
+@@ -595,10 +638,10 @@ static int pca953x_irq_setup(struct pca953x_chip *chip,
+ 		}
+ 
+ 		ret =  gpiochip_irqchip_add(&chip->gpio_chip,
+-					    &pca953x_irq_chip,
+-					    irq_base,
+-					    handle_simple_irq,
+-					    IRQ_TYPE_NONE);
++						&pca953x_irq_chip,
++						irq_base,
++						handle_simple_irq,
++						IRQ_TYPE_NONE);
+ 		if (ret) {
+ 			dev_err(&client->dev,
+ 				"could not connect irqchip to gpiochip\n");
+@@ -615,7 +658,7 @@ static int pca953x_irq_setup(struct pca953x_chip *chip,
+ 
+ #else /* CONFIG_GPIO_PCA953X_IRQ */
+ static int pca953x_irq_setup(struct pca953x_chip *chip,
+-			     int irq_base)
++				 int irq_base)
+ {
+ 	struct i2c_client *client = chip->client;
+ 
+@@ -636,7 +679,7 @@ static int device_pca953x_init(struct pca953x_chip *chip, u32 invert)
+ 		goto out;
+ 
+ 	ret = pca953x_read_regs(chip, PCA953X_DIRECTION,
+-			       chip->reg_direction);
++				   chip->reg_direction);
+ 	if (ret)
+ 		goto out;
+ 
+diff --git a/drivers/gpio/gpiolib-sysfs.c b/drivers/gpio/gpiolib-sysfs.c
+index b57ed8e55ab5..b60e47738f84 100644
+--- a/drivers/gpio/gpiolib-sysfs.c
++++ b/drivers/gpio/gpiolib-sysfs.c
+@@ -7,6 +7,7 @@
+ #include <linux/interrupt.h>
+ #include <linux/kdev_t.h>
+ #include <linux/slab.h>
++#include <linux/gpio.h>
+ 
+ #include "gpiolib.h"
+ 
+@@ -350,6 +351,82 @@ static ssize_t active_low_store(struct device *dev,
+ }
+ static DEVICE_ATTR_RW(active_low);
+ 
++
++static ssize_t gpio_drive_show(struct device *dev,
++		struct device_attribute *attr, char *buf)
++{
++	const struct gpio_desc	*desc = dev_get_drvdata(dev);
++	ssize_t			status;
++
++	mutex_lock(&sysfs_lock);
++
++	if (!test_bit(FLAG_EXPORT, &desc->flags)) {
++		status = -EIO;
++	} else {
++		if (test_bit(FLAG_PULLUP, &desc->flags))
++			status = sprintf(buf, "pullup\n");
++		else if (test_bit(FLAG_PULLDOWN, &desc->flags))
++			status = sprintf(buf, "pulldown\n");
++		else if (test_bit(FLAG_STRONG, &desc->flags))
++			status = sprintf(buf, "strong\n");
++		else if (test_bit(FLAG_HIZ, &desc->flags))
++			status = sprintf(buf, "hiz\n");
++		else
++			status = -EINVAL;
++	}
++
++	mutex_unlock(&sysfs_lock);
++	return status;
++}
++
++static ssize_t gpio_drive_store(struct device *dev,
++		struct device_attribute *attr, const char *buf, size_t size)
++{
++	struct gpio_desc	*desc = dev_get_drvdata(dev);
++	ssize_t			status;
++
++	mutex_lock(&sysfs_lock);
++
++	if (!test_bit(FLAG_EXPORT, &desc->flags))
++		status = -EIO;
++	else {
++		clear_bit(FLAG_PULLUP, &desc->flags);
++		clear_bit(FLAG_PULLDOWN, &desc->flags);
++		clear_bit(FLAG_STRONG, &desc->flags);
++		clear_bit(FLAG_HIZ, &desc->flags);
++		if (sysfs_streq(buf, "pullup")) {
++			status = gpiod_set_drive(desc, GPIOF_DRIVE_PULLUP);
++			if (!status) {
++				set_bit(FLAG_PULLUP, &desc->flags);
++			}
++		} else if (sysfs_streq(buf, "pulldown")) {
++			status = gpiod_set_drive(desc, GPIOF_DRIVE_PULLDOWN);
++			if (!status) {
++				set_bit(FLAG_PULLDOWN, &desc->flags);
++			}
++		} else if (sysfs_streq(buf, "strong")) {
++			status = gpiod_set_drive(desc, GPIOF_DRIVE_STRONG);
++			if (!status) {
++				set_bit(FLAG_STRONG, &desc->flags);
++			}
++		} else if (sysfs_streq(buf, "hiz")) {
++			status = gpiod_set_drive(desc, GPIOF_DRIVE_HIZ);
++			if (!status) {
++				set_bit(FLAG_HIZ, &desc->flags);
++			}
++		} else {
++			status = -EINVAL;
++		}
++	}
++
++	mutex_unlock(&sysfs_lock);
++	return status ? : size;
++}
++
++static const DEVICE_ATTR(drive, 0644,
++		gpio_drive_show, gpio_drive_store);
++
++
+ static umode_t gpio_is_visible(struct kobject *kobj, struct attribute *attr,
+ 			       int n)
+ {
+@@ -377,6 +454,7 @@ static struct attribute *gpio_attrs[] = {
+ 	&dev_attr_edge.attr,
+ 	&dev_attr_value.attr,
+ 	&dev_attr_active_low.attr,
++	&dev_attr_drive.attr,
+ 	NULL,
+ };
+ 
+diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
+index 4e4c3083ae56..1f49d1522474 100644
+--- a/drivers/gpio/gpiolib.c
++++ b/drivers/gpio/gpiolib.c
+@@ -1248,6 +1248,24 @@ int gpiod_is_active_low(const struct gpio_desc *desc)
+ }
+ EXPORT_SYMBOL_GPL(gpiod_is_active_low);
+ 
++int gpiod_set_drive(struct gpio_desc *desc, unsigned mode)
++{
++	unsigned long		flags;
++	struct gpio_chip	*chip;
++
++	chip = desc->chip;
++	if (!chip || !chip->set || !chip->set_drive)
++		goto fail;
++
++	might_sleep_if(chip->can_sleep);
++
++	return chip->set_drive(chip, gpio_chip_hwgpio(desc), mode);
++
++fail:
++	return -EINVAL;
++}
++EXPORT_SYMBOL_GPL(gpiod_set_drive);
++
+ /* I/O calls are only valid after configuration completed; the relevant
+  * "is this a valid GPIO" error checks should already have been done.
+  *
+diff --git a/drivers/gpio/gpiolib.h b/drivers/gpio/gpiolib.h
+index 98ab08c0aa2d..138faa1f6eff 100644
+--- a/drivers/gpio/gpiolib.h
++++ b/drivers/gpio/gpiolib.h
+@@ -96,6 +96,10 @@ struct gpio_desc {
+ #define FLAG_OPEN_SOURCE 8	/* Gpio is open source type */
+ #define FLAG_USED_AS_IRQ 9	/* GPIO is connected to an IRQ */
+ #define FLAG_IS_HOGGED	11	/* GPIO is hogged */
++#define FLAG_PULLUP	12	/* Gpio drive is resistive pullup */
++#define FLAG_PULLDOWN	13	/* Gpio drive is resistive pulldown */
++#define FLAG_STRONG	14	/* Gpio drive is strong (fast output) */
++#define FLAG_HIZ	15	/* Gpio drive is Hi-Z (input) */
+ 
+ 	/* Connection label */
+ 	const char		*label;
+diff --git a/include/asm-generic/gpio.h b/include/asm-generic/gpio.h
+index 40ec1433f05d..519e8d458878 100644
+--- a/include/asm-generic/gpio.h
++++ b/include/asm-generic/gpio.h
+@@ -76,6 +76,11 @@ static inline int gpio_set_debounce(unsigned gpio, unsigned debounce)
+ 	return gpiod_set_debounce(gpio_to_desc(gpio), debounce);
+ }
+ 
++static inline int gpio_set_drive(unsigned gpio, unsigned mode)
++{
++	return gpiod_set_drive(gpio_to_desc(gpio), mode);
++}
++
+ static inline int gpio_get_value_cansleep(unsigned gpio)
+ {
+ 	return gpiod_get_raw_value_cansleep(gpio_to_desc(gpio));
+diff --git a/include/linux/gpio.h b/include/linux/gpio.h
+index d12b5d566e4b..344e62d27700 100644
+--- a/include/linux/gpio.h
++++ b/include/linux/gpio.h
+@@ -30,6 +30,11 @@
+ #define GPIOF_EXPORT_DIR_FIXED	(GPIOF_EXPORT)
+ #define GPIOF_EXPORT_DIR_CHANGEABLE (GPIOF_EXPORT | GPIOF_EXPORT_CHANGEABLE)
+ 
++#define GPIOF_DRIVE_PULLUP	(1 << 7)
++#define GPIOF_DRIVE_PULLDOWN	(1 << 8)
++#define GPIOF_DRIVE_STRONG	(1 << 9)
++#define GPIOF_DRIVE_HIZ		(1 << 10)
++
+ /**
+  * struct gpio - a structure describing a GPIO with configuration
+  * @gpio:	the GPIO number
+@@ -148,6 +153,11 @@ static inline int gpio_set_debounce(unsigned gpio, unsigned debounce)
+ 	return -ENOSYS;
+ }
+ 
++static inline int gpio_set_drive(unsigned gpio, unsigned mode)
++{
++	return -ENOSYS;
++}
++
+ static inline int gpio_get_value(unsigned gpio)
+ {
+ 	/* GPIO can never have been requested or set as {in,out}put */
+diff --git a/include/linux/gpio/consumer.h b/include/linux/gpio/consumer.h
+index fb0fde686cb1..17f5f187699b 100644
+--- a/include/linux/gpio/consumer.h
++++ b/include/linux/gpio/consumer.h
+@@ -122,6 +122,8 @@ void gpiod_set_raw_array_value_cansleep(unsigned int array_size,
+ 
+ int gpiod_set_debounce(struct gpio_desc *desc, unsigned debounce);
+ 
++int gpiod_set_drive(struct gpio_desc *desc, unsigned mode);
++
+ int gpiod_is_active_low(const struct gpio_desc *desc);
+ int gpiod_cansleep(const struct gpio_desc *desc);
+ 
+@@ -376,6 +378,15 @@ static inline int gpiod_set_debounce(struct gpio_desc *desc, unsigned debounce)
+ 	return -ENOSYS;
+ }
+ 
++
++static inline int gpiod_set_drive(unsigned gpio, unsigned mode)
++{
++	/* GPIO can never have been requested */
++	WARN_ON(1);
++	return -ENOSYS;
++}
++
++
+ static inline int gpiod_is_active_low(const struct gpio_desc *desc)
+ {
+ 	/* GPIO can never have been requested */
+diff --git a/include/linux/gpio/driver.h b/include/linux/gpio/driver.h
+index d1baebf350d8..8e86f56a730a 100644
+--- a/include/linux/gpio/driver.h
++++ b/include/linux/gpio/driver.h
+@@ -114,6 +114,8 @@ struct gpio_chip {
+ 	int			(*set_debounce)(struct gpio_chip *chip,
+ 						unsigned offset,
+ 						unsigned debounce);
++	int			(*set_drive)(struct gpio_chip *chip,
++						unsigned offset, unsigned mode);
+ 
+ 	int			(*to_irq)(struct gpio_chip *chip,
+ 						unsigned offset);
+-- 
+2.5.0
+

+ 939 - 0
board/PSG/iot2000/linux-4.4-patches/0032-pca9685-PCA9685-PWM-and-GPIO-multi-function-device.patch

@@ -0,0 +1,939 @@
+From c4efe23b7f93a3a3220cf3654ef5a8ed50c41fe0 Mon Sep 17 00:00:00 2001
+From: Josef Ahmad <josef.ahmad@linux.intel.com>
+Date: Fri, 19 Feb 2016 07:18:27 -0800
+Subject: [PATCH 3/6] pca9685: PCA9685 PWM and GPIO multi-function device.
+
+There is also a driver for the same chip in drivers/pwm. This version
+has support for setting the output in GPIO mode in addition to the PWM
+mode.
+
+Upstream-status: Forward-ported from Intel IOT Develper Kit Quark BSP.
+                 Inappropriate to the upstream kernel, because the
+                 upstream kernel already uses a different (non-mfd)
+                 driver for handling the same chip, and doesn't need
+                 to be backwards compatible.
+
+Signed-off-by: Ismo Puustinen <ismo.puustinen@intel.com>
+Signed-off-by: Saul Wold <sgw@linux.intel.com>
+Signed-off-by: Bruce Ashfield <bruce.ashfield@windriver.com>
+---
+ drivers/mfd/Kconfig                   |  10 ++
+ drivers/mfd/Makefile                  |   2 +
+ drivers/mfd/pca9685-core.c            | 308 ++++++++++++++++++++++++++++++++++
+ drivers/mfd/pca9685-gpio.c            | 108 ++++++++++++
+ drivers/mfd/pca9685-pwm.c             | 262 +++++++++++++++++++++++++++++
+ drivers/mfd/pca9685.h                 | 110 ++++++++++++
+ include/linux/platform_data/pca9685.h |  51 ++++++
+ 7 files changed, 851 insertions(+)
+ create mode 100644 drivers/mfd/pca9685-core.c
+ create mode 100644 drivers/mfd/pca9685-gpio.c
+ create mode 100644 drivers/mfd/pca9685-pwm.c
+ create mode 100644 drivers/mfd/pca9685.h
+ create mode 100644 include/linux/platform_data/pca9685.h
+
+diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
+index 4d92df6ef9fe..059a22a30648 100644
+--- a/drivers/mfd/Kconfig
++++ b/drivers/mfd/Kconfig
+@@ -385,6 +385,16 @@ config MFD_INTEL_MSIC
+ 	  Passage) chip. This chip embeds audio, battery, GPIO, etc.
+ 	  devices used in Intel Medfield platforms.
+ 
++config MFD_PCA9685
++	tristate "NPX Semiconductors PCA9685 (PWM/GPIO) driver"
++	depends on GPIOLIB && I2C && PWM
++	select REGMAP_I2C
++	help
++	  NPX PCA9685 I2C-bus PWM controller with GPIO output interface support.
++	  The I2C-bus LED controller provides 16-channel, 12-bit PWM Fm+.
++	  Additionally, the driver allows the channels to be configured as GPIO
++	  interface (output only).
++
+ config MFD_IPAQ_MICRO
+ 	bool "Atmel Micro ASIC (iPAQ h3100/h3600/h3700) Support"
+ 	depends on SA1100_H3100 || SA1100_H3600
+diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
+index a8b76b81b467..f7434c027148 100644
+--- a/drivers/mfd/Makefile
++++ b/drivers/mfd/Makefile
+@@ -142,6 +142,8 @@ obj-$(CONFIG_MFD_DB8500_PRCMU)	+= db8500-prcmu.o
+ obj-$(CONFIG_AB8500_CORE)	+= ab8500-core.o ab8500-sysctrl.o
+ obj-$(CONFIG_MFD_TIMBERDALE)    += timberdale.o
+ obj-$(CONFIG_PMIC_ADP5520)	+= adp5520.o
++pca9685-objs			:= pca9685-core.o pca9685-gpio.o pca9685-pwm.o
++obj-$(CONFIG_MFD_PCA9685)	+= pca9685.o
+ obj-$(CONFIG_MFD_KEMPLD)	+= kempld-core.o
+ obj-$(CONFIG_MFD_INTEL_QUARK_I2C_GPIO)	+= intel_quark_i2c_gpio.o
+ obj-$(CONFIG_LPC_SCH)		+= lpc_sch.o
+diff --git a/drivers/mfd/pca9685-core.c b/drivers/mfd/pca9685-core.c
+new file mode 100644
+index 000000000000..3f63b6dfde5b
+--- /dev/null
++++ b/drivers/mfd/pca9685-core.c
+@@ -0,0 +1,308 @@
++/*
++ * Driver for NPX PCA9685 I2C-bus PWM controller with GPIO output interface
++ * support.
++ *
++ * Copyright(c) 2013-2015 Intel Corporation.
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms and conditions of the GNU General Public License,
++ * version 2, as published by the Free Software Foundation.
++ *
++ * This program is distributed in the hope 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.
++ *
++ * The I2C-bus LED controller provides 16-channel, 12-bit PWM Fm+.
++ * Additionally, the driver allows the channels to be configured as GPIO
++ * interface (output only).
++ */
++
++#include <linux/i2c.h>
++#include <linux/module.h>
++#include <linux/pwm.h>
++#include <linux/gpio.h>
++#include <linux/regmap.h>
++#include <linux/slab.h>
++#include <linux/delay.h>
++#include <linux/acpi.h>
++#include <linux/property.h>
++
++#include "pca9685.h"
++
++static unsigned int en_invrt;
++module_param(en_invrt, uint, 0);
++MODULE_PARM_DESC(en_invrt, "Enable output logic state inverted mode");
++
++static unsigned int en_open_dr;
++module_param(en_open_dr, uint, 0);
++MODULE_PARM_DESC(en_open_dr,
++	"The outputs are configured with an open-drain structure");
++
++static int gpio_base = -1; /*  requests dynamic ID allocation */
++module_param(gpio_base, int, 0);
++MODULE_PARM_DESC(gpio_base, "GPIO base number");
++
++static unsigned int pwm_period = PWM_PERIOD_DEF; /* PWM clock period */
++module_param(pwm_period, uint, 0);
++MODULE_PARM_DESC(pwm_period, "PWM clock period (nanoseconds)");
++
++static bool pca9685_register_volatile(struct device *dev, unsigned int reg)
++{
++	if (unlikely(reg == PCA9685_MODE1))
++		return true;
++	else
++		return false;
++}
++
++static struct regmap_config pca9685_regmap_i2c_config = {
++	.reg_bits     = 8,
++	.val_bits     = 8,
++	.max_register = PCA9685_NUMREGS,
++	.volatile_reg = pca9685_register_volatile,
++	.cache_type   = REGCACHE_RBTREE,
++};
++
++ssize_t pca9685_pwm_period_sysfs_show(struct device *dev,
++					  struct device_attribute *attr,
++					  char *buf)
++{
++	struct pca9685 *pca = dev_get_drvdata(dev);
++
++	return scnprintf(buf, PAGE_SIZE, "%u\n", pca->pwm_period);
++}
++
++ssize_t pca9685_pwm_period_sysfs_store(struct device *dev,
++					   struct device_attribute *attr,
++					   const char *buf, size_t count)
++{
++	struct pca9685 *pca = dev_get_drvdata(dev);
++	unsigned period_ns;
++	int ret;
++
++	sscanf(buf, "%u", &period_ns);
++
++	ret = pca9685_update_prescale(pca, period_ns, true);
++	if (ret)
++		return ret;
++
++	return count;
++}
++
++/* Sysfs attribute to allow PWM clock period adjustment at run-time
++ * NOTE: All active channels will switch off momentarily if the
++ * PWM clock period is changed
++ */
++static DEVICE_ATTR(pwm_period, S_IWUSR | S_IRUGO,
++		   pca9685_pwm_period_sysfs_show,
++		   pca9685_pwm_period_sysfs_store);
++
++u8 default_chan_mapping[] = {
++	PWM_CH_GPIO, PWM_CH_PWM,
++	PWM_CH_GPIO, PWM_CH_PWM,
++	PWM_CH_GPIO, PWM_CH_PWM,
++	PWM_CH_GPIO, PWM_CH_PWM,
++	PWM_CH_GPIO, PWM_CH_PWM,
++	PWM_CH_GPIO, PWM_CH_PWM,
++	PWM_CH_GPIO, PWM_CH_GPIO,
++	PWM_CH_GPIO, PWM_CH_GPIO,
++	PWM_CH_DISABLED /* ALL_LED disabled */
++};
++
++static int pca9685_probe(struct i2c_client *client,
++			 const struct i2c_device_id *id)
++{
++	struct pca9685_pdata *pdata;
++	struct pca9685 *pca;
++	int ret;
++	int mode2;
++
++	pca = devm_kzalloc(&client->dev, sizeof(*pca), GFP_KERNEL);
++	if (unlikely(!pca))
++		return -ENOMEM;
++
++	pdata = client->dev.platform_data;
++	if (likely(pdata)) {
++		memcpy(pca->chan_mapping, pdata->chan_mapping,
++				ARRAY_SIZE(pca->chan_mapping));
++		pca->gpio_base = pdata->gpio_base;
++		en_invrt       = pdata->en_invrt;
++		en_open_dr     = pdata->en_open_dr;
++	} else {
++		dev_warn(&client->dev,
++			 "Platform data not provided."
++			 "Using default or mod params configuration.\n");
++#if 1
++        /* hack for Galileo 2*/
++		pca->gpio_base = 64;
++		memcpy(pca->chan_mapping, default_chan_mapping,
++				ARRAY_SIZE(pca->chan_mapping));
++#else
++		pca->gpio_base = gpio_base;
++		memset(pca->chan_mapping, PWM_CH_UNDEFINED,
++				ARRAY_SIZE(pca->chan_mapping));
++#endif
++	}
++
++	if (unlikely(!i2c_check_functionality(client->adapter,
++					I2C_FUNC_I2C |
++					I2C_FUNC_SMBUS_BYTE_DATA))) {
++		dev_err(&client->dev,
++				"i2c adapter doesn't support required functionality\n");
++		return -EIO;
++	}
++
++	pca->regmap = devm_regmap_init_i2c(client, &pca9685_regmap_i2c_config);
++	if (IS_ERR(pca->regmap)) {
++		ret = PTR_ERR(pca->regmap);
++		dev_err(&client->dev, "Failed to initialize register map: %d\n",
++			ret);
++		return ret;
++	}
++
++	i2c_set_clientdata(client, pca);
++
++	/* registration of GPIO chip */
++	pca->gpio_chip.label     = "pca9685-gpio";
++	pca->gpio_chip.owner     = THIS_MODULE;
++	pca->gpio_chip.set       = pca9685_gpio_set;
++	pca->gpio_chip.get       = pca9685_gpio_get;
++	pca->gpio_chip.can_sleep = 1;
++	pca->gpio_chip.ngpio     = PCA9685_MAXCHAN;
++	pca->gpio_chip.base      = pca->gpio_base;
++	pca->gpio_chip.request   = pca9685_gpio_request;
++	pca->gpio_chip.free      = pca9685_gpio_free;
++
++	mutex_init(&pca->lock);
++
++	ret = gpiochip_add(&pca->gpio_chip);
++	if (unlikely(ret < 0)) {
++		dev_err(&client->dev, "Could not register gpiochip, %d\n", ret);
++		goto err;
++	}
++
++	/* configure initial PWM settings */
++	ret = pca9685_init_pwm_regs(pca, pwm_period);
++	if (ret) {
++		pr_err("Failed to initialize PWM registers\n");
++		goto err_gpiochip;
++	}
++
++	/* registration of PWM chip */
++
++	regmap_read(pca->regmap, PCA9685_MODE2, &mode2);
++
++	/* update mode2 register */
++	if (en_invrt)
++		mode2 |= MODE2_INVRT;
++	else
++		mode2 &= ~MODE2_INVRT;
++
++	if (en_open_dr)
++		mode2 &= ~MODE2_OUTDRV;
++	else
++		mode2 |= MODE2_OUTDRV;
++
++	regmap_write(pca->regmap, PCA9685_MODE2, mode2);
++
++	pca->pwm_chip.ops  = &pca9685_pwm_ops;
++	/* add an extra channel for ALL_LED */
++	pca->pwm_chip.npwm = PCA9685_MAXCHAN + 1;
++	pca->pwm_chip.dev  = &client->dev;
++	pca->pwm_chip.base = -1;
++
++	ret = pwmchip_add(&pca->pwm_chip);
++	if (unlikely(ret < 0)) {
++		dev_err(&client->dev, "pwmchip_add failed %d\n", ret);
++		goto err_gpiochip;
++	}
++
++	/* Also create a sysfs interface, providing a cmd line config option */
++	ret = sysfs_create_file(&client->dev.kobj, &dev_attr_pwm_period.attr);
++	if (unlikely(ret < 0)) {
++		dev_err(&client->dev, "sysfs_create_file failed %d\n", ret);
++		goto err_pwmchip;
++	}
++
++	return ret;
++
++err_pwmchip:
++	if (unlikely(pwmchip_remove(&pca->pwm_chip)))
++		dev_warn(&client->dev, "%s failed\n", "pwmchip_remove()");
++
++err_gpiochip:
++	gpiochip_remove(&pca->gpio_chip);
++err:
++	mutex_destroy(&pca->lock);
++
++	return ret;
++}
++
++static int pca9685_remove(struct i2c_client *client)
++{
++	struct pca9685 *pca = i2c_get_clientdata(client);
++	int ret;
++
++	regmap_update_bits(pca->regmap, PCA9685_MODE1, MODE1_SLEEP,
++			MODE1_SLEEP);
++
++	gpiochip_remove(&pca->gpio_chip);
++
++	sysfs_remove_file(&client->dev.kobj, &dev_attr_pwm_period.attr);
++
++	ret = pwmchip_remove(&pca->pwm_chip);
++	if (unlikely(ret))
++		dev_err(&client->dev, "%s failed, %d\n",
++				"pwmchip_remove()", ret);
++
++	mutex_destroy(&pca->lock);
++
++	return ret;
++}
++
++static const struct acpi_device_id pca9685_acpi_ids[] = {
++	{ "INT3492", 0 },
++	{ /* sentinel */ },
++};
++MODULE_DEVICE_TABLE(acpi, pca9685_acpi_ids);
++
++static const struct i2c_device_id pca9685_id[] = {
++	{ "pca9685", 0 },
++	{ /* sentinel */ },
++};
++MODULE_DEVICE_TABLE(i2c, pca9685_id);
++
++static struct i2c_driver pca9685_i2c_driver = {
++	.driver = {
++		.name  = "mfd-pca9685",
++		.owner = THIS_MODULE,
++		.acpi_match_table = ACPI_PTR(pca9685_acpi_ids),
++	},
++	.probe     = pca9685_probe,
++	.remove    = pca9685_remove,
++	.id_table  = pca9685_id,
++};
++
++static int __init pca9685_init(void)
++{
++	if (unlikely((pwm_period < PWM_PERIOD_MIN) ||
++			 (PWM_PERIOD_MAX < pwm_period))) {
++		pr_err("Invalid PWM period specified (valid range: %d-%d)\n",
++			   PWM_PERIOD_MIN, PWM_PERIOD_MAX);
++		return -EINVAL;
++	}
++
++	return i2c_add_driver(&pca9685_i2c_driver);
++}
++/* register after i2c postcore initcall */
++subsys_initcall(pca9685_init);
++
++static void __exit pca9685_exit(void)
++{
++	i2c_del_driver(&pca9685_i2c_driver);
++}
++module_exit(pca9685_exit);
++
++MODULE_AUTHOR("Wojciech Ziemba <wojciech.ziemba@emutex.com>");
++MODULE_DESCRIPTION("NPX Semiconductors PCA9685 (PWM/GPIO) driver");
++MODULE_LICENSE("GPL");
+diff --git a/drivers/mfd/pca9685-gpio.c b/drivers/mfd/pca9685-gpio.c
+new file mode 100644
+index 000000000000..ed348af7c86e
+--- /dev/null
++++ b/drivers/mfd/pca9685-gpio.c
+@@ -0,0 +1,108 @@
++/*
++ * Driver for NPX PCA9685 I2C-bus PWM controller with GPIO output interface
++ * support.
++ *
++ * Copyright(c) 2013-2015 Intel Corporation.
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms and conditions of the GNU General Public License,
++ * version 2, as published by the Free Software Foundation.
++ *
++ * This program is distributed in the hope 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.
++ *
++ * The I2C-bus LED controller provides 16-channel, 12-bit PWM Fm+.
++ * Additionally, the driver allows the channels to be configured as GPIO
++ * interface (output only).
++ */
++
++#include <linux/device.h>
++#include <linux/module.h>
++#include <linux/gpio.h>
++#include <linux/pwm.h>
++#include <linux/regmap.h>
++
++#include "pca9685.h"
++
++static inline struct pca9685 *gpio_to_pca(struct gpio_chip *gpio_chip)
++{
++	return container_of(gpio_chip, struct pca9685, gpio_chip);
++}
++
++static inline int is_gpio_allowed(const struct pca9685 *pca, unsigned channel)
++{
++	return pca->chan_mapping[channel] & PWM_CH_GPIO;
++}
++
++int pca9685_gpio_request(struct gpio_chip *chip, unsigned offset)
++{
++	struct pca9685 *pca;
++	struct pwm_device *pwm;
++	int ret = 0;
++	pca = gpio_to_pca(chip);
++
++	/* validate channel constrains */
++	if (!is_gpio_allowed(pca, offset))
++		return -ENODEV;
++
++	/* return busy if channel is already allocated for pwm */
++	pwm = &pca->pwm_chip.pwms[offset];
++	if (test_bit(PWMF_REQUESTED, &pwm->flags))
++		return -EBUSY;
++
++	/* clear the on counter */
++	regmap_write(pca->regmap, LED_N_ON_L(offset), 0x0);
++	regmap_write(pca->regmap, LED_N_ON_H(offset), 0x0);
++
++	/* clear the off counter */
++	regmap_write(pca->regmap, LED_N_OFF_L(offset), 0x0);
++	ret = regmap_write(pca->regmap, LED_N_OFF_H(offset), 0x0);
++
++	clear_sleep_bit(pca);
++
++	return ret;
++}
++
++void pca9685_gpio_free(struct gpio_chip *chip, unsigned offset)
++{
++	struct pca9685 *pca;
++
++	pca = gpio_to_pca(chip);
++
++	/* clear the on counter reg */
++	regmap_write(pca->regmap, LED_N_ON_L(offset), 0x0);
++	regmap_write(pca->regmap, LED_N_ON_H(offset), 0x0);
++
++	set_sleep_bit(pca);
++
++	return;
++}
++
++void pca9685_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
++{
++	struct pca9685 *pca;
++
++	pca = gpio_to_pca(chip);
++
++	/* set the full-on bit */
++	regmap_write(pca->regmap,  LED_N_ON_H(offset), (value << 4) & LED_FULL);
++
++	return;
++}
++
++int pca9685_gpio_get(struct gpio_chip *chip, unsigned offset)
++{
++	struct pca9685 *pca;
++	unsigned int val;
++
++	pca = gpio_to_pca(chip);
++
++	/* read the full-on bit */
++	regmap_read(pca->regmap, LED_N_ON_H(offset), &val);
++
++	return !!val;
++}
++
++MODULE_LICENSE("GPL");
+diff --git a/drivers/mfd/pca9685-pwm.c b/drivers/mfd/pca9685-pwm.c
+new file mode 100644
+index 000000000000..0c0526374d67
+--- /dev/null
++++ b/drivers/mfd/pca9685-pwm.c
+@@ -0,0 +1,262 @@
++/*
++ * Driver for NPX PCA9685 I2C-bus PWM controller with GPIO output interface
++ * support.
++ *
++ * Copyright(c) 2013-2015 Intel Corporation.
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms and conditions of the GNU General Public License,
++ * version 2, as published by the Free Software Foundation.
++ *
++ * This program is distributed in the hope 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.
++ *
++ * The I2C-bus LED controller provides 16-channel, 12-bit PWM Fm+.
++ * Additionally, the driver allows the channels to be configured as GPIO
++ * interface (output only).
++ */
++
++#include <linux/module.h>
++#include <linux/pwm.h>
++#include <linux/gpio.h>
++#include <linux/regmap.h>
++#include <linux/platform_device.h>
++#include <linux/delay.h>
++
++#include "pca9685.h"
++
++static inline struct pca9685 *pwm_to_pca(struct pwm_chip *pwm_chip)
++{
++	return container_of(pwm_chip, struct pca9685, pwm_chip);
++}
++
++static inline int period_ns_to_prescale(unsigned period_ns)
++{
++	return (DIV_ROUND_CLOSEST(OSC_CLK_MHZ * period_ns,
++			SAMPLE_RES * 1000)) - 1;
++}
++
++static inline int is_pwm_allowed(const struct pca9685 *pca, unsigned channel)
++{
++	return pca->chan_mapping[channel] & PWM_CH_PWM;
++}
++
++int pca9685_update_prescale(struct pca9685 *pca, unsigned period_ns,
++			    bool reconfigure_channels)
++{
++	int pre_scale, i;
++	struct pwm_device *pwm;
++	unsigned long long duty_scale;
++	unsigned long long new_duty_ns;
++
++	if (unlikely((period_ns < PWM_PERIOD_MIN) ||
++		     (PWM_PERIOD_MAX < period_ns))) {
++		pr_err("Invalid PWM period specified (valid range: %d-%d)\n",
++		       PWM_PERIOD_MIN, PWM_PERIOD_MAX);
++		return -EINVAL;
++	}
++
++	mutex_lock(&pca->lock);
++
++	/* update pre_scale to the closest period */
++	pre_scale = period_ns_to_prescale(period_ns);
++	/* ensure sleep-mode bit is set
++	 * NOTE: All active channels will switch off for at least 500 usecs
++	 */
++	regmap_update_bits(pca->regmap, PCA9685_MODE1,
++			   MODE1_SLEEP, MODE1_SLEEP);
++	regmap_write(pca->regmap, PCA9685_PRESCALE, pre_scale);
++	/* clear sleep mode flag if at least 1 channel is active */
++	if (pca->active_cnt > 0) {
++		regmap_update_bits(pca->regmap, PCA9685_MODE1,
++				   MODE1_SLEEP, 0x0);
++		usleep_range(MODE1_RESTART_DELAY, MODE1_RESTART_DELAY * 2);
++		regmap_update_bits(pca->regmap, PCA9685_MODE1,
++				   MODE1_RESTART, MODE1_RESTART);
++	}
++
++	if (reconfigure_channels) {
++		for (i = 0; i < pca->pwm_chip.npwm; i++) {
++			pwm = &pca->pwm_chip.pwms[i];
++			pwm->period = period_ns;
++			if (pwm->duty_cycle > 0) {
++				/* Scale the rise time to maintain duty cycle */
++				duty_scale = period_ns;
++				duty_scale *= 1000000;
++				do_div(duty_scale, pca->pwm_period);
++				new_duty_ns = duty_scale * pwm->duty_cycle;
++				do_div(new_duty_ns, 1000000);
++				/* Update the duty_cycle */
++				pwm_config(pwm, (int)new_duty_ns, pwm->period);
++			}
++		}
++	}
++	pca->pwm_period = period_ns;
++
++	mutex_unlock(&pca->lock);
++	return 0;
++}
++
++int pca9685_init_pwm_regs(struct pca9685 *pca, unsigned period_ns)
++{
++	int ret, chan;
++
++	/* set MODE1_SLEEP */
++	ret = regmap_update_bits(pca->regmap, PCA9685_MODE1,
++					MODE1_SLEEP, MODE1_SLEEP);
++	if (unlikely(ret < 0))
++		return ret;
++
++	/* configure the initial PWM clock period */
++	ret = pca9685_update_prescale(pca, period_ns, false);
++	if (unlikely(ret < 0))
++		return ret;
++
++	/* reset PWM channel registers to power-on default values */
++	for (chan = 0; chan < PCA9685_MAXCHAN; chan++) {
++		ret = regmap_write(pca->regmap, LED_N_ON_L(chan), 0);
++		if (unlikely(ret < 0))
++			return ret;
++		ret = regmap_write(pca->regmap, LED_N_ON_H(chan), 0);
++		if (unlikely(ret < 0))
++			return ret;
++		ret = regmap_write(pca->regmap, LED_N_OFF_L(chan), 0);
++		if (unlikely(ret < 0))
++			return ret;
++		ret = regmap_write(pca->regmap, LED_N_OFF_H(chan), LED_FULL);
++		if (unlikely(ret < 0))
++			return ret;
++	}
++	/* reset ALL_LED registers to power-on default values */
++	ret = regmap_write(pca->regmap, PCA9685_ALL_LED_ON_L, 0);
++	if (unlikely(ret < 0))
++		return ret;
++	ret = regmap_write(pca->regmap, PCA9685_ALL_LED_ON_H, 0);
++	if (unlikely(ret < 0))
++		return ret;
++	ret = regmap_write(pca->regmap, PCA9685_ALL_LED_OFF_L, 0);
++	if (unlikely(ret < 0))
++		return ret;
++	ret = regmap_write(pca->regmap, PCA9685_ALL_LED_OFF_H, LED_FULL);
++	if (unlikely(ret < 0))
++		return ret;
++
++	return ret;
++}
++
++static int pca9685_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,
++				int duty_ns, int period_ns)
++{
++	struct pca9685 *pca = pwm_to_pca(chip);
++	unsigned long long duty;
++	unsigned int	reg_on_h,
++			reg_off_l,
++			reg_off_h;
++	int full_off;
++
++	/* Changing PWM period for a single channel at run-time not allowed.
++	 * The PCA9685 PWM clock is shared across all PWM channels
++	 */
++	if (unlikely(period_ns != pwm->period))
++		return -EPERM;
++
++	if (unlikely(pwm->hwpwm >= PCA9685_MAXCHAN)) {
++		reg_on_h  = PCA9685_ALL_LED_ON_H;
++		reg_off_l = PCA9685_ALL_LED_OFF_L;
++		reg_off_h = PCA9685_ALL_LED_OFF_H;
++	} else {
++		reg_on_h  = LED_N_ON_H(pwm->hwpwm);
++		reg_off_l = LED_N_OFF_L(pwm->hwpwm);
++		reg_off_h = LED_N_OFF_H(pwm->hwpwm);
++	}
++
++	duty = SAMPLE_RES * (unsigned long long)duty_ns;
++	duty = DIV_ROUND_UP_ULL(duty, period_ns);
++
++	if (duty >= SAMPLE_RES) /* set the LED_FULL bit */
++		return regmap_write(pca->regmap, reg_on_h, LED_FULL);
++	else /* clear the LED_FULL bit */
++		regmap_write(pca->regmap, reg_on_h, 0x00);
++
++	full_off = !test_bit(PWMF_ENABLED, &pwm->flags) << 4;
++
++	regmap_write(pca->regmap, reg_off_l, (int)duty & 0xff);
++
++	return regmap_write(pca->regmap, reg_off_h,
++			((int)duty >> 8 | full_off) & 0x1f);
++}
++
++static int pca9685_pwm_enable(struct pwm_chip *chip, struct pwm_device *pwm)
++{
++	struct pca9685 *pca = pwm_to_pca(chip);
++	int ret;
++
++	unsigned int reg_off_h;
++
++	if (unlikely(pwm->hwpwm >= PCA9685_MAXCHAN))
++		reg_off_h = PCA9685_ALL_LED_OFF_H;
++	else
++		reg_off_h = LED_N_OFF_H(pwm->hwpwm);
++
++	/* clear the full-off bit */
++	ret = regmap_update_bits(pca->regmap, reg_off_h, LED_FULL, 0x0);
++
++	clear_sleep_bit(pca);
++
++	return ret;
++}
++
++static void pca9685_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm)
++{
++	struct pca9685 *pca = pwm_to_pca(chip);
++
++	unsigned int reg_off_h;
++
++	if (unlikely(pwm->hwpwm >= PCA9685_MAXCHAN))
++		reg_off_h = PCA9685_ALL_LED_OFF_H;
++	else
++		reg_off_h = LED_N_OFF_H(pwm->hwpwm);
++
++	/* set the LED_OFF counter. */
++	regmap_update_bits(pca->regmap, reg_off_h, LED_FULL, LED_FULL);
++
++	set_sleep_bit(pca);
++
++	return;
++}
++
++static int pca9685_pwm_request(struct pwm_chip *chip, struct pwm_device *pwm)
++{
++	struct pca9685 *pca;
++	struct gpio_chip *gpio_chip;
++	unsigned channel = pwm->hwpwm;
++
++	pca = pwm_to_pca(chip);
++
++	/* validate channel constrains */
++	if (!is_pwm_allowed(pca, channel))
++		return -ENODEV;
++
++	/* return busy if channel is already allocated for gpio */
++	gpio_chip = &pca->gpio_chip;
++
++	if ((channel < PCA9685_MAXCHAN) &&
++		(gpiochip_is_requested(gpio_chip, channel)))
++			return -EBUSY;
++
++	pwm->period = pca->pwm_period;
++
++	return 0;
++}
++
++const struct pwm_ops pca9685_pwm_ops = {
++	.enable  = pca9685_pwm_enable,
++	.disable = pca9685_pwm_disable,
++	.config  = pca9685_pwm_config,
++	.request = pca9685_pwm_request,
++	.owner   = THIS_MODULE,
++};
++
++MODULE_LICENSE("GPL");
+diff --git a/drivers/mfd/pca9685.h b/drivers/mfd/pca9685.h
+new file mode 100644
+index 000000000000..d678d30177f8
+--- /dev/null
++++ b/drivers/mfd/pca9685.h
+@@ -0,0 +1,110 @@
++/*
++ * Driver for NPX PCA9685 I2C-bus PWM controller with GPIO output interface
++ * support.
++ *
++ * Copyright(c) 2013-2015 Intel Corporation.
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms and conditions of the GNU General Public License,
++ * version 2, as published by the Free Software Foundation.
++ *
++ * This program is distributed in the hope 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.
++ *
++ * The I2C-bus LED controller provides 16-channel, 12-bit PWM Fm+.
++ * Additionally, the driver allows the channels to be configured as GPIO
++ * interface (output only).
++ */
++
++#ifndef __LINUX_MFD_PCA9685_H
++#define __LINUX_MFD_PCA9685_H
++
++#include <linux/mutex.h>
++#include <linux/gpio.h>
++#include <linux/pwm.h>
++#include <linux/platform_data/pca9685.h>
++
++#define PCA9685_MODE1		0x00
++#define PCA9685_MODE2		0x01
++#define PCA9685_SUBADDR1	0x02
++#define PCA9685_SUBADDR2	0x03
++#define PCA9685_SUBADDR3	0x04
++#define PCA9685_LEDX_ON_L	0x06
++#define PCA9685_LEDX_ON_H	0x07
++#define PCA9685_LEDX_OFF_L	0x08
++#define PCA9685_LEDX_OFF_H	0x09
++
++#define PCA9685_ALL_LED_ON_L	0xFA
++#define PCA9685_ALL_LED_ON_H	0xFB
++#define PCA9685_ALL_LED_OFF_L	0xFC
++#define PCA9685_ALL_LED_OFF_H	0xFD
++#define PCA9685_PRESCALE	0xFE
++
++#define PCA9685_NUMREGS		0xFF
++
++#define LED_FULL		(1 << 4)
++#define MODE1_SLEEP		(1 << 4)
++#define MODE1_RESTART		(1 << 7)
++
++#define MODE1_RESTART_DELAY	500
++
++#define LED_N_ON_H(N)	(PCA9685_LEDX_ON_H +  (4 * (N)))
++#define LED_N_ON_L(N)	(PCA9685_LEDX_ON_L +  (4 * (N)))
++#define LED_N_OFF_H(N)	(PCA9685_LEDX_OFF_H + (4 * (N)))
++#define LED_N_OFF_L(N)	(PCA9685_LEDX_OFF_L + (4 * (N)))
++
++#define OSC_CLK_MHZ		      25 /* 25 MHz */
++#define SAMPLE_RES		    4096 /* 12 bits */
++#define PWM_PERIOD_MIN		  666666 /* ~1525 Hz */
++#define PWM_PERIOD_MAX		41666666 /* 24 Hz */
++#define PWM_PERIOD_DEF		 5000000 /* default 200 Hz */
++
++struct pca9685 {
++	struct gpio_chip	gpio_chip;
++	struct pwm_chip		pwm_chip;
++	struct regmap		*regmap;
++	struct mutex		lock; /* mutual exclusion semaphore */
++	/* Array of channel allocation constrains */
++	/* add an extra channel for ALL_LED */
++	u8	chan_mapping[PCA9685_MAXCHAN + 1];
++	int	gpio_base;
++	int	active_cnt;
++	int	pwm_exported_cnt;
++	int	pwm_period;
++};
++
++extern const struct pwm_ops pca9685_pwm_ops;
++
++int  pca9685_gpio_request(struct gpio_chip *chip, unsigned offset);
++void pca9685_gpio_free(struct gpio_chip *chip, unsigned offset);
++void pca9685_gpio_set(struct gpio_chip *chip, unsigned offset, int value);
++int  pca9685_gpio_get(struct gpio_chip *chip, unsigned offset);
++
++int pca9685_init_pwm_regs(struct pca9685 *pca, unsigned period_ns);
++int pca9685_update_prescale(struct pca9685 *pca, unsigned period_ns,
++			    bool reconfigure_channels);
++
++static inline void set_sleep_bit(struct pca9685 *pca)
++{
++	mutex_lock(&pca->lock);
++	/* set sleep mode flag if no more active LED channel*/
++	if (--pca->active_cnt == 0)
++		regmap_update_bits(pca->regmap, PCA9685_MODE1, MODE1_SLEEP,
++				MODE1_SLEEP);
++	mutex_unlock(&pca->lock);
++}
++
++static inline void clear_sleep_bit(struct pca9685 *pca)
++{
++	mutex_lock(&pca->lock);
++	/* clear sleep mode flag if at least 1 LED channel is active */
++	if (pca->active_cnt++ == 0)
++		regmap_update_bits(pca->regmap, PCA9685_MODE1,
++				MODE1_SLEEP, 0x0);
++
++	mutex_unlock(&pca->lock);
++}
++
++#endif	/* __LINUX_MFD_PCA9685_H */
+diff --git a/include/linux/platform_data/pca9685.h b/include/linux/platform_data/pca9685.h
+new file mode 100644
+index 000000000000..dbb83f707fe7
+--- /dev/null
++++ b/include/linux/platform_data/pca9685.h
+@@ -0,0 +1,51 @@
++/*
++ * Platform data for pca9685 driver
++ *
++ * Copyright(c) 2013-2015 Intel Corporation.
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms and conditions of the GNU General Public License,
++ * version 2, as published by the Free Software Foundation.
++ *
++ * This program is distributed in the hope 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.
++ */
++
++#ifndef _PLAT_PCA9685_H_
++#define _PLAT_PCA9685_H_
++
++#define PCA9685_MAXCHAN	16
++#define MODE2_INVRT	(1 << 4)
++#define MODE2_OUTDRV	(1 << 2)
++
++/* PWM channel allocation flags */
++enum {
++	PWM_CH_DISABLED  = 0,
++	PWM_CH_PWM       = 1 << 0,
++	PWM_CH_GPIO      = 1 << 1,
++	/* allow PWM or GPIO */
++	PWM_CH_UNDEFINED = PWM_CH_PWM | PWM_CH_GPIO,
++};
++
++/**
++ * struct pca9685_pdata - Platform data for pca9685 driver
++ * @chan_mapping: Array of channel allocation constrains
++ * @gpio_base: GPIO base
++ * mode2_flags: mode2 register modification flags: INVRT and OUTDRV
++ **/
++struct pca9685_pdata {
++	/* Array of channel allocation constrains */
++	/* add an extra channel for ALL_LED */
++	u8	chan_mapping[PCA9685_MAXCHAN + 1];
++	/* GPIO base */
++	int	gpio_base;
++	/* mode2 flags */
++	u8	en_invrt:1,   /* enable output logic state inverted mode */
++		en_open_dr:1, /* enable if outputs are configured with an
++						 open-drain structure */
++		unused:6;
++};
++
++#endif /* _PLAT_PCA9685_H_ */
+-- 
+2.5.0
+

+ 36 - 0
board/PSG/iot2000/linux-4.4-patches/0033-spi-pxa2xx-fixed-ACPI-based-enumeration-of-SPI-devic.patch

@@ -0,0 +1,36 @@
+From cd83f4095b234652ae65321f35700f7e3441f0f9 Mon Sep 17 00:00:00 2001
+From: Ismo Puustinen <ismo.puustinen@intel.com>
+Date: Fri, 19 Feb 2016 07:18:28 -0800
+Subject: [PATCH 4/6] spi-pxa2xx: fixed ACPI-based enumeration of SPI devices.
+
+Slave devices were not enumerated by ACPI data because the ACPI handle
+for the spi-pxa2xx controller was NULL if it was itself enumerated by
+PCI.
+
+Original patch by Mika Westerberg <mika.westerberg@intel.com>.
+
+Upstream-status: Inappropriate, will be fixed with a bigger overhaul of
+                 SPI/ACPI interaction.
+
+Signed-off-by: Ismo Puustinen <ismo.puustinen@intel.com>
+Signed-off-by: Saul Wold <sgw@linux.intel.com>
+Signed-off-by: Bruce Ashfield <bruce.ashfield@windriver.com>
+---
+ drivers/spi/spi-pxa2xx-pci.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/spi/spi-pxa2xx-pci.c b/drivers/spi/spi-pxa2xx-pci.c
+index d19d7f28aecb..562ffc1282bc 100644
+--- a/drivers/spi/spi-pxa2xx-pci.c
++++ b/drivers/spi/spi-pxa2xx-pci.c
+@@ -169,6 +169,7 @@ static int pxa2xx_spi_pci_probe(struct pci_dev *dev,
+ 	memset(&pi, 0, sizeof(pi));
+ 	pi.parent = &dev->dev;
+ 	pi.name = "pxa2xx-spi";
++	pi.fwnode = dev->dev.fwnode;
+ 	pi.id = ssp->port_id;
+ 	pi.data = &spi_pdata;
+ 	pi.size_data = sizeof(spi_pdata);
+-- 
+2.5.0
+

+ 1218 - 0
board/PSG/iot2000/linux-4.4-patches/0034-acpi-added-a-custom-DSDT-file.patch

@@ -0,0 +1,1218 @@
+From 4086f8c349569926fd8fbe967ec24bdeabc79f95 Mon Sep 17 00:00:00 2001
+From: Ismo Puustinen <ismo.puustinen@intel.com>
+Date: Fri, 19 Feb 2016 07:18:25 -0800
+Subject: [PATCH 1/6] acpi: added a custom DSDT file.
+
+The file has fixed GPIO IRQ assignment and moved SPI devices to be under
+the SPI bus in the ACPI definitions as assumed by ACPI version 5.
+
+Upstream-status: Inappropriate, custom firmware
+
+Signed-off-by: Ismo Puustinen <ismo.puustinen@intel.com>
+Signed-off-by: Saul Wold <sgw@linux.intel.com>
+Signed-off-by: Bruce Ashfield <bruce.ashfield@windriver.com>
+---
+ include/DSDT.hex | 1191 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 1191 insertions(+)
+ create mode 100644 include/DSDT.hex
+
+diff --git a/include/DSDT.hex b/include/DSDT.hex
+new file mode 100644
+index 000000000000..b1e296048090
+--- /dev/null
++++ b/include/DSDT.hex
+@@ -0,0 +1,1191 @@
++/*
++ * Copyright (c) 2013 Intel Corporation. All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions are met:
++ *
++ * 1. Redistributions of source code must retain the above copyright notice, this
++ * list of conditions and the following disclaimer.
++ *
++ * 2. Redistributions in binary form must reproduce the above copyright notice,
++ * this list of conditions and the following disclaimer in the documentation
++ * and/or other materials provided with the distribution.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
++ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
++ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
++ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
++ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
++ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
++ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
++ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++/*
++ * 
++ * Intel ACPI Component Architecture
++ * ASL+ Optimizing Compiler version 20150515-64
++ * Copyright (c) 2000 - 2015 Intel Corporation
++ * 
++ * Compilation of "dsdt-fixed-spi.dsl" - Wed Sep 23 12:49:37 2015
++ * 
++ * C source code output
++ * AML code block contains 0x23F5 bytes
++ *
++ */
++unsigned char AmlCode[] =
++{
++    0x44,0x53,0x44,0x54,0xF5,0x23,0x00,0x00,  /* 00000000    "DSDT.#.." */
++    0x01,0xD3,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000008    "..INTEL " */
++    0x51,0x75,0x61,0x72,0x6B,0x4E,0x63,0x53,  /* 00000010    "QuarkNcS" */
++    0x03,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C,  /* 00000018    "....INTL" */
++    0x15,0x05,0x15,0x20,0x08,0x47,0x50,0x49,  /* 00000020    "... .GPI" */
++    0x43,0x00,0x5B,0x80,0x44,0x42,0x47,0x30,  /* 00000028    "C.[.DBG0" */
++    0x01,0x0A,0x80,0x01,0x5B,0x81,0x0B,0x44,  /* 00000030    "....[..D" */
++    0x42,0x47,0x30,0x01,0x49,0x4F,0x38,0x30,  /* 00000038    "BG0.IO80" */
++    0x08,0x5B,0x80,0x41,0x43,0x4D,0x53,0x01,  /* 00000040    ".[.ACMS." */
++    0x0A,0x72,0x0A,0x02,0x5B,0x81,0x10,0x41,  /* 00000048    ".r..[..A" */
++    0x43,0x4D,0x53,0x01,0x49,0x4E,0x44,0x58,  /* 00000050    "CMS.INDX" */
++    0x08,0x44,0x41,0x54,0x41,0x08,0x5B,0x80,  /* 00000058    ".DATA.[." */
++    0x4D,0x4E,0x56,0x53,0x00,0x0C,0x90,0x8C,  /* 00000060    "MNVS...." */
++    0x1C,0x0F,0x0B,0x00,0x02,0x5B,0x81,0x45,  /* 00000068    ".....[.E" */
++    0x07,0x4D,0x4E,0x56,0x53,0x01,0x4F,0x53,  /* 00000070    ".MNVS.OS" */
++    0x54,0x50,0x20,0x43,0x46,0x47,0x44,0x20,  /* 00000078    "TP CFGD " */
++    0x48,0x50,0x45,0x41,0x20,0x50,0x31,0x42,  /* 00000080    "HPEA P1B" */
++    0x42,0x20,0x50,0x42,0x41,0x42,0x20,0x47,  /* 00000088    "B PBAB G" */
++    0x50,0x30,0x42,0x20,0x47,0x50,0x41,0x42,  /* 00000090    "P0B GPAB" */
++    0x20,0x53,0x4D,0x42,0x42,0x20,0x4E,0x52,  /* 00000098    " SMBB NR" */
++    0x56,0x31,0x20,0x57,0x44,0x54,0x42,0x20,  /* 000000A0    "V1 WDTB " */
++    0x48,0x50,0x54,0x42,0x20,0x48,0x50,0x54,  /* 000000A8    "HPTB HPT" */
++    0x53,0x20,0x50,0x45,0x58,0x42,0x20,0x50,  /* 000000B0    "S PEXB P" */
++    0x45,0x58,0x53,0x20,0x52,0x43,0x42,0x42,  /* 000000B8    "EXS RCBB" */
++    0x20,0x52,0x43,0x42,0x53,0x20,0x41,0x50,  /* 000000C0    " RCBS AP" */
++    0x43,0x42,0x20,0x41,0x50,0x43,0x53,0x20,  /* 000000C8    "CB APCS " */
++    0x54,0x50,0x4D,0x50,0x20,0x44,0x42,0x47,  /* 000000D0    "TPMP DBG" */
++    0x50,0x20,0x50,0x54,0x59,0x50,0x20,0x41,  /* 000000D8    "P PTYP A" */
++    0x4C,0x54,0x53,0x20,0x5B,0x80,0x47,0x50,  /* 000000E0    "LTS [.GP" */
++    0x45,0x42,0x01,0x0B,0x00,0x11,0x0A,0x40,  /* 000000E8    "EB.....@" */
++    0x5B,0x81,0x13,0x47,0x50,0x45,0x42,0x00,  /* 000000F0    "[..GPEB." */
++    0x00,0x40,0x08,0x53,0x4D,0x49,0x45,0x20,  /* 000000F8    ".@.SMIE " */
++    0x53,0x4D,0x49,0x53,0x20,0x10,0x12,0x5F,  /* 00000100    "SMIS .._" */
++    0x50,0x52,0x5F,0x5B,0x83,0x0B,0x43,0x50,  /* 00000108    "PR_[..CP" */
++    0x55,0x30,0x01,0x10,0x10,0x00,0x00,0x06,  /* 00000110    "U0......" */
++    0x08,0x5F,0x53,0x30,0x5F,0x12,0x06,0x04,  /* 00000118    "._S0_..." */
++    0x00,0x00,0x00,0x00,0x08,0x5F,0x53,0x33,  /* 00000120    "....._S3" */
++    0x5F,0x12,0x07,0x04,0x0A,0x05,0x00,0x00,  /* 00000128    "_......." */
++    0x00,0x08,0x5F,0x53,0x34,0x5F,0x12,0x07,  /* 00000130    ".._S4_.." */
++    0x04,0x0A,0x06,0x00,0x00,0x00,0x08,0x5F,  /* 00000138    "......._" */
++    0x53,0x35,0x5F,0x12,0x07,0x04,0x0A,0x07,  /* 00000140    "S5_....." */
++    0x00,0x00,0x00,0x10,0x4E,0x12,0x5F,0x47,  /* 00000148    "....N._G" */
++    0x50,0x45,0x14,0x13,0x5F,0x4C,0x30,0x44,  /* 00000150    "PE.._L0D" */
++    0x00,0x86,0x5C,0x2E,0x5F,0x53,0x42,0x5F,  /* 00000158    "..\._SB_" */
++    0x53,0x4C,0x50,0x42,0x0A,0x02,0x14,0x13,  /* 00000160    "SLPB...." */
++    0x5F,0x4C,0x30,0x45,0x00,0x86,0x5C,0x2E,  /* 00000168    "_L0E..\." */
++    0x5F,0x53,0x42,0x5F,0x50,0x57,0x52,0x42,  /* 00000170    "_SB_PWRB" */
++    0x0A,0x02,0x14,0x4D,0x0C,0x5F,0x4C,0x30,  /* 00000178    "...M._L0" */
++    0x46,0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,  /* 00000180    "F..\/._S" */
++    0x42,0x5F,0x50,0x43,0x49,0x30,0x53,0x44,  /* 00000188    "B_PCI0SD" */
++    0x49,0x4F,0x0A,0x02,0x86,0x5C,0x2F,0x03,  /* 00000190    "IO...\/." */
++    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 00000198    "_SB_PCI0" */
++    0x55,0x52,0x54,0x30,0x0A,0x02,0x86,0x5C,  /* 000001A0    "URT0...\" */
++    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 000001A8    "/._SB_PC" */
++    0x49,0x30,0x55,0x53,0x42,0x44,0x0A,0x02,  /* 000001B0    "I0USBD.." */
++    0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 000001B8    ".\/._SB_" */
++    0x50,0x43,0x49,0x30,0x45,0x48,0x43,0x49,  /* 000001C0    "PCI0EHCI" */
++    0x0A,0x02,0x86,0x5C,0x2F,0x03,0x5F,0x53,  /* 000001C8    "...\/._S" */
++    0x42,0x5F,0x50,0x43,0x49,0x30,0x4F,0x48,  /* 000001D0    "B_PCI0OH" */
++    0x43,0x49,0x0A,0x02,0x86,0x5C,0x2F,0x03,  /* 000001D8    "CI...\/." */
++    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 000001E0    "_SB_PCI0" */
++    0x55,0x52,0x54,0x31,0x0A,0x02,0x86,0x5C,  /* 000001E8    "URT1...\" */
++    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 000001F0    "/._SB_PC" */
++    0x49,0x30,0x45,0x4E,0x54,0x30,0x0A,0x02,  /* 000001F8    "I0ENT0.." */
++    0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 00000200    ".\/._SB_" */
++    0x50,0x43,0x49,0x30,0x45,0x4E,0x54,0x31,  /* 00000208    "PCI0ENT1" */
++    0x0A,0x02,0x86,0x5C,0x2F,0x03,0x5F,0x53,  /* 00000210    "...\/._S" */
++    0x42,0x5F,0x50,0x43,0x49,0x30,0x53,0x50,  /* 00000218    "B_PCI0SP" */
++    0x49,0x30,0x0A,0x02,0x86,0x5C,0x2F,0x03,  /* 00000220    "I0...\/." */
++    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 00000228    "_SB_PCI0" */
++    0x53,0x50,0x49,0x31,0x0A,0x02,0x86,0x5C,  /* 00000230    "SPI1...\" */
++    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00000238    "/._SB_PC" */
++    0x49,0x30,0x47,0x49,0x50,0x30,0x0A,0x02,  /* 00000240    "I0GIP0.." */
++    0x14,0x06,0x5F,0x4C,0x31,0x30,0x00,0x14,  /* 00000248    ".._L10.." */
++    0x2A,0x5F,0x4C,0x31,0x31,0x00,0x86,0x5C,  /* 00000250    "*_L11..\" */
++    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00000258    "/._SB_PC" */
++    0x49,0x30,0x50,0x45,0x58,0x30,0x0A,0x02,  /* 00000260    "I0PEX0.." */
++    0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 00000268    ".\/._SB_" */
++    0x50,0x43,0x49,0x30,0x50,0x45,0x58,0x31,  /* 00000270    "PCI0PEX1" */
++    0x0A,0x02,0x5B,0x82,0x23,0x2E,0x5F,0x53,  /* 00000278    "..[.#._S" */
++    0x42,0x5F,0x53,0x4C,0x50,0x42,0x08,0x5F,  /* 00000280    "B_SLPB._" */
++    0x48,0x49,0x44,0x0C,0x41,0xD0,0x0C,0x0E,  /* 00000288    "HID.A..." */
++    0x14,0x0E,0x5F,0x50,0x52,0x57,0x00,0xA4,  /* 00000290    ".._PRW.." */
++    0x12,0x06,0x02,0x0A,0x0D,0x0A,0x04,0x5B,  /* 00000298    ".......[" */
++    0x82,0x23,0x2E,0x5F,0x53,0x42,0x5F,0x50,  /* 000002A0    ".#._SB_P" */
++    0x57,0x52,0x42,0x08,0x5F,0x48,0x49,0x44,  /* 000002A8    "WRB._HID" */
++    0x0C,0x41,0xD0,0x0C,0x0C,0x14,0x0E,0x5F,  /* 000002B0    ".A....._" */
++    0x50,0x52,0x57,0x00,0xA4,0x12,0x06,0x02,  /* 000002B8    "PRW....." */
++    0x0A,0x0E,0x0A,0x04,0x14,0x08,0x5F,0x57,  /* 000002C0    "......_W" */
++    0x41,0x4B,0x09,0xA4,0x00,0x14,0x20,0x5F,  /* 000002C8    "AK.... _" */
++    0x50,0x54,0x53,0x01,0xA0,0x19,0x93,0x68,  /* 000002D0    "PTS....h" */
++    0x0A,0x03,0x70,0xFF,0x53,0x4D,0x49,0x53,  /* 000002D8    "..p.SMIS" */
++    0x70,0x53,0x4D,0x49,0x45,0x60,0x7D,0x60,  /* 000002E0    "pSMIE`}`" */
++    0x0A,0x04,0x53,0x4D,0x49,0x45,0x14,0x0C,  /* 000002E8    "..SMIE.." */
++    0x5F,0x50,0x49,0x43,0x01,0x70,0x68,0x47,  /* 000002F0    "_PIC.phG" */
++    0x50,0x49,0x43,0x10,0x89,0x0F,0x02,0x5F,  /* 000002F8    "PIC...._" */
++    0x53,0x42,0x5F,0x5B,0x82,0x80,0x44,0x01,  /* 00000300    "SB_[..D." */
++    0x50,0x43,0x49,0x30,0x08,0x5F,0x48,0x49,  /* 00000308    "PCI0._HI" */
++    0x44,0x0C,0x41,0xD0,0x0A,0x08,0x08,0x5F,  /* 00000310    "D.A...._" */
++    0x43,0x49,0x44,0x0C,0x41,0xD0,0x0A,0x03,  /* 00000318    "CID.A..." */
++    0x08,0x5F,0x41,0x44,0x52,0x00,0x14,0x4D,  /* 00000320    "._ADR..M" */
++    0x10,0x5F,0x49,0x4E,0x49,0x00,0x70,0x0A,  /* 00000328    "._INI.p." */
++    0xF0,0x4F,0x53,0x54,0x50,0xA0,0x4E,0x0F,  /* 00000330    ".OSTP.N." */
++    0x5B,0x12,0x5F,0x4F,0x53,0x49,0x60,0xA0,  /* 00000338    "[._OSI`." */
++    0x19,0x5F,0x4F,0x53,0x49,0x0D,0x57,0x69,  /* 00000340    "._OSI.Wi" */
++    0x6E,0x64,0x6F,0x77,0x73,0x20,0x32,0x30,  /* 00000348    "ndows 20" */
++    0x30,0x31,0x00,0x70,0x01,0x4F,0x53,0x54,  /* 00000350    "01.p.OST" */
++    0x50,0xA0,0x1E,0x5F,0x4F,0x53,0x49,0x0D,  /* 00000358    "P.._OSI." */
++    0x57,0x69,0x6E,0x64,0x6F,0x77,0x73,0x20,  /* 00000360    "Windows " */
++    0x32,0x30,0x30,0x31,0x20,0x53,0x50,0x31,  /* 00000368    "2001 SP1" */
++    0x00,0x70,0x0A,0x02,0x4F,0x53,0x54,0x50,  /* 00000370    ".p..OSTP" */
++    0xA0,0x1E,0x5F,0x4F,0x53,0x49,0x0D,0x57,  /* 00000378    ".._OSI.W" */
++    0x69,0x6E,0x64,0x6F,0x77,0x73,0x20,0x32,  /* 00000380    "indows 2" */
++    0x30,0x30,0x31,0x20,0x53,0x50,0x32,0x00,  /* 00000388    "001 SP2." */
++    0x70,0x0A,0x04,0x4F,0x53,0x54,0x50,0xA0,  /* 00000390    "p..OSTP." */
++    0x1C,0x5F,0x4F,0x53,0x49,0x0D,0x57,0x69,  /* 00000398    "._OSI.Wi" */
++    0x6E,0x64,0x6F,0x77,0x73,0x20,0x32,0x30,  /* 000003A0    "ndows 20" */
++    0x30,0x31,0x2E,0x31,0x00,0x70,0x0A,0x08,  /* 000003A8    "01.1.p.." */
++    0x4F,0x53,0x54,0x50,0xA0,0x1A,0x5F,0x4F,  /* 000003B0    "OSTP.._O" */
++    0x53,0x49,0x0D,0x57,0x69,0x6E,0x64,0x6F,  /* 000003B8    "SI.Windo" */
++    0x77,0x73,0x20,0x32,0x30,0x30,0x36,0x00,  /* 000003C0    "ws 2006." */
++    0x70,0x0A,0x10,0x4F,0x53,0x54,0x50,0xA0,  /* 000003C8    "p..OSTP." */
++    0x1A,0x5F,0x4F,0x53,0x49,0x0D,0x57,0x69,  /* 000003D0    "._OSI.Wi" */
++    0x6E,0x64,0x6F,0x77,0x73,0x20,0x32,0x30,  /* 000003D8    "ndows 20" */
++    0x30,0x39,0x00,0x70,0x0A,0x11,0x4F,0x53,  /* 000003E0    "09.p..OS" */
++    0x54,0x50,0xA0,0x1A,0x5F,0x4F,0x53,0x49,  /* 000003E8    "TP.._OSI" */
++    0x0D,0x57,0x69,0x6E,0x64,0x6F,0x77,0x73,  /* 000003F0    ".Windows" */
++    0x20,0x32,0x30,0x31,0x32,0x00,0x70,0x0A,  /* 000003F8    " 2012.p." */
++    0x12,0x4F,0x53,0x54,0x50,0xA0,0x1A,0x5F,  /* 00000400    ".OSTP.._" */
++    0x4F,0x53,0x49,0x0D,0x57,0x69,0x6E,0x64,  /* 00000408    "OSI.Wind" */
++    0x6F,0x77,0x73,0x20,0x32,0x30,0x31,0x33,  /* 00000410    "ows 2013" */
++    0x00,0x70,0x0A,0x13,0x4F,0x53,0x54,0x50,  /* 00000418    ".p..OSTP" */
++    0xA0,0x13,0x5F,0x4F,0x53,0x49,0x0D,0x4C,  /* 00000420    ".._OSI.L" */
++    0x69,0x6E,0x75,0x78,0x00,0x70,0x0A,0xF0,  /* 00000428    "inux.p.." */
++    0x4F,0x53,0x54,0x50,0x08,0x50,0x42,0x52,  /* 00000430    "OSTP.PBR" */
++    0x53,0x11,0x42,0x07,0x0A,0x6E,0x88,0x0D,  /* 00000438    "S.B..n.." */
++    0x00,0x02,0x0C,0x00,0x00,0x00,0x00,0x00,  /* 00000440    "........" */
++    0x1F,0x00,0x00,0x00,0x20,0x00,0x88,0x0D,  /* 00000448    ".... ..." */
++    0x00,0x01,0x0C,0x03,0x00,0x00,0x00,0x00,  /* 00000450    "........" */
++    0xF7,0x0C,0x00,0x00,0xF8,0x0C,0x47,0x01,  /* 00000458    "......G." */
++    0xF8,0x0C,0xF8,0x0C,0x01,0x08,0x88,0x0D,  /* 00000460    "........" */
++    0x00,0x01,0x0C,0x03,0x00,0x00,0x00,0x0D,  /* 00000468    "........" */
++    0xFF,0xFF,0x00,0x00,0x00,0xF3,0x87,0x17,  /* 00000470    "........" */
++    0x00,0x00,0x0C,0x03,0x00,0x00,0x00,0x00,  /* 00000478    "........" */
++    0x00,0x00,0x0A,0x00,0xFF,0xFF,0x0B,0x00,  /* 00000480    "........" */
++    0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,  /* 00000488    "........" */
++    0x87,0x17,0x00,0x00,0x0C,0x03,0x00,0x00,  /* 00000490    "........" */
++    0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,  /* 00000498    "........" */
++    0xBF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000004A0    "........" */
++    0xC0,0xFE,0x79,0x00,0x14,0x4F,0x04,0x5F,  /* 000004A8    "..y..O._" */
++    0x43,0x52,0x53,0x00,0x8A,0x50,0x42,0x52,  /* 000004B0    "CRS..PBR" */
++    0x53,0x0A,0x5C,0x4D,0x4D,0x49,0x4E,0x8A,  /* 000004B8    "S.\MMIN." */
++    0x50,0x42,0x52,0x53,0x0A,0x60,0x4D,0x4D,  /* 000004C0    "PBRS.`MM" */
++    0x41,0x58,0x8A,0x50,0x42,0x52,0x53,0x0A,  /* 000004C8    "AX.PBRS." */
++    0x68,0x4D,0x4C,0x45,0x4E,0x7B,0x4D,0x4E,  /* 000004D0    "hMLEN{MN" */
++    0x52,0x44,0x0A,0x03,0x0A,0x08,0x0C,0x00,  /* 000004D8    "RD......" */
++    0xF0,0xFF,0xFF,0x4D,0x4D,0x49,0x4E,0x72,  /* 000004E0    "...MMINr" */
++    0x74,0x4D,0x4D,0x41,0x58,0x4D,0x4D,0x49,  /* 000004E8    "tMMAXMMI" */
++    0x4E,0x00,0x01,0x4D,0x4C,0x45,0x4E,0xA4,  /* 000004F0    "N..MLEN." */
++    0x50,0x42,0x52,0x53,0x5B,0x80,0x4D,0x4E,  /* 000004F8    "PBRS[.MN" */
++    0x52,0x5F,0x02,0x0A,0xD0,0x0A,0x10,0x5B,  /* 00000500    "R_.....[" */
++    0x81,0x10,0x4D,0x4E,0x52,0x5F,0x03,0x4D,  /* 00000508    "..MNR_.M" */
++    0x43,0x52,0x5F,0x20,0x4D,0x44,0x52,0x5F,  /* 00000510    "CR_ MDR_" */
++    0x20,0x14,0x25,0x4D,0x4E,0x52,0x44,0x0A,  /* 00000518    " .%MNRD." */
++    0x7D,0x79,0x68,0x0A,0x10,0x00,0x79,0x69,  /* 00000520    "}yh...yi" */
++    0x0A,0x08,0x00,0x60,0x7D,0x60,0x0C,0xF0,  /* 00000528    "...`}`.." */
++    0x00,0x00,0x10,0x60,0x70,0x60,0x4D,0x43,  /* 00000530    "...`p`MC" */
++    0x52,0x5F,0xA4,0x4D,0x44,0x52,0x5F,0x14,  /* 00000538    "R_.MDR_." */
++    0x26,0x4D,0x4E,0x57,0x52,0x0B,0x70,0x6A,  /* 00000540    "&MNWR.pj" */
++    0x4D,0x44,0x52,0x5F,0x7D,0x79,0x68,0x0A,  /* 00000548    "MDR_}yh." */
++    0x10,0x00,0x79,0x69,0x0A,0x08,0x00,0x60,  /* 00000550    "..yi...`" */
++    0x7D,0x60,0x0C,0xF0,0x00,0x00,0x11,0x60,  /* 00000558    "}`.....`" */
++    0x70,0x60,0x4D,0x43,0x52,0x5F,0x14,0x49,  /* 00000560    "p`MCR_.I" */
++    0x1C,0x5F,0x50,0x52,0x54,0x00,0xA0,0x47,  /* 00000568    "._PRT..G" */
++    0x11,0x93,0x47,0x50,0x49,0x43,0x00,0xA4,  /* 00000570    "..GPIC.." */
++    0x12,0x4D,0x10,0x0D,0x12,0x13,0x04,0x0C,  /* 00000578    ".M......" */
++    0xFF,0xFF,0x14,0x00,0x00,0x5E,0x2E,0x4C,  /* 00000580    ".....^.L" */
++    0x50,0x43,0x5F,0x4C,0x4E,0x4B,0x41,0x00,  /* 00000588    "PC_LNKA." */
++    0x12,0x13,0x04,0x0C,0xFF,0xFF,0x14,0x00,  /* 00000590    "........" */
++    0x01,0x5E,0x2E,0x4C,0x50,0x43,0x5F,0x4C,  /* 00000598    ".^.LPC_L" */
++    0x4E,0x4B,0x42,0x00,0x12,0x14,0x04,0x0C,  /* 000005A0    "NKB....." */
++    0xFF,0xFF,0x14,0x00,0x0A,0x02,0x5E,0x2E,  /* 000005A8    "......^." */
++    0x4C,0x50,0x43,0x5F,0x4C,0x4E,0x4B,0x43,  /* 000005B0    "LPC_LNKC" */
++    0x00,0x12,0x14,0x04,0x0C,0xFF,0xFF,0x14,  /* 000005B8    "........" */
++    0x00,0x0A,0x03,0x5E,0x2E,0x4C,0x50,0x43,  /* 000005C0    "...^.LPC" */
++    0x5F,0x4C,0x4E,0x4B,0x44,0x00,0x12,0x13,  /* 000005C8    "_LNKD..." */
++    0x04,0x0C,0xFF,0xFF,0x15,0x00,0x00,0x5E,  /* 000005D0    ".......^" */
++    0x2E,0x4C,0x50,0x43,0x5F,0x4C,0x4E,0x4B,  /* 000005D8    ".LPC_LNK" */
++    0x41,0x00,0x12,0x13,0x04,0x0C,0xFF,0xFF,  /* 000005E0    "A......." */
++    0x15,0x00,0x01,0x5E,0x2E,0x4C,0x50,0x43,  /* 000005E8    "...^.LPC" */
++    0x5F,0x4C,0x4E,0x4B,0x42,0x00,0x12,0x14,  /* 000005F0    "_LNKB..." */
++    0x04,0x0C,0xFF,0xFF,0x15,0x00,0x0A,0x02,  /* 000005F8    "........" */
++    0x5E,0x2E,0x4C,0x50,0x43,0x5F,0x4C,0x4E,  /* 00000600    "^.LPC_LN" */
++    0x4B,0x43,0x00,0x12,0x14,0x04,0x0C,0xFF,  /* 00000608    "KC......" */
++    0xFF,0x15,0x00,0x0A,0x03,0x5E,0x2E,0x4C,  /* 00000610    ".....^.L" */
++    0x50,0x43,0x5F,0x4C,0x4E,0x4B,0x44,0x00,  /* 00000618    "PC_LNKD." */
++    0x12,0x13,0x04,0x0C,0xFF,0xFF,0x17,0x00,  /* 00000620    "........" */
++    0x00,0x5E,0x2E,0x4C,0x50,0x43,0x5F,0x4C,  /* 00000628    ".^.LPC_L" */
++    0x4E,0x4B,0x45,0x00,0x12,0x13,0x04,0x0C,  /* 00000630    "NKE....." */
++    0xFF,0xFF,0x17,0x00,0x01,0x5E,0x2E,0x4C,  /* 00000638    ".....^.L" */
++    0x50,0x43,0x5F,0x4C,0x4E,0x4B,0x46,0x00,  /* 00000640    "PC_LNKF." */
++    0x12,0x14,0x04,0x0C,0xFF,0xFF,0x17,0x00,  /* 00000648    "........" */
++    0x0A,0x02,0x5E,0x2E,0x4C,0x50,0x43,0x5F,  /* 00000650    "..^.LPC_" */
++    0x4C,0x4E,0x4B,0x47,0x00,0x12,0x14,0x04,  /* 00000658    "LNKG...." */
++    0x0C,0xFF,0xFF,0x17,0x00,0x0A,0x03,0x5E,  /* 00000660    ".......^" */
++    0x2E,0x4C,0x50,0x43,0x5F,0x4C,0x4E,0x4B,  /* 00000668    ".LPC_LNK" */
++    0x48,0x00,0x12,0x13,0x04,0x0C,0xFF,0xFF,  /* 00000670    "H......." */
++    0x1F,0x00,0x00,0x5E,0x2E,0x4C,0x50,0x43,  /* 00000678    "...^.LPC" */
++    0x5F,0x4C,0x4E,0x4B,0x41,0x00,0xA1,0x49,  /* 00000680    "_LNKA..I" */
++    0x0A,0xA4,0x12,0x45,0x0A,0x0D,0x12,0x0B,  /* 00000688    "...E...." */
++    0x04,0x0C,0xFF,0xFF,0x14,0x00,0x00,0x00,  /* 00000690    "........" */
++    0x0A,0x10,0x12,0x0B,0x04,0x0C,0xFF,0xFF,  /* 00000698    "........" */
++    0x14,0x00,0x01,0x00,0x0A,0x11,0x12,0x0C,  /* 000006A0    "........" */
++    0x04,0x0C,0xFF,0xFF,0x14,0x00,0x0A,0x02,  /* 000006A8    "........" */
++    0x00,0x0A,0x12,0x12,0x0C,0x04,0x0C,0xFF,  /* 000006B0    "........" */
++    0xFF,0x14,0x00,0x0A,0x03,0x00,0x0A,0x13,  /* 000006B8    "........" */
++    0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x15,0x00,  /* 000006C0    "........" */
++    0x00,0x00,0x0A,0x10,0x12,0x0B,0x04,0x0C,  /* 000006C8    "........" */
++    0xFF,0xFF,0x15,0x00,0x01,0x00,0x0A,0x11,  /* 000006D0    "........" */
++    0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x15,0x00,  /* 000006D8    "........" */
++    0x0A,0x02,0x00,0x0A,0x12,0x12,0x0C,0x04,  /* 000006E0    "........" */
++    0x0C,0xFF,0xFF,0x15,0x00,0x0A,0x03,0x00,  /* 000006E8    "........" */
++    0x0A,0x13,0x12,0x0B,0x04,0x0C,0xFF,0xFF,  /* 000006F0    "........" */
++    0x17,0x00,0x00,0x00,0x0A,0x14,0x12,0x0B,  /* 000006F8    "........" */
++    0x04,0x0C,0xFF,0xFF,0x17,0x00,0x01,0x00,  /* 00000700    "........" */
++    0x0A,0x15,0x12,0x0C,0x04,0x0C,0xFF,0xFF,  /* 00000708    "........" */
++    0x17,0x00,0x0A,0x02,0x00,0x0A,0x16,0x12,  /* 00000710    "........" */
++    0x0C,0x04,0x0C,0xFF,0xFF,0x17,0x00,0x0A,  /* 00000718    "........" */
++    0x03,0x00,0x0A,0x17,0x12,0x0B,0x04,0x0C,  /* 00000720    "........" */
++    0xFF,0xFF,0x1F,0x00,0x00,0x00,0x0A,0x10,  /* 00000728    "........" */
++    0x5B,0x82,0x45,0x0B,0x49,0x4F,0x43,0x4D,  /* 00000730    "[.E.IOCM" */
++    0x08,0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,  /* 00000738    "._HID.A." */
++    0x0C,0x02,0x08,0x43,0x52,0x53,0x5F,0x11,  /* 00000740    "...CRS_." */
++    0x42,0x04,0x0A,0x3E,0x86,0x09,0x00,0x00,  /* 00000748    "B..>...." */
++    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000750    "........" */
++    0x86,0x09,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000758    "........" */
++    0x00,0x00,0x00,0x00,0x86,0x09,0x00,0x00,  /* 00000760    "........" */
++    0x00,0x00,0x0C,0x00,0x00,0x00,0x02,0x00,  /* 00000768    "........" */
++    0x86,0x09,0x00,0x00,0x00,0x00,0x0E,0x00,  /* 00000770    "........" */
++    0x00,0x00,0x02,0x00,0x86,0x09,0x00,0x00,  /* 00000778    "........" */
++    0x00,0x00,0x80,0xFF,0x00,0x00,0x80,0x00,  /* 00000780    "........" */
++    0x79,0x00,0x14,0x4C,0x05,0x5F,0x43,0x52,  /* 00000788    "y..L._CR" */
++    0x53,0x00,0x8A,0x43,0x52,0x53,0x5F,0x0A,  /* 00000790    "S..CRS_." */
++    0x04,0x4D,0x42,0x52,0x30,0x70,0x50,0x45,  /* 00000798    ".MBR0pPE" */
++    0x58,0x42,0x4D,0x42,0x52,0x30,0x8A,0x43,  /* 000007A0    "XBMBR0.C" */
++    0x52,0x53,0x5F,0x0A,0x08,0x4D,0x42,0x52,  /* 000007A8    "RS_..MBR" */
++    0x31,0x70,0x50,0x45,0x58,0x53,0x4D,0x42,  /* 000007B0    "1pPEXSMB" */
++    0x52,0x31,0x8A,0x43,0x52,0x53,0x5F,0x0A,  /* 000007B8    "R1.CRS_." */
++    0x10,0x4D,0x42,0x52,0x32,0x70,0x52,0x43,  /* 000007C0    ".MBR2pRC" */
++    0x42,0x42,0x4D,0x42,0x52,0x32,0x8A,0x43,  /* 000007C8    "BBMBR2.C" */
++    0x52,0x53,0x5F,0x0A,0x14,0x4D,0x42,0x52,  /* 000007D0    "RS_..MBR" */
++    0x33,0x70,0x52,0x43,0x42,0x53,0x4D,0x42,  /* 000007D8    "3pRCBSMB" */
++    0x52,0x33,0xA4,0x43,0x52,0x53,0x5F,0x5B,  /* 000007E0    "R3.CRS_[" */
++    0x82,0x45,0x10,0x50,0x45,0x58,0x30,0x08,  /* 000007E8    ".E.PEX0." */
++    0x5F,0x41,0x44,0x52,0x0C,0x00,0x00,0x17,  /* 000007F0    "_ADR...." */
++    0x00,0x08,0x5F,0x50,0x52,0x57,0x12,0x06,  /* 000007F8    ".._PRW.." */
++    0x02,0x0A,0x11,0x0A,0x03,0x5B,0x80,0x50,  /* 00000800    ".....[.P" */
++    0x45,0x53,0x30,0x02,0x0A,0x40,0x0A,0xA0,  /* 00000808    "ES0..@.." */
++    0x5B,0x81,0x48,0x04,0x50,0x45,0x53,0x30,  /* 00000810    "[.H.PES0" */
++    0x00,0x00,0x40,0x0D,0x41,0x42,0x50,0x30,  /* 00000818    "..@.ABP0" */
++    0x01,0x00,0x02,0x50,0x44,0x43,0x30,0x01,  /* 00000820    "...PDC0." */
++    0x00,0x02,0x50,0x44,0x53,0x30,0x01,0x00,  /* 00000828    "..PDS0.." */
++    0x01,0x4C,0x53,0x43,0x30,0x01,0x00,0x27,  /* 00000830    ".LSC0..'" */
++    0x00,0x10,0x50,0x4D,0x53,0x30,0x01,0x00,  /* 00000838    "..PMS0.." */
++    0x4F,0x3A,0x00,0x1E,0x48,0x50,0x45,0x30,  /* 00000840    "O:..HPE0" */
++    0x01,0x50,0x43,0x45,0x30,0x01,0x00,0x1E,  /* 00000848    ".PCE0..." */
++    0x48,0x50,0x53,0x30,0x01,0x50,0x43,0x53,  /* 00000850    "HPS0.PCS" */
++    0x30,0x01,0x14,0x43,0x09,0x5F,0x50,0x52,  /* 00000858    "0..C._PR" */
++    0x54,0x00,0xA0,0x4B,0x05,0x93,0x47,0x50,  /* 00000860    "T..K..GP" */
++    0x49,0x43,0x00,0xA4,0x12,0x41,0x05,0x04,  /* 00000868    "IC...A.." */
++    0x12,0x12,0x04,0x0B,0xFF,0xFF,0x00,0x5E,  /* 00000870    ".......^" */
++    0x5E,0x2E,0x4C,0x50,0x43,0x5F,0x4C,0x4E,  /* 00000878    "^.LPC_LN" */
++    0x4B,0x45,0x00,0x12,0x12,0x04,0x0B,0xFF,  /* 00000880    "KE......" */
++    0xFF,0x01,0x5E,0x5E,0x2E,0x4C,0x50,0x43,  /* 00000888    "..^^.LPC" */
++    0x5F,0x4C,0x4E,0x4B,0x46,0x00,0x12,0x13,  /* 00000890    "_LNKF..." */
++    0x04,0x0B,0xFF,0xFF,0x0A,0x02,0x5E,0x5E,  /* 00000898    "......^^" */
++    0x2E,0x4C,0x50,0x43,0x5F,0x4C,0x4E,0x4B,  /* 000008A0    ".LPC_LNK" */
++    0x47,0x00,0x12,0x13,0x04,0x0B,0xFF,0xFF,  /* 000008A8    "G......." */
++    0x0A,0x03,0x5E,0x5E,0x2E,0x4C,0x50,0x43,  /* 000008B0    "..^^.LPC" */
++    0x5F,0x4C,0x4E,0x4B,0x48,0x00,0xA1,0x2F,  /* 000008B8    "_LNKH../" */
++    0xA4,0x12,0x2C,0x04,0x12,0x09,0x04,0x0B,  /* 000008C0    "..,....." */
++    0xFF,0xFF,0x00,0x00,0x0A,0x14,0x12,0x09,  /* 000008C8    "........" */
++    0x04,0x0B,0xFF,0xFF,0x01,0x00,0x0A,0x15,  /* 000008D0    "........" */
++    0x12,0x0A,0x04,0x0B,0xFF,0xFF,0x0A,0x02,  /* 000008D8    "........" */
++    0x00,0x0A,0x16,0x12,0x0A,0x04,0x0B,0xFF,  /* 000008E0    "........" */
++    0xFF,0x0A,0x03,0x00,0x0A,0x17,0x5B,0x82,  /* 000008E8    "......[." */
++    0x45,0x10,0x50,0x45,0x58,0x31,0x08,0x5F,  /* 000008F0    "E.PEX1._" */
++    0x41,0x44,0x52,0x0C,0x01,0x00,0x17,0x00,  /* 000008F8    "ADR....." */
++    0x08,0x5F,0x50,0x52,0x57,0x12,0x06,0x02,  /* 00000900    "._PRW..." */
++    0x0A,0x11,0x0A,0x03,0x5B,0x80,0x50,0x45,  /* 00000908    "....[.PE" */
++    0x53,0x31,0x02,0x0A,0x40,0x0A,0xA0,0x5B,  /* 00000910    "S1..@..[" */
++    0x81,0x48,0x04,0x50,0x45,0x53,0x31,0x00,  /* 00000918    ".H.PES1." */
++    0x00,0x40,0x0D,0x41,0x42,0x50,0x31,0x01,  /* 00000920    ".@.ABP1." */
++    0x00,0x02,0x50,0x44,0x43,0x31,0x01,0x00,  /* 00000928    "..PDC1.." */
++    0x02,0x50,0x44,0x53,0x31,0x01,0x00,0x01,  /* 00000930    ".PDS1..." */
++    0x4C,0x53,0x43,0x31,0x01,0x00,0x27,0x00,  /* 00000938    "LSC1..'." */
++    0x10,0x50,0x4D,0x53,0x31,0x01,0x00,0x4F,  /* 00000940    ".PMS1..O" */
++    0x3A,0x00,0x1E,0x48,0x50,0x45,0x31,0x01,  /* 00000948    ":..HPE1." */
++    0x50,0x43,0x45,0x31,0x01,0x00,0x1E,0x48,  /* 00000950    "PCE1...H" */
++    0x50,0x53,0x31,0x01,0x50,0x43,0x53,0x31,  /* 00000958    "PS1.PCS1" */
++    0x01,0x14,0x43,0x09,0x5F,0x50,0x52,0x54,  /* 00000960    "..C._PRT" */
++    0x00,0xA0,0x4B,0x05,0x93,0x47,0x50,0x49,  /* 00000968    "..K..GPI" */
++    0x43,0x00,0xA4,0x12,0x41,0x05,0x04,0x12,  /* 00000970    "C...A..." */
++    0x12,0x04,0x0B,0xFF,0xFF,0x00,0x5E,0x5E,  /* 00000978    "......^^" */
++    0x2E,0x4C,0x50,0x43,0x5F,0x4C,0x4E,0x4B,  /* 00000980    ".LPC_LNK" */
++    0x46,0x00,0x12,0x12,0x04,0x0B,0xFF,0xFF,  /* 00000988    "F......." */
++    0x01,0x5E,0x5E,0x2E,0x4C,0x50,0x43,0x5F,  /* 00000990    ".^^.LPC_" */
++    0x4C,0x4E,0x4B,0x47,0x00,0x12,0x13,0x04,  /* 00000998    "LNKG...." */
++    0x0B,0xFF,0xFF,0x0A,0x02,0x5E,0x5E,0x2E,  /* 000009A0    ".....^^." */
++    0x4C,0x50,0x43,0x5F,0x4C,0x4E,0x4B,0x48,  /* 000009A8    "LPC_LNKH" */
++    0x00,0x12,0x13,0x04,0x0B,0xFF,0xFF,0x0A,  /* 000009B0    "........" */
++    0x03,0x5E,0x5E,0x2E,0x4C,0x50,0x43,0x5F,  /* 000009B8    ".^^.LPC_" */
++    0x4C,0x4E,0x4B,0x45,0x00,0xA1,0x2F,0xA4,  /* 000009C0    "LNKE../." */
++    0x12,0x2C,0x04,0x12,0x09,0x04,0x0B,0xFF,  /* 000009C8    ".,......" */
++    0xFF,0x00,0x00,0x0A,0x15,0x12,0x09,0x04,  /* 000009D0    "........" */
++    0x0B,0xFF,0xFF,0x01,0x00,0x0A,0x16,0x12,  /* 000009D8    "........" */
++    0x0A,0x04,0x0B,0xFF,0xFF,0x0A,0x02,0x00,  /* 000009E0    "........" */
++    0x0A,0x17,0x12,0x0A,0x04,0x0B,0xFF,0xFF,  /* 000009E8    "........" */
++    0x0A,0x03,0x00,0x0A,0x14,0x5B,0x82,0x22,  /* 000009F0    ".....[."" */
++    0x53,0x44,0x49,0x4F,0x08,0x5F,0x41,0x44,  /* 000009F8    "SDIO._AD" */
++    0x52,0x0C,0x00,0x00,0x14,0x00,0x08,0x5F,  /* 00000A00    "R......_" */
++    0x53,0x54,0x41,0x0A,0x0F,0x08,0x5F,0x50,  /* 00000A08    "STA..._P" */
++    0x52,0x57,0x12,0x06,0x02,0x0A,0x0F,0x0A,  /* 00000A10    "RW......" */
++    0x03,0x5B,0x82,0x22,0x55,0x52,0x54,0x30,  /* 00000A18    ".[."URT0" */
++    0x08,0x5F,0x41,0x44,0x52,0x0C,0x01,0x00,  /* 00000A20    "._ADR..." */
++    0x14,0x00,0x08,0x5F,0x53,0x54,0x41,0x0A,  /* 00000A28    "..._STA." */
++    0x0F,0x08,0x5F,0x50,0x52,0x57,0x12,0x06,  /* 00000A30    ".._PRW.." */
++    0x02,0x0A,0x0F,0x0A,0x03,0x5B,0x82,0x22,  /* 00000A38    ".....[."" */
++    0x55,0x53,0x42,0x44,0x08,0x5F,0x41,0x44,  /* 00000A40    "USBD._AD" */
++    0x52,0x0C,0x02,0x00,0x14,0x00,0x08,0x5F,  /* 00000A48    "R......_" */
++    0x53,0x54,0x41,0x0A,0x0F,0x08,0x5F,0x50,  /* 00000A50    "STA..._P" */
++    0x52,0x57,0x12,0x06,0x02,0x0A,0x0F,0x0A,  /* 00000A58    "RW......" */
++    0x03,0x5B,0x82,0x22,0x45,0x48,0x43,0x49,  /* 00000A60    ".[."EHCI" */
++    0x08,0x5F,0x41,0x44,0x52,0x0C,0x03,0x00,  /* 00000A68    "._ADR..." */
++    0x14,0x00,0x08,0x5F,0x53,0x54,0x41,0x0A,  /* 00000A70    "..._STA." */
++    0x0F,0x08,0x5F,0x50,0x52,0x57,0x12,0x06,  /* 00000A78    ".._PRW.." */
++    0x02,0x0A,0x0F,0x0A,0x03,0x5B,0x82,0x22,  /* 00000A80    ".....[."" */
++    0x4F,0x48,0x43,0x49,0x08,0x5F,0x41,0x44,  /* 00000A88    "OHCI._AD" */
++    0x52,0x0C,0x04,0x00,0x14,0x00,0x08,0x5F,  /* 00000A90    "R......_" */
++    0x53,0x54,0x41,0x0A,0x0F,0x08,0x5F,0x50,  /* 00000A98    "STA..._P" */
++    0x52,0x57,0x12,0x06,0x02,0x0A,0x0F,0x0A,  /* 00000AA0    "RW......" */
++    0x03,0x5B,0x82,0x22,0x55,0x52,0x54,0x31,  /* 00000AA8    ".[."URT1" */
++    0x08,0x5F,0x41,0x44,0x52,0x0C,0x05,0x00,  /* 00000AB0    "._ADR..." */
++    0x14,0x00,0x08,0x5F,0x53,0x54,0x41,0x0A,  /* 00000AB8    "..._STA." */
++    0x0F,0x08,0x5F,0x50,0x52,0x57,0x12,0x06,  /* 00000AC0    ".._PRW.." */
++    0x02,0x0A,0x0F,0x0A,0x03,0x5B,0x82,0x22,  /* 00000AC8    ".....[."" */
++    0x45,0x4E,0x54,0x30,0x08,0x5F,0x41,0x44,  /* 00000AD0    "ENT0._AD" */
++    0x52,0x0C,0x06,0x00,0x14,0x00,0x08,0x5F,  /* 00000AD8    "R......_" */
++    0x53,0x54,0x41,0x0A,0x0F,0x08,0x5F,0x50,  /* 00000AE0    "STA..._P" */
++    0x52,0x57,0x12,0x06,0x02,0x0A,0x0F,0x0A,  /* 00000AE8    "RW......" */
++    0x03,0x5B,0x82,0x22,0x45,0x4E,0x54,0x31,  /* 00000AF0    ".[."ENT1" */
++    0x08,0x5F,0x41,0x44,0x52,0x0C,0x07,0x00,  /* 00000AF8    "._ADR..." */
++    0x14,0x00,0x08,0x5F,0x53,0x54,0x41,0x0A,  /* 00000B00    "..._STA." */
++    0x0F,0x08,0x5F,0x50,0x52,0x57,0x12,0x06,  /* 00000B08    ".._PRW.." */
++    0x02,0x0A,0x0F,0x0A,0x03,0x5B,0x82,0x4A,  /* 00000B10    ".....[.J" */
++    0x16,0x53,0x50,0x49,0x30,0x08,0x5F,0x41,  /* 00000B18    ".SPI0._A" */
++    0x44,0x52,0x0C,0x00,0x00,0x15,0x00,0x08,  /* 00000B20    "DR......" */
++    0x5F,0x53,0x54,0x41,0x0A,0x0F,0x08,0x5F,  /* 00000B28    "_STA..._" */
++    0x50,0x52,0x57,0x12,0x06,0x02,0x0A,0x0F,  /* 00000B30    "PRW....." */
++    0x0A,0x03,0x5B,0x82,0x42,0x0A,0x41,0x44,  /* 00000B38    "..[.B.AD" */
++    0x43,0x31,0x08,0x5F,0x48,0x49,0x44,0x0D,  /* 00000B40    "C1._HID." */
++    0x49,0x4E,0x54,0x33,0x34,0x39,0x34,0x00,  /* 00000B48    "INT3494." */
++    0x08,0x5F,0x43,0x49,0x44,0x0D,0x49,0x4E,  /* 00000B50    "._CID.IN" */
++    0x54,0x33,0x34,0x39,0x34,0x00,0x08,0x52,  /* 00000B58    "T3494..R" */
++    0x42,0x55,0x46,0x11,0x48,0x05,0x0A,0x54,  /* 00000B60    "BUF.H..T" */
++    0x8E,0x22,0x00,0x01,0x00,0x02,0x02,0x00,  /* 00000B68    "."......" */
++    0x00,0x01,0x09,0x00,0x00,0x09,0x3D,0x00,  /* 00000B70    "......=." */
++    0x10,0x00,0x01,0x00,0x00,0x5C,0x5F,0x53,  /* 00000B78    ".....\_S" */
++    0x42,0x5F,0x2E,0x50,0x43,0x49,0x30,0x2E,  /* 00000B80    "B_.PCI0." */
++    0x53,0x50,0x49,0x30,0x00,0x8C,0x2A,0x00,  /* 00000B88    "SPI0..*." */
++    0x01,0x01,0x01,0x00,0x08,0x00,0x00,0x00,  /* 00000B90    "........" */
++    0x00,0x00,0x00,0x17,0x00,0x00,0x19,0x00,  /* 00000B98    "........" */
++    0x2D,0x00,0x00,0x00,0x08,0x00,0x5C,0x5F,  /* 00000BA0    "-.....\_" */
++    0x53,0x42,0x2E,0x50,0x43,0x49,0x30,0x2E,  /* 00000BA8    "SB.PCI0." */
++    0x47,0x49,0x50,0x30,0x2E,0x47,0x50,0x4F,  /* 00000BB0    "GIP0.GPO" */
++    0x5F,0x00,0x79,0x00,0x14,0x0B,0x5F,0x43,  /* 00000BB8    "_.y..._C" */
++    0x52,0x53,0x00,0xA4,0x52,0x42,0x55,0x46,  /* 00000BC0    "RS..RBUF" */
++    0x14,0x15,0x5F,0x53,0x54,0x41,0x00,0xA0,  /* 00000BC8    ".._STA.." */
++    0x0B,0x92,0x93,0x50,0x54,0x59,0x50,0x0A,  /* 00000BD0    "...PTYP." */
++    0x06,0xA4,0x00,0xA4,0x0A,0x0F,0x5B,0x82,  /* 00000BD8    "......[." */
++    0x41,0x0A,0x41,0x44,0x43,0x32,0x08,0x5F,  /* 00000BE0    "A.ADC2._" */
++    0x48,0x49,0x44,0x0D,0x49,0x4E,0x54,0x33,  /* 00000BE8    "HID.INT3" */
++    0x34,0x39,0x35,0x00,0x08,0x5F,0x43,0x49,  /* 00000BF0    "495.._CI" */
++    0x44,0x0D,0x49,0x4E,0x54,0x33,0x34,0x39,  /* 00000BF8    "D.INT349" */
++    0x35,0x00,0x08,0x52,0x42,0x55,0x46,0x11,  /* 00000C00    "5..RBUF." */
++    0x47,0x05,0x0A,0x53,0x8E,0x21,0x00,0x01,  /* 00000C08    "G..S.!.." */
++    0x00,0x02,0x02,0x00,0x00,0x01,0x09,0x00,  /* 00000C10    "........" */
++    0x78,0x51,0xFE,0x00,0x10,0x01,0x01,0x00,  /* 00000C18    "xQ......" */
++    0x00,0x5C,0x5F,0x53,0x42,0x2E,0x50,0x43,  /* 00000C20    ".\_SB.PC" */
++    0x49,0x30,0x2E,0x53,0x50,0x49,0x30,0x00,  /* 00000C28    "I0.SPI0." */
++    0x8C,0x2A,0x00,0x01,0x01,0x01,0x00,0x08,  /* 00000C30    ".*......" */
++    0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x00,  /* 00000C38    "........" */
++    0x00,0x19,0x00,0x2D,0x00,0x00,0x00,0x08,  /* 00000C40    "...-...." */
++    0x00,0x5C,0x5F,0x53,0x42,0x2E,0x50,0x43,  /* 00000C48    ".\_SB.PC" */
++    0x49,0x30,0x2E,0x47,0x49,0x50,0x30,0x2E,  /* 00000C50    "I0.GIP0." */
++    0x47,0x50,0x4F,0x5F,0x00,0x79,0x00,0x14,  /* 00000C58    "GPO_.y.." */
++    0x0B,0x5F,0x43,0x52,0x53,0x00,0xA4,0x52,  /* 00000C60    "._CRS..R" */
++    0x42,0x55,0x46,0x14,0x15,0x5F,0x53,0x54,  /* 00000C68    "BUF.._ST" */
++    0x41,0x00,0xA0,0x0B,0x92,0x93,0x50,0x54,  /* 00000C70    "A.....PT" */
++    0x59,0x50,0x0A,0x08,0xA4,0x00,0xA4,0x0A,  /* 00000C78    "YP......" */
++    0x0F,0x5B,0x82,0x22,0x53,0x50,0x49,0x31,  /* 00000C80    ".[."SPI1" */
++    0x08,0x5F,0x41,0x44,0x52,0x0C,0x01,0x00,  /* 00000C88    "._ADR..." */
++    0x15,0x00,0x08,0x5F,0x53,0x54,0x41,0x0A,  /* 00000C90    "..._STA." */
++    0x0F,0x08,0x5F,0x50,0x52,0x57,0x12,0x06,  /* 00000C98    ".._PRW.." */
++    0x02,0x0A,0x0F,0x0A,0x03,0x5B,0x82,0x43,  /* 00000CA0    ".....[.C" */
++    0x06,0x47,0x49,0x50,0x30,0x08,0x5F,0x41,  /* 00000CA8    ".GIP0._A" */
++    0x44,0x52,0x0C,0x02,0x00,0x15,0x00,0x08,  /* 00000CB0    "DR......" */
++    0x5F,0x53,0x54,0x41,0x0A,0x0F,0x08,0x5F,  /* 00000CB8    "_STA..._" */
++    0x50,0x52,0x57,0x12,0x06,0x02,0x0A,0x0F,  /* 00000CC0    "PRW....." */
++    0x0A,0x03,0x5B,0x82,0x1E,0x47,0x50,0x4F,  /* 00000CC8    "..[..GPO" */
++    0x5F,0x08,0x5F,0x41,0x44,0x52,0x00,0x08,  /* 00000CD0    "_._ADR.." */
++    0x5F,0x53,0x54,0x41,0x0A,0x0F,0x08,0x5F,  /* 00000CD8    "_STA..._" */
++    0x50,0x52,0x57,0x12,0x06,0x02,0x0A,0x0F,  /* 00000CE0    "PRW....." */
++    0x0A,0x03,0x5B,0x82,0x1E,0x49,0x32,0x43,  /* 00000CE8    "..[..I2C" */
++    0x5F,0x08,0x5F,0x41,0x44,0x52,0x01,0x08,  /* 00000CF0    "_._ADR.." */
++    0x5F,0x53,0x54,0x41,0x0A,0x0F,0x08,0x5F,  /* 00000CF8    "_STA..._" */
++    0x50,0x52,0x57,0x12,0x06,0x02,0x0A,0x0F,  /* 00000D00    "PRW....." */
++    0x0A,0x03,0x5B,0x82,0x4C,0x9D,0x4C,0x50,  /* 00000D08    "..[.L.LP" */
++    0x43,0x5F,0x08,0x5F,0x41,0x44,0x52,0x0C,  /* 00000D10    "C_._ADR." */
++    0x00,0x00,0x1F,0x00,0x5B,0x80,0x50,0x52,  /* 00000D18    "....[.PR" */
++    0x52,0x30,0x02,0x0A,0x60,0x0A,0x08,0x5B,  /* 00000D20    "R0..`..[" */
++    0x81,0x2E,0x50,0x52,0x52,0x30,0x00,0x50,  /* 00000D28    "..PRR0.P" */
++    0x49,0x52,0x41,0x08,0x50,0x49,0x52,0x42,  /* 00000D30    "IRA.PIRB" */
++    0x08,0x50,0x49,0x52,0x43,0x08,0x50,0x49,  /* 00000D38    ".PIRC.PI" */
++    0x52,0x44,0x08,0x50,0x49,0x52,0x45,0x08,  /* 00000D40    "RD.PIRE." */
++    0x50,0x49,0x52,0x46,0x08,0x50,0x49,0x52,  /* 00000D48    "PIRF.PIR" */
++    0x47,0x08,0x50,0x49,0x52,0x48,0x08,0x5B,  /* 00000D50    "G.PIRH.[" */
++    0x82,0x47,0x0C,0x4C,0x4E,0x4B,0x41,0x08,  /* 00000D58    ".G.LNKA." */
++    0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,0x0C,  /* 00000D60    "_HID.A.." */
++    0x0F,0x08,0x5F,0x55,0x49,0x44,0x01,0x14,  /* 00000D68    ".._UID.." */
++    0x18,0x5F,0x53,0x54,0x41,0x00,0xA0,0x0C,  /* 00000D70    "._STA..." */
++    0x7B,0x50,0x49,0x52,0x41,0x0A,0x80,0x00,  /* 00000D78    "{PIRA..." */
++    0xA4,0x0A,0x09,0xA1,0x04,0xA4,0x0A,0x0B,  /* 00000D80    "........" */
++    0x14,0x11,0x5F,0x44,0x49,0x53,0x00,0x7D,  /* 00000D88    ".._DIS.}" */
++    0x50,0x49,0x52,0x41,0x0A,0x80,0x50,0x49,  /* 00000D90    "PIRA..PI" */
++    0x52,0x41,0x14,0x45,0x04,0x5F,0x43,0x52,  /* 00000D98    "RA.E._CR" */
++    0x53,0x08,0x08,0x42,0x55,0x46,0x30,0x11,  /* 00000DA0    "S..BUF0." */
++    0x09,0x0A,0x06,0x23,0x01,0x00,0x18,0x79,  /* 00000DA8    "...#...y" */
++    0x00,0x8B,0x42,0x55,0x46,0x30,0x01,0x49,  /* 00000DB0    "..BUF0.I" */
++    0x52,0x51,0x57,0xA0,0x0C,0x7B,0x50,0x49,  /* 00000DB8    "RQW..{PI" */
++    0x52,0x41,0x0A,0x80,0x00,0x70,0x00,0x60,  /* 00000DC0    "RA...p.`" */
++    0xA1,0x04,0x70,0x01,0x60,0x79,0x60,0x7B,  /* 00000DC8    "..p.`y`{" */
++    0x50,0x49,0x52,0x41,0x0A,0x0F,0x00,0x49,  /* 00000DD0    "PIRA...I" */
++    0x52,0x51,0x57,0xA4,0x42,0x55,0x46,0x30,  /* 00000DD8    "RQW.BUF0" */
++    0x08,0x5F,0x50,0x52,0x53,0x11,0x09,0x0A,  /* 00000DE0    "._PRS..." */
++    0x06,0x23,0xB8,0x1E,0x18,0x79,0x00,0x14,  /* 00000DE8    ".#...y.." */
++    0x30,0x5F,0x53,0x52,0x53,0x01,0x8B,0x68,  /* 00000DF0    "0_SRS..h" */
++    0x01,0x49,0x52,0x51,0x57,0x82,0x49,0x52,  /* 00000DF8    ".IRQW.IR" */
++    0x51,0x57,0x60,0xA0,0x0F,0x92,0x93,0x49,  /* 00000E00    "QW`....I" */
++    0x52,0x51,0x57,0x00,0x7B,0x60,0x0A,0x7F,  /* 00000E08    "RQW.{`.." */
++    0x60,0x76,0x60,0xA1,0x06,0x7D,0x60,0x0A,  /* 00000E10    "`v`..}`." */
++    0x80,0x60,0x70,0x60,0x50,0x49,0x52,0x41,  /* 00000E18    ".`p`PIRA" */
++    0x5B,0x82,0x48,0x0C,0x4C,0x4E,0x4B,0x42,  /* 00000E20    "[.H.LNKB" */
++    0x08,0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,  /* 00000E28    "._HID.A." */
++    0x0C,0x0F,0x08,0x5F,0x55,0x49,0x44,0x0A,  /* 00000E30    "..._UID." */
++    0x02,0x14,0x18,0x5F,0x53,0x54,0x41,0x00,  /* 00000E38    "..._STA." */
++    0xA0,0x0C,0x7B,0x50,0x49,0x52,0x42,0x0A,  /* 00000E40    "..{PIRB." */
++    0x80,0x00,0xA4,0x0A,0x09,0xA1,0x04,0xA4,  /* 00000E48    "........" */
++    0x0A,0x0B,0x14,0x11,0x5F,0x44,0x49,0x53,  /* 00000E50    "...._DIS" */
++    0x00,0x7D,0x50,0x49,0x52,0x42,0x0A,0x80,  /* 00000E58    ".}PIRB.." */
++    0x50,0x49,0x52,0x42,0x14,0x45,0x04,0x5F,  /* 00000E60    "PIRB.E._" */
++    0x43,0x52,0x53,0x08,0x08,0x42,0x55,0x46,  /* 00000E68    "CRS..BUF" */
++    0x30,0x11,0x09,0x0A,0x06,0x23,0x01,0x00,  /* 00000E70    "0....#.." */
++    0x18,0x79,0x00,0x8B,0x42,0x55,0x46,0x30,  /* 00000E78    ".y..BUF0" */
++    0x01,0x49,0x52,0x51,0x57,0xA0,0x0C,0x7B,  /* 00000E80    ".IRQW..{" */
++    0x50,0x49,0x52,0x42,0x0A,0x80,0x00,0x70,  /* 00000E88    "PIRB...p" */
++    0x00,0x60,0xA1,0x04,0x70,0x01,0x60,0x79,  /* 00000E90    ".`..p.`y" */
++    0x60,0x7B,0x50,0x49,0x52,0x42,0x0A,0x0F,  /* 00000E98    "`{PIRB.." */
++    0x00,0x49,0x52,0x51,0x57,0xA4,0x42,0x55,  /* 00000EA0    ".IRQW.BU" */
++    0x46,0x30,0x08,0x5F,0x50,0x52,0x53,0x11,  /* 00000EA8    "F0._PRS." */
++    0x09,0x0A,0x06,0x23,0xB8,0x1E,0x18,0x79,  /* 00000EB0    "...#...y" */
++    0x00,0x14,0x30,0x5F,0x53,0x52,0x53,0x01,  /* 00000EB8    "..0_SRS." */
++    0x8B,0x68,0x01,0x49,0x52,0x51,0x57,0x82,  /* 00000EC0    ".h.IRQW." */
++    0x49,0x52,0x51,0x57,0x60,0xA0,0x0F,0x92,  /* 00000EC8    "IRQW`..." */
++    0x93,0x49,0x52,0x51,0x57,0x00,0x7B,0x60,  /* 00000ED0    ".IRQW.{`" */
++    0x0A,0x7F,0x60,0x76,0x60,0xA1,0x06,0x7D,  /* 00000ED8    "..`v`..}" */
++    0x60,0x0A,0x80,0x60,0x70,0x60,0x50,0x49,  /* 00000EE0    "`..`p`PI" */
++    0x52,0x42,0x5B,0x82,0x48,0x0C,0x4C,0x4E,  /* 00000EE8    "RB[.H.LN" */
++    0x4B,0x43,0x08,0x5F,0x48,0x49,0x44,0x0C,  /* 00000EF0    "KC._HID." */
++    0x41,0xD0,0x0C,0x0F,0x08,0x5F,0x55,0x49,  /* 00000EF8    "A...._UI" */
++    0x44,0x0A,0x03,0x14,0x18,0x5F,0x53,0x54,  /* 00000F00    "D...._ST" */
++    0x41,0x00,0xA0,0x0C,0x7B,0x50,0x49,0x52,  /* 00000F08    "A...{PIR" */
++    0x43,0x0A,0x80,0x00,0xA4,0x0A,0x09,0xA1,  /* 00000F10    "C......." */
++    0x04,0xA4,0x0A,0x0B,0x14,0x11,0x5F,0x44,  /* 00000F18    "......_D" */
++    0x49,0x53,0x00,0x7D,0x50,0x49,0x52,0x43,  /* 00000F20    "IS.}PIRC" */
++    0x0A,0x80,0x50,0x49,0x52,0x43,0x14,0x45,  /* 00000F28    "..PIRC.E" */
++    0x04,0x5F,0x43,0x52,0x53,0x08,0x08,0x42,  /* 00000F30    "._CRS..B" */
++    0x55,0x46,0x30,0x11,0x09,0x0A,0x06,0x23,  /* 00000F38    "UF0....#" */
++    0x01,0x00,0x18,0x79,0x00,0x8B,0x42,0x55,  /* 00000F40    "...y..BU" */
++    0x46,0x30,0x01,0x49,0x52,0x51,0x57,0xA0,  /* 00000F48    "F0.IRQW." */
++    0x0C,0x7B,0x50,0x49,0x52,0x43,0x0A,0x80,  /* 00000F50    ".{PIRC.." */
++    0x00,0x70,0x00,0x60,0xA1,0x04,0x70,0x01,  /* 00000F58    ".p.`..p." */
++    0x60,0x79,0x60,0x7B,0x50,0x49,0x52,0x43,  /* 00000F60    "`y`{PIRC" */
++    0x0A,0x0F,0x00,0x49,0x52,0x51,0x57,0xA4,  /* 00000F68    "...IRQW." */
++    0x42,0x55,0x46,0x30,0x08,0x5F,0x50,0x52,  /* 00000F70    "BUF0._PR" */
++    0x53,0x11,0x09,0x0A,0x06,0x23,0xB8,0x1E,  /* 00000F78    "S....#.." */
++    0x18,0x79,0x00,0x14,0x30,0x5F,0x53,0x52,  /* 00000F80    ".y..0_SR" */
++    0x53,0x01,0x8B,0x68,0x01,0x49,0x52,0x51,  /* 00000F88    "S..h.IRQ" */
++    0x57,0x82,0x49,0x52,0x51,0x57,0x60,0xA0,  /* 00000F90    "W.IRQW`." */
++    0x0F,0x92,0x93,0x49,0x52,0x51,0x57,0x00,  /* 00000F98    "...IRQW." */
++    0x7B,0x60,0x0A,0x7F,0x60,0x76,0x60,0xA1,  /* 00000FA0    "{`..`v`." */
++    0x06,0x7D,0x60,0x0A,0x80,0x60,0x70,0x60,  /* 00000FA8    ".}`..`p`" */
++    0x50,0x49,0x52,0x43,0x5B,0x82,0x48,0x0C,  /* 00000FB0    "PIRC[.H." */
++    0x4C,0x4E,0x4B,0x44,0x08,0x5F,0x48,0x49,  /* 00000FB8    "LNKD._HI" */
++    0x44,0x0C,0x41,0xD0,0x0C,0x0F,0x08,0x5F,  /* 00000FC0    "D.A...._" */
++    0x55,0x49,0x44,0x0A,0x04,0x14,0x18,0x5F,  /* 00000FC8    "UID...._" */
++    0x53,0x54,0x41,0x00,0xA0,0x0C,0x7B,0x50,  /* 00000FD0    "STA...{P" */
++    0x49,0x52,0x44,0x0A,0x80,0x00,0xA4,0x0A,  /* 00000FD8    "IRD....." */
++    0x09,0xA1,0x04,0xA4,0x0A,0x0B,0x14,0x11,  /* 00000FE0    "........" */
++    0x5F,0x44,0x49,0x53,0x00,0x7D,0x50,0x49,  /* 00000FE8    "_DIS.}PI" */
++    0x52,0x44,0x0A,0x80,0x50,0x49,0x52,0x44,  /* 00000FF0    "RD..PIRD" */
++    0x14,0x45,0x04,0x5F,0x43,0x52,0x53,0x08,  /* 00000FF8    ".E._CRS." */
++    0x08,0x42,0x55,0x46,0x30,0x11,0x09,0x0A,  /* 00001000    ".BUF0..." */
++    0x06,0x23,0x01,0x00,0x18,0x79,0x00,0x8B,  /* 00001008    ".#...y.." */
++    0x42,0x55,0x46,0x30,0x01,0x49,0x52,0x51,  /* 00001010    "BUF0.IRQ" */
++    0x57,0xA0,0x0C,0x7B,0x50,0x49,0x52,0x44,  /* 00001018    "W..{PIRD" */
++    0x0A,0x80,0x00,0x70,0x00,0x60,0xA1,0x04,  /* 00001020    "...p.`.." */
++    0x70,0x01,0x60,0x79,0x60,0x7B,0x50,0x49,  /* 00001028    "p.`y`{PI" */
++    0x52,0x44,0x0A,0x0F,0x00,0x49,0x52,0x51,  /* 00001030    "RD...IRQ" */
++    0x57,0xA4,0x42,0x55,0x46,0x30,0x08,0x5F,  /* 00001038    "W.BUF0._" */
++    0x50,0x52,0x53,0x11,0x09,0x0A,0x06,0x23,  /* 00001040    "PRS....#" */
++    0xB8,0x1E,0x18,0x79,0x00,0x14,0x30,0x5F,  /* 00001048    "...y..0_" */
++    0x53,0x52,0x53,0x01,0x8B,0x68,0x01,0x49,  /* 00001050    "SRS..h.I" */
++    0x52,0x51,0x57,0x82,0x49,0x52,0x51,0x57,  /* 00001058    "RQW.IRQW" */
++    0x60,0xA0,0x0F,0x92,0x93,0x49,0x52,0x51,  /* 00001060    "`....IRQ" */
++    0x57,0x00,0x7B,0x60,0x0A,0x7F,0x60,0x76,  /* 00001068    "W.{`..`v" */
++    0x60,0xA1,0x06,0x7D,0x60,0x0A,0x80,0x60,  /* 00001070    "`..}`..`" */
++    0x70,0x60,0x50,0x49,0x52,0x44,0x5B,0x82,  /* 00001078    "p`PIRD[." */
++    0x48,0x0C,0x4C,0x4E,0x4B,0x45,0x08,0x5F,  /* 00001080    "H.LNKE._" */
++    0x48,0x49,0x44,0x0C,0x41,0xD0,0x0C,0x0F,  /* 00001088    "HID.A..." */
++    0x08,0x5F,0x55,0x49,0x44,0x0A,0x05,0x14,  /* 00001090    "._UID..." */
++    0x18,0x5F,0x53,0x54,0x41,0x00,0xA0,0x0C,  /* 00001098    "._STA..." */
++    0x7B,0x50,0x49,0x52,0x45,0x0A,0x80,0x00,  /* 000010A0    "{PIRE..." */
++    0xA4,0x0A,0x09,0xA1,0x04,0xA4,0x0A,0x0B,  /* 000010A8    "........" */
++    0x14,0x11,0x5F,0x44,0x49,0x53,0x00,0x7D,  /* 000010B0    ".._DIS.}" */
++    0x50,0x49,0x52,0x45,0x0A,0x80,0x50,0x49,  /* 000010B8    "PIRE..PI" */
++    0x52,0x45,0x14,0x45,0x04,0x5F,0x43,0x52,  /* 000010C0    "RE.E._CR" */
++    0x53,0x08,0x08,0x42,0x55,0x46,0x30,0x11,  /* 000010C8    "S..BUF0." */
++    0x09,0x0A,0x06,0x23,0x01,0x00,0x18,0x79,  /* 000010D0    "...#...y" */
++    0x00,0x8B,0x42,0x55,0x46,0x30,0x01,0x49,  /* 000010D8    "..BUF0.I" */
++    0x52,0x51,0x57,0xA0,0x0C,0x7B,0x50,0x49,  /* 000010E0    "RQW..{PI" */
++    0x52,0x45,0x0A,0x80,0x00,0x70,0x00,0x60,  /* 000010E8    "RE...p.`" */
++    0xA1,0x04,0x70,0x01,0x60,0x79,0x60,0x7B,  /* 000010F0    "..p.`y`{" */
++    0x50,0x49,0x52,0x45,0x0A,0x0F,0x00,0x49,  /* 000010F8    "PIRE...I" */
++    0x52,0x51,0x57,0xA4,0x42,0x55,0x46,0x30,  /* 00001100    "RQW.BUF0" */
++    0x08,0x5F,0x50,0x52,0x53,0x11,0x09,0x0A,  /* 00001108    "._PRS..." */
++    0x06,0x23,0xB8,0x1E,0x18,0x79,0x00,0x14,  /* 00001110    ".#...y.." */
++    0x30,0x5F,0x53,0x52,0x53,0x01,0x8B,0x68,  /* 00001118    "0_SRS..h" */
++    0x01,0x49,0x52,0x51,0x57,0x82,0x49,0x52,  /* 00001120    ".IRQW.IR" */
++    0x51,0x57,0x60,0xA0,0x0F,0x92,0x93,0x49,  /* 00001128    "QW`....I" */
++    0x52,0x51,0x57,0x00,0x7B,0x60,0x0A,0x7F,  /* 00001130    "RQW.{`.." */
++    0x60,0x76,0x60,0xA1,0x06,0x7D,0x60,0x0A,  /* 00001138    "`v`..}`." */
++    0x80,0x60,0x70,0x60,0x50,0x49,0x52,0x45,  /* 00001140    ".`p`PIRE" */
++    0x5B,0x82,0x48,0x0C,0x4C,0x4E,0x4B,0x46,  /* 00001148    "[.H.LNKF" */
++    0x08,0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,  /* 00001150    "._HID.A." */
++    0x0C,0x0F,0x08,0x5F,0x55,0x49,0x44,0x0A,  /* 00001158    "..._UID." */
++    0x06,0x14,0x18,0x5F,0x53,0x54,0x41,0x00,  /* 00001160    "..._STA." */
++    0xA0,0x0C,0x7B,0x50,0x49,0x52,0x46,0x0A,  /* 00001168    "..{PIRF." */
++    0x80,0x00,0xA4,0x0A,0x09,0xA1,0x04,0xA4,  /* 00001170    "........" */
++    0x0A,0x0B,0x14,0x11,0x5F,0x44,0x49,0x53,  /* 00001178    "...._DIS" */
++    0x00,0x7D,0x50,0x49,0x52,0x42,0x0A,0x80,  /* 00001180    ".}PIRB.." */
++    0x50,0x49,0x52,0x46,0x14,0x45,0x04,0x5F,  /* 00001188    "PIRF.E._" */
++    0x43,0x52,0x53,0x08,0x08,0x42,0x55,0x46,  /* 00001190    "CRS..BUF" */
++    0x30,0x11,0x09,0x0A,0x06,0x23,0x01,0x00,  /* 00001198    "0....#.." */
++    0x18,0x79,0x00,0x8B,0x42,0x55,0x46,0x30,  /* 000011A0    ".y..BUF0" */
++    0x01,0x49,0x52,0x51,0x57,0xA0,0x0C,0x7B,  /* 000011A8    ".IRQW..{" */
++    0x50,0x49,0x52,0x46,0x0A,0x80,0x00,0x70,  /* 000011B0    "PIRF...p" */
++    0x00,0x60,0xA1,0x04,0x70,0x01,0x60,0x79,  /* 000011B8    ".`..p.`y" */
++    0x60,0x7B,0x50,0x49,0x52,0x46,0x0A,0x0F,  /* 000011C0    "`{PIRF.." */
++    0x00,0x49,0x52,0x51,0x57,0xA4,0x42,0x55,  /* 000011C8    ".IRQW.BU" */
++    0x46,0x30,0x08,0x5F,0x50,0x52,0x53,0x11,  /* 000011D0    "F0._PRS." */
++    0x09,0x0A,0x06,0x23,0xB8,0x1E,0x18,0x79,  /* 000011D8    "...#...y" */
++    0x00,0x14,0x30,0x5F,0x53,0x52,0x53,0x01,  /* 000011E0    "..0_SRS." */
++    0x8B,0x68,0x01,0x49,0x52,0x51,0x57,0x82,  /* 000011E8    ".h.IRQW." */
++    0x49,0x52,0x51,0x57,0x60,0xA0,0x0F,0x92,  /* 000011F0    "IRQW`..." */
++    0x93,0x49,0x52,0x51,0x57,0x00,0x7B,0x60,  /* 000011F8    ".IRQW.{`" */
++    0x0A,0x7F,0x60,0x76,0x60,0xA1,0x06,0x7D,  /* 00001200    "..`v`..}" */
++    0x60,0x0A,0x80,0x60,0x70,0x60,0x50,0x49,  /* 00001208    "`..`p`PI" */
++    0x52,0x46,0x5B,0x82,0x48,0x0C,0x4C,0x4E,  /* 00001210    "RF[.H.LN" */
++    0x4B,0x47,0x08,0x5F,0x48,0x49,0x44,0x0C,  /* 00001218    "KG._HID." */
++    0x41,0xD0,0x0C,0x0F,0x08,0x5F,0x55,0x49,  /* 00001220    "A...._UI" */
++    0x44,0x0A,0x07,0x14,0x18,0x5F,0x53,0x54,  /* 00001228    "D...._ST" */
++    0x41,0x00,0xA0,0x0C,0x7B,0x50,0x49,0x52,  /* 00001230    "A...{PIR" */
++    0x47,0x0A,0x80,0x00,0xA4,0x0A,0x09,0xA1,  /* 00001238    "G......." */
++    0x04,0xA4,0x0A,0x0B,0x14,0x11,0x5F,0x44,  /* 00001240    "......_D" */
++    0x49,0x53,0x00,0x7D,0x50,0x49,0x52,0x47,  /* 00001248    "IS.}PIRG" */
++    0x0A,0x80,0x50,0x49,0x52,0x47,0x14,0x45,  /* 00001250    "..PIRG.E" */
++    0x04,0x5F,0x43,0x52,0x53,0x08,0x08,0x42,  /* 00001258    "._CRS..B" */
++    0x55,0x46,0x30,0x11,0x09,0x0A,0x06,0x23,  /* 00001260    "UF0....#" */
++    0x01,0x00,0x18,0x79,0x00,0x8B,0x42,0x55,  /* 00001268    "...y..BU" */
++    0x46,0x30,0x01,0x49,0x52,0x51,0x57,0xA0,  /* 00001270    "F0.IRQW." */
++    0x0C,0x7B,0x50,0x49,0x52,0x47,0x0A,0x80,  /* 00001278    ".{PIRG.." */
++    0x00,0x70,0x00,0x60,0xA1,0x04,0x70,0x01,  /* 00001280    ".p.`..p." */
++    0x60,0x79,0x60,0x7B,0x50,0x49,0x52,0x47,  /* 00001288    "`y`{PIRG" */
++    0x0A,0x0F,0x00,0x49,0x52,0x51,0x57,0xA4,  /* 00001290    "...IRQW." */
++    0x42,0x55,0x46,0x30,0x08,0x5F,0x50,0x52,  /* 00001298    "BUF0._PR" */
++    0x53,0x11,0x09,0x0A,0x06,0x23,0xB8,0x1E,  /* 000012A0    "S....#.." */
++    0x18,0x79,0x00,0x14,0x30,0x5F,0x53,0x52,  /* 000012A8    ".y..0_SR" */
++    0x53,0x01,0x8B,0x68,0x01,0x49,0x52,0x51,  /* 000012B0    "S..h.IRQ" */
++    0x57,0x82,0x49,0x52,0x51,0x57,0x60,0xA0,  /* 000012B8    "W.IRQW`." */
++    0x0F,0x92,0x93,0x49,0x52,0x51,0x57,0x00,  /* 000012C0    "...IRQW." */
++    0x7B,0x60,0x0A,0x7F,0x60,0x76,0x60,0xA1,  /* 000012C8    "{`..`v`." */
++    0x06,0x7D,0x60,0x0A,0x80,0x60,0x70,0x60,  /* 000012D0    ".}`..`p`" */
++    0x50,0x49,0x52,0x47,0x5B,0x82,0x48,0x0C,  /* 000012D8    "PIRG[.H." */
++    0x4C,0x4E,0x4B,0x48,0x08,0x5F,0x48,0x49,  /* 000012E0    "LNKH._HI" */
++    0x44,0x0C,0x41,0xD0,0x0C,0x0F,0x08,0x5F,  /* 000012E8    "D.A...._" */
++    0x55,0x49,0x44,0x0A,0x08,0x14,0x18,0x5F,  /* 000012F0    "UID...._" */
++    0x53,0x54,0x41,0x00,0xA0,0x0C,0x7B,0x50,  /* 000012F8    "STA...{P" */
++    0x49,0x52,0x48,0x0A,0x80,0x00,0xA4,0x0A,  /* 00001300    "IRH....." */
++    0x09,0xA1,0x04,0xA4,0x0A,0x0B,0x14,0x11,  /* 00001308    "........" */
++    0x5F,0x44,0x49,0x53,0x00,0x7D,0x50,0x49,  /* 00001310    "_DIS.}PI" */
++    0x52,0x48,0x0A,0x80,0x50,0x49,0x52,0x48,  /* 00001318    "RH..PIRH" */
++    0x14,0x45,0x04,0x5F,0x43,0x52,0x53,0x08,  /* 00001320    ".E._CRS." */
++    0x08,0x42,0x55,0x46,0x30,0x11,0x09,0x0A,  /* 00001328    ".BUF0..." */
++    0x06,0x23,0x01,0x00,0x18,0x79,0x00,0x8B,  /* 00001330    ".#...y.." */
++    0x42,0x55,0x46,0x30,0x01,0x49,0x52,0x51,  /* 00001338    "BUF0.IRQ" */
++    0x57,0xA0,0x0C,0x7B,0x50,0x49,0x52,0x48,  /* 00001340    "W..{PIRH" */
++    0x0A,0x80,0x00,0x70,0x00,0x60,0xA1,0x04,  /* 00001348    "...p.`.." */
++    0x70,0x01,0x60,0x79,0x60,0x7B,0x50,0x49,  /* 00001350    "p.`y`{PI" */
++    0x52,0x48,0x0A,0x0F,0x00,0x49,0x52,0x51,  /* 00001358    "RH...IRQ" */
++    0x57,0xA4,0x42,0x55,0x46,0x30,0x08,0x5F,  /* 00001360    "W.BUF0._" */
++    0x50,0x52,0x53,0x11,0x09,0x0A,0x06,0x23,  /* 00001368    "PRS....#" */
++    0xB8,0x1E,0x18,0x79,0x00,0x14,0x30,0x5F,  /* 00001370    "...y..0_" */
++    0x53,0x52,0x53,0x01,0x8B,0x68,0x01,0x49,  /* 00001378    "SRS..h.I" */
++    0x52,0x51,0x57,0x82,0x49,0x52,0x51,0x57,  /* 00001380    "RQW.IRQW" */
++    0x60,0xA0,0x0F,0x92,0x93,0x49,0x52,0x51,  /* 00001388    "`....IRQ" */
++    0x57,0x00,0x7B,0x60,0x0A,0x7F,0x60,0x76,  /* 00001390    "W.{`..`v" */
++    0x60,0xA1,0x06,0x7D,0x60,0x0A,0x80,0x60,  /* 00001398    "`..}`..`" */
++    0x70,0x60,0x50,0x49,0x52,0x48,0x5B,0x82,  /* 000013A0    "p`PIRH[." */
++    0x42,0x06,0x52,0x54,0x43,0x5F,0x08,0x5F,  /* 000013A8    "B.RTC_._" */
++    0x48,0x49,0x44,0x0C,0x41,0xD0,0x0B,0x00,  /* 000013B0    "HID.A..." */
++    0x08,0x42,0x55,0x46,0x30,0x11,0x15,0x0A,  /* 000013B8    ".BUF0..." */
++    0x12,0x47,0x01,0x70,0x00,0x70,0x00,0x01,  /* 000013C0    ".G.p.p.." */
++    0x04,0x47,0x01,0x74,0x00,0x74,0x00,0x01,  /* 000013C8    ".G.t.t.." */
++    0x04,0x79,0x00,0x08,0x42,0x55,0x46,0x31,  /* 000013D0    ".y..BUF1" */
++    0x11,0x18,0x0A,0x15,0x47,0x01,0x70,0x00,  /* 000013D8    "....G.p." */
++    0x70,0x00,0x01,0x04,0x47,0x01,0x74,0x00,  /* 000013E0    "p...G.t." */
++    0x74,0x00,0x01,0x04,0x22,0x00,0x01,0x79,  /* 000013E8    "t..."..y" */
++    0x00,0x14,0x18,0x5F,0x43,0x52,0x53,0x08,  /* 000013F0    "..._CRS." */
++    0xA0,0x0A,0x48,0x50,0x45,0x41,0xA4,0x42,  /* 000013F8    "..HPEA.B" */
++    0x55,0x46,0x30,0xA1,0x06,0xA4,0x42,0x55,  /* 00001400    "UF0...BU" */
++    0x46,0x31,0x5B,0x82,0x30,0x50,0x49,0x43,  /* 00001408    "F1[.0PIC" */
++    0x5F,0x08,0x5F,0x48,0x49,0x44,0x0B,0x41,  /* 00001410    "_._HID.A" */
++    0xD0,0x08,0x5F,0x43,0x52,0x53,0x11,0x1D,  /* 00001418    ".._CRS.." */
++    0x0A,0x1A,0x47,0x01,0x20,0x00,0x20,0x00,  /* 00001420    "..G. . ." */
++    0x01,0x1E,0x47,0x01,0xA0,0x00,0xA0,0x00,  /* 00001428    "..G....." */
++    0x01,0x1E,0x47,0x01,0xD0,0x04,0xD0,0x04,  /* 00001430    "..G....." */
++    0x01,0x02,0x79,0x00,0x5B,0x82,0x42,0x06,  /* 00001438    "..y.[.B." */
++    0x54,0x4D,0x52,0x5F,0x08,0x5F,0x48,0x49,  /* 00001440    "TMR_._HI" */
++    0x44,0x0C,0x41,0xD0,0x01,0x00,0x08,0x42,  /* 00001448    "D.A....B" */
++    0x55,0x46,0x30,0x11,0x15,0x0A,0x12,0x47,  /* 00001450    "UF0....G" */
++    0x01,0x40,0x00,0x40,0x00,0x01,0x04,0x47,  /* 00001458    ".@.@...G" */
++    0x01,0x50,0x00,0x50,0x00,0x01,0x04,0x79,  /* 00001460    ".P.P...y" */
++    0x00,0x08,0x42,0x55,0x46,0x31,0x11,0x18,  /* 00001468    "..BUF1.." */
++    0x0A,0x15,0x47,0x01,0x40,0x00,0x40,0x00,  /* 00001470    "..G.@.@." */
++    0x01,0x04,0x47,0x01,0x50,0x00,0x50,0x00,  /* 00001478    "..G.P.P." */
++    0x01,0x04,0x22,0x01,0x00,0x79,0x00,0x14,  /* 00001480    ".."..y.." */
++    0x18,0x5F,0x43,0x52,0x53,0x08,0xA0,0x0A,  /* 00001488    "._CRS..." */
++    0x48,0x50,0x45,0x41,0xA4,0x42,0x55,0x46,  /* 00001490    "HPEA.BUF" */
++    0x30,0xA1,0x06,0xA4,0x42,0x55,0x46,0x31,  /* 00001498    "0...BUF1" */
++    0x5B,0x82,0x22,0x53,0x50,0x4B,0x52,0x08,  /* 000014A0    "[."SPKR." */
++    0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,0x08,  /* 000014A8    "_HID.A.." */
++    0x00,0x08,0x5F,0x43,0x52,0x53,0x11,0x0D,  /* 000014B0    ".._CRS.." */
++    0x0A,0x0A,0x47,0x01,0x61,0x00,0x61,0x00,  /* 000014B8    "..G.a.a." */
++    0x01,0x01,0x79,0x00,0x5B,0x82,0x49,0x19,  /* 000014C0    "..y.[.I." */
++    0x58,0x54,0x52,0x41,0x08,0x5F,0x48,0x49,  /* 000014C8    "XTRA._HI" */
++    0x44,0x0C,0x41,0xD0,0x0C,0x02,0x08,0x43,  /* 000014D0    "D.A....C" */
++    0x52,0x53,0x5F,0x11,0x46,0x08,0x0A,0x82,  /* 000014D8    "RS_.F..." */
++    0x47,0x01,0x2E,0x00,0x2E,0x00,0x01,0x02,  /* 000014E0    "G......." */
++    0x47,0x01,0x4E,0x00,0x2E,0x00,0x01,0x02,  /* 000014E8    "G.N....." */
++    0x47,0x01,0x63,0x00,0x61,0x00,0x01,0x01,  /* 000014F0    "G.c.a..." */
++    0x47,0x01,0x65,0x00,0x61,0x00,0x01,0x01,  /* 000014F8    "G.e.a..." */
++    0x47,0x01,0x67,0x00,0x61,0x00,0x01,0x01,  /* 00001500    "G.g.a..." */
++    0x47,0x01,0x80,0x00,0x80,0x00,0x01,0x01,  /* 00001508    "G......." */
++    0x47,0x01,0x84,0x00,0x84,0x00,0x01,0x04,  /* 00001510    "G......." */
++    0x47,0x01,0x88,0x00,0x88,0x00,0x01,0x01,  /* 00001518    "G......." */
++    0x47,0x01,0x8C,0x00,0x8C,0x00,0x01,0x03,  /* 00001520    "G......." */
++    0x47,0x01,0x92,0x00,0x92,0x00,0x01,0x01,  /* 00001528    "G......." */
++    0x47,0x01,0x00,0x00,0x00,0x00,0x01,0x10,  /* 00001530    "G......." */
++    0x47,0x01,0x00,0x00,0x00,0x00,0x01,0x10,  /* 00001538    "G......." */
++    0x47,0x01,0x00,0x00,0x00,0x00,0x01,0x40,  /* 00001540    "G......@" */
++    0x47,0x01,0x00,0x00,0x00,0x00,0x01,0x40,  /* 00001548    "G......@" */
++    0x47,0x01,0x00,0x00,0x00,0x00,0x01,0x40,  /* 00001550    "G......@" */
++    0x47,0x01,0x00,0x00,0x00,0x00,0x01,0x40,  /* 00001558    "G......@" */
++    0x79,0x00,0x14,0x4C,0x0F,0x5F,0x43,0x52,  /* 00001560    "y..L._CR" */
++    0x53,0x00,0x8B,0x43,0x52,0x53,0x5F,0x0A,  /* 00001568    "S..CRS_." */
++    0x52,0x4D,0x42,0x52,0x30,0x70,0x50,0x31,  /* 00001570    "RMBR0pP1" */
++    0x42,0x42,0x4D,0x42,0x52,0x30,0x8B,0x43,  /* 00001578    "BBMBR0.C" */
++    0x52,0x53,0x5F,0x0A,0x54,0x4D,0x42,0x52,  /* 00001580    "RS_.TMBR" */
++    0x31,0x70,0x50,0x31,0x42,0x42,0x4D,0x42,  /* 00001588    "1pP1BBMB" */
++    0x52,0x31,0x8B,0x43,0x52,0x53,0x5F,0x0A,  /* 00001590    "R1.CRS_." */
++    0x5A,0x4D,0x42,0x52,0x32,0x70,0x50,0x42,  /* 00001598    "ZMBR2pPB" */
++    0x41,0x42,0x4D,0x42,0x52,0x32,0x8B,0x43,  /* 000015A0    "ABMBR2.C" */
++    0x52,0x53,0x5F,0x0A,0x5C,0x4D,0x42,0x52,  /* 000015A8    "RS_.\MBR" */
++    0x33,0x70,0x50,0x42,0x41,0x42,0x4D,0x42,  /* 000015B0    "3pPBABMB" */
++    0x52,0x33,0x8B,0x43,0x52,0x53,0x5F,0x0A,  /* 000015B8    "R3.CRS_." */
++    0x62,0x4D,0x42,0x52,0x34,0x70,0x47,0x50,  /* 000015C0    "bMBR4pGP" */
++    0x30,0x42,0x4D,0x42,0x52,0x34,0x8B,0x43,  /* 000015C8    "0BMBR4.C" */
++    0x52,0x53,0x5F,0x0A,0x64,0x4D,0x42,0x52,  /* 000015D0    "RS_.dMBR" */
++    0x35,0x70,0x47,0x50,0x30,0x42,0x4D,0x42,  /* 000015D8    "5pGP0BMB" */
++    0x52,0x35,0x8B,0x43,0x52,0x53,0x5F,0x0A,  /* 000015E0    "R5.CRS_." */
++    0x6A,0x4D,0x42,0x52,0x36,0x70,0x47,0x50,  /* 000015E8    "jMBR6pGP" */
++    0x41,0x42,0x4D,0x42,0x52,0x36,0x8B,0x43,  /* 000015F0    "ABMBR6.C" */
++    0x52,0x53,0x5F,0x0A,0x6C,0x4D,0x42,0x52,  /* 000015F8    "RS_.lMBR" */
++    0x37,0x70,0x47,0x50,0x41,0x42,0x4D,0x42,  /* 00001600    "7pGPABMB" */
++    0x52,0x37,0x8B,0x43,0x52,0x53,0x5F,0x0A,  /* 00001608    "R7.CRS_." */
++    0x72,0x4D,0x42,0x52,0x38,0x70,0x53,0x4D,  /* 00001610    "rMBR8pSM" */
++    0x42,0x42,0x4D,0x42,0x52,0x38,0x8B,0x43,  /* 00001618    "BBMBR8.C" */
++    0x52,0x53,0x5F,0x0A,0x74,0x4D,0x42,0x52,  /* 00001620    "RS_.tMBR" */
++    0x39,0x70,0x53,0x4D,0x42,0x42,0x4D,0x42,  /* 00001628    "9pSMBBMB" */
++    0x52,0x39,0x8B,0x43,0x52,0x53,0x5F,0x0A,  /* 00001630    "R9.CRS_." */
++    0x7A,0x4D,0x42,0x52,0x41,0x70,0x57,0x44,  /* 00001638    "zMBRApWD" */
++    0x54,0x42,0x4D,0x42,0x52,0x41,0x8B,0x43,  /* 00001640    "TBMBRA.C" */
++    0x52,0x53,0x5F,0x0A,0x7C,0x4D,0x42,0x52,  /* 00001648    "RS_.|MBR" */
++    0x42,0x70,0x57,0x44,0x54,0x42,0x4D,0x42,  /* 00001650    "BpWDTBMB" */
++    0x52,0x42,0xA4,0x43,0x52,0x53,0x5F,0x5B,  /* 00001658    "RB.CRS_[" */
++    0x82,0x47,0x08,0x48,0x50,0x45,0x54,0x08,  /* 00001660    ".G.HPET." */
++    0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,0x01,  /* 00001668    "_HID.A.." */
++    0x03,0x08,0x42,0x55,0x46,0x30,0x11,0x17,  /* 00001670    "..BUF0.." */
++    0x0A,0x14,0x22,0x01,0x00,0x22,0x00,0x01,  /* 00001678    ".."..".." */
++    0x86,0x09,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00001680    "........" */
++    0x00,0x00,0x00,0x00,0x79,0x00,0x14,0x25,  /* 00001688    "....y..%" */
++    0x5F,0x53,0x54,0x41,0x00,0xA0,0x11,0x92,  /* 00001690    "_STA...." */
++    0x95,0x4F,0x53,0x54,0x50,0x01,0xA0,0x08,  /* 00001698    ".OSTP..." */
++    0x48,0x50,0x45,0x41,0xA4,0x0A,0x0F,0xA1,  /* 000016A0    "HPEA...." */
++    0x0A,0xA0,0x08,0x48,0x50,0x45,0x41,0xA4,  /* 000016A8    "...HPEA." */
++    0x0A,0x0B,0xA4,0x00,0x14,0x33,0x5F,0x43,  /* 000016B0    ".....3_C" */
++    0x52,0x53,0x08,0x8A,0x42,0x55,0x46,0x30,  /* 000016B8    "RS..BUF0" */
++    0x0A,0x0A,0x4D,0x42,0x52,0x30,0x70,0x48,  /* 000016C0    "..MBR0pH" */
++    0x50,0x54,0x42,0x4D,0x42,0x52,0x30,0x8A,  /* 000016C8    "PTBMBR0." */
++    0x42,0x55,0x46,0x30,0x0A,0x0E,0x4D,0x42,  /* 000016D0    "BUF0..MB" */
++    0x52,0x31,0x70,0x48,0x50,0x54,0x53,0x4D,  /* 000016D8    "R1pHPTSM" */
++    0x42,0x52,0x31,0xA4,0x42,0x55,0x46,0x30,  /* 000016E0    "BR1.BUF0" */
++    0x5B,0x82,0x4B,0x05,0x41,0x50,0x49,0x43,  /* 000016E8    "[.K.APIC" */
++    0x08,0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,  /* 000016F0    "._HID.A." */
++    0x00,0x03,0x08,0x43,0x52,0x53,0x5F,0x11,  /* 000016F8    "...CRS_." */
++    0x11,0x0A,0x0E,0x86,0x09,0x00,0x00,0x00,  /* 00001700    "........" */
++    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,  /* 00001708    ".......y" */
++    0x00,0x14,0x33,0x5F,0x43,0x52,0x53,0x00,  /* 00001710    "..3_CRS." */
++    0x8A,0x43,0x52,0x53,0x5F,0x0A,0x04,0x4D,  /* 00001718    ".CRS_..M" */
++    0x42,0x52,0x30,0x70,0x41,0x50,0x43,0x42,  /* 00001720    "BR0pAPCB" */
++    0x4D,0x42,0x52,0x30,0x8A,0x43,0x52,0x53,  /* 00001728    "MBR0.CRS" */
++    0x5F,0x0A,0x08,0x4D,0x42,0x52,0x31,0x70,  /* 00001730    "_..MBR1p" */
++    0x41,0x50,0x43,0x53,0x4D,0x42,0x52,0x31,  /* 00001738    "APCSMBR1" */
++    0xA4,0x43,0x52,0x53,0x5F,0x5B,0x82,0x47,  /* 00001740    ".CRS_[.G" */
++    0x0B,0x54,0x50,0x4D,0x5F,0x08,0x5F,0x48,  /* 00001748    ".TPM_._H" */
++    0x49,0x44,0x0C,0x25,0xD4,0x34,0x93,0x08,  /* 00001750    "ID.%.4.." */
++    0x5F,0x43,0x49,0x44,0x0C,0x41,0xD0,0x0C,  /* 00001758    "_CID.A.." */
++    0x31,0x08,0x5F,0x53,0x54,0x52,0x11,0x42,  /* 00001760    "1._STR.B" */
++    0x05,0x0A,0x4E,0x49,0x00,0x6E,0x00,0x66,  /* 00001768    "..NI.n.f" */
++    0x00,0x69,0x00,0x6E,0x00,0x65,0x00,0x6F,  /* 00001770    ".i.n.e.o" */
++    0x00,0x6E,0x00,0x20,0x00,0x54,0x00,0x50,  /* 00001778    ".n. .T.P" */
++    0x00,0x4D,0x00,0x20,0x00,0x31,0x00,0x2E,  /* 00001780    ".M. .1.." */
++    0x00,0x32,0x00,0x20,0x00,0x44,0x00,0x65,  /* 00001788    ".2. .D.e" */
++    0x00,0x76,0x00,0x69,0x00,0x63,0x00,0x65,  /* 00001790    ".v.i.c.e" */
++    0x00,0x20,0x00,0x28,0x00,0x53,0x00,0x4C,  /* 00001798    ". .(.S.L" */
++    0x00,0x42,0x00,0x39,0x00,0x36,0x00,0x34,  /* 000017A0    ".B.9.6.4" */
++    0x00,0x35,0x00,0x54,0x00,0x54,0x00,0x31,  /* 000017A8    ".5.T.T.1" */
++    0x00,0x2E,0x00,0x32,0x00,0x29,0x00,0x00,  /* 000017B0    "...2.).." */
++    0x00,0x08,0x5F,0x43,0x52,0x53,0x11,0x2B,  /* 000017B8    ".._CRS.+" */
++    0x0A,0x28,0x8E,0x23,0x00,0x01,0x00,0x01,  /* 000017C0    ".(.#...." */
++    0x02,0x00,0x00,0x01,0x06,0x00,0x80,0x1A,  /* 000017C8    "........" */
++    0x06,0x00,0x20,0x00,0x5C,0x5F,0x53,0x42,  /* 000017D0    ".. .\_SB" */
++    0x2E,0x50,0x43,0x49,0x30,0x2E,0x47,0x49,  /* 000017D8    ".PCI0.GI" */
++    0x50,0x30,0x2E,0x49,0x32,0x43,0x5F,0x00,  /* 000017E0    "P0.I2C_." */
++    0x79,0x00,0x14,0x13,0x5F,0x53,0x54,0x41,  /* 000017E8    "y..._STA" */
++    0x00,0xA0,0x09,0x93,0x54,0x50,0x4D,0x50,  /* 000017F0    "....TPMP" */
++    0x00,0xA4,0x00,0xA4,0x0A,0x0F,0x5B,0x82,  /* 000017F8    "......[." */
++    0x45,0x0C,0x43,0x59,0x38,0x43,0x08,0x5F,  /* 00001800    "E.CY8C._" */
++    0x48,0x49,0x44,0x0D,0x49,0x4E,0x54,0x33,  /* 00001808    "HID.INT3" */
++    0x34,0x39,0x30,0x00,0x08,0x5F,0x43,0x49,  /* 00001810    "490.._CI" */
++    0x44,0x0D,0x49,0x4E,0x54,0x33,0x34,0x39,  /* 00001818    "D.INT349" */
++    0x30,0x00,0x08,0x52,0x42,0x55,0x46,0x11,  /* 00001820    "0..RBUF." */
++    0x48,0x05,0x0A,0x54,0x8E,0x23,0x00,0x01,  /* 00001828    "H..T.#.." */
++    0x00,0x01,0x02,0x00,0x00,0x01,0x06,0x00,  /* 00001830    "........" */
++    0xA0,0x86,0x01,0x00,0x20,0x00,0x5C,0x5F,  /* 00001838    ".... .\_" */
++    0x53,0x42,0x2E,0x50,0x43,0x49,0x30,0x2E,  /* 00001840    "SB.PCI0." */
++    0x47,0x49,0x50,0x30,0x2E,0x49,0x32,0x43,  /* 00001848    "GIP0.I2C" */
++    0x5F,0x00,0x8C,0x29,0x00,0x01,0x00,0x01,  /* 00001850    "_..)...." */
++    0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00001858    "........" */
++    0x17,0x00,0x00,0x19,0x00,0x2C,0x00,0x00,  /* 00001860    ".....,.." */
++    0x00,0x0D,0x00,0x5C,0x5F,0x53,0x42,0x2E,  /* 00001868    "...\_SB." */
++    0x50,0x43,0x49,0x30,0x2E,0x47,0x49,0x50,  /* 00001870    "PCI0.GIP" */
++    0x30,0x2E,0x47,0x50,0x4F,0x00,0x79,0x00,  /* 00001878    "0.GPO.y." */
++    0x14,0x2E,0x5F,0x43,0x52,0x53,0x00,0x8C,  /* 00001880    ".._CRS.." */
++    0x52,0x42,0x55,0x46,0x0A,0x10,0x4F,0x42,  /* 00001888    "RBUF..OB" */
++    0x31,0x5F,0xA0,0x0E,0x93,0x41,0x4C,0x54,  /* 00001890    "1_...ALT" */
++    0x53,0x00,0x70,0x0A,0x20,0x4F,0x42,0x31,  /* 00001898    "S.p. OB1" */
++    0x5F,0xA1,0x08,0x70,0x0A,0x21,0x4F,0x42,  /* 000018A0    "_..p.!OB" */
++    0x31,0x5F,0xA4,0x52,0x42,0x55,0x46,0x14,  /* 000018A8    "1_.RBUF." */
++    0x15,0x5F,0x53,0x54,0x41,0x00,0xA0,0x0B,  /* 000018B0    "._STA..." */
++    0x92,0x93,0x50,0x54,0x59,0x50,0x0A,0x06,  /* 000018B8    "..PTYP.." */
++    0xA4,0x00,0xA4,0x0A,0x0F,0x5B,0x82,0x4B,  /* 000018C0    ".....[.K" */
++    0x07,0x4E,0x49,0x4F,0x31,0x08,0x5F,0x48,  /* 000018C8    ".NIO1._H" */
++    0x49,0x44,0x0D,0x49,0x4E,0x54,0x33,0x34,  /* 000018D0    "ID.INT34" */
++    0x39,0x31,0x00,0x08,0x5F,0x43,0x49,0x44,  /* 000018D8    "91.._CID" */
++    0x0D,0x49,0x4E,0x54,0x33,0x34,0x39,0x31,  /* 000018E0    ".INT3491" */
++    0x00,0x08,0x5F,0x55,0x49,0x44,0x01,0x08,  /* 000018E8    ".._UID.." */
++    0x52,0x42,0x55,0x46,0x11,0x2B,0x0A,0x28,  /* 000018F0    "RBUF.+.(" */
++    0x8E,0x23,0x00,0x01,0x00,0x01,0x02,0x00,  /* 000018F8    ".#......" */
++    0x00,0x01,0x06,0x00,0x80,0x1A,0x06,0x00,  /* 00001900    "........" */
++    0x25,0x00,0x5C,0x5F,0x53,0x42,0x2E,0x50,  /* 00001908    "%.\_SB.P" */
++    0x43,0x49,0x30,0x2E,0x47,0x49,0x50,0x30,  /* 00001910    "CI0.GIP0" */
++    0x2E,0x49,0x32,0x43,0x5F,0x00,0x79,0x00,  /* 00001918    ".I2C_.y." */
++    0x14,0x0B,0x5F,0x43,0x52,0x53,0x00,0xA4,  /* 00001920    ".._CRS.." */
++    0x52,0x42,0x55,0x46,0x14,0x15,0x5F,0x53,  /* 00001928    "RBUF.._S" */
++    0x54,0x41,0x00,0xA0,0x0B,0x92,0x93,0x50,  /* 00001930    "TA.....P" */
++    0x54,0x59,0x50,0x0A,0x08,0xA4,0x00,0xA4,  /* 00001938    "TYP....." */
++    0x0A,0x0F,0x5B,0x82,0x4C,0x07,0x4E,0x49,  /* 00001940    "..[.L.NI" */
++    0x4F,0x32,0x08,0x5F,0x48,0x49,0x44,0x0D,  /* 00001948    "O2._HID." */
++    0x49,0x4E,0x54,0x33,0x34,0x39,0x31,0x00,  /* 00001950    "INT3491." */
++    0x08,0x5F,0x43,0x49,0x44,0x0D,0x49,0x4E,  /* 00001958    "._CID.IN" */
++    0x54,0x33,0x34,0x39,0x31,0x00,0x08,0x5F,  /* 00001960    "T3491.._" */
++    0x55,0x49,0x44,0x0A,0x02,0x08,0x52,0x42,  /* 00001968    "UID...RB" */
++    0x55,0x46,0x11,0x2B,0x0A,0x28,0x8E,0x23,  /* 00001970    "UF.+.(.#" */
++    0x00,0x01,0x00,0x01,0x02,0x00,0x00,0x01,  /* 00001978    "........" */
++    0x06,0x00,0x80,0x1A,0x06,0x00,0x26,0x00,  /* 00001980    "......&." */
++    0x5C,0x5F,0x53,0x42,0x2E,0x50,0x43,0x49,  /* 00001988    "\_SB.PCI" */
++    0x30,0x2E,0x47,0x49,0x50,0x30,0x2E,0x49,  /* 00001990    "0.GIP0.I" */
++    0x32,0x43,0x5F,0x00,0x79,0x00,0x14,0x0B,  /* 00001998    "2C_.y..." */
++    0x5F,0x43,0x52,0x53,0x00,0xA4,0x52,0x42,  /* 000019A0    "_CRS..RB" */
++    0x55,0x46,0x14,0x15,0x5F,0x53,0x54,0x41,  /* 000019A8    "UF.._STA" */
++    0x00,0xA0,0x0B,0x92,0x93,0x50,0x54,0x59,  /* 000019B0    ".....PTY" */
++    0x50,0x0A,0x08,0xA4,0x00,0xA4,0x0A,0x0F,  /* 000019B8    "P......." */
++    0x5B,0x82,0x49,0x0A,0x4E,0x49,0x4F,0x33,  /* 000019C0    "[.I.NIO3" */
++    0x08,0x5F,0x48,0x49,0x44,0x0D,0x49,0x4E,  /* 000019C8    "._HID.IN" */
++    0x54,0x33,0x34,0x39,0x31,0x00,0x08,0x5F,  /* 000019D0    "T3491.._" */
++    0x43,0x49,0x44,0x0D,0x49,0x4E,0x54,0x33,  /* 000019D8    "CID.INT3" */
++    0x34,0x39,0x31,0x00,0x08,0x5F,0x55,0x49,  /* 000019E0    "491.._UI" */
++    0x44,0x0A,0x03,0x08,0x52,0x42,0x55,0x46,  /* 000019E8    "D...RBUF" */
++    0x11,0x48,0x05,0x0A,0x54,0x8E,0x23,0x00,  /* 000019F0    ".H..T.#." */
++    0x01,0x00,0x01,0x02,0x00,0x00,0x01,0x06,  /* 000019F8    "........" */
++    0x00,0x80,0x1A,0x06,0x00,0x27,0x00,0x5C,  /* 00001A00    ".....'.\" */
++    0x5F,0x53,0x42,0x2E,0x50,0x43,0x49,0x30,  /* 00001A08    "_SB.PCI0" */
++    0x2E,0x47,0x49,0x50,0x30,0x2E,0x49,0x32,  /* 00001A10    ".GIP0.I2" */
++    0x43,0x5F,0x00,0x8C,0x29,0x00,0x01,0x00,  /* 00001A18    "C_..)..." */
++    0x01,0x00,0x02,0x00,0x00,0x00,0x00,0x00,  /* 00001A20    "........" */
++    0x00,0x17,0x00,0x00,0x19,0x00,0x2C,0x00,  /* 00001A28    "......,." */
++    0x00,0x00,0x01,0x00,0x5C,0x5F,0x53,0x42,  /* 00001A30    "....\_SB" */
++    0x2E,0x50,0x43,0x49,0x30,0x2E,0x47,0x49,  /* 00001A38    ".PCI0.GI" */
++    0x50,0x30,0x2E,0x47,0x50,0x4F,0x00,0x79,  /* 00001A40    "P0.GPO.y" */
++    0x00,0x14,0x0B,0x5F,0x43,0x52,0x53,0x00,  /* 00001A48    "..._CRS." */
++    0xA4,0x52,0x42,0x55,0x46,0x14,0x15,0x5F,  /* 00001A50    ".RBUF.._" */
++    0x53,0x54,0x41,0x00,0xA0,0x0B,0x92,0x93,  /* 00001A58    "STA....." */
++    0x50,0x54,0x59,0x50,0x0A,0x08,0xA4,0x00,  /* 00001A60    "PTYP...." */
++    0xA4,0x0A,0x0F,0x5B,0x82,0x45,0x07,0x50,  /* 00001A68    "...[.E.P" */
++    0x57,0x4D,0x31,0x08,0x5F,0x48,0x49,0x44,  /* 00001A70    "WM1._HID" */
++    0x0D,0x49,0x4E,0x54,0x33,0x34,0x39,0x32,  /* 00001A78    ".INT3492" */
++    0x00,0x08,0x5F,0x43,0x49,0x44,0x0D,0x49,  /* 00001A80    ".._CID.I" */
++    0x4E,0x54,0x33,0x34,0x39,0x32,0x00,0x08,  /* 00001A88    "NT3492.." */
++    0x52,0x42,0x55,0x46,0x11,0x2B,0x0A,0x28,  /* 00001A90    "RBUF.+.(" */
++    0x8E,0x23,0x00,0x01,0x00,0x01,0x02,0x00,  /* 00001A98    ".#......" */
++    0x00,0x01,0x06,0x00,0x80,0x1A,0x06,0x00,  /* 00001AA0    "........" */
++    0x47,0x00,0x5C,0x5F,0x53,0x42,0x2E,0x50,  /* 00001AA8    "G.\_SB.P" */
++    0x43,0x49,0x30,0x2E,0x47,0x49,0x50,0x30,  /* 00001AB0    "CI0.GIP0" */
++    0x2E,0x49,0x32,0x43,0x5F,0x00,0x79,0x00,  /* 00001AB8    ".I2C_.y." */
++    0x14,0x0B,0x5F,0x43,0x52,0x53,0x00,0xA4,  /* 00001AC0    ".._CRS.." */
++    0x52,0x42,0x55,0x46,0x14,0x15,0x5F,0x53,  /* 00001AC8    "RBUF.._S" */
++    0x54,0x41,0x00,0xA0,0x0B,0x92,0x93,0x50,  /* 00001AD0    "TA.....P" */
++    0x54,0x59,0x50,0x0A,0x08,0xA4,0x00,0xA4,  /* 00001AD8    "TYP....." */
++    0x0A,0x0F,0x5B,0x82,0x45,0x07,0x45,0x45,  /* 00001AE0    "..[.E.EE" */
++    0x50,0x32,0x08,0x5F,0x48,0x49,0x44,0x0D,  /* 00001AE8    "P2._HID." */
++    0x49,0x4E,0x54,0x33,0x34,0x39,0x39,0x00,  /* 00001AF0    "INT3499." */
++    0x08,0x5F,0x43,0x49,0x44,0x0D,0x49,0x4E,  /* 00001AF8    "._CID.IN" */
++    0x54,0x33,0x34,0x39,0x39,0x00,0x08,0x52,  /* 00001B00    "T3499..R" */
++    0x42,0x55,0x46,0x11,0x2B,0x0A,0x28,0x8E,  /* 00001B08    "BUF.+.(." */
++    0x23,0x00,0x01,0x00,0x01,0x02,0x00,0x00,  /* 00001B10    "#......." */
++    0x01,0x06,0x00,0x80,0x1A,0x06,0x00,0x54,  /* 00001B18    ".......T" */
++    0x00,0x5C,0x5F,0x53,0x42,0x2E,0x50,0x43,  /* 00001B20    ".\_SB.PC" */
++    0x49,0x30,0x2E,0x47,0x49,0x50,0x30,0x2E,  /* 00001B28    "I0.GIP0." */
++    0x49,0x32,0x43,0x5F,0x00,0x79,0x00,0x14,  /* 00001B30    "I2C_.y.." */
++    0x0B,0x5F,0x43,0x52,0x53,0x00,0xA4,0x52,  /* 00001B38    "._CRS..R" */
++    0x42,0x55,0x46,0x14,0x15,0x5F,0x53,0x54,  /* 00001B40    "BUF.._ST" */
++    0x41,0x00,0xA0,0x0B,0x92,0x93,0x50,0x54,  /* 00001B48    "A.....PT" */
++    0x59,0x50,0x0A,0x08,0xA4,0x00,0xA4,0x0A,  /* 00001B50    "YP......" */
++    0x0F,0x5B,0x82,0x4A,0x89,0x47,0x50,0x4F,  /* 00001B58    ".[.J.GPO" */
++    0x54,0x08,0x5F,0x48,0x49,0x44,0x0D,0x49,  /* 00001B60    "T._HID.I" */
++    0x4E,0x54,0x33,0x34,0x39,0x41,0x00,0x08,  /* 00001B68    "NT349A.." */
++    0x5F,0x43,0x49,0x44,0x0D,0x49,0x4E,0x54,  /* 00001B70    "_CID.INT" */
++    0x33,0x34,0x39,0x41,0x00,0x14,0x41,0x86,  /* 00001B78    "349A..A." */
++    0x5F,0x43,0x52,0x53,0x00,0x08,0x52,0x42,  /* 00001B80    "_CRS..RB" */
++    0x55,0x46,0x11,0x4F,0x84,0x0B,0x4A,0x08,  /* 00001B88    "UF.O..J." */
++    0x8C,0x2A,0x00,0x01,0x01,0x01,0x00,0x08,  /* 00001B90    ".*......" */
++    0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x00,  /* 00001B98    "........" */
++    0x00,0x19,0x00,0x2D,0x00,0x00,0x00,0x00,  /* 00001BA0    "...-...." */
++    0x00,0x5C,0x5F,0x53,0x42,0x2E,0x50,0x43,  /* 00001BA8    ".\_SB.PC" */
++    0x49,0x30,0x2E,0x47,0x49,0x50,0x30,0x2E,  /* 00001BB0    "I0.GIP0." */
++    0x47,0x50,0x4F,0x5F,0x00,0x8C,0x2A,0x00,  /* 00001BB8    "GPO_..*." */
++    0x01,0x01,0x01,0x00,0x08,0x00,0x00,0x00,  /* 00001BC0    "........" */
++    0x00,0x00,0x00,0x17,0x00,0x00,0x19,0x00,  /* 00001BC8    "........" */
++    0x2D,0x00,0x00,0x00,0x01,0x00,0x5C,0x5F,  /* 00001BD0    "-.....\_" */
++    0x53,0x42,0x2E,0x50,0x43,0x49,0x30,0x2E,  /* 00001BD8    "SB.PCI0." */
++    0x47,0x49,0x50,0x30,0x2E,0x47,0x50,0x4F,  /* 00001BE0    "GIP0.GPO" */
++    0x5F,0x00,0x8C,0x2A,0x00,0x01,0x01,0x01,  /* 00001BE8    "_..*...." */
++    0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00001BF0    "........" */
++    0x17,0x00,0x00,0x19,0x00,0x2D,0x00,0x00,  /* 00001BF8    ".....-.." */
++    0x00,0x02,0x00,0x5C,0x5F,0x53,0x42,0x2E,  /* 00001C00    "...\_SB." */
++    0x50,0x43,0x49,0x30,0x2E,0x47,0x49,0x50,  /* 00001C08    "PCI0.GIP" */
++    0x30,0x2E,0x47,0x50,0x4F,0x5F,0x00,0x8C,  /* 00001C10    "0.GPO_.." */
++    0x2A,0x00,0x01,0x01,0x01,0x00,0x08,0x00,  /* 00001C18    "*......." */
++    0x00,0x00,0x00,0x00,0x00,0x17,0x00,0x00,  /* 00001C20    "........" */
++    0x19,0x00,0x2D,0x00,0x00,0x00,0x03,0x00,  /* 00001C28    "..-....." */
++    0x5C,0x5F,0x53,0x42,0x2E,0x50,0x43,0x49,  /* 00001C30    "\_SB.PCI" */
++    0x30,0x2E,0x47,0x49,0x50,0x30,0x2E,0x47,  /* 00001C38    "0.GIP0.G" */
++    0x50,0x4F,0x5F,0x00,0x8C,0x2A,0x00,0x01,  /* 00001C40    "PO_..*.." */
++    0x01,0x01,0x00,0x08,0x00,0x00,0x00,0x00,  /* 00001C48    "........" */
++    0x00,0x00,0x17,0x00,0x00,0x19,0x00,0x2D,  /* 00001C50    ".......-" */
++    0x00,0x00,0x00,0x04,0x00,0x5C,0x5F,0x53,  /* 00001C58    ".....\_S" */
++    0x42,0x2E,0x50,0x43,0x49,0x30,0x2E,0x47,  /* 00001C60    "B.PCI0.G" */
++    0x49,0x50,0x30,0x2E,0x47,0x50,0x4F,0x5F,  /* 00001C68    "IP0.GPO_" */
++    0x00,0x8C,0x2A,0x00,0x01,0x01,0x01,0x00,  /* 00001C70    "..*....." */
++    0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x17,  /* 00001C78    "........" */
++    0x00,0x00,0x19,0x00,0x2D,0x00,0x00,0x00,  /* 00001C80    "....-..." */
++    0x05,0x00,0x5C,0x5F,0x53,0x42,0x2E,0x50,  /* 00001C88    "..\_SB.P" */
++    0x43,0x49,0x30,0x2E,0x47,0x49,0x50,0x30,  /* 00001C90    "CI0.GIP0" */
++    0x2E,0x47,0x50,0x4F,0x5F,0x00,0x8C,0x2A,  /* 00001C98    ".GPO_..*" */
++    0x00,0x01,0x01,0x01,0x00,0x08,0x00,0x00,  /* 00001CA0    "........" */
++    0x00,0x00,0x00,0x00,0x17,0x00,0x00,0x19,  /* 00001CA8    "........" */
++    0x00,0x2D,0x00,0x00,0x00,0x06,0x00,0x5C,  /* 00001CB0    ".-.....\" */
++    0x5F,0x53,0x42,0x2E,0x50,0x43,0x49,0x30,  /* 00001CB8    "_SB.PCI0" */
++    0x2E,0x47,0x49,0x50,0x30,0x2E,0x47,0x50,  /* 00001CC0    ".GIP0.GP" */
++    0x4F,0x5F,0x00,0x8C,0x2A,0x00,0x01,0x01,  /* 00001CC8    "O_..*..." */
++    0x01,0x00,0x08,0x00,0x00,0x00,0x00,0x00,  /* 00001CD0    "........" */
++    0x00,0x17,0x00,0x00,0x19,0x00,0x2D,0x00,  /* 00001CD8    "......-." */
++    0x00,0x00,0x07,0x00,0x5C,0x5F,0x53,0x42,  /* 00001CE0    "....\_SB" */
++    0x2E,0x50,0x43,0x49,0x30,0x2E,0x47,0x49,  /* 00001CE8    ".PCI0.GI" */
++    0x50,0x30,0x2E,0x47,0x50,0x4F,0x5F,0x00,  /* 00001CF0    "P0.GPO_." */
++    0x8C,0x2A,0x00,0x01,0x01,0x01,0x00,0x08,  /* 00001CF8    ".*......" */
++    0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x00,  /* 00001D00    "........" */
++    0x00,0x19,0x00,0x2D,0x00,0x00,0x00,0x08,  /* 00001D08    "...-...." */
++    0x00,0x5C,0x5F,0x53,0x42,0x2E,0x50,0x43,  /* 00001D10    ".\_SB.PC" */
++    0x49,0x30,0x2E,0x47,0x49,0x50,0x30,0x2E,  /* 00001D18    "I0.GIP0." */
++    0x47,0x50,0x4F,0x5F,0x00,0x8C,0x2A,0x00,  /* 00001D20    "GPO_..*." */
++    0x01,0x01,0x01,0x00,0x08,0x00,0x00,0x00,  /* 00001D28    "........" */
++    0x00,0x00,0x00,0x17,0x00,0x00,0x19,0x00,  /* 00001D30    "........" */
++    0x2D,0x00,0x00,0x00,0x09,0x00,0x5C,0x5F,  /* 00001D38    "-.....\_" */
++    0x53,0x42,0x2E,0x50,0x43,0x49,0x30,0x2E,  /* 00001D40    "SB.PCI0." */
++    0x47,0x49,0x50,0x30,0x2E,0x47,0x50,0x4F,  /* 00001D48    "GIP0.GPO" */
++    0x5F,0x00,0x8C,0x2A,0x00,0x01,0x01,0x01,  /* 00001D50    "_..*...." */
++    0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00001D58    "........" */
++    0x17,0x00,0x00,0x19,0x00,0x2D,0x00,0x00,  /* 00001D60    ".....-.." */
++    0x00,0x0A,0x00,0x5C,0x5F,0x53,0x42,0x2E,  /* 00001D68    "...\_SB." */
++    0x50,0x43,0x49,0x30,0x2E,0x47,0x49,0x50,  /* 00001D70    "PCI0.GIP" */
++    0x30,0x2E,0x47,0x50,0x4F,0x5F,0x00,0x8C,  /* 00001D78    "0.GPO_.." */
++    0x2A,0x00,0x01,0x01,0x01,0x00,0x08,0x00,  /* 00001D80    "*......." */
++    0x00,0x00,0x00,0x00,0x00,0x17,0x00,0x00,  /* 00001D88    "........" */
++    0x19,0x00,0x2D,0x00,0x00,0x00,0x0B,0x00,  /* 00001D90    "..-....." */
++    0x5C,0x5F,0x53,0x42,0x2E,0x50,0x43,0x49,  /* 00001D98    "\_SB.PCI" */
++    0x30,0x2E,0x47,0x49,0x50,0x30,0x2E,0x47,  /* 00001DA0    "0.GIP0.G" */
++    0x50,0x4F,0x5F,0x00,0x8C,0x2A,0x00,0x01,  /* 00001DA8    "PO_..*.." */
++    0x01,0x01,0x00,0x08,0x00,0x00,0x00,0x00,  /* 00001DB0    "........" */
++    0x00,0x00,0x17,0x00,0x00,0x19,0x00,0x2D,  /* 00001DB8    ".......-" */
++    0x00,0x00,0x00,0x0C,0x00,0x5C,0x5F,0x53,  /* 00001DC0    ".....\_S" */
++    0x42,0x2E,0x50,0x43,0x49,0x30,0x2E,0x47,  /* 00001DC8    "B.PCI0.G" */
++    0x49,0x50,0x30,0x2E,0x47,0x50,0x4F,0x5F,  /* 00001DD0    "IP0.GPO_" */
++    0x00,0x8C,0x2A,0x00,0x01,0x01,0x01,0x00,  /* 00001DD8    "..*....." */
++    0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x17,  /* 00001DE0    "........" */
++    0x00,0x00,0x19,0x00,0x2D,0x00,0x00,0x00,  /* 00001DE8    "....-..." */
++    0x0D,0x00,0x5C,0x5F,0x53,0x42,0x2E,0x50,  /* 00001DF0    "..\_SB.P" */
++    0x43,0x49,0x30,0x2E,0x47,0x49,0x50,0x30,  /* 00001DF8    "CI0.GIP0" */
++    0x2E,0x47,0x50,0x4F,0x5F,0x00,0x8C,0x2A,  /* 00001E00    ".GPO_..*" */
++    0x00,0x01,0x01,0x01,0x00,0x08,0x00,0x00,  /* 00001E08    "........" */
++    0x00,0x00,0x00,0x00,0x17,0x00,0x00,0x19,  /* 00001E10    "........" */
++    0x00,0x2D,0x00,0x00,0x00,0x0E,0x00,0x5C,  /* 00001E18    ".-.....\" */
++    0x5F,0x53,0x42,0x2E,0x50,0x43,0x49,0x30,  /* 00001E20    "_SB.PCI0" */
++    0x2E,0x47,0x49,0x50,0x30,0x2E,0x47,0x50,  /* 00001E28    ".GIP0.GP" */
++    0x4F,0x5F,0x00,0x8C,0x2A,0x00,0x01,0x01,  /* 00001E30    "O_..*..." */
++    0x01,0x00,0x08,0x00,0x00,0x00,0x00,0x00,  /* 00001E38    "........" */
++    0x00,0x17,0x00,0x00,0x19,0x00,0x2D,0x00,  /* 00001E40    "......-." */
++    0x00,0x00,0x0F,0x00,0x5C,0x5F,0x53,0x42,  /* 00001E48    "....\_SB" */
++    0x2E,0x50,0x43,0x49,0x30,0x2E,0x47,0x49,  /* 00001E50    ".PCI0.GI" */
++    0x50,0x30,0x2E,0x47,0x50,0x4F,0x5F,0x00,  /* 00001E58    "P0.GPO_." */
++    0x8C,0x20,0x00,0x01,0x01,0x01,0x00,0x08,  /* 00001E60    ". ......" */
++    0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x00,  /* 00001E68    "........" */
++    0x00,0x19,0x00,0x23,0x00,0x00,0x00,0x00,  /* 00001E70    "...#...." */
++    0x00,0x5C,0x5F,0x53,0x42,0x2E,0x43,0x59,  /* 00001E78    ".\_SB.CY" */
++    0x38,0x43,0x00,0x8C,0x20,0x00,0x01,0x01,  /* 00001E80    "8C.. ..." */
++    0x01,0x00,0x08,0x00,0x00,0x00,0x00,0x00,  /* 00001E88    "........" */
++    0x00,0x17,0x00,0x00,0x19,0x00,0x23,0x00,  /* 00001E90    "......#." */
++    0x00,0x00,0x01,0x00,0x5C,0x5F,0x53,0x42,  /* 00001E98    "....\_SB" */
++    0x2E,0x43,0x59,0x38,0x43,0x00,0x8C,0x20,  /* 00001EA0    ".CY8C.. " */
++    0x00,0x01,0x01,0x01,0x00,0x08,0x00,0x00,  /* 00001EA8    "........" */
++    0x00,0x00,0x00,0x00,0x17,0x00,0x00,0x19,  /* 00001EB0    "........" */
++    0x00,0x23,0x00,0x00,0x00,0x02,0x00,0x5C,  /* 00001EB8    ".#.....\" */
++    0x5F,0x53,0x42,0x2E,0x43,0x59,0x38,0x43,  /* 00001EC0    "_SB.CY8C" */
++    0x00,0x8C,0x20,0x00,0x01,0x01,0x01,0x00,  /* 00001EC8    ".. ....." */
++    0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x17,  /* 00001ED0    "........" */
++    0x00,0x00,0x19,0x00,0x23,0x00,0x00,0x00,  /* 00001ED8    "....#..." */
++    0x03,0x00,0x5C,0x5F,0x53,0x42,0x2E,0x43,  /* 00001EE0    "..\_SB.C" */
++    0x59,0x38,0x43,0x00,0x8C,0x20,0x00,0x01,  /* 00001EE8    "Y8C.. .." */
++    0x01,0x01,0x00,0x08,0x00,0x00,0x00,0x00,  /* 00001EF0    "........" */
++    0x00,0x00,0x17,0x00,0x00,0x19,0x00,0x23,  /* 00001EF8    ".......#" */
++    0x00,0x00,0x00,0x04,0x00,0x5C,0x5F,0x53,  /* 00001F00    ".....\_S" */
++    0x42,0x2E,0x43,0x59,0x38,0x43,0x00,0x8C,  /* 00001F08    "B.CY8C.." */
++    0x20,0x00,0x01,0x01,0x01,0x00,0x08,0x00,  /* 00001F10    " ......." */
++    0x00,0x00,0x00,0x00,0x00,0x17,0x00,0x00,  /* 00001F18    "........" */
++    0x19,0x00,0x23,0x00,0x00,0x00,0x05,0x00,  /* 00001F20    "..#....." */
++    0x5C,0x5F,0x53,0x42,0x2E,0x43,0x59,0x38,  /* 00001F28    "\_SB.CY8" */
++    0x43,0x00,0x8C,0x20,0x00,0x01,0x01,0x01,  /* 00001F30    "C.. ...." */
++    0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00001F38    "........" */
++    0x17,0x00,0x00,0x19,0x00,0x23,0x00,0x00,  /* 00001F40    ".....#.." */
++    0x00,0x06,0x00,0x5C,0x5F,0x53,0x42,0x2E,  /* 00001F48    "...\_SB." */
++    0x43,0x59,0x38,0x43,0x00,0x8C,0x20,0x00,  /* 00001F50    "CY8C.. ." */
++    0x01,0x01,0x01,0x00,0x08,0x00,0x00,0x00,  /* 00001F58    "........" */
++    0x00,0x00,0x00,0x17,0x00,0x00,0x19,0x00,  /* 00001F60    "........" */
++    0x23,0x00,0x00,0x00,0x07,0x00,0x5C,0x5F,  /* 00001F68    "#.....\_" */
++    0x53,0x42,0x2E,0x43,0x59,0x38,0x43,0x00,  /* 00001F70    "SB.CY8C." */
++    0x8C,0x20,0x00,0x01,0x01,0x01,0x00,0x08,  /* 00001F78    ". ......" */
++    0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x00,  /* 00001F80    "........" */
++    0x00,0x19,0x00,0x23,0x00,0x00,0x00,0x08,  /* 00001F88    "...#...." */
++    0x00,0x5C,0x5F,0x53,0x42,0x2E,0x43,0x59,  /* 00001F90    ".\_SB.CY" */
++    0x38,0x43,0x00,0x8C,0x20,0x00,0x01,0x01,  /* 00001F98    "8C.. ..." */
++    0x01,0x00,0x08,0x00,0x00,0x00,0x00,0x00,  /* 00001FA0    "........" */
++    0x00,0x17,0x00,0x00,0x19,0x00,0x23,0x00,  /* 00001FA8    "......#." */
++    0x00,0x00,0x09,0x00,0x5C,0x5F,0x53,0x42,  /* 00001FB0    "....\_SB" */
++    0x2E,0x43,0x59,0x38,0x43,0x00,0x8C,0x20,  /* 00001FB8    ".CY8C.. " */
++    0x00,0x01,0x01,0x01,0x00,0x08,0x00,0x00,  /* 00001FC0    "........" */
++    0x00,0x00,0x00,0x00,0x17,0x00,0x00,0x19,  /* 00001FC8    "........" */
++    0x00,0x23,0x00,0x00,0x00,0x0A,0x00,0x5C,  /* 00001FD0    ".#.....\" */
++    0x5F,0x53,0x42,0x2E,0x43,0x59,0x38,0x43,  /* 00001FD8    "_SB.CY8C" */
++    0x00,0x8C,0x20,0x00,0x01,0x01,0x01,0x00,  /* 00001FE0    ".. ....." */
++    0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x17,  /* 00001FE8    "........" */
++    0x00,0x00,0x19,0x00,0x23,0x00,0x00,0x00,  /* 00001FF0    "....#..." */
++    0x0B,0x00,0x5C,0x5F,0x53,0x42,0x2E,0x43,  /* 00001FF8    "..\_SB.C" */
++    0x59,0x38,0x43,0x00,0x8C,0x20,0x00,0x01,  /* 00002000    "Y8C.. .." */
++    0x01,0x01,0x00,0x08,0x00,0x00,0x00,0x00,  /* 00002008    "........" */
++    0x00,0x00,0x17,0x00,0x00,0x19,0x00,0x23,  /* 00002010    ".......#" */
++    0x00,0x00,0x00,0x0C,0x00,0x5C,0x5F,0x53,  /* 00002018    ".....\_S" */
++    0x42,0x2E,0x43,0x59,0x38,0x43,0x00,0x8C,  /* 00002020    "B.CY8C.." */
++    0x20,0x00,0x01,0x01,0x01,0x00,0x08,0x00,  /* 00002028    " ......." */
++    0x00,0x00,0x00,0x00,0x00,0x17,0x00,0x00,  /* 00002030    "........" */
++    0x19,0x00,0x23,0x00,0x00,0x00,0x0D,0x00,  /* 00002038    "..#....." */
++    0x5C,0x5F,0x53,0x42,0x2E,0x43,0x59,0x38,  /* 00002040    "\_SB.CY8" */
++    0x43,0x00,0x8C,0x20,0x00,0x01,0x01,0x01,  /* 00002048    "C.. ...." */
++    0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00002050    "........" */
++    0x17,0x00,0x00,0x19,0x00,0x23,0x00,0x00,  /* 00002058    ".....#.." */
++    0x00,0x0E,0x00,0x5C,0x5F,0x53,0x42,0x2E,  /* 00002060    "...\_SB." */
++    0x43,0x59,0x38,0x43,0x00,0x8C,0x20,0x00,  /* 00002068    "CY8C.. ." */
++    0x01,0x01,0x01,0x00,0x08,0x00,0x00,0x00,  /* 00002070    "........" */
++    0x00,0x00,0x00,0x17,0x00,0x00,0x19,0x00,  /* 00002078    "........" */
++    0x23,0x00,0x00,0x00,0x0F,0x00,0x5C,0x5F,  /* 00002080    "#.....\_" */
++    0x53,0x42,0x2E,0x43,0x59,0x38,0x43,0x00,  /* 00002088    "SB.CY8C." */
++    0x8C,0x20,0x00,0x01,0x01,0x01,0x00,0x08,  /* 00002090    ". ......" */
++    0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x00,  /* 00002098    "........" */
++    0x00,0x19,0x00,0x23,0x00,0x00,0x00,0x10,  /* 000020A0    "...#...." */
++    0x00,0x5C,0x5F,0x53,0x42,0x2E,0x43,0x59,  /* 000020A8    ".\_SB.CY" */
++    0x38,0x43,0x00,0x8C,0x20,0x00,0x01,0x01,  /* 000020B0    "8C.. ..." */
++    0x01,0x00,0x08,0x00,0x00,0x00,0x00,0x00,  /* 000020B8    "........" */
++    0x00,0x17,0x00,0x00,0x19,0x00,0x23,0x00,  /* 000020C0    "......#." */
++    0x00,0x00,0x11,0x00,0x5C,0x5F,0x53,0x42,  /* 000020C8    "....\_SB" */
++    0x2E,0x43,0x59,0x38,0x43,0x00,0x8C,0x20,  /* 000020D0    ".CY8C.. " */
++    0x00,0x01,0x01,0x01,0x00,0x08,0x00,0x00,  /* 000020D8    "........" */
++    0x00,0x00,0x00,0x00,0x17,0x00,0x00,0x19,  /* 000020E0    "........" */
++    0x00,0x23,0x00,0x00,0x00,0x12,0x00,0x5C,  /* 000020E8    ".#.....\" */
++    0x5F,0x53,0x42,0x2E,0x43,0x59,0x38,0x43,  /* 000020F0    "_SB.CY8C" */
++    0x00,0x8C,0x20,0x00,0x01,0x01,0x01,0x00,  /* 000020F8    ".. ....." */
++    0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x17,  /* 00002100    "........" */
++    0x00,0x00,0x19,0x00,0x23,0x00,0x00,0x00,  /* 00002108    "....#..." */
++    0x13,0x00,0x5C,0x5F,0x53,0x42,0x2E,0x43,  /* 00002110    "..\_SB.C" */
++    0x59,0x38,0x43,0x00,0x8C,0x20,0x00,0x01,  /* 00002118    "Y8C.. .." */
++    0x01,0x01,0x00,0x08,0x00,0x00,0x00,0x00,  /* 00002120    "........" */
++    0x00,0x00,0x17,0x00,0x00,0x19,0x00,0x23,  /* 00002128    ".......#" */
++    0x00,0x00,0x00,0x14,0x00,0x5C,0x5F,0x53,  /* 00002130    ".....\_S" */
++    0x42,0x2E,0x43,0x59,0x38,0x43,0x00,0x8C,  /* 00002138    "B.CY8C.." */
++    0x20,0x00,0x01,0x01,0x01,0x00,0x08,0x00,  /* 00002140    " ......." */
++    0x00,0x00,0x00,0x00,0x00,0x17,0x00,0x00,  /* 00002148    "........" */
++    0x19,0x00,0x23,0x00,0x00,0x00,0x15,0x00,  /* 00002150    "..#....." */
++    0x5C,0x5F,0x53,0x42,0x2E,0x43,0x59,0x38,  /* 00002158    "\_SB.CY8" */
++    0x43,0x00,0x8C,0x20,0x00,0x01,0x01,0x01,  /* 00002160    "C.. ...." */
++    0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00002168    "........" */
++    0x17,0x00,0x00,0x19,0x00,0x23,0x00,0x00,  /* 00002170    ".....#.." */
++    0x00,0x16,0x00,0x5C,0x5F,0x53,0x42,0x2E,  /* 00002178    "...\_SB." */
++    0x43,0x59,0x38,0x43,0x00,0x8C,0x20,0x00,  /* 00002180    "CY8C.. ." */
++    0x01,0x01,0x01,0x00,0x08,0x00,0x00,0x00,  /* 00002188    "........" */
++    0x00,0x00,0x00,0x17,0x00,0x00,0x19,0x00,  /* 00002190    "........" */
++    0x23,0x00,0x00,0x00,0x17,0x00,0x5C,0x5F,  /* 00002198    "#.....\_" */
++    0x53,0x42,0x2E,0x43,0x59,0x38,0x43,0x00,  /* 000021A0    "SB.CY8C." */
++    0x8C,0x20,0x00,0x01,0x01,0x01,0x00,0x08,  /* 000021A8    ". ......" */
++    0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x00,  /* 000021B0    "........" */
++    0x00,0x19,0x00,0x23,0x00,0x00,0x00,0x18,  /* 000021B8    "...#...." */
++    0x00,0x5C,0x5F,0x53,0x42,0x2E,0x43,0x59,  /* 000021C0    ".\_SB.CY" */
++    0x38,0x43,0x00,0x8C,0x20,0x00,0x01,0x01,  /* 000021C8    "8C.. ..." */
++    0x01,0x00,0x08,0x00,0x00,0x00,0x00,0x00,  /* 000021D0    "........" */
++    0x00,0x17,0x00,0x00,0x19,0x00,0x23,0x00,  /* 000021D8    "......#." */
++    0x00,0x00,0x19,0x00,0x5C,0x5F,0x53,0x42,  /* 000021E0    "....\_SB" */
++    0x2E,0x43,0x59,0x38,0x43,0x00,0x8C,0x20,  /* 000021E8    ".CY8C.. " */
++    0x00,0x01,0x01,0x01,0x00,0x08,0x00,0x00,  /* 000021F0    "........" */
++    0x00,0x00,0x00,0x00,0x17,0x00,0x00,0x19,  /* 000021F8    "........" */
++    0x00,0x23,0x00,0x00,0x00,0x1A,0x00,0x5C,  /* 00002200    ".#.....\" */
++    0x5F,0x53,0x42,0x2E,0x43,0x59,0x38,0x43,  /* 00002208    "_SB.CY8C" */
++    0x00,0x8C,0x20,0x00,0x01,0x01,0x01,0x00,  /* 00002210    ".. ....." */
++    0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x17,  /* 00002218    "........" */
++    0x00,0x00,0x19,0x00,0x23,0x00,0x00,0x00,  /* 00002220    "....#..." */
++    0x1B,0x00,0x5C,0x5F,0x53,0x42,0x2E,0x43,  /* 00002228    "..\_SB.C" */
++    0x59,0x38,0x43,0x00,0x8C,0x20,0x00,0x01,  /* 00002230    "Y8C.. .." */
++    0x01,0x01,0x00,0x08,0x00,0x00,0x00,0x00,  /* 00002238    "........" */
++    0x00,0x00,0x17,0x00,0x00,0x19,0x00,0x23,  /* 00002240    ".......#" */
++    0x00,0x00,0x00,0x1C,0x00,0x5C,0x5F,0x53,  /* 00002248    ".....\_S" */
++    0x42,0x2E,0x43,0x59,0x38,0x43,0x00,0x8C,  /* 00002250    "B.CY8C.." */
++    0x20,0x00,0x01,0x01,0x01,0x00,0x08,0x00,  /* 00002258    " ......." */
++    0x00,0x00,0x00,0x00,0x00,0x17,0x00,0x00,  /* 00002260    "........" */
++    0x19,0x00,0x23,0x00,0x00,0x00,0x1D,0x00,  /* 00002268    "..#....." */
++    0x5C,0x5F,0x53,0x42,0x2E,0x43,0x59,0x38,  /* 00002270    "\_SB.CY8" */
++    0x43,0x00,0x8C,0x20,0x00,0x01,0x01,0x01,  /* 00002278    "C.. ...." */
++    0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00002280    "........" */
++    0x17,0x00,0x00,0x19,0x00,0x23,0x00,0x00,  /* 00002288    ".....#.." */
++    0x00,0x1E,0x00,0x5C,0x5F,0x53,0x42,0x2E,  /* 00002290    "...\_SB." */
++    0x43,0x59,0x38,0x43,0x00,0x8C,0x20,0x00,  /* 00002298    "CY8C.. ." */
++    0x01,0x01,0x01,0x00,0x08,0x00,0x00,0x00,  /* 000022A0    "........" */
++    0x00,0x00,0x00,0x17,0x00,0x00,0x19,0x00,  /* 000022A8    "........" */
++    0x23,0x00,0x00,0x00,0x1F,0x00,0x5C,0x5F,  /* 000022B0    "#.....\_" */
++    0x53,0x42,0x2E,0x43,0x59,0x38,0x43,0x00,  /* 000022B8    "SB.CY8C." */
++    0x8C,0x20,0x00,0x01,0x01,0x01,0x00,0x08,  /* 000022C0    ". ......" */
++    0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x00,  /* 000022C8    "........" */
++    0x00,0x19,0x00,0x23,0x00,0x00,0x00,0x20,  /* 000022D0    "...#... " */
++    0x00,0x5C,0x5F,0x53,0x42,0x2E,0x43,0x59,  /* 000022D8    ".\_SB.CY" */
++    0x38,0x43,0x00,0x8C,0x20,0x00,0x01,0x01,  /* 000022E0    "8C.. ..." */
++    0x01,0x00,0x08,0x00,0x00,0x00,0x00,0x00,  /* 000022E8    "........" */
++    0x00,0x17,0x00,0x00,0x19,0x00,0x23,0x00,  /* 000022F0    "......#." */
++    0x00,0x00,0x21,0x00,0x5C,0x5F,0x53,0x42,  /* 000022F8    "..!.\_SB" */
++    0x2E,0x43,0x59,0x38,0x43,0x00,0x8C,0x20,  /* 00002300    ".CY8C.. " */
++    0x00,0x01,0x01,0x01,0x00,0x08,0x00,0x00,  /* 00002308    "........" */
++    0x00,0x00,0x00,0x00,0x17,0x00,0x00,0x19,  /* 00002310    "........" */
++    0x00,0x23,0x00,0x00,0x00,0x22,0x00,0x5C,  /* 00002318    ".#...".\" */
++    0x5F,0x53,0x42,0x2E,0x43,0x59,0x38,0x43,  /* 00002320    "_SB.CY8C" */
++    0x00,0x8C,0x20,0x00,0x01,0x01,0x01,0x00,  /* 00002328    ".. ....." */
++    0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x17,  /* 00002330    "........" */
++    0x00,0x00,0x19,0x00,0x23,0x00,0x00,0x00,  /* 00002338    "....#..." */
++    0x23,0x00,0x5C,0x5F,0x53,0x42,0x2E,0x43,  /* 00002340    "#.\_SB.C" */
++    0x59,0x38,0x43,0x00,0x8C,0x20,0x00,0x01,  /* 00002348    "Y8C.. .." */
++    0x01,0x01,0x00,0x08,0x00,0x00,0x00,0x00,  /* 00002350    "........" */
++    0x00,0x00,0x17,0x00,0x00,0x19,0x00,0x23,  /* 00002358    ".......#" */
++    0x00,0x00,0x00,0x24,0x00,0x5C,0x5F,0x53,  /* 00002360    "...$.\_S" */
++    0x42,0x2E,0x43,0x59,0x38,0x43,0x00,0x8C,  /* 00002368    "B.CY8C.." */
++    0x20,0x00,0x01,0x01,0x01,0x00,0x08,0x00,  /* 00002370    " ......." */
++    0x00,0x00,0x00,0x00,0x00,0x17,0x00,0x00,  /* 00002378    "........" */
++    0x19,0x00,0x23,0x00,0x00,0x00,0x25,0x00,  /* 00002380    "..#...%." */
++    0x5C,0x5F,0x53,0x42,0x2E,0x43,0x59,0x38,  /* 00002388    "\_SB.CY8" */
++    0x43,0x00,0x8C,0x20,0x00,0x01,0x01,0x01,  /* 00002390    "C.. ...." */
++    0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00002398    "........" */
++    0x17,0x00,0x00,0x19,0x00,0x23,0x00,0x00,  /* 000023A0    ".....#.." */
++    0x00,0x26,0x00,0x5C,0x5F,0x53,0x42,0x2E,  /* 000023A8    ".&.\_SB." */
++    0x43,0x59,0x38,0x43,0x00,0x8C,0x20,0x00,  /* 000023B0    "CY8C.. ." */
++    0x01,0x01,0x01,0x00,0x08,0x00,0x00,0x00,  /* 000023B8    "........" */
++    0x00,0x00,0x00,0x17,0x00,0x00,0x19,0x00,  /* 000023C0    "........" */
++    0x23,0x00,0x00,0x00,0x27,0x00,0x5C,0x5F,  /* 000023C8    "#...'.\_" */
++    0x53,0x42,0x2E,0x43,0x59,0x38,0x43,0x00,  /* 000023D0    "SB.CY8C." */
++    0x79,0x00,0xA4,0x52,0x42,0x55,0x46,0x14,  /* 000023D8    "y..RBUF." */
++    0x15,0x5F,0x53,0x54,0x41,0x00,0xA0,0x0B,  /* 000023E0    "._STA..." */
++    0x92,0x93,0x50,0x54,0x59,0x50,0x0A,0x06,  /* 000023E8    "..PTYP.." */
++    0xA4,0x00,0xA4,0x0A,0x0F                  /* 000023F0    "....."    */
++};
+-- 
+2.5.0
+

+ 4499 - 0
board/PSG/iot2000/linux-4.4.config

@@ -0,0 +1,4499 @@
+#
+# Automatically generated file; DO NOT EDIT.
+# Linux/i386 4.4.89 Kernel Configuration
+#
+# CONFIG_64BIT is not set
+CONFIG_X86_32=y
+CONFIG_X86=y
+CONFIG_INSTRUCTION_DECODER=y
+CONFIG_PERF_EVENTS_INTEL_UNCORE=y
+CONFIG_OUTPUT_FORMAT="elf32-i386"
+CONFIG_ARCH_DEFCONFIG="arch/x86/configs/i386_defconfig"
+CONFIG_LOCKDEP_SUPPORT=y
+CONFIG_STACKTRACE_SUPPORT=y
+CONFIG_HAVE_LATENCYTOP_SUPPORT=y
+CONFIG_MMU=y
+CONFIG_NEED_SG_DMA_LENGTH=y
+CONFIG_GENERIC_ISA_DMA=y
+CONFIG_GENERIC_BUG=y
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_ARCH_HAS_CPU_RELAX=y
+CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y
+CONFIG_HAVE_SETUP_PER_CPU_AREA=y
+CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y
+CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y
+CONFIG_ARCH_HIBERNATION_POSSIBLE=y
+CONFIG_ARCH_SUSPEND_POSSIBLE=y
+CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y
+CONFIG_ARCH_WANT_GENERAL_HUGETLB=y
+CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING=y
+CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y
+CONFIG_X86_32_LAZY_GS=y
+CONFIG_ARCH_HWEIGHT_CFLAGS="-fcall-saved-ecx -fcall-saved-edx"
+CONFIG_ARCH_SUPPORTS_UPROBES=y
+CONFIG_FIX_EARLYCON_MEM=y
+CONFIG_PGTABLE_LEVELS=2
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+CONFIG_IRQ_WORK=y
+CONFIG_BUILDTIME_EXTABLE_SORT=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="-yocto-preempt-rt"
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_HAVE_KERNEL_GZIP=y
+CONFIG_HAVE_KERNEL_BZIP2=y
+CONFIG_HAVE_KERNEL_LZMA=y
+CONFIG_HAVE_KERNEL_XZ=y
+CONFIG_HAVE_KERNEL_LZO=y
+CONFIG_HAVE_KERNEL_LZ4=y
+CONFIG_KERNEL_GZIP=y
+# CONFIG_KERNEL_BZIP2 is not set
+# CONFIG_KERNEL_LZMA is not set
+# CONFIG_KERNEL_XZ is not set
+# CONFIG_KERNEL_LZO is not set
+# CONFIG_KERNEL_LZ4 is not set
+CONFIG_DEFAULT_HOSTNAME="(none)"
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+CONFIG_SYSVIPC_SYSCTL=y
+CONFIG_POSIX_MQUEUE=y
+CONFIG_POSIX_MQUEUE_SYSCTL=y
+CONFIG_CROSS_MEMORY_ATTACH=y
+CONFIG_FHANDLE=y
+CONFIG_USELIB=y
+# CONFIG_AUDIT is not set
+CONFIG_HAVE_ARCH_AUDITSYSCALL=y
+
+#
+# IRQ subsystem
+#
+CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_GENERIC_IRQ_SHOW=y
+CONFIG_GENERIC_IRQ_CHIP=y
+CONFIG_IRQ_DOMAIN=y
+CONFIG_IRQ_DOMAIN_HIERARCHY=y
+CONFIG_GENERIC_MSI_IRQ=y
+CONFIG_GENERIC_MSI_IRQ_DOMAIN=y
+# CONFIG_IRQ_DOMAIN_DEBUG is not set
+CONFIG_IRQ_FORCED_THREADING=y
+CONFIG_SPARSE_IRQ=y
+CONFIG_CLOCKSOURCE_WATCHDOG=y
+CONFIG_ARCH_CLOCKSOURCE_DATA=y
+CONFIG_CLOCKSOURCE_VALIDATE_LAST_CYCLE=y
+CONFIG_GENERIC_TIME_VSYSCALL=y
+CONFIG_GENERIC_CLOCKEVENTS=y
+CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
+CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST=y
+CONFIG_GENERIC_CMOS_UPDATE=y
+
+#
+# Timers subsystem
+#
+CONFIG_TICK_ONESHOT=y
+CONFIG_NO_HZ_COMMON=y
+# CONFIG_HZ_PERIODIC is not set
+CONFIG_NO_HZ_IDLE=y
+CONFIG_NO_HZ=y
+CONFIG_HIGH_RES_TIMERS=y
+
+#
+# CPU/Task time and stats accounting
+#
+CONFIG_TICK_CPU_ACCOUNTING=y
+# CONFIG_IRQ_TIME_ACCOUNTING is not set
+CONFIG_BSD_PROCESS_ACCT=y
+CONFIG_BSD_PROCESS_ACCT_V3=y
+CONFIG_TASKSTATS=y
+CONFIG_TASK_DELAY_ACCT=y
+CONFIG_TASK_XACCT=y
+CONFIG_TASK_IO_ACCOUNTING=y
+
+#
+# RCU Subsystem
+#
+CONFIG_PREEMPT_RCU=y
+CONFIG_RCU_EXPERT=y
+CONFIG_SRCU=y
+# CONFIG_TASKS_RCU is not set
+CONFIG_RCU_STALL_COMMON=y
+CONFIG_RCU_FANOUT=32
+CONFIG_RCU_FANOUT_LEAF=16
+# CONFIG_TREE_RCU_TRACE is not set
+CONFIG_RCU_BOOST=y
+CONFIG_RCU_KTHREAD_PRIO=1
+CONFIG_RCU_BOOST_DELAY=500
+# CONFIG_RCU_NOCB_CPU is not set
+# CONFIG_RCU_EXPEDITE_BOOT is not set
+CONFIG_BUILD_BIN2C=y
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_LOG_BUF_SHIFT=17
+CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y
+CONFIG_CGROUPS=y
+CONFIG_CGROUP_DEBUG=y
+CONFIG_CGROUP_FREEZER=y
+# CONFIG_CGROUP_PIDS is not set
+CONFIG_CGROUP_DEVICE=y
+CONFIG_CPUSETS=y
+CONFIG_PROC_PID_CPUSET=y
+CONFIG_CGROUP_CPUACCT=y
+CONFIG_PAGE_COUNTER=y
+CONFIG_MEMCG=y
+CONFIG_MEMCG_SWAP=y
+CONFIG_MEMCG_SWAP_ENABLED=y
+CONFIG_MEMCG_KMEM=y
+# CONFIG_CGROUP_PERF is not set
+CONFIG_CGROUP_SCHED=y
+CONFIG_FAIR_GROUP_SCHED=y
+# CONFIG_CFS_BANDWIDTH is not set
+# CONFIG_RT_GROUP_SCHED is not set
+CONFIG_BLK_CGROUP=y
+# CONFIG_DEBUG_BLK_CGROUP is not set
+CONFIG_CGROUP_WRITEBACK=y
+# CONFIG_CHECKPOINT_RESTORE is not set
+CONFIG_NAMESPACES=y
+CONFIG_UTS_NS=y
+CONFIG_IPC_NS=y
+CONFIG_USER_NS=y
+CONFIG_PID_NS=y
+CONFIG_NET_NS=y
+# CONFIG_SCHED_AUTOGROUP is not set
+# CONFIG_SYSFS_DEPRECATED is not set
+CONFIG_RELAY=y
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_RD_GZIP=y
+CONFIG_RD_BZIP2=y
+CONFIG_RD_LZMA=y
+CONFIG_RD_XZ=y
+CONFIG_RD_LZO=y
+CONFIG_RD_LZ4=y
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_SYSCTL=y
+CONFIG_ANON_INODES=y
+CONFIG_HAVE_UID16=y
+CONFIG_SYSCTL_EXCEPTION_TRACE=y
+CONFIG_HAVE_PCSPKR_PLATFORM=y
+CONFIG_BPF=y
+CONFIG_EXPERT=y
+CONFIG_UID16=y
+CONFIG_MULTIUSER=y
+CONFIG_SGETMASK_SYSCALL=y
+CONFIG_SYSFS_SYSCALL=y
+# CONFIG_SYSCTL_SYSCALL is not set
+CONFIG_KALLSYMS=y
+# CONFIG_KALLSYMS_ALL is not set
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_ELF_CORE=y
+CONFIG_PCSPKR_PLATFORM=y
+CONFIG_BASE_FULL=y
+CONFIG_FUTEX=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_PCI_QUIRKS=y
+CONFIG_MEMBARRIER=y
+CONFIG_EMBEDDED=y
+CONFIG_HAVE_PERF_EVENTS=y
+
+#
+# Kernel Performance Events And Counters
+#
+CONFIG_PERF_EVENTS=y
+# CONFIG_DEBUG_PERF_USE_VMALLOC is not set
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_SLUB_DEBUG=y
+CONFIG_COMPAT_BRK=y
+# CONFIG_SLAB is not set
+CONFIG_SLUB=y
+# CONFIG_SLOB is not set
+# CONFIG_SYSTEM_DATA_VERIFICATION is not set
+CONFIG_PROFILING=y
+CONFIG_TRACEPOINTS=y
+# CONFIG_OPROFILE is not set
+CONFIG_HAVE_OPROFILE=y
+CONFIG_OPROFILE_NMI_TIMER=y
+# CONFIG_KPROBES is not set
+# CONFIG_JUMP_LABEL is not set
+# CONFIG_UPROBES is not set
+# CONFIG_HAVE_64BIT_ALIGNED_ACCESS is not set
+CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
+CONFIG_ARCH_USE_BUILTIN_BSWAP=y
+CONFIG_HAVE_IOREMAP_PROT=y
+CONFIG_HAVE_KPROBES=y
+CONFIG_HAVE_KRETPROBES=y
+CONFIG_HAVE_OPTPROBES=y
+CONFIG_HAVE_KPROBES_ON_FTRACE=y
+CONFIG_HAVE_ARCH_TRACEHOOK=y
+CONFIG_HAVE_DMA_ATTRS=y
+CONFIG_HAVE_DMA_CONTIGUOUS=y
+CONFIG_GENERIC_SMP_IDLE_THREAD=y
+CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT=y
+CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y
+CONFIG_HAVE_CLK=y
+CONFIG_HAVE_DMA_API_DEBUG=y
+CONFIG_HAVE_HW_BREAKPOINT=y
+CONFIG_HAVE_MIXED_BREAKPOINTS_REGS=y
+CONFIG_HAVE_USER_RETURN_NOTIFIER=y
+CONFIG_HAVE_PERF_EVENTS_NMI=y
+CONFIG_HAVE_PERF_REGS=y
+CONFIG_HAVE_PERF_USER_STACK_DUMP=y
+CONFIG_HAVE_ARCH_JUMP_LABEL=y
+CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y
+CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y
+CONFIG_HAVE_CMPXCHG_LOCAL=y
+CONFIG_HAVE_CMPXCHG_DOUBLE=y
+CONFIG_ARCH_WANT_IPC_PARSE_VERSION=y
+CONFIG_HAVE_ARCH_SECCOMP_FILTER=y
+CONFIG_SECCOMP_FILTER=y
+CONFIG_HAVE_CC_STACKPROTECTOR=y
+# CONFIG_CC_STACKPROTECTOR is not set
+CONFIG_CC_STACKPROTECTOR_NONE=y
+# CONFIG_CC_STACKPROTECTOR_REGULAR is not set
+# CONFIG_CC_STACKPROTECTOR_STRONG is not set
+CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y
+CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y
+CONFIG_MODULES_USE_ELF_REL=y
+CONFIG_ARCH_HAS_ELF_RANDOMIZE=y
+CONFIG_HAVE_COPY_THREAD_TLS=y
+CONFIG_CLONE_BACKWARDS=y
+CONFIG_OLD_SIGSUSPEND3=y
+CONFIG_OLD_SIGACTION=y
+
+#
+# GCOV-based kernel profiling
+#
+# CONFIG_GCOV_KERNEL is not set
+CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y
+CONFIG_HAVE_GENERIC_DMA_COHERENT=y
+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_MODULES_TREE_LOOKUP=y
+CONFIG_BLOCK=y
+CONFIG_LBDAF=y
+CONFIG_BLK_DEV_BSG=y
+# CONFIG_BLK_DEV_BSGLIB is not set
+# CONFIG_BLK_DEV_INTEGRITY is not set
+# CONFIG_BLK_DEV_THROTTLING is not set
+# CONFIG_BLK_CMDLINE_PARSER is not set
+
+#
+# Partition Types
+#
+# CONFIG_PARTITION_ADVANCED is not set
+CONFIG_MSDOS_PARTITION=y
+CONFIG_EFI_PARTITION=y
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+# CONFIG_CFQ_GROUP_IOSCHED is not set
+# CONFIG_DEFAULT_DEADLINE is not set
+CONFIG_DEFAULT_CFQ=y
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="cfq"
+CONFIG_UNINLINE_SPIN_UNLOCK=y
+CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y
+CONFIG_ARCH_USE_QUEUED_SPINLOCKS=y
+CONFIG_ARCH_USE_QUEUED_RWLOCKS=y
+CONFIG_FREEZER=y
+
+#
+# Processor type and features
+#
+CONFIG_ZONE_DMA=y
+# CONFIG_SMP is not set
+CONFIG_X86_FEATURE_NAMES=y
+CONFIG_X86_MPPARSE=y
+CONFIG_X86_EXTENDED_PLATFORM=y
+# CONFIG_X86_GOLDFISH is not set
+# CONFIG_X86_INTEL_MID is not set
+CONFIG_X86_INTEL_QUARK=y
+# CONFIG_X86_INTEL_LPSS is not set
+# CONFIG_X86_AMD_PLATFORM_DEVICE is not set
+CONFIG_IOSF_MBI=y
+# CONFIG_IOSF_MBI_DEBUG is not set
+# CONFIG_X86_RDC321X is not set
+CONFIG_X86_SUPPORTS_MEMORY_FAILURE=y
+# CONFIG_X86_32_IRIS is not set
+CONFIG_SCHED_OMIT_FRAME_POINTER=y
+# CONFIG_HYPERVISOR_GUEST is not set
+CONFIG_NO_BOOTMEM=y
+# CONFIG_M486 is not set
+# CONFIG_M586 is not set
+CONFIG_M586TSC=y
+# CONFIG_M586MMX is not set
+# CONFIG_M686 is not set
+# CONFIG_MPENTIUMII is not set
+# CONFIG_MPENTIUMIII is not set
+# CONFIG_MPENTIUMM is not set
+# CONFIG_MPENTIUM4 is not set
+# CONFIG_MK6 is not set
+# CONFIG_MK7 is not set
+# CONFIG_MK8 is not set
+# CONFIG_MCRUSOE is not set
+# CONFIG_MEFFICEON is not set
+# CONFIG_MWINCHIPC6 is not set
+# CONFIG_MWINCHIP3D is not set
+# CONFIG_MELAN is not set
+# CONFIG_MGEODEGX1 is not set
+# CONFIG_MGEODE_LX is not set
+# CONFIG_MCYRIXIII is not set
+# CONFIG_MVIAC3_2 is not set
+# CONFIG_MVIAC7 is not set
+# CONFIG_MCORE2 is not set
+# CONFIG_MATOM is not set
+# CONFIG_X86_GENERIC is not set
+CONFIG_X86_INTERNODE_CACHE_SHIFT=5
+CONFIG_X86_L1_CACHE_SHIFT=5
+# CONFIG_X86_PPRO_FENCE is not set
+CONFIG_X86_F00F_BUG=y
+CONFIG_X86_ALIGNMENT_16=y
+CONFIG_X86_TSC=y
+CONFIG_X86_MINIMUM_CPU_FAMILY=4
+# CONFIG_PROCESSOR_SELECT is not set
+CONFIG_CPU_SUP_INTEL=y
+CONFIG_CPU_SUP_CYRIX_32=y
+CONFIG_CPU_SUP_AMD=y
+CONFIG_CPU_SUP_CENTAUR=y
+CONFIG_CPU_SUP_TRANSMETA_32=y
+CONFIG_CPU_SUP_UMC_32=y
+CONFIG_HPET_TIMER=y
+CONFIG_HPET_EMULATE_RTC=y
+CONFIG_DMI=y
+CONFIG_NR_CPUS=1
+# CONFIG_PREEMPT_NONE is not set
+# CONFIG_PREEMPT_VOLUNTARY is not set
+CONFIG_PREEMPT=y
+CONFIG_PREEMPT_COUNT=y
+CONFIG_UP_LATE_INIT=y
+CONFIG_X86_UP_APIC=y
+# CONFIG_X86_UP_IOAPIC is not set
+CONFIG_X86_LOCAL_APIC=y
+CONFIG_X86_IO_APIC=y
+# CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS is not set
+CONFIG_X86_MCE=y
+CONFIG_X86_MCE_INTEL=y
+CONFIG_X86_MCE_AMD=y
+# CONFIG_X86_ANCIENT_MCE is not set
+CONFIG_X86_MCE_THRESHOLD=y
+# CONFIG_X86_MCE_INJECT is not set
+CONFIG_X86_THERMAL_VECTOR=y
+# CONFIG_X86_LEGACY_VM86 is not set
+# CONFIG_VM86 is not set
+CONFIG_X86_16BIT=y
+CONFIG_X86_ESPFIX32=y
+# CONFIG_TOSHIBA is not set
+# CONFIG_I8K is not set
+# CONFIG_X86_REBOOTFIXUPS is not set
+CONFIG_MICROCODE=y
+CONFIG_MICROCODE_INTEL=y
+# CONFIG_MICROCODE_AMD is not set
+CONFIG_MICROCODE_OLD_INTERFACE=y
+CONFIG_X86_MSR=y
+CONFIG_X86_CPUID=y
+# CONFIG_NOHIGHMEM is not set
+CONFIG_HIGHMEM4G=y
+# CONFIG_HIGHMEM64G is not set
+CONFIG_VMSPLIT_3G=y
+# CONFIG_VMSPLIT_3G_OPT is not set
+# CONFIG_VMSPLIT_2G is not set
+# CONFIG_VMSPLIT_2G_OPT is not set
+# CONFIG_VMSPLIT_1G is not set
+CONFIG_PAGE_OFFSET=0xC0000000
+CONFIG_HIGHMEM=y
+CONFIG_ARCH_FLATMEM_ENABLE=y
+CONFIG_ARCH_SPARSEMEM_ENABLE=y
+CONFIG_ARCH_SELECT_MEMORY_MODEL=y
+CONFIG_ILLEGAL_POINTER_VALUE=0
+CONFIG_SELECT_MEMORY_MODEL=y
+CONFIG_FLATMEM_MANUAL=y
+# CONFIG_SPARSEMEM_MANUAL is not set
+CONFIG_FLATMEM=y
+CONFIG_FLAT_NODE_MEM_MAP=y
+CONFIG_SPARSEMEM_STATIC=y
+CONFIG_HAVE_MEMBLOCK=y
+CONFIG_HAVE_MEMBLOCK_NODE_MAP=y
+CONFIG_ARCH_DISCARD_MEMBLOCK=y
+# CONFIG_HAVE_BOOTMEM_INFO_NODE is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
+CONFIG_COMPACTION=y
+CONFIG_MIGRATION=y
+# CONFIG_PHYS_ADDR_T_64BIT is not set
+CONFIG_ZONE_DMA_FLAG=1
+CONFIG_BOUNCE=y
+CONFIG_VIRT_TO_BUS=y
+# CONFIG_KSM is not set
+CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
+CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y
+# CONFIG_MEMORY_FAILURE is not set
+# CONFIG_TRANSPARENT_HUGEPAGE is not set
+CONFIG_NEED_PER_CPU_KM=y
+# CONFIG_CLEANCACHE is not set
+# CONFIG_FRONTSWAP is not set
+# CONFIG_CMA is not set
+# CONFIG_ZPOOL is not set
+# CONFIG_ZBUD is not set
+# CONFIG_ZSMALLOC is not set
+CONFIG_GENERIC_EARLY_IOREMAP=y
+CONFIG_ARCH_SUPPORTS_DEFERRED_STRUCT_PAGE_INIT=y
+# CONFIG_IDLE_PAGE_TRACKING is not set
+# CONFIG_HIGHPTE is not set
+CONFIG_X86_CHECK_BIOS_CORRUPTION=y
+CONFIG_X86_BOOTPARAM_MEMORY_CORRUPTION_CHECK=y
+CONFIG_X86_RESERVE_LOW=64
+# CONFIG_MATH_EMULATION is not set
+CONFIG_MTRR=y
+CONFIG_MTRR_SANITIZER=y
+CONFIG_MTRR_SANITIZER_ENABLE_DEFAULT=0
+CONFIG_MTRR_SANITIZER_SPARE_REG_NR_DEFAULT=1
+CONFIG_X86_PAT=y
+CONFIG_ARCH_USES_PG_UNCACHED=y
+CONFIG_ARCH_RANDOM=y
+CONFIG_X86_SMAP=y
+# CONFIG_X86_INTEL_MPX is not set
+CONFIG_EFI=y
+CONFIG_EFI_STUB=y
+CONFIG_SECCOMP=y
+CONFIG_HZ_100=y
+# CONFIG_HZ_250 is not set
+# CONFIG_HZ_300 is not set
+# CONFIG_HZ_1000 is not set
+CONFIG_HZ=100
+CONFIG_SCHED_HRTICK=y
+# CONFIG_KEXEC is not set
+# CONFIG_CRASH_DUMP is not set
+CONFIG_PHYSICAL_START=0x1000000
+CONFIG_RELOCATABLE=y
+# CONFIG_RANDOMIZE_BASE is not set
+CONFIG_X86_NEED_RELOCS=y
+CONFIG_PHYSICAL_ALIGN=0x200000
+# CONFIG_COMPAT_VDSO is not set
+# CONFIG_CMDLINE_BOOL is not set
+CONFIG_MODIFY_LDT_SYSCALL=y
+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
+
+#
+# Power management and ACPI options
+#
+CONFIG_SUSPEND=y
+CONFIG_SUSPEND_FREEZER=y
+# CONFIG_SUSPEND_SKIP_SYNC is not set
+# CONFIG_HIBERNATION is not set
+CONFIG_PM_SLEEP=y
+# CONFIG_PM_AUTOSLEEP is not set
+# CONFIG_PM_WAKELOCKS is not set
+CONFIG_PM=y
+CONFIG_PM_DEBUG=y
+CONFIG_PM_ADVANCED_DEBUG=y
+# CONFIG_PM_TEST_SUSPEND is not set
+CONFIG_PM_SLEEP_DEBUG=y
+# CONFIG_PM_TRACE_RTC is not set
+CONFIG_PM_CLK=y
+# CONFIG_WQ_POWER_EFFICIENT_DEFAULT is not set
+CONFIG_ACPI=y
+CONFIG_ACPI_LEGACY_TABLES_LOOKUP=y
+CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC=y
+CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT=y
+# CONFIG_ACPI_DEBUGGER is not set
+CONFIG_ACPI_SLEEP=y
+# CONFIG_ACPI_PROCFS_POWER is not set
+CONFIG_ACPI_REV_OVERRIDE_POSSIBLE=y
+# CONFIG_ACPI_EC_DEBUGFS is not set
+CONFIG_ACPI_AC=y
+CONFIG_ACPI_BATTERY=y
+CONFIG_ACPI_BUTTON=y
+CONFIG_ACPI_FAN=y
+# CONFIG_ACPI_DOCK is not set
+CONFIG_ACPI_CPU_FREQ_PSS=y
+CONFIG_ACPI_PROCESSOR_IDLE=y
+CONFIG_ACPI_PROCESSOR=y
+# CONFIG_ACPI_PROCESSOR_AGGREGATOR is not set
+CONFIG_ACPI_THERMAL=y
+# CONFIG_ACPI_CUSTOM_DSDT is not set
+# CONFIG_ACPI_INITRD_TABLE_OVERRIDE is not set
+# CONFIG_ACPI_DEBUG is not set
+# CONFIG_ACPI_PCI_SLOT is not set
+CONFIG_X86_PM_TIMER=y
+# CONFIG_ACPI_CONTAINER is not set
+CONFIG_ACPI_HOTPLUG_IOAPIC=y
+# CONFIG_ACPI_SBS is not set
+# CONFIG_ACPI_HED is not set
+# CONFIG_ACPI_CUSTOM_METHOD is not set
+# CONFIG_ACPI_BGRT is not set
+# CONFIG_ACPI_REDUCED_HARDWARE_ONLY is not set
+CONFIG_HAVE_ACPI_APEI=y
+CONFIG_HAVE_ACPI_APEI_NMI=y
+# CONFIG_ACPI_APEI is not set
+# CONFIG_ACPI_EXTLOG is not set
+# CONFIG_PMIC_OPREGION is not set
+# CONFIG_SFI is not set
+# CONFIG_APM is not set
+
+#
+# CPU Frequency scaling
+#
+CONFIG_CPU_FREQ=y
+CONFIG_CPU_FREQ_GOV_COMMON=y
+CONFIG_CPU_FREQ_STAT=y
+# CONFIG_CPU_FREQ_STAT_DETAILS is not set
+# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
+# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set
+# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
+CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
+# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set
+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
+# CONFIG_CPU_FREQ_GOV_POWERSAVE is not set
+# CONFIG_CPU_FREQ_GOV_USERSPACE is not set
+CONFIG_CPU_FREQ_GOV_ONDEMAND=y
+# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set
+
+#
+# CPU frequency scaling drivers
+#
+CONFIG_X86_INTEL_PSTATE=y
+# CONFIG_X86_PCC_CPUFREQ is not set
+CONFIG_X86_ACPI_CPUFREQ=y
+CONFIG_X86_ACPI_CPUFREQ_CPB=y
+# CONFIG_X86_POWERNOW_K6 is not set
+# CONFIG_X86_POWERNOW_K7 is not set
+# CONFIG_X86_POWERNOW_K8 is not set
+# CONFIG_X86_AMD_FREQ_SENSITIVITY is not set
+# CONFIG_X86_GX_SUSPMOD is not set
+# CONFIG_X86_SPEEDSTEP_CENTRINO is not set
+# CONFIG_X86_SPEEDSTEP_ICH is not set
+# CONFIG_X86_SPEEDSTEP_SMI is not set
+# CONFIG_X86_P4_CLOCKMOD is not set
+# CONFIG_X86_CPUFREQ_NFORCE2 is not set
+# CONFIG_X86_LONGRUN is not set
+# CONFIG_X86_LONGHAUL is not set
+# CONFIG_X86_E_POWERSAVER is not set
+
+#
+# shared options
+#
+# CONFIG_X86_SPEEDSTEP_LIB is not set
+
+#
+# CPU Idle
+#
+CONFIG_CPU_IDLE=y
+CONFIG_CPU_IDLE_GOV_LADDER=y
+CONFIG_CPU_IDLE_GOV_MENU=y
+# CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED is not set
+CONFIG_INTEL_IDLE=y
+
+#
+# Bus options (PCI etc.)
+#
+CONFIG_PCI=y
+# CONFIG_PCI_GOBIOS is not set
+# CONFIG_PCI_GOMMCONFIG is not set
+# CONFIG_PCI_GODIRECT is not set
+CONFIG_PCI_GOANY=y
+CONFIG_PCI_BIOS=y
+CONFIG_PCI_DIRECT=y
+CONFIG_PCI_MMCONFIG=y
+CONFIG_PCI_DOMAINS=y
+# CONFIG_PCI_CNB20LE_QUIRK is not set
+CONFIG_PCIEPORTBUS=y
+# CONFIG_HOTPLUG_PCI_PCIE is not set
+CONFIG_PCIEAER=y
+# CONFIG_PCIE_ECRC is not set
+# CONFIG_PCIEAER_INJECT is not set
+CONFIG_PCIEASPM=y
+# CONFIG_PCIEASPM_DEBUG is not set
+CONFIG_PCIEASPM_DEFAULT=y
+# CONFIG_PCIEASPM_POWERSAVE is not set
+# CONFIG_PCIEASPM_PERFORMANCE is not set
+CONFIG_PCIE_PME=y
+CONFIG_PCI_MSI=y
+CONFIG_PCI_MSI_IRQ_DOMAIN=y
+# CONFIG_PCI_DEBUG is not set
+# CONFIG_PCI_REALLOC_ENABLE_AUTO is not set
+# CONFIG_PCI_STUB is not set
+CONFIG_HT_IRQ=y
+# CONFIG_PCI_IOV is not set
+# CONFIG_PCI_PRI is not set
+# CONFIG_PCI_PASID is not set
+CONFIG_PCI_LABEL=y
+
+#
+# PCI host controller drivers
+#
+CONFIG_ISA_DMA_API=y
+# CONFIG_ISA is not set
+# CONFIG_SCx200 is not set
+# CONFIG_OLPC is not set
+# CONFIG_ALIX is not set
+# CONFIG_NET5501 is not set
+# CONFIG_GEOS is not set
+CONFIG_AMD_NB=y
+# CONFIG_PCCARD is not set
+CONFIG_HOTPLUG_PCI=y
+# CONFIG_HOTPLUG_PCI_COMPAQ is not set
+# CONFIG_HOTPLUG_PCI_IBM is not set
+# CONFIG_HOTPLUG_PCI_ACPI is not set
+# CONFIG_HOTPLUG_PCI_CPCI is not set
+# CONFIG_HOTPLUG_PCI_SHPC is not set
+# CONFIG_RAPIDIO is not set
+# CONFIG_X86_SYSFB is not set
+
+#
+# Executable file formats / Emulations
+#
+CONFIG_BINFMT_ELF=y
+CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y
+CONFIG_BINFMT_SCRIPT=y
+CONFIG_HAVE_AOUT=y
+# CONFIG_BINFMT_AOUT is not set
+CONFIG_BINFMT_MISC=m
+CONFIG_COREDUMP=y
+CONFIG_HAVE_ATOMIC_IOMAP=y
+CONFIG_PMC_ATOM=y
+CONFIG_NET=y
+CONFIG_NET_INGRESS=y
+
+#
+# Networking options
+#
+CONFIG_PACKET=y
+# CONFIG_PACKET_DIAG is not set
+CONFIG_UNIX=y
+# CONFIG_UNIX_DIAG is not set
+CONFIG_XFRM=y
+CONFIG_XFRM_ALGO=y
+CONFIG_XFRM_USER=m
+CONFIG_XFRM_SUB_POLICY=y
+CONFIG_XFRM_MIGRATE=y
+# CONFIG_XFRM_STATISTICS is not set
+CONFIG_XFRM_IPCOMP=m
+CONFIG_NET_KEY=m
+CONFIG_NET_KEY_MIGRATE=y
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=y
+CONFIG_IP_ADVANCED_ROUTER=y
+# CONFIG_IP_FIB_TRIE_STATS is not set
+CONFIG_IP_MULTIPLE_TABLES=y
+CONFIG_IP_ROUTE_MULTIPATH=y
+CONFIG_IP_ROUTE_VERBOSE=y
+CONFIG_IP_ROUTE_CLASSID=y
+CONFIG_IP_PNP=y
+CONFIG_IP_PNP_DHCP=y
+CONFIG_IP_PNP_BOOTP=y
+CONFIG_IP_PNP_RARP=y
+CONFIG_NET_IPIP=m
+CONFIG_NET_IPGRE_DEMUX=m
+CONFIG_NET_IP_TUNNEL=y
+CONFIG_NET_IPGRE=m
+CONFIG_NET_IPGRE_BROADCAST=y
+CONFIG_IP_MROUTE=y
+# CONFIG_IP_MROUTE_MULTIPLE_TABLES is not set
+CONFIG_IP_PIMSM_V1=y
+CONFIG_IP_PIMSM_V2=y
+CONFIG_SYN_COOKIES=y
+# CONFIG_NET_IPVTI is not set
+CONFIG_NET_UDP_TUNNEL=m
+# CONFIG_NET_FOU is not set
+# CONFIG_NET_FOU_IP_TUNNELS is not set
+CONFIG_INET_AH=m
+CONFIG_INET_ESP=m
+CONFIG_INET_IPCOMP=m
+CONFIG_INET_XFRM_TUNNEL=m
+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=y
+# CONFIG_IPV6_ROUTE_INFO is not set
+# CONFIG_IPV6_OPTIMISTIC_DAD is not set
+CONFIG_INET6_AH=y
+CONFIG_INET6_ESP=y
+CONFIG_INET6_IPCOMP=m
+# CONFIG_IPV6_MIP6 is not set
+# CONFIG_IPV6_ILA is not set
+CONFIG_INET6_XFRM_TUNNEL=m
+CONFIG_INET6_TUNNEL=m
+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=m
+# CONFIG_IPV6_GRE is not set
+# CONFIG_IPV6_MULTIPLE_TABLES is not set
+# CONFIG_IPV6_MROUTE is not set
+# CONFIG_NETLABEL is not set
+# CONFIG_NETWORK_SECMARK is not set
+CONFIG_NET_PTP_CLASSIFY=y
+# CONFIG_NETWORK_PHY_TIMESTAMPING is not set
+CONFIG_NETFILTER=y
+# CONFIG_NETFILTER_DEBUG is not set
+CONFIG_NETFILTER_ADVANCED=y
+CONFIG_BRIDGE_NETFILTER=m
+
+#
+# Core Netfilter Configuration
+#
+CONFIG_NETFILTER_INGRESS=y
+CONFIG_NETFILTER_NETLINK=m
+# CONFIG_NETFILTER_NETLINK_ACCT is not set
+CONFIG_NETFILTER_NETLINK_QUEUE=m
+CONFIG_NETFILTER_NETLINK_LOG=m
+CONFIG_NF_CONNTRACK=m
+CONFIG_NF_CONNTRACK_MARK=y
+# CONFIG_NF_CONNTRACK_ZONES is not set
+CONFIG_NF_CONNTRACK_PROCFS=y
+# CONFIG_NF_CONNTRACK_EVENTS is not set
+# CONFIG_NF_CONNTRACK_TIMEOUT is not set
+# CONFIG_NF_CONNTRACK_TIMESTAMP is not set
+# CONFIG_NF_CT_PROTO_DCCP is not set
+CONFIG_NF_CT_PROTO_GRE=m
+CONFIG_NF_CT_PROTO_SCTP=m
+CONFIG_NF_CT_PROTO_UDPLITE=m
+CONFIG_NF_CONNTRACK_AMANDA=m
+CONFIG_NF_CONNTRACK_FTP=m
+CONFIG_NF_CONNTRACK_H323=m
+CONFIG_NF_CONNTRACK_IRC=m
+CONFIG_NF_CONNTRACK_BROADCAST=m
+CONFIG_NF_CONNTRACK_NETBIOS_NS=m
+# CONFIG_NF_CONNTRACK_SNMP is not set
+CONFIG_NF_CONNTRACK_PPTP=m
+CONFIG_NF_CONNTRACK_SANE=m
+CONFIG_NF_CONNTRACK_SIP=m
+CONFIG_NF_CONNTRACK_TFTP=m
+CONFIG_NF_CT_NETLINK=m
+# CONFIG_NF_CT_NETLINK_TIMEOUT is not set
+# CONFIG_NETFILTER_NETLINK_GLUE_CT is not set
+CONFIG_NF_NAT=m
+CONFIG_NF_NAT_NEEDED=y
+CONFIG_NF_NAT_PROTO_UDPLITE=m
+CONFIG_NF_NAT_PROTO_SCTP=m
+CONFIG_NF_NAT_AMANDA=m
+CONFIG_NF_NAT_FTP=m
+CONFIG_NF_NAT_IRC=m
+CONFIG_NF_NAT_SIP=m
+CONFIG_NF_NAT_TFTP=m
+CONFIG_NF_NAT_REDIRECT=m
+# CONFIG_NF_TABLES is not set
+CONFIG_NETFILTER_XTABLES=m
+
+#
+# Xtables combined modules
+#
+CONFIG_NETFILTER_XT_MARK=m
+CONFIG_NETFILTER_XT_CONNMARK=m
+
+#
+# Xtables targets
+#
+# CONFIG_NETFILTER_XT_TARGET_CHECKSUM is not set
+CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
+CONFIG_NETFILTER_XT_TARGET_CONNMARK=m
+CONFIG_NETFILTER_XT_TARGET_CT=m
+CONFIG_NETFILTER_XT_TARGET_DSCP=m
+CONFIG_NETFILTER_XT_TARGET_HL=m
+# CONFIG_NETFILTER_XT_TARGET_HMARK is not set
+# CONFIG_NETFILTER_XT_TARGET_IDLETIMER is not set
+# CONFIG_NETFILTER_XT_TARGET_LED is not set
+# CONFIG_NETFILTER_XT_TARGET_LOG is not set
+CONFIG_NETFILTER_XT_TARGET_MARK=m
+CONFIG_NETFILTER_XT_NAT=m
+CONFIG_NETFILTER_XT_TARGET_NETMAP=m
+CONFIG_NETFILTER_XT_TARGET_NFLOG=m
+CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m
+CONFIG_NETFILTER_XT_TARGET_NOTRACK=m
+# CONFIG_NETFILTER_XT_TARGET_RATEEST is not set
+CONFIG_NETFILTER_XT_TARGET_REDIRECT=m
+# CONFIG_NETFILTER_XT_TARGET_TEE is not set
+# CONFIG_NETFILTER_XT_TARGET_TPROXY is not set
+CONFIG_NETFILTER_XT_TARGET_TRACE=m
+CONFIG_NETFILTER_XT_TARGET_TCPMSS=m
+# CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set
+
+#
+# Xtables matches
+#
+# CONFIG_NETFILTER_XT_MATCH_ADDRTYPE is not set
+# CONFIG_NETFILTER_XT_MATCH_BPF is not set
+# CONFIG_NETFILTER_XT_MATCH_CGROUP is not set
+# CONFIG_NETFILTER_XT_MATCH_CLUSTER is not set
+CONFIG_NETFILTER_XT_MATCH_COMMENT=m
+CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m
+# CONFIG_NETFILTER_XT_MATCH_CONNLABEL is not set
+CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m
+CONFIG_NETFILTER_XT_MATCH_CONNMARK=m
+CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m
+# CONFIG_NETFILTER_XT_MATCH_CPU is not set
+CONFIG_NETFILTER_XT_MATCH_DCCP=m
+# CONFIG_NETFILTER_XT_MATCH_DEVGROUP is not set
+CONFIG_NETFILTER_XT_MATCH_DSCP=m
+CONFIG_NETFILTER_XT_MATCH_ECN=m
+CONFIG_NETFILTER_XT_MATCH_ESP=m
+CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m
+CONFIG_NETFILTER_XT_MATCH_HELPER=m
+CONFIG_NETFILTER_XT_MATCH_HL=m
+# CONFIG_NETFILTER_XT_MATCH_IPCOMP is not set
+# CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set
+# CONFIG_NETFILTER_XT_MATCH_L2TP is not set
+CONFIG_NETFILTER_XT_MATCH_LENGTH=m
+CONFIG_NETFILTER_XT_MATCH_LIMIT=m
+CONFIG_NETFILTER_XT_MATCH_MAC=m
+CONFIG_NETFILTER_XT_MATCH_MARK=m
+CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m
+# CONFIG_NETFILTER_XT_MATCH_NFACCT is not set
+# CONFIG_NETFILTER_XT_MATCH_OSF is not set
+# CONFIG_NETFILTER_XT_MATCH_OWNER is not set
+CONFIG_NETFILTER_XT_MATCH_POLICY=m
+# CONFIG_NETFILTER_XT_MATCH_PHYSDEV is not set
+CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m
+CONFIG_NETFILTER_XT_MATCH_QUOTA=m
+# CONFIG_NETFILTER_XT_MATCH_RATEEST is not set
+CONFIG_NETFILTER_XT_MATCH_REALM=m
+# CONFIG_NETFILTER_XT_MATCH_RECENT is not set
+CONFIG_NETFILTER_XT_MATCH_SCTP=m
+# CONFIG_NETFILTER_XT_MATCH_SOCKET is not set
+CONFIG_NETFILTER_XT_MATCH_STATE=m
+CONFIG_NETFILTER_XT_MATCH_STATISTIC=m
+CONFIG_NETFILTER_XT_MATCH_STRING=m
+CONFIG_NETFILTER_XT_MATCH_TCPMSS=m
+# CONFIG_NETFILTER_XT_MATCH_TIME is not set
+CONFIG_NETFILTER_XT_MATCH_U32=m
+# CONFIG_IP_SET is not set
+# CONFIG_IP_VS is not set
+
+#
+# IP: Netfilter Configuration
+#
+CONFIG_NF_DEFRAG_IPV4=m
+CONFIG_NF_CONNTRACK_IPV4=m
+CONFIG_NF_CONNTRACK_PROC_COMPAT=y
+# CONFIG_NF_DUP_IPV4 is not set
+# CONFIG_NF_LOG_ARP is not set
+# CONFIG_NF_LOG_IPV4 is not set
+CONFIG_NF_REJECT_IPV4=m
+CONFIG_NF_NAT_IPV4=m
+CONFIG_NF_NAT_MASQUERADE_IPV4=m
+CONFIG_NF_NAT_PROTO_GRE=m
+CONFIG_NF_NAT_PPTP=m
+CONFIG_NF_NAT_H323=m
+CONFIG_IP_NF_IPTABLES=m
+CONFIG_IP_NF_MATCH_AH=m
+CONFIG_IP_NF_MATCH_ECN=m
+# CONFIG_IP_NF_MATCH_RPFILTER is not set
+CONFIG_IP_NF_MATCH_TTL=m
+CONFIG_IP_NF_FILTER=m
+CONFIG_IP_NF_TARGET_REJECT=m
+# CONFIG_IP_NF_TARGET_SYNPROXY is not set
+CONFIG_IP_NF_NAT=m
+CONFIG_IP_NF_TARGET_MASQUERADE=m
+CONFIG_IP_NF_TARGET_NETMAP=m
+CONFIG_IP_NF_TARGET_REDIRECT=m
+CONFIG_IP_NF_MANGLE=m
+CONFIG_IP_NF_TARGET_CLUSTERIP=m
+CONFIG_IP_NF_TARGET_ECN=m
+CONFIG_IP_NF_TARGET_TTL=m
+CONFIG_IP_NF_RAW=m
+# CONFIG_IP_NF_SECURITY is not set
+CONFIG_IP_NF_ARPTABLES=m
+CONFIG_IP_NF_ARPFILTER=m
+CONFIG_IP_NF_ARP_MANGLE=m
+
+#
+# IPv6: Netfilter Configuration
+#
+# CONFIG_NF_DEFRAG_IPV6 is not set
+# CONFIG_NF_CONNTRACK_IPV6 is not set
+# CONFIG_NF_DUP_IPV6 is not set
+# CONFIG_NF_REJECT_IPV6 is not set
+# CONFIG_NF_LOG_IPV6 is not set
+CONFIG_IP6_NF_IPTABLES=m
+# CONFIG_IP6_NF_MATCH_AH is not set
+CONFIG_IP6_NF_MATCH_EUI64=m
+CONFIG_IP6_NF_MATCH_FRAG=m
+CONFIG_IP6_NF_MATCH_OPTS=m
+CONFIG_IP6_NF_MATCH_HL=m
+CONFIG_IP6_NF_MATCH_IPV6HEADER=m
+# CONFIG_IP6_NF_MATCH_MH is not set
+# CONFIG_IP6_NF_MATCH_RPFILTER is not set
+CONFIG_IP6_NF_MATCH_RT=m
+# CONFIG_IP6_NF_TARGET_HL is not set
+CONFIG_IP6_NF_FILTER=m
+# CONFIG_IP6_NF_TARGET_REJECT is not set
+# CONFIG_IP6_NF_TARGET_SYNPROXY is not set
+CONFIG_IP6_NF_MANGLE=m
+CONFIG_IP6_NF_RAW=m
+# CONFIG_IP6_NF_SECURITY is not set
+CONFIG_BRIDGE_NF_EBTABLES=m
+CONFIG_BRIDGE_EBT_BROUTE=m
+CONFIG_BRIDGE_EBT_T_FILTER=m
+CONFIG_BRIDGE_EBT_T_NAT=m
+CONFIG_BRIDGE_EBT_802_3=m
+CONFIG_BRIDGE_EBT_AMONG=m
+CONFIG_BRIDGE_EBT_ARP=m
+CONFIG_BRIDGE_EBT_IP=m
+CONFIG_BRIDGE_EBT_IP6=m
+CONFIG_BRIDGE_EBT_LIMIT=m
+CONFIG_BRIDGE_EBT_MARK=m
+CONFIG_BRIDGE_EBT_PKTTYPE=m
+CONFIG_BRIDGE_EBT_STP=m
+CONFIG_BRIDGE_EBT_VLAN=m
+CONFIG_BRIDGE_EBT_ARPREPLY=m
+CONFIG_BRIDGE_EBT_DNAT=m
+CONFIG_BRIDGE_EBT_MARK_T=m
+CONFIG_BRIDGE_EBT_REDIRECT=m
+CONFIG_BRIDGE_EBT_SNAT=m
+CONFIG_BRIDGE_EBT_LOG=m
+CONFIG_BRIDGE_EBT_NFLOG=m
+# CONFIG_IP_DCCP is not set
+CONFIG_IP_SCTP=m
+# CONFIG_SCTP_DBG_OBJCNT is not set
+CONFIG_SCTP_DEFAULT_COOKIE_HMAC_MD5=y
+# CONFIG_SCTP_DEFAULT_COOKIE_HMAC_SHA1 is not set
+# CONFIG_SCTP_DEFAULT_COOKIE_HMAC_NONE is not set
+CONFIG_SCTP_COOKIE_HMAC_MD5=y
+# CONFIG_SCTP_COOKIE_HMAC_SHA1 is not set
+# CONFIG_RDS is not set
+CONFIG_TIPC=m
+CONFIG_TIPC_MEDIA_UDP=y
+# CONFIG_ATM is not set
+# CONFIG_L2TP is not set
+CONFIG_STP=m
+CONFIG_BRIDGE=m
+CONFIG_BRIDGE_IGMP_SNOOPING=y
+# CONFIG_BRIDGE_VLAN_FILTERING is not set
+CONFIG_HAVE_NET_DSA=y
+CONFIG_VLAN_8021Q=m
+# CONFIG_VLAN_8021Q_GVRP is not set
+# CONFIG_VLAN_8021Q_MVRP is not set
+# CONFIG_DECNET is not set
+CONFIG_LLC=m
+# 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=y
+
+#
+# Queueing/Scheduling
+#
+CONFIG_NET_SCH_CBQ=m
+CONFIG_NET_SCH_HTB=m
+CONFIG_NET_SCH_HFSC=m
+CONFIG_NET_SCH_PRIO=m
+# CONFIG_NET_SCH_MULTIQ is not set
+CONFIG_NET_SCH_RED=m
+# CONFIG_NET_SCH_SFB is not set
+CONFIG_NET_SCH_SFQ=m
+CONFIG_NET_SCH_TEQL=m
+CONFIG_NET_SCH_TBF=m
+CONFIG_NET_SCH_GRED=m
+CONFIG_NET_SCH_DSMARK=m
+CONFIG_NET_SCH_NETEM=m
+# CONFIG_NET_SCH_DRR is not set
+# CONFIG_NET_SCH_MQPRIO is not set
+# CONFIG_NET_SCH_CHOKE is not set
+# CONFIG_NET_SCH_QFQ is not set
+CONFIG_NET_SCH_CODEL=m
+# CONFIG_NET_SCH_FQ_CODEL is not set
+# CONFIG_NET_SCH_FQ is not set
+# CONFIG_NET_SCH_HHF is not set
+# CONFIG_NET_SCH_PIE is not set
+CONFIG_NET_SCH_INGRESS=m
+# CONFIG_NET_SCH_PLUG is not set
+
+#
+# Classification
+#
+CONFIG_NET_CLS=y
+CONFIG_NET_CLS_BASIC=y
+# CONFIG_NET_CLS_TCINDEX is not set
+# CONFIG_NET_CLS_ROUTE4 is not set
+# CONFIG_NET_CLS_FW is not set
+CONFIG_NET_CLS_U32=y
+# CONFIG_CLS_U32_PERF is not set
+# CONFIG_CLS_U32_MARK is not set
+# CONFIG_NET_CLS_RSVP is not set
+# CONFIG_NET_CLS_RSVP6 is not set
+# CONFIG_NET_CLS_FLOW is not set
+CONFIG_NET_CLS_CGROUP=y
+# CONFIG_NET_CLS_BPF is not set
+# CONFIG_NET_CLS_FLOWER is not set
+# CONFIG_NET_EMATCH is not set
+CONFIG_NET_CLS_ACT=y
+# CONFIG_NET_ACT_POLICE is not set
+# CONFIG_NET_ACT_GACT is not set
+CONFIG_NET_ACT_MIRRED=m
+# CONFIG_NET_ACT_IPT is not set
+# CONFIG_NET_ACT_NAT is not set
+# CONFIG_NET_ACT_PEDIT is not set
+# CONFIG_NET_ACT_SIMP is not set
+# CONFIG_NET_ACT_SKBEDIT is not set
+# CONFIG_NET_ACT_CSUM is not set
+# CONFIG_NET_ACT_VLAN is not set
+# CONFIG_NET_ACT_BPF is not set
+# CONFIG_NET_ACT_CONNMARK is not set
+# CONFIG_NET_CLS_IND is not set
+CONFIG_NET_SCH_FIFO=y
+# 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_DIAG is not set
+# 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_CGROUP_NET_PRIO is not set
+CONFIG_CGROUP_NET_CLASSID=y
+CONFIG_NET_RX_BUSY_POLL=y
+CONFIG_BQL=y
+
+#
+# Network testing
+#
+CONFIG_NET_PKTGEN=m
+# CONFIG_NET_DROP_MONITOR is not set
+# CONFIG_HAMRADIO is not set
+CONFIG_CAN=y
+CONFIG_CAN_RAW=y
+CONFIG_CAN_BCM=y
+CONFIG_CAN_GW=y
+
+#
+# CAN Device Drivers
+#
+# CONFIG_CAN_VCAN is not set
+# CONFIG_CAN_SLCAN is not set
+CONFIG_CAN_DEV=y
+CONFIG_CAN_CALC_BITTIMING=y
+# CONFIG_CAN_LEDS is not set
+CONFIG_PCH_CAN=y
+# CONFIG_CAN_SJA1000 is not set
+# CONFIG_CAN_C_CAN is not set
+# CONFIG_CAN_M_CAN is not set
+# CONFIG_CAN_CC770 is not set
+
+#
+# CAN SPI interfaces
+#
+# CONFIG_CAN_MCP251X is not set
+
+#
+# CAN USB interfaces
+#
+# CONFIG_CAN_EMS_USB is not set
+# CONFIG_CAN_ESD_USB2 is not set
+# CONFIG_CAN_GS_USB is not set
+# CONFIG_CAN_KVASER_USB is not set
+# CONFIG_CAN_PEAK_USB is not set
+# CONFIG_CAN_8DEV_USB is not set
+# CONFIG_CAN_SOFTING is not set
+# CONFIG_CAN_DEBUG_DEVICES is not set
+# CONFIG_IRDA is not set
+# CONFIG_BT is not set
+# CONFIG_AF_RXRPC is not set
+CONFIG_FIB_RULES=y
+CONFIG_WIRELESS=y
+CONFIG_WIRELESS_EXT=y
+CONFIG_WEXT_CORE=y
+CONFIG_WEXT_PROC=y
+CONFIG_WEXT_PRIV=y
+CONFIG_CFG80211=m
+# CONFIG_NL80211_TESTMODE is not set
+# CONFIG_CFG80211_DEVELOPER_WARNINGS is not set
+# CONFIG_CFG80211_REG_DEBUG is not set
+# CONFIG_CFG80211_CERTIFICATION_ONUS is not set
+CONFIG_CFG80211_DEFAULT_PS=y
+# CONFIG_CFG80211_DEBUGFS is not set
+# CONFIG_CFG80211_INTERNAL_REGDB is not set
+CONFIG_CFG80211_CRDA_SUPPORT=y
+CONFIG_CFG80211_WEXT=y
+# CONFIG_LIB80211 is not set
+CONFIG_MAC80211=m
+CONFIG_MAC80211_HAS_RC=y
+CONFIG_MAC80211_RC_MINSTREL=y
+CONFIG_MAC80211_RC_MINSTREL_HT=y
+# CONFIG_MAC80211_RC_MINSTREL_VHT is not set
+CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y
+CONFIG_MAC80211_RC_DEFAULT="minstrel_ht"
+# CONFIG_MAC80211_MESH is not set
+CONFIG_MAC80211_LEDS=y
+# CONFIG_MAC80211_DEBUGFS is not set
+# CONFIG_MAC80211_MESSAGE_TRACING is not set
+# CONFIG_MAC80211_DEBUG_MENU is not set
+CONFIG_MAC80211_STA_HASH_MAX_SIZE=0
+# CONFIG_WIMAX is not set
+CONFIG_RFKILL=y
+CONFIG_RFKILL_LEDS=y
+# CONFIG_RFKILL_INPUT is not set
+# CONFIG_RFKILL_GPIO 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=y
+CONFIG_UEVENT_HELPER_PATH=""
+CONFIG_DEVTMPFS=y
+CONFIG_DEVTMPFS_MOUNT=y
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+CONFIG_FIRMWARE_IN_KERNEL=y
+CONFIG_EXTRA_FIRMWARE=""
+# CONFIG_FW_LOADER_USER_HELPER_FALLBACK is not set
+CONFIG_WANT_DEV_COREDUMP=y
+CONFIG_ALLOW_DEV_COREDUMP=y
+CONFIG_DEV_COREDUMP=y
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES is not set
+# CONFIG_SYS_HYPERVISOR is not set
+# CONFIG_GENERIC_CPU_DEVICES is not set
+CONFIG_GENERIC_CPU_AUTOPROBE=y
+CONFIG_REGMAP=y
+CONFIG_REGMAP_I2C=y
+CONFIG_REGMAP_SPI=m
+CONFIG_REGMAP_MMIO=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_ARCH_MIGHT_HAVE_PC_PARPORT=y
+CONFIG_PARPORT=m
+CONFIG_PARPORT_PC=m
+# CONFIG_PARPORT_SERIAL is not set
+# CONFIG_PARPORT_PC_FIFO is not set
+# CONFIG_PARPORT_PC_SUPERIO is not set
+# CONFIG_PARPORT_GSC is not set
+# CONFIG_PARPORT_AX88796 is not set
+# CONFIG_PARPORT_1284 is not set
+CONFIG_PNP=y
+CONFIG_PNP_DEBUG_MESSAGES=y
+
+#
+# Protocols
+#
+CONFIG_PNPACPI=y
+CONFIG_BLK_DEV=y
+# CONFIG_BLK_DEV_NULL_BLK is not set
+CONFIG_BLK_DEV_FD=m
+# CONFIG_PARIDE is not set
+# CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set
+# CONFIG_BLK_CPQ_CISS_DA is not set
+# CONFIG_BLK_DEV_DAC960 is not set
+# CONFIG_BLK_DEV_UMEM is not set
+# CONFIG_BLK_DEV_COW_COMMON is not set
+CONFIG_BLK_DEV_LOOP=y
+CONFIG_BLK_DEV_LOOP_MIN_COUNT=8
+CONFIG_BLK_DEV_CRYPTOLOOP=m
+# CONFIG_BLK_DEV_DRBD is not set
+CONFIG_BLK_DEV_NBD=m
+# CONFIG_BLK_DEV_SX8 is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_COUNT=16
+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
+# CONFIG_BLK_DEV_RSXX is not set
+# CONFIG_BLK_DEV_NVME is not set
+
+#
+# Misc devices
+#
+# CONFIG_SENSORS_LIS3LV02D is not set
+# CONFIG_AD525X_DPOT is not set
+# CONFIG_DUMMY_IRQ is not set
+# CONFIG_IBM_ASM is not set
+# CONFIG_PHANTOM is not set
+# CONFIG_SGI_IOC4 is not set
+# CONFIG_TIFM_CORE is not set
+# CONFIG_ICS932S401 is not set
+# CONFIG_ENCLOSURE_SERVICES is not set
+# CONFIG_HP_ILO is not set
+# CONFIG_APDS9802ALS is not set
+# CONFIG_ISL29003 is not set
+# CONFIG_ISL29020 is not set
+# CONFIG_SENSORS_TSL2550 is not set
+# CONFIG_SENSORS_BH1780 is not set
+# CONFIG_SENSORS_BH1770 is not set
+# CONFIG_SENSORS_APDS990X is not set
+# CONFIG_HMC6352 is not set
+# CONFIG_DS1682 is not set
+# CONFIG_TI_DAC7512 is not set
+CONFIG_BMP085=m
+CONFIG_BMP085_I2C=m
+# CONFIG_BMP085_SPI is not set
+CONFIG_PCH_PHUB=y
+# CONFIG_USB_SWITCH_FSA9480 is not set
+# CONFIG_LATTICE_ECP3_CONFIG is not set
+# CONFIG_SRAM is not set
+# CONFIG_C2PORT is not set
+
+#
+# EEPROM support
+#
+CONFIG_EEPROM_AT24=m
+# CONFIG_EEPROM_AT25 is not set
+# CONFIG_EEPROM_LEGACY is not set
+# CONFIG_EEPROM_MAX6875 is not set
+CONFIG_EEPROM_93CX6=m
+# CONFIG_EEPROM_93XX46 is not set
+# CONFIG_CB710_CORE is not set
+
+#
+# Texas Instruments shared transport line discipline
+#
+# CONFIG_TI_ST is not set
+# CONFIG_SENSORS_LIS3_I2C is not set
+
+#
+# Altera FPGA firmware download module
+#
+# CONFIG_ALTERA_STAPL is not set
+CONFIG_INTEL_MEI=m
+CONFIG_INTEL_MEI_ME=m
+# CONFIG_INTEL_MEI_TXE is not set
+# CONFIG_VMWARE_VMCI is not set
+
+#
+# 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=y
+
+#
+# Please see Documentation/ide/ide.txt for help/info on IDE drives
+#
+CONFIG_IDE_XFER_MODE=y
+CONFIG_IDE_ATAPI=y
+# CONFIG_BLK_DEV_IDE_SATA is not set
+CONFIG_IDE_GD=y
+CONFIG_IDE_GD_ATA=y
+# CONFIG_IDE_GD_ATAPI is not set
+CONFIG_BLK_DEV_IDECD=y
+CONFIG_BLK_DEV_IDECD_VERBOSE_ERRORS=y
+# CONFIG_BLK_DEV_IDETAPE is not set
+# CONFIG_BLK_DEV_IDEACPI is not set
+# CONFIG_IDE_TASK_IOCTL is not set
+CONFIG_IDE_PROC_FS=y
+
+#
+# IDE chipset support/bugfixes
+#
+# CONFIG_IDE_GENERIC is not set
+# CONFIG_BLK_DEV_PLATFORM is not set
+# CONFIG_BLK_DEV_CMD640 is not set
+# CONFIG_BLK_DEV_IDEPNP is not set
+CONFIG_BLK_DEV_IDEDMA_SFF=y
+
+#
+# PCI IDE chipsets support
+#
+CONFIG_BLK_DEV_IDEPCI=y
+CONFIG_IDEPCI_PCIBUS_ORDER=y
+# CONFIG_BLK_DEV_GENERIC is not set
+# CONFIG_BLK_DEV_OPTI621 is not set
+# CONFIG_BLK_DEV_RZ1000 is not set
+CONFIG_BLK_DEV_IDEDMA_PCI=y
+# CONFIG_BLK_DEV_AEC62XX is not set
+# CONFIG_BLK_DEV_ALI15X3 is not set
+# CONFIG_BLK_DEV_AMD74XX is not set
+# CONFIG_BLK_DEV_ATIIXP is not set
+# CONFIG_BLK_DEV_CMD64X is not set
+# CONFIG_BLK_DEV_TRIFLEX is not set
+# CONFIG_BLK_DEV_CS5520 is not set
+# CONFIG_BLK_DEV_CS5530 is not set
+# CONFIG_BLK_DEV_CS5535 is not set
+# CONFIG_BLK_DEV_CS5536 is not set
+# CONFIG_BLK_DEV_HPT366 is not set
+# CONFIG_BLK_DEV_JMICRON is not set
+# CONFIG_BLK_DEV_SC1200 is not set
+CONFIG_BLK_DEV_PIIX=y
+# CONFIG_BLK_DEV_IT8172 is not set
+# CONFIG_BLK_DEV_IT8213 is not set
+# CONFIG_BLK_DEV_IT821X is not set
+# CONFIG_BLK_DEV_NS87415 is not set
+# CONFIG_BLK_DEV_PDC202XX_OLD is not set
+# CONFIG_BLK_DEV_PDC202XX_NEW is not set
+# CONFIG_BLK_DEV_SVWKS is not set
+# CONFIG_BLK_DEV_SIIMAGE is not set
+# CONFIG_BLK_DEV_SIS5513 is not set
+# CONFIG_BLK_DEV_SLC90E66 is not set
+# CONFIG_BLK_DEV_TRM290 is not set
+# CONFIG_BLK_DEV_VIA82CXXX is not set
+# CONFIG_BLK_DEV_TC86C001 is not set
+CONFIG_BLK_DEV_IDEDMA=y
+
+#
+# SCSI device support
+#
+CONFIG_SCSI_MOD=y
+# CONFIG_RAID_ATTRS is not set
+CONFIG_SCSI=y
+CONFIG_SCSI_DMA=y
+# CONFIG_SCSI_NETLINK is not set
+# CONFIG_SCSI_MQ_DEFAULT is not set
+CONFIG_SCSI_PROC_FS=y
+
+#
+# SCSI support type (disk, tape, CD-ROM)
+#
+CONFIG_BLK_DEV_SD=y
+# CONFIG_CHR_DEV_ST is not set
+# CONFIG_CHR_DEV_OSST is not set
+CONFIG_BLK_DEV_SR=y
+# CONFIG_BLK_DEV_SR_VENDOR is not set
+# CONFIG_CHR_DEV_SG is not set
+# CONFIG_CHR_DEV_SCH is not set
+# CONFIG_SCSI_CONSTANTS is not set
+# CONFIG_SCSI_LOGGING is not set
+# CONFIG_SCSI_SCAN_ASYNC is not set
+
+#
+# SCSI Transports
+#
+# CONFIG_SCSI_SPI_ATTRS is not set
+# CONFIG_SCSI_FC_ATTRS is not set
+# CONFIG_SCSI_ISCSI_ATTRS is not set
+# CONFIG_SCSI_SAS_ATTRS is not set
+# CONFIG_SCSI_SAS_LIBSAS is not set
+# CONFIG_SCSI_SRP_ATTRS is not set
+CONFIG_SCSI_LOWLEVEL=y
+# CONFIG_ISCSI_TCP is not set
+# CONFIG_ISCSI_BOOT_SYSFS is not set
+# CONFIG_SCSI_CXGB3_ISCSI is not set
+# CONFIG_SCSI_CXGB4_ISCSI is not set
+# CONFIG_SCSI_BNX2_ISCSI is not set
+# CONFIG_BE2ISCSI is not set
+# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
+# CONFIG_SCSI_HPSA is not set
+# CONFIG_SCSI_3W_9XXX is not set
+# CONFIG_SCSI_3W_SAS is not set
+# CONFIG_SCSI_ACARD is not set
+# CONFIG_SCSI_AACRAID is not set
+# CONFIG_SCSI_AIC7XXX is not set
+# CONFIG_SCSI_AIC79XX is not set
+# CONFIG_SCSI_AIC94XX is not set
+# CONFIG_SCSI_MVSAS is not set
+# CONFIG_SCSI_MVUMI is not set
+# CONFIG_SCSI_DPT_I2O is not set
+# CONFIG_SCSI_ADVANSYS is not set
+# CONFIG_SCSI_ARCMSR is not set
+# CONFIG_SCSI_ESAS2R is not set
+# CONFIG_MEGARAID_NEWGEN is not set
+# CONFIG_MEGARAID_LEGACY is not set
+# CONFIG_MEGARAID_SAS is not set
+# CONFIG_SCSI_MPT3SAS is not set
+# CONFIG_SCSI_MPT2SAS is not set
+# CONFIG_SCSI_UFSHCD is not set
+# CONFIG_SCSI_HPTIOP is not set
+# CONFIG_SCSI_BUSLOGIC is not set
+# CONFIG_VMWARE_PVSCSI is not set
+# CONFIG_SCSI_SNIC is not set
+# CONFIG_SCSI_DMX3191D is not set
+# CONFIG_SCSI_EATA is not set
+# CONFIG_SCSI_FUTURE_DOMAIN is not set
+# CONFIG_SCSI_GDTH is not set
+# CONFIG_SCSI_ISCI is not set
+# CONFIG_SCSI_IPS is not set
+# CONFIG_SCSI_INITIO is not set
+# CONFIG_SCSI_INIA100 is not set
+# CONFIG_SCSI_PPA is not set
+# CONFIG_SCSI_IMM is not set
+# CONFIG_SCSI_STEX is not set
+# CONFIG_SCSI_SYM53C8XX_2 is not set
+# CONFIG_SCSI_IPR is not set
+# CONFIG_SCSI_QLOGIC_1280 is not set
+# CONFIG_SCSI_QLA_ISCSI is not set
+# CONFIG_SCSI_DC395x is not set
+# CONFIG_SCSI_AM53C974 is not set
+# CONFIG_SCSI_NSP32 is not set
+# CONFIG_SCSI_WD719X is not set
+# CONFIG_SCSI_DEBUG is not set
+# CONFIG_SCSI_PMCRAID is not set
+# CONFIG_SCSI_PM8001 is not set
+# CONFIG_SCSI_DH is not set
+# CONFIG_SCSI_OSD_INITIATOR is not set
+CONFIG_ATA=y
+# CONFIG_ATA_NONSTANDARD is not set
+CONFIG_ATA_VERBOSE_ERROR=y
+CONFIG_ATA_ACPI=y
+# CONFIG_SATA_ZPODD is not set
+CONFIG_SATA_PMP=y
+
+#
+# Controllers with non-SFF native interface
+#
+CONFIG_SATA_AHCI=y
+# CONFIG_SATA_AHCI_PLATFORM is not set
+# CONFIG_SATA_INIC162X is not set
+# CONFIG_SATA_ACARD_AHCI is not set
+# CONFIG_SATA_SIL24 is not set
+CONFIG_ATA_SFF=y
+
+#
+# SFF controllers with custom DMA interface
+#
+# CONFIG_PDC_ADMA is not set
+# CONFIG_SATA_QSTOR is not set
+# CONFIG_SATA_SX4 is not set
+CONFIG_ATA_BMDMA=y
+
+#
+# SATA SFF controllers with BMDMA
+#
+CONFIG_ATA_PIIX=m
+# CONFIG_SATA_MV is not set
+# CONFIG_SATA_NV is not set
+# CONFIG_SATA_PROMISE is not set
+# CONFIG_SATA_SIL is not set
+# CONFIG_SATA_SIS is not set
+# CONFIG_SATA_SVW is not set
+# CONFIG_SATA_ULI is not set
+# CONFIG_SATA_VIA is not set
+# CONFIG_SATA_VITESSE is not set
+
+#
+# PATA SFF controllers with BMDMA
+#
+# CONFIG_PATA_ALI is not set
+# CONFIG_PATA_AMD is not set
+# CONFIG_PATA_ARTOP is not set
+# CONFIG_PATA_ATIIXP is not set
+# CONFIG_PATA_ATP867X is not set
+# CONFIG_PATA_CMD64X is not set
+# CONFIG_PATA_CS5520 is not set
+# CONFIG_PATA_CS5530 is not set
+# CONFIG_PATA_CS5535 is not set
+# CONFIG_PATA_CS5536 is not set
+# CONFIG_PATA_CYPRESS is not set
+# CONFIG_PATA_EFAR is not set
+# CONFIG_PATA_HPT366 is not set
+# CONFIG_PATA_HPT37X is not set
+# CONFIG_PATA_HPT3X2N is not set
+# CONFIG_PATA_HPT3X3 is not set
+# CONFIG_PATA_IT8213 is not set
+# CONFIG_PATA_IT821X is not set
+# CONFIG_PATA_JMICRON is not set
+# CONFIG_PATA_MARVELL is not set
+# CONFIG_PATA_NETCELL is not set
+# CONFIG_PATA_NINJA32 is not set
+# CONFIG_PATA_NS87415 is not set
+# CONFIG_PATA_OLDPIIX is not set
+# CONFIG_PATA_OPTIDMA is not set
+# CONFIG_PATA_PDC2027X is not set
+# CONFIG_PATA_PDC_OLD is not set
+# CONFIG_PATA_RADISYS is not set
+# CONFIG_PATA_RDC is not set
+# CONFIG_PATA_SC1200 is not set
+CONFIG_PATA_SCH=y
+# CONFIG_PATA_SERVERWORKS is not set
+# CONFIG_PATA_SIL680 is not set
+# CONFIG_PATA_SIS is not set
+# CONFIG_PATA_TOSHIBA is not set
+# CONFIG_PATA_TRIFLEX is not set
+# CONFIG_PATA_VIA is not set
+# CONFIG_PATA_WINBOND is not set
+
+#
+# PIO-only SFF controllers
+#
+# CONFIG_PATA_CMD640_PCI is not set
+# CONFIG_PATA_MPIIX is not set
+# CONFIG_PATA_NS87410 is not set
+# CONFIG_PATA_OPTI is not set
+# CONFIG_PATA_PLATFORM is not set
+# CONFIG_PATA_RZ1000 is not set
+
+#
+# Generic fallback / legacy drivers
+#
+# CONFIG_PATA_ACPI is not set
+# CONFIG_ATA_GENERIC is not set
+# CONFIG_PATA_LEGACY is not set
+CONFIG_MD=y
+CONFIG_BLK_DEV_MD=y
+CONFIG_MD_AUTODETECT=y
+CONFIG_MD_LINEAR=y
+CONFIG_MD_RAID0=y
+CONFIG_MD_RAID1=y
+CONFIG_MD_RAID10=y
+# CONFIG_MD_RAID456 is not set
+CONFIG_MD_MULTIPATH=y
+CONFIG_MD_FAULTY=y
+# CONFIG_BCACHE is not set
+CONFIG_BLK_DEV_DM_BUILTIN=y
+CONFIG_BLK_DEV_DM=y
+# CONFIG_DM_MQ_DEFAULT is not set
+# CONFIG_DM_DEBUG is not set
+CONFIG_DM_BUFIO=y
+CONFIG_DM_CRYPT=y
+CONFIG_DM_SNAPSHOT=y
+# CONFIG_DM_THIN_PROVISIONING is not set
+# CONFIG_DM_CACHE is not set
+# CONFIG_DM_ERA is not set
+CONFIG_DM_MIRROR=y
+# CONFIG_DM_LOG_USERSPACE is not set
+# CONFIG_DM_RAID is not set
+CONFIG_DM_ZERO=y
+# CONFIG_DM_MULTIPATH is not set
+# CONFIG_DM_DELAY is not set
+# CONFIG_DM_UEVENT is not set
+# CONFIG_DM_FLAKEY is not set
+# CONFIG_DM_VERITY is not set
+# CONFIG_DM_SWITCH is not set
+# CONFIG_DM_LOG_WRITES is not set
+# CONFIG_TARGET_CORE is not set
+# CONFIG_FUSION is not set
+
+#
+# IEEE 1394 (FireWire) support
+#
+# CONFIG_FIREWIRE is not set
+# CONFIG_FIREWIRE_NOSY is not set
+# CONFIG_MACINTOSH_DRIVERS is not set
+CONFIG_NETDEVICES=y
+CONFIG_MII=y
+CONFIG_NET_CORE=y
+CONFIG_BONDING=m
+CONFIG_DUMMY=m
+# CONFIG_EQUALIZER is not set
+# CONFIG_NET_FC is not set
+# CONFIG_IFB 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_GENEVE is not set
+CONFIG_NETCONSOLE=y
+# CONFIG_NETCONSOLE_DYNAMIC is not set
+CONFIG_NETPOLL=y
+CONFIG_NET_POLL_CONTROLLER=y
+CONFIG_TUN=m
+# CONFIG_TUN_VNET_CROSS_LE is not set
+# CONFIG_VETH is not set
+# CONFIG_NLMON is not set
+# CONFIG_ARCNET is not set
+
+#
+# CAIF transport drivers
+#
+# CONFIG_VHOST_NET is not set
+# CONFIG_VHOST_CROSS_ENDIAN_LEGACY is not set
+
+#
+# Distributed Switch Architecture drivers
+#
+# CONFIG_NET_DSA_MV88E6XXX is not set
+# CONFIG_NET_DSA_MV88E6XXX_NEED_PPU is not set
+CONFIG_ETHERNET=y
+CONFIG_NET_VENDOR_3COM=y
+# CONFIG_VORTEX is not set
+# CONFIG_TYPHOON is not set
+CONFIG_NET_VENDOR_ADAPTEC=y
+# CONFIG_ADAPTEC_STARFIRE is not set
+CONFIG_NET_VENDOR_AGERE=y
+# CONFIG_ET131X is not set
+CONFIG_NET_VENDOR_ALTEON=y
+# CONFIG_ACENIC is not set
+# CONFIG_ALTERA_TSE is not set
+CONFIG_NET_VENDOR_AMD=y
+# CONFIG_AMD8111_ETH is not set
+CONFIG_PCNET32=y
+CONFIG_NET_VENDOR_ARC=y
+CONFIG_NET_VENDOR_ATHEROS=y
+CONFIG_ATL2=m
+# CONFIG_ATL1 is not set
+CONFIG_ATL1E=m
+# CONFIG_ATL1C is not set
+# CONFIG_ALX is not set
+# CONFIG_NET_VENDOR_AURORA is not set
+CONFIG_NET_CADENCE=y
+# CONFIG_MACB is not set
+CONFIG_NET_VENDOR_BROADCOM=y
+# CONFIG_B44 is not set
+# CONFIG_BCMGENET is not set
+# CONFIG_BNX2 is not set
+# CONFIG_CNIC is not set
+CONFIG_TIGON3=y
+# CONFIG_BNX2X is not set
+# CONFIG_BNXT is not set
+CONFIG_NET_VENDOR_BROCADE=y
+# CONFIG_BNA is not set
+CONFIG_NET_VENDOR_CAVIUM=y
+CONFIG_NET_VENDOR_CHELSIO=y
+# CONFIG_CHELSIO_T1 is not set
+# CONFIG_CHELSIO_T3 is not set
+# CONFIG_CHELSIO_T4 is not set
+# CONFIG_CHELSIO_T4VF is not set
+CONFIG_NET_VENDOR_CISCO=y
+# CONFIG_ENIC is not set
+# CONFIG_CX_ECAT is not set
+# CONFIG_DNET is not set
+CONFIG_NET_VENDOR_DEC=y
+# CONFIG_NET_TULIP is not set
+CONFIG_NET_VENDOR_DLINK=y
+# CONFIG_DL2K is not set
+# CONFIG_SUNDANCE is not set
+CONFIG_NET_VENDOR_EMULEX=y
+# CONFIG_BE2NET is not set
+CONFIG_NET_VENDOR_EZCHIP=y
+CONFIG_NET_VENDOR_EXAR=y
+# CONFIG_S2IO is not set
+# CONFIG_VXGE is not set
+CONFIG_NET_VENDOR_HP=y
+# CONFIG_HP100 is not set
+CONFIG_NET_VENDOR_INTEL=y
+# CONFIG_E100 is not set
+CONFIG_E1000=y
+# CONFIG_E1000E is not set
+# CONFIG_IGB is not set
+# CONFIG_IGBVF is not set
+# CONFIG_IXGB is not set
+# CONFIG_IXGBE is not set
+# CONFIG_IXGBEVF is not set
+# CONFIG_I40E is not set
+# CONFIG_I40EVF is not set
+# CONFIG_FM10K is not set
+CONFIG_NET_VENDOR_I825XX=y
+# CONFIG_JME is not set
+CONFIG_NET_VENDOR_MARVELL=y
+# CONFIG_MVMDIO is not set
+# CONFIG_SKGE is not set
+# CONFIG_SKY2 is not set
+CONFIG_NET_VENDOR_MELLANOX=y
+# CONFIG_MLX4_EN is not set
+# CONFIG_MLX4_CORE is not set
+# CONFIG_MLX5_CORE is not set
+# CONFIG_MLXSW_CORE is not set
+CONFIG_NET_VENDOR_MICREL=y
+# CONFIG_KS8842 is not set
+# CONFIG_KS8851 is not set
+# CONFIG_KS8851_MLL is not set
+# CONFIG_KSZ884X_PCI is not set
+CONFIG_NET_VENDOR_MICROCHIP=y
+# CONFIG_ENC28J60 is not set
+# CONFIG_ENCX24J600 is not set
+CONFIG_NET_VENDOR_MYRI=y
+# CONFIG_MYRI10GE is not set
+# CONFIG_FEALNX is not set
+CONFIG_NET_VENDOR_NATSEMI=y
+# CONFIG_NATSEMI is not set
+# CONFIG_NS83820 is not set
+CONFIG_NET_VENDOR_8390=y
+# CONFIG_NE2K_PCI is not set
+CONFIG_NET_VENDOR_NVIDIA=y
+# CONFIG_FORCEDETH is not set
+CONFIG_NET_VENDOR_OKI=y
+CONFIG_PCH_GBE=y
+# CONFIG_ETHOC is not set
+CONFIG_NET_PACKET_ENGINE=y
+# CONFIG_HAMACHI is not set
+# CONFIG_YELLOWFIN is not set
+CONFIG_NET_VENDOR_QLOGIC=y
+# CONFIG_QLA3XXX is not set
+# CONFIG_QLCNIC is not set
+# CONFIG_QLGE is not set
+# CONFIG_NETXEN_NIC is not set
+# CONFIG_QED is not set
+CONFIG_NET_VENDOR_QUALCOMM=y
+CONFIG_NET_VENDOR_REALTEK=y
+# CONFIG_ATP is not set
+CONFIG_8139CP=m
+CONFIG_8139TOO=m
+CONFIG_8139TOO_PIO=y
+# CONFIG_8139TOO_TUNE_TWISTER is not set
+# CONFIG_8139TOO_8129 is not set
+# CONFIG_8139_OLD_RX_RESET is not set
+CONFIG_R8169=m
+CONFIG_NET_VENDOR_RENESAS=y
+CONFIG_NET_VENDOR_RDC=y
+# CONFIG_R6040 is not set
+CONFIG_NET_VENDOR_ROCKER=y
+CONFIG_NET_VENDOR_SAMSUNG=y
+# CONFIG_SXGBE_ETH is not set
+CONFIG_NET_VENDOR_SEEQ=y
+CONFIG_NET_VENDOR_SILAN=y
+# CONFIG_SC92031 is not set
+CONFIG_NET_VENDOR_SIS=y
+# CONFIG_SIS900 is not set
+# CONFIG_SIS190 is not set
+# CONFIG_SFC is not set
+CONFIG_NET_VENDOR_SMSC=y
+# CONFIG_EPIC100 is not set
+# CONFIG_SMSC911X is not set
+# CONFIG_SMSC9420 is not set
+CONFIG_NET_VENDOR_STMICRO=y
+CONFIG_STMMAC_ETH=y
+CONFIG_STMMAC_PLATFORM=y
+CONFIG_DWMAC_GENERIC=y
+CONFIG_STMMAC_PCI=y
+CONFIG_NET_VENDOR_SUN=y
+# CONFIG_HAPPYMEAL is not set
+# CONFIG_SUNGEM is not set
+# CONFIG_CASSINI is not set
+# CONFIG_NIU is not set
+CONFIG_NET_VENDOR_SYNOPSYS=y
+CONFIG_NET_VENDOR_TEHUTI=y
+# CONFIG_TEHUTI is not set
+CONFIG_NET_VENDOR_TI=y
+# CONFIG_TI_CPSW_ALE is not set
+# CONFIG_TLAN is not set
+CONFIG_NET_VENDOR_VIA=y
+# CONFIG_VIA_RHINE is not set
+# CONFIG_VIA_VELOCITY is not set
+CONFIG_NET_VENDOR_WIZNET=y
+# CONFIG_WIZNET_W5100 is not set
+# CONFIG_WIZNET_W5300 is not set
+# CONFIG_FDDI is not set
+# CONFIG_HIPPI is not set
+# CONFIG_NET_SB1000 is not set
+CONFIG_PHYLIB=y
+
+#
+# MII PHY device drivers
+#
+# CONFIG_AQUANTIA_PHY is not set
+# CONFIG_AT803X_PHY is not set
+# CONFIG_AMD_PHY is not set
+# CONFIG_MARVELL_PHY is not set
+# CONFIG_DAVICOM_PHY is not set
+# CONFIG_QSEMI_PHY is not set
+# CONFIG_LXT_PHY is not set
+# CONFIG_CICADA_PHY is not set
+# CONFIG_VITESSE_PHY is not set
+# CONFIG_TERANETICS_PHY is not set
+# CONFIG_SMSC_PHY is not set
+# CONFIG_BROADCOM_PHY is not set
+# CONFIG_BCM7XXX_PHY is not set
+# CONFIG_BCM87XX_PHY is not set
+# CONFIG_ICPLUS_PHY is not set
+# CONFIG_REALTEK_PHY is not set
+# CONFIG_NATIONAL_PHY is not set
+# CONFIG_STE10XP is not set
+# CONFIG_LSI_ET1011C_PHY is not set
+# CONFIG_MICREL_PHY is not set
+# CONFIG_DP83848_PHY is not set
+# CONFIG_DP83867_PHY is not set
+# CONFIG_MICROCHIP_PHY is not set
+# CONFIG_FIXED_PHY is not set
+# CONFIG_MDIO_BITBANG is not set
+# CONFIG_MDIO_BCM_UNIMAC is not set
+# CONFIG_MICREL_KS8995MA is not set
+# CONFIG_PLIP is not set
+CONFIG_PPP=m
+CONFIG_PPP_BSDCOMP=m
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_FILTER=y
+# CONFIG_PPP_MPPE is not set
+CONFIG_PPP_MULTILINK=y
+CONFIG_PPPOE=m
+# CONFIG_PPTP is not set
+CONFIG_PPP_ASYNC=m
+CONFIG_PPP_SYNC_TTY=m
+CONFIG_SLIP=m
+CONFIG_SLHC=m
+CONFIG_SLIP_COMPRESSED=y
+CONFIG_SLIP_SMART=y
+CONFIG_SLIP_MODE_SLIP6=y
+CONFIG_USB_NET_DRIVERS=y
+# CONFIG_USB_CATC is not set
+# CONFIG_USB_KAWETH is not set
+# CONFIG_USB_PEGASUS is not set
+# CONFIG_USB_RTL8150 is not set
+# CONFIG_USB_RTL8152 is not set
+# CONFIG_USB_LAN78XX is not set
+# CONFIG_USB_USBNET is not set
+# CONFIG_USB_HSO is not set
+# CONFIG_USB_IPHETH is not set
+CONFIG_WLAN=y
+# CONFIG_LIBERTAS_THINFIRM is not set
+# CONFIG_AIRO is not set
+# CONFIG_ATMEL is not set
+# CONFIG_AT76C50X_USB is not set
+# CONFIG_PRISM54 is not set
+# CONFIG_USB_ZD1201 is not set
+# CONFIG_USB_NET_RNDIS_WLAN is not set
+# CONFIG_ADM8211 is not set
+# CONFIG_RTL8180 is not set
+# CONFIG_RTL8187 is not set
+# CONFIG_MAC80211_HWSIM is not set
+# CONFIG_MWL8K is not set
+CONFIG_ATH_COMMON=m
+CONFIG_ATH_CARDS=m
+# CONFIG_ATH_DEBUG is not set
+CONFIG_ATH5K=m
+# CONFIG_ATH5K_DEBUG is not set
+# CONFIG_ATH5K_TRACER is not set
+CONFIG_ATH5K_PCI=y
+CONFIG_ATH9K_HW=m
+CONFIG_ATH9K_COMMON=m
+CONFIG_ATH9K_BTCOEX_SUPPORT=y
+CONFIG_ATH9K=m
+CONFIG_ATH9K_PCI=y
+# CONFIG_ATH9K_AHB is not set
+# CONFIG_ATH9K_DEBUGFS is not set
+# CONFIG_ATH9K_DYNACK is not set
+# CONFIG_ATH9K_WOW is not set
+CONFIG_ATH9K_RFKILL=y
+# CONFIG_ATH9K_CHANNEL_CONTEXT is not set
+CONFIG_ATH9K_PCOEM=y
+# CONFIG_ATH9K_HTC is not set
+# CONFIG_CARL9170 is not set
+# CONFIG_ATH6KL is not set
+# CONFIG_AR5523 is not set
+# CONFIG_WIL6210 is not set
+# CONFIG_ATH10K is not set
+# CONFIG_WCN36XX is not set
+# CONFIG_B43 is not set
+# CONFIG_B43LEGACY is not set
+CONFIG_BRCMUTIL=m
+CONFIG_BRCMSMAC=m
+CONFIG_BRCMFMAC=m
+CONFIG_BRCMFMAC_PROTO_BCDC=y
+CONFIG_BRCMFMAC_SDIO=y
+CONFIG_BRCMFMAC_USB=y
+# CONFIG_BRCMFMAC_PCIE is not set
+# CONFIG_BRCM_TRACING is not set
+# CONFIG_BRCMDBG is not set
+# CONFIG_HOSTAP is not set
+# CONFIG_IPW2100 is not set
+# CONFIG_IPW2200 is not set
+CONFIG_IWLWIFI=m
+CONFIG_IWLWIFI_LEDS=y
+CONFIG_IWLDVM=m
+CONFIG_IWLMVM=m
+CONFIG_IWLWIFI_OPMODE_MODULAR=y
+# CONFIG_IWLWIFI_BCAST_FILTERING is not set
+# CONFIG_IWLWIFI_UAPSD is not set
+
+#
+# Debugging Options
+#
+# CONFIG_IWLWIFI_DEBUG is not set
+CONFIG_IWLWIFI_DEVICE_TRACING=y
+# CONFIG_IWL4965 is not set
+# CONFIG_IWL3945 is not set
+# CONFIG_LIBERTAS is not set
+# CONFIG_HERMES is not set
+# CONFIG_P54_COMMON is not set
+CONFIG_RT2X00=m
+# CONFIG_RT2400PCI is not set
+# CONFIG_RT2500PCI is not set
+# CONFIG_RT61PCI is not set
+CONFIG_RT2800PCI=m
+CONFIG_RT2800PCI_RT33XX=y
+CONFIG_RT2800PCI_RT35XX=y
+CONFIG_RT2800PCI_RT53XX=y
+CONFIG_RT2800PCI_RT3290=y
+# CONFIG_RT2500USB is not set
+# CONFIG_RT73USB is not set
+# CONFIG_RT2800USB is not set
+CONFIG_RT2800_LIB=m
+CONFIG_RT2800_LIB_MMIO=m
+CONFIG_RT2X00_LIB_MMIO=m
+CONFIG_RT2X00_LIB_PCI=m
+CONFIG_RT2X00_LIB=m
+CONFIG_RT2X00_LIB_FIRMWARE=y
+CONFIG_RT2X00_LIB_CRYPTO=y
+CONFIG_RT2X00_LIB_LEDS=y
+# CONFIG_RT2X00_DEBUG is not set
+# CONFIG_WL_MEDIATEK is not set
+CONFIG_RTL_CARDS=m
+# CONFIG_RTL8192CE is not set
+# CONFIG_RTL8192SE is not set
+# CONFIG_RTL8192DE is not set
+# CONFIG_RTL8723AE is not set
+# CONFIG_RTL8723BE is not set
+# CONFIG_RTL8188EE is not set
+# CONFIG_RTL8192EE is not set
+# CONFIG_RTL8821AE is not set
+CONFIG_RTL8192CU=m
+CONFIG_RTLWIFI=m
+CONFIG_RTLWIFI_USB=m
+CONFIG_RTLWIFI_DEBUG=y
+CONFIG_RTL8192C_COMMON=m
+CONFIG_RTL8XXXU=m
+# CONFIG_RTL8XXXU_UNTESTED is not set
+# CONFIG_WL_TI is not set
+# CONFIG_ZD1211RW is not set
+# CONFIG_MWIFIEX is not set
+# CONFIG_CW1200 is not set
+# CONFIG_RSI_91X is not set
+
+#
+# Enable WiMAX (Networking options) to see the WiMAX drivers
+#
+# CONFIG_WAN is not set
+# CONFIG_VMXNET3 is not set
+# CONFIG_FUJITSU_ES 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=y
+CONFIG_INPUT_MOUSEDEV_PSAUX=y
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+# CONFIG_INPUT_JOYDEV is not set
+CONFIG_INPUT_EVDEV=y
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+# CONFIG_KEYBOARD_ADP5588 is not set
+# CONFIG_KEYBOARD_ADP5589 is not set
+CONFIG_KEYBOARD_ATKBD=y
+# CONFIG_KEYBOARD_QT1070 is not set
+# CONFIG_KEYBOARD_QT2160 is not set
+# CONFIG_KEYBOARD_LKKBD is not set
+# CONFIG_KEYBOARD_GPIO is not set
+# CONFIG_KEYBOARD_GPIO_POLLED is not set
+# CONFIG_KEYBOARD_TCA6416 is not set
+# CONFIG_KEYBOARD_TCA8418 is not set
+# CONFIG_KEYBOARD_MATRIX is not set
+# CONFIG_KEYBOARD_LM8323 is not set
+# CONFIG_KEYBOARD_LM8333 is not set
+# CONFIG_KEYBOARD_MAX7359 is not set
+# CONFIG_KEYBOARD_MCS is not set
+# CONFIG_KEYBOARD_MPR121 is not set
+# CONFIG_KEYBOARD_NEWTON is not set
+# CONFIG_KEYBOARD_OPENCORES is not set
+# CONFIG_KEYBOARD_SAMSUNG is not set
+# CONFIG_KEYBOARD_STOWAWAY is not set
+# CONFIG_KEYBOARD_SUNKBD is not set
+# CONFIG_KEYBOARD_XTKBD is not set
+CONFIG_INPUT_MOUSE=y
+CONFIG_MOUSE_PS2=y
+CONFIG_MOUSE_PS2_ALPS=y
+CONFIG_MOUSE_PS2_LOGIPS2PP=y
+CONFIG_MOUSE_PS2_SYNAPTICS=y
+CONFIG_MOUSE_PS2_CYPRESS=y
+CONFIG_MOUSE_PS2_LIFEBOOK=y
+CONFIG_MOUSE_PS2_TRACKPOINT=y
+# CONFIG_MOUSE_PS2_ELANTECH is not set
+# CONFIG_MOUSE_PS2_SENTELIC is not set
+# CONFIG_MOUSE_PS2_TOUCHKIT is not set
+CONFIG_MOUSE_PS2_FOCALTECH=y
+# CONFIG_MOUSE_SERIAL is not set
+# CONFIG_MOUSE_APPLETOUCH is not set
+# CONFIG_MOUSE_BCM5974 is not set
+# CONFIG_MOUSE_CYAPA is not set
+# CONFIG_MOUSE_ELAN_I2C is not set
+# CONFIG_MOUSE_VSXXXAA is not set
+# CONFIG_MOUSE_GPIO is not set
+# CONFIG_MOUSE_SYNAPTICS_I2C is not set
+# CONFIG_MOUSE_SYNAPTICS_USB is not set
+# CONFIG_INPUT_JOYSTICK is not set
+CONFIG_INPUT_TABLET=y
+# CONFIG_TABLET_USB_ACECAD is not set
+# CONFIG_TABLET_USB_AIPTEK is not set
+# CONFIG_TABLET_USB_GTCO is not set
+# CONFIG_TABLET_USB_HANWANG is not set
+# CONFIG_TABLET_USB_KBTAB is not set
+# CONFIG_TABLET_SERIAL_WACOM4 is not set
+# CONFIG_INPUT_TOUCHSCREEN is not set
+# CONFIG_INPUT_MISC is not set
+
+#
+# Hardware I/O ports
+#
+CONFIG_SERIO=y
+CONFIG_ARCH_MIGHT_HAVE_PC_SERIO=y
+CONFIG_SERIO_I8042=y
+CONFIG_SERIO_SERPORT=y
+# CONFIG_SERIO_CT82C710 is not set
+# CONFIG_SERIO_PARKBD is not set
+# CONFIG_SERIO_PCIPS2 is not set
+CONFIG_SERIO_LIBPS2=y
+# 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_VT_CONSOLE_SLEEP=y
+CONFIG_HW_CONSOLE=y
+# CONFIG_VT_HW_CONSOLE_BINDING is not set
+CONFIG_UNIX98_PTYS=y
+# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
+# CONFIG_SERIAL_NONSTANDARD is not set
+# CONFIG_NOZOMI is not set
+# CONFIG_N_GSM is not set
+# CONFIG_TRACE_SINK is not set
+CONFIG_DEVMEM=y
+CONFIG_DEVKMEM=y
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_EARLYCON=y
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_DEPRECATED_OPTIONS=y
+CONFIG_SERIAL_8250_PNP=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_8250_DMA=y
+CONFIG_SERIAL_8250_PCI=y
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+# CONFIG_SERIAL_8250_EXTENDED is not set
+# CONFIG_SERIAL_8250_FSL is not set
+# CONFIG_SERIAL_8250_DW is not set
+# CONFIG_SERIAL_8250_RT288X is not set
+# CONFIG_SERIAL_8250_FINTEK is not set
+# CONFIG_SERIAL_8250_MID 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_JSM is not set
+# CONFIG_SERIAL_SCCNXP is not set
+# CONFIG_SERIAL_SC16IS7XX is not set
+# CONFIG_SERIAL_TIMBERDALE is not set
+# CONFIG_SERIAL_ALTERA_JTAGUART is not set
+# CONFIG_SERIAL_ALTERA_UART is not set
+# CONFIG_SERIAL_IFX6X60 is not set
+CONFIG_SERIAL_PCH_UART=y
+CONFIG_SERIAL_PCH_UART_CONSOLE=y
+# CONFIG_SERIAL_ARC is not set
+# CONFIG_SERIAL_RP2 is not set
+# CONFIG_SERIAL_FSL_LPUART is not set
+# CONFIG_TTY_PRINTK is not set
+CONFIG_PRINTER=m
+# CONFIG_LP_CONSOLE is not set
+# CONFIG_PPDEV is not set
+# CONFIG_IPMI_HANDLER is not set
+CONFIG_HW_RANDOM=m
+# CONFIG_HW_RANDOM_TIMERIOMEM is not set
+CONFIG_HW_RANDOM_INTEL=m
+CONFIG_HW_RANDOM_AMD=m
+CONFIG_HW_RANDOM_GEODE=m
+CONFIG_HW_RANDOM_VIA=m
+# CONFIG_NVRAM is not set
+# CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
+# CONFIG_SONYPI is not set
+# CONFIG_MWAVE is not set
+# CONFIG_PC8736x_GPIO is not set
+# CONFIG_NSC_GPIO is not set
+# CONFIG_RAW_DRIVER is not set
+CONFIG_HPET=y
+CONFIG_HPET_MMAP=y
+CONFIG_HPET_MMAP_DEFAULT=y
+# CONFIG_HANGCHECK_TIMER is not set
+# CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
+CONFIG_DEVPORT=y
+# CONFIG_XILLYBUS is not set
+
+#
+# I2C support
+#
+CONFIG_I2C=y
+CONFIG_ACPI_I2C_OPREGION=y
+CONFIG_I2C_BOARDINFO=y
+CONFIG_I2C_COMPAT=y
+CONFIG_I2C_CHARDEV=m
+CONFIG_I2C_MUX=m
+
+#
+# Multiplexer I2C Chip support
+#
+# CONFIG_I2C_MUX_GPIO is not set
+# CONFIG_I2C_MUX_PCA9541 is not set
+# CONFIG_I2C_MUX_PCA954x is not set
+# CONFIG_I2C_MUX_REG is not set
+CONFIG_I2C_HELPER_AUTO=y
+
+#
+# I2C Hardware Bus support
+#
+
+#
+# PC SMBus host controller drivers
+#
+# CONFIG_I2C_ALI1535 is not set
+# CONFIG_I2C_ALI1563 is not set
+# CONFIG_I2C_ALI15X3 is not set
+# CONFIG_I2C_AMD756 is not set
+# CONFIG_I2C_AMD8111 is not set
+CONFIG_I2C_I801=y
+# CONFIG_I2C_ISCH is not set
+# CONFIG_I2C_ISMT is not set
+# CONFIG_I2C_PIIX4 is not set
+# CONFIG_I2C_NFORCE2 is not set
+# CONFIG_I2C_SIS5595 is not set
+# CONFIG_I2C_SIS630 is not set
+# CONFIG_I2C_SIS96X is not set
+# CONFIG_I2C_VIA is not set
+# CONFIG_I2C_VIAPRO is not set
+
+#
+# ACPI drivers
+#
+# CONFIG_I2C_SCMI is not set
+
+#
+# I2C system bus drivers (mostly embedded / system-on-chip)
+#
+# CONFIG_I2C_CBUS_GPIO is not set
+CONFIG_I2C_DESIGNWARE_CORE=y
+CONFIG_I2C_DESIGNWARE_PLATFORM=y
+# CONFIG_I2C_DESIGNWARE_PCI is not set
+# CONFIG_I2C_DESIGNWARE_BAYTRAIL is not set
+CONFIG_I2C_EG20T=y
+# CONFIG_I2C_EMEV2 is not set
+# CONFIG_I2C_GPIO is not set
+# CONFIG_I2C_OCORES is not set
+# CONFIG_I2C_PCA_PLATFORM is not set
+# CONFIG_I2C_PXA_PCI is not set
+# CONFIG_I2C_SIMTEC is not set
+# CONFIG_I2C_XILINX is not set
+
+#
+# External I2C/SMBus adapter drivers
+#
+# CONFIG_I2C_DIOLAN_U2C is not set
+# CONFIG_I2C_PARPORT is not set
+# CONFIG_I2C_PARPORT_LIGHT is not set
+# CONFIG_I2C_ROBOTFUZZ_OSIF is not set
+# CONFIG_I2C_TAOS_EVM is not set
+# CONFIG_I2C_TINY_USB is not set
+
+#
+# Other I2C/SMBus bus drivers
+#
+# CONFIG_SCx200_ACB is not set
+# CONFIG_I2C_STUB is not set
+# CONFIG_I2C_SLAVE is not set
+# CONFIG_I2C_DEBUG_CORE is not set
+# CONFIG_I2C_DEBUG_ALGO is not set
+# CONFIG_I2C_DEBUG_BUS is not set
+CONFIG_SPI=y
+# CONFIG_SPI_DEBUG is not set
+CONFIG_SPI_MASTER=y
+
+#
+# SPI Master Controller Drivers
+#
+# CONFIG_SPI_ALTERA is not set
+CONFIG_SPI_BITBANG=y
+# CONFIG_SPI_BUTTERFLY is not set
+# CONFIG_SPI_CADENCE is not set
+CONFIG_SPI_GPIO=y
+# CONFIG_SPI_LM70_LLP is not set
+# CONFIG_SPI_OC_TINY is not set
+CONFIG_SPI_PXA2XX_DMA=y
+CONFIG_SPI_PXA2XX=y
+CONFIG_SPI_PXA2XX_PCI=y
+# CONFIG_SPI_SC18IS602 is not set
+# CONFIG_SPI_TOPCLIFF_PCH is not set
+# CONFIG_SPI_XCOMM is not set
+# 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=m
+# CONFIG_SPI_TLE62X0 is not set
+# CONFIG_SPMI is not set
+# CONFIG_HSI is not set
+
+#
+# PPS support
+#
+CONFIG_PPS=y
+# CONFIG_PPS_DEBUG is not set
+
+#
+# PPS clients support
+#
+# CONFIG_PPS_CLIENT_KTIMER is not set
+# CONFIG_PPS_CLIENT_LDISC is not set
+# CONFIG_PPS_CLIENT_PARPORT is not set
+# CONFIG_PPS_CLIENT_GPIO is not set
+
+#
+# PPS generators support
+#
+
+#
+# PTP clock support
+#
+CONFIG_PTP_1588_CLOCK=y
+
+#
+# Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks.
+#
+CONFIG_PTP_1588_CLOCK_PCH=y
+CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y
+CONFIG_GPIOLIB=y
+CONFIG_GPIO_DEVRES=y
+CONFIG_GPIO_ACPI=y
+CONFIG_GPIOLIB_IRQCHIP=y
+# CONFIG_DEBUG_GPIO is not set
+CONFIG_GPIO_SYSFS=y
+CONFIG_GPIO_GENERIC=y
+
+#
+# Memory mapped GPIO drivers
+#
+# CONFIG_GPIO_AMDPT is not set
+CONFIG_GPIO_DWAPB=y
+# CONFIG_GPIO_GENERIC_PLATFORM is not set
+# CONFIG_GPIO_ICH is not set
+# CONFIG_GPIO_LYNXPOINT is not set
+# CONFIG_GPIO_VX855 is not set
+# CONFIG_GPIO_ZX is not set
+
+#
+# Port-mapped I/O GPIO drivers
+#
+# CONFIG_GPIO_104_IDIO_16 is not set
+# CONFIG_GPIO_F7188X is not set
+# CONFIG_GPIO_IT87 is not set
+CONFIG_GPIO_SCH=y
+# CONFIG_GPIO_SCH311X is not set
+
+#
+# I2C GPIO expanders
+#
+# CONFIG_GPIO_ADP5588 is not set
+# CONFIG_GPIO_MAX7300 is not set
+# CONFIG_GPIO_MAX732X is not set
+CONFIG_GPIO_PCA953X=y
+CONFIG_GPIO_PCA953X_IRQ=y
+# CONFIG_GPIO_PCF857X is not set
+# CONFIG_GPIO_SX150X is not set
+
+#
+# MFD GPIO expanders
+#
+
+#
+# PCI GPIO expanders
+#
+# CONFIG_GPIO_AMD8111 is not set
+# CONFIG_GPIO_BT8XX is not set
+# CONFIG_GPIO_INTEL_MID is not set
+# CONFIG_GPIO_ML_IOH is not set
+# CONFIG_GPIO_PCH is not set
+# CONFIG_GPIO_RDC321X is not set
+
+#
+# SPI GPIO expanders
+#
+# CONFIG_GPIO_MAX7301 is not set
+# CONFIG_GPIO_MC33880 is not set
+
+#
+# SPI or I2C GPIO expanders
+#
+# CONFIG_GPIO_MCP23S08 is not set
+
+#
+# USB GPIO expanders
+#
+# CONFIG_W1 is not set
+CONFIG_POWER_SUPPLY=y
+# CONFIG_POWER_SUPPLY_DEBUG is not set
+# CONFIG_PDA_POWER is not set
+# CONFIG_GENERIC_ADC_BATTERY is not set
+# CONFIG_TEST_POWER is not set
+# CONFIG_BATTERY_DS2780 is not set
+# CONFIG_BATTERY_DS2781 is not set
+# CONFIG_BATTERY_DS2782 is not set
+# CONFIG_BATTERY_SBS is not set
+# CONFIG_BATTERY_BQ27XXX is not set
+# CONFIG_BATTERY_MAX17040 is not set
+# CONFIG_BATTERY_MAX17042 is not set
+# CONFIG_CHARGER_MAX8903 is not set
+# CONFIG_CHARGER_LP8727 is not set
+# CONFIG_CHARGER_GPIO is not set
+# CONFIG_CHARGER_BQ2415X is not set
+# CONFIG_CHARGER_BQ24190 is not set
+# CONFIG_CHARGER_BQ24257 is not set
+# CONFIG_CHARGER_BQ24735 is not set
+# CONFIG_CHARGER_BQ25890 is not set
+# CONFIG_CHARGER_SMB347 is not set
+# CONFIG_BATTERY_GAUGE_LTC2941 is not set
+# CONFIG_CHARGER_RT9455 is not set
+# CONFIG_POWER_RESET is not set
+# CONFIG_POWER_AVS is not set
+CONFIG_HWMON=y
+# CONFIG_HWMON_VID is not set
+# CONFIG_HWMON_DEBUG_CHIP is not set
+
+#
+# Native drivers
+#
+# CONFIG_SENSORS_ABITUGURU is not set
+# CONFIG_SENSORS_ABITUGURU3 is not set
+# CONFIG_SENSORS_AD7314 is not set
+# CONFIG_SENSORS_AD7414 is not set
+# CONFIG_SENSORS_AD7418 is not set
+# CONFIG_SENSORS_ADM1021 is not set
+# CONFIG_SENSORS_ADM1025 is not set
+# CONFIG_SENSORS_ADM1026 is not set
+# CONFIG_SENSORS_ADM1029 is not set
+# CONFIG_SENSORS_ADM1031 is not set
+# CONFIG_SENSORS_ADM9240 is not set
+# CONFIG_SENSORS_ADT7310 is not set
+# CONFIG_SENSORS_ADT7410 is not set
+# CONFIG_SENSORS_ADT7411 is not set
+# CONFIG_SENSORS_ADT7462 is not set
+# CONFIG_SENSORS_ADT7470 is not set
+# CONFIG_SENSORS_ADT7475 is not set
+# CONFIG_SENSORS_ASC7621 is not set
+# CONFIG_SENSORS_K8TEMP is not set
+# CONFIG_SENSORS_K10TEMP is not set
+# CONFIG_SENSORS_FAM15H_POWER is not set
+# CONFIG_SENSORS_APPLESMC is not set
+# CONFIG_SENSORS_ASB100 is not set
+# CONFIG_SENSORS_ATXP1 is not set
+# CONFIG_SENSORS_DS620 is not set
+# CONFIG_SENSORS_DS1621 is not set
+# CONFIG_SENSORS_DELL_SMM is not set
+# CONFIG_SENSORS_I5K_AMB is not set
+# CONFIG_SENSORS_F71805F is not set
+# CONFIG_SENSORS_F71882FG is not set
+# CONFIG_SENSORS_F75375S is not set
+# CONFIG_SENSORS_FSCHMD is not set
+# CONFIG_SENSORS_GL518SM is not set
+# CONFIG_SENSORS_GL520SM is not set
+# CONFIG_SENSORS_G760A is not set
+# CONFIG_SENSORS_G762 is not set
+# CONFIG_SENSORS_GPIO_FAN is not set
+# CONFIG_SENSORS_HIH6130 is not set
+# CONFIG_SENSORS_IIO_HWMON is not set
+# CONFIG_SENSORS_I5500 is not set
+# CONFIG_SENSORS_CORETEMP is not set
+# CONFIG_SENSORS_IT87 is not set
+# CONFIG_SENSORS_JC42 is not set
+# CONFIG_SENSORS_POWR1220 is not set
+# CONFIG_SENSORS_LINEAGE is not set
+# CONFIG_SENSORS_LTC2945 is not set
+# CONFIG_SENSORS_LTC4151 is not set
+# CONFIG_SENSORS_LTC4215 is not set
+# CONFIG_SENSORS_LTC4222 is not set
+# CONFIG_SENSORS_LTC4245 is not set
+# CONFIG_SENSORS_LTC4260 is not set
+# CONFIG_SENSORS_LTC4261 is not set
+# CONFIG_SENSORS_MAX1111 is not set
+# CONFIG_SENSORS_MAX16065 is not set
+# CONFIG_SENSORS_MAX1619 is not set
+# CONFIG_SENSORS_MAX1668 is not set
+# CONFIG_SENSORS_MAX197 is not set
+# CONFIG_SENSORS_MAX6639 is not set
+# CONFIG_SENSORS_MAX6642 is not set
+# CONFIG_SENSORS_MAX6650 is not set
+# CONFIG_SENSORS_MAX6697 is not set
+# CONFIG_SENSORS_MAX31790 is not set
+# CONFIG_SENSORS_HTU21 is not set
+# CONFIG_SENSORS_MCP3021 is not set
+# CONFIG_SENSORS_ADCXX is not set
+# CONFIG_SENSORS_LM63 is not set
+# CONFIG_SENSORS_LM70 is not set
+# CONFIG_SENSORS_LM73 is not set
+# CONFIG_SENSORS_LM75 is not set
+# CONFIG_SENSORS_LM77 is not set
+# CONFIG_SENSORS_LM78 is not set
+# CONFIG_SENSORS_LM80 is not set
+# CONFIG_SENSORS_LM83 is not set
+# CONFIG_SENSORS_LM85 is not set
+# CONFIG_SENSORS_LM87 is not set
+# CONFIG_SENSORS_LM90 is not set
+# CONFIG_SENSORS_LM92 is not set
+# CONFIG_SENSORS_LM93 is not set
+# CONFIG_SENSORS_LM95234 is not set
+# CONFIG_SENSORS_LM95241 is not set
+# CONFIG_SENSORS_LM95245 is not set
+# CONFIG_SENSORS_PC87360 is not set
+# CONFIG_SENSORS_PC87427 is not set
+# CONFIG_SENSORS_NTC_THERMISTOR is not set
+# CONFIG_SENSORS_NCT6683 is not set
+# CONFIG_SENSORS_NCT6775 is not set
+# CONFIG_SENSORS_NCT7802 is not set
+# CONFIG_SENSORS_NCT7904 is not set
+# CONFIG_SENSORS_PCF8591 is not set
+# CONFIG_PMBUS is not set
+# CONFIG_SENSORS_SHT15 is not set
+# CONFIG_SENSORS_SHT21 is not set
+# CONFIG_SENSORS_SHTC1 is not set
+# CONFIG_SENSORS_SIS5595 is not set
+# CONFIG_SENSORS_DME1737 is not set
+# CONFIG_SENSORS_EMC1403 is not set
+# CONFIG_SENSORS_EMC2103 is not set
+# CONFIG_SENSORS_EMC6W201 is not set
+# CONFIG_SENSORS_SMSC47M1 is not set
+# CONFIG_SENSORS_SMSC47M192 is not set
+# CONFIG_SENSORS_SMSC47B397 is not set
+# CONFIG_SENSORS_SCH56XX_COMMON is not set
+# CONFIG_SENSORS_SCH5627 is not set
+# CONFIG_SENSORS_SCH5636 is not set
+# CONFIG_SENSORS_SMM665 is not set
+# CONFIG_SENSORS_ADC128D818 is not set
+# CONFIG_SENSORS_ADS1015 is not set
+# CONFIG_SENSORS_ADS7828 is not set
+# CONFIG_SENSORS_ADS7871 is not set
+# CONFIG_SENSORS_AMC6821 is not set
+# CONFIG_SENSORS_INA209 is not set
+# CONFIG_SENSORS_INA2XX is not set
+# CONFIG_SENSORS_TC74 is not set
+# CONFIG_SENSORS_THMC50 is not set
+# CONFIG_SENSORS_TMP102 is not set
+# CONFIG_SENSORS_TMP103 is not set
+# CONFIG_SENSORS_TMP401 is not set
+# CONFIG_SENSORS_TMP421 is not set
+# CONFIG_SENSORS_VIA_CPUTEMP is not set
+# CONFIG_SENSORS_VIA686A is not set
+# CONFIG_SENSORS_VT1211 is not set
+# CONFIG_SENSORS_VT8231 is not set
+# CONFIG_SENSORS_W83781D is not set
+# CONFIG_SENSORS_W83791D is not set
+# CONFIG_SENSORS_W83792D is not set
+# CONFIG_SENSORS_W83793 is not set
+# CONFIG_SENSORS_W83795 is not set
+# CONFIG_SENSORS_W83L785TS is not set
+# CONFIG_SENSORS_W83L786NG is not set
+# CONFIG_SENSORS_W83627HF is not set
+# CONFIG_SENSORS_W83627EHF is not set
+
+#
+# ACPI drivers
+#
+# CONFIG_SENSORS_ACPI_POWER is not set
+# CONFIG_SENSORS_ATK0110 is not set
+CONFIG_THERMAL=y
+CONFIG_THERMAL_HWMON=y
+CONFIG_THERMAL_WRITABLE_TRIPS=y
+CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y
+# CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set
+# CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set
+# CONFIG_THERMAL_DEFAULT_GOV_POWER_ALLOCATOR is not set
+# CONFIG_THERMAL_GOV_FAIR_SHARE is not set
+CONFIG_THERMAL_GOV_STEP_WISE=y
+# CONFIG_THERMAL_GOV_BANG_BANG is not set
+CONFIG_THERMAL_GOV_USER_SPACE=y
+# CONFIG_THERMAL_GOV_POWER_ALLOCATOR is not set
+# CONFIG_THERMAL_EMULATION is not set
+# CONFIG_INTEL_POWERCLAMP is not set
+CONFIG_X86_PKG_TEMP_THERMAL=m
+# CONFIG_INTEL_SOC_DTS_THERMAL is not set
+CONFIG_INTEL_QUARK_DTS_THERMAL=y
+# CONFIG_INT340X_THERMAL is not set
+# CONFIG_INTEL_PCH_THERMAL is not set
+CONFIG_WATCHDOG=y
+CONFIG_WATCHDOG_CORE=y
+# CONFIG_WATCHDOG_NOWAYOUT is not set
+
+#
+# Watchdog Device Drivers
+#
+CONFIG_SOFT_WATCHDOG=m
+# CONFIG_XILINX_WATCHDOG is not set
+# CONFIG_CADENCE_WATCHDOG is not set
+# CONFIG_DW_WATCHDOG is not set
+# CONFIG_MAX63XX_WATCHDOG is not set
+# CONFIG_ACQUIRE_WDT is not set
+# CONFIG_ADVANTECH_WDT is not set
+# CONFIG_ALIM1535_WDT is not set
+# CONFIG_ALIM7101_WDT is not set
+# CONFIG_F71808E_WDT is not set
+# CONFIG_SP5100_TCO is not set
+# CONFIG_SBC_FITPC2_WATCHDOG is not set
+# CONFIG_EUROTECH_WDT is not set
+# CONFIG_IB700_WDT is not set
+# CONFIG_IBMASR is not set
+# CONFIG_WAFER_WDT is not set
+# CONFIG_I6300ESB_WDT is not set
+CONFIG_IE6XX_WDT=y
+# CONFIG_ITCO_WDT is not set
+# CONFIG_IT8712F_WDT is not set
+# CONFIG_IT87_WDT is not set
+# CONFIG_HP_WATCHDOG is not set
+# CONFIG_SC1200_WDT is not set
+# CONFIG_PC87413_WDT is not set
+# CONFIG_NV_TCO is not set
+# CONFIG_60XX_WDT is not set
+# CONFIG_SBC8360_WDT is not set
+# CONFIG_SBC7240_WDT is not set
+# CONFIG_CPU5_WDT is not set
+# CONFIG_SMSC_SCH311X_WDT is not set
+# CONFIG_SMSC37B787_WDT is not set
+# CONFIG_VIA_WDT is not set
+# CONFIG_W83627HF_WDT is not set
+# CONFIG_W83877F_WDT is not set
+# CONFIG_W83977F_WDT is not set
+# CONFIG_MACHZ_WDT is not set
+# CONFIG_SBC_EPX_C3_WATCHDOG is not set
+# CONFIG_BCM7038_WDT is not set
+# CONFIG_MEN_A21_WDT is not set
+
+#
+# PCI-based Watchdog Cards
+#
+# CONFIG_PCIPCWATCHDOG is not set
+# CONFIG_WDTPCI is not set
+
+#
+# USB-based Watchdog Cards
+#
+# CONFIG_USBPCWATCHDOG is not set
+CONFIG_SSB_POSSIBLE=y
+
+#
+# Sonics Silicon Backplane
+#
+# CONFIG_SSB is not set
+CONFIG_BCMA_POSSIBLE=y
+
+#
+# Broadcom specific AMBA
+#
+CONFIG_BCMA=m
+CONFIG_BCMA_HOST_PCI_POSSIBLE=y
+CONFIG_BCMA_HOST_PCI=y
+# CONFIG_BCMA_HOST_SOC is not set
+CONFIG_BCMA_DRIVER_PCI=y
+CONFIG_BCMA_DRIVER_GMAC_CMN=y
+# CONFIG_BCMA_DRIVER_GPIO is not set
+# CONFIG_BCMA_DEBUG is not set
+
+#
+# Multifunction device drivers
+#
+CONFIG_MFD_CORE=y
+# CONFIG_MFD_CS5535 is not set
+# CONFIG_MFD_AS3711 is not set
+# CONFIG_PMIC_ADP5520 is not set
+# CONFIG_MFD_AAT2870_CORE is not set
+# CONFIG_MFD_BCM590XX is not set
+# CONFIG_MFD_AXP20X is not set
+# CONFIG_MFD_CROS_EC is not set
+# CONFIG_PMIC_DA903X is not set
+# CONFIG_MFD_DA9052_SPI is not set
+# CONFIG_MFD_DA9052_I2C is not set
+# CONFIG_MFD_DA9055 is not set
+# CONFIG_MFD_DA9062 is not set
+# CONFIG_MFD_DA9063 is not set
+# CONFIG_MFD_DA9150 is not set
+# CONFIG_MFD_DLN2 is not set
+# CONFIG_MFD_MC13XXX_SPI is not set
+# CONFIG_MFD_MC13XXX_I2C is not set
+# CONFIG_HTC_PASIC3 is not set
+# CONFIG_HTC_I2CPLD is not set
+CONFIG_MFD_INTEL_QUARK_I2C_GPIO=y
+# CONFIG_LPC_ICH is not set
+CONFIG_LPC_SCH=y
+# CONFIG_INTEL_SOC_PMIC is not set
+# CONFIG_MFD_INTEL_LPSS_ACPI is not set
+# CONFIG_MFD_INTEL_LPSS_PCI is not set
+# CONFIG_MFD_JANZ_CMODIO is not set
+# CONFIG_MFD_KEMPLD is not set
+# CONFIG_MFD_88PM800 is not set
+# CONFIG_MFD_88PM805 is not set
+# CONFIG_MFD_88PM860X is not set
+# CONFIG_MFD_MAX14577 is not set
+# CONFIG_MFD_MAX77693 is not set
+# CONFIG_MFD_MAX77843 is not set
+# CONFIG_MFD_MAX8907 is not set
+# CONFIG_MFD_MAX8925 is not set
+# CONFIG_MFD_MAX8997 is not set
+# CONFIG_MFD_MAX8998 is not set
+# CONFIG_MFD_MT6397 is not set
+# CONFIG_MFD_MENF21BMC is not set
+# CONFIG_EZX_PCAP is not set
+# CONFIG_MFD_VIPERBOARD is not set
+# CONFIG_MFD_RETU is not set
+# CONFIG_MFD_PCF50633 is not set
+# CONFIG_MFD_RDC321X is not set
+# CONFIG_MFD_RTSX_PCI is not set
+# CONFIG_MFD_RT5033 is not set
+# CONFIG_MFD_RTSX_USB is not set
+# CONFIG_MFD_RC5T583 is not set
+# CONFIG_MFD_RN5T618 is not set
+# CONFIG_MFD_SEC_CORE is not set
+# CONFIG_MFD_SI476X_CORE is not set
+# CONFIG_MFD_SM501 is not set
+# CONFIG_MFD_SKY81452 is not set
+# CONFIG_MFD_SMSC is not set
+# CONFIG_ABX500_CORE is not set
+CONFIG_MFD_SYSCON=y
+# CONFIG_MFD_TI_AM335X_TSCADC is not set
+# CONFIG_MFD_LP3943 is not set
+# CONFIG_MFD_LP8788 is not set
+# CONFIG_MFD_PALMAS is not set
+# CONFIG_TPS6105X is not set
+# CONFIG_TPS65010 is not set
+# CONFIG_TPS6507X is not set
+# CONFIG_MFD_TPS65090 is not set
+# CONFIG_MFD_TPS65217 is not set
+# CONFIG_MFD_TPS65218 is not set
+# CONFIG_MFD_TPS6586X is not set
+# CONFIG_MFD_TPS65910 is not set
+# CONFIG_MFD_TPS65912 is not set
+# CONFIG_MFD_TPS65912_I2C is not set
+# CONFIG_MFD_TPS65912_SPI is not set
+# CONFIG_MFD_TPS80031 is not set
+# CONFIG_TWL4030_CORE is not set
+# CONFIG_TWL6040_CORE is not set
+# CONFIG_MFD_WL1273_CORE is not set
+# CONFIG_MFD_LM3533 is not set
+# CONFIG_MFD_TIMBERDALE is not set
+# CONFIG_MFD_TMIO is not set
+# CONFIG_MFD_VX855 is not set
+# CONFIG_MFD_ARIZONA_I2C is not set
+# CONFIG_MFD_ARIZONA_SPI is not set
+# CONFIG_MFD_WM8400 is not set
+# CONFIG_MFD_WM831X_I2C is not set
+# CONFIG_MFD_WM831X_SPI is not set
+# CONFIG_MFD_WM8350_I2C is not set
+# CONFIG_MFD_WM8994 is not set
+# CONFIG_REGULATOR is not set
+# CONFIG_MEDIA_SUPPORT is not set
+
+#
+# Graphics support
+#
+# CONFIG_AGP is not set
+CONFIG_VGA_ARB=y
+CONFIG_VGA_ARB_MAX_GPUS=16
+# CONFIG_VGA_SWITCHEROO is not set
+# 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_VGA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_DUMMY_CONSOLE_COLUMNS=80
+CONFIG_DUMMY_CONSOLE_ROWS=25
+# CONFIG_SOUND is not set
+
+#
+# HID support
+#
+CONFIG_HID=y
+# CONFIG_HID_BATTERY_STRENGTH is not set
+# CONFIG_HIDRAW is not set
+# CONFIG_UHID is not set
+CONFIG_HID_GENERIC=y
+
+#
+# Special HID drivers
+#
+# CONFIG_HID_A4TECH is not set
+# CONFIG_HID_ACRUX is not set
+# CONFIG_HID_APPLE is not set
+# CONFIG_HID_APPLEIR is not set
+# CONFIG_HID_AUREAL is not set
+# CONFIG_HID_BELKIN is not set
+# CONFIG_HID_BETOP_FF is not set
+# CONFIG_HID_CHERRY is not set
+# CONFIG_HID_CHICONY is not set
+# CONFIG_HID_CORSAIR is not set
+# CONFIG_HID_CP2112 is not set
+# CONFIG_HID_CYPRESS is not set
+# CONFIG_HID_DRAGONRISE is not set
+# CONFIG_HID_EMS_FF is not set
+# CONFIG_HID_ELECOM is not set
+# CONFIG_HID_ELO is not set
+# CONFIG_HID_EZKEY is not set
+# CONFIG_HID_GEMBIRD is not set
+# CONFIG_HID_GFRM is not set
+# CONFIG_HID_HOLTEK is not set
+# CONFIG_HID_GT683R is not set
+# CONFIG_HID_KEYTOUCH is not set
+# CONFIG_HID_KYE is not set
+# CONFIG_HID_UCLOGIC is not set
+# CONFIG_HID_WALTOP is not set
+# CONFIG_HID_GYRATION is not set
+# CONFIG_HID_ICADE is not set
+# CONFIG_HID_TWINHAN is not set
+# CONFIG_HID_KENSINGTON is not set
+# CONFIG_HID_LCPOWER is not set
+# CONFIG_HID_LENOVO is not set
+# CONFIG_HID_LOGITECH is not set
+# CONFIG_HID_MAGICMOUSE is not set
+# CONFIG_HID_MICROSOFT is not set
+# CONFIG_HID_MONTEREY is not set
+# CONFIG_HID_MULTITOUCH is not set
+# CONFIG_HID_NTRIG is not set
+# CONFIG_HID_ORTEK is not set
+# CONFIG_HID_PANTHERLORD is not set
+# CONFIG_HID_PENMOUNT is not set
+# CONFIG_HID_PETALYNX is not set
+# CONFIG_HID_PICOLCD is not set
+# CONFIG_HID_PLANTRONICS is not set
+# CONFIG_HID_PRIMAX is not set
+# CONFIG_HID_ROCCAT is not set
+# CONFIG_HID_SAITEK is not set
+# CONFIG_HID_SAMSUNG is not set
+# CONFIG_HID_SONY is not set
+# CONFIG_HID_SPEEDLINK is not set
+# CONFIG_HID_STEELSERIES is not set
+# CONFIG_HID_SUNPLUS is not set
+# CONFIG_HID_RMI is not set
+# CONFIG_HID_GREENASIA is not set
+# CONFIG_HID_SMARTJOYPLUS is not set
+# CONFIG_HID_TIVO is not set
+# CONFIG_HID_TOPSEED is not set
+# CONFIG_HID_THINGM is not set
+# CONFIG_HID_THRUSTMASTER is not set
+CONFIG_HID_WACOM=y
+# CONFIG_HID_WIIMOTE is not set
+# CONFIG_HID_XINMO is not set
+# CONFIG_HID_ZEROPLUS is not set
+# CONFIG_HID_ZYDACRON is not set
+CONFIG_HID_SENSOR_HUB=m
+# CONFIG_HID_SENSOR_CUSTOM_SENSOR is not set
+
+#
+# USB HID support
+#
+CONFIG_USB_HID=y
+# CONFIG_HID_PID is not set
+CONFIG_USB_HIDDEV=y
+
+#
+# I2C HID support
+#
+# CONFIG_I2C_HID is not set
+CONFIG_USB_OHCI_LITTLE_ENDIAN=y
+CONFIG_USB_SUPPORT=y
+CONFIG_USB_COMMON=y
+CONFIG_USB_ARCH_HAS_HCD=y
+CONFIG_USB=y
+# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
+
+#
+# Miscellaneous USB options
+#
+CONFIG_USB_DEFAULT_PERSIST=y
+# CONFIG_USB_DYNAMIC_MINORS is not set
+CONFIG_USB_OTG=y
+# CONFIG_USB_OTG_WHITELIST is not set
+# CONFIG_USB_OTG_BLACKLIST_HUB is not set
+# CONFIG_USB_OTG_FSM is not set
+# CONFIG_USB_ULPI_BUS is not set
+# CONFIG_USB_MON is not set
+# CONFIG_USB_WUSB_CBAF is not set
+
+#
+# USB Host Controller Drivers
+#
+# CONFIG_USB_C67X00_HCD is not set
+# CONFIG_USB_XHCI_HCD is not set
+CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_EHCI_ROOT_HUB_TT=y
+CONFIG_USB_EHCI_TT_NEWSCHED=y
+CONFIG_USB_EHCI_PCI=y
+# CONFIG_USB_EHCI_HCD_PLATFORM is not set
+# CONFIG_USB_OXU210HP_HCD is not set
+# CONFIG_USB_ISP116X_HCD is not set
+# CONFIG_USB_ISP1362_HCD is not set
+# CONFIG_USB_FOTG210_HCD is not set
+# CONFIG_USB_MAX3421_HCD is not set
+CONFIG_USB_OHCI_HCD=y
+CONFIG_USB_OHCI_HCD_PCI=y
+# CONFIG_USB_OHCI_HCD_PLATFORM is not set
+# CONFIG_USB_UHCI_HCD is not set
+# CONFIG_USB_SL811_HCD is not set
+# CONFIG_USB_R8A66597_HCD is not set
+# CONFIG_USB_HCD_BCMA is not set
+# CONFIG_USB_HCD_TEST_MODE is not set
+
+#
+# USB Device Class drivers
+#
+# CONFIG_USB_ACM is not set
+# CONFIG_USB_PRINTER is not set
+# CONFIG_USB_WDM is not set
+# CONFIG_USB_TMC is not set
+
+#
+# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may
+#
+
+#
+# also be needed; see USB_STORAGE Help for more info
+#
+CONFIG_USB_STORAGE=y
+# CONFIG_USB_STORAGE_DEBUG is not set
+# CONFIG_USB_STORAGE_REALTEK is not set
+# CONFIG_USB_STORAGE_DATAFAB is not set
+# CONFIG_USB_STORAGE_FREECOM is not set
+# CONFIG_USB_STORAGE_ISD200 is not set
+# CONFIG_USB_STORAGE_USBAT is not set
+# CONFIG_USB_STORAGE_SDDR09 is not set
+# CONFIG_USB_STORAGE_SDDR55 is not set
+# CONFIG_USB_STORAGE_JUMPSHOT is not set
+# CONFIG_USB_STORAGE_ALAUDA is not set
+# CONFIG_USB_STORAGE_ONETOUCH is not set
+# CONFIG_USB_STORAGE_KARMA is not set
+# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set
+# CONFIG_USB_STORAGE_ENE_UB6250 is not set
+# CONFIG_USB_UAS is not set
+
+#
+# USB Imaging devices
+#
+# CONFIG_USB_MDC800 is not set
+# CONFIG_USB_MICROTEK is not set
+# CONFIG_USBIP_CORE is not set
+# CONFIG_USB_MUSB_HDRC is not set
+# CONFIG_USB_DWC3 is not set
+# CONFIG_USB_DWC2 is not set
+# CONFIG_USB_CHIPIDEA is not set
+# CONFIG_USB_ISP1760 is not set
+
+#
+# USB port drivers
+#
+# CONFIG_USB_USS720 is not set
+CONFIG_USB_SERIAL=y
+CONFIG_USB_SERIAL_CONSOLE=y
+CONFIG_USB_SERIAL_GENERIC=y
+# CONFIG_USB_SERIAL_SIMPLE is not set
+# CONFIG_USB_SERIAL_AIRCABLE is not set
+CONFIG_USB_SERIAL_ARK3116=m
+CONFIG_USB_SERIAL_BELKIN=m
+CONFIG_USB_SERIAL_CH341=m
+# CONFIG_USB_SERIAL_WHITEHEAT is not set
+# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set
+CONFIG_USB_SERIAL_CP210X=m
+# CONFIG_USB_SERIAL_CYPRESS_M8 is not set
+# CONFIG_USB_SERIAL_EMPEG is not set
+CONFIG_USB_SERIAL_FTDI_SIO=m
+# CONFIG_USB_SERIAL_VISOR is not set
+# CONFIG_USB_SERIAL_IPAQ is not set
+# CONFIG_USB_SERIAL_IR is not set
+# CONFIG_USB_SERIAL_EDGEPORT is not set
+# CONFIG_USB_SERIAL_EDGEPORT_TI is not set
+CONFIG_USB_SERIAL_F81232=m
+# CONFIG_USB_SERIAL_GARMIN is not set
+CONFIG_USB_SERIAL_IPW=m
+# CONFIG_USB_SERIAL_IUU is not set
+# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set
+# CONFIG_USB_SERIAL_KEYSPAN is not set
+# CONFIG_USB_SERIAL_KLSI is not set
+# CONFIG_USB_SERIAL_KOBIL_SCT is not set
+# CONFIG_USB_SERIAL_MCT_U232 is not set
+# CONFIG_USB_SERIAL_METRO is not set
+# CONFIG_USB_SERIAL_MOS7720 is not set
+# CONFIG_USB_SERIAL_MOS7840 is not set
+# CONFIG_USB_SERIAL_MXUPORT is not set
+# CONFIG_USB_SERIAL_NAVMAN is not set
+CONFIG_USB_SERIAL_PL2303=m
+CONFIG_USB_SERIAL_OTI6858=m
+# CONFIG_USB_SERIAL_QCAUX is not set
+CONFIG_USB_SERIAL_QUALCOMM=m
+CONFIG_USB_SERIAL_SPCP8X5=m
+# CONFIG_USB_SERIAL_SAFE is not set
+CONFIG_USB_SERIAL_SIERRAWIRELESS=m
+# CONFIG_USB_SERIAL_SYMBOL is not set
+CONFIG_USB_SERIAL_TI=m
+# CONFIG_USB_SERIAL_CYBERJACK is not set
+# CONFIG_USB_SERIAL_XIRCOM is not set
+CONFIG_USB_SERIAL_WWAN=m
+CONFIG_USB_SERIAL_OPTION=m
+# CONFIG_USB_SERIAL_OMNINET is not set
+# CONFIG_USB_SERIAL_OPTICON is not set
+# CONFIG_USB_SERIAL_XSENS_MT is not set
+# CONFIG_USB_SERIAL_WISHBONE is not set
+# CONFIG_USB_SERIAL_SSU100 is not set
+# CONFIG_USB_SERIAL_QT2 is not set
+# CONFIG_USB_SERIAL_DEBUG is not set
+
+#
+# USB Miscellaneous drivers
+#
+# CONFIG_USB_EMI62 is not set
+# CONFIG_USB_EMI26 is not set
+# CONFIG_USB_ADUTUX is not set
+# CONFIG_USB_SEVSEG is not set
+# CONFIG_USB_RIO500 is not set
+# CONFIG_USB_LEGOTOWER is not set
+# CONFIG_USB_LCD is not set
+# CONFIG_USB_LED is not set
+# CONFIG_USB_CYPRESS_CY7C63 is not set
+# CONFIG_USB_CYTHERM is not set
+# CONFIG_USB_IDMOUSE is not set
+# CONFIG_USB_FTDI_ELAN is not set
+# CONFIG_USB_APPLEDISPLAY is not set
+# CONFIG_USB_SISUSBVGA is not set
+# CONFIG_USB_LD is not set
+# CONFIG_USB_TRANCEVIBRATOR is not set
+# CONFIG_USB_IOWARRIOR is not set
+# CONFIG_USB_TEST is not set
+# CONFIG_USB_EHSET_TEST_FIXTURE is not set
+# CONFIG_USB_ISIGHTFW is not set
+# CONFIG_USB_YUREX is not set
+CONFIG_USB_EZUSB_FX2=y
+# CONFIG_USB_HSIC_USB3503 is not set
+# CONFIG_USB_LINK_LAYER_TEST is not set
+# CONFIG_USB_CHAOSKEY is not set
+
+#
+# USB Physical Layer drivers
+#
+# CONFIG_USB_PHY is not set
+# CONFIG_NOP_USB_XCEIV is not set
+# CONFIG_USB_GPIO_VBUS is not set
+# CONFIG_USB_ISP1301 is not set
+CONFIG_USB_GADGET=y
+# CONFIG_USB_GADGET_DEBUG is not set
+# CONFIG_USB_GADGET_DEBUG_FILES is not set
+# CONFIG_USB_GADGET_DEBUG_FS is not set
+CONFIG_USB_GADGET_VBUS_DRAW=2
+CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2
+
+#
+# USB Peripheral Controller
+#
+# CONFIG_USB_FUSB300 is not set
+# CONFIG_USB_FOTG210_UDC is not set
+# CONFIG_USB_GR_UDC is not set
+# CONFIG_USB_R8A66597 is not set
+# CONFIG_USB_PXA27X is not set
+# CONFIG_USB_MV_UDC is not set
+# CONFIG_USB_MV_U3D is not set
+# CONFIG_USB_M66592 is not set
+# CONFIG_USB_BDC_UDC is not set
+# CONFIG_USB_AMD5536UDC is not set
+# CONFIG_USB_NET2272 is not set
+# CONFIG_USB_NET2280 is not set
+# CONFIG_USB_GOKU is not set
+CONFIG_USB_EG20T=y
+# CONFIG_USB_DUMMY_HCD is not set
+CONFIG_USB_LIBCOMPOSITE=y
+CONFIG_USB_F_ACM=y
+CONFIG_USB_U_SERIAL=y
+CONFIG_USB_CONFIGFS=y
+# CONFIG_USB_CONFIGFS_SERIAL is not set
+CONFIG_USB_CONFIGFS_ACM=y
+# CONFIG_USB_CONFIGFS_OBEX is not set
+# CONFIG_USB_CONFIGFS_NCM is not set
+# CONFIG_USB_CONFIGFS_ECM is not set
+# CONFIG_USB_CONFIGFS_ECM_SUBSET is not set
+# CONFIG_USB_CONFIGFS_RNDIS is not set
+# CONFIG_USB_CONFIGFS_EEM is not set
+# CONFIG_USB_CONFIGFS_MASS_STORAGE is not set
+# CONFIG_USB_CONFIGFS_F_LB_SS is not set
+# CONFIG_USB_CONFIGFS_F_FS is not set
+# CONFIG_USB_CONFIGFS_F_HID is not set
+# CONFIG_USB_CONFIGFS_F_PRINTER is not set
+# CONFIG_USB_ZERO is not set
+# CONFIG_USB_ETH is not set
+# CONFIG_USB_G_NCM is not set
+# CONFIG_USB_GADGETFS is not set
+# CONFIG_USB_FUNCTIONFS is not set
+# CONFIG_USB_MASS_STORAGE is not set
+# CONFIG_USB_G_SERIAL is not set
+# CONFIG_USB_G_PRINTER is not set
+# CONFIG_USB_CDC_COMPOSITE is not set
+# CONFIG_USB_G_ACM_MS is not set
+# CONFIG_USB_G_MULTI is not set
+# CONFIG_USB_G_HID is not set
+# CONFIG_USB_G_DBGP is not set
+# CONFIG_USB_LED_TRIG 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=y
+CONFIG_MMC_SDHCI_PCI=y
+CONFIG_MMC_RICOH_MMC=y
+CONFIG_MMC_SDHCI_ACPI=y
+CONFIG_MMC_SDHCI_PLTFM=y
+# CONFIG_MMC_WBSD is not set
+# CONFIG_MMC_TIFM_SD is not set
+# CONFIG_MMC_CB710 is not set
+# CONFIG_MMC_VIA_SDMMC is not set
+# CONFIG_MMC_VUB300 is not set
+CONFIG_MMC_USHC=m
+# CONFIG_MMC_USDHI6ROL0 is not set
+# CONFIG_MMC_TOSHIBA_PCI 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_LM3530 is not set
+# CONFIG_LEDS_LM3642 is not set
+# CONFIG_LEDS_PCA9532 is not set
+CONFIG_LEDS_GPIO=y
+# CONFIG_LEDS_LP3944 is not set
+# CONFIG_LEDS_LP5521 is not set
+# CONFIG_LEDS_LP5523 is not set
+# CONFIG_LEDS_LP5562 is not set
+# CONFIG_LEDS_LP8501 is not set
+# CONFIG_LEDS_LP8860 is not set
+# CONFIG_LEDS_CLEVO_MAIL is not set
+# CONFIG_LEDS_PCA955X is not set
+# CONFIG_LEDS_PCA963X is not set
+# CONFIG_LEDS_DAC124S085 is not set
+# CONFIG_LEDS_PWM is not set
+# CONFIG_LEDS_BD2802 is not set
+# CONFIG_LEDS_INTEL_SS4200 is not set
+# CONFIG_LEDS_LT3593 is not set
+# CONFIG_LEDS_TCA6507 is not set
+# CONFIG_LEDS_TLC591XX is not set
+# CONFIG_LEDS_LM355x is not set
+# CONFIG_LEDS_OT200 is not set
+
+#
+# LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM)
+#
+# CONFIG_LEDS_BLINKM is not set
+
+#
+# LED Triggers
+#
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=y
+CONFIG_LEDS_TRIGGER_ONESHOT=y
+# CONFIG_LEDS_TRIGGER_IDE_DISK is not set
+CONFIG_LEDS_TRIGGER_HEARTBEAT=y
+CONFIG_LEDS_TRIGGER_BACKLIGHT=y
+# CONFIG_LEDS_TRIGGER_CPU is not set
+CONFIG_LEDS_TRIGGER_GPIO=y
+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_INFINIBAND is not set
+CONFIG_EDAC_ATOMIC_SCRUB=y
+CONFIG_EDAC_SUPPORT=y
+# CONFIG_EDAC is not set
+CONFIG_RTC_LIB=y
+CONFIG_RTC_CLASS=y
+CONFIG_RTC_HCTOSYS=y
+CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
+CONFIG_RTC_SYSTOHC=y
+CONFIG_RTC_SYSTOHC_DEVICE="rtc0"
+# CONFIG_RTC_DEBUG is not set
+
+#
+# RTC interfaces
+#
+CONFIG_RTC_INTF_SYSFS=y
+CONFIG_RTC_INTF_PROC=y
+CONFIG_RTC_INTF_DEV=y
+# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
+# CONFIG_RTC_DRV_TEST is not set
+
+#
+# I2C RTC drivers
+#
+# CONFIG_RTC_DRV_ABB5ZES3 is not set
+# CONFIG_RTC_DRV_ABX80X is not set
+# CONFIG_RTC_DRV_DS1307 is not set
+# CONFIG_RTC_DRV_DS1374 is not set
+# CONFIG_RTC_DRV_DS1672 is not set
+# CONFIG_RTC_DRV_DS3232 is not set
+# CONFIG_RTC_DRV_MAX6900 is not set
+# CONFIG_RTC_DRV_RS5C372 is not set
+# CONFIG_RTC_DRV_ISL1208 is not set
+# CONFIG_RTC_DRV_ISL12022 is not set
+# CONFIG_RTC_DRV_ISL12057 is not set
+# CONFIG_RTC_DRV_X1205 is not set
+# CONFIG_RTC_DRV_PCF2127 is not set
+# CONFIG_RTC_DRV_PCF8523 is not set
+# CONFIG_RTC_DRV_PCF8563 is not set
+# CONFIG_RTC_DRV_PCF85063 is not set
+# CONFIG_RTC_DRV_PCF8583 is not set
+# CONFIG_RTC_DRV_M41T80 is not set
+# CONFIG_RTC_DRV_BQ32K is not set
+# CONFIG_RTC_DRV_S35390A is not set
+# CONFIG_RTC_DRV_FM3130 is not set
+# CONFIG_RTC_DRV_RX8581 is not set
+# CONFIG_RTC_DRV_RX8025 is not set
+# CONFIG_RTC_DRV_EM3027 is not set
+# CONFIG_RTC_DRV_RV3029C2 is not set
+# CONFIG_RTC_DRV_RV8803 is not set
+
+#
+# SPI RTC drivers
+#
+# CONFIG_RTC_DRV_M41T93 is not set
+# CONFIG_RTC_DRV_M41T94 is not set
+# CONFIG_RTC_DRV_DS1305 is not set
+# CONFIG_RTC_DRV_DS1343 is not set
+# CONFIG_RTC_DRV_DS1347 is not set
+# CONFIG_RTC_DRV_DS1390 is not set
+# CONFIG_RTC_DRV_MAX6902 is not set
+# CONFIG_RTC_DRV_R9701 is not set
+# CONFIG_RTC_DRV_RS5C348 is not set
+# CONFIG_RTC_DRV_DS3234 is not set
+# CONFIG_RTC_DRV_PCF2123 is not set
+# CONFIG_RTC_DRV_RX4581 is not set
+# CONFIG_RTC_DRV_MCP795 is not set
+
+#
+# Platform RTC drivers
+#
+CONFIG_RTC_DRV_CMOS=y
+# CONFIG_RTC_DRV_DS1286 is not set
+# CONFIG_RTC_DRV_DS1511 is not set
+# CONFIG_RTC_DRV_DS1553 is not set
+# CONFIG_RTC_DRV_DS1685_FAMILY is not set
+# CONFIG_RTC_DRV_DS1742 is not set
+# CONFIG_RTC_DRV_DS2404 is not set
+# CONFIG_RTC_DRV_STK17TA8 is not set
+# CONFIG_RTC_DRV_M48T86 is not set
+# CONFIG_RTC_DRV_M48T35 is not set
+# CONFIG_RTC_DRV_M48T59 is not set
+# CONFIG_RTC_DRV_MSM6242 is not set
+# CONFIG_RTC_DRV_BQ4802 is not set
+# CONFIG_RTC_DRV_RP5C01 is not set
+# CONFIG_RTC_DRV_V3020 is not set
+
+#
+# on-CPU RTC drivers
+#
+
+#
+# HID Sensor RTC drivers
+#
+# CONFIG_RTC_DRV_HID_SENSOR_TIME is not set
+CONFIG_DMADEVICES=y
+# CONFIG_DMADEVICES_DEBUG is not set
+
+#
+# DMA Devices
+#
+CONFIG_DMA_ENGINE=y
+CONFIG_DMA_ACPI=y
+# CONFIG_INTEL_IDMA64 is not set
+CONFIG_PCH_DMA=y
+# CONFIG_DW_DMAC is not set
+# CONFIG_DW_DMAC_PCI is not set
+
+#
+# DMA Clients
+#
+# CONFIG_ASYNC_TX_DMA is not set
+# CONFIG_DMATEST is not set
+# CONFIG_AUXDISPLAY is not set
+CONFIG_UIO=m
+# CONFIG_UIO_CIF is not set
+CONFIG_UIO_PDRV_GENIRQ=m
+CONFIG_UIO_DMEM_GENIRQ=m
+# CONFIG_UIO_AEC is not set
+# CONFIG_UIO_SERCOS3 is not set
+# CONFIG_UIO_PCI_GENERIC is not set
+# CONFIG_UIO_NETX is not set
+# CONFIG_UIO_PRUSS is not set
+# CONFIG_UIO_MF624 is not set
+# CONFIG_VIRT_DRIVERS is not set
+
+#
+# Virtio drivers
+#
+# CONFIG_VIRTIO_PCI is not set
+# CONFIG_VIRTIO_MMIO is not set
+
+#
+# Microsoft Hyper-V guest support
+#
+CONFIG_STAGING=y
+# CONFIG_SLICOSS is not set
+# CONFIG_PRISM2_USB is not set
+# CONFIG_COMEDI is not set
+# CONFIG_PANEL is not set
+# CONFIG_RTL8192U is not set
+# CONFIG_RTLLIB is not set
+CONFIG_R8712U=m
+# CONFIG_R8188EU is not set
+# CONFIG_R8723AU is not set
+# CONFIG_RTS5208 is not set
+# CONFIG_VT6655 is not set
+# CONFIG_VT6656 is not set
+
+#
+# IIO staging drivers
+#
+
+#
+# Accelerometers
+#
+# CONFIG_ADIS16201 is not set
+# CONFIG_ADIS16203 is not set
+# CONFIG_ADIS16204 is not set
+# CONFIG_ADIS16209 is not set
+# CONFIG_ADIS16220 is not set
+# CONFIG_ADIS16240 is not set
+# CONFIG_LIS3L02DQ is not set
+# CONFIG_SCA3000 is not set
+
+#
+# Analog to digital converters
+#
+# CONFIG_AD7606 is not set
+# CONFIG_AD7780 is not set
+# CONFIG_AD7816 is not set
+# CONFIG_AD7192 is not set
+# CONFIG_AD7280 is not set
+CONFIG_ADC1x8S102=m
+
+#
+# Analog digital bi-direction converters
+#
+# CONFIG_ADT7316 is not set
+
+#
+# Capacitance to digital converters
+#
+# CONFIG_AD7150 is not set
+# CONFIG_AD7152 is not set
+# CONFIG_AD7746 is not set
+
+#
+# Direct Digital Synthesis
+#
+# CONFIG_AD9832 is not set
+# CONFIG_AD9834 is not set
+
+#
+# Digital gyroscope sensors
+#
+# CONFIG_ADIS16060 is not set
+
+#
+# Network Analyzer, Impedance Converters
+#
+# CONFIG_AD5933 is not set
+
+#
+# Light sensors
+#
+# CONFIG_SENSORS_ISL29018 is not set
+# CONFIG_SENSORS_ISL29028 is not set
+# CONFIG_TSL2583 is not set
+# CONFIG_TSL2x7x is not set
+
+#
+# Magnetometer sensors
+#
+# CONFIG_SENSORS_HMC5843_I2C is not set
+# CONFIG_SENSORS_HMC5843_SPI is not set
+
+#
+# Active energy metering IC
+#
+# CONFIG_ADE7753 is not set
+# CONFIG_ADE7754 is not set
+# CONFIG_ADE7758 is not set
+# CONFIG_ADE7759 is not set
+# CONFIG_ADE7854 is not set
+
+#
+# Resolver to digital converters
+#
+# CONFIG_AD2S90 is not set
+# CONFIG_AD2S1200 is not set
+# CONFIG_AD2S1210 is not set
+
+#
+# Triggers - standalone
+#
+# CONFIG_IIO_PERIODIC_RTC_TRIGGER is not set
+# CONFIG_IIO_SIMPLE_DUMMY is not set
+
+#
+# Speakup console speech
+#
+# CONFIG_SPEAKUP is not set
+# CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_RMI4 is not set
+# CONFIG_STAGING_MEDIA is not set
+
+#
+# Android
+#
+# CONFIG_WIMAX_GDM72XX is not set
+# CONFIG_LTE_GDM724X is not set
+# CONFIG_LUSTRE_FS is not set
+# CONFIG_DGNC is not set
+# CONFIG_DGAP is not set
+# CONFIG_GS_FPGABOOT is not set
+# CONFIG_WILC1000_DRIVER is not set
+# CONFIG_MOST is not set
+CONFIG_X86_PLATFORM_DEVICES=y
+# CONFIG_ACERHDF is not set
+# CONFIG_DELL_SMO8800 is not set
+# CONFIG_DELL_RBTN is not set
+# CONFIG_FUJITSU_TABLET is not set
+# CONFIG_AMILO_RFKILL is not set
+# CONFIG_HP_ACCEL is not set
+# CONFIG_HP_WIRELESS is not set
+# CONFIG_SENSORS_HDAPS is not set
+# CONFIG_INTEL_MENLOW is not set
+# CONFIG_ACPI_WMI is not set
+# CONFIG_TOPSTAR_LAPTOP is not set
+# CONFIG_TOSHIBA_BT_RFKILL is not set
+# CONFIG_TOSHIBA_HAPS is not set
+# CONFIG_ACPI_CMPC is not set
+# CONFIG_INTEL_IPS is not set
+CONFIG_INTEL_IMR=y
+# CONFIG_IBM_RTL is not set
+# CONFIG_SAMSUNG_Q10 is not set
+# CONFIG_INTEL_RST is not set
+# CONFIG_INTEL_SMARTCONNECT is not set
+# CONFIG_PVPANIC is not set
+# CONFIG_INTEL_PMC_IPC is not set
+# CONFIG_SURFACE_PRO3_BUTTON is not set
+# CONFIG_CHROME_PLATFORMS is not set
+CONFIG_CLKDEV_LOOKUP=y
+CONFIG_HAVE_CLK_PREPARE=y
+CONFIG_COMMON_CLK=y
+
+#
+# Common Clock Framework
+#
+# CONFIG_COMMON_CLK_SI5351 is not set
+# CONFIG_COMMON_CLK_PWM is not set
+# CONFIG_COMMON_CLK_PXA is not set
+# CONFIG_COMMON_CLK_CDCE706 is not set
+
+#
+# Hardware Spinlock drivers
+#
+
+#
+# Clock Source drivers
+#
+CONFIG_CLKSRC_I8253=y
+CONFIG_CLKEVT_I8253=y
+CONFIG_I8253_LOCK=y
+CONFIG_CLKBLD_I8253=y
+# CONFIG_ATMEL_PIT is not set
+# CONFIG_SH_TIMER_CMT is not set
+# CONFIG_SH_TIMER_MTU2 is not set
+# CONFIG_SH_TIMER_TMU is not set
+# CONFIG_EM_TIMER_STI is not set
+# 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=m
+CONFIG_IIO_BUFFER=y
+CONFIG_IIO_BUFFER_CB=m
+CONFIG_IIO_KFIFO_BUF=m
+CONFIG_IIO_TRIGGERED_BUFFER=m
+CONFIG_IIO_TRIGGER=y
+CONFIG_IIO_CONSUMERS_PER_TRIGGER=2
+
+#
+# Accelerometers
+#
+CONFIG_BMA180=m
+# CONFIG_BMC150_ACCEL is not set
+CONFIG_HID_SENSOR_ACCEL_3D=m
+CONFIG_IIO_ST_ACCEL_3AXIS=m
+CONFIG_IIO_ST_ACCEL_I2C_3AXIS=m
+CONFIG_IIO_ST_ACCEL_SPI_3AXIS=m
+CONFIG_KXSD9=m
+# CONFIG_KXCJK1013 is not set
+# CONFIG_MMA8452 is not set
+# CONFIG_MMA9551 is not set
+# CONFIG_MMA9553 is not set
+# CONFIG_MXC4005 is not set
+# CONFIG_STK8312 is not set
+# CONFIG_STK8BA50 is not set
+
+#
+# Analog to digital converters
+#
+CONFIG_AD_SIGMA_DELTA=m
+CONFIG_AD7266=m
+# CONFIG_AD7291 is not set
+CONFIG_AD7298=m
+CONFIG_AD7476=m
+CONFIG_AD7791=m
+CONFIG_AD7793=m
+CONFIG_AD7887=m
+CONFIG_AD7923=m
+# CONFIG_AD799X is not set
+# CONFIG_HI8435 is not set
+# CONFIG_MAX1027 is not set
+CONFIG_MAX1363=m
+CONFIG_MCP320X=m
+CONFIG_MCP3422=m
+CONFIG_NAU7802=m
+CONFIG_TI_ADC081C=m
+CONFIG_TI_ADC128S052=m
+
+#
+# Amplifiers
+#
+CONFIG_AD8366=m
+
+#
+# Chemical Sensors
+#
+# CONFIG_VZ89X is not set
+
+#
+# Hid Sensor IIO Common
+#
+CONFIG_HID_SENSOR_IIO_COMMON=m
+CONFIG_HID_SENSOR_IIO_TRIGGER=m
+
+#
+# SSP Sensor Common
+#
+# CONFIG_IIO_SSP_SENSORHUB is not set
+CONFIG_IIO_ST_SENSORS_I2C=m
+CONFIG_IIO_ST_SENSORS_SPI=m
+CONFIG_IIO_ST_SENSORS_CORE=m
+
+#
+# Digital to analog converters
+#
+CONFIG_AD5064=m
+CONFIG_AD5360=m
+CONFIG_AD5380=m
+CONFIG_AD5421=m
+CONFIG_AD5446=m
+CONFIG_AD5449=m
+CONFIG_AD5504=m
+CONFIG_AD5624R_SPI=m
+CONFIG_AD5686=m
+CONFIG_AD5755=m
+CONFIG_AD5764=m
+CONFIG_AD5791=m
+CONFIG_AD7303=m
+# CONFIG_M62332 is not set
+CONFIG_MAX517=m
+CONFIG_MCP4725=m
+# CONFIG_MCP4922 is not set
+
+#
+# Frequency Synthesizers DDS/PLL
+#
+
+#
+# Clock Generator/Distribution
+#
+CONFIG_AD9523=m
+
+#
+# Phase-Locked Loop (PLL) frequency synthesizers
+#
+CONFIG_ADF4350=m
+
+#
+# Digital gyroscope sensors
+#
+CONFIG_ADIS16080=m
+CONFIG_ADIS16130=m
+CONFIG_ADIS16136=m
+CONFIG_ADIS16260=m
+CONFIG_ADXRS450=m
+# CONFIG_BMG160 is not set
+CONFIG_HID_SENSOR_GYRO_3D=m
+CONFIG_IIO_ST_GYRO_3AXIS=m
+CONFIG_IIO_ST_GYRO_I2C_3AXIS=m
+CONFIG_IIO_ST_GYRO_SPI_3AXIS=m
+CONFIG_ITG3200=m
+
+#
+# Humidity sensors
+#
+CONFIG_DHT11=m
+# CONFIG_HDC100X is not set
+# CONFIG_HTU21 is not set
+# CONFIG_SI7005 is not set
+# CONFIG_SI7020 is not set
+
+#
+# Inertial measurement units
+#
+CONFIG_ADIS16400=m
+CONFIG_ADIS16480=m
+# CONFIG_KMX61 is not set
+CONFIG_INV_MPU6050_IIO=m
+CONFIG_IIO_ADIS_LIB=m
+CONFIG_IIO_ADIS_LIB_BUFFER=y
+
+#
+# Light sensors
+#
+# CONFIG_ACPI_ALS is not set
+CONFIG_ADJD_S311=m
+# CONFIG_AL3320A is not set
+CONFIG_APDS9300=m
+# CONFIG_APDS9960 is not set
+# CONFIG_BH1750 is not set
+CONFIG_CM32181=m
+# CONFIG_CM3232 is not set
+# CONFIG_CM3323 is not set
+CONFIG_CM36651=m
+CONFIG_GP2AP020A00F=m
+# CONFIG_ISL29125 is not set
+CONFIG_HID_SENSOR_ALS=m
+# CONFIG_HID_SENSOR_PROX is not set
+# CONFIG_JSA1212 is not set
+# CONFIG_RPR0521 is not set
+# CONFIG_LTR501 is not set
+# CONFIG_OPT3001 is not set
+# CONFIG_PA12203001 is not set
+# CONFIG_STK3310 is not set
+# CONFIG_TCS3414 is not set
+CONFIG_TCS3472=m
+CONFIG_SENSORS_TSL2563=m
+CONFIG_TSL4531=m
+# CONFIG_US5182D is not set
+CONFIG_VCNL4000=m
+
+#
+# Magnetometer sensors
+#
+CONFIG_AK8975=m
+# CONFIG_AK09911 is not set
+# CONFIG_BMC150_MAGN is not set
+CONFIG_MAG3110=m
+CONFIG_HID_SENSOR_MAGNETOMETER_3D=m
+# CONFIG_MMC35240 is not set
+CONFIG_IIO_ST_MAGN_3AXIS=m
+CONFIG_IIO_ST_MAGN_I2C_3AXIS=m
+CONFIG_IIO_ST_MAGN_SPI_3AXIS=m
+
+#
+# Inclinometer sensors
+#
+CONFIG_HID_SENSOR_INCLINOMETER_3D=m
+# CONFIG_HID_SENSOR_DEVICE_ROTATION is not set
+
+#
+# Triggers - standalone
+#
+CONFIG_IIO_INTERRUPT_TRIGGER=m
+CONFIG_IIO_SYSFS_TRIGGER=m
+
+#
+# Digital potentiometers
+#
+# CONFIG_MCP4531 is not set
+
+#
+# Pressure sensors
+#
+# CONFIG_BMP280 is not set
+# CONFIG_HID_SENSOR_PRESS is not set
+# CONFIG_MPL115 is not set
+CONFIG_MPL3115=m
+# CONFIG_MS5611 is not set
+# CONFIG_MS5637 is not set
+CONFIG_IIO_ST_PRESS=m
+CONFIG_IIO_ST_PRESS_I2C=m
+CONFIG_IIO_ST_PRESS_SPI=m
+# CONFIG_T5403 is not set
+
+#
+# Lightning sensors
+#
+# CONFIG_AS3935 is not set
+
+#
+# Proximity sensors
+#
+# CONFIG_LIDAR_LITE_V2 is not set
+# CONFIG_SX9500 is not set
+
+#
+# Temperature sensors
+#
+# CONFIG_MLX90614 is not set
+CONFIG_TMP006=m
+# CONFIG_TSYS01 is not set
+# CONFIG_TSYS02D is not set
+# CONFIG_NTB is not set
+# CONFIG_VME_BUS is not set
+CONFIG_PWM=y
+CONFIG_PWM_SYSFS=y
+# CONFIG_PWM_LPSS is not set
+CONFIG_PWM_PCA9685=y
+# CONFIG_IPACK_BUS is not set
+CONFIG_RESET_CONTROLLER=y
+# 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=y
+# CONFIG_THUNDERBOLT 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
+
+#
+# Firmware Drivers
+#
+# CONFIG_EDD is not set
+CONFIG_FIRMWARE_MEMMAP=y
+# CONFIG_DELL_RBU is not set
+# CONFIG_DCDBAS is not set
+CONFIG_DMIID=y
+# CONFIG_DMI_SYSFS is not set
+CONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK=y
+# CONFIG_ISCSI_IBFT_FIND is not set
+# CONFIG_GOOGLE_FIRMWARE is not set
+
+#
+# EFI (Extensible Firmware Interface) Support
+#
+CONFIG_EFI_VARS=y
+CONFIG_EFI_ESRT=y
+# CONFIG_EFI_FAKE_MEMMAP is not set
+CONFIG_EFI_RUNTIME_WRAPPERS=y
+CONFIG_EFI_CAPSULE_LOADER=y
+CONFIG_EFI_CAPSULE_QUIRK_QUARK_CSH=y
+
+#
+# File systems
+#
+CONFIG_DCACHE_WORD_ACCESS=y
+# 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=y
+CONFIG_EXT4_FS_SECURITY=y
+# 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=y
+CONFIG_BTRFS_FS_POSIX_ACL=y
+# CONFIG_BTRFS_FS_CHECK_INTEGRITY is not set
+# CONFIG_BTRFS_FS_RUN_SANITY_TESTS is not set
+# CONFIG_BTRFS_DEBUG is not set
+# CONFIG_BTRFS_ASSERT 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=y
+CONFIG_EXPORTFS=y
+CONFIG_FILE_LOCKING=y
+CONFIG_FSNOTIFY=y
+CONFIG_DNOTIFY=y
+CONFIG_INOTIFY_USER=y
+# CONFIG_FANOTIFY is not set
+# CONFIG_QUOTA is not set
+# CONFIG_QUOTACTL is not set
+CONFIG_AUTOFS4_FS=y
+CONFIG_FUSE_FS=m
+CONFIG_CUSE=m
+# CONFIG_OVERLAY_FS is not set
+
+#
+# Caches
+#
+# CONFIG_FSCACHE is not set
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=y
+# CONFIG_JOLIET is not set
+CONFIG_ZISOFS=y
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=y
+CONFIG_MSDOS_FS=y
+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_HUGETLBFS is not set
+# CONFIG_HUGETLB_PAGE is not set
+CONFIG_CONFIGFS_FS=y
+CONFIG_EFIVAR_FS=m
+CONFIG_MISC_FILESYSTEMS=y
+# CONFIG_ADFS_FS is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_ECRYPT_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
+# CONFIG_BEFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_EFS_FS is not set
+# CONFIG_LOGFS is not set
+# CONFIG_CRAMFS is not set
+# CONFIG_SQUASHFS is not set
+# CONFIG_VXFS_FS is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_OMFS_FS is not set
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_QNX6FS_FS is not set
+CONFIG_ROMFS_FS=m
+CONFIG_ROMFS_BACKED_BY_BLOCK=y
+CONFIG_ROMFS_ON_BLOCK=y
+# CONFIG_PSTORE is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+CONFIG_NETWORK_FILESYSTEMS=y
+CONFIG_NFS_FS=y
+CONFIG_NFS_V2=y
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
+CONFIG_NFS_V4=y
+# CONFIG_NFS_SWAP is not set
+# CONFIG_NFS_V4_1 is not set
+CONFIG_ROOT_NFS=y
+# CONFIG_NFS_USE_LEGACY_DNS is not set
+CONFIG_NFS_USE_KERNEL_DNS=y
+# CONFIG_NFSD is not set
+CONFIG_GRACE_PERIOD=y
+CONFIG_LOCKD=y
+CONFIG_LOCKD_V4=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=y
+CONFIG_SUNRPC_GSS=y
+CONFIG_RPCSEC_GSS_KRB5=m
+# CONFIG_SUNRPC_DEBUG is not set
+# CONFIG_CEPH_FS is not set
+CONFIG_CIFS=m
+# CONFIG_CIFS_STATS is not set
+# CONFIG_CIFS_WEAK_PW_HASH is not set
+# CONFIG_CIFS_UPCALL is not set
+CONFIG_CIFS_XATTR=y
+CONFIG_CIFS_POSIX=y
+# CONFIG_CIFS_ACL is not set
+CONFIG_CIFS_DEBUG=y
+# CONFIG_CIFS_DEBUG2 is not set
+# CONFIG_CIFS_DFS_UPCALL is not set
+# CONFIG_CIFS_SMB2 is not set
+# CONFIG_NCP_FS is not set
+# CONFIG_CODA_FS is not set
+# CONFIG_AFS_FS is not set
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="iso8859-1"
+CONFIG_NLS_CODEPAGE_437=y
+CONFIG_NLS_CODEPAGE_737=m
+CONFIG_NLS_CODEPAGE_775=m
+CONFIG_NLS_CODEPAGE_850=m
+CONFIG_NLS_CODEPAGE_852=m
+CONFIG_NLS_CODEPAGE_855=m
+CONFIG_NLS_CODEPAGE_857=m
+CONFIG_NLS_CODEPAGE_860=m
+CONFIG_NLS_CODEPAGE_861=m
+CONFIG_NLS_CODEPAGE_862=m
+CONFIG_NLS_CODEPAGE_863=m
+CONFIG_NLS_CODEPAGE_864=m
+CONFIG_NLS_CODEPAGE_865=m
+CONFIG_NLS_CODEPAGE_866=m
+CONFIG_NLS_CODEPAGE_869=m
+CONFIG_NLS_CODEPAGE_936=m
+CONFIG_NLS_CODEPAGE_950=m
+CONFIG_NLS_CODEPAGE_932=m
+CONFIG_NLS_CODEPAGE_949=m
+CONFIG_NLS_CODEPAGE_874=m
+CONFIG_NLS_ISO8859_8=m
+CONFIG_NLS_CODEPAGE_1250=m
+CONFIG_NLS_CODEPAGE_1251=m
+CONFIG_NLS_ASCII=m
+CONFIG_NLS_ISO8859_1=y
+CONFIG_NLS_ISO8859_2=m
+CONFIG_NLS_ISO8859_3=m
+CONFIG_NLS_ISO8859_4=m
+CONFIG_NLS_ISO8859_5=m
+CONFIG_NLS_ISO8859_6=m
+CONFIG_NLS_ISO8859_7=m
+CONFIG_NLS_ISO8859_9=m
+CONFIG_NLS_ISO8859_13=m
+CONFIG_NLS_ISO8859_14=m
+CONFIG_NLS_ISO8859_15=m
+CONFIG_NLS_KOI8_R=m
+CONFIG_NLS_KOI8_U=m
+# 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=m
+# CONFIG_DLM is not set
+
+#
+# Kernel hacking
+#
+CONFIG_TRACE_IRQFLAGS_SUPPORT=y
+
+#
+# printk and dmesg options
+#
+# CONFIG_PRINTK_TIME is not set
+CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4
+# CONFIG_BOOT_PRINTK_DELAY is not set
+# CONFIG_DYNAMIC_DEBUG is not set
+
+#
+# Compile-time checks and compiler options
+#
+CONFIG_DEBUG_INFO=y
+# CONFIG_DEBUG_INFO_REDUCED is not set
+# CONFIG_DEBUG_INFO_SPLIT is not set
+# CONFIG_DEBUG_INFO_DWARF4 is not set
+# CONFIG_GDB_SCRIPTS is not set
+CONFIG_ENABLE_WARN_DEPRECATED=y
+CONFIG_ENABLE_MUST_CHECK=y
+CONFIG_FRAME_WARN=1024
+# CONFIG_STRIP_ASM_SYMS is not set
+# CONFIG_READABLE_ASM is not set
+CONFIG_UNUSED_SYMBOLS=y
+# CONFIG_PAGE_OWNER is not set
+CONFIG_DEBUG_FS=y
+# CONFIG_HEADERS_CHECK is not set
+# CONFIG_DEBUG_SECTION_MISMATCH is not set
+CONFIG_SECTION_MISMATCH_WARN_ONLY=y
+CONFIG_ARCH_WANT_FRAME_POINTERS=y
+CONFIG_FRAME_POINTER=y
+# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
+CONFIG_MAGIC_SYSRQ=y
+CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1
+CONFIG_DEBUG_KERNEL=y
+
+#
+# Memory Debugging
+#
+# CONFIG_PAGE_EXTENSION is not set
+# CONFIG_DEBUG_PAGEALLOC is not set
+# CONFIG_DEBUG_OBJECTS is not set
+# CONFIG_SLUB_DEBUG_ON is not set
+# CONFIG_SLUB_STATS is not set
+CONFIG_HAVE_DEBUG_KMEMLEAK=y
+# CONFIG_DEBUG_KMEMLEAK is not set
+# CONFIG_DEBUG_STACK_USAGE is not set
+# CONFIG_DEBUG_VM is not set
+# CONFIG_DEBUG_VIRTUAL is not set
+# CONFIG_DEBUG_MEMORY_INIT is not set
+# CONFIG_DEBUG_HIGHMEM is not set
+CONFIG_HAVE_DEBUG_STACKOVERFLOW=y
+# CONFIG_DEBUG_STACKOVERFLOW is not set
+CONFIG_HAVE_ARCH_KMEMCHECK=y
+# CONFIG_DEBUG_SHIRQ is not set
+
+#
+# Debug Lockups and Hangs
+#
+# CONFIG_LOCKUP_DETECTOR is not set
+# CONFIG_DETECT_HUNG_TASK is not set
+# CONFIG_PANIC_ON_OOPS is not set
+CONFIG_PANIC_ON_OOPS_VALUE=0
+CONFIG_PANIC_TIMEOUT=0
+CONFIG_SCHED_DEBUG=y
+CONFIG_SCHED_INFO=y
+# CONFIG_SCHEDSTATS is not set
+# CONFIG_SCHED_STACK_END_CHECK is not set
+# CONFIG_DEBUG_TIMEKEEPING is not set
+CONFIG_TIMER_STATS=y
+CONFIG_DEBUG_PREEMPT=y
+
+#
+# Lock Debugging (spinlocks, mutexes, etc...)
+#
+# CONFIG_DEBUG_RT_MUTEXES is not set
+# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_DEBUG_MUTEXES is not set
+# CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set
+# CONFIG_DEBUG_LOCK_ALLOC is not set
+# CONFIG_PROVE_LOCKING is not set
+# CONFIG_LOCK_STAT is not set
+# CONFIG_DEBUG_ATOMIC_SLEEP is not set
+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
+# CONFIG_LOCK_TORTURE_TEST is not set
+CONFIG_STACKTRACE=y
+# CONFIG_DEBUG_KOBJECT is not set
+CONFIG_DEBUG_BUGVERBOSE=y
+# CONFIG_DEBUG_LIST is not set
+# CONFIG_DEBUG_PI_LIST is not set
+# CONFIG_DEBUG_SG is not set
+# CONFIG_DEBUG_NOTIFIERS is not set
+# CONFIG_DEBUG_CREDENTIALS is not set
+
+#
+# RCU Debugging
+#
+# CONFIG_PROVE_RCU is not set
+# CONFIG_SPARSE_RCU_POINTER is not set
+# CONFIG_TORTURE_TEST is not set
+# CONFIG_RCU_TORTURE_TEST is not set
+CONFIG_RCU_CPU_STALL_TIMEOUT=21
+# CONFIG_RCU_TRACE is not set
+# CONFIG_RCU_EQS_DEBUG is not set
+# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
+# CONFIG_NOTIFIER_ERROR_INJECTION is not set
+# CONFIG_FAULT_INJECTION is not set
+# CONFIG_LATENCYTOP is not set
+CONFIG_ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS=y
+# CONFIG_DEBUG_STRICT_USER_COPY_CHECKS is not set
+CONFIG_USER_STACKTRACE_SUPPORT=y
+CONFIG_NOP_TRACER=y
+CONFIG_HAVE_FUNCTION_TRACER=y
+CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
+CONFIG_HAVE_FUNCTION_GRAPH_FP_TEST=y
+CONFIG_HAVE_DYNAMIC_FTRACE=y
+CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y
+CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
+CONFIG_HAVE_SYSCALL_TRACEPOINTS=y
+CONFIG_HAVE_C_RECORDMCOUNT=y
+CONFIG_TRACE_CLOCK=y
+CONFIG_RING_BUFFER=y
+CONFIG_EVENT_TRACING=y
+CONFIG_CONTEXT_SWITCH_TRACER=y
+CONFIG_TRACING=y
+CONFIG_GENERIC_TRACER=y
+CONFIG_TRACING_SUPPORT=y
+CONFIG_FTRACE=y
+CONFIG_FUNCTION_TRACER=y
+CONFIG_FUNCTION_GRAPH_TRACER=y
+# CONFIG_IRQSOFF_TRACER is not set
+# CONFIG_PREEMPT_TRACER is not set
+# CONFIG_SCHED_TRACER is not set
+CONFIG_FTRACE_SYSCALLS=y
+# CONFIG_TRACER_SNAPSHOT is not set
+CONFIG_BRANCH_PROFILE_NONE=y
+# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set
+# CONFIG_PROFILE_ALL_BRANCHES is not set
+# CONFIG_STACK_TRACER is not set
+CONFIG_BLK_DEV_IO_TRACE=y
+# CONFIG_UPROBE_EVENT is not set
+# CONFIG_PROBE_EVENTS is not set
+CONFIG_DYNAMIC_FTRACE=y
+CONFIG_DYNAMIC_FTRACE_WITH_REGS=y
+# CONFIG_FUNCTION_PROFILER is not set
+CONFIG_FTRACE_MCOUNT_RECORD=y
+# CONFIG_FTRACE_STARTUP_TEST is not set
+# CONFIG_MMIOTRACE is not set
+# CONFIG_TRACEPOINT_BENCHMARK is not set
+# CONFIG_RING_BUFFER_BENCHMARK is not set
+# CONFIG_RING_BUFFER_STARTUP_TEST is not set
+# CONFIG_TRACE_ENUM_MAP_FILE is not set
+CONFIG_TRACING_EVENTS_GPIO=y
+
+#
+# Runtime Testing
+#
+# CONFIG_LKDTM is not set
+# CONFIG_TEST_LIST_SORT is not set
+# CONFIG_BACKTRACE_SELF_TEST is not set
+# CONFIG_RBTREE_TEST is not set
+# CONFIG_INTERVAL_TREE_TEST is not set
+# CONFIG_PERCPU_TEST is not set
+# 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_PROVIDE_OHCI1394_DMA_INIT is not set
+# CONFIG_DMA_API_DEBUG 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_MEMTEST is not set
+# CONFIG_TEST_STATIC_KEYS is not set
+# CONFIG_SAMPLES is not set
+CONFIG_HAVE_ARCH_KGDB=y
+# CONFIG_KGDB is not set
+# CONFIG_STRICT_DEVMEM is not set
+CONFIG_X86_VERBOSE_BOOTUP=y
+CONFIG_EARLY_PRINTK=y
+# CONFIG_EARLY_PRINTK_DBGP is not set
+# CONFIG_EARLY_PRINTK_EFI is not set
+# CONFIG_X86_PTDUMP_CORE is not set
+# CONFIG_X86_PTDUMP is not set
+# CONFIG_EFI_PGT_DUMP is not set
+CONFIG_DEBUG_RODATA=y
+CONFIG_DEBUG_RODATA_TEST=y
+# CONFIG_DEBUG_WX is not set
+# CONFIG_DEBUG_SET_MODULE_RONX is not set
+# CONFIG_DEBUG_NX_TEST is not set
+CONFIG_DOUBLEFAULT=y
+# CONFIG_DEBUG_TLBFLUSH is not set
+# CONFIG_IOMMU_STRESS is not set
+CONFIG_HAVE_MMIOTRACE_SUPPORT=y
+CONFIG_IO_DELAY_TYPE_0X80=0
+CONFIG_IO_DELAY_TYPE_0XED=1
+CONFIG_IO_DELAY_TYPE_UDELAY=2
+CONFIG_IO_DELAY_TYPE_NONE=3
+CONFIG_IO_DELAY_0X80=y
+# CONFIG_IO_DELAY_0XED is not set
+# CONFIG_IO_DELAY_UDELAY is not set
+# CONFIG_IO_DELAY_NONE is not set
+CONFIG_DEFAULT_IO_DELAY_TYPE=0
+# CONFIG_DEBUG_BOOT_PARAMS is not set
+# CONFIG_CPA_DEBUG is not set
+# CONFIG_OPTIMIZE_INLINING is not set
+# CONFIG_DEBUG_ENTRY is not set
+# CONFIG_DEBUG_NMI_SELFTEST is not set
+# CONFIG_DEBUG_IMR_SELFTEST is not set
+# CONFIG_X86_DEBUG_STATIC_CPU_HAS is not set
+CONFIG_X86_DEBUG_FPU=y
+# CONFIG_PUNIT_ATOM_DEBUG is not set
+
+#
+# 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=y
+# CONFIG_SECURITYFS is not set
+# CONFIG_SECURITY_NETWORK is not set
+# CONFIG_SECURITY_PATH is not set
+# CONFIG_SECURITY_SMACK is not set
+# CONFIG_SECURITY_TOMOYO is not set
+# CONFIG_SECURITY_APPARMOR is not set
+# CONFIG_SECURITY_YAMA is not set
+CONFIG_INTEGRITY=y
+# CONFIG_INTEGRITY_SIGNATURE is not set
+# CONFIG_IMA is not set
+# CONFIG_EVM is not set
+CONFIG_DEFAULT_SECURITY_DAC=y
+CONFIG_DEFAULT_SECURITY=""
+CONFIG_XOR_BLOCKS=y
+CONFIG_CRYPTO=y
+
+#
+# Crypto core or helper
+#
+CONFIG_CRYPTO_ALGAPI=y
+CONFIG_CRYPTO_ALGAPI2=y
+CONFIG_CRYPTO_AEAD=y
+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=y
+CONFIG_CRYPTO_GF128MUL=m
+CONFIG_CRYPTO_NULL=y
+CONFIG_CRYPTO_NULL2=y
+CONFIG_CRYPTO_WORKQUEUE=y
+# CONFIG_CRYPTO_CRYPTD is not set
+# CONFIG_CRYPTO_MCRYPTD is not set
+CONFIG_CRYPTO_AUTHENC=y
+CONFIG_CRYPTO_TEST=m
+
+#
+# Authenticated Encryption with Associated Data
+#
+CONFIG_CRYPTO_CCM=m
+CONFIG_CRYPTO_GCM=m
+# CONFIG_CRYPTO_CHACHA20POLY1305 is not set
+CONFIG_CRYPTO_SEQIV=m
+CONFIG_CRYPTO_ECHAINIV=m
+
+#
+# Block modes
+#
+CONFIG_CRYPTO_CBC=y
+CONFIG_CRYPTO_CTR=m
+CONFIG_CRYPTO_CTS=y
+CONFIG_CRYPTO_ECB=m
+# 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=m
+CONFIG_CRYPTO_HMAC=y
+CONFIG_CRYPTO_XCBC=m
+# CONFIG_CRYPTO_VMAC is not set
+
+#
+# Digest
+#
+CONFIG_CRYPTO_CRC32C=y
+# CONFIG_CRYPTO_CRC32C_INTEL is not set
+# CONFIG_CRYPTO_CRC32 is not set
+# CONFIG_CRYPTO_CRC32_PCLMUL is not set
+# CONFIG_CRYPTO_CRCT10DIF is not set
+CONFIG_CRYPTO_GHASH=m
+# CONFIG_CRYPTO_POLY1305 is not set
+CONFIG_CRYPTO_MD4=m
+CONFIG_CRYPTO_MD5=y
+CONFIG_CRYPTO_MICHAEL_MIC=m
+# 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=y
+CONFIG_CRYPTO_SHA256=m
+CONFIG_CRYPTO_SHA512=m
+# CONFIG_CRYPTO_TGR192 is not set
+CONFIG_CRYPTO_WP512=m
+
+#
+# Ciphers
+#
+CONFIG_CRYPTO_AES=y
+# CONFIG_CRYPTO_AES_586 is not set
+# CONFIG_CRYPTO_AES_NI_INTEL is not set
+CONFIG_CRYPTO_ANUBIS=m
+CONFIG_CRYPTO_ARC4=m
+CONFIG_CRYPTO_BLOWFISH=m
+CONFIG_CRYPTO_BLOWFISH_COMMON=m
+CONFIG_CRYPTO_CAMELLIA=m
+CONFIG_CRYPTO_CAST_COMMON=m
+CONFIG_CRYPTO_CAST5=m
+CONFIG_CRYPTO_CAST6=m
+CONFIG_CRYPTO_DES=y
+# CONFIG_CRYPTO_FCRYPT is not set
+CONFIG_CRYPTO_KHAZAD=m
+# CONFIG_CRYPTO_SALSA20 is not set
+# CONFIG_CRYPTO_SALSA20_586 is not set
+# CONFIG_CRYPTO_CHACHA20 is not set
+# CONFIG_CRYPTO_SEED is not set
+CONFIG_CRYPTO_SERPENT=m
+# CONFIG_CRYPTO_SERPENT_SSE2_586 is not set
+CONFIG_CRYPTO_TEA=m
+CONFIG_CRYPTO_TWOFISH=m
+CONFIG_CRYPTO_TWOFISH_COMMON=m
+# CONFIG_CRYPTO_TWOFISH_586 is not set
+
+#
+# Compression
+#
+CONFIG_CRYPTO_DEFLATE=m
+# 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 is not set
+# CONFIG_CRYPTO_DRBG_CTR is not set
+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=y
+# CONFIG_CRYPTO_DEV_PADLOCK is not set
+# CONFIG_CRYPTO_DEV_GEODE is not set
+# CONFIG_CRYPTO_DEV_HIFN_795X is not set
+# CONFIG_CRYPTO_DEV_CCP is not set
+# CONFIG_CRYPTO_DEV_QAT_DH895xCC is not set
+# CONFIG_CRYPTO_DEV_QAT_DH895xCCVF is not set
+# CONFIG_ASYMMETRIC_KEY_TYPE is not set
+
+#
+# Certificates for signature checking
+#
+# CONFIG_SYSTEM_TRUSTED_KEYRING is not set
+CONFIG_HAVE_KVM=y
+CONFIG_VIRTUALIZATION=y
+# CONFIG_KVM is not set
+# CONFIG_LGUEST is not set
+CONFIG_BINARY_PRINTF=y
+
+#
+# Library routines
+#
+CONFIG_RAID6_PQ=y
+CONFIG_BITREVERSE=y
+# CONFIG_HAVE_ARCH_BITREVERSE is not set
+CONFIG_RATIONAL=y
+CONFIG_GENERIC_STRNCPY_FROM_USER=y
+CONFIG_GENERIC_STRNLEN_USER=y
+CONFIG_GENERIC_NET_UTILS=y
+CONFIG_GENERIC_FIND_FIRST_BIT=y
+CONFIG_GENERIC_PCI_IOMAP=y
+CONFIG_GENERIC_IOMAP=y
+CONFIG_GENERIC_IO=y
+CONFIG_ARCH_HAS_FAST_MULTIPLIER=y
+CONFIG_CRC_CCITT=m
+CONFIG_CRC16=y
+# CONFIG_CRC_T10DIF is not set
+# CONFIG_CRC_ITU_T is not set
+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 is not set
+CONFIG_LIBCRC32C=m
+CONFIG_CRC8=m
+# CONFIG_AUDIT_ARCH_COMPAT_GENERIC is not set
+# CONFIG_RANDOM32_SELFTEST is not set
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZLIB_DEFLATE=y
+CONFIG_LZO_COMPRESS=y
+CONFIG_LZO_DECOMPRESS=y
+CONFIG_LZ4_DECOMPRESS=y
+CONFIG_XZ_DEC=y
+CONFIG_XZ_DEC_X86=y
+CONFIG_XZ_DEC_POWERPC=y
+CONFIG_XZ_DEC_IA64=y
+CONFIG_XZ_DEC_ARM=y
+CONFIG_XZ_DEC_ARMTHUMB=y
+CONFIG_XZ_DEC_SPARC=y
+CONFIG_XZ_DEC_BCJ=y
+# CONFIG_XZ_DEC_TEST is not set
+CONFIG_DECOMPRESS_GZIP=y
+CONFIG_DECOMPRESS_BZIP2=y
+CONFIG_DECOMPRESS_LZMA=y
+CONFIG_DECOMPRESS_XZ=y
+CONFIG_DECOMPRESS_LZO=y
+CONFIG_DECOMPRESS_LZ4=y
+CONFIG_GENERIC_ALLOCATOR=y
+CONFIG_TEXTSEARCH=y
+CONFIG_TEXTSEARCH_KMP=m
+CONFIG_TEXTSEARCH_BM=m
+CONFIG_TEXTSEARCH_FSM=m
+CONFIG_ASSOCIATIVE_ARRAY=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT_MAP=y
+CONFIG_HAS_DMA=y
+CONFIG_CHECK_SIGNATURE=y
+CONFIG_DQL=y
+CONFIG_GLOB=y
+# CONFIG_GLOB_SELFTEST is not set
+CONFIG_NLATTR=y
+CONFIG_ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE=y
+CONFIG_CORDIC=m
+# CONFIG_DDR is not set
+CONFIG_OID_REGISTRY=y
+CONFIG_UCS2_STRING=y
+# CONFIG_SG_SPLIT is not set
+CONFIG_ARCH_HAS_SG_CHAIN=y
+CONFIG_ARCH_HAS_MMIO_FLUSH=y

+ 2 - 0
board/PSG/iot2000/post-build.sh

@@ -0,0 +1,2 @@
+#!/bin/sh -e
+cp ../PSG/board/PSG/iot2000/grub.cfg ${BINARIES_DIR}/efi-part/EFI/BOOT/grub.cfg

+ 13 - 0
board/PSG/iot2000/post-image.sh

@@ -0,0 +1,13 @@
+#!/bin/sh -e
+
+GENIMAGE_CFG="../PSG/board/PSG/iot2000/genimage.cfg"
+GENIMAGE_TMP="${BUILD_DIR}/genimage.tmp"
+
+rm -rf "${GENIMAGE_TMP}"
+
+genimage \
+    --rootpath "${TARGET_DIR}" \
+    --tmppath "${GENIMAGE_TMP}" \
+    --inputpath "${BINARIES_DIR}" \
+    --outputpath "${BINARIES_DIR}" \
+    --config "${GENIMAGE_CFG}"

+ 119 - 0
board/PSG/iot2000/rootfs_overlay/etc/dhcp/dhcpd.conf

@@ -0,0 +1,119 @@
+#
+# Sample configuration file for ISC dhcpd for Debian
+#
+# $Id: dhcpd.conf,v 1.1.1.1 2002/05/21 00:07:44 peloy Exp $
+#
+
+# The ddns-updates-style parameter controls whether or not the server will
+# attempt to do a DNS update when a lease is confirmed. We default to the
+# behavior of the version 2 packages ('none', since DHCP v2 didn't
+# have support for DDNS.)
+ddns-update-style none;
+
+# option definitions common to all supported networks...
+option domain-name "example.org";
+option domain-name-servers ns1.example.org, ns2.example.org;
+
+default-lease-time 600;
+max-lease-time 7200;
+
+subnet 192.168.7.0 netmask 255.255.255.252 {
+  range 192.168.7.1 192.168.7.1;
+}
+
+subnet 192.168.0.0 netmask 255.255.255.0 {
+  range 192.168.0.100 192.168.0.254;
+  option domain-name-servers 192.168.21.111;
+  option routers 192.168.0.1;
+}
+
+
+# If this DHCP server is the official DHCP server for the local
+# network, the authoritative directive should be uncommented.
+#authoritative;
+
+# Use this to send dhcp log messages to a different log file (you also
+# have to hack syslog.conf to complete the redirection).
+log-facility local7;
+
+# No service will be given on this subnet, but declaring it helps the 
+# DHCP server to understand the network topology.
+
+#subnet 10.152.187.0 netmask 255.255.255.0 {
+#}
+
+# This is a very basic subnet declaration.
+
+#subnet 10.254.239.0 netmask 255.255.255.224 {
+#  range 10.254.239.10 10.254.239.20;
+#  option routers rtr-239-0-1.example.org, rtr-239-0-2.example.org;
+#}
+
+# This declaration allows BOOTP clients to get dynamic addresses,
+# which we don't really recommend.
+
+#subnet 10.254.239.32 netmask 255.255.255.224 {
+#  range dynamic-bootp 10.254.239.40 10.254.239.60;
+#  option broadcast-address 10.254.239.31;
+#  option routers rtr-239-32-1.example.org;
+#}
+
+# A slightly different configuration for an internal subnet.
+#subnet 10.5.5.0 netmask 255.255.255.224 {
+#  range 10.5.5.26 10.5.5.30;
+#  option domain-name-servers ns1.internal.example.org;
+#  option domain-name "internal.example.org";
+#  option routers 10.5.5.1;
+#  option broadcast-address 10.5.5.31;
+#  default-lease-time 600;
+#  max-lease-time 7200;
+#}
+
+# Hosts which require special configuration options can be listed in
+# host statements.   If no address is specified, the address will be
+# allocated dynamically (if possible), but the host-specific information
+# will still come from the host declaration.
+
+#host passacaglia {
+#  hardware ethernet 0:0:c0:5d:bd:95;
+#  filename "vmunix.passacaglia";
+#  server-name "toccata.fugue.com";
+#}
+
+# Fixed IP addresses can also be specified for hosts.   These addresses
+# should not also be listed as being available for dynamic assignment.
+# Hosts for which fixed IP addresses have been specified can boot using
+# BOOTP or DHCP.   Hosts for which no fixed address is specified can only
+# be booted with DHCP, unless there is an address range on the subnet
+# to which a BOOTP client is connected which has the dynamic-bootp flag
+# set.
+#host fantasia {
+#  hardware ethernet 08:00:07:26:c0:a5;
+#  fixed-address fantasia.fugue.com;
+#}
+
+# You can declare a class of clients and then do address allocation
+# based on that.   The example below shows a case where all clients
+# in a certain class get addresses on the 10.17.224/24 subnet, and all
+# other clients get addresses on the 10.0.29/24 subnet.
+
+#class "foo" {
+#  match if substring (option vendor-class-identifier, 0, 4) = "SUNW";
+#}
+
+#shared-network 224-29 {
+#  subnet 10.17.224.0 netmask 255.255.255.0 {
+#    option routers rtr-224.example.org;
+#  }
+#  subnet 10.0.29.0 netmask 255.255.255.0 {
+#    option routers rtr-29.example.org;
+#  }
+#  pool {
+#    allow members of "foo";
+#    range 10.17.224.10 10.17.224.250;
+#  }
+#  pool {
+#    deny members of "foo";
+#    range 10.0.29.10 10.0.29.230;
+#  }
+#}

+ 36 - 0
board/PSG/iot2000/rootfs_overlay/etc/init.d/S09modload

@@ -0,0 +1,36 @@
+#!/bin/sh
+#
+
+load_drivers()
+{
+	while IFS= read -r line; do
+		modprobe $line
+	done < "/etc/modules-load.galileo/$1.conf"
+}
+
+do_board()
+{
+	board=$(cat /sys/devices/virtual/dmi/id/board_name)
+	case "$board" in
+		*"SIMATIC IOT2000" )
+			load_drivers "simatic_iot2000" ;;
+	
+		*"GalileoGen2" )
+			load_drivers "galileo_gen2" ;;
+		*"Galileo" )
+			load_drivers "galileo" ;;
+	esac
+}
+
+case "$1" in
+	start)
+		do_board
+		;;
+	stop)
+		;;
+	restart|reload)
+		;;
+	*)
+		echo "Usage: $0 {start|stop|restart}"
+		exit 1
+esac

+ 38 - 0
board/PSG/iot2000/rootfs_overlay/etc/init.d/S99CamProcess

@@ -0,0 +1,38 @@
+#!/bin/sh
+#
+# Start App	
+#
+#
+APPNAME=CamServer
+APPBIN=/root/a.out
+
+case "$1" in
+  start)
+        echo -e "Starting ${APPNAME} ...\n"
+	if [ ! -f ${APPBIN} ]; then
+		echo -e "Program ${APPBIN} doesn't exist \n"
+		exit 1
+	fi 
+        screen -dmS ${APPNAME} sh -c "while true; do ${APPBIN}; echo '${APPNAME} stopped--> restart'; sleep 2;done"
+        exit 0
+        ;;
+  stop)
+        echo -e "Stopping ${APPNAME} ...\n"
+        KILLPID=`screen -list | grep ${APPNAME} | awk -F'.' '{print $1}'`
+        if [ ${#KILLPID} != "0" ]
+                then
+                kill $KILLPID
+         fi
+         exit 0
+        ;;
+  restart|reload)
+        "$0" stop
+        "$0" start
+        ;;
+  *)
+        echo "Usage: $0 {start|stop|restart}"
+        exit 1
+esac
+
+exit $?
+

+ 39 - 0
board/PSG/iot2000/rootfs_overlay/etc/init.d/S99TestBus

@@ -0,0 +1,39 @@
+#!/bin/sh
+#
+# Start App	
+#
+#
+APPNAME=TestBus
+APPBIN=/root/TestIOT2000
+
+case "$1" in
+  start)
+        echo -e "Starting ${APPNAME} ...\n"
+	if [ ! -f ${APPBIN} ]; then
+		echo -e "Program ${APPBIN} doesn't exist \n"
+		exit 1
+	fi 
+	switchserialmode /dev/ttyS2 rs485
+        screen -dmS ${APPNAME} sh -c "while true; do ${APPBIN}; echo '${APPNAME} stopped--> restart'; sleep 2;done"
+        exit 0
+        ;;
+  stop)
+        echo -e "Stopping ${APPNAME} ...\n"
+        KILLPID=`screen -list | grep ${APPNAME} | awk -F'.' '{print $1}'`
+        if [ ${#KILLPID} != "0" ]
+                then
+                kill $KILLPID
+         fi
+         exit 0
+        ;;
+  restart|reload)
+        "$0" stop
+        "$0" start
+        ;;
+  *)
+        echo "Usage: $0 {start|stop|restart}"
+        exit 1
+esac
+
+exit $?
+

+ 28 - 0
board/PSG/iot2000/rootfs_overlay/etc/init.d/rcS

@@ -0,0 +1,28 @@
+#!/bin/sh
+
+echo 1 > /proc/sys/net/ipv4/ip_forward
+
+# Start all init scripts in /etc/init.d
+# executing them in numerical order.
+#
+for i in /etc/init.d/S??* ;do
+
+     # Ignore dangling symlinks (if any).
+     [ ! -f "$i" ] && continue
+
+     case "$i" in
+	*.sh)
+	    # Source shell script for speed.
+	    (
+		trap - INT QUIT TSTP
+		set start
+		. $i
+	    )
+	    ;;
+	*)
+	    # No sh extension, so fork subprocess.
+	    $i start
+	    ;;
+    esac
+done
+

+ 1349 - 0
board/PSG/iot2000/rootfs_overlay/etc/joe/joerc

@@ -0,0 +1,1349 @@
+                         Initialization file for JOE
+                                Standard Joe
+
+ JOE looks for this file in:
+	1 - $HOME/.joerc
+	2 - /etc/joe/joerc
+
+ This file can include other files by placing the following include command
+ in the first column:
+
+ :include filename
+
+ FIRST SECTION: Default global options (these options can also be specified
+ on the command line.  Also the NOXON, LINES, COLUMNS, DOPADDING and BAUD
+ options can be specified in environment variables):
+
+ Override colors of lexical classes specified in syntax files:
+ Put each color override you want in the first column.
+
+ Valid colors:
+   bold inverse blink dim underline italic
+   white cyan magenta blue yellow green red black
+   bg_white bg_cyan bg_magenta bg_blue bg_yellow bg_green bg_red bg_black
+
+ Other colors are available: see syntax/c.jsf for documentation.
+
+ Override all instances of class Idle:
+   =Idle red
+
+ Override Idle only for c syntax file:
+   =c.Idle red
+
+ The following list is from c.jsf.  Look at other syntax files for more classes.
+
+ =Idle
+ =Bad        bold red
+ =Preproc    blue
+ =Define     bold blue
+ =IncLocal   cyan
+ =IncSystem  bold cyan
+ =Constant   cyan
+ =Escape     bold cyan
+ =Type       bold
+ =Keyword    bold
+ =CppKeyword bold
+ =Brace      magenta
+ =Control
+
+ Put each option you want set in the first column:
+
+ -option	Sets the option
+ --option	Clears the option
+
+ -help_is_utf8	Set if help text is in UTF-8 format.  Leave clear if it's a raw 8-bit format.
+
+ -mid		Cursor is recentered when scrolling is necessary
+ -left nn	Amount to jump left when scrolling is necessary (-1 for 1/4 width)
+ -right nn	Amount to jump right when scrolling is necessary (-1 for 1/4 width)
+
+ -marking	Text between ^KB and cursor is highlighted (use with -lightoff)
+
+ -asis		Characters 128 - 255 shown as-is
+
+ -force		Force final newline when files are saved
+
+ -nolocks	If you don't want file locks to be used
+
+ -nomodcheck	Disable periodic checking of disk file newer than buffer
+		(this checking happens on save even with this option).
+
+ -nocurdir	Do not prompt with current directory
+
+-nobackups	If you don't want backup files to be created
+
+ -nodeadjoe	If you don't want DEADJOE files to be created
+
+ -break_hardlinks
+		Delete file before writing, to break hard links
+		(but don't break symbolic links).
+
+ -break_links
+		Delete file before writing, to break hard links
+		and symbolic links.
+
+
+ -lightoff	Turn off highlighting after block copy or move
+
+ -exask		^KX always confirms file name
+
+ -beep		Beep on errors and when cursor goes past extremes
+
+ -nosta		Disable top-most status line
+
+-keepup	%k and %c status line escape sequences updated frequently
+
+ -pg nnn	No. lines to keep for PgUp/PgDn
+
+ -undo_keep nnn	Number of undo records to keep.  0 for infinite.
+
+ -csmode	^KF after a pervious search does a ^L instead
+
+ -backpath path
+		Directory to store backup files (one space between
+		'backpath' and the 'path', no trailing spaces or comments
+		after the path).
+
+ -floatmouse	Clicking past end of line moves the cursor past the end
+ 
+ -rtbutton	Use the right mouse button for action, instead of the left
+
+ -nonotice	Disable copyright notice
+
+ -noexmsg	Disable exiting message ("File not changed so no update needed")
+
+-noxon		Attempt to turn off ^S/^Q processing
+
+ -orphan	Put extra files given on command line in orphaned buffers
+		instead of in windows
+
+ -dopadding	Output pad characters (for when there is no tty handshaking)
+
+ -lines nnn	Set no. screen lines
+
+ -baud nnn	Set baud rate for terminal optimizations
+
+ -columns nnn	Set no. screen columns
+
+ -helpon	Start with help on
+
+ -skiptop nnn	Don't use top nnn lines of the screen
+
+-notite         Don't send terminal initialization and termination strings:
+                prevents restoration of screen on exit.
+
+ -nolinefeeds	Prevent sending linefeeds to preserve screen history in terminal
+                emulator's scroll-back buffer.
+
+ -usetabs       Use tabs to help optimize screen update.
+
+-assume_color	Assume terminal has ANSI color support even if termcap/terminfo entry
+		says that it doesn't.  This only applies if the terminal otherwise
+		looks like an ANSI terminal (support bold and capability starts with
+		ESC [).
+
+-assume_256color
+		Assume terminal has xterm 256 color support (ESC [ 38 ; 5 ; NNN m and
+                ESC [ 48 ; 5 ; NNN m).
+
+-guess_non_utf8	Allow guess of non-UTF-8 file encoding in a UTF-8 locale.
+
+ -guess_utf8	Allow guess of UTF-8 file encoding in non-UTF-8 locale.
+
+-guess_utf16	Allow guess of UTF-16 encoding
+
+-guess_crlf     Automatically detect MS-DOS files and set -crlf appropriately
+
+-guess_indent	Guess indent character (tab or space).
+
+-menu_above	Position menu/list above prompt when enabled.  Otherwise position
+		below prompt.
+
+-transpose	Transpose rows with columns in all menus.
+
+ -menu_explorer	Stay in menu system when a directory is selected (otherwise
+                directory is added to path and menu is closed).
+
+ -menu_jump	Jump into file selection menu when tab is hit (otherwise, menu
+		comes up, but cursor stays in file name prompt).
+
+ -notagsmenu	Disable tags file search menu
+
+ -icase         Search is case insensitive by default.
+
+ -wrap          Search wraps
+
+ -autoswap	Swap markb with markk when necessary
+
+-joe_state     Use ~/.joe_state file
+
+ -mouse		Enable xterm mouse support.  When enabled, left-click will
+		position the cursor and left-click-drag will select blocks
+		For normal xterm cut and paste, hold the shift key down.
+
+ -joexterm	If you are using XTerm version 212 or higher, and if it was
+		configured with --enable-paste64, set this flag: it allows
+		mouse cut & paste to work properly (text selected with the
+		mouse can be pasted into other application, and middle
+		button clicks paste into JOE).
+
+-brpaste	When JOE starts, send command to the terminal emulator that
+		enables "bracketed paste mode" (but only if the terminal
+		seems to have the ANSI command set).  In this mode, text
+		pasted into the window is bracketed with ESC [ 2 0 0 ~ and
+		ESC [ 2 0 1 ~.
+
+-pastehack	If keyboard input comes in as one block assume it's a mouse
+		paste and disable autoindent and wordwrap.
+
+ -square	Rectangular block mode
+
+ -text_color color
+		Set color for text.
+ -status_color color
+		Set color for status bar.
+ -help_color color
+		Set color for help.
+ -menu_color color
+		Set color for menus.
+ -prompt_color color
+		Set color for prompts.
+ -msg_color color
+		Set color for messages.
+
+		For example: -text_color bg_blue+white
+		Sets the background color to blue and foreground color to white.
+
+-restore	Restore previous cursor position when files are opened
+
+-search_prompting
+		Search prompts with previous search request.
+
+ -regex		Search uses standard regular expression format (otherwise it uses
+		JOE format where all special characters have to be escaped).
+
+ Status line definition strings.  -lmsg defines the left-justified string and
+ -rmsg defines the right-justified string.  The first character of -rmsg is
+ the background fill character.  The following escape sequences can be used
+ in these strings:
+
+  %t  12 hour time
+  %u  24 hour time
+  %T  O for overtype mode, I for insert mode
+  %W  W if wordwrap is enabled
+  %I  A if autoindent is enabled
+  %X  Rectangle mode indicator
+  %n  File name
+  %m  '(Modified)' if file has been changed
+  %*  '*' if file has been changed
+  %R  Read-only indicator
+  %r  Row (line) number
+  %c  Column number
+  %o  Byte offset into file
+  %O  Byte offset into file in hex
+  %a  Ascii value of character under cursor
+  %A  Ascii value of character under cursor in hex
+  %w  Width of character under cursor
+  %p  Percent of file cursor is at
+  %l  No. lines in file
+  %k  Entered prefix keys
+  %S  '*SHELL*' if there is a shell running in window
+  %M  Macro recording message
+  %y  Syntax
+  %e  Encoding of file
+  %b  Encoding of terminal
+  %x  Context (first non-indented line going backwards)
+  %dd day
+  %dm month
+  %dY year
+  %Ename%  value of environment variable
+  %Zname%  value of option (ON or OFF for boolean options)
+           (hit TAB at mode command prompt for full list)
+
+ These formatting escape sequences may also be given:
+ 
+  \i  Inverse
+  \u  Underline
+  \b  Bold
+  \d  Dim
+  \f  Blink
+  \l  Italic
+
+-lmsg \i%k%T%W%I%X %n %m%y%R %M %x
+-rmsg  %S Row %4r Col %3c 
+-smsg ** Line %r Col %c Offset %o(0x%O) %e %a(0x%A) Width %w ** 
+-zmsg ** Line %r Col %c Offset %o(0x%O) ** 
+-xmsg \i Joe's Own Editor %v (%b) ** Type \bCtrl-K Q\b to exit or \bCtrl-K H\b for help **\i
+
+ Key sequence hints which are displayed in various prompts.
+-aborthint ^C
+-helphint ^K H
+
+ SECOND SECTION: File name dependant local option settings:
+
+ Name a file type definition section with:
+
+   [python]  (but put opening bracket in first column)
+
+ Each line with '*' in the first column provides a file name matching
+ regular expression (in shell glob format).  If more than one regular
+ expression matches the file name, then the last matching one is chosen.
+
+ A file contents regular expression may also be specified on a separate line
+ with '+regex'.  If this regular expresssion is given, then both the file name
+ regex and the file contents regex must match for the options to apply.
+
+ Here are the modes which can be set:
+
+	-cpara >#!;*/%
+				Characters which can indent paragraphs.
+
+	-cnotpara .
+				Characters which begin non-paragraph lines.
+
+	-encoding name
+				Set file coding (for example: utf-8, iso-8859-15)
+
+	-syntax name
+				Specify syntax (syntax file called
+				'name.jsf' will be loaded)
+
+	-hex			Hex editor mode
+
+	-highlight		Enable highlighting
+
+	-smarthome		Home key first moves cursor to beginning of line,
+				then if hit again, to first non-blank character.
+
+	-indentfirst		Smart home goes to first non-blank character first,
+				instead of going the beginning of line first.
+
+	-smartbacks		Backspace key deletes 'istep' number of
+				'indentc's if cursor is at first non-space
+				character.
+
+	-tab nnn		Tab width
+
+	-indentc nnn		Indentation character (32 for space, 9 for tab)
+
+	-istep nnn		Number of indentation columns
+
+	-spaces			TAB inserts spaces instead of tabs.
+
+	-purify			Fix indentation if necessary for rindent, lindent and backs
+				(for example if indentation uses a mix of tabs and spaces,
+				and indentc is space, indentation will be converted to all
+				spaces).
+
+	-crlf			File uses CR-LF at ends of lines
+
+	-wordwrap		Wordwrap
+
+	-nobackup		If you don't want backup file to be created
+
+	-autoindent		Auto indent
+
+	-overwrite		Overtype mode
+
+        -picture                Picture mode (right arrow can go past end of lines)
+
+	-lmargin nnn		Left margin
+
+	-rmargin nnn		Right margin
+
+	-flowed			Put one space after intermediate paragraph lines
+				for support of flowed text.
+
+
+	-french			One space after '.', '?' and '!' for wordwrap
+				and paragraph reformat instead of two.  Joe
+				does not change the spacing you give, but
+				sometimes it must put spacing in itself.  This
+				selects how much is inserted.
+
+	-linums			Enable line numbers on each line
+
+	-rdonly			File is read-only
+
+	-keymap name
+				Keymap to use if not 'main'
+
+	-lmsg			Status line definition strings-
+	-rmsg			see previous section for more info.
+
+	-mfirst macro
+				Macro to execute on first modification
+	-mnew macro
+				Macro to execute when new files are loaded
+	-mold macro
+				Macro to execute when existing files are loaded
+	-msnew macro
+				Macro to execute when new files are saved
+	-msold macro
+				Macro to execute when existing files are saved
+
+	Macros for the above options are in the same format as in the key
+	binding section below- but without the key name strings.
+
+	These define the language syntax for ^G (goto matching delimiter):
+
+	-highlighter_context	Use the highlighter context for ^G
+
+	-single_quoted		Text between '  ' should be ignored (this is
+				not good for regular text since ' is
+				normally used alone as an apostrophe)
+
+	-no_double_quoted	Text between " " should not be ignored (useful
+				for TeX).
+
+	-c_comment		Text between /* */ should be ignored
+
+	-cpp_comment		Text after // should be ignored
+
+	-pound_comment		Text after # should be ignored
+
+	-vhdl_comment		Text after -- should be ignored
+
+	-semi_comment		Text after ; should be ignored
+
+	-text_delimiters begin=end:if=elif=else=endif
+
+				Define word delimiters
+
+ Default local options
+-highlight
+-istep 4
+
+ Perforce macro: use this macro (put in first column) to have joe "p4 edit"
+ a file you're about to change.
+
+ -mfirst if,"rdonly && joe(sys,\"p4 edit \",name,rtn)",then,mode,"o",msg,"executed \"p4 edit ",name,"\"",rtn,endif
+
+ -mfirst if,"rdonly && joe(sys,\"p4 edit \",name,rtn)",then,reload,msg,"executed \"p4 edit ",name,"\"",rtn,endif
+
+ File type table is now in a separate file.  You can copy this file to ~/.joe and customize it.
+
+:include ftyperc
+
+ SECOND and 1/2 SECTION: Option menu layout
+
+	:defmenu name [macro]
+			Defines a menu.
+			The macro here is executed when the user hits backspace.
+
+	macro string comment
+			A menu entry.  Macro is any JOE macro- see "Macros:"
+			below. String is the label to be used for the macro
+			in the menu.  It is in the same format as the -lmsg
+			and -rmsg options above.
+
+			Two whitespace characters in a row begins a comment.
+			Use '% ' for a leading space in the string.
+
+:defmenu root
+mode,"overwrite",rtn	T Overtype %Zoverwrite%
+mode,"hex",rtn	' Hex edit mode
+mode,"autoindent",rtn	I Autoindent %Zautoindent%
+mode,"wordwrap",rtn	W Word wrap %Zwordwrap%
+mode,"tab",rtn	D Tab width %Ztab%
+mode,"lmargin",rtn	L Left margin %Zlmargin%
+mode,"rmargin",rtn	R Right margin %Zrmargin%
+mode,"square",rtn	X Column mode %Zsquare%
+mode,"indentc",rtn	% % Indent char %Zindentc%
+mode,"istep",rtn	% % Indent step %Zistep%
+menu,"indent",rtn	= Indent select
+mode,"highlight",rtn	H Highlighting %Zhighlight%
+mode,"crlf",rtn	Z CR-LF/MS-DOS %Zcrlf%
+mode,"linums",rtn	N Line numbers %Zlinums%
+mode,"beep",rtn	B Beep %Zbeep%
+mode,"rdonly",rtn	O Read only %Zrdonly%
+mode,"syntax",rtn	Y Syntax
+mode,"encoding",rtn	E Encoding
+mode,"asis",rtn	% % Meta chars as-is
+mode,"language",rtn	V Language
+mode,"picture",rtn	P picture %Zpicture%
+mode,"type",rtn		F File type [%Ztype%]
+mode,"title",rtn	C Context %Ztitle%
+menu,"more-options",rtn	  % % More options...
+
+:defmenu more-options menu,"root",rtn
+menu,"^G",rtn	% % ^G options
+menu,"search",rtn	% % search options
+menu,"paragraph",rtn	% % paragraph options
+menu,"file",rtn	% % file options
+menu,"menu",rtn	% % menu options
+menu,"global",rtn	% % global options
+menu,"cursor",rtn	% % cursor options
+menu,"marking",rtn	% % marking options
+menu,"tab",rtn	% % tab/indent options
+
+:defmenu indent menu,"root",rtn
+mode,"istep",rtn,"1",rtn,mode,"indentc",rtn,"32",rtn,msg,"Indent step = 1, Indent character = 32",rtn	1 Space
+mode,"istep",rtn,"2",rtn,mode,"indentc",rtn,"32",rtn,msg,"Indent step = 2, Indent character = 32",rtn	2 Spaces
+mode,"istep",rtn,"3",rtn,mode,"indentc",rtn,"32",rtn,msg,"Indent step = 3, Indent character = 32",rtn	3 Spaces
+mode,"istep",rtn,"4",rtn,mode,"indentc",rtn,"32",rtn,msg,"Indent step = 4, Indent character = 32",rtn	4 Spaces
+mode,"istep",rtn,"5",rtn,mode,"indentc",rtn,"32",rtn,msg,"Indent step = 5, Indent character = 32",rtn	5 Spaces
+mode,"istep",rtn,"8",rtn,mode,"indentc",rtn,"32",rtn,msg,"Indent step = 8, Indent character = 32",rtn	8 Spaces
+mode,"istep",rtn,"10",rtn,mode,"indentc",rtn,"32",rtn,msg,"Indent step = 10, Indent character = 32",rtn	0 Ten
+mode,"istep",rtn,"1",rtn,mode,"indentc",rtn,"9",rtn,msg,"Indent step = 1, Indent character = 9",rtn	T Tab
+
+:defmenu menu menu,"more-options",rtn
+mode,"menu_explorer",rtn	% % Menu explorer %Zmenu_explorer%
+mode,"menu_above",rtn	% % Menu position %Zmenu_above%
+mode,"menu_jump",rtn	% % Jump into menu %Zmenu_jump%
+mode,"transpose",rtn	% % Transpose menus %Ztranspose%
+
+:defmenu ^G menu,"more-options",rtn
+mode,"highlighter_context",rtn	% % ^G uses highlighter context %Zhighlighter_context%
+mode,"single_quoted",rtn	% % ^G ignores '...' %Zsingle_quoted%
+mode,"no_double_quoted",rtn	% % ^G no ignore "..." %Zno_double_quoted%
+mode,"c_comment",rtn	% % ^G ignores /*...*/ %Zc_comment%
+mode,"cpp_comment",rtn	% % ^G ignores //... %Zcpp_comment%
+mode,"pound_comment",rtn	% % ^G ignores #... %Zpound_comment%
+mode,"vhdl_comment",rtn	% % ^G ignores --... %Zvhdl_comment%
+mode,"semi_comment",rtn	% % ^G ignores ;... %Zsemi_comment%
+mode,"tex_comment",rtn % % ^G ignores %%... %Ztex_comment%
+mode,"text_delimiters",rtn % % Text delimiters %Ztext_delimiters%
+
+:defmenu search menu,"more-options",rtn
+mode,"icase",rtn	% % Case insensitivity %Zicase%
+mode,"wrap",rtn	% % Search wraps %Zwrap%
+mode,"search_prompting",rtn	% % Search prompting %Zsearch_prompting%
+mode,"csmode",rtn	% % Continued search %Zcsmode%
+
+:defmenu paragraph menu,"more-options",rtn
+mode,"french",rtn	% % French spacing %Zfrench%
+mode,"flowed",rtn	% % Flowed text %Zflowed%
+mode,"cpara",rtn	% % Paragraph indent chars %Zcpara%
+mode,"cnotpara",rtn	% % Not-paragraph chars %Zcnotpara%
+
+:defmenu file menu,"more-options",rtn
+mode,"restore",rtn	% % Restore cursor %Zrestore%
+mode,"guess_crlf",rtn	% % Auto detect CR-LF %Zguess_crlf%
+mode,"guess_indent",rtn	% % Guess indent %Zguess_indent%
+mode,"guess_non_utf8",rtn	% % Guess non-UTF-8 %Zguess_non_utf8%
+mode,"guess_utf8",rtn	% % Guess UTF-8 %Zguess_utf8%
+mode,"guess_utf16",rtn	% % Guess UTF-16 %Zguess_utf16%
+mode,"force",rtn	% % Force last NL %Zforce%
+mode,"nobackup",rtn	% % No backup %Znobackup%
+
+:defmenu global menu,"more-options",rtn
+mode,"nolocks",rtn	% % Disable locks %Znolocks%
+mode,"nobackups",rtn	% % Disable backups %Znobackups%
+mode,"nodeadjoe",rtn	% % Disable DEADJOE %Znodeadjoe%
+mode,"nomodcheck",rtn	% % Disable mtime check %Znomodcheck%
+mode,"nocurdir",rtn	% % Disable current dir %Znocurdir%
+mode,"exask",rtn	% % Exit ask %Zexask%
+mode,"nosta",rtn	% % Disable status line %Znosta%
+mode,"keepup",rtn	% % Fast status line %Zkeepup%
+mode,"break_hardlinks",rtn	% % Break hard links %Zbreak_hardlinks%
+mode,"break_links",rtn	% % Break links %Zbreak_links%
+mode,"joe_state",rtn	% % Joe_state file %Zjoe_state%
+mode,"undo_keep",rtn	% % No. undo records %Zundo_keep%
+mode,"backpath",rtn	% % Path to backup files %Zbackpath%
+
+:defmenu cursor menu,"more-options",rtn
+mode,"pg",rtn	% % No. PgUp/PgDn lines %Zpg%
+mode,"mid",rtn	C Center on scroll %Zmid%
+mode,"left",rtn	L Columns to scroll left %Zleft%
+mode,"right",rtn R Columns to scroll right %Zright%
+mode,"floatmouse",rtn	% % Click past end %Zfloatmouse%
+mode,"rtbutton",rtn	% % Right button %Zrtbutton%
+
+:defmenu marking menu,"more-options",rtn
+mode,"autoswap",rtn	% % Autoswap mode %Zautoswap%
+mode,"marking",rtn	% % Marking %Zmarking%
+mode,"lightoff",rtn	% % Auto unmask %Zlightoff%
+
+:defmenu tab menu,"more-options",rtn
+mode,"smarthome",rtn	% % Smart home key %Zsmarthome%
+mode,"smartbacks",rtn	% % Smart backspace %Zsmartbacks%
+mode,"indentfirst",rtn	% % To indent first %Zindentfirst%
+mode,"purify",rtn	% % Clean up indents %Zpurify%
+mode,"spaces",rtn	% % No tabs %Zspaces%
+
+ THIRD SECTION: Named help screens:
+
+ Use \i to turn on/off inverse video
+ Use \u to turn on/off underline
+ Use \b to turn on/off bold
+ Use \d to turn on/off dim
+ Use \f to turn on/off flash
+ Use \l to turn on/off italic
+
+ Use \| to insert a spring: all springs in a given line are set to the same
+ width such that the entire line exactly fits in the width of the screen (if
+ it's not an exact multiple so that there are N spaces remaining, the
+ rightmost N springs each get one extra space).  Hint: if you want vertical
+ alignment, each line should have the same number of springs.
+
+ Use the '-help_is_utf8' global option to allow UTF-8 sequences in the help
+ text.  Otherwise, the locale 8-bit character set is assumed.
+
+{Basic
+ \|\uREGION\u        \|\uGO TO\u           \|\uGO TO\u           \|\uDELETE\u    \|\uEXIT\u       \|\uSEARCH\u    \| 
+ \|\b^Arrow\b Select \|\b^Z\b Prev. word   \|\b^U/^V\b PgUp/PgDn \|\b^D\b Char.  \|\b^KX\b Save   \|\b^KF\b Find  \| 
+ \|\b^KB\b Begin     \|\b^X\b Next word    \|\uMISC\u            \|\b^Y\b Line   \|\b^C\b  Abort  \|\b^L\b  Next  \| 
+ \|\b^KK\b End       \|\b^KU\b Top of file \|\b^KJ\b Paragraph   \|\b^W\b >Word  \|\b^KQ\b All    \|\uHELP\u      \| 
+ \|\b^KC\b Copy      \|\b^KV\b End of file \|\b^KA\b Center line \|\b^O\b Word<  \|\uFILE\u       \|\bEsc .\b Next\| 
+ \|\b^KM\b Move      \|\b^A\b Beg. of line \|\b^K Space\b Status \|\b^J\b >Line  \|\b^KE\b Edit   \|\bEsc ,\b Prev\| 
+ \|\b^KW\b File      \|\b^E\b End of line  \|\uSPELL\u           \|\b^[O\b Line< \|\b^KR\b Insert \|\b^KH\b Off   \| 
+ \|\b^KY\b Delete    \|\b^KL\b To line no. \|\bEsc N\b Word      \|\b^_\b Undo   \|\b^KD\b Save   \|\b^T\b  Menu  \| 
+ \|\b^K/\b Filter    \|\b^G\b  Matching (  \|\bEsc L\b File      \|\b^^\b Redo   \|\b^K`\b Revert \|\b\b          \| 
+}
+
+{Advanced
+ \|\uMACROS\u         \|\uSCROLL\u           \|\uWINDOW\u               \|\uGO TO\u      \|\uI-SEARCH\u     \| 
+ \|\b^K[ 0-9\b Record \|\bEsc W\b Up         \|\b^KO\b Open  \b^C\b  Close  \|\bEsc B\b / \bK\b  \|\b^R\b Backwards \| 
+ \|\b^K]\b     Stop   \|\bEsc Z\b Down       \|\b^KG\b Grow  \b^KT\b Shrink \|to \b^KB\b/\b^KK \b\|\b^S\b Forwards  \| 
+ \|\bEsc I\b   Text   \|\bEsc <\b Left       \|\b^KN\b Next  \b^KP\b Prev.  \|\b^P\b  Up     \|\uBOOKMARKS\u    \| 
+ \|\b^K?\b     Pause  \|\bEsc >\b Right      \|\b^KI\b Show one / All   \|\b^N\b  Down   \|\bEsc 0-9\b Goto \| 
+ \|   for prompt  \|\uINSERT\u           \|\uSHELL\u                \|\b^B\b  Left   \|\bEsc Esc\b Set  \| 
+ \|\b^K 0-9\b  Play   \|\b^]\b Line  \b^Q\b Ctrl \|\bF1-F4\b Term emulator  \|\b^F\b  Right  \|\b^K-\b Auto prev\| 
+ \|\b^K\\\b     Repeat \|\b^@\b Space \b^\\\b Meta \|\b^K'\b In buffer        \|           \|\b^K=\b Auto next\| 
+ \|\bEsc D\b   Dump   \|\bEsc Y\b Paste      \|\b^KZ\b Suspend  \bEsc !\b Append \|      \|             \| 
+}
+
+{Programs
+ \|\uCOMMANDS\u            \|\uCOMPILING\u                  \|\uQUICK\u                       \| 
+ \|\bEsc X\b Command prompt\|\bEsc C\b Save modified compile\|\b^G\b  Find word under cursor  \| 
+ \|\bEsc M\b Calculator    \|\bEsc G\b Grep                 \|\b^K;\b Tags file search        \| 
+ \|\bshowlog\b Startup log \|\bEsc =\b To next error        \|\bEsc Enter\b Complete word     \| 
+ \|\bupper\b   Change case \|\bEsc -\b To prev. error       \|\uBUFFER\u                      \| 
+ \|\blower\b   Change case \|\bEsc Space\b Jump to error    \|\bEsc U\b Next                  \| 
+ \|\bcd\b      Change dir  \|\uINDENT\u                     \|\bEsc V\b Previous              \| 
+ \|\bkeymap\b  Change map  \|\b^K,\b Less                   \|\bEsc X bufed\b Switch          \| 
+ \|                    \|\b^K.\b More                   \|                            \| 
+}
+
+  Missing: Esc ~ not mod
+           Esc e parse errors in buffer
+           Esc ^Y   yank pop
+  
+{Search
+ Search sequences:                                                            \| 
+     \b\\^  \\$\b  matches beg./end of line       \b\\.\b     match any single char      \| 
+     \b\\<  \\>\b  matches beg./end of word       \b\\!\b     match char or expression   \| 
+     \b\\(  \\)\b  grouping                       \b\\|\b     match left or right         \| 
+     \b\\[a-z]\b  matches one of a set           \b\\y \\Y\b  short for (.*) / (!*)       \| 
+     \b\\{1,3}\b  match 1 - 3 occurrences        \b\\?\b     match 0 or 1 occurrence     \| 
+     \b\\+\b      match 1 or more occurrences    \b\\*\b     match 0 or more occurrences \| 
+                                                                               \|
+ \b^C\b    to abort                             \bEsc .\b  to list of escape sequences \|
+}
+
+{Escape sequences
+ Escape sequences: \| 
+    \b\\x{10fff}\b Unicode code point    \b\\p{Ll}\b  Unicode category \| 
+    \b\\i\b / \b\\I\b   Identifier start      \b\\t\b  tab          \b\\e\b  escape               \| 
+    \b\\c\b / \b\\C\b   Identifier continue   \b\\n\b  newline      \b\\r\b  carriage return      \| 
+    \b\\d\b / \b\\D\b   Digit / Not a digit   \b\\b\b  backspace  \b\\xFF\b  hex character        \| 
+    \b\\w\b / \b\\W\b   Word / Not a word     \b\\a\b  alert      \b\\377\b  octal character      \| 
+    \b\\s\b / \b\\S\b   Space / Not a space   \b\\f\b  formfeed     \b\\\\\b  backslash            \| 
+  \|
+  \|
+}
+
+{Replace
+ Replace sequences:                                                           \| 
+     \b\\&\b      replaced with entire match     \b\\1\b - \b9\b replaced with Nth group   \| 
+     \b\\u \\l\b   convert next to upper/lower    \b\\U \\L\b  case convert until \b\\E\b     \| 
+                                                                              \|
+                                                                              \|
+ \|
+ \|
+ \|
+ \b^C\b    to abort                             \bEsc ,\b to list of escape sequences \|
+}
+
+{SearchOptions
+ Search options:                                                              \| 
+      \br\b Replace      \bk\b Restrict search to highlighted block                   \| 
+      \bi\b Ignore case  \bb\b Search backwards instead of forwards                   \| 
+                     \ba\b Search across all loaded files                         \| 
+                     \be\b Search across all files in Grep or Compile error list  \| 
+  \bw\b / \bn\b  Allow / prevent wrap to start of file                                \| 
+  \bx\b / \by\b  Search text is standard format / JOE format regular expression       \| 
+    \bnnn\b  Perform exactly nnn replacements                                     \| 
+ \b^C\b    to abort
+}
+
+{Math
+  \uMATH COMMANDS\u                  \uCONSTANTS\u                                \| 
+  \bhex oct bin\b display mode       \b0xff\b hex entry                           \| 
+  \beng dec\b engineering / normal   \b0o77\b octal entry                         \| 
+      \bins\b type result into file  \b0b11\b binary entry                        \| 
+     \beval\b evaluate block         \b3e-4\b floating point entry                \| 
+  2+3\b:\bins multiple commands      \uVARIABLES\u                                \| 
+  \uOPERATORS\u                      \bans\b  Previous result                     \| 
+  \b! ^  * / %  + -\b                \ba=10\b Assign a variable                   \| 
+  \b< <= > >= == !=  &&  ||  ? :\b   \bEsc .\b for list of functions              \| 
+}
+
+{Functions
+  \uFUNCTIONS\u                      \uCONSTANTS\u                                \| 
+  \bsin cos tab asin acos atan\b     \be pi\b                                     \| 
+  \bsinh cosh tanh asinh acosh atanh\b                                        \| 
+  \bsqrt cbrt exp ln log\b                                                    \| 
+  \bint floor ceil abs\b                                                      \| 
+  \berf erfc j0 j1 y0 y1\b                                                    \| 
+  \bjoe(..macro..)\b - runs an editor macro                                   \| 
+                                                                              \| 
+                                 \bEsc .\b for statistics                     \| 
+}
+
+{Statistics 
+  \uMATH COMMANDS\u                                                               \| 
+  Statistics on region of numbers  Linear regression on region of x y pairs   \| 
+  \bsum\b  Sum                         \blr(x)\b  Estimate y given x     y=m*x+b      \| 
+  \bcnt\b  Count                       \brlr(y)\b Estimate x given y                  \| 
+  \bavg\b  Mean                        \bLr rLr\b Logarithmic regression y=m*ln(x)+b  \| 
+    Standard deviation:            \blR rlR\b Exponential regression y=e^(m*x)+b  \| 
+  \bdev\b  all data present            \bLR rLR\b Power regression       y=b*x^m      \| 
+  \bsamp\b sample of data present      Side effects: \bb\b, \bm\b: regression coef.       \| 
+                                       \br\b: correlation coef., \bcov\b: covariance  \| 
+}
+
+{Names
+  Hit TAB to complete names.  Use up / down arrow keys to traverse history.   \| 
+  Special file names:                                                         \| 
+       \b!\bcommand                 Pipe in/out of a shell command                \| 
+       \b>>\bfilename               Append to a file                              \| 
+       \b-\b                        Read/Write to/from standard I/O               \|
+       filename\b,START,SIZE\b      Read/Write a part of a file/device            \| 
+           Give START/SIZE in decimal (255), octal (0377) or hex (0xFF)       \| 
+       \b\\,\b                       Use backslash to quote special characters     \|
+ \b^C\b    to abort
+}
+
+{CharTable
+ \| Dec  \u 0123 4567  8901 2345    0123 4567  8901 2345 \u  Dec \| 
+ \|   0 | \u@ABC\u \uDEFG\u  \uHIJK\u \uLMNO\u    \i\u@ABC\u\i \i\uDEFG\u\i  \i\uHIJK\u\i \i\uLMNO\u\i | 128 \| 
+ \|  16 | \uPQRS\u \uTUVW\u  \uXYZ[\u \u\\]^_\u    \i\uPQRS\u\i \i\uTUVW\u\i  \i\uXYZ[\u\i \i\u\\]^_\u\i | 144 \| 
+ \|  32 |  !"# $%&'  ()*+ ,-./     ¡¢£ ¤¥¦§  ¨©ª« ¬X®¯ | 160 \| 
+ \|  48 | 0123 4567  89:; <=>?    °±²³ ´µ¶·  ¸¹º» ¼½¾¿ | 176 \| 
+ \|  64 | @ABC DEFG  HIJK LMNO    ÀÁÂÃ ÄÅÆÇ  ÈÉÊË ÌÍÎÏ | 192 \| 
+ \|  80 | PQRS TUVW  XYZ[ \\]^_    ÐÑÒÓ ÔÕÖ×  ØÙÚÛ ÜÝÞß | 208 \| 
+ \|  96 | `abc defg  hijk lmno    àáâã äåæç  èéêë ìíîï | 224 \| 
+ \| 112 | pqrs tuvw  xyz{ |}~    ðñòó ôõö÷  øùúû üýþÿ | 240 \| 
+}
+
+{Joe
+  Send bug reports to: http://sourceforge.net/projects/joe-editor \| 
+  \| 
+   default joerc file is here /etc/joe/joerc \| 
+   default syntax and i18n files are here /usr/share/joe \| 
+   additional documentation can be found here /usr/share/doc/joe \| 
+  \| 
+  \| 
+  \| 
+  \| 
+}
+
+ FOURTH SECTION: Key bindings:
+
+ Section names you must provide:
+
+	:main		For editing window
+	:prompt		For prompt lines
+	:query		For single-character query lines
+	:querya		Singe-character query for quote
+	:querysr	Search & Replace single-character query
+	:shell		For shell windows
+	:vtshell	For terminal emulator windows
+
+ Other sections may be given as well for organization purposes or for
+ use with the '-keymap' option.
+
+ Use:
+ :inherit name		To copy the named section into the current one
+ :delete key		To delete a key sequence from the current section
+
+ Keys:
+
+ Use U+12345 for specific unicode character
+ Use ^@ through ^_ and ^? for Ctrl chars
+ Use SP for space
+ Use a TO b to generate a range of characters
+ Use MDOWN, MDRAG, MUP, M2DOWN, M2DRAG, M2UP, M3DOWN, M3DRAG, M3UP for mouse
+ Use MWDOWN, MWUP for wheel mouse motion
+ Use ^# for 0x9B (for Amiga).  But warning: this breaks UTF-8 keyboards.
+
+ You can also use termcap string capability names.  For example:
+
+	.ku		Up
+	.kd		Down
+	.kl		Left
+	.kr		Right
+	.kh		Home
+	.kH		End
+	.kI		Insert
+	.kD		Delete
+	.kP		PgUp
+	.kN		PgDn
+	.k1 - .k9	F1 - F9
+	.k0		F0 or F10
+	.k;		F10
+
+ Macros:
+
+ Simple macros can be made by comma seperating 2 or more command names.  For
+ example:
+
+ eof,bol	^T Z		Goto beginning of last line
+
+ Also quoted matter is typed in literally:
+
+ bol,">",dnarw	.k1		Quote news article line
+
+ Macros may cross lines if they end with ,
+
+ Commands or named macros may be created with :def.  For example, you can
+ use:
+
+ :def foo eof,bol
+
+ To define a command foo which will goto the beginning of the last line.
+
+ Recenter
+:def recenter retype,arg,"top+height/2-line",rtn,upslide
+
+:windows		Bindings common to all windows
+type		U+0 TO U+10FFFF
+abort		^C		Abort window
+ abort		^K Q
+ abort		^K ^Q
+ abort		^K q
+querysave,query,killjoe	^K Q	Query to save files, then exit
+querysave,query,killjoe	^K ^Q
+querysave,query,killjoe	^K q
+arg		^K \		Repeat next command
+explode		^K I		Show all windows or show only one window
+explode		^K ^I
+explode		^K i
+help		^K H		Help menu
+help		^K ^H
+help		^K h
+hnext		^[ .		Next help window
+hprev		^[ ,		Previous help window
+math		^[ m		Calculator
+math		^[ M		Calculator
+ math		^[ ^M		Calculator
+msg		^[ h		Display a message
+msg		^[ H		Display a message
+msg		^[ ^H		Display a message
+nextw		^K N		Goto next window
+nextw		^K ^N
+nextw		^K n
+pgdn		.kN		Screen down
+pgdn		^V
+pgdn		^[ [ 6 ~
+ pgdn      ^# S
+pgup		.kP		Screen up
+pgup		^U
+pgup		^[ [ 5 ~
+ pgup      ^# T
+play		^K 0 TO 9	Execute macro
+prevw		^K P		Goto previous window
+prevw		^K ^P
+prevw		^K p
+query		^K ?		Macro query insert
+record		^K [		Record a macro
+ retype		^R		Refresh screen
+ recenter	^R		Recenter and refresh screen
+rtn		^M		Return
+shell		^K Z		Shell escape
+shell		^K ^Z
+shell		^K z
+stop		^K ]		Stop recording
+ Mouse handling
+defmdown	MDOWN		Move the cursor to the mouse location
+defmup		MUP
+defmdrag	MDRAG		Select a region of characters
+defm2down	M2DOWN		Select the word at the mouse location
+defm2up		M2UP
+defm2drag	M2DRAG		Select a region of words
+defm3down	M3DOWN		Select the line at the mouse location
+defm3up		M3UP
+defm3drag	M3DRAG		Select a region of lines
+defmiddleup	MIDDLEUP
+defmiddledown	MIDDLEDOWN	Insert text
+
+xtmouse		^[ [ M		Introduces an xterm mouse event
+extmouse	^[ [ <		Introduces an extended xterm mouse event
+
+ Sample if/then/else macro
+ if,"char==65",then,"it's an A",else,"it's not an a",endif	^[ q
+
+:main			Text editing window
+:inherit windows
+
+ Spell-check macros
+
+ Ispell
+:def ispellfile filt,"cat >ispell.tmp;ispell ispell.tmp </dev/tty >/dev/tty;cat ispell.tmp;/bin/rm ispell.tmp",rtn,retype
+:def ispellword psh,nextword,markk,prevword,markb,filt,"cat >ispell.tmp;ispell ispell.tmp </dev/tty >/dev/tty;tr -d <ispell.tmp '\\012';/bin/rm ispell.tmp",rtn,retype,nextword
+
+ Aspell
+:def aspellfile filt,"SPLTMP=ispell.tmp;cat >$SPLTMP;aspell --lang=",language,".",charset," -x -c $SPLTMP </dev/tty >/dev/tty;cat $SPLTMP;/bin/rm $SPLTMP",rtn,retype
+:def aspellword psh,nextword,markk,prevword,markb,filt,"SPLTMP=ispell.tmp;cat >$SPLTMP;aspell --lang=",language,".",charset," -x -c $SPLTMP </dev/tty >/dev/tty;tr -d <$SPLTMP '\\012';/bin/rm $SPLTMP",rtn,retype,nextword
+
+
+aspellfile	^[ l
+aspellword	^[ n
+
+ Compile
+
+:def compile mwind!,mfit!,querysave,query,scratch,"* Build Log *",rtn,bof,markb,eof," ",markk,blkdel,build
+
+ Grep
+
+:def grep_find mwind!,mfit!,scratch,"* Grep Log *",rtn,bof,markb,eof," ",markk,blkdel,grep
+
+ Man page
+
+:def man scratch,"* Man Page *",rtn,bof,markb,eof," ",markk,blkdel," ",ltarw,run,"man -P cat -S 2:3 "
+
+ Shell windows
+ We load the already existing Startup Log first so that Shell does not inherit the current directory.
+
+:def shell1 scratch_push,"* Startup Log *",rtn,scratch_push,"* Shell 1 *",rtn,vtbknd!,eof
+:def shell2 scratch_push,"* Startup Log *",rtn,scratch_push,"* Shell 2 *",rtn,vtbknd!,eof
+:def shell3 scratch_push,"* Startup Log *",rtn,scratch_push,"* Shell 3 *",rtn,vtbknd!,eof
+:def shell4 scratch_push,"* Startup Log *",rtn,scratch_push,"* Shell 4 *",rtn,vtbknd!,eof
+
+ Macros allowed in shell window commands
+:def shell_clear psh,bof,markb,eof,markk,blkdel
+:def shell_parse parserr
+:def shell_gparse gparse
+:def shell_release release
+:def shell_math maths
+:def shell_abort abort
+:def shell_typemath txt,maths,"ins",rtn,rtn,txt,"
",rtn,txt,quote,"d",rtn
+:def shell_rtn rtn
+:def shell_edit edit
+:def shell_dellin dellin
+:def shell_cd cd
+:def shell_pop popabort
+:def shell_markb markb
+:def shell_markk markk
+
+ Split window version
+ :def shell1 if,"is_shell==0",then,tw1,mfit,endif,scratch,"* Shell 1 *",rtn,vtbknd!,eof
+ :def shell2 if,"is_shell==0",then,tw1,mfit,endif,scratch,"* Shell 2 *",rtn,vtbknd!,eof
+ :def shell3 if,"is_shell==0",then,tw1,mfit,endif,scratch,"* Shell 3 *",rtn,vtbknd!,eof
+ :def shell4 if,"is_shell==0",then,tw1,mfit,endif,scratch,"* Shell 4 *",rtn,vtbknd!,eof
+
+
+ Here we guess some common key sequences which either do not have termcap
+ sequences or which are frequently wrong.  Note that if the termcap entry is
+ correct, it will override these later on.
+
+paste			^[ ] 5 2 ;		Base64 paste (obsolete)
+brpaste			^[ [ 2 0 0 ~		Bracketed paste
+brpaste_done		^[ [ 2 0 1 ~		Bracketed paste done
+
+insc			^[ [ 2 ~
+insc			^[ [ L			SCO
+
+delch			^[ [ 3 ~
+
+pgup			^[ [ I		SCO
+
+pgdn			^[ [ G		SCO
+
+home			^[ [ 1 ~		Putty, Linux, Cygwin
+home			^[ [ H			Xterm, Konsole, SCO
+home			^[ O H			gnome-terminal
+home			^[ [ 7 ~		RxVT
+ home			^# SP A		Amiga
+
+eol			^[ [ 4 ~		Putty, Linux, Cygwin, ssh
+eol			^[ [ F			Xterm, Konsole, SCO
+eol			^[ O F			gnome-terminal
+eol			^[ [ 8 ~		RxVT
+ eol			^# SP @		Amiga
+
+rtarw,ltarw,begin_marking,rtarw,toggle_marking	^[ [ 1 ; 5 C    Mark right Xterm
+rtarw,ltarw,begin_marking,rtarw,toggle_marking	^[ [ 5 C        Mark right Gnome-terminal
+ (Almost all termcap entries have ^[ O C as an arrow key).
+ rtarw,ltarw,begin_marking,rtarw,toggle_marking	^[ O C		Mark right Putty Ctrl-rtarw
+rtarw,ltarw,begin_marking,rtarw,toggle_marking	^[ O c		Mark right RxVT Ctrl-rtarw
+
+ltarw,rtarw,begin_marking,ltarw,toggle_marking	^[ [ 1 ; 5 D    Mark left
+ltarw,rtarw,begin_marking,ltarw,toggle_marking	^[ [ 5 D        Mark left
+ ltarw,rtarw,begin_marking,ltarw,toggle_marking	^[ O D		Mark left Putty Ctrl-ltarw
+ltarw,rtarw,begin_marking,ltarw,toggle_marking	^[ O d		Mark left RxVT Ctrl-ltarw
+
+uparw,dnarw,begin_marking,uparw,toggle_marking	^[ [ 1 ; 5 A    Mark up
+uparw,dnarw,begin_marking,uparw,toggle_marking	^[ [ 5 A        Mark up
+ uparw,dnarw,begin_marking,uparw,toggle_marking	^[ O A		Mark up Putty Ctrl-uparw
+uparw,dnarw,begin_marking,uparw,toggle_marking	^[ O a		Mark up RxVT Ctrl-uparw
+
+dnarw,uparw,begin_marking,dnarw,toggle_marking	^[ [ 1 ; 5 B    Mark down
+dnarw,uparw,begin_marking,dnarw,toggle_marking	^[ [ 5 B        Mark down
+ dnarw,uparw,begin_marking,dnarw,toggle_marking	^[ O B		Mark down Putty Ctrl-dnarw
+dnarw,uparw,begin_marking,dnarw,toggle_marking	^[ O b		Mark down RxVT Ctrl-dnarw
+
+blkdel,nmark   ^[ [ 3 ; 5 -	Gnome-terminal Ctrl-Del
+blkdel,nmark   ^[ [ 3 ; 5 ~	Xterm Ctrl-Del
+
+yank		^[ [ 2 ; 5 -	Gnome-terminal Ctrl-Ins
+yank		^[ [ 2 ; 5 ~    Xterm Ctrl-Ins
+
+ Extra functions not really part of JOE user interface:
+
+delbol		^[ o		Delete to beginning of line
+delbol		^[ ^O		Delete to beginning of line
+dnslide		^[ z		Scroll down one line
+dnslide		^[ Z		Scroll down one line
+dnslide		^[ ^Z		Scroll down one line
+dnslide,dnslide,dnslide,dnslide		MWDOWN
+compile		^[ c		Compile
+compile		^[ C
+compile		^[ ^C		Compile
+grep_find	^[ g		Grep
+grep_find	^[ G		Grep
+grep_find	^[ ^G		Grep
+execmd		^[ x		Prompt for command to execute
+execmd		^[ X		Prompt for command to execute
+execmd		^[ ^X		Prompt for command to execute
+finish		^[ ^I		Complete word in document
+finish		^[ ^M		Complete word: used to be math
+mwind!,mfit,jump,bol		^[ SP
+isrch		^[ s		Forward incremental search
+isrch		^[ S		Forward incremental search
+isrch		^[ ^S		Forward incremental search
+isrch		^S
+notmod		^[ ~		Not modified
+mwind,mfit,prevw,nxterr		^[ =		To next error
+parserr		^[ e		Parse errors in current buffer
+parserr		^[ E		Parse errors in current buffer
+parserr		^[ ^E		Parse errors in current buffer
+mwind,mfit,prevw,prverr		^[ -		To previous error
+rsrch		^[ r		Backward incremental search
+rsrch		^[ R		Backward incremental search
+rsrch		^[ ^R		Backward incremental search
+retype,rsrch	^R
+run		^[ !		Run a program in a window
+tomarkb		^[ b		Go to beginning of marked block
+tomarkb		^[ ^B		Go to beginning of marked block
+tomarkk		^[ k		Go to end of marked block
+tomarkk		^[ ^K		Go to end of marked block
+tomarkk		^[ K		Go to end of marked block
+txt		^[ i		Prompt for text and insert it
+txt		^[ I		Prompt for text and insert it
+upslide		^[ w		Scroll up one line
+upslide		^[ ^W		Scroll up one line
+upslide		^[ W		Scroll up one line
+upslide,upslide,upslide,upslide		MWUP
+yank		^[ y		Undelete text
+yankpop		^[ ^Y		Undelete text
+yank		^[ Y		Undelete text
+
+ toggle_marking	^@		Ctrl-space block selection method
+insc		^@		Ctrl-space used to insert a space
+
+ bufed		^[ d		Menu of buffers
+nbuf		^[ v		Next buffer
+nbuf		^[ V		Next buffer
+nbuf		^[ ^V		Next buffer
+pbuf		^[ u		Prev buffer
+pbuf		^[ U		Prev buffer
+pbuf		^[ ^U		Prev buffer
+ query		^[ q		Quoted insert
+ byte		^[ n		Goto byte
+ col		^[ c		Goto column
+ abortbuf	^[ k		Kill current buffer- don't mess with windows
+ ask		^[ a		Ask to save current buffer
+ bop		^[ p		Backwards paragraph
+ bos		^[ x		Bottom of screen
+ copy		^[ ^W		Copy block into yank
+ dupw		^[ \		Split window
+ eop		^[ n		Forwards paragraph
+ format		^[ j		Format paragraph ignore block
+ markl		^[ l		Mark line
+ nmark		^[ @		Turn off ^KB ^KK
+ pop		^[ >		Pop ^KB ^KK
+ psh		^[ <		Push ^KB ^KK
+ swap		^[ x		Swap ^KB and cursor
+ tomarkbk	^[ g		Switch between beginning and end of marked
+ tos		^[ e		Top of screen
+ tw0		^[ 0		Kill current window (orphans buffer)
+ tw1		^[ 1		Kill all other windows (orphans buffers)
+ uarg		^[ u		Universal argument
+ yank		^[ ^Y		Undelete previous text
+ yapp		^[ w		Append next delete to previous yank
+
+ Standard JOE user interface
+
+quote8		^\		Enter Meta chars
+ quote		`		Enter Ctrl chars
+quote		^[ '		Enter Ctrl chars
+quote		^Q
+
+backs		^?		Backspace
+backs		^H
+backw		^O		Backspace word
+bknd		^K '		Shell window
+blkcpy		^K C		Copy marked block
+blkcpy		^K ^C
+blkcpy		^K c
+blkdel		^K Y		Delete marked block
+blkdel		^K ^Y
+blkdel		^K y
+blkmove		^K M		Move marked block
+blkmove		^K ^M
+blkmove		^K m
+blksave		^K W		Save marked block
+blksave		^K ^W
+blksave		^K w
+bof		^K U		Goto beginning of file
+bof		^K ^U
+bof		^K u
+ bol		.kh		Goto beginning of line
+ bol		^A
+ bol      ^# SP A
+home		.kh
+home		^A
+center		^K A		Center line
+center		^K ^A
+center		^K a
+crawll		^K <		Pan left
+crawll		^[ <		Pan left
+crawlr		^K >		Pan right
+crawlr		^[ >		Pan right
+delch		.kD		Delete character
+delch		^D
+deleol		^J		Delete to end of line
+dellin		^Y		Delete entire line
+delw		^W		Delete word to right
+dnarw		.kd		Go down
+dnarw		^N
+dnarw		^[ O B
+dnarw		^[ [ B
+ dnarw		^# B
+edit		^K E		Edit a file
+edit		^K ^E
+edit		^K e
+eof		^K V		Go to end of file
+eof		^K ^V
+eof		^K v
+eol		.kH		Go to end of line
+eol		.@7
+eol		^E
+exsave		^K X		Save and exit
+exsave		^K ^X
+exsave		^K x
+ffirst		^K F		Find first
+ffirst		^K ^F
+ffirst		^K f
+filt		^K /		Filter block
+ finish		^K ^M		Complete text under cursor
+fnext		^L		Find next
+fmtblk		^K J		Format paragraphs in block
+fmtblk		^K ^J
+fmtblk		^K j
+gomark		^[ 0 TO 9	Goto bookmark
+groww		^K G		Grow window
+groww		^K ^G
+groww		^K g
+insc		.kI		Insert a space
+ insc		^@
+insf		^K R		Insert a file
+insf		^K ^R
+insf		^K r
+lindent		^K ,		Indent to left
+line		^K L		Goto line no.
+line		^K ^L
+line		^K l
+ltarw		.kl		Go left
+ltarw		^B
+ltarw		^[ O D
+ltarw		^[ [ D
+ ltarw          ^# D
+macros		^[ d		Dump keyboard macros
+macros		^[ ^D
+markb		^K B		Set beginning of marked block
+markb		^K ^B
+markb		^K b
+markk		^K K		Set end of marked block
+markk		^K ^K
+markk		^K k
+ mode		^T		Options menu
+menu,"root",rtn	^T
+nextpos		^K =		Goto next position in position history
+nextword	^X		Goto next word
+open		^]		Split line
+prevpos		^K -		Previous position in history
+prevword	^Z		Previous word
+reload		^K `		Revert file
+redo		^^		Redo changes
+rindent		^K .		Indent to right
+rtarw		.kr		Go right
+rtarw		^F
+rtarw		^[ O C
+rtarw		^[ [ C
+ rtarw          ^# C
+run		^K !		Run a shell command
+save		^K D		Save file
+save		^K S
+save		^K ^D
+save		^K ^S
+save		^K d
+save		^K s
+setmark		^[ ^[		Set bookmark
+shrinkw		^K T		Shrink window
+shrinkw		^K ^T
+shrinkw		^K t
+splitw		^K O		Split window
+splitw		^K ^O
+splitw		^K o
+stat		^K SP		Show status
+stat		^K ^@		Show status
+tag		^K ;		Tags file search
+tomatch		^G		Goto matching parenthasis
+undo		^_		Undo changes
+uparw		.ku		Go up
+ uparw		^# A
+uparw		^P
+uparw		^[ O A
+uparw		^[ [ A
+shell1		^[ [ 1 1 ~
+shell1		^[ O P
+shell1		^[ [ [ A
+shell1		.k1
+shell2		^[ [ 1 2 ~
+shell2		^[ O Q
+shell2		^[ [ [ B
+shell2		.k2
+shell3		^[ [ 1 3 ~
+shell3		^[ O R
+shell3		^[ [ [ C
+shell3		.k3
+shell4		^[ [ 1 4 ~
+shell4		^[ O S
+shell4		^[ [ [ D
+shell4		.k4
+
+:prompt			Prompt windows
+:inherit main
+if,"byte>size",then,complete,complete,else,delch,endif	^D
+complete	^I
+dnarw,eol	.kd		Go down
+dnarw,eol	^N
+dnarw,eol	^[ O B
+dnarw,eol	^[ [ B
+ dnarw,eol	^# B
+uparw,eol	.ku		Go up
+ uparw,eol	^# A
+uparw,eol	^P
+uparw,eol	^[ O A
+uparw,eol	^[ [ A
+
+:menu			Selection menus
+:inherit windows
+
+pgupmenu			^[ [ I
+
+pgdnmenu			^[ [ G
+
+bolmenu			^[ [ 1 ~		Putty, Linux, Cygwin
+bolmenu			^[ [ H			Xterm, Konsole
+bolmenu			^[ O H			gnome-terminal
+bolmenu			^[ [ 7 ~		RxVT
+ bolmenu			^# SP A		Amiga
+
+eolmenu			^[ [ 4 ~		Putty, Linux, Cygwin, ssh
+eolmenu			^[ [ F			Xterm, Konsole
+eolmenu			^[ O F			gnome-terminal
+eolmenu			^[ [ 8 ~		RxVT
+ eolmenu			^# SP @		Amiga
+
+abort		^[ ^[	Why?
+backsmenu	^?
+backsmenu	^H
+bofmenu		^K U
+bofmenu		^K ^U
+bofmenu		^K u
+bolmenu		.kh
+bolmenu		^A
+dnarwmenu	.kd
+dnarwmenu	^N
+dnarwmenu	^[ [ B
+dnarwmenu	^[ O B
+ dnarwmenu ^# B
+dnarwmenu	MWDOWN
+eofmenu		^K V
+eofmenu		^K ^V
+eofmenu		^K v
+eolmenu		.kH
+eolmenu		^E
+ltarwmenu	.kl
+ltarwmenu	^B
+ltarwmenu	^[ [ D
+ltarwmenu	^[ O D
+ ltarwmenu ^# D
+pgdnmenu	.kN		Screen down
+pgdnmenu	^V
+pgdnmenu	^[ [ 6 ~
+ pgdnmenu  ^# S
+pgupmenu	.kP		Screen up
+pgupmenu	^U
+pgupmenu	^[ [ 5 ~
+ pgupmenu  ^# T
+rtarwmenu	.kr
+rtarwmenu	^F
+rtarwmenu	^[ [ C
+ rtarwmenu ^# C
+rtarwmenu	^[ O C
+rtn		SP
+rtn		^I
+rtn		^K H
+rtn		^K h
+rtn		^K ^H
+tabmenu		^I
+uparwmenu	.ku
+uparwmenu	^P
+uparwmenu	^[ [ A
+uparwmenu	^[ O A
+ uparwmenu ^# A
+uparwmenu	MWUP
+defm2down	M2DOWN		Hits return key
+
+:query			Single-key query window
+:inherit windows
+
+:querya			Single-key query window for quoting
+type		U+0 TO U+10FFFF
+
+:querysr		Search & replace query window
+type		U+0 TO U+10FFFF
+
+:shell			Input to shell windows
+:inherit main
+""		^C		Abort
+""		^D		Eof
+"	"	^I		Tab
+""		^H		Backspace
+"
"		^M		Return
+""		^?		Backspace
+
+:vtshell		Input to ANSI shell windows
+:inherit main
+""		 [ A
+""		.ku
+""		 [ B
+""		.kd
+""		 [ C
+""		.kr
+""		 [ D
+""		.kl
+""		^A		BOL for bash
+""		^C		Abort
+""		^D		Eof
+""		^E		EOL for bash
+"	"	^I		Tab
+""		^H		Backspace
+"
"		^M		Return
+""		^?		Backspace

+ 3 - 0
board/PSG/iot2000/rootfs_overlay/etc/modules-load.galileo/galileo.conf

@@ -0,0 +1,3 @@
+intel_qrk_gip
+cy8c9540a
+ad7298

+ 4 - 0
board/PSG/iot2000/rootfs_overlay/etc/modules-load.galileo/galileo_gen2.conf

@@ -0,0 +1,4 @@
+intel_qrk_gip
+gpio-pca953x
+pca9685
+adc1x8s102

+ 4 - 0
board/PSG/iot2000/rootfs_overlay/etc/modules-load.galileo/simatic_iot2000.conf

@@ -0,0 +1,4 @@
+galileogen2_fake
+galileo_spi1_spidev
+galileo_uio_gpio
+i2c_dev

+ 24 - 0
board/PSG/iot2000/rootfs_overlay/etc/network/interfaces

@@ -0,0 +1,24 @@
+auto lo
+auto eth0
+auto eth1
+auto usb0
+
+iface lo inet loopback
+
+iface eth0 inet static
+       address 192.168.21.84
+       netmask 255.255.252.0
+       broadcast 192.168.23.255
+       gateway 192.168.21.111
+       post-up echo "nameserver 192.168.21.111" > /etc/resolv.conf
+
+iface eth1 inet static
+       address 192.168.0.1
+       netmask 255.255.255.0
+       broadcast 192.168.0.255
+
+iface usb0 inet static
+	address 192.168.7.2
+	broadcast 192.168.7.2
+	netmask 255.255.255.252
+

+ 118 - 0
board/PSG/iot2000/rootfs_overlay/etc/ssh/sshd_config

@@ -0,0 +1,118 @@
+#	$OpenBSD: sshd_config,v 1.101 2017/03/14 07:19:07 djm Exp $
+
+# This is the sshd server system-wide configuration file.  See
+# sshd_config(5) for more information.
+
+# This sshd was compiled with PATH=/usr/bin:/bin:/usr/sbin:/sbin
+
+# The strategy used for options in the default sshd_config shipped with
+# OpenSSH is to specify options with their default value where
+# possible, but leave them commented.  Uncommented options override the
+# default value.
+
+#Port 22
+#AddressFamily any
+#ListenAddress 0.0.0.0
+#ListenAddress ::
+
+#HostKey /etc/ssh/ssh_host_rsa_key
+#HostKey /etc/ssh/ssh_host_dsa_key
+#HostKey /etc/ssh/ssh_host_ecdsa_key
+#HostKey /etc/ssh/ssh_host_ed25519_key
+
+# Ciphers and keying
+#RekeyLimit default none
+
+# Logging
+#SyslogFacility AUTH
+#LogLevel INFO
+
+# Authentication:
+
+#LoginGraceTime 2m
+PermitRootLogin yes
+#StrictModes yes
+#MaxAuthTries 6
+#MaxSessions 10
+
+#PubkeyAuthentication yes
+
+# The default is to check both .ssh/authorized_keys and .ssh/authorized_keys2
+# but this is overridden so installations will only check .ssh/authorized_keys
+AuthorizedKeysFile	.ssh/authorized_keys
+
+#AuthorizedPrincipalsFile none
+
+#AuthorizedKeysCommand none
+#AuthorizedKeysCommandUser nobody
+
+# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
+#HostbasedAuthentication no
+# Change to yes if you don't trust ~/.ssh/known_hosts for
+# HostbasedAuthentication
+#IgnoreUserKnownHosts no
+# Don't read the user's ~/.rhosts and ~/.shosts files
+#IgnoreRhosts yes
+
+# To disable tunneled clear text passwords, change to no here!
+#PasswordAuthentication yes
+#PermitEmptyPasswords no
+
+# Change to no to disable s/key passwords
+#ChallengeResponseAuthentication yes
+
+# Kerberos options
+#KerberosAuthentication no
+#KerberosOrLocalPasswd yes
+#KerberosTicketCleanup yes
+#KerberosGetAFSToken no
+
+# GSSAPI options
+#GSSAPIAuthentication no
+#GSSAPICleanupCredentials yes
+
+# Set this to 'yes' to enable PAM authentication, account processing,
+# and session processing. If this is enabled, PAM authentication will
+# be allowed through the ChallengeResponseAuthentication and
+# PasswordAuthentication.  Depending on your PAM configuration,
+# PAM authentication via ChallengeResponseAuthentication may bypass
+# the setting of "PermitRootLogin without-password".
+# If you just want the PAM account and session checks to run without
+# PAM authentication, then enable this but set PasswordAuthentication
+# and ChallengeResponseAuthentication to 'no'.
+#UsePAM no
+
+#AllowAgentForwarding yes
+#AllowTcpForwarding yes
+#GatewayPorts no
+#X11Forwarding no
+#X11DisplayOffset 10
+#X11UseLocalhost yes
+#PermitTTY yes
+#PrintMotd yes
+#PrintLastLog yes
+#TCPKeepAlive yes
+#UseLogin no
+#PermitUserEnvironment no
+#Compression delayed
+#ClientAliveInterval 0
+#ClientAliveCountMax 3
+#UseDNS no
+#PidFile /var/run/sshd.pid
+#MaxStartups 10:30:100
+#PermitTunnel no
+#ChrootDirectory none
+#VersionAddendum none
+
+# no default banner path
+#Banner none
+
+# override default of no subsystems
+Subsystem	sftp	/usr/libexec/sftp-server
+
+# Example of overriding settings on a per-user basis
+#Match User anoncvs
+#	X11Forwarding no
+#	AllowTcpForwarding no
+#	PermitTTY no
+#	ForceCommand cvs server

BIN
board/PSG/iot2000/rootfs_overlay/root/a.out


+ 23 - 0
board/PSG/iot2000/rootfs_overlay/root/gadget.sh

@@ -0,0 +1,23 @@
+#!/bin/sh -e
+ 
+mount -t configfs none /sys/kernel/config 
+cd /sys/kernel/config/usb_gadget/
+mkdir g && cd g
+ 
+echo 0x1d6b > idVendor  # Linux Foundation
+echo 0x0104 > idProduct # Multifunction Composite Gadget
+echo 0x0100 > bcdDevice # v1.0.0
+echo 0x0200 > bcdUSB    # USB 2.0
+ 
+mkdir -p strings/0x409
+echo "deadbeef00115599" > strings/0x409/serialnumber
+echo "iot gadget"        > strings/0x409/manufacturer
+echo "iot 2040 gadget"   > strings/0x409/product
+ 
+mkdir -p functions/rndis.usb0  # network
+ 
+mkdir -p configs/c.1
+echo 250 > configs/c.1/MaxPower
+ln -s functions/rndis.usb0 configs/c.1/
+ 
+ls /sys/class/udc/ > UDC

+ 163 - 0
configs/iot2000_defconfig

@@ -0,0 +1,163 @@
+BR2_x86_x1000=y
+BR2_DL_DIR="~/buildroot_psg_dl"
+BR2_HOST_DIR="/opt/PSG/TC_L44y_C6x"
+BR2_TOOLCHAIN_BUILDROOT_GLIBC=y
+BR2_PACKAGE_HOST_LINUX_HEADERS_CUSTOM_4_4=y
+BR2_TOOLCHAIN_BUILDROOT_CXX=y
+BR2_PACKAGE_HOST_GDB=y
+BR2_PACKAGE_HOST_GDB_TUI=y
+BR2_PACKAGE_HOST_GDB_PYTHON=y
+BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_EUDEV=y
+BR2_TARGET_GENERIC_ROOT_PASSWD="root"
+BR2_TARGET_GENERIC_GETTY_PORT="ttyS1"
+BR2_TARGET_GENERIC_GETTY_BAUDRATE_115200=y
+BR2_ROOTFS_OVERLAY="../PSG/board/PSG/iot2000/rootfs_overlay"
+BR2_ROOTFS_POST_BUILD_SCRIPT="../PSG/board/PSG/iot2000/post-build.sh"
+BR2_ROOTFS_POST_IMAGE_SCRIPT="../PSG/board/PSG/iot2000/post-image.sh"
+BR2_LINUX_KERNEL=y
+BR2_LINUX_KERNEL_CUSTOM_GIT=y
+BR2_LINUX_KERNEL_CUSTOM_REPO_URL="https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git"
+BR2_LINUX_KERNEL_CUSTOM_REPO_VERSION="linux-4.4.y"
+BR2_LINUX_KERNEL_PATCH="../PSG/board/PSG/iot2000/linux-4.4-patches"
+BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y
+BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="../PSG/board/PSG/iot2000/linux-4.4.config"
+BR2_LINUX_KERNEL_INSTALL_TARGET=y
+BR2_PACKAGE_BUSYBOX_CONFIG="../PSG/board/PSG/iot2000/busybox.config"
+BR2_PACKAGE_BUSYBOX_SHOW_OTHERS=y
+BR2_PACKAGE_GDB=y
+BR2_PACKAGE_GDB_DEBUGGER=y
+BR2_PACKAGE_GDB_TUI=y
+BR2_PACKAGE_CMAKE_CTEST=y
+BR2_PACKAGE_GIT=y
+BR2_PACKAGE_TREE=y
+BR2_PACKAGE_QT5=y
+BR2_PACKAGE_QT5BASE_CONCURRENT=y
+BR2_PACKAGE_QT5BASE_MYSQL=y
+BR2_PACKAGE_QT5BASE_SQLITE_SYSTEM=y
+BR2_PACKAGE_QT5BASE_ICU=y
+BR2_PACKAGE_QT5SCRIPT=y
+BR2_PACKAGE_QT5SENSORS=y
+BR2_PACKAGE_QT5SERIALBUS=y
+BR2_PACKAGE_QT5XMLPATTERNS=y
+BR2_PACKAGE_LINUX_FIRMWARE=y
+BR2_PACKAGE_LINUX_FIRMWARE_INTEL_SST_DSP=y
+BR2_PACKAGE_LINUX_FIRMWARE_IBT=y
+BR2_PACKAGE_LINUX_FIRMWARE_QUALCOMM_6174A_BT=y
+BR2_PACKAGE_LINUX_FIRMWARE_ATHEROS_6002=y
+BR2_PACKAGE_LINUX_FIRMWARE_ATHEROS_6003=y
+BR2_PACKAGE_LINUX_FIRMWARE_ATHEROS_6004=y
+BR2_PACKAGE_LINUX_FIRMWARE_ATHEROS_7010=y
+BR2_PACKAGE_LINUX_FIRMWARE_ATHEROS_9170=y
+BR2_PACKAGE_LINUX_FIRMWARE_ATHEROS_9271=y
+BR2_PACKAGE_LINUX_FIRMWARE_BRCM_BCM43XX=y
+BR2_PACKAGE_LINUX_FIRMWARE_BRCM_BCM43XXX=y
+BR2_PACKAGE_LINUX_FIRMWARE_IWLWIFI_3160=y
+BR2_PACKAGE_LINUX_FIRMWARE_IWLWIFI_3168=y
+BR2_PACKAGE_LINUX_FIRMWARE_IWLWIFI_5000=y
+BR2_PACKAGE_LINUX_FIRMWARE_IWLWIFI_6000G2A=y
+BR2_PACKAGE_LINUX_FIRMWARE_IWLWIFI_6000G2B=y
+BR2_PACKAGE_LINUX_FIRMWARE_IWLWIFI_7260=y
+BR2_PACKAGE_LINUX_FIRMWARE_IWLWIFI_7265D=y
+BR2_PACKAGE_LINUX_FIRMWARE_IWLWIFI_8000C=y
+BR2_PACKAGE_LINUX_FIRMWARE_IWLWIFI_8265=y
+BR2_PACKAGE_LINUX_FIRMWARE_LIBERTAS_SD8686_V8=y
+BR2_PACKAGE_LINUX_FIRMWARE_LIBERTAS_SD8686_V9=y
+BR2_PACKAGE_LINUX_FIRMWARE_LIBERTAS_SD8688=y
+BR2_PACKAGE_LINUX_FIRMWARE_MWIFIEX_SD8787=y
+BR2_PACKAGE_LINUX_FIRMWARE_MWIFIEX_SD8797=y
+BR2_PACKAGE_LINUX_FIRMWARE_MWIFIEX_USB8797=y
+BR2_PACKAGE_LINUX_FIRMWARE_MWIFIEX_USB8801=y
+BR2_PACKAGE_LINUX_FIRMWARE_MWIFIEX_SD8887=y
+BR2_PACKAGE_LINUX_FIRMWARE_MWIFIEX_SD8897=y
+BR2_PACKAGE_LINUX_FIRMWARE_MWIFIEX_USB8897=y
+BR2_PACKAGE_LINUX_FIRMWARE_MWIFIEX_PCIE8897=y
+BR2_PACKAGE_LINUX_FIRMWARE_MEDIATEK_MT7601U=y
+BR2_PACKAGE_LINUX_FIRMWARE_QUALCOMM_6174=y
+BR2_PACKAGE_LINUX_FIRMWARE_RALINK_RT61=y
+BR2_PACKAGE_LINUX_FIRMWARE_RALINK_RT73=y
+BR2_PACKAGE_LINUX_FIRMWARE_RALINK_RT2XX=y
+BR2_PACKAGE_LINUX_FIRMWARE_RTL_81XX=y
+BR2_PACKAGE_LINUX_FIRMWARE_RTL_87XX=y
+BR2_PACKAGE_LINUX_FIRMWARE_RTL_88XX=y
+BR2_PACKAGE_LINUX_FIRMWARE_BNX2X=y
+BR2_PACKAGE_LINUX_FIRMWARE_CXGB4_T4=y
+BR2_PACKAGE_LINUX_FIRMWARE_CXGB4_T5=y
+BR2_PACKAGE_LINUX_FIRMWARE_RTL_8169=y
+BR2_PACKAGE_UX500_FIRMWARE=y
+BR2_PACKAGE_WILC1000_FIRMWARE=y
+BR2_PACKAGE_WILINK_BT_FIRMWARE=y
+BR2_PACKAGE_ZD1211_FIRMWARE=y
+BR2_PACKAGE_USBMOUNT=y
+BR2_PACKAGE_USBUTILS=y
+BR2_PACKAGE_MARIADB=y
+BR2_PACKAGE_MARIADB_SERVER=y
+BR2_PACKAGE_SQLITE_STAT3=y
+BR2_PACKAGE_SQLITE_ENABLE_FTS3=y
+BR2_PACKAGE_SQLITE_ENABLE_JSON1=y
+BR2_PACKAGE_SQLITE_ENABLE_UNLOCK_NOTIFY=y
+BR2_PACKAGE_SQLITE_NO_SYNC=y
+BR2_PACKAGE_JANSSON=y
+BR2_PACKAGE_CURL=y
+BR2_PACKAGE_LIBCURL_VERBOSE=y
+BR2_PACKAGE_LIBMICROHTTPD=y
+BR2_PACKAGE_LIBMICROHTTPD_SSL=y
+BR2_PACKAGE_LIBMODBUS=y
+BR2_PACKAGE_BOOST=y
+BR2_PACKAGE_BOOST_ATOMIC=y
+BR2_PACKAGE_BOOST_CHRONO=y
+BR2_PACKAGE_BOOST_CONTAINER=y
+BR2_PACKAGE_BOOST_CONTEXT=y
+BR2_PACKAGE_BOOST_COROUTINE=y
+BR2_PACKAGE_BOOST_COROUTINE2=y
+BR2_PACKAGE_BOOST_DATE_TIME=y
+BR2_PACKAGE_BOOST_EXCEPTION=y
+BR2_PACKAGE_BOOST_FILESYSTEM=y
+BR2_PACKAGE_BOOST_GRAPH=y
+BR2_PACKAGE_BOOST_GRAPH_PARALLEL=y
+BR2_PACKAGE_BOOST_IOSTREAMS=y
+BR2_PACKAGE_BOOST_LOCALE=y
+BR2_PACKAGE_BOOST_LOG=y
+BR2_PACKAGE_BOOST_MATH=y
+BR2_PACKAGE_BOOST_METAPARSE=y
+BR2_PACKAGE_BOOST_MPI=y
+BR2_PACKAGE_BOOST_PROGRAM_OPTIONS=y
+BR2_PACKAGE_BOOST_RANDOM=y
+BR2_PACKAGE_BOOST_REGEX=y
+BR2_PACKAGE_BOOST_SERIALIZATION=y
+BR2_PACKAGE_BOOST_SIGNALS=y
+BR2_PACKAGE_BOOST_SYSTEM=y
+BR2_PACKAGE_BOOST_THREAD=y
+BR2_PACKAGE_BOOST_TIMER=y
+BR2_PACKAGE_BOOST_TYPE_ERASURE=y
+BR2_PACKAGE_BOOST_WAVE=y
+BR2_PACKAGE_DHCP=y
+BR2_PACKAGE_DHCP_SERVER=y
+BR2_PACKAGE_DHCP_SERVER_DELAYED_ACK=y
+BR2_PACKAGE_DHCP_CLIENT=y
+BR2_PACKAGE_ETHTOOL=y
+BR2_PACKAGE_IPROUTE2=y
+BR2_PACKAGE_IPTABLES=y
+BR2_PACKAGE_IPTABLES_BPF_NFSYNPROXY=y
+BR2_PACKAGE_IPTABLES_NFTABLES=y
+BR2_PACKAGE_IPUTILS=y
+BR2_PACKAGE_OPENSSH=y
+BR2_PACKAGE_RSYNC=y
+BR2_PACKAGE_SCREEN=y
+BR2_PACKAGE_SUDO=y
+BR2_PACKAGE_HTOP=y
+BR2_PACKAGE_KEYUTILS=y
+BR2_PACKAGE_JOE=y
+BR2_TARGET_ROOTFS_EXT2=y
+BR2_TARGET_ROOTFS_EXT2_4=y
+BR2_TARGET_ROOTFS_EXT2_LABEL="iot2000"
+BR2_TARGET_ROOTFS_EXT2_SIZE="1024M"
+BR2_TARGET_ROOTFS_EXT2_RESBLKS=10
+# BR2_TARGET_ROOTFS_TAR is not set
+BR2_TARGET_GRUB2=y
+BR2_TARGET_GRUB2_I386_EFI=y
+BR2_PACKAGE_HOST_CMAKE=y
+BR2_PACKAGE_HOST_DOSFSTOOLS=y
+BR2_PACKAGE_HOST_GENIMAGE=y
+BR2_PACKAGE_HOST_MTOOLS=y
+BR2_PACKAGE_WT=y
+# BR2_PACKAGE_ADC1X8S102 is not set

+ 2 - 0
external.desc

@@ -0,0 +1,2 @@
+name: PSG_IOT2000
+desc: PSG iot2000 tools and extensions 

+ 1 - 0
external.mk

@@ -0,0 +1 @@
+include $(sort $(wildcard $(BR2_EXTERNAL_PSG_IOT2000_PATH)/package/*/*.mk))

+ 8 - 0
package/adc1x8s102/Config.in

@@ -0,0 +1,8 @@
+config BR2_PACKAGE_ADC1X8S102
+	bool "adc1x8s102"
+	default y
+	help
+		"adc1x8s102 component.config BR2_PACKAGE_ADC1X8S10
+		devicedriver for iot200 adc1x8s102
+		---
+

+ 8 - 0
package/adc1x8s102/adc1x8s102.mk

@@ -0,0 +1,8 @@
+ADC1X8S102_VERSION = 1.0.0
+ADC1X8S102_SITE = ../PSG/package/adc1x8s102/src
+ADC1X8S102_SITE_METHOD = local
+ADC1X8S102_LICENSE = GPL-2.0
+ADC1X8S102_LICENSE_FILES = COPYING
+
+$(eval $(kernel-module))
+$(eval $(generic-package))

+ 340 - 0
package/adc1x8s102/src/COPYING

@@ -0,0 +1,340 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                       51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    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., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.

+ 14 - 0
package/adc1x8s102/src/Makefile

@@ -0,0 +1,14 @@
+obj-m := adc1x8s102.o
+
+SRC := $(shell pwd)
+
+all:
+	$(MAKE) -C $(KERNEL_SRC) M=$(SRC)
+
+modules_install:
+	$(MAKE) -C $(KERNEL_SRC) M=$(SRC) modules_install
+
+clean:
+	rm -f *.o *~ core .depend .*.cmd *.ko *.mod.c
+	rm -f Module.markers Module.symvers modules.order
+	rm -rf .tmp_versions Modules.symvers

+ 438 - 0
package/adc1x8s102/src/adc1x8s102.c

@@ -0,0 +1,438 @@
+/*
+ * ADC1x8S102 SPI ADC driver
+ *
+ * Copyright(c) 2013-2015 Intel Corporation.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ *
+ * This IIO device driver is is designed to work with the following
+ * analog to digital converters from Texas Instruments:
+ *  ADC108S102
+ *  ADC128S102
+ * The communication with ADC chip is via the SPI bus (mode 3).
+ */
+
+
+#include <linux/iio/iio.h>
+#include <linux/iio/buffer.h>
+#include <linux/iio/types.h>
+#include <linux/iio/triggered_buffer.h>
+#include <linux/iio/trigger_consumer.h>
+
+#include <linux/interrupt.h>
+#include <linux/module.h>
+#include <linux/spi/spi.h>
+
+/*#include <linux/platform_data/adc1x8s102.h>*/
+#include "adc1x8s102.h"
+#include <linux/regulator/consumer.h>
+
+#include <linux/delay.h>
+#include <linux/acpi.h>
+#include <linux/property.h>
+#include <linux/gpio.h>
+
+#include <linux/spi/pxa2xx_spi.h>
+
+/*
+ * Defining the ADC resolution being 12 bits, we can use the same driver for
+ * both ADC108S102 (10 bits resolution) and ADC128S102 (12 bits resolution)
+ * chips. The ADC108S102 effectively returns a 12-bit result with the 2
+ * least-significant bits unset.
+ */
+#define ADC1x8S102_BITS		12
+#define ADC1x8S102_MAX_CHANNELS	8
+
+/* 16-bit SPI command format:
+ *   [15:14] Ignored
+ *   [13:11] 3-bit channel address
+ *   [10:0]  Ignored
+ */
+#define ADC1x8S102_CMD(ch)		(((ch) << (8)) << (3))
+
+/*
+ * 16-bit SPI response format:
+ *   [15:12] Zeros
+ *   [11:0]  12-bit ADC sample (for ADC108S102, [1:0] will always be 0).
+ */
+#define ADC1x8S102_RES_DATA(res)	(res & ((1 << ADC1x8S102_BITS) - 1))
+
+struct adc1x8s102_state {
+	struct spi_device		*spi;
+	struct regulator		*reg;
+	u16				ext_vin;
+	/* SPI transfer used by triggered buffer handler*/
+	struct spi_transfer		ring_xfer;
+	/* SPI transfer used by direct scan */
+	struct spi_transfer		scan_single_xfer;
+	/* SPI message used by ring_xfer SPI transfer */
+	struct spi_message		ring_msg;
+	/* SPI message used by scan_single_xfer SPI transfer */
+	struct spi_message		scan_single_msg;
+
+	/* SPI message buffers:
+	 *  tx_buf: |C0|C1|C2|C3|C4|C5|C6|C7|XX|
+	 *  rx_buf: |XX|R0|R1|R2|R3|R4|R5|R6|R7|tt|tt|tt|tt|
+	 *
+	 *  tx_buf: 8 channel read commands, plus 1 dummy command
+	 *  rx_buf: 1 dummy response, 8 channel responses, plus 64-bit timestamp
+	 */
+	__be16				rx_buf[13] ____cacheline_aligned;
+	__be16				tx_buf[9];
+
+};
+
+#define ADC1X8S102_V_CHAN(index)					\
+	{								\
+		.type = IIO_VOLTAGE,					\
+		.indexed = 1,						\
+		.channel = index,					\
+		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
+			BIT(IIO_CHAN_INFO_SCALE),		\
+		.address = index,					\
+		.scan_index = index,					\
+		.scan_type = {						\
+			.sign = 'u',					\
+			.realbits = ADC1x8S102_BITS,			\
+			.storagebits = 16,				\
+			.endianness = IIO_BE,				\
+		},							\
+	}
+
+static const struct iio_chan_spec adc1x8s102_channels[] = {
+	ADC1X8S102_V_CHAN(0),
+	ADC1X8S102_V_CHAN(1),
+	ADC1X8S102_V_CHAN(2),
+	ADC1X8S102_V_CHAN(3),
+	ADC1X8S102_V_CHAN(4),
+	ADC1X8S102_V_CHAN(5),
+	ADC1X8S102_V_CHAN(6),
+	ADC1X8S102_V_CHAN(7),
+	IIO_CHAN_SOFT_TIMESTAMP(8),
+};
+
+
+static int adc1x8s102_update_scan_mode(struct iio_dev *indio_dev,
+		unsigned long const *active_scan_mask)
+{
+	struct adc1x8s102_state *st;
+	int i, j;
+
+	st = iio_priv(indio_dev);
+
+	/* Fill in the first x shorts of tx_buf with the number of channels
+	 * enabled for sampling by the triggered buffer
+	 */
+	for (i = 0, j = 0; i < ADC1x8S102_MAX_CHANNELS; i++) {
+		if (test_bit(i, active_scan_mask)) {
+			st->tx_buf[j] = cpu_to_be16(ADC1x8S102_CMD(i));
+			j++;
+		}
+	}
+	/* One dummy command added, to clock in the last response */
+	st->tx_buf[j] = 0x00;
+
+	/* build SPI ring message */
+	st->ring_xfer.tx_buf = &st->tx_buf[0];
+	st->ring_xfer.rx_buf = &st->rx_buf[0];
+	st->ring_xfer.len = (j + 1) * sizeof(__be16);
+
+	spi_message_init(&st->ring_msg);
+	spi_message_add_tail(&st->ring_xfer, &st->ring_msg);
+
+	return 0;
+}
+
+
+static irqreturn_t adc1x8s102_trigger_handler(int irq, void *p)
+{
+	struct iio_poll_func *pf = p;
+	struct iio_dev *indio_dev;
+	struct adc1x8s102_state *st;
+	s64 time_ns = 0;
+	int b_sent;
+
+	indio_dev = pf->indio_dev;
+	st = iio_priv(indio_dev);
+
+	b_sent = spi_sync(st->spi, &st->ring_msg);
+	if (b_sent)
+		goto done;
+	if (indio_dev->scan_timestamp) {
+		time_ns = iio_get_time_ns();
+		memcpy((u8 *)st->rx_buf + st->ring_xfer.len, &time_ns,
+				sizeof(time_ns));
+	}
+
+	/* Skip the dummy response in the first slot */
+	iio_push_to_buffers(indio_dev, (u8 *)&st->rx_buf[1]);
+done:
+	iio_trigger_notify_done(indio_dev->trig);
+
+	return IRQ_HANDLED;
+}
+
+
+/*
+ * returns:
+ * positive (>=0)  value => SUCCESS
+ * negative value => FAILURE
+ */
+static int adc1x8s102_scan_direct(struct adc1x8s102_state *st, unsigned ch)
+{
+	int ret;
+
+	if (ch >= ADC1x8S102_MAX_CHANNELS) {
+		dev_err(&st->spi->dev, "AD channel number too big: %u\n", ch);
+		return -1;
+	}
+
+	st->tx_buf[0] = cpu_to_be16(ADC1x8S102_CMD(ch));
+	ret = spi_sync(st->spi, &st->scan_single_msg);
+	if (ret)
+		return ret;
+
+	/* Skip the dummy response in the first slot */
+	return be16_to_cpu(st->rx_buf[1]);
+}
+
+
+/*
+ * returns:
+ * positive (>=0)  value => SUCCESS
+ * negative value => FAILURE
+ */
+static int adc1x8s102_read_raw(struct iio_dev *indio_dev,
+			   struct iio_chan_spec const *chan,
+			   int *val,
+			   int *val2,
+			   long m)
+{
+	int ret;
+	struct adc1x8s102_state *st;
+
+	st = iio_priv(indio_dev);
+
+	switch (m) {
+	case IIO_CHAN_INFO_RAW:
+		mutex_lock(&indio_dev->mlock);
+		if (indio_dev->currentmode == INDIO_BUFFER_TRIGGERED) {
+			ret = -EBUSY;
+			dev_warn(&st->spi->dev,
+			 "indio_dev->currentmode is INDIO_BUFFER_TRIGGERED\n");
+		} else {
+			ret = adc1x8s102_scan_direct(st, chan->address);
+		}
+		mutex_unlock(&indio_dev->mlock);
+
+		if (ret < 0)
+			return ret;
+		*val = ADC1x8S102_RES_DATA(ret);
+
+		return IIO_VAL_INT;
+	case IIO_CHAN_INFO_SCALE:
+		switch (chan->type) {
+		case IIO_VOLTAGE:
+			if (NULL != st->reg)
+				*val = regulator_get_voltage(st->reg) / 1000;
+			else
+				*val = st->ext_vin;
+
+			*val2 = chan->scan_type.realbits;
+			return IIO_VAL_FRACTIONAL_LOG2;
+		default:
+			dev_warn(&st->spi->dev,
+				 "Invalid channel type %u for channel %d\n",
+				 chan->type, chan->channel);
+			return -EINVAL;
+		}
+	default:
+		dev_warn(&st->spi->dev, "Invalid IIO_CHAN_INFO: %lu\n", m);
+		return -EINVAL;
+	}
+}
+
+
+
+static const struct iio_info adc1x8s102_info = {
+	.read_raw		= &adc1x8s102_read_raw,
+	.update_scan_mode	= &adc1x8s102_update_scan_mode,
+	.driver_module		= THIS_MODULE,
+};
+
+struct adc1x8s102_spi_info {
+	kernel_ulong_t driver_data;
+	void (*setup)(struct spi_device *spi);
+};
+
+static void adc1x8s102_setup_int3495(struct spi_device *spi)
+{
+	/* Galileo Gen 2 SPI setup */
+
+#define ADC1x8S102_GALILEO2_CS 8
+
+	struct pxa2xx_spi_chip *chip_data;
+	chip_data = devm_kzalloc(&spi->dev, sizeof(*chip_data), GFP_KERNEL);
+
+	if (chip_data) {
+		chip_data->gpio_cs = ADC1x8S102_GALILEO2_CS;
+		spi->controller_data = chip_data;
+		dev_info(&spi->dev, "setting GPIO CS value to %d\n", chip_data->gpio_cs);
+		spi_setup(spi);
+	}
+}
+
+static const struct adc1x8s102_spi_info adc1x8s102_info_int3495 = {
+	.driver_data = 0,
+	.setup = adc1x8s102_setup_int3495,
+};
+
+static const struct acpi_device_id adc1x8s102_acpi_ids[] = {
+	{ "INT3495",  (kernel_ulong_t)&adc1x8s102_info_int3495 },
+	{ }
+};
+MODULE_DEVICE_TABLE(acpi, adc1x8s102_acpi_ids);
+
+static int adc1x8s102_probe(struct spi_device *spi)
+{
+	struct adc1x8s102_platform_data *pdata = spi->dev.platform_data;
+	struct adc1x8s102_state *st;
+	struct iio_dev *indio_dev = iio_device_alloc(sizeof(*st));
+	const struct acpi_device_id *id;
+	int ret;
+
+	id = acpi_match_device(adc1x8s102_acpi_ids, &spi->dev);
+
+	if (id) {
+		const struct adc1x8s102_spi_info *info =
+				(struct adc1x8s102_spi_info *)id->driver_data;
+
+		if (!info)
+			return -ENODEV;
+
+		if (info->setup)
+			info->setup(spi);
+	}
+
+	if (NULL == indio_dev) {
+		dev_crit(&spi->dev, "Cannot allocate memory for indio_dev\n");
+		return -ENOMEM;
+	}
+
+	st = iio_priv(indio_dev);
+	if (NULL == pdata) {
+		dev_warn(&spi->dev, "Cannot get adc1x8s102 platform data\n");
+		/* FIXME: make this ACPI-dependent */
+		st->ext_vin = 5000;
+	}
+	else {
+		st->ext_vin = pdata->ext_vin;
+	}
+
+	/* Use regulator, if available. */
+	st->reg = regulator_get(&spi->dev, "vref");
+	if (IS_ERR(st->reg)) {
+		ret = PTR_ERR(st->reg);
+		dev_warn(&spi->dev,
+			 "Cannot get 'vref' regulator\n");
+		goto error_free;
+	}
+	ret = regulator_enable(st->reg);
+	if (ret < 0) {
+		dev_warn(&spi->dev,
+			 "Cannot enable vref regulator\n");
+		goto error_put_reg;
+	}
+
+	spi_set_drvdata(spi, indio_dev);
+	st->spi = spi;
+
+	indio_dev->name = spi->modalias;
+	indio_dev->dev.parent = &spi->dev;
+	indio_dev->modes = INDIO_DIRECT_MODE;
+	indio_dev->channels = adc1x8s102_channels;
+	indio_dev->num_channels = ARRAY_SIZE(adc1x8s102_channels);
+	indio_dev->info = &adc1x8s102_info;
+
+	/* Setup default message */
+	st->scan_single_xfer.tx_buf = st->tx_buf;
+	st->scan_single_xfer.rx_buf = st->rx_buf;
+	st->scan_single_xfer.len = 2 * sizeof(__be16);
+	st->scan_single_xfer.cs_change = 0;
+
+	spi_message_init(&st->scan_single_msg);
+	spi_message_add_tail(&st->scan_single_xfer, &st->scan_single_msg);
+
+	ret = iio_triggered_buffer_setup(indio_dev, NULL,
+			&adc1x8s102_trigger_handler, NULL);
+	if (ret)
+		goto error_disable_reg;
+
+	ret = iio_device_register(indio_dev);
+	if (ret) {
+		dev_err(&spi->dev,
+			"Failed to register IIO device\n");
+		goto error_cleanup_ring;
+	}
+	return 0;
+
+error_cleanup_ring:
+	iio_triggered_buffer_cleanup(indio_dev);
+error_disable_reg:
+	regulator_disable(st->reg);
+error_put_reg:
+	regulator_put(st->reg);
+error_free:
+	iio_device_free(indio_dev);
+
+	return ret;
+}
+
+
+static int adc1x8s102_remove(struct spi_device *spi)
+{
+	struct iio_dev *indio_dev;
+	struct adc1x8s102_state *st;
+
+	indio_dev = spi_get_drvdata(spi);
+	if (NULL == indio_dev) {
+		dev_err(&spi->dev, "Cannot get spi_device drvdata\n");
+		return -EFAULT;
+	}
+
+	st = iio_priv(indio_dev);
+
+	iio_device_unregister(indio_dev);
+
+	iio_triggered_buffer_cleanup(indio_dev);
+
+	regulator_disable(st->reg);
+	regulator_put(st->reg);
+
+	iio_device_free(indio_dev);
+
+	return 0;
+}
+
+
+static struct spi_driver adc1x8s102_driver = {
+	.driver = {
+		.name   = "adc1x8s102",
+		.owner	= THIS_MODULE,
+		.acpi_match_table = ACPI_PTR(adc1x8s102_acpi_ids),
+	},
+	.probe		= adc1x8s102_probe,
+	.remove		= adc1x8s102_remove,
+};
+module_spi_driver(adc1x8s102_driver);
+
+MODULE_AUTHOR("Bogdan Pricop <bogdan.pricop@emutex.com>");
+MODULE_DESCRIPTION("Texas Instruments ADC1x8S102 driver");
+MODULE_LICENSE("GPL v2");

+ 30 - 0
package/adc1x8s102/src/adc1x8s102.h

@@ -0,0 +1,30 @@
+/*
+ * ADC1x8S102 SPI ADC driver
+ *
+ * Copyright(c) 2013 Intel Corporation.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+
+
+#ifndef __LINUX_PLATFORM_DATA_ADC1x8S102_H__
+#define __LINUX_PLATFORM_DATA_ADC1x8S102_H__
+
+
+/**
+ * struct adc1x8s102_platform_data - Platform data for the adc1x8s102 ADC driver
+ * @ext_vin: External input voltage range for all voltage input channels
+ *	This is the voltage level of pin VA in millivolts
+ **/
+struct adc1x8s102_platform_data {
+	u16  ext_vin;
+};
+
+#endif /* __LINUX_PLATFORM_DATA_ADC1x8S102_H__ */

+ 8 - 0
package/galileo-spi1-spidev/Config.in

@@ -0,0 +1,8 @@
+config BR2_PACKAGE_GALILEO_SPI1_SPIDEV
+	bool "galileo_spi1_spidev"
+	default y
+	help
+		galileo_spi1_spidev component.config BR2_PACKAGE_GALILEO_SPI1_SPIDEV
+		devicedriver for iot200 spidev
+		---
+

+ 8 - 0
package/galileo-spi1-spidev/galileo-spi1-spidev.mk

@@ -0,0 +1,8 @@
+GALILEO_SPI1_SPIDEV_VERSION = 1.0.0
+GALILEO_SPI1_SPIDEV_SITE = ../PSG/package/galileo-spi1-spidev/src
+GALILEO_SPI1_SPIDEV_SITE_METHOD = local
+GALILEO_SPI1_SPIDEV_LICENSE = GPL-2.0
+GALILEO_SPI1_SPIDEV_LICENSE_FILES = COPYING
+
+$(eval $(kernel-module))
+$(eval $(generic-package))

+ 340 - 0
package/galileo-spi1-spidev/src/COPYING

@@ -0,0 +1,340 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                       51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    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., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.

+ 14 - 0
package/galileo-spi1-spidev/src/Makefile

@@ -0,0 +1,14 @@
+obj-m := galileo-spi1-spidev.o
+
+SRC := $(shell pwd)
+
+all:
+	$(MAKE) -C $(KERNEL_SRC) M=$(SRC)
+
+modules_install:
+	$(MAKE) -C $(KERNEL_SRC) M=$(SRC) modules_install
+
+clean:
+	rm -f *.o *~ core .depend .*.cmd *.ko *.mod.c
+	rm -f Module.markers Module.symvers modules.order
+	rm -rf .tmp_versions Modules.symvers

+ 72 - 0
package/galileo-spi1-spidev/src/galileo-spi1-spidev.c

@@ -0,0 +1,72 @@
+/*
+ * Register spidev userspace driver with SPI channel 1
+ *
+ * Copyright (c) Siemens AG, 2016
+ *
+ * Authors:
+ *  Jan Kiszka <jan.kiszka@siemens.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2.  See
+ * the COPYING file in the top-level directory.
+ */
+
+#include <linux/module.h>
+#include <linux/spi/pxa2xx_spi.h>
+#include <linux/spi/spi.h>
+
+static struct spi_device *spi_device;
+
+/* Option to allow GPIO 10 to be used for SPI1 chip-select */
+static int gpio_cs;
+
+module_param(gpio_cs, int, S_IRUGO | S_IWUSR);
+MODULE_PARM_DESC(gpio_cs, "Enable GPIO chip-select for SPI channel 1");
+
+static struct pxa2xx_spi_chip qrk_ffrd_spi_1_cs_0 = {
+	.gpio_cs = 10,
+};
+
+static struct spi_board_info spi1_dev_gpiocs = {
+	.modalias = "spidev",
+	.chip_select = 0,
+	.controller_data = &qrk_ffrd_spi_1_cs_0,
+	.max_speed_hz = 50000000,
+	.bus_num = 169,
+};
+
+static struct spi_board_info spi1_dev = {
+	.modalias = "spidev",
+	.chip_select = 0,
+	.controller_data = NULL,
+	.max_speed_hz = 50000000,
+	.bus_num = 169,
+};
+
+int init_module(void)
+{
+	struct spi_board_info *info;
+	struct spi_master *master;
+
+	if (gpio_cs)
+		info = &spi1_dev_gpiocs;
+	else
+		info = &spi1_dev;
+
+	master = spi_busnum_to_master(info->bus_num);
+	if (!master)
+		return -EINVAL;
+
+	spi_device = spi_new_device(master, info);
+	put_device(&master->dev);
+	if (!spi_device)
+		return -EPERM;
+
+	return 0;
+}
+
+void cleanup_module(void)
+{
+	spi_unregister_device(spi_device);
+}
+
+MODULE_LICENSE("GPL");

+ 8 - 0
package/galileo-uio-gpio/Config.in

@@ -0,0 +1,8 @@
+config BR2_PACKAGE_GALILEO_UIO_GPIO
+	bool "galileo_uio_gpio"
+	default y
+	help
+		galileo_uio_gpio component.config BR2_PACKAGE_GALILEO_UIO_GPIO
+		devicedriver for iot200 uio gpio
+		---
+

+ 8 - 0
package/galileo-uio-gpio/galileo-uio-gpio.mk

@@ -0,0 +1,8 @@
+GALILEO_UIO_GPIO_VERSION = 1.0.0
+GALILEO_UIO_GPIO_SITE = ../PSG/package/galileo-uio-gpio/src
+GALILEO_UIO_GPIO_SITE_METHOD = local
+GALILEO_UIO_GPIO_LICENSE = GPL-2.0
+GALILEO_UIO_GPIO_LICENSE_FILES = COPYING
+
+$(eval $(kernel-module))
+$(eval $(generic-package))

+ 340 - 0
package/galileo-uio-gpio/src/COPYING

@@ -0,0 +1,340 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                       51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    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., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.

+ 14 - 0
package/galileo-uio-gpio/src/Makefile

@@ -0,0 +1,14 @@
+obj-m := galileo-uio-gpio.o
+
+SRC := $(shell pwd)
+
+all:
+	$(MAKE) -C $(KERNEL_SRC) M=$(SRC)
+
+modules_install:
+	$(MAKE) -C $(KERNEL_SRC) M=$(SRC) modules_install
+
+clean:
+	rm -f *.o *~ core .depend .*.cmd *.ko *.mod.c
+	rm -f Module.markers Module.symvers modules.order
+	rm -rf .tmp_versions Modules.symvers

+ 108 - 0
package/galileo-uio-gpio/src/galileo-uio-gpio.c

@@ -0,0 +1,108 @@
+/*
+ * Don't try this at home...
+ *
+ * Copyright (c) Siemens AG, 2016
+ *
+ * Authors:
+ *  Jan Kiszka <jan.kiszka@siemens.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2.  See
+ * the COPYING file in the top-level directory.
+ *
+ * Derived from drivers/mfd/intel_qrk_gip_gpio.c of meta-intel-galileo
+ */
+
+#include <linux/module.h>
+#include <linux/pci.h>
+#include <linux/uio_driver.h>
+
+#define GIP_GPIO_BAR		1
+
+#define SCH_GPIOBASE		0x44
+#define SCH_GPIO_IO_SIZE	64
+
+static struct pci_dev *gip_dev;
+static struct pci_dev *sch_dev;
+static struct uio_info uio_gip;
+static struct uio_info uio_sch;
+static void __iomem *gip_reg_base;
+
+int init_module(void)
+{
+	resource_size_t start, len;
+	unsigned int base_addr_cfg;
+	int err;
+
+	gip_dev = pci_get_device(PCI_VENDOR_ID_INTEL, 0x0934, NULL);
+	if (!gip_dev)
+		return -ENODEV;
+
+	start = pci_resource_start(gip_dev, GIP_GPIO_BAR);
+	len = pci_resource_len(gip_dev, GIP_GPIO_BAR);
+
+	gip_reg_base = ioremap_nocache(start, len);
+	if (!gip_reg_base) {
+		err = -EFAULT;
+		goto err_gip_devput;
+	}
+
+	uio_gip.mem[0].addr = start;
+	uio_gip.mem[0].internal_addr = gip_reg_base;
+	uio_gip.mem[0].size = len;
+	uio_gip.mem[0].memtype = UIO_MEM_PHYS;
+	uio_gip.mem[0].name = "gpio_regs";
+	uio_gip.name = "gpio uio";
+	uio_gip.version = "0.0.1";
+
+	err = uio_register_device(&gip_dev->dev, &uio_gip);
+	if (err)
+		goto err_gip_unmap;
+
+	sch_dev = pci_get_device(PCI_VENDOR_ID_INTEL,
+				 PCI_DEVICE_ID_INTEL_QUARK_X1000_ILB, NULL);
+	if (!sch_dev) {
+		err = -ENODEV;
+		goto err_gip_unregister;
+	}
+
+	pci_read_config_dword(sch_dev, SCH_GPIOBASE, &base_addr_cfg);
+	if (!(base_addr_cfg & (1 << 31))) {
+		err = -EIO;
+		goto err_sch_devput;
+	}
+
+	uio_sch.port[0].start = (unsigned short)base_addr_cfg;
+	uio_sch.port[0].size = SCH_GPIO_IO_SIZE;
+	uio_sch.port[0].porttype = UIO_PORT_X86;
+	uio_sch.port[0].name = "gpio_regs";
+	uio_sch.name = "sch_gpio";
+	uio_sch.version = "0.0.1";
+
+	err = uio_register_device(&sch_dev->dev, &uio_sch);
+	if (err)
+		goto err_sch_devput;
+
+	return 0;
+
+err_sch_devput:
+	pci_dev_put(gip_dev);
+err_gip_unregister:
+	uio_unregister_device(&uio_gip);
+err_gip_unmap:
+	iounmap(gip_reg_base);
+err_gip_devput:
+	pci_dev_put(gip_dev);
+	return err;
+}
+
+void cleanup_module(void)
+{
+	uio_unregister_device(&uio_sch);
+	pci_dev_put(sch_dev);
+
+	uio_unregister_device(&uio_gip);
+	iounmap(gip_reg_base);
+	pci_dev_put(gip_dev);
+}
+
+MODULE_LICENSE("GPL");

+ 8 - 0
package/galileogen2-fake/Config.in

@@ -0,0 +1,8 @@
+config BR2_PACKAGE_GALILEOGEN2_FAKE
+	bool "galileogen2_fake"
+	default y
+	help
+		galileogen2_fake component.config BR2_PACKAGE_GALILEOGEN2_FAKE
+		devicedriver for iot200 galileogen2 fake
+		---
+

+ 8 - 0
package/galileogen2-fake/galileogen2-fake.mk

@@ -0,0 +1,8 @@
+GALILEOGEN2_FAKE_VERSION = 1.0.0
+GALILEOGEN2_FAKE_SITE = ../PSG/package/galileogen2-fake/src
+GALILEOGEN2_FAKE_SITE_METHOD = local
+GALILEOGEN2_FAKE_LICENSE = GPL-2.0
+GALILEOGEN2_FAKE_LICENSE_FILES = COPYING
+
+$(eval $(kernel-module))
+$(eval $(generic-package))

+ 340 - 0
package/galileogen2-fake/src/COPYING

@@ -0,0 +1,340 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                       51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    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., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.

+ 14 - 0
package/galileogen2-fake/src/Makefile

@@ -0,0 +1,14 @@
+obj-m := galileogen2-fake.o
+
+SRC := $(shell pwd)
+
+all:
+	$(MAKE) -C $(KERNEL_SRC) M=$(SRC)
+
+modules_install:
+	$(MAKE) -C $(KERNEL_SRC) M=$(SRC) modules_install
+
+clean:
+	rm -f *.o *~ core .depend .*.cmd *.ko *.mod.c
+	rm -f Module.markers Module.symvers modules.order
+	rm -rf .tmp_versions Modules.symvers

+ 47 - 0
package/galileogen2-fake/src/galileogen2-fake.c

@@ -0,0 +1,47 @@
+/*
+ * Don't ask...
+ *
+ * Copyright (c) Siemens AG, 2016
+ *
+ * Authors:
+ *  Jan Kiszka <jan.kiszka@siemens.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2.  See
+ * the COPYING file in the top-level directory.
+ */
+
+#include <linux/module.h>
+#include <linux/platform_device.h>
+
+#define PLATFORM_NAME	"GalileoGen2"
+
+static struct platform_device *pd;
+
+static struct platform_driver galileo_platform_driver = {
+	.driver		= {
+		.name	= PLATFORM_NAME,
+	},
+};
+
+int init_module(void)
+{
+	int err;
+
+	err = platform_driver_register(&galileo_platform_driver);
+
+	pd = platform_device_register_simple(PLATFORM_NAME, -1, NULL, 0);
+	if (IS_ERR(pd)) {
+		platform_driver_unregister(&galileo_platform_driver);
+		return PTR_ERR(pd);
+	}
+
+	return 0;
+}
+
+void cleanup_module(void)
+{
+	platform_device_unregister(pd);
+	platform_driver_unregister(&galileo_platform_driver);
+}
+
+MODULE_LICENSE("GPL");

+ 6 - 0
package/switchserialmode/Config.in

@@ -0,0 +1,6 @@
+config BR2_PACKAGE_SWITCHSERIALMODE
+	bool "switchserialmode"
+	default y
+	help
+		switchserialmode component.config BR2_PACKAGE_SWITCHSERIALMODE
+

+ 17 - 0
package/switchserialmode/src/Makefile

@@ -0,0 +1,17 @@
+rcdir = .   
+# Change these if necessary
+CC = $(CROSS_COMPILE)gcc 
+CPP = $(CROSS_COMPILE)gcc -E
+
+LIBS = 
+#------ Destination für BistroBox Ablaufdateien
+all: switchserialmode
+
+switchserialmode: switchserialmode.o
+	$(CC) -o $@ $(CFLAGS) switchserialmode.o $(LDFLAGS) $(LIBS)
+        
+switchserialmode.o: switchserialmode.c
+	$(CC)  $(CFLAGS) -c $*.c
+
+clean:
+	rm -f $(OBJS) switchserialmode core *.gdb *.o *~

+ 144 - 0
package/switchserialmode/src/switchserialmode.c

@@ -0,0 +1,144 @@
+/*
+ * Copyright (c) Siemens AG, 2017
+ *
+ * Authors:
+ *  Sascha Weisenberger <sascha.weisenberger@siemens.com>
+ *  Jan Kiszka <jan.kiszka@siemens.com>
+ *
+ * This file is subject to the terms and conditions of the MIT License.  See
+ * COPYING.MIT file in the top-level directory.
+ */
+
+#include <linux/serial.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+
+#ifndef SER_RS485_TERMINATE_BUS
+#define SER_RS485_TERMINATE_BUS		(1 << 5)
+#endif
+
+static void print_usage(char *name)
+{
+	printf("Usage: %s DEVICE [MODE [-t|--terminate]]\n"
+	       "\n"
+	       "DEVICE\t\tThe device for which you want to switch the mode.\n"
+	       "MODE\t\tThe mode you want to use: rs232, rs485, or rs422.\n"
+	       "\t\tIf omitted, the current mode will be printed.\n"
+	       "\n"
+	       "Optional arguments:\n"
+	       " -t, --terminate\tTerminate the RS422 or RS485 bus.\n"
+	       "\n"
+	       "Example: %s /dev/ttyS2 rs485 --terminate\n", name, name);
+}
+
+static void print_mode(struct serial_rs485 *rs485conf)
+{
+	const char *mode, *terminate;
+
+	if (!(rs485conf->flags & SER_RS485_ENABLED)) {
+		mode = "RS232";
+		terminate = "";
+	} else {
+		if (rs485conf->flags & SER_RS485_RX_DURING_TX)
+			mode = "RS422";
+		else
+			mode = "RS485";
+		if (rs485conf->flags & SER_RS485_TERMINATE_BUS)
+			terminate = ", terminating";
+		else
+			terminate = ", non-terminating";
+	}
+
+	printf("%s%s\n", mode, terminate);
+}
+
+static int get_mode(int file, char *device)
+{
+	struct serial_rs485 rs485conf;
+
+	if (ioctl(file, TIOCGRS485, &rs485conf) < 0) {
+		perror("Error");
+		return 1;
+	}
+
+	printf("Mode of %s: ", device);
+	print_mode(&rs485conf);
+
+	return 0;
+}
+
+static int set_mode(int file, char *device, char *mode, char *option)
+{
+	struct serial_rs485 rs485conf;
+
+	rs485conf.flags = 0;
+
+	if (strcasecmp("rs485", mode) == 0) {
+		rs485conf.flags |= SER_RS485_ENABLED;
+	} else if (strcasecmp("rs422", mode) == 0) {
+		rs485conf.flags |= SER_RS485_ENABLED | SER_RS485_RX_DURING_TX;
+	} else if (strcasecmp("rs232", mode) != 0) {
+		fprintf(stderr, "Invalid mode \"%s\"\n", mode);
+		return 2;
+	}
+
+	if (option) {
+		if (strcmp(option, "-t") == 0 ||
+		    strcmp(option, "--terminate") == 0) {
+			if (!(rs485conf.flags & SER_RS485_ENABLED)) {
+				fprintf(stderr,
+					"Termination not supported in RS232 "
+					"mode\n");
+				return 2;
+			}
+			rs485conf.flags |= SER_RS485_TERMINATE_BUS;
+		} else {
+			fprintf(stderr, "Invalid option \"%s\"\n", option);
+			return 2;
+		}
+	}
+
+	if (ioctl(file, TIOCSRS485, &rs485conf) < 0) {
+		perror("Error");
+		return 1;
+	}
+
+	printf("Successfully set %s to ", device);
+	print_mode(&rs485conf);
+
+	return 0;
+}
+
+int main(int argc, char *argv[])
+{
+	int file, ret;
+
+	if (argc < 2 || argc > 4) {
+		print_usage(argv[0]);
+		return 2;
+	}
+	if (!strcmp(argv[1], "--help")) {
+		print_usage(argv[0]);
+		return 0;
+	}
+
+	file = open(argv[1], O_RDWR);
+	if (file < 0) {
+		perror("Error");
+		return 1;
+	}
+
+	if (argc == 2)
+		ret = get_mode(file, argv[1]);
+	else
+		ret = set_mode(file, argv[1], argv[2], argv[3]);
+
+	close(file);
+
+	return ret;
+}

+ 18 - 0
package/switchserialmode/switchserialmode.mk

@@ -0,0 +1,18 @@
+SWITCHSERIALMODE_VERSION:= 1.0.0
+SWITCHSERIALMODE_SITE:= ../PSG/package/switchserialmode/src
+SWITCHSERIALMODE_SITE_METHOD:=local
+SWITCHSERIALMODE_INSTALL_TARGET:=YES
+
+define SWITCHSERIALMODE_BUILD_CMDS
+	$(MAKE) CC="$(TARGET_CC)" LD="$(TARGET_LD)" -C $(@D) all
+endef
+
+define SWITCHSERIALMODE_INSTALL_TARGET_CMDS
+	$(INSTALL) -D -m 0755 $(@D)/switchserialmode $(TARGET_DIR)/usr/bin
+endef
+
+define SWITCHSERIALMODE_PERMISSIONS
+	/usr/bin/switchserialmode f 4755 0 0 - - - - - 
+endef
+
+$(eval $(generic-package))

+ 21 - 0
package/wt/Config.in

@@ -0,0 +1,21 @@
+config BR2_PACKAGE_WT
+	bool "wt"
+	help
+		Wt is a C++ library for developing web applications. It consists of:
+
+		- libwt, a widget/rendering library
+		- libwthttp, an (async I/O) HTTP/WebSockets server
+		- libwtfcgi, a FastCGI connector library (Unix)
+		- libwtisapi, an ISAPI connector library (Windows)
+		- libwttest, a test connector environment
+
+		It also contains a C++ ORM, which can be used in a web application
+		(obviously), but can also be used on its own:
+
+		- libwtdbo, a C++ ORM
+		- libwtdbopostgres, PostgreSQL backend
+		- libwtdbosqlite3, Sqlite3 backend
+		- libwtdbofirebird, Firebird backend
+
+		For more information, see [the homepage](http://www.webtoolkit.eu/wt
+		"Wt homepage").

+ 18 - 0
package/wt/wt.mk

@@ -0,0 +1,18 @@
+################################################################################
+#
+# wt
+#
+################################################################################
+
+WT_VERSION = 4.0.0
+WT_SOURCE = $(WT_VERSION).tar.gz 
+WT_SITE = https://github.com/kdeforche/wt/archive
+WT_INSTALL_STAGING = YES
+WT_INSTALL_TARGET = YES
+##WT_CONF_OPTS = 
+##WT_DEPENDENCIES = 
+
+WT_LICENSE = LGPLv2
+WT_LICENSE_FILES = LICENSE
+
+$(eval $(cmake-package))