OpenCores
URL https://opencores.org/ocsvn/or1k_old/or1k_old/trunk

Subversion Repositories or1k_old

[/] [or1k_old/] [trunk/] [rc203soc/] [sw/] [uClinux/] [arch/] [armnommu/] [kernel/] [dma-arc.c] - Diff between revs 1765 and 1782

Only display areas with differences | Details | Blame | View Log

Rev 1765 Rev 1782
/*
/*
 * arch/arm/kernel/dma-arc.c
 * arch/arm/kernel/dma-arc.c
 *
 *
 * Copyright (C) 1998 Dave Gilbert / Russell King
 * Copyright (C) 1998 Dave Gilbert / Russell King
 *
 *
 * DMA functions specific to Archimedes architecture
 * DMA functions specific to Archimedes architecture
 */
 */
#include <linux/sched.h>
#include <linux/sched.h>
 
 
#include <asm/dma.h>
#include <asm/dma.h>
#include <asm/io.h>
#include <asm/io.h>
#include <asm/hardware.h>
#include <asm/hardware.h>
 
 
 
 
#include "dma.h"
#include "dma.h"
 
 
int arch_get_dma_residue(dmach_t channel, dma_t *dma)
int arch_get_dma_residue(dmach_t channel, dma_t *dma)
{
{
 if (channel != DMA_VIRTUAL_FLOPPY0 &&
 if (channel != DMA_VIRTUAL_FLOPPY0 &&
     channel != DMA_VIRTUAL_FLOPPY1) {
     channel != DMA_VIRTUAL_FLOPPY1) {
    printk ("arch_dma_count: invalid channel %d\n", channel);
    printk ("arch_dma_count: invalid channel %d\n", channel);
    return 0;
    return 0;
  } else {
  } else {
    extern int fdc1772_bytestogo;
    extern int fdc1772_bytestogo;
    return fdc1772_bytestogo;
    return fdc1772_bytestogo;
  }
  }
}
}
 
 
int arch_request_dma(dmach_t channel, dma_t *dma, const char *devname)
int arch_request_dma(dmach_t channel, dma_t *dma, const char *devname)
{
{
        if (channel == DMA_VIRTUAL_FLOPPY0 ||
        if (channel == DMA_VIRTUAL_FLOPPY0 ||
            channel == DMA_VIRTUAL_FLOPPY1)
            channel == DMA_VIRTUAL_FLOPPY1)
                return 0;
                return 0;
        else
        else
                return -EINVAL;
                return -EINVAL;
}
}
 
 
void arch_free_dma(dmach_t channel, dma_t *dma)
void arch_free_dma(dmach_t channel, dma_t *dma)
{
{
        if (channel != DMA_VIRTUAL_FLOPPY0 &&
        if (channel != DMA_VIRTUAL_FLOPPY0 &&
            channel != DMA_VIRTUAL_FLOPPY1)
            channel != DMA_VIRTUAL_FLOPPY1)
                return 0;
                return 0;
        else
        else
                return -EINVAL;
                return -EINVAL;
}
}
 
 
void arch_enable_dma(dmach_t channel, dma_t *dma)
void arch_enable_dma(dmach_t channel, dma_t *dma)
{
{
        switch (channel) {
        switch (channel) {
        case DMA_VIRTUAL_FLOPPY0: { /* Data DMA */
        case DMA_VIRTUAL_FLOPPY0: { /* Data DMA */
                switch (dma->dma_mode) {
                switch (dma->dma_mode) {
                case DMA_MODE_READ: /* read */
                case DMA_MODE_READ: /* read */
                {
                {
                        extern unsigned char fdc1772_dma_read, fdc1772_dma_read_end;
                        extern unsigned char fdc1772_dma_read, fdc1772_dma_read_end;
                        extern void fdc1772_setupdma(unsigned int count,unsigned int addr);
                        extern void fdc1772_setupdma(unsigned int count,unsigned int addr);
                        unsigned long flags;
                        unsigned long flags;
#ifdef DEBUG
#ifdef DEBUG
                        printk("enable_dma fdc1772 data read\n");
                        printk("enable_dma fdc1772 data read\n");
#endif
#endif
                        save_flags(flags);
                        save_flags(flags);
                        cliIF();
                        cliIF();
 
 
                        memcpy ((void *)0x1c, (void *)&fdc1772_dma_read,
                        memcpy ((void *)0x1c, (void *)&fdc1772_dma_read,
                                &fdc1772_dma_read_end - &fdc1772_dma_read);
                                &fdc1772_dma_read_end - &fdc1772_dma_read);
                        fdc1772_setupdma(dma->buf.length, __bus_to_virt(dma->buf.address)); /* Sets data pointer up */
                        fdc1772_setupdma(dma->buf.length, __bus_to_virt(dma->buf.address)); /* Sets data pointer up */
                        enable_irq (64);
                        enable_irq (64);
                        restore_flags(flags);
                        restore_flags(flags);
                }
                }
                break;
                break;
 
 
                case DMA_MODE_WRITE: /* write */
                case DMA_MODE_WRITE: /* write */
                {
                {
                        extern unsigned char fdc1772_dma_write, fdc1772_dma_write_end;
                        extern unsigned char fdc1772_dma_write, fdc1772_dma_write_end;
                        extern void fdc1772_setupdma(unsigned int count,unsigned int addr);
                        extern void fdc1772_setupdma(unsigned int count,unsigned int addr);
                        unsigned long flags;
                        unsigned long flags;
 
 
#ifdef DEBUG
#ifdef DEBUG
                        printk("enable_dma fdc1772 data write\n");
                        printk("enable_dma fdc1772 data write\n");
#endif
#endif
                        save_flags(flags);
                        save_flags(flags);
                        cliIF();
                        cliIF();
                        memcpy ((void *)0x1c, (void *)&fdc1772_dma_write,
                        memcpy ((void *)0x1c, (void *)&fdc1772_dma_write,
                                &fdc1772_dma_write_end - &fdc1772_dma_write);
                                &fdc1772_dma_write_end - &fdc1772_dma_write);
                        fdc1772_setupdma(dma->buf.length, __bus_to_virt(dma->buf.address)); /* Sets data pointer up */
                        fdc1772_setupdma(dma->buf.length, __bus_to_virt(dma->buf.address)); /* Sets data pointer up */
                        enable_irq (64);
                        enable_irq (64);
 
 
                        restore_flags(flags);
                        restore_flags(flags);
                }
                }
                break;
                break;
                default:
                default:
                        printk ("enable_dma: dma%d not initialised\n", channel);
                        printk ("enable_dma: dma%d not initialised\n", channel);
                        return;
                        return;
                }
                }
        }
        }
        break;
        break;
 
 
        case DMA_VIRTUAL_FLOPPY1: { /* Command end FIQ - actually just sets a flag */
        case DMA_VIRTUAL_FLOPPY1: { /* Command end FIQ - actually just sets a flag */
                /* Need to build a branch at the FIQ address */
                /* Need to build a branch at the FIQ address */
                extern void fdc1772_comendhandler(void);
                extern void fdc1772_comendhandler(void);
                unsigned long flags;
                unsigned long flags;
 
 
                /*printk("enable_dma fdc1772 command end FIQ\n");*/
                /*printk("enable_dma fdc1772 command end FIQ\n");*/
                save_flags(flags);
                save_flags(flags);
                cliIF();
                cliIF();
 
 
                *((unsigned int *)0x1c)=0xea000000 | (((unsigned int)fdc1772_comendhandler-(0x1c+8))/4); /* B fdc1772_comendhandler */
                *((unsigned int *)0x1c)=0xea000000 | (((unsigned int)fdc1772_comendhandler-(0x1c+8))/4); /* B fdc1772_comendhandler */
 
 
                restore_flags(flags);
                restore_flags(flags);
        }
        }
        break;
        break;
        }
        }
}
}
 
 
void arch_disable_dma(dmach_t channel, dma_t *dma)
void arch_disable_dma(dmach_t channel, dma_t *dma)
{
{
        if (channel != DMA_VIRTUAL_FLOPPY0 &&
        if (channel != DMA_VIRTUAL_FLOPPY0 &&
            channel != DMA_VIRTUAL_FLOPPY1)
            channel != DMA_VIRTUAL_FLOPPY1)
                printk("arch_disable_dma: invalid channel %d\n", channel);
                printk("arch_disable_dma: invalid channel %d\n", channel);
        else
        else
                disable_irq(dma->dma_irq);
                disable_irq(dma->dma_irq);
}
}
 
 
void arch_dma_init(dma_t *dma)
void arch_dma_init(dma_t *dma)
{
{
        dma[DMA_VIRTUAL_FLOPPY0].dma_irq = 64;
        dma[DMA_VIRTUAL_FLOPPY0].dma_irq = 64;
        dma[DMA_VIRTUAL_FLOPPY1].dma_irq = 65;
        dma[DMA_VIRTUAL_FLOPPY1].dma_irq = 65;
}
}
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.