1/* $NetBSD: cyber.c,v 1.4 2007/10/19 12:00:42 ad Exp $ */ 2 3/*- 4 * Copyright (c) 2004 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Frederick S. Bruckman. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 * POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32/* Store one "Usr" register on an SIIG Cyberserial multiport PCI card. */ 33 34#include <sys/cdefs.h> 35__KERNEL_RCSID(0, "$NetBSD: cyber.c,v 1.4 2007/10/19 12:00:42 ad Exp $"); 36 37#include <sys/param.h> 38#include <sys/device.h> 39#include <sys/termios.h> /* XXX for tcflag_t in comvar.h */ 40 41#include <sys/bus.h> 42 43#include <dev/pci/cyberreg.h> 44#include <dev/pci/cybervar.h> 45 46void 47write_siig10x_usrreg(pci_chipset_tag_t pc, pcitag_t tag, int usrregno, 48 int high_speed) 49{ 50 pcireg_t curregs, newregs; 51 52 newregs = curregs = pci_conf_read(pc, tag, SIIG10x_USR_BASE); 53 54 if (high_speed) /* Clear bit. */ 55 switch (usrregno) { 56 case 0: 57 newregs &= ~SIIG10x_USR0_MASK; 58 break; 59 case 1: 60 newregs &= ~SIIG10x_USR1_MASK; 61 break; 62 case 2: 63 newregs &= ~SIIG10x_USR2_MASK; 64 break; 65 case 3: 66 newregs &= ~SIIG10x_USR3_MASK; 67 } 68 else /* if (!high_speed) */ /* Set bit. */ 69 switch (usrregno) { 70 case 0: 71 newregs |= SIIG10x_USR0_MASK; 72 break; 73 case 1: 74 newregs |= SIIG10x_USR1_MASK; 75 break; 76 case 2: 77 newregs |= SIIG10x_USR2_MASK; 78 break; 79 case 3: 80 newregs |= SIIG10x_USR3_MASK; 81 } 82 83 if (newregs != curregs) 84 pci_conf_write(pc, tag, SIIG10x_USR_BASE, newregs); 85} 86 87void 88write_siig20x_usrreg(pci_chipset_tag_t pc, pcitag_t tag, int usrregno, 89 int high_speed) 90{ 91 pcireg_t curreg, newreg; 92 int offset; 93 94 switch (usrregno) { 95 case 0: 96 offset = SIIG20x_USR0; 97 break; 98 case 1: 99 offset = SIIG20x_USR1; 100 break; 101 default: 102 return; 103 } 104 105 newreg = curreg = pci_conf_read(pc, tag, offset); 106 107 if (high_speed) /* Clear bit. */ 108 newreg &= ~SIIG20x_USR_MASK; 109 else /* if (!high_speed) */ /* Set bit. */ 110 newreg |= SIIG20x_USR_MASK; 111 112 if (newreg != curreg) 113 pci_conf_write(pc, tag, offset, newreg); 114} 115