Esempio n. 1
0
static void omap3_edma_done(omap3_ext_t	*omap3, int channel)
{
	uintptr_t	base = omap3->dma_base + DRA446_SHADOW0_OFF;
	dra446_param	*param = (dra446_param *)(omap3->dma_base + DRA446_PARAM(channel));

	if (channel > 31) {
		base    += 4;
		channel -= 32;
	}

	if (in32(base + DRA446_EDMA_ER) & in32(base + DRA446_EDMA_EER)) {
		int i=100;
		while (param->ccnt != 0 && i--){
			printf("%s(%d): %d %x \n", __func__, __LINE__, channel, param->ccnt);
			delay(1);
		}
	}

	/* Disable this EDMA event */
	omap3_edma_bit(omap3, DRA446_EDMA_EECR, channel);
}
static void omap3_setup_tx_edma(omap3_ext_t *omap3, paddr_t addr, int len)
{
    dra446_param	*param;
    int				chnl = omap3->dma_treq;

    /*
     * In case there is a pending event
     */
    omap3_edma_bit(omap3, DRA446_EDMA_ECR, chnl);

    /*
     * Initialize Tx DMA channel
     */
    param = (dra446_param *)(omap3->dma_base + DRA446_PARAM(chnl));
    param->opt =  (0<< 23)		/* ITCCHEN = 0 */
                  | (0 << 22)		/* TCCHEN = 0 */
                  | (0 << 21)		/* */
                  | (0 << 20)		/* */
                  | (chnl << 12)	/* TCC */
                  | (0 << 11)		/* Normal completion */
                  | (0 << 3)		/* PaRAM set is not static */
                  | (1 << 2)		/* AB-synchronizad */
                  | (0 << 1)		/* Destination address increment mode */
                  | (0 << 0);		/* Source address increment mode */

    param->src          = addr;
    param->abcnt        = (128 << 16) | 4;
    param->dst          = omap3->mmc_pbase + OMAP3_MMCHS_DATA;
    param->srcdstbidx   = (0 << 16) | 4;
    param->linkbcntrld  = 0xFFFF;
    param->srcdstcidx   = (0 << 16) | 512;
    param->ccnt         = len / 512;

    /*
     * Enable event
     */
    omap3_edma_bit(omap3, DRA446_EDMA_EESR, chnl);
}