Пример #1
0
static int sdma_config_channel(struct sdma_channel *sdmac)
{
	int ret;

	sdma_disable_channel(sdmac);

	sdmac->event_mask0 = 0;
	sdmac->event_mask1 = 0;
	sdmac->shp_addr = 0;
	sdmac->per_addr = 0;

	if (sdmac->event_id0) {
		if (sdmac->event_id0 > 32)
			return -EINVAL;
		sdma_event_enable(sdmac, sdmac->event_id0);
	}

	switch (sdmac->peripheral_type) {
	case IMX_DMATYPE_DSP:
		sdma_config_ownership(sdmac, false, true, true);
		break;
	case IMX_DMATYPE_MEMORY:
		sdma_config_ownership(sdmac, false, true, false);
		break;
	default:
		sdma_config_ownership(sdmac, true, true, false);
		break;
	}

	sdma_get_pc(sdmac, sdmac->peripheral_type);

	if ((sdmac->peripheral_type != IMX_DMATYPE_MEMORY) &&
			(sdmac->peripheral_type != IMX_DMATYPE_DSP)) {
		/* Handle multiple event channels differently */
		if (sdmac->event_id1) {
			sdmac->event_mask1 = 1 << (sdmac->event_id1 % 32);
			if (sdmac->event_id1 > 31)
				sdmac->watermark_level |= 1 << 31;
			sdmac->event_mask0 = 1 << (sdmac->event_id0 % 32);
			if (sdmac->event_id0 > 31)
				sdmac->watermark_level |= 1 << 30;
		} else {
			sdmac->event_mask0 = 1 << sdmac->event_id0;
			sdmac->event_mask1 = 1 << (sdmac->event_id0 - 32);
		}
		/* Watermark Level */
		sdmac->watermark_level |= sdmac->watermark_level;
		/* Address */
		sdmac->shp_addr = sdmac->per_address;
	} else {
		sdmac->watermark_level = 0; /* FIXME: M3_BASE_ADDRESS */
	}

	ret = sdma_load_context(sdmac);

	return ret;
}
Пример #2
0
static int sdma_config_channel(struct sdma_channel *sdmac)
{
	int ret;

	sdma_disable_channel(sdmac);

	sdmac->event_mask0 = 0;
	sdmac->event_mask1 = 0;
	sdmac->shp_addr = 0;
	sdmac->per_addr = 0;

	if (sdmac->event_id0)
		sdma_event_enable(sdmac, sdmac->event_id0);

	if (sdmac->event_id1)
		sdma_event_enable(sdmac, sdmac->event_id1);

	switch (sdmac->peripheral_type) {
	case IMX_DMATYPE_DSP:
		sdma_config_ownership(sdmac, false, true, true);
		break;
	case IMX_DMATYPE_MEMORY:
		sdma_config_ownership(sdmac, false, true, false);
		break;
	default:
		sdma_config_ownership(sdmac, true, true, false);
		break;
	}

	sdma_get_pc(sdmac, sdmac->peripheral_type);

	if ((sdmac->peripheral_type != IMX_DMATYPE_MEMORY) &&
			(sdmac->peripheral_type != IMX_DMATYPE_DSP)) {
		/* Handle multiple event channels differently */
		if (sdmac->event_id1) {
			if (sdmac->event_id0 > 31) {
				sdmac->watermark_level |= 1 << 28;
				sdmac->event_mask0 |= 0;
				sdmac->event_mask1 |=
					1 << ((sdmac->event_id0)%32);
			} else {
				sdmac->event_mask0 |=
					1 << ((sdmac->event_id0)%32);
				sdmac->event_mask1 |= 0;
			}
			if (sdmac->event_id1 > 31) {
				sdmac->watermark_level |= 1 << 29;
				sdmac->event_mask0 |= 0;
				sdmac->event_mask1 |=
					1 << ((sdmac->event_id1)%32);
			} else {
				sdmac->event_mask0 |=
					1 << ((sdmac->event_id1)%32);
				sdmac->event_mask1 |= 0;
			}
			sdmac->watermark_level |= (unsigned int)(3<<11);
			sdmac->watermark_level |= (unsigned int)(1<<31);
			sdmac->watermark_level |= (unsigned int)(2<<24);
		} else {
			if (sdmac->event_id0 > 31) {
				sdmac->event_mask0 = 0;
				sdmac->event_mask1 =
					1 << ((sdmac->event_id0)%32);
			} else {
				sdmac->event_mask0 =
					1 << ((sdmac->event_id0)%32);
				sdmac->event_mask1 = 0;
			}
		}
		/* Watermark Level */
		sdmac->watermark_level |= sdmac->watermark_level;
		/* Address */
		switch (sdmac->direction) {
		case DMA_DEV_TO_DEV:
			sdmac->per_addr = sdmac->per_address;
			sdmac->shp_addr = sdmac->per_address2;
			break;
		default:
		sdmac->shp_addr = sdmac->per_address;
			break;
		}
	} else {
		sdmac->watermark_level = 0; /* FIXME: M3_BASE_ADDRESS */
	}

	ret = sdma_load_context(sdmac);

	return ret;
}