On 5/7/20 4:51 PM, Andy Shevchenko wrote:
In order to export array supported speed for wider use,
split out them along with i2c_dw_validate_speed() helper.
Signed-off-by: Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx>
---
drivers/i2c/busses/i2c-designware-core.h | 31 +++++++++++++++++++++
drivers/i2c/busses/i2c-designware-platdrv.c | 29 ++++---------------
2 files changed, 36 insertions(+), 24 deletions(-)
diff --git a/drivers/i2c/busses/i2c-designware-core.h b/drivers/i2c/busses/i2c-designware-core.h
index 1674caf277451..626959573f894 100644
--- a/drivers/i2c/busses/i2c-designware-core.h
+++ b/drivers/i2c/busses/i2c-designware-core.h
@@ -9,6 +9,7 @@
* Copyright (C) 2009 Provigent Ltd.
*/
+#include <linux/errno.h>
#include <linux/i2c.h>
#define DW_IC_DEFAULT_FUNCTIONALITY (I2C_FUNC_I2C | \
@@ -351,3 +352,33 @@ extern int i2c_dw_probe_lock_support(struct dw_i2c_dev *dev);
#else
static inline int i2c_dw_probe_lock_support(struct dw_i2c_dev *dev) { return 0; }
#endif
+
+static const u32 i2c_dw_supported_speeds[] = {
+ I2C_MAX_HIGH_SPEED_MODE_FREQ,
+ I2C_MAX_FAST_MODE_PLUS_FREQ,
+ I2C_MAX_FAST_MODE_FREQ,
+ I2C_MAX_STANDARD_MODE_FREQ,
+};
+
+static inline int i2c_dw_validate_speed(struct dw_i2c_dev *dev)
+{
+ struct i2c_timings *t = &dev->timings;
+ unsigned int i;
+
+ /*
+ * Only standard mode at 100kHz, fast mode at 400kHz,
+ * fast mode plus at 1MHz and high speed mode at 3.4MHz are supported.
+ */
+ for (i = 0; i < ARRAY_SIZE(i2c_dw_supported_speeds); i++) {
+ if (t->bus_freq_hz == i2c_dw_supported_speeds[i])
+ break;
+ }
+ if (i == ARRAY_SIZE(i2c_dw_supported_speeds)) {
+ dev_err(dev->dev,
+ "%d Hz is unsupported, only 100kHz, 400kHz, 1MHz and 3.4MHz are supported\n",
+ t->bus_freq_hz);
+ return -EINVAL;
+ }
+
+ return 0;
+}
This header is included by every i2c-designware-*.c file and this inline
function is not tiny. Would it be better to have this in
i2c-designware-common.c instead?
--
Jarkko