162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *  ISA Plug & Play support
462306a36Sopenharmony_ci *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
562306a36Sopenharmony_ci */
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#ifndef LINUX_ISAPNP_H
862306a36Sopenharmony_ci#define LINUX_ISAPNP_H
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#include <linux/errno.h>
1162306a36Sopenharmony_ci#include <linux/pnp.h>
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci/*
1462306a36Sopenharmony_ci *
1562306a36Sopenharmony_ci */
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci#define ISAPNP_VENDOR(a,b,c)	(((((a)-'A'+1)&0x3f)<<2)|\
1862306a36Sopenharmony_ci				((((b)-'A'+1)&0x18)>>3)|((((b)-'A'+1)&7)<<13)|\
1962306a36Sopenharmony_ci				((((c)-'A'+1)&0x1f)<<8))
2062306a36Sopenharmony_ci#define ISAPNP_DEVICE(x)	((((x)&0xf000)>>8)|\
2162306a36Sopenharmony_ci				 (((x)&0x0f00)>>8)|\
2262306a36Sopenharmony_ci				 (((x)&0x00f0)<<8)|\
2362306a36Sopenharmony_ci				 (((x)&0x000f)<<8))
2462306a36Sopenharmony_ci#define ISAPNP_FUNCTION(x)	ISAPNP_DEVICE(x)
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci/*
2762306a36Sopenharmony_ci *
2862306a36Sopenharmony_ci */
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci#ifdef __KERNEL__
3162306a36Sopenharmony_ci#include <linux/mod_devicetable.h>
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ci#define DEVICE_COUNT_COMPATIBLE 4
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci#define ISAPNP_CARD_DEVS	8
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci#define ISAPNP_CARD_ID(_va, _vb, _vc, _device) \
3862306a36Sopenharmony_ci		.card_vendor = ISAPNP_VENDOR(_va, _vb, _vc), .card_device = ISAPNP_DEVICE(_device)
3962306a36Sopenharmony_ci#define ISAPNP_CARD_END \
4062306a36Sopenharmony_ci		.card_vendor = 0, .card_device = 0
4162306a36Sopenharmony_ci#define ISAPNP_DEVICE_ID(_va, _vb, _vc, _function) \
4262306a36Sopenharmony_ci		{ .vendor = ISAPNP_VENDOR(_va, _vb, _vc), .function = ISAPNP_FUNCTION(_function) }
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_cistruct isapnp_card_id {
4562306a36Sopenharmony_ci	unsigned long driver_data;	/* data private to the driver */
4662306a36Sopenharmony_ci	unsigned short card_vendor, card_device;
4762306a36Sopenharmony_ci	struct {
4862306a36Sopenharmony_ci		unsigned short vendor, function;
4962306a36Sopenharmony_ci	} devs[ISAPNP_CARD_DEVS];	/* logical devices */
5062306a36Sopenharmony_ci};
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci#define ISAPNP_DEVICE_SINGLE(_cva, _cvb, _cvc, _cdevice, _dva, _dvb, _dvc, _dfunction) \
5362306a36Sopenharmony_ci		.card_vendor = ISAPNP_VENDOR(_cva, _cvb, _cvc), .card_device =  ISAPNP_DEVICE(_cdevice), \
5462306a36Sopenharmony_ci		.vendor = ISAPNP_VENDOR(_dva, _dvb, _dvc), .function = ISAPNP_FUNCTION(_dfunction)
5562306a36Sopenharmony_ci#define ISAPNP_DEVICE_SINGLE_END \
5662306a36Sopenharmony_ci		.card_vendor = 0, .card_device = 0
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci#if defined(CONFIG_ISAPNP) || (defined(CONFIG_ISAPNP_MODULE) && defined(MODULE))
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci#define __ISAPNP__
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci/* lowlevel configuration */
6362306a36Sopenharmony_ciint isapnp_present(void);
6462306a36Sopenharmony_ciint isapnp_cfg_begin(int csn, int device);
6562306a36Sopenharmony_ciint isapnp_cfg_end(void);
6662306a36Sopenharmony_ciunsigned char isapnp_read_byte(unsigned char idx);
6762306a36Sopenharmony_civoid isapnp_write_byte(unsigned char idx, unsigned char val);
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci#ifdef CONFIG_PROC_FS
7062306a36Sopenharmony_ciint isapnp_proc_init(void);
7162306a36Sopenharmony_ciint isapnp_proc_done(void);
7262306a36Sopenharmony_ci#else
7362306a36Sopenharmony_cistatic inline int isapnp_proc_init(void) { return 0; }
7462306a36Sopenharmony_cistatic inline int isapnp_proc_done(void) { return 0; }
7562306a36Sopenharmony_ci#endif
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci/* compat */
7862306a36Sopenharmony_cistruct pnp_dev *pnp_find_dev(struct pnp_card *card,
7962306a36Sopenharmony_ci			     unsigned short vendor,
8062306a36Sopenharmony_ci			     unsigned short function,
8162306a36Sopenharmony_ci			     struct pnp_dev *from);
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ci#else /* !CONFIG_ISAPNP */
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ci/* lowlevel configuration */
8662306a36Sopenharmony_cistatic inline int isapnp_present(void) { return 0; }
8762306a36Sopenharmony_cistatic inline int isapnp_cfg_begin(int csn, int device) { return -ENODEV; }
8862306a36Sopenharmony_cistatic inline int isapnp_cfg_end(void) { return -ENODEV; }
8962306a36Sopenharmony_cistatic inline unsigned char isapnp_read_byte(unsigned char idx) { return 0xff; }
9062306a36Sopenharmony_cistatic inline void isapnp_write_byte(unsigned char idx, unsigned char val) { ; }
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_cistatic inline struct pnp_dev *pnp_find_dev(struct pnp_card *card,
9362306a36Sopenharmony_ci					   unsigned short vendor,
9462306a36Sopenharmony_ci					   unsigned short function,
9562306a36Sopenharmony_ci					   struct pnp_dev *from) { return NULL; }
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ci#endif /* CONFIG_ISAPNP */
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_ci#endif /* __KERNEL__ */
10062306a36Sopenharmony_ci#endif /* LINUX_ISAPNP_H */
101