static int mb705_init_epld(void) { const unsigned short test_value = 0x1234u; unsigned short epld_reg; unsigned short epld_version, board_version; /* write (anything) to the test register */ epld_write(test_value, EPLD_TEST); /* verify we got back an inverted result */ epld_reg = epld_read(EPLD_TEST); if (epld_reg != (test_value ^ 0xffffu)) { printf("Failed EPLD test (offset=%02x, result=%04x)\n", EPLD_TEST, epld_reg); return 1; } /* Assume we can trust the version register */ epld_reg = epld_read(EPLD_IDENT); board_version = epld_reg >> 4 & 0xfu; epld_version = epld_reg & 0xfu; /* display the board revision, and EPLD version */ printf("MB705: revision %c, EPLD version %02d\n", board_version + 'A' - 1, epld_version); /* return a "success" result */ return 0; }
void flashWriteEnable(void) { #if defined(CONFIG_SH_MB705) unsigned short epld_reg; /* Enable Vpp for writing to flash */ epld_reg = epld_read(EPLD_MISC); epld_reg |= 1u << 3; /* NandFlashWP = MISC[3] = 1 */ epld_reg |= 1u << 2; /* NorFlashVpp = MISC[2] = 1 */ epld_write(epld_reg, EPLD_MISC); #endif /* CONFIG_SH_MB705 */ }
void flashWriteDisable(void) { #if defined(CONFIG_ST40_MB705) unsigned short epld_reg; /* Disable Vpp for writing to flash */ epld_reg = epld_read(EPLD_MISC); epld_reg &= ~(1u << 3); /* NandFlashWP = MISC[3] = 0 */ epld_reg &= ~(1u << 2); /* NorFlashVpp = MISC[2] = 0 */ epld_write(epld_reg, EPLD_MISC); #endif /* CONFIG_ST40_MB705 */ }
static void mb628_led_set(struct led_classdev *led_cdev, enum led_brightness brightness) { u8 reg; /* Locking required here */ reg = epld_read(EPLD_ENABLE); if (brightness) reg |= EPLD_ENABLE_HBEAT; else reg &= ~EPLD_ENABLE_HBEAT; epld_write(reg, EPLD_ENABLE); }
static void __init mb618_init_irq(void) { unsigned char epld_reg; const int test_offset = 4; const int version_offset = 0; int version; epld_early_init(&epld_device); epld_write(0, 0); /* bank = Test */ epld_write(0x63, test_offset); epld_reg = epld_read(test_offset); if (epld_reg != (unsigned char)(~0x63)) { printk(KERN_WARNING "Failed mb618 EPLD test (off %02x, res %02x)\n", test_offset, epld_reg); return; } version = epld_read(version_offset) & 0x1f; printk(KERN_INFO "mb618 EPLD version %02d\n", version); /* * We have the nice new shiny interrupt system at last. * For the moment just replicate the functionality to * route the STEM interrupt through. */ /* Route STEM Int0 (EPLD int 4) to output 2 */ epld_write(3, 0); /* bank = IntPri1 */ epld_reg = epld_read(4); epld_reg &= 0xfc; epld_reg |= 2; epld_write(epld_reg, 4); /* Enable it */ epld_write(1<<4, 8); }
extern int checkboard (void) { unsigned version; printf ("\n\nBoard: STx7141-Mboard (MB628)" #ifdef CONFIG_SH_SE_MODE " [32-bit mode]" #else " [29-bit mode]" #endif "\n"); version = epld_read(EPLD_IDENT); printf("mb628 EPLD version %02d\n", version); return 0; }
static void fpbutton_timer_callback(unsigned long data) { struct platform_device *pdev = (struct platform_device *)data; struct input_dev *input = platform_get_drvdata(pdev); int mask = platform_get_irq_byname(pdev, "mask"); u16 status = epld_read(EPLD_EMI_INT_STATUS); if (status & mask) { mod_timer(&fpbutton_timer, jiffies + msecs_to_jiffies(SCAN_INTERVAL)); } else { input_event(input, EV_KEY, BTN_0, 0); input_sync(input); enable_irq(platform_get_irq(pdev, 0)); } }
static void disable_harp_irq(unsigned int irq) { unsigned maskReg; unsigned mask; int pri; if (irq < 0 || irq >= NUM_EXTERNAL_IRQS) return; pri = 15 - irq; if (pri < 8) { maskReg = EPLD_INTMASK0CLR; } else { maskReg = EPLD_INTMASK1CLR; pri -= 8; } mask = 1 << pri; epld_write(mask, maskReg); /* Read back the value we just wrote to flush any write posting */ epld_read(maskReg); }