diff options
Diffstat (limited to 'drivers/staging/sep/sep_ext_with_pci_driver.c')
-rw-r--r-- | drivers/staging/sep/sep_ext_with_pci_driver.c | 180 |
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"); |