mirror of https://gitee.com/openkylin/linux.git
i2c: ocores: refactor setup for polling
By properly setting up the algorithm at probe time, we can skip the check at every transfer. This allows us to get rid of the flags completely. Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com> Cc: Andrew Lunn <andrew@lunn.ch> Acked-by: Peter Korsgaard <peter@korsgaard.com> Reviewed-by: Andrew Lunn <andrew@lunn.ch> Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
This commit is contained in:
parent
08960b022f
commit
dd7dbf0eb0
|
@ -26,8 +26,6 @@
|
||||||
#include <linux/spinlock.h>
|
#include <linux/spinlock.h>
|
||||||
#include <linux/jiffies.h>
|
#include <linux/jiffies.h>
|
||||||
|
|
||||||
#define OCORES_FLAG_POLL BIT(0)
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 'process_lock' exists because ocores_process() and ocores_process_timeout()
|
* 'process_lock' exists because ocores_process() and ocores_process_timeout()
|
||||||
* can't run in parallel.
|
* can't run in parallel.
|
||||||
|
@ -37,7 +35,6 @@ struct ocores_i2c {
|
||||||
int iobase;
|
int iobase;
|
||||||
u32 reg_shift;
|
u32 reg_shift;
|
||||||
u32 reg_io_width;
|
u32 reg_io_width;
|
||||||
unsigned long flags;
|
|
||||||
wait_queue_head_t wait;
|
wait_queue_head_t wait;
|
||||||
struct i2c_adapter adap;
|
struct i2c_adapter adap;
|
||||||
struct i2c_msg *msg;
|
struct i2c_msg *msg;
|
||||||
|
@ -403,11 +400,7 @@ static int ocores_xfer_polling(struct i2c_adapter *adap,
|
||||||
static int ocores_xfer(struct i2c_adapter *adap,
|
static int ocores_xfer(struct i2c_adapter *adap,
|
||||||
struct i2c_msg *msgs, int num)
|
struct i2c_msg *msgs, int num)
|
||||||
{
|
{
|
||||||
struct ocores_i2c *i2c = i2c_get_adapdata(adap);
|
return ocores_xfer_core(i2c_get_adapdata(adap), msgs, num, false);
|
||||||
|
|
||||||
if (i2c->flags & OCORES_FLAG_POLL)
|
|
||||||
return ocores_xfer_polling(adap, msgs, num);
|
|
||||||
return ocores_xfer_core(i2c, msgs, num, false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ocores_init(struct device *dev, struct ocores_i2c *i2c)
|
static int ocores_init(struct device *dev, struct ocores_i2c *i2c)
|
||||||
|
@ -447,7 +440,7 @@ static u32 ocores_func(struct i2c_adapter *adap)
|
||||||
return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL;
|
return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct i2c_algorithm ocores_algorithm = {
|
static struct i2c_algorithm ocores_algorithm = {
|
||||||
.master_xfer = ocores_xfer,
|
.master_xfer = ocores_xfer,
|
||||||
.functionality = ocores_func,
|
.functionality = ocores_func,
|
||||||
};
|
};
|
||||||
|
@ -673,13 +666,13 @@ static int ocores_i2c_probe(struct platform_device *pdev)
|
||||||
|
|
||||||
irq = platform_get_irq(pdev, 0);
|
irq = platform_get_irq(pdev, 0);
|
||||||
if (irq == -ENXIO) {
|
if (irq == -ENXIO) {
|
||||||
i2c->flags |= OCORES_FLAG_POLL;
|
ocores_algorithm.master_xfer = ocores_xfer_polling;
|
||||||
} else {
|
} else {
|
||||||
if (irq < 0)
|
if (irq < 0)
|
||||||
return irq;
|
return irq;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(i2c->flags & OCORES_FLAG_POLL)) {
|
if (ocores_algorithm.master_xfer != ocores_xfer_polling) {
|
||||||
ret = devm_request_irq(&pdev->dev, irq, ocores_isr, 0,
|
ret = devm_request_irq(&pdev->dev, irq, ocores_isr, 0,
|
||||||
pdev->name, i2c);
|
pdev->name, i2c);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
|
|
Loading…
Reference in New Issue