-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
yaml --- r: 70892 b: refs/heads/master c: 9ea68df h: refs/heads/master v: v3
- Loading branch information
Sylvain Munaut
authored and
Grant Likely
committed
Oct 16, 2007
1 parent
85cb32d
commit 69415e5
Showing
6 changed files
with
268 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,2 @@ | ||
--- | ||
refs/heads/master: 2f9ea1bde0d12d8fb5a7bdc7ab6834275d456262 | ||
refs/heads/master: 9ea68df515392a556388f12c876ca74654e37483 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,154 @@ | ||
/* | ||
* Bestcomm ATA task driver | ||
* | ||
* | ||
* Patterned after bestcomm/fec.c by Dale Farnsworth <dfarnsworth@mvista.com> | ||
* 2003-2004 (c) MontaVista, Software, Inc. | ||
* | ||
* Copyright (C) 2006-2007 Sylvain Munaut <tnt@246tNt.com> | ||
* Copyright (C) 2006 Freescale - John Rigby | ||
* | ||
* This file is licensed under the terms of the GNU General Public License | ||
* version 2. This program is licensed "as is" without any warranty of any | ||
* kind, whether express or implied. | ||
*/ | ||
|
||
#include <linux/kernel.h> | ||
#include <linux/module.h> | ||
#include <linux/types.h> | ||
#include <asm/io.h> | ||
|
||
#include "bestcomm.h" | ||
#include "bestcomm_priv.h" | ||
#include "ata.h" | ||
|
||
|
||
/* ======================================================================== */ | ||
/* Task image/var/inc */ | ||
/* ======================================================================== */ | ||
|
||
/* ata task image */ | ||
extern u32 bcom_ata_task[]; | ||
|
||
/* ata task vars that need to be set before enabling the task */ | ||
struct bcom_ata_var { | ||
u32 enable; /* (u16*) address of task's control register */ | ||
u32 bd_base; /* (struct bcom_bd*) beginning of ring buffer */ | ||
u32 bd_last; /* (struct bcom_bd*) end of ring buffer */ | ||
u32 bd_start; /* (struct bcom_bd*) current bd */ | ||
u32 buffer_size; /* size of receive buffer */ | ||
}; | ||
|
||
/* ata task incs that need to be set before enabling the task */ | ||
struct bcom_ata_inc { | ||
u16 pad0; | ||
s16 incr_bytes; | ||
u16 pad1; | ||
s16 incr_dst; | ||
u16 pad2; | ||
s16 incr_src; | ||
}; | ||
|
||
|
||
/* ======================================================================== */ | ||
/* Task support code */ | ||
/* ======================================================================== */ | ||
|
||
struct bcom_task * | ||
bcom_ata_init(int queue_len, int maxbufsize) | ||
{ | ||
struct bcom_task *tsk; | ||
struct bcom_ata_var *var; | ||
struct bcom_ata_inc *inc; | ||
|
||
tsk = bcom_task_alloc(queue_len, sizeof(struct bcom_ata_bd), 0); | ||
if (!tsk) | ||
return NULL; | ||
|
||
tsk->flags = BCOM_FLAGS_NONE; | ||
|
||
bcom_ata_reset_bd(tsk); | ||
|
||
var = (struct bcom_ata_var *) bcom_task_var(tsk->tasknum); | ||
inc = (struct bcom_ata_inc *) bcom_task_inc(tsk->tasknum); | ||
|
||
if (bcom_load_image(tsk->tasknum, bcom_ata_task)) { | ||
bcom_task_free(tsk); | ||
return NULL; | ||
} | ||
|
||
var->enable = bcom_eng->regs_base + | ||
offsetof(struct mpc52xx_sdma, tcr[tsk->tasknum]); | ||
var->bd_base = tsk->bd_pa; | ||
var->bd_last = tsk->bd_pa + ((tsk->num_bd-1) * tsk->bd_size); | ||
var->bd_start = tsk->bd_pa; | ||
var->buffer_size = maxbufsize; | ||
|
||
/* Configure some stuff */ | ||
bcom_set_task_pragma(tsk->tasknum, BCOM_ATA_PRAGMA); | ||
bcom_set_task_auto_start(tsk->tasknum, tsk->tasknum); | ||
|
||
out_8(&bcom_eng->regs->ipr[BCOM_INITIATOR_ATA_RX], BCOM_IPR_ATA_RX); | ||
out_8(&bcom_eng->regs->ipr[BCOM_INITIATOR_ATA_TX], BCOM_IPR_ATA_TX); | ||
|
||
out_be32(&bcom_eng->regs->IntPend, 1<<tsk->tasknum); /* Clear ints */ | ||
|
||
return tsk; | ||
} | ||
EXPORT_SYMBOL_GPL(bcom_ata_init); | ||
|
||
void bcom_ata_rx_prepare(struct bcom_task *tsk) | ||
{ | ||
struct bcom_ata_inc *inc; | ||
|
||
inc = (struct bcom_ata_inc *) bcom_task_inc(tsk->tasknum); | ||
|
||
inc->incr_bytes = -(s16)sizeof(u32); | ||
inc->incr_src = 0; | ||
inc->incr_dst = sizeof(u32); | ||
|
||
bcom_set_initiator(tsk->tasknum, BCOM_INITIATOR_ATA_RX); | ||
} | ||
EXPORT_SYMBOL_GPL(bcom_ata_rx_prepare); | ||
|
||
void bcom_ata_tx_prepare(struct bcom_task *tsk) | ||
{ | ||
struct bcom_ata_inc *inc; | ||
|
||
inc = (struct bcom_ata_inc *) bcom_task_inc(tsk->tasknum); | ||
|
||
inc->incr_bytes = -(s16)sizeof(u32); | ||
inc->incr_src = sizeof(u32); | ||
inc->incr_dst = 0; | ||
|
||
bcom_set_initiator(tsk->tasknum, BCOM_INITIATOR_ATA_TX); | ||
} | ||
EXPORT_SYMBOL_GPL(bcom_ata_tx_prepare); | ||
|
||
void bcom_ata_reset_bd(struct bcom_task *tsk) | ||
{ | ||
struct bcom_ata_var *var; | ||
|
||
/* Reset all BD */ | ||
memset(tsk->bd, 0x00, tsk->num_bd * tsk->bd_size); | ||
|
||
tsk->index = 0; | ||
tsk->outdex = 0; | ||
|
||
var = (struct bcom_ata_var *) bcom_task_var(tsk->tasknum); | ||
var->bd_start = var->bd_base; | ||
} | ||
EXPORT_SYMBOL_GPL(bcom_ata_reset_bd); | ||
|
||
void bcom_ata_release(struct bcom_task *tsk) | ||
{ | ||
/* Nothing special for the ATA tasks */ | ||
bcom_task_free(tsk); | ||
} | ||
EXPORT_SYMBOL_GPL(bcom_ata_release); | ||
|
||
|
||
MODULE_DESCRIPTION("BestComm ATA task driver"); | ||
MODULE_AUTHOR("John Rigby"); | ||
MODULE_LICENSE("GPL v2"); | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
/* | ||
* Header for Bestcomm ATA task driver | ||
* | ||
* | ||
* Copyright (C) 2006 Freescale - John Rigby | ||
* Copyright (C) 2006 Sylvain Munaut <tnt@246tNt.com> | ||
* | ||
* This file is licensed under the terms of the GNU General Public License | ||
* version 2. This program is licensed "as is" without any warranty of any | ||
* kind, whether express or implied. | ||
*/ | ||
|
||
#ifndef __BESTCOMM_ATA_H__ | ||
#define __BESTCOMM_ATA_H__ | ||
|
||
|
||
struct bcom_ata_bd { | ||
u32 status; | ||
u32 dst_pa; | ||
u32 src_pa; | ||
}; | ||
|
||
extern struct bcom_task * | ||
bcom_ata_init(int queue_len, int maxbufsize); | ||
|
||
extern void | ||
bcom_ata_rx_prepare(struct bcom_task *tsk); | ||
|
||
extern void | ||
bcom_ata_tx_prepare(struct bcom_task *tsk); | ||
|
||
extern void | ||
bcom_ata_reset_bd(struct bcom_task *tsk); | ||
|
||
|
||
#endif /* __BESTCOMM_ATA_H__ */ | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
/* | ||
* Bestcomm ATA task microcode | ||
* | ||
* Copyright (c) 2004 Freescale Semiconductor, Inc. | ||
* | ||
* This program is free software; you can redistribute it and/or modify it | ||
* under the terms of the GNU General Public License version 2 as published | ||
* by the Free Software Foundation. | ||
* | ||
* Created based on bestcom/code_dma/image_rtos1/dma_image.hex | ||
*/ | ||
|
||
#include <asm/types.h> | ||
|
||
/* | ||
* The header consists of the following fields: | ||
* u32 magic; | ||
* u8 desc_size; | ||
* u8 var_size; | ||
* u8 inc_size; | ||
* u8 first_var; | ||
* u8 reserved[8]; | ||
* | ||
* The size fields contain the number of 32-bit words. | ||
*/ | ||
|
||
u32 bcom_ata_task[] = { | ||
/* header */ | ||
0x4243544b, | ||
0x0e060709, | ||
0x00000000, | ||
0x00000000, | ||
|
||
/* Task descriptors */ | ||
0x8198009b, /* LCD: idx0 = var3; idx0 <= var2; idx0 += inc3 */ | ||
0x13e00c08, /* DRD1A: var3 = var1; FN=0 MORE init=31 WS=0 RS=0 */ | ||
0xb8000264, /* LCD: idx1 = *idx0, idx2 = var0; idx1 < var9; idx1 += inc4, idx2 += inc4 */ | ||
0x10000f00, /* DRD1A: var3 = idx0; FN=0 MORE init=0 WS=0 RS=0 */ | ||
0x60140002, /* DRD2A: EU0=0 EU1=0 EU2=0 EU3=2 EXT init=0 WS=2 RS=2 */ | ||
0x0c8cfc8a, /* DRD2B1: *idx2 = EU3(); EU3(*idx2,var10) */ | ||
0xd8988240, /* LCDEXT: idx1 = idx1; idx1 > var9; idx1 += inc0 */ | ||
0xf845e011, /* LCDEXT: idx2 = *(idx0 + var00000015); ; idx2 += inc2 */ | ||
0xb845e00a, /* LCD: idx3 = *(idx0 + var00000019); ; idx3 += inc1 */ | ||
0x0bfecf90, /* DRD1A: *idx3 = *idx2; FN=0 TFD init=31 WS=3 RS=3 */ | ||
0x9898802d, /* LCD: idx1 = idx1; idx1 once var0; idx1 += inc5 */ | ||
0x64000005, /* DRD2A: EU0=0 EU1=0 EU2=0 EU3=5 INT EXT init=0 WS=0 RS=0 */ | ||
0x0c0cf849, /* DRD2B1: *idx0 = EU3(); EU3(idx1,var9) */ | ||
0x000001f8, /* NOP */ | ||
|
||
/* VAR[9]-VAR[14] */ | ||
0x40000000, | ||
0x7fff7fff, | ||
0x00000000, | ||
0x00000000, | ||
0x00000000, | ||
0x00000000, | ||
|
||
/* INC[0]-INC[6] */ | ||
0x40000000, | ||
0xe0000000, | ||
0xe0000000, | ||
0xa000000c, | ||
0x20000000, | ||
0x00000000, | ||
0x00000000, | ||
}; | ||
|