Merge pull request #2646 from Kwiboo/rockchip-part6

Rockchip: update linux and some packages
This commit is contained in:
Matthias Reichl 2018-08-22 00:15:03 +02:00 committed by GitHub
commit b62904b717
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
56 changed files with 6929 additions and 17384 deletions

View File

@ -2,7 +2,7 @@
# Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv)
PKG_NAME="mali-rockchip"
PKG_VERSION="12daf22"
PKG_VERSION="12daf22c405a4f8faf6cbc4d2e88b85b36dc61d9"
PKG_SHA256="e6004e0f5a8a4aba098d301b3f964e2a9a961bb79f180d55ea6e9e73cd6eb874"
PKG_ARCH="arm aarch64"
PKG_LICENSE="nonfree"
@ -86,11 +86,4 @@ makeinstall_target() {
ln -sfv libmali.so $INSTALL/usr/lib/libGLESv2.so
ln -sfv libmali.so $INSTALL/usr/lib/libGLESv2.so.2
ln -sfv libmali.so $INSTALL/usr/lib/libgbm.so
mkdir -p $INSTALL/usr/lib/modules-load.d
if [ "$MALI_FAMILY" = "t760" -o "$MALI_FAMILY" = "t860" ]; then
echo "midgard_kbase" > $INSTALL/usr/lib/modules-load.d/mali.conf
elif [ "$MALI_FAMILY" = "450" -o "$MALI_FAMILY" = "400" ]; then
echo "mali" > $INSTALL/usr/lib/modules-load.d/mali.conf
fi
}

View File

@ -53,6 +53,7 @@ make_target() {
sed -e 's/CONFIG_IR_NUVOTON=m/# CONFIG_IR_NUVOTON is not set/g' -i v4l/.config
fi
elif [ "$PROJECT" = Rockchip ]; then
sed -e 's/CONFIG_DVB_CXD2820R=m/# CONFIG_DVB_CXD2820R is not set/g' -i v4l/.config
sed -e 's/CONFIG_DVB_LGDT3306A=m/# CONFIG_DVB_LGDT3306A is not set/g' -i v4l/.config
fi

View File

@ -24,4 +24,7 @@ makeinstall_target() {
cp -v $(get_build_dir rkbin)/firmware/bluetooth/BCM4354A2.hcd $INSTALL/$(get_full_firmware_dir)/brcm
cp -v $(get_build_dir rkbin)/firmware/wifi/fw_bcm4356a2_ag.bin $INSTALL/$(get_full_firmware_dir)/brcm
cp -v $(get_build_dir rkbin)/firmware/wifi/nvram_ap6356.txt $INSTALL/$(get_full_firmware_dir)/brcm
mkdir -p $INSTALL/$(get_full_firmware_dir)/rockchip
cp -v $(get_build_dir rkbin)/firmware/rockchip/dptx.bin $INSTALL/$(get_full_firmware_dir)/rockchip
}

View File

@ -35,8 +35,8 @@ case "$LINUX" in
PKG_BUILD_PERF="no"
;;
rockchip-4.4)
PKG_VERSION="eae92ae2b930999857df47c3057327c1c490454b"
PKG_SHA256="da453ca6ecefc3719a1165bc7b08fe00fc2b50ab64f6289ef6f3670a9fc1ceca"
PKG_VERSION="bca2464422eb8dd734f9218265dae256a82299be"
PKG_SHA256="baaea04ca4a1b34e0bfce36bfcf74d65b06ae371e29fa2ef96d26327e55b690d"
PKG_URL="https://github.com/rockchip-linux/kernel/archive/$PKG_VERSION.tar.gz"
PKG_SOURCE_DIR="kernel-$PKG_VERSION"
;;

View File

@ -2,8 +2,8 @@
# Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv)
PKG_NAME="rkmpp"
PKG_VERSION="c8a41a6"
PKG_SHA256="01b84eecde7cae98035ecce866b48f903f9deaa7e19b048ff9cb87edf6446659"
PKG_VERSION="93824dc71392b9ac94ee8ca157d9f2d4739e8f8f"
PKG_SHA256="14c49ceebd6c45dbb4c601bb4815de9a27d71d47f551c998ba9d3ff255572ad8"
PKG_ARCH="arm aarch64"
PKG_LICENSE="APL"
PKG_SITE="https://github.com/rockchip-linux/mpp"
@ -21,13 +21,5 @@ else
fi
PKG_CMAKE_OPTS_TARGET="-DRKPLATFORM=ON \
-DENABLE_AVSD=OFF \
-DENABLE_H263D=OFF \
-DENABLE_H264D=ON \
-DENABLE_H265D=ON \
-DENABLE_MPEG2D=ON \
-DENABLE_MPEG4D=ON \
-DENABLE_VP8D=ON \
-DENABLE_VP9D=$PKG_ENABLE_VP9D \
-DENABLE_JPEGD=OFF \
-DHAVE_DRM=ON"

View File

@ -1,4 +1,4 @@
From e9c9f2619bb2344f9947ccbbdcf15be9d0f55b1f Mon Sep 17 00:00:00 2001
From d207d3da1107f642be937ad14d5b3cfff7780155 Mon Sep 17 00:00:00 2001
From: Jakob Unterwurzacher <jakob.unterwurzacher@theobroma-systems.com>
Date: Mon, 29 May 2017 14:08:43 +0200
Subject: [PATCH] fix 32-bit mmap issue on 64-bit kernels
@ -16,7 +16,7 @@ For details see https://github.com/rockchip-linux/kernel/issues/17
1 file changed, 2 insertions(+)
diff --git a/osal/allocator/allocator_drm.c b/osal/allocator/allocator_drm.c
index 48735c90..a3a16a55 100644
index a29bf3f5..58891b28 100644
--- a/osal/allocator/allocator_drm.c
+++ b/osal/allocator/allocator_drm.c
@@ -15,6 +15,8 @@

View File

@ -0,0 +1,31 @@
From e2a70002f9a0a37f5c6297f1cc5e6604e9f9d964 Mon Sep 17 00:00:00 2001
From: Jonas Karlman <jonas@kwiboo.se>
Date: Sun, 24 Jun 2018 11:07:44 +0200
Subject: [PATCH] disable unit tests by default
---
test/CMakeLists.txt | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index 257a3efa..961086ae 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -10,7 +10,7 @@ macro(add_mpp_test module)
#message(STATUS "test_name : ${test_name}")
#message(STATUS "test_tag : ${test_tag}")
- option(${test_tag} "Build mpp ${module} unit test" ON)
+ option(${test_tag} "Build mpp ${module} unit test" OFF)
if(${test_tag})
add_executable(${test_name} ${test_name}.c mpp_event_trigger.c mpp_parse_cfg.c)
target_link_libraries(${test_name} ${MPP_SHARED} utils)
@@ -54,7 +54,7 @@ macro(add_legacy_test module)
#message(STATUS "test_name : ${test_name}")
#message(STATUS "test_tag : ${test_tag}")
- option(${test_tag} "Build legacy ${module} unit test" ON)
+ option(${test_tag} "Build legacy ${module} unit test" OFF)
if(${test_tag})
add_executable(${test_name} ${test_name}.c)
target_link_libraries(${test_name} ${VPU_SHARED} utils)

View File

@ -1,25 +0,0 @@
From 322efafd1f760c73accda1a7025b007f211916f7 Mon Sep 17 00:00:00 2001
From: Jonas Karlman <jonas@kwiboo.se>
Date: Sat, 3 Mar 2018 10:10:01 +0100
Subject: [PATCH] [mpp_dec]: sleep when there is nothing to parse
---
mpp/codec/mpp_dec.cpp | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/mpp/codec/mpp_dec.cpp b/mpp/codec/mpp_dec.cpp
index 424604e1..dded58c6 100644
--- a/mpp/codec/mpp_dec.cpp
+++ b/mpp/codec/mpp_dec.cpp
@@ -600,8 +600,10 @@ void *mpp_dec_parser_thread(void *data)
}
parser->unlock();
- if (try_proc_dec_task(mpp, &task))
+ if (try_proc_dec_task(mpp, &task)) {
+ msleep(1);
continue;
+ }
}

View File

@ -0,0 +1,140 @@
From ccd837fab6ab41ee3cb63b0e9ae1db824f96d4dc Mon Sep 17 00:00:00 2001
From: Jonas Karlman <jonas@kwiboo.se>
Date: Tue, 7 Aug 2018 18:14:57 +0200
Subject: [PATCH] [h264d]: revert vdpu fast mode code
---
mpp/hal/rkdec/h264d/hal_h264d_vdpu1.c | 18 +++++-------------
mpp/hal/rkdec/h264d/hal_h264d_vdpu2.c | 18 +++++-------------
2 files changed, 10 insertions(+), 26 deletions(-)
diff --git a/mpp/hal/rkdec/h264d/hal_h264d_vdpu1.c b/mpp/hal/rkdec/h264d/hal_h264d_vdpu1.c
index 1cddfc45..660e41f3 100644
--- a/mpp/hal/rkdec/h264d/hal_h264d_vdpu1.c
+++ b/mpp/hal/rkdec/h264d/hal_h264d_vdpu1.c
@@ -416,7 +416,8 @@ static MPP_RET vdpu1_set_vlc_regs(H264dHalCtx_t *p_hal,
//!< set poc to buffer
{
H264dVdpuRegCtx_t *reg_ctx = (H264dVdpuRegCtx_t *)p_hal->reg_ctx;
- RK_U32 *pocBase = (RK_U32 *)mpp_buffer_get_ptr(reg_ctx->poc_buf);
+ RK_U32 *pocBase = (RK_U32 *)((RK_U8 *)mpp_buffer_get_ptr(reg_ctx->cabac_buf)
+ + VDPU_CABAC_TAB_SIZE);
//!< set reference reorder poc
for (i = 0; i < 32; i++) {
@@ -620,7 +621,8 @@ static MPP_RET vdpu1_set_asic_regs(H264dHalCtx_t *p_hal,
H264dVdpuRegCtx_t *reg_ctx = (H264dVdpuRegCtx_t *)p_hal->reg_ctx;
if (p_hal->pp->scaleing_list_enable_flag) {
RK_U32 temp = 0;
- RK_U32 *ptr = (RK_U32 *)mpp_buffer_get_ptr(reg_ctx->sclst_buf);
+ RK_U32 *ptr = (RK_U32 *)((RK_U8 *)mpp_buffer_get_ptr(reg_ctx->cabac_buf)
+ + VDPU_CABAC_TAB_SIZE + VDPU_POC_BUF_SIZE);
for (i = 0; i < 6; i++) {
for (j = 0; j < 4; j++) {
@@ -722,21 +724,15 @@ MPP_RET vdpu1_h264d_init(void *hal, MppHalCfg *cfg)
H264dVdpuRegCtx_t *reg_ctx = (H264dVdpuRegCtx_t *)p_hal->reg_ctx;
//!< malloc buffers
FUN_CHECK(ret = mpp_buffer_get(p_hal->buf_group,
- &reg_ctx->cabac_buf, VDPU_CABAC_TAB_SIZE));
+ &reg_ctx->cabac_buf, VDPU_CABAC_TAB_SIZE + VDPU_POC_BUF_SIZE + VDPU_SCALING_LIST_SIZE));
RK_U32 i = 0;
RK_U32 loop = p_hal->fast_mode ? MPP_ARRAY_ELEMS(reg_ctx->reg_buf) : 1;
for (i = 0; i < loop; i++) {
reg_ctx->reg_buf[i].regs = mpp_calloc_size(void, sizeof(H264dVdpu1Regs_t));
- FUN_CHECK(ret = mpp_buffer_get(p_hal->buf_group,
- &reg_ctx->reg_buf[i].poc, VDPU_POC_BUF_SIZE));
- FUN_CHECK(ret = mpp_buffer_get(p_hal->buf_group,
- &reg_ctx->reg_buf[i].sclst, VDPU_SCALING_LIST_SIZE));
}
if (!p_hal->fast_mode) {
reg_ctx->regs = reg_ctx->reg_buf[0].regs;
- reg_ctx->poc_buf = reg_ctx->reg_buf[0].poc;
- reg_ctx->sclst_buf = reg_ctx->reg_buf[0].sclst;
}
//!< copy cabac table bytes
FUN_CHECK(ret = mpp_buffer_write(reg_ctx->cabac_buf, 0,
@@ -771,8 +767,6 @@ MPP_RET vdpu1_h264d_deinit(void *hal)
RK_U32 loop = p_hal->fast_mode ? MPP_ARRAY_ELEMS(reg_ctx->reg_buf) : 1;
for (i = 0; i < loop; i++) {
MPP_FREE(reg_ctx->reg_buf[i].regs);
- mpp_buffer_put(reg_ctx->reg_buf[i].poc);
- mpp_buffer_put(reg_ctx->reg_buf[i].sclst);
}
mpp_buffer_put(reg_ctx->cabac_buf);
MPP_FREE(p_hal->reg_ctx);
@@ -809,8 +803,6 @@ MPP_RET vdpu1_h264d_gen_regs(void *hal, HalTaskInfo *task)
for (i = 0; i < MPP_ARRAY_ELEMS(reg_ctx->reg_buf); i++) {
if (!reg_ctx->reg_buf[i].valid) {
task->dec.reg_index = i;
- reg_ctx->poc_buf = reg_ctx->reg_buf[i].poc;
- reg_ctx->sclst_buf = reg_ctx->reg_buf[i].sclst;
reg_ctx->regs = reg_ctx->reg_buf[i].regs;
reg_ctx->reg_buf[i].valid = 1;
break;
diff --git a/mpp/hal/rkdec/h264d/hal_h264d_vdpu2.c b/mpp/hal/rkdec/h264d/hal_h264d_vdpu2.c
index fa55e635..9b22c1d9 100644
--- a/mpp/hal/rkdec/h264d/hal_h264d_vdpu2.c
+++ b/mpp/hal/rkdec/h264d/hal_h264d_vdpu2.c
@@ -451,7 +451,8 @@ static MPP_RET set_vlc_regs(H264dHalCtx_t *p_hal, H264dVdpuRegs_t *p_regs)
//!< set poc to buffer
{
H264dVdpuRegCtx_t *reg_ctx = (H264dVdpuRegCtx_t *)p_hal->reg_ctx;
- RK_U32 *ptr = (RK_U32 *)mpp_buffer_get_ptr(reg_ctx->poc_buf);
+ RK_U32 *ptr = (RK_U32 *)((RK_U8 *)mpp_buffer_get_ptr(reg_ctx->cabac_buf)
+ + VDPU_CABAC_TAB_SIZE);
//!< set reference reorder poc
for (i = 0; i < 32; i++) {
if (pp->RefFrameList[i / 2].bPicEntry != 0xff) {
@@ -636,7 +637,8 @@ static MPP_RET set_asic_regs(H264dHalCtx_t *p_hal, H264dVdpuRegs_t *p_regs)
H264dVdpuRegCtx_t *reg_ctx = (H264dVdpuRegCtx_t *)p_hal->reg_ctx;
if (p_hal->pp->scaleing_list_enable_flag) {
RK_U32 temp = 0;
- RK_U32 *ptr = (RK_U32 *)mpp_buffer_get_ptr(reg_ctx->cabac_buf);
+ RK_U32 *ptr = (RK_U32 *)((RK_U8 *)mpp_buffer_get_ptr(reg_ctx->cabac_buf)
+ + VDPU_CABAC_TAB_SIZE + VDPU_POC_BUF_SIZE);
for (i = 0; i < 6; i++) {
for (j = 0; j < 4; j++) {
@@ -686,21 +688,15 @@ MPP_RET vdpu2_h264d_init(void *hal, MppHalCfg *cfg)
H264dVdpuRegCtx_t *reg_ctx = (H264dVdpuRegCtx_t *)p_hal->reg_ctx;
//!< malloc buffers
FUN_CHECK(ret = mpp_buffer_get(p_hal->buf_group,
- &reg_ctx->cabac_buf, VDPU_CABAC_TAB_SIZE));
+ &reg_ctx->cabac_buf, VDPU_CABAC_TAB_SIZE + VDPU_POC_BUF_SIZE + VDPU_SCALING_LIST_SIZE));
RK_U32 i = 0;
RK_U32 loop = p_hal->fast_mode ? MPP_ARRAY_ELEMS(reg_ctx->reg_buf) : 1;
for (i = 0; i < loop; i++) {
reg_ctx->reg_buf[i].regs = mpp_calloc_size(void, sizeof(H264dVdpuRegs_t));
- FUN_CHECK(ret = mpp_buffer_get(p_hal->buf_group,
- &reg_ctx->reg_buf[i].poc, VDPU_POC_BUF_SIZE));
- FUN_CHECK(ret = mpp_buffer_get(p_hal->buf_group,
- &reg_ctx->reg_buf[i].sclst, VDPU_SCALING_LIST_SIZE));
}
if (!p_hal->fast_mode) {
reg_ctx->regs = reg_ctx->reg_buf[0].regs;
- reg_ctx->poc_buf = reg_ctx->reg_buf[0].poc;
- reg_ctx->sclst_buf = reg_ctx->reg_buf[0].sclst;
}
//!< copy cabac table bytes
FUN_CHECK(ret = mpp_buffer_write(reg_ctx->cabac_buf, 0,
@@ -735,8 +731,6 @@ MPP_RET vdpu2_h264d_deinit(void *hal)
RK_U32 loop = p_hal->fast_mode ? MPP_ARRAY_ELEMS(reg_ctx->reg_buf) : 1;
for (i = 0; i < loop; i++) {
MPP_FREE(reg_ctx->reg_buf[i].regs);
- mpp_buffer_put(reg_ctx->reg_buf[i].poc);
- mpp_buffer_put(reg_ctx->reg_buf[i].sclst);
}
mpp_buffer_put(reg_ctx->cabac_buf);
MPP_FREE(p_hal->reg_ctx);
@@ -773,8 +767,6 @@ MPP_RET vdpu2_h264d_gen_regs(void *hal, HalTaskInfo *task)
for (i = 0; i < MPP_ARRAY_ELEMS(reg_ctx->reg_buf); i++) {
if (!reg_ctx->reg_buf[i].valid) {
task->dec.reg_index = i;
- reg_ctx->poc_buf = reg_ctx->reg_buf[i].poc;
- reg_ctx->sclst_buf = reg_ctx->reg_buf[i].sclst;
reg_ctx->regs = reg_ctx->reg_buf[i].regs;
reg_ctx->reg_buf[i].valid = 1;
break;

View File

@ -1,25 +0,0 @@
diff --git a/mpp/hal/rkdec/h265d/hal_h265d_reg.h b/mpp/hal/rkdec/h265d/hal_h265d_reg.h
index 1bccb02..432b8db 100644
--- a/mpp/hal/rkdec/h265d/hal_h265d_reg.h
+++ b/mpp/hal/rkdec/h265d/hal_h265d_reg.h
@@ -50,7 +50,8 @@ typedef struct {
struct swreg_int {
RK_U32 sw_dec_e : 1 ;
RK_U32 sw_dec_clkgate_e : 1 ;
- RK_U32 reserve0 : 2 ;
+ RK_U32 reserve0 : 1 ;
+ RK_U32 sw_timeout_mode : 1 ;
RK_U32 sw_dec_irq_dis : 1 ;
RK_U32 sw_dec_timeout_e : 1 ;
RK_U32 sw_buf_empty_en : 1 ;
@@ -61,8 +62,9 @@ typedef struct {
RK_U32 sw_dec_rdy_sta : 1 ;
RK_U32 sw_dec_bus_sta : 1 ;
RK_U32 sw_dec_error_sta : 1 ;
+ RK_U32 sw_dec_timeout_sta : 1 ;
RK_U32 sw_dec_empty_sta : 1 ;
- RK_U32 reserve4 : 4 ;
+ RK_U32 reserve3 : 3 ;
RK_U32 sw_softrst_en_p : 1 ;
RK_U32 sw_force_softreset_valid: 1 ;
RK_U32 sw_softreset_rdy : 1 ;

View File

@ -2,8 +2,9 @@
# Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv)
PKG_NAME="rkbin"
PKG_VERSION="f64ded6"
PKG_SHA256="7b858ac964058da83cd96314184d2c5f834a9b2cc6b805be424a661fd9836b54"
# Version is: Kwiboo/tag:libreelec-b3a2661
PKG_VERSION="b3a2661830dd7e1800b755373b02ac892863ef9b"
PKG_SHA256="e69637c354afb008373eea5d4fe58dc17161e3a6091cefc0a76be247a595ce8b"
PKG_ARCH="arm aarch64"
PKG_LICENSE="nonfree"
PKG_SITE="https://github.com/rockchip-linux/rkbin"

View File

@ -1,818 +0,0 @@
From 10b2468096e88f0c68ec87be8bd26a6f3af53050 Mon Sep 17 00:00:00 2001
From: Jonas Karlman <jonas@kwiboo.se>
Date: Mon, 25 Dec 2017 15:33:57 +0100
Subject: [PATCH] rk3328: add ddr v1.08 and miniloader v2.44
---
rk33/rk3328_ddr_786MHz_v1.08.bin | Bin 0 -> 23684 bytes
rk33/rk3328_miniloader_v2.44.bin | Bin 0 -> 60164 bytes
2 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 rk33/rk3328_ddr_786MHz_v1.08.bin
create mode 100644 rk33/rk3328_miniloader_v2.44.bin
diff --git a/rk33/rk3328_ddr_786MHz_v1.08.bin b/rk33/rk3328_ddr_786MHz_v1.08.bin
new file mode 100644
index 0000000000000000000000000000000000000000..0b0ffa2ab6bf1553118baac2faf9e3a903664a9e
GIT binary patch
literal 23684
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
Vjt*$Hfn&wxadiFeaO7{1|36XHr^)~T
literal 0
HcmV?d00001
diff --git a/rk33/rk3328_miniloader_v2.44.bin b/rk33/rk3328_miniloader_v2.44.bin
new file mode 100644
index 0000000000000000000000000000000000000000..9663aa598733db25cfc1cfc0b1555f0f8269bfb5
GIT binary patch
literal 60164
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
CP?<Ua
literal 0
HcmV?d00001

View File

@ -18,8 +18,8 @@ PKG_NEED_UNPACK="$PROJECT_DIR/$PROJECT/bootloader"
case "$PROJECT" in
Rockchip)
PKG_VERSION="5ecf0ee"
PKG_SHA256="fba1d26583d446a5bbb5713fe37848e05b546d125384c2c2d2883414d61b7cad"
PKG_VERSION="ac5a8f08e811581376e731c898c21e4f79177ec2"
PKG_SHA256="e3ca0d99fef24649c75c4fe7cb0c6de069f98424a7dbf9d397f65b79b8749866"
PKG_URL="https://github.com/rockchip-linux/u-boot/archive/$PKG_VERSION.tar.gz"
PKG_PATCH_DIRS="rockchip"
PKG_DEPENDS_TARGET+=" rkbin"

View File

@ -1,65 +1,37 @@
From 85f5dd7511d2eaea04a6ba53dc60d1879060568b Mon Sep 17 00:00:00 2001
From de094e01bb6876d7025e8c1b665828f6764e2c70 Mon Sep 17 00:00:00 2001
From: Jonas Karlman <jonas@kwiboo.se>
Date: Sat, 2 Dec 2017 11:47:07 +0100
Subject: [PATCH] dont build libfdt
---
Makefile | 2 +-
scripts/Makefile.spl | 4 ++--
tools/Makefile | 4 ----
scripts/Makefile.spl | 2 +-
scripts/dtc/Makefile | 2 +-
tools/dtoc/fdt.py | 2 +-
4 files changed, 4 insertions(+), 8 deletions(-)
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/Makefile b/Makefile
index 8086f3c93e..4796b488ae 100644
--- a/Makefile
+++ b/Makefile
@@ -1379,7 +1379,7 @@ $(timestamp_h): $(srctree)/Makefile FORCE
$(call filechk,timestamp.h)
checkbinman: tools
- @if ! ( echo 'import libfdt' | ( PYTHONPATH=tools $(PYTHON) )); then \
+ @if ! ( echo 'from pylibfdt import libfdt' | ( python )); then \
echo >&2; \
echo >&2 '*** binman needs the Python libfdt library.'; \
echo >&2 '*** Either install it on your system, or try:'; \
diff --git a/scripts/Makefile.spl b/scripts/Makefile.spl
index b86ea76bab..ea54f9098c 100644
index e2f0741db6..9264103366 100644
--- a/scripts/Makefile.spl
+++ b/scripts/Makefile.spl
@@ -246,7 +246,7 @@ quiet_cmd_fdtgrep = FDTGREP $@
$(obj)/$(SPL_BIN).dtb: dts/dt.dtb $(objtree)/tools/fdtgrep FORCE
$(call if_changed,fdtgrep)
@@ -249,7 +249,7 @@ $(obj)/$(SPL_BIN)-pad.bin: $(obj)/$(SPL_BIN)
$(obj)/$(SPL_BIN).dtb: dts/dt-spl.dtb FORCE
$(call if_changed,copy)
-pythonpath = PYTHONPATH=tools
-pythonpath = PYTHONPATH=scripts/dtc/pylibfdt
+pythonpath = python
quiet_cmd_dtocc = DTOC C $@
cmd_dtocc = $(pythonpath) $(srctree)/tools/dtoc/dtoc -d $(obj)/$(SPL_BIN).dtb -o $@ platdata
@@ -370,7 +370,7 @@ ifneq ($(cmd_files),)
endif
diff --git a/scripts/dtc/Makefile b/scripts/dtc/Makefile
index 90ef2db85c..077acd50d9 100644
--- a/scripts/dtc/Makefile
+++ b/scripts/dtc/Makefile
@@ -31,4 +31,4 @@ $(obj)/dtc-lexer.lex.o: $(obj)/dtc-parser.tab.h
clean-files := dtc-lexer.lex.c dtc-parser.tab.c dtc-parser.tab.h
checkdtoc: tools
- @if ! ( echo 'import libfdt' | ( PYTHONPATH=tools $(PYTHON) )); then \
+ @if ! ( echo 'from pylibfdt import libfdt' | ( python )); then \
echo '*** dtoc needs the Python libfdt library. Either '; \
echo '*** install it on your system, or try:'; \
echo '***'; \
diff --git a/tools/Makefile b/tools/Makefile
index 8e1009bf6c..459c71ef1f 100644
--- a/tools/Makefile
+++ b/tools/Makefile
@@ -232,10 +232,6 @@ clean-dirs := lib common
always := $(hostprogs-y)
-# Build a libfdt Python module if swig is available
-# Use 'sudo apt-get install swig libpython-dev' to enable this
-always += $(if $(shell which swig 2> /dev/null),_libfdt.so)
-
# Generated LCD/video logo
LOGO_H = $(objtree)/include/bmp_logo.h
LOGO_DATA_H = $(objtree)/include/bmp_logo_data.h
# Added for U-Boot
-subdir-$(CONFIG_PYLIBFDT) += pylibfdt
+#subdir-$(CONFIG_PYLIBFDT) += pylibfdt
diff --git a/tools/dtoc/fdt.py b/tools/dtoc/fdt.py
index dbc338653b..04f3c5935c 100644
--- a/tools/dtoc/fdt.py

View File

@ -0,0 +1,35 @@
From dfdfa7fb1a50c21a784a67e5f99d8714ca853c07 Mon Sep 17 00:00:00 2001
From: Jonas Karlman <jonas@kwiboo.se>
Date: Mon, 20 Aug 2018 22:55:34 +0200
Subject: [PATCH] rockchip: board: save cpuid to env
---
arch/arm/mach-rockchip/board.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/arch/arm/mach-rockchip/board.c b/arch/arm/mach-rockchip/board.c
index 233f0b6f9a..6c2021e32a 100644
--- a/arch/arm/mach-rockchip/board.c
+++ b/arch/arm/mach-rockchip/board.c
@@ -44,6 +44,7 @@ DECLARE_GLOBAL_DATA_PTR;
static int rockchip_set_serialno(void)
{
char serialno_str[VENDOR_SN_MAX];
+ char cpuid_str[CPUID_LEN * 2 + 1];
int ret = 0, i;
u8 cpuid[CPUID_LEN] = {0};
u8 low[CPUID_LEN / 2], high[CPUID_LEN / 2];
@@ -89,6 +90,13 @@ static int rockchip_set_serialno(void)
snprintf(serialno_str, sizeof(serialno_str), "%llx", serialno);
env_set("serial#", serialno_str);
+
+ memset(cpuid_str, 0, sizeof(cpuid_str));
+ for (i = 0; i < CPUID_LEN; i++) {
+ sprintf(&cpuid_str[i * 2], "%02x", cpuid[i]);
+ }
+
+ env_set("cpuid#", cpuid_str);
#ifdef CONFIG_ROCKCHIP_VENDOR_PARTITION
}
#endif

View File

@ -1,25 +0,0 @@
From 39dfedae58057500912a6f933fced3edb9376b3b Mon Sep 17 00:00:00 2001
From: Jonas Karlman <jonas@kwiboo.se>
Date: Sun, 22 Oct 2017 12:48:24 +0200
Subject: [PATCH] rockchip: tinker: enable rockchip video driver
---
configs/tinker-rk3288_defconfig | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/configs/tinker-rk3288_defconfig b/configs/tinker-rk3288_defconfig
index 00e2d81954..62cae4f21e 100644
--- a/configs/tinker-rk3288_defconfig
+++ b/configs/tinker-rk3288_defconfig
@@ -80,6 +80,11 @@ CONFIG_G_DNL_PRODUCT_NUM=0x320a
CONFIG_USB_HOST_ETHER=y
CONFIG_USB_ETHER_ASIX=y
CONFIG_USB_ETHER_SMSC95XX=y
+CONFIG_DM_VIDEO=y
+CONFIG_DISPLAY=y
+CONFIG_VIDEO_ROCKCHIP=y
+CONFIG_DISPLAY_ROCKCHIP_HDMI=y
+CONFIG_CONSOLE_SCROLL_LINES=10
CONFIG_USE_TINY_PRINTF=y
CONFIG_CMD_DHRYSTONE=y
CONFIG_ERRNO_STR=y

View File

@ -1,126 +0,0 @@
From dd6e1ab93a92e133c41a8665f6d8aca9450bdca8 Mon Sep 17 00:00:00 2001
From: Kamil Trzcinski <ayufan@ayufan.eu>
Date: Sun, 20 Aug 2017 01:52:34 +0200
Subject: [PATCH] Add rk3328-efuse support
---
arch/arm/dts/rk3328.dtsi | 25 ++++++++++++++++++++
drivers/misc/rockchip-efuse.c | 55 +++++++++++++++++++++++++++++++++++++++++++
2 files changed, 80 insertions(+)
diff --git a/arch/arm/dts/rk3328.dtsi b/arch/arm/dts/rk3328.dtsi
index 2a4c4929d7..611a0d4b21 100644
--- a/arch/arm/dts/rk3328.dtsi
+++ b/arch/arm/dts/rk3328.dtsi
@@ -342,6 +342,31 @@
};
};
+ efuse: efuse@ff260000 {
+ compatible = "rockchip,rk3328-efuse";
+ reg = <0x0 0xff260000 0x0 0x50>;
+ #address-cells = <1>;
+ #size-cells = <1>;
+ clocks = <&cru SCLK_EFUSE>;
+ clock-names = "pclk_efuse";
+ rockchip,efuse-size = <0x20>;
+
+ /* Data cells */
+ efuse_id: id@7 {
+ reg = <0x07 0x10>;
+ };
+ cpu_leakage: cpu-leakage@17 {
+ reg = <0x17 0x1>;
+ };
+ logic_leakage: logic-leakage@19 {
+ reg = <0x19 0x1>;
+ };
+ efuse_cpu_version: cpu-version@1a {
+ reg = <0x1a 0x1>;
+ bits = <3 3>;
+ };
+ };
+
saradc: saradc@ff280000 {
compatible = "rockchip,rk3328-saradc", "rockchip,saradc";
reg = <0x0 0xff280000 0x0 0x100>;
diff --git a/drivers/misc/rockchip-efuse.c b/drivers/misc/rockchip-efuse.c
index b4ad19cfe8..81b78f9b2c 100644
--- a/drivers/misc/rockchip-efuse.c
+++ b/drivers/misc/rockchip-efuse.c
@@ -16,6 +16,14 @@
#include <linux/delay.h>
#include <misc.h>
+#define RK3328_INT_CON 0x0014
+#define RK3328_INT_STATUS 0x0018
+#define RK3328_DOUT 0x0020
+#define RK3328_AUTO_CTRL 0x0024
+#define RK3328_INT_FINISH BIT(0)
+#define RK3328_AUTO_ENB BIT(0)
+#define RK3328_AUTO_RD BIT(1)
+
#define RK3399_A_SHIFT 16
#define RK3399_A_MASK 0x3ff
#define RK3399_NFUSES 32
@@ -95,6 +103,49 @@ U_BOOT_CMD(
);
#endif
+static int rockchip_rk3328_efuse_read(struct udevice *dev, int offset,
+ void *buf, int size)
+{
+ struct rockchip_efuse_platdata *plat = dev_get_platdata(dev);
+
+ unsigned int addr_start, addr_end, addr_offset;
+ u32 out_value, status;
+ u8 bytes[RK3399_NFUSES * RK3399_BYTES_PER_FUSE];
+ int i = 0;
+ u32 addr;
+
+ /* 128 Byte efuse, 96 Byte for secure, 32 Byte for non-secure */
+ offset += 96;
+
+ addr_start = offset / RK3399_BYTES_PER_FUSE;
+ addr_offset = offset % RK3399_BYTES_PER_FUSE;
+ addr_end = DIV_ROUND_UP(offset + size, RK3399_BYTES_PER_FUSE);
+
+ /* cap to the size of the efuse block */
+ if (addr_end > RK3399_NFUSES)
+ addr_end = RK3399_NFUSES;
+
+ for (addr = addr_start; addr < addr_end; addr++) {
+ writel(RK3328_AUTO_RD | RK3328_AUTO_ENB |
+ ((addr & RK3399_A_MASK) << RK3399_A_SHIFT),
+ plat->base + RK3328_AUTO_CTRL);
+ udelay(10);
+ status = readl(plat->base + RK3328_INT_STATUS);
+ if (!(status & RK3328_INT_FINISH)) {
+ return -EIO;
+ }
+ out_value = readl(plat->base + RK3328_DOUT);
+ writel(RK3328_INT_FINISH, plat->base + RK3328_INT_STATUS);
+
+ memcpy(&bytes[i], &out_value, RK3399_BYTES_PER_FUSE);
+ i += RK3399_BYTES_PER_FUSE;
+ }
+
+ memcpy(buf, bytes + addr_offset, size);
+
+ return 0;
+}
+
static int rockchip_rk3399_efuse_read(struct udevice *dev, int offset,
void *buf, int size)
{
@@ -223,6 +274,10 @@ static const struct udevice_id rockchip_efuse_ids[] = {
.compatible = "rockchip,rk322x-efuse",
.data = (ulong)&rockchip_rk3288_efuse_read,
},
+ {
+ .compatible = "rockchip,rk3328-efuse",
+ .data = (ulong)rockchip_rk3328_efuse_read,
+ },
{
.compatible = "rockchip,rk3399-efuse",
.data = (ulong)&rockchip_rk3399_efuse_read,

View File

@ -0,0 +1,48 @@
From e44f2ddac6099a0947c4182a0f4296d8df2be4a8 Mon Sep 17 00:00:00 2001
From: Jonas Karlman <jonas@kwiboo.se>
Date: Sat, 18 Aug 2018 17:26:35 +0200
Subject: [PATCH] rockchip: rk3328: add efuse support
---
arch/arm/dts/rk3328.dtsi | 14 ++++++++++++++
configs/evb-rk3328_defconfig | 2 ++
2 files changed, 16 insertions(+)
diff --git a/arch/arm/dts/rk3328.dtsi b/arch/arm/dts/rk3328.dtsi
index 94d39b1b35..35db0ccf4d 100644
--- a/arch/arm/dts/rk3328.dtsi
+++ b/arch/arm/dts/rk3328.dtsi
@@ -341,6 +341,20 @@
};
};
+ efuse: efuse@ff260000 {
+ compatible = "rockchip,rk3328-efuse";
+ reg = <0x0 0xff260000 0x0 0x80>;
+ #address-cells = <1>;
+ #size-cells = <1>;
+ clocks = <&cru SCLK_EFUSE>;
+ clock-names = "pclk_efuse";
+
+ /* Data cells */
+ cpu_id: cpu-id@7 {
+ reg = <0x07 0x10>;
+ };
+ };
+
saradc: saradc@ff280000 {
compatible = "rockchip,rk3328-saradc", "rockchip,saradc";
reg = <0x0 0xff280000 0x0 0x100>;
diff --git a/configs/evb-rk3328_defconfig b/configs/evb-rk3328_defconfig
index 79535c760d..0897a28e1d 100644
--- a/configs/evb-rk3328_defconfig
+++ b/configs/evb-rk3328_defconfig
@@ -52,6 +52,8 @@ CONFIG_SPL_CLK=y
CONFIG_ROCKCHIP_GPIO=y
CONFIG_SYS_I2C_ROCKCHIP=y
CONFIG_DM_KEY=y
+CONFIG_MISC=y
+CONFIG_ROCKCHIP_EFUSE=y
CONFIG_MMC_DW=y
CONFIG_MMC_DW_ROCKCHIP=y
CONFIG_PHY=y

View File

@ -1,184 +0,0 @@
From 77349a847b0649e8ead1dba3a297607b2a674aaa Mon Sep 17 00:00:00 2001
From: Kamil Trzcinski <ayufan@ayufan.eu>
Date: Sat, 19 Aug 2017 20:38:50 +0200
Subject: [PATCH] Get serial and ethaddr from efuse
---
board/rockchip/evb_rk3328/evb-rk3328.c | 124 +++++++++++++++++++++++++++++++++
configs/evb-rk3328_defconfig | 2 +
include/configs/rk3328_common.h | 2 +
3 files changed, 128 insertions(+)
diff --git a/board/rockchip/evb_rk3328/evb-rk3328.c b/board/rockchip/evb_rk3328/evb-rk3328.c
index d6fc57cd8e..1d0f7e9c95 100644
--- a/board/rockchip/evb_rk3328/evb-rk3328.c
+++ b/board/rockchip/evb_rk3328/evb-rk3328.c
@@ -7,14 +7,20 @@
#include <common.h>
#include <asm/arch/hardware.h>
#include <asm/arch/grf_rk3328.h>
+#include <dm.h>
#include <asm/armv8/mmu.h>
#include <asm/io.h>
#include <dwc3-uboot.h>
#include <power/regulator.h>
#include <usb.h>
+#include <misc.h>
+#include <u-boot/sha256.h>
DECLARE_GLOBAL_DATA_PTR;
+#define RK3328_CPUID_OFF 0x7
+#define RK3328_CPUID_LEN 0x10
+
int board_init(void)
{
int ret;
@@ -80,3 +86,121 @@ int board_usb_cleanup(int index, enum usb_init_type init)
return 0;
}
#endif
+
+static void setup_macaddr(void)
+{
+#if CONFIG_IS_ENABLED(CMD_NET)
+ int ret;
+ const char *cpuid = env_get("cpuid#");
+ u8 hash[SHA256_SUM_LEN];
+ int size = sizeof(hash);
+ u8 mac_addr[6];
+
+ /* Only generate a MAC address, if none is set in the environment */
+ if (env_get("ethaddr"))
+ return;
+
+ if (!cpuid) {
+ debug("%s: could not retrieve 'cpuid#'\n", __func__);
+ return;
+ }
+
+ ret = hash_block("sha256", (void *)cpuid, strlen(cpuid), hash, &size);
+ if (ret) {
+ debug("%s: failed to calculate SHA256\n", __func__);
+ return;
+ }
+
+ /* Copy 6 bytes of the hash to base the MAC address on */
+ memcpy(mac_addr, hash, 6);
+
+ /* Make this a valid MAC address and set it */
+ mac_addr[0] &= 0xfe; /* clear multicast bit */
+ mac_addr[0] |= 0x02; /* set local assignment bit (IEEE802) */
+ eth_env_set_enetaddr("ethaddr", mac_addr);
+
+ /* Make a valid MAC address for eth1 */
+ mac_addr[5] += 0x20;
+ mac_addr[5] &= 0xff;
+ eth_env_set_enetaddr("eth1addr", mac_addr);
+#endif
+
+ return;
+}
+
+static void setup_serial(void)
+{
+#if CONFIG_IS_ENABLED(ROCKCHIP_EFUSE)
+ struct udevice *dev;
+ int ret, i;
+ u8 cpuid[RK3328_CPUID_LEN];
+ u8 low[RK3328_CPUID_LEN/2], high[RK3328_CPUID_LEN/2];
+ char cpuid_str[RK3328_CPUID_LEN * 2 + 1];
+ u64 serialno;
+ char serialno_str[16];
+
+ /* retrieve the device */
+ ret = uclass_get_device_by_driver(UCLASS_MISC,
+ DM_GET_DRIVER(rockchip_efuse), &dev);
+ if (ret) {
+ debug("%s: could not find efuse device\n", __func__);
+ return;
+ }
+
+ /* read the cpu_id range from the efuses */
+ ret = misc_read(dev, RK3328_CPUID_OFF, &cpuid, sizeof(cpuid));
+ if (ret) {
+ debug("%s: reading cpuid from the efuses failed\n",
+ __func__);
+ return;
+ }
+
+ memset(cpuid_str, 0, sizeof(cpuid_str));
+ for (i = 0; i < 16; i++)
+ sprintf(&cpuid_str[i * 2], "%02x", cpuid[i]);
+
+ debug("cpuid: %s\n", cpuid_str);
+
+ /*
+ * Mix the cpuid bytes using the same rules as in
+ * ${linux}/drivers/soc/rockchip/rockchip-cpuinfo.c
+ */
+ for (i = 0; i < 8; i++) {
+ low[i] = cpuid[1 + (i << 1)];
+ high[i] = cpuid[i << 1];
+ }
+
+ serialno = crc32_no_comp(0, low, 8);
+ serialno |= (u64)crc32_no_comp(serialno, high, 8) << 32;
+ snprintf(serialno_str, sizeof(serialno_str), "%llx", serialno);
+
+ env_set("cpuid#", cpuid_str);
+ env_set("serial#", serialno_str);
+#endif
+
+ return;
+}
+
+int misc_init_r(void)
+{
+ setup_serial();
+ setup_macaddr();
+
+ return 0;
+}
+
+#ifdef CONFIG_SERIAL_TAG
+void get_board_serial(struct tag_serialnr *serialnr)
+{
+ char *serial_string;
+ u64 serial = 0;
+
+ serial_string = env_get("serial#");
+
+ if (serial_string)
+ serial = simple_strtoull(serial_string, NULL, 16);
+
+ serialnr->high = (u32)(serial >> 32);
+ serialnr->low = (u32)(serial & 0xffffffff);
+}
+#endif
diff --git a/configs/evb-rk3328_defconfig b/configs/evb-rk3328_defconfig
index d4a00718c5..9107c020b7 100644
--- a/configs/evb-rk3328_defconfig
+++ b/configs/evb-rk3328_defconfig
@@ -55,6 +55,8 @@ CONFIG_SPL_CLK=y
CONFIG_ROCKCHIP_GPIO=y
CONFIG_SYS_I2C_ROCKCHIP=y
CONFIG_DM_KEY=y
+CONFIG_MISC=y
+CONFIG_ROCKCHIP_EFUSE=y
CONFIG_MMC_DW=y
CONFIG_MMC_DW_ROCKCHIP=y
CONFIG_PHY=y
diff --git a/include/configs/rk3328_common.h b/include/configs/rk3328_common.h
index b7971782b5..a2af5a7989 100644
--- a/include/configs/rk3328_common.h
+++ b/include/configs/rk3328_common.h
@@ -9,6 +9,8 @@
#include "rockchip-common.h"
+#define CONFIG_MISC_INIT_R
+
#define CONFIG_SYS_MALLOC_LEN (32 << 20)
#define CONFIG_SYS_CBSIZE 1024
#define CONFIG_SKIP_LOWLEVEL_INIT

View File

@ -0,0 +1,66 @@
From c4068865306726939489b961fd8e04f9a2a7b1ce Mon Sep 17 00:00:00 2001
From: Kamil Trzcinski <ayufan@ayufan.eu>
Date: Sat, 19 Aug 2017 20:38:50 +0200
Subject: [PATCH] rk3328-evb: get ethaddr from efuse
---
board/rockchip/evb_rk3328/evb-rk3328.c | 49 ++++++++++++++++++++++++++
1 file changed, 49 insertions(+)
diff --git a/board/rockchip/evb_rk3328/evb-rk3328.c b/board/rockchip/evb_rk3328/evb-rk3328.c
index c8e7a3ad64..8829f50327 100644
--- a/board/rockchip/evb_rk3328/evb-rk3328.c
+++ b/board/rockchip/evb_rk3328/evb-rk3328.c
@@ -3,3 +3,52 @@
*
* SPDX-License-Identifier: GPL-2.0+
*/
+
+#include <common.h>
+#include <u-boot/sha256.h>
+
+static void setup_macaddr(void)
+{
+#if CONFIG_IS_ENABLED(CMD_NET)
+ int ret;
+ const char *cpuid = env_get("cpuid#");
+ u8 hash[SHA256_SUM_LEN];
+ int size = sizeof(hash);
+ u8 mac_addr[6];
+
+ /* Only generate a MAC address, if none is set in the environment */
+ if (env_get("ethaddr"))
+ return;
+
+ if (!cpuid) {
+ debug("%s: could not retrieve 'cpuid#'\n", __func__);
+ return;
+ }
+
+ ret = hash_block("sha256", (void *)cpuid, strlen(cpuid), hash, &size);
+ if (ret) {
+ debug("%s: failed to calculate SHA256\n", __func__);
+ return;
+ }
+
+ /* Copy 6 bytes of the hash to base the MAC address on */
+ memcpy(mac_addr, hash, 6);
+
+ /* Make this a valid MAC address and set it */
+ mac_addr[0] &= 0xfe; /* clear multicast bit */
+ mac_addr[0] |= 0x02; /* set local assignment bit (IEEE802) */
+ eth_env_set_enetaddr("ethaddr", mac_addr);
+
+ /* Make a valid MAC address for eth1 */
+ mac_addr[5] += 0x20;
+ mac_addr[5] &= 0xff;
+ eth_env_set_enetaddr("eth1addr", mac_addr);
+#endif
+}
+
+int rk_board_late_init(void)
+{
+ setup_macaddr();
+
+ return 0;
+}

View File

@ -1,17 +1,31 @@
From b6c47bd9f6a8965ab538f168086d4fd99fcf3066 Mon Sep 17 00:00:00 2001
From 46d72af5faa7f12a057294356eb353d38c56b5fe Mon Sep 17 00:00:00 2001
From: Jonas Karlman <jonas@kwiboo.se>
Date: Wed, 10 Jan 2018 19:56:16 +0100
Subject: [PATCH] rk3328-evb: add sdmmc vmmc-supply
---
arch/arm/dts/rk3328-evb.dts | 1 +
1 file changed, 1 insertion(+)
arch/arm/dts/rk3328-evb.dts | 7 +++++--
arch/arm/dts/rk3328.dtsi | 10 ++++++----
2 files changed, 11 insertions(+), 6 deletions(-)
diff --git a/arch/arm/dts/rk3328-evb.dts b/arch/arm/dts/rk3328-evb.dts
index 4b13a8da64..586c58659d 100644
index aafafec649..497b040f56 100644
--- a/arch/arm/dts/rk3328-evb.dts
+++ b/arch/arm/dts/rk3328-evb.dts
@@ -61,6 +61,7 @@
@@ -28,8 +28,10 @@
compatible = "regulator-fixed";
regulator-name = "vcc3v3";
gpio = <&gpio0 30 GPIO_ACTIVE_LOW>;
- regulator-always-on;
- regulator-boot-on;
+ pinctrl-names = "default";
+ pinctrl-0 = <&sdmmc0m1_gpio>;
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
};
vcc5v0_otg: vcc5v0-otg-drv {
@@ -75,6 +77,7 @@
num-slots = <1>;
pinctrl-names = "default";
pinctrl-0 = <&sdmmc0_clk>, <&sdmmc0_cmd>, <&sdmmc0_dectn>, <&sdmmc0_bus4>;
@ -19,3 +33,31 @@ index 4b13a8da64..586c58659d 100644
status = "okay";
};
diff --git a/arch/arm/dts/rk3328.dtsi b/arch/arm/dts/rk3328.dtsi
index 35db0ccf4d..231e66788d 100644
--- a/arch/arm/dts/rk3328.dtsi
+++ b/arch/arm/dts/rk3328.dtsi
@@ -481,8 +481,9 @@
compatible = "rockchip,rk3328-dw-mshc", "rockchip,rk3288-dw-mshc";
reg = <0x0 0xff500000 0x0 0x4000>;
max-frequency = <150000000>;
- clocks = <&cru HCLK_SDMMC>, <&cru SCLK_SDMMC>;
- clock-names = "biu", "ciu";
+ clocks = <&cru HCLK_SDMMC>, <&cru SCLK_SDMMC>,
+ <&cru SCLK_SDMMC_DRV>, <&cru SCLK_SDMMC_SAMPLE>;
+ clock-names = "biu", "ciu", "ciu-drv", "ciu-sample";
fifo-depth = <0x100>;
interrupts = <GIC_SPI 12 IRQ_TYPE_LEVEL_HIGH>;
status = "disabled";
@@ -504,8 +505,9 @@
compatible = "rockchip,rk3328-dw-mshc", "rockchip,rk3288-dw-mshc";
reg = <0x0 0xff520000 0x0 0x4000>;
max-frequency = <150000000>;
- clocks = <&cru HCLK_EMMC>, <&cru SCLK_EMMC>;
- clock-names = "biu", "ciu";
+ clocks = <&cru HCLK_EMMC>, <&cru SCLK_EMMC>,
+ <&cru SCLK_EMMC_DRV>, <&cru SCLK_EMMC_SAMPLE>;
+ clock-names = "biu", "ciu", "ciu-drv", "ciu-sample";
fifo-depth = <0x100>;
interrupts = <GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>;
status = "disabled";

View File

@ -1,38 +0,0 @@
From 0f59425a214329eda9080f186bfa82780fce75e6 Mon Sep 17 00:00:00 2001
From: Jonas Karlman <jonas@kwiboo.se>
Date: Sun, 28 Jan 2018 15:42:23 +0100
Subject: [PATCH] rk3399-evb: prefer sdcard boot
---
arch/arm/dts/rk3399-evb.dts | 2 +-
arch/arm/dts/rk3399.dtsi | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/arch/arm/dts/rk3399-evb.dts b/arch/arm/dts/rk3399-evb.dts
index a0ea589015..ae28bded64 100644
--- a/arch/arm/dts/rk3399-evb.dts
+++ b/arch/arm/dts/rk3399-evb.dts
@@ -17,7 +17,7 @@
chosen {
stdout-path = &uart2;
- u-boot,spl-boot-order = &sdhci, &sdmmc;
+ u-boot,spl-boot-order = &sdmmc, &sdhci;
};
vdd_center: vdd-center {
diff --git a/arch/arm/dts/rk3399.dtsi b/arch/arm/dts/rk3399.dtsi
index 68221b47f7..cfb99c9e16 100644
--- a/arch/arm/dts/rk3399.dtsi
+++ b/arch/arm/dts/rk3399.dtsi
@@ -35,8 +35,8 @@
serial2 = &uart2;
serial3 = &uart3;
serial4 = &uart4;
- mmc0 = &sdhci;
- mmc1 = &sdmmc;
+ mmc0 = &sdmmc;
+ mmc1 = &sdhci;
};
cpus {

View File

@ -0,0 +1,52 @@
From 180c7b262f17a58de6865b7b7a5df609e1449ce8 Mon Sep 17 00:00:00 2001
From: Jonas Karlman <jonas@kwiboo.se>
Date: Sun, 5 Aug 2018 20:58:54 +0200
Subject: [PATCH] rockchip: rk3288: add efuse support
---
arch/arm/dts/rk3288.dtsi | 5 ++---
configs/miqi-rk3288_defconfig | 2 ++
configs/tinker-rk3288_defconfig | 1 +
3 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/arch/arm/dts/rk3288.dtsi b/arch/arm/dts/rk3288.dtsi
index 20adb0dece..8b085ee6dc 100644
--- a/arch/arm/dts/rk3288.dtsi
+++ b/arch/arm/dts/rk3288.dtsi
@@ -936,9 +936,8 @@
};
efuse: efuse@ffb40000 {
- compatible = "rockchip,rk3288-efuse";
- reg = <0xffb40000 0x10000>;
- status = "disabled";
+ compatible = "rockchip,rockchip-efuse";
+ reg = <0xffb40000 0x20>;
};
gic: interrupt-controller@ffc01000 {
diff --git a/configs/miqi-rk3288_defconfig b/configs/miqi-rk3288_defconfig
index 09d5979dff..ffbe701cfd 100644
--- a/configs/miqi-rk3288_defconfig
+++ b/configs/miqi-rk3288_defconfig
@@ -48,6 +48,8 @@ CONFIG_ROCKCHIP_GPIO=y
CONFIG_SYS_I2C_ROCKCHIP=y
CONFIG_DM_KEY=y
CONFIG_ADC_KEY=y
+CONFIG_MISC=y
+CONFIG_ROCKCHIP_EFUSE=y
CONFIG_MMC_DW=y
CONFIG_MMC_DW_ROCKCHIP=y
CONFIG_DM_ETH=y
diff --git a/configs/tinker-rk3288_defconfig b/configs/tinker-rk3288_defconfig
index 3abf7c1088..0afc0a35e1 100644
--- a/configs/tinker-rk3288_defconfig
+++ b/configs/tinker-rk3288_defconfig
@@ -46,6 +46,7 @@ CONFIG_SPL_CLK=y
CONFIG_ROCKCHIP_GPIO=y
CONFIG_SYS_I2C_ROCKCHIP=y
CONFIG_MISC=y
+CONFIG_ROCKCHIP_EFUSE=y
CONFIG_I2C_EEPROM=y
CONFIG_MMC_DW=y
CONFIG_MMC_DW_ROCKCHIP=y

View File

@ -0,0 +1,73 @@
From 99854fa357a70ce160f7db78c383642c119cbad7 Mon Sep 17 00:00:00 2001
From: Jonas Karlman <jonas@kwiboo.se>
Date: Sun, 5 Aug 2018 20:58:54 +0200
Subject: [PATCH] rk3288-miqi: get ethaddr from efuse
---
board/mqmaker/miqi_rk3288/miqi-rk3288.c | 43 +++++++++++++++++++++++++
configs/miqi-rk3288_defconfig | 1 -
2 files changed, 43 insertions(+), 1 deletion(-)
diff --git a/board/mqmaker/miqi_rk3288/miqi-rk3288.c b/board/mqmaker/miqi_rk3288/miqi-rk3288.c
index 846deddb80..f719218eb6 100644
--- a/board/mqmaker/miqi_rk3288/miqi-rk3288.c
+++ b/board/mqmaker/miqi_rk3288/miqi-rk3288.c
@@ -6,3 +6,46 @@
#include <common.h>
#include <spl.h>
+#include <hash.h>
+#include <u-boot/sha256.h>
+
+static void setup_macaddr(void)
+{
+#if CONFIG_IS_ENABLED(CMD_NET)
+ int ret;
+ const char *cpuid = env_get("cpuid#");
+ u8 hash[SHA256_SUM_LEN];
+ int size = sizeof(hash);
+ u8 mac_addr[6];
+
+ /* Only generate a MAC address, if none is set in the environment */
+ if (env_get("ethaddr"))
+ return;
+
+ if (!cpuid) {
+ debug("%s: could not retrieve 'cpuid#'\n", __func__);
+ return;
+ }
+
+ ret = hash_block("sha256", (void *)cpuid, strlen(cpuid), hash, &size);
+ if (ret) {
+ debug("%s: failed to calculate SHA256\n", __func__);
+ return;
+ }
+
+ /* Copy 6 bytes of the hash to base the MAC address on */
+ memcpy(mac_addr, hash, 6);
+
+ /* Make this a valid MAC address and set it */
+ mac_addr[0] &= 0xfe; /* clear multicast bit */
+ mac_addr[0] |= 0x02; /* set local assignment bit (IEEE802) */
+ eth_env_set_enetaddr("ethaddr", mac_addr);
+#endif
+}
+
+int rk3288_board_late_init(void)
+{
+ setup_macaddr();
+
+ return 0;
+}
diff --git a/configs/miqi-rk3288_defconfig b/configs/miqi-rk3288_defconfig
index ffbe701cfd..746d8035ee 100644
--- a/configs/miqi-rk3288_defconfig
+++ b/configs/miqi-rk3288_defconfig
@@ -36,7 +36,6 @@ CONFIG_SPL_PARTITION_UUIDS=y
CONFIG_SPL_OF_CONTROL=y
CONFIG_OF_SPL_REMOVE_PROPS="pinctrl-0 pinctrl-names clock-names interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents"
CONFIG_ENV_IS_IN_MMC=y
-CONFIG_NET_RANDOM_ETHADDR=y
CONFIG_REGMAP=y
CONFIG_SPL_REGMAP=y
CONFIG_SYSCON=y

View File

@ -0,0 +1,142 @@
From ea235722e95630c3d5da5403e660a8bc20e2b8d0 Mon Sep 17 00:00:00 2001
From: Jonas Karlman <jonas@kwiboo.se>
Date: Mon, 20 Aug 2018 23:01:10 +0200
Subject: [PATCH] rk3399-evb: fixup get serial and ethaddr from efuse
---
board/rockchip/evb_rk3399/evb-rk3399.c | 80 +-------------------------
include/configs/evb_rk3399.h | 3 -
2 files changed, 2 insertions(+), 81 deletions(-)
diff --git a/board/rockchip/evb_rk3399/evb-rk3399.c b/board/rockchip/evb_rk3399/evb-rk3399.c
index b6f730852a..c0a38d5143 100644
--- a/board/rockchip/evb_rk3399/evb-rk3399.c
+++ b/board/rockchip/evb_rk3399/evb-rk3399.c
@@ -6,13 +6,12 @@
#include <common.h>
#include <dm.h>
-#include <misc.h>
#include <ram.h>
#include <dm/pinctrl.h>
#include <dm/uclass-internal.h>
-#include <asm/setup.h>
#include <asm/arch/periph.h>
#include <power/regulator.h>
+#include <hash.h>
#include <u-boot/sha256.h>
#include <usb.h>
#include <dwc3-uboot.h>
@@ -20,9 +19,6 @@
DECLARE_GLOBAL_DATA_PTR;
-#define RK3399_CPUID_OFF 0x7
-#define RK3399_CPUID_LEN 0x10
-
int rk_board_init(void)
{
struct udevice *pinctrl, *regulator;
@@ -106,87 +102,15 @@ static void setup_macaddr(void)
mac_addr[0] |= 0x02; /* set local assignment bit (IEEE802) */
eth_env_set_enetaddr("ethaddr", mac_addr);
#endif
-
- return;
}
-static void setup_serial(void)
+int rk_board_late_init(void)
{
-#if CONFIG_IS_ENABLED(ROCKCHIP_EFUSE)
- struct udevice *dev;
- int ret, i;
- u8 cpuid[RK3399_CPUID_LEN];
- u8 low[RK3399_CPUID_LEN/2], high[RK3399_CPUID_LEN/2];
- char cpuid_str[RK3399_CPUID_LEN * 2 + 1];
- u64 serialno;
- char serialno_str[16];
-
- /* retrieve the device */
- ret = uclass_get_device_by_driver(UCLASS_MISC,
- DM_GET_DRIVER(rockchip_efuse), &dev);
- if (ret) {
- debug("%s: could not find efuse device\n", __func__);
- return;
- }
-
- /* read the cpu_id range from the efuses */
- ret = misc_read(dev, RK3399_CPUID_OFF, &cpuid, sizeof(cpuid));
- if (ret) {
- debug("%s: reading cpuid from the efuses failed\n",
- __func__);
- return;
- }
-
- memset(cpuid_str, 0, sizeof(cpuid_str));
- for (i = 0; i < 16; i++)
- sprintf(&cpuid_str[i * 2], "%02x", cpuid[i]);
-
- debug("cpuid: %s\n", cpuid_str);
-
- /*
- * Mix the cpuid bytes using the same rules as in
- * ${linux}/drivers/soc/rockchip/rockchip-cpuinfo.c
- */
- for (i = 0; i < 8; i++) {
- low[i] = cpuid[1 + (i << 1)];
- high[i] = cpuid[i << 1];
- }
-
- serialno = crc32_no_comp(0, low, 8);
- serialno |= (u64)crc32_no_comp(serialno, high, 8) << 32;
- snprintf(serialno_str, sizeof(serialno_str), "%llx", serialno);
-
- env_set("cpuid#", cpuid_str);
- env_set("serial#", serialno_str);
-#endif
-
- return;
-}
-
-int misc_init_r(void)
-{
- setup_serial();
setup_macaddr();
return 0;
}
-#ifdef CONFIG_SERIAL_TAG
-void get_board_serial(struct tag_serialnr *serialnr)
-{
- char *serial_string;
- u64 serial = 0;
-
- serial_string = env_get("serial#");
-
- if (serial_string)
- serial = simple_strtoull(serial_string, NULL, 16);
-
- serialnr->high = (u32)(serial >> 32);
- serialnr->low = (u32)(serial & 0xffffffff);
-}
-#endif
-
#ifdef CONFIG_USB_DWC3
static struct dwc3_device dwc3_device_data = {
.maximum_speed = USB_SPEED_HIGH,
diff --git a/include/configs/evb_rk3399.h b/include/configs/evb_rk3399.h
index 5565c7ce53..840d63ff6d 100644
--- a/include/configs/evb_rk3399.h
+++ b/include/configs/evb_rk3399.h
@@ -18,9 +18,6 @@
#define CONFIG_SYS_MMC_ENV_DEV 0
#define SDRAM_BANK_SIZE (2UL << 30)
-#define CONFIG_MISC_INIT_R
-#define CONFIG_SERIAL_TAG
-#define CONFIG_ENV_OVERWRITE
#define CONFIG_BMP_16BPP
#define CONFIG_BMP_24BPP

View File

@ -0,0 +1,175 @@
From 37a07ad0222bb19c7fdc03d7679bae47d9875eed Mon Sep 17 00:00:00 2001
From: Heinrich Schuchardt <xypron.glpk@gmx.de>
Date: Mon, 7 May 2018 22:18:27 +0200
Subject: [PATCH] include: update log2 header from the Linux kernel
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Without the patch gcc 8 produces:
warning: ignoring attribute noreturn because it conflicts with
attribute const [-Wattributes]
int ____ilog2_NaN(void);
So let's update the include from Linux kernel v4.16.
This removes static checks of ilog2() arguments.
Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
(cherry picked from commit 4a8e72954e11f2c2c37ee138b88a1d9362dba4da)
---
include/linux/log2.h | 63 ++++++++++++++++++++++++++------------------
1 file changed, 37 insertions(+), 26 deletions(-)
diff --git a/include/linux/log2.h b/include/linux/log2.h
index aa1de63090..b62c07b29f 100644
--- a/include/linux/log2.h
+++ b/include/linux/log2.h
@@ -4,6 +4,11 @@
* Written by David Howells (dhowells@redhat.com)
*
* SPDX-License-Identifier: GPL-2.0+
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
*/
#ifndef _LINUX_LOG2_H
@@ -12,12 +17,6 @@
#include <linux/types.h>
#include <linux/bitops.h>
-/*
- * deal with unrepresentable constant logarithms
- */
-extern __attribute__((const, noreturn))
-int ____ilog2_NaN(void);
-
/*
* non-constant log of base 2 calculators
* - the arch may override these in asm/bitops.h if they can be implemented
@@ -40,19 +39,23 @@ int __ilog2_u64(u64 n)
}
#endif
-/*
- * Determine whether some value is a power of two, where zero is
+/**
+ * is_power_of_2() - check if a value is a power of two
+ * @n: the value to check
+ *
+ * Determine whether some value is a power of two, where zero is
* *not* considered a power of two.
+ * Return: true if @n is a power of 2, otherwise false.
*/
-
static inline __attribute__((const))
bool is_power_of_2(unsigned long n)
{
return (n != 0 && ((n & (n - 1)) == 0));
}
-/*
- * round up to nearest power of two
+/**
+ * __roundup_pow_of_two() - round up to nearest power of two
+ * @n: value to round up
*/
static inline __attribute__((const))
unsigned long __roundup_pow_of_two(unsigned long n)
@@ -60,8 +63,9 @@ unsigned long __roundup_pow_of_two(unsigned long n)
return 1UL << fls_long(n - 1);
}
-/*
- * round down to nearest power of two
+/**
+ * __rounddown_pow_of_two() - round down to nearest power of two
+ * @n: value to round down
*/
static inline __attribute__((const))
unsigned long __rounddown_pow_of_two(unsigned long n)
@@ -70,19 +74,19 @@ unsigned long __rounddown_pow_of_two(unsigned long n)
}
/**
- * ilog2 - log of base 2 of 32-bit or a 64-bit unsigned value
- * @n - parameter
+ * ilog2 - log base 2 of 32-bit or a 64-bit unsigned value
+ * @n: parameter
*
* constant-capable log of base 2 calculation
* - this can be used to initialise global variables from constant data, hence
- * the massive ternary operator construction
+ * the massive ternary operator construction
*
* selects the appropriately-sized optimised version depending on sizeof(n)
*/
#define ilog2(n) \
( \
__builtin_constant_p(n) ? ( \
- (n) < 1 ? ____ilog2_NaN() : \
+ (n) < 2 ? 0 : \
(n) & (1ULL << 63) ? 63 : \
(n) & (1ULL << 62) ? 62 : \
(n) & (1ULL << 61) ? 61 : \
@@ -145,10 +149,7 @@ unsigned long __rounddown_pow_of_two(unsigned long n)
(n) & (1ULL << 4) ? 4 : \
(n) & (1ULL << 3) ? 3 : \
(n) & (1ULL << 2) ? 2 : \
- (n) & (1ULL << 1) ? 1 : \
- (n) & (1ULL << 0) ? 0 : \
- ____ilog2_NaN() \
- ) : \
+ 1) : \
(sizeof(n) <= 4) ? \
__ilog2_u32(n) : \
__ilog2_u64(n) \
@@ -156,7 +157,7 @@ unsigned long __rounddown_pow_of_two(unsigned long n)
/**
* roundup_pow_of_two - round the given value up to nearest power of two
- * @n - parameter
+ * @n: parameter
*
* round the given value up to the nearest power of two
* - the result is undefined when n == 0
@@ -173,7 +174,7 @@ unsigned long __rounddown_pow_of_two(unsigned long n)
/**
* rounddown_pow_of_two - round the given value down to nearest power of two
- * @n - parameter
+ * @n: parameter
*
* round the given value down to the nearest power of two
* - the result is undefined when n == 0
@@ -186,6 +187,12 @@ unsigned long __rounddown_pow_of_two(unsigned long n)
__rounddown_pow_of_two(n) \
)
+static inline __attribute_const__
+int __order_base_2(unsigned long n)
+{
+ return n > 1 ? ilog2(n - 1) + 1 : 0;
+}
+
/**
* order_base_2 - calculate the (rounded up) base 2 order of the argument
* @n: parameter
@@ -199,7 +206,11 @@ unsigned long __rounddown_pow_of_two(unsigned long n)
* ob2(5) = 3
* ... and so on.
*/
-
-#define order_base_2(n) ilog2(roundup_pow_of_two(n))
-
+#define order_base_2(n) \
+( \
+ __builtin_constant_p(n) ? ( \
+ ((n) == 0 || (n) == 1) ? 0 : \
+ ilog2((n) - 1) + 1) : \
+ __order_base_2(n) \
+)
#endif /* _LINUX_LOG2_H */

View File

@ -0,0 +1,182 @@
From 1ba76e3eb47e865d84e42a6b5484516ef4457bf7 Mon Sep 17 00:00:00 2001
From: Jonas Karlman <jonas@kwiboo.se>
Date: Sat, 18 Aug 2018 17:27:32 +0200
Subject: [PATCH] rockchip: disable android boot and config
---
arch/arm/mach-rockchip/boot_mode.c | 2 +-
configs/evb-rk3328_defconfig | 5 ++---
configs/evb-rk3399_defconfig | 14 --------------
configs/miqi-rk3288_defconfig | 12 +-----------
configs/tinker-rk3288_defconfig | 3 ---
include/configs/rockchip-common.h | 2 --
6 files changed, 4 insertions(+), 34 deletions(-)
diff --git a/arch/arm/mach-rockchip/boot_mode.c b/arch/arm/mach-rockchip/boot_mode.c
index 8a20a3a31e..9441c49477 100644
--- a/arch/arm/mach-rockchip/boot_mode.c
+++ b/arch/arm/mach-rockchip/boot_mode.c
@@ -123,9 +123,9 @@ int setup_boot_mode(void)
int boot_mode = BOOT_MODE_NORMAL;
char env_preboot[256] = {0};
+#ifdef CONFIG_RKIMG_BOOTLOADER
devtype_num_envset();
rockchip_dnl_mode_check();
-#ifdef CONFIG_RKIMG_BOOTLOADER
boot_mode = rockchip_get_boot_mode();
#endif
switch (boot_mode) {
diff --git a/configs/evb-rk3328_defconfig b/configs/evb-rk3328_defconfig
index 0897a28e1d..85ee85741e 100644
--- a/configs/evb-rk3328_defconfig
+++ b/configs/evb-rk3328_defconfig
@@ -39,8 +39,8 @@ CONFIG_TPL_OF_CONTROL=y
CONFIG_OF_SPL_REMOVE_PROPS="pinctrl-0 pinctrl-names clock-names interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents"
CONFIG_TPL_OF_PLATDATA=y
CONFIG_ENV_IS_IN_MMC=y
-CONFIG_TPL_DM=y
CONFIG_NET_RANDOM_ETHADDR=y
+CONFIG_TPL_DM=y
CONFIG_REGMAP=y
CONFIG_SPL_REGMAP=y
CONFIG_TPL_REGMAP=y
@@ -56,12 +56,11 @@ CONFIG_MISC=y
CONFIG_ROCKCHIP_EFUSE=y
CONFIG_MMC_DW=y
CONFIG_MMC_DW_ROCKCHIP=y
-CONFIG_PHY=y
-CONFIG_PHY_ROCKCHIP_INNO_USB2=y
CONFIG_DM_ETH=y
CONFIG_ETH_DESIGNWARE=y
CONFIG_GMAC_ROCKCHIP=y
CONFIG_PHY=y
+CONFIG_PHY_ROCKCHIP_INNO_USB2=y
CONFIG_PINCTRL=y
CONFIG_DM_PMIC=y
CONFIG_PMIC_RK8XX=y
diff --git a/configs/evb-rk3399_defconfig b/configs/evb-rk3399_defconfig
index 305f0a405d..bd86db31af 100644
--- a/configs/evb-rk3399_defconfig
+++ b/configs/evb-rk3399_defconfig
@@ -5,8 +5,6 @@ CONFIG_SPL_LIBGENERIC_SUPPORT=y
CONFIG_SYS_MALLOC_F_LEN=0x4000
CONFIG_ROCKCHIP_RK3399=y
CONFIG_ROCKCHIP_SPL_RESERVE_IRAM=0x4000
-CONFIG_RKIMG_BOOTLOADER=y
-# CONFIG_USING_KERNEL_DTB is not set
CONFIG_SPL_STACK_R_ADDR=0x80000
CONFIG_DEFAULT_DEVICE_TREE="rk3399-evb"
CONFIG_DEBUG_UART=y
@@ -14,7 +12,6 @@ CONFIG_FIT=y
CONFIG_SPL_LOAD_FIT=y
CONFIG_SPL_FIT_GENERATOR="arch/arm/mach-rockchip/make_fit_atf.py"
# CONFIG_DISPLAY_CPUINFO is not set
-CONFIG_ANDROID_BOOTLOADER=y
CONFIG_SPL_STACK_R=y
CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN=0x4000
CONFIG_SPL_ATF=y
@@ -26,9 +23,6 @@ CONFIG_FASTBOOT_FLASH_MMC_DEV=0
CONFIG_CMD_BOOTZ=y
# CONFIG_CMD_IMLS is not set
CONFIG_CMD_GPT=y
-CONFIG_CMD_LOAD_ANDROID=y
-CONFIG_CMD_BOOT_ANDROID=y
-CONFIG_CMD_BOOT_ROCKCHIP=y
CONFIG_CMD_MMC=y
CONFIG_CMD_SF=y
CONFIG_CMD_USB=y
@@ -94,13 +88,5 @@ CONFIG_USB_ETHER_ASIX88179=y
CONFIG_USB_ETHER_MCS7830=y
CONFIG_USB_ETHER_RTL8152=y
CONFIG_USB_ETHER_SMSC95XX=y
-CONFIG_DM_VIDEO=y
-CONFIG_DISPLAY=y
-CONFIG_DRM_ROCKCHIP=y
-CONFIG_DRM_ROCKCHIP_DW_MIPI_DSI=y
-CONFIG_DRM_ROCKCHIP_ANALOGIX_DP=y
-CONFIG_DRM_ROCKCHIP_LVDS=y
-CONFIG_DRM_ROCKCHIP_RGB=y
-CONFIG_LCD=y
CONFIG_USE_TINY_PRINTF=y
CONFIG_ERRNO_STR=y
diff --git a/configs/miqi-rk3288_defconfig b/configs/miqi-rk3288_defconfig
index 746d8035ee..4826581bf7 100644
--- a/configs/miqi-rk3288_defconfig
+++ b/configs/miqi-rk3288_defconfig
@@ -3,12 +3,11 @@ CONFIG_ARCH_ROCKCHIP=y
CONFIG_SYS_MALLOC_F_LEN=0x2000
CONFIG_ROCKCHIP_RK3288=y
CONFIG_SPL_ROCKCHIP_BACK_TO_BROM=y
-CONFIG_RKIMG_BOOTLOADER=y
CONFIG_TARGET_MIQI_RK3288=y
CONFIG_SPL_STACK_R_ADDR=0x80000
CONFIG_DEFAULT_DEVICE_TREE="rk3288-miqi"
CONFIG_DEBUG_UART=y
-# CONFIG_SILENT_CONSOLE is not set
+# CONFIG_ANDROID_BOOT_IMAGE is not set
# CONFIG_DISPLAY_CPUINFO is not set
CONFIG_SPL_STACK_R=y
CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN=0x2000
@@ -16,10 +15,6 @@ CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN=0x2000
CONFIG_CMD_GPIO=y
CONFIG_CMD_GPT=y
CONFIG_CMD_I2C=y
-CONFIG_ANDROID_BOOT_IMAGE=y
-CONFIG_ANDROID_BOOTLOADER=y
-CONFIG_CMD_BOOT_ANDROID=y
-CONFIG_CMD_BOOT_ROCKCHIP=y
CONFIG_CMD_MMC=y
CONFIG_CMD_SF=y
CONFIG_CMD_SPI=y
@@ -79,11 +74,6 @@ CONFIG_G_DNL_PRODUCT_NUM=0x320a
CONFIG_USB_HOST_ETHER=y
CONFIG_USB_ETHER_ASIX=y
CONFIG_USB_ETHER_SMSC95XX=y
-CONFIG_DM_VIDEO=y
-CONFIG_DISPLAY=y
-CONFIG_VIDEO_ROCKCHIP=y
-CONFIG_DISPLAY_ROCKCHIP_HDMI=y
-CONFIG_CONSOLE_SCROLL_LINES=10
CONFIG_USE_TINY_PRINTF=y
CONFIG_CMD_DHRYSTONE=y
CONFIG_ERRNO_STR=y
diff --git a/configs/tinker-rk3288_defconfig b/configs/tinker-rk3288_defconfig
index 0afc0a35e1..a6f8c0cb51 100644
--- a/configs/tinker-rk3288_defconfig
+++ b/configs/tinker-rk3288_defconfig
@@ -3,13 +3,11 @@ CONFIG_ARCH_ROCKCHIP=y
CONFIG_SYS_MALLOC_F_LEN=0x2000
CONFIG_ROCKCHIP_RK3288=y
CONFIG_SPL_ROCKCHIP_BACK_TO_BROM=y
-CONFIG_RKIMG_BOOTLOADER=y
CONFIG_TARGET_TINKER_RK3288=y
CONFIG_SPL_STACK_R_ADDR=0x80000
CONFIG_DEFAULT_DEVICE_TREE="rk3288-tinker"
CONFIG_DEBUG_UART=y
# CONFIG_ANDROID_BOOT_IMAGE is not set
-# CONFIG_SILENT_CONSOLE is not set
CONFIG_CONSOLE_MUX=y
# CONFIG_DISPLAY_CPUINFO is not set
CONFIG_SPL_STACK_R=y
@@ -19,7 +17,6 @@ CONFIG_SPL_I2C_SUPPORT=y
CONFIG_CMD_GPIO=y
CONFIG_CMD_GPT=y
CONFIG_CMD_I2C=y
-CONFIG_CMD_BOOT_ROCKCHIP=y
CONFIG_CMD_MMC=y
CONFIG_CMD_SF=y
CONFIG_CMD_SPI=y
diff --git a/include/configs/rockchip-common.h b/include/configs/rockchip-common.h
index 38ff08a57f..1e8f6c344e 100644
--- a/include/configs/rockchip-common.h
+++ b/include/configs/rockchip-common.h
@@ -99,8 +99,6 @@
"fi; \0"
#define RKIMG_BOOTCOMMAND \
- "boot_android ${devtype} ${devnum};" \
- "bootrkp;" \
"run distro_bootcmd;"
#endif

View File

@ -38,3 +38,4 @@ You may have luck if your device vendor is open source friendly, otherwise keep
* `cat /sys/kernel/debug/clk/clk_summary`
* `hexdump -C /sys/class/drm/card0-HDMI-A-1/edid`
* `edid-decode /sys/class/drm/card0-HDMI-A-1/edid`
* `cat /sys/kernel/debug/dma_buf/bufinfo`

View File

@ -13,15 +13,22 @@ case "$PKG_SOC" in
PKG_DATAFILE="spl/u-boot-spl-nodtb.bin"
PKG_LOADER="u-boot-dtb.bin"
;;
rk3288)
PKG_DATAFILE="$PKG_RKBIN/rk32/rk3288_ddr_400MHz_v1.06.bin"
PKG_LOADER="$PKG_RKBIN/rk32/rk3288_miniloader_v2.36.bin"
PKG_LOAD_ADDR="0x0"
;;
rk3328)
PKG_DATAFILE="$PKG_RKBIN/rk33/rk3328_ddr_786MHz_v1.12.bin"
PKG_LOADER="$PKG_RKBIN/rk33/rk3328_miniloader_v2.44.bin"
PKG_DATAFILE="$PKG_RKBIN/rk33/rk3328_ddr_786MHz_v1.13.bin"
PKG_LOADER="$PKG_RKBIN/rk33/rk3328_miniloader_v2.46.bin"
PKG_BL31="$PKG_RKBIN/rk33/rk3328_bl31_v1.39.bin"
PKG_LOAD_ADDR="0x200000"
;;
rk3399)
PKG_DATAFILE="$PKG_RKBIN/rk33/rk3399_ddr_800MHz_v1.09.bin"
PKG_LOADER="$PKG_RKBIN/rk33/rk3399_miniloader_v1.09.bin"
PKG_BL31="$PKG_RKBIN/rk33/rk3399_bl31_v1.00.elf"
PKG_DATAFILE="$PKG_RKBIN/rk33/rk3399_ddr_800MHz_v1.13.bin"
PKG_LOADER="$PKG_RKBIN/rk33/rk3399_miniloader_v1.12.bin"
PKG_BL31="$PKG_RKBIN/rk33/rk3399_bl31_v1.17.elf"
PKG_LOAD_ADDR="0x200000"
;;
*)
PKG_DATAFILE="spl/u-boot-spl-dtb.bin"
@ -35,10 +42,12 @@ if [ -n "$PKG_DATAFILE" -a -n "$PKG_LOADER" ]; then
cp -av idbloader.img $INSTALL/usr/share/bootloader
fi
if [ -n "$PKG_BL31" ]; then
$PKG_RKBIN/tools/loaderimage --pack --uboot u-boot-dtb.bin uboot.img 0x200000
if [ -n "$PKG_LOAD_ADDR" ]; then
$PKG_RKBIN/tools/loaderimage --pack --uboot u-boot-dtb.bin uboot.img $PKG_LOAD_ADDR
cp -av uboot.img $INSTALL/usr/share/bootloader
fi
if [ -n "$PKG_BL31" ]; then
cat >trust.ini <<EOF
[BL30_OPTION]
SEC=0

View File

@ -1,6 +1,6 @@
#
# Automatically generated file; DO NOT EDIT.
# Linux/arm 4.4.114 Kernel Configuration
# Linux/arm 4.4.143 Kernel Configuration
#
CONFIG_ARM=y
CONFIG_ARM_HAS_SG_CHAIN=y
@ -152,6 +152,7 @@ CONFIG_RD_GZIP=y
CONFIG_RD_XZ=y
# CONFIG_RD_LZO is not set
# CONFIG_RD_LZ4 is not set
# CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE is not set
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
CONFIG_SYSCTL=y
CONFIG_ANON_INODES=y
@ -237,6 +238,7 @@ CONFIG_HAVE_MOD_ARCH_SPECIFIC=y
CONFIG_MODULES_USE_ELF_REL=y
CONFIG_ARCH_HAS_ELF_RANDOMIZE=y
CONFIG_HAVE_ARCH_MMAP_RND_BITS=y
CONFIG_HAVE_EXIT_THREAD=y
CONFIG_ARCH_MMAP_RND_BITS_MIN=8
CONFIG_ARCH_MMAP_RND_BITS_MAX=16
CONFIG_ARCH_MMAP_RND_BITS=8
@ -471,7 +473,6 @@ CONFIG_ARM_CPU_TOPOLOGY=y
# CONFIG_SCHED_SMT is not set
CONFIG_HAVE_ARM_SCU=y
CONFIG_HAVE_ARM_ARCH_TIMER=y
CONFIG_HAVE_ARM_TWD=y
# CONFIG_MCPM is not set
# CONFIG_BIG_LITTLE is not set
CONFIG_VMSPLIT_3G=y
@ -511,9 +512,11 @@ CONFIG_FLATMEM=y
CONFIG_FLAT_NODE_MEM_MAP=y
CONFIG_HAVE_MEMBLOCK=y
CONFIG_NO_BOOTMEM=y
CONFIG_MEMORY_ISOLATION=y
# CONFIG_HAVE_BOOTMEM_INFO_NODE is not set
CONFIG_SPLIT_PTLOCK_CPUS=4
# CONFIG_COMPACTION is not set
CONFIG_MIGRATION=y
# CONFIG_PHYS_ADDR_T_64BIT is not set
CONFIG_ZONE_DMA_FLAG=0
CONFIG_BOUNCE=y
@ -521,11 +524,14 @@ CONFIG_BOUNCE=y
CONFIG_DEFAULT_MMAP_MIN_ADDR=32768
# CONFIG_CLEANCACHE is not set
# CONFIG_FRONTSWAP is not set
# CONFIG_CMA is not set
CONFIG_CMA=y
# CONFIG_CMA_DEBUG is not set
CONFIG_CMA_DEBUGFS=y
CONFIG_CMA_AREAS=7
# CONFIG_ZPOOL is not set
# CONFIG_ZBUD is not set
CONFIG_ZSMALLOC=y
# CONFIG_PGTABLE_MAPPING is not set
CONFIG_ZSMALLOC=m
CONFIG_PGTABLE_MAPPING=y
# CONFIG_ZSMALLOC_STAT is not set
# CONFIG_IDLE_PAGE_TRACKING is not set
CONFIG_FORCE_MAX_ZONEORDER=11
@ -547,7 +553,7 @@ CONFIG_ATAGS=y
CONFIG_ZBOOT_ROM_TEXT=0x0
CONFIG_ZBOOT_ROM_BSS=0x0
# CONFIG_ARM_APPENDED_DTB is not set
CONFIG_CMDLINE="root=/dev/ram0 rdinit=/init usbcore.autosuspend=-1"
CONFIG_CMDLINE="usbcore.autosuspend=-1"
# CONFIG_CMDLINE_FROM_BOOTLOADER is not set
CONFIG_CMDLINE_EXTEND=y
# CONFIG_CMDLINE_FORCE is not set
@ -566,13 +572,13 @@ CONFIG_CPU_FREQ=y
CONFIG_CPU_FREQ_GOV_COMMON=y
CONFIG_CPU_FREQ_STAT=y
# CONFIG_CPU_FREQ_STAT_DETAILS is not set
CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
CONFIG_CPU_FREQ_TIMES=y
# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set
CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_INTERACTIVE is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_SCHED is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL is not set
CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
CONFIG_CPU_FREQ_GOV_POWERSAVE=y
@ -1016,6 +1022,7 @@ CONFIG_RFKILL_GPIO=y
# CONFIG_CEPH_LIB is not set
# CONFIG_NFC is not set
# CONFIG_LWTUNNEL is not set
CONFIG_DST_CACHE=y
CONFIG_HAVE_BPF_JIT=y
#
@ -1051,6 +1058,17 @@ CONFIG_REGMAP_MMIO=y
CONFIG_REGMAP_IRQ=y
CONFIG_DMA_SHARED_BUFFER=y
# CONFIG_FENCE_TRACE is not set
CONFIG_DMA_CMA=y
#
# Default contiguous memory area size:
#
CONFIG_CMA_SIZE_MBYTES=64
CONFIG_CMA_SIZE_SEL_MBYTES=y
# CONFIG_CMA_SIZE_SEL_PERCENTAGE is not set
# CONFIG_CMA_SIZE_SEL_MIN is not set
# CONFIG_CMA_SIZE_SEL_MAX is not set
CONFIG_CMA_ALIGNMENT=8
#
# Bus devices
@ -1078,8 +1096,8 @@ CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y
# CONFIG_PARPORT is not set
CONFIG_BLK_DEV=y
# CONFIG_BLK_DEV_NULL_BLK is not set
CONFIG_ZRAM=y
# CONFIG_ZRAM_LZ4_COMPRESS is not set
CONFIG_ZRAM=m
CONFIG_ZRAM_LZ4_COMPRESS=y
# CONFIG_BLK_DEV_COW_COMMON is not set
CONFIG_BLK_DEV_LOOP=y
CONFIG_BLK_DEV_LOOP_MIN_COUNT=8
@ -1097,7 +1115,7 @@ CONFIG_BLK_DEV_RAM_SIZE=4096
#
# Misc devices
#
# CONFIG_ROCKCHIP_SCR is not set
CONFIG_ROCKCHIP_SCR=y
# CONFIG_SENSORS_LIS3LV02D is not set
# CONFIG_AD525X_DPOT is not set
# CONFIG_DUMMY_IRQ is not set
@ -1329,7 +1347,7 @@ CONFIG_PHYLIB=y
# CONFIG_CICADA_PHY is not set
# CONFIG_VITESSE_PHY is not set
# CONFIG_TERANETICS_PHY is not set
# CONFIG_ROCKCHIP_PHY is not set
CONFIG_ROCKCHIP_PHY=y
# CONFIG_SMSC_PHY is not set
# CONFIG_BROADCOM_PHY is not set
# CONFIG_BCM7XXX_PHY is not set
@ -1434,7 +1452,8 @@ CONFIG_RT2X00_LIB_LEDS=y
CONFIG_WL_ROCKCHIP=y
CONFIG_WIFI_BUILD_MODULE=y
# CONFIG_WIFI_LOAD_DRIVER_WHEN_KERNEL_BOOTUP is not set
CONFIG_AP6XXX=m
# CONFIG_AP6XXX is not set
# CONFIG_CYW_BCMDHD is not set
CONFIG_RTL_WIRELESS_SOLUTION=y
# CONFIG_RTL8188EU is not set
# CONFIG_RTL8188FU is not set
@ -1444,6 +1463,12 @@ CONFIG_RTL8723BS=m
# CONFIG_RTL8723BU is not set
# CONFIG_RTL8723CS is not set
# CONFIG_RTL8723DS is not set
# CONFIG_MVL88W8977 is not set
#
# SouthSV 6XXX WLAN support
#
# CONFIG_SSV6051 is not set
# CONFIG_WL_TI is not set
CONFIG_ZD1211RW=m
# CONFIG_ZD1211RW_DEBUG is not set
@ -1578,6 +1603,7 @@ CONFIG_TOUCHSCREEN_ATMEL_MXT=y
# CONFIG_TOUCHSCREEN_FT6236 is not set
# CONFIG_TOUCHSCREEN_FUJITSU is not set
# CONFIG_TOUCHSCREEN_GOODIX is not set
# CONFIG_TOUCHSCREEN_GSLX680A is not set
# CONFIG_TOUCHSCREEN_GSLX680_D708 is not set
# CONFIG_TOUCHSCREEN_GSLX680_PAD is not set
# CONFIG_TOUCHSCREEN_GSLX680_VR is not set
@ -1892,6 +1918,7 @@ CONFIG_GENERIC_PINCONF=y
# CONFIG_PINCTRL_AMD is not set
CONFIG_PINCTRL_ROCKCHIP=y
# CONFIG_PINCTRL_SINGLE is not set
# CONFIG_PINCTRL_RK805 is not set
CONFIG_ARCH_HAVE_CUSTOM_GPIO_H=y
CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y
CONFIG_ARCH_REQUIRE_GPIOLIB=y
@ -2304,6 +2331,7 @@ CONFIG_REGULATOR_RK808=y
# CONFIG_REGULATOR_RK818 is not set
# CONFIG_REGULATOR_SYR82X is not set
# CONFIG_REGULATOR_TPS51632 is not set
# CONFIG_REGULATOR_TPS549B22 is not set
# CONFIG_REGULATOR_TPS62360 is not set
# CONFIG_REGULATOR_TPS65023 is not set
# CONFIG_REGULATOR_TPS6507X is not set
@ -2311,6 +2339,7 @@ CONFIG_REGULATOR_RK808=y
CONFIG_REGULATOR_TPS6586X=y
# CONFIG_REGULATOR_XZ3216 is not set
CONFIG_CEC_CORE=y
CONFIG_CEC_NOTIFIER=y
CONFIG_MEDIA_SUPPORT=y
#
@ -2346,15 +2375,15 @@ CONFIG_IR_SHARP_DECODER=y
CONFIG_IR_MCE_KBD_DECODER=y
CONFIG_IR_XMP_DECODER=y
CONFIG_RC_DEVICES=y
# CONFIG_RC_ATI_REMOTE is not set
# CONFIG_IR_HIX5HD2 is not set
# CONFIG_IR_IMON is not set
# CONFIG_IR_MCEUSB is not set
# CONFIG_IR_REDRAT3 is not set
# CONFIG_IR_STREAMZAP is not set
# CONFIG_IR_IGORPLUGUSB is not set
# CONFIG_IR_IGUANA is not set
# CONFIG_IR_TTUSBIR is not set
CONFIG_RC_ATI_REMOTE=m
CONFIG_IR_HIX5HD2=m
CONFIG_IR_IMON=m
CONFIG_IR_MCEUSB=m
CONFIG_IR_REDRAT3=m
CONFIG_IR_STREAMZAP=m
CONFIG_IR_IGORPLUGUSB=m
CONFIG_IR_IGUANA=m
CONFIG_IR_TTUSBIR=m
# CONFIG_RC_LOOPBACK is not set
CONFIG_IR_GPIO_CIR=y
CONFIG_MEDIA_USB_SUPPORT=y
@ -2364,6 +2393,7 @@ CONFIG_MEDIA_USB_SUPPORT=y
#
CONFIG_USB_PULSE8_CEC=y
CONFIG_USB_RAINSHADOW_CEC=y
# CONFIG_ROCKCHIP_TSP is not set
#
# Supported MMC/SDIO adapters
@ -2399,7 +2429,7 @@ CONFIG_DRM_KMS_FB_HELPER=y
CONFIG_DRM_FBDEV_EMULATION=y
# CONFIG_DRM_LOAD_EDID_FIRMWARE is not set
# CONFIG_DRM_SCDC_HELPER is not set
CONFIG_DRM_DMA_SYNC=y
# CONFIG_DRM_DMA_SYNC is not set
#
# I2C encoder or helper chips
@ -2411,13 +2441,14 @@ CONFIG_DRM_DMA_SYNC=y
# CONFIG_DRM_VGEM is not set
# CONFIG_DRM_EXYNOS is not set
CONFIG_DRM_ROCKCHIP=y
# CONFIG_ROCKCHIP_DRM_DEBUG is not set
# CONFIG_ROCKCHIP_CDN_DP is not set
CONFIG_ROCKCHIP_DW_HDMI=y
CONFIG_ROCKCHIP_DW_MIPI_DSI=y
CONFIG_ROCKCHIP_ANALOGIX_DP=y
CONFIG_ROCKCHIP_INNO_HDMI=y
CONFIG_ROCKCHIP_LVDS=y
# CONFIG_ROCKCHIP_DRM_TVE is not set
CONFIG_ROCKCHIP_DRM_TVE=y
# CONFIG_ROCKCHIP_RGB is not set
# CONFIG_ROCKCHIP_DRM_BACKLIGHT is not set
# CONFIG_ROCKCHIP_RK3066_HDMI is not set
@ -2444,22 +2475,22 @@ CONFIG_DRM_BRIDGE=y
# CONFIG_DRM_PARADE_PS8622 is not set
# CONFIG_DRM_RK1000 is not set
# CONFIG_DRM_DUMB_VGA_DAC is not set
# CONFIG_DRM_LONTIUM_LT8912 is not set
CONFIG_DRM_ANALOGIX_DP=y
CONFIG_DRM_DW_HDMI=y
# CONFIG_DRM_DW_HDMI_AHB_AUDIO is not set
CONFIG_DRM_DW_HDMI_I2S_AUDIO=y
# CONFIG_DRM_DW_HDMI_CEC is not set
CONFIG_DRM_DW_HDMI_CEC=y
# CONFIG_DRM_STI is not set
# CONFIG_POWERVR_ROGUE_M is not set
# CONFIG_MALI400 is not set
CONFIG_MALI_DEVFREQ=y
CONFIG_MALI_MIDGARD_FOR_ANDROID=y
# CONFIG_MALI_MIDGARD_FOR_LINUX is not set
CONFIG_MALI_MIDGARD=m
# CONFIG_MALI_GATOR_SUPPORT is not set
# CONFIG_MALI_MIDGARD_ENABLE_TRACE is not set
# CONFIG_MALI_DMA_FENCE is not set
CONFIG_MALI_EXPERT=y
# CONFIG_MALI_CORESTACK is not set
# CONFIG_MALI_PRFCNT_SET_SECONDARY is not set
# CONFIG_MALI_PLATFORM_FAKE is not set
# CONFIG_MALI_PLATFORM_DEVICETREE is not set
@ -2470,8 +2501,11 @@ CONFIG_MALI_PLATFORM_THIRDPARTY_NAME="rk"
# CONFIG_MALI_TRACE_TIMELINE is not set
# CONFIG_MALI_SYSTEM_TRACE is not set
# CONFIG_MALI_GPU_MMU_AARCH64 is not set
CONFIG_MALI_PWRSOFT_765=y
# CONFIG_MALI_KUTF is not set
# CONFIG_MALI_BIFROST_FOR_ANDROID is not set
CONFIG_MALI_BIFROST_FOR_LINUX=y
# CONFIG_MALI_BIFROST is not set
# CONFIG_MALI_PWRSOFT_765 is not set
#
# Frame buffer Devices
@ -2568,7 +2602,8 @@ CONFIG_RK_VCODEC=y
#
# ROCKCHIP_MPP
#
# CONFIG_ROCKCHIP_MPP_SERVICE is not set
CONFIG_ROCKCHIP_MPP_SERVICE=y
CONFIG_ROCKCHIP_MPP_DEVICE=y
# CONFIG_VGASTATE is not set
CONFIG_VIDEOMODE_HELPERS=y
CONFIG_HDMI=y
@ -2656,13 +2691,19 @@ CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM=y
# CONFIG_SND_SOC_FSL_ESAI is not set
# CONFIG_SND_SOC_IMX_AUDMUX is not set
CONFIG_SND_SOC_ROCKCHIP=y
# CONFIG_SND_SOC_ROCKCHIP_FORCE_SRAM is not set
CONFIG_SND_SOC_ROCKCHIP_I2S=y
# CONFIG_SND_SOC_ROCKCHIP_I2S_TDM is not set
# CONFIG_SND_SOC_ROCKCHIP_MULTI_DAIS is not set
# CONFIG_SND_SOC_ROCKCHIP_PDM is not set
CONFIG_SND_SOC_ROCKCHIP_SPDIF=y
# CONFIG_SND_SOC_ROCKCHIP_SPDIFRX is not set
# CONFIG_SND_SOC_ROCKCHIP_VAD is not set
# CONFIG_SND_SOC_ROCKCHIP_DA7219 is not set
# CONFIG_SND_SOC_ROCKCHIP_HDMI_ANALOG is not set
# CONFIG_SND_SOC_ROCKCHIP_HDMI_DP is not set
CONFIG_SND_SOC_ROCKCHIP_MAX98090=y
# CONFIG_SND_SOC_ROCKCHIP_MULTICODECS is not set
CONFIG_SND_SOC_ROCKCHIP_RT5645=y
# CONFIG_SND_SOC_ROCKCHIP_RT5651_TC358749 is not set
# CONFIG_SND_SOC_ROCKCHIP_CDNDP is not set
@ -2698,6 +2739,7 @@ CONFIG_SND_SOC_I2C_AND_SPI=y
# CONFIG_SND_SOC_CS4349 is not set
# CONFIG_SND_SOC_CX2072X is not set
# CONFIG_SND_SOC_CX20810 is not set
# CONFIG_SND_SOC_DUMMY_CODEC is not set
# CONFIG_SND_SOC_BT_SCO is not set
# CONFIG_SND_SOC_ES8316 is not set
CONFIG_SND_SOC_ES8323=y
@ -2715,6 +2757,7 @@ CONFIG_SND_SOC_MAX98090=y
# CONFIG_SND_SOC_PCM512x_SPI is not set
# CONFIG_SND_SOC_RK312X is not set
# CONFIG_SND_SOC_RK3228 is not set
# CONFIG_SND_SOC_RK3308 is not set
# CONFIG_SND_SOC_RK3328 is not set
# CONFIG_SND_SOC_RK817 is not set
CONFIG_SND_SOC_RL6231=y
@ -3061,7 +3104,6 @@ CONFIG_USB_EZUSB_FX2=y
# CONFIG_USB_PHY is not set
# CONFIG_USB_OTG_WAKELOCK is not set
# CONFIG_NOP_USB_XCEIV is not set
# CONFIG_AM335X_PHY_USB is not set
# CONFIG_USB_GPIO_VBUS is not set
# CONFIG_USB_ISP1301 is not set
# CONFIG_USB_ULPI is not set
@ -3255,6 +3297,7 @@ CONFIG_RTC_INTF_DEV=y
# CONFIG_RTC_DRV_DS1374 is not set
# CONFIG_RTC_DRV_DS1672 is not set
# CONFIG_RTC_DRV_DS3232 is not set
# CONFIG_RTC_DRV_FAKE is not set
CONFIG_RTC_DRV_HYM8563=y
# CONFIG_RTC_DRV_MAX6900 is not set
CONFIG_RTC_DRV_RK808=y
@ -3518,15 +3561,11 @@ CONFIG_COMMON_CLK_RK808=y
#
CONFIG_CLKSRC_OF=y
CONFIG_CLKSRC_PROBE=y
CONFIG_DW_APB_TIMER=y
CONFIG_DW_APB_TIMER_OF=y
CONFIG_ROCKCHIP_TIMER=y
CONFIG_ARM_ARCH_TIMER=y
CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y
CONFIG_ARM_ARCH_TIMER_VCT_ACCESS=y
CONFIG_ARM_GLOBAL_TIMER=y
# CONFIG_ARM_TIMER_SP804 is not set
CONFIG_CLKSRC_ARM_GLOBAL_TIMER_SCHED_CLOCK=y
# CONFIG_ATMEL_PIT is not set
# CONFIG_SH_TIMER_CMT is not set
# CONFIG_SH_TIMER_MTU2 is not set
@ -3560,13 +3599,31 @@ CONFIG_ROCKCHIP_IOMMU=y
# SOC (System On Chip) specific Drivers
#
# CONFIG_SOC_BRCMSTB is not set
#
# CPU selection
#
# CONFIG_CPU_RK312X is not set
# CONFIG_CPU_RK3036 is not set
# CONFIG_CPU_RK30XX is not set
# CONFIG_CPU_RK3188 is not set
CONFIG_CPU_RK3288=y
# CONFIG_CPU_RK322X is not set
# CONFIG_CPU_RV110X is not set
# CONFIG_CPU_PX30 is not set
# CONFIG_CPU_RK3308 is not set
# CONFIG_CPU_RK3328 is not set
# CONFIG_CPU_RK3366 is not set
# CONFIG_CPU_RK3368 is not set
# CONFIG_CPU_RK3399 is not set
CONFIG_ANDROID_VERSION=0x07010000
CONFIG_ROCKCHIP_CPUINFO=y
# CONFIG_ROCKCHIP_DEVICEINFO is not set
# CONFIG_ROCKCHIP_PM_TEST is not set
CONFIG_ROCKCHIP_GRF=y
CONFIG_ROCKCHIP_PM_DOMAINS=y
# CONFIG_ROCKCHIP_PVTM is not set
CONFIG_ROCKCHIP_PVTM=y
CONFIG_ROCKCHIP_SUSPEND_MODE=y
# CONFIG_SUNXI_SRAM is not set
# CONFIG_SOC_TI is not set
CONFIG_PM_DEVFREQ=y
@ -3582,6 +3639,7 @@ CONFIG_DEVFREQ_GOV_USERSPACE=y
#
# DEVFREQ Drivers
#
CONFIG_ARM_ROCKCHIP_BUS_DEVFREQ=y
CONFIG_ARM_ROCKCHIP_DMC_DEVFREQ=y
CONFIG_PM_DEVFREQ_EVENT=y
CONFIG_DEVFREQ_EVENT_ROCKCHIP_DFI=y
@ -3745,6 +3803,7 @@ CONFIG_SENSORS_TSL2563=y
# CONFIG_TSL4531 is not set
# CONFIG_US5182D is not set
# CONFIG_VCNL4000 is not set
# CONFIG_VL6180 is not set
#
# Magnetometer sensors
@ -3804,8 +3863,10 @@ CONFIG_PWM=y
CONFIG_PWM_SYSFS=y
# CONFIG_PWM_CROS_EC is not set
# CONFIG_PWM_FSL_FTM is not set
CONFIG_PWM_GPIO=y
# CONFIG_PWM_PCA9685 is not set
CONFIG_PWM_ROCKCHIP=y
# CONFIG_PWM_ROCKCHIP_I2S is not set
CONFIG_IRQCHIP=y
CONFIG_ARM_GIC=y
# CONFIG_IPACK_BUS is not set
@ -3824,7 +3885,7 @@ CONFIG_GENERIC_PHY=y
CONFIG_PHY_ROCKCHIP_USB=y
# CONFIG_PHY_ROCKCHIP_INNO_USB2 is not set
# CONFIG_PHY_ROCKCHIP_INNO_USB3 is not set
# CONFIG_PHY_ROCKCHIP_EMMC is not set
CONFIG_PHY_ROCKCHIP_EMMC=y
CONFIG_PHY_ROCKCHIP_DP=y
# CONFIG_PHY_ROCKCHIP_INNO_MIPI_DPHY is not set
# CONFIG_PHY_ROCKCHIP_INNO_HDMI_PHY is not set
@ -3846,6 +3907,7 @@ CONFIG_ANDROID=y
# CONFIG_ANDROID_BINDER_IPC is not set
CONFIG_NVMEM=y
CONFIG_ROCKCHIP_EFUSE=y
CONFIG_ROCKCHIP_OTP=y
# CONFIG_STM is not set
# CONFIG_INTEL_TH is not set
@ -3854,6 +3916,7 @@ CONFIG_ROCKCHIP_EFUSE=y
#
# CONFIG_FPGA is not set
# CONFIG_TEE is not set
# CONFIG_RK_FLASH is not set
# CONFIG_RK_NAND is not set
#
@ -3866,7 +3929,7 @@ CONFIG_ROCKCHIP_EFUSE=y
#
# CONFIG_FIRMWARE_MEMMAP is not set
CONFIG_HAVE_ARM_SMCCC=y
# CONFIG_ROCKCHIP_SIP is not set
CONFIG_ROCKCHIP_SIP=y
#
# File systems
@ -3964,6 +4027,7 @@ CONFIG_PROC_FS=y
CONFIG_PROC_SYSCTL=y
CONFIG_PROC_PAGE_MONITOR=y
# CONFIG_PROC_CHILDREN is not set
CONFIG_PROC_UID=y
CONFIG_KERNFS=y
CONFIG_SYSFS=y
CONFIG_TMPFS=y
@ -3993,6 +4057,7 @@ CONFIG_SQUASHFS_ZLIB=y
CONFIG_SQUASHFS_LZ4=y
CONFIG_SQUASHFS_LZO=y
CONFIG_SQUASHFS_XZ=y
CONFIG_SQUASHFS_ZSTD=y
# CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set
# CONFIG_SQUASHFS_EMBEDDED is not set
CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
@ -4415,6 +4480,7 @@ CONFIG_CRYPTO_DES=y
# CONFIG_CRYPTO_CHACHA20 is not set
# CONFIG_CRYPTO_SEED is not set
# CONFIG_CRYPTO_SERPENT is not set
# CONFIG_CRYPTO_SPECK is not set
# CONFIG_CRYPTO_TEA is not set
CONFIG_CRYPTO_TWOFISH=y
CONFIG_CRYPTO_TWOFISH_COMMON=y
@ -4446,6 +4512,7 @@ CONFIG_CRYPTO_USER_API_SKCIPHER=y
# CONFIG_CRYPTO_USER_API_AEAD is not set
CONFIG_CRYPTO_HASH_INFO=y
CONFIG_CRYPTO_HW=y
# CONFIG_CRYPTO_DEV_ROCKCHIP is not set
CONFIG_ASYMMETRIC_KEY_TYPE=y
CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y
CONFIG_PUBLIC_KEY_ALGO_RSA=y
@ -4487,13 +4554,16 @@ CONFIG_CRC32_SLICEBY8=y
CONFIG_CRC7=y
CONFIG_LIBCRC32C=y
# CONFIG_CRC8 is not set
CONFIG_XXHASH=y
# CONFIG_AUDIT_ARCH_COMPAT_GENERIC is not set
# CONFIG_RANDOM32_SELFTEST is not set
CONFIG_ZLIB_INFLATE=y
CONFIG_ZLIB_DEFLATE=m
CONFIG_LZO_COMPRESS=y
CONFIG_LZO_COMPRESS=m
CONFIG_LZO_DECOMPRESS=y
CONFIG_LZ4_COMPRESS=m
CONFIG_LZ4_DECOMPRESS=y
CONFIG_ZSTD_DECOMPRESS=y
CONFIG_XZ_DEC=y
# CONFIG_XZ_DEC_X86 is not set
# CONFIG_XZ_DEC_POWERPC is not set

View File

@ -1,6 +1,6 @@
#
# Automatically generated file; DO NOT EDIT.
# Linux/arm64 4.4.114 Kernel Configuration
# Linux/arm64 4.4.143 Kernel Configuration
#
CONFIG_ARM64=y
CONFIG_64BIT=y
@ -12,8 +12,8 @@ CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=11
CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16
CONFIG_ARM64_PAGE_SHIFT=12
CONFIG_ARM64_CONT_SHIFT=4
CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000
CONFIG_STACKTRACE_SUPPORT=y
CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000
CONFIG_LOCKDEP_SUPPORT=y
CONFIG_TRACE_IRQFLAGS_SUPPORT=y
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
@ -157,6 +157,7 @@ CONFIG_RD_GZIP=y
CONFIG_RD_XZ=y
# CONFIG_RD_LZO is not set
# CONFIG_RD_LZ4 is not set
# CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE is not set
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
CONFIG_SYSCTL=y
CONFIG_ANON_INODES=y
@ -392,6 +393,7 @@ CONFIG_ARM64_ERRATUM_819472=y
# CONFIG_ARM64_ERRATUM_832075 is not set
CONFIG_ARM64_ERRATUM_845719=y
CONFIG_ARM64_ERRATUM_843419=y
# CONFIG_ARM64_ERRATUM_1024718 is not set
# CONFIG_CAVIUM_ERRATUM_22375 is not set
# CONFIG_CAVIUM_ERRATUM_23154 is not set
# CONFIG_CAVIUM_ERRATUM_27456 is not set
@ -434,9 +436,11 @@ CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
CONFIG_SPARSEMEM_VMEMMAP=y
CONFIG_HAVE_MEMBLOCK=y
CONFIG_NO_BOOTMEM=y
CONFIG_MEMORY_ISOLATION=y
# CONFIG_HAVE_BOOTMEM_INFO_NODE is not set
CONFIG_SPLIT_PTLOCK_CPUS=4
# CONFIG_COMPACTION is not set
CONFIG_MIGRATION=y
CONFIG_PHYS_ADDR_T_64BIT=y
CONFIG_ZONE_DMA_FLAG=1
CONFIG_BOUNCE=y
@ -445,11 +449,14 @@ CONFIG_DEFAULT_MMAP_MIN_ADDR=32768
# CONFIG_TRANSPARENT_HUGEPAGE is not set
# CONFIG_CLEANCACHE is not set
# CONFIG_FRONTSWAP is not set
# CONFIG_CMA is not set
CONFIG_CMA=y
# CONFIG_CMA_DEBUG is not set
CONFIG_CMA_DEBUGFS=y
CONFIG_CMA_AREAS=7
# CONFIG_ZPOOL is not set
# CONFIG_ZBUD is not set
CONFIG_ZSMALLOC=y
# CONFIG_PGTABLE_MAPPING is not set
CONFIG_ZSMALLOC=m
CONFIG_PGTABLE_MAPPING=y
# CONFIG_ZSMALLOC_STAT is not set
CONFIG_GENERIC_EARLY_IOREMAP=y
# CONFIG_IDLE_PAGE_TRACKING is not set
@ -475,7 +482,7 @@ CONFIG_ARM64_MODULE_CMODEL_LARGE=y
#
# Boot options
#
CONFIG_CMDLINE="root=/dev/ram0 rdinit=/init usbcore.autosuspend=-1"
CONFIG_CMDLINE="usbcore.autosuspend=-1"
# CONFIG_CMDLINE_FROM_BOOTLOADER is not set
CONFIG_CMDLINE_EXTEND=y
# CONFIG_CMDLINE_FORCE is not set
@ -549,13 +556,13 @@ CONFIG_CPU_FREQ=y
CONFIG_CPU_FREQ_GOV_COMMON=y
CONFIG_CPU_FREQ_STAT=y
# CONFIG_CPU_FREQ_STAT_DETAILS is not set
CONFIG_CPU_FREQ_TIMES=y
CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_INTERACTIVE is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_SCHED is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL is not set
CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
CONFIG_CPU_FREQ_GOV_POWERSAVE=y
@ -934,7 +941,9 @@ CONFIG_RFKILL_GPIO=y
# CONFIG_CEPH_LIB is not set
# CONFIG_NFC is not set
# CONFIG_LWTUNNEL is not set
CONFIG_DST_CACHE=y
CONFIG_HAVE_BPF_JIT=y
CONFIG_HAVE_EBPF_JIT=y
#
# Device Drivers
@ -970,6 +979,17 @@ CONFIG_REGMAP_MMIO=y
CONFIG_REGMAP_IRQ=y
CONFIG_DMA_SHARED_BUFFER=y
# CONFIG_FENCE_TRACE is not set
CONFIG_DMA_CMA=y
#
# Default contiguous memory area size:
#
CONFIG_CMA_SIZE_MBYTES=64
CONFIG_CMA_SIZE_SEL_MBYTES=y
# CONFIG_CMA_SIZE_SEL_PERCENTAGE is not set
# CONFIG_CMA_SIZE_SEL_MIN is not set
# CONFIG_CMA_SIZE_SEL_MAX is not set
CONFIG_CMA_ALIGNMENT=8
#
# Bus devices
@ -1074,8 +1094,8 @@ CONFIG_OF_RESERVED_MEM=y
CONFIG_BLK_DEV=y
# CONFIG_BLK_DEV_NULL_BLK is not set
# CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set
CONFIG_ZRAM=y
# CONFIG_ZRAM_LZ4_COMPRESS is not set
CONFIG_ZRAM=m
CONFIG_ZRAM_LZ4_COMPRESS=y
# CONFIG_BLK_CPQ_CISS_DA is not set
# CONFIG_BLK_DEV_DAC960 is not set
# CONFIG_BLK_DEV_UMEM is not set
@ -1538,6 +1558,7 @@ CONFIG_WL_ROCKCHIP=y
CONFIG_WIFI_BUILD_MODULE=y
# CONFIG_WIFI_LOAD_DRIVER_WHEN_KERNEL_BOOTUP is not set
CONFIG_AP6XXX=m
# CONFIG_CYW_BCMDHD is not set
CONFIG_RTL_WIRELESS_SOLUTION=y
# CONFIG_RTL8188EU is not set
# CONFIG_RTL8188FU is not set
@ -1548,6 +1569,12 @@ CONFIG_RTL8723BS=m
# CONFIG_RTL8723CS is not set
# CONFIG_RTL8723DS is not set
# CONFIG_RTL8822BE is not set
# CONFIG_MVL88W8977 is not set
#
# SouthSV 6XXX WLAN support
#
# CONFIG_SSV6051 is not set
# CONFIG_WL_TI is not set
CONFIG_ZD1211RW=m
# CONFIG_ZD1211RW_DEBUG is not set
@ -1683,6 +1710,7 @@ CONFIG_TOUCHSCREEN_ATMEL_MXT=y
# CONFIG_TOUCHSCREEN_FT6236 is not set
# CONFIG_TOUCHSCREEN_FUJITSU is not set
# CONFIG_TOUCHSCREEN_GOODIX is not set
# CONFIG_TOUCHSCREEN_GSLX680A is not set
# CONFIG_TOUCHSCREEN_GSLX680_D708 is not set
# CONFIG_TOUCHSCREEN_GSLX680_PAD is not set
# CONFIG_TOUCHSCREEN_GSLX680_VR is not set
@ -2026,6 +2054,7 @@ CONFIG_GENERIC_PINCONF=y
# CONFIG_PINCTRL_AMD is not set
CONFIG_PINCTRL_ROCKCHIP=y
# CONFIG_PINCTRL_SINGLE is not set
CONFIG_PINCTRL_RK805=y
CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y
CONFIG_ARCH_REQUIRE_GPIOLIB=y
CONFIG_GPIOLIB=y
@ -2116,6 +2145,7 @@ CONFIG_CHARGER_BQ24735=y
# CONFIG_CHARGER_BQ25890 is not set
# CONFIG_CHARGER_SMB347 is not set
# CONFIG_CHARGER_SY6982C is not set
# CONFIG_CHARGER_UNIVERSAL is not set
# CONFIG_BATTERY_GAUGE_LTC2941 is not set
# CONFIG_BATTERY_EC is not set
# CONFIG_BATTERY_CW2015 is not set
@ -2458,6 +2488,7 @@ CONFIG_REGULATOR_RK808=y
CONFIG_REGULATOR_RK818=y
# CONFIG_REGULATOR_SYR82X is not set
# CONFIG_REGULATOR_TPS51632 is not set
# CONFIG_REGULATOR_TPS549B22 is not set
# CONFIG_REGULATOR_TPS62360 is not set
# CONFIG_REGULATOR_TPS65023 is not set
# CONFIG_REGULATOR_TPS6507X is not set
@ -2501,15 +2532,15 @@ CONFIG_IR_SHARP_DECODER=y
CONFIG_IR_MCE_KBD_DECODER=y
CONFIG_IR_XMP_DECODER=y
CONFIG_RC_DEVICES=y
# CONFIG_RC_ATI_REMOTE is not set
# CONFIG_IR_HIX5HD2 is not set
# CONFIG_IR_IMON is not set
# CONFIG_IR_MCEUSB is not set
# CONFIG_IR_REDRAT3 is not set
# CONFIG_IR_STREAMZAP is not set
# CONFIG_IR_IGORPLUGUSB is not set
# CONFIG_IR_IGUANA is not set
# CONFIG_IR_TTUSBIR is not set
CONFIG_RC_ATI_REMOTE=m
CONFIG_IR_HIX5HD2=m
CONFIG_IR_IMON=m
CONFIG_IR_MCEUSB=m
CONFIG_IR_REDRAT3=m
CONFIG_IR_STREAMZAP=m
CONFIG_IR_IGORPLUGUSB=m
CONFIG_IR_IGUANA=m
CONFIG_IR_TTUSBIR=m
# CONFIG_RC_LOOPBACK is not set
CONFIG_IR_GPIO_CIR=y
CONFIG_MEDIA_USB_SUPPORT=y
@ -2520,6 +2551,7 @@ CONFIG_MEDIA_USB_SUPPORT=y
CONFIG_USB_PULSE8_CEC=y
CONFIG_USB_RAINSHADOW_CEC=y
# CONFIG_MEDIA_PCI_SUPPORT is not set
# CONFIG_ROCKCHIP_TSP is not set
#
# Supported MMC/SDIO adapters
@ -2555,7 +2587,7 @@ CONFIG_DRM_KMS_FB_HELPER=y
CONFIG_DRM_FBDEV_EMULATION=y
# CONFIG_DRM_LOAD_EDID_FIRMWARE is not set
# CONFIG_DRM_SCDC_HELPER is not set
CONFIG_DRM_DMA_SYNC=y
# CONFIG_DRM_DMA_SYNC is not set
#
# I2C encoder or helper chips
@ -2574,6 +2606,7 @@ CONFIG_DRM_DMA_SYNC=y
# CONFIG_DRM_SAVAGE is not set
# CONFIG_DRM_VGEM is not set
CONFIG_DRM_ROCKCHIP=y
# CONFIG_ROCKCHIP_DRM_DEBUG is not set
# CONFIG_ROCKCHIP_CDN_DP is not set
CONFIG_ROCKCHIP_DW_HDMI=y
CONFIG_ROCKCHIP_DW_MIPI_DSI=y
@ -2609,6 +2642,7 @@ CONFIG_DRM_BRIDGE=y
# CONFIG_DRM_PARADE_PS8622 is not set
# CONFIG_DRM_RK1000 is not set
# CONFIG_DRM_DUMB_VGA_DAC is not set
# CONFIG_DRM_LONTIUM_LT8912 is not set
CONFIG_DRM_ANALOGIX_DP=y
CONFIG_DRM_DW_HDMI=y
# CONFIG_DRM_DW_HDMI_AHB_AUDIO is not set
@ -2627,11 +2661,11 @@ CONFIG_MALI_DMA_BUF_MAP_ON_ATTACH=y
CONFIG_MALI_DT=y
CONFIG_MALI_DEVFREQ=y
# CONFIG_MALI_QUIET is not set
CONFIG_MALI_MIDGARD_FOR_ANDROID=y
# CONFIG_MALI_MIDGARD_FOR_LINUX is not set
# CONFIG_MALI_MIDGARD is not set
# CONFIG_MALI_KUTF is not set
# CONFIG_MALI_BIFROST_FOR_ANDROID is not set
CONFIG_MALI_BIFROST_FOR_LINUX=y
# CONFIG_MALI_BIFROST is not set
# CONFIG_MALI_PWRSOFT_765 is not set
#
# Frame buffer Devices
@ -2842,13 +2876,19 @@ CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM=y
# CONFIG_SND_SOC_FSL_ESAI is not set
# CONFIG_SND_SOC_IMX_AUDMUX is not set
CONFIG_SND_SOC_ROCKCHIP=y
# CONFIG_SND_SOC_ROCKCHIP_FORCE_SRAM is not set
CONFIG_SND_SOC_ROCKCHIP_I2S=y
# CONFIG_SND_SOC_ROCKCHIP_I2S_TDM is not set
# CONFIG_SND_SOC_ROCKCHIP_MULTI_DAIS is not set
# CONFIG_SND_SOC_ROCKCHIP_PDM is not set
CONFIG_SND_SOC_ROCKCHIP_SPDIF=y
# CONFIG_SND_SOC_ROCKCHIP_SPDIFRX is not set
# CONFIG_SND_SOC_ROCKCHIP_VAD is not set
# CONFIG_SND_SOC_ROCKCHIP_DA7219 is not set
# CONFIG_SND_SOC_ROCKCHIP_HDMI_ANALOG is not set
# CONFIG_SND_SOC_ROCKCHIP_HDMI_DP is not set
CONFIG_SND_SOC_ROCKCHIP_MAX98090=y
# CONFIG_SND_SOC_ROCKCHIP_MULTICODECS is not set
CONFIG_SND_SOC_ROCKCHIP_RT5645=y
# CONFIG_SND_SOC_ROCKCHIP_RT5651_TC358749 is not set
# CONFIG_SND_SOC_ROCKCHIP_CDNDP is not set
@ -2884,6 +2924,7 @@ CONFIG_SND_SOC_I2C_AND_SPI=y
# CONFIG_SND_SOC_CS4349 is not set
# CONFIG_SND_SOC_CX2072X is not set
# CONFIG_SND_SOC_CX20810 is not set
# CONFIG_SND_SOC_DUMMY_CODEC is not set
# CONFIG_SND_SOC_BT_SCO is not set
CONFIG_SND_SOC_ES8316=y
# CONFIG_SND_SOC_ES8323 is not set
@ -2901,6 +2942,7 @@ CONFIG_SND_SOC_MAX98090=y
# CONFIG_SND_SOC_PCM512x_SPI is not set
# CONFIG_SND_SOC_RK312X is not set
# CONFIG_SND_SOC_RK3228 is not set
# CONFIG_SND_SOC_RK3308 is not set
CONFIG_SND_SOC_RK3328=y
# CONFIG_SND_SOC_RK817 is not set
CONFIG_SND_SOC_RL6231=y
@ -3471,6 +3513,7 @@ CONFIG_RTC_INTF_DEV=y
# CONFIG_RTC_DRV_DS1374 is not set
# CONFIG_RTC_DRV_DS1672 is not set
# CONFIG_RTC_DRV_DS3232 is not set
# CONFIG_RTC_DRV_FAKE is not set
CONFIG_RTC_DRV_HYM8563=y
# CONFIG_RTC_DRV_MAX6900 is not set
CONFIG_RTC_DRV_RK808=y
@ -3694,6 +3737,7 @@ CONFIG_TSL2583=y
# CONFIG_ANDROID_TIMED_OUTPUT is not set
# CONFIG_ANDROID_LOW_MEMORY_KILLER is not set
# CONFIG_SYNC is not set
# CONFIG_ANDROID_VSOC is not set
# CONFIG_ION is not set
# CONFIG_FIQ_DEBUGGER is not set
# CONFIG_FIQ_WATCHDOG is not set
@ -3729,7 +3773,7 @@ CONFIG_COMMON_CLK_RK808=y
# CONFIG_COMMON_CLK_SI570 is not set
# CONFIG_COMMON_CLK_CDCE925 is not set
# CONFIG_CLK_QORIQ is not set
CONFIG_COMMON_CLK_XGENE=y
# CONFIG_COMMON_CLK_XGENE is not set
# CONFIG_COMMON_CLK_PWM is not set
# CONFIG_COMMON_CLK_PXA is not set
# CONFIG_COMMON_CLK_CDCE706 is not set
@ -3746,7 +3790,7 @@ CONFIG_CLKSRC_PROBE=y
CONFIG_ROCKCHIP_TIMER=y
CONFIG_ARM_ARCH_TIMER=y
CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y
# CONFIG_ARM_ARCH_TIMER_VCT_ACCESS is not set
CONFIG_ARM_ARCH_TIMER_VCT_ACCESS=y
# CONFIG_ARM_TIMER_SP804 is not set
# CONFIG_ATMEL_PIT is not set
# CONFIG_SH_TIMER_CMT is not set
@ -3786,13 +3830,23 @@ CONFIG_ROCKCHIP_IOMMU=y
#
# SOC (System On Chip) specific Drivers
#
#
# CPU selection
#
# CONFIG_CPU_PX30 is not set
# CONFIG_CPU_RK3308 is not set
CONFIG_CPU_RK3328=y
# CONFIG_CPU_RK3366 is not set
# CONFIG_CPU_RK3368 is not set
# CONFIG_CPU_RK3399 is not set
CONFIG_ANDROID_VERSION=0x07010000
CONFIG_ROCKCHIP_CPUINFO=y
# CONFIG_ROCKCHIP_DEVICEINFO is not set
# CONFIG_ROCKCHIP_PM_TEST is not set
CONFIG_ROCKCHIP_GRF=y
CONFIG_ROCKCHIP_PM_DOMAINS=y
# CONFIG_ROCKCHIP_PVTM is not set
CONFIG_ROCKCHIP_PVTM=y
CONFIG_ROCKCHIP_SUSPEND_MODE=y
# CONFIG_SUNXI_SRAM is not set
# CONFIG_SOC_TI is not set
@ -3809,6 +3863,7 @@ CONFIG_DEVFREQ_GOV_USERSPACE=y
#
# DEVFREQ Drivers
#
CONFIG_ARM_ROCKCHIP_BUS_DEVFREQ=y
CONFIG_ARM_ROCKCHIP_DMC_DEVFREQ=y
CONFIG_PM_DEVFREQ_EVENT=y
CONFIG_DEVFREQ_EVENT_ROCKCHIP_DFI=y
@ -3981,6 +4036,7 @@ CONFIG_SENSORS_TSL2563=y
# CONFIG_TSL4531 is not set
# CONFIG_US5182D is not set
# CONFIG_VCNL4000 is not set
# CONFIG_VL6180 is not set
#
# Magnetometer sensors
@ -4042,8 +4098,10 @@ CONFIG_PWM=y
CONFIG_PWM_SYSFS=y
# CONFIG_PWM_CROS_EC is not set
# CONFIG_PWM_FSL_FTM is not set
CONFIG_PWM_GPIO=y
# CONFIG_PWM_PCA9685 is not set
CONFIG_PWM_ROCKCHIP=y
# CONFIG_PWM_ROCKCHIP_I2S is not set
CONFIG_IRQCHIP=y
CONFIG_ARM_GIC=y
CONFIG_ARM_GIC_V2M=y
@ -4091,6 +4149,7 @@ CONFIG_ANDROID=y
# CONFIG_LIBNVDIMM is not set
CONFIG_NVMEM=y
CONFIG_ROCKCHIP_EFUSE=y
CONFIG_ROCKCHIP_OTP=y
# CONFIG_STM is not set
# CONFIG_INTEL_TH is not set
@ -4099,6 +4158,7 @@ CONFIG_ROCKCHIP_EFUSE=y
#
# CONFIG_FPGA is not set
# CONFIG_TEE is not set
# CONFIG_RK_FLASH is not set
# CONFIG_RK_NAND is not set
#
@ -4213,6 +4273,7 @@ CONFIG_PROC_FS=y
CONFIG_PROC_SYSCTL=y
CONFIG_PROC_PAGE_MONITOR=y
# CONFIG_PROC_CHILDREN is not set
CONFIG_PROC_UID=y
CONFIG_KERNFS=y
CONFIG_SYSFS=y
CONFIG_TMPFS=y
@ -4244,6 +4305,7 @@ CONFIG_SQUASHFS_ZLIB=y
CONFIG_SQUASHFS_LZ4=y
CONFIG_SQUASHFS_LZO=y
CONFIG_SQUASHFS_XZ=y
CONFIG_SQUASHFS_ZSTD=y
# CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set
# CONFIG_SQUASHFS_EMBEDDED is not set
CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
@ -4665,6 +4727,7 @@ CONFIG_CRYPTO_DES=y
# CONFIG_CRYPTO_CHACHA20 is not set
# CONFIG_CRYPTO_SEED is not set
# CONFIG_CRYPTO_SERPENT is not set
# CONFIG_CRYPTO_SPECK is not set
# CONFIG_CRYPTO_TEA is not set
CONFIG_CRYPTO_TWOFISH=y
CONFIG_CRYPTO_TWOFISH_COMMON=y
@ -4697,6 +4760,7 @@ CONFIG_CRYPTO_USER_API_SKCIPHER=y
CONFIG_CRYPTO_HASH_INFO=y
CONFIG_CRYPTO_HW=y
# CONFIG_CRYPTO_DEV_CCP is not set
# CONFIG_CRYPTO_DEV_ROCKCHIP is not set
CONFIG_ASYMMETRIC_KEY_TYPE=y
CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y
CONFIG_PUBLIC_KEY_ALGO_RSA=y
@ -4719,6 +4783,7 @@ CONFIG_CRYPTO_AES_ARM64_CE_CCM=y
CONFIG_CRYPTO_AES_ARM64_CE_BLK=y
# CONFIG_CRYPTO_AES_ARM64_NEON_BLK is not set
# CONFIG_CRYPTO_CRC32_ARM64 is not set
# CONFIG_CRYPTO_SPECK_NEON is not set
CONFIG_BINARY_PRINTF=y
#
@ -4747,13 +4812,16 @@ CONFIG_CRC32_SLICEBY8=y
CONFIG_CRC7=y
CONFIG_LIBCRC32C=y
# CONFIG_CRC8 is not set
CONFIG_XXHASH=y
CONFIG_AUDIT_ARCH_COMPAT_GENERIC=y
# CONFIG_RANDOM32_SELFTEST is not set
CONFIG_ZLIB_INFLATE=y
CONFIG_ZLIB_DEFLATE=m
CONFIG_LZO_COMPRESS=y
CONFIG_LZO_COMPRESS=m
CONFIG_LZO_DECOMPRESS=y
CONFIG_LZ4_COMPRESS=m
CONFIG_LZ4_DECOMPRESS=y
CONFIG_ZSTD_DECOMPRESS=y
CONFIG_XZ_DEC=y
# CONFIG_XZ_DEC_X86 is not set
# CONFIG_XZ_DEC_POWERPC is not set

View File

@ -4,7 +4,6 @@ This is a SoC device for RK3399
**Build**
* `PROJECT=Rockchip DEVICE=RK3399 ARCH=arm UBOOT_SYSTEM=odroidn1 make image`
* `PROJECT=Rockchip DEVICE=RK3399 ARCH=arm UBOOT_SYSTEM=rock960 make image`
* `PROJECT=Rockchip DEVICE=RK3399 ARCH=arm UBOOT_SYSTEM=rockpro64 make image`
* `PROJECT=Rockchip DEVICE=RK3399 ARCH=arm UBOOT_SYSTEM=sapphire make image`

View File

@ -1,6 +1,6 @@
#
# Automatically generated file; DO NOT EDIT.
# Linux/arm64 4.4.114 Kernel Configuration
# Linux/arm64 4.4.143 Kernel Configuration
#
CONFIG_ARM64=y
CONFIG_64BIT=y
@ -12,8 +12,8 @@ CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=11
CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16
CONFIG_ARM64_PAGE_SHIFT=12
CONFIG_ARM64_CONT_SHIFT=4
CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000
CONFIG_STACKTRACE_SUPPORT=y
CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000
CONFIG_LOCKDEP_SUPPORT=y
CONFIG_TRACE_IRQFLAGS_SUPPORT=y
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
@ -157,6 +157,7 @@ CONFIG_RD_GZIP=y
CONFIG_RD_XZ=y
# CONFIG_RD_LZO is not set
# CONFIG_RD_LZ4 is not set
# CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE is not set
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
CONFIG_SYSCTL=y
CONFIG_ANON_INODES=y
@ -392,6 +393,7 @@ CONFIG_ARM64_ERRATUM_819472=y
# CONFIG_ARM64_ERRATUM_832075 is not set
CONFIG_ARM64_ERRATUM_845719=y
CONFIG_ARM64_ERRATUM_843419=y
# CONFIG_ARM64_ERRATUM_1024718 is not set
# CONFIG_CAVIUM_ERRATUM_22375 is not set
# CONFIG_CAVIUM_ERRATUM_23154 is not set
# CONFIG_CAVIUM_ERRATUM_27456 is not set
@ -434,9 +436,11 @@ CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
CONFIG_SPARSEMEM_VMEMMAP=y
CONFIG_HAVE_MEMBLOCK=y
CONFIG_NO_BOOTMEM=y
CONFIG_MEMORY_ISOLATION=y
# CONFIG_HAVE_BOOTMEM_INFO_NODE is not set
CONFIG_SPLIT_PTLOCK_CPUS=4
# CONFIG_COMPACTION is not set
CONFIG_MIGRATION=y
CONFIG_PHYS_ADDR_T_64BIT=y
CONFIG_ZONE_DMA_FLAG=1
CONFIG_BOUNCE=y
@ -445,11 +449,14 @@ CONFIG_DEFAULT_MMAP_MIN_ADDR=32768
# CONFIG_TRANSPARENT_HUGEPAGE is not set
# CONFIG_CLEANCACHE is not set
# CONFIG_FRONTSWAP is not set
# CONFIG_CMA is not set
CONFIG_CMA=y
# CONFIG_CMA_DEBUG is not set
CONFIG_CMA_DEBUGFS=y
CONFIG_CMA_AREAS=7
# CONFIG_ZPOOL is not set
# CONFIG_ZBUD is not set
CONFIG_ZSMALLOC=y
# CONFIG_PGTABLE_MAPPING is not set
CONFIG_ZSMALLOC=m
CONFIG_PGTABLE_MAPPING=y
# CONFIG_ZSMALLOC_STAT is not set
CONFIG_GENERIC_EARLY_IOREMAP=y
# CONFIG_IDLE_PAGE_TRACKING is not set
@ -475,7 +482,7 @@ CONFIG_ARM64_MODULE_CMODEL_LARGE=y
#
# Boot options
#
CONFIG_CMDLINE="root=/dev/ram0 rdinit=/init usbcore.autosuspend=-1"
CONFIG_CMDLINE="usbcore.autosuspend=-1"
# CONFIG_CMDLINE_FROM_BOOTLOADER is not set
CONFIG_CMDLINE_EXTEND=y
# CONFIG_CMDLINE_FORCE is not set
@ -549,13 +556,13 @@ CONFIG_CPU_FREQ=y
CONFIG_CPU_FREQ_GOV_COMMON=y
CONFIG_CPU_FREQ_STAT=y
# CONFIG_CPU_FREQ_STAT_DETAILS is not set
CONFIG_CPU_FREQ_TIMES=y
# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_INTERACTIVE is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_SCHED is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL is not set
CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
CONFIG_CPU_FREQ_GOV_POWERSAVE=y
@ -934,7 +941,9 @@ CONFIG_RFKILL_GPIO=y
# CONFIG_CEPH_LIB is not set
# CONFIG_NFC is not set
# CONFIG_LWTUNNEL is not set
CONFIG_DST_CACHE=y
CONFIG_HAVE_BPF_JIT=y
CONFIG_HAVE_EBPF_JIT=y
#
# Device Drivers
@ -970,6 +979,17 @@ CONFIG_REGMAP_MMIO=y
CONFIG_REGMAP_IRQ=y
CONFIG_DMA_SHARED_BUFFER=y
# CONFIG_FENCE_TRACE is not set
CONFIG_DMA_CMA=y
#
# Default contiguous memory area size:
#
CONFIG_CMA_SIZE_MBYTES=64
CONFIG_CMA_SIZE_SEL_MBYTES=y
# CONFIG_CMA_SIZE_SEL_PERCENTAGE is not set
# CONFIG_CMA_SIZE_SEL_MIN is not set
# CONFIG_CMA_SIZE_SEL_MAX is not set
CONFIG_CMA_ALIGNMENT=8
#
# Bus devices
@ -1074,8 +1094,8 @@ CONFIG_OF_RESERVED_MEM=y
CONFIG_BLK_DEV=y
# CONFIG_BLK_DEV_NULL_BLK is not set
# CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set
CONFIG_ZRAM=y
# CONFIG_ZRAM_LZ4_COMPRESS is not set
CONFIG_ZRAM=m
CONFIG_ZRAM_LZ4_COMPRESS=y
# CONFIG_BLK_CPQ_CISS_DA is not set
# CONFIG_BLK_DEV_DAC960 is not set
# CONFIG_BLK_DEV_UMEM is not set
@ -1538,6 +1558,7 @@ CONFIG_WL_ROCKCHIP=y
CONFIG_WIFI_BUILD_MODULE=y
# CONFIG_WIFI_LOAD_DRIVER_WHEN_KERNEL_BOOTUP is not set
CONFIG_AP6XXX=m
# CONFIG_CYW_BCMDHD is not set
CONFIG_RTL_WIRELESS_SOLUTION=y
# CONFIG_RTL8188EU is not set
# CONFIG_RTL8188FU is not set
@ -1548,6 +1569,12 @@ CONFIG_RTL8723BS=m
# CONFIG_RTL8723CS is not set
# CONFIG_RTL8723DS is not set
# CONFIG_RTL8822BE is not set
# CONFIG_MVL88W8977 is not set
#
# SouthSV 6XXX WLAN support
#
# CONFIG_SSV6051 is not set
# CONFIG_WL_TI is not set
CONFIG_ZD1211RW=m
# CONFIG_ZD1211RW_DEBUG is not set
@ -1683,6 +1710,7 @@ CONFIG_TOUCHSCREEN_ATMEL_MXT=y
# CONFIG_TOUCHSCREEN_FT6236 is not set
# CONFIG_TOUCHSCREEN_FUJITSU is not set
# CONFIG_TOUCHSCREEN_GOODIX is not set
# CONFIG_TOUCHSCREEN_GSLX680A is not set
# CONFIG_TOUCHSCREEN_GSLX680_D708 is not set
# CONFIG_TOUCHSCREEN_GSLX680_PAD is not set
# CONFIG_TOUCHSCREEN_GSLX680_VR is not set
@ -2026,6 +2054,7 @@ CONFIG_GENERIC_PINCONF=y
# CONFIG_PINCTRL_AMD is not set
CONFIG_PINCTRL_ROCKCHIP=y
# CONFIG_PINCTRL_SINGLE is not set
# CONFIG_PINCTRL_RK805 is not set
CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y
CONFIG_ARCH_REQUIRE_GPIOLIB=y
CONFIG_GPIOLIB=y
@ -2116,6 +2145,7 @@ CONFIG_CHARGER_BQ24735=y
# CONFIG_CHARGER_BQ25890 is not set
# CONFIG_CHARGER_SMB347 is not set
# CONFIG_CHARGER_SY6982C is not set
# CONFIG_CHARGER_UNIVERSAL is not set
# CONFIG_BATTERY_GAUGE_LTC2941 is not set
# CONFIG_BATTERY_EC is not set
# CONFIG_BATTERY_CW2015 is not set
@ -2458,6 +2488,7 @@ CONFIG_REGULATOR_RK808=y
CONFIG_REGULATOR_RK818=y
# CONFIG_REGULATOR_SYR82X is not set
# CONFIG_REGULATOR_TPS51632 is not set
# CONFIG_REGULATOR_TPS549B22 is not set
# CONFIG_REGULATOR_TPS62360 is not set
# CONFIG_REGULATOR_TPS65023 is not set
# CONFIG_REGULATOR_TPS6507X is not set
@ -2501,15 +2532,15 @@ CONFIG_IR_SHARP_DECODER=y
CONFIG_IR_MCE_KBD_DECODER=y
CONFIG_IR_XMP_DECODER=y
CONFIG_RC_DEVICES=y
# CONFIG_RC_ATI_REMOTE is not set
# CONFIG_IR_HIX5HD2 is not set
# CONFIG_IR_IMON is not set
# CONFIG_IR_MCEUSB is not set
# CONFIG_IR_REDRAT3 is not set
# CONFIG_IR_STREAMZAP is not set
# CONFIG_IR_IGORPLUGUSB is not set
# CONFIG_IR_IGUANA is not set
# CONFIG_IR_TTUSBIR is not set
CONFIG_RC_ATI_REMOTE=m
CONFIG_IR_HIX5HD2=m
CONFIG_IR_IMON=m
CONFIG_IR_MCEUSB=m
CONFIG_IR_REDRAT3=m
CONFIG_IR_STREAMZAP=m
CONFIG_IR_IGORPLUGUSB=m
CONFIG_IR_IGUANA=m
CONFIG_IR_TTUSBIR=m
# CONFIG_RC_LOOPBACK is not set
CONFIG_IR_GPIO_CIR=y
CONFIG_MEDIA_USB_SUPPORT=y
@ -2520,6 +2551,7 @@ CONFIG_MEDIA_USB_SUPPORT=y
CONFIG_USB_PULSE8_CEC=y
CONFIG_USB_RAINSHADOW_CEC=y
# CONFIG_MEDIA_PCI_SUPPORT is not set
# CONFIG_ROCKCHIP_TSP is not set
#
# Supported MMC/SDIO adapters
@ -2555,7 +2587,7 @@ CONFIG_DRM_KMS_FB_HELPER=y
CONFIG_DRM_FBDEV_EMULATION=y
# CONFIG_DRM_LOAD_EDID_FIRMWARE is not set
# CONFIG_DRM_SCDC_HELPER is not set
CONFIG_DRM_DMA_SYNC=y
# CONFIG_DRM_DMA_SYNC is not set
#
# I2C encoder or helper chips
@ -2574,7 +2606,8 @@ CONFIG_DRM_DMA_SYNC=y
# CONFIG_DRM_SAVAGE is not set
# CONFIG_DRM_VGEM is not set
CONFIG_DRM_ROCKCHIP=y
# CONFIG_ROCKCHIP_CDN_DP is not set
# CONFIG_ROCKCHIP_DRM_DEBUG is not set
CONFIG_ROCKCHIP_CDN_DP=y
CONFIG_ROCKCHIP_DW_HDMI=y
CONFIG_ROCKCHIP_DW_MIPI_DSI=y
CONFIG_ROCKCHIP_ANALOGIX_DP=y
@ -2609,6 +2642,7 @@ CONFIG_DRM_BRIDGE=y
# CONFIG_DRM_PARADE_PS8622 is not set
# CONFIG_DRM_RK1000 is not set
# CONFIG_DRM_DUMB_VGA_DAC is not set
# CONFIG_DRM_LONTIUM_LT8912 is not set
CONFIG_DRM_ANALOGIX_DP=y
CONFIG_DRM_DW_HDMI=y
# CONFIG_DRM_DW_HDMI_AHB_AUDIO is not set
@ -2617,13 +2651,12 @@ CONFIG_DRM_DW_HDMI_CEC=y
# CONFIG_POWERVR_ROGUE_M is not set
# CONFIG_MALI400 is not set
CONFIG_MALI_DEVFREQ=y
CONFIG_MALI_MIDGARD_FOR_ANDROID=y
# CONFIG_MALI_MIDGARD_FOR_LINUX is not set
CONFIG_MALI_MIDGARD=m
# CONFIG_MALI_GATOR_SUPPORT is not set
# CONFIG_MALI_MIDGARD_ENABLE_TRACE is not set
# CONFIG_MALI_DMA_FENCE is not set
CONFIG_MALI_EXPERT=y
# CONFIG_MALI_CORESTACK is not set
# CONFIG_MALI_PRFCNT_SET_SECONDARY is not set
# CONFIG_MALI_PLATFORM_FAKE is not set
# CONFIG_MALI_PLATFORM_DEVICETREE is not set
@ -2634,8 +2667,11 @@ CONFIG_MALI_PLATFORM_THIRDPARTY_NAME="rk"
# CONFIG_MALI_TRACE_TIMELINE is not set
# CONFIG_MALI_SYSTEM_TRACE is not set
# CONFIG_MALI_GPU_MMU_AARCH64 is not set
CONFIG_MALI_PWRSOFT_765=y
# CONFIG_MALI_KUTF is not set
# CONFIG_MALI_BIFROST_FOR_ANDROID is not set
CONFIG_MALI_BIFROST_FOR_LINUX=y
# CONFIG_MALI_BIFROST is not set
# CONFIG_MALI_PWRSOFT_765 is not set
#
# Frame buffer Devices
@ -2846,13 +2882,19 @@ CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM=y
# CONFIG_SND_SOC_FSL_ESAI is not set
# CONFIG_SND_SOC_IMX_AUDMUX is not set
CONFIG_SND_SOC_ROCKCHIP=y
# CONFIG_SND_SOC_ROCKCHIP_FORCE_SRAM is not set
CONFIG_SND_SOC_ROCKCHIP_I2S=y
# CONFIG_SND_SOC_ROCKCHIP_I2S_TDM is not set
# CONFIG_SND_SOC_ROCKCHIP_MULTI_DAIS is not set
# CONFIG_SND_SOC_ROCKCHIP_PDM is not set
CONFIG_SND_SOC_ROCKCHIP_SPDIF=y
# CONFIG_SND_SOC_ROCKCHIP_SPDIFRX is not set
# CONFIG_SND_SOC_ROCKCHIP_VAD is not set
# CONFIG_SND_SOC_ROCKCHIP_DA7219 is not set
# CONFIG_SND_SOC_ROCKCHIP_HDMI_ANALOG is not set
# CONFIG_SND_SOC_ROCKCHIP_HDMI_DP is not set
CONFIG_SND_SOC_ROCKCHIP_MAX98090=y
# CONFIG_SND_SOC_ROCKCHIP_MULTICODECS is not set
CONFIG_SND_SOC_ROCKCHIP_RT5645=y
# CONFIG_SND_SOC_ROCKCHIP_RT5651_TC358749 is not set
# CONFIG_SND_SOC_ROCKCHIP_CDNDP is not set
@ -2888,6 +2930,7 @@ CONFIG_SND_SOC_I2C_AND_SPI=y
# CONFIG_SND_SOC_CS4349 is not set
# CONFIG_SND_SOC_CX2072X is not set
# CONFIG_SND_SOC_CX20810 is not set
# CONFIG_SND_SOC_DUMMY_CODEC is not set
# CONFIG_SND_SOC_BT_SCO is not set
CONFIG_SND_SOC_ES8316=y
# CONFIG_SND_SOC_ES8323 is not set
@ -2905,7 +2948,8 @@ CONFIG_SND_SOC_MAX98090=y
# CONFIG_SND_SOC_PCM512x_SPI is not set
# CONFIG_SND_SOC_RK312X is not set
# CONFIG_SND_SOC_RK3228 is not set
CONFIG_SND_SOC_RK3328=y
# CONFIG_SND_SOC_RK3308 is not set
# CONFIG_SND_SOC_RK3328 is not set
# CONFIG_SND_SOC_RK817 is not set
CONFIG_SND_SOC_RL6231=y
CONFIG_SND_SOC_RT5616=y
@ -3475,6 +3519,7 @@ CONFIG_RTC_INTF_DEV=y
# CONFIG_RTC_DRV_DS1374 is not set
# CONFIG_RTC_DRV_DS1672 is not set
# CONFIG_RTC_DRV_DS3232 is not set
# CONFIG_RTC_DRV_FAKE is not set
CONFIG_RTC_DRV_HYM8563=y
# CONFIG_RTC_DRV_MAX6900 is not set
CONFIG_RTC_DRV_RK808=y
@ -3698,6 +3743,7 @@ CONFIG_TSL2583=y
# CONFIG_ANDROID_TIMED_OUTPUT is not set
# CONFIG_ANDROID_LOW_MEMORY_KILLER is not set
# CONFIG_SYNC is not set
# CONFIG_ANDROID_VSOC is not set
# CONFIG_ION is not set
# CONFIG_FIQ_DEBUGGER is not set
# CONFIG_FIQ_WATCHDOG is not set
@ -3733,7 +3779,7 @@ CONFIG_COMMON_CLK_RK808=y
# CONFIG_COMMON_CLK_SI570 is not set
# CONFIG_COMMON_CLK_CDCE925 is not set
# CONFIG_CLK_QORIQ is not set
CONFIG_COMMON_CLK_XGENE=y
# CONFIG_COMMON_CLK_XGENE is not set
# CONFIG_COMMON_CLK_PWM is not set
# CONFIG_COMMON_CLK_PXA is not set
# CONFIG_COMMON_CLK_CDCE706 is not set
@ -3750,7 +3796,7 @@ CONFIG_CLKSRC_PROBE=y
CONFIG_ROCKCHIP_TIMER=y
CONFIG_ARM_ARCH_TIMER=y
CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y
# CONFIG_ARM_ARCH_TIMER_VCT_ACCESS is not set
CONFIG_ARM_ARCH_TIMER_VCT_ACCESS=y
# CONFIG_ARM_TIMER_SP804 is not set
# CONFIG_ATMEL_PIT is not set
# CONFIG_SH_TIMER_CMT is not set
@ -3790,13 +3836,23 @@ CONFIG_ROCKCHIP_IOMMU=y
#
# SOC (System On Chip) specific Drivers
#
#
# CPU selection
#
# CONFIG_CPU_PX30 is not set
# CONFIG_CPU_RK3308 is not set
# CONFIG_CPU_RK3328 is not set
# CONFIG_CPU_RK3366 is not set
# CONFIG_CPU_RK3368 is not set
CONFIG_CPU_RK3399=y
CONFIG_ANDROID_VERSION=0x07010000
CONFIG_ROCKCHIP_CPUINFO=y
# CONFIG_ROCKCHIP_DEVICEINFO is not set
# CONFIG_ROCKCHIP_PM_TEST is not set
CONFIG_ROCKCHIP_GRF=y
CONFIG_ROCKCHIP_PM_DOMAINS=y
# CONFIG_ROCKCHIP_PVTM is not set
CONFIG_ROCKCHIP_PVTM=y
CONFIG_ROCKCHIP_SUSPEND_MODE=y
# CONFIG_SUNXI_SRAM is not set
# CONFIG_SOC_TI is not set
@ -3813,6 +3869,7 @@ CONFIG_DEVFREQ_GOV_USERSPACE=y
#
# DEVFREQ Drivers
#
CONFIG_ARM_ROCKCHIP_BUS_DEVFREQ=y
CONFIG_ARM_ROCKCHIP_DMC_DEVFREQ=y
CONFIG_PM_DEVFREQ_EVENT=y
CONFIG_DEVFREQ_EVENT_ROCKCHIP_DFI=y
@ -3985,6 +4042,7 @@ CONFIG_SENSORS_TSL2563=y
# CONFIG_TSL4531 is not set
# CONFIG_US5182D is not set
# CONFIG_VCNL4000 is not set
# CONFIG_VL6180 is not set
#
# Magnetometer sensors
@ -4046,8 +4104,10 @@ CONFIG_PWM=y
CONFIG_PWM_SYSFS=y
# CONFIG_PWM_CROS_EC is not set
# CONFIG_PWM_FSL_FTM is not set
CONFIG_PWM_GPIO=y
# CONFIG_PWM_PCA9685 is not set
CONFIG_PWM_ROCKCHIP=y
# CONFIG_PWM_ROCKCHIP_I2S is not set
CONFIG_IRQCHIP=y
CONFIG_ARM_GIC=y
CONFIG_ARM_GIC_V2M=y
@ -4095,6 +4155,7 @@ CONFIG_ANDROID=y
# CONFIG_LIBNVDIMM is not set
CONFIG_NVMEM=y
CONFIG_ROCKCHIP_EFUSE=y
CONFIG_ROCKCHIP_OTP=y
# CONFIG_STM is not set
# CONFIG_INTEL_TH is not set
@ -4103,6 +4164,7 @@ CONFIG_ROCKCHIP_EFUSE=y
#
# CONFIG_FPGA is not set
# CONFIG_TEE is not set
# CONFIG_RK_FLASH is not set
# CONFIG_RK_NAND is not set
#
@ -4217,6 +4279,7 @@ CONFIG_PROC_FS=y
CONFIG_PROC_SYSCTL=y
CONFIG_PROC_PAGE_MONITOR=y
# CONFIG_PROC_CHILDREN is not set
CONFIG_PROC_UID=y
CONFIG_KERNFS=y
CONFIG_SYSFS=y
CONFIG_TMPFS=y
@ -4248,6 +4311,7 @@ CONFIG_SQUASHFS_ZLIB=y
CONFIG_SQUASHFS_LZ4=y
CONFIG_SQUASHFS_LZO=y
CONFIG_SQUASHFS_XZ=y
CONFIG_SQUASHFS_ZSTD=y
# CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set
# CONFIG_SQUASHFS_EMBEDDED is not set
CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
@ -4670,6 +4734,7 @@ CONFIG_CRYPTO_DES=y
# CONFIG_CRYPTO_CHACHA20 is not set
# CONFIG_CRYPTO_SEED is not set
# CONFIG_CRYPTO_SERPENT is not set
# CONFIG_CRYPTO_SPECK is not set
# CONFIG_CRYPTO_TEA is not set
CONFIG_CRYPTO_TWOFISH=y
CONFIG_CRYPTO_TWOFISH_COMMON=y
@ -4702,6 +4767,7 @@ CONFIG_CRYPTO_USER_API_SKCIPHER=y
CONFIG_CRYPTO_HASH_INFO=y
CONFIG_CRYPTO_HW=y
# CONFIG_CRYPTO_DEV_CCP is not set
# CONFIG_CRYPTO_DEV_ROCKCHIP is not set
CONFIG_ASYMMETRIC_KEY_TYPE=y
CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y
CONFIG_PUBLIC_KEY_ALGO_RSA=y
@ -4724,6 +4790,7 @@ CONFIG_CRYPTO_AES_ARM64_CE_CCM=y
CONFIG_CRYPTO_AES_ARM64_CE_BLK=y
# CONFIG_CRYPTO_AES_ARM64_NEON_BLK is not set
# CONFIG_CRYPTO_CRC32_ARM64 is not set
# CONFIG_CRYPTO_SPECK_NEON is not set
CONFIG_BINARY_PRINTF=y
#
@ -4752,13 +4819,16 @@ CONFIG_CRC32_SLICEBY8=y
CONFIG_CRC7=y
CONFIG_LIBCRC32C=y
# CONFIG_CRC8 is not set
CONFIG_XXHASH=y
CONFIG_AUDIT_ARCH_COMPAT_GENERIC=y
# CONFIG_RANDOM32_SELFTEST is not set
CONFIG_ZLIB_INFLATE=y
CONFIG_ZLIB_DEFLATE=m
CONFIG_LZO_COMPRESS=y
CONFIG_LZO_COMPRESS=m
CONFIG_LZO_DECOMPRESS=y
CONFIG_LZ4_COMPRESS=m
CONFIG_LZ4_DECOMPRESS=y
CONFIG_ZSTD_DECOMPRESS=y
CONFIG_XZ_DEC=y
# CONFIG_XZ_DEC_X86 is not set
# CONFIG_XZ_DEC_POWERPC is not set

View File

@ -26,7 +26,6 @@
# Additional kernel make parameters (for example to specify the u-boot loadaddress)
KERNEL_MAKE_EXTRACMD=""
KERNEL_MAKE_EXTRACMD+=" rockchip/rk3399-odroidn1.dtb"
KERNEL_MAKE_EXTRACMD+=" rockchip/rk3399-rock960.dtb"
KERNEL_MAKE_EXTRACMD+=" rockchip/rk3399-rockpro64.dtb"
KERNEL_MAKE_EXTRACMD+=" rockchip/rk3399-sapphire.dtb"

View File

@ -1,6 +1,6 @@
#
# Automatically generated file; DO NOT EDIT.
# Linux/arm 4.4.114 Kernel Configuration
# Linux/arm 4.4.143 Kernel Configuration
#
CONFIG_ARM=y
CONFIG_ARM_HAS_SG_CHAIN=y
@ -152,6 +152,7 @@ CONFIG_RD_GZIP=y
CONFIG_RD_XZ=y
# CONFIG_RD_LZO is not set
# CONFIG_RD_LZ4 is not set
# CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE is not set
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
CONFIG_SYSCTL=y
CONFIG_ANON_INODES=y
@ -237,6 +238,7 @@ CONFIG_HAVE_MOD_ARCH_SPECIFIC=y
CONFIG_MODULES_USE_ELF_REL=y
CONFIG_ARCH_HAS_ELF_RANDOMIZE=y
CONFIG_HAVE_ARCH_MMAP_RND_BITS=y
CONFIG_HAVE_EXIT_THREAD=y
CONFIG_ARCH_MMAP_RND_BITS_MIN=8
CONFIG_ARCH_MMAP_RND_BITS_MAX=16
CONFIG_ARCH_MMAP_RND_BITS=8
@ -471,7 +473,6 @@ CONFIG_ARM_CPU_TOPOLOGY=y
# CONFIG_SCHED_SMT is not set
CONFIG_HAVE_ARM_SCU=y
CONFIG_HAVE_ARM_ARCH_TIMER=y
CONFIG_HAVE_ARM_TWD=y
# CONFIG_MCPM is not set
# CONFIG_BIG_LITTLE is not set
CONFIG_VMSPLIT_3G=y
@ -511,9 +512,11 @@ CONFIG_FLATMEM=y
CONFIG_FLAT_NODE_MEM_MAP=y
CONFIG_HAVE_MEMBLOCK=y
CONFIG_NO_BOOTMEM=y
CONFIG_MEMORY_ISOLATION=y
# CONFIG_HAVE_BOOTMEM_INFO_NODE is not set
CONFIG_SPLIT_PTLOCK_CPUS=4
# CONFIG_COMPACTION is not set
CONFIG_MIGRATION=y
# CONFIG_PHYS_ADDR_T_64BIT is not set
CONFIG_ZONE_DMA_FLAG=0
CONFIG_BOUNCE=y
@ -521,11 +524,14 @@ CONFIG_BOUNCE=y
CONFIG_DEFAULT_MMAP_MIN_ADDR=32768
# CONFIG_CLEANCACHE is not set
# CONFIG_FRONTSWAP is not set
# CONFIG_CMA is not set
CONFIG_CMA=y
# CONFIG_CMA_DEBUG is not set
CONFIG_CMA_DEBUGFS=y
CONFIG_CMA_AREAS=7
# CONFIG_ZPOOL is not set
# CONFIG_ZBUD is not set
CONFIG_ZSMALLOC=y
# CONFIG_PGTABLE_MAPPING is not set
CONFIG_ZSMALLOC=m
CONFIG_PGTABLE_MAPPING=y
# CONFIG_ZSMALLOC_STAT is not set
# CONFIG_IDLE_PAGE_TRACKING is not set
CONFIG_FORCE_MAX_ZONEORDER=11
@ -547,7 +553,7 @@ CONFIG_ATAGS=y
CONFIG_ZBOOT_ROM_TEXT=0x0
CONFIG_ZBOOT_ROM_BSS=0x0
# CONFIG_ARM_APPENDED_DTB is not set
CONFIG_CMDLINE="root=/dev/ram0 rdinit=/init usbcore.autosuspend=-1"
CONFIG_CMDLINE="usbcore.autosuspend=-1"
# CONFIG_CMDLINE_FROM_BOOTLOADER is not set
CONFIG_CMDLINE_EXTEND=y
# CONFIG_CMDLINE_FORCE is not set
@ -566,13 +572,13 @@ CONFIG_CPU_FREQ=y
CONFIG_CPU_FREQ_GOV_COMMON=y
CONFIG_CPU_FREQ_STAT=y
# CONFIG_CPU_FREQ_STAT_DETAILS is not set
CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
CONFIG_CPU_FREQ_TIMES=y
# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set
CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_INTERACTIVE is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_SCHED is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL is not set
CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
CONFIG_CPU_FREQ_GOV_POWERSAVE=y
@ -1016,6 +1022,7 @@ CONFIG_RFKILL_GPIO=y
# CONFIG_CEPH_LIB is not set
# CONFIG_NFC is not set
# CONFIG_LWTUNNEL is not set
CONFIG_DST_CACHE=y
CONFIG_HAVE_BPF_JIT=y
#
@ -1051,6 +1058,17 @@ CONFIG_REGMAP_MMIO=y
CONFIG_REGMAP_IRQ=y
CONFIG_DMA_SHARED_BUFFER=y
# CONFIG_FENCE_TRACE is not set
CONFIG_DMA_CMA=y
#
# Default contiguous memory area size:
#
CONFIG_CMA_SIZE_MBYTES=64
CONFIG_CMA_SIZE_SEL_MBYTES=y
# CONFIG_CMA_SIZE_SEL_PERCENTAGE is not set
# CONFIG_CMA_SIZE_SEL_MIN is not set
# CONFIG_CMA_SIZE_SEL_MAX is not set
CONFIG_CMA_ALIGNMENT=8
#
# Bus devices
@ -1078,8 +1096,8 @@ CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y
# CONFIG_PARPORT is not set
CONFIG_BLK_DEV=y
# CONFIG_BLK_DEV_NULL_BLK is not set
CONFIG_ZRAM=y
# CONFIG_ZRAM_LZ4_COMPRESS is not set
CONFIG_ZRAM=m
CONFIG_ZRAM_LZ4_COMPRESS=y
# CONFIG_BLK_DEV_COW_COMMON is not set
CONFIG_BLK_DEV_LOOP=y
CONFIG_BLK_DEV_LOOP_MIN_COUNT=8
@ -1097,7 +1115,7 @@ CONFIG_BLK_DEV_RAM_SIZE=4096
#
# Misc devices
#
# CONFIG_ROCKCHIP_SCR is not set
CONFIG_ROCKCHIP_SCR=y
# CONFIG_SENSORS_LIS3LV02D is not set
# CONFIG_AD525X_DPOT is not set
# CONFIG_DUMMY_IRQ is not set
@ -1329,7 +1347,7 @@ CONFIG_PHYLIB=y
# CONFIG_CICADA_PHY is not set
# CONFIG_VITESSE_PHY is not set
# CONFIG_TERANETICS_PHY is not set
# CONFIG_ROCKCHIP_PHY is not set
CONFIG_ROCKCHIP_PHY=y
# CONFIG_SMSC_PHY is not set
# CONFIG_BROADCOM_PHY is not set
# CONFIG_BCM7XXX_PHY is not set
@ -1432,18 +1450,25 @@ CONFIG_RT2X00_LIB_LEDS=y
# CONFIG_RTL_CARDS is not set
# CONFIG_RTL8XXXU is not set
CONFIG_WL_ROCKCHIP=y
# CONFIG_WIFI_BUILD_MODULE is not set
CONFIG_WIFI_LOAD_DRIVER_WHEN_KERNEL_BOOTUP=y
CONFIG_WIFI_BUILD_MODULE=y
# CONFIG_WIFI_LOAD_DRIVER_WHEN_KERNEL_BOOTUP is not set
# CONFIG_AP6XXX is not set
# CONFIG_CYW_BCMDHD is not set
CONFIG_RTL_WIRELESS_SOLUTION=y
# CONFIG_RTL8188EU is not set
# CONFIG_RTL8188FU is not set
# CONFIG_RTL8189ES is not set
# CONFIG_RTL8189FS is not set
CONFIG_RTL8723BS=y
CONFIG_RTL8723BS=m
# CONFIG_RTL8723BU is not set
# CONFIG_RTL8723CS is not set
# CONFIG_RTL8723DS is not set
# CONFIG_MVL88W8977 is not set
#
# SouthSV 6XXX WLAN support
#
# CONFIG_SSV6051 is not set
# CONFIG_WL_TI is not set
CONFIG_ZD1211RW=m
# CONFIG_ZD1211RW_DEBUG is not set
@ -1578,6 +1603,7 @@ CONFIG_TOUCHSCREEN_ATMEL_MXT=y
# CONFIG_TOUCHSCREEN_FT6236 is not set
# CONFIG_TOUCHSCREEN_FUJITSU is not set
# CONFIG_TOUCHSCREEN_GOODIX is not set
# CONFIG_TOUCHSCREEN_GSLX680A is not set
# CONFIG_TOUCHSCREEN_GSLX680_D708 is not set
# CONFIG_TOUCHSCREEN_GSLX680_PAD is not set
# CONFIG_TOUCHSCREEN_GSLX680_VR is not set
@ -1892,6 +1918,7 @@ CONFIG_GENERIC_PINCONF=y
# CONFIG_PINCTRL_AMD is not set
CONFIG_PINCTRL_ROCKCHIP=y
# CONFIG_PINCTRL_SINGLE is not set
# CONFIG_PINCTRL_RK805 is not set
CONFIG_ARCH_HAVE_CUSTOM_GPIO_H=y
CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y
CONFIG_ARCH_REQUIRE_GPIOLIB=y
@ -2304,6 +2331,7 @@ CONFIG_REGULATOR_RK808=y
# CONFIG_REGULATOR_RK818 is not set
# CONFIG_REGULATOR_SYR82X is not set
# CONFIG_REGULATOR_TPS51632 is not set
# CONFIG_REGULATOR_TPS549B22 is not set
# CONFIG_REGULATOR_TPS62360 is not set
# CONFIG_REGULATOR_TPS65023 is not set
# CONFIG_REGULATOR_TPS6507X is not set
@ -2311,6 +2339,7 @@ CONFIG_REGULATOR_RK808=y
CONFIG_REGULATOR_TPS6586X=y
# CONFIG_REGULATOR_XZ3216 is not set
CONFIG_CEC_CORE=y
CONFIG_CEC_NOTIFIER=y
CONFIG_MEDIA_SUPPORT=y
#
@ -2346,15 +2375,15 @@ CONFIG_IR_SHARP_DECODER=y
CONFIG_IR_MCE_KBD_DECODER=y
CONFIG_IR_XMP_DECODER=y
CONFIG_RC_DEVICES=y
# CONFIG_RC_ATI_REMOTE is not set
# CONFIG_IR_HIX5HD2 is not set
# CONFIG_IR_IMON is not set
# CONFIG_IR_MCEUSB is not set
# CONFIG_IR_REDRAT3 is not set
# CONFIG_IR_STREAMZAP is not set
# CONFIG_IR_IGORPLUGUSB is not set
# CONFIG_IR_IGUANA is not set
# CONFIG_IR_TTUSBIR is not set
CONFIG_RC_ATI_REMOTE=m
CONFIG_IR_HIX5HD2=m
CONFIG_IR_IMON=m
CONFIG_IR_MCEUSB=m
CONFIG_IR_REDRAT3=m
CONFIG_IR_STREAMZAP=m
CONFIG_IR_IGORPLUGUSB=m
CONFIG_IR_IGUANA=m
CONFIG_IR_TTUSBIR=m
# CONFIG_RC_LOOPBACK is not set
CONFIG_IR_GPIO_CIR=y
CONFIG_MEDIA_USB_SUPPORT=y
@ -2364,6 +2393,7 @@ CONFIG_MEDIA_USB_SUPPORT=y
#
CONFIG_USB_PULSE8_CEC=y
CONFIG_USB_RAINSHADOW_CEC=y
# CONFIG_ROCKCHIP_TSP is not set
#
# Supported MMC/SDIO adapters
@ -2399,7 +2429,7 @@ CONFIG_DRM_KMS_FB_HELPER=y
CONFIG_DRM_FBDEV_EMULATION=y
# CONFIG_DRM_LOAD_EDID_FIRMWARE is not set
# CONFIG_DRM_SCDC_HELPER is not set
CONFIG_DRM_DMA_SYNC=y
# CONFIG_DRM_DMA_SYNC is not set
#
# I2C encoder or helper chips
@ -2411,13 +2441,14 @@ CONFIG_DRM_DMA_SYNC=y
# CONFIG_DRM_VGEM is not set
# CONFIG_DRM_EXYNOS is not set
CONFIG_DRM_ROCKCHIP=y
# CONFIG_ROCKCHIP_DRM_DEBUG is not set
# CONFIG_ROCKCHIP_CDN_DP is not set
CONFIG_ROCKCHIP_DW_HDMI=y
CONFIG_ROCKCHIP_DW_MIPI_DSI=y
CONFIG_ROCKCHIP_ANALOGIX_DP=y
CONFIG_ROCKCHIP_INNO_HDMI=y
CONFIG_ROCKCHIP_LVDS=y
# CONFIG_ROCKCHIP_DRM_TVE is not set
CONFIG_ROCKCHIP_DRM_TVE=y
# CONFIG_ROCKCHIP_RGB is not set
# CONFIG_ROCKCHIP_DRM_BACKLIGHT is not set
# CONFIG_ROCKCHIP_RK3066_HDMI is not set
@ -2444,22 +2475,22 @@ CONFIG_DRM_BRIDGE=y
# CONFIG_DRM_PARADE_PS8622 is not set
# CONFIG_DRM_RK1000 is not set
# CONFIG_DRM_DUMB_VGA_DAC is not set
# CONFIG_DRM_LONTIUM_LT8912 is not set
CONFIG_DRM_ANALOGIX_DP=y
CONFIG_DRM_DW_HDMI=y
# CONFIG_DRM_DW_HDMI_AHB_AUDIO is not set
CONFIG_DRM_DW_HDMI_I2S_AUDIO=y
# CONFIG_DRM_DW_HDMI_CEC is not set
CONFIG_DRM_DW_HDMI_CEC=y
# CONFIG_DRM_STI is not set
# CONFIG_POWERVR_ROGUE_M is not set
# CONFIG_MALI400 is not set
CONFIG_MALI_DEVFREQ=y
CONFIG_MALI_MIDGARD_FOR_ANDROID=y
# CONFIG_MALI_MIDGARD_FOR_LINUX is not set
CONFIG_MALI_MIDGARD=m
# CONFIG_MALI_GATOR_SUPPORT is not set
# CONFIG_MALI_MIDGARD_ENABLE_TRACE is not set
# CONFIG_MALI_DMA_FENCE is not set
CONFIG_MALI_EXPERT=y
# CONFIG_MALI_CORESTACK is not set
# CONFIG_MALI_PRFCNT_SET_SECONDARY is not set
# CONFIG_MALI_PLATFORM_FAKE is not set
# CONFIG_MALI_PLATFORM_DEVICETREE is not set
@ -2470,8 +2501,11 @@ CONFIG_MALI_PLATFORM_THIRDPARTY_NAME="rk"
# CONFIG_MALI_TRACE_TIMELINE is not set
# CONFIG_MALI_SYSTEM_TRACE is not set
# CONFIG_MALI_GPU_MMU_AARCH64 is not set
CONFIG_MALI_PWRSOFT_765=y
# CONFIG_MALI_KUTF is not set
# CONFIG_MALI_BIFROST_FOR_ANDROID is not set
CONFIG_MALI_BIFROST_FOR_LINUX=y
# CONFIG_MALI_BIFROST is not set
# CONFIG_MALI_PWRSOFT_765 is not set
#
# Frame buffer Devices
@ -2568,7 +2602,8 @@ CONFIG_RK_VCODEC=y
#
# ROCKCHIP_MPP
#
# CONFIG_ROCKCHIP_MPP_SERVICE is not set
CONFIG_ROCKCHIP_MPP_SERVICE=y
CONFIG_ROCKCHIP_MPP_DEVICE=y
# CONFIG_VGASTATE is not set
CONFIG_VIDEOMODE_HELPERS=y
CONFIG_HDMI=y
@ -2656,13 +2691,19 @@ CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM=y
# CONFIG_SND_SOC_FSL_ESAI is not set
# CONFIG_SND_SOC_IMX_AUDMUX is not set
CONFIG_SND_SOC_ROCKCHIP=y
# CONFIG_SND_SOC_ROCKCHIP_FORCE_SRAM is not set
CONFIG_SND_SOC_ROCKCHIP_I2S=y
# CONFIG_SND_SOC_ROCKCHIP_I2S_TDM is not set
# CONFIG_SND_SOC_ROCKCHIP_MULTI_DAIS is not set
# CONFIG_SND_SOC_ROCKCHIP_PDM is not set
CONFIG_SND_SOC_ROCKCHIP_SPDIF=y
# CONFIG_SND_SOC_ROCKCHIP_SPDIFRX is not set
# CONFIG_SND_SOC_ROCKCHIP_VAD is not set
# CONFIG_SND_SOC_ROCKCHIP_DA7219 is not set
# CONFIG_SND_SOC_ROCKCHIP_HDMI_ANALOG is not set
# CONFIG_SND_SOC_ROCKCHIP_HDMI_DP is not set
CONFIG_SND_SOC_ROCKCHIP_MAX98090=y
# CONFIG_SND_SOC_ROCKCHIP_MULTICODECS is not set
CONFIG_SND_SOC_ROCKCHIP_RT5645=y
# CONFIG_SND_SOC_ROCKCHIP_RT5651_TC358749 is not set
# CONFIG_SND_SOC_ROCKCHIP_CDNDP is not set
@ -2698,6 +2739,7 @@ CONFIG_SND_SOC_I2C_AND_SPI=y
# CONFIG_SND_SOC_CS4349 is not set
# CONFIG_SND_SOC_CX2072X is not set
# CONFIG_SND_SOC_CX20810 is not set
# CONFIG_SND_SOC_DUMMY_CODEC is not set
# CONFIG_SND_SOC_BT_SCO is not set
# CONFIG_SND_SOC_ES8316 is not set
CONFIG_SND_SOC_ES8323=y
@ -2715,6 +2757,7 @@ CONFIG_SND_SOC_MAX98090=y
# CONFIG_SND_SOC_PCM512x_SPI is not set
# CONFIG_SND_SOC_RK312X is not set
# CONFIG_SND_SOC_RK3228 is not set
# CONFIG_SND_SOC_RK3308 is not set
# CONFIG_SND_SOC_RK3328 is not set
# CONFIG_SND_SOC_RK817 is not set
CONFIG_SND_SOC_RL6231=y
@ -3061,7 +3104,6 @@ CONFIG_USB_EZUSB_FX2=y
# CONFIG_USB_PHY is not set
# CONFIG_USB_OTG_WAKELOCK is not set
# CONFIG_NOP_USB_XCEIV is not set
# CONFIG_AM335X_PHY_USB is not set
# CONFIG_USB_GPIO_VBUS is not set
# CONFIG_USB_ISP1301 is not set
# CONFIG_USB_ULPI is not set
@ -3255,6 +3297,7 @@ CONFIG_RTC_INTF_DEV=y
# CONFIG_RTC_DRV_DS1374 is not set
# CONFIG_RTC_DRV_DS1672 is not set
# CONFIG_RTC_DRV_DS3232 is not set
# CONFIG_RTC_DRV_FAKE is not set
CONFIG_RTC_DRV_HYM8563=y
# CONFIG_RTC_DRV_MAX6900 is not set
CONFIG_RTC_DRV_RK808=y
@ -3518,15 +3561,11 @@ CONFIG_COMMON_CLK_RK808=y
#
CONFIG_CLKSRC_OF=y
CONFIG_CLKSRC_PROBE=y
CONFIG_DW_APB_TIMER=y
CONFIG_DW_APB_TIMER_OF=y
CONFIG_ROCKCHIP_TIMER=y
CONFIG_ARM_ARCH_TIMER=y
CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y
CONFIG_ARM_ARCH_TIMER_VCT_ACCESS=y
CONFIG_ARM_GLOBAL_TIMER=y
# CONFIG_ARM_TIMER_SP804 is not set
CONFIG_CLKSRC_ARM_GLOBAL_TIMER_SCHED_CLOCK=y
# CONFIG_ATMEL_PIT is not set
# CONFIG_SH_TIMER_CMT is not set
# CONFIG_SH_TIMER_MTU2 is not set
@ -3560,13 +3599,31 @@ CONFIG_ROCKCHIP_IOMMU=y
# SOC (System On Chip) specific Drivers
#
# CONFIG_SOC_BRCMSTB is not set
#
# CPU selection
#
# CONFIG_CPU_RK312X is not set
# CONFIG_CPU_RK3036 is not set
# CONFIG_CPU_RK30XX is not set
# CONFIG_CPU_RK3188 is not set
CONFIG_CPU_RK3288=y
# CONFIG_CPU_RK322X is not set
# CONFIG_CPU_RV110X is not set
# CONFIG_CPU_PX30 is not set
# CONFIG_CPU_RK3308 is not set
# CONFIG_CPU_RK3328 is not set
# CONFIG_CPU_RK3366 is not set
# CONFIG_CPU_RK3368 is not set
# CONFIG_CPU_RK3399 is not set
CONFIG_ANDROID_VERSION=0x07010000
CONFIG_ROCKCHIP_CPUINFO=y
# CONFIG_ROCKCHIP_DEVICEINFO is not set
# CONFIG_ROCKCHIP_PM_TEST is not set
CONFIG_ROCKCHIP_GRF=y
CONFIG_ROCKCHIP_PM_DOMAINS=y
# CONFIG_ROCKCHIP_PVTM is not set
CONFIG_ROCKCHIP_PVTM=y
CONFIG_ROCKCHIP_SUSPEND_MODE=y
# CONFIG_SUNXI_SRAM is not set
# CONFIG_SOC_TI is not set
CONFIG_PM_DEVFREQ=y
@ -3582,6 +3639,7 @@ CONFIG_DEVFREQ_GOV_USERSPACE=y
#
# DEVFREQ Drivers
#
CONFIG_ARM_ROCKCHIP_BUS_DEVFREQ=y
CONFIG_ARM_ROCKCHIP_DMC_DEVFREQ=y
CONFIG_PM_DEVFREQ_EVENT=y
CONFIG_DEVFREQ_EVENT_ROCKCHIP_DFI=y
@ -3745,6 +3803,7 @@ CONFIG_SENSORS_TSL2563=y
# CONFIG_TSL4531 is not set
# CONFIG_US5182D is not set
# CONFIG_VCNL4000 is not set
# CONFIG_VL6180 is not set
#
# Magnetometer sensors
@ -3804,8 +3863,10 @@ CONFIG_PWM=y
CONFIG_PWM_SYSFS=y
# CONFIG_PWM_CROS_EC is not set
# CONFIG_PWM_FSL_FTM is not set
CONFIG_PWM_GPIO=y
# CONFIG_PWM_PCA9685 is not set
CONFIG_PWM_ROCKCHIP=y
# CONFIG_PWM_ROCKCHIP_I2S is not set
CONFIG_IRQCHIP=y
CONFIG_ARM_GIC=y
# CONFIG_IPACK_BUS is not set
@ -3824,7 +3885,7 @@ CONFIG_GENERIC_PHY=y
CONFIG_PHY_ROCKCHIP_USB=y
# CONFIG_PHY_ROCKCHIP_INNO_USB2 is not set
# CONFIG_PHY_ROCKCHIP_INNO_USB3 is not set
# CONFIG_PHY_ROCKCHIP_EMMC is not set
CONFIG_PHY_ROCKCHIP_EMMC=y
CONFIG_PHY_ROCKCHIP_DP=y
# CONFIG_PHY_ROCKCHIP_INNO_MIPI_DPHY is not set
# CONFIG_PHY_ROCKCHIP_INNO_HDMI_PHY is not set
@ -3846,6 +3907,7 @@ CONFIG_ANDROID=y
# CONFIG_ANDROID_BINDER_IPC is not set
CONFIG_NVMEM=y
CONFIG_ROCKCHIP_EFUSE=y
CONFIG_ROCKCHIP_OTP=y
# CONFIG_STM is not set
# CONFIG_INTEL_TH is not set
@ -3854,6 +3916,7 @@ CONFIG_ROCKCHIP_EFUSE=y
#
# CONFIG_FPGA is not set
# CONFIG_TEE is not set
# CONFIG_RK_FLASH is not set
# CONFIG_RK_NAND is not set
#
@ -3866,7 +3929,7 @@ CONFIG_ROCKCHIP_EFUSE=y
#
# CONFIG_FIRMWARE_MEMMAP is not set
CONFIG_HAVE_ARM_SMCCC=y
# CONFIG_ROCKCHIP_SIP is not set
CONFIG_ROCKCHIP_SIP=y
#
# File systems
@ -3964,6 +4027,7 @@ CONFIG_PROC_FS=y
CONFIG_PROC_SYSCTL=y
CONFIG_PROC_PAGE_MONITOR=y
# CONFIG_PROC_CHILDREN is not set
CONFIG_PROC_UID=y
CONFIG_KERNFS=y
CONFIG_SYSFS=y
CONFIG_TMPFS=y
@ -3993,6 +4057,7 @@ CONFIG_SQUASHFS_ZLIB=y
CONFIG_SQUASHFS_LZ4=y
CONFIG_SQUASHFS_LZO=y
CONFIG_SQUASHFS_XZ=y
CONFIG_SQUASHFS_ZSTD=y
# CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set
# CONFIG_SQUASHFS_EMBEDDED is not set
CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
@ -4415,6 +4480,7 @@ CONFIG_CRYPTO_DES=y
# CONFIG_CRYPTO_CHACHA20 is not set
# CONFIG_CRYPTO_SEED is not set
# CONFIG_CRYPTO_SERPENT is not set
# CONFIG_CRYPTO_SPECK is not set
# CONFIG_CRYPTO_TEA is not set
CONFIG_CRYPTO_TWOFISH=y
CONFIG_CRYPTO_TWOFISH_COMMON=y
@ -4446,6 +4512,7 @@ CONFIG_CRYPTO_USER_API_SKCIPHER=y
# CONFIG_CRYPTO_USER_API_AEAD is not set
CONFIG_CRYPTO_HASH_INFO=y
CONFIG_CRYPTO_HW=y
# CONFIG_CRYPTO_DEV_ROCKCHIP is not set
CONFIG_ASYMMETRIC_KEY_TYPE=y
CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y
CONFIG_PUBLIC_KEY_ALGO_RSA=y
@ -4487,13 +4554,16 @@ CONFIG_CRC32_SLICEBY8=y
CONFIG_CRC7=y
CONFIG_LIBCRC32C=y
# CONFIG_CRC8 is not set
CONFIG_XXHASH=y
# CONFIG_AUDIT_ARCH_COMPAT_GENERIC is not set
# CONFIG_RANDOM32_SELFTEST is not set
CONFIG_ZLIB_INFLATE=y
CONFIG_ZLIB_DEFLATE=m
CONFIG_LZO_COMPRESS=y
CONFIG_LZO_COMPRESS=m
CONFIG_LZO_DECOMPRESS=y
CONFIG_LZ4_COMPRESS=m
CONFIG_LZ4_DECOMPRESS=y
CONFIG_ZSTD_DECOMPRESS=y
CONFIG_XZ_DEC=y
# CONFIG_XZ_DEC_X86 is not set
# CONFIG_XZ_DEC_POWERPC is not set

View File

@ -1,287 +0,0 @@
From f490b48f29fb0b976b7f3d749f14dd4bbb95705a Mon Sep 17 00:00:00 2001
From: Ziyuan Xu <xzy.xu@rock-chips.com>
Date: Fri, 23 Sep 2016 13:43:18 +0800
Subject: [PATCH] MINIARM: HACK: switch vccio_sd to 3.3v while shutdowning
Change-Id: I80d6d2b61b31f16b6b42b9ffcaab077231a7a91c
Signed-off-by: Ziyuan Xu <xzy.xu@rock-chips.com>
---
drivers/mmc/host/dw_mmc-rockchip.c | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/drivers/mmc/host/dw_mmc-rockchip.c b/drivers/mmc/host/dw_mmc-rockchip.c
index 29e3ae99edbc..531ad93ff912 100644
--- a/drivers/mmc/host/dw_mmc-rockchip.c
+++ b/drivers/mmc/host/dw_mmc-rockchip.c
@@ -13,6 +13,7 @@
#include <linux/mmc/host.h>
#include <linux/mmc/dw_mmc.h>
#include <linux/of_address.h>
+#include <linux/regulator/consumer.h>
#include <linux/slab.h>
#include "dw_mmc.h"
@@ -285,6 +286,15 @@ static int dw_mci_rockchip_probe(struct platform_device *pdev)
return dw_mci_pltfm_register(pdev, drv_data);
}
+static void dw_mci_rockchip_platfm_shutdown(struct platform_device *pdev)
+{
+ struct dw_mci *host = platform_get_drvdata(pdev);
+ struct mmc_host *mmc = host->cur_slot->mmc;
+
+ if (!IS_ERR(mmc->supply.vqmmc))
+ regulator_set_voltage(mmc->supply.vqmmc, 3000000, 3300000);
+}
+
#ifdef CONFIG_PM_SLEEP
static int dw_mci_rockchip_suspend(struct device *dev)
{
@@ -308,6 +318,7 @@ static SIMPLE_DEV_PM_OPS(dw_mci_rockchip_pmops,
static struct platform_driver dw_mci_rockchip_pltfm_driver = {
.probe = dw_mci_rockchip_probe,
.remove = dw_mci_pltfm_remove,
+ .shutdown = dw_mci_rockchip_platfm_shutdown,
.driver = {
.name = "dwmmc_rockchip",
.of_match_table = dw_mci_rockchip_match,
From dcd64488045c2c7b54f4257a0f5e6d56f93f28f6 Mon Sep 17 00:00:00 2001
From: Ziyuan Xu <xzy.xu@rock-chips.com>
Date: Mon, 6 Feb 2017 08:39:46 +0800
Subject: [PATCH] MINIARM: HACK: mmc: dw_mmc-rockchip: enable vmmc supply for
reboot
Mmc core has already power off the vmmc since shutdown, re-enable it so
that card is active in next reboot.
Change-Id: Id64ed02844db9d834c820ed5b8c5bf7a0afe4ed5
Signed-off-by: Ziyuan Xu <xzy.xu@rock-chips.com>
---
drivers/mmc/host/dw_mmc-rockchip.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/drivers/mmc/host/dw_mmc-rockchip.c b/drivers/mmc/host/dw_mmc-rockchip.c
index 531ad93ff912..eae304077e17 100644
--- a/drivers/mmc/host/dw_mmc-rockchip.c
+++ b/drivers/mmc/host/dw_mmc-rockchip.c
@@ -15,6 +15,7 @@
#include <linux/of_address.h>
#include <linux/regulator/consumer.h>
#include <linux/slab.h>
+#include <linux/delay.h>
#include "dw_mmc.h"
#include "dw_mmc-pltfm.h"
@@ -290,6 +291,12 @@ static void dw_mci_rockchip_platfm_shutdown(struct platform_device *pdev)
{
struct dw_mci *host = platform_get_drvdata(pdev);
struct mmc_host *mmc = host->cur_slot->mmc;
+ int ret;
+
+ mdelay(20);
+
+ if (!IS_ERR(mmc->supply.vmmc))
+ ret = regulator_enable(mmc->supply.vmmc);
if (!IS_ERR(mmc->supply.vqmmc))
regulator_set_voltage(mmc->supply.vqmmc, 3000000, 3300000);
From 6947d06a6b9bccb4fca863cb40638b3cdf487fa8 Mon Sep 17 00:00:00 2001
From: Jacob Chen <jacob-chen@iotwrt.com>
Date: Sat, 22 Jul 2017 19:55:09 +0800
Subject: [PATCH] MINIARM: drm/rockchip: update phy settings
Change-Id: I9e92a4191115e13999183a5d7656d6708adda632
Signed-off-by: Jacob Chen <jacob-chen@iotwrt.com>
---
drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
index bdc96cd4253d..cea7b9d6bdb3 100644
--- a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
+++ b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
@@ -347,8 +347,7 @@ static struct dw_hdmi_phy_config rockchip_phy_config[] = {
/*pixelclk symbol term vlev*/
{ 74250000, 0x8009, 0x0004, 0x0272},
{ 165000000, 0x802b, 0x0004, 0x0209},
- { 297000000, 0x8039, 0x0005, 0x028d},
- { 594000000, 0x8039, 0x0000, 0x019d},
+ { 297000000, 0x802d, 0x0001, 0x0149},
{ ~0UL, 0x0000, 0x0000, 0x0000}
};
From 8b96d29710578f258442bb7975581e30c5c1a209 Mon Sep 17 00:00:00 2001
From: Nickey Yang <nickey.yang@rock-chips.com>
Date: Mon, 17 Jul 2017 16:35:34 +0800
Subject: [PATCH] MINIARM: set npll be used for hdmi only
Change-Id: I8bebfb2cfb68e3dad172e5547d3886526ad5e912
Signed-off-by: Nickey Yang <nickey.yang@rock-chips.com>
---
arch/arm/boot/dts/rk3288.dtsi | 4 +++-
drivers/clk/rockchip/clk-rk3288.c | 6 +++---
2 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/arch/arm/boot/dts/rk3288.dtsi b/arch/arm/boot/dts/rk3288.dtsi
index b37d1954d27c..904a7955e347 100644
--- a/arch/arm/boot/dts/rk3288.dtsi
+++ b/arch/arm/boot/dts/rk3288.dtsi
@@ -1027,7 +1027,7 @@
<&cru PCLK_PERI>;
assigned-clock-rates = <594000000>,
<500000000>, <300000000>,
- <150000000>, <75000000>,
+ <0>, <75000000>,
<300000000>, <150000000>,
<75000000>;
};
@@ -1265,6 +1265,8 @@
resets = <&cru SRST_LCDC0_AXI>, <&cru SRST_LCDC0_AHB>, <&cru SRST_LCDC0_DCLK>;
reset-names = "axi", "ahb", "dclk";
iommus = <&vopb_mmu>;
+ assigned-clocks = <&cru DCLK_VOP0>;
+ assigned-clock-parents = <&cru PLL_NPLL>;
status = "disabled";
vopb_out: port {
diff --git a/drivers/clk/rockchip/clk-rk3288.c b/drivers/clk/rockchip/clk-rk3288.c
index 4adbace24ff7..9df15059d584 100644
--- a/drivers/clk/rockchip/clk-rk3288.c
+++ b/drivers/clk/rockchip/clk-rk3288.c
@@ -211,9 +211,9 @@ static struct rockchip_pll_clock rk3288_pll_clks[] __initdata = {
[cpll] = PLL(pll_rk3066, PLL_CPLL, "cpll", mux_pll_p, 0, RK3288_PLL_CON(8),
RK3288_MODE_CON, 8, 7, 0, rk3288_pll_rates),
[gpll] = PLL(pll_rk3066, PLL_GPLL, "gpll", mux_pll_p, 0, RK3288_PLL_CON(12),
- RK3288_MODE_CON, 12, 8, ROCKCHIP_PLL_SYNC_RATE, rk3288_pll_rates),
+ RK3288_MODE_CON, 12, 8, 0, rk3288_pll_rates),
[npll] = PLL(pll_rk3066, PLL_NPLL, "npll", mux_pll_p, 0, RK3288_PLL_CON(16),
- RK3288_MODE_CON, 14, 9, ROCKCHIP_PLL_SYNC_RATE, rk3288_pll_rates),
+ RK3288_MODE_CON, 14, 9, 0, rk3288_pll_rates),
};
static struct clk_div_table div_hclk_cpu_t[] = {
@@ -428,7 +428,7 @@ static struct rockchip_clk_branch rk3288_clk_branches[] __initdata = {
RK3288_CLKSEL_CON(30), 14, 2, MFLAGS, 8, 5, DFLAGS,
RK3288_CLKGATE_CON(3), 4, GFLAGS),
- COMPOSITE(DCLK_VOP0, "dclk_vop0", mux_pll_src_cpll_gpll_npll_p, 0,
+ COMPOSITE(DCLK_VOP0, "dclk_vop0", mux_pll_src_cpll_gpll_npll_p, CLK_SET_RATE_NO_REPARENT | CLK_SET_RATE_PARENT,
RK3288_CLKSEL_CON(27), 0, 2, MFLAGS, 8, 8, DFLAGS,
RK3288_CLKGATE_CON(3), 1, GFLAGS),
COMPOSITE(DCLK_VOP1, "dclk_vop1", mux_pll_src_cpll_gpll_npll_p, 0,
From 07d84a3e6f43def7af179d417224a610ca7aaf98 Mon Sep 17 00:00:00 2001
From: Jonas Karlman <jonas@kwiboo.se>
Date: Mon, 11 Dec 2017 23:09:54 +0100
Subject: [PATCH] clk: rockchip: rk3288: add more pixel clock rates
---
drivers/clk/rockchip/clk-rk3288.c | 79 +++++++++++++++++++++++++++++++++++++--
1 file changed, 75 insertions(+), 4 deletions(-)
diff --git a/drivers/clk/rockchip/clk-rk3288.c b/drivers/clk/rockchip/clk-rk3288.c
index 9df15059d584..e1f3bd273a58 100644
--- a/drivers/clk/rockchip/clk-rk3288.c
+++ b/drivers/clk/rockchip/clk-rk3288.c
@@ -84,23 +84,94 @@ static struct rockchip_pll_rate_table rk3288_pll_rates[] = {
RK3066_PLL_RATE( 742500000, 8, 495, 2),
RK3066_PLL_RATE( 696000000, 1, 58, 2),
RK3066_PLL_RATE( 600000000, 1, 50, 2),
- RK3066_PLL_RATE_NB(594000000, 1, 198, 8, 1),
+ RK3066_PLL_RATE( 594000000, 2, 99, 2),
+ RK3066_PLL_RATE( 552750000, 16, 737, 2),
RK3066_PLL_RATE( 552000000, 1, 46, 2),
+ RK3066_PLL_RATE( 505250000, 24, 2021, 4),
RK3066_PLL_RATE( 504000000, 1, 84, 4),
RK3066_PLL_RATE( 500000000, 3, 125, 2),
RK3066_PLL_RATE( 456000000, 1, 76, 4),
+ RK3066_PLL_RATE( 443250000, 8, 591, 4),
RK3066_PLL_RATE( 408000000, 1, 68, 4),
RK3066_PLL_RATE( 400000000, 3, 100, 2),
RK3066_PLL_RATE( 384000000, 2, 128, 4),
+ RK3066_PLL_RATE( 380500000, 12, 761, 4),
RK3066_PLL_RATE( 360000000, 1, 60, 4),
+ RK3066_PLL_RATE( 356500000, 8, 713, 6),
+ RK3066_PLL_RATE( 348500000, 8, 697, 6),
+ RK3066_PLL_RATE( 333250000, 16, 1333, 6),
+ RK3066_PLL_RATE( 317000000, 4, 317, 6),
+ RK3066_PLL_RATE( 312250000, 16, 1249, 6),
RK3066_PLL_RATE( 312000000, 1, 52, 4),
RK3066_PLL_RATE( 300000000, 1, 50, 4),
- RK3066_PLL_RATE( 297000000, 2, 198, 8),
+ RK3066_PLL_RATE( 297000000, 4, 297, 6),
+ RK3066_PLL_RATE( 288000000, 1, 72, 6),
+ RK3066_PLL_RATE( 281250000, 16, 1125, 6),
+ RK3066_PLL_RATE( 268500000, 2, 179, 8),
+ RK3066_PLL_RATE( 268250000, 12, 1073, 8),
+ RK3066_PLL_RATE( 261000000, 1, 87, 8),
RK3066_PLL_RATE( 252000000, 1, 84, 8),
+ RK3066_PLL_RATE( 245500000, 6, 491, 8),
+ RK3066_PLL_RATE( 245250000, 4, 327, 8),
+ RK3066_PLL_RATE( 241500000, 2, 161, 8),
+ RK3066_PLL_RATE( 234000000, 1, 78, 8),
+ RK3066_PLL_RATE( 229500000, 2, 153, 8),
+ RK3066_PLL_RATE( 218250000, 16, 1455, 10),
RK3066_PLL_RATE( 216000000, 1, 72, 8),
- RK3066_PLL_RATE( 148500000, 2, 99, 8),
+ RK3066_PLL_RATE( 214750000, 12, 859, 8),
+ RK3066_PLL_RATE( 208000000, 3, 260, 10),
+ RK3066_PLL_RATE( 204750000, 16, 1365, 10),
+ RK3066_PLL_RATE( 202500000, 8, 675, 10),
+ RK3066_PLL_RATE( 193250000, 48, 3865, 10),
+ RK3066_PLL_RATE( 189000000, 4, 315, 10),
+ RK3066_PLL_RATE( 187250000, 48, 3745, 10),
+ RK3066_PLL_RATE( 187000000, 12, 935, 10),
+ RK3066_PLL_RATE( 182750000, 8, 731, 12),
+ RK3066_PLL_RATE( 179500000, 4, 359, 12),
+ RK3066_PLL_RATE( 175500000, 4, 351, 12),
+ RK3066_PLL_RATE( 162000000, 1, 81, 12),
+ RK3066_PLL_RATE( 157500000, 4, 315, 12),
+ RK3066_PLL_RATE( 157000000, 12, 1099, 14),
+ RK3066_PLL_RATE( 156750000, 16, 1463, 14),
+ RK3066_PLL_RATE( 156000000, 1, 91, 14),
+ RK3066_PLL_RATE( 154000000, 6, 539, 14),
+ RK3066_PLL_RATE( 148500000, 8, 693, 14),
+ RK3066_PLL_RATE( 148250000, 8, 593, 12),
+ RK3066_PLL_RATE( 146250000, 16, 1365, 14),
+ RK3066_PLL_RATE( 140250000, 16, 1309, 14),
+ RK3066_PLL_RATE( 136750000, 6, 547, 16),
+ RK3066_PLL_RATE( 135000000, 1, 90, 16),
RK3066_PLL_RATE( 126000000, 1, 84, 16),
- RK3066_PLL_RATE( 48000000, 1, 64, 32),
+ RK3066_PLL_RATE( 122500000, 3, 245, 16),
+ RK3066_PLL_RATE( 121750000, 6, 487, 16),
+ RK3066_PLL_RATE( 119000000, 3, 238, 16),
+ RK3066_PLL_RATE( 117500000, 3, 235, 16),
+ RK3066_PLL_RATE( 115500000, 1, 77, 16),
+ RK3066_PLL_RATE( 108000000, 1, 72, 16),
+ RK3066_PLL_RATE( 106500000, 1, 71, 16),
+ RK3066_PLL_RATE( 102250000, 6, 409, 16),
+ RK3066_PLL_RATE( 101000000, 3, 202, 16),
+ RK3066_PLL_RATE( 94500000, 1, 63, 16),
+ RK3066_PLL_RATE( 88750000, 6, 355, 16),
+ RK3066_PLL_RATE( 85500000, 1, 57, 16),
+ RK3066_PLL_RATE( 83500000, 3, 167, 16),
+ RK3066_PLL_RATE( 79500000, 1, 53, 16),
+ RK3066_PLL_RATE( 78750000, 2, 105, 16),
+ RK3066_PLL_RATE( 75000000, 1, 50, 16),
+ RK3066_PLL_RATE( 74250000, 2, 99, 16),
+ RK3066_PLL_RATE( 73250000, 6, 293, 16),
+ RK3066_PLL_RATE( 72000000, 1, 48, 16),
+ RK3066_PLL_RATE( 71000000, 3, 142, 16),
+ RK3066_PLL_RATE( 68250000, 2, 91, 16),
+ RK3066_PLL_RATE( 65000000, 3, 130, 16),
+ RK3066_PLL_RATE( 56250000, 2, 75, 16),
+ RK3066_PLL_RATE( 50000000, 3, 100, 16),
+ RK3066_PLL_RATE( 49500000, 1, 33, 16),
+ RK3066_PLL_RATE( 40000000, 3, 80, 16),
+ RK3066_PLL_RATE( 36000000, 1, 24, 16),
+ RK3066_PLL_RATE( 35500000, 3, 71, 16),
+ RK3066_PLL_RATE( 33750000, 2, 45, 16),
+ RK3066_PLL_RATE( 31500000, 1, 21, 16),
{ /* sentinel */ },
};

View File

@ -17,6 +17,13 @@
</setting>
</group>
</category>
<category id="audio">
<group id="1">
<setting id="audiooutput.audiodevice">
<default>ALSA:hdmi:CARD=HDMI,DEV=0</default>
</setting>
</group>
</category>
<category id="logging">
<group id="1">
<setting id="debug.extralogging">

View File

@ -1,4 +1,4 @@
From abd68c63a163f8cd1efb40087f6a8569fafe7d64 Mon Sep 17 00:00:00 2001
From 65d921fb8b2ec126c5e1ff2b846c179d0ab0e4d1 Mon Sep 17 00:00:00 2001
From: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
Date: Thu, 19 Nov 2015 11:41:36 -0200
Subject: [PATCH] UPSTREAM: smsir.h: remove a now duplicated definition
@ -26,7 +26,7 @@ index fc8b7925c532..d9abd96ef48b 100644
struct ir_t {
From 8fcf408f26690b403ea41a34c419a7cf25430b4f Mon Sep 17 00:00:00 2001
From 3e5e8aa798a67f94158f7fbdfca9b31021ffab90 Mon Sep 17 00:00:00 2001
From: Jonas Karlman <jonas@kwiboo.se>
Date: Wed, 6 Sep 2017 18:39:09 +0200
Subject: [PATCH] [media] rc/keymaps: add keytable for Pine64 IR Remote
@ -135,7 +135,7 @@ index 7c4bbc4dfab4..3a34a9631dd1 100644
#define RC_MAP_PINNACLE_GREY "rc-pinnacle-grey"
#define RC_MAP_PINNACLE_PCTV_HD "rc-pinnacle-pctv-hd"
From 3b5e2f781693301e6ba4b3d9dcfc23f05402251c Mon Sep 17 00:00:00 2001
From 8eab80060ab0c45ed3843ea1ab1d355c2e61c417 Mon Sep 17 00:00:00 2001
From: Jonas Karlman <jonas@kwiboo.se>
Date: Wed, 6 Sep 2017 18:39:09 +0200
Subject: [PATCH] [media] rc/keymaps: add keytable for ODROID IR Remote
@ -231,7 +231,7 @@ index 3a34a9631dd1..f1badbfbca90 100644
#define RC_MAP_PINE64 "rc-pine64"
#define RC_MAP_PINNACLE_COLOR "rc-pinnacle-color"
From b78470cab538b641350de506371924b48c19455e Mon Sep 17 00:00:00 2001
From e4e4bf0e4ffdf3715d29ce0fdc40ac4942b0b509 Mon Sep 17 00:00:00 2001
From: Jonas Karlman <jonas@kwiboo.se>
Date: Wed, 6 Sep 2017 18:39:09 +0200
Subject: [PATCH] [media] rc/keymaps: add keytable for WeTek Hub Remote
@ -327,7 +327,7 @@ index f1badbfbca90..cd8590c99e22 100644
#define RC_MAP_VIDEOMATE_S350 "rc-videomate-s350"
#define RC_MAP_VIDEOMATE_TV_PVR "rc-videomate-tv-pvr"
From 03250f10b133c09eb0d8793b89afe760572c1f9e Mon Sep 17 00:00:00 2001
From c603eb8c844555707072415329d7bb2572d64fdf Mon Sep 17 00:00:00 2001
From: Jonas Karlman <jonas@kwiboo.se>
Date: Wed, 6 Sep 2017 18:39:09 +0200
Subject: [PATCH] [media] rc/keymaps: add keytable for WeTek Play 2 Remote
@ -453,3 +453,195 @@ index cd8590c99e22..93cac05a5170 100644
#define RC_MAP_VIDEOMATE_K100 "rc-videomate-k100"
#define RC_MAP_VIDEOMATE_S350 "rc-videomate-s350"
#define RC_MAP_VIDEOMATE_TV_PVR "rc-videomate-tv-pvr"
From 6c88a757042bd1f3ea3ec197aa930b7beb48e11a Mon Sep 17 00:00:00 2001
From: hzq <hzq@t-firefly.com>
Date: Mon, 19 Mar 2018 16:47:24 +0800
Subject: [PATCH] [media] rc/keymaps: add keytable for ROC-RK3328-CC Remote
Controller
---
drivers/media/rc/keymaps/Makefile | 1 +
drivers/media/rc/keymaps/rc-roc-cc.c | 52 ++++++++++++++++++++++++++++++++++++
include/media/rc-map.h | 1 +
3 files changed, 54 insertions(+)
create mode 100644 drivers/media/rc/keymaps/rc-roc-cc.c
diff --git a/drivers/media/rc/keymaps/Makefile b/drivers/media/rc/keymaps/Makefile
index 650481039f00..b743914487a5 100644
--- a/drivers/media/rc/keymaps/Makefile
+++ b/drivers/media/rc/keymaps/Makefile
@@ -83,6 +83,7 @@ obj-$(CONFIG_RC_MAP) += rc-adstech-dvb-t-pci.o \
rc-rc6-mce.o \
rc-real-audio-220-32-keys.o \
rc-reddo.o \
+ rc-roc-cc.o \
rc-snapstream-firefly.o \
rc-streamzap.o \
rc-tbs-nec.o \
diff --git a/drivers/media/rc/keymaps/rc-roc-cc.c b/drivers/media/rc/keymaps/rc-roc-cc.c
new file mode 100644
index 000000000000..3a2a255d5723
--- /dev/null
+++ b/drivers/media/rc/keymaps/rc-roc-cc.c
@@ -0,0 +1,52 @@
+/* Keytable for ROC-RK3328-CC IR Remote Controller
+ *
+ * Copyright (c) 2017 ROC-RK3328-CC
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+#include <media/rc-map.h>
+#include <linux/module.h>
+
+static struct rc_map_table roc_cc[] = {
+ { 0x28d7, KEY_POWER },
+ { 0xc837, KEY_MUTE },
+ { 0xe01f, KEY_ENTER},
+ { 0xc03f, KEY_UP },
+ { 0x40bf, KEY_DOWN },
+ { 0x708f, KEY_LEFT },
+ { 0x58a7, KEY_RIGHT },
+ { 0x1ae5, KEY_VOLUMEDOWN },
+ { 0xd02f, KEY_VOLUMEUP },
+ { 0x3ac5, KEY_WWW },
+ { 0x807f, KEY_BACK },
+ { 0x12ed, KEY_HOME },
+};
+
+static struct rc_map_list roc_cc_map = {
+ .map = {
+ .scan = roc_cc,
+ .size = ARRAY_SIZE(roc_cc),
+ .rc_type = RC_TYPE_NEC,
+ .name = RC_MAP_ROC_CC,
+ }
+};
+
+static int __init init_rc_map_roc_cc(void)
+{
+ return rc_map_register(&roc_cc_map);
+}
+
+static void __exit exit_rc_map_roc_cc(void)
+{
+ rc_map_unregister(&roc_cc_map);
+}
+
+module_init(init_rc_map_roc_cc)
+module_exit(exit_rc_map_roc_cc)
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("ROC-RK3328-CC");
diff --git a/include/media/rc-map.h b/include/media/rc-map.h
index 93cac05a5170..8bbe335e650c 100644
--- a/include/media/rc-map.h
+++ b/include/media/rc-map.h
@@ -191,6 +191,7 @@ void rc_map_init(void);
#define RC_MAP_RC6_MCE "rc-rc6-mce"
#define RC_MAP_REAL_AUDIO_220_32_KEYS "rc-real-audio-220-32-keys"
#define RC_MAP_REDDO "rc-reddo"
+#define RC_MAP_ROC_CC "rc-roc-cc"
#define RC_MAP_SNAPSTREAM_FIREFLY "rc-snapstream-firefly"
#define RC_MAP_STREAMZAP "rc-streamzap"
#define RC_MAP_TBS_NEC "rc-tbs-nec"
From 04a93492c4c715a6a826c93f69e0855ca5534e81 Mon Sep 17 00:00:00 2001
From: Jonas Karlman <jonas@kwiboo.se>
Date: Tue, 3 Jul 2018 21:55:56 +0200
Subject: [PATCH] [media] rc/keymaps: add keytable for T-Chip TRN9 IR Remote
Controller
---
drivers/media/rc/keymaps/Makefile | 1 +
drivers/media/rc/keymaps/rc-trn9.c | 52 ++++++++++++++++++++++++++++++++++++++
include/media/rc-map.h | 1 +
3 files changed, 54 insertions(+)
create mode 100644 drivers/media/rc/keymaps/rc-trn9.c
diff --git a/drivers/media/rc/keymaps/Makefile b/drivers/media/rc/keymaps/Makefile
index b743914487a5..2aaa1b33ddca 100644
--- a/drivers/media/rc/keymaps/Makefile
+++ b/drivers/media/rc/keymaps/Makefile
@@ -102,6 +102,7 @@ obj-$(CONFIG_RC_MAP) += rc-adstech-dvb-t-pci.o \
rc-tt-1500.o \
rc-twinhan-dtv-cab-ci.o \
rc-twinhan1027.o \
+ rc-trn9.o \
rc-wetek-hub.o \
rc-wetek-play-2.o \
rc-videomate-m1f.o \
diff --git a/drivers/media/rc/keymaps/rc-trn9.c b/drivers/media/rc/keymaps/rc-trn9.c
new file mode 100644
index 000000000000..f81bc3a419b3
--- /dev/null
+++ b/drivers/media/rc/keymaps/rc-trn9.c
@@ -0,0 +1,52 @@
+/* Keytable for T-Chip TRN9 IR Remote Controller
+ *
+ * Copyright (c) 2018 Omegamoon
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+#include <media/rc-map.h>
+#include <linux/module.h>
+
+static struct rc_map_table trn9[] = {
+ { 0x0014, KEY_POWER },
+ { 0x0013, KEY_MENU },
+ { 0x0003, KEY_UP },
+ { 0x0002, KEY_DOWN },
+ { 0x000e, KEY_LEFT },
+ { 0x001a, KEY_RIGHT },
+ { 0x0007, KEY_OK },
+ { 0x0058, KEY_VOLUMEDOWN },
+ { 0x005c, KEY_MUTE },
+ { 0x000b, KEY_VOLUMEUP },
+ { 0x0001, KEY_BACK },
+ { 0x0048, KEY_HOME },
+};
+
+static struct rc_map_list trn9_map = {
+ .map = {
+ .scan = trn9,
+ .size = ARRAY_SIZE(trn9),
+ .rc_type = RC_TYPE_NEC,
+ .name = RC_MAP_TRN9,
+ }
+};
+
+static int __init init_rc_map_trn9(void)
+{
+ return rc_map_register(&trn9_map);
+}
+
+static void __exit exit_rc_map_trn9(void)
+{
+ rc_map_unregister(&trn9_map);
+}
+
+module_init(init_rc_map_trn9)
+module_exit(exit_rc_map_trn9)
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Omegamoon");
diff --git a/include/media/rc-map.h b/include/media/rc-map.h
index 8bbe335e650c..66e1c50b38fc 100644
--- a/include/media/rc-map.h
+++ b/include/media/rc-map.h
@@ -210,6 +210,7 @@ void rc_map_init(void);
#define RC_MAP_TT_1500 "rc-tt-1500"
#define RC_MAP_TWINHAN_DTV_CAB_CI "rc-twinhan-dtv-cab-ci"
#define RC_MAP_TWINHAN_VP1027_DVBS "rc-twinhan1027"
+#define RC_MAP_TRN9 "rc-trn9"
#define RC_MAP_WETEK_HUB "rc-wetek-hub"
#define RC_MAP_WETEK_PLAY_2 "rc-wetek-play-2"
#define RC_MAP_VIDEOMATE_K100 "rc-videomate-k100"

View File

@ -1,4 +1,4 @@
From 830aaed8ea116ecac827f830729f1d57f96ac22e Mon Sep 17 00:00:00 2001
From dbd999a2a4e11f420098860e84bfb3c9151b4622 Mon Sep 17 00:00:00 2001
From: Jonas Karlman <jonas@kwiboo.se>
Date: Mon, 4 Sep 2017 22:34:19 +0200
Subject: [PATCH] BACKPORT: HDMI CEC support from v4.15
@ -2392,10 +2392,10 @@ index 000000000000..bdad4b197bcd
+ERESTARTSYS
+ The wait for a successful transmit was interrupted (e.g. by Ctrl-C).
diff --git a/MAINTAINERS b/MAINTAINERS
index b88e249026a1..bb1aa323019c 100644
index 443bc975b562..225ab2c1d35b 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -2657,6 +2657,22 @@ F: drivers/net/ieee802154/cc2520.c
@@ -2674,6 +2674,22 @@ F: drivers/net/ieee802154/cc2520.c
F: include/linux/spi/cc2520.h
F: Documentation/devicetree/bindings/net/ieee802154/cc2520.txt
@ -2781,7 +2781,7 @@ index 3f0f71adabb4..a639ea653c7e 100644
/**
diff --git a/fs/compat_ioctl.c b/fs/compat_ioctl.c
index dcf26537c935..1957c340878d 100644
index a52ca5cba015..b0b96fc01da3 100644
--- a/fs/compat_ioctl.c
+++ b/fs/compat_ioctl.c
@@ -57,6 +57,7 @@
@ -3041,7 +3041,7 @@ index 2758687300b4..41e8dff588e1 100644
/*
* MT_TOOL types
From d97e3abed49306c25ac724841c21c4705c55a6ea Mon Sep 17 00:00:00 2001
From 48d7f1f5bd8f2a2252158e7eda0d83975d7b170b Mon Sep 17 00:00:00 2001
From: Jonas Karlman <jonas@kwiboo.se>
Date: Mon, 4 Sep 2017 22:34:22 +0200
Subject: [PATCH] BACKPORT: Pulse Eight HDMI CEC from v4.15
@ -3061,10 +3061,10 @@ Subject: [PATCH] BACKPORT: Pulse Eight HDMI CEC from v4.15
create mode 100644 drivers/media/usb/pulse8-cec/pulse8-cec.c
diff --git a/MAINTAINERS b/MAINTAINERS
index bb1aa323019c..3ba807edf5c6 100644
index 225ab2c1d35b..0c1232c326a5 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -8637,6 +8637,13 @@ F: include/linux/tracehook.h
@@ -8673,6 +8673,13 @@ F: include/linux/tracehook.h
F: include/uapi/linux/ptrace.h
F: kernel/ptrace.c
@ -3944,7 +3944,7 @@ index becdd78295cc..4588c66a8df0 100644
#endif /* _UAPI_SERIO_H */
From 6af6d21e67410357403b1f99082ab2c825044657 Mon Sep 17 00:00:00 2001
From c9a3bba3534d8673f07a233e5298d12979ada5b8 Mon Sep 17 00:00:00 2001
From: Jonas Karlman <jonas@kwiboo.se>
Date: Mon, 4 Sep 2017 22:34:24 +0200
Subject: [PATCH] BACKPORT: RainShadow Tech HDMI CEC from v4.15
@ -3963,10 +3963,10 @@ Subject: [PATCH] BACKPORT: RainShadow Tech HDMI CEC from v4.15
create mode 100644 drivers/media/usb/rainshadow-cec/rainshadow-cec.c
diff --git a/MAINTAINERS b/MAINTAINERS
index 3ba807edf5c6..c6413ddaa627 100644
index 0c1232c326a5..551555a162c3 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -8876,6 +8876,13 @@ L: linux-fbdev@vger.kernel.org
@@ -8912,6 +8912,13 @@ L: linux-fbdev@vger.kernel.org
S: Maintained
F: drivers/video/fbdev/aty/aty128fb.c
@ -4427,7 +4427,7 @@ index 4588c66a8df0..89b72003fb68 100644
#endif /* _UAPI_SERIO_H */
From 4ceffb68390fda7643be488544dc25e439bc164d Mon Sep 17 00:00:00 2001
From d7ef718f1c62b9f4e0b7042d5b4040a14335c369 Mon Sep 17 00:00:00 2001
From: Jonas Karlman <jonas@kwiboo.se>
Date: Sat, 2 Sep 2017 16:23:11 +0200
Subject: [PATCH] [media] rc/keymaps: initialize rc-cec early
@ -4450,7 +4450,7 @@ index 354c8e724b8e..fb0c2b1f3814 100644
MODULE_LICENSE("GPL");
From 3365306ff585f94071383606546cd0f0000c1bb3 Mon Sep 17 00:00:00 2001
From e583e082ee42c04d3458ee71521175d39b4daed5 Mon Sep 17 00:00:00 2001
From: Jonas Karlman <jonas@kwiboo.se>
Date: Sat, 2 Sep 2017 16:23:11 +0200
Subject: [PATCH] drm/bridge: dw-hdmi: read edid on hpd event
@ -4460,10 +4460,10 @@ Subject: [PATCH] drm/bridge: dw-hdmi: read edid on hpd event
1 file changed, 19 insertions(+), 4 deletions(-)
diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
index a7f2e381a5bd..b98a1c828657 100644
index d57d999c50a5..4ae2735f59e4 100644
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
@@ -2465,6 +2465,7 @@ static void dw_hdmi_bridge_nop(struct drm_bridge *bridge)
@@ -2479,6 +2479,7 @@ static void dw_hdmi_bridge_nop(struct drm_bridge *bridge)
static enum drm_connector_status
dw_hdmi_connector_detect(struct drm_connector *connector, bool force)
{
@ -4471,7 +4471,7 @@ index a7f2e381a5bd..b98a1c828657 100644
struct dw_hdmi *hdmi = container_of(connector, struct dw_hdmi,
connector);
@@ -2474,7 +2475,24 @@ dw_hdmi_connector_detect(struct drm_connector *connector, bool force)
@@ -2488,7 +2489,24 @@ dw_hdmi_connector_detect(struct drm_connector *connector, bool force)
dw_hdmi_update_phy_mask(hdmi);
mutex_unlock(&hdmi->mutex);
@ -4497,7 +4497,7 @@ index a7f2e381a5bd..b98a1c828657 100644
}
static int dw_hdmi_connector_get_modes(struct drm_connector *connector)
@@ -2867,9 +2885,6 @@ static irqreturn_t dw_hdmi_irq(int irq, void *dev_id)
@@ -2891,9 +2909,6 @@ static irqreturn_t dw_hdmi_irq(int irq, void *dev_id)
dw_hdmi_update_phy_mask(hdmi);
}
mutex_unlock(&hdmi->mutex);

View File

@ -1,4 +1,4 @@
From d2ee02d81c40aef4fdf0278bd0dc529a1793af79 Mon Sep 17 00:00:00 2001
From dabace918ba0543c5a12e03fb823886891cd82dc Mon Sep 17 00:00:00 2001
From: Chris Zhong <zyw@rock-chips.com>
Date: Mon, 18 Jul 2016 22:34:34 +0800
Subject: [PATCH] UPSTREAM: ASoC: rockchip: correct the spdif clk
@ -18,7 +18,7 @@ Signed-off-by: Mark Brown <broonie@kernel.org>
1 file changed, 1 insertion(+), 16 deletions(-)
diff --git a/sound/soc/rockchip/rockchip_spdif.c b/sound/soc/rockchip/rockchip_spdif.c
index 44b8c72e6a16..feaba2ad6022 100644
index c211750b54ee..784941ca2408 100644
--- a/sound/soc/rockchip/rockchip_spdif.c
+++ b/sound/soc/rockchip/rockchip_spdif.c
@@ -105,21 +105,7 @@ static int rk_spdif_hw_params(struct snd_pcm_substream *substream,
@ -53,7 +53,7 @@ index 44b8c72e6a16..feaba2ad6022 100644
SPDIF_CFGR_CLK_DIV_MASK | SPDIF_CFGR_HALFWORD_ENABLE |
SDPIF_CFGR_VDW_MASK,
From 2316686749dfb94a33efc7f9238319c050f2c2e2 Mon Sep 17 00:00:00 2001
From 3069a5725338532939d13e3dc329f2b3d183b260 Mon Sep 17 00:00:00 2001
From: Sugar Zhang <sugar.zhang@rock-chips.com>
Date: Wed, 7 Sep 2016 14:30:21 +0800
Subject: [PATCH] UPSTREAM: ASoC: rockchip: spdif: restore register during
@ -70,10 +70,10 @@ Signed-off-by: Mark Brown <broonie@kernel.org>
1 file changed, 11 insertions(+), 1 deletion(-)
diff --git a/sound/soc/rockchip/rockchip_spdif.c b/sound/soc/rockchip/rockchip_spdif.c
index feaba2ad6022..cac85a5538d5 100644
index 784941ca2408..831e4caf29d3 100644
--- a/sound/soc/rockchip/rockchip_spdif.c
+++ b/sound/soc/rockchip/rockchip_spdif.c
@@ -69,6 +69,7 @@ static int rk_spdif_runtime_suspend(struct device *dev)
@@ -69,6 +69,7 @@ static int __maybe_unused rk_spdif_runtime_suspend(struct device *dev)
{
struct rk_spdif_dev *spdif = dev_get_drvdata(dev);
@ -81,7 +81,7 @@ index feaba2ad6022..cac85a5538d5 100644
clk_disable_unprepare(spdif->mclk);
clk_disable_unprepare(spdif->hclk);
@@ -92,7 +93,16 @@ static int rk_spdif_runtime_resume(struct device *dev)
@@ -92,7 +93,16 @@ static int __maybe_unused rk_spdif_runtime_resume(struct device *dev)
return ret;
}
@ -100,7 +100,7 @@ index feaba2ad6022..cac85a5538d5 100644
static int rk_spdif_hw_params(struct snd_pcm_substream *substream,
From f7d622d11eba15ed1a68b8aedfd920ee4ba5ab12 Mon Sep 17 00:00:00 2001
From d852c659ff563456480c55cfea53c578399c04ff Mon Sep 17 00:00:00 2001
From: Arnaud Pouliquen <arnaud.pouliquen@st.com>
Date: Tue, 3 Jan 2017 16:52:50 +0100
Subject: [PATCH] UPSTREAM: DRM: add help to get ELD speaker allocation
@ -148,7 +148,7 @@ index 85861b63e77a..55201e7e2ede 100644
int (*get_edid_block)(void *data, u8 *buf, unsigned int block,
size_t len),
From a0dc556877d94de213dd9522af39156f0a5bfe2b Mon Sep 17 00:00:00 2001
From 4e08e72298c858a65950b98ca62613fb95cd0a35 Mon Sep 17 00:00:00 2001
From: Arnaud Pouliquen <arnaud.pouliquen@st.com>
Date: Tue, 3 Jan 2017 16:52:51 +0100
Subject: [PATCH] UPSTREAM: ASoC: core: add optional pcm_new callback for DAI
@ -183,10 +183,10 @@ index 212eaaf172ed..345e4f8ee93f 100644
bool bus_control;
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
index 49263f3a50b0..c583022d7910 100644
index 3c6713da3ad9..e46e80c0e07d 100644
--- a/sound/soc/soc-core.c
+++ b/sound/soc/soc-core.c
@@ -1277,6 +1277,27 @@ static int soc_probe_dai(struct snd_soc_dai *dai, int order)
@@ -1289,6 +1289,27 @@ static int soc_probe_dai(struct snd_soc_dai *dai, int order)
return 0;
}
@ -214,7 +214,7 @@ index 49263f3a50b0..c583022d7910 100644
static int soc_link_dai_widgets(struct snd_soc_card *card,
struct snd_soc_dai_link *dai_link,
struct snd_soc_pcm_runtime *rtd)
@@ -1388,6 +1409,13 @@ static int soc_probe_link_dais(struct snd_soc_card *card, int num, int order)
@@ -1400,6 +1421,13 @@ static int soc_probe_link_dais(struct snd_soc_card *card, int num, int order)
dai_link->stream_name, ret);
return ret;
}
@ -229,7 +229,7 @@ index 49263f3a50b0..c583022d7910 100644
INIT_DELAYED_WORK(&rtd->delayed_work,
codec2codec_close_delayed_work);
From 5c39a02d6f966de9f9f26a98a401c90651ebeb41 Mon Sep 17 00:00:00 2001
From 900f1d7bb2cddd1f445e0f3ef92fb0f7056a4c5a Mon Sep 17 00:00:00 2001
From: Arnaud Pouliquen <arnaud.pouliquen@st.com>
Date: Tue, 3 Jan 2017 16:52:52 +0100
Subject: [PATCH] UPSTREAM: ASoC: hdmi-codec: add channel mapping control
@ -715,7 +715,7 @@ index 028d60c196ae..cb78d8971b41 100644
snd_soc_unregister_codec(&pdev->dev);
return 0;
From 4eb5c7bce96c6856f0e949e598bd9f8ec21d7b56 Mon Sep 17 00:00:00 2001
From 5ad6154eea74dec3635e2417f06ad12d3f0a36c4 Mon Sep 17 00:00:00 2001
From: Christophe Jaillet <christophe.jaillet@wanadoo.fr>
Date: Thu, 15 Jun 2017 07:53:11 +0200
Subject: [PATCH] UPSTREAM: ASoC: rockchip: Fix an error handling in
@ -734,7 +734,7 @@ Signed-off-by: Mark Brown <broonie@kernel.org>
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/sound/soc/rockchip/rockchip_i2s.c b/sound/soc/rockchip/rockchip_i2s.c
index 7687368779db..5a3436351efb 100644
index b359639c1038..02ff642499bf 100644
--- a/sound/soc/rockchip/rockchip_i2s.c
+++ b/sound/soc/rockchip/rockchip_i2s.c
@@ -658,12 +658,13 @@ static int rockchip_i2s_probe(struct platform_device *pdev)
@ -756,7 +756,7 @@ index 7687368779db..5a3436351efb 100644
if (val >= 2 && val <= 8)
soc_dai->playback.channels_max = val;
From 3fd7ca46725a4a16a1a52530ac2421bc8e037088 Mon Sep 17 00:00:00 2001
From 9aeca2222a8f8a700c446fc9a38235ab2e3a4efd Mon Sep 17 00:00:00 2001
From: Markus Elfring <elfring@users.sourceforge.net>
Date: Thu, 10 Aug 2017 18:38:09 +0200
Subject: [PATCH] UPSTREAM: ASoC: rockchip: Delete an error message for a
@ -775,7 +775,7 @@ Signed-off-by: Mark Brown <broonie@kernel.org>
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/sound/soc/rockchip/rockchip_i2s.c b/sound/soc/rockchip/rockchip_i2s.c
index 5a3436351efb..1da10e79a1bb 100644
index 02ff642499bf..16ff8d5e0033 100644
--- a/sound/soc/rockchip/rockchip_i2s.c
+++ b/sound/soc/rockchip/rockchip_i2s.c
@@ -594,10 +594,8 @@ static int rockchip_i2s_probe(struct platform_device *pdev)
@ -791,7 +791,7 @@ index 5a3436351efb..1da10e79a1bb 100644
i2s->dev = &pdev->dev;
From d6adb14ce27f7ef3687c6d965e781782329c790d Mon Sep 17 00:00:00 2001
From dad1bc0769692d7fd45701a4ab3fb55be012e01e Mon Sep 17 00:00:00 2001
From: John Keeping <john@metanate.com>
Date: Thu, 14 Sep 2017 16:58:55 +0100
Subject: [PATCH] UPSTREAM: ASoC: rockchip: i2s: fix unbalanced clk_disable
@ -808,10 +808,10 @@ Signed-off-by: Mark Brown <broonie@kernel.org>
1 file changed, 1 deletion(-)
diff --git a/sound/soc/rockchip/rockchip_i2s.c b/sound/soc/rockchip/rockchip_i2s.c
index 1da10e79a1bb..f131dba7645d 100644
index 16ff8d5e0033..986ad2efc8e9 100644
--- a/sound/soc/rockchip/rockchip_i2s.c
+++ b/sound/soc/rockchip/rockchip_i2s.c
@@ -713,7 +713,6 @@ static int rockchip_i2s_remove(struct platform_device *pdev)
@@ -727,7 +727,6 @@ static int rockchip_i2s_remove(struct platform_device *pdev)
if (!pm_runtime_status_suspended(&pdev->dev))
i2s_runtime_suspend(&pdev->dev);
@ -820,77 +820,7 @@ index 1da10e79a1bb..f131dba7645d 100644
return 0;
From 2c4899311942a4aaf098faf513ac7200cbc71f11 Mon Sep 17 00:00:00 2001
From: Stefan Potyra <Stefan.Potyra@elektrobit.com>
Date: Wed, 6 Dec 2017 16:03:24 +0100
Subject: [PATCH] UPSTREAM: ASoC: rockchip: disable clock on error
Disable the clocks in rk_spdif_probe when an error occurs after one
of the clocks has been enabled previously.
Found by Linux Driver Verification project (linuxtesting.org).
Fixes: f874b80e1571 ASoC: rockchip: Add rockchip SPDIF transceiver driver
Signed-off-by: Stefan Potyra <Stefan.Potyra@elektrobit.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
(cherry picked from commit c7b92172a61b91936be985cb9bc499a4ebc6489b)
---
sound/soc/rockchip/rockchip_spdif.c | 18 +++++++++++++-----
1 file changed, 13 insertions(+), 5 deletions(-)
diff --git a/sound/soc/rockchip/rockchip_spdif.c b/sound/soc/rockchip/rockchip_spdif.c
index cac85a5538d5..6ff8b195acf4 100644
--- a/sound/soc/rockchip/rockchip_spdif.c
+++ b/sound/soc/rockchip/rockchip_spdif.c
@@ -322,26 +322,30 @@ static int rk_spdif_probe(struct platform_device *pdev)
spdif->mclk = devm_clk_get(&pdev->dev, "mclk");
if (IS_ERR(spdif->mclk)) {
dev_err(&pdev->dev, "Can't retrieve rk_spdif master clock\n");
- return PTR_ERR(spdif->mclk);
+ ret = PTR_ERR(spdif->mclk);
+ goto err_disable_hclk;
}
ret = clk_prepare_enable(spdif->mclk);
if (ret) {
dev_err(spdif->dev, "clock enable failed %d\n", ret);
- return ret;
+ goto err_disable_clocks;
}
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
regs = devm_ioremap_resource(&pdev->dev, res);
- if (IS_ERR(regs))
- return PTR_ERR(regs);
+ if (IS_ERR(regs)) {
+ ret = PTR_ERR(regs);
+ goto err_disable_clocks;
+ }
spdif->regmap = devm_regmap_init_mmio_clk(&pdev->dev, "hclk", regs,
&rk_spdif_regmap_config);
if (IS_ERR(spdif->regmap)) {
dev_err(&pdev->dev,
"Failed to initialise managed register map\n");
- return PTR_ERR(spdif->regmap);
+ ret = PTR_ERR(spdif->regmap);
+ goto err_disable_clocks;
}
spdif->playback_dma_data.addr = res->start + SPDIF_SMPDR;
@@ -373,6 +377,10 @@ static int rk_spdif_probe(struct platform_device *pdev)
err_pm_runtime:
pm_runtime_disable(&pdev->dev);
+err_disable_clocks:
+ clk_disable_unprepare(spdif->mclk);
+err_disable_hclk:
+ clk_disable_unprepare(spdif->hclk);
return ret;
}
From 4cc851cd3ae5216602422e85bde844f1ff0e592c Mon Sep 17 00:00:00 2001
From 20b260f46771f7313ecd6e296ec6c08a43967eb4 Mon Sep 17 00:00:00 2001
From: John Keeping <john@metanate.com>
Date: Mon, 8 Jan 2018 16:01:04 +0000
Subject: [PATCH] UPSTREAM: ASoC: rockchip: i2s: fix playback after runtime
@ -926,7 +856,7 @@ Signed-off-by: John Keeping <john@metanate.com>
1 file changed, 6 insertions(+)
diff --git a/sound/soc/rockchip/rockchip_i2s.c b/sound/soc/rockchip/rockchip_i2s.c
index f131dba7645d..0b9bb973b5a7 100644
index 986ad2efc8e9..5297373fe6c4 100644
--- a/sound/soc/rockchip/rockchip_i2s.c
+++ b/sound/soc/rockchip/rockchip_i2s.c
@@ -514,6 +514,7 @@ static bool rockchip_i2s_rd_reg(struct device *dev, unsigned int reg)
@ -957,7 +887,7 @@ index f131dba7645d..0b9bb973b5a7 100644
return false;
}
From 4d40b158d955d27eef520c49f221cd7ed31d9ae0 Mon Sep 17 00:00:00 2001
From fa8e48f2fd0abe00ee0f04128a2e9b4fed184c3f Mon Sep 17 00:00:00 2001
From: Romain Perier <romain.perier@collabora.com>
Date: Fri, 14 Apr 2017 10:31:12 +0200
Subject: [PATCH] UPSTREAM: drm: dw-hdmi: add specific I2S and AHB functions
@ -981,23 +911,24 @@ Signed-off-by: Archit Taneja <architt@codeaurora.org>
Link: http://patchwork.freedesktop.org/patch/msgid/20170414083113.4255-2-romain.perier@collabora.com
(cherry picked from commit a7d555d2f2bd675d641e742a202a5e4b37d4d019)
---
drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 26 ++++++++++++++++++++++++--
1 file changed, 24 insertions(+), 2 deletions(-)
drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 27 +++++++++++++++++++++++++--
1 file changed, 25 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
index a7f2e381a5bd..da4340491fea 100644
index d57d999c50a5..0541d96be662 100644
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
@@ -261,6 +261,8 @@ struct dw_hdmi {
void (*write)(struct dw_hdmi *hdmi, u8 val, int offset);
@@ -263,6 +263,9 @@ struct dw_hdmi {
u8 (*read)(struct dw_hdmi *hdmi, int offset);
bool initialized; /* hdmi is enabled before bind */
+
+ void (*enable_audio)(struct dw_hdmi *hdmi);
+ void (*disable_audio)(struct dw_hdmi *hdmi);
};
#define HDMI_IH_PHY_STAT0_RX_SENSE \
@@ -811,13 +813,29 @@ void dw_hdmi_set_sample_rate(struct dw_hdmi *hdmi, unsigned int rate)
@@ -821,13 +824,29 @@ void dw_hdmi_set_sample_rate(struct dw_hdmi *hdmi, unsigned int rate)
}
EXPORT_SYMBOL_GPL(dw_hdmi_set_sample_rate);
@ -1028,7 +959,7 @@ index a7f2e381a5bd..da4340491fea 100644
spin_unlock_irqrestore(&hdmi->audio_lock, flags);
}
EXPORT_SYMBOL_GPL(dw_hdmi_audio_enable);
@@ -828,7 +846,8 @@ void dw_hdmi_audio_disable(struct dw_hdmi *hdmi)
@@ -838,7 +857,8 @@ void dw_hdmi_audio_disable(struct dw_hdmi *hdmi)
spin_lock_irqsave(&hdmi->audio_lock, flags);
hdmi->audio_enable = false;
@ -1038,7 +969,7 @@ index a7f2e381a5bd..da4340491fea 100644
spin_unlock_irqrestore(&hdmi->audio_lock, flags);
}
EXPORT_SYMBOL_GPL(dw_hdmi_audio_disable);
@@ -3677,6 +3696,8 @@ int dw_hdmi_bind(struct device *dev, struct device *master,
@@ -3706,6 +3726,8 @@ int dw_hdmi_bind(struct device *dev, struct device *master,
audio.irq = irq;
audio.hdmi = hdmi;
audio.eld = hdmi->connector.eld;
@ -1047,7 +978,7 @@ index a7f2e381a5bd..da4340491fea 100644
pdevinfo.name = "dw-hdmi-ahb-audio";
pdevinfo.data = &audio;
@@ -3690,6 +3711,7 @@ int dw_hdmi_bind(struct device *dev, struct device *master,
@@ -3719,6 +3741,7 @@ int dw_hdmi_bind(struct device *dev, struct device *master,
audio.write = hdmi_writeb;
audio.read = hdmi_readb;
audio.mod = hdmi_modb;
@ -1056,7 +987,7 @@ index a7f2e381a5bd..da4340491fea 100644
pdevinfo.name = "dw-hdmi-i2s-audio";
pdevinfo.data = &audio;
From 4ea3fd9308b3bc3b5e7699e4a52e3f7bca6e857e Mon Sep 17 00:00:00 2001
From f856228e8933ba1e6375dbda53cc59da8d71647a Mon Sep 17 00:00:00 2001
From: Romain Perier <romain.perier@collabora.com>
Date: Thu, 20 Apr 2017 14:34:34 +0530
Subject: [PATCH] UPSTREAM: drm: dw-hdmi: gate audio clock from the I2S
@ -1084,10 +1015,10 @@ Signed-off-by: Archit Taneja <architt@codeaurora.org>
1 file changed, 17 insertions(+), 7 deletions(-)
diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
index da4340491fea..e1a5966ce394 100644
index 0541d96be662..f3a2034a0883 100644
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
@@ -813,6 +813,15 @@ void dw_hdmi_set_sample_rate(struct dw_hdmi *hdmi, unsigned int rate)
@@ -824,6 +824,15 @@ void dw_hdmi_set_sample_rate(struct dw_hdmi *hdmi, unsigned int rate)
}
EXPORT_SYMBOL_GPL(dw_hdmi_set_sample_rate);
@ -1103,7 +1034,7 @@ index da4340491fea..e1a5966ce394 100644
static void dw_hdmi_ahb_audio_enable(struct dw_hdmi *hdmi)
{
hdmi_set_cts_n(hdmi, hdmi->audio_cts, hdmi->audio_n);
@@ -826,6 +835,12 @@ static void dw_hdmi_ahb_audio_disable(struct dw_hdmi *hdmi)
@@ -837,6 +846,12 @@ static void dw_hdmi_ahb_audio_disable(struct dw_hdmi *hdmi)
static void dw_hdmi_i2s_audio_enable(struct dw_hdmi *hdmi)
{
hdmi_set_cts_n(hdmi, hdmi->audio_cts, hdmi->audio_n);
@ -1116,7 +1047,7 @@ index da4340491fea..e1a5966ce394 100644
}
void dw_hdmi_audio_enable(struct dw_hdmi *hdmi)
@@ -2138,12 +2153,6 @@ static void dw_hdmi_enable_video_path(struct dw_hdmi *hdmi)
@@ -2149,12 +2164,6 @@ static void dw_hdmi_enable_video_path(struct dw_hdmi *hdmi)
HDMI_MC_FLOWCTRL);
}
@ -1129,7 +1060,7 @@ index da4340491fea..e1a5966ce394 100644
/* Workaround to clear the overflow condition */
static void dw_hdmi_clear_overflow(struct dw_hdmi *hdmi)
{
@@ -2295,7 +2304,7 @@ static int dw_hdmi_setup(struct dw_hdmi *hdmi, struct drm_display_mode *mode)
@@ -2306,7 +2315,7 @@ static int dw_hdmi_setup(struct dw_hdmi *hdmi, struct drm_display_mode *mode)
/* HDMI Initialization Step E - Configure audio */
hdmi_clk_regenerator_update_pixel_clock(hdmi);
@ -1138,7 +1069,7 @@ index da4340491fea..e1a5966ce394 100644
}
/* not for DVI mode */
@@ -3712,6 +3721,7 @@ int dw_hdmi_bind(struct device *dev, struct device *master,
@@ -3742,6 +3751,7 @@ int dw_hdmi_bind(struct device *dev, struct device *master,
audio.read = hdmi_readb;
audio.mod = hdmi_modb;
hdmi->enable_audio = dw_hdmi_i2s_audio_enable;
@ -1147,7 +1078,7 @@ index da4340491fea..e1a5966ce394 100644
pdevinfo.name = "dw-hdmi-i2s-audio";
pdevinfo.data = &audio;
From df0540deb663a3d0b3852b88ded0817146f20e67 Mon Sep 17 00:00:00 2001
From 5736074e471dc5306e07581bf0958043cf434341 Mon Sep 17 00:00:00 2001
From: Jonas Karlman <jonas@kwiboo.se>
Date: Mon, 7 Aug 2017 22:24:15 +0200
Subject: [PATCH] drm: dw-hdmi-i2s: sync with upstream
@ -1226,7 +1157,7 @@ index f1f62d8c1d16..5ff993a35ab6 100644
.name = DRIVER_NAME,
.owner = THIS_MODULE,
From 8835208cc656c44c6c1238f637a428f6f5403bf4 Mon Sep 17 00:00:00 2001
From d2f29756df76806c12fa12b668aeb8ac5f626bdd Mon Sep 17 00:00:00 2001
From: Jonas Karlman <jonas@kwiboo.se>
Date: Sun, 2 Apr 2017 11:33:39 +0200
Subject: [PATCH] drm: dw-hdmi-i2s: implement get_eld
@ -1283,10 +1214,10 @@ index 5ff993a35ab6..e7312571e2cb 100644
static int snd_dw_hdmi_probe(struct platform_device *pdev)
diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
index e1a5966ce394..605a55e3693d 100644
index f3a2034a0883..c222b6455f03 100644
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
@@ -3720,6 +3720,7 @@ int dw_hdmi_bind(struct device *dev, struct device *master,
@@ -3750,6 +3750,7 @@ int dw_hdmi_bind(struct device *dev, struct device *master,
audio.write = hdmi_writeb;
audio.read = hdmi_readb;
audio.mod = hdmi_modb;
@ -1295,7 +1226,7 @@ index e1a5966ce394..605a55e3693d 100644
hdmi->disable_audio = dw_hdmi_i2s_audio_disable;
From 572da20ab103a328f7b3afdb78c93fb62947ff78 Mon Sep 17 00:00:00 2001
From 18a9fcdb5cbde0462179d04336622cb4f97c2a7e Mon Sep 17 00:00:00 2001
From: Jonas Karlman <jonas@kwiboo.se>
Date: Mon, 17 Apr 2017 13:09:16 +0200
Subject: [PATCH] drm: dw-hdmi-i2s: configure channel allocation
@ -1318,29 +1249,7 @@ index e7312571e2cb..1d4570e3fbed 100644
/* Set LFEPBLDOWN-MIX INH and LSV */
hdmi_write(audio, 0x00, HDMI_FC_AUDICONF3);
From 1f19793a9437b295d7dfca822f511e487c47ef4a Mon Sep 17 00:00:00 2001
From: Jonas Karlman <jonas@kwiboo.se>
Date: Tue, 2 May 2017 18:57:19 +0200
Subject: [PATCH] ASoC: hdmi-codec: fix I2S audio in Kodi
---
sound/soc/codecs/hdmi-codec.c | 1 -
1 file changed, 1 deletion(-)
diff --git a/sound/soc/codecs/hdmi-codec.c b/sound/soc/codecs/hdmi-codec.c
index cb78d8971b41..9ebca57014e4 100644
--- a/sound/soc/codecs/hdmi-codec.c
+++ b/sound/soc/codecs/hdmi-codec.c
@@ -758,7 +758,6 @@ static struct snd_soc_dai_driver hdmi_i2s_dai = {
.channels_max = 8,
.rates = HDMI_RATES,
.formats = I2S_FORMATS,
- .sig_bits = 24,
},
.ops = &hdmi_dai_ops,
.pcm_new = hdmi_codec_pcm_new,
From 559c23102f957335d697de310dce921f72fff040 Mon Sep 17 00:00:00 2001
From c19ba12d08a8c491d21a1daf305b1b58231ca362 Mon Sep 17 00:00:00 2001
From: Jonas Karlman <jonas@kwiboo.se>
Date: Mon, 14 Aug 2017 00:14:05 +0200
Subject: [PATCH] ASoC: hdmi-codec: reorder channel map
@ -1350,7 +1259,7 @@ Subject: [PATCH] ASoC: hdmi-codec: reorder channel map
1 file changed, 52 insertions(+), 61 deletions(-)
diff --git a/sound/soc/codecs/hdmi-codec.c b/sound/soc/codecs/hdmi-codec.c
index 9ebca57014e4..e65060ae8ffc 100644
index cb78d8971b41..b74659bc3bbc 100644
--- a/sound/soc/codecs/hdmi-codec.c
+++ b/sound/soc/codecs/hdmi-codec.c
@@ -205,78 +205,69 @@ const struct snd_pcm_chmap_elem hdmi_codec_8ch_chmaps[] = {
@ -1485,7 +1394,7 @@ index 9ebca57014e4..e65060ae8ffc 100644
struct hdmi_codec_priv {
From d6e589fc6c9211db345d667545f191e187640e41 Mon Sep 17 00:00:00 2001
From 0b22ce2a2766052fe28a3162623d19ba38adaef5 Mon Sep 17 00:00:00 2001
From: Jonas Karlman <jonas@kwiboo.se>
Date: Sun, 27 Aug 2017 23:32:40 +0200
Subject: [PATCH] ASoC: codecs: rk3328: limit to working rates
@ -1513,20 +1422,109 @@ index af1b7429b6d4..d0b4578ffa0e 100644
SNDRV_PCM_FMTBIT_S20_3LE |
SNDRV_PCM_FMTBIT_S24_LE |
From 8f4b1d8cd40d4e052214c4abc200ab68f1a4bb78 Mon Sep 17 00:00:00 2001
From f96be8cf25bfda88d5c492f42e1f6ca5951356f3 Mon Sep 17 00:00:00 2001
From: Jonas Karlman <jonas@kwiboo.se>
Date: Mon, 14 Aug 2017 00:14:05 +0200
Date: Sun, 8 Jul 2018 12:34:43 +0200
Subject: [PATCH] drm: dw-hdmi: change audio config
---
drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 14 +++++---------
1 file changed, 5 insertions(+), 9 deletions(-)
drivers/gpu/drm/bridge/synopsys/dw-hdmi-i2s-audio.c | 9 ++-------
drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 15 ++++++++++++---
2 files changed, 14 insertions(+), 10 deletions(-)
diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-i2s-audio.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-i2s-audio.c
index 1d4570e3fbed..d0904f6b7a82 100644
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-i2s-audio.c
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-i2s-audio.c
@@ -110,8 +110,7 @@ static int dw_hdmi_i2s_hw_params(struct device *dev, void *data,
HDMI_AUD_INT_FIFO_FULL_MSK, HDMI_AUD_INT);
hdmi_update_bits(audio, HDMI_AUD_CONF0_SW_RESET,
HDMI_AUD_CONF0_SW_RESET, HDMI_AUD_CONF0);
- hdmi_update_bits(audio, HDMI_MC_SWRSTZ_I2S_RESET_MSK,
- HDMI_MC_SWRSTZ_I2S_RESET_MSK, HDMI_MC_SWRSTZ);
+ hdmi_write(audio, (u8)~HDMI_MC_SWRSTZ_I2S_RESET_MSK, HDMI_MC_SWRSTZ);
switch (hparms->mode) {
case NLPCM:
@@ -193,11 +192,6 @@ static int dw_hdmi_i2s_hw_params(struct device *dev, void *data,
/* Set LFEPBLDOWN-MIX INH and LSV */
hdmi_write(audio, 0x00, HDMI_FC_AUDICONF3);
- hdmi_update_bits(audio, HDMI_AUD_CONF0_SW_RESET,
- HDMI_AUD_CONF0_SW_RESET, HDMI_AUD_CONF0);
- hdmi_update_bits(audio, HDMI_MC_SWRSTZ_I2S_RESET_MSK,
- HDMI_MC_SWRSTZ_I2S_RESET_MSK, HDMI_MC_SWRSTZ);
-
dw_hdmi_audio_enable(hdmi);
return 0;
@@ -211,6 +205,7 @@ static void dw_hdmi_i2s_audio_shutdown(struct device *dev, void *data)
dw_hdmi_audio_disable(hdmi);
hdmi_write(audio, HDMI_AUD_CONF0_SW_RESET, HDMI_AUD_CONF0);
+ hdmi_write(audio, (u8)~HDMI_MC_SWRSTZ_I2S_RESET_MSK, HDMI_MC_SWRSTZ);
}
static int dw_hdmi_i2s_get_eld(struct device *dev, void *data, u8 *buf, size_t len)
diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
index 605a55e3693d..661b1259ebe0 100644
index c222b6455f03..065723179791 100644
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
@@ -628,18 +628,14 @@ static struct i2c_adapter *dw_hdmi_i2c_adapter(struct dw_hdmi *hdmi)
@@ -89,6 +89,7 @@ static const struct dw_hdmi_audio_tmds_n common_tmds_n_table[] = {
{ .tmds = 71000000, .n_32k = 4096, .n_44k1 = 7056, .n_48k = 6144, },
{ .tmds = 72000000, .n_32k = 4096, .n_44k1 = 5635, .n_48k = 6144, },
{ .tmds = 73250000, .n_32k = 4096, .n_44k1 = 14112, .n_48k = 6144, },
+ { .tmds = 74176000, .n_32k = 11648, .n_44k1 = 17836, .n_48k = 11648, },
{ .tmds = 74250000, .n_32k = 4096, .n_44k1 = 6272, .n_48k = 6144, },
{ .tmds = 75000000, .n_32k = 4096, .n_44k1 = 5880, .n_48k = 6144, },
{ .tmds = 78750000, .n_32k = 4096, .n_44k1 = 5600, .n_48k = 6144, },
@@ -105,13 +106,16 @@ static const struct dw_hdmi_audio_tmds_n common_tmds_n_table[] = {
{ .tmds = 119000000, .n_32k = 4096, .n_44k1 = 5544, .n_48k = 6144, },
{ .tmds = 135000000, .n_32k = 4096, .n_44k1 = 5488, .n_48k = 6144, },
{ .tmds = 146250000, .n_32k = 4096, .n_44k1 = 6272, .n_48k = 6144, },
- { .tmds = 148500000, .n_32k = 4096, .n_44k1 = 5488, .n_48k = 6144, },
+ { .tmds = 148352000, .n_32k = 11648, .n_44k1 = 8918, .n_48k = 5824, },
+ { .tmds = 148500000, .n_32k = 4096, .n_44k1 = 6272, .n_48k = 6144, },
{ .tmds = 154000000, .n_32k = 4096, .n_44k1 = 5544, .n_48k = 6144, },
{ .tmds = 162000000, .n_32k = 4096, .n_44k1 = 5684, .n_48k = 6144, },
/* For 297 MHz+ HDMI spec have some other rule for setting N */
- { .tmds = 297000000, .n_32k = 3073, .n_44k1 = 4704, .n_48k = 5120, },
- { .tmds = 594000000, .n_32k = 3073, .n_44k1 = 9408, .n_48k = 10240, },
+ { .tmds = 296703000, .n_32k = 5824, .n_44k1 = 4459, .n_48k = 5824, },
+ { .tmds = 297000000, .n_32k = 3072, .n_44k1 = 4704, .n_48k = 5120, },
+ { .tmds = 593407000, .n_32k = 5824, .n_44k1 = 8918, .n_48k = 5824, },
+ { .tmds = 594000000, .n_32k = 3072, .n_44k1 = 9408, .n_48k = 6144, },
/* End of table */
{ .tmds = 0, .n_32k = 0, .n_44k1 = 0, .n_48k = 0, },
@@ -831,6 +835,11 @@ static void hdmi_enable_audio_clk(struct dw_hdmi *hdmi, bool enable)
else
hdmi->mc_clkdis |= HDMI_MC_CLKDIS_AUDCLK_DISABLE;
hdmi_writeb(hdmi, hdmi->mc_clkdis, HDMI_MC_CLKDIS);
+
+ if (enable) {
+ hdmi_set_cts_n(hdmi, 0, 0);
+ hdmi_set_cts_n(hdmi, hdmi->audio_cts, hdmi->audio_n);
+ }
}
static void dw_hdmi_ahb_audio_enable(struct dw_hdmi *hdmi)
From ed2e01d46f3bbf3eda4d37ce2a6e8874b15a478a Mon Sep 17 00:00:00 2001
From: Jonas Karlman <jonas@kwiboo.se>
Date: Sun, 8 Jul 2018 12:56:51 +0200
Subject: [PATCH] WIP: drm: dw-hdmi: use Auto CTS mode
---
drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 52 ++++++++++++++++++-------------
1 file changed, 31 insertions(+), 21 deletions(-)
diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
index 065723179791..841bdfcae3e0 100644
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
@@ -643,14 +643,18 @@ static struct i2c_adapter *dw_hdmi_i2c_adapter(struct dw_hdmi *hdmi)
static void hdmi_set_cts_n(struct dw_hdmi *hdmi, unsigned int cts,
unsigned int n)
{
@ -1535,35 +1533,65 @@ index 605a55e3693d..661b1259ebe0 100644
-
- /* nshift factor = 0 */
- hdmi_modb(hdmi, 0, HDMI_AUD_CTS3_N_SHIFT_MASK, HDMI_AUD_CTS3);
+ hdmi_modb(hdmi, 0x80, 0x80, HDMI_AUD_N3);
hdmi_writeb(hdmi, ((cts >> 16) & HDMI_AUD_CTS3_AUDCTS19_16_MASK) |
HDMI_AUD_CTS3_CTS_MANUAL, HDMI_AUD_CTS3);
-
- hdmi_writeb(hdmi, ((cts >> 16) & HDMI_AUD_CTS3_AUDCTS19_16_MASK) |
- HDMI_AUD_CTS3_CTS_MANUAL, HDMI_AUD_CTS3);
+ /* Use Auto CTS mode with CTS is unknown */
+ if (cts) {
+ /* Must be set/cleared first */
+ hdmi_modb(hdmi, 0, HDMI_AUD_CTS3_CTS_MANUAL, HDMI_AUD_CTS3);
+
+ /* nshift factor = 0 */
+ hdmi_modb(hdmi, 0, HDMI_AUD_CTS3_N_SHIFT_MASK, HDMI_AUD_CTS3);
+
+ hdmi_writeb(hdmi, ((cts >> 16) & HDMI_AUD_CTS3_AUDCTS19_16_MASK) |
+ HDMI_AUD_CTS3_CTS_MANUAL, HDMI_AUD_CTS3);
+ } else
+ hdmi_writeb(hdmi, 0, HDMI_AUD_CTS3);
hdmi_writeb(hdmi, (cts >> 8) & 0xff, HDMI_AUD_CTS2);
hdmi_writeb(hdmi, cts & 0xff, HDMI_AUD_CTS1);
- hdmi_writeb(hdmi, (n >> 16) & 0x0f, HDMI_AUD_N3);
+ hdmi_writeb(hdmi, ((n >> 16) & 0x0f) | 0x80, HDMI_AUD_N3);
hdmi_writeb(hdmi, (n >> 8) & 0xff, HDMI_AUD_N2);
hdmi_writeb(hdmi, n & 0xff, HDMI_AUD_N1);
}
@@ -784,7 +780,7 @@ static void hdmi_set_clk_regenerator(struct dw_hdmi *hdmi,
@@ -777,24 +781,30 @@ static void hdmi_set_clk_regenerator(struct dw_hdmi *hdmi,
{
unsigned long ftdms = pixel_clk;
unsigned int n, cts;
+ u8 config3;
u64 tmp;
n = hdmi_find_n(hdmi, pixel_clk, sample_rate);
- /*
- * Compute the CTS value from the N value. Note that CTS and N
- * can be up to 20 bits in total, so we need 64-bit math. Also
- * note that our TDMS clock is not fully accurate; it is accurate
- * to kHz. This can introduce an unnecessary remainder in the
- * calculation below, so we don't try to warn about that.
- */
- tmp = (u64)ftdms * n;
- do_div(tmp, 128 * sample_rate);
- cts = tmp;
+ config3 = hdmi_readb(hdmi, HDMI_CONFIG3_ID);
- dev_dbg(hdmi->dev, "%s: fs=%uHz ftdms=%lu.%03luMHz N=%d cts=%d\n",
- __func__, sample_rate, ftdms / 1000000, (ftdms / 1000) % 1000,
- n, cts);
+ if (config3 & HDMI_CONFIG3_AHBAUDDMA) {
+ /*
+ * Compute the CTS value from the N value. Note that CTS and N
+ * can be up to 20 bits in total, so we need 64-bit math. Also
+ * note that our TDMS clock is not fully accurate; it is accurate
+ * to kHz. This can introduce an unnecessary remainder in the
+ * calculation below, so we don't try to warn about that.
+ */
+ tmp = (u64)ftdms * n;
+ do_div(tmp, 128 * sample_rate);
+ cts = tmp;
+
+ dev_dbg(hdmi->dev, "%s: fs=%uHz ftdms=%lu.%03luMHz N=%d cts=%d\n",
+ __func__, sample_rate, ftdms / 1000000, (ftdms / 1000) % 1000,
+ n, cts);
+ } else
+ cts = 0;
spin_lock_irq(&hdmi->audio_lock);
hdmi->audio_n = n;
hdmi->audio_cts = cts;
- hdmi_set_cts_n(hdmi, cts, hdmi->audio_enable ? n : 0);
+ hdmi_set_cts_n(hdmi, cts, n);
spin_unlock_irq(&hdmi->audio_lock);
}
@@ -3721,8 +3717,8 @@ int dw_hdmi_bind(struct device *dev, struct device *master,
audio.read = hdmi_readb;
audio.mod = hdmi_modb;
audio.eld = hdmi->connector.eld;
- hdmi->enable_audio = dw_hdmi_i2s_audio_enable;
- hdmi->disable_audio = dw_hdmi_i2s_audio_disable;
+ //hdmi->enable_audio = dw_hdmi_i2s_audio_enable;
+ //hdmi->disable_audio = dw_hdmi_i2s_audio_disable;
pdevinfo.name = "dw-hdmi-i2s-audio";
pdevinfo.data = &audio;

View File

@ -1,4 +1,4 @@
From 7894722c99f2be6806a245c2db1c0df61e890096 Mon Sep 17 00:00:00 2001
From c5300de0fe982ae8a78e1b95ef7bf30b744e4ca1 Mon Sep 17 00:00:00 2001
From: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
Date: Fri, 25 Nov 2016 14:12:01 +0100
Subject: [PATCH] UPSTREAM: net: phy: realtek: fix enabling of the TX-delay for
@ -66,7 +66,7 @@ index 43ab691362d4..686f3b259dc0 100644
return 0;
}
From 91f88fe0a8ae6a575e42384236ddac74a7343f33 Mon Sep 17 00:00:00 2001
From 647c38d9964680f7fbb24c5a889ef74b23b4cbd4 Mon Sep 17 00:00:00 2001
From: Kunihiko Hayashi <hayashi.kunihiko@socionext.com>
Date: Tue, 12 Sep 2017 18:54:35 +0900
Subject: [PATCH] UPSTREAM: net: phy: realtek: rename RTL8211F_PAGE_SELECT to
@ -132,7 +132,7 @@ index 686f3b259dc0..d58cc8f518ac 100644
return 0;
}
From 418a6d18802923ffc35b9d8d40ce97a7d44f4482 Mon Sep 17 00:00:00 2001
From 724532e7b4ad78722821763c639a73383a0f4418 Mon Sep 17 00:00:00 2001
From: Jassi Brar <jaswinder.singh@linaro.org>
Date: Tue, 12 Sep 2017 18:54:36 +0900
Subject: [PATCH] UPSTREAM: net: phy: realtek: add RTL8201F phy-id and
@ -235,7 +235,7 @@ index d58cc8f518ac..422cf1f6a60c 100644
{ 0x001cc914, 0x001fffff },
{ 0x001cc915, 0x001fffff },
From 0e7b02714fa25f16aebcb917fa7017aded5bdf06 Mon Sep 17 00:00:00 2001
From 933e1e195c40a941b6e5dec0c6a3a4bb7f804cf7 Mon Sep 17 00:00:00 2001
From: Heiner Kallweit <hkallweit1@gmail.com>
Date: Sun, 12 Nov 2017 16:16:04 +0100
Subject: [PATCH] UPSTREAM: net: phy: realtek: fix RTL8211F interrupt mode
@ -280,7 +280,7 @@ index 422cf1f6a60c..a30d0c08c63b 100644
return err;
}
From 013120bec5f5e717baf7465e0eaafd6e5141d8c6 Mon Sep 17 00:00:00 2001
From 046a2dc318a05236e06b09d8c0ca3f1005cbceca Mon Sep 17 00:00:00 2001
From: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
Date: Sat, 2 Dec 2017 22:51:24 +0100
Subject: [PATCH] UPSTREAM: net: phy: realtek: use the BIT and GENMASK macros
@ -329,7 +329,7 @@ index a30d0c08c63b..f8dc29a75828 100644
#define RTL8201F_ISR 0x1e
#define RTL8201F_IER 0x13
From ac2c0298c225eacc49b74a6f723b18a99a7b4b28 Mon Sep 17 00:00:00 2001
From 7894b1cae69475242cdb1ca0fb639a5d70ac6316 Mon Sep 17 00:00:00 2001
From: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
Date: Sat, 2 Dec 2017 22:51:25 +0100
Subject: [PATCH] UPSTREAM: net: phy: realtek: rename RTL821x_INER_INIT to
@ -370,7 +370,7 @@ index f8dc29a75828..89308eac4088 100644
err = phy_write(phydev, RTL821x_INER, 0);
From 68e38ec78893a72b91255eaf56e1aa5dfcf81d1f Mon Sep 17 00:00:00 2001
From f6e8b6c88c6b3d4925607575bc4387a289d49708 Mon Sep 17 00:00:00 2001
From: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
Date: Sat, 2 Dec 2017 22:51:26 +0100
Subject: [PATCH] UPSTREAM: net: phy: realtek: group all register bit #defines
@ -414,7 +414,7 @@ index 89308eac4088..df97d903d2bf 100644
#define RTL8211F_TX_DELAY BIT(8)
From 89b955d9f11cc268626cdedbf75561ccc607bb90 Mon Sep 17 00:00:00 2001
From d5e2b112bb8e5707fc2fb727122ee5a8444ee462 Mon Sep 17 00:00:00 2001
From: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
Date: Sat, 2 Dec 2017 22:51:27 +0100
Subject: [PATCH] UPSTREAM: net: phy: realtek: use the same indentation for all
@ -474,7 +474,7 @@ index df97d903d2bf..701f34ad7d8d 100644
MODULE_DESCRIPTION("Realtek PHY driver");
MODULE_AUTHOR("Johnson Leung");
From 304312f104de088682456d4cf7353732685fe455 Mon Sep 17 00:00:00 2001
From 8c16425a3c99a1cca4458eb17bd6414d65074027 Mon Sep 17 00:00:00 2001
From: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
Date: Sat, 2 Dec 2017 22:51:28 +0100
Subject: [PATCH] UPSTREAM: net: phy: realtek: add utility functions to
@ -645,7 +645,7 @@ index 701f34ad7d8d..b1d52e61d91c 100644
return 0;
}
From aa354e4db670dda7682b1c4aed23cd6ffb51f715 Mon Sep 17 00:00:00 2001
From 13e556c6d4ece3c890edc414f205cc26381e9826 Mon Sep 17 00:00:00 2001
From: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
Date: Sat, 2 Dec 2017 23:06:48 +0100
Subject: [PATCH] FROMLIST: net: phy: realtek: add support for configuring the
@ -755,7 +755,7 @@ index b1d52e61d91c..890ea9d18d27 100644
return ret;
From 1503227b699167969f0c630a95f73e7760edefbc Mon Sep 17 00:00:00 2001
From e8fa4ce26460af84f028b7d215134caa33aa9ecb Mon Sep 17 00:00:00 2001
From: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
Date: Sat, 2 Dec 2017 23:06:49 +0100
Subject: [PATCH] FROMLIST: net: phy: realtek: configure the INTB pin on
@ -834,7 +834,7 @@ index 890ea9d18d27..f307d220b49a 100644
return rtl8211x_page_write(phydev, 0xa42, RTL821x_INER, val);
}
From 429c1855e10305c2838913a9dc074bd70831bb14 Mon Sep 17 00:00:00 2001
From dd026c252cd898bca0b85eb14aa6479b415d2471 Mon Sep 17 00:00:00 2001
From: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
Date: Sat, 2 Dec 2017 23:06:50 +0100
Subject: [PATCH] FROMLIST: net: phy: realtek: add more interrupt bits for

View File

@ -1,4 +1,4 @@
From 59a82f24064c60e03af52938e5a2257038e1ee07 Mon Sep 17 00:00:00 2001
From bb0e3fa6305fe3dead0aa670d7979d6ebcbaf47d Mon Sep 17 00:00:00 2001
From: Pantelis Antoniou <pantelis.antoniou@konsulko.com>
Date: Thu, 22 Oct 2015 23:30:04 +0300
Subject: [PATCH] UPSTREAM: configfs: implement binary attributes
@ -651,7 +651,7 @@ index 758a029011b1..f7300d023dbe 100644
* If allow_link() exists, the item can symlink(2) out to other
* items. If the item is a group, it may support mkdir(2).
From e35c4a7f4a74aa78fb3518e6eaccb7387600eccb Mon Sep 17 00:00:00 2001
From 5bbcb67edd92f639228cbaf7d597af715442db16 Mon Sep 17 00:00:00 2001
From: Octavian Purdila <octavian.purdila@intel.com>
Date: Wed, 23 Mar 2016 14:14:48 +0200
Subject: [PATCH] UPSTREAM: configfs: fix CONFIGFS_BIN_ATTR_[RW]O definitions
@ -689,7 +689,7 @@ index f7300d023dbe..658066d63180 100644
.ca_name = __stringify(_name), \
.ca_mode = S_IWUSR, \
From b0f4ef7b999ed084376777763e20644dc9061ad3 Mon Sep 17 00:00:00 2001
From 34d6438a4d2cedcd1b47f55a3cc63374252c6682 Mon Sep 17 00:00:00 2001
From: Pantelis Antoniou <pantelis.antoniou@konsulko.com>
Date: Wed, 4 Dec 2013 19:32:00 +0200
Subject: [PATCH] FROMLIST: OF: DT-Overlay configfs interface (v7)

View File

@ -1,4 +1,4 @@
From 3c894b625c24537d22213836dbc44e1973b2b1f4 Mon Sep 17 00:00:00 2001
From 75bb99dc815464846a4add357494acf04212271d Mon Sep 17 00:00:00 2001
From: Julia Lawall <Julia.Lawall@lip6.fr>
Date: Sat, 14 Nov 2015 18:05:20 +0100
Subject: [PATCH] UPSTREAM: mmc: pwrseq: constify mmc_pwrseq_ops structures
@ -56,7 +56,7 @@ index d10538bb5e07..2b16263458af 100644
.post_power_on = mmc_pwrseq_simple_post_power_on,
.power_off = mmc_pwrseq_simple_power_off,
From 11396ee87b7a090c5807c2fc2b8a640d109c30ce Mon Sep 17 00:00:00 2001
From 1977551c6ef29f55b398a02112e3075c9a38649d Mon Sep 17 00:00:00 2001
From: Martin Fuzzey <mfuzzey@parkeon.com>
Date: Wed, 20 Jan 2016 16:08:03 +0100
Subject: [PATCH] UPSTREAM: mmc: pwrseq_simple: Make reset-gpios optional to
@ -128,7 +128,7 @@ index 2b16263458af..aba786daebca 100644
goto clk_put;
}
From eecad6e4c48e9e82ec2f8415dec690f67c7ba12b Mon Sep 17 00:00:00 2001
From e79ed0004dc68dc2f2189256bf00a1f579c78f1a Mon Sep 17 00:00:00 2001
From: Peter Chen <peter.chen@freescale.com>
Date: Wed, 6 Jan 2016 11:34:10 +0800
Subject: [PATCH] UPSTREAM: mmc: core: pwrseq_simple: remove unused header file
@ -153,7 +153,7 @@ index aba786daebca..bc173e18b71c 100644
#include <linux/mmc/host.h>
From ea74f89b7e6bb89a2824df5bf3ae94786f6b30b3 Mon Sep 17 00:00:00 2001
From 545d059f7a0a4c470acfdb0fff30397899597f09 Mon Sep 17 00:00:00 2001
From: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Date: Thu, 14 Apr 2016 14:02:14 +0100
Subject: [PATCH] UPSTREAM: mmc: pwrseq_simple: add to_pwrseq_simple() macro
@ -220,7 +220,7 @@ index bc173e18b71c..f94271bb1f6b 100644
if (!IS_ERR(pwrseq->reset_gpios))
gpiod_put_array(pwrseq->reset_gpios);
From 11bf8cedf08ee10e4053d8787268c69a0bd7419b Mon Sep 17 00:00:00 2001
From e8c5f0b9383e6a528c8fc00d61755f8187e4c0b8 Mon Sep 17 00:00:00 2001
From: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Date: Thu, 14 Apr 2016 14:02:15 +0100
Subject: [PATCH] UPSTREAM: mmc: pwrseq_emmc: add to_pwrseq_emmc() macro
@ -267,7 +267,7 @@ index 4a82bc77fe49..c2d732aa464c 100644
unregister_restart_handler(&pwrseq->reset_nb);
gpiod_put(pwrseq->reset_gpio);
From 9a32c48a17c3a0de3bd96cc6e9289d9fb8710b91 Mon Sep 17 00:00:00 2001
From ef2f3c5b7375b930697a64c85f30f9109e631cb0 Mon Sep 17 00:00:00 2001
From: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Date: Thu, 14 Apr 2016 14:02:16 +0100
Subject: [PATCH] UPSTREAM: mmc: pwrseq: convert to proper platform device
@ -785,7 +785,7 @@ index f94271bb1f6b..450d907c6e6c 100644
+module_platform_driver(mmc_pwrseq_simple_driver);
+MODULE_LICENSE("GPL v2");
From d94057e963bb557eb61324a2f05e5a0a743813c5 Mon Sep 17 00:00:00 2001
From 42eb02ddb70002e4f72fa627037b6acbdd4cb7a1 Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Sun, 7 Aug 2016 21:02:38 +0200
Subject: [PATCH] UPSTREAM: mmc: pwrseq-simple: Add an optional
@ -861,7 +861,7 @@ index 450d907c6e6c..1304160de168 100644
pwrseq->pwrseq.ops = &mmc_pwrseq_simple_ops;
pwrseq->pwrseq.owner = THIS_MODULE;
From 50e40e09e01a67684fd3b7ef2422f194a656dd93 Mon Sep 17 00:00:00 2001
From bf90ebd56d6f327f77bd7add55b3593679cd5c67 Mon Sep 17 00:00:00 2001
From: Ulf Hansson <ulf.hansson@linaro.org>
Date: Sat, 6 May 2017 11:41:30 +0200
Subject: [PATCH] UPSTREAM: mmc: dt: pwrseq-simple: Invent power-off-delay-us
@ -897,7 +897,7 @@ index e25436861867..9029b45b8a22 100644
Example:
From e4960aff45ecb83728279dd1e524f4e62ec11240 Mon Sep 17 00:00:00 2001
From bc79b1f8ca4d16d45b93c2888474bb3f11b10226 Mon Sep 17 00:00:00 2001
From: Ulf Hansson <ulf.hansson@linaro.org>
Date: Sat, 6 May 2017 11:43:05 +0200
Subject: [PATCH] UPSTREAM: mmc: pwrseq_simple: Parse DTS for the

View File

@ -0,0 +1,633 @@
From 38396ba52ab85ea1eabea3c92fd7532f8732f92e Mon Sep 17 00:00:00 2001
From: Jonas Karlman <jonas@kwiboo.se>
Date: Tue, 24 Jul 2018 15:49:29 +0200
Subject: [PATCH] mmc: core: use hs400es voltage flags
---
drivers/mmc/core/mmc.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c
index a814eb6882aa..1d950f0b3aa6 100644
--- a/drivers/mmc/core/mmc.c
+++ b/drivers/mmc/core/mmc.c
@@ -1259,10 +1259,10 @@ static int mmc_select_hs400es(struct mmc_card *card)
goto out_err;
}
- if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS200_1_2V)
+ if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS400_1_2V)
err = __mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_120);
- if (err && card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS200_1_8V)
+ if (err && card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS400_1_8V)
err = __mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_180);
/* If fails try again during next card power cycle */
From 92a57737adc14e15e80b6913932bb5d2d3478068 Mon Sep 17 00:00:00 2001
From: Haibo Chen <haibo.chen@nxp.com>
Date: Tue, 8 Aug 2017 18:54:01 +0800
Subject: [PATCH] UPSTREAM: mmc: mmc: correct the logic for setting HS400ES
signal voltage
Change the default err value to -EINVAL, make sure the card only
has type EXT_CSD_CARD_TYPE_HS400_1_8V also do the signal voltage
setting when select hs400es mode.
Fixes: commit 1720d3545b77 ("mmc: core: switch to 1V8 or 1V2 for hs400es mode")
Cc: <stable@vger.kernel.org>
Signed-off-by: Haibo Chen <haibo.chen@nxp.com>
Reviewed-by: Shawn Lin <shawn.lin@rock-chips.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit 92ddd95919466de5d34f3cb43635da9a7f9ab814)
---
drivers/mmc/core/mmc.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c
index 1d950f0b3aa6..70de514dd061 100644
--- a/drivers/mmc/core/mmc.c
+++ b/drivers/mmc/core/mmc.c
@@ -1251,7 +1251,7 @@ out_err:
static int mmc_select_hs400es(struct mmc_card *card)
{
struct mmc_host *host = card->host;
- int err = 0;
+ int err = -EINVAL;
u8 val;
if (!(host->caps & MMC_CAP_8_BIT_DATA)) {
From 108a045df9dc1cee2127aec0bdd327ba7f2fdb81 Mon Sep 17 00:00:00 2001
From: Ulf Hansson <ulf.hansson@linaro.org>
Date: Wed, 25 Jan 2017 10:12:10 +0100
Subject: [PATCH] UPSTREAM: mmc: core: Remove redundant code in
mmc_set_signal_voltage()
The mmc_set_signal_voltage() function is used for SD/SDIO when switching to
1.8V for UHS mode. Therefore let's remove the redundant code dealing with
MMC_SIGNAL_VOLTAGE_330.
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Reviewed-by: Shawn Lin <shawn.lin@rock-chips.com>
Tested-by: Jan Glauber <jglauber@cavium.com>
Tested-by: Stefan Wahren <stefan.wahren@i2se.com>
(cherry picked from commit a44efa4796249c6d4341935e90e9105d6e1a5f15)
---
drivers/mmc/core/core.c | 7 -------
1 file changed, 7 deletions(-)
diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
index 3e3c79feb07b..b69c96ad9486 100644
--- a/drivers/mmc/core/core.c
+++ b/drivers/mmc/core/core.c
@@ -1598,13 +1598,6 @@ int mmc_set_signal_voltage(struct mmc_host *host, int signal_voltage, u32 ocr)
BUG_ON(!host);
- /*
- * Send CMD11 only if the request is to switch the card to
- * 1.8V signalling.
- */
- if (signal_voltage == MMC_SIGNAL_VOLTAGE_330)
- return __mmc_set_signal_voltage(host, signal_voltage);
-
/*
* If we cannot switch voltages, return failure so the caller
* can continue without UHS mode
From d28c1bfff6556db2c4ce1093091293cf20542202 Mon Sep 17 00:00:00 2001
From: Ulf Hansson <ulf.hansson@linaro.org>
Date: Wed, 25 Jan 2017 10:25:01 +0100
Subject: [PATCH] UPSTREAM: mmc: core: Clarify usage of
mmc_set_signal_voltage()
The mmc_set_signal_voltage() function is used for SD/SDIO when switching to
1.8V for UHS mode. To clarify this let's do the following changes.
- We are always providing MMC_SIGNAL_VOLTAGE_180 as the signal_voltage
parameter to the function. Then, let's just remove the parameter as it
serves no purpose.
- Rename the function to mmc_set_uhs_voltage().
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Reviewed-by: Shawn Lin <shawn.lin@rock-chips.com>
Tested-by: Jan Glauber <jglauber@cavium.com>
Tested-by: Stefan Wahren <stefan.wahren@i2se.com>
(cherry picked from commit 2ed573b603f78289dd1435c94597aa25a97e2b76)
---
drivers/mmc/core/core.c | 4 ++--
drivers/mmc/core/core.h | 2 +-
drivers/mmc/core/sd.c | 3 +--
drivers/mmc/core/sdio.c | 3 +--
4 files changed, 5 insertions(+), 7 deletions(-)
diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
index b69c96ad9486..35d19d57d2c5 100644
--- a/drivers/mmc/core/core.c
+++ b/drivers/mmc/core/core.c
@@ -1590,7 +1590,7 @@ int __mmc_set_signal_voltage(struct mmc_host *host, int signal_voltage)
}
-int mmc_set_signal_voltage(struct mmc_host *host, int signal_voltage, u32 ocr)
+int mmc_set_uhs_voltage(struct mmc_host *host, u32 ocr)
{
struct mmc_command cmd = {0};
int err = 0;
@@ -1636,7 +1636,7 @@ int mmc_set_signal_voltage(struct mmc_host *host, int signal_voltage, u32 ocr)
host->ios.clock = 0;
mmc_set_ios(host);
- if (__mmc_set_signal_voltage(host, signal_voltage)) {
+ if (__mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_180)) {
/*
* Voltages may not have been switched, but we've already
* sent CMD11, so a power cycle is required anyway
diff --git a/drivers/mmc/core/core.h b/drivers/mmc/core/core.h
index ed7c3167763a..88ef50b2e0be 100644
--- a/drivers/mmc/core/core.h
+++ b/drivers/mmc/core/core.h
@@ -43,7 +43,7 @@ void mmc_set_clock(struct mmc_host *host, unsigned int hz);
void mmc_set_bus_mode(struct mmc_host *host, unsigned int mode);
void mmc_set_bus_width(struct mmc_host *host, unsigned int width);
u32 mmc_select_voltage(struct mmc_host *host, u32 ocr);
-int mmc_set_signal_voltage(struct mmc_host *host, int signal_voltage, u32 ocr);
+int mmc_set_uhs_voltage(struct mmc_host *host, u32 ocr);
int __mmc_set_signal_voltage(struct mmc_host *host, int signal_voltage);
void mmc_set_timing(struct mmc_host *host, unsigned int timing);
void mmc_set_driver_type(struct mmc_host *host, unsigned int drv_type);
diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c
index cd437d6b1843..d9943d82db95 100644
--- a/drivers/mmc/core/sd.c
+++ b/drivers/mmc/core/sd.c
@@ -742,8 +742,7 @@ try_again:
*/
if (!mmc_host_is_spi(host) && rocr &&
((*rocr & 0x41000000) == 0x41000000)) {
- err = mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_180,
- pocr);
+ err = mmc_set_uhs_voltage(host, pocr);
if (err == -EAGAIN) {
retries--;
goto try_again;
diff --git a/drivers/mmc/core/sdio.c b/drivers/mmc/core/sdio.c
index c586b11a40b5..f221418542e2 100644
--- a/drivers/mmc/core/sdio.c
+++ b/drivers/mmc/core/sdio.c
@@ -648,8 +648,7 @@ try_again:
* to make sure which speed mode should work.
*/
if (!powered_resume && (rocr & ocr & R4_18V_PRESENT)) {
- err = mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_180,
- ocr_card);
+ err = mmc_set_uhs_voltage(host, ocr_card);
if (err == -EAGAIN) {
mmc_sdio_resend_if_cond(host, card);
retries--;
From 0f61c64862ed54163c5f88389170c95055a74f68 Mon Sep 17 00:00:00 2001
From: Ulf Hansson <ulf.hansson@linaro.org>
Date: Wed, 25 Jan 2017 11:12:34 +0100
Subject: [PATCH] UPSTREAM: mmc: core: Rename __mmc_set_signal_voltage() to
mmc_set_signal_voltage()
Earlier the mmc_set_signal_voltage() existed, but since it has been renamed
to mmc_set_uhs_voltage(), we can now use that name instead.
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Reviewed-by: Shawn Lin <shawn.lin@rock-chips.com>
Tested-by: Jan Glauber <jglauber@cavium.com>
Tested-by: Stefan Wahren <stefan.wahren@i2se.com>
(cherry picked from commit 4e74b6b3c6e9adfe6a8fdebfc56a6416a996d905)
---
drivers/mmc/core/core.c | 10 +++++-----
drivers/mmc/core/core.h | 2 +-
drivers/mmc/core/mmc.c | 16 ++++++++--------
3 files changed, 14 insertions(+), 14 deletions(-)
diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
index 35d19d57d2c5..ba285431c2d0 100644
--- a/drivers/mmc/core/core.c
+++ b/drivers/mmc/core/core.c
@@ -1574,7 +1574,7 @@ u32 mmc_select_voltage(struct mmc_host *host, u32 ocr)
return ocr;
}
-int __mmc_set_signal_voltage(struct mmc_host *host, int signal_voltage)
+int mmc_set_signal_voltage(struct mmc_host *host, int signal_voltage)
{
int err = 0;
int old_signal_voltage = host->ios.signal_voltage;
@@ -1636,7 +1636,7 @@ int mmc_set_uhs_voltage(struct mmc_host *host, u32 ocr)
host->ios.clock = 0;
mmc_set_ios(host);
- if (__mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_180)) {
+ if (mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_180)) {
/*
* Voltages may not have been switched, but we've already
* sent CMD11, so a power cycle is required anyway
@@ -1745,11 +1745,11 @@ void mmc_power_up(struct mmc_host *host, u32 ocr)
mmc_set_initial_state(host);
/* Try to set signal voltage to 3.3V but fall back to 1.8v or 1.2v */
- if (__mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_330) == 0)
+ if (!mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_330))
dev_dbg(mmc_dev(host), "Initial signal voltage of 3.3v\n");
- else if (__mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_180) == 0)
+ else if (!mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_180))
dev_dbg(mmc_dev(host), "Initial signal voltage of 1.8v\n");
- else if (__mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_120) == 0)
+ else if (!mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_120))
dev_dbg(mmc_dev(host), "Initial signal voltage of 1.2v\n");
/*
diff --git a/drivers/mmc/core/core.h b/drivers/mmc/core/core.h
index 88ef50b2e0be..0e4bc1c7a773 100644
--- a/drivers/mmc/core/core.h
+++ b/drivers/mmc/core/core.h
@@ -44,7 +44,7 @@ void mmc_set_bus_mode(struct mmc_host *host, unsigned int mode);
void mmc_set_bus_width(struct mmc_host *host, unsigned int width);
u32 mmc_select_voltage(struct mmc_host *host, u32 ocr);
int mmc_set_uhs_voltage(struct mmc_host *host, u32 ocr);
-int __mmc_set_signal_voltage(struct mmc_host *host, int signal_voltage);
+int mmc_set_signal_voltage(struct mmc_host *host, int signal_voltage);
void mmc_set_timing(struct mmc_host *host, unsigned int timing);
void mmc_set_driver_type(struct mmc_host *host, unsigned int drv_type);
int mmc_select_drive_strength(struct mmc_card *card, unsigned int max_dtr,
diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c
index 70de514dd061..dd0040a10c0b 100644
--- a/drivers/mmc/core/mmc.c
+++ b/drivers/mmc/core/mmc.c
@@ -1088,14 +1088,14 @@ static int mmc_select_hs_ddr(struct mmc_card *card)
*/
err = -EINVAL;
if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_DDR_1_2V)
- err = __mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_120);
+ err = mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_120);
if (err && (card->mmc_avail_type & EXT_CSD_CARD_TYPE_DDR_1_8V))
- err = __mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_180);
+ err = mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_180);
/* make sure vccq is 3.3v after switching disaster */
if (err)
- err = __mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_330);
+ err = mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_330);
if (!err)
mmc_set_timing(host, MMC_TIMING_MMC_DDR52);
@@ -1260,10 +1260,10 @@ static int mmc_select_hs400es(struct mmc_card *card)
}
if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS400_1_2V)
- err = __mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_120);
+ err = mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_120);
if (err && card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS400_1_8V)
- err = __mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_180);
+ err = mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_180);
/* If fails try again during next card power cycle */
if (err)
@@ -1362,10 +1362,10 @@ static int mmc_select_hs200(struct mmc_card *card)
old_signal_voltage = host->ios.signal_voltage;
if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS200_1_2V)
- err = __mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_120);
+ err = mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_120);
if (err && card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS200_1_8V)
- err = __mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_180);
+ err = mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_180);
/* If fails try again during next card power cycle */
if (err)
@@ -1393,7 +1393,7 @@ static int mmc_select_hs200(struct mmc_card *card)
err:
if (err) {
/* fall back to the old signal voltage, if fails report error */
- if (__mmc_set_signal_voltage(host, old_signal_voltage))
+ if (mmc_set_signal_voltage(host, old_signal_voltage))
err = -EIO;
pr_err("%s: %s failed, error %d\n", mmc_hostname(card->host),
From db9fd591980256d95de5675ebd84759b9cc9831c Mon Sep 17 00:00:00 2001
From: Adrian Hunter <adrian.hunter@intel.com>
Date: Mon, 25 Sep 2017 11:29:03 +0300
Subject: [PATCH] UPSTREAM: mmc: core: Factor out mmc_host_set_uhs_voltage()
Factor out mmc_host_set_uhs_voltage() so it can be reused.
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit 3f496afb6fb361b282f37968ff7d3d80b0f1b5cb)
---
drivers/mmc/core/core.c | 38 ++++++++++++++++++++++++--------------
drivers/mmc/core/core.h | 1 +
2 files changed, 25 insertions(+), 14 deletions(-)
diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
index ba285431c2d0..dae82afcbc99 100644
--- a/drivers/mmc/core/core.c
+++ b/drivers/mmc/core/core.c
@@ -1590,11 +1590,33 @@ int mmc_set_signal_voltage(struct mmc_host *host, int signal_voltage)
}
+int mmc_host_set_uhs_voltage(struct mmc_host *host)
+{
+ u32 clock;
+
+ /*
+ * During a signal voltage level switch, the clock must be gated
+ * for 5 ms according to the SD spec
+ */
+ clock = host->ios.clock;
+ host->ios.clock = 0;
+ mmc_set_ios(host);
+
+ if (mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_180))
+ return -EAGAIN;
+
+ /* Keep clock gated for at least 10 ms, though spec only says 5 ms */
+ mmc_delay(10);
+ host->ios.clock = clock;
+ mmc_set_ios(host);
+
+ return 0;
+}
+
int mmc_set_uhs_voltage(struct mmc_host *host, u32 ocr)
{
struct mmc_command cmd = {0};
int err = 0;
- u32 clock;
BUG_ON(!host);
@@ -1628,15 +1650,8 @@ int mmc_set_uhs_voltage(struct mmc_host *host, u32 ocr)
err = -EAGAIN;
goto power_cycle;
}
- /*
- * During a signal voltage level switch, the clock must be gated
- * for 5 ms according to the SD spec
- */
- clock = host->ios.clock;
- host->ios.clock = 0;
- mmc_set_ios(host);
- if (mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_180)) {
+ if (mmc_host_set_uhs_voltage(host)) {
/*
* Voltages may not have been switched, but we've already
* sent CMD11, so a power cycle is required anyway
@@ -1645,11 +1660,6 @@ int mmc_set_uhs_voltage(struct mmc_host *host, u32 ocr)
goto power_cycle;
}
- /* Keep clock gated for at least 10 ms, though spec only says 5 ms */
- mmc_delay(10);
- host->ios.clock = clock;
- mmc_set_ios(host);
-
/* Wait for at least 1 ms according to spec */
mmc_delay(1);
diff --git a/drivers/mmc/core/core.h b/drivers/mmc/core/core.h
index 0e4bc1c7a773..11f3d2c22ecb 100644
--- a/drivers/mmc/core/core.h
+++ b/drivers/mmc/core/core.h
@@ -44,6 +44,7 @@ void mmc_set_bus_mode(struct mmc_host *host, unsigned int mode);
void mmc_set_bus_width(struct mmc_host *host, unsigned int width);
u32 mmc_select_voltage(struct mmc_host *host, u32 ocr);
int mmc_set_uhs_voltage(struct mmc_host *host, u32 ocr);
+int mmc_host_set_uhs_voltage(struct mmc_host *host);
int mmc_set_signal_voltage(struct mmc_host *host, int signal_voltage);
void mmc_set_timing(struct mmc_host *host, unsigned int timing);
void mmc_set_driver_type(struct mmc_host *host, unsigned int drv_type);
From 9c2d593200bd835b8e55eb6e0ba188e4dd9c744e Mon Sep 17 00:00:00 2001
From: Adrian Hunter <adrian.hunter@intel.com>
Date: Mon, 25 Sep 2017 11:29:04 +0300
Subject: [PATCH] UPSTREAM: mmc: sd: Fix signal voltage when there is no power
cycle
Some boards have SD card connectors where the power rail cannot be switched
off by the driver. However there are various circumstances when a card
might be re-initialized, such as after system resume, warm re-boot, or
error handling. However, a UHS card will continue to use 1.8V signaling
unless it is power cycled.
If the card has not been power cycled, it may still be using 1.8V
signaling. According to the SD spec., the Bus Speed Mode (function group 1)
bits 2 to 4 are zero if the card is initialized at 3.3V signal level. Thus
they can be used to determine if the card has already switched to 1.8V
signaling. Detect that situation and try to initialize a UHS-I (1.8V)
transfer mode.
Tested with the following cards:
Transcend 4GB High Speed
Kingston 64GB SDR104
Lexar by Micron HIGH-PERFORMANCE 300x 16GB DDR50
SanDisk Ultra 8GB DDR50
Transcend Ultimate 600x 16GB SDR104
Transcend Premium 300x 64GB SDR104
Lexar by Micron Professional 1000x 32GB UHS-II SDR104
SanDisk Extreme Pro 16GB SDR104
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Tested-by: Zhoujie Wu <zjwu@marvell.com>
Reviewed-by: Shawn Lin <shawn.lin@rock-chips.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
(cherry picked from commit 6a11fc47f175c8d87018e89cb58e2d36c66534cb)
---
drivers/mmc/core/sd.c | 47 +++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 45 insertions(+), 2 deletions(-)
diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c
index d9943d82db95..2808a281d094 100644
--- a/drivers/mmc/core/sd.c
+++ b/drivers/mmc/core/sd.c
@@ -898,6 +898,18 @@ unsigned mmc_sd_get_max_clock(struct mmc_card *card)
return max_dtr;
}
+static bool mmc_sd_card_using_v18(struct mmc_card *card)
+{
+ /*
+ * According to the SD spec., the Bus Speed Mode (function group 1) bits
+ * 2 to 4 are zero if the card is initialized at 3.3V signal level. Thus
+ * they can be used to determine if the card has already switched to
+ * 1.8V signaling.
+ */
+ return card->sw_caps.sd3_bus_mode &
+ (SD_MODE_UHS_SDR50 | SD_MODE_UHS_SDR104 | SD_MODE_UHS_DDR50);
+}
+
/*
* Handle the detection and initialisation of a card.
*
@@ -911,10 +923,11 @@ static int mmc_sd_init_card(struct mmc_host *host, u32 ocr,
int err;
u32 cid[4];
u32 rocr = 0;
+ bool v18_fixup_failed = false;
BUG_ON(!host);
WARN_ON(!host->claimed);
-
+retry:
err = mmc_sd_get_cid(host, ocr, cid, &rocr);
if (err)
return err;
@@ -980,6 +993,36 @@ static int mmc_sd_init_card(struct mmc_host *host, u32 ocr,
if (err)
goto free_card;
+ /*
+ * If the card has not been power cycled, it may still be using 1.8V
+ * signaling. Detect that situation and try to initialize a UHS-I (1.8V)
+ * transfer mode.
+ */
+ if (!v18_fixup_failed && !mmc_host_is_spi(host) && mmc_host_uhs(host) &&
+ mmc_sd_card_using_v18(card) &&
+ host->ios.signal_voltage != MMC_SIGNAL_VOLTAGE_180) {
+ /*
+ * Re-read switch information in case it has changed since
+ * oldcard was initialized.
+ */
+ if (oldcard) {
+ err = mmc_read_switch(card);
+ if (err)
+ goto free_card;
+ }
+ if (mmc_sd_card_using_v18(card)) {
+ if (mmc_host_set_uhs_voltage(host) ||
+ mmc_sd_init_uhs_card(card)) {
+ v18_fixup_failed = true;
+ mmc_power_cycle(host, ocr);
+ if (!oldcard)
+ mmc_remove_card(card);
+ goto retry;
+ }
+ goto done;
+ }
+ }
+
/* Initialization sequence for UHS-I cards */
if (rocr & SD_ROCR_S18A && mmc_host_uhs(host)) {
err = mmc_sd_init_uhs_card(card);
@@ -1012,7 +1055,7 @@ static int mmc_sd_init_card(struct mmc_host *host, u32 ocr,
mmc_set_bus_width(host, MMC_BUS_WIDTH_4);
}
}
-
+done:
host->card = card;
return 0;
From 6ee3035196c307a77f95b1c1f3cc537e467fb838 Mon Sep 17 00:00:00 2001
From: Ulf Hansson <ulf.hansson@linaro.org>
Date: Thu, 5 Apr 2018 21:24:15 +0200
Subject: [PATCH] UPSTREAM: mmc: core: Share internal function to set initial
signal voltage
Move the corresponding code for setting the initial signal voltage, from
mmc_power_up() into a new function, mmc_set_initial_signal_voltage().
Make the function internally available to the mmc core, as to allow the
following changes to make use of it.
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Tested-by: Quentin Schulz <quentin.schulz@bootlin.com>
Reviewed-by: Shawn Lin <shawn.lin@rock-chips.com>
(cherry picked from commit 508c9864ccede5dd4b8a7220b3fe6998763e4407)
---
drivers/mmc/core/core.c | 19 ++++++++++++-------
drivers/mmc/core/core.h | 1 +
2 files changed, 13 insertions(+), 7 deletions(-)
diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
index dae82afcbc99..7aa83beea957 100644
--- a/drivers/mmc/core/core.c
+++ b/drivers/mmc/core/core.c
@@ -1590,6 +1590,17 @@ int mmc_set_signal_voltage(struct mmc_host *host, int signal_voltage)
}
+void mmc_set_initial_signal_voltage(struct mmc_host *host)
+{
+ /* Try to set signal voltage to 3.3V but fall back to 1.8v or 1.2v */
+ if (!mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_330))
+ dev_dbg(mmc_dev(host), "Initial signal voltage of 3.3v\n");
+ else if (!mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_180))
+ dev_dbg(mmc_dev(host), "Initial signal voltage of 1.8v\n");
+ else if (!mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_120))
+ dev_dbg(mmc_dev(host), "Initial signal voltage of 1.2v\n");
+}
+
int mmc_host_set_uhs_voltage(struct mmc_host *host)
{
u32 clock;
@@ -1754,13 +1765,7 @@ void mmc_power_up(struct mmc_host *host, u32 ocr)
/* Set initial state and call mmc_set_ios */
mmc_set_initial_state(host);
- /* Try to set signal voltage to 3.3V but fall back to 1.8v or 1.2v */
- if (!mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_330))
- dev_dbg(mmc_dev(host), "Initial signal voltage of 3.3v\n");
- else if (!mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_180))
- dev_dbg(mmc_dev(host), "Initial signal voltage of 1.8v\n");
- else if (!mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_120))
- dev_dbg(mmc_dev(host), "Initial signal voltage of 1.2v\n");
+ mmc_set_initial_signal_voltage(host);
/*
* This delay should be sufficient to allow the power supply
diff --git a/drivers/mmc/core/core.h b/drivers/mmc/core/core.h
index 11f3d2c22ecb..2634722265ad 100644
--- a/drivers/mmc/core/core.h
+++ b/drivers/mmc/core/core.h
@@ -46,6 +46,7 @@ u32 mmc_select_voltage(struct mmc_host *host, u32 ocr);
int mmc_set_uhs_voltage(struct mmc_host *host, u32 ocr);
int mmc_host_set_uhs_voltage(struct mmc_host *host);
int mmc_set_signal_voltage(struct mmc_host *host, int signal_voltage);
+void mmc_set_initial_signal_voltage(struct mmc_host *host);
void mmc_set_timing(struct mmc_host *host, unsigned int timing);
void mmc_set_driver_type(struct mmc_host *host, unsigned int drv_type);
int mmc_select_drive_strength(struct mmc_card *card, unsigned int max_dtr,
From adadab9687a3e07be7557e4272fdf5a007b4c604 Mon Sep 17 00:00:00 2001
From: Jonas Karlman <jonas@kwiboo.se>
Date: Tue, 24 Jul 2018 15:50:06 +0200
Subject: [PATCH] mmc: core: set initial signal voltage on power off
---
drivers/mmc/core/core.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
index 7aa83beea957..d2c59b5e04ab 100644
--- a/drivers/mmc/core/core.c
+++ b/drivers/mmc/core/core.c
@@ -1792,6 +1792,14 @@ void mmc_power_off(struct mmc_host *host)
if (host->ios.power_mode == MMC_POWER_OFF)
return;
+ mmc_set_initial_signal_voltage(host);
+
+ /*
+ * This delay should be sufficient to allow the power supply
+ * to reach the minimum voltage.
+ */
+ mmc_delay(10);
+
mmc_pwrseq_power_off(host);
host->ios.clock = 0;

View File

@ -1,7 +1,7 @@
From 9260fcc02a97e6acceb6dc0ef064939382b6b74d Mon Sep 17 00:00:00 2001
From ae39146426642d51de99ba3bdef54912c579991b Mon Sep 17 00:00:00 2001
From: Jakub Kicinski <jakub.kicinski@netronome.com>
Date: Wed, 31 Aug 2016 12:46:44 +0100
Subject: [PATCH 1/2] add basic register-field manipulation macros
Subject: [PATCH] UPSTREAM: add basic register-field manipulation macros
Common approach to accessing register fields is to define
structures or sets of macros containing mask and shift pair.
@ -39,6 +39,7 @@ GCC < 6.0.
Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Reviewed-by: Dinan Gunawardena <dinan.gunawardena@netronome.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
(cherry picked from commit 3e9b3112ec74f192eaab976c3889e34255cae940)
---
include/linux/bitfield.h | 93 ++++++++++++++++++++++++++++++++++++++++++++++++
include/linux/bug.h | 3 ++
@ -165,20 +166,18 @@ index 7f4818673c41..edd3d8d3cd90 100644
#define BUILD_BUG_ON_NOT_POWER_OF_2(n) \
BUILD_BUG_ON((n) == 0 || (((n) & ((n) - 1)) != 0))
--
2.11.0
From ae411606724c694ec6fa0f255ed8d7788094109d Mon Sep 17 00:00:00 2001
From 8c11cf13e9f5c633bc2d1f3414d3b95c9cc82e4c Mon Sep 17 00:00:00 2001
From: Jakub Kicinski <jakub.kicinski@netronome.com>
Date: Thu, 9 Feb 2017 09:17:27 -0800
Subject: [PATCH 2/2] bitfield.h: add FIELD_FIT() helper
Subject: [PATCH] UPSTREAM: bitfield.h: add FIELD_FIT() helper
Add a helper for checking at runtime that a value will fit inside
a specified field/mask.
Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
(cherry picked from commit 1697599ee301a52cded6499a09bd609f7f63fd06)
---
include/linux/bitfield.h | 13 +++++++++++++
1 file changed, 13 insertions(+)
@ -187,10 +186,11 @@ diff --git a/include/linux/bitfield.h b/include/linux/bitfield.h
index f6505d83069d..8b9d6fff002d 100644
--- a/include/linux/bitfield.h
+++ b/include/linux/bitfield.h
@@ -63,6 +63,19 @@
@@ -62,6 +62,19 @@
(1ULL << __bf_shf(_mask))); \
})
/**
+/**
+ * FIELD_FIT() - check if value fits in the field
+ * @_mask: shifted mask defining the field's length and position
+ * @_val: value to test against the field
@ -203,10 +203,174 @@ index f6505d83069d..8b9d6fff002d 100644
+ !((((typeof(_mask))_val) << __bf_shf(_mask)) & ~(_mask)); \
+ })
+
+/**
/**
* FIELD_PREP() - prepare a bitfield element
* @_mask: shifted mask defining the field's length and position
* @_val: value to put in the field
--
2.11.0
From 9b03f083c3ba2b3ca6dbcfdc76bf24edfe8b2947 Mon Sep 17 00:00:00 2001
From: Laurent Defert <laurent.defert@smartjog.com>
Date: Wed, 11 Oct 2017 08:46:52 +0200
Subject: [PATCH] FROMLIST: compat_ioctl: add compat handler for
FE_SET_PROPERTY and FE_GET_PROPERTY
https://patchwork.linuxtv.org/patch/8209/
---
fs/compat_ioctl.c | 138 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 138 insertions(+)
diff --git a/fs/compat_ioctl.c b/fs/compat_ioctl.c
index a52ca5cba015..438ce0c6851e 100644
--- a/fs/compat_ioctl.c
+++ b/fs/compat_ioctl.c
@@ -223,6 +223,140 @@ static int do_video_set_spu_palette(unsigned int fd, unsigned int cmd,
return err;
}
+struct compat_dtv_property {
+ __u32 cmd;
+ __u32 reserved[3];
+ union {
+ __u32 data;
+ struct {
+ __u8 data[32];
+ __u32 len;
+ __u32 reserved1[3];
+ compat_uptr_t reserved2;
+ } buffer;
+ } u;
+ int result;
+};
+
+struct compat_dtv_properties {
+ __u32 num;
+ compat_uptr_t props;
+};
+
+#define FE_SET_PROPERTY32 _IOW('o', 82, struct compat_dtv_properties)
+#define FE_GET_PROPERTY32 _IOR('o', 83, struct compat_dtv_properties)
+
+static int do_fe_set_property(unsigned int fd, unsigned int cmd,
+ struct compat_dtv_properties __user *dtv32)
+{
+ struct dtv_properties __user *dtv;
+ struct dtv_property __user *properties;
+ struct compat_dtv_property __user *properties32;
+ compat_uptr_t data;
+
+ int err;
+ int i;
+ __u32 num;
+
+ err = get_user(num, &dtv32->num);
+ err |= get_user(data, &dtv32->props);
+
+ if(err)
+ return -EFAULT;
+
+ dtv = compat_alloc_user_space(sizeof(struct dtv_properties) +
+ sizeof(struct dtv_property) * num);
+ properties = (struct dtv_property*)((char*)dtv +
+ sizeof(struct dtv_properties));
+
+ err = put_user(properties, &dtv->props);
+ err |= put_user(num, &dtv->num);
+
+ properties32 = compat_ptr(data);
+
+ if(err)
+ return -EFAULT;
+
+ for(i = 0; i < num; i++) {
+ compat_uptr_t reserved2;
+
+ err |= copy_in_user(&properties[i], &properties32[i],
+ (8 * sizeof(__u32)) + (32 * sizeof(__u8)));
+ err |= get_user(reserved2, &properties32[i].u.buffer.reserved2);
+ err |= put_user(compat_ptr(reserved2),
+ &properties[i].u.buffer.reserved2);
+ }
+
+ if(err)
+ return -EFAULT;
+
+ err = sys_ioctl(fd, FE_SET_PROPERTY, (unsigned long) dtv);
+
+ for(i = 0; i < num; i++) {
+ if(copy_in_user(&properties32[i].result, &properties[i].result,
+ sizeof(int)))
+ return -EFAULT;
+ }
+
+ return err;
+}
+
+static int do_fe_get_property(unsigned int fd, unsigned int cmd,
+ struct compat_dtv_properties __user *dtv32)
+{
+ struct dtv_properties __user *dtv;
+ struct dtv_property __user *properties;
+ struct compat_dtv_property __user *properties32;
+ compat_uptr_t data;
+
+ int err;
+ int i;
+ __u32 num;
+
+ err = get_user(num, &dtv32->num);
+ err |= get_user(data, &dtv32->props);
+
+ if(err)
+ return -EFAULT;
+
+ dtv = compat_alloc_user_space(sizeof(struct dtv_properties) +
+ sizeof(struct dtv_property) * num);
+ properties = (struct dtv_property*)((char*)dtv +
+ sizeof(struct dtv_properties));
+
+ err = put_user(properties, &dtv->props);
+ err |= put_user(num, &dtv->num);
+
+ properties32 = compat_ptr(data);
+
+ if(err)
+ return -EFAULT;
+
+ for(i = 0; i < num; i++) {
+ compat_uptr_t reserved2;
+
+ err |= copy_in_user(&properties[i], &properties32[i],
+ (8 * sizeof(__u32)) + (32 * sizeof(__u8)));
+ err |= get_user(reserved2, &properties32[i].u.buffer.reserved2);
+ err |= put_user(compat_ptr(reserved2),
+ &properties[i].u.buffer.reserved2);
+ }
+
+ if(err)
+ return -EFAULT;
+
+ err = sys_ioctl(fd, FE_GET_PROPERTY, (unsigned long) dtv);
+
+ for(i = 0; i < num; i++) {
+
+ if(copy_in_user(&properties32[i], &properties[i],
+ sizeof(properties32[i])))
+ return -EFAULT;
+ }
+
+ return err;
+}
+
#ifdef CONFIG_BLOCK
typedef struct sg_io_hdr32 {
compat_int_t interface_id; /* [i] 'S' for SCSI generic (required) */
@@ -1483,6 +1617,10 @@ static long do_ioctl_trans(int fd, unsigned int cmd,
return do_video_stillpicture(fd, cmd, argp);
case VIDEO_SET_SPU_PALETTE:
return do_video_set_spu_palette(fd, cmd, argp);
+ case FE_SET_PROPERTY32:
+ return do_fe_set_property(fd, cmd, argp);
+ case FE_GET_PROPERTY32:
+ return do_fe_get_property(fd, cmd, argp);
}
/*

View File

@ -1,167 +0,0 @@
From 23e9ba535d09e96564c8bc6a28afefbadb5ee619 Mon Sep 17 00:00:00 2001
From: Laurent Defert <laurent.defert@smartjog.com>
Date: Wed, 11 Oct 2017 08:46:52 +0200
Subject: [PATCH] [media] compat_ioctl: add compat handler for FE_SET_PROPERTY
and FE_GET_PROPERTY
https://patchwork.linuxtv.org/patch/8209/
---
fs/compat_ioctl.c | 138 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 138 insertions(+)
diff --git a/fs/compat_ioctl.c b/fs/compat_ioctl.c
index 76e1f2dc669..f6b4144d94d 100644
--- a/fs/compat_ioctl.c
+++ b/fs/compat_ioctl.c
@@ -224,6 +224,140 @@ static int do_video_set_spu_palette(unsigned int fd, unsigned int cmd,
return err;
}
+struct compat_dtv_property {
+ __u32 cmd;
+ __u32 reserved[3];
+ union {
+ __u32 data;
+ struct {
+ __u8 data[32];
+ __u32 len;
+ __u32 reserved1[3];
+ compat_uptr_t reserved2;
+ } buffer;
+ } u;
+ int result;
+};
+
+struct compat_dtv_properties {
+ __u32 num;
+ compat_uptr_t props;
+};
+
+#define FE_SET_PROPERTY32 _IOW('o', 82, struct compat_dtv_properties)
+#define FE_GET_PROPERTY32 _IOR('o', 83, struct compat_dtv_properties)
+
+static int do_fe_set_property(unsigned int fd, unsigned int cmd,
+ struct compat_dtv_properties __user *dtv32)
+{
+ struct dtv_properties __user *dtv;
+ struct dtv_property __user *properties;
+ struct compat_dtv_property __user *properties32;
+ compat_uptr_t data;
+
+ int err;
+ int i;
+ __u32 num;
+
+ err = get_user(num, &dtv32->num);
+ err |= get_user(data, &dtv32->props);
+
+ if(err)
+ return -EFAULT;
+
+ dtv = compat_alloc_user_space(sizeof(struct dtv_properties) +
+ sizeof(struct dtv_property) * num);
+ properties = (struct dtv_property*)((char*)dtv +
+ sizeof(struct dtv_properties));
+
+ err = put_user(properties, &dtv->props);
+ err |= put_user(num, &dtv->num);
+
+ properties32 = compat_ptr(data);
+
+ if(err)
+ return -EFAULT;
+
+ for(i = 0; i < num; i++) {
+ compat_uptr_t reserved2;
+
+ err |= copy_in_user(&properties[i], &properties32[i],
+ (8 * sizeof(__u32)) + (32 * sizeof(__u8)));
+ err |= get_user(reserved2, &properties32[i].u.buffer.reserved2);
+ err |= put_user(compat_ptr(reserved2),
+ &properties[i].u.buffer.reserved2);
+ }
+
+ if(err)
+ return -EFAULT;
+
+ err = sys_ioctl(fd, FE_SET_PROPERTY, (unsigned long) dtv);
+
+ for(i = 0; i < num; i++) {
+ if(copy_in_user(&properties32[i].result, &properties[i].result,
+ sizeof(int)))
+ return -EFAULT;
+ }
+
+ return err;
+}
+
+static int do_fe_get_property(unsigned int fd, unsigned int cmd,
+ struct compat_dtv_properties __user *dtv32)
+{
+ struct dtv_properties __user *dtv;
+ struct dtv_property __user *properties;
+ struct compat_dtv_property __user *properties32;
+ compat_uptr_t data;
+
+ int err;
+ int i;
+ __u32 num;
+
+ err = get_user(num, &dtv32->num);
+ err |= get_user(data, &dtv32->props);
+
+ if(err)
+ return -EFAULT;
+
+ dtv = compat_alloc_user_space(sizeof(struct dtv_properties) +
+ sizeof(struct dtv_property) * num);
+ properties = (struct dtv_property*)((char*)dtv +
+ sizeof(struct dtv_properties));
+
+ err = put_user(properties, &dtv->props);
+ err |= put_user(num, &dtv->num);
+
+ properties32 = compat_ptr(data);
+
+ if(err)
+ return -EFAULT;
+
+ for(i = 0; i < num; i++) {
+ compat_uptr_t reserved2;
+
+ err |= copy_in_user(&properties[i], &properties32[i],
+ (8 * sizeof(__u32)) + (32 * sizeof(__u8)));
+ err |= get_user(reserved2, &properties32[i].u.buffer.reserved2);
+ err |= put_user(compat_ptr(reserved2),
+ &properties[i].u.buffer.reserved2);
+ }
+
+ if(err)
+ return -EFAULT;
+
+ err = sys_ioctl(fd, FE_GET_PROPERTY, (unsigned long) dtv);
+
+ for(i = 0; i < num; i++) {
+
+ if(copy_in_user(&properties32[i], &properties[i],
+ sizeof(properties32[i])))
+ return -EFAULT;
+ }
+
+ return err;
+}
+
#ifdef CONFIG_BLOCK
typedef struct sg_io_hdr32 {
compat_int_t interface_id; /* [i] 'S' for SCSI generic (required) */
@@ -1489,6 +1623,10 @@ static long do_ioctl_trans(int fd, unsigned int cmd,
return do_video_stillpicture(fd, cmd, argp);
case VIDEO_SET_SPU_PALETTE:
return do_video_set_spu_palette(fd, cmd, argp);
+ case FE_SET_PROPERTY32:
+ return do_fe_set_property(fd, cmd, argp);
+ case FE_GET_PROPERTY32:
+ return do_fe_get_property(fd, cmd, argp);
}
/*

View File

@ -0,0 +1,49 @@
From 6ed983631422dcce52d8b029818617b4cd067a93 Mon Sep 17 00:00:00 2001
From: Jonas Karlman <jonas@kwiboo.se>
Date: Sat, 21 Apr 2018 12:52:58 +0200
Subject: [PATCH] drm/rockchip: skip 4K 50/60Hz clocks for RK3328
---
drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
index e2aad6e2149b..6399bb2f3a32 100644
--- a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
+++ b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
@@ -519,6 +519,10 @@ dw_hdmi_rockchip_mode_valid(struct drm_connector *connector,
if (hdmi->dev_type == RK3288_HDMI && (mode->clock < 27500 || mode->clock > 340000))
return MODE_CLOCK_RANGE;
+ /* Skip 4K 50/60Hz clocks for RK3328 */
+ if (hdmi->dev_type == RK3328_HDMI && mode->clock > 340000)
+ return MODE_CLOCK_RANGE;
+
/*
* ensure all drm display mode can work, if someone want support more
* resolutions, please limit the possible_crtc, only connect to
From 3953395d6056914e32f4d3459cdb0d5bd8c362a0 Mon Sep 17 00:00:00 2001
From: Jonas Karlman <jonas@kwiboo.se>
Date: Sat, 21 Apr 2018 12:53:04 +0200
Subject: [PATCH] drm/rockchip: skip 4K 50/60Hz clocks for RK3399
---
drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
index 6399bb2f3a32..3171c21f1c78 100644
--- a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
+++ b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
@@ -523,6 +523,10 @@ dw_hdmi_rockchip_mode_valid(struct drm_connector *connector,
if (hdmi->dev_type == RK3328_HDMI && mode->clock > 340000)
return MODE_CLOCK_RANGE;
+ /* Skip 4K 50/60Hz clocks for RK3399 */
+ if (hdmi->dev_type == RK3399_HDMI && mode->clock > 340000)
+ return MODE_CLOCK_RANGE;
+
/*
* ensure all drm display mode can work, if someone want support more
* resolutions, please limit the possible_crtc, only connect to

View File

@ -0,0 +1,945 @@
From 499f15c3237602cca9ccebe902d31bd7404fb2db Mon Sep 17 00:00:00 2001
From: Jonas Karlman <jonas@kwiboo.se>
Date: Thu, 5 Jul 2018 00:14:14 +0200
Subject: [PATCH] Revert "drm/drm-prime: cache dma_buf import context"
This reverts commit 5a90381e5acc2cf32be03099a14d05d4362b3348.
---
drivers/gpu/drm/drm_prime.c | 46 ++---------------------------
drivers/gpu/drm/rockchip/rockchip_drm_gem.c | 1 +
2 files changed, 3 insertions(+), 44 deletions(-)
diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c
index 6f207d5946dc..6b7417a194a3 100644
--- a/drivers/gpu/drm/drm_prime.c
+++ b/drivers/gpu/drm/drm_prime.c
@@ -71,11 +71,6 @@ struct drm_prime_attachment {
enum dma_data_direction dir;
};
-struct drm_prime_callback_data {
- struct drm_gem_object *obj;
- struct sg_table *sgt;
-};
-
static int drm_prime_add_buf_handle(struct drm_prime_file_private *prime_fpriv,
struct dma_buf *dma_buf, uint32_t handle)
{
@@ -524,23 +519,6 @@ out_unlock:
}
EXPORT_SYMBOL(drm_gem_prime_handle_to_fd);
-static void drm_gem_prime_dmabuf_release_callback(void *data)
-{
- struct drm_prime_callback_data *cb_data = data;
-
- if (cb_data && cb_data->obj && cb_data->obj->import_attach) {
- struct dma_buf_attachment *attach = cb_data->obj->import_attach;
- struct sg_table *sgt = cb_data->sgt;
-
- if (sgt)
- dma_buf_unmap_attachment(attach, sgt,
- DMA_BIDIRECTIONAL);
- dma_buf_detach(attach->dmabuf, attach);
- drm_gem_object_unreference_unlocked(cb_data->obj);
- kfree(cb_data);
- }
-}
-
/**
* drm_gem_prime_import - helper library implementation of the import callback
* @dev: drm_device to import into
@@ -555,7 +533,6 @@ struct drm_gem_object *drm_gem_prime_import(struct drm_device *dev,
struct dma_buf_attachment *attach;
struct sg_table *sgt;
struct drm_gem_object *obj;
- struct drm_prime_callback_data *cb_data;
int ret;
if (dma_buf->ops == &drm_gem_prime_dmabuf_ops) {
@@ -570,13 +547,6 @@ struct drm_gem_object *drm_gem_prime_import(struct drm_device *dev,
}
}
- cb_data = dma_buf_get_release_callback_data(dma_buf,
- drm_gem_prime_dmabuf_release_callback);
- if (cb_data && cb_data->obj && cb_data->obj->dev == dev) {
- drm_gem_object_reference(cb_data->obj);
- return cb_data->obj;
- }
-
if (!dev->driver->gem_prime_import_sg_table)
return ERR_PTR(-EINVAL);
@@ -585,16 +555,11 @@ struct drm_gem_object *drm_gem_prime_import(struct drm_device *dev,
return ERR_CAST(attach);
get_dma_buf(dma_buf);
- cb_data = kmalloc(sizeof(*cb_data), GFP_KERNEL);
- if (!cb_data) {
- ret = -ENOMEM;
- goto fail_detach;
- }
sgt = dma_buf_map_attachment(attach, DMA_BIDIRECTIONAL);
if (IS_ERR(sgt)) {
ret = PTR_ERR(sgt);
- goto fail_free;
+ goto fail_detach;
}
obj = dev->driver->gem_prime_import_sg_table(dev, attach, sgt);
@@ -602,20 +567,13 @@ struct drm_gem_object *drm_gem_prime_import(struct drm_device *dev,
ret = PTR_ERR(obj);
goto fail_unmap;
}
+
obj->import_attach = attach;
- cb_data->obj = obj;
- cb_data->sgt = sgt;
- dma_buf_set_release_callback(dma_buf,
- drm_gem_prime_dmabuf_release_callback, cb_data);
- dma_buf_put(dma_buf);
- drm_gem_object_reference(obj);
return obj;
fail_unmap:
dma_buf_unmap_attachment(attach, sgt, DMA_BIDIRECTIONAL);
-fail_free:
- kfree(cb_data);
fail_detach:
dma_buf_detach(dma_buf, attach);
dma_buf_put(dma_buf);
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
index 273a52b5eb66..85bbd19c87b0 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
@@ -649,6 +649,7 @@ void rockchip_gem_free_object(struct drm_gem_object *obj)
dma_unmap_sg(drm->dev, rk_obj->sgt->sgl,
rk_obj->sgt->nents, DMA_BIDIRECTIONAL);
}
+ drm_prime_gem_destroy(obj, rk_obj->sgt);
} else {
rockchip_gem_free_buf(rk_obj);
}
From 3dd29985f5f1cec249c833b1b2ca33e131f79825 Mon Sep 17 00:00:00 2001
From: Rob Clark <robdclark@gmail.com>
Date: Thu, 9 Jun 2016 15:29:19 -0400
Subject: [PATCH] UPSTREAM: drm/prime: fix error path deadlock fail
There were a couple messed up things about this fail path.
(1) it would drop object_name_lock twice
(2) drm_gem_handle_delete() (in drm_gem_remove_prime_handles())
needs to grab prime_lock
Reported-by: Alex Deucher <alexdeucher@gmail.com>
Signed-off-by: Rob Clark <robdclark@gmail.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Link: http://patchwork.freedesktop.org/patch/msgid/1465500559-17873-1-git-send-email-robdclark@gmail.com
(cherry picked from commit bd6e2732f0e2894ce792f344c41fc32591436fe3)
---
drivers/gpu/drm/drm_prime.c | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c
index 6b7417a194a3..d8d85286764d 100644
--- a/drivers/gpu/drm/drm_prime.c
+++ b/drivers/gpu/drm/drm_prime.c
@@ -628,7 +628,7 @@ int drm_gem_prime_fd_to_handle(struct drm_device *dev,
get_dma_buf(dma_buf);
}
- /* drm_gem_handle_create_tail unlocks dev->object_name_lock. */
+ /* _handle_create_tail unconditionally unlocks dev->object_name_lock. */
ret = drm_gem_handle_create_tail(file_priv, obj, handle);
drm_gem_object_unreference_unlocked(obj);
if (ret)
@@ -636,11 +636,10 @@ int drm_gem_prime_fd_to_handle(struct drm_device *dev,
ret = drm_prime_add_buf_handle(&file_priv->prime,
dma_buf, *handle);
+ mutex_unlock(&file_priv->prime.lock);
if (ret)
goto fail;
- mutex_unlock(&file_priv->prime.lock);
-
dma_buf_put(dma_buf);
return 0;
@@ -650,11 +649,14 @@ fail:
* to detach.. which seems ok..
*/
drm_gem_handle_delete(file_priv, *handle);
+ dma_buf_put(dma_buf);
+ return ret;
+
out_unlock:
mutex_unlock(&dev->object_name_lock);
out_put:
- dma_buf_put(dma_buf);
mutex_unlock(&file_priv->prime.lock);
+ dma_buf_put(dma_buf);
return ret;
}
EXPORT_SYMBOL(drm_gem_prime_fd_to_handle);
From a689159fac372a8210d2c63ba63da3a097388b97 Mon Sep 17 00:00:00 2001
From: Chris Wilson <chris@chris-wilson.co.uk>
Date: Mon, 26 Sep 2016 21:44:14 +0100
Subject: [PATCH] UPSTREAM: drm: Convert prime dma-buf <-> handle to rbtree
Currently we use a linear walk to lookup a handle and return a dma-buf,
and vice versa. A long overdue TODO task is to convert that to a
hashtable. Since the initial implementation of dma-buf/prime, we now
have resizeable hashtables we can use (and now a future task is to RCU
enable the lookup!). However, this patch opts to use an rbtree instead
to provide O(lgN) lookups (and insertion, deletion). rbtrees were chosen
over using the RCU backed resizable hashtable to firstly avoid the
reallocations (rbtrees can be embedded entirely within the parent
struct) and to favour simpler code with predictable worst case
behaviour. In simple testing, the difference between using the constant
lookup and insertion of the rhashtable and the rbtree was less than 10%
of the wall time (igt/benchmarks/prime_lookup) - both are dramatic
improvements over the existing linear lists.
v2: Favour rbtree over rhashtable
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=94631
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Sean Paul <seanpaul@chromium.org>
Cc: David Herrmann <dh.herrmann@gmail.com>
Reviewed-by: David Herrmann <dh.herrmann@gmail.com>
Reviewed-by: Sean Paul <seanpaul@chromium.org>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Link: http://patchwork.freedesktop.org/patch/msgid/20160926204414.23222-1-chris@chris-wilson.co.uk
(cherry picked from commit 077675c1e8a193a6355d4a7c8c7bf63be310b472)
---
drivers/gpu/drm/drm_prime.c | 85 +++++++++++++++++++++++++++++++++++++++------
include/drm/drmP.h | 5 +--
2 files changed, 77 insertions(+), 13 deletions(-)
diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c
index d8d85286764d..4c49e736bc9c 100644
--- a/drivers/gpu/drm/drm_prime.c
+++ b/drivers/gpu/drm/drm_prime.c
@@ -28,6 +28,7 @@
#include <linux/export.h>
#include <linux/dma-buf.h>
+#include <linux/rbtree.h>
#include <drm/drmP.h>
#include <drm/drm_gem.h>
@@ -61,9 +62,11 @@
*/
struct drm_prime_member {
- struct list_head entry;
struct dma_buf *dma_buf;
uint32_t handle;
+
+ struct rb_node dmabuf_rb;
+ struct rb_node handle_rb;
};
struct drm_prime_attachment {
@@ -75,6 +78,7 @@ static int drm_prime_add_buf_handle(struct drm_prime_file_private *prime_fpriv,
struct dma_buf *dma_buf, uint32_t handle)
{
struct drm_prime_member *member;
+ struct rb_node **p, *rb;
member = kmalloc(sizeof(*member), GFP_KERNEL);
if (!member)
@@ -83,18 +87,56 @@ static int drm_prime_add_buf_handle(struct drm_prime_file_private *prime_fpriv,
get_dma_buf(dma_buf);
member->dma_buf = dma_buf;
member->handle = handle;
- list_add(&member->entry, &prime_fpriv->head);
+
+ rb = NULL;
+ p = &prime_fpriv->dmabufs.rb_node;
+ while (*p) {
+ struct drm_prime_member *pos;
+
+ rb = *p;
+ pos = rb_entry(rb, struct drm_prime_member, dmabuf_rb);
+ if (dma_buf > pos->dma_buf)
+ p = &rb->rb_right;
+ else
+ p = &rb->rb_left;
+ }
+ rb_link_node(&member->dmabuf_rb, rb, p);
+ rb_insert_color(&member->dmabuf_rb, &prime_fpriv->dmabufs);
+
+ rb = NULL;
+ p = &prime_fpriv->handles.rb_node;
+ while (*p) {
+ struct drm_prime_member *pos;
+
+ rb = *p;
+ pos = rb_entry(rb, struct drm_prime_member, handle_rb);
+ if (handle > pos->handle)
+ p = &rb->rb_right;
+ else
+ p = &rb->rb_left;
+ }
+ rb_link_node(&member->handle_rb, rb, p);
+ rb_insert_color(&member->handle_rb, &prime_fpriv->handles);
+
return 0;
}
static struct dma_buf *drm_prime_lookup_buf_by_handle(struct drm_prime_file_private *prime_fpriv,
uint32_t handle)
{
- struct drm_prime_member *member;
+ struct rb_node *rb;
+
+ rb = prime_fpriv->handles.rb_node;
+ while (rb) {
+ struct drm_prime_member *member;
- list_for_each_entry(member, &prime_fpriv->head, entry) {
+ member = rb_entry(rb, struct drm_prime_member, handle_rb);
if (member->handle == handle)
return member->dma_buf;
+ else if (member->handle < handle)
+ rb = rb->rb_right;
+ else
+ rb = rb->rb_left;
}
return NULL;
@@ -104,14 +146,23 @@ static int drm_prime_lookup_buf_handle(struct drm_prime_file_private *prime_fpri
struct dma_buf *dma_buf,
uint32_t *handle)
{
- struct drm_prime_member *member;
+ struct rb_node *rb;
+
+ rb = prime_fpriv->dmabufs.rb_node;
+ while (rb) {
+ struct drm_prime_member *member;
- list_for_each_entry(member, &prime_fpriv->head, entry) {
+ member = rb_entry(rb, struct drm_prime_member, dmabuf_rb);
if (member->dma_buf == dma_buf) {
*handle = member->handle;
return 0;
+ } else if (member->dma_buf < dma_buf) {
+ rb = rb->rb_right;
+ } else {
+ rb = rb->rb_left;
}
}
+
return -ENOENT;
}
@@ -166,13 +217,24 @@ static void drm_gem_map_detach(struct dma_buf *dma_buf,
void drm_prime_remove_buf_handle_locked(struct drm_prime_file_private *prime_fpriv,
struct dma_buf *dma_buf)
{
- struct drm_prime_member *member, *safe;
+ struct rb_node *rb;
- list_for_each_entry_safe(member, safe, &prime_fpriv->head, entry) {
+ rb = prime_fpriv->dmabufs.rb_node;
+ while (rb) {
+ struct drm_prime_member *member;
+
+ member = rb_entry(rb, struct drm_prime_member, dmabuf_rb);
if (member->dma_buf == dma_buf) {
+ rb_erase(&member->handle_rb, &prime_fpriv->handles);
+ rb_erase(&member->dmabuf_rb, &prime_fpriv->dmabufs);
+
dma_buf_put(dma_buf);
- list_del(&member->entry);
kfree(member);
+ return;
+ } else if (member->dma_buf < dma_buf) {
+ rb = rb->rb_right;
+ } else {
+ rb = rb->rb_left;
}
}
}
@@ -794,12 +856,13 @@ EXPORT_SYMBOL(drm_prime_gem_destroy);
void drm_prime_init_file_private(struct drm_prime_file_private *prime_fpriv)
{
- INIT_LIST_HEAD(&prime_fpriv->head);
mutex_init(&prime_fpriv->lock);
+ prime_fpriv->dmabufs = RB_ROOT;
+ prime_fpriv->handles = RB_ROOT;
}
void drm_prime_destroy_file_private(struct drm_prime_file_private *prime_fpriv)
{
/* by now drm_gem_release should've made sure the list is empty */
- WARN_ON(!list_empty(&prime_fpriv->head));
+ WARN_ON(!RB_EMPTY_ROOT(&prime_fpriv->dmabufs));
}
diff --git a/include/drm/drmP.h b/include/drm/drmP.h
index 04edcd32b409..93da65df2e7e 100644
--- a/include/drm/drmP.h
+++ b/include/drm/drmP.h
@@ -51,6 +51,7 @@
#include <linux/platform_device.h>
#include <linux/poll.h>
#include <linux/ratelimit.h>
+#include <linux/rbtree.h>
#include <linux/sched.h>
#include <linux/slab.h>
#include <linux/types.h>
@@ -365,10 +366,10 @@ struct drm_pending_event {
void (*destroy)(struct drm_pending_event *event);
};
-/* initial implementaton using a linked list - todo hashtab */
struct drm_prime_file_private {
- struct list_head head;
struct mutex lock;
+ struct rb_root dmabufs;
+ struct rb_root handles;
};
/** File private data */
From f977098a9a02ac2df267eafe860370cb4c407d69 Mon Sep 17 00:00:00 2001
From: Chris Wilson <chris@chris-wilson.co.uk>
Date: Wed, 5 Oct 2016 13:21:44 +0100
Subject: [PATCH] UPSTREAM: drm/prime: Take a ref on the drm_dev when exporting
a dma_buf
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
dma_buf may live a long time, longer than the last direct user of the
driver. We already hold a reference to the owner module (that prevents
the object code from disappearing), but there is no reference to the
drm_dev - so the pointers to the driver backend themselves may vanish.
v2: Resist temptation to fix the bug in armada_gem.c not setting the
correct flags on the exported dma-buf (it should pass the flags through
and not be arbitrarily setting O_RDWR).
Use a common wrapper for exporting the dmabuf and acquiring the
reference to the drm_device.
Testcase: igt/vgem_basic/unload
Suggested-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Petri Latvala <petri.latvala@intel.com>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: stable@vger.kernel.org
Tested-by: Petri Latvala <petri.latvala@intel.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Link: http://patchwork.freedesktop.org/patch/msgid/20161005122145.1507-2-chris@chris-wilson.co.uk
(cherry picked from commit a4fce9cb782ad340ee5576a38e934e5e75832dc6)
---
drivers/gpu/drm/armada/armada_gem.c | 2 +-
drivers/gpu/drm/drm_prime.c | 30 +++++++++++++++++++++++++++++-
drivers/gpu/drm/i915/i915_gem_dmabuf.c | 2 +-
drivers/gpu/drm/tegra/gem.c | 2 +-
drivers/gpu/drm/udl/udl_dmabuf.c | 2 +-
include/drm/drmP.h | 4 ++++
6 files changed, 37 insertions(+), 5 deletions(-)
diff --git a/drivers/gpu/drm/armada/armada_gem.c b/drivers/gpu/drm/armada/armada_gem.c
index 60a688ef81c7..cd5bb991f49a 100644
--- a/drivers/gpu/drm/armada/armada_gem.c
+++ b/drivers/gpu/drm/armada/armada_gem.c
@@ -546,7 +546,7 @@ armada_gem_prime_export(struct drm_device *dev, struct drm_gem_object *obj,
exp_info.flags = O_RDWR;
exp_info.priv = obj;
- return dma_buf_export(&exp_info);
+ return drm_gem_dmabuf_export(dev, &exp_info);
}
struct drm_gem_object *
diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c
index 4c49e736bc9c..94b4872255c8 100644
--- a/drivers/gpu/drm/drm_prime.c
+++ b/drivers/gpu/drm/drm_prime.c
@@ -283,19 +283,47 @@ static void drm_gem_unmap_dma_buf(struct dma_buf_attachment *attach,
/* nothing to be done here */
}
+/**
+ * drm_gem_dmabuf_export - dma_buf export implementation for GEM
+ * @dma_buf: buffer to be exported
+ *
+ * This wraps dma_buf_export() for use by generic GEM drivers that are using
+ * drm_gem_dmabuf_release(). In addition to calling dma_buf_export(), we take
+ * a reference to the drm_device which is released by drm_gem_dmabuf_release().
+ *
+ * Returns the new dmabuf.
+ */
+struct dma_buf *drm_gem_dmabuf_export(struct drm_device *dev,
+ struct dma_buf_export_info *exp_info)
+{
+ struct dma_buf *dma_buf;
+
+ dma_buf = dma_buf_export(exp_info);
+ if (!IS_ERR(dma_buf))
+ drm_dev_ref(dev);
+
+ return dma_buf;
+}
+EXPORT_SYMBOL(drm_gem_dmabuf_export);
+
/**
* drm_gem_dmabuf_release - dma_buf release implementation for GEM
* @dma_buf: buffer to be released
*
* Generic release function for dma_bufs exported as PRIME buffers. GEM drivers
* must use this in their dma_buf ops structure as the release callback.
+ * drm_gem_dmabuf_release() should be used in conjunction with
+ * drm_gem_dmabuf_export().
*/
void drm_gem_dmabuf_release(struct dma_buf *dma_buf)
{
struct drm_gem_object *obj = dma_buf->priv;
+ struct drm_device *dev = obj->dev;
/* drop the reference on the export fd holds */
drm_gem_object_unreference_unlocked(obj);
+
+ drm_dev_unref(dev);
}
EXPORT_SYMBOL(drm_gem_dmabuf_release);
@@ -444,7 +472,7 @@ struct dma_buf *drm_gem_prime_export(struct drm_device *dev,
if (dev->driver->gem_prime_res_obj)
exp_info.resv = dev->driver->gem_prime_res_obj(obj);
- return dma_buf_export(&exp_info);
+ return drm_gem_dmabuf_export(dev, &exp_info);
}
EXPORT_SYMBOL(drm_gem_prime_export);
diff --git a/drivers/gpu/drm/i915/i915_gem_dmabuf.c b/drivers/gpu/drm/i915/i915_gem_dmabuf.c
index e9c2bfd85b52..d4a021629bd6 100644
--- a/drivers/gpu/drm/i915/i915_gem_dmabuf.c
+++ b/drivers/gpu/drm/i915/i915_gem_dmabuf.c
@@ -244,7 +244,7 @@ struct dma_buf *i915_gem_prime_export(struct drm_device *dev,
return ERR_PTR(ret);
}
- return dma_buf_export(&exp_info);
+ return drm_gem_dmabuf_export(dev, &exp_info);
}
static int i915_gem_object_get_pages_dmabuf(struct drm_i915_gem_object *obj)
diff --git a/drivers/gpu/drm/tegra/gem.c b/drivers/gpu/drm/tegra/gem.c
index 01e16e146bfe..da06f1c1ee0f 100644
--- a/drivers/gpu/drm/tegra/gem.c
+++ b/drivers/gpu/drm/tegra/gem.c
@@ -625,7 +625,7 @@ struct dma_buf *tegra_gem_prime_export(struct drm_device *drm,
exp_info.flags = flags;
exp_info.priv = gem;
- return dma_buf_export(&exp_info);
+ return drm_gem_dmabuf_export(drm, &exp_info);
}
struct drm_gem_object *tegra_gem_prime_import(struct drm_device *drm,
diff --git a/drivers/gpu/drm/udl/udl_dmabuf.c b/drivers/gpu/drm/udl/udl_dmabuf.c
index e2243edd1ce3..ac90ffdb5912 100644
--- a/drivers/gpu/drm/udl/udl_dmabuf.c
+++ b/drivers/gpu/drm/udl/udl_dmabuf.c
@@ -209,7 +209,7 @@ struct dma_buf *udl_gem_prime_export(struct drm_device *dev,
exp_info.flags = flags;
exp_info.priv = obj;
- return dma_buf_export(&exp_info);
+ return drm_gem_dmabuf_export(dev, &exp_info);
}
static int udl_prime_create(struct drm_device *dev,
diff --git a/include/drm/drmP.h b/include/drm/drmP.h
index 93da65df2e7e..4aba6478d718 100644
--- a/include/drm/drmP.h
+++ b/include/drm/drmP.h
@@ -1124,6 +1124,8 @@ static inline int drm_debugfs_remove_files(const struct drm_info_list *files,
}
#endif
+struct dma_buf_export_info;
+
extern struct dma_buf *drm_gem_prime_export(struct drm_device *dev,
struct drm_gem_object *obj,
int flags);
@@ -1134,6 +1136,8 @@ extern struct drm_gem_object *drm_gem_prime_import(struct drm_device *dev,
struct dma_buf *dma_buf);
extern int drm_gem_prime_fd_to_handle(struct drm_device *dev,
struct drm_file *file_priv, int prime_fd, uint32_t *handle);
+struct dma_buf *drm_gem_dmabuf_export(struct drm_device *dev,
+ struct dma_buf_export_info *exp_info);
extern void drm_gem_dmabuf_release(struct dma_buf *dma_buf);
extern int drm_prime_sg_to_page_addr_arrays(struct sg_table *sgt, struct page **pages,
From f30ee0d19425a6c21a9959513e482282ba08dd6a Mon Sep 17 00:00:00 2001
From: Chris Wilson <chris@chris-wilson.co.uk>
Date: Wed, 7 Dec 2016 21:45:27 +0000
Subject: [PATCH] UPSTREAM: drm: Take ownership of the dmabuf->obj when
exporting
Currently the reference for the dmabuf->obj is incremented for the
dmabuf in drm_gem_prime_handle_to_fd() (at the high level userspace
interface), but is released in drm_gem_dmabuf_release() (the lowlevel
handler). Improve the symmetry of the dmabuf->obj ownership by acquiring
the reference in drm_gem_dmabuf_export(). This makes it easier to use
the prime functions directly.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
[danvet: Update kerneldoc.]
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Link: http://patchwork.freedesktop.org/patch/msgid/20161207214527.22533-1-chris@chris-wilson.co.uk
(cherry picked from commit 72a93e8dd52c9feea42f1258d555e6070680a347)
---
drivers/gpu/drm/drm_prime.c | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)
diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c
index 94b4872255c8..dbd34fa7f71c 100644
--- a/drivers/gpu/drm/drm_prime.c
+++ b/drivers/gpu/drm/drm_prime.c
@@ -289,7 +289,8 @@ static void drm_gem_unmap_dma_buf(struct dma_buf_attachment *attach,
*
* This wraps dma_buf_export() for use by generic GEM drivers that are using
* drm_gem_dmabuf_release(). In addition to calling dma_buf_export(), we take
- * a reference to the drm_device which is released by drm_gem_dmabuf_release().
+ * a reference to the &drm_device and the exported &drm_gem_object (stored in
+ * exp_info->priv) which is released by drm_gem_dmabuf_release().
*
* Returns the new dmabuf.
*/
@@ -299,8 +300,11 @@ struct dma_buf *drm_gem_dmabuf_export(struct drm_device *dev,
struct dma_buf *dma_buf;
dma_buf = dma_buf_export(exp_info);
- if (!IS_ERR(dma_buf))
- drm_dev_ref(dev);
+ if (IS_ERR(dma_buf))
+ return dma_buf;
+
+ drm_dev_ref(dev);
+ drm_gem_object_reference(exp_info->priv);
return dma_buf;
}
@@ -503,8 +507,6 @@ static struct dma_buf *export_and_register_object(struct drm_device *dev,
*/
obj->dma_buf = dmabuf;
get_dma_buf(obj->dma_buf);
- /* Grab a new ref since the callers is now used by the dma-buf */
- drm_gem_object_reference(obj);
return dmabuf;
}
From a1fe1ad6076ec27f60555a9393f40959cea94bff Mon Sep 17 00:00:00 2001
From: Lucas Stach <l.stach@pengutronix.de>
Date: Thu, 30 Nov 2017 18:34:28 +0100
Subject: [PATCH] UPSTREAM: drm/prime: skip CPU sync in map/unmap dma_buf
Dma-bufs should already be device coherent, as they are only pulled in the
CPU domain via the begin/end cpu_access calls. As we cache the mapping set
up by dma_map_sg a CPU sync at this point will not actually guarantee proper
coherency on non-coherent architectures, so we can as well stop pretending.
This is an important performance fix for architectures which need explicit
cache synchronization and userspace doing lots of dma-buf imports.
Improves Weston on Etnaviv performance 5x, where before this patch > 90%
of Weston CPU time was spent synchronizing caches for buffers which are
already device coherent.
Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Link: https://patchwork.freedesktop.org/patch/msgid/20171130173428.8666-1-l.stach@pengutronix.de
(cherry picked from commit ca0e68e21aae10220eff71a297e7d794425add77)
---
drivers/gpu/drm/drm_prime.c | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c
index dbd34fa7f71c..133362279591 100644
--- a/drivers/gpu/drm/drm_prime.c
+++ b/drivers/gpu/drm/drm_prime.c
@@ -203,9 +203,12 @@ static void drm_gem_map_detach(struct dma_buf *dma_buf,
sgt = prime_attach->sgt;
if (sgt) {
+ DEFINE_DMA_ATTRS(attrs);
+ dma_set_attr(DMA_ATTR_SKIP_CPU_SYNC, &attrs);
if (prime_attach->dir != DMA_NONE)
- dma_unmap_sg(attach->dev, sgt->sgl, sgt->nents,
- prime_attach->dir);
+ dma_unmap_sg_attrs(attach->dev, sgt->sgl, sgt->nents,
+ prime_attach->dir,
+ &attrs);
sg_free_table(sgt);
}
@@ -263,7 +266,9 @@ static struct sg_table *drm_gem_map_dma_buf(struct dma_buf_attachment *attach,
sgt = obj->dev->driver->gem_prime_get_sg_table(obj);
if (!IS_ERR(sgt)) {
- if (!dma_map_sg(attach->dev, sgt->sgl, sgt->nents, dir)) {
+ DEFINE_DMA_ATTRS(attrs);
+ dma_set_attr(DMA_ATTR_SKIP_CPU_SYNC, &attrs);
+ if (!dma_map_sg_attrs(attach->dev, sgt->sgl, sgt->nents, dir, &attrs)) {
sg_free_table(sgt);
kfree(sgt);
sgt = ERR_PTR(-ENOMEM);
From bdfc956545f8292cf462a7feee96d811f5d34414 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Christian=20K=C3=B6nig?= <ckoenig.leichtzumerken@gmail.com>
Date: Tue, 27 Feb 2018 12:49:56 +0100
Subject: [PATCH] UPSTREAM: drm/prime: fix potential race in drm_gem_map_detach
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Unpin the GEM object only after freeing the sg table.
Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Acked-by: Roger He <Hongbo.He@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20180227115000.4105-1-christian.koenig@amd.com
(cherry picked from commit 681066ec1d41e4b299146bada52cef846b323c04)
---
drivers/gpu/drm/drm_prime.c | 36 ++++++++++++++++++------------------
1 file changed, 18 insertions(+), 18 deletions(-)
diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c
index 133362279591..95ecc69d03a0 100644
--- a/drivers/gpu/drm/drm_prime.c
+++ b/drivers/gpu/drm/drm_prime.c
@@ -193,28 +193,28 @@ static void drm_gem_map_detach(struct dma_buf *dma_buf,
struct drm_prime_attachment *prime_attach = attach->priv;
struct drm_gem_object *obj = dma_buf->priv;
struct drm_device *dev = obj->dev;
- struct sg_table *sgt;
-
- if (dev->driver->gem_prime_unpin)
- dev->driver->gem_prime_unpin(obj);
- if (!prime_attach)
- return;
+ if (prime_attach) {
+ struct sg_table *sgt = prime_attach->sgt;
+
+ if (sgt) {
+ DEFINE_DMA_ATTRS(attrs);
+ dma_set_attr(DMA_ATTR_SKIP_CPU_SYNC, &attrs);
+ if (prime_attach->dir != DMA_NONE)
+ dma_unmap_sg_attrs(attach->dev, sgt->sgl,
+ sgt->nents,
+ prime_attach->dir,
+ &attrs);
+ sg_free_table(sgt);
+ }
- sgt = prime_attach->sgt;
- if (sgt) {
- DEFINE_DMA_ATTRS(attrs);
- dma_set_attr(DMA_ATTR_SKIP_CPU_SYNC, &attrs);
- if (prime_attach->dir != DMA_NONE)
- dma_unmap_sg_attrs(attach->dev, sgt->sgl, sgt->nents,
- prime_attach->dir,
- &attrs);
- sg_free_table(sgt);
+ kfree(sgt);
+ kfree(prime_attach);
+ attach->priv = NULL;
}
- kfree(sgt);
- kfree(prime_attach);
- attach->priv = NULL;
+ if (dev->driver->gem_prime_unpin)
+ dev->driver->gem_prime_unpin(obj);
}
void drm_prime_remove_buf_handle_locked(struct drm_prime_file_private *prime_fpriv,
From 54f13f6370c654d59a9a5938e5953888a65c1980 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Christian=20K=C3=B6nig?= <ckoenig.leichtzumerken@gmail.com>
Date: Tue, 27 Feb 2018 12:49:57 +0100
Subject: [PATCH] UPSTREAM: drm/prime: make the pages array optional for
drm_prime_sg_to_page_addr_arrays
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Most of the time we only need the dma addresses.
Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Roger He <Hongbo.He@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20180227115000.4105-2-christian.koenig@amd.com
Link: https://patchwork.freedesktop.org/patch/msgid/20180227115000.4105-3-christian.koenig@amd.com
Link: https://patchwork.freedesktop.org/patch/msgid/20180227115000.4105-4-christian.koenig@amd.com
Link: https://patchwork.freedesktop.org/patch/msgid/20180227115000.4105-5-christian.koenig@amd.com
Link: https://patchwork.freedesktop.org/patch/msgid/BN6PR12MB18262C0DE9B5F07B9A42EAE7F2C60@BN6PR12MB1826.namprd12.prod.outlook.com
(cherry picked from commit 186ca446aea19e49d2e1433dd170c6e1c211a52a)
---
drivers/gpu/drm/drm_prime.c | 20 ++++++++++----------
1 file changed, 10 insertions(+), 10 deletions(-)
diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c
index 95ecc69d03a0..7ea65c4105c1 100644
--- a/drivers/gpu/drm/drm_prime.c
+++ b/drivers/gpu/drm/drm_prime.c
@@ -827,40 +827,40 @@ EXPORT_SYMBOL(drm_prime_pages_to_sg);
/**
* drm_prime_sg_to_page_addr_arrays - convert an sg table into a page array
* @sgt: scatter-gather table to convert
- * @pages: array of page pointers to store the page array in
+ * @pages: optional array of page pointers to store the page array in
* @addrs: optional array to store the dma bus address of each page
- * @max_pages: size of both the passed-in arrays
+ * @max_entries: size of both the passed-in arrays
*
* Exports an sg table into an array of pages and addresses. This is currently
* required by the TTM driver in order to do correct fault handling.
*/
int drm_prime_sg_to_page_addr_arrays(struct sg_table *sgt, struct page **pages,
- dma_addr_t *addrs, int max_pages)
+ dma_addr_t *addrs, int max_entries)
{
unsigned count;
struct scatterlist *sg;
struct page *page;
- u32 len;
- int pg_index;
+ u32 len, index;
dma_addr_t addr;
- pg_index = 0;
+ index = 0;
for_each_sg(sgt->sgl, sg, sgt->nents, count) {
len = sg->length;
page = sg_page(sg);
addr = sg_dma_address(sg);
while (len > 0) {
- if (WARN_ON(pg_index >= max_pages))
+ if (WARN_ON(index >= max_entries))
return -1;
- pages[pg_index] = page;
+ if (pages)
+ pages[index] = page;
if (addrs)
- addrs[pg_index] = addr;
+ addrs[index] = addr;
page++;
addr += PAGE_SIZE;
len -= PAGE_SIZE;
- pg_index++;
+ index++;
}
}
return 0;
From c5e39a7e46511dffadabea97e3d74310561d1ba0 Mon Sep 17 00:00:00 2001
From: Chris Wilson <chris@chris-wilson.co.uk>
Date: Sat, 19 Aug 2017 13:05:58 +0100
Subject: [PATCH] UPSTREAM: drm: Release driver tracking before making the
object available again
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
This is the same bug as we fixed in commit f6cd7daecff5 ("drm: Release
driver references to handle before making it available again"), but now
the exposure is via the PRIME lookup tables. If we remove the
object/handle from the PRIME lut, then a new request for the same
object/fd will generate a new handle, thus for a short window that
object is known to userspace by two different handles. Fix this by
releasing the driver tracking before PRIME.
Fixes: 0ff926c7d4f0 ("drm/prime: add exported buffers to current fprivs
imported buffer list (v2)")
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: David Airlie <airlied@linux.ie>
Cc: Daniel Vetter <daniel.vetter@intel.com>
Cc: Rob Clark <robdclark@gmail.com>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Cc: Thierry Reding <treding@nvidia.com>
Cc: stable@vger.kernel.org
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20170819120558.6465-1-chris@chris-wilson.co.uk
(cherry picked from commit d0a133f7f5bc3583e460ba6bb54474a50ada5201)
---
drivers/gpu/drm/drm_gem.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c
index d7f39a03c2c9..966ea63581b1 100644
--- a/drivers/gpu/drm/drm_gem.c
+++ b/drivers/gpu/drm/drm_gem.c
@@ -255,13 +255,13 @@ drm_gem_object_release_handle(int id, void *ptr, void *data)
struct drm_gem_object *obj = ptr;
struct drm_device *dev = obj->dev;
+ if (dev->driver->gem_close_object)
+ dev->driver->gem_close_object(obj, file_priv);
+
if (drm_core_check_feature(dev, DRIVER_PRIME))
drm_gem_remove_prime_handles(obj, file_priv);
drm_vma_node_revoke(&obj->vma_node, file_priv->filp);
- if (dev->driver->gem_close_object)
- dev->driver->gem_close_object(obj, file_priv);
-
drm_gem_object_handle_unreference_unlocked(obj);
return 0;
From 42f26aa9c8d429886b0af174b740f72741e571e2 Mon Sep 17 00:00:00 2001
From: Jonas Karlman <jonas@kwiboo.se>
Date: Sat, 17 Feb 2018 05:30:36 +0100
Subject: [PATCH] vcodec: skip reduce freq
---
drivers/video/rockchip/vcodec/vcodec_service.c | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/drivers/video/rockchip/vcodec/vcodec_service.c b/drivers/video/rockchip/vcodec/vcodec_service.c
index 0f177d9ab4c2..903ea8554649 100644
--- a/drivers/video/rockchip/vcodec/vcodec_service.c
+++ b/drivers/video/rockchip/vcodec/vcodec_service.c
@@ -1602,9 +1602,6 @@ static void try_set_reg(struct vpu_subdev_data *data)
reg_from_wait_to_run(pservice, reg);
reg_copy_to_hw(reg->data, reg);
}
- } else {
- if (pservice->hw_ops->reduce_freq)
- pservice->hw_ops->reduce_freq(pservice);
}
mutex_unlock(&pservice->shutdown_lock);
@@ -2353,6 +2350,7 @@ static void vcodec_set_freq_rk3328(struct vpu_service_info *pservice,
if (curr == reg->freq)
return;
+ atomic_set(&pservice->freq_status, reg->freq);
if (pservice->dev_id == VCODEC_DEVICE_ID_RKVDEC) {
if (reg->reg[1] & 0x00800000) {
if (rkv_dec_get_fmt(reg->reg) == FMT_H264D)

View File

@ -20,7 +20,6 @@ devices = {
'rockbox' : { 'dtb' : 'rk3328-rockbox.dtb', 'config' : 'evb-rk3328_defconfig' },
},
'RK3399' : {
'odroidn1' : { 'dtb' : 'rk3399-odroidn1.dtb', 'config' : 'odroidn1_config' },
'rock960' : { 'dtb' : 'rk3399-rock960.dtb', 'config' : 'evb-rk3399_config' },
'rockpro64' : { 'dtb' : 'rk3399-rockpro64.dtb', 'config' : 'evb-rk3399_config' },
'sapphire' : { 'dtb' : 'rk3399-sapphire.dtb', 'config' : 'evb-rk3399_config' },