yenta.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:24k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * Regular lowlevel cardbus driver ("yenta")
  3.  *
  4.  * (C) Copyright 1999, 2000 Linus Torvalds
  5.  */
  6. #include <linux/init.h>
  7. #include <linux/pci.h>
  8. #include <linux/sched.h>
  9. #include <linux/interrupt.h>
  10. #include <linux/delay.h>
  11. #include <linux/module.h>
  12. #include <pcmcia/version.h>
  13. #include <pcmcia/cs_types.h>
  14. #include <pcmcia/ss.h>
  15. #include <pcmcia/cs.h>
  16. #include <asm/io.h>
  17. #include "yenta.h"
  18. #include "i82365.h"
  19. #if 0
  20. #define DEBUG(x,args...) printk(__FUNCTION__ ": " x,##args)
  21. #else
  22. #define DEBUG(x,args...)
  23. #endif
  24. /* Don't ask.. */
  25. #define to_cycles(ns) ((ns)/120)
  26. #define to_ns(cycles) ((cycles)*120)
  27. /*
  28.  * Generate easy-to-use ways of reading a cardbus sockets
  29.  * regular memory space ("cb_xxx"), configuration space
  30.  * ("config_xxx") and compatibility space ("exca_xxxx")
  31.  */
  32. static inline u32 cb_readl(pci_socket_t *socket, unsigned reg)
  33. {
  34. u32 val = readl(socket->base + reg);
  35. DEBUG("%p %04x %08xn", socket, reg, val);
  36. return val;
  37. }
  38. static inline void cb_writel(pci_socket_t *socket, unsigned reg, u32 val)
  39. {
  40. DEBUG("%p %04x %08xn", socket, reg, val);
  41. writel(val, socket->base + reg);
  42. }
  43. static inline u8 config_readb(pci_socket_t *socket, unsigned offset)
  44. {
  45. u8 val;
  46. pci_read_config_byte(socket->dev, offset, &val);
  47. DEBUG("%p %04x %02xn", socket, offset, val);
  48. return val;
  49. }
  50. static inline u16 config_readw(pci_socket_t *socket, unsigned offset)
  51. {
  52. u16 val;
  53. pci_read_config_word(socket->dev, offset, &val);
  54. DEBUG("%p %04x %04xn", socket, offset, val);
  55. return val;
  56. }
  57. static inline u32 config_readl(pci_socket_t *socket, unsigned offset)
  58. {
  59. u32 val;
  60. pci_read_config_dword(socket->dev, offset, &val);
  61. DEBUG("%p %04x %08xn", socket, offset, val);
  62. return val;
  63. }
  64. static inline void config_writeb(pci_socket_t *socket, unsigned offset, u8 val)
  65. {
  66. DEBUG("%p %04x %02xn", socket, offset, val);
  67. pci_write_config_byte(socket->dev, offset, val);
  68. }
  69. static inline void config_writew(pci_socket_t *socket, unsigned offset, u16 val)
  70. {
  71. DEBUG("%p %04x %04xn", socket, offset, val);
  72. pci_write_config_word(socket->dev, offset, val);
  73. }
  74. static inline void config_writel(pci_socket_t *socket, unsigned offset, u32 val)
  75. {
  76. DEBUG("%p %04x %08xn", socket, offset, val);
  77. pci_write_config_dword(socket->dev, offset, val);
  78. }
  79. static inline u8 exca_readb(pci_socket_t *socket, unsigned reg)
  80. {
  81. u8 val = readb(socket->base + 0x800 + reg);
  82. DEBUG("%p %04x %02xn", socket, reg, val);
  83. return val;
  84. }
  85. static inline u8 exca_readw(pci_socket_t *socket, unsigned reg)
  86. {
  87. u16 val;
  88. val = readb(socket->base + 0x800 + reg);
  89. val |= readb(socket->base + 0x800 + reg + 1) << 8;
  90. DEBUG("%p %04x %04xn", socket, reg, val);
  91. return val;
  92. }
  93. static inline void exca_writeb(pci_socket_t *socket, unsigned reg, u8 val)
  94. {
  95. DEBUG("%p %04x %02xn", socket, reg, val);
  96. writeb(val, socket->base + 0x800 + reg);
  97. }
  98. static void exca_writew(pci_socket_t *socket, unsigned reg, u16 val)
  99. {
  100. DEBUG("%p %04x %04xn", socket, reg, val);
  101. writeb(val, socket->base + 0x800 + reg);
  102. writeb(val >> 8, socket->base + 0x800 + reg + 1);
  103. }
  104. /*
  105.  * Ugh, mixed-mode cardbus and 16-bit pccard state: things depend
  106.  * on what kind of card is inserted..
  107.  */
  108. static int yenta_get_status(pci_socket_t *socket, unsigned int *value)
  109. {
  110. unsigned int val;
  111. u32 state = cb_readl(socket, CB_SOCKET_STATE);
  112. val  = (state & CB_3VCARD) ? SS_3VCARD : 0;
  113. val |= (state & CB_XVCARD) ? SS_XVCARD : 0;
  114. val |= (state & (CB_CDETECT1 | CB_CDETECT2 | CB_5VCARD | CB_3VCARD
  115.  | CB_XVCARD | CB_YVCARD)) ? 0 : SS_PENDING;
  116. if (state & CB_CBCARD) {
  117. val |= SS_CARDBUS;
  118. val |= (state & CB_CARDSTS) ? SS_STSCHG : 0;
  119. val |= (state & (CB_CDETECT1 | CB_CDETECT2)) ? 0 : SS_DETECT;
  120. val |= (state & CB_PWRCYCLE) ? SS_POWERON | SS_READY : 0;
  121. } else {
  122. u8 status = exca_readb(socket, I365_STATUS);
  123. val |= ((status & I365_CS_DETECT) == I365_CS_DETECT) ? SS_DETECT : 0;
  124. if (exca_readb(socket, I365_INTCTL) & I365_PC_IOCARD) {
  125. val |= (status & I365_CS_STSCHG) ? 0 : SS_STSCHG;
  126. } else {
  127. val |= (status & I365_CS_BVD1) ? 0 : SS_BATDEAD;
  128. val |= (status & I365_CS_BVD2) ? 0 : SS_BATWARN;
  129. }
  130. val |= (status & I365_CS_WRPROT) ? SS_WRPROT : 0;
  131. val |= (status & I365_CS_READY) ? SS_READY : 0;
  132. val |= (status & I365_CS_POWERON) ? SS_POWERON : 0;
  133. }
  134. *value = val;
  135. return 0;
  136. }
  137. static int yenta_Vcc_power(u32 control)
  138. {
  139. switch (control & CB_SC_VCC_MASK) {
  140. case CB_SC_VCC_5V: return 50;
  141. case CB_SC_VCC_3V: return 33;
  142. default: return 0;
  143. }
  144. }
  145. static int yenta_Vpp_power(u32 control)
  146. {
  147. switch (control & CB_SC_VPP_MASK) {
  148. case CB_SC_VPP_12V: return 120;
  149. case CB_SC_VPP_5V: return 50;
  150. case CB_SC_VPP_3V: return 33;
  151. default: return 0;
  152. }
  153. }
  154. static int yenta_get_socket(pci_socket_t *socket, socket_state_t *state)
  155. {
  156. u8 reg;
  157. u32 control;
  158. control = cb_readl(socket, CB_SOCKET_CONTROL);
  159. state->Vcc = yenta_Vcc_power(control);
  160. state->Vpp = yenta_Vpp_power(control);
  161. state->io_irq = socket->io_irq;
  162. if (cb_readl(socket, CB_SOCKET_STATE) & CB_CBCARD) {
  163. u16 bridge = config_readw(socket, CB_BRIDGE_CONTROL);
  164. if (bridge & CB_BRIDGE_CRST)
  165. state->flags |= SS_RESET;
  166. return 0;
  167. }
  168. /* 16-bit card state.. */
  169. reg = exca_readb(socket, I365_POWER);
  170. state->flags = (reg & I365_PWR_AUTO) ? SS_PWR_AUTO : 0;
  171. state->flags |= (reg & I365_PWR_OUT) ? SS_OUTPUT_ENA : 0;
  172. reg = exca_readb(socket, I365_INTCTL);
  173. state->flags |= (reg & I365_PC_RESET) ? 0 : SS_RESET;
  174. state->flags |= (reg & I365_PC_IOCARD) ? SS_IOCARD : 0;
  175. reg = exca_readb(socket, I365_CSCINT);
  176. state->csc_mask = (reg & I365_CSC_DETECT) ? SS_DETECT : 0;
  177. if (state->flags & SS_IOCARD) {
  178. state->csc_mask |= (reg & I365_CSC_STSCHG) ? SS_STSCHG : 0;
  179. } else {
  180. state->csc_mask |= (reg & I365_CSC_BVD1) ? SS_BATDEAD : 0;
  181. state->csc_mask |= (reg & I365_CSC_BVD2) ? SS_BATWARN : 0;
  182. state->csc_mask |= (reg & I365_CSC_READY) ? SS_READY : 0;
  183. }
  184. return 0;
  185. }
  186. static void yenta_set_power(pci_socket_t *socket, socket_state_t *state)
  187. {
  188. u32 reg = 0; /* CB_SC_STPCLK? */
  189. switch (state->Vcc) {
  190. case 33: reg = CB_SC_VCC_3V; break;
  191. case 50: reg = CB_SC_VCC_5V; break;
  192. default: reg = 0; break;
  193. }
  194. switch (state->Vpp) {
  195. case 33:  reg |= CB_SC_VPP_3V; break;
  196. case 50:  reg |= CB_SC_VPP_5V; break;
  197. case 120: reg |= CB_SC_VPP_12V; break;
  198. }
  199. if (reg != cb_readl(socket, CB_SOCKET_CONTROL))
  200. cb_writel(socket, CB_SOCKET_CONTROL, reg);
  201. }
  202. static int yenta_set_socket(pci_socket_t *socket, socket_state_t *state)
  203. {
  204. u16 bridge;
  205. if (state->flags & SS_DEBOUNCED) {
  206. /* The insertion debounce period has ended.  Clear any pending insertion events */
  207. socket->events &= ~SS_DETECT;
  208. state->flags &= ~SS_DEBOUNCED; /* SS_DEBOUNCED is oneshot */
  209. }
  210. yenta_set_power(socket, state);
  211. socket->io_irq = state->io_irq;
  212. bridge = config_readw(socket, CB_BRIDGE_CONTROL) & ~(CB_BRIDGE_CRST | CB_BRIDGE_INTR);
  213. if (cb_readl(socket, CB_SOCKET_STATE) & CB_CBCARD) {
  214. u8 intr;
  215. bridge |= (state->flags & SS_RESET) ? CB_BRIDGE_CRST : 0;
  216. /* ISA interrupt control? */
  217. intr = exca_readb(socket, I365_INTCTL);
  218. intr = (intr & ~0xf);
  219. if (!socket->cb_irq) {
  220. intr |= state->io_irq;
  221. bridge |= CB_BRIDGE_INTR;
  222. }
  223. exca_writeb(socket, I365_INTCTL, intr);
  224. }  else {
  225. u8 reg;
  226. reg = exca_readb(socket, I365_INTCTL) & (I365_RING_ENA | I365_INTR_ENA);
  227. reg |= (state->flags & SS_RESET) ? 0 : I365_PC_RESET;
  228. reg |= (state->flags & SS_IOCARD) ? I365_PC_IOCARD : 0;
  229. if (state->io_irq != socket->cb_irq) {
  230. reg |= state->io_irq;
  231. bridge |= CB_BRIDGE_INTR;
  232. }
  233. exca_writeb(socket, I365_INTCTL, reg);
  234. reg = exca_readb(socket, I365_POWER) & (I365_VCC_MASK|I365_VPP1_MASK);
  235. reg |= I365_PWR_NORESET;
  236. if (state->flags & SS_PWR_AUTO) reg |= I365_PWR_AUTO;
  237. if (state->flags & SS_OUTPUT_ENA) reg |= I365_PWR_OUT;
  238. if (exca_readb(socket, I365_POWER) != reg)
  239. exca_writeb(socket, I365_POWER, reg);
  240. /* CSC interrupt: no ISA irq for CSC */
  241. reg = I365_CSC_DETECT;
  242. if (state->flags & SS_IOCARD) {
  243. if (state->csc_mask & SS_STSCHG) reg |= I365_CSC_STSCHG;
  244. } else {
  245. if (state->csc_mask & SS_BATDEAD) reg |= I365_CSC_BVD1;
  246. if (state->csc_mask & SS_BATWARN) reg |= I365_CSC_BVD2;
  247. if (state->csc_mask & SS_READY) reg |= I365_CSC_READY;
  248. }
  249. exca_writeb(socket, I365_CSCINT, reg);
  250. exca_readb(socket, I365_CSC);
  251. if(socket->zoom_video)
  252. socket->zoom_video(socket, state->flags & SS_ZVCARD);
  253. }
  254. config_writew(socket, CB_BRIDGE_CONTROL, bridge);
  255. /* Socket event mask: get card insert/remove events.. */
  256. cb_writel(socket, CB_SOCKET_EVENT, -1);
  257. cb_writel(socket, CB_SOCKET_MASK, CB_CDMASK);
  258. return 0;
  259. }
  260. static int yenta_get_io_map(pci_socket_t *socket, struct pccard_io_map *io)
  261. {
  262. int map;
  263. unsigned char ioctl, addr;
  264. map = io->map;
  265. if (map > 1)
  266. return -EINVAL;
  267. io->start = exca_readw(socket, I365_IO(map)+I365_W_START);
  268. io->stop = exca_readw(socket, I365_IO(map)+I365_W_STOP);
  269. ioctl = exca_readb(socket, I365_IOCTL);
  270. addr = exca_readb(socket, I365_ADDRWIN);
  271. io->speed = to_ns(ioctl & I365_IOCTL_WAIT(map)) ? 1 : 0;
  272. io->flags  = (addr & I365_ENA_IO(map)) ? MAP_ACTIVE : 0;
  273. io->flags |= (ioctl & I365_IOCTL_0WS(map)) ? MAP_0WS : 0;
  274. io->flags |= (ioctl & I365_IOCTL_16BIT(map)) ? MAP_16BIT : 0;
  275. io->flags |= (ioctl & I365_IOCTL_IOCS16(map)) ? MAP_AUTOSZ : 0;
  276. return 0;
  277. }
  278. static int yenta_set_io_map(pci_socket_t *socket, struct pccard_io_map *io)
  279. {
  280. int map;
  281. unsigned char ioctl, addr, enable;
  282. map = io->map;
  283. if (map > 1)
  284. return -EINVAL;
  285. enable = I365_ENA_IO(map);
  286. addr = exca_readb(socket, I365_ADDRWIN);
  287. /* Disable the window before changing it.. */
  288. if (addr & enable) {
  289. addr &= ~enable;
  290. exca_writeb(socket, I365_ADDRWIN, addr);
  291. }
  292. exca_writew(socket, I365_IO(map)+I365_W_START, io->start);
  293. exca_writew(socket, I365_IO(map)+I365_W_STOP, io->stop);
  294. ioctl = exca_readb(socket, I365_IOCTL) & ~I365_IOCTL_MASK(map);
  295. if (io->flags & MAP_0WS) ioctl |= I365_IOCTL_0WS(map);
  296. if (io->flags & MAP_16BIT) ioctl |= I365_IOCTL_16BIT(map);
  297. if (io->flags & MAP_AUTOSZ) ioctl |= I365_IOCTL_IOCS16(map);
  298. exca_writeb(socket, I365_IOCTL, ioctl);
  299. if (io->flags & MAP_ACTIVE)
  300. exca_writeb(socket, I365_ADDRWIN, addr | enable);
  301. return 0;
  302. }
  303. static int yenta_get_mem_map(pci_socket_t *socket, struct pccard_mem_map *mem)
  304. {
  305. int map;
  306. unsigned char addr;
  307. unsigned int start, stop, page, offset;
  308. map = mem->map;
  309. if (map > 4)
  310. return -EINVAL;
  311. addr = exca_readb(socket, I365_ADDRWIN);
  312. mem->flags = (addr & I365_ENA_MEM(map)) ? MAP_ACTIVE : 0;
  313. start = exca_readw(socket, I365_MEM(map) + I365_W_START);
  314. mem->flags |= (start & I365_MEM_16BIT) ? MAP_16BIT : 0;
  315. mem->flags |= (start & I365_MEM_0WS) ? MAP_0WS : 0;
  316. start = (start & 0x0fff) << 12;
  317. stop = exca_readw(socket, I365_MEM(map) + I365_W_STOP);
  318. mem->speed = to_ns(stop >> 14);
  319. stop = ((stop & 0x0fff) << 12) + 0x0fff;
  320. offset = exca_readw(socket, I365_MEM(map) + I365_W_OFF);
  321. mem->flags |= (offset & I365_MEM_WRPROT) ? MAP_WRPROT : 0;
  322. mem->flags |= (offset & I365_MEM_REG) ? MAP_ATTRIB : 0;
  323. offset = ((offset & 0x3fff) << 12) + start;
  324. mem->card_start = offset & 0x3ffffff;
  325. page = exca_readb(socket, CB_MEM_PAGE(map)) << 24;
  326. mem->sys_start = start + page;
  327. mem->sys_stop = start + page;
  328. return 0;
  329. }
  330. static int yenta_set_mem_map(pci_socket_t *socket, struct pccard_mem_map *mem)
  331. {
  332. int map;
  333. unsigned char addr, enable;
  334. unsigned int start, stop, card_start;
  335. unsigned short word;
  336. map = mem->map;
  337. start = mem->sys_start;
  338. stop = mem->sys_stop;
  339. card_start = mem->card_start;
  340. if (map > 4 || start > stop || ((start ^ stop) >> 24) ||
  341.     (card_start >> 26) || mem->speed > 1000)
  342. return -EINVAL;
  343. enable = I365_ENA_MEM(map);
  344. addr = exca_readb(socket, I365_ADDRWIN);
  345. if (addr & enable) {
  346. addr &= ~enable;
  347. exca_writeb(socket, I365_ADDRWIN, addr);
  348. }
  349. exca_writeb(socket, CB_MEM_PAGE(map), start >> 24);
  350. word = (start >> 12) & 0x0fff;
  351. if (mem->flags & MAP_16BIT)
  352. word |= I365_MEM_16BIT;
  353. if (mem->flags & MAP_0WS)
  354. word |= I365_MEM_0WS;
  355. exca_writew(socket, I365_MEM(map) + I365_W_START, word);
  356. word = (stop >> 12) & 0x0fff;
  357. switch (to_cycles(mem->speed)) {
  358. case 0: break;
  359. case 1:  word |= I365_MEM_WS0; break;
  360. case 2:  word |= I365_MEM_WS1; break;
  361. default: word |= I365_MEM_WS1 | I365_MEM_WS0; break;
  362. }
  363. exca_writew(socket, I365_MEM(map) + I365_W_STOP, word);
  364. word = ((card_start - start) >> 12) & 0x3fff;
  365. if (mem->flags & MAP_WRPROT)
  366. word |= I365_MEM_WRPROT;
  367. if (mem->flags & MAP_ATTRIB)
  368. word |= I365_MEM_REG;
  369. exca_writew(socket, I365_MEM(map) + I365_W_OFF, word);
  370. if (mem->flags & MAP_ACTIVE)
  371. exca_writeb(socket, I365_ADDRWIN, addr | enable);
  372. return 0;
  373. }
  374. static void yenta_proc_setup(pci_socket_t *socket, struct proc_dir_entry *base)
  375. {
  376. /* Not done yet */
  377. }
  378. static unsigned int yenta_events(pci_socket_t *socket)
  379. {
  380. u8 csc;
  381. u32 cb_event;
  382. unsigned int events;
  383. /* Clear interrupt status for the event */
  384. cb_event = cb_readl(socket, CB_SOCKET_EVENT);
  385. cb_writel(socket, CB_SOCKET_EVENT, cb_event);
  386. csc = exca_readb(socket, I365_CSC);
  387. events = (cb_event & (CB_CD1EVENT | CB_CD2EVENT)) ? SS_DETECT : 0 ;
  388. events |= (csc & I365_CSC_DETECT) ? SS_DETECT : 0;
  389. if (exca_readb(socket, I365_INTCTL) & I365_PC_IOCARD) {
  390. events |= (csc & I365_CSC_STSCHG) ? SS_STSCHG : 0;
  391. } else {
  392. events |= (csc & I365_CSC_BVD1) ? SS_BATDEAD : 0;
  393. events |= (csc & I365_CSC_BVD2) ? SS_BATWARN : 0;
  394. events |= (csc & I365_CSC_READY) ? SS_READY : 0;
  395. }
  396. return events;
  397. }
  398. static void yenta_bh(void *data)
  399. {
  400. pci_socket_t *socket = data;
  401. unsigned int events;
  402. spin_lock_irq(&socket->event_lock);
  403. events = socket->events;
  404. socket->events = 0;
  405. spin_unlock_irq(&socket->event_lock);
  406. if (socket->handler)
  407. socket->handler(socket->info, events);
  408. }
  409. static void yenta_interrupt(int irq, void *dev_id, struct pt_regs *regs)
  410. {
  411. unsigned int events;
  412. pci_socket_t *socket = (pci_socket_t *) dev_id;
  413. events = yenta_events(socket);
  414. if (events) {
  415. spin_lock(&socket->event_lock);
  416. socket->events |= events;
  417. spin_unlock(&socket->event_lock);
  418. schedule_task(&socket->tq_task);
  419. }
  420. }
  421. static void yenta_interrupt_wrapper(unsigned long data)
  422. {
  423. pci_socket_t *socket = (pci_socket_t *) data;
  424. yenta_interrupt(0, (void *)socket, NULL);
  425. socket->poll_timer.expires = jiffies + HZ;
  426. add_timer(&socket->poll_timer);
  427. }
  428. /*
  429.  * Only probe "regular" interrupts, don't
  430.  * touch dangerous spots like the mouse irq,
  431.  * because there are mice that apparently
  432.  * get really confused if they get fondled
  433.  * too intimately.
  434.  *
  435.  * Default to 11, 10, 9, 7, 6, 5, 4, 3.
  436.  */
  437. static u32 isa_interrupts = 0x0ef8;
  438. static unsigned int yenta_probe_irq(pci_socket_t *socket, u32 isa_irq_mask)
  439. {
  440. int i;
  441. unsigned long val;
  442. u16 bridge_ctrl;
  443. u32 mask;
  444. /* Set up ISA irq routing to probe the ISA irqs.. */
  445. bridge_ctrl = config_readw(socket, CB_BRIDGE_CONTROL);
  446. if (!(bridge_ctrl & CB_BRIDGE_INTR)) {
  447. bridge_ctrl |= CB_BRIDGE_INTR;
  448. config_writew(socket, CB_BRIDGE_CONTROL, bridge_ctrl);
  449. }
  450. /*
  451.  * Probe for usable interrupts using the force
  452.  * register to generate bogus card status events.
  453.  */
  454. cb_writel(socket, CB_SOCKET_EVENT, -1);
  455. cb_writel(socket, CB_SOCKET_MASK, CB_CSTSMASK);
  456. exca_writeb(socket, I365_CSCINT, 0);
  457. val = probe_irq_on() & isa_irq_mask;
  458. for (i = 1; i < 16; i++) {
  459. if (!((val >> i) & 1))
  460. continue;
  461. exca_writeb(socket, I365_CSCINT, I365_CSC_STSCHG | (i << 4));
  462. cb_writel(socket, CB_SOCKET_FORCE, CB_FCARDSTS);
  463. udelay(100);
  464. cb_writel(socket, CB_SOCKET_EVENT, -1);
  465. }
  466. cb_writel(socket, CB_SOCKET_MASK, 0);
  467. exca_writeb(socket, I365_CSCINT, 0);
  468. mask = probe_irq_mask(val) & 0xffff;
  469. bridge_ctrl &= ~CB_BRIDGE_INTR;
  470. config_writew(socket, CB_BRIDGE_CONTROL, bridge_ctrl);
  471. return mask;
  472. }
  473. /*
  474.  * Set static data that doesn't need re-initializing..
  475.  */
  476. static void yenta_get_socket_capabilities(pci_socket_t *socket, u32 isa_irq_mask)
  477. {
  478. socket->cap.features |= SS_CAP_PAGE_REGS | SS_CAP_PCCARD | SS_CAP_CARDBUS;
  479. socket->cap.map_size = 0x1000;
  480. socket->cap.pci_irq = socket->cb_irq;
  481. socket->cap.irq_mask = yenta_probe_irq(socket, isa_irq_mask);
  482. socket->cap.cb_dev = socket->dev;
  483. socket->cap.bus = NULL;
  484. printk("Yenta IRQ list %04x, PCI irq%dn", socket->cap.irq_mask, socket->cb_irq);
  485. }
  486. extern void cardbus_register(pci_socket_t *socket);
  487. /*
  488.  * 'Bottom half' for the yenta_open routine. Allocate the interrupt line
  489.  *  and register the socket with the upper layers.
  490.  */
  491. static void yenta_open_bh(void * data)
  492. {
  493. pci_socket_t * socket = (pci_socket_t *) data;
  494. /* It's OK to overwrite this now */
  495. socket->tq_task.routine = yenta_bh;
  496. if (!socket->cb_irq || request_irq(socket->cb_irq, yenta_interrupt, SA_SHIRQ, socket->dev->name, socket)) {
  497. /* No IRQ or request_irq failed. Poll */
  498. socket->cb_irq = 0; /* But zero is a valid IRQ number. */
  499. socket->poll_timer.function = yenta_interrupt_wrapper;
  500. socket->poll_timer.data = (unsigned long)socket;
  501. socket->poll_timer.expires = jiffies + HZ;
  502. add_timer(&socket->poll_timer);
  503. }
  504. /* Figure out what the dang thing can do for the PCMCIA layer... */
  505. yenta_get_socket_capabilities(socket, isa_interrupts);
  506. printk("Socket status: %08xn", cb_readl(socket, CB_SOCKET_STATE));
  507. /* Register it with the pcmcia layer.. */
  508. cardbus_register(socket);
  509. MOD_DEC_USE_COUNT;
  510. }
  511. static void yenta_clear_maps(pci_socket_t *socket)
  512. {
  513. int i;
  514. pccard_io_map io = { 0, 0, 0, 0, 1 };
  515. pccard_mem_map mem = { 0, 0, 0, 0, 0, 0 };
  516. mem.sys_stop = 0x0fff;
  517. yenta_set_socket(socket, &dead_socket);
  518. for (i = 0; i < 2; i++) {
  519. io.map = i;
  520. yenta_set_io_map(socket, &io);
  521. }
  522. for (i = 0; i < 5; i++) {
  523. mem.map = i;
  524. yenta_set_mem_map(socket, &mem);
  525. }
  526. }
  527. /*
  528.  * Initialize the standard cardbus registers
  529.  */
  530. static void yenta_config_init(pci_socket_t *socket)
  531. {
  532. u16 bridge;
  533. struct pci_dev *dev = socket->dev;
  534. pci_set_power_state(socket->dev, 0);
  535. config_writel(socket, CB_LEGACY_MODE_BASE, 0);
  536. config_writel(socket, PCI_BASE_ADDRESS_0, dev->resource[0].start);
  537. config_writew(socket, PCI_COMMAND,
  538. PCI_COMMAND_IO |
  539. PCI_COMMAND_MEMORY |
  540. PCI_COMMAND_MASTER |
  541. PCI_COMMAND_WAIT);
  542. /* MAGIC NUMBERS! Fixme */
  543. config_writeb(socket, PCI_CACHE_LINE_SIZE, L1_CACHE_BYTES / 4);
  544. config_writeb(socket, PCI_LATENCY_TIMER, 168);
  545. config_writel(socket, PCI_PRIMARY_BUS,
  546. (176 << 24) |    /* sec. latency timer */
  547. (dev->subordinate->subordinate << 16) | /* subordinate bus */
  548. (dev->subordinate->secondary << 8) |  /* secondary bus */
  549. dev->subordinate->primary);    /* primary bus */
  550. /*
  551.  * Set up the bridging state:
  552.  *  - enable write posting.
  553.  *  - memory window 0 prefetchable, window 1 non-prefetchable
  554.  *  - PCI interrupts enabled if a PCI interrupt exists..
  555.  */
  556. bridge = config_readw(socket, CB_BRIDGE_CONTROL);
  557. bridge &= ~(CB_BRIDGE_CRST | CB_BRIDGE_PREFETCH1 | CB_BRIDGE_INTR | CB_BRIDGE_ISAEN | CB_BRIDGE_VGAEN);
  558. bridge |= CB_BRIDGE_PREFETCH0 | CB_BRIDGE_POSTEN;
  559. if (!socket->cb_irq)
  560. bridge |= CB_BRIDGE_INTR;
  561. config_writew(socket, CB_BRIDGE_CONTROL, bridge);
  562. exca_writeb(socket, I365_GBLCTL, 0x00);
  563. exca_writeb(socket, I365_GENCTL, 0x00);
  564. /* Redo card voltage interrogation */
  565. cb_writel(socket, CB_SOCKET_FORCE, CB_CVSTEST);
  566. }
  567. /* Called at resume and initialization events */
  568. static int yenta_init(pci_socket_t *socket)
  569. {
  570. yenta_config_init(socket);
  571. yenta_clear_maps(socket);
  572. /* Re-enable interrupts */
  573. cb_writel(socket, CB_SOCKET_MASK, CB_CDMASK);
  574. return 0;
  575. }
  576. static int yenta_suspend(pci_socket_t *socket)
  577. {
  578. yenta_set_socket(socket, &dead_socket);
  579. /* Disable interrupts */
  580. cb_writel(socket, CB_SOCKET_MASK, 0x0);
  581. /*
  582.  * This does not work currently. The controller
  583.  * loses too much information during D3 to come up
  584.  * cleanly. We should probably fix yenta_init()
  585.  * to update all the critical registers, notably
  586.  * the IO and MEM bridging region data.. That is
  587.  * something that pci_set_power_state() should
  588.  * probably know about bridges anyway.
  589.  *
  590. pci_set_power_state(socket->dev, 3);
  591.  */
  592. return 0;
  593. }
  594. static void yenta_allocate_res(pci_socket_t *socket, int nr, unsigned type)
  595. {
  596. struct pci_bus *bus;
  597. struct resource *root, *res;
  598. u32 start, end;
  599. u32 align, size, min, max;
  600. unsigned offset;
  601. unsigned mask;
  602. /* The granularity of the memory limit is 4kB, on IO it's 4 bytes */
  603. mask = ~0xfff;
  604. if (type & IORESOURCE_IO)
  605. mask = ~3;
  606. offset = 0x1c + 8*nr;
  607. bus = socket->dev->subordinate;
  608. res = socket->dev->resource + PCI_BRIDGE_RESOURCES + nr;
  609. res->name = bus->name;
  610. res->flags = type;
  611. res->start = 0;
  612. res->end = 0;
  613. root = pci_find_parent_resource(socket->dev, res);
  614. if (!root)
  615. return;
  616. start = config_readl(socket, offset) & mask;
  617. end = config_readl(socket, offset+4) | ~mask;
  618. if (start && end > start) {
  619. res->start = start;
  620. res->end = end;
  621. request_resource(root, res);
  622. return;
  623. }
  624. align = size = 4*1024*1024;
  625. min = PCIBIOS_MIN_MEM; max = ~0U;
  626. if (type & IORESOURCE_IO) {
  627. align = 1024;
  628. size = 256;
  629. min = 0x4000;
  630. max = 0xffff;
  631. }
  632. if (allocate_resource(root, res, size, min, max, align, NULL, NULL) < 0)
  633. return;
  634. config_writel(socket, offset, res->start);
  635. config_writel(socket, offset+4, res->end);
  636. }
  637. /*
  638.  * Allocate the bridge mappings for the device..
  639.  */
  640. static void yenta_allocate_resources(pci_socket_t *socket)
  641. {
  642. yenta_allocate_res(socket, 0, IORESOURCE_MEM|IORESOURCE_PREFETCH);
  643. yenta_allocate_res(socket, 1, IORESOURCE_MEM);
  644. yenta_allocate_res(socket, 2, IORESOURCE_IO);
  645. yenta_allocate_res(socket, 3, IORESOURCE_IO); /* PCI isn't clever enough to use this one yet */
  646. }
  647. /*
  648.  * Close it down - release our resources and go home..
  649.  */
  650. static void yenta_close(pci_socket_t *sock)
  651. {
  652. /* Disable all events so we don't die in an IRQ storm */
  653. cb_writel(sock, CB_SOCKET_MASK, 0x0);
  654. exca_writeb(sock, I365_CSCINT, 0);
  655. if (sock->cb_irq)
  656. free_irq(sock->cb_irq, sock);
  657. else
  658. del_timer_sync(&sock->poll_timer);
  659. if (sock->base)
  660. iounmap(sock->base);
  661. }
  662. #include "ti113x.h"
  663. #include "ricoh.h"
  664. /*
  665.  * Different cardbus controllers have slightly different
  666.  * initialization sequences etc details. List them here..
  667.  */
  668. #define PD(x,y) PCI_VENDOR_ID_##x, PCI_DEVICE_ID_##x##_##y
  669. static struct cardbus_override_struct {
  670. unsigned short vendor;
  671. unsigned short device;
  672. struct pci_socket_ops *op;
  673. } cardbus_override[] = {
  674. { PD(TI,1130), &ti113x_ops },
  675. { PD(TI,1031), &ti_ops },
  676. { PD(TI,1131), &ti113x_ops },
  677. { PD(TI,1250), &ti1250_ops },
  678. { PD(TI,1220), &ti_ops },
  679. { PD(TI,1221), &ti_ops },
  680. { PD(TI,1210), &ti_ops },
  681. { PD(TI,1450), &ti_ops },
  682. { PD(TI,1225), &ti_ops },
  683. { PD(TI,1251A), &ti_ops },
  684. { PD(TI,1211), &ti_ops },
  685. { PD(TI,1251B), &ti_ops },
  686. { PD(TI,1410), &ti_ops },
  687. { PD(TI,1420), &ti_ops },
  688. { PD(TI,4410), &ti_ops },
  689. { PD(TI,4451), &ti_ops },
  690. { PD(RICOH,RL5C465), &ricoh_ops },
  691. { PD(RICOH,RL5C466), &ricoh_ops },
  692. { PD(RICOH,RL5C475), &ricoh_ops },
  693. { PD(RICOH,RL5C476), &ricoh_ops },
  694. { PD(RICOH,RL5C478), &ricoh_ops }
  695. };
  696. #define NR_OVERRIDES (sizeof(cardbus_override)/sizeof(struct cardbus_override_struct))
  697. /*
  698.  * Initialize a cardbus controller. Make sure we have a usable
  699.  * interrupt, and that we can map the cardbus area. Fill in the
  700.  * socket information structure..
  701.  */
  702. static int yenta_open(pci_socket_t *socket)
  703. {
  704. int i;
  705. struct pci_dev *dev = socket->dev;
  706. /*
  707.  * Do some basic sanity checking..
  708.  */
  709. if (pci_enable_device(dev))
  710. return -1;
  711. if (!pci_resource_start(dev, 0)) {
  712. printk("No cardbus resource!n");
  713. return -1;
  714. }
  715. /*
  716.  * Ok, start setup.. Map the cardbus registers,
  717.  * and request the IRQ.
  718.  */
  719. socket->base = ioremap(pci_resource_start(dev, 0), 0x1000);
  720. if (!socket->base)
  721. return -1;
  722. yenta_config_init(socket);
  723. /* Disable all events */
  724. cb_writel(socket, CB_SOCKET_MASK, 0x0);
  725. /* Set up the bridge regions.. */
  726. yenta_allocate_resources(socket);
  727. socket->cb_irq = dev->irq;
  728. /* Do we have special options for the device? */
  729. for (i = 0; i < NR_OVERRIDES; i++) {
  730. struct cardbus_override_struct *d = cardbus_override+i;
  731. if (dev->vendor == d->vendor && dev->device == d->device) {
  732. socket->op = d->op;
  733. if (d->op->open) {
  734. int retval = d->op->open(socket);
  735. if (retval < 0)
  736. return retval;
  737. }
  738. }
  739. }
  740. /* Get the PCMCIA kernel thread to complete the
  741.    initialisation later. We can't do this here,
  742.    because, er, because Linus says so :)
  743. */
  744. socket->tq_task.routine = yenta_open_bh;
  745. socket->tq_task.data = socket;
  746. MOD_INC_USE_COUNT;
  747. schedule_task(&socket->tq_task);
  748. return 0;
  749. }
  750. /*
  751.  * Standard plain cardbus - no frills, no extensions
  752.  */
  753. struct pci_socket_ops yenta_operations = {
  754. yenta_open,
  755. yenta_close,
  756. yenta_init,
  757. yenta_suspend,
  758. yenta_get_status,
  759. yenta_get_socket,
  760. yenta_set_socket,
  761. yenta_get_io_map,
  762. yenta_set_io_map,
  763. yenta_get_mem_map,
  764. yenta_set_mem_map,
  765. yenta_proc_setup
  766. };
  767. EXPORT_SYMBOL(yenta_operations);
  768. MODULE_LICENSE("GPL");