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