00001 /* 00002 * Copyright (c) 2000, 2001, 2002, 2003, 2004, 2005, 2008, 2009 00003 * The President and Fellows of Harvard College. 00004 * 00005 * Redistribution and use in source and binary forms, with or without 00006 * modification, are permitted provided that the following conditions 00007 * are met: 00008 * 1. Redistributions of source code must retain the above copyright 00009 * notice, this list of conditions and the following disclaimer. 00010 * 2. Redistributions in binary form must reproduce the above copyright 00011 * notice, this list of conditions and the following disclaimer in the 00012 * documentation and/or other materials provided with the distribution. 00013 * 3. Neither the name of the University nor the names of its contributors 00014 * may be used to endorse or promote products derived from this software 00015 * without specific prior written permission. 00016 * 00017 * THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY AND CONTRIBUTORS ``AS IS'' AND 00018 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00019 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 00020 * ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OR CONTRIBUTORS BE LIABLE 00021 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 00022 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 00023 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 00024 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 00025 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 00026 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 00027 * SUCH DAMAGE. 00028 */ 00029 00030 /* 00031 * Driver for LAMEbus random generator card 00032 */ 00033 #include <types.h> 00034 #include <lib.h> 00035 #include <uio.h> 00036 #include <platform/bus.h> 00037 #include <lamebus/lrandom.h> 00038 #include "autoconf.h" 00039 00040 /* Registers (offsets within slot) */ 00041 #define LR_REG_RAND 0 /* random register */ 00042 00043 /* Constants */ 00044 #define LR_RANDMAX 0xffffffff 00045 00046 int 00047 config_lrandom(struct lrandom_softc *lr, int lrandomno) 00048 { 00049 (void)lrandomno; 00050 (void)lr; 00051 return 0; 00052 } 00053 00054 uint32_t 00055 lrandom_random(void *devdata) 00056 { 00057 struct lrandom_softc *lr = devdata; 00058 return bus_read_register(lr->lr_bus, lr->lr_buspos, LR_REG_RAND); 00059 } 00060 00061 uint32_t 00062 lrandom_randmax(void *devdata) 00063 { 00064 (void)devdata; 00065 return LR_RANDMAX; 00066 } 00067 00068 int 00069 lrandom_read(void *devdata, struct uio *uio) 00070 { 00071 struct lrandom_softc *lr = devdata; 00072 uint32_t val; 00073 int result; 00074 00075 while (uio->uio_resid > 0) { 00076 val = bus_read_register(lr->lr_bus, lr->lr_buspos, 00077 LR_REG_RAND); 00078 result = uiomove(&val, sizeof(val), uio); 00079 if (result) { 00080 return result; 00081 } 00082 } 00083 00084 return 0; 00085 }