diff options
Diffstat (limited to 'drivers/char')
-rw-r--r-- | drivers/char/cyclades.c | 384 | ||||
-rw-r--r-- | drivers/char/nwbutton.c | 6 | ||||
-rw-r--r-- | drivers/char/nwflash.c | 6 |
3 files changed, 152 insertions, 244 deletions
diff --git a/drivers/char/cyclades.c b/drivers/char/cyclades.c index d2aa95921..48047a637 100644 --- a/drivers/char/cyclades.c +++ b/drivers/char/cyclades.c @@ -1,12 +1,12 @@ #undef BLOCKMOVE #define Z_WAKE static char rcsid[] = -"$Revision: 2.3.2.4 $$Date: 2000/01/17 09:19:40 $"; +"$Revision: 2.3.2.6 $$Date: 2000/05/05 13:56:05 $"; /* * linux/drivers/char/cyclades.c * - * This file contains the driver for the Cyclades Cyclom-Y multiport + * This file contains the driver for the Cyclades async multiport * serial boards. * * Initially written by Randolph Bentson <bentson@grieg.seaslug.org>. @@ -23,14 +23,22 @@ static char rcsid[] = * * This version supports shared IRQ's (only for PCI boards). * - * This module exports the following rs232 io functions: - * int cy_init(void); - * int cy_open(struct tty_struct *tty, struct file *filp); - * and the following functions for modularization. - * int init_module(void); - * void cleanup_module(void); - * * $Log: cyclades.c,v $ + * Revision 2.3.2.6 2000/05/05 13:56:05 ivan + * Driver now reports physical instead of virtual memory addresses. + * Masks were added to some Cyclades-Z read accesses. + * Implemented workaround for PLX9050 bug that would cause a system lockup + * in certain systems, depending on the MMIO addresses allocated to the + * board. + * Changed the Tx interrupt programming in the CD1400 chips to boost up + * performance (Cyclom-Y only). + * Code is now compliant with the new module interface (module_[init|exit]). + * Make use of the PCI helper functions to access PCI resources. + * Did some code "housekeeping". + * + * Revision 2.3.2.5 2000/01/19 14:35:33 ivan + * Fixed bug in cy_set_termios on CRTSCTS flag turnoff. + * * Revision 2.3.2.4 2000/01/17 09:19:40 ivan * Fixed SMP locking in Cyclom-Y interrupt handler. * @@ -695,7 +703,7 @@ cy_get_user(unsigned long *addr) #ifndef SERIAL_XMIT_SIZE #define SERIAL_XMIT_SIZE (MIN(PAGE_SIZE, 4096)) #endif -#define WAKEUP_CHARS (SERIAL_XMIT_SIZE-256) +#define WAKEUP_CHARS 256 #define STD_COM_FLAGS (0) @@ -706,7 +714,7 @@ static DECLARE_TASK_QUEUE(tq_cyclades); static struct tty_driver cy_serial_driver, cy_callout_driver; static int serial_refcount; -#ifndef CONFIG_COBALT_27 +#ifdef CONFIG_ISA /* This is the address lookup table. The driver will probe for Cyclom-Y/ISA boards at all addresses in here. If you want the driver to probe addresses at a different address, add it to @@ -737,7 +745,7 @@ MODULE_PARM(maddr, "1-" __MODULE_STRING(NR_CARDS) "l"); MODULE_PARM(irq, "1-" __MODULE_STRING(NR_CARDS) "i"); #endif -#endif /* CONFIG_COBALT_27 */ +#endif /* CONFIG_ISA */ /* This is the per-card data structure containing address, irq, number of channels, etc. This driver supports a maximum of NR_CARDS cards. @@ -861,12 +869,9 @@ static unsigned short cy_pci_dev_id[] = { static void cy_start(struct tty_struct *); static void set_line_char(struct cyclades_port *); static int cyz_issue_cmd(struct cyclades_card *, uclong, ucchar, uclong); -#ifndef CONFIG_COBALT_27 +#ifdef CONFIG_ISA static unsigned detect_isa_irq (volatile ucchar *); -#endif /* CONFIG_COBALT_27 */ -#ifdef CYCLOM_SHOW_STATUS -static void show_status(int); -#endif +#endif /* CONFIG_ISA */ static int cyclades_get_proc_info(char *, char **, off_t , int , int *, void *); @@ -877,23 +882,15 @@ static void cyz_poll(unsigned long); static long cyz_polling_cycle = CZ_DEF_POLL; static int cyz_timeron = 0; -static struct timer_list cyz_timerlist = { - function: cyz_poll +static struct timer_list +cyz_timerlist = { + NULL, NULL, 0, 0, cyz_poll }; #else /* CONFIG_CYZ_INTR */ static void cyz_rx_restart(unsigned long); static struct timer_list cyz_rx_full_timer[NR_PORTS]; #endif /* CONFIG_CYZ_INTR */ -/************************************************** -error = verify_area(VERIFY_WRITE, (void *) arg, sizeof(unsigned long)); -copy_to_user (to, from, count); -*************************************************************** -error = verify_area(VERIFY_READ, (void *) arg, sizeof(unsigned long *)); -copy_from_user(to, from, count); -**************************************************/ - - static inline int serial_paranoia_check(struct cyclades_port *info, kdev_t device, const char *routine) @@ -1047,7 +1044,8 @@ cyy_issue_cmd(volatile ucchar *base_addr, u_char cmd, int index) return(0); } /* cyy_issue_cmd */ -#ifndef CONFIG_COBALT_27 /* ISA interrupt detection code */ +#ifdef CONFIG_ISA +/* ISA interrupt detection code */ static unsigned detect_isa_irq (volatile ucchar *address) { @@ -1074,7 +1072,7 @@ detect_isa_irq (volatile ucchar *address) cy_writeb((u_long)address + (CyCAR<<index), 0); cy_writeb((u_long)address + (CySRER<<index), - cy_readb(address + (CySRER<<index)) | CyTxMpty); + cy_readb(address + (CySRER<<index)) | CyTxRdy); restore_flags(flags); /* Wait ... */ @@ -1088,7 +1086,7 @@ detect_isa_irq (volatile ucchar *address) save_car = cy_readb(address + (CyCAR<<index)); cy_writeb((u_long)address + (CyCAR<<index), (save_xir & 0x3)); cy_writeb((u_long)address + (CySRER<<index), - cy_readb(address + (CySRER<<index)) & ~CyTxMpty); + cy_readb(address + (CySRER<<index)) & ~CyTxRdy); cy_writeb((u_long)address + (CyTIR<<index), (save_xir & 0x3f)); cy_writeb((u_long)address + (CyCAR<<index), (save_car)); cy_writeb((u_long)address + (Cy_ClrIntr<<index), 0); @@ -1096,7 +1094,7 @@ detect_isa_irq (volatile ucchar *address) return (irq > 0)? irq : 0; } -#endif /* CONFIG_COBALT_27 */ +#endif /* CONFIG_ISA */ /* The real interrupt service routine is called whenever the card wants its hand held--chars @@ -1319,14 +1317,14 @@ cyy_interrupt(int irq, void *dev_id, struct pt_regs *regs) /* validate the port# (as configured and open) */ if( (i < 0) || (NR_PORTS <= i) ){ cy_writeb((u_long)base_addr+(CySRER<<index), - cy_readb(base_addr+(CySRER<<index)) & ~CyTxMpty); + cy_readb(base_addr+(CySRER<<index)) & ~CyTxRdy); goto txend; } info = &cy_port[i]; info->last_active = jiffies; if(info->tty == 0){ cy_writeb((u_long)base_addr+(CySRER<<index), - cy_readb(base_addr+(CySRER<<index)) & ~CyTxMpty); + cy_readb(base_addr+(CySRER<<index)) & ~CyTxRdy); goto txdone; } @@ -1360,19 +1358,19 @@ cyy_interrupt(int irq, void *dev_id, struct pt_regs *regs) if (!info->xmit_cnt){ cy_writeb((u_long)base_addr+(CySRER<<index), cy_readb(base_addr+(CySRER<<index)) & - ~CyTxMpty); + ~CyTxRdy); goto txdone; } if (info->xmit_buf == 0){ cy_writeb((u_long)base_addr+(CySRER<<index), cy_readb(base_addr+(CySRER<<index)) & - ~CyTxMpty); + ~CyTxRdy); goto txdone; } if (info->tty->stopped || info->tty->hw_stopped){ cy_writeb((u_long)base_addr+(CySRER<<index), cy_readb(base_addr+(CySRER<<index)) & - ~CyTxMpty); + ~CyTxRdy); goto txdone; } /* Because the Embedded Transmit Commands have @@ -1470,7 +1468,7 @@ cyy_interrupt(int irq, void *dev_id, struct pt_regs *regs) info->tty->hw_stopped = 0; cy_writeb((u_long)base_addr+(CySRER<<index), cy_readb(base_addr+(CySRER<<index)) | - CyTxMpty); + CyTxRdy); cy_sched_event(info, Cy_EVENT_WRITE_WAKEUP); } @@ -1481,7 +1479,7 @@ cyy_interrupt(int irq, void *dev_id, struct pt_regs *regs) info->tty->hw_stopped = 1; cy_writeb((u_long)base_addr+(CySRER<<index), cy_readb(base_addr+(CySRER<<index)) & - ~CyTxMpty); + ~CyTxRdy); } } } @@ -1526,7 +1524,8 @@ cyz_fetch_msg( struct cyclades_card *cinfo, return (-1); } zfw_ctrl = (struct ZFW_CTRL *) - (cinfo->base_addr + cy_readl(&firm_id->zfwctrl_addr)); + (cinfo->base_addr + + (cy_readl(&firm_id->zfwctrl_addr) & 0xfffff)); board_ctrl = &zfw_ctrl->board_ctrl; loc_doorbell = cy_readl(&((struct RUNTIME_9060 *) @@ -1557,7 +1556,8 @@ cyz_issue_cmd( struct cyclades_card *cinfo, return (-1); } zfw_ctrl = (struct ZFW_CTRL *) - (cinfo->base_addr + cy_readl(&firm_id->zfwctrl_addr)); + (cinfo->base_addr + + (cy_readl(&firm_id->zfwctrl_addr) & 0xfffff)); board_ctrl = &zfw_ctrl->board_ctrl; index = 0; @@ -1774,7 +1774,8 @@ cyz_handle_cmd(struct cyclades_card *cinfo) firm_id = (struct FIRM_ID *)(cinfo->base_addr + ID_ADDRESS); zfw_ctrl = (struct ZFW_CTRL *) - (cinfo->base_addr + cy_readl(&firm_id->zfwctrl_addr)); + (cinfo->base_addr + + (cy_readl(&firm_id->zfwctrl_addr) & 0xfffff)); board_ctrl = &(zfw_ctrl->board_ctrl); fw_ver = cy_readl(&board_ctrl->fw_version); hw_ver = cy_readl(&((struct RUNTIME_9060 *)(cinfo->ctl_addr))->mail_box_0); @@ -1951,7 +1952,8 @@ cyz_poll(unsigned long arg) firm_id = (struct FIRM_ID *)(cinfo->base_addr + ID_ADDRESS); zfw_ctrl = (struct ZFW_CTRL *) - (cinfo->base_addr + cy_readl(&firm_id->zfwctrl_addr)); + (cinfo->base_addr + + (cy_readl(&firm_id->zfwctrl_addr) & 0xfffff)); board_ctrl = &(zfw_ctrl->board_ctrl); /* Skip first polling cycle to avoid racing conditions with the FW */ @@ -2091,9 +2093,9 @@ startup(struct cyclades_port * info) return -ENODEV; } - zfw_ctrl = - (struct ZFW_CTRL *) - (cy_card[card].base_addr + cy_readl(&firm_id->zfwctrl_addr)); + zfw_ctrl = (struct ZFW_CTRL *) + (cy_card[card].base_addr + + (cy_readl(&firm_id->zfwctrl_addr) & 0xfffff)); board_ctrl = &zfw_ctrl->board_ctrl; ch_ctrl = zfw_ctrl->ch_ctrl; @@ -2201,7 +2203,7 @@ start_xmit( struct cyclades_port *info ) CY_LOCK(info, flags); cy_writeb((u_long)base_addr+(CyCAR<<index), channel); cy_writeb((u_long)base_addr+(CySRER<<index), - cy_readb(base_addr+(CySRER<<index)) | CyTxMpty); + cy_readb(base_addr+(CySRER<<index)) | CyTxRdy); CY_UNLOCK(info, flags); } else { #ifdef CONFIG_CYZ_INTR @@ -2299,9 +2301,9 @@ shutdown(struct cyclades_port * info) return; } - zfw_ctrl = - (struct ZFW_CTRL *) - (cy_card[card].base_addr + cy_readl(&firm_id->zfwctrl_addr)); + zfw_ctrl = (struct ZFW_CTRL *) + (cy_card[card].base_addr + + (cy_readl(&firm_id->zfwctrl_addr) & 0xfffff)); board_ctrl = &(zfw_ctrl->board_ctrl); ch_ctrl = zfw_ctrl->ch_ctrl; @@ -2499,9 +2501,8 @@ block_til_ready(struct tty_struct *tty, struct file * filp, return -EINVAL; } - zfw_ctrl = - (struct ZFW_CTRL *) - (base_addr + cy_readl(&firm_id->zfwctrl_addr)); + zfw_ctrl = (struct ZFW_CTRL *) + (base_addr + (cy_readl(&firm_id->zfwctrl_addr) & 0xfffff)); board_ctrl = &zfw_ctrl->board_ctrl; ch_ctrl = zfw_ctrl->ch_ctrl; @@ -2758,7 +2759,7 @@ cy_wait_until_sent(struct tty_struct *tty, int timeout) index = cy_card[card].bus_index; base_addr = (unsigned char *) (cy_card[card].base_addr + (cy_chip_offset[chip]<<index)); - while (cy_readb(base_addr+(CySRER<<index)) & CyTxMpty) { + while (cy_readb(base_addr+(CySRER<<index)) & CyTxRdy) { #ifdef CY_DEBUG_WAIT_UNTIL_SENT printk("Not clean (jiff=%lu)...", jiffies); #endif @@ -2882,8 +2883,8 @@ cy_close(struct tty_struct *tty, struct file *filp) unsigned char *base_addr = (unsigned char *) cy_card[info->card].base_addr; struct FIRM_ID *firm_id = (struct FIRM_ID *) (base_addr + ID_ADDRESS); - struct ZFW_CTRL *zfw_ctrl = - (struct ZFW_CTRL *) (base_addr + cy_readl(&firm_id->zfwctrl_addr)); + struct ZFW_CTRL *zfw_ctrl = (struct ZFW_CTRL *) + (base_addr + (cy_readl(&firm_id->zfwctrl_addr) & 0xfffff)); struct CH_CTRL *ch_ctrl = zfw_ctrl->ch_ctrl; int channel = info->line - cy_card[info->card].first_line; int retval; @@ -3136,8 +3137,9 @@ cy_chars_in_buffer(struct tty_struct *tty) volatile uclong tx_put, tx_get, tx_bufsize; firm_id = (struct FIRM_ID *)(cy_card[card].base_addr + ID_ADDRESS); - zfw_ctrl = (struct ZFW_CTRL *) (cy_card[card].base_addr + - cy_readl(&firm_id->zfwctrl_addr)); + zfw_ctrl = (struct ZFW_CTRL *) + (cy_card[card].base_addr + + (cy_readl(&firm_id->zfwctrl_addr) & 0xfffff)); ch_ctrl = &(zfw_ctrl->ch_ctrl[channel]); buf_ctrl = &(zfw_ctrl->buf_ctrl[channel]); @@ -3427,7 +3429,8 @@ set_line_char(struct cyclades_port * info) } zfw_ctrl = (struct ZFW_CTRL *) - (cy_card[card].base_addr + cy_readl(&firm_id->zfwctrl_addr)); + (cy_card[card].base_addr + + (cy_readl(&firm_id->zfwctrl_addr) & 0xfffff)); board_ctrl = &zfw_ctrl->board_ctrl; ch_ctrl = &(zfw_ctrl->ch_ctrl[channel]); buf_ctrl = &zfw_ctrl->buf_ctrl[channel]; @@ -3660,7 +3663,8 @@ get_modem_info(struct cyclades_port * info, unsigned int *value) (cy_card[card].base_addr + ID_ADDRESS); if (ISZLOADED(cy_card[card])) { zfw_ctrl = (struct ZFW_CTRL *) - (cy_card[card].base_addr + cy_readl(&firm_id->zfwctrl_addr)); + (cy_card[card].base_addr + + (cy_readl(&firm_id->zfwctrl_addr) & 0xfffff)); board_ctrl = &zfw_ctrl->board_ctrl; ch_ctrl = zfw_ctrl->ch_ctrl; lstatus = cy_readl(&ch_ctrl[channel].rs_status); @@ -3825,7 +3829,8 @@ set_modem_info(struct cyclades_port * info, unsigned int cmd, (cy_card[card].base_addr + ID_ADDRESS); if (ISZLOADED(cy_card[card])) { zfw_ctrl = (struct ZFW_CTRL *) - (cy_card[card].base_addr + cy_readl(&firm_id->zfwctrl_addr)); + (cy_card[card].base_addr + + (cy_readl(&firm_id->zfwctrl_addr) & 0xfffff)); board_ctrl = &zfw_ctrl->board_ctrl; ch_ctrl = zfw_ctrl->ch_ctrl; @@ -4337,7 +4342,7 @@ cy_set_termios(struct tty_struct *tty, struct termios * old_termios) if ((old_termios->c_cflag & CRTSCTS) && !(tty->termios->c_cflag & CRTSCTS)) { - tty->stopped = 0; + tty->hw_stopped = 0; cy_start(tty); } #if 0 @@ -4502,7 +4507,7 @@ cy_stop(struct tty_struct *tty) cy_writeb((u_long)base_addr+(CyCAR<<index), (u_char)(channel & 0x0003)); /* index channel */ cy_writeb((u_long)base_addr+(CySRER<<index), - cy_readb(base_addr+(CySRER<<index)) & ~CyTxMpty); + cy_readb(base_addr+(CySRER<<index)) & ~CyTxRdy); CY_UNLOCK(info, flags); } else { // Nothing to do! @@ -4542,7 +4547,7 @@ cy_start(struct tty_struct *tty) cy_writeb((u_long)base_addr+(CyCAR<<index), (u_char)(channel & 0x0003)); /* index channel */ cy_writeb((u_long)base_addr+(CySRER<<index), - cy_readb(base_addr+(CySRER<<index)) | CyTxMpty); + cy_readb(base_addr+(CySRER<<index)) | CyTxRdy); CY_UNLOCK(info, flags); } else { // Nothing to do! @@ -4707,7 +4712,6 @@ cyy_init_card(volatile ucchar *true_base_addr,int index) return chip_number; } /* cyy_init_card */ -#ifndef CONFIG_COBALT_27 /* * --------------------------------------------------------------------- * cy_detect_isa() - Probe for Cyclom-Y/ISA boards. @@ -4717,6 +4721,7 @@ cyy_init_card(volatile ucchar *true_base_addr,int index) static int __init cy_detect_isa(void) { +#ifdef CONFIG_ISA unsigned short cy_isa_irq,nboard; volatile ucchar *cy_isa_address; unsigned short i,j,cy_isa_nchan; @@ -4746,7 +4751,6 @@ cy_detect_isa(void) } /* probe for CD1400... */ - #if !defined(__alpha__) cy_isa_address = ioremap((ulong)cy_isa_address, CyISA_Ywin); #endif @@ -4819,9 +4823,10 @@ cy_detect_isa(void) cy_next_channel += cy_isa_nchan; } return(nboard); - +#else + return(0); +#endif /* CONFIG_ISA */ } /* cy_detect_isa */ -#endif /* CONFIG_COBALT_27 */ static void plx_init(uclong addr, uclong initctl) @@ -4851,11 +4856,13 @@ cy_detect_pci(void) struct pci_dev *pdev = NULL; unsigned char cyy_rev_id; unsigned char cy_pci_irq = 0; - uclong cy_pci_addr0, cy_pci_addr1, cy_pci_addr2; + uclong cy_pci_phys0, cy_pci_phys2; + uclong cy_pci_addr0, cy_pci_addr2; unsigned short i,j,cy_pci_nchan, plx_ver; unsigned short device_id,dev_index = 0; uclong mailbox; uclong Ze_addr0[NR_CARDS], Ze_addr2[NR_CARDS], ZeIndex = 0; + uclong Ze_phys0[NR_CARDS], Ze_phys2[NR_CARDS]; unsigned char Ze_irq[NR_CARDS]; for (i = 0; i < NR_CARDS; i++) { @@ -4877,10 +4884,9 @@ cy_detect_pci(void) /* read PCI configuration area */ cy_pci_irq = pdev->irq; - cy_pci_addr0 = pci_resource_start(pdev, 0); - cy_pci_addr1 = pci_resource_start(pdev, 1); - cy_pci_addr2 = pci_resource_start(pdev, 2); - pci_read_config_byte(pdev, PCI_REVISION_ID, &cyy_rev_id); + cy_pci_phys0 = pci_resource_start(pdev, 0); + cy_pci_phys2 = pci_resource_start(pdev, 2); + pci_read_config_byte(pdev, PCI_REVISION_ID, &cyy_rev_id); device_id &= ~PCI_DEVICE_ID_MASK; @@ -4892,13 +4898,13 @@ cy_detect_pci(void) printk("rev_id=%d) IRQ%d\n", cyy_rev_id, (int)cy_pci_irq); printk("Cyclom-Y/PCI:found winaddr=0x%lx ctladdr=0x%lx\n", - (ulong)cy_pci_addr2, (ulong)cy_pci_addr0); + (ulong)cy_pci_phys2, (ulong)cy_pci_phys0); #endif - if (pdev->resource[2].flags & ~PCI_BASE_ADDRESS_IO_MASK) { + if (pci_resource_flags(pdev, 2) & IORESOURCE_IO) { printk(" Warning: PCI I/O bit incorrectly set. " "Ignoring it...\n"); - pdev->resource[2].flags &= PCI_BASE_ADDRESS_IO_MASK; + pdev->resource[2].flags &= ~IORESOURCE_IO; } #if defined(__alpha__) @@ -4908,15 +4914,15 @@ cy_detect_pci(void) printk("rev_id=%d) IRQ%d\n", cyy_rev_id, (int)cy_pci_irq); printk("Cyclom-Y/PCI:found winaddr=0x%lx ctladdr=0x%lx\n", - (ulong)cy_pci_addr2, (ulong)cy_pci_addr0); + (ulong)cy_pci_phys2, (ulong)cy_pci_phys0); printk("Cyclom-Y/PCI not supported for low addresses in " "Alpha systems.\n"); i--; continue; } #else - cy_pci_addr0 = (ulong)ioremap(cy_pci_addr0, CyPCI_Yctl); - cy_pci_addr2 = (ulong)ioremap(cy_pci_addr2, CyPCI_Ywin); + cy_pci_addr0 = (ulong)ioremap(cy_pci_phys0, CyPCI_Yctl); + cy_pci_addr2 = (ulong)ioremap(cy_pci_phys2, CyPCI_Ywin); #endif #ifdef CY_PCI_DEBUG @@ -4928,13 +4934,13 @@ cy_detect_pci(void) if(cy_pci_nchan == 0) { printk("Cyclom-Y PCI host card with "); printk("no Serial-Modules at 0x%lx.\n", - (ulong) cy_pci_addr2); + (ulong) cy_pci_phys2); i--; continue; } if((cy_next_channel+cy_pci_nchan) > NR_PORTS) { printk("Cyclom-Y/PCI found at 0x%lx ", - (ulong) cy_pci_addr2); + (ulong) cy_pci_phys2); printk("but no channels are available.\n"); printk("Change NR_PORTS in cyclades.c and recompile kernel.\n"); return(i); @@ -4945,7 +4951,7 @@ cy_detect_pci(void) } if (j == NR_CARDS) { /* no more cy_cards available */ printk("Cyclom-Y/PCI found at 0x%lx ", - (ulong) cy_pci_addr2); + (ulong) cy_pci_phys2); printk("but no more cards can be used.\n"); printk("Change NR_CARDS in cyclades.c and recompile kernel.\n"); return(i); @@ -4956,13 +4962,15 @@ cy_detect_pci(void) SA_SHIRQ, "Cyclom-Y", &cy_card[j])) { printk("Cyclom-Y/PCI found at 0x%lx ", - (ulong) cy_pci_addr2); + (ulong) cy_pci_phys2); printk("but could not allocate IRQ%d.\n", cy_pci_irq); return(i); } /* set cy_card */ + cy_card[j].base_phys = (ulong)cy_pci_phys2; + cy_card[j].ctl_phys = (ulong)cy_pci_phys0; cy_card[j].base_addr = (ulong)cy_pci_addr2; cy_card[j].ctl_addr = (ulong)cy_pci_addr0; cy_card[j].irq = (int) cy_pci_irq; @@ -4975,10 +4983,7 @@ cy_detect_pci(void) switch (plx_ver) { case PLX_9050: - plx_init(cy_pci_addr0, 0x50); - - cy_writew(cy_pci_addr0+0x4c, - cy_readw(cy_pci_addr0+0x4c)|0x0040); + cy_writeb(cy_pci_addr0+0x4c, 0x43); break; case PLX_9060: @@ -5000,8 +5005,8 @@ cy_detect_pci(void) /* print message */ printk("Cyclom-Y/PCI #%d: 0x%lx-0x%lx, IRQ%d, ", j+1, - (ulong)cy_pci_addr2, - (ulong)(cy_pci_addr2 + CyPCI_Ywin - 1), + (ulong)cy_pci_phys2, + (ulong)(cy_pci_phys2 + CyPCI_Ywin - 1), (int)cy_pci_irq); printk("%d channels starting from port %d.\n", cy_pci_nchan, cy_next_channel); @@ -5014,7 +5019,7 @@ cy_detect_pci(void) printk("rev_id=%d) IRQ%d\n", cyy_rev_id, (int)cy_pci_irq); printk("Cyclades-Z/PCI: found winaddr=0x%lx ctladdr=0x%lx\n", - (ulong)cy_pci_addr2, (ulong)cy_pci_addr0); + (ulong)cy_pci_phys2, (ulong)cy_pci_phys0); printk("Cyclades-Z/PCI not supported for low addresses\n"); break; }else if (device_id == PCI_DEVICE_ID_CYCLOM_Z_Hi){ @@ -5024,10 +5029,10 @@ cy_detect_pci(void) printk("rev_id=%d) IRQ%d\n", cyy_rev_id, (int)cy_pci_irq); printk("Cyclades-Z/PCI: found winaddr=0x%lx ctladdr=0x%lx\n", - (ulong)cy_pci_addr2, (ulong)cy_pci_addr0); + (ulong)cy_pci_phys2, (ulong)cy_pci_phys0); #endif #if !defined(__alpha__) - cy_pci_addr0 = (ulong)ioremap(cy_pci_addr0, CyPCI_Zctl); + cy_pci_addr0 = (ulong)ioremap(cy_pci_phys0, CyPCI_Zctl); #endif /* Disable interrupts on the PLX before resetting it */ @@ -5044,21 +5049,23 @@ cy_detect_pci(void) mailbox = (uclong)cy_readl(&((struct RUNTIME_9060 *) cy_pci_addr0)->mail_box_0); - if (pdev->resource[2].flags & ~PCI_BASE_ADDRESS_IO_MASK) { + if (pci_resource_flags(pdev, 2) & IORESOURCE_IO) { printk(" Warning: PCI I/O bit incorrectly set. " "Ignoring it...\n"); - pdev->resource[2].flags &= PCI_BASE_ADDRESS_IO_MASK; + pdev->resource[2].flags &= ~IORESOURCE_IO; } if (mailbox == ZE_V1) { #if !defined(__alpha__) - cy_pci_addr2 = (ulong)ioremap(cy_pci_addr2, CyPCI_Ze_win); + cy_pci_addr2 = (ulong)ioremap(cy_pci_phys2, CyPCI_Ze_win); #endif if (ZeIndex == NR_CARDS) { printk("Cyclades-Ze/PCI found at 0x%lx ", - (ulong)cy_pci_addr2); + (ulong)cy_pci_phys2); printk("but no more cards can be used.\n"); printk("Change NR_CARDS in cyclades.c and recompile kernel.\n"); } else { + Ze_phys0[ZeIndex] = cy_pci_phys0; + Ze_phys2[ZeIndex] = cy_pci_phys2; Ze_addr0[ZeIndex] = cy_pci_addr0; Ze_addr2[ZeIndex] = cy_pci_addr2; Ze_irq[ZeIndex] = cy_pci_irq; @@ -5068,7 +5075,7 @@ cy_detect_pci(void) continue; } else { #if !defined(__alpha__) - cy_pci_addr2 = (ulong)ioremap(cy_pci_addr2, CyPCI_Zwin); + cy_pci_addr2 = (ulong)ioremap(cy_pci_phys2, CyPCI_Zwin); #endif } @@ -5105,7 +5112,7 @@ cy_detect_pci(void) if((cy_next_channel+cy_pci_nchan) > NR_PORTS) { printk("Cyclades-8Zo/PCI found at 0x%lx ", - (ulong)cy_pci_addr2); + (ulong)cy_pci_phys2); printk("but no channels are available.\n"); printk("Change NR_PORTS in cyclades.c and recompile kernel.\n"); return(i); @@ -5117,7 +5124,7 @@ cy_detect_pci(void) } if (j == NR_CARDS) { /* no more cy_cards available */ printk("Cyclades-8Zo/PCI found at 0x%lx ", - (ulong)cy_pci_addr2); + (ulong)cy_pci_phys2); printk("but no more cards can be used.\n"); printk("Change NR_CARDS in cyclades.c and recompile kernel.\n"); return(i); @@ -5129,10 +5136,10 @@ cy_detect_pci(void) if(request_irq(cy_pci_irq, cyz_interrupt, SA_SHIRQ, "Cyclades-Z", &cy_card[j])) { - printk("Could not allocate IRQ%d ", + printk("Cyclom-8Zo/PCI found at 0x%lx ", + (ulong) cy_pci_phys2); + printk("but could not allocate IRQ%d.\n", cy_pci_irq); - printk("for Cyclades-8Zo/PCI at 0x%lx.\n", - (ulong)cy_pci_addr2); return(i); } } @@ -5140,6 +5147,8 @@ cy_detect_pci(void) /* set cy_card */ + cy_card[j].base_phys = cy_pci_phys2; + cy_card[j].ctl_phys = cy_pci_phys0; cy_card[j].base_addr = cy_pci_addr2; cy_card[j].ctl_addr = cy_pci_addr0; cy_card[j].irq = (int) cy_pci_irq; @@ -5152,14 +5161,14 @@ cy_detect_pci(void) /* don't report IRQ if board is no IRQ */ if( (cy_pci_irq != 0) && (cy_pci_irq != 255) ) printk("Cyclades-8Zo/PCI #%d: 0x%lx-0x%lx, IRQ%d, ", - j+1,(ulong)cy_pci_addr2, - (ulong)(cy_pci_addr2 + CyPCI_Zwin - 1), + j+1,(ulong)cy_pci_phys2, + (ulong)(cy_pci_phys2 + CyPCI_Zwin - 1), (int)cy_pci_irq); else #endif /* CONFIG_CYZ_INTR */ printk("Cyclades-8Zo/PCI #%d: 0x%lx-0x%lx, ", - j+1,(ulong)cy_pci_addr2, - (ulong)(cy_pci_addr2 + CyPCI_Zwin - 1)); + j+1,(ulong)cy_pci_phys2, + (ulong)(cy_pci_phys2 + CyPCI_Zwin - 1)); printk("%d channels starting from port %d.\n", cy_pci_nchan,cy_next_channel); @@ -5168,10 +5177,14 @@ cy_detect_pci(void) } for (; ZeIndex != 0 && i < NR_CARDS; i++) { + cy_pci_phys0 = Ze_phys0[0]; + cy_pci_phys2 = Ze_phys2[0]; cy_pci_addr0 = Ze_addr0[0]; cy_pci_addr2 = Ze_addr2[0]; cy_pci_irq = Ze_irq[0]; for (j = 0 ; j < ZeIndex-1 ; j++) { + Ze_phys0[j] = Ze_phys0[j+1]; + Ze_phys2[j] = Ze_phys2[j+1]; Ze_addr0[j] = Ze_addr0[j+1]; Ze_addr2[j] = Ze_addr2[j+1]; Ze_irq[j] = Ze_irq[j+1]; @@ -5190,7 +5203,7 @@ cy_detect_pci(void) if((cy_next_channel+cy_pci_nchan) > NR_PORTS) { printk("Cyclades-Ze/PCI found at 0x%lx ", - (ulong)cy_pci_addr2); + (ulong)cy_pci_phys2); printk("but no channels are available.\n"); printk("Change NR_PORTS in cyclades.c and recompile kernel.\n"); return(i); @@ -5202,7 +5215,7 @@ cy_detect_pci(void) } if (j == NR_CARDS) { /* no more cy_cards available */ printk("Cyclades-Ze/PCI found at 0x%lx ", - (ulong)cy_pci_addr2); + (ulong)cy_pci_phys2); printk("but no more cards can be used.\n"); printk("Change NR_CARDS in cyclades.c and recompile kernel.\n"); return(i); @@ -5214,16 +5227,18 @@ cy_detect_pci(void) if(request_irq(cy_pci_irq, cyz_interrupt, SA_SHIRQ, "Cyclades-Z", &cy_card[j])) { - printk("Could not allocate IRQ%d ", + printk("Cyclom-Ze/PCI found at 0x%lx ", + (ulong) cy_pci_phys2); + printk("but could not allocate IRQ%d.\n", cy_pci_irq); - printk("for Cyclades-Ze/PCI at 0x%lx.\n", - (ulong) cy_pci_addr2); return(i); } } #endif /* CONFIG_CYZ_INTR */ /* set cy_card */ + cy_card[j].base_phys = cy_pci_phys2; + cy_card[j].ctl_phys = cy_pci_phys0; cy_card[j].base_addr = cy_pci_addr2; cy_card[j].ctl_addr = cy_pci_addr0; cy_card[j].irq = (int) cy_pci_irq; @@ -5236,14 +5251,14 @@ cy_detect_pci(void) /* don't report IRQ if board is no IRQ */ if( (cy_pci_irq != 0) && (cy_pci_irq != 255) ) printk("Cyclades-Ze/PCI #%d: 0x%lx-0x%lx, IRQ%d, ", - j+1,(ulong)cy_pci_addr2, - (ulong)(cy_pci_addr2 + CyPCI_Ze_win - 1), + j+1,(ulong)cy_pci_phys2, + (ulong)(cy_pci_phys2 + CyPCI_Ze_win - 1), (int)cy_pci_irq); else #endif /* CONFIG_CYZ_INTR */ printk("Cyclades-Ze/PCI #%d: 0x%lx-0x%lx, ", - j+1,(ulong)cy_pci_addr2, - (ulong)(cy_pci_addr2 + CyPCI_Ze_win - 1)); + j+1,(ulong)cy_pci_phys2, + (ulong)(cy_pci_phys2 + CyPCI_Ze_win - 1)); printk("%d channels starting from port %d.\n", cy_pci_nchan,cy_next_channel); @@ -5251,7 +5266,7 @@ cy_detect_pci(void) } if (ZeIndex != 0) { printk("Cyclades-Ze/PCI found at 0x%x ", - (unsigned int) Ze_addr2[0]); + (unsigned int) Ze_phys2[0]); printk("but no more cards can be used.\n"); printk("Change NR_CARDS in cyclades.c and recompile kernel.\n"); } @@ -5438,10 +5453,8 @@ cy_init(void) availability of cy_card and cy_port data structures and updating the cy_next_channel. */ -#ifndef CONFIG_COBALT_27 /* look for isa boards */ cy_isa_nboard = cy_detect_isa(); -#endif /* CONFIG_COBALT_27 */ /* look for pci boards */ cy_pci_nboard = cy_detect_pci(); @@ -5568,9 +5581,10 @@ cy_init(void) info->icount.frame = info->icount.parity = 0; info->icount.overrun = info->icount.brk = 0; chip_number = (port - cinfo->first_line) / 4; - if ((info->chip_rev = cy_readb(cinfo->base_addr + - (cy_chip_offset[chip_number]<<index) + - (CyGFRCR<<index))) >= CD1400_REV_J) { + if ((info->chip_rev = + cy_readb(cinfo->base_addr + + (cy_chip_offset[chip_number]<<index) + + (CyGFRCR<<index))) >= CD1400_REV_J) { /* It is a CD1400 rev. J or later */ info->tbpr = baud_bpr_60[13]; /* Tx BPR */ info->tco = baud_co_60[13]; /* Tx CO */ @@ -5628,16 +5642,8 @@ cy_init(void) } /* cy_init */ #ifdef MODULE -/* See linux/drivers/char/riscom.c for ideas on how to - pass additional base addresses to the driver!!! */ -int -init_module(void) -{ - return(cy_init()); -} /* init_module */ - void -cleanup_module(void) +cy_cleanup_module(void) { int i; int e1, e2; @@ -5679,13 +5685,18 @@ cleanup_module(void) free_page((unsigned long) tmp_buf); tmp_buf = NULL; } -} /* cleanup_module */ -#else +} /* cy_cleanup_module */ + +/* Module entry-points */ +module_init(cy_init); +module_exit(cy_cleanup_module); + +#else /* MODULE */ /* called by linux/init/main.c to parse command line options */ void cy_setup(char *str, int *ints) { -#ifndef CONFIG_COBALT_27 +#ifdef CONFIG_ISA int i, j; for (i = 0 ; i < NR_ISA_ADDRS ; i++) { @@ -5696,110 +5707,7 @@ cy_setup(char *str, int *ints) cy_isa_addresses[i++] = (unsigned char *)(ints[j]); } } -#endif /* CONFIG_COBALT_27 */ - +#endif /* CONFIG_ISA */ } /* cy_setup */ -#endif - - -#ifdef CYCLOM_SHOW_STATUS -static void -show_status(int line_num) -{ - unsigned char *base_addr; - int card,chip,channel,index; - struct cyclades_port * info; - unsigned long flags; - - info = &cy_port[line_num]; - card = info->card; - index = cy_card[card].bus_index; - channel = (info->line) - (cy_card[card].first_line); - chip = channel>>2; - channel &= 0x03; - printk(" card %d, chip %d, channel %d\n", card, chip, channel);/**/ - - printk(" cy_card\n"); - printk(" irq base_addr num_chips first_line = %d %lx %d %d\n", - cy_card[card].irq, (long)cy_card[card].base_addr, - cy_card[card].num_chips, cy_card[card].first_line); - - printk(" cy_port\n"); - printk(" card line flags = %d %d %x\n", - info->card, info->line, info->flags); - printk(" *tty read_status_mask timeout xmit_fifo_size ", - printk("= %lx %x %x %x\n", - (long)info->tty, info->read_status_mask, - info->timeout, info->xmit_fifo_size); - printk(" cor1,cor2,cor3,cor4,cor5 = %x %x %x %x %x\n", - info->cor1, info->cor2, info->cor3, info->cor4, info->cor5); - printk(" tbpr,tco,rbpr,rco = %d %d %d %d\n", - info->tbpr, info->tco, info->rbpr, info->rco); - printk(" close_delay event count = %d %d %d\n", - info->close_delay, info->event, info->count); - printk(" x_char blocked_open = %x %x\n", - info->x_char, info->blocked_open); - printk(" session pgrp open_wait = %lx %lx %lx\n", - info->session, info->pgrp, (long)info->open_wait); - - CY_LOCK(info, flags); - - base_addr = (unsigned char*) - (cy_card[card].base_addr - + (cy_chip_offset[chip]<<index)); - -/* Global Registers */ - - printk(" CyGFRCR %x\n", cy_readb(base_addr + CyGFRCR<<index)); - printk(" CyCAR %x\n", cy_readb(base_addr + CyCAR<<index)); - printk(" CyGCR %x\n", cy_readb(base_addr + CyGCR<<index)); - printk(" CySVRR %x\n", cy_readb(base_addr + CySVRR<<index)); - printk(" CyRICR %x\n", cy_readb(base_addr + CyRICR<<index)); - printk(" CyTICR %x\n", cy_readb(base_addr + CyTICR<<index)); - printk(" CyMICR %x\n", cy_readb(base_addr + CyMICR<<index)); - printk(" CyRIR %x\n", cy_readb(base_addr + CyRIR<<index)); - printk(" CyTIR %x\n", cy_readb(base_addr + CyTIR<<index)); - printk(" CyMIR %x\n", cy_readb(base_addr + CyMIR<<index)); - printk(" CyPPR %x\n", cy_readb(base_addr + CyPPR<<index)); - - cy_writeb(base_addr + CyCAR<<index, (u_char)channel); - -/* Virtual Registers */ - - printk(" CyRIVR %x\n", cy_readb(base_addr + CyRIVR<<index)); - printk(" CyTIVR %x\n", cy_readb(base_addr + CyTIVR<<index)); - printk(" CyMIVR %x\n", cy_readb(base_addr + CyMIVR<<index)); - printk(" CyMISR %x\n", cy_readb(base_addr + CyMISR<<index)); - -/* Channel Registers */ - - printk(" CyCCR %x\n", cy_readb(base_addr + CyCCR<<index)); - printk(" CySRER %x\n", cy_readb(base_addr + CySRER<<index)); - printk(" CyCOR1 %x\n", cy_readb(base_addr + CyCOR1<<index)); - printk(" CyCOR2 %x\n", cy_readb(base_addr + CyCOR2<<index)); - printk(" CyCOR3 %x\n", cy_readb(base_addr + CyCOR3<<index)); - printk(" CyCOR4 %x\n", cy_readb(base_addr + CyCOR4<<index)); - printk(" CyCOR5 %x\n", cy_readb(base_addr + CyCOR5<<index)); - printk(" CyCCSR %x\n", cy_readb(base_addr + CyCCSR<<index)); - printk(" CyRDCR %x\n", cy_readb(base_addr + CyRDCR<<index)); - printk(" CySCHR1 %x\n", cy_readb(base_addr + CySCHR1<<index)); - printk(" CySCHR2 %x\n", cy_readb(base_addr + CySCHR2<<index)); - printk(" CySCHR3 %x\n", cy_readb(base_addr + CySCHR3<<index)); - printk(" CySCHR4 %x\n", cy_readb(base_addr + CySCHR4<<index)); - printk(" CySCRL %x\n", cy_readb(base_addr + CySCRL<<index)); - printk(" CySCRH %x\n", cy_readb(base_addr + CySCRH<<index)); - printk(" CyLNC %x\n", cy_readb(base_addr + CyLNC<<index)); - printk(" CyMCOR1 %x\n", cy_readb(base_addr + CyMCOR1<<index)); - printk(" CyMCOR2 %x\n", cy_readb(base_addr + CyMCOR2<<index)); - printk(" CyRTPR %x\n", cy_readb(base_addr + CyRTPR<<index)); - printk(" CyMSVR1 %x\n", cy_readb(base_addr + CyMSVR1<<index)); - printk(" CyMSVR2 %x\n", cy_readb(base_addr + CyMSVR2<<index)); - printk(" CyRBPR %x\n", cy_readb(base_addr + CyRBPR<<index)); - printk(" CyRCOR %x\n", cy_readb(base_addr + CyRCOR<<index)); - printk(" CyTBPR %x\n", cy_readb(base_addr + CyTBPR<<index)); - printk(" CyTCOR %x\n", cy_readb(base_addr + CyTCOR<<index)); - - CY_UNLOCK(info, flags); -} /* show_status */ -#endif +#endif /* MODULE */ diff --git a/drivers/char/nwbutton.c b/drivers/char/nwbutton.c index 986b728db..34d996582 100644 --- a/drivers/char/nwbutton.c +++ b/drivers/char/nwbutton.c @@ -22,14 +22,14 @@ #define __NWBUTTON_C /* Tell the header file who we are */ #include "nwbutton.h" -static int button_press_count = 0; /* The count of button presses */ +static int button_press_count; /* The count of button presses */ static struct timer_list button_timer; /* Times for the end of a sequence */ static DECLARE_WAIT_QUEUE_HEAD(button_wait_queue); /* Used for blocking read */ static char button_output_buffer[32]; /* Stores data to write out of device */ -static int bcount = 0; /* The number of bytes in the buffer */ +static int bcount; /* The number of bytes in the buffer */ static int bdelay = BUTTON_DELAY; /* The delay, in jiffies */ static struct button_callback button_callback_list[32]; /* The callback list */ -static int callback_count = 0; /* The number of callbacks registered */ +static int callback_count; /* The number of callbacks registered */ static int reboot_count = NUM_PRESSES_REBOOT; /* Number of presses to reboot */ /* diff --git a/drivers/char/nwflash.c b/drivers/char/nwflash.c index cbe0ec79f..579e970d4 100644 --- a/drivers/char/nwflash.c +++ b/drivers/char/nwflash.c @@ -50,10 +50,10 @@ static long long flash_llseek(struct file *file, long long offset, int orig); #define KFLASH_ID 0x89A6 //Intel flash #define KFLASH_ID4 0xB0D4 //Intel flash 4Meg -static int flashdebug = 0; //if set - we will display progress msgs +static int flashdebug; //if set - we will display progress msgs -static int gbWriteEnable = 0; -static int gbWriteBase64Enable = 0; +static int gbWriteEnable; +static int gbWriteBase64Enable; MSTATIC int gbFlashSize = KFLASH_SIZE; extern spinlock_t gpio_lock; |