1/*- 2 * Copyright (c) 1998 Nicolas Souchu 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 9 unchanged lines hidden (view full) --- 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 * |
26 * $Id: iiconf.c,v 1.3 1998/11/22 22:01:42 nsouch Exp $ |
27 * 28 */ 29#include <sys/param.h> 30#include <sys/systm.h> 31#include <sys/kernel.h> 32#include <sys/malloc.h> 33#include <sys/module.h> 34#include <sys/bus.h> --- 25 unchanged lines hidden (view full) --- 60device_t 61iicbus_alloc_bus(device_t parent) 62{ 63 device_t child; 64 65 /* add the bus to the parent */ 66 child = device_add_child(parent, "iicbus", -1, NULL); 67 |
68 return (child); 69} 70 71static int 72iicbus_poll(struct iicbus_softc *sc, int how) 73{ 74 int error; 75 --- 80 unchanged lines hidden (view full) --- 156 157 /* wakeup waiting processes */ 158 wakeup(sc); 159 160 return (0); 161} 162 163/* |
164 * iicbus_started() 165 * 166 * Test if the iicbus is started by the controller 167 */ 168int 169iicbus_started(device_t bus) 170{ 171 struct iicbus_softc *sc = (struct iicbus_softc *)device_get_softc(bus); 172 173 return (sc->started); 174} 175 176/* 177 * iicbus_start() 178 * 179 * Send start condition to the slave addressed by 'slave' 180 */ 181int 182iicbus_start(device_t bus, u_char slave, int timeout) 183{ 184 struct iicbus_softc *sc = (struct iicbus_softc *)device_get_softc(bus); 185 int error = 0; 186 187 if (sc->started) 188 return (EINVAL); /* bus already started */ 189 190 if (!(error = IICBUS_START(device_get_parent(bus), slave, timeout))) 191 sc->started = slave; 192 else 193 sc->started = 0; 194 195 return (error); 196} 197 198/* 199 * iicbus_stop() 200 * 201 * Send stop condition to the bus 202 */ 203int 204iicbus_stop(device_t bus) 205{ 206 struct iicbus_softc *sc = (struct iicbus_softc *)device_get_softc(bus); 207 int error = 0; 208 209 if (!sc->started) 210 return (EINVAL); /* bus not started */ 211 212 error = IICBUS_STOP(device_get_parent(bus)); 213 214 /* refuse any further access */ 215 sc->started = 0; 216 217 return (error); 218} 219 220/* 221 * iicbus_write() 222 * 223 * Write a block of data to the slave previously started by 224 * iicbus_start() call 225 */ 226int 227iicbus_write(device_t bus, char *buf, int len, int *sent, int timeout) 228{ 229 struct iicbus_softc *sc = (struct iicbus_softc *)device_get_softc(bus); 230 231 /* a slave must have been started with the appropriate address */ 232 if (!sc->started || (sc->started & LSB)) 233 return (EINVAL); 234 235 return (IICBUS_WRITE(device_get_parent(bus), buf, len, sent, timeout)); 236} 237 238/* 239 * iicbus_read() 240 * 241 * Read a block of data from the slave previously started by 242 * iicbus_read() call 243 */ 244int 245iicbus_read(device_t bus, char *buf, int len, int *read, int last, int delay) 246{ 247 struct iicbus_softc *sc = (struct iicbus_softc *)device_get_softc(bus); 248 249 /* a slave must have been started with the appropriate address */ 250 if (!sc->started || !(sc->started & LSB)) 251 return (EINVAL); 252 253 return (IICBUS_READ(device_get_parent(bus), buf, len, read, last, delay)); 254} 255 256/* |
257 * iicbus_block_write() 258 * 259 * Write a block of data to slave ; start/stop protocol managed 260 */ 261int 262iicbus_block_write(device_t bus, u_char slave, char *buf, int len, int *sent) 263{ 264 u_char addr = slave & ~LSB; --- 40 unchanged lines hidden (view full) --- 305{ 306 uintptr_t addr; 307 device_t parent = device_get_parent(dev); 308 309 BUS_READ_IVAR(parent, dev, IICBUS_IVAR_ADDR, &addr); 310 311 return ((u_char)addr); 312} |
313 |