/*
 * Wireless Host Controller Interface for Ultra-Wide-Band and Wireless USB
 *
 * Copyright (C) 2005-2006 Intel Corporation
 * Inaky Perez-Gonzalez <inaky.perez-gonzalez@intel.com>
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License version
 * 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; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 * 02110-1301, USA.
 *
 *
 *
 * References:
 *   [WHCI] Wireless Host Controller Interface Specification for
 *          Certified Wireless Universal Serial Bus, revision 0.95.
 */
#ifndef _LINUX_UWB_WHCI_H_
#define _LINUX_UWB_WHCI_H_

#include <linux/pci.h>

/*
 * UWB interface capability registers (offsets from UWBBASE)
 *
 * [WHCI] section 2.2
 */
#define UWBCAPINFO	0x00 /* == UWBCAPDATA(0) */
#  define UWBCAPINFO_TO_N_CAPS(c)	(((c) >> 0)  & 0xFull)
#define UWBCAPDATA(n)	(8*(n))
#  define UWBCAPDATA_TO_VERSION(c)	(((c) >> 32) & 0xFFFFull)
#  define UWBCAPDATA_TO_OFFSET(c)	(((c) >> 18) & 0x3FFFull)
#  define UWBCAPDATA_TO_BAR(c)		(((c) >> 16) & 0x3ull)
#  define UWBCAPDATA_TO_SIZE(c)		((((c) >> 8) & 0xFFull) * sizeof(u32))
#  define UWBCAPDATA_TO_CAP_ID(c)	(((c) >> 0)  & 0xFFull)

/* Size of the WHCI capability data (including the RC capability) for
   a device with n capabilities. */
#define UWBCAPDATA_SIZE(n) (8 + 8*(n))


/*
 * URC registers (offsets from URCBASE)
 *
 * [WHCI] section 2.3
 */
#define URCCMD		0x00
#  define URCCMD_RESET		(1 << 31)  /* UMC Hardware reset */
#  define URCCMD_RS		(1 << 30)  /* Run/Stop */
#  define URCCMD_EARV		(1 << 29)  /* Event Address Register Valid */
#  define URCCMD_ACTIVE		(1 << 15)  /* Command is active */
#  define URCCMD_IWR		(1 << 14)  /* Interrupt When Ready */
#  define URCCMD_SIZE_MASK	0x00000fff /* Command size mask */
#define URCSTS		0x04
#  define URCSTS_EPS		(1 << 17)  /* Event Processing Status */
#  define URCSTS_HALTED		(1 << 16)  /* RC halted */
#  define URCSTS_HSE		(1 << 10)  /* Host System Error...fried */
#  define URCSTS_ER		(1 <<  9)  /* Event Ready */
#  define URCSTS_RCI		(1 <<  8)  /* Ready for Command Interrupt */
#  define URCSTS_INT_MASK	0x00000700 /* URC interrupt sources */
#  define URCSTS_ISI		0x000000ff /* Interrupt Source Identification */
#define URCINTR		0x08
#  define URCINTR_EN_ALL	0x000007ff /* Enable all interrupt sources */
#define URCCMDADDR	0x10
#define URCEVTADDR	0x18
#  define URCEVTADDR_OFFSET_MASK 0xfff    /* Event pointer offset mask */


/** Write 32 bit @value to little endian register at @addr */
static inline
void le_writel(u32 value, void __iomem *addr)
{
	iowrite32(value, addr);
}


/** Read from 32 bit little endian register at @addr */
static inline
u32 le_readl(void __iomem *addr)
{
	return ioread32(addr);
}


/** Write 64 bit @value to little endian register at @addr */
static inline
void le_writeq(u64 value, void __iomem *addr)
{
	iowrite32(value, addr);
	iowrite32(value >> 32, addr + 4);
}


/** Read from 64 bit little endian register at @addr */
static inline
u64 le_readq(void __iomem *addr)
{
	u64 value;
	value  = ioread32(addr);
	value |= (u64)ioread32(addr + 4) << 32;
	return value;
}

extern int whci_wait_for(struct device *dev, u32 __iomem *reg,
			 u32 mask, u32 result,
			 unsigned long max_ms,  const char *tag);

#endif /* #ifndef _LINUX_UWB_WHCI_H_ */
