1
1
/*
2
- * Synopsys DesignWare I2C adapter driver (master only) .
2
+ * Synopsys DesignWare I2C adapter driver.
3
3
*
4
4
* Based on the TI DAVINCI I2C adapter driver.
5
5
*
@@ -174,9 +174,13 @@ static inline int dw_i2c_acpi_configure(struct platform_device *pdev)
174
174
175
175
static void i2c_dw_configure_master (struct dw_i2c_dev * dev )
176
176
{
177
+ dev -> functionality = I2C_FUNC_10BIT_ADDR | DW_IC_DEFAULT_FUNCTIONALITY ;
178
+
177
179
dev -> master_cfg = DW_IC_CON_MASTER | DW_IC_CON_SLAVE_DISABLE |
178
180
DW_IC_CON_RESTART_EN ;
179
181
182
+ dev -> mode = DW_IC_MASTER ;
183
+
180
184
switch (dev -> clk_freq ) {
181
185
case 100000 :
182
186
dev -> master_cfg |= DW_IC_CON_SPEED_STD ;
@@ -189,6 +193,28 @@ static void i2c_dw_configure_master(struct dw_i2c_dev *dev)
189
193
}
190
194
}
191
195
196
+ static void i2c_dw_configure_slave (struct dw_i2c_dev * dev )
197
+ {
198
+ dev -> functionality = I2C_FUNC_SLAVE | DW_IC_DEFAULT_FUNCTIONALITY ;
199
+
200
+ dev -> slave_cfg = DW_IC_CON_RX_FIFO_FULL_HLD_CTRL |
201
+ DW_IC_CON_RESTART_EN | DW_IC_CON_STOP_DET_IFADDRESSED |
202
+ DW_IC_CON_SPEED_FAST ;
203
+
204
+ dev -> mode = DW_IC_SLAVE ;
205
+
206
+ switch (dev -> clk_freq ) {
207
+ case 100000 :
208
+ dev -> slave_cfg |= DW_IC_CON_SPEED_STD ;
209
+ break ;
210
+ case 3400000 :
211
+ dev -> slave_cfg |= DW_IC_CON_SPEED_HIGH ;
212
+ break ;
213
+ default :
214
+ dev -> slave_cfg |= DW_IC_CON_SPEED_FAST ;
215
+ }
216
+ }
217
+
192
218
static int i2c_dw_plat_prepare_clk (struct dw_i2c_dev * i_dev , bool prepare )
193
219
{
194
220
if (IS_ERR (i_dev -> clk ))
@@ -302,9 +328,10 @@ static int dw_i2c_plat_probe(struct platform_device *pdev)
302
328
if (ret )
303
329
goto exit_reset ;
304
330
305
- dev -> functionality = I2C_FUNC_10BIT_ADDR | DW_IC_DEFAULT_FUNCTIONALITY ;
306
-
307
- i2c_dw_configure_master (dev );
331
+ if (i2c_detect_slave_mode (& pdev -> dev ))
332
+ i2c_dw_configure_slave (dev );
333
+ else
334
+ i2c_dw_configure_master (dev );
308
335
309
336
dev -> clk = devm_clk_get (& pdev -> dev , NULL );
310
337
if (!i2c_dw_plat_prepare_clk (dev , true)) {
@@ -333,7 +360,11 @@ static int dw_i2c_plat_probe(struct platform_device *pdev)
333
360
pm_runtime_enable (& pdev -> dev );
334
361
}
335
362
336
- ret = i2c_dw_probe (dev );
363
+ if (dev -> mode == DW_IC_SLAVE )
364
+ ret = i2c_dw_probe_slave (dev );
365
+ else
366
+ ret = i2c_dw_probe (dev );
367
+
337
368
if (ret )
338
369
goto exit_probe ;
339
370
0 commit comments