patch-2.3.35 linux/drivers/sbus/char/bpp.c
Next file: linux/drivers/sbus/char/envctrl.c
Previous file: linux/drivers/sbus/char/aurora.h
Back to the patch index
Back to the overall index
- Lines: 259
- Date:
Mon Dec 20 22:06:42 1999
- Orig file:
v2.3.34/linux/drivers/sbus/char/bpp.c
- Orig date:
Tue Aug 31 17:29:14 1999
diff -u --recursive --new-file v2.3.34/linux/drivers/sbus/char/bpp.c linux/drivers/sbus/char/bpp.c
@@ -33,7 +33,7 @@
# include <linux/delay.h> /* udelay() */
# include <asm/oplib.h> /* OpenProm Library */
-# include <asm/sbus.h> /* struct linux_sbus *SBus_chain */
+# include <asm/sbus.h>
#endif
#include <asm/bpp.h>
@@ -146,23 +146,22 @@
/*
* Register block
*/
-struct bpp_regs {
/* DMA registers */
- __volatile__ __u32 p_csr; /* DMA Control/Status Register */
- __volatile__ __u32 p_addr; /* Address Register */
- __volatile__ __u32 p_bcnt; /* Byte Count Register */
- __volatile__ __u32 p_tst_csr; /* Test Control/Status (DMA2 only) */
+#define BPP_CSR 0x00
+#define BPP_ADDR 0x04
+#define BPP_BCNT 0x08
+#define BPP_TST_CSR 0x0C
/* Parallel Port registers */
- __volatile__ __u16 p_hcr; /* Hardware Configuration Register */
- __volatile__ __u16 p_ocr; /* Operation Configuration Register */
- __volatile__ __u8 p_dr; /* Parallel Data Register */
- __volatile__ __u8 p_tcr; /* Transfer Control Register */
- __volatile__ __u8 p_or; /* Output Register */
- __volatile__ __u8 p_ir; /* Input Register */
- __volatile__ __u16 p_icr; /* Interrupt Control Register */
-};
+#define BPP_HCR 0x10
+#define BPP_OCR 0x12
+#define BPP_DR 0x14
+#define BPP_TCR 0x15
+#define BPP_OR 0x16
+#define BPP_IR 0x17
+#define BPP_ICR 0x18
+#define BPP_SIZE 0x1A
-/* P_CSR. Bits of type RW1 are cleared with writting '1'. */
+/* BPP_CSR. Bits of type RW1 are cleared with writting '1'. */
#define P_DEV_ID_MASK 0xf0000000 /* R */
#define P_DEV_ID_ZEBRA 0x40000000
#define P_DEV_ID_L64854 0xa0000000 /* == NCR 89C100+89C105. Pity. */
@@ -190,12 +189,12 @@
#define P_ERR_PEND 0x00000002 /* R */
#define P_INT_PEND 0x00000001 /* R */
-/* P_HCR. Time is in increments of SBus clock. */
+/* BPP_HCR. Time is in increments of SBus clock. */
#define P_HCR_TEST 0x8000 /* Allows buried counters to be read */
#define P_HCR_DSW 0x7f00 /* Data strobe width (in ticks) */
#define P_HCR_DDS 0x007f /* Data setup before strobe (in ticks) */
-/* P_OCR. */
+/* BPP_OCR. */
#define P_OCR_MEM_CLR 0x8000
#define P_OCR_DATA_SRC 0x4000 /* ) */
#define P_OCR_DS_DSEL 0x2000 /* ) Bidirectional */
@@ -209,13 +208,13 @@
#define P_OCR_V_ILCK 0x0002 /* Versatec faded. Zebra only. */
#define P_OCR_EN_VER 0x0001 /* Enable Versatec (0 - enable). Zebra only. */
-/* P_TCR */
+/* BPP_TCR */
#define P_TCR_DIR 0x08
#define P_TCR_BUSY 0x04
#define P_TCR_ACK 0x02
#define P_TCR_DS 0x01 /* Strobe */
-/* P_OR */
+/* BPP_OR */
#define P_OR_V3 0x20 /* ) */
#define P_OR_V2 0x10 /* ) on Zebra only */
#define P_OR_V1 0x08 /* ) */
@@ -223,12 +222,12 @@
#define P_OR_AFXN 0x02 /* Auto Feed */
#define P_OR_SLCT_IN 0x01
-/* P_IR */
+/* BPP_IR */
#define P_IR_PE 0x04
#define P_IR_SLCT 0x02
#define P_IR_ERR 0x01
-/* P_ICR */
+/* BPP_ICR */
#define P_DS_IRQ 0x8000 /* RW1 */
#define P_ACK_IRQ 0x4000 /* RW1 */
#define P_BUSY_IRQ 0x2000 /* RW1 */
@@ -246,22 +245,15 @@
#define P_ERR_IRP 0x0002 /* RW1 1= rising edge */
#define P_ERR_IRQ_EN 0x0001 /* RW */
-volatile struct bpp_regs *base_addrs[BPP_NO];
-
-static inline void bpp_outb_p(__u8 data, volatile struct bpp_regs *base){
- base->p_dr = data;
-}
-
-#define bpp_inb_p(base) bpp_inb(base)
-
-static inline __u8 bpp_inb(volatile struct bpp_regs *base){
- return base->p_dr;
-}
+unsigned long base_addrs[BPP_NO];
+#define bpp_outb_p(data, base) sbus_writeb(data, (base) + BPP_DR)
+#define bpp_inb_p(base) sbus_readb((base) + BPP_DR)
+#define bpp_inb(base) sbus_readb((base) + BPP_DR)
static void set_pins(unsigned short pins, unsigned minor)
{
- volatile struct bpp_regs *base = base_addrs[minor];
+ unsigned long base = base_addrs[minor];
unsigned char bits_tcr = 0, bits_or = 0;
if (instances[minor].direction & 0x20) bits_tcr |= P_TCR_DIR;
@@ -271,8 +263,8 @@
if (! (pins & BPP_PP_nInit)) bits_or |= P_OR_INIT;
if (! (pins & BPP_PP_nSelectIn)) bits_or |= P_OR_SLCT_IN;
- base->p_or = bits_or;
- base->p_tcr = bits_tcr;
+ sbus_writeb(bits_or, base + BPP_OR);
+ sbus_writeb(bits_tcr, base + BPP_TCR);
}
/*
@@ -282,11 +274,11 @@
*/
static unsigned short get_pins(unsigned minor)
{
- volatile struct bpp_regs *base = base_addrs[minor];
+ unsigned long base = base_addrs[minor];
unsigned short bits = 0;
- unsigned value_tcr = base->p_tcr;
- unsigned value_ir = base->p_ir;
- unsigned value_or = base->p_or;
+ unsigned value_tcr = sbus_readb(base + BPP_TCR);
+ unsigned value_ir = sbus_readb(base + BPP_IR);
+ unsigned value_or = sbus_readb(base + BPP_OR);
if (value_tcr & P_TCR_DS) bits |= BPP_PP_nStrobe;
if (value_or & P_OR_AFXN) bits |= BPP_PP_nAutoFd;
@@ -302,15 +294,6 @@
return bits;
}
-#if 0
-/* P3 */
-static inline void bpp_snap(const char *msg, unsigned minor)
-{
- volatile struct bpp_regs *r = base_addrs[minor];
- printk("bpp.%s: c=%02x o=%02x i=%02x\n", msg, r->p_tcr, r->p_or, r->p_ir);
-}
-#endif
-
#endif /* __sparc__ */
static void bpp_wake_up(unsigned long val)
@@ -940,34 +923,15 @@
#if defined(__sparc__)
-static volatile struct bpp_regs *map_bpp(struct linux_sbus_device *dev, int idx)
+static unsigned long map_bpp(struct sbus_dev *dev, int idx)
{
- volatile struct bpp_regs *regs;
-
- /*
- * PROM reports different numbers on Zebra and on DMA2.
- * We need to figure out when to apply parent ranges.
- * printk will show this on different machines.
- */
-
- /* IPC Zebra 1.fa200000[1c] i=2 */
- prom_apply_sbus_ranges(dev->my_bus, &dev->reg_addrs[0],
- dev->num_registers, dev);
-
- regs = sparc_alloc_io(dev->reg_addrs[0].phys_addr, 0,
- dev->reg_addrs[0].reg_size, "bpp",
- dev->reg_addrs[0].which_io, 0x0);
- printk("bpp%d.map_bpp: 0x%x.%p[0x%x] i=%d\n", idx,
- dev->reg_addrs[0].which_io, dev->reg_addrs[0].phys_addr,
- dev->reg_addrs[0].reg_size, dev->irqs[0]);
-
- return regs;
+ return sbus_ioremap(&dev->resource[0], 0, BPP_SIZE, "bpp");
}
static int collectLptPorts(void)
{
- struct linux_sbus *bus;
- struct linux_sbus_device *dev;
+ struct sbus_bus *bus;
+ struct sbus_dev *dev;
int count;
count = 0;
@@ -988,7 +952,7 @@
static void probeLptPort(unsigned idx)
{
- volatile struct bpp_regs *rp = base_addrs[idx];
+ unsigned long rp = base_addrs[idx];
__u32 csr;
char *brand;
@@ -1007,20 +971,23 @@
instances[idx].present = 1;
instances[idx].enhanced = 1; /* Sure */
- if (((csr = rp->p_csr) & P_DRAINING) != 0 && (csr & P_ERR_PEND) == 0) {
+ csr = sbus_readl(rp + BPP_CSR);
+ if ((csr & P_DRAINING) != 0 && (csr & P_ERR_PEND) == 0) {
udelay(20);
- csr = rp->p_csr;
+ csr = sbus_readl(rp + BPP_CSR);
if ((csr & P_DRAINING) != 0 && (csr & P_ERR_PEND) == 0) {
printk("bpp%d: DRAINING still active (0x%08x)\n", idx, csr);
}
}
printk("bpp%d: reset with 0x%08x ..", idx, csr);
- rp->p_csr = (csr | P_RESET) & ~P_INT_EN;
+ sbus_writel((csr | P_RESET) & ~P_INT_EN, rp + BPP_CSR);
udelay(500);
- rp->p_csr &= ~P_RESET;
- printk(" done with csr=0x%08x ocr=0x%04x\n", rp->p_csr, rp->p_ocr);
+ sbus_writel(sbus_readl(rp + BPP_CSR) & ~P_RESET, rp + BPP_CSR);
+ csr = sbus_readl(rp + BPP_CSR);
+ printk(" done with csr=0x%08x ocr=0x%04x\n",
+ csr, sbus_readw(rp + BPP_OCR));
- switch (rp->p_csr & P_DEV_ID_MASK) {
+ switch (csr & P_DEV_ID_MASK) {
case P_DEV_ID_ZEBRA:
brand = "Zebra";
break;
@@ -1030,7 +997,7 @@
default:
brand = "Unknown";
}
- printk("bpp%d: %s at 0x%p\n", idx, brand, rp);
+ printk("bpp%d: %s at 0x%lx\n", idx, brand, rp);
/*
* Leave the port in compat idle mode.
@@ -1042,7 +1009,7 @@
static inline void freeLptPort(int idx)
{
- sparc_free_io ((void *)base_addrs[idx], sizeof(struct bpp_regs));
+ sbus_iounmap(base_addrs[idx], BPP_SIZE);
}
#endif
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)