2020#include <linux/io.h>
2121#include <linux/kernel.h>
2222#include <linux/module.h>
23+ #include <linux/of.h>
2324#include <linux/pm_runtime.h>
2425#include <linux/regmap.h>
2526#include <linux/swab.h>
@@ -188,7 +189,7 @@ static const u32 supported_speeds[] = {
188189 I2C_MAX_STANDARD_MODE_FREQ ,
189190};
190191
191- int i2c_dw_validate_speed (struct dw_i2c_dev * dev )
192+ static int i2c_dw_validate_speed (struct dw_i2c_dev * dev )
192193{
193194 struct i2c_timings * t = & dev -> timings ;
194195 unsigned int i ;
@@ -208,7 +209,44 @@ int i2c_dw_validate_speed(struct dw_i2c_dev *dev)
208209
209210 return - EINVAL ;
210211}
211- EXPORT_SYMBOL_GPL (i2c_dw_validate_speed );
212+
213+ #ifdef CONFIG_OF
214+
215+ #include <linux/platform_device.h>
216+
217+ #define MSCC_ICPU_CFG_TWI_DELAY 0x0
218+ #define MSCC_ICPU_CFG_TWI_DELAY_ENABLE BIT(0)
219+ #define MSCC_ICPU_CFG_TWI_SPIKE_FILTER 0x4
220+
221+ static int mscc_twi_set_sda_hold_time (struct dw_i2c_dev * dev )
222+ {
223+ writel ((dev -> sda_hold_time << 1 ) | MSCC_ICPU_CFG_TWI_DELAY_ENABLE ,
224+ dev -> ext + MSCC_ICPU_CFG_TWI_DELAY );
225+
226+ return 0 ;
227+ }
228+
229+ static void i2c_dw_of_configure (struct device * device )
230+ {
231+ struct platform_device * pdev = to_platform_device (device );
232+ struct dw_i2c_dev * dev = dev_get_drvdata (device );
233+
234+ switch (dev -> flags & MODEL_MASK ) {
235+ case MODEL_MSCC_OCELOT :
236+ dev -> ext = devm_platform_ioremap_resource (pdev , 1 );
237+ if (!IS_ERR (dev -> ext ))
238+ dev -> set_sda_hold_time = mscc_twi_set_sda_hold_time ;
239+ break ;
240+ default :
241+ break ;
242+ }
243+ }
244+
245+ #else /* CONFIG_OF */
246+
247+ static inline void i2c_dw_of_configure (struct device * device ) { }
248+
249+ #endif /* CONFIG_OF */
212250
213251#ifdef CONFIG_ACPI
214252
@@ -255,7 +293,7 @@ static void i2c_dw_acpi_params(struct device *device, char method[],
255293 kfree (buf .pointer );
256294}
257295
258- void i2c_dw_acpi_configure (struct device * device )
296+ static void i2c_dw_acpi_configure (struct device * device )
259297{
260298 struct dw_i2c_dev * dev = dev_get_drvdata (device );
261299 struct i2c_timings * t = & dev -> timings ;
@@ -286,7 +324,6 @@ void i2c_dw_acpi_configure(struct device *device)
286324 break ;
287325 }
288326}
289- EXPORT_SYMBOL_GPL (i2c_dw_acpi_configure );
290327
291328static u32 i2c_dw_acpi_round_bus_speed (struct device * device )
292329{
@@ -308,11 +345,13 @@ static u32 i2c_dw_acpi_round_bus_speed(struct device *device)
308345
309346#else /* CONFIG_ACPI */
310347
348+ static inline void i2c_dw_acpi_configure (struct device * device ) { }
349+
311350static inline u32 i2c_dw_acpi_round_bus_speed (struct device * device ) { return 0 ; }
312351
313352#endif /* CONFIG_ACPI */
314353
315- void i2c_dw_adjust_bus_speed (struct dw_i2c_dev * dev )
354+ static void i2c_dw_adjust_bus_speed (struct dw_i2c_dev * dev )
316355{
317356 u32 acpi_speed = i2c_dw_acpi_round_bus_speed (dev -> dev );
318357 struct i2c_timings * t = & dev -> timings ;
@@ -328,7 +367,24 @@ void i2c_dw_adjust_bus_speed(struct dw_i2c_dev *dev)
328367 else
329368 t -> bus_freq_hz = I2C_MAX_FAST_MODE_FREQ ;
330369}
331- EXPORT_SYMBOL_GPL (i2c_dw_adjust_bus_speed );
370+
371+ int i2c_dw_fw_parse_and_configure (struct dw_i2c_dev * dev )
372+ {
373+ struct i2c_timings * t = & dev -> timings ;
374+ struct device * device = dev -> dev ;
375+
376+ i2c_parse_fw_timings (device , t , false);
377+
378+ i2c_dw_adjust_bus_speed (dev );
379+
380+ if (device -> of_node )
381+ i2c_dw_of_configure (device );
382+ if (has_acpi_companion (device ))
383+ i2c_dw_acpi_configure (device );
384+
385+ return i2c_dw_validate_speed (dev );
386+ }
387+ EXPORT_SYMBOL_GPL (i2c_dw_fw_parse_and_configure );
332388
333389static u32 i2c_dw_read_scl_reg (struct dw_i2c_dev * dev , u32 reg )
334390{
0 commit comments