USB: use genalloc for USB HCs with local memory
[platform/kernel/linux-starfive.git] / drivers / usb / host / ohci-mem.c
index 3965ac0..4afe27c 100644 (file)
@@ -36,6 +36,13 @@ static void ohci_hcd_init (struct ohci_hcd *ohci)
 
 static int ohci_mem_init (struct ohci_hcd *ohci)
 {
+       /*
+        * HCs with local memory allocate from localmem_pool so there's
+        * no need to create the below dma pools.
+        */
+       if (ohci_to_hcd(ohci)->localmem_pool)
+               return 0;
+
        ohci->td_cache = dma_pool_create ("ohci_td",
                ohci_to_hcd(ohci)->self.controller,
                sizeof (struct td),
@@ -84,8 +91,12 @@ td_alloc (struct ohci_hcd *hc, gfp_t mem_flags)
 {
        dma_addr_t      dma;
        struct td       *td;
+       struct usb_hcd  *hcd = ohci_to_hcd(hc);
 
-       td = dma_pool_zalloc (hc->td_cache, mem_flags, &dma);
+       if (hcd->localmem_pool)
+               td = gen_pool_dma_zalloc(hcd->localmem_pool, sizeof(*td), &dma);
+       else
+               td = dma_pool_zalloc(hc->td_cache, mem_flags, &dma);
        if (td) {
                /* in case hc fetches it, make it look dead */
                td->hwNextTD = cpu_to_hc32 (hc, dma);
@@ -99,6 +110,7 @@ static void
 td_free (struct ohci_hcd *hc, struct td *td)
 {
        struct td       **prev = &hc->td_hash [TD_HASH_FUNC (td->td_dma)];
+       struct usb_hcd  *hcd = ohci_to_hcd(hc);
 
        while (*prev && *prev != td)
                prev = &(*prev)->td_hash;
@@ -106,7 +118,12 @@ td_free (struct ohci_hcd *hc, struct td *td)
                *prev = td->td_hash;
        else if ((td->hwINFO & cpu_to_hc32(hc, TD_DONE)) != 0)
                ohci_dbg (hc, "no hash for td %p\n", td);
-       dma_pool_free (hc->td_cache, td, td->td_dma);
+
+       if (hcd->localmem_pool)
+               gen_pool_free(hcd->localmem_pool, (unsigned long)td,
+                             sizeof(*td));
+       else
+               dma_pool_free(hc->td_cache, td, td->td_dma);
 }
 
 /*-------------------------------------------------------------------------*/
@@ -117,8 +134,12 @@ ed_alloc (struct ohci_hcd *hc, gfp_t mem_flags)
 {
        dma_addr_t      dma;
        struct ed       *ed;
+       struct usb_hcd  *hcd = ohci_to_hcd(hc);
 
-       ed = dma_pool_zalloc (hc->ed_cache, mem_flags, &dma);
+       if (hcd->localmem_pool)
+               ed = gen_pool_dma_zalloc(hcd->localmem_pool, sizeof(*ed), &dma);
+       else
+               ed = dma_pool_zalloc(hc->ed_cache, mem_flags, &dma);
        if (ed) {
                INIT_LIST_HEAD (&ed->td_list);
                ed->dma = dma;
@@ -129,6 +150,12 @@ ed_alloc (struct ohci_hcd *hc, gfp_t mem_flags)
 static void
 ed_free (struct ohci_hcd *hc, struct ed *ed)
 {
-       dma_pool_free (hc->ed_cache, ed, ed->dma);
+       struct usb_hcd  *hcd = ohci_to_hcd(hc);
+
+       if (hcd->localmem_pool)
+               gen_pool_free(hcd->localmem_pool, (unsigned long)ed,
+                             sizeof(*ed));
+       else
+               dma_pool_free(hc->ed_cache, ed, ed->dma);
 }