summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBhuvanchandra DV <bhuvanchandra.dv@toradex.com>2014-08-12 19:46:54 +0530
committerStefan Agner <stefan.agner@toradex.com>2014-08-12 17:58:18 +0200
commit02694a41a9e6d2fc1d94e262c7d689228fd81a3d (patch)
tree5f9b4c1c92c51c1e3898947721077e1c4cf52f88
parent7e646cee063eb4825fdadd02a9ace797a11daa65 (diff)
i2c: imx: assign semaphore before adding I2C adapter
Adding the i2c_add_numbered_adapter might already lead to calls of i2c_imx_xfer, which requires the semaphore to be assigned. Hence we should assign the semaphore before add the I2C adapter. Signed-off-by: Stefan Agner <stefan.agner@toradex.com>
-rw-r--r--drivers/i2c/busses/i2c-imx.c29
1 files changed, 13 insertions, 16 deletions
diff --git a/drivers/i2c/busses/i2c-imx.c b/drivers/i2c/busses/i2c-imx.c
index 2bbc5b59670d..dc5aff8cdc7c 100644
--- a/drivers/i2c/busses/i2c-imx.c
+++ b/drivers/i2c/busses/i2c-imx.c
@@ -124,8 +124,7 @@ static u16 __initdata i2c_clk_div[60][2] = {
{ 3840, 0x3F }, { 4096, 0x7B }, { 5120, 0x7D }, { 6144, 0x7E },
};
-static MVF_SEMA4* sema4;
-static int i2c_sema4_assigned = 0;
+static MVF_SEMA4* sema4 = NULL;
#else
static u16 __initdata i2c_clk_div[50][2] = {
{ 22, 0x20 }, { 24, 0x21 }, { 26, 0x22 }, { 28, 0x23 },
@@ -609,29 +608,27 @@ static int __init i2c_imx_probe(struct platform_device *pdev)
writeb(0x80, i2c_imx->base + IMX_I2C_I2CR);
writeb(0, i2c_imx->base + IMX_I2C_I2SR);
- /* Add I2C adapter */
- ret = i2c_add_numbered_adapter(&i2c_imx->adapter);
- if (ret < 0) {
- dev_err(&pdev->dev, "registration failed\n");
- goto fail5;
- }
-
- /* Set up platform driver data */
- platform_set_drvdata(pdev, i2c_imx);
-
#ifdef CONFIG_ARCH_MVF
- // for makeing sure not in use by MQX concurrently
- if(!i2c_sema4_assigned)
+ /* for makeing sure not in use by MQX concurrently */
+ if(!sema4)
{
if(mvf_sema4_assign(MVF_I2C_SEMAPHORE_NUMBER, &sema4)) {
dev_err(&pdev->dev, "could not assign MQX semaphore %d\n", MVF_I2C_SEMAPHORE_NUMBER);
goto fail5;
}
- // mark the semaphore as assigned
- i2c_sema4_assigned = 1;
}
#endif
+ /* Set up platform driver data */
+ platform_set_drvdata(pdev, i2c_imx);
+
+ /* Add I2C adapter */
+ ret = i2c_add_numbered_adapter(&i2c_imx->adapter);
+ if (ret < 0) {
+ dev_err(&pdev->dev, "registration failed\n");
+ goto fail5;
+ }
+
dev_dbg(&i2c_imx->adapter.dev, "claimed irq %d\n", i2c_imx->irq);
dev_dbg(&i2c_imx->adapter.dev, "device resources from 0x%x to 0x%x\n",
i2c_imx->res->start, i2c_imx->res->end);