162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/* ns87303.h: Configuration Register Description for the
362306a36Sopenharmony_ci *            National Semiconductor PC87303 (SuperIO).
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 1997  Eddie C. Dost  (ecd@skynet.be)
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#ifndef _SPARC_NS87303_H
962306a36Sopenharmony_ci#define _SPARC_NS87303_H 1
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci/*
1262306a36Sopenharmony_ci * Control Register Index Values
1362306a36Sopenharmony_ci */
1462306a36Sopenharmony_ci#define FER	0x00
1562306a36Sopenharmony_ci#define FAR	0x01
1662306a36Sopenharmony_ci#define PTR	0x02
1762306a36Sopenharmony_ci#define FCR	0x03
1862306a36Sopenharmony_ci#define PCR	0x04
1962306a36Sopenharmony_ci#define KRR	0x05
2062306a36Sopenharmony_ci#define PMC	0x06
2162306a36Sopenharmony_ci#define TUP	0x07
2262306a36Sopenharmony_ci#define SID	0x08
2362306a36Sopenharmony_ci#define ASC	0x09
2462306a36Sopenharmony_ci#define CS0CF0	0x0a
2562306a36Sopenharmony_ci#define CS0CF1	0x0b
2662306a36Sopenharmony_ci#define CS1CF0	0x0c
2762306a36Sopenharmony_ci#define CS1CF1	0x0d
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci/* Function Enable Register (FER) bits */
3062306a36Sopenharmony_ci#define FER_EDM		0x10	/* Encoded Drive and Motor pin information   */
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci/* Function Address Register (FAR) bits */
3362306a36Sopenharmony_ci#define FAR_LPT_MASK	0x03
3462306a36Sopenharmony_ci#define FAR_LPTB	0x00
3562306a36Sopenharmony_ci#define FAR_LPTA	0x01
3662306a36Sopenharmony_ci#define FAR_LPTC	0x02
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci/* Power and Test Register (PTR) bits */
3962306a36Sopenharmony_ci#define PTR_LPTB_IRQ7	0x08
4062306a36Sopenharmony_ci#define PTR_LEVEL_IRQ	0x80	/* When not ECP/EPP: Use level IRQ           */
4162306a36Sopenharmony_ci#define PTR_LPT_REG_DIR	0x80	/* When ECP/EPP: LPT CTR controls direction */
4262306a36Sopenharmony_ci				/*               of the parallel port	     */
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci/* Function Control Register (FCR) bits */
4562306a36Sopenharmony_ci#define FCR_LDE		0x10	/* Logical Drive Exchange                    */
4662306a36Sopenharmony_ci#define FCR_ZWS_ENA	0x20	/* Enable short host read/write in ECP/EPP   */
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci/* Printer Control Register (PCR) bits */
4962306a36Sopenharmony_ci#define PCR_EPP_ENABLE	0x01
5062306a36Sopenharmony_ci#define PCR_EPP_IEEE	0x02	/* Enable EPP Version 1.9 (IEEE 1284)        */
5162306a36Sopenharmony_ci#define PCR_ECP_ENABLE	0x04
5262306a36Sopenharmony_ci#define PCR_ECP_CLK_ENA	0x08	/* If 0 ECP Clock is stopped on Power down   */
5362306a36Sopenharmony_ci#define PCR_IRQ_POLAR	0x20	/* If 0 IRQ is level high or negative pulse, */
5462306a36Sopenharmony_ci				/* if 1 polarity is inverted                 */
5562306a36Sopenharmony_ci#define PCR_IRQ_ODRAIN	0x40	/* If 1, IRQ is open drain                   */
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci/* Tape UARTs and Parallel Port Config Register (TUP) bits */
5862306a36Sopenharmony_ci#define TUP_EPP_TIMO	0x02	/* Enable EPP timeout IRQ                    */
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci/* Advanced SuperIO Config Register (ASC) bits */
6162306a36Sopenharmony_ci#define ASC_LPT_IRQ7	0x01	/* Always use IRQ7 for LPT                  */
6262306a36Sopenharmony_ci#define ASC_DRV2_SEL	0x02	/* Logical Drive Exchange controlled by TDR  */
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ci#define FER_RESERVED	0x00
6562306a36Sopenharmony_ci#define FAR_RESERVED	0x00
6662306a36Sopenharmony_ci#define PTR_RESERVED	0x73
6762306a36Sopenharmony_ci#define FCR_RESERVED	0xc4
6862306a36Sopenharmony_ci#define PCR_RESERVED	0x10
6962306a36Sopenharmony_ci#define KRR_RESERVED	0x00
7062306a36Sopenharmony_ci#define PMC_RESERVED	0x98
7162306a36Sopenharmony_ci#define TUP_RESERVED	0xfb
7262306a36Sopenharmony_ci#define SIP_RESERVED	0x00
7362306a36Sopenharmony_ci#define ASC_RESERVED	0x18
7462306a36Sopenharmony_ci#define CS0CF0_RESERVED	0x00
7562306a36Sopenharmony_ci#define CS0CF1_RESERVED	0x08
7662306a36Sopenharmony_ci#define CS1CF0_RESERVED	0x00
7762306a36Sopenharmony_ci#define CS1CF1_RESERVED	0x08
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci#ifdef __KERNEL__
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ci#include <linux/spinlock.h>
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ci#include <asm/io.h>
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ciextern spinlock_t ns87303_lock;
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_cistatic inline int ns87303_modify(unsigned long port, unsigned int index,
8862306a36Sopenharmony_ci				     unsigned char clr, unsigned char set)
8962306a36Sopenharmony_ci{
9062306a36Sopenharmony_ci	static unsigned char reserved[] = {
9162306a36Sopenharmony_ci		FER_RESERVED, FAR_RESERVED, PTR_RESERVED, FCR_RESERVED,
9262306a36Sopenharmony_ci		PCR_RESERVED, KRR_RESERVED, PMC_RESERVED, TUP_RESERVED,
9362306a36Sopenharmony_ci		SIP_RESERVED, ASC_RESERVED, CS0CF0_RESERVED, CS0CF1_RESERVED,
9462306a36Sopenharmony_ci		CS1CF0_RESERVED, CS1CF1_RESERVED
9562306a36Sopenharmony_ci	};
9662306a36Sopenharmony_ci	unsigned long flags;
9762306a36Sopenharmony_ci	unsigned char value;
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_ci	if (index > 0x0d)
10062306a36Sopenharmony_ci		return -EINVAL;
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_ci	spin_lock_irqsave(&ns87303_lock, flags);
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ci	outb(index, port);
10562306a36Sopenharmony_ci	value = inb(port + 1);
10662306a36Sopenharmony_ci	value &= ~(reserved[index] | clr);
10762306a36Sopenharmony_ci	value |= set;
10862306a36Sopenharmony_ci	outb(value, port + 1);
10962306a36Sopenharmony_ci	outb(value, port + 1);
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_ci	spin_unlock_irqrestore(&ns87303_lock, flags);
11262306a36Sopenharmony_ci
11362306a36Sopenharmony_ci	return 0;
11462306a36Sopenharmony_ci}
11562306a36Sopenharmony_ci
11662306a36Sopenharmony_ci#endif /* __KERNEL__ */
11762306a36Sopenharmony_ci
11862306a36Sopenharmony_ci#endif /* !(_SPARC_NS87303_H) */
119