Add support for bus_space_read_region and bus_space_write_region. This is

needed for the dwc USB controller driver.

Sponsored by:	ABT Systems Ltd
This commit is contained in:
Andrew Turner 2015-08-14 09:55:25 +00:00
parent ab4d08c3d3
commit edc2af7807
2 changed files with 192 additions and 4 deletions

View File

@ -49,6 +49,15 @@ void generic_bs_rm_4(void *, bus_space_handle_t, bus_size_t, uint32_t *,
void generic_bs_rm_8(void *, bus_space_handle_t, bus_size_t, uint64_t *,
bus_size_t);
void generic_bs_rr_1(void *, bus_space_handle_t, bus_size_t, uint8_t *,
bus_size_t);
void generic_bs_rr_2(void *, bus_space_handle_t, bus_size_t, uint16_t *,
bus_size_t);
void generic_bs_rr_4(void *, bus_space_handle_t, bus_size_t, uint32_t *,
bus_size_t);
void generic_bs_rr_8(void *, bus_space_handle_t, bus_size_t, uint64_t *,
bus_size_t);
void generic_bs_w_1(void *, bus_space_handle_t, bus_size_t, uint8_t);
void generic_bs_w_2(void *, bus_space_handle_t, bus_size_t, uint16_t);
void generic_bs_w_4(void *, bus_space_handle_t, bus_size_t, uint32_t);
@ -63,6 +72,15 @@ void generic_bs_wm_4(void *, bus_space_handle_t, bus_size_t, const uint32_t *,
void generic_bs_wm_8(void *, bus_space_handle_t, bus_size_t, const uint64_t *,
bus_size_t);
void generic_bs_wr_1(void *, bus_space_handle_t, bus_size_t, const uint8_t *,
bus_size_t);
void generic_bs_wr_2(void *, bus_space_handle_t, bus_size_t, const uint16_t *,
bus_size_t);
void generic_bs_wr_4(void *, bus_space_handle_t, bus_size_t, const uint32_t *,
bus_size_t);
void generic_bs_wr_8(void *, bus_space_handle_t, bus_size_t, const uint64_t *,
bus_size_t);
static int
generic_bs_map(void *t, bus_addr_t bpa, bus_size_t size, int flags,
bus_space_handle_t *bshp)
@ -126,6 +144,12 @@ struct bus_space memmap_bus = {
.bs_rm_4 = generic_bs_rm_4,
.bs_rm_8 = generic_bs_rm_8,
/* read region */
.bs_rr_1 = generic_bs_rr_1,
.bs_rr_2 = generic_bs_rr_2,
.bs_rr_4 = generic_bs_rr_4,
.bs_rr_8 = generic_bs_rr_8,
/* write single */
.bs_w_1 = generic_bs_w_1,
.bs_w_2 = generic_bs_w_2,
@ -139,10 +163,10 @@ struct bus_space memmap_bus = {
.bs_wm_8 = generic_bs_wm_8,
/* write region */
.bs_wr_1 = NULL,
.bs_wr_2 = NULL,
.bs_wr_4 = NULL,
.bs_wr_8 = NULL,
.bs_wr_1 = generic_bs_wr_1,
.bs_wr_2 = generic_bs_wr_2,
.bs_wr_4 = generic_bs_wr_4,
.bs_wr_8 = generic_bs_wr_8,
/* set multiple */
.bs_sm_1 = NULL,

View File

@ -133,6 +133,90 @@ ENTRY(generic_bs_rm_8)
2: ret
END(generic_bs_rm_8)
ENTRY(generic_bs_rr_1)
/* Is there is anything to read. */
cbz x4, 2f
/* Calculate the device address. */
add x0, x1, x2
/*
* x0 = The device address.
* x3 = The kernel address.
* x4 = Count
*/
/* Read the data. */
1: ldrb w1, [x0], #1
strb w1, [x3], #1
subs x4, x4, #1
b.ne 1b
2: ret
END(generic_bs_rr_1)
ENTRY(generic_bs_rr_2)
/* Is there is anything to read. */
cbz x4, 2f
/* Calculate the device address. */
add x0, x1, x2
/*
* x0 = The device address.
* x3 = The kernel address.
* x4 = Count
*/
/* Read the data. */
1: ldrh w1, [x0], #2
strh w1, [x3], #2
subs x4, x4, #1
b.ne 1b
2: ret
END(generic_bs_rr_2)
ENTRY(generic_bs_rr_4)
/* Is there is anything to read. */
cbz x4, 2f
/* Calculate the device address. */
add x0, x1, x2
/*
* x0 = The device address.
* x3 = The kernel address.
* x4 = Count
*/
/* Read the data. */
1: ldr w1, [x0], #4
str w1, [x3], #4
subs x4, x4, #1
b.ne 1b
2: ret
END(generic_bs_rr_4)
ENTRY(generic_bs_rr_8)
/* Is there is anything to read. */
cbz x4, 2f
/* Calculate the device address. */
add x0, x1, x2
/*
* x0 = The device address.
* x3 = The kernel address.
* x4 = Count
*/
/* Read the data. */
1: ldr x1, [x0], #8
str x1, [x3], #8
subs x4, x4, #1
b.ne 1b
2: ret
END(generic_bs_rr_8)
ENTRY(generic_bs_w_1)
strb w3, [x1, x2]
@ -233,3 +317,83 @@ ENTRY(generic_bs_wm_8)
2: ret
END(generic_bs_wm_8)
ENTRY(generic_bs_wr_1)
/* Is there is anything to write. */
cbz x4, 2f
add x0, x1, x2
/*
* x0 = The device address.
* x3 = The kernel address.
* x4 = Count
*/
/* Write the data */
1: ldrb w1, [x3], #1
strb w1, [x0], #1
subs x4, x4, #1
b.ne 1b
2: ret
END(generic_bs_wr_1)
ENTRY(generic_bs_wr_2)
/* Is there is anything to write. */
cbz x4, 2f
add x0, x1, x2
/*
* x0 = The device address.
* x3 = The kernel address.
* x4 = Count
*/
/* Write the data */
1: ldrh w1, [x3], #2
strh w1, [x0], #2
subs x4, x4, #1
b.ne 1b
2: ret
END(generic_bs_wr_2)
ENTRY(generic_bs_wr_4)
/* Is there is anything to write. */
cbz x4, 2f
add x0, x1, x2
/*
* x0 = The device address.
* x3 = The kernel address.
* x4 = Count
*/
/* Write the data */
1: ldr w1, [x3], #4
str w1, [x0], #4
subs x4, x4, #1
b.ne 1b
2: ret
END(generic_bs_wr_4)
ENTRY(generic_bs_wr_8)
/* Is there is anything to write. */
cbz x4, 2f
add x0, x1, x2
/*
* x0 = The device address.
* x3 = The kernel address.
* x4 = Count
*/
/* Write the data */
1: ldr x1, [x3], #8
str x1, [x0], #8
subs x4, x4, #1
b.ne 1b
2: ret
END(generic_bs_wr_8)