diff options
Diffstat (limited to 'sys/dev/smbus/smb.c')
-rw-r--r-- | sys/dev/smbus/smb.c | 50 |
1 files changed, 35 insertions, 15 deletions
diff --git a/sys/dev/smbus/smb.c b/sys/dev/smbus/smb.c index b5d29194430eb..94719fb83ad68 100644 --- a/sys/dev/smbus/smb.c +++ b/sys/dev/smbus/smb.c @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: smb.c,v 1.5 1999/01/09 18:08:23 nsouch Exp $ + * $Id: smb.c,v 1.2 1998/09/04 17:53:42 nsouch Exp $ * */ #include <sys/param.h> @@ -119,6 +119,8 @@ smb_probe(device_t dev) static int smb_attach(device_t dev) { + struct smb_softc *sc = (struct smb_softc *)device_get_softc(dev); + return (0); } @@ -157,9 +159,24 @@ smbclose(dev_t dev, int flags, int fmt, struct proc *p) static int smbwrite(dev_t dev, struct uio * uio, int ioflag) { - /* not supported */ + device_t smbdev = IIC_DEVICE(minor(dev)); + struct smb_softc *sc = IIC_SOFTC(minor(dev)); + int error, count; - return (EINVAL); + if (!sc || !smbdev) + return (EINVAL); + + if (sc->sc_count == 0) + return (EINVAL); + + count = min(uio->uio_resid, BUFSIZE); + uiomove(sc->sc_buffer, count, uio); + + /* we consider the command char as the first character to send */ + smbus_bwrite(device_get_parent(smbdev), sc->sc_addr, + sc->sc_buffer[0], count-1, sc->sc_buffer+1); + + return (0); } static int @@ -180,62 +197,65 @@ smbioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct proc *p) int error = 0; struct smbcmd *s = (struct smbcmd *)data; - if (!sc || !s) + if (!sc) return (EINVAL); switch (cmd) { case SMB_QUICK_WRITE: - error=smbus_quick(parent, s->slave, SMB_QWRITE); + smbus_quick(parent, sc->sc_addr, SMB_QWRITE); goto end; case SMB_QUICK_READ: - error=smbus_quick(parent, s->slave, SMB_QREAD); + smbus_quick(parent, sc->sc_addr, SMB_QREAD); goto end; }; + if (!s) + return (EINVAL); + switch (cmd) { case SMB_SENDB: - error=smbus_sendb(parent, s->slave, s->cmd); + smbus_sendb(parent, sc->sc_addr, s->cmd); break; case SMB_RECVB: - error=smbus_recvb(parent, s->slave, &s->cmd); + smbus_recvb(parent, sc->sc_addr, &s->cmd); break; case SMB_WRITEB: - error=smbus_writeb(parent, s->slave, s->cmd, s->data.byte); + smbus_writeb(parent, sc->sc_addr, s->cmd, s->data.byte); break; case SMB_WRITEW: - error=smbus_writew(parent, s->slave, s->cmd, s->data.word); + smbus_writew(parent, sc->sc_addr, s->cmd, s->data.word); break; case SMB_READB: if (s->data.byte_ptr) - error=smbus_readb(parent, s->slave, s->cmd, + smbus_readb(parent, sc->sc_addr, s->cmd, s->data.byte_ptr); break; case SMB_READW: if (s->data.word_ptr) - error=smbus_readw(parent, s->slave, s->cmd, s->data.word_ptr); + smbus_readw(parent, sc->sc_addr, s->cmd, s->data.word_ptr); break; case SMB_PCALL: if (s->data.process.rdata) - error=smbus_pcall(parent, s->slave, s->cmd, + smbus_pcall(parent, sc->sc_addr, s->cmd, s->data.process.sdata, s->data.process.rdata); break; case SMB_BWRITE: if (s->count && s->data.byte_ptr) - error=smbus_bwrite(parent, s->slave, s->cmd, s->count, + smbus_bwrite(parent, sc->sc_addr, s->cmd, s->count, s->data.byte_ptr); break; case SMB_BREAD: if (s->count && s->data.byte_ptr) - error=smbus_bread(parent, s->slave, s->cmd, s->count, + smbus_bread(parent, sc->sc_addr, s->cmd, s->count, s->data.byte_ptr); break; |