/*
* kempld_wdt.h - Kontron PLD watchdog driver definitions
*
* Copyright (c) 2010 Kontron Embedded Modules GmbH
* Author: Michael Brunner <michael.brunner@kontron.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License 2 as published
* by the Free Software Foundation.
*
* 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; see the file COPYING. If not, write to
* the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifndef _KEMPLD_WDT_H_
#define _KEMPLD_WDT_H_
#include <stdint.h>
#define KEMPLD_IOPORT 0x0a80
#define KEMPLD_IODATA (KEMPLD_IOPORT+1)
#define KEMPLD_MUTEX_KEY 0x80
/* watchdog register definitions */
#define KEMPLD_WDT_KICK 0x16
#define KEMPLD_WDT_REV 0x16
#define KEMPLD_WDT_REV_GET(x) (x & 0xf)
#define KEMPLD_WDT_CFG 0x17
#define KEMPLD_WDT_CFG_STAGE_TIMEOUT_OCCURED(x) (1<<x)
#define KEMPLD_WDT_CFG_ENABLE_LOCK 0x8
#define KEMPLD_WDT_CFG_ENABLE 0x10
#define KEMPLD_WDT_CFG_AUTO_RELOAD 0x40
#define KEMPLD_WDT_CFG_GLOBAL_LOCK 0x80
#define KEMPLD_WDT_STAGE_CFG(x) (0x18+x)
#define KEMPLD_WDT_STAGE_CFG_ACTION_MASK 0x7
#define KEMPLD_WDT_STAGE_CFG_GET_ACTION(x) (x & 0x7)
#define KEMPLD_WDT_STAGE_CFG_ASSERT 0x8
#define KEMPLD_WDT_STAGE_CFG_PRESCALER_MASK 0x30
#define KEMPLD_WDT_STAGE_CFG_GET_PRESCALER(x) ((x & 0x30)>>4)
#define KEMPLD_WDT_STAGE_CFG_SET_PRESCALER(x) ((x & 0x30)<<4)
#define KEMPLD_WDT_STAGE_TIMEOUT(x) (0x1b+x*4)
#define KEMPLD_WDT_MAX_STAGES 3
#define KEMPLD_WDT_ACTION_NONE 0x0
#define KEMPLD_WDT_ACTION_RESET 0x1
#define KEMPLD_WDT_ACTION_NMI 0x2
#define KEMPLD_WDT_ACTION_SMI 0x3
#define KEMPLD_WDT_ACTION_SCI 0x4
#define KEMPLD_WDT_ACTION_DELAY 0x5
#define KEMPLD_WDT_PRESCALER_21BIT 0x0
#define KEMPLD_WDT_PRESCALER_17BIT 0x1
#define KEMPLD_WDT_PRESCALER_12BIT 0x2
const int kempld_prescaler_bits[] = { 21, 17, 12 };
struct kempld_watchdog_stage {
int num;
uint32_t timeout_mask;
};
/**
* struct kempld_device_data - Internal representation of the PLD device
* @io_base: Pointer to the IO memory
* @io_index: Pointer to the IO index register
* @io_data: Pointer to the IO data register
* @pld_clock: PLD clock frequency
* @lock: PLD spin-lock
* @lock_flags: PLD spin-lock flags
* @have_mutex: Bool value that indicates if mutex is aquired
* @last_index: Last written index value
* @rscr: Kernel resource structure
* @dev: Pointer to kernel device structure
* @info: KEMPLD info structure
*/
struct kempld_device_data {
uint16_t io_base;
uint16_t io_index;
uint16_t io_data;
uint32_t pld_clock;
/* spinlock_t lock;
unsigned long lock_flags; */
int have_mutex;
uint8_t last_index;
/* struct resource rscr;
struct device *dev;
struct kempld_info info;*/
};
struct watchdog_info {
uint32_t options; /* Options the card/driver supports */
uint32_t firmware_version; /* Firmware version of the card */
uint8_t identity[32]; /* Identity of the board */
};
struct kempld_watchdog_data {
unsigned int revision;
int timeout;
int pretimeout;
unsigned long is_open;
unsigned long expect_close;
int stages;
struct kempld_watchdog_stage *timeout_stage;
struct kempld_watchdog_stage *pretimeout_stage;
struct kempld_device_data *pld;
struct kempld_watchdog_stage *stage[KEMPLD_WDT_MAX_STAGES];
struct watchdog_info ident;
};
#endif /* _KEMPLD_WDT_H_ */
#define KEMPLD_PRESCALER(x) (0xffffffff>>(32-kempld_prescaler_bits[x]))