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
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