root/dev/i2c/lm78_i2c.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. lm_i2c_match
  2. lm_i2c_attach
  3. lm_i2c_detach
  4. lm_i2c_readreg
  5. lm_i2c_writereg

    1 /*      $OpenBSD: lm78_i2c.c,v 1.1 2006/01/28 11:18:41 kettenis Exp $   */
    2 
    3 /*
    4  * Copyright (c) 2005 Mark Kettenis
    5  *
    6  * Permission to use, copy, modify, and distribute this software for any
    7  * purpose with or without fee is hereby granted, provided that the above
    8  * copyright notice and this permission notice appear in all copies.
    9  *
   10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
   11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
   12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
   13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
   14  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
   15  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
   16  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
   17  */
   18 
   19 #include <sys/param.h>
   20 #include <sys/systm.h>
   21 #include <sys/device.h>
   22 #include <sys/sensors.h>
   23 
   24 #include <machine/bus.h>
   25 
   26 #include <dev/i2c/i2cvar.h>
   27 #include <dev/ic/lm78var.h>
   28 
   29 struct lm_i2c_softc {
   30         struct lm_softc sc_lmsc;
   31         i2c_tag_t       sc_tag;
   32         i2c_addr_t      sc_addr;
   33 };
   34 
   35 int lm_i2c_match(struct device *, void *, void *);
   36 void lm_i2c_attach(struct device *, struct device *, void *);
   37 int lm_i2c_detach(struct device *, int);
   38 u_int8_t lm_i2c_readreg(struct lm_softc *, int);
   39 void lm_i2c_writereg(struct lm_softc *, int, int);
   40 
   41 struct cfattach lm_i2c_ca = {
   42         sizeof(struct lm_i2c_softc), lm_i2c_match,
   43         lm_i2c_attach, lm_i2c_detach
   44 };
   45 
   46 int
   47 lm_i2c_match(struct device *parent, void *match, void *aux)
   48 {
   49         struct i2c_attach_args *ia = aux;
   50 
   51         if (strcmp(ia->ia_name, "as99127f") == 0 ||
   52             strcmp(ia->ia_name, "w83627hf") == 0 ||
   53             strcmp(ia->ia_name, "w83781d") == 0 ||
   54             strcmp(ia->ia_name, "w83782d") == 0 ||
   55             strcmp(ia->ia_name, "w83783s") == 0 ||
   56             strcmp(ia->ia_name, "w83791d") == 0 ||
   57             strcmp(ia->ia_name, "w83792d") == 0) {
   58                 return (1);
   59         }
   60         /*
   61          * XXX This chip doesn't have any real sensors, but we match
   62          * it for now, just to knock out its satellites.
   63          */
   64         if (strcmp(ia->ia_name, "w83791sd") == 0) {
   65                 return (1);
   66         }
   67         return (0);
   68 }
   69 
   70 void
   71 lm_i2c_attach(struct device *parent, struct device *self, void *aux)
   72 {
   73         struct lm_i2c_softc *sc = (struct lm_i2c_softc *)self;
   74         struct i2c_attach_args *ia = aux;
   75         u_int8_t cmd, data;
   76 
   77         sc->sc_tag = ia->ia_tag;
   78         sc->sc_addr = ia->ia_addr;
   79 
   80         /* Bus-independent attachment. */
   81         sc->sc_lmsc.lm_writereg = lm_i2c_writereg;
   82         sc->sc_lmsc.lm_readreg = lm_i2c_readreg;
   83         lm_attach(&sc->sc_lmsc);
   84 
   85         /* Remember we attached to iic(4). */
   86         sc->sc_lmsc.sbusaddr = ia->ia_addr;
   87 
   88         iic_acquire_bus(sc->sc_tag, 0);
   89 
   90         cmd = 0x4a;
   91         iic_exec(sc->sc_tag, I2C_OP_READ_WITH_STOP,
   92             sc->sc_addr, &cmd, sizeof cmd, &data, sizeof data, 0);
   93 
   94         iic_release_bus(sc->sc_tag, 0);
   95 
   96         /* Make the bus scan ignore the satellites. */
   97         iic_ignore_addr(0x48 + (data & 0x7));
   98         iic_ignore_addr(0x48 + ((data >> 4) & 0x7));
   99 }
  100 
  101 int
  102 lm_i2c_detach(struct device *self, int flags)
  103 {
  104         struct lm_i2c_softc *sc = (struct lm_i2c_softc *)self;
  105 
  106         return lm_detach(&sc->sc_lmsc);
  107 }
  108 
  109 u_int8_t
  110 lm_i2c_readreg(struct lm_softc *lmsc, int reg)
  111 {
  112         struct lm_i2c_softc *sc = (struct lm_i2c_softc *)lmsc;
  113         u_int8_t cmd, data;
  114 
  115         iic_acquire_bus(sc->sc_tag, 0);
  116 
  117         cmd = reg;
  118         iic_exec(sc->sc_tag, I2C_OP_READ_WITH_STOP,
  119              sc->sc_addr, &cmd, sizeof cmd, &data, sizeof data, 0);
  120 
  121         iic_release_bus(sc->sc_tag, 0);
  122 
  123         return data;
  124 }
  125 
  126 void
  127 lm_i2c_writereg(struct lm_softc *lmsc, int reg, int val)
  128 {
  129         struct lm_i2c_softc *sc = (struct lm_i2c_softc *)lmsc;
  130         u_int8_t cmd, data;
  131 
  132         iic_acquire_bus(sc->sc_tag, 0);
  133 
  134         cmd = reg;
  135         data = val;
  136         iic_exec(sc->sc_tag, I2C_OP_WRITE_WITH_STOP,
  137             sc->sc_addr, &cmd, sizeof cmd, &data, sizeof data, 0);
  138 
  139         iic_release_bus(sc->sc_tag, 0);
  140 }

/* [<][>][^][v][top][bottom][index][help] */