2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
4 * Copyright (c) 1998 Nicolas Souchu, Marc Bouget
5 * Copyright (c) 2004 Joerg Wunsch
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 #include <sys/cdefs.h>
31 __FBSDID("$FreeBSD$");
33 #include <sys/param.h>
36 #include <sys/kernel.h>
37 #include <sys/module.h>
38 #include <sys/mutex.h>
39 #include <sys/systm.h>
41 #include <machine/bus.h>
42 #include <machine/resource.h>
46 #include <dev/iicbus/iicbus.h>
47 #include <dev/iicbus/iiconf.h>
48 #include <dev/pcf/pcfvar.h>
49 #include "iicbus_if.h"
51 /* Not so official debugging option. */
52 /* #define PCFDEBUG */
54 static int pcf_wait_byte(struct pcf_softc *pcf);
55 static int pcf_noack(struct pcf_softc *pcf, int timeout);
56 static void pcf_stop_locked(struct pcf_softc *pcf);
59 * Polling mode for master operations wait for a new
60 * byte incoming or outgoing
63 pcf_wait_byte(struct pcf_softc *sc)
65 int counter = TIMEOUT;
67 PCF_ASSERT_LOCKED(sc);
70 if ((pcf_get_S1(sc) & PIN) == 0)
75 printf("pcf: timeout!\n");
78 return (IIC_ETIMEOUT);
82 pcf_stop_locked(struct pcf_softc *sc)
85 PCF_ASSERT_LOCKED(sc);
87 device_printf(dev, " >> stop\n");
90 * Send STOP condition iff the START condition was previously sent.
91 * STOP is sent only once even if an iicbus_stop() is called after
92 * an iicbus_read()... see pcf_read(): the PCF needs to send the stop
93 * before the last char is read.
95 if (sc->pcf_started) {
96 /* set stop condition and enable IT */
97 pcf_set_S1(sc, PIN|ESO|ENI|STO|ACK);
104 pcf_noack(struct pcf_softc *sc, int timeout)
109 PCF_ASSERT_LOCKED(sc);
111 noack = pcf_get_S1(sc) & LRB;
114 DELAY(10); /* XXX wait 10 us */
121 pcf_repeated_start(device_t dev, u_char slave, int timeout)
123 struct pcf_softc *sc = DEVTOSOFTC(dev);
128 device_printf(dev, " >> repeated start for slave %#x\n",
132 pcf_set_S1(sc, ESO|STA|STO|ACK);
134 /* set slave address to PCF. Last bit (LSB) must be set correctly
135 * according to transfer direction */
136 pcf_set_S0(sc, slave);
138 /* wait for address sent, polling */
139 if ((error = pcf_wait_byte(sc)))
143 if (pcf_noack(sc, timeout)) {
146 printf("pcf: no ack on repeated_start!\n");
161 pcf_start(device_t dev, u_char slave, int timeout)
163 struct pcf_softc *sc = DEVTOSOFTC(dev);
168 device_printf(dev, " >> start for slave %#x\n", (unsigned)slave);
170 if ((pcf_get_S1(sc) & nBB) == 0) {
172 printf("pcf: busy!\n");
175 return (IIC_EBUSERR);
178 /* set slave address to PCF. Last bit (LSB) must be set correctly
179 * according to transfer direction */
180 pcf_set_S0(sc, slave);
183 pcf_set_S1(sc, PIN|ESO|STA|ACK);
187 /* wait for address sent, polling */
188 if ((error = pcf_wait_byte(sc)))
192 if (pcf_noack(sc, timeout)) {
195 printf("pcf: no ack on start!\n");
210 pcf_stop(device_t dev)
212 struct pcf_softc *sc = DEVTOSOFTC(dev);
215 device_printf(dev, " >> stop\n");
227 struct pcf_softc *sc = arg;
228 char data, status, addr;
232 status = pcf_get_S1(sc);
235 printf("pcf: spurious interrupt, status=0x%x\n",
242 printf("pcf: bus arbitration lost!\n");
246 iicbus_intr(sc->iicbus, INTR_ERROR, &error);
252 status = pcf_get_S1(sc);
254 switch(sc->pcf_slave_mode) {
256 case SLAVE_TRANSMITTER:
258 /* ack interrupt line */
261 /* no ack, don't send anymore */
262 sc->pcf_slave_mode = SLAVE_RECEIVER;
264 iicbus_intr(sc->iicbus, INTR_NOACK, NULL);
268 /* get data from upper code */
269 iicbus_intr(sc->iicbus, INTR_TRANSMIT, &data);
271 pcf_set_S0(sc, data);
276 addr = pcf_get_S0(sc);
279 iicbus_intr(sc->iicbus, INTR_GENERAL, &addr);
281 iicbus_intr(sc->iicbus, INTR_START, &addr);
284 sc->pcf_slave_mode = SLAVE_TRANSMITTER;
286 /* get the first char from upper code */
287 iicbus_intr(sc->iicbus, INTR_TRANSMIT, &data);
289 /* send first data byte */
290 pcf_set_S0(sc, data);
296 /* stop condition received? */
298 /* ack interrupt line */
301 /* emulate intr stop condition */
302 iicbus_intr(sc->iicbus, INTR_STOP, NULL);
305 /* get data, ack interrupt line */
306 data = pcf_get_S0(sc);
308 /* deliver the character */
309 iicbus_intr(sc->iicbus, INTR_RECEIVE, &data);
314 panic("%s: unknown slave mode (%d)!", __func__,
318 } while ((pcf_get_S1(sc) & PIN) == 0);
324 /* unknown event on bus...reset PCF */
325 pcf_set_S1(sc, PIN|ESO|ENI|ACK);
327 sc->pcf_slave_mode = SLAVE_RECEIVER;
334 pcf_rst_card(device_t dev, u_char speed, u_char addr, u_char *oldaddr)
336 struct pcf_softc *sc = DEVTOSOFTC(dev);
340 *oldaddr = sc->pcf_addr;
342 /* retrieve own address from bus level */
344 sc->pcf_addr = PCF_DEFAULT_ADDR;
348 pcf_set_S1(sc, PIN); /* initialize S1 */
350 /* own address S'O<>0 */
351 pcf_set_S0(sc, sc->pcf_addr >> 1);
353 /* select clock register */
354 pcf_set_S1(sc, PIN|ES1);
356 /* select bus speed : 18=90kb, 19=45kb, 1A=11kb, 1B=1.5kb */
359 pcf_set_S0(sc, 0x1b); /* XXX Sun uses 0x1f */
363 pcf_set_S0(sc, 0x19); /* XXX Sun: 0x1d */
369 pcf_set_S0(sc, 0x18); /* XXX Sun: 0x1c */
373 /* set bus on, ack=yes, INT=yes */
374 pcf_set_S1(sc, PIN|ESO|ENI|ACK);
376 sc->pcf_slave_mode = SLAVE_RECEIVER;
383 pcf_write(device_t dev, const char *buf, int len, int *sent, int timeout /* us */)
385 struct pcf_softc *sc = DEVTOSOFTC(dev);
386 int bytes, error = 0;
389 device_printf(dev, " >> writing %d bytes: %#x%s\n", len,
390 (unsigned)buf[0], len > 1? "...": "");
397 pcf_set_S0(sc, *buf++);
399 /* wait for the byte to be send */
400 if ((error = pcf_wait_byte(sc)))
403 /* check if ack received */
404 if (pcf_noack(sc, timeout)) {
418 device_printf(dev, " >> %d bytes written (%d)\n", bytes, error);
425 pcf_read(device_t dev, char *buf, int len, int *read, int last,
428 struct pcf_softc *sc = DEVTOSOFTC(dev);
429 int bytes, error = 0;
433 device_printf(dev, " << reading %d bytes\n", len);
437 /* trig the bus to get the first data byte in S0 */
439 if (len == 1 && last)
440 /* just one byte to read */
441 pcf_set_S1(sc, ESO); /* no ack */
449 /* XXX delay needed here */
451 /* wait for trigged byte */
452 if ((error = pcf_wait_byte(sc))) {
457 if (len == 1 && last)
458 /* ok, last data byte already in S0, no I2C activity
459 * on next pcf_get_S0() */
462 else if (len == 2 && last)
463 /* next trigged byte with no ack */
466 /* receive byte, trig next byte */
467 *buf++ = pcf_get_S0(sc);
478 device_printf(dev, " << %d bytes read (%d): %#x%s\n", bytes, error,
479 (unsigned)obuf[0], bytes > 1? "...": "");
485 DRIVER_MODULE(iicbus, pcf, iicbus_driver, iicbus_devclass, 0, 0);
486 MODULE_DEPEND(pcf, iicbus, PCF_MINVER, PCF_PREFVER, PCF_MAXVER);
487 MODULE_VERSION(pcf, PCF_MODVER);