19dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch/*
29dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch * GE PIO2 Counter Driver
39dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch *
49dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch * Author: Martyn Welch <martyn.welch@ge.com>
59dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch * Copyright 2009 GE Intelligent Platforms Embedded Systems, Inc.
69dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch *
79dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch * This program is free software; you can redistribute  it and/or modify it
89dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch * under  the terms of  the GNU General  Public License as published by the
99dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch * Free Software Foundation;  either version 2 of the  License, or (at your
109dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch * option) any later version.
119dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch *
129dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch * The PIO-2 has 6 counters, currently this code just disables the interrupts
139dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch * and leaves them alone.
149dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch *
159dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch */
169dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch
179dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch#include <linux/device.h>
189dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch#include <linux/types.h>
199dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch#include <linux/gpio.h>
209dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch
219dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch#include "../vme.h"
229dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch#include "vme_pio2.h"
239dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch
249dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welchstatic int pio2_cntr_irq_set(struct pio2_card *card, int id)
259dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch{
269dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch	int retval;
279dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch	u8 data;
289dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch
299dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch	data = PIO2_CNTR_SC_DEV[id] | PIO2_CNTR_RW_BOTH | card->cntr[id].mode;
309dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch	retval = vme_master_write(card->window, &data, 1, PIO2_CNTR_CTRL[id]);
319dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch	if (retval < 0)
329dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch		return retval;
339dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch
349dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch	data = card->cntr[id].count & 0xFF;
359dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch	retval = vme_master_write(card->window, &data, 1, PIO2_CNTR_DATA[id]);
369dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch	if (retval < 0)
379dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch		return retval;
389dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch
399dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch	data = (card->cntr[id].count >> 8) & 0xFF;
409dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch	retval = vme_master_write(card->window, &data, 1, PIO2_CNTR_DATA[id]);
419dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch	if (retval < 0)
429dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch		return retval;
439dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch
449dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch	return 0;
459dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch}
469dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch
479dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welchint pio2_cntr_reset(struct pio2_card *card)
489dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch{
499dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch	int i, retval = 0;
509dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch	u8 reg;
519dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch
529dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch	/* Clear down all timers */
539dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch	for (i = 0; i < 6; i++) {
549dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch		card->cntr[i].mode = PIO2_CNTR_MODE5;
559dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch		card->cntr[i].count = 0;
569dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch		retval = pio2_cntr_irq_set(card, i);
579dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch		if (retval < 0)
589dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch			return retval;
599dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch	}
609dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch
619dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch	/* Ensure all counter interrupts are cleared */
629dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch	do {
639dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch		retval = vme_master_read(card->window, &reg, 1,
649dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch			PIO2_REGS_INT_STAT_CNTR);
659dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch		if (retval < 0)
669dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch			return retval;
679dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch	} while (reg != 0);
689dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch
699dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch	return retval;
709dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch}
719dc367bc4c76cc4c6595e9fab6a5a02523b537c6Martyn Welch
72