summaryrefslogtreecommitdiff
path: root/drivers/usb
diff options
context:
space:
mode:
authorRob Herring <r.herring@freescale.com>2010-01-22 15:00:25 -0200
committerAlejandro Gonzalez <alex.gonzalez@digi.com>2010-05-24 11:50:07 +0200
commit464b1e29cabf36a6f00909542bf3eb619e992b01 (patch)
tree25d325174d4326f531073eb2f511c9d060b9270d /drivers/usb
parentae4d4c8f9c8f8e9016eb0bce64667baaccde552e (diff)
ENGR00120393-4 arc usb: use iram allocator for iram work-around
Convert USB iram work-around to iram allocator functions. Signed-off-by: Rob Herring <r.herring@freescale.com> Signed-off-by: Alejandro Gonzalez <alex.gonzalez@digi.com>
Diffstat (limited to 'drivers/usb')
-rw-r--r--drivers/usb/gadget/arcotg_udc.c9
-rw-r--r--drivers/usb/gadget/arcotg_udc.h6
-rw-r--r--drivers/usb/host/ehci-mem-iram.c30
3 files changed, 27 insertions, 18 deletions
diff --git a/drivers/usb/gadget/arcotg_udc.c b/drivers/usb/gadget/arcotg_udc.c
index 1532d6fc043f..363f5d1899b8 100644
--- a/drivers/usb/gadget/arcotg_udc.c
+++ b/drivers/usb/gadget/arcotg_udc.c
@@ -48,6 +48,7 @@
#include "arcotg_udc.h"
#include <mach/arc_otg.h>
+#include <linux/iram_alloc.h>
#define DRIVER_DESC "ARC USBOTG Device Controller driver"
#define DRIVER_AUTHOR "Freescale Semiconductor"
@@ -88,6 +89,8 @@ fsl_ep0_desc = {
.wMaxPacketSize = USB_MAX_CTRL_PAYLOAD,
};
static const size_t g_iram_size = IRAM_TD_PPH_SIZE;
+static unsigned long g_iram_base;
+static __iomem void *g_iram_addr;
typedef int (*dev_sus)(struct device *dev, pm_message_t state);
typedef int (*dev_res) (struct device *dev);
@@ -2847,9 +2850,9 @@ static int __init fsl_udc_probe(struct platform_device *pdev)
if (g_iram_size) {
for (i = 0; i < IRAM_PPH_NTD; i++) {
udc_controller->iram_buffer[i] =
- USB_IRAM_BASE_ADDR + i * g_iram_size;
+ g_iram_base + i * g_iram_size;
udc_controller->iram_buffer_v[i] =
- IO_ADDRESS(udc_controller->iram_buffer[i]);
+ g_iram_addr + i * g_iram_size;
}
}
#ifdef POSTPONE_FREE_LAST_DTD
@@ -2910,6 +2913,8 @@ static int __exit fsl_udc_remove(struct platform_device *pdev)
remove_proc_file();
/* Free allocated memory */
+ if (g_iram_size)
+ iram_free(g_iram_base, IRAM_PPH_NTD * g_iram_size);
kfree(udc_controller->status_req->req.buf);
kfree(udc_controller->status_req);
kfree(udc_controller->data_req->req.buf);
diff --git a/drivers/usb/gadget/arcotg_udc.h b/drivers/usb/gadget/arcotg_udc.h
index d8d33eb7156e..ef44caf21afa 100644
--- a/drivers/usb/gadget/arcotg_udc.h
+++ b/drivers/usb/gadget/arcotg_udc.h
@@ -1,5 +1,5 @@
/*
- * Copyright 2004-2009 Freescale Semiconductor, Inc. All Rights Reserved.
+ * Copyright (C) 2004-2010 Freescale Semiconductor, Inc. All Rights Reserved.
*/
/*
@@ -43,10 +43,6 @@
#define IRAM_PPH_NTD 0
#endif
-#ifndef USB_IRAM_BASE_ADDR
-#define USB_IRAM_BASE_ADDR 0
-#endif
-
#define NEED_IRAM(ep) ((g_iram_size) && \
((ep)->desc->bmAttributes == USB_ENDPOINT_XFER_BULK))
diff --git a/drivers/usb/host/ehci-mem-iram.c b/drivers/usb/host/ehci-mem-iram.c
index 66dd6e484fdd..fd7b42b22758 100644
--- a/drivers/usb/host/ehci-mem-iram.c
+++ b/drivers/usb/host/ehci-mem-iram.c
@@ -35,6 +35,7 @@
/* Allocate the key transfer structures from the previously allocated pool */
#include <linux/smp_lock.h>
+#include <linux/iram_alloc.h>
bool use_iram_qtd;
@@ -53,6 +54,8 @@ static spinlock_t g_usb_sema;
static u32 g_debug_qtd_allocated;
static u32 g_debug_qH_allocated;
static int g_alloc_map;
+static unsigned long g_iram_base;
+static __iomem void *g_iram_addr;
/*!
* usb_pool_initialize
@@ -238,7 +241,7 @@ static u32 alloc_iram_buf(void)
for (i = 0; i < IRAM_NTD; i++) {
if (!(g_alloc_map & (1 << i))) {
g_alloc_map |= (1 << i);
- return USB_IRAM_BASE_ADDR + i * (IRAM_TD_SIZE * 2);
+ return g_iram_base + i * (IRAM_TD_SIZE * 2);
}
}
panic("Out of IRAM buffers\n");
@@ -246,7 +249,7 @@ static u32 alloc_iram_buf(void)
void free_iram_buf(u32 buf)
{
- int i = (buf - USB_IRAM_BASE_ADDR) / (IRAM_TD_SIZE * 2);
+ int i = (buf - g_iram_base) / (IRAM_TD_SIZE * 2);
g_alloc_map &= ~(1 << i);
}
@@ -270,7 +273,7 @@ static struct ehci_qtd *ehci_qtd_alloc(struct ehci_hcd *ehci, gfp_t flags)
if (use_iram_qtd) {
dma = usb_malloc(sizeof(struct ehci_qtd), flags);
if (dma != 0)
- qtd = (struct ehci_qtd *)IO_ADDRESS(dma);
+ qtd = (struct ehci_qtd *)(g_iram_addr + (dma - g_iram_base));
else
qtd = dma_pool_alloc(ehci->qtd_pool, flags, &dma);
}
@@ -291,8 +294,8 @@ static struct ehci_qtd *ehci_qtd_alloc(struct ehci_hcd *ehci, gfp_t flags)
static inline void ehci_qtd_free(struct ehci_hcd *ehci, struct ehci_qtd *qtd)
{
- if ((qtd->qtd_dma & (USB_IRAM_BASE_ADDR & 0xFFF00000)) ==
- (USB_IRAM_BASE_ADDR & 0xFFF00000))
+ if ((qtd->qtd_dma & (g_iram_base & 0xFFF00000)) ==
+ (g_iram_base & 0xFFF00000))
usb_free(qtd->qtd_dma);
else
dma_pool_free(ehci->qtd_pool, qtd, qtd->qtd_dma);
@@ -316,8 +319,8 @@ static void qh_destroy(struct ehci_qh *qh)
ehci->usb_address[i] = 0;
}
- if ((qh->qh_dma & (USB_IRAM_BASE_ADDR & 0xFFF00000)) ==
- (USB_IRAM_BASE_ADDR & 0xFFF00000))
+ if ((qh->qh_dma & (g_iram_base & 0xFFF00000)) ==
+ (g_iram_base & 0xFFF00000))
usb_free(qh->qh_dma);
else
dma_pool_free(ehci->qh_pool, qh, qh->qh_dma);
@@ -331,7 +334,7 @@ static struct ehci_qh *ehci_qh_alloc(struct ehci_hcd *ehci, gfp_t flags)
dma = usb_malloc(sizeof(struct ehci_qh), flags);
if (dma != 0)
- qh = (struct ehci_qh *)IO_ADDRESS(dma);
+ qh = (struct ehci_qh *)(g_iram_addr + (dma - g_iram_base));
else
qh = (struct ehci_qh *)
dma_pool_alloc(ehci->qh_pool, flags, &dma);
@@ -413,6 +416,9 @@ static void ehci_mem_cleanup(struct ehci_hcd *ehci)
if (ehci->iram_buffer[1])
free_iram_buf(ehci->iram_buffer[1]);
+ iounmap(g_iram_addr);
+ iram_free(g_iram_base, USB_IRAM_SIZE);
+
/* shadow periodic table */
kfree(ehci->pshadow);
ehci->pshadow = NULL;
@@ -433,14 +439,16 @@ static int ehci_mem_init(struct ehci_hcd *ehci, gfp_t flags)
else
use_iram_qtd = 1;
- usb_pool_initialize(USB_IRAM_BASE_ADDR + IRAM_TD_SIZE * IRAM_NTD * 2,
+ g_iram_addr = iram_alloc(USB_IRAM_SIZE, &g_iram_base);
+
+ usb_pool_initialize(g_iram_base + IRAM_TD_SIZE * IRAM_NTD * 2,
USB_IRAM_SIZE - IRAM_TD_SIZE * IRAM_NTD * 2, 32);
if (!ehci->iram_buffer[0]) {
ehci->iram_buffer[0] = alloc_iram_buf();
- ehci->iram_buffer_v[0] = IO_ADDRESS(ehci->iram_buffer[0]);
+ ehci->iram_buffer_v[0] = g_iram_addr + (ehci->iram_buffer[0] - g_iram_base);
ehci->iram_buffer[1] = alloc_iram_buf();
- ehci->iram_buffer_v[1] = IO_ADDRESS(ehci->iram_buffer[1]);
+ ehci->iram_buffer_v[1] = g_iram_addr + (ehci->iram_buffer[1] - g_iram_base);
}
/* QTDs for control/bulk/intr transfers */