Deleted Added
full compact
i2c.c (194630) i2c.c (209908)
1/*-
2 * Copyright (C) 2008-2009 Semihalf, Michal Hajduk
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

--- 11 unchanged lines hidden (view full) ---

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
27#include <sys/cdefs.h>
1/*-
2 * Copyright (C) 2008-2009 Semihalf, Michal Hajduk
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

--- 11 unchanged lines hidden (view full) ---

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
27#include <sys/cdefs.h>
28__FBSDID("$FreeBSD: head/sys/powerpc/mpc85xx/i2c.c 194630 2009-06-22 15:34:32Z raj $");
28__FBSDID("$FreeBSD: head/sys/powerpc/mpc85xx/i2c.c 209908 2010-07-11 21:08:29Z raj $");
29
30#include <sys/param.h>
31#include <sys/systm.h>
32#include <sys/bus.h>
33#include <sys/kernel.h>
34#include <sys/module.h>
35#include <sys/resource.h>
36
37#include <machine/bus.h>
38#include <machine/resource.h>
29
30#include <sys/param.h>
31#include <sys/systm.h>
32#include <sys/bus.h>
33#include <sys/kernel.h>
34#include <sys/module.h>
35#include <sys/resource.h>
36
37#include <machine/bus.h>
38#include <machine/resource.h>
39#include <machine/ocpbus.h>
40#include <sys/rman.h>
41
42#include <sys/lock.h>
43#include <sys/mutex.h>
44
45#include <dev/iicbus/iiconf.h>
46#include <dev/iicbus/iicbus.h>
47#include "iicbus_if.h"
48
39#include <sys/rman.h>
40
41#include <sys/lock.h>
42#include <sys/mutex.h>
43
44#include <dev/iicbus/iiconf.h>
45#include <dev/iicbus/iicbus.h>
46#include "iicbus_if.h"
47
49#include <powerpc/mpc85xx/ocpbus.h>
48#include <dev/ofw/ofw_bus.h>
49#include <dev/ofw/ofw_bus_subr.h>
50
51#define I2C_ADDR_REG 0x00 /* I2C slave address register */
52#define I2C_FDR_REG 0x04 /* I2C frequency divider register */
53#define I2C_CONTROL_REG 0x08 /* I2C control register */
54#define I2C_STATUS_REG 0x0C /* I2C status register */
55#define I2C_DATA_REG 0x10 /* I2C data register */
56#define I2C_DFSRR_REG 0x14 /* I2C Digital Filter Sampling rate */
57#define I2C_ENABLE 0x80 /* Module enable - interrupt disable */

--- 61 unchanged lines hidden (view full) ---

119
120static driver_t i2c_driver = {
121 "i2c",
122 i2c_methods,
123 sizeof(struct i2c_softc),
124};
125static devclass_t i2c_devclass;
126
50
51#define I2C_ADDR_REG 0x00 /* I2C slave address register */
52#define I2C_FDR_REG 0x04 /* I2C frequency divider register */
53#define I2C_CONTROL_REG 0x08 /* I2C control register */
54#define I2C_STATUS_REG 0x0C /* I2C status register */
55#define I2C_DATA_REG 0x10 /* I2C data register */
56#define I2C_DFSRR_REG 0x14 /* I2C Digital Filter Sampling rate */
57#define I2C_ENABLE 0x80 /* Module enable - interrupt disable */

--- 61 unchanged lines hidden (view full) ---

119
120static driver_t i2c_driver = {
121 "i2c",
122 i2c_methods,
123 sizeof(struct i2c_softc),
124};
125static devclass_t i2c_devclass;
126
127DRIVER_MODULE(i2c, ocpbus, i2c_driver, i2c_devclass, 0, 0);
127DRIVER_MODULE(i2c, simplebus, i2c_driver, i2c_devclass, 0, 0);
128DRIVER_MODULE(iicbus, i2c, iicbus_driver, iicbus_devclass, 0, 0);
129
130static __inline void
131i2c_write_reg(struct i2c_softc *sc, bus_size_t off, uint8_t val)
132{
133
134 bus_space_write_1(sc->bst, sc->bsh, off, val);
135}

--- 16 unchanged lines hidden (view full) ---

152}
153
154static int
155i2c_do_wait(device_t dev, struct i2c_softc *sc, int write, int start)
156{
157 int err;
158 uint8_t status;
159
128DRIVER_MODULE(iicbus, i2c, iicbus_driver, iicbus_devclass, 0, 0);
129
130static __inline void
131i2c_write_reg(struct i2c_softc *sc, bus_size_t off, uint8_t val)
132{
133
134 bus_space_write_1(sc->bst, sc->bsh, off, val);
135}

--- 16 unchanged lines hidden (view full) ---

152}
153
154static int
155i2c_do_wait(device_t dev, struct i2c_softc *sc, int write, int start)
156{
157 int err;
158 uint8_t status;
159
160 status = i2c_read_reg(sc,I2C_STATUS_REG);
160 status = i2c_read_reg(sc, I2C_STATUS_REG);
161 if (status & I2CSR_MIF) {
162 if (write && start && (status & I2CSR_RXAK)) {
163 debugf("no ack %s", start ?
164 "after sending slave address" : "");
165 err = IIC_ENOACK;
166 goto error;
167 }
168 if (status & I2CSR_MAL) {

--- 14 unchanged lines hidden (view full) ---

183 i2c_write_reg(sc, I2C_STATUS_REG, 0x0);
184 i2c_write_reg(sc, I2C_CONTROL_REG, I2CCR_MEN | I2CCR_TXAK);
185 return (err);
186}
187
188static int
189i2c_probe(device_t dev)
190{
161 if (status & I2CSR_MIF) {
162 if (write && start && (status & I2CSR_RXAK)) {
163 debugf("no ack %s", start ?
164 "after sending slave address" : "");
165 err = IIC_ENOACK;
166 goto error;
167 }
168 if (status & I2CSR_MAL) {

--- 14 unchanged lines hidden (view full) ---

183 i2c_write_reg(sc, I2C_STATUS_REG, 0x0);
184 i2c_write_reg(sc, I2C_CONTROL_REG, I2CCR_MEN | I2CCR_TXAK);
185 return (err);
186}
187
188static int
189i2c_probe(device_t dev)
190{
191 device_t parent;
192 struct i2c_softc *sc;
191 struct i2c_softc *sc;
193 uintptr_t devtype;
194 int error;
195
192
196 parent = device_get_parent(dev);
197
198 error = BUS_READ_IVAR(parent, dev, OCPBUS_IVAR_DEVTYPE, &devtype);
199
200 if (error)
201 return (error);
202
203 if (devtype != OCPBUS_DEVTYPE_I2C)
193 if (!ofw_bus_is_compatible(dev, "fsl-i2c"))
204 return (ENXIO);
205
206 sc = device_get_softc(dev);
207 sc->rid = 0;
208
209 sc->res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &sc->rid,
210 RF_ACTIVE);
211 if (sc->res == NULL) {
194 return (ENXIO);
195
196 sc = device_get_softc(dev);
197 sc->rid = 0;
198
199 sc->res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &sc->rid,
200 RF_ACTIVE);
201 if (sc->res == NULL) {
212 device_printf(dev, "could not allocate resources");
202 device_printf(dev, "could not allocate resources\n");
213 return (ENXIO);
214 }
215
216 sc->bst = rman_get_bustag(sc->res);
217 sc->bsh = rman_get_bushandle(sc->res);
218
219 /* Enable I2C */
220 i2c_write_reg(sc, I2C_CONTROL_REG, I2C_ENABLE);

--- 220 unchanged lines hidden ---
203 return (ENXIO);
204 }
205
206 sc->bst = rman_get_bustag(sc->res);
207 sc->bsh = rman_get_bushandle(sc->res);
208
209 /* Enable I2C */
210 i2c_write_reg(sc, I2C_CONTROL_REG, I2C_ENABLE);

--- 220 unchanged lines hidden ---