scratch.c 2.14 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
#include <aml.h>
#include <assert.h>

/*******************************************************************************
 * Generic Scratchpad API:
 * Most of the stuff is dispatched to a different layer, using type-specific
 * functions.
 *
 * As for DMA, the API is slightly different than the functions below, as we
 * abstract the request creation after this layer.
 ******************************************************************************/

int aml_scratch_pull(struct aml_scratch *scratch, ...)
{
	assert(scratch != NULL);
	va_list ap;
	int ret;
	struct aml_scratch_request *req;
	va_start(ap, scratch);
	ret = scratch->ops->create_request(scratch->data, &req,
				       AML_SCRATCH_REQUEST_TYPE_PULL, ap);
	va_end(ap);
	ret = scratch->ops->wait_request(scratch->data, req);
	return ret;
}

int aml_scratch_async_pull(struct aml_scratch *scratch,
			   struct aml_scratch_request **req, ...)
{
	assert(scratch != NULL);
	assert(req != NULL);
	va_list ap;
	int ret;
	va_start(ap, req);
	ret = scratch->ops->create_request(scratch->data, req,
				       AML_SCRATCH_REQUEST_TYPE_PULL, ap);
	va_end(ap);
	return ret;
}

int aml_scratch_push(struct aml_scratch *scratch, ...)
{
	assert(scratch != NULL);
	struct aml_scratch_request *req;
	va_list ap;
	int ret;
	va_start(ap, scratch);
	ret = scratch->ops->create_request(scratch->data, &req,
				       AML_SCRATCH_REQUEST_TYPE_PUSH, ap);
	va_end(ap);
	ret = scratch->ops->wait_request(scratch->data, req);
	return ret;
}


int aml_scratch_async_push(struct aml_scratch *scratch, struct aml_scratch_request **req, ...)
{
	assert(scratch != NULL);
	assert(req != NULL);
	va_list ap;
	int ret;
	va_start(ap, req);
	ret = scratch->ops->create_request(scratch->data, req,
				       AML_SCRATCH_REQUEST_TYPE_PUSH, ap);
	va_end(ap);
	return ret;
}

int aml_scratch_cancel(struct aml_scratch *scratch, struct aml_scratch_request *req)
{
	assert(scratch != NULL);
	assert(req != NULL);
	return scratch->ops->destroy_request(scratch->data, req);
}

int aml_scratch_wait(struct aml_scratch *scratch, struct aml_scratch_request *req)
{
	assert(scratch != NULL);
	assert(req != NULL);
	return scratch->ops->wait_request(scratch->data, req);
}