1b886d83cSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */ 2*0419bf0fSAditya Srivastava /* 305e5027eSGreg Kroah-Hartman * driver for the carrier TEWS TPCI-200 405e5027eSGreg Kroah-Hartman * 505e5027eSGreg Kroah-Hartman * Copyright (C) 2009-2012 CERN (www.cern.ch) 605e5027eSGreg Kroah-Hartman * Author: Nicolas Serafini, EIC2 SA 705e5027eSGreg Kroah-Hartman * Author: Samuel Iglesias Gonsalvez <siglesias@igalia.com> 805e5027eSGreg Kroah-Hartman */ 905e5027eSGreg Kroah-Hartman 1005e5027eSGreg Kroah-Hartman #ifndef _TPCI200_H_ 1105e5027eSGreg Kroah-Hartman #define _TPCI200_H_ 1205e5027eSGreg Kroah-Hartman 1305e5027eSGreg Kroah-Hartman #include <linux/limits.h> 1405e5027eSGreg Kroah-Hartman #include <linux/pci.h> 1505e5027eSGreg Kroah-Hartman #include <linux/spinlock.h> 1605e5027eSGreg Kroah-Hartman #include <linux/swab.h> 1705e5027eSGreg Kroah-Hartman #include <linux/io.h> 187dbce021SSamuel Iglesias Gonsalvez #include <linux/ipack.h> 1905e5027eSGreg Kroah-Hartman 2005e5027eSGreg Kroah-Hartman #define TPCI200_NB_SLOT 0x4 2105e5027eSGreg Kroah-Hartman #define TPCI200_NB_BAR 0x6 2205e5027eSGreg Kroah-Hartman 2305e5027eSGreg Kroah-Hartman #define TPCI200_VENDOR_ID 0x1498 2405e5027eSGreg Kroah-Hartman #define TPCI200_DEVICE_ID 0x30C8 2505e5027eSGreg Kroah-Hartman #define TPCI200_SUBVENDOR_ID 0x1498 2605e5027eSGreg Kroah-Hartman #define TPCI200_SUBDEVICE_ID 0x300A 2705e5027eSGreg Kroah-Hartman 2805e5027eSGreg Kroah-Hartman #define TPCI200_CFG_MEM_BAR 0 2905e5027eSGreg Kroah-Hartman #define TPCI200_IP_INTERFACE_BAR 2 3005e5027eSGreg Kroah-Hartman #define TPCI200_IO_ID_INT_SPACES_BAR 3 3105e5027eSGreg Kroah-Hartman #define TPCI200_MEM16_SPACE_BAR 4 3205e5027eSGreg Kroah-Hartman #define TPCI200_MEM8_SPACE_BAR 5 3305e5027eSGreg Kroah-Hartman 3405e5027eSGreg Kroah-Hartman struct tpci200_regs { 3505e5027eSGreg Kroah-Hartman __le16 revision; 3605e5027eSGreg Kroah-Hartman /* writes to control should occur with the mutex held to protect 3705e5027eSGreg Kroah-Hartman * read-modify-write operations */ 3805e5027eSGreg Kroah-Hartman __le16 control[4]; 3905e5027eSGreg Kroah-Hartman __le16 reset; 4005e5027eSGreg Kroah-Hartman __le16 status; 4105e5027eSGreg Kroah-Hartman u8 reserved[242]; 4205e5027eSGreg Kroah-Hartman } __packed; 4305e5027eSGreg Kroah-Hartman 4405e5027eSGreg Kroah-Hartman #define TPCI200_IFACE_SIZE 0x100 4505e5027eSGreg Kroah-Hartman 4605e5027eSGreg Kroah-Hartman #define TPCI200_IO_SPACE_OFF 0x0000 4705e5027eSGreg Kroah-Hartman #define TPCI200_IO_SPACE_INTERVAL 0x0100 4805e5027eSGreg Kroah-Hartman #define TPCI200_IO_SPACE_SIZE 0x0080 4905e5027eSGreg Kroah-Hartman #define TPCI200_ID_SPACE_OFF 0x0080 5005e5027eSGreg Kroah-Hartman #define TPCI200_ID_SPACE_INTERVAL 0x0100 5105e5027eSGreg Kroah-Hartman #define TPCI200_ID_SPACE_SIZE 0x0040 5205e5027eSGreg Kroah-Hartman #define TPCI200_INT_SPACE_OFF 0x00C0 5305e5027eSGreg Kroah-Hartman #define TPCI200_INT_SPACE_INTERVAL 0x0100 5405e5027eSGreg Kroah-Hartman #define TPCI200_INT_SPACE_SIZE 0x0040 5505e5027eSGreg Kroah-Hartman #define TPCI200_IOIDINT_SIZE 0x0400 5605e5027eSGreg Kroah-Hartman 5705e5027eSGreg Kroah-Hartman #define TPCI200_MEM8_SPACE_INTERVAL 0x00400000 5805e5027eSGreg Kroah-Hartman #define TPCI200_MEM8_SPACE_SIZE 0x00400000 5905e5027eSGreg Kroah-Hartman #define TPCI200_MEM16_SPACE_INTERVAL 0x00800000 6005e5027eSGreg Kroah-Hartman #define TPCI200_MEM16_SPACE_SIZE 0x00800000 6105e5027eSGreg Kroah-Hartman 6205e5027eSGreg Kroah-Hartman /* control field in tpci200_regs */ 6305e5027eSGreg Kroah-Hartman #define TPCI200_INT0_EN 0x0040 6405e5027eSGreg Kroah-Hartman #define TPCI200_INT1_EN 0x0080 6505e5027eSGreg Kroah-Hartman #define TPCI200_INT0_EDGE 0x0010 6605e5027eSGreg Kroah-Hartman #define TPCI200_INT1_EDGE 0x0020 6705e5027eSGreg Kroah-Hartman #define TPCI200_ERR_INT_EN 0x0008 6805e5027eSGreg Kroah-Hartman #define TPCI200_TIME_INT_EN 0x0004 6905e5027eSGreg Kroah-Hartman #define TPCI200_RECOVER_EN 0x0002 7005e5027eSGreg Kroah-Hartman #define TPCI200_CLK32 0x0001 7105e5027eSGreg Kroah-Hartman 7205e5027eSGreg Kroah-Hartman /* reset field in tpci200_regs */ 7305e5027eSGreg Kroah-Hartman #define TPCI200_A_RESET 0x0001 7405e5027eSGreg Kroah-Hartman #define TPCI200_B_RESET 0x0002 7505e5027eSGreg Kroah-Hartman #define TPCI200_C_RESET 0x0004 7605e5027eSGreg Kroah-Hartman #define TPCI200_D_RESET 0x0008 7705e5027eSGreg Kroah-Hartman 7805e5027eSGreg Kroah-Hartman /* status field in tpci200_regs */ 7905e5027eSGreg Kroah-Hartman #define TPCI200_A_TIMEOUT 0x1000 8005e5027eSGreg Kroah-Hartman #define TPCI200_B_TIMEOUT 0x2000 8105e5027eSGreg Kroah-Hartman #define TPCI200_C_TIMEOUT 0x4000 8205e5027eSGreg Kroah-Hartman #define TPCI200_D_TIMEOUT 0x8000 8305e5027eSGreg Kroah-Hartman 8405e5027eSGreg Kroah-Hartman #define TPCI200_A_ERROR 0x0100 8505e5027eSGreg Kroah-Hartman #define TPCI200_B_ERROR 0x0200 8605e5027eSGreg Kroah-Hartman #define TPCI200_C_ERROR 0x0400 8705e5027eSGreg Kroah-Hartman #define TPCI200_D_ERROR 0x0800 8805e5027eSGreg Kroah-Hartman 8905e5027eSGreg Kroah-Hartman #define TPCI200_A_INT0 0x0001 9005e5027eSGreg Kroah-Hartman #define TPCI200_A_INT1 0x0002 9105e5027eSGreg Kroah-Hartman #define TPCI200_B_INT0 0x0004 9205e5027eSGreg Kroah-Hartman #define TPCI200_B_INT1 0x0008 9305e5027eSGreg Kroah-Hartman #define TPCI200_C_INT0 0x0010 9405e5027eSGreg Kroah-Hartman #define TPCI200_C_INT1 0x0020 9505e5027eSGreg Kroah-Hartman #define TPCI200_D_INT0 0x0040 9605e5027eSGreg Kroah-Hartman #define TPCI200_D_INT1 0x0080 9705e5027eSGreg Kroah-Hartman 9805e5027eSGreg Kroah-Hartman #define TPCI200_SLOT_INT_MASK 0x00FF 9905e5027eSGreg Kroah-Hartman 10005e5027eSGreg Kroah-Hartman /* PCI Configuration registers. The PCI bridge is a PLX Technology PCI9030. */ 10105e5027eSGreg Kroah-Hartman #define LAS1_DESC 0x2C 10205e5027eSGreg Kroah-Hartman #define LAS2_DESC 0x30 10305e5027eSGreg Kroah-Hartman 10405e5027eSGreg Kroah-Hartman /* Bits in the LAS?_DESC registers */ 10505e5027eSGreg Kroah-Hartman #define LAS_BIT_BIGENDIAN 24 10605e5027eSGreg Kroah-Hartman 10705e5027eSGreg Kroah-Hartman #define VME_IOID_SPACE "IOID" 10805e5027eSGreg Kroah-Hartman #define VME_MEM_SPACE "MEM" 10905e5027eSGreg Kroah-Hartman 11005e5027eSGreg Kroah-Hartman /** 11105e5027eSGreg Kroah-Hartman * struct slot_irq - slot IRQ definition. 11205e5027eSGreg Kroah-Hartman * @vector Vector number 11305e5027eSGreg Kroah-Hartman * @handler Handler called when IRQ arrives 11405e5027eSGreg Kroah-Hartman * @arg Handler argument 11505e5027eSGreg Kroah-Hartman * 11605e5027eSGreg Kroah-Hartman */ 11705e5027eSGreg Kroah-Hartman struct slot_irq { 11805e5027eSGreg Kroah-Hartman struct ipack_device *holder; 11905e5027eSGreg Kroah-Hartman int vector; 12005e5027eSGreg Kroah-Hartman irqreturn_t (*handler)(void *); 12105e5027eSGreg Kroah-Hartman void *arg; 12205e5027eSGreg Kroah-Hartman }; 12305e5027eSGreg Kroah-Hartman 12405e5027eSGreg Kroah-Hartman /** 12505e5027eSGreg Kroah-Hartman * struct tpci200_slot - data specific to the tpci200 slot. 12605e5027eSGreg Kroah-Hartman * @slot_id Slot identification gived to external interface 12705e5027eSGreg Kroah-Hartman * @irq Slot IRQ infos 12805e5027eSGreg Kroah-Hartman * @io_phys IO physical base address register of the slot 12905e5027eSGreg Kroah-Hartman * @id_phys ID physical base address register of the slot 13005e5027eSGreg Kroah-Hartman * @int_phys INT physical base address register of the slot 13105e5027eSGreg Kroah-Hartman * @mem_phys MEM physical base address register of the slot 13205e5027eSGreg Kroah-Hartman * 13305e5027eSGreg Kroah-Hartman */ 13405e5027eSGreg Kroah-Hartman struct tpci200_slot { 13505e5027eSGreg Kroah-Hartman struct slot_irq *irq; 13605e5027eSGreg Kroah-Hartman }; 13705e5027eSGreg Kroah-Hartman 13805e5027eSGreg Kroah-Hartman /** 13905e5027eSGreg Kroah-Hartman * struct tpci200_infos - informations specific of the TPCI200 tpci200. 14005e5027eSGreg Kroah-Hartman * @pci_dev PCI device 14105e5027eSGreg Kroah-Hartman * @interface_regs Pointer to IP interface space (Bar 2) 14205e5027eSGreg Kroah-Hartman * @ioidint_space Pointer to IP ID, IO and INT space (Bar 3) 14305e5027eSGreg Kroah-Hartman * @mem8_space Pointer to MEM space (Bar 4) 14405e5027eSGreg Kroah-Hartman * 14505e5027eSGreg Kroah-Hartman */ 14605e5027eSGreg Kroah-Hartman struct tpci200_infos { 14705e5027eSGreg Kroah-Hartman struct pci_dev *pdev; 14805e5027eSGreg Kroah-Hartman struct pci_device_id *id_table; 14905e5027eSGreg Kroah-Hartman struct tpci200_regs __iomem *interface_regs; 15005e5027eSGreg Kroah-Hartman void __iomem *cfg_regs; 15105e5027eSGreg Kroah-Hartman struct ipack_bus_device *ipack_bus; 15205e5027eSGreg Kroah-Hartman }; 15305e5027eSGreg Kroah-Hartman struct tpci200_board { 15405e5027eSGreg Kroah-Hartman unsigned int number; 15505e5027eSGreg Kroah-Hartman struct mutex mutex; 15605e5027eSGreg Kroah-Hartman spinlock_t regs_lock; 15705e5027eSGreg Kroah-Hartman struct tpci200_slot *slots; 15805e5027eSGreg Kroah-Hartman struct tpci200_infos *info; 15905e5027eSGreg Kroah-Hartman phys_addr_t mod_mem[IPACK_SPACE_COUNT]; 16005e5027eSGreg Kroah-Hartman }; 16105e5027eSGreg Kroah-Hartman 16205e5027eSGreg Kroah-Hartman #endif /* _TPCI200_H_ */ 163