Lines Matching refs:sc

117 static void 	kiic_writereg(struct kiic_softc *sc, u_int, u_int);
167 struct kiic_softc *sc = device_get_softc(self);
172 bzero(sc, sizeof(*sc));
173 sc->sc_dev = self;
181 sc->sc_reg = bus_alloc_resource_any(self, SYS_RES_MEMORY,
183 if (sc->sc_reg == NULL) {
191 if (OF_getencprop(node, "AAPL,address-step", &sc->sc_regstep, 4) != 4) {
209 sc->sc_node = node;
216 sc->sc_i2c_base = reg << 8;
218 sc->sc_node = node;
222 mtx_init(&sc->sc_mutex, "kiic", NULL, MTX_DEF);
224 sc->sc_irq = bus_alloc_resource_any(self, SYS_RES_IRQ, &sc->sc_irqrid,
226 bus_setup_intr(self, sc->sc_irq, INTR_TYPE_MISC | INTR_MPSAFE, NULL,
227 kiic_intr, sc, &sc->sc_ih);
229 kiic_writereg(sc, ISR, kiic_readreg(sc, ISR));
230 kiic_writereg(sc, STATUS, 0);
231 kiic_writereg(sc, IER, 0);
233 kiic_setmode(sc, I2C_STDMODE);
234 kiic_setspeed(sc, I2C_100kHz); /* XXX rate */
236 kiic_writereg(sc, IER, I2C_INT_DATA | I2C_INT_ADDR | I2C_INT_STOP);
239 device_printf(self, "Revision: %02X\n", kiic_readreg(sc, REV));
242 sc->sc_iicbus = device_add_child(self, "iicbus", -1);
248 kiic_writereg(struct kiic_softc *sc, u_int reg, u_int val)
250 bus_write_4(sc->sc_reg, sc->sc_regstep * reg, val);
255 kiic_readreg(struct kiic_softc *sc, u_int reg)
257 return bus_read_4(sc->sc_reg, sc->sc_regstep * reg) & 0xff;
261 kiic_setmode(struct kiic_softc *sc, u_int mode)
266 x = kiic_readreg(sc, MODE);
269 kiic_writereg(sc, MODE, x);
273 kiic_setport(struct kiic_softc *sc, u_int port)
278 x = kiic_readreg(sc, MODE);
281 kiic_writereg(sc, MODE, x);
285 kiic_setspeed(struct kiic_softc *sc, u_int speed)
290 x = kiic_readreg(sc, MODE);
293 kiic_writereg(sc, MODE, x);
299 struct kiic_softc *sc = xsc;
303 mtx_lock(&sc->sc_mutex);
304 isr = kiic_readreg(sc, ISR);
307 sc->sc_flags |= I2C_SELECTED;
309 if (sc->sc_flags & I2C_READING) {
310 if (sc->sc_resid > 1) {
311 x = kiic_readreg(sc, CONTROL);
313 kiic_writereg(sc, CONTROL, x);
316 kiic_writereg(sc, DATA, *sc->sc_data++);
317 sc->sc_resid--;
322 if (sc->sc_flags & I2C_READING) {
323 if (sc->sc_resid > 0) {
324 *sc->sc_data++ = kiic_readreg(sc, DATA);
325 sc->sc_resid--;
327 if (sc->sc_resid == 0) /* done */
328 kiic_writereg(sc, CONTROL, 0);
330 if (sc->sc_resid == 0) {
331 x = kiic_readreg(sc, CONTROL);
333 kiic_writereg(sc, CONTROL, x);
335 kiic_writereg(sc, DATA, *sc->sc_data++);
336 sc->sc_resid--;
342 kiic_writereg(sc, CONTROL, 0);
343 sc->sc_flags &= ~I2C_SELECTED;
344 wakeup(sc->sc_dev);
347 kiic_writereg(sc, ISR, isr);
348 mtx_unlock(&sc->sc_mutex);
354 struct kiic_softc *sc;
359 sc = device_get_softc(dev);
363 mtx_lock(&sc->sc_mutex);
365 if (sc->sc_flags & I2C_BUSY)
366 mtx_sleep(dev, &sc->sc_mutex, 0, "kiic", timo);
368 if (sc->sc_flags & I2C_BUSY) {
369 mtx_unlock(&sc->sc_mutex);
373 sc->sc_flags = I2C_BUSY;
376 kiic_writereg(sc, ISR, kiic_readreg(sc, ISR));
377 kiic_writereg(sc, STATUS, 0);
382 kiic_setmode(sc, I2C_COMBMODE);
384 kiic_setmode(sc, I2C_STDSUBMODE);
389 kiic_setmode(sc, I2C_STDMODE);
392 sc->sc_data = msgs[i].buf;
393 sc->sc_resid = msgs[i].len;
394 sc->sc_flags = I2C_BUSY;
396 timo = 1000 + sc->sc_resid * 200;
400 sc->sc_flags |= I2C_READING;
404 addr |= sc->sc_i2c_base;
406 kiic_setport(sc, (addr & 0x100) >> 8);
407 kiic_writereg(sc, ADDR, addr & 0xff);
408 kiic_writereg(sc, SUBADDR, subaddr);
410 x = kiic_readreg(sc, CONTROL) | I2C_CT_ADDR;
411 kiic_writereg(sc, CONTROL, x);
413 err = mtx_sleep(dev, &sc->sc_mutex, 0, "kiic", timo);
415 msgs[i].len -= sc->sc_resid;
417 if ((sc->sc_flags & I2C_ERROR) || err == EWOULDBLOCK) {
418 device_printf(sc->sc_dev, "I2C error\n");
419 sc->sc_flags = 0;
420 mtx_unlock(&sc->sc_mutex);
425 sc->sc_flags = 0;
427 mtx_unlock(&sc->sc_mutex);
435 struct kiic_softc *sc;
437 sc = device_get_softc(bus);
440 return sc->sc_node;