static int mb618_phy_reset(void *bus)
{
	epld_write(1, 0);	/* bank = Ctrl */

	/* Bring the PHY out of reset in MII mode */
	epld_write(0x4 | 0, 4);
	epld_write(0x4 | 1, 4);

	return 1;
}
Example #2
0
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;
}
Example #3
0
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 */
}
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 */
}
Example #5
0
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);
}
static ssize_t store_udef(struct device *dev,
			  struct device_attribute *attr, const char *buf,
			  size_t count)
{
	struct display_data *dd = dev_get_drvdata(dev);
	int code = attr - dev_attr_udef;
	int display;

	spin_lock(&dd->lock);

	for (display=0; display < 2; display++) {
		int base = (display == 0) ? EPLD_TS_DISPLAY0_BASE : EPLD_TS_DISPLAY1_BASE;
		int i;

		epld_write(code, base + UDC_ADDRESS_OFF);
		for (i=0; (i < 7) && (i < count); i++)
			epld_write(buf[i], base + UDC_RAM_OFF + (i << 1));
	}

	spin_unlock(&dd->lock);

	return count;
}
static ssize_t store_text(struct device *dev,
			  struct device_attribute *attr, const char *buf,
			  size_t count)
{
	struct display_data *dd = dev_get_drvdata(dev);
	int c;

	spin_lock(&dd->lock);

	for (c=0; c<16; c++) {
		int base = ((c<8) ? EPLD_TS_DISPLAY1_BASE : EPLD_TS_DISPLAY0_BASE) + CHAR_RAM_OFF;
		int off = c & 7;
		int data = (c<count) ? buf[c] : ' ';
		epld_write(data, base + (off << 1));
	}

	spin_unlock(&dd->lock);

	return count;
}
Example #9
0
static void enable_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_INTMASK0SET;
	} else {
		maskReg = EPLD_INTMASK1SET;
		pri -= 8;
	}
	mask = 1 << pri;

	epld_write(mask, maskReg);
}
static int __init mb705_display_probe(struct platform_device *pdev)
{
        struct device *dev = &pdev->dev;
	int res;
	struct display_data *dd;
	int i;
	char string[17];
	int string_len;

	dd = devm_kzalloc(dev, sizeof(*dd), GFP_KERNEL);
	if (dd == NULL)
		return -ENOMEM;

	spin_lock_init(&dd->lock);

	platform_set_drvdata(pdev, dd);

	res = device_create_file(dev, &dev_attr_text);
	if (res)
		return res;

	for (i=0; i<16; i++) {
		if (device_create_file(dev, &dev_attr_udef[i])) {
			dev_warn(dev, "%s: failed to create udef sysfs entry\n",
				 __func__);
		}
	}

	/* notFL signal is controlled by DisplayCtrlReg[0] */
	epld_write(1, EPLD_TS_DISPLAY_CTRL_REG);

	string_len = scnprintf(string, sizeof(string), "MB705%c", mb705_rev);
	store_text(dev, NULL, string, string_len);

	return 0;
}
Example #11
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);
}
extern void flashWriteDisable(void)
{
	/* Disable Vpp for writing to flash */
	epld_write(2, EPLD_FLASH);
}
extern void flashWriteEnable(void)
{
	/* Enable Vpp for writing to flash */
	epld_write(3, EPLD_FLASH);
}
Example #14
0
static void __init disable_all_interrupts(void)
{
	epld_write(0x00, EPLD_INTMASK0);
	epld_write(0x00, EPLD_INTMASK1);
}