|
@@ -618,7 +618,7 @@ static int i2c_dw_handle_tx_abort(struct dw_i2c_dev *dev)
|
|
/*
|
|
/*
|
|
* Prepare controller for a transaction and call i2c_dw_xfer_msg
|
|
* Prepare controller for a transaction and call i2c_dw_xfer_msg
|
|
*/
|
|
*/
|
|
-int
|
|
|
|
|
|
+static int
|
|
i2c_dw_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
|
|
i2c_dw_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
|
|
{
|
|
{
|
|
struct dw_i2c_dev *dev = i2c_get_adapdata(adap);
|
|
struct dw_i2c_dev *dev = i2c_get_adapdata(adap);
|
|
@@ -702,14 +702,17 @@ done_nolock:
|
|
|
|
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
-EXPORT_SYMBOL_GPL(i2c_dw_xfer);
|
|
|
|
|
|
|
|
-u32 i2c_dw_func(struct i2c_adapter *adap)
|
|
|
|
|
|
+static u32 i2c_dw_func(struct i2c_adapter *adap)
|
|
{
|
|
{
|
|
struct dw_i2c_dev *dev = i2c_get_adapdata(adap);
|
|
struct dw_i2c_dev *dev = i2c_get_adapdata(adap);
|
|
return dev->functionality;
|
|
return dev->functionality;
|
|
}
|
|
}
|
|
-EXPORT_SYMBOL_GPL(i2c_dw_func);
|
|
|
|
|
|
+
|
|
|
|
+static struct i2c_algorithm i2c_dw_algo = {
|
|
|
|
+ .master_xfer = i2c_dw_xfer,
|
|
|
|
+ .functionality = i2c_dw_func,
|
|
|
|
+};
|
|
|
|
|
|
static u32 i2c_dw_read_clear_intrbits(struct dw_i2c_dev *dev)
|
|
static u32 i2c_dw_read_clear_intrbits(struct dw_i2c_dev *dev)
|
|
{
|
|
{
|
|
@@ -770,7 +773,7 @@ static u32 i2c_dw_read_clear_intrbits(struct dw_i2c_dev *dev)
|
|
* Interrupt service routine. This gets called whenever an I2C interrupt
|
|
* Interrupt service routine. This gets called whenever an I2C interrupt
|
|
* occurs.
|
|
* occurs.
|
|
*/
|
|
*/
|
|
-irqreturn_t i2c_dw_isr(int this_irq, void *dev_id)
|
|
|
|
|
|
+static irqreturn_t i2c_dw_isr(int this_irq, void *dev_id)
|
|
{
|
|
{
|
|
struct dw_i2c_dev *dev = dev_id;
|
|
struct dw_i2c_dev *dev = dev_id;
|
|
u32 stat, enabled;
|
|
u32 stat, enabled;
|
|
@@ -813,7 +816,6 @@ tx_aborted:
|
|
|
|
|
|
return IRQ_HANDLED;
|
|
return IRQ_HANDLED;
|
|
}
|
|
}
|
|
-EXPORT_SYMBOL_GPL(i2c_dw_isr);
|
|
|
|
|
|
|
|
void i2c_dw_disable(struct dw_i2c_dev *dev)
|
|
void i2c_dw_disable(struct dw_i2c_dev *dev)
|
|
{
|
|
{
|
|
@@ -838,5 +840,40 @@ u32 i2c_dw_read_comp_param(struct dw_i2c_dev *dev)
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(i2c_dw_read_comp_param);
|
|
EXPORT_SYMBOL_GPL(i2c_dw_read_comp_param);
|
|
|
|
|
|
|
|
+int i2c_dw_probe(struct dw_i2c_dev *dev)
|
|
|
|
+{
|
|
|
|
+ struct i2c_adapter *adap = &dev->adapter;
|
|
|
|
+ int r;
|
|
|
|
+
|
|
|
|
+ init_completion(&dev->cmd_complete);
|
|
|
|
+ mutex_init(&dev->lock);
|
|
|
|
+
|
|
|
|
+ r = i2c_dw_init(dev);
|
|
|
|
+ if (r)
|
|
|
|
+ return r;
|
|
|
|
+
|
|
|
|
+ snprintf(adap->name, sizeof(adap->name),
|
|
|
|
+ "Synopsys DesignWare I2C adapter");
|
|
|
|
+ adap->algo = &i2c_dw_algo;
|
|
|
|
+ adap->dev.parent = dev->dev;
|
|
|
|
+ i2c_set_adapdata(adap, dev);
|
|
|
|
+
|
|
|
|
+ i2c_dw_disable_int(dev);
|
|
|
|
+ r = devm_request_irq(dev->dev, dev->irq, i2c_dw_isr, IRQF_SHARED,
|
|
|
|
+ dev_name(dev->dev), dev);
|
|
|
|
+ if (r) {
|
|
|
|
+ dev_err(dev->dev, "failure requesting irq %i: %d\n",
|
|
|
|
+ dev->irq, r);
|
|
|
|
+ return r;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ r = i2c_add_numbered_adapter(adap);
|
|
|
|
+ if (r)
|
|
|
|
+ dev_err(dev->dev, "failure adding adapter: %d\n", r);
|
|
|
|
+
|
|
|
|
+ return r;
|
|
|
|
+}
|
|
|
|
+EXPORT_SYMBOL_GPL(i2c_dw_probe);
|
|
|
|
+
|
|
MODULE_DESCRIPTION("Synopsys DesignWare I2C bus adapter core");
|
|
MODULE_DESCRIPTION("Synopsys DesignWare I2C bus adapter core");
|
|
MODULE_LICENSE("GPL");
|
|
MODULE_LICENSE("GPL");
|