Merge branch 'dev' into main
|
@ -69,3 +69,10 @@ Like any Linux distribution, this project is not the work of one person. It is
|
|||
* ```smbpasswd root```
|
||||
* Alternatively, copy your ssh key with ssh-copy-id, and leave rotation enabled.
|
||||
* ```ssh-copy-id root@jelos```
|
||||
* I want to add games to SD Card 1 and see them in my EmulationStation games list.
|
||||
* A custom facility has been added to JELOS to enable things such as this, to use it add a script to /storage/.config/autostart to create a bind mount and add your games to the directory on your primary SD card. They will appear in ES after a restart of the ES service or a reboot. To create a bind mount, use the example below, changing as necessary.
|
||||
* This example uses file name 001-bind.
|
||||
* ```#!/bin/bash```
|
||||
* ```mkdir -p /storage/roms/c64 /storage/c64 2>&1 >/dev/null```
|
||||
* ```mount --bind /storage/roms/c64 /storage/c64```
|
||||
* Make it executable with chmod. ```chmod 0755 /storage/.config/autostart/001-bind```
|
||||
|
|
Before Width: | Height: | Size: 31 KiB |
Before Width: | Height: | Size: 30 KiB |
Before Width: | Height: | Size: 36 KiB |
Before Width: | Height: | Size: 31 KiB |
Before Width: | Height: | Size: 32 KiB |
Before Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 16 KiB |
|
@ -24,6 +24,16 @@ do
|
|||
${script} 2>&1 >>${BOOTLOG}
|
||||
done
|
||||
|
||||
### Run custom start scripts
|
||||
if [ -d "/storage/.config/autostart" ]
|
||||
then
|
||||
for script in /storage/.config/autostart/*
|
||||
do
|
||||
echo "Executing ${script}" 2>&1 >>${BOOTLOG}
|
||||
${script} 2>&1 >>${BOOTLOG}
|
||||
done
|
||||
fi
|
||||
|
||||
normperf 2>&1 >>${BOOTLOG}
|
||||
|
||||
clear >/dev/console
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#!/bin/bash
|
||||
|
||||
source /etc/os-release
|
||||
source /etc/profile
|
||||
|
||||
### short version (for osd)
|
||||
if test "$1" = "--short"
|
||||
|
@ -98,6 +98,17 @@ if test -n "${TEMPE}"
|
|||
then
|
||||
echo "CPU TEMPERATURE: ${TEMPE}°"
|
||||
fi
|
||||
if [ "${DEVICE_HAS_FAN}" = "true" ]
|
||||
then
|
||||
FANSPEED=$(cat ${DEVICE_PWM_FAN})
|
||||
if [ "${FANSPEED}" = "0" ]
|
||||
then
|
||||
FANSPEED="OFF"
|
||||
else
|
||||
FANSPEED="${FANSPEED} RPM"
|
||||
fi
|
||||
echo "CPU FAN: ${FANSPEED}"
|
||||
fi
|
||||
for C in "${CF[@]}"
|
||||
do
|
||||
echo ${C}
|
||||
|
|
|
@ -1,148 +1,213 @@
|
|||
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||
# Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv)
|
||||
# Copyright (C) 2017-2018 Team LibreELEC (https://libreelec.tv)
|
||||
# Copyright (C) 2018-present Team CoreELEC (https://coreelec.org)
|
||||
# Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="linux_org"
|
||||
PKG_NAME="linux"
|
||||
PKG_LICENSE="GPL"
|
||||
PKG_SITE="http://www.kernel.org"
|
||||
PKG_DEPENDS_HOST="ccache:host openssl:host"
|
||||
PKG_DEPENDS_TARGET="toolchain linux:host cpio:host kmod:host xz:host wireless-regdb keyutils $KERNEL_EXTRA_DEPENDS_TARGET"
|
||||
PKG_DEPENDS_INIT="toolchain"
|
||||
PKG_NEED_UNPACK="$LINUX_DEPENDS $(get_pkg_directory busybox) $PROJECT_DIR/$PROJECT/initramfs"
|
||||
PKG_DEPENDS_HOST="ccache:host rsync:host openssl:host"
|
||||
PKG_DEPENDS_TARGET="toolchain linux:host kmod:host xz:host keyutils ${KERNEL_EXTRA_DEPENDS_TARGET}"
|
||||
PKG_NEED_UNPACK="${LINUX_DEPENDS} $(get_pkg_directory initramfs) $(get_pkg_variable initramfs PKG_NEED_UNPACK)"
|
||||
PKG_LONGDESC="This package contains a precompiled kernel image and the modules."
|
||||
PKG_IS_KERNEL_PKG="yes"
|
||||
PKG_STAMP="$KERNEL_TARGET $KERNEL_MAKE_EXTRACMD $KERNEL_UBOOT_EXTRA_TARGET"
|
||||
PKG_STAMP="${KERNEL_TARGET} ${KERNEL_MAKE_EXTRACMD}"
|
||||
|
||||
PKG_VERSION="5.10.10"
|
||||
#PKG_SHA256=""
|
||||
PKG_URL="https://www.kernel.org/pub/linux/kernel/v5.x/$PKG_NAME-$PKG_VERSION.tar.xz"
|
||||
PKG_PATCH_DIRS="${LINUX}"
|
||||
|
||||
case "${LINUX}" in
|
||||
amlogic)
|
||||
PKG_VERSION="df0cc57e057f18e44dac8e6c18aba47ab53202f9" # 5.16.0
|
||||
PKG_SHA256="17f180ef85871ca76e1867f9f90bcdb7f98c45ddd9d15d55cc7a13a51fc83167"
|
||||
PKG_URL="https://github.com/torvalds/linux/archive/${PKG_VERSION}.tar.gz"
|
||||
PKG_SOURCE_NAME="linux-${LINUX}-${PKG_VERSION}.tar.gz"
|
||||
;;
|
||||
raspberrypi)
|
||||
PKG_VERSION="de68bc48c867d703344f3a1b2362b889e20e03f3" # 5.15.18
|
||||
PKG_SHA256="4d4be0374eab0f3e7bdbba363f183ec82cf7439d5c8f9f035ff486f7182cb371"
|
||||
PKG_URL="https://github.com/raspberrypi/linux/archive/${PKG_VERSION}.tar.gz"
|
||||
PKG_SOURCE_NAME="linux-${LINUX}-${PKG_VERSION}.tar.gz"
|
||||
;;
|
||||
*)
|
||||
PKG_VERSION="5.16.5"
|
||||
PKG_SHA256="ecaeedd9d289934f97c572aa965b6959d4d47f9789220e4fc3fbb525d8f1c7ab"
|
||||
PKG_URL="https://www.kernel.org/pub/linux/kernel/v5.x/${PKG_NAME}-${PKG_VERSION}.tar.xz"
|
||||
PKG_PATCH_DIRS="default"
|
||||
;;
|
||||
esac
|
||||
|
||||
PKG_KERNEL_CFG_FILE=$(kernel_config_path) || die
|
||||
|
||||
if [ -n "$KERNEL_TOOLCHAIN" ]; then
|
||||
PKG_DEPENDS_HOST="$PKG_DEPENDS_HOST gcc-arm-$KERNEL_TOOLCHAIN:host"
|
||||
PKG_DEPENDS_TARGET="$PKG_DEPENDS_TARGET gcc-arm-$KERNEL_TOOLCHAIN:host"
|
||||
HEADERS_ARCH=$TARGET_ARCH
|
||||
if [ -n "${KERNEL_TOOLCHAIN}" ]; then
|
||||
PKG_DEPENDS_HOST+=" gcc-arm-${KERNEL_TOOLCHAIN}:host"
|
||||
PKG_DEPENDS_TARGET+=" gcc-arm-${KERNEL_TOOLCHAIN}:host"
|
||||
HEADERS_ARCH=${TARGET_ARCH}
|
||||
fi
|
||||
|
||||
if [ "$PKG_BUILD_PERF" != "no" ] && grep -q ^CONFIG_PERF_EVENTS= $PKG_KERNEL_CFG_FILE ; then
|
||||
if [ "${PKG_BUILD_PERF}" != "no" ] && grep -q ^CONFIG_PERF_EVENTS= ${PKG_KERNEL_CFG_FILE}; then
|
||||
PKG_BUILD_PERF="yes"
|
||||
PKG_DEPENDS_TARGET="$PKG_DEPENDS_TARGET binutils elfutils libunwind zlib openssl"
|
||||
PKG_DEPENDS_TARGET+=" binutils elfutils libunwind zlib openssl"
|
||||
fi
|
||||
|
||||
if [ "$TARGET_ARCH" = "x86_64" ]; then
|
||||
PKG_DEPENDS_TARGET="$PKG_DEPENDS_TARGET intel-ucode:host kernel-firmware elfutils:host pciutils"
|
||||
if [ "${TARGET_ARCH}" = "x86_64" ]; then
|
||||
PKG_DEPENDS_TARGET+=" elfutils:host pciutils"
|
||||
PKG_DEPENDS_UNPACK+=" intel-ucode kernel-firmware"
|
||||
elif [ "${TARGET_ARCH}" = "arm" -a "${DEVICE}" = "iMX6" ]; then
|
||||
PKG_DEPENDS_UNPACK+=" firmware-imx"
|
||||
fi
|
||||
|
||||
if [[ "$KERNEL_TARGET" = uImage* ]]; then
|
||||
PKG_DEPENDS_TARGET="$PKG_DEPENDS_TARGET u-boot-tools:host"
|
||||
if [[ "${KERNEL_TARGET}" = uImage* ]]; then
|
||||
PKG_DEPENDS_TARGET+=" u-boot-tools:host"
|
||||
fi
|
||||
|
||||
if [ "$BUILD_ANDROID_BOOTIMG" = "yes" ]; then
|
||||
PKG_DEPENDS_TARGET="$PKG_DEPENDS_TARGET mkbootimg:host"
|
||||
fi
|
||||
# Ensure that the dependencies of initramfs:target are built correctly, but
|
||||
# we don't want to add initramfs:target as a direct dependency as we install
|
||||
# this "manually" from within linux:target
|
||||
for pkg in $(get_pkg_variable initramfs PKG_DEPENDS_TARGET); do
|
||||
! listcontains "${PKG_DEPENDS_TARGET}" "${pkg}" && PKG_DEPENDS_TARGET+=" ${pkg}" || true
|
||||
done
|
||||
|
||||
post_patch() {
|
||||
cp $PKG_KERNEL_CFG_FILE $PKG_BUILD/.config
|
||||
# linux was already built and its build dir autoremoved - prepare it again for kernel packages
|
||||
if [ -d ${PKG_INSTALL}/.image ]; then
|
||||
cp -p ${PKG_INSTALL}/.image/.config ${PKG_BUILD}
|
||||
kernel_make -C ${PKG_BUILD} prepare
|
||||
|
||||
# set default hostname based on $DISTRONAME
|
||||
sed -i -e "s|@DISTRONAME@|$DISTRONAME|g" $PKG_BUILD/.config
|
||||
|
||||
# disable swap support if not enabled
|
||||
if [ ! "$SWAP_SUPPORT" = yes ]; then
|
||||
sed -i -e "s|^CONFIG_SWAP=.*$|# CONFIG_SWAP is not set|" $PKG_BUILD/.config
|
||||
fi
|
||||
|
||||
# disable nfs support if not enabled
|
||||
if [ ! "$NFS_SUPPORT" = yes ]; then
|
||||
sed -i -e "s|^CONFIG_NFS_FS=.*$|# CONFIG_NFS_FS is not set|" $PKG_BUILD/.config
|
||||
fi
|
||||
|
||||
# disable cifs support if not enabled
|
||||
if [ ! "$SAMBA_SUPPORT" = yes ]; then
|
||||
sed -i -e "s|^CONFIG_CIFS=.*$|# CONFIG_CIFS is not set|" $PKG_BUILD/.config
|
||||
fi
|
||||
|
||||
# disable iscsi support if not enabled
|
||||
if [ ! "$ISCSI_SUPPORT" = yes ]; then
|
||||
sed -i -e "s|^CONFIG_SCSI_ISCSI_ATTRS=.*$|# CONFIG_SCSI_ISCSI_ATTRS is not set|" $PKG_BUILD/.config
|
||||
sed -i -e "s|^CONFIG_ISCSI_TCP=.*$|# CONFIG_ISCSI_TCP is not set|" $PKG_BUILD/.config
|
||||
sed -i -e "s|^CONFIG_ISCSI_BOOT_SYSFS=.*$|# CONFIG_ISCSI_BOOT_SYSFS is not set|" $PKG_BUILD/.config
|
||||
sed -i -e "s|^CONFIG_ISCSI_IBFT_FIND=.*$|# CONFIG_ISCSI_IBFT_FIND is not set|" $PKG_BUILD/.config
|
||||
sed -i -e "s|^CONFIG_ISCSI_IBFT=.*$|# CONFIG_ISCSI_IBFT is not set|" $PKG_BUILD/.config
|
||||
fi
|
||||
|
||||
# install extra dts files
|
||||
for f in $PROJECT_DIR/$PROJECT/config/*-overlay.dts; do
|
||||
[ -f "$f" ] && cp -v $f $PKG_BUILD/arch/$TARGET_KERNEL_ARCH/boot/dts/overlays || true
|
||||
done
|
||||
if [ -n "$DEVICE" ]; then
|
||||
for f in $PROJECT_DIR/$PROJECT/devices/$DEVICE/config/*-overlay.dts; do
|
||||
[ -f "$f" ] && cp -v $f $PKG_BUILD/arch/$TARGET_KERNEL_ARCH/boot/dts/overlays || true
|
||||
done
|
||||
# restore the required Module.symvers from an earlier build
|
||||
cp -p ${PKG_INSTALL}/.image/Module.symvers ${PKG_BUILD}
|
||||
fi
|
||||
}
|
||||
|
||||
make_host() {
|
||||
make \
|
||||
ARCH=${HEADERS_ARCH:-$TARGET_KERNEL_ARCH} \
|
||||
HOSTCC="$TOOLCHAIN/bin/host-gcc" \
|
||||
HOSTCXX="$TOOLCHAIN/bin/host-g++" \
|
||||
HOSTCFLAGS="$HOST_CFLAGS" \
|
||||
HOSTCXXFLAGS="$HOST_CXXFLAGS" \
|
||||
HOSTLDFLAGS="$HOST_LDFLAGS" \
|
||||
headers_check
|
||||
:
|
||||
}
|
||||
|
||||
makeinstall_host() {
|
||||
make \
|
||||
ARCH=${HEADERS_ARCH:-$TARGET_KERNEL_ARCH} \
|
||||
HOSTCC="$TOOLCHAIN/bin/host-gcc" \
|
||||
HOSTCXX="$TOOLCHAIN/bin/host-g++" \
|
||||
HOSTCFLAGS="$HOST_CFLAGS" \
|
||||
HOSTCXXFLAGS="$HOST_CXXFLAGS" \
|
||||
HOSTLDFLAGS="$HOST_LDFLAGS" \
|
||||
ARCH=${HEADERS_ARCH:-${TARGET_KERNEL_ARCH}} \
|
||||
HOSTCC="${TOOLCHAIN}/bin/host-gcc" \
|
||||
HOSTCXX="${TOOLCHAIN}/bin/host-g++" \
|
||||
HOSTCFLAGS="${HOST_CFLAGS}" \
|
||||
HOSTCXXFLAGS="${HOST_CXXFLAGS}" \
|
||||
HOSTLDFLAGS="${HOST_LDFLAGS}" \
|
||||
INSTALL_HDR_PATH=dest \
|
||||
headers_install
|
||||
mkdir -p $SYSROOT_PREFIX/usr/include
|
||||
cp -R dest/include/* $SYSROOT_PREFIX/usr/include
|
||||
mkdir -p ${SYSROOT_PREFIX}/usr/include
|
||||
cp -R dest/include/* ${SYSROOT_PREFIX}/usr/include
|
||||
}
|
||||
|
||||
pre_make_target() {
|
||||
if [ "$TARGET_ARCH" = "x86_64" ]; then
|
||||
( cd ${ROOT}
|
||||
rm -rf ${BUILD}/initramfs
|
||||
rm -f ${STAMPS_INSTALL}/initramfs/install_target ${STAMPS_INSTALL}/*/install_init
|
||||
${SCRIPTS}/install initramfs
|
||||
)
|
||||
pkg_lock_status "ACTIVE" "linux:target" "build"
|
||||
|
||||
cp ${PKG_KERNEL_CFG_FILE} ${PKG_BUILD}/.config
|
||||
|
||||
# set initramfs source
|
||||
${PKG_BUILD}/scripts/config --set-str CONFIG_INITRAMFS_SOURCE "$(kernel_initramfs_confs) ${BUILD}/initramfs"
|
||||
|
||||
# set default hostname based on ${DISTRONAME}
|
||||
${PKG_BUILD}/scripts/config --set-str CONFIG_DEFAULT_HOSTNAME "${DISTRONAME}"
|
||||
|
||||
# disable swap support if not enabled
|
||||
if [ ! "${SWAP_SUPPORT}" = yes ]; then
|
||||
${PKG_BUILD}/scripts/config --disable CONFIG_SWAP
|
||||
fi
|
||||
|
||||
# disable nfs support if not enabled
|
||||
if [ ! "${NFS_SUPPORT}" = yes ]; then
|
||||
${PKG_BUILD}/scripts/config --disable CONFIG_NFS_FS
|
||||
fi
|
||||
|
||||
# disable cifs support if not enabled
|
||||
if [ ! "${SAMBA_SUPPORT}" = yes ]; then
|
||||
${PKG_BUILD}/scripts/config --disable CONFIG_CIFS
|
||||
fi
|
||||
|
||||
# disable iscsi support if not enabled
|
||||
if [ ! "${ISCSI_SUPPORT}" = yes ]; then
|
||||
${PKG_BUILD}/scripts/config --disable CONFIG_SCSI_ISCSI_ATTRS
|
||||
${PKG_BUILD}/scripts/config --disable CONFIG_ISCSI_TCP
|
||||
${PKG_BUILD}/scripts/config --disable CONFIG_ISCSI_BOOT_SYSFS
|
||||
${PKG_BUILD}/scripts/config --disable CONFIG_ISCSI_IBFT_FIND
|
||||
${PKG_BUILD}/scripts/config --disable CONFIG_ISCSI_IBFT
|
||||
fi
|
||||
|
||||
# disable lima/panfrost if libmali is configured
|
||||
if [ "${OPENGLES}" = "libmali" ]; then
|
||||
${PKG_BUILD}/scripts/config --disable CONFIG_DRM_LIMA
|
||||
${PKG_BUILD}/scripts/config --disable CONFIG_DRM_PANFROST
|
||||
fi
|
||||
|
||||
# disable wireguard support if not enabled
|
||||
if [ ! "${WIREGUARD_SUPPORT}" = yes ]; then
|
||||
${PKG_BUILD}/scripts/config --disable CONFIG_WIREGUARD
|
||||
fi
|
||||
|
||||
if [ "${TARGET_ARCH}" = "x86_64" ]; then
|
||||
# copy some extra firmware to linux tree
|
||||
mkdir -p $PKG_BUILD/external-firmware
|
||||
cp -a $(get_build_dir kernel-firmware)/{amdgpu,amd-ucode,i915,radeon,e100,rtl_nic} $PKG_BUILD/external-firmware
|
||||
mkdir -p ${PKG_BUILD}/external-firmware
|
||||
cp -a $(get_build_dir kernel-firmware)/.copied-firmware/{amdgpu,amd-ucode,i915,radeon,e100,rtl_nic} ${PKG_BUILD}/external-firmware
|
||||
|
||||
cp -a $(get_build_dir intel-ucode)/intel-ucode $PKG_BUILD/external-firmware
|
||||
cp -a $(get_build_dir intel-ucode)/intel-ucode ${PKG_BUILD}/external-firmware
|
||||
|
||||
FW_LIST="$(find $PKG_BUILD/external-firmware \( -type f -o -type l \) \( -iname '*.bin' -o -iname '*.fw' -o -path '*/intel-ucode/*' \) | sed 's|.*external-firmware/||' | sort | xargs)"
|
||||
sed -i "s|CONFIG_EXTRA_FIRMWARE=.*|CONFIG_EXTRA_FIRMWARE=\"${FW_LIST}\"|" $PKG_BUILD/.config
|
||||
FW_LIST="$(find ${PKG_BUILD}/external-firmware \( -type f -o -type l \) \( -iname '*.bin' -o -iname '*.fw' -o -path '*/intel-ucode/*' \) | sed 's|.*external-firmware/||' | sort | xargs)"
|
||||
|
||||
${PKG_BUILD}/scripts/config --set-str CONFIG_EXTRA_FIRMWARE "${FW_LIST}"
|
||||
${PKG_BUILD}/scripts/config --set-str CONFIG_EXTRA_FIRMWARE_DIR "external-firmware"
|
||||
|
||||
elif [ "${TARGET_ARCH}" = "arm" -a "${DEVICE}" = "iMX6" ]; then
|
||||
mkdir -p ${PKG_BUILD}/external-firmware/imx/sdma
|
||||
cp -a $(get_build_dir firmware-imx)/firmware/sdma/*imx6*.bin ${PKG_BUILD}/external-firmware/imx/sdma
|
||||
cp -a $(get_build_dir firmware-imx)/firmware/vpu/*imx6*.bin ${PKG_BUILD}/external-firmware
|
||||
|
||||
FW_LIST="$(find ${PKG_BUILD}/external-firmware -type f | sed 's|.*external-firmware/||' | sort | xargs)"
|
||||
|
||||
${PKG_BUILD}/scripts/config --set-str CONFIG_EXTRA_FIRMWARE "${FW_LIST}"
|
||||
${PKG_BUILD}/scripts/config --set-str CONFIG_EXTRA_FIRMWARE_DIR "external-firmware"
|
||||
fi
|
||||
|
||||
kernel_make oldconfig
|
||||
|
||||
# regdb (backward compatability with pre-4.15 kernels)
|
||||
if grep -q ^CONFIG_CFG80211_INTERNAL_REGDB= $PKG_BUILD/.config ; then
|
||||
cp $(get_build_dir wireless-regdb)/db.txt $PKG_BUILD/net/wireless/db.txt
|
||||
fi
|
||||
if [ -f "${DISTRO_DIR}/${DISTRO}/kernel_options" ]; then
|
||||
while read OPTION; do
|
||||
[ -z "${OPTION}" -o -n "$(echo "${OPTION}" | grep '^#')" ] && continue
|
||||
|
||||
# copy video firmware (kernel won't compile without it)
|
||||
[ "$LINUX" = "amlogic-4.9" ] && cp -PR $(get_build_dir media_modules-aml)/firmware $PKG_BUILD/firmware/video || :
|
||||
if [ "${OPTION##*=}" == "n" -a "$(${PKG_BUILD}/scripts/config --state ${OPTION%%=*})" == "undef" ]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
if [ "$(${PKG_BUILD}/scripts/config --state ${OPTION%%=*})" != "${OPTION##*=}" ]; then
|
||||
MISSING_KERNEL_OPTIONS+="\t${OPTION}\n"
|
||||
fi
|
||||
done < ${DISTRO_DIR}/${DISTRO}/kernel_options
|
||||
|
||||
if [ -n "${MISSING_KERNEL_OPTIONS}" ]; then
|
||||
print_color CLR_WARNING "LINUX: kernel options not correct: \n${MISSING_KERNEL_OPTIONS%%}\nPlease run ./tools/check_kernel_config\n"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
make_target() {
|
||||
kernel_make modules
|
||||
kernel_make INSTALL_MOD_PATH=$INSTALL/$(get_kernel_overlay_dir) modules_install
|
||||
rm -f $INSTALL/$(get_kernel_overlay_dir)/lib/modules/*/build
|
||||
rm -f $INSTALL/$(get_kernel_overlay_dir)/lib/modules/*/source
|
||||
# arm64 target does not support creating uImage.
|
||||
# Build Image first, then wrap it using u-boot's mkimage.
|
||||
if [[ "${TARGET_KERNEL_ARCH}" = "arm64" && "${KERNEL_TARGET}" = uImage* ]]; then
|
||||
if [ -z "${KERNEL_UIMAGE_LOADADDR}" -o -z "${KERNEL_UIMAGE_ENTRYADDR}" ]; then
|
||||
die "ERROR: KERNEL_UIMAGE_LOADADDR and KERNEL_UIMAGE_ENTRYADDR have to be set to build uImage - aborting"
|
||||
fi
|
||||
KERNEL_UIMAGE_TARGET="${KERNEL_TARGET}"
|
||||
KERNEL_TARGET="${KERNEL_TARGET/uImage/Image}"
|
||||
fi
|
||||
|
||||
if [ "$PKG_BUILD_PERF" = "yes" ] ; then
|
||||
DTC_FLAGS=-@ kernel_make ${KERNEL_TARGET} ${KERNEL_MAKE_EXTRACMD} modules
|
||||
|
||||
if [ "${PKG_BUILD_PERF}" = "yes" ]; then
|
||||
( cd tools/perf
|
||||
|
||||
# arch specific perf build args
|
||||
case "$TARGET_ARCH" in
|
||||
case "${TARGET_ARCH}" in
|
||||
x86_64)
|
||||
PERF_BUILD_ARGS="ARCH=x86"
|
||||
;;
|
||||
|
@ -150,7 +215,7 @@ make_target() {
|
|||
PERF_BUILD_ARGS="ARCH=arm64"
|
||||
;;
|
||||
*)
|
||||
PERF_BUILD_ARGS="ARCH=$TARGET_ARCH"
|
||||
PERF_BUILD_ARGS="ARCH=${TARGET_ARCH}"
|
||||
;;
|
||||
esac
|
||||
|
||||
|
@ -163,140 +228,77 @@ make_target() {
|
|||
NO_LIBAUDIT=1 \
|
||||
NO_LZMA=1 \
|
||||
NO_SDT=1 \
|
||||
CROSS_COMPILE="$TARGET_PREFIX" \
|
||||
JOBS="$CONCURRENCY_MAKE_LEVEL" \
|
||||
make $PERF_BUILD_ARGS
|
||||
mkdir -p $INSTALL/usr/bin
|
||||
cp perf $INSTALL/usr/bin
|
||||
CROSS_COMPILE="${TARGET_PREFIX}" \
|
||||
JOBS="${CONCURRENCY_MAKE_LEVEL}" \
|
||||
make ${PERF_BUILD_ARGS}
|
||||
mkdir -p ${INSTALL}/usr/bin
|
||||
cp perf ${INSTALL}/usr/bin
|
||||
)
|
||||
fi
|
||||
|
||||
( cd $ROOT
|
||||
rm -rf $BUILD/initramfs
|
||||
$SCRIPTS/install initramfs
|
||||
)
|
||||
pkg_lock_status "ACTIVE" "linux:target" "build"
|
||||
|
||||
if [ "$BOOTLOADER" = "u-boot" -a -n "$KERNEL_UBOOT_EXTRA_TARGET" ]; then
|
||||
for extra_target in "$KERNEL_UBOOT_EXTRA_TARGET"; do
|
||||
kernel_make $extra_target
|
||||
done
|
||||
fi
|
||||
|
||||
# arm64 target does not support creating uImage.
|
||||
# Build Image first, then wrap it using u-boot's mkimage.
|
||||
if [[ "$TARGET_KERNEL_ARCH" == "arm64" && "$KERNEL_TARGET" == uImage* ]]; then
|
||||
if [ -z "$KERNEL_UIMAGE_LOADADDR" -o -z "$KERNEL_UIMAGE_ENTRYADDR" ]; then
|
||||
die "ERROR: KERNEL_UIMAGE_LOADADDR and KERNEL_UIMAGE_ENTRYADDR have to be set to build uImage - aborting"
|
||||
fi
|
||||
KERNEL_UIMAGE_TARGET="$KERNEL_TARGET"
|
||||
KERNEL_TARGET="${KERNEL_TARGET/uImage/Image}"
|
||||
fi
|
||||
|
||||
# the modules target is required to get a proper Module.symvers
|
||||
# file with symbols from built-in and external modules.
|
||||
# Without that it'll contain only the symbols from the kernel
|
||||
kernel_make $KERNEL_TARGET $KERNEL_MAKE_EXTRACMD modules
|
||||
|
||||
for ce_dtb in arch/$TARGET_KERNEL_ARCH/boot/dts/amlogic/coreelec-*; do
|
||||
if [ -d $ce_dtb ]; then
|
||||
cp $ce_dtb/*.dtb arch/$TARGET_KERNEL_ARCH/boot/dts/amlogic 2>/dev/null
|
||||
fi
|
||||
done
|
||||
|
||||
if [ "$BUILD_ANDROID_BOOTIMG" = "yes" ]; then
|
||||
find_file_path bootloader/mkbootimg && source ${FOUND_PATH}
|
||||
mv -f arch/$TARGET_KERNEL_ARCH/boot/boot.img arch/$TARGET_KERNEL_ARCH/boot/$KERNEL_TARGET
|
||||
fi
|
||||
|
||||
if [ -n "$KERNEL_UIMAGE_TARGET" ] ; then
|
||||
if [ -n "${KERNEL_UIMAGE_TARGET}" ]; then
|
||||
# determine compression used for kernel image
|
||||
KERNEL_UIMAGE_COMP=${KERNEL_UIMAGE_TARGET:7}
|
||||
KERNEL_UIMAGE_COMP=${KERNEL_UIMAGE_COMP:-none}
|
||||
KERNEL_UIMAGE_COMP=$(echo ${KERNEL_UIMAGE_COMP:-none} | sed 's/gz/gzip/; s/bz2/bzip2/')
|
||||
|
||||
# calculate new load address to make kernel Image unpack to memory area after compressed image
|
||||
if [ "$KERNEL_UIMAGE_COMP" != "none" ] ; then
|
||||
COMPRESSED_SIZE=$(stat -t "arch/$TARGET_KERNEL_ARCH/boot/$KERNEL_TARGET" | awk '{print $2}')
|
||||
if [ "${KERNEL_UIMAGE_COMP}" != "none" ]; then
|
||||
COMPRESSED_SIZE=$(stat -t "arch/${TARGET_KERNEL_ARCH}/boot/${KERNEL_TARGET}" | awk '{print $2}')
|
||||
# align to 1 MiB
|
||||
COMPRESSED_SIZE=$(( (($COMPRESSED_SIZE - 1 >> 20) + 1) << 20 ))
|
||||
PKG_KERNEL_UIMAGE_LOADADDR=$(printf '%X' "$(( $KERNEL_UIMAGE_LOADADDR + $COMPRESSED_SIZE ))")
|
||||
PKG_KERNEL_UIMAGE_ENTRYADDR=$(printf '%X' "$(( $KERNEL_UIMAGE_ENTRYADDR + $COMPRESSED_SIZE ))")
|
||||
COMPRESSED_SIZE=$(( ((${COMPRESSED_SIZE} - 1 >> 20) + 1) << 20 ))
|
||||
PKG_KERNEL_UIMAGE_LOADADDR=$(printf '%X' "$(( ${KERNEL_UIMAGE_LOADADDR} + ${COMPRESSED_SIZE} ))")
|
||||
PKG_KERNEL_UIMAGE_ENTRYADDR=$(printf '%X' "$(( ${KERNEL_UIMAGE_ENTRYADDR} + ${COMPRESSED_SIZE} ))")
|
||||
else
|
||||
PKG_KERNEL_UIMAGE_LOADADDR=${KERNEL_UIMAGE_LOADADDR}
|
||||
PKG_KERNEL_UIMAGE_ENTRYADDR=${KERNEL_UIMAGE_ENTRYADDR}
|
||||
fi
|
||||
|
||||
mkimage -A $TARGET_KERNEL_ARCH \
|
||||
mkimage -A ${TARGET_KERNEL_ARCH} \
|
||||
-O linux \
|
||||
-T kernel \
|
||||
-C $KERNEL_UIMAGE_COMP \
|
||||
-a $PKG_KERNEL_UIMAGE_LOADADDR \
|
||||
-e $PKG_KERNEL_UIMAGE_ENTRYADDR \
|
||||
-d arch/$TARGET_KERNEL_ARCH/boot/$KERNEL_TARGET \
|
||||
arch/$TARGET_KERNEL_ARCH/boot/$KERNEL_UIMAGE_TARGET
|
||||
-C ${KERNEL_UIMAGE_COMP} \
|
||||
-a ${PKG_KERNEL_UIMAGE_LOADADDR} \
|
||||
-e ${PKG_KERNEL_UIMAGE_ENTRYADDR} \
|
||||
-d arch/${TARGET_KERNEL_ARCH}/boot/${KERNEL_TARGET} \
|
||||
arch/${TARGET_KERNEL_ARCH}/boot/${KERNEL_UIMAGE_TARGET}
|
||||
|
||||
KERNEL_TARGET="${KERNEL_UIMAGE_TARGET}"
|
||||
fi
|
||||
}
|
||||
|
||||
makeinstall_target() {
|
||||
if [ "$BOOTLOADER" = "u-boot" ]; then
|
||||
mkdir -p $INSTALL/usr/share/bootloader/device_trees
|
||||
if [ -d arch/$TARGET_KERNEL_ARCH/boot/dts/amlogic ]; then
|
||||
cp arch/$TARGET_KERNEL_ARCH/boot/*dtb.img $INSTALL/usr/share/bootloader/ 2>/dev/null || :
|
||||
# [ "$PROJECT" = "Amlogic-ng" ] && cp arch/$TARGET_KERNEL_ARCH/boot/dts/amlogic/*.dtb $INSTALL/usr/share/bootloader/device_trees 2>/dev/null || :
|
||||
# TEMP EMUELEC CHANGE: Remnove GXL dtbs from amlogic-NG
|
||||
if [ "$PROJECT" = "Amlogic-ng" ]; then
|
||||
cp arch/$TARGET_KERNEL_ARCH/boot/dts/amlogic/*.dtb $INSTALL/usr/share/bootloader/device_trees 2>/dev/null || :
|
||||
rm $INSTALL/usr/share/bootloader/device_trees/gxl_*.dtb
|
||||
fi
|
||||
mkdir -p ${INSTALL}/.image
|
||||
cp -p arch/${TARGET_KERNEL_ARCH}/boot/${KERNEL_TARGET} System.map .config Module.symvers ${INSTALL}/.image/
|
||||
|
||||
kernel_make INSTALL_MOD_PATH=${INSTALL}/$(get_kernel_overlay_dir) modules_install
|
||||
rm -f ${INSTALL}/$(get_kernel_overlay_dir)/lib/modules/*/build
|
||||
rm -f ${INSTALL}/$(get_kernel_overlay_dir)/lib/modules/*/source
|
||||
|
||||
if [ "${BOOTLOADER}" = "u-boot" ]; then
|
||||
mkdir -p ${INSTALL}/usr/share/bootloader/device_trees
|
||||
if [ -d arch/${TARGET_KERNEL_ARCH}/boot/dts/amlogic ]; then
|
||||
cp arch/${TARGET_KERNEL_ARCH}/boot/*dtb.img ${INSTALL}/usr/share/bootloader/ 2>/dev/null || :
|
||||
[ "${DEVICE}" = "Amlogic-ng" ] && cp arch/${TARGET_KERNEL_ARCH}/boot/dts/amlogic/*.dtb ${INSTALL}/usr/share/bootloader/device_trees 2>/dev/null || :
|
||||
fi
|
||||
elif [ "$BOOTLOADER" = "bcm2835-bootloader" ]; then
|
||||
mkdir -p $INSTALL/usr/share/bootloader/overlays
|
||||
elif [ "${BOOTLOADER}" = "bcm2835-bootloader" ]; then
|
||||
mkdir -p ${INSTALL}/usr/share/bootloader/overlays
|
||||
|
||||
# install platform dtbs, but remove upstream kernel dtbs (i.e. without downstream
|
||||
# drivers and decent USB support) as these are not required by LibreELEC
|
||||
cp -p arch/$TARGET_KERNEL_ARCH/boot/dts/*.dtb $INSTALL/usr/share/bootloader
|
||||
rm -f $INSTALL/usr/share/bootloader/bcm283*.dtb
|
||||
|
||||
# install overlay dtbs
|
||||
for dtb in arch/$TARGET_KERNEL_ARCH/boot/dts/overlays/*.dtbo; do
|
||||
cp $dtb $INSTALL/usr/share/bootloader/overlays 2>/dev/null || :
|
||||
done
|
||||
cp -p arch/$TARGET_KERNEL_ARCH/boot/dts/overlays/README $INSTALL/usr/share/bootloader/overlays
|
||||
fi
|
||||
}
|
||||
|
||||
make_init() {
|
||||
: # reuse make_target()
|
||||
}
|
||||
|
||||
makeinstall_init() {
|
||||
if [ -n "$INITRAMFS_MODULES" ]; then
|
||||
mkdir -p $INSTALL/etc
|
||||
mkdir -p $INSTALL/usr/lib/modules
|
||||
|
||||
for i in $INITRAMFS_MODULES; do
|
||||
module=`find .install_pkg/$(get_full_module_dir)/kernel -name $i.ko`
|
||||
if [ -n "$module" ]; then
|
||||
echo $i >> $INSTALL/etc/modules
|
||||
cp $module $INSTALL/usr/lib/modules/`basename $module`
|
||||
for dtb in arch/${TARGET_KERNEL_ARCH}/boot/dts/*.dtb arch/${TARGET_KERNEL_ARCH}/boot/dts/*/*.dtb; do
|
||||
if [ -f ${dtb} ]; then
|
||||
cp -v ${dtb} ${INSTALL}/usr/share/bootloader
|
||||
fi
|
||||
done
|
||||
fi
|
||||
rm -f ${INSTALL}/usr/share/bootloader/bcm283*.dtb
|
||||
# duplicated in overlays below
|
||||
safe_remove ${INSTALL}/usr/share/bootloader/overlay_map.dtb
|
||||
|
||||
if [ "$UVESAFB_SUPPORT" = yes ]; then
|
||||
mkdir -p $INSTALL/usr/lib/modules
|
||||
uvesafb=`find .install_pkg/$(get_full_module_dir)/kernel -name uvesafb.ko`
|
||||
cp $uvesafb $INSTALL/usr/lib/modules/`basename $uvesafb`
|
||||
# install overlay dtbs
|
||||
for dtb in arch/arm/boot/dts/overlays/*.dtb \
|
||||
arch/arm/boot/dts/overlays/*.dtbo; do
|
||||
cp ${dtb} ${INSTALL}/usr/share/bootloader/overlays 2>/dev/null || :
|
||||
done
|
||||
cp -p arch/${TARGET_KERNEL_ARCH}/boot/dts/overlays/README ${INSTALL}/usr/share/bootloader/overlays
|
||||
fi
|
||||
}
|
||||
|
||||
post_install() {
|
||||
mkdir -p $INSTALL/$(get_full_firmware_dir)/
|
||||
|
||||
# regdb and signature is now loaded as firmware by 4.15+
|
||||
if grep -q ^CONFIG_CFG80211_REQUIRE_SIGNED_REGDB= $PKG_BUILD/.config; then
|
||||
cp $(get_build_dir wireless-regdb)/regulatory.db{,.p7s} $INSTALL/$(get_full_firmware_dir)
|
||||
fi
|
||||
}
|
||||
|
|
|
@ -1,19 +0,0 @@
|
|||
--- a/drivers/amlogic/display/osd/osd_fb.c
|
||||
+++ b/drivers/amlogic/display/osd/osd_fb.c
|
||||
@@ -215,11 +215,11 @@
|
||||
.yoffset = 0,
|
||||
.bits_per_pixel = 32,
|
||||
.grayscale = 0,
|
||||
- .red = {0, 0, 0},
|
||||
- .green = {0, 0, 0},
|
||||
- .blue = {0, 0, 0},
|
||||
- .transp = {0, 0, 0},
|
||||
- .nonstd = 0,
|
||||
+ .red = {16, 8, 0},
|
||||
+ .green = {8, 8, 0},
|
||||
+ .blue = {0, 8, 0},
|
||||
+ .transp = {24, 0, 0},
|
||||
+ .nonstd = 1,
|
||||
.activate = FB_ACTIVATE_NOW,
|
||||
.height = -1,
|
||||
.width = -1,
|
|
@ -1,143 +0,0 @@
|
|||
From 6ce901eb61aa30ba8565c62049ee80c90728ef14 Mon Sep 17 00:00:00 2001
|
||||
From: David Herrmann <dh.herrmann@gmail.com>
|
||||
Date: Mon, 29 Dec 2014 15:21:26 +0100
|
||||
Subject: [PATCH] HID: input: fix confusion on conflicting mappings
|
||||
|
||||
On an PC-101/103/104 keyboard (American layout) the 'Enter' key and its
|
||||
neighbours look like this:
|
||||
|
||||
+---+ +---+ +-------+
|
||||
| 1 | | 2 | | 5 |
|
||||
+---+ +---+ +-------+
|
||||
+---+ +-----------+
|
||||
| 3 | | 4 |
|
||||
+---+ +-----------+
|
||||
|
||||
On a PC-102/105 keyboard (European layout) it looks like this:
|
||||
|
||||
+---+ +---+ +-------+
|
||||
| 1 | | 2 | | |
|
||||
+---+ +---+ +-+ 4 |
|
||||
+---+ +---+ | |
|
||||
| 3 | | 5 | | |
|
||||
+---+ +---+ +-----+
|
||||
|
||||
(Note that the number of keys is the same, but key '5' is moved down and
|
||||
the shape of key '4' is changed. Keys '1' to '3' are exactly the same.)
|
||||
|
||||
The keys 1-4 report the same scan-code in HID in both layouts, even though
|
||||
the keysym they produce is usually different depending on the XKB-keymap
|
||||
used by user-space.
|
||||
However, key '5' (US 'backslash'/'pipe') reports 0x31 for the upper layout
|
||||
and 0x32 for the lower layout, as defined by the HID spec. This is highly
|
||||
confusing as the linux-input API uses a single keycode for both.
|
||||
|
||||
So far, this was never a problem as there never has been a keyboard with
|
||||
both of those keys present at the same time. It would have to look
|
||||
something like this:
|
||||
|
||||
+---+ +---+ +-------+
|
||||
| 1 | | 2 | | x31 |
|
||||
+---+ +---+ +-------+
|
||||
+---+ +---+ +-----+
|
||||
| 3 | |x32| | 4 |
|
||||
+---+ +---+ +-----+
|
||||
|
||||
HID can represent such a keyboard, but the linux-input API cannot.
|
||||
Furthermore, any user-space mapping would be confused by this and,
|
||||
luckily, no-one ever produced such hardware.
|
||||
|
||||
Now, the HID input layer fixed this mess by mapping both 0x31 and 0x32 to
|
||||
the same keycode (KEY_BACKSLASH==0x2b). As only one of both physical keys
|
||||
is present on a hardware, this works just fine.
|
||||
|
||||
Lets introduce hardware-vendors into this:
|
||||
------------------------------------------
|
||||
|
||||
Unfortunately, it seems way to expensive to produce a different device for
|
||||
American and European layouts. Therefore, hardware-vendors put both keys,
|
||||
(0x31 and 0x32) on the same keyboard, but only one of them is hooked up
|
||||
to the physical button, the other one is 'dead'.
|
||||
This means, they can use the same hardware, with a different button-layout
|
||||
and automatically produce the correct HID events for American *and*
|
||||
European layouts. This is unproblematic for normal keyboards, as the
|
||||
'dead' key will never report any KEY-DOWN events. But RollOver keyboards
|
||||
send the whole matrix on each key-event, allowing n-key roll-over mode.
|
||||
This means, we get a 0x31 and 0x32 event on each key-press. One of them
|
||||
will always be 0, the other reports the real state. As we map both to the
|
||||
same keycode, we will get spurious key-events, even though the real
|
||||
key-state never changed.
|
||||
|
||||
The easiest way would be to blacklist 'dead' keys and never handle those.
|
||||
We could simply read the 'country' tag of USB devices and blacklist either
|
||||
key according to the layout. But... hardware vendors... want the same
|
||||
device for all countries and thus many of them set 'country' to 0 for all
|
||||
devices. Meh..
|
||||
|
||||
So we have to deal with this properly. As we cannot know which of the keys
|
||||
is 'dead', we either need a heuristic and track those keys, or we simply
|
||||
make use of our value-tracking for HID fields. We simply ignore HID events
|
||||
for absolute data if the data didn't change. As HID tracks events on the
|
||||
HID level, we haven't done the keycode translation, yet. Therefore, the
|
||||
'dead' key is tracked independently of the real key, therefore, any events
|
||||
on it will be ignored.
|
||||
|
||||
This patch simply discards any HID events for absolute data if it didn't
|
||||
change compared to the last report. We need to ignore relative and
|
||||
buffered-byte reports for obvious reasons. But those cannot be affected by
|
||||
this bug, so we're fine.
|
||||
|
||||
Preferably, we'd do this filtering on the HID-core level. But this might
|
||||
break a lot of custom drivers, if they do not follow the HID specs.
|
||||
Therefore, we do this late in hid-input just before we inject it into the
|
||||
input layer (which does the exact same filtering, but on the keycode
|
||||
level).
|
||||
|
||||
If this turns out to break some devices, we might have to limit filtering
|
||||
to EV_KEY events. But lets try to do the Right Thing first, and properly
|
||||
filter any absolute data that didn't change.
|
||||
|
||||
This patch is tagged for 'stable' as it fixes a lot of n-key RollOver
|
||||
hardware. We might wanna wait with backporting for a while, before we know
|
||||
it doesn't break anything else, though.
|
||||
|
||||
Cc: <stable@vger.kernel.org>
|
||||
Reported-by: Adam Goode <adam@spicenitz.org>
|
||||
Reported-by: Fredrik Hallenberg <megahallon@gmail.com>
|
||||
Tested-by: Fredrik Hallenberg <megahallon@gmail.com>
|
||||
Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
|
||||
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
|
||||
---
|
||||
drivers/hid/hid-input.c | 16 ++++++++++++++++
|
||||
1 file changed, 16 insertions(+)
|
||||
|
||||
diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c
|
||||
index e0a0f06..84b6899 100644
|
||||
--- a/drivers/hid/hid-input.c
|
||||
+++ b/drivers/hid/hid-input.c
|
||||
@@ -1101,6 +1101,22 @@ void hidinput_hid_event(struct hid_device *hid, struct hid_field *field, struct
|
||||
return;
|
||||
}
|
||||
|
||||
+ /*
|
||||
+ * Ignore reports for absolute data if the data didn't change. This is
|
||||
+ * not only an optimization but also fixes 'dead' key reports. Some
|
||||
+ * RollOver implementations for localized keys (like BACKSLASH/PIPE; HID
|
||||
+ * 0x31 and 0x32) report multiple keys, even though a localized keyboard
|
||||
+ * can only have one of them physically available. The 'dead' keys
|
||||
+ * report constant 0. As all map to the same keycode, they'd confuse
|
||||
+ * the input layer. If we filter the 'dead' keys on the HID level, we
|
||||
+ * skip the keycode translation and only forward real events.
|
||||
+ */
|
||||
+ if (!(field->flags & (HID_MAIN_ITEM_RELATIVE |
|
||||
+ HID_MAIN_ITEM_BUFFERED_BYTE)) &&
|
||||
+ usage->usage_index < field->maxusage &&
|
||||
+ value == field->value[usage->usage_index])
|
||||
+ return;
|
||||
+
|
||||
/* report the usage code as scancode if the key status has changed */
|
||||
if (usage->type == EV_KEY && !!test_bit(usage->code, input->key) != value)
|
||||
input_event(input, EV_MSC, MSC_SCAN, usage->hid);
|
||||
--
|
||||
2.9.5
|
||||
|
|
@ -1,34 +0,0 @@
|
|||
From 8e7b341037db1835ee6eea64663013cbfcf33575 Mon Sep 17 00:00:00 2001
|
||||
From: Jiri Kosina <jkosina@suse.cz>
|
||||
Date: Tue, 6 Jan 2015 22:34:19 +0100
|
||||
Subject: [PATCH] HID: fixup the conflicting keyboard mappings quirk
|
||||
|
||||
The ignore check that got added in 6ce901eb61 ("HID: input: fix confusion
|
||||
on conflicting mappings") needs to properly check for VARIABLE reports
|
||||
as well (ARRAY reports should be ignored), otherwise legitimate keyboards
|
||||
might break.
|
||||
|
||||
Cc: <stable@vger.kernel.org>
|
||||
Fixes: 6ce901eb61 ("HID: input: fix confusion on conflicting mappings")
|
||||
Reported-by: Fredrik Hallenberg <megahallon@gmail.com>
|
||||
Reported-by: David Herrmann <dh.herrmann@gmail.com>
|
||||
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
|
||||
---
|
||||
drivers/hid/hid-input.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c
|
||||
index 84b6899..a758900 100644
|
||||
--- a/drivers/hid/hid-input.c
|
||||
+++ b/drivers/hid/hid-input.c
|
||||
@@ -1113,6 +1113,7 @@ void hidinput_hid_event(struct hid_device *hid, struct hid_field *field, struct
|
||||
*/
|
||||
if (!(field->flags & (HID_MAIN_ITEM_RELATIVE |
|
||||
HID_MAIN_ITEM_BUFFERED_BYTE)) &&
|
||||
+ (field->flags & HID_MAIN_ITEM_VARIABLE) &&
|
||||
usage->usage_index < field->maxusage &&
|
||||
value == field->value[usage->usage_index])
|
||||
return;
|
||||
--
|
||||
2.9.5
|
||||
|
|
@ -1,31 +0,0 @@
|
|||
From f64e727448cd0d16f69009d4f537eb873e87dfae Mon Sep 17 00:00:00 2001
|
||||
From: "Mauro (mdrjr) Ribeiro" <mauro.ribeiro@hardkernel.com>
|
||||
Date: Thu, 22 Nov 2018 13:40:49 +0900
|
||||
Subject: [PATCH] osd/fb: set default color format for Linux
|
||||
|
||||
Change-Id: I1d95d63215d5567673380740528eff65562bc6df
|
||||
---
|
||||
drivers/amlogic/media/osd/osd_fb.c | 10 +++++-----
|
||||
1 file changed, 5 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/drivers/amlogic/media/osd/osd_fb.c b/drivers/amlogic/media/osd/osd_fb.c
|
||||
index b5d0698f086e..423120459e43 100644
|
||||
--- a/drivers/amlogic/media/osd/osd_fb.c
|
||||
+++ b/drivers/amlogic/media/osd/osd_fb.c
|
||||
@@ -221,11 +221,11 @@ static struct fb_var_screeninfo fb_def_var[] = {
|
||||
.yoffset = 0,
|
||||
.bits_per_pixel = 32,
|
||||
.grayscale = 0,
|
||||
- .red = {0, 0, 0},
|
||||
- .green = {0, 0, 0},
|
||||
- .blue = {0, 0, 0},
|
||||
- .transp = {0, 0, 0},
|
||||
- .nonstd = 0,
|
||||
+ .red = {16, 8, 0},
|
||||
+ .green = {8, 8, 0},
|
||||
+ .blue = {0, 8, 0},
|
||||
+ .transp = {24, 0, 0},
|
||||
+ .nonstd = 1,
|
||||
.activate = FB_ACTIVATE_NOW,
|
||||
.height = -1,
|
||||
.width = -1,
|
593
packages/kernel/linux/patches/default/fs-ntfs3-since-5-15.patch
Normal file
|
@ -0,0 +1,593 @@
|
|||
From e589f9b7078e1c0191613cd736f598e81d2390de Mon Sep 17 00:00:00 2001
|
||||
From: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
|
||||
Date: Thu, 11 Nov 2021 08:45:44 +0100
|
||||
Subject: [PATCH 1/9] fs/ntfs3: Fix some memory leaks in an error handling path
|
||||
of 'log_replay()'
|
||||
|
||||
All error handling paths lead to 'out' where many resources are freed.
|
||||
|
||||
Do it as well here instead of a direct return, otherwise 'log', 'ra' and
|
||||
'log->one_page_buf' (at least) will leak.
|
||||
|
||||
Fixes: b46acd6a6a62 ("fs/ntfs3: Add NTFS journal")
|
||||
Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
|
||||
Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
|
||||
---
|
||||
fs/ntfs3/fslog.c | 6 ++++--
|
||||
1 file changed, 4 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/fs/ntfs3/fslog.c b/fs/ntfs3/fslog.c
|
||||
index 06492f088d60..915f42cf07bc 100644
|
||||
--- a/fs/ntfs3/fslog.c
|
||||
+++ b/fs/ntfs3/fslog.c
|
||||
@@ -4085,8 +4085,10 @@ int log_replay(struct ntfs_inode *ni, bool *initialized)
|
||||
if (client == LFS_NO_CLIENT_LE) {
|
||||
/* Insert "NTFS" client LogFile. */
|
||||
client = ra->client_idx[0];
|
||||
- if (client == LFS_NO_CLIENT_LE)
|
||||
- return -EINVAL;
|
||||
+ if (client == LFS_NO_CLIENT_LE) {
|
||||
+ err = -EINVAL;
|
||||
+ goto out;
|
||||
+ }
|
||||
|
||||
t16 = le16_to_cpu(client);
|
||||
cr = ca + t16;
|
||||
--
|
||||
2.25.1
|
||||
|
||||
From e95113ed4d428219e3395044e29f5713fc446720 Mon Sep 17 00:00:00 2001
|
||||
From: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
|
||||
Date: Fri, 22 Oct 2021 17:37:52 +0300
|
||||
Subject: [PATCH 2/9] fs/ntfs3: Keep preallocated only if option prealloc
|
||||
enabled
|
||||
|
||||
If size of file was reduced, we still kept allocated blocks.
|
||||
This commit makes ntfs3 work as other fs like btrfs.
|
||||
Link: https://bugzilla.kernel.org/show_bug.cgi?id=214719
|
||||
Fixes: 4342306f0f0d ("fs/ntfs3: Add file operations and implementation")
|
||||
|
||||
Reported-by: Ganapathi Kamath <hgkamath@hotmail.com>
|
||||
Tested-by: Ganapathi Kamath <hgkamath@hotmail.com>
|
||||
Reviewed-by: Kari Argillander <kari.argillander@gmail.com>
|
||||
Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
|
||||
---
|
||||
fs/ntfs3/file.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/fs/ntfs3/file.c b/fs/ntfs3/file.c
|
||||
index 43b1451bff53..3ac0482c6880 100644
|
||||
--- a/fs/ntfs3/file.c
|
||||
+++ b/fs/ntfs3/file.c
|
||||
@@ -494,7 +494,7 @@ static int ntfs_truncate(struct inode *inode, loff_t new_size)
|
||||
|
||||
down_write(&ni->file.run_lock);
|
||||
err = attr_set_size(ni, ATTR_DATA, NULL, 0, &ni->file.run, new_size,
|
||||
- &new_valid, true, NULL);
|
||||
+ &new_valid, ni->mi.sbi->options->prealloc, NULL);
|
||||
up_write(&ni->file.run_lock);
|
||||
|
||||
if (new_valid < ni->i_valid)
|
||||
--
|
||||
2.25.1
|
||||
|
||||
From 87e21c99bad763524c953ff4d1a61ee19038ddc2 Mon Sep 17 00:00:00 2001
|
||||
From: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
|
||||
Date: Fri, 22 Oct 2021 18:15:36 +0300
|
||||
Subject: [PATCH 3/9] fs/ntfs3: Restore ntfs_xattr_get_acl and
|
||||
ntfs_xattr_set_acl functions
|
||||
|
||||
Apparently we need to maintain these functions with
|
||||
ntfs_get_acl_ex and ntfs_set_acl_ex.
|
||||
This commit fixes xfstest generic/099
|
||||
Fixes: 95dd8b2c1ed0 ("fs/ntfs3: Remove unnecessary functions")
|
||||
|
||||
Reviewed-by: Kari Argillander <kari.argillander@gmail.com>
|
||||
Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
|
||||
---
|
||||
fs/ntfs3/xattr.c | 96 +++++++++++++++++++++++++++++++++++++++++++++++-
|
||||
1 file changed, 95 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/fs/ntfs3/xattr.c b/fs/ntfs3/xattr.c
|
||||
index afd0ddad826f..56e774d0f56a 100644
|
||||
--- a/fs/ntfs3/xattr.c
|
||||
+++ b/fs/ntfs3/xattr.c
|
||||
@@ -112,7 +112,7 @@ static int ntfs_read_ea(struct ntfs_inode *ni, struct EA_FULL **ea,
|
||||
return -ENOMEM;
|
||||
|
||||
if (!size) {
|
||||
- ;
|
||||
+ /* EA info persists, but xattr is empty. Looks like EA problem. */
|
||||
} else if (attr_ea->non_res) {
|
||||
struct runs_tree run;
|
||||
|
||||
@@ -619,6 +619,67 @@ int ntfs_set_acl(struct user_namespace *mnt_userns, struct inode *inode,
|
||||
return ntfs_set_acl_ex(mnt_userns, inode, acl, type);
|
||||
}
|
||||
|
||||
+static int ntfs_xattr_get_acl(struct user_namespace *mnt_userns,
|
||||
+ struct inode *inode, int type, void *buffer,
|
||||
+ size_t size)
|
||||
+{
|
||||
+ struct posix_acl *acl;
|
||||
+ int err;
|
||||
+
|
||||
+ if (!(inode->i_sb->s_flags & SB_POSIXACL)) {
|
||||
+ ntfs_inode_warn(inode, "add mount option \"acl\" to use acl");
|
||||
+ return -EOPNOTSUPP;
|
||||
+ }
|
||||
+
|
||||
+ acl = ntfs_get_acl(inode, type, false);
|
||||
+ if (IS_ERR(acl))
|
||||
+ return PTR_ERR(acl);
|
||||
+
|
||||
+ if (!acl)
|
||||
+ return -ENODATA;
|
||||
+
|
||||
+ err = posix_acl_to_xattr(mnt_userns, acl, buffer, size);
|
||||
+ posix_acl_release(acl);
|
||||
+
|
||||
+ return err;
|
||||
+}
|
||||
+
|
||||
+static int ntfs_xattr_set_acl(struct user_namespace *mnt_userns,
|
||||
+ struct inode *inode, int type, const void *value,
|
||||
+ size_t size)
|
||||
+{
|
||||
+ struct posix_acl *acl;
|
||||
+ int err;
|
||||
+
|
||||
+ if (!(inode->i_sb->s_flags & SB_POSIXACL)) {
|
||||
+ ntfs_inode_warn(inode, "add mount option \"acl\" to use acl");
|
||||
+ return -EOPNOTSUPP;
|
||||
+ }
|
||||
+
|
||||
+ if (!inode_owner_or_capable(mnt_userns, inode))
|
||||
+ return -EPERM;
|
||||
+
|
||||
+ if (!value) {
|
||||
+ acl = NULL;
|
||||
+ } else {
|
||||
+ acl = posix_acl_from_xattr(mnt_userns, value, size);
|
||||
+ if (IS_ERR(acl))
|
||||
+ return PTR_ERR(acl);
|
||||
+
|
||||
+ if (acl) {
|
||||
+ err = posix_acl_valid(mnt_userns, acl);
|
||||
+ if (err)
|
||||
+ goto release_and_out;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ err = ntfs_set_acl(mnt_userns, inode, acl, type);
|
||||
+
|
||||
+release_and_out:
|
||||
+ posix_acl_release(acl);
|
||||
+ return err;
|
||||
+}
|
||||
+
|
||||
/*
|
||||
* ntfs_init_acl - Initialize the ACLs of a new inode.
|
||||
*
|
||||
@@ -785,6 +846,23 @@ static int ntfs_getxattr(const struct xattr_handler *handler, struct dentry *de,
|
||||
goto out;
|
||||
}
|
||||
|
||||
+#ifdef CONFIG_NTFS3_FS_POSIX_ACL
|
||||
+ if ((name_len == sizeof(XATTR_NAME_POSIX_ACL_ACCESS) - 1 &&
|
||||
+ !memcmp(name, XATTR_NAME_POSIX_ACL_ACCESS,
|
||||
+ sizeof(XATTR_NAME_POSIX_ACL_ACCESS))) ||
|
||||
+ (name_len == sizeof(XATTR_NAME_POSIX_ACL_DEFAULT) - 1 &&
|
||||
+ !memcmp(name, XATTR_NAME_POSIX_ACL_DEFAULT,
|
||||
+ sizeof(XATTR_NAME_POSIX_ACL_DEFAULT)))) {
|
||||
+ /* TODO: init_user_ns? */
|
||||
+ err = ntfs_xattr_get_acl(
|
||||
+ &init_user_ns, inode,
|
||||
+ name_len == sizeof(XATTR_NAME_POSIX_ACL_ACCESS) - 1
|
||||
+ ? ACL_TYPE_ACCESS
|
||||
+ : ACL_TYPE_DEFAULT,
|
||||
+ buffer, size);
|
||||
+ goto out;
|
||||
+ }
|
||||
+#endif
|
||||
/* Deal with NTFS extended attribute. */
|
||||
err = ntfs_get_ea(inode, name, name_len, buffer, size, NULL);
|
||||
|
||||
@@ -897,6 +975,22 @@ static noinline int ntfs_setxattr(const struct xattr_handler *handler,
|
||||
goto out;
|
||||
}
|
||||
|
||||
+#ifdef CONFIG_NTFS3_FS_POSIX_ACL
|
||||
+ if ((name_len == sizeof(XATTR_NAME_POSIX_ACL_ACCESS) - 1 &&
|
||||
+ !memcmp(name, XATTR_NAME_POSIX_ACL_ACCESS,
|
||||
+ sizeof(XATTR_NAME_POSIX_ACL_ACCESS))) ||
|
||||
+ (name_len == sizeof(XATTR_NAME_POSIX_ACL_DEFAULT) - 1 &&
|
||||
+ !memcmp(name, XATTR_NAME_POSIX_ACL_DEFAULT,
|
||||
+ sizeof(XATTR_NAME_POSIX_ACL_DEFAULT)))) {
|
||||
+ err = ntfs_xattr_set_acl(
|
||||
+ mnt_userns, inode,
|
||||
+ name_len == sizeof(XATTR_NAME_POSIX_ACL_ACCESS) - 1
|
||||
+ ? ACL_TYPE_ACCESS
|
||||
+ : ACL_TYPE_DEFAULT,
|
||||
+ value, size);
|
||||
+ goto out;
|
||||
+ }
|
||||
+#endif
|
||||
/* Deal with NTFS extended attribute. */
|
||||
err = ntfs_set_ea(inode, name, name_len, value, size, flags);
|
||||
|
||||
--
|
||||
2.25.1
|
||||
|
||||
From 2d44667c306e7806848a3478820f87343feb5421 Mon Sep 17 00:00:00 2001
|
||||
From: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
|
||||
Date: Fri, 22 Oct 2021 18:35:43 +0300
|
||||
Subject: [PATCH 4/9] fs/ntfs3: Update i_ctime when xattr is added
|
||||
|
||||
Ctime wasn't updated after setfacl command.
|
||||
This commit fixes xfstest generic/307
|
||||
Fixes: be71b5cba2e6 ("fs/ntfs3: Add attrib operations")
|
||||
|
||||
Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
|
||||
---
|
||||
fs/ntfs3/xattr.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/fs/ntfs3/xattr.c b/fs/ntfs3/xattr.c
|
||||
index 56e774d0f56a..af818300493d 100644
|
||||
--- a/fs/ntfs3/xattr.c
|
||||
+++ b/fs/ntfs3/xattr.c
|
||||
@@ -995,6 +995,9 @@ static noinline int ntfs_setxattr(const struct xattr_handler *handler,
|
||||
err = ntfs_set_ea(inode, name, name_len, value, size, flags);
|
||||
|
||||
out:
|
||||
+ inode->i_ctime = current_time(inode);
|
||||
+ mark_inode_dirty(inode);
|
||||
+
|
||||
return err;
|
||||
}
|
||||
|
||||
--
|
||||
2.25.1
|
||||
|
||||
From 3a2154b25a9f461a1848371b3e8f6f316434ae1f Mon Sep 17 00:00:00 2001
|
||||
From: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
|
||||
Date: Fri, 22 Oct 2021 18:30:22 +0300
|
||||
Subject: [PATCH 5/9] fs/ntfs3: Optimize locking in ntfs_save_wsl_perm
|
||||
|
||||
Right now in ntfs_save_wsl_perm we lock/unlock 4 times.
|
||||
This commit fixes this situation.
|
||||
We add "locked" argument to ntfs_set_ea.
|
||||
|
||||
Suggested-by: Kari Argillander <kari.argillander@gmail.com>
|
||||
Reviewed-by: Kari Argillander <kari.argillander@gmail.com>
|
||||
Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
|
||||
---
|
||||
fs/ntfs3/xattr.c | 24 ++++++++++++++----------
|
||||
1 file changed, 14 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/fs/ntfs3/xattr.c b/fs/ntfs3/xattr.c
|
||||
index af818300493d..94a277615b62 100644
|
||||
--- a/fs/ntfs3/xattr.c
|
||||
+++ b/fs/ntfs3/xattr.c
|
||||
@@ -259,7 +259,7 @@ static int ntfs_get_ea(struct inode *inode, const char *name, size_t name_len,
|
||||
|
||||
static noinline int ntfs_set_ea(struct inode *inode, const char *name,
|
||||
size_t name_len, const void *value,
|
||||
- size_t val_size, int flags)
|
||||
+ size_t val_size, int flags, bool locked)
|
||||
{
|
||||
struct ntfs_inode *ni = ntfs_i(inode);
|
||||
struct ntfs_sb_info *sbi = ni->mi.sbi;
|
||||
@@ -278,7 +278,8 @@ static noinline int ntfs_set_ea(struct inode *inode, const char *name,
|
||||
u64 new_sz;
|
||||
void *p;
|
||||
|
||||
- ni_lock(ni);
|
||||
+ if (!locked)
|
||||
+ ni_lock(ni);
|
||||
|
||||
run_init(&ea_run);
|
||||
|
||||
@@ -467,7 +468,8 @@ static noinline int ntfs_set_ea(struct inode *inode, const char *name,
|
||||
mark_inode_dirty(&ni->vfs_inode);
|
||||
|
||||
out:
|
||||
- ni_unlock(ni);
|
||||
+ if (!locked)
|
||||
+ ni_unlock(ni);
|
||||
|
||||
run_close(&ea_run);
|
||||
kfree(ea_all);
|
||||
@@ -598,7 +600,7 @@ static noinline int ntfs_set_acl_ex(struct user_namespace *mnt_userns,
|
||||
flags = 0;
|
||||
}
|
||||
|
||||
- err = ntfs_set_ea(inode, name, name_len, value, size, flags);
|
||||
+ err = ntfs_set_ea(inode, name, name_len, value, size, flags, 0);
|
||||
if (err == -ENODATA && !size)
|
||||
err = 0; /* Removing non existed xattr. */
|
||||
if (!err)
|
||||
@@ -992,7 +994,7 @@ static noinline int ntfs_setxattr(const struct xattr_handler *handler,
|
||||
}
|
||||
#endif
|
||||
/* Deal with NTFS extended attribute. */
|
||||
- err = ntfs_set_ea(inode, name, name_len, value, size, flags);
|
||||
+ err = ntfs_set_ea(inode, name, name_len, value, size, flags, 0);
|
||||
|
||||
out:
|
||||
inode->i_ctime = current_time(inode);
|
||||
@@ -1010,35 +1012,37 @@ int ntfs_save_wsl_perm(struct inode *inode)
|
||||
{
|
||||
int err;
|
||||
__le32 value;
|
||||
+ struct ntfs_inode *ni = ntfs_i(inode);
|
||||
|
||||
- /* TODO: refactor this, so we don't lock 4 times in ntfs_set_ea */
|
||||
+ ni_lock(ni);
|
||||
value = cpu_to_le32(i_uid_read(inode));
|
||||
err = ntfs_set_ea(inode, "$LXUID", sizeof("$LXUID") - 1, &value,
|
||||
- sizeof(value), 0);
|
||||
+ sizeof(value), 0, true); /* true == already locked. */
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
value = cpu_to_le32(i_gid_read(inode));
|
||||
err = ntfs_set_ea(inode, "$LXGID", sizeof("$LXGID") - 1, &value,
|
||||
- sizeof(value), 0);
|
||||
+ sizeof(value), 0, true);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
value = cpu_to_le32(inode->i_mode);
|
||||
err = ntfs_set_ea(inode, "$LXMOD", sizeof("$LXMOD") - 1, &value,
|
||||
- sizeof(value), 0);
|
||||
+ sizeof(value), 0, true);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) {
|
||||
value = cpu_to_le32(inode->i_rdev);
|
||||
err = ntfs_set_ea(inode, "$LXDEV", sizeof("$LXDEV") - 1, &value,
|
||||
- sizeof(value), 0);
|
||||
+ sizeof(value), 0, true);
|
||||
if (err)
|
||||
goto out;
|
||||
}
|
||||
|
||||
out:
|
||||
+ ni_unlock(ni);
|
||||
/* In case of error should we delete all WSL xattr? */
|
||||
return err;
|
||||
}
|
||||
--
|
||||
2.25.1
|
||||
|
||||
From 9186d472ee780fabf74424756c4c00545166157e Mon Sep 17 00:00:00 2001
|
||||
From: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
|
||||
Date: Wed, 24 Nov 2021 15:08:19 +0300
|
||||
Subject: [PATCH 6/9] fs/ntfs3: In function ntfs_set_acl_ex do not change
|
||||
inode->i_mode if called from function ntfs_init_acl
|
||||
|
||||
ntfs_init_acl sets mode. ntfs_init_acl calls ntfs_set_acl_ex.
|
||||
ntfs_set_acl_ex must not change this mode.
|
||||
Fixes xfstest generic/444
|
||||
Fixes: be71b5cba2e6 ("fs/ntfs3: Add attrib operations")
|
||||
|
||||
Reviewed-by: Joe Perches <joe@perches.com>
|
||||
Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
|
||||
---
|
||||
fs/ntfs3/xattr.c | 13 +++++++------
|
||||
1 file changed, 7 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/fs/ntfs3/xattr.c b/fs/ntfs3/xattr.c
|
||||
index 94a277615b62..5e0e0280e70d 100644
|
||||
--- a/fs/ntfs3/xattr.c
|
||||
+++ b/fs/ntfs3/xattr.c
|
||||
@@ -543,7 +543,7 @@ struct posix_acl *ntfs_get_acl(struct inode *inode, int type, bool rcu)
|
||||
|
||||
static noinline int ntfs_set_acl_ex(struct user_namespace *mnt_userns,
|
||||
struct inode *inode, struct posix_acl *acl,
|
||||
- int type)
|
||||
+ int type, bool init_acl)
|
||||
{
|
||||
const char *name;
|
||||
size_t size, name_len;
|
||||
@@ -556,8 +556,9 @@ static noinline int ntfs_set_acl_ex(struct user_namespace *mnt_userns,
|
||||
|
||||
switch (type) {
|
||||
case ACL_TYPE_ACCESS:
|
||||
- if (acl) {
|
||||
- umode_t mode = inode->i_mode;
|
||||
+ /* Do not change i_mode if we are in init_acl */
|
||||
+ if (acl && !init_acl) {
|
||||
+ umode_t mode;
|
||||
|
||||
err = posix_acl_update_mode(mnt_userns, inode, &mode,
|
||||
&acl);
|
||||
@@ -618,7 +619,7 @@ static noinline int ntfs_set_acl_ex(struct user_namespace *mnt_userns,
|
||||
int ntfs_set_acl(struct user_namespace *mnt_userns, struct inode *inode,
|
||||
struct posix_acl *acl, int type)
|
||||
{
|
||||
- return ntfs_set_acl_ex(mnt_userns, inode, acl, type);
|
||||
+ return ntfs_set_acl_ex(mnt_userns, inode, acl, type, false);
|
||||
}
|
||||
|
||||
static int ntfs_xattr_get_acl(struct user_namespace *mnt_userns,
|
||||
@@ -699,7 +700,7 @@ int ntfs_init_acl(struct user_namespace *mnt_userns, struct inode *inode,
|
||||
|
||||
if (default_acl) {
|
||||
err = ntfs_set_acl_ex(mnt_userns, inode, default_acl,
|
||||
- ACL_TYPE_DEFAULT);
|
||||
+ ACL_TYPE_DEFAULT, true);
|
||||
posix_acl_release(default_acl);
|
||||
} else {
|
||||
inode->i_default_acl = NULL;
|
||||
@@ -710,7 +711,7 @@ int ntfs_init_acl(struct user_namespace *mnt_userns, struct inode *inode,
|
||||
else {
|
||||
if (!err)
|
||||
err = ntfs_set_acl_ex(mnt_userns, inode, acl,
|
||||
- ACL_TYPE_ACCESS);
|
||||
+ ACL_TYPE_ACCESS, true);
|
||||
posix_acl_release(acl);
|
||||
}
|
||||
|
||||
--
|
||||
2.25.1
|
||||
|
||||
From 3880f2b816a7e4ca889b7e8a42e6c62c5706ed36 Mon Sep 17 00:00:00 2001
|
||||
From: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
|
||||
Date: Mon, 25 Oct 2021 18:31:28 +0300
|
||||
Subject: [PATCH 7/9] fs/ntfs3: Fix fiemap + fix shrink file size (to remove
|
||||
preallocated space)
|
||||
|
||||
Two problems:
|
||||
1. ntfs3_setattr can't truncate preallocated space;
|
||||
2. if allocated fragment "cross" valid size, then fragment splits into two parts:
|
||||
- normal part;
|
||||
- unwritten part (here we must return FIEMAP_EXTENT_LAST).
|
||||
Before this commit we returned FIEMAP_EXTENT_LAST for whole fragment.
|
||||
Fixes xfstest generic/092
|
||||
Fixes: 4342306f0f0d ("fs/ntfs3: Add file operations and implementation")
|
||||
|
||||
Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
|
||||
---
|
||||
fs/ntfs3/file.c | 2 +-
|
||||
fs/ntfs3/frecord.c | 10 +++++++---
|
||||
2 files changed, 8 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/fs/ntfs3/file.c b/fs/ntfs3/file.c
|
||||
index 3ac0482c6880..6242708980d0 100644
|
||||
--- a/fs/ntfs3/file.c
|
||||
+++ b/fs/ntfs3/file.c
|
||||
@@ -761,7 +761,7 @@ int ntfs3_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
|
||||
}
|
||||
inode_dio_wait(inode);
|
||||
|
||||
- if (attr->ia_size < oldsize)
|
||||
+ if (attr->ia_size <= oldsize)
|
||||
err = ntfs_truncate(inode, attr->ia_size);
|
||||
else if (attr->ia_size > oldsize)
|
||||
err = ntfs_extend(inode, attr->ia_size, 0, NULL);
|
||||
diff --git a/fs/ntfs3/frecord.c b/fs/ntfs3/frecord.c
|
||||
index 6f47a9c17f89..18842998c8fa 100644
|
||||
--- a/fs/ntfs3/frecord.c
|
||||
+++ b/fs/ntfs3/frecord.c
|
||||
@@ -1964,10 +1964,8 @@ int ni_fiemap(struct ntfs_inode *ni, struct fiemap_extent_info *fieinfo,
|
||||
|
||||
vcn += clen;
|
||||
|
||||
- if (vbo + bytes >= end) {
|
||||
+ if (vbo + bytes >= end)
|
||||
bytes = end - vbo;
|
||||
- flags |= FIEMAP_EXTENT_LAST;
|
||||
- }
|
||||
|
||||
if (vbo + bytes <= valid) {
|
||||
;
|
||||
@@ -1977,6 +1975,9 @@ int ni_fiemap(struct ntfs_inode *ni, struct fiemap_extent_info *fieinfo,
|
||||
/* vbo < valid && valid < vbo + bytes */
|
||||
u64 dlen = valid - vbo;
|
||||
|
||||
+ if (vbo + dlen >= end)
|
||||
+ flags |= FIEMAP_EXTENT_LAST;
|
||||
+
|
||||
err = fiemap_fill_next_extent(fieinfo, vbo, lbo, dlen,
|
||||
flags);
|
||||
if (err < 0)
|
||||
@@ -1995,6 +1996,9 @@ int ni_fiemap(struct ntfs_inode *ni, struct fiemap_extent_info *fieinfo,
|
||||
flags |= FIEMAP_EXTENT_UNWRITTEN;
|
||||
}
|
||||
|
||||
+ if (vbo + bytes >= end)
|
||||
+ flags |= FIEMAP_EXTENT_LAST;
|
||||
+
|
||||
err = fiemap_fill_next_extent(fieinfo, vbo, lbo, bytes, flags);
|
||||
if (err < 0)
|
||||
break;
|
||||
--
|
||||
2.25.1
|
||||
|
||||
From 114346978cf61de02832cc3cc68432a3de70fb38 Mon Sep 17 00:00:00 2001
|
||||
From: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
|
||||
Date: Mon, 25 Oct 2021 18:34:06 +0300
|
||||
Subject: [PATCH 8/9] fs/ntfs3: Check new size for limits
|
||||
|
||||
We must check size before trying to allocate.
|
||||
Size can be set for example by "ulimit -f".
|
||||
Fixes xfstest generic/228
|
||||
Fixes: 4342306f0f0d ("fs/ntfs3: Add file operations and implementation")
|
||||
|
||||
Reviewed-by: Kari Argillander <kari.argillander@gmail.com>
|
||||
Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
|
||||
---
|
||||
fs/ntfs3/file.c | 8 +++++++-
|
||||
1 file changed, 7 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/fs/ntfs3/file.c b/fs/ntfs3/file.c
|
||||
index 6242708980d0..f8360f9bfaf0 100644
|
||||
--- a/fs/ntfs3/file.c
|
||||
+++ b/fs/ntfs3/file.c
|
||||
@@ -661,7 +661,13 @@ static long ntfs_fallocate(struct file *file, int mode, loff_t vbo, loff_t len)
|
||||
/*
|
||||
* Normal file: Allocate clusters, do not change 'valid' size.
|
||||
*/
|
||||
- err = ntfs_set_size(inode, max(end, i_size));
|
||||
+ loff_t new_size = max(end, i_size);
|
||||
+
|
||||
+ err = inode_newsize_ok(inode, new_size);
|
||||
+ if (err)
|
||||
+ goto out;
|
||||
+
|
||||
+ err = ntfs_set_size(inode, new_size);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
--
|
||||
2.25.1
|
||||
|
||||
From 52e00ea6b26e45fb8159e3b57cdde8d3f9bdd8e9 Mon Sep 17 00:00:00 2001
|
||||
From: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
|
||||
Date: Mon, 25 Oct 2021 18:48:38 +0300
|
||||
Subject: [PATCH 9/9] fs/ntfs3: Update valid size if -EIOCBQUEUED
|
||||
|
||||
Update valid size if write is still in I/O queue.
|
||||
Fixes xfstest generic/240
|
||||
Fixes: 82cae269cfa9 ("fs/ntfs3: Add initialization of super block")
|
||||
|
||||
Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
|
||||
---
|
||||
fs/ntfs3/inode.c | 8 ++++++--
|
||||
1 file changed, 6 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/fs/ntfs3/inode.c b/fs/ntfs3/inode.c
|
||||
index 859951d785cb..879952254071 100644
|
||||
--- a/fs/ntfs3/inode.c
|
||||
+++ b/fs/ntfs3/inode.c
|
||||
@@ -757,6 +757,7 @@ static ssize_t ntfs_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
|
||||
loff_t vbo = iocb->ki_pos;
|
||||
loff_t end;
|
||||
int wr = iov_iter_rw(iter) & WRITE;
|
||||
+ size_t iter_count = iov_iter_count(iter);
|
||||
loff_t valid;
|
||||
ssize_t ret;
|
||||
|
||||
@@ -770,10 +771,13 @@ static ssize_t ntfs_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
|
||||
wr ? ntfs_get_block_direct_IO_W
|
||||
: ntfs_get_block_direct_IO_R);
|
||||
|
||||
- if (ret <= 0)
|
||||
+ if (ret > 0)
|
||||
+ end = vbo + ret;
|
||||
+ else if (wr && ret == -EIOCBQUEUED)
|
||||
+ end = vbo + iter_count;
|
||||
+ else
|
||||
goto out;
|
||||
|
||||
- end = vbo + ret;
|
||||
valid = ni->i_valid;
|
||||
if (wr) {
|
||||
if (end > valid && !S_ISBLK(inode->i_mode)) {
|
||||
--
|
||||
2.25.1
|
||||
|
|
@ -0,0 +1,55 @@
|
|||
From 107fe0482b549a0e43a971e5fd104719c6e495ef Mon Sep 17 00:00:00 2001
|
||||
From: Kiran K <kiran.k@intel.com>
|
||||
Date: Tue, 5 Oct 2021 20:15:56 +0530
|
||||
Subject: Bluetooth: Read codec capabilities only if supported
|
||||
|
||||
Read codec capabilities only if HCI_READ_LOCAL_CODEC_CAPABILITIES
|
||||
command is supported. If capablities are not supported, then
|
||||
cache codec data without caps.
|
||||
|
||||
Signed-off-by: Kiran K <kiran.k@intel.com>
|
||||
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
|
||||
---
|
||||
net/bluetooth/hci_codec.c | 18 ++++++++++++++++--
|
||||
1 file changed, 16 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/net/bluetooth/hci_codec.c b/net/bluetooth/hci_codec.c
|
||||
index f0421d0edaa37..38201532f58e8 100644
|
||||
--- a/net/bluetooth/hci_codec.c
|
||||
+++ b/net/bluetooth/hci_codec.c
|
||||
@@ -25,9 +25,11 @@ static int hci_codec_list_add(struct list_head *list,
|
||||
}
|
||||
entry->transport = sent->transport;
|
||||
entry->len = len;
|
||||
- entry->num_caps = rp->num_caps;
|
||||
- if (rp->num_caps)
|
||||
+ entry->num_caps = 0;
|
||||
+ if (rp) {
|
||||
+ entry->num_caps = rp->num_caps;
|
||||
memcpy(entry->caps, caps, len);
|
||||
+ }
|
||||
list_add(&entry->list, list);
|
||||
|
||||
return 0;
|
||||
@@ -58,6 +60,18 @@ static void hci_read_codec_capabilities(struct hci_dev *hdev, __u8 transport,
|
||||
__u32 len;
|
||||
|
||||
cmd->transport = i;
|
||||
+
|
||||
+ /* If Read_Codec_Capabilities command is not supported
|
||||
+ * then just add codec to the list without caps
|
||||
+ */
|
||||
+ if (!(hdev->commands[45] & 0x08)) {
|
||||
+ hci_dev_lock(hdev);
|
||||
+ hci_codec_list_add(&hdev->local_codecs, cmd,
|
||||
+ NULL, NULL, 0);
|
||||
+ hci_dev_unlock(hdev);
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
skb = __hci_cmd_sync(hdev, HCI_OP_READ_LOCAL_CODEC_CAPS,
|
||||
sizeof(*cmd), cmd,
|
||||
HCI_CMD_TIMEOUT);
|
||||
--
|
||||
cgit 1.2.3-1.el7
|
||||
|
|
@ -0,0 +1,91 @@
|
|||
From a2769637a9b98c6809d4d25a3a20447a3ff7b23a Mon Sep 17 00:00:00 2001
|
||||
From: Matthias Reichl <hias@horus.com>
|
||||
Date: Fri, 19 Mar 2021 12:14:17 +0100
|
||||
Subject: [PATCH] ALSA: pcm: fix ELD constraints for some compressed audio
|
||||
formats
|
||||
|
||||
The SADs of compressed formats like AC3 and DTS contain the channel
|
||||
and sample rate info of the audio data inside the compressed stream,
|
||||
but when building constraints we must use the rates and formats used
|
||||
to pass through the stream. eg 2ch 48kHz for AC3.
|
||||
|
||||
Signed-off-by: Matthias Reichl <hias@horus.com>
|
||||
---
|
||||
sound/core/pcm_drm_eld.c | 38 +++++++++++++++++++++++++++++++++++---
|
||||
1 file changed, 35 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/sound/core/pcm_drm_eld.c b/sound/core/pcm_drm_eld.c
|
||||
index 4b5faae5d16e5..e7ec7a8b9d420 100644
|
||||
--- a/sound/core/pcm_drm_eld.c
|
||||
+++ b/sound/core/pcm_drm_eld.c
|
||||
@@ -6,6 +6,7 @@
|
||||
#include <drm/drm_edid.h>
|
||||
#include <sound/pcm.h>
|
||||
#include <sound/pcm_drm_eld.h>
|
||||
+#include <linux/hdmi.h>
|
||||
|
||||
static const unsigned int eld_rates[] = {
|
||||
32000,
|
||||
@@ -17,9 +18,40 @@ static const unsigned int eld_rates[] = {
|
||||
192000,
|
||||
};
|
||||
|
||||
+static unsigned int sad_format(const u8 *sad)
|
||||
+{
|
||||
+ return (sad[0] & 0x78) >> 3;
|
||||
+}
|
||||
+
|
||||
static unsigned int sad_max_channels(const u8 *sad)
|
||||
{
|
||||
- return 1 + (sad[0] & 7);
|
||||
+ switch (sad_format(sad)) {
|
||||
+ case HDMI_AUDIO_CODING_TYPE_AC3:
|
||||
+ case HDMI_AUDIO_CODING_TYPE_DTS:
|
||||
+ case HDMI_AUDIO_CODING_TYPE_EAC3:
|
||||
+ return 2;
|
||||
+ case HDMI_AUDIO_CODING_TYPE_DTS_HD:
|
||||
+ case HDMI_AUDIO_CODING_TYPE_MLP:
|
||||
+ return 8;
|
||||
+ default:
|
||||
+ return 1 + (sad[0] & 7);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static unsigned int sad_rate_mask(const u8 *sad)
|
||||
+{
|
||||
+ switch (sad_format(sad)) {
|
||||
+ case HDMI_AUDIO_CODING_TYPE_AC3:
|
||||
+ case HDMI_AUDIO_CODING_TYPE_DTS:
|
||||
+ return 0x07; // 32-48kHz
|
||||
+ case HDMI_AUDIO_CODING_TYPE_EAC3:
|
||||
+ return 0x7f; // 32-192kHz
|
||||
+ case HDMI_AUDIO_CODING_TYPE_DTS_HD:
|
||||
+ case HDMI_AUDIO_CODING_TYPE_MLP:
|
||||
+ return 0x60; // 176.4, 192kHz
|
||||
+ default:
|
||||
+ return sad[1] & 0x7f;
|
||||
+ }
|
||||
}
|
||||
|
||||
static int eld_limit_rates(struct snd_pcm_hw_params *params,
|
||||
@@ -42,7 +74,7 @@ static int eld_limit_rates(struct snd_pcm_hw_params *params,
|
||||
* requested number of channels.
|
||||
*/
|
||||
if (c->min <= max_channels)
|
||||
- rate_mask |= sad[1];
|
||||
+ rate_mask |= sad_rate_mask(sad);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -70,7 +102,7 @@ static int eld_limit_channels(struct snd_pcm_hw_params *params,
|
||||
rate_mask |= BIT(i);
|
||||
|
||||
for (i = drm_eld_sad_count(eld); i > 0; i--, sad += 3)
|
||||
- if (rate_mask & sad[1])
|
||||
+ if (rate_mask & sad_rate_mask(sad))
|
||||
t.max = max(t.max, sad_max_channels(sad));
|
||||
}
|
||||
|
||||
--
|
||||
2.20.1
|
||||
|
|
@ -21,7 +21,7 @@ index 60252fd796f6..6be2c454e72e 100644
|
|||
+config HID_OUYA
|
||||
+ tristate "OUYA Game Controller"
|
||||
+ depends on USB_HID
|
||||
+ ---help---
|
||||
+ help
|
||||
+ Support for OUYA Game Controller.
|
||||
+
|
||||
config HID_PANTHERLORD
|
||||
|
|
|
@ -1,158 +0,0 @@
|
|||
From 55096db50d8cdbf777c67f672b493ef565a12c38 Mon Sep 17 00:00:00 2001
|
||||
From: Matthias Reichl <hias@horus.com>
|
||||
Date: Fri, 22 Mar 2019 12:26:17 +0100
|
||||
Subject: [PATCH] media: rc: xbox_remote: add protocol and set timeout
|
||||
|
||||
The timestamps in ir-keytable -t output showed that the Xbox DVD
|
||||
IR dongle decodes scancodes every 64ms. The last scancode of a
|
||||
longer button press is decodes 64ms after the last-but-one which
|
||||
indicates the decoder doesn't use a timeout but decodes on the last
|
||||
edge of the signal.
|
||||
|
||||
267.042629: lirc protocol(unknown): scancode = 0xace
|
||||
267.042665: event type EV_MSC(0x04): scancode = 0xace
|
||||
267.042665: event type EV_KEY(0x01) key_down: KEY_1(0x0002)
|
||||
267.042665: event type EV_SYN(0x00).
|
||||
267.106625: lirc protocol(unknown): scancode = 0xace
|
||||
267.106643: event type EV_MSC(0x04): scancode = 0xace
|
||||
267.106643: event type EV_SYN(0x00).
|
||||
267.170623: lirc protocol(unknown): scancode = 0xace
|
||||
267.170638: event type EV_MSC(0x04): scancode = 0xace
|
||||
267.170638: event type EV_SYN(0x00).
|
||||
267.234621: lirc protocol(unknown): scancode = 0xace
|
||||
267.234636: event type EV_MSC(0x04): scancode = 0xace
|
||||
267.234636: event type EV_SYN(0x00).
|
||||
267.298623: lirc protocol(unknown): scancode = 0xace
|
||||
267.298638: event type EV_MSC(0x04): scancode = 0xace
|
||||
267.298638: event type EV_SYN(0x00).
|
||||
267.543345: event type EV_KEY(0x01) key_down: KEY_1(0x0002)
|
||||
267.543345: event type EV_SYN(0x00).
|
||||
267.570015: event type EV_KEY(0x01) key_up: KEY_1(0x0002)
|
||||
267.570015: event type EV_SYN(0x00).
|
||||
|
||||
Add a protocol with the repeat value and set the timeout in the
|
||||
driver to 10ms (to have a bit of headroom for delays) so the Xbox
|
||||
DVD remote performs more responsive.
|
||||
|
||||
Signed-off-by: Matthias Reichl <hias@horus.com>
|
||||
---
|
||||
Documentation/media/lirc.h.rst.exceptions | 1 +
|
||||
drivers/media/rc/keymaps/rc-xbox-dvd.c | 2 +-
|
||||
drivers/media/rc/rc-main.c | 2 ++
|
||||
drivers/media/rc/xbox_remote.c | 4 +++-
|
||||
include/media/rc-map.h | 4 +++-
|
||||
include/uapi/linux/lirc.h | 2 ++
|
||||
6 files changed, 12 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/Documentation/media/lirc.h.rst.exceptions b/Documentation/media/lirc.h.rst.exceptions
|
||||
index e7a41d4b3d46..f8b5f1a32b7d 100644
|
||||
--- a/Documentation/media/lirc.h.rst.exceptions
|
||||
+++ b/Documentation/media/lirc.h.rst.exceptions
|
||||
@@ -61,6 +61,7 @@ ignore symbol RC_PROTO_IMON
|
||||
ignore symbol RC_PROTO_RCMM12
|
||||
ignore symbol RC_PROTO_RCMM24
|
||||
ignore symbol RC_PROTO_RCMM32
|
||||
+ignore symbol RC_PROTO_XBOX_DVD
|
||||
|
||||
# Undocumented macros
|
||||
|
||||
diff --git a/drivers/media/rc/keymaps/rc-xbox-dvd.c b/drivers/media/rc/keymaps/rc-xbox-dvd.c
|
||||
index af387244636b..42815ab57bff 100644
|
||||
--- a/drivers/media/rc/keymaps/rc-xbox-dvd.c
|
||||
+++ b/drivers/media/rc/keymaps/rc-xbox-dvd.c
|
||||
@@ -42,7 +42,7 @@ static struct rc_map_list xbox_dvd_map = {
|
||||
.map = {
|
||||
.scan = xbox_dvd,
|
||||
.size = ARRAY_SIZE(xbox_dvd),
|
||||
- .rc_proto = RC_PROTO_UNKNOWN,
|
||||
+ .rc_proto = RC_PROTO_XBOX_DVD,
|
||||
.name = RC_MAP_XBOX_DVD,
|
||||
}
|
||||
};
|
||||
diff --git a/drivers/media/rc/rc-main.c b/drivers/media/rc/rc-main.c
|
||||
index 78e79c37f208..7f1d5b226f68 100644
|
||||
--- a/drivers/media/rc/rc-main.c
|
||||
+++ b/drivers/media/rc/rc-main.c
|
||||
@@ -76,6 +76,7 @@ static const struct {
|
||||
.scancode_bits = 0x00ffffff, .repeat_period = 114 },
|
||||
[RC_PROTO_RCMM32] = { .name = "rc-mm-32",
|
||||
.scancode_bits = 0xffffffff, .repeat_period = 114 },
|
||||
+ [RC_PROTO_XBOX_DVD] = { .name = "xbox-dvd", .repeat_period = 64 },
|
||||
};
|
||||
|
||||
/* Used to keep track of known keymaps */
|
||||
@@ -1027,6 +1028,7 @@ static const struct {
|
||||
{ RC_PROTO_BIT_RCMM12 |
|
||||
RC_PROTO_BIT_RCMM24 |
|
||||
RC_PROTO_BIT_RCMM32, "rc-mm", "ir-rcmm-decoder" },
|
||||
+ { RC_PROTO_BIT_XBOX_DVD, "xbox-dvd", NULL },
|
||||
};
|
||||
|
||||
/**
|
||||
diff --git a/drivers/media/rc/xbox_remote.c b/drivers/media/rc/xbox_remote.c
|
||||
index f959cbb94744..79470c09989e 100644
|
||||
--- a/drivers/media/rc/xbox_remote.c
|
||||
+++ b/drivers/media/rc/xbox_remote.c
|
||||
@@ -148,7 +148,7 @@ static void xbox_remote_rc_init(struct xbox_remote *xbox_remote)
|
||||
struct rc_dev *rdev = xbox_remote->rdev;
|
||||
|
||||
rdev->priv = xbox_remote;
|
||||
- rdev->allowed_protocols = RC_PROTO_BIT_UNKNOWN;
|
||||
+ rdev->allowed_protocols = RC_PROTO_BIT_XBOX_DVD;
|
||||
rdev->driver_name = "xbox_remote";
|
||||
|
||||
rdev->open = xbox_remote_rc_open;
|
||||
@@ -157,6 +157,8 @@ static void xbox_remote_rc_init(struct xbox_remote *xbox_remote)
|
||||
rdev->device_name = xbox_remote->rc_name;
|
||||
rdev->input_phys = xbox_remote->rc_phys;
|
||||
|
||||
+ rdev->timeout = MS_TO_NS(10);
|
||||
+
|
||||
usb_to_input_id(xbox_remote->udev, &rdev->input_id);
|
||||
rdev->dev.parent = &xbox_remote->interface->dev;
|
||||
}
|
||||
diff --git a/include/media/rc-map.h b/include/media/rc-map.h
|
||||
index e5e86d595645..a0000f392362 100644
|
||||
--- a/include/media/rc-map.h
|
||||
+++ b/include/media/rc-map.h
|
||||
@@ -40,6 +40,7 @@
|
||||
#define RC_PROTO_BIT_RCMM12 BIT_ULL(RC_PROTO_RCMM12)
|
||||
#define RC_PROTO_BIT_RCMM24 BIT_ULL(RC_PROTO_RCMM24)
|
||||
#define RC_PROTO_BIT_RCMM32 BIT_ULL(RC_PROTO_RCMM32)
|
||||
+#define RC_PROTO_BIT_XBOX_DVD BIT_ULL(RC_PROTO_XBOX_DVD)
|
||||
|
||||
#define RC_PROTO_BIT_ALL \
|
||||
(RC_PROTO_BIT_UNKNOWN | RC_PROTO_BIT_OTHER | \
|
||||
@@ -55,7 +56,8 @@
|
||||
RC_PROTO_BIT_RC6_MCE | RC_PROTO_BIT_SHARP | \
|
||||
RC_PROTO_BIT_XMP | RC_PROTO_BIT_CEC | \
|
||||
RC_PROTO_BIT_IMON | RC_PROTO_BIT_RCMM12 | \
|
||||
- RC_PROTO_BIT_RCMM24 | RC_PROTO_BIT_RCMM32)
|
||||
+ RC_PROTO_BIT_RCMM24 | RC_PROTO_BIT_RCMM32 | \
|
||||
+ RC_PROTO_BIT_XBOX_DVD)
|
||||
/* All rc protocols for which we have decoders */
|
||||
#define RC_PROTO_BIT_ALL_IR_DECODER \
|
||||
(RC_PROTO_BIT_RC5 | RC_PROTO_BIT_RC5X_20 | \
|
||||
diff --git a/include/uapi/linux/lirc.h b/include/uapi/linux/lirc.h
|
||||
index 45fcbf99d72e..f99d9dcae667 100644
|
||||
--- a/include/uapi/linux/lirc.h
|
||||
+++ b/include/uapi/linux/lirc.h
|
||||
@@ -195,6 +195,7 @@ struct lirc_scancode {
|
||||
* @RC_PROTO_RCMM12: RC-MM protocol 12 bits
|
||||
* @RC_PROTO_RCMM24: RC-MM protocol 24 bits
|
||||
* @RC_PROTO_RCMM32: RC-MM protocol 32 bits
|
||||
+ * @RC_PROTO_XBOX_DVD: Xbox DVD Movie Playback Kit protocol
|
||||
*/
|
||||
enum rc_proto {
|
||||
RC_PROTO_UNKNOWN = 0,
|
||||
@@ -224,6 +225,7 @@ enum rc_proto {
|
||||
RC_PROTO_RCMM12 = 24,
|
||||
RC_PROTO_RCMM24 = 25,
|
||||
RC_PROTO_RCMM32 = 26,
|
||||
+ RC_PROTO_XBOX_DVD = 27,
|
||||
};
|
||||
|
||||
#endif
|
||||
--
|
||||
2.20.1
|
||||
|
|
@ -1,89 +0,0 @@
|
|||
From 28ad70a06fb84fe63cd036970db2561b2fd1562b Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Sun, 5 Nov 2017 16:51:23 +0100
|
||||
Subject: [PATCH v3 1/2] i915: pm: Be less agressive with clockfreq changes on
|
||||
Bay Trail
|
||||
|
||||
Bay Trail devices are known to hang when changing the frequency often,
|
||||
this is discussed in great length in:
|
||||
https://bugzilla.kernel.org/show_bug.cgi?id=109051
|
||||
|
||||
Commit 6067a27d1f01 ("drm/i915: Avoid tweaking evaluation thresholds
|
||||
on Baytrail v3") is an attempt to workaround this. Several users in
|
||||
bko109051 report that an earlier version of this patch, v1:
|
||||
https://bugzilla.kernel.org/attachment.cgi?id=251471
|
||||
|
||||
Works better for them and they still see hangs with the merged v3.
|
||||
|
||||
Comparing the 2 versions shows that they are indeed not equivalent,
|
||||
v1 not only skips writing the GEN6_RP* registers from valleyview_set_rps,
|
||||
as v3 does. It also contained these modifications to i915_irq.c:
|
||||
|
||||
if (pm_iir & GEN6_PM_RP_DOWN_EI_EXPIRED) {
|
||||
if (!vlv_c0_above(dev_priv,
|
||||
&dev_priv->rps.down_ei, &now,
|
||||
- dev_priv->rps.down_threshold))
|
||||
+ VLV_RP_DOWN_EI_THRESHOLD))
|
||||
events |= GEN6_PM_RP_DOWN_THRESHOLD;
|
||||
dev_priv->rps.down_ei = now;
|
||||
}
|
||||
|
||||
if (pm_iir & GEN6_PM_RP_UP_EI_EXPIRED) {
|
||||
if (vlv_c0_above(dev_priv,
|
||||
&dev_priv->rps.up_ei, &now,
|
||||
- dev_priv->rps.up_threshold))
|
||||
+ VLV_RP_UP_EI_THRESHOLD))
|
||||
events |= GEN6_PM_RP_UP_THRESHOLD;
|
||||
dev_priv->rps.up_ei = now;
|
||||
}
|
||||
|
||||
Which use less aggressive up/down thresholds, which results in less
|
||||
GEN6_PM_RP_*_THRESHOLD events and thus in less calls to intel_set_rps() ->
|
||||
valleyview_set_rps() -> vlv_punit_write(PUNIT_REG_GPU_FREQ_REQ).
|
||||
With the last call being the likely cause of the hang.
|
||||
|
||||
This commit hardcodes the threshold_up and _down values for Bay Trail to
|
||||
less aggressive values, reducing the amount of clock frequency changes,
|
||||
thus avoiding the hangs some people are still seeing with the merged fix.
|
||||
|
||||
Buglink: https://bugzilla.kernel.org/show_bug.cgi?id=109051
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
---
|
||||
drivers/gpu/drm/i915/i915_reg.h | 3 +++
|
||||
drivers/gpu/drm/i915/intel_pm.c | 5 ++++-
|
||||
2 files changed, 7 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
|
||||
index 68a58cce6ab1..2561af075ebb 100644
|
||||
--- a/drivers/gpu/drm/i915/i915_reg.h
|
||||
+++ b/drivers/gpu/drm/i915/i915_reg.h
|
||||
@@ -1355,6 +1355,9 @@ enum i915_power_well_id {
|
||||
#define VLV_BIAS_CPU_125_SOC_875 (6 << 2)
|
||||
#define CHV_BIAS_CPU_50_SOC_50 (3 << 2)
|
||||
|
||||
+#define VLV_RP_UP_EI_THRESHOLD 90
|
||||
+#define VLV_RP_DOWN_EI_THRESHOLD 70
|
||||
+
|
||||
/* vlv2 north clock has */
|
||||
#define CCK_FUSE_REG 0x8
|
||||
#define CCK_FUSE_HPLL_FREQ_MASK 0x3
|
||||
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
|
||||
index 01966b89be14..177b6caa0a38 100644
|
||||
--- a/drivers/gpu/drm/i915/intel_pm.c
|
||||
+++ b/drivers/gpu/drm/i915/intel_pm.c
|
||||
@@ -6096,8 +6096,11 @@ static void gen6_set_rps_thresholds(struct drm_i915_private *dev_priv, u8 val)
|
||||
/* When byt can survive without system hang with dynamic
|
||||
* sw freq adjustments, this restriction can be lifted.
|
||||
*/
|
||||
- if (IS_VALLEYVIEW(dev_priv))
|
||||
+ if (IS_VALLEYVIEW(dev_priv)) {
|
||||
+ threshold_up = VLV_RP_UP_EI_THRESHOLD;
|
||||
+ threshold_down = VLV_RP_DOWN_EI_THRESHOLD;
|
||||
goto skip_hw_write;
|
||||
+ }
|
||||
|
||||
I915_WRITE(GEN6_RP_UP_EI,
|
||||
GT_INTERVAL_FROM_US(dev_priv, ei_up));
|
||||
--
|
||||
2.14.3
|
||||
|
|
@ -1,53 +0,0 @@
|
|||
From 945d0eb39d8920854c72ecb743c07d54b738cf7f Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Thu, 9 Nov 2017 14:21:24 +0100
|
||||
Subject: [PATCH v3 2/2] intel_idle: Disable C6N and C6S on Bay Trail
|
||||
|
||||
It seems that Bay Trail SoCs sometimes have issues waking from C6,
|
||||
a lot of users even report Bay Trail devices only being stable
|
||||
when passing intel_idle.max_cstate=1 to the kernel.
|
||||
|
||||
This commits disables the C6 states while leaving the C7 states
|
||||
available so that the cores can still reach deep sleep states.
|
||||
|
||||
There are several indicators that this is part of the solution for
|
||||
all the users who need to pass intel_idle.max_cstate=1:
|
||||
|
||||
1) The "VLP52 EOI Transactions May Not be Sent if Software
|
||||
Enters Core C6 During an Interrupt Service Routine" errata.
|
||||
|
||||
2) Several users who need intel_idle.max_cstate=1 indicate in bko109051
|
||||
(which has over 800 comments!) that using a shell script which
|
||||
disables C6N and C6S through sysfs allows them to remove
|
||||
intel_idle.max_cstate=1 and still have a stable system which does
|
||||
use the C7 states for power-saving.
|
||||
|
||||
BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=109051
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
---
|
||||
drivers/idle/intel_idle.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/drivers/idle/intel_idle.c b/drivers/idle/intel_idle.c
|
||||
index 5dc7ea4b6bc4..fe05984c9e81 100644
|
||||
--- a/drivers/idle/intel_idle.c
|
||||
+++ b/drivers/idle/intel_idle.c
|
||||
@@ -221,6 +221,7 @@ static struct cpuidle_state byt_cstates[] = {
|
||||
.flags = MWAIT2flg(0x58) | CPUIDLE_FLAG_TLB_FLUSHED,
|
||||
.exit_latency = 300,
|
||||
.target_residency = 275,
|
||||
+ .disabled = true,
|
||||
.enter = &intel_idle,
|
||||
.enter_s2idle = intel_idle_s2idle, },
|
||||
{
|
||||
@@ -229,6 +230,7 @@ static struct cpuidle_state byt_cstates[] = {
|
||||
.flags = MWAIT2flg(0x52) | CPUIDLE_FLAG_TLB_FLUSHED,
|
||||
.exit_latency = 500,
|
||||
.target_residency = 560,
|
||||
+ .disabled = true,
|
||||
.enter = &intel_idle,
|
||||
.enter_s2idle = intel_idle_s2idle, },
|
||||
{
|
||||
--
|
||||
2.14.3
|
||||
|
|
@ -1,24 +0,0 @@
|
|||
diff -Naur linux-2.6.23-rc9.orig/arch/i386/boot/tty.c linux-2.6.23-rc9/arch/i386/boot/tty.c
|
||||
--- linux-2.6.23-rc9.orig/arch/x86/boot/tty.c 2007-10-06 12:26:14.000000000 +0200
|
||||
+++ linux-2.6.23-rc9/arch/x86/boot/tty.c 2007-10-06 12:37:47.000000000 +0200
|
||||
@@ -92,7 +92,7 @@
|
||||
|
||||
int getchar_timeout(void)
|
||||
{
|
||||
- int cnt = 30;
|
||||
+ int cnt = 3;
|
||||
int t0, t1;
|
||||
|
||||
t0 = gettime();
|
||||
diff -Naur linux-2.6.23-rc9.orig/arch/i386/boot/video.c linux-2.6.23-rc9/arch/i386/boot/video.c
|
||||
--- linux-2.6.23-rc9.orig/arch/x86/boot/video.c 2007-10-06 12:26:14.000000000 +0200
|
||||
+++ linux-2.6.23-rc9/arch/x86/boot/video.c 2007-10-06 12:36:05.000000000 +0200
|
||||
@@ -329,7 +329,7 @@
|
||||
unsigned int sel;
|
||||
|
||||
puts("Press <ENTER> to see video modes available, "
|
||||
- "<SPACE> to continue, or wait 30 sec\n");
|
||||
+ "<SPACE> to continue, or wait 3 sec\n");
|
||||
|
||||
kbd_flush();
|
||||
while (1) {
|
|
@ -1,30 +0,0 @@
|
|||
From 4ff58b642f80dedb20533978123d89b5ac9b1ed5 Mon Sep 17 00:00:00 2001
|
||||
From: Kyle McMartin <kyle@phobos.i.jkkm.org>
|
||||
Date: Tue, 30 Mar 2010 00:04:29 -0400
|
||||
Subject: die-floppy-die
|
||||
|
||||
Kill the floppy.ko pnp modalias. We were surviving just fine without
|
||||
autoloading floppy drivers, tyvm.
|
||||
|
||||
Please feel free to register all complaints in the wastepaper bin.
|
||||
---
|
||||
drivers/block/floppy.c | 3 +--
|
||||
1 files changed, 1 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c
|
||||
index 90c4038..f4a0b90 100644
|
||||
--- a/drivers/block/floppy.c
|
||||
+++ b/drivers/block/floppy.c
|
||||
@@ -4619,8 +4619,7 @@ static const struct pnp_device_id floppy_pnpids[] = {
|
||||
{"PNP0700", 0},
|
||||
{}
|
||||
};
|
||||
-
|
||||
-MODULE_DEVICE_TABLE(pnp, floppy_pnpids);
|
||||
+/* MODULE_DEVICE_TABLE(pnp, floppy_pnpids); */
|
||||
|
||||
#else
|
||||
|
||||
--
|
||||
1.7.0.1
|
||||
|
|
@ -1,59 +0,0 @@
|
|||
From 2a79554c864ac58fa2ad982f0fcee2cc2aa33eb5 Mon Sep 17 00:00:00 2001
|
||||
From: Bastien Nocera <hadess@hadess.net>
|
||||
Date: Thu, 20 May 2010 10:30:31 -0400
|
||||
Subject: Disable i8042 checks on Intel Apple Macs
|
||||
|
||||
As those computers never had any i8042 controllers, and the
|
||||
current lookup code could potentially lock up/hang/wait for
|
||||
timeout for long periods of time.
|
||||
|
||||
Fixes intermittent hangs on boot on a MacbookAir1,1
|
||||
|
||||
Signed-off-by: Bastien Nocera <hadess@hadess.net>
|
||||
---
|
||||
drivers/input/serio/i8042.c | 22 ++++++++++++++++++++++
|
||||
1 files changed, 22 insertions(+), 0 deletions(-)
|
||||
|
||||
diff --git a/drivers/input/serio/i8042.c b/drivers/input/serio/i8042.c
|
||||
index 6440a8f..4d7cf98 100644
|
||||
--- a/drivers/input/serio/i8042.c
|
||||
+++ b/drivers/input/serio/i8042.c
|
||||
@@ -1451,6 +1451,22 @@ static struct platform_driver i8042_driver = {
|
||||
.shutdown = i8042_shutdown,
|
||||
};
|
||||
|
||||
+#ifdef CONFIG_DMI
|
||||
+static struct dmi_system_id __initdata dmi_system_table[] = {
|
||||
+ {
|
||||
+ .matches = {
|
||||
+ DMI_MATCH(DMI_BIOS_VENDOR, "Apple Computer, Inc.")
|
||||
+ },
|
||||
+ },
|
||||
+ {
|
||||
+ .matches = {
|
||||
+ DMI_MATCH(DMI_BIOS_VENDOR, "Apple Inc.")
|
||||
+ },
|
||||
+ },
|
||||
+ {}
|
||||
+};
|
||||
+#endif /*CONFIG_DMI*/
|
||||
+
|
||||
static int __init i8042_init(void)
|
||||
{
|
||||
struct platform_device *pdev;
|
||||
@@ -1458,6 +1474,12 @@ static int __init i8042_init(void)
|
||||
|
||||
dbg_init();
|
||||
|
||||
+#ifdef CONFIG_DMI
|
||||
+ /* Intel Apple Macs never have an i8042 controller */
|
||||
+ if (dmi_check_system(dmi_system_table) > 0)
|
||||
+ return -ENODEV;
|
||||
+#endif /*CONFIG_DMI*/
|
||||
+
|
||||
err = i8042_platform_init();
|
||||
if (err)
|
||||
return err;
|
||||
--
|
||||
1.7.0.1
|
||||
|
|
@ -1,58 +0,0 @@
|
|||
diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c
|
||||
index e6cfd32..7aa0ff0 100644
|
||||
--- a/drivers/hid/usbhid/hid-quirks.c
|
||||
+++ b/drivers/hid/usbhid/hid-quirks.c
|
||||
@@ -163,6 +163,53 @@ static const struct hid_blacklist {
|
||||
{ USB_VENDOR_ID_DRACAL_RAPHNET, USB_DEVICE_ID_RAPHNET_2NES2SNES, HID_QUIRK_MULTI_INPUT },
|
||||
{ USB_VENDOR_ID_DRACAL_RAPHNET, USB_DEVICE_ID_RAPHNET_4NES4SNES, HID_QUIRK_MULTI_INPUT },
|
||||
|
||||
+// Juyao
|
||||
+ { 0x0314,0x0326,0x040 },
|
||||
+ { 0x0314,0x0328,0x040 },
|
||||
+
|
||||
+// 4NES4SNES
|
||||
+ { 0x1781,0x0A9D,0x040 },
|
||||
+
|
||||
+// Retrolink SNES
|
||||
+ { 0x1292,0x5346,0x040 },
|
||||
+ { 0x1292,0x5366,0x040 },
|
||||
+
|
||||
+// Retrobit Atari to USB Driver
|
||||
+ { 0x1292,0x4154,0x040 },
|
||||
+
|
||||
+// Retrobit Genesis to PC USB Adapter
|
||||
+ { 0x1292,0x4745,0x040 },
|
||||
+
|
||||
+// Retrode
|
||||
+ { 0x0403,0x97c1,0x040 },
|
||||
+
|
||||
+// HuiJia USB GamePad Mayflash Sega Saturn
|
||||
+ { 0x0e8f,0x3010,0x040 },
|
||||
+
|
||||
+// HuiJia USB GamePad Mayflash NES SNES
|
||||
+ { 0x0079,0x1804,0x040 },
|
||||
+
|
||||
+// Mayflash Dreamcast
|
||||
+ { 0x0e8f,0x3013,0x040 },
|
||||
+
|
||||
+// Xin-Mo 2players 20pins
|
||||
+ { 0x16c0,0x75e1,0x040 },
|
||||
+
|
||||
+// Xinmo 18 pins USB THT 2P arcade controller THT 2P arcade controller
|
||||
+ { 0x16c0,0x05e1,0x040 },
|
||||
+
|
||||
+// USB PS2 Adapter GreenAsia Electronics
|
||||
+ { 0xe8f,0x1013,0x040 },
|
||||
+
|
||||
+// HuiJia USB GamePad Mayflash N64 - need test
|
||||
+ { 0xe8f,0x3013,0x040 },
|
||||
+
|
||||
+// XCSOURCE 2 Encoder USB - Twin USB Gamepad
|
||||
+ { 0x810,0xe001,0x040 },
|
||||
+
|
||||
+// 3H Dual Arcade 2Players
|
||||
+ { 0x16c0,0x05e0,0x040 },
|
||||
+
|
||||
{ 0, 0 }
|
||||
};
|
||||
|
|
@ -1,206 +0,0 @@
|
|||
commit 5a596921a4636e62843a59b7eab7b87b70a6d296
|
||||
Author: Lukas Rusak <lorusak@gmail.com>
|
||||
Date: Sun May 6 22:03:11 2018 -0700
|
||||
|
||||
HID: add ouya HID driver
|
||||
|
||||
This driver is a simple implementation to get the controller working and mapped properly.
|
||||
This driver does not include functionality for the touchpad (yet). The original driver
|
||||
was taken from from the ouya linux tree and has been simplified. It seems there may have
|
||||
been other versions of the controller present that had a broken report descriptor. I have
|
||||
removed that for now.
|
||||
|
||||
diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig
|
||||
index 60252fd796f6..6be2c454e72e 100644
|
||||
--- a/drivers/hid/Kconfig
|
||||
+++ b/drivers/hid/Kconfig
|
||||
@@ -659,6 +659,12 @@ config HID_ORTEK
|
||||
- Ortek WKB-2000
|
||||
- Skycable wireless presenter
|
||||
|
||||
+config HID_OUYA
|
||||
+ tristate "OUYA Game Controller"
|
||||
+ depends on USB_HID
|
||||
+ ---help---
|
||||
+ Support for OUYA Game Controller.
|
||||
+
|
||||
config HID_PANTHERLORD
|
||||
tristate "Pantherlord/GreenAsia game controller"
|
||||
depends on HID
|
||||
diff --git a/drivers/hid/Makefile b/drivers/hid/Makefile
|
||||
index 17a8bd97da9d..4425890934e4 100644
|
||||
--- a/drivers/hid/Makefile
|
||||
+++ b/drivers/hid/Makefile
|
||||
@@ -71,6 +71,7 @@ obj-$(CONFIG_HID_MULTITOUCH) += hid-multitouch.o
|
||||
obj-$(CONFIG_HID_NTI) += hid-nti.o
|
||||
obj-$(CONFIG_HID_NTRIG) += hid-ntrig.o
|
||||
obj-$(CONFIG_HID_ORTEK) += hid-ortek.o
|
||||
+obj-$(CONFIG_HID_OUYA) += hid-ouya.o
|
||||
obj-$(CONFIG_HID_PRODIKEYS) += hid-prodikeys.o
|
||||
obj-$(CONFIG_HID_PANTHERLORD) += hid-pl.o
|
||||
obj-$(CONFIG_HID_PENMOUNT) += hid-penmount.o
|
||||
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
|
||||
index 0b5cc910f62e..0528efb825fa 100644
|
||||
--- a/drivers/hid/hid-ids.h
|
||||
+++ b/drivers/hid/hid-ids.h
|
||||
@@ -859,6 +859,9 @@
|
||||
#define USB_DEVICE_ID_ORTEK_WKB2000 0x2000
|
||||
#define USB_DEVICE_ID_ORTEK_IHOME_IMAC_A210S 0x8003
|
||||
|
||||
+#define USB_VENDOR_ID_OUYA 0x2836
|
||||
+#define USB_DEVICE_ID_OUYA_CONTROLLER 0x0001
|
||||
+
|
||||
#define USB_VENDOR_ID_PLANTRONICS 0x047f
|
||||
|
||||
#define USB_VENDOR_ID_PANASONIC 0x04da
|
||||
diff --git a/drivers/hid/hid-ouya.c b/drivers/hid/hid-ouya.c
|
||||
new file mode 100644
|
||||
index 000000000000..4344a47b40af
|
||||
--- /dev/null
|
||||
+++ b/drivers/hid/hid-ouya.c
|
||||
@@ -0,0 +1,131 @@
|
||||
+/*
|
||||
+ * HID driver for OUYA Game Controller(s)
|
||||
+ *
|
||||
+ * Copyright (c) 2013 OUYA
|
||||
+ * Copyright (c) 2013 Gregorios Leach <optikflux@gmail.com>
|
||||
+ * Copyright (c) 2018 Lukas Rusak <lorusak@gmail.com>
|
||||
+ */
|
||||
+
|
||||
+#include <linux/device.h>
|
||||
+#include <linux/hid.h>
|
||||
+#include <linux/input.h>
|
||||
+#include <linux/module.h>
|
||||
+
|
||||
+#include "hid-ids.h"
|
||||
+
|
||||
+static const unsigned int ouya_absmap[] = {
|
||||
+ [0x30] = ABS_X, /* left stick X */
|
||||
+ [0x31] = ABS_Y, /* left stick Y */
|
||||
+ [0x32] = ABS_Z, /* L2 */
|
||||
+ [0x33] = ABS_RX, /* right stick X */
|
||||
+ [0x34] = ABS_RY, /* right stick Y */
|
||||
+ [0x35] = ABS_RZ, /* R2 */
|
||||
+};
|
||||
+
|
||||
+static const unsigned int ouya_keymap[] = {
|
||||
+ [0x1] = BTN_SOUTH, /* O */
|
||||
+ [0x2] = BTN_WEST, /* U */
|
||||
+ [0x3] = BTN_NORTH, /* Y */
|
||||
+ [0x4] = BTN_EAST, /* A */
|
||||
+ [0x5] = BTN_TL, /* L1 */
|
||||
+ [0x6] = BTN_TR, /* R1 */
|
||||
+ [0x7] = BTN_THUMBL, /* L3 */
|
||||
+ [0x8] = BTN_THUMBR, /* R3 */
|
||||
+ [0x9] = BTN_DPAD_UP, /* Up */
|
||||
+ [0xa] = BTN_DPAD_DOWN, /* Down */
|
||||
+ [0xb] = BTN_DPAD_LEFT, /* Left */
|
||||
+ [0xc] = BTN_DPAD_RIGHT, /* Right */
|
||||
+ [0xd] = BTN_TL2, /* L2 */
|
||||
+ [0xe] = BTN_TR2, /* R2 */
|
||||
+ [0xf] = BTN_MODE, /* Power */
|
||||
+};
|
||||
+
|
||||
+static int ouya_input_mapping(struct hid_device *hdev, struct hid_input *hi,
|
||||
+ struct hid_field *field, struct hid_usage *usage,
|
||||
+ unsigned long **bit, int *max)
|
||||
+{
|
||||
+ if ((usage->hid & HID_USAGE_PAGE) == HID_UP_BUTTON) {
|
||||
+ unsigned int key = usage->hid & HID_USAGE;
|
||||
+
|
||||
+ if (key >= ARRAY_SIZE(ouya_keymap))
|
||||
+ return -1;
|
||||
+
|
||||
+ key = ouya_keymap[key];
|
||||
+ hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key);
|
||||
+
|
||||
+ return 1;
|
||||
+
|
||||
+ } else if ((usage->hid & HID_USAGE_PAGE) == HID_UP_GENDESK) {
|
||||
+ unsigned int abs = usage->hid & HID_USAGE;
|
||||
+
|
||||
+ if (abs >= ARRAY_SIZE(ouya_absmap))
|
||||
+ return -1;
|
||||
+
|
||||
+ abs = ouya_absmap[abs];
|
||||
+ hid_map_usage_clear(hi, usage, bit, max, EV_ABS, abs);
|
||||
+
|
||||
+ return 1;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int ouya_probe(struct hid_device *hdev, const struct hid_device_id *id)
|
||||
+{
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = hid_parse(hdev);
|
||||
+ if (ret) {
|
||||
+ hid_err(hdev, "parse failed\n");
|
||||
+ goto err_free;
|
||||
+ }
|
||||
+
|
||||
+ ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT | HID_CONNECT_HIDDEV_FORCE);
|
||||
+ if (ret) {
|
||||
+ hid_err(hdev, "hw start failed\n");
|
||||
+ goto err_free;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+
|
||||
+err_free:
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static void ouya_remove(struct hid_device *hdev)
|
||||
+{
|
||||
+ hid_hw_stop(hdev);
|
||||
+ kfree(hid_get_drvdata(hdev));
|
||||
+}
|
||||
+
|
||||
+static const struct hid_device_id ouya_devices[] = {
|
||||
+ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_OUYA, USB_DEVICE_ID_OUYA_CONTROLLER) },
|
||||
+ { }
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(hid, ouya_devices);
|
||||
+
|
||||
+static struct hid_driver ouya_driver = {
|
||||
+ .name = "ouya",
|
||||
+ .id_table = ouya_devices,
|
||||
+ .input_mapping = ouya_input_mapping,
|
||||
+ .probe = ouya_probe,
|
||||
+ .remove = ouya_remove,
|
||||
+};
|
||||
+
|
||||
+static int __init ouya_init(void)
|
||||
+{
|
||||
+ return hid_register_driver(&ouya_driver);
|
||||
+}
|
||||
+
|
||||
+static void __exit ouya_exit(void)
|
||||
+{
|
||||
+ hid_unregister_driver(&ouya_driver);
|
||||
+}
|
||||
+
|
||||
+module_init(ouya_init);
|
||||
+module_exit(ouya_exit);
|
||||
+
|
||||
+MODULE_LICENSE("GPL");
|
||||
+MODULE_AUTHOR("Lukas Rusak <lorusak@gmail.com>");
|
||||
+MODULE_AUTHOR("Gregorios Leach <optikflux@gmail.com>");
|
||||
+MODULE_DESCRIPTION("Ouya Controller Driver");
|
||||
diff --git a/drivers/hid/hid-quirks.c b/drivers/hid/hid-quirks.c
|
||||
index 587e2681a53f..b5adc13e0df1 100644
|
||||
--- a/drivers/hid/hid-quirks.c
|
||||
+++ b/drivers/hid/hid-quirks.c
|
||||
@@ -538,6 +538,9 @@ static const struct hid_device_id hid_have_special_driver[] = {
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ORTEK, USB_DEVICE_ID_ORTEK_IHOME_IMAC_A210S) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_SKYCABLE, USB_DEVICE_ID_SKYCABLE_WIRELESS_PRESENTER) },
|
||||
#endif
|
||||
+#if IS_ENABLED(CONFIG_HID_OUYA)
|
||||
+ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_OUYA, USB_DEVICE_ID_OUYA_CONTROLLER) },
|
||||
+#endif
|
||||
#if IS_ENABLED(CONFIG_HID_PANTHERLORD)
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PSX_ADAPTOR) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PCS_ADAPTOR) },
|
|
@ -1,466 +0,0 @@
|
|||
From 4d331d301222dc0585ab8864a842b3e460b1f744 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Valentin <benpicco@googlemail.com>
|
||||
Date: Thu, 4 Oct 2018 02:57:10 +0200
|
||||
Subject: [PATCH] media: rc: add driver for Xbox DVD Movie Playback Kit
|
||||
|
||||
The Xbox DVD Movie Playback Kit is a USB dongle with an IR remote for the
|
||||
Original Xbox.
|
||||
|
||||
Historically it has been supported by the out-of-tree lirc_xbox driver,
|
||||
but this one has fallen out of favour and was just dropped from popular
|
||||
Kodi (formerly XBMC) distributions.
|
||||
|
||||
This driver is heaviely based on the ati_remote driver where all the
|
||||
boilerplate was taken from - I was mostly just removing code.
|
||||
|
||||
Signed-off-by: Benjamin Valentin <benpicco@googlemail.com>
|
||||
Signed-off-by: Sean Young <sean@mess.org>
|
||||
---
|
||||
drivers/media/rc/Kconfig | 12 +
|
||||
drivers/media/rc/Makefile | 1 +
|
||||
drivers/media/rc/keymaps/Makefile | 1 +
|
||||
drivers/media/rc/keymaps/rc-xbox-dvd.c | 63 +++++
|
||||
drivers/media/rc/xbox_remote.c | 306 +++++++++++++++++++++++++
|
||||
include/media/rc-map.h | 1 +
|
||||
6 files changed, 384 insertions(+)
|
||||
create mode 100644 drivers/media/rc/keymaps/rc-xbox-dvd.c
|
||||
create mode 100644 drivers/media/rc/xbox_remote.c
|
||||
|
||||
diff --git a/drivers/media/rc/Kconfig b/drivers/media/rc/Kconfig
|
||||
index 1021c08a9ba4..8a216068a35a 100644
|
||||
--- a/drivers/media/rc/Kconfig
|
||||
+++ b/drivers/media/rc/Kconfig
|
||||
@@ -493,6 +493,18 @@ config IR_TANGO
|
||||
The HW decoder supports NEC, RC-5, RC-6 IR protocols.
|
||||
When compiled as a module, look for tango-ir.
|
||||
|
||||
+config RC_XBOX_DVD
|
||||
+ tristate "Xbox DVD Movie Playback Kit"
|
||||
+ depends on RC_CORE
|
||||
+ depends on USB_ARCH_HAS_HCD
|
||||
+ select USB
|
||||
+ help
|
||||
+ Say Y here if you want to use the Xbox DVD Movie Playback Kit.
|
||||
+ These are IR remotes with USB receivers for the Original Xbox (2001).
|
||||
+
|
||||
+ To compile this driver as a module, choose M here: the module will be
|
||||
+ called xbox_remote.
|
||||
+
|
||||
config IR_ZX
|
||||
tristate "ZTE ZX IR remote control"
|
||||
depends on RC_CORE
|
||||
diff --git a/drivers/media/rc/Makefile b/drivers/media/rc/Makefile
|
||||
index e0340d043fe8..92c163816849 100644
|
||||
--- a/drivers/media/rc/Makefile
|
||||
+++ b/drivers/media/rc/Makefile
|
||||
@@ -48,3 +48,4 @@ obj-$(CONFIG_IR_SIR) += sir_ir.o
|
||||
obj-$(CONFIG_IR_MTK) += mtk-cir.o
|
||||
obj-$(CONFIG_IR_ZX) += zx-irdec.o
|
||||
obj-$(CONFIG_IR_TANGO) += tango-ir.o
|
||||
+obj-$(CONFIG_RC_XBOX_DVD) += xbox_remote.o
|
||||
diff --git a/drivers/media/rc/keymaps/Makefile b/drivers/media/rc/keymaps/Makefile
|
||||
index d6b913a3032d..5b1399af6b3a 100644
|
||||
--- a/drivers/media/rc/keymaps/Makefile
|
||||
+++ b/drivers/media/rc/keymaps/Makefile
|
||||
@@ -116,4 +116,5 @@ obj-$(CONFIG_RC_MAP) += rc-adstech-dvb-t-pci.o \
|
||||
rc-winfast.o \
|
||||
rc-winfast-usbii-deluxe.o \
|
||||
rc-su3000.o \
|
||||
+ rc-xbox-dvd.o \
|
||||
rc-zx-irdec.o
|
||||
diff --git a/drivers/media/rc/keymaps/rc-xbox-dvd.c b/drivers/media/rc/keymaps/rc-xbox-dvd.c
|
||||
new file mode 100644
|
||||
index 000000000000..af387244636b
|
||||
--- /dev/null
|
||||
+++ b/drivers/media/rc/keymaps/rc-xbox-dvd.c
|
||||
@@ -0,0 +1,63 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0+
|
||||
+// Keytable for Xbox DVD remote
|
||||
+// Copyright (c) 2018 by Benjamin Valentin <benpicco@googlemail.com>
|
||||
+
|
||||
+#include <media/rc-map.h>
|
||||
+#include <linux/module.h>
|
||||
+
|
||||
+/* based on lircd.conf.xbox */
|
||||
+static struct rc_map_table xbox_dvd[] = {
|
||||
+ {0xa0b, KEY_OK},
|
||||
+ {0xaa6, KEY_UP},
|
||||
+ {0xaa7, KEY_DOWN},
|
||||
+ {0xaa8, KEY_RIGHT},
|
||||
+ {0xaa9, KEY_LEFT},
|
||||
+ {0xac3, KEY_INFO},
|
||||
+
|
||||
+ {0xac6, KEY_9},
|
||||
+ {0xac7, KEY_8},
|
||||
+ {0xac8, KEY_7},
|
||||
+ {0xac9, KEY_6},
|
||||
+ {0xaca, KEY_5},
|
||||
+ {0xacb, KEY_4},
|
||||
+ {0xacc, KEY_3},
|
||||
+ {0xacd, KEY_2},
|
||||
+ {0xace, KEY_1},
|
||||
+ {0xacf, KEY_0},
|
||||
+
|
||||
+ {0xad5, KEY_ANGLE},
|
||||
+ {0xad8, KEY_BACK},
|
||||
+ {0xadd, KEY_PREVIOUSSONG},
|
||||
+ {0xadf, KEY_NEXTSONG},
|
||||
+ {0xae0, KEY_STOP},
|
||||
+ {0xae2, KEY_REWIND},
|
||||
+ {0xae3, KEY_FASTFORWARD},
|
||||
+ {0xae5, KEY_TITLE},
|
||||
+ {0xae6, KEY_PAUSE},
|
||||
+ {0xaea, KEY_PLAY},
|
||||
+ {0xaf7, KEY_MENU},
|
||||
+};
|
||||
+
|
||||
+static struct rc_map_list xbox_dvd_map = {
|
||||
+ .map = {
|
||||
+ .scan = xbox_dvd,
|
||||
+ .size = ARRAY_SIZE(xbox_dvd),
|
||||
+ .rc_proto = RC_PROTO_UNKNOWN,
|
||||
+ .name = RC_MAP_XBOX_DVD,
|
||||
+ }
|
||||
+};
|
||||
+
|
||||
+static int __init init_rc_map(void)
|
||||
+{
|
||||
+ return rc_map_register(&xbox_dvd_map);
|
||||
+}
|
||||
+
|
||||
+static void __exit exit_rc_map(void)
|
||||
+{
|
||||
+ rc_map_unregister(&xbox_dvd_map);
|
||||
+}
|
||||
+
|
||||
+module_init(init_rc_map)
|
||||
+module_exit(exit_rc_map)
|
||||
+
|
||||
+MODULE_LICENSE("GPL");
|
||||
diff --git a/drivers/media/rc/xbox_remote.c b/drivers/media/rc/xbox_remote.c
|
||||
new file mode 100644
|
||||
index 000000000000..07ed9be24a60
|
||||
--- /dev/null
|
||||
+++ b/drivers/media/rc/xbox_remote.c
|
||||
@@ -0,0 +1,306 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0+
|
||||
+// Driver for Xbox DVD Movie Playback Kit
|
||||
+// Copyright (c) 2018 by Benjamin Valentin <benpicco@googlemail.com>
|
||||
+
|
||||
+/*
|
||||
+ * Xbox DVD Movie Playback Kit USB IR dongle support
|
||||
+ *
|
||||
+ * The driver was derived from the ati_remote driver 2.2.1
|
||||
+ * and used information from lirc_xbox.c
|
||||
+ *
|
||||
+ * Copyright (c) 2011, 2012 Anssi Hannula <anssi.hannula@iki.fi>
|
||||
+ * Copyright (c) 2004 Torrey Hoffman <thoffman@arnor.net>
|
||||
+ * Copyright (c) 2002 Vladimir Dergachev
|
||||
+ * Copyright (c) 2003-2004 Paul Miller <pmiller9@users.sourceforge.net>
|
||||
+ */
|
||||
+
|
||||
+#include <linux/slab.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/usb/input.h>
|
||||
+#include <media/rc-core.h>
|
||||
+
|
||||
+/*
|
||||
+ * Module and Version Information
|
||||
+ */
|
||||
+#define DRIVER_VERSION "1.0.0"
|
||||
+#define DRIVER_AUTHOR "Benjamin Valentin <benpicco@googlemail.com>"
|
||||
+#define DRIVER_DESC "Xbox DVD USB Remote Control"
|
||||
+
|
||||
+#define NAME_BUFSIZE 80 /* size of product name, path buffers */
|
||||
+#define DATA_BUFSIZE 8 /* size of URB data buffers */
|
||||
+
|
||||
+/*
|
||||
+ * USB vendor ids for XBOX DVD Dongles
|
||||
+ */
|
||||
+#define VENDOR_GAMESTER 0x040b
|
||||
+#define VENDOR_MICROSOFT 0x045e
|
||||
+
|
||||
+static const struct usb_device_id xbox_remote_table[] = {
|
||||
+ /* Gamester Xbox DVD Movie Playback Kit IR */
|
||||
+ {
|
||||
+ USB_DEVICE(VENDOR_GAMESTER, 0x6521),
|
||||
+ },
|
||||
+ /* Microsoft Xbox DVD Movie Playback Kit IR */
|
||||
+ {
|
||||
+ USB_DEVICE(VENDOR_MICROSOFT, 0x0284),
|
||||
+ },
|
||||
+ {} /* Terminating entry */
|
||||
+};
|
||||
+
|
||||
+MODULE_DEVICE_TABLE(usb, xbox_remote_table);
|
||||
+
|
||||
+struct xbox_remote {
|
||||
+ struct rc_dev *rdev;
|
||||
+ struct usb_device *udev;
|
||||
+ struct usb_interface *interface;
|
||||
+
|
||||
+ struct urb *irq_urb;
|
||||
+ unsigned char inbuf[DATA_BUFSIZE] __aligned(sizeof(u16));
|
||||
+
|
||||
+ char rc_name[NAME_BUFSIZE];
|
||||
+ char rc_phys[NAME_BUFSIZE];
|
||||
+};
|
||||
+
|
||||
+static int xbox_remote_rc_open(struct rc_dev *rdev)
|
||||
+{
|
||||
+ struct xbox_remote *xbox_remote = rdev->priv;
|
||||
+
|
||||
+ /* On first open, submit the read urb which was set up previously. */
|
||||
+ xbox_remote->irq_urb->dev = xbox_remote->udev;
|
||||
+ if (usb_submit_urb(xbox_remote->irq_urb, GFP_KERNEL)) {
|
||||
+ dev_err(&xbox_remote->interface->dev,
|
||||
+ "%s: usb_submit_urb failed!\n", __func__);
|
||||
+ return -EIO;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static void xbox_remote_rc_close(struct rc_dev *rdev)
|
||||
+{
|
||||
+ struct xbox_remote *xbox_remote = rdev->priv;
|
||||
+
|
||||
+ usb_kill_urb(xbox_remote->irq_urb);
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * xbox_remote_report_input
|
||||
+ */
|
||||
+static void xbox_remote_input_report(struct urb *urb)
|
||||
+{
|
||||
+ struct xbox_remote *xbox_remote = urb->context;
|
||||
+ unsigned char *data = xbox_remote->inbuf;
|
||||
+
|
||||
+ /*
|
||||
+ * data[0] = 0x00
|
||||
+ * data[1] = length - always 0x06
|
||||
+ * data[2] = the key code
|
||||
+ * data[3] = high part of key code
|
||||
+ * data[4] = last_press_ms (low)
|
||||
+ * data[5] = last_press_ms (high)
|
||||
+ */
|
||||
+
|
||||
+ /* Deal with strange looking inputs */
|
||||
+ if (urb->actual_length != 6 || urb->actual_length != data[1]) {
|
||||
+ dev_warn(&urb->dev->dev, "Weird data, len=%d: %*ph\n",
|
||||
+ urb->actual_length, urb->actual_length, data);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ rc_keydown(xbox_remote->rdev, RC_PROTO_UNKNOWN,
|
||||
+ le16_to_cpup((__le16*)(data + 2)), 0);
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * xbox_remote_irq_in
|
||||
+ */
|
||||
+static void xbox_remote_irq_in(struct urb *urb)
|
||||
+{
|
||||
+ struct xbox_remote *xbox_remote = urb->context;
|
||||
+ int retval;
|
||||
+
|
||||
+ switch (urb->status) {
|
||||
+ case 0: /* success */
|
||||
+ xbox_remote_input_report(urb);
|
||||
+ break;
|
||||
+ case -ECONNRESET: /* unlink */
|
||||
+ case -ENOENT:
|
||||
+ case -ESHUTDOWN:
|
||||
+ dev_dbg(&xbox_remote->interface->dev,
|
||||
+ "%s: urb error status, unlink?\n",
|
||||
+ __func__);
|
||||
+ return;
|
||||
+ default: /* error */
|
||||
+ dev_dbg(&xbox_remote->interface->dev,
|
||||
+ "%s: Nonzero urb status %d\n",
|
||||
+ __func__, urb->status);
|
||||
+ }
|
||||
+
|
||||
+ retval = usb_submit_urb(urb, GFP_ATOMIC);
|
||||
+ if (retval)
|
||||
+ dev_err(&xbox_remote->interface->dev,
|
||||
+ "%s: usb_submit_urb()=%d\n",
|
||||
+ __func__, retval);
|
||||
+}
|
||||
+
|
||||
+static void xbox_remote_rc_init(struct xbox_remote *xbox_remote)
|
||||
+{
|
||||
+ struct rc_dev *rdev = xbox_remote->rdev;
|
||||
+
|
||||
+ rdev->priv = xbox_remote;
|
||||
+ rdev->allowed_protocols = RC_PROTO_BIT_UNKNOWN;
|
||||
+ rdev->driver_name = "xbox_remote";
|
||||
+
|
||||
+ rdev->open = xbox_remote_rc_open;
|
||||
+ rdev->close = xbox_remote_rc_close;
|
||||
+
|
||||
+ rdev->device_name = xbox_remote->rc_name;
|
||||
+ rdev->input_phys = xbox_remote->rc_phys;
|
||||
+
|
||||
+ usb_to_input_id(xbox_remote->udev, &rdev->input_id);
|
||||
+ rdev->dev.parent = &xbox_remote->interface->dev;
|
||||
+}
|
||||
+
|
||||
+static int xbox_remote_initialize(struct xbox_remote *xbox_remote,
|
||||
+ struct usb_endpoint_descriptor *endpoint_in)
|
||||
+{
|
||||
+ struct usb_device *udev = xbox_remote->udev;
|
||||
+ int pipe, maxp;
|
||||
+
|
||||
+ /* Set up irq_urb */
|
||||
+ pipe = usb_rcvintpipe(udev, endpoint_in->bEndpointAddress);
|
||||
+ maxp = usb_maxpacket(udev, pipe, usb_pipeout(pipe));
|
||||
+ maxp = (maxp > DATA_BUFSIZE) ? DATA_BUFSIZE : maxp;
|
||||
+
|
||||
+ usb_fill_int_urb(xbox_remote->irq_urb, udev, pipe, xbox_remote->inbuf,
|
||||
+ maxp, xbox_remote_irq_in, xbox_remote,
|
||||
+ endpoint_in->bInterval);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * xbox_remote_probe
|
||||
+ */
|
||||
+static int xbox_remote_probe(struct usb_interface *interface,
|
||||
+ const struct usb_device_id *id)
|
||||
+{
|
||||
+ struct usb_device *udev = interface_to_usbdev(interface);
|
||||
+ struct usb_host_interface *iface_host = interface->cur_altsetting;
|
||||
+ struct usb_endpoint_descriptor *endpoint_in;
|
||||
+ struct xbox_remote *xbox_remote;
|
||||
+ struct rc_dev *rc_dev;
|
||||
+ int err = -ENOMEM;
|
||||
+
|
||||
+ // why is there also a device with no endpoints?
|
||||
+ if (iface_host->desc.bNumEndpoints == 0)
|
||||
+ return -ENODEV;
|
||||
+
|
||||
+ if (iface_host->desc.bNumEndpoints != 1) {
|
||||
+ pr_err("%s: Unexpected desc.bNumEndpoints: %d\n",
|
||||
+ __func__, iface_host->desc.bNumEndpoints);
|
||||
+ return -ENODEV;
|
||||
+ }
|
||||
+
|
||||
+ endpoint_in = &iface_host->endpoint[0].desc;
|
||||
+
|
||||
+ if (!usb_endpoint_is_int_in(endpoint_in)) {
|
||||
+ pr_err("%s: Unexpected endpoint_in\n", __func__);
|
||||
+ return -ENODEV;
|
||||
+ }
|
||||
+ if (le16_to_cpu(endpoint_in->wMaxPacketSize) == 0) {
|
||||
+ pr_err("%s: endpoint_in message size==0?\n", __func__);
|
||||
+ return -ENODEV;
|
||||
+ }
|
||||
+
|
||||
+ xbox_remote = kzalloc(sizeof(*xbox_remote), GFP_KERNEL);
|
||||
+ rc_dev = rc_allocate_device(RC_DRIVER_SCANCODE);
|
||||
+ if (!xbox_remote || !rc_dev)
|
||||
+ goto exit_free_dev_rdev;
|
||||
+
|
||||
+ /* Allocate URB buffer */
|
||||
+ xbox_remote->irq_urb = usb_alloc_urb(0, GFP_KERNEL);
|
||||
+ if (!xbox_remote->irq_urb)
|
||||
+ goto exit_free_buffers;
|
||||
+
|
||||
+ xbox_remote->udev = udev;
|
||||
+ xbox_remote->rdev = rc_dev;
|
||||
+ xbox_remote->interface = interface;
|
||||
+
|
||||
+ usb_make_path(udev, xbox_remote->rc_phys, sizeof(xbox_remote->rc_phys));
|
||||
+
|
||||
+ strlcat(xbox_remote->rc_phys, "/input0", sizeof(xbox_remote->rc_phys));
|
||||
+
|
||||
+ snprintf(xbox_remote->rc_name, sizeof(xbox_remote->rc_name), "%s%s%s",
|
||||
+ udev->manufacturer ?: "",
|
||||
+ udev->manufacturer && udev->product ? " " : "",
|
||||
+ udev->product ?: "");
|
||||
+
|
||||
+ if (!strlen(xbox_remote->rc_name))
|
||||
+ snprintf(xbox_remote->rc_name, sizeof(xbox_remote->rc_name),
|
||||
+ DRIVER_DESC "(%04x,%04x)",
|
||||
+ le16_to_cpu(xbox_remote->udev->descriptor.idVendor),
|
||||
+ le16_to_cpu(xbox_remote->udev->descriptor.idProduct));
|
||||
+
|
||||
+ rc_dev->map_name = RC_MAP_XBOX_DVD; /* default map */
|
||||
+
|
||||
+ xbox_remote_rc_init(xbox_remote);
|
||||
+
|
||||
+ /* Device Hardware Initialization */
|
||||
+ err = xbox_remote_initialize(xbox_remote, endpoint_in);
|
||||
+ if (err)
|
||||
+ goto exit_kill_urbs;
|
||||
+
|
||||
+ /* Set up and register rc device */
|
||||
+ err = rc_register_device(xbox_remote->rdev);
|
||||
+ if (err)
|
||||
+ goto exit_kill_urbs;
|
||||
+
|
||||
+ usb_set_intfdata(interface, xbox_remote);
|
||||
+
|
||||
+ return 0;
|
||||
+
|
||||
+exit_kill_urbs:
|
||||
+ usb_kill_urb(xbox_remote->irq_urb);
|
||||
+exit_free_buffers:
|
||||
+ usb_free_urb(xbox_remote->irq_urb);
|
||||
+exit_free_dev_rdev:
|
||||
+ rc_free_device(rc_dev);
|
||||
+ kfree(xbox_remote);
|
||||
+
|
||||
+ return err;
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * xbox_remote_disconnect
|
||||
+ */
|
||||
+static void xbox_remote_disconnect(struct usb_interface *interface)
|
||||
+{
|
||||
+ struct xbox_remote *xbox_remote;
|
||||
+
|
||||
+ xbox_remote = usb_get_intfdata(interface);
|
||||
+ usb_set_intfdata(interface, NULL);
|
||||
+ if (!xbox_remote) {
|
||||
+ dev_warn(&interface->dev, "%s - null device?\n", __func__);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ usb_kill_urb(xbox_remote->irq_urb);
|
||||
+ rc_unregister_device(xbox_remote->rdev);
|
||||
+ usb_free_urb(xbox_remote->irq_urb);
|
||||
+ kfree(xbox_remote);
|
||||
+}
|
||||
+
|
||||
+/* usb specific object to register with the usb subsystem */
|
||||
+static struct usb_driver xbox_remote_driver = {
|
||||
+ .name = "xbox_remote",
|
||||
+ .probe = xbox_remote_probe,
|
||||
+ .disconnect = xbox_remote_disconnect,
|
||||
+ .id_table = xbox_remote_table,
|
||||
+};
|
||||
+
|
||||
+module_usb_driver(xbox_remote_driver);
|
||||
+
|
||||
+MODULE_AUTHOR(DRIVER_AUTHOR);
|
||||
+MODULE_DESCRIPTION(DRIVER_DESC);
|
||||
+MODULE_LICENSE("GPL");
|
||||
diff --git a/include/media/rc-map.h b/include/media/rc-map.h
|
||||
index bfa3017cecba..d621acadfbf3 100644
|
||||
--- a/include/media/rc-map.h
|
||||
+++ b/include/media/rc-map.h
|
||||
@@ -277,6 +277,7 @@ struct rc_map *rc_map_get(const char *name);
|
||||
#define RC_MAP_WINFAST "rc-winfast"
|
||||
#define RC_MAP_WINFAST_USBII_DELUXE "rc-winfast-usbii-deluxe"
|
||||
#define RC_MAP_SU3000 "rc-su3000"
|
||||
+#define RC_MAP_XBOX_DVD "rc-xbox-dvd"
|
||||
#define RC_MAP_ZX_IRDEC "rc-zx-irdec"
|
||||
|
||||
/*
|
||||
--
|
||||
2.17.1
|
||||
|
|
@ -1,72 +0,0 @@
|
|||
From 7051422474e4c4e302ede3d07ffd8ef2682e07a2 Mon Sep 17 00:00:00 2001
|
||||
From: Stefan Saraev <stefan@saraev.ca>
|
||||
Date: Tue, 22 Apr 2014 16:05:14 +0300
|
||||
Subject: [PATCH] [RFC] hid/sony: add autorepeat for PS3 remotes
|
||||
|
||||
adapted to 4.6
|
||||
|
||||
Betreff: [RFC] hid/sony: add autorepeat for PS3 remotes
|
||||
Von: David Dillow <dave@thedillows.org>
|
||||
Datum: 28.06.2013 04:28
|
||||
An: linux-input@vger.kernel.org
|
||||
Kopie (CC): Stephan Raue <stephan@openelec.tv>
|
||||
|
||||
Some applications using the PS3 remote would like to have autorepeat
|
||||
from the device. Use the input subsystem's software emulation to provide
|
||||
this capability, and enable those that don't need it to turn it off.
|
||||
---
|
||||
I'm not sure this is the correct approach, or if it is even appropriate
|
||||
for a remote to do autorepeat. However, the media/rc subsystem does do
|
||||
it by default, and it's been requested by users, so there is at least
|
||||
some demand.
|
||||
|
||||
This compiled against the hid-sony driver with the PS3 remote changes
|
||||
merged, but I have done no testing of it. If the approach seems
|
||||
reasonable, I'll try to test it when the MythTV is idle.
|
||||
|
||||
Signed-off-by: Matt DeVillier <matt.devillier@gmail.com>
|
||||
---
|
||||
drivers/hid/hid-sony.c | 21 +++++++++++++++++++++
|
||||
1 file changed, 21 insertions(+)
|
||||
|
||||
diff --git a/drivers/hid/hid-sony.c b/drivers/hid/hid-sony.c
|
||||
index 310436a..84f7f41 100644
|
||||
--- a/drivers/hid/hid-sony.c
|
||||
+++ b/drivers/hid/hid-sony.c
|
||||
@@ -1120,6 +1120,25 @@ static int ps3remote_mapping(struct hid_device *hdev, struct hid_input *hi,
|
||||
return 1;
|
||||
}
|
||||
|
||||
+static int ps3remote_setup_repeat(struct hid_device *hdev)
|
||||
+{
|
||||
+ struct hid_input *hidinput = list_first_entry(&hdev->inputs,
|
||||
+ struct hid_input, list);
|
||||
+ struct input_dev *input = hidinput->input;
|
||||
+
|
||||
+ /*
|
||||
+ * Set up autorepeat defaults per the remote control subsystem;
|
||||
+ * this must be done after hid_hw_start(), as having these non-zero
|
||||
+ * at the time of input_register_device() tells the input system that
|
||||
+ * the hardware does the autorepeat, and the PS3 remote does not.
|
||||
+ */
|
||||
+ set_bit(EV_REP, input->evbit);
|
||||
+ input->rep[REP_DELAY] = 500;
|
||||
+ input->rep[REP_PERIOD] = 125;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static u8 *sony_report_fixup(struct hid_device *hdev, u8 *rdesc,
|
||||
unsigned int *rsize)
|
||||
{
|
||||
@@ -2372,6 +2391,8 @@ static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id)
|
||||
sony_init_output_report(sc, dualshock4_send_output_report);
|
||||
} else if (sc->quirks & MOTION_CONTROLLER) {
|
||||
sony_init_output_report(sc, motion_send_output_report);
|
||||
+ } else if (sc->quirks & PS3REMOTE) {
|
||||
+ ret = ps3remote_setup_repeat(hdev);
|
||||
} else {
|
||||
ret = 0;
|
||||
}
|
||||
--
|
||||
2.5.0
|
|
@ -1,21 +0,0 @@
|
|||
diff -Naur linux-3.16.1/drivers/media/rc/imon.c linux-3.16.1.patch/drivers/media/rc/imon.c
|
||||
--- linux-3.16.1/drivers/media/rc/imon.c 2014-08-14 04:36:35.000000000 +0200
|
||||
+++ linux-3.16.1.patch/drivers/media/rc/imon.c 2014-08-15 13:57:16.587620642 +0200
|
||||
@@ -1344,6 +1344,17 @@
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
+ * For users without stabilized, just ignore any value getting
|
||||
+ * to close to the diagonal.
|
||||
+ */
|
||||
+ if ((abs(rel_y) < 2 && abs(rel_x) < 2) ||
|
||||
+ abs(abs(rel_y) - abs(rel_x)) < 2 ) {
|
||||
+ spin_lock_irqsave(&ictx->kc_lock, flags);
|
||||
+ ictx->kc = KEY_UNKNOWN;
|
||||
+ spin_unlock_irqrestore(&ictx->kc_lock, flags);
|
||||
+ return;
|
||||
+ }
|
||||
+ /*
|
||||
* Hack alert: instead of using keycodes, we have
|
||||
* to use hard-coded scancodes here...
|
||||
*/
|
|
@ -1,41 +0,0 @@
|
|||
From ae1ccaa3587c0bd3d6d01841fa2e668cdf738f1e Mon Sep 17 00:00:00 2001
|
||||
From: Matthias Reichl <hias@horus.com>
|
||||
Date: Sun, 3 Feb 2019 14:24:00 +0100
|
||||
Subject: [PATCH] media: rc: ir-rc6-decoder: enable toggle bit for Zotac
|
||||
remotes
|
||||
|
||||
The Zotac RC2604323/01G and RC2604329/02BG remotes use the 32-bit
|
||||
rc6 protocol and toggle bit 15 (0x8000) on repeated button presses,
|
||||
like MCE remotes.
|
||||
|
||||
Add the customer code 0x80340000 to the 32-bit rc6 toggle
|
||||
handling code to get proper scancodes and toggle reports.
|
||||
|
||||
Signed-off-by: Matthias Reichl <hias@horus.com>
|
||||
---
|
||||
drivers/media/rc/ir-rc6-decoder.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/drivers/media/rc/ir-rc6-decoder.c b/drivers/media/rc/ir-rc6-decoder.c
|
||||
index d96aed1343e4..5cc302fa4daa 100644
|
||||
--- a/drivers/media/rc/ir-rc6-decoder.c
|
||||
+++ b/drivers/media/rc/ir-rc6-decoder.c
|
||||
@@ -40,6 +40,7 @@
|
||||
#define RC6_6A_MCE_TOGGLE_MASK 0x8000 /* for the body bits */
|
||||
#define RC6_6A_LCC_MASK 0xffff0000 /* RC6-6A-32 long customer code mask */
|
||||
#define RC6_6A_MCE_CC 0x800f0000 /* MCE customer code */
|
||||
+#define RC6_6A_ZOTAC_CC 0x80340000 /* Zotac customer code */
|
||||
#define RC6_6A_KATHREIN_CC 0x80460000 /* Kathrein RCU-676 customer code */
|
||||
#ifndef CHAR_BIT
|
||||
#define CHAR_BIT 8 /* Normally in <limits.h> */
|
||||
@@ -246,6 +247,7 @@ static int ir_rc6_decode(struct rc_dev *dev, struct ir_raw_event ev)
|
||||
switch (scancode & RC6_6A_LCC_MASK) {
|
||||
case RC6_6A_MCE_CC:
|
||||
case RC6_6A_KATHREIN_CC:
|
||||
+ case RC6_6A_ZOTAC_CC:
|
||||
protocol = RC_PROTO_RC6_MCE;
|
||||
toggle = !!(scancode & RC6_6A_MCE_TOGGLE_MASK);
|
||||
scancode &= ~RC6_6A_MCE_TOGGLE_MASK;
|
||||
--
|
||||
2.20.1
|
||||
|
|
@ -1,506 +0,0 @@
|
|||
From da8a71104dda4a85a9d9546ff462542347f8efa6 Mon Sep 17 00:00:00 2001
|
||||
From: Matthias Reichl <hias@horus.com>
|
||||
Date: Wed, 20 Mar 2019 09:11:53 +0100
|
||||
Subject: [PATCH] media: rc: rcmm decoder and encoder
|
||||
|
||||
commit 721074b03411327e7bf41555d4cc7c18f49313f7 upstream.
|
||||
|
||||
media: add support for RCMM infrared remote controls.
|
||||
|
||||
Signed-off-by: Patrick Lerda <patrick9876@free.fr>
|
||||
Signed-off-by: Sean Young <sean@mess.org>
|
||||
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
|
||||
Signed-off-by: Matthias Reichl <hias@horus.com>
|
||||
---
|
||||
Documentation/media/lirc.h.rst.exceptions | 3 +
|
||||
MAINTAINERS | 5 +
|
||||
drivers/media/rc/Kconfig | 13 ++
|
||||
drivers/media/rc/Makefile | 1 +
|
||||
drivers/media/rc/ir-rcmm-decoder.c | 254 ++++++++++++++++++++++
|
||||
drivers/media/rc/rc-core-priv.h | 5 +
|
||||
drivers/media/rc/rc-main.c | 9 +
|
||||
include/media/rc-map.h | 14 +-
|
||||
include/uapi/linux/lirc.h | 6 +
|
||||
tools/include/uapi/linux/lirc.h | 12 +
|
||||
10 files changed, 319 insertions(+), 3 deletions(-)
|
||||
create mode 100644 drivers/media/rc/ir-rcmm-decoder.c
|
||||
|
||||
diff --git a/Documentation/media/lirc.h.rst.exceptions b/Documentation/media/lirc.h.rst.exceptions
|
||||
index 984b61dc3f2e..e7a41d4b3d46 100644
|
||||
--- a/Documentation/media/lirc.h.rst.exceptions
|
||||
+++ b/Documentation/media/lirc.h.rst.exceptions
|
||||
@@ -58,6 +58,9 @@ ignore symbol RC_PROTO_SHARP
|
||||
ignore symbol RC_PROTO_XMP
|
||||
ignore symbol RC_PROTO_CEC
|
||||
ignore symbol RC_PROTO_IMON
|
||||
+ignore symbol RC_PROTO_RCMM12
|
||||
+ignore symbol RC_PROTO_RCMM24
|
||||
+ignore symbol RC_PROTO_RCMM32
|
||||
|
||||
# Undocumented macros
|
||||
|
||||
diff --git a/MAINTAINERS b/MAINTAINERS
|
||||
index 9e9b19ecf6f7..57b60dd42729 100644
|
||||
--- a/MAINTAINERS
|
||||
+++ b/MAINTAINERS
|
||||
@@ -15837,6 +15837,11 @@ M: David Härdeman <david@hardeman.nu>
|
||||
S: Maintained
|
||||
F: drivers/media/rc/winbond-cir.c
|
||||
|
||||
+RCMM REMOTE CONTROLS DECODER
|
||||
+M: Patrick Lerda <patrick9876@free.fr>
|
||||
+S: Maintained
|
||||
+F: drivers/media/rc/ir-rcmm-decoder.c
|
||||
+
|
||||
WINSYSTEMS EBC-C384 WATCHDOG DRIVER
|
||||
M: William Breathitt Gray <vilhelm.gray@gmail.com>
|
||||
L: linux-watchdog@vger.kernel.org
|
||||
diff --git a/drivers/media/rc/Kconfig b/drivers/media/rc/Kconfig
|
||||
index 1021c08a9ba4..8164a889011a 100644
|
||||
--- a/drivers/media/rc/Kconfig
|
||||
+++ b/drivers/media/rc/Kconfig
|
||||
@@ -133,6 +133,19 @@ config IR_IMON_DECODER
|
||||
remote control and you would like to use it with a raw IR
|
||||
receiver, or if you wish to use an encoder to transmit this IR.
|
||||
|
||||
+config IR_RCMM_DECODER
|
||||
+ tristate "Enable IR raw decoder for the RC-MM protocol"
|
||||
+ depends on RC_CORE
|
||||
+ help
|
||||
+ Enable this option when you have IR with RC-MM protocol, and
|
||||
+ you need the software decoder. The driver supports 12,
|
||||
+ 24 and 32 bits RC-MM variants. You can enable or disable the
|
||||
+ different modes using the following RC protocol keywords:
|
||||
+ 'rc-mm-12', 'rc-mm-24' and 'rc-mm-32'.
|
||||
+
|
||||
+ To compile this driver as a module, choose M here: the module
|
||||
+ will be called ir-rcmm-decoder.
|
||||
+
|
||||
endif #RC_DECODERS
|
||||
|
||||
menuconfig RC_DEVICES
|
||||
diff --git a/drivers/media/rc/Makefile b/drivers/media/rc/Makefile
|
||||
index e0340d043fe8..fc4058013234 100644
|
||||
--- a/drivers/media/rc/Makefile
|
||||
+++ b/drivers/media/rc/Makefile
|
||||
@@ -16,6 +16,7 @@ obj-$(CONFIG_IR_SHARP_DECODER) += ir-sharp-decoder.o
|
||||
obj-$(CONFIG_IR_MCE_KBD_DECODER) += ir-mce_kbd-decoder.o
|
||||
obj-$(CONFIG_IR_XMP_DECODER) += ir-xmp-decoder.o
|
||||
obj-$(CONFIG_IR_IMON_DECODER) += ir-imon-decoder.o
|
||||
+obj-$(CONFIG_IR_RCMM_DECODER) += ir-rcmm-decoder.o
|
||||
|
||||
# stand-alone IR receivers/transmitters
|
||||
obj-$(CONFIG_RC_ATI_REMOTE) += ati_remote.o
|
||||
diff --git a/drivers/media/rc/ir-rcmm-decoder.c b/drivers/media/rc/ir-rcmm-decoder.c
|
||||
new file mode 100644
|
||||
index 000000000000..f1096ac1e5c5
|
||||
--- /dev/null
|
||||
+++ b/drivers/media/rc/ir-rcmm-decoder.c
|
||||
@@ -0,0 +1,254 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0+
|
||||
+// ir-rcmm-decoder.c - A decoder for the RCMM IR protocol
|
||||
+//
|
||||
+// Copyright (C) 2018 by Patrick Lerda <patrick9876@free.fr>
|
||||
+
|
||||
+#include "rc-core-priv.h"
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/version.h>
|
||||
+
|
||||
+#define RCMM_UNIT 166667 /* nanosecs */
|
||||
+#define RCMM_PREFIX_PULSE 416666 /* 166666.666666666*2.5 */
|
||||
+#define RCMM_PULSE_0 277777 /* 166666.666666666*(1+2/3) */
|
||||
+#define RCMM_PULSE_1 444444 /* 166666.666666666*(2+2/3) */
|
||||
+#define RCMM_PULSE_2 611111 /* 166666.666666666*(3+2/3) */
|
||||
+#define RCMM_PULSE_3 777778 /* 166666.666666666*(4+2/3) */
|
||||
+
|
||||
+enum rcmm_state {
|
||||
+ STATE_INACTIVE,
|
||||
+ STATE_LOW,
|
||||
+ STATE_BUMP,
|
||||
+ STATE_VALUE,
|
||||
+ STATE_FINISHED,
|
||||
+};
|
||||
+
|
||||
+static bool rcmm_mode(const struct rcmm_dec *data)
|
||||
+{
|
||||
+ return !((0x000c0000 & data->bits) == 0x000c0000);
|
||||
+}
|
||||
+
|
||||
+static int rcmm_miscmode(struct rc_dev *dev, struct rcmm_dec *data)
|
||||
+{
|
||||
+ switch (data->count) {
|
||||
+ case 24:
|
||||
+ if (dev->enabled_protocols & RC_PROTO_BIT_RCMM24) {
|
||||
+ rc_keydown(dev, RC_PROTO_RCMM24, data->bits, 0);
|
||||
+ data->state = STATE_INACTIVE;
|
||||
+ return 0;
|
||||
+ }
|
||||
+ return -1;
|
||||
+
|
||||
+ case 12:
|
||||
+ if (dev->enabled_protocols & RC_PROTO_BIT_RCMM12) {
|
||||
+ rc_keydown(dev, RC_PROTO_RCMM12, data->bits, 0);
|
||||
+ data->state = STATE_INACTIVE;
|
||||
+ return 0;
|
||||
+ }
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ return -1;
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
+ * ir_rcmm_decode() - Decode one RCMM pulse or space
|
||||
+ * @dev: the struct rc_dev descriptor of the device
|
||||
+ * @ev: the struct ir_raw_event descriptor of the pulse/space
|
||||
+ *
|
||||
+ * This function returns -EINVAL if the pulse violates the state machine
|
||||
+ */
|
||||
+static int ir_rcmm_decode(struct rc_dev *dev, struct ir_raw_event ev)
|
||||
+{
|
||||
+ struct rcmm_dec *data = &dev->raw->rcmm;
|
||||
+ u32 scancode;
|
||||
+ u8 toggle;
|
||||
+ int value;
|
||||
+
|
||||
+ if (!(dev->enabled_protocols & (RC_PROTO_BIT_RCMM32 |
|
||||
+ RC_PROTO_BIT_RCMM24 |
|
||||
+ RC_PROTO_BIT_RCMM12)))
|
||||
+ return 0;
|
||||
+
|
||||
+ if (!is_timing_event(ev)) {
|
||||
+ if (ev.reset)
|
||||
+ data->state = STATE_INACTIVE;
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ switch (data->state) {
|
||||
+ case STATE_INACTIVE:
|
||||
+ if (!ev.pulse)
|
||||
+ break;
|
||||
+
|
||||
+ if (!eq_margin(ev.duration, RCMM_PREFIX_PULSE, RCMM_UNIT / 2))
|
||||
+ break;
|
||||
+
|
||||
+ data->state = STATE_LOW;
|
||||
+ data->count = 0;
|
||||
+ data->bits = 0;
|
||||
+ return 0;
|
||||
+
|
||||
+ case STATE_LOW:
|
||||
+ if (ev.pulse)
|
||||
+ break;
|
||||
+
|
||||
+ if (!eq_margin(ev.duration, RCMM_PULSE_0, RCMM_UNIT / 2))
|
||||
+ break;
|
||||
+
|
||||
+ data->state = STATE_BUMP;
|
||||
+ return 0;
|
||||
+
|
||||
+ case STATE_BUMP:
|
||||
+ if (!ev.pulse)
|
||||
+ break;
|
||||
+
|
||||
+ if (!eq_margin(ev.duration, RCMM_UNIT, RCMM_UNIT / 2))
|
||||
+ break;
|
||||
+
|
||||
+ data->state = STATE_VALUE;
|
||||
+ return 0;
|
||||
+
|
||||
+ case STATE_VALUE:
|
||||
+ if (ev.pulse)
|
||||
+ break;
|
||||
+
|
||||
+ if (eq_margin(ev.duration, RCMM_PULSE_0, RCMM_UNIT / 2))
|
||||
+ value = 0;
|
||||
+ else if (eq_margin(ev.duration, RCMM_PULSE_1, RCMM_UNIT / 2))
|
||||
+ value = 1;
|
||||
+ else if (eq_margin(ev.duration, RCMM_PULSE_2, RCMM_UNIT / 2))
|
||||
+ value = 2;
|
||||
+ else if (eq_margin(ev.duration, RCMM_PULSE_3, RCMM_UNIT / 2))
|
||||
+ value = 3;
|
||||
+ else
|
||||
+ value = -1;
|
||||
+
|
||||
+ if (value == -1) {
|
||||
+ if (!rcmm_miscmode(dev, data))
|
||||
+ return 0;
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ data->bits <<= 2;
|
||||
+ data->bits |= value;
|
||||
+
|
||||
+ data->count += 2;
|
||||
+
|
||||
+ if (data->count < 32)
|
||||
+ data->state = STATE_BUMP;
|
||||
+ else
|
||||
+ data->state = STATE_FINISHED;
|
||||
+
|
||||
+ return 0;
|
||||
+
|
||||
+ case STATE_FINISHED:
|
||||
+ if (!ev.pulse)
|
||||
+ break;
|
||||
+
|
||||
+ if (!eq_margin(ev.duration, RCMM_UNIT, RCMM_UNIT / 2))
|
||||
+ break;
|
||||
+
|
||||
+ if (rcmm_mode(data)) {
|
||||
+ toggle = !!(0x8000 & data->bits);
|
||||
+ scancode = data->bits & ~0x8000;
|
||||
+ } else {
|
||||
+ toggle = 0;
|
||||
+ scancode = data->bits;
|
||||
+ }
|
||||
+
|
||||
+ if (dev->enabled_protocols & RC_PROTO_BIT_RCMM32) {
|
||||
+ rc_keydown(dev, RC_PROTO_RCMM32, scancode, toggle);
|
||||
+ data->state = STATE_INACTIVE;
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ data->state = STATE_INACTIVE;
|
||||
+ return -EINVAL;
|
||||
+}
|
||||
+
|
||||
+static const int rcmmspace[] = {
|
||||
+ RCMM_PULSE_0,
|
||||
+ RCMM_PULSE_1,
|
||||
+ RCMM_PULSE_2,
|
||||
+ RCMM_PULSE_3,
|
||||
+};
|
||||
+
|
||||
+static int ir_rcmm_rawencoder(struct ir_raw_event **ev, unsigned int max,
|
||||
+ unsigned int n, u32 data)
|
||||
+{
|
||||
+ int i;
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = ir_raw_gen_pulse_space(ev, &max, RCMM_PREFIX_PULSE, RCMM_PULSE_0);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ for (i = n - 2; i >= 0; i -= 2) {
|
||||
+ const unsigned int space = rcmmspace[(data >> i) & 3];
|
||||
+
|
||||
+ ret = ir_raw_gen_pulse_space(ev, &max, RCMM_UNIT, space);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ return ir_raw_gen_pulse_space(ev, &max, RCMM_UNIT, RCMM_PULSE_3 * 2);
|
||||
+}
|
||||
+
|
||||
+static int ir_rcmm_encode(enum rc_proto protocol, u32 scancode,
|
||||
+ struct ir_raw_event *events, unsigned int max)
|
||||
+{
|
||||
+ struct ir_raw_event *e = events;
|
||||
+ int ret;
|
||||
+
|
||||
+ switch (protocol) {
|
||||
+ case RC_PROTO_RCMM32:
|
||||
+ ret = ir_rcmm_rawencoder(&e, max, 32, scancode);
|
||||
+ break;
|
||||
+ case RC_PROTO_RCMM24:
|
||||
+ ret = ir_rcmm_rawencoder(&e, max, 24, scancode);
|
||||
+ break;
|
||||
+ case RC_PROTO_RCMM12:
|
||||
+ ret = ir_rcmm_rawencoder(&e, max, 12, scancode);
|
||||
+ break;
|
||||
+ default:
|
||||
+ ret = -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ if (ret < 0)
|
||||
+ return ret;
|
||||
+
|
||||
+ return e - events;
|
||||
+}
|
||||
+
|
||||
+static struct ir_raw_handler rcmm_handler = {
|
||||
+ .protocols = RC_PROTO_BIT_RCMM32 |
|
||||
+ RC_PROTO_BIT_RCMM24 |
|
||||
+ RC_PROTO_BIT_RCMM12,
|
||||
+ .decode = ir_rcmm_decode,
|
||||
+ .encode = ir_rcmm_encode,
|
||||
+ .carrier = 36000,
|
||||
+ .min_timeout = RCMM_PULSE_3 + RCMM_UNIT,
|
||||
+};
|
||||
+
|
||||
+static int __init ir_rcmm_decode_init(void)
|
||||
+{
|
||||
+ ir_raw_handler_register(&rcmm_handler);
|
||||
+
|
||||
+ pr_info("IR RCMM protocol handler initialized\n");
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static void __exit ir_rcmm_decode_exit(void)
|
||||
+{
|
||||
+ ir_raw_handler_unregister(&rcmm_handler);
|
||||
+}
|
||||
+
|
||||
+module_init(ir_rcmm_decode_init);
|
||||
+module_exit(ir_rcmm_decode_exit);
|
||||
+
|
||||
+MODULE_LICENSE("GPL");
|
||||
+MODULE_AUTHOR("Patrick Lerda");
|
||||
+MODULE_DESCRIPTION("RCMM IR protocol decoder");
|
||||
diff --git a/drivers/media/rc/rc-core-priv.h b/drivers/media/rc/rc-core-priv.h
|
||||
index e847bdad5c51..59c252f24194 100644
|
||||
--- a/drivers/media/rc/rc-core-priv.h
|
||||
+++ b/drivers/media/rc/rc-core-priv.h
|
||||
@@ -136,6 +136,11 @@ struct ir_raw_event_ctrl {
|
||||
struct input_dev *idev;
|
||||
char name[64];
|
||||
} imon;
|
||||
+ struct rcmm_dec {
|
||||
+ int state;
|
||||
+ unsigned int count;
|
||||
+ u32 bits;
|
||||
+ } rcmm;
|
||||
};
|
||||
|
||||
/* Mutex for locking raw IR processing and handler change */
|
||||
diff --git a/drivers/media/rc/rc-main.c b/drivers/media/rc/rc-main.c
|
||||
index 0f218afdadaa..78e79c37f208 100644
|
||||
--- a/drivers/media/rc/rc-main.c
|
||||
+++ b/drivers/media/rc/rc-main.c
|
||||
@@ -70,6 +70,12 @@ static const struct {
|
||||
[RC_PROTO_CEC] = { .name = "cec", .repeat_period = 0 },
|
||||
[RC_PROTO_IMON] = { .name = "imon",
|
||||
.scancode_bits = 0x7fffffff, .repeat_period = 114 },
|
||||
+ [RC_PROTO_RCMM12] = { .name = "rc-mm-12",
|
||||
+ .scancode_bits = 0x00000fff, .repeat_period = 114 },
|
||||
+ [RC_PROTO_RCMM24] = { .name = "rc-mm-24",
|
||||
+ .scancode_bits = 0x00ffffff, .repeat_period = 114 },
|
||||
+ [RC_PROTO_RCMM32] = { .name = "rc-mm-32",
|
||||
+ .scancode_bits = 0xffffffff, .repeat_period = 114 },
|
||||
};
|
||||
|
||||
/* Used to keep track of known keymaps */
|
||||
@@ -1018,6 +1024,9 @@ static const struct {
|
||||
{ RC_PROTO_BIT_XMP, "xmp", "ir-xmp-decoder" },
|
||||
{ RC_PROTO_BIT_CEC, "cec", NULL },
|
||||
{ RC_PROTO_BIT_IMON, "imon", "ir-imon-decoder" },
|
||||
+ { RC_PROTO_BIT_RCMM12 |
|
||||
+ RC_PROTO_BIT_RCMM24 |
|
||||
+ RC_PROTO_BIT_RCMM32, "rc-mm", "ir-rcmm-decoder" },
|
||||
};
|
||||
|
||||
/**
|
||||
diff --git a/include/media/rc-map.h b/include/media/rc-map.h
|
||||
index bfa3017cecba..cf308b73edae 100644
|
||||
--- a/include/media/rc-map.h
|
||||
+++ b/include/media/rc-map.h
|
||||
@@ -37,6 +37,9 @@
|
||||
#define RC_PROTO_BIT_XMP BIT_ULL(RC_PROTO_XMP)
|
||||
#define RC_PROTO_BIT_CEC BIT_ULL(RC_PROTO_CEC)
|
||||
#define RC_PROTO_BIT_IMON BIT_ULL(RC_PROTO_IMON)
|
||||
+#define RC_PROTO_BIT_RCMM12 BIT_ULL(RC_PROTO_RCMM12)
|
||||
+#define RC_PROTO_BIT_RCMM24 BIT_ULL(RC_PROTO_RCMM24)
|
||||
+#define RC_PROTO_BIT_RCMM32 BIT_ULL(RC_PROTO_RCMM32)
|
||||
|
||||
#define RC_PROTO_BIT_ALL \
|
||||
(RC_PROTO_BIT_UNKNOWN | RC_PROTO_BIT_OTHER | \
|
||||
@@ -51,7 +54,8 @@
|
||||
RC_PROTO_BIT_RC6_6A_24 | RC_PROTO_BIT_RC6_6A_32 | \
|
||||
RC_PROTO_BIT_RC6_MCE | RC_PROTO_BIT_SHARP | \
|
||||
RC_PROTO_BIT_XMP | RC_PROTO_BIT_CEC | \
|
||||
- RC_PROTO_BIT_IMON)
|
||||
+ RC_PROTO_BIT_IMON | RC_PROTO_BIT_RCMM12 | \
|
||||
+ RC_PROTO_BIT_RCMM24 | RC_PROTO_BIT_RCMM32)
|
||||
/* All rc protocols for which we have decoders */
|
||||
#define RC_PROTO_BIT_ALL_IR_DECODER \
|
||||
(RC_PROTO_BIT_RC5 | RC_PROTO_BIT_RC5X_20 | \
|
||||
@@ -64,7 +68,9 @@
|
||||
RC_PROTO_BIT_RC6_0 | RC_PROTO_BIT_RC6_6A_20 | \
|
||||
RC_PROTO_BIT_RC6_6A_24 | RC_PROTO_BIT_RC6_6A_32 | \
|
||||
RC_PROTO_BIT_RC6_MCE | RC_PROTO_BIT_SHARP | \
|
||||
- RC_PROTO_BIT_XMP | RC_PROTO_BIT_IMON)
|
||||
+ RC_PROTO_BIT_XMP | RC_PROTO_BIT_IMON | \
|
||||
+ RC_PROTO_BIT_RCMM12 | RC_PROTO_BIT_RCMM24 | \
|
||||
+ RC_PROTO_BIT_RCMM32)
|
||||
|
||||
#define RC_PROTO_BIT_ALL_IR_ENCODER \
|
||||
(RC_PROTO_BIT_RC5 | RC_PROTO_BIT_RC5X_20 | \
|
||||
@@ -77,7 +83,9 @@
|
||||
RC_PROTO_BIT_RC6_0 | RC_PROTO_BIT_RC6_6A_20 | \
|
||||
RC_PROTO_BIT_RC6_6A_24 | \
|
||||
RC_PROTO_BIT_RC6_6A_32 | RC_PROTO_BIT_RC6_MCE | \
|
||||
- RC_PROTO_BIT_SHARP | RC_PROTO_BIT_IMON)
|
||||
+ RC_PROTO_BIT_SHARP | RC_PROTO_BIT_IMON | \
|
||||
+ RC_PROTO_BIT_RCMM12 | RC_PROTO_BIT_RCMM24 | \
|
||||
+ RC_PROTO_BIT_RCMM32)
|
||||
|
||||
#define RC_SCANCODE_UNKNOWN(x) (x)
|
||||
#define RC_SCANCODE_OTHER(x) (x)
|
||||
diff --git a/include/uapi/linux/lirc.h b/include/uapi/linux/lirc.h
|
||||
index 6b319581882f..45fcbf99d72e 100644
|
||||
--- a/include/uapi/linux/lirc.h
|
||||
+++ b/include/uapi/linux/lirc.h
|
||||
@@ -192,6 +192,9 @@ struct lirc_scancode {
|
||||
* @RC_PROTO_XMP: XMP protocol
|
||||
* @RC_PROTO_CEC: CEC protocol
|
||||
* @RC_PROTO_IMON: iMon Pad protocol
|
||||
+ * @RC_PROTO_RCMM12: RC-MM protocol 12 bits
|
||||
+ * @RC_PROTO_RCMM24: RC-MM protocol 24 bits
|
||||
+ * @RC_PROTO_RCMM32: RC-MM protocol 32 bits
|
||||
*/
|
||||
enum rc_proto {
|
||||
RC_PROTO_UNKNOWN = 0,
|
||||
@@ -218,6 +221,9 @@ enum rc_proto {
|
||||
RC_PROTO_XMP = 21,
|
||||
RC_PROTO_CEC = 22,
|
||||
RC_PROTO_IMON = 23,
|
||||
+ RC_PROTO_RCMM12 = 24,
|
||||
+ RC_PROTO_RCMM24 = 25,
|
||||
+ RC_PROTO_RCMM32 = 26,
|
||||
};
|
||||
|
||||
#endif
|
||||
diff --git a/tools/include/uapi/linux/lirc.h b/tools/include/uapi/linux/lirc.h
|
||||
index f189931042a7..45fcbf99d72e 100644
|
||||
--- a/tools/include/uapi/linux/lirc.h
|
||||
+++ b/tools/include/uapi/linux/lirc.h
|
||||
@@ -133,6 +133,12 @@
|
||||
|
||||
#define LIRC_SET_WIDEBAND_RECEIVER _IOW('i', 0x00000023, __u32)
|
||||
|
||||
+/*
|
||||
+ * Return the recording timeout, which is either set by
|
||||
+ * the ioctl LIRC_SET_REC_TIMEOUT or by the kernel after setting the protocols.
|
||||
+ */
|
||||
+#define LIRC_GET_REC_TIMEOUT _IOR('i', 0x00000024, __u32)
|
||||
+
|
||||
/*
|
||||
* struct lirc_scancode - decoded scancode with protocol for use with
|
||||
* LIRC_MODE_SCANCODE
|
||||
@@ -186,6 +192,9 @@ struct lirc_scancode {
|
||||
* @RC_PROTO_XMP: XMP protocol
|
||||
* @RC_PROTO_CEC: CEC protocol
|
||||
* @RC_PROTO_IMON: iMon Pad protocol
|
||||
+ * @RC_PROTO_RCMM12: RC-MM protocol 12 bits
|
||||
+ * @RC_PROTO_RCMM24: RC-MM protocol 24 bits
|
||||
+ * @RC_PROTO_RCMM32: RC-MM protocol 32 bits
|
||||
*/
|
||||
enum rc_proto {
|
||||
RC_PROTO_UNKNOWN = 0,
|
||||
@@ -212,6 +221,9 @@ enum rc_proto {
|
||||
RC_PROTO_XMP = 21,
|
||||
RC_PROTO_CEC = 22,
|
||||
RC_PROTO_IMON = 23,
|
||||
+ RC_PROTO_RCMM12 = 24,
|
||||
+ RC_PROTO_RCMM24 = 25,
|
||||
+ RC_PROTO_RCMM32 = 26,
|
||||
};
|
||||
|
||||
#endif
|
||||
--
|
||||
2.20.1
|
||||
|
|
@ -1,158 +0,0 @@
|
|||
From 55096db50d8cdbf777c67f672b493ef565a12c38 Mon Sep 17 00:00:00 2001
|
||||
From: Matthias Reichl <hias@horus.com>
|
||||
Date: Fri, 22 Mar 2019 12:26:17 +0100
|
||||
Subject: [PATCH] media: rc: xbox_remote: add protocol and set timeout
|
||||
|
||||
The timestamps in ir-keytable -t output showed that the Xbox DVD
|
||||
IR dongle decodes scancodes every 64ms. The last scancode of a
|
||||
longer button press is decodes 64ms after the last-but-one which
|
||||
indicates the decoder doesn't use a timeout but decodes on the last
|
||||
edge of the signal.
|
||||
|
||||
267.042629: lirc protocol(unknown): scancode = 0xace
|
||||
267.042665: event type EV_MSC(0x04): scancode = 0xace
|
||||
267.042665: event type EV_KEY(0x01) key_down: KEY_1(0x0002)
|
||||
267.042665: event type EV_SYN(0x00).
|
||||
267.106625: lirc protocol(unknown): scancode = 0xace
|
||||
267.106643: event type EV_MSC(0x04): scancode = 0xace
|
||||
267.106643: event type EV_SYN(0x00).
|
||||
267.170623: lirc protocol(unknown): scancode = 0xace
|
||||
267.170638: event type EV_MSC(0x04): scancode = 0xace
|
||||
267.170638: event type EV_SYN(0x00).
|
||||
267.234621: lirc protocol(unknown): scancode = 0xace
|
||||
267.234636: event type EV_MSC(0x04): scancode = 0xace
|
||||
267.234636: event type EV_SYN(0x00).
|
||||
267.298623: lirc protocol(unknown): scancode = 0xace
|
||||
267.298638: event type EV_MSC(0x04): scancode = 0xace
|
||||
267.298638: event type EV_SYN(0x00).
|
||||
267.543345: event type EV_KEY(0x01) key_down: KEY_1(0x0002)
|
||||
267.543345: event type EV_SYN(0x00).
|
||||
267.570015: event type EV_KEY(0x01) key_up: KEY_1(0x0002)
|
||||
267.570015: event type EV_SYN(0x00).
|
||||
|
||||
Add a protocol with the repeat value and set the timeout in the
|
||||
driver to 10ms (to have a bit of headroom for delays) so the Xbox
|
||||
DVD remote performs more responsive.
|
||||
|
||||
Signed-off-by: Matthias Reichl <hias@horus.com>
|
||||
---
|
||||
Documentation/media/lirc.h.rst.exceptions | 1 +
|
||||
drivers/media/rc/keymaps/rc-xbox-dvd.c | 2 +-
|
||||
drivers/media/rc/rc-main.c | 2 ++
|
||||
drivers/media/rc/xbox_remote.c | 4 +++-
|
||||
include/media/rc-map.h | 4 +++-
|
||||
include/uapi/linux/lirc.h | 2 ++
|
||||
6 files changed, 12 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/Documentation/media/lirc.h.rst.exceptions b/Documentation/media/lirc.h.rst.exceptions
|
||||
index e7a41d4b3d46..f8b5f1a32b7d 100644
|
||||
--- a/Documentation/media/lirc.h.rst.exceptions
|
||||
+++ b/Documentation/media/lirc.h.rst.exceptions
|
||||
@@ -61,6 +61,7 @@ ignore symbol RC_PROTO_IMON
|
||||
ignore symbol RC_PROTO_RCMM12
|
||||
ignore symbol RC_PROTO_RCMM24
|
||||
ignore symbol RC_PROTO_RCMM32
|
||||
+ignore symbol RC_PROTO_XBOX_DVD
|
||||
|
||||
# Undocumented macros
|
||||
|
||||
diff --git a/drivers/media/rc/keymaps/rc-xbox-dvd.c b/drivers/media/rc/keymaps/rc-xbox-dvd.c
|
||||
index af387244636b..42815ab57bff 100644
|
||||
--- a/drivers/media/rc/keymaps/rc-xbox-dvd.c
|
||||
+++ b/drivers/media/rc/keymaps/rc-xbox-dvd.c
|
||||
@@ -42,7 +42,7 @@ static struct rc_map_list xbox_dvd_map = {
|
||||
.map = {
|
||||
.scan = xbox_dvd,
|
||||
.size = ARRAY_SIZE(xbox_dvd),
|
||||
- .rc_proto = RC_PROTO_UNKNOWN,
|
||||
+ .rc_proto = RC_PROTO_XBOX_DVD,
|
||||
.name = RC_MAP_XBOX_DVD,
|
||||
}
|
||||
};
|
||||
diff --git a/drivers/media/rc/rc-main.c b/drivers/media/rc/rc-main.c
|
||||
index 78e79c37f208..7f1d5b226f68 100644
|
||||
--- a/drivers/media/rc/rc-main.c
|
||||
+++ b/drivers/media/rc/rc-main.c
|
||||
@@ -76,6 +76,7 @@ static const struct {
|
||||
.scancode_bits = 0x00ffffff, .repeat_period = 114 },
|
||||
[RC_PROTO_RCMM32] = { .name = "rc-mm-32",
|
||||
.scancode_bits = 0xffffffff, .repeat_period = 114 },
|
||||
+ [RC_PROTO_XBOX_DVD] = { .name = "xbox-dvd", .repeat_period = 64 },
|
||||
};
|
||||
|
||||
/* Used to keep track of known keymaps */
|
||||
@@ -1027,6 +1028,7 @@ static const struct {
|
||||
{ RC_PROTO_BIT_RCMM12 |
|
||||
RC_PROTO_BIT_RCMM24 |
|
||||
RC_PROTO_BIT_RCMM32, "rc-mm", "ir-rcmm-decoder" },
|
||||
+ { RC_PROTO_BIT_XBOX_DVD, "xbox-dvd", NULL },
|
||||
};
|
||||
|
||||
/**
|
||||
diff --git a/drivers/media/rc/xbox_remote.c b/drivers/media/rc/xbox_remote.c
|
||||
index f959cbb94744..79470c09989e 100644
|
||||
--- a/drivers/media/rc/xbox_remote.c
|
||||
+++ b/drivers/media/rc/xbox_remote.c
|
||||
@@ -148,7 +148,7 @@ static void xbox_remote_rc_init(struct xbox_remote *xbox_remote)
|
||||
struct rc_dev *rdev = xbox_remote->rdev;
|
||||
|
||||
rdev->priv = xbox_remote;
|
||||
- rdev->allowed_protocols = RC_PROTO_BIT_UNKNOWN;
|
||||
+ rdev->allowed_protocols = RC_PROTO_BIT_XBOX_DVD;
|
||||
rdev->driver_name = "xbox_remote";
|
||||
|
||||
rdev->open = xbox_remote_rc_open;
|
||||
@@ -157,6 +157,8 @@ static void xbox_remote_rc_init(struct xbox_remote *xbox_remote)
|
||||
rdev->device_name = xbox_remote->rc_name;
|
||||
rdev->input_phys = xbox_remote->rc_phys;
|
||||
|
||||
+ rdev->timeout = MS_TO_NS(10);
|
||||
+
|
||||
usb_to_input_id(xbox_remote->udev, &rdev->input_id);
|
||||
rdev->dev.parent = &xbox_remote->interface->dev;
|
||||
}
|
||||
diff --git a/include/media/rc-map.h b/include/media/rc-map.h
|
||||
index e5e86d595645..a0000f392362 100644
|
||||
--- a/include/media/rc-map.h
|
||||
+++ b/include/media/rc-map.h
|
||||
@@ -40,6 +40,7 @@
|
||||
#define RC_PROTO_BIT_RCMM12 BIT_ULL(RC_PROTO_RCMM12)
|
||||
#define RC_PROTO_BIT_RCMM24 BIT_ULL(RC_PROTO_RCMM24)
|
||||
#define RC_PROTO_BIT_RCMM32 BIT_ULL(RC_PROTO_RCMM32)
|
||||
+#define RC_PROTO_BIT_XBOX_DVD BIT_ULL(RC_PROTO_XBOX_DVD)
|
||||
|
||||
#define RC_PROTO_BIT_ALL \
|
||||
(RC_PROTO_BIT_UNKNOWN | RC_PROTO_BIT_OTHER | \
|
||||
@@ -55,7 +56,8 @@
|
||||
RC_PROTO_BIT_RC6_MCE | RC_PROTO_BIT_SHARP | \
|
||||
RC_PROTO_BIT_XMP | RC_PROTO_BIT_CEC | \
|
||||
RC_PROTO_BIT_IMON | RC_PROTO_BIT_RCMM12 | \
|
||||
- RC_PROTO_BIT_RCMM24 | RC_PROTO_BIT_RCMM32)
|
||||
+ RC_PROTO_BIT_RCMM24 | RC_PROTO_BIT_RCMM32 | \
|
||||
+ RC_PROTO_BIT_XBOX_DVD)
|
||||
/* All rc protocols for which we have decoders */
|
||||
#define RC_PROTO_BIT_ALL_IR_DECODER \
|
||||
(RC_PROTO_BIT_RC5 | RC_PROTO_BIT_RC5X_20 | \
|
||||
diff --git a/include/uapi/linux/lirc.h b/include/uapi/linux/lirc.h
|
||||
index 45fcbf99d72e..f99d9dcae667 100644
|
||||
--- a/include/uapi/linux/lirc.h
|
||||
+++ b/include/uapi/linux/lirc.h
|
||||
@@ -195,6 +195,7 @@ struct lirc_scancode {
|
||||
* @RC_PROTO_RCMM12: RC-MM protocol 12 bits
|
||||
* @RC_PROTO_RCMM24: RC-MM protocol 24 bits
|
||||
* @RC_PROTO_RCMM32: RC-MM protocol 32 bits
|
||||
+ * @RC_PROTO_XBOX_DVD: Xbox DVD Movie Playback Kit protocol
|
||||
*/
|
||||
enum rc_proto {
|
||||
RC_PROTO_UNKNOWN = 0,
|
||||
@@ -224,6 +225,7 @@ enum rc_proto {
|
||||
RC_PROTO_RCMM12 = 24,
|
||||
RC_PROTO_RCMM24 = 25,
|
||||
RC_PROTO_RCMM32 = 26,
|
||||
+ RC_PROTO_XBOX_DVD = 27,
|
||||
};
|
||||
|
||||
#endif
|
||||
--
|
||||
2.20.1
|
||||
|
|
@ -1,25 +0,0 @@
|
|||
From c314d9af9d774c052bea324e1a140ccdba0ca070 Mon Sep 17 00:00:00 2001
|
||||
From: Stefan Saraev <stefan@saraev.ca>
|
||||
Date: Tue, 8 Apr 2014 14:02:53 +0300
|
||||
Subject: [PATCH] pm: disable async suspend/resume by default
|
||||
|
||||
---
|
||||
kernel/power/main.c | 2 +-
|
||||
1 files changed, 1 insertions(+), 1 deletions(-)
|
||||
|
||||
diff --git a/kernel/power/main.c b/kernel/power/main.c
|
||||
index 1d1bf63..361db93 100644
|
||||
--- a/kernel/power/main.c
|
||||
+++ b/kernel/power/main.c
|
||||
@@ -46,7 +46,7 @@ int pm_notifier_call_chain(unsigned long val)
|
||||
}
|
||||
|
||||
/* If set, devices may be suspended and resumed asynchronously. */
|
||||
-int pm_async_enabled = 1;
|
||||
+int pm_async_enabled = 0;
|
||||
|
||||
static ssize_t pm_async_show(struct kobject *kobj, struct kobj_attribute *attr,
|
||||
char *buf)
|
||||
--
|
||||
1.7.2.5
|
||||
|
|
@ -1,8 +1,9 @@
|
|||
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||
# Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv)
|
||||
# Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
ACTION!="add|change", GOTO="end"
|
||||
|
||||
DRIVER=="ehci-pci|xhci_hcd", RUN+="/usr/bin/sh -c 'echo disabled > /sys/$devpath/power/wakeup'"
|
||||
DRIVER=="ehci-pci|xhci_hcd", RUN+="/usr/bin/sh -c 'echo disabled > /sys$devpath/power/wakeup'"
|
||||
|
||||
LABEL="end"
|
||||
|
|
|
@ -8,4 +8,10 @@ SUBSYSTEM!="block", GOTO="end_modeswitch"
|
|||
# Atheros Wireless / Netgear WNDA3200
|
||||
ATTRS{idVendor}=="0cf3", ATTRS{idProduct}=="20ff", RUN+="/usr/bin/eject '/dev/%k'"
|
||||
|
||||
# Realtek RTL8821CU chipset 802.11ac NIC
|
||||
# initial cdrom mode 0bda:1a2b, wlan mode 0bda:c811
|
||||
# Odroid WiFi Module 5B
|
||||
# initial cdrom mode 0bda:1a2b, wlan mode 0bda:c820
|
||||
ATTRS{idVendor}=="0bda", ATTRS{idProduct}=="1a2b", RUN+="/usr/bin/eject '/dev/%k'"
|
||||
|
||||
LABEL="end_modeswitch"
|
||||
|
|
|
@ -42,7 +42,7 @@ if [ -e /storage/.please_resize_me ] ; then
|
|||
StartProgress spinner "Checking layout... " "sgdisk -e ${DISK} &>/dev/null"
|
||||
fi
|
||||
|
||||
StartProgress spinner "Resizing storage partition... " "parted -s -a optimal -m ${DISK} resizepart 2 4GiB &>/dev/null"
|
||||
StartProgress spinner "Resizing storage partition... " "parted -s -a optimal -m ${DISK} resizepart 2 100% &>/dev/null"
|
||||
StartProgress spinner "Checking storage file system... " "e2fsck -f -p ${PART} &>/dev/null"
|
||||
StartProgress spinner "Resizing storage file system... " "resize2fs ${PART} &>/dev/null"
|
||||
StartProgress countdown "Rebooting in 5s... " 5 "NOW"
|
||||
|
|
|
@ -510,33 +510,23 @@ CONFIG_COMPAT=y
|
|||
CONFIG_SYSVIPC_COMPAT=y
|
||||
CONFIG_KEYS_COMPAT=y
|
||||
|
||||
#
|
||||
# Power management options
|
||||
#
|
||||
CONFIG_SUSPEND=y
|
||||
CONFIG_SUSPEND_FREEZER=y
|
||||
# CONFIG_SUSPEND_SKIP_SYNC is not set
|
||||
CONFIG_HAS_WAKELOCK=y
|
||||
CONFIG_WAKELOCK=y
|
||||
# CONFIG_HIBERNATION is not set
|
||||
CONFIG_PM_SLEEP=y
|
||||
CONFIG_PM_SLEEP_SMP=y
|
||||
# CONFIG_PM_AUTOSLEEP is not set
|
||||
CONFIG_PM_WAKELOCKS=y
|
||||
CONFIG_PM_WAKELOCKS_LIMIT=100
|
||||
CONFIG_PM_WAKELOCKS_GC=y
|
||||
CONFIG_PM_AUTOSLEEP=y
|
||||
# CONFIG_PM_WAKELOCKS is not set
|
||||
# CONFIG_PM_WAKELOCKS_LIMIT is not set
|
||||
# CONFIG_PM_WAKELOCKS_GC 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_DPM_WATCHDOG is not set
|
||||
# CONFIG_PM_DEBUG is not set
|
||||
CONFIG_PM_OPP=y
|
||||
CONFIG_PM_CLK=y
|
||||
CONFIG_PM_GENERIC_DOMAINS=y
|
||||
CONFIG_WQ_POWER_EFFICIENT_DEFAULT=y
|
||||
CONFIG_PM_GENERIC_DOMAINS_SLEEP=y
|
||||
CONFIG_PM_GENERIC_DOMAINS_OF=y
|
||||
# CONFIG_WQ_POWER_EFFICIENT_DEFAULT is not set
|
||||
CONFIG_CPU_PM=y
|
||||
CONFIG_ARCH_HIBERNATION_POSSIBLE=y
|
||||
CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
||||
|
@ -559,6 +549,8 @@ CONFIG_DT_IDLE_STATES=y
|
|||
CONFIG_ARM_CPUIDLE=y
|
||||
# CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED is not set
|
||||
|
||||
#
|
||||
# CPU Frequency scaling
|
||||
#
|
||||
# CPU Frequency scaling
|
||||
#
|
||||
|
@ -566,7 +558,7 @@ 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_WAKE_BOOST=y
|
||||
# CONFIG_CPU_WAKE_BOOST is not set
|
||||
|
||||
#
|
||||
# CPU frequency scaling drivers
|
||||
|
@ -608,7 +600,7 @@ CONFIG_CPUFREQ_DT=y
|
|||
# CONFIG_ARM_BIG_LITTLE_CPUFREQ is not set
|
||||
# CONFIG_ARM_KIRKWOOD_CPUFREQ is not set
|
||||
CONFIG_ARM_ROCKCHIP_CPUFREQ=y
|
||||
# CONFIG_ACPI_CPPC_CPUFREQ is not set
|
||||
|
||||
CONFIG_NET=y
|
||||
CONFIG_COMPAT_NETLINK_MESSAGES=y
|
||||
CONFIG_NET_INGRESS=y
|
||||
|
|
|
@ -1,8 +1,9 @@
|
|||
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||
# Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv)
|
||||
# Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
ACTION!="add|change", GOTO="end"
|
||||
|
||||
DRIVER=="ehci-pci|xhci_hcd", RUN+="/usr/bin/sh -c 'echo disabled > /sys/$devpath/power/wakeup'"
|
||||
DRIVER=="ehci-pci|xhci_hcd", RUN+="/usr/bin/sh -c 'echo disabled > /sys$devpath/power/wakeup'"
|
||||
|
||||
LABEL="end"
|
||||
|
|
|
@ -8,4 +8,10 @@ SUBSYSTEM!="block", GOTO="end_modeswitch"
|
|||
# Atheros Wireless / Netgear WNDA3200
|
||||
ATTRS{idVendor}=="0cf3", ATTRS{idProduct}=="20ff", RUN+="/usr/bin/eject '/dev/%k'"
|
||||
|
||||
# Realtek RTL8821CU chipset 802.11ac NIC
|
||||
# initial cdrom mode 0bda:1a2b, wlan mode 0bda:c811
|
||||
# Odroid WiFi Module 5B
|
||||
# initial cdrom mode 0bda:1a2b, wlan mode 0bda:c820
|
||||
ATTRS{idVendor}=="0bda", ATTRS{idProduct}=="1a2b", RUN+="/usr/bin/eject '/dev/%k'"
|
||||
|
||||
LABEL="end_modeswitch"
|
||||
|
|
|
@ -1,2 +0,0 @@
|
|||
ACTION=="change", SUBSYSTEM=="power_supply", ENV{POWER_SUPPLY_ONLINE}=="0", RUN+="/bin/sh -c 'echo out | /usr/bin/tee /sys/class/gpio/gpio77/direction'"
|
||||
ACTION=="change", SUBSYSTEM=="power_supply", ENV{POWER_SUPPLY_ONLINE}=="1", RUN+="/bin/sh -c 'echo in | /usr/bin/tee /sys/class/gpio/gpio77/direction'"
|