| /* | |
| * 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_ */ |