i2c: simplify API and driver_api with generic transfer function
With the introduction of generic transfer function, it is no longer needed to specify read or write functions explicitly in drivers. All read/write functions can now thus call the generic transfer function to achieve the same result. With this change, the transfer function becomes mandatory, and should always be available. Change-Id: Ia6fb98e58b84330a56a5d44ed3df9db42c3a5e88 Signed-off-by: Daniel Leung <daniel.leung@intel.com>
This commit is contained in:
parent
827f6d018b
commit
1c96cdeb52
2 changed files with 7 additions and 50 deletions
|
@ -716,27 +716,6 @@ static int i2c_dw_set_callback(struct device *dev, i2c_callback cb)
|
|||
return DEV_OK;
|
||||
}
|
||||
|
||||
static int i2c_dw_write(struct device *dev, uint8_t *buf,
|
||||
uint32_t len, uint16_t slave_addr)
|
||||
{
|
||||
return i2c_dw_transfer(dev, buf, len, 0, 0, slave_addr, 0);
|
||||
}
|
||||
|
||||
|
||||
static int i2c_dw_read(struct device *dev, uint8_t *buf,
|
||||
uint32_t len, uint16_t slave_addr)
|
||||
{
|
||||
return i2c_dw_transfer(dev, 0, 0, buf, len, slave_addr, 0);
|
||||
}
|
||||
|
||||
static int i2c_dw_polling_write(struct device *dev,
|
||||
uint8_t *write_buf, uint32_t write_len,
|
||||
uint16_t slave_address)
|
||||
{
|
||||
return i2c_dw_poll_transfer(dev, write_buf, write_len,
|
||||
0, 0, slave_address, 0);
|
||||
}
|
||||
|
||||
static int i2c_dw_suspend(struct device *dev)
|
||||
{
|
||||
DBG("I2C: suspend called - function not yet implemented\n");
|
||||
|
@ -756,12 +735,9 @@ static int i2c_dw_resume(struct device *dev)
|
|||
static struct i2c_driver_api funcs = {
|
||||
.configure = i2c_dw_runtime_configure,
|
||||
.set_callback = i2c_dw_set_callback,
|
||||
.write = i2c_dw_write,
|
||||
.read = i2c_dw_read,
|
||||
.transfer = i2c_dw_transfer,
|
||||
.suspend = i2c_dw_suspend,
|
||||
.resume = i2c_dw_resume,
|
||||
.polling_write = i2c_dw_polling_write,
|
||||
.poll_transfer = i2c_dw_poll_transfer,
|
||||
};
|
||||
|
||||
|
|
|
@ -77,10 +77,6 @@ typedef int (*i2c_api_configure_t)(struct device *dev,
|
|||
uint32_t dev_config);
|
||||
typedef int (*i2c_api_set_callback_t)(struct device *dev,
|
||||
i2c_callback cb);
|
||||
typedef int (*i2c_api_io_t)(struct device *dev,
|
||||
uint8_t *buf,
|
||||
uint32_t len,
|
||||
uint16_t slave_addr);
|
||||
typedef int (*i2c_api_full_io_t)(struct device *dev,
|
||||
uint8_t *tx_buf,
|
||||
uint32_t tx_len,
|
||||
|
@ -94,9 +90,6 @@ typedef int (*i2c_api_resume_t)(struct device *dev);
|
|||
struct i2c_driver_api {
|
||||
i2c_api_configure_t configure;
|
||||
i2c_api_set_callback_t set_callback;
|
||||
i2c_api_io_t read;
|
||||
i2c_api_io_t write;
|
||||
i2c_api_io_t polling_write;
|
||||
i2c_api_full_io_t transfer;
|
||||
i2c_api_full_io_t poll_transfer;
|
||||
i2c_api_suspend_t suspend;
|
||||
|
@ -149,7 +142,7 @@ static inline int i2c_write(struct device *dev, uint8_t *buf,
|
|||
struct i2c_driver_api *api;
|
||||
|
||||
api = (struct i2c_driver_api *)dev->driver_api;
|
||||
return api->write(dev, buf, len, addr);
|
||||
return api->transfer(dev, buf, len, 0, 0, addr, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -167,7 +160,7 @@ static inline int i2c_read(struct device *dev, uint8_t *buf,
|
|||
struct i2c_driver_api *api;
|
||||
|
||||
api = (struct i2c_driver_api *)dev->driver_api;
|
||||
return api->read(dev, buf, len, addr);
|
||||
return api->transfer(dev, 0, 0, buf, len, addr, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -192,11 +185,7 @@ static inline int i2c_polling_write(struct device *dev, uint8_t *buf,
|
|||
struct i2c_driver_api *api;
|
||||
|
||||
api = (struct i2c_driver_api *)dev->driver_api;
|
||||
if (api && api->polling_write) {
|
||||
return api->polling_write(dev, buf, len, addr);
|
||||
} else {
|
||||
return DEV_INVALID_OP;
|
||||
}
|
||||
return api->poll_transfer(dev, buf, len, 0, 0, addr, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -224,12 +213,8 @@ static inline int i2c_transfer(struct device *dev,
|
|||
struct i2c_driver_api *api;
|
||||
|
||||
api = (struct i2c_driver_api *)dev->driver_api;
|
||||
if (api && api->transfer) {
|
||||
return api->transfer(dev, tx_buf, tx_len,
|
||||
rx_buf, rx_len, addr, ctrl_flags);
|
||||
} else {
|
||||
return DEV_INVALID_OP;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -260,12 +245,8 @@ static inline int i2c_poll_transfer(struct device *dev,
|
|||
struct i2c_driver_api *api;
|
||||
|
||||
api = (struct i2c_driver_api *)dev->driver_api;
|
||||
if (api && api->poll_transfer) {
|
||||
return api->poll_transfer(dev, tx_buf, tx_len,
|
||||
rx_buf, rx_len, addr, ctrl_flags);
|
||||
} else {
|
||||
return DEV_INVALID_OP;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue