/* * s6105 control routines * * Copyright (c) 2009 emlix GmbH */ #include <linux/irq.h> #include <linux/io.h> #include <linux/gpio.h> #include <asm/bootparam.h> #include <variant/hardware.h> #include <variant/gpio.h> #include <platform/gpio.h> void platform_halt(void) { local_irq_disable(); while (1) ; } void platform_power_off(void) { platform_halt(); } void platform_restart(void) { platform_halt(); } void __init platform_setup(char **cmdline) { unsigned long reg; reg = readl(S6_REG_GREG1 + S6_GREG1_PLLSEL); reg &= ~(S6_GREG1_PLLSEL_GMAC_MASK << S6_GREG1_PLLSEL_GMAC | S6_GREG1_PLLSEL_GMII_MASK << S6_GREG1_PLLSEL_GMII); reg |= S6_GREG1_PLLSEL_GMAC_125MHZ << S6_GREG1_PLLSEL_GMAC | S6_GREG1_PLLSEL_GMII_125MHZ << S6_GREG1_PLLSEL_GMII; writel(reg, S6_REG_GREG1 + S6_GREG1_PLLSEL); reg = readl(S6_REG_GREG1 + S6_GREG1_CLKGATE); reg &= ~(1 << S6_GREG1_BLOCK_SB); reg &= ~(1 << S6_GREG1_BLOCK_GMAC); writel(reg, S6_REG_GREG1 + S6_GREG1_CLKGATE); reg = readl(S6_REG_GREG1 + S6_GREG1_BLOCKENA); reg |= 1 << S6_GREG1_BLOCK_SB; reg |= 1 << S6_GREG1_BLOCK_GMAC; writel(reg, S6_REG_GREG1 + S6_GREG1_BLOCKENA); printk(KERN_NOTICE "S6105 on Stretch S6000 - " "Copyright (C) 2009 emlix GmbH <info@emlix.com>\n"); } void __init platform_init(bp_tag_t *first) { s6_gpio_init(0); gpio_request(GPIO_LED1_NGREEN, "led1_green"); gpio_request(GPIO_LED1_RED, "led1_red"); gpio_direction_output(GPIO_LED1_NGREEN, 1); } void platform_heartbeat(void) { static unsigned int c; if (!(++c & 0x4F)) gpio_direction_output(GPIO_LED1_RED, !(c & 0x10)); }