162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * cs_internal.h -- definitions internal to the PCMCIA core modules
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * The initial developer of the original code is David A. Hinds
662306a36Sopenharmony_ci * <dahinds@users.sourceforge.net>.  Portions created by David A. Hinds
762306a36Sopenharmony_ci * are Copyright (C) 1999 David A. Hinds.  All Rights Reserved.
862306a36Sopenharmony_ci *
962306a36Sopenharmony_ci * (C) 1999		David A. Hinds
1062306a36Sopenharmony_ci * (C) 2003 - 2010	Dominik Brodowski
1162306a36Sopenharmony_ci *
1262306a36Sopenharmony_ci * This file contains definitions _only_ needed by the PCMCIA core modules.
1362306a36Sopenharmony_ci * It must not be included by PCMCIA socket drivers or by PCMCIA device
1462306a36Sopenharmony_ci * drivers.
1562306a36Sopenharmony_ci */
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci#ifndef _LINUX_CS_INTERNAL_H
1862306a36Sopenharmony_ci#define _LINUX_CS_INTERNAL_H
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci#include <linux/kref.h>
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci/* Flags in client state */
2362306a36Sopenharmony_ci#define CLIENT_WIN_REQ(i)	(0x1<<(i))
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci/* Flag to access all functions */
2662306a36Sopenharmony_ci#define BIND_FN_ALL	0xff
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci/* Each card function gets one of these guys */
2962306a36Sopenharmony_citypedef struct config_t {
3062306a36Sopenharmony_ci	struct kref	ref;
3162306a36Sopenharmony_ci	unsigned int	state;
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ci	struct resource io[MAX_IO_WIN]; /* io ports */
3462306a36Sopenharmony_ci	struct resource mem[MAX_WIN];   /* mem areas */
3562306a36Sopenharmony_ci} config_t;
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_cistruct cis_cache_entry {
3962306a36Sopenharmony_ci	struct list_head	node;
4062306a36Sopenharmony_ci	unsigned int		addr;
4162306a36Sopenharmony_ci	unsigned int		len;
4262306a36Sopenharmony_ci	unsigned int		attr;
4362306a36Sopenharmony_ci	unsigned char		cache[];
4462306a36Sopenharmony_ci};
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_cistruct pccard_resource_ops {
4762306a36Sopenharmony_ci	int	(*validate_mem)		(struct pcmcia_socket *s);
4862306a36Sopenharmony_ci	int	(*find_io)		(struct pcmcia_socket *s,
4962306a36Sopenharmony_ci					 unsigned int attr,
5062306a36Sopenharmony_ci					 unsigned int *base,
5162306a36Sopenharmony_ci					 unsigned int num,
5262306a36Sopenharmony_ci					 unsigned int align,
5362306a36Sopenharmony_ci					 struct resource **parent);
5462306a36Sopenharmony_ci	struct resource* (*find_mem)	(unsigned long base, unsigned long num,
5562306a36Sopenharmony_ci					 unsigned long align, int low,
5662306a36Sopenharmony_ci					 struct pcmcia_socket *s);
5762306a36Sopenharmony_ci	int	(*init)			(struct pcmcia_socket *s);
5862306a36Sopenharmony_ci	void	(*exit)			(struct pcmcia_socket *s);
5962306a36Sopenharmony_ci};
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci/* Flags in config state */
6262306a36Sopenharmony_ci#define CONFIG_LOCKED		0x01
6362306a36Sopenharmony_ci#define CONFIG_IRQ_REQ		0x02
6462306a36Sopenharmony_ci#define CONFIG_IO_REQ		0x04
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ci/* Flags in socket state */
6762306a36Sopenharmony_ci#define SOCKET_PRESENT		0x0008
6862306a36Sopenharmony_ci#define SOCKET_INUSE		0x0010
6962306a36Sopenharmony_ci#define SOCKET_IN_RESUME	0x0040
7062306a36Sopenharmony_ci#define SOCKET_SUSPEND		0x0080
7162306a36Sopenharmony_ci#define SOCKET_WIN_REQ(i)	(0x0100<<(i))
7262306a36Sopenharmony_ci#define SOCKET_CARDBUS		0x8000
7362306a36Sopenharmony_ci#define SOCKET_CARDBUS_CONFIG	0x10000
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ci/*
7762306a36Sopenharmony_ci * Stuff internal to module "pcmcia_rsrc":
7862306a36Sopenharmony_ci */
7962306a36Sopenharmony_ciextern int static_init(struct pcmcia_socket *s);
8062306a36Sopenharmony_ciextern struct resource *pcmcia_make_resource(resource_size_t start,
8162306a36Sopenharmony_ci					resource_size_t end,
8262306a36Sopenharmony_ci					unsigned long flags, const char *name);
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ci/*
8562306a36Sopenharmony_ci * Stuff internal to module "pcmcia_core":
8662306a36Sopenharmony_ci */
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_ci/* socket_sysfs.c */
8962306a36Sopenharmony_ciextern int pccard_sysfs_add_socket(struct device *dev);
9062306a36Sopenharmony_ciextern void pccard_sysfs_remove_socket(struct device *dev);
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_ci/* cardbus.c */
9362306a36Sopenharmony_ciint cb_alloc(struct pcmcia_socket *s);
9462306a36Sopenharmony_civoid cb_free(struct pcmcia_socket *s);
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ci/*
9962306a36Sopenharmony_ci * Stuff exported by module "pcmcia_core" to module "pcmcia"
10062306a36Sopenharmony_ci */
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_cistruct pcmcia_callback{
10362306a36Sopenharmony_ci	struct module	*owner;
10462306a36Sopenharmony_ci	int		(*add) (struct pcmcia_socket *s);
10562306a36Sopenharmony_ci	int		(*remove) (struct pcmcia_socket *s);
10662306a36Sopenharmony_ci	void		(*requery) (struct pcmcia_socket *s);
10762306a36Sopenharmony_ci	int		(*validate) (struct pcmcia_socket *s, unsigned int *i);
10862306a36Sopenharmony_ci	int		(*suspend) (struct pcmcia_socket *s);
10962306a36Sopenharmony_ci	int		(*early_resume) (struct pcmcia_socket *s);
11062306a36Sopenharmony_ci	int		(*resume) (struct pcmcia_socket *s);
11162306a36Sopenharmony_ci};
11262306a36Sopenharmony_ci
11362306a36Sopenharmony_ci/* cs.c */
11462306a36Sopenharmony_ciextern struct rw_semaphore pcmcia_socket_list_rwsem;
11562306a36Sopenharmony_ciextern struct list_head pcmcia_socket_list;
11662306a36Sopenharmony_ciextern struct class pcmcia_socket_class;
11762306a36Sopenharmony_ci
11862306a36Sopenharmony_ciint pccard_register_pcmcia(struct pcmcia_socket *s, struct pcmcia_callback *c);
11962306a36Sopenharmony_cistruct pcmcia_socket *pcmcia_get_socket_by_nr(unsigned int nr);
12062306a36Sopenharmony_ci
12162306a36Sopenharmony_civoid pcmcia_parse_uevents(struct pcmcia_socket *socket, unsigned int events);
12262306a36Sopenharmony_ci#define PCMCIA_UEVENT_EJECT	0x0001
12362306a36Sopenharmony_ci#define PCMCIA_UEVENT_INSERT	0x0002
12462306a36Sopenharmony_ci#define PCMCIA_UEVENT_SUSPEND	0x0004
12562306a36Sopenharmony_ci#define PCMCIA_UEVENT_RESUME	0x0008
12662306a36Sopenharmony_ci#define PCMCIA_UEVENT_REQUERY	0x0010
12762306a36Sopenharmony_ci
12862306a36Sopenharmony_cistruct pcmcia_socket *pcmcia_get_socket(struct pcmcia_socket *skt);
12962306a36Sopenharmony_civoid pcmcia_put_socket(struct pcmcia_socket *skt);
13062306a36Sopenharmony_ci
13162306a36Sopenharmony_ci/*
13262306a36Sopenharmony_ci * Stuff internal to module "pcmcia".
13362306a36Sopenharmony_ci */
13462306a36Sopenharmony_ci/* ds.c */
13562306a36Sopenharmony_ciextern struct bus_type pcmcia_bus_type;
13662306a36Sopenharmony_ci
13762306a36Sopenharmony_cistruct pcmcia_device;
13862306a36Sopenharmony_ci
13962306a36Sopenharmony_ci/* pcmcia_resource.c */
14062306a36Sopenharmony_ciextern int pcmcia_release_configuration(struct pcmcia_device *p_dev);
14162306a36Sopenharmony_ciextern int pcmcia_validate_mem(struct pcmcia_socket *s);
14262306a36Sopenharmony_ciextern struct resource *pcmcia_find_mem_region(u_long base,
14362306a36Sopenharmony_ci					       u_long num,
14462306a36Sopenharmony_ci					       u_long align,
14562306a36Sopenharmony_ci					       int low,
14662306a36Sopenharmony_ci					       struct pcmcia_socket *s);
14762306a36Sopenharmony_ci
14862306a36Sopenharmony_civoid pcmcia_cleanup_irq(struct pcmcia_socket *s);
14962306a36Sopenharmony_ciint pcmcia_setup_irq(struct pcmcia_device *p_dev);
15062306a36Sopenharmony_ci
15162306a36Sopenharmony_ci/* cistpl.c */
15262306a36Sopenharmony_ciextern const struct bin_attribute pccard_cis_attr;
15362306a36Sopenharmony_ci
15462306a36Sopenharmony_ciint pcmcia_read_cis_mem(struct pcmcia_socket *s, int attr,
15562306a36Sopenharmony_ci			u_int addr, u_int len, void *ptr);
15662306a36Sopenharmony_ciint pcmcia_write_cis_mem(struct pcmcia_socket *s, int attr,
15762306a36Sopenharmony_ci			u_int addr, u_int len, void *ptr);
15862306a36Sopenharmony_civoid release_cis_mem(struct pcmcia_socket *s);
15962306a36Sopenharmony_civoid destroy_cis_cache(struct pcmcia_socket *s);
16062306a36Sopenharmony_ciint pccard_read_tuple(struct pcmcia_socket *s, unsigned int function,
16162306a36Sopenharmony_ci		      cisdata_t code, void *parse);
16262306a36Sopenharmony_ciint pcmcia_replace_cis(struct pcmcia_socket *s,
16362306a36Sopenharmony_ci		       const u8 *data, const size_t len);
16462306a36Sopenharmony_ciint pccard_validate_cis(struct pcmcia_socket *s, unsigned int *count);
16562306a36Sopenharmony_ciint verify_cis_cache(struct pcmcia_socket *s);
16662306a36Sopenharmony_ci
16762306a36Sopenharmony_ciint pccard_get_first_tuple(struct pcmcia_socket *s, unsigned int function,
16862306a36Sopenharmony_ci			tuple_t *tuple);
16962306a36Sopenharmony_ci
17062306a36Sopenharmony_ciint pccard_get_next_tuple(struct pcmcia_socket *s, unsigned int function,
17162306a36Sopenharmony_ci			tuple_t *tuple);
17262306a36Sopenharmony_ci
17362306a36Sopenharmony_ciint pccard_get_tuple_data(struct pcmcia_socket *s, tuple_t *tuple);
17462306a36Sopenharmony_ci
17562306a36Sopenharmony_ci#endif /* _LINUX_CS_INTERNAL_H */
176