aboutsummaryrefslogtreecommitdiff
path: root/drivers/staging/sep/sep_ext_with_pci_driver.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/staging/sep/sep_ext_with_pci_driver.c')
-rw-r--r--drivers/staging/sep/sep_ext_with_pci_driver.c180
1 files changed, 80 insertions, 100 deletions
diff --git a/drivers/staging/sep/sep_ext_with_pci_driver.c b/drivers/staging/sep/sep_ext_with_pci_driver.c
index bac0dd0af85..4840ed20eee 100644
--- a/drivers/staging/sep/sep_ext_with_pci_driver.c
+++ b/drivers/staging/sep/sep_ext_with_pci_driver.c
@@ -51,6 +51,7 @@
#include "sep_driver_config.h"
#include "sep_driver_api.h"
#include "sep_driver_ext_api.h"
+#include "sep_dev.h"
#if SEP_DRIVER_ARM_DEBUG_MODE
@@ -91,32 +92,10 @@ static unsigned long CRYS_SEP_ROM[] = {
irqreturn_t sep_inthandler(int irq , void* dev_id);
+/* Keep this a single static object for now to keep the conversion easy */
-/* io memory (register area) */
-static unsigned long io_memory_start_physical_address;
-static unsigned long io_memory_end_physical_address;
-static unsigned long io_memory_size;
-void *io_memory_start_virtual_address;
-
-/* restricted access region */
-static unsigned long rar_physical_address;
-static void *rar_virtual_address;
-
-/* shared memory region */
-static unsigned long shared_physical_address;
-static void *shared_virtual_address;
-
-/* firmware regions */
-static unsigned long cache_physical_address;
-static unsigned long cache_size;
-static void *cache_virtual_address;
-
-static unsigned long resident_physical_address;
-static unsigned long resident_size;
-static void *resident_virtual_address;
-
-/* device interrupt (as retrieved from PCI) */
-int sep_irq;
+static struct sep_device sep_instance;
+struct sep_device *sep_dev = &sep_instance;
/* temporary */
unsigned long jiffies_future;
@@ -138,7 +117,6 @@ static struct pci_device_id sep_pci_id_tbl[] = {
MODULE_DEVICE_TABLE(pci, sep_pci_id_tbl);
-static unsigned long rar_region_addr;
/* field for registering driver to PCI device */
@@ -148,8 +126,6 @@ static struct pci_driver sep_pci_driver = {
.probe = sep_probe
};
-/* pointer to pci dev received during probe */
-struct pci_dev *sep_pci_dev_ptr;
/*
This functions locks the area of the resisnd and cache sep code
@@ -193,18 +169,18 @@ int sep_copy_cache_resident_to_area(unsigned long src_cache_addr,
DEBUG_PRINT_1(SEP_DEBUG_LEVEL_EXTENDED,
"SEP Driver:rar_virtual is %p\n",
- rar_virtual_address);
+ sep_dev->rar_virtual_address);
DEBUG_PRINT_1(SEP_DEBUG_LEVEL_EXTENDED,
"SEP Driver:rar_physical is %08lx\n",
- rar_physical_address);
+ sep_dev->rar_physical_address);
- rar_region_addr = (unsigned long)rar_virtual_address;
+ sep_dev->rar_region_addr = (unsigned long)sep_dev->rar_virtual_address;
- cache_physical_address = rar_physical_address;
- cache_virtual_address = rar_virtual_address;
+ sep_dev->cache_physical_address = sep_dev->rar_physical_address;
+ sep_dev->cache_virtual_address = sep_dev->rar_virtual_address;
/* load cache */
- error = request_firmware(&fw, cache_name, &sep_pci_dev_ptr->dev);
+ error = request_firmware(&fw, cache_name, &sep_dev->sep_pci_dev_ptr->dev);
if (error) {
DEBUG_PRINT_0(SEP_DEBUG_LEVEL_EXTENDED,
"SEP Driver:cant request cache fw\n");
@@ -218,19 +194,21 @@ int sep_copy_cache_resident_to_area(unsigned long src_cache_addr,
"SEP Driver:cache data size is %08Zx\n",
fw->size);
- memcpy((void *)cache_virtual_address, (void *)fw->data, fw->size);
+ memcpy((void *)sep_dev->cache_virtual_address, (void *)fw->data, fw->size);
- cache_size = fw->size;
+ sep_dev->cache_size = fw->size;
- cache_addr = (unsigned long)cache_virtual_address;
+ cache_addr = (unsigned long)sep_dev->cache_virtual_address;
release_firmware(fw);
- resident_physical_address = cache_physical_address+cache_size;
- resident_virtual_address = cache_virtual_address+cache_size;
+ sep_dev->resident_physical_address = sep_dev->cache_physical_address
+ + sep_dev->cache_size;
+ sep_dev->resident_virtual_address = sep_dev->cache_virtual_address
+ + sep_dev->cache_size;
/* load resident */
- error = request_firmware(&fw, res_name, &sep_pci_dev_ptr->dev);
+ error = request_firmware(&fw, res_name, &sep_dev->sep_pci_dev_ptr->dev);
if (error) {
DEBUG_PRINT_0(SEP_DEBUG_LEVEL_EXTENDED,
"SEP Driver:cant request res fw\n");
@@ -244,20 +222,20 @@ int sep_copy_cache_resident_to_area(unsigned long src_cache_addr,
"SEP Driver:res data size is %08Zx\n",
fw->size);
- memcpy((void *)resident_virtual_address, (void *)fw->data, fw->size);
+ memcpy((void *)sep_dev->resident_virtual_address, (void *)fw->data, fw->size);
- resident_size = fw->size;
+ sep_dev->resident_size = fw->size;
release_firmware(fw);
- resident_addr = (unsigned long)resident_virtual_address;
+ resident_addr = (unsigned long)sep_dev->resident_virtual_address;
DEBUG_PRINT_1(SEP_DEBUG_LEVEL_EXTENDED,
"SEP Driver:resident_addr (physical )is %08lx\n",
- resident_physical_address);
+ sep_dev->resident_physical_address);
DEBUG_PRINT_1(SEP_DEBUG_LEVEL_EXTENDED,
"SEP Driver:cache_addr (physical) is %08lx\n",
- cache_physical_address);
+ sep_dev->cache_physical_address);
DEBUG_PRINT_1(SEP_DEBUG_LEVEL_EXTENDED,
"SEP Driver:resident_addr (logical )is %08lx\n",
@@ -267,15 +245,15 @@ int sep_copy_cache_resident_to_area(unsigned long src_cache_addr,
cache_addr);
DEBUG_PRINT_1(SEP_DEBUG_LEVEL_EXTENDED,
- "SEP Driver:resident_size is %08lx\n", resident_size);
+ "SEP Driver:resident_size is %08lx\n", sep_dev->resident_size);
DEBUG_PRINT_1(SEP_DEBUG_LEVEL_EXTENDED,
- "SEP Driver:cache_size is %08lx\n", cache_size);
+ "SEP Driver:cache_size is %08lx\n", sep_dev->cache_size);
/* physical addresses */
- *dst_new_cache_addr_ptr = cache_physical_address;
- *dst_new_resident_addr_ptr = resident_physical_address;
+ *dst_new_cache_addr_ptr = sep_dev->cache_physical_address;
+ *dst_new_resident_addr_ptr = sep_dev->resident_physical_address;
end_function:
@@ -297,23 +275,24 @@ int sep_map_and_alloc_shared_area(unsigned long shared_area_size,
unsigned long *phys_shared_area_addr_ptr)
{
// shared_virtual_address = ioremap_nocache(0xda00000,shared_area_size);
- shared_virtual_address = kmalloc(shared_area_size, GFP_KERNEL);
- if (!shared_virtual_address) {
+ sep_dev->shared_virtual_address = kmalloc(shared_area_size, GFP_KERNEL);
+ if (!sep_dev->shared_virtual_address) {
DEBUG_PRINT_0(SEP_DEBUG_LEVEL_EXTENDED,
"sep_driver:shared memory kmalloc failed\n");
return -1;
}
- shared_physical_address = __pa(shared_virtual_address);
+ /* FIXME */
+ sep_dev->shared_physical_address = __pa(sep_dev->shared_virtual_address);
// shared_physical_address = 0xda00000;
- *kernel_shared_area_addr_ptr = (unsigned long)shared_virtual_address;
+ *kernel_shared_area_addr_ptr = (unsigned long)sep_dev->shared_virtual_address;
/* set the physical address of the shared area */
- *phys_shared_area_addr_ptr = shared_physical_address;
+ *phys_shared_area_addr_ptr = sep_dev->shared_physical_address;
DEBUG_PRINT_1(SEP_DEBUG_LEVEL_EXTENDED,
"SEP Driver:shared_virtual_address is %p\n",
- shared_virtual_address);
+ sep_dev->shared_virtual_address);
DEBUG_PRINT_1(SEP_DEBUG_LEVEL_EXTENDED,
"SEP Driver:shared_region_size is %08lx\n",
shared_area_size);
@@ -353,11 +332,11 @@ unsigned long sep_shared_area_virt_to_phys(unsigned long virt_address)
virt_address);
DEBUG_PRINT_1(SEP_DEBUG_LEVEL_EXTENDED,
"SEP Driver:sh virt to phys p %08lx\n",
- shared_physical_address
- + (virt_address - (unsigned long)shared_virtual_address));
+ sep_dev->shared_physical_address
+ + (virt_address - (unsigned long)sep_dev->shared_virtual_address));
- return (unsigned long)shared_physical_address +
- (virt_address - (unsigned long)shared_virtual_address);
+ return (unsigned long)sep_dev->shared_physical_address +
+ (virt_address - (unsigned long)sep_dev->shared_virtual_address);
}
/*
@@ -368,8 +347,8 @@ unsigned long sep_shared_area_virt_to_phys(unsigned long virt_address)
*/
unsigned long sep_shared_area_phys_to_virt(unsigned long phys_address)
{
- return (unsigned long)shared_virtual_address
- + (phys_address - shared_physical_address);
+ return (unsigned long)sep_dev->shared_virtual_address
+ + (phys_address - sep_dev->shared_physical_address);
}
@@ -399,43 +378,43 @@ static int __devinit sep_probe(struct pci_dev *pdev,
}
/* set the pci dev pointer */
- sep_pci_dev_ptr = pdev;
+ sep_dev->sep_pci_dev_ptr = pdev;
/* get the io memory start address */
- io_memory_start_physical_address = pci_resource_start(pdev, 0);
- if (!io_memory_start_physical_address) {
+ sep_dev->io_memory_start_physical_address = pci_resource_start(pdev, 0);
+ if (!sep_dev->io_memory_start_physical_address) {
DEBUG_PRINT_0(SEP_DEBUG_LEVEL_EXTENDED,
"SEP Driver error pci resource start\n");
goto end_function;
}
/* get the io memory end address */
- io_memory_end_physical_address = pci_resource_end(pdev, 0);
- if (!io_memory_end_physical_address) {
+ sep_dev->io_memory_end_physical_address = pci_resource_end(pdev, 0);
+ if (!sep_dev->io_memory_end_physical_address) {
DEBUG_PRINT_0(SEP_DEBUG_LEVEL_EXTENDED,
"SEP Driver error pci resource end\n");
goto end_function;
}
- io_memory_size = io_memory_end_physical_address -
- io_memory_start_physical_address + 1;
+ sep_dev->io_memory_size = sep_dev->io_memory_end_physical_address -
+ sep_dev->io_memory_start_physical_address + 1;
DEBUG_PRINT_1(SEP_DEBUG_LEVEL_EXTENDED,
"SEP Driver:io_memory_start_physical_address is %08lx\n",
- io_memory_start_physical_address);
+ sep_dev->io_memory_start_physical_address);
DEBUG_PRINT_1(SEP_DEBUG_LEVEL_EXTENDED,
"SEP Driver:io_memory_end_phyaical_address is %08lx\n",
- io_memory_end_physical_address);
+ sep_dev->io_memory_end_physical_address);
DEBUG_PRINT_1(SEP_DEBUG_LEVEL_EXTENDED,
"SEP Driver:io_memory_size is %08lx\n",
- io_memory_size);
+ sep_dev->io_memory_size);
- io_memory_start_virtual_address =
- ioremap_nocache(io_memory_start_physical_address,
- io_memory_size);
- if (!io_memory_start_virtual_address) {
+ sep_dev->io_memory_start_virtual_address =
+ ioremap_nocache(sep_dev->io_memory_start_physical_address,
+ sep_dev->io_memory_size);
+ if (!sep_dev->io_memory_start_virtual_address) {
DEBUG_PRINT_0(SEP_DEBUG_LEVEL_EXTENDED,
"SEP Driver error ioremap of io memory\n");
goto end_function;
@@ -443,31 +422,31 @@ static int __devinit sep_probe(struct pci_dev *pdev,
DEBUG_PRINT_1(SEP_DEBUG_LEVEL_EXTENDED,
"SEP Driver:io_memory_start_virtual_address is %p\n",
- io_memory_start_virtual_address);
+ sep_dev->io_memory_start_virtual_address);
- g_sep_reg_base_address = (unsigned long)io_memory_start_virtual_address;
+ sep_dev->reg_base_address = (unsigned long)sep_dev->io_memory_start_virtual_address;
/* set up system base address and shared memory location */
- rar_virtual_address = kmalloc(2 * SEP_RAR_IO_MEM_REGION_SIZE,
+ sep_dev->rar_virtual_address = kmalloc(2 * SEP_RAR_IO_MEM_REGION_SIZE,
GFP_KERNEL);
- if (!rar_virtual_address) {
+ if (!sep_dev->rar_virtual_address) {
DEBUG_PRINT_0(SEP_DEBUG_LEVEL_EXTENDED,
"SEP Driver:cant kmalloc rar\n");
goto end_function;
}
-
- rar_physical_address = __pa(rar_virtual_address);
+ /* FIXME */
+ sep_dev->rar_physical_address = __pa(sep_dev->rar_virtual_address);
DEBUG_PRINT_1(SEP_DEBUG_LEVEL_EXTENDED,
"SEP Driver:rar_physical is %08lx\n",
- rar_physical_address);
+ sep_dev->rar_physical_address);
DEBUG_PRINT_1(SEP_DEBUG_LEVEL_EXTENDED,
"SEP Driver:rar_virtual is %p\n",
- rar_virtual_address);
+ sep_dev->rar_virtual_address);
#if !SEP_DRIVER_POLLING_MODE
@@ -476,15 +455,16 @@ static int __devinit sep_probe(struct pci_dev *pdev,
"SEP Driver: about to write IMR and ICR REG_ADDR\n");
/* clear ICR register */
- SEP_WRITE_REGISTER(g_sep_reg_base_address + HW_HOST_ICR_REG_ADDR,
+ SEP_WRITE_REGISTER(sep_dev->reg_base_address + HW_HOST_ICR_REG_ADDR,
0xFFFFFFFF);
/* set the IMR register - open only GPR 2 */
- SEP_WRITE_REGISTER(g_sep_reg_base_address + HW_HOST_IMR_REG_ADDR,
+ SEP_WRITE_REGISTER(sep_dev->reg_base_address + HW_HOST_IMR_REG_ADDR,
(~(0x1 << 13)));
/* figure out our irq */
- error = pci_read_config_byte(pdev, PCI_INTERRUPT_LINE, (u8 *)&sep_irq);
+ /* FIXME: */
+ error = pci_read_config_byte(pdev, PCI_INTERRUPT_LINE, (u8 *)&sep_dev->sep_irq);
DEBUG_PRINT_1(SEP_DEBUG_LEVEL_EXTENDED,
"SEP Driver: my irq is %d\n", sep_irq);
@@ -493,7 +473,7 @@ static int __devinit sep_probe(struct pci_dev *pdev,
"SEP Driver: about to call request_irq\n");
/* get the interrupt line */
error = request_irq(sep_irq, sep_inthandler, IRQF_SHARED,
- "sep_driver", &g_sep_reg_base_address);
+ "sep_driver", &sep_dev->reg_base_address);
if (error)
goto end_function;
@@ -502,7 +482,7 @@ static int __devinit sep_probe(struct pci_dev *pdev,
"SEP Driver: about to write IMR REG_ADDR");
/* set the IMR register - open only GPR 2 */
- SEP_WRITE_REGISTER(g_sep_reg_base_address + HW_HOST_IMR_REG_ADDR,
+ SEP_WRITE_REGISTER(sep_dev->reg_base_address + HW_HOST_IMR_REG_ADDR,
(~(0x1 << 13)));
#endif /* SEP_DRIVER_POLLING_MODE */
@@ -523,7 +503,7 @@ int sep_register_driver_to_device(void)
-void sep_load_rom_code()
+void sep_load_rom_code(void)
{
#if SEP_DRIVER_ARM_DEBUG_MODE
/* Index variables */
@@ -541,19 +521,19 @@ void sep_load_rom_code()
DEBUG_PRINT_1(SEP_DEBUG_LEVEL_EXTENDED,
"SEP Driver: k is %lu\n", k);
DEBUG_PRINT_1(SEP_DEBUG_LEVEL_EXTENDED,
- "SEP Driver: g_sep_reg_base_address is %p\n",
- g_sep_reg_base_address);
+ "SEP Driver: sep_dev->reg_base_address is %p\n",
+ sep_dev->reg_base_address);
DEBUG_PRINT_1(SEP_DEBUG_LEVEL_EXTENDED,
"SEP Driver: CRYS_SEP_ROM_start_address_offset is %p\n",
CRYS_SEP_ROM_start_address_offset);
for (i = 0; i < 4; i++) {
/* write bank */
- SEP_WRITE_REGISTER(g_sep_reg_base_address
+ SEP_WRITE_REGISTER(sep_dev->reg_base_address
+ SEP_ROM_BANK_register_offset, i);
for (j = 0; j < CRYS_SEP_ROM_length / 4; j++) {
- SEP_WRITE_REGISTER(g_sep_reg_base_address +
+ SEP_WRITE_REGISTER(sep_dev->reg_base_address +
CRYS_SEP_ROM_start_address_offset + 4*j,
CRYS_SEP_ROM[i * 0x1000 + j]);
@@ -567,12 +547,12 @@ void sep_load_rom_code()
}
/* reset the SEP*/
- SEP_WRITE_REGISTER(g_sep_reg_base_address
+ SEP_WRITE_REGISTER(sep_dev->reg_base_address
+ HW_HOST_SEP_SW_RST_REG_ADDR, 0x1);
/* poll for SEP ROM boot finish */
do {
- SEP_READ_REGISTER(g_sep_reg_base_address
+ SEP_READ_REGISTER(sep_dev->reg_base_address
+ HW_HOST_SEP_HOST_GPR3_REG_ADDR, regVal);
} while (!regVal);
@@ -582,21 +562,21 @@ void sep_load_rom_code()
switch (regVal) {
case 0x1:
/* fatal error - read erro status from GPRO */
- SEP_READ_REGISTER(g_sep_reg_base_address
+ SEP_READ_REGISTER(sep_dev->reg_base_address
+ HW_HOST_SEP_HOST_GPR0_REG_ADDR, Error);
DEBUG_PRINT_0(SEP_DEBUG_LEVEL_EXTENDED,
"SEP Driver: ROM polling case 1\n");
break;
case 0x2:
/* Boot First Phase ended */
- SEP_READ_REGISTER(g_sep_reg_base_address
+ SEP_READ_REGISTER(sep_dev->reg_base_address
+ HW_HOST_SEP_HOST_GPR0_REG_ADDR, warning);
DEBUG_PRINT_0(SEP_DEBUG_LEVEL_EXTENDED,
"SEP Driver: ROM polling case 2\n");
break;
case 0x4:
/* Cold boot ended successfully */
- SEP_READ_REGISTER(g_sep_reg_base_address
+ SEP_READ_REGISTER(sep_dev->reg_base_address
+ HW_HOST_SEP_HOST_GPR0_REG_ADDR, warning);
DEBUG_PRINT_0(SEP_DEBUG_LEVEL_EXTENDED,
"SEP Driver: ROM polling case 4\n");
@@ -604,7 +584,7 @@ void sep_load_rom_code()
break;
case 0x8:
/* Warmboot ended successfully */
- SEP_READ_REGISTER(g_sep_reg_base_address
+ SEP_READ_REGISTER(sep_dev->reg_base_address
+ HW_HOST_SEP_HOST_GPR0_REG_ADDR, warning);
DEBUG_PRINT_0(SEP_DEBUG_LEVEL_EXTENDED,
"SEP Driver: ROM polling case 8\n");
@@ -612,7 +592,7 @@ void sep_load_rom_code()
break;
case 0x10:
/* ColdWarm boot ended successfully */
- SEP_READ_REGISTER(g_sep_reg_base_address
+ SEP_READ_REGISTER(sep_dev->reg_base_address
+ HW_HOST_SEP_HOST_GPR0_REG_ADDR, warning);
DEBUG_PRINT_0(SEP_DEBUG_LEVEL_EXTENDED,
"SEP Driver: ROM polling case 16\n");