X-Git-Url: https://git.archive.openwrt.org/?a=blobdiff_plain;f=target%2Flinux%2Fatheros%2Ffiles%2Farch%2Fmips%2Fatheros%2Far5315%2Fboard.c;h=96c6f8fef0864ca2ceaff846deeb0645992c8830;hb=7fee7d1f224b8c02dd8eba0bdb388ab7c504ad99;hp=6d46c85a1ec6c5154ce25c30137f4d10d343ce5f;hpb=7fc1813a4d2288bb3923f4b71e06a0ec4e055304;p=openwrt.git diff --git a/target/linux/atheros/files/arch/mips/atheros/ar5315/board.c b/target/linux/atheros/files/arch/mips/atheros/ar5315/board.c index 6d46c85a1e..96c6f8fef0 100644 --- a/target/linux/atheros/files/arch/mips/atheros/ar5315/board.c +++ b/target/linux/atheros/files/arch/mips/atheros/ar5315/board.c @@ -28,6 +28,7 @@ #include #include #include +#include static int is_5315 = 0; @@ -92,11 +93,9 @@ static struct platform_device ar5315_spiflash = { }; #ifdef CONFIG_LEDS_GPIO -static struct gpio_led ar5315_leds[] = { - { .name = "wlan", .gpio = 0, .active_low = 1, }, -}; +static struct gpio_led ar5315_leds[8]; -static const struct gpio_led_platform_data ar5315_led_data = { +static struct gpio_led_platform_data ar5315_led_data = { .num_leds = ARRAY_SIZE(ar5315_leds), .leds = (void *) ar5315_leds, }; @@ -110,11 +109,8 @@ static struct platform_device ar5315_gpio_leds = { }; #endif - static __initdata struct platform_device *ar5315_devs[5]; - - static void *flash_regs; static inline __u32 spiflash_regread32(int reg) @@ -146,12 +142,12 @@ static __u8 spiflash_probe(void) spiflash_regwrite32(SPI_FLASH_OPCODE, 0xab); reg = (reg & ~SPI_CTL_TX_RX_CNT_MASK) | 4 | - (1 << 4) | SPI_CTL_START; + (1 << 4) | SPI_CTL_START; spiflash_regwrite32(SPI_FLASH_CTL, reg); - + do { - reg = spiflash_regread32(SPI_FLASH_CTL); + reg = spiflash_regread32(SPI_FLASH_CTL); } while (reg & SPI_CTL_BUSY); reg = (__u32) spiflash_regread32(SPI_FLASH_DATA); @@ -205,6 +201,10 @@ int __init ar5315_init_devices(void) struct ar531x_config *config; struct ar531x_boarddata *bcfg; int dev = 0; +#ifdef CONFIG_LEDS_GPIO + int i; + char *tmp; +#endif if (!is_5315) return 0; @@ -235,17 +235,43 @@ int __init ar5315_init_devices(void) config->radio = radio_config; config->unit = 0; config->tag = (u_int16_t) (sysRegRead(AR5315_SREV) & AR5315_REV_CHIP); - + ar5315_eth_data.board_config = board_config; ar5315_eth_data.macaddr = bcfg->enet0Mac; ar5315_wmac.dev.platform_data = config; - ar5315_leds[0].gpio = bcfg->sysLedGpio; - ar5315_devs[dev++] = &ar5315_eth; ar5315_devs[dev++] = &ar5315_wmac; ar5315_devs[dev++] = &ar5315_spiflash; + +#ifdef CONFIG_LEDS_GPIO + ar5315_led_data.num_leds = 0; + for(i = 0; i < 8; i++) + { + if((i != AR5315_RESET_GPIO) && (i != bcfg->resetConfigGpio)) + { + if(i == bcfg->sysLedGpio) + { + tmp = kstrdup("wlan", GFP_KERNEL); + } else { + tmp = kmalloc(6, GFP_KERNEL); + if(tmp) + sprintf((char*)tmp, "gpio%d", i); + } + if(tmp) + { + ar5315_leds[ar5315_led_data.num_leds].name = tmp; + ar5315_leds[ar5315_led_data.num_leds].gpio = i; + ar5315_leds[ar5315_led_data.num_leds].active_low = 0; + ar5315_led_data.num_leds++; + } else { + printk("failed to alloc led string\n"); + continue; + } + } + } ar5315_devs[dev++] = &ar5315_gpio_leds; +#endif return platform_add_devices(ar5315_devs, dev); } @@ -265,18 +291,13 @@ static void ar5315_restart(char *command) { unsigned int reg; for(;;) { - /* reset the system */ sysRegWrite(AR5315_COLD_RESET,AR5317_RESET_SYSTEM); - /* + /* * Cold reset does not work on the AR2315/6, use the GPIO reset bits a workaround. */ - - reg = sysRegRead(AR5315_GPIO_DO); - reg &= ~(1 << AR5315_RESET_GPIO); - sysRegWrite(AR5315_GPIO_DO, reg); - (void)sysRegRead(AR5315_GPIO_DO); /* flush write to hardware */ + gpio_direction_output(AR5315_RESET_GPIO, 0); } } @@ -330,11 +351,11 @@ ar5315_sys_clk(unsigned int clockCtl) clkDiv = 1; break; } - cpuDiv = (clockCtl & CPUCLK_CLK_DIV_M) >> CPUCLK_CLK_DIV_S; + cpuDiv = (clockCtl & CPUCLK_CLK_DIV_M) >> CPUCLK_CLK_DIV_S; cpuDiv = cpuDiv * 2 ?: 1; return (pllcOut/(clkDiv * cpuDiv)); } - + static inline unsigned int ar5315_cpu_frequency(void) { return ar5315_sys_clk(sysRegRead(AR5315_CPUCLK));