summaryrefslogtreecommitdiff
path: root/sys/dev/smbus/smb.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/smbus/smb.c')
-rw-r--r--sys/dev/smbus/smb.c50
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;