device-xiaomi: new device (!165)
Initial support for Xiaomi A1 aka xiaomi-tissot using LineageOS 15.1 kernel, has similar board to Xiaomi Redmi 4 aka xiaomi-mido with some differences that had to be patched such as reversing skip_initramfs and ignoring dm param. 16.0 kernel boots but display fb init doesn't work. Weston boots with touch support, SSH via USB RNDIS works. [skip ci]: this built once in CI already, good to go.
This commit is contained in:
parent
879213f02c
commit
26592daadc
14 changed files with 5615 additions and 0 deletions
23
device/device-xiaomi-tissot/APKBUILD
Normal file
23
device/device-xiaomi-tissot/APKBUILD
Normal file
|
@ -0,0 +1,23 @@
|
|||
# Reference: <https://postmarketos.org/devicepkg>
|
||||
pkgname="device-xiaomi-tissot"
|
||||
pkgdesc="Xiaomi A1"
|
||||
pkgver=0.1
|
||||
pkgrel=0
|
||||
url="https://postmarketos.org"
|
||||
license="MIT"
|
||||
arch="aarch64"
|
||||
options="!check !archcheck"
|
||||
depends="postmarketos-base linux-xiaomi-tissot mkbootimg mesa-dri-swrast msm-fb-refresher"
|
||||
makedepends="devicepkg-dev"
|
||||
source="deviceinfo
|
||||
"
|
||||
|
||||
build() {
|
||||
devicepkg_build $startdir $pkgname
|
||||
}
|
||||
|
||||
package() {
|
||||
devicepkg_package $startdir $pkgname
|
||||
}
|
||||
|
||||
sha512sums="176aa6496dd4bc335fec4ba986348390b60233ba303d3b170650dbe3020e2a15438ca8708f2d9e5fc92e9dc8f3301fe7ba0f8840e953e4591a7bd7da22c0b459 deviceinfo"
|
33
device/device-xiaomi-tissot/deviceinfo
Normal file
33
device/device-xiaomi-tissot/deviceinfo
Normal file
|
@ -0,0 +1,33 @@
|
|||
# Reference: <https://postmarketos.org/deviceinfo>
|
||||
# Please use double quotes only. You can source this file in shell scripts.
|
||||
|
||||
deviceinfo_format_version="0"
|
||||
deviceinfo_name="Xiaomi A1"
|
||||
deviceinfo_manufacturer="Xiaomi"
|
||||
deviceinfo_codename="xiaomi-tissot"
|
||||
deviceinfo_date=""
|
||||
deviceinfo_dtb=""
|
||||
deviceinfo_modules_initfs=""
|
||||
deviceinfo_arch="aarch64"
|
||||
|
||||
# Device related
|
||||
deviceinfo_keyboard="false"
|
||||
deviceinfo_external_storage="true"
|
||||
deviceinfo_screen_width="1080"
|
||||
deviceinfo_screen_height="1920"
|
||||
deviceinfo_dev_touchscreen="/dev/input/event1"
|
||||
deviceinfo_dev_touchscreen_calibration=""
|
||||
deviceinfo_dev_keyboard=""
|
||||
|
||||
# Bootloader related
|
||||
deviceinfo_flash_method="fastboot"
|
||||
deviceinfo_kernel_cmdline="androidboot.hardware=qcom msm_rtb.filter=0x237 ehci-hcd.park=3 lpm_levels.sleep_disabled=1 androidboot.bootdevice=7824900.sdhci earlycon=msm_hsl_uart,0x78af000 androidboot.selinux=permissive buildvariant=eng"
|
||||
deviceinfo_generate_bootimg="true"
|
||||
deviceinfo_bootimg_qcdt="false"
|
||||
deviceinfo_flash_offset_base="0x80000000"
|
||||
deviceinfo_flash_offset_kernel="0x00008000"
|
||||
deviceinfo_flash_offset_ramdisk="0x01000000"
|
||||
deviceinfo_flash_offset_second="0x00f00000"
|
||||
deviceinfo_flash_offset_tags="0x00000100"
|
||||
deviceinfo_flash_pagesize="2048"
|
||||
deviceinfo_flash_sparse="true"
|
108
device/linux-xiaomi-tissot/APKBUILD
Normal file
108
device/linux-xiaomi-tissot/APKBUILD
Normal file
|
@ -0,0 +1,108 @@
|
|||
# Reference: <https://postmarketos.org/vendorkernel>
|
||||
# Kernel config based on: arch/arm64/configs/tissot_defconfig
|
||||
|
||||
pkgname="linux-xiaomi-tissot"
|
||||
pkgver=3.18.71
|
||||
pkgrel=0
|
||||
pkgdesc="Xiaomi A1 kernel fork"
|
||||
arch="aarch64"
|
||||
_carch="arm64"
|
||||
_flavor="xiaomi-tissot"
|
||||
url="https://kernel.org"
|
||||
license="GPL-2.0-only"
|
||||
options="!strip !check !tracedeps"
|
||||
makedepends="perl sed installkernel bash gmp-dev bc linux-headers elfutils-dev devicepkg-dev gcc6"
|
||||
|
||||
# Compiler: this kernel was only tested with GCC6. Feel free to make a merge
|
||||
# request if you find out that it is booting working with newer GCCs as
|
||||
# well. See <https://postmarketos.org/vendorkernel> for instructions.
|
||||
if [ "${CC:0:5}" != "gcc6-" ]; then
|
||||
CC="gcc6-$CC"
|
||||
HOSTCC="gcc6-gcc"
|
||||
CROSS_COMPILE="gcc6-$CROSS_COMPILE"
|
||||
fi
|
||||
|
||||
# Source
|
||||
_repository="android_kernel_xiaomi_msm8953"
|
||||
_commit="80cb3f607eb78280642c3b9b6e89f676e9c263bf"
|
||||
_config="config-${_flavor}.${arch}"
|
||||
source="
|
||||
$pkgname-$_commit.tar.gz::https://github.com/LineageOS/${_repository}/archive/${_commit}.tar.gz
|
||||
$_config
|
||||
compiler-gcc6.h
|
||||
fix-include-msm_isp.patch
|
||||
fix-include-msm_camera_i2c.patch
|
||||
fix-rndis_ipa.patch
|
||||
fix_u_f_header.patch
|
||||
fix_usb_gadget_function.patch
|
||||
fix_msm_dba.patch
|
||||
init-reverse-skip_initramfs.patch
|
||||
init-ignore-dm-if-skip_initramfs.patch
|
||||
tweak-warn-once-skb_release_head_state.patch
|
||||
"
|
||||
builddir="$srcdir/${_repository}-${_commit}"
|
||||
|
||||
prepare() {
|
||||
default_prepare
|
||||
|
||||
# gcc6 support
|
||||
cp -v "$srcdir/compiler-gcc6.h" "$builddir/include/linux/"
|
||||
|
||||
# Remove -Werror from all makefiles
|
||||
local i
|
||||
local makefiles="$(find . -type f -name Makefile)
|
||||
$(find . -type f -name Kbuild)"
|
||||
for i in $makefiles; do
|
||||
sed -i 's/-Werror-/-W/g' "$i"
|
||||
sed -i 's/-Werror//g' "$i"
|
||||
done
|
||||
|
||||
# Prepare kernel config ('yes ""' for kernels lacking olddefconfig)
|
||||
cp "$srcdir"/$_config "$builddir"/.config
|
||||
yes "" | make ARCH="$_carch" HOSTCC="$HOSTCC" oldconfig
|
||||
}
|
||||
|
||||
build() {
|
||||
unset LDFLAGS
|
||||
make ARCH="$_carch" CC="${CC:-gcc}" \
|
||||
KBUILD_BUILD_VERSION="$((pkgrel + 1 ))-postmarketOS"
|
||||
msg "Combine DTB and Image.gz"
|
||||
msg "(Image.gz-dtb without DTB itself ¯\_(ツ)_/¯)"
|
||||
rm "$builddir/arch/$_carch/boot/Image.gz-dtb"
|
||||
cat "$builddir/arch/$_carch/boot/Image.gz" \
|
||||
"$builddir/arch/$_carch/boot/dts/qcom/msm8953-qrd-sku3-tissot.dtb" \
|
||||
> "$builddir/arch/$_carch/boot/Image.gz-dtb"
|
||||
}
|
||||
|
||||
package() {
|
||||
# kernel.release
|
||||
install -D "$builddir/include/config/kernel.release" \
|
||||
"$pkgdir/usr/share/kernel/$_flavor/kernel.release"
|
||||
|
||||
# zImage (find the right one)
|
||||
cd "$builddir/arch/$_carch/boot"
|
||||
_target="$pkgdir/boot/vmlinuz-$_flavor"
|
||||
for _zimg in zImage-dtb Image.gz-dtb *zImage Image; do
|
||||
[ -e "$_zimg" ] || continue
|
||||
msg "zImage found: $_zimg"
|
||||
install -Dm644 "$_zimg" "$_target"
|
||||
break
|
||||
done
|
||||
if ! [ -e "$_target" ]; then
|
||||
error "Could not find zImage in $PWD!"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
sha512sums="f0bba3e19e8cad92cabaeba63db75af9b2cf1e5fa7e79c7688c487c55db0230840ab838628b8aaf6a39a03d403237ab224aa94fac88eb538b82cb7909f35e43d linux-xiaomi-tissot-80cb3f607eb78280642c3b9b6e89f676e9c263bf.tar.gz
|
||||
54ad078eb8b54037fb1d4191a45a8ebded6ac5e95e7bea41d0f20a75feed5b0dd0654ee1fd17a942939f8953e4f25781559e5f8fb170c58d2e2e6783f0405375 config-xiaomi-tissot.aarch64
|
||||
d80980e9474c82ba0ef1a6903b434d8bd1b092c40367ba543e72d2c119301c8b2d05265740e4104ca1ac5d15f6c4aa49e8776cb44264a9a28dc551e0d1850dcc compiler-gcc6.h
|
||||
a7acfa838563cb3a0da85b0b580b8b6873e87a21c83d060bbacf0f159672353db65d2f5d1d74cfd3b8640336db1b56aa4868dea8dd5eaba6366bc7050624608f fix-include-msm_isp.patch
|
||||
e4a9fca760b22c71ecc6b749afeec0bf2e5571bcde9c3d25612402ee406e2ccdebc6fb1e353851190e948bcda00ed37f7d1bb6c26c08557fda02f37811c80cc7 fix-include-msm_camera_i2c.patch
|
||||
c35a7337ddee41ea355bc3040e258c111b92c62413e355d7fe1329f516f8bdf724bab0cb8f426aee96fc776a8297e7a3ec5414120248538e0ee0ac3265790fbd fix-rndis_ipa.patch
|
||||
b408f157cc025d410b38f5aee9be977e670e1ac3f195f6c3a6681446fa0c3887067d62a4f729cfcd058fab42fca355b0265764dc2d21515f6e023ed025f55d41 fix_u_f_header.patch
|
||||
1f23466d1a864f2d2c67ae4250b0c166ecb7755779bbdad6732808a001cc2826cc1d013c2281d2ca1d5abd7d60d13783f0b9f11bb8359971f2b30b911e627220 fix_usb_gadget_function.patch
|
||||
7e765cb696fa8c3dfbc305b05cbf1fad85fb9572613d5391e945341dae5974a745f4906c795dc841e5562b19ab77d5257f9741e514af2c2573aa4bb8b262ce51 fix_msm_dba.patch
|
||||
32f8180ae59351835f91ead8e38ae4933658c13bfe62bdbb32de82aecb16e1ff9e96333f4f129423ae8be4dc3210ee3bbf3fd0ea199df0f397ecb2f2efe37bcb init-reverse-skip_initramfs.patch
|
||||
d97b343970bba978b0c99222e01d3a66abba9d7fe5725705021b4ab2895dd18df2c68bfbb894f05f2894714b958e1aa63ed5e09d19cbbff1204fdc7f246891b4 init-ignore-dm-if-skip_initramfs.patch
|
||||
170a979908156f740d32fc3a8f74c2b2cb54420e12b81f2373fed1eb095159f1e03d3c24116a345f41ccd927fd93594b0a0e4b58a57ffe6869288f1ec030078c tweak-warn-once-skb_release_head_state.patch"
|
69
device/linux-xiaomi-tissot/compiler-gcc6.h
Normal file
69
device/linux-xiaomi-tissot/compiler-gcc6.h
Normal file
|
@ -0,0 +1,69 @@
|
|||
// SOURCE:
|
||||
// https://github.com/NextThingCo/CHIP-u-boot/issues/10#issuecomment-287515505
|
||||
|
||||
#ifndef __LINUX_COMPILER_H
|
||||
#error "Please don't include <linux/compiler-gcc6.h> directly, include <linux/compiler.h> instead."
|
||||
#endif
|
||||
|
||||
#define __used __attribute__((__used__))
|
||||
#define __must_check __attribute__((warn_unused_result))
|
||||
#define __compiler_offsetof(a, b) __builtin_offsetof(a, b)
|
||||
|
||||
/* Mark functions as cold. gcc will assume any path leading to a call
|
||||
to them will be unlikely. This means a lot of manual unlikely()s
|
||||
are unnecessary now for any paths leading to the usual suspects
|
||||
like BUG(), printk(), panic() etc. [but let's keep them for now for
|
||||
older compilers]
|
||||
|
||||
Early snapshots of gcc 4.3 don't support this and we can't detect this
|
||||
in the preprocessor, but we can live with this because they're unreleased.
|
||||
Maketime probing would be overkill here.
|
||||
|
||||
gcc also has a __attribute__((__hot__)) to move hot functions into
|
||||
a special section, but I don't see any sense in this right now in
|
||||
the kernel context */
|
||||
#define __cold __attribute__((__cold__))
|
||||
|
||||
#define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __COUNTER__)
|
||||
|
||||
#ifndef __CHECKER__
|
||||
# define __compiletime_warning(message) __attribute__((warning(message)))
|
||||
# define __compiletime_error(message) __attribute__((error(message)))
|
||||
#endif /* __CHECKER__ */
|
||||
|
||||
/*
|
||||
* Mark a position in code as unreachable. This can be used to
|
||||
* suppress control flow warnings after asm blocks that transfer
|
||||
* control elsewhere.
|
||||
*
|
||||
* Early snapshots of gcc 4.5 don't support this and we can't detect
|
||||
* this in the preprocessor, but we can live with this because they're
|
||||
* unreleased. Really, we need to have autoconf for the kernel.
|
||||
*/
|
||||
#define unreachable() __builtin_unreachable()
|
||||
|
||||
/* Mark a function definition as prohibited from being cloned. */
|
||||
#define __noclone __attribute__((__noclone__))
|
||||
|
||||
/*
|
||||
* Tell the optimizer that something else uses this function or variable.
|
||||
*/
|
||||
#define __visible __attribute__((externally_visible))
|
||||
|
||||
/*
|
||||
* GCC 'asm goto' miscompiles certain code sequences:
|
||||
*
|
||||
* http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58670
|
||||
*
|
||||
* Work it around via a compiler barrier quirk suggested by Jakub Jelinek.
|
||||
*
|
||||
* (asm goto is automatically volatile - the naming reflects this.)
|
||||
*/
|
||||
#define asm_volatile_goto(x...) do { asm goto(x); asm (""); } while (0)
|
||||
|
||||
#ifdef CONFIG_ARCH_USE_BUILTIN_BSWAP
|
||||
#define __HAVE_BUILTIN_BSWAP32__
|
||||
#define __HAVE_BUILTIN_BSWAP64__
|
||||
#define __HAVE_BUILTIN_BSWAP16__
|
||||
#endif /* CONFIG_ARCH_USE_BUILTIN_BSWAP */
|
||||
|
4558
device/linux-xiaomi-tissot/config-xiaomi-tissot.aarch64
Normal file
4558
device/linux-xiaomi-tissot/config-xiaomi-tissot.aarch64
Normal file
File diff suppressed because it is too large
Load diff
18
device/linux-xiaomi-tissot/fix-include-msm_camera_i2c.patch
Normal file
18
device/linux-xiaomi-tissot/fix-include-msm_camera_i2c.patch
Normal file
|
@ -0,0 +1,18 @@
|
|||
diff --git a/drivers/media/platform/msm/camera_v2/sensor/msm_sensor.h b/drivers/media/platform/msm/camera_v2/sensor/msm_sensor.h
|
||||
index 5d57ec8c28ff..cc69fa018d65 100644
|
||||
--- a/drivers/media/platform/msm/camera_v2/sensor/msm_sensor.h
|
||||
+++ b/drivers/media/platform/msm/camera_v2/sensor/msm_sensor.h
|
||||
@@ -31,9 +31,10 @@
|
||||
#include <media/msm_cam_sensor.h>
|
||||
#include <media/v4l2-subdev.h>
|
||||
#include <media/v4l2-ioctl.h>
|
||||
-#include "msm_camera_i2c.h"
|
||||
-#include "msm_camera_dt_util.h"
|
||||
-#include "msm_sd.h"
|
||||
+
|
||||
+#include "io/msm_camera_i2c.h"
|
||||
+#include "io/msm_camera_dt_util.h"
|
||||
+#include "../msm_sd.h"
|
||||
|
||||
#define DEFINE_MSM_MUTEX(mutexname) \
|
||||
static struct mutex mutexname = __MUTEX_INITIALIZER(mutexname)
|
12
device/linux-xiaomi-tissot/fix-include-msm_isp.patch
Normal file
12
device/linux-xiaomi-tissot/fix-include-msm_isp.patch
Normal file
|
@ -0,0 +1,12 @@
|
|||
diff --git a/include/trace/events/msm_cam.h b/include/trace/events/msm_cam.h
|
||||
index b52845407ef0..2cd283db8d32 100644
|
||||
--- a/include/trace/events/msm_cam.h
|
||||
+++ b/include/trace/events/msm_cam.h
|
||||
@@ -16,7 +16,7 @@
|
||||
#if !defined(_TRACE_MSM_VFE_H) || defined(TRACE_HEADER_MULTI_READ)
|
||||
#define _TRACE_MSM_VFE_H
|
||||
|
||||
-#include "msm_isp.h"
|
||||
+#include "../../../drivers/media/platform/msm/camera_v2/isp/msm_isp.h"
|
||||
#include <linux/types.h>
|
||||
#include <linux/tracepoint.h>
|
32
device/linux-xiaomi-tissot/fix-rndis_ipa.patch
Normal file
32
device/linux-xiaomi-tissot/fix-rndis_ipa.patch
Normal file
|
@ -0,0 +1,32 @@
|
|||
diff --git a/drivers/net/ethernet/msm/Makefile b/drivers/net/ethernet/msm/Makefile
|
||||
index 5bf934e82fce..6d252a523be3 100644
|
||||
--- a/drivers/net/ethernet/msm/Makefile
|
||||
+++ b/drivers/net/ethernet/msm/Makefile
|
||||
@@ -2,6 +2,8 @@
|
||||
# Makefile for the msm networking support.
|
||||
#
|
||||
|
||||
+CFLAGS_rndis_ipa.o := -I$(src)
|
||||
+
|
||||
obj-$(CONFIG_MSM_RMNET_MHI) += msm_rmnet_mhi.o
|
||||
obj-$(CONFIG_ECM_IPA) += ecm_ipa.o
|
||||
obj-$(CONFIG_RNDIS_IPA) += rndis_ipa.o
|
||||
diff --git a/drivers/platform/msm/ipa/ipa_v2/Makefile b/drivers/platform/msm/ipa/ipa_v2/Makefile
|
||||
index 69b8a4c94461..8bb29f9774f6 100644
|
||||
--- a/drivers/platform/msm/ipa/ipa_v2/Makefile
|
||||
+++ b/drivers/platform/msm/ipa/ipa_v2/Makefile
|
||||
@@ -1,3 +1,4 @@
|
||||
+CFLAGS_ipa.o := -I$(src)
|
||||
obj-$(CONFIG_IPA) += ipat.o
|
||||
ipat-y := ipa.o ipa_debugfs.o ipa_hdr.o ipa_flt.o ipa_rt.o ipa_dp.o ipa_client.o \
|
||||
ipa_utils.o ipa_nat.o ipa_intf.o teth_bridge.o ipa_interrupts.o \
|
||||
diff --git a/drivers/platform/msm/ipa/ipa_v3/Makefile b/drivers/platform/msm/ipa/ipa_v3/Makefile
|
||||
index a4faaea715a8..9862cad0d43f 100644
|
||||
--- a/drivers/platform/msm/ipa/ipa_v3/Makefile
|
||||
+++ b/drivers/platform/msm/ipa/ipa_v3/Makefile
|
||||
@@ -6,3 +6,5 @@ ipat-y := ipa.o ipa_debugfs.o ipa_hdr.o ipa_flt.o ipa_rt.o ipa_dp.o ipa_client.o
|
||||
ipa_uc.o ipa_uc_wdi.o ipa_dma.o ipa_uc_mhi.o ipa_mhi.o ipa_uc_ntn.o
|
||||
|
||||
obj-$(CONFIG_RMNET_IPA3) += rmnet_ipa.o ipa_qmi_service_v01.o ipa_qmi_service.o rmnet_ipa_fd_ioctl.o
|
||||
+
|
||||
+CFLAGS_ipa.o := -I$(src)
|
13
device/linux-xiaomi-tissot/fix_msm_dba.patch
Normal file
13
device/linux-xiaomi-tissot/fix_msm_dba.patch
Normal file
|
@ -0,0 +1,13 @@
|
|||
diff --git a/drivers/video/msm/msm_dba/msm_dba.c b/drivers/video/msm/msm_dba/msm_dba.c
|
||||
index cc6512a..eb073a7 100644
|
||||
--- a/drivers/video/msm/msm_dba/msm_dba.c
|
||||
+++ b/drivers/video/msm/msm_dba/msm_dba.c
|
||||
@@ -22,7 +22,7 @@
|
||||
#include <linux/err.h>
|
||||
|
||||
#include <video/msm_dba.h>
|
||||
-#include <msm_dba_internal.h>
|
||||
+#include "msm_dba_internal.h"
|
||||
|
||||
static DEFINE_MUTEX(register_mutex);
|
||||
|
58
device/linux-xiaomi-tissot/fix_u_f_header.patch
Normal file
58
device/linux-xiaomi-tissot/fix_u_f_header.patch
Normal file
|
@ -0,0 +1,58 @@
|
|||
diff --git a/drivers/usb/gadget/function/u_f.h b/drivers/usb/gadget/function/u_f.h
|
||||
new file mode 100644
|
||||
index 0000000..1d5f0eb
|
||||
--- /dev/null
|
||||
+++ b/drivers/usb/gadget/function/u_f.h
|
||||
@@ -0,0 +1,52 @@
|
||||
+/*
|
||||
+ * u_f.h
|
||||
+ *
|
||||
+ * Utility definitions for USB functions
|
||||
+ *
|
||||
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd.
|
||||
+ * http://www.samsung.com
|
||||
+ *
|
||||
+ * Author: Andrzej Pietrasiewicz <andrzej.p@samsung.com>
|
||||
+ *
|
||||
+ * This program is free software; you can redistribute it and/or modify
|
||||
+ * it under the terms of the GNU General Public License version 2 as
|
||||
+ * published by the Free Software Foundation.
|
||||
+ */
|
||||
+
|
||||
+#ifndef __U_F_H__
|
||||
+#define __U_F_H__
|
||||
+
|
||||
+/* Variable Length Array Macros **********************************************/
|
||||
+#define vla_group(groupname) size_t groupname##__next = 0
|
||||
+#define vla_group_size(groupname) groupname##__next
|
||||
+
|
||||
+#define vla_item(groupname, type, name, n) \
|
||||
+ size_t groupname##_##name##__offset = ({ \
|
||||
+ size_t align_mask = __alignof__(type) - 1; \
|
||||
+ size_t offset = (groupname##__next + align_mask) & ~align_mask;\
|
||||
+ size_t size = (n) * sizeof(type); \
|
||||
+ groupname##__next = offset + size; \
|
||||
+ offset; \
|
||||
+ })
|
||||
+
|
||||
+#define vla_item_with_sz(groupname, type, name, n) \
|
||||
+ size_t groupname##_##name##__sz = (n) * sizeof(type); \
|
||||
+ size_t groupname##_##name##__offset = ({ \
|
||||
+ size_t align_mask = __alignof__(type) - 1; \
|
||||
+ size_t offset = (groupname##__next + align_mask) & ~align_mask;\
|
||||
+ size_t size = groupname##_##name##__sz; \
|
||||
+ groupname##__next = offset + size; \
|
||||
+ offset; \
|
||||
+ })
|
||||
+
|
||||
+#define vla_ptr(ptr, groupname, name) \
|
||||
+ ((void *) ((char *)ptr + groupname##_##name##__offset))
|
||||
+
|
||||
+struct usb_ep;
|
||||
+struct usb_request;
|
||||
+
|
||||
+struct usb_request *alloc_ep_req(struct usb_ep *ep, int len, int default_len);
|
||||
+
|
||||
+#endif /* __U_F_H__ */
|
||||
+
|
||||
+
|
590
device/linux-xiaomi-tissot/fix_usb_gadget_function.patch
Normal file
590
device/linux-xiaomi-tissot/fix_usb_gadget_function.patch
Normal file
|
@ -0,0 +1,590 @@
|
|||
diff --git a/drivers/usb/gadget/function/ci13xxx_udc.h b/drivers/usb/gadget/function/ci13xxx_udc.h
|
||||
new file mode 100644
|
||||
index 0000000..7983bfd
|
||||
--- /dev/null
|
||||
+++ b/drivers/usb/gadget/function/ci13xxx_udc.h
|
||||
@@ -0,0 +1,280 @@
|
||||
+/*
|
||||
+ * ci13xxx_udc.h - structures, registers, and macros MIPS USB IP core
|
||||
+ *
|
||||
+ * Copyright (C) 2008 Chipidea - MIPS Technologies, Inc. All rights reserved.
|
||||
+ *
|
||||
+ * Author: David Lopo
|
||||
+ *
|
||||
+ * This program is free software; you can redistribute it and/or modify
|
||||
+ * it under the terms of the GNU General Public License version 2 as
|
||||
+ * published by the Free Software Foundation.
|
||||
+ *
|
||||
+ * Description: MIPS USB IP core family device controller
|
||||
+ * Structures, registers and logging macros
|
||||
+ */
|
||||
+
|
||||
+#ifndef _CI13XXX_h_
|
||||
+#define _CI13XXX_h_
|
||||
+
|
||||
+/******************************************************************************
|
||||
+ * DEFINE
|
||||
+ *****************************************************************************/
|
||||
+#define CI13XXX_PAGE_SIZE 4096ul /* page size for TD's */
|
||||
+#define ENDPT_MAX (32)
|
||||
+#define CTRL_PAYLOAD_MAX (64)
|
||||
+#define RX (0) /* similar to USB_DIR_OUT but can be used as an index */
|
||||
+#define TX (1) /* similar to USB_DIR_IN but can be used as an index */
|
||||
+
|
||||
+/* UDC private data:
|
||||
+ * 16MSb - Vendor ID | 16 LSb Vendor private data
|
||||
+ */
|
||||
+#define CI13XX_REQ_VENDOR_ID(id) (id & 0xFFFF0000UL)
|
||||
+
|
||||
+#define MSM_ETD_TYPE BIT(1)
|
||||
+#define MSM_EP_PIPE_ID_RESET_VAL 0x1F001F
|
||||
+
|
||||
+/******************************************************************************
|
||||
+ * STRUCTURES
|
||||
+ *****************************************************************************/
|
||||
+/* DMA layout of transfer descriptors */
|
||||
+struct ci13xxx_td {
|
||||
+ /* 0 */
|
||||
+ u32 next;
|
||||
+#define TD_TERMINATE BIT(0)
|
||||
+#define TD_ADDR_MASK (0xFFFFFFEUL << 5)
|
||||
+ /* 1 */
|
||||
+ u32 token;
|
||||
+#define TD_STATUS (0x00FFUL << 0)
|
||||
+#define TD_STATUS_TR_ERR BIT(3)
|
||||
+#define TD_STATUS_DT_ERR BIT(5)
|
||||
+#define TD_STATUS_HALTED BIT(6)
|
||||
+#define TD_STATUS_ACTIVE BIT(7)
|
||||
+#define TD_MULTO (0x0003UL << 10)
|
||||
+#define TD_IOC BIT(15)
|
||||
+#define TD_TOTAL_BYTES (0x7FFFUL << 16)
|
||||
+ /* 2 */
|
||||
+ u32 page[5];
|
||||
+#define TD_CURR_OFFSET (0x0FFFUL << 0)
|
||||
+#define TD_FRAME_NUM (0x07FFUL << 0)
|
||||
+#define TD_RESERVED_MASK (0x0FFFUL << 0)
|
||||
+} __attribute__ ((packed, aligned(4)));
|
||||
+
|
||||
+/* DMA layout of queue heads */
|
||||
+struct ci13xxx_qh {
|
||||
+ /* 0 */
|
||||
+ u32 cap;
|
||||
+#define QH_IOS BIT(15)
|
||||
+#define QH_MAX_PKT (0x07FFUL << 16)
|
||||
+#define QH_ZLT BIT(29)
|
||||
+#define QH_MULT (0x0003UL << 30)
|
||||
+#define QH_MULT_SHIFT 11
|
||||
+ /* 1 */
|
||||
+ u32 curr;
|
||||
+ /* 2 - 8 */
|
||||
+ struct ci13xxx_td td;
|
||||
+ /* 9 */
|
||||
+ u32 RESERVED;
|
||||
+ struct usb_ctrlrequest setup;
|
||||
+} __attribute__ ((packed, aligned(4)));
|
||||
+
|
||||
+/* cache of larger request's original attributes */
|
||||
+struct ci13xxx_multi_req {
|
||||
+ unsigned len;
|
||||
+ unsigned actual;
|
||||
+ void *buf;
|
||||
+};
|
||||
+
|
||||
+/* Extension of usb_request */
|
||||
+struct ci13xxx_req {
|
||||
+ struct usb_request req;
|
||||
+ unsigned map;
|
||||
+ struct list_head queue;
|
||||
+ struct ci13xxx_td *ptr;
|
||||
+ dma_addr_t dma;
|
||||
+ struct ci13xxx_td *zptr;
|
||||
+ dma_addr_t zdma;
|
||||
+ struct ci13xxx_multi_req multi;
|
||||
+};
|
||||
+
|
||||
+/* Extension of usb_ep */
|
||||
+struct ci13xxx_ep {
|
||||
+ struct usb_ep ep;
|
||||
+ const struct usb_endpoint_descriptor *desc;
|
||||
+ u8 dir;
|
||||
+ u8 num;
|
||||
+ u8 type;
|
||||
+ char name[16];
|
||||
+ struct {
|
||||
+ struct list_head queue;
|
||||
+ struct ci13xxx_qh *ptr;
|
||||
+ dma_addr_t dma;
|
||||
+ } qh;
|
||||
+ struct list_head rw_queue;
|
||||
+ int wedge;
|
||||
+
|
||||
+ /* global resources */
|
||||
+ spinlock_t *lock;
|
||||
+ struct device *device;
|
||||
+ struct dma_pool *td_pool;
|
||||
+ struct ci13xxx_td *last_zptr;
|
||||
+ dma_addr_t last_zdma;
|
||||
+ unsigned long dTD_update_fail_count;
|
||||
+ unsigned long dTD_active_re_q_count;
|
||||
+ unsigned long prime_fail_count;
|
||||
+ int prime_timer_count;
|
||||
+ struct timer_list prime_timer;
|
||||
+
|
||||
+ bool multi_req;
|
||||
+};
|
||||
+
|
||||
+struct ci13xxx;
|
||||
+struct ci13xxx_udc_driver {
|
||||
+ const char *name;
|
||||
+ unsigned long flags;
|
||||
+ unsigned int nz_itc;
|
||||
+#define CI13XXX_REGS_SHARED BIT(0)
|
||||
+#define CI13XXX_REQUIRE_TRANSCEIVER BIT(1)
|
||||
+#define CI13XXX_PULLUP_ON_VBUS BIT(2)
|
||||
+#define CI13XXX_DISABLE_STREAMING BIT(3)
|
||||
+#define CI13XXX_ZERO_ITC BIT(4)
|
||||
+#define CI13XXX_ENABLE_AHB2AHB_BYPASS BIT(6)
|
||||
+
|
||||
+#define CI13XXX_CONTROLLER_RESET_EVENT 0
|
||||
+#define CI13XXX_CONTROLLER_CONNECT_EVENT 1
|
||||
+#define CI13XXX_CONTROLLER_SUSPEND_EVENT 2
|
||||
+#define CI13XXX_CONTROLLER_REMOTE_WAKEUP_EVENT 3
|
||||
+#define CI13XXX_CONTROLLER_RESUME_EVENT 4
|
||||
+#define CI13XXX_CONTROLLER_DISCONNECT_EVENT 5
|
||||
+#define CI13XXX_CONTROLLER_UDC_STARTED_EVENT 6
|
||||
+#define CI13XXX_CONTROLLER_ERROR_EVENT 7
|
||||
+
|
||||
+ void (*notify_event)(struct ci13xxx *udc, unsigned event);
|
||||
+ bool (*in_lpm)(struct ci13xxx *udc);
|
||||
+};
|
||||
+
|
||||
+/* CI13XXX UDC descriptor & global resources */
|
||||
+struct ci13xxx {
|
||||
+ spinlock_t *lock; /* ctrl register bank access */
|
||||
+ void __iomem *regs; /* registers address space */
|
||||
+
|
||||
+ struct dma_pool *qh_pool; /* DMA pool for queue heads */
|
||||
+ struct dma_pool *td_pool; /* DMA pool for transfer descs */
|
||||
+ struct usb_request *status; /* ep0 status request */
|
||||
+ void *status_buf;/* GET_STATUS buffer */
|
||||
+
|
||||
+ struct usb_gadget gadget; /* USB slave device */
|
||||
+ struct ci13xxx_ep ci13xxx_ep[ENDPT_MAX]; /* extended endpts */
|
||||
+ u32 ep0_dir; /* ep0 direction */
|
||||
+#define ep0out ci13xxx_ep[0]
|
||||
+#define ep0in ci13xxx_ep[hw_ep_max / 2]
|
||||
+ u8 suspended; /* suspended by the host */
|
||||
+ u8 configured; /* is device configured */
|
||||
+ u8 test_mode; /* the selected test mode */
|
||||
+ bool rw_pending; /* Remote wakeup pending flag */
|
||||
+ struct delayed_work rw_work; /* remote wakeup delayed work */
|
||||
+ struct usb_gadget_driver *driver; /* 3rd party gadget driver */
|
||||
+ struct ci13xxx_udc_driver *udc_driver; /* device controller driver */
|
||||
+ int vbus_active; /* is VBUS active */
|
||||
+ int softconnect; /* is pull-up enable allowed */
|
||||
+ unsigned long dTD_update_fail_count;
|
||||
+ struct usb_phy *transceiver; /* Transceiver struct */
|
||||
+ bool skip_flush; /* skip flushing remaining EP
|
||||
+ upon flush timeout for the
|
||||
+ first EP. */
|
||||
+};
|
||||
+
|
||||
+/******************************************************************************
|
||||
+ * REGISTERS
|
||||
+ *****************************************************************************/
|
||||
+/* register size */
|
||||
+#define REG_BITS (32)
|
||||
+
|
||||
+/* HCCPARAMS */
|
||||
+#define HCCPARAMS_LEN BIT(17)
|
||||
+
|
||||
+/* DCCPARAMS */
|
||||
+#define DCCPARAMS_DEN (0x1F << 0)
|
||||
+#define DCCPARAMS_DC BIT(7)
|
||||
+
|
||||
+/* TESTMODE */
|
||||
+#define TESTMODE_FORCE BIT(0)
|
||||
+
|
||||
+/* AHB_MODE */
|
||||
+#define AHB2AHB_BYPASS BIT(31)
|
||||
+
|
||||
+/* USBCMD */
|
||||
+#define USBCMD_RS BIT(0)
|
||||
+#define USBCMD_RST BIT(1)
|
||||
+#define USBCMD_SUTW BIT(13)
|
||||
+#define USBCMD_ATDTW BIT(14)
|
||||
+
|
||||
+/* USBSTS & USBINTR */
|
||||
+#define USBi_UI BIT(0)
|
||||
+#define USBi_UEI BIT(1)
|
||||
+#define USBi_PCI BIT(2)
|
||||
+#define USBi_URI BIT(6)
|
||||
+#define USBi_SLI BIT(8)
|
||||
+
|
||||
+/* DEVICEADDR */
|
||||
+#define DEVICEADDR_USBADRA BIT(24)
|
||||
+#define DEVICEADDR_USBADR (0x7FUL << 25)
|
||||
+
|
||||
+/* PORTSC */
|
||||
+#define PORTSC_FPR BIT(6)
|
||||
+#define PORTSC_SUSP BIT(7)
|
||||
+#define PORTSC_PR BIT(8)
|
||||
+#define PORTSC_HSP BIT(9)
|
||||
+#define PORTSC_PTC (0x0FUL << 16)
|
||||
+
|
||||
+/* DEVLC */
|
||||
+#define DEVLC_PSPD (0x03UL << 25)
|
||||
+#define DEVLC_PSPD_HS (0x02UL << 25)
|
||||
+
|
||||
+/* USBMODE */
|
||||
+#define USBMODE_CM (0x03UL << 0)
|
||||
+#define USBMODE_CM_IDLE (0x00UL << 0)
|
||||
+#define USBMODE_CM_DEVICE (0x02UL << 0)
|
||||
+#define USBMODE_CM_HOST (0x03UL << 0)
|
||||
+#define USBMODE_SLOM BIT(3)
|
||||
+#define USBMODE_SDIS BIT(4)
|
||||
+#define USBCMD_ITC(n) (n << 16) /* n = 0, 1, 2, 4, 8, 16, 32, 64 */
|
||||
+#define USBCMD_ITC_MASK (0xFF << 16)
|
||||
+
|
||||
+/* ENDPTCTRL */
|
||||
+#define ENDPTCTRL_RXS BIT(0)
|
||||
+#define ENDPTCTRL_RXT (0x03UL << 2)
|
||||
+#define ENDPTCTRL_RXR BIT(6) /* reserved for port 0 */
|
||||
+#define ENDPTCTRL_RXE BIT(7)
|
||||
+#define ENDPTCTRL_TXS BIT(16)
|
||||
+#define ENDPTCTRL_TXT (0x03UL << 18)
|
||||
+#define ENDPTCTRL_TXR BIT(22) /* reserved for port 0 */
|
||||
+#define ENDPTCTRL_TXE BIT(23)
|
||||
+
|
||||
+/******************************************************************************
|
||||
+ * LOGGING
|
||||
+ *****************************************************************************/
|
||||
+#define ci13xxx_printk(level, format, args...) \
|
||||
+do { \
|
||||
+ if (_udc == NULL) \
|
||||
+ printk(level "[%s] " format "\n", __func__, ## args); \
|
||||
+ else \
|
||||
+ dev_printk(level, _udc->gadget.dev.parent, \
|
||||
+ "[%s] " format "\n", __func__, ## args); \
|
||||
+} while (0)
|
||||
+
|
||||
+#ifndef err
|
||||
+#define err(format, args...) ci13xxx_printk(KERN_ERR, format, ## args)
|
||||
+#endif
|
||||
+
|
||||
+#define warn(format, args...) ci13xxx_printk(KERN_WARNING, format, ## args)
|
||||
+#define info(format, args...) ci13xxx_printk(KERN_INFO, format, ## args)
|
||||
+
|
||||
+#ifdef TRACE
|
||||
+#define trace(format, args...) ci13xxx_printk(KERN_DEBUG, format, ## args)
|
||||
+#define dbg_trace(format, args...) dev_dbg(dev, format, ##args)
|
||||
+#else
|
||||
+#define trace(format, args...) do {} while (0)
|
||||
+#define dbg_trace(format, args...) do {} while (0)
|
||||
+#endif
|
||||
+
|
||||
+#endif /* _CI13XXX_h_ */
|
||||
diff --git a/drivers/usb/gadget/function/configfs.h b/drivers/usb/gadget/function/configfs.h
|
||||
new file mode 100644
|
||||
index 0000000..36c468c
|
||||
--- /dev/null
|
||||
+++ b/drivers/usb/gadget/function/configfs.h
|
||||
@@ -0,0 +1,19 @@
|
||||
+#ifndef USB__GADGET__CONFIGFS__H
|
||||
+#define USB__GADGET__CONFIGFS__H
|
||||
+
|
||||
+#include <linux/configfs.h>
|
||||
+
|
||||
+void unregister_gadget_item(struct config_item *item);
|
||||
+
|
||||
+int usb_os_desc_prepare_interf_dir(struct config_group *parent,
|
||||
+ int n_interf,
|
||||
+ struct usb_os_desc **desc,
|
||||
+ char **names,
|
||||
+ struct module *owner);
|
||||
+
|
||||
+static inline struct usb_os_desc *to_usb_os_desc(struct config_item *item)
|
||||
+{
|
||||
+ return container_of(to_config_group(item), struct usb_os_desc, group);
|
||||
+}
|
||||
+
|
||||
+#endif /* USB__GADGET__CONFIGFS__H */
|
||||
diff --git a/drivers/usb/gadget/function/debug.h b/drivers/usb/gadget/function/debug.h
|
||||
new file mode 100644
|
||||
index 0000000..8729aca
|
||||
--- /dev/null
|
||||
+++ b/drivers/usb/gadget/function/debug.h
|
||||
@@ -0,0 +1,55 @@
|
||||
+/*
|
||||
+ * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved.
|
||||
+ *
|
||||
+ * This program is free software; you can redistribute it and/or modify
|
||||
+ * it under the terms of the GNU General Public License version 2 and
|
||||
+ * only version 2 as published by the Free Software Foundation.
|
||||
+ *
|
||||
+ * This program is distributed in the hope that it will be useful,
|
||||
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+ * GNU General Public License for more details.
|
||||
+ *
|
||||
+ */
|
||||
+
|
||||
+#ifndef __DEBUG_H_
|
||||
+#define __DEBUG_H_
|
||||
+
|
||||
+#define DBG_MAX_MSG 1024UL
|
||||
+#define DBG_MSG_LEN 80UL
|
||||
+#define TIME_BUF_LEN 17
|
||||
+#define DBG_EVENT_LEN (DBG_MSG_LEN - TIME_BUF_LEN)
|
||||
+
|
||||
+extern unsigned int enable_event_log;
|
||||
+extern void put_timestamp(char *tbuf);
|
||||
+extern void add_event_to_buf(char *tbuf);
|
||||
+extern int debug_debugfs_init(void);
|
||||
+extern void debug_debugfs_exit(void);
|
||||
+
|
||||
+#define LOGLEVEL_NONE 8
|
||||
+#define LOGLEVEL_DEBUG 7
|
||||
+#define LOGLEVEL_INFO 6
|
||||
+#define LOGLEVEL_ERR 3
|
||||
+
|
||||
+#define log_event(log_level, x...) \
|
||||
+do { \
|
||||
+ char buf[DBG_MSG_LEN]; \
|
||||
+ if (log_level == LOGLEVEL_DEBUG) \
|
||||
+ pr_debug(x); \
|
||||
+ else if (log_level == LOGLEVEL_ERR) \
|
||||
+ pr_err(x); \
|
||||
+ else if (log_level == LOGLEVEL_INFO) \
|
||||
+ pr_info(x); \
|
||||
+ if (enable_event_log) { \
|
||||
+ put_timestamp(buf); \
|
||||
+ snprintf(&buf[TIME_BUF_LEN - 1], DBG_EVENT_LEN, x); \
|
||||
+ add_event_to_buf(buf); \
|
||||
+ } \
|
||||
+} while (0)
|
||||
+
|
||||
+#define log_event_none(x, ...) log_event(LOGLEVEL_NONE, x, ##__VA_ARGS__)
|
||||
+#define log_event_dbg(x, ...) log_event(LOGLEVEL_DEBUG, x, ##__VA_ARGS__)
|
||||
+#define log_event_err(x, ...) log_event(LOGLEVEL_ERR, x, ##__VA_ARGS__)
|
||||
+#define log_event_info(x, ...) log_event(LOGLEVEL_INFO, x, ##__VA_ARGS__)
|
||||
+
|
||||
+#endif /* __DEBUG_H_ */
|
||||
diff --git a/drivers/usb/gadget/function/f_ccid.h b/drivers/usb/gadget/function/f_ccid.h
|
||||
new file mode 100644
|
||||
index 0000000..d899044
|
||||
--- /dev/null
|
||||
+++ b/drivers/usb/gadget/function/f_ccid.h
|
||||
@@ -0,0 +1,83 @@
|
||||
+/*
|
||||
+ * Copyright (c) 2011, The Linux Foundation. All rights reserved.
|
||||
+
|
||||
+ * This program is free software; you can redistribute it and/or modify
|
||||
+ * it under the terms of the GNU General Public License version 2 and
|
||||
+ * only version 2 as published by the Free Software Foundation.
|
||||
+
|
||||
+ * This program is distributed in the hope that it will be useful,
|
||||
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+ * GNU General Public License for more details
|
||||
+ */
|
||||
+
|
||||
+#ifndef __F_CCID_H
|
||||
+#define __F_CCID_H
|
||||
+
|
||||
+#define PROTOCOL_TO 0x01
|
||||
+#define PROTOCOL_T1 0x02
|
||||
+#define ABDATA_SIZE 512
|
||||
+
|
||||
+/* define for dwFeatures for Smart Card Device Class Descriptors */
|
||||
+/* No special characteristics */
|
||||
+#define CCID_FEATURES_NADA 0x00000000
|
||||
+/* Automatic parameter configuration based on ATR data */
|
||||
+#define CCID_FEATURES_AUTO_PCONF 0x00000002
|
||||
+/* Automatic activation of ICC on inserting */
|
||||
+#define CCID_FEATURES_AUTO_ACTIV 0x00000004
|
||||
+/* Automatic ICC voltage selection */
|
||||
+#define CCID_FEATURES_AUTO_VOLT 0x00000008
|
||||
+/* Automatic ICC clock frequency change */
|
||||
+#define CCID_FEATURES_AUTO_CLOCK 0x00000010
|
||||
+/* Automatic baud rate change */
|
||||
+#define CCID_FEATURES_AUTO_BAUD 0x00000020
|
||||
+/*Automatic parameters negotiation made by the CCID */
|
||||
+#define CCID_FEATURES_AUTO_PNEGO 0x00000040
|
||||
+/* Automatic PPS made by the CCID according to the active parameters */
|
||||
+#define CCID_FEATURES_AUTO_PPS 0x00000080
|
||||
+/* CCID can set ICC in clock stop mode */
|
||||
+#define CCID_FEATURES_ICCSTOP 0x00000100
|
||||
+/* NAD value other than 00 accepted (T=1 protocol in use) */
|
||||
+#define CCID_FEATURES_NAD 0x00000200
|
||||
+/* Automatic IFSD exchange as first exchange (T=1 protocol in use) */
|
||||
+#define CCID_FEATURES_AUTO_IFSD 0x00000400
|
||||
+/* TPDU level exchanges with CCID */
|
||||
+#define CCID_FEATURES_EXC_TPDU 0x00010000
|
||||
+/* Short APDU level exchange with CCID */
|
||||
+#define CCID_FEATURES_EXC_SAPDU 0x00020000
|
||||
+/* Short and Extended APDU level exchange with CCID */
|
||||
+#define CCID_FEATURES_EXC_APDU 0x00040000
|
||||
+/* USB Wake up signaling supported on card insertion and removal */
|
||||
+#define CCID_FEATURES_WAKEUP 0x00100000
|
||||
+
|
||||
+#define CCID_NOTIFY_CARD _IOW('C', 1, struct usb_ccid_notification)
|
||||
+#define CCID_NOTIFY_HWERROR _IOW('C', 2, struct usb_ccid_notification)
|
||||
+#define CCID_READ_DTR _IOR('C', 3, int)
|
||||
+
|
||||
+struct usb_ccid_notification {
|
||||
+ unsigned char buf[4];
|
||||
+} __packed;
|
||||
+
|
||||
+struct ccid_bulk_in_header {
|
||||
+ unsigned char bMessageType;
|
||||
+ unsigned long wLength;
|
||||
+ unsigned char bSlot;
|
||||
+ unsigned char bSeq;
|
||||
+ unsigned char bStatus;
|
||||
+ unsigned char bError;
|
||||
+ unsigned char bSpecific;
|
||||
+ unsigned char abData[ABDATA_SIZE];
|
||||
+ unsigned char bSizeToSend;
|
||||
+} __packed;
|
||||
+
|
||||
+struct ccid_bulk_out_header {
|
||||
+ unsigned char bMessageType;
|
||||
+ unsigned long wLength;
|
||||
+ unsigned char bSlot;
|
||||
+ unsigned char bSeq;
|
||||
+ unsigned char bSpecific_0;
|
||||
+ unsigned char bSpecific_1;
|
||||
+ unsigned char bSpecific_2;
|
||||
+ unsigned char APDU[ABDATA_SIZE];
|
||||
+} __packed;
|
||||
+#endif
|
||||
diff --git a/drivers/usb/gadget/function/u_os_desc.h b/drivers/usb/gadget/function/u_os_desc.h
|
||||
new file mode 100644
|
||||
index 0000000..947b7dd
|
||||
--- /dev/null
|
||||
+++ b/drivers/usb/gadget/function/u_os_desc.h
|
||||
@@ -0,0 +1,123 @@
|
||||
+/*
|
||||
+ * u_os_desc.h
|
||||
+ *
|
||||
+ * Utility definitions for "OS Descriptors" support
|
||||
+ *
|
||||
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd.
|
||||
+ * http://www.samsung.com
|
||||
+ *
|
||||
+ * Author: Andrzej Pietrasiewicz <andrzej.p@samsung.com>
|
||||
+ *
|
||||
+ * This program is free software; you can redistribute it and/or modify
|
||||
+ * it under the terms of the GNU General Public License version 2 as
|
||||
+ * published by the Free Software Foundation.
|
||||
+ */
|
||||
+
|
||||
+#ifndef __U_OS_DESC_H__
|
||||
+#define __U_OS_DESC_H__
|
||||
+
|
||||
+#include <asm/unaligned.h>
|
||||
+#include <linux/nls.h>
|
||||
+
|
||||
+#define USB_EXT_PROP_DW_SIZE 0
|
||||
+#define USB_EXT_PROP_DW_PROPERTY_DATA_TYPE 4
|
||||
+#define USB_EXT_PROP_W_PROPERTY_NAME_LENGTH 8
|
||||
+#define USB_EXT_PROP_B_PROPERTY_NAME 10
|
||||
+#define USB_EXT_PROP_DW_PROPERTY_DATA_LENGTH 10
|
||||
+#define USB_EXT_PROP_B_PROPERTY_DATA 14
|
||||
+
|
||||
+#define USB_EXT_PROP_RESERVED 0
|
||||
+#define USB_EXT_PROP_UNICODE 1
|
||||
+#define USB_EXT_PROP_UNICODE_ENV 2
|
||||
+#define USB_EXT_PROP_BINARY 3
|
||||
+#define USB_EXT_PROP_LE32 4
|
||||
+#define USB_EXT_PROP_BE32 5
|
||||
+#define USB_EXT_PROP_UNICODE_LINK 6
|
||||
+#define USB_EXT_PROP_UNICODE_MULTI 7
|
||||
+
|
||||
+static inline u8 *__usb_ext_prop_ptr(u8 *buf, size_t offset)
|
||||
+{
|
||||
+ return buf + offset;
|
||||
+}
|
||||
+
|
||||
+static inline u8 *usb_ext_prop_size_ptr(u8 *buf)
|
||||
+{
|
||||
+ return __usb_ext_prop_ptr(buf, USB_EXT_PROP_DW_SIZE);
|
||||
+}
|
||||
+
|
||||
+static inline u8 *usb_ext_prop_type_ptr(u8 *buf)
|
||||
+{
|
||||
+ return __usb_ext_prop_ptr(buf, USB_EXT_PROP_DW_PROPERTY_DATA_TYPE);
|
||||
+}
|
||||
+
|
||||
+static inline u8 *usb_ext_prop_name_len_ptr(u8 *buf)
|
||||
+{
|
||||
+ return __usb_ext_prop_ptr(buf, USB_EXT_PROP_W_PROPERTY_NAME_LENGTH);
|
||||
+}
|
||||
+
|
||||
+static inline u8 *usb_ext_prop_name_ptr(u8 *buf)
|
||||
+{
|
||||
+ return __usb_ext_prop_ptr(buf, USB_EXT_PROP_B_PROPERTY_NAME);
|
||||
+}
|
||||
+
|
||||
+static inline u8 *usb_ext_prop_data_len_ptr(u8 *buf, size_t off)
|
||||
+{
|
||||
+ return __usb_ext_prop_ptr(buf,
|
||||
+ USB_EXT_PROP_DW_PROPERTY_DATA_LENGTH + off);
|
||||
+}
|
||||
+
|
||||
+static inline u8 *usb_ext_prop_data_ptr(u8 *buf, size_t off)
|
||||
+{
|
||||
+ return __usb_ext_prop_ptr(buf, USB_EXT_PROP_B_PROPERTY_DATA + off);
|
||||
+}
|
||||
+
|
||||
+static inline void usb_ext_prop_put_size(u8 *buf, int dw_size)
|
||||
+{
|
||||
+ put_unaligned_le32(dw_size, usb_ext_prop_size_ptr(buf));
|
||||
+}
|
||||
+
|
||||
+static inline void usb_ext_prop_put_type(u8 *buf, int type)
|
||||
+{
|
||||
+ put_unaligned_le32(type, usb_ext_prop_type_ptr(buf));
|
||||
+}
|
||||
+
|
||||
+static inline int usb_ext_prop_put_name(u8 *buf, const char *name, int pnl)
|
||||
+{
|
||||
+ int result;
|
||||
+
|
||||
+ put_unaligned_le16(pnl, usb_ext_prop_name_len_ptr(buf));
|
||||
+ result = utf8s_to_utf16s(name, strlen(name), UTF16_LITTLE_ENDIAN,
|
||||
+ (wchar_t *) usb_ext_prop_name_ptr(buf), pnl - 2);
|
||||
+ if (result < 0)
|
||||
+ return result;
|
||||
+
|
||||
+ put_unaligned_le16(0, &buf[USB_EXT_PROP_B_PROPERTY_NAME + pnl - 2]);
|
||||
+
|
||||
+ return pnl;
|
||||
+}
|
||||
+
|
||||
+static inline void usb_ext_prop_put_binary(u8 *buf, int pnl, const u8 *data,
|
||||
+ int data_len)
|
||||
+{
|
||||
+ put_unaligned_le32(data_len, usb_ext_prop_data_len_ptr(buf, pnl));
|
||||
+ memcpy(usb_ext_prop_data_ptr(buf, pnl), data, data_len);
|
||||
+}
|
||||
+
|
||||
+static inline int usb_ext_prop_put_unicode(u8 *buf, int pnl, const char *string,
|
||||
+ int data_len)
|
||||
+{
|
||||
+ int result;
|
||||
+ put_unaligned_le32(data_len, usb_ext_prop_data_len_ptr(buf, pnl));
|
||||
+ result = utf8s_to_utf16s(string, data_len >> 1, UTF16_LITTLE_ENDIAN,
|
||||
+ (wchar_t *) usb_ext_prop_data_ptr(buf, pnl),
|
||||
+ data_len - 2);
|
||||
+ if (result < 0)
|
||||
+ return result;
|
||||
+
|
||||
+ put_unaligned_le16(0,
|
||||
+ &buf[USB_EXT_PROP_B_PROPERTY_DATA + pnl + data_len - 2]);
|
||||
+
|
||||
+ return data_len;
|
||||
+}
|
||||
+
|
||||
+#endif /* __U_OS_DESC_H__ */
|
|
@ -0,0 +1,45 @@
|
|||
From 88d497212226cd63501e79e5031c6fca843e46a1 Mon Sep 17 00:00:00 2001
|
||||
From: Ion Agorria <ion@agorria.com>
|
||||
Date: Sat, 19 Jan 2019 12:07:10 +0100
|
||||
Subject: [PATCH] Cancel dm-setup if skip_initramfs is not present
|
||||
|
||||
dm parameter might interfere on linux booting
|
||||
so we only use it when not doing a normal boot.
|
||||
---
|
||||
init/do_mounts_dm.c | 13 +++++++++++++
|
||||
1 file changed, 13 insertions(+)
|
||||
|
||||
diff --git a/init/do_mounts_dm.c b/init/do_mounts_dm.c
|
||||
index ecda58df9a19..53cda0b0317b 100644
|
||||
--- a/init/do_mounts_dm.c
|
||||
+++ b/init/do_mounts_dm.c
|
||||
@@ -272,6 +272,15 @@ parse_fail:
|
||||
return 1;
|
||||
}
|
||||
|
||||
+static int __initdata skip_initramfs;
|
||||
+static int __init skip_initramfs_param(char *str)
|
||||
+{
|
||||
+ if (*str) return 0;
|
||||
+ skip_initramfs = 1;
|
||||
+ return 0;
|
||||
+}
|
||||
+__setup("skip_initramfs", skip_initramfs_param);
|
||||
+
|
||||
/*
|
||||
* Parse the command-line parameters given our kernel, but do not
|
||||
* actually try to invoke the DM device now; that is handled by
|
||||
@@ -283,6 +292,10 @@ parse_fail:
|
||||
|
||||
static int __init dm_setup(char *str)
|
||||
{
|
||||
+ if (skip_initramfs) {
|
||||
+ printk(KERN_INFO "dm: skip_initramfs present, ignoring dm setup\n");
|
||||
+ return 1;
|
||||
+ }
|
||||
dm_setup_args_init();
|
||||
|
||||
str = dm_setup_parse_device_args(str);
|
||||
--
|
||||
2.19.2
|
||||
|
31
device/linux-xiaomi-tissot/init-reverse-skip_initramfs.patch
Normal file
31
device/linux-xiaomi-tissot/init-reverse-skip_initramfs.patch
Normal file
|
@ -0,0 +1,31 @@
|
|||
From 76e12feb81d1b1ccbb7c58b16e040ca6c59f7ace Mon Sep 17 00:00:00 2001
|
||||
From: Ion Agorria <ion@agorria.com>
|
||||
Date: Sat, 19 Jan 2019 12:10:23 +0100
|
||||
Subject: [PATCH] Reverse skip_initramfs to use it by default.
|
||||
|
||||
This way it's possible to boot with initram by default.
|
||||
Initramfs is skip in this device to boot android unless
|
||||
recovery key is pressed.
|
||||
---
|
||||
init/initramfs.c | 4 +++-
|
||||
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/init/initramfs.c b/init/initramfs.c
|
||||
index d39079e690fa..41fb5db74138 100644
|
||||
--- a/init/initramfs.c
|
||||
+++ b/init/initramfs.c
|
||||
@@ -621,8 +621,10 @@ static int __init populate_rootfs(void)
|
||||
{
|
||||
char *err;
|
||||
|
||||
- if (do_skip_initramfs)
|
||||
+ if (!do_skip_initramfs) {
|
||||
+ printk(KERN_INFO "Skipping initramfs...\n");
|
||||
return default_rootfs();
|
||||
+ }
|
||||
|
||||
err = unpack_to_rootfs(__initramfs_start, __initramfs_size);
|
||||
if (err)
|
||||
--
|
||||
2.19.2
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
From d533086825e713e3c13ce8b581f4ee86e5ae11d8 Mon Sep 17 00:00:00 2001
|
||||
From: Ion Agorria <ion@agorria.com>
|
||||
Date: Sat, 19 Jan 2019 12:17:10 +0100
|
||||
Subject: [PATCH] Warn only once about skb_release_head_state in irq
|
||||
|
||||
---
|
||||
net/core/skbuff.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/net/core/skbuff.c b/net/core/skbuff.c
|
||||
index 31d2aad99ae4..fafe8d85b7e2 100644
|
||||
--- a/net/core/skbuff.c
|
||||
+++ b/net/core/skbuff.c
|
||||
@@ -613,7 +613,7 @@ static void skb_release_head_state(struct sk_buff *skb)
|
||||
secpath_put(skb->sp);
|
||||
#endif
|
||||
if (skb->destructor) {
|
||||
- WARN_ON(in_irq());
|
||||
+ WARN_ON_ONCE(in_irq());
|
||||
skb->destructor(skb);
|
||||
}
|
||||
#if IS_ENABLED(CONFIG_NF_CONNTRACK)
|
||||
--
|
||||
2.19.2
|
||||
|
Loading…
Reference in a new issue