armv8: ls1012a: enable/disable eSDHC1 through hwconfig for new RDB
PATCH v3 1/1 armv8: ls1012a: enable/disable eSDHC1 through hwconfig for new RDB
For LS1012ARDB RevD and later versions, the I2C reading for DIP switch setting had been no longer reliable since the board was reworked. This patch is to add hwconfig support to enable/disable eSDHC1 manually for these boards. Also let kernel decide status of esdhc0.
---
Changes for v2:
- Just used hwconfig() instead of getenv() and hwconfig_f().
Changes for v3:
- only applied hwconfig support for RevD and later versions.
--- board/freescale/ls1012ardb/ls1012ardb.c | 51 +++++++++++++++++++++------------ include/configs/ls1012ardb.h | 4 +++ 2 files changed, 36 insertions(+), 19 deletions(-)
board/freescale/ls1012ardb/ls1012ardb.c +32 -19
@@ -132,39 +132,52 @@ int board_init(void)int esdhc_status_fixup (void *blob,const char *compat) { -char esdhc0_path[] ="/soc/esdhc at 1560000" ;char esdhc1_path[] ="/soc/esdhc at 1580000" ; +u8 in1;u8 io =0 ;u8 mux_sdhc2; - -do_fixup_by_path (blob, esdhc0_path,"status" ,"okay" , -sizeof ("okay" ),1 ); +bool sdhc2_en = false;i2c_set_bus_num (0 ); -/* -* The I2C IO-expander for mux select is used to control the muxing -* of various onboard interfaces. -* -* IO1[3:2] indicates SDHC2 interface demultiplexer select lines. -* 00 - SDIO wifi -* 01 - GPIO (to Arduino) -* 10 - eMMC Memory -* 11 - SPI -*/ -if (i2c_read (I2C_MUX_IO1_ADDR ,0 ,1 , &io,1 ) <0 ) { +if (i2c_read (I2C_MUX_IO1_ADDR ,1 ,1 , &in1,1 ) <0 ) {printf ("Error reading i2c boot information!\n" ); -return 0 ;/* Don't want to hang() on this error */ +return 0 ; + } + +if ((in1 & (~__SW_REV_MASK)) <= __SW_REV_D) { +if (hwconfig ("esdhc1" )) + sdhc2_en = true; + }else { +/* +* The I2C IO-expander for mux select is used to control +* the muxing of various onboard interfaces. +* +* IO1[3:2] indicates SDHC2 interface demultiplexer +* select lines. +* 00 - SDIO wifi +* 01 - GPIO (to Arduino) +* 10 - eMMC Memory +* 11 - SPI +*/ +if (i2c_read (I2C_MUX_IO1_ADDR ,0 ,1 , &io,1 ) <0 ) { +printf ("Error reading i2c boot information!\n" ); +return 0 ;/* Don't want to hang() on this error */ + } + + mux_sdhc2 = (io &0x0c ) >>2 ; +/* Enable SDHC2 only when use SDIO wifi and eMMC */ +if (mux_sdhc2 ==2 || mux_sdhc2 ==0 ) + sdhc2_en = true; } - mux_sdhc2 = (io &0x0c ) >>2 ; -/* Enable SDHC2 only when use SDIO wifi and eMMC */ -if (mux_sdhc2 ==2 || mux_sdhc2 ==0 ) +if (sdhc2_en)do_fixup_by_path (blob, esdhc1_path,"status" ,"okay" ,sizeof ("okay" ),1 );else do_fixup_by_path (blob, esdhc1_path,"status" ,"disabled" ,sizeof ("disabled" ),1 ); +return 0 ; }
include/configs/ls1012ardb.h +4 -0
@@ -32,6 +32,10 @@#define __SW_REV_MASK 0x07#define __SW_REV_A 0xF8#define __SW_REV_B 0xF0 +#define __SW_REV_C 0xE8 +#define __SW_REV_C1 0xE0 +#define __SW_REV_C2 0xD8 +#define __SW_REV_D 0xD0/* MMC */ #ifdef CONFIG_MMC
Signature · 1 line
2.14.1
PATCH v3 1/1 armv8: ls1012a: enable/disable eSDHC1 through hwconfig for new RDB
Quoted 3 lines · Yangbo Lu
For LS1012ARDB RevD and later versions, the I2C reading for DIP switch setting had been no longer reliable since the board was reworked. This patch is to add hwconfig support to enable/disable
I think this message is not accurate. How about saying "I2C reading for DIP switch setting is not reliable for LS1012ARDB rev D and later revisions."?
Quoted 2 lines
eSDHC1 manually for these boards. Also let kernel decide status of esdhc0.
I see you dropped fixing up esdhc0. What do you mean "let kernel decide"? How?
Quoted 17 lines
Signed-off-by Yangbo Lu <[email protected]>---
Changes for v2:
- Just usedhwconfig()instead ofgetenv()andhwconfig_f().
Changes for v3:
- only applied hwconfig support for RevD and later versions.--- board/freescale/ls1012ardb/ls1012ardb.c | 51 +++++++++++++++++++++------------ include/configs/ls1012ardb.h | 4 +++ 2 files changed, 36 insertions(+), 19 deletions(-)board/freescale/ls1012ardb/ls1012ardb.c +0
-0
board/freescale/ls1012ardb/ls1012ardb.c int board_init(void) · line 136
Quoted 6 lines
board/freescale/ls1012ardb/ls1012ardb.c +1
-1@@ -132,39 +132,52 @@ int board_init(void)int esdhc_status_fixup (void *blob,const char *compat) { -char esdhc0_path[] ="/soc/esdhc at 1560000" ;char esdhc1_path[] ="/soc/esdhc at 1580000" ; +u8 in1;
I think you can reuse "io". Not a big deal though.
Quoted 11 lines
board/freescale/ls1012ardb/ls1012ardb.c +1
-5u8 io =0 ;u8 mux_sdhc2; - -do_fixup_by_path (blob, esdhc0_path,"status" ,"okay" , -sizeof ("okay" ),1 ); +bool sdhc2_en = false;i2c_set_bus_num (0 ); -/* -* The I2C IO-expander for mux select is used to control the muxing
board/freescale/ls1012ardb/ls1012ardb.c int board_init(void) · line 143
Quoted 10 lines
board/freescale/ls1012ardb/ls1012ardb.c +1
-9-* of various onboard interfaces. -* -* IO1[3:2] indicates SDHC2 interface demultiplexer select lines. -* 00 - SDIO wifi -* 01 - GPIO (to Arduino) -* 10 - eMMC Memory -* 11 - SPI -*/ -if (i2c_read (I2C_MUX_IO1_ADDR ,0 ,1 , &io,1 ) <0 ) { +if (i2c_read (I2C_MUX_IO1_ADDR ,1 ,1 , &in1,1 ) <0 ) {
It would be helpful to use a named macro instead of "1" here as the register address. It is not obvious that you are reading a revision number. You can also put a comment.
You said I2C reading the DIP is not reliable. Is this reading reliable?
board/freescale/ls1012ardb/ls1012ardb.c int board_init(void) · line 145
Quoted 3 lines
board/freescale/ls1012ardb/ls1012ardb.c +1
-1printf ("Error reading i2c boot information!\n" ); -return 0 ;/* Don't want to hang() on this error */ +return 0 ;
What does I2C failure mean here? Returning 0 will cause the code keep going in fdt_fixup_esdhc().
board/freescale/ls1012ardb/ls1012ardb.c int board_init(void) · line 149
Quoted 4 lines
board/freescale/ls1012ardb/ls1012ardb.c +4
-0+ } + +if ((in1 & (~__SW_REV_MASK)) <= __SW_REV_D) { +if (hwconfig ("esdhc1" ))
Please double check. I remember in the past if hwconfig is not enabled, any check returns true.
Quoted 42 lines
board/freescale/ls1012ardb/ls1012ardb.c +24
-3+ sdhc2_en = true; + }else { +/* +* The I2C IO-expander for mux select is used to control +* the muxing of various onboard interfaces. +* +* IO1[3:2] indicates SDHC2 interface demultiplexer +* select lines. +* 00 - SDIO wifi +* 01 - GPIO (to Arduino) +* 10 - eMMC Memory +* 11 - SPI +*/ +if (i2c_read (I2C_MUX_IO1_ADDR ,0 ,1 , &io,1 ) <0 ) { +printf ("Error reading i2c boot information!\n" ); +return 0 ;/* Don't want to hang() on this error */ + } + + mux_sdhc2 = (io &0x0c ) >>2 ; +/* Enable SDHC2 only when use SDIO wifi and eMMC */ +if (mux_sdhc2 ==2 || mux_sdhc2 ==0 ) + sdhc2_en = true; } - mux_sdhc2 = (io &0x0c ) >>2 ; -/* Enable SDHC2 only when use SDIO wifi and eMMC */ -if (mux_sdhc2 ==2 || mux_sdhc2 ==0 ) +if (sdhc2_en)do_fixup_by_path (blob, esdhc1_path,"status" ,"okay" ,sizeof ("okay" ),1 );else do_fixup_by_path (blob, esdhc1_path,"status" ,"disabled" ,sizeof ("disabled" ),1 ); +return 0 ; }include/configs/ls1012ardb.h +0
-0
include/configs/ls1012ardb.h line 38
Quoted 7 lines
include/configs/ls1012ardb.h +4
-0@@ -32,6 +32,10 @@#define __SW_REV_MASK 0x07#define __SW_REV_A 0xF8#define __SW_REV_B 0xF0 +#define __SW_REV_C 0xE8 +#define __SW_REV_C1 0xE0 +#define __SW_REV_C2 0xD8 +#define __SW_REV_D 0xD0
I don't have strong opinion about these macros. I would not use underscore myself. I guess I missed them at the first place.
York
PATCH v3 1/1 armv8: ls1012a: enable/disable eSDHC1 through hwconfig for new RDB
Hi York,
Quoted 7 lines
-----Original Message-----
From: York Sun
Sent: 2017年12月7日 3:08
To: Y.b. Lu <[email protected]>; u-boot at lists.denx.de
Subject: Re: [v3] armv8: ls1012a: enable/disable eSDHC1 through hwconfig for new RDB
Quoted 8 lines
Quoted 3 lines · Yangbo Lu
For LS1012ARDB RevD and later versions, the I2C reading for DIP switch setting had been no longer reliable since the board was reworked. This patch is to add hwconfig support to enable/disable
I think this message is not accurate. How about saying "I2C reading for DIP switch setting is not reliable for LS1012ARDB rev D and later revisions."?
[Y.b. Lu] Thanks. This is better.
Quoted 5 lines
Quoted 2 lines
eSDHC1 manually for these boards. Also let kernel decide status of esdhc0.
I see you dropped fixing up esdhc0. What do you mean "let kernel decide"? How?
[Y.b. Lu] I mean unless to avoid some issue, we don’t need to do any fix-up for 'status'.
Let me rephrase it as "Also drop 'status' fix-up for esdhc0 and leave it as it is. It shouldn’t be always fixed up with 'okay'. ".
Quoted 21 lines
Quoted 10 lines
Signed-off-by Yangbo Lu <[email protected]>---
Changes for v2:
- Just usedhwconfig()instead ofgetenv()andhwconfig_f().
Changes for v3:
- only applied hwconfig support for RevD and later versions.--- board/freescale/ls1012ardb/ls1012ardb.c | 51+++++++++++++++++++++------------
Quoted 10 lines
include/configs/ls1012ardb.h | 4 +++ 2 files changed, 36 insertions(+), 19 deletions(-)board/freescale/ls1012ardb/ls1012ardb.c +0
-0@@ -132,39 +132,52 @@ int board_init(void)
Quoted 6 lines
board/freescale/ls1012ardb/ls1012ardb.c int board_init(void) · line 136
Quoted 4 lines
board/freescale/ls1012ardb/ls1012ardb.c +1
-1int esdhc_status_fixup (void *blob,const char *compat) { -char esdhc0_path[] ="/soc/esdhc at 1560000" ;char esdhc1_path[] ="/soc/esdhc at 1580000" ; +u8 in1;I think you can reuse "io". Not a big deal though.
[Y.b. Lu] Ok. Will do that.
Quoted 10 lines
Quoted 10 lines
board/freescale/ls1012ardb/ls1012ardb.c +1
-3u8 io =0 ;u8 mux_sdhc2; - -do_fixup_by_path (blob, esdhc0_path,"status" ,"okay" , -sizeof ("okay" ),1 ); +bool sdhc2_en = false;i2c_set_bus_num (0 );
Quoted 16 lines
board/freescale/ls1012ardb/ls1012ardb.c int board_init(void) · line 143
Quoted 12 lines
board/freescale/ls1012ardb/ls1012ardb.c +1
-11-/* -* The I2C IO-expander for mux select is used to control the muxing -* of various onboard interfaces. -* -* IO1[3:2] indicates SDHC2 interface demultiplexer select lines. -* 00 - SDIO wifi -* 01 - GPIO (to Arduino) -* 10 - eMMC Memory -* 11 - SPI -*/ -if (i2c_read (I2C_MUX_IO1_ADDR ,0 ,1 , &io,1 ) <0 ) { +if (i2c_read (I2C_MUX_IO1_ADDR ,1 ,1 , &in1,1 ) <0 ) {It would be helpful to use a named macro instead of "1" here as the register address. It is not obvious that you are reading a revision number. You can also put a comment.
[Y.b. Lu] Let me put a comment here for this patch. I think it's proper to replace all the numbers with macro in this file in another patch.
Quoted 2 lines
You said I2C reading the DIP is not reliable. Is this reading reliable?
[Y.b. Lu] This is a question... Although I had verified this patch on RevE(the value read is correct), let me confirm with Kinjalk before sending new version patch.
Quoted 7 lines
board/freescale/ls1012ardb/ls1012ardb.c int board_init(void) · line 145
Quoted 4 lines
board/freescale/ls1012ardb/ls1012ardb.c +1
-1printf ("Error reading i2c boot information!\n" ); -return 0 ;/* Don't want to hang() on this error */ +return 0 ;What does I2C failure mean here? Returning 0 will cause the code keep going in
fdt_fixup_esdhc().
[Y.b. Lu] I don’t know the possibility of I2C failure. If the failure happens, just print error message, leave 'status' as it is, and return 0 because the other fix-ups in fdt_fixup_esdhc() are still needed like clock-frequency.
Quoted 8 lines
board/freescale/ls1012ardb/ls1012ardb.c int board_init(void) · line 149
Quoted 5 lines
board/freescale/ls1012ardb/ls1012ardb.c +4
-0+ } + +if ((in1 & (~__SW_REV_MASK)) <= __SW_REV_D) { +if (hwconfig ("esdhc1" ))Please double check. I remember in the past if hwconfig is not enabled, any check returns true.
[Y.b. Lu] You're right. It's -ENOSYS. But what should I do here ?
Quoted 38 lines
Quoted 38 lines
board/freescale/ls1012ardb/ls1012ardb.c +24
-3+ sdhc2_en = true; + }else { +/* +* The I2C IO-expander for mux select is used to control +* the muxing of various onboard interfaces. +* +* IO1[3:2] indicates SDHC2 interface demultiplexer +* select lines. +* 00 - SDIO wifi +* 01 - GPIO (to Arduino) +* 10 - eMMC Memory +* 11 - SPI +*/ +if (i2c_read (I2C_MUX_IO1_ADDR ,0 ,1 , &io,1 ) <0 ) { +printf ("Error reading i2c boot information!\n" ); +return 0 ;/* Don't want to hang() on this error */ + } + + mux_sdhc2 = (io &0x0c ) >>2 ; +/* Enable SDHC2 only when use SDIO wifi and eMMC */ +if (mux_sdhc2 ==2 || mux_sdhc2 ==0 ) + sdhc2_en = true; } - mux_sdhc2 = (io &0x0c ) >>2 ; -/* Enable SDHC2 only when use SDIO wifi and eMMC */ -if (mux_sdhc2 ==2 || mux_sdhc2 ==0 ) +if (sdhc2_en)do_fixup_by_path (blob, esdhc1_path,"status" ,"okay" ,sizeof ("okay" ),1 );else do_fixup_by_path (blob, esdhc1_path,"status" ,"disabled" ,sizeof ("disabled" ),1 ); +return 0 ; }
Quoted 15 lines
include/configs/ls1012ardb.h line 38
Quoted 12 lines
(quoted diff) +0
-0
b/include/configs/ls1012ardb.hindex794117062f..d5384e6027100644include/configs/ls1012ardb.h +4
-0@@ -32,6 +32,10 @@#define __SW_REV_MASK 0x07#define __SW_REV_A 0xF8#define __SW_REV_B 0xF0 +#define __SW_REV_C 0xE8 +#define __SW_REV_C1 0xE0 +#define __SW_REV_C2 0xD8 +#define __SW_REV_D 0xD0I don't have strong opinion about these macros. I would not use underscore myself. I guess I missed them at the first place.
[Y.b. Lu] It's confusing why define macro like this... And the __SW_BOOT_EMU is wrong, it should be 0x02, not 0x10.
Quoted 2 lines
York
PATCH v3 1/1 armv8: ls1012a: enable/disable eSDHC1 through hwconfig for new RDB
On 12/07/2017 12:10 AM, Y.b. Lu wrote:
<snip>
Quoted 10 lines
Quoted 8 lines
board/freescale/ls1012ardb/ls1012ardb.c int board_init(void) · line 145
Quoted 5 lines
board/freescale/ls1012ardb/ls1012ardb.c +1
-1printf ("Error reading i2c boot information!\n" ); -return 0 ;/* Don't want to hang() on this error */ +return 0 ;What does I2C failure mean here? Returning 0 will cause the code keep going in
fdt_fixup_esdhc().[Y.b. Lu] I don’t know the possibility of I2C failure. If the failure happens, just print error message, leave 'status' as it is, and return 0 because the other fix-ups in
fdt_fixup_esdhc()are still needed like clock-frequency.
You can move on if it makes sense to do so.
Quoted 11 lines
Quoted 9 lines
board/freescale/ls1012ardb/ls1012ardb.c int board_init(void) · line 149
Quoted 6 lines
board/freescale/ls1012ardb/ls1012ardb.c +4
-0+ } + +if ((in1 & (~__SW_REV_MASK)) <= __SW_REV_D) { +if (hwconfig ("esdhc1" ))Please double check. I remember in the past if hwconfig is not enabled, any check returns true.
[Y.b. Lu] You're right. It's
-ENOSYS. But what should I do here ?
It depends on which one is safe. If you want to presume esdhc1 is available, you can keep current code. If you'd rather not to enable it, add a check of #ifdef.
Quoted 55 lines
Quoted 39 lines
Quoted 39 lines
board/freescale/ls1012ardb/ls1012ardb.c +24
-3+ sdhc2_en = true; + }else { +/* +* The I2C IO-expander for mux select is used to control +* the muxing of various onboard interfaces. +* +* IO1[3:2] indicates SDHC2 interface demultiplexer +* select lines. +* 00 - SDIO wifi +* 01 - GPIO (to Arduino) +* 10 - eMMC Memory +* 11 - SPI +*/ +if (i2c_read (I2C_MUX_IO1_ADDR ,0 ,1 , &io,1 ) <0 ) { +printf ("Error reading i2c boot information!\n" ); +return 0 ;/* Don't want to hang() on this error */ + } + + mux_sdhc2 = (io &0x0c ) >>2 ; +/* Enable SDHC2 only when use SDIO wifi and eMMC */ +if (mux_sdhc2 ==2 || mux_sdhc2 ==0 ) + sdhc2_en = true; } - mux_sdhc2 = (io &0x0c ) >>2 ; -/* Enable SDHC2 only when use SDIO wifi and eMMC */ -if (mux_sdhc2 ==2 || mux_sdhc2 ==0 ) +if (sdhc2_en)do_fixup_by_path (blob, esdhc1_path,"status" ,"okay" ,sizeof ("okay" ),1 );else do_fixup_by_path (blob, esdhc1_path,"status" ,"disabled" ,sizeof ("disabled" ),1 ); +return 0 ; }Quoted 15 lines
include/configs/ls1012ardb.h line 38
Quoted 12 lines
(quoted diff) +0
-0
b/include/configs/ls1012ardb.hindex794117062f..d5384e6027100644include/configs/ls1012ardb.h +4
-0@@ -32,6 +32,10 @@#define __SW_REV_MASK 0x07#define __SW_REV_A 0xF8#define __SW_REV_B 0xF0 +#define __SW_REV_C 0xE8 +#define __SW_REV_C1 0xE0 +#define __SW_REV_C2 0xD8 +#define __SW_REV_D 0xD0I don't have strong opinion about these macros. I would not use underscore myself. I guess I missed them at the first place.
Quoted 2 lines
[Y.b. Lu] It's confusing why define macro like this... And the
__SW_BOOT_EMUis wrong, it should be0x02, not0x10.
Add another patch before this one to clean them up, please.
York
PATCH v3 1/1 armv8: ls1012a: enable/disable eSDHC1 through hwconfig for new RDB
Sent out v4 patch-set. Please help to review.
Thanks a lot :)
Quoted 103 lines
-----Original Message-----
From: York Sun
Sent: 2017年12月8日 1:34
To: Y.b. Lu <[email protected]>; u-boot at lists.denx.de
Subject: Re: [v3] armv8: ls1012a: enable/disable eSDHC1 through hwconfig for new RDBOn 12/07/2017 12:10 AM, Y.b. Lu wrote:
<snip>
Quoted 10 lines
Quoted 8 lines
board/freescale/ls1012ardb/ls1012ardb.c int board_init(void) · line 145
Quoted 5 lines
board/freescale/ls1012ardb/ls1012ardb.c +1
-1printf ("Error reading i2c boot information!\n" ); -return 0 ;/* Don't want to hang() on this error */ +return 0 ;What does I2C failure mean here? Returning 0 will cause the code keep going in
fdt_fixup_esdhc().[Y.b. Lu] I don’t know the possibility of I2C failure. If the failure happens, just
print error message, leave 'status' as it is, and return 0 because the other fix-ups in
fdt_fixup_esdhc()are still needed like clock-frequency.You can move on if it makes sense to do so.
Quoted 11 lines
Quoted 9 lines
board/freescale/ls1012ardb/ls1012ardb.c int board_init(void) · line 149
Quoted 6 lines
board/freescale/ls1012ardb/ls1012ardb.c +4
-0+ } + +if ((in1 & (~__SW_REV_MASK)) <= __SW_REV_D) { +if (hwconfig ("esdhc1" ))Please double check. I remember in the past if hwconfig is not enabled, any check returns true.
[Y.b. Lu] You're right. It's
-ENOSYS. But what should I do here ?It depends on which one is safe. If you want to presume esdhc1 is available, you can keep current code. If you'd rather not to enable it, add a check of #ifdef.
Quoted 55 lines
Quoted 39 lines
Quoted 39 lines
board/freescale/ls1012ardb/ls1012ardb.c +24
-3+ sdhc2_en = true; + }else { +/* +* The I2C IO-expander for mux select is used to control +* the muxing of various onboard interfaces. +* +* IO1[3:2] indicates SDHC2 interface demultiplexer +* select lines. +* 00 - SDIO wifi +* 01 - GPIO (to Arduino) +* 10 - eMMC Memory +* 11 - SPI +*/ +if (i2c_read (I2C_MUX_IO1_ADDR ,0 ,1 , &io,1 ) <0 ) { +printf ("Error reading i2c boot information!\n" ); +return 0 ;/* Don't want to hang() on this error */ + } + + mux_sdhc2 = (io &0x0c ) >>2 ; +/* Enable SDHC2 only when use SDIO wifi and eMMC */ +if (mux_sdhc2 ==2 || mux_sdhc2 ==0 ) + sdhc2_en = true; } - mux_sdhc2 = (io &0x0c ) >>2 ; -/* Enable SDHC2 only when use SDIO wifi and eMMC */ -if (mux_sdhc2 ==2 || mux_sdhc2 ==0 ) +if (sdhc2_en)do_fixup_by_path (blob, esdhc1_path,"status" ,"okay" ,sizeof ("okay" ),1 );else do_fixup_by_path (blob, esdhc1_path,"status" ,"disabled" ,sizeof ("disabled" ),1 ); +return 0 ; }Quoted 15 lines
include/configs/ls1012ardb.h line 38
Quoted 12 lines
(quoted diff) +0
-0
b/include/configs/ls1012ardb.hindex794117062f..d5384e6027100644include/configs/ls1012ardb.h +4
-0@@ -32,6 +32,10 @@#define __SW_REV_MASK 0x07#define __SW_REV_A 0xF8#define __SW_REV_B 0xF0 +#define __SW_REV_C 0xE8 +#define __SW_REV_C1 0xE0 +#define __SW_REV_C2 0xD8 +#define __SW_REV_D 0xD0I don't have strong opinion about these macros. I would not use underscore myself. I guess I missed them at the first place.
Quoted 2 lines
[Y.b. Lu] It's confusing why define macro like this... And the
__SW_BOOT_EMUis wrong, it should be0x02, not0x10.Add another patch before this one to clean them up, please.
York