diff options
Diffstat (limited to 'arch/blackfin/lib/outs.S')
| -rw-r--r-- | arch/blackfin/lib/outs.S | 60 | 
1 files changed, 60 insertions, 0 deletions
| diff --git a/arch/blackfin/lib/outs.S b/arch/blackfin/lib/outs.S new file mode 100644 index 000000000..90c6033c9 --- /dev/null +++ b/arch/blackfin/lib/outs.S @@ -0,0 +1,60 @@ +/* + * Implementation of outs{bwl} for BlackFin processors using zero overhead loops. + * + * Copyright 2005-2009 Analog Devices Inc. + *                2005 BuyWays BV + *                      Bas Vermeulen <bas@buyways.nl> + * + * Licensed under the GPL-2. + */ + +#include <asm/linkage.h> + +.align 2 + +ENTRY(_outsl) +	P0 = R0;	/* P0 = port */ +	P1 = R1;	/* P1 = address */ +	P2 = R2;	/* P2 = count */ + +	LSETUP( .Llong_loop_s, .Llong_loop_e) LC0 = P2; +.Llong_loop_s: R0 = [P1++]; +.Llong_loop_e: [P0] = R0; +	RTS; +ENDPROC(_outsl) + +ENTRY(_outsw) +	P0 = R0;	/* P0 = port */ +	P1 = R1;	/* P1 = address */ +	P2 = R2;	/* P2 = count */ + +	LSETUP( .Lword_loop_s, .Lword_loop_e) LC0 = P2; +.Lword_loop_s: R0 = W[P1++]; +.Lword_loop_e: W[P0] = R0; +	RTS; +ENDPROC(_outsw) + +ENTRY(_outsb) +	P0 = R0;	/* P0 = port */ +	P1 = R1;	/* P1 = address */ +	P2 = R2;	/* P2 = count */ + +	LSETUP( .Lbyte_loop_s, .Lbyte_loop_e) LC0 = P2; +.Lbyte_loop_s: R0 = B[P1++]; +.Lbyte_loop_e: B[P0] = R0; +	RTS; +ENDPROC(_outsb) + +ENTRY(_outsw_8) +	P0 = R0;	/* P0 = port */ +	P1 = R1;	/* P1 = address */ +	P2 = R2;	/* P2 = count */ + +	LSETUP( .Lword8_loop_s, .Lword8_loop_e) LC0 = P2; +.Lword8_loop_s: R1 = B[P1++]; +		R0 = B[P1++]; +		R0 = R0 << 8; +		R0 = R0 + R1; +.Lword8_loop_e: W[P0] = R0; +	RTS; +ENDPROC(_outsw_8) |