usb: r8a66597: Add support for RZ/A series
PATCH 1/1 usb: r8a66597: Add support for RZ/A series
While the USB HW in the RZ/A is basically the same, there are some differences from the original versions that were in the SH4 SoCs.
--- drivers/usb/host/r8a66597-hcd.c | 46 +++++++++++++++++++++++++++++++++++++++++ drivers/usb/host/r8a66597.h | 25 ++++++++++++++++++++-- 2 files changed, 69 insertions(+), 2 deletions(-)
drivers/usb/host/r8a66597-hcd.c +46 -0
@@ -82,6 +82,7 @@ static int r8a66597_clock_enable(struct r8a66597 *r8a66597) } }while ((tmp &USBE ) !=USBE );r8a66597_bclr (r8a66597,USBE ,SYSCFG0 ); +#ifndef RZA_USB r8a66597_mdfy (r8a66597,CONFIG_R8A66597_XTAL ,XTAL ,SYSCFG0 ); i =0 ;
@@ -94,6 +95,19 @@ static int r8a66597_clock_enable(struct r8a66597 *r8a66597)return -1 ; } } while ((tmp & SCKE) != SCKE); +#else +/* RZ/A Only: +* Bits XTAL(UCKSEL) and UPLLE in SYSCFG0 for USB0 controls both USB0 +* and USB1, so we must always set the USB0 register +*/ +#if (CONFIG_R8A66597_XTAL ==1 ) + *(u16 *)(R8A66597_BASE0 ) |=XTAL ; +#endif +mdelay (1 ); + *(u16 *)(R8A66597_BASE0 ) |=UPLLE ; +mdelay (1 ); +r8a66597_bset (r8a66597,SUSPM ,SUSPMODE0 ); +#endif /* RZA_USB */ #endif /* #if defined(CONFIG_SUPERH_ON_CHIP_R8A66597) */ return 0 ;
@@ -101,6 +115,7 @@ static int r8a66597_clock_enable(struct r8a66597 *r8a66597)static void r8a66597_clock_disable (struct r8a66597 *r8a66597) { +#ifndef RZA_USB r8a66597_bclr (r8a66597,SCKE ,SYSCFG0 );udelay (1 );#if !defined(CONFIG_SUPERH_ON_CHIP_R8A66597 )
@@ -108,6 +123,15 @@ static void r8a66597_clock_disable(struct r8a66597 *r8a66597)r8a66597_bclr (r8a66597,XCKE ,SYSCFG0 );r8a66597_bclr (r8a66597,USBE ,SYSCFG0 );#endif +#else +r8a66597_bclr (r8a66597,SUSPM ,SUSPMODE0 ); + + *(u16 *)(R8A66597_BASE0 ) &= ~UPLLE ; +mdelay (1 ); +r8a66597_bclr (r8a66597,USBE ,SYSCFG0 ); +mdelay (1 ); + +#endif }static void r8a66597_enable_port (struct r8a66597 *r8a66597,int port)
@@ -118,7 +142,9 @@ static void r8a66597_enable_port(struct r8a66597 *r8a66597, int port)r8a66597_bset (r8a66597, val,get_syscfg_reg (port));r8a66597_bset (r8a66597,HSE ,get_syscfg_reg (port)); +#ifndef RZA_USB r8a66597_write (r8a66597,BURST |CPU_ADR_RD_WR ,get_dmacfg_reg (port)); +#endif }static void r8a66597_disable_port (struct r8a66597 *r8a66597,int port)
@@ -148,7 +174,9 @@ static int enable_controller(struct r8a66597 *r8a66597)if (ret <0 )return ret; +#ifndef RZA_USB r8a66597_bset (r8a66597,CONFIG_R8A66597_LDRV &LDRV ,PINCFG ); +#endif r8a66597_bset (r8a66597,USBE ,SYSCFG0 );r8a66597_bset (r8a66597,INTL ,SOFCFG );
@@ -266,12 +294,30 @@ static int send_setup_packet(struct r8a66597 *r8a66597, struct usb_device *dev,unsigned long setup_addr =USBREQ ;u16 intsts1;int timeout =3000 ; +#ifdef RZA_USB +u16 dcpctr; +int timeout2 =10000 ; +#endif u16 devsel = setup->request ==USB_REQ_SET_ADDRESS ?0 : dev->devnum;r8a66597_write (r8a66597,make_devsel (devsel) | (8 << dev->maxpacketsize),DCPMAXP );r8a66597_write (r8a66597, ~(SIGN |SACK ),INTSTS1 ); +#ifdef RZA_USB + dcpctr =r8a66597_read (r8a66597,DCPCTR ); +if ((dcpctr &PID ) ==PID_BUF ) { + timeout2 =10000 ; +while (!(dcpctr &BSTS )) { + dcpctr =r8a66597_read (r8a66597,DCPCTR ); +if (timeout2-- <0 ) { +printf ("DCPCTR clear timeout!\n" ); +break ; + } + } + } +#endif +for (i =0 ; i <4 ; i++) {r8a66597_write (r8a66597,le16_to_cpu (p[i]), setup_addr); setup_addr +=2 ;
drivers/usb/host/r8a66597.h +23 -2
@@ -9,6 +9,10 @@#ifndef __R8A66597_H__#define __R8A66597_H__ +#if defined(CONFIG_R7S72100 ) +#define RZA_USB +#endif +#define SYSCFG0 0x00#define SYSCFG1 0x02#define SYSSTS0 0x04
@@ -87,8 +91,10 @@#define DEVADD8 0xE0#define DEVADD9 0xE2#define DEVADDA 0xE4 +#define SUSPMODE0 0x102/* RZ/A Only */ /* System Configuration Control Register */ +#if !defined(RZA_USB )#define XTAL 0xC000/* b15-14: Crystal selection */ #define XTAL48 0x8000/* 48MHz */ #define XTAL24 0x4000/* 24MHz */
@@ -98,10 +104,17 @@#define SCKE 0x0400/* b10: USB clock enable */ #define PCSDIS 0x0200/* b9: not CS wakeup */ #define LPSME 0x0100/* b8: Low power sleep mode */ +#endif #define HSE 0x0080/* b7: Hi-speed enable */ #define DCFM 0x0040/* b6: Controller function select */ #define DRPD 0x0020/* b5: D+/- pull down control */ #define DPRPU 0x0010/* b4: D+ pull up control */ +#if defined(RZA_USB ) +#define XTAL 0x0004/* b2: Crystal selection */ +#define XTAL12 0x0004/* 12MHz */ +#define XTAL48 0x0000/* 48MHz */ +#define UPLLE 0x0002/* b1: internal PLL control */ +#endif #define USBE 0x0001/* b0: USB module operation enable */ /* System Configuration Status Register */
@@ -173,10 +186,15 @@#if defined(CONFIG_SUPERH_ON_CHIP_R8A66597 )#define MBW 0x0800#else +#if !defined(RZA_USB )#define MBW 0x0400/* b10: Maximum bit width for FIFO access */ +#else +#define MBW 0x0800/* b10: Maximum bit width for FIFO access */ +#endif /* RZA_USB */ #endif #define MBW_8 0x0000/* 8bit */ #define MBW_16 0x0400/* 16bit */ +#define MBW_32 0x0800/* 32bit */ #define BIGEND 0x0100/* b8: Big endian mode */ #define BYTE_LITTLE 0x0000/* little dendian */ #define BYTE_BIG 0x0100/* big endifan */
@@ -379,6 +397,9 @@#define USBSPD 0x00C0#define RTPORT 0x0001 +/* Suspend Mode Register */ +#define SUSPM 0x4000/* b14: Suspend */ +#define R8A66597_MAX_NUM_PIPE 10#define R8A66597_BUF_BSIZE 8#define R8A66597_MAX_DEVICE 10
@@ -419,7 +440,7 @@ static inline void r8a66597_read_fifo(struct r8a66597 *r8a66597, int len) {int i; -#if defined(CONFIG_SUPERH_ON_CHIP_R8A66597 ) +#if defined(CONFIG_SUPERH_ON_CHIP_R8A66597 ) || defined(RZA_USB )unsigned long fifoaddr = r8a66597->reg + offset;unsigned long count;unsigned long *p = buf;
@@ -453,7 +474,7 @@ static inline void r8a66597_write_fifo(struct r8a66597 *r8a66597, {int i;unsigned long fifoaddr = r8a66597->reg + offset; -#if defined(CONFIG_SUPERH_ON_CHIP_R8A66597 ) +#if defined(CONFIG_SUPERH_ON_CHIP_R8A66597 ) || defined(RZA_USB )unsigned long count;unsigned char *pb;unsigned long *p = buf;
Signature · 1 line
2.14.1
PATCH 1/1 usb: r8a66597: Add support for RZ/A series
Quoted 14 lines · Chris Brandt
While the USB HW in the RZ/A is basically the same, there are some differences from the original versions that were in the SH4 SoCs.
Signed-off-by Chris Brandt <[email protected]>--- drivers/usb/host/r8a66597-hcd.c | 46 +++++++++++++++++++++++++++++++++++++++++ drivers/usb/host/r8a66597.h | 25 ++++++++++++++++++++-- 2 files changed, 69 insertions(+), 2 deletions(-)drivers/usb/host/r8a66597-hcd.c +0
-0
drivers/usb/host/r8a66597-hcd.c static int r8a66597_clock_enable(struct r8a66597 *r8a66597) · line 85
Quoted 4 lines
drivers/usb/host/r8a66597-hcd.c +1
-0@@ -82,6 +82,7 @@ static int r8a66597_clock_enable(struct r8a66597 *r8a66597) } }while ((tmp &USBE ) !=USBE );r8a66597_bclr (r8a66597,USBE ,SYSCFG0 ); +#ifndef RZA_USB
This should be turned into Kconfig entry, some CONFIG_...
drivers/usb/host/r8a66597-hcd.c static int r8a66597_clock_enable(struct r8a66597 *r8a66597) · line 99
Quoted 9 lines
drivers/usb/host/r8a66597-hcd.c +2
-0r8a66597_mdfy (r8a66597,CONFIG_R8A66597_XTAL ,XTAL ,SYSCFG0 ); i =0 ;@@ -94,6 +95,19 @@ static int r8a66597_clock_enable(struct r8a66597 *r8a66597) return -1; } }while ((tmp &SCKE ) !=SCKE ); +#else +/* RZ/A Only:
Fix the multi-line comment,
/*
* foo
* bar
*/
drivers/usb/host/r8a66597-hcd.c static int r8a66597_clock_enable(struct r8a66597 *r8a66597) · line 104
Quoted 5 lines
drivers/usb/host/r8a66597-hcd.c +5
-0+* Bits XTAL(UCKSEL) and UPLLE in SYSCFG0 for USB0 controls both USB0 +* and USB1, so we must always set the USB0 register +*/ +#if (CONFIG_R8A66597_XTAL ==1 ) + *(u16 *)(R8A66597_BASE0 ) |=XTAL ;
Doesn't the RZ/A1 have readl()/writel()/setbits() ?
Quoted 59 lines
drivers/usb/host/r8a66597-hcd.c +22
-0+#endif +mdelay (1 ); + *(u16 *)(R8A66597_BASE0 ) |=UPLLE ; +mdelay (1 ); +r8a66597_bset (r8a66597,SUSPM ,SUSPMODE0 ); +#endif /* RZA_USB */ #endif /* #if defined(CONFIG_SUPERH_ON_CHIP_R8A66597) */ return 0 ;@@ -101,6 +115,7 @@ static int r8a66597_clock_enable(struct r8a66597 *r8a66597)static void r8a66597_clock_disable (struct r8a66597 *r8a66597) { +#ifndef RZA_USB r8a66597_bclr (r8a66597,SCKE ,SYSCFG0 );udelay (1 );#if !defined(CONFIG_SUPERH_ON_CHIP_R8A66597 )@@ -108,6 +123,15 @@ static void r8a66597_clock_disable(struct r8a66597 *r8a66597)r8a66597_bclr (r8a66597,XCKE ,SYSCFG0 );r8a66597_bclr (r8a66597,USBE ,SYSCFG0 );#endif +#else +r8a66597_bclr (r8a66597,SUSPM ,SUSPMODE0 ); + + *(u16 *)(R8A66597_BASE0 ) &= ~UPLLE ; +mdelay (1 ); +r8a66597_bclr (r8a66597,USBE ,SYSCFG0 ); +mdelay (1 ); + +#endif }static void r8a66597_enable_port (struct r8a66597 *r8a66597,int port)@@ -118,7 +142,9 @@ static void r8a66597_enable_port(struct r8a66597 *r8a66597, int port)r8a66597_bset (r8a66597, val,get_syscfg_reg (port));r8a66597_bset (r8a66597,HSE ,get_syscfg_reg (port)); +#ifndef RZA_USB r8a66597_write (r8a66597,BURST |CPU_ADR_RD_WR ,get_dmacfg_reg (port)); +#endif }static void r8a66597_disable_port (struct r8a66597 *r8a66597,int port)@@ -148,7 +174,9 @@ static int enable_controller(struct r8a66597 *r8a66597)if (ret <0 )return ret; +#ifndef RZA_USB r8a66597_bset (r8a66597,CONFIG_R8A66597_LDRV &LDRV ,PINCFG ); +#endif r8a66597_bset (r8a66597,USBE ,SYSCFG0 );r8a66597_bset (r8a66597,INTL ,SOFCFG );@@ -266,12 +294,30 @@ static int send_setup_packet(struct r8a66597 *r8a66597, struct usb_device *dev,unsigned long setup_addr =USBREQ ;u16 intsts1;int timeout =3000 ; +#ifdef RZA_USB +u16 dcpctr;
drivers/usb/host/r8a66597-hcd.c static int send_setup_packet(struct r8a66597 *r8a66597, struct usb_device *dev, · line 308
Quoted 10 lines
drivers/usb/host/r8a66597-hcd.c +4
-0+int timeout2 =10000 ; +#endif u16 devsel = setup->request ==USB_REQ_SET_ADDRESS ?0 : dev->devnum;r8a66597_write (r8a66597,make_devsel (devsel) | (8 << dev->maxpacketsize),DCPMAXP );r8a66597_write (r8a66597, ~(SIGN |SACK ),INTSTS1 ); +#ifdef RZA_USB + dcpctr =r8a66597_read (r8a66597,DCPCTR );
use wait_for_bit() .
Quoted 104 lines
drivers/usb/host/r8a66597-hcd.c +12
-0+if ((dcpctr &PID ) ==PID_BUF ) { + timeout2 =10000 ; +while (!(dcpctr &BSTS )) { + dcpctr =r8a66597_read (r8a66597,DCPCTR ); +if (timeout2-- <0 ) { +printf ("DCPCTR clear timeout!\n" ); +break ; + } + } + } +#endif +for (i =0 ; i <4 ; i++) {r8a66597_write (r8a66597,le16_to_cpu (p[i]), setup_addr); setup_addr +=2 ;drivers/usb/host/r8a66597.h +23
-2@@ -9,6 +9,10 @@#ifndef __R8A66597_H__#define __R8A66597_H__ +#if defined(CONFIG_R7S72100 ) +#define RZA_USB +#endif +#define SYSCFG0 0x00#define SYSCFG1 0x02#define SYSSTS0 0x04@@ -87,8 +91,10 @@#define DEVADD8 0xE0#define DEVADD9 0xE2#define DEVADDA 0xE4 +#define SUSPMODE0 0x102/* RZ/A Only */ /* System Configuration Control Register */ +#if !defined(RZA_USB )#define XTAL 0xC000/* b15-14: Crystal selection */ #define XTAL48 0x8000/* 48MHz */ #define XTAL24 0x4000/* 24MHz */ @@ -98,10 +104,17 @@#define SCKE 0x0400/* b10: USB clock enable */ #define PCSDIS 0x0200/* b9: not CS wakeup */ #define LPSME 0x0100/* b8: Low power sleep mode */ +#endif #define HSE 0x0080/* b7: Hi-speed enable */ #define DCFM 0x0040/* b6: Controller function select */ #define DRPD 0x0020/* b5: D+/- pull down control */ #define DPRPU 0x0010/* b4: D+ pull up control */ +#if defined(RZA_USB ) +#define XTAL 0x0004/* b2: Crystal selection */ +#define XTAL12 0x0004/* 12MHz */ +#define XTAL48 0x0000/* 48MHz */ +#define UPLLE 0x0002/* b1: internal PLL control */ +#endif #define USBE 0x0001/* b0: USB module operation enable */ /* System Configuration Status Register */ @@ -173,10 +186,15 @@#if defined(CONFIG_SUPERH_ON_CHIP_R8A66597 )#define MBW 0x0800#else +#if !defined(RZA_USB )#define MBW 0x0400/* b10: Maximum bit width for FIFO access */ +#else +#define MBW 0x0800/* b10: Maximum bit width for FIFO access */ +#endif /* RZA_USB */ #endif #define MBW_8 0x0000/* 8bit */ #define MBW_16 0x0400/* 16bit */ +#define MBW_32 0x0800/* 32bit */ #define BIGEND 0x0100/* b8: Big endian mode */ #define BYTE_LITTLE 0x0000/* little dendian */ #define BYTE_BIG 0x0100/* big endifan */ @@ -379,6 +397,9 @@#define USBSPD 0x00C0#define RTPORT 0x0001 +/* Suspend Mode Register */ +#define SUSPM 0x4000/* b14: Suspend */ +#define R8A66597_MAX_NUM_PIPE 10#define R8A66597_BUF_BSIZE 8#define R8A66597_MAX_DEVICE 10@@ -419,7 +440,7 @@ static inline void r8a66597_read_fifo(struct r8a66597 *r8a66597, int len) {int i; -#if defined(CONFIG_SUPERH_ON_CHIP_R8A66597 ) +#if defined(CONFIG_SUPERH_ON_CHIP_R8A66597 ) || defined(RZA_USB )unsigned long fifoaddr = r8a66597->reg + offset;unsigned long count;unsigned long *p = buf;@@ -453,7 +474,7 @@ static inline void r8a66597_write_fifo(struct r8a66597 *r8a66597, {int i;unsigned long fifoaddr = r8a66597->reg + offset; -#if defined(CONFIG_SUPERH_ON_CHIP_R8A66597 ) +#if defined(CONFIG_SUPERH_ON_CHIP_R8A66597 ) || defined(RZA_USB )unsigned long count;unsigned char *pb;unsigned long *p = buf;
Signature · 2 lines
Best regards, Marek Vasut
PATCH 1/1 usb: r8a66597: Add support for RZ/A series
Thanks for the review.
Quoted 3 lines · Marek Vasut
Quoted 1 line
+#ifndef
RZA_USBThis should be turned into
Kconfigentry, someCONFIG_...
So you want RZA_USB in Kconfig, but is it OK if it is automatically selected when an RZ/A device is selected?
For example:
config R7S72100
bool
select CONFIG_RZA_USB
Thanks,
Chris
PATCH 1/1 usb: r8a66597: Add support for RZ/A series
Quoted 9 lines · Chris Brandt
Thanks for the review.
Quoted 3 lines · Marek Vasut
Quoted 1 line
+#ifndef
RZA_USBThis should be turned into
Kconfigentry, someCONFIG_...So you want
RZA_USBinKconfig, but is it OK if it is automatically selected when an RZ/A device is selected?
That's fine. I (well, the u-boot maintainers in general) want to move to Kconfig and drop the ad-hoc configuration with macros defined in include/configs/ at some point.
Quoted 9 lines
For example:
config R7S72100
bool
selectCONFIG_RZA_USBThanks,
Chris
Signature · 2 lines
Best regards, Marek Vasut
PATCH 1/1 usb: r8a66597: Add support for RZ/A series
In reply to Marek VasutHello Marek,
Quoted 5 lines · Marek Vasut
Review
Quoted 2 lines
(quoted diff) +2
-0+#ifdef RZA_USB + dcpctr = r8a66597_read(r8a66597, DCPCTR);use
wait_for_bit().
Quoted 11 lines
drivers/usb/host/r8a66597-hcd.c static int send_setup_packet(struct r8a66597 *r8a66597, struct usb_device *dev, · line 319
Quoted 11 lines
drivers/usb/host/r8a66597-hcd.c +11
-0+if ((dcpctr &PID ) ==PID_BUF ) { + timeout2 =10000 ; +while (!(dcpctr &BSTS )) { + dcpctr =r8a66597_read (r8a66597,DCPCTR ); +if (timeout2-- <0 ) { +printf ("DCPCTR clear timeout!\n" ); +break ; + } + } + } +#endif
wait_for_bit() wants you to pass a direct address of a 32-bit register. The register I am waiting for is a 16-bit register and the hardware manual doesn't say 32-bit is allowed.
When I do a 32-bit read on that address, I actually get a different value.
For example:
=> md.w E8010060 1e8010060: 0040
=> md.l E8010060 1e8010060: 00400000
So, I can't use wait_for_bit()
Chris
PATCH 1/1 usb: r8a66597: Add support for RZ/A series
Quoted 29 lines · Chris Brandt
Hello Marek,
Quoted 5 lines · Marek Vasut
Review
Quoted 2 lines
(quoted diff) +2
-0+#ifdef RZA_USB + dcpctr = r8a66597_read(r8a66597, DCPCTR);use
wait_for_bit().Quoted 11 lines
drivers/usb/host/r8a66597-hcd.c static int send_setup_packet(struct r8a66597 *r8a66597, struct usb_device *dev, · line 319
Quoted 11 lines
drivers/usb/host/r8a66597-hcd.c +11
-0+if ((dcpctr &PID ) ==PID_BUF ) { + timeout2 =10000 ; +while (!(dcpctr &BSTS )) { + dcpctr =r8a66597_read (r8a66597,DCPCTR ); +if (timeout2-- <0 ) { +printf ("DCPCTR clear timeout!\n" ); +break ; + } + } + } +#endif
wait_for_bit()wants you to pass a direct address of a 32-bit register. The register I am waiting for is a 16-bit register and the hardware manual doesn't say 32-bit is allowed.
When I do a 32-bit read on that address, I actually get a different value.For example:
Quoted 7 lines
=> md.w E8010060 1
e8010060: 0040
=> md.l E8010060 1e8010060: 00400000So, I can't use
wait_for_bit()
Can we somehow extend wait_for_bit() ?
Quoted 2 lines
Chris
Signature · 2 lines
Best regards, Marek Vasut
PATCH 1/1 usb: r8a66597: Add support for RZ/A series
Quoted 14 lines · Marek Vasut
Quoted 14 lines
wait_for_bit()wants you to pass a direct address of a 32-bit register. The register I am waiting for is a 16-bit register and the hardware manual doesn't say 32-bit is allowed.
When I do a 32-bit read on that address, I actually get a different value.For example:
=> md.w E8010060 1
e8010060: 0040
=> md.l E8010060 1e8010060: 00400000
Quoted 3 lines
Quoted 1 line
So, I can't use
wait_for_bit()Can we somehow extend
wait_for_bit()?
It's a nice function, so it would be good if it worked with more than just 32-bit registers.
However, it's used in 98 places at the moment, so coordinating modifying all those changes at once might be an issue.
Chris
PATCH 1/1 usb: r8a66597: Add support for RZ/A series
Quoted 17 lines · Chris Brandt
Quoted 16 lines · Marek Vasut
Quoted 15 lines
wait_for_bit()wants you to pass a direct address of a 32-bit register. The register I am waiting for is a 16-bit register and the hardware manual doesn't say 32-bit is allowed.
When I do a 32-bit read on that address, I actually get a different value.For example:
=> md.w E8010060 1
e8010060: 0040
=> md.l E8010060 1e8010060: 00400000So, I can't use
wait_for_bit()
Quoted 7 lines
Quoted 1 line
Can we somehow extend
wait_for_bit()?It's a nice function, so it would be good if it worked with more than just 32-bit registers.
However, it's used in 98 places at the moment, so coordinating modifying all those changes at once might be an issue.
What about readb_poll_timeout() , would that work ?
Quoted 2 lines
Chris
Signature · 2 lines
Best regards, Marek Vasut
PATCH 1/1 usb: r8a66597: Add support for RZ/A series
Quoted 4 lines · Marek Vasut
Quoted 4 lines
Quoted 3 lines
Quoted 1 line
So, I can't use
wait_for_bit()Can we somehow extend
wait_for_bit()?
Quoted 8 lines
Quoted 4 lines
It's a nice function, so it would be good if it worked with more than just 32-bit registers.
However, it's used in 98 places at the moment, so coordinating
modifying
Quoted 1 line
all those changes at once might be an issue.
What about
readb_poll_timeout(), would that work ?
I just tried it out and it seems to work OK.
I'll do a little more testing, and if it's still OK, I'll send a patch.
Thanks,
Chris
PATCH 1/1 usb: r8a66597: Add support for RZ/A series
Quoted 9 lines · Chris Brandt
Quoted 8 lines · Marek Vasut
Quoted 8 lines
Quoted 3 lines
Quoted 1 line
So, I can't use
wait_for_bit()Can we somehow extend
wait_for_bit()?It's a nice function, so it would be good if it worked with more than just 32-bit registers.
However, it's used in 98 places at the moment, so coordinating
Quoted 8 lines
Quoted 4 lines
modifying
Quoted 1 line
all those changes at once might be an issue.
What about
readb_poll_timeout(), would that work ?I just tried it out and it seems to work OK.
I'll do a little more testing, and if it's still OK, I'll send a patch.
Thanks
Quoted 3 lines
Thanks,
Chris
Signature · 2 lines
Best regards, Marek Vasut