X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fraw%2Fifpga%2Fbase%2Fopae_i2c.c;h=846d751f5876c0fc417817d750e138afbd1b2609;hb=0d6ef740e411180a40e93419e403690ab788985f;hp=f8bc247ea7405f32f9e357ea9648d34e55aef912;hpb=473c88f9b391c2cd8b8622dcc488116cb09b624a;p=dpdk.git diff --git a/drivers/raw/ifpga/base/opae_i2c.c b/drivers/raw/ifpga/base/opae_i2c.c index f8bc247ea7..846d751f58 100644 --- a/drivers/raw/ifpga/base/opae_i2c.c +++ b/drivers/raw/ifpga/base/opae_i2c.c @@ -28,6 +28,9 @@ int i2c_read(struct altera_i2c_dev *dev, int flags, unsigned int slave_addr, { u8 msgbuf[2]; int i = 0; + int ret; + + pthread_mutex_lock(&dev->lock); if (flags & I2C_FLAG_ADDR16) msgbuf[i++] = offset >> 8; @@ -49,10 +52,16 @@ int i2c_read(struct altera_i2c_dev *dev, int flags, unsigned int slave_addr, }, }; - if (!dev->xfer) - return -ENODEV; + if (!dev->xfer) { + ret = -ENODEV; + goto exit; + } + + ret = i2c_transfer(dev, msg, 2); - return i2c_transfer(dev, msg, 2); +exit: + pthread_mutex_unlock(&dev->lock); + return ret; } int i2c_write(struct altera_i2c_dev *dev, int flags, unsigned int slave_addr, @@ -63,12 +72,18 @@ int i2c_write(struct altera_i2c_dev *dev, int flags, unsigned int slave_addr, int ret; int i = 0; - if (!dev->xfer) - return -ENODEV; + pthread_mutex_lock(&dev->lock); + + if (!dev->xfer) { + ret = -ENODEV; + goto exit; + } buf = opae_malloc(I2C_MAX_OFFSET_LEN + len); - if (!buf) - return -ENOMEM; + if (!buf) { + ret = -ENOMEM; + goto exit; + } msg.addr = slave_addr; msg.flags = 0; @@ -84,6 +99,8 @@ int i2c_write(struct altera_i2c_dev *dev, int flags, unsigned int slave_addr, ret = i2c_transfer(dev, &msg, 1); opae_free(buf); +exit: + pthread_mutex_unlock(&dev->lock); return ret; } @@ -477,14 +494,19 @@ struct altera_i2c_dev *altera_i2c_probe(void *base) dev->i2c_clk = dev->i2c_param.ref_clk * 1000000; dev->xfer = altera_i2c_xfer; + if (pthread_mutex_init(&dev->lock, NULL)) + return NULL; + altera_i2c_hardware_init(dev); return dev; } -int altera_i2c_remove(struct altera_i2c_dev *dev) +void altera_i2c_remove(struct altera_i2c_dev *dev) { - altera_i2c_disable(dev); - - return 0; + if (dev) { + pthread_mutex_destroy(&dev->lock); + altera_i2c_disable(dev); + opae_free(dev); + } }