X-Git-Url: http://git.rot13.org/?p=bcm963xx.git;a=blobdiff_plain;f=bcmdrivers%2Fopensource%2Fchar%2Fboard%2Fbcm963xx%2Fimpl1%2Fboard.c;h=36290ad2cf92547943fdcd91297fc044a9b6561a;hp=58df4c71378d6700b76ca9c68b93fb672edfc86f;hb=6adeba4d92a546ebbadde2562283ee6b984b22c1;hpb=dacd86d83a9fb430cca42cb78a67f9d46e289f5c diff --git a/bcmdrivers/opensource/char/board/bcm963xx/impl1/board.c b/bcmdrivers/opensource/char/board/bcm963xx/impl1/board.c index 58df4c71..36290ad2 100755 --- a/bcmdrivers/opensource/char/board/bcm963xx/impl1/board.c +++ b/bcmdrivers/opensource/char/board/bcm963xx/impl1/board.c @@ -23,11 +23,9 @@ * for the board related ioctl calls: flash, get free kernel * page and dump kernel memory, etc. * - * Created on : 2/20/2002 seanl: use cfiflash.c, cfliflash.h (AMD specific) * ***************************************************************************/ - /* Includes. */ #include #include @@ -100,15 +98,16 @@ typedef struct _CB_DGASP__LIST static LED_MAP_PAIR LedMapping[] = { // led name Initial state physical pin (ledMask) - {kLedEnd, kLedStateOff, 0, 0, 0, 0}, - {kLedEnd, kLedStateOff, 0, 0, 0, 0}, - {kLedEnd, kLedStateOff, 0, 0, 0, 0}, - {kLedEnd, kLedStateOff, 0, 0, 0, 0}, - {kLedEnd, kLedStateOff, 0, 0, 0, 0}, - {kLedEnd, kLedStateOff, 0, 0, 0, 0}, - {kLedEnd, kLedStateOff, 0, 0, 0, 0}, - {kLedEnd, kLedStateOff, 0, 0, 0, 0}, - {kLedEnd, kLedStateOff, 0, 0, 0, 0} // NOTE: kLedEnd has to be at the end. + {kLedEnd, kLedStateOff, 0, 0, 0, 0, 0, 0}, + {kLedEnd, kLedStateOff, 0, 0, 0, 0, 0, 0}, + {kLedEnd, kLedStateOff, 0, 0, 0, 0, 0, 0}, + {kLedEnd, kLedStateOff, 0, 0, 0, 0, 0, 0}, + {kLedEnd, kLedStateOff, 0, 0, 0, 0, 0, 0}, + {kLedEnd, kLedStateOff, 0, 0, 0, 0, 0, 0}, + {kLedEnd, kLedStateOff, 0, 0, 0, 0, 0, 0}, + {kLedEnd, kLedStateOff, 0, 0, 0, 0, 0, 0}, + {kLedEnd, kLedStateOff, 0, 0, 0, 0, 0, 0}, + {kLedEnd, kLedStateOff, 0, 0, 0, 0, 0, 0} // NOTE: kLedEnd has to be at the end. }; /* Externs. */ @@ -147,6 +146,9 @@ static void __init kerSysInitDyingGaspHandler( void ); static void __exit kerSysDeinitDyingGaspHandler( void ); /* -DyingGasp function prototype - */ +static int ConfigCs(BOARD_IOCTL_PARMS *parms); +static void SetPll(int pll_mask, int pll_value); +static void SetGpio(int gpio, GPIO_STATE_t state); #if defined (WIRELESS) static irqreturn_t sesBtn_isr(int irq, void *dev_id, struct pt_regs *ptregs); @@ -160,6 +162,8 @@ static void __init ses_board_init(void); static void __exit ses_board_deinit(void); #endif +static irqreturn_t reset_isr(int irq, void *dev_id, struct pt_regs *ptregs); + static PNVRAM_INFO g_pNvramInfo = NULL; static int g_ledInitialized = 0; static wait_queue_head_t g_board_wait_queue; @@ -225,6 +229,7 @@ static int __init brcm_board_init( void ) {kLedEnd, NULL, NULL} }; + unsigned short pah_irq; int ret; ret = register_chrdev(BOARD_DRV_MAJOR, "bcrmboard", &board_fops ); @@ -235,6 +240,7 @@ static int __init brcm_board_init( void ) PLED_MAP_PAIR pLedMap = LedMapping; unsigned short gpio; struct BpLedInformation *pInfo; + ETHERNET_MAC_INFO EnetInfo; printk("brcmboard: brcm_board_init entry\n"); board_major = BOARD_DRV_MAJOR; @@ -242,21 +248,39 @@ static int __init brcm_board_init( void ) for( pInfo = bpLedInfo; pInfo->ledName != kLedEnd; pInfo++ ) { - if( pInfo->bpFunc && (*pInfo->bpFunc) (&gpio) == BP_SUCCESS ) + if( pInfo->bpFunc && (*pInfo->bpFunc) (&gpio) == BP_SUCCESS && + gpio != BP_HW_DEFINED_AH && gpio != BP_HW_DEFINED_AL ) { pLedMap->ledName = pInfo->ledName; pLedMap->ledMask = GPIO_NUM_TO_MASK(gpio); pLedMap->ledActiveLow = (gpio & BP_ACTIVE_LOW) ? 1 : 0; + pLedMap->ledSerial = (gpio & BP_GPIO_SERIAL) ? 1 : 0; } - if( pInfo->bpFuncFail && (*pInfo->bpFuncFail) (&gpio) == BP_SUCCESS ) + if( pInfo->bpFuncFail && (*pInfo->bpFuncFail)(&gpio)==BP_SUCCESS && + gpio != BP_HW_DEFINED_AH && gpio != BP_HW_DEFINED_AL ) { pLedMap->ledName = pInfo->ledName; pLedMap->ledMaskFail = GPIO_NUM_TO_MASK(gpio); pLedMap->ledActiveLowFail = (gpio & BP_ACTIVE_LOW) ? 1 : 0; + pLedMap->ledSerialFail = (gpio & BP_GPIO_SERIAL) ? 1 : 0; } if( pLedMap->ledName != kLedEnd ) pLedMap++; } + + if( BpGetEthernetMacInfo( &EnetInfo, 1 ) == BP_SUCCESS ) + { + if( EnetInfo.usGpioPhyLinkSpeed != BP_NOT_DEFINED ) + { + /* The internal Ethernet PHY has a GPIO for 10/100 link speed. */ + gpio = EnetInfo.usGpioPhyLinkSpeed; + pLedMap->ledName = kLedEphyLinkSpeed; + pLedMap->ledMask = GPIO_NUM_TO_MASK(gpio); + pLedMap->ledActiveLow = (gpio & BP_ACTIVE_LOW) ? 1 : 0; + pLedMap->ledSerial = (gpio & BP_GPIO_SERIAL) ? 1 : 0; + pLedMap++; + } + } init_waitqueue_head(&g_board_wait_queue); #if defined (WIRELESS) @@ -267,6 +291,13 @@ static int __init brcm_board_init( void ) boardLedInit(LedMapping); g_ledInitialized = 1; + + if( BpGetPressAndHoldResetExtIntr(&pah_irq) == BP_SUCCESS ) + { + pah_irq += INTERRUPT_ID_EXTERNAL_0; + BcmHalMapInterrupt((FN_HANDLER)reset_isr, 0, pah_irq); + BcmHalInterruptEnable(pah_irq); + } } return ret; @@ -590,6 +621,27 @@ int kerSysReleaseMacAddress( unsigned char *pucaMacAddr ) return( nRet ); } /* kerSysReleaseMacAddr */ +// USR9109/91113 +void kerSysSetMacAddress(unsigned char *pucaMacAddr) +{ + UINT32 crc = CRC32_INIT_VALUE; + NVRAM_DATA NvramData; + volatile unsigned char *mac; + + memcpy((char *)&NvramData, (char *)get_nvram_start_addr(), sizeof(NVRAM_DATA)); + + mac = (unsigned char*)NvramData.ucaBaseMacAddr; + printk("Original ucaBaseMacAddr: %02X %02X %02X %02X %02X %02X\r\n", mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]); + + memcpy(NvramData.ucaBaseMacAddr, pucaMacAddr, NVRAM_MAC_ADDRESS_LEN); + printk("New Mac: %02X %02X %02X %02X %02X %02X\r\n",mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]); + + NvramData.ulCheckSum = 0; + NvramData.ulCheckSum = getCrc32((char *)&NvramData, (UINT32) sizeof(NVRAM_DATA), crc); + kerSysNvRamSet((char *)&NvramData, sizeof(NVRAM_DATA), NVRAM_VERSION_NUMBER_ADDRESS); + +} /* kerSysSetMacAddr */ + int kerSysGetSdramSize( void ) { return( (int) g_pNvramInfo->ulSdramSize ); @@ -783,14 +835,6 @@ static int flashFsKernelImage( int destAddr, unsigned char *imagePtr, return -1; } - if( getTagFromPartition(1) != NULL && getTagFromPartition(2) != NULL && - newImgSize > availableSizeTwoImgs ) - { - printk("Illegal image size %d. Image size must not be greater " - "than %d.\n", newImgSize, availableSizeTwoImgs); - return -1; - } - // If the current image fits in half the flash space and the new // image to flash also fits in half the flash space, then flash it // in the partition that is not currently being used to boot from. @@ -861,7 +905,6 @@ static int board_ioctl( struct inode *inode, struct file *flip, // not used for now. kerSysBcmImageInit(); break; - case BOARD_IOCTL_FLASH_WRITE: if (copy_from_user((void*)&ctrlParms, (void*)arg, sizeof(ctrlParms)) == 0) { @@ -871,7 +914,10 @@ static int board_ioctl( struct inode *inode, struct file *flip, switch (ctrlParms.action) { case SCRATCH_PAD: - ret = kerSysScratchPadSet(ctrlParms.string, ctrlParms.buf, ctrlParms.offset); + if (ctrlParms.offset == -1) + ret = kerSysScratchPadClearAll(); + else + ret = kerSysScratchPadSet(ctrlParms.string, ctrlParms.buf, ctrlParms.offset); break; case PERSISTENT: @@ -896,6 +942,8 @@ static int board_ioctl( struct inode *inode, struct file *flip, // set memory type field BpGetSdramSize( (unsigned long *) &ctrlParms.string[SDRAM_TYPE_ADDRESS_OFFSET] ); + // set thread number field + BpGetCMTThread( (unsigned long *) &ctrlParms.string[THREAD_NUM_ADDRESS_OFFSET] ); ret = kerSysBcmImageSet(ctrlParms.offset + BOOT_OFFSET, ctrlParms.string, ctrlParms.strLen); @@ -928,6 +976,9 @@ static int board_ioctl( struct inode *inode, struct file *flip, // save NVRAM data into a local structure memcpy( &SaveNvramData, pNvramData, sizeof(NVRAM_DATA) ); + if (ctrlParms.offset == 0) { + ctrlParms.offset = FLASH_BASE; + } ret = kerSysBcmImageSet(ctrlParms.offset, ctrlParms.string, ctrlParms.strLen); // if nvram is not valid, restore the current nvram settings @@ -1126,7 +1177,7 @@ static int board_ioctl( struct inode *inode, struct file *flip, else ret = -EFAULT; break; - + case BOARD_IOCTL_GET_CHIP_ID: ctrlParms.result = (int) (PERF->RevID & 0xFFFF0000) >> 16; __copy_to_user((BOARD_IOCTL_PARMS*)arg, &ctrlParms, sizeof(BOARD_IOCTL_PARMS)); @@ -1336,6 +1387,50 @@ static int board_ioctl( struct inode *inode, struct file *flip, kerSysWakeupMonitorTask(); break; + case BOARD_IOCTL_GET_VCOPE_GPIO: + if (copy_from_user((void*)&ctrlParms, (void*)arg, sizeof(ctrlParms)) == 0) { + ret = ((ctrlParms.result = BpGetVcopeGpio(ctrlParms.offset)) != BP_NOT_DEFINED) ? 0 : -EFAULT; + __copy_to_user((BOARD_IOCTL_PARMS*)arg, &ctrlParms, sizeof(BOARD_IOCTL_PARMS)); + } + else { + ret = -EFAULT; + ctrlParms.result = BP_NOT_DEFINED; + } + + break; + + case BOARD_IOCTL_SET_CS_PAR: + if (copy_from_user((void*)&ctrlParms, (void*)arg, sizeof(ctrlParms)) == 0) { + ret = ConfigCs(&ctrlParms); + __copy_to_user((BOARD_IOCTL_PARMS*)arg, &ctrlParms, sizeof(BOARD_IOCTL_PARMS)); + } + else { + ret = -EFAULT; + } + break; + + case BOARD_IOCTL_SET_PLL: + if (copy_from_user((void*)&ctrlParms, (void*)arg, sizeof(ctrlParms)) == 0) { + SetPll(ctrlParms.strLen, ctrlParms.offset); + __copy_to_user((BOARD_IOCTL_PARMS*)arg, &ctrlParms, sizeof(BOARD_IOCTL_PARMS)); + ret = 0; + } + else { + ret = -EFAULT; + } + break; + + case BOARD_IOCTL_SET_GPIO: + if (copy_from_user((void*)&ctrlParms, (void*)arg, sizeof(ctrlParms)) == 0) { + SetGpio(ctrlParms.strLen, ctrlParms.offset); + __copy_to_user((BOARD_IOCTL_PARMS*)arg, &ctrlParms, sizeof(BOARD_IOCTL_PARMS)); + ret = 0; + } + else { + ret = -EFAULT; + } + break; + default: ret = -EINVAL; ctrlParms.result = 0; @@ -1354,26 +1449,18 @@ static int board_ioctl( struct inode *inode, struct file *flip, #if defined (WIRELESS) static irqreturn_t sesBtn_isr(int irq, void *dev_id, struct pt_regs *ptregs) { -#if defined(_BCM96338_) || defined(CONFIG_BCM96338) unsigned long gpio_mask = GPIO_NUM_TO_MASK(sesBtn_gpio); - volatile unsigned long *gpio_reg = &GPIO->GPIOio; -#endif -#if defined(_BCM96345_) || defined(CONFIG_BCM96345) - unsigned short gpio_mask = GPIO_NUM_TO_MASK(sesBtn_gpio); - volatile unsigned short *gpio_reg = &GPIO->GPIOio; -#endif -#if defined(_BCM96348_) || defined (CONFIG_BCM96348) - unsigned long gpio_mask = GPIO_NUM_TO_MASK(sesBtn_gpio); - volatile unsigned long *gpio_reg = &GPIO->GPIOio; + volatile unsigned long *gpio_io_reg = &GPIO->GPIOio; - if( (sesBtn_gpio & ~BP_ACTIVE_MASK) >= 32 ) +#if !defined(CONFIG_BCM96338) + if( (sesBtn_gpio & BP_GPIO_NUM_MASK) >= 32 ) { gpio_mask = GPIO_NUM_TO_MASK_HIGH(sesBtn_gpio); - gpio_reg = &GPIO->GPIOio_high; + gpio_io_reg = &GPIO->GPIOio_high; } #endif - if (!(*gpio_reg & gpio_mask)){ + if (!(*gpio_io_reg & gpio_mask)){ wake_up_interruptible(&g_board_wait_queue); return IRQ_RETVAL(1); } else { @@ -1409,27 +1496,19 @@ static void __init sesBtn_mapIntr(int context) static unsigned int sesBtn_poll(struct file *file, struct poll_table_struct *wait) { -#if defined(_BCM96338_) || defined(CONFIG_BCM96338) - unsigned long gpio_mask = GPIO_NUM_TO_MASK(sesBtn_gpio); - volatile unsigned long *gpio_reg = &GPIO->GPIOio; -#endif -#if defined(_BCM96345_) || defined(CONFIG_BCM96345) - unsigned short gpio_mask = GPIO_NUM_TO_MASK(sesBtn_gpio); - volatile unsigned short *gpio_reg = &GPIO->GPIOio; -#endif -#if defined(_BCM96348_) || defined (CONFIG_BCM96348) unsigned long gpio_mask = GPIO_NUM_TO_MASK(sesBtn_gpio); - volatile unsigned long *gpio_reg = &GPIO->GPIOio; + volatile unsigned long *gpio_io_reg = &GPIO->GPIOio; - if( (sesBtn_gpio & ~BP_ACTIVE_MASK) >= 32 ) +#if !defined(CONFIG_BCM96338) + if( (sesBtn_gpio & BP_GPIO_NUM_MASK) >= 32 ) { gpio_mask = GPIO_NUM_TO_MASK_HIGH(sesBtn_gpio); - gpio_reg = &GPIO->GPIOio_high; + gpio_io_reg = &GPIO->GPIOio_high; } #endif - if (!(*gpio_reg & gpio_mask)){ - return POLLIN; + if (!(*gpio_io_reg & gpio_mask)){ + return POLLIN; } return 0; } @@ -1439,28 +1518,20 @@ static ssize_t sesBtn_read(struct file *file, char __user *buffer, size_t count volatile unsigned int event=0; ssize_t ret=0; -#if defined(_BCM96338_) || defined (CONFIG_BCM96338) - unsigned long gpio_mask = GPIO_NUM_TO_MASK(sesBtn_gpio); - volatile unsigned long *gpio_reg = &GPIO->GPIOio; -#endif -#if defined(_BCM96345_) || defined (CONFIG_BCM96345) - unsigned short gpio_mask = GPIO_NUM_TO_MASK(sesBtn_gpio); - volatile unsigned short *gpio_reg = &GPIO->GPIOio; -#endif -#if defined(_BCM96348_) || defined (CONFIG_BCM96348) unsigned long gpio_mask = GPIO_NUM_TO_MASK(sesBtn_gpio); - volatile unsigned long *gpio_reg = &GPIO->GPIOio; + volatile unsigned long *gpio_io_reg = &GPIO->GPIOio; - if( (sesBtn_gpio & ~BP_ACTIVE_MASK) >= 32 ) +#if !defined (CONFIG_BCM96338) + if( (sesBtn_gpio & BP_GPIO_NUM_MASK) >= 32 ) { gpio_mask = GPIO_NUM_TO_MASK_HIGH(sesBtn_gpio); - gpio_reg = &GPIO->GPIOio_high; + gpio_io_reg = &GPIO->GPIOio_high; } #endif - if(*gpio_reg & gpio_mask){ + if(*gpio_io_reg & gpio_mask){ BcmHalInterruptEnable(sesBtn_irq); - return ret; + return ret; } event = SES_EVENTS; __copy_to_user((char*)buffer, (char*)&event, sizeof(event)); @@ -1532,14 +1603,14 @@ static void __exit ses_board_deinit() ***************************************************************************/ #define KERSYS_DBG printk -#if defined(CONFIG_BCM96345) -#define CYCLE_PER_US 70 -#elif defined(CONFIG_BCM96348) || defined(CONFIG_BCM96338) +#if defined(CONFIG_BCM96348) || defined(CONFIG_BCM96338) /* The BCM6348 cycles per microsecond is really variable since the BCM6348 * MIPS speed can vary depending on the PLL settings. However, an appoximate * value of 120 will still work OK for the test being done. */ #define CYCLE_PER_US 120 +#elif defined(CONFIG_BCM96358) +#define CYCLE_PER_US 150 #endif #define DG_GLITCH_TO (100*CYCLE_PER_US) @@ -1547,19 +1618,10 @@ static void __init kerSysDyingGaspMapIntr() { unsigned long ulIntr; -#if defined(CONFIG_BCM96348) || defined(_BCM96348_) || defined(CONFIG_BCM96338) || defined(_BCM96338_) if( BpGetAdslDyingGaspExtIntr( &ulIntr ) == BP_SUCCESS ) { BcmHalMapInterrupt((FN_HANDLER)kerSysDyingGaspIsr, 0, INTERRUPT_ID_DG); BcmHalInterruptEnable( INTERRUPT_ID_DG ); } -#elif defined(CONFIG_BCM96345) || defined(_BCM96345_) - if( BpGetAdslDyingGaspExtIntr( &ulIntr ) == BP_SUCCESS ) { - ulIntr += INTERRUPT_ID_EXTERNAL_0; - BcmHalMapInterrupt((FN_HANDLER)kerSysDyingGaspIsr, 0, ulIntr); - BcmHalInterruptEnable( ulIntr ); - } -#endif - } void kerSysSetWdTimer(ulong timeUs) @@ -1592,24 +1654,6 @@ static Bool kerSysDyingGaspCheckPowerLoss(void) UART->Data = '%'; UART->Data = 'G'; -#if defined(CONFIG_BCM96345) - BpGetAdslDyingGaspExtIntr( &ulIntr ); - - do { - ulong clk1; - - clk1 = kerSysGetCycleCount(); /* time cleared */ - /* wait a little to get new reading */ - while ((kerSysGetCycleCount()-clk1) < CYCLE_PER_US*2) - ; - } while ((0 == (PERF->ExtIrqCfg & (1 << (ulIntr + EI_STATUS_SHFT)))) && ((kerSysGetCycleCount() - clk0) < DG_GLITCH_TO)); - - if (PERF->ExtIrqCfg & (1 << (ulIntr + EI_STATUS_SHFT))) { /* power glitch */ - BcmHalInterruptEnable( ulIntr + INTERRUPT_ID_EXTERNAL_0); - KERSYS_DBG(" - Power glitch detected. Duration: %ld us\n", (kerSysGetCycleCount() - clk0)/CYCLE_PER_US); - return 0; - } -#elif (defined(CONFIG_BCM96348) || defined(CONFIG_BCM96338)) && !defined(VXWORKS) do { ulong clk1; @@ -1624,17 +1668,17 @@ static Bool kerSysDyingGaspCheckPowerLoss(void) KERSYS_DBG(" - Power glitch detected. Duration: %ld us\n", (kerSysGetCycleCount() - clk0)/CYCLE_PER_US); return 0; } -#endif + return 1; } static void kerSysDyingGaspShutdown( void ) { kerSysSetWdTimer(1000000); -#if defined(CONFIG_BCM96345) - PERF->blkEnables &= ~(EMAC_CLK_EN | USB_CLK_EN | CPU_CLK_EN); -#elif defined(CONFIG_BCM96348) +#if defined(CONFIG_BCM96348) PERF->blkEnables &= ~(EMAC_CLK_EN | USBS_CLK_EN | USBH_CLK_EN | SAR_CLK_EN); +#elif defined(CONFIG_BCM96358) + PERF->blkEnables &= ~(EMAC_CLK_EN | USBS_CLK_EN | SAR_CLK_EN); #endif } @@ -1645,7 +1689,7 @@ static unsigned int kerSysDyingGaspIsr(void) #endif { struct list_head *pos; - CB_DGASP_LIST *tmp, *dsl = NULL; + CB_DGASP_LIST *tmp = NULL, *dsl = NULL; if (kerSysDyingGaspCheckPowerLoss()) { @@ -1665,6 +1709,11 @@ static unsigned int kerSysDyingGaspIsr(void) /* reset and shutdown system */ kerSysDyingGaspShutdown(); + + // If power is going down, nothing should continue! + + while (1) + ; } #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)) return( IRQ_HANDLED ); @@ -1763,6 +1812,80 @@ void kerSysDeregisterDyingGaspHandler(char *devname) } /* kerSysDeregisterDyingGaspHandler */ +static int ConfigCs (BOARD_IOCTL_PARMS *parms) +{ + int retv = 0; +#if !defined(CONFIG_BCM96338) + int cs, flags; + cs_config_pars_t info; + + if (copy_from_user(&info, (void*)parms->buf, sizeof(cs_config_pars_t)) == 0) + { + cs = parms->offset; + + MPI->cs[cs].base = ((info.base & 0x1FFFE000) | (info.size >> 13)); + + if ( info.mode == EBI_TS_TA_MODE ) // syncronious mode + flags = (EBI_TS_TA_MODE | EBI_ENABLE); + else + { + flags = ( EBI_ENABLE | \ + (EBI_WAIT_STATES & (info.wait_state << EBI_WTST_SHIFT )) | \ + (EBI_SETUP_STATES & (info.setup_time << EBI_SETUP_SHIFT)) | \ + (EBI_HOLD_STATES & (info.hold_time << EBI_HOLD_SHIFT )) ); + } + MPI->cs[cs].config = flags; + parms->result = BP_SUCCESS; + retv = 0; + } + else + { + retv -= EFAULT; + parms->result = BP_NOT_DEFINED; + } +#endif + return( retv ); +} + +static void SetPll (int pll_mask, int pll_value) +{ + PERF->pll_control &= ~pll_mask; // clear relevant bits + PERF->pll_control |= pll_value; // and set desired value +} + +static void SetGpio(int gpio, GPIO_STATE_t state) +{ + unsigned long gpio_mask = GPIO_NUM_TO_MASK(gpio); + volatile unsigned long *gpio_io_reg = &GPIO->GPIOio; + volatile unsigned long *gpio_dir_reg = &GPIO->GPIODir; + +#if !defined (CONFIG_BCM96338) + if( gpio >= 32 ) + { + gpio_mask = GPIO_NUM_TO_MASK_HIGH(gpio); + gpio_io_reg = &GPIO->GPIOio_high; + gpio_dir_reg = &GPIO->GPIODir_high; + } +#endif + + *gpio_dir_reg |= gpio_mask; + + if(state == GPIO_HIGH) + *gpio_io_reg |= gpio_mask; + else + *gpio_io_reg &= ~gpio_mask; +} + + +static irqreturn_t reset_isr(int irq, void *dev_id, struct pt_regs *ptregs) +{ + printk("\n*** Restore to Factory Default Setting ***\n\n"); + kerSysPersistentSet( "Reset Persistent", strlen("Reset Persistent"), 0 ); + kerSysMipsSoftReset(); + return 0; +} + + /*************************************************************************** * MACRO to call driver initialization and cleanup functions. ***************************************************************************/ @@ -1772,6 +1895,7 @@ module_exit( brcm_board_cleanup ); EXPORT_SYMBOL(kerSysNvRamGet); EXPORT_SYMBOL(dumpaddr); EXPORT_SYMBOL(kerSysGetMacAddress); +EXPORT_SYMBOL(kerSysSetMacAddress); // USR9109/9113 EXPORT_SYMBOL(kerSysReleaseMacAddress); EXPORT_SYMBOL(kerSysGetSdramSize); EXPORT_SYMBOL(kerSysLedCtrl); @@ -1784,7 +1908,6 @@ EXPORT_SYMBOL(BpGetRj11InnerOuterPairGpios); EXPORT_SYMBOL(BpGetPressAndHoldResetGpio); EXPORT_SYMBOL(BpGetVoipResetGpio); EXPORT_SYMBOL(BpGetVoipIntrGpio); -EXPORT_SYMBOL(BpGetPcmciaResetGpio); EXPORT_SYMBOL(BpGetRtsCtsUartGpios); EXPORT_SYMBOL(BpGetAdslLedGpio); EXPORT_SYMBOL(BpGetAdslFailLedGpio); @@ -1795,7 +1918,6 @@ EXPORT_SYMBOL(BpGetWanDataLedGpio); EXPORT_SYMBOL(BpGetPppLedGpio); EXPORT_SYMBOL(BpGetPppFailLedGpio); EXPORT_SYMBOL(BpGetVoipLedGpio); -EXPORT_SYMBOL(BpGetWirelessExtIntr); EXPORT_SYMBOL(BpGetAdslDyingGaspExtIntr); EXPORT_SYMBOL(BpGetVoipExtIntr); EXPORT_SYMBOL(BpGetHpnaExtIntr); @@ -1804,9 +1926,11 @@ EXPORT_SYMBOL(BpGetVoipChipSelect); EXPORT_SYMBOL(BpGetWirelessSesBtnGpio); EXPORT_SYMBOL(BpGetWirelessSesExtIntr); EXPORT_SYMBOL(BpGetWirelessSesLedGpio); +EXPORT_SYMBOL(BpGetWirelessFlags); EXPORT_SYMBOL(kerSysRegisterDyingGaspHandler); EXPORT_SYMBOL(kerSysDeregisterDyingGaspHandler); EXPORT_SYMBOL(kerSysGetCycleCount); EXPORT_SYMBOL(kerSysSetWdTimer); EXPORT_SYMBOL(kerSysWakeupMonitorTask); +EXPORT_SYMBOL(BpUpdateWirelessSromMap);