Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /*
0003  * cs_internal.h -- definitions internal to the PCMCIA core modules
0004  *
0005  * The initial developer of the original code is David A. Hinds
0006  * <dahinds@users.sourceforge.net>.  Portions created by David A. Hinds
0007  * are Copyright (C) 1999 David A. Hinds.  All Rights Reserved.
0008  *
0009  * (C) 1999     David A. Hinds
0010  * (C) 2003 - 2010  Dominik Brodowski
0011  *
0012  * This file contains definitions _only_ needed by the PCMCIA core modules.
0013  * It must not be included by PCMCIA socket drivers or by PCMCIA device
0014  * drivers.
0015  */
0016 
0017 #ifndef _LINUX_CS_INTERNAL_H
0018 #define _LINUX_CS_INTERNAL_H
0019 
0020 #include <linux/kref.h>
0021 
0022 /* Flags in client state */
0023 #define CLIENT_WIN_REQ(i)   (0x1<<(i))
0024 
0025 /* Flag to access all functions */
0026 #define BIND_FN_ALL 0xff
0027 
0028 /* Each card function gets one of these guys */
0029 typedef struct config_t {
0030     struct kref ref;
0031     unsigned int    state;
0032 
0033     struct resource io[MAX_IO_WIN]; /* io ports */
0034     struct resource mem[MAX_WIN];   /* mem areas */
0035 } config_t;
0036 
0037 
0038 struct cis_cache_entry {
0039     struct list_head    node;
0040     unsigned int        addr;
0041     unsigned int        len;
0042     unsigned int        attr;
0043     unsigned char       cache[];
0044 };
0045 
0046 struct pccard_resource_ops {
0047     int (*validate_mem)     (struct pcmcia_socket *s);
0048     int (*find_io)      (struct pcmcia_socket *s,
0049                      unsigned int attr,
0050                      unsigned int *base,
0051                      unsigned int num,
0052                      unsigned int align,
0053                      struct resource **parent);
0054     struct resource* (*find_mem)    (unsigned long base, unsigned long num,
0055                      unsigned long align, int low,
0056                      struct pcmcia_socket *s);
0057     int (*init)         (struct pcmcia_socket *s);
0058     void    (*exit)         (struct pcmcia_socket *s);
0059 };
0060 
0061 /* Flags in config state */
0062 #define CONFIG_LOCKED       0x01
0063 #define CONFIG_IRQ_REQ      0x02
0064 #define CONFIG_IO_REQ       0x04
0065 
0066 /* Flags in socket state */
0067 #define SOCKET_PRESENT      0x0008
0068 #define SOCKET_INUSE        0x0010
0069 #define SOCKET_IN_RESUME    0x0040
0070 #define SOCKET_SUSPEND      0x0080
0071 #define SOCKET_WIN_REQ(i)   (0x0100<<(i))
0072 #define SOCKET_CARDBUS      0x8000
0073 #define SOCKET_CARDBUS_CONFIG   0x10000
0074 
0075 
0076 /*
0077  * Stuff internal to module "pcmcia_rsrc":
0078  */
0079 extern int static_init(struct pcmcia_socket *s);
0080 extern struct resource *pcmcia_make_resource(resource_size_t start,
0081                     resource_size_t end,
0082                     unsigned long flags, const char *name);
0083 
0084 /*
0085  * Stuff internal to module "pcmcia_core":
0086  */
0087 
0088 /* socket_sysfs.c */
0089 extern int pccard_sysfs_add_socket(struct device *dev);
0090 extern void pccard_sysfs_remove_socket(struct device *dev);
0091 
0092 /* cardbus.c */
0093 int cb_alloc(struct pcmcia_socket *s);
0094 void cb_free(struct pcmcia_socket *s);
0095 
0096 
0097 
0098 /*
0099  * Stuff exported by module "pcmcia_core" to module "pcmcia"
0100  */
0101 
0102 struct pcmcia_callback{
0103     struct module   *owner;
0104     int     (*add) (struct pcmcia_socket *s);
0105     int     (*remove) (struct pcmcia_socket *s);
0106     void        (*requery) (struct pcmcia_socket *s);
0107     int     (*validate) (struct pcmcia_socket *s, unsigned int *i);
0108     int     (*suspend) (struct pcmcia_socket *s);
0109     int     (*early_resume) (struct pcmcia_socket *s);
0110     int     (*resume) (struct pcmcia_socket *s);
0111 };
0112 
0113 /* cs.c */
0114 extern struct rw_semaphore pcmcia_socket_list_rwsem;
0115 extern struct list_head pcmcia_socket_list;
0116 extern struct class pcmcia_socket_class;
0117 
0118 int pccard_register_pcmcia(struct pcmcia_socket *s, struct pcmcia_callback *c);
0119 struct pcmcia_socket *pcmcia_get_socket_by_nr(unsigned int nr);
0120 
0121 void pcmcia_parse_uevents(struct pcmcia_socket *socket, unsigned int events);
0122 #define PCMCIA_UEVENT_EJECT 0x0001
0123 #define PCMCIA_UEVENT_INSERT    0x0002
0124 #define PCMCIA_UEVENT_SUSPEND   0x0004
0125 #define PCMCIA_UEVENT_RESUME    0x0008
0126 #define PCMCIA_UEVENT_REQUERY   0x0010
0127 
0128 struct pcmcia_socket *pcmcia_get_socket(struct pcmcia_socket *skt);
0129 void pcmcia_put_socket(struct pcmcia_socket *skt);
0130 
0131 /*
0132  * Stuff internal to module "pcmcia".
0133  */
0134 /* ds.c */
0135 extern struct bus_type pcmcia_bus_type;
0136 
0137 struct pcmcia_device;
0138 
0139 /* pcmcia_resource.c */
0140 extern int pcmcia_release_configuration(struct pcmcia_device *p_dev);
0141 extern int pcmcia_validate_mem(struct pcmcia_socket *s);
0142 extern struct resource *pcmcia_find_mem_region(u_long base,
0143                            u_long num,
0144                            u_long align,
0145                            int low,
0146                            struct pcmcia_socket *s);
0147 
0148 void pcmcia_cleanup_irq(struct pcmcia_socket *s);
0149 int pcmcia_setup_irq(struct pcmcia_device *p_dev);
0150 
0151 /* cistpl.c */
0152 extern const struct bin_attribute pccard_cis_attr;
0153 
0154 int pcmcia_read_cis_mem(struct pcmcia_socket *s, int attr,
0155             u_int addr, u_int len, void *ptr);
0156 int pcmcia_write_cis_mem(struct pcmcia_socket *s, int attr,
0157             u_int addr, u_int len, void *ptr);
0158 void release_cis_mem(struct pcmcia_socket *s);
0159 void destroy_cis_cache(struct pcmcia_socket *s);
0160 int pccard_read_tuple(struct pcmcia_socket *s, unsigned int function,
0161               cisdata_t code, void *parse);
0162 int pcmcia_replace_cis(struct pcmcia_socket *s,
0163                const u8 *data, const size_t len);
0164 int pccard_validate_cis(struct pcmcia_socket *s, unsigned int *count);
0165 int verify_cis_cache(struct pcmcia_socket *s);
0166 
0167 int pccard_get_first_tuple(struct pcmcia_socket *s, unsigned int function,
0168             tuple_t *tuple);
0169 
0170 int pccard_get_next_tuple(struct pcmcia_socket *s, unsigned int function,
0171             tuple_t *tuple);
0172 
0173 int pccard_get_tuple_data(struct pcmcia_socket *s, tuple_t *tuple);
0174 
0175 #endif /* _LINUX_CS_INTERNAL_H */