2 * Copyright (c) 1998 Nicolas Souchu, Marc Bouget
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
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
26 * $FreeBSD: src/sys/i386/isa/pcf.c,v 1.14 2000/01/14 00:18:05 nsouch Exp $
27 * $DragonFly: src/sys/bus/iicbus/i386/pcf.c,v 1.7 2006/01/22 14:03:51 swildner Exp $
30 #include <sys/param.h>
31 #include <sys/systm.h>
32 #include <sys/kernel.h>
33 #include <sys/module.h>
35 #include <sys/malloc.h>
37 #include <machine/clock.h>
38 #include <machine/bus.h>
39 #include <machine/resource.h>
42 #include <bus/isa/isareg.h>
43 #include <bus/isa/isavar.h>
45 #include <bus/isa/i386/isa_device.h>
47 #include "../iiconf.h"
48 #include "iicbus_if.h"
52 #define TIMEOUT 9999 /* XXX */
54 /* Status bits of S1 register (read only) */
55 #define nBB 0x01 /* busy when low set/reset by STOP/START*/
56 #define LAB 0x02 /* lost arbitration bit in multi-master mode */
57 #define AAS 0x04 /* addressed as slave */
58 #define LRB 0x08 /* last received byte when not AAS */
59 #define AD0 0x08 /* general call received when AAS */
60 #define BER 0x10 /* bus error, misplaced START or STOP */
61 #define STS 0x20 /* STOP detected in slave receiver mode */
62 #define PIN 0x80 /* pending interrupt not (r/w) */
64 /* Control bits of S1 register (write only) */
75 #define SLAVE_TRANSMITTER 0x1
76 #define SLAVE_RECEIVER 0x2
78 #define PCF_DEFAULT_ADDR 0xaa
82 int pcf_base; /* isa port */
84 u_char pcf_addr; /* interface I2C address */
86 int pcf_slave_mode; /* receiver or transmitter */
87 int pcf_started; /* 1 if start condition sent */
89 device_t iicbus; /* the corresponding iicbus */
91 int rid_irq, rid_ioport;
92 struct resource *res_irq, *res_ioport;
96 static int pcf_probe(device_t);
97 static int pcf_attach(device_t);
98 static void pcfintr(void *arg);
100 static int pcf_print_child(device_t, device_t);
102 static int pcf_repeated_start(device_t, u_char, int);
103 static int pcf_start(device_t, u_char, int);
104 static int pcf_stop(device_t);
105 static int pcf_write(device_t, char *, int, int *, int);
106 static int pcf_read(device_t, char *, int, int *, int, int);
107 static int pcf_rst_card(device_t, u_char, u_char, u_char *);
109 static device_method_t pcf_methods[] = {
110 /* device interface */
111 DEVMETHOD(device_probe, pcf_probe),
112 DEVMETHOD(device_attach, pcf_attach),
115 DEVMETHOD(bus_print_child, pcf_print_child),
117 /* iicbus interface */
118 DEVMETHOD(iicbus_callback, iicbus_null_callback),
119 DEVMETHOD(iicbus_repeated_start, pcf_repeated_start),
120 DEVMETHOD(iicbus_start, pcf_start),
121 DEVMETHOD(iicbus_stop, pcf_stop),
122 DEVMETHOD(iicbus_write, pcf_write),
123 DEVMETHOD(iicbus_read, pcf_read),
124 DEVMETHOD(iicbus_reset, pcf_rst_card),
129 static driver_t pcf_driver = {
132 sizeof(struct pcf_softc),
135 static devclass_t pcf_devclass;
137 #define DEVTOSOFTC(dev) ((struct pcf_softc *)device_get_softc(dev))
140 pcf_probe(device_t pcfdev)
142 struct pcf_softc *pcf = DEVTOSOFTC(pcfdev);
143 device_t parent = device_get_parent(pcfdev);
145 device_set_desc(pcfdev, "PCF8584 I2C bus controller");
147 pcf = DEVTOSOFTC(pcfdev);
148 bzero(pcf, sizeof(struct pcf_softc));
150 pcf->rid_irq = pcf->rid_ioport = 0;
151 pcf->res_irq = pcf->res_ioport = 0;
153 /* IO port is mandatory */
154 pcf->res_ioport = bus_alloc_resource(pcfdev, SYS_RES_IOPORT,
155 &pcf->rid_ioport, 0ul, ~0ul,
156 IO_PCFSIZE, RF_ACTIVE);
157 if (pcf->res_ioport == 0) {
158 device_printf(pcfdev, "cannot reserve I/O port range\n");
161 BUS_READ_IVAR(parent, pcfdev, ISA_IVAR_PORT, &pcf->pcf_base);
163 pcf->pcf_flags = device_get_flags(pcfdev);
165 if (!(pcf->pcf_flags & IIC_POLLED)) {
166 pcf->res_irq = bus_alloc_resource(pcfdev, SYS_RES_IRQ, &pcf->rid_irq,
167 0ul, ~0ul, 1, RF_ACTIVE);
168 if (pcf->res_irq == 0) {
169 device_printf(pcfdev, "can't reserve irq, polled mode.\n");
170 pcf->pcf_flags |= IIC_POLLED;
175 pcf_rst_card(pcfdev, IIC_FASTEST, PCF_DEFAULT_ADDR, NULL);
179 if (pcf->res_ioport != 0) {
180 bus_deactivate_resource(pcfdev, SYS_RES_IOPORT, pcf->rid_ioport,
182 bus_release_resource(pcfdev, SYS_RES_IOPORT, pcf->rid_ioport,
189 pcf_attach(device_t pcfdev)
191 struct pcf_softc *pcf = DEVTOSOFTC(pcfdev);
192 device_t parent = device_get_parent(pcfdev);
196 /* default to the tty mask for registration */ /* XXX */
197 error = BUS_SETUP_INTR(parent, pcfdev, pcf->res_irq,
199 &pcf->intr_cookie, NULL);
204 pcf->iicbus = iicbus_alloc_bus(pcfdev);
206 /* probe and attach the iicbus */
207 device_probe_and_attach(pcf->iicbus);
213 pcf_print_child(device_t bus, device_t dev)
215 struct pcf_softc *pcf = (struct pcf_softc *)device_get_softc(bus);
218 retval += bus_print_child_header(bus, dev);
219 retval += printf(" on %s addr 0x%x\n", device_get_nameunit(bus),
226 * PCF8584 datasheet : when operate at 8 MHz or more, a minimun time of
227 * 6 clocks cycles must be left between two consecutives access
229 #define pcf_nops() DELAY(10)
231 #define dummy_read(pcf) PCF_GET_S0(pcf)
232 #define dummy_write(pcf) PCF_SET_S0(pcf, 0)
235 * Specific register access to PCF8584
238 PCF_SET_S0(struct pcf_softc *pcf, int data)
240 outb(pcf->pcf_base, data);
245 PCF_SET_S1(struct pcf_softc *pcf, int data)
247 outb(pcf->pcf_base+1, data);
252 PCF_GET_S0(struct pcf_softc *pcf)
256 data = inb(pcf->pcf_base);
263 PCF_GET_S1(struct pcf_softc *pcf)
267 data = inb(pcf->pcf_base+1);
274 * Polling mode for master operations wait for a new
275 * byte incomming or outgoing
278 pcf_wait_byte(struct pcf_softc *pcf)
280 int counter = TIMEOUT;
284 if ((PCF_GET_S1(pcf) & PIN) == 0)
288 return (IIC_ETIMEOUT);
292 pcf_stop(device_t pcfdev)
294 struct pcf_softc *pcf = DEVTOSOFTC(pcfdev);
297 * Send STOP condition iff the START condition was previously sent.
298 * STOP is sent only once even if a iicbus_stop() is called after
299 * an iicbus_read()... see pcf_read(): the pcf needs to send the stop
300 * before the last char is read.
302 if (pcf->pcf_started) {
303 /* set stop condition and enable IT */
304 PCF_SET_S1(pcf, PIN|ES0|ENI|STO|ACK);
306 pcf->pcf_started = 0;
314 pcf_noack(struct pcf_softc *pcf, int timeout)
320 noack = PCF_GET_S1(pcf) & LRB;
323 DELAY(10); /* XXX wait 10 us */
330 pcf_repeated_start(device_t pcfdev, u_char slave, int timeout)
332 struct pcf_softc *pcf = DEVTOSOFTC(pcfdev);
336 PCF_SET_S1(pcf, ES0|STA|STO|ACK);
338 /* set slave address to PCF. Last bit (LSB) must be set correctly
339 * according to transfer direction */
340 PCF_SET_S0(pcf, slave);
342 /* wait for address sent, polling */
343 if ((error = pcf_wait_byte(pcf)))
347 if (pcf_noack(pcf, timeout)) {
360 pcf_start(device_t pcfdev, u_char slave, int timeout)
362 struct pcf_softc *pcf = DEVTOSOFTC(pcfdev);
365 if ((PCF_GET_S1(pcf) & nBB) == 0)
366 return (IIC_EBUSBSY);
368 /* set slave address to PCF. Last bit (LSB) must be set correctly
369 * according to transfer direction */
370 PCF_SET_S0(pcf, slave);
373 PCF_SET_S1(pcf, PIN|ES0|STA|ACK);
375 pcf->pcf_started = 1;
377 /* wait for address sent, polling */
378 if ((error = pcf_wait_byte(pcf)))
382 if (pcf_noack(pcf, timeout)) {
397 device_t pcfdev = (device_t)arg;
398 struct pcf_softc *pcf = DEVTOSOFTC(pcfdev);
400 char data, status, addr;
403 status = PCF_GET_S1(pcf);
406 device_printf(pcfdev, "spurious interrupt, status=0x%x\n", status & 0xff);
412 device_printf(pcfdev, "bus arbitration lost!\n");
416 iicbus_intr(pcf->iicbus, INTR_ERROR, &error);
422 status = PCF_GET_S1(pcf);
424 switch(pcf->pcf_slave_mode) {
426 case SLAVE_TRANSMITTER:
428 /* ack interrupt line */
431 /* no ack, don't send anymore */
432 pcf->pcf_slave_mode = SLAVE_RECEIVER;
434 iicbus_intr(pcf->iicbus, INTR_NOACK, NULL);
438 /* get data from upper code */
439 iicbus_intr(pcf->iicbus, INTR_TRANSMIT, &data);
441 PCF_SET_S0(pcf, data);
446 addr = PCF_GET_S0(pcf);
449 iicbus_intr(pcf->iicbus, INTR_GENERAL, &addr);
451 iicbus_intr(pcf->iicbus, INTR_START, &addr);
454 pcf->pcf_slave_mode = SLAVE_TRANSMITTER;
456 /* get the first char from upper code */
457 iicbus_intr(pcf->iicbus, INTR_TRANSMIT, &data);
459 /* send first data byte */
460 PCF_SET_S0(pcf, data);
466 /* stop condition received? */
468 /* ack interrupt line */
471 /* emulate intr stop condition */
472 iicbus_intr(pcf->iicbus, INTR_STOP, NULL);
475 /* get data, ack interrupt line */
476 data = PCF_GET_S0(pcf);
478 /* deliver the character */
479 iicbus_intr(pcf->iicbus, INTR_RECEIVE, &data);
484 panic("%s: unknown slave mode (%d)!", __func__,
485 pcf->pcf_slave_mode);
488 } while ((PCF_GET_S1(pcf) & PIN) == 0);
493 /* unknown event on bus...reset PCF */
494 PCF_SET_S1(pcf, PIN|ES0|ENI|ACK);
496 pcf->pcf_slave_mode = SLAVE_RECEIVER;
502 pcf_rst_card(device_t pcfdev, u_char speed, u_char addr, u_char *oldaddr)
504 struct pcf_softc *pcf = DEVTOSOFTC(pcfdev);
507 *oldaddr = pcf->pcf_addr;
509 /* retrieve own address from bus level */
511 pcf->pcf_addr = PCF_DEFAULT_ADDR;
513 pcf->pcf_addr = addr;
515 PCF_SET_S1(pcf, PIN); /* initialize S1 */
517 /* own address S'O<>0 */
518 PCF_SET_S0(pcf, pcf->pcf_addr >> 1);
520 /* select clock register */
521 PCF_SET_S1(pcf, PIN|ES1);
523 /* select bus speed : 18=90kb, 19=45kb, 1A=11kb, 1B=1.5kb */
526 PCF_SET_S0(pcf, 0x1b);
530 PCF_SET_S0(pcf, 0x19);
536 PCF_SET_S0(pcf, 0x18);
540 /* set bus on, ack=yes, INT=yes */
541 PCF_SET_S1(pcf, PIN|ES0|ENI|ACK);
543 pcf->pcf_slave_mode = SLAVE_RECEIVER;
549 pcf_write(device_t pcfdev, char *buf, int len, int *sent, int timeout /* us */)
551 struct pcf_softc *pcf = DEVTOSOFTC(pcfdev);
552 int bytes, error = 0;
555 printf("pcf%d: >> writing %d bytes\n", device_get_unit(pcfdev), len);
561 PCF_SET_S0(pcf, *buf++);
563 /* wait for the byte to be send */
564 if ((error = pcf_wait_byte(pcf)))
567 /* check if ack received */
568 if (pcf_noack(pcf, timeout)) {
581 printf("pcf%d: >> %d bytes written (%d)\n",
582 device_get_unit(pcfdev), bytes, error);
589 pcf_read(device_t pcfdev, char *buf, int len, int *read, int last,
592 struct pcf_softc *pcf = DEVTOSOFTC(pcfdev);
593 int bytes, error = 0;
596 printf("pcf%d: << reading %d bytes\n", device_get_unit(pcfdev), len);
599 /* trig the bus to get the first data byte in S0 */
601 if (len == 1 && last)
602 /* just one byte to read */
603 PCF_SET_S1(pcf, ES0); /* no ack */
611 /* XXX delay needed here */
613 /* wait for trigged byte */
614 if ((error = pcf_wait_byte(pcf))) {
619 if (len == 1 && last)
620 /* ok, last data byte already in S0, no I2C activity
621 * on next PCF_GET_S0() */
624 else if (len == 2 && last)
625 /* next trigged byte with no ack */
626 PCF_SET_S1(pcf, ES0);
628 /* receive byte, trig next byte */
629 *buf++ = PCF_GET_S0(pcf);
639 printf("pcf%d: << %d bytes read (%d)\n",
640 device_get_unit(pcfdev), bytes, error);
646 DRIVER_MODULE(pcf, isa, pcf_driver, pcf_devclass, 0, 0);