123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- #include <sys/param.h>
- #include <sys/systm.h>
- #include <sys/device.h>
- #include <dev/spdmemvar.h>
- #include <dev/i2c/i2cvar.h>
- struct spdmem_iic_softc {
- struct spdmem_softc sc_base;
- i2c_tag_t sc_tag;
- i2c_addr_t sc_addr;
- };
- int spdmem_iic_match(struct device *, void *, void *);
- void spdmem_iic_attach(struct device *, struct device *, void *);
- uint8_t spdmem_iic_read(struct spdmem_softc *, uint8_t);
- struct cfattach spdmem_iic_ca = {
- sizeof(struct spdmem_iic_softc), spdmem_iic_match, spdmem_iic_attach
- };
- int
- spdmem_iic_match(struct device *parent, void *match, void *aux)
- {
- struct i2c_attach_args *ia = aux;
- struct spdmem_iic_softc sc;
-
- if (strcmp(ia->ia_name, "spd") == 0)
- return (1);
-
- if (strcmp(ia->ia_name, "eeprom") != 0)
- return (0);
- sc.sc_tag = ia->ia_tag;
- sc.sc_addr = ia->ia_addr;
- sc.sc_base.sc_read = spdmem_iic_read;
- return spdmem_probe(&sc.sc_base);
- }
- void
- spdmem_iic_attach(struct device *parent, struct device *self, void *aux)
- {
- struct spdmem_iic_softc *sc = (struct spdmem_iic_softc *)self;
- struct i2c_attach_args *ia = aux;
- sc->sc_tag = ia->ia_tag;
- sc->sc_addr = ia->ia_addr;
- sc->sc_base.sc_read = spdmem_iic_read;
- printf(":");
- spdmem_attach_common(&sc->sc_base);
- }
- uint8_t
- spdmem_iic_read(struct spdmem_softc *v, uint8_t reg)
- {
- struct spdmem_iic_softc *sc = (struct spdmem_iic_softc *)v;
- uint8_t val = 0xff;
- iic_acquire_bus(sc->sc_tag,0);
- iic_exec(sc->sc_tag, I2C_OP_READ_WITH_STOP, sc->sc_addr,
- ®, sizeof reg, &val, sizeof val, 0);
- iic_release_bus(sc->sc_tag, 0);
- return val;
- }
|