* [patch 1/8] au1xxx: psc fixes + add au1200 adresses
2006-06-23 9:57 [patch 0/8] au1xxx: make linux-mips more useful for au1200 users Domen Puncer
@ 2006-06-23 9:58 ` Domen Puncer
2006-06-23 11:15 ` Ralf Baechle
2006-06-23 12:57 ` Sergei Shtylyov
2006-06-23 9:58 ` [patch 2/8] au1xxx: I2C fixes Domen Puncer
` (6 subsequent siblings)
7 siblings, 2 replies; 22+ messages in thread
From: Domen Puncer @ 2006-06-23 9:58 UTC (permalink / raw)
To: Ralf Baechle; +Cc: linux-mips
Based on Jordan Crusoe's i2c patch:
- fix PSC3_BASE_ADDR to match au1550 databook
- fix PSC_SMBTXRX_RSR
- add PSC addresses for au1200
Signed-off-by: Domen Puncer <domen.puncer@ultra.si>
Index: linux-mailed/include/asm-mips/mach-au1x00/au1xxx_psc.h
===================================================================
--- linux-mailed.orig/include/asm-mips/mach-au1x00/au1xxx_psc.h
+++ linux-mailed/include/asm-mips/mach-au1x00/au1xxx_psc.h
@@ -40,7 +40,12 @@
#define PSC0_BASE_ADDR 0xb1a00000
#define PSC1_BASE_ADDR 0xb1b00000
#define PSC2_BASE_ADDR 0xb0a00000
-#define PSC3_BASE_ADDR 0xb0d00000
+#define PSC3_BASE_ADDR 0xb0b00000
+#endif
+
+#ifdef CONFIG_SOC_AU1200
+#define PSC0_BASE_ADDR 0xb1a00000
+#define PSC1_BASE_ADDR 0xb1b00000
#endif
/* The PSC select and control registers are common to
@@ -506,7 +511,7 @@ typedef struct psc_smb {
/* Transmit register control.
*/
-#define PSC_SMBTXRX_RSR (1 << 30)
+#define PSC_SMBTXRX_RSR (1 << 28)
#define PSC_SMBTXRX_STP (1 << 29)
#define PSC_SMBTXRX_DATAMASK (0xff)
^ permalink raw reply [flat|nested] 22+ messages in thread* Re: [patch 1/8] au1xxx: psc fixes + add au1200 adresses
2006-06-23 9:58 ` [patch 1/8] au1xxx: psc fixes + add au1200 adresses Domen Puncer
@ 2006-06-23 11:15 ` Ralf Baechle
2006-06-23 12:57 ` Sergei Shtylyov
1 sibling, 0 replies; 22+ messages in thread
From: Ralf Baechle @ 2006-06-23 11:15 UTC (permalink / raw)
To: Domen Puncer; +Cc: linux-mips
On Fri, Jun 23, 2006 at 11:58:31AM +0200, Domen Puncer wrote:
Applied.
Ralf
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [patch 1/8] au1xxx: psc fixes + add au1200 adresses
2006-06-23 9:58 ` [patch 1/8] au1xxx: psc fixes + add au1200 adresses Domen Puncer
2006-06-23 11:15 ` Ralf Baechle
@ 2006-06-23 12:57 ` Sergei Shtylyov
2006-06-23 13:54 ` Domen Puncer
2006-06-23 15:37 ` Ralf Baechle
1 sibling, 2 replies; 22+ messages in thread
From: Sergei Shtylyov @ 2006-06-23 12:57 UTC (permalink / raw)
To: Domen Puncer, Ralf Baechle; +Cc: linux-mips
Hello.
Domen Puncer wrote:
> Based on Jordan Crusoe's i2c patch:
> - fix PSC3_BASE_ADDR to match au1550 databook
> - fix PSC_SMBTXRX_RSR
> - add PSC addresses for au1200
That was my patch, originally. And (surprise!) it just went from the -mm
tree to Linus. Congrats, now we're going to have a patch conflict. :-)
> Signed-off-by: Domen Puncer <domen.puncer@ultra.si>
> Index: linux-mailed/include/asm-mips/mach-au1x00/au1xxx_psc.h
> ===================================================================
> --- linux-mailed.orig/include/asm-mips/mach-au1x00/au1xxx_psc.h
> +++ linux-mailed/include/asm-mips/mach-au1x00/au1xxx_psc.h
> @@ -40,7 +40,12 @@
> #define PSC0_BASE_ADDR 0xb1a00000
> #define PSC1_BASE_ADDR 0xb1b00000
> #define PSC2_BASE_ADDR 0xb0a00000
> -#define PSC3_BASE_ADDR 0xb0d00000
> +#define PSC3_BASE_ADDR 0xb0b00000
> +#endif
> +
> +#ifdef CONFIG_SOC_AU1200
> +#define PSC0_BASE_ADDR 0xb1a00000
> +#define PSC1_BASE_ADDR 0xb1b00000
> #endif
>
> /* The PSC select and control registers are common to
> @@ -506,7 +511,7 @@ typedef struct psc_smb {
>
> /* Transmit register control.
> */
> -#define PSC_SMBTXRX_RSR (1 << 30)
> +#define PSC_SMBTXRX_RSR (1 << 28)
> #define PSC_SMBTXRX_STP (1 << 29)
> #define PSC_SMBTXRX_DATAMASK (0xff)
WBR, Sergei
^ permalink raw reply [flat|nested] 22+ messages in thread* Re: [patch 1/8] au1xxx: psc fixes + add au1200 adresses
2006-06-23 12:57 ` Sergei Shtylyov
@ 2006-06-23 13:54 ` Domen Puncer
2006-06-23 15:37 ` Ralf Baechle
1 sibling, 0 replies; 22+ messages in thread
From: Domen Puncer @ 2006-06-23 13:54 UTC (permalink / raw)
To: Sergei Shtylyov; +Cc: Domen Puncer, Ralf Baechle, linux-mips
On 23/06/06 16:57 +0400, Sergei Shtylyov wrote:
> Hello.
>
> Domen Puncer wrote:
> >Based on Jordan Crusoe's i2c patch:
> >- fix PSC3_BASE_ADDR to match au1550 databook
> >- fix PSC_SMBTXRX_RSR
> >- add PSC addresses for au1200
>
> That was my patch, originally. And (surprise!) it just went from the -mm
> tree to Linus. Congrats, now we're going to have a patch conflict. :-)
Oh... sorry.
I guess waiting sometimes does solve the problem :-)
Domen
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [patch 1/8] au1xxx: psc fixes + add au1200 adresses
2006-06-23 12:57 ` Sergei Shtylyov
2006-06-23 13:54 ` Domen Puncer
@ 2006-06-23 15:37 ` Ralf Baechle
1 sibling, 0 replies; 22+ messages in thread
From: Ralf Baechle @ 2006-06-23 15:37 UTC (permalink / raw)
To: Sergei Shtylyov; +Cc: Domen Puncer, linux-mips
On Fri, Jun 23, 2006 at 04:57:28PM +0400, Sergei Shtylyov wrote:
> That was my patch, originally. And (surprise!) it just went from the -mm
> tree to Linus. Congrats, now we're going to have a patch conflict. :-)
Shit happens - but it's annoying have to sort that out so better be avoided ...
Ralf
^ permalink raw reply [flat|nested] 22+ messages in thread
* [patch 2/8] au1xxx: I2C fixes
2006-06-23 9:57 [patch 0/8] au1xxx: make linux-mips more useful for au1200 users Domen Puncer
2006-06-23 9:58 ` [patch 1/8] au1xxx: psc fixes + add au1200 adresses Domen Puncer
@ 2006-06-23 9:58 ` Domen Puncer
2006-06-23 10:26 ` Ralf Baechle
2006-06-23 16:13 ` Sergei Shtylyov
2006-06-23 9:59 ` [patch 3/8] au1xxx: I2C support for au1200 Domen Puncer
` (5 subsequent siblings)
7 siblings, 2 replies; 22+ messages in thread
From: Domen Puncer @ 2006-06-23 9:58 UTC (permalink / raw)
To: Ralf Baechle; +Cc: linux-mips
- I2C fixes from Jordan Crusoe
- add SMBUS functionality flags
Signed-off-by: Domen Puncer <domen.puncer@ultra.si>
Index: linux-mailed/drivers/i2c/busses/i2c-au1550.c
===================================================================
--- linux-mailed.orig/drivers/i2c/busses/i2c-au1550.c
+++ linux-mailed/drivers/i2c/busses/i2c-au1550.c
@@ -35,7 +35,7 @@
#include <linux/i2c.h>
#include <asm/mach-au1x00/au1000.h>
-#include <asm/mach-pb1x00/pb1550.h>
+#include <asm/mach-au1x00/au1xxx.h>
#include <asm/mach-au1x00/au1xxx_psc.h>
#include "i2c-au1550.h"
@@ -118,13 +118,19 @@ do_address(struct i2c_au1550_data *adap,
/* Reset the FIFOs, clear events.
*/
- sp->psc_smbpcr = PSC_SMBPCR_DC;
+ stat = sp->psc_smbstat;
sp->psc_smbevnt = PSC_SMBEVNT_ALLCLR;
au_sync();
- do {
- stat = sp->psc_smbpcr;
+
+ if (!(stat & PSC_SMBSTAT_TE) || !(stat & PSC_SMBSTAT_RE)) {
+ sp->psc_smbpcr = PSC_SMBPCR_DC;
au_sync();
- } while ((stat & PSC_SMBPCR_DC) != 0);
+ do {
+ stat = sp->psc_smbpcr;
+ au_sync();
+ } while ((stat & PSC_SMBPCR_DC) != 0);
+ udelay(50);
+ }
/* Write out the i2c chip address and specify operation
*/
@@ -279,7 +285,7 @@ au1550_xfer(struct i2c_adapter *i2c_adap
static u32
au1550_func(struct i2c_adapter *adap)
{
- return I2C_FUNC_I2C;
+ return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL;
}
static struct i2c_algorithm au1550_algo = {
^ permalink raw reply [flat|nested] 22+ messages in thread* [patch 3/8] au1xxx: I2C support for au1200
2006-06-23 9:57 [patch 0/8] au1xxx: make linux-mips more useful for au1200 users Domen Puncer
2006-06-23 9:58 ` [patch 1/8] au1xxx: psc fixes + add au1200 adresses Domen Puncer
2006-06-23 9:58 ` [patch 2/8] au1xxx: I2C fixes Domen Puncer
@ 2006-06-23 9:59 ` Domen Puncer
2006-06-23 10:26 ` Ralf Baechle
2006-06-23 9:59 ` [patch 4/8] au1xxx: dbdma, no sleeping under spin_lock Domen Puncer
` (4 subsequent siblings)
7 siblings, 1 reply; 22+ messages in thread
From: Domen Puncer @ 2006-06-23 9:59 UTC (permalink / raw)
To: Ralf Baechle; +Cc: linux-mips
Add I2C support for au1200.
Signed-off-by: Domen Puncer <domen.puncer@ultra.si>
Index: linux-mailed/drivers/i2c/busses/Kconfig
===================================================================
--- linux-mailed.orig/drivers/i2c/busses/Kconfig
+++ linux-mailed/drivers/i2c/busses/Kconfig
@@ -75,11 +75,11 @@ config I2C_AMD8111
will be called i2c-amd8111.
config I2C_AU1550
- tristate "Au1550 SMBus interface"
- depends on I2C && SOC_AU1550
+ tristate "Au1550/Au1200 SMBus interface"
+ depends on I2C && (SOC_AU1550 || SOC_AU1200)
help
If you say yes to this option, support will be included for the
- Au1550 SMBus interface.
+ Au1550 and Au1200 SMBus interface.
This driver can also be built as a module. If so, the module
will be called i2c-au1550.
^ permalink raw reply [flat|nested] 22+ messages in thread* [patch 4/8] au1xxx: dbdma, no sleeping under spin_lock
2006-06-23 9:57 [patch 0/8] au1xxx: make linux-mips more useful for au1200 users Domen Puncer
` (2 preceding siblings ...)
2006-06-23 9:59 ` [patch 3/8] au1xxx: I2C support for au1200 Domen Puncer
@ 2006-06-23 9:59 ` Domen Puncer
2006-06-23 11:16 ` Ralf Baechle
2006-06-23 10:00 ` [patch 5/8] au1xxx: export dbdma functions Domen Puncer
` (3 subsequent siblings)
7 siblings, 1 reply; 22+ messages in thread
From: Domen Puncer @ 2006-06-23 9:59 UTC (permalink / raw)
To: Ralf Baechle; +Cc: linux-mips
kmalloc under spin_lock can't sleep.
Signed-off-by: Domen Puncer <domen.puncer@ultra.si>
Index: linux-mailed/arch/mips/au1000/common/dbdma.c
===================================================================
--- linux-mailed.orig/arch/mips/au1000/common/dbdma.c
+++ linux-mailed/arch/mips/au1000/common/dbdma.c
@@ -290,7 +290,7 @@ au1xxx_dbdma_chan_alloc(u32 srcid, u32 d
/* If kmalloc fails, it is caught below same
* as a channel not available.
*/
- ctp = kmalloc(sizeof(chan_tab_t), GFP_KERNEL);
+ ctp = kmalloc(sizeof(chan_tab_t), GFP_ATOMIC);
chan_tab_ptr[i] = ctp;
break;
}
^ permalink raw reply [flat|nested] 22+ messages in thread* [patch 5/8] au1xxx: export dbdma functions
2006-06-23 9:57 [patch 0/8] au1xxx: make linux-mips more useful for au1200 users Domen Puncer
` (3 preceding siblings ...)
2006-06-23 9:59 ` [patch 4/8] au1xxx: dbdma, no sleeping under spin_lock Domen Puncer
@ 2006-06-23 10:00 ` Domen Puncer
2006-06-23 10:33 ` Ralf Baechle
2006-06-23 10:00 ` [patch 6/8] au1xxx: oss sound support for au1200 Domen Puncer
` (2 subsequent siblings)
7 siblings, 1 reply; 22+ messages in thread
From: Domen Puncer @ 2006-06-23 10:00 UTC (permalink / raw)
To: Ralf Baechle; +Cc: linux-mips
These are needed for au1550_ac97 module.
Signed-off-by: Domen Puncer <domen.puncer@ultra.si>
arch/mips/au1000/common/dbdma.c | 4 ++++
1 file changed, 4 insertions(+)
Index: linux-mailed/arch/mips/au1000/common/dbdma.c
===================================================================
--- linux-mailed.orig/arch/mips/au1000/common/dbdma.c
+++ linux-mailed/arch/mips/au1000/common/dbdma.c
@@ -730,6 +730,8 @@ au1xxx_dbdma_get_dest(u32 chanid, void *
return rv;
}
+EXPORT_SYMBOL(au1xxx_dbdma_get_dest);
+
void
au1xxx_dbdma_stop(u32 chanid)
{
@@ -821,6 +823,8 @@ au1xxx_get_dma_residue(u32 chanid)
return rv;
}
+EXPORT_SYMBOL(au1xxx_get_dma_residue);
+
void
au1xxx_dbdma_chan_free(u32 chanid)
{
^ permalink raw reply [flat|nested] 22+ messages in thread* Re: [patch 5/8] au1xxx: export dbdma functions
2006-06-23 10:00 ` [patch 5/8] au1xxx: export dbdma functions Domen Puncer
@ 2006-06-23 10:33 ` Ralf Baechle
2006-06-23 13:52 ` Domen Puncer
0 siblings, 1 reply; 22+ messages in thread
From: Ralf Baechle @ 2006-06-23 10:33 UTC (permalink / raw)
To: Domen Puncer; +Cc: linux-mips
On Fri, Jun 23, 2006 at 12:00:21PM +0200, Domen Puncer wrote:
> These are needed for au1550_ac97 module.
>
> Signed-off-by: Domen Puncer <domen.puncer@ultra.si>
Will apply but change that to EXPORT_SYMBOL_GPL.
Ralf
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [patch 5/8] au1xxx: export dbdma functions
2006-06-23 10:33 ` Ralf Baechle
@ 2006-06-23 13:52 ` Domen Puncer
2006-06-24 19:06 ` Sergei Shtylyov
0 siblings, 1 reply; 22+ messages in thread
From: Domen Puncer @ 2006-06-23 13:52 UTC (permalink / raw)
To: Ralf Baechle; +Cc: Domen Puncer, linux-mips
These are needed for au1550_ac97 module.
Signed-off-by: Domen Puncer <domen.puncer@ultra.si>
Index: linux-mailed/arch/mips/au1000/common/dbdma.c
===================================================================
--- linux-mailed.orig/arch/mips/au1000/common/dbdma.c
+++ linux-mailed/arch/mips/au1000/common/dbdma.c
@@ -730,6 +730,8 @@ au1xxx_dbdma_get_dest(u32 chanid, void *
return rv;
}
+EXPORT_SYMBOL_GPL(au1xxx_dbdma_get_dest);
+
void
au1xxx_dbdma_stop(u32 chanid)
{
@@ -821,6 +823,8 @@ au1xxx_get_dma_residue(u32 chanid)
return rv;
}
+EXPORT_SYMBOL_GPL(au1xxx_get_dma_residue);
+
void
au1xxx_dbdma_chan_free(u32 chanid)
{
^ permalink raw reply [flat|nested] 22+ messages in thread* Re: [patch 5/8] au1xxx: export dbdma functions
2006-06-23 13:52 ` Domen Puncer
@ 2006-06-24 19:06 ` Sergei Shtylyov
0 siblings, 0 replies; 22+ messages in thread
From: Sergei Shtylyov @ 2006-06-24 19:06 UTC (permalink / raw)
To: Domen Puncer; +Cc: Ralf Baechle, linux-mips
Hello.
Domen Puncer wrote:
> These are needed for au1550_ac97 module.
> Signed-off-by: Domen Puncer <domen.puncer@ultra.si>
> Index: linux-mailed/arch/mips/au1000/common/dbdma.c
> ===================================================================
> --- linux-mailed.orig/arch/mips/au1000/common/dbdma.c
> +++ linux-mailed/arch/mips/au1000/common/dbdma.c
> @@ -730,6 +730,8 @@ au1xxx_dbdma_get_dest(u32 chanid, void *
> return rv;
> }
>
> +EXPORT_SYMBOL_GPL(au1xxx_dbdma_get_dest);
> +
> void
> au1xxx_dbdma_stop(u32 chanid)
> {
> @@ -821,6 +823,8 @@ au1xxx_get_dma_residue(u32 chanid)
> return rv;
> }
>
> +EXPORT_SYMBOL_GPL(au1xxx_get_dma_residue);
> +
> void
> au1xxx_dbdma_chan_free(u32 chanid)
> {
I should note that without patch 6 applied (which marks the module as
GPL), this patch doesn't help. BTW, the other exports in this module are not
GPL only...
WBR, Sergei
^ permalink raw reply [flat|nested] 22+ messages in thread
* [patch 6/8] au1xxx: oss sound support for au1200
2006-06-23 9:57 [patch 0/8] au1xxx: make linux-mips more useful for au1200 users Domen Puncer
` (4 preceding siblings ...)
2006-06-23 10:00 ` [patch 5/8] au1xxx: export dbdma functions Domen Puncer
@ 2006-06-23 10:00 ` Domen Puncer
2006-06-23 10:01 ` [patch 7/8] au1xxx: compile fixes for OHCI " Domen Puncer
2006-06-23 10:01 ` [patch 8/8] au1xxx: pcmcia: fix __init called from non-init Domen Puncer
7 siblings, 0 replies; 22+ messages in thread
From: Domen Puncer @ 2006-06-23 10:00 UTC (permalink / raw)
To: Ralf Baechle; +Cc: linux-mips
au1550 ac97 driver works fine on au1200 too.
Comments at the top of file state this code is GPL, so lets
mark it as GPL too.
Signed-off-by: Domen Puncer <domen.puncer@ultra.si>
Index: linux-mailed/sound/oss/Kconfig
===================================================================
--- linux-mailed.orig/sound/oss/Kconfig
+++ linux-mailed/sound/oss/Kconfig
@@ -114,8 +114,9 @@ config SOUND_VRC5477
with the AC97 codec.
config SOUND_AU1550_AC97
- tristate "Au1550 AC97 Sound"
- depends on SOUND_PRIME && SOC_AU1550
+ tristate "Au1550/Au1200 AC97 Sound"
+ select SND_AC97_CODEC
+ depends on SOUND_PRIME && (SOC_AU1550 || SOC_AU1200)
config SOUND_AU1550_I2S
tristate "Au1550 I2S Sound"
Index: linux-mailed/sound/oss/au1550_ac97.c
===================================================================
--- linux-mailed.orig/sound/oss/au1550_ac97.c
+++ linux-mailed/sound/oss/au1550_ac97.c
@@ -1893,6 +1893,8 @@ static /*const */ struct file_operations
MODULE_AUTHOR("Advanced Micro Devices (AMD), dan@embeddededge.com");
MODULE_DESCRIPTION("Au1550 AC97 Audio Driver");
+MODULE_LICENSE("GPL");
+
static int __devinit
au1550_probe(void)
^ permalink raw reply [flat|nested] 22+ messages in thread* [patch 7/8] au1xxx: compile fixes for OHCI for au1200
2006-06-23 9:57 [patch 0/8] au1xxx: make linux-mips more useful for au1200 users Domen Puncer
` (5 preceding siblings ...)
2006-06-23 10:00 ` [patch 6/8] au1xxx: oss sound support for au1200 Domen Puncer
@ 2006-06-23 10:01 ` Domen Puncer
2006-06-23 10:56 ` Ralf Baechle
2006-06-23 10:01 ` [patch 8/8] au1xxx: pcmcia: fix __init called from non-init Domen Puncer
7 siblings, 1 reply; 22+ messages in thread
From: Domen Puncer @ 2006-06-23 10:01 UTC (permalink / raw)
To: Ralf Baechle; +Cc: linux-mips
Compile fixes for au1200 ohci.
First part looks a bit hackish... but it works for me.
Signed-off-by: Domen Puncer <domen.puncer@ultra.si>
Index: linux-mailed/drivers/usb/host/ohci-au1xxx.c
===================================================================
--- linux-mailed.orig/drivers/usb/host/ohci-au1xxx.c
+++ linux-mailed/drivers/usb/host/ohci-au1xxx.c
@@ -101,9 +101,11 @@ static void au1xxx_start_ohc(struct plat
#endif /* Au1200 */
+#ifndef CONFIG_SOC_AU1200
/* wait for reset complete (read register twice; see au1500 errata) */
while (au_readl(USB_HOST_CONFIG),
!(au_readl(USB_HOST_CONFIG) & USBH_ENABLE_RD))
+#endif
udelay(1000);
printk(KERN_DEBUG __FILE__
@@ -157,9 +159,9 @@ static int usb_ohci_au1xxx_probe(const s
/* Au1200 AB USB does not support coherent memory */
if (!(read_c0_prid() & 0xff)) {
pr_info("%s: this is chip revision AB !!\n",
- dev->dev.name);
+ dev->name);
pr_info("%s: update your board or re-configure the kernel\n",
- dev->dev.name);
+ dev->name);
return -ENODEV;
}
#endif
^ permalink raw reply [flat|nested] 22+ messages in thread* [patch 8/8] au1xxx: pcmcia: fix __init called from non-init
2006-06-23 9:57 [patch 0/8] au1xxx: make linux-mips more useful for au1200 users Domen Puncer
` (6 preceding siblings ...)
2006-06-23 10:01 ` [patch 7/8] au1xxx: compile fixes for OHCI " Domen Puncer
@ 2006-06-23 10:01 ` Domen Puncer
2006-06-23 11:07 ` Ralf Baechle
7 siblings, 1 reply; 22+ messages in thread
From: Domen Puncer @ 2006-06-23 10:01 UTC (permalink / raw)
To: Ralf Baechle; +Cc: linux-mips
This must not be marked __init, as it is called from
au1x00_drv_pcmcia_probe.
Signed-off-by: Domen Puncer <domen.puncer@ultra.si>
Index: linux-mailed/drivers/pcmcia/au1000_db1x00.c
===================================================================
--- linux-mailed.orig/drivers/pcmcia/au1000_db1x00.c
+++ linux-mailed/drivers/pcmcia/au1000_db1x00.c
@@ -296,7 +296,7 @@ struct pcmcia_low_level db1x00_pcmcia_op
.socket_suspend = db1x00_socket_suspend
};
-int __init au1x_board_init(struct device *dev)
+int au1x_board_init(struct device *dev)
{
int ret = -ENODEV;
bcsr->pcmcia = 0; /* turn off power, if it's not already off */
^ permalink raw reply [flat|nested] 22+ messages in thread