]> Zhao Yanbai Git Server - minix.git/commitdiff
I2C: change BUSC_I2C_xxx to use own protocol 59/959/2
authorDavid van Moolenbroek <david@minix3.org>
Mon, 2 Sep 2013 11:45:02 +0000 (13:45 +0200)
committerLionel Sambuc <lionel@minix3.org>
Tue, 18 Feb 2014 10:25:03 +0000 (11:25 +0100)
Previously it would use bits of the character driver protocol, which
will change heavily.  In the new situation, the BUSC_I2C_xxx requests
use a protocol more in line with the PCI protocol, with the reply code
in m_type.

Change-Id: I51597b3f191078c8178ce17372de123031f7a4c4

drivers/i2c/i2c.c
include/minix/com.h
lib/libi2cdriver/i2cdriver.c

index f82e60027ad0f5aebad60027beb56c4095838cd5..23a41a3a182a0791ec781c93cff5266a45148470 100644 (file)
@@ -34,7 +34,7 @@ static void update_reservation(endpoint_t endpt, char *key);
 static void ds_event(void);
 
 static int validate_ioctl_exec(minix_i2c_ioctl_exec_t * ioctl_exec);
-static int do_i2c_ioctl_exec(message * m);
+static int do_i2c_ioctl_exec(endpoint_t caller, cp_grant_id_t grant_nr);
 
 static int env_parse_instance(void);
 
@@ -253,16 +253,11 @@ validate_ioctl_exec(minix_i2c_ioctl_exec_t * ioctl_exec)
  * Performs the action in minix_i2c_ioctl_exec_t.
  */
 static int
-do_i2c_ioctl_exec(message * m)
+do_i2c_ioctl_exec(endpoint_t caller, cp_grant_id_t grant_nr)
 {
        int r;
-       endpoint_t caller;
-       cp_grant_id_t grant_nr;
        minix_i2c_ioctl_exec_t ioctl_exec;
 
-       caller = (endpoint_t) m->m_source;
-       grant_nr = (cp_grant_id_t) m->IO_GRANT;
-
        /* Copy the requested exection into the driver */
        r = sys_safecopyfrom(caller, grant_nr, (vir_bytes) 0,
            (vir_bytes) & ioctl_exec, sizeof(ioctl_exec));
@@ -310,7 +305,7 @@ i2c_ioctl(message * m)
 
        switch (m->COUNT) {
        case MINIX_I2C_IOCTL_EXEC:
-               r = do_i2c_ioctl_exec(m);
+               r = do_i2c_ioctl_exec(m->m_source, (cp_grant_id_t)m->IO_GRANT);
                break;
        default:
                log_warn(&log, "Invalid ioctl() 0x%x\n", m->COUNT);
@@ -324,25 +319,24 @@ i2c_ioctl(message * m)
 int
 i2c_other(message * m)
 {
+       message m_reply;
        int r;
 
        switch (m->m_type) {
        case BUSC_I2C_RESERVE:
                /* reserve a device on the bus for exclusive access */
-               r = do_reserve((endpoint_t) m->m_source, m->DEVICE);
+               r = do_reserve(m->m_source, m->BUSC_I2C_ADDR);
                break;
        case BUSC_I2C_EXEC:
                /* handle request from another driver */
-               m->COUNT = MINIX_I2C_IOCTL_EXEC;
-               r = do_i2c_ioctl_exec(m);
+               r = do_i2c_ioctl_exec(m->m_source, m->BUSC_I2C_GRANT);
                break;
        case NOTIFY_MESSAGE:
                /* handle notifications about drivers changing state */
                if (m->m_source == DS_PROC_NR) {
                        ds_event();
                }
-               r = OK;
-               break;
+               return EDONTREPLY;
        default:
                log_warn(&log, "Invalid message type (0x%x)\n", m->m_type);
                r = EINVAL;
@@ -351,7 +345,14 @@ i2c_other(message * m)
 
        log_trace(&log, "i2c_other() returning r=%d\n", r);
 
-       return r;
+       /* We cannot use libchardriver to reply, as it will send DEV_REVIVE. */
+       memset(&m_reply, 0, sizeof(m_reply));
+       m_reply.m_type = r;
+
+       if ((r = send(m->m_source, &m_reply)) != OK)
+               log_warn(&log, "send() to %d failed: %d\n", m->m_source, r);
+
+       return EDONTREPLY;
 }
 
 struct device *
index b35e6228c784719ed9e345230f01fedcdcb022b1..a2b8053805014613bf43e1d28d80033851658dc2 100644 (file)
                                                         */
 
 #define BUSC_I2C_RESERVE       (BUSC_RQ_BASE + 64)     /* reserve i2c device */
+#define   BUSC_I2C_ADDR                m2_i1                   /* slave address */
 #define BUSC_I2C_EXEC          (BUSC_RQ_BASE + 65)     /* perform i2c action */
+#define   BUSC_I2C_GRANT       m2_i1                   /* grant for request */
 
 /*===========================================================================*
  *                Messages for CHARACTER device drivers                             *
index 1a73ba7ed6994690de14be73fae7fa2fa754da92..1d16db095bc9a4eb7a5c6aaa7ab64c16b0613d41 100644 (file)
@@ -161,14 +161,14 @@ i2cdriver_reserve_device(endpoint_t bus_endpoint, i2c_addr_t address)
        message m;
 
        m.m_type = BUSC_I2C_RESERVE;
-       m.DEVICE = address;
+       m.BUSC_I2C_ADDR = address;
 
        r = sendrec(bus_endpoint, &m);
        if (r != OK) {
                return EIO;
        }
 
-       return m.REP_STATUS;    /* return reply code OK, EBUSY, EINVAL, etc. */
+       return m.m_type;        /* return reply code OK, EBUSY, EINVAL, etc. */
 }
 
 int
@@ -184,7 +184,7 @@ i2cdriver_exec(endpoint_t bus_endpoint, minix_i2c_ioctl_exec_t * ioctl_exec)
        memset(&m, '\0', sizeof(message));
 
        m.m_type = BUSC_I2C_EXEC;
-       m.IO_GRANT = (char *) grant_nr;
+       m.BUSC_I2C_GRANT = grant_nr;
 
        r = sendrec(bus_endpoint, &m);
        cpf_revoke(grant_nr);
@@ -192,7 +192,7 @@ i2cdriver_exec(endpoint_t bus_endpoint, minix_i2c_ioctl_exec_t * ioctl_exec)
                return EIO;
        }
 
-       return m.REP_STATUS;
+       return m.m_type;
 }
 
 static int