cs_internal.h 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. /*
  2. * cs_internal.h
  3. *
  4. * This program is free software; you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License version 2 as
  6. * published by the Free Software Foundation.
  7. *
  8. * The initial developer of the original code is David A. Hinds
  9. * <dahinds@users.sourceforge.net>. Portions created by David A. Hinds
  10. * are Copyright (C) 1999 David A. Hinds. All Rights Reserved.
  11. *
  12. * (C) 1999 David A. Hinds
  13. */
  14. #ifndef _LINUX_CS_INTERNAL_H
  15. #define _LINUX_CS_INTERNAL_H
  16. #include <linux/kref.h>
  17. /* Flags in client state */
  18. #define CLIENT_CONFIG_LOCKED 0x0001
  19. #define CLIENT_IRQ_REQ 0x0002
  20. #define CLIENT_IO_REQ 0x0004
  21. #define CLIENT_UNBOUND 0x0008
  22. #define CLIENT_STALE 0x0010
  23. #define CLIENT_WIN_REQ(i) (0x1<<(i))
  24. #define CLIENT_CARDBUS 0x8000
  25. /* Each card function gets one of these guys */
  26. typedef struct config_t {
  27. struct kref ref;
  28. u_int state;
  29. u_int Attributes;
  30. u_int IntType;
  31. u_int ConfigBase;
  32. u_char Status, Pin, Copy, Option, ExtStatus;
  33. u_int CardValues;
  34. io_req_t io;
  35. struct {
  36. u_int Attributes;
  37. } irq;
  38. } config_t;
  39. struct cis_cache_entry {
  40. struct list_head node;
  41. unsigned int addr;
  42. unsigned int len;
  43. unsigned int attr;
  44. unsigned char cache[0];
  45. };
  46. /* Flags in config state */
  47. #define CONFIG_LOCKED 0x01
  48. #define CONFIG_IRQ_REQ 0x02
  49. #define CONFIG_IO_REQ 0x04
  50. /* Flags in socket state */
  51. #define SOCKET_PRESENT 0x0008
  52. #define SOCKET_INUSE 0x0010
  53. #define SOCKET_SUSPEND 0x0080
  54. #define SOCKET_WIN_REQ(i) (0x0100<<(i))
  55. #define SOCKET_REGION_INFO 0x4000
  56. #define SOCKET_CARDBUS 0x8000
  57. #define SOCKET_CARDBUS_CONFIG 0x10000
  58. static inline int cs_socket_get(struct pcmcia_socket *skt)
  59. {
  60. int ret;
  61. WARN_ON(skt->state & SOCKET_INUSE);
  62. ret = try_module_get(skt->owner);
  63. if (ret)
  64. skt->state |= SOCKET_INUSE;
  65. return ret;
  66. }
  67. static inline void cs_socket_put(struct pcmcia_socket *skt)
  68. {
  69. if (skt->state & SOCKET_INUSE) {
  70. skt->state &= ~SOCKET_INUSE;
  71. module_put(skt->owner);
  72. }
  73. }
  74. /* In cardbus.c */
  75. int cb_alloc(struct pcmcia_socket *s);
  76. void cb_free(struct pcmcia_socket *s);
  77. int read_cb_mem(struct pcmcia_socket *s, int space, u_int addr, u_int len, void *ptr);
  78. /* In cistpl.c */
  79. int pcmcia_read_cis_mem(struct pcmcia_socket *s, int attr,
  80. u_int addr, u_int len, void *ptr);
  81. void pcmcia_write_cis_mem(struct pcmcia_socket *s, int attr,
  82. u_int addr, u_int len, void *ptr);
  83. void release_cis_mem(struct pcmcia_socket *s);
  84. void destroy_cis_cache(struct pcmcia_socket *s);
  85. int verify_cis_cache(struct pcmcia_socket *s);
  86. int pccard_read_tuple(struct pcmcia_socket *s, unsigned int function, cisdata_t code, void *parse);
  87. /* In rsrc_mgr */
  88. int pcmcia_validate_mem(struct pcmcia_socket *s);
  89. struct resource *pcmcia_find_io_region(unsigned long base, int num, unsigned long align,
  90. struct pcmcia_socket *s);
  91. int pcmcia_adjust_io_region(struct resource *res, unsigned long r_start,
  92. unsigned long r_end, struct pcmcia_socket *s);
  93. struct resource *pcmcia_find_mem_region(u_long base, u_long num, u_long align,
  94. int low, struct pcmcia_socket *s);
  95. void release_resource_db(struct pcmcia_socket *s);
  96. /* In socket_sysfs.c */
  97. extern int pccard_sysfs_add_socket(struct device *dev);
  98. extern void pccard_sysfs_remove_socket(struct device *dev);
  99. /* In cs.c */
  100. extern struct rw_semaphore pcmcia_socket_list_rwsem;
  101. extern struct list_head pcmcia_socket_list;
  102. int pcmcia_get_window(struct pcmcia_socket *s, window_handle_t *handle, int idx, win_req_t *req);
  103. int pccard_get_configuration_info(struct pcmcia_socket *s, struct pcmcia_device *p_dev, config_info_t *config);
  104. int pccard_reset_card(struct pcmcia_socket *skt);
  105. struct pcmcia_callback{
  106. struct module *owner;
  107. int (*event) (struct pcmcia_socket *s, event_t event, int priority);
  108. void (*requery) (struct pcmcia_socket *s, int new_cis);
  109. int (*suspend) (struct pcmcia_socket *s);
  110. int (*resume) (struct pcmcia_socket *s);
  111. };
  112. int pccard_register_pcmcia(struct pcmcia_socket *s, struct pcmcia_callback *c);
  113. #define cs_socket_name(skt) ((skt)->dev.bus_id)
  114. #ifdef DEBUG
  115. extern int cs_debug_level(int);
  116. #define cs_dbg(skt, lvl, fmt, arg...) do { \
  117. if (cs_debug_level(lvl)) \
  118. printk(KERN_DEBUG "cs: %s: " fmt, \
  119. cs_socket_name(skt) , ## arg); \
  120. } while (0)
  121. #else
  122. #define cs_dbg(skt, lvl, fmt, arg...) do { } while (0)
  123. #endif
  124. #define cs_err(skt, fmt, arg...) \
  125. printk(KERN_ERR "cs: %s: " fmt, (skt)->dev.bus_id , ## arg)
  126. #endif /* _LINUX_CS_INTERNAL_H */