118 lines
4.5 KiB
C
118 lines
4.5 KiB
C
/*
|
|
* 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]))
|