X-Git-Url: https://jxself.org/git/?p=carl9170fw.git;a=blobdiff_plain;f=carlfw%2Fsrc%2Ftimer.c;h=4a4b38fabf6df08094f76f318275988375151d89;hp=14c00e6aad491295f53ca79d077dc0285f95ed7e;hb=f99b6fd51bf8429eaad357ac9c7149a92f719628;hpb=c1d4716037319ad03fa29cbe56d7cb8c3af67472 diff --git a/carlfw/src/timer.c b/carlfw/src/timer.c index 14c00e6..4a4b38f 100644 --- a/carlfw/src/timer.c +++ b/carlfw/src/timer.c @@ -1,12 +1,12 @@ /* * carl9170 firmware - used by the ar9170 wireless device * - * Clock, Timer & Timing functions + * timer code * * Copyright (c) 2000-2005 ZyDAS Technology Corporation * Copyright (c) 2007-2009 Atheros Communications, Inc. * Copyright 2009 Johannes Berg - * Copyright 2009, 2010 Christian Lamparter + * Copyright 2009-2012 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 @@ -19,15 +19,14 @@ * 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. + * with this program; If not, see . */ #include "carl9170.h" -#include "printf.h" #include "timer.h" -#include "wl.h" #include "gpio.h" +#include "printf.h" +#include "wl.h" void timer_init(const unsigned int timer, const unsigned int interval) { @@ -41,15 +40,39 @@ void timer_init(const unsigned int timer, const unsigned int interval) orl(AR9170_TIMER_REG_INTERRUPT, BIT(timer)); } -void clock_set(const bool on, const enum cpu_clock_t _clock) +void clock_set(enum cpu_clock_t clock_, bool on) { /* * 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)); +#ifdef CONFIG_CARL9170FW_RADIO_FUNCTIONS + if (fw.phy.frequency < 3000000) + set(AR9170_PWR_REG_PLL_ADDAC, 0x5163); + else + set(AR9170_PWR_REG_PLL_ADDAC, 0x5143); +#else + set(AR9170_PWR_REG_PLL_ADDAC, 0x5163); +#endif /* CONFIG_CARL9170FW_RADIO_FUNCTIONS */ + + fw.ticks_per_usec = GET_VAL(AR9170_PWR_PLL_ADDAC_DIV, + get(AR9170_PWR_REG_PLL_ADDAC)); + + set(AR9170_PWR_REG_CLOCK_SEL, (uint32_t) ((on ? 0x70 : 0x600) | clock_)); + + switch (clock_) { + case AHB_20_22MHZ: + fw.ticks_per_usec >>= 1; + /* fall through */ + case AHB_40MHZ_OSC: + /* fall through */ + case AHB_40_44MHZ: + fw.ticks_per_usec >>= 1; + /* fall through */ + case AHB_80_88MHZ: + break; + } } static void timer0_isr(void)