From 561a9e137c373ca302c20428dc9b0f4de66e27b3 Mon Sep 17 00:00:00 2001 From: Christian Lamparter Date: Tue, 12 Oct 2010 12:36:05 +0200 Subject: [PATCH] carl9170 firmware: reintegrate timer/clock routines Signed-off-by: Christian Lamparter --- carlfw/CMakeLists.txt | 2 +- carlfw/include/timer.h | 15 +++++-- carlfw/src/main.c | 50 +++++++++++++++++++++++ carlfw/src/timer.c | 91 ------------------------------------------ 4 files changed, 62 insertions(+), 96 deletions(-) delete mode 100644 carlfw/src/timer.c diff --git a/carlfw/CMakeLists.txt b/carlfw/CMakeLists.txt index 95a4cc4..a32f68a 100644 --- a/carlfw/CMakeLists.txt +++ b/carlfw/CMakeLists.txt @@ -14,7 +14,7 @@ endif (CONFIG_CARL9170FW_AGGRESSIVE_CFLAGS) include_directories (../include/linux ../include/shared ../include include) -set(carl9170_main_src src/main.c src/timer.c src/wlan.c src/fw.c src/gpio.c +set(carl9170_main_src src/main.c src/wlan.c src/fw.c src/gpio.c src/cmd.c src/uart.c src/dma.c src/hostif.c src/reboot.S src/printf.c src/rf.c src/cam.c) diff --git a/carlfw/include/timer.h b/carlfw/include/timer.h index 8c3df1b..bf2f310 100644 --- a/carlfw/include/timer.h +++ b/carlfw/include/timer.h @@ -37,10 +37,6 @@ enum cpu_clock_t { #define AR9170_TICKS_PER_MICROSECOND 80 -void handle_timer(void); -void timer_init(const unsigned int timer, const unsigned int interval); -void clock_set(const bool on, const enum cpu_clock_t _clock); - static inline __inline uint32_t get_clock_counter(void) { return (get(AR9170_TIMER_REG_CLOCK_HIGH) << 16) | get(AR9170_TIMER_REG_CLOCK_LOW); @@ -77,4 +73,15 @@ static inline __inline void udelay(uint32_t usec) } } +static inline void clock_set(const bool on, const enum cpu_clock_t _clock) +{ + /* + * Word of Warning! + * This setting does more than just mess with the CPU Clock. + * So watch out, if you need _stable_ timer interrupts. + */ + + set(AR9170_PWR_REG_CLOCK_SEL, (uint32_t) ((on ? 0x70 : 0x600) | _clock)); +} + #endif /* __CARL9170FW_TIMER_H */ diff --git a/carlfw/src/main.c b/carlfw/src/main.c index 9500c0d..55acb44 100644 --- a/carlfw/src/main.c +++ b/carlfw/src/main.c @@ -32,6 +32,18 @@ #define AR9170_WATCH_DOG_TIMER 0x100 +static void timer_init(const unsigned int timer, const unsigned int interval) +{ + /* Set timer to periodic mode */ + orl(AR9170_TIMER_REG_CONTROL, BIT(timer)); + + /* Set time interval */ + set(AR9170_TIMER_REG_TIMER0 + (timer << 2), interval - 1); + + /* Clear timer interrupt flag */ + orl(AR9170_TIMER_REG_INTERRUPT, BIT(timer)); +} + static void init(void) { led_init(); @@ -85,6 +97,44 @@ static void handle_fw(void) reboot(); } +static void timer0_isr(void) +{ + wlan_timer(); + +#ifdef CONFIG_CARL9170FW_GPIO_INTERRUPT + gpio_timer(); +#endif /* CONFIG_CARL9170FW_GPIO_INTERRUPT */ + +#ifdef CONFIG_CARL9170FW_DEBUG_LED_HEARTBEAT + set(AR9170_GPIO_REG_PORT_DATA, get(AR9170_GPIO_REG_PORT_DATA) ^ 1); +#endif /* CONFIG_CARL9170FW_DEBUG_LED_HEARTBEAT */ +} + +static void handle_timer(void) +{ + uint32_t intr; + + intr = get(AR9170_TIMER_REG_INTERRUPT); + + /* ACK timer interrupt */ + set(AR9170_TIMER_REG_INTERRUPT, intr); + +#define HANDLER(intr, flag, func) \ + do { \ + if ((intr & flag) != 0) { \ + intr &= ~flag; \ + func(); \ + } \ + } while (0) + + HANDLER(intr, BIT(0), timer0_isr); + + if (intr) + DBG("Unhandled Timer Event %x", (unsigned int) intr); + +#undef HANDLER +} + static void __noreturn main_loop(void) { /* main loop */ diff --git a/carlfw/src/timer.c b/carlfw/src/timer.c deleted file mode 100644 index 14c00e6..0000000 --- a/carlfw/src/timer.c +++ /dev/null @@ -1,91 +0,0 @@ -/* - * carl9170 firmware - used by the ar9170 wireless device - * - * Clock, Timer & Timing functions - * - * Copyright (c) 2000-2005 ZyDAS Technology Corporation - * Copyright (c) 2007-2009 Atheros Communications, Inc. - * Copyright 2009 Johannes Berg - * Copyright 2009, 2010 Christian Lamparter - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include "carl9170.h" -#include "printf.h" -#include "timer.h" -#include "wl.h" -#include "gpio.h" - -void timer_init(const unsigned int timer, const unsigned int interval) -{ - /* Set timer to periodic mode */ - orl(AR9170_TIMER_REG_CONTROL, BIT(timer)); - - /* Set time interval */ - set(AR9170_TIMER_REG_TIMER0 + (timer << 2), interval - 1); - - /* Clear timer interrupt flag */ - orl(AR9170_TIMER_REG_INTERRUPT, BIT(timer)); -} - -void clock_set(const bool on, const enum cpu_clock_t _clock) -{ - /* - * Word of Warning! - * This setting does more than just mess with the CPU Clock. - * So watch out, if you need _stable_ timer interrupts. - */ - - set(AR9170_PWR_REG_CLOCK_SEL, (uint32_t) ((on ? 0x70 : 0x600) | _clock)); -} - -static void timer0_isr(void) -{ - wlan_timer(); - -#ifdef CONFIG_CARL9170FW_GPIO_INTERRUPT - gpio_timer(); -#endif /* CONFIG_CARL9170FW_GPIO_INTERRUPT */ - -#ifdef CONFIG_CARL9170FW_DEBUG_LED_HEARTBEAT - set(AR9170_GPIO_REG_PORT_DATA, get(AR9170_GPIO_REG_PORT_DATA) ^ 1); -#endif /* CONFIG_CARL9170FW_DEBUG_LED_HEARTBEAT */ -} - -void handle_timer(void) -{ - uint32_t intr; - - intr = get(AR9170_TIMER_REG_INTERRUPT); - - /* ACK timer interrupt */ - set(AR9170_TIMER_REG_INTERRUPT, intr); - -#define HANDLER(intr, flag, func) \ - do { \ - if ((intr & flag) != 0) { \ - intr &= ~flag; \ - func(); \ - } \ - } while (0) - - HANDLER(intr, BIT(0), timer0_isr); - - if (intr) - DBG("Unhandled Timer Event %x", (unsigned int) intr); - -#undef HANDLER -} -- 2.31.1