|
@@ -181,6 +181,7 @@ static void i2c_davinci_calc_clk_dividers(struct davinci_i2c_dev *dev)
|
|
u32 clkh;
|
|
u32 clkh;
|
|
u32 clkl;
|
|
u32 clkl;
|
|
u32 input_clock = clk_get_rate(dev->clk);
|
|
u32 input_clock = clk_get_rate(dev->clk);
|
|
|
|
+ struct device_node *of_node = dev->dev->of_node;
|
|
|
|
|
|
/* NOTE: I2C Clock divider programming info
|
|
/* NOTE: I2C Clock divider programming info
|
|
* As per I2C specs the following formulas provide prescaler
|
|
* As per I2C specs the following formulas provide prescaler
|
|
@@ -196,6 +197,9 @@ static void i2c_davinci_calc_clk_dividers(struct davinci_i2c_dev *dev)
|
|
* where if PSC == 0, d = 7,
|
|
* where if PSC == 0, d = 7,
|
|
* if PSC == 1, d = 6
|
|
* if PSC == 1, d = 6
|
|
* if PSC > 1 , d = 5
|
|
* if PSC > 1 , d = 5
|
|
|
|
+ *
|
|
|
|
+ * Note:
|
|
|
|
+ * d is always 6 on Keystone I2C controller
|
|
*/
|
|
*/
|
|
|
|
|
|
/* get minimum of 7 MHz clock, but max of 12 MHz */
|
|
/* get minimum of 7 MHz clock, but max of 12 MHz */
|
|
@@ -204,6 +208,9 @@ static void i2c_davinci_calc_clk_dividers(struct davinci_i2c_dev *dev)
|
|
psc++; /* better to run under spec than over */
|
|
psc++; /* better to run under spec than over */
|
|
d = (psc >= 2) ? 5 : 7 - psc;
|
|
d = (psc >= 2) ? 5 : 7 - psc;
|
|
|
|
|
|
|
|
+ if (of_node && of_device_is_compatible(of_node, "ti,keystone-i2c"))
|
|
|
|
+ d = 6;
|
|
|
|
+
|
|
clk = ((input_clock / (psc + 1)) / (pdata->bus_freq * 1000));
|
|
clk = ((input_clock / (psc + 1)) / (pdata->bus_freq * 1000));
|
|
/* Avoid driving the bus too fast because of rounding errors above */
|
|
/* Avoid driving the bus too fast because of rounding errors above */
|
|
if (input_clock / (psc + 1) / clk > pdata->bus_freq * 1000)
|
|
if (input_clock / (psc + 1) / clk > pdata->bus_freq * 1000)
|
|
@@ -726,6 +733,7 @@ static struct i2c_algorithm i2c_davinci_algo = {
|
|
|
|
|
|
static const struct of_device_id davinci_i2c_of_match[] = {
|
|
static const struct of_device_id davinci_i2c_of_match[] = {
|
|
{.compatible = "ti,davinci-i2c", },
|
|
{.compatible = "ti,davinci-i2c", },
|
|
|
|
+ {.compatible = "ti,keystone-i2c", },
|
|
{},
|
|
{},
|
|
};
|
|
};
|
|
MODULE_DEVICE_TABLE(of, davinci_i2c_of_match);
|
|
MODULE_DEVICE_TABLE(of, davinci_i2c_of_match);
|