1217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle/* 2217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle * Copyright (C) 2000, 2001 Broadcom Corporation 3217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle * 4217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle * This program is free software; you can redistribute it and/or 5217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle * modify it under the terms of the GNU General Public License 6217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle * as published by the Free Software Foundation; either version 2 7217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle * of the License, or (at your option) any later version. 8217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle * 9217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle * This program is distributed in the hope that it will be useful, 10217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle * but WITHOUT ANY WARRANTY; without even the implied warranty of 11217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle * GNU General Public License for more details. 13217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle * 14217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle * You should have received a copy of the GNU General Public License 15217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle * along with this program; if not, write to the Free Software 16217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle */ 18217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle#include <linux/clocksource.h> 19217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle 20217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle#include <asm/addrspace.h> 21217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle#include <asm/io.h> 22217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle#include <asm/time.h> 23217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle 24217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle#include <asm/sibyte/sb1250.h> 25217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle#include <asm/sibyte/sb1250_regs.h> 26217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle#include <asm/sibyte/sb1250_int.h> 27217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle#include <asm/sibyte/sb1250_scd.h> 28217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle 29217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle#define SB1250_HPT_NUM 3 30217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle#define SB1250_HPT_VALUE M_SCD_TIMER_CNT /* max value */ 31217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle 32217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle/* 33217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle * The HPT is free running from SB1250_HPT_VALUE down to 0 then starts over 34217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle * again. 35217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle */ 368e19608e8b5c001e4a66ce482edc474f05fb7355Magnus Dammstatic cycle_t sb1250_hpt_read(struct clocksource *cs) 37217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle{ 38217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle unsigned int count; 39217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle 40217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle count = G_SCD_TIMER_CNT(__raw_readq(IOADDR(A_SCD_TIMER_REGISTER(SB1250_HPT_NUM, R_SCD_TIMER_CNT)))); 41217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle 42217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle return SB1250_HPT_VALUE - count; 43217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle} 44217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle 45217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechlestruct clocksource bcm1250_clocksource = { 46f99f2cc9363a08cdbd6cfbe3f29234e3235d05e8Ralf Baechle .name = "bcm1250-counter-3", 47217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle .rating = 200, 48217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle .read = sb1250_hpt_read, 49217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle .mask = CLOCKSOURCE_MASK(23), 50217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle .flags = CLOCK_SOURCE_IS_CONTINUOUS, 51217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle}; 52217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle 53217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechlevoid __init sb1250_clocksource_init(void) 54217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle{ 55217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle struct clocksource *cs = &bcm1250_clocksource; 56217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle 57217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle /* Setup hpt using timer #3 but do not enable irq for it */ 58217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle __raw_writeq(0, 59217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle IOADDR(A_SCD_TIMER_REGISTER(SB1250_HPT_NUM, 60217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle R_SCD_TIMER_CFG))); 61217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle __raw_writeq(SB1250_HPT_VALUE, 62217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle IOADDR(A_SCD_TIMER_REGISTER(SB1250_HPT_NUM, 63217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle R_SCD_TIMER_INIT))); 64217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle __raw_writeq(M_SCD_TIMER_ENABLE | M_SCD_TIMER_MODE_CONTINUOUS, 65217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle IOADDR(A_SCD_TIMER_REGISTER(SB1250_HPT_NUM, 66217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle R_SCD_TIMER_CFG))); 67217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle 6875c4fd8c7862f37eeae5c80f33bbe4dce97571d4John Stultz clocksource_register_hz(cs, V_SCD_TIMER_FREQ); 69217dd11e9d0442767fa13c9c188be0b92dc93d7eRalf Baechle} 70