Skip to content

Commit 38fa29b

Browse files
Heikki KrogerusAndi Shyti
authored andcommitted
i2c: designware: Combine the init functions
Providing a single function for controller initialisation. The controller initialisation has the same steps for master and slave modes, except the timing parameters are only needed in master mode. Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com> Acked-by: Mika Westerberg <mika.westerberg@linux.intel.com> Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Signed-off-by: Andi Shyti <andi.shyti@kernel.org> Link: https://lore.kernel.org/r/20260120130729.1679560-3-heikki.krogerus@linux.intel.com
1 parent 6062443 commit 38fa29b

5 files changed

Lines changed: 85 additions & 117 deletions

File tree

drivers/i2c/busses/i2c-designware-amdisp.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,8 +163,8 @@ static int amd_isp_dw_i2c_plat_runtime_resume(struct device *dev)
163163

164164
if (!i_dev->shared_with_punit)
165165
i2c_dw_prepare_clk(i_dev, true);
166-
if (i_dev->init)
167-
i_dev->init(i_dev);
166+
167+
i2c_dw_init(i_dev);
168168

169169
return 0;
170170
}

drivers/i2c/busses/i2c-designware-common.c

Lines changed: 79 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,83 @@ static inline u32 i2c_dw_acpi_round_bus_speed(struct device *device) { return 0;
359359

360360
#endif /* CONFIG_ACPI */
361361

362+
static void i2c_dw_configure_mode(struct dw_i2c_dev *dev)
363+
{
364+
switch (dev->mode) {
365+
case DW_IC_MASTER:
366+
regmap_write(dev->map, DW_IC_TX_TL, dev->tx_fifo_depth / 2);
367+
regmap_write(dev->map, DW_IC_RX_TL, 0);
368+
regmap_write(dev->map, DW_IC_CON, dev->master_cfg);
369+
break;
370+
case DW_IC_SLAVE:
371+
regmap_write(dev->map, DW_IC_TX_TL, 0);
372+
regmap_write(dev->map, DW_IC_RX_TL, 0);
373+
regmap_write(dev->map, DW_IC_CON, dev->slave_cfg);
374+
regmap_write(dev->map, DW_IC_INTR_MASK, DW_IC_INTR_SLAVE_MASK);
375+
break;
376+
default:
377+
return;
378+
}
379+
}
380+
381+
static void i2c_dw_write_timings(struct dw_i2c_dev *dev)
382+
{
383+
/* Write standard speed timing parameters */
384+
regmap_write(dev->map, DW_IC_SS_SCL_HCNT, dev->ss_hcnt);
385+
regmap_write(dev->map, DW_IC_SS_SCL_LCNT, dev->ss_lcnt);
386+
387+
/* Write fast mode/fast mode plus timing parameters */
388+
regmap_write(dev->map, DW_IC_FS_SCL_HCNT, dev->fs_hcnt);
389+
regmap_write(dev->map, DW_IC_FS_SCL_LCNT, dev->fs_lcnt);
390+
391+
/* Write high speed timing parameters if supported */
392+
if (dev->hs_hcnt && dev->hs_lcnt) {
393+
regmap_write(dev->map, DW_IC_HS_SCL_HCNT, dev->hs_hcnt);
394+
regmap_write(dev->map, DW_IC_HS_SCL_LCNT, dev->hs_lcnt);
395+
}
396+
}
397+
398+
/**
399+
* i2c_dw_init() - Initialize the DesignWare I2C hardware
400+
* @dev: device private data
401+
*
402+
* This functions configures and enables the DesigWare I2C hardware.
403+
*
404+
* Return: 0 on success, or negative errno otherwise.
405+
*/
406+
int i2c_dw_init(struct dw_i2c_dev *dev)
407+
{
408+
int ret;
409+
410+
ret = i2c_dw_acquire_lock(dev);
411+
if (ret)
412+
return ret;
413+
414+
/* Disable the adapter */
415+
__i2c_dw_disable(dev);
416+
417+
/*
418+
* Mask SMBus interrupts to block storms from broken
419+
* firmware that leaves IC_SMBUS=1; the handler never
420+
* services them.
421+
*/
422+
regmap_write(dev->map, DW_IC_SMBUS_INTR_MASK, 0);
423+
424+
if (dev->mode == DW_IC_MASTER)
425+
i2c_dw_write_timings(dev);
426+
427+
/* Write SDA hold time if supported */
428+
if (dev->sda_hold_time)
429+
regmap_write(dev->map, DW_IC_SDA_HOLD, dev->sda_hold_time);
430+
431+
i2c_dw_configure_mode(dev);
432+
433+
i2c_dw_release_lock(dev);
434+
435+
return 0;
436+
}
437+
EXPORT_SYMBOL_GPL(i2c_dw_init);
438+
362439
static void i2c_dw_adjust_bus_speed(struct dw_i2c_dev *dev)
363440
{
364441
u32 acpi_speed = i2c_dw_acpi_round_bus_speed(dev->dev);
@@ -801,7 +878,7 @@ int i2c_dw_probe(struct dw_i2c_dev *dev)
801878
if (ret)
802879
return ret;
803880

804-
ret = dev->init(dev);
881+
ret = i2c_dw_init(dev);
805882
if (ret)
806883
return ret;
807884

@@ -894,7 +971,7 @@ static int i2c_dw_runtime_resume(struct device *device)
894971
if (!dev->shared_with_punit)
895972
i2c_dw_prepare_clk(dev, true);
896973

897-
dev->init(dev);
974+
i2c_dw_init(dev);
898975

899976
return 0;
900977
}

drivers/i2c/busses/i2c-designware-core.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,6 @@ struct reset_control;
253253
* @semaphore_idx: Index of table with semaphore type attached to the bus. It's
254254
* -1 if there is no semaphore.
255255
* @shared_with_punit: true if this bus is shared with the SoC's PUNIT
256-
* @init: function to initialize the I2C hardware
257256
* @set_sda_hold_time: callback to retrieve IP specific SDA hold timing
258257
* @mode: operation mode - DW_IC_MASTER or DW_IC_SLAVE
259258
* @rinfo: I²C GPIO recovery information
@@ -314,7 +313,6 @@ struct dw_i2c_dev {
314313
void (*release_lock)(void);
315314
int semaphore_idx;
316315
bool shared_with_punit;
317-
int (*init)(struct dw_i2c_dev *dev);
318316
int (*set_sda_hold_time)(struct dw_i2c_dev *dev);
319317
int mode;
320318
struct i2c_bus_recovery_info rinfo;
@@ -419,6 +417,7 @@ static inline void i2c_dw_configure(struct dw_i2c_dev *dev)
419417
}
420418

421419
int i2c_dw_probe(struct dw_i2c_dev *dev);
420+
int i2c_dw_init(struct dw_i2c_dev *dev);
422421

423422
#if IS_ENABLED(CONFIG_I2C_DESIGNWARE_BAYTRAIL)
424423
int i2c_dw_baytrail_probe_lock_support(struct dw_i2c_dev *dev);

drivers/i2c/busses/i2c-designware-master.c

Lines changed: 3 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -31,16 +31,6 @@
3131
#define AMD_TIMEOUT_MAX_US 250
3232
#define AMD_MASTERCFG_MASK GENMASK(15, 0)
3333

34-
static void i2c_dw_configure_fifo_master(struct dw_i2c_dev *dev)
35-
{
36-
/* Configure Tx/Rx FIFO threshold levels */
37-
regmap_write(dev->map, DW_IC_TX_TL, dev->tx_fifo_depth / 2);
38-
regmap_write(dev->map, DW_IC_RX_TL, 0);
39-
40-
/* Configure the I2C master */
41-
regmap_write(dev->map, DW_IC_CON, dev->master_cfg);
42-
}
43-
4434
static int i2c_dw_set_timings_master(struct dw_i2c_dev *dev)
4535
{
4636
unsigned int comp_param1;
@@ -195,58 +185,6 @@ static int i2c_dw_set_timings_master(struct dw_i2c_dev *dev)
195185
return 0;
196186
}
197187

198-
/**
199-
* i2c_dw_init_master() - Initialize the DesignWare I2C master hardware
200-
* @dev: device private data
201-
*
202-
* This functions configures and enables the I2C master.
203-
* This function is called during I2C init function, and in case of timeout at
204-
* run time.
205-
*
206-
* Return: 0 on success, or negative errno otherwise.
207-
*/
208-
static int i2c_dw_init_master(struct dw_i2c_dev *dev)
209-
{
210-
int ret;
211-
212-
ret = i2c_dw_acquire_lock(dev);
213-
if (ret)
214-
return ret;
215-
216-
/* Disable the adapter */
217-
__i2c_dw_disable(dev);
218-
219-
/*
220-
* Mask SMBus interrupts to block storms from broken
221-
* firmware that leaves IC_SMBUS=1; the handler never
222-
* services them.
223-
*/
224-
regmap_write(dev->map, DW_IC_SMBUS_INTR_MASK, 0);
225-
226-
/* Write standard speed timing parameters */
227-
regmap_write(dev->map, DW_IC_SS_SCL_HCNT, dev->ss_hcnt);
228-
regmap_write(dev->map, DW_IC_SS_SCL_LCNT, dev->ss_lcnt);
229-
230-
/* Write fast mode/fast mode plus timing parameters */
231-
regmap_write(dev->map, DW_IC_FS_SCL_HCNT, dev->fs_hcnt);
232-
regmap_write(dev->map, DW_IC_FS_SCL_LCNT, dev->fs_lcnt);
233-
234-
/* Write high speed timing parameters if supported */
235-
if (dev->hs_hcnt && dev->hs_lcnt) {
236-
regmap_write(dev->map, DW_IC_HS_SCL_HCNT, dev->hs_hcnt);
237-
regmap_write(dev->map, DW_IC_HS_SCL_LCNT, dev->hs_lcnt);
238-
}
239-
240-
/* Write SDA hold time if supported */
241-
if (dev->sda_hold_time)
242-
regmap_write(dev->map, DW_IC_SDA_HOLD, dev->sda_hold_time);
243-
244-
i2c_dw_configure_fifo_master(dev);
245-
i2c_dw_release_lock(dev);
246-
247-
return 0;
248-
}
249-
250188
static void i2c_dw_xfer_init(struct dw_i2c_dev *dev)
251189
{
252190
struct i2c_msg *msgs = dev->msgs;
@@ -843,9 +781,9 @@ i2c_dw_xfer_common(struct dw_i2c_dev *dev, struct i2c_msg msgs[], int num)
843781
ret = i2c_dw_wait_transfer(dev);
844782
if (ret) {
845783
dev_err(dev->dev, "controller timed out\n");
846-
/* i2c_dw_init_master() implicitly disables the adapter */
784+
/* i2c_dw_init() implicitly disables the adapter */
847785
i2c_recover_bus(&dev->adapter);
848-
i2c_dw_init_master(dev);
786+
i2c_dw_init(dev);
849787
goto done;
850788
}
851789

@@ -950,7 +888,7 @@ static void i2c_dw_unprepare_recovery(struct i2c_adapter *adap)
950888

951889
i2c_dw_prepare_clk(dev, true);
952890
reset_control_deassert(dev->rst);
953-
i2c_dw_init_master(dev);
891+
i2c_dw_init(dev);
954892
}
955893

956894
static int i2c_dw_init_recovery_info(struct dw_i2c_dev *dev)
@@ -999,8 +937,6 @@ int i2c_dw_probe_master(struct dw_i2c_dev *dev)
999937

1000938
init_completion(&dev->cmd_complete);
1001939

1002-
dev->init = i2c_dw_init_master;
1003-
1004940
ret = i2c_dw_set_timings_master(dev);
1005941
if (ret)
1006942
return ret;

drivers/i2c/busses/i2c-designware-slave.c

Lines changed: 0 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -21,48 +21,6 @@
2121

2222
#include "i2c-designware-core.h"
2323

24-
static void i2c_dw_configure_fifo_slave(struct dw_i2c_dev *dev)
25-
{
26-
/* Configure Tx/Rx FIFO threshold levels. */
27-
regmap_write(dev->map, DW_IC_TX_TL, 0);
28-
regmap_write(dev->map, DW_IC_RX_TL, 0);
29-
30-
/* Configure the I2C slave. */
31-
regmap_write(dev->map, DW_IC_CON, dev->slave_cfg);
32-
regmap_write(dev->map, DW_IC_INTR_MASK, DW_IC_INTR_SLAVE_MASK);
33-
}
34-
35-
/**
36-
* i2c_dw_init_slave() - Initialize the DesignWare i2c slave hardware
37-
* @dev: device private data
38-
*
39-
* This function configures and enables the I2C in slave mode.
40-
* This function is called during I2C init function, and in case of timeout at
41-
* run time.
42-
*
43-
* Return: 0 on success, or negative errno otherwise.
44-
*/
45-
static int i2c_dw_init_slave(struct dw_i2c_dev *dev)
46-
{
47-
int ret;
48-
49-
ret = i2c_dw_acquire_lock(dev);
50-
if (ret)
51-
return ret;
52-
53-
/* Disable the adapter. */
54-
__i2c_dw_disable(dev);
55-
56-
/* Write SDA hold time if supported */
57-
if (dev->sda_hold_time)
58-
regmap_write(dev->map, DW_IC_SDA_HOLD, dev->sda_hold_time);
59-
60-
i2c_dw_configure_fifo_slave(dev);
61-
i2c_dw_release_lock(dev);
62-
63-
return 0;
64-
}
65-
6624
int i2c_dw_reg_slave(struct i2c_client *slave)
6725
{
6826
struct dw_i2c_dev *dev = i2c_get_adapdata(slave->adapter);
@@ -232,8 +190,6 @@ int i2c_dw_probe_slave(struct dw_i2c_dev *dev)
232190
if (dev->flags & ACCESS_POLLING)
233191
return -EOPNOTSUPP;
234192

235-
dev->init = i2c_dw_init_slave;
236-
237193
return 0;
238194
}
239195

0 commit comments

Comments
 (0)