forked from xuos/xiuos
DWC3 event buffer functions
This commit is contained in:
parent
62c6017222
commit
7d575c4cea
|
@ -322,7 +322,69 @@ void dwc3_free_scratch_buffers(struct dwc3 *dwc){
|
|||
|
||||
|
||||
int dwc3_alloc_event_buffers(struct dwc3 *dwc, uint32_t length){
|
||||
int num;
|
||||
int i;
|
||||
|
||||
num = DWC3_NUM_INT(dwc->hwparams.hwparams1);
|
||||
dwc->num_event_buffers = num;
|
||||
|
||||
dwc->ev_buffs = usb_malloc(num * sizeof(*dwc->ev_buffs));
|
||||
|
||||
if (!dwc->ev_buffs)
|
||||
return -ENOMEM;
|
||||
|
||||
for (i = 0; i < num; i++) {
|
||||
struct dwc3_event_buffer *evt;
|
||||
evt = dwc3_alloc_one_event_buffer(dwc, length);
|
||||
|
||||
if(evt == NULL){
|
||||
goto err_alloc_evt;
|
||||
}
|
||||
dwc->ev_buffs[i] = evt;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err_alloc_evt:
|
||||
i = i - 1;
|
||||
for(; i >= 0; i--){
|
||||
usb_free(dwc->ev_buffs[i]);
|
||||
}
|
||||
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
|
||||
struct dwc3_event_buffer *dwc3_alloc_one_event_buffer(struct dwc3 *dwc, unsigned length){
|
||||
struct dwc3_event_buffer *evt;
|
||||
uintptr_t phy_addr, vir_addr;
|
||||
int ret;
|
||||
|
||||
evt = usb_malloc(sizeof(*evt));
|
||||
|
||||
if(evt == NULL){
|
||||
return NULL;
|
||||
}
|
||||
|
||||
evt->dwc = dwc;
|
||||
evt->length = length;
|
||||
|
||||
vir_addr = USB_MEM_VIRADDR_ALLOC;
|
||||
phy_addr = 0;
|
||||
evt->buf = (void *)vir_addr;
|
||||
|
||||
ret = naive_mmap(&vir_addr, &phy_addr, length, true);
|
||||
|
||||
if(ret != 0){
|
||||
USB_LOG_ERR("could not allocate DWC3 event buffers!\n");
|
||||
goto err_evt;
|
||||
}
|
||||
|
||||
evt->dma = phy_addr;
|
||||
|
||||
err_evt:
|
||||
usb_free(evt);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
|
@ -332,6 +394,23 @@ void dwc3_free_event_buffers(struct dwc3 *dwc){
|
|||
|
||||
|
||||
int dwc3_event_buffers_setup(struct dwc3 *dwc){
|
||||
struct dwc3_event_buffer *evt;
|
||||
int n;
|
||||
|
||||
for (n = 0; n < dwc->num_event_buffers; n++) {
|
||||
evt = dwc->ev_buffs[n];
|
||||
|
||||
evt->lpos = 0;
|
||||
|
||||
dwc3_writel(dwc->regs_vir, DWC3_GEVNTADRLO(n),
|
||||
lower_32_bits(evt->dma));
|
||||
dwc3_writel(dwc->regs_vir, DWC3_GEVNTADRHI(n),
|
||||
upper_32_bits(evt->dma));
|
||||
dwc3_writel(dwc->regs_vir, DWC3_GEVNTSIZ(n),
|
||||
DWC3_GEVNTSIZ_SIZE(evt->length));
|
||||
dwc3_writel(dwc->regs_vir, DWC3_GEVNTCOUNT(n), 0);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue