From fa98c0c5e155790e05b6e9d276622084e4a88c82 Mon Sep 17 00:00:00 2001 From: Daniel Hellstrom Date: Sun, 22 Jan 2017 11:30:04 +0100 Subject: GRSPW_PKT: add missing GRSPW1 IP-core support --- c/src/lib/libbsp/sparc/shared/spw/grspw_pkt.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/c/src/lib/libbsp/sparc/shared/spw/grspw_pkt.c b/c/src/lib/libbsp/sparc/shared/spw/grspw_pkt.c index da0362b141..ce2983e85c 100644 --- a/c/src/lib/libbsp/sparc/shared/spw/grspw_pkt.c +++ b/c/src/lib/libbsp/sparc/shared/spw/grspw_pkt.c @@ -2902,6 +2902,20 @@ void grspw_initialize_user(void *(*devfound)(int), void (*devremove)(int,void*)) } } +/* Get a value at least 6.4us in number of clock cycles */ +static unsigned int grspw1_calc_timer64(int freq_khz) +{ + unsigned int timer64 = (freq_khz * 64 + 9999) / 10000; + return timer64 & 0xfff; +} + +/* Get a value at least 850ns in number of clock cycles - 3 */ +static unsigned int grspw1_calc_discon(int freq_khz) +{ + unsigned int discon = ((freq_khz * 85 + 99999) / 100000) - 3; + return discon & 0x3ff; +} + /******************* Driver manager interface ***********************/ /* Driver prototypes */ @@ -3003,9 +3017,18 @@ static int grspw2_init3(struct drvmgr_dev *dev) priv->hwsup.strip_adr = 1; /* All GRSPW2 can strip Address */ priv->hwsup.strip_pid = 1; /* All GRSPW2 can strip PID */ } else { + unsigned int apb_hz, apb_khz; + /* Autodetect GRSPW1 features? */ priv->hwsup.strip_adr = 0; priv->hwsup.strip_pid = 0; + + drvmgr_freq_get(dev, DEV_APB_SLV, &apb_hz); + apb_khz = apb_hz / 1000; + + REG_WRITE(&priv->regs->timer, + ((grspw1_calc_discon(apb_khz) & 0x3FF) << 12) | + (grspw1_calc_timer64(apb_khz) & 0xFFF)); } /* Probe width of SpaceWire Interrupt ISR timers. All have the same -- cgit v1.2.3