1a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann/* 2a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann * ISP1362 HCD (Host Controller Driver) for USB. 3a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann * 4a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann * COPYRIGHT (C) by L. Wassmann <LW@KARO-electronics.de> 5a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann */ 6a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 7a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann/* ------------------------------------------------------------------------- */ 8a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann/* 9a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann * Platform specific compile time options 10a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann */ 1110d0ca024257c88b28235fcd58577c3eb01b0460Christian Dietrich#if defined(CONFIG_BLACKFIN) 12a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 13a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#include <linux/io.h> 14a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define USE_32BIT 0 15a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define MAX_ROOT_PORTS 2 16a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define USE_PLATFORM_DELAY 0 17a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define USE_NDELAY 1 18a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 19a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define DUMMY_DELAY_ACCESS \ 20a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann do { \ 21a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann bfin_read16(ASYNC_BANK0_BASE); \ 22a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann bfin_read16(ASYNC_BANK0_BASE); \ 23a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann bfin_read16(ASYNC_BANK0_BASE); \ 24a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann } while (0) 25a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 26a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#undef insw 27a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#undef outsw 28a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 29a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define insw delayed_insw 30a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define outsw delayed_outsw 31a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 32a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmannstatic inline void delayed_outsw(unsigned int addr, void *buf, int len) 33a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann{ 34a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann unsigned short *bp = (unsigned short *)buf; 35a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann while (len--) { 36a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann DUMMY_DELAY_ACCESS; 37a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann outw(*bp++, addr); 38a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann } 39a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann} 40a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 41a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmannstatic inline void delayed_insw(unsigned int addr, void *buf, int len) 42a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann{ 43a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann unsigned short *bp = (unsigned short *)buf; 44a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann while (len--) { 45a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann DUMMY_DELAY_ACCESS; 460c8a32dff4f9ebed3e067e52e12842d7d7e047a0Mike Frysinger *bp++ = inw(addr); 47a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann } 48a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann} 49a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 50a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#else 51a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 52a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define MAX_ROOT_PORTS 2 53a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 54a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define USE_32BIT 0 55a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 56a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann/* These options are mutually eclusive */ 57a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define USE_PLATFORM_DELAY 0 58a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define USE_NDELAY 0 59a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 60a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define DUMMY_DELAY_ACCESS do {} while (0) 61a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 62a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#endif 63a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 64a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 65a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann/* ------------------------------------------------------------------------- */ 66a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 67a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define USB_RESET_WIDTH 50 68a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define MAX_XFER_SIZE 1023 69a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 70a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann/* Buffer sizes */ 71a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define ISP1362_BUF_SIZE 4096 72a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define ISP1362_ISTL_BUFSIZE 512 73a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define ISP1362_INTL_BLKSIZE 64 74a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define ISP1362_INTL_BUFFERS 16 75a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define ISP1362_ATL_BLKSIZE 64 76a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 77a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define ISP1362_REG_WRITE_OFFSET 0x80 78a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 79a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#ifdef ISP1362_DEBUG 80a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmanntypedef const unsigned int isp1362_reg_t; 81a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 82a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define REG_WIDTH_16 0x000 83a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define REG_WIDTH_32 0x100 84a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define REG_WIDTH_MASK 0x100 85a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define REG_NO_MASK 0x0ff 86a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 87a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define REG_ACCESS_R 0x200 88a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define REG_ACCESS_W 0x400 89a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define REG_ACCESS_RW 0x600 90a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define REG_ACCESS_MASK 0x600 91a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 92a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define ISP1362_REG_NO(r) ((r) & REG_NO_MASK) 93a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 94a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define _BUG_ON(x) BUG_ON(x) 95a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define _WARN_ON(x) WARN_ON(x) 96a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 97a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define ISP1362_REG(name, addr, width, rw) \ 98a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmannstatic isp1362_reg_t ISP1362_REG_##name = ((addr) | (width) | (rw)) 99a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 100a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define REG_ACCESS_TEST(r) BUG_ON(((r) & ISP1362_REG_WRITE_OFFSET) && !((r) & REG_ACCESS_W)) 101a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define REG_WIDTH_TEST(r, w) BUG_ON(((r) & REG_WIDTH_MASK) != (w)) 102a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#else 103a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmanntypedef const unsigned char isp1362_reg_t; 104a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define ISP1362_REG_NO(r) (r) 105a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define _BUG_ON(x) do {} while (0) 106a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define _WARN_ON(x) do {} while (0) 107a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 108a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define ISP1362_REG(name, addr, width, rw) \ 109a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmannstatic isp1362_reg_t ISP1362_REG_##name = addr 110a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 111a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define REG_ACCESS_TEST(r) do {} while (0) 112a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define REG_WIDTH_TEST(r, w) do {} while (0) 113a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#endif 114a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 115a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann/* OHCI compatible registers */ 116a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann/* 117a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann * Note: Some of the ISP1362 'OHCI' registers implement only 118a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann * a subset of the bits defined in the OHCI spec. 119a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann * 120a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann * Bitmasks for the individual bits of these registers are defined in "ohci.h" 121a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann */ 122a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar WassmannISP1362_REG(HCREVISION, 0x00, REG_WIDTH_32, REG_ACCESS_R); 123a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar WassmannISP1362_REG(HCCONTROL, 0x01, REG_WIDTH_32, REG_ACCESS_RW); 124a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar WassmannISP1362_REG(HCCMDSTAT, 0x02, REG_WIDTH_32, REG_ACCESS_RW); 125a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar WassmannISP1362_REG(HCINTSTAT, 0x03, REG_WIDTH_32, REG_ACCESS_RW); 126a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar WassmannISP1362_REG(HCINTENB, 0x04, REG_WIDTH_32, REG_ACCESS_RW); 127a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar WassmannISP1362_REG(HCINTDIS, 0x05, REG_WIDTH_32, REG_ACCESS_RW); 128a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar WassmannISP1362_REG(HCFMINTVL, 0x0d, REG_WIDTH_32, REG_ACCESS_RW); 129a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar WassmannISP1362_REG(HCFMREM, 0x0e, REG_WIDTH_32, REG_ACCESS_RW); 130a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar WassmannISP1362_REG(HCFMNUM, 0x0f, REG_WIDTH_32, REG_ACCESS_RW); 131a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar WassmannISP1362_REG(HCLSTHRESH, 0x11, REG_WIDTH_32, REG_ACCESS_RW); 132a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar WassmannISP1362_REG(HCRHDESCA, 0x12, REG_WIDTH_32, REG_ACCESS_RW); 133a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar WassmannISP1362_REG(HCRHDESCB, 0x13, REG_WIDTH_32, REG_ACCESS_RW); 134a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar WassmannISP1362_REG(HCRHSTATUS, 0x14, REG_WIDTH_32, REG_ACCESS_RW); 135a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar WassmannISP1362_REG(HCRHPORT1, 0x15, REG_WIDTH_32, REG_ACCESS_RW); 136a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar WassmannISP1362_REG(HCRHPORT2, 0x16, REG_WIDTH_32, REG_ACCESS_RW); 137a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 138a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann/* Philips ISP1362 specific registers */ 139a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar WassmannISP1362_REG(HCHWCFG, 0x20, REG_WIDTH_16, REG_ACCESS_RW); 140a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCHWCFG_DISABLE_SUSPEND (1 << 15) 141a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCHWCFG_GLOBAL_PWRDOWN (1 << 14) 1427949f4e16456183bae0bc19ffe92072a27d0553eKen MacLeod#define HCHWCFG_PULLDOWN_DS2 (1 << 13) 1437949f4e16456183bae0bc19ffe92072a27d0553eKen MacLeod#define HCHWCFG_PULLDOWN_DS1 (1 << 12) 144a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCHWCFG_CLKNOTSTOP (1 << 11) 145a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCHWCFG_ANALOG_OC (1 << 10) 146a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCHWCFG_ONEINT (1 << 9) 147a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCHWCFG_DACK_MODE (1 << 8) 148a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCHWCFG_ONEDMA (1 << 7) 149a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCHWCFG_DACK_POL (1 << 6) 150a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCHWCFG_DREQ_POL (1 << 5) 151a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCHWCFG_DBWIDTH_MASK (0x03 << 3) 152a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCHWCFG_DBWIDTH(n) (((n) << 3) & HCHWCFG_DBWIDTH_MASK) 153a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCHWCFG_INT_POL (1 << 2) 154a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCHWCFG_INT_TRIGGER (1 << 1) 155a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCHWCFG_INT_ENABLE (1 << 0) 156a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 157a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar WassmannISP1362_REG(HCDMACFG, 0x21, REG_WIDTH_16, REG_ACCESS_RW); 158a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCDMACFG_CTR_ENABLE (1 << 7) 159a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCDMACFG_BURST_LEN_MASK (0x03 << 5) 160a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCDMACFG_BURST_LEN(n) (((n) << 5) & HCDMACFG_BURST_LEN_MASK) 161a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCDMACFG_BURST_LEN_1 HCDMACFG_BURST_LEN(0) 162a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCDMACFG_BURST_LEN_4 HCDMACFG_BURST_LEN(1) 163a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCDMACFG_BURST_LEN_8 HCDMACFG_BURST_LEN(2) 164a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCDMACFG_DMA_ENABLE (1 << 4) 165a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCDMACFG_BUF_TYPE_MASK (0x07 << 1) 166a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCDMACFG_BUF_TYPE(n) (((n) << 1) & HCDMACFG_BUF_TYPE_MASK) 167a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCDMACFG_BUF_ISTL0 HCDMACFG_BUF_TYPE(0) 168a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCDMACFG_BUF_ISTL1 HCDMACFG_BUF_TYPE(1) 169a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCDMACFG_BUF_INTL HCDMACFG_BUF_TYPE(2) 170a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCDMACFG_BUF_ATL HCDMACFG_BUF_TYPE(3) 171a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCDMACFG_BUF_DIRECT HCDMACFG_BUF_TYPE(4) 172a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCDMACFG_DMA_RW_SELECT (1 << 0) 173a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 174a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar WassmannISP1362_REG(HCXFERCTR, 0x22, REG_WIDTH_16, REG_ACCESS_RW); 175a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 176a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar WassmannISP1362_REG(HCuPINT, 0x24, REG_WIDTH_16, REG_ACCESS_RW); 177a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCuPINT_SOF (1 << 0) 178a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCuPINT_ISTL0 (1 << 1) 179a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCuPINT_ISTL1 (1 << 2) 180a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCuPINT_EOT (1 << 3) 181a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCuPINT_OPR (1 << 4) 182a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCuPINT_SUSP (1 << 5) 183a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCuPINT_CLKRDY (1 << 6) 184a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCuPINT_INTL (1 << 7) 185a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCuPINT_ATL (1 << 8) 186a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCuPINT_OTG (1 << 9) 187a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 188a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar WassmannISP1362_REG(HCuPINTENB, 0x25, REG_WIDTH_16, REG_ACCESS_RW); 189a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann/* same bit definitions apply as for HCuPINT */ 190a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 191a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar WassmannISP1362_REG(HCCHIPID, 0x27, REG_WIDTH_16, REG_ACCESS_R); 192a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCCHIPID_MASK 0xff00 193a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCCHIPID_MAGIC 0x3600 194a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 195a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar WassmannISP1362_REG(HCSCRATCH, 0x28, REG_WIDTH_16, REG_ACCESS_RW); 196a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 197a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar WassmannISP1362_REG(HCSWRES, 0x29, REG_WIDTH_16, REG_ACCESS_W); 198a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCSWRES_MAGIC 0x00f6 199a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 200a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar WassmannISP1362_REG(HCBUFSTAT, 0x2c, REG_WIDTH_16, REG_ACCESS_RW); 201a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCBUFSTAT_ISTL0_FULL (1 << 0) 202a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCBUFSTAT_ISTL1_FULL (1 << 1) 203a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCBUFSTAT_INTL_ACTIVE (1 << 2) 204a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCBUFSTAT_ATL_ACTIVE (1 << 3) 205a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCBUFSTAT_RESET_HWPP (1 << 4) 206a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCBUFSTAT_ISTL0_ACTIVE (1 << 5) 207a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCBUFSTAT_ISTL1_ACTIVE (1 << 6) 208a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCBUFSTAT_ISTL0_DONE (1 << 8) 209a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCBUFSTAT_ISTL1_DONE (1 << 9) 210a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCBUFSTAT_PAIRED_PTDPP (1 << 10) 211a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 212a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar WassmannISP1362_REG(HCDIRADDR, 0x32, REG_WIDTH_32, REG_ACCESS_RW); 213a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCDIRADDR_ADDR_MASK 0x0000ffff 214a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCDIRADDR_ADDR(n) (((n) << 0) & HCDIRADDR_ADDR_MASK) 215a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCDIRADDR_COUNT_MASK 0xffff0000 216a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define HCDIRADDR_COUNT(n) (((n) << 16) & HCDIRADDR_COUNT_MASK) 217a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar WassmannISP1362_REG(HCDIRDATA, 0x45, REG_WIDTH_16, REG_ACCESS_RW); 218a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 219a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar WassmannISP1362_REG(HCISTLBUFSZ, 0x30, REG_WIDTH_16, REG_ACCESS_RW); 220a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar WassmannISP1362_REG(HCISTL0PORT, 0x40, REG_WIDTH_16, REG_ACCESS_RW); 221a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar WassmannISP1362_REG(HCISTL1PORT, 0x42, REG_WIDTH_16, REG_ACCESS_RW); 222a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar WassmannISP1362_REG(HCISTLRATE, 0x47, REG_WIDTH_16, REG_ACCESS_RW); 223a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 224a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar WassmannISP1362_REG(HCINTLBUFSZ, 0x33, REG_WIDTH_16, REG_ACCESS_RW); 225a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar WassmannISP1362_REG(HCINTLPORT, 0x43, REG_WIDTH_16, REG_ACCESS_RW); 226a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar WassmannISP1362_REG(HCINTLBLKSZ, 0x53, REG_WIDTH_16, REG_ACCESS_RW); 227a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar WassmannISP1362_REG(HCINTLDONE, 0x17, REG_WIDTH_32, REG_ACCESS_R); 228a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar WassmannISP1362_REG(HCINTLSKIP, 0x18, REG_WIDTH_32, REG_ACCESS_RW); 229a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar WassmannISP1362_REG(HCINTLLAST, 0x19, REG_WIDTH_32, REG_ACCESS_RW); 230a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar WassmannISP1362_REG(HCINTLCURR, 0x1a, REG_WIDTH_16, REG_ACCESS_R); 231a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 232a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar WassmannISP1362_REG(HCATLBUFSZ, 0x34, REG_WIDTH_16, REG_ACCESS_RW); 233a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar WassmannISP1362_REG(HCATLPORT, 0x44, REG_WIDTH_16, REG_ACCESS_RW); 234a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar WassmannISP1362_REG(HCATLBLKSZ, 0x54, REG_WIDTH_16, REG_ACCESS_RW); 235a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar WassmannISP1362_REG(HCATLDONE, 0x1b, REG_WIDTH_32, REG_ACCESS_R); 236a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar WassmannISP1362_REG(HCATLSKIP, 0x1c, REG_WIDTH_32, REG_ACCESS_RW); 237a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar WassmannISP1362_REG(HCATLLAST, 0x1d, REG_WIDTH_32, REG_ACCESS_RW); 238a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar WassmannISP1362_REG(HCATLCURR, 0x1e, REG_WIDTH_16, REG_ACCESS_R); 239a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 240a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar WassmannISP1362_REG(HCATLDTC, 0x51, REG_WIDTH_16, REG_ACCESS_RW); 241a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar WassmannISP1362_REG(HCATLDTCTO, 0x52, REG_WIDTH_16, REG_ACCESS_RW); 242a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 243a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 244a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar WassmannISP1362_REG(OTGCONTROL, 0x62, REG_WIDTH_16, REG_ACCESS_RW); 245a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar WassmannISP1362_REG(OTGSTATUS, 0x67, REG_WIDTH_16, REG_ACCESS_R); 246a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar WassmannISP1362_REG(OTGINT, 0x68, REG_WIDTH_16, REG_ACCESS_RW); 247a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar WassmannISP1362_REG(OTGINTENB, 0x69, REG_WIDTH_16, REG_ACCESS_RW); 248a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar WassmannISP1362_REG(OTGTIMER, 0x6A, REG_WIDTH_16, REG_ACCESS_RW); 249a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar WassmannISP1362_REG(OTGALTTMR, 0x6C, REG_WIDTH_16, REG_ACCESS_RW); 250a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 251a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann/* Philips transfer descriptor, cpu-endian */ 252a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmannstruct ptd { 253a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann u16 count; 254a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_COUNT_MSK (0x3ff << 0) 255a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_TOGGLE_MSK (1 << 10) 256a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_ACTIVE_MSK (1 << 11) 257a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_CC_MSK (0xf << 12) 258a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann u16 mps; 259a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_MPS_MSK (0x3ff << 0) 260a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_SPD_MSK (1 << 10) 261a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_LAST_MSK (1 << 11) 262a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_EP_MSK (0xf << 12) 263a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann u16 len; 264a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_LEN_MSK (0x3ff << 0) 265a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_DIR_MSK (3 << 10) 266a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_DIR_SETUP (0) 267a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_DIR_OUT (1) 268a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_DIR_IN (2) 269a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann u16 faddr; 270a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_FA_MSK (0x7f << 0) 271a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann/* PTD Byte 7: [StartingFrame (if ISO PTD) | StartingFrame[0..4], PollingRate[0..2] (if INT PTD)] */ 272a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_SF_ISO_MSK (0xff << 8) 273a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_SF_INT_MSK (0x1f << 8) 274a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_PR_MSK (0x07 << 13) 275a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann} __attribute__ ((packed, aligned(2))); 276a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_HEADER_SIZE sizeof(struct ptd) 277a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 278a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann/* ------------------------------------------------------------------------- */ 279a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann/* Copied from ohci.h: */ 280a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann/* 281a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann * Hardware transfer status codes -- CC from PTD 282a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann */ 283a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_CC_NOERROR 0x00 284a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_CC_CRC 0x01 285a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_CC_BITSTUFFING 0x02 286a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_CC_DATATOGGLEM 0x03 287a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_CC_STALL 0x04 288a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_DEVNOTRESP 0x05 289a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_PIDCHECKFAIL 0x06 290a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_UNEXPECTEDPID 0x07 291a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_DATAOVERRUN 0x08 292a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_DATAUNDERRUN 0x09 293a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann /* 0x0A, 0x0B reserved for hardware */ 294a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_BUFFEROVERRUN 0x0C 295a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_BUFFERUNDERRUN 0x0D 296a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann /* 0x0E, 0x0F reserved for HCD */ 297a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_NOTACCESSED 0x0F 298a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 299a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 300a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann/* map OHCI TD status codes (CC) to errno values */ 301a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmannstatic const int cc_to_error[16] = { 302a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann /* No Error */ 0, 303a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann /* CRC Error */ -EILSEQ, 304a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann /* Bit Stuff */ -EPROTO, 305a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann /* Data Togg */ -EILSEQ, 306a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann /* Stall */ -EPIPE, 307a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann /* DevNotResp */ -ETIMEDOUT, 308a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann /* PIDCheck */ -EPROTO, 309a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann /* UnExpPID */ -EPROTO, 310a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann /* DataOver */ -EOVERFLOW, 311a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann /* DataUnder */ -EREMOTEIO, 312a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann /* (for hw) */ -EIO, 313a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann /* (for hw) */ -EIO, 314a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann /* BufferOver */ -ECOMM, 315a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann /* BuffUnder */ -ENOSR, 316a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann /* (for HCD) */ -EALREADY, 317a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann /* (for HCD) */ -EALREADY 318a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann}; 319a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 320a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 321a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann/* 322a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann * HcControl (control) register masks 323a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann */ 324a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define OHCI_CTRL_HCFS (3 << 6) /* host controller functional state */ 325a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define OHCI_CTRL_RWC (1 << 9) /* remote wakeup connected */ 326a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define OHCI_CTRL_RWE (1 << 10) /* remote wakeup enable */ 327a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 328a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann/* pre-shifted values for HCFS */ 329a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann# define OHCI_USB_RESET (0 << 6) 330a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann# define OHCI_USB_RESUME (1 << 6) 331a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann# define OHCI_USB_OPER (2 << 6) 332a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann# define OHCI_USB_SUSPEND (3 << 6) 333a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 334a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann/* 335a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann * HcCommandStatus (cmdstatus) register masks 336a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann */ 337a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define OHCI_HCR (1 << 0) /* host controller reset */ 338a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define OHCI_SOC (3 << 16) /* scheduling overrun count */ 339a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 340a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann/* 341a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann * masks used with interrupt registers: 342a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann * HcInterruptStatus (intrstatus) 343a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann * HcInterruptEnable (intrenable) 344a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann * HcInterruptDisable (intrdisable) 345a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann */ 346a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define OHCI_INTR_SO (1 << 0) /* scheduling overrun */ 347a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define OHCI_INTR_WDH (1 << 1) /* writeback of done_head */ 348a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define OHCI_INTR_SF (1 << 2) /* start frame */ 349a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define OHCI_INTR_RD (1 << 3) /* resume detect */ 350a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define OHCI_INTR_UE (1 << 4) /* unrecoverable error */ 351a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define OHCI_INTR_FNO (1 << 5) /* frame number overflow */ 352a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define OHCI_INTR_RHSC (1 << 6) /* root hub status change */ 353a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define OHCI_INTR_OC (1 << 30) /* ownership change */ 354a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define OHCI_INTR_MIE (1 << 31) /* master interrupt enable */ 355a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 356a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann/* roothub.portstatus [i] bits */ 357a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define RH_PS_CCS 0x00000001 /* current connect status */ 358a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define RH_PS_PES 0x00000002 /* port enable status*/ 359a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define RH_PS_PSS 0x00000004 /* port suspend status */ 360a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define RH_PS_POCI 0x00000008 /* port over current indicator */ 361a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define RH_PS_PRS 0x00000010 /* port reset status */ 362a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define RH_PS_PPS 0x00000100 /* port power status */ 363a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define RH_PS_LSDA 0x00000200 /* low speed device attached */ 364a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define RH_PS_CSC 0x00010000 /* connect status change */ 365a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define RH_PS_PESC 0x00020000 /* port enable status change */ 366a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define RH_PS_PSSC 0x00040000 /* port suspend status change */ 367a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define RH_PS_OCIC 0x00080000 /* over current indicator change */ 368a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define RH_PS_PRSC 0x00100000 /* port reset status change */ 369a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 370a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann/* roothub.status bits */ 371a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define RH_HS_LPS 0x00000001 /* local power status */ 372a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define RH_HS_OCI 0x00000002 /* over current indicator */ 373a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define RH_HS_DRWE 0x00008000 /* device remote wakeup enable */ 374a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define RH_HS_LPSC 0x00010000 /* local power status change */ 375a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define RH_HS_OCIC 0x00020000 /* over current indicator change */ 376a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define RH_HS_CRWE 0x80000000 /* clear remote wakeup enable */ 377a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 378a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann/* roothub.b masks */ 379a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define RH_B_DR 0x0000ffff /* device removable flags */ 380a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define RH_B_PPCM 0xffff0000 /* port power control mask */ 381a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 382a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann/* roothub.a masks */ 383a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define RH_A_NDP (0xff << 0) /* number of downstream ports */ 384a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define RH_A_PSM (1 << 8) /* power switching mode */ 385a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define RH_A_NPS (1 << 9) /* no power switching */ 386a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define RH_A_DT (1 << 10) /* device type (mbz) */ 387a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define RH_A_OCPM (1 << 11) /* over current protection mode */ 388a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define RH_A_NOCP (1 << 12) /* no over current protection */ 389a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define RH_A_POTPGT (0xff << 24) /* power on to power good time */ 390a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 391a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define FI 0x2edf /* 12000 bits per frame (-1) */ 392a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define FSMP(fi) (0x7fff & ((6 * ((fi) - 210)) / 7)) 393a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define LSTHRESH 0x628 /* lowspeed bit threshold */ 394a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 395a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann/* ------------------------------------------------------------------------- */ 396a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 397a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann/* PTD accessor macros. */ 398a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_GET_COUNT(p) (((p)->count & PTD_COUNT_MSK) >> 0) 399a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_COUNT(v) (((v) << 0) & PTD_COUNT_MSK) 400a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_GET_TOGGLE(p) (((p)->count & PTD_TOGGLE_MSK) >> 10) 401a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_TOGGLE(v) (((v) << 10) & PTD_TOGGLE_MSK) 402a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_GET_ACTIVE(p) (((p)->count & PTD_ACTIVE_MSK) >> 11) 403a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_ACTIVE(v) (((v) << 11) & PTD_ACTIVE_MSK) 404a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_GET_CC(p) (((p)->count & PTD_CC_MSK) >> 12) 405a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_CC(v) (((v) << 12) & PTD_CC_MSK) 406a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_GET_MPS(p) (((p)->mps & PTD_MPS_MSK) >> 0) 407a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_MPS(v) (((v) << 0) & PTD_MPS_MSK) 408a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_GET_SPD(p) (((p)->mps & PTD_SPD_MSK) >> 10) 409a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_SPD(v) (((v) << 10) & PTD_SPD_MSK) 410a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_GET_LAST(p) (((p)->mps & PTD_LAST_MSK) >> 11) 411a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_LAST(v) (((v) << 11) & PTD_LAST_MSK) 412a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_GET_EP(p) (((p)->mps & PTD_EP_MSK) >> 12) 413a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_EP(v) (((v) << 12) & PTD_EP_MSK) 414a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_GET_LEN(p) (((p)->len & PTD_LEN_MSK) >> 0) 415a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_LEN(v) (((v) << 0) & PTD_LEN_MSK) 416a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_GET_DIR(p) (((p)->len & PTD_DIR_MSK) >> 10) 417a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_DIR(v) (((v) << 10) & PTD_DIR_MSK) 418a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_GET_FA(p) (((p)->faddr & PTD_FA_MSK) >> 0) 419a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_FA(v) (((v) << 0) & PTD_FA_MSK) 420a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_GET_SF_INT(p) (((p)->faddr & PTD_SF_INT_MSK) >> 8) 421a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_SF_INT(v) (((v) << 8) & PTD_SF_INT_MSK) 422a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_GET_SF_ISO(p) (((p)->faddr & PTD_SF_ISO_MSK) >> 8) 423a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_SF_ISO(v) (((v) << 8) & PTD_SF_ISO_MSK) 424a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_GET_PR(p) (((p)->faddr & PTD_PR_MSK) >> 13) 425a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PTD_PR(v) (((v) << 13) & PTD_PR_MSK) 426a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 427a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define LOG2_PERIODIC_SIZE 5 /* arbitrary; this matches OHCI */ 428a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define PERIODIC_SIZE (1 << LOG2_PERIODIC_SIZE) 429a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 430a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmannstruct isp1362_ep { 431a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann struct usb_host_endpoint *hep; 432a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann struct usb_device *udev; 433a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 434a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann /* philips transfer descriptor */ 435a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann struct ptd ptd; 436a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 437a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann u8 maxpacket; 438a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann u8 epnum; 439a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann u8 nextpid; 440a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann u16 error_count; 441a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann u16 length; /* of current packet */ 442a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann s16 ptd_offset; /* buffer offset in ISP1362 where 443a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann PTD has been stored 444a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann (for access thru HCDIRDATA) */ 445a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann int ptd_index; 446a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann int num_ptds; 447a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann void *data; /* to databuf */ 448a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann /* queue of active EPs (the ones transmitted to the chip) */ 449a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann struct list_head active; 450a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 451a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann /* periodic schedule */ 452a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann u8 branch; 453a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann u16 interval; 454a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann u16 load; 455a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann u16 last_iso; 456a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 457a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann /* async schedule */ 458a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann struct list_head schedule; /* list of all EPs that need processing */ 459a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann struct list_head remove_list; 460a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann int num_req; 461a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann}; 462a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 463a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmannstruct isp1362_ep_queue { 464a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann struct list_head active; /* list of PTDs currently processed by HC */ 465a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann atomic_t finishing; 466a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann unsigned long buf_map; 467a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann unsigned long skip_map; 468a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann int free_ptd; 469a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann u16 buf_start; 470a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann u16 buf_size; 471a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann u16 blk_size; /* PTD buffer block size for ATL and INTL */ 472a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann u8 buf_count; 473a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann u8 buf_avail; 474a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann char name[16]; 475a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 476a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann /* for statistical tracking */ 477a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann u8 stat_maxptds; /* Max # of ptds seen simultaneously in fifo */ 478a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann u8 ptd_count; /* number of ptds submitted to this queue */ 479a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann}; 480a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 481a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmannstruct isp1362_hcd { 482a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann spinlock_t lock; 483a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann void __iomem *addr_reg; 484a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann void __iomem *data_reg; 485a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 486a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann struct isp1362_platform_data *board; 487a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 488a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann struct proc_dir_entry *pde; 489a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann unsigned long stat1, stat2, stat4, stat8, stat16; 490a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 491a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann /* HC registers */ 492a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann u32 intenb; /* "OHCI" interrupts */ 493a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann u16 irqenb; /* uP interrupts */ 494a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 495a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann /* Root hub registers */ 496a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann u32 rhdesca; 497a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann u32 rhdescb; 498a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann u32 rhstatus; 499a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann u32 rhport[MAX_ROOT_PORTS]; 500a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann unsigned long next_statechange; 501a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 502a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann /* HC control reg shadow copy */ 503a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann u32 hc_control; 504a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 505a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann /* async schedule: control, bulk */ 506a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann struct list_head async; 507a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 508a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann /* periodic schedule: int */ 509a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann u16 load[PERIODIC_SIZE]; 510a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann struct list_head periodic; 511a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann u16 fmindex; 512a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 513a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann /* periodic schedule: isochronous */ 514a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann struct list_head isoc; 51522a627ba81e0f75b994d37adb68761a9b9ef7186Roel Kluin unsigned int istl_flip:1; 51622a627ba81e0f75b994d37adb68761a9b9ef7186Roel Kluin unsigned int irq_active:1; 517a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 518a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann /* Schedules for the current frame */ 519a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann struct isp1362_ep_queue atl_queue; 520a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann struct isp1362_ep_queue intl_queue; 521a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann struct isp1362_ep_queue istl_queue[2]; 522a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 523a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann /* list of PTDs retrieved from HC */ 524a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann struct list_head remove_list; 525a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann enum { 526a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann ISP1362_INT_SOF, 527a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann ISP1362_INT_ISTL0, 528a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann ISP1362_INT_ISTL1, 529a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann ISP1362_INT_EOT, 530a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann ISP1362_INT_OPR, 531a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann ISP1362_INT_SUSP, 532a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann ISP1362_INT_CLKRDY, 533a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann ISP1362_INT_INTL, 534a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann ISP1362_INT_ATL, 535a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann ISP1362_INT_OTG, 536a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann NUM_ISP1362_IRQS 537a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann } IRQ_NAMES; 538a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann unsigned int irq_stat[NUM_ISP1362_IRQS]; 539a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann int req_serial; 540a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann}; 541a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 542a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmannstatic inline const char *ISP1362_INT_NAME(int n) 543a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann{ 544a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann switch (n) { 545a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann case ISP1362_INT_SOF: return "SOF"; 546a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann case ISP1362_INT_ISTL0: return "ISTL0"; 547a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann case ISP1362_INT_ISTL1: return "ISTL1"; 548a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann case ISP1362_INT_EOT: return "EOT"; 549a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann case ISP1362_INT_OPR: return "OPR"; 550a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann case ISP1362_INT_SUSP: return "SUSP"; 551a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann case ISP1362_INT_CLKRDY: return "CLKRDY"; 552a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann case ISP1362_INT_INTL: return "INTL"; 553a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann case ISP1362_INT_ATL: return "ATL"; 554a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann case ISP1362_INT_OTG: return "OTG"; 555a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann default: return "unknown"; 556a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann } 557a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann} 558a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 559a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmannstatic inline void ALIGNSTAT(struct isp1362_hcd *isp1362_hcd, void *ptr) 560a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann{ 561b0a9cf297e587219332ee4acca243627702c2cc9Mike Frysinger unsigned long p = (unsigned long)ptr; 562a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann if (!(p & 0xf)) 563a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_hcd->stat16++; 564a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann else if (!(p & 0x7)) 565a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_hcd->stat8++; 566a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann else if (!(p & 0x3)) 567a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_hcd->stat4++; 568a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann else if (!(p & 0x1)) 569a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_hcd->stat2++; 570a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann else 571a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_hcd->stat1++; 572a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann} 573a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 574a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmannstatic inline struct isp1362_hcd *hcd_to_isp1362_hcd(struct usb_hcd *hcd) 575a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann{ 576a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann return (struct isp1362_hcd *) (hcd->hcd_priv); 577a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann} 578a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 579a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmannstatic inline struct usb_hcd *isp1362_hcd_to_hcd(struct isp1362_hcd *isp1362_hcd) 580a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann{ 581a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann return container_of((void *)isp1362_hcd, struct usb_hcd, hcd_priv); 582a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann} 583a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 584a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define frame_before(f1, f2) ((s16)((u16)f1 - (u16)f2) < 0) 585a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 586a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann/* 587a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann * ISP1362 HW Interface 588a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann */ 589a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 590a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#ifdef ISP1362_DEBUG 591a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define DBG(level, fmt...) \ 592a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann do { \ 593a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann if (dbg_level > level) \ 594a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann pr_debug(fmt); \ 595a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann } while (0) 596a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define _DBG(level, fmt...) \ 597a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann do { \ 598a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann if (dbg_level > level) \ 599a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann printk(fmt); \ 600a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann } while (0) 601a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#else 602a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define DBG(fmt...) do {} while (0) 603a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define _DBG DBG 604a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#endif 605a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 606a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#ifdef VERBOSE 607a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann# define VDBG(fmt...) DBG(3, fmt) 608a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#else 609a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann# define VDBG(fmt...) do {} while (0) 610a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#endif 611a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 612a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#ifdef REGISTERS 613a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann# define RDBG(fmt...) DBG(1, fmt) 614a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#else 615a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann# define RDBG(fmt...) do {} while (0) 616a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#endif 617a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 618a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#ifdef URB_TRACE 619a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define URB_DBG(fmt...) DBG(0, fmt) 620a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#else 621a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define URB_DBG(fmt...) do {} while (0) 622a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#endif 623a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 624a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 625a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#if USE_PLATFORM_DELAY 626a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#if USE_NDELAY 627a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#error USE_PLATFORM_DELAY and USE_NDELAY defined simultaneously. 628a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#endif 629a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define isp1362_delay(h, d) (h)->board->delay(isp1362_hcd_to_hcd(h)->self.controller, d) 630a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#elif USE_NDELAY 631a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define isp1362_delay(h, d) ndelay(d) 632a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#else 633a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define isp1362_delay(h, d) do {} while (0) 634a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#endif 635a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 636a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define get_urb(ep) ({ \ 637a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann BUG_ON(list_empty(&ep->hep->urb_list)); \ 638a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann container_of(ep->hep->urb_list.next, struct urb, urb_list); \ 639a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann}) 640a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 641a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann/* basic access functions for ISP1362 chip registers */ 642a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann/* NOTE: The contents of the address pointer register cannot be read back! The driver must ensure, 643a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann * that all register accesses are performed with interrupts disabled, since the interrupt 644a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann * handler has no way of restoring the previous state. 645a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann */ 646a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmannstatic void isp1362_write_addr(struct isp1362_hcd *isp1362_hcd, isp1362_reg_t reg) 647a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann{ 648a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann /*_BUG_ON((reg & ISP1362_REG_WRITE_OFFSET) && !(reg & REG_ACCESS_W));*/ 649a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann REG_ACCESS_TEST(reg); 650a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann _BUG_ON(!irqs_disabled()); 651a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann DUMMY_DELAY_ACCESS; 652a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann writew(ISP1362_REG_NO(reg), isp1362_hcd->addr_reg); 653a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann DUMMY_DELAY_ACCESS; 654a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_delay(isp1362_hcd, 1); 655a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann} 656a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 657a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmannstatic void isp1362_write_data16(struct isp1362_hcd *isp1362_hcd, u16 val) 658a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann{ 659a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann _BUG_ON(!irqs_disabled()); 660a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann DUMMY_DELAY_ACCESS; 661a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann writew(val, isp1362_hcd->data_reg); 662a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann} 663a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 664a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmannstatic u16 isp1362_read_data16(struct isp1362_hcd *isp1362_hcd) 665a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann{ 666a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann u16 val; 667a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 668a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann _BUG_ON(!irqs_disabled()); 669a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann DUMMY_DELAY_ACCESS; 670a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann val = readw(isp1362_hcd->data_reg); 671a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 672a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann return val; 673a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann} 674a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 675a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmannstatic void isp1362_write_data32(struct isp1362_hcd *isp1362_hcd, u32 val) 676a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann{ 677a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann _BUG_ON(!irqs_disabled()); 678a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#if USE_32BIT 679a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann DUMMY_DELAY_ACCESS; 680a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann writel(val, isp1362_hcd->data_reg); 681a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#else 682a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann DUMMY_DELAY_ACCESS; 683a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann writew((u16)val, isp1362_hcd->data_reg); 684a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann DUMMY_DELAY_ACCESS; 685a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann writew(val >> 16, isp1362_hcd->data_reg); 686a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#endif 687a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann} 688a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 689a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmannstatic u32 isp1362_read_data32(struct isp1362_hcd *isp1362_hcd) 690a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann{ 691a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann u32 val; 692a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 693a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann _BUG_ON(!irqs_disabled()); 694a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#if USE_32BIT 695a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann DUMMY_DELAY_ACCESS; 696a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann val = readl(isp1362_hcd->data_reg); 697a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#else 698a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann DUMMY_DELAY_ACCESS; 699a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann val = (u32)readw(isp1362_hcd->data_reg); 700a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann DUMMY_DELAY_ACCESS; 701a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann val |= (u32)readw(isp1362_hcd->data_reg) << 16; 702a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#endif 703a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann return val; 704a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann} 705a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 706a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann/* use readsw/writesw to access the fifo whenever possible */ 707a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann/* assume HCDIRDATA or XFERCTR & addr_reg have been set up */ 708a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmannstatic void isp1362_read_fifo(struct isp1362_hcd *isp1362_hcd, void *buf, u16 len) 709a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann{ 710a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann u8 *dp = buf; 711a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann u16 data; 712a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 713a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann if (!len) 714a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann return; 715a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 716a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann _BUG_ON(!irqs_disabled()); 717a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 718a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann RDBG("%s: Reading %d byte from fifo to mem @ %p\n", __func__, len, buf); 719a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#if USE_32BIT 720a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann if (len >= 4) { 721a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann RDBG("%s: Using readsl for %d dwords\n", __func__, len >> 2); 722a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann readsl(isp1362_hcd->data_reg, dp, len >> 2); 723a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann dp += len & ~3; 724a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann len &= 3; 725a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann } 726a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#endif 727a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann if (len >= 2) { 728a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann RDBG("%s: Using readsw for %d words\n", __func__, len >> 1); 729a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann insw((unsigned long)isp1362_hcd->data_reg, dp, len >> 1); 730a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann dp += len & ~1; 731a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann len &= 1; 732a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann } 733a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 734a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann BUG_ON(len & ~1); 735a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann if (len > 0) { 736a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann data = isp1362_read_data16(isp1362_hcd); 737a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann RDBG("%s: Reading trailing byte %02x to mem @ %08x\n", __func__, 738a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann (u8)data, (u32)dp); 739a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann *dp = (u8)data; 740a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann } 741a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann} 742a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 743a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmannstatic void isp1362_write_fifo(struct isp1362_hcd *isp1362_hcd, void *buf, u16 len) 744a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann{ 745a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann u8 *dp = buf; 746a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann u16 data; 747a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 748a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann if (!len) 749a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann return; 750a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 751b0a9cf297e587219332ee4acca243627702c2cc9Mike Frysinger if ((unsigned long)dp & 0x1) { 752a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann /* not aligned */ 753a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann for (; len > 1; len -= 2) { 754a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann data = *dp++; 755a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann data |= *dp++ << 8; 756a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_write_data16(isp1362_hcd, data); 757a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann } 758a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann if (len) 759a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_write_data16(isp1362_hcd, *dp); 760a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann return; 761a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann } 762a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 763a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann _BUG_ON(!irqs_disabled()); 764a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 765a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann RDBG("%s: Writing %d byte to fifo from memory @%p\n", __func__, len, buf); 766a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#if USE_32BIT 767a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann if (len >= 4) { 768a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann RDBG("%s: Using writesl for %d dwords\n", __func__, len >> 2); 769a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann writesl(isp1362_hcd->data_reg, dp, len >> 2); 770a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann dp += len & ~3; 771a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann len &= 3; 772a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann } 773a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#endif 774a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann if (len >= 2) { 775a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann RDBG("%s: Using writesw for %d words\n", __func__, len >> 1); 776a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann outsw((unsigned long)isp1362_hcd->data_reg, dp, len >> 1); 777a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann dp += len & ~1; 778a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann len &= 1; 779a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann } 780a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 781a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann BUG_ON(len & ~1); 782a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann if (len > 0) { 783a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann /* finally write any trailing byte; we don't need to care 784a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann * about the high byte of the last word written 785a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann */ 786a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann data = (u16)*dp; 787a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann RDBG("%s: Sending trailing byte %02x from mem @ %08x\n", __func__, 788a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann data, (u32)dp); 789a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_write_data16(isp1362_hcd, data); 790a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann } 791a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann} 792a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 793a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define isp1362_read_reg16(d, r) ({ \ 794a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann u16 __v; \ 795a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann REG_WIDTH_TEST(ISP1362_REG_##r, REG_WIDTH_16); \ 796a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_write_addr(d, ISP1362_REG_##r); \ 797a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann __v = isp1362_read_data16(d); \ 798a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann RDBG("%s: Read %04x from %s[%02x]\n", __func__, __v, #r, \ 799a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann ISP1362_REG_NO(ISP1362_REG_##r)); \ 800a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann __v; \ 801a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann}) 802a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 803a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define isp1362_read_reg32(d, r) ({ \ 804a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann u32 __v; \ 805a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann REG_WIDTH_TEST(ISP1362_REG_##r, REG_WIDTH_32); \ 806a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_write_addr(d, ISP1362_REG_##r); \ 807a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann __v = isp1362_read_data32(d); \ 808a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann RDBG("%s: Read %08x from %s[%02x]\n", __func__, __v, #r, \ 809a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann ISP1362_REG_NO(ISP1362_REG_##r)); \ 810a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann __v; \ 811a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann}) 812a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 813a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define isp1362_write_reg16(d, r, v) { \ 814a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann REG_WIDTH_TEST(ISP1362_REG_##r, REG_WIDTH_16); \ 815a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_write_addr(d, (ISP1362_REG_##r) | ISP1362_REG_WRITE_OFFSET); \ 816a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_write_data16(d, (u16)(v)); \ 817a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann RDBG("%s: Wrote %04x to %s[%02x]\n", __func__, (u16)(v), #r, \ 818a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann ISP1362_REG_NO(ISP1362_REG_##r)); \ 819a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann} 820a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 821a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define isp1362_write_reg32(d, r, v) { \ 822a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann REG_WIDTH_TEST(ISP1362_REG_##r, REG_WIDTH_32); \ 823a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_write_addr(d, (ISP1362_REG_##r) | ISP1362_REG_WRITE_OFFSET); \ 824a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_write_data32(d, (u32)(v)); \ 825a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann RDBG("%s: Wrote %08x to %s[%02x]\n", __func__, (u32)(v), #r, \ 826a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann ISP1362_REG_NO(ISP1362_REG_##r)); \ 827a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann} 828a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 829a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define isp1362_set_mask16(d, r, m) { \ 830a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann u16 __v; \ 831a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann __v = isp1362_read_reg16(d, r); \ 832a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann if ((__v | m) != __v) \ 833a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_write_reg16(d, r, __v | m); \ 834a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann} 835a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 836a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define isp1362_clr_mask16(d, r, m) { \ 837a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann u16 __v; \ 838a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann __v = isp1362_read_reg16(d, r); \ 839a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann if ((__v & ~m) != __v) \ 840a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_write_reg16(d, r, __v & ~m); \ 841a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann} 842a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 843a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define isp1362_set_mask32(d, r, m) { \ 844a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann u32 __v; \ 845a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann __v = isp1362_read_reg32(d, r); \ 846a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann if ((__v | m) != __v) \ 847a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_write_reg32(d, r, __v | m); \ 848a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann} 849a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 850a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define isp1362_clr_mask32(d, r, m) { \ 851a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann u32 __v; \ 852a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann __v = isp1362_read_reg32(d, r); \ 853a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann if ((__v & ~m) != __v) \ 854a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_write_reg32(d, r, __v & ~m); \ 855a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann} 856a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 857a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#ifdef ISP1362_DEBUG 858a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define isp1362_show_reg(d, r) { \ 859a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann if ((ISP1362_REG_##r & REG_WIDTH_MASK) == REG_WIDTH_32) \ 860a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann DBG(0, "%-12s[%02x]: %08x\n", #r, \ 861a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann ISP1362_REG_NO(ISP1362_REG_##r), isp1362_read_reg32(d, r)); \ 862a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann else \ 863a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann DBG(0, "%-12s[%02x]: %04x\n", #r, \ 864a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann ISP1362_REG_NO(ISP1362_REG_##r), isp1362_read_reg16(d, r)); \ 865a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann} 866a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#else 867a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define isp1362_show_reg(d, r) do {} while (0) 868a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#endif 869a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 870a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmannstatic void __attribute__((__unused__)) isp1362_show_regs(struct isp1362_hcd *isp1362_hcd) 871a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann{ 872a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_show_reg(isp1362_hcd, HCREVISION); 873a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_show_reg(isp1362_hcd, HCCONTROL); 874a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_show_reg(isp1362_hcd, HCCMDSTAT); 875a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_show_reg(isp1362_hcd, HCINTSTAT); 876a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_show_reg(isp1362_hcd, HCINTENB); 877a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_show_reg(isp1362_hcd, HCFMINTVL); 878a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_show_reg(isp1362_hcd, HCFMREM); 879a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_show_reg(isp1362_hcd, HCFMNUM); 880a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_show_reg(isp1362_hcd, HCLSTHRESH); 881a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_show_reg(isp1362_hcd, HCRHDESCA); 882a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_show_reg(isp1362_hcd, HCRHDESCB); 883a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_show_reg(isp1362_hcd, HCRHSTATUS); 884a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_show_reg(isp1362_hcd, HCRHPORT1); 885a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_show_reg(isp1362_hcd, HCRHPORT2); 886a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 887a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_show_reg(isp1362_hcd, HCHWCFG); 888a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_show_reg(isp1362_hcd, HCDMACFG); 889a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_show_reg(isp1362_hcd, HCXFERCTR); 890a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_show_reg(isp1362_hcd, HCuPINT); 891a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 892a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann if (in_interrupt()) 893a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann DBG(0, "%-12s[%02x]: %04x\n", "HCuPINTENB", 894a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann ISP1362_REG_NO(ISP1362_REG_HCuPINTENB), isp1362_hcd->irqenb); 895a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann else 896a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_show_reg(isp1362_hcd, HCuPINTENB); 897a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_show_reg(isp1362_hcd, HCCHIPID); 898a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_show_reg(isp1362_hcd, HCSCRATCH); 899a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_show_reg(isp1362_hcd, HCBUFSTAT); 900a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_show_reg(isp1362_hcd, HCDIRADDR); 901a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann /* Access would advance fifo 902a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann * isp1362_show_reg(isp1362_hcd, HCDIRDATA); 903a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann */ 904a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_show_reg(isp1362_hcd, HCISTLBUFSZ); 905a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_show_reg(isp1362_hcd, HCISTLRATE); 906a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_show_reg(isp1362_hcd, HCINTLBUFSZ); 907a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_show_reg(isp1362_hcd, HCINTLBLKSZ); 908a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_show_reg(isp1362_hcd, HCINTLDONE); 909a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_show_reg(isp1362_hcd, HCINTLSKIP); 910a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_show_reg(isp1362_hcd, HCINTLLAST); 911a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_show_reg(isp1362_hcd, HCINTLCURR); 912a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_show_reg(isp1362_hcd, HCATLBUFSZ); 913a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_show_reg(isp1362_hcd, HCATLBLKSZ); 914a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann /* only valid after ATL_DONE interrupt 915a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann * isp1362_show_reg(isp1362_hcd, HCATLDONE); 916a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann */ 917a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_show_reg(isp1362_hcd, HCATLSKIP); 918a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_show_reg(isp1362_hcd, HCATLLAST); 919a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_show_reg(isp1362_hcd, HCATLCURR); 920a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_show_reg(isp1362_hcd, HCATLDTC); 921a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_show_reg(isp1362_hcd, HCATLDTCTO); 922a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann} 923a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 924a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmannstatic void isp1362_write_diraddr(struct isp1362_hcd *isp1362_hcd, u16 offset, u16 len) 925a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann{ 926a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann _BUG_ON(offset & 1); 927a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann _BUG_ON(offset >= ISP1362_BUF_SIZE); 928a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann _BUG_ON(len > ISP1362_BUF_SIZE); 929a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann _BUG_ON(offset + len > ISP1362_BUF_SIZE); 930a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann len = (len + 1) & ~1; 931a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 932a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_clr_mask16(isp1362_hcd, HCDMACFG, HCDMACFG_CTR_ENABLE); 933a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_write_reg32(isp1362_hcd, HCDIRADDR, 934a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann HCDIRADDR_ADDR(offset) | HCDIRADDR_COUNT(len)); 935a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann} 936a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 937a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmannstatic void isp1362_read_buffer(struct isp1362_hcd *isp1362_hcd, void *buf, u16 offset, int len) 938a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann{ 939a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann _BUG_ON(offset & 1); 940a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 941a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_write_diraddr(isp1362_hcd, offset, len); 942a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 943b0a9cf297e587219332ee4acca243627702c2cc9Mike Frysinger DBG(3, "%s: Reading %d byte from buffer @%04x to memory @ %p\n", 944b0a9cf297e587219332ee4acca243627702c2cc9Mike Frysinger __func__, len, offset, buf); 945a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 946a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_write_reg16(isp1362_hcd, HCuPINT, HCuPINT_EOT); 947a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann _WARN_ON((isp1362_read_reg16(isp1362_hcd, HCuPINT) & HCuPINT_EOT)); 948a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 949a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_write_addr(isp1362_hcd, ISP1362_REG_HCDIRDATA); 950a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 951a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_read_fifo(isp1362_hcd, buf, len); 952a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann _WARN_ON(!(isp1362_read_reg16(isp1362_hcd, HCuPINT) & HCuPINT_EOT)); 953a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_write_reg16(isp1362_hcd, HCuPINT, HCuPINT_EOT); 954a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann _WARN_ON((isp1362_read_reg16(isp1362_hcd, HCuPINT) & HCuPINT_EOT)); 955a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann} 956a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 957a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmannstatic void isp1362_write_buffer(struct isp1362_hcd *isp1362_hcd, void *buf, u16 offset, int len) 958a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann{ 959a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann _BUG_ON(offset & 1); 960a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 961a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_write_diraddr(isp1362_hcd, offset, len); 962a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 963b0a9cf297e587219332ee4acca243627702c2cc9Mike Frysinger DBG(3, "%s: Writing %d byte to buffer @%04x from memory @ %p\n", 964b0a9cf297e587219332ee4acca243627702c2cc9Mike Frysinger __func__, len, offset, buf); 965a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 966a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_write_reg16(isp1362_hcd, HCuPINT, HCuPINT_EOT); 967a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann _WARN_ON((isp1362_read_reg16(isp1362_hcd, HCuPINT) & HCuPINT_EOT)); 968a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 969a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_write_addr(isp1362_hcd, ISP1362_REG_HCDIRDATA | ISP1362_REG_WRITE_OFFSET); 970a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_write_fifo(isp1362_hcd, buf, len); 971a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 972a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann _WARN_ON(!(isp1362_read_reg16(isp1362_hcd, HCuPINT) & HCuPINT_EOT)); 973a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann isp1362_write_reg16(isp1362_hcd, HCuPINT, HCuPINT_EOT); 974a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann _WARN_ON((isp1362_read_reg16(isp1362_hcd, HCuPINT) & HCuPINT_EOT)); 975a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann} 976a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 977a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmannstatic void __attribute__((unused)) dump_data(char *buf, int len) 978a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann{ 979a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann if (dbg_level > 0) { 980a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann int k; 981a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann int lf = 0; 982a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 983a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann for (k = 0; k < len; ++k) { 984a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann if (!lf) 985a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann DBG(0, "%04x:", k); 986a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann printk(" %02x", ((u8 *) buf)[k]); 987a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann lf = 1; 988a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann if (!k) 989a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann continue; 990a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann if (k % 16 == 15) { 991a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann printk("\n"); 992a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann lf = 0; 993a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann continue; 994a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann } 995a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann if (k % 8 == 7) 996a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann printk(" "); 997a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann if (k % 4 == 3) 998a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann printk(" "); 999a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann } 1000a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann if (lf) 1001a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann printk("\n"); 1002a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann } 1003a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann} 1004a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 1005a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#if defined(ISP1362_DEBUG) && defined(PTD_TRACE) 1006a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 1007a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmannstatic void dump_ptd(struct ptd *ptd) 1008a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann{ 1009a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann DBG(0, "EP %p: CC=%x EP=%d DIR=%x CNT=%d LEN=%d MPS=%d TGL=%x ACT=%x FA=%d SPD=%x SF=%x PR=%x LST=%x\n", 1010a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann container_of(ptd, struct isp1362_ep, ptd), 1011a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann PTD_GET_CC(ptd), PTD_GET_EP(ptd), PTD_GET_DIR(ptd), 1012a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann PTD_GET_COUNT(ptd), PTD_GET_LEN(ptd), PTD_GET_MPS(ptd), 1013a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann PTD_GET_TOGGLE(ptd), PTD_GET_ACTIVE(ptd), PTD_GET_FA(ptd), 1014a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann PTD_GET_SPD(ptd), PTD_GET_SF_INT(ptd), PTD_GET_PR(ptd), PTD_GET_LAST(ptd)); 1015a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann DBG(0, " %04x %04x %04x %04x\n", ptd->count, ptd->mps, ptd->len, ptd->faddr); 1016a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann} 1017a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 1018a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmannstatic void dump_ptd_out_data(struct ptd *ptd, u8 *buf) 1019a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann{ 1020a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann if (dbg_level > 0) { 1021a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann if (PTD_GET_DIR(ptd) != PTD_DIR_IN && PTD_GET_LEN(ptd)) { 1022a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann DBG(0, "--out->\n"); 1023a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann dump_data(buf, PTD_GET_LEN(ptd)); 1024a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann } 1025a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann } 1026a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann} 1027a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 1028a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmannstatic void dump_ptd_in_data(struct ptd *ptd, u8 *buf) 1029a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann{ 1030a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann if (dbg_level > 0) { 1031a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann if (PTD_GET_DIR(ptd) == PTD_DIR_IN && PTD_GET_COUNT(ptd)) { 1032a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann DBG(0, "<--in--\n"); 1033a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann dump_data(buf, PTD_GET_COUNT(ptd)); 1034a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann } 1035a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann DBG(0, "-----\n"); 1036a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann } 1037a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann} 1038a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 1039a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmannstatic void dump_ptd_queue(struct isp1362_ep_queue *epq) 1040a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann{ 1041a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann struct isp1362_ep *ep; 1042a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann int dbg = dbg_level; 1043a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann 1044a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann dbg_level = 1; 1045a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann list_for_each_entry(ep, &epq->active, active) { 1046a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann dump_ptd(&ep->ptd); 1047a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann dump_data(ep->data, ep->length); 1048a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann } 1049a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann dbg_level = dbg; 1050a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann} 1051a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#else 1052a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define dump_ptd(ptd) do {} while (0) 1053a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define dump_ptd_in_data(ptd, buf) do {} while (0) 1054a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define dump_ptd_out_data(ptd, buf) do {} while (0) 1055a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define dump_ptd_data(ptd, buf) do {} while (0) 1056a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#define dump_ptd_queue(epq) do {} while (0) 1057a9d43091c5be1e7a60d5abe84be4f3050236b26aLothar Wassmann#endif 1058