usb: host: ohci-sm501: init genalloc for local memory
In preparation for dropping the existing "coherent" dma mem declaration APIs, replace the current dma_declare_coherent_memory() based mechanism with the creation of a genalloc pool that will be used in the OHCI subsystem as replacement for the DMA APIs. Signed-off-by: Laurentiu Tudor <laurentiu.tudor@nxp.com> Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: Christoph Hellwig <hch@lst.de>
This commit is contained in:
Родитель
b0310c2f09
Коммит
7d9e6f5aeb
|
@ -110,40 +110,18 @@ static int ohci_hcd_sm501_drv_probe(struct platform_device *pdev)
|
|||
goto err0;
|
||||
}
|
||||
|
||||
/* The sm501 chip is equipped with local memory that may be used
|
||||
* by on-chip devices such as the video controller and the usb host.
|
||||
* This driver uses dma_declare_coherent_memory() to make sure
|
||||
* usb allocations with dma_alloc_coherent() allocate from
|
||||
* this local memory. The dma_handle returned by dma_alloc_coherent()
|
||||
* will be an offset starting from 0 for the first local memory byte.
|
||||
*
|
||||
* So as long as data is allocated using dma_alloc_coherent() all is
|
||||
* fine. This is however not always the case - buffers may be allocated
|
||||
* using kmalloc() - so the usb core needs to be told that it must copy
|
||||
* data into our local memory if the buffers happen to be placed in
|
||||
* regular memory. The HCD_LOCAL_MEM flag does just that.
|
||||
*/
|
||||
|
||||
retval = dma_declare_coherent_memory(dev, mem->start,
|
||||
mem->start - mem->parent->start,
|
||||
resource_size(mem));
|
||||
if (retval) {
|
||||
dev_err(dev, "cannot declare coherent memory\n");
|
||||
goto err1;
|
||||
}
|
||||
|
||||
/* allocate, reserve and remap resources for registers */
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
if (res == NULL) {
|
||||
dev_err(dev, "no resource definition for registers\n");
|
||||
retval = -ENOENT;
|
||||
goto err2;
|
||||
goto err1;
|
||||
}
|
||||
|
||||
hcd = usb_create_hcd(driver, &pdev->dev, dev_name(&pdev->dev));
|
||||
if (!hcd) {
|
||||
retval = -ENOMEM;
|
||||
goto err2;
|
||||
goto err1;
|
||||
}
|
||||
|
||||
hcd->rsrc_start = res->start;
|
||||
|
@ -164,6 +142,24 @@ static int ohci_hcd_sm501_drv_probe(struct platform_device *pdev)
|
|||
|
||||
ohci_hcd_init(hcd_to_ohci(hcd));
|
||||
|
||||
/* The sm501 chip is equipped with local memory that may be used
|
||||
* by on-chip devices such as the video controller and the usb host.
|
||||
* This driver uses genalloc so that usb allocations with
|
||||
* gen_pool_dma_alloc() allocate from this local memory. The dma_handle
|
||||
* returned by gen_pool_dma_alloc() will be an offset starting from 0
|
||||
* for the first local memory byte.
|
||||
*
|
||||
* So as long as data is allocated using gen_pool_dma_alloc() all is
|
||||
* fine. This is however not always the case - buffers may be allocated
|
||||
* using kmalloc() - so the usb core needs to be told that it must copy
|
||||
* data into our local memory if the buffers happen to be placed in
|
||||
* regular memory. The HCD_LOCAL_MEM flag does just that.
|
||||
*/
|
||||
|
||||
if (usb_hcd_setup_local_mem(hcd, mem->start,
|
||||
mem->start - mem->parent->start,
|
||||
resource_size(mem)) < 0)
|
||||
goto err5;
|
||||
retval = usb_add_hcd(hcd, irq, IRQF_SHARED);
|
||||
if (retval)
|
||||
goto err5;
|
||||
|
@ -181,8 +177,6 @@ err4:
|
|||
release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
|
||||
err3:
|
||||
usb_put_hcd(hcd);
|
||||
err2:
|
||||
dma_release_declared_memory(dev);
|
||||
err1:
|
||||
release_mem_region(mem->start, resource_size(mem));
|
||||
err0:
|
||||
|
@ -197,7 +191,6 @@ static int ohci_hcd_sm501_drv_remove(struct platform_device *pdev)
|
|||
usb_remove_hcd(hcd);
|
||||
release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
|
||||
usb_put_hcd(hcd);
|
||||
dma_release_declared_memory(&pdev->dev);
|
||||
mem = platform_get_resource(pdev, IORESOURCE_MEM, 1);
|
||||
if (mem)
|
||||
release_mem_region(mem->start, resource_size(mem));
|
||||
|
|
Загрузка…
Ссылка в новой задаче