예제 #1
0
static int __init db1200_detect_board(void)
{
    int bid;

    /* try the DB1200 first */
    bcsr_init(DB1200_BCSR_PHYS_ADDR,
              DB1200_BCSR_PHYS_ADDR + DB1200_BCSR_HEXLED_OFS);
    if (BCSR_WHOAMI_DB1200 == BCSR_WHOAMI_BOARD(bcsr_read(BCSR_WHOAMI))) {
        unsigned short t = bcsr_read(BCSR_HEXLEDS);
        bcsr_write(BCSR_HEXLEDS, ~t);
        if (bcsr_read(BCSR_HEXLEDS) != t) {
            bcsr_write(BCSR_HEXLEDS, t);
            return 0;
        }
    }

    /* okay, try the PB1200 then */
    bcsr_init(PB1200_BCSR_PHYS_ADDR,
              PB1200_BCSR_PHYS_ADDR + PB1200_BCSR_HEXLED_OFS);
    bid = BCSR_WHOAMI_BOARD(bcsr_read(BCSR_WHOAMI));
    if ((bid == BCSR_WHOAMI_PB1200_DDR1) ||
            (bid == BCSR_WHOAMI_PB1200_DDR2)) {
        unsigned short t = bcsr_read(BCSR_HEXLEDS);
        bcsr_write(BCSR_HEXLEDS, ~t);
        if (bcsr_read(BCSR_HEXLEDS) != t) {
            bcsr_write(BCSR_HEXLEDS, t);
            return 0;
        }
    }

    return 1;	/* it's neither */
}
예제 #2
0
static int db1x_pm_enter(suspend_state_t state)
{
	unsigned short bcsrs[16];
	int i, j, hasint;

	/* save CPLD regs */
	hasint = bcsr_read(BCSR_WHOAMI);
	hasint = BCSR_WHOAMI_BOARD(hasint) >= BCSR_WHOAMI_DB1200;
	j = (hasint) ? BCSR_MASKSET : BCSR_SYSTEM;

	for (i = BCSR_STATUS; i <= j; i++)
		bcsrs[i] = bcsr_read(i);

	/* shut off hexleds */
	bcsr_write(BCSR_HEXCLEAR, 3);

	/* enable GPIO based wakeup */
	alchemy_gpio1_input_enable();

	/* clear and setup wake cause and source */
	alchemy_wrsys(0, AU1000_SYS_WAKEMSK);
	alchemy_wrsys(0, AU1000_SYS_WAKESRC);

	alchemy_wrsys(db1x_pm_wakemsk, AU1000_SYS_WAKEMSK);

	/* setup 1Hz-timer-based wakeup: wait for reg access */
	while (alchemy_rdsys(AU1000_SYS_CNTRCTRL) & SYS_CNTRL_M20)
		asm volatile ("nop");

	alchemy_wrsys(alchemy_rdsys(AU1000_SYS_TOYREAD) + db1x_pm_sleep_secs,
		      AU1000_SYS_TOYMATCH2);

	/* wait for value to really hit the register */
	while (alchemy_rdsys(AU1000_SYS_CNTRCTRL) & SYS_CNTRL_M20)
		asm volatile ("nop");

	/* ...and now the sandman can come! */
	au_sleep();


	/* restore CPLD regs */
	for (i = BCSR_STATUS; i <= BCSR_SYSTEM; i++)
		bcsr_write(i, bcsrs[i]);

	/* restore CPLD int registers */
	if (hasint) {
		bcsr_write(BCSR_INTCLR, 0xffff);
		bcsr_write(BCSR_MASKCLR, 0xffff);
		bcsr_write(BCSR_INTSTAT, 0xffff);
		bcsr_write(BCSR_INTSET, bcsrs[BCSR_INTSET]);
		bcsr_write(BCSR_MASKSET, bcsrs[BCSR_MASKSET]);
	}

	/* light up hexleds */
	bcsr_write(BCSR_HEXCLEAR, 0);

	return 0;
}
예제 #3
0
void __init board_setup(void)
{
    u32 pin_func;

    bcsr_init(PB1550_BCSR_PHYS_ADDR,
              PB1550_BCSR_PHYS_ADDR + PB1550_BCSR_HEXLED_OFS);

    alchemy_gpio2_enable();

    /*
     * Enable PSC1 SYNC for AC'97.  Normaly done in audio driver,
     * but it is board specific code, so put it here.
     */
    pin_func = au_readl(SYS_PINFUNC);
    au_sync();
    pin_func |= SYS_PF_MUST_BE_SET | SYS_PF_PSC1_S1;
    au_writel(pin_func, SYS_PINFUNC);

    bcsr_write(BCSR_PCMCIA, 0);	/* turn off PCMCIA power */

    printk(KERN_INFO "AMD Alchemy Pb1550 Board\n");
}
예제 #4
0
static void db1x_reset(char *c)
{
	bcsr_write(BCSR_RESETS, 0);
	bcsr_write(BCSR_SYSTEM, 0);
}
예제 #5
0
static void db1x_power_off(void)
{
	bcsr_write(BCSR_RESETS, 0);
	bcsr_write(BCSR_SYSTEM, BCSR_SYSTEM_PWROFF | BCSR_SYSTEM_RESET);
}
예제 #6
0
void board_reset(void)
{
	bcsr_write(BCSR_RESETS, 0);
	bcsr_write(BCSR_SYSTEM, 0);
}