2 * Copyright (c) 1998 Nicolas Souchu, Marc Bouget
3 * Copyright (c) 2004 Joerg Wunsch
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28 #include <sys/cdefs.h>
29 __FBSDID("$FreeBSD$");
31 #include <sys/param.h>
32 #include <sys/systm.h>
33 #include <sys/kernel.h>
34 #include <sys/module.h>
37 #include <machine/bus.h>
38 #include <machine/resource.h>
42 #include <dev/iicbus/iiconf.h>
43 #include <dev/pcf/pcfvar.h>
44 #include "iicbus_if.h"
46 /* Not so official debugging option. */
47 /* #define PCFDEBUG */
49 static int pcf_wait_byte(struct pcf_softc *pcf);
50 static int pcf_noack(struct pcf_softc *pcf, int timeout);
53 * Polling mode for master operations wait for a new
54 * byte incomming or outgoing
57 pcf_wait_byte(struct pcf_softc *sc)
59 int counter = TIMEOUT;
63 if ((pcf_get_S1(sc) & PIN) == 0)
68 printf("pcf: timeout!\n");
71 return (IIC_ETIMEOUT);
75 pcf_stop(device_t dev)
77 struct pcf_softc *sc = DEVTOSOFTC(dev);
80 device_printf(dev, " >> stop\n");
83 * Send STOP condition iff the START condition was previously sent.
84 * STOP is sent only once even if an iicbus_stop() is called after
85 * an iicbus_read()... see pcf_read(): the PCF needs to send the stop
86 * before the last char is read.
88 if (sc->pcf_started) {
89 /* set stop condition and enable IT */
90 pcf_set_S1(sc, PIN|ESO|ENI|STO|ACK);
100 pcf_noack(struct pcf_softc *sc, int timeout)
106 noack = pcf_get_S1(sc) & LRB;
109 DELAY(10); /* XXX wait 10 us */
116 pcf_repeated_start(device_t dev, u_char slave, int timeout)
118 struct pcf_softc *sc = DEVTOSOFTC(dev);
122 device_printf(dev, " >> repeated start for slave %#x\n",
126 pcf_set_S1(sc, ESO|STA|STO|ACK);
128 /* set slave address to PCF. Last bit (LSB) must be set correctly
129 * according to transfer direction */
130 pcf_set_S0(sc, slave);
132 /* wait for address sent, polling */
133 if ((error = pcf_wait_byte(sc)))
137 if (pcf_noack(sc, timeout)) {
140 printf("pcf: no ack on repeated_start!\n");
153 pcf_start(device_t dev, u_char slave, int timeout)
155 struct pcf_softc *sc = DEVTOSOFTC(dev);
159 device_printf(dev, " >> start for slave %#x\n", (unsigned)slave);
161 if ((pcf_get_S1(sc) & nBB) == 0) {
163 printf("pcf: busy!\n");
165 return (IIC_EBUSBSY);
168 /* set slave address to PCF. Last bit (LSB) must be set correctly
169 * according to transfer direction */
170 pcf_set_S0(sc, slave);
173 pcf_set_S1(sc, PIN|ESO|STA|ACK);
177 /* wait for address sent, polling */
178 if ((error = pcf_wait_byte(sc)))
182 if (pcf_noack(sc, timeout)) {
185 printf("pcf: no ack on start!\n");
200 struct pcf_softc *sc = arg;
201 char data, status, addr;
204 status = pcf_get_S1(sc);
207 printf("pcf: spurious interrupt, status=0x%x\n",
214 printf("pcf: bus arbitration lost!\n");
218 iicbus_intr(sc->iicbus, INTR_ERROR, &error);
224 status = pcf_get_S1(sc);
226 switch(sc->pcf_slave_mode) {
228 case SLAVE_TRANSMITTER:
230 /* ack interrupt line */
233 /* no ack, don't send anymore */
234 sc->pcf_slave_mode = SLAVE_RECEIVER;
236 iicbus_intr(sc->iicbus, INTR_NOACK, NULL);
240 /* get data from upper code */
241 iicbus_intr(sc->iicbus, INTR_TRANSMIT, &data);
243 pcf_set_S0(sc, data);
248 addr = pcf_get_S0(sc);
251 iicbus_intr(sc->iicbus, INTR_GENERAL, &addr);
253 iicbus_intr(sc->iicbus, INTR_START, &addr);
256 sc->pcf_slave_mode = SLAVE_TRANSMITTER;
258 /* get the first char from upper code */
259 iicbus_intr(sc->iicbus, INTR_TRANSMIT, &data);
261 /* send first data byte */
262 pcf_set_S0(sc, data);
268 /* stop condition received? */
270 /* ack interrupt line */
273 /* emulate intr stop condition */
274 iicbus_intr(sc->iicbus, INTR_STOP, NULL);
277 /* get data, ack interrupt line */
278 data = pcf_get_S0(sc);
280 /* deliver the character */
281 iicbus_intr(sc->iicbus, INTR_RECEIVE, &data);
286 panic("%s: unknown slave mode (%d)!", __func__,
290 } while ((pcf_get_S1(sc) & PIN) == 0);
295 /* unknown event on bus...reset PCF */
296 pcf_set_S1(sc, PIN|ESO|ENI|ACK);
298 sc->pcf_slave_mode = SLAVE_RECEIVER;
304 pcf_rst_card(device_t dev, u_char speed, u_char addr, u_char *oldaddr)
306 struct pcf_softc *sc = DEVTOSOFTC(dev);
309 *oldaddr = sc->pcf_addr;
311 /* retrieve own address from bus level */
313 sc->pcf_addr = PCF_DEFAULT_ADDR;
317 pcf_set_S1(sc, PIN); /* initialize S1 */
319 /* own address S'O<>0 */
320 pcf_set_S0(sc, sc->pcf_addr >> 1);
322 /* select clock register */
323 pcf_set_S1(sc, PIN|ES1);
325 /* select bus speed : 18=90kb, 19=45kb, 1A=11kb, 1B=1.5kb */
328 pcf_set_S0(sc, 0x1b); /* XXX Sun uses 0x1f */
332 pcf_set_S0(sc, 0x19); /* XXX Sun: 0x1d */
338 pcf_set_S0(sc, 0x18); /* XXX Sun: 0x1c */
342 /* set bus on, ack=yes, INT=yes */
343 pcf_set_S1(sc, PIN|ESO|ENI|ACK);
345 sc->pcf_slave_mode = SLAVE_RECEIVER;
351 pcf_write(device_t dev, char *buf, int len, int *sent, int timeout /* us */)
353 struct pcf_softc *sc = DEVTOSOFTC(dev);
354 int bytes, error = 0;
357 device_printf(dev, " >> writing %d bytes: %#x%s\n", len,
358 (unsigned)buf[0], len > 1? "...": "");
364 pcf_set_S0(sc, *buf++);
366 /* wait for the byte to be send */
367 if ((error = pcf_wait_byte(sc)))
370 /* check if ack received */
371 if (pcf_noack(sc, timeout)) {
384 device_printf(dev, " >> %d bytes written (%d)\n", bytes, error);
391 pcf_read(device_t dev, char *buf, int len, int *read, int last,
394 struct pcf_softc *sc = DEVTOSOFTC(dev);
395 int bytes, error = 0;
399 device_printf(dev, " << reading %d bytes\n", len);
402 /* trig the bus to get the first data byte in S0 */
404 if (len == 1 && last)
405 /* just one byte to read */
406 pcf_set_S1(sc, ESO); /* no ack */
414 /* XXX delay needed here */
416 /* wait for trigged byte */
417 if ((error = pcf_wait_byte(sc))) {
422 if (len == 1 && last)
423 /* ok, last data byte already in S0, no I2C activity
424 * on next pcf_get_S0() */
427 else if (len == 2 && last)
428 /* next trigged byte with no ack */
431 /* receive byte, trig next byte */
432 *buf++ = pcf_get_S0(sc);
442 device_printf(dev, " << %d bytes read (%d): %#x%s\n", bytes, error,
443 (unsigned)obuf[0], bytes > 1? "...": "");