OSDN Git Service

fsi/gpio: Include command build in locked section
authorJeremy Kerr <jk@ozlabs.org>
Thu, 10 May 2018 09:22:04 +0000 (17:22 +0800)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Tue, 12 Jun 2018 04:05:04 +0000 (14:05 +1000)
For implementing relative addressing mode, we'll need to build a command
that is coherent with CFAM state. To do that, include the
build_command_* functions in the locked section of read/write/term.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Tested-by: Joel Stanley <joel@jms.id.au>
drivers/fsi/fsi-master-gpio.c

index e1bde9e..d50ea48 100644 (file)
@@ -463,14 +463,10 @@ static int fsi_master_gpio_xfer(struct fsi_master_gpio *master, uint8_t slave,
 {
        int rc;
 
-       mutex_lock(&master->cmd_lock);
-
        rc = send_request(master, cmd);
        if (!rc)
                rc = poll_for_response(master, slave, resp_len, resp);
 
-       mutex_unlock(&master->cmd_lock);
-
        return rc;
 }
 
@@ -479,12 +475,17 @@ static int fsi_master_gpio_read(struct fsi_master *_master, int link,
 {
        struct fsi_master_gpio *master = to_fsi_master_gpio(_master);
        struct fsi_gpio_msg cmd;
+       int rc;
 
        if (link != 0)
                return -ENODEV;
 
+       mutex_lock(&master->cmd_lock);
        build_abs_ar_command(&cmd, id, addr, size, NULL);
-       return fsi_master_gpio_xfer(master, id, &cmd, size, val);
+       rc = fsi_master_gpio_xfer(master, id, &cmd, size, val);
+       mutex_unlock(&master->cmd_lock);
+
+       return rc;
 }
 
 static int fsi_master_gpio_write(struct fsi_master *_master, int link,
@@ -492,12 +493,17 @@ static int fsi_master_gpio_write(struct fsi_master *_master, int link,
 {
        struct fsi_master_gpio *master = to_fsi_master_gpio(_master);
        struct fsi_gpio_msg cmd;
+       int rc;
 
        if (link != 0)
                return -ENODEV;
 
+       mutex_lock(&master->cmd_lock);
        build_abs_ar_command(&cmd, id, addr, size, val);
-       return fsi_master_gpio_xfer(master, id, &cmd, 0, NULL);
+       rc = fsi_master_gpio_xfer(master, id, &cmd, 0, NULL);
+       mutex_unlock(&master->cmd_lock);
+
+       return rc;
 }
 
 static int fsi_master_gpio_term(struct fsi_master *_master,
@@ -505,12 +511,17 @@ static int fsi_master_gpio_term(struct fsi_master *_master,
 {
        struct fsi_master_gpio *master = to_fsi_master_gpio(_master);
        struct fsi_gpio_msg cmd;
+       int rc;
 
        if (link != 0)
                return -ENODEV;
 
+       mutex_lock(&master->cmd_lock);
        build_term_command(&cmd, id);
-       return fsi_master_gpio_xfer(master, id, &cmd, 0, NULL);
+       rc = fsi_master_gpio_xfer(master, id, &cmd, 0, NULL);
+       mutex_unlock(&master->cmd_lock);
+
+       return rc;
 }
 
 static int fsi_master_gpio_break(struct fsi_master *_master, int link)